]> git.karo-electronics.de Git - mv-sheeva.git/commitdiff
Merge commit 'gcl/merge' into next
authorBenjamin Herrenschmidt <benh@kernel.crashing.org>
Thu, 18 Jun 2009 01:22:08 +0000 (11:22 +1000)
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>
Thu, 18 Jun 2009 01:22:08 +0000 (11:22 +1000)
Manual merge of:
drivers/net/fec_mpc52xx.c

18 files changed:
arch/powerpc/boot/dts/pcm030.dts
arch/powerpc/include/asm/mpc52xx.h
arch/powerpc/include/asm/mpc5xxx.h [moved from arch/powerpc/include/asm/mpc512x.h with 65% similarity]
arch/powerpc/platforms/512x/clock.c
arch/powerpc/platforms/512x/mpc512x.h
arch/powerpc/platforms/512x/mpc512x_shared.c
arch/powerpc/platforms/52xx/mpc52xx_common.c
arch/powerpc/sysdev/Makefile
arch/powerpc/sysdev/mpc5xxx_clocks.c [new file with mode: 0644]
drivers/ata/pata_mpc52xx.c
drivers/i2c/busses/i2c-mpc.c
drivers/net/fec_mpc52xx.c
drivers/net/fec_mpc52xx_phy.c
drivers/serial/mpc52xx_uart.c
drivers/spi/mpc52xx_psc_spi.c
drivers/video/xilinxfb.c
drivers/watchdog/mpc5200_wdt.c
include/linux/fsl_devices.h

index 895834713894f1baf0ae2bb4ea50ee7ff1458dca..30bfdc04c6dfacd88a9c6e325e873d75a633bdf5 100644 (file)
                                compatible = "nxp,pcf8563";
                                reg = <0x51>;
                        };
-                       /* FIXME: EEPROM */
+                       eeprom@52 {
+                               compatible = "catalyst,24c32";
+                               reg = <0x52>;
+                       };
                };
 
                sram@8000 {
                        compatible = "fsl,mpc5200b-sram","fsl,mpc5200-sram";
                        reg = <0x8000 0x4000>;
                };
