All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com>
To: Boris Brezillon <boris.brezillon@bootlin.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:31:44 +0200	[thread overview]
Message-ID: <CAPybu_3ROm1HpX7nqS5w3pZ3RuWnAwL8aTPWBH8t+Q4-UX0ZiQ@mail.gmail.com> (raw)
In-Reply-To: <20181008201027.17952-7-boris.brezillon@bootlin.com>

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++);

(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
>


-- 
Ricardo Ribalda

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

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

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++);

(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
>


-- 
Ricardo Ribalda

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

Thread overview: 59+ 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 ` Boris Brezillon
2018-10-08 20:10 ` [PATCH 01/14] mtd: maps: physmap: Add SPDX header Boris Brezillon
2018-10-08 20:10   ` 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   ` 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-08 20:10   ` Boris Brezillon
2018-10-09  7:16   ` Ricardo Ribalda Delgado
2018-10-09  7:16     ` Ricardo Ribalda Delgado
2018-10-09  7:54     ` Boris Brezillon
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   ` Boris Brezillon
2018-10-08 20:10 ` [PATCH 05/14] mtd: maps: physmap: Use devm_ioremap_resource() Boris Brezillon
2018-10-08 20:10   ` Boris Brezillon
2018-10-08 20:10 ` [PATCH 06/14] mtd: maps: physmap: Remove the MAX_RESOURCES limitation Boris Brezillon
2018-10-08 20:10   ` Boris Brezillon
2018-10-09  7:31   ` Ricardo Ribalda Delgado [this message]
2018-10-09  7:31     ` Ricardo Ribalda Delgado
2018-10-09  7:53     ` Boris Brezillon
2018-10-09  7:53       ` Boris Brezillon
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   ` 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   ` Boris Brezillon
2018-10-08 20:10 ` [PATCH 09/14] mtd: maps: physmap: Fix coding style issues reported by checkpatch Boris Brezillon
2018-10-08 20:10   ` Boris Brezillon
2018-10-09  7:37   ` Ricardo Ribalda Delgado
2018-10-09  7:37     ` Ricardo Ribalda Delgado
2018-10-09  7:52     ` Boris Brezillon
2018-10-09  7:52       ` Boris Brezillon
2018-10-14  7:26       ` Boris Brezillon
2018-10-14  7:26         ` Boris Brezillon
2018-10-15  8:52         ` [PATCH] mtd: maps: code style: Invert logic on if/else branch Ricardo Ribalda Delgado
2018-10-08 20:10 ` [PATCH 10/14] mtd: maps: Prepare merging of physmap and physmap_of Boris Brezillon
2018-10-08 20:10   ` Boris Brezillon
2018-10-08 20:10 ` [PATCH 11/14] mtd: maps: Merge physmap_of.c into physmap-core.c Boris Brezillon
2018-10-08 20:10   ` Boris Brezillon
2018-10-09  6:58   ` Ricardo Ribalda Delgado
2018-10-09  6:58     ` Ricardo Ribalda Delgado
2018-10-09  7:06     ` Boris Brezillon
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-08 20:10   ` Boris Brezillon
2018-10-09  7:04   ` Ricardo Ribalda Delgado
2018-10-09  7:04     ` Ricardo Ribalda Delgado
2018-10-09  7:11     ` Boris Brezillon
2018-10-09  7:11       ` Boris Brezillon
2018-10-14  7:06       ` 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   ` Boris Brezillon
2018-10-08 20:10 ` [PATCH 14/14] dt-binding: mtd: physmap: Document the addr-gpios property Boris Brezillon
2018-10-08 20:10   ` Boris Brezillon
2018-10-09  7:43   ` Ricardo Ribalda Delgado
2018-10-09  7:43     ` Ricardo Ribalda Delgado
2018-10-09  7:56     ` Boris Brezillon
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=CAPybu_3ROm1HpX7nqS5w3pZ3RuWnAwL8aTPWBH8t+Q4-UX0ZiQ@mail.gmail.com \
    --to=ricardo.ribalda@gmail.com \
    --cc=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=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 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.