All of lore.kernel.org
 help / color / mirror / Atom feed
From: Stefan Roese <sr@denx.de>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH 2/2] spi: kirkwood: Full dm conversion
Date: Tue, 20 Mar 2018 14:49:13 +0100	[thread overview]
Message-ID: <0a8e96ad-df1a-12aa-b572-f0127ee60eea@denx.de> (raw)
In-Reply-To: <20180315113323.32056-2-jagan@amarulasolutions.com>

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

  reply	other threads:[~2018-03-20 13:49 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-03-15 11:33 [U-Boot] [PATCH 1/2] spi: kirkwood: Get drvdata in .ofdata_to_platdata Jagan Teki
2018-03-15 11:33 ` [U-Boot] [PATCH 2/2] spi: kirkwood: Full dm conversion Jagan Teki
2018-03-20 13:49   ` Stefan Roese [this message]
2018-03-20 15:06     ` Jagan Teki
2018-03-20 15:14       ` Stefan Roese
2018-04-26  6:00   ` Jagan Teki
2018-04-26 22:45     ` Chris Packham
2018-04-27  5:44       ` Stefan Roese
2018-04-27  8:12         ` Chris Packham
2018-04-27  8:16           ` Stefan Roese
2018-04-27  8:51     ` Simon Guinot
2018-04-30  5:58       ` Jagan Teki
2018-05-01 10:54         ` Simon Guinot
2018-05-02 10:53           ` Stefan Roese
2018-05-02 21:56             ` Chris Packham
2018-05-03  5:40               ` Simon Baatz
2018-05-03 11:21               ` Stefan Roese
2018-05-07 23:20                 ` Chris Packham
2018-08-01  6:51 ` [U-Boot] [PATCH 1/2] spi: kirkwood: Get drvdata in .ofdata_to_platdata Jagan Teki

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=0a8e96ad-df1a-12aa-b572-f0127ee60eea@denx.de \
    --to=sr@denx.de \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.