[RFC v2 PATCH 08/14] drm/exynos: dsi: add driver data to support Exynos5420

2014-04-27 Thread YoungJun Cho
Hi Andrzej,

On 04/24/2014 10:23 AM, YoungJun Cho wrote:
> Hi Andrzej,
>
> Thank you for comments.
>
> On 04/23/2014 05:29 PM, Andrzej Hajda wrote:
>> On 04/21/2014 02:28 PM, YoungJun Cho wrote:
>>> The offset of register DSIM_PLLTMR_REG in Exynos5420 is different
>>> from the one in Exynos4 SoC.
>>>
>>> In case of Exynos5420 SoC, there is no frequency band bit in
>>> DSIM_PLLCTRL_REG,
>>> and it uses DSIM_PHYCTRL_REG and DSIM_PHYTIMING*_REG instead.
>>> So this patch adds driver data to distinguish it.
>>>
>>> Signed-off-by: YoungJun Cho 
>>> Acked-by: Inki Dae 
>>> Acked-by: Kyungmin Park 
>>> ---
>>>   drivers/gpu/drm/exynos/exynos_drm_dsi.c |  101
>>> ---
>>>   1 file changed, 80 insertions(+), 21 deletions(-)
>>>
>>> diff --git a/drivers/gpu/drm/exynos/exynos_drm_dsi.c
>>> b/drivers/gpu/drm/exynos/exynos_drm_dsi.c
>>> index 179f2fa..fcd577f 100644
>>> --- a/drivers/gpu/drm/exynos/exynos_drm_dsi.c
>>> +++ b/drivers/gpu/drm/exynos/exynos_drm_dsi.c
>>> @@ -17,6 +17,7 @@
>>>
>>>   #include 
>>>   #include 
>>> +#include 
>>>   #include 
>>>   #include 
>>>
>>> @@ -54,9 +55,12 @@
>>>
>>>   /* FIFO memory AC characteristic register */
>>>   #define DSIM_PLLCTRL_REG0x4c/* PLL control register */
>>> -#define DSIM_PLLTMR_REG0x50/* PLL timer register */
>>>   #define DSIM_PHYACCHR_REG0x54/* D-PHY AC characteristic
>>> register */
>>>   #define DSIM_PHYACCHR1_REG0x58/* D-PHY AC characteristic
>>> register1 */
>>> +#define DSIM_PHYCTRL_REG0x5c
>>> +#define DSIM_PHYTIMING_REG0x64
>>> +#define DSIM_PHYTIMING1_REG0x68
>>> +#define DSIM_PHYTIMING2_REG0x6c
>>>
>>>   /* DSIM_STATUS */
>>>   #define DSIM_STOP_STATE_DAT(x)(((x) & 0xf) << 0)
>>> @@ -233,6 +237,12 @@ struct exynos_dsi_transfer {
>>>   #define DSIM_STATE_INITIALIZEDBIT(1)
>>>   #define DSIM_STATE_CMD_LPMBIT(2)
>>>
>>> +struct exynos_dsi_driver_data {
>>> +unsigned int plltmr_reg;
>>> +
>>> +unsigned int has_freqband:1;
>>> +};
>>> +
>>>   struct exynos_dsi {
>>>   struct mipi_dsi_host dsi_host;
>>>   struct drm_connector connector;
>>> @@ -262,11 +272,39 @@ struct exynos_dsi {
>>>
>>>   spinlock_t transfer_lock; /* protects transfer_list */
>>>   struct list_head transfer_list;
>>> +
>>> +struct exynos_dsi_driver_data *driver_data;
>>>   };
>>>
>>>   #define host_to_dsi(host) container_of(host, struct exynos_dsi,
>>> dsi_host)
>>>   #define connector_to_dsi(c) container_of(c, struct exynos_dsi,
>>> connector)
>>>
>>> +static struct exynos_dsi_driver_data exynos4_dsi_driver_data = {
>>> +.plltmr_reg = 0x50,
>>> +.has_freqband = 1,
>>> +};
>>> +
>>> +static struct exynos_dsi_driver_data exynos5_dsi_driver_data = {
>>> +.plltmr_reg = 0x58,
>>> +};
>>> +
>>> +static struct of_device_id exynos_dsi_of_match[] = {
>>> +{ .compatible = "samsung,exynos4210-mipi-dsi",
>>> +  .data = &exynos4_dsi_driver_data },
>>> +{ .compatible = "samsung,exynos5420-mipi-dsi",
>>> +  .data = &exynos5_dsi_driver_data },
>>> +{ }
>>> +};
>>
>> I wonder if it wouldn't be better to use "samsung,exynos5410-mipi-dsi"
>> compatible and distinguish 5410 and 5420 by DSIM_VERSION register.
>>
>
> That's because I have only Exynos5420 SoC based target,
> so made DT for that and tested it only.
>
> But it seems to be no problem to use exynos5410 compatible at least
> for the dsi device :).
>
> I'll try.

