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 370C430D40A for ; Mon, 6 Jul 2026 13:36:55 +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=1783345016; cv=none; b=qnVFl8mCujnK+EkgNWc5fWbQmwA+5BAk946ECfbjzibq3lRhLM9Q8aO5hH07jnp6OAhTOukMMxadEsfeFpNmk3VnV1NgwjgSeGpKVB3FCn5+0COwGUvraeCXy1IeeSpgTaib0ZBQdSCODiNiwIaiu3d9+FtUiLJt+ZuP3xmrxOo= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783345016; c=relaxed/simple; bh=22XxSqPTTinhdCsHhAhUyLD2I1GFB/vKsOtziG+TO6E=; h=Message-ID:Date:MIME-Version:Subject:To:Cc:References:From: In-Reply-To:Content-Type; b=hYa0/6EV/84tCDUdWjhDHNnU2oQhCgoeX0pt39qZ4/t7/jWI96l5YdEomP4ADfvyfVqeBqJzB7W7L5vwPNxiEUeOroZ5cpbfc/txJXmFq6cu6PNkra71ES5bVb1Tcl23Qq+wdpK/id4EuFN0DEUEhBb6kyV/Z0EQjrMadkvhEzw= 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=QXrOJrv0; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=cadffuoT; 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="QXrOJrv0"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="cadffuoT" Received: from pps.filterd (m0279862.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 666AxOW4245767 for ; Mon, 6 Jul 2026 13:36:54 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= l8ZZtBjQeAfeh4dvsZsxHmTUITCtRw12ZA7v79AMXFg=; b=QXrOJrv0zPOT/MlP 9ohOFvqSSjjken0OjZ+nrrkpcrkYgY5Lx5HO2WOTE8yUzvfzBfsUuOv3cLmrnLgE 4CHJDdh5pRQcjQwqWKF2xx/QkOktKpsDdsru7+QeQKAWVwy9p3WXojKanzJlAAP7 iz4JCxDJMVuQO+VwRsWe8T/Pk2ds74QMCniRkgjdMq4ptKvuI/sYJPkLOhVUmga8 9k+/2SWwpZeEECEXSVsDQqnYD+GN2QNNTd7FQ7CO7wIIOLmHzdJmOsKseviXKoks wPCjJFGS9wx+2zKtSUQSA0HHfTSpLJWw1c6pwsCwhuQLGeL9d+XQx7E2aYaaTyX7 7xBKMw== 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 4f8a98gt0j-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Mon, 06 Jul 2026 13:36:54 +0000 (GMT) Received: by mail-qk1-f197.google.com with SMTP id af79cd13be357-92e538afe65so293673385a.3 for ; Mon, 06 Jul 2026 06:36:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1783345013; x=1783949813; darn=vger.kernel.org; h=content-transfer-encoding:in-reply-to:from:content-language :references:cc:to:subject:user-agent:mime-version:date:message-id :from:to:cc:subject:date:message-id:reply-to; bh=l8ZZtBjQeAfeh4dvsZsxHmTUITCtRw12ZA7v79AMXFg=; b=cadffuoT1K41Ux0kCHthT3rdVpoqtztivsHnWtM7n1XP8CVbfBEpiRZznT5PMuPEjN lyLYGVWVV2DUOds/nrAeqj2ssep7qEO3zUbxc7vks4+x2xKWteEeMVN626NzhWJ/Ot4v XXeSq7TqNWd5yUbq9VLHiM6wsf8dymMmovfrqPfpy5voGiADFprqIoD1H1zPaW4J1A0D sWZZ6BQ0PqqlXGww1a5jbzkR+CGhXrZPz64MK2WX0Ev/BR0Dq+S2rwY3D+UbjtF7kRcn zHNCYyA5yg8qh8P9i8jMkPEcpf1zfNp0Bihznk7zhB3qD2tiWpzikU5N+whzGn3hsuEJ 4jnQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1783345013; x=1783949813; h=content-transfer-encoding:in-reply-to:from:content-language :references:cc:to:subject:user-agent:mime-version:date:message-id :x-gm-gg:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=l8ZZtBjQeAfeh4dvsZsxHmTUITCtRw12ZA7v79AMXFg=; b=hB/5GLe9+aBSpGDhwzhCQp60+f5gY80jPnm63WKklcjuScncQOri/9BiLfGTpq7yPQ x6FhqcPMhg4Ycfxg1AxaALQ+rAuR15eD2RvGN92KG32wP3ZxtWP9VrfjK01cSnOf1iWQ tO4YvZG1XmydxomrASeuttZPyp28kp63y4t3TycRTfnn1IauyT5hGh9WS2yBdpacQa3P aLGq0zsNxGqxEZo3U6mqcF0hHatjTcv3fZQA3ZTyv2HGujzT+Ct3zPAX/eMuAVhZfZ+S riQIxOyy44M0b881/vocp58Pyov5olfb+s8FuMv4EBPFzEBv1ALUmZA9BUTAlM9pQc42 loWA== X-Forwarded-Encrypted: i=1; AHgh+Rqysb4/B/wDSQg/O6N40J1ZozuHczEDcyMLycN44qdsZTi2fFNpweYk+rYCBJ9eitOBCo97tVKBg72/xoQ=@vger.kernel.org X-Gm-Message-State: AOJu0YwDmbmFxrafSKGrpK32/iYZoDbTwatKiqbYe409ue4U5oc66kZj lwpz/vG24zFCl9dbU9hmJxHy/LWLd/gbYsz4aVCwz4eARApSDiIepVRpAT/CrlmMfKsZ+xcbIr7 /lyzpEm8uETBRFzY5YbEE6MAaDQ20kJrzoDes8UKwncEXpi+YzXDNDg67PfHXsKIMfIo= X-Gm-Gg: AfdE7cnQIyc+4W2yqJCNE4TGp0sXEoHFmCSml4YxWq14h77hF2LUlvteE1KX22ywzm8 jHxfs7rueykaB82xXzxvUqmxrnfru5w8qWH2RDDDpivW3+88v4dUExosiI4XUQI8Sn6P+mlfiMa Dp1BJUxTKzn+33kpKPOcdFCAc9rDIpt5zBZmoIkDeM/pbAh7Zsfzj2GZ9qsCQecL6vCaCr8P3tN /F2nYTUni0VSJd2irIHMCf5XoNU1gKFUpvTsfjxQ/39vBkcumRHT060oK/UGAE1gnl9B4rzSyFe ONuQFjJRJ6R1Fj6bwSMn1J6q+QB3XqFsZZ9NOqeRL5ij1/kLyx3n8k5mHvH07jdlsaVWxy3eLja co8I1HtgnSSzcSXeCGyYQwpPljC1ukMwhWVZeh5EskaLgzrVF3CggSMeE2h1EIP2JKIR2OUNB X-Received: by 2002:a05:620a:3195:b0:915:fb92:d599 with SMTP id af79cd13be357-92ebb4f9f70mr83956385a.25.1783345013128; Mon, 06 Jul 2026 06:36:53 -0700 (PDT) X-Received: by 2002:a05:620a:3195:b0:915:fb92:d599 with SMTP id af79cd13be357-92ebb4f9f70mr83950785a.25.1783345012513; Mon, 06 Jul 2026 06:36:52 -0700 (PDT) Received: from [10.38.242.66] (Global_NAT1_IAD_FW.qualcomm.com. [129.46.232.65]) by smtp.gmail.com with ESMTPSA id af79cd13be357-92e90ccde4fsm944642685a.39.2026.07.06.06.36.48 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Mon, 06 Jul 2026 06:36:51 -0700 (PDT) Message-ID: Date: Mon, 6 Jul 2026 21:36:46 +0800 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH v2 2/3] media: i2c: og0ve1b: Introduce per-sensor data structure To: Bryan O'Donoghue , 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 References: <20260702-og0va1b-v2-0-0071442caa2a@oss.qualcomm.com> <20260702-og0va1b-v2-2-0071442caa2a@oss.qualcomm.com> <5019684c-ace6-4202-97ca-98016df77d86@kernel.org> Content-Language: en-US From: Wenmeng Liu In-Reply-To: <5019684c-ace6-4202-97ca-98016df77d86@kernel.org> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit X-Authority-Analysis: v=2.4 cv=SpigLvO0 c=1 sm=1 tr=0 ts=6a4baf76 cx=c_pps a=50t2pK5VMbmlHzFWWp8p/g==:117 a=C3Dk8TwHQYyIj7nOf9RCJw==:17 a=IkcTkHD0fZMA:10 a=RAioF0-LDSMA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=_K5XuSEh1TEqbUxoQ0s3:22 a=EUspDBNiAAAA:8 a=cBbTYWgxSLdpbU4s1esA:9 a=3ZKOabzyN94A:10 a=QEXdDO2ut3YA:10 a=IoWCM6iH3mJn3m4BftBB:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNzA2MDEzOCBTYWx0ZWRfXyJPvZ2cLRoMw f/799u5zREZL6ZXxpapNAJUu3+nTMHnckTi/AkwyZyw3BW/aaQ2/L9MGNALCSdLa/7G3Ay6uhdZ JlypZrlxHIdYRfVloV5TCRAgGqlcT6oISyN6SjgpnYIZemvOQPZe2i88+JbeQh2jJQNldv1ymkW llC4fKoE5Rnb7oi+V9PZD6Ry0KQcTCRooTiM7Cq5F0iBnlpMBesaxkSeaBATWDdGD1V7wBCg27w 5AaONgajf/wSFayxhQPQqViAblvGXI8/KsMUb/7vZe7RY+BqcDAXK6rkFaYb1J32B8STgh8wvQf l8vw/FfiNdGEc8dBu3IIihxf1OVE7b0FWt3g/F315Jj53rper9cGMF2TvXatCnrGPaQ3qmH7EIF yOubydtJip/yXp9NliQJMRIlLqA22pCFds41zlk1iQal7WUJOQJ2TzVbxiyELL0iNuJ7MkrTgCn P3br35onykx3evkDUNg== X-Proofpoint-Spam-Info: AW1haW4tMjYwNzA2MDEzOCBTYWx0ZWRfX0j0HnllsnGcP cuVukxihAuGb4w8TpZxnmDSLcimczQBJFEM9kpG5UBoM3rGp9dMHi+JpLohp2+tSMdA9y/eomXs 1PqZgzzNVOFgIDFZaH2nB5MM3TpW6Yc= X-Proofpoint-GUID: F1Y5ifV30IBHOfDL6eYnCoRNlm-mFIis X-Proofpoint-ORIG-GUID: F1Y5ifV30IBHOfDL6eYnCoRNlm-mFIis X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-07-06_01,2026-07-06_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 priorityscore=1501 spamscore=0 clxscore=1015 phishscore=0 bulkscore=0 adultscore=0 suspectscore=0 impostorscore=0 lowpriorityscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2607060138 Hi Bryan, On 7/3/2026 12:31 AM, Bryan O'Donoghue wrote: > On 02/07/2026 11:52, Wenmeng Liu wrote: >> In preparation for supporting further OmniVision sensors that share most >> of this driver, move the sensor-specific parameters (chip id, MCLK >> frequency, test pattern register, link frequency menu and the list of >> supported modes) into a new struct og0ve1b_sensor_data, selected through >> i2c_get_match_data() at probe time. >> >> Signed-off-by: Wenmeng Liu >> --- >>   drivers/media/i2c/og0ve1b.c | 101 ++++++++++++++++++++++++++++ >> +--------------- >>   1 file changed, 67 insertions(+), 34 deletions(-) >> >> diff --git a/drivers/media/i2c/og0ve1b.c b/drivers/media/i2c/og0ve1b.c >> index >> 84a28cdcade10f8fbcf945999e88f84641b9bc0d..acc06b10bf896f734926289099a70fbc2bb628d5 100644 >> --- a/drivers/media/i2c/og0ve1b.c >> +++ b/drivers/media/i2c/og0ve1b.c >> @@ -66,10 +66,21 @@ struct og0ve1b_mode { >>       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_sensor_data { >> +    u64 chip_id; >> +    unsigned long mclk_freq; >> +    u32 test_pattern_reg; >> +    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", >>       "Vertical Colour Bars", >> @@ -97,8 +108,7 @@ struct og0ve1b { >>       struct v4l2_ctrl *exposure; >>       struct v4l2_ctrl_handler ctrl_handler; >> >> -    /* Saved register value */ >> -    u64 pre_isp; >> +    const struct og0ve1b_sensor_data *sensor; >>   }; >> >>   static const struct cci_reg_sequence og0ve1b_640x480_120fps_mode[] = { >> @@ -254,6 +264,7 @@ static const struct og0ve1b_mode supported_modes[] >> = { >>           .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), >> @@ -261,23 +272,39 @@ static const struct og0ve1b_mode >> supported_modes[] = { >>       }, >>   }; >> >> +static const struct og0ve1b_sensor_data og0ve1b_data = { >> +    .chip_id    = OG0VE1B_CHIP_ID, >> +    .mclk_freq    = OG0VE1B_MCLK_FREQ_24MHZ, >> +    .test_pattern_reg = OG0VE1B_REG_PRE_ISP, >> +    .link_freq_menu    = og0ve1b_link_freq_menu, >> +    .num_link_freqs    = ARRAY_SIZE(og0ve1b_link_freq_menu), >> +    .modes        = supported_modes, >> +    .num_modes    = ARRAY_SIZE(supported_modes), >> +}; >> + >>   static int og0ve1b_enable_test_pattern(struct og0ve1b *og0ve1b, u32 >> pattern) >>   { >> -    u64 val = og0ve1b->pre_isp; >> +    u32 reg = og0ve1b->sensor->test_pattern_reg; >> +    u64 val; >> +    int ret; >> + >> +    ret = cci_read(og0ve1b->regmap, reg, &val, NULL); >> +    if (ret) >> +        return ret; >> >>       if (pattern) >>           val |= OG0VE1B_TEST_PATTERN_ENABLE; >>       else >>           val &= ~OG0VE1B_TEST_PATTERN_ENABLE; >> >> -    return cci_write(og0ve1b->regmap, OG0VE1B_REG_PRE_ISP, val, NULL); >> +    return cci_write(og0ve1b->regmap, reg, val, NULL); >>   } >> >>   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->sensor->modes[0]; >>       s64 exposure_max; >>       int ret; >> >> @@ -333,7 +360,8 @@ static const struct v4l2_ctrl_ops og0ve1b_ctrl_ops >> = { >>   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->sensor->modes[0]; >> +    const struct og0ve1b_sensor_data *sensor = og0ve1b->sensor; >>       s64 exposure_max, pixel_rate, h_blank, v_blank; >>       struct v4l2_fwnode_device_properties props; >>       struct v4l2_ctrl *ctrl; >> @@ -343,12 +371,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); >> +                      sensor->num_link_freqs - 1, >> +                      0, sensor->link_freq_menu); >>       if (ctrl) >>           ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY; >> >> -    pixel_rate = og0ve1b_link_freq_menu[0] / mode->bpp; >> +    pixel_rate = sensor->link_freq_menu[0] / mode->bpp; >>       v4l2_ctrl_new_std(ctrl_hdlr, &og0ve1b_ctrl_ops, >> V4L2_CID_PIXEL_RATE, >>                 0, pixel_rate, 1, pixel_rate); >> >> @@ -407,7 +435,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 +449,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->sensor- >> >modes[0].reg_list; >>       int ret; >> >>       ret = pm_runtime_resume_and_get(og0ve1b->dev); >> @@ -484,13 +512,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->sensor->modes, >> +                      og0ve1b->sensor->num_modes, >>                         width, height, >>                         fmt->format.width, >>                         fmt->format.height); >> @@ -505,10 +534,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->sensor->modes[0].code; >> >>       return 0; >>   } >> @@ -517,15 +548,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 *sensor = og0ve1b->sensor; >> + >> +    if (fse->index >= sensor->num_modes) >>           return -EINVAL; >> >> -    if (fse->code != MEDIA_BUS_FMT_Y8_1X8) >> +    if (fse->code != sensor->modes[fse->index].code) >>           return -EINVAL; >> >> -    fse->min_width = supported_modes[fse->index].width; >> +    fse->min_width = sensor->modes[fse->index].width; >>       fse->max_width = fse->min_width; >> -    fse->min_height = supported_modes[fse->index].height; >> +    fse->min_height = sensor->modes[fse->index].height; >>       fse->max_height = fse->min_height; >> >>       return 0; >> @@ -534,13 +568,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) >>   { >> +    struct og0ve1b *og0ve1b = to_og0ve1b(sd); >>       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 = og0ve1b->sensor->modes[0].code, >> +            .width = og0ve1b->sensor->modes[0].width, >> +            .height = og0ve1b->sensor->modes[0].height, >>           }, >>       }; >> >> @@ -586,18 +621,13 @@ 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->sensor->chip_id) { >> +        dev_err(og0ve1b->dev, "chip id mismatch: %llx!=%llx\n", >> +            og0ve1b->sensor->chip_id, val); >>           return -ENODEV; >>       } >> >> -    ret = cci_read(og0ve1b->regmap, OG0VE1B_REG_PRE_ISP, >> -               &og0ve1b->pre_isp, NULL); >> -    if (ret) >> -        dev_err(og0ve1b->dev, "failed to read pre_isp: %d\n", ret); >> - >> -    return ret; >> +    return 0; > > The one thing that is not immediately clear to me is if we get > equivalent logic WRT OG0VE1B_REG_PRE_ISP after this change. > I will kill OG0VE1B_REG_PRE_ISP logic in next version. > >>   } >> >>   static int og0ve1b_check_hwcfg(struct og0ve1b *og0ve1b) >> @@ -624,8 +654,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->sensor->link_freq_menu, >> +                       og0ve1b->sensor->num_link_freqs, >>                          &freq_bitmap); >> >>       v4l2_fwnode_endpoint_free(&bus_cfg); >> @@ -686,6 +716,9 @@ static int og0ve1b_probe(struct i2c_client *client) >>           return -ENOMEM; >> >>       og0ve1b->dev = &client->dev; >> +    og0ve1b->sensor = i2c_get_match_data(client); >> +    if (!og0ve1b->sensor) >> +        return -ENODEV; >> >>       v4l2_i2c_subdev_init(&og0ve1b->sd, client, &og0ve1b_subdev_ops); >> >> @@ -700,7 +733,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->sensor->mclk_freq) >>           return dev_err_probe(og0ve1b->dev, -EINVAL, >>                        "XVCLK clock frequency %lu is not supported\n", >>                        freq); >> @@ -819,7 +852,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 >> >> > > Other than that LTGM. > > --- > bod Thanks, Wenmeng