Просмотр исходного кода

Merge branch 'merge' of master.kernel.org:/pub/scm/linux/kernel/git/paulus/powerpc

* 'merge' of master.kernel.org:/pub/scm/linux/kernel/git/paulus/powerpc:
  [POWERPC] 85xx: Enable CONFIG_SERIAL_8250_SHARE_IRQ
  [POWERPC] Select u-image as default image for Linkstation
  [POWERPC] 83xx: Minor fixes for 834x_mds USB setup code
  [POWERPC] Fix warning in powermac pci.c
  [POWERPC] Fix warning in powermac feature.c
  [POWERPC] Fix warning in prom_parse.c of_irq_map_oldworld()
  [POWERPC] Celleb: bug fix caused by not casting pointer types
  [POWERPC] Add missing newline in xmon help output
  [POWERPC] No DEEPNAP on 970MP 1.0
Linus Torvalds 18 лет назад
Родитель
Сommit
a967e127d0

+ 16 - 0
arch/powerpc/kernel/cputable.c

@@ -225,6 +225,22 @@ static struct cpu_spec cpu_specs[] = {
 		.oprofile_type		= PPC_OPROFILE_POWER4,
 		.oprofile_type		= PPC_OPROFILE_POWER4,
 		.platform		= "ppc970",
 		.platform		= "ppc970",
 	},
 	},
