2020-04-08 11:09:15

by Robert Foss

[permalink] [raw]
Subject: [PATCH v4 0/3] media: ov8856: Add devicetree support

This adds devicetree support to the ov8856 driver.
In order to to aid debugging and enable future sensor
modes to be supported, module revision detection is also added.


Dongchun Zhu (1):
media: dt-bindings: ov8856: Document YAML bindings

Robert Foss (2):
media: ov8856: Add devicetree support
media: ov8856: Implement sensor module revision identification

.../devicetree/bindings/media/i2c/ov8856.yaml | 143 +++++++++++++
MAINTAINERS | 1 +
drivers/media/i2c/ov8856.c | 196 ++++++++++++++++--
3 files changed, 325 insertions(+), 15 deletions(-)
create mode 100644 Documentation/devicetree/bindings/media/i2c/ov8856.yaml

--
2.25.1


2020-04-08 11:09:21

by Robert Foss

[permalink] [raw]
Subject: [PATCH v7 1/3] media: dt-bindings: ov8856: Document YAML bindings

From: Dongchun Zhu <[email protected]>

This patch adds documentation of device tree in YAML schema for the
OV8856 CMOS image sensor.

Signed-off-by: Dongchun Zhu <[email protected]>
Signed-off-by: Robert Foss <[email protected]>
---

- Changes since v6:
* Marco: remove qcom specifics from DT example

- Changes since v5:
* Add assigned-clocks and assigned-clock-rates
* robher: dt-schema errors

- Changes since v4:
* Fabio: Change reset-gpio to GPIO_ACTIVE_LOW, explain in description
* Add clock-lanes property to example
* robher: Fix syntax error in devicetree example

- Changes since v3:
* robher: Fix syntax error
* robher: Removed maxItems
* Fixes yaml 'make dt-binding-check' errors

- Changes since v2:
Fixes comments from from Andy, Tomasz, Sakari, Rob.
* Convert text documentation to YAML schema.

- Changes since v1:
Fixes comments from Sakari, Tomasz
* Add clock-frequency and link-frequencies in DT

.../devicetree/bindings/media/i2c/ov8856.yaml | 143 ++++++++++++++++++
MAINTAINERS | 1 +
2 files changed, 144 insertions(+)
create mode 100644 Documentation/devicetree/bindings/media/i2c/ov8856.yaml

diff --git a/Documentation/devicetree/bindings/media/i2c/ov8856.yaml b/Documentation/devicetree/bindings/media/i2c/ov8856.yaml
new file mode 100644
index 000000000000..96bef5403d7e
--- /dev/null
+++ b/Documentation/devicetree/bindings/media/i2c/ov8856.yaml
@@ -0,0 +1,143 @@
+# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
+# Copyright (c) 2019 MediaTek Inc.
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/media/i2c/ov8856.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Omnivision OV8856 CMOS Sensor Device Tree Bindings
+
+maintainers:
+ - Ben Kao <[email protected]>
+ - Dongchun Zhu <[email protected]>
+
+description: |-
+ The Omnivision OV8856 is a high performance, 1/4-inch, 8 megapixel, CMOS
+ image sensor that delivers 3264x2448 at 30fps. It provides full-frame,
+ sub-sampled, and windowed 10-bit MIPI images in various formats via the
+ Serial Camera Control Bus (SCCB) interface. This chip is programmable
+ through I2C and two-wire SCCB. The sensor output is available via CSI-2
+ serial data output (up to 4-lane).
+
+properties:
+ compatible:
+ const: ovti,ov8856
+
+ reg:
+ maxItems: 1
+
+ clocks:
+ maxItems: 1
+
+ clock-names:
+ description:
+ Input clock for the sensor.
+ items:
+ - const: xvclk
+
+ assigned-clocks:
+ description:
+ Input clock for the sensor.
+
+ assigned-clock-rates:
+ description:
+ Frequency of the xvclk clock in Hertz.
+
+ dovdd-supply:
+ description:
+ Definition of the regulator used as interface power supply.
+
+ avdd-supply:
+ description:
+ Definition of the regulator used as analog power supply.
+
+ dvdd-supply:
+ description:
+ Definition of the regulator used as digital power supply.
+
+ reset-gpios:
+ description:
+ The phandle and specifier for the GPIO that controls sensor reset.
+ This corresponds to the hardware pin XSHUTDOWN which is physically
+ active low.
+
+ port:
+ type: object
+ additionalProperties: false
+ description:
+ A node containing input and output port nodes with endpoint definitions
+ as documented in
+ Documentation/devicetree/bindings/media/video-interfaces.txt
+
+ properties:
+ endpoint:
+ type: object
+
+ properties:
+ clock-lanes:
+ maxItems: 1
+
+ data-lanes:
+ maxItems: 1
+
+ remote-endpoint: true
+
+ required:
+ - clock-lanes
+ - data-lanes
+ - remote-endpoint
+
+ required:
+ - endpoint
+
+required:
+ - compatible
+ - reg
+ - clocks
+ - clock-names
+ - assigned-clocks
+ - assigned-clock-rates
+ - dovdd-supply
+ - avdd-supply
+ - dvdd-supply
+ - reset-gpios
+ - port
+
+additionalProperties: false
+
+examples:
+ - |
+ #include <dt-bindings/gpio/gpio.h>
+
+ i2c {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ ov8856: camera@10 {
+ compatible = "ovti,ov8856";
+ reg = <0x10>;
+
+ reset-gpios = <&pio 111 GPIO_ACTIVE_LOW>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&clk_24m_cam>;
+
+ clocks = <&cam_osc>;
+ clock-names = "xvclk";
+ assigned-clocks = <&cam_osc>;
+ assigned-clock-rates = <19200000>;
+
+ avdd-supply = <&mt6358_vcama2_reg>;
+ dvdd-supply = <&mt6358_vcamd_reg>;
+ dovdd-supply = <&mt6358_vcamio_reg>;
+
+ port {
+ wcam_out: endpoint {
+ remote-endpoint = <&mipi_in_wcam>;
+ clock-lanes = <0>;
+ data-lanes = <1 2 3 4>;
+ link-frequencies = /bits/ 64 <360000000 180000000>;
+ };
+ };
+ };
+ };
+...
\ No newline at end of file
diff --git a/MAINTAINERS b/MAINTAINERS
index 534a8dc4f84a..3f35c6e9700a 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -12465,6 +12465,7 @@ L: [email protected]
T: git git://linuxtv.org/media_tree.git
S: Maintained
F: drivers/media/i2c/ov8856.c
+F: Documentation/devicetree/bindings/media/i2c/ov8856.yaml

OMNIVISION OV9650 SENSOR DRIVER
M: Sakari Ailus <[email protected]>
--
2.25.1

2020-04-08 11:09:26

by Robert Foss

[permalink] [raw]
Subject: [PATCH v4 2/3] media: ov8856: Add devicetree support

Add match table, enable ov8856_probe() to support
both ACPI and DT modes.

ACPI and DT modes are primarily distinguished from
each other by relying on devm_XXX_get_optional()
will return NULL instead of a reference for the
desired managed resource.

Signed-off-by: Robert Foss <[email protected]>
---

- Changes since v3:
* Remove redundant {}-brackets
* Compare xvclk_rate to 5% tolerance
* Andy: Use dev_fwnode()
* Andy: Use %pe instead of %ld + PTR_ERR()
* Andy: Invert reset_gpio logic
* Andy: Remove dev_dbg() from failing reset_gpio setup
* Andy: Use dev_err for logging for failures
* Andy: Remove dev_warn from EDEFER/regulator error path
* Andy & Sakari: Replaced GPIOD_OUT_XXX with 0/1
* Maxime & Sakari: Verify clock frequency from DT
* Sakari: Verify the 'xvclk_rate' is set correctly for ACPI/DT devices
* Sakari: Remove duplicate ov8856->dev assignment

