dri-devel.lists.freedesktop.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] drm/stm: dsi: Add 1.31 version support
@ 2018-01-22 16:46 Philippe Cornu
  2018-01-30 10:52 ` Benjamin Gaignard
  0 siblings, 1 reply; 3+ messages in thread
From: Philippe Cornu @ 2018-01-22 16:46 UTC (permalink / raw)
  To: Yannick Fertre, Philippe Cornu, Benjamin Gaignard,
	Vincent Abriou, David Airlie, dri-devel, linux-kernel,
	Archit Taneja, Andrzej Hajda, Laurent Pinchart
  Cc: Maxime Coquelin, Mickael Reulier, Ludovic Barre, Fabien Dessenne,
	Alexandre Torgue

Add support for the stm dsi phy/wrapper version 1.31.
Only lane capabilities need to be modified.

Signed-off-by: Philippe Cornu <philippe.cornu@st.com>
---
 drivers/gpu/drm/stm/dw_mipi_dsi-stm.c | 39 +++++++++++++++++++++++++++--------
 1 file changed, 30 insertions(+), 9 deletions(-)

diff --git a/drivers/gpu/drm/stm/dw_mipi_dsi-stm.c b/drivers/gpu/drm/stm/dw_mipi_dsi-stm.c
index 0ba8635d738a..a514b593f37c 100644
--- a/drivers/gpu/drm/stm/dw_mipi_dsi-stm.c
+++ b/drivers/gpu/drm/stm/dw_mipi_dsi-stm.c
@@ -14,7 +14,14 @@
 #include <drm/bridge/dw_mipi_dsi.h>
 #include <video/mipi_display.h>
 
-/* DSI wrapper register & bit definitions */
+#define HWVER_130			0x31333000	/* IP version 1.30 */
+#define HWVER_131			0x31333100	/* IP version 1.31 */
+
+/* DSI digital registers & bit definitions */
+#define DSI_VERSION			0x00
+#define VERSION				GENMASK(31, 8)
+
+/* DSI wrapper registers & bit definitions */
 /* Note: registers are named as in the Reference Manual */
 #define DSI_WCFGR	0x0400		/* Wrapper ConFiGuration Reg */
 #define WCFGR_DSIM	BIT(0)		/* DSI Mode */
@@ -66,6 +73,9 @@ struct dw_mipi_dsi_stm {
 	void __iomem *base;
 	struct clk *pllref_clk;
 	struct dw_mipi_dsi *dsi;
+	u32 hw_version;
+	int lane_min_kbps;
+	int lane_max_kbps;
 };
 
 static inline void dsi_write(struct dw_mipi_dsi_stm *dsi, u32 reg, u32 val)
@@ -122,7 +132,8 @@ static int dsi_pll_get_clkout_khz(int clkin_khz, int idf, int ndiv, int odf)
 	return DIV_ROUND_CLOSEST(clkin_khz * ndiv, divisor);
 }
 
-static int dsi_pll_get_params(int clkin_khz, int clkout_khz,
+static int dsi_pll_get_params(struct dw_mipi_dsi_stm *dsi,
+			      int clkin_khz, int clkout_khz,
 			      int *idf, int *ndiv, int *odf)
 {
 	int i, o, n, n_min, n_max;
@@ -132,8 +143,8 @@ static int dsi_pll_get_params(int clkin_khz, int clkout_khz,
 	if (clkin_khz <= 0 || clkout_khz <= 0)
 		return -EINVAL;
 
-	fvco_min = LANE_MIN_KBPS * 2 * ODF_MAX;
-	fvco_max = LANE_MAX_KBPS * 2 * ODF_MIN;
+	fvco_min = dsi->lane_min_kbps * 2 * ODF_MAX;
+	fvco_max = dsi->lane_max_kbps * 2 * ODF_MIN;
 
 	best_delta = 1000000; /* big started value (1000000khz) */
 
@@ -213,6 +224,15 @@ dw_mipi_dsi_get_lane_mbps(void *priv_data, struct drm_display_mode *mode,
 	int ret, bpp;
 	u32 val;
 
+	/* Update lane capabilities according to hw version */
+	dsi->hw_version = dsi_read(dsi, DSI_VERSION) & VERSION;
+	dsi->lane_min_kbps = LANE_MIN_KBPS;
+	dsi->lane_max_kbps = LANE_MAX_KBPS;
+	if (dsi->hw_version == HWVER_131) {
+		dsi->lane_min_kbps *= 2;
+		dsi->lane_max_kbps *= 2;
+	}
+
 	pll_in_khz = (unsigned int)(clk_get_rate(dsi->pllref_clk) / 1000);
 
 	/* Compute requested pll out */
@@ -220,12 +240,12 @@ dw_mipi_dsi_get_lane_mbps(void *priv_data, struct drm_display_mode *mode,
 	pll_out_khz = mode->clock * bpp / lanes;
 	/* Add 20% to pll out to be higher than pixel bw (burst mode only) */
 	pll_out_khz = (pll_out_khz * 12) / 10;
-	if (pll_out_khz > LANE_MAX_KBPS) {
-		pll_out_khz = LANE_MAX_KBPS;
+	if (pll_out_khz > dsi->lane_max_kbps) {
+		pll_out_khz = dsi->lane_max_kbps;
 		DRM_WARN("Warning max phy mbps is used\n");
 	}
-	if (pll_out_khz < LANE_MIN_KBPS) {
-		pll_out_khz = LANE_MIN_KBPS;
+	if (pll_out_khz < dsi->lane_min_kbps) {
+		pll_out_khz = dsi->lane_min_kbps;
 		DRM_WARN("Warning min phy mbps is used\n");
 	}
 
@@ -233,7 +253,8 @@ dw_mipi_dsi_get_lane_mbps(void *priv_data, struct drm_display_mode *mode,
 	idf = 0;
 	ndiv = 0;
 	odf = 0;
-	ret = dsi_pll_get_params(pll_in_khz, pll_out_khz, &idf, &ndiv, &odf);
+	ret = dsi_pll_get_params(dsi, pll_in_khz, pll_out_khz,
+				 &idf, &ndiv, &odf);
 	if (ret)
 		DRM_WARN("Warning dsi_pll_get_params(): bad params\n");
 
-- 
2.15.1

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH] drm/stm: dsi: Add 1.31 version support
  2018-01-22 16:46 [PATCH] drm/stm: dsi: Add 1.31 version support Philippe Cornu
@ 2018-01-30 10:52 ` Benjamin Gaignard
  2018-01-30 10:57   ` Philippe CORNU
  0 siblings, 1 reply; 3+ messages in thread
From: Benjamin Gaignard @ 2018-01-30 10:52 UTC (permalink / raw)
  To: Philippe Cornu
  Cc: Alexandre Torgue, David Airlie, Linux Kernel Mailing List,
	dri-devel, Yannick Fertre, Laurent Pinchart, Maxime Coquelin,
	Mickael Reulier, Vincent Abriou, Ludovic Barre, Fabien Dessenne

2018-01-22 17:46 GMT+01:00 Philippe Cornu <philippe.cornu@st.com>:
> Add support for the stm dsi phy/wrapper version 1.31.
> Only lane capabilities need to be modified.
>
> Signed-off-by: Philippe Cornu <philippe.cornu@st.com>

Applied on drm-misc-next.

Regards,
Benjamin

> ---
>  drivers/gpu/drm/stm/dw_mipi_dsi-stm.c | 39 +++++++++++++++++++++++++++--------
>  1 file changed, 30 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/gpu/drm/stm/dw_mipi_dsi-stm.c b/drivers/gpu/drm/stm/dw_mipi_dsi-stm.c
> index 0ba8635d738a..a514b593f37c 100644
> --- a/drivers/gpu/drm/stm/dw_mipi_dsi-stm.c
> +++ b/drivers/gpu/drm/stm/dw_mipi_dsi-stm.c
> @@ -14,7 +14,14 @@
>  #include <drm/bridge/dw_mipi_dsi.h>
>  #include <video/mipi_display.h>
>
> -/* DSI wrapper register & bit definitions */
> +#define HWVER_130                      0x31333000      /* IP version 1.30 */
> +#define HWVER_131                      0x31333100      /* IP version 1.31 */
> +
> +/* DSI digital registers & bit definitions */
> +#define DSI_VERSION                    0x00
> +#define VERSION                                GENMASK(31, 8)
> +
> +/* DSI wrapper registers & bit definitions */
>  /* Note: registers are named as in the Reference Manual */
>  #define DSI_WCFGR      0x0400          /* Wrapper ConFiGuration Reg */
>  #define WCFGR_DSIM     BIT(0)          /* DSI Mode */
> @@ -66,6 +73,9 @@ struct dw_mipi_dsi_stm {
>         void __iomem *base;
>         struct clk *pllref_clk;
>         struct dw_mipi_dsi *dsi;
> +       u32 hw_version;
> +       int lane_min_kbps;
> +       int lane_max_kbps;
>  };
>
>  static inline void dsi_write(struct dw_mipi_dsi_stm *dsi, u32 reg, u32 val)
> @@ -122,7 +132,8 @@ static int dsi_pll_get_clkout_khz(int clkin_khz, int idf, int ndiv, int odf)
>         return DIV_ROUND_CLOSEST(clkin_khz * ndiv, divisor);
>  }
>
> -static int dsi_pll_get_params(int clkin_khz, int clkout_khz,
> +static int dsi_pll_get_params(struct dw_mipi_dsi_stm *dsi,
> +                             int clkin_khz, int clkout_khz,
>                               int *idf, int *ndiv, int *odf)
>  {
>         int i, o, n, n_min, n_max;
> @@ -132,8 +143,8 @@ static int dsi_pll_get_params(int clkin_khz, int clkout_khz,
>         if (clkin_khz <= 0 || clkout_khz <= 0)
>                 return -EINVAL;
>
> -       fvco_min = LANE_MIN_KBPS * 2 * ODF_MAX;
> -       fvco_max = LANE_MAX_KBPS * 2 * ODF_MIN;
> +       fvco_min = dsi->lane_min_kbps * 2 * ODF_MAX;
> +       fvco_max = dsi->lane_max_kbps * 2 * ODF_MIN;
>
>         best_delta = 1000000; /* big started value (1000000khz) */
>
> @@ -213,6 +224,15 @@ dw_mipi_dsi_get_lane_mbps(void *priv_data, struct drm_display_mode *mode,
>         int ret, bpp;
>         u32 val;
>
> +       /* Update lane capabilities according to hw version */
> +       dsi->hw_version = dsi_read(dsi, DSI_VERSION) & VERSION;
> +       dsi->lane_min_kbps = LANE_MIN_KBPS;
> +       dsi->lane_max_kbps = LANE_MAX_KBPS;
> +       if (dsi->hw_version == HWVER_131) {
> +               dsi->lane_min_kbps *= 2;
> +               dsi->lane_max_kbps *= 2;
> +       }
> +
>         pll_in_khz = (unsigned int)(clk_get_rate(dsi->pllref_clk) / 1000);
>
>         /* Compute requested pll out */
> @@ -220,12 +240,12 @@ dw_mipi_dsi_get_lane_mbps(void *priv_data, struct drm_display_mode *mode,
>         pll_out_khz = mode->clock * bpp / lanes;
>         /* Add 20% to pll out to be higher than pixel bw (burst mode only) */
>         pll_out_khz = (pll_out_khz * 12) / 10;
> -       if (pll_out_khz > LANE_MAX_KBPS) {
> -               pll_out_khz = LANE_MAX_KBPS;
> +       if (pll_out_khz > dsi->lane_max_kbps) {
> +               pll_out_khz = dsi->lane_max_kbps;
>                 DRM_WARN("Warning max phy mbps is used\n");
>         }
> -       if (pll_out_khz < LANE_MIN_KBPS) {
> -               pll_out_khz = LANE_MIN_KBPS;
> +       if (pll_out_khz < dsi->lane_min_kbps) {
> +               pll_out_khz = dsi->lane_min_kbps;
>                 DRM_WARN("Warning min phy mbps is used\n");
>         }
>
> @@ -233,7 +253,8 @@ dw_mipi_dsi_get_lane_mbps(void *priv_data, struct drm_display_mode *mode,
>         idf = 0;
>         ndiv = 0;
>         odf = 0;
> -       ret = dsi_pll_get_params(pll_in_khz, pll_out_khz, &idf, &ndiv, &odf);
> +       ret = dsi_pll_get_params(dsi, pll_in_khz, pll_out_khz,
> +                                &idf, &ndiv, &odf);
>         if (ret)
>                 DRM_WARN("Warning dsi_pll_get_params(): bad params\n");
>
> --
> 2.15.1
>
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] drm/stm: dsi: Add 1.31 version support
  2018-01-30 10:52 ` Benjamin Gaignard
