From patchwork Wed Jul 5 08:44:48 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Todor Tomov X-Patchwork-Id: 107043 Delivered-To: patch@linaro.org Received: by 10.140.101.44 with SMTP id t41csp498732qge; Wed, 5 Jul 2017 01:45:47 -0700 (PDT) X-Received: by 10.99.44.206 with SMTP id s197mr20103795pgs.116.1499244347145; Wed, 05 Jul 2017 01:45:47 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1499244347; cv=none; d=google.com; s=arc-20160816; b=n5F8H1O2HYX2bSDrlngmmzmY7JZLVGAgIuAX0Uoy7UIGrTqOHufU4VJemJtrjmOlrv pLSB9aPmX4vhn3g+mVpSkKuCfNPP2IbexfOfVI+7s68Gh7A3Ul42JZmJGw1NtelZU4Ub 4pXHpRIotEauF8SZWx7awpdoxLbNuHjM8ee6UAlDk6Lrrt6fRmHXMVjeFvKn8wLJG8dV Zt2Z7fXtHVPLchIfYbqHMKwk560yUwl9MxguncNT1mLt78BBRDeD9HCBAFwrvBna/SKP a5ekuqFIfnSD7At3+Mt3X81kiyi5e8wLSmLjzU+mqTSRkEciWa8fCITfeGA+1UbVTQG+ mFWg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:arc-authentication-results; bh=3LjAwfpfcJbp1OHM7V5BWDkyf8+YlDujNXmErUMo9Vs=; b=yMI/66UDqAFy5Ayyb9mescVuK0PBps0Q3LdS9R81Ts9p7qWyCz5u9JqS+UY4B5N7CB VWT5Ul51tndm7pHnzJcpJaD+MMRC+VWeE3mWTOpIb5Qq86VbwonPe1NnVgFYIc9jaHT2 DVYLf/MtVzdI8hgi1GcleB/VFnGLxmCyigI1c6+CYn8GHF/Kr7FDHfus02EfHgbYmrax QvBjHCmVhTd66H9ACXY+PTuSJB4VSxj2isS1a8oebFLdGjWdqGyq/cwZBSxz1RHGAGd/ udbbdEIq/rkfGhYhVYjLaheQfOyOtD62NTXWIrDxR19HGYcP26MmyxnWiKM80g4/X0Lc 0g2Q== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id k2si16758379pfh.174.2017.07.05.01.45.46; Wed, 05 Jul 2017 01:45:47 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752498AbdGEIpL (ORCPT + 25 others); Wed, 5 Jul 2017 04:45:11 -0400 Received: from ns.mm-sol.com ([37.157.136.199]:45673 "EHLO extserv.mm-sol.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750841AbdGEIpJ (ORCPT ); Wed, 5 Jul 2017 04:45:09 -0400 Received: from mms-0439.qualcomm.mm-sol.com (unknown [37.157.136.206]) by extserv.mm-sol.com (Postfix) with ESMTPSA id E4452CB9F; Wed, 5 Jul 2017 11:45:07 +0300 (EEST) From: Todor Tomov To: mchehab@kernel.org, sakari.ailus@linux.intel.com, hansverk@cisco.com Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Todor Tomov Subject: [PATCH 2/3] [media] ov5645: Add control to export pixel clock frequency Date: Wed, 5 Jul 2017 11:44:48 +0300 Message-Id: <1499244289-7791-2-git-send-email-todor.tomov@linaro.org> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1499244289-7791-1-git-send-email-todor.tomov@linaro.org> References: <1499244289-7791-1-git-send-email-todor.tomov@linaro.org> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Add suport for standard V4L2_CID_PIXEL_RATE control. The pixel clock frequency value is specific for each sensor mode so the sensor mode structure is extended to add this. The control is read-only and its value is updated when the sensor mode is changed - on set_format. Signed-off-by: Todor Tomov --- drivers/media/i2c/ov5645.c | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) -- 1.9.1 diff --git a/drivers/media/i2c/ov5645.c b/drivers/media/i2c/ov5645.c index bb3dd0d..4583f66 100644 --- a/drivers/media/i2c/ov5645.c +++ b/drivers/media/i2c/ov5645.c @@ -80,6 +80,7 @@ struct ov5645_mode_info { u32 height; const struct reg_value *data; u32 data_size; + u32 pixel_clock; }; struct ov5645 { @@ -99,6 +100,7 @@ struct ov5645 { const struct ov5645_mode_info *current_mode; struct v4l2_ctrl_handler ctrls; + struct v4l2_ctrl *pixel_clock; /* Cached register values */ u8 aec_pk_manual; @@ -510,19 +512,22 @@ static inline struct ov5645 *to_ov5645(struct v4l2_subdev *sd) .width = 1280, .height = 960, .data = ov5645_setting_sxga, - .data_size = ARRAY_SIZE(ov5645_setting_sxga) + .data_size = ARRAY_SIZE(ov5645_setting_sxga), + .pixel_clock = 111440000 }, { .width = 1920, .height = 1080, .data = ov5645_setting_1080p, - .data_size = ARRAY_SIZE(ov5645_setting_1080p) + .data_size = ARRAY_SIZE(ov5645_setting_1080p), + .pixel_clock = 167160000 }, { .width = 2592, .height = 1944, .data = ov5645_setting_full, - .data_size = ARRAY_SIZE(ov5645_setting_full) + .data_size = ARRAY_SIZE(ov5645_setting_full), + .pixel_clock = 167160000 }, }; @@ -969,6 +974,7 @@ static int ov5645_set_format(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *__format; struct v4l2_rect *__crop; const struct ov5645_mode_info *new_mode; + int ret; __crop = __ov5645_get_pad_crop(ov5645, cfg, format->pad, format->which); @@ -978,8 +984,14 @@ static int ov5645_set_format(struct v4l2_subdev *sd, __crop->width = new_mode->width; __crop->height = new_mode->height; - if (format->which == V4L2_SUBDEV_FORMAT_ACTIVE) + if (format->which == V4L2_SUBDEV_FORMAT_ACTIVE) { + ret = v4l2_ctrl_s_ctrl_int64(ov5645->pixel_clock, + new_mode->pixel_clock); + if (ret < 0) + return ret; + ov5645->current_mode = new_mode; + } __format = __ov5645_get_pad_format(ov5645, cfg, format->pad, format->which); @@ -1197,7 +1209,7 @@ static int ov5645_probe(struct i2c_client *client, mutex_init(&ov5645->power_lock); - v4l2_ctrl_handler_init(&ov5645->ctrls, 7); + v4l2_ctrl_handler_init(&ov5645->ctrls, 8); v4l2_ctrl_new_std(&ov5645->ctrls, &ov5645_ctrl_ops, V4L2_CID_SATURATION, -4, 4, 1, 0); v4l2_ctrl_new_std(&ov5645->ctrls, &ov5645_ctrl_ops, @@ -1215,6 +1227,10 @@ static int ov5645_probe(struct i2c_client *client, V4L2_CID_TEST_PATTERN, ARRAY_SIZE(ov5645_test_pattern_menu) - 1, 0, 0, ov5645_test_pattern_menu); + ov5645->pixel_clock = v4l2_ctrl_new_std(&ov5645->ctrls, + &ov5645_ctrl_ops, + V4L2_CID_PIXEL_RATE, + 1, INT_MAX, 1, 1); ov5645->sd.ctrl_handler = &ov5645->ctrls;