- Changes since v2:
* Added "struct device *dev" member to struct ov8856
* Andy: Switch to optional version of devm_gpiod_get
* Andy: Switch to optional version of devm_clk_get
* Fabio: Add reset sleep period
* Sakari: Unify defines for 19.2Mhz
* Sakari: Remove 24Mhz clock, since it isn't needed for supported modes
* Sakari: Replace dev_info() with dev_dbg()
* Sakari: Switch induction variable type to unsigned
* Sakari: Don't wait for reset_gpio when in ACPI mode
* Sakari: Pull reset GPIO high on power on failure
* Sakari: Add power on/off to resume/suspend
* Sakari: Fix indentation
* Sakari: Power off during ov8856_remove()
* Sakari: Don't sleep during power-on in ACPI mode
* Sakari: Switch to getting xvclk from clk_get_rate

- Changes since v1:
* Andy & Sakari: Make XVCLK optional since to not break ACPI
* Fabio: Change n_shutdown_gpio name to reset_gpio
* Fabio: Invert reset_gpio due to GPIO_ACTIVE_HIGH -> GPIO_ACTIVE_LOW change
* Fabio: Remove empty line
* Fabio: Remove real error from devm_gpiod_get() failures
* Sakari: ARRAY_SIZE() directly instead of through OV8856_NUM_SUPPLIES
* Sakari: Use XVCLK rate as provided by DT

drivers/media/i2c/ov8856.c | 143 +++++++++++++++++++++++++++++++++----
1 file changed, 128 insertions(+), 15 deletions(-)

diff --git a/drivers/media/i2c/ov8856.c b/drivers/media/i2c/ov8856.c
index 8655842af275..473d3245344a 100644
--- a/drivers/media/i2c/ov8856.c
+++ b/drivers/media/i2c/ov8856.c
@@ -3,10 +3,13 @@

#include <asm/unaligned.h>
#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/pm_runtime.h>
+#include <linux/regulator/consumer.h>
#include <media/v4l2-ctrls.h>
#include <media/v4l2-device.h>
#include <media/v4l2-fwnode.h>
@@ -18,7 +21,7 @@
#define OV8856_LINK_FREQ_360MHZ 360000000ULL
#define OV8856_LINK_FREQ_180MHZ 180000000ULL
#define OV8856_SCLK 144000000ULL
-#define OV8856_MCLK 19200000
+#define OV8856_XVCLK_19_2 19200000
#define OV8856_DATA_LANES 4
#define OV8856_RGB_DEPTH 10

@@ -64,6 +67,12 @@

#define to_ov8856(_sd) container_of(_sd, struct ov8856, sd)

