devicetree.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Boris Brezillon <boris.brezillon@bootlin.com>
To: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com>
Cc: Mark Rutland <mark.rutland@arm.com>,
	devicetree@vger.kernel.org, Pawel Moll <pawel.moll@arm.com>,
	Ian Campbell <ijc+devicetree@hellion.org.uk>,
	Richard Weinberger <richard@nod.at>,
	Marek Vasut <marek.vasut@gmail.com>,
	Rob Herring <robh+dt@kernel.org>,
	linux-mtd@lists.infradead.org, Kumar Gala <galak@codeaurora.org>,
	Brian Norris <computersforpeace@gmail.com>,
	David Woodhouse <dwmw2@infradead.org>
Subject: Re: [PATCH 06/14] mtd: maps: physmap: Remove the MAX_RESOURCES limitation
Date: Tue, 9 Oct 2018 09:53:27 +0200	[thread overview]
Message-ID: <20181009095327.132c9a5a@bbrezillon> (raw)
In-Reply-To: <CAPybu_3ROm1HpX7nqS5w3pZ3RuWnAwL8aTPWBH8t+Q4-UX0ZiQ@mail.gmail.com>

On Tue, 9 Oct 2018 09:31:44 +0200
Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com> wrote:

> Hi Boris
> On Mon, Oct 8, 2018 at 10:10 PM Boris Brezillon
> <boris.brezillon@bootlin.com> wrote:
> >
> > Remove the MAX_RESOURCES limitation by dynamically allocating the  
> > ->mtds[] and ->maps[] at probe time based on the number of iomem  
> > resources attached to the platform device.
> >
> > Signed-off-by: Boris Brezillon <boris.brezillon@bootlin.com>
> > ---
> >  drivers/mtd/maps/physmap.c | 44 +++++++++++++++++++++++++++-----------------
> >  1 file changed, 27 insertions(+), 17 deletions(-)
> >
> > diff --git a/drivers/mtd/maps/physmap.c b/drivers/mtd/maps/physmap.c
> > index cbc50b53ec9d..86679d149a49 100644
> > --- a/drivers/mtd/maps/physmap.c
> > +++ b/drivers/mtd/maps/physmap.c
> > @@ -22,12 +22,11 @@
> >  #include <linux/mtd/concat.h>
> >  #include <linux/io.h>
> >
> > -#define MAX_RESOURCES          4
> > -
> >  struct physmap_flash_info {
> > -       struct mtd_info         *mtds[MAX_RESOURCES];
> > +       unsigned int            nmaps;
> > +       struct mtd_info         **mtds;
> >         struct mtd_info         *cmtd;
> > -       struct map_info         maps[MAX_RESOURCES];
> > +       struct map_info         *maps;
> >         spinlock_t              vpp_lock;
> >         int                     vpp_refcnt;
> >  };
> > @@ -50,7 +49,7 @@ static int physmap_flash_remove(struct platform_device *dev)
> >                         mtd_concat_destroy(info->cmtd);
> >         }
> >
> > -       for (i = 0; i < MAX_RESOURCES; i++) {
> > +       for (i = 0; i < info->nmaps; i++) {
> >                 if (info->mtds[i] != NULL)
> >                         map_destroy(info->mtds[i]);
> >         }
> > @@ -101,7 +100,6 @@ static int physmap_flash_probe(struct platform_device *dev)
> >         const char * const *part_types;
> >         int err = 0;
> >         int i;
> > -       int devices_found = 0;
> >
> >         physmap_data = dev_get_platdata(&dev->dev);
> >         if (physmap_data == NULL)
> > @@ -114,6 +112,24 @@ static int physmap_flash_probe(struct platform_device *dev)
> >                 goto err_out;
> >         }
> >
> > +       while (platform_get_resource(dev, IORESOURCE_MEM, info->nmaps))
> > +               info->nmaps++;  
> 
> Maybe you prefer:
> for (info->nmaps = 0; platform_get_resource(dev, IORESOURCE_MEM,
> info->nmaps) ; info->nmaps++);

I don't like when while/for loop bodies are empty, that's why I went for
the while() loop ;-).