+	{	/* PPC970MP DD1.0 - no DEEPNAP, use regular 970 init */
+		.pvr_mask		= 0xffffffff,
+		.pvr_value		= 0x00440100,
+		.cpu_name		= "PPC970MP",
+		.cpu_features		= CPU_FTRS_PPC970,
+		.cpu_user_features	= COMMON_USER_POWER4 |
+			PPC_FEATURE_HAS_ALTIVEC_COMP,
+		.icache_bsize		= 128,
+		.dcache_bsize		= 128,
+		.num_pmcs		= 8,
+		.cpu_setup		= __setup_cpu_ppc970,
+		.cpu_restore		= __restore_cpu_ppc970,
+		.oprofile_cpu_type	= "ppc64/970MP",
+		.oprofile_type		= PPC_OPROFILE_POWER4,
+		.platform		= "ppc970",
+	},
 	{	/* PPC970MP */
 	{	/* PPC970MP */
 		.pvr_mask		= 0xffff0000,
 		.pvr_mask		= 0xffff0000,
 		.pvr_value		= 0x00440000,
 		.pvr_value		= 0x00440000,

+ 1 - 1
arch/powerpc/kernel/prom_parse.c

@@ -916,7 +916,7 @@ EXPORT_SYMBOL_GPL(of_irq_map_raw);
 static int of_irq_map_oldworld(struct device_node *device, int index,
 static int of_irq_map_oldworld(struct device_node *device, int index,
 			       struct of_irq *out_irq)
 			       struct of_irq *out_irq)
 {
 {
-	const u32 *ints;
+	const u32 *ints = NULL;
 	int intlen;
 	int intlen;
 
 
 	/*
 	/*

+ 4 - 4
arch/powerpc/platforms/83xx/mpc834x_mds.c

@@ -55,9 +55,9 @@ static int mpc834x_usb_cfg(void)
 	struct device_node *np = NULL;
 	struct device_node *np = NULL;
 	int port0_is_dr = 0;
 	int port0_is_dr = 0;
 
 
-	if ((np = of_find_compatible_node(np, "usb", "fsl-usb2-dr")) != NULL)
+	if ((np = of_find_compatible_node(NULL, "usb", "fsl-usb2-dr")) != NULL)
 		port0_is_dr = 1;
 		port0_is_dr = 1;
-	if ((np = of_find_compatible_node(np, "usb", "fsl-usb2-mph")) != NULL){
+	if ((np = of_find_compatible_node(NULL, "usb", "fsl-usb2-mph")) != NULL){
 		if (port0_is_dr) {
 		if (port0_is_dr) {
 			printk(KERN_WARNING
 			printk(KERN_WARNING
 				"There is only one USB port on PB board! \n");
 				"There is only one USB port on PB board! \n");
@@ -103,8 +103,8 @@ static int mpc834x_usb_cfg(void)
 		return -1;
 		return -1;
 
 
 	/*
 	/*
-	 * if MDS board is plug into PIB board,
-	 * force to use the PHY on MDS board
+	 * if Processor Board is plugged into PIB board,
+	 * force to use the PHY on Processor Board
 	 */
 	 */
 	bcsr5 = in_8(bcsr_regs + 5);
 	bcsr5 = in_8(bcsr_regs + 5);
 	if (!(bcsr5 & BCSR5_INT_USB))
 	if (!(bcsr5 & BCSR5_INT_USB))

+ 1 - 0
arch/powerpc/platforms/85xx/Kconfig

@@ -47,6 +47,7 @@ config MPC85xx
 	bool
 	bool
 	select PPC_UDBG_16550
 	select PPC_UDBG_16550
 	select PPC_INDIRECT_PCI
 	select PPC_INDIRECT_PCI
+	select SERIAL_8250_SHARE_IRQ if SERIAL_8250
 	default y if MPC8540_ADS || MPC85xx_CDS || MPC8560_ADS || MPC85xx_MDS
 	default y if MPC8540_ADS || MPC85xx_CDS || MPC8560_ADS || MPC85xx_MDS
 
 
 config PPC_INDIRECT_PCI_BE
 config PPC_INDIRECT_PCI_BE

+ 61 - 21
arch/powerpc/platforms/celleb/scc_epci.c

@@ -43,11 +43,34 @@
 
 
 #define iob()  __asm__ __volatile__("eieio; sync":::"memory")
 #define iob()  __asm__ __volatile__("eieio; sync":::"memory")
 
 
+static inline volatile void __iomem *celleb_epci_get_epci_base(
+					struct pci_controller *hose)
+{
+	/*
+	 * Note:
+	 * Celleb epci uses cfg_addr as a base address for
+	 * epci control registers.
+	 */
+
+	return hose->cfg_addr;
+}
+
+static inline volatile void __iomem *celleb_epci_get_epci_cfg(
+					struct pci_controller *hose)
+{
+	/*
+	 * Note:
+	 * Celleb epci uses cfg_data as a base address for
+	 * configuration area for epci devices.
+	 */
+
+	return hose->cfg_data;
+}
 
 
 #if 0 /* test code for epci dummy read */
 #if 0 /* test code for epci dummy read */
 static void celleb_epci_dummy_read(struct pci_dev *dev)
 static void celleb_epci_dummy_read(struct pci_dev *dev)
 {
 {
-	void __iomem *epci_base;
+	volatile void __iomem *epci_base;
 	struct device_node *node;
 	struct device_node *node;
 	struct pci_controller *hose;
 	struct pci_controller *hose;
 	u32 val;
 	u32 val;
@@ -58,7 +81,7 @@ static void celleb_epci_dummy_read(struct pci_dev *dev)
 	if (!hose)
 	if (!hose)
 		return;
 		return;
 
 
-	epci_base = hose->cfg_addr;
+	epci_base = celleb_epci_get_epci_base(hose);
 
 
 	val = in_be32(epci_base + SCC_EPCI_WATRP);
 	val = in_be32(epci_base + SCC_EPCI_WATRP);
 	iosync();
 	iosync();
@@ -70,19 +93,20 @@ static void celleb_epci_dummy_read(struct pci_dev *dev)
 static inline void clear_and_disable_master_abort_interrupt(
 static inline void clear_and_disable_master_abort_interrupt(
 					struct pci_controller *hose)
 					struct pci_controller *hose)
 {
 {
-	void __iomem *addr;
-	addr = hose->cfg_addr + PCI_COMMAND;
-	out_be32(addr, in_be32(addr) | (PCI_STATUS_REC_MASTER_ABORT << 16));
+	volatile void __iomem *epci_base, *reg;
+	epci_base = celleb_epci_get_epci_base(hose);
+	reg = epci_base + PCI_COMMAND;
+	out_be32(reg, in_be32(reg) | (PCI_STATUS_REC_MASTER_ABORT << 16));
 }
 }
 
 
 static int celleb_epci_check_abort(struct pci_controller *hose,
 static int celleb_epci_check_abort(struct pci_controller *hose,
-				   void __iomem *addr)
+				   volatile void __iomem *addr)
 {
 {
-	void __iomem *reg, *epci_base;
+	volatile void __iomem *reg, *epci_base;
 	u32 val;
 	u32 val;
 
 
 	iob();
 	iob();
-	epci_base = hose->cfg_addr;
+	epci_base = celleb_epci_get_epci_base(hose);
 
 
 	reg = epci_base + PCI_COMMAND;
 	reg = epci_base + PCI_COMMAND;
 	val = in_be32(reg);
 	val = in_be32(reg);
@@ -108,20 +132,21 @@ static int celleb_epci_check_abort(struct pci_controller *hose,
 	return PCIBIOS_SUCCESSFUL;
 	return PCIBIOS_SUCCESSFUL;
 }
 }
 
 
-static void __iomem *celleb_epci_make_config_addr(struct pci_controller *hose,
+static volatile void __iomem *celleb_epci_make_config_addr(
+					struct pci_controller *hose,
 					unsigned int devfn, int where)
 					unsigned int devfn, int where)
 {
 {
-	void __iomem *addr;
+	volatile void __iomem *addr;
 	struct pci_bus *bus = hose->bus;
 	struct pci_bus *bus = hose->bus;
 
 
 	if (bus->self)
 	if (bus->self)
-		addr = hose->cfg_data +
+		addr = celleb_epci_get_epci_cfg(hose) +
 		       (((bus->number & 0xff) << 16)
 		       (((bus->number & 0xff) << 16)
 		        | ((devfn & 0xff) << 8)
 		        | ((devfn & 0xff) << 8)
 		        | (where & 0xff)
 		        | (where & 0xff)
 		        | 0x01000000);
 		        | 0x01000000);
 	else
 	else
-		addr = hose->cfg_data +
+		addr = celleb_epci_get_epci_cfg(hose) +
 		       (((devfn & 0xff) << 8) | (where & 0xff));
 		       (((devfn & 0xff) << 8) | (where & 0xff));
 
 
 	pr_debug("EPCI: config_addr = 0x%p\n", addr);
 	pr_debug("EPCI: config_addr = 0x%p\n", addr);
@@ -132,7 +157,7 @@ static void __iomem *celleb_epci_make_config_addr(struct pci_controller *hose,
 static int celleb_epci_read_config(struct pci_bus *bus,
 static int celleb_epci_read_config(struct pci_bus *bus,
 			unsigned int devfn, int where, int size, u32 * val)
 			unsigned int devfn, int where, int size, u32 * val)
 {
 {
-	void __iomem *addr;
+	volatile void __iomem *epci_base, *addr;
 	struct device_node *node;
 	struct device_node *node;
 	struct pci_controller *hose;
 	struct pci_controller *hose;
 
 
@@ -142,13 +167,14 @@ static int celleb_epci_read_config(struct pci_bus *bus,
 	node = (struct device_node *)bus->sysdata;
 	node = (struct device_node *)bus->sysdata;
 	hose = pci_find_hose_for_OF_device(node);
 	hose = pci_find_hose_for_OF_device(node);
 
 
-	if (!hose->cfg_data)
+	if (!celleb_epci_get_epci_cfg(hose))
 		return PCIBIOS_DEVICE_NOT_FOUND;
 		return PCIBIOS_DEVICE_NOT_FOUND;
 
 
 	if (bus->number == hose->first_busno && devfn == 0) {
 	if (bus->number == hose->first_busno && devfn == 0) {
 		/* EPCI controller self */
 		/* EPCI controller self */
 
 
-		addr = hose->cfg_addr + where;
+		epci_base = celleb_epci_get_epci_base(hose);
+		addr = epci_base + where;
 
 
 		switch (size) {
 		switch (size) {
 		case 1:
 		case 1:
@@ -185,7 +211,7 @@ static int celleb_epci_read_config(struct pci_bus *bus,
 	}
 	}
 
 
 	pr_debug("EPCI: "
 	pr_debug("EPCI: "
-		 "addr=0x%lx, devfn=0x%x, where=0x%x, size=0x%x, val=0x%x\n",
+		 "addr=0x%p, devfn=0x%x, where=0x%x, size=0x%x, val=0x%x\n",
 		 addr, devfn, where, size, *val);
 		 addr, devfn, where, size, *val);
 
 
 	return celleb_epci_check_abort(hose, NULL);
 	return celleb_epci_check_abort(hose, NULL);
@@ -194,7 +220,7 @@ static int celleb_epci_read_config(struct pci_bus *bus,
 static int celleb_epci_write_config(struct pci_bus *bus,
 static int celleb_epci_write_config(struct pci_bus *bus,
 			unsigned int devfn, int where, int size, u32 val)
 			unsigned int devfn, int where, int size, u32 val)
 {
 {
-	void __iomem *addr;
+	volatile void __iomem *epci_base, *addr;
 	struct device_node *node;
 	struct device_node *node;
 	struct pci_controller *hose;
 	struct pci_controller *hose;
 
 
@@ -204,13 +230,15 @@ static int celleb_epci_write_config(struct pci_bus *bus,
 	node = (struct device_node *)bus->sysdata;
 	node = (struct device_node *)bus->sysdata;
 	hose = pci_find_hose_for_OF_device(node);
 	hose = pci_find_hose_for_OF_device(node);
 
 
-	if (!hose->cfg_data)
+
+	if (!celleb_epci_get_epci_cfg(hose))
 		return PCIBIOS_DEVICE_NOT_FOUND;
 		return PCIBIOS_DEVICE_NOT_FOUND;
 
 
 	if (bus->number == hose->first_busno && devfn == 0) {
 	if (bus->number == hose->first_busno && devfn == 0) {
 		/* EPCI controller self */
 		/* EPCI controller self */
 
 
-		addr = hose->cfg_addr + where;
+		epci_base = celleb_epci_get_epci_base(hose);
+		addr = epci_base + where;
 
 
 		switch (size) {
 		switch (size) {
 		case 1:
 		case 1:
@@ -258,10 +286,10 @@ struct pci_ops celleb_epci_ops = {
 static int __devinit celleb_epci_init(struct pci_controller *hose)
 static int __devinit celleb_epci_init(struct pci_controller *hose)
 {
 {
 	u32 val;
 	u32 val;
-	void __iomem *reg, *epci_base;
+	volatile void __iomem *reg, *epci_base;
 	int hwres = 0;
 	int hwres = 0;
 
 
-	epci_base = hose->cfg_addr;
+	epci_base = celleb_epci_get_epci_base(hose);
 
 
 	/* PCI core reset(Internal bus and PCI clock) */
 	/* PCI core reset(Internal bus and PCI clock) */
 	reg = epci_base + SCC_EPCI_CKCTRL;
 	reg = epci_base + SCC_EPCI_CKCTRL;
@@ -382,6 +410,18 @@ int __devinit celleb_setup_epci(struct device_node *node,
 
 
 	pr_debug("PCI: celleb_setup_epci()\n");
 	pr_debug("PCI: celleb_setup_epci()\n");
 
 
+	/*
+	 * Note:
+	 * Celleb epci uses cfg_addr and cfg_data member of
+	 * pci_controller structure in irregular way.
+	 *
+	 * cfg_addr is used to map for control registers of
+	 * celleb epci.
+	 *
+	 * cfg_data is used for configuration area of devices
+	 * on Celleb epci buses.
+	 */
+
 	if (of_address_to_resource(node, 0, &r))
 	if (of_address_to_resource(node, 0, &r))
 		goto error;
 		goto error;
 	hose->cfg_addr = ioremap(r.start, (r.end - r.start + 1));
 	hose->cfg_addr = ioremap(r.start, (r.end - r.start + 1));

+ 1 - 0
arch/powerpc/platforms/embedded6xx/Kconfig

@@ -79,6 +79,7 @@ config LINKSTATION
 	select MPIC
 	select MPIC
 	select FSL_SOC
 	select FSL_SOC
 	select PPC_UDBG_16550 if SERIAL_8250
 	select PPC_UDBG_16550 if SERIAL_8250
+	select DEFAULT_UIMAGE
 	help
 	help
 	  Select LINKSTATION if configuring for one of PPC- (MPC8241)
 	  Select LINKSTATION if configuring for one of PPC- (MPC8241)
 	  based NAS systems from Buffalo Technology. So far only
 	  based NAS systems from Buffalo Technology. So far only

+ 4 - 1
arch/powerpc/platforms/powermac/feature.c

@@ -810,6 +810,7 @@ core99_ata100_enable(struct device_node *node, long value)
 	unsigned long flags;
 	unsigned long flags;
 	struct pci_dev *pdev = NULL;
 	struct pci_dev *pdev = NULL;
 	u8 pbus, pid;
 	u8 pbus, pid;
+	int rc;
 
 
 	if (uninorth_rev < 0x24)
 	if (uninorth_rev < 0x24)
 		return -ENODEV;
 		return -ENODEV;
@@ -828,7 +829,9 @@ core99_ata100_enable(struct device_node *node, long value)
 			pdev = pci_find_slot(pbus, pid);
 			pdev = pci_find_slot(pbus, pid);
 		if (pdev == NULL)
 		if (pdev == NULL)
 			return 0;
 			return 0;
-		pci_enable_device(pdev);
+		rc = pci_enable_device(pdev);
+		if (rc)
+			return rc;
 		pci_set_master(pdev);
 		pci_set_master(pdev);
 	}
 	}
 	return 0;
 	return 0;

+ 5 - 2
arch/powerpc/platforms/powermac/pci.c

@@ -1191,8 +1191,11 @@ void __init pmac_pcibios_after_init(void)
 	 * -- BenH
 	 * -- BenH
 	 */
 	 */
 	for_each_pci_dev(dev) {
 	for_each_pci_dev(dev) {
-		if ((dev->class >> 16) == PCI_BASE_CLASS_STORAGE)
-			pci_enable_device(dev);
+		if ((dev->class >> 16) != PCI_BASE_CLASS_STORAGE)
+			continue;
+		if (pci_enable_device(dev))
+			printk(KERN_WARNING
+			       "pci: Failed to enable %s\n", pci_name(dev));
 	}
 	}
 #endif /* CONFIG_BLK_DEV_IDE */
 #endif /* CONFIG_BLK_DEV_IDE */
 
 

+ 1 - 1
arch/powerpc/xmon/xmon.c

@@ -218,7 +218,7 @@ Commands:\n\
 "  ss	stop execution on all spus\n\
 "  ss	stop execution on all spus\n\
   sr	restore execution on stopped spus\n\
   sr	restore execution on stopped spus\n\
   sf  #	dump spu fields for spu # (in hex)\n\
   sf  #	dump spu fields for spu # (in hex)\n\
-  sd  #	dump spu local store for spu # (in hex)\
+  sd  #	dump spu local store for spu # (in hex)\n\
   sdi #	disassemble spu local store for spu # (in hex)\n"
   sdi #	disassemble spu local store for spu # (in hex)\n"
 #endif
 #endif
 "  S	print special registers\n\
 "  S	print special registers\n\