[U-Boot] [PATCH v3 6/6] spi: kirkwood: Full dm conversion

kirkwood now support dt along with platform data, respective boards need to switch into dm for the same.
Signed-off-by: Jagan Teki jagan@amarulasolutions.com --- Changes for v3: - rebased master - Move kconfig option if DM_SPI
drivers/spi/Kconfig | 12 +- drivers/spi/kirkwood_spi.c | 240 ++++++-------------------------- include/dm/platform_data/spi_kirkwood.h | 15 ++ 3 files changed, 62 insertions(+), 205 deletions(-) create mode 100644 include/dm/platform_data/spi_kirkwood.h
diff --git a/drivers/spi/Kconfig b/drivers/spi/Kconfig index 73dd33f716..64567cf6e9 100644 --- a/drivers/spi/Kconfig +++ b/drivers/spi/Kconfig @@ -105,6 +105,12 @@ config ICH_SPI access the SPI NOR flash on platforms embedding this Intel ICH IP core.
+config KIRKWOOD_SPI + bool "Marvell Kirkwood SPI Driver" + help + Enable support for SPI on various Marvell SoCs, such as + Kirkwood and Armada 375. + config MPC8XXX_SPI bool "MPC8XXX SPI Driver" help @@ -283,12 +289,6 @@ config SH_QSPI Enable the Renesas Quad SPI controller driver. This driver can be used on Renesas SoCs.
-config KIRKWOOD_SPI - bool "Marvell Kirkwood SPI Driver" - help - Enable support for SPI on various Marvell SoCs, such as - Kirkwood and Armada 375. - config LPC32XX_SSP bool "LPC32XX SPI Driver" help diff --git a/drivers/spi/kirkwood_spi.c b/drivers/spi/kirkwood_spi.c index 4850a2b955..3b65b9221b 100644 --- a/drivers/spi/kirkwood_spi.c +++ b/drivers/spi/kirkwood_spi.c @@ -14,31 +14,41 @@ #include <spi.h> #include <asm/io.h> #include <asm/arch/soc.h> -#ifdef CONFIG_KIRKWOOD -#include <asm/arch/mpp.h> -#endif #include <asm/arch-mvebu/spi.h>
-static void _spi_cs_activate(struct kwspi_registers *reg) +#include <dm/platform_data/spi_kirkwood.h> + +struct mvebu_spi_dev { + bool is_errata_50mhz_ac; +}; + +struct mvebu_spi_priv { + struct kwspi_registers *spireg; +}; + +static void spi_cs_activate(struct kwspi_registers *reg) { setbits_le32(®->ctrl, KWSPI_CSN_ACT); }
-static void _spi_cs_deactivate(struct kwspi_registers *reg) +static void spi_cs_deactivate(struct kwspi_registers *reg) { clrbits_le32(®->ctrl, KWSPI_CSN_ACT); }
-static int _spi_xfer(struct kwspi_registers *reg, unsigned int bitlen, - const void *dout, void *din, unsigned long flags) +static int mvebu_spi_xfer(struct udevice *dev, unsigned int bitlen, + const void *dout, void *din, unsigned long flags) { + struct udevice *bus = dev->parent; + struct mvebu_spi_platdata *plat = dev_get_platdata(bus); + struct kwspi_registers *reg = plat->spireg; unsigned int tmpdout, tmpdin; int tm, isread = 0;
- debug("spi_xfer: dout %p din %p bitlen %u\n", dout, din, bitlen); + debug("%s: dout %p din %p bitlen %u\n", __func__, dout, din, bitlen);
if (flags & SPI_XFER_BEGIN) - _spi_cs_activate(reg); + spi_cs_activate(reg);
/* * handle data in 8-bit chunks @@ -56,8 +66,8 @@ static int _spi_xfer(struct kwspi_registers *reg, unsigned int bitlen,
clrbits_le32(®->irq_cause, KWSPI_SMEMRDIRQ); writel(tmpdout, ®->dout); /* Write the data out */ - debug("*** spi_xfer: ... %08x written, bitlen %d\n", - tmpdout, bitlen); + debug("%s: ... %08x written, bitlen %d\n", + __func__, tmpdout, bitlen);
/* * Wait for SPI transmit to get out @@ -68,8 +78,8 @@ static int _spi_xfer(struct kwspi_registers *reg, unsigned int bitlen, if (readl(®->irq_cause) & KWSPI_SMEMRDIRQ) { isread = 1; tmpdin = readl(®->din); - debug("spi_xfer: din %p..%08x read\n", - din, tmpdin); + debug("%s: din %p..%08x read\n", + __func__, din, tmpdin);
if (din) { *((u8 *)din) = (u8)tmpdin; @@ -83,179 +93,17 @@ static int _spi_xfer(struct kwspi_registers *reg, unsigned int bitlen, break; } if (tm >= KWSPI_TIMEOUT) - printf("*** spi_xfer: Time out during SPI transfer\n"); + printf("%s: Time out during SPI transfer\n", __func__);
debug("loopend bitlen %d\n", bitlen); }
if (flags & SPI_XFER_END) - _spi_cs_deactivate(reg); + spi_cs_deactivate(reg);
return 0; }
-#ifndef CONFIG_DM_SPI - -static struct kwspi_registers *spireg = - (struct kwspi_registers *)MVEBU_SPI_BASE; - -#ifdef CONFIG_KIRKWOOD -static u32 cs_spi_mpp_back[2]; -#endif - -struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs, - unsigned int max_hz, unsigned int mode) -{ - struct spi_slave *slave; - u32 data; -#ifdef CONFIG_KIRKWOOD - static const u32 kwspi_mpp_config[2][2] = { - { MPP0_SPI_SCn, 0 }, /* if cs == 0 */ - { MPP7_SPI_SCn, 0 } /* if cs != 0 */ - }; -#endif - - if (!spi_cs_is_valid(bus, cs)) - return NULL; - - slave = spi_alloc_slave_base(bus, cs); - if (!slave) - return NULL; - - writel(KWSPI_SMEMRDY, &spireg->ctrl); - - /* calculate spi clock prescaller using max_hz */ - data = ((CONFIG_SYS_TCLK / 2) / max_hz) + 0x10; - data = data < KWSPI_CLKPRESCL_MIN ? KWSPI_CLKPRESCL_MIN : data; - data = data > KWSPI_CLKPRESCL_MASK ? KWSPI_CLKPRESCL_MASK : data; - - /* program spi clock prescaller using max_hz */ - writel(KWSPI_ADRLEN_3BYTE | data, &spireg->cfg); - debug("data = 0x%08x\n", data); - - writel(KWSPI_SMEMRDIRQ, &spireg->irq_cause); - writel(KWSPI_IRQMASK, &spireg->irq_mask); - -#ifdef CONFIG_KIRKWOOD - /* program mpp registers to select SPI_CSn */ - kirkwood_mpp_conf(kwspi_mpp_config[cs ? 1 : 0], cs_spi_mpp_back); -#endif - - return slave; -} - -void spi_free_slave(struct spi_slave *slave) -{ -#ifdef CONFIG_KIRKWOOD - kirkwood_mpp_conf(cs_spi_mpp_back, NULL); -#endif - free(slave); -} - -#if defined(CONFIG_SYS_KW_SPI_MPP) -u32 spi_mpp_backup[4]; -#endif - -__attribute__((weak)) int board_spi_claim_bus(struct spi_slave *slave) -{ - return 0; -} - -int spi_claim_bus(struct spi_slave *slave) -{ -#if defined(CONFIG_SYS_KW_SPI_MPP) - u32 config; - u32 spi_mpp_config[4]; - - config = CONFIG_SYS_KW_SPI_MPP; - - if (config & MOSI_MPP6) - spi_mpp_config[0] = MPP6_SPI_MOSI; - else - spi_mpp_config[0] = MPP1_SPI_MOSI; - - if (config & SCK_MPP10) - spi_mpp_config[1] = MPP10_SPI_SCK; - else - spi_mpp_config[1] = MPP2_SPI_SCK; - - if (config & MISO_MPP11) - spi_mpp_config[2] = MPP11_SPI_MISO; - else - spi_mpp_config[2] = MPP3_SPI_MISO; - - spi_mpp_config[3] = 0; - spi_mpp_backup[3] = 0; - - /* set new spi mpp and save current mpp config */ - kirkwood_mpp_conf(spi_mpp_config, spi_mpp_backup); -#endif - - return board_spi_claim_bus(slave); -} - -__attribute__((weak)) void board_spi_release_bus(struct spi_slave *slave) -{ -} - -void spi_release_bus(struct spi_slave *slave) -{ -#if defined(CONFIG_SYS_KW_SPI_MPP) - kirkwood_mpp_conf(spi_mpp_backup, NULL); -#endif - - board_spi_release_bus(slave); -} - -#ifndef CONFIG_SPI_CS_IS_VALID -/* - * you can define this function board specific - * define above CONFIG in board specific config file and - * provide the function in board specific src file - */ -int spi_cs_is_valid(unsigned int bus, unsigned int cs) -{ - return bus == 0 && (cs == 0 || cs == 1); -} -#endif - -void spi_init(void) -{ -} - -void spi_cs_activate(struct spi_slave *slave) -{ - _spi_cs_activate(spireg); -} - -void spi_cs_deactivate(struct spi_slave *slave) -{ - _spi_cs_deactivate(spireg); -} - -int spi_xfer(struct spi_slave *slave, unsigned int bitlen, - const void *dout, void *din, unsigned long flags) -{ - return _spi_xfer(spireg, bitlen, dout, din, flags); -} - -#else - -/* Here now the DM part */ - -struct mvebu_spi_dev { - bool is_errata_50mhz_ac; -}; - -struct mvebu_spi_platdata { - struct kwspi_registers *spireg; - bool is_errata_50mhz_ac; -}; - -struct mvebu_spi_priv { - struct kwspi_registers *spireg; -}; - static int mvebu_spi_set_speed(struct udevice *bus, uint hz) { struct mvebu_spi_platdata *plat = dev_get_platdata(bus); @@ -330,15 +178,6 @@ static int mvebu_spi_set_mode(struct udevice *bus, uint mode) return 0; }
-static int mvebu_spi_xfer(struct udevice *dev, unsigned int bitlen, - const void *dout, void *din, unsigned long flags) -{ - struct udevice *bus = dev->parent; - struct mvebu_spi_platdata *plat = dev_get_platdata(bus); - - return _spi_xfer(plat->spireg, bitlen, dout, din, flags); -} - static int mvebu_spi_claim_bus(struct udevice *dev) { struct udevice *bus = dev->parent; @@ -352,6 +191,17 @@ static int mvebu_spi_claim_bus(struct udevice *dev) return 0; }
+static const struct dm_spi_ops mvebu_spi_ops = { + .claim_bus = mvebu_spi_claim_bus, + .xfer = mvebu_spi_xfer, + .set_speed = mvebu_spi_set_speed, + .set_mode = mvebu_spi_set_mode, + /* + * cs_info is not needed, since we require all chip selects to be + * in the device tree explicitly + */ +}; + static int mvebu_spi_probe(struct udevice *bus) { struct mvebu_spi_platdata *plat = dev_get_platdata(bus); @@ -364,6 +214,7 @@ static int mvebu_spi_probe(struct udevice *bus) return 0; }
+#if CONFIG_IS_ENABLED(OF_CONTROL) static int mvebu_spi_ofdata_to_platdata(struct udevice *bus) { struct mvebu_spi_platdata *plat = dev_get_platdata(bus); @@ -376,17 +227,6 @@ static int mvebu_spi_ofdata_to_platdata(struct udevice *bus) return 0; }
-static const struct dm_spi_ops mvebu_spi_ops = { - .claim_bus = mvebu_spi_claim_bus, - .xfer = mvebu_spi_xfer, - .set_speed = mvebu_spi_set_speed, - .set_mode = mvebu_spi_set_mode, - /* - * cs_info is not needed, since we require all chip selects to be - * in the device tree explicitly - */ -}; - static const struct mvebu_spi_dev armada_xp_spi_dev_data = { .is_errata_50mhz_ac = false, }; @@ -414,15 +254,17 @@ static const struct udevice_id mvebu_spi_ids[] = { }, { } }; +#endif
U_BOOT_DRIVER(mvebu_spi) = { .name = "mvebu_spi", .id = UCLASS_SPI, +#if CONFIG_IS_ENABLED(OF_CONTROL) .of_match = mvebu_spi_ids, - .ops = &mvebu_spi_ops, .ofdata_to_platdata = mvebu_spi_ofdata_to_platdata, .platdata_auto_alloc_size = sizeof(struct mvebu_spi_platdata), +#endif + .ops = &mvebu_spi_ops, .priv_auto_alloc_size = sizeof(struct mvebu_spi_priv), .probe = mvebu_spi_probe, }; -#endif diff --git a/include/dm/platform_data/spi_kirkwood.h b/include/dm/platform_data/spi_kirkwood.h new file mode 100644 index 0000000000..ae9b2783a9 --- /dev/null +++ b/include/dm/platform_data/spi_kirkwood.h @@ -0,0 +1,15 @@ +/* + * Copyright (C) 2018 Jagan Teki jagan@amarulasolutions.com + * + * SPDX-License-Identifier: GPL-2.0+ + */ + +#ifndef __spi_kirkwood_h +#define __spi_kirkwood_h + +struct mvebu_spi_platdata { + struct kwspi_registers *spireg; + bool is_errata_50mhz_ac; +}; + +#endif /* __spi_kirkwood_h */

On Mon, May 7, 2018 at 2:40 PM Jagan Teki jagan@amarulasolutions.com wrote:
kirkwood now support dt along with platform data, respective boards need to switch into dm for the same.
Signed-off-by: Jagan Teki jagan@amarulasolutions.com
Changes for v3:
- rebased master
- Move kconfig option if DM_SPI
drivers/spi/Kconfig | 12 +- drivers/spi/kirkwood_spi.c | 240 ++++++-------------------------- include/dm/platform_data/spi_kirkwood.h | 15 ++ 3 files changed, 62 insertions(+), 205 deletions(-) create mode 100644 include/dm/platform_data/spi_kirkwood.h
Any update from the board maintainers about this changes, I would like to push this sooner as possible.

Am 2018-11-05 10:58, schrieb Jagan Teki:
On Mon, May 7, 2018 at 2:40 PM Jagan Teki jagan@amarulasolutions.com wrote:
kirkwood now support dt along with platform data, respective boards need to switch into dm for the same.
Signed-off-by: Jagan Teki jagan@amarulasolutions.com
Changes for v3:
- rebased master
- Move kconfig option if DM_SPI
drivers/spi/Kconfig | 12 +- drivers/spi/kirkwood_spi.c | 240 ++++++-------------------------- include/dm/platform_data/spi_kirkwood.h | 15 ++ 3 files changed, 62 insertions(+), 205 deletions(-) create mode 100644 include/dm/platform_data/spi_kirkwood.h
Any update from the board maintainers about this changes, I would like to push this sooner as possible.
Hi,
oh isn't this merged yet? Because my change [1] which depends on that made it already into the main tree [2].
[1] http://git.denx.de/?p=u-boot.git;a=commit;h=134a6b6884c1faa893256ac5b02a301d... [2] https://patchwork.ozlabs.org/patch/922392/
-michael

On Thu, Nov 15, 2018 at 1:19 PM Michael Walle michael@walle.cc wrote:
Am 2018-11-05 10:58, schrieb Jagan Teki:
On Mon, May 7, 2018 at 2:40 PM Jagan Teki jagan@amarulasolutions.com wrote:
kirkwood now support dt along with platform data, respective boards need to switch into dm for the same.
Signed-off-by: Jagan Teki jagan@amarulasolutions.com
Changes for v3:
- rebased master
- Move kconfig option if DM_SPI
drivers/spi/Kconfig | 12 +- drivers/spi/kirkwood_spi.c | 240 ++++++-------------------------- include/dm/platform_data/spi_kirkwood.h | 15 ++ 3 files changed, 62 insertions(+), 205 deletions(-) create mode 100644 include/dm/platform_data/spi_kirkwood.h
Any update from the board maintainers about this changes, I would like to push this sooner as possible.
Hi,
oh isn't this merged yet? Because my change [1] which depends on that made it already into the main tree [2].
There are many boards need to move DM_SPI [3], anyway I'm going to remove this driver.
[3] https://travis-ci.org/openedev/u-boot-amarula/builds/457097203
participants (2)
-
Jagan Teki
-
Michael Walle