Add support for external dphy
Subsystems (3)
v2 cover Add support for external dphy
This series adds support for external D-PHY and JH7110 SoC which has a Cadence MIPI-CSI2 RX controller. The driver is tested on VisionFive V2 board.
PLEASE NOTE: this patch series was spun off from the v4 of another series that included CSI and ISP driver. You can check the comments for earlier version in the link below. I'm sorry that the first version link has been lost.
v4 link: https://lore.kernel.org/all/[email protected]/
v3 link: https://lore.kernel.org/all/[email protected]/
v2 link: https://lore.kernel.org/all/[email protected]/
Current review status:
- cdns,csi2rx.yaml:
Reviewed by: Krzysztof Kozlowski
Reviewed by: Laurent Pinchart
- cdns-csi2rx.c
Reviewed by: Laurent Pinchart
- MAINTAINERS
Reviewed by: Krzysztof Kozlowski
Reviewed by: Laurent Pinchart
Thanks to everyone who reviewed my work !
Changes in v2:
- Matched reset names in bindings.
v1 link: https://lore.kernel.org/all/[email protected]/
Jack Zhu (5):
media: dt-bindings: cadence-csi2rx: Convert to DT schema
media: dt-bindings: cadence-csi2rx: Add resets property
media: cadence: Add operation on reset
media: cadence: Add support for external dphy
media: cadence: Add support for JH7110 SoC
.../devicetree/bindings/media/cdns,csi2rx.txt | 100 --------- .../bindings/media/cdns,csi2rx.yaml | 201 ++++++++++++++++++ MAINTAINERS | 1 + drivers/media/platform/cadence/cdns-csi2rx.c | 107 ++++++++-- 4 files changed, 294 insertions(+), 115 deletions(-) delete mode 100644 Documentation/devicetree/bindings/media/cdns,csi2rx.txt create mode 100644 Documentation/devicetree/bindings/media/cdns,csi2rx.yaml
Signature · 1 line
2.34.1
PATCH v2 1/5 media: dt-bindings: cadence-csi2rx: Convert to DT schema
Convert DT bindings document for Cadence MIPI-CSI2 RX controller to DT schema format.
For compatible, new compatibles should not be messed with conversion, but the original binding did not specify any SoC-specific compatible string, so add the StarFive compatible string.
--- .../devicetree/bindings/media/cdns,csi2rx.txt | 100 ---------- .../bindings/media/cdns,csi2rx.yaml | 177 ++++++++++++++++++ MAINTAINERS | 1 + 3 files changed, 178 insertions(+), 100 deletions(-) delete mode 100644 Documentation/devicetree/bindings/media/cdns,csi2rx.txt create mode 100644 Documentation/devicetree/bindings/media/cdns,csi2rx.yaml
Documentation/devicetree/bindings/media/cdns,csi2rx.txt deleted +0 -100
@@ -1,100 +0,0 @@ -Cadence MIPI-CSI2 RX controller -=============================== - -The Cadence MIPI-CSI2 RX controller is a CSI-2 bridge supporting up to 4 CSI -lanes in input, and 4 different pixel streams in output. - -Required properties: - - compatible: must be set to "cdns,csi2rx" and an SoC-specific compatible - - reg: base address and size of the memory mapped region - - clocks: phandles to the clocks driving the controller - - clock-names: must contain: - * sys_clk: main clock - * p_clk: register bank clock - * pixel_if[0-3]_clk: pixel stream output clock, one for each stream - implemented in hardware, between 0 and 3 - -Optional properties: - - phys: phandle to the external D-PHY, phy-names must be provided - - phy-names: must contain "dphy", if the implementation uses an - external D-PHY - -Required subnodes: - - ports: A ports node with one port child node per device input and output - port, in accordance with the video interface bindings defined in - Documentation/devicetree/bindings/media/video-interfaces.txt. The - port nodes are numbered as follows: - - Port Description - ----------------------------- - 0 CSI-2 input - 1 Stream 0 output - 2 Stream 1 output - 3 Stream 2 output - 4 Stream 3 output - - The stream output port nodes are optional if they are not - connected to anything at the hardware level or implemented - in the design.Since there is only one endpoint per port, - the endpoints are not numbered. - - -Example: - -csi2rx: csi-bridge@0d060000 { - compatible = "cdns,csi2rx"; - reg = <0x0d060000 0x1000>; - clocks = <&byteclock>, <&byteclock> - <&coreclock>, <&coreclock>, - <&coreclock>, <&coreclock>; - clock-names = "sys_clk", "p_clk", - "pixel_if0_clk", "pixel_if1_clk", - "pixel_if2_clk", "pixel_if3_clk"; - - ports { - #address-cells = <1>; - #size-cells = <0>; - - port@0 { - reg = <0>; - - csi2rx_in_sensor: endpoint { - remote-endpoint = <&sensor_out_csi2rx>; - clock-lanes = <0>; - data-lanes = <1 2>; - }; - }; - - port@1 { - reg = <1>; - - csi2rx_out_grabber0: endpoint { - remote-endpoint = <&grabber0_in_csi2rx>; - }; - }; - - port@2 { - reg = <2>; - - csi2rx_out_grabber1: endpoint { - remote-endpoint = <&grabber1_in_csi2rx>; - }; - }; - - port@3 { - reg = <3>; - - csi2rx_out_grabber2: endpoint { - remote-endpoint = <&grabber2_in_csi2rx>; - }; - }; - - port@4 { - reg = <4>; - - csi2rx_out_grabber3: endpoint { - remote-endpoint = <&grabber3_in_csi2rx>; - }; - }; - }; -};
Documentation/devicetree/bindings/media/cdns,csi2rx.yaml new file +177 -0
177 lines not on this page · raw message
MAINTAINERS +1 -0
@@ -4518,6 +4518,7 @@ M: Maxime Ripard <[email protected]> L: [email protected] S: Maintained F: Documentation/devicetree/bindings/media/cdns,*.txt +F: Documentation/devicetree/bindings/media/cdns,csi2rx.yaml F: drivers/media/platform/cadence/cdns-csi2* CADENCE NAND DRIVER
Signature · 1 line
2.34.1
PATCH v2 2/5 media: dt-bindings: cadence-csi2rx: Add resets property
In reply to Jack ZhuAdd resets property for Cadence MIPI-CSI2 RX controller
--- .../bindings/media/cdns,csi2rx.yaml | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+)
Documentation/devicetree/bindings/media/cdns,csi2rx.yaml +24 -0
@@ -41,6 +41,24 @@ properties: - const: pixel_if2_clk - const: pixel_if3_clk + resets: + items: + - description: CSI2Rx system reset + - description: Gated Register bank reset for APB interface + - description: pixel reset for Stream interface 0 + - description: pixel reset for Stream interface 1 + - description: pixel reset for Stream interface 2 + - description: pixel reset for Stream interface 3 + + reset-names: + items: + - const: sys + - const: reg_bank + - const: pixel_if0 + - const: pixel_if1 + - const: pixel_if2 + - const: pixel_if3 + phys: maxItems: 1 description: MIPI D-PHY
@@ -123,6 +141,12 @@ examples: clock-names = "sys_clk", "p_clk", "pixel_if0_clk", "pixel_if1_clk", "pixel_if2_clk", "pixel_if3_clk"; + resets = <&bytereset 9>, <&bytereset 4>, + <&corereset 5>, <&corereset 6>, + <&corereset 7>, <&corereset 8>; + reset-names = "sys", "reg_bank", + "pixel_if0", "pixel_if1", + "pixel_if2", "pixel_if3"; phys = <&csi_phy>; phy-names = "dphy";
Signature · 1 line
2.34.1
PATCH v2 3/5 media: cadence: Add operation on reset
In reply to Jack ZhuAdd operation on reset for Cadence MIPI-CSI2 RX Controller.
--- drivers/media/platform/cadence/cdns-csi2rx.c | 40 +++++++++++++++++--- 1 file changed, 35 insertions(+), 5 deletions(-)
drivers/media/platform/cadence/cdns-csi2rx.c +35 -5
@@ -13,6 +13,7 @@#include <linux/of_graph.h> #include <linux/phy/phy.h> #include <linux/platform_device.h> +#include <linux/reset.h> #include <linux/slab.h> #include <media/v4l2-ctrls.h>
@@ -68,6 +69,9 @@ struct csi2rx_priv {struct clk *sys_clk;struct clk *p_clk;struct clk *pixel_clk[CSI2RX_STREAMS_MAX ]; +struct reset_control *sys_rst; +struct reset_control *p_rst; +struct reset_control *pixel_rst[CSI2RX_STREAMS_MAX ];struct phy *dphy;u8 lanes[CSI2RX_LANES_MAX ];
@@ -112,6 +116,7 @@ static int csi2rx_start(struct csi2rx_priv *csi2rx)if (ret)return ret; +reset_control_deassert (csi2rx->p_rst);csi2rx_reset (csi2rx); reg = csi2rx->num_lanes <<8 ;
@@ -154,6 +159,8 @@ static int csi2rx_start(struct csi2rx_priv *csi2rx)if (ret) goto err_disable_pixclk; +reset_control_deassert (csi2rx->pixel_rst[i]); +writel (CSI2RX_STREAM_CFG_FIFO_MODE_LARGE_BUF , csi2rx->base +CSI2RX_STREAM_CFG_REG (i));
@@ -169,13 +176,16 @@ static int csi2rx_start(struct csi2rx_priv *csi2rx)if (ret) goto err_disable_pixclk; +reset_control_deassert (csi2rx->sys_rst);clk_disable_unprepare (csi2rx->p_clk);return 0 ; err_disable_pixclk: -for (; i >0 ; i--) +for (; i >0 ; i--) { +reset_control_assert (csi2rx->pixel_rst[i -1 ]);clk_disable_unprepare (csi2rx->pixel_clk[i -1 ]); + } err_disable_pclk:clk_disable_unprepare (csi2rx->p_clk);
@@ -188,14 +198,17 @@ static void csi2rx_stop(struct csi2rx_priv *csi2rx)unsigned int i;clk_prepare_enable (csi2rx->p_clk); +reset_control_assert (csi2rx->sys_rst);clk_disable_unprepare (csi2rx->sys_clk);for (i =0 ; i < csi2rx->max_streams; i++) {writel (0 , csi2rx->base +CSI2RX_STREAM_CTRL_REG (i)); +reset_control_assert (csi2rx->pixel_rst[i]);clk_disable_unprepare (csi2rx->pixel_clk[i]); } +reset_control_assert (csi2rx->p_rst);clk_disable_unprepare (csi2rx->p_clk);if (v4l2_subdev_call (csi2rx->source_subdev, video, s_stream, false))
@@ -299,6 +312,16 @@ static int csi2rx_get_resources(struct csi2rx_priv *csi2rx,return PTR_ERR (csi2rx->p_clk); } + csi2rx->sys_rst =devm_reset_control_get_optional_exclusive (&pdev->dev, +"sys" ); +if (IS_ERR (csi2rx->sys_rst)) +return PTR_ERR (csi2rx->sys_rst); + + csi2rx->p_rst =devm_reset_control_get_optional_exclusive (&pdev->dev, +"reg_bank" ); +if (IS_ERR (csi2rx->p_rst)) +return PTR_ERR (csi2rx->p_rst); + csi2rx->dphy =devm_phy_optional_get (&pdev->dev,"dphy" );if (IS_ERR (csi2rx->dphy)) {dev_err (&pdev->dev,"Couldn't get external D-PHY\n" );
@@ -349,14 +372,21 @@ static int csi2rx_get_resources(struct csi2rx_priv *csi2rx, }for (i =0 ; i < csi2rx->max_streams; i++) { -char clk_name[16 ]; +char name[16 ]; -snprintf (clk_name,sizeof (clk_name),"pixel_if%u_clk" , i); - csi2rx->pixel_clk[i] =devm_clk_get (&pdev->dev, clk_name); +snprintf (name,sizeof (name),"pixel_if%u_clk" , i); + csi2rx->pixel_clk[i] =devm_clk_get (&pdev->dev, name);if (IS_ERR (csi2rx->pixel_clk[i])) { -dev_err (&pdev->dev,"Couldn't get clock %s\n" , clk_name); +dev_err (&pdev->dev,"Couldn't get clock %s\n" , name);return PTR_ERR (csi2rx->pixel_clk[i]); } + +snprintf (name,sizeof (name),"pixel_if%u" , i); + csi2rx->pixel_rst[i] = +devm_reset_control_get_optional_exclusive (&pdev->dev, + name); +if (IS_ERR (csi2rx->pixel_rst[i])) +return PTR_ERR (csi2rx->pixel_rst[i]); }return 0 ;
Signature · 1 line
2.34.1
PATCH v2 4/5 media: cadence: Add support for external dphy
In reply to Jack ZhuAdd support for external MIPI D-PHY.
--- drivers/media/platform/cadence/cdns-csi2rx.c | 66 +++++++++++++++++--- 1 file changed, 56 insertions(+), 10 deletions(-)
drivers/media/platform/cadence/cdns-csi2rx.c +56 -10
@@ -31,6 +31,12 @@#define CSI2RX_STATIC_CFG_DLANE_MAP (llane, plane) ((plane) << (16 + (llane) * 4))#define CSI2RX_STATIC_CFG_LANES_MASK GENMASK(11, 8) +#define CSI2RX_DPHY_LANE_CTRL_REG 0x40 +#define CSI2RX_DPHY_CL_RST BIT(16) +#define CSI2RX_DPHY_DL_RST (i) BIT((i) + 12) +#define CSI2RX_DPHY_CL_EN BIT(4) +#define CSI2RX_DPHY_DL_EN (i) BIT(i) +#define CSI2RX_STREAM_BASE (n) (((n) + 1) * 0x100)#define CSI2RX_STREAM_CTRL_REG (n) (CSI2RX_STREAM_BASE(n) + 0x000)
@@ -105,6 +111,24 @@ static void csi2rx_reset(struct csi2rx_priv *csi2rx)writel (0 , csi2rx->base +CSI2RX_SOFT_RESET_REG ); } +static int csi2rx_configure_ext_dphy (struct csi2rx_priv *csi2rx) +{ +union phy_configure_opts opts = { }; +int ret; + + ret =phy_power_on (csi2rx->dphy); +if (ret) +return ret; + + ret =phy_configure (csi2rx->dphy, &opts); +if (ret) { +phy_power_off (csi2rx->dphy); +return ret; + } + +return 0 ; +} +static int csi2rx_start (struct csi2rx_priv *csi2rx) {unsigned int i;
@@ -144,6 +168,17 @@ static int csi2rx_start(struct csi2rx_priv *csi2rx)if (ret) goto err_disable_pclk; +/* Enable DPHY clk and data lanes. */ +if (csi2rx->dphy) { + reg =CSI2RX_DPHY_CL_EN |CSI2RX_DPHY_CL_RST ; +for (i =0 ; i < csi2rx->num_lanes; i++) { + reg |=CSI2RX_DPHY_DL_EN (csi2rx->lanes[i] -1 ); + reg |=CSI2RX_DPHY_DL_RST (csi2rx->lanes[i] -1 ); + } + +writel (reg, csi2rx->base +CSI2RX_DPHY_LANE_CTRL_REG ); + } +/* * Create a static mapping between the CSI virtual channels * and the output stream.
@@ -177,10 +212,22 @@ static int csi2rx_start(struct csi2rx_priv *csi2rx) goto err_disable_pixclk;reset_control_deassert (csi2rx->sys_rst); + +if (csi2rx->dphy) { + ret =csi2rx_configure_ext_dphy (csi2rx); +if (ret) { +dev_err (csi2rx->dev, +"Failed to configure external DPHY: %d\n" , ret); + goto err_disable_sysclk; + } + } +clk_disable_unprepare (csi2rx->p_clk);return 0 ; +err_disable_sysclk: +clk_disable_unprepare (csi2rx->sys_clk); err_disable_pixclk:for (; i >0 ; i--) {reset_control_assert (csi2rx->pixel_rst[i -1 ]);
@@ -213,6 +260,13 @@ static void csi2rx_stop(struct csi2rx_priv *csi2rx)if (v4l2_subdev_call (csi2rx->source_subdev, video, s_stream, false))dev_warn (csi2rx->dev,"Couldn't disable our subdev\n" ); + +if (csi2rx->dphy) { +writel (0 , csi2rx->base +CSI2RX_DPHY_LANE_CTRL_REG ); + +if (phy_power_off (csi2rx->dphy)) +dev_warn (csi2rx->dev,"Couldn't power off DPHY\n" ); + } }static int csi2rx_s_stream (struct v4l2_subdev *subdev,int enable)
@@ -328,15 +382,6 @@ static int csi2rx_get_resources(struct csi2rx_priv *csi2rx,return PTR_ERR (csi2rx->dphy); } -/* -* FIXME: Once we'll have external D-PHY support, the check -* will need to be removed. -*/ -if (csi2rx->dphy) { -dev_err (&pdev->dev,"External D-PHY not supported yet\n" ); -return -EINVAL ; - } - ret =clk_prepare_enable (csi2rx->p_clk);if (ret) {dev_err (&pdev->dev,"Couldn't prepare and enable P clock\n" );
@@ -366,7 +411,7 @@ static int csi2rx_get_resources(struct csi2rx_priv *csi2rx,* FIXME: Once we'll have internal D-PHY support, the check * will need to be removed. */ -if (csi2rx->has_internal_dphy) { +if (!csi2rx->dphy && csi2rx->has_internal_dphy) {dev_err (&pdev->dev,"Internal D-PHY not supported yet\n" );return -EINVAL ; }
@@ -492,6 +537,7 @@ static int csi2rx_probe(struct platform_device *pdev)dev_info (&pdev->dev,"Probed CSI2RX with %u/%u lanes, %u streams, %s D-PHY\n" , csi2rx->num_lanes, csi2rx->max_lanes, csi2rx->max_streams, + csi2rx->dphy ?"external" : csi2rx->has_internal_dphy ?"internal" :"no" );return 0 ;
Signature · 1 line
2.34.1
PATCH v2 5/5 media: cadence: Add support for JH7110 SoC
In reply to Jack ZhuAdd support for Starfive JH7110 SoC which has the cadence csi2 receiver.
--- drivers/media/platform/cadence/cdns-csi2rx.c | 1 + 1 file changed, 1 insertion(+)
drivers/media/platform/cadence/cdns-csi2rx.c +1 -0
@@ -558,6 +558,7 @@ static void csi2rx_remove(struct platform_device *pdev) }static const struct of_device_id csi2rx_of_table[] = { + { .compatible ="starfive,jh7110-csi2rx" }, { .compatible ="cdns,csi2rx" }, { }, };
Signature · 1 line
2.34.1
Quoted 3 lines · Jack Zhu
This series adds support for external D-PHY and JH7110 SoC which has a Cadence MIPI-CSI2 RX controller. The driver is tested on VisionFive V2 board.
Hi everyone,
For this new version of patch, could you please help to review and give your comments? Thanks a lot!
Quoted 40 lines
PLEASE NOTE: this patch series was spun off from the v4 of another series that included CSI and ISP driver. You can check the comments for earlier version in the link below. I'm sorry that the first version link has been lost.
v4 link: https://lore.kernel.org/all/[email protected]/
v3 link: https://lore.kernel.org/all/[email protected]/
v2 link: https://lore.kernel.org/all/[email protected]/Current review status:
- cdns,csi2rx.yaml:
Reviewed by: Krzysztof Kozlowski
Reviewed by: Laurent Pinchart
-cdns-csi2rx.c
Reviewed by: Laurent Pinchart
-MAINTAINERS
Reviewed by: Krzysztof Kozlowski
Reviewed by: Laurent PinchartThanks to everyone who reviewed my work !
Changes in v2:
- Matched reset names in bindings.v1 link: https://lore.kernel.org/all/[email protected]/
Jack Zhu (5):
media: dt-bindings: cadence-csi2rx: Convert to DT schema
media: dt-bindings: cadence-csi2rx: Add resets property
media: cadence: Add operation on reset
media: cadence: Add support for external dphy
media: cadence: Add support for JH7110 SoC.../devicetree/bindings/media/cdns,csi2rx.txt | 100 --------- .../bindings/media/cdns,csi2rx.yaml | 201 ++++++++++++++++++ MAINTAINERS | 1 + drivers/media/platform/cadence/cdns-csi2rx.c | 107 ++++++++-- 4 files changed, 294 insertions(+), 115 deletions(-) delete mode 100644 Documentation/devicetree/bindings/media/cdns,csi2rx.txt create mode 100644 Documentation/devicetree/bindings/media/cdns,csi2rx.yaml