From: Grant Likely <[EMAIL PROTECTED]>

port_config and the cdm are the responsibility of firmware; and if
firmware doesn't set it up correctly, it should be fixed up by
platform code on a per-board basis because it's a property of the
board.

Drivers should never touch these registers.

Signed-off-by: Grant Likely <[EMAIL PROTECTED]>
---

 drivers/spi/mpc52xx_psc_spi.c |   84 ++++-------------------------------------
 1 files changed, 8 insertions(+), 76 deletions(-)

diff --git a/drivers/spi/mpc52xx_psc_spi.c b/drivers/spi/mpc52xx_psc_spi.c
index 7051e6c..44d1110 100644
--- a/drivers/spi/mpc52xx_psc_spi.c
+++ b/drivers/spi/mpc52xx_psc_spi.c
@@ -328,77 +328,15 @@ static void mpc52xx_psc_spi_cleanup(struct spi_device 
*spi)
        kfree(spi->controller_state);
 }
 
-static int mpc52xx_psc_spi_port_config(int psc_id, struct mpc52xx_psc_spi *mps)
+static int mpc52xx_psc_spi_config(int psc_id, struct mpc52xx_psc_spi *mps)
 {
-       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;
+       int rc;
 
-#if defined(CONFIG_PPC_MERGE)
-       cdm = mpc52xx_find_and_map("mpc5200-cdm");
-       gpio = mpc52xx_find_and_map("mpc5200-gpio");
-#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;
-       }
+       /* Setup a desirable MCLK */
+       rc = mpc52xx_cdm_set_psc_clk(psc_id, MCLK);
+       if (rc)
+               return rc;
 
        /* Reset the PSC into a known state */
        out_8(&psc->command, MPC52xx_PSC_RST_RX);
@@ -422,13 +360,7 @@ 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;
+       return 0;
 }
 
 static irqreturn_t mpc52xx_psc_spi_isr(int irq, void *dev_id)
@@ -493,7 +425,7 @@ static int __init mpc52xx_psc_spi_do_probe(struct device 
*dev, u32 regaddr,
        if (ret)
                goto free_master;
 
-       ret = mpc52xx_psc_spi_port_config(master->bus_num, mps);
+       ret = mpc52xx_psc_spi_config(master->bus_num-1, mps);
        if (ret < 0)
                goto free_irq;
 

_______________________________________________
Linuxppc-dev mailing list
Linuxppc-dev@ozlabs.org
https://ozlabs.org/mailman/listinfo/linuxppc-dev

Reply via email to