drives/soc/fsl: Move DPIO driver out of staging
Subsystems (5)
v3 cover drives/soc/fsl: Move DPIO driver out of staging
This patchset moves the NXP DPIO (Datapath I/O Driver) out of the drivers/staging directory and into the drivers/soc/fsl directory.
The DPIO driver enables access to Queue and Buffer Manager (QBMAN) hardware on NXP DPAA2 devices. This is a prerequiset to moving the DPAA2 Etherney driver out of staging.
Changes in v3:
- Update caam files that use dpaa2 frame header files
- Fix spare errors and memory leak
- Remove empty staging/drivers/fsl-mc directory
Changes in v2:
- Fix minor conflict in latest linux-next branch
- Generate patch using -M
Roy Pledge (4):
drivers/staging/fsl-mc: Use memremap for DPIO cache enabled area drivers/staging/fsl-mc: Fix DPIO error path issues staging:fsl-mc: Move DPIO from staging to drivers/soc/fsl drivers/staging: Remove fsl-mc driver from staging
MAINTAINERS | 2 +-
drivers/crypto/caam/sg_sw_qm2.h | 2 +-
drivers/crypto/caam/sg_sw_sec4.h | 2 +-
drivers/soc/fsl/Kconfig | 10 +++++
drivers/soc/fsl/Makefile | 1 +
.../{staging/fsl-mc/bus => soc/fsl}/dpio/Makefile | 0
.../fsl-mc/bus => soc/fsl}/dpio/dpio-cmd.h | 0
.../fsl-mc/bus => soc/fsl}/dpio/dpio-driver.c | 51 +++++++++++++++-------
.../fsl-mc/bus => soc/fsl}/dpio/dpio-driver.txt | 0
.../fsl-mc/bus => soc/fsl}/dpio/dpio-service.c | 2 +-
.../{staging/fsl-mc/bus => soc/fsl}/dpio/dpio.c | 0
.../{staging/fsl-mc/bus => soc/fsl}/dpio/dpio.h | 0
.../fsl-mc/bus => soc/fsl}/dpio/qbman-portal.c | 2 +-
.../fsl-mc/bus => soc/fsl}/dpio/qbman-portal.h | 6 +--
drivers/staging/Kconfig | 2 -
drivers/staging/Makefile | 1 -
drivers/staging/fsl-dpaa2/ethernet/dpaa2-eth.h | 4 +-
drivers/staging/fsl-mc/Kconfig | 2 -
drivers/staging/fsl-mc/Makefile | 3 --
drivers/staging/fsl-mc/bus/Kconfig | 16 -------
drivers/staging/fsl-mc/bus/Makefile | 9 ----
.../fsl-mc/include => include/soc/fsl}/dpaa2-fd.h | 0
.../include => include/soc/fsl}/dpaa2-global.h | 0
.../fsl-mc/include => include/soc/fsl}/dpaa2-io.h | 2 +-
24 files changed, 58 insertions(+), 59 deletions(-)
rename drivers/{staging/fsl-mc/bus => soc/fsl}/dpio/Makefile (100%)
rename drivers/{staging/fsl-mc/bus => soc/fsl}/dpio/dpio-cmd.h (100%)
rename drivers/{staging/fsl-mc/bus => soc/fsl}/dpio/dpio-driver.c (83%)
rename drivers/{staging/fsl-mc/bus => soc/fsl}/dpio/dpio-driver.txt (100%)
rename drivers/{staging/fsl-mc/bus => soc/fsl}/dpio/dpio-service.c (99%)
rename drivers/{staging/fsl-mc/bus => soc/fsl}/dpio/dpio.c (100%)
rename drivers/{staging/fsl-mc/bus => soc/fsl}/dpio/dpio.h (100%)
rename drivers/{staging/fsl-mc/bus => soc/fsl}/dpio/qbman-portal.c (99%)
rename drivers/{staging/fsl-mc/bus => soc/fsl}/dpio/qbman-portal.h (99%)
delete mode 100644 drivers/staging/fsl-mc/Kconfig
delete mode 100644 drivers/staging/fsl-mc/Makefile
delete mode 100644 drivers/staging/fsl-mc/bus/Kconfig
delete mode 100644 drivers/staging/fsl-mc/bus/Makefile
rename {drivers/staging/fsl-mc/include => include/soc/fsl}/dpaa2-fd.h (100%)
rename {drivers/staging/fsl-mc/include => include/soc/fsl}/dpaa2-global.h (100%)
rename {drivers/staging/fsl-mc/include => include/soc/fsl}/dpaa2-io.h (99%)--
2.7.4
PATCH v3 1/4 drivers/staging/fsl-mc: Use memremap for DPIO cache enabled area
Change the mapping of the QBMan cache enabled area from using ioremap_wc() to memremap(). This allows the __iomem attribute to be removed from the pointer (which makes sense as accesses try this as cacheable memory not IO memory). These changes allow sparse checks to pass.
--- drivers/staging/fsl-mc/bus/dpio/dpio-driver.c | 8 +++++--- drivers/staging/fsl-mc/bus/dpio/qbman-portal.h | 4 ++-- drivers/staging/fsl-mc/include/dpaa2-io.h | 2 +- 3 files changed, 8 insertions(+), 6 deletions(-)
drivers/staging/fsl-mc/bus/dpio/dpio-driver.c +5 -3
@@ -13,6 +13,7 @@#include <linux/msi.h> #include <linux/dma-mapping.h> #include <linux/delay.h> +#include <linux/io.h> #include <linux/fsl/mc.h> #include "../../include/dpaa2-io.h"
@@ -146,10 +147,11 @@ static int dpaa2_dpio_probe(struct fsl_mc_device *dpio_dev)* Set the CENA regs to be the cache inhibited area of the portal to * avoid coherency issues if a user migrates to another core. */ - desc.regs_cena =ioremap_wc (dpio_dev->regions[1 ].start, -resource_size (&dpio_dev->regions[1 ])); + desc.regs_cena =memremap (dpio_dev->regions[1 ].start, +resource_size (&dpio_dev->regions[1 ]), +MEMREMAP_WC ); desc.regs_cinh =ioremap (dpio_dev->regions[1 ].start, -resource_size (&dpio_dev->regions[1 ])); +resource_size (&dpio_dev->regions[1 ])); err =fsl_mc_allocate_irqs (dpio_dev);if (err) {
drivers/staging/fsl-mc/bus/dpio/qbman-portal.h +2 -2
@@ -15,7 +15,7 @@ struct qbman_swp;/* qbman software portal descriptor structure */ struct qbman_swp_desc {void *cena_bar;/* Cache-enabled portal base address */ -void *cinh_bar;/* Cache-inhibited portal base address */ +void __iomem *cinh_bar;/* Cache-inhibited portal base address */ u32 qman_version; };
@@ -102,7 +102,7 @@ struct qbman_release_desc {/* portal data structure */ struct qbman_swp {const struct qbman_swp_desc *desc; -void __iomem *addr_cena; +void *addr_cena;void __iomem *addr_cinh;/* Management commands */
drivers/staging/fsl-mc/include/dpaa2-io.h +1 -1
@@ -52,7 +52,7 @@ struct dpaa2_io_desc {int has_8prio;int cpu;void *regs_cena; -void *regs_cinh; +void __iomem *regs_cinh;int dpio_id;u32 qman_version; };
Signature · 1 line
2.7.4
PATCH v3 2/4 drivers/staging/fsl-mc: Fix DPIO error path issues
In reply to Roy PledgeThe error path in the dpaa2_dpio_probe() function was not properly unmapping the QBMan device memory on the error path. This was also missing from the dpaa2_dpio_release() function.
Also addresses a memory leak of the device private data structure.
--- drivers/staging/fsl-mc/bus/dpio/dpio-driver.c | 49 +++++++++++++++++++-------- 1 file changed, 34 insertions(+), 15 deletions(-)
drivers/staging/fsl-mc/bus/dpio/dpio-driver.c +34 -15
@@ -28,6 +28,7 @@ MODULE_DESCRIPTION("DPIO Driver");struct dpio_priv {struct dpaa2_io *io; +struct dpaa2_io_desc desc; };static irqreturn_t dpio_irq_handler (int irq_num,void *arg)
@@ -85,7 +86,6 @@ static int register_dpio_irq_handlers(struct fsl_mc_device *dpio_dev, int cpu)static int dpaa2_dpio_probe (struct fsl_mc_device *dpio_dev) {struct dpio_attr dpio_attrs; -struct dpaa2_io_desc desc;struct dpio_priv *priv;int err = -ENOMEM ;struct device *dev = &dpio_dev->dev;
@@ -117,7 +117,7 @@ static int dpaa2_dpio_probe(struct fsl_mc_device *dpio_dev)dev_err (dev,"dpio_get_attributes() failed %d\n" , err); goto err_get_attr; } - desc.qman_version = dpio_attrs.qbman_version; + priv->desc.qman_version = dpio_attrs.qbman_version; err =dpio_enable (dpio_dev->mc_io,0 , dpio_dev->mc_handle);if (err) {
@@ -126,9 +126,9 @@ static int dpaa2_dpio_probe(struct fsl_mc_device *dpio_dev) }/* initialize DPIO descriptor */ - desc.receives_notifications = dpio_attrs.num_priorities ?1 :0 ; - desc.has_8prio = dpio_attrs.num_priorities ==8 ?1 :0 ; - desc.dpio_id = dpio_dev->obj_desc.id; + priv->desc.receives_notifications = dpio_attrs.num_priorities ?1 :0 ; + priv->desc.has_8prio = dpio_attrs.num_priorities ==8 ?1 :0 ; + priv->desc.dpio_id = dpio_dev->obj_desc.id;/* get the cpu to use for the affinity hint */ if (next_cpu ==-1 )
@@ -139,19 +139,28 @@ static int dpaa2_dpio_probe(struct fsl_mc_device *dpio_dev)if (!cpu_possible (next_cpu)) {dev_err (dev,"probe failed. Number of DPIOs exceeds NR_CPUS.\n" ); err = -ERANGE ; - goto err_allocate_irqs; + goto err_too_many_cpu; } - desc.cpu = next_cpu; + priv->desc.cpu = next_cpu;/* * Set the CENA regs to be the cache inhibited area of the portal to * avoid coherency issues if a user migrates to another core. */ - desc.regs_cena =memremap (dpio_dev->regions[1 ].start, -resource_size (&dpio_dev->regions[1 ]), -MEMREMAP_WC ); - desc.regs_cinh =ioremap (dpio_dev->regions[1 ].start, -resource_size (&dpio_dev->regions[1 ])); + priv->desc.regs_cena =memremap (dpio_dev->regions[1 ].start, +resource_size (&dpio_dev->regions[1 ]), +MEMREMAP_WC ); +if (!priv->desc.regs_cena) { +dev_err (dev,"memremap failed\n" ); + goto err_too_many_cpu; + } + + priv->desc.regs_cinh =ioremap (dpio_dev->regions[1 ].start, +resource_size (&dpio_dev->regions[1 ])); +if (!priv->desc.regs_cinh) { +dev_err (dev,"ioremap failed\n" ); + goto err_ioremap_failed; + } err =fsl_mc_allocate_irqs (dpio_dev);if (err) {
@@ -159,11 +168,11 @@ static int dpaa2_dpio_probe(struct fsl_mc_device *dpio_dev) goto err_allocate_irqs; } - err =register_dpio_irq_handlers (dpio_dev, desc.cpu); + err =register_dpio_irq_handlers (dpio_dev, priv->desc.cpu);if (err) goto err_register_dpio_irq; - priv->io =dpaa2_io_create (&desc); + priv->io =dpaa2_io_create (&priv->desc);if (!priv->io) {dev_err (dev,"dpaa2_io_create failed\n" ); goto err_dpaa2_io_create;
@@ -171,7 +180,7 @@ static int dpaa2_dpio_probe(struct fsl_mc_device *dpio_dev)dev_info (dev,"probed\n" );dev_dbg (dev," receives_notifications = %d\n" , - desc.receives_notifications); + priv->desc.receives_notifications);dpio_close (dpio_dev->mc_io,0 , dpio_dev->mc_handle);fsl_mc_portal_free (dpio_dev->mc_io);
@@ -182,6 +191,10 @@ static int dpaa2_dpio_probe(struct fsl_mc_device *dpio_dev) err_register_dpio_irq:fsl_mc_free_irqs (dpio_dev); err_allocate_irqs: +iounmap (priv->desc.regs_cinh); +err_ioremap_failed: +memunmap (priv->desc.regs_cena); +err_too_many_cpu:dpio_disable (dpio_dev->mc_io,0 , dpio_dev->mc_handle); err_get_attr:dpio_close (dpio_dev->mc_io,0 , dpio_dev->mc_handle);
@@ -189,6 +202,7 @@ static int dpaa2_dpio_probe(struct fsl_mc_device *dpio_dev)fsl_mc_portal_free (dpio_dev->mc_io); err_mcportal:dev_set_drvdata (dev,NULL ); +devm_kfree (dev, priv); err_priv_alloc:return err; }
@@ -230,8 +244,13 @@ static int dpaa2_dpio_remove(struct fsl_mc_device *dpio_dev)dpio_close (dpio_dev->mc_io,0 , dpio_dev->mc_handle); +iounmap (priv->desc.regs_cinh); +memunmap (priv->desc.regs_cena); +fsl_mc_portal_free (dpio_dev->mc_io); +devm_kfree (dev, priv); +dev_set_drvdata (dev,NULL );return 0 ;
Signature · 1 line
2.7.4
Re: [PATCH v3 2/4] drivers/staging/fsl-mc: Fix DPIO error path issues
Hi Roy,
Quoted 65 lines · Roy Pledge
The error path in the
dpaa2_dpio_probe()function was not properly unmapping the QBMan device memory on the error path. This was also missing from thedpaa2_dpio_release()function.Also addresses a memory leak of the device private data structure.
Signed-off-by Roy Pledge <[email protected]>--- drivers/staging/fsl-mc/bus/dpio/dpio-driver.c | 49 +++++++++++++++++++-------- 1 file changed, 34 insertions(+), 15 deletions(-)drivers/staging/fsl-mc/bus/dpio/dpio-driver.c +7
-7@@ -28,6 +28,7 @@ MODULE_DESCRIPTION("DPIO Driver");struct dpio_priv {struct dpaa2_io *io; +struct dpaa2_io_desc desc; };static irqreturn_t dpio_irq_handler (int irq_num,void *arg)@@ -85,7 +86,6 @@ static int register_dpio_irq_handlers(struct fsl_mc_device *dpio_dev, int cpu)static int dpaa2_dpio_probe (struct fsl_mc_device *dpio_dev) {struct dpio_attr dpio_attrs; -struct dpaa2_io_desc desc;struct dpio_priv *priv;int err = -ENOMEM ;struct device *dev = &dpio_dev->dev;@@ -117,7 +117,7 @@ static int dpaa2_dpio_probe(struct fsl_mc_device *dpio_dev)dev_err (dev,"dpio_get_attributes() failed %d\n" , err); goto err_get_attr; } - desc.qman_version = dpio_attrs.qbman_version; + priv->desc.qman_version = dpio_attrs.qbman_version; err =dpio_enable (dpio_dev->mc_io,0 , dpio_dev->mc_handle);if (err) {@@ -126,9 +126,9 @@ static int dpaa2_dpio_probe(struct fsl_mc_device *dpio_dev) }/* initialize DPIO descriptor */ - desc.receives_notifications = dpio_attrs.num_priorities ?1 :0 ; - desc.has_8prio = dpio_attrs.num_priorities ==8 ?1 :0 ; - desc.dpio_id = dpio_dev->obj_desc.id; + priv->desc.receives_notifications = dpio_attrs.num_priorities ?1 :0 ; + priv->desc.has_8prio = dpio_attrs.num_priorities ==8 ?1 :0 ; + priv->desc.dpio_id = dpio_dev->obj_desc.id;/* get the cpu to use for the affinity hint */ if (next_cpu ==-1 )@@ -139,19 +139,28 @@ static int dpaa2_dpio_probe(struct fsl_mc_device *dpio_dev)if (!cpu_possible (next_cpu)) {dev_err (dev,"probe failed. Number of DPIOs exceeds NR_CPUS.\n" ); err = -ERANGE ; - goto err_allocate_irqs; + goto err_too_many_cpu; } - desc.cpu = next_cpu; + priv->desc.cpu = next_cpu;/* * Set the CENA regs to be the cache inhibited area of the portal to
drivers/staging/fsl-mc/bus/dpio/dpio-driver.c static int dpaa2_dpio_probe(struct fsl_mc_device *dpio_dev) · line 152
Quoted 10 lines
drivers/staging/fsl-mc/bus/dpio/dpio-driver.c +3
-5* avoid coherency issues if a user migrates to another core. */ - desc.regs_cena =memremap (dpio_dev->regions[1 ].start, -resource_size (&dpio_dev->regions[1 ]), -MEMREMAP_WC ); - desc.regs_cinh =ioremap (dpio_dev->regions[1 ].start, -resource_size (&dpio_dev->regions[1 ])); + priv->desc.regs_cena =memremap (dpio_dev->regions[1 ].start, +resource_size (&dpio_dev->regions[1 ]), +MEMREMAP_WC );
Since you already have some devres-managed resources in this driver, maybe use devm_memremap? (and perhaps convert the existing ioremap too)
Quoted 38 lines
drivers/staging/fsl-mc/bus/dpio/dpio-driver.c +14
-3+if (!priv->desc.regs_cena) { +dev_err (dev,"memremap failed\n" ); + goto err_too_many_cpu; + } + + priv->desc.regs_cinh =ioremap (dpio_dev->regions[1 ].start, +resource_size (&dpio_dev->regions[1 ])); +if (!priv->desc.regs_cinh) { +dev_err (dev,"ioremap failed\n" ); + goto err_ioremap_failed; + } err =fsl_mc_allocate_irqs (dpio_dev);if (err) {@@ -159,11 +168,11 @@ static int dpaa2_dpio_probe(struct fsl_mc_device *dpio_dev) goto err_allocate_irqs; } - err =register_dpio_irq_handlers (dpio_dev, desc.cpu); + err =register_dpio_irq_handlers (dpio_dev, priv->desc.cpu);if (err) goto err_register_dpio_irq; - priv->io =dpaa2_io_create (&desc); + priv->io =dpaa2_io_create (&priv->desc);if (!priv->io) {dev_err (dev,"dpaa2_io_create failed\n" ); goto err_dpaa2_io_create;@@ -171,7 +180,7 @@ static int dpaa2_dpio_probe(struct fsl_mc_device *dpio_dev)dev_info (dev,"probed\n" );dev_dbg (dev," receives_notifications = %d\n" , - desc.receives_notifications); + priv->desc.receives_notifications);dpio_close (dpio_dev->mc_io,0 , dpio_dev->mc_handle);fsl_mc_portal_free (dpio_dev->mc_io);
drivers/staging/fsl-mc/bus/dpio/dpio-driver.c static int dpaa2_dpio_probe(struct fsl_mc_device *dpio_dev) · line 196
Quoted 6 lines
drivers/staging/fsl-mc/bus/dpio/dpio-driver.c +3
-0@@ -182,6 +191,10 @@ static int dpaa2_dpio_probe(struct fsl_mc_device *dpio_dev) err_register_dpio_irq:fsl_mc_free_irqs (dpio_dev); err_allocate_irqs: +iounmap (priv->desc.regs_cinh); +err_ioremap_failed: +memunmap (priv->desc.regs_cena);
...then you wouldn't need to worry about this.
drivers/staging/fsl-mc/bus/dpio/dpio-driver.c static int dpaa2_dpio_probe(struct fsl_mc_device *dpio_dev) · line 205
Quoted 9 lines
drivers/staging/fsl-mc/bus/dpio/dpio-driver.c +2
-0+err_too_many_cpu:dpio_disable (dpio_dev->mc_io,0 , dpio_dev->mc_handle); err_get_attr:dpio_close (dpio_dev->mc_io,0 , dpio_dev->mc_handle);@@ -189,6 +202,7 @@ static int dpaa2_dpio_probe(struct fsl_mc_device *dpio_dev)fsl_mc_portal_free (dpio_dev->mc_io); err_mcportal:dev_set_drvdata (dev,NULL ); +devm_kfree (dev, priv);
The whole point of devm_* is that you don't need to do this - the devres entries are freed automatically by the driver core upon probe failure or driver detach, i.e. priv was never leaking.
Quoted 5 lines
drivers/staging/fsl-mc/bus/dpio/dpio-driver.c +0
-0err_priv_alloc:return err; }@@ -230,8 +244,13 @@ static int dpaa2_dpio_remove(struct fsl_mc_device *dpio_dev)
drivers/staging/fsl-mc/bus/dpio/dpio-driver.c static int dpaa2_dpio_remove(struct fsl_mc_device *dpio_dev) · line 254
Quoted 10 lines
drivers/staging/fsl-mc/bus/dpio/dpio-driver.c +5
-0dpio_close (dpio_dev->mc_io,0 , dpio_dev->mc_handle); +iounmap (priv->desc.regs_cinh); +memunmap (priv->desc.regs_cena); +fsl_mc_portal_free (dpio_dev->mc_io); +devm_kfree (dev, priv); +dev_set_drvdata (dev,NULL );
Note that clearing drvdata is something else the driver core already does at about the same time as cleaning up devres entries (see __device_release_driver() and the failure path of really_probe(), in drivers/base/dd.c), so this has been similarly superfluous all along.
Robin.
Re: [PATCH v3 2/4] drivers/staging/fsl-mc: Fix DPIO error path issues
Quoted 66 lines · Robin Murphy
Hi Roy,
Quoted 63 lines · Roy Pledge
The error path in the
dpaa2_dpio_probe()function was not properly unmapping the QBMan device memory on the error path. This was also missing from thedpaa2_dpio_release()function.Also addresses a memory leak of the device private data structure.
Signed-off-by Roy Pledge <[email protected]>--- drivers/staging/fsl-mc/bus/dpio/dpio-driver.c | 49 +++++++++++++++++++-------- 1 file changed, 34 insertions(+), 15 deletions(-)drivers/staging/fsl-mc/bus/dpio/dpio-driver.c +7
-7@@ -28,6 +28,7 @@ MODULE_DESCRIPTION("DPIO Driver");struct dpio_priv {struct dpaa2_io *io; +struct dpaa2_io_desc desc; };static irqreturn_t dpio_irq_handler (int irq_num,void *arg)@@ -85,7 +86,6 @@ static int register_dpio_irq_handlers(struct fsl_mc_device *dpio_dev, int cpu)static int dpaa2_dpio_probe (struct fsl_mc_device *dpio_dev) {struct dpio_attr dpio_attrs; -struct dpaa2_io_desc desc;struct dpio_priv *priv;int err = -ENOMEM ;struct device *dev = &dpio_dev->dev;@@ -117,7 +117,7 @@ static int dpaa2_dpio_probe(struct fsl_mc_device *dpio_dev)dev_err (dev,"dpio_get_attributes() failed %d\n" , err); goto err_get_attr; } - desc.qman_version = dpio_attrs.qbman_version; + priv->desc.qman_version = dpio_attrs.qbman_version; err =dpio_enable (dpio_dev->mc_io,0 , dpio_dev->mc_handle);if (err) {@@ -126,9 +126,9 @@ static int dpaa2_dpio_probe(struct fsl_mc_device *dpio_dev) }/* initialize DPIO descriptor */ - desc.receives_notifications = dpio_attrs.num_priorities ?1 :0 ; - desc.has_8prio = dpio_attrs.num_priorities ==8 ?1 :0 ; - desc.dpio_id = dpio_dev->obj_desc.id; + priv->desc.receives_notifications = dpio_attrs.num_priorities ?1 :0 ; + priv->desc.has_8prio = dpio_attrs.num_priorities ==8 ?1 :0 ; + priv->desc.dpio_id = dpio_dev->obj_desc.id;/* get the cpu to use for the affinity hint */ if (next_cpu ==-1 )@@ -139,19 +139,28 @@ static int dpaa2_dpio_probe(struct fsl_mc_device *dpio_dev)if (!cpu_possible (next_cpu)) {dev_err (dev,"probe failed. Number of DPIOs exceeds NR_CPUS.\n" ); err = -ERANGE ; - goto err_allocate_irqs; + goto err_too_many_cpu; } - desc.cpu = next_cpu; + priv->desc.cpu = next_cpu;
Quoted 14 lines
drivers/staging/fsl-mc/bus/dpio/dpio-driver.c static int dpaa2_dpio_probe(struct fsl_mc_device *dpio_dev) · line 152
Quoted 12 lines
drivers/staging/fsl-mc/bus/dpio/dpio-driver.c +3
-5/* * Set the CENA regs to be the cache inhibited area of the portal to * avoid coherency issues if a user migrates to another core. */ - desc.regs_cena =memremap (dpio_dev->regions[1 ].start, -resource_size (&dpio_dev->regions[1 ]), -MEMREMAP_WC ); - desc.regs_cinh =ioremap (dpio_dev->regions[1 ].start, -resource_size (&dpio_dev->regions[1 ])); + priv->desc.regs_cena =memremap (dpio_dev->regions[1 ].start, +resource_size (&dpio_dev->regions[1 ]), +MEMREMAP_WC );Since you already have some devres-managed resources in this driver, maybe use
devm_memremap? (and perhaps convert the existing ioremap too)
That would make since - will do.
Quoted 47 lines
Quoted 39 lines
drivers/staging/fsl-mc/bus/dpio/dpio-driver.c +14
-3+if (!priv->desc.regs_cena) { +dev_err (dev,"memremap failed\n" ); + goto err_too_many_cpu; + } + + priv->desc.regs_cinh =ioremap (dpio_dev->regions[1 ].start, +resource_size (&dpio_dev->regions[1 ])); +if (!priv->desc.regs_cinh) { +dev_err (dev,"ioremap failed\n" ); + goto err_ioremap_failed; + } err =fsl_mc_allocate_irqs (dpio_dev);if (err) {@@ -159,11 +168,11 @@ static int dpaa2_dpio_probe(struct fsl_mc_device *dpio_dev) goto err_allocate_irqs; } - err =register_dpio_irq_handlers (dpio_dev, desc.cpu); + err =register_dpio_irq_handlers (dpio_dev, priv->desc.cpu);if (err) goto err_register_dpio_irq; - priv->io =dpaa2_io_create (&desc); + priv->io =dpaa2_io_create (&priv->desc);if (!priv->io) {dev_err (dev,"dpaa2_io_create failed\n" ); goto err_dpaa2_io_create;@@ -171,7 +180,7 @@ static int dpaa2_dpio_probe(struct fsl_mc_device *dpio_dev)dev_info (dev,"probed\n" );dev_dbg (dev," receives_notifications = %d\n" , - desc.receives_notifications); + priv->desc.receives_notifications);dpio_close (dpio_dev->mc_io,0 , dpio_dev->mc_handle);fsl_mc_portal_free (dpio_dev->mc_io);drivers/staging/fsl-mc/bus/dpio/dpio-driver.c static int dpaa2_dpio_probe(struct fsl_mc_device *dpio_dev) · line 196
Quoted 6 lines
drivers/staging/fsl-mc/bus/dpio/dpio-driver.c +3
-0@@ -182,6 +191,10 @@ static int dpaa2_dpio_probe(struct fsl_mc_device *dpio_dev) err_register_dpio_irq:fsl_mc_free_irqs (dpio_dev); err_allocate_irqs: +iounmap (priv->desc.regs_cinh); +err_ioremap_failed: +memunmap (priv->desc.regs_cena);...then you wouldn't need to worry about this.
Quoted 12 lines
drivers/staging/fsl-mc/bus/dpio/dpio-driver.c static int dpaa2_dpio_probe(struct fsl_mc_device *dpio_dev) · line 205
Quoted 9 lines
drivers/staging/fsl-mc/bus/dpio/dpio-driver.c +2
-0+err_too_many_cpu:dpio_disable (dpio_dev->mc_io,0 , dpio_dev->mc_handle); err_get_attr:dpio_close (dpio_dev->mc_io,0 , dpio_dev->mc_handle);@@ -189,6 +202,7 @@ static int dpaa2_dpio_probe(struct fsl_mc_device *dpio_dev)fsl_mc_portal_free (dpio_dev->mc_io); err_mcportal:dev_set_drvdata (dev,NULL ); +devm_kfree (dev, priv);The whole point of devm_* is that you don't need to do this - the devres entries are freed automatically by the driver core upon probe failure or driver detach, i.e. priv was never leaking.
Right - Not sure what I was thinking yesterday. I think I saw the alloc without free and instinctively
added it.? I will remove this.
Quoted 13 lines
Quoted 13 lines
drivers/staging/fsl-mc/bus/dpio/dpio-driver.c +3
-0err_priv_alloc:return err; }@@ -230,8 +244,13 @@ static int dpaa2_dpio_remove(struct fsl_mc_device *dpio_dev)dpio_close (dpio_dev->mc_io,0 , dpio_dev->mc_handle); +iounmap (priv->desc.regs_cinh); +memunmap (priv->desc.regs_cena); +fsl_mc_portal_free (dpio_dev->mc_io);
Quoted 7 lines
drivers/staging/fsl-mc/bus/dpio/dpio-driver.c static int dpaa2_dpio_remove(struct fsl_mc_device *dpio_dev) · line 254
Quoted 3 lines
drivers/staging/fsl-mc/bus/dpio/dpio-driver.c +2
-0+devm_kfree (dev, priv); +dev_set_drvdata (dev,NULL );Note that clearing drvdata is something else the driver core already does at about the same time as cleaning up devres entries (see
__device_release_driver()and the failure path ofreally_probe(), indrivers/base/dd.c), so this has been similarly superfluous all along.
Yes I'll clean this up too.? Thanks for the comments, this will make things better for sure.
Quoted 3 lines
Robin.
PATCH v3 3/4 staging:fsl-mc: Move DPIO from staging to drivers/soc/fsl
In reply to Roy PledgeMove the NXP DPIO (Datapath I/O Driver) out of the drivers/staging directory and into the drivers/soc/fsl directory.
The DPIO driver enables access to Queue and Buffer Manager (QBMAN) hardware on NXP DPAA2 devices. This is a prerequisite to moving the DPAA2 Ethernet driver out of staging.
---
MAINTAINERS | 2 +-
drivers/crypto/caam/sg_sw_qm2.h | 2 +-
drivers/crypto/caam/sg_sw_sec4.h | 2 +-
drivers/soc/fsl/Kconfig | 10 ++++++++++
drivers/soc/fsl/Makefile | 1 +
drivers/{staging/fsl-mc/bus => soc/fsl}/dpio/Makefile | 0
drivers/{staging/fsl-mc/bus => soc/fsl}/dpio/dpio-cmd.h | 0
drivers/{staging/fsl-mc/bus => soc/fsl}/dpio/dpio-driver.c | 2 +-
drivers/{staging/fsl-mc/bus => soc/fsl}/dpio/dpio-driver.txt | 0
drivers/{staging/fsl-mc/bus => soc/fsl}/dpio/dpio-service.c | 2 +-
drivers/{staging/fsl-mc/bus => soc/fsl}/dpio/dpio.c | 0
drivers/{staging/fsl-mc/bus => soc/fsl}/dpio/dpio.h | 0
drivers/{staging/fsl-mc/bus => soc/fsl}/dpio/qbman-portal.c | 2 +-
drivers/{staging/fsl-mc/bus => soc/fsl}/dpio/qbman-portal.h | 2 +-
drivers/staging/fsl-dpaa2/ethernet/dpaa2-eth.h | 4 ++--
drivers/staging/fsl-mc/bus/Kconfig | 9 ---------
drivers/staging/fsl-mc/bus/Makefile | 2 --
{drivers/staging/fsl-mc/include => include/soc/fsl}/dpaa2-fd.h | 0
.../staging/fsl-mc/include => include/soc/fsl}/dpaa2-global.h | 0
{drivers/staging/fsl-mc/include => include/soc/fsl}/dpaa2-io.h | 0
20 files changed, 20 insertions(+), 20 deletions(-)
rename drivers/{staging/fsl-mc/bus => soc/fsl}/dpio/Makefile (100%)
rename drivers/{staging/fsl-mc/bus => soc/fsl}/dpio/dpio-cmd.h (100%)
rename drivers/{staging/fsl-mc/bus => soc/fsl}/dpio/dpio-driver.c (99%)
rename drivers/{staging/fsl-mc/bus => soc/fsl}/dpio/dpio-driver.txt (100%)
rename drivers/{staging/fsl-mc/bus => soc/fsl}/dpio/dpio-service.c (99%)
rename drivers/{staging/fsl-mc/bus => soc/fsl}/dpio/dpio.c (100%)
rename drivers/{staging/fsl-mc/bus => soc/fsl}/dpio/dpio.h (100%)
rename drivers/{staging/fsl-mc/bus => soc/fsl}/dpio/qbman-portal.c (99%)
rename drivers/{staging/fsl-mc/bus => soc/fsl}/dpio/qbman-portal.h (99%)
rename {drivers/staging/fsl-mc/include => include/soc/fsl}/dpaa2-fd.h (100%)
rename {drivers/staging/fsl-mc/include => include/soc/fsl}/dpaa2-global.h (100%)
rename {drivers/staging/fsl-mc/include => include/soc/fsl}/dpaa2-io.h (100%)MAINTAINERS +1 -1
@@ -4375,7 +4375,7 @@ DPAA2 DATAPATH I/O (DPIO) DRIVER M: Roy Pledge <[email protected]> L: linux-kernel at vger.kernel.org S: Maintained -F: drivers/staging/fsl-mc/bus/dpio +F: drivers/soc/fsl/dpio DPAA2 ETHERNET DRIVER M: Ioana Radulescu <[email protected]>
drivers/crypto/caam/sg_sw_qm2.h +1 -1
@@ -35,7 +35,7 @@#ifndef _SG_SW_QM2_H_#define _SG_SW_QM2_H_ -#include "../../../drivers/staging/fsl-mc/include/dpaa2-fd.h" +#include <soc/fsl/dpaa2-fd.h> static inline void dma_to_qm_sg_one (struct dpaa2_sg_entry *qm_sg_ptr,dma_addr_t dma,u32 len,u16 offset)
drivers/crypto/caam/sg_sw_sec4.h +1 -1
@@ -12,7 +12,7 @@#include "ctrl.h" #include "regs.h" #include "sg_sw_qm2.h" -#include "../../../drivers/staging/fsl-mc/include/dpaa2-fd.h" +#include <soc/fsl/dpaa2-fd.h> struct sec4_sg_entry {u64 ptr;
drivers/soc/fsl/Kconfig +10 -0
@@ -16,3 +16,13 @@ config FSL_GUTS Initially only reading SVR and registering soc device are supported. Other guts accesses, such as reading RCW, should eventually be moved into this driver as well. + +config FSL_MC_DPIO + tristate "QorIQ DPAA2 DPIO driver" + depends on FSL_MC_BUS + help + Driver for the DPAA2 DPIO object. A DPIO provides queue and + buffer management facilities for software to interact with + other DPAA2 objects. This driver does not expose the DPIO + objects individually, but groups them under a service layer + API.
drivers/soc/fsl/Makefile +1 -0
@@ -6,3 +6,4 @@ obj-$(CONFIG_FSL_DPAA) += qbman/ obj-$(CONFIG_QUICC_ENGINE) += qe/ obj-$(CONFIG_CPM) += qe/ obj-$(CONFIG_FSL_GUTS) += guts.o +obj-$(CONFIG_FSL_MC_DPIO) += dpio/
drivers/soc/fsl/dpio/Makefile renamed from drivers/staging/fsl-mc/bus/dpio/Makefile +0 -0
drivers/soc/fsl/dpio/dpio-cmd.h renamed from drivers/staging/fsl-mc/bus/dpio/dpio-cmd.h +0 -0
drivers/soc/fsl/dpio/dpio-driver.c renamed from drivers/staging/fsl-mc/bus/dpio/dpio-driver.c +1 -1
@@ -16,7 +16,7 @@#include <linux/io.h> #include <linux/fsl/mc.h> -#include "../../include/dpaa2-io.h" +#include <soc/fsl/dpaa2-io.h> #include "qbman-portal.h" #include "dpio.h"
drivers/soc/fsl/dpio/dpio-driver.txt renamed from drivers/staging/fsl-mc/bus/dpio/dpio-driver.txt +0 -0
drivers/soc/fsl/dpio/dpio-service.c renamed from drivers/staging/fsl-mc/bus/dpio/dpio-service.c +1 -1
@@ -6,7 +6,7 @@*/ #include <linux/types.h> #include <linux/fsl/mc.h> -#include "../../include/dpaa2-io.h" +#include <soc/fsl/dpaa2-io.h> #include <linux/init.h> #include <linux/module.h> #include <linux/platform_device.h>
drivers/soc/fsl/dpio/dpio.c renamed from drivers/staging/fsl-mc/bus/dpio/dpio.c +0 -0
drivers/soc/fsl/dpio/dpio.h renamed from drivers/staging/fsl-mc/bus/dpio/dpio.h +0 -0
drivers/soc/fsl/dpio/qbman-portal.c renamed from drivers/staging/fsl-mc/bus/dpio/qbman-portal.c +1 -1
@@ -8,7 +8,7 @@#include <asm/cacheflush.h> #include <linux/io.h> #include <linux/slab.h> -#include "../../include/dpaa2-global.h" +#include <soc/fsl/dpaa2-global.h> #include "qbman-portal.h"
drivers/soc/fsl/dpio/qbman-portal.h renamed from drivers/staging/fsl-mc/bus/dpio/qbman-portal.h +1 -1
@@ -7,7 +7,7 @@#ifndef __FSL_QBMAN_PORTAL_H#define __FSL_QBMAN_PORTAL_H -#include "../../include/dpaa2-fd.h" +#include <soc/fsl/dpaa2-fd.h> struct dpaa2_dq ;struct qbman_swp ;
drivers/staging/fsl-dpaa2/ethernet/dpaa2-eth.h +2 -2
@@ -37,8 +37,8 @@#include <linux/if_vlan.h> #include <linux/fsl/mc.h> -#include "../../fsl-mc/include/dpaa2-io.h" -#include "../../fsl-mc/include/dpaa2-fd.h" +#include <soc/fsl/dpaa2-io.h> +#include <soc/fsl/dpaa2-fd.h> #include "dpni.h" #include "dpni-cmd.h"
drivers/staging/fsl-mc/bus/Kconfig +0 -9
@@ -5,12 +5,3 @@ # Copyright (C) 2014-2016 Freescale Semiconductor, Inc. # -config FSL_MC_DPIO - tristate "QorIQ DPAA2 DPIO driver" - depends on FSL_MC_BUS - help - Driver for the DPAA2 DPIO object. A DPIO provides queue and - buffer management facilities for software to interact with - other DPAA2 objects. This driver does not expose the DPIO - objects individually, but groups them under a service layer - API.
drivers/staging/fsl-mc/bus/Makefile +0 -2
@@ -5,5 +5,3 @@ # Copyright (C) 2014 Freescale Semiconductor, Inc. # -# MC DPIO driver -obj-$(CONFIG_FSL_MC_DPIO) += dpio/
include/soc/fsl/dpaa2-fd.h renamed from drivers/staging/fsl-mc/include/dpaa2-fd.h +0 -0
include/soc/fsl/dpaa2-global.h renamed from drivers/staging/fsl-mc/include/dpaa2-global.h +0 -0
include/soc/fsl/dpaa2-io.h renamed from drivers/staging/fsl-mc/include/dpaa2-io.h +0 -0
Signature · 1 line
2.7.4
PATCH v3 4/4 drivers/staging: Remove fsl-mc driver from staging
In reply to Roy PledgeRemove the staging/drivers/fsl-mc directory from the staging area now that all the components have been moved to the main kernel areas.
--- drivers/staging/Kconfig | 2 -- drivers/staging/Makefile | 1 - drivers/staging/fsl-mc/Kconfig | 2 -- drivers/staging/fsl-mc/Makefile | 3 --- drivers/staging/fsl-mc/bus/Kconfig | 7 ------- drivers/staging/fsl-mc/bus/Makefile | 7 ------- 6 files changed, 22 deletions(-) delete mode 100644 drivers/staging/fsl-mc/Kconfig delete mode 100644 drivers/staging/fsl-mc/Makefile delete mode 100644 drivers/staging/fsl-mc/bus/Kconfig delete mode 100644 drivers/staging/fsl-mc/bus/Makefile
drivers/staging/Kconfig +0 -2
@@ -98,8 +98,6 @@ source "drivers/staging/clocking-wizard/Kconfig" source "drivers/staging/fbtft/Kconfig" -source "drivers/staging/fsl-mc/Kconfig" - source "drivers/staging/fsl-dpaa2/Kconfig" source "drivers/staging/wilc1000/Kconfig"
drivers/staging/Makefile +0 -1
@@ -40,7 +40,6 @@ obj-$(CONFIG_CRYPTO_SKEIN) += skein/ obj-$(CONFIG_UNISYSSPAR) += unisys/ obj-$(CONFIG_COMMON_CLK_XLNX_CLKWZRD) += clocking-wizard/ obj-$(CONFIG_FB_TFT) += fbtft/ -obj-$(CONFIG_FSL_MC_BUS) += fsl-mc/ obj-$(CONFIG_FSL_DPAA2) += fsl-dpaa2/ obj-$(CONFIG_WILC1000) += wilc1000/ obj-$(CONFIG_MOST) += most/
drivers/staging/fsl-mc/Kconfig deleted +0 -2
@@ -1,2 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0 -source "drivers/staging/fsl-mc/bus/Kconfig"
drivers/staging/fsl-mc/Makefile deleted +0 -3
@@ -1,3 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0 -# Freescale Management Complex (MC) bus drivers -obj-$(CONFIG_FSL_MC_BUS) += bus/
drivers/staging/fsl-mc/bus/Kconfig deleted +0 -7
@@ -1,7 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0 -# -# DPAA2 fsl-mc bus -# -# Copyright (C) 2014-2016 Freescale Semiconductor, Inc. -# -
drivers/staging/fsl-mc/bus/Makefile deleted +0 -7
@@ -1,7 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0 -# -# Freescale Management Complex (MC) bus drivers -# -# Copyright (C) 2014 Freescale Semiconductor, Inc. -# -
Signature · 1 line
2.7.4