* [RFC PATCH 01/24] dt-bindings: media: i2c: max96717: add myself as maintainer
2025-03-08 18:33 [RFC PATCH 00/24] media: i2c: add Maxim GMSL2/3 serializer and deserializer drivers Cosmin Tanislav
@ 2025-03-08 18:33 ` Cosmin Tanislav
2025-03-08 18:33 ` [RFC PATCH 02/24] dt-bindings: media: i2c: max96717: reflow text Cosmin Tanislav
` (21 subsequent siblings)
22 siblings, 0 replies; 30+ messages in thread
From: Cosmin Tanislav @ 2025-03-08 18:33 UTC (permalink / raw)
Cc: Tomi Valkeinen, Niklas Söderlund, Cosmin Tanislav,
Mauro Carvalho Chehab, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Julien Massot, Catalin Marinas, Will Deacon,
Greg Kroah-Hartman, Liam Girdwood, Mark Brown, Linus Walleij,
Bartosz Golaszewski, Bjorn Andersson, Geert Uytterhoeven,
Dmitry Baryshkov, Heiko Stuebner, Biju Das, Taniya Das,
Nícolas F . R . A . Prado, Eric Biggers, Javier Carrasco,
Ross Burton, Sakari Ailus, Hans Verkuil, Laurent Pinchart,
Umang Jain, Zhi Mao, Kieran Bingham, Dongcheng Yan,
AngeloGioacchino Del Regno, Benjamin Mugnier, Tommaso Merciai,
Dan Carpenter, Ricardo Ribalda, Ihor Matushchak, Laurentiu Palcu,
linux-media, devicetree, linux-kernel, linux-arm-kernel,
linux-staging, linux-gpio, Cosmin Tanislav
Analog Devices is taking responsability for the maintenance of the Maxim
GMSL2/3 devices.
Add myself to the maintainers list and to the device tree bindings.
Signed-off-by: Cosmin Tanislav <demonsingur@gmail.com>
---
Documentation/devicetree/bindings/media/i2c/maxim,max96717.yaml | 1 +
MAINTAINERS | 1 +
2 files changed, 2 insertions(+)
diff --git a/Documentation/devicetree/bindings/media/i2c/maxim,max96717.yaml b/Documentation/devicetree/bindings/media/i2c/maxim,max96717.yaml
index d1e8ba6e368e..15ab37702a92 100644
--- a/Documentation/devicetree/bindings/media/i2c/maxim,max96717.yaml
+++ b/Documentation/devicetree/bindings/media/i2c/maxim,max96717.yaml
@@ -9,6 +9,7 @@ title: MAX96717 CSI-2 to GMSL2 Serializer
maintainers:
- Julien Massot <julien.massot@collabora.com>
+ - Cosmin Tanislav <cosmin.tanislav@analog.com>
description:
The MAX96717 serializer converts MIPI CSI-2 D-PHY formatted input
diff --git a/MAINTAINERS b/MAINTAINERS
index 1916d0636408..8f463ebca056 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -14198,6 +14198,7 @@ F: drivers/media/i2c/max96714.c
MAX96717 GMSL2 SERIALIZER DRIVER
M: Julien Massot <julien.massot@collabora.com>
+M: Cosmin Tanislav <cosmin.tanislav@analog.com>
L: linux-media@vger.kernel.org
S: Maintained
F: Documentation/devicetree/bindings/media/i2c/maxim,max96717.yaml
--
2.48.1
^ permalink raw reply related [flat|nested] 30+ messages in thread* [RFC PATCH 02/24] dt-bindings: media: i2c: max96717: reflow text
2025-03-08 18:33 [RFC PATCH 00/24] media: i2c: add Maxim GMSL2/3 serializer and deserializer drivers Cosmin Tanislav
2025-03-08 18:33 ` [RFC PATCH 01/24] dt-bindings: media: i2c: max96717: add myself as maintainer Cosmin Tanislav
@ 2025-03-08 18:33 ` Cosmin Tanislav
2025-03-08 18:33 ` [RFC PATCH 03/24] dt-bindings: media: i2c: max96717: add support for I2C ATR Cosmin Tanislav
` (20 subsequent siblings)
22 siblings, 0 replies; 30+ messages in thread
From: Cosmin Tanislav @ 2025-03-08 18:33 UTC (permalink / raw)
Cc: Tomi Valkeinen, Niklas Söderlund, Cosmin Tanislav,
Mauro Carvalho Chehab, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Julien Massot, Catalin Marinas, Will Deacon,
Greg Kroah-Hartman, Liam Girdwood, Mark Brown, Linus Walleij,
Bartosz Golaszewski, Bjorn Andersson, Geert Uytterhoeven,
Dmitry Baryshkov, Heiko Stuebner, Biju Das, Taniya Das,
Nícolas F . R . A . Prado, Eric Biggers, Javier Carrasco,
Ross Burton, Sakari Ailus, Hans Verkuil, Laurent Pinchart,
Umang Jain, Zhi Mao, Kieran Bingham, Dongcheng Yan,
AngeloGioacchino Del Regno, Benjamin Mugnier, Tommaso Merciai,
Dan Carpenter, Ricardo Ribalda, Ihor Matushchak, Laurentiu Palcu,
linux-media, devicetree, linux-kernel, linux-arm-kernel,
linux-staging, linux-gpio, Cosmin Tanislav
This text is using weird line lengths. Fix it.
Signed-off-by: Cosmin Tanislav <demonsingur@gmail.com>
---
.../bindings/media/i2c/maxim,max96717.yaml | 19 +++++++++----------
1 file changed, 9 insertions(+), 10 deletions(-)
diff --git a/Documentation/devicetree/bindings/media/i2c/maxim,max96717.yaml b/Documentation/devicetree/bindings/media/i2c/maxim,max96717.yaml
index 15ab37702a92..1026678a17a7 100644
--- a/Documentation/devicetree/bindings/media/i2c/maxim,max96717.yaml
+++ b/Documentation/devicetree/bindings/media/i2c/maxim,max96717.yaml
@@ -12,16 +12,15 @@ maintainers:
- Cosmin Tanislav <cosmin.tanislav@analog.com>
description:
- The MAX96717 serializer converts MIPI CSI-2 D-PHY formatted input
- into GMSL2 serial outputs. The device allows the GMSL2 link to
- simultaneously transmit bidirectional control-channel data while forward
- video transmissions are in progress. The MAX96717 can connect to one
- remotely located deserializer using industry-standard coax or STP
- interconnects. The device cans operate in pixel or tunnel mode. In pixel mode
- the MAX96717 can select the MIPI datatype, while the tunnel mode forward all the MIPI
- data received by the serializer.
- The MAX96717 supports Reference Over Reverse (channel),
- to generate a clock output for the sensor from the GMSL reverse channel.
+ The MAX96717 serializer converts MIPI CSI-2 D-PHY formatted input into GMSL2
+ serial outputs. The device allows the GMSL2 link to simultaneously transmit
+ bidirectional control-channel data while forward video transmissions are in
+ progress. The MAX96717 can connect to one remotely located deserializer using
+ industry-standard coax or STP interconnects. The device cans operate in pixel
+ or tunnel mode. In pixel mode the MAX96717 can select the MIPI datatype, while
+ the tunnel mode forward all the MIPI data received by the serializer.
+ The MAX96717 supports Reference Over Reverse (channel), to generate a clock
+ output for the sensor from the GMSL reverse channel.
The GMSL2 serial link operates at a fixed rate of 3Gbps or 6Gbps in the
forward direction and 187.5Mbps in the reverse direction.
--
2.48.1
^ permalink raw reply related [flat|nested] 30+ messages in thread* [RFC PATCH 03/24] dt-bindings: media: i2c: max96717: add support for I2C ATR
2025-03-08 18:33 [RFC PATCH 00/24] media: i2c: add Maxim GMSL2/3 serializer and deserializer drivers Cosmin Tanislav
2025-03-08 18:33 ` [RFC PATCH 01/24] dt-bindings: media: i2c: max96717: add myself as maintainer Cosmin Tanislav
2025-03-08 18:33 ` [RFC PATCH 02/24] dt-bindings: media: i2c: max96717: reflow text Cosmin Tanislav
@ 2025-03-08 18:33 ` Cosmin Tanislav
2025-03-08 18:33 ` [RFC PATCH 04/24] dt-bindings: media: i2c: max96717: add support for pinctrl/pinconf Cosmin Tanislav
` (19 subsequent siblings)
22 siblings, 0 replies; 30+ messages in thread
From: Cosmin Tanislav @ 2025-03-08 18:33 UTC (permalink / raw)
Cc: Tomi Valkeinen, Niklas Söderlund, Cosmin Tanislav,
Mauro Carvalho Chehab, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Julien Massot, Catalin Marinas, Will Deacon,
Greg Kroah-Hartman, Liam Girdwood, Mark Brown, Linus Walleij,
Bartosz Golaszewski, Bjorn Andersson, Geert Uytterhoeven,
Dmitry Baryshkov, Heiko Stuebner, Biju Das, Taniya Das,
Nícolas F . R . A . Prado, Eric Biggers, Javier Carrasco,
Ross Burton, Sakari Ailus, Hans Verkuil, Laurent Pinchart,
Umang Jain, Zhi Mao, Kieran Bingham, Dongcheng Yan,
AngeloGioacchino Del Regno, Benjamin Mugnier, Tommaso Merciai,
Dan Carpenter, Ricardo Ribalda, Ihor Matushchak, Laurentiu Palcu,
linux-media, devicetree, linux-kernel, linux-arm-kernel,
linux-staging, linux-gpio, Cosmin Tanislav
MAX96717 is capable of address translation for the connected I2C slaves.
Add support for I2C ATR while keeping I2C gate for compatibility to
support this usecase.
Signed-off-by: Cosmin Tanislav <demonsingur@gmail.com>
---
.../bindings/media/i2c/maxim,max96717.yaml | 34 ++++++++++++++-----
1 file changed, 26 insertions(+), 8 deletions(-)
diff --git a/Documentation/devicetree/bindings/media/i2c/maxim,max96717.yaml b/Documentation/devicetree/bindings/media/i2c/maxim,max96717.yaml
index 1026678a17a7..7d77cc9dcd96 100644
--- a/Documentation/devicetree/bindings/media/i2c/maxim,max96717.yaml
+++ b/Documentation/devicetree/bindings/media/i2c/maxim,max96717.yaml
@@ -83,14 +83,6 @@ properties:
required:
- port@1
- i2c-gate:
- $ref: /schemas/i2c/i2c-gate.yaml
- unevaluatedProperties: false
- description:
- The MAX96717 will forward the I2C requests from the
- incoming GMSL2 link. Therefore, it supports an i2c-gate
- subnode to configure a sensor.
-
required:
- compatible
- reg
@@ -98,6 +90,32 @@ required:
additionalProperties: false
+allOf:
+ - $ref: /schemas/i2c/i2c-atr.yaml#
+
+ - oneOf:
+ - properties:
+ i2c-gate:
+ $ref: /schemas/i2c/i2c-gate.yaml
+ unevaluatedProperties: false
+ description:
+ The MAX96717 will forward the I2C requests from the
+ incoming GMSL2 link. Therefore, it supports an i2c-gate
+ subnode to configure a sensor.
+
+ - properties:
+ i2c-alias-pool:
+ maxItems: 2
+
+ i2c-atr:
+ patternProperties:
+ '^i2c@0':
+ $ref: /schemas/i2c/i2c-controller.yaml#
+ properties:
+ reg:
+ items:
+ max: 0
+
examples:
- |
#include <dt-bindings/gpio/gpio.h>
--
2.48.1
^ permalink raw reply related [flat|nested] 30+ messages in thread* [RFC PATCH 04/24] dt-bindings: media: i2c: max96717: add support for pinctrl/pinconf
2025-03-08 18:33 [RFC PATCH 00/24] media: i2c: add Maxim GMSL2/3 serializer and deserializer drivers Cosmin Tanislav
` (2 preceding siblings ...)
2025-03-08 18:33 ` [RFC PATCH 03/24] dt-bindings: media: i2c: max96717: add support for I2C ATR Cosmin Tanislav
@ 2025-03-08 18:33 ` Cosmin Tanislav
2025-03-08 20:44 ` Rob Herring (Arm)
2025-03-08 18:33 ` [RFC PATCH 05/24] dt-bindings: media: i2c: max96717: add support for MAX9295A Cosmin Tanislav
` (18 subsequent siblings)
22 siblings, 1 reply; 30+ messages in thread
From: Cosmin Tanislav @ 2025-03-08 18:33 UTC (permalink / raw)
Cc: Tomi Valkeinen, Niklas Söderlund, Cosmin Tanislav,
Mauro Carvalho Chehab, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Julien Massot, Catalin Marinas, Will Deacon,
Greg Kroah-Hartman, Liam Girdwood, Mark Brown, Linus Walleij,
Bartosz Golaszewski, Bjorn Andersson, Geert Uytterhoeven,
Dmitry Baryshkov, Heiko Stuebner, Biju Das, Taniya Das,
Nícolas F . R . A . Prado, Eric Biggers, Javier Carrasco,
Ross Burton, Sakari Ailus, Hans Verkuil, Laurent Pinchart,
Umang Jain, Zhi Mao, Kieran Bingham, Dongcheng Yan,
AngeloGioacchino Del Regno, Benjamin Mugnier, Tommaso Merciai,
Dan Carpenter, Ricardo Ribalda, Ihor Matushchak, Laurentiu Palcu,
linux-media, devicetree, linux-kernel, linux-arm-kernel,
linux-staging, linux-gpio, Cosmin Tanislav
MAX96717 is capable of configuring various pin properties.
Add pinctrl/pinconf properties to support this usecase.
Signed-off-by: Cosmin Tanislav <demonsingur@gmail.com>
---
.../media/i2c/maxim,max96717-pinctrl.yaml | 71 +++++++++++++++++++
.../bindings/media/i2c/maxim,max96717.yaml | 16 ++++-
MAINTAINERS | 1 +
3 files changed, 87 insertions(+), 1 deletion(-)
create mode 100644 Documentation/devicetree/bindings/media/i2c/maxim,max96717-pinctrl.yaml
diff --git a/Documentation/devicetree/bindings/media/i2c/maxim,max96717-pinctrl.yaml b/Documentation/devicetree/bindings/media/i2c/maxim,max96717-pinctrl.yaml
new file mode 100644
index 000000000000..9480d3127643
--- /dev/null
+++ b/Documentation/devicetree/bindings/media/i2c/maxim,max96717-pinctrl.yaml
@@ -0,0 +1,71 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+# Copyright (C) 2025 Analog Devices Inc.
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/media/i2c/maxim,max96717-pinctrl.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Maxim GMSL2 Serializer Pinctrl
+
+maintainers:
+ - Cosmin Tanislav <cosmin.tanislav@analog.com>
+
+allOf:
+ - $ref: /schemas/pinctrl/pincfg-node.yaml#
+ - $ref: /schemas/pinctrl/pinmux-node.yaml#
+
+unevaluatedProperties: false
+
+properties:
+ function: true
+ pins: true
+ drive-open-drain: true
+ drive-push-pull: true
+ bias-disable: true
+ bias-pull-up: true
+ bias-pull-down: true
+ output-disable: true
+ output-enable: true
+ output-low: true
+ output-high: true
+ slew-rate: true
+ input-enable: true
+
+ maxim,jitter-compensation:
+ type: boolean
+ description: Enables jitter compensation.
+
+ maxim,gmsl-tx:
+ type: boolean
+ description: Enable transmitting pin value to GMSL link.
+
+ maxim,gmsl-rx:
+ type: boolean
+ description: Enable receiving pin value from GMSL link.
+
+ maxim,gmsl-tx-id:
+ $ref: /schemas/types.yaml#/definitions/uint32
+ description: |
+ Identifier used while transmitting value to GMSL link.
+ Default value matches the pin number.
+ min: 0
+ max: 31
+
+ maxim,gmsl-rx-id:
+ $ref: /schemas/types.yaml#/definitions/uint32
+ description: |
+ Identifier used while receiving value from GMSL link.
+ Default value matches the pin number.
+ min: 0
+ max: 31
+
+ maxim,rclkout-clock:
+ $ref: /schemas/types.yaml#/definitions/uint32
+ description: |
+ Clock value.
+ 0 - XTAL / 1 = 25MHz
+ 1 - XTAL / 2 = 12.5MHz
+ 2 - XTAL / 4 = 6.25MHz
+ 3 - Reference PLL output
+ min: 0
+ max: 3
diff --git a/Documentation/devicetree/bindings/media/i2c/maxim,max96717.yaml b/Documentation/devicetree/bindings/media/i2c/maxim,max96717.yaml
index 7d77cc9dcd96..20114c252e01 100644
--- a/Documentation/devicetree/bindings/media/i2c/maxim,max96717.yaml
+++ b/Documentation/devicetree/bindings/media/i2c/maxim,max96717.yaml
@@ -88,7 +88,21 @@ required:
- reg
- ports
-additionalProperties: false
+additionalProperties:
+ anyOf:
+ - type: object
+ allOf:
+ - $ref: /schemas/media/i2c/maxim,max96717-pinctrl.yaml#
+
+ unevaluatedProperties: false
+
+ - type: object
+ additionalProperties:
+ type: object
+ allOf:
+ - $ref: /schemas/media/i2c/maxim,max96717-pinctrl.yaml#
+
+ unevaluatedProperties: false
allOf:
- $ref: /schemas/i2c/i2c-atr.yaml#
diff --git a/MAINTAINERS b/MAINTAINERS
index 8f463ebca056..f8ffb7cff9c5 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -14201,6 +14201,7 @@ M: Julien Massot <julien.massot@collabora.com>
M: Cosmin Tanislav <cosmin.tanislav@analog.com>
L: linux-media@vger.kernel.org
S: Maintained
+F: Documentation/devicetree/bindings/media/i2c/maxim,max96717-pinctrl.yaml
F: Documentation/devicetree/bindings/media/i2c/maxim,max96717.yaml
F: drivers/media/i2c/max96717.c
--
2.48.1
^ permalink raw reply related [flat|nested] 30+ messages in thread* Re: [RFC PATCH 04/24] dt-bindings: media: i2c: max96717: add support for pinctrl/pinconf
2025-03-08 18:33 ` [RFC PATCH 04/24] dt-bindings: media: i2c: max96717: add support for pinctrl/pinconf Cosmin Tanislav
@ 2025-03-08 20:44 ` Rob Herring (Arm)
0 siblings, 0 replies; 30+ messages in thread
From: Rob Herring (Arm) @ 2025-03-08 20:44 UTC (permalink / raw)
To: Cosmin Tanislav
Cc: devicetree, Biju Das, Will Deacon, Dan Carpenter, Hans Verkuil,
Umang Jain, Dmitry Baryshkov, Taniya Das, Tomi Valkeinen,
Benjamin Mugnier, Cosmin Tanislav, AngeloGioacchino Del Regno,
Mauro Carvalho Chehab, linux-gpio, Laurent Pinchart,
Ricardo Ribalda, Niklas Söderlund, Dongcheng Yan,
Tommaso Merciai, Nícolas F . R . A . Prado, linux-staging,
Ross Burton, Conor Dooley, Javier Carrasco, linux-kernel,
Geert Uytterhoeven, linux-arm-kernel, Mark Brown, Eric Biggers,
Bartosz Golaszewski, linux-media, Linus Walleij, Bjorn Andersson,
Julien Massot, Ihor Matushchak, Laurentiu Palcu, Heiko Stuebner,
Liam Girdwood, Krzysztof Kozlowski, Sakari Ailus, Catalin Marinas,
Zhi Mao, Greg Kroah-Hartman, Kieran Bingham
On Sat, 08 Mar 2025 20:33:33 +0200, Cosmin Tanislav wrote:
> MAX96717 is capable of configuring various pin properties.
>
> Add pinctrl/pinconf properties to support this usecase.
>
> Signed-off-by: Cosmin Tanislav <demonsingur@gmail.com>
> ---
> .../media/i2c/maxim,max96717-pinctrl.yaml | 71 +++++++++++++++++++
> .../bindings/media/i2c/maxim,max96717.yaml | 16 ++++-
> MAINTAINERS | 1 +
> 3 files changed, 87 insertions(+), 1 deletion(-)
> create mode 100644 Documentation/devicetree/bindings/media/i2c/maxim,max96717-pinctrl.yaml
>
My bot found errors running 'make dt_binding_check' on your patch:
yamllint warnings/errors:
dtschema/dtc warnings/errors:
/builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/media/i2c/maxim,max96717-pinctrl.yaml: properties:maxim,gmsl-rx-id: 'anyOf' conditional failed, one must be fixed:
'min' is not one of ['$ref', 'additionalItems', 'additionalProperties', 'allOf', 'anyOf', 'const', 'contains', 'default', 'dependencies', 'dependentRequired', 'dependentSchemas', 'deprecated', 'description', 'else', 'enum', 'exclusiveMaximum', 'exclusiveMinimum', 'items', 'if', 'minItems', 'minimum', 'maxItems', 'maximum', 'multipleOf', 'not', 'oneOf', 'pattern', 'patternProperties', 'properties', 'required', 'then', 'typeSize', 'unevaluatedProperties', 'uniqueItems']
'type' was expected
from schema $id: http://devicetree.org/meta-schemas/keywords.yaml#
/builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/media/i2c/maxim,max96717-pinctrl.yaml: properties:maxim,gmsl-rx-id: 'anyOf' conditional failed, one must be fixed:
'max' is not one of ['$ref', 'additionalItems', 'additionalProperties', 'allOf', 'anyOf', 'const', 'contains', 'default', 'dependencies', 'dependentRequired', 'dependentSchemas', 'deprecated', 'description', 'else', 'enum', 'exclusiveMaximum', 'exclusiveMinimum', 'items', 'if', 'minItems', 'minimum', 'maxItems', 'maximum', 'multipleOf', 'not', 'oneOf', 'pattern', 'patternProperties', 'properties', 'required', 'then', 'typeSize', 'unevaluatedProperties', 'uniqueItems']
'type' was expected
from schema $id: http://devicetree.org/meta-schemas/keywords.yaml#
/builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/media/i2c/maxim,max96717-pinctrl.yaml: properties:maxim,rclkout-clock: 'anyOf' conditional failed, one must be fixed:
'min' is not one of ['$ref', 'additionalItems', 'additionalProperties', 'allOf', 'anyOf', 'const', 'contains', 'default', 'dependencies', 'dependentRequired', 'dependentSchemas', 'deprecated', 'description', 'else', 'enum', 'exclusiveMaximum', 'exclusiveMinimum', 'items', 'if', 'minItems', 'minimum', 'maxItems', 'maximum', 'multipleOf', 'not', 'oneOf', 'pattern', 'patternProperties', 'properties', 'required', 'then', 'typeSize', 'unevaluatedProperties', 'uniqueItems']
'type' was expected
from schema $id: http://devicetree.org/meta-schemas/keywords.yaml#
/builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/media/i2c/maxim,max96717-pinctrl.yaml: properties:maxim,rclkout-clock: 'anyOf' conditional failed, one must be fixed:
'max' is not one of ['$ref', 'additionalItems', 'additionalProperties', 'allOf', 'anyOf', 'const', 'contains', 'default', 'dependencies', 'dependentRequired', 'dependentSchemas', 'deprecated', 'description', 'else', 'enum', 'exclusiveMaximum', 'exclusiveMinimum', 'items', 'if', 'minItems', 'minimum', 'maxItems', 'maximum', 'multipleOf', 'not', 'oneOf', 'pattern', 'patternProperties', 'properties', 'required', 'then', 'typeSize', 'unevaluatedProperties', 'uniqueItems']
'type' was expected
from schema $id: http://devicetree.org/meta-schemas/keywords.yaml#
/builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/media/i2c/maxim,max96717-pinctrl.yaml: properties:maxim,gmsl-tx-id: 'anyOf' conditional failed, one must be fixed:
'min' is not one of ['$ref', 'additionalItems', 'additionalProperties', 'allOf', 'anyOf', 'const', 'contains', 'default', 'dependencies', 'dependentRequired', 'dependentSchemas', 'deprecated', 'description', 'else', 'enum', 'exclusiveMaximum', 'exclusiveMinimum', 'items', 'if', 'minItems', 'minimum', 'maxItems', 'maximum', 'multipleOf', 'not', 'oneOf', 'pattern', 'patternProperties', 'properties', 'required', 'then', 'typeSize', 'unevaluatedProperties', 'uniqueItems']
'type' was expected
from schema $id: http://devicetree.org/meta-schemas/keywords.yaml#
/builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/media/i2c/maxim,max96717-pinctrl.yaml: properties:maxim,gmsl-tx-id: 'anyOf' conditional failed, one must be fixed:
'max' is not one of ['$ref', 'additionalItems', 'additionalProperties', 'allOf', 'anyOf', 'const', 'contains', 'default', 'dependencies', 'dependentRequired', 'dependentSchemas', 'deprecated', 'description', 'else', 'enum', 'exclusiveMaximum', 'exclusiveMinimum', 'items', 'if', 'minItems', 'minimum', 'maxItems', 'maximum', 'multipleOf', 'not', 'oneOf', 'pattern', 'patternProperties', 'properties', 'required', 'then', 'typeSize', 'unevaluatedProperties', 'uniqueItems']
'type' was expected
from schema $id: http://devicetree.org/meta-schemas/keywords.yaml#
/builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/media/i2c/maxim,max96717.example.dtb: serializer@40: i2c-gate: 'anyOf' conditional failed, one must be fixed:
Unevaluated properties are not allowed ('#address-cells', '#size-cells', 'sensor@10' were unexpected)
1 is not of type 'object'
0 is not of type 'object'
Unevaluated properties are not allowed ('VANA-supply', 'VCORE-supply', 'VDDIO-supply', 'clocks', 'compatible', 'port', 'reg', 'reset-gpios' were unexpected)
from schema $id: http://devicetree.org/schemas/media/i2c/maxim,max96717.yaml#
doc reference errors (make refcheckdocs):
See https://patchwork.ozlabs.org/project/devicetree-bindings/patch/20250308183410.3013996-5-demonsingur@gmail.com
The base for the series is generally the latest rc1. A different dependency
should be noted in *this* patch.
If you already ran 'make dt_binding_check' and didn't see the above
error(s), then make sure 'yamllint' is installed and dt-schema is up to
date:
pip3 install dtschema --upgrade
Please check and re-submit after running the above command yourself. Note
that DT_SCHEMA_FILES can be set to your schema file to speed up checking
your schema. However, it must be unset to test all examples with your schema.
^ permalink raw reply [flat|nested] 30+ messages in thread
* [RFC PATCH 05/24] dt-bindings: media: i2c: max96717: add support for MAX9295A
2025-03-08 18:33 [RFC PATCH 00/24] media: i2c: add Maxim GMSL2/3 serializer and deserializer drivers Cosmin Tanislav
` (3 preceding siblings ...)
2025-03-08 18:33 ` [RFC PATCH 04/24] dt-bindings: media: i2c: max96717: add support for pinctrl/pinconf Cosmin Tanislav
@ 2025-03-08 18:33 ` Cosmin Tanislav
2025-03-08 18:33 ` [RFC PATCH 06/24] dt-bindings: media: i2c: max96717: add support for MAX96793 Cosmin Tanislav
` (17 subsequent siblings)
22 siblings, 0 replies; 30+ messages in thread
From: Cosmin Tanislav @ 2025-03-08 18:33 UTC (permalink / raw)
Cc: Tomi Valkeinen, Niklas Söderlund, Cosmin Tanislav,
Mauro Carvalho Chehab, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Julien Massot, Catalin Marinas, Will Deacon,
Greg Kroah-Hartman, Liam Girdwood, Mark Brown, Linus Walleij,
Bartosz Golaszewski, Bjorn Andersson, Geert Uytterhoeven,
Dmitry Baryshkov, Heiko Stuebner, Biju Das, Taniya Das,
Nícolas F . R . A . Prado, Eric Biggers, Javier Carrasco,
Ross Burton, Sakari Ailus, Hans Verkuil, Laurent Pinchart,
Umang Jain, Zhi Mao, Kieran Bingham, Dongcheng Yan,
AngeloGioacchino Del Regno, Benjamin Mugnier, Tommaso Merciai,
Dan Carpenter, Ricardo Ribalda, Ihor Matushchak, Laurentiu Palcu,
linux-media, devicetree, linux-kernel, linux-arm-kernel,
linux-staging, linux-gpio, Cosmin Tanislav
MAX9295A is an older variant of the MAX96717 which does not support
tunnel mode.
Document the compatibility.
Signed-off-by: Cosmin Tanislav <demonsingur@gmail.com>
---
.../devicetree/bindings/media/i2c/maxim,max96717.yaml | 3 +++
1 file changed, 3 insertions(+)
diff --git a/Documentation/devicetree/bindings/media/i2c/maxim,max96717.yaml b/Documentation/devicetree/bindings/media/i2c/maxim,max96717.yaml
index 20114c252e01..1e5b85167d0e 100644
--- a/Documentation/devicetree/bindings/media/i2c/maxim,max96717.yaml
+++ b/Documentation/devicetree/bindings/media/i2c/maxim,max96717.yaml
@@ -24,11 +24,14 @@ description:
The GMSL2 serial link operates at a fixed rate of 3Gbps or 6Gbps in the
forward direction and 187.5Mbps in the reverse direction.
+
MAX96717F only supports a fixed rate of 3Gbps in the forward direction.
+ MAX9295A only supports pixel mode.
properties:
compatible:
oneOf:
+ - const: maxim,max9295a
- const: maxim,max96717f
- items:
- enum:
--
2.48.1
^ permalink raw reply related [flat|nested] 30+ messages in thread* [RFC PATCH 06/24] dt-bindings: media: i2c: max96717: add support for MAX96793
2025-03-08 18:33 [RFC PATCH 00/24] media: i2c: add Maxim GMSL2/3 serializer and deserializer drivers Cosmin Tanislav
` (4 preceding siblings ...)
2025-03-08 18:33 ` [RFC PATCH 05/24] dt-bindings: media: i2c: max96717: add support for MAX9295A Cosmin Tanislav
@ 2025-03-08 18:33 ` Cosmin Tanislav
2025-03-08 18:33 ` [RFC PATCH 07/24] dt-bindings: media: i2c: max96714: add myself as maintainer Cosmin Tanislav
` (16 subsequent siblings)
22 siblings, 0 replies; 30+ messages in thread
From: Cosmin Tanislav @ 2025-03-08 18:33 UTC (permalink / raw)
Cc: Tomi Valkeinen, Niklas Söderlund, Cosmin Tanislav,
Mauro Carvalho Chehab, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Julien Massot, Catalin Marinas, Will Deacon,
Greg Kroah-Hartman, Liam Girdwood, Mark Brown, Linus Walleij,
Bartosz Golaszewski, Bjorn Andersson, Geert Uytterhoeven,
Dmitry Baryshkov, Heiko Stuebner, Biju Das, Taniya Das,
Nícolas F . R . A . Prado, Eric Biggers, Javier Carrasco,
Ross Burton, Sakari Ailus, Hans Verkuil, Laurent Pinchart,
Umang Jain, Zhi Mao, Kieran Bingham, Dongcheng Yan,
AngeloGioacchino Del Regno, Benjamin Mugnier, Tommaso Merciai,
Dan Carpenter, Ricardo Ribalda, Ihor Matushchak, Laurentiu Palcu,
linux-media, devicetree, linux-kernel, linux-arm-kernel,
linux-staging, linux-gpio, Cosmin Tanislav
MAX96793 is a newer variant of the MAX96717 which also supports GMSL3
links.
Document this compatibility.
Signed-off-by: Cosmin Tanislav <demonsingur@gmail.com>
---
Documentation/devicetree/bindings/media/i2c/maxim,max96717.yaml | 2 ++
1 file changed, 2 insertions(+)
diff --git a/Documentation/devicetree/bindings/media/i2c/maxim,max96717.yaml b/Documentation/devicetree/bindings/media/i2c/maxim,max96717.yaml
index 1e5b85167d0e..2d7440049318 100644
--- a/Documentation/devicetree/bindings/media/i2c/maxim,max96717.yaml
+++ b/Documentation/devicetree/bindings/media/i2c/maxim,max96717.yaml
@@ -27,6 +27,7 @@ description:
MAX96717F only supports a fixed rate of 3Gbps in the forward direction.
MAX9295A only supports pixel mode.
+ MAX96793 also supports GMSL3 mode.
properties:
compatible:
@@ -36,6 +37,7 @@ properties:
- items:
- enum:
- maxim,max96717
+ - maxim,max96793
- const: maxim,max96717f
'#gpio-cells':
--
2.48.1
^ permalink raw reply related [flat|nested] 30+ messages in thread* [RFC PATCH 07/24] dt-bindings: media: i2c: max96714: add myself as maintainer
2025-03-08 18:33 [RFC PATCH 00/24] media: i2c: add Maxim GMSL2/3 serializer and deserializer drivers Cosmin Tanislav
` (5 preceding siblings ...)
2025-03-08 18:33 ` [RFC PATCH 06/24] dt-bindings: media: i2c: max96717: add support for MAX96793 Cosmin Tanislav
@ 2025-03-08 18:33 ` Cosmin Tanislav
2025-03-08 18:33 ` [RFC PATCH 08/24] dt-bindings: media: i2c: max96714: reflow text Cosmin Tanislav
` (15 subsequent siblings)
22 siblings, 0 replies; 30+ messages in thread
From: Cosmin Tanislav @ 2025-03-08 18:33 UTC (permalink / raw)
Cc: Tomi Valkeinen, Niklas Söderlund, Cosmin Tanislav,
Mauro Carvalho Chehab, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Julien Massot, Catalin Marinas, Will Deacon,
Greg Kroah-Hartman, Liam Girdwood, Mark Brown, Linus Walleij,
Bartosz Golaszewski, Bjorn Andersson, Geert Uytterhoeven,
Dmitry Baryshkov, Heiko Stuebner, Biju Das, Taniya Das,
Nícolas F . R . A . Prado, Eric Biggers, Javier Carrasco,
Ross Burton, Sakari Ailus, Hans Verkuil, Laurent Pinchart,
Umang Jain, Zhi Mao, Kieran Bingham, Dongcheng Yan,
AngeloGioacchino Del Regno, Benjamin Mugnier, Tommaso Merciai,
Dan Carpenter, Ricardo Ribalda, Ihor Matushchak, Laurentiu Palcu,
linux-media, devicetree, linux-kernel, linux-arm-kernel,
linux-staging, linux-gpio, Cosmin Tanislav
Analog Devices is taking responsability for the maintenance of the Maxim
GMSL2/3 devices.
Add myself to the maintainers list and to the device tree bindings.
Signed-off-by: Cosmin Tanislav <demonsingur@gmail.com>
---
Documentation/devicetree/bindings/media/i2c/maxim,max96714.yaml | 1 +
MAINTAINERS | 1 +
2 files changed, 2 insertions(+)
diff --git a/Documentation/devicetree/bindings/media/i2c/maxim,max96714.yaml b/Documentation/devicetree/bindings/media/i2c/maxim,max96714.yaml
index 3ace50e11921..44667b74296c 100644
--- a/Documentation/devicetree/bindings/media/i2c/maxim,max96714.yaml
+++ b/Documentation/devicetree/bindings/media/i2c/maxim,max96714.yaml
@@ -9,6 +9,7 @@ title: Maxim MAX96714 GMSL2 to CSI-2 Deserializer
maintainers:
- Julien Massot <julien.massot@collabora.com>
+ - Cosmin Tanislav <cosmin.tanislav@analog.com>
description:
The MAX96714 deserializer converts GMSL2 serial inputs into MIPI
diff --git a/MAINTAINERS b/MAINTAINERS
index f8ffb7cff9c5..7fcdcc57c8ba 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -14191,6 +14191,7 @@ F: drivers/staging/media/max96712/max96712.c
MAX96714 GMSL2 DESERIALIZER DRIVER
M: Julien Massot <julien.massot@collabora.com>
+M: Cosmin Tanislav <cosmin.tanislav@analog.com>
L: linux-media@vger.kernel.org
S: Maintained
F: Documentation/devicetree/bindings/media/i2c/maxim,max96714.yaml
--
2.48.1
^ permalink raw reply related [flat|nested] 30+ messages in thread* [RFC PATCH 08/24] dt-bindings: media: i2c: max96714: reflow text
2025-03-08 18:33 [RFC PATCH 00/24] media: i2c: add Maxim GMSL2/3 serializer and deserializer drivers Cosmin Tanislav
` (6 preceding siblings ...)
2025-03-08 18:33 ` [RFC PATCH 07/24] dt-bindings: media: i2c: max96714: add myself as maintainer Cosmin Tanislav
@ 2025-03-08 18:33 ` Cosmin Tanislav
2025-03-08 18:33 ` [RFC PATCH 09/24] dt-bindings: media: i2c: max96714: make i2c-gate conditional on compatible Cosmin Tanislav
` (14 subsequent siblings)
22 siblings, 0 replies; 30+ messages in thread
From: Cosmin Tanislav @ 2025-03-08 18:33 UTC (permalink / raw)
Cc: Tomi Valkeinen, Niklas Söderlund, Cosmin Tanislav,
Mauro Carvalho Chehab, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Julien Massot, Catalin Marinas, Will Deacon,
Greg Kroah-Hartman, Liam Girdwood, Mark Brown, Linus Walleij,
Bartosz Golaszewski, Bjorn Andersson, Geert Uytterhoeven,
Dmitry Baryshkov, Heiko Stuebner, Biju Das, Taniya Das,
Nícolas F . R . A . Prado, Eric Biggers, Javier Carrasco,
Ross Burton, Sakari Ailus, Hans Verkuil, Laurent Pinchart,
Umang Jain, Zhi Mao, Kieran Bingham, Dongcheng Yan,
AngeloGioacchino Del Regno, Benjamin Mugnier, Tommaso Merciai,
Dan Carpenter, Ricardo Ribalda, Ihor Matushchak, Laurentiu Palcu,
linux-media, devicetree, linux-kernel, linux-arm-kernel,
linux-staging, linux-gpio, Cosmin Tanislav
This text is using weird line lengths. Fix it.
Signed-off-by: Cosmin Tanislav <demonsingur@gmail.com>
---
.../bindings/media/i2c/maxim,max96714.yaml | 15 +++++++--------
1 file changed, 7 insertions(+), 8 deletions(-)
diff --git a/Documentation/devicetree/bindings/media/i2c/maxim,max96714.yaml b/Documentation/devicetree/bindings/media/i2c/maxim,max96714.yaml
index 44667b74296c..2f453189338f 100644
--- a/Documentation/devicetree/bindings/media/i2c/maxim,max96714.yaml
+++ b/Documentation/devicetree/bindings/media/i2c/maxim,max96714.yaml
@@ -12,14 +12,13 @@ maintainers:
- Cosmin Tanislav <cosmin.tanislav@analog.com>
description:
- The MAX96714 deserializer converts GMSL2 serial inputs into MIPI
- CSI-2 D-PHY formatted output. The device allows the GMSL2 link to
- simultaneously transmit bidirectional control-channel data while forward
- video transmissions are in progress. The MAX96714 can connect to one
- remotely located serializer using industry-standard coax or STP
- interconnects. The device cans operate in pixel or tunnel mode. In pixel mode
- the MAX96714 can select individual video stream, while the tunnel mode forward all
- the MIPI data received by the serializer.
+ The MAX96714 deserializer converts GMSL2 serial inputs into MIPI CSI-2 D-PHY
+ formatted output. The device allows the GMSL2 link to simultaneously transmit
+ bidirectional control-channel data while forward video transmissions are in
+ progress. The MAX96714 can connect to one remotely located serializer using
+ industry-standard coax or STP interconnects. The device cans operate in pixel
+ or tunnel mode. In pixel mode the MAX96714 can select individual video stream,
+ while the tunnel mode forward all the MIPI data received by the serializer.
The GMSL2 serial link operates at a fixed rate of 3Gbps or 6Gbps in the
forward direction and 187.5Mbps in the reverse direction.
--
2.48.1
^ permalink raw reply related [flat|nested] 30+ messages in thread* [RFC PATCH 09/24] dt-bindings: media: i2c: max96714: make i2c-gate conditional on compatible
2025-03-08 18:33 [RFC PATCH 00/24] media: i2c: add Maxim GMSL2/3 serializer and deserializer drivers Cosmin Tanislav
` (7 preceding siblings ...)
2025-03-08 18:33 ` [RFC PATCH 08/24] dt-bindings: media: i2c: max96714: reflow text Cosmin Tanislav
@ 2025-03-08 18:33 ` Cosmin Tanislav
2025-03-08 20:44 ` Rob Herring (Arm)
2025-03-10 12:32 ` Rob Herring
2025-03-08 18:33 ` [RFC PATCH 10/24] dt-bindings: media: i2c: max96714: make ports " Cosmin Tanislav
` (13 subsequent siblings)
22 siblings, 2 replies; 30+ messages in thread
From: Cosmin Tanislav @ 2025-03-08 18:33 UTC (permalink / raw)
Cc: Tomi Valkeinen, Niklas Söderlund, Cosmin Tanislav,
Mauro Carvalho Chehab, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Julien Massot, Catalin Marinas, Will Deacon,
Greg Kroah-Hartman, Liam Girdwood, Mark Brown, Linus Walleij,
Bartosz Golaszewski, Bjorn Andersson, Geert Uytterhoeven,
Dmitry Baryshkov, Heiko Stuebner, Biju Das, Taniya Das,
Nícolas F . R . A . Prado, Eric Biggers, Javier Carrasco,
Ross Burton, Sakari Ailus, Hans Verkuil, Laurent Pinchart,
Umang Jain, Zhi Mao, Kieran Bingham, Dongcheng Yan,
AngeloGioacchino Del Regno, Benjamin Mugnier, Tommaso Merciai,
Dan Carpenter, Ricardo Ribalda, Ihor Matushchak, Laurentiu Palcu,
linux-media, devicetree, linux-kernel, linux-arm-kernel,
linux-staging, linux-gpio, Cosmin Tanislav
Devices to be added in following patches don't use I2C gate.
Make this property conditional on the compatible strings.
Signed-off-by: Cosmin Tanislav <demonsingur@gmail.com>
---
.../bindings/media/i2c/maxim,max96714.yaml | 21 ++++++++++++-------
1 file changed, 13 insertions(+), 8 deletions(-)
diff --git a/Documentation/devicetree/bindings/media/i2c/maxim,max96714.yaml b/Documentation/devicetree/bindings/media/i2c/maxim,max96714.yaml
index 2f453189338f..d0a2aaf7df9c 100644
--- a/Documentation/devicetree/bindings/media/i2c/maxim,max96714.yaml
+++ b/Documentation/devicetree/bindings/media/i2c/maxim,max96714.yaml
@@ -84,14 +84,6 @@ properties:
required:
- port@1
- i2c-gate:
- $ref: /schemas/i2c/i2c-gate.yaml
- unevaluatedProperties: false
- description:
- The MAX96714 will pass through and forward the I2C requests from the
- incoming I2C bus over the GMSL2 link. Therefore it supports an i2c-gate
- subnode to configure a serializer.
-
port0-poc-supply:
description: Regulator providing Power over Coax for the GMSL port
@@ -101,6 +93,19 @@ required:
- ports
additionalProperties: false
+allOf:
+ - if:
+ properties:
+ compatible:
+ contains:
+ enum:
+ - maxim,max96714
+ - maxim,max96714f
+ then:
+ properties:
+ i2c-gate:
+ $ref: /schemas/i2c/i2c-gate.yaml
+ unevaluatedProperties: false
examples:
- |
--
2.48.1
^ permalink raw reply related [flat|nested] 30+ messages in thread* Re: [RFC PATCH 09/24] dt-bindings: media: i2c: max96714: make i2c-gate conditional on compatible
2025-03-08 18:33 ` [RFC PATCH 09/24] dt-bindings: media: i2c: max96714: make i2c-gate conditional on compatible Cosmin Tanislav
@ 2025-03-08 20:44 ` Rob Herring (Arm)
2025-03-10 12:32 ` Rob Herring
1 sibling, 0 replies; 30+ messages in thread
From: Rob Herring (Arm) @ 2025-03-08 20:44 UTC (permalink / raw)
To: Cosmin Tanislav
Cc: AngeloGioacchino Del Regno, Geert Uytterhoeven, Heiko Stuebner,
Dan Carpenter, Cosmin Tanislav, linux-kernel, Ross Burton,
Ricardo Ribalda, Krzysztof Kozlowski, Will Deacon,
Bjorn Andersson, Dmitry Baryshkov, Mauro Carvalho Chehab,
linux-arm-kernel, Javier Carrasco, Niklas Söderlund,
Bartosz Golaszewski, Tomi Valkeinen, Julien Massot, linux-gpio,
Catalin Marinas, Eric Biggers, Conor Dooley, Sakari Ailus,
Laurent Pinchart, Ihor Matushchak, Taniya Das, Mark Brown,
devicetree, Kieran Bingham, Nícolas F . R . A . Prado,
linux-staging, Biju Das, linux-media, Tommaso Merciai,
Linus Walleij, Laurentiu Palcu, Umang Jain, Dongcheng Yan,
Benjamin Mugnier, Zhi Mao, Greg Kroah-Hartman, Liam Girdwood,
Hans Verkuil
On Sat, 08 Mar 2025 20:33:38 +0200, Cosmin Tanislav wrote:
> Devices to be added in following patches don't use I2C gate.
>
> Make this property conditional on the compatible strings.
>
> Signed-off-by: Cosmin Tanislav <demonsingur@gmail.com>
> ---
> .../bindings/media/i2c/maxim,max96714.yaml | 21 ++++++++++++-------
> 1 file changed, 13 insertions(+), 8 deletions(-)
>
My bot found errors running 'make dt_binding_check' on your patch:
yamllint warnings/errors:
dtschema/dtc warnings/errors:
/builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/media/i2c/maxim,max96714.example.dtb: deserializer@28: 'i2c-gate' does not match any of the regexes: 'pinctrl-[0-9]+'
from schema $id: http://devicetree.org/schemas/media/i2c/maxim,max96714.yaml#
doc reference errors (make refcheckdocs):
See https://patchwork.ozlabs.org/project/devicetree-bindings/patch/20250308183410.3013996-10-demonsingur@gmail.com
The base for the series is generally the latest rc1. A different dependency
should be noted in *this* patch.
If you already ran 'make dt_binding_check' and didn't see the above
error(s), then make sure 'yamllint' is installed and dt-schema is up to
date:
pip3 install dtschema --upgrade
Please check and re-submit after running the above command yourself. Note
that DT_SCHEMA_FILES can be set to your schema file to speed up checking
your schema. However, it must be unset to test all examples with your schema.
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [RFC PATCH 09/24] dt-bindings: media: i2c: max96714: make i2c-gate conditional on compatible
2025-03-08 18:33 ` [RFC PATCH 09/24] dt-bindings: media: i2c: max96714: make i2c-gate conditional on compatible Cosmin Tanislav
2025-03-08 20:44 ` Rob Herring (Arm)
@ 2025-03-10 12:32 ` Rob Herring
2025-03-10 12:52 ` Cosmin Tanislav
1 sibling, 1 reply; 30+ messages in thread
From: Rob Herring @ 2025-03-10 12:32 UTC (permalink / raw)
To: Cosmin Tanislav
Cc: Tomi Valkeinen, Niklas Söderlund, Cosmin Tanislav,
Mauro Carvalho Chehab, Krzysztof Kozlowski, Conor Dooley,
Julien Massot, Catalin Marinas, Will Deacon, Greg Kroah-Hartman,
Liam Girdwood, Mark Brown, Linus Walleij, Bartosz Golaszewski,
Bjorn Andersson, Geert Uytterhoeven, Dmitry Baryshkov,
Heiko Stuebner, Biju Das, Taniya Das,
Nícolas F . R . A . Prado, Eric Biggers, Javier Carrasco,
Ross Burton, Sakari Ailus, Hans Verkuil, Laurent Pinchart,
Umang Jain, Zhi Mao, Kieran Bingham, Dongcheng Yan,
AngeloGioacchino Del Regno, Benjamin Mugnier, Tommaso Merciai,
Dan Carpenter, Ricardo Ribalda, Ihor Matushchak, Laurentiu Palcu,
linux-media, devicetree, linux-kernel, linux-arm-kernel,
linux-staging, linux-gpio
On Sat, Mar 08, 2025 at 08:33:38PM +0200, Cosmin Tanislav wrote:
> Devices to be added in following patches don't use I2C gate.
>
> Make this property conditional on the compatible strings.
>
> Signed-off-by: Cosmin Tanislav <demonsingur@gmail.com>
> ---
> .../bindings/media/i2c/maxim,max96714.yaml | 21 ++++++++++++-------
> 1 file changed, 13 insertions(+), 8 deletions(-)
>
> diff --git a/Documentation/devicetree/bindings/media/i2c/maxim,max96714.yaml b/Documentation/devicetree/bindings/media/i2c/maxim,max96714.yaml
> index 2f453189338f..d0a2aaf7df9c 100644
> --- a/Documentation/devicetree/bindings/media/i2c/maxim,max96714.yaml
> +++ b/Documentation/devicetree/bindings/media/i2c/maxim,max96714.yaml
> @@ -84,14 +84,6 @@ properties:
> required:
> - port@1
>
> - i2c-gate:
> - $ref: /schemas/i2c/i2c-gate.yaml
> - unevaluatedProperties: false
> - description:
> - The MAX96714 will pass through and forward the I2C requests from the
> - incoming I2C bus over the GMSL2 link. Therefore it supports an i2c-gate
> - subnode to configure a serializer.
> -
> port0-poc-supply:
> description: Regulator providing Power over Coax for the GMSL port
>
> @@ -101,6 +93,19 @@ required:
> - ports
>
> additionalProperties: false
> +allOf:
> + - if:
> + properties:
> + compatible:
> + contains:
> + enum:
> + - maxim,max96714
> + - maxim,max96714f
> + then:
> + properties:
> + i2c-gate:
Leave the original definition, invert the 'if', and here you just need:
i2c-gate: false
> + $ref: /schemas/i2c/i2c-gate.yaml
> + unevaluatedProperties: false
>
> examples:
> - |
> --
> 2.48.1
>
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [RFC PATCH 09/24] dt-bindings: media: i2c: max96714: make i2c-gate conditional on compatible
2025-03-10 12:32 ` Rob Herring
@ 2025-03-10 12:52 ` Cosmin Tanislav
0 siblings, 0 replies; 30+ messages in thread
From: Cosmin Tanislav @ 2025-03-10 12:52 UTC (permalink / raw)
To: Rob Herring
Cc: Tomi Valkeinen, Niklas Söderlund, Cosmin Tanislav,
Mauro Carvalho Chehab, Krzysztof Kozlowski, Conor Dooley,
Julien Massot, Catalin Marinas, Will Deacon, Greg Kroah-Hartman,
Liam Girdwood, Mark Brown, Linus Walleij, Bartosz Golaszewski,
Bjorn Andersson, Geert Uytterhoeven, Dmitry Baryshkov,
Heiko Stuebner, Biju Das, Taniya Das,
Nícolas F . R . A . Prado, Eric Biggers, Javier Carrasco,
Ross Burton, Sakari Ailus, Hans Verkuil, Laurent Pinchart,
Umang Jain, Zhi Mao, Kieran Bingham, Dongcheng Yan,
AngeloGioacchino Del Regno, Benjamin Mugnier, Tommaso Merciai,
Dan Carpenter, Ricardo Ribalda, Ihor Matushchak, Laurentiu Palcu,
linux-media, devicetree, linux-kernel, linux-arm-kernel,
linux-staging, linux-gpio
On 3/10/25 2:32 PM, Rob Herring wrote:
> On Sat, Mar 08, 2025 at 08:33:38PM +0200, Cosmin Tanislav wrote:
>> Devices to be added in following patches don't use I2C gate.
>>
>> Make this property conditional on the compatible strings.
>>
>> Signed-off-by: Cosmin Tanislav <demonsingur@gmail.com>
>> ---
>> .../bindings/media/i2c/maxim,max96714.yaml | 21 ++++++++++++-------
>> 1 file changed, 13 insertions(+), 8 deletions(-)
>>
>> diff --git a/Documentation/devicetree/bindings/media/i2c/maxim,max96714.yaml b/Documentation/devicetree/bindings/media/i2c/maxim,max96714.yaml
>> index 2f453189338f..d0a2aaf7df9c 100644
>> --- a/Documentation/devicetree/bindings/media/i2c/maxim,max96714.yaml
>> +++ b/Documentation/devicetree/bindings/media/i2c/maxim,max96714.yaml
>> @@ -84,14 +84,6 @@ properties:
>> required:
>> - port@1
>>
>> - i2c-gate:
>> - $ref: /schemas/i2c/i2c-gate.yaml
>> - unevaluatedProperties: false
>> - description:
>> - The MAX96714 will pass through and forward the I2C requests from the
>> - incoming I2C bus over the GMSL2 link. Therefore it supports an i2c-gate
>> - subnode to configure a serializer.
>> -
>> port0-poc-supply:
>> description: Regulator providing Power over Coax for the GMSL port
>>
>> @@ -101,6 +93,19 @@ required:
>> - ports
>>
>> additionalProperties: false
>> +allOf:
>> + - if:
>> + properties:
>> + compatible:
>> + contains:
>> + enum:
>> + - maxim,max96714
>> + - maxim,max96714f
>> + then:
>> + properties:
>> + i2c-gate:
>
> Leave the original definition, invert the 'if', and here you just need:
>
> i2c-gate: false
>
Hi Rob.
Thanks for your comments.
After noticing that my dt-schema validation scripts are failing (because
of the jsonschema version incompatibility), I fixed them and then fixed
all the issues and sent a V2 where I introduce a separate file for these
bindings since they all have a different number of ports compared to the
max96714 one.
So the V1 of these patches have been superseded.
>> + $ref: /schemas/i2c/i2c-gate.yaml
>> + unevaluatedProperties: false
>>
>> examples:
>> - |
>> --
>> 2.48.1
>>
^ permalink raw reply [flat|nested] 30+ messages in thread
* [RFC PATCH 10/24] dt-bindings: media: i2c: max96714: make ports conditional on compatible
2025-03-08 18:33 [RFC PATCH 00/24] media: i2c: add Maxim GMSL2/3 serializer and deserializer drivers Cosmin Tanislav
` (8 preceding siblings ...)
2025-03-08 18:33 ` [RFC PATCH 09/24] dt-bindings: media: i2c: max96714: make i2c-gate conditional on compatible Cosmin Tanislav
@ 2025-03-08 18:33 ` Cosmin Tanislav
2025-03-08 18:33 ` [RFC PATCH 11/24] dt-bindings: media: i2c: max96714: make supply " Cosmin Tanislav
` (12 subsequent siblings)
22 siblings, 0 replies; 30+ messages in thread
From: Cosmin Tanislav @ 2025-03-08 18:33 UTC (permalink / raw)
Cc: Tomi Valkeinen, Niklas Söderlund, Cosmin Tanislav,
Mauro Carvalho Chehab, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Julien Massot, Catalin Marinas, Will Deacon,
Greg Kroah-Hartman, Liam Girdwood, Mark Brown, Linus Walleij,
Bartosz Golaszewski, Bjorn Andersson, Geert Uytterhoeven,
Dmitry Baryshkov, Heiko Stuebner, Biju Das, Taniya Das,
Nícolas F . R . A . Prado, Eric Biggers, Javier Carrasco,
Ross Burton, Sakari Ailus, Hans Verkuil, Laurent Pinchart,
Umang Jain, Zhi Mao, Kieran Bingham, Dongcheng Yan,
AngeloGioacchino Del Regno, Benjamin Mugnier, Tommaso Merciai,
Dan Carpenter, Ricardo Ribalda, Ihor Matushchak, Laurentiu Palcu,
linux-media, devicetree, linux-kernel, linux-arm-kernel,
linux-staging, linux-gpio, Cosmin Tanislav
Devices to be added in following patches have more input/output ports.
Make this property conditional on the compatible strings.
Signed-off-by: Cosmin Tanislav <demonsingur@gmail.com>
---
.../bindings/media/i2c/maxim,max96714.yaml | 90 ++++++++++---------
1 file changed, 46 insertions(+), 44 deletions(-)
diff --git a/Documentation/devicetree/bindings/media/i2c/maxim,max96714.yaml b/Documentation/devicetree/bindings/media/i2c/maxim,max96714.yaml
index d0a2aaf7df9c..f0ae069c93b5 100644
--- a/Documentation/devicetree/bindings/media/i2c/maxim,max96714.yaml
+++ b/Documentation/devicetree/bindings/media/i2c/maxim,max96714.yaml
@@ -41,56 +41,12 @@ properties:
description:
Specifier for the GPIO connected to the PWDNB pin.
- ports:
- $ref: /schemas/graph.yaml#/properties/ports
-
- properties:
- port@0:
- $ref: /schemas/graph.yaml#/properties/port
- unevaluatedProperties: false
- description: GMSL Input
- properties:
- endpoint:
- $ref: /schemas/media/video-interfaces.yaml#
- unevaluatedProperties: false
- description:
- Endpoint for GMSL2-Link port.
-
- port@1:
- $ref: /schemas/graph.yaml#/$defs/port-base
- unevaluatedProperties: false
- description: CSI-2 Output port
-
- properties:
- endpoint:
- $ref: /schemas/media/video-interfaces.yaml#
- unevaluatedProperties: false
-
- properties:
- data-lanes:
- minItems: 1
- maxItems: 4
-
- lane-polarities:
- minItems: 1
- maxItems: 5
-
- link-frequencies:
- maxItems: 1
-
- required:
- - data-lanes
-
- required:
- - port@1
-
port0-poc-supply:
description: Regulator providing Power over Coax for the GMSL port
required:
- compatible
- reg
- - ports
additionalProperties: false
allOf:
@@ -102,11 +58,57 @@ allOf:
- maxim,max96714
- maxim,max96714f
then:
+ required:
+ - ports
+
properties:
i2c-gate:
$ref: /schemas/i2c/i2c-gate.yaml
unevaluatedProperties: false
+ ports:
+ $ref: /schemas/graph.yaml#/properties/ports
+
+ properties:
+ port@0:
+ $ref: /schemas/graph.yaml#/properties/port
+ unevaluatedProperties: false
+ description: GMSL Input
+ properties:
+ endpoint:
+ $ref: /schemas/media/video-interfaces.yaml#
+ unevaluatedProperties: false
+ description:
+ Endpoint for GMSL2-Link port.
+
+ port@1:
+ $ref: /schemas/graph.yaml#/$defs/port-base
+ unevaluatedProperties: false
+ description: CSI-2 Output port
+
+ properties:
+ endpoint:
+ $ref: /schemas/media/video-interfaces.yaml#
+ unevaluatedProperties: false
+
+ properties:
+ data-lanes:
+ minItems: 1
+ maxItems: 4
+
+ lane-polarities:
+ minItems: 1
+ maxItems: 5
+
+ link-frequencies:
+ maxItems: 1
+
+ required:
+ - data-lanes
+
+ required:
+ - port@1
+
examples:
- |
#include <dt-bindings/gpio/gpio.h>
--
2.48.1
^ permalink raw reply related [flat|nested] 30+ messages in thread* [RFC PATCH 11/24] dt-bindings: media: i2c: max96714: make supply conditional on compatible
2025-03-08 18:33 [RFC PATCH 00/24] media: i2c: add Maxim GMSL2/3 serializer and deserializer drivers Cosmin Tanislav
` (9 preceding siblings ...)
2025-03-08 18:33 ` [RFC PATCH 10/24] dt-bindings: media: i2c: max96714: make ports " Cosmin Tanislav
@ 2025-03-08 18:33 ` Cosmin Tanislav
2025-03-08 18:33 ` [RFC PATCH 12/24] dt-bindings: media: i2c: max96714: add support for MAX9296A Cosmin Tanislav
` (11 subsequent siblings)
22 siblings, 0 replies; 30+ messages in thread
From: Cosmin Tanislav @ 2025-03-08 18:33 UTC (permalink / raw)
Cc: Tomi Valkeinen, Niklas Söderlund, Cosmin Tanislav,
Mauro Carvalho Chehab, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Julien Massot, Catalin Marinas, Will Deacon,
Greg Kroah-Hartman, Liam Girdwood, Mark Brown, Linus Walleij,
Bartosz Golaszewski, Bjorn Andersson, Geert Uytterhoeven,
Dmitry Baryshkov, Heiko Stuebner, Biju Das, Taniya Das,
Nícolas F . R . A . Prado, Eric Biggers, Javier Carrasco,
Ross Burton, Sakari Ailus, Hans Verkuil, Laurent Pinchart,
Umang Jain, Zhi Mao, Kieran Bingham, Dongcheng Yan,
AngeloGioacchino Del Regno, Benjamin Mugnier, Tommaso Merciai,
Dan Carpenter, Ricardo Ribalda, Ihor Matushchak, Laurentiu Palcu,
linux-media, devicetree, linux-kernel, linux-arm-kernel,
linux-staging, linux-gpio, Cosmin Tanislav
Devices to be added in following patches have more input ports, and,
implicitly, more POC supplies.
Make this property conditional on the compatible strings.
Signed-off-by: Cosmin Tanislav <demonsingur@gmail.com>
---
.../devicetree/bindings/media/i2c/maxim,max96714.yaml | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/Documentation/devicetree/bindings/media/i2c/maxim,max96714.yaml b/Documentation/devicetree/bindings/media/i2c/maxim,max96714.yaml
index f0ae069c93b5..5bbd36c55ab4 100644
--- a/Documentation/devicetree/bindings/media/i2c/maxim,max96714.yaml
+++ b/Documentation/devicetree/bindings/media/i2c/maxim,max96714.yaml
@@ -41,9 +41,6 @@ properties:
description:
Specifier for the GPIO connected to the PWDNB pin.
- port0-poc-supply:
- description: Regulator providing Power over Coax for the GMSL port
-
required:
- compatible
- reg
@@ -62,6 +59,9 @@ allOf:
- ports
properties:
+ port0-poc-supply:
+ description: Regulator providing Power over Coax for the GMSL port
+
i2c-gate:
$ref: /schemas/i2c/i2c-gate.yaml
unevaluatedProperties: false
--
2.48.1
^ permalink raw reply related [flat|nested] 30+ messages in thread* [RFC PATCH 12/24] dt-bindings: media: i2c: max96714: add support for MAX9296A
2025-03-08 18:33 [RFC PATCH 00/24] media: i2c: add Maxim GMSL2/3 serializer and deserializer drivers Cosmin Tanislav
` (10 preceding siblings ...)
2025-03-08 18:33 ` [RFC PATCH 11/24] dt-bindings: media: i2c: max96714: make supply " Cosmin Tanislav
@ 2025-03-08 18:33 ` Cosmin Tanislav
2025-03-08 18:33 ` [RFC PATCH 13/24] dt-bindings: media: i2c: max96714: add support for MAX96716A Cosmin Tanislav
` (10 subsequent siblings)
22 siblings, 0 replies; 30+ messages in thread
From: Cosmin Tanislav @ 2025-03-08 18:33 UTC (permalink / raw)
Cc: Tomi Valkeinen, Niklas Söderlund, Cosmin Tanislav,
Mauro Carvalho Chehab, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Julien Massot, Catalin Marinas, Will Deacon,
Greg Kroah-Hartman, Liam Girdwood, Mark Brown, Linus Walleij,
Bartosz Golaszewski, Bjorn Andersson, Geert Uytterhoeven,
Dmitry Baryshkov, Heiko Stuebner, Biju Das, Taniya Das,
Nícolas F . R . A . Prado, Eric Biggers, Javier Carrasco,
Ross Burton, Sakari Ailus, Hans Verkuil, Laurent Pinchart,
Umang Jain, Zhi Mao, Kieran Bingham, Dongcheng Yan,
AngeloGioacchino Del Regno, Benjamin Mugnier, Tommaso Merciai,
Dan Carpenter, Ricardo Ribalda, Ihor Matushchak, Laurentiu Palcu,
linux-media, devicetree, linux-kernel, linux-arm-kernel,
linux-staging, linux-gpio, Cosmin Tanislav
MAX9296A is an older variant of the MAX96714 which doesn't support
tunnel mode, but has two GMSL2 links.
Signed-off-by: Cosmin Tanislav <demonsingur@gmail.com>
---
.../bindings/media/i2c/maxim,max96714.yaml | 87 +++++++++++++++++++
1 file changed, 87 insertions(+)
diff --git a/Documentation/devicetree/bindings/media/i2c/maxim,max96714.yaml b/Documentation/devicetree/bindings/media/i2c/maxim,max96714.yaml
index 5bbd36c55ab4..9c6c79a770ed 100644
--- a/Documentation/devicetree/bindings/media/i2c/maxim,max96714.yaml
+++ b/Documentation/devicetree/bindings/media/i2c/maxim,max96714.yaml
@@ -22,11 +22,14 @@ description:
The GMSL2 serial link operates at a fixed rate of 3Gbps or 6Gbps in the
forward direction and 187.5Mbps in the reverse direction.
+
MAX96714F only supports a fixed rate of 3Gbps in the forward direction.
+ MAX9296A only supports pixel mode, and has two GMSL2 links.
properties:
compatible:
oneOf:
+ - const: maxim,max9296a
- const: maxim,max96714f
- items:
- enum:
@@ -109,6 +112,90 @@ allOf:
required:
- port@1
+ - if:
+ properties:
+ compatible:
+ contains:
+ enum:
+ - maxim,max9296a
+ then:
+ allOf:
+ - $ref: /schemas/i2c/i2c-atr.yaml#
+
+ properties:
+ i2c-alias-pool:
+ maxItems: 2
+
+ i2c-atr:
+ patternProperties:
+ '^i2c@[0-1]$':
+ $ref: /schemas/i2c/i2c-controller.yaml#
+ properties:
+ reg:
+ items:
+ min: 0
+ max: 1
+
+ - if:
+ properties:
+ compatible:
+ contains:
+ enum:
+ - maxim,max9296a
+ then:
+ properties:
+ port0-poc-supply:
+ description: Regulator providing Power over Coax for GMSL port 0
+
+ port1-poc-supply:
+ description: Regulator providing Power over Coax for GMSL port 1
+
+ ports:
+ $ref: /schemas/graph.yaml#/properties/ports
+
+ patternProperties:
+ port@[0-1]:
+ $ref: /schemas/graph.yaml#/properties/port
+ unevaluatedProperties: false
+ description: GMSL Input
+ properties:
+ endpoint:
+ $ref: /schemas/media/video-interfaces.yaml#
+ unevaluatedProperties: false
+ description:
+ Endpoint for GMSL2-Link port.
+
+ port@[2-3]:
+ $ref: /schemas/graph.yaml#/$defs/port-base
+ unevaluatedProperties: false
+ description: CSI-2 Output port
+
+ properties:
+ endpoint:
+ $ref: /schemas/media/video-interfaces.yaml#
+ unevaluatedProperties: false
+
+ properties:
+ data-lanes:
+ minItems: 1
+ maxItems: 4
+
+ lane-polarities:
+ minItems: 1
+ maxItems: 5
+
+ link-frequencies:
+ maxItems: 1
+
+ required:
+ - data-lanes
+
+ anyOf:
+ - required:
+ - port@2
+ - required:
+ - port@3
+
examples:
- |
#include <dt-bindings/gpio/gpio.h>
--
2.48.1
^ permalink raw reply related [flat|nested] 30+ messages in thread* [RFC PATCH 13/24] dt-bindings: media: i2c: max96714: add support for MAX96716A
2025-03-08 18:33 [RFC PATCH 00/24] media: i2c: add Maxim GMSL2/3 serializer and deserializer drivers Cosmin Tanislav
` (11 preceding siblings ...)
2025-03-08 18:33 ` [RFC PATCH 12/24] dt-bindings: media: i2c: max96714: add support for MAX9296A Cosmin Tanislav
@ 2025-03-08 18:33 ` Cosmin Tanislav
2025-03-08 18:33 ` [RFC PATCH 14/24] dt-bindings: media: i2c: max96714: add support for MAX96792A Cosmin Tanislav
` (9 subsequent siblings)
22 siblings, 0 replies; 30+ messages in thread
From: Cosmin Tanislav @ 2025-03-08 18:33 UTC (permalink / raw)
Cc: Tomi Valkeinen, Niklas Söderlund, Cosmin Tanislav,
Mauro Carvalho Chehab, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Julien Massot, Catalin Marinas, Will Deacon,
Greg Kroah-Hartman, Liam Girdwood, Mark Brown, Linus Walleij,
Bartosz Golaszewski, Bjorn Andersson, Geert Uytterhoeven,
Dmitry Baryshkov, Heiko Stuebner, Biju Das, Taniya Das,
Nícolas F . R . A . Prado, Eric Biggers, Javier Carrasco,
Ross Burton, Sakari Ailus, Hans Verkuil, Laurent Pinchart,
Umang Jain, Zhi Mao, Kieran Bingham, Dongcheng Yan,
AngeloGioacchino Del Regno, Benjamin Mugnier, Tommaso Merciai,
Dan Carpenter, Ricardo Ribalda, Ihor Matushchak, Laurentiu Palcu,
linux-media, devicetree, linux-kernel, linux-arm-kernel,
linux-staging, linux-gpio, Cosmin Tanislav
MAX96716A is a newer variant of the MAX9296A which supports both pixel
and tunnel mode.
Signed-off-by: Cosmin Tanislav <demonsingur@gmail.com>
---
.../bindings/media/i2c/maxim,max96714.yaml | 21 +++++++++++++++++++
1 file changed, 21 insertions(+)
diff --git a/Documentation/devicetree/bindings/media/i2c/maxim,max96714.yaml b/Documentation/devicetree/bindings/media/i2c/maxim,max96714.yaml
index 9c6c79a770ed..d4055ecf673f 100644
--- a/Documentation/devicetree/bindings/media/i2c/maxim,max96714.yaml
+++ b/Documentation/devicetree/bindings/media/i2c/maxim,max96714.yaml
@@ -25,12 +25,14 @@ description:
MAX96714F only supports a fixed rate of 3Gbps in the forward direction.
MAX9296A only supports pixel mode, and has two GMSL2 links.
+ MAX96716A supports both tunnel and pixel mode, and has two GMSL2 links.
properties:
compatible:
oneOf:
- const: maxim,max9296a
- const: maxim,max96714f
+ - const: maxim,max96716a
- items:
- enum:
- maxim,max96714
@@ -136,12 +138,31 @@ allOf:
min: 0
max: 1
+ - if:
+ properties:
+ compatible:
+ contains:
+ const: maxim,max96716a
+ then:
+ properties:
+ i2c-mux:
+ $ref: /schemas/i2c/i2c-mux.yaml#
+ patternProperties:
+ '^i2c@[0-1]$':
+ $ref: /schemas/i2c/i2c-controller.yaml#
+ properties:
+ reg:
+ items:
+ min: 0
+ max: 1
+
- if:
properties:
compatible:
contains:
enum:
- maxim,max9296a
+ - maxim,max96716a
then:
properties:
port0-poc-supply:
--
2.48.1
^ permalink raw reply related [flat|nested] 30+ messages in thread* [RFC PATCH 14/24] dt-bindings: media: i2c: max96714: add support for MAX96792A
2025-03-08 18:33 [RFC PATCH 00/24] media: i2c: add Maxim GMSL2/3 serializer and deserializer drivers Cosmin Tanislav
` (12 preceding siblings ...)
2025-03-08 18:33 ` [RFC PATCH 13/24] dt-bindings: media: i2c: max96714: add support for MAX96716A Cosmin Tanislav
@ 2025-03-08 18:33 ` Cosmin Tanislav
2025-03-08 18:33 ` [RFC PATCH 15/24] dt-bindings: media: i2c: max96712: add myself as maintainer Cosmin Tanislav
` (8 subsequent siblings)
22 siblings, 0 replies; 30+ messages in thread
From: Cosmin Tanislav @ 2025-03-08 18:33 UTC (permalink / raw)
Cc: Tomi Valkeinen, Niklas Söderlund, Cosmin Tanislav,
Mauro Carvalho Chehab, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Julien Massot, Catalin Marinas, Will Deacon,
Greg Kroah-Hartman, Liam Girdwood, Mark Brown, Linus Walleij,
Bartosz Golaszewski, Bjorn Andersson, Geert Uytterhoeven,
Dmitry Baryshkov, Heiko Stuebner, Biju Das, Taniya Das,
Nícolas F . R . A . Prado, Eric Biggers, Javier Carrasco,
Ross Burton, Sakari Ailus, Hans Verkuil, Laurent Pinchart,
Umang Jain, Zhi Mao, Kieran Bingham, Dongcheng Yan,
AngeloGioacchino Del Regno, Benjamin Mugnier, Tommaso Merciai,
Dan Carpenter, Ricardo Ribalda, Ihor Matushchak, Laurentiu Palcu,
linux-media, devicetree, linux-kernel, linux-arm-kernel,
linux-staging, linux-gpio, Cosmin Tanislav
MAX96792A is a newer variant of the MAX96716A, which supports GMSL3
links.
Signed-off-by: Cosmin Tanislav <demonsingur@gmail.com>
---
.../devicetree/bindings/media/i2c/maxim,max96714.yaml | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/Documentation/devicetree/bindings/media/i2c/maxim,max96714.yaml b/Documentation/devicetree/bindings/media/i2c/maxim,max96714.yaml
index d4055ecf673f..a392da39c154 100644
--- a/Documentation/devicetree/bindings/media/i2c/maxim,max96714.yaml
+++ b/Documentation/devicetree/bindings/media/i2c/maxim,max96714.yaml
@@ -26,6 +26,7 @@ description:
MAX96714F only supports a fixed rate of 3Gbps in the forward direction.
MAX9296A only supports pixel mode, and has two GMSL2 links.
MAX96716A supports both tunnel and pixel mode, and has two GMSL2 links.
+ MAX96792A supports both tunnel and pixel mode, and has two GMSL3 links.
properties:
compatible:
@@ -33,6 +34,7 @@ properties:
- const: maxim,max9296a
- const: maxim,max96714f
- const: maxim,max96716a
+ - const: maxim,max96792a
- items:
- enum:
- maxim,max96714
@@ -120,6 +122,7 @@ allOf:
contains:
enum:
- maxim,max9296a
+ - maxim,max96792a
then:
allOf:
- $ref: /schemas/i2c/i2c-atr.yaml#
@@ -163,6 +166,7 @@ allOf:
enum:
- maxim,max9296a
- maxim,max96716a
+ - maxim,max96792a
then:
properties:
port0-poc-supply:
--
2.48.1
^ permalink raw reply related [flat|nested] 30+ messages in thread* [RFC PATCH 15/24] dt-bindings: media: i2c: max96712: add myself as maintainer
2025-03-08 18:33 [RFC PATCH 00/24] media: i2c: add Maxim GMSL2/3 serializer and deserializer drivers Cosmin Tanislav
` (13 preceding siblings ...)
2025-03-08 18:33 ` [RFC PATCH 14/24] dt-bindings: media: i2c: max96714: add support for MAX96792A Cosmin Tanislav
@ 2025-03-08 18:33 ` Cosmin Tanislav
2025-03-08 18:33 ` [RFC PATCH 16/24] dt-bindings: media: i2c: max96712: use pattern properties for input ports Cosmin Tanislav
` (7 subsequent siblings)
22 siblings, 0 replies; 30+ messages in thread
From: Cosmin Tanislav @ 2025-03-08 18:33 UTC (permalink / raw)
Cc: Tomi Valkeinen, Niklas Söderlund, Cosmin Tanislav,
Mauro Carvalho Chehab, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Julien Massot, Catalin Marinas, Will Deacon,
Greg Kroah-Hartman, Liam Girdwood, Mark Brown, Linus Walleij,
Bartosz Golaszewski, Bjorn Andersson, Geert Uytterhoeven,
Dmitry Baryshkov, Heiko Stuebner, Biju Das, Taniya Das,
Nícolas F . R . A . Prado, Eric Biggers, Javier Carrasco,
Ross Burton, Sakari Ailus, Hans Verkuil, Laurent Pinchart,
Umang Jain, Zhi Mao, Kieran Bingham, Dongcheng Yan,
AngeloGioacchino Del Regno, Benjamin Mugnier, Tommaso Merciai,
Dan Carpenter, Ricardo Ribalda, Ihor Matushchak, Laurentiu Palcu,
linux-media, devicetree, linux-kernel, linux-arm-kernel,
linux-staging, linux-gpio, Cosmin Tanislav
Analog Devices is taking responsability for the maintenance of the Maxim
GMSL2/3 devices.
Add myself to the maintainers list and to the device tree bindings.
Signed-off-by: Cosmin Tanislav <demonsingur@gmail.com>
---
Documentation/devicetree/bindings/media/i2c/maxim,max96712.yaml | 1 +
MAINTAINERS | 1 +
2 files changed, 2 insertions(+)
diff --git a/Documentation/devicetree/bindings/media/i2c/maxim,max96712.yaml b/Documentation/devicetree/bindings/media/i2c/maxim,max96712.yaml
index 26f85151afbd..efdece2b33b9 100644
--- a/Documentation/devicetree/bindings/media/i2c/maxim,max96712.yaml
+++ b/Documentation/devicetree/bindings/media/i2c/maxim,max96712.yaml
@@ -9,6 +9,7 @@ title: Quad GMSL2 to CSI-2 Deserializer with GMSL1 Compatibility
maintainers:
- Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
+ - Cosmin Tanislav <cosmin.tanislav@analog.com>
description: |
The MAX96712 deserializer converts GMSL2 or GMSL1 serial inputs into MIPI
diff --git a/MAINTAINERS b/MAINTAINERS
index 7fcdcc57c8ba..84078626ed5a 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -14184,6 +14184,7 @@ F: drivers/media/i2c/max9286.c
MAX96712 QUAD GMSL2 DESERIALIZER DRIVER
M: Niklas Söderlund <niklas.soderlund@ragnatech.se>
+M: Cosmin Tanislav <cosmin.tanislav@analog.com>
L: linux-media@vger.kernel.org
S: Maintained
F: Documentation/devicetree/bindings/media/i2c/maxim,max96712.yaml
--
2.48.1
^ permalink raw reply related [flat|nested] 30+ messages in thread* [RFC PATCH 16/24] dt-bindings: media: i2c: max96712: use pattern properties for input ports
2025-03-08 18:33 [RFC PATCH 00/24] media: i2c: add Maxim GMSL2/3 serializer and deserializer drivers Cosmin Tanislav
` (14 preceding siblings ...)
2025-03-08 18:33 ` [RFC PATCH 15/24] dt-bindings: media: i2c: max96712: add myself as maintainer Cosmin Tanislav
@ 2025-03-08 18:33 ` Cosmin Tanislav
2025-03-08 18:33 ` [RFC PATCH 17/24] dt-bindings: media: i2c: max96712: increase number of output ports Cosmin Tanislav
` (6 subsequent siblings)
22 siblings, 0 replies; 30+ messages in thread
From: Cosmin Tanislav @ 2025-03-08 18:33 UTC (permalink / raw)
Cc: Tomi Valkeinen, Niklas Söderlund, Cosmin Tanislav,
Mauro Carvalho Chehab, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Julien Massot, Catalin Marinas, Will Deacon,
Greg Kroah-Hartman, Liam Girdwood, Mark Brown, Linus Walleij,
Bartosz Golaszewski, Bjorn Andersson, Geert Uytterhoeven,
Dmitry Baryshkov, Heiko Stuebner, Biju Das, Taniya Das,
Nícolas F . R . A . Prado, Eric Biggers, Javier Carrasco,
Ross Burton, Sakari Ailus, Hans Verkuil, Laurent Pinchart,
Umang Jain, Zhi Mao, Kieran Bingham, Dongcheng Yan,
AngeloGioacchino Del Regno, Benjamin Mugnier, Tommaso Merciai,
Dan Carpenter, Ricardo Ribalda, Ihor Matushchak, Laurentiu Palcu,
linux-media, devicetree, linux-kernel, linux-arm-kernel,
linux-staging, linux-gpio, Cosmin Tanislav
The input ports are all the same, use patternProperties for them.
Signed-off-by: Cosmin Tanislav <demonsingur@gmail.com>
---
.../bindings/media/i2c/maxim,max96712.yaml | 18 +++---------------
1 file changed, 3 insertions(+), 15 deletions(-)
diff --git a/Documentation/devicetree/bindings/media/i2c/maxim,max96712.yaml b/Documentation/devicetree/bindings/media/i2c/maxim,max96712.yaml
index efdece2b33b9..148d196b9acc 100644
--- a/Documentation/devicetree/bindings/media/i2c/maxim,max96712.yaml
+++ b/Documentation/devicetree/bindings/media/i2c/maxim,max96712.yaml
@@ -40,22 +40,10 @@ properties:
ports:
$ref: /schemas/graph.yaml#/properties/ports
- properties:
- port@0:
+ patternProperties:
+ port@[0-3]:
$ref: /schemas/graph.yaml#/properties/port
- description: GMSL Input 0
-
- port@1:
- $ref: /schemas/graph.yaml#/properties/port
- description: GMSL Input 1
-
- port@2:
- $ref: /schemas/graph.yaml#/properties/port
- description: GMSL Input 2
-
- port@3:
- $ref: /schemas/graph.yaml#/properties/port
- description: GMSL Input 3
+ description: GMSL Input port
port@4:
$ref: /schemas/graph.yaml#/$defs/port-base
--
2.48.1
^ permalink raw reply related [flat|nested] 30+ messages in thread* [RFC PATCH 17/24] dt-bindings: media: i2c: max96712: increase number of output ports
2025-03-08 18:33 [RFC PATCH 00/24] media: i2c: add Maxim GMSL2/3 serializer and deserializer drivers Cosmin Tanislav
` (15 preceding siblings ...)
2025-03-08 18:33 ` [RFC PATCH 16/24] dt-bindings: media: i2c: max96712: use pattern properties for input ports Cosmin Tanislav
@ 2025-03-08 18:33 ` Cosmin Tanislav
2025-03-08 18:33 ` [RFC PATCH 18/24] dt-bindings: media: i2c: max96712: add support for I2C MUX Cosmin Tanislav
` (5 subsequent siblings)
22 siblings, 0 replies; 30+ messages in thread
From: Cosmin Tanislav @ 2025-03-08 18:33 UTC (permalink / raw)
Cc: Tomi Valkeinen, Niklas Söderlund, Cosmin Tanislav,
Mauro Carvalho Chehab, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Julien Massot, Catalin Marinas, Will Deacon,
Greg Kroah-Hartman, Liam Girdwood, Mark Brown, Linus Walleij,
Bartosz Golaszewski, Bjorn Andersson, Geert Uytterhoeven,
Dmitry Baryshkov, Heiko Stuebner, Biju Das, Taniya Das,
Nícolas F . R . A . Prado, Eric Biggers, Javier Carrasco,
Ross Burton, Sakari Ailus, Hans Verkuil, Laurent Pinchart,
Umang Jain, Zhi Mao, Kieran Bingham, Dongcheng Yan,
AngeloGioacchino Del Regno, Benjamin Mugnier, Tommaso Merciai,
Dan Carpenter, Ricardo Ribalda, Ihor Matushchak, Laurentiu Palcu,
linux-media, devicetree, linux-kernel, linux-arm-kernel,
linux-staging, linux-gpio, Cosmin Tanislav
The MAX96712 and MAX96724 support up to 4 separate PHYs, depending on
the selected PHY configuration.
Document this possibility by increasing the number of output ports.
Signed-off-by: Cosmin Tanislav <demonsingur@gmail.com>
---
.../bindings/media/i2c/maxim,max96712.yaml | 15 +++++++++++----
1 file changed, 11 insertions(+), 4 deletions(-)
diff --git a/Documentation/devicetree/bindings/media/i2c/maxim,max96712.yaml b/Documentation/devicetree/bindings/media/i2c/maxim,max96712.yaml
index 148d196b9acc..52b5603c2f53 100644
--- a/Documentation/devicetree/bindings/media/i2c/maxim,max96712.yaml
+++ b/Documentation/devicetree/bindings/media/i2c/maxim,max96712.yaml
@@ -45,10 +45,10 @@ properties:
$ref: /schemas/graph.yaml#/properties/port
description: GMSL Input port
- port@4:
+ port@[4-7]:
$ref: /schemas/graph.yaml#/$defs/port-base
unevaluatedProperties: false
- description: CSI-2 Output
+ description: CSI-2 Output port
properties:
endpoint:
@@ -66,8 +66,15 @@ properties:
- data-lanes
- bus-type
- required:
- - port@4
+ anyOf:
+ - required:
+ - port@4
+ - required:
+ - port@5
+ - required:
+ - port@6
+ - required:
+ - port@7
required:
- compatible
--
2.48.1
^ permalink raw reply related [flat|nested] 30+ messages in thread* [RFC PATCH 18/24] dt-bindings: media: i2c: max96712: add support for I2C MUX
2025-03-08 18:33 [RFC PATCH 00/24] media: i2c: add Maxim GMSL2/3 serializer and deserializer drivers Cosmin Tanislav
` (16 preceding siblings ...)
2025-03-08 18:33 ` [RFC PATCH 17/24] dt-bindings: media: i2c: max96712: increase number of output ports Cosmin Tanislav
@ 2025-03-08 18:33 ` Cosmin Tanislav
2025-03-08 19:44 ` Rob Herring (Arm)
2025-03-08 18:33 ` [RFC PATCH 19/24] dt-bindings: media: i2c: max96712: add support for POC supplies Cosmin Tanislav
` (4 subsequent siblings)
22 siblings, 1 reply; 30+ messages in thread
From: Cosmin Tanislav @ 2025-03-08 18:33 UTC (permalink / raw)
Cc: Tomi Valkeinen, Niklas Söderlund, Cosmin Tanislav,
Mauro Carvalho Chehab, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Julien Massot, Catalin Marinas, Will Deacon,
Greg Kroah-Hartman, Liam Girdwood, Mark Brown, Linus Walleij,
Bartosz Golaszewski, Bjorn Andersson, Geert Uytterhoeven,
Dmitry Baryshkov, Heiko Stuebner, Biju Das, Taniya Das,
Nícolas F . R . A . Prado, Eric Biggers, Javier Carrasco,
Ross Burton, Sakari Ailus, Hans Verkuil, Laurent Pinchart,
Umang Jain, Zhi Mao, Kieran Bingham, Dongcheng Yan,
AngeloGioacchino Del Regno, Benjamin Mugnier, Tommaso Merciai,
Dan Carpenter, Ricardo Ribalda, Ihor Matushchak, Laurentiu Palcu,
linux-media, devicetree, linux-kernel, linux-arm-kernel,
linux-staging, linux-gpio, Cosmin Tanislav
MAX96712 and MAX96724 have more than one GMSL2 link, and each link is
capable of connecting to a separate serializer. If these serializers
have the same CFG pins configuration, they will also have the same I2C
address, causing conflicts unless the deserializer muxes the I2C
channels. Moreover, the serializers can have the same hardware attached
to their respective I2C bus.
The MAX96712 and MAX96724 suppot I2C channel muxing via the GMSL2 link
to facilitate communication to each of the connected serializers.
Document this capability.
Signed-off-by: Cosmin Tanislav <demonsingur@gmail.com>
---
.../devicetree/bindings/media/i2c/maxim,max96712.yaml | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/Documentation/devicetree/bindings/media/i2c/maxim,max96712.yaml b/Documentation/devicetree/bindings/media/i2c/maxim,max96712.yaml
index 52b5603c2f53..4c4542d041cd 100644
--- a/Documentation/devicetree/bindings/media/i2c/maxim,max96712.yaml
+++ b/Documentation/devicetree/bindings/media/i2c/maxim,max96712.yaml
@@ -37,6 +37,17 @@ properties:
enable-gpios: true
+ i2c-mux:
+ $ref: /schemas/i2c/i2c-mux.yaml#
+ patternProperties:
+ '^i2c@[0-3]$':
+ $ref: /schemas/i2c/i2c-controller.yaml#
+ properties:
+ reg:
+ items:
+ min: 0
+ max: 3
+
ports:
$ref: /schemas/graph.yaml#/properties/ports
--
2.48.1
^ permalink raw reply related [flat|nested] 30+ messages in thread* Re: [RFC PATCH 18/24] dt-bindings: media: i2c: max96712: add support for I2C MUX
2025-03-08 18:33 ` [RFC PATCH 18/24] dt-bindings: media: i2c: max96712: add support for I2C MUX Cosmin Tanislav
@ 2025-03-08 19:44 ` Rob Herring (Arm)
0 siblings, 0 replies; 30+ messages in thread
From: Rob Herring (Arm) @ 2025-03-08 19:44 UTC (permalink / raw)
To: Cosmin Tanislav
Cc: linux-gpio, Linus Walleij, Niklas Söderlund, linux-staging,
Mark Brown, Bjorn Andersson, Krzysztof Kozlowski,
Benjamin Mugnier, Kieran Bingham, Taniya Das, Zhi Mao, Umang Jain,
Nícolas F . R . A . Prado, Heiko Stuebner, linux-media,
Catalin Marinas, Liam Girdwood, Geert Uytterhoeven, Dan Carpenter,
Biju Das, Laurentiu Palcu, Cosmin Tanislav, Bartosz Golaszewski,
Ross Burton, Julien Massot, Sakari Ailus, Ricardo Ribalda,
Conor Dooley, Ihor Matushchak, Greg Kroah-Hartman,
Laurent Pinchart, Eric Biggers, linux-arm-kernel, devicetree,
linux-kernel, Tommaso Merciai, Hans Verkuil, Dmitry Baryshkov,
AngeloGioacchino Del Regno, Will Deacon, Mauro Carvalho Chehab,
Dongcheng Yan, Tomi Valkeinen, Javier Carrasco
On Sat, 08 Mar 2025 20:33:47 +0200, Cosmin Tanislav wrote:
> MAX96712 and MAX96724 have more than one GMSL2 link, and each link is
> capable of connecting to a separate serializer. If these serializers
> have the same CFG pins configuration, they will also have the same I2C
> address, causing conflicts unless the deserializer muxes the I2C
> channels. Moreover, the serializers can have the same hardware attached
> to their respective I2C bus.
>
> The MAX96712 and MAX96724 suppot I2C channel muxing via the GMSL2 link
> to facilitate communication to each of the connected serializers.
>
> Document this capability.
>
> Signed-off-by: Cosmin Tanislav <demonsingur@gmail.com>
> ---
> .../devicetree/bindings/media/i2c/maxim,max96712.yaml | 11 +++++++++++
> 1 file changed, 11 insertions(+)
>
My bot found errors running 'make dt_binding_check' on your patch:
yamllint warnings/errors:
dtschema/dtc warnings/errors:
/builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/media/i2c/maxim,max96712.yaml: properties:i2c-mux:patternProperties:^i2c@[0-3]$:properties:reg:items: 'oneOf' conditional failed, one must be fixed:
/builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/media/i2c/maxim,max96712.yaml: properties:i2c-mux:patternProperties:^i2c@[0-3]$:properties:reg:items: 'anyOf' conditional failed, one must be fixed:
'min' is not one of ['$ref', 'additionalItems', 'additionalProperties', 'allOf', 'anyOf', 'const', 'contains', 'default', 'dependencies', 'dependentRequired', 'dependentSchemas', 'deprecated', 'description', 'else', 'enum', 'exclusiveMaximum', 'exclusiveMinimum', 'items', 'if', 'minItems', 'minimum', 'maxItems', 'maximum', 'multipleOf', 'not', 'oneOf', 'pattern', 'patternProperties', 'properties', 'required', 'then', 'typeSize', 'unevaluatedProperties', 'uniqueItems']
'type' was expected
from schema $id: http://devicetree.org/meta-schemas/keywords.yaml#
/builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/media/i2c/maxim,max96712.yaml: properties:i2c-mux:patternProperties:^i2c@[0-3]$:properties:reg:items: 'anyOf' conditional failed, one must be fixed:
'max' is not one of ['$ref', 'additionalItems', 'additionalProperties', 'allOf', 'anyOf', 'const', 'contains', 'default', 'dependencies', 'dependentRequired', 'dependentSchemas', 'deprecated', 'description', 'else', 'enum', 'exclusiveMaximum', 'exclusiveMinimum', 'items', 'if', 'minItems', 'minimum', 'maxItems', 'maximum', 'multipleOf', 'not', 'oneOf', 'pattern', 'patternProperties', 'properties', 'required', 'then', 'typeSize', 'unevaluatedProperties', 'uniqueItems']
'type' was expected
from schema $id: http://devicetree.org/meta-schemas/keywords.yaml#
{'min': 0, 'max': 3} is not of type 'array'
from schema $id: http://devicetree.org/meta-schemas/keywords.yaml#
/builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/media/i2c/maxim,max96712.yaml: properties:i2c-mux:patternProperties:^i2c@[0-3]$:properties:reg: 'anyOf' conditional failed, one must be fixed:
'maxItems' is a required property
hint: Only "maxItems" is required for a single entry if there are no constraints defined for the values.
'items' is not one of ['maxItems', 'description', 'deprecated']
hint: Only "maxItems" is required for a single entry if there are no constraints defined for the values.
'items' is not one of ['description', 'deprecated', 'const', 'enum', 'minimum', 'maximum', 'multipleOf', 'default', '$ref', 'oneOf']
/builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/media/i2c/maxim,max96712.yaml: properties:i2c-mux:patternProperties:^i2c@[0-3]$:properties:reg:items: 'oneOf' conditional failed, one must be fixed:
/builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/media/i2c/maxim,max96712.yaml: properties:i2c-mux:patternProperties:^i2c@[0-3]$:properties:reg:items: 'anyOf' conditional failed, one must be fixed:
'maxItems' is a required property
hint: Only "maxItems" is required for a single entry if there are no constraints defined for the values.
'min' is not one of ['maxItems', 'description', 'deprecated']
hint: Only "maxItems" is required for a single entry if there are no constraints defined for the values.
'max' is not one of ['maxItems', 'description', 'deprecated']
hint: Only "maxItems" is required for a single entry if there are no constraints defined for the values.
Additional properties are not allowed ('max', 'min' were unexpected)
hint: Arrays must be described with a combination of minItems/maxItems/items
'min' is not one of ['description', 'deprecated', 'const', 'enum', 'minimum', 'maximum', 'multipleOf', 'default', '$ref', 'oneOf']
hint: "items" can be a list defining each entry or a schema applying to all items. A list has an implicit size. A schema requires minItems/maxItems to define the size.
'max' is not one of ['description', 'deprecated', 'const', 'enum', 'minimum', 'maximum', 'multipleOf', 'default', '$ref', 'oneOf']
hint: "items" can be a list defining each entry or a schema applying to all items. A list has an implicit size. A schema requires minItems/maxItems to define the size.
hint: cell array properties must define how many entries and what the entries are when there is more than one entry.
from schema $id: http://devicetree.org/meta-schemas/core.yaml#
{'min': 0, 'max': 3} is not of type 'array'
hint: "items" can be a list defining each entry or a schema applying to all items. A list has an implicit size. A schema requires minItems/maxItems to define the size.
from schema $id: http://devicetree.org/meta-schemas/core.yaml#
hint: cell array properties must define how many entries and what the entries are when there is more than one entry.
from schema $id: http://devicetree.org/meta-schemas/core.yaml#
/builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/media/i2c/maxim,max96712.yaml: i2c-mux: Missing additionalProperties/unevaluatedProperties constraint
/builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/media/i2c/maxim,max96712.yaml: ^i2c@[0-3]$: Missing additionalProperties/unevaluatedProperties constraint
doc reference errors (make refcheckdocs):
See https://patchwork.ozlabs.org/project/devicetree-bindings/patch/20250308183410.3013996-19-demonsingur@gmail.com
The base for the series is generally the latest rc1. A different dependency
should be noted in *this* patch.
If you already ran 'make dt_binding_check' and didn't see the above
error(s), then make sure 'yamllint' is installed and dt-schema is up to
date:
pip3 install dtschema --upgrade
Please check and re-submit after running the above command yourself. Note
that DT_SCHEMA_FILES can be set to your schema file to speed up checking
your schema. However, it must be unset to test all examples with your schema.
^ permalink raw reply [flat|nested] 30+ messages in thread
* [RFC PATCH 19/24] dt-bindings: media: i2c: max96712: add support for POC supplies
2025-03-08 18:33 [RFC PATCH 00/24] media: i2c: add Maxim GMSL2/3 serializer and deserializer drivers Cosmin Tanislav
` (17 preceding siblings ...)
2025-03-08 18:33 ` [RFC PATCH 18/24] dt-bindings: media: i2c: max96712: add support for I2C MUX Cosmin Tanislav
@ 2025-03-08 18:33 ` Cosmin Tanislav
2025-03-08 19:59 ` Rob Herring (Arm)
2025-03-08 18:33 ` [RFC PATCH 21/24] arm64: defconfig: disable deprecated MAX96712 driver Cosmin Tanislav
` (3 subsequent siblings)
22 siblings, 1 reply; 30+ messages in thread
From: Cosmin Tanislav @ 2025-03-08 18:33 UTC (permalink / raw)
Cc: Tomi Valkeinen, Niklas Söderlund, Cosmin Tanislav,
Mauro Carvalho Chehab, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Julien Massot, Catalin Marinas, Will Deacon,
Greg Kroah-Hartman, Liam Girdwood, Mark Brown, Linus Walleij,
Bartosz Golaszewski, Bjorn Andersson, Geert Uytterhoeven,
Dmitry Baryshkov, Heiko Stuebner, Biju Das, Taniya Das,
Nícolas F . R . A . Prado, Eric Biggers, Javier Carrasco,
Ross Burton, Sakari Ailus, Hans Verkuil, Laurent Pinchart,
Umang Jain, Zhi Mao, Kieran Bingham, Dongcheng Yan,
AngeloGioacchino Del Regno, Benjamin Mugnier, Tommaso Merciai,
Dan Carpenter, Ricardo Ribalda, Ihor Matushchak, Laurentiu Palcu,
linux-media, devicetree, linux-kernel, linux-arm-kernel,
linux-staging, linux-gpio, Cosmin Tanislav
The GMSL links can carry power to the serializer when using coaxial
cables.
Document this capability.
Signed-off-by: Cosmin Tanislav <demonsingur@gmail.com>
---
.../devicetree/bindings/media/i2c/maxim,max96712.yaml | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/Documentation/devicetree/bindings/media/i2c/maxim,max96712.yaml b/Documentation/devicetree/bindings/media/i2c/maxim,max96712.yaml
index 4c4542d041cd..1680d99b1f36 100644
--- a/Documentation/devicetree/bindings/media/i2c/maxim,max96712.yaml
+++ b/Documentation/devicetree/bindings/media/i2c/maxim,max96712.yaml
@@ -87,6 +87,10 @@ properties:
- required:
- port@7
+patternProperties:
+ port[0-3]-poc-supply:
+ description: Regulator providing Power over Coax for GMSL ports
+
required:
- compatible
- reg
--
2.48.1
^ permalink raw reply related [flat|nested] 30+ messages in thread* Re: [RFC PATCH 19/24] dt-bindings: media: i2c: max96712: add support for POC supplies
2025-03-08 18:33 ` [RFC PATCH 19/24] dt-bindings: media: i2c: max96712: add support for POC supplies Cosmin Tanislav
@ 2025-03-08 19:59 ` Rob Herring (Arm)
0 siblings, 0 replies; 30+ messages in thread
From: Rob Herring (Arm) @ 2025-03-08 19:59 UTC (permalink / raw)
To: Cosmin Tanislav
Cc: Geert Uytterhoeven, linux-media, Laurent Pinchart,
Catalin Marinas, Eric Biggers, Sakari Ailus, Mark Brown,
Nícolas F . R . A . Prado, Ihor Matushchak, Ricardo Ribalda,
Liam Girdwood, Hans Verkuil, Umang Jain,
AngeloGioacchino Del Regno, Biju Das, Krzysztof Kozlowski,
Dongcheng Yan, Julien Massot, Mauro Carvalho Chehab,
linux-staging, Tommaso Merciai, Heiko Stuebner, Taniya Das,
Tomi Valkeinen, Conor Dooley, Zhi Mao, Kieran Bingham,
Dan Carpenter, devicetree, linux-kernel, linux-gpio,
Cosmin Tanislav, Will Deacon, Greg Kroah-Hartman, Ross Burton,
Javier Carrasco, Linus Walleij, Benjamin Mugnier,
linux-arm-kernel, Laurentiu Palcu, Bartosz Golaszewski,
Bjorn Andersson, Niklas Söderlund, Dmitry Baryshkov
On Sat, 08 Mar 2025 20:33:48 +0200, Cosmin Tanislav wrote:
> The GMSL links can carry power to the serializer when using coaxial
> cables.
>
> Document this capability.
>
> Signed-off-by: Cosmin Tanislav <demonsingur@gmail.com>
> ---
> .../devicetree/bindings/media/i2c/maxim,max96712.yaml | 4 ++++
> 1 file changed, 4 insertions(+)
>
My bot found errors running 'make dt_binding_check' on your patch:
yamllint warnings/errors:
dtschema/dtc warnings/errors:
/builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/media/i2c/maxim,max96712.yaml: patternProperties: 'port[0-3]-poc-supply' does not match '[\\^$()*@]'
hint: Fixed strings belong in 'properties', not 'patternProperties'
from schema $id: http://devicetree.org/meta-schemas/keywords.yaml#
doc reference errors (make refcheckdocs):
See https://patchwork.ozlabs.org/project/devicetree-bindings/patch/20250308183410.3013996-20-demonsingur@gmail.com
The base for the series is generally the latest rc1. A different dependency
should be noted in *this* patch.
If you already ran 'make dt_binding_check' and didn't see the above
error(s), then make sure 'yamllint' is installed and dt-schema is up to
date:
pip3 install dtschema --upgrade
Please check and re-submit after running the above command yourself. Note
that DT_SCHEMA_FILES can be set to your schema file to speed up checking
your schema. However, it must be unset to test all examples with your schema.
^ permalink raw reply [flat|nested] 30+ messages in thread
* [RFC PATCH 21/24] arm64: defconfig: disable deprecated MAX96712 driver
2025-03-08 18:33 [RFC PATCH 00/24] media: i2c: add Maxim GMSL2/3 serializer and deserializer drivers Cosmin Tanislav
` (18 preceding siblings ...)
2025-03-08 18:33 ` [RFC PATCH 19/24] dt-bindings: media: i2c: max96712: add support for POC supplies Cosmin Tanislav
@ 2025-03-08 18:33 ` Cosmin Tanislav
2025-03-08 18:33 ` [RFC PATCH 22/24] staging: media: remove " Cosmin Tanislav
` (2 subsequent siblings)
22 siblings, 0 replies; 30+ messages in thread
From: Cosmin Tanislav @ 2025-03-08 18:33 UTC (permalink / raw)
Cc: Tomi Valkeinen, Niklas Söderlund, Cosmin Tanislav,
Mauro Carvalho Chehab, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Julien Massot, Catalin Marinas, Will Deacon,
Greg Kroah-Hartman, Liam Girdwood, Mark Brown, Linus Walleij,
Bartosz Golaszewski, Bjorn Andersson, Geert Uytterhoeven,
Dmitry Baryshkov, Heiko Stuebner, Biju Das, Taniya Das,
Nícolas F . R . A . Prado, Eric Biggers, Javier Carrasco,
Ross Burton, Sakari Ailus, Hans Verkuil, Laurent Pinchart,
Umang Jain, Zhi Mao, Kieran Bingham, Dongcheng Yan,
AngeloGioacchino Del Regno, Benjamin Mugnier, Tommaso Merciai,
Dan Carpenter, Ricardo Ribalda, Ihor Matushchak, Laurentiu Palcu,
linux-media, devicetree, linux-kernel, linux-arm-kernel,
linux-staging, linux-gpio, Cosmin Tanislav
The staging MAX96712 driver will be removed as its functionality has
been moved to the MAX96724 driver which makes use of the Maxim
GMSL2/3 deserializer framework.
Signed-off-by: Cosmin Tanislav <demonsingur@gmail.com>
---
arch/arm64/configs/defconfig | 1 -
1 file changed, 1 deletion(-)
diff --git a/arch/arm64/configs/defconfig b/arch/arm64/configs/defconfig
index cb7da4415599..6e9bd9072d11 100644
--- a/arch/arm64/configs/defconfig
+++ b/arch/arm64/configs/defconfig
@@ -1272,7 +1272,6 @@ CONFIG_XEN_GNTDEV=y
CONFIG_XEN_GRANT_DEV_ALLOC=y
CONFIG_STAGING=y
CONFIG_STAGING_MEDIA=y
-CONFIG_VIDEO_MAX96712=m
CONFIG_VIDEO_MESON_VDEC=m
CONFIG_SND_BCM2835=m
CONFIG_CHROME_PLATFORMS=y
--
2.48.1
^ permalink raw reply related [flat|nested] 30+ messages in thread* [RFC PATCH 22/24] staging: media: remove MAX96712 driver
2025-03-08 18:33 [RFC PATCH 00/24] media: i2c: add Maxim GMSL2/3 serializer and deserializer drivers Cosmin Tanislav
` (19 preceding siblings ...)
2025-03-08 18:33 ` [RFC PATCH 21/24] arm64: defconfig: disable deprecated MAX96712 driver Cosmin Tanislav
@ 2025-03-08 18:33 ` Cosmin Tanislav
2025-03-08 18:33 ` [RFC PATCH 23/24] media: i2c: remove MAX96717 driver Cosmin Tanislav
2025-03-08 18:33 ` [RFC PATCH 24/24] media: i2c: remove MAX96714 driver Cosmin Tanislav
22 siblings, 0 replies; 30+ messages in thread
From: Cosmin Tanislav @ 2025-03-08 18:33 UTC (permalink / raw)
Cc: Tomi Valkeinen, Niklas Söderlund, Cosmin Tanislav,
Mauro Carvalho Chehab, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Julien Massot, Catalin Marinas, Will Deacon,
Greg Kroah-Hartman, Liam Girdwood, Mark Brown, Linus Walleij,
Bartosz Golaszewski, Bjorn Andersson, Geert Uytterhoeven,
Dmitry Baryshkov, Heiko Stuebner, Biju Das, Taniya Das,
Nícolas F . R . A . Prado, Eric Biggers, Javier Carrasco,
Ross Burton, Sakari Ailus, Hans Verkuil, Laurent Pinchart,
Umang Jain, Zhi Mao, Kieran Bingham, Dongcheng Yan,
AngeloGioacchino Del Regno, Benjamin Mugnier, Tommaso Merciai,
Dan Carpenter, Ricardo Ribalda, Ihor Matushchak, Laurentiu Palcu,
linux-media, devicetree, linux-kernel, linux-arm-kernel,
linux-staging, linux-gpio, Cosmin Tanislav
Remove the staging MAX96712 driver.
Its functionality has been moved to the MAX96724 driver which makes use
of the Maxim GMSL2/3 deserializer framework.
Signed-off-by: Cosmin Tanislav <demonsingur@gmail.com>
---
MAINTAINERS | 1 -
drivers/staging/media/Kconfig | 2 -
drivers/staging/media/Makefile | 1 -
drivers/staging/media/max96712/Kconfig | 14 -
drivers/staging/media/max96712/Makefile | 2 -
drivers/staging/media/max96712/max96712.c | 487 ----------------------
6 files changed, 507 deletions(-)
delete mode 100644 drivers/staging/media/max96712/Kconfig
delete mode 100644 drivers/staging/media/max96712/Makefile
delete mode 100644 drivers/staging/media/max96712/max96712.c
diff --git a/MAINTAINERS b/MAINTAINERS
index 1bc0ef81a1f0..7bc80ed9ba00 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -14188,7 +14188,6 @@ M: Cosmin Tanislav <cosmin.tanislav@analog.com>
L: linux-media@vger.kernel.org
S: Maintained
F: Documentation/devicetree/bindings/media/i2c/maxim,max96712.yaml
-F: drivers/staging/media/max96712/max96712.c
MAX96714 GMSL2 DESERIALIZER DRIVER
M: Julien Massot <julien.massot@collabora.com>
diff --git a/drivers/staging/media/Kconfig b/drivers/staging/media/Kconfig
index b44214854399..fe29821f64a3 100644
--- a/drivers/staging/media/Kconfig
+++ b/drivers/staging/media/Kconfig
@@ -28,8 +28,6 @@ source "drivers/staging/media/imx/Kconfig"
source "drivers/staging/media/ipu3/Kconfig"
-source "drivers/staging/media/max96712/Kconfig"
-
source "drivers/staging/media/meson/vdec/Kconfig"
source "drivers/staging/media/rkvdec/Kconfig"
diff --git a/drivers/staging/media/Makefile b/drivers/staging/media/Makefile
index ad4e9619a9e0..1a562b3b6881 100644
--- a/drivers/staging/media/Makefile
+++ b/drivers/staging/media/Makefile
@@ -2,7 +2,6 @@
obj-$(CONFIG_VIDEO_ATMEL_ISC_BASE) += deprecated/atmel/
obj-$(CONFIG_INTEL_ATOMISP) += atomisp/
obj-$(CONFIG_VIDEO_IMX_MEDIA) += imx/
-obj-$(CONFIG_VIDEO_MAX96712) += max96712/
obj-$(CONFIG_VIDEO_MESON_VDEC) += meson/vdec/
obj-$(CONFIG_VIDEO_ROCKCHIP_VDEC) += rkvdec/
obj-$(CONFIG_VIDEO_STARFIVE_CAMSS) += starfive/
diff --git a/drivers/staging/media/max96712/Kconfig b/drivers/staging/media/max96712/Kconfig
deleted file mode 100644
index 117fadf81bd0..000000000000
--- a/drivers/staging/media/max96712/Kconfig
+++ /dev/null
@@ -1,14 +0,0 @@
-# SPDX-License-Identifier: GPL-2.0
-config VIDEO_MAX96712
- tristate "Maxim MAX96712 Quad GMSL2 Deserializer support"
- depends on I2C
- depends on OF_GPIO
- depends on VIDEO_DEV
- select V4L2_FWNODE
- select VIDEO_V4L2_SUBDEV_API
- select MEDIA_CONTROLLER
- help
- This driver supports the Maxim MAX96712 Quad GMSL2 Deserializer.
-
- To compile this driver as a module, choose M here: the
- module will be called max96712.
diff --git a/drivers/staging/media/max96712/Makefile b/drivers/staging/media/max96712/Makefile
deleted file mode 100644
index 70c1974ce3f0..000000000000
--- a/drivers/staging/media/max96712/Makefile
+++ /dev/null
@@ -1,2 +0,0 @@
-# SPDX-License-Identifier: GPL-2.0
-obj-$(CONFIG_VIDEO_MAX96712) += max96712.o
diff --git a/drivers/staging/media/max96712/max96712.c b/drivers/staging/media/max96712/max96712.c
deleted file mode 100644
index 0751b2e04895..000000000000
--- a/drivers/staging/media/max96712/max96712.c
+++ /dev/null
@@ -1,487 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Maxim MAX96712 Quad GMSL2 Deserializer Driver
- *
- * Copyright (C) 2021 Renesas Electronics Corporation
- * Copyright (C) 2021 Niklas Söderlund
- */
-
-#include <linux/delay.h>
-#include <linux/i2c.h>
-#include <linux/module.h>
-#include <linux/of_graph.h>
-#include <linux/regmap.h>
-
-#include <media/v4l2-ctrls.h>
-#include <media/v4l2-fwnode.h>
-#include <media/v4l2-subdev.h>
-
-#define DEBUG_EXTRA_REG 0x09
-#define DEBUG_EXTRA_PCLK_25MHZ 0x00
-#define DEBUG_EXTRA_PCLK_75MHZ 0x01
-
-enum max96712_pattern {
- MAX96712_PATTERN_CHECKERBOARD = 0,
- MAX96712_PATTERN_GRADIENT,
-};
-
-struct max96712_info {
- unsigned int dpllfreq;
- bool have_debug_extra;
-};
-
-struct max96712_priv {
- struct i2c_client *client;
- struct regmap *regmap;
- struct gpio_desc *gpiod_pwdn;
-
- const struct max96712_info *info;
-
- bool cphy;
- struct v4l2_mbus_config_mipi_csi2 mipi;
-
- struct v4l2_subdev sd;
- struct v4l2_ctrl_handler ctrl_handler;
- struct media_pad pads[1];
-
- enum max96712_pattern pattern;
-};
-
-static int max96712_write(struct max96712_priv *priv, unsigned int reg, u8 val)
-{
- int ret;
-
- ret = regmap_write(priv->regmap, reg, val);
- if (ret)
- dev_err(&priv->client->dev, "write 0x%04x failed\n", reg);
-
- return ret;
-}
-
-static int max96712_update_bits(struct max96712_priv *priv, unsigned int reg,
- u8 mask, u8 val)
-{
- int ret;
-
- ret = regmap_update_bits(priv->regmap, reg, mask, val);
- if (ret)
- dev_err(&priv->client->dev, "update 0x%04x failed\n", reg);
-
- return ret;
-}
-
-static int max96712_write_bulk(struct max96712_priv *priv, unsigned int reg,
- const void *val, size_t val_count)
-{
- int ret;
-
- ret = regmap_bulk_write(priv->regmap, reg, val, val_count);
- if (ret)
- dev_err(&priv->client->dev, "bulk write 0x%04x failed\n", reg);
-
- return ret;
-}
-
-static int max96712_write_bulk_value(struct max96712_priv *priv,
- unsigned int reg, unsigned int val,
- size_t val_count)
-{
- unsigned int i;
- u8 values[4];
-
- for (i = 1; i <= val_count; i++)
- values[i - 1] = (val >> ((val_count - i) * 8)) & 0xff;
-
- return max96712_write_bulk(priv, reg, &values, val_count);
-}
-
-static void max96712_reset(struct max96712_priv *priv)
-{
- max96712_update_bits(priv, 0x13, 0x40, 0x40);
- msleep(20);
-}
-
-static void max96712_mipi_enable(struct max96712_priv *priv, bool enable)
-{
- if (enable) {
- max96712_update_bits(priv, 0x40b, 0x02, 0x02);
- max96712_update_bits(priv, 0x8a0, 0x80, 0x80);
- } else {
- max96712_update_bits(priv, 0x8a0, 0x80, 0x00);
- max96712_update_bits(priv, 0x40b, 0x02, 0x00);
- }
-}
-
-static void max96712_mipi_configure(struct max96712_priv *priv)
-{
- unsigned int i;
- u8 phy5 = 0;
-
- max96712_mipi_enable(priv, false);
-
- /* Select 2x4 mode. */
- max96712_write(priv, 0x8a0, 0x04);
-
- /* TODO: Add support for 2-lane and 1-lane configurations. */
- if (priv->cphy) {
- /* Configure a 3-lane C-PHY using PHY0 and PHY1. */
- max96712_write(priv, 0x94a, 0xa0);
-
- /* Configure C-PHY timings. */
- max96712_write(priv, 0x8ad, 0x3f);
- max96712_write(priv, 0x8ae, 0x7d);
- } else {
- /* Configure a 4-lane D-PHY using PHY0 and PHY1. */
- max96712_write(priv, 0x94a, 0xc0);
- }
-
- /* Configure lane mapping for PHY0 and PHY1. */
- /* TODO: Add support for lane swapping. */
- max96712_write(priv, 0x8a3, 0xe4);
-
- /* Configure lane polarity for PHY0 and PHY1. */
- for (i = 0; i < priv->mipi.num_data_lanes + 1; i++)
- if (priv->mipi.lane_polarities[i])
- phy5 |= BIT(i == 0 ? 5 : i < 3 ? i - 1 : i);
- max96712_write(priv, 0x8a5, phy5);
-
- /* Set link frequency for PHY0 and PHY1. */
- max96712_update_bits(priv, 0x415, 0x3f,
- ((priv->info->dpllfreq / 100) & 0x1f) | BIT(5));
- max96712_update_bits(priv, 0x418, 0x3f,
- ((priv->info->dpllfreq / 100) & 0x1f) | BIT(5));
-
- /* Enable PHY0 and PHY1 */
- max96712_update_bits(priv, 0x8a2, 0xf0, 0x30);
-}
-
-static void max96712_pattern_enable(struct max96712_priv *priv, bool enable)
-{
- const u32 h_active = 1920;
- const u32 h_fp = 88;
- const u32 h_sw = 44;
- const u32 h_bp = 148;
- const u32 h_tot = h_active + h_fp + h_sw + h_bp;
-
- const u32 v_active = 1080;
- const u32 v_fp = 4;
- const u32 v_sw = 5;
- const u32 v_bp = 36;
- const u32 v_tot = v_active + v_fp + v_sw + v_bp;
-
- if (!enable) {
- max96712_write(priv, 0x1051, 0x00);
- return;
- }
-
- /* Set PCLK to 75MHz if device have DEBUG_EXTRA register. */
- if (priv->info->have_debug_extra)
- max96712_write(priv, DEBUG_EXTRA_REG, DEBUG_EXTRA_PCLK_75MHZ);
-
- /* Configure Video Timing Generator for 1920x1080 @ 30 fps. */
- max96712_write_bulk_value(priv, 0x1052, 0, 3);
- max96712_write_bulk_value(priv, 0x1055, v_sw * h_tot, 3);
- max96712_write_bulk_value(priv, 0x1058,
- (v_active + v_fp + + v_bp) * h_tot, 3);
- max96712_write_bulk_value(priv, 0x105b, 0, 3);
- max96712_write_bulk_value(priv, 0x105e, h_sw, 2);
- max96712_write_bulk_value(priv, 0x1060, h_active + h_fp + h_bp, 2);
- max96712_write_bulk_value(priv, 0x1062, v_tot, 2);
- max96712_write_bulk_value(priv, 0x1064,
- h_tot * (v_sw + v_bp) + (h_sw + h_bp), 3);
- max96712_write_bulk_value(priv, 0x1067, h_active, 2);
- max96712_write_bulk_value(priv, 0x1069, h_fp + h_sw + h_bp, 2);
- max96712_write_bulk_value(priv, 0x106b, v_active, 2);
-
- /* Generate VS, HS and DE in free-running mode. */
- max96712_write(priv, 0x1050, 0xfb);
-
- /* Configure Video Pattern Generator. */
- if (priv->pattern == MAX96712_PATTERN_CHECKERBOARD) {
- /* Set checkerboard pattern size. */
- max96712_write(priv, 0x1074, 0x3c);
- max96712_write(priv, 0x1075, 0x3c);
- max96712_write(priv, 0x1076, 0x3c);
-
- /* Set checkerboard pattern colors. */
- max96712_write_bulk_value(priv, 0x106e, 0xfecc00, 3);
- max96712_write_bulk_value(priv, 0x1071, 0x006aa7, 3);
-
- /* Generate checkerboard pattern. */
- max96712_write(priv, 0x1051, 0x10);
- } else {
- /* Set gradient increment. */
- max96712_write(priv, 0x106d, 0x10);
-
- /* Generate gradient pattern. */
- max96712_write(priv, 0x1051, 0x20);
- }
-}
-
-static int max96712_s_stream(struct v4l2_subdev *sd, int enable)
-{
- struct max96712_priv *priv = v4l2_get_subdevdata(sd);
-
- if (enable) {
- max96712_pattern_enable(priv, true);
- max96712_mipi_enable(priv, true);
- } else {
- max96712_mipi_enable(priv, false);
- max96712_pattern_enable(priv, false);
- }
-
- return 0;
-}
-
-static const struct v4l2_subdev_video_ops max96712_video_ops = {
- .s_stream = max96712_s_stream,
-};
-
-static int max96712_init_state(struct v4l2_subdev *sd,
- struct v4l2_subdev_state *state)
-{
- static const struct v4l2_mbus_framefmt default_fmt = {
- .width = 1920,
- .height = 1080,
- .code = MEDIA_BUS_FMT_RGB888_1X24,
- .colorspace = V4L2_COLORSPACE_SRGB,
- .field = V4L2_FIELD_NONE,
- .ycbcr_enc = V4L2_YCBCR_ENC_DEFAULT,
- .quantization = V4L2_QUANTIZATION_DEFAULT,
- .xfer_func = V4L2_XFER_FUNC_DEFAULT,
- };
- struct v4l2_mbus_framefmt *fmt;
-
- fmt = v4l2_subdev_state_get_format(state, 0);
- *fmt = default_fmt;
-
- return 0;
-}
-
-static const struct v4l2_subdev_internal_ops max96712_internal_ops = {
- .init_state = max96712_init_state,
-};
-
-static const struct v4l2_subdev_pad_ops max96712_pad_ops = {
- .get_fmt = v4l2_subdev_get_fmt,
- .set_fmt = v4l2_subdev_get_fmt,
-};
-
-static const struct v4l2_subdev_ops max96712_subdev_ops = {
- .video = &max96712_video_ops,
- .pad = &max96712_pad_ops,
-};
-
-static const char * const max96712_test_pattern[] = {
- "Checkerboard",
- "Gradient",
-};
-
-static int max96712_s_ctrl(struct v4l2_ctrl *ctrl)
-{
- struct max96712_priv *priv =
- container_of(ctrl->handler, struct max96712_priv, ctrl_handler);
-
- switch (ctrl->id) {
- case V4L2_CID_TEST_PATTERN:
- priv->pattern = ctrl->val ?
- MAX96712_PATTERN_GRADIENT :
- MAX96712_PATTERN_CHECKERBOARD;
- break;
- }
- return 0;
-}
-
-static const struct v4l2_ctrl_ops max96712_ctrl_ops = {
- .s_ctrl = max96712_s_ctrl,
-};
-
-static int max96712_v4l2_register(struct max96712_priv *priv)
-{
- long pixel_rate;
- int ret;
-
- priv->sd.internal_ops = &max96712_internal_ops;
- v4l2_i2c_subdev_init(&priv->sd, priv->client, &max96712_subdev_ops);
- priv->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
- priv->sd.entity.function = MEDIA_ENT_F_VID_IF_BRIDGE;
-
- v4l2_ctrl_handler_init(&priv->ctrl_handler, 2);
-
- /*
- * TODO: Once V4L2_CID_LINK_FREQ is changed from a menu control to an
- * INT64 control it should be used here instead of V4L2_CID_PIXEL_RATE.
- */
- pixel_rate = priv->info->dpllfreq / priv->mipi.num_data_lanes * 1000000;
- v4l2_ctrl_new_std(&priv->ctrl_handler, NULL, V4L2_CID_PIXEL_RATE,
- pixel_rate, pixel_rate, 1, pixel_rate);
-
- v4l2_ctrl_new_std_menu_items(&priv->ctrl_handler, &max96712_ctrl_ops,
- V4L2_CID_TEST_PATTERN,
- ARRAY_SIZE(max96712_test_pattern) - 1,
- 0, 0, max96712_test_pattern);
-
- priv->sd.ctrl_handler = &priv->ctrl_handler;
- ret = priv->ctrl_handler.error;
- if (ret)
- goto error;
-
- priv->pads[0].flags = MEDIA_PAD_FL_SOURCE;
- ret = media_entity_pads_init(&priv->sd.entity, 1, priv->pads);
- if (ret)
- goto error;
-
- v4l2_set_subdevdata(&priv->sd, priv);
-
- priv->sd.state_lock = priv->ctrl_handler.lock;
- ret = v4l2_subdev_init_finalize(&priv->sd);
- if (ret)
- goto error;
-
- ret = v4l2_async_register_subdev(&priv->sd);
- if (ret < 0) {
- dev_err(&priv->client->dev, "Unable to register subdevice\n");
- goto error;
- }
-
- return 0;
-error:
- v4l2_ctrl_handler_free(&priv->ctrl_handler);
-
- return ret;
-}
-
-static int max96712_parse_dt(struct max96712_priv *priv)
-{
- struct fwnode_handle *ep;
- struct v4l2_fwnode_endpoint v4l2_ep = {
- .bus_type = V4L2_MBUS_UNKNOWN,
- };
- unsigned int supported_lanes;
- int ret;
-
- ep = fwnode_graph_get_endpoint_by_id(dev_fwnode(&priv->client->dev), 4,
- 0, 0);
- if (!ep) {
- dev_err(&priv->client->dev, "Not connected to subdevice\n");
- return -EINVAL;
- }
-
- ret = v4l2_fwnode_endpoint_parse(ep, &v4l2_ep);
- fwnode_handle_put(ep);
- if (ret) {
- dev_err(&priv->client->dev, "Could not parse v4l2 endpoint\n");
- return -EINVAL;
- }
-
- switch (v4l2_ep.bus_type) {
- case V4L2_MBUS_CSI2_DPHY:
- supported_lanes = 4;
- priv->cphy = false;
- break;
- case V4L2_MBUS_CSI2_CPHY:
- supported_lanes = 3;
- priv->cphy = true;
- break;
- default:
- dev_err(&priv->client->dev, "Unsupported bus-type %u\n",
- v4l2_ep.bus_type);
- return -EINVAL;
- }
-
- if (v4l2_ep.bus.mipi_csi2.num_data_lanes != supported_lanes) {
- dev_err(&priv->client->dev, "Only %u data lanes supported\n",
- supported_lanes);
- return -EINVAL;
- }
-
- priv->mipi = v4l2_ep.bus.mipi_csi2;
-
- return 0;
-}
-
-static const struct regmap_config max96712_i2c_regmap = {
- .reg_bits = 16,
- .val_bits = 8,
- .max_register = 0x1f00,
-};
-
-static int max96712_probe(struct i2c_client *client)
-{
- struct max96712_priv *priv;
- int ret;
-
- priv = devm_kzalloc(&client->dev, sizeof(*priv), GFP_KERNEL);
- if (!priv)
- return -ENOMEM;
-
- priv->info = of_device_get_match_data(&client->dev);
-
- priv->client = client;
-
- priv->regmap = devm_regmap_init_i2c(client, &max96712_i2c_regmap);
- if (IS_ERR(priv->regmap))
- return PTR_ERR(priv->regmap);
-
- priv->gpiod_pwdn = devm_gpiod_get_optional(&client->dev, "enable",
- GPIOD_OUT_HIGH);
- if (IS_ERR(priv->gpiod_pwdn))
- return PTR_ERR(priv->gpiod_pwdn);
-
- gpiod_set_consumer_name(priv->gpiod_pwdn, "max96712-pwdn");
- gpiod_set_value_cansleep(priv->gpiod_pwdn, 1);
-
- if (priv->gpiod_pwdn)
- usleep_range(4000, 5000);
-
- max96712_reset(priv);
-
- ret = max96712_parse_dt(priv);
- if (ret)
- return ret;
-
- max96712_mipi_configure(priv);
-
- return max96712_v4l2_register(priv);
-}
-
-static void max96712_remove(struct i2c_client *client)
-{
- struct v4l2_subdev *sd = i2c_get_clientdata(client);
- struct max96712_priv *priv = container_of(sd, struct max96712_priv, sd);
-
- v4l2_async_unregister_subdev(&priv->sd);
-
- gpiod_set_value_cansleep(priv->gpiod_pwdn, 0);
-}
-
-static const struct max96712_info max96712_info_max96712 = {
- .dpllfreq = 1000,
- .have_debug_extra = true,
-};
-
-static const struct max96712_info max96712_info_max96724 = {
- .dpllfreq = 1200,
-};
-
-static const struct of_device_id max96712_of_table[] = {
- { .compatible = "maxim,max96712", .data = &max96712_info_max96712 },
- { .compatible = "maxim,max96724", .data = &max96712_info_max96724 },
- { /* sentinel */ }
-};
-MODULE_DEVICE_TABLE(of, max96712_of_table);
-
-static struct i2c_driver max96712_i2c_driver = {
- .driver = {
- .name = "max96712",
- .of_match_table = of_match_ptr(max96712_of_table),
- },
- .probe = max96712_probe,
- .remove = max96712_remove,
-};
-
-module_i2c_driver(max96712_i2c_driver);
-
-MODULE_DESCRIPTION("Maxim MAX96712 Quad GMSL2 Deserializer Driver");
-MODULE_AUTHOR("Niklas Söderlund <niklas.soderlund@ragnatech.se>");
-MODULE_LICENSE("GPL");
--
2.48.1
^ permalink raw reply related [flat|nested] 30+ messages in thread* [RFC PATCH 23/24] media: i2c: remove MAX96717 driver
2025-03-08 18:33 [RFC PATCH 00/24] media: i2c: add Maxim GMSL2/3 serializer and deserializer drivers Cosmin Tanislav
` (20 preceding siblings ...)
2025-03-08 18:33 ` [RFC PATCH 22/24] staging: media: remove " Cosmin Tanislav
@ 2025-03-08 18:33 ` Cosmin Tanislav
2025-03-08 18:33 ` [RFC PATCH 24/24] media: i2c: remove MAX96714 driver Cosmin Tanislav
22 siblings, 0 replies; 30+ messages in thread
From: Cosmin Tanislav @ 2025-03-08 18:33 UTC (permalink / raw)
Cc: Tomi Valkeinen, Niklas Söderlund, Cosmin Tanislav,
Mauro Carvalho Chehab, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Julien Massot, Catalin Marinas, Will Deacon,
Greg Kroah-Hartman, Liam Girdwood, Mark Brown, Linus Walleij,
Bartosz Golaszewski, Bjorn Andersson, Geert Uytterhoeven,
Dmitry Baryshkov, Heiko Stuebner, Biju Das, Taniya Das,
Nícolas F . R . A . Prado, Eric Biggers, Javier Carrasco,
Ross Burton, Sakari Ailus, Hans Verkuil, Laurent Pinchart,
Umang Jain, Zhi Mao, Kieran Bingham, Dongcheng Yan,
AngeloGioacchino Del Regno, Benjamin Mugnier, Tommaso Merciai,
Dan Carpenter, Ricardo Ribalda, Ihor Matushchak, Laurentiu Palcu,
linux-media, devicetree, linux-kernel, linux-arm-kernel,
linux-staging, linux-gpio, Cosmin Tanislav
The previous MAX96717 driver has been removed and its functionality has
been moved to a MAX96717 driver which makes use of the Maxim GMSL2/3
serializer framework.
Signed-off-by: Cosmin Tanislav <demonsingur@gmail.com>
---
MAINTAINERS | 1 -
drivers/media/i2c/Kconfig | 17 -
drivers/media/i2c/Makefile | 1 -
drivers/media/i2c/max96717.c | 1103 ----------------------------------
4 files changed, 1122 deletions(-)
delete mode 100644 drivers/media/i2c/max96717.c
diff --git a/MAINTAINERS b/MAINTAINERS
index 7bc80ed9ba00..12078126f478 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -14204,7 +14204,6 @@ L: linux-media@vger.kernel.org
S: Maintained
F: Documentation/devicetree/bindings/media/i2c/maxim,max96717-pinctrl.yaml
F: Documentation/devicetree/bindings/media/i2c/maxim,max96717.yaml
-F: drivers/media/i2c/max96717.c
MAX9860 MONO AUDIO VOICE CODEC DRIVER
M: Peter Rosin <peda@axentia.se>
diff --git a/drivers/media/i2c/Kconfig b/drivers/media/i2c/Kconfig
index e24c84962c92..6c595dffb280 100644
--- a/drivers/media/i2c/Kconfig
+++ b/drivers/media/i2c/Kconfig
@@ -1636,23 +1636,6 @@ config VIDEO_MAX96714
To compile this driver as a module, choose M here: the
module will be called max96714.
-config VIDEO_MAX96717
- tristate "Maxim MAX96717 GMSL2 Serializer support"
- depends on OF && I2C && VIDEO_DEV && COMMON_CLK
- select I2C_MUX
- select MEDIA_CONTROLLER
- select GPIOLIB
- select V4L2_CCI_I2C
- select V4L2_FWNODE
- select VIDEO_V4L2_SUBDEV_API
- help
- Device driver for the Maxim MAX96717 GMSL2 Serializer.
- MAX96717 serializers convert video on a MIPI CSI-2
- input to a GMSL2 output.
-
- To compile this driver as a module, choose M here: the
- module will be called max96717.
-
source "drivers/media/i2c/maxim-serdes/Kconfig"
endmenu
diff --git a/drivers/media/i2c/Makefile b/drivers/media/i2c/Makefile
index b24e7cf7bb2f..de0680ebf190 100644
--- a/drivers/media/i2c/Makefile
+++ b/drivers/media/i2c/Makefile
@@ -69,7 +69,6 @@ obj-$(CONFIG_VIDEO_M52790) += m52790.o
obj-$(CONFIG_VIDEO_MAX9271_LIB) += max9271.o
obj-$(CONFIG_VIDEO_MAX9286) += max9286.o
obj-$(CONFIG_VIDEO_MAX96714) += max96714.o
-obj-$(CONFIG_VIDEO_MAX96717) += max96717.o
obj-$(CONFIG_VIDEO_MAXIM_SERDES) += maxim-serdes/
obj-$(CONFIG_VIDEO_ML86V7667) += ml86v7667.o
obj-$(CONFIG_VIDEO_MSP3400) += msp3400.o
diff --git a/drivers/media/i2c/max96717.c b/drivers/media/i2c/max96717.c
deleted file mode 100644
index 9259d58ba734..000000000000
--- a/drivers/media/i2c/max96717.c
+++ /dev/null
@@ -1,1103 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Maxim GMSL2 Serializer Driver
- *
- * Copyright (C) 2024 Collabora Ltd.
- */
-
-#include <linux/bitfield.h>
-#include <linux/clk.h>
-#include <linux/clk-provider.h>
-#include <linux/delay.h>
-#include <linux/fwnode.h>
-#include <linux/gpio/driver.h>
-#include <linux/i2c-mux.h>
-#include <linux/i2c.h>
-#include <linux/regmap.h>
-
-#include <media/v4l2-cci.h>
-#include <media/v4l2-ctrls.h>
-#include <media/v4l2-fwnode.h>
-#include <media/v4l2-subdev.h>
-
-#define MAX96717_DEVICE_ID 0xbf
-#define MAX96717F_DEVICE_ID 0xc8
-#define MAX96717_PORTS 2
-#define MAX96717_PAD_SINK 0
-#define MAX96717_PAD_SOURCE 1
-#define MAX96717_CSI_NLANES 4
-
-#define MAX96717_DEFAULT_CLKOUT_RATE 24000000UL
-
-/* DEV */
-#define MAX96717_REG3 CCI_REG8(0x3)
-#define MAX96717_RCLKSEL GENMASK(1, 0)
-#define RCLKSEL_REF_PLL CCI_REG8(0x3)
-#define MAX96717_REG6 CCI_REG8(0x6)
-#define RCLKEN BIT(5)
-#define MAX96717_DEV_ID CCI_REG8(0xd)
-#define MAX96717_DEV_REV CCI_REG8(0xe)
-#define MAX96717_DEV_REV_MASK GENMASK(3, 0)
-
-/* VID_TX Z */
-#define MAX96717_VIDEO_TX0 CCI_REG8(0x110)
-#define MAX96717_VIDEO_AUTO_BPP BIT(3)
-#define MAX96717_VIDEO_TX2 CCI_REG8(0x112)
-#define MAX96717_VIDEO_PCLKDET BIT(7)
-
-/* VTX_Z */
-#define MAX96717_VTX0 CCI_REG8(0x24e)
-#define MAX96717_VTX1 CCI_REG8(0x24f)
-#define MAX96717_PATTERN_CLK_FREQ GENMASK(3, 1)
-#define MAX96717_VTX_VS_DLY CCI_REG24(0x250)
-#define MAX96717_VTX_VS_HIGH CCI_REG24(0x253)
-#define MAX96717_VTX_VS_LOW CCI_REG24(0x256)
-#define MAX96717_VTX_V2H CCI_REG24(0x259)
-#define MAX96717_VTX_HS_HIGH CCI_REG16(0x25c)
-#define MAX96717_VTX_HS_LOW CCI_REG16(0x25e)
-#define MAX96717_VTX_HS_CNT CCI_REG16(0x260)
-#define MAX96717_VTX_V2D CCI_REG24(0x262)
-#define MAX96717_VTX_DE_HIGH CCI_REG16(0x265)
-#define MAX96717_VTX_DE_LOW CCI_REG16(0x267)
-#define MAX96717_VTX_DE_CNT CCI_REG16(0x269)
-#define MAX96717_VTX29 CCI_REG8(0x26b)
-#define MAX96717_VTX_MODE GENMASK(1, 0)
-#define MAX96717_VTX_GRAD_INC CCI_REG8(0x26c)
-#define MAX96717_VTX_CHKB_COLOR_A CCI_REG24(0x26d)
-#define MAX96717_VTX_CHKB_COLOR_B CCI_REG24(0x270)
-#define MAX96717_VTX_CHKB_RPT_CNT_A CCI_REG8(0x273)
-#define MAX96717_VTX_CHKB_RPT_CNT_B CCI_REG8(0x274)
-#define MAX96717_VTX_CHKB_ALT CCI_REG8(0x275)
-
-/* GPIO */
-#define MAX96717_NUM_GPIO 11
-#define MAX96717_GPIO_REG_A(gpio) CCI_REG8(0x2be + (gpio) * 3)
-#define MAX96717_GPIO_OUT BIT(4)
-#define MAX96717_GPIO_IN BIT(3)
-#define MAX96717_GPIO_RX_EN BIT(2)
-#define MAX96717_GPIO_TX_EN BIT(1)
-#define MAX96717_GPIO_OUT_DIS BIT(0)
-
-/* FRONTTOP */
-/* MAX96717 only have CSI port 'B' */
-#define MAX96717_FRONTOP0 CCI_REG8(0x308)
-#define MAX96717_START_PORT_B BIT(5)
-
-/* MIPI_RX */
-#define MAX96717_MIPI_RX1 CCI_REG8(0x331)
-#define MAX96717_MIPI_LANES_CNT GENMASK(5, 4)
-#define MAX96717_MIPI_RX2 CCI_REG8(0x332) /* phy1 Lanes map */
-#define MAX96717_PHY2_LANES_MAP GENMASK(7, 4)
-#define MAX96717_MIPI_RX3 CCI_REG8(0x333) /* phy2 Lanes map */
-#define MAX96717_PHY1_LANES_MAP GENMASK(3, 0)
-#define MAX96717_MIPI_RX4 CCI_REG8(0x334) /* phy1 lane polarities */
-#define MAX96717_PHY1_LANES_POL GENMASK(6, 4)
-#define MAX96717_MIPI_RX5 CCI_REG8(0x335) /* phy2 lane polarities */
-#define MAX96717_PHY2_LANES_POL GENMASK(2, 0)
-
-/* MIPI_RX_EXT */
-#define MAX96717_MIPI_RX_EXT11 CCI_REG8(0x383)
-#define MAX96717_TUN_MODE BIT(7)
-
-/* REF_VTG */
-#define REF_VTG0 CCI_REG8(0x3f0)
-#define REFGEN_PREDEF_EN BIT(6)
-#define REFGEN_PREDEF_FREQ_MASK GENMASK(5, 4)
-#define REFGEN_PREDEF_FREQ_ALT BIT(3)
-#define REFGEN_RST BIT(1)
-#define REFGEN_EN BIT(0)
-
-/* MISC */
-#define PIO_SLEW_1 CCI_REG8(0x570)
-
-enum max96717_vpg_mode {
- MAX96717_VPG_DISABLED = 0,
- MAX96717_VPG_CHECKERBOARD = 1,
- MAX96717_VPG_GRADIENT = 2,
-};
-
-struct max96717_priv {
- struct i2c_client *client;
- struct regmap *regmap;
- struct i2c_mux_core *mux;
- struct v4l2_mbus_config_mipi_csi2 mipi_csi2;
- struct v4l2_subdev sd;
- struct media_pad pads[MAX96717_PORTS];
- struct v4l2_ctrl_handler ctrl_handler;
- struct v4l2_async_notifier notifier;
- struct v4l2_subdev *source_sd;
- u16 source_sd_pad;
- u64 enabled_source_streams;
- u8 pll_predef_index;
- struct clk_hw clk_hw;
- struct gpio_chip gpio_chip;
- enum max96717_vpg_mode pattern;
-};
-
-static inline struct max96717_priv *sd_to_max96717(struct v4l2_subdev *sd)
-{
- return container_of(sd, struct max96717_priv, sd);
-}
-
-static inline struct max96717_priv *clk_hw_to_max96717(struct clk_hw *hw)
-{
- return container_of(hw, struct max96717_priv, clk_hw);
-}
-
-static int max96717_i2c_mux_select(struct i2c_mux_core *mux, u32 chan)
-{
- return 0;
-}
-
-static int max96717_i2c_mux_init(struct max96717_priv *priv)
-{
- priv->mux = i2c_mux_alloc(priv->client->adapter, &priv->client->dev,
- 1, 0, I2C_MUX_LOCKED | I2C_MUX_GATE,
- max96717_i2c_mux_select, NULL);
- if (!priv->mux)
- return -ENOMEM;
-
- return i2c_mux_add_adapter(priv->mux, 0, 0);
-}
-
-static inline int max96717_start_csi(struct max96717_priv *priv, bool start)
-{
- return cci_update_bits(priv->regmap, MAX96717_FRONTOP0,
- MAX96717_START_PORT_B,
- start ? MAX96717_START_PORT_B : 0, NULL);
-}
-
-static int max96717_apply_patgen_timing(struct max96717_priv *priv,
- struct v4l2_subdev_state *state)
-{
- struct v4l2_mbus_framefmt *fmt =
- v4l2_subdev_state_get_format(state, MAX96717_PAD_SOURCE);
- const u32 h_active = fmt->width;
- const u32 h_fp = 88;
- const u32 h_sw = 44;
- const u32 h_bp = 148;
- u32 h_tot;
- const u32 v_active = fmt->height;
- const u32 v_fp = 4;
- const u32 v_sw = 5;
- const u32 v_bp = 36;
- u32 v_tot;
- int ret = 0;
-
- h_tot = h_active + h_fp + h_sw + h_bp;
- v_tot = v_active + v_fp + v_sw + v_bp;
-
- /* 75 Mhz pixel clock */
- cci_update_bits(priv->regmap, MAX96717_VTX1,
- MAX96717_PATTERN_CLK_FREQ, 0xa, &ret);
-
- dev_info(&priv->client->dev, "height: %d width: %d\n", fmt->height,
- fmt->width);
-
- cci_write(priv->regmap, MAX96717_VTX_VS_DLY, 0, &ret);
- cci_write(priv->regmap, MAX96717_VTX_VS_HIGH, v_sw * h_tot, &ret);
- cci_write(priv->regmap, MAX96717_VTX_VS_LOW,
- (v_active + v_fp + v_bp) * h_tot, &ret);
- cci_write(priv->regmap, MAX96717_VTX_HS_HIGH, h_sw, &ret);
- cci_write(priv->regmap, MAX96717_VTX_HS_LOW, h_active + h_fp + h_bp,
- &ret);
- cci_write(priv->regmap, MAX96717_VTX_V2D,
- h_tot * (v_sw + v_bp) + (h_sw + h_bp), &ret);
- cci_write(priv->regmap, MAX96717_VTX_HS_CNT, v_tot, &ret);
- cci_write(priv->regmap, MAX96717_VTX_DE_HIGH, h_active, &ret);
- cci_write(priv->regmap, MAX96717_VTX_DE_LOW, h_fp + h_sw + h_bp,
- &ret);
- cci_write(priv->regmap, MAX96717_VTX_DE_CNT, v_active, &ret);
- /* B G R */
- cci_write(priv->regmap, MAX96717_VTX_CHKB_COLOR_A, 0xfecc00, &ret);
- /* B G R */
- cci_write(priv->regmap, MAX96717_VTX_CHKB_COLOR_B, 0x006aa7, &ret);
- cci_write(priv->regmap, MAX96717_VTX_CHKB_RPT_CNT_A, 0x3c, &ret);
- cci_write(priv->regmap, MAX96717_VTX_CHKB_RPT_CNT_B, 0x3c, &ret);
- cci_write(priv->regmap, MAX96717_VTX_CHKB_ALT, 0x3c, &ret);
- cci_write(priv->regmap, MAX96717_VTX_GRAD_INC, 0x10, &ret);
-
- return ret;
-}
-
-static int max96717_apply_patgen(struct max96717_priv *priv,
- struct v4l2_subdev_state *state)
-{
- unsigned int val;
- int ret = 0;
-
- if (priv->pattern)
- ret = max96717_apply_patgen_timing(priv, state);
-
- cci_write(priv->regmap, MAX96717_VTX0, priv->pattern ? 0xfb : 0,
- &ret);
-
- val = FIELD_PREP(MAX96717_VTX_MODE, priv->pattern);
- cci_update_bits(priv->regmap, MAX96717_VTX29, MAX96717_VTX_MODE,
- val, &ret);
- return ret;
-}
-
-static int max96717_s_ctrl(struct v4l2_ctrl *ctrl)
-{
- struct max96717_priv *priv =
- container_of(ctrl->handler, struct max96717_priv, ctrl_handler);
- int ret;
-
- switch (ctrl->id) {
- case V4L2_CID_TEST_PATTERN:
- if (priv->enabled_source_streams)
- return -EBUSY;
- priv->pattern = ctrl->val;
- break;
- default:
- return -EINVAL;
- }
-
- /* Use bpp from bpp register */
- ret = cci_update_bits(priv->regmap, MAX96717_VIDEO_TX0,
- MAX96717_VIDEO_AUTO_BPP,
- priv->pattern ? 0 : MAX96717_VIDEO_AUTO_BPP,
- NULL);
-
- /*
- * Pattern generator doesn't work with tunnel mode.
- * Needs RGB color format and deserializer tunnel mode must be disabled.
- */
- return cci_update_bits(priv->regmap, MAX96717_MIPI_RX_EXT11,
- MAX96717_TUN_MODE,
- priv->pattern ? 0 : MAX96717_TUN_MODE, &ret);
-}
-
-static const char * const max96717_test_pattern[] = {
- "Disabled",
- "Checkerboard",
- "Gradient"
-};
-
-static const struct v4l2_ctrl_ops max96717_ctrl_ops = {
- .s_ctrl = max96717_s_ctrl,
-};
-
-static int max96717_gpiochip_get(struct gpio_chip *gpiochip,
- unsigned int offset)
-{
- struct max96717_priv *priv = gpiochip_get_data(gpiochip);
- u64 val;
- int ret;
-
- ret = cci_read(priv->regmap, MAX96717_GPIO_REG_A(offset),
- &val, NULL);
- if (ret)
- return ret;
-
- if (val & MAX96717_GPIO_OUT_DIS)
- return !!(val & MAX96717_GPIO_IN);
- else
- return !!(val & MAX96717_GPIO_OUT);
-}
-
-static void max96717_gpiochip_set(struct gpio_chip *gpiochip,
- unsigned int offset, int value)
-{
- struct max96717_priv *priv = gpiochip_get_data(gpiochip);
-
- cci_update_bits(priv->regmap, MAX96717_GPIO_REG_A(offset),
- MAX96717_GPIO_OUT, MAX96717_GPIO_OUT, NULL);
-}
-
-static int max96717_gpio_get_direction(struct gpio_chip *gpiochip,
- unsigned int offset)
-{
- struct max96717_priv *priv = gpiochip_get_data(gpiochip);
- u64 val;
- int ret;
-
- ret = cci_read(priv->regmap, MAX96717_GPIO_REG_A(offset), &val, NULL);
- if (ret < 0)
- return ret;
-
- return !!(val & MAX96717_GPIO_OUT_DIS);
-}
-
-static int max96717_gpio_direction_out(struct gpio_chip *gpiochip,
- unsigned int offset, int value)
-{
- struct max96717_priv *priv = gpiochip_get_data(gpiochip);
-
- return cci_update_bits(priv->regmap, MAX96717_GPIO_REG_A(offset),
- MAX96717_GPIO_OUT_DIS | MAX96717_GPIO_OUT,
- value ? MAX96717_GPIO_OUT : 0, NULL);
-}
-
-static int max96717_gpio_direction_in(struct gpio_chip *gpiochip,
- unsigned int offset)
-{
- struct max96717_priv *priv = gpiochip_get_data(gpiochip);
-
- return cci_update_bits(priv->regmap, MAX96717_GPIO_REG_A(offset),
- MAX96717_GPIO_OUT_DIS, MAX96717_GPIO_OUT_DIS,
- NULL);
-}
-
-static int max96717_gpiochip_probe(struct max96717_priv *priv)
-{
- struct device *dev = &priv->client->dev;
- struct gpio_chip *gc = &priv->gpio_chip;
- int i, ret = 0;
-
- gc->label = dev_name(dev);
- gc->parent = dev;
- gc->owner = THIS_MODULE;
- gc->ngpio = MAX96717_NUM_GPIO;
- gc->base = -1;
- gc->can_sleep = true;
- gc->get_direction = max96717_gpio_get_direction;
- gc->direction_input = max96717_gpio_direction_in;
- gc->direction_output = max96717_gpio_direction_out;
- gc->set = max96717_gpiochip_set;
- gc->get = max96717_gpiochip_get;
- gc->of_gpio_n_cells = 2;
-
- /* Disable GPIO forwarding */
- for (i = 0; i < gc->ngpio; i++)
- cci_update_bits(priv->regmap, MAX96717_GPIO_REG_A(i),
- MAX96717_GPIO_RX_EN | MAX96717_GPIO_TX_EN,
- 0, &ret);
-
- if (ret)
- return ret;
-
- ret = devm_gpiochip_add_data(dev, gc, priv);
- if (ret) {
- dev_err(dev, "Unable to create gpio_chip\n");
- return ret;
- }
-
- return 0;
-}
-
-static int _max96717_set_routing(struct v4l2_subdev *sd,
- struct v4l2_subdev_state *state,
- struct v4l2_subdev_krouting *routing)
-{
- static const struct v4l2_mbus_framefmt format = {
- .width = 1280,
- .height = 1080,
- .code = MEDIA_BUS_FMT_Y8_1X8,
- .field = V4L2_FIELD_NONE,
- };
- int ret;
-
- ret = v4l2_subdev_routing_validate(sd, routing,
- V4L2_SUBDEV_ROUTING_ONLY_1_TO_1);
- if (ret)
- return ret;
-
- ret = v4l2_subdev_set_routing_with_fmt(sd, state, routing, &format);
- if (ret)
- return ret;
-
- return 0;
-}
-
-static int max96717_set_routing(struct v4l2_subdev *sd,
- struct v4l2_subdev_state *state,
- enum v4l2_subdev_format_whence which,
- struct v4l2_subdev_krouting *routing)
-{
- struct max96717_priv *priv = sd_to_max96717(sd);
-
- if (which == V4L2_SUBDEV_FORMAT_ACTIVE && priv->enabled_source_streams)
- return -EBUSY;
-
- return _max96717_set_routing(sd, state, routing);
-}
-
-static int max96717_set_fmt(struct v4l2_subdev *sd,
- struct v4l2_subdev_state *state,
- struct v4l2_subdev_format *format)
-{
- struct max96717_priv *priv = sd_to_max96717(sd);
- struct v4l2_mbus_framefmt *fmt;
- u64 stream_source_mask;
-
- if (format->which == V4L2_SUBDEV_FORMAT_ACTIVE &&
- priv->enabled_source_streams)
- return -EBUSY;
-
- /* No transcoding, source and sink formats must match. */
- if (format->pad == MAX96717_PAD_SOURCE)
- return v4l2_subdev_get_fmt(sd, state, format);
-
- /* Set sink format */
- fmt = v4l2_subdev_state_get_format(state, format->pad, format->stream);
- if (!fmt)
- return -EINVAL;
-
- *fmt = format->format;
-
- /* Propagate to source format */
- fmt = v4l2_subdev_state_get_opposite_stream_format(state, format->pad,
- format->stream);
- if (!fmt)
- return -EINVAL;
- *fmt = format->format;
-
- stream_source_mask = BIT(format->stream);
-
- return v4l2_subdev_state_xlate_streams(state, MAX96717_PAD_SOURCE,
- MAX96717_PAD_SINK,
- &stream_source_mask);
-}
-
-static int max96717_init_state(struct v4l2_subdev *sd,
- struct v4l2_subdev_state *state)
-{
- struct v4l2_subdev_route routes[] = {
- {
- .sink_pad = MAX96717_PAD_SINK,
- .sink_stream = 0,
- .source_pad = MAX96717_PAD_SOURCE,
- .source_stream = 0,
- .flags = V4L2_SUBDEV_ROUTE_FL_ACTIVE,
- },
- };
- struct v4l2_subdev_krouting routing = {
- .num_routes = ARRAY_SIZE(routes),
- .routes = routes,
- };
-
- return _max96717_set_routing(sd, state, &routing);
-}
-
-static bool max96717_pipe_pclkdet(struct max96717_priv *priv)
-{
- u64 val = 0;
-
- cci_read(priv->regmap, MAX96717_VIDEO_TX2, &val, NULL);
-
- return val & MAX96717_VIDEO_PCLKDET;
-}
-
-static int max96717_log_status(struct v4l2_subdev *sd)
-{
- struct max96717_priv *priv = sd_to_max96717(sd);
- struct device *dev = &priv->client->dev;
-
- dev_info(dev, "Serializer: max96717\n");
- dev_info(dev, "Pipe: pclkdet:%d\n", max96717_pipe_pclkdet(priv));
-
- return 0;
-}
-
-static int max96717_enable_streams(struct v4l2_subdev *sd,
- struct v4l2_subdev_state *state, u32 pad,
- u64 streams_mask)
-{
- struct max96717_priv *priv = sd_to_max96717(sd);
- u64 sink_streams;
- int ret;
-
- if (!priv->enabled_source_streams)
- max96717_start_csi(priv, true);
-
- ret = max96717_apply_patgen(priv, state);
- if (ret)
- goto stop_csi;
-
- if (!priv->pattern) {
- sink_streams =
- v4l2_subdev_state_xlate_streams(state,
- MAX96717_PAD_SOURCE,
- MAX96717_PAD_SINK,
- &streams_mask);
-
- ret = v4l2_subdev_enable_streams(priv->source_sd,
- priv->source_sd_pad,
- sink_streams);
- if (ret)
- goto stop_csi;
- }
-
- priv->enabled_source_streams |= streams_mask;
-
- return 0;
-
-stop_csi:
- if (!priv->enabled_source_streams)
- max96717_start_csi(priv, false);
-
- return ret;
-}
-
-static int max96717_disable_streams(struct v4l2_subdev *sd,
- struct v4l2_subdev_state *state, u32 pad,
- u64 streams_mask)
-{
- struct max96717_priv *priv = sd_to_max96717(sd);
- u64 sink_streams;
-
- /*
- * Stop the CSI receiver first then the source,
- * otherwise the device may become unresponsive
- * while holding the I2C bus low.
- */
- priv->enabled_source_streams &= ~streams_mask;
- if (!priv->enabled_source_streams)
- max96717_start_csi(priv, false);
-
- if (!priv->pattern) {
- int ret;
-
- sink_streams =
- v4l2_subdev_state_xlate_streams(state,
- MAX96717_PAD_SOURCE,
- MAX96717_PAD_SINK,
- &streams_mask);
-
- ret = v4l2_subdev_disable_streams(priv->source_sd,
- priv->source_sd_pad,
- sink_streams);
- if (ret)
- return ret;
- }
-
- return 0;
-}
-
-static const struct v4l2_subdev_pad_ops max96717_pad_ops = {
- .enable_streams = max96717_enable_streams,
- .disable_streams = max96717_disable_streams,
- .set_routing = max96717_set_routing,
- .get_fmt = v4l2_subdev_get_fmt,
- .set_fmt = max96717_set_fmt,
-};
-
-static const struct v4l2_subdev_core_ops max96717_subdev_core_ops = {
- .log_status = max96717_log_status,
-};
-
-static const struct v4l2_subdev_internal_ops max96717_internal_ops = {
- .init_state = max96717_init_state,
-};
-
-static const struct v4l2_subdev_ops max96717_subdev_ops = {
- .core = &max96717_subdev_core_ops,
- .pad = &max96717_pad_ops,
-};
-
-static const struct media_entity_operations max96717_entity_ops = {
- .link_validate = v4l2_subdev_link_validate,
-};
-
-static int max96717_notify_bound(struct v4l2_async_notifier *notifier,
- struct v4l2_subdev *source_subdev,
- struct v4l2_async_connection *asd)
-{
- struct max96717_priv *priv = sd_to_max96717(notifier->sd);
- struct device *dev = &priv->client->dev;
- int ret;
-
- ret = media_entity_get_fwnode_pad(&source_subdev->entity,
- source_subdev->fwnode,
- MEDIA_PAD_FL_SOURCE);
- if (ret < 0) {
- dev_err(dev, "Failed to find pad for %s\n",
- source_subdev->name);
- return ret;
- }
-
- priv->source_sd = source_subdev;
- priv->source_sd_pad = ret;
-
- ret = media_create_pad_link(&source_subdev->entity, priv->source_sd_pad,
- &priv->sd.entity, 0,
- MEDIA_LNK_FL_ENABLED |
- MEDIA_LNK_FL_IMMUTABLE);
- if (ret) {
- dev_err(dev, "Unable to link %s:%u -> %s:0\n",
- source_subdev->name, priv->source_sd_pad,
- priv->sd.name);
- return ret;
- }
-
- return 0;
-}
-
-static const struct v4l2_async_notifier_operations max96717_notify_ops = {
- .bound = max96717_notify_bound,
-};
-
-static int max96717_v4l2_notifier_register(struct max96717_priv *priv)
-{
- struct device *dev = &priv->client->dev;
- struct v4l2_async_connection *asd;
- struct fwnode_handle *ep_fwnode;
- int ret;
-
- ep_fwnode = fwnode_graph_get_endpoint_by_id(dev_fwnode(dev),
- MAX96717_PAD_SINK, 0, 0);
- if (!ep_fwnode) {
- dev_err(dev, "No graph endpoint\n");
- return -ENODEV;
- }
-
- v4l2_async_subdev_nf_init(&priv->notifier, &priv->sd);
-
- asd = v4l2_async_nf_add_fwnode_remote(&priv->notifier, ep_fwnode,
- struct v4l2_async_connection);
-
- fwnode_handle_put(ep_fwnode);
-
- if (IS_ERR(asd)) {
- dev_err(dev, "Failed to add subdev: %ld", PTR_ERR(asd));
- v4l2_async_nf_cleanup(&priv->notifier);
- return PTR_ERR(asd);
- }
-
- priv->notifier.ops = &max96717_notify_ops;
-
- ret = v4l2_async_nf_register(&priv->notifier);
- if (ret) {
- dev_err(dev, "Failed to register subdev_notifier");
- v4l2_async_nf_cleanup(&priv->notifier);
- return ret;
- }
-
- return 0;
-}
-
-static int max96717_subdev_init(struct max96717_priv *priv)
-{
- struct device *dev = &priv->client->dev;
- int ret;
-
- v4l2_i2c_subdev_init(&priv->sd, priv->client, &max96717_subdev_ops);
- priv->sd.internal_ops = &max96717_internal_ops;
-
- v4l2_ctrl_handler_init(&priv->ctrl_handler, 1);
- priv->sd.ctrl_handler = &priv->ctrl_handler;
-
- v4l2_ctrl_new_std_menu_items(&priv->ctrl_handler,
- &max96717_ctrl_ops,
- V4L2_CID_TEST_PATTERN,
- ARRAY_SIZE(max96717_test_pattern) - 1,
- 0, 0, max96717_test_pattern);
- if (priv->ctrl_handler.error) {
- ret = priv->ctrl_handler.error;
- goto err_free_ctrl;
- }
-
- priv->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE | V4L2_SUBDEV_FL_STREAMS;
- priv->sd.entity.function = MEDIA_ENT_F_VID_IF_BRIDGE;
- priv->sd.entity.ops = &max96717_entity_ops;
-
- priv->pads[MAX96717_PAD_SINK].flags = MEDIA_PAD_FL_SINK;
- priv->pads[MAX96717_PAD_SOURCE].flags = MEDIA_PAD_FL_SOURCE;
-
- ret = media_entity_pads_init(&priv->sd.entity, 2, priv->pads);
- if (ret) {
- dev_err_probe(dev, ret, "Failed to init pads\n");
- goto err_free_ctrl;
- }
-
- ret = v4l2_subdev_init_finalize(&priv->sd);
- if (ret) {
- dev_err_probe(dev, ret,
- "v4l2 subdev init finalized failed\n");
- goto err_entity_cleanup;
- }
- ret = max96717_v4l2_notifier_register(priv);
- if (ret) {
- dev_err_probe(dev, ret,
- "v4l2 subdev notifier register failed\n");
- goto err_free_state;
- }
-
- ret = v4l2_async_register_subdev(&priv->sd);
- if (ret) {
- dev_err_probe(dev, ret, "v4l2_async_register_subdev error\n");
- goto err_unreg_notif;
- }
-
- return 0;
-
-err_unreg_notif:
- v4l2_async_nf_unregister(&priv->notifier);
- v4l2_async_nf_cleanup(&priv->notifier);
-err_free_state:
- v4l2_subdev_cleanup(&priv->sd);
-err_entity_cleanup:
- media_entity_cleanup(&priv->sd.entity);
-err_free_ctrl:
- v4l2_ctrl_handler_free(&priv->ctrl_handler);
-
- return ret;
-}
-
-static void max96717_subdev_uninit(struct max96717_priv *priv)
-{
- v4l2_async_unregister_subdev(&priv->sd);
- v4l2_async_nf_unregister(&priv->notifier);
- v4l2_async_nf_cleanup(&priv->notifier);
- v4l2_subdev_cleanup(&priv->sd);
- media_entity_cleanup(&priv->sd.entity);
- v4l2_ctrl_handler_free(&priv->ctrl_handler);
-}
-
-struct max96717_pll_predef_freq {
- unsigned long freq;
- bool is_alt;
- u8 val;
-};
-
-static const struct max96717_pll_predef_freq max96717_predef_freqs[] = {
- { 13500000, true, 0 }, { 19200000, false, 0 },
- { 24000000, true, 1 }, { 27000000, false, 1 },
- { 37125000, false, 2 }, { 74250000, false, 3 },
-};
-
-static unsigned long
-max96717_clk_recalc_rate(struct clk_hw *hw, unsigned long parent_rate)
-{
- struct max96717_priv *priv = clk_hw_to_max96717(hw);
-
- return max96717_predef_freqs[priv->pll_predef_index].freq;
-}
-
-static unsigned int max96717_clk_find_best_index(struct max96717_priv *priv,
- unsigned long rate)
-{
- unsigned int i, idx = 0;
- unsigned long diff_new, diff_old = U32_MAX;
-
- for (i = 0; i < ARRAY_SIZE(max96717_predef_freqs); i++) {
- diff_new = abs(rate - max96717_predef_freqs[i].freq);
- if (diff_new < diff_old) {
- diff_old = diff_new;
- idx = i;
- }
- }
-
- return idx;
-}
-
-static long max96717_clk_round_rate(struct clk_hw *hw, unsigned long rate,
- unsigned long *parent_rate)
-{
- struct max96717_priv *priv = clk_hw_to_max96717(hw);
- struct device *dev = &priv->client->dev;
- unsigned int idx;
-
- idx = max96717_clk_find_best_index(priv, rate);
-
- if (rate != max96717_predef_freqs[idx].freq) {
- dev_warn(dev, "Request CLK freq:%lu, found CLK freq:%lu\n",
- rate, max96717_predef_freqs[idx].freq);
- }
-
- return max96717_predef_freqs[idx].freq;
-}
-
-static int max96717_clk_set_rate(struct clk_hw *hw, unsigned long rate,
- unsigned long parent_rate)
-{
- struct max96717_priv *priv = clk_hw_to_max96717(hw);
- unsigned int val, idx;
- int ret = 0;
-
- idx = max96717_clk_find_best_index(priv, rate);
-
- val = FIELD_PREP(REFGEN_PREDEF_FREQ_MASK,
- max96717_predef_freqs[idx].val);
-
- if (max96717_predef_freqs[idx].is_alt)
- val |= REFGEN_PREDEF_FREQ_ALT;
-
- val |= REFGEN_RST | REFGEN_PREDEF_EN;
-
- cci_write(priv->regmap, REF_VTG0, val, &ret);
- cci_update_bits(priv->regmap, REF_VTG0, REFGEN_RST | REFGEN_EN,
- REFGEN_EN, &ret);
- if (ret)
- return ret;
-
- priv->pll_predef_index = idx;
-
- return 0;
-}
-
-static int max96717_clk_prepare(struct clk_hw *hw)
-{
- struct max96717_priv *priv = clk_hw_to_max96717(hw);
-
- return cci_update_bits(priv->regmap, MAX96717_REG6, RCLKEN,
- RCLKEN, NULL);
-}
-
-static void max96717_clk_unprepare(struct clk_hw *hw)
-{
- struct max96717_priv *priv = clk_hw_to_max96717(hw);
-
- cci_update_bits(priv->regmap, MAX96717_REG6, RCLKEN, 0, NULL);
-}
-
-static const struct clk_ops max96717_clk_ops = {
- .prepare = max96717_clk_prepare,
- .unprepare = max96717_clk_unprepare,
- .set_rate = max96717_clk_set_rate,
- .recalc_rate = max96717_clk_recalc_rate,
- .round_rate = max96717_clk_round_rate,
-};
-
-static int max96717_register_clkout(struct max96717_priv *priv)
-{
- struct device *dev = &priv->client->dev;
- struct clk_init_data init = { .ops = &max96717_clk_ops };
- int ret;
-
- init.name = kasprintf(GFP_KERNEL, "max96717.%s.clk_out", dev_name(dev));
- if (!init.name)
- return -ENOMEM;
-
- /* RCLKSEL Reference PLL output */
- ret = cci_update_bits(priv->regmap, MAX96717_REG3, MAX96717_RCLKSEL,
- MAX96717_RCLKSEL, NULL);
- /* MFP4 fastest slew rate */
- cci_update_bits(priv->regmap, PIO_SLEW_1, BIT(5) | BIT(4), 0, &ret);
- if (ret)
- goto free_init_name;
-
- priv->clk_hw.init = &init;
-
- /* Initialize to 24 MHz */
- ret = max96717_clk_set_rate(&priv->clk_hw,
- MAX96717_DEFAULT_CLKOUT_RATE, 0);
- if (ret < 0)
- goto free_init_name;
-
- ret = devm_clk_hw_register(dev, &priv->clk_hw);
- kfree(init.name);
- if (ret)
- return dev_err_probe(dev, ret, "Cannot register clock HW\n");
-
- ret = devm_of_clk_add_hw_provider(dev, of_clk_hw_simple_get,
- &priv->clk_hw);
- if (ret)
- return dev_err_probe(dev, ret,
- "Cannot add OF clock provider\n");
-
- return 0;
-
-free_init_name:
- kfree(init.name);
- return ret;
-}
-
-static int max96717_init_csi_lanes(struct max96717_priv *priv)
-{
- struct v4l2_mbus_config_mipi_csi2 *mipi = &priv->mipi_csi2;
- unsigned long lanes_used = 0;
- unsigned int nlanes, lane, val = 0;
- int ret;
-
- nlanes = mipi->num_data_lanes;
-
- ret = cci_update_bits(priv->regmap, MAX96717_MIPI_RX1,
- MAX96717_MIPI_LANES_CNT,
- FIELD_PREP(MAX96717_MIPI_LANES_CNT,
- nlanes - 1), NULL);
-
- /* lanes polarity */
- for (lane = 0; lane < nlanes + 1; lane++) {
- if (!mipi->lane_polarities[lane])
- continue;
- /* Clock lane */
- if (lane == 0)
- val |= BIT(2);
- else if (lane < 3)
- val |= BIT(lane - 1);
- else
- val |= BIT(lane);
- }
-
- cci_update_bits(priv->regmap, MAX96717_MIPI_RX5,
- MAX96717_PHY2_LANES_POL,
- FIELD_PREP(MAX96717_PHY2_LANES_POL, val), &ret);
-
- cci_update_bits(priv->regmap, MAX96717_MIPI_RX4,
- MAX96717_PHY1_LANES_POL,
- FIELD_PREP(MAX96717_PHY1_LANES_POL,
- val >> 3), &ret);
- /* lanes mapping */
- for (lane = 0, val = 0; lane < nlanes; lane++) {
- val |= (mipi->data_lanes[lane] - 1) << (lane * 2);
- lanes_used |= BIT(mipi->data_lanes[lane] - 1);
- }
-
- /*
- * Unused lanes need to be mapped as well to not have
- * the same lanes mapped twice.
- */
- for (; lane < MAX96717_CSI_NLANES; lane++) {
- unsigned int idx = find_first_zero_bit(&lanes_used,
- MAX96717_CSI_NLANES);
-
- val |= idx << (lane * 2);
- lanes_used |= BIT(idx);
- }
-
- cci_update_bits(priv->regmap, MAX96717_MIPI_RX3,
- MAX96717_PHY1_LANES_MAP,
- FIELD_PREP(MAX96717_PHY1_LANES_MAP, val), &ret);
-
- return cci_update_bits(priv->regmap, MAX96717_MIPI_RX2,
- MAX96717_PHY2_LANES_MAP,
- FIELD_PREP(MAX96717_PHY2_LANES_MAP, val >> 4),
- &ret);
-}
-
-static int max96717_hw_init(struct max96717_priv *priv)
-{
- struct device *dev = &priv->client->dev;
- u64 dev_id, val;
- int ret;
-
- ret = cci_read(priv->regmap, MAX96717_DEV_ID, &dev_id, NULL);
- if (ret)
- return dev_err_probe(dev, ret,
- "Fail to read the device id\n");
-
- if (dev_id != MAX96717_DEVICE_ID && dev_id != MAX96717F_DEVICE_ID)
- return dev_err_probe(dev, -EOPNOTSUPP,
- "Unsupported device id got %x\n", (u8)dev_id);
-
- ret = cci_read(priv->regmap, MAX96717_DEV_REV, &val, NULL);
- if (ret)
- return dev_err_probe(dev, ret,
- "Fail to read device revision");
-
- dev_dbg(dev, "Found %x (rev %lx)\n", (u8)dev_id,
- (u8)val & MAX96717_DEV_REV_MASK);
-
- ret = cci_read(priv->regmap, MAX96717_MIPI_RX_EXT11, &val, NULL);
- if (ret)
- return dev_err_probe(dev, ret,
- "Fail to read mipi rx extension");
-
- if (!(val & MAX96717_TUN_MODE))
- return dev_err_probe(dev, -EOPNOTSUPP,
- "Only supporting tunnel mode");
-
- return max96717_init_csi_lanes(priv);
-}
-
-static int max96717_parse_dt(struct max96717_priv *priv)
-{
- struct device *dev = &priv->client->dev;
- struct v4l2_fwnode_endpoint vep = { .bus_type = V4L2_MBUS_CSI2_DPHY };
- struct fwnode_handle *ep_fwnode;
- unsigned char num_data_lanes;
- int ret;
-
- ep_fwnode = fwnode_graph_get_endpoint_by_id(dev_fwnode(dev),
- MAX96717_PAD_SINK, 0, 0);
- if (!ep_fwnode)
- return dev_err_probe(dev, -ENOENT, "no endpoint found\n");
-
- ret = v4l2_fwnode_endpoint_parse(ep_fwnode, &vep);
-
- fwnode_handle_put(ep_fwnode);
-
- if (ret < 0)
- return dev_err_probe(dev, ret, "Failed to parse sink endpoint");
-
- num_data_lanes = vep.bus.mipi_csi2.num_data_lanes;
- if (num_data_lanes < 1 || num_data_lanes > MAX96717_CSI_NLANES)
- return dev_err_probe(dev, -EINVAL,
- "Invalid data lanes must be 1 to 4\n");
-
- priv->mipi_csi2 = vep.bus.mipi_csi2;
-
- return 0;
-}
-
-static int max96717_probe(struct i2c_client *client)
-{
- struct device *dev = &client->dev;
- struct max96717_priv *priv;
- int ret;
-
- priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
- if (!priv)
- return -ENOMEM;
-
- priv->client = client;
- priv->regmap = devm_cci_regmap_init_i2c(client, 16);
- if (IS_ERR(priv->regmap)) {
- ret = PTR_ERR(priv->regmap);
- return dev_err_probe(dev, ret, "Failed to init regmap\n");
- }
-
- ret = max96717_parse_dt(priv);
- if (ret)
- return dev_err_probe(dev, ret, "Failed to parse the dt\n");
-
- ret = max96717_hw_init(priv);
- if (ret)
- return dev_err_probe(dev, ret,
- "Failed to initialize the hardware\n");
-
- ret = max96717_gpiochip_probe(priv);
- if (ret)
- return dev_err_probe(&client->dev, ret,
- "Failed to init gpiochip\n");
-
- ret = max96717_register_clkout(priv);
- if (ret)
- return dev_err_probe(dev, ret, "Failed to register clkout\n");
-
- ret = max96717_subdev_init(priv);
- if (ret)
- return dev_err_probe(dev, ret,
- "Failed to initialize v4l2 subdev\n");
-
- ret = max96717_i2c_mux_init(priv);
- if (ret) {
- dev_err_probe(dev, ret, "failed to add remote i2c adapter\n");
- max96717_subdev_uninit(priv);
- }
-
- return ret;
-}
-
-static void max96717_remove(struct i2c_client *client)
-{
- struct v4l2_subdev *sd = i2c_get_clientdata(client);
- struct max96717_priv *priv = sd_to_max96717(sd);
-
- max96717_subdev_uninit(priv);
- i2c_mux_del_adapters(priv->mux);
-}
-
-static const struct of_device_id max96717_of_ids[] = {
- { .compatible = "maxim,max96717f" },
- { }
-};
-MODULE_DEVICE_TABLE(of, max96717_of_ids);
-
-static struct i2c_driver max96717_i2c_driver = {
- .driver = {
- .name = "max96717",
- .of_match_table = max96717_of_ids,
- },
- .probe = max96717_probe,
- .remove = max96717_remove,
-};
-
-module_i2c_driver(max96717_i2c_driver);
-
-MODULE_DESCRIPTION("Maxim GMSL2 MAX96717 Serializer Driver");
-MODULE_AUTHOR("Julien Massot <julien.massot@collabora.com>");
-MODULE_LICENSE("GPL");
--
2.48.1
^ permalink raw reply related [flat|nested] 30+ messages in thread* [RFC PATCH 24/24] media: i2c: remove MAX96714 driver
2025-03-08 18:33 [RFC PATCH 00/24] media: i2c: add Maxim GMSL2/3 serializer and deserializer drivers Cosmin Tanislav
` (21 preceding siblings ...)
2025-03-08 18:33 ` [RFC PATCH 23/24] media: i2c: remove MAX96717 driver Cosmin Tanislav
@ 2025-03-08 18:33 ` Cosmin Tanislav
22 siblings, 0 replies; 30+ messages in thread
From: Cosmin Tanislav @ 2025-03-08 18:33 UTC (permalink / raw)
Cc: Tomi Valkeinen, Niklas Söderlund, Cosmin Tanislav,
Mauro Carvalho Chehab, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Julien Massot, Catalin Marinas, Will Deacon,
Greg Kroah-Hartman, Liam Girdwood, Mark Brown, Linus Walleij,
Bartosz Golaszewski, Bjorn Andersson, Geert Uytterhoeven,
Dmitry Baryshkov, Heiko Stuebner, Biju Das, Taniya Das,
Nícolas F . R . A . Prado, Eric Biggers, Javier Carrasco,
Ross Burton, Sakari Ailus, Hans Verkuil, Laurent Pinchart,
Umang Jain, Zhi Mao, Kieran Bingham, Dongcheng Yan,
AngeloGioacchino Del Regno, Benjamin Mugnier, Tommaso Merciai,
Dan Carpenter, Ricardo Ribalda, Ihor Matushchak, Laurentiu Palcu,
linux-media, devicetree, linux-kernel, linux-arm-kernel,
linux-staging, linux-gpio, Cosmin Tanislav
The previous MAX96714 driver has been removed and its functionality has
been moved to the MAX9296A driver which makes use of the Maxim GMSL2/3
serializer framework.
Signed-off-by: Cosmin Tanislav <demonsingur@gmail.com>
---
MAINTAINERS | 1 -
drivers/media/i2c/Kconfig | 17 -
drivers/media/i2c/Makefile | 1 -
drivers/media/i2c/max96714.c | 1024 ----------------------------------
4 files changed, 1043 deletions(-)
delete mode 100644 drivers/media/i2c/max96714.c
diff --git a/MAINTAINERS b/MAINTAINERS
index 12078126f478..eae3a888e3fa 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -14195,7 +14195,6 @@ M: Cosmin Tanislav <cosmin.tanislav@analog.com>
L: linux-media@vger.kernel.org
S: Maintained
F: Documentation/devicetree/bindings/media/i2c/maxim,max96714.yaml
-F: drivers/media/i2c/max96714.c
MAX96717 GMSL2 SERIALIZER DRIVER
M: Julien Massot <julien.massot@collabora.com>
diff --git a/drivers/media/i2c/Kconfig b/drivers/media/i2c/Kconfig
index 6c595dffb280..aa0a67b7da47 100644
--- a/drivers/media/i2c/Kconfig
+++ b/drivers/media/i2c/Kconfig
@@ -1619,23 +1619,6 @@ config VIDEO_DS90UB960
Device driver for the Texas Instruments DS90UB960
FPD-Link III Deserializer and DS90UB9702 FPD-Link IV Deserializer.
-config VIDEO_MAX96714
- tristate "Maxim MAX96714 GMSL2 deserializer"
- depends on OF && I2C && VIDEO_DEV
- select I2C_MUX
- select MEDIA_CONTROLLER
- select GPIOLIB
- select V4L2_CCI_I2C
- select V4L2_FWNODE
- select VIDEO_V4L2_SUBDEV_API
- help
- Device driver for the Maxim MAX96714 GMSL2 Deserializer.
- MAX96714 deserializers convert a GMSL2 input to MIPI CSI-2
- output.
-
- To compile this driver as a module, choose M here: the
- module will be called max96714.
-
source "drivers/media/i2c/maxim-serdes/Kconfig"
endmenu
diff --git a/drivers/media/i2c/Makefile b/drivers/media/i2c/Makefile
index de0680ebf190..065e728f54ce 100644
--- a/drivers/media/i2c/Makefile
+++ b/drivers/media/i2c/Makefile
@@ -68,7 +68,6 @@ obj-$(CONFIG_VIDEO_LT6911UXE) += lt6911uxe.o
obj-$(CONFIG_VIDEO_M52790) += m52790.o
obj-$(CONFIG_VIDEO_MAX9271_LIB) += max9271.o
obj-$(CONFIG_VIDEO_MAX9286) += max9286.o
-obj-$(CONFIG_VIDEO_MAX96714) += max96714.o
obj-$(CONFIG_VIDEO_MAXIM_SERDES) += maxim-serdes/
obj-$(CONFIG_VIDEO_ML86V7667) += ml86v7667.o
obj-$(CONFIG_VIDEO_MSP3400) += msp3400.o
diff --git a/drivers/media/i2c/max96714.c b/drivers/media/i2c/max96714.c
deleted file mode 100644
index 159753b13777..000000000000
--- a/drivers/media/i2c/max96714.c
+++ /dev/null
@@ -1,1024 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Maxim GMSL2 Deserializer Driver
- *
- * Copyright (C) 2024 Collabora Ltd.
- */
-
-#include <linux/bitfield.h>
-#include <linux/bitops.h>
-#include <linux/fwnode.h>
-#include <linux/gpio/consumer.h>
-#include <linux/i2c.h>
-#include <linux/i2c-mux.h>
-#include <linux/module.h>
-#include <linux/regmap.h>
-#include <linux/regulator/consumer.h>
-
-#include <media/v4l2-cci.h>
-#include <media/v4l2-ctrls.h>
-#include <media/v4l2-fwnode.h>
-#include <media/v4l2-subdev.h>
-
-#define MAX96714_DEVICE_ID 0xc9
-#define MAX96714F_DEVICE_ID 0xca
-#define MAX96714_NPORTS 2
-#define MAX96714_PAD_SINK 0
-#define MAX96714_PAD_SOURCE 1
-#define MAX96714_CSI_NLANES 4
-
-/* DEV */
-#define MAX96714_REG13 CCI_REG8(0x0d)
-#define MAX96714_DEV_REV CCI_REG8(0x0e)
-#define MAX96714_DEV_REV_MASK GENMASK(3, 0)
-#define MAX96714_LINK_LOCK CCI_REG8(0x13)
-#define MAX96714_LINK_LOCK_BIT BIT(3)
-#define MAX96714_IO_CHK0 CCI_REG8(0x38)
-#define MAX96714_PATTERN_CLK_FREQ GENMASK(1, 0)
-/* VID_RX */
-#define MAX96714_VIDEO_RX8 CCI_REG8(0x11a)
-#define MAX96714_VID_LOCK BIT(6)
-
-/* VRX_PATGEN_0 */
-#define MAX96714_PATGEN_0 CCI_REG8(0x240)
-#define MAX96714_PATGEN_1 CCI_REG8(0x241)
-#define MAX96714_PATGEN_MODE GENMASK(5, 4)
-#define MAX96714_PATGEN_VS_DLY CCI_REG24(0x242)
-#define MAX96714_PATGEN_VS_HIGH CCI_REG24(0x245)
-#define MAX96714_PATGEN_VS_LOW CCI_REG24(0x248)
-#define MAX96714_PATGEN_V2H CCI_REG24(0x24b)
-#define MAX96714_PATGEN_HS_HIGH CCI_REG16(0x24e)
-#define MAX96714_PATGEN_HS_LOW CCI_REG16(0x250)
-#define MAX96714_PATGEN_HS_CNT CCI_REG16(0x252)
-#define MAX96714_PATGEN_V2D CCI_REG24(0x254)
-#define MAX96714_PATGEN_DE_HIGH CCI_REG16(0x257)
-#define MAX96714_PATGEN_DE_LOW CCI_REG16(0x259)
-#define MAX96714_PATGEN_DE_CNT CCI_REG16(0x25b)
-#define MAX96714_PATGEN_GRAD_INC CCI_REG8(0x25d)
-#define MAX96714_PATGEN_CHKB_COLOR_A CCI_REG24(0x25e)
-#define MAX96714_PATGEN_CHKB_COLOR_B CCI_REG24(0x261)
-#define MAX96714_PATGEN_CHKB_RPT_CNT_A CCI_REG8(0x264)
-#define MAX96714_PATGEN_CHKB_RPT_CNT_B CCI_REG8(0x265)
-#define MAX96714_PATGEN_CHKB_ALT CCI_REG8(0x266)
-/* BACKTOP */
-#define MAX96714_BACKTOP25 CCI_REG8(0x320)
-#define CSI_DPLL_FREQ_MASK GENMASK(4, 0)
-
-/* MIPI_PHY */
-#define MAX96714_MIPI_PHY0 CCI_REG8(0x330)
-#define MAX96714_FORCE_CSI_OUT BIT(7)
-#define MAX96714_MIPI_STDBY_N CCI_REG8(0x332)
-#define MAX96714_MIPI_STDBY_MASK GENMASK(5, 4)
-#define MAX96714_MIPI_LANE_MAP CCI_REG8(0x333)
-#define MAX96714_MIPI_POLARITY CCI_REG8(0x335)
-#define MAX96714_MIPI_POLARITY_MASK GENMASK(5, 0)
-
-/* MIPI_TX */
-#define MAX96714_MIPI_LANE_CNT CCI_REG8(0x44a)
-#define MAX96714_CSI2_LANE_CNT_MASK GENMASK(7, 6)
-#define MAX96714_MIPI_TX52 CCI_REG8(0x474)
-#define MAX96714_TUN_EN BIT(0)
-
-#define MHZ(v) ((u32)((v) * 1000000U))
-
-enum max96714_vpg_mode {
- MAX96714_VPG_DISABLED = 0,
- MAX96714_VPG_CHECKERBOARD = 1,
- MAX96714_VPG_GRADIENT = 2,
-};
-
-struct max96714_rxport {
- struct {
- struct v4l2_subdev *sd;
- u16 pad;
- struct fwnode_handle *ep_fwnode;
- } source;
- struct regulator *poc;
-};
-
-struct max96714_txport {
- struct v4l2_fwnode_endpoint vep;
-};
-
-struct max96714_priv {
- struct i2c_client *client;
- struct regmap *regmap;
- struct gpio_desc *pd_gpio;
- struct max96714_rxport rxport;
- struct i2c_mux_core *mux;
- u64 enabled_source_streams;
- struct v4l2_subdev sd;
- struct media_pad pads[MAX96714_NPORTS];
- struct v4l2_mbus_config_mipi_csi2 mipi_csi2;
- struct v4l2_ctrl_handler ctrl_handler;
- struct v4l2_async_notifier notifier;
- s64 tx_link_freq;
- enum max96714_vpg_mode pattern;
-};
-
-static inline struct max96714_priv *sd_to_max96714(struct v4l2_subdev *sd)
-{
- return container_of(sd, struct max96714_priv, sd);
-}
-
-static int max96714_enable_tx_port(struct max96714_priv *priv)
-{
- return cci_update_bits(priv->regmap, MAX96714_MIPI_STDBY_N,
- MAX96714_MIPI_STDBY_MASK,
- MAX96714_MIPI_STDBY_MASK, NULL);
-}
-
-static int max96714_disable_tx_port(struct max96714_priv *priv)
-{
- return cci_update_bits(priv->regmap, MAX96714_MIPI_STDBY_N,
- MAX96714_MIPI_STDBY_MASK, 0, NULL);
-}
-
-static bool max96714_tx_port_enabled(struct max96714_priv *priv)
-{
- u64 val;
-
- cci_read(priv->regmap, MAX96714_MIPI_STDBY_N, &val, NULL);
-
- return val & MAX96714_MIPI_STDBY_MASK;
-}
-
-static int max96714_apply_patgen_timing(struct max96714_priv *priv,
- struct v4l2_subdev_state *state)
-{
- struct v4l2_mbus_framefmt *fmt =
- v4l2_subdev_state_get_format(state, MAX96714_PAD_SOURCE);
- const u32 h_active = fmt->width;
- const u32 h_fp = 88;
- const u32 h_sw = 44;
- const u32 h_bp = 148;
- u32 h_tot;
- const u32 v_active = fmt->height;
- const u32 v_fp = 4;
- const u32 v_sw = 5;
- const u32 v_bp = 36;
- u32 v_tot;
- int ret = 0;
-
- h_tot = h_active + h_fp + h_sw + h_bp;
- v_tot = v_active + v_fp + v_sw + v_bp;
-
- /* 75 Mhz pixel clock */
- cci_update_bits(priv->regmap, MAX96714_IO_CHK0,
- MAX96714_PATTERN_CLK_FREQ, 1, &ret);
-
- dev_info(&priv->client->dev, "height: %d width: %d\n", fmt->height,
- fmt->width);
-
- cci_write(priv->regmap, MAX96714_PATGEN_VS_DLY, 0, &ret);
- cci_write(priv->regmap, MAX96714_PATGEN_VS_HIGH, v_sw * h_tot, &ret);
- cci_write(priv->regmap, MAX96714_PATGEN_VS_LOW,
- (v_active + v_fp + v_bp) * h_tot, &ret);
- cci_write(priv->regmap, MAX96714_PATGEN_HS_HIGH, h_sw, &ret);
- cci_write(priv->regmap, MAX96714_PATGEN_HS_LOW, h_active + h_fp + h_bp,
- &ret);
- cci_write(priv->regmap, MAX96714_PATGEN_V2D,
- h_tot * (v_sw + v_bp) + (h_sw + h_bp), &ret);
- cci_write(priv->regmap, MAX96714_PATGEN_HS_CNT, v_tot, &ret);
- cci_write(priv->regmap, MAX96714_PATGEN_DE_HIGH, h_active, &ret);
- cci_write(priv->regmap, MAX96714_PATGEN_DE_LOW, h_fp + h_sw + h_bp,
- &ret);
- cci_write(priv->regmap, MAX96714_PATGEN_DE_CNT, v_active, &ret);
- /* B G R */
- cci_write(priv->regmap, MAX96714_PATGEN_CHKB_COLOR_A, 0xfecc00, &ret);
- /* B G R */
- cci_write(priv->regmap, MAX96714_PATGEN_CHKB_COLOR_B, 0x006aa7, &ret);
- cci_write(priv->regmap, MAX96714_PATGEN_CHKB_RPT_CNT_A, 0x3c, &ret);
- cci_write(priv->regmap, MAX96714_PATGEN_CHKB_RPT_CNT_B, 0x3c, &ret);
- cci_write(priv->regmap, MAX96714_PATGEN_CHKB_ALT, 0x3c, &ret);
- cci_write(priv->regmap, MAX96714_PATGEN_GRAD_INC, 0x10, &ret);
-
- return ret;
-}
-
-static int max96714_apply_patgen(struct max96714_priv *priv,
- struct v4l2_subdev_state *state)
-{
- unsigned int val;
- int ret = 0;
-
- if (priv->pattern)
- ret = max96714_apply_patgen_timing(priv, state);
-
- cci_write(priv->regmap, MAX96714_PATGEN_0, priv->pattern ? 0xfb : 0,
- &ret);
-
- val = FIELD_PREP(MAX96714_PATGEN_MODE, priv->pattern);
- cci_update_bits(priv->regmap, MAX96714_PATGEN_1, MAX96714_PATGEN_MODE,
- val, &ret);
- return ret;
-}
-
-static int max96714_s_ctrl(struct v4l2_ctrl *ctrl)
-{
- struct max96714_priv *priv =
- container_of(ctrl->handler, struct max96714_priv, ctrl_handler);
- int ret;
-
- switch (ctrl->id) {
- case V4L2_CID_TEST_PATTERN:
- if (priv->enabled_source_streams)
- return -EBUSY;
- priv->pattern = ctrl->val;
- break;
- default:
- return -EINVAL;
- }
-
- ret = cci_update_bits(priv->regmap, MAX96714_MIPI_PHY0,
- MAX96714_FORCE_CSI_OUT,
- priv->pattern ? MAX96714_FORCE_CSI_OUT : 0, NULL);
-
- /* Pattern generator doesn't work with tunnel mode */
- return cci_update_bits(priv->regmap, MAX96714_MIPI_TX52,
- MAX96714_TUN_EN,
- priv->pattern ? 0 : MAX96714_TUN_EN, &ret);
-}
-
-static const char * const max96714_test_pattern[] = {
- "Disabled",
- "Checkerboard",
- "Gradient"
-};
-
-static const struct v4l2_ctrl_ops max96714_ctrl_ops = {
- .s_ctrl = max96714_s_ctrl,
-};
-
-static int max96714_enable_streams(struct v4l2_subdev *sd,
- struct v4l2_subdev_state *state,
- u32 source_pad, u64 streams_mask)
-{
- struct max96714_priv *priv = sd_to_max96714(sd);
- u64 sink_streams;
- int ret;
-
- if (!priv->enabled_source_streams)
- max96714_enable_tx_port(priv);
-
- ret = max96714_apply_patgen(priv, state);
- if (ret)
- goto err;
-
- if (!priv->pattern) {
- if (!priv->rxport.source.sd) {
- ret = -ENODEV;
- goto err;
- }
-
- sink_streams =
- v4l2_subdev_state_xlate_streams(state,
- MAX96714_PAD_SOURCE,
- MAX96714_PAD_SINK,
- &streams_mask);
-
- ret = v4l2_subdev_enable_streams(priv->rxport.source.sd,
- priv->rxport.source.pad,
- sink_streams);
- if (ret)
- goto err;
- }
-
- priv->enabled_source_streams |= streams_mask;
-
- return 0;
-
-err:
- if (!priv->enabled_source_streams)
- max96714_disable_tx_port(priv);
-
- return ret;
-}
-
-static int max96714_disable_streams(struct v4l2_subdev *sd,
- struct v4l2_subdev_state *state,
- u32 source_pad, u64 streams_mask)
-{
- struct max96714_priv *priv = sd_to_max96714(sd);
- u64 sink_streams;
-
- if (!priv->pattern) {
- int ret;
-
- sink_streams =
- v4l2_subdev_state_xlate_streams(state,
- MAX96714_PAD_SOURCE,
- MAX96714_PAD_SINK,
- &streams_mask);
-
- ret = v4l2_subdev_disable_streams(priv->rxport.source.sd,
- priv->rxport.source.pad,
- sink_streams);
- if (ret)
- return ret;
- }
-
- priv->enabled_source_streams &= ~streams_mask;
-
- if (!priv->enabled_source_streams)
- max96714_disable_tx_port(priv);
-
- return 0;
-}
-
-static int max96714_set_fmt(struct v4l2_subdev *sd,
- struct v4l2_subdev_state *state,
- struct v4l2_subdev_format *format)
-{
- struct max96714_priv *priv = sd_to_max96714(sd);
- struct v4l2_mbus_framefmt *fmt;
-
- if (format->which == V4L2_SUBDEV_FORMAT_ACTIVE &&
- priv->enabled_source_streams)
- return -EBUSY;
-
- /* No transcoding, source and sink formats must match. */
- if (format->pad == MAX96714_PAD_SOURCE)
- return v4l2_subdev_get_fmt(sd, state, format);
-
- fmt = v4l2_subdev_state_get_format(state, format->pad, format->stream);
- if (!fmt)
- return -EINVAL;
-
- *fmt = format->format;
-
- fmt = v4l2_subdev_state_get_opposite_stream_format(state, format->pad,
- format->stream);
- if (!fmt)
- return -EINVAL;
-
- *fmt = format->format;
-
- return 0;
-}
-
-static int _max96714_set_routing(struct v4l2_subdev *sd,
- struct v4l2_subdev_state *state,
- enum v4l2_subdev_format_whence which,
- struct v4l2_subdev_krouting *routing)
-{
- static const struct v4l2_mbus_framefmt format = {
- .width = 1280,
- .height = 1080,
- .code = MEDIA_BUS_FMT_Y8_1X8,
- .field = V4L2_FIELD_NONE,
- };
- int ret;
-
- /*
- * Note: we can only support up to V4L2_FRAME_DESC_ENTRY_MAX, until
- * frame desc is made dynamically allocated.
- */
- if (routing->num_routes > V4L2_FRAME_DESC_ENTRY_MAX)
- return -EINVAL;
-
- ret = v4l2_subdev_routing_validate(sd, routing,
- V4L2_SUBDEV_ROUTING_ONLY_1_TO_1);
- if (ret)
- return ret;
-
- return v4l2_subdev_set_routing_with_fmt(sd, state, routing, &format);
-}
-
-static int max96714_set_routing(struct v4l2_subdev *sd,
- struct v4l2_subdev_state *state,
- enum v4l2_subdev_format_whence which,
- struct v4l2_subdev_krouting *routing)
-{
- struct max96714_priv *priv = sd_to_max96714(sd);
-
- if (which == V4L2_SUBDEV_FORMAT_ACTIVE && priv->enabled_source_streams)
- return -EBUSY;
-
- return _max96714_set_routing(sd, state, which, routing);
-}
-
-static int max96714_init_state(struct v4l2_subdev *sd,
- struct v4l2_subdev_state *state)
-{
- struct v4l2_subdev_route routes[] = {
- {
- .sink_pad = MAX96714_PAD_SINK,
- .sink_stream = 0,
- .source_pad = MAX96714_PAD_SOURCE,
- .source_stream = 0,
- .flags = V4L2_SUBDEV_ROUTE_FL_ACTIVE,
- }
- };
- struct v4l2_subdev_krouting routing = {
- .num_routes = ARRAY_SIZE(routes),
- .routes = routes,
- };
-
- return _max96714_set_routing(sd, state, V4L2_SUBDEV_FORMAT_ACTIVE,
- &routing);
-}
-
-static const struct v4l2_subdev_pad_ops max96714_pad_ops = {
- .enable_streams = max96714_enable_streams,
- .disable_streams = max96714_disable_streams,
-
- .set_routing = max96714_set_routing,
- .get_fmt = v4l2_subdev_get_fmt,
- .set_fmt = max96714_set_fmt,
-};
-
-static bool max96714_link_locked(struct max96714_priv *priv)
-{
- u64 val = 0;
-
- cci_read(priv->regmap, MAX96714_LINK_LOCK, &val, NULL);
-
- return val & MAX96714_LINK_LOCK_BIT;
-}
-
-static void max96714_link_status(struct max96714_priv *priv)
-{
- struct device *dev = &priv->client->dev;
-
- dev_info(dev, "Link locked:%d\n", max96714_link_locked(priv));
-}
-
-static bool max96714_pipe_locked(struct max96714_priv *priv)
-{
- u64 val;
-
- cci_read(priv->regmap, MAX96714_VIDEO_RX8, &val, NULL);
-
- return val & MAX96714_VID_LOCK;
-}
-
-static void max96714_pipe_status(struct max96714_priv *priv)
-{
- struct device *dev = &priv->client->dev;
-
- dev_info(dev, "Pipe vidlock:%d\n", max96714_pipe_locked(priv));
-}
-
-static void max96714_csi_status(struct max96714_priv *priv)
-{
- struct device *dev = &priv->client->dev;
- u64 freq = 0;
-
- cci_read(priv->regmap, MAX96714_BACKTOP25, &freq, NULL);
- freq = FIELD_GET(CSI_DPLL_FREQ_MASK, freq);
-
- dev_info(dev, "CSI controller DPLL freq:%u00MHz CSIPHY enabled:%d\n",
- (u8)freq, max96714_tx_port_enabled(priv));
-}
-
-static int max96714_log_status(struct v4l2_subdev *sd)
-{
- struct max96714_priv *priv = sd_to_max96714(sd);
- struct device *dev = &priv->client->dev;
-
- dev_info(dev, "Deserializer: max96714\n");
-
- max96714_link_status(priv);
- max96714_pipe_status(priv);
- max96714_csi_status(priv);
-
- return 0;
-}
-
-static const struct v4l2_subdev_core_ops max96714_subdev_core_ops = {
- .log_status = max96714_log_status,
-};
-
-static const struct v4l2_subdev_video_ops max96714_video_ops = {
- .s_stream = v4l2_subdev_s_stream_helper,
-};
-
-static const struct v4l2_subdev_internal_ops max96714_internal_ops = {
- .init_state = max96714_init_state,
-};
-
-static const struct v4l2_subdev_ops max96714_subdev_ops = {
- .video = &max96714_video_ops,
- .core = &max96714_subdev_core_ops,
- .pad = &max96714_pad_ops,
-};
-
-static const struct media_entity_operations max96714_entity_ops = {
- .link_validate = v4l2_subdev_link_validate,
-};
-
-static int max96714_notify_bound(struct v4l2_async_notifier *notifier,
- struct v4l2_subdev *subdev,
- struct v4l2_async_connection *asd)
-{
- struct max96714_priv *priv = sd_to_max96714(notifier->sd);
- struct device *dev = &priv->client->dev;
- int ret;
-
- ret = media_entity_get_fwnode_pad(&subdev->entity,
- priv->rxport.source.ep_fwnode,
- MEDIA_PAD_FL_SOURCE);
- if (ret < 0) {
- dev_err(dev, "Failed to find pad for %s\n", subdev->name);
- return ret;
- }
-
- priv->rxport.source.sd = subdev;
- priv->rxport.source.pad = ret;
-
- ret = media_create_pad_link(&priv->rxport.source.sd->entity,
- priv->rxport.source.pad, &priv->sd.entity,
- MAX96714_PAD_SINK,
- MEDIA_LNK_FL_ENABLED |
- MEDIA_LNK_FL_IMMUTABLE);
- if (ret) {
- dev_err(dev, "Unable to link %s:%u -> %s:%u\n",
- priv->rxport.source.sd->name, priv->rxport.source.pad,
- priv->sd.name, MAX96714_PAD_SINK);
- return ret;
- }
-
- return 0;
-}
-
-static const struct v4l2_async_notifier_operations max96714_notify_ops = {
- .bound = max96714_notify_bound,
-};
-
-static int max96714_v4l2_notifier_register(struct max96714_priv *priv)
-{
- struct device *dev = &priv->client->dev;
- struct max96714_rxport *rxport = &priv->rxport;
- struct v4l2_async_connection *asd;
- int ret;
-
- if (!rxport->source.ep_fwnode)
- return 0;
-
- v4l2_async_subdev_nf_init(&priv->notifier, &priv->sd);
-
- asd = v4l2_async_nf_add_fwnode(&priv->notifier,
- rxport->source.ep_fwnode,
- struct v4l2_async_connection);
- if (IS_ERR(asd)) {
- dev_err(dev, "Failed to add subdev: %pe", asd);
- v4l2_async_nf_cleanup(&priv->notifier);
- return PTR_ERR(asd);
- }
-
- priv->notifier.ops = &max96714_notify_ops;
-
- ret = v4l2_async_nf_register(&priv->notifier);
- if (ret) {
- dev_err(dev, "Failed to register subdev_notifier");
- v4l2_async_nf_cleanup(&priv->notifier);
- return ret;
- }
-
- return 0;
-}
-
-static int max96714_create_subdev(struct max96714_priv *priv)
-{
- struct device *dev = &priv->client->dev;
- int ret;
-
- v4l2_i2c_subdev_init(&priv->sd, priv->client, &max96714_subdev_ops);
- priv->sd.internal_ops = &max96714_internal_ops;
-
- v4l2_ctrl_handler_init(&priv->ctrl_handler, 1);
- priv->sd.ctrl_handler = &priv->ctrl_handler;
-
- v4l2_ctrl_new_int_menu(&priv->ctrl_handler, NULL, V4L2_CID_LINK_FREQ,
- 0, 0, &priv->tx_link_freq);
- v4l2_ctrl_new_std_menu_items(&priv->ctrl_handler,
- &max96714_ctrl_ops,
- V4L2_CID_TEST_PATTERN,
- ARRAY_SIZE(max96714_test_pattern) - 1,
- 0, 0, max96714_test_pattern);
- if (priv->ctrl_handler.error) {
- ret = priv->ctrl_handler.error;
- goto err_free_ctrl;
- }
-
- priv->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE | V4L2_SUBDEV_FL_STREAMS;
- priv->sd.entity.function = MEDIA_ENT_F_VID_IF_BRIDGE;
- priv->sd.entity.ops = &max96714_entity_ops;
-
- priv->pads[MAX96714_PAD_SINK].flags = MEDIA_PAD_FL_SINK;
- priv->pads[MAX96714_PAD_SOURCE].flags = MEDIA_PAD_FL_SOURCE;
-
- ret = media_entity_pads_init(&priv->sd.entity,
- MAX96714_NPORTS,
- priv->pads);
- if (ret)
- goto err_free_ctrl;
-
- priv->sd.state_lock = priv->sd.ctrl_handler->lock;
-
- ret = v4l2_subdev_init_finalize(&priv->sd);
- if (ret)
- goto err_entity_cleanup;
-
- ret = max96714_v4l2_notifier_register(priv);
- if (ret) {
- dev_err(dev, "v4l2 subdev notifier register failed: %d\n", ret);
- goto err_subdev_cleanup;
- }
-
- ret = v4l2_async_register_subdev(&priv->sd);
- if (ret) {
- dev_err(dev, "v4l2_async_register_subdev error: %d\n", ret);
- goto err_unreg_notif;
- }
-
- return 0;
-
-err_unreg_notif:
- v4l2_async_nf_unregister(&priv->notifier);
- v4l2_async_nf_cleanup(&priv->notifier);
-err_subdev_cleanup:
- v4l2_subdev_cleanup(&priv->sd);
-err_entity_cleanup:
- media_entity_cleanup(&priv->sd.entity);
-err_free_ctrl:
- v4l2_ctrl_handler_free(&priv->ctrl_handler);
-
- return ret;
-};
-
-static void max96714_destroy_subdev(struct max96714_priv *priv)
-{
- v4l2_async_nf_unregister(&priv->notifier);
- v4l2_async_nf_cleanup(&priv->notifier);
- v4l2_async_unregister_subdev(&priv->sd);
-
- v4l2_subdev_cleanup(&priv->sd);
-
- media_entity_cleanup(&priv->sd.entity);
- v4l2_ctrl_handler_free(&priv->ctrl_handler);
-}
-
-static int max96714_i2c_mux_select(struct i2c_mux_core *mux, u32 chan)
-{
- return 0;
-}
-
-static int max96714_i2c_mux_init(struct max96714_priv *priv)
-{
- priv->mux = i2c_mux_alloc(priv->client->adapter, &priv->client->dev,
- 1, 0, I2C_MUX_LOCKED | I2C_MUX_GATE,
- max96714_i2c_mux_select, NULL);
- if (!priv->mux)
- return -ENOMEM;
-
- return i2c_mux_add_adapter(priv->mux, 0, 0);
-}
-
-static int max96714_init_tx_port(struct max96714_priv *priv)
-{
- struct v4l2_mbus_config_mipi_csi2 *mipi;
- unsigned long lanes_used = 0;
- unsigned int val, lane;
- int ret;
-
- ret = max96714_disable_tx_port(priv);
-
- mipi = &priv->mipi_csi2;
- val = div_u64(priv->tx_link_freq * 2, MHZ(100));
-
- cci_update_bits(priv->regmap, MAX96714_BACKTOP25,
- CSI_DPLL_FREQ_MASK, val, &ret);
-
- val = FIELD_PREP(MAX96714_CSI2_LANE_CNT_MASK, mipi->num_data_lanes - 1);
- cci_update_bits(priv->regmap, MAX96714_MIPI_LANE_CNT,
- MAX96714_CSI2_LANE_CNT_MASK, val, &ret);
-
- /* lanes polarity */
- val = 0;
- for (lane = 0; lane < mipi->num_data_lanes + 1; lane++) {
- if (!mipi->lane_polarities[lane])
- continue;
- if (lane == 0)
- /* clock lane */
- val |= BIT(5);
- else if (lane < 3)
- /* Lane D0 and D1 */
- val |= BIT(lane - 1);
- else
- /* D2 and D3 */
- val |= BIT(lane);
- }
-
- cci_update_bits(priv->regmap, MAX96714_MIPI_POLARITY,
- MAX96714_MIPI_POLARITY_MASK, val, &ret);
-
- /* lanes mapping */
- val = 0;
- for (lane = 0; lane < mipi->num_data_lanes; lane++) {
- val |= (mipi->data_lanes[lane] - 1) << (lane * 2);
- lanes_used |= BIT(mipi->data_lanes[lane] - 1);
- }
-
- /*
- * Unused lanes need to be mapped as well to not have
- * the same lanes mapped twice.
- */
- for (; lane < MAX96714_CSI_NLANES; lane++) {
- unsigned int idx = find_first_zero_bit(&lanes_used,
- MAX96714_CSI_NLANES);
-
- val |= idx << (lane * 2);
- lanes_used |= BIT(idx);
- }
-
- return cci_write(priv->regmap, MAX96714_MIPI_LANE_MAP, val, &ret);
-}
-
-static int max96714_rxport_enable_poc(struct max96714_priv *priv)
-{
- struct max96714_rxport *rxport = &priv->rxport;
-
- if (!rxport->poc)
- return 0;
-
- return regulator_enable(rxport->poc);
-}
-
-static int max96714_rxport_disable_poc(struct max96714_priv *priv)
-{
- struct max96714_rxport *rxport = &priv->rxport;
-
- if (!rxport->poc)
- return 0;
-
- return regulator_disable(rxport->poc);
-}
-
-static int max96714_parse_dt_txport(struct max96714_priv *priv)
-{
- struct device *dev = &priv->client->dev;
- struct v4l2_fwnode_endpoint vep = { .bus_type = V4L2_MBUS_CSI2_DPHY };
- struct fwnode_handle *ep_fwnode;
- u32 num_data_lanes;
- int ret;
-
- ep_fwnode = fwnode_graph_get_endpoint_by_id(dev_fwnode(dev),
- MAX96714_PAD_SOURCE, 0, 0);
- if (!ep_fwnode)
- return -EINVAL;
-
- ret = v4l2_fwnode_endpoint_alloc_parse(ep_fwnode, &vep);
- fwnode_handle_put(ep_fwnode);
- if (ret) {
- dev_err(dev, "tx: failed to parse endpoint data\n");
- return -EINVAL;
- }
-
- if (vep.nr_of_link_frequencies != 1) {
- ret = -EINVAL;
- goto err_free_vep;
- }
-
- priv->tx_link_freq = vep.link_frequencies[0];
- /* Min 50MHz, Max 1250MHz, 50MHz step */
- if (priv->tx_link_freq < MHZ(50) || priv->tx_link_freq > MHZ(1250) ||
- (u32)priv->tx_link_freq % MHZ(50)) {
- dev_err(dev, "tx: invalid link frequency\n");
- ret = -EINVAL;
- goto err_free_vep;
- }
-
- num_data_lanes = vep.bus.mipi_csi2.num_data_lanes;
- if (num_data_lanes < 1 || num_data_lanes > MAX96714_CSI_NLANES) {
- dev_err(dev,
- "tx: invalid number of data lanes must be 1 to 4\n");
- ret = -EINVAL;
- goto err_free_vep;
- }
-
- priv->mipi_csi2 = vep.bus.mipi_csi2;
-
-err_free_vep:
- v4l2_fwnode_endpoint_free(&vep);
-
- return ret;
-}
-
-static int max96714_parse_dt_rxport(struct max96714_priv *priv)
-{
- static const char *poc_name = "port0-poc";
- struct max96714_rxport *rxport = &priv->rxport;
- struct device *dev = &priv->client->dev;
- struct fwnode_handle *ep_fwnode;
- int ret;
-
- ep_fwnode = fwnode_graph_get_endpoint_by_id(dev_fwnode(dev),
- MAX96714_PAD_SINK, 0, 0);
- if (!ep_fwnode)
- return -ENOENT;
-
- rxport->source.ep_fwnode = fwnode_graph_get_remote_endpoint(ep_fwnode);
- fwnode_handle_put(ep_fwnode);
-
- if (!rxport->source.ep_fwnode) {
- dev_err(dev, "rx: no remote endpoint\n");
- return -EINVAL;
- }
-
- rxport->poc = devm_regulator_get_optional(dev, poc_name);
- if (IS_ERR(rxport->poc)) {
- ret = PTR_ERR(rxport->poc);
- if (ret == -ENODEV) {
- rxport->poc = NULL;
- } else {
- dev_err(dev, "rx: failed to get POC supply: %d\n", ret);
- goto err_put_source_ep_fwnode;
- }
- }
-
- return 0;
-
-err_put_source_ep_fwnode:
- fwnode_handle_put(rxport->source.ep_fwnode);
- return ret;
-}
-
-static int max96714_parse_dt(struct max96714_priv *priv)
-{
- int ret;
-
- ret = max96714_parse_dt_txport(priv);
- if (ret)
- return ret;
-
- ret = max96714_parse_dt_rxport(priv);
- /*
- * The deserializer can create a test pattern even if the
- * rx port is not connected to a serializer.
- */
- if (ret && ret == -ENOENT)
- ret = 0;
-
- return ret;
-}
-
-static int max96714_enable_core_hw(struct max96714_priv *priv)
-{
- struct device *dev = &priv->client->dev;
- u64 val;
- int ret;
-
- if (priv->pd_gpio) {
- /* wait min 2 ms for reset to complete */
- gpiod_set_value_cansleep(priv->pd_gpio, 1);
- fsleep(2000);
- gpiod_set_value_cansleep(priv->pd_gpio, 0);
- /* wait min 2 ms for power up to finish */
- fsleep(2000);
- }
-
- ret = cci_read(priv->regmap, MAX96714_REG13, &val, NULL);
- if (ret) {
- dev_err_probe(dev, ret, "Cannot read first register, abort\n");
- goto err_pd_gpio;
- }
-
- if (val != MAX96714_DEVICE_ID && val != MAX96714F_DEVICE_ID) {
- dev_err(dev, "Unsupported device id expected %x got %x\n",
- MAX96714F_DEVICE_ID, (u8)val);
- ret = -EOPNOTSUPP;
- goto err_pd_gpio;
- }
-
- ret = cci_read(priv->regmap, MAX96714_DEV_REV, &val, NULL);
- if (ret)
- goto err_pd_gpio;
-
- dev_dbg(dev, "Found %x (rev %lx)\n", MAX96714F_DEVICE_ID,
- (u8)val & MAX96714_DEV_REV_MASK);
-
- ret = cci_read(priv->regmap, MAX96714_MIPI_TX52, &val, NULL);
- if (ret)
- goto err_pd_gpio;
-
- if (!(val & MAX96714_TUN_EN)) {
- dev_err(dev, "Only supporting tunnel mode");
- ret = -EOPNOTSUPP;
- goto err_pd_gpio;
- }
-
- return 0;
-
-err_pd_gpio:
- gpiod_set_value_cansleep(priv->pd_gpio, 1);
- return ret;
-}
-
-static void max96714_disable_core_hw(struct max96714_priv *priv)
-{
- gpiod_set_value_cansleep(priv->pd_gpio, 1);
-}
-
-static int max96714_get_hw_resources(struct max96714_priv *priv)
-{
- struct device *dev = &priv->client->dev;
-
- priv->regmap = devm_cci_regmap_init_i2c(priv->client, 16);
- if (IS_ERR(priv->regmap))
- return PTR_ERR(priv->regmap);
-
- priv->pd_gpio =
- devm_gpiod_get_optional(dev, "powerdown", GPIOD_OUT_HIGH);
- if (IS_ERR(priv->pd_gpio))
- return dev_err_probe(dev, PTR_ERR(priv->pd_gpio),
- "Cannot get powerdown GPIO\n");
- return 0;
-}
-
-static int max96714_probe(struct i2c_client *client)
-{
- struct device *dev = &client->dev;
- struct max96714_priv *priv;
- int ret;
-
- priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
- if (!priv)
- return -ENOMEM;
-
- priv->client = client;
-
- ret = max96714_get_hw_resources(priv);
- if (ret)
- return ret;
-
- ret = max96714_enable_core_hw(priv);
- if (ret)
- return ret;
-
- ret = max96714_parse_dt(priv);
- if (ret)
- goto err_disable_core_hw;
-
- max96714_init_tx_port(priv);
-
- ret = max96714_rxport_enable_poc(priv);
- if (ret)
- goto err_free_ports;
-
- ret = max96714_i2c_mux_init(priv);
- if (ret)
- goto err_disable_poc;
-
- ret = max96714_create_subdev(priv);
- if (ret)
- goto err_del_mux;
-
- return 0;
-
-err_del_mux:
- i2c_mux_del_adapters(priv->mux);
-err_disable_poc:
- max96714_rxport_disable_poc(priv);
-err_free_ports:
- fwnode_handle_put(priv->rxport.source.ep_fwnode);
-err_disable_core_hw:
- max96714_disable_core_hw(priv);
-
- return ret;
-}
-
-static void max96714_remove(struct i2c_client *client)
-{
- struct v4l2_subdev *sd = i2c_get_clientdata(client);
- struct max96714_priv *priv = sd_to_max96714(sd);
-
- max96714_destroy_subdev(priv);
- i2c_mux_del_adapters(priv->mux);
- max96714_rxport_disable_poc(priv);
- fwnode_handle_put(priv->rxport.source.ep_fwnode);
- max96714_disable_core_hw(priv);
- gpiod_set_value_cansleep(priv->pd_gpio, 1);
-}
-
-static const struct of_device_id max96714_of_ids[] = {
- { .compatible = "maxim,max96714f" },
- { }
-};
-MODULE_DEVICE_TABLE(of, max96714_of_ids);
-
-static struct i2c_driver max96714_i2c_driver = {
- .driver = {
- .name = "max96714",
- .of_match_table = max96714_of_ids,
- },
- .probe = max96714_probe,
- .remove = max96714_remove,
-};
-
-module_i2c_driver(max96714_i2c_driver);
-
-MODULE_LICENSE("GPL");
-MODULE_DESCRIPTION("Maxim Integrated GMSL2 Deserializers Driver");
-MODULE_AUTHOR("Julien Massot <julien.massot@collabora.com>");
--
2.48.1
^ permalink raw reply related [flat|nested] 30+ messages in thread