diff mbox

[U-Boot,v7,12/34] sf: probe: Use spi_flash_scan in dm-spi-flash

Message ID 1448539458-14306-13-git-send-email-jteki@openedev.com
State Rejected
Delegated to: Jagannadha Sutradharudu Teki
Headers show

Commit Message

Jagan Teki Nov. 26, 2015, 12:03 p.m. UTC
This patch add support to use spi_flash_scan in
dm-spi-flash probe, so-that it can access
the spi_flash functionalities same as non-dm sf probe.

Signed-off-by: Jagan Teki <jteki@openedev.com>
---
 drivers/mtd/spi/sf_probe.c | 28 +++++++++++++++++++++++++---
 1 file changed, 25 insertions(+), 3 deletions(-)

Comments

Simon Glass Nov. 26, 2015, 5:50 p.m. UTC | #1
Hi Jagan,

On 26 November 2015 at 04:03, Jagan Teki <jteki@openedev.com> wrote:
> This patch add support to use spi_flash_scan in
> dm-spi-flash probe, so-that it can access
> the spi_flash functionalities same as non-dm sf probe.
>
> Signed-off-by: Jagan Teki <jteki@openedev.com>
> ---
>  drivers/mtd/spi/sf_probe.c | 28 +++++++++++++++++++++++++---
>  1 file changed, 25 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/mtd/spi/sf_probe.c b/drivers/mtd/spi/sf_probe.c
> index f2e210d..60856f9 100644
> --- a/drivers/mtd/spi/sf_probe.c
> +++ b/drivers/mtd/spi/sf_probe.c
> @@ -137,14 +137,36 @@ int spi_flash_std_erase(struct udevice *dev, u32 offset, size_t len)
>
>  int spi_flash_std_probe(struct udevice *dev)
>  {
> -       struct spi_slave *slave = dev_get_parent_priv(dev);
>         struct dm_spi_slave_platdata *plat = dev_get_parent_platdata(dev);
> +       struct spi_slave *slave = dev_get_parent_priv(dev);
>         struct spi_flash *flash;
> +       int ret;
> +
> +       debug("%s: slave=%p, cs=%d\n", __func__, slave, plat->cs);
>
>         flash = dev_get_uclass_priv(dev);
>         flash->dev = dev;
> -       debug("%s: slave=%p, cs=%d\n", __func__, slave, plat->cs);
> -       return spi_flash_probe_slave(slave, flash);
> +
> +       /* Claim spi bus */
> +       ret = spi_claim_bus(slave);
> +       if (ret) {
> +               debug("SF: Failed to claim SPI bus: %d\n", ret);
> +               return ret;
> +       }
> +
> +       ret = spi_flash_scan(slave, flash);
> +       if (ret) {
> +               ret = -EINVAL;
> +               goto err_read_id;
> +       }
> +
> +#ifdef CONFIG_SPI_FLASH_MTD
> +       ret = spi_flash_mtd_register(flash);
> +#endif

But you can't call this from driver model code. As far as I can see
the MTD layer does not support driver model. You are going to create a
plate of spaghetti and it will be a big job to untangle it.


> +
> +err_read_id:
> +       spi_release_bus(slave);
> +       return ret;
>  }
>
>  static const struct dm_spi_flash_ops spi_flash_std_ops = {
> --
> 1.9.1
>

Regards,
Simon
Jagan Teki Nov. 26, 2015, 7:10 p.m. UTC | #2
Hi Simon,

On 26 November 2015 at 23:20, Simon Glass <sjg@chromium.org> wrote:
> Hi Jagan,
>
> On 26 November 2015 at 04:03, Jagan Teki <jteki@openedev.com> wrote:
>> This patch add support to use spi_flash_scan in
>> dm-spi-flash probe, so-that it can access
>> the spi_flash functionalities same as non-dm sf probe.
>>
>> Signed-off-by: Jagan Teki <jteki@openedev.com>
>> ---
>>  drivers/mtd/spi/sf_probe.c | 28 +++++++++++++++++++++++++---
>>  1 file changed, 25 insertions(+), 3 deletions(-)
>>
>> diff --git a/drivers/mtd/spi/sf_probe.c b/drivers/mtd/spi/sf_probe.c
>> index f2e210d..60856f9 100644
>> --- a/drivers/mtd/spi/sf_probe.c
>> +++ b/drivers/mtd/spi/sf_probe.c
>> @@ -137,14 +137,36 @@ int spi_flash_std_erase(struct udevice *dev, u32 offset, size_t len)
>>
>>  int spi_flash_std_probe(struct udevice *dev)
>>  {
>> -       struct spi_slave *slave = dev_get_parent_priv(dev);
>>         struct dm_spi_slave_platdata *plat = dev_get_parent_platdata(dev);
>> +       struct spi_slave *slave = dev_get_parent_priv(dev);
>>         struct spi_flash *flash;
>> +       int ret;
>> +
>> +       debug("%s: slave=%p, cs=%d\n", __func__, slave, plat->cs);
>>
>>         flash = dev_get_uclass_priv(dev);
>>         flash->dev = dev;
>> -       debug("%s: slave=%p, cs=%d\n", __func__, slave, plat->cs);
>> -       return spi_flash_probe_slave(slave, flash);
>> +
>> +       /* Claim spi bus */
>> +       ret = spi_claim_bus(slave);
>> +       if (ret) {
>> +               debug("SF: Failed to claim SPI bus: %d\n", ret);
>> +               return ret;
>> +       }
>> +
>> +       ret = spi_flash_scan(slave, flash);
>> +       if (ret) {
>> +               ret = -EINVAL;
>> +               goto err_read_id;
>> +       }
>> +
>> +#ifdef CONFIG_SPI_FLASH_MTD
>> +       ret = spi_flash_mtd_register(flash);
>> +#endif
>
> But you can't call this from driver model code. As far as I can see
> the MTD layer does not support driver model. You are going to create a
> plate of spaghetti and it will be a big job to untangle it.

This call is same as before, SPI_FLASH_MTD is not exactly a MTD core
it's an internal mtd driver for sf that in turn call mtd core and
anyway this will replaced with add_mtd_device coming patches.

And why can't we call mtd from here? because mtd core requires fill
mtd structure form respective flash layers like sf, nand and cfi.

>
>
>> +
>> +err_read_id:
>> +       spi_release_bus(slave);
>> +       return ret;
>>  }
>>
>>  static const struct dm_spi_flash_ops spi_flash_std_ops = {
>> --
>> 1.9.1

thanks!
diff mbox

Patch

diff --git a/drivers/mtd/spi/sf_probe.c b/drivers/mtd/spi/sf_probe.c
index f2e210d..60856f9 100644
--- a/drivers/mtd/spi/sf_probe.c
+++ b/drivers/mtd/spi/sf_probe.c
@@ -137,14 +137,36 @@  int spi_flash_std_erase(struct udevice *dev, u32 offset, size_t len)
 
 int spi_flash_std_probe(struct udevice *dev)
 {
-	struct spi_slave *slave = dev_get_parent_priv(dev);
 	struct dm_spi_slave_platdata *plat = dev_get_parent_platdata(dev);
+	struct spi_slave *slave = dev_get_parent_priv(dev);
 	struct spi_flash *flash;
+	int ret;
+
+	debug("%s: slave=%p, cs=%d\n", __func__, slave, plat->cs);
 
 	flash = dev_get_uclass_priv(dev);
 	flash->dev = dev;
-	debug("%s: slave=%p, cs=%d\n", __func__, slave, plat->cs);
-	return spi_flash_probe_slave(slave, flash);
+
+	/* Claim spi bus */
+	ret = spi_claim_bus(slave);
+	if (ret) {
+		debug("SF: Failed to claim SPI bus: %d\n", ret);
+		return ret;
+	}
+
+	ret = spi_flash_scan(slave, flash);
+	if (ret) {
+		ret = -EINVAL;
+		goto err_read_id;
+	}
+
+#ifdef CONFIG_SPI_FLASH_MTD
+	ret = spi_flash_mtd_register(flash);
+#endif
+
+err_read_id:
+	spi_release_bus(slave);
+	return ret;
 }
 
 static const struct dm_spi_flash_ops spi_flash_std_ops = {