From patchwork Mon Aug 8 19:30:40 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Robert Jarzmik X-Patchwork-Id: 36253 X-Patchwork-Delegate: hverkuil@xs4all.nl Received: from mail.tu-berlin.de ([130.149.7.33]) by www.linuxtv.org with esmtp (Exim 4.84_2) (envelope-from ) id 1bWqHf-0002d5-Uv; Mon, 08 Aug 2016 19:32:23 +0000 X-tubIT-Incoming-IP: 209.132.180.67 Received: from vger.kernel.org ([209.132.180.67]) by mail.tu-berlin.de (exim-4.84_2/mailfrontend-5) with esmtp id 1bWqHd-0004yL-9U; Mon, 08 Aug 2016 21:32:23 +0200 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932477AbcHHTb3 (ORCPT + 1 other); Mon, 8 Aug 2016 15:31:29 -0400 Received: from smtp06.smtpout.orange.fr ([80.12.242.128]:46726 "EHLO smtp.smtpout.orange.fr" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932105AbcHHTbW (ORCPT ); Mon, 8 Aug 2016 15:31:22 -0400 Received: from belgarion.home ([109.220.218.149]) by mwinf5d12 with ME id UjXJ1t0053DzaaM03jXLpu; Mon, 08 Aug 2016 21:31:20 +0200 X-ME-Helo: belgarion.home X-ME-Date: Mon, 08 Aug 2016 21:31:20 +0200 X-ME-IP: 109.220.218.149 From: Robert Jarzmik To: Mauro Carvalho Chehab , Guennadi Liakhovetski , Jiri Kosina , Hans Verkuil Cc: linux-kernel@vger.kernel.org, linux-media@vger.kernel.org, Robert Jarzmik Subject: [PATCH v3 02/14] media: mt9m111: prevent module removal while in use Date: Mon, 8 Aug 2016 21:30:40 +0200 Message-Id: <1470684652-16295-3-git-send-email-robert.jarzmik@free.fr> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1470684652-16295-1-git-send-email-robert.jarzmik@free.fr> References: <1470684652-16295-1-git-send-email-robert.jarzmik@free.fr> 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: 2016.8.8.192715 X-PMX-Spam: Gauge=IIIIIIII, Probability=8%, Report=' MULTIPLE_RCPTS 0.1, HTML_00_01 0.05, HTML_00_10 0.05, BODYTEXTP_SIZE_3000_LESS 0, BODY_SIZE_1700_1799 0, BODY_SIZE_2000_LESS 0, BODY_SIZE_5000_LESS 0, BODY_SIZE_7000_LESS 0, IN_REP_TO 0, LEGITIMATE_NEGATE 0, LEGITIMATE_SIGNS 0, MSG_THREAD 0, MULTIPLE_REAL_RCPTS 0, NO_URI_HTTPS 0, REFERENCES 0, SINGLE_URI_IN_BODY 0, URI_ENDS_IN_HTML 0, __ANY_URI 0, __CC_NAME 0, __CC_NAME_DIFF_FROM_ACC 0, __CC_REAL_NAMES 0, __CP_URI_IN_BODY 0, __FROM_DOMAIN_IN_ANY_CC2 0, __FROM_DOMAIN_IN_RCPT 0, __HAS_CC_HDR 0, __HAS_FROM 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, __REFERENCES 0, __SANE_MSGID 0, __SINGLE_URI_TEXT 0, __SUBJ_ALPHA_END 0, __TO_MALFORMED_2 0, __TO_NAME 0, __TO_NAME_DIFF_FROM_ACC 0, __TO_REAL_NAMES 0, __URI_IN_BODY 0, __URI_NO_WWW 0, __URI_NS , __URI_WITH_PATH 0' The mt9m111 can be a removable module : the only case where the module should be kept loaded is while it is used, ie. while an active transation is ongoing on it. The notion of active transaction is mapped on the power state of the module : if powered on the removal is prohibited. Signed-off-by: Robert Jarzmik --- drivers/media/i2c/soc_camera/mt9m111.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/drivers/media/i2c/soc_camera/mt9m111.c b/drivers/media/i2c/soc_camera/mt9m111.c index a7efaa5964d1..ea5b5e709402 100644 --- a/drivers/media/i2c/soc_camera/mt9m111.c +++ b/drivers/media/i2c/soc_camera/mt9m111.c @@ -780,23 +780,33 @@ static int mt9m111_power_on(struct mt9m111 *mt9m111) struct i2c_client *client = v4l2_get_subdevdata(&mt9m111->subdev); int ret; + if (!try_module_get(THIS_MODULE)) + return -ENXIO; + ret = v4l2_clk_enable(mt9m111->clk); if (ret < 0) - return ret; + goto out_module_put; ret = mt9m111_resume(mt9m111); if (ret < 0) { dev_err(&client->dev, "Failed to resume the sensor: %d\n", ret); - v4l2_clk_disable(mt9m111->clk); + goto out_clk_disable; } return ret; + +out_clk_disable: + v4l2_clk_disable(mt9m111->clk); +out_module_put: + module_put(THIS_MODULE); + return ret; } static void mt9m111_power_off(struct mt9m111 *mt9m111) { mt9m111_suspend(mt9m111); v4l2_clk_disable(mt9m111->clk); + module_put(THIS_MODULE); } static int mt9m111_s_power(struct v4l2_subdev *sd, int on)