* [PATCH v6 0/2] Pinefeat cef168 lens control board driver
@ 2025-10-07 19:57 Aliaksandr Smirnou
2025-10-07 19:57 ` [PATCH v6 1/2] dt-bindings: Pinefeat cef168 lens control board Aliaksandr Smirnou
` (2 more replies)
0 siblings, 3 replies; 16+ messages in thread
From: Aliaksandr Smirnou @ 2025-10-07 19:57 UTC (permalink / raw)
To: jacopo.mondi, hverkuil, mchehab, robh, krzk+dt, conor+dt
Cc: devicetree, linux-media, linux-kernel, Aliaksandr Smirnou
This patch series adds support for the Pinefeat adapter, which interfaces
Canon EF and EF-S lenses to non-Canon camera bodies. The cef168 circuit
control board provides an I2C interface for electronic focus and aperture
control. The driver integrates with the V4L2 sub-device API.
For more information about the product, see:
https://github.com/pinefeat/cef168
Changes in v6:
- removed "focus_range" custom control, instead modified the range of
the standard "focus_absolute"
There were no changes in dt-bindings patch.
Link to v5: https://lore.kernel.org/all/20251005133228.62704-1-asmirnou@pinefeat.co.uk/
Patches:
dt-bindings: Pinefeat cef168 lens control board
media: i2c: Pinefeat cef168 lens control board driver
.../bindings/media/i2c/pinefeat,cef168.yaml | 47 +++
.../devicetree/bindings/vendor-prefixes.yaml | 2 +
MAINTAINERS | 7 +
drivers/media/i2c/Kconfig | 9 +
drivers/media/i2c/Makefile | 1 +
drivers/media/i2c/cef168.c | 317 ++++++++++++++++++
include/uapi/linux/v4l2-controls.h | 6 +
7 files changed, 389 insertions(+)
create mode 100644 Documentation/devicetree/bindings/media/i2c/pinefeat,cef168.yaml
create mode 100644 drivers/media/i2c/cef168.c
base-commit: 6093a688a07da07808f0122f9aa2a3eed250d853
--
2.34.1
^ permalink raw reply [flat|nested] 16+ messages in thread* [PATCH v6 1/2] dt-bindings: Pinefeat cef168 lens control board 2025-10-07 19:57 [PATCH v6 0/2] Pinefeat cef168 lens control board driver Aliaksandr Smirnou @ 2025-10-07 19:57 ` Aliaksandr Smirnou 2025-10-07 20:47 ` Conor Dooley 2025-10-08 23:46 ` Krzysztof Kozlowski 2025-10-07 19:57 ` [PATCH v6 2/2] media: i2c: Pinefeat cef168 lens control board driver Aliaksandr Smirnou 2026-05-26 15:54 ` [PATCH v6 0/2] " Alen Karnil 2 siblings, 2 replies; 16+ messages in thread From: Aliaksandr Smirnou @ 2025-10-07 19:57 UTC (permalink / raw) To: jacopo.mondi, hverkuil, mchehab, robh, krzk+dt, conor+dt Cc: devicetree, linux-media, linux-kernel, Aliaksandr Smirnou Add the Device Tree schema and examples for the Pinefeat cef168 lens control board. This board interfaces Canon EF & EF-S lenses with non-Canon camera bodies, enabling electronic control of focus and aperture via V4L2. Power supply is derived from fixed supplies via connector or GPIO header. Therefore, the driver does not manage any regulator, so representing any supply in the binding is redundant. Signed-off-by: Aliaksandr Smirnou <asmirnou@pinefeat.co.uk> --- .../bindings/media/i2c/pinefeat,cef168.yaml | 47 +++++++++++++++++++ .../devicetree/bindings/vendor-prefixes.yaml | 2 + MAINTAINERS | 6 +++ 3 files changed, 55 insertions(+) create mode 100644 Documentation/devicetree/bindings/media/i2c/pinefeat,cef168.yaml diff --git a/Documentation/devicetree/bindings/media/i2c/pinefeat,cef168.yaml b/Documentation/devicetree/bindings/media/i2c/pinefeat,cef168.yaml new file mode 100644 index 000000000000..1295b1f4edeb --- /dev/null +++ b/Documentation/devicetree/bindings/media/i2c/pinefeat,cef168.yaml @@ -0,0 +1,47 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +# Copyright (c) 2025 Pinefeat LLP +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/media/i2c/pinefeat,cef168.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Pinefeat cef168 lens driver + +maintainers: + - Aliaksandr Smirnou <support@pinefeat.co.uk> + +description: | + Pinefeat produces an adapter designed to interface between + Canon EF & EF-S lenses and non-Canon camera bodies, incorporating + features for electronic focus and aperture adjustment. The cef168 + circuit board, included with the adapter, provides a software + programming interface that allows control of lens focus and + aperture positions. + +properties: + compatible: + enum: + - pinefeat,cef168 + + reg: + maxItems: 1 + +required: + - compatible + - reg + +additionalProperties: false + +examples: + - | + i2c { + #address-cells = <1>; + #size-cells = <0>; + + camera-lens@d { + compatible = "pinefeat,cef168"; + reg = <0x0d>; + }; + }; + +... diff --git a/Documentation/devicetree/bindings/vendor-prefixes.yaml b/Documentation/devicetree/bindings/vendor-prefixes.yaml index f1d1882009ba..4f50c35ed670 100644 --- a/Documentation/devicetree/bindings/vendor-prefixes.yaml +++ b/Documentation/devicetree/bindings/vendor-prefixes.yaml @@ -1241,6 +1241,8 @@ patternProperties: description: Picochip Ltd "^pine64,.*": description: Pine64 + "^pinefeat,.*": + description: Pinefeat LLP "^pineriver,.*": description: Shenzhen PineRiver Designs Co., Ltd. "^pixcir,.*": diff --git a/MAINTAINERS b/MAINTAINERS index 5a2cde903910..a59cd27caf11 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -20332,6 +20332,12 @@ S: Supported F: Documentation/devicetree/bindings/input/pine64,pinephone-keyboard.yaml F: drivers/input/keyboard/pinephone-keyboard.c +PINEFEAT CEF168 LENS DRIVER +M: Aliaksandr Smirnou <support@pinefeat.co.uk> +L: linux-media@vger.kernel.org +S: Supported +F: Documentation/devicetree/bindings/media/i2c/pinefeat,cef168.yaml + PLANTOWER PMS7003 AIR POLLUTION SENSOR DRIVER M: Tomasz Duszynski <tduszyns@gmail.com> S: Maintained -- 2.34.1 ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v6 1/2] dt-bindings: Pinefeat cef168 lens control board 2025-10-07 19:57 ` [PATCH v6 1/2] dt-bindings: Pinefeat cef168 lens control board Aliaksandr Smirnou @ 2025-10-07 20:47 ` Conor Dooley 2025-10-08 17:50 ` Aliaksandr Smirnou 2025-10-08 23:46 ` Krzysztof Kozlowski 1 sibling, 1 reply; 16+ messages in thread From: Conor Dooley @ 2025-10-07 20:47 UTC (permalink / raw) To: Aliaksandr Smirnou Cc: jacopo.mondi, hverkuil, mchehab, robh, krzk+dt, conor+dt, devicetree, linux-media, linux-kernel [-- Attachment #1: Type: text/plain, Size: 687 bytes --] On Tue, Oct 07, 2025 at 08:57:31PM +0100, Aliaksandr Smirnou wrote: > Add the Device Tree schema and examples for the Pinefeat cef168 lens > control board. This board interfaces Canon EF & EF-S lenses with > non-Canon camera bodies, enabling electronic control of focus and > aperture via V4L2. > > Power supply is derived from fixed supplies via connector or GPIO > header. Therefore, the driver does not manage any regulator, so > representing any supply in the binding is redundant. > > Signed-off-by: Aliaksandr Smirnou <asmirnou@pinefeat.co.uk> I acked v5, any reason for not applying it? https://lore.kernel.org/all/20251007-geologic-epidemic-2f667f232cf6@spud/#t [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 228 bytes --] ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v6 1/2] dt-bindings: Pinefeat cef168 lens control board 2025-10-07 20:47 ` Conor Dooley @ 2025-10-08 17:50 ` Aliaksandr Smirnou 2025-10-08 18:31 ` Conor Dooley 0 siblings, 1 reply; 16+ messages in thread From: Aliaksandr Smirnou @ 2025-10-08 17:50 UTC (permalink / raw) To: conor Cc: asmirnou, conor+dt, devicetree, hverkuil, jacopo.mondi, krzk+dt, linux-kernel, linux-media, mchehab, robh On Tue, 7 Oct 2025 21:47:29 +0100, Conor Dooley wrote: > I acked v5, any reason for not applying it? > https://lore.kernel.org/all/20251007-geologic-epidemic-2f667f232cf6@spud/#t Yes, the dt-bindings patch can be applied. The v6 series does not change anything in the dt-bindings patch - only another patch in the series was updated, so v6 was sent. Apologies - I wasn't aware that an acked patch could be omitted from the new revision. ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v6 1/2] dt-bindings: Pinefeat cef168 lens control board 2025-10-08 17:50 ` Aliaksandr Smirnou @ 2025-10-08 18:31 ` Conor Dooley 2025-10-08 21:32 ` Aliaksandr Smirnou 0 siblings, 1 reply; 16+ messages in thread From: Conor Dooley @ 2025-10-08 18:31 UTC (permalink / raw) To: Aliaksandr Smirnou Cc: conor+dt, devicetree, hverkuil, jacopo.mondi, krzk+dt, linux-kernel, linux-media, mchehab, robh [-- Attachment #1: Type: text/plain, Size: 808 bytes --] On Wed, Oct 08, 2025 at 06:50:36PM +0100, Aliaksandr Smirnou wrote: > On Tue, 7 Oct 2025 21:47:29 +0100, Conor Dooley wrote: > > > I acked v5, any reason for not applying it? > > https://lore.kernel.org/all/20251007-geologic-epidemic-2f667f232cf6@spud/#t > > Yes, the dt-bindings patch can be applied. > The v6 series does not change anything in the dt-bindings patch - only > another patch in the series was updated, so v6 was sent. > > Apologies - I wasn't aware that an acked patch could be omitted from > the new revision. No no, it's not that it should have been omitted - it's that you should have applied my ack on v5 when submitting your v6. I guess timing worked against you because I sent it like 20 mins before you sent v6. Acked-by: Conor Dooley <conor.dooley@microchip.com> [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 228 bytes --] ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v6 1/2] dt-bindings: Pinefeat cef168 lens control board 2025-10-08 18:31 ` Conor Dooley @ 2025-10-08 21:32 ` Aliaksandr Smirnou 0 siblings, 0 replies; 16+ messages in thread From: Aliaksandr Smirnou @ 2025-10-08 21:32 UTC (permalink / raw) To: conor Cc: asmirnou, conor+dt, devicetree, hverkuil, jacopo.mondi, krzk+dt, linux-kernel, linux-media, mchehab, robh On Tue, 7 Oct 2025 21:47:29 +0100, Conor Dooley wrote: > On Wed, Oct 08, 2025 at 06:50:36PM +0100, Aliaksandr Smirnou wrote: > > On Tue, 7 Oct 2025 21:47:29 +0100, Conor Dooley wrote: > > > > > I acked v5, any reason for not applying it? > > > https://lore.kernel.org/all/20251007-geologic-epidemic-2f667f232cf6@spud/#t > > > > Yes, the dt-bindings patch can be applied. > > The v6 series does not change anything in the dt-bindings patch - only > > another patch in the series was updated, so v6 was sent. > > > > Apologies - I wasn't aware that an acked patch could be omitted from > > the new revision. > > No no, it's not that it should have been omitted - it's that you should > have applied my ack on v5 when submitting your v6. I guess timing worked > against you because I sent it like 20 mins before you sent v6. > Acked-by: Conor Dooley <conor.dooley@microchip.com> Thanks for clarifying. I'll make sure to include your Acked-by tag in the next version. ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v6 1/2] dt-bindings: Pinefeat cef168 lens control board 2025-10-07 19:57 ` [PATCH v6 1/2] dt-bindings: Pinefeat cef168 lens control board Aliaksandr Smirnou 2025-10-07 20:47 ` Conor Dooley @ 2025-10-08 23:46 ` Krzysztof Kozlowski 2025-10-09 20:17 ` Aliaksandr Smirnou 1 sibling, 1 reply; 16+ messages in thread From: Krzysztof Kozlowski @ 2025-10-08 23:46 UTC (permalink / raw) To: Aliaksandr Smirnou, jacopo.mondi, hverkuil, mchehab, robh, krzk+dt, conor+dt Cc: devicetree, linux-media, linux-kernel On 08/10/2025 04:57, Aliaksandr Smirnou wrote: > Add the Device Tree schema and examples for the Pinefeat cef168 lens > control board. This board interfaces Canon EF & EF-S lenses with > non-Canon camera bodies, enabling electronic control of focus and > aperture via V4L2. > > Power supply is derived from fixed supplies via connector or GPIO > header. Therefore, the driver does not manage any regulator, so > representing any supply in the binding is redundant. > > Signed-off-by: Aliaksandr Smirnou <asmirnou@pinefeat.co.uk> You already got review at v4! Why are you forcing us to do the job multiple times? <form letter> This is a friendly reminder during the review process. It looks like you received a tag and forgot to add it. If you do not know the process, here is a short explanation: Please add Acked-by/Reviewed-by/Tested-by tags when posting new versions of patchset, under or above your Signed-off-by tag, unless patch changed significantly (e.g. new properties added to the DT bindings). Tag is "received", when provided in a message replied to you on the mailing list. Tools like b4 can help here. However, there's no need to repost patches *only* to add the tags. The upstream maintainer will do that for tags received on the version they apply. Please read: https://elixir.bootlin.com/linux/v6.12-rc3/source/Documentation/process/submitting-patches.rst#L577 If a tag was not added on purpose, please state why and what changed. </form letter> Best regards, Krzysztof ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v6 1/2] dt-bindings: Pinefeat cef168 lens control board 2025-10-08 23:46 ` Krzysztof Kozlowski @ 2025-10-09 20:17 ` Aliaksandr Smirnou 0 siblings, 0 replies; 16+ messages in thread From: Aliaksandr Smirnou @ 2025-10-09 20:17 UTC (permalink / raw) To: krzk Cc: asmirnou, conor+dt, devicetree, hverkuil, jacopo.mondi, krzk+dt, linux-kernel, linux-media, mchehab, robh On Thu, 9 Oct 2025 08:46:44 +0900, Krzysztof Kozlowski wrote: > You already got review at v4! Why are you forcing us to do the job > multiple times? Apologies for the oversight. There were no changes in the dt-bindings patch; I should have kept the Reviewed-by tag from the earlier one. I'll make sure to include it next time. ^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH v6 2/2] media: i2c: Pinefeat cef168 lens control board driver 2025-10-07 19:57 [PATCH v6 0/2] Pinefeat cef168 lens control board driver Aliaksandr Smirnou 2025-10-07 19:57 ` [PATCH v6 1/2] dt-bindings: Pinefeat cef168 lens control board Aliaksandr Smirnou @ 2025-10-07 19:57 ` Aliaksandr Smirnou 2026-05-26 15:54 ` [PATCH v6 0/2] " Alen Karnil 2 siblings, 0 replies; 16+ messages in thread From: Aliaksandr Smirnou @ 2025-10-07 19:57 UTC (permalink / raw) To: jacopo.mondi, hverkuil, mchehab, robh, krzk+dt, conor+dt Cc: devicetree, linux-media, linux-kernel, Aliaksandr Smirnou Add support for the Pinefeat cef168 lens control board that provides electronic focus and aperture control for Canon EF & EF-S lenses on non-Canon camera bodies. Signed-off-by: Aliaksandr Smirnou <asmirnou@pinefeat.co.uk> --- MAINTAINERS | 1 + drivers/media/i2c/Kconfig | 9 + drivers/media/i2c/Makefile | 1 + drivers/media/i2c/cef168.c | 317 +++++++++++++++++++++++++++++ include/uapi/linux/v4l2-controls.h | 6 + 5 files changed, 334 insertions(+) create mode 100644 drivers/media/i2c/cef168.c diff --git a/MAINTAINERS b/MAINTAINERS index a59cd27caf11..0cf3b3a35827 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -20337,6 +20337,7 @@ M: Aliaksandr Smirnou <support@pinefeat.co.uk> L: linux-media@vger.kernel.org S: Supported F: Documentation/devicetree/bindings/media/i2c/pinefeat,cef168.yaml +F: drivers/media/i2c/cef168.c PLANTOWER PMS7003 AIR POLLUTION SENSOR DRIVER M: Tomasz Duszynski <tduszyns@gmail.com> diff --git a/drivers/media/i2c/Kconfig b/drivers/media/i2c/Kconfig index cdd7ba5da0d5..694b2571de37 100644 --- a/drivers/media/i2c/Kconfig +++ b/drivers/media/i2c/Kconfig @@ -823,6 +823,15 @@ config VIDEO_AK7375 capability. This is designed for linear control of voice coil motors, controlled via I2C serial interface. +config VIDEO_CEF168 + tristate "CEF168 lens control support" + select CRC8 + help + This is a driver for the CEF168 lens control board. + The board provides an I2C interface for electronic focus + and aperture control of EF and EF-S lenses. The driver + integrates with the V4L2 sub-device API. + config VIDEO_DW9714 tristate "DW9714 lens voice coil support" depends on GPIOLIB diff --git a/drivers/media/i2c/Makefile b/drivers/media/i2c/Makefile index 57cdd8dc96f6..2e8f0a968352 100644 --- a/drivers/media/i2c/Makefile +++ b/drivers/media/i2c/Makefile @@ -25,6 +25,7 @@ obj-$(CONFIG_VIDEO_BT856) += bt856.o obj-$(CONFIG_VIDEO_BT866) += bt866.o obj-$(CONFIG_VIDEO_CCS) += ccs/ obj-$(CONFIG_VIDEO_CCS_PLL) += ccs-pll.o +obj-$(CONFIG_VIDEO_CEF168) += cef168.o obj-$(CONFIG_VIDEO_CS3308) += cs3308.o obj-$(CONFIG_VIDEO_CS5345) += cs5345.o obj-$(CONFIG_VIDEO_CS53L32A) += cs53l32a.o diff --git a/drivers/media/i2c/cef168.c b/drivers/media/i2c/cef168.c new file mode 100644 index 000000000000..596bf549bf25 --- /dev/null +++ b/drivers/media/i2c/cef168.c @@ -0,0 +1,317 @@ +// SPDX-License-Identifier: GPL-2.0 +// Copyright (c) 2025 Pinefeat LLP + +#include <linux/crc8.h> +#include <linux/delay.h> +#include <linux/i2c.h> +#include <linux/module.h> +#include <linux/v4l2-controls.h> +#include <media/v4l2-ctrls.h> +#include <media/v4l2-device.h> +#include <media/v4l2-event.h> + +#define CEF168_NAME "cef168" + +#define CEF168_V4L2_CID_CUSTOM(ctrl) \ + (V4L2_CID_USER_CEF168_BASE + custom_##ctrl) + +enum { custom_lens_id, custom_data, custom_calibrate }; + +#define INP_CALIBRATE 0x22 +#define INP_SET_FOCUS 0x80 +#define INP_SET_FOCUS_P 0x81 +#define INP_SET_FOCUS_N 0x82 +#define INP_SET_APERTURE 0x7A +#define INP_SET_APERTURE_P 0x7B +#define INP_SET_APERTURE_N 0x7C + +#define CEF_CRC8_POLYNOMIAL 168 + +DECLARE_CRC8_TABLE(cef168_crc8_table); + +struct cef168_data { + __u8 lens_id; + __u8 moving : 1; + __u8 calibrating : 2; + __u16 moving_time; + __u16 focus_position_min; + __u16 focus_position_max; + __u16 focus_position_cur; + __u16 focus_distance_min; + __u16 focus_distance_max; + __u8 crc8; +} __packed; + +struct cef168_device { + struct v4l2_ctrl_handler ctrls; + struct v4l2_subdev sd; +}; + +static inline struct cef168_device *to_cef168(struct v4l2_ctrl *ctrl) +{ + return container_of(ctrl->handler, struct cef168_device, ctrls); +} + +static inline struct cef168_device *sd_to_cef168(struct v4l2_subdev *subdev) +{ + return container_of(subdev, struct cef168_device, sd); +} + +static int cef168_i2c_write(struct cef168_device *cef168_dev, u8 cmd, u16 val) +{ + struct i2c_client *client = v4l2_get_subdevdata(&cef168_dev->sd); + int retry, ret; + + __le16 le_data = cpu_to_le16(val); + char tx_data[4] = { cmd, ((u8 *)&le_data)[0], ((u8 *)&le_data)[1] }; + + tx_data[3] = crc8(cef168_crc8_table, tx_data, 3, CRC8_INIT_VALUE); + + for (retry = 0; retry < 3; retry++) { + ret = i2c_master_send(client, tx_data, sizeof(tx_data)); + if (ret == sizeof(tx_data)) + return 0; + else if (ret != -EIO && ret != -EREMOTEIO) + break; + } + + dev_err(&client->dev, "I2C write fail after %d retries, ret=%d\n", + retry, ret); + return -EIO; +} + +static int cef168_i2c_read(struct cef168_device *cef168_dev, + struct cef168_data *rx_data) +{ + struct i2c_client *client = v4l2_get_subdevdata(&cef168_dev->sd); + + int ret = i2c_master_recv(client, (char *)rx_data, + sizeof(struct cef168_data)); + if (ret != sizeof(struct cef168_data)) { + dev_err(&client->dev, "I2C read fail, ret=%d\n", ret); + return -EIO; + } + + u8 computed_crc = crc8(cef168_crc8_table, (const u8 *)rx_data, + sizeof(struct cef168_data) - 1, CRC8_INIT_VALUE); + if (computed_crc != rx_data->crc8) { + dev_err(&client->dev, + "CRC mismatch calculated=0x%02X read=0x%02X\n", + computed_crc, rx_data->crc8); + return -EIO; + } + + rx_data->moving_time = le16_to_cpup((__le16 *)&rx_data->moving_time); + rx_data->focus_position_min = le16_to_cpup((__le16 *)&rx_data->focus_position_min); + rx_data->focus_position_max = le16_to_cpup((__le16 *)&rx_data->focus_position_max); + rx_data->focus_position_cur = le16_to_cpup((__le16 *)&rx_data->focus_position_cur); + rx_data->focus_distance_min = le16_to_cpup((__le16 *)&rx_data->focus_distance_min); + rx_data->focus_distance_max = le16_to_cpup((__le16 *)&rx_data->focus_distance_max); + + return 0; +} + +static int cef168_set_ctrl(struct v4l2_ctrl *ctrl) +{ + struct cef168_device *dev = to_cef168(ctrl); + u8 cmd; + + switch (ctrl->id) { + case V4L2_CID_FOCUS_ABSOLUTE: + return cef168_i2c_write(dev, INP_SET_FOCUS, ctrl->val); + case V4L2_CID_FOCUS_RELATIVE: + cmd = ctrl->val < 0 ? INP_SET_FOCUS_N : INP_SET_FOCUS_P; + return cef168_i2c_write(dev, cmd, abs(ctrl->val)); + case V4L2_CID_IRIS_ABSOLUTE: + return cef168_i2c_write(dev, INP_SET_APERTURE, ctrl->val); + case V4L2_CID_IRIS_RELATIVE: + cmd = ctrl->val < 0 ? INP_SET_APERTURE_N : INP_SET_APERTURE_P; + return cef168_i2c_write(dev, cmd, abs(ctrl->val)); + case CEF168_V4L2_CID_CUSTOM(calibrate): + return cef168_i2c_write(dev, INP_CALIBRATE, 0); + } + + return -EINVAL; +} + +static int cef168_get_ctrl(struct v4l2_ctrl *ctrl) +{ + struct cef168_data data; + struct cef168_device *dev = to_cef168(ctrl); + int rval; + + rval = cef168_i2c_read(dev, &data); + if (rval < 0) + return rval; + + switch (ctrl->id) { + case V4L2_CID_FOCUS_ABSOLUTE: + __v4l2_ctrl_modify_range(ctrl, + data.focus_position_min, + data.focus_position_max, 1, 0); + ctrl->val = data.focus_position_cur; + return 0; + case CEF168_V4L2_CID_CUSTOM(lens_id): + ctrl->p_new.p_u8[0] = data.lens_id; + return 0; + case CEF168_V4L2_CID_CUSTOM(data): + memcpy(ctrl->p_new.p_u8, &data, sizeof(data)); + return 0; + } + + return -EINVAL; +} + +static const struct v4l2_ctrl_ops cef168_ctrl_ops = { + .g_volatile_ctrl = cef168_get_ctrl, + .s_ctrl = cef168_set_ctrl, +}; + +static const struct v4l2_ctrl_config cef168_lens_id_ctrl = { + .ops = &cef168_ctrl_ops, + .id = CEF168_V4L2_CID_CUSTOM(lens_id), + .type = V4L2_CTRL_TYPE_U8, + .name = "Lens ID", + .min = 0, + .max = U8_MAX, + .step = 1, + .def = 0, + .flags = V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_READ_ONLY, +}; + +static const struct v4l2_ctrl_config cef168_data_ctrl = { + .ops = &cef168_ctrl_ops, + .id = CEF168_V4L2_CID_CUSTOM(data), + .type = V4L2_CTRL_TYPE_U8, + .name = "Data", + .min = 0, + .max = U8_MAX, + .step = 1, + .def = 0, + .dims = { sizeof(struct cef168_data) / sizeof(u8) }, + .elem_size = sizeof(u8), + .flags = V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_READ_ONLY, +}; + +static const struct v4l2_ctrl_config cef168_calibrate_ctrl = { + .ops = &cef168_ctrl_ops, + .id = CEF168_V4L2_CID_CUSTOM(calibrate), + .type = V4L2_CTRL_TYPE_BUTTON, + .name = "Calibrate", +}; + +static const struct v4l2_subdev_core_ops cef168_core_ops = { + .log_status = v4l2_ctrl_subdev_log_status, + .subscribe_event = v4l2_ctrl_subdev_subscribe_event, + .unsubscribe_event = v4l2_event_subdev_unsubscribe, +}; + +static const struct v4l2_subdev_ops cef168_ops = { + .core = &cef168_core_ops, +}; + +static int cef168_init_controls(struct cef168_device *dev) +{ + struct v4l2_ctrl *ctrl; + struct v4l2_ctrl_handler *hdl = &dev->ctrls; + const struct v4l2_ctrl_ops *ops = &cef168_ctrl_ops; + + v4l2_ctrl_handler_init(hdl, 7); + + ctrl = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_FOCUS_ABSOLUTE, 0, S16_MAX, + 1, 0); + if (ctrl) + ctrl->flags |= V4L2_CTRL_FLAG_VOLATILE | + V4L2_CTRL_FLAG_EXECUTE_ON_WRITE; + v4l2_ctrl_new_std(hdl, ops, V4L2_CID_FOCUS_RELATIVE, S16_MIN, S16_MAX, + 1, 0); + ctrl = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_IRIS_ABSOLUTE, 0, S16_MAX, + 1, 0); + if (ctrl) + ctrl->flags |= V4L2_CTRL_FLAG_WRITE_ONLY | + V4L2_CTRL_FLAG_EXECUTE_ON_WRITE; + v4l2_ctrl_new_std(hdl, ops, V4L2_CID_IRIS_RELATIVE, S16_MIN, S16_MAX, 1, + 0); + ctrl = v4l2_ctrl_new_custom(hdl, &cef168_calibrate_ctrl, NULL); + if (ctrl) + ctrl->flags |= V4L2_CTRL_FLAG_WRITE_ONLY | + V4L2_CTRL_FLAG_EXECUTE_ON_WRITE; + v4l2_ctrl_new_custom(hdl, &cef168_data_ctrl, NULL); + v4l2_ctrl_new_custom(hdl, &cef168_lens_id_ctrl, NULL); + + if (hdl->error) + dev_err(dev->sd.dev, "%s fail error: 0x%x\n", __func__, + hdl->error); + dev->sd.ctrl_handler = hdl; + return hdl->error; +} + +static int cef168_probe(struct i2c_client *client) +{ + struct cef168_device *cef168_dev; + int rval; + + cef168_dev = devm_kzalloc(&client->dev, sizeof(*cef168_dev), + GFP_KERNEL); + if (!cef168_dev) + return -ENOMEM; + + v4l2_i2c_subdev_init(&cef168_dev->sd, client, &cef168_ops); + cef168_dev->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE | + V4L2_SUBDEV_FL_HAS_EVENTS; + + rval = cef168_init_controls(cef168_dev); + if (rval) + goto err_cleanup; + + rval = media_entity_pads_init(&cef168_dev->sd.entity, 0, NULL); + if (rval < 0) + goto err_cleanup; + + cef168_dev->sd.entity.function = MEDIA_ENT_F_LENS; + + rval = v4l2_async_register_subdev(&cef168_dev->sd); + if (rval < 0) + goto err_cleanup; + + crc8_populate_msb(cef168_crc8_table, CEF_CRC8_POLYNOMIAL); + + return 0; + +err_cleanup: + v4l2_ctrl_handler_free(&cef168_dev->ctrls); + media_entity_cleanup(&cef168_dev->sd.entity); + + return rval; +} + +static void cef168_remove(struct i2c_client *client) +{ + struct v4l2_subdev *sd = i2c_get_clientdata(client); + struct cef168_device *cef168_dev = sd_to_cef168(sd); + + v4l2_async_unregister_subdev(&cef168_dev->sd); + v4l2_ctrl_handler_free(&cef168_dev->ctrls); + media_entity_cleanup(&cef168_dev->sd.entity); +} + +static const struct of_device_id cef168_of_table[] = { + { .compatible = "pinefeat,cef168" }, + { /* sentinel */ } +}; +MODULE_DEVICE_TABLE(of, cef168_of_table); + +static struct i2c_driver cef168_i2c_driver = { + .driver = { + .name = CEF168_NAME, + .of_match_table = cef168_of_table, + }, + .probe = cef168_probe, + .remove = cef168_remove, +}; + +module_i2c_driver(cef168_i2c_driver); + +MODULE_AUTHOR("support@pinefeat.co.uk>"); +MODULE_DESCRIPTION("CEF168 lens driver"); +MODULE_LICENSE("GPL"); diff --git a/include/uapi/linux/v4l2-controls.h b/include/uapi/linux/v4l2-controls.h index 2d30107e047e..f8ca4f8c89af 100644 --- a/include/uapi/linux/v4l2-controls.h +++ b/include/uapi/linux/v4l2-controls.h @@ -228,6 +228,12 @@ enum v4l2_colorfx { */ #define V4L2_CID_USER_RKISP1_BASE (V4L2_CID_USER_BASE + 0x1220) +/* + * The base for Pinefeat CEF168 driver controls. + * We reserve 16 controls for this driver. + */ +#define V4L2_CID_USER_CEF168_BASE (V4L2_CID_USER_BASE + 0x1230) + /* MPEG-class control IDs */ /* The MPEG controls are applicable to all codec controls * and the 'MPEG' part of the define is historical */ -- 2.34.1 ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v6 0/2] Pinefeat cef168 lens control board driver 2025-10-07 19:57 [PATCH v6 0/2] Pinefeat cef168 lens control board driver Aliaksandr Smirnou 2025-10-07 19:57 ` [PATCH v6 1/2] dt-bindings: Pinefeat cef168 lens control board Aliaksandr Smirnou 2025-10-07 19:57 ` [PATCH v6 2/2] media: i2c: Pinefeat cef168 lens control board driver Aliaksandr Smirnou @ 2026-05-26 15:54 ` Alen Karnil 2026-05-26 20:35 ` Aliaksandr Smirnou 2 siblings, 1 reply; 16+ messages in thread From: Alen Karnil @ 2026-05-26 15:54 UTC (permalink / raw) To: Aliaksandr Smirnou, jacopo.mondi, hverkuil, mchehab, robh, krzk+dt, conor+dt Cc: devicetree, linux-media, linux-kernel Hi Aliaksandr, I've been asked by Kieran Bingham to review your patches, I've reproduced your work on setup with a Pi 5 with a 6.18 kernel and I got a few questions On 07/10/2025 20:57, Aliaksandr Smirnou wrote: > This patch series adds support for the Pinefeat adapter, which interfaces > Canon EF and EF-S lenses to non-Canon camera bodies. The cef168 circuit > control board provides an I2C interface for electronic focus and aperture > control. The driver integrates with the V4L2 sub-device API. > > For more information about the product, see: > https://github.com/pinefeat/cef168 I built the calibration application but it would not work out the box, I can see that CEF168_V4L2_CID_CUSTOM is different between that is in the patch and in the application? Which is the correct one, does the patch need updating? The tool to modify the device tree also did not work with the IMX477, I needed to manually modify my device tree to get the dtbo to build, there needs to be some further discussions on how we could improve the user experience when it comes to enabling the vcm with camera sensors. > > Changes in v6: > - removed "focus_range" custom control, instead modified the range of > the standard "focus_absolute" > > There were no changes in dt-bindings patch. > > Link to v5: https://lore.kernel.org/all/20251005133228.62704-1-asmirnou@pinefeat.co.uk/ > > Patches: > dt-bindings: Pinefeat cef168 lens control board > media: i2c: Pinefeat cef168 lens control board driver > > .../bindings/media/i2c/pinefeat,cef168.yaml | 47 +++ > .../devicetree/bindings/vendor-prefixes.yaml | 2 + > MAINTAINERS | 7 + > drivers/media/i2c/Kconfig | 9 + > drivers/media/i2c/Makefile | 1 + > drivers/media/i2c/cef168.c | 317 ++++++++++++++++++ > include/uapi/linux/v4l2-controls.h | 6 + > 7 files changed, 389 insertions(+) > create mode 100644 Documentation/devicetree/bindings/media/i2c/pinefeat,cef168.yaml > create mode 100644 drivers/media/i2c/cef168.c > > > base-commit: 6093a688a07da07808f0122f9aa2a3eed250d853 Thank you, Alen Karnil ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v6 0/2] Pinefeat cef168 lens control board driver 2026-05-26 15:54 ` [PATCH v6 0/2] " Alen Karnil @ 2026-05-26 20:35 ` Aliaksandr Smirnou 2026-05-27 11:45 ` Alen Karnil 0 siblings, 1 reply; 16+ messages in thread From: Aliaksandr Smirnou @ 2026-05-26 20:35 UTC (permalink / raw) To: alen.karnil Cc: asmirnou, conor+dt, devicetree, hverkuil, jacopo.mondi, krzk+dt, linux-kernel, linux-media, mchehab, robh On Tue, 26 May 2026 16:54:37 +0100, Alen Karnil wrote: > I've been asked by Kieran Bingham to review your patches, I've > reproduced your work on setup with a Pi 5 with a 6.18 kernel and > I got a few questions Hi Alen, Thank you for resuming the work on the patch. > I built the calibration application but it would not work out the > box, I can see that CEF168_V4L2_CID_CUSTOM is different between that > is in the patch and in the application? Which is the correct one, > does the patch need updating? The CEF168_V4L2_CID_CUSTOM value used in the patch is the correct one. Although the repository currently defines it with a different value, this does not cause any issues for users because the driver is built and installed locally together with the calibration tool. I can update the value in the cef168 repository at any time, so as long as users pull the latest version of the repository, everything will work correctly. If the driver is eventually merged into the Linux kernel source tree, the repository will need to be updated accordingly anyway, because there will be no need to build the driver locally. > The tool to modify the device tree also did not work with the > IMX477, I needed to manually modify my device tree to get the dtbo > to build, I just double-checked the setup on a Raspberry Pi 5 running the latest 6.18 kernel from the stock Raspberry Pi OS, and everything works correctly. Are you using a customized Linux distribution? Could you provide the build error logs and the overlay files generated by the tool before you modified them? The modifications applied by the tool are shown in this diff: https://gist.github.com/pinefeat/1b3a258a193754f073e171b1ed33a0cc Were the generated files different in your setup? > there needs to be some further discussions on how we could > improve the user experience when it comes to enabling the vcm with > camera sensors. I agree. I started the discussion on the Raspberry Pi forum, but the driver needs to be merged first before moving forward with that. https://forums.raspberrypi.com/viewtopic.php?p=2318070#p2318070 ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v6 0/2] Pinefeat cef168 lens control board driver 2026-05-26 20:35 ` Aliaksandr Smirnou @ 2026-05-27 11:45 ` Alen Karnil 2026-05-27 19:49 ` Aliaksandr Smirnou 0 siblings, 1 reply; 16+ messages in thread From: Alen Karnil @ 2026-05-27 11:45 UTC (permalink / raw) To: Aliaksandr Smirnou Cc: conor+dt, devicetree, hverkuil, jacopo.mondi, krzk+dt, linux-kernel, linux-media, mchehab, robh On 26/05/2026 21:35, Aliaksandr Smirnou wrote: > On Tue, 26 May 2026 16:54:37 +0100, Alen Karnil wrote: > >> I've been asked by Kieran Bingham to review your patches, I've >> reproduced your work on setup with a Pi 5 with a 6.18 kernel and >> I got a few questions > > Hi Alen, > > Thank you for resuming the work on the patch. > >> I built the calibration application but it would not work out the >> box, I can see that CEF168_V4L2_CID_CUSTOM is different between that >> is in the patch and in the application? Which is the correct one, >> does the patch need updating? > > The CEF168_V4L2_CID_CUSTOM value used in the patch is the correct one. > > Although the repository currently defines it with a different value, > this does not cause any issues for users because the driver is built > and installed locally together with the calibration tool. > > I can update the value in the cef168 repository at any time, so as long > as users pull the latest version of the repository, everything will work > correctly. > > If the driver is eventually merged into the Linux kernel source tree, > the repository will need to be updated accordingly anyway, because there > will be no need to build the driver locally. > >> The tool to modify the device tree also did not work with the >> IMX477, I needed to manually modify my device tree to get the dtbo >> to build, > > I just double-checked the setup on a Raspberry Pi 5 running the latest > 6.18 kernel from the stock Raspberry Pi OS, and everything works > correctly. Are you using a customized Linux distribution? > Strange, I've taken the latest RPi lite trxie OS, but I replaced the kernel from the rpi-6.18.y branch. > Could you provide the build error logs and the overlay files generated > by the tool before you modified them? using the configure.sh tool with imx477 imx477_378-overlay.dtsi ``` // SPDX-License-Identifier: GPL-2.0-only // Definitions for IMX477 camera module on VC I2C bus /{ compatible = "brcm,bcm2835"; fragment@0 { target = <&i2c0if>; __overlay__ { status = "okay"; }; }; clk_frag: fragment@1 { target = <&cam1_clk>; cam_clk: __overlay__ { clock-frequency = <24000000>; status = "okay"; }; }; fragment@2 { target = <&i2c0mux>; __overlay__ { status = "okay"; }; }; reg_frag: fragment@3 { target = <&cam1_reg>; cam_reg: __overlay__ { startup-delay-us = <300000>; }; }; fragment@4 { target = <&cam_node>; __overlay__ { lens-focus = <&vcm_node>; }; }; reg_alwayson_frag: fragment@99 { target = <&cam1_reg>; __dormant__ { regulator-always-on; }; }; i2c_frag: fragment@100 { target = <&i2c_csi_dsi>; __overlay__ { #address-cells = <1>; #size-cells = <0>; status = "okay"; #include "imx477_378.dtsi" }; }; csi_frag: fragment@101 { target = <&csi1>; csi: __overlay__ { status = "okay"; port { csi_ep: endpoint { remote-endpoint = <&cam_endpoint>; clock-lanes = <0>; data-lanes = <1 2>; clock-noncontinuous; }; }; }; }; fragment@102 { target = <&csi1>; __dormant__ { compatible = "brcm,bcm2835-unicam-legacy"; }; }; __overrides__ { rotation = <&cam_node>,"rotation:0"; orientation = <&cam_node>,"orientation:0"; media-controller = <0>,"!102"; cam0 = <&i2c_frag>, "target:0=",<&i2c_csi_dsi0>, <&csi_frag>, "target:0=",<&csi0>, <&clk_frag>, "target:0=",<&cam0_clk>, <®_frag>, "target:0=",<&cam0_reg>, <®_alwayson_frag>, "target:0=",<&cam0_reg>, <&cam_node>, "clocks:0=",<&cam0_clk>, <&cam_node>, "VANA-supply:0=",<&cam0_reg>; always-on = <0>, "+99"; link-frequency = <&cam_endpoint>,"link-frequencies#0"; vcm = <&vcm_node>, "status", <0>, "=4"; }; }; &cam_node { status = "okay"; }; &cam_endpoint { remote-endpoint = <&csi_ep>; }; &vcm_node { status = "okay"; }; ``` And imx477_378.dtsi ``` cam_node: imx477@1a { reg = <0x1a>; status = "disabled"; clocks = <&cam1_clk>; clock-names = "xclk"; VANA-supply = <&cam1_reg>; /* 2.8v */ VDIG-supply = <&cam_dummy_reg>; /* 1.05v */ VDDL-supply = <&cam_dummy_reg>; /* 1.8v */ rotation = <180>; orientation = <2>; port { cam_endpoint: endpoint { clock-lanes = <0>; data-lanes = <1 2>; clock-noncontinuous; link-frequencies = /bits/ 64 <450000000>; }; }; }; vcm_node: cef168@d { compatible = "pinefeat,cef168"; reg = <0x0d>; status = "disabled"; vcc-supply = <&vdd_3v3_reg>; }; ``` If put these into my kernel build I get: $ make dtbs DTCO arch/arm64/boot/dts/overlays/camera-mux-2port.dtbo arch/arm64/boot/dts/overlays/imx477_378.dtsi:26.20-31.3: ERROR (duplicate_label): /fragment@200/__overlay__/pca@70/i2c@1/cef168@d: Duplicate label 'vcm_node' on /fragment@200/__overlay__/pca@70/i2c@1/cef168@d and /fragment@200/__overlay__/pca@70/i2c@0/cef168@d ERROR: Input tree has errors, aborting (use -f to force output) make[3]: *** [scripts/Makefile.dtbs:142: arch/arm64/boot/dts/overlays/camera-mux-2port.dtbo] Error 2 make[2]: *** [scripts/Makefile.build:544: arch/arm64/boot/dts/overlays] Error 2 make[1]: *** [/home/admin/linux/Makefile:1498: dtbs] Error 2 make: *** [Makefile:248: __sub-make] Error 2 > > The modifications applied by the tool are shown in this diff: > > https://gist.github.com/pinefeat/1b3a258a193754f073e171b1ed33a0cc > > Were the generated files different in your setup? I will include my working dts* for the imx477 imx477_378-overlay.dtsi ``` // SPDX-License-Identifier: GPL-2.0-only // Definitions for IMX477 camera module on VC I2C bus /{ compatible = "brcm,bcm2835"; fragment@0 { target = <&i2c0if>; __overlay__ { status = "okay"; }; }; clk_frag: fragment@1 { target = <&cam1_clk>; cam_clk: __overlay__ { clock-frequency = <24000000>; status = "okay"; }; }; fragment@2 { target = <&i2c0mux>; __overlay__ { status = "okay"; }; }; reg_frag: fragment@3 { target = <&cam1_reg>; cam_reg: __overlay__ { startup-delay-us = <300000>; }; }; reg_alwayson_frag: fragment@99 { target = <&cam1_reg>; __dormant__ { regulator-always-on; }; }; i2c_frag: fragment@100 { target = <&i2c_csi_dsi>; __overlay__ { #address-cells = <1>; #size-cells = <0>; status = "okay"; #include "imx477_378.dtsi" vcm: cef168@d { compatible = "pinefeat,cef168"; reg = <0x0d>; status = "disabled"; vcc-supply = <&vdd_3v3_reg>; }; }; }; csi_frag: fragment@101 { target = <&csi1>; csi: __overlay__ { status = "okay"; port { csi_ep: endpoint { remote-endpoint = <&cam_endpoint>; clock-lanes = <0>; data-lanes = <1 2>; clock-noncontinuous; }; }; }; }; fragment@102 { target = <&csi1>; __dormant__ { compatible = "brcm,bcm2835-unicam-legacy"; }; }; __overrides__ { rotation = <&cam_node>,"rotation:0"; orientation = <&cam_node>,"orientation:0"; media-controller = <0>,"!102"; cam0 = <&i2c_frag>, "target:0=",<&i2c_csi_dsi0>, <&csi_frag>, "target:0=",<&csi0>, <&clk_frag>, "target:0=",<&cam0_clk>, <®_frag>, "target:0=",<&cam0_reg>, <®_alwayson_frag>, "target:0=",<&cam0_reg>, <&cam_node>, "clocks:0=",<&cam0_clk>, <&cam_node>, "VANA-supply:0=",<&cam0_reg>; always-on = <0>, "+99"; vcm = <&vcm>, "status=okay", <&cam_node>,"lens-focus:0=", <&vcm>; link-frequency = <&cam_endpoint>,"link-frequencies#0"; }; }; &cam_node { status = "okay"; }; &cam_endpoint { remote-endpoint = <&csi_ep>; }; ``` Also I needed to add `vcm` to my dtoverlay for the pi's config.txt > >> there needs to be some further discussions on how we could >> improve the user experience when it comes to enabling the vcm with >> camera sensors. > > I agree. I started the discussion on the Raspberry Pi forum, but the > driver needs to be merged first before moving forward with that. Sure that makes sense, lets focus on the driver for now. > > https://forums.raspberrypi.com/viewtopic.php?p=2318070#p2318070 Also you will most likely need to update the patch since the line offsets have moved to work 6.18 ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v6 0/2] Pinefeat cef168 lens control board driver 2026-05-27 11:45 ` Alen Karnil @ 2026-05-27 19:49 ` Aliaksandr Smirnou 2026-05-28 8:36 ` Alen Karnil 0 siblings, 1 reply; 16+ messages in thread From: Aliaksandr Smirnou @ 2026-05-27 19:49 UTC (permalink / raw) To: alen.karnil Cc: asmirnou, conor+dt, devicetree, hverkuil, jacopo.mondi, krzk+dt, linux-kernel, linux-media, mchehab, robh On Wed, 27 May 2026 12:45:26 +0100, Alen Karnil wrote: > > Could you provide the build error logs and the overlay files generated > > by the tool before you modified them? > using the configure.sh tool with imx477 > imx477_378-overlay.dtsi > ... The files generated after running the configure.sh tool look correct and match mine exactly. > If put these into my kernel build I get: > > $ make dtbs > DTCO arch/arm64/boot/dts/overlays/camera-mux-2port.dtbo > arch/arm64/boot/dts/overlays/imx477_378.dtsi:26.20-31.3: ERROR > (duplicate_label): /fragment@200/__overlay__/pca@70/i2c@1/cef168@d: > Duplicate label 'vcm_node' on > /fragment@200/__overlay__/pca@70/i2c@1/cef168@d and > /fragment@200/__overlay__/pca@70/i2c@0/cef168@d > ERROR: Input tree has errors, aborting (use -f to force output) > make[3]: *** [scripts/Makefile.dtbs:142: > arch/arm64/boot/dts/overlays/camera-mux-2port.dtbo] Error 2 > make[2]: *** [scripts/Makefile.build:544: arch/arm64/boot/dts/overlays] > Error 2 > make[1]: *** [/home/admin/linux/Makefile:1498: dtbs] Error 2 > make: *** [Makefile:248: __sub-make] Error 2 It looks like a different Makefile is being used. In the cef168 repository's Makefile, there is no dtbs target. Also, our Makefile is only 27 lines long, while the log output indicates the error occurs at line 1498. Could you please ensure you are using the Makefile provided in the cef168 repository? > >> there needs to be some further discussions on how we could > >> improve the user experience when it comes to enabling the vcm with > >> camera sensors. > > > > I agree. I started the discussion on the Raspberry Pi forum, but the > > driver needs to be merged first before moving forward with that. > Sure that makes sense, lets focus on the driver for now. > > > > https://forums.raspberrypi.com/viewtopic.php?p=2318070#p2318070 > > Also you will most likely need to update the patch since the line > offsets have moved to work 6.18 Will do. Should I update the patch before or after your review? ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v6 0/2] Pinefeat cef168 lens control board driver 2026-05-27 19:49 ` Aliaksandr Smirnou @ 2026-05-28 8:36 ` Alen Karnil 2026-05-30 11:46 ` Aliaksandr Smirnou 0 siblings, 1 reply; 16+ messages in thread From: Alen Karnil @ 2026-05-28 8:36 UTC (permalink / raw) To: Aliaksandr Smirnou Cc: conor+dt, devicetree, hverkuil, jacopo.mondi, krzk+dt, linux-kernel, linux-media, mchehab, robh On 27/05/2026 20:49, Aliaksandr Smirnou wrote: > On Wed, 27 May 2026 12:45:26 +0100, Alen Karnil wrote: > >>> Could you provide the build error logs and the overlay files generated >>> by the tool before you modified them? >> using the configure.sh tool with imx477 >> imx477_378-overlay.dtsi >> ... > > The files generated after running the configure.sh tool look correct and > match mine exactly. > >> If put these into my kernel build I get: >> >> $ make dtbs >> DTCO arch/arm64/boot/dts/overlays/camera-mux-2port.dtbo >> arch/arm64/boot/dts/overlays/imx477_378.dtsi:26.20-31.3: ERROR >> (duplicate_label): /fragment@200/__overlay__/pca@70/i2c@1/cef168@d: >> Duplicate label 'vcm_node' on >> /fragment@200/__overlay__/pca@70/i2c@1/cef168@d and >> /fragment@200/__overlay__/pca@70/i2c@0/cef168@d >> ERROR: Input tree has errors, aborting (use -f to force output) >> make[3]: *** [scripts/Makefile.dtbs:142: >> arch/arm64/boot/dts/overlays/camera-mux-2port.dtbo] Error 2 >> make[2]: *** [scripts/Makefile.build:544: arch/arm64/boot/dts/overlays] >> Error 2 >> make[1]: *** [/home/admin/linux/Makefile:1498: dtbs] Error 2 >> make: *** [Makefile:248: __sub-make] Error 2 > > It looks like a different Makefile is being used. In the cef168 > repository's Makefile, there is no dtbs target. Also, our Makefile is > only 27 lines long, while the log output indicates the error occurs at > line 1498. > I was using the kernel's makefile, basically following https://www.raspberrypi.com/documentation/computers/linux_kernel.html The kernel I am running has a LOCALVERSION set so it is 6.18.32-v8-afk+ (for reference) > Could you please ensure you are using the Makefile provided in the cef168 > repository? ``` $ make make -C "/lib/modules/`uname -r`/build" M="/home/admin/work/cef168" DTC_INCLUDE="/usr/src/linux-headers-`uname -r | sed 's/rpt-.*/rpt-common-rpi/'`/include" make[1]: Entering directory '/home/admin/linux' make[2]: Entering directory '/home/admin/work/cef168' CC [M] cef168.o make[4]: *** No rule to make target 'imx477.dtbo', needed by 'modules.order'. Stop. make[3]: *** [/home/admin/linux/Makefile:2024: .] Error 2 make[2]: *** [/home/admin/linux/Makefile:248: __sub-make] Error 2 make[2]: Leaving directory '/home/admin/work/cef168' make[1]: *** [Makefile:248: __sub-make] Error 2 make[1]: Leaving directory '/home/admin/linux' make: *** [Makefile:16: default] Error 2 ``` This is what I got hung up on, which is why I moved onto copying the .dts* and building it from the kernel directory, which lead into the previous issue and me needing to roll my own .dts* > >>>> there needs to be some further discussions on how we could >>>> improve the user experience when it comes to enabling the vcm with >>>> camera sensors. >>> >>> I agree. I started the discussion on the Raspberry Pi forum, but the >>> driver needs to be merged first before moving forward with that. >> Sure that makes sense, lets focus on the driver for now. >>> >>> https://forums.raspberrypi.com/viewtopic.php?p=2318070#p2318070 >> >> Also you will most likely need to update the patch since the line >> offsets have moved to work 6.18 > > Will do. Should I update the patch before or after your review? I would prefer if you were to update it before just so we are in sync, thank you. ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v6 0/2] Pinefeat cef168 lens control board driver 2026-05-28 8:36 ` Alen Karnil @ 2026-05-30 11:46 ` Aliaksandr Smirnou 2026-06-01 8:59 ` Alen Karnil 0 siblings, 1 reply; 16+ messages in thread From: Aliaksandr Smirnou @ 2026-05-30 11:46 UTC (permalink / raw) To: alen.karnil Cc: asmirnou, conor+dt, devicetree, hverkuil, jacopo.mondi, krzk+dt, linux-kernel, linux-media, mchehab, robh On Thu, 28 May 2026 09:36:13 +0100, Alen Karnil wrote: > > Could you please ensure you are using the Makefile provided in the cef168 > > repository? > ``` > $ make > make -C "/lib/modules/`uname -r`/build" M="/home/admin/work/cef168" > DTC_INCLUDE="/usr/src/linux-headers-`uname -r | sed > 's/rpt-.*/rpt-common-rpi/'`/include" > make[1]: Entering directory '/home/admin/linux' > make[2]: Entering directory '/home/admin/work/cef168' > CC [M] cef168.o > make[4]: *** No rule to make target 'imx477.dtbo', needed by > 'modules.order'. Stop. > make[3]: *** [/home/admin/linux/Makefile:2024: .] Error 2 > make[2]: *** [/home/admin/linux/Makefile:248: __sub-make] Error 2 > make[2]: Leaving directory '/home/admin/work/cef168' > make[1]: *** [Makefile:248: __sub-make] Error 2 > make[1]: Leaving directory '/home/admin/linux' > make: *** [Makefile:16: default] Error 2 > ``` > > This is what I got hung up on, which is why I moved onto copying the > .dts* and building it from the kernel directory, which lead into the > previous issue and me needing to roll my own .dts* Could you pull the latest version of the main branch from the cef168 repository? This issue was fixed recently, so it looks like the code you pulled was from before that fix was merged. The fix involved using the dtb-y target instead of obj-m in the Makefile. > > Will do. Should I update the patch before or after your review? > > I would prefer if you were to update it before just so we are in sync, > thank you. Will do. ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v6 0/2] Pinefeat cef168 lens control board driver 2026-05-30 11:46 ` Aliaksandr Smirnou @ 2026-06-01 8:59 ` Alen Karnil 0 siblings, 0 replies; 16+ messages in thread From: Alen Karnil @ 2026-06-01 8:59 UTC (permalink / raw) To: Aliaksandr Smirnou Cc: conor+dt, devicetree, hverkuil, jacopo.mondi, krzk+dt, linux-kernel, linux-media, mchehab, robh On 30/05/2026 12:46, Aliaksandr Smirnou wrote: > On Thu, 28 May 2026 09:36:13 +0100, Alen Karnil wrote: > >>> Could you please ensure you are using the Makefile provided in the cef168 >>> repository? >> ``` >> $ make >> make -C "/lib/modules/`uname -r`/build" M="/home/admin/work/cef168" >> DTC_INCLUDE="/usr/src/linux-headers-`uname -r | sed >> 's/rpt-.*/rpt-common-rpi/'`/include" >> make[1]: Entering directory '/home/admin/linux' >> make[2]: Entering directory '/home/admin/work/cef168' >> CC [M] cef168.o >> make[4]: *** No rule to make target 'imx477.dtbo', needed by >> 'modules.order'. Stop. >> make[3]: *** [/home/admin/linux/Makefile:2024: .] Error 2 >> make[2]: *** [/home/admin/linux/Makefile:248: __sub-make] Error 2 >> make[2]: Leaving directory '/home/admin/work/cef168' >> make[1]: *** [Makefile:248: __sub-make] Error 2 >> make[1]: Leaving directory '/home/admin/linux' >> make: *** [Makefile:16: default] Error 2 >> ``` >> >> This is what I got hung up on, which is why I moved onto copying the >> .dts* and building it from the kernel directory, which lead into the >> previous issue and me needing to roll my own .dts* > > Could you pull the latest version of the main branch from the cef168 > repository? This issue was fixed recently, so it looks like the code > you pulled was from before that fix was merged. > > The fix involved using the dtb-y target instead of obj-m in the Makefile. Just tested it, now it works, thanks. > >>> Will do. Should I update the patch before or after your review? >> >> I would prefer if you were to update it before just so we are in sync, >> thank you. > > Will do. I will continue the review once it's received. ^ permalink raw reply [flat|nested] 16+ messages in thread
end of thread, other threads:[~2026-06-01 8:59 UTC | newest] Thread overview: 16+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2025-10-07 19:57 [PATCH v6 0/2] Pinefeat cef168 lens control board driver Aliaksandr Smirnou 2025-10-07 19:57 ` [PATCH v6 1/2] dt-bindings: Pinefeat cef168 lens control board Aliaksandr Smirnou 2025-10-07 20:47 ` Conor Dooley 2025-10-08 17:50 ` Aliaksandr Smirnou 2025-10-08 18:31 ` Conor Dooley 2025-10-08 21:32 ` Aliaksandr Smirnou 2025-10-08 23:46 ` Krzysztof Kozlowski 2025-10-09 20:17 ` Aliaksandr Smirnou 2025-10-07 19:57 ` [PATCH v6 2/2] media: i2c: Pinefeat cef168 lens control board driver Aliaksandr Smirnou 2026-05-26 15:54 ` [PATCH v6 0/2] " Alen Karnil 2026-05-26 20:35 ` Aliaksandr Smirnou 2026-05-27 11:45 ` Alen Karnil 2026-05-27 19:49 ` Aliaksandr Smirnou 2026-05-28 8:36 ` Alen Karnil 2026-05-30 11:46 ` Aliaksandr Smirnou 2026-06-01 8:59 ` Alen Karnil
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox
powered by JetHome