diff options
Diffstat (limited to 'arch/powerpc/platforms/embedded6xx')
| -rw-r--r-- | arch/powerpc/platforms/embedded6xx/Kconfig | 24 | ||||
| -rw-r--r-- | arch/powerpc/platforms/embedded6xx/Makefile | 2 | ||||
| -rw-r--r-- | arch/powerpc/platforms/embedded6xx/flipper-pic.c | 1 | ||||
| -rw-r--r-- | arch/powerpc/platforms/embedded6xx/hlwd-pic.c | 4 | ||||
| -rw-r--r-- | arch/powerpc/platforms/embedded6xx/mvme5100.c | 221 | ||||
| -rw-r--r-- | arch/powerpc/platforms/embedded6xx/prpmc2800.c | 156 | 
6 files changed, 239 insertions, 169 deletions
diff --git a/arch/powerpc/platforms/embedded6xx/Kconfig b/arch/powerpc/platforms/embedded6xx/Kconfig index 302ba43d73a..a25f496c2ef 100644 --- a/arch/powerpc/platforms/embedded6xx/Kconfig +++ b/arch/powerpc/platforms/embedded6xx/Kconfig @@ -34,7 +34,6 @@ config MPC7448HPC2  	select TSI108_BRIDGE  	select DEFAULT_UIMAGE  	select PPC_UDBG_16550 -	select TSI108_BRIDGE  	help  	  Select MPC7448HPC2 if configuring for Freescale MPC7448HPC2 (Taiga)  	  platform @@ -44,19 +43,10 @@ config PPC_HOLLY  	depends on EMBEDDED6xx  	select TSI108_BRIDGE  	select PPC_UDBG_16550 -	select TSI108_BRIDGE  	help  	  Select PPC_HOLLY if configuring for an IBM 750GX/CL Eval  	  Board with TSI108/9 bridge (Hickory/Holly) -config PPC_PRPMC2800 -	bool "Motorola-PrPMC2800" -	depends on EMBEDDED6xx -	select MV64X60 -	select NOT_COHERENT_CACHE -	help -	  This option enables support for the Motorola PrPMC2800 board -  config PPC_C2K  	bool "SBS/GEFanuc C2K board"  	depends on EMBEDDED6xx @@ -67,6 +57,19 @@ config PPC_C2K  	  This option enables support for the GE Fanuc C2K board (formerly  	  an SBS board). +config MVME5100 +	bool "Motorola/Emerson MVME5100" +	depends on EMBEDDED6xx +	select MPIC +	select PCI +	select PPC_INDIRECT_PCI +	select PPC_I8259 +	select PPC_NATIVE +	select PPC_UDBG_16550 +	help +	  This option enables support for the Motorola (now Emerson) MVME5100 +	  board. +  config TSI108_BRIDGE  	bool  	select PCI @@ -113,4 +116,3 @@ config WII  	help  	  Select WII if configuring for the Nintendo Wii.  	  More information at: <http://gc-linux.sourceforge.net/> - diff --git a/arch/powerpc/platforms/embedded6xx/Makefile b/arch/powerpc/platforms/embedded6xx/Makefile index 66c23e423f4..f126a2a0998 100644 --- a/arch/powerpc/platforms/embedded6xx/Makefile +++ b/arch/powerpc/platforms/embedded6xx/Makefile @@ -5,9 +5,9 @@ obj-$(CONFIG_MPC7448HPC2)	+= mpc7448_hpc2.o  obj-$(CONFIG_LINKSTATION)	+= linkstation.o ls_uart.o  obj-$(CONFIG_STORCENTER)	+= storcenter.o  obj-$(CONFIG_PPC_HOLLY)		+= holly.o -obj-$(CONFIG_PPC_PRPMC2800)	+= prpmc2800.o  obj-$(CONFIG_PPC_C2K)		+= c2k.o  obj-$(CONFIG_USBGECKO_UDBG)	+= usbgecko_udbg.o  obj-$(CONFIG_GAMECUBE_COMMON)	+= flipper-pic.o  obj-$(CONFIG_GAMECUBE)		+= gamecube.o  obj-$(CONFIG_WII)		+= wii.o hlwd-pic.o +obj-$(CONFIG_MVME5100)		+= mvme5100.o diff --git a/arch/powerpc/platforms/embedded6xx/flipper-pic.c b/arch/powerpc/platforms/embedded6xx/flipper-pic.c index 53d6eee0196..4cde8e7da4b 100644 --- a/arch/powerpc/platforms/embedded6xx/flipper-pic.c +++ b/arch/powerpc/platforms/embedded6xx/flipper-pic.c @@ -18,6 +18,7 @@  #include <linux/init.h>  #include <linux/irq.h>  #include <linux/of.h> +#include <linux/of_address.h>  #include <asm/io.h>  #include "flipper-pic.h" diff --git a/arch/powerpc/platforms/embedded6xx/hlwd-pic.c b/arch/powerpc/platforms/embedded6xx/hlwd-pic.c index 3006b5117ec..c269caee58f 100644 --- a/arch/powerpc/platforms/embedded6xx/hlwd-pic.c +++ b/arch/powerpc/platforms/embedded6xx/hlwd-pic.c @@ -15,9 +15,10 @@  #define pr_fmt(fmt) DRV_MODULE_NAME ": " fmt  #include <linux/kernel.h> -#include <linux/init.h>  #include <linux/irq.h>  #include <linux/of.h> +#include <linux/of_address.h> +#include <linux/of_irq.h>  #include <asm/io.h>  #include "hlwd-pic.h" @@ -181,6 +182,7 @@ struct irq_domain *hlwd_pic_init(struct device_node *np)  					   &hlwd_irq_domain_ops, io_base);  	if (!irq_domain) {  		pr_err("failed to allocate irq_domain\n"); +		iounmap(io_base);  		return NULL;  	} diff --git a/arch/powerpc/platforms/embedded6xx/mvme5100.c b/arch/powerpc/platforms/embedded6xx/mvme5100.c new file mode 100644 index 00000000000..25e3bfb64ef --- /dev/null +++ b/arch/powerpc/platforms/embedded6xx/mvme5100.c @@ -0,0 +1,221 @@ +/* + * Board setup routines for the Motorola/Emerson MVME5100. + * + * Copyright 2013 CSC Australia Pty. Ltd. + * + * Based on earlier code by: + * + *    Matt Porter, MontaVista Software Inc. + *    Copyright 2001 MontaVista Software Inc. + * + * This program is free software; you can redistribute  it and/or modify it + * under  the terms of  the GNU General  Public License as published by the + * Free Software Foundation;  either version 2 of the  License, or (at your + * option) any later version. + * + * Author: Stephen Chivers <schivers@csc.com> + * + */ + +#include <linux/of_platform.h> + +#include <asm/i8259.h> +#include <asm/pci-bridge.h> +#include <asm/mpic.h> +#include <asm/prom.h> +#include <mm/mmu_decl.h> +#include <asm/udbg.h> + +#define HAWK_MPIC_SIZE		0x00040000U +#define MVME5100_PCI_MEM_OFFSET 0x00000000 + +/* Board register addresses. */ +#define BOARD_STATUS_REG	0xfef88080 +#define BOARD_MODFAIL_REG	0xfef88090 +#define BOARD_MODRST_REG	0xfef880a0 +#define BOARD_TBEN_REG		0xfef880c0 +#define BOARD_SW_READ_REG	0xfef880e0 +#define BOARD_GEO_ADDR_REG	0xfef880e8 +#define BOARD_EXT_FEATURE1_REG	0xfef880f0 +#define BOARD_EXT_FEATURE2_REG	0xfef88100 + +static phys_addr_t pci_membase; +static u_char *restart; + +static void mvme5100_8259_cascade(unsigned int irq, struct irq_desc *desc) +{ +	struct irq_chip *chip = irq_desc_get_chip(desc); +	unsigned int cascade_irq = i8259_irq(); + +	if (cascade_irq != NO_IRQ) +		generic_handle_irq(cascade_irq); + +	chip->irq_eoi(&desc->irq_data); +} + +static void __init mvme5100_pic_init(void) +{ +	struct mpic *mpic; +	struct device_node *np; +	struct device_node *cp = NULL; +	unsigned int cirq; +	unsigned long intack = 0; +	const u32 *prop = NULL; + +	np = of_find_node_by_type(NULL, "open-pic"); +	if (!np) { +		pr_err("Could not find open-pic node\n"); +		return; +	} + +	mpic = mpic_alloc(np, pci_membase, 0, 16, 256, " OpenPIC  "); + +	BUG_ON(mpic == NULL); +	of_node_put(np); + +	mpic_assign_isu(mpic, 0, pci_membase + 0x10000); + +	mpic_init(mpic); + +	cp = of_find_compatible_node(NULL, NULL, "chrp,iic"); +	if (cp == NULL) { +		pr_warn("mvme5100_pic_init: couldn't find i8259\n"); +		return; +	} + +	cirq = irq_of_parse_and_map(cp, 0); +	if (cirq == NO_IRQ) { +		pr_warn("mvme5100_pic_init: no cascade interrupt?\n"); +		return; +	} + +	np = of_find_compatible_node(NULL, "pci", "mpc10x-pci"); +	if (np) { +		prop = of_get_property(np, "8259-interrupt-acknowledge", NULL); + +		if (prop) +			intack = prop[0]; + +		of_node_put(np); +	} + +	if (intack) +		pr_debug("mvme5100_pic_init: PCI 8259 intack at 0x%016lx\n", +		   intack); + +	i8259_init(cp, intack); +	of_node_put(cp); +	irq_set_chained_handler(cirq, mvme5100_8259_cascade); +} + +static int __init mvme5100_add_bridge(struct device_node *dev) +{ +	const int		*bus_range; +	int			len; +	struct pci_controller	*hose; +	unsigned short		devid; + +	pr_info("Adding PCI host bridge %s\n", dev->full_name); + +	bus_range = of_get_property(dev, "bus-range", &len); + +	hose = pcibios_alloc_controller(dev); +	if (hose == NULL) +		return -ENOMEM; + +	hose->first_busno = bus_range ? bus_range[0] : 0; +	hose->last_busno = bus_range ? bus_range[1] : 0xff; + +	setup_indirect_pci(hose, 0xfe000cf8, 0xfe000cfc, 0); + +	pci_process_bridge_OF_ranges(hose, dev, 1); + +	early_read_config_word(hose, 0, 0, PCI_DEVICE_ID, &devid); + +	if (devid != PCI_DEVICE_ID_MOTOROLA_HAWK) { +		pr_err("HAWK PHB not present?\n"); +		return 0; +	} + +	early_read_config_dword(hose, 0, 0, PCI_BASE_ADDRESS_1, &pci_membase); + +	if (pci_membase == 0) { +		pr_err("HAWK PHB mibar not correctly set?\n"); +		return 0; +	} + +	pr_info("mvme5100_pic_init: pci_membase: %x\n", pci_membase); + +	return 0; +} + +static struct of_device_id mvme5100_of_bus_ids[] __initdata = { +	{ .compatible = "hawk-bridge", }, +	{}, +}; + +/* + * Setup the architecture + */ +static void __init mvme5100_setup_arch(void) +{ +	struct device_node *np; + +	if (ppc_md.progress) +		ppc_md.progress("mvme5100_setup_arch()", 0); + +	for_each_compatible_node(np, "pci", "hawk-pci") +		mvme5100_add_bridge(np); + +	restart = ioremap(BOARD_MODRST_REG, 4); +} + + +static void mvme5100_show_cpuinfo(struct seq_file *m) +{ +	seq_puts(m, "Vendor\t\t: Motorola/Emerson\n"); +	seq_puts(m, "Machine\t\t: MVME5100\n"); +} + +static void mvme5100_restart(char *cmd) +{ + +	local_irq_disable(); +	mtmsr(mfmsr() | MSR_IP); + +	out_8((u_char *) restart, 0x01); + +	while (1) +		; +} + +/* + * Called very early, device-tree isn't unflattened + */ +static int __init mvme5100_probe(void) +{ +	unsigned long root = of_get_flat_dt_root(); + +	return of_flat_dt_is_compatible(root, "MVME5100"); +} + +static int __init probe_of_platform_devices(void) +{ + +	of_platform_bus_probe(NULL, mvme5100_of_bus_ids, NULL); +	return 0; +} + +machine_device_initcall(mvme5100, probe_of_platform_devices); + +define_machine(mvme5100) { +	.name			= "MVME5100", +	.probe			= mvme5100_probe, +	.setup_arch		= mvme5100_setup_arch, +	.init_IRQ		= mvme5100_pic_init, +	.show_cpuinfo		= mvme5100_show_cpuinfo, +	.get_irq		= mpic_get_irq, +	.restart		= mvme5100_restart, +	.calibrate_decr		= generic_calibrate_decr, +	.progress		= udbg_progress, +}; diff --git a/arch/powerpc/platforms/embedded6xx/prpmc2800.c b/arch/powerpc/platforms/embedded6xx/prpmc2800.c deleted file mode 100644 index d455f08bea5..00000000000 --- a/arch/powerpc/platforms/embedded6xx/prpmc2800.c +++ /dev/null @@ -1,156 +0,0 @@ -/* - * Board setup routines for the Motorola PrPMC2800 - * - * Author: Dale Farnsworth <dale@farnsworth.org> - * - * 2007 (c) MontaVista, Software, Inc.  This file is licensed under - * the terms of the GNU General Public License version 2.  This program - * is licensed "as is" without any warranty of any kind, whether express - * or implied. - */ - -#include <linux/stddef.h> -#include <linux/kernel.h> -#include <linux/delay.h> -#include <linux/interrupt.h> -#include <linux/seq_file.h> - -#include <asm/machdep.h> -#include <asm/prom.h> -#include <asm/time.h> - -#include <mm/mmu_decl.h> - -#include <sysdev/mv64x60.h> - -#define MV64x60_MPP_CNTL_0	0x0000 -#define MV64x60_MPP_CNTL_2	0x0008 - -#define MV64x60_GPP_IO_CNTL	0x0000 -#define MV64x60_GPP_LEVEL_CNTL	0x0010 -#define MV64x60_GPP_VALUE_SET	0x0018 - -#define PLATFORM_NAME_MAX	32 - -static char prpmc2800_platform_name[PLATFORM_NAME_MAX]; - -static void __iomem *mv64x60_mpp_reg_base; -static void __iomem *mv64x60_gpp_reg_base; - -static void __init prpmc2800_setup_arch(void) -{ -	struct device_node *np; -	phys_addr_t paddr; -	const unsigned int *reg; - -	/* -	 * ioremap mpp and gpp registers in case they are later -	 * needed by prpmc2800_reset_board(). -	 */ -	np = of_find_compatible_node(NULL, NULL, "marvell,mv64360-mpp"); -	reg = of_get_property(np, "reg", NULL); -	paddr = of_translate_address(np, reg); -	of_node_put(np); -	mv64x60_mpp_reg_base = ioremap(paddr, reg[1]); - -	np = of_find_compatible_node(NULL, NULL, "marvell,mv64360-gpp"); -	reg = of_get_property(np, "reg", NULL); -	paddr = of_translate_address(np, reg); -	of_node_put(np); -	mv64x60_gpp_reg_base = ioremap(paddr, reg[1]); - -#ifdef CONFIG_PCI -	mv64x60_pci_init(); -#endif - -	printk("Motorola %s\n", prpmc2800_platform_name); -} - -static void prpmc2800_reset_board(void) -{ -	u32 temp; - -	local_irq_disable(); - -	temp = in_le32(mv64x60_mpp_reg_base + MV64x60_MPP_CNTL_0); -	temp &= 0xFFFF0FFF; -	out_le32(mv64x60_mpp_reg_base + MV64x60_MPP_CNTL_0, temp); - -	temp = in_le32(mv64x60_gpp_reg_base + MV64x60_GPP_LEVEL_CNTL); -	temp |= 0x00000004; -	out_le32(mv64x60_gpp_reg_base + MV64x60_GPP_LEVEL_CNTL, temp); - -	temp = in_le32(mv64x60_gpp_reg_base + MV64x60_GPP_IO_CNTL); -	temp |= 0x00000004; -	out_le32(mv64x60_gpp_reg_base + MV64x60_GPP_IO_CNTL, temp); - -	temp = in_le32(mv64x60_mpp_reg_base + MV64x60_MPP_CNTL_2); -	temp &= 0xFFFF0FFF; -	out_le32(mv64x60_mpp_reg_base + MV64x60_MPP_CNTL_2, temp); - -	temp = in_le32(mv64x60_gpp_reg_base + MV64x60_GPP_LEVEL_CNTL); -	temp |= 0x00080000; -	out_le32(mv64x60_gpp_reg_base + MV64x60_GPP_LEVEL_CNTL, temp); - -	temp = in_le32(mv64x60_gpp_reg_base + MV64x60_GPP_IO_CNTL); -	temp |= 0x00080000; -	out_le32(mv64x60_gpp_reg_base + MV64x60_GPP_IO_CNTL, temp); - -	out_le32(mv64x60_gpp_reg_base + MV64x60_GPP_VALUE_SET, 0x00080004); -} - -static void prpmc2800_restart(char *cmd) -{ -	volatile ulong i = 10000000; - -	prpmc2800_reset_board(); - -	while (i-- > 0); -	panic("restart failed\n"); -} - -#ifdef CONFIG_NOT_COHERENT_CACHE -#define PPRPM2800_COHERENCY_SETTING "off" -#else -#define PPRPM2800_COHERENCY_SETTING "on" -#endif - -void prpmc2800_show_cpuinfo(struct seq_file *m) -{ -	seq_printf(m, "Vendor\t\t: Motorola\n"); -	seq_printf(m, "coherency\t: %s\n", PPRPM2800_COHERENCY_SETTING); -} - -/* - * Called very early, device-tree isn't unflattened - */ -static int __init prpmc2800_probe(void) -{ -	unsigned long root = of_get_flat_dt_root(); -	unsigned long len = PLATFORM_NAME_MAX; -	void *m; - -	if (!of_flat_dt_is_compatible(root, "motorola,PrPMC2800")) -		return 0; - -	/* Update ppc_md.name with name from dt */ -	m = of_get_flat_dt_prop(root, "model", &len); -	if (m) -		strncpy(prpmc2800_platform_name, m, -			min((int)len, PLATFORM_NAME_MAX - 1)); - -	_set_L2CR(_get_L2CR() | L2CR_L2E); -	return 1; -} - -define_machine(prpmc2800){ -	.name			= prpmc2800_platform_name, -	.probe			= prpmc2800_probe, -	.setup_arch		= prpmc2800_setup_arch, -	.init_early		= mv64x60_init_early, -	.show_cpuinfo		= prpmc2800_show_cpuinfo, -	.init_IRQ		= mv64x60_init_irq, -	.get_irq		= mv64x60_get_irq, -	.restart		= prpmc2800_restart, -	.calibrate_decr		= generic_calibrate_decr, -};  | 
