mxs: ssp: Pull out the SSP bus to regs conversion
authorMarek Vasut <marex@denx.de>
Fri, 11 Jan 2013 03:19:02 +0000 (03:19 +0000)
committerStefano Babic <sbabic@denx.de>
Mon, 21 Jan 2013 11:05:19 +0000 (12:05 +0100)
Create function which converts SSP bus number to SSP register pointer.
This functionality is reimplemented multiple times in the code, thus
make one common implementation. Moreover, make it a switch(), since the
SSP ports are not mapped in such nice linear fashion on MX23, therefore
having it a switch will simplify things there.

Signed-off-by: Marek Vasut <marex@denx.de>
Cc: Andy Fleming <afleming@freescale.com>
Cc: Fabio Estevam <fabio.estevam@freescale.com>
Cc: Stefano Babic <sbabic@denx.de>
arch/arm/cpu/arm926ejs/mxs/clock.c
arch/arm/include/asm/arch-mxs/regs-ssp.h
drivers/mmc/mxsmmc.c
drivers/spi/mxs_spi.c

index 4ff19c3..5d6e12a 100644 (file)
@@ -278,7 +278,7 @@ void mx28_set_ssp_busclock(unsigned int bus, uint32_t freq)
        uint32_t reg;
        uint32_t divide, rate, tgtclk;
 
-       ssp_regs = (struct mxs_ssp_regs *)(MXS_SSP0_BASE + (bus * 0x2000));
+       ssp_regs = mxs_ssp_regs_by_bus(bus);
 
        /*
         * SSP bit rate = SSPCLK / (CLOCK_DIVIDE * (1 + CLOCK_RATE)),
index cf52a28..4a75029 100644 (file)
@@ -50,6 +50,22 @@ struct mxs_ssp_regs {
        mxs_reg_32(hw_ssp_debug)
        mxs_reg_32(hw_ssp_version)
 };
+
+static inline struct mxs_ssp_regs *mxs_ssp_regs_by_bus(unsigned int port)
+{
+       switch (port) {
+       case 0:
+               return (struct mxs_ssp_regs *)MXS_SSP0_BASE;
+       case 1:
+               return (struct mxs_ssp_regs *)MXS_SSP1_BASE;
+       case 2:
+               return (struct mxs_ssp_regs *)MXS_SSP2_BASE;
+       case 3:
+               return (struct mxs_ssp_regs *)MXS_SSP3_BASE;
+       default:
+               return NULL;
+       }
+}
 #endif
 
 #define        SSP_CTRL0_SFTRST                        (1 << 31)
index aa3d1b0..2fd9ccc 100644 (file)
@@ -380,20 +380,7 @@ int mxsmmc_initialize(bd_t *bis, int id, int (*wp)(int))
 
        priv->mmc_is_wp = wp;
        priv->id = id;
-       switch (id) {
-       case 0:
-               priv->regs = (struct mxs_ssp_regs *)MXS_SSP0_BASE;
-               break;
-       case 1:
-               priv->regs = (struct mxs_ssp_regs *)MXS_SSP1_BASE;
-               break;
-       case 2:
-               priv->regs = (struct mxs_ssp_regs *)MXS_SSP2_BASE;
-               break;
-       case 3:
-               priv->regs = (struct mxs_ssp_regs *)MXS_SSP3_BASE;
-               break;
-       }
+       priv->regs = mxs_ssp_regs_by_bus(id);
 
        sprintf(mmc->name, "MXS MMC");
        mmc->send_cmd = mxsmmc_send_cmd;
index 42e4c99..31cd77d 100644 (file)
@@ -80,7 +80,6 @@ struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs,
                                  unsigned int max_hz, unsigned int mode)
 {
        struct mxs_spi_slave *mxs_slave;
-       uint32_t addr;
        struct mxs_ssp_regs *ssp_regs;
        int reg;
 
@@ -96,13 +95,11 @@ struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs,
        if (mxs_dma_init_channel(bus))
                goto err_init;
 
-       addr = MXS_SSP0_BASE + (bus * MXS_SPI_PORT_OFFSET);
-
        mxs_slave->slave.bus = bus;
        mxs_slave->slave.cs = cs;
        mxs_slave->max_khz = max_hz / 1000;
        mxs_slave->mode = mode;
-       mxs_slave->regs = (struct mxs_ssp_regs *)addr;
+       mxs_slave->regs = mxs_ssp_regs_by_bus(bus);
        ssp_regs = mxs_slave->regs;
 
        reg = readl(&ssp_regs->hw_ssp_ctrl0);