From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E638D46EC86 for ; Tue, 1 Sep 2026 07:40:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.168.131 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788248448; cv=none; b=OqZXCO7tL58aqDLM2KMIpMrZ5+9wy9U/DP+jNpE4x9SIerT/oul4tYBc0obusjeGUNtXnO/H2VFSy23Bf8Yl1Te52ldZ+sCBG8J9QT41Vgc1Z/SY7MUL7fJLts9UQoKZFGcq2cdVyc01jDAMRrSJVcIKzHp0ThH4bH0i70S04z8= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788248448; c=relaxed/simple; bh=v7MWIqfZGj0yHDCscd2nMkMidCP3VrHdRkNj3te5k4Y=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=cx5m9wuYqqdtNkp58PFDkSFopIzX5mpV91D+vQqsMPjrbGXztuzNVrm8R6vRwNLYACQA8GEt8jWYHV2sMroGs7G+wxrJLnQ482UUImd+qt7HNyA5AYqlxS0kFl5iD8JpgSw8VzAW7G+2gR5VuiboECZHYbCx+GxUmzgSF5qwpzY= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=NCjRr2Ht; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=d1QjGNlP; arc=none smtp.client-ip=205.220.168.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="NCjRr2Ht"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="d1QjGNlP" Received: from pps.filterd (m0279866.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 681797eV1211433 for ; Tue, 1 Sep 2026 07:40:46 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= QX8sc1P0bS5z/s1DFAa4RJ5nBk8cITbsWxAeNOYvxes=; b=NCjRr2Ht2hmMakG9 pUTWfAgZBzZPKAV6MD0Je/UeXkNRvqFPnMAhrdVUtMDLbSB/JmL1uU+I4HpNCLOs nAGlPpFg8V+6pVziOLeD7NUBzp+G8bZkbcnSil/SZNXhznXc0otgCSG5k82eZh7c VOlgENEg/zkrImOkeTRuBk2Ynh44X46Bs9XJdVWOD+NJZJftWA4+6c8ODTlBCBDm onb+mOZ7ZAzoKVEV3AtmyQ0xAnlkaTFif2/ZgFdyvxTDHHNtHa9mFRVcOzoT0db5 X5KATV3aLjvrBdzYEn3oxdoXcqsx9iGApB8UtUD3/VIUGd6R6FD2RWGcMy+w+MVg N8KySw== Received: from mail-qk1-f197.google.com (mail-qk1-f197.google.com [209.85.222.197]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4gdnk8sa4j-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Tue, 01 Sep 2026 07:40:46 +0000 (GMT) Received: by mail-qk1-f197.google.com with SMTP id af79cd13be357-92e62e3459fso604642785a.0 for ; Tue, 01 Sep 2026 00:40:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1788248445; x=1788853245; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=QX8sc1P0bS5z/s1DFAa4RJ5nBk8cITbsWxAeNOYvxes=; b=d1QjGNlPKZG/Xq7dyg4gXWcNgO3W/eqx3VxGLy97oDwM4egZ3LQZxvXD+31ADXykpr xqnoEqbAOZJwxorTdv/MO8izQNgJD0pXvW9YIusnnN3CP784B/whl875bR7SQ3mcxIrs 9NnrTjkOR+pr3p0TGc+l0CMXM+9+0ay4ORHualc2hUovyAABTdEGSRhJ39pOwDqbA+qp R4dDD2xztfdquxARNVEHdDIxNCbaRQGqzI0jP8fhCFCVT+E+TvrPPUJu6IiBW/uinoyX 8bAnhMBsVYzdZlyH7yiA0Axa9mNhoybRDV/ZNetAp4LatWWjBCIcP0ouTv2q6BvlL7Sl 1y2A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788248445; x=1788853245; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=QX8sc1P0bS5z/s1DFAa4RJ5nBk8cITbsWxAeNOYvxes=; b=UI8VN2twRxmX6g8vqyenyj+Qkv5LStiFzdQ5LfC/Ac9J70dEOvCvXSsjF73ZtEDzVO nf/zbyF0XLVDDv8tZDzxSKWtRCQ8pJuSFfp4aW7wZ2mhn6fPHfeUV8ptarLewuQa9p3Q Uhn3YWciFFLRHf7poGUUC7aOFMlLLRtopQpbuZpol861d7R/BLTX4bSBnTUbJbpxsrg6 qMBosDOUGcfy9WhDQyUw4mdqfhzYEfunKRMvTn2SWcpaUXdqlgXtalOvFgyWbl4Vck+s MXcJtbeKxd0+W6PGKMHdXg7kcTNEllFiRSwmq8K0bHStqKgvnN85oVlVkMOSyMLV6OPw 3+8A== X-Forwarded-Encrypted: i=1; AHgh+RqhMkIFNZzHa0RR6LL+eGr36omEVHjyM9tRrV5p/ZE3wJIVQ4157Wqk4ii5rZ3LvhIX2MIwFobnlysk@vger.kernel.org X-Gm-Message-State: AFuF++l4WymxMhyiSd2Batm5C6ui0J+RwYy+gJ/UQyma+gFuNw9HOWat rH2D/+fPt1HTc//hFaJFc7kpT8jwZZ0aj2Dj3k1nbPoUJs1eQdIgE3FOjrkz3MST7Fc4r3QgJko Z2sxA3V4dNDp1LwNJz+BwxgSXLcuhCS9qiwQA+tnCuGLrRMQ7B8H765Ij6N0nB9E9YLYpFPqAFE 8= X-Gm-Gg: AR+sD11CDi4ZPtFJKG2tLFj/MuZ4Rgzm68TG+nTATmHi4LNFAxdHupyENIq/XKwb5wg Qgims0Y43mOi8kX66rk1aGJJ9ZiFLwYNI+dIxKZYLz6bOeYZz/nDkADZXyJuMhoyvoKb4qNrDAl x2gfHJe6MmANvKI56Mo+uaF1WVN299ZymZ4tZV9VA/Jm4Y6YFg2QM8dSXHaAgrVwnLuNRppOkl4 S0C2Wdv89SsAjHDX9Pjq5+oGuv2UW8apFl9EOl9+tb+uaeACHtSCCAvI0owL5SBPcF2DjoCnxUy wYtcSD/UkNMJ6LeSpNZaJjppgqEOacg0/Smw/oBQMm3XzhX0aMdV0u4xk8GlYdZTv2tEjBauWP0 esjAk/ndAHp6lPIjxFu2W9vhvgj3ULXVqxhxaCvzO8FF1hdXmO6Yqm/giAp9qOkaR6qbU X-Received: by 2002:a05:620a:6988:b0:939:1c6:38ef with SMTP id af79cd13be357-9391374de9fmr3640364885a.6.1788248444996; Tue, 01 Sep 2026 00:40:44 -0700 (PDT) X-Received: by 2002:a05:620a:6988:b0:939:1c6:38ef with SMTP id af79cd13be357-9391374de9fmr3640358785a.6.1788248444279; Tue, 01 Sep 2026 00:40:44 -0700 (PDT) Received: from WENMLIU-LAB01.ap.qualcomm.com (Global_NAT1_IAD_FW.qualcomm.com. [129.46.232.65]) by smtp.gmail.com with ESMTPSA id af79cd13be357-939173f2758sm960412685a.37.2026.09.01.00.40.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 01 Sep 2026 00:40:43 -0700 (PDT) From: Wenmeng Liu Date: Tue, 01 Sep 2026 15:40:06 +0800 Subject: [PATCH v6 3/4] media: i2c: og0ve1b: Introduce per-sensor data structure Precedence: bulk X-Mailing-List: devicetree@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Message-Id: <20260901-og0va1b-v6-3-a05b2d04c892@oss.qualcomm.com> References: <20260901-og0va1b-v6-0-a05b2d04c892@oss.qualcomm.com> In-Reply-To: <20260901-og0va1b-v6-0-a05b2d04c892@oss.qualcomm.com> To: Mauro Carvalho Chehab , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Sakari Ailus , Vladimir Zapolskiy Cc: linux-media@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Wenmeng Liu X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1788248425; l=10303; i=wenmeng.liu@oss.qualcomm.com; s=20250925; h=from:subject:message-id; bh=v7MWIqfZGj0yHDCscd2nMkMidCP3VrHdRkNj3te5k4Y=; b=98ApIynftEKaPmddBk6jSc+zz4ZN5QdQbdXFn5cZjVPYPvoP9PEr6QTnKHoXwv7xNItO2tevY xdcEeQVqsfrDfGoL7m4wrA2NgjDJ+qT1No5AmCQ3ADLjHcNmmeU5qSV X-Developer-Key: i=wenmeng.liu@oss.qualcomm.com; a=ed25519; pk=fQJjf9C3jGDjE1zj2kO3NQLTbQEaZObVcXAzx5WLPX0= X-Authority-Analysis: v=2.4 cv=f6p4wuyM c=1 sm=1 tr=0 ts=6a96817e cx=c_pps a=50t2pK5VMbmlHzFWWp8p/g==:117 a=C3Dk8TwHQYyIj7nOf9RCJw==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=YMgV9FUhrdKAYTUUvYB2:22 a=KKAkSRfTAAAA:8 a=EUspDBNiAAAA:8 a=aIh3vjFOF9panSEBuokA:9 a=QEXdDO2ut3YA:10 a=IoWCM6iH3mJn3m4BftBB:22 a=cvBusfyB2V15izCimMoJ:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTAxMDA2NyBTYWx0ZWRfX/VMYAbd8EWCw C5lXZy610Fpfw0YGE9RHF5+Yo9FrZWl/3aNwUyjyTo42C9PSKFJRx1PLdEjxUTow3pGlkEfK3Eh R7m66iCoAvxtH4GQhA5EBsbLm7fo6aCLLW7axSo5/0fdYJJ//gFPB3V7jO1LSkO772P+fb0+2yd 3Ta/rtoVNewh46gt3mFezIWqHi+quXHW6Wsi6TOp3tFJaGbRUqfk7aMX96BZ0qwOqp1moLy0X2G 2GZG0Hc1TqOJTyhgw3wUFT3UxJfDk1OB8vYVoiBdyDOLqVjk43ZZVWm+/PRF+TUQvoq3QcNKQkb u+LO6+FuQ2X3KUYjRt4BJnTFsr2QDl1G8XwHjGsLsZQS97K6f/qwRbbruRGPN+JBzwOfp2kTL07 VqBiGFlNE911ayyCBroy2V5i0MfmhzAbinxf4ARAqIs4RPhubVxNitWlZhU310+NSHJ4AxiB47E PGmsTEnFDSz6K3gvEnw== X-Proofpoint-ORIG-GUID: LwlxahEXbQXlZL1WnzPMRfiqpLC9rRoL X-Proofpoint-Spam-Info: AW1haW4tMjYwOTAxMDA2NyBTYWx0ZWRfX3qQRbF/Zh0OD cQE797sOACnnA3TF/Z2thmPfBGEW2vO8ZuJcM/B5kwDumPKxMAGUi33cB6cAwN6tnt8CM7yg9wp zEEJxKkW6O8udn2XGvzvcgHftzafVlU= X-Proofpoint-GUID: LwlxahEXbQXlZL1WnzPMRfiqpLC9rRoL X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-01_02,2026-08-31_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 clxscore=1015 malwarescore=0 priorityscore=1501 suspectscore=0 impostorscore=0 spamscore=0 phishscore=0 lowpriorityscore=0 bulkscore=0 adultscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2609010067 Refactor the driver to separate sensor-specific data from the common driver code. Introduce a sensor_data structure, populated through i2c_get_match_data(), to hold the chip ID, MCLK frequency, link frequencies and supported modes. Test pattern programming is described by a per-sensor callback, and each mode stores its media bus format code (rather than a bits-per-pixel value) so that sensors with a different output format can be supported. Reviewed-by: Vladimir Zapolskiy Tested-by: Vladimir Zapolskiy Signed-off-by: Wenmeng Liu --- drivers/media/i2c/og0ve1b.c | 100 +++++++++++++++++++++++++++++++------------- 1 file changed, 72 insertions(+), 28 deletions(-) diff --git a/drivers/media/i2c/og0ve1b.c b/drivers/media/i2c/og0ve1b.c index da5c8e49d4a811f55736bd89c6922856f2e7391c..f560d5d90fda94abf4bc622c5e4f861b078b811f 100644 --- a/drivers/media/i2c/og0ve1b.c +++ b/drivers/media/i2c/og0ve1b.c @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include @@ -65,11 +66,23 @@ struct og0ve1b_mode { u32 height; /* Frame height in pixels */ u32 hts; /* Horizontal timing size */ u32 vts; /* Default vertical timing size */ - u32 bpp; /* Bits per pixel */ + u32 code; /* MEDIA_BUS_FMT code */ const struct og0ve1b_reg_list reg_list; /* Sensor register setting */ }; +struct og0ve1b; + +struct og0ve1b_sensor_data { + u64 chip_id; + unsigned long mclk_freq; + int (*enable_test_pattern)(struct og0ve1b *og0ve1b, u32 pattern); + const s64 *link_freq_menu; + int num_link_freqs; + const struct og0ve1b_mode *modes; + int num_modes; +}; + static const char * const og0ve1b_test_pattern_menu[] = { "Disabled", "Standard Test Bar", @@ -99,6 +112,8 @@ struct og0ve1b { /* Saved register value */ u64 pre_isp; + + const struct og0ve1b_sensor_data *data; }; static const struct cci_reg_sequence og0ve1b_640x480_120fps_mode[] = { @@ -247,13 +262,13 @@ static const struct cci_reg_sequence og0ve1b_640x480_120fps_mode[] = { { CCI_REG8(0x3f47), 0x35 }, }; -static const struct og0ve1b_mode supported_modes[] = { +static const struct og0ve1b_mode og0ve1b_supported_modes[] = { { .width = 640, .height = 480, .hts = 792, .vts = 568, - .bpp = 8, + .code = MEDIA_BUS_FMT_Y8_1X8, .reg_list = { .regs = og0ve1b_640x480_120fps_mode, .num_regs = ARRAY_SIZE(og0ve1b_640x480_120fps_mode), @@ -273,11 +288,21 @@ static int og0ve1b_enable_test_pattern(struct og0ve1b *og0ve1b, u32 pattern) return cci_write(og0ve1b->regmap, OG0VE1B_REG_PRE_ISP, val, NULL); } +static const struct og0ve1b_sensor_data og0ve1b_data = { + .chip_id = OG0VE1B_CHIP_ID, + .mclk_freq = OG0VE1B_MCLK_FREQ_24MHZ, + .enable_test_pattern = og0ve1b_enable_test_pattern, + .link_freq_menu = og0ve1b_link_freq_menu, + .num_link_freqs = ARRAY_SIZE(og0ve1b_link_freq_menu), + .modes = og0ve1b_supported_modes, + .num_modes = ARRAY_SIZE(og0ve1b_supported_modes), +}; + static int og0ve1b_set_ctrl(struct v4l2_ctrl *ctrl) { struct og0ve1b *og0ve1b = container_of(ctrl->handler, struct og0ve1b, ctrl_handler); - const struct og0ve1b_mode *mode = &supported_modes[0]; + const struct og0ve1b_mode *mode = &og0ve1b->data->modes[0]; s64 exposure_max; int ret; @@ -314,7 +339,7 @@ static int og0ve1b_set_ctrl(struct v4l2_ctrl *ctrl) ctrl->val + mode->height, NULL); break; case V4L2_CID_TEST_PATTERN: - ret = og0ve1b_enable_test_pattern(og0ve1b, ctrl->val); + ret = og0ve1b->data->enable_test_pattern(og0ve1b, ctrl->val); break; default: ret = -EINVAL; @@ -330,10 +355,19 @@ static const struct v4l2_ctrl_ops og0ve1b_ctrl_ops = { .s_ctrl = og0ve1b_set_ctrl, }; +static s64 og0ve1b_pixel_rate(const struct og0ve1b_sensor_data *data) +{ + const struct og0ve1b_mode *mode = &data->modes[0]; + unsigned int bpp = mode->code == MEDIA_BUS_FMT_Y8_1X8 ? 8 : 10; + + return div_u64(data->link_freq_menu[0], bpp); +} + static int og0ve1b_init_controls(struct og0ve1b *og0ve1b) { struct v4l2_ctrl_handler *ctrl_hdlr = &og0ve1b->ctrl_handler; - const struct og0ve1b_mode *mode = &supported_modes[0]; + const struct og0ve1b_mode *mode = &og0ve1b->data->modes[0]; + const struct og0ve1b_sensor_data *data = og0ve1b->data; s64 exposure_max, pixel_rate, h_blank, v_blank; struct v4l2_fwnode_device_properties props; struct v4l2_ctrl *ctrl; @@ -343,12 +377,12 @@ static int og0ve1b_init_controls(struct og0ve1b *og0ve1b) ctrl = v4l2_ctrl_new_int_menu(ctrl_hdlr, &og0ve1b_ctrl_ops, V4L2_CID_LINK_FREQ, - ARRAY_SIZE(og0ve1b_link_freq_menu) - 1, - 0, og0ve1b_link_freq_menu); + data->num_link_freqs - 1, + 0, data->link_freq_menu); if (ctrl) ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY; - pixel_rate = og0ve1b_link_freq_menu[0] / mode->bpp; + pixel_rate = og0ve1b_pixel_rate(data); v4l2_ctrl_new_std(ctrl_hdlr, &og0ve1b_ctrl_ops, V4L2_CID_PIXEL_RATE, 0, pixel_rate, 1, pixel_rate); @@ -407,7 +441,7 @@ static int og0ve1b_init_controls(struct og0ve1b *og0ve1b) static void og0ve1b_update_pad_format(const struct og0ve1b_mode *mode, struct v4l2_mbus_framefmt *fmt) { - fmt->code = MEDIA_BUS_FMT_Y8_1X8; + fmt->code = mode->code; fmt->width = mode->width; fmt->height = mode->height; fmt->field = V4L2_FIELD_NONE; @@ -421,8 +455,8 @@ static int og0ve1b_enable_streams(struct v4l2_subdev *sd, struct v4l2_subdev_state *state, u32 pad, u64 streams_mask) { - const struct og0ve1b_reg_list *reg_list = &supported_modes[0].reg_list; struct og0ve1b *og0ve1b = to_og0ve1b(sd); + const struct og0ve1b_reg_list *reg_list = &og0ve1b->data->modes[0].reg_list; int ret; ret = pm_runtime_resume_and_get(og0ve1b->dev); @@ -484,13 +518,14 @@ static int og0ve1b_set_pad_format(struct v4l2_subdev *sd, struct v4l2_subdev_state *state, struct v4l2_subdev_format *fmt) { + struct og0ve1b *og0ve1b = to_og0ve1b(sd); struct v4l2_mbus_framefmt *format; const struct og0ve1b_mode *mode; format = v4l2_subdev_state_get_format(state, 0); - mode = v4l2_find_nearest_size(supported_modes, - ARRAY_SIZE(supported_modes), + mode = v4l2_find_nearest_size(og0ve1b->data->modes, + og0ve1b->data->num_modes, width, height, fmt->format.width, fmt->format.height); @@ -505,10 +540,12 @@ static int og0ve1b_enum_mbus_code(struct v4l2_subdev *sd, struct v4l2_subdev_state *sd_state, struct v4l2_subdev_mbus_code_enum *code) { + struct og0ve1b *og0ve1b = to_og0ve1b(sd); + if (code->index > 0) return -EINVAL; - code->code = MEDIA_BUS_FMT_Y8_1X8; + code->code = og0ve1b->data->modes[0].code; return 0; } @@ -517,15 +554,18 @@ static int og0ve1b_enum_frame_size(struct v4l2_subdev *sd, struct v4l2_subdev_state *sd_state, struct v4l2_subdev_frame_size_enum *fse) { - if (fse->index >= ARRAY_SIZE(supported_modes)) + struct og0ve1b *og0ve1b = to_og0ve1b(sd); + const struct og0ve1b_sensor_data *data = og0ve1b->data; + + if (fse->index >= data->num_modes) return -EINVAL; - if (fse->code != MEDIA_BUS_FMT_Y8_1X8) + if (fse->code != data->modes[fse->index].code) return -EINVAL; - fse->min_width = supported_modes[fse->index].width; + fse->min_width = data->modes[fse->index].width; fse->max_width = fse->min_width; - fse->min_height = supported_modes[fse->index].height; + fse->min_height = data->modes[fse->index].height; fse->max_height = fse->min_height; return 0; @@ -534,13 +574,14 @@ static int og0ve1b_enum_frame_size(struct v4l2_subdev *sd, static int og0ve1b_init_state(struct v4l2_subdev *sd, struct v4l2_subdev_state *state) { + const struct og0ve1b_mode *mode = &to_og0ve1b(sd)->data->modes[0]; struct v4l2_subdev_format fmt = { .which = V4L2_SUBDEV_FORMAT_TRY, .pad = 0, .format = { - .code = MEDIA_BUS_FMT_Y8_1X8, - .width = supported_modes[0].width, - .height = supported_modes[0].height, + .code = mode->code, + .width = mode->width, + .height = mode->height, }, }; @@ -586,9 +627,9 @@ static int og0ve1b_identify_sensor(struct og0ve1b *og0ve1b) return ret; } - if (val != OG0VE1B_CHIP_ID) { - dev_err(og0ve1b->dev, "chip id mismatch: %x!=%llx\n", - OG0VE1B_CHIP_ID, val); + if (val != og0ve1b->data->chip_id) { + dev_err(og0ve1b->dev, "chip id mismatch: %llx!=%llx\n", + og0ve1b->data->chip_id, val); return -ENODEV; } @@ -624,8 +665,8 @@ static int og0ve1b_check_hwcfg(struct og0ve1b *og0ve1b) ret = v4l2_link_freq_to_bitmap(og0ve1b->dev, bus_cfg.link_frequencies, bus_cfg.nr_of_link_frequencies, - og0ve1b_link_freq_menu, - ARRAY_SIZE(og0ve1b_link_freq_menu), + og0ve1b->data->link_freq_menu, + og0ve1b->data->num_link_freqs, &freq_bitmap); v4l2_fwnode_endpoint_free(&bus_cfg); @@ -686,6 +727,9 @@ static int og0ve1b_probe(struct i2c_client *client) return -ENOMEM; og0ve1b->dev = &client->dev; + og0ve1b->data = i2c_get_match_data(client); + if (!og0ve1b->data) + return -ENODEV; v4l2_i2c_subdev_init(&og0ve1b->sd, client, &og0ve1b_subdev_ops); @@ -700,7 +744,7 @@ static int og0ve1b_probe(struct i2c_client *client) "failed to get XVCLK clock\n"); freq = clk_get_rate(og0ve1b->xvclk); - if (freq && freq != OG0VE1B_MCLK_FREQ_24MHZ) + if (freq && freq != og0ve1b->data->mclk_freq) return dev_err_probe(og0ve1b->dev, -EINVAL, "XVCLK clock frequency %lu is not supported\n", freq); @@ -819,7 +863,7 @@ static const struct dev_pm_ops og0ve1b_pm_ops = { }; static const struct of_device_id og0ve1b_of_match[] = { - { .compatible = "ovti,og0ve1b" }, + { .compatible = "ovti,og0ve1b", .data = &og0ve1b_data }, { /* sentinel */ } }; MODULE_DEVICE_TABLE(of, og0ve1b_of_match); -- 2.34.1