* [PATCH v7 1/5] dt-bindings: media: i2c: Add Sony IMX355
2026-01-17 4:06 [PATCH v7 0/5] media: i2c: IMX355 for the Pixel 3a Richard Acayan
@ 2026-01-17 4:06 ` Richard Acayan
2026-01-17 10:52 ` Krzysztof Kozlowski
2026-01-19 8:40 ` Sakari Ailus
2026-01-17 4:06 ` [PATCH v7 2/5] media: i2c: imx355: Support devicetree and power management Richard Acayan
` (3 subsequent siblings)
4 siblings, 2 replies; 19+ messages in thread
From: Richard Acayan @ 2026-01-17 4:06 UTC (permalink / raw)
To: Mauro Carvalho Chehab, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Bjorn Andersson, Konrad Dybcio, Sakari Ailus,
Tianshu Qiu, linux-media, devicetree, linux-arm-msm
Cc: Robert Mader, Bryan O'Donoghue, Vladimir Zapolskiy,
David Heidelberg, phone-devel, Richard Acayan
The IMX355 camera sensor is a camera sensor that can be found as the
front camera in some smartphones, such as the Pixel 3, Pixel 3 XL, Pixel
3a, and Pixel 3a XL. It already has a driver, but needs support for
device tree. Document the IMX355 to support defining it in device tree.
Reviewed-by: Vladimir Zapolskiy <vladimir.zapolskiy@linaro.org>
Signed-off-by: Richard Acayan <mailingradian@gmail.com>
---
.../bindings/media/i2c/sony,imx355.yaml | 105 ++++++++++++++++++
1 file changed, 105 insertions(+)
create mode 100644 Documentation/devicetree/bindings/media/i2c/sony,imx355.yaml
diff --git a/Documentation/devicetree/bindings/media/i2c/sony,imx355.yaml b/Documentation/devicetree/bindings/media/i2c/sony,imx355.yaml
new file mode 100644
index 000000000000..0a3aa63b7b5f
--- /dev/null
+++ b/Documentation/devicetree/bindings/media/i2c/sony,imx355.yaml
@@ -0,0 +1,105 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/media/i2c/sony,imx355.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Sony IMX355 Sensor
+
+maintainers:
+ - Richard Acayan <mailingradian@gmail.com>
+
+description:
+ The IMX355 sensor is a 3280x2464 image sensor, commonly found as the front
+ camera in smartphones.
+
+allOf:
+ - $ref: /schemas/media/video-interface-devices.yaml#
+
+properties:
+ compatible:
+ const: sony,imx355
+
+ reg:
+ maxItems: 1
+
+ clocks:
+ maxItems: 1
+
+ avdd-supply:
+ description: Analog power supply.
+
+ dvdd-supply:
+ description: Digital power supply.
+
+ dovdd-supply:
+ description: Interface power supply.
+
+ reset-gpios:
+ description: Reset GPIO (active low).
+ maxItems: 1
+
+ port:
+ $ref: /schemas/graph.yaml#/$defs/port-base
+ additionalProperties: false
+
+ properties:
+ endpoint:
+ $ref: /schemas/media/video-interfaces.yaml
+ unevaluatedProperties: false
+
+ required:
+ - link-frequencies
+
+ required:
+ - endpoint
+
+required:
+ - compatible
+ - reg
+ - clocks
+ - avdd-supply
+ - dvdd-supply
+ - dovdd-supply
+ - port
+
+unevaluatedProperties: false
+
+examples:
+ - |
+ #include <dt-bindings/clock/qcom,camcc-sdm845.h>
+ #include <dt-bindings/gpio/gpio.h>
+
+ i2c {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ camera@1a {
+ compatible = "sony,imx355";
+ reg = <0x1a>;
+
+ clocks = <&camcc CAM_CC_MCLK2_CLK>;
+
+ assigned-clocks = <&camcc CAM_CC_MCLK2_CLK>;
+ assigned-clock-rates = <24000000>;
+
+ reset-gpios = <&tlmm 9 GPIO_ACTIVE_LOW>;
+
+ avdd-supply = <&cam_front_ldo>;
+ dvdd-supply = <&cam_front_ldo>;
+ dovdd-supply = <&cam_vio_ldo>;
+
+ pinctrl-names = "default";
+ pinctrl-0 = <&cam_front_default>;
+
+ rotation = <270>;
+ orientation = <0>;
+
+ port {
+ cam_front_endpoint: endpoint {
+ link-frequencies = /bits/ 64 <360000000>;
+ remote-endpoint = <&camss_endpoint1>;
+ };
+ };
+ };
+ };
--
2.52.0
^ permalink raw reply related [flat|nested] 19+ messages in thread* Re: [PATCH v7 1/5] dt-bindings: media: i2c: Add Sony IMX355
2026-01-17 4:06 ` [PATCH v7 1/5] dt-bindings: media: i2c: Add Sony IMX355 Richard Acayan
@ 2026-01-17 10:52 ` Krzysztof Kozlowski
2026-01-19 8:40 ` Sakari Ailus
1 sibling, 0 replies; 19+ messages in thread
From: Krzysztof Kozlowski @ 2026-01-17 10:52 UTC (permalink / raw)
To: Richard Acayan, Mauro Carvalho Chehab, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Bjorn Andersson, Konrad Dybcio,
Sakari Ailus, Tianshu Qiu, linux-media, devicetree, linux-arm-msm
Cc: Robert Mader, Bryan O'Donoghue, Vladimir Zapolskiy,
David Heidelberg, phone-devel
On 17/01/2026 05:06, Richard Acayan wrote:
> The IMX355 camera sensor is a camera sensor that can be found as the
> front camera in some smartphones, such as the Pixel 3, Pixel 3 XL, Pixel
> 3a, and Pixel 3a XL. It already has a driver, but needs support for
> device tree. Document the IMX355 to support defining it in device tree.
>
> Reviewed-by: Vladimir Zapolskiy <vladimir.zapolskiy@linaro.org>
> Signed-off-by: Richard Acayan <mailingradian@gmail.com>
> ---
> .../bindings/media/i2c/sony,imx355.yaml | 105 ++++++++++++++++++
> 1 file changed, 105 insertions(+)
> create mode 100644 Documentation/devicetree/bindings/media/i2c/sony,imx355.yaml
>
Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@oss.qualcomm.com>
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH v7 1/5] dt-bindings: media: i2c: Add Sony IMX355
2026-01-17 4:06 ` [PATCH v7 1/5] dt-bindings: media: i2c: Add Sony IMX355 Richard Acayan
2026-01-17 10:52 ` Krzysztof Kozlowski
@ 2026-01-19 8:40 ` Sakari Ailus
1 sibling, 0 replies; 19+ messages in thread
From: Sakari Ailus @ 2026-01-19 8:40 UTC (permalink / raw)
To: Richard Acayan
Cc: Mauro Carvalho Chehab, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Bjorn Andersson, Konrad Dybcio, Tianshu Qiu,
linux-media, devicetree, linux-arm-msm, Robert Mader,
Bryan O'Donoghue, Vladimir Zapolskiy, David Heidelberg,
phone-devel
Hi Richard,
On Fri, Jan 16, 2026 at 11:06:53PM -0500, Richard Acayan wrote:
> The IMX355 camera sensor is a camera sensor that can be found as the
> front camera in some smartphones, such as the Pixel 3, Pixel 3 XL, Pixel
> 3a, and Pixel 3a XL. It already has a driver, but needs support for
> device tree. Document the IMX355 to support defining it in device tree.
>
> Reviewed-by: Vladimir Zapolskiy <vladimir.zapolskiy@linaro.org>
> Signed-off-by: Richard Acayan <mailingradian@gmail.com>
> ---
> .../bindings/media/i2c/sony,imx355.yaml | 105 ++++++++++++++++++
> 1 file changed, 105 insertions(+)
> create mode 100644 Documentation/devicetree/bindings/media/i2c/sony,imx355.yaml
>
> diff --git a/Documentation/devicetree/bindings/media/i2c/sony,imx355.yaml b/Documentation/devicetree/bindings/media/i2c/sony,imx355.yaml
> new file mode 100644
> index 000000000000..0a3aa63b7b5f
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/media/i2c/sony,imx355.yaml
> @@ -0,0 +1,105 @@
> +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
> +%YAML 1.2
> +---
> +$id: http://devicetree.org/schemas/media/i2c/sony,imx355.yaml#
> +$schema: http://devicetree.org/meta-schemas/core.yaml#
> +
> +title: Sony IMX355 Sensor
> +
> +maintainers:
> + - Richard Acayan <mailingradian@gmail.com>
> +
> +description:
> + The IMX355 sensor is a 3280x2464 image sensor, commonly found as the front
> + camera in smartphones.
> +
> +allOf:
> + - $ref: /schemas/media/video-interface-devices.yaml#
> +
> +properties:
> + compatible:
> + const: sony,imx355
> +
> + reg:
> + maxItems: 1
> +
> + clocks:
> + maxItems: 1
> +
> + avdd-supply:
> + description: Analog power supply.
> +
> + dvdd-supply:
> + description: Digital power supply.
> +
> + dovdd-supply:
> + description: Interface power supply.
> +
> + reset-gpios:
> + description: Reset GPIO (active low).
> + maxItems: 1
> +
> + port:
> + $ref: /schemas/graph.yaml#/$defs/port-base
> + additionalProperties: false
> +
> + properties:
> + endpoint:
> + $ref: /schemas/media/video-interfaces.yaml
> + unevaluatedProperties: false
Can you add data-lanes property with the default of 4? That's what the
driver uses and can't do anything else right now -- the driver should
actually fail if the number of lanes differs; a patch to do that would be
nice.
> +
> + required:
> + - link-frequencies
> +
> + required:
> + - endpoint
> +
> +required:
> + - compatible
> + - reg
> + - clocks
> + - avdd-supply
> + - dvdd-supply
> + - dovdd-supply
> + - port
> +
> +unevaluatedProperties: false
> +
> +examples:
> + - |
> + #include <dt-bindings/clock/qcom,camcc-sdm845.h>
> + #include <dt-bindings/gpio/gpio.h>
> +
> + i2c {
> + #address-cells = <1>;
> + #size-cells = <0>;
> +
> + camera@1a {
> + compatible = "sony,imx355";
> + reg = <0x1a>;
> +
> + clocks = <&camcc CAM_CC_MCLK2_CLK>;
> +
> + assigned-clocks = <&camcc CAM_CC_MCLK2_CLK>;
> + assigned-clock-rates = <24000000>;
> +
> + reset-gpios = <&tlmm 9 GPIO_ACTIVE_LOW>;
> +
> + avdd-supply = <&cam_front_ldo>;
> + dvdd-supply = <&cam_front_ldo>;
> + dovdd-supply = <&cam_vio_ldo>;
> +
> + pinctrl-names = "default";
> + pinctrl-0 = <&cam_front_default>;
> +
> + rotation = <270>;
> + orientation = <0>;
> +
> + port {
> + cam_front_endpoint: endpoint {
> + link-frequencies = /bits/ 64 <360000000>;
> + remote-endpoint = <&camss_endpoint1>;
> + };
> + };
> + };
> + };
--
Kind regards,
Sakari Ailus
^ permalink raw reply [flat|nested] 19+ messages in thread
* [PATCH v7 2/5] media: i2c: imx355: Support devicetree and power management
2026-01-17 4:06 [PATCH v7 0/5] media: i2c: IMX355 for the Pixel 3a Richard Acayan
2026-01-17 4:06 ` [PATCH v7 1/5] dt-bindings: media: i2c: Add Sony IMX355 Richard Acayan
@ 2026-01-17 4:06 ` Richard Acayan
2026-01-17 12:03 ` Vladimir Zapolskiy
2026-01-20 12:44 ` Bryan O'Donoghue
2026-01-17 4:06 ` [PATCH v7 3/5] arm64: dts: qcom: sdm670: label the camss ports instead of endpoints Richard Acayan
` (2 subsequent siblings)
4 siblings, 2 replies; 19+ messages in thread
From: Richard Acayan @ 2026-01-17 4:06 UTC (permalink / raw)
To: Mauro Carvalho Chehab, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Bjorn Andersson, Konrad Dybcio, Sakari Ailus,
Tianshu Qiu, linux-media, devicetree, linux-arm-msm
Cc: Robert Mader, Bryan O'Donoghue, Vladimir Zapolskiy,
David Heidelberg, phone-devel, Richard Acayan
A device tree compatible makes it possible for this driver to be used on
Open Firmware devices. Initialization of power-managed resources such as
the reset GPIO and voltage regulators can be specified in the device
tree and handled by the driver. Add support for this so the Pixel 3a can
use the driver.
Reviewed-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
Signed-off-by: Richard Acayan <mailingradian@gmail.com>
---
drivers/media/i2c/imx355.c | 116 ++++++++++++++++++++++++++++++++++---
1 file changed, 108 insertions(+), 8 deletions(-)
diff --git a/drivers/media/i2c/imx355.c b/drivers/media/i2c/imx355.c
index 776107efe386..5a8da035ba5f 100644
--- a/drivers/media/i2c/imx355.c
+++ b/drivers/media/i2c/imx355.c
@@ -3,9 +3,13 @@
#include <linux/acpi.h>
#include <linux/clk.h>
+#include <linux/delay.h>
+#include <linux/gpio/consumer.h>
#include <linux/i2c.h>
#include <linux/module.h>
+#include <linux/of.h>
#include <linux/pm_runtime.h>
+#include <linux/regulator/consumer.h>
#include <linux/unaligned.h>
#include <media/v4l2-ctrls.h>
@@ -125,6 +129,15 @@ struct imx355 {
* Protect access to sensor v4l2 controls.
*/
struct mutex mutex;
+
+ struct gpio_desc *reset_gpio;
+ struct regulator_bulk_data *supplies;
+};
+
+static const struct regulator_bulk_data imx355_supplies[] = {
+ { .supply = "avdd" },
+ { .supply = "dvdd" },
+ { .supply = "dovdd" },
};
static const struct imx355_reg imx355_global_regs[] = {
@@ -1515,6 +1528,55 @@ static const struct v4l2_subdev_internal_ops imx355_internal_ops = {
.open = imx355_open,
};
+static int imx355_power_off(struct device *dev)
+{
+ struct i2c_client *client = container_of(dev, struct i2c_client, dev);
+ struct v4l2_subdev *sd = i2c_get_clientdata(client);
+ struct imx355 *imx355 = to_imx355(sd);
+
+ gpiod_set_value_cansleep(imx355->reset_gpio, 1);
+
+ regulator_bulk_disable(ARRAY_SIZE(imx355_supplies), imx355->supplies);
+ clk_disable_unprepare(imx355->clk);
+
+ return 0;
+}
+
+static int imx355_power_on(struct device *dev)
+{
+ struct i2c_client *client = container_of(dev, struct i2c_client, dev);
+ struct v4l2_subdev *sd = i2c_get_clientdata(client);
+ struct imx355 *imx355 = to_imx355(sd);
+ int ret;
+
+ ret = clk_prepare_enable(imx355->clk);
+ if (ret) {
+ dev_err(dev, "failed to enable clocks: %d\n", ret);
+ return ret;
+ }
+
+ ret = regulator_bulk_enable(ARRAY_SIZE(imx355_supplies),
+ imx355->supplies);
+ if (ret) {
+ dev_err(dev, "failed to enable regulators: %d\n", ret);
+ goto error_disable_clocks;
+ }
+
+ gpiod_set_value_cansleep(imx355->reset_gpio, 1);
+ usleep_range(1000, 2000);
+ gpiod_set_value_cansleep(imx355->reset_gpio, 0);
+ usleep_range(10000, 11000);
+
+ return 0;
+
+error_disable_clocks:
+ clk_disable_unprepare(imx355->clk);
+ return ret;
+}
+
+static DEFINE_RUNTIME_DEV_PM_OPS(imx355_pm_ops, imx355_power_off,
+ imx355_power_on, NULL);
+
/* Initialize control handlers */
static int imx355_init_controls(struct imx355 *imx355)
{
@@ -1689,16 +1751,26 @@ static int imx355_probe(struct i2c_client *client)
"external clock %lu is not supported\n",
freq);
- /* Initialize subdev */
- v4l2_i2c_subdev_init(&imx355->sd, client, &imx355_subdev_ops);
-
- /* Check module identity */
- ret = imx355_identify_module(imx355);
+ ret = devm_regulator_bulk_get_const(imx355->dev,
+ ARRAY_SIZE(imx355_supplies),
+ imx355_supplies,
+ &imx355->supplies);
if (ret) {
- dev_err(imx355->dev, "failed to find sensor: %d", ret);
+ dev_err_probe(imx355->dev, ret, "could not get regulators");
goto error_probe;
}
+ imx355->reset_gpio = devm_gpiod_get_optional(imx355->dev, "reset",
+ GPIOD_OUT_HIGH);
+ if (IS_ERR(imx355->reset_gpio)) {
+ ret = dev_err_probe(imx355->dev, PTR_ERR(imx355->reset_gpio),
+ "failed to get gpios");
+ goto error_probe;
+ }
+
+ /* Initialize subdev */
+ v4l2_i2c_subdev_init(&imx355->sd, client, &imx355_subdev_ops);
+
imx355->hwcfg = imx355_get_hwcfg(imx355->dev);
if (!imx355->hwcfg) {
dev_err(imx355->dev, "failed to get hwcfg");
@@ -1706,13 +1778,26 @@ static int imx355_probe(struct i2c_client *client)
goto error_probe;
}
+ ret = imx355_power_on(imx355->dev);
+ if (ret) {
+ dev_err(imx355->dev, "failed to power on sensor: %d", ret);
+ goto error_probe;
+ }
+
+ /* Check module identity */
+ ret = imx355_identify_module(imx355);
+ if (ret) {
+ dev_err(imx355->dev, "failed to find sensor: %d", ret);
+ goto error_power_off;
+ }
+
/* Set default mode to max resolution */
imx355->cur_mode = &supported_modes[0];
ret = imx355_init_controls(imx355);
if (ret) {
dev_err(imx355->dev, "failed to init controls: %d", ret);
- goto error_probe;
+ goto error_power_off;
}
/* Initialize subdev */
@@ -1752,6 +1837,9 @@ static int imx355_probe(struct i2c_client *client)
error_handler_free:
v4l2_ctrl_handler_free(imx355->sd.ctrl_handler);
+error_power_off:
+ imx355_power_off(imx355->dev);
+
error_probe:
mutex_destroy(&imx355->mutex);
@@ -1768,7 +1856,11 @@ static void imx355_remove(struct i2c_client *client)
v4l2_ctrl_handler_free(sd->ctrl_handler);
pm_runtime_disable(imx355->dev);
- pm_runtime_set_suspended(imx355->dev);
+
+ if (!pm_runtime_status_suspended(imx355->dev)) {
+ imx355_power_off(imx355->dev);
+ pm_runtime_set_suspended(imx355->dev);
+ }
mutex_destroy(&imx355->mutex);
}
@@ -1779,10 +1871,18 @@ static const struct acpi_device_id imx355_acpi_ids[] __maybe_unused = {
};
MODULE_DEVICE_TABLE(acpi, imx355_acpi_ids);
+static const struct of_device_id imx355_match_table[] = {
+ { .compatible = "sony,imx355", },
+ { /* sentinel */ }
+};
+MODULE_DEVICE_TABLE(of, imx355_match_table);
+
static struct i2c_driver imx355_i2c_driver = {
.driver = {
.name = "imx355",
.acpi_match_table = ACPI_PTR(imx355_acpi_ids),
+ .of_match_table = imx355_match_table,
+ .pm = &imx355_pm_ops,
},
.probe = imx355_probe,
.remove = imx355_remove,
--
2.52.0
^ permalink raw reply related [flat|nested] 19+ messages in thread* Re: [PATCH v7 2/5] media: i2c: imx355: Support devicetree and power management
2026-01-17 4:06 ` [PATCH v7 2/5] media: i2c: imx355: Support devicetree and power management Richard Acayan
@ 2026-01-17 12:03 ` Vladimir Zapolskiy
2026-01-20 3:50 ` Richard Acayan
2026-01-20 12:44 ` Bryan O'Donoghue
1 sibling, 1 reply; 19+ messages in thread
From: Vladimir Zapolskiy @ 2026-01-17 12:03 UTC (permalink / raw)
To: Richard Acayan, Mauro Carvalho Chehab, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Bjorn Andersson, Konrad Dybcio,
Sakari Ailus, Tianshu Qiu, linux-media, devicetree, linux-arm-msm
Cc: Robert Mader, Bryan O'Donoghue, David Heidelberg, phone-devel
On 1/17/26 06:06, Richard Acayan wrote:
> A device tree compatible makes it possible for this driver to be used on
> Open Firmware devices. Initialization of power-managed resources such as
> the reset GPIO and voltage regulators can be specified in the device
> tree and handled by the driver. Add support for this so the Pixel 3a can
> use the driver.
>
> Reviewed-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
> Signed-off-by: Richard Acayan <mailingradian@gmail.com>
> ---
> drivers/media/i2c/imx355.c | 116 ++++++++++++++++++++++++++++++++++---
> 1 file changed, 108 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/media/i2c/imx355.c b/drivers/media/i2c/imx355.c
> index 776107efe386..5a8da035ba5f 100644
> --- a/drivers/media/i2c/imx355.c
> +++ b/drivers/media/i2c/imx355.c
> @@ -3,9 +3,13 @@
>
> #include <linux/acpi.h>
> #include <linux/clk.h>
> +#include <linux/delay.h>
> +#include <linux/gpio/consumer.h>
> #include <linux/i2c.h>
> #include <linux/module.h>
> +#include <linux/of.h>
> #include <linux/pm_runtime.h>
> +#include <linux/regulator/consumer.h>
> #include <linux/unaligned.h>
>
> #include <media/v4l2-ctrls.h>
> @@ -125,6 +129,15 @@ struct imx355 {
> * Protect access to sensor v4l2 controls.
> */
> struct mutex mutex;
> +
> + struct gpio_desc *reset_gpio;
> + struct regulator_bulk_data *supplies;
> +};
> +
> +static const struct regulator_bulk_data imx355_supplies[] = {
> + { .supply = "avdd" },
> + { .supply = "dvdd" },
> + { .supply = "dovdd" },
> };
>
> static const struct imx355_reg imx355_global_regs[] = {
> @@ -1515,6 +1528,55 @@ static const struct v4l2_subdev_internal_ops imx355_internal_ops = {
> .open = imx355_open,
> };
>
> +static int imx355_power_off(struct device *dev)
> +{
> + struct i2c_client *client = container_of(dev, struct i2c_client, dev);
> + struct v4l2_subdev *sd = i2c_get_clientdata(client);
> + struct imx355 *imx355 = to_imx355(sd);
> +
> + gpiod_set_value_cansleep(imx355->reset_gpio, 1);
> +
> + regulator_bulk_disable(ARRAY_SIZE(imx355_supplies), imx355->supplies);
> + clk_disable_unprepare(imx355->clk);
> +
> + return 0;
> +}
> +
> +static int imx355_power_on(struct device *dev)
> +{
> + struct i2c_client *client = container_of(dev, struct i2c_client, dev);
> + struct v4l2_subdev *sd = i2c_get_clientdata(client);
> + struct imx355 *imx355 = to_imx355(sd);
> + int ret;
> +
> + ret = clk_prepare_enable(imx355->clk);
> + if (ret) {
> + dev_err(dev, "failed to enable clocks: %d\n", ret);
> + return ret;
> + }
> +
> + ret = regulator_bulk_enable(ARRAY_SIZE(imx355_supplies),
> + imx355->supplies);
> + if (ret) {
> + dev_err(dev, "failed to enable regulators: %d\n", ret);
> + goto error_disable_clocks;
> + }
> +
> + gpiod_set_value_cansleep(imx355->reset_gpio, 1);
> + usleep_range(1000, 2000);
The deassert above is not needed IMO, anyway.
> + gpiod_set_value_cansleep(imx355->reset_gpio, 0);
> + usleep_range(10000, 11000);
> +
> + return 0;
> +
> +error_disable_clocks:
> + clk_disable_unprepare(imx355->clk);
> + return ret;
> +}
> +
> +static DEFINE_RUNTIME_DEV_PM_OPS(imx355_pm_ops, imx355_power_off,
> + imx355_power_on, NULL);
> +
> /* Initialize control handlers */
> static int imx355_init_controls(struct imx355 *imx355)
> {
> @@ -1689,16 +1751,26 @@ static int imx355_probe(struct i2c_client *client)
> "external clock %lu is not supported\n",
> freq);
>
> - /* Initialize subdev */
> - v4l2_i2c_subdev_init(&imx355->sd, client, &imx355_subdev_ops);
> -
> - /* Check module identity */
> - ret = imx355_identify_module(imx355);
> + ret = devm_regulator_bulk_get_const(imx355->dev,
> + ARRAY_SIZE(imx355_supplies),
> + imx355_supplies,
> + &imx355->supplies);
> if (ret) {
> - dev_err(imx355->dev, "failed to find sensor: %d", ret);
> + dev_err_probe(imx355->dev, ret, "could not get regulators");
> goto error_probe;
> }
>
> + imx355->reset_gpio = devm_gpiod_get_optional(imx355->dev, "reset",
> + GPIOD_OUT_HIGH);
> + if (IS_ERR(imx355->reset_gpio)) {
> + ret = dev_err_probe(imx355->dev, PTR_ERR(imx355->reset_gpio),
> + "failed to get gpios");
> + goto error_probe;
> + }
> +
> + /* Initialize subdev */
> + v4l2_i2c_subdev_init(&imx355->sd, client, &imx355_subdev_ops);
> +
> imx355->hwcfg = imx355_get_hwcfg(imx355->dev);
> if (!imx355->hwcfg) {
> dev_err(imx355->dev, "failed to get hwcfg");
> @@ -1706,13 +1778,26 @@ static int imx355_probe(struct i2c_client *client)
> goto error_probe;
> }
>
> + ret = imx355_power_on(imx355->dev);
> + if (ret) {
> + dev_err(imx355->dev, "failed to power on sensor: %d", ret);
You do write a message to the kernel log buffer on error in imx355_power_on(),
and here it can be removed.
Also you may start using dev_err_probe() on all new error paths.
> + goto error_probe;
> + }
> +
> + /* Check module identity */
> + ret = imx355_identify_module(imx355);
> + if (ret) {
> + dev_err(imx355->dev, "failed to find sensor: %d", ret);
> + goto error_power_off;
> + }
> +
> /* Set default mode to max resolution */
> imx355->cur_mode = &supported_modes[0];
>
> ret = imx355_init_controls(imx355);
> if (ret) {
> dev_err(imx355->dev, "failed to init controls: %d", ret);
> - goto error_probe;
> + goto error_power_off;
> }
>
> /* Initialize subdev */
> @@ -1752,6 +1837,9 @@ static int imx355_probe(struct i2c_client *client)
> error_handler_free:
> v4l2_ctrl_handler_free(imx355->sd.ctrl_handler);
>
> +error_power_off:
> + imx355_power_off(imx355->dev);
> +
> error_probe:
> mutex_destroy(&imx355->mutex);
>
> @@ -1768,7 +1856,11 @@ static void imx355_remove(struct i2c_client *client)
> v4l2_ctrl_handler_free(sd->ctrl_handler);
>
> pm_runtime_disable(imx355->dev);
> - pm_runtime_set_suspended(imx355->dev);
> +
> + if (!pm_runtime_status_suspended(imx355->dev)) {
> + imx355_power_off(imx355->dev);
> + pm_runtime_set_suspended(imx355->dev);
> + }
>
> mutex_destroy(&imx355->mutex);
> }
> @@ -1779,10 +1871,18 @@ static const struct acpi_device_id imx355_acpi_ids[] __maybe_unused = {
> };
> MODULE_DEVICE_TABLE(acpi, imx355_acpi_ids);
>
> +static const struct of_device_id imx355_match_table[] = {
> + { .compatible = "sony,imx355", },
> + { /* sentinel */ }
> +};
> +MODULE_DEVICE_TABLE(of, imx355_match_table);
> +
> static struct i2c_driver imx355_i2c_driver = {
> .driver = {
> .name = "imx355",
> .acpi_match_table = ACPI_PTR(imx355_acpi_ids),
> + .of_match_table = imx355_match_table,
> + .pm = &imx355_pm_ops,
> },
> .probe = imx355_probe,
> .remove = imx355_remove,
Reviewed-by: Vladimir Zapolskiy <vladimir.zapolskiy@linaro.org>
--
Best wishes,
Vladimir
^ permalink raw reply [flat|nested] 19+ messages in thread* Re: [PATCH v7 2/5] media: i2c: imx355: Support devicetree and power management
2026-01-17 12:03 ` Vladimir Zapolskiy
@ 2026-01-20 3:50 ` Richard Acayan
2026-01-20 7:36 ` Sakari Ailus
0 siblings, 1 reply; 19+ messages in thread
From: Richard Acayan @ 2026-01-20 3:50 UTC (permalink / raw)
To: Vladimir Zapolskiy
Cc: Mauro Carvalho Chehab, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Bjorn Andersson, Konrad Dybcio, Sakari Ailus,
Tianshu Qiu, linux-media, devicetree, linux-arm-msm, Robert Mader,
Bryan O'Donoghue, David Heidelberg, phone-devel
On Sat, Jan 17, 2026 at 02:03:02PM +0200, Vladimir Zapolskiy wrote:
> On 1/17/26 06:06, Richard Acayan wrote:
(snip)
> > +static int imx355_power_on(struct device *dev)
> > +{
> > + struct i2c_client *client = container_of(dev, struct i2c_client, dev);
> > + struct v4l2_subdev *sd = i2c_get_clientdata(client);
> > + struct imx355 *imx355 = to_imx355(sd);
> > + int ret;
> > +
> > + ret = clk_prepare_enable(imx355->clk);
> > + if (ret) {
> > + dev_err(dev, "failed to enable clocks: %d\n", ret);
> > + return ret;
> > + }
> > +
> > + ret = regulator_bulk_enable(ARRAY_SIZE(imx355_supplies),
> > + imx355->supplies);
> > + if (ret) {
> > + dev_err(dev, "failed to enable regulators: %d\n", ret);
> > + goto error_disable_clocks;
> > + }
> > +
> > + gpiod_set_value_cansleep(imx355->reset_gpio, 1);
> > + usleep_range(1000, 2000);
>
> The deassert above is not needed IMO, anyway.
This assert is for clarity, otherwise it isn't obvious that the GPIO is
asserted low when the function is called. It should stay.
^ permalink raw reply [flat|nested] 19+ messages in thread* Re: [PATCH v7 2/5] media: i2c: imx355: Support devicetree and power management
2026-01-20 3:50 ` Richard Acayan
@ 2026-01-20 7:36 ` Sakari Ailus
2026-01-20 9:10 ` Krzysztof Kozlowski
0 siblings, 1 reply; 19+ messages in thread
From: Sakari Ailus @ 2026-01-20 7:36 UTC (permalink / raw)
To: Richard Acayan
Cc: Vladimir Zapolskiy, Mauro Carvalho Chehab, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Bjorn Andersson, Konrad Dybcio,
Tianshu Qiu, linux-media, devicetree, linux-arm-msm, Robert Mader,
Bryan O'Donoghue, David Heidelberg, phone-devel
On Mon, Jan 19, 2026 at 10:50:41PM -0500, Richard Acayan wrote:
> On Sat, Jan 17, 2026 at 02:03:02PM +0200, Vladimir Zapolskiy wrote:
> > On 1/17/26 06:06, Richard Acayan wrote:
> (snip)
> > > +static int imx355_power_on(struct device *dev)
> > > +{
> > > + struct i2c_client *client = container_of(dev, struct i2c_client, dev);
> > > + struct v4l2_subdev *sd = i2c_get_clientdata(client);
> > > + struct imx355 *imx355 = to_imx355(sd);
> > > + int ret;
> > > +
> > > + ret = clk_prepare_enable(imx355->clk);
> > > + if (ret) {
> > > + dev_err(dev, "failed to enable clocks: %d\n", ret);
> > > + return ret;
> > > + }
> > > +
> > > + ret = regulator_bulk_enable(ARRAY_SIZE(imx355_supplies),
> > > + imx355->supplies);
> > > + if (ret) {
> > > + dev_err(dev, "failed to enable regulators: %d\n", ret);
> > > + goto error_disable_clocks;
> > > + }
> > > +
> > > + gpiod_set_value_cansleep(imx355->reset_gpio, 1);
> > > + usleep_range(1000, 2000);
> >
> > The deassert above is not needed IMO, anyway.
>
> This assert is for clarity, otherwise it isn't obvious that the GPIO is
> asserted low when the function is called. It should stay.
I'd also remove it: it's redundant.
--
Sakari Ailus
^ permalink raw reply [flat|nested] 19+ messages in thread* Re: [PATCH v7 2/5] media: i2c: imx355: Support devicetree and power management
2026-01-20 7:36 ` Sakari Ailus
@ 2026-01-20 9:10 ` Krzysztof Kozlowski
0 siblings, 0 replies; 19+ messages in thread
From: Krzysztof Kozlowski @ 2026-01-20 9:10 UTC (permalink / raw)
To: Sakari Ailus, Richard Acayan
Cc: Vladimir Zapolskiy, Mauro Carvalho Chehab, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Bjorn Andersson, Konrad Dybcio,
Tianshu Qiu, linux-media, devicetree, linux-arm-msm, Robert Mader,
Bryan O'Donoghue, David Heidelberg, phone-devel
On 20/01/2026 08:36, Sakari Ailus wrote:
> On Mon, Jan 19, 2026 at 10:50:41PM -0500, Richard Acayan wrote:
>> On Sat, Jan 17, 2026 at 02:03:02PM +0200, Vladimir Zapolskiy wrote:
>>> On 1/17/26 06:06, Richard Acayan wrote:
>> (snip)
>>>> +static int imx355_power_on(struct device *dev)
>>>> +{
>>>> + struct i2c_client *client = container_of(dev, struct i2c_client, dev);
>>>> + struct v4l2_subdev *sd = i2c_get_clientdata(client);
>>>> + struct imx355 *imx355 = to_imx355(sd);
>>>> + int ret;
>>>> +
>>>> + ret = clk_prepare_enable(imx355->clk);
>>>> + if (ret) {
>>>> + dev_err(dev, "failed to enable clocks: %d\n", ret);
>>>> + return ret;
>>>> + }
>>>> +
>>>> + ret = regulator_bulk_enable(ARRAY_SIZE(imx355_supplies),
>>>> + imx355->supplies);
>>>> + if (ret) {
>>>> + dev_err(dev, "failed to enable regulators: %d\n", ret);
>>>> + goto error_disable_clocks;
>>>> + }
>>>> +
>>>> + gpiod_set_value_cansleep(imx355->reset_gpio, 1);
>>>> + usleep_range(1000, 2000);
>>>
>>> The deassert above is not needed IMO, anyway.
>>
>> This assert is for clarity, otherwise it isn't obvious that the GPIO is
>> asserted low when the function is called. It should stay.
>
> I'd also remove it: it's redundant.
>
Not only redundant but confusing - function is called power_on, so why
does it try to perform power off/reset first? If it was called reset
then maybe argument of code readability would stay, but here not really,
especially that there is a power off function...
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH v7 2/5] media: i2c: imx355: Support devicetree and power management
2026-01-17 4:06 ` [PATCH v7 2/5] media: i2c: imx355: Support devicetree and power management Richard Acayan
2026-01-17 12:03 ` Vladimir Zapolskiy
@ 2026-01-20 12:44 ` Bryan O'Donoghue
2026-01-20 14:49 ` Sakari Ailus
1 sibling, 1 reply; 19+ messages in thread
From: Bryan O'Donoghue @ 2026-01-20 12:44 UTC (permalink / raw)
To: Richard Acayan, Mauro Carvalho Chehab, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Bjorn Andersson, Konrad Dybcio,
Sakari Ailus, Tianshu Qiu, linux-media, devicetree, linux-arm-msm
Cc: Robert Mader, Vladimir Zapolskiy, David Heidelberg, phone-devel
On 17/01/2026 04:06, Richard Acayan wrote:
> A device tree compatible makes it possible for this driver to be used on
> Open Firmware devices. Initialization of power-managed resources such as
> the reset GPIO and voltage regulators can be specified in the device
> tree and handled by the driver. Add support for this so the Pixel 3a can
> use the driver.
>
> Reviewed-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
> Signed-off-by: Richard Acayan <mailingradian@gmail.com>
> ---
> drivers/media/i2c/imx355.c | 116 ++++++++++++++++++++++++++++++++++---
> 1 file changed, 108 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/media/i2c/imx355.c b/drivers/media/i2c/imx355.c
> index 776107efe386..5a8da035ba5f 100644
> --- a/drivers/media/i2c/imx355.c
> +++ b/drivers/media/i2c/imx355.c
> @@ -3,9 +3,13 @@
>
> #include <linux/acpi.h>
> #include <linux/clk.h>
> +#include <linux/delay.h>
> +#include <linux/gpio/consumer.h>
> #include <linux/i2c.h>
> #include <linux/module.h>
> +#include <linux/of.h>
> #include <linux/pm_runtime.h>
> +#include <linux/regulator/consumer.h>
> #include <linux/unaligned.h>
>
> #include <media/v4l2-ctrls.h>
> @@ -125,6 +129,15 @@ struct imx355 {
> * Protect access to sensor v4l2 controls.
> */
> struct mutex mutex;
> +
> + struct gpio_desc *reset_gpio;
> + struct regulator_bulk_data *supplies;
> +};
> +
> +static const struct regulator_bulk_data imx355_supplies[] = {
> + { .supply = "avdd" },
> + { .supply = "dvdd" },
> + { .supply = "dovdd" },
> };
>
> static const struct imx355_reg imx355_global_regs[] = {
> @@ -1515,6 +1528,55 @@ static const struct v4l2_subdev_internal_ops imx355_internal_ops = {
> .open = imx355_open,
> };
>
> +static int imx355_power_off(struct device *dev)
> +{
> + struct i2c_client *client = container_of(dev, struct i2c_client, dev);
> + struct v4l2_subdev *sd = i2c_get_clientdata(client);
> + struct imx355 *imx355 = to_imx355(sd);
> +
> + gpiod_set_value_cansleep(imx355->reset_gpio, 1);
> +
> + regulator_bulk_disable(ARRAY_SIZE(imx355_supplies), imx355->supplies);
> + clk_disable_unprepare(imx355->clk);
> +
> + return 0;
> +}
> +
> +static int imx355_power_on(struct device *dev)
> +{
> + struct i2c_client *client = container_of(dev, struct i2c_client, dev);
> + struct v4l2_subdev *sd = i2c_get_clientdata(client);
> + struct imx355 *imx355 = to_imx355(sd);
> + int ret;
> +
> + ret = clk_prepare_enable(imx355->clk);
> + if (ret) {
> + dev_err(dev, "failed to enable clocks: %d\n", ret);
> + return ret;
> + }
> +
> + ret = regulator_bulk_enable(ARRAY_SIZE(imx355_supplies),
> + imx355->supplies);
> + if (ret) {
> + dev_err(dev, "failed to enable regulators: %d\n", ret);
> + goto error_disable_clocks;
> + }
> +
> + gpiod_set_value_cansleep(imx355->reset_gpio, 1);
> + usleep_range(1000, 2000);
> + gpiod_set_value_cansleep(imx355->reset_gpio, 0);
> + usleep_range(10000, 11000);
> +
> + return 0;
> +
> +error_disable_clocks:
> + clk_disable_unprepare(imx355->clk);
> + return ret;
> +}
> +
> +static DEFINE_RUNTIME_DEV_PM_OPS(imx355_pm_ops, imx355_power_off,
> + imx355_power_on, NULL);
> +
> /* Initialize control handlers */
> static int imx355_init_controls(struct imx355 *imx355)
> {
> @@ -1689,16 +1751,26 @@ static int imx355_probe(struct i2c_client *client)
> "external clock %lu is not supported\n",
> freq);
>
> - /* Initialize subdev */
> - v4l2_i2c_subdev_init(&imx355->sd, client, &imx355_subdev_ops);
> -
> - /* Check module identity */
> - ret = imx355_identify_module(imx355);
> + ret = devm_regulator_bulk_get_const(imx355->dev,
> + ARRAY_SIZE(imx355_supplies),
> + imx355_supplies,
> + &imx355->supplies);
> if (ret) {
> - dev_err(imx355->dev, "failed to find sensor: %d", ret);
> + dev_err_probe(imx355->dev, ret, "could not get regulators");
> goto error_probe;
> }
>
> + imx355->reset_gpio = devm_gpiod_get_optional(imx355->dev, "reset",
> + GPIOD_OUT_HIGH);
> + if (IS_ERR(imx355->reset_gpio)) {
> + ret = dev_err_probe(imx355->dev, PTR_ERR(imx355->reset_gpio),
> + "failed to get gpios");
> + goto error_probe;
> + }
> +
> + /* Initialize subdev */
> + v4l2_i2c_subdev_init(&imx355->sd, client, &imx355_subdev_ops);
> +
> imx355->hwcfg = imx355_get_hwcfg(imx355->dev);
> if (!imx355->hwcfg) {
> dev_err(imx355->dev, "failed to get hwcfg");
> @@ -1706,13 +1778,26 @@ static int imx355_probe(struct i2c_client *client)
> goto error_probe;
> }
>
> + ret = imx355_power_on(imx355->dev);
> + if (ret) {
> + dev_err(imx355->dev, "failed to power on sensor: %d", ret);
> + goto error_probe;
> + }
> +
> + /* Check module identity */
> + ret = imx355_identify_module(imx355);
> + if (ret) {
> + dev_err(imx355->dev, "failed to find sensor: %d", ret);
> + goto error_power_off;
> + }
> +
> /* Set default mode to max resolution */
> imx355->cur_mode = &supported_modes[0];
>
> ret = imx355_init_controls(imx355);
> if (ret) {
> dev_err(imx355->dev, "failed to init controls: %d", ret);
> - goto error_probe;
> + goto error_power_off;
> }
>
> /* Initialize subdev */
> @@ -1752,6 +1837,9 @@ static int imx355_probe(struct i2c_client *client)
> error_handler_free:
> v4l2_ctrl_handler_free(imx355->sd.ctrl_handler);
>
> +error_power_off:
> + imx355_power_off(imx355->dev);
> +
> error_probe:
> mutex_destroy(&imx355->mutex);
>
> @@ -1768,7 +1856,11 @@ static void imx355_remove(struct i2c_client *client)
> v4l2_ctrl_handler_free(sd->ctrl_handler);
>
> pm_runtime_disable(imx355->dev);
> - pm_runtime_set_suspended(imx355->dev);
> +
> + if (!pm_runtime_status_suspended(imx355->dev)) {
> + imx355_power_off(imx355->dev);
> + pm_runtime_set_suspended(imx355->dev);
> + }
>
> mutex_destroy(&imx355->mutex);
> }
> @@ -1779,10 +1871,18 @@ static const struct acpi_device_id imx355_acpi_ids[] __maybe_unused = {
> };
> MODULE_DEVICE_TABLE(acpi, imx355_acpi_ids);
>
> +static const struct of_device_id imx355_match_table[] = {
> + { .compatible = "sony,imx355", },
> + { /* sentinel */ }
> +};
> +MODULE_DEVICE_TABLE(of, imx355_match_table);
> +
> static struct i2c_driver imx355_i2c_driver = {
> .driver = {
> .name = "imx355",
> .acpi_match_table = ACPI_PTR(imx355_acpi_ids),
> + .of_match_table = imx355_match_table,
> + .pm = &imx355_pm_ops,
> },
> .probe = imx355_probe,
> .remove = imx355_remove,
I think reset should be asserted before regulators and power are
switched on. i.e. before you try to switch the chip on, you should
establish that the reset pin is in the state that the timing diagram
calls for.
If we look at imx214 which someone has posted on the internet
https://www.v-visiontech.com/web/userfiles/download/IMX214-0AQH5-C_2.0.0ExcellenceCommsen-281-29_mASEw.pdf
Pages 28 and 29
See timing value T4 - you need to provide power and clock for T4 before
de-asserting reset and then wait for T7 before starting to stream.
We don't have the imx315 spec but likely imx355 has a similar start-up
state machine.
1. Assert reset
2. Power up
3. Start clock
4. t4
5. De-assert reset
6. T6 - wait time to first i2c transaction
7. T7 - wait time to first stream on
You should definitely set the reset to logical on in power_on() as you
don't necessarily know the state of the reset pin each time you power on.
---
bod
^ permalink raw reply [flat|nested] 19+ messages in thread* Re: [PATCH v7 2/5] media: i2c: imx355: Support devicetree and power management
2026-01-20 12:44 ` Bryan O'Donoghue
@ 2026-01-20 14:49 ` Sakari Ailus
2026-01-28 2:53 ` Richard Acayan
0 siblings, 1 reply; 19+ messages in thread
From: Sakari Ailus @ 2026-01-20 14:49 UTC (permalink / raw)
To: Bryan O'Donoghue
Cc: Richard Acayan, Mauro Carvalho Chehab, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Bjorn Andersson, Konrad Dybcio,
Tianshu Qiu, linux-media, devicetree, linux-arm-msm, Robert Mader,
Vladimir Zapolskiy, David Heidelberg, phone-devel
Hi Bryan, others,
On Tue, Jan 20, 2026 at 12:44:24PM +0000, Bryan O'Donoghue wrote:
> I think reset should be asserted before regulators and power are switched
> on. i.e. before you try to switch the chip on, you should establish that the
> reset pin is in the state that the timing diagram calls for.
Indeed.
The xshutdown pin, as it is typically called labelled as "reset" in this
case, functions as both hardware reset and hardware standby mode control.
It should be asserted (i.e. be set to low level) whenever the sensor is
expected to be powered off. Typically deasserting it is the last step in
the sensor's power-up sequence. This applies to nearly all CSI-2 and DVP
(parallel) camera sensors. (There are some exceptions that use explicitly
two GPIOs for similar functions but there are very few of them.)
--
Regards,
Sakari Ailus
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH v7 2/5] media: i2c: imx355: Support devicetree and power management
2026-01-20 14:49 ` Sakari Ailus
@ 2026-01-28 2:53 ` Richard Acayan
2026-01-28 7:59 ` Sakari Ailus
0 siblings, 1 reply; 19+ messages in thread
From: Richard Acayan @ 2026-01-28 2:53 UTC (permalink / raw)
To: Sakari Ailus
Cc: Bryan O'Donoghue, Mauro Carvalho Chehab, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Bjorn Andersson, Konrad Dybcio,
Tianshu Qiu, linux-media, devicetree, linux-arm-msm, Robert Mader,
Vladimir Zapolskiy, David Heidelberg, phone-devel
On Tue, Jan 20, 2026 at 04:49:21PM +0200, Sakari Ailus wrote:
> Hi Bryan, others,
>
> On Tue, Jan 20, 2026 at 12:44:24PM +0000, Bryan O'Donoghue wrote:
> > I think reset should be asserted before regulators and power are switched
> > on. i.e. before you try to switch the chip on, you should establish that the
> > reset pin is in the state that the timing diagram calls for.
>
> Indeed.
I think the discussion is more about whether there should be an assert
in the same function as the de-assert.
> The xshutdown pin, as it is typically called labelled as "reset" in this
> case, functions as both hardware reset and hardware standby mode control.
> It should be asserted (i.e. be set to low level) whenever the sensor is
> expected to be powered off. Typically deasserting it is the last step in
> the sensor's power-up sequence. This applies to nearly all CSI-2 and DVP
> (parallel) camera sensors. (There are some exceptions that use explicitly
> two GPIOs for similar functions but there are very few of them.)
This patch has the reset asserted by the time it gets to
imx355_power_on():
- when coming from runtime PM, the suspend callback asserted it
- when coming from probe, GPIOD_OUT_HIGH asserted it (considering that
active-low also affects the initial output setting)
Should it be asserted again inside the function, or
should the initial `gpiod_set_value_cansleep()` be removed?
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH v7 2/5] media: i2c: imx355: Support devicetree and power management
2026-01-28 2:53 ` Richard Acayan
@ 2026-01-28 7:59 ` Sakari Ailus
2026-01-28 23:23 ` Richard Acayan
0 siblings, 1 reply; 19+ messages in thread
From: Sakari Ailus @ 2026-01-28 7:59 UTC (permalink / raw)
To: Richard Acayan
Cc: Bryan O'Donoghue, Mauro Carvalho Chehab, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Bjorn Andersson, Konrad Dybcio,
Tianshu Qiu, linux-media, devicetree, linux-arm-msm, Robert Mader,
Vladimir Zapolskiy, David Heidelberg, phone-devel
On Tue, Jan 27, 2026 at 09:53:38PM -0500, Richard Acayan wrote:
> On Tue, Jan 20, 2026 at 04:49:21PM +0200, Sakari Ailus wrote:
> > Hi Bryan, others,
> >
> > On Tue, Jan 20, 2026 at 12:44:24PM +0000, Bryan O'Donoghue wrote:
> > > I think reset should be asserted before regulators and power are switched
> > > on. i.e. before you try to switch the chip on, you should establish that the
> > > reset pin is in the state that the timing diagram calls for.
> >
> > Indeed.
>
> I think the discussion is more about whether there should be an assert
> in the same function as the de-assert.
>
> > The xshutdown pin, as it is typically called labelled as "reset" in this
> > case, functions as both hardware reset and hardware standby mode control.
> > It should be asserted (i.e. be set to low level) whenever the sensor is
> > expected to be powered off. Typically deasserting it is the last step in
> > the sensor's power-up sequence. This applies to nearly all CSI-2 and DVP
> > (parallel) camera sensors. (There are some exceptions that use explicitly
> > two GPIOs for similar functions but there are very few of them.)
>
> This patch has the reset asserted by the time it gets to
> imx355_power_on():
>
> - when coming from runtime PM, the suspend callback asserted it
> - when coming from probe, GPIOD_OUT_HIGH asserted it (considering that
> active-low also affects the initial output setting)
>
> Should it be asserted again inside the function, or
> should the initial `gpiod_set_value_cansleep()` be removed?
Please remove it as requested.
--
Sakari Ailus
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH v7 2/5] media: i2c: imx355: Support devicetree and power management
2026-01-28 7:59 ` Sakari Ailus
@ 2026-01-28 23:23 ` Richard Acayan
0 siblings, 0 replies; 19+ messages in thread
From: Richard Acayan @ 2026-01-28 23:23 UTC (permalink / raw)
To: Sakari Ailus
Cc: Bryan O'Donoghue, Mauro Carvalho Chehab, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Bjorn Andersson, Konrad Dybcio,
Tianshu Qiu, linux-media, devicetree, linux-arm-msm, Robert Mader,
Vladimir Zapolskiy, David Heidelberg, phone-devel
On Wed, Jan 28, 2026 at 09:59:20AM +0200, Sakari Ailus wrote:
> On Tue, Jan 27, 2026 at 09:53:38PM -0500, Richard Acayan wrote:
> > On Tue, Jan 20, 2026 at 04:49:21PM +0200, Sakari Ailus wrote:
> > > Hi Bryan, others,
> > >
> > > On Tue, Jan 20, 2026 at 12:44:24PM +0000, Bryan O'Donoghue wrote:
> > > > I think reset should be asserted before regulators and power are switched
> > > > on. i.e. before you try to switch the chip on, you should establish that the
> > > > reset pin is in the state that the timing diagram calls for.
> > >
> > > Indeed.
> >
> > I think the discussion is more about whether there should be an assert
> > in the same function as the de-assert.
> >
> > > The xshutdown pin, as it is typically called labelled as "reset" in this
> > > case, functions as both hardware reset and hardware standby mode control.
> > > It should be asserted (i.e. be set to low level) whenever the sensor is
> > > expected to be powered off. Typically deasserting it is the last step in
> > > the sensor's power-up sequence. This applies to nearly all CSI-2 and DVP
> > > (parallel) camera sensors. (There are some exceptions that use explicitly
> > > two GPIOs for similar functions but there are very few of them.)
> >
> > This patch has the reset asserted by the time it gets to
> > imx355_power_on():
> >
> > - when coming from runtime PM, the suspend callback asserted it
> > - when coming from probe, GPIOD_OUT_HIGH asserted it (considering that
> > active-low also affects the initial output setting)
> >
> > Should it be asserted again inside the function, or
> > should the initial `gpiod_set_value_cansleep()` be removed?
>
> Please remove it as requested.
Ok, I will remove it.
^ permalink raw reply [flat|nested] 19+ messages in thread
* [PATCH v7 3/5] arm64: dts: qcom: sdm670: label the camss ports instead of endpoints
2026-01-17 4:06 [PATCH v7 0/5] media: i2c: IMX355 for the Pixel 3a Richard Acayan
2026-01-17 4:06 ` [PATCH v7 1/5] dt-bindings: media: i2c: Add Sony IMX355 Richard Acayan
2026-01-17 4:06 ` [PATCH v7 2/5] media: i2c: imx355: Support devicetree and power management Richard Acayan
@ 2026-01-17 4:06 ` Richard Acayan
2026-01-17 4:06 ` [PATCH v7 4/5] arm64: dts: qcom: sdm670: add camera mclk pins Richard Acayan
2026-01-17 4:06 ` [PATCH v7 5/5] arm64: dts: qcom: sdm670-google-sargo: add imx355 front camera Richard Acayan
4 siblings, 0 replies; 19+ messages in thread
From: Richard Acayan @ 2026-01-17 4:06 UTC (permalink / raw)
To: Mauro Carvalho Chehab, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Bjorn Andersson, Konrad Dybcio, Sakari Ailus,
Tianshu Qiu, linux-media, devicetree, linux-arm-msm
Cc: Robert Mader, Bryan O'Donoghue, Vladimir Zapolskiy,
David Heidelberg, phone-devel, Richard Acayan
Endpoints cannot be pre-defined since dcf6fb89e6f7 ("media: qcom: camss:
remove a check for unavailable CAMSS endpoint") was applied, probing all
endpoint nodes and requiring them to have a remote. There is no sensible
remote in the SoC devicetree because camera sensors are board-specific.
The ports are meant to be extended by a board devicetree in order to
define fully configured endpoints and connect the ports to camera
sensors. For nodes that are only meaningful if extended, labels are
usually assigned. Label these ports so they can be extended directly.
Reviewed-by: Vladimir Zapolskiy <vladimir.zapolskiy@linaro.org>
Reviewed-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
Signed-off-by: Richard Acayan <mailingradian@gmail.com>
---
arch/arm64/boot/dts/qcom/sdm670.dtsi | 18 +++---------------
1 file changed, 3 insertions(+), 15 deletions(-)
diff --git a/arch/arm64/boot/dts/qcom/sdm670.dtsi b/arch/arm64/boot/dts/qcom/sdm670.dtsi
index b8a8dcbdfbe3..3eb4eaf7b8d7 100644
--- a/arch/arm64/boot/dts/qcom/sdm670.dtsi
+++ b/arch/arm64/boot/dts/qcom/sdm670.dtsi
@@ -1776,28 +1776,16 @@ ports {
#address-cells = <1>;
#size-cells = <0>;
- port@0 {
+ camss_port0: port@0 {
reg = <0>;
-
- camss_endpoint0: endpoint {
- status = "disabled";
- };
};
- port@1 {
+ camss_port1: port@1 {
reg = <1>;
-
- camss_endpoint1: endpoint {
- status = "disabled";
- };
};
- port@2 {
+ camss_port2: port@2 {
reg = <2>;
-
- camss_endpoint2: endpoint {
- status = "disabled";
- };
};
};
};
--
2.52.0
^ permalink raw reply related [flat|nested] 19+ messages in thread* [PATCH v7 4/5] arm64: dts: qcom: sdm670: add camera mclk pins
2026-01-17 4:06 [PATCH v7 0/5] media: i2c: IMX355 for the Pixel 3a Richard Acayan
` (2 preceding siblings ...)
2026-01-17 4:06 ` [PATCH v7 3/5] arm64: dts: qcom: sdm670: label the camss ports instead of endpoints Richard Acayan
@ 2026-01-17 4:06 ` Richard Acayan
2026-01-17 4:06 ` [PATCH v7 5/5] arm64: dts: qcom: sdm670-google-sargo: add imx355 front camera Richard Acayan
4 siblings, 0 replies; 19+ messages in thread
From: Richard Acayan @ 2026-01-17 4:06 UTC (permalink / raw)
To: Mauro Carvalho Chehab, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Bjorn Andersson, Konrad Dybcio, Sakari Ailus,
Tianshu Qiu, linux-media, devicetree, linux-arm-msm
Cc: Robert Mader, Bryan O'Donoghue, Vladimir Zapolskiy,
David Heidelberg, phone-devel, Richard Acayan
The camera subsystem is added for the SoC common devicetree, but the
mclk pins should also be common across the SoC. Add the mclk pins for
the cameras.
Suggested-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
Link: https://lore.kernel.org/r/5135823c-f2e4-4873-9e3a-9d190cac0113@oss.qualcomm.com
Reviewed-by: Vladimir Zapolskiy <vladimir.zapolskiy@linaro.org>
Reviewed-by: Bryan O'Donoghue <bod@kernel.org>
Reviewed-by: David Heidelberg <david@ixit.cz>
Reviewed-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
Signed-off-by: Richard Acayan <mailingradian@gmail.com>
---
arch/arm64/boot/dts/qcom/sdm670.dtsi | 28 ++++++++++++++++++++++++++++
1 file changed, 28 insertions(+)
diff --git a/arch/arm64/boot/dts/qcom/sdm670.dtsi b/arch/arm64/boot/dts/qcom/sdm670.dtsi
index 3eb4eaf7b8d7..f21e60a6a2ef 100644
--- a/arch/arm64/boot/dts/qcom/sdm670.dtsi
+++ b/arch/arm64/boot/dts/qcom/sdm670.dtsi
@@ -1196,6 +1196,34 @@ tlmm: pinctrl@3400000 {
gpio-ranges = <&tlmm 0 0 151>;
wakeup-parent = <&pdc>;
+ cam_mclk0_default: cam-mclk0-default-state {
+ pins = "gpio13";
+ function = "cam_mclk";
+ drive-strength = <2>;
+ bias-disable;
+ };
+
+ cam_mclk1_default: cam-mclk1-default-state {
+ pins = "gpio14";
+ function = "cam_mclk";
+ drive-strength = <2>;
+ bias-disable;
+ };
+
+ cam_mclk2_default: cam-mclk2-default-state {
+ pins = "gpio15";
+ function = "cam_mclk";
+ drive-strength = <2>;
+ bias-disable;
+ };
+
+ cam_mclk3_default: cam-mclk3-default-state {
+ pins = "gpio16";
+ function = "cam_mclk";
+ drive-strength = <2>;
+ bias-disable;
+ };
+
cci0_default: cci0-default-state {
pins = "gpio17", "gpio18";
function = "cci_i2c";
--
2.52.0
^ permalink raw reply related [flat|nested] 19+ messages in thread* [PATCH v7 5/5] arm64: dts: qcom: sdm670-google-sargo: add imx355 front camera
2026-01-17 4:06 [PATCH v7 0/5] media: i2c: IMX355 for the Pixel 3a Richard Acayan
` (3 preceding siblings ...)
2026-01-17 4:06 ` [PATCH v7 4/5] arm64: dts: qcom: sdm670: add camera mclk pins Richard Acayan
@ 2026-01-17 4:06 ` Richard Acayan
2026-01-17 12:07 ` Vladimir Zapolskiy
2026-01-20 11:00 ` Konrad Dybcio
4 siblings, 2 replies; 19+ messages in thread
From: Richard Acayan @ 2026-01-17 4:06 UTC (permalink / raw)
To: Mauro Carvalho Chehab, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Bjorn Andersson, Konrad Dybcio, Sakari Ailus,
Tianshu Qiu, linux-media, devicetree, linux-arm-msm
Cc: Robert Mader, Bryan O'Donoghue, Vladimir Zapolskiy,
David Heidelberg, phone-devel, Richard Acayan
The Sony IMX355 is the front camera on the Pixel 3a, mounted in portrait
mode. It is connected to CSIPHY1 and CCI I2C1, and uses MCLK2. Add
support for it.
Co-developed-by: Robert Mader <robert.mader@collabora.com>
Signed-off-by: Robert Mader <robert.mader@collabora.com>
Signed-off-by: Richard Acayan <mailingradian@gmail.com>
Reviewed-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
---
.../boot/dts/qcom/sdm670-google-sargo.dts | 95 +++++++++++++++++++
1 file changed, 95 insertions(+)
diff --git a/arch/arm64/boot/dts/qcom/sdm670-google-sargo.dts b/arch/arm64/boot/dts/qcom/sdm670-google-sargo.dts
index ed55646ca419..e925cba0381f 100644
--- a/arch/arm64/boot/dts/qcom/sdm670-google-sargo.dts
+++ b/arch/arm64/boot/dts/qcom/sdm670-google-sargo.dts
@@ -172,6 +172,34 @@ vreg_s2b_1p05: vreg-s2b-regulator {
regulator-min-microvolt = <1050000>;
regulator-max-microvolt = <1050000>;
};
+
+ cam_front_ldo: cam-front-ldo-regulator {
+ compatible = "regulator-fixed";
+ regulator-name = "cam_front_ldo";
+ regulator-min-microvolt = <1352000>;
+ regulator-max-microvolt = <1352000>;
+ regulator-enable-ramp-delay = <135>;
+
+ gpios = <&pm660l_gpios 4 GPIO_ACTIVE_HIGH>;
+ enable-active-high;
+
+ pinctrl-0 = <&cam_front_ldo_pin>;
+ pinctrl-names = "default";
+ };
+
+ cam_vio_ldo: cam-vio-ldo-regulator {
+ compatible = "regulator-fixed";
+ regulator-name = "cam_vio_ldo";
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <1800000>;
+ regulator-enable-ramp-delay = <233>;
+
+ gpios = <&pm660_gpios 13 GPIO_ACTIVE_HIGH>;
+ enable-active-high;
+
+ pinctrl-0 = <&cam_vio_pin>;
+ pinctrl-names = "default";
+ };
};
&apps_rsc {
@@ -392,6 +420,59 @@ vreg_bob: bob {
};
};
+&camss {
+ vdda-phy-supply = <&vreg_l1a_1p225>;
+ vdda-pll-supply = <&vreg_s6a_0p87>;
+
+ status = "okay";
+};
+
+&camss_port1 {
+ camss_endpoint1: endpoint {
+ data-lanes = <0 1 2 3>;
+ remote-endpoint = <&cam_front_endpoint>;
+ };
+};
+
+&cci {
+ pinctrl-0 = <&cci1_default>;
+ pinctrl-1 = <&cci1_sleep>;
+ pinctrl-names = "default", "sleep";
+
+ status = "okay";
+};
+
+&cci_i2c1 {
+ camera@1a {
+ compatible = "sony,imx355";
+ reg = <0x1a>;
+
+ clocks = <&camcc CAM_CC_MCLK2_CLK>;
+
+ assigned-clocks = <&camcc CAM_CC_MCLK2_CLK>;
+ assigned-clock-rates = <19200000>;
+
+ reset-gpios = <&tlmm 9 GPIO_ACTIVE_LOW>;
+
+ avdd-supply = <&cam_front_ldo>;
+ dvdd-supply = <&cam_front_ldo>;
+ dovdd-supply = <&cam_vio_ldo>;
+
+ pinctrl-0 = <&cam_mclk2_default>;
+ pinctrl-names = "default";
+
+ rotation = <270>;
+ orientation = <0>;
+
+ port {
+ cam_front_endpoint: endpoint {
+ link-frequencies = /bits/ 64 <360000000>;
+ remote-endpoint = <&camss_endpoint1>;
+ };
+ };
+ };
+};
+
&gcc {
protected-clocks = <GCC_QSPI_CORE_CLK>,
<GCC_QSPI_CORE_CLK_SRC>,
@@ -490,6 +571,14 @@ &pm660_charger {
status = "okay";
};
+&pm660_gpios {
+ cam_vio_pin: cam-vio-state {
+ pins = "gpio13";
+ function = "normal";
+ power-source = <0>;
+ };
+};
+
&pm660_rradc {
status = "okay";
};
@@ -508,6 +597,12 @@ led-0 {
};
&pm660l_gpios {
+ cam_front_ldo_pin: cam-front-state {
+ pins = "gpio4";
+ function = "normal";
+ power-source = <0>;
+ };
+
vol_up_pin: vol-up-state {
pins = "gpio7";
function = "normal";
--
2.52.0
^ permalink raw reply related [flat|nested] 19+ messages in thread* Re: [PATCH v7 5/5] arm64: dts: qcom: sdm670-google-sargo: add imx355 front camera
2026-01-17 4:06 ` [PATCH v7 5/5] arm64: dts: qcom: sdm670-google-sargo: add imx355 front camera Richard Acayan
@ 2026-01-17 12:07 ` Vladimir Zapolskiy
2026-01-20 11:00 ` Konrad Dybcio
1 sibling, 0 replies; 19+ messages in thread
From: Vladimir Zapolskiy @ 2026-01-17 12:07 UTC (permalink / raw)
To: Richard Acayan, Mauro Carvalho Chehab, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Bjorn Andersson, Konrad Dybcio,
Sakari Ailus, Tianshu Qiu, linux-media, devicetree, linux-arm-msm
Cc: Robert Mader, Bryan O'Donoghue, David Heidelberg, phone-devel
On 1/17/26 06:06, Richard Acayan wrote:
> The Sony IMX355 is the front camera on the Pixel 3a, mounted in portrait
> mode. It is connected to CSIPHY1 and CCI I2C1, and uses MCLK2. Add
> support for it.
>
> Co-developed-by: Robert Mader <robert.mader@collabora.com>
> Signed-off-by: Robert Mader <robert.mader@collabora.com>
> Signed-off-by: Richard Acayan <mailingradian@gmail.com>
> Reviewed-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
> ---
> .../boot/dts/qcom/sdm670-google-sargo.dts | 95 +++++++++++++++++++
> 1 file changed, 95 insertions(+)
>
> diff --git a/arch/arm64/boot/dts/qcom/sdm670-google-sargo.dts b/arch/arm64/boot/dts/qcom/sdm670-google-sargo.dts
> index ed55646ca419..e925cba0381f 100644
> --- a/arch/arm64/boot/dts/qcom/sdm670-google-sargo.dts
> +++ b/arch/arm64/boot/dts/qcom/sdm670-google-sargo.dts
> @@ -172,6 +172,34 @@ vreg_s2b_1p05: vreg-s2b-regulator {
> regulator-min-microvolt = <1050000>;
> regulator-max-microvolt = <1050000>;
> };
> +
> + cam_front_ldo: cam-front-ldo-regulator {
> + compatible = "regulator-fixed";
> + regulator-name = "cam_front_ldo";
> + regulator-min-microvolt = <1352000>;
> + regulator-max-microvolt = <1352000>;
> + regulator-enable-ramp-delay = <135>;
> +
> + gpios = <&pm660l_gpios 4 GPIO_ACTIVE_HIGH>;
> + enable-active-high;
> +
> + pinctrl-0 = <&cam_front_ldo_pin>;
> + pinctrl-names = "default";
> + };
> +
> + cam_vio_ldo: cam-vio-ldo-regulator {
> + compatible = "regulator-fixed";
> + regulator-name = "cam_vio_ldo";
> + regulator-min-microvolt = <1800000>;
> + regulator-max-microvolt = <1800000>;
> + regulator-enable-ramp-delay = <233>;
> +
> + gpios = <&pm660_gpios 13 GPIO_ACTIVE_HIGH>;
> + enable-active-high;
> +
> + pinctrl-0 = <&cam_vio_pin>;
> + pinctrl-names = "default";
> + };
> };
>
> &apps_rsc {
> @@ -392,6 +420,59 @@ vreg_bob: bob {
> };
> };
>
> +&camss {
> + vdda-phy-supply = <&vreg_l1a_1p225>;
> + vdda-pll-supply = <&vreg_s6a_0p87>;
> +
> + status = "okay";
> +};
> +
> +&camss_port1 {
> + camss_endpoint1: endpoint {
> + data-lanes = <0 1 2 3>;
> + remote-endpoint = <&cam_front_endpoint>;
> + };
> +};
Looks acceptable.
> +
> +&cci {
> + pinctrl-0 = <&cci1_default>;
> + pinctrl-1 = <&cci1_sleep>;
> + pinctrl-names = "default", "sleep";
> +
> + status = "okay";
> +};
> +
> +&cci_i2c1 {
> + camera@1a {
> + compatible = "sony,imx355";
> + reg = <0x1a>;
> +
> + clocks = <&camcc CAM_CC_MCLK2_CLK>;
> +
> + assigned-clocks = <&camcc CAM_CC_MCLK2_CLK>;
> + assigned-clock-rates = <19200000>;
> +
> + reset-gpios = <&tlmm 9 GPIO_ACTIVE_LOW>;
> +
> + avdd-supply = <&cam_front_ldo>;
> + dvdd-supply = <&cam_front_ldo>;
> + dovdd-supply = <&cam_vio_ldo>;
> +
> + pinctrl-0 = <&cam_mclk2_default>;
> + pinctrl-names = "default";
> +
> + rotation = <270>;
> + orientation = <0>;
> +
> + port {
> + cam_front_endpoint: endpoint {
> + link-frequencies = /bits/ 64 <360000000>;
> + remote-endpoint = <&camss_endpoint1>;
> + };
> + };
> + };
> +};
> +
> &gcc {
> protected-clocks = <GCC_QSPI_CORE_CLK>,
> <GCC_QSPI_CORE_CLK_SRC>,
> @@ -490,6 +571,14 @@ &pm660_charger {
> status = "okay";
> };
>
> +&pm660_gpios {
> + cam_vio_pin: cam-vio-state {
> + pins = "gpio13";
> + function = "normal";
> + power-source = <0>;
> + };
> +};
> +
> &pm660_rradc {
> status = "okay";
> };
> @@ -508,6 +597,12 @@ led-0 {
> };
>
> &pm660l_gpios {
> + cam_front_ldo_pin: cam-front-state {
> + pins = "gpio4";
> + function = "normal";
> + power-source = <0>;
> + };
> +
> vol_up_pin: vol-up-state {
> pins = "gpio7";
> function = "normal";
Reviewed-by: Vladimir Zapolskiy <vladimir.zapolskiy@linaro.org>
--
Best wishes,
Vladimir
^ permalink raw reply [flat|nested] 19+ messages in thread* Re: [PATCH v7 5/5] arm64: dts: qcom: sdm670-google-sargo: add imx355 front camera
2026-01-17 4:06 ` [PATCH v7 5/5] arm64: dts: qcom: sdm670-google-sargo: add imx355 front camera Richard Acayan
2026-01-17 12:07 ` Vladimir Zapolskiy
@ 2026-01-20 11:00 ` Konrad Dybcio
1 sibling, 0 replies; 19+ messages in thread
From: Konrad Dybcio @ 2026-01-20 11:00 UTC (permalink / raw)
To: Richard Acayan, Mauro Carvalho Chehab, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Bjorn Andersson, Konrad Dybcio,
Sakari Ailus, Tianshu Qiu, linux-media, devicetree, linux-arm-msm
Cc: Robert Mader, Bryan O'Donoghue, Vladimir Zapolskiy,
David Heidelberg, phone-devel
On 1/17/26 5:06 AM, Richard Acayan wrote:
> The Sony IMX355 is the front camera on the Pixel 3a, mounted in portrait
> mode. It is connected to CSIPHY1 and CCI I2C1, and uses MCLK2. Add
> support for it.
>
> Co-developed-by: Robert Mader <robert.mader@collabora.com>
> Signed-off-by: Robert Mader <robert.mader@collabora.com>
> Signed-off-by: Richard Acayan <mailingradian@gmail.com>
> Reviewed-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
> ---
[...]
> +&cci_i2c1 {
> + camera@1a {
> + compatible = "sony,imx355";
> + reg = <0x1a>;
> +
> + clocks = <&camcc CAM_CC_MCLK2_CLK>;
> +
> + assigned-clocks = <&camcc CAM_CC_MCLK2_CLK>;
> + assigned-clock-rates = <19200000>;
> +
> + reset-gpios = <&tlmm 9 GPIO_ACTIVE_LOW>;
> +
> + avdd-supply = <&cam_front_ldo>;
> + dvdd-supply = <&cam_front_ldo>;
> + dovdd-supply = <&cam_vio_ldo>;
> +
> + pinctrl-0 = <&cam_mclk2_default>;
Ideally the reset GPIO could have its config defined too
Reviewed-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
Konrad
^ permalink raw reply [flat|nested] 19+ messages in thread