> 
> (your choice, they are probably compiled into the same assembly)
> 
> > +
> > +       if (!info->nmaps)
> > +               return -ENODEV;
> > +
> > +       info->maps = devm_kzalloc(&dev->dev,
> > +                                 sizeof(*info->maps) * info->nmaps,
> > +                                 GFP_KERNEL);
> > +       if (!info->maps)
> > +               return -ENOMEM;
> > +
> > +       info->mtds = devm_kzalloc(&dev->dev,
> > +                                 sizeof(*info->mtds) * info->nmaps,
> > +                                 GFP_KERNEL);
> > +       if (!info->mtds)
> > +               return -ENOMEM;
> > +
> >         if (physmap_data->init) {
> >                 err = physmap_data->init(dev);
> >                 if (err)
> > @@ -122,13 +138,10 @@ static int physmap_flash_probe(struct platform_device *dev)
> >
> >         platform_set_drvdata(dev, info);
> >
> > -       for (i = 0; i < MAX_RESOURCES; i++) {
> > +       for (i = 0; i < info->nmaps; i++) {
> >                 struct resource *res;
> >
> >                 res = platform_get_resource(dev, IORESOURCE_MEM, i);
> > -               if (res)
> > -                       break;
> > -
> >                 info->maps[i].virt = devm_ioremap_resource(&dev->dev, res);
> >                 if (IS_ERR(info->maps[i].virt)) {
> >                         err = PTR_ERR(info->maps[i].virt);
> > @@ -159,21 +172,18 @@ static int physmap_flash_probe(struct platform_device *dev)
> >                         dev_err(&dev->dev, "map_probe failed\n");
> >                         err = -ENXIO;
> >                         goto err_out;
> > -               } else {
> > -                       devices_found++;
> >                 }
> >                 info->mtds[i]->dev.parent = &dev->dev;
> >         }
> >
> > -       if (!devices_found) {
> > -               err = -ENODEV;
> > -       } else if (devices_found == 1) {
> > +       if (info->nmaps == 1) {
> >                 info->cmtd = info->mtds[0];
> >         } else {
> >                 /*
> >                  * We detected multiple devices. Concatenate them together.
> >                  */
> > -               info->cmtd = mtd_concat_create(info->mtds, devices_found, dev_name(&dev->dev));
> > +               info->cmtd = mtd_concat_create(info->mtds, info->nmaps,
> > +                                              dev_name(&dev->dev));
> >                 if (info->cmtd == NULL)
> >                         err = -ENXIO;
> >         }
> > @@ -199,7 +209,7 @@ static void physmap_flash_shutdown(struct platform_device *dev)
> >         struct physmap_flash_info *info = platform_get_drvdata(dev);
> >         int i;
> >
> > -       for (i = 0; i < MAX_RESOURCES && info->mtds[i]; i++)
> > +       for (i = 0; i < info->nmaps && info->mtds[i]; i++)
> >                 if (mtd_suspend(info->mtds[i]) == 0)
> >                         mtd_resume(info->mtds[i]);
> >  }
> > --
> > 2.14.1
> >  
> 
> 


______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/

  reply	other threads:[~2018-10-09  7:53 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-10-08 20:10 [PATCH 00/14] mtd: maps: physmap cleanups Boris Brezillon
2018-10-08 20:10 ` [PATCH 01/14] mtd: maps: physmap: Add SPDX header Boris Brezillon
2018-10-08 20:10 ` [PATCH 02/14] mtd: maps: physmap: Rename ->map and ->mtd into ->maps and ->mtds Boris Brezillon
2018-10-08 20:10 ` [PATCH 03/14] mtd: maps: physmap: Use platform_get_resource() to retrieve iomem resources Boris Brezillon
2018-10-09  7:16   ` Ricardo Ribalda Delgado
2018-10-09  7:54     ` Boris Brezillon
2018-10-08 20:10 ` [PATCH 04/14] mtd: maps: physmap: Use dev_notice() and a %pR specifier Boris Brezillon
2018-10-08 20:10 ` [PATCH 05/14] mtd: maps: physmap: Use devm_ioremap_resource() Boris Brezillon
2018-10-08 20:10 ` [PATCH 06/14] mtd: maps: physmap: Remove the MAX_RESOURCES limitation Boris Brezillon
2018-10-09  7:31   ` Ricardo Ribalda Delgado
2018-10-09  7:53     ` Boris Brezillon [this message]
2018-10-08 20:10 ` [PATCH 07/14] mtd: maps: physmap: Check mtd_device_{parse_register, unregister}() ret code Boris Brezillon
2018-10-08 20:10 ` [PATCH 08/14] mtd: maps: physmap: Return -ENOMEM directly when info allocation fails Boris Brezillon
2018-10-08 20:10 ` [PATCH 09/14] mtd: maps: physmap: Fix coding style issues reported by checkpatch Boris Brezillon
2018-10-09  7:37   ` Ricardo Ribalda Delgado
2018-10-09  7:52     ` Boris Brezillon
2018-10-14  7:26       ` Boris Brezillon
2018-10-08 20:10 ` [PATCH 10/14] mtd: maps: Prepare merging of physmap and physmap_of Boris Brezillon
2018-10-08 20:10 ` [PATCH 11/14] mtd: maps: Merge physmap_of.c into physmap-core.c Boris Brezillon
2018-10-09  6:58   ` Ricardo Ribalda Delgado
2018-10-09  7:06     ` Boris Brezillon
2018-10-08 20:10 ` [PATCH 12/14] mtd: maps: Merge gpio-addr-flash.c " Boris Brezillon
2018-10-09  7:04   ` Ricardo Ribalda Delgado
2018-10-09  7:11     ` Boris Brezillon
2018-10-14  7:06       ` Boris Brezillon
2018-10-08 20:10 ` [PATCH 13/14] mtd: maps: Rename physmap_of_{versatile, gemini} into physmap-{versatile, gemini} Boris Brezillon
2018-10-08 20:10 ` [PATCH 14/14] dt-binding: mtd: physmap: Document the addr-gpios property Boris Brezillon
2018-10-09  7:43   ` Ricardo Ribalda Delgado
2018-10-09  7:56     ` Boris Brezillon

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=20181009095327.132c9a5a@bbrezillon \
    --to=boris.brezillon@bootlin.com \
    --cc=computersforpeace@gmail.com \
    --cc=devicetree@vger.kernel.org \
    --cc=dwmw2@infradead.org \
    --cc=galak@codeaurora.org \
    --cc=ijc+devicetree@hellion.org.uk \
    --cc=linux-mtd@lists.infradead.org \
    --cc=marek.vasut@gmail.com \
    --cc=mark.rutland@arm.com \
    --cc=pawel.moll@arm.com \
    --cc=ricardo.ribalda@gmail.com \
    --cc=richard@nod.at \
    --cc=robh+dt@kernel.org \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).