0078-media-cadence-Add-operation-on-reset.patch 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. From 2fbf4d367b25de4fa2f2d9cec57c88766c37d9de Mon Sep 17 00:00:00 2001
  2. From: Jack Zhu <[email protected]>
  3. Date: Tue, 23 May 2023 16:56:24 +0800
  4. Subject: [PATCH 078/122] media: cadence: Add operation on reset
  5. Add operation on reset for Cadence MIPI-CSI2 RX Controller.
  6. Reviewed-by: Laurent Pinchart <[email protected]>
  7. Signed-off-by: Jack Zhu <[email protected]>
  8. ---
  9. drivers/media/platform/cadence/cdns-csi2rx.c | 40 +++++++++++++++++---
  10. 1 file changed, 35 insertions(+), 5 deletions(-)
  11. --- a/drivers/media/platform/cadence/cdns-csi2rx.c
  12. +++ b/drivers/media/platform/cadence/cdns-csi2rx.c
  13. @@ -13,6 +13,7 @@
  14. #include <linux/of_graph.h>
  15. #include <linux/phy/phy.h>
  16. #include <linux/platform_device.h>
  17. +#include <linux/reset.h>
  18. #include <linux/slab.h>
  19. #include <media/v4l2-ctrls.h>
  20. @@ -68,6 +69,9 @@ struct csi2rx_priv {
  21. struct clk *sys_clk;
  22. struct clk *p_clk;
  23. struct clk *pixel_clk[CSI2RX_STREAMS_MAX];
  24. + struct reset_control *sys_rst;
  25. + struct reset_control *p_rst;
  26. + struct reset_control *pixel_rst[CSI2RX_STREAMS_MAX];
  27. struct phy *dphy;
  28. u8 lanes[CSI2RX_LANES_MAX];
  29. @@ -112,6 +116,7 @@ static int csi2rx_start(struct csi2rx_pr
  30. if (ret)
  31. return ret;
  32. + reset_control_deassert(csi2rx->p_rst);
  33. csi2rx_reset(csi2rx);
  34. reg = csi2rx->num_lanes << 8;
  35. @@ -154,6 +159,8 @@ static int csi2rx_start(struct csi2rx_pr
  36. if (ret)
  37. goto err_disable_pixclk;
  38. + reset_control_deassert(csi2rx->pixel_rst[i]);
  39. +
  40. writel(CSI2RX_STREAM_CFG_FIFO_MODE_LARGE_BUF,
  41. csi2rx->base + CSI2RX_STREAM_CFG_REG(i));
  42. @@ -169,13 +176,16 @@ static int csi2rx_start(struct csi2rx_pr
  43. if (ret)
  44. goto err_disable_pixclk;
  45. + reset_control_deassert(csi2rx->sys_rst);
  46. clk_disable_unprepare(csi2rx->p_clk);
  47. return 0;
  48. err_disable_pixclk:
  49. - for (; i > 0; i--)
  50. + for (; i > 0; i--) {
  51. + reset_control_assert(csi2rx->pixel_rst[i - 1]);
  52. clk_disable_unprepare(csi2rx->pixel_clk[i - 1]);
  53. + }
  54. err_disable_pclk:
  55. clk_disable_unprepare(csi2rx->p_clk);
  56. @@ -188,14 +198,17 @@ static void csi2rx_stop(struct csi2rx_pr
  57. unsigned int i;
  58. clk_prepare_enable(csi2rx->p_clk);
  59. + reset_control_assert(csi2rx->sys_rst);
  60. clk_disable_unprepare(csi2rx->sys_clk);
  61. for (i = 0; i < csi2rx->max_streams; i++) {
  62. writel(0, csi2rx->base + CSI2RX_STREAM_CTRL_REG(i));
  63. + reset_control_assert(csi2rx->pixel_rst[i]);
  64. clk_disable_unprepare(csi2rx->pixel_clk[i]);
  65. }
  66. + reset_control_assert(csi2rx->p_rst);
  67. clk_disable_unprepare(csi2rx->p_clk);
  68. if (v4l2_subdev_call(csi2rx->source_subdev, video, s_stream, false))
  69. @@ -299,6 +312,16 @@ static int csi2rx_get_resources(struct c
  70. return PTR_ERR(csi2rx->p_clk);
  71. }
  72. + csi2rx->sys_rst = devm_reset_control_get_optional_exclusive(&pdev->dev,
  73. + "sys");
  74. + if (IS_ERR(csi2rx->sys_rst))
  75. + return PTR_ERR(csi2rx->sys_rst);
  76. +
  77. + csi2rx->p_rst = devm_reset_control_get_optional_exclusive(&pdev->dev,
  78. + "reg_bank");
  79. + if (IS_ERR(csi2rx->p_rst))
  80. + return PTR_ERR(csi2rx->p_rst);
  81. +
  82. csi2rx->dphy = devm_phy_optional_get(&pdev->dev, "dphy");
  83. if (IS_ERR(csi2rx->dphy)) {
  84. dev_err(&pdev->dev, "Couldn't get external D-PHY\n");
  85. @@ -349,14 +372,21 @@ static int csi2rx_get_resources(struct c
  86. }
  87. for (i = 0; i < csi2rx->max_streams; i++) {
  88. - char clk_name[16];
  89. + char name[16];
  90. - snprintf(clk_name, sizeof(clk_name), "pixel_if%u_clk", i);
  91. - csi2rx->pixel_clk[i] = devm_clk_get(&pdev->dev, clk_name);
  92. + snprintf(name, sizeof(name), "pixel_if%u_clk", i);
  93. + csi2rx->pixel_clk[i] = devm_clk_get(&pdev->dev, name);
  94. if (IS_ERR(csi2rx->pixel_clk[i])) {
  95. - dev_err(&pdev->dev, "Couldn't get clock %s\n", clk_name);
  96. + dev_err(&pdev->dev, "Couldn't get clock %s\n", name);
  97. return PTR_ERR(csi2rx->pixel_clk[i]);
  98. }
  99. +
  100. + snprintf(name, sizeof(name), "pixel_if%u", i);
  101. + csi2rx->pixel_rst[i] =
  102. + devm_reset_control_get_optional_exclusive(&pdev->dev,
  103. + name);
  104. + if (IS_ERR(csi2rx->pixel_rst[i]))
  105. + return PTR_ERR(csi2rx->pixel_rst[i]);
  106. }
  107. return 0;