219219#define DSI_XFER_TIMEOUT_MS 100
220220#define DSI_RX_FIFO_EMPTY 0x30800002
221221
222- #define OLD_SCLK_MIPI_CLK_NAME "pll_clk"
223-
224222#define PS_TO_CYCLE (ps , hz ) DIV64_U64_ROUND_CLOSEST(((ps) * (hz)), 1000000000000ULL)
225223
226- static const char * const clk_names [5 ] = {
227- "bus_clk" ,
228- "sclk_mipi" ,
229- "phyclk_mipidphy0_bitclkdiv8" ,
230- "phyclk_mipidphy0_rxclkesc0" ,
231- "sclk_rgb_vclk_to_dsim0"
232- };
233-
234224enum samsung_dsim_transfer_type {
235225 EXYNOS_DSI_TX ,
236226 EXYNOS_DSI_RX ,
237227};
238228
229+ static struct clk_bulk_data exynos3_clk_bulk_data [] = {
230+ { .id = "bus_clk" },
231+ { .id = "pll_clk" },
232+ };
233+
234+ static struct clk_bulk_data exynos4_clk_bulk_data [] = {
235+ { .id = "bus_clk" },
236+ { .id = "sclk_mipi" },
237+ };
238+
239+ static struct clk_bulk_data exynos5433_clk_bulk_data [] = {
240+ { .id = "bus_clk" },
241+ { .id = "sclk_mipi" },
242+ { .id = "phyclk_mipidphy0_bitclkdiv8" },
243+ { .id = "phyclk_mipidphy0_rxclkesc0" },
244+ { .id = "sclk_rgb_vclk_to_dsim0" },
245+ };
246+
239247enum reg_idx {
240248 DSIM_STATUS_REG , /* Status register (legacy) */
241249 DSIM_LINK_STATUS_REG , /* Link status register */
@@ -408,7 +416,8 @@ static const struct samsung_dsim_driver_data exynos3_dsi_driver_data = {
408416 .has_legacy_status_reg = 1 ,
409417 .has_freqband = 1 ,
410418 .has_clklane_stop = 1 ,
411- .num_clks = 2 ,
419+ .clk_data = exynos3_clk_bulk_data ,
420+ .num_clks = ARRAY_SIZE (exynos3_clk_bulk_data ),
412421 .max_freq = 1000 ,
413422 .wait_for_hdr_fifo = 1 ,
414423 .wait_for_reset = 1 ,
@@ -439,7 +448,8 @@ static const struct samsung_dsim_driver_data exynos4_dsi_driver_data = {
439448 .has_legacy_status_reg = 1 ,
440449 .has_freqband = 1 ,
441450 .has_clklane_stop = 1 ,
442- .num_clks = 2 ,
451+ .clk_data = exynos4_clk_bulk_data ,
452+ .num_clks = ARRAY_SIZE (exynos4_clk_bulk_data ),
443453 .max_freq = 1000 ,
444454 .wait_for_hdr_fifo = 1 ,
445455 .wait_for_reset = 1 ,
@@ -468,7 +478,8 @@ static const struct samsung_dsim_driver_data exynos5_dsi_driver_data = {
468478 .reg_ofs = exynos_reg_ofs ,
469479 .plltmr_reg = 0x58 ,
470480 .has_legacy_status_reg = 1 ,
471- .num_clks = 2 ,
481+ .clk_data = exynos3_clk_bulk_data ,
482+ .num_clks = ARRAY_SIZE (exynos3_clk_bulk_data ),
472483 .max_freq = 1000 ,
473484 .wait_for_hdr_fifo = 1 ,
474485 .wait_for_reset = 1 ,
@@ -497,7 +508,8 @@ static const struct samsung_dsim_driver_data exynos5433_dsi_driver_data = {
497508 .plltmr_reg = 0xa0 ,
498509 .has_legacy_status_reg = 1 ,
499510 .has_clklane_stop = 1 ,
500- .num_clks = 5 ,
511+ .clk_data = exynos5433_clk_bulk_data ,
512+ .num_clks = ARRAY_SIZE (exynos5433_clk_bulk_data ),
501513 .max_freq = 1500 ,
502514 .wait_for_hdr_fifo = 1 ,
503515 .wait_for_reset = 0 ,
@@ -526,7 +538,8 @@ static const struct samsung_dsim_driver_data exynos5422_dsi_driver_data = {
526538 .plltmr_reg = 0xa0 ,
527539 .has_legacy_status_reg = 1 ,
528540 .has_clklane_stop = 1 ,
529- .num_clks = 2 ,
541+ .clk_data = exynos3_clk_bulk_data ,
542+ .num_clks = ARRAY_SIZE (exynos3_clk_bulk_data ),
530543 .max_freq = 1500 ,
531544 .wait_for_hdr_fifo = 1 ,
532545 .wait_for_reset = 1 ,
@@ -555,7 +568,8 @@ static const struct samsung_dsim_driver_data imx8mm_dsi_driver_data = {
555568 .plltmr_reg = 0xa0 ,
556569 .has_legacy_status_reg = 1 ,
557570 .has_clklane_stop = 1 ,
558- .num_clks = 2 ,
571+ .clk_data = exynos4_clk_bulk_data ,
572+ .num_clks = ARRAY_SIZE (exynos4_clk_bulk_data ),
559573 .max_freq = 2100 ,
560574 .wait_for_hdr_fifo = 1 ,
561575 .wait_for_reset = 0 ,
@@ -2021,7 +2035,7 @@ int samsung_dsim_probe(struct platform_device *pdev)
20212035{
20222036 struct device * dev = & pdev -> dev ;
20232037 struct samsung_dsim * dsi ;
2024- int ret , i ;
2038+ int ret ;
20252039
20262040 dsi = devm_drm_bridge_alloc (dev , struct samsung_dsim , bridge , & samsung_dsim_bridge_funcs );
20272041 if (IS_ERR (dsi ))
@@ -2045,23 +2059,11 @@ int samsung_dsim_probe(struct platform_device *pdev)
20452059 if (ret )
20462060 return dev_err_probe (dev , ret , "failed to get regulators\n" );
20472061
2048- dsi -> clks = devm_kcalloc (dev , dsi -> driver_data -> num_clks ,
2049- sizeof (* dsi -> clks ), GFP_KERNEL );
2050- if (!dsi -> clks )
2051- return - ENOMEM ;
2052-
2053- for (i = 0 ; i < dsi -> driver_data -> num_clks ; i ++ ) {
2054- dsi -> clks [i ] = devm_clk_get (dev , clk_names [i ]);
2055- if (IS_ERR (dsi -> clks [i ])) {
2056- if (strcmp (clk_names [i ], "sclk_mipi" ) == 0 ) {
2057- dsi -> clks [i ] = devm_clk_get (dev , OLD_SCLK_MIPI_CLK_NAME );
2058- if (!IS_ERR (dsi -> clks [i ]))
2059- continue ;
2060- }
2061-
2062- dev_info (dev , "failed to get the clock: %s\n" , clk_names [i ]);
2063- return PTR_ERR (dsi -> clks [i ]);
2064- }
2062+ ret = devm_clk_bulk_get (dev , dsi -> driver_data -> num_clks ,
2063+ dsi -> driver_data -> clk_data );
2064+ if (ret ) {
2065+ dev_err (dev , "failed to get clocks in bulk (%d)\n" , ret );
2066+ return ret ;
20652067 }
20662068
20672069 dsi -> reg_base = devm_platform_ioremap_resource (pdev , 0 );
@@ -2134,7 +2136,7 @@ static int samsung_dsim_suspend(struct device *dev)
21342136{
21352137 struct samsung_dsim * dsi = dev_get_drvdata (dev );
21362138 const struct samsung_dsim_driver_data * driver_data = dsi -> driver_data ;
2137- int ret , i ;
2139+ int ret ;
21382140
21392141 usleep_range (10000 , 20000 );
21402142
@@ -2150,8 +2152,7 @@ static int samsung_dsim_suspend(struct device *dev)
21502152
21512153 phy_power_off (dsi -> phy );
21522154
2153- for (i = driver_data -> num_clks - 1 ; i > -1 ; i -- )
2154- clk_disable_unprepare (dsi -> clks [i ]);
2155+ clk_bulk_disable_unprepare (driver_data -> num_clks , driver_data -> clk_data );
21552156
21562157 ret = regulator_bulk_disable (ARRAY_SIZE (dsi -> supplies ), dsi -> supplies );
21572158 if (ret < 0 )
@@ -2164,19 +2165,17 @@ static int samsung_dsim_resume(struct device *dev)
21642165{
21652166 struct samsung_dsim * dsi = dev_get_drvdata (dev );
21662167 const struct samsung_dsim_driver_data * driver_data = dsi -> driver_data ;
2167- int ret , i ;
2168+ int ret ;
21682169
21692170 ret = regulator_bulk_enable (ARRAY_SIZE (dsi -> supplies ), dsi -> supplies );
21702171 if (ret < 0 ) {
21712172 dev_err (dsi -> dev , "cannot enable regulators %d\n" , ret );
21722173 return ret ;
21732174 }
21742175
2175- for (i = 0 ; i < driver_data -> num_clks ; i ++ ) {
2176- ret = clk_prepare_enable (dsi -> clks [i ]);
2177- if (ret < 0 )
2178- goto err_clk ;
2179- }
2176+ ret = clk_bulk_prepare_enable (driver_data -> num_clks , driver_data -> clk_data );
2177+ if (ret < 0 )
2178+ goto err_clk ;
21802179
21812180 ret = phy_power_on (dsi -> phy );
21822181 if (ret < 0 ) {
@@ -2187,8 +2186,7 @@ static int samsung_dsim_resume(struct device *dev)
21872186 return 0 ;
21882187
21892188err_clk :
2190- while (-- i > -1 )
2191- clk_disable_unprepare (dsi -> clks [i ]);
2189+ clk_bulk_disable_unprepare (driver_data -> num_clks , driver_data -> clk_data );
21922190 regulator_bulk_disable (ARRAY_SIZE (dsi -> supplies ), dsi -> supplies );
21932191
21942192 return ret ;
0 commit comments