diff mbox series

[U-Boot,2/2] spi: kirkwood: Full dm conversion

Message ID 20180315113323.32056-2-jagan@amarulasolutions.com
State Changes Requested
Delegated to: Jagannadha Sutradharudu Teki
Headers show
Series [U-Boot,1/2] spi: kirkwood: Get drvdata in .ofdata_to_platdata | expand

Commit Message

Jagan Teki March 15, 2018, 11:33 a.m. UTC
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>
---
 drivers/spi/kirkwood_spi.c              | 240 ++++++--------------------------
 include/dm/platform_data/spi_kirkwood.h |  15 ++
 2 files changed, 56 insertions(+), 199 deletions(-)
 create mode 100644 include/dm/platform_data/spi_kirkwood.h

Comments

Stefan Roese March 20, 2018, 1:49 p.m. UTC | #1
Hi Jagan,

On 15.03.2018 12:33, Jagan Teki 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>
> ---
>   drivers/spi/kirkwood_spi.c              | 240 ++++++--------------------------
>   include/dm/platform_data/spi_kirkwood.h |  15 ++
>   2 files changed, 56 insertions(+), 199 deletions(-)
>   create mode 100644 include/dm/platform_data/spi_kirkwood.h
> 
> diff --git a/drivers/spi/kirkwood_spi.c b/drivers/spi/kirkwood_spi.c
> index 4850a2b955..16d41de2a6 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(&reg->ctrl, KWSPI_CSN_ACT);
>   }
>   
> -static void _spi_cs_deactivate(struct kwspi_registers *reg)
> +static void spi_cs_deactivate(struct kwspi_registers *reg)
>   {
>   	clrbits_le32(&reg->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(&reg->irq_cause, KWSPI_SMEMRDIRQ);
>   		writel(tmpdout, &reg->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(&reg->irq_cause) & KWSPI_SMEMRDIRQ) {
>   				isread = 1;
>   				tmpdin = readl(&reg->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;
> @@ -364,6 +203,18 @@ static int mvebu_spi_probe(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
> +	 */
> +};
> +
> +#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 */
> 

So you are removing non-DM support from the SPI driver, which breaks
current Kirkwood board using this SPI driver (e.g. inetspace_v2).
Are you aware of this breakage?

Thanks,
Stefan
Jagan Teki March 20, 2018, 3:06 p.m. UTC | #2
On Tue, Mar 20, 2018 at 7:19 PM, Stefan Roese <sr@denx.de> wrote:
> Hi Jagan,
>
>
> On 15.03.2018 12:33, Jagan Teki 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>
>> ---
>>   drivers/spi/kirkwood_spi.c              | 240
>> ++++++--------------------------
>>   include/dm/platform_data/spi_kirkwood.h |  15 ++
>>   2 files changed, 56 insertions(+), 199 deletions(-)
>>   create mode 100644 include/dm/platform_data/spi_kirkwood.h

snip

>> +
>> +struct mvebu_spi_platdata {
>> +       struct kwspi_registers *spireg;
>> +       bool is_errata_50mhz_ac;
>> +};
>> +
>> +#endif /* __spi_kirkwood_h */
>>
>
> So you are removing non-DM support from the SPI driver, which breaks
> current Kirkwood board using this SPI driver (e.g. inetspace_v2).
> Are you aware of this breakage?

Yes, we have migration plan for DM_SPI and DM_SPI_FLASH [1] I have
converted this to expect the board MAINTAINERS do switch DM before the
deadline. I will not apply until all used boards moved or deadline
expire.

[1] doc/driver-model/MIGRATION.txt

Jagan.
Stefan Roese March 20, 2018, 3:14 p.m. UTC | #3
Hi Jagan,

On 20.03.2018 16:06, Jagan Teki wrote:
> On Tue, Mar 20, 2018 at 7:19 PM, Stefan Roese <sr@denx.de> wrote:
>> Hi Jagan,
>>
>>
>> On 15.03.2018 12:33, Jagan Teki 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>
>>> ---
>>>    drivers/spi/kirkwood_spi.c              | 240
>>> ++++++--------------------------
>>>    include/dm/platform_data/spi_kirkwood.h |  15 ++
>>>    2 files changed, 56 insertions(+), 199 deletions(-)
>>>    create mode 100644 include/dm/platform_data/spi_kirkwood.h
> 
> snip
> 
>>> +
>>> +struct mvebu_spi_platdata {
>>> +       struct kwspi_registers *spireg;
>>> +       bool is_errata_50mhz_ac;
>>> +};
>>> +
>>> +#endif /* __spi_kirkwood_h */
>>>
>>
>> So you are removing non-DM support from the SPI driver, which breaks
>> current Kirkwood board using this SPI driver (e.g. inetspace_v2).
>> Are you aware of this breakage?
> 
> Yes, we have migration plan for DM_SPI and DM_SPI_FLASH [1] I have
> converted this to expect the board MAINTAINERS do switch DM before the
> deadline. I will not apply until all used boards moved or deadline
> expire.

Then please Cc the board maintainers of these boards that will break
here, so that they are aware (again) of this migration and can possibly
take some action.

Thanks,
Stefan
Jagan Teki April 26, 2018, 6 a.m. UTC | #4
On Thu, Mar 15, 2018 at 5:03 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.

Added all board mainatiner, using this driver on their relevant
boards. So try to switch to DM_SPI(SPI_FLASH) before migration
deadline expires.

Jagan.
Chris Packham April 26, 2018, 10:45 p.m. UTC | #5
Hi Jagan,

On 26/04/18 18:00, Jagan Teki wrote:
> On Thu, Mar 15, 2018 at 5:03 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.
> 
> Added all board mainatiner, using this driver on their relevant
> boards. So try to switch to DM_SPI(SPI_FLASH) before migration
> deadline expires.
> 
> Jagan.

Hopefully I can get to db88f6820-amc next week.

Stefan, did you want me to send a patch for db88f6820-gp at the same 
time since the amc board is derived from it?
Stefan Roese April 27, 2018, 5:44 a.m. UTC | #6
Hi Chris,

On 27.04.2018 00:45, Chris Packham wrote:
> On 26/04/18 18:00, Jagan Teki wrote:
>> On Thu, Mar 15, 2018 at 5:03 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.
>>
>> Added all board mainatiner, using this driver on their relevant
>> boards. So try to switch to DM_SPI(SPI_FLASH) before migration
>> deadline expires.
>>
>> Jagan.
> 
> Hopefully I can get to db88f6820-amc next week.
> 
> Stefan, did you want me to send a patch for db88f6820-gp at the same
> time since the amc board is derived from it?

Sure, that would be helpful.

But I'm a little bit puzzled about this DM conversion for MVEBU
platforms. As all MVEBU targets are already using DM and DM_SPI:

arch/arm/Kconfig:

...
config ARCH_MVEBU
         bool "Marvell MVEBU family (Armada XP/375/38x/3700/7K/8K)"
         select OF_CONTROL
         select OF_SEPARATE
         select DM
         select DM_ETH
         select DM_SERIAL
         select DM_SPI
         select DM_SPI_FLASH

So there should be no need to change something here. Or is something
not working correctly on some of the MVEBU platforms?

What really is missing is the conversion of the older Marvell
platforms, like Kirkwood and Orion. Those are quite ancient and
have no DM / OF / DT support at all (AFAIR). So here is the real
work that needs to be done. Or all those boards might get dropped
soon.

Thanks,
Stefan
Chris Packham April 27, 2018, 8:12 a.m. UTC | #7
On Fri, Apr 27, 2018 at 5:44 PM Stefan Roese <sr@denx.de> wrote:

> Hi Chris,

> On 27.04.2018 00:45, Chris Packham wrote:
> > On 26/04/18 18:00, Jagan Teki wrote:
> >> On Thu, Mar 15, 2018 at 5:03 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.
> >>
> >> Added all board mainatiner, using this driver on their relevant
> >> boards. So try to switch to DM_SPI(SPI_FLASH) before migration
> >> deadline expires.
> >>
> >> Jagan.
> >
> > Hopefully I can get to db88f6820-amc next week.
> >
> > Stefan, did you want me to send a patch for db88f6820-gp at the same
> > time since the amc board is derived from it?

> Sure, that would be helpful.

> But I'm a little bit puzzled about this DM conversion for MVEBU
> platforms. As all MVEBU targets are already using DM and DM_SPI:

> arch/arm/Kconfig:

> ...
> config ARCH_MVEBU
>           bool "Marvell MVEBU family (Armada XP/375/38x/3700/7K/8K)"
>           select OF_CONTROL
>           select OF_SEPARATE
>           select DM
>           select DM_ETH
>           select DM_SERIAL
>           select DM_SPI
>           select DM_SPI_FLASH

> So there should be no need to change something here. Or is something
> not working correctly on some of the MVEBU platforms?

> What really is missing is the conversion of the older Marvell
> platforms, like Kirkwood and Orion. Those are quite ancient and
> have no DM / OF / DT support at all (AFAIR). So here is the real
> work that needs to be done. Or all those boards might get dropped
> soon.

Yeah sure enough

=> dm tree
  Class      Probed  Driver      Name
----------------------------------------
  root       [ + ]   root_drive  root_driver
  simple_bus [ + ]   generic_si  `-- soc
  simple_bus [ + ]   generic_si      `-- internal-regs
  spi        [ + ]   mvebu_spi           |-- spi@10680
  spi_flash  [   ]   spi_flash_          |   `-- spi-flash@0
  i2c        [   ]   i2c_mvtwsi          |-- i2c@11000
  serial     [ + ]   ns16550_se          |-- serial@12000
  eth        [ + ]   mvneta              |-- ethernet@34000
  usb        [   ]   ehci_mvebu          |-- usb@58000
  eth        [ + ]   mvneta              `-- ethernet@70000

So nothing to do for MVEBU.

I do have a passing interest in keeping kirkwood support but lack an
upstream supported platform to use. I'll have to see if I can update one of
our boards to use and upstream bootloader.
Stefan Roese April 27, 2018, 8:16 a.m. UTC | #8
Hi Chris,

On 27.04.2018 10:12, Chris Packham wrote:
> On Fri, Apr 27, 2018 at 5:44 PM Stefan Roese <sr@denx.de> wrote:
>>> Stefan, did you want me to send a patch for db88f6820-gp at the same
>>> time since the amc board is derived from it?
> 
>> Sure, that would be helpful.
> 
>> But I'm a little bit puzzled about this DM conversion for MVEBU
>> platforms. As all MVEBU targets are already using DM and DM_SPI:
> 
>> arch/arm/Kconfig:
> 
>> ...
>> config ARCH_MVEBU
>>            bool "Marvell MVEBU family (Armada XP/375/38x/3700/7K/8K)"
>>            select OF_CONTROL
>>            select OF_SEPARATE
>>            select DM
>>            select DM_ETH
>>            select DM_SERIAL
>>            select DM_SPI
>>            select DM_SPI_FLASH
> 
>> So there should be no need to change something here. Or is something
>> not working correctly on some of the MVEBU platforms?
> 
>> What really is missing is the conversion of the older Marvell
>> platforms, like Kirkwood and Orion. Those are quite ancient and
>> have no DM / OF / DT support at all (AFAIR). So here is the real
>> work that needs to be done. Or all those boards might get dropped
>> soon.
> 
> Yeah sure enough
> 
> => dm tree
>    Class      Probed  Driver      Name
> ----------------------------------------
>    root       [ + ]   root_drive  root_driver
>    simple_bus [ + ]   generic_si  `-- soc
>    simple_bus [ + ]   generic_si      `-- internal-regs
>    spi        [ + ]   mvebu_spi           |-- spi@10680
>    spi_flash  [   ]   spi_flash_          |   `-- spi-flash@0
>    i2c        [   ]   i2c_mvtwsi          |-- i2c@11000
>    serial     [ + ]   ns16550_se          |-- serial@12000
>    eth        [ + ]   mvneta              |-- ethernet@34000
>    usb        [   ]   ehci_mvebu          |-- usb@58000
>    eth        [ + ]   mvneta              `-- ethernet@70000
> 
> So nothing to do for MVEBU.

Yep, thats what I thought.

> I do have a passing interest in keeping kirkwood support but lack an
> upstream supported platform to use. I'll have to see if I can update one of
> our boards to use and upstream bootloader.

Yes, that would be good. As I fear, that Kirkwood might get dropped
completely, if nobody reacts here and updates this platform to DM,
DT etc.

Thanks,
Stefan
Simon Guinot April 27, 2018, 8:51 a.m. UTC | #9
On Thu, Apr 26, 2018 at 11:30:00AM +0530, Jagan Teki wrote:
> On Thu, Mar 15, 2018 at 5:03 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.
> 
> Added all board mainatiner, using this driver on their relevant
> boards. So try to switch to DM_SPI(SPI_FLASH) before migration
> deadline expires.

Hi Jagan,

And what is the deadline exactly ?

Simon
Jagan Teki April 30, 2018, 5:58 a.m. UTC | #10
On Fri, Apr 27, 2018 at 2:21 PM, Simon Guinot <simon.guinot@sequanux.org> wrote:
> On Thu, Apr 26, 2018 at 11:30:00AM +0530, Jagan Teki wrote:
>> On Thu, Mar 15, 2018 at 5:03 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.
>>
>> Added all board mainatiner, using this driver on their relevant
>> boards. So try to switch to DM_SPI(SPI_FLASH) before migration
>> deadline expires.
>
> Hi Jagan,
>
> And what is the deadline exactly ?

See DM_SPI/SPI_FLASH migration details from, doc/driver-model/MIGRATION.txt

Jagan.
Simon Guinot May 1, 2018, 10:54 a.m. UTC | #11
On Mon, Apr 30, 2018 at 11:28:28AM +0530, Jagan Teki wrote:
> On Fri, Apr 27, 2018 at 2:21 PM, Simon Guinot <simon.guinot@sequanux.org> wrote:
> > On Thu, Apr 26, 2018 at 11:30:00AM +0530, Jagan Teki wrote:
> >> On Thu, Mar 15, 2018 at 5:03 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.
> >>
> >> Added all board mainatiner, using this driver on their relevant
> >> boards. So try to switch to DM_SPI(SPI_FLASH) before migration
> >> deadline expires.
> >
> > Hi Jagan,
> >
> > And what is the deadline exactly ?
> 
> See DM_SPI/SPI_FLASH migration details from, doc/driver-model/MIGRATION.txt

Thanks for letting me know Jagan...

I am no longer reading the U-Boot ML. So if you need me to do some
changes on the LaCie/Seagate boards then it would be better to send
me an email rather than burying information inside a file.

Simon
Stefan Roese May 2, 2018, 10:53 a.m. UTC | #12
Hi Simon,

On 01.05.2018 12:54, Simon Guinot wrote:
> On Mon, Apr 30, 2018 at 11:28:28AM +0530, Jagan Teki wrote:
>> On Fri, Apr 27, 2018 at 2:21 PM, Simon Guinot <simon.guinot@sequanux.org> wrote:
>>> On Thu, Apr 26, 2018 at 11:30:00AM +0530, Jagan Teki wrote:
>>>> On Thu, Mar 15, 2018 at 5:03 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.
>>>>
>>>> Added all board mainatiner, using this driver on their relevant
>>>> boards. So try to switch to DM_SPI(SPI_FLASH) before migration
>>>> deadline expires.
>>>
>>> Hi Jagan,
>>>
>>> And what is the deadline exactly ?
>>
>> See DM_SPI/SPI_FLASH migration details from, doc/driver-model/MIGRATION.txt
> 
> Thanks for letting me know Jagan...

Just to be clear here. The older Marvell platforms Orion and Kirkwood
completely lack DM (Driver-Model) and DT (Device-Tree) support in
U-Boot. This needs to be added (similar to what I've done to the
newer parts beginning with Armada XP / 38x) so that the SPI driver
(and others) can be used as DM-enabled driver.

Please see arch/arm/mach-mvebu/ for more details here.

Any work on this is greatly appreciated as I fear that the support
for these older SoC's might get dropped completely otherwise soon.

Thanks,
Stefan
Chris Packham May 2, 2018, 9:56 p.m. UTC | #13
Hi All,
On Wed, May 2, 2018 at 10:53 PM Stefan Roese <sr@denx.de> wrote:

> Hi Simon,

> On 01.05.2018 12:54, Simon Guinot wrote:
> > On Mon, Apr 30, 2018 at 11:28:28AM +0530, Jagan Teki wrote:
> >> On Fri, Apr 27, 2018 at 2:21 PM, Simon Guinot <
simon.guinot@sequanux.org> wrote:
> >>> On Thu, Apr 26, 2018 at 11:30:00AM +0530, Jagan Teki wrote:
> >>>> On Thu, Mar 15, 2018 at 5:03 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.
> >>>>
> >>>> Added all board mainatiner, using this driver on their relevant
> >>>> boards. So try to switch to DM_SPI(SPI_FLASH) before migration
> >>>> deadline expires.
> >>>
> >>> Hi Jagan,
> >>>
> >>> And what is the deadline exactly ?
> >>
> >> See DM_SPI/SPI_FLASH migration details from,
doc/driver-model/MIGRATION.txt
> >
> > Thanks for letting me know Jagan...

> Just to be clear here. The older Marvell platforms Orion and Kirkwood
> completely lack DM (Driver-Model) and DT (Device-Tree) support in
> U-Boot. This needs to be added (similar to what I've done to the
> newer parts beginning with Armada XP / 38x) so that the SPI driver
> (and others) can be used as DM-enabled driver.

> Please see arch/arm/mach-mvebu/ for more details here.

> Any work on this is greatly appreciated as I fear that the support
> for these older SoC's might get dropped completely otherwise soon.

I had a quick try on one of the kirkwood based boards I have. It was pretty
easy to bring in the dts files from Linux and get some basic stuff working.
I started with i2c since I can still boot without it, I haven't been brave
enough to try spi yet.

Hopefully I can spend a bit more time on it over the weekend.

In terms of a long-term plan. I could upstream support for our board, we
still include it in the source we distribute as part of our GPL compliance.
Since it's a older board that has been fairly stable we're not doing a lot
of development on it. My motivation for retaining support for kirkwood is
just in case we have some other EOL part that requires us to release a new
bootloader. I could do a blind conversion of other in-tree kirkwood boards
but my ability to test them would be quite limited.
Simon Baatz May 3, 2018, 5:40 a.m. UTC | #14
Hi Chris,

On Wed, May 02, 2018 at 09:56:52PM +0000, Chris Packham wrote:
> Hi All,
> On Wed, May 2, 2018 at 10:53 PM Stefan Roese <sr@denx.de> wrote:
> 
> > Hi Simon,
> 
> > On 01.05.2018 12:54, Simon Guinot wrote:
> > > On Mon, Apr 30, 2018 at 11:28:28AM +0530, Jagan Teki wrote:
> > >> On Fri, Apr 27, 2018 at 2:21 PM, Simon Guinot <
> simon.guinot@sequanux.org> wrote:
> > >>> On Thu, Apr 26, 2018 at 11:30:00AM +0530, Jagan Teki wrote:
> > >>>> On Thu, Mar 15, 2018 at 5:03 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.
> > >>>>
> > >>>> Added all board mainatiner, using this driver on their relevant
> > >>>> boards. So try to switch to DM_SPI(SPI_FLASH) before migration
> > >>>> deadline expires.
> > >>>
> > >>> Hi Jagan,
> > >>>
> > >>> And what is the deadline exactly ?
> > >>
> > >> See DM_SPI/SPI_FLASH migration details from,
> doc/driver-model/MIGRATION.txt
> > >
> > > Thanks for letting me know Jagan...
> 
> > Just to be clear here. The older Marvell platforms Orion and Kirkwood
> > completely lack DM (Driver-Model) and DT (Device-Tree) support in
> > U-Boot. This needs to be added (similar to what I've done to the
> > newer parts beginning with Armada XP / 38x) so that the SPI driver
> > (and others) can be used as DM-enabled driver.
> 
> > Please see arch/arm/mach-mvebu/ for more details here.
> 
> > Any work on this is greatly appreciated as I fear that the support
> > for these older SoC's might get dropped completely otherwise soon.
> 
> I had a quick try on one of the kirkwood based boards I have. It was pretty
> easy to bring in the dts files from Linux and get some basic stuff working.
> I started with i2c since I can still boot without it, I haven't been brave
> enough to try spi yet.
> 
> Hopefully I can spend a bit more time on it over the weekend.
> 
> In terms of a long-term plan. I could upstream support for our board, we
> still include it in the source we distribute as part of our GPL compliance.
> Since it's a older board that has been fairly stable we're not doing a lot
> of development on it. My motivation for retaining support for kirkwood is
> just in case we have some other EOL part that requires us to release a new
> bootloader. I could do a blind conversion of other in-tree kirkwood boards
> but my ability to test them would be quite limited.

I have a eSATA Sheevaplug and a IB-NAS6210 lying around here.  Both
are supported by U-Boot and the Linux kernel.  Provided they still
work, I could test on these boards if that helps.
Stefan Roese May 3, 2018, 11:21 a.m. UTC | #15
Hi Chris,

On 02.05.2018 23:56, Chris Packham wrote:
> Hi All,
> On Wed, May 2, 2018 at 10:53 PM Stefan Roese <sr@denx.de> wrote:
> 
>> Hi Simon,
> 
>> On 01.05.2018 12:54, Simon Guinot wrote:
>>> On Mon, Apr 30, 2018 at 11:28:28AM +0530, Jagan Teki wrote:
>>>> On Fri, Apr 27, 2018 at 2:21 PM, Simon Guinot <
> simon.guinot@sequanux.org> wrote:
>>>>> On Thu, Apr 26, 2018 at 11:30:00AM +0530, Jagan Teki wrote:
>>>>>> On Thu, Mar 15, 2018 at 5:03 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.
>>>>>>
>>>>>> Added all board mainatiner, using this driver on their relevant
>>>>>> boards. So try to switch to DM_SPI(SPI_FLASH) before migration
>>>>>> deadline expires.
>>>>>
>>>>> Hi Jagan,
>>>>>
>>>>> And what is the deadline exactly ?
>>>>
>>>> See DM_SPI/SPI_FLASH migration details from,
> doc/driver-model/MIGRATION.txt
>>>
>>> Thanks for letting me know Jagan...
> 
>> Just to be clear here. The older Marvell platforms Orion and Kirkwood
>> completely lack DM (Driver-Model) and DT (Device-Tree) support in
>> U-Boot. This needs to be added (similar to what I've done to the
>> newer parts beginning with Armada XP / 38x) so that the SPI driver
>> (and others) can be used as DM-enabled driver.
> 
>> Please see arch/arm/mach-mvebu/ for more details here.
> 
>> Any work on this is greatly appreciated as I fear that the support
>> for these older SoC's might get dropped completely otherwise soon.
> 
> I had a quick try on one of the kirkwood based boards I have. It was pretty
> easy to bring in the dts files from Linux and get some basic stuff working.
> I started with i2c since I can still boot without it, I haven't been brave
> enough to try spi yet.
> 
> Hopefully I can spend a bit more time on it over the weekend.

This sound just great. Thanks.

> In terms of a long-term plan. I could upstream support for our board, we
> still include it in the source we distribute as part of our GPL compliance.
> Since it's a older board that has been fairly stable we're not doing a lot
> of development on it. My motivation for retaining support for kirkwood is
> just in case we have some other EOL part that requires us to release a new
> bootloader. I could do a blind conversion of other in-tree kirkwood boards
> but my ability to test them would be quite limited.

This "blind conversion" is definitely much better, than the removal.
Others might be able to test some of the boards. I don't have any of
those - so I can't help out here.

Thanks,
Stefan
Chris Packham May 7, 2018, 11:20 p.m. UTC | #16
On Thu, May 3, 2018 at 11:21 PM Stefan Roese <sr@denx.de> wrote:

> Hi Chris,

> On 02.05.2018 23:56, Chris Packham wrote:
> > Hi All,
> > On Wed, May 2, 2018 at 10:53 PM Stefan Roese <sr@denx.de> wrote:
> >
> >> Hi Simon,
> >
> >> On 01.05.2018 12:54, Simon Guinot wrote:
> >>> On Mon, Apr 30, 2018 at 11:28:28AM +0530, Jagan Teki wrote:
> >>>> On Fri, Apr 27, 2018 at 2:21 PM, Simon Guinot <
> > simon.guinot@sequanux.org> wrote:
> >>>>> On Thu, Apr 26, 2018 at 11:30:00AM +0530, Jagan Teki wrote:
> >>>>>> On Thu, Mar 15, 2018 at 5:03 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.
> >>>>>>
> >>>>>> Added all board mainatiner, using this driver on their relevant
> >>>>>> boards. So try to switch to DM_SPI(SPI_FLASH) before migration
> >>>>>> deadline expires.
> >>>>>
> >>>>> Hi Jagan,
> >>>>>
> >>>>> And what is the deadline exactly ?
> >>>>
> >>>> See DM_SPI/SPI_FLASH migration details from,
> > doc/driver-model/MIGRATION.txt
> >>>
> >>> Thanks for letting me know Jagan...
> >
> >> Just to be clear here. The older Marvell platforms Orion and Kirkwood
> >> completely lack DM (Driver-Model) and DT (Device-Tree) support in
> >> U-Boot. This needs to be added (similar to what I've done to the
> >> newer parts beginning with Armada XP / 38x) so that the SPI driver
> >> (and others) can be used as DM-enabled driver.
> >
> >> Please see arch/arm/mach-mvebu/ for more details here.
> >
> >> Any work on this is greatly appreciated as I fear that the support
> >> for these older SoC's might get dropped completely otherwise soon.
> >
> > I had a quick try on one of the kirkwood based boards I have. It was
pretty
> > easy to bring in the dts files from Linux and get some basic stuff
working.
> > I started with i2c since I can still boot without it, I haven't been
brave
> > enough to try spi yet.
> >
> > Hopefully I can spend a bit more time on it over the weekend.

> This sound just great. Thanks.

> > In terms of a long-term plan. I could upstream support for our board, we
> > still include it in the source we distribute as part of our GPL
compliance.
> > Since it's a older board that has been fairly stable we're not doing a
lot
> > of development on it. My motivation for retaining support for kirkwood
is
> > just in case we have some other EOL part that requires us to release a
new
> > bootloader. I could do a blind conversion of other in-tree kirkwood
boards
> > but my ability to test them would be quite limited.

> This "blind conversion" is definitely much better, than the removal.
> Others might be able to test some of the boards. I don't have any of
> those - so I can't help out here.


An update on this.

I've tested these 2 patches from Jagan on my out-of-tree Kirkwood board
with the addition of http://patchwork.ozlabs.org/patch/909973/ the chip
seems accessible. So for both

Tested-by: Chris Packham <judge.packham@gmail.com>

In terms of getting the conversion done. I'm about halfway through bringing
in the dts files from Linux. My plan is to send an initial series for
boards that don't enable CONFIG_CMD_SF that just imports the dts and
enables CONFIG_OF_CONTROL without actually enabling the DM for any
subsystem (that isn't already enabled).

Then for the boards with SF enabled I'll need to build test them with and
without Jagan's patches. So that could take a bit longer. Unfortunately in
order to maintain bisect-ability these will have have to go in before
Jagan's changes can be merged.
diff mbox series

Patch

diff --git a/drivers/spi/kirkwood_spi.c b/drivers/spi/kirkwood_spi.c
index 4850a2b955..16d41de2a6 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(&reg->ctrl, KWSPI_CSN_ACT);
 }
 
-static void _spi_cs_deactivate(struct kwspi_registers *reg)
+static void spi_cs_deactivate(struct kwspi_registers *reg)
 {
 	clrbits_le32(&reg->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(&reg->irq_cause, KWSPI_SMEMRDIRQ);
 		writel(tmpdout, &reg->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(&reg->irq_cause) & KWSPI_SMEMRDIRQ) {
 				isread = 1;
 				tmpdin = readl(&reg->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;
@@ -364,6 +203,18 @@  static int mvebu_spi_probe(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
+	 */
+};
+
+#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 */