Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=4fb4c5582475452d3bf7c5072ef2d15ee06f7723
Commit:     4fb4c5582475452d3bf7c5072ef2d15ee06f7723
Parent:     c8004a28186110657aa3e75135a6b96ebfa3e8f0
Author:     Grant Likely <[EMAIL PROTECTED]>
AuthorDate: Thu Jan 24 22:25:31 2008 -0700
Committer:  Grant Likely <[EMAIL PROTECTED]>
CommitDate: Sat Jan 26 15:32:19 2008 -0700

    [POWERPC] mpc52xx_psc_spi device driver must not touch port_config and cdm
    
    It is dangerous for an mpc52xx device driver to modify the port_config
    register.  If the driver is probed incorrectly, it will change the pin
    IO configuration in ways which may not be compatible with the board.
    port_config should be set up by the bootloader, or failing that, in
    the platform setup code in arch/powerpc/platforms/52xx.
    
    Also, modifying CDM registers directly can cause a race condition with
    other drivers.  Instead call a common routine to modify CDM settings.
    
    Signed-off-by: Grant Likely <[EMAIL PROTECTED]>
    Acked-by: Dragos Carp <[EMAIL PROTECTED]>
---
 drivers/spi/mpc52xx_psc_spi.c |   77 +---------------------------------------
 1 files changed, 2 insertions(+), 75 deletions(-)

diff --git a/drivers/spi/mpc52xx_psc_spi.c b/drivers/spi/mpc52xx_psc_spi.c
index a3ebc63..253ed56 100644
--- a/drivers/spi/mpc52xx_psc_spi.c
+++ b/drivers/spi/mpc52xx_psc_spi.c
@@ -330,80 +330,13 @@ static void mpc52xx_psc_spi_cleanup(struct spi_device 
*spi)
 
 static int mpc52xx_psc_spi_port_config(int psc_id, struct mpc52xx_psc_spi *mps)
 {
-       struct device_node *np;
-       struct mpc52xx_cdm __iomem *cdm;
-       struct mpc52xx_gpio __iomem *gpio;
        struct mpc52xx_psc __iomem *psc = mps->psc;
-       u32 ul;
        u32 mclken_div;
        int ret = 0;
 
-#if defined(CONFIG_PPC_MERGE)
-       np = of_find_compatible_node(NULL, NULL, "mpc5200-cdm");
-       cdm = of_iomap(np, 0);
-       of_node_put(np);
-       np = of_find_compatible_node(NULL, NULL, "mpc5200-gpio");
-       gpio = of_iomap(np, 0);
-       of_node_put(np);
-#else
-       cdm = ioremap(MPC52xx_PA(MPC52xx_CDM_OFFSET), MPC52xx_CDM_SIZE);
-       gpio = ioremap(MPC52xx_PA(MPC52xx_GPIO_OFFSET), MPC52xx_GPIO_SIZE);
-#endif
-       if (!cdm || !gpio) {
-               printk(KERN_ERR "Error mapping CDM/GPIO\n");
-               ret = -EFAULT;
-               goto unmap_regs;
-       }
-
        /* default sysclk is 512MHz */
-       mclken_div = 0x8000 |
-               (((mps->sysclk ? mps->sysclk : 512000000) / MCLK) & 0x1FF);
-
-       switch (psc_id) {
-       case 1:
-               ul = in_be32(&gpio->port_config);
-               ul &= 0xFFFFFFF8;
-               ul |= 0x00000006;
-               out_be32(&gpio->port_config, ul);
-               out_be16(&cdm->mclken_div_psc1, mclken_div);
-               ul = in_be32(&cdm->clk_enables);
-               ul |= 0x00000020;
-               out_be32(&cdm->clk_enables, ul);
-               break;
-       case 2:
-               ul = in_be32(&gpio->port_config);
-               ul &= 0xFFFFFF8F;
-               ul |= 0x00000060;
-               out_be32(&gpio->port_config, ul);
-               out_be16(&cdm->mclken_div_psc2, mclken_div);
-               ul = in_be32(&cdm->clk_enables);
-               ul |= 0x00000040;
-               out_be32(&cdm->clk_enables, ul);
-               break;
-       case 3:
-               ul = in_be32(&gpio->port_config);
-               ul &= 0xFFFFF0FF;
-               ul |= 0x00000600;
-               out_be32(&gpio->port_config, ul);
-               out_be16(&cdm->mclken_div_psc3, mclken_div);
-               ul = in_be32(&cdm->clk_enables);
-               ul |= 0x00000080;
-               out_be32(&cdm->clk_enables, ul);
-               break;
-       case 6:
-               ul = in_be32(&gpio->port_config);
-               ul &= 0xFF8FFFFF;
-               ul |= 0x00700000;
-               out_be32(&gpio->port_config, ul);
-               out_be16(&cdm->mclken_div_psc6, mclken_div);
-               ul = in_be32(&cdm->clk_enables);
-               ul |= 0x00000010;
-               out_be32(&cdm->clk_enables, ul);
-               break;
-       default:
-               ret = -EINVAL;
-               goto unmap_regs;
-       }
+       mclken_div = (mps->sysclk ? mps->sysclk : 512000000) / MCLK;
+       mpc52xx_set_psc_clkdiv(psc_id, mclken_div);
 
        /* Reset the PSC into a known state */
        out_8(&psc->command, MPC52xx_PSC_RST_RX);
@@ -427,12 +360,6 @@ static int mpc52xx_psc_spi_port_config(int psc_id, struct 
mpc52xx_psc_spi *mps)
 
        mps->bits_per_word = 8;
 
-unmap_regs:
-       if (cdm)
-               iounmap(cdm);
-       if (gpio)
-               iounmap(gpio);
-
        return ret;
 }
 
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to