[PATCH v3 5/7] mtd: m25p80: add support to parse the SPI flash's partitions

Hu Mingkai-B21284 B21284 at freescale.com
Thu Oct 7 22:42:10 EDT 2010



> -----Original Message-----
> From: glikely at secretlab.ca [mailto:glikely at secretlab.ca] On Behalf Of Grant
> Likely
> Sent: Friday, October 01, 2010 5:35 AM
> To: Hu Mingkai-B21284
> Cc: linuxppc-dev at ozlabs.org; spi-devel-general at lists.sourceforge.net; linux-
> mtd at lists.infradead.org; Gala Kumar-B11780; Zang Roy-R61911
> Subject: Re: [PATCH v3 5/7] mtd: m25p80: add support to parse the SPI flash's
> partitions
> 
> On Thu, Sep 30, 2010 at 5:00 PM, Mingkai Hu <Mingkai.hu at freescale.com> wrote:
> > Signed-off-by: Mingkai Hu <Mingkai.hu at freescale.com>
> > ---
> > v3:
> >  - Move the SPI flash partition code to the probe function.
> >
> >  drivers/mtd/devices/m25p80.c |   39 +++++++++++++++++++++++++++------------
> >  1 files changed, 27 insertions(+), 12 deletions(-)
> >
> > diff --git a/drivers/mtd/devices/m25p80.c b/drivers/mtd/devices/m25p80.c
> > index 6f512b5..47d53c7 100644
> > --- a/drivers/mtd/devices/m25p80.c
> > +++ b/drivers/mtd/devices/m25p80.c
> > @@ -772,7 +772,7 @@ static const struct spi_device_id *__devinit
> jedec_probe(struct spi_device *spi)
> >  static int __devinit m25p_probe(struct spi_device *spi)
> >  {
> >        const struct spi_device_id      *id = spi_get_device_id(spi);
> > -       struct flash_platform_data      *data;
> > +       struct flash_platform_data      data, *pdata;
> >        struct m25p                     *flash;
> >        struct flash_info               *info;
> >        unsigned                        i;
> > @@ -782,13 +782,27 @@ static int __devinit m25p_probe(struct spi_device *spi)
> >         * a chip ID, try the JEDEC id commands; they'll work for most
> >         * newer chips, even if we don't recognize the particular chip.
> >         */
> > -       data = spi->dev.platform_data;
> > -       if (data && data->type) {
> > +       pdata = spi->dev.platform_data;
> > +       if (!pdata && spi->dev.of_node) {
> > +               int nr_parts;
> > +               struct mtd_partition *parts;
> > +               struct device_node *np = spi->dev.of_node;
> > +
> > +               nr_parts = of_mtd_parse_partitions(&spi->dev, np, &parts);
> > +               if (nr_parts) {
> > +                       pdata = &data;
> > +                       memset(pdata, 0, sizeof(*pdata));
> > +                       pdata->parts = parts;
> > +                       pdata->nr_parts = nr_parts;
> > +               }
> > +       }
> 
> Yes, this is the correct way to go about adding the partitions.
> However, this patch can be made simpler by not renaming 'data' to
> 'pdata' and by moving the above code down to just before the partition
> information is actually used.  in the OF case, only the parts and the
> nr_parts values written into data, and those values aren't used until
> the last part of the probe function.
> 
> Regardless, in principle this patch is correct:
> 
> Acked-by: Grant Likely <grant.likely at secretlab.ca>
> 
> > +
> > +       if (pdata && pdata->type) {
> >                const struct spi_device_id *plat_id;
> >
> >                for (i = 0; i < ARRAY_SIZE(m25p_ids) - 1; i++) {
> >                        plat_id = &m25p_ids[i];
> > -                       if (strcmp(data->type, plat_id->name))
> > +                       if (strcmp(pdata->type, plat_id->name))
> >                                continue;
> >                        break;
> >                }
> > @@ -796,7 +810,8 @@ static int __devinit m25p_probe(struct spi_device *spi)
> >                if (i < ARRAY_SIZE(m25p_ids) - 1)
> >                        id = plat_id;
> >                else
> > -                       dev_warn(&spi->dev, "unrecognized id %s\n", data-
> >type);
> > +                       dev_warn(&spi->dev, "unrecognized id %s\n",
> > +                                       pdata->type);
> >        }
> >
> >        info = (void *)id->driver_data;
> > @@ -847,8 +862,8 @@ static int __devinit m25p_probe(struct spi_device *spi)
> >                write_sr(flash, 0);
> >        }
> >
> > -       if (data && data->name)
> > -               flash->mtd.name = data->name;
> > +       if (pdata && pdata->name)
> > +               flash->mtd.name = pdata->name;
> >        else
> >                flash->mtd.name = dev_name(&spi->dev);
> >
> > @@ -919,9 +934,9 @@ static int __devinit m25p_probe(struct spi_device *spi)
> >                                        part_probes, &parts, 0);
> >                }
> >
> > -               if (nr_parts <= 0 && data && data->parts) {
> > -                       parts = data->parts;
> > -                       nr_parts = data->nr_parts;
> > +               if (nr_parts <= 0 && pdata && pdata->parts) {
> > +                       parts = pdata->parts;
> > +                       nr_parts = pdata->nr_parts;
> >                }
> 
> As per my comment earlier; since parts and nr_parts isn't needed
> before this point, this block could simply be:
> 
> if (nr_parts <= 0 && data && data->parts) {
>         parts = data->parts;
>         nr_parts = data->nr_parts;
> }
> if (nr_parts <= 0 && spi->dev.of_node)
>         nr_parts = of_mtd_parse_partitions(&spi->dev, np, &parts);
> 
> And most of the other changes to this file goes away.  Simpler, yes?
> 

Yes, you're right, I'll fix it. Also thanks for your suggestion and ACK.

Thanks,
Mingkai




More information about the linux-mtd mailing list