[PATCH v2 5/7] spi/imx: use soc name in spi device type naming scheme
Grant Likely
grant.likely at secretlab.ca
Fri Jul 15 12:53:43 EST 2011
On Sun, Jul 10, 2011 at 01:16:39AM +0800, Shawn Guo wrote:
> Software defined version number is not stable enough to be used
> in device type naming scheme. The patch changes it to use implicit
> soc name for spi device type definition. In this way, we can easily
> align the naming scheme with device tree binding, which comes later.
>
> It removes fifosize from spi_imx_data and adds devtype there, so that
> fifosize can be set in an inline function according to devtype.
> Also, cpu_is_mx can be replaced by inline functions checking devtype.
>
> Signed-off-by: Shawn Guo <shawn.guo at linaro.org>
> Cc: Uwe Kleine-König <u.kleine-koenig at pengutronix.de>
> Cc: Sascha Hauer <s.hauer at pengutronix.de>
> Cc: Grant Likely <grant.likely at secretlab.ca>
Applied, thanks.
g.
> ---
> arch/arm/mach-imx/clock-imx25.c | 7 +-
> arch/arm/mach-mx5/clock-mx51-mx53.c | 11 +-
> arch/arm/plat-mxc/devices/platform-spi_imx.c | 12 +-
> drivers/spi/Kconfig | 12 --
> drivers/spi/spi-imx.c | 208 ++++++++++++++------------
> 5 files changed, 128 insertions(+), 122 deletions(-)
>
> diff --git a/arch/arm/mach-imx/clock-imx25.c b/arch/arm/mach-imx/clock-imx25.c
> index 9bb9062..17d6d1b 100644
> --- a/arch/arm/mach-imx/clock-imx25.c
> +++ b/arch/arm/mach-imx/clock-imx25.c
> @@ -283,9 +283,10 @@ static struct clk_lookup lookups[] = {
> _REGISTER_CLOCK("mxc-ehci.2", "usb", usbotg_clk)
> _REGISTER_CLOCK("fsl-usb2-udc", "usb", usbotg_clk)
> _REGISTER_CLOCK("mxc_nand.0", NULL, nfc_clk)
> - _REGISTER_CLOCK("imx25-cspi.0", NULL, cspi1_clk)
> - _REGISTER_CLOCK("imx25-cspi.1", NULL, cspi2_clk)
> - _REGISTER_CLOCK("imx25-cspi.2", NULL, cspi3_clk)
> + /* i.mx25 has the i.mx35 type cspi */
> + _REGISTER_CLOCK("imx35-cspi.0", NULL, cspi1_clk)
> + _REGISTER_CLOCK("imx35-cspi.1", NULL, cspi2_clk)
> + _REGISTER_CLOCK("imx35-cspi.2", NULL, cspi3_clk)
> _REGISTER_CLOCK("mxc_pwm.0", NULL, pwm1_clk)
> _REGISTER_CLOCK("mxc_pwm.1", NULL, pwm2_clk)
> _REGISTER_CLOCK("mxc_pwm.2", NULL, pwm3_clk)
> diff --git a/arch/arm/mach-mx5/clock-mx51-mx53.c b/arch/arm/mach-mx5/clock-mx51-mx53.c
> index e00c427..31d904c 100644
> --- a/arch/arm/mach-mx5/clock-mx51-mx53.c
> +++ b/arch/arm/mach-mx5/clock-mx51-mx53.c
> @@ -1453,7 +1453,8 @@ static struct clk_lookup mx51_lookups[] = {
> _REGISTER_CLOCK(NULL, "gpt_32k", gpt_32k_clk)
> _REGISTER_CLOCK("imx51-ecspi.0", NULL, ecspi1_clk)
> _REGISTER_CLOCK("imx51-ecspi.1", NULL, ecspi2_clk)
> - _REGISTER_CLOCK("imx51-cspi.0", NULL, cspi_clk)
> + /* i.mx51 has the i.mx35 type cspi */
> + _REGISTER_CLOCK("imx35-cspi.0", NULL, cspi_clk)
> _REGISTER_CLOCK("sdhci-esdhc-imx51.0", NULL, esdhc1_clk)
> _REGISTER_CLOCK("sdhci-esdhc-imx51.1", NULL, esdhc2_clk)
> _REGISTER_CLOCK("sdhci-esdhc-imx51.2", NULL, esdhc3_clk)
> @@ -1486,9 +1487,11 @@ static struct clk_lookup mx53_lookups[] = {
> _REGISTER_CLOCK("sdhci-esdhc-imx53.1", NULL, esdhc2_mx53_clk)
> _REGISTER_CLOCK("sdhci-esdhc-imx53.2", NULL, esdhc3_mx53_clk)
> _REGISTER_CLOCK("sdhci-esdhc-imx53.3", NULL, esdhc4_mx53_clk)
> - _REGISTER_CLOCK("imx53-ecspi.0", NULL, ecspi1_clk)
> - _REGISTER_CLOCK("imx53-ecspi.1", NULL, ecspi2_clk)
> - _REGISTER_CLOCK("imx53-cspi.0", NULL, cspi_clk)
> + /* i.mx53 has the i.mx51 type ecspi */
> + _REGISTER_CLOCK("imx51-ecspi.0", NULL, ecspi1_clk)
> + _REGISTER_CLOCK("imx51-ecspi.1", NULL, ecspi2_clk)
> + /* i.mx53 has the i.mx35 type cspi */
> + _REGISTER_CLOCK("imx35-cspi.0", NULL, cspi_clk)
> _REGISTER_CLOCK("imx2-wdt.0", NULL, dummy_clk)
> _REGISTER_CLOCK("imx2-wdt.1", NULL, dummy_clk)
> _REGISTER_CLOCK("imx-sdma", NULL, sdma_clk)
> diff --git a/arch/arm/plat-mxc/devices/platform-spi_imx.c b/arch/arm/plat-mxc/devices/platform-spi_imx.c
> index f97eb36..9bfae8b 100644
> --- a/arch/arm/plat-mxc/devices/platform-spi_imx.c
> +++ b/arch/arm/plat-mxc/devices/platform-spi_imx.c
> @@ -40,9 +40,10 @@ const struct imx_spi_imx_data imx21_cspi_data[] __initconst = {
> #endif
>
> #ifdef CONFIG_SOC_IMX25
> +/* i.mx25 has the i.mx35 type cspi */
> const struct imx_spi_imx_data imx25_cspi_data[] __initconst = {
> #define imx25_cspi_data_entry(_id, _hwid) \
> - imx_spi_imx_data_entry(MX25, CSPI, "imx25-cspi", _id, _hwid, SZ_16K)
> + imx_spi_imx_data_entry(MX25, CSPI, "imx35-cspi", _id, _hwid, SZ_16K)
> imx25_cspi_data_entry(0, 1),
> imx25_cspi_data_entry(1, 2),
> imx25_cspi_data_entry(2, 3),
> @@ -79,8 +80,9 @@ const struct imx_spi_imx_data imx35_cspi_data[] __initconst = {
> #endif /* ifdef CONFIG_SOC_IMX35 */
>
> #ifdef CONFIG_SOC_IMX51
> +/* i.mx51 has the i.mx35 type cspi */
> const struct imx_spi_imx_data imx51_cspi_data __initconst =
> - imx_spi_imx_data_entry_single(MX51, CSPI, "imx51-cspi", 2, , SZ_4K);
> + imx_spi_imx_data_entry_single(MX51, CSPI, "imx35-cspi", 2, , SZ_4K);
>
> const struct imx_spi_imx_data imx51_ecspi_data[] __initconst = {
> #define imx51_ecspi_data_entry(_id, _hwid) \
> @@ -91,12 +93,14 @@ const struct imx_spi_imx_data imx51_ecspi_data[] __initconst = {
> #endif /* ifdef CONFIG_SOC_IMX51 */
>
> #ifdef CONFIG_SOC_IMX53
> +/* i.mx53 has the i.mx35 type cspi */
> const struct imx_spi_imx_data imx53_cspi_data __initconst =
> - imx_spi_imx_data_entry_single(MX53, CSPI, "imx53-cspi", 0, , SZ_4K);
> + imx_spi_imx_data_entry_single(MX53, CSPI, "imx35-cspi", 0, , SZ_4K);
>
> +/* i.mx53 has the i.mx51 type ecspi */
> const struct imx_spi_imx_data imx53_ecspi_data[] __initconst = {
> #define imx53_ecspi_data_entry(_id, _hwid) \
> - imx_spi_imx_data_entry(MX53, ECSPI, "imx53-ecspi", _id, _hwid, SZ_4K)
> + imx_spi_imx_data_entry(MX53, ECSPI, "imx51-ecspi", _id, _hwid, SZ_4K)
> imx53_ecspi_data_entry(0, 1),
> imx53_ecspi_data_entry(1, 2),
> };
> diff --git a/drivers/spi/Kconfig b/drivers/spi/Kconfig
> index c327cf3..52e2900 100644
> --- a/drivers/spi/Kconfig
> +++ b/drivers/spi/Kconfig
> @@ -154,18 +154,6 @@ config SPI_GPIO
> GPIO operations, you should be able to leverage that for better
> speed with a custom version of this driver; see the source code.
>
> -config SPI_IMX_VER_IMX1
> - def_bool y if SOC_IMX1
> -
> -config SPI_IMX_VER_0_0
> - def_bool y if SOC_IMX21 || SOC_IMX27
> -
> -config SPI_IMX_VER_0_4
> - def_bool y if ARCH_MX25 || SOC_IMX31 || SOC_IMX35 || SOC_IMX51 || SOC_IMX53
> -
> -config SPI_IMX_VER_2_3
> - def_bool y if SOC_IMX51 || SOC_IMX53
> -
> config SPI_IMX
> tristate "Freescale i.MX SPI controllers"
> depends on ARCH_MXC
> diff --git a/drivers/spi/spi-imx.c b/drivers/spi/spi-imx.c
> index b282351..2ed9c32 100644
> --- a/drivers/spi/spi-imx.c
> +++ b/drivers/spi/spi-imx.c
> @@ -57,10 +57,12 @@ struct spi_imx_config {
> };
>
> enum spi_imx_devtype {
> - SPI_IMX_VER_IMX1,
> - SPI_IMX_VER_0_0,
> - SPI_IMX_VER_0_4,
> - SPI_IMX_VER_2_3,
> + IMX1_CSPI,
> + IMX21_CSPI,
> + IMX27_CSPI,
> + IMX31_CSPI,
> + IMX35_CSPI, /* CSPI on all i.mx except above */
> + IMX51_ECSPI, /* ECSPI on i.mx51 and later */
> };
>
> struct spi_imx_data;
> @@ -71,7 +73,7 @@ struct spi_imx_devtype_data {
> void (*trigger)(struct spi_imx_data *);
> int (*rx_available)(struct spi_imx_data *);
> void (*reset)(struct spi_imx_data *);
> - unsigned int fifosize;
> + enum spi_imx_devtype devtype;
> };
>
> struct spi_imx_data {
> @@ -94,6 +96,21 @@ struct spi_imx_data {
> struct spi_imx_devtype_data *devtype_data;
> };
>
> +static inline int is_imx27_cspi(struct spi_imx_data *d)
> +{
> + return d->devtype_data->devtype == IMX27_CSPI;
> +}
> +
> +static inline int is_imx35_cspi(struct spi_imx_data *d)
> +{
> + return d->devtype_data->devtype == IMX35_CSPI;
> +}
> +
> +static inline unsigned spi_imx_get_fifosize(struct spi_imx_data *d)
> +{
> + return (d->devtype_data->devtype == IMX51_ECSPI) ? 64 : 8;
> +}
> +
> #define MXC_SPI_BUF_RX(type) \
> static void spi_imx_buf_rx_##type(struct spi_imx_data *spi_imx) \
> { \
> @@ -135,14 +152,9 @@ static int mxc_clkdivs[] = {0, 3, 4, 6, 8, 12, 16, 24, 32, 48, 64, 96, 128, 192,
>
> /* MX21, MX27 */
> static unsigned int spi_imx_clkdiv_1(unsigned int fin,
> - unsigned int fspi)
> + unsigned int fspi, unsigned int max)
> {
> - int i, max;
> -
> - if (cpu_is_mx21())
> - max = 18;
> - else
> - max = 16;
> + int i;
>
> for (i = 2; i < max; i++)
> if (fspi * mxc_clkdivs[i] >= fin)
> @@ -348,7 +360,7 @@ static int __maybe_unused mx31_config(struct spi_imx_data *spi_imx,
> reg |= spi_imx_clkdiv_2(spi_imx->spi_clk, config->speed_hz) <<
> MX31_CSPICTRL_DR_SHIFT;
>
> - if (cpu_is_mx35()) {
> + if (is_imx35_cspi(spi_imx)) {
> reg |= (config->bpw - 1) << MX35_CSPICTRL_BL_SHIFT;
> reg |= MX31_CSPICTRL_SSCTL;
> } else {
> @@ -363,8 +375,8 @@ static int __maybe_unused mx31_config(struct spi_imx_data *spi_imx,
> reg |= MX31_CSPICTRL_SSPOL;
> if (cs < 0)
> reg |= (cs + 32) <<
> - (cpu_is_mx35() ? MX35_CSPICTRL_CS_SHIFT :
> - MX31_CSPICTRL_CS_SHIFT);
> + (is_imx35_cspi(spi_imx) ? MX35_CSPICTRL_CS_SHIFT :
> + MX31_CSPICTRL_CS_SHIFT);
>
> writel(reg, spi_imx->base + MXC_CSPICTRL);
>
> @@ -423,8 +435,9 @@ static int __maybe_unused mx21_config(struct spi_imx_data *spi_imx,
> {
> unsigned int reg = MX21_CSPICTRL_ENABLE | MX21_CSPICTRL_MASTER;
> int cs = spi_imx->chipselect[config->cs];
> + unsigned int max = is_imx27_cspi(spi_imx) ? 16 : 18;
>
> - reg |= spi_imx_clkdiv_1(spi_imx->spi_clk, config->speed_hz) <<
> + reg |= spi_imx_clkdiv_1(spi_imx->spi_clk, config->speed_hz, max) <<
> MX21_CSPICTRL_DR_SHIFT;
> reg |= config->bpw - 1;
>
> @@ -513,51 +526,84 @@ static void __maybe_unused mx1_reset(struct spi_imx_data *spi_imx)
> writel(1, spi_imx->base + MXC_RESET);
> }
>
> -/*
> - * These version numbers are taken from the Freescale driver. Unfortunately it
> - * doesn't support i.MX1, so this entry doesn't match the scheme. :-(
> - */
> -static struct spi_imx_devtype_data spi_imx_devtype_data[] = {
> -#ifdef CONFIG_SPI_IMX_VER_IMX1
> - [SPI_IMX_VER_IMX1] = {
> - .intctrl = mx1_intctrl,
> - .config = mx1_config,
> - .trigger = mx1_trigger,
> - .rx_available = mx1_rx_available,
> - .reset = mx1_reset,
> - .fifosize = 8,
> - },
> -#endif
> -#ifdef CONFIG_SPI_IMX_VER_0_0
> - [SPI_IMX_VER_0_0] = {
> - .intctrl = mx21_intctrl,
> - .config = mx21_config,
> - .trigger = mx21_trigger,
> - .rx_available = mx21_rx_available,
> - .reset = mx21_reset,
> - .fifosize = 8,
> - },
> -#endif
> -#ifdef CONFIG_SPI_IMX_VER_0_4
> - [SPI_IMX_VER_0_4] = {
> - .intctrl = mx31_intctrl,
> - .config = mx31_config,
> - .trigger = mx31_trigger,
> - .rx_available = mx31_rx_available,
> - .reset = mx31_reset,
> - .fifosize = 8,
> - },
> -#endif
> -#ifdef CONFIG_SPI_IMX_VER_2_3
> - [SPI_IMX_VER_2_3] = {
> - .intctrl = mx51_ecspi_intctrl,
> - .config = mx51_ecspi_config,
> - .trigger = mx51_ecspi_trigger,
> - .rx_available = mx51_ecspi_rx_available,
> - .reset = mx51_ecspi_reset,
> - .fifosize = 64,
> - },
> -#endif
> +static struct spi_imx_devtype_data imx1_cspi_devtype_data = {
> + .intctrl = mx1_intctrl,
> + .config = mx1_config,
> + .trigger = mx1_trigger,
> + .rx_available = mx1_rx_available,
> + .reset = mx1_reset,
> + .devtype = IMX1_CSPI,
> +};
> +
> +static struct spi_imx_devtype_data imx21_cspi_devtype_data = {
> + .intctrl = mx21_intctrl,
> + .config = mx21_config,
> + .trigger = mx21_trigger,
> + .rx_available = mx21_rx_available,
> + .reset = mx21_reset,
> + .devtype = IMX21_CSPI,
> +};
> +
> +static struct spi_imx_devtype_data imx27_cspi_devtype_data = {
> + /* i.mx27 cspi shares the functions with i.mx21 one */
> + .intctrl = mx21_intctrl,
> + .config = mx21_config,
> + .trigger = mx21_trigger,
> + .rx_available = mx21_rx_available,
> + .reset = mx21_reset,
> + .devtype = IMX27_CSPI,
> +};
> +
> +static struct spi_imx_devtype_data imx31_cspi_devtype_data = {
> + .intctrl = mx31_intctrl,
> + .config = mx31_config,
> + .trigger = mx31_trigger,
> + .rx_available = mx31_rx_available,
> + .reset = mx31_reset,
> + .devtype = IMX31_CSPI,
> +};
> +
> +static struct spi_imx_devtype_data imx35_cspi_devtype_data = {
> + /* i.mx35 and later cspi shares the functions with i.mx31 one */
> + .intctrl = mx31_intctrl,
> + .config = mx31_config,
> + .trigger = mx31_trigger,
> + .rx_available = mx31_rx_available,
> + .reset = mx31_reset,
> + .devtype = IMX35_CSPI,
> +};
> +
> +static struct spi_imx_devtype_data imx51_ecspi_devtype_data = {
> + .intctrl = mx51_ecspi_intctrl,
> + .config = mx51_ecspi_config,
> + .trigger = mx51_ecspi_trigger,
> + .rx_available = mx51_ecspi_rx_available,
> + .reset = mx51_ecspi_reset,
> + .devtype = IMX51_ECSPI,
> +};
> +
> +static struct platform_device_id spi_imx_devtype[] = {
> + {
> + .name = "imx1-cspi",
> + .driver_data = (kernel_ulong_t) &imx1_cspi_devtype_data,
> + }, {
> + .name = "imx21-cspi",
> + .driver_data = (kernel_ulong_t) &imx21_cspi_devtype_data,
> + }, {
> + .name = "imx27-cspi",
> + .driver_data = (kernel_ulong_t) &imx27_cspi_devtype_data,
> + }, {
> + .name = "imx31-cspi",
> + .driver_data = (kernel_ulong_t) &imx31_cspi_devtype_data,
> + }, {
> + .name = "imx35-cspi",
> + .driver_data = (kernel_ulong_t) &imx35_cspi_devtype_data,
> + }, {
> + .name = "imx51-ecspi",
> + .driver_data = (kernel_ulong_t) &imx51_ecspi_devtype_data,
> + }, {
> + /* sentinel */
> + }
> };
>
> static void spi_imx_chipselect(struct spi_device *spi, int is_active)
> @@ -575,7 +621,7 @@ static void spi_imx_chipselect(struct spi_device *spi, int is_active)
>
> static void spi_imx_push(struct spi_imx_data *spi_imx)
> {
> - while (spi_imx->txfifo < spi_imx->devtype_data->fifosize) {
> + while (spi_imx->txfifo < spi_imx_get_fifosize(spi_imx)) {
> if (!spi_imx->count)
> break;
> spi_imx->tx(spi_imx);
> @@ -691,42 +737,6 @@ static void spi_imx_cleanup(struct spi_device *spi)
> {
> }
>
> -static struct platform_device_id spi_imx_devtype[] = {
> - {
> - .name = "imx1-cspi",
> - .driver_data = SPI_IMX_VER_IMX1,
> - }, {
> - .name = "imx21-cspi",
> - .driver_data = SPI_IMX_VER_0_0,
> - }, {
> - .name = "imx25-cspi",
> - .driver_data = SPI_IMX_VER_0_4,
> - }, {
> - .name = "imx27-cspi",
> - .driver_data = SPI_IMX_VER_0_0,
> - }, {
> - .name = "imx31-cspi",
> - .driver_data = SPI_IMX_VER_0_4,
> - }, {
> - .name = "imx35-cspi",
> - .driver_data = SPI_IMX_VER_0_4,
> - }, {
> - .name = "imx51-cspi",
> - .driver_data = SPI_IMX_VER_0_4,
> - }, {
> - .name = "imx51-ecspi",
> - .driver_data = SPI_IMX_VER_2_3,
> - }, {
> - .name = "imx53-cspi",
> - .driver_data = SPI_IMX_VER_0_4,
> - }, {
> - .name = "imx53-ecspi",
> - .driver_data = SPI_IMX_VER_2_3,
> - }, {
> - /* sentinel */
> - }
> -};
> -
> static int __devinit spi_imx_probe(struct platform_device *pdev)
> {
> struct spi_imx_master *mxc_platform_info;
> @@ -779,7 +789,7 @@ static int __devinit spi_imx_probe(struct platform_device *pdev)
> init_completion(&spi_imx->xfer_done);
>
> spi_imx->devtype_data =
> - &spi_imx_devtype_data[pdev->id_entry->driver_data];
> + (struct spi_imx_devtype_data *) pdev->id_entry->driver_data;
>
> res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> if (!res) {
> --
> 1.7.4.1
>
More information about the devicetree-discuss
mailing list