linux-media.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Marc Gonzalez <marc.w.gonzalez@free.fr>
To: "Sean Young" <sean@mess.org>, "Brad Love" <brad@nextdimension.cc>,
	"Mauro Carvalho Chehab" <mchehab@kernel.org>,
	"Jonathan Neuschäfer" <j.neuschaefer@gmx.net>
Cc: linux-media <linux-media@vger.kernel.org>,
	LKML <linux-kernel@vger.kernel.org>,
	Bjorn Andersson <bjorn.andersson@linaro.org>,
	Guenter Roeck <linux@roeck-us.net>
Subject: [PATCH v2] media: dvb: Provide 4 devm variants
Date: Tue, 16 Jul 2019 10:56:12 +0200	[thread overview]
Message-ID: <568760ff-08d8-6e7f-df35-cf76d4fcf945@free.fr> (raw)

Provide devm variants for automatic resource release on device removal.
Makes error-handling in probe() much simpler, thus less error-prone.
And once all resources are devmanaged, remove() is no longer needed.

Signed-off-by: Marc Gonzalez <marc.w.gonzalez@free.fr>
---
Changes from v1:
x Simplify devm_dvb_register_adapter() implementation
x Add 3 more devm APIs
x Document them in devres.rst
---
 Documentation/driver-model/devres.rst |  6 ++++++
 drivers/media/dvb-core/dmxdev.c       | 13 +++++++++++++
 drivers/media/dvb-core/dvb_demux.c    | 13 +++++++++++++
 drivers/media/dvb-core/dvb_frontend.c | 13 +++++++++++++
 drivers/media/dvb-core/dvbdev.c       | 12 ++++++++++++
 include/media/dmxdev.h                |  3 +++
 include/media/dvb_demux.h             |  2 ++
 include/media/dvb_frontend.h          |  3 +++
 include/media/dvbdev.h                |  3 +++
 9 files changed, 68 insertions(+)

diff --git a/Documentation/driver-model/devres.rst b/Documentation/driver-model/devres.rst
index a100bef54952..1b6ced8e4294 100644
--- a/Documentation/driver-model/devres.rst
+++ b/Documentation/driver-model/devres.rst
@@ -265,6 +265,12 @@ DMA
 DRM
   devm_drm_dev_init()
 
+DVB
+  devm_dvb_register_adapter()
+  devm_dvb_register_frontend()
+  devm_dvb_dmx_init()
+  devm_dvb_dmxdev_init()
+
 GPIO
   devm_gpiod_get()
   devm_gpiod_get_index()
diff --git a/drivers/media/dvb-core/dmxdev.c b/drivers/media/dvb-core/dmxdev.c
index f14a872d1268..f38b65d1b430 100644
--- a/drivers/media/dvb-core/dmxdev.c
+++ b/drivers/media/dvb-core/dmxdev.c
@@ -1444,6 +1444,19 @@ int dvb_dmxdev_init(struct dmxdev *dmxdev, struct dvb_adapter *dvb_adapter)
 
 EXPORT_SYMBOL(dvb_dmxdev_init);
 