+static const char * const ov8856_supply_names[] = {
+ "dovdd", /* Digital I/O power */
+ "avdd", /* Analog power */
+ "dvdd", /* Digital core power */
+};
+
enum {
OV8856_LINK_FREQ_720MBPS,
OV8856_LINK_FREQ_360MBPS,
@@ -566,6 +575,11 @@ struct ov8856 {
struct media_pad pad;
struct v4l2_ctrl_handler ctrl_handler;

+ struct device *dev;
+ struct clk *xvclk;
+ struct gpio_desc *reset_gpio;
+ struct regulator_bulk_data supplies[ARRAY_SIZE(ov8856_supply_names)];
+
/* V4L2 Controls */
struct v4l2_ctrl *link_freq;
struct v4l2_ctrl *pixel_rate;
@@ -908,6 +922,52 @@ static int ov8856_set_stream(struct v4l2_subdev *sd, int enable)
return ret;
}

+static int __ov8856_power_on(struct ov8856 *ov8856)
+{
+ struct i2c_client *client = v4l2_get_subdevdata(&ov8856->sd);
+ int ret;
+
+ ret = clk_prepare_enable(ov8856->xvclk);
+ if (ret < 0) {
+ dev_err(&client->dev, "failed to enable xvclk\n");
+ return ret;
+ }
+
+ if (is_acpi_node(dev_fwnode(ov8856->dev)))
+ return 0;
+
+ if (ov8856->reset_gpio) {
+ gpiod_set_value_cansleep(ov8856->reset_gpio, 1);
+ usleep_range(1000, 2000);
+ }
+
+ ret = regulator_bulk_enable(ARRAY_SIZE(ov8856_supply_names),
+ ov8856->supplies);
+ if (ret < 0) {
+ dev_err(&client->dev, "failed to enable regulators\n");
+ goto disable_clk;
+ }
+
+ gpiod_set_value_cansleep(ov8856->reset_gpio, 0);
+ usleep_range(1500, 1800);
+
+ return 0;
+
+disable_clk:
+ gpiod_set_value_cansleep(ov8856->reset_gpio, 1);
+ clk_disable_unprepare(ov8856->xvclk);
+
+ return ret;
+}
+
+static void __ov8856_power_off(struct ov8856 *ov8856)
+{
+ gpiod_set_value_cansleep(ov8856->reset_gpio, 1);
+ regulator_bulk_disable(ARRAY_SIZE(ov8856_supply_names),
+ ov8856->supplies);
+ clk_disable_unprepare(ov8856->xvclk);
+}
+
static int __maybe_unused ov8856_suspend(struct device *dev)
{
struct i2c_client *client = to_i2c_client(dev);
@@ -918,6 +978,7 @@ static int __maybe_unused ov8856_suspend(struct device *dev)
if (ov8856->streaming)
ov8856_stop_streaming(ov8856);

+ __ov8856_power_off(ov8856);
mutex_unlock(&ov8856->mutex);

return 0;
@@ -931,6 +992,8 @@ static int __maybe_unused ov8856_resume(struct device *dev)
int ret;

mutex_lock(&ov8856->mutex);
+
+ __ov8856_power_on(ov8856);
if (ov8856->streaming) {
ret = ov8856_start_streaming(ov8856);
if (ret) {
@@ -1092,29 +1155,58 @@ static int ov8856_identify_module(struct ov8856 *ov8856)
return 0;
}

-static int ov8856_check_hwcfg(struct device *dev)
+static int ov8856_get_hwcfg(struct ov8856 *ov8856)
{
+ struct device *dev = ov8856->dev;
struct fwnode_handle *ep;
struct fwnode_handle *fwnode = dev_fwnode(dev);
struct v4l2_fwnode_endpoint bus_cfg = {
.bus_type = V4L2_MBUS_CSI2_DPHY
};
- u32 mclk;
+ u32 xvclk_rate;
int ret;
unsigned int i, j;

if (!fwnode)
return -ENXIO;

- ret = fwnode_property_read_u32(fwnode, "clock-frequency", &mclk);
- if (ret)
- return ret;
+ if (is_acpi_node(fwnode)) {
+ ret = fwnode_property_read_u32(fwnode, "clock-frequency",
+ &xvclk_rate);
+ if (ret)
+ return ret;
+ } else {
+ ov8856->xvclk = devm_clk_get(dev, "xvclk");
+ if (IS_ERR(ov8856->xvclk)) {
+ dev_err(dev, "could not get xvclk clock (%pe)\n",
+ ov8856->xvclk);
+ return PTR_ERR(ov8856->xvclk);
+ }
+
+ xvclk_rate = clk_get_rate(ov8856->xvclk);
+ }

- if (mclk != OV8856_MCLK) {
- dev_err(dev, "external clock %d is not supported", mclk);
+ /* external clock must be 19.2MHz, allow 5% tolerance */
+ if (xvclk_rate < OV8856_XVCLK_19_2 * 0.95 ||
+ xvclk_rate > OV8856_XVCLK_19_2 * 1.05) {
+ dev_err(dev, "external clock %d is not supported", xvclk_rate);
return -EINVAL;
}

+
+ ov8856->reset_gpio = devm_gpiod_get_optional(dev, "reset",
+ GPIOD_OUT_LOW);
+ if (IS_ERR(ov8856->reset_gpio))
+ return PTR_ERR(ov8856->reset_gpio);
+
+ for (i = 0; i < ARRAY_SIZE(ov8856_supply_names); i++)
+ ov8856->supplies[i].supply = ov8856_supply_names[i];
+
+ ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(ov8856_supply_names),
+ ov8856->supplies);
+ if (ret)
+ return ret;
+
ep = fwnode_graph_get_next_endpoint(fwnode, NULL);
if (!ep)
return -ENXIO;
@@ -1169,6 +1261,8 @@ static int ov8856_remove(struct i2c_client *client)
pm_runtime_disable(&client->dev);
mutex_destroy(&ov8856->mutex);

+ __ov8856_power_off(ov8856);
+
return 0;
}

@@ -1177,22 +1271,31 @@ static int ov8856_probe(struct i2c_client *client)
struct ov8856 *ov8856;
int ret;

- ret = ov8856_check_hwcfg(&client->dev);
+ ov8856 = devm_kzalloc(&client->dev, sizeof(*ov8856), GFP_KERNEL);
+ if (!ov8856)
+ return -ENOMEM;
+
+ ov8856->dev = &client->dev;
+
+ ret = ov8856_get_hwcfg(ov8856);
if (ret) {
- dev_err(&client->dev, "failed to check HW configuration: %d",
+ dev_err(&client->dev, "failed to get HW configuration: %d",
ret);
return ret;
}

- ov8856 = devm_kzalloc(&client->dev, sizeof(*ov8856), GFP_KERNEL);
- if (!ov8856)
- return -ENOMEM;
-
v4l2_i2c_subdev_init(&ov8856->sd, client, &ov8856_subdev_ops);
+
+ ret = __ov8856_power_on(ov8856);
+ if (ret) {
+ dev_err(&client->dev, "failed to power on\n");
+ return ret;
+ }
+
ret = ov8856_identify_module(ov8856);
if (ret) {
dev_err(&client->dev, "failed to find sensor: %d", ret);
- return ret;
+ goto probe_power_off;
}

mutex_init(&ov8856->mutex);
@@ -1238,6 +1341,9 @@ static int ov8856_probe(struct i2c_client *client)
v4l2_ctrl_handler_free(ov8856->sd.ctrl_handler);
mutex_destroy(&ov8856->mutex);

+probe_power_off:
+ __ov8856_power_off(ov8856);
+
return ret;
}

@@ -1254,11 +1360,18 @@ static const struct acpi_device_id ov8856_acpi_ids[] = {
MODULE_DEVICE_TABLE(acpi, ov8856_acpi_ids);
#endif

+static const struct of_device_id ov8856_of_match[] = {
+ { .compatible = "ovti,ov8856" },
+ { /* sentinel */ }
+};
+MODULE_DEVICE_TABLE(of, ov8856_of_match);
+
static struct i2c_driver ov8856_i2c_driver = {
.driver = {
.name = "ov8856",
.pm = &ov8856_pm_ops,
.acpi_match_table = ACPI_PTR(ov8856_acpi_ids),
+ .of_match_table = ov8856_of_match,
},
.probe_new = ov8856_probe,
.remove = ov8856_remove,
--
2.25.1

2020-04-08 12:01:05

by Robert Foss

[permalink] [raw]
Subject: [PATCH v4 3/3] media: ov8856: Implement sensor module revision identification

Query the sensor for its module revision, and compare it
to known revisions.
Currently only the '1B' revision has been added.

Signed-off-by: Robert Foss <[email protected]>
---

- Changes since v3:
* Actually add module revision 2A

- Changes since v2:
* Add module revision 2A
* Sakari: Remove ov8856_check_revision()
* Sakari: Stop EEPROM streaming mode

drivers/media/i2c/ov8856.c | 53 ++++++++++++++++++++++++++++++++++++++
1 file changed, 53 insertions(+)

diff --git a/drivers/media/i2c/ov8856.c b/drivers/media/i2c/ov8856.c
index 473d3245344a..de0b484b85d0 100644
--- a/drivers/media/i2c/ov8856.c
+++ b/drivers/media/i2c/ov8856.c
@@ -32,6 +32,19 @@
#define OV8856_MODE_STANDBY 0x00
#define OV8856_MODE_STREAMING 0x01

+/* module revisions */
+#define OV8856_2A_MODULE 0x01
+#define OV8856_1B_MODULE 0x02
+
+/* the OTP read-out buffer is at 0x7000 and 0xf is the offset
+ * of the byte in the OTP that means the module revision
+ */
+#define OV8856_MODULE_REVISION 0x700f
+#define OV8856_OTP_MODE_CTRL 0x3d84
+#define OV8856_OTP_LOAD_CTRL 0x3d81
+#define OV8856_OTP_MODE_AUTO 0x00
+#define OV8856_OTP_LOAD_CTRL_ENABLE BIT(0)
+
/* vertical-timings from sensor */
#define OV8856_REG_VTS 0x380e
#define OV8856_VTS_MAX 0x7fff
@@ -1152,6 +1165,46 @@ static int ov8856_identify_module(struct ov8856 *ov8856)
return -ENXIO;
}

+ ret = ov8856_write_reg(ov8856, OV8856_REG_MODE_SELECT,
+ OV8856_REG_VALUE_08BIT, OV8856_MODE_STREAMING);
+ if (ret)
+ return ret;
+
+ ret = ov8856_write_reg(ov8856, OV8856_OTP_MODE_CTRL,
+ OV8856_REG_VALUE_08BIT, OV8856_OTP_MODE_AUTO);
+ if (ret) {
+ dev_err(&client->dev, "failed to set otp mode");
+ return ret;
+ }
+
+ ret = ov8856_write_reg(ov8856, OV8856_OTP_LOAD_CTRL,
+ OV8856_REG_VALUE_08BIT,
+ OV8856_OTP_LOAD_CTRL_ENABLE);
+ if (ret) {
+ dev_err(&client->dev, "failed to enable load control");
+ return ret;
+ }
+
+ ret = ov8856_read_reg(ov8856, OV8856_MODULE_REVISION,
+ OV8856_REG_VALUE_08BIT, &val);
+ if (ret) {
+ dev_err(&client->dev, "failed to read module revision");
+ return ret;
+ }
+
+ dev_info(&client->dev, "OV8856 revision %x (%s) at address 0x%02x\n",
+ val,
+ val == OV8856_2A_MODULE ? "2A" :
+ val == OV8856_1B_MODULE ? "1B" : "unknown revision",
+ client->addr);
+
+ ret = ov8856_write_reg(ov8856, OV8856_REG_MODE_SELECT,
+ OV8856_REG_VALUE_08BIT, OV8856_MODE_STANDBY);
+ if (ret) {
+ dev_err(&client->dev, "failed to exit streaming mode");
+ return ret;
+ }
+
return 0;
}

--
2.25.1

2020-04-16 00:19:57

by Rob Herring (Arm)

[permalink] [raw]
Subject: Re: [PATCH v7 1/3] media: dt-bindings: ov8856: Document YAML bindings

On Wed, Apr 08, 2020 at 01:08:14PM +0200, Robert Foss wrote:
> From: Dongchun Zhu <[email protected]>
>
> This patch adds documentation of device tree in YAML schema for the
> OV8856 CMOS image sensor.
>
> Signed-off-by: Dongchun Zhu <[email protected]>
> Signed-off-by: Robert Foss <[email protected]>
> ---
>
> - Changes since v6:
> * Marco: remove qcom specifics from DT example
>
> - Changes since v5:
> * Add assigned-clocks and assigned-clock-rates
> * robher: dt-schema errors
>
> - Changes since v4:
> * Fabio: Change reset-gpio to GPIO_ACTIVE_LOW, explain in description
> * Add clock-lanes property to example
> * robher: Fix syntax error in devicetree example
>
> - Changes since v3:
> * robher: Fix syntax error
> * robher: Removed maxItems
> * Fixes yaml 'make dt-binding-check' errors
>
> - Changes since v2:
> Fixes comments from from Andy, Tomasz, Sakari, Rob.
> * Convert text documentation to YAML schema.
>
> - Changes since v1:
> Fixes comments from Sakari, Tomasz
> * Add clock-frequency and link-frequencies in DT
>
> .../devicetree/bindings/media/i2c/ov8856.yaml | 143 ++++++++++++++++++
> MAINTAINERS | 1 +
> 2 files changed, 144 insertions(+)
> create mode 100644 Documentation/devicetree/bindings/media/i2c/ov8856.yaml
>
> diff --git a/Documentation/devicetree/bindings/media/i2c/ov8856.yaml b/Documentation/devicetree/bindings/media/i2c/ov8856.yaml
> new file mode 100644
> index 000000000000..96bef5403d7e
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/media/i2c/ov8856.yaml
> @@ -0,0 +1,143 @@
> +# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
> +# Copyright (c) 2019 MediaTek Inc.
> +%YAML 1.2
> +---
> +$id: http://devicetree.org/schemas/media/i2c/ov8856.yaml#
> +$schema: http://devicetree.org/meta-schemas/core.yaml#
> +
> +title: Omnivision OV8856 CMOS Sensor Device Tree Bindings
> +
> +maintainers:
> + - Ben Kao <[email protected]>
> + - Dongchun Zhu <[email protected]>
> +
> +description: |-
> + The Omnivision OV8856 is a high performance, 1/4-inch, 8 megapixel, CMOS
> + image sensor that delivers 3264x2448 at 30fps. It provides full-frame,
> + sub-sampled, and windowed 10-bit MIPI images in various formats via the
> + Serial Camera Control Bus (SCCB) interface. This chip is programmable
> + through I2C and two-wire SCCB. The sensor output is available via CSI-2
> + serial data output (up to 4-lane).
> +
> +properties:
> + compatible:
> + const: ovti,ov8856
> +
> + reg:
> + maxItems: 1
> +
> + clocks:
> + maxItems: 1
> +
> + clock-names:
> + description:
> + Input clock for the sensor.
> + items:
> + - const: xvclk
> +
> + assigned-clocks:
> + description:
> + Input clock for the sensor.
> +
> + assigned-clock-rates:
> + description:
> + Frequency of the xvclk clock in Hertz.

These 2 should have a 'maxItems: 1'

> +
> + dovdd-supply:
> + description:
> + Definition of the regulator used as interface power supply.
> +
> + avdd-supply:
> + description:
> + Definition of the regulator used as analog power supply.
> +
> + dvdd-supply:
> + description:
> + Definition of the regulator used as digital power supply.
> +
> + reset-gpios:
> + description:
> + The phandle and specifier for the GPIO that controls sensor reset.
> + This corresponds to the hardware pin XSHUTDOWN which is physically
> + active low.
> +
> + port:
> + type: object
> + additionalProperties: false
> + description:
> + A node containing input and output port nodes with endpoint definitions

Only an output, right?

> + as documented in
> + Documentation/devicetree/bindings/media/video-interfaces.txt
> +
> + properties:
> + endpoint:
> + type: object
> +
> + properties:
> + clock-lanes:
> + maxItems: 1
> +
> + data-lanes:
> + maxItems: 1
> +
> + remote-endpoint: true
> +
> + required:
> + - clock-lanes
> + - data-lanes
> + - remote-endpoint
> +
> + required:
> + - endpoint
> +
> +required:
> + - compatible
> + - reg
> + - clocks
> + - clock-names
> + - assigned-clocks
> + - assigned-clock-rates
> + - dovdd-supply
> + - avdd-supply
> + - dvdd-supply
> + - reset-gpios
> + - port
> +
> +additionalProperties: false
> +
> +examples:
> + - |
> + #include <dt-bindings/gpio/gpio.h>
> +
> + i2c {
> + #address-cells = <1>;
> + #size-cells = <0>;
> +
> + ov8856: camera@10 {
> + compatible = "ovti,ov8856";
> + reg = <0x10>;
> +
> + reset-gpios = <&pio 111 GPIO_ACTIVE_LOW>;
> + pinctrl-names = "default";
> + pinctrl-0 = <&clk_24m_cam>;
> +
> + clocks = <&cam_osc>;
> + clock-names = "xvclk";
> + assigned-clocks = <&cam_osc>;
> + assigned-clock-rates = <19200000>;
> +
> + avdd-supply = <&mt6358_vcama2_reg>;
> + dvdd-supply = <&mt6358_vcamd_reg>;
> + dovdd-supply = <&mt6358_vcamio_reg>;
> +
> + port {
> + wcam_out: endpoint {
> + remote-endpoint = <&mipi_in_wcam>;
> + clock-lanes = <0>;
> + data-lanes = <1 2 3 4>;
> + link-frequencies = /bits/ 64 <360000000 180000000>;
> + };
> + };
> + };
> + };
> +...
> \ No newline at end of file

^^^

> diff --git a/MAINTAINERS b/MAINTAINERS
> index 534a8dc4f84a..3f35c6e9700a 100644
> --- a/MAINTAINERS
> +++ b/MAINTAINERS
> @@ -12465,6 +12465,7 @@ L: [email protected]
> T: git git://linuxtv.org/media_tree.git
> S: Maintained
> F: drivers/media/i2c/ov8856.c
> +F: Documentation/devicetree/bindings/media/i2c/ov8856.yaml
>
> OMNIVISION OV9650 SENSOR DRIVER
> M: Sakari Ailus <[email protected]>
> --
> 2.25.1
>

2020-04-16 00:22:11

by Marco Felsch

[permalink] [raw]
Subject: Re: [PATCH v7 1/3] media: dt-bindings: ov8856: Document YAML bindings

On 20-04-15 11:07, Rob Herring wrote:
> On Wed, Apr 08, 2020 at 01:08:14PM +0200, Robert Foss wrote:
> > From: Dongchun Zhu <[email protected]>
> >
> > This patch adds documentation of device tree in YAML schema for the
> > OV8856 CMOS image sensor.
> >
> > Signed-off-by: Dongchun Zhu <[email protected]>
> > Signed-off-by: Robert Foss <[email protected]>
> > ---
> >
> > - Changes since v6:
> > * Marco: remove qcom specifics from DT example
> >
> > - Changes since v5:
> > * Add assigned-clocks and assigned-clock-rates
> > * robher: dt-schema errors
> >
> > - Changes since v4:
> > * Fabio: Change reset-gpio to GPIO_ACTIVE_LOW, explain in description
> > * Add clock-lanes property to example
> > * robher: Fix syntax error in devicetree example
> >
> > - Changes since v3:
> > * robher: Fix syntax error
> > * robher: Removed maxItems
> > * Fixes yaml 'make dt-binding-check' errors
> >
> > - Changes since v2:
> > Fixes comments from from Andy, Tomasz, Sakari, Rob.
> > * Convert text documentation to YAML schema.
> >
> > - Changes since v1:
> > Fixes comments from Sakari, Tomasz
> > * Add clock-frequency and link-frequencies in DT
> >
> > .../devicetree/bindings/media/i2c/ov8856.yaml | 143 ++++++++++++++++++
> > MAINTAINERS | 1 +
> > 2 files changed, 144 insertions(+)
> > create mode 100644 Documentation/devicetree/bindings/media/i2c/ov8856.yaml
> >
> > diff --git a/Documentation/devicetree/bindings/media/i2c/ov8856.yaml b/Documentation/devicetree/bindings/media/i2c/ov8856.yaml
> > new file mode 100644
> > index 000000000000..96bef5403d7e
> > --- /dev/null
> > +++ b/Documentation/devicetree/bindings/media/i2c/ov8856.yaml
> > @@ -0,0 +1,143 @@
> > +# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
> > +# Copyright (c) 2019 MediaTek Inc.
> > +%YAML 1.2
> > +---
> > +$id: http://devicetree.org/schemas/media/i2c/ov8856.yaml#
> > +$schema: http://devicetree.org/meta-schemas/core.yaml#
> > +
> > +title: Omnivision OV8856 CMOS Sensor Device Tree Bindings
> > +
> > +maintainers:
> > + - Ben Kao <[email protected]>
> > + - Dongchun Zhu <[email protected]>
> > +
> > +description: |-
> > + The Omnivision OV8856 is a high performance, 1/4-inch, 8 megapixel, CMOS
> > + image sensor that delivers 3264x2448 at 30fps. It provides full-frame,
> > + sub-sampled, and windowed 10-bit MIPI images in various formats via the
> > + Serial Camera Control Bus (SCCB) interface. This chip is programmable
> > + through I2C and two-wire SCCB. The sensor output is available via CSI-2
> > + serial data output (up to 4-lane).
> > +
> > +properties:
> > + compatible:
> > + const: ovti,ov8856
> > +
> > + reg:
> > + maxItems: 1
> > +
> > + clocks:
> > + maxItems: 1
> > +
> > + clock-names:
> > + description:
> > + Input clock for the sensor.
> > + items:
> > + - const: xvclk
> > +
> > + assigned-clocks:
> > + description:
> > + Input clock for the sensor.
> > +
> > + assigned-clock-rates:
> > + description:
> > + Frequency of the xvclk clock in Hertz.
>
> These 2 should have a 'maxItems: 1'

Don't know why those properties are needed here.. IMHO this shouldn't be
part of the binding or at least it should be optional and not required.
All we need is the clocks and the clock-names property.

> > + dovdd-supply:
> > + description:
> > + Definition of the regulator used as interface power supply.
> > +
> > + avdd-supply:
> > + description:
> > + Definition of the regulator used as analog power supply.
> > +
> > + dvdd-supply:
> > + description:
> > + Definition of the regulator used as digital power supply.
> > +
> > + reset-gpios:
> > + description:
> > + The phandle and specifier for the GPIO that controls sensor reset.
> > + This corresponds to the hardware pin XSHUTDOWN which is physically
> > + active low.
> > +
> > + port:
> > + type: object
> > + additionalProperties: false
> > + description:
> > + A node containing input and output port nodes with endpoint definitions
>
> Only an output, right?
>
> > + as documented in
> > + Documentation/devicetree/bindings/media/video-interfaces.txt
> > +
> > + properties:
> > + endpoint:
> > + type: object
> > +
> > + properties:
> > + clock-lanes:
> > + maxItems: 1
> > +
> > + data-lanes:
> > + maxItems: 1
> > +
> > + remote-endpoint: true
> > +
> > + required:
> > + - clock-lanes
> > + - data-lanes
> > + - remote-endpoint
> > +
> > + required:
> > + - endpoint
> > +
> > +required:
> > + - compatible
> > + - reg
> > + - clocks
> > + - clock-names
> > + - assigned-clocks
> > + - assigned-clock-rates
> > + - dovdd-supply
> > + - avdd-supply
> > + - dvdd-supply
> > + - reset-gpios
> > + - port
> > +
> > +additionalProperties: false
> > +
> > +examples:
> > + - |
> > + #include <dt-bindings/gpio/gpio.h>
> > +
> > + i2c {
> > + #address-cells = <1>;
> > + #size-cells = <0>;
> > +
> > + ov8856: camera@10 {
> > + compatible = "ovti,ov8856";
> > + reg = <0x10>;
> > +
> > + reset-gpios = <&pio 111 GPIO_ACTIVE_LOW>;
> > + pinctrl-names = "default";
> > + pinctrl-0 = <&clk_24m_cam>;
> > +
> > + clocks = <&cam_osc>;
> > + clock-names = "xvclk";
> > + assigned-clocks = <&cam_osc>;
> > + assigned-clock-rates = <19200000>;
> > +
> > + avdd-supply = <&mt6358_vcama2_reg>;
> > + dvdd-supply = <&mt6358_vcamd_reg>;
> > + dovdd-supply = <&mt6358_vcamio_reg>;
> > +
> > + port {
> > + wcam_out: endpoint {
> > + remote-endpoint = <&mipi_in_wcam>;
> > + clock-lanes = <0>;
> > + data-lanes = <1 2 3 4>;
> > + link-frequencies = /bits/ 64 <360000000 180000000>;
> > + };
> > + };
> > + };
> > + };
> > +...
> > \ No newline at end of file
>
> ^^^
>
> > diff --git a/MAINTAINERS b/MAINTAINERS
> > index 534a8dc4f84a..3f35c6e9700a 100644
> > --- a/MAINTAINERS
> > +++ b/MAINTAINERS
> > @@ -12465,6 +12465,7 @@ L: [email protected]
> > T: git git://linuxtv.org/media_tree.git
> > S: Maintained
> > F: drivers/media/i2c/ov8856.c
> > +F: Documentation/devicetree/bindings/media/i2c/ov8856.yaml
> >
> > OMNIVISION OV9650 SENSOR DRIVER
> > M: Sakari Ailus <[email protected]>
> > --
> > 2.25.1
> >
>

--
Pengutronix e.K. | |
Steuerwalder Str. 21 | http://www.pengutronix.de/ |
31137 Hildesheim, Germany | Phone: +49-5121-206917-0 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |

2020-04-27 15:16:40

by Robert Foss

[permalink] [raw]
Subject: Re: [PATCH v7 1/3] media: dt-bindings: ov8856: Document YAML bindings

On Wed, 15 Apr 2020 at 18:21, Marco Felsch <[email protected]> wrote:
>
> On 20-04-15 11:07, Rob Herring wrote:
> > On Wed, Apr 08, 2020 at 01:08:14PM +0200, Robert Foss wrote:
> > > From: Dongchun Zhu <[email protected]>
> > >
> > > This patch adds documentation of device tree in YAML schema for the
> > > OV8856 CMOS image sensor.
> > >
> > > Signed-off-by: Dongchun Zhu <[email protected]>
> > > Signed-off-by: Robert Foss <[email protected]>
> > > ---
> > >
> > > - Changes since v6:
> > > * Marco: remove qcom specifics from DT example
> > >
> > > - Changes since v5:
> > > * Add assigned-clocks and assigned-clock-rates
> > > * robher: dt-schema errors
> > >
> > > - Changes since v4:
> > > * Fabio: Change reset-gpio to GPIO_ACTIVE_LOW, explain in description
> > > * Add clock-lanes property to example
> > > * robher: Fix syntax error in devicetree example
> > >
> > > - Changes since v3:
> > > * robher: Fix syntax error
> > > * robher: Removed maxItems
> > > * Fixes yaml 'make dt-binding-check' errors
> > >
> > > - Changes since v2:
> > > Fixes comments from from Andy, Tomasz, Sakari, Rob.
> > > * Convert text documentation to YAML schema.
> > >
> > > - Changes since v1:
> > > Fixes comments from Sakari, Tomasz
> > > * Add clock-frequency and link-frequencies in DT
> > >
> > > .../devicetree/bindings/media/i2c/ov8856.yaml | 143 ++++++++++++++++++
> > > MAINTAINERS | 1 +
> > > 2 files changed, 144 insertions(+)
> > > create mode 100644 Documentation/devicetree/bindings/media/i2c/ov8856.yaml
> > >
> > > diff --git a/Documentation/devicetree/bindings/media/i2c/ov8856.yaml b/Documentation/devicetree/bindings/media/i2c/ov8856.yaml
> > > new file mode 100644
> > > index 000000000000..96bef5403d7e
> > > --- /dev/null
> > > +++ b/Documentation/devicetree/bindings/media/i2c/ov8856.yaml
> > > @@ -0,0 +1,143 @@
> > > +# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
> > > +# Copyright (c) 2019 MediaTek Inc.
> > > +%YAML 1.2
> > > +---
> > > +$id: http://devicetree.org/schemas/media/i2c/ov8856.yaml#
> > > +$schema: http://devicetree.org/meta-schemas/core.yaml#
> > > +
> > > +title: Omnivision OV8856 CMOS Sensor Device Tree Bindings
> > > +
> > > +maintainers:
> > > + - Ben Kao <[email protected]>
> > > + - Dongchun Zhu <[email protected]>
> > > +
> > > +description: |-
> > > + The Omnivision OV8856 is a high performance, 1/4-inch, 8 megapixel, CMOS
> > > + image sensor that delivers 3264x2448 at 30fps. It provides full-frame,
> > > + sub-sampled, and windowed 10-bit MIPI images in various formats via the
> > > + Serial Camera Control Bus (SCCB) interface. This chip is programmable
> > > + through I2C and two-wire SCCB. The sensor output is available via CSI-2
> > > + serial data output (up to 4-lane).
> > > +
> > > +properties:
> > > + compatible:
> > > + const: ovti,ov8856
> > > +
> > > + reg:
> > > + maxItems: 1
> > > +
> > > + clocks:
> > > + maxItems: 1
> > > +
> > > + clock-names:
> > > + description:
> > > + Input clock for the sensor.
> > > + items:
> > > + - const: xvclk
> > > +
> > > + assigned-clocks:
> > > + description:
> > > + Input clock for the sensor.
> > > +
> > > + assigned-clock-rates:
> > > + description:
> > > + Frequency of the xvclk clock in Hertz.
> >
> > These 2 should have a 'maxItems: 1'
>
> Don't know why those properties are needed here.. IMHO this shouldn't be
> part of the binding or at least it should be optional and not required.
> All we need is the clocks and the clock-names property.

Thanks Marco, I'll make it optional for the next revision.

>
> > > + dovdd-supply:
> > > + description:
> > > + Definition of the regulator used as interface power supply.
> > > +
> > > + avdd-supply:
> > > + description:
> > > + Definition of the regulator used as analog power supply.
> > > +
> > > + dvdd-supply:
> > > + description:
> > > + Definition of the regulator used as digital power supply.
> > > +
> > > + reset-gpios:
> > > + description:
> > > + The phandle and specifier for the GPIO that controls sensor reset.
> > > + This corresponds to the hardware pin XSHUTDOWN which is physically
> > > + active low.
> > > +
> > > + port:
> > > + type: object
> > > + additionalProperties: false
> > > + description:
> > > + A node containing input and output port nodes with endpoint definitions
> >
> > Only an output, right?
> >
> > > + as documented in
> > > + Documentation/devicetree/bindings/media/video-interfaces.txt
> > > +
> > > + properties:
> > > + endpoint:
> > > + type: object
> > > +
> > > + properties:
> > > + clock-lanes:
> > > + maxItems: 1
> > > +
> > > + data-lanes:
> > > + maxItems: 1
> > > +
> > > + remote-endpoint: true
> > > +
> > > + required:
> > > + - clock-lanes
> > > + - data-lanes
> > > + - remote-endpoint
> > > +
> > > + required:
> > > + - endpoint
> > > +
> > > +required:
> > > + - compatible
> > > + - reg
> > > + - clocks
> > > + - clock-names
> > > + - assigned-clocks
> > > + - assigned-clock-rates
> > > + - dovdd-supply
> > > + - avdd-supply
> > > + - dvdd-supply
> > > + - reset-gpios
> > > + - port
> > > +
> > > +additionalProperties: false
> > > +
> > > +examples:
> > > + - |
> > > + #include <dt-bindings/gpio/gpio.h>
> > > +
> > > + i2c {
> > > + #address-cells = <1>;
> > > + #size-cells = <0>;
> > > +
> > > + ov8856: camera@10 {
> > > + compatible = "ovti,ov8856";
> > > + reg = <0x10>;
> > > +
> > > + reset-gpios = <&pio 111 GPIO_ACTIVE_LOW>;
> > > + pinctrl-names = "default";
> > > + pinctrl-0 = <&clk_24m_cam>;
> > > +
> > > + clocks = <&cam_osc>;
> > > + clock-names = "xvclk";
> > > + assigned-clocks = <&cam_osc>;
> > > + assigned-clock-rates = <19200000>;
> > > +
> > > + avdd-supply = <&mt6358_vcama2_reg>;
> > > + dvdd-supply = <&mt6358_vcamd_reg>;
> > > + dovdd-supply = <&mt6358_vcamio_reg>;
> > > +
> > > + port {
> > > + wcam_out: endpoint {
> > > + remote-endpoint = <&mipi_in_wcam>;
> > > + clock-lanes = <0>;
> > > + data-lanes = <1 2 3 4>;
> > > + link-frequencies = /bits/ 64 <360000000 180000000>;
> > > + };
> > > + };
> > > + };
> > > + };
> > > +...
> > > \ No newline at end of file
> >
> > ^^^
> >
> > > diff --git a/MAINTAINERS b/MAINTAINERS
> > > index 534a8dc4f84a..3f35c6e9700a 100644
> > > --- a/MAINTAINERS
> > > +++ b/MAINTAINERS
> > > @@ -12465,6 +12465,7 @@ L: [email protected]
> > > T: git git://linuxtv.org/media_tree.git
> > > S: Maintained
> > > F: drivers/media/i2c/ov8856.c
> > > +F: Documentation/devicetree/bindings/media/i2c/ov8856.yaml
> > >
> > > OMNIVISION OV9650 SENSOR DRIVER
> > > M: Sakari Ailus <[email protected]>
> > > --
> > > 2.25.1
> > >
> >
>
> --
> Pengutronix e.K. | |
> Steuerwalder Str. 21 | http://www.pengutronix.de/ |
> 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 |
> Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |

2020-04-27 15:17:21

by Robert Foss

[permalink] [raw]
Subject: Re: [PATCH v7 1/3] media: dt-bindings: ov8856: Document YAML bindings

On Wed, 15 Apr 2020 at 18:07, Rob Herring <[email protected]> wrote:
>
> On Wed, Apr 08, 2020 at 01:08:14PM +0200, Robert Foss wrote:
> > From: Dongchun Zhu <[email protected]>
> >
> > This patch adds documentation of device tree in YAML schema for the
> > OV8856 CMOS image sensor.
> >
> > Signed-off-by: Dongchun Zhu <[email protected]>
> > Signed-off-by: Robert Foss <[email protected]>
> > ---
> >
> > - Changes since v6:
> > * Marco: remove qcom specifics from DT example
> >
> > - Changes since v5:
> > * Add assigned-clocks and assigned-clock-rates
> > * robher: dt-schema errors
> >
> > - Changes since v4:
> > * Fabio: Change reset-gpio to GPIO_ACTIVE_LOW, explain in description
> > * Add clock-lanes property to example
> > * robher: Fix syntax error in devicetree example
> >
> > - Changes since v3:
> > * robher: Fix syntax error
> > * robher: Removed maxItems
> > * Fixes yaml 'make dt-binding-check' errors
> >
> > - Changes since v2:
> > Fixes comments from from Andy, Tomasz, Sakari, Rob.
> > * Convert text documentation to YAML schema.
> >
> > - Changes since v1:
> > Fixes comments from Sakari, Tomasz
> > * Add clock-frequency and link-frequencies in DT
> >
> > .../devicetree/bindings/media/i2c/ov8856.yaml | 143 ++++++++++++++++++
> > MAINTAINERS | 1 +
> > 2 files changed, 144 insertions(+)
> > create mode 100644 Documentation/devicetree/bindings/media/i2c/ov8856.yaml
> >
> > diff --git a/Documentation/devicetree/bindings/media/i2c/ov8856.yaml b/Documentation/devicetree/bindings/media/i2c/ov8856.yaml
> > new file mode 100644
> > index 000000000000..96bef5403d7e
> > --- /dev/null
> > +++ b/Documentation/devicetree/bindings/media/i2c/ov8856.yaml
> > @@ -0,0 +1,143 @@
> > +# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
> > +# Copyright (c) 2019 MediaTek Inc.
> > +%YAML 1.2
> > +---
> > +$id: http://devicetree.org/schemas/media/i2c/ov8856.yaml#
> > +$schema: http://devicetree.org/meta-schemas/core.yaml#
> > +
> > +title: Omnivision OV8856 CMOS Sensor Device Tree Bindings
> > +
> > +maintainers:
> > + - Ben Kao <[email protected]>
> > + - Dongchun Zhu <[email protected]>
> > +
> > +description: |-
> > + The Omnivision OV8856 is a high performance, 1/4-inch, 8 megapixel, CMOS
> > + image sensor that delivers 3264x2448 at 30fps. It provides full-frame,
> > + sub-sampled, and windowed 10-bit MIPI images in various formats via the
> > + Serial Camera Control Bus (SCCB) interface. This chip is programmable
> > + through I2C and two-wire SCCB. The sensor output is available via CSI-2
> > + serial data output (up to 4-lane).
> > +
> > +properties:
> > + compatible:
> > + const: ovti,ov8856
> > +
> > + reg:
> > + maxItems: 1
> > +
> > + clocks:
> > + maxItems: 1
> > +
> > + clock-names:
> > + description:
> > + Input clock for the sensor.
> > + items:
> > + - const: xvclk
> > +
> > + assigned-clocks:
> > + description:
> > + Input clock for the sensor.
> > +
> > + assigned-clock-rates:
> > + description:
> > + Frequency of the xvclk clock in Hertz.
>
> These 2 should have a 'maxItems: 1'

Thanks for finding this, I'll send a new revision without assigned-clocks soon.

>
> > +
> > + dovdd-supply:
> > + description:
> > + Definition of the regulator used as interface power supply.
> > +
> > + avdd-supply:
> > + description:
> > + Definition of the regulator used as analog power supply.
> > +
> > + dvdd-supply:
> > + description:
> > + Definition of the regulator used as digital power supply.
> > +
> > + reset-gpios:
> > + description:
> > + The phandle and specifier for the GPIO that controls sensor reset.
> > + This corresponds to the hardware pin XSHUTDOWN which is physically
> > + active low.
> > +
> > + port:
> > + type: object
> > + additionalProperties: false
> > + description:
> > + A node containing input and output port nodes with endpoint definitions
>
> Only an output, right?

Good find, fixing in next version.

>
> > + as documented in
> > + Documentation/devicetree/bindings/media/video-interfaces.txt
> > +
> > + properties:
> > + endpoint:
> > + type: object
> > +
> > + properties:
> > + clock-lanes:
> > + maxItems: 1
> > +
> > + data-lanes:
> > + maxItems: 1
> > +
> > + remote-endpoint: true
> > +
> > + required:
> > + - clock-lanes
> > + - data-lanes
> > + - remote-endpoint
> > +
> > + required:
> > + - endpoint
> > +
> > +required:
> > + - compatible
> > + - reg
> > + - clocks
> > + - clock-names
> > + - assigned-clocks
> > + - assigned-clock-rates
> > + - dovdd-supply
> > + - avdd-supply
> > + - dvdd-supply
> > + - reset-gpios
> > + - port
> > +
> > +additionalProperties: false
> > +
> > +examples:
> > + - |
> > + #include <dt-bindings/gpio/gpio.h>
> > +
> > + i2c {
> > + #address-cells = <1>;
> > + #size-cells = <0>;
> > +
> > + ov8856: camera@10 {
> > + compatible = "ovti,ov8856";
> > + reg = <0x10>;
> > +
> > + reset-gpios = <&pio 111 GPIO_ACTIVE_LOW>;
> > + pinctrl-names = "default";
> > + pinctrl-0 = <&clk_24m_cam>;
> > +
> > + clocks = <&cam_osc>;
> > + clock-names = "xvclk";
> > + assigned-clocks = <&cam_osc>;
> > + assigned-clock-rates = <19200000>;
> > +
> > + avdd-supply = <&mt6358_vcama2_reg>;
> > + dvdd-supply = <&mt6358_vcamd_reg>;
> > + dovdd-supply = <&mt6358_vcamio_reg>;
> > +
> > + port {
> > + wcam_out: endpoint {
> > + remote-endpoint = <&mipi_in_wcam>;
> > + clock-lanes = <0>;
> > + data-lanes = <1 2 3 4>;
> > + link-frequencies = /bits/ 64 <360000000 180000000>;
> > + };
> > + };
> > + };
> > + };
> > +...
> > \ No newline at end of file
>
> ^^^
>
> > diff --git a/MAINTAINERS b/MAINTAINERS
> > index 534a8dc4f84a..3f35c6e9700a 100644
> > --- a/MAINTAINERS
> > +++ b/MAINTAINERS
> > @@ -12465,6 +12465,7 @@ L: [email protected]
> > T: git git://linuxtv.org/media_tree.git
> > S: Maintained
> > F: drivers/media/i2c/ov8856.c
> > +F: Documentation/devicetree/bindings/media/i2c/ov8856.yaml
> >
> > OMNIVISION OV9650 SENSOR DRIVER
> > M: Sakari Ailus <[email protected]>
> > --
> > 2.25.1
> >

2020-04-28 07:57:05

by Maxime Ripard

[permalink] [raw]
Subject: Re: [PATCH v7 1/3] media: dt-bindings: ov8856: Document YAML bindings

On Mon, Apr 27, 2020 at 05:13:42PM +0200, Robert Foss wrote:
> On Wed, 15 Apr 2020 at 18:21, Marco Felsch <[email protected]> wrote:
> >
> > On 20-04-15 11:07, Rob Herring wrote:
> > > On Wed, Apr 08, 2020 at 01:08:14PM +0200, Robert Foss wrote:
> > > > From: Dongchun Zhu <[email protected]>
> > > >
> > > > This patch adds documentation of device tree in YAML schema for the
> > > > OV8856 CMOS image sensor.
> > > >
> > > > Signed-off-by: Dongchun Zhu <[email protected]>
> > > > Signed-off-by: Robert Foss <[email protected]>
> > > > ---
> > > >
> > > > - Changes since v6:
> > > > * Marco: remove qcom specifics from DT example
> > > >
> > > > - Changes since v5:
> > > > * Add assigned-clocks and assigned-clock-rates
> > > > * robher: dt-schema errors
> > > >
> > > > - Changes since v4:
> > > > * Fabio: Change reset-gpio to GPIO_ACTIVE_LOW, explain in description
> > > > * Add clock-lanes property to example
> > > > * robher: Fix syntax error in devicetree example
> > > >
> > > > - Changes since v3:
> > > > * robher: Fix syntax error
> > > > * robher: Removed maxItems
> > > > * Fixes yaml 'make dt-binding-check' errors
> > > >
> > > > - Changes since v2:
> > > > Fixes comments from from Andy, Tomasz, Sakari, Rob.
> > > > * Convert text documentation to YAML schema.
> > > >
> > > > - Changes since v1:
> > > > Fixes comments from Sakari, Tomasz
> > > > * Add clock-frequency and link-frequencies in DT
> > > >
> > > > .../devicetree/bindings/media/i2c/ov8856.yaml | 143 ++++++++++++++++++
> > > > MAINTAINERS | 1 +
> > > > 2 files changed, 144 insertions(+)
> > > > create mode 100644 Documentation/devicetree/bindings/media/i2c/ov8856.yaml
> > > >
> > > > diff --git a/Documentation/devicetree/bindings/media/i2c/ov8856.yaml b/Documentation/devicetree/bindings/media/i2c/ov8856.yaml
> > > > new file mode 100644
> > > > index 000000000000..96bef5403d7e
> > > > --- /dev/null
> > > > +++ b/Documentation/devicetree/bindings/media/i2c/ov8856.yaml
> > > > @@ -0,0 +1,143 @@
> > > > +# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
> > > > +# Copyright (c) 2019 MediaTek Inc.
> > > > +%YAML 1.2
> > > > +---
> > > > +$id: http://devicetree.org/schemas/media/i2c/ov8856.yaml#
> > > > +$schema: http://devicetree.org/meta-schemas/core.yaml#
> > > > +
> > > > +title: Omnivision OV8856 CMOS Sensor Device Tree Bindings
> > > > +
> > > > +maintainers:
> > > > + - Ben Kao <[email protected]>
> > > > + - Dongchun Zhu <[email protected]>
> > > > +
> > > > +description: |-
> > > > + The Omnivision OV8856 is a high performance, 1/4-inch, 8 megapixel, CMOS
> > > > + image sensor that delivers 3264x2448 at 30fps. It provides full-frame,
> > > > + sub-sampled, and windowed 10-bit MIPI images in various formats via the
> > > > + Serial Camera Control Bus (SCCB) interface. This chip is programmable
> > > > + through I2C and two-wire SCCB. The sensor output is available via CSI-2
> > > > + serial data output (up to 4-lane).
> > > > +
> > > > +properties:
> > > > + compatible:
> > > > + const: ovti,ov8856
> > > > +
> > > > + reg:
> > > > + maxItems: 1
> > > > +
> > > > + clocks:
> > > > + maxItems: 1
> > > > +
> > > > + clock-names:
> > > > + description:
> > > > + Input clock for the sensor.
> > > > + items:
> > > > + - const: xvclk
> > > > +
> > > > + assigned-clocks:
> > > > + description:
> > > > + Input clock for the sensor.
> > > > +
> > > > + assigned-clock-rates:
> > > > + description:
> > > > + Frequency of the xvclk clock in Hertz.
> > >
> > > These 2 should have a 'maxItems: 1'
> >
> > Don't know why those properties are needed here.. IMHO this shouldn't be
> > part of the binding or at least it should be optional and not required.
> > All we need is the clocks and the clock-names property.
>
> Thanks Marco, I'll make it optional for the next revision.

Well, the whole discussion we had was about removing them entirely?

Maxime


Attachments:
(No filename) (4.04 kB)
signature.asc (235.00 B)
Download all attachments

2020-04-28 08:29:35

by Marco Felsch

[permalink] [raw]
Subject: Re: [PATCH v7 1/3] media: dt-bindings: ov8856: Document YAML bindings

On 20-04-28 09:55, Maxime Ripard wrote:
> On Mon, Apr 27, 2020 at 05:13:42PM +0200, Robert Foss wrote:
> > On Wed, 15 Apr 2020 at 18:21, Marco Felsch <[email protected]> wrote:
> > >
> > > On 20-04-15 11:07, Rob Herring wrote:
> > > > On Wed, Apr 08, 2020 at 01:08:14PM +0200, Robert Foss wrote:
> > > > > From: Dongchun Zhu <[email protected]>

...

> > > > > + clock-names:
> > > > > + description:
> > > > > + Input clock for the sensor.
> > > > > + items:
> > > > > + - const: xvclk
> > > > > +
> > > > > + assigned-clocks:
> > > > > + description:
> > > > > + Input clock for the sensor.
> > > > > +
> > > > > + assigned-clock-rates:
> > > > > + description:
> > > > > + Frequency of the xvclk clock in Hertz.
> > > >
> > > > These 2 should have a 'maxItems: 1'
> > >
> > > Don't know why those properties are needed here.. IMHO this shouldn't be
> > > part of the binding or at least it should be optional and not required.
> > > All we need is the clocks and the clock-names property.
> >
> > Thanks Marco, I'll make it optional for the next revision.
>
> Well, the whole discussion we had was about removing them entirely?

+1 from my side. It is part of the system integration and not part of
this device.

Regards,
Marco

> Maxime

2020-04-28 11:53:26

by Robert Foss

[permalink] [raw]
Subject: Re: [PATCH v7 1/3] media: dt-bindings: ov8856: Document YAML bindings

Ah, sorry. I was thinking of the 'port' property and replying to that.

assigned clocks are definitely being removed.

On Tue, 28 Apr 2020 at 10:25, Marco Felsch <[email protected]> wrote:
>
> On 20-04-28 09:55, Maxime Ripard wrote:
> > On Mon, Apr 27, 2020 at 05:13:42PM +0200, Robert Foss wrote:
> > > On Wed, 15 Apr 2020 at 18:21, Marco Felsch <[email protected]> wrote:
> > > >
> > > > On 20-04-15 11:07, Rob Herring wrote:
> > > > > On Wed, Apr 08, 2020 at 01:08:14PM +0200, Robert Foss wrote:
> > > > > > From: Dongchun Zhu <[email protected]>
>
> ...
>
> > > > > > + clock-names:
> > > > > > + description:
> > > > > > + Input clock for the sensor.
> > > > > > + items:
> > > > > > + - const: xvclk
> > > > > > +
> > > > > > + assigned-clocks:
> > > > > > + description:
> > > > > > + Input clock for the sensor.
> > > > > > +
> > > > > > + assigned-clock-rates:
> > > > > > + description:
> > > > > > + Frequency of the xvclk clock in Hertz.
> > > > >
> > > > > These 2 should have a 'maxItems: 1'
> > > >
> > > > Don't know why those properties are needed here.. IMHO this shouldn't be
> > > > part of the binding or at least it should be optional and not required.
> > > > All we need is the clocks and the clock-names property.
> > >
> > > Thanks Marco, I'll make it optional for the next revision.
> >
> > Well, the whole discussion we had was about removing them entirely?
>
> +1 from my side. It is part of the system integration and not part of
> this device.
>
> Regards,
> Marco
>
> > Maxime