From: Moritz Fischer <mdf@kernel.org> To: linux-fpga@vger.kernel.org Cc: trix@redhat.com, hao.wu@intel.com, michal.simek@xilinx.com, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, russell.h.weight@intel.com, matthew.gerlach@intel.com, Moritz Fischer <mdf@kernel.org> Subject: [PATCH 01/10] fpga: fpga-mgr: Add devm_fpga_mgr_register() API Date: Sat, 3 Oct 2020 22:14:14 -0700 [thread overview] Message-ID: <20201004051423.75879-2-mdf@kernel.org> (raw) In-Reply-To: <20201004051423.75879-1-mdf@kernel.org> Add a devm_fpga_mgr_register() API that can be used to register a FPGA Manager that was created using devm_fpga_mgr_create(). Introduce a struct fpga_mgr_devres that makes the devres allocation a little bit more readable and gets reused for devm_fpga_mgr_create() devm_fpga_mgr_register(). Signed-off-by: Moritz Fischer <mdf@kernel.org> --- drivers/fpga/fpga-mgr.c | 76 ++++++++++++++++++++++++++++++----- include/linux/fpga/fpga-mgr.h | 2 + 2 files changed, 68 insertions(+), 10 deletions(-) diff --git a/drivers/fpga/fpga-mgr.c b/drivers/fpga/fpga-mgr.c index f38bab01432e..774ac98fb69c 100644 --- a/drivers/fpga/fpga-mgr.c +++ b/drivers/fpga/fpga-mgr.c @@ -21,6 +21,10 @@ static DEFINE_IDA(fpga_mgr_ida); static struct class *fpga_mgr_class; +struct fpga_mgr_devres { + struct fpga_manager *mgr; +}; + /** * fpga_image_info_alloc - Allocate a FPGA image info struct * @dev: owning device @@ -651,21 +655,21 @@ struct fpga_manager *devm_fpga_mgr_create(struct device *dev, const char *name, const struct fpga_manager_ops *mops, void *priv) { - struct fpga_manager **ptr, *mgr; + struct fpga_mgr_devres *dr; - ptr = devres_alloc(devm_fpga_mgr_release, sizeof(*ptr), GFP_KERNEL); - if (!ptr) + dr = devres_alloc(devm_fpga_mgr_release, sizeof(*dr), GFP_KERNEL); + if (!dr) return NULL; - mgr = fpga_mgr_create(dev, name, mops, priv); - if (!mgr) { - devres_free(ptr); - } else { - *ptr = mgr; - devres_add(dev, ptr); + dr->mgr = fpga_mgr_create(dev, name, mops, priv); + if (!dr->mgr) { + devres_free(dr); + return NULL; } - return mgr; + devres_add(dev, dr); + + return dr->mgr; } EXPORT_SYMBOL_GPL(devm_fpga_mgr_create); @@ -722,6 +726,58 @@ void fpga_mgr_unregister(struct fpga_manager *mgr) } EXPORT_SYMBOL_GPL(fpga_mgr_unregister); +static int fpga_mgr_devres_match(struct device *dev, void *priv, + void *match_data) +{ + struct fpga_mgr_devres *dr = priv; + + return match_data == dr->mgr; +} + +static void devm_fpga_mgr_unregister(struct device *dev, void *priv) +{ + struct fpga_mgr_devres *dr = priv; + + fpga_mgr_unregister(dr->mgr); +} + +/** + * devm_fpga_mgr_register - resource managed variant of fpga_mgr_register() + * @dev: managing device for this FPGA manager + * @mgr: fpga manager struct + * + * This is the devres variant of fpga_mgr_register() for which the unregister + * function will be called automatically when the managing device is detached. + */ +int devm_fpga_mgr_register(struct device *dev, struct fpga_manager *mgr) +{ + struct fpga_mgr_devres *dr; + int err; + + /* Make sure that the struct fpga_manager * that is passed in is + * managed itself. + */ + if (WARN_ON(!devres_find(dev, devm_fpga_mgr_release, + fpga_mgr_devres_match, mgr))) + return -EINVAL; + + dr = devres_alloc(devm_fpga_mgr_unregister, sizeof(*dr), GFP_KERNEL); + if (!dr) + return -ENOMEM; + + err = fpga_mgr_register(mgr); + if (err) { + devres_free(dr); + return err; + } + + dr->mgr = mgr; + devres_add(dev, dr); + + return 0; +} +EXPORT_SYMBOL_GPL(devm_fpga_mgr_register); + static void fpga_mgr_dev_release(struct device *dev) { } diff --git a/include/linux/fpga/fpga-mgr.h b/include/linux/fpga/fpga-mgr.h index e8ca62b2cb5b..2bc3030a69e5 100644 --- a/include/linux/fpga/fpga-mgr.h +++ b/include/linux/fpga/fpga-mgr.h @@ -198,6 +198,8 @@ void fpga_mgr_free(struct fpga_manager *mgr); int fpga_mgr_register(struct fpga_manager *mgr); void fpga_mgr_unregister(struct fpga_manager *mgr); +int devm_fpga_mgr_register(struct device *dev, struct fpga_manager *mgr); + struct fpga_manager *devm_fpga_mgr_create(struct device *dev, const char *name, const struct fpga_manager_ops *mops, void *priv); -- 2.28.0
WARNING: multiple messages have this Message-ID (diff)
From: Moritz Fischer <mdf@kernel.org> To: linux-fpga@vger.kernel.org Cc: russell.h.weight@intel.com, trix@redhat.com, michal.simek@xilinx.com, matthew.gerlach@intel.com, linux-kernel@vger.kernel.org, Moritz Fischer <mdf@kernel.org>, linux-arm-kernel@lists.infradead.org, hao.wu@intel.com Subject: [PATCH 01/10] fpga: fpga-mgr: Add devm_fpga_mgr_register() API Date: Sat, 3 Oct 2020 22:14:14 -0700 [thread overview] Message-ID: <20201004051423.75879-2-mdf@kernel.org> (raw) In-Reply-To: <20201004051423.75879-1-mdf@kernel.org> Add a devm_fpga_mgr_register() API that can be used to register a FPGA Manager that was created using devm_fpga_mgr_create(). Introduce a struct fpga_mgr_devres that makes the devres allocation a little bit more readable and gets reused for devm_fpga_mgr_create() devm_fpga_mgr_register(). Signed-off-by: Moritz Fischer <mdf@kernel.org> --- drivers/fpga/fpga-mgr.c | 76 ++++++++++++++++++++++++++++++----- include/linux/fpga/fpga-mgr.h | 2 + 2 files changed, 68 insertions(+), 10 deletions(-) diff --git a/drivers/fpga/fpga-mgr.c b/drivers/fpga/fpga-mgr.c index f38bab01432e..774ac98fb69c 100644 --- a/drivers/fpga/fpga-mgr.c +++ b/drivers/fpga/fpga-mgr.c @@ -21,6 +21,10 @@ static DEFINE_IDA(fpga_mgr_ida); static struct class *fpga_mgr_class; +struct fpga_mgr_devres { + struct fpga_manager *mgr; +}; + /** * fpga_image_info_alloc - Allocate a FPGA image info struct * @dev: owning device @@ -651,21 +655,21 @@ struct fpga_manager *devm_fpga_mgr_create(struct device *dev, const char *name, const struct fpga_manager_ops *mops, void *priv) { - struct fpga_manager **ptr, *mgr; + struct fpga_mgr_devres *dr; - ptr = devres_alloc(devm_fpga_mgr_release, sizeof(*ptr), GFP_KERNEL); - if (!ptr) + dr = devres_alloc(devm_fpga_mgr_release, sizeof(*dr), GFP_KERNEL); + if (!dr) return NULL; - mgr = fpga_mgr_create(dev, name, mops, priv); - if (!mgr) { - devres_free(ptr); - } else { - *ptr = mgr; - devres_add(dev, ptr); + dr->mgr = fpga_mgr_create(dev, name, mops, priv); + if (!dr->mgr) { + devres_free(dr); + return NULL; } - return mgr; + devres_add(dev, dr); + + return dr->mgr; } EXPORT_SYMBOL_GPL(devm_fpga_mgr_create); @@ -722,6 +726,58 @@ void fpga_mgr_unregister(struct fpga_manager *mgr) } EXPORT_SYMBOL_GPL(fpga_mgr_unregister); +static int fpga_mgr_devres_match(struct device *dev, void *priv, + void *match_data) +{ + struct fpga_mgr_devres *dr = priv; + + return match_data == dr->mgr; +} + +static void devm_fpga_mgr_unregister(struct device *dev, void *priv) +{ + struct fpga_mgr_devres *dr = priv; + + fpga_mgr_unregister(dr->mgr); +} + +/** + * devm_fpga_mgr_register - resource managed variant of fpga_mgr_register() + * @dev: managing device for this FPGA manager + * @mgr: fpga manager struct + * + * This is the devres variant of fpga_mgr_register() for which the unregister + * function will be called automatically when the managing device is detached. + */ +int devm_fpga_mgr_register(struct device *dev, struct fpga_manager *mgr) +{ + struct fpga_mgr_devres *dr; + int err; + + /* Make sure that the struct fpga_manager * that is passed in is + * managed itself. + */ + if (WARN_ON(!devres_find(dev, devm_fpga_mgr_release, + fpga_mgr_devres_match, mgr))) + return -EINVAL; + + dr = devres_alloc(devm_fpga_mgr_unregister, sizeof(*dr), GFP_KERNEL); + if (!dr) + return -ENOMEM; + + err = fpga_mgr_register(mgr); + if (err) { + devres_free(dr); + return err; + } + + dr->mgr = mgr; + devres_add(dev, dr); + + return 0; +} +EXPORT_SYMBOL_GPL(devm_fpga_mgr_register); + static void fpga_mgr_dev_release(struct device *dev) { } diff --git a/include/linux/fpga/fpga-mgr.h b/include/linux/fpga/fpga-mgr.h index e8ca62b2cb5b..2bc3030a69e5 100644 --- a/include/linux/fpga/fpga-mgr.h +++ b/include/linux/fpga/fpga-mgr.h @@ -198,6 +198,8 @@ void fpga_mgr_free(struct fpga_manager *mgr); int fpga_mgr_register(struct fpga_manager *mgr); void fpga_mgr_unregister(struct fpga_manager *mgr); +int devm_fpga_mgr_register(struct device *dev, struct fpga_manager *mgr); + struct fpga_manager *devm_fpga_mgr_create(struct device *dev, const char *name, const struct fpga_manager_ops *mops, void *priv); -- 2.28.0 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2020-10-04 5:14 UTC|newest] Thread overview: 51+ messages / expand[flat|nested] mbox.gz Atom feed top 2020-10-04 5:14 [PATCH 00/10] Introduce devm_fpga_mgr_register() Moritz Fischer 2020-10-04 5:14 ` Moritz Fischer 2020-10-04 5:14 ` Moritz Fischer [this message] 2020-10-04 5:14 ` [PATCH 01/10] fpga: fpga-mgr: Add devm_fpga_mgr_register() API Moritz Fischer 2020-10-04 18:08 ` Tom Rix 2020-10-04 18:08 ` Tom Rix 2020-10-05 5:18 ` Wu, Hao 2020-10-05 5:18 ` Wu, Hao 2020-10-05 16:45 ` Moritz Fischer 2020-10-05 16:45 ` Moritz Fischer 2020-10-04 5:14 ` [PATCH 02/10] fpga: fpga-mgr: altera-ps-spi: Simplify registration Moritz Fischer 2020-10-04 5:14 ` Moritz Fischer 2020-10-04 18:15 ` Tom Rix 2020-10-04 18:15 ` Tom Rix 2020-10-04 5:14 ` [PATCH 03/10] fpga: fpga-mgr: dfl-fme-mgr: " Moritz Fischer 2020-10-04 5:14 ` Moritz Fischer 2020-10-04 18:22 ` Tom Rix 2020-10-04 18:22 ` Tom Rix 2020-10-04 23:40 ` Moritz Fischer 2020-10-04 23:40 ` Moritz Fischer 2020-10-04 5:14 ` [PATCH 04/10] fpga: fpga-mgr: ice40-spi: " Moritz Fischer 2020-10-04 5:14 ` Moritz Fischer 2020-10-04 18:24 ` Tom Rix 2020-10-04 18:24 ` Tom Rix 2020-10-04 5:14 ` [PATCH 05/10] fpga: fpga-mgr: machxo2-spi: " Moritz Fischer 2020-10-04 5:14 ` Moritz Fischer 2020-10-04 18:25 ` Tom Rix 2020-10-04 18:25 ` Tom Rix 2020-10-04 5:14 ` [PATCH 06/10] fpga: fpga-mgr: socfpga: " Moritz Fischer 2020-10-04 5:14 ` Moritz Fischer 2020-10-04 18:27 ` Tom Rix 2020-10-04 18:27 ` Tom Rix 2020-10-04 5:14 ` [PATCH 07/10] fpga: fpga-mgr: ts73xx: " Moritz Fischer 2020-10-04 5:14 ` Moritz Fischer 2020-10-04 18:27 ` Tom Rix 2020-10-04 18:27 ` Tom Rix 2020-10-04 5:14 ` [PATCH 08/10] fpga: fpga-mgr: xilinx-spi: " Moritz Fischer 2020-10-04 5:14 ` Moritz Fischer 2020-10-04 18:28 ` Tom Rix 2020-10-04 18:28 ` Tom Rix 2020-10-04 5:14 ` [PATCH 09/10] fpga: fpga-mgr: zynqmp: " Moritz Fischer 2020-10-04 5:14 ` Moritz Fischer 2020-10-04 18:33 ` Tom Rix 2020-10-04 18:33 ` Tom Rix 2020-10-04 5:14 ` [PATCH 10/10] fpga: fpga-mgr: altera-pr-ip: " Moritz Fischer 2020-10-04 5:14 ` Moritz Fischer 2020-10-04 18:47 ` Tom Rix 2020-10-04 18:47 ` Tom Rix 2020-10-04 23:39 ` Moritz Fischer 2020-10-04 23:39 ` Moritz Fischer 2020-11-03 7:14 [PATCH 00/10] Introduce devm_fpga_mgr_register() API Moritz Fischer 2020-11-03 7:14 ` [PATCH 01/10] fpga: fpga-mgr: Add " Moritz Fischer
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=20201004051423.75879-2-mdf@kernel.org \ --to=mdf@kernel.org \ --cc=hao.wu@intel.com \ --cc=linux-arm-kernel@lists.infradead.org \ --cc=linux-fpga@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=matthew.gerlach@intel.com \ --cc=michal.simek@xilinx.com \ --cc=russell.h.weight@intel.com \ --cc=trix@redhat.com \ /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: linkBe 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.