@ 2018-01-30 10:57   ` Philippe CORNU
  0 siblings, 0 replies; 3+ messages in thread
From: Philippe CORNU @ 2018-01-30 10:57 UTC (permalink / raw)
  To: Benjamin Gaignard
  Cc: Alexandre TORGUE, David Airlie, Linux Kernel Mailing List,
	dri-devel, Yannick FERTRE, Laurent Pinchart, Maxime Coquelin,
	Mickael REULIER, Vincent ABRIOU, Ludovic BARRE, Fabien DESSENNE

Hi Benjamin,

and many thanks
Philippe :-)

On 01/30/2018 11:52 AM, Benjamin Gaignard wrote:
> 2018-01-22 17:46 GMT+01:00 Philippe Cornu <philippe.cornu@st.com>:
>> Add support for the stm dsi phy/wrapper version 1.31.
>> Only lane capabilities need to be modified.
>>
>> Signed-off-by: Philippe Cornu <philippe.cornu@st.com>
> 
> Applied on drm-misc-next.
> 
> Regards,
> Benjamin
> 
>> ---
>>   drivers/gpu/drm/stm/dw_mipi_dsi-stm.c | 39 +++++++++++++++++++++++++++--------
>>   1 file changed, 30 insertions(+), 9 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/stm/dw_mipi_dsi-stm.c b/drivers/gpu/drm/stm/dw_mipi_dsi-stm.c
>> index 0ba8635d738a..a514b593f37c 100644
>> --- a/drivers/gpu/drm/stm/dw_mipi_dsi-stm.c
>> +++ b/drivers/gpu/drm/stm/dw_mipi_dsi-stm.c
>> @@ -14,7 +14,14 @@
>>   #include <drm/bridge/dw_mipi_dsi.h>
>>   #include <video/mipi_display.h>
>>
>> -/* DSI wrapper register & bit definitions */
>> +#define HWVER_130                      0x31333000      /* IP version 1.30 */
>> +#define HWVER_131                      0x31333100      /* IP version 1.31 */
>> +
>> +/* DSI digital registers & bit definitions */
>> +#define DSI_VERSION                    0x00
>> +#define VERSION                                GENMASK(31, 8)
>> +
>> +/* DSI wrapper registers & bit definitions */
>>   /* Note: registers are named as in the Reference Manual */
>>   #define DSI_WCFGR      0x0400          /* Wrapper ConFiGuration Reg */
>>   #define WCFGR_DSIM     BIT(0)          /* DSI Mode */
>> @@ -66,6 +73,9 @@ struct dw_mipi_dsi_stm {
>>          void __iomem *base;
>>          struct clk *pllref_clk;
>>          struct dw_mipi_dsi *dsi;
>> +       u32 hw_version;
>> +       int lane_min_kbps;
>> +       int lane_max_kbps;
>>   };
>>
>>   static inline void dsi_write(struct dw_mipi_dsi_stm *dsi, u32 reg, u32 val)
>> @@ -122,7 +132,8 @@ static int dsi_pll_get_clkout_khz(int clkin_khz, int idf, int ndiv, int odf)
>>          return DIV_ROUND_CLOSEST(clkin_khz * ndiv, divisor);
>>   }
>>
>> -static int dsi_pll_get_params(int clkin_khz, int clkout_khz,
>> +static int dsi_pll_get_params(struct dw_mipi_dsi_stm *dsi,
>> +                             int clkin_khz, int clkout_khz,
>>                                int *idf, int *ndiv, int *odf)
>>   {
>>          int i, o, n, n_min, n_max;
>> @@ -132,8 +143,8 @@ static int dsi_pll_get_params(int clkin_khz, int clkout_khz,
>>          if (clkin_khz <= 0 || clkout_khz <= 0)
>>                  return -EINVAL;
>>
>> -       fvco_min = LANE_MIN_KBPS * 2 * ODF_MAX;
>> -       fvco_max = LANE_MAX_KBPS * 2 * ODF_MIN;
>> +       fvco_min = dsi->lane_min_kbps * 2 * ODF_MAX;
>> +       fvco_max = dsi->lane_max_kbps * 2 * ODF_MIN;
>>
>>          best_delta = 1000000; /* big started value (1000000khz) */
>>
>> @@ -213,6 +224,15 @@ dw_mipi_dsi_get_lane_mbps(void *priv_data, struct drm_display_mode *mode,
>>          int ret, bpp;
>>          u32 val;
>>
>> +       /* Update lane capabilities according to hw version */
>> +       dsi->hw_version = dsi_read(dsi, DSI_VERSION) & VERSION;
>> +       dsi->lane_min_kbps = LANE_MIN_KBPS;
>> +       dsi->lane_max_kbps = LANE_MAX_KBPS;
>> +       if (dsi->hw_version == HWVER_131) {
>> +               dsi->lane_min_kbps *= 2;
>> +               dsi->lane_max_kbps *= 2;
>> +       }
>> +
>>          pll_in_khz = (unsigned int)(clk_get_rate(dsi->pllref_clk) / 1000);
>>
>>          /* Compute requested pll out */
>> @@ -220,12 +240,12 @@ dw_mipi_dsi_get_lane_mbps(void *priv_data, struct drm_display_mode *mode,
>>          pll_out_khz = mode->clock * bpp / lanes;
>>          /* Add 20% to pll out to be higher than pixel bw (burst mode only) */
>>          pll_out_khz = (pll_out_khz * 12) / 10;
>> -       if (pll_out_khz > LANE_MAX_KBPS) {
>> -               pll_out_khz = LANE_MAX_KBPS;
>> +       if (pll_out_khz > dsi->lane_max_kbps) {
>> +               pll_out_khz = dsi->lane_max_kbps;
>>                  DRM_WARN("Warning max phy mbps is used\n");
>>          }
>> -       if (pll_out_khz < LANE_MIN_KBPS) {
>> -               pll_out_khz = LANE_MIN_KBPS;
>> +       if (pll_out_khz < dsi->lane_min_kbps) {
>> +               pll_out_khz = dsi->lane_min_kbps;
>>                  DRM_WARN("Warning min phy mbps is used\n");
>>          }
>>
>> @@ -233,7 +253,8 @@ dw_mipi_dsi_get_lane_mbps(void *priv_data, struct drm_display_mode *mode,
>>          idf = 0;
>>          ndiv = 0;
>>          odf = 0;
>> -       ret = dsi_pll_get_params(pll_in_khz, pll_out_khz, &idf, &ndiv, &odf);
>> +       ret = dsi_pll_get_params(dsi, pll_in_khz, pll_out_khz,
>> +                                &idf, &ndiv, &odf);
>>          if (ret)
>>                  DRM_WARN("Warning dsi_pll_get_params(): bad params\n");
>>
>> --
>> 2.15.1
>>
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2018-01-30 10:58 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-01-22 16:46 [PATCH] drm/stm: dsi: Add 1.31 version support Philippe Cornu
2018-01-30 10:52 ` Benjamin Gaignard
2018-01-30 10:57   ` Philippe CORNU

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).