From patchwork Wed Jan 29 15:03:49 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dave Stevenson X-Patchwork-Id: 13953843 Received: from mail-wm1-f47.google.com (mail-wm1-f47.google.com [209.85.128.47]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6CBD718F2EA for ; Wed, 29 Jan 2025 15:03:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.47 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738163039; cv=none; b=SPWZdkDOY0y1HGvD5pXtYJOZpW6Pm1TdsxDWCaPeI7kBePjejsn82hMs/UX1YslGFfiO+YY7Mzan4mcxXTYo4SCtYTdFx8WdoaTR3FSst5bp5ksqYXLSvs1brOltkCIeuM4P4kE+IGmElfZV3FjBVS4Zcn1nQQmuXwyCqqyCRoc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738163039; c=relaxed/simple; bh=TqdDfVnt1s5oLrNMWo9iFiZRdsBIv+vctprwtCvzwRY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=GpDby0HjvA7YeRIdmNZWxwJ2/OHZKnDTsPmayuQRxIj4IZSxSWYr57MUVZUinIbm0HG3nYzdRwtCG5GbpPO+eTM8/KYeDaDNpNkzxd1708P2DX5f+eRm2WuCG0Pnh9L9/Z+pW8lP8ClHhZeX25Dp34G6vYI+OtMCjt7IsgURmq0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=raspberrypi.com; spf=pass smtp.mailfrom=raspberrypi.com; dkim=pass (2048-bit key) header.d=raspberrypi.com header.i=@raspberrypi.com header.b=JKbCv5TZ; arc=none smtp.client-ip=209.85.128.47 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=raspberrypi.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=raspberrypi.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=raspberrypi.com header.i=@raspberrypi.com header.b="JKbCv5TZ" Received: by mail-wm1-f47.google.com with SMTP id 5b1f17b1804b1-436a03197b2so47925015e9.2 for ; Wed, 29 Jan 2025 07:03:57 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=raspberrypi.com; s=google; t=1738163036; x=1738767836; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=2RdELdmmM00SLhxC3lWyk5JiMZUv4m8x+ewbzx0VpYU=; b=JKbCv5TZqhJ/7iuevg+GCkrFLGYdKN8SUdPCSU/GZBhHzItgu2Q29YGh47VnWVkFMS oFqM1A4NFgx+D39Tv1fhzY1/bShTCrqcLie8cNzaw24EX4STHCsEROI7DstOIL+YFa4e Y8WRRZdZxI/L8iN5zCTKD9KvcK7fKVAzvG6+R3g/mr4ZaAIWd3EVK59p2zJjPwnuCbmJ MrhluHyeaL0UxOSWb9J7ejGA6vnqo/dVlFTrvwmLt6s73le5F2xtxc689KJXfSoQaOX4 +BQ5tm7KRDIjCX/DyfqZjcZ32+ZbykkEJzH2gEE70hAYaIpW2LVApw2zRjo+70jWGkwC N0YA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738163036; x=1738767836; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=2RdELdmmM00SLhxC3lWyk5JiMZUv4m8x+ewbzx0VpYU=; b=hx9v8dnp4/tbXq7LPxLonad3lv869zeFUp6yxpX5QV/K/a730uAUYH62RUFEGNJFLD 20hMqsea78x7NYUQ1ID0SYhdaTNtEJ70cGT6pSg8xy8ifjOhOI2Yqxh36xXau82tb/6Y HpSAS/7Elr/AzqZDui/SriDzPpvaTcWU0uZ4FdsYF3xKoX/yH3XdPt0HGNARBV+wty2/ Pc4HlG4VixKQxqQBF+mH+Zuh/TSFslEr+F/PIN7/iGF3BI6GsKP6Pm2jByCnRCNU8rNg AhH/CNUe2/EqkwJTJXXgMU2coiN5PRWwOXwfd2whgvavha8pfZPK30T8JIEH3k3TpDV2 rvYA== X-Forwarded-Encrypted: i=1; AJvYcCV9AHv2r0JMLCNfWE3+vMKyQF289bd2p0H8kGyCZcsfgIJdw9KxhX3gttrx2QuQJH8egvdQ9chOvdaHOA==@vger.kernel.org X-Gm-Message-State: AOJu0YwZFrhMEUbFErCap/Wxxsryfe7Nw4rvAKqtFnq6/pKdaHT+D+bJ kYjLfvntNjjqEoyEqP53xd+EeZrtDgwJHBlFIvq++oca6PHdQj16VTIrq72QiDQ= X-Gm-Gg: ASbGncv/ywe1iWFadCFlMYO7pIyZBIH8sObcv9NTg0HrfxYuDGMxOfvtqMq59gna83g mGvYC5/mhCQjvg0sKWoHNcxiHMefdfyzBm4J/1fcMXI5ogcJ8f4Bn5X+4olKRY0Rad2dYXzb2NP 35EmEc51YpySmxJgczj7RQB4EBoNRSDsbVWguCxss/ZIgaPTnjLHOVotR5blcDFtPje1i8EgULK qPzYhfyXkgjMABNiGpdFJgkcGIvL4jA9Zz2bI2QFNA5LcfQ//FNKsZF2ysx6ixcJ29q5f2c/f4u WN/NRqE= X-Google-Smtp-Source: AGHT+IEfdr26yni6vLyodzHwXpuihA52ws3krKB6jrbt5LefZJKD6s0VHpLBRoXv+pWE+xtfo+h3kw== X-Received: by 2002:a05:600c:3b98:b0:434:a4fe:cd71 with SMTP id 5b1f17b1804b1-438dc3be214mr31220785e9.12.1738163035433; Wed, 29 Jan 2025 07:03:55 -0800 (PST) Received: from [127.0.1.1] ([2a00:1098:3142:e::8]) by smtp.googlemail.com with ESMTPSA id 5b1f17b1804b1-438d755375bsm39074745e9.0.2025.01.29.07.03.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 29 Jan 2025 07:03:54 -0800 (PST) From: Dave Stevenson Date: Wed, 29 Jan 2025 15:03:49 +0000 Subject: [PATCH v3 1/3] media: i2c: imx415: Add read/write control of VBLANK Precedence: bulk X-Mailing-List: linux-media@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250129-media-imx415-v3-1-d16d4fa8fc10@raspberrypi.com> References: <20250129-media-imx415-v3-0-d16d4fa8fc10@raspberrypi.com> In-Reply-To: <20250129-media-imx415-v3-0-d16d4fa8fc10@raspberrypi.com> To: Sakari Ailus , Michael Riesch , Mauro Carvalho Chehab Cc: Gerald Loacker , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Dave Stevenson X-Mailer: b4 0.14.1 This also requires that the ranges for the exposure control are updated. Reviewed-by: Michael Riesch Signed-off-by: Dave Stevenson --- drivers/media/i2c/imx415.c | 52 ++++++++++++++++++++++++++++++---------------- 1 file changed, 34 insertions(+), 18 deletions(-) diff --git a/drivers/media/i2c/imx415.c b/drivers/media/i2c/imx415.c index 3f7924aa1bd3..fa7ffb9220e5 100644 --- a/drivers/media/i2c/imx415.c +++ b/drivers/media/i2c/imx415.c @@ -26,6 +26,7 @@ #define IMX415_PIXEL_ARRAY_WIDTH 3864 #define IMX415_PIXEL_ARRAY_HEIGHT 2192 #define IMX415_PIXEL_ARRAY_VBLANK 58 +#define IMX415_EXPOSURE_OFFSET 8 #define IMX415_NUM_CLK_PARAM_REGS 11 @@ -51,6 +52,7 @@ #define IMX415_OUTSEL CCI_REG8(0x30c0) #define IMX415_DRV CCI_REG8(0x30c1) #define IMX415_VMAX CCI_REG24_LE(0x3024) +#define IMX415_VMAX_MAX 0xfffff #define IMX415_HMAX CCI_REG16_LE(0x3028) #define IMX415_SHR0 CCI_REG24_LE(0x3050) #define IMX415_GAIN_PCG_0 CCI_REG16_LE(0x3090) @@ -447,7 +449,6 @@ static const struct imx415_clk_params imx415_clk_params[] = { /* all-pixel 2-lane 720 Mbps 15.74 Hz mode */ static const struct cci_reg_sequence imx415_mode_2_720[] = { - { IMX415_VMAX, 0x08CA }, { IMX415_HMAX, 0x07F0 }, { IMX415_LANEMODE, IMX415_LANEMODE_2 }, { IMX415_TCLKPOST, 0x006F }, @@ -463,7 +464,6 @@ static const struct cci_reg_sequence imx415_mode_2_720[] = { /* all-pixel 2-lane 1440 Mbps 30.01 Hz mode */ static const struct cci_reg_sequence imx415_mode_2_1440[] = { - { IMX415_VMAX, 0x08CA }, { IMX415_HMAX, 0x042A }, { IMX415_LANEMODE, IMX415_LANEMODE_2 }, { IMX415_TCLKPOST, 0x009F }, @@ -479,7 +479,6 @@ static const struct cci_reg_sequence imx415_mode_2_1440[] = { /* all-pixel 4-lane 891 Mbps 30 Hz mode */ static const struct cci_reg_sequence imx415_mode_4_891[] = { - { IMX415_VMAX, 0x08CA }, { IMX415_HMAX, 0x044C }, { IMX415_LANEMODE, IMX415_LANEMODE_4 }, { IMX415_TCLKPOST, 0x007F }, @@ -600,6 +599,7 @@ struct imx415 { struct v4l2_ctrl *vblank; struct v4l2_ctrl *hflip; struct v4l2_ctrl *vflip; + struct v4l2_ctrl *exposure; unsigned int cur_mode; unsigned int num_data_lanes; @@ -730,17 +730,38 @@ static int imx415_s_ctrl(struct v4l2_ctrl *ctrl) ctrls); const struct v4l2_mbus_framefmt *format; struct v4l2_subdev_state *state; + u32 exposure_max; unsigned int vmax; unsigned int flip; int ret; - if (!pm_runtime_get_if_in_use(sensor->dev)) - return 0; - state = v4l2_subdev_get_locked_active_state(&sensor->subdev); format = v4l2_subdev_state_get_format(state, 0); + if (ctrl->id == V4L2_CID_VBLANK) { + exposure_max = format->height + ctrl->val - + IMX415_EXPOSURE_OFFSET; + __v4l2_ctrl_modify_range(sensor->exposure, + sensor->exposure->minimum, + exposure_max, sensor->exposure->step, + sensor->exposure->default_value); + } + + if (!pm_runtime_get_if_in_use(sensor->dev)) + return 0; + switch (ctrl->id) { + case V4L2_CID_VBLANK: + ret = cci_write(sensor->regmap, IMX415_VMAX, + format->height + ctrl->val, NULL); + if (ret) + return ret; + /* + * Exposure is set based on VMAX which has just changed, so + * program exposure register as well + */ + ctrl = sensor->exposure; + fallthrough; case V4L2_CID_EXPOSURE: /* clamp the exposure value to VMAX. */ vmax = format->height + sensor->vblank->cur.val; @@ -787,7 +808,8 @@ static int imx415_ctrls_init(struct imx415 *sensor) u64 pixel_rate = supported_modes[sensor->cur_mode].pixel_rate; u64 lane_rate = supported_modes[sensor->cur_mode].lane_rate; u32 exposure_max = IMX415_PIXEL_ARRAY_HEIGHT + - IMX415_PIXEL_ARRAY_VBLANK - 8; + IMX415_PIXEL_ARRAY_VBLANK - + IMX415_EXPOSURE_OFFSET; u32 hblank; unsigned int i; int ret; @@ -816,8 +838,9 @@ static int imx415_ctrls_init(struct imx415 *sensor) if (ctrl) ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY; - v4l2_ctrl_new_std(&sensor->ctrls, &imx415_ctrl_ops, V4L2_CID_EXPOSURE, - 4, exposure_max, 1, exposure_max); + sensor->exposure = v4l2_ctrl_new_std(&sensor->ctrls, &imx415_ctrl_ops, + V4L2_CID_EXPOSURE, 4, + exposure_max, 1, exposure_max); v4l2_ctrl_new_std(&sensor->ctrls, &imx415_ctrl_ops, V4L2_CID_ANALOGUE_GAIN, IMX415_AGAIN_MIN, @@ -834,16 +857,9 @@ static int imx415_ctrls_init(struct imx415 *sensor) sensor->vblank = v4l2_ctrl_new_std(&sensor->ctrls, &imx415_ctrl_ops, V4L2_CID_VBLANK, IMX415_PIXEL_ARRAY_VBLANK, - IMX415_PIXEL_ARRAY_VBLANK, 1, - IMX415_PIXEL_ARRAY_VBLANK); - if (sensor->vblank) - sensor->vblank->flags |= V4L2_CTRL_FLAG_READ_ONLY; + IMX415_VMAX_MAX - IMX415_PIXEL_ARRAY_HEIGHT, + 1, IMX415_PIXEL_ARRAY_VBLANK); - /* - * The pixel rate used here is a virtual value and can be used for - * calculating the frame rate together with hblank. It may not - * necessarily be the physically correct pixel clock. - */ v4l2_ctrl_new_std(&sensor->ctrls, NULL, V4L2_CID_PIXEL_RATE, pixel_rate, pixel_rate, 1, pixel_rate); From patchwork Wed Jan 29 15:03:50 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dave Stevenson X-Patchwork-Id: 13953844 Received: from mail-wm1-f51.google.com (mail-wm1-f51.google.com [209.85.128.51]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5AB7F1B4F15 for ; Wed, 29 Jan 2025 15:03:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738163040; cv=none; b=r9O33GAMrHzPmdTW+iP9HkiKrVggsLf4dCkq20ekREvGlvi+BiYagSmS1F29+tvyPvEXhYBod5a5ogY7WtkCtqEGvLsEDfyM/gX1/3LDnbornI8/OZDczCNtLgCI1Tq2RqBgrxIzs4EgiQ47kXz6pvSnj5IUbJpIQ4KACf1YBck= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738163040; c=relaxed/simple; bh=6lq47fOjlA0UWXV5aFwDu8hAWqziXfD5gNuaTIVaD1k=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=IQ/VQFYtE0ytrwhaaGoc8v8dEZtZaRTjKtX2FXojzr0VTSwerwFsz+W7PeHYe/W5Fwy8ROY7vJuNDaikE66I43G64iC2E8cDIzLzk41zdfO1+RhzNPI6Gky8EaiIh8LMKP7fcrTjWKs1uNDXOjO/+Ra1JQwHTRcegg4sGuNA7cg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=raspberrypi.com; spf=pass smtp.mailfrom=raspberrypi.com; dkim=pass (2048-bit key) header.d=raspberrypi.com header.i=@raspberrypi.com header.b=UMC/tFdH; arc=none smtp.client-ip=209.85.128.51 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=raspberrypi.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=raspberrypi.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=raspberrypi.com header.i=@raspberrypi.com header.b="UMC/tFdH" Received: by mail-wm1-f51.google.com with SMTP id 5b1f17b1804b1-4361c705434so50258835e9.3 for ; Wed, 29 Jan 2025 07:03:58 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=raspberrypi.com; s=google; t=1738163036; x=1738767836; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=M4QQH2LhDX2v4Lr/mwCZzmNPhylNtOOaNds4qlvJsCs=; b=UMC/tFdH4OJIHw4LarXaQ33RggTx4/B8YOydlfOsMzb78nInXNt0Teh7WLNiS+8aTO 3+3QCccvOpzgkgzA6nO0ZRUfpG/6fbkWDboJf4bI9CcL3varNvYYX+z5t3SaXl7A00gz 4QtXcd9GtTQAMK6486W248qLN1lI9uSghlv4SrNZMk0kW+0GfGYg/Jn163+F+dWzMVOy GafpqX1tRXd8UlJqueSNDvU+7lsx3aFyDjPnRk2NxI42IrY7XlC/w+uGPfHuXVuipUa8 FIwsPo84OwHmammppHU+owhFyqLZkSJEGdbdRASq2rIXADPs4qezbPN1y2fvoY0fIxoC KWSQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738163036; x=1738767836; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=M4QQH2LhDX2v4Lr/mwCZzmNPhylNtOOaNds4qlvJsCs=; b=SruB1Vb1HVzTpo+KMII0xOWXyEdXonfGd9h8TOgYWImOuoI5OsCflnu92+CrXOV9tA ySsB1yGMngX/pY4n/24zqHgglaFNQYBucxlSq5qU+qhAUylj5wsRmjuR0zDQM8N5SEyN BkT39jiwiUExns/VfF/PBVTUmOzdlLz9yFJ9Zis/QvX2O94QQsa95zD0VT3XjgaZ/b/b a1cKEwdz60xqJdpzC8payvEBMIIuVlx0S9tEWrOcHm5rPlLIST+VsZrzVh41Vvucvufp f1zUd9h4yzVH5qVZoY/Jgb++tVMdlhyt/u5tyZqSzbpvxrWYhb7ekDkF9fDJK8mWKWzJ D8Hw== X-Forwarded-Encrypted: i=1; AJvYcCVOn8XtTifMr92uLAqultV2LvhlaAqePvHvQtQkSLEoOnbBXF72meqZQom+v9YqhxSJ3J1cGNT7uZleCQ==@vger.kernel.org X-Gm-Message-State: AOJu0YzMT5B7/phAU6uHshaeF64072VGgWNWjoIumUW5y5P1HYCjME8B IWW4Jjab0tm7l5aVUZ+fy/dogUutixzH06cYMgkBH0r6fKHfupPOSGOUYkotMes= X-Gm-Gg: ASbGncuR8+u11LUCvu+bodHos7zDH48S36mNueFDKq2QZ7OTMkhoO/XAcYjh+iFxufS hEI5sRumymVT945/0WTSKuW0+HkNgCO35u9/DVz5ZfQTBsZoFPSgW+BuE6J2LkpiZCK1poy95Bb /AB0SEHTdBQl9jltOaWs5RbhHetq/6avMe8SExhJo2SmOcXWoI6nLd0VSy2gvCtL5P9aNdFOW0C YaiyFax+xNwALihVjTRGjpu8If7ajmpFu74ju8cmQwr2nzsYfsULNKjq98/SelAeq/B41GcBGZ9 8uVCEH4= X-Google-Smtp-Source: AGHT+IHcuetWf+UaKHuqmqU6qq8pdnBMvbnW+SXpsW7HJY5czzG8tcqbBU5MA4lTaWcGf2ndpfCicg== X-Received: by 2002:a05:600c:1c99:b0:431:5044:e388 with SMTP id 5b1f17b1804b1-438dc40be3dmr28201565e9.22.1738163036351; Wed, 29 Jan 2025 07:03:56 -0800 (PST) Received: from [127.0.1.1] ([2a00:1098:3142:e::8]) by smtp.googlemail.com with ESMTPSA id 5b1f17b1804b1-438d755375bsm39074745e9.0.2025.01.29.07.03.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 29 Jan 2025 07:03:55 -0800 (PST) From: Dave Stevenson Date: Wed, 29 Jan 2025 15:03:50 +0000 Subject: [PATCH v3 2/3] media: i2c: imx415: Make HBLANK controllable and in consistent units Precedence: bulk X-Mailing-List: linux-media@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250129-media-imx415-v3-2-d16d4fa8fc10@raspberrypi.com> References: <20250129-media-imx415-v3-0-d16d4fa8fc10@raspberrypi.com> In-Reply-To: <20250129-media-imx415-v3-0-d16d4fa8fc10@raspberrypi.com> To: Sakari Ailus , Michael Riesch , Mauro Carvalho Chehab Cc: Gerald Loacker , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Dave Stevenson X-Mailer: b4 0.14.1 The control of HMAX documented in the datasheet is consistent with being in terms of a scaled INCK, being always 72MHz or 74.25MHz. It is NOT link frequency dependent, but the minimum value for HMAX is dictated by the link frequency. If PIXEL_RATE is defined as being 12 times the 72 or 74.25MHz, and all values are scaled down again when writing HMAX, then the numbers all work out regardless of INCK or link frequency. Retain an hmax_min (set to the same value as the previous fixed hmax register value) to set as the default value to avoid changing the behaviour for existing users. Signed-off-by: Dave Stevenson Reviewed-by: Michael Riesch --- drivers/media/i2c/imx415.c | 88 +++++++++++++++++++++------------------------- 1 file changed, 40 insertions(+), 48 deletions(-) diff --git a/drivers/media/i2c/imx415.c b/drivers/media/i2c/imx415.c index fa7ffb9220e5..86dbcfcd820d 100644 --- a/drivers/media/i2c/imx415.c +++ b/drivers/media/i2c/imx415.c @@ -28,6 +28,9 @@ #define IMX415_PIXEL_ARRAY_VBLANK 58 #define IMX415_EXPOSURE_OFFSET 8 +#define IMX415_PIXEL_RATE_74_25MHZ 891000000 +#define IMX415_PIXEL_RATE_72MHZ 864000000 + #define IMX415_NUM_CLK_PARAM_REGS 11 #define IMX415_MODE CCI_REG8(0x3000) @@ -54,6 +57,8 @@ #define IMX415_VMAX CCI_REG24_LE(0x3024) #define IMX415_VMAX_MAX 0xfffff #define IMX415_HMAX CCI_REG16_LE(0x3028) +#define IMX415_HMAX_MAX 0xffff +#define IMX415_HMAX_MULTIPLIER 12 #define IMX415_SHR0 CCI_REG24_LE(0x3050) #define IMX415_GAIN_PCG_0 CCI_REG16_LE(0x3090) #define IMX415_AGAIN_MIN 0 @@ -449,7 +454,6 @@ static const struct imx415_clk_params imx415_clk_params[] = { /* all-pixel 2-lane 720 Mbps 15.74 Hz mode */ static const struct cci_reg_sequence imx415_mode_2_720[] = { - { IMX415_HMAX, 0x07F0 }, { IMX415_LANEMODE, IMX415_LANEMODE_2 }, { IMX415_TCLKPOST, 0x006F }, { IMX415_TCLKPREPARE, 0x002F }, @@ -464,7 +468,6 @@ static const struct cci_reg_sequence imx415_mode_2_720[] = { /* all-pixel 2-lane 1440 Mbps 30.01 Hz mode */ static const struct cci_reg_sequence imx415_mode_2_1440[] = { - { IMX415_HMAX, 0x042A }, { IMX415_LANEMODE, IMX415_LANEMODE_2 }, { IMX415_TCLKPOST, 0x009F }, { IMX415_TCLKPREPARE, 0x0057 }, @@ -479,7 +482,6 @@ static const struct cci_reg_sequence imx415_mode_2_1440[] = { /* all-pixel 4-lane 891 Mbps 30 Hz mode */ static const struct cci_reg_sequence imx415_mode_4_891[] = { - { IMX415_HMAX, 0x044C }, { IMX415_LANEMODE, IMX415_LANEMODE_4 }, { IMX415_TCLKPOST, 0x007F }, { IMX415_TCLKPREPARE, 0x0037 }, @@ -497,39 +499,10 @@ struct imx415_mode_reg_list { const struct cci_reg_sequence *regs; }; -/* - * Mode : number of lanes, lane rate and frame rate dependent settings - * - * pixel_rate and hmax_pix are needed to calculate hblank for the v4l2 ctrl - * interface. These values can not be found in the data sheet and should be - * treated as virtual values. Use following table when adding new modes. - * - * lane_rate lanes fps hmax_pix pixel_rate - * - * 594 2 10.000 4400 99000000 - * 891 2 15.000 4400 148500000 - * 720 2 15.748 4064 144000000 - * 1782 2 30.000 4400 297000000 - * 2079 2 30.000 4400 297000000 - * 1440 2 30.019 4510 304615385 - * - * 594 4 20.000 5500 247500000 - * 594 4 25.000 4400 247500000 - * 720 4 25.000 4400 247500000 - * 720 4 30.019 4510 304615385 - * 891 4 30.000 4400 297000000 - * 1440 4 30.019 4510 304615385 - * 1440 4 60.038 4510 609230769 - * 1485 4 60.000 4400 594000000 - * 1782 4 60.000 4400 594000000 - * 2079 4 60.000 4400 594000000 - * 2376 4 90.164 4392 891000000 - */ struct imx415_mode { u64 lane_rate; u32 lanes; - u32 hmax_pix; - u64 pixel_rate; + u32 hmax_min; struct imx415_mode_reg_list reg_list; }; @@ -538,8 +511,7 @@ static const struct imx415_mode supported_modes[] = { { .lane_rate = 720000000, .lanes = 2, - .hmax_pix = 4064, - .pixel_rate = 144000000, + .hmax_min = 2032, .reg_list = { .num_of_regs = ARRAY_SIZE(imx415_mode_2_720), .regs = imx415_mode_2_720, @@ -548,8 +520,7 @@ static const struct imx415_mode supported_modes[] = { { .lane_rate = 1440000000, .lanes = 2, - .hmax_pix = 4510, - .pixel_rate = 304615385, + .hmax_min = 1066, .reg_list = { .num_of_regs = ARRAY_SIZE(imx415_mode_2_1440), .regs = imx415_mode_2_1440, @@ -558,8 +529,7 @@ static const struct imx415_mode supported_modes[] = { { .lane_rate = 891000000, .lanes = 4, - .hmax_pix = 4400, - .pixel_rate = 297000000, + .hmax_min = 1100, .reg_list = { .num_of_regs = ARRAY_SIZE(imx415_mode_4_891), .regs = imx415_mode_4_891, @@ -586,6 +556,7 @@ static const char *const imx415_test_pattern_menu[] = { struct imx415 { struct device *dev; struct clk *clk; + unsigned long pixel_rate; struct regulator_bulk_data supplies[ARRAY_SIZE(imx415_supply_names)]; struct gpio_desc *reset; struct regmap *regmap; @@ -597,6 +568,7 @@ struct imx415 { struct v4l2_ctrl_handler ctrls; struct v4l2_ctrl *vblank; + struct v4l2_ctrl *hblank; struct v4l2_ctrl *hflip; struct v4l2_ctrl *vflip; struct v4l2_ctrl *exposure; @@ -787,6 +759,13 @@ static int imx415_s_ctrl(struct v4l2_ctrl *ctrl) ret = imx415_set_testpattern(sensor, ctrl->val); break; + case V4L2_CID_HBLANK: + ret = cci_write(sensor->regmap, IMX415_HMAX, + (format->width + ctrl->val) / + IMX415_HMAX_MULTIPLIER, + NULL); + break; + default: ret = -EINVAL; break; @@ -805,12 +784,11 @@ static int imx415_ctrls_init(struct imx415 *sensor) { struct v4l2_fwnode_device_properties props; struct v4l2_ctrl *ctrl; - u64 pixel_rate = supported_modes[sensor->cur_mode].pixel_rate; u64 lane_rate = supported_modes[sensor->cur_mode].lane_rate; u32 exposure_max = IMX415_PIXEL_ARRAY_HEIGHT + IMX415_PIXEL_ARRAY_VBLANK - IMX415_EXPOSURE_OFFSET; - u32 hblank; + u32 hblank_min, hblank_max; unsigned int i; int ret; @@ -847,12 +825,14 @@ static int imx415_ctrls_init(struct imx415 *sensor) IMX415_AGAIN_MAX, IMX415_AGAIN_STEP, IMX415_AGAIN_MIN); - hblank = supported_modes[sensor->cur_mode].hmax_pix - - IMX415_PIXEL_ARRAY_WIDTH; + hblank_min = (supported_modes[sensor->cur_mode].hmax_min * + IMX415_HMAX_MULTIPLIER) - IMX415_PIXEL_ARRAY_WIDTH; + hblank_max = (IMX415_HMAX_MAX * IMX415_HMAX_MULTIPLIER) - + IMX415_PIXEL_ARRAY_WIDTH; ctrl = v4l2_ctrl_new_std(&sensor->ctrls, &imx415_ctrl_ops, - V4L2_CID_HBLANK, hblank, hblank, 1, hblank); - if (ctrl) - ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY; + V4L2_CID_HBLANK, hblank_min, + hblank_max, IMX415_HMAX_MULTIPLIER, + hblank_min); sensor->vblank = v4l2_ctrl_new_std(&sensor->ctrls, &imx415_ctrl_ops, V4L2_CID_VBLANK, @@ -860,8 +840,9 @@ static int imx415_ctrls_init(struct imx415 *sensor) IMX415_VMAX_MAX - IMX415_PIXEL_ARRAY_HEIGHT, 1, IMX415_PIXEL_ARRAY_VBLANK); - v4l2_ctrl_new_std(&sensor->ctrls, NULL, V4L2_CID_PIXEL_RATE, pixel_rate, - pixel_rate, 1, pixel_rate); + v4l2_ctrl_new_std(&sensor->ctrls, NULL, V4L2_CID_PIXEL_RATE, + sensor->pixel_rate, sensor->pixel_rate, 1, + sensor->pixel_rate); sensor->hflip = v4l2_ctrl_new_std(&sensor->ctrls, &imx415_ctrl_ops, V4L2_CID_HFLIP, 0, 1, 1, 0); @@ -1333,6 +1314,17 @@ static int imx415_parse_hw_config(struct imx415 *sensor) "no valid sensor mode defined\n"); goto done_endpoint_free; } + switch (inck) { + case 27000000: + case 37125000: + case 74250000: + sensor->pixel_rate = IMX415_PIXEL_RATE_74_25MHZ; + break; + case 24000000: + case 72000000: + sensor->pixel_rate = IMX415_PIXEL_RATE_72MHZ; + break; + } lane_rate = supported_modes[sensor->cur_mode].lane_rate; for (i = 0; i < ARRAY_SIZE(imx415_clk_params); ++i) { From patchwork Wed Jan 29 15:03:51 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dave Stevenson X-Patchwork-Id: 13953845 Received: from mail-wr1-f50.google.com (mail-wr1-f50.google.com [209.85.221.50]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 87C191D934D for ; Wed, 29 Jan 2025 15:03:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.50 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738163041; cv=none; b=YWTqqMllfgX6i90EbwE6n/J4efgXD5B9HblMueXqt0y1ad0QCw5PWQqUv9IUqI6YH9fS5ohHQMRrdwuXe9u7DG0lIFZpAbbI8hX6H6kyv4VzOnt1E1rylyBvTArNdW9eObeM30Zo9ivtly22ekEiNJydj72FEBsh4dI5zbwk1XE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738163041; c=relaxed/simple; bh=KjqKlVkecA17TtFQ0yN8H6t8Zx16MtZsmLBSj5htyQE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=MD3wBHDo1nm01JAr5yTO4mKvfOg1sGcp7mojHMbAEYDTHAW8OYN/HSKmGkDCFWT/GudFF1jpiZkvCslzTXskP5DNZSS/sgh8CmXf9m7h/BtlAkLjnXhesv2HbD46DOAKgOozMSpa24WHgpn+TBLw7AfdgDldmk0VU3ZU2uZyOgg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=raspberrypi.com; spf=pass smtp.mailfrom=raspberrypi.com; dkim=pass (2048-bit key) header.d=raspberrypi.com header.i=@raspberrypi.com header.b=A/qNeR1O; arc=none smtp.client-ip=209.85.221.50 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=raspberrypi.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=raspberrypi.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=raspberrypi.com header.i=@raspberrypi.com header.b="A/qNeR1O" Received: by mail-wr1-f50.google.com with SMTP id ffacd0b85a97d-385eed29d17so3657772f8f.0 for ; Wed, 29 Jan 2025 07:03:59 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=raspberrypi.com; s=google; t=1738163037; x=1738767837; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=dRx91CfI5Jce/xhWdBK8oWXjfhN9M6Xj5IIyk3fewsg=; b=A/qNeR1On8LlORSOFHBV1Hmy1YEk5RnQUTULdUEaMlkf2VEfOrPB9VpZrPFCZCSbYw Vi2NF3uOBmR33edwrqAHDrxNzz3l2TZftSO7m2u2n049LfKgiDQft2X9E2OuJOtRVJDk wBgdVqOaySCIwJhyMD8Ti8JtVvD9eLhPL+nQFWviOU2EKHki+Xc/arNf8hVkBPod7uMg fjptDjQc0OfS77b165ji2Y4RR3EKOZGn3JSYD9mYvVdaYgUH6BOus8UCGoupjjj3V2Kn v998/YbTMf9+4F7+2RxTMoHhpYWNK64AqiX7hcLTmeQ4MjDtD4rbJkyYCY+Bjb2JLAef GBYg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738163037; x=1738767837; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=dRx91CfI5Jce/xhWdBK8oWXjfhN9M6Xj5IIyk3fewsg=; b=oapEzh0hbbJbruYSpkXDLctUS0IaGfGNq9Cct4WsRpS44JbXmcdMlQtBqCYIqPT05l WV4vHDEqA5sZiurIzZOd8jqZTHu9IS/5yosNDsDmZOPhU848L7RE+nVx0xnqpITHzB8K 69UzBret8kzz3Hdob86El3TJ0KLU5DxTz6W++lqNRSADIw7ooNwhMPZVmPOFifnB8Xkt uXifnqDaXCZnJXRFUqqnsltV43sKjEeZIPAcYSS2ZI5Xm80imRQsMmNzenFUqHkFImJU sg4BHZ8NGldA29NdpAFoUYi9Hy5lsV2FVEghItNeN4fheoiqo7isEjfxjVcIHx925nST DS8w== X-Forwarded-Encrypted: i=1; AJvYcCWssjQqqs0rkz5ajQFHC27Y7aV2GSdF8UAzZl1x0jY9jCMDZlr1gtSi1pyrfysKoRsfjLREzEwhfO7qMQ==@vger.kernel.org X-Gm-Message-State: AOJu0YwKTJEu8GRHg8wU+V/x6Ore/UgCoCm4QhtXaoDUvI+BT7GNf6Xd k5b5cRFaHydEMBTboHm3hJIGk9TymgR0qxMVcQ/xJRT6tAZzsaA1mYOyqlfLU0Q= X-Gm-Gg: ASbGncsRENgrgzo0UrhOEAKTD2ngNHM5Lj+ebvuoH0cvQmF2iqY6bVSGkNAHYiuWKIG U9kC8STb2v0NrMjzIQJm43vUCNCVKfZ7ekP7j1tAbO2A3yvl8XnoDj9SUXzwDL3Rx2bjnuKgAJI tJloO9DH1DudZJPRVvQCwsPfkJG5Lf8QMZ/hNByKRKFysv77MYbxBLlr37qRZMSw8v5/6OK1mFS /IXQaQAlffMRV0Y1x4hHrt7DADNWYqX2tV4v+EHjxy+nunA4PTfk8sfdXESfzf7esbyqgBwQn/e HPZdDOc= X-Google-Smtp-Source: AGHT+IGXpOzhv4uE4YFrNP/QQEVBcicFNjEiwOyKZDDXY+YWGDtK3GqK5L+TZ1mNCiGfXme17bqcnw== X-Received: by 2002:a05:6000:1fa4:b0:385:dc45:ea26 with SMTP id ffacd0b85a97d-38c5195e85cmr3073386f8f.12.1738163037084; Wed, 29 Jan 2025 07:03:57 -0800 (PST) Received: from [127.0.1.1] ([2a00:1098:3142:e::8]) by smtp.googlemail.com with ESMTPSA id 5b1f17b1804b1-438d755375bsm39074745e9.0.2025.01.29.07.03.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 29 Jan 2025 07:03:56 -0800 (PST) From: Dave Stevenson Date: Wed, 29 Jan 2025 15:03:51 +0000 Subject: [PATCH v3 3/3] media: i2c: imx415: Link frequencies are not exclusive to num lanes Precedence: bulk X-Mailing-List: linux-media@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250129-media-imx415-v3-3-d16d4fa8fc10@raspberrypi.com> References: <20250129-media-imx415-v3-0-d16d4fa8fc10@raspberrypi.com> In-Reply-To: <20250129-media-imx415-v3-0-d16d4fa8fc10@raspberrypi.com> To: Sakari Ailus , Michael Riesch , Mauro Carvalho Chehab Cc: Gerald Loacker , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Dave Stevenson , Gerald Loacker X-Mailer: b4 0.14.1 The link frequencies are equally valid in 2 or 4 lane modes, but they change the hmax_min value for the mode as the MIPI block has to have sufficient time to send the pixel data for each line. Remove the association with number of lanes, and add hmax_min configuration for both lane options. Reviewed-by: Michael Riesch Reviewed-by: Gerald Loacker Signed-off-by: Dave Stevenson --- drivers/media/i2c/imx415.c | 53 ++++++++++++++++++++++------------------------ 1 file changed, 25 insertions(+), 28 deletions(-) diff --git a/drivers/media/i2c/imx415.c b/drivers/media/i2c/imx415.c index 86dbcfcd820d..9f37779bd611 100644 --- a/drivers/media/i2c/imx415.c +++ b/drivers/media/i2c/imx415.c @@ -452,9 +452,8 @@ static const struct imx415_clk_params imx415_clk_params[] = { }, }; -/* all-pixel 2-lane 720 Mbps 15.74 Hz mode */ -static const struct cci_reg_sequence imx415_mode_2_720[] = { - { IMX415_LANEMODE, IMX415_LANEMODE_2 }, +/* 720 Mbps CSI configuration */ +static const struct cci_reg_sequence imx415_linkrate_720mbps[] = { { IMX415_TCLKPOST, 0x006F }, { IMX415_TCLKPREPARE, 0x002F }, { IMX415_TCLKTRAIL, 0x002F }, @@ -466,9 +465,8 @@ static const struct cci_reg_sequence imx415_mode_2_720[] = { { IMX415_TLPX, 0x0027 }, }; -/* all-pixel 2-lane 1440 Mbps 30.01 Hz mode */ -static const struct cci_reg_sequence imx415_mode_2_1440[] = { - { IMX415_LANEMODE, IMX415_LANEMODE_2 }, +/* 1440 Mbps CSI configuration */ +static const struct cci_reg_sequence imx415_linkrate_1440mbps[] = { { IMX415_TCLKPOST, 0x009F }, { IMX415_TCLKPREPARE, 0x0057 }, { IMX415_TCLKTRAIL, 0x0057 }, @@ -480,9 +478,8 @@ static const struct cci_reg_sequence imx415_mode_2_1440[] = { { IMX415_TLPX, 0x004F }, }; -/* all-pixel 4-lane 891 Mbps 30 Hz mode */ -static const struct cci_reg_sequence imx415_mode_4_891[] = { - { IMX415_LANEMODE, IMX415_LANEMODE_4 }, +/* 891 Mbps CSI configuration */ +static const struct cci_reg_sequence imx415_linkrate_891mbps[] = { { IMX415_TCLKPOST, 0x007F }, { IMX415_TCLKPREPARE, 0x0037 }, { IMX415_TCLKTRAIL, 0x0037 }, @@ -501,8 +498,7 @@ struct imx415_mode_reg_list { struct imx415_mode { u64 lane_rate; - u32 lanes; - u32 hmax_min; + u32 hmax_min[2]; struct imx415_mode_reg_list reg_list; }; @@ -510,29 +506,26 @@ struct imx415_mode { static const struct imx415_mode supported_modes[] = { { .lane_rate = 720000000, - .lanes = 2, - .hmax_min = 2032, + .hmax_min = { 2032, 1066 }, .reg_list = { - .num_of_regs = ARRAY_SIZE(imx415_mode_2_720), - .regs = imx415_mode_2_720, + .num_of_regs = ARRAY_SIZE(imx415_linkrate_720mbps), + .regs = imx415_linkrate_720mbps, }, }, { .lane_rate = 1440000000, - .lanes = 2, - .hmax_min = 1066, + .hmax_min = { 1066, 533 }, .reg_list = { - .num_of_regs = ARRAY_SIZE(imx415_mode_2_1440), - .regs = imx415_mode_2_1440, + .num_of_regs = ARRAY_SIZE(imx415_linkrate_1440mbps), + .regs = imx415_linkrate_1440mbps, }, }, { .lane_rate = 891000000, - .lanes = 4, - .hmax_min = 1100, + .hmax_min = { 2200, 1100 }, .reg_list = { - .num_of_regs = ARRAY_SIZE(imx415_mode_4_891), - .regs = imx415_mode_4_891, + .num_of_regs = ARRAY_SIZE(imx415_linkrate_891mbps), + .regs = imx415_linkrate_891mbps, }, }, }; @@ -784,7 +777,8 @@ static int imx415_ctrls_init(struct imx415 *sensor) { struct v4l2_fwnode_device_properties props; struct v4l2_ctrl *ctrl; - u64 lane_rate = supported_modes[sensor->cur_mode].lane_rate; + const struct imx415_mode *cur_mode = &supported_modes[sensor->cur_mode]; + u64 lane_rate = cur_mode->lane_rate; u32 exposure_max = IMX415_PIXEL_ARRAY_HEIGHT + IMX415_PIXEL_ARRAY_VBLANK - IMX415_EXPOSURE_OFFSET; @@ -825,7 +819,7 @@ static int imx415_ctrls_init(struct imx415 *sensor) IMX415_AGAIN_MAX, IMX415_AGAIN_STEP, IMX415_AGAIN_MIN); - hblank_min = (supported_modes[sensor->cur_mode].hmax_min * + hblank_min = (cur_mode->hmax_min[sensor->num_data_lanes == 2 ? 0 : 1] * IMX415_HMAX_MULTIPLIER) - IMX415_PIXEL_ARRAY_WIDTH; hblank_max = (IMX415_HMAX_MAX * IMX415_HMAX_MULTIPLIER) - IMX415_PIXEL_ARRAY_WIDTH; @@ -887,7 +881,12 @@ static int imx415_set_mode(struct imx415 *sensor, int mode) IMX415_NUM_CLK_PARAM_REGS, &ret); - return 0; + ret = cci_write(sensor->regmap, IMX415_LANEMODE, + sensor->num_data_lanes == 2 ? IMX415_LANEMODE_2 : + IMX415_LANEMODE_4, + NULL); + + return ret; } static int imx415_setup(struct imx415 *sensor, struct v4l2_subdev_state *state) @@ -1298,8 +1297,6 @@ static int imx415_parse_hw_config(struct imx415 *sensor) } for (j = 0; j < ARRAY_SIZE(supported_modes); ++j) { - if (sensor->num_data_lanes != supported_modes[j].lanes) - continue; if (bus_cfg.link_frequencies[i] * 2 != supported_modes[j].lane_rate) continue;