From patchwork Thu Aug 18 14:47:09 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marco Felsch X-Patchwork-Id: 598354 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 64F32C32772 for ; Thu, 18 Aug 2022 14:47:33 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S245707AbiHROr3 (ORCPT ); Thu, 18 Aug 2022 10:47:29 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50544 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S245595AbiHROrX (ORCPT ); Thu, 18 Aug 2022 10:47:23 -0400 Received: from metis.ext.pengutronix.de (metis.ext.pengutronix.de [IPv6:2001:67c:670:201:290:27ff:fe1d:cc33]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id CA30995E70 for ; Thu, 18 Aug 2022 07:47:21 -0700 (PDT) Received: from drehscheibe.grey.stw.pengutronix.de ([2a0a:edc0:0:c01:1d::a2]) by metis.ext.pengutronix.de with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1oOgnk-0008KN-3d; Thu, 18 Aug 2022 16:47:16 +0200 Received: from [2a0a:edc0:0:1101:1d::28] (helo=dude02.red.stw.pengutronix.de) by drehscheibe.grey.stw.pengutronix.de with esmtp (Exim 4.94.2) (envelope-from ) id 1oOgnj-000X2u-DQ; Thu, 18 Aug 2022 16:47:15 +0200 Received: from mfe by dude02.red.stw.pengutronix.de with local (Exim 4.94.2) (envelope-from ) id 1oOgni-004BVV-4i; Thu, 18 Aug 2022 16:47:14 +0200 From: Marco Felsch To: mchehab@kernel.org, sakari.ailus@linux.intel.com, laurent.pinchart+renesas@ideasonboard.com, jacopo+renesas@jmondi.org, akinobu.mita@gmail.com Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, kernel@pengutronix.de Subject: [PATCH 1/4] media: mt9m111: add V4L2_CID_PIXEL_RATE support Date: Thu, 18 Aug 2022 16:47:09 +0200 Message-Id: <20220818144712.997477-1-m.felsch@pengutronix.de> X-Mailer: git-send-email 2.30.2 MIME-Version: 1.0 X-SA-Exim-Connect-IP: 2a0a:edc0:0:c01:1d::a2 X-SA-Exim-Mail-From: mfe@pengutronix.de X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-media@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.org Add support to report the PIXEL_RATE so a host or bridge device can ask the sensor. Signed-off-by: Marco Felsch --- drivers/media/i2c/mt9m111.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/drivers/media/i2c/mt9m111.c b/drivers/media/i2c/mt9m111.c index afc86efa9e3e..cdaf283e1309 100644 --- a/drivers/media/i2c/mt9m111.c +++ b/drivers/media/i2c/mt9m111.c @@ -908,6 +908,8 @@ static int mt9m111_s_ctrl(struct v4l2_ctrl *ctrl) return mt9m111_set_test_pattern(mt9m111, ctrl->val); case V4L2_CID_COLORFX: return mt9m111_set_colorfx(mt9m111, ctrl->val); + case V4L2_CID_PIXEL_RATE: + return 0; } return -EINVAL; @@ -1249,6 +1251,7 @@ static int mt9m111_probe(struct i2c_client *client) { struct mt9m111 *mt9m111; struct i2c_adapter *adapter = client->adapter; + unsigned long mclk_rate; int ret; if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_WORD_DATA)) { @@ -1271,6 +1274,13 @@ static int mt9m111_probe(struct i2c_client *client) if (IS_ERR(mt9m111->clk)) return PTR_ERR(mt9m111->clk); + ret = clk_prepare_enable(mt9m111->clk); + if (ret < 0) + return ret; + + mclk_rate = clk_get_rate(mt9m111->clk); + clk_disable_unprepare(mt9m111->clk); + mt9m111->regulator = devm_regulator_get(&client->dev, "vdd"); if (IS_ERR(mt9m111->regulator)) { dev_err(&client->dev, "regulator not found: %ld\n", @@ -1285,7 +1295,7 @@ static int mt9m111_probe(struct i2c_client *client) mt9m111->subdev.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE | V4L2_SUBDEV_FL_HAS_EVENTS; - v4l2_ctrl_handler_init(&mt9m111->hdl, 7); + v4l2_ctrl_handler_init(&mt9m111->hdl, 8); v4l2_ctrl_new_std(&mt9m111->hdl, &mt9m111_ctrl_ops, V4L2_CID_VFLIP, 0, 1, 1, 0); v4l2_ctrl_new_std(&mt9m111->hdl, &mt9m111_ctrl_ops, @@ -1309,6 +1319,9 @@ static int mt9m111_probe(struct i2c_client *client) BIT(V4L2_COLORFX_NEGATIVE) | BIT(V4L2_COLORFX_SOLARIZATION)), V4L2_COLORFX_NONE); + v4l2_ctrl_new_std(&mt9m111->hdl, &mt9m111_ctrl_ops, V4L2_CID_PIXEL_RATE, + mclk_rate, mclk_rate, 1, mclk_rate); + mt9m111->subdev.ctrl_handler = &mt9m111->hdl; if (mt9m111->hdl.error) { ret = mt9m111->hdl.error; From patchwork Thu Aug 18 14:47:10 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marco Felsch X-Patchwork-Id: 598353 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id AE17FC2BB41 for ; Thu, 18 Aug 2022 14:47:37 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S244470AbiHROre (ORCPT ); Thu, 18 Aug 2022 10:47:34 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50576 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1343683AbiHROrZ (ORCPT ); Thu, 18 Aug 2022 10:47:25 -0400 Received: from metis.ext.pengutronix.de (metis.ext.pengutronix.de [IPv6:2001:67c:670:201:290:27ff:fe1d:cc33]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 11EF3BBA45 for ; Thu, 18 Aug 2022 07:47:22 -0700 (PDT) Received: from drehscheibe.grey.stw.pengutronix.de ([2a0a:edc0:0:c01:1d::a2]) by metis.ext.pengutronix.de with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1oOgnk-0008KM-40; Thu, 18 Aug 2022 16:47:16 +0200 Received: from [2a0a:edc0:0:1101:1d::28] (helo=dude02.red.stw.pengutronix.de) by drehscheibe.grey.stw.pengutronix.de with esmtp (Exim 4.94.2) (envelope-from ) id 1oOgnj-000X2t-Cv; Thu, 18 Aug 2022 16:47:15 +0200 Received: from mfe by dude02.red.stw.pengutronix.de with local (Exim 4.94.2) (envelope-from ) id 1oOgni-004BVX-5W; Thu, 18 Aug 2022 16:47:14 +0200 From: Marco Felsch To: mchehab@kernel.org, sakari.ailus@linux.intel.com, laurent.pinchart+renesas@ideasonboard.com, jacopo+renesas@jmondi.org, akinobu.mita@gmail.com Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, kernel@pengutronix.de Subject: [PATCH 2/4] media: mt9m111: fix subdev API usage Date: Thu, 18 Aug 2022 16:47:10 +0200 Message-Id: <20220818144712.997477-2-m.felsch@pengutronix.de> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20220818144712.997477-1-m.felsch@pengutronix.de> References: <20220818144712.997477-1-m.felsch@pengutronix.de> MIME-Version: 1.0 X-SA-Exim-Connect-IP: 2a0a:edc0:0:c01:1d::a2 X-SA-Exim-Mail-From: mfe@pengutronix.de X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-media@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.org In case of I2C transfer failures the driver return failure codes which are not allowed according the API documentation. Fix that by ignore the register access failure codes. Signed-off-by: Marco Felsch --- drivers/media/i2c/mt9m111.c | 116 ++++++++++++++++++++---------------- 1 file changed, 66 insertions(+), 50 deletions(-) diff --git a/drivers/media/i2c/mt9m111.c b/drivers/media/i2c/mt9m111.c index cdaf283e1309..53c4dac4e4bd 100644 --- a/drivers/media/i2c/mt9m111.c +++ b/drivers/media/i2c/mt9m111.c @@ -455,7 +455,7 @@ static int mt9m111_set_selection(struct v4l2_subdev *sd, struct mt9m111 *mt9m111 = to_mt9m111(client); struct v4l2_rect rect = sel->r; int width, height; - int ret, align = 0; + int align = 0; if (sel->which != V4L2_SUBDEV_FORMAT_ACTIVE || sel->target != V4L2_SEL_TGT_CROP) @@ -481,14 +481,13 @@ static int mt9m111_set_selection(struct v4l2_subdev *sd, width = min(mt9m111->width, rect.width); height = min(mt9m111->height, rect.height); - ret = mt9m111_setup_geometry(mt9m111, &rect, width, height, mt9m111->fmt->code); - if (!ret) { - mt9m111->rect = rect; - mt9m111->width = width; - mt9m111->height = height; - } - return ret; + mt9m111_setup_geometry(mt9m111, &rect, width, height, mt9m111->fmt->code); + mt9m111->rect = rect; + mt9m111->width = width; + mt9m111->height = height; + + return 0; } static int mt9m111_get_selection(struct v4l2_subdev *sd, @@ -558,7 +557,6 @@ static int mt9m111_set_pixfmt(struct mt9m111 *mt9m111, MT9M111_OUTFMT_RGB444x | MT9M111_OUTFMT_RGBx444 | MT9M111_OUTFMT_SWAP_YCbCr_C_Y_RGB_EVEN | MT9M111_OUTFMT_SWAP_YCbCr_Cb_Cr_RGB_R_B; - int ret; switch (code) { case MEDIA_BUS_FMT_SBGGR8_1X8: @@ -613,13 +611,13 @@ static int mt9m111_set_pixfmt(struct mt9m111 *mt9m111, if (mt9m111->pclk_sample == 0) mask_outfmt2 |= MT9M111_OUTFMT_INV_PIX_CLOCK; - ret = mt9m111_reg_mask(client, context_a.output_fmt_ctrl2, - data_outfmt2, mask_outfmt2); - if (!ret) - ret = mt9m111_reg_mask(client, context_b.output_fmt_ctrl2, - data_outfmt2, mask_outfmt2); - return ret; + mt9m111_reg_mask(client, context_a.output_fmt_ctrl2, + data_outfmt2, mask_outfmt2); + mt9m111_reg_mask(client, context_b.output_fmt_ctrl2, + data_outfmt2, mask_outfmt2); + + return 0; } static int mt9m111_set_fmt(struct v4l2_subdev *sd, @@ -632,7 +630,6 @@ static int mt9m111_set_fmt(struct v4l2_subdev *sd, const struct mt9m111_datafmt *fmt; struct v4l2_rect *rect = &mt9m111->rect; bool bayer; - int ret; if (mt9m111->is_streaming) return -EBUSY; @@ -681,16 +678,14 @@ static int mt9m111_set_fmt(struct v4l2_subdev *sd, return 0; } - ret = mt9m111_setup_geometry(mt9m111, rect, mf->width, mf->height, mf->code); - if (!ret) - ret = mt9m111_set_pixfmt(mt9m111, mf->code); - if (!ret) { - mt9m111->width = mf->width; - mt9m111->height = mf->height; - mt9m111->fmt = fmt; - } - return ret; + mt9m111_setup_geometry(mt9m111, rect, mf->width, mf->height, mf->code); + mt9m111_set_pixfmt(mt9m111, mf->code); + mt9m111->width = mf->width; + mt9m111->height = mf->height; + mt9m111->fmt = fmt; + + return 0; } static const struct mt9m111_mode_info * @@ -786,14 +781,13 @@ static int mt9m111_s_register(struct v4l2_subdev *sd, static int mt9m111_set_flip(struct mt9m111 *mt9m111, int flip, int mask) { struct i2c_client *client = v4l2_get_subdevdata(&mt9m111->subdev); - int ret; if (flip) - ret = mt9m111_reg_set(client, mt9m111->ctx->read_mode, mask); + mt9m111_reg_set(client, mt9m111->ctx->read_mode, mask); else - ret = mt9m111_reg_clear(client, mt9m111->ctx->read_mode, mask); + mt9m111_reg_clear(client, mt9m111->ctx->read_mode, mask); - return ret; + return 0; } static int mt9m111_get_global_gain(struct mt9m111 *mt9m111) @@ -823,7 +817,9 @@ static int mt9m111_set_global_gain(struct mt9m111 *mt9m111, int gain) else val = gain; - return reg_write(GLOBAL_GAIN, val); + reg_write(GLOBAL_GAIN, val); + + return 0; } static int mt9m111_set_autoexposure(struct mt9m111 *mt9m111, int val) @@ -831,8 +827,11 @@ static int mt9m111_set_autoexposure(struct mt9m111 *mt9m111, int val) struct i2c_client *client = v4l2_get_subdevdata(&mt9m111->subdev); if (val == V4L2_EXPOSURE_AUTO) - return reg_set(OPER_MODE_CTRL, MT9M111_OPMODE_AUTOEXPO_EN); - return reg_clear(OPER_MODE_CTRL, MT9M111_OPMODE_AUTOEXPO_EN); + reg_set(OPER_MODE_CTRL, MT9M111_OPMODE_AUTOEXPO_EN); + else + reg_clear(OPER_MODE_CTRL, MT9M111_OPMODE_AUTOEXPO_EN); + + return 0; } static int mt9m111_set_autowhitebalance(struct mt9m111 *mt9m111, int on) @@ -840,8 +839,11 @@ static int mt9m111_set_autowhitebalance(struct mt9m111 *mt9m111, int on) struct i2c_client *client = v4l2_get_subdevdata(&mt9m111->subdev); if (on) - return reg_set(OPER_MODE_CTRL, MT9M111_OPMODE_AUTOWHITEBAL_EN); - return reg_clear(OPER_MODE_CTRL, MT9M111_OPMODE_AUTOWHITEBAL_EN); + reg_set(OPER_MODE_CTRL, MT9M111_OPMODE_AUTOWHITEBAL_EN); + else + reg_clear(OPER_MODE_CTRL, MT9M111_OPMODE_AUTOWHITEBAL_EN); + + return 0; } static const char * const mt9m111_test_pattern_menu[] = { @@ -859,8 +861,9 @@ static int mt9m111_set_test_pattern(struct mt9m111 *mt9m111, int val) { struct i2c_client *client = v4l2_get_subdevdata(&mt9m111->subdev); - return mt9m111_reg_mask(client, MT9M111_TPG_CTRL, val, - MT9M111_TPG_SEL_MASK); + mt9m111_reg_mask(client, MT9M111_TPG_CTRL, val, MT9M111_TPG_SEL_MASK); + + return 0; } static int mt9m111_set_colorfx(struct mt9m111 *mt9m111, int val) @@ -877,9 +880,10 @@ static int mt9m111_set_colorfx(struct mt9m111 *mt9m111, int val) for (i = 0; i < ARRAY_SIZE(colorfx); i++) { if (colorfx[i].id == val) { - return mt9m111_reg_mask(client, MT9M111_EFFECTS_MODE, - colorfx[i].value, - MT9M111_EFFECTS_MODE_MASK); + mt9m111_reg_mask(client, MT9M111_EFFECTS_MODE, + colorfx[i].value, + MT9M111_EFFECTS_MODE_MASK); + return 0; } } @@ -890,29 +894,41 @@ static int mt9m111_s_ctrl(struct v4l2_ctrl *ctrl) { struct mt9m111 *mt9m111 = container_of(ctrl->handler, struct mt9m111, hdl); + int ret; switch (ctrl->id) { case V4L2_CID_VFLIP: - return mt9m111_set_flip(mt9m111, ctrl->val, - MT9M111_RMB_MIRROR_ROWS); + ret = mt9m111_set_flip(mt9m111, ctrl->val, + MT9M111_RMB_MIRROR_ROWS); + break; case V4L2_CID_HFLIP: - return mt9m111_set_flip(mt9m111, ctrl->val, - MT9M111_RMB_MIRROR_COLS); + ret = mt9m111_set_flip(mt9m111, ctrl->val, + MT9M111_RMB_MIRROR_COLS); + break; case V4L2_CID_GAIN: - return mt9m111_set_global_gain(mt9m111, ctrl->val); + ret = mt9m111_set_global_gain(mt9m111, ctrl->val); + break; case V4L2_CID_EXPOSURE_AUTO: - return mt9m111_set_autoexposure(mt9m111, ctrl->val); + ret = mt9m111_set_autoexposure(mt9m111, ctrl->val); + break; case V4L2_CID_AUTO_WHITE_BALANCE: - return mt9m111_set_autowhitebalance(mt9m111, ctrl->val); + ret = mt9m111_set_autowhitebalance(mt9m111, ctrl->val); + break; case V4L2_CID_TEST_PATTERN: - return mt9m111_set_test_pattern(mt9m111, ctrl->val); + ret = mt9m111_set_test_pattern(mt9m111, ctrl->val); + break; case V4L2_CID_COLORFX: - return mt9m111_set_colorfx(mt9m111, ctrl->val); + ret = mt9m111_set_colorfx(mt9m111, ctrl->val); + break; case V4L2_CID_PIXEL_RATE: - return 0; + ret = 0; + break; + default: + ret = -EINVAL; } - return -EINVAL; + + return ret; } static int mt9m111_suspend(struct mt9m111 *mt9m111) From patchwork Thu Aug 18 14:47:11 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marco Felsch X-Patchwork-Id: 598702 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id F146BC32789 for ; Thu, 18 Aug 2022 14:47:34 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1343699AbiHROrd (ORCPT ); Thu, 18 Aug 2022 10:47:33 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50578 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1343547AbiHROrZ (ORCPT ); Thu, 18 Aug 2022 10:47:25 -0400 Received: from metis.ext.pengutronix.de (metis.ext.pengutronix.de [IPv6:2001:67c:670:201:290:27ff:fe1d:cc33]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 33FDFBBA48 for ; Thu, 18 Aug 2022 07:47:22 -0700 (PDT) Received: from drehscheibe.grey.stw.pengutronix.de ([2a0a:edc0:0:c01:1d::a2]) by metis.ext.pengutronix.de with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1oOgnk-0008KO-4c; Thu, 18 Aug 2022 16:47:16 +0200 Received: from [2a0a:edc0:0:1101:1d::28] (helo=dude02.red.stw.pengutronix.de) by drehscheibe.grey.stw.pengutronix.de with esmtp (Exim 4.94.2) (envelope-from ) id 1oOgnj-000X2y-EF; Thu, 18 Aug 2022 16:47:15 +0200 Received: from mfe by dude02.red.stw.pengutronix.de with local (Exim 4.94.2) (envelope-from ) id 1oOgni-004BVa-6E; Thu, 18 Aug 2022 16:47:14 +0200 From: Marco Felsch To: mchehab@kernel.org, sakari.ailus@linux.intel.com, laurent.pinchart+renesas@ideasonboard.com, jacopo+renesas@jmondi.org, akinobu.mita@gmail.com Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, kernel@pengutronix.de Subject: [PATCH 3/4] media: mt9m111: fix device power usage Date: Thu, 18 Aug 2022 16:47:11 +0200 Message-Id: <20220818144712.997477-3-m.felsch@pengutronix.de> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20220818144712.997477-1-m.felsch@pengutronix.de> References: <20220818144712.997477-1-m.felsch@pengutronix.de> MIME-Version: 1.0 X-SA-Exim-Connect-IP: 2a0a:edc0:0:c01:1d::a2 X-SA-Exim-Mail-From: mfe@pengutronix.de X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-media@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.org Currently the driver turn off the power after probe and toggle it during .stream by using the .s_power callback. This is problematic since other callbacks like .set_fmt accessing the hardware as well which will fail. So in the end the default format is the only supported format. Remove the hardware register access from the callbacks and instead sync the state once right before the stream gets enabled to fix this. Signed-off-by: Marco Felsch --- drivers/media/i2c/mt9m111.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/drivers/media/i2c/mt9m111.c b/drivers/media/i2c/mt9m111.c index 53c4dac4e4bd..cd74c408e110 100644 --- a/drivers/media/i2c/mt9m111.c +++ b/drivers/media/i2c/mt9m111.c @@ -481,8 +481,6 @@ static int mt9m111_set_selection(struct v4l2_subdev *sd, width = min(mt9m111->width, rect.width); height = min(mt9m111->height, rect.height); - - mt9m111_setup_geometry(mt9m111, &rect, width, height, mt9m111->fmt->code); mt9m111->rect = rect; mt9m111->width = width; mt9m111->height = height; @@ -611,7 +609,6 @@ static int mt9m111_set_pixfmt(struct mt9m111 *mt9m111, if (mt9m111->pclk_sample == 0) mask_outfmt2 |= MT9M111_OUTFMT_INV_PIX_CLOCK; - mt9m111_reg_mask(client, context_a.output_fmt_ctrl2, data_outfmt2, mask_outfmt2); mt9m111_reg_mask(client, context_b.output_fmt_ctrl2, @@ -678,9 +675,6 @@ static int mt9m111_set_fmt(struct v4l2_subdev *sd, return 0; } - - mt9m111_setup_geometry(mt9m111, rect, mf->width, mf->height, mf->code); - mt9m111_set_pixfmt(mt9m111, mf->code); mt9m111->width = mf->width; mt9m111->height = mf->height; mt9m111->fmt = fmt; @@ -743,6 +737,8 @@ mt9m111_find_mode(struct mt9m111 *mt9m111, unsigned int req_fps, return mode; } +static int mt9m111_s_power(struct v4l2_subdev *sd, int on); + #ifdef CONFIG_VIDEO_ADV_DEBUG static int mt9m111_g_register(struct v4l2_subdev *sd, struct v4l2_dbg_register *reg) @@ -753,10 +749,14 @@ static int mt9m111_g_register(struct v4l2_subdev *sd, if (reg->reg > 0x2ff) return -EINVAL; + mt9m111_s_power(sd, 1); + val = mt9m111_reg_read(client, reg->reg); reg->size = 2; reg->val = (u64)val; + mt9m111_s_power(sd, 0); + if (reg->val > 0xffff) return -EIO; @@ -771,9 +771,13 @@ static int mt9m111_s_register(struct v4l2_subdev *sd, if (reg->reg > 0x2ff) return -EINVAL; + mt9m111_s_power(sd, 1); + if (mt9m111_reg_write(client, reg->reg, reg->val) < 0) return -EIO; + mt9m111_s_power(sd, 0); + return 0; } #endif @@ -896,6 +900,9 @@ static int mt9m111_s_ctrl(struct v4l2_ctrl *ctrl) struct mt9m111, hdl); int ret; + if (!mt9m111->is_streaming) + return 0; + switch (ctrl->id) { case V4L2_CID_VFLIP: ret = mt9m111_set_flip(mt9m111, ctrl->val, @@ -927,7 +934,6 @@ static int mt9m111_s_ctrl(struct v4l2_ctrl *ctrl) ret = -EINVAL; } - return ret; } From patchwork Thu Aug 18 14:47:12 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marco Felsch X-Patchwork-Id: 598703 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 89D8CC32772 for ; Thu, 18 Aug 2022 14:47:29 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S243332AbiHROr2 (ORCPT ); Thu, 18 Aug 2022 10:47:28 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50538 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235303AbiHROrX (ORCPT ); Thu, 18 Aug 2022 10:47:23 -0400 Received: from metis.ext.pengutronix.de (metis.ext.pengutronix.de [IPv6:2001:67c:670:201:290:27ff:fe1d:cc33]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5B0B0BB926 for ; Thu, 18 Aug 2022 07:47:21 -0700 (PDT) Received: from drehscheibe.grey.stw.pengutronix.de ([2a0a:edc0:0:c01:1d::a2]) by metis.ext.pengutronix.de with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1oOgnk-0008KK-0F; Thu, 18 Aug 2022 16:47:16 +0200 Received: from [2a0a:edc0:0:1101:1d::28] (helo=dude02.red.stw.pengutronix.de) by drehscheibe.grey.stw.pengutronix.de with esmtp (Exim 4.94.2) (envelope-from ) id 1oOgnj-000X2q-6d; Thu, 18 Aug 2022 16:47:15 +0200 Received: from mfe by dude02.red.stw.pengutronix.de with local (Exim 4.94.2) (envelope-from ) id 1oOgni-004BVd-6w; Thu, 18 Aug 2022 16:47:14 +0200 From: Marco Felsch To: mchehab@kernel.org, sakari.ailus@linux.intel.com, laurent.pinchart+renesas@ideasonboard.com, jacopo+renesas@jmondi.org, akinobu.mita@gmail.com Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, kernel@pengutronix.de Subject: [PATCH 4/4] media: mt9m111: remove .s_power callback Date: Thu, 18 Aug 2022 16:47:12 +0200 Message-Id: <20220818144712.997477-4-m.felsch@pengutronix.de> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20220818144712.997477-1-m.felsch@pengutronix.de> References: <20220818144712.997477-1-m.felsch@pengutronix.de> MIME-Version: 1.0 X-SA-Exim-Connect-IP: 2a0a:edc0:0:c01:1d::a2 X-SA-Exim-Mail-From: mfe@pengutronix.de X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-media@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.org This is in preparation of switching to the generic dev PM mechanism. Since the .s_power callback will be removed in the near future move the powering into the .s_stream callback. So this driver no longer depends on the .s_power mechanism. Signed-off-by: Marco Felsch --- drivers/media/i2c/mt9m111.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/drivers/media/i2c/mt9m111.c b/drivers/media/i2c/mt9m111.c index cd74c408e110..8e8ba5a8e6ea 100644 --- a/drivers/media/i2c/mt9m111.c +++ b/drivers/media/i2c/mt9m111.c @@ -1065,7 +1065,6 @@ static const struct v4l2_ctrl_ops mt9m111_ctrl_ops = { }; static const struct v4l2_subdev_core_ops mt9m111_subdev_core_ops = { - .s_power = mt9m111_s_power, .log_status = v4l2_ctrl_subdev_log_status, .subscribe_event = v4l2_ctrl_subdev_subscribe_event, .unsubscribe_event = v4l2_event_subdev_unsubscribe, @@ -1136,8 +1135,14 @@ static int mt9m111_enum_mbus_code(struct v4l2_subdev *sd, static int mt9m111_s_stream(struct v4l2_subdev *sd, int enable) { struct mt9m111 *mt9m111 = container_of(sd, struct mt9m111, subdev); + int ret; mt9m111->is_streaming = !!enable; + + ret = mt9m111_s_power(sd, enable); + if (ret) + return ret; + return 0; }