From patchwork Thu May 9 12:52:44 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrzej Hajda X-Patchwork-Id: 18350 Received: from mail.tu-berlin.de ([130.149.7.33]) by www.linuxtv.org with esmtp (Exim 4.72) (envelope-from ) id 1UaQMj-00022s-0l; Thu, 09 May 2013 14:54:33 +0200 X-tubIT-Incoming-IP: 209.132.180.67 Received: from vger.kernel.org ([209.132.180.67]) by mail.tu-berlin.de (exim-4.72/mailfrontend-5) with esmtp id 1UaQMh-0002Fl-6Z; Thu, 09 May 2013 14:54:32 +0200 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754943Ab3EIMy3 (ORCPT + 1 other); Thu, 9 May 2013 08:54:29 -0400 Received: from mailout4.w1.samsung.com ([210.118.77.14]:57702 "EHLO mailout4.w1.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754154Ab3EIMyU (ORCPT ); Thu, 9 May 2013 08:54:20 -0400 Received: from eucpsbgm2.samsung.com (unknown [203.254.199.245]) by mailout4.w1.samsung.com (Oracle Communications Messaging Server 7u4-24.01(7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0MMJ0003P7U99M10@mailout4.w1.samsung.com> for linux-media@vger.kernel.org; Thu, 09 May 2013 13:54:18 +0100 (BST) X-AuditID: cbfec7f5-b7fa36d000007f20-4f-518b9c7acbbc Received: from eusync4.samsung.com ( [203.254.199.214]) by eucpsbgm2.samsung.com (EUCPMTA) with SMTP id C2.20.32544.A7C9B815; Thu, 09 May 2013 13:54:18 +0100 (BST) Received: from AMDC1061.digital.local ([106.116.147.88]) by eusync4.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTPA id <0MMJ00D7R7UBUA60@eusync4.samsung.com>; Thu, 09 May 2013 13:54:18 +0100 (BST) From: Andrzej Hajda To: linux-media@vger.kernel.org Cc: Laurent Pinchart , Sylwester Nawrocki , Sakari Ailus , Kyungmin Park , hj210.choi@samsung.com, sw0312.kim@samsung.com, Andrzej Hajda Subject: [PATCH RFC 3/3] media: added managed v4l2 subdevice initialization Date: Thu, 09 May 2013 14:52:44 +0200 Message-id: <1368103965-15232-4-git-send-email-a.hajda@samsung.com> X-Mailer: git-send-email 1.7.10.4 In-reply-to: <1368103965-15232-1-git-send-email-a.hajda@samsung.com> References: <1368103965-15232-1-git-send-email-a.hajda@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrGJMWRmVeSWpSXmKPExsVy+t/xa7pVc7oDDZZd17S4te4cq8XjjdeY Lc42vWG36Jy4hN2iZ8NWVovDb9pZLc7sX8lmMWPySzYHDo/ZHTNZPQ5/Xcji0bdlFaPH501y ASxRXDYpqTmZZalF+nYJXBmbZ3xlKXisVfFxzWPGBsbvyl2MnBwSAiYSXV93sUPYYhIX7q1n 62Lk4hASWMoo0bfgBZTTxyTxaudmNpAqNgFNib+bb4LZIgLyEk96b4AVMQtMZJK4+ncZWEJY wFti9pP1rCA2i4CqxPxpf5m6GDk4eAWcJTomFEFsU5TofjYBrJxTwEWi/84/MFsIqOTRsXmM Exh5FzAyrGIUTS1NLihOSs810itOzC0uzUvXS87P3cQICauvOxiXHrM6xCjAwajEw5uZ2BUo xJpYVlyZe4hRgoNZSYR3c0d3oBBvSmJlVWpRfnxRaU5q8SFGJg5OqQbGScf+RKRv1ty0kZGx X3FCwBuPTROyvG9nW/5OC7p94lZMhPNFzRzj0H2FPWvevD6+XX7fxSjPGfor2BdLbBX6Hn/h 88a0pvJAqzvddkFzAjas3iBUujaKI3+ebfZjmZvRT2T8vQ+syqpJkE1Ky5jwYRuPlHMBc8Hp F6fEJnS+W7xq9pO81etVlViKMxINtZiLihMBvYsWYgkCAAA= Sender: linux-media-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.org X-PMX-Version: 6.0.0.2142326, Antispam-Engine: 2.7.2.2107409, Antispam-Data: 2013.5.9.124529 X-PMX-Spam: Gauge=IIIIIIIII, Probability=9%, Report=' HTML_NO_HTTP 0.1, MULTIPLE_RCPTS 0.1, HTML_00_10 0.05, BODY_SIZE_5000_5999 0, BODY_SIZE_7000_LESS 0, URI_ENDS_IN_HTML 0, __ANY_URI 0, __CP_URI_IN_BODY 0, __HAS_FROM 0, __HAS_HTML 0, __HAS_MSGID 0, __HAS_X_MAILER 0, __HAS_X_MAILING_LIST 0, __IN_REP_TO 0, __MIME_TEXT_ONLY 0, __MULTIPLE_RCPTS_CC_X2 0, __SANE_MSGID 0, __TO_MALFORMED_2 0, __TO_NO_NAME 0, __URI_NO_WWW 0, __URI_NS ' This patch adds managed versions of initialization functions for v4l2 subdevices. Signed-off-by: Andrzej Hajda Reviewed-by: Sylwester Nawrocki Signed-off-by: Kyungmin Park --- drivers/media/v4l2-core/v4l2-common.c | 10 +++++++ drivers/media/v4l2-core/v4l2-subdev.c | 52 +++++++++++++++++++++++++++++++++ include/media/v4l2-common.h | 2 ++ include/media/v4l2-ctrls.h | 7 +++-- include/media/v4l2-subdev.h | 5 ++++ 5 files changed, 74 insertions(+), 2 deletions(-) diff --git a/drivers/media/v4l2-core/v4l2-common.c b/drivers/media/v4l2-core/v4l2-common.c index 614316f..714d07c 100644 --- a/drivers/media/v4l2-core/v4l2-common.c +++ b/drivers/media/v4l2-core/v4l2-common.c @@ -302,7 +302,17 @@ void v4l2_i2c_subdev_init(struct v4l2_subdev *sd, struct i2c_client *client, } EXPORT_SYMBOL_GPL(v4l2_i2c_subdev_init); +int devm_v4l2_i2c_subdev_init(struct v4l2_subdev *sd, struct i2c_client *client, + const struct v4l2_subdev_ops *ops) +{ + int ret; + ret = devm_v4l2_subdev_bind(&client->dev, sd); + if (!ret) + v4l2_i2c_subdev_init(sd, client, ops); + return ret; +} +EXPORT_SYMBOL_GPL(devm_v4l2_i2c_subdev_init); /* Load an i2c sub-device. */ struct v4l2_subdev *v4l2_i2c_new_subdev_board(struct v4l2_device *v4l2_dev, diff --git a/drivers/media/v4l2-core/v4l2-subdev.c b/drivers/media/v4l2-core/v4l2-subdev.c index 996c248..87ce2f6 100644 --- a/drivers/media/v4l2-core/v4l2-subdev.c +++ b/drivers/media/v4l2-core/v4l2-subdev.c @@ -474,3 +474,55 @@ void v4l2_subdev_init(struct v4l2_subdev *sd, const struct v4l2_subdev_ops *ops) #endif } EXPORT_SYMBOL(v4l2_subdev_init); + +static void devm_v4l2_subdev_release(struct device *dev, void *res) +{ + struct v4l2_subdev **sd = res; + + v4l2_device_unregister_subdev(*sd); +#if defined(CONFIG_MEDIA_CONTROLLER) + media_entity_cleanup(&(*sd)->entity); +#endif +} + +int devm_v4l2_subdev_bind(struct device *dev, struct v4l2_subdev *sd) +{ + struct v4l2_subdev **dr; + + dr = devres_alloc(devm_v4l2_subdev_release, sizeof(*dr), GFP_KERNEL); + if (!dr) + return -ENOMEM; + + *dr = sd; + devres_add(dev, dr); + + return 0; +} +EXPORT_SYMBOL(devm_v4l2_subdev_bind); + +int devm_v4l2_subdev_init(struct device *dev, struct v4l2_subdev *sd, + const struct v4l2_subdev_ops *ops) +{ + int ret; + + ret = devm_v4l2_subdev_bind(dev, sd); + if (!ret) + v4l2_subdev_init(sd, ops); + return ret; +} +EXPORT_SYMBOL(devm_v4l2_subdev_init); + +static int devm_v4l2_subdev_match(struct device *dev, void *res, + void *data) +{ + struct v4l2_subdev **this = res, **sd = data; + + return *this == *sd; +} + +void devm_v4l2_subdev_free(struct device *dev, struct v4l2_subdev *sd) +{ + WARN_ON(devres_release(dev, devm_v4l2_subdev_release, + devm_v4l2_subdev_match, &sd)); +} +EXPORT_SYMBOL_GPL(devm_v4l2_subdev_free); diff --git a/include/media/v4l2-common.h b/include/media/v4l2-common.h index ec7c9c0..440d6b7 100644 --- a/include/media/v4l2-common.h +++ b/include/media/v4l2-common.h @@ -136,6 +136,8 @@ struct v4l2_subdev *v4l2_i2c_new_subdev_board(struct v4l2_device *v4l2_dev, /* Initialize a v4l2_subdev with data from an i2c_client struct */ void v4l2_i2c_subdev_init(struct v4l2_subdev *sd, struct i2c_client *client, const struct v4l2_subdev_ops *ops); +int devm_v4l2_i2c_subdev_init(struct v4l2_subdev *sd, struct i2c_client *client, + const struct v4l2_subdev_ops *ops); /* Return i2c client address of v4l2_subdev. */ unsigned short v4l2_i2c_subdev_addr(struct v4l2_subdev *sd); diff --git a/include/media/v4l2-ctrls.h b/include/media/v4l2-ctrls.h index a1d06db..fe6dcef 100644 --- a/include/media/v4l2-ctrls.h +++ b/include/media/v4l2-ctrls.h @@ -286,7 +286,10 @@ void v4l2_ctrl_handler_free(struct v4l2_ctrl_handler *hdl); /* * devm_v4l2_ctrl_handler_init - managed control handler initialization * - * @dev: Device for which @hdl belongs to. + * @dev: Device the @hdl belongs to. + * @hdl: The control handler. + * @nr_of_controls_hint: A hint of how many controls this handler is + * expected to refer to. * * This is a managed version of v4l2_ctrl_handler_init. Handler initialized with * this function will be automatically cleaned up on driver detach. @@ -301,7 +304,7 @@ int devm_v4l2_ctrl_handler_init(struct device *dev, /** * devm_v4l2_ctrl_handler_free - managed control handler free * - * @dev: Device for which @hdl belongs to. + * @dev: Device the @hdl belongs to. * @hdl: Handler to be cleaned up. * * This function should be used to manual free of an control handler diff --git a/include/media/v4l2-subdev.h b/include/media/v4l2-subdev.h index b137a5e..0eab5b0 100644 --- a/include/media/v4l2-subdev.h +++ b/include/media/v4l2-subdev.h @@ -673,6 +673,11 @@ int v4l2_subdev_link_validate(struct media_link *link); void v4l2_subdev_init(struct v4l2_subdev *sd, const struct v4l2_subdev_ops *ops); +int devm_v4l2_subdev_bind(struct device *dev, struct v4l2_subdev *sd); +int devm_v4l2_subdev_init(struct device *dev, struct v4l2_subdev *sd, + const struct v4l2_subdev_ops *ops); +void devm_v4l2_subdev_free(struct device *dev, struct v4l2_subdev *sd); + /* Call an ops of a v4l2_subdev, doing the right checks against NULL pointers.