I posted RFC v3 without this try.

Because there is no exynos5410 relevant DTS yet,
and making exynos5410 DTS is out of scope for this RFC.

Thank you.

Best regards YJ

>
>>
>>> +
>>> +static inline struct exynos_dsi_driver_data
>>> *exynos_dsi_get_driver_data(
>>> +struct platform_device *pdev)
>>> +{
>>> +const struct of_device_id *of_id =
>>> +of_match_device(exynos_dsi_of_match, &pdev->dev);
>>> +
>>> +return (struct exynos_dsi_driver_data *)of_id->data;
>>> +}
>>> +
>>>   static void exynos_dsi_wait_for_reset(struct exynos_dsi *dsi)
>>>   {
>>>   if (wait_for_completion_timeout(&dsi->completed,
>>> msecs_to_jiffies(300)))
>>> @@ -340,14 +378,9 @@ static unsigned long
>>> exynos_dsi_pll_find_pms(struct exynos_dsi *dsi,
>>>   static unsigned long exynos_dsi_set_pll(struct exynos_dsi *dsi,
>>>   unsigned long freq)
>>>   {
>>> -static const unsigned long freq_bands[] = {
>>> -100 * MHZ, 120 * MHZ, 160 * MHZ, 200 * MHZ,
>>> -270 * MHZ, 320 * MHZ, 390 * MHZ, 450 * MHZ,
>>> -510 * MHZ, 560 * MHZ, 640 * MHZ, 690 * MHZ,
>>> -770 * MHZ, 870 * MHZ, 950 * MHZ,
>>> -};
>>> +struct exynos_dsi_driver_data *driver_data = dsi->driver_data;
>>>   unsigned long fin, fout;
>>> -int timeout, band;
>>> +int timeout;
>>>   u8 p, s;
>>>   u16 m;
>>>   u32 reg;
>>> @@ -368,18 +401,30 @@ static unsigned long exynos_dsi_set_pll(struct
>>> exynos_dsi *dsi,
>>>   "failed to find PLL PMS for requested frequenc

[RFC v2 PATCH 08/14] drm/exynos: dsi: add driver data to support Exynos5420

2014-04-24 Thread YoungJun Cho
Hi Andrzej,

Thank you for comments.

On 04/23/2014 05:29 PM, Andrzej Hajda wrote:
> On 04/21/2014 02:28 PM, YoungJun Cho wrote:
>> The offset of register DSIM_PLLTMR_REG in Exynos5420 is different
>> from the one in Exynos4 SoC.
>>
>> In case of Exynos5420 SoC, there is no frequency band bit in 
>> DSIM_PLLCTRL_REG,
>> and it uses DSIM_PHYCTRL_REG and DSIM_PHYTIMING*_REG instead.
>> So this patch adds driver data to distinguish it.
>>
>> Signed-off-by: YoungJun Cho 
>> Acked-by: Inki Dae 
>> Acked-by: Kyungmin Park 
>> ---
>>   drivers/gpu/drm/exynos/exynos_drm_dsi.c |  101 
>> ---
>>   1 file changed, 80 insertions(+), 21 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/exynos/exynos_drm_dsi.c 
>> b/drivers/gpu/drm/exynos/exynos_drm_dsi.c
>> index 179f2fa..fcd577f 100644
>> --- a/drivers/gpu/drm/exynos/exynos_drm_dsi.c
>> +++ b/drivers/gpu/drm/exynos/exynos_drm_dsi.c
>> @@ -17,6 +17,7 @@
>>
>>   #include 
>>   #include 
>> +#include 
>>   #include 
>>   #include 
>>
>> @@ -54,9 +55,12 @@
>>
>>   /* FIFO memory AC characteristic register */
>>   #define DSIM_PLLCTRL_REG   0x4c/* PLL control register */
>> -#define DSIM_PLLTMR_REG 0x50/* PLL timer register */
>>   #define DSIM_PHYACCHR_REG  0x54/* D-PHY AC characteristic register */
>>   #define DSIM_PHYACCHR1_REG 0x58/* D-PHY AC characteristic register1 */
>> +#define DSIM_PHYCTRL_REG0x5c
>> +#define DSIM_PHYTIMING_REG  0x64
>> +#define DSIM_PHYTIMING1_REG 0x68
>> +#define DSIM_PHYTIMING2_REG 0x6c
>>
>>   /* DSIM_STATUS */
>>   #define DSIM_STOP_STATE_DAT(x) (((x) & 0xf) << 0)
>> @@ -233,6 +237,12 @@ struct exynos_dsi_transfer {
>>   #define DSIM_STATE_INITIALIZED BIT(1)
>>   #define DSIM_STATE_CMD_LPM BIT(2)
>>
>> +struct exynos_dsi_driver_data {
>> +unsigned int plltmr_reg;
>> +
>> +unsigned int has_freqband:1;
>> +};
>> +
>>   struct exynos_dsi {
>>  struct mipi_dsi_host dsi_host;
>>  struct drm_connector connector;
>> @@ -262,11 +272,39 @@ struct exynos_dsi {
>>
>>  spinlock_t transfer_lock; /* protects transfer_list */
>>  struct list_head transfer_list;
>> +
>> +struct exynos_dsi_driver_data *driver_data;
>>   };
>>
>>   #define host_to_dsi(host) container_of(host, struct exynos_dsi, dsi_host)
>>   #define connector_to_dsi(c) container_of(c, struct exynos_dsi, connector)
>>
>> +static struct exynos_dsi_driver_data exynos4_dsi_driver_data = {
>> +.plltmr_reg = 0x50,
>> +.has_freqband = 1,
>> +};
>> +
>> +static struct exynos_dsi_driver_data exynos5_dsi_driver_data = {
>> +.plltmr_reg = 0x58,
>> +};
>> +
>> +static struct of_device_id exynos_dsi_of_match[] = {
>> +{ .compatible = "samsung,exynos4210-mipi-dsi",
>> +  .data = &exynos4_dsi_driver_data },
>> +{ .compatible = "samsung,exynos5420-mipi-dsi",
>> +  .data = &exynos5_dsi_driver_data },
>> +{ }
>> +};
>
> I wonder if it wouldn't be better to use "samsung,exynos5410-mipi-dsi"
> compatible and distinguish 5410 and 5420 by DSIM_VERSION register.
>

That's because I have only Exynos5420 SoC based target,
so made DT for that and tested it only.

But it seems to be no problem to use exynos5410 compatible at least
for the dsi device :).

I'll try.

>
>> +
>> +static inline struct exynos_dsi_driver_data *exynos_dsi_get_driver_data(
>> +struct platform_device *pdev)
>> +{
>> +const struct of_device_id *of_id =
>> +of_match_device(exynos_dsi_of_match, &pdev->dev);
>> +
>> +return (struct exynos_dsi_driver_data *)of_id->data;
>> +}
>> +
>>   static void exynos_dsi_wait_for_reset(struct exynos_dsi *dsi)
>>   {
>>  if (wait_for_completion_timeout(&dsi->completed, msecs_to_jiffies(300)))
>> @@ -340,14 +378,9 @@ static unsigned long exynos_dsi_pll_find_pms(struct 
>> exynos_dsi *dsi,
>>   static unsigned long exynos_dsi_set_pll(struct exynos_dsi *dsi,
>>  unsigned long freq)
>>   {
>> -static const unsigned long freq_bands[] = {
>> -100 * MHZ, 120 * MHZ, 160 * MHZ, 200 * MHZ,
>> -270 * MHZ, 320 * MHZ, 390 * MHZ, 450 * MHZ,
>> -510 * MHZ, 560 * MHZ, 640 * MHZ, 690 * MHZ,
>> -770 * MHZ, 870 * MHZ, 950 * MHZ,
>> -};
>> +struct exynos_dsi_driver_data *driver_data = dsi->driver_data;
>>  unsigned long fin, fout;
>> -int timeout, band;
>> +int timeout;
>>  u8 p, s;
>>  u16 m;
>>  u32 reg;
>> @@ -368,18 +401,30 @@ static unsigned long exynos_dsi_set_pll(struct 
>> exynos_dsi *dsi,
>>  "failed to find PLL PMS for requested frequency\n");
>>  return -EFAULT;
>>  }
>> +dev_dbg(dsi->dev, "PLL freq %lu, (p %d, m %d, s %d)\n", fout, p, m, s);
>>
>> -for (band = 0; band < ARRAY_SIZE(freq_bands); ++band)
>> -if (fout < freq_bands[band])
>> -break;
>> +writel(500, dsi->reg_base + driver_data->plltmr_reg);
>

[RFC v2 PATCH 08/14] drm/exynos: dsi: add driver data to support Exynos5420

2014-04-23 Thread Andrzej Hajda
On 04/21/2014 02:28 PM, YoungJun Cho wrote:
> The offset of register DSIM_PLLTMR_REG in Exynos5420 is different
> from the one in Exynos4 SoC.
>
> In case of Exynos5420 SoC, there is no frequency band bit in DSIM_PLLCTRL_REG,
> and it uses DSIM_PHYCTRL_REG and DSIM_PHYTIMING*_REG instead.
> So this patch adds driver data to distinguish it.
>
> Signed-off-by: YoungJun Cho 
> Acked-by: Inki Dae 
> Acked-by: Kyungmin Park 
> ---
>  drivers/gpu/drm/exynos/exynos_drm_dsi.c |  101 
> ---
>  1 file changed, 80 insertions(+), 21 deletions(-)
>
> diff --git a/drivers/gpu/drm/exynos/exynos_drm_dsi.c 
> b/drivers/gpu/drm/exynos/exynos_drm_dsi.c
> index 179f2fa..fcd577f 100644
> --- a/drivers/gpu/drm/exynos/exynos_drm_dsi.c
> +++ b/drivers/gpu/drm/exynos/exynos_drm_dsi.c
> @@ -17,6 +17,7 @@
>  
>  #include 
>  #include 
> +#include 
>  #include 
>  #include 
>  
> @@ -54,9 +55,12 @@
>  
>  /* FIFO memory AC characteristic register */
>  #define DSIM_PLLCTRL_REG 0x4c/* PLL control register */
> -#define DSIM_PLLTMR_REG  0x50/* PLL timer register */
>  #define DSIM_PHYACCHR_REG0x54/* D-PHY AC characteristic register */
>  #define DSIM_PHYACCHR1_REG   0x58/* D-PHY AC characteristic register1 */
> +#define DSIM_PHYCTRL_REG 0x5c
> +#define DSIM_PHYTIMING_REG   0x64
> +#define DSIM_PHYTIMING1_REG  0x68
> +#define DSIM_PHYTIMING2_REG  0x6c
>  
>  /* DSIM_STATUS */
>  #define DSIM_STOP_STATE_DAT(x)   (((x) & 0xf) << 0)
> @@ -233,6 +237,12 @@ struct exynos_dsi_transfer {
>  #define DSIM_STATE_INITIALIZED   BIT(1)
>  #define DSIM_STATE_CMD_LPM   BIT(2)
>  
> +struct exynos_dsi_driver_data {
> + unsigned int plltmr_reg;
> +
> + unsigned int has_freqband:1;
> +};
> +
>  struct exynos_dsi {
>   struct mipi_dsi_host dsi_host;
>   struct drm_connector connector;
> @@ -262,11 +272,39 @@ struct exynos_dsi {
>  
>   spinlock_t transfer_lock; /* protects transfer_list */
>   struct list_head transfer_list;
> +
> + struct exynos_dsi_driver_data *driver_data;
>  };
>  
>  #define host_to_dsi(host) container_of(host, struct exynos_dsi, dsi_host)
>  #define connector_to_dsi(c) container_of(c, struct exynos_dsi, connector)
>  
> +static struct exynos_dsi_driver_data exynos4_dsi_driver_data = {
> + .plltmr_reg = 0x50,
> + .has_freqband = 1,
> +};
> +
> +static struct exynos_dsi_driver_data exynos5_dsi_driver_data = {
> + .plltmr_reg = 0x58,
> +};
> +
> +static struct of_device_id exynos_dsi_of_match[] = {
> + { .compatible = "samsung,exynos4210-mipi-dsi",
> +   .data = &exynos4_dsi_driver_data },
> + { .compatible = "samsung,exynos5420-mipi-dsi",
> +   .data = &exynos5_dsi_driver_data },
> + { }
> +};

I wonder if it wouldn't be better to use "samsung,exynos5410-mipi-dsi"
compatible and distinguish 5410 and 5420 by DSIM_VERSION register.


> +
> +static inline struct exynos_dsi_driver_data *exynos_dsi_get_driver_data(
> + struct platform_device *pdev)
> +{
> + const struct of_device_id *of_id =
> + of_match_device(exynos_dsi_of_match, &pdev->dev);
> +
> + return (struct exynos_dsi_driver_data *)of_id->data;
> +}
> +
>  static void exynos_dsi_wait_for_reset(struct exynos_dsi *dsi)
>  {
>   if (wait_for_completion_timeout(&dsi->completed, msecs_to_jiffies(300)))
> @@ -340,14 +378,9 @@ static unsigned long exynos_dsi_pll_find_pms(struct 
> exynos_dsi *dsi,
>  static unsigned long exynos_dsi_set_pll(struct exynos_dsi *dsi,
>   unsigned long freq)
>  {
> - static const unsigned long freq_bands[] = {
> - 100 * MHZ, 120 * MHZ, 160 * MHZ, 200 * MHZ,
> - 270 * MHZ, 320 * MHZ, 390 * MHZ, 450 * MHZ,
> - 510 * MHZ, 560 * MHZ, 640 * MHZ, 690 * MHZ,
> - 770 * MHZ, 870 * MHZ, 950 * MHZ,
> - };
> + struct exynos_dsi_driver_data *driver_data = dsi->driver_data;
>   unsigned long fin, fout;
> - int timeout, band;
> + int timeout;
>   u8 p, s;
>   u16 m;
>   u32 reg;
> @@ -368,18 +401,30 @@ static unsigned long exynos_dsi_set_pll(struct 
> exynos_dsi *dsi,
>   "failed to find PLL PMS for requested frequency\n");
>   return -EFAULT;
>   }
> + dev_dbg(dsi->dev, "PLL freq %lu, (p %d, m %d, s %d)\n", fout, p, m, s);
>  
> - for (band = 0; band < ARRAY_SIZE(freq_bands); ++band)
> - if (fout < freq_bands[band])
> - break;
> + writel(500, dsi->reg_base + driver_data->plltmr_reg);
> +
> + reg = DSIM_PLL_EN | DSIM_PLL_P(p) | DSIM_PLL_M(m) | DSIM_PLL_S(s);
> +
> + if (driver_data->has_freqband) {
> + static const unsigned long freq_bands[] = {
> + 100 * MHZ, 120 * MHZ, 160 * MHZ, 200 * MHZ,
> + 270 * MHZ, 320 * MHZ, 390 * MHZ, 450 * MHZ,
> + 510 * MHZ, 560 * MHZ, 6

[RFC v2 PATCH 08/14] drm/exynos: dsi: add driver data to support Exynos5420

2014-04-21 Thread YoungJun Cho
The offset of register DSIM_PLLTMR_REG in Exynos5420 is different
from the one in Exynos4 SoC.

In case of Exynos5420 SoC, there is no frequency band bit in DSIM_PLLCTRL_REG,
and it uses DSIM_PHYCTRL_REG and DSIM_PHYTIMING*_REG instead.
So this patch adds driver data to distinguish it.

Signed-off-by: YoungJun Cho 
Acked-by: Inki Dae 
Acked-by: Kyungmin Park 
---
 drivers/gpu/drm/exynos/exynos_drm_dsi.c |  101 ---
 1 file changed, 80 insertions(+), 21 deletions(-)

diff --git a/drivers/gpu/drm/exynos/exynos_drm_dsi.c 
b/drivers/gpu/drm/exynos/exynos_drm_dsi.c
index 179f2fa..fcd577f 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_dsi.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_dsi.c
@@ -17,6 +17,7 @@

 #include 
 #include 
+#include 
 #include 
 #include 

@@ -54,9 +55,12 @@

 /* FIFO memory AC characteristic register */
 #define DSIM_PLLCTRL_REG   0x4c/* PLL control register */
-#define DSIM_PLLTMR_REG0x50/* PLL timer register */
 #define DSIM_PHYACCHR_REG  0x54/* D-PHY AC characteristic register */
 #define DSIM_PHYACCHR1_REG 0x58/* D-PHY AC characteristic register1 */
+#define DSIM_PHYCTRL_REG   0x5c
+#define DSIM_PHYTIMING_REG 0x64
+#define DSIM_PHYTIMING1_REG0x68
+#define DSIM_PHYTIMING2_REG0x6c

 /* DSIM_STATUS */
 #define DSIM_STOP_STATE_DAT(x) (((x) & 0xf) << 0)
@@ -233,6 +237,12 @@ struct exynos_dsi_transfer {
 #define DSIM_STATE_INITIALIZED BIT(1)
 #define DSIM_STATE_CMD_LPM BIT(2)

+struct exynos_dsi_driver_data {
+   unsigned int plltmr_reg;
+
+   unsigned int has_freqband:1;
+};
+
 struct exynos_dsi {
struct mipi_dsi_host dsi_host;
struct drm_connector connector;
@@ -262,11 +272,39 @@ struct exynos_dsi {

spinlock_t transfer_lock; /* protects transfer_list */
struct list_head transfer_list;
+
+   struct exynos_dsi_driver_data *driver_data;
 };

 #define host_to_dsi(host) container_of(host, struct exynos_dsi, dsi_host)
 #define connector_to_dsi(c) container_of(c, struct exynos_dsi, connector)

+static struct exynos_dsi_driver_data exynos4_dsi_driver_data = {
+   .plltmr_reg = 0x50,
+   .has_freqband = 1,
+};
+
+static struct exynos_dsi_driver_data exynos5_dsi_driver_data = {
+   .plltmr_reg = 0x58,
+};
+
+static struct of_device_id exynos_dsi_of_match[] = {
+   { .compatible = "samsung,exynos4210-mipi-dsi",
+ .data = &exynos4_dsi_driver_data },
+   { .compatible = "samsung,exynos5420-mipi-dsi",
+ .data = &exynos5_dsi_driver_data },
+   { }
+};
+
+static inline struct exynos_dsi_driver_data *exynos_dsi_get_driver_data(
+   struct platform_device *pdev)
+{
+   const struct of_device_id *of_id =
+   of_match_device(exynos_dsi_of_match, &pdev->dev);
+
+   return (struct exynos_dsi_driver_data *)of_id->data;
+}
+
 static void exynos_dsi_wait_for_reset(struct exynos_dsi *dsi)
 {
if (wait_for_completion_timeout(&dsi->completed, msecs_to_jiffies(300)))
@@ -340,14 +378,9 @@ static unsigned long exynos_dsi_pll_find_pms(struct 
exynos_dsi *dsi,
 static unsigned long exynos_dsi_set_pll(struct exynos_dsi *dsi,
unsigned long freq)
 {
-   static const unsigned long freq_bands[] = {
-   100 * MHZ, 120 * MHZ, 160 * MHZ, 200 * MHZ,
-   270 * MHZ, 320 * MHZ, 390 * MHZ, 450 * MHZ,
-   510 * MHZ, 560 * MHZ, 640 * MHZ, 690 * MHZ,
-   770 * MHZ, 870 * MHZ, 950 * MHZ,
-   };
+   struct exynos_dsi_driver_data *driver_data = dsi->driver_data;
unsigned long fin, fout;
-   int timeout, band;
+   int timeout;
u8 p, s;
u16 m;
u32 reg;
@@ -368,18 +401,30 @@ static unsigned long exynos_dsi_set_pll(struct exynos_dsi 
*dsi,
"failed to find PLL PMS for requested frequency\n");
return -EFAULT;
}
+   dev_dbg(dsi->dev, "PLL freq %lu, (p %d, m %d, s %d)\n", fout, p, m, s);

-   for (band = 0; band < ARRAY_SIZE(freq_bands); ++band)
-   if (fout < freq_bands[band])
-   break;
+   writel(500, dsi->reg_base + driver_data->plltmr_reg);
+
+   reg = DSIM_PLL_EN | DSIM_PLL_P(p) | DSIM_PLL_M(m) | DSIM_PLL_S(s);
+
+   if (driver_data->has_freqband) {
+   static const unsigned long freq_bands[] = {
+   100 * MHZ, 120 * MHZ, 160 * MHZ, 200 * MHZ,
+   270 * MHZ, 320 * MHZ, 390 * MHZ, 450 * MHZ,
+   510 * MHZ, 560 * MHZ, 640 * MHZ, 690 * MHZ,
+   770 * MHZ, 870 * MHZ, 950 * MHZ,
+   };
+   int band;

-   dev_dbg(dsi->dev, "PLL freq %lu, (p %d, m %d, s %d), band %d\n", fout,
-   p, m, s, band);
+   for (band = 0; band < ARRAY_SIZE(freq_bands); ++band)
+   if (fout < freq_bands[ban