-
-               /* This is only an example device to show the usage of gpios. It maps all available
-                * gpios to the "gpio-provider" device.
-                */
-               gpio {
-                       compatible = "gpio-provider";
-
-                                                   /* mpc52xx          exp.con         patchfield */
-                       gpios = <&gpio_wkup     0 0 /* GPIO_WKUP_7      11d             jp13-3     */
-                                &gpio_wkup     1 0 /* GPIO_WKUP_6      14c                        */
-                                &gpio_wkup     6 0 /* PSC2_4           43c             x5-11      */
-                                &gpio_simple   2 0 /* IRDA_1           24c             x7-6    set GPS_PORT_CONFIG[IRDA] = 0 */
-                                &gpio_simple   3 0 /* IRDA_0                           x8-5    set GPS_PORT_CONFIG[IRDA] = 0 */
-                                &gpt2          0 0 /* timer2           12d             x4-4       */
-                                &gpt3          0 0 /* timer3           13d             x6-4       */
-                                &gpt4          0 0 /* timer4           61c             x2-16      */
-                                &gpt5          0 0 /* timer5           44c             x7-11      */
-                                &gpt6          0 0 /* timer6           60c             x8-15      */
-                                &gpt7          0 0 /* timer7           36a             x17-9      */
-                                >;
-               };
        };
 
        pci@f0000d00 {
index 52e049cd9e687c09b2b95eb5b71082cecca5bfb9..1b4f697abbddf0268e18506029da422eef214156 100644 (file)
@@ -16,6 +16,7 @@
 #ifndef __ASSEMBLY__
 #include <asm/types.h>
 #include <asm/prom.h>
+#include <asm/mpc5xxx.h>
 #endif /* __ASSEMBLY__ */
 
 #include <linux/suspend.h>
@@ -268,7 +269,6 @@ struct mpc52xx_intr {
 #ifndef __ASSEMBLY__
 
 /* mpc52xx_common.c */
-extern unsigned int mpc52xx_find_ipb_freq(struct device_node *node);
 extern void mpc5200_setup_xlb_arbiter(void);
 extern void mpc52xx_declare_of_platform_devices(void);
 extern void mpc52xx_map_common_devices(void);
similarity index 65%
rename from arch/powerpc/include/asm/mpc512x.h
rename to arch/powerpc/include/asm/mpc5xxx.h
index c48a1658eeacd1edd88380287dce823facc24ec3..5ce9c5fa434a230d47e4cca048f09d10def068d4 100644 (file)
@@ -4,7 +4,7 @@
  * Author: John Rigby, <jrigby@freescale.com>, Friday Apr 13 2007
  *
  * Description:
- * MPC5121 Prototypes and definitions
+ * MPC5xxx Prototypes and definitions
  *
  * This is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by
  *
  */
 
-#ifndef __ASM_POWERPC_MPC512x_H__
-#define __ASM_POWERPC_MPC512x_H__
+#ifndef __ASM_POWERPC_MPC5xxx_H__
+#define __ASM_POWERPC_MPC5xxx_H__
 
-extern unsigned long mpc512x_find_ips_freq(struct device_node *node);
+extern unsigned long mpc5xxx_get_bus_frequency(struct device_node *node);
 
-#endif /* __ASM_POWERPC_MPC512x_H__ */
+#endif /* __ASM_POWERPC_MPC5xxx_H__ */
 
index 1bcff94eb924b054575ac58aba4a6713c0a6d0f9..84544d0720431837aab591dce6cc5c13481d48a3 100644 (file)
@@ -24,7 +24,7 @@
 #include <linux/io.h>
 
 #include <linux/of_platform.h>
-#include <asm/mpc512x.h>
+#include <asm/mpc5xxx.h>
 #include <asm/clk_interface.h>
 
 #undef CLK_DEBUG
@@ -83,13 +83,13 @@ static void dump_clocks(void)
        mutex_lock(&clocks_mutex);
        printk(KERN_INFO "CLOCKS:\n");
        list_for_each_entry(p, &clocks, node) {
-               printk(KERN_INFO "  %s %ld", p->name, p->rate);
+               pr_info("  %s=%ld", p->name, p->rate);
                if (p->parent)
-                       printk(KERN_INFO " %s %ld", p->parent->name,
+                       pr_cont(" %s=%ld", p->parent->name,
                               p->parent->rate);
                if (p->flags & CLK_HAS_CTRL)
-                       printk(KERN_INFO " reg/bit %d/%d", p->reg, p->bit);
-               printk("\n");
+                       pr_cont(" reg/bit=%d/%d", p->reg, p->bit);
+               pr_cont("\n");
        }
        mutex_unlock(&clocks_mutex);
 }
index 9c03693cb0097ae1c6a5dd7ece523ad36fbaddd5..22a5352407e0ae0c64ed5bd00177cc211156e792 100644 (file)
@@ -11,7 +11,6 @@
 
 #ifndef __MPC512X_H__
 #define __MPC512X_H__
-extern unsigned long mpc512x_find_ips_freq(struct device_node *node);
 extern void __init mpc512x_init_IRQ(void);
 void __init mpc512x_declare_of_platform_devices(void);
 #endif                         /* __MPC512X_H__ */
index d8cd579f3191b8955e897f7be21d0912105763ae..434d683df5a0e927931660fb55a328ffc40301e4 100644 (file)
 
 #include "mpc512x.h"
 
-unsigned long
-mpc512x_find_ips_freq(struct device_node *node)
-{
-       struct device_node *np;
-       const unsigned int *p_ips_freq = NULL;
-
-       of_node_get(node);
-       while (node) {
-               p_ips_freq = of_get_property(node, "bus-frequency", NULL);
-               if (p_ips_freq)
-                       break;
-
-               np = of_get_parent(node);
-               of_node_put(node);
-               node = np;
-       }
-       if (node)
-               of_node_put(node);
-
-       return p_ips_freq ? *p_ips_freq : 0;
-}
-EXPORT_SYMBOL(mpc512x_find_ips_freq);
-
 void __init mpc512x_init_IRQ(void)
 {
        struct device_node *np;
index 8e3dd5a0f228d67fc305731ebddf12fbe2f80b39..a46bad0c2339732555dacd4806a75bf7dcc15c19 100644 (file)
@@ -47,36 +47,6 @@ static DEFINE_SPINLOCK(mpc52xx_lock);
 static struct mpc52xx_gpt __iomem *mpc52xx_wdt;
 static struct mpc52xx_cdm __iomem *mpc52xx_cdm;
 
-/**
- *     mpc52xx_find_ipb_freq - Find the IPB bus frequency for a device
- *     @node:  device node
- *
- *     Returns IPB bus frequency, or 0 if the bus frequency cannot be found.
- */
-unsigned int
-mpc52xx_find_ipb_freq(struct device_node *node)
-{
-       struct device_node *np;
-       const unsigned int *p_ipb_freq = NULL;
-
-       of_node_get(node);
-       while (node) {
-               p_ipb_freq = of_get_property(node, "bus-frequency", NULL);
-               if (p_ipb_freq)
-                       break;
-
-               np = of_get_parent(node);
-               of_node_put(node);
-               node = np;
-       }
-       if (node)
-               of_node_put(node);
-
-       return p_ipb_freq ? *p_ipb_freq : 0;
-}
-EXPORT_SYMBOL(mpc52xx_find_ipb_freq);
-
-
 /*
  * Configure the XLB arbiter settings to match what Linux expects.
  */
@@ -221,7 +191,7 @@ unsigned int mpc52xx_get_xtal_freq(struct device_node *node)
        if (!mpc52xx_cdm)
                return 0;
 
-       freq = mpc52xx_find_ipb_freq(node);
+       freq = mpc5xxx_get_bus_frequency(node);
        if (!freq)
                return 0;
 
index d073bfdd222a7d8225fe04366bc8b9c28087c43e..9d4b17462f1308815b29a18368fbb14b37d9e9e6 100644 (file)
@@ -50,6 +50,9 @@ obj-$(CONFIG_PPC_DCR)         += dcr.o
 obj-$(CONFIG_8xx)              += mpc8xx_pic.o cpm1.o
 obj-$(CONFIG_UCODE_PATCH)      += micropatch.o
 
+obj-$(CONFIG_PPC_MPC512x)      += mpc5xxx_clocks.o
+obj-$(CONFIG_PPC_MPC52xx)      += mpc5xxx_clocks.o
+
 ifeq ($(CONFIG_SUSPEND),y)
 obj-$(CONFIG_6xx)              += 6xx-suspend.o
 endif
diff --git a/arch/powerpc/sysdev/mpc5xxx_clocks.c b/arch/powerpc/sysdev/mpc5xxx_clocks.c
new file mode 100644 (file)
index 0000000..34e12f9
--- /dev/null
@@ -0,0 +1,33 @@
+/**
+ *     mpc5xxx_get_bus_frequency - Find the bus frequency for a device
+ *     @node:  device node
+ *
+ *     Returns bus frequency (IPS on MPC512x, IPB on MPC52xx),
+ *     or 0 if the bus frequency cannot be found.
+ */
+
+#include <linux/kernel.h>
+#include <linux/of_platform.h>
+
+unsigned int
+mpc5xxx_get_bus_frequency(struct device_node *node)
+{
+       struct device_node *np;
+       const unsigned int *p_bus_freq = NULL;
+
+       of_node_get(node);
+       while (node) {
+               p_bus_freq = of_get_property(node, "bus-frequency", NULL);
+               if (p_bus_freq)
+                       break;
+
+               np = of_get_parent(node);
+               of_node_put(node);
+               node = np;
+       }
+       if (node)
+               of_node_put(node);
+
+       return p_bus_freq ? *p_bus_freq : 0;
+}
+EXPORT_SYMBOL(mpc5xxx_get_bus_frequency);
index 68d27bc70d06c8722038fe8d459755425fa293bd..2bc2dbe30e8fe6d4635cf90f986ad866926c0feb 100644 (file)
@@ -694,7 +694,7 @@ mpc52xx_ata_probe(struct of_device *op, const struct of_device_id *match)
        struct bcom_task *dmatsk = NULL;
 
        /* Get ipb frequency */
-       ipb_freq = mpc52xx_find_ipb_freq(op->node);
+       ipb_freq = mpc5xxx_get_bus_frequency(op->node);
        if (!ipb_freq) {
                dev_err(&op->dev, "could not determine IPB bus frequency\n");
                return -ENODEV;
index dd778d7ae047a35d7626e083dacf34e1d72d0552..d325e86e3103dc1059c754e51e7ee269c5cc1c8f 100644 (file)
@@ -197,7 +197,7 @@ int mpc_i2c_get_fdr_52xx(struct device_node *node, u32 clock, int prescaler)
                return -EINVAL;
 
        /* Determine divider value */
-       divider = mpc52xx_find_ipb_freq(node) / clock;
+       divider = mpc5xxx_get_bus_frequency(node) / clock;
 
        /*
         * We want to choose an FDR/DFSR that generates an I2C bus speed that
index 7d443405bbe271e6ea47220775e5d42d4955414c..cc786333d95c87cd84d34a1b189c43f9b60367c1 100644 (file)
@@ -948,7 +948,7 @@ mpc52xx_fec_probe(struct of_device *op, const struct of_device_id *match)
        /* Start with safe defaults for link connection */
        priv->speed = 100;
        priv->duplex = DUPLEX_HALF;
-       priv->mdio_speed = ((mpc52xx_find_ipb_freq(op->node) >> 20) / 5) << 1;
+       priv->mdio_speed = ((mpc5xxx_get_bus_frequency(op->node) >> 20) / 5) << 1;
 
        /* The current speed preconfigures the speed of the MII link */
        prop = of_get_property(op->node, "current-speed", &prop_size);
index fec9f245116b7824c2099ccdecf6d4e2b1597b23..31e6d62b785d81beb13ea7b4f76792975a385127 100644 (file)
@@ -106,7 +106,7 @@ static int mpc52xx_fec_mdio_probe(struct of_device *of,
 
        /* set MII speed */
        out_be32(&priv->regs->mii_speed,
-               ((mpc52xx_find_ipb_freq(of->node) >> 20) / 5) << 1);
+               ((mpc5xxx_get_bus_frequency(of->node) >> 20) / 5) << 1);
 
        err = of_mdiobus_register(bus, np);
        if (err)
index b3feb6198d57171b30edcf4d3a51cada259af29b..abbd146c50d97ae1c55c34c94d26b025a53179c8 100644 (file)
@@ -76,7 +76,6 @@
 #include <linux/of_platform.h>
 
 #include <asm/mpc52xx.h>
-#include <asm/mpc512x.h>
 #include <asm/mpc52xx_psc.h>
 
 #if defined(CONFIG_SERIAL_MPC52xx_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ)
@@ -254,7 +253,7 @@ static unsigned long mpc52xx_getuartclk(void *p)
         * but the generic serial code assumes 16
         * so return ipb freq / 2
         */
-       return mpc52xx_find_ipb_freq(p) / 2;
+       return mpc5xxx_get_bus_frequency(p) / 2;
 }
 
 static struct psc_ops mpc52xx_psc_ops = {
@@ -391,7 +390,7 @@ static void mpc512x_psc_cw_restore_ints(struct uart_port *port)
 
 static unsigned long mpc512x_getuartclk(void *p)
 {
-       return mpc512x_find_ips_freq(p);
+       return mpc5xxx_get_bus_frequency(p);
 }
 
 static struct psc_ops mpc512x_psc_ops = {
index 68c77a9115956cad8e57eb92bde8a1a03ae68a3d..e1901fdce7747719e444346a336ccd81d0c1f7ee 100644 (file)
@@ -13,6 +13,7 @@
 
 #include <linux/module.h>
 #include <linux/init.h>
+#include <linux/types.h>
 #include <linux/errno.h>
 #include <linux/interrupt.h>
 #include <linux/of_platform.h>
@@ -30,8 +31,7 @@
 
 struct mpc52xx_psc_spi {
        /* fsl_spi_platform data */
-       void (*activate_cs)(u8, u8);
-       void (*deactivate_cs)(u8, u8);
+       void (*cs_control)(struct spi_device *spi, bool on);
        u32 sysclk;
 
        /* driver internal data */
@@ -111,18 +111,16 @@ static void mpc52xx_psc_spi_activate_cs(struct spi_device *spi)
        out_be16((u16 __iomem *)&psc->ccr, ccr);
        mps->bits_per_word = cs->bits_per_word;
 
-       if (mps->activate_cs)
-               mps->activate_cs(spi->chip_select,
-                               (spi->mode & SPI_CS_HIGH) ? 1 : 0);
+       if (mps->cs_control)
+               mps->cs_control(spi, (spi->mode & SPI_CS_HIGH) ? 1 : 0);
 }
 
 static void mpc52xx_psc_spi_deactivate_cs(struct spi_device *spi)
 {
        struct mpc52xx_psc_spi *mps = spi_master_get_devdata(spi->master);
 
-       if (mps->deactivate_cs)
-               mps->deactivate_cs(spi->chip_select,
-                               (spi->mode & SPI_CS_HIGH) ? 1 : 0);
+       if (mps->cs_control)
+               mps->cs_control(spi, (spi->mode & SPI_CS_HIGH) ? 0 : 1);
 }
 
 #define MPC52xx_PSC_BUFSIZE (MPC52xx_PSC_RFNUM_MASK + 1)
@@ -388,15 +386,13 @@ static int __init mpc52xx_psc_spi_do_probe(struct device *dev, u32 regaddr,
        mps->irq = irq;
        if (pdata == NULL) {
                dev_warn(dev, "probe called without platform data, no "
-                               "(de)activate_cs function will be called\n");
-               mps->activate_cs = NULL;
-               mps->deactivate_cs = NULL;
+                               "cs_control function will be called\n");
+               mps->cs_control = NULL;
                mps->sysclk = 0;
                master->bus_num = bus_num;
                master->num_chipselect = 255;
        } else {
-               mps->activate_cs = pdata->activate_cs;
-               mps->deactivate_cs = pdata->deactivate_cs;
+               mps->cs_control = pdata->cs_control;
                mps->sysclk = pdata->sysclk;
                master->bus_num = pdata->bus_num;
                master->num_chipselect = pdata->max_chipselect;
index 7a868bd16e0e2d35bff8b7842a7ceb6f9ef3f5c2..ed7c8d0ddccb47394b2cff3dd6608a826a8d0a7c 100644 (file)
@@ -124,7 +124,6 @@ struct xilinxfb_drvdata {
                                                registers */
 
        dcr_host_t      dcr_host;
-       unsigned int    dcr_start;
        unsigned int    dcr_len;
 
        void            *fb_virt;       /* virt. address of the frame buffer */
@@ -325,8 +324,8 @@ static int xilinxfb_assign(struct device *dev,
                                        drvdata->regs);
        }
        /* Put a banner in the log (for DEBUG) */
-       dev_dbg(dev, "fb: phys=%p, virt=%p, size=%x\n",
-               (void *)drvdata->fb_phys, drvdata->fb_virt, fbsize);
+       dev_dbg(dev, "fb: phys=%llx, virt=%p, size=%x\n",
+               (unsigned long long)drvdata->fb_phys, drvdata->fb_virt, fbsize);
 
        return 0;       /* success */
 
@@ -404,9 +403,7 @@ xilinxfb_of_probe(struct of_device *op, const struct of_device_id *match)
        u32 tft_access;
        struct xilinxfb_platform_data pdata;
        struct resource res;
-       int size, rc;
-       int start = 0, len = 0;
-       dcr_host_t dcr_host;
+       int size, rc, start;
        struct xilinxfb_drvdata *drvdata;
 
        /* Copy with the default pdata (not a ptr reference!) */
@@ -414,35 +411,39 @@ xilinxfb_of_probe(struct of_device *op, const struct of_device_id *match)
 
        dev_dbg(&op->dev, "xilinxfb_of_probe(%p, %p)\n", op, match);
 
+       /* Allocate the driver data region */
+       drvdata = kzalloc(sizeof(*drvdata), GFP_KERNEL);
+       if (!drvdata) {
+               dev_err(&op->dev, "Couldn't allocate device private record\n");
+               return -ENOMEM;
+       }
+
        /*
         * To check whether the core is connected directly to DCR or PLB
         * interface and initialize the tft_access accordingly.
         */
        p = (u32 *)of_get_property(op->node, "xlnx,dcr-splb-slave-if", NULL);
-
-       if (p)
-               tft_access = *p;
-       else
-               tft_access = 0;         /* For backward compatibility */
+       tft_access = p ? *p : 0;
 
        /*
         * Fill the resource structure if its direct PLB interface
         * otherwise fill the dcr_host structure.
         */
        if (tft_access) {
+               drvdata->flags |= PLB_ACCESS_FLAG;
                rc = of_address_to_resource(op->node, 0, &res);
                if (rc) {
                        dev_err(&op->dev, "invalid address\n");
-                       return -ENODEV;
+                       goto err;
                }
-
        } else {
+               res.start = 0;
                start = dcr_resource_start(op->node, 0);
-               len = dcr_resource_len(op->node, 0);
-               dcr_host = dcr_map(op->node, start, len);
-               if (!DCR_MAP_OK(dcr_host)) {
-                       dev_err(&op->dev, "invalid address\n");
-                       return -ENODEV;
+               drvdata->dcr_len = dcr_resource_len(op->node, 0);
+               drvdata->dcr_host = dcr_map(op->node, start, drvdata->dcr_len);
+               if (!DCR_MAP_OK(drvdata->dcr_host)) {
+                       dev_err(&op->dev, "invalid DCR address\n");
+                       goto err;
                }
        }
 
@@ -467,26 +468,12 @@ xilinxfb_of_probe(struct of_device *op, const struct of_device_id *match)
        if (of_find_property(op->node, "rotate-display", NULL))
                pdata.rotate_screen = 1;
 
-       /* Allocate the driver data region */
-       drvdata = kzalloc(sizeof(*drvdata), GFP_KERNEL);
-       if (!drvdata) {
-               dev_err(&op->dev, "Couldn't allocate device private record\n");
-               return -ENOMEM;
-       }
        dev_set_drvdata(&op->dev, drvdata);
+       return xilinxfb_assign(&op->dev, drvdata, res.start, &pdata);
 
-       if (tft_access)
-               drvdata->flags |= PLB_ACCESS_FLAG;
-
-       /* Arguments are passed based on the interface */
-       if (drvdata->flags & PLB_ACCESS_FLAG) {
-               return xilinxfb_assign(&op->dev, drvdata, res.start, &pdata);
-       } else {
-               drvdata->dcr_start = start;
-               drvdata->dcr_len = len;
-               drvdata->dcr_host = dcr_host;
-               return xilinxfb_assign(&op->dev, drvdata, 0, &pdata);
-       }
+ err:
+       kfree(drvdata);
+       return -ENODEV;
 }
 
 static int __devexit xilinxfb_of_remove(struct of_device *op)
index 465fe36adad4db1ea03c35921aef1bd83a65ee8e..fa9c47ce0ae7b3d32a9c4a34a3747c2df08ae7d6 100644 (file)
@@ -188,7 +188,7 @@ static int mpc5200_wdt_probe(struct of_device *op,
        if (!wdt)
                return -ENOMEM;
 
-       wdt->ipb_freq = mpc52xx_find_ipb_freq(op->node);
+       wdt->ipb_freq = mpc5xxx_get_bus_frequency(op->node);
 
        err = of_address_to_resource(op->node, 0, &wdt->mem);
        if (err)
index 244677cc082bba2a1173d49b9c5d15610b041cc4..43fc95d822d5e51f2ddd21321a2791c96613abf4 100644 (file)
@@ -79,10 +79,6 @@ struct fsl_spi_platform_data {
        u16     max_chipselect;
        void    (*cs_control)(struct spi_device *spi, bool on);
        u32     sysclk;
-
-       /* Legacy hooks, used by mpc52xx_psc_spi driver. */
-       void    (*activate_cs)(u8 cs, u8 polarity);
-       void    (*deactivate_cs)(u8 cs, u8 polarity);
 };
 
 struct mpc8xx_pcmcia_ops {