+static void dmxdev_release(void *dmxdev)
+{
+	dvb_dmxdev_release(dmxdev);
+}
+
+int devm_dvb_dmxdev_init(struct device *dev, struct dmxdev *dmxdev,
+		struct dvb_adapter *dvb_adapter)
+{
+	int rc = dvb_dmxdev_init(dmxdev, dvb_adapter);
+	return rc ? : devm_add_action_or_reset(dev, dmxdev_release, dmxdev);
+}
+EXPORT_SYMBOL(devm_dvb_dmxdev_init);
+
 void dvb_dmxdev_release(struct dmxdev *dmxdev)
 {
 	dmxdev->exit = 1;
diff --git a/drivers/media/dvb-core/dvb_demux.c b/drivers/media/dvb-core/dvb_demux.c
index 39a2c6ccf31d..55b9675b99c5 100644
--- a/drivers/media/dvb-core/dvb_demux.c
+++ b/drivers/media/dvb-core/dvb_demux.c
@@ -28,6 +28,7 @@
 #include <linux/string.h>
 #include <linux/crc32.h>
 #include <linux/uaccess.h>
+#include <linux/device.h>
 #include <asm/div64.h>
 
 #include <media/dvb_demux.h>
@@ -1317,6 +1318,18 @@ int dvb_dmx_init(struct dvb_demux *dvbdemux)
 
 EXPORT_SYMBOL(dvb_dmx_init);
 
+static void dmx_release(void *dvbdemux)
+{
+	dvb_dmx_release(dvbdemux);
+}
+
+int devm_dvb_dmx_init(struct device *dev, struct dvb_demux *dvbdemux)
+{
+	int rc = dvb_dmx_init(dvbdemux);
+	return rc ? : devm_add_action_or_reset(dev, dmx_release, dvbdemux);
+}
+EXPORT_SYMBOL(devm_dvb_dmx_init);
+
 void dvb_dmx_release(struct dvb_demux *dvbdemux)
 {
 	vfree(dvbdemux->cnt_storage);
diff --git a/drivers/media/dvb-core/dvb_frontend.c b/drivers/media/dvb-core/dvb_frontend.c
index 209186c5cd9b..4a281cd8c064 100644
--- a/drivers/media/dvb-core/dvb_frontend.c
+++ b/drivers/media/dvb-core/dvb_frontend.c
@@ -3007,6 +3007,19 @@ int dvb_register_frontend(struct dvb_adapter *dvb,
 }
 EXPORT_SYMBOL(dvb_register_frontend);
 
+static void unregister_frontend(void *fe)
+{
+	dvb_unregister_frontend(fe);
+}
+
+int devm_dvb_register_frontend(struct device *dev,
+		struct dvb_adapter *dvb, struct dvb_frontend *fe)
+{
+	int rc = dvb_register_frontend(dvb, fe);
+	return rc ? : devm_add_action_or_reset(dev, unregister_frontend, fe);
+}
+EXPORT_SYMBOL(devm_dvb_register_frontend);
+
 int dvb_unregister_frontend(struct dvb_frontend *fe)
 {
 	struct dvb_frontend_private *fepriv = fe->frontend_priv;
diff --git a/drivers/media/dvb-core/dvbdev.c b/drivers/media/dvb-core/dvbdev.c
index a3393cd4e584..7d007bcc2abb 100644
--- a/drivers/media/dvb-core/dvbdev.c
+++ b/drivers/media/dvb-core/dvbdev.c
@@ -885,6 +885,18 @@ int dvb_register_adapter(struct dvb_adapter *adap, const char *name,
 }
 EXPORT_SYMBOL(dvb_register_adapter);
 
+static void unregister_adapter(void *adap)
+{
+	dvb_unregister_adapter(adap);
+}
+
+int devm_dvb_register_adapter(struct device *dev, struct dvb_adapter *adap,
+		const char *name, struct module *module, short *adapter_nums)
+{
+	int rc = dvb_register_adapter(adap, name, module, dev, adapter_nums);
+	return rc ? : devm_add_action_or_reset(dev, unregister_adapter, adap);
+}
+EXPORT_SYMBOL(devm_dvb_register_adapter);
 
 int dvb_unregister_adapter(struct dvb_adapter *adap)
 {
diff --git a/include/media/dmxdev.h b/include/media/dmxdev.h
index baafa3b8aca4..0300d829aeea 100644
--- a/include/media/dmxdev.h
+++ b/include/media/dmxdev.h
@@ -204,6 +204,9 @@ struct dmxdev {
  */
 int dvb_dmxdev_init(struct dmxdev *dmxdev, struct dvb_adapter *adap);
 
+int devm_dvb_dmxdev_init(struct device *dev, struct dmxdev *dmxdev,
+		struct dvb_adapter *dvb_adapter);
+
 /**
  * dvb_dmxdev_release - releases a digital TV demux and unregisters it.
  *
diff --git a/include/media/dvb_demux.h b/include/media/dvb_demux.h
index 3b6aeca7a49e..95fe901076d7 100644
--- a/include/media/dvb_demux.h
+++ b/include/media/dvb_demux.h
@@ -266,6 +266,8 @@ struct dvb_demux {
  */
 int dvb_dmx_init(struct dvb_demux *demux);
 
+int devm_dvb_dmx_init(struct device *dev, struct dvb_demux *demux);
+
 /**
  * dvb_dmx_release - releases a digital TV demux internal buffers.
  *
diff --git a/include/media/dvb_frontend.h b/include/media/dvb_frontend.h
index f05cd7b94a2c..56dbaf3cc7a9 100644
--- a/include/media/dvb_frontend.h
+++ b/include/media/dvb_frontend.h
@@ -713,6 +713,9 @@ struct dvb_frontend {
 int dvb_register_frontend(struct dvb_adapter *dvb,
 				 struct dvb_frontend *fe);
 
+int devm_dvb_register_frontend(struct device *dev,
+		struct dvb_adapter *dvb, struct dvb_frontend *fe);
+
 /**
  * dvb_unregister_frontend() - Unregisters a DVB frontend
  *
diff --git a/include/media/dvbdev.h b/include/media/dvbdev.h
index 551325858de3..32f8d1626319 100644
--- a/include/media/dvbdev.h
+++ b/include/media/dvbdev.h
@@ -202,6 +202,9 @@ int dvb_register_adapter(struct dvb_adapter *adap, const char *name,
 			 struct module *module, struct device *device,
 			 short *adapter_nums);
 
+int devm_dvb_register_adapter(struct device *dev, struct dvb_adapter *adap,
+		const char *name, struct module *module, short *adapter_nums);
+
 /**
  * dvb_unregister_adapter - Unregisters a DVB adapter
  *
-- 
2.17.1

             reply	other threads:[~2019-07-16  8:56 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-07-16  8:56 Marc Gonzalez [this message]
2019-07-18  9:38 ` [PATCH v2] media: dvb: Provide 4 devm variants Marc Gonzalez

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=568760ff-08d8-6e7f-df35-cf76d4fcf945@free.fr \
    --to=marc.w.gonzalez@free.fr \
    --cc=bjorn.andersson@linaro.org \
    --cc=brad@nextdimension.cc \
    --cc=j.neuschaefer@gmx.net \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-media@vger.kernel.org \
    --cc=linux@roeck-us.net \
    --cc=mchehab@kernel.org \
    --cc=sean@mess.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).