@@ -74,7 +74,7 @@ void assert_shared_dpll(struct drm_i915_private *dev_priv,
7474 if (WARN (!pll , "asserting DPLL %s with no DPLL\n" , onoff (state )))
7575 return ;
7676
77- cur_state = pll -> get_hw_state (dev_priv , pll , & hw_state );
77+ cur_state = pll -> funcs . get_hw_state (dev_priv , pll , & hw_state );
7878 I915_STATE_WARN (cur_state != state ,
7979 "%s assertion failure (expected %s, current %s)\n" ,
8080 pll -> name , onoff (state ), onoff (cur_state ));
@@ -95,7 +95,7 @@ void intel_prepare_shared_dpll(struct intel_crtc *crtc)
9595 WARN_ON (pll -> on );
9696 assert_shared_dpll_disabled (dev_priv , pll );
9797
98- pll -> mode_set (dev_priv , pll );
98+ pll -> funcs . mode_set (dev_priv , pll );
9999 }
100100}
101101
@@ -133,7 +133,7 @@ void intel_enable_shared_dpll(struct intel_crtc *crtc)
133133 intel_display_power_get (dev_priv , POWER_DOMAIN_PLLS );
134134
135135 DRM_DEBUG_KMS ("enabling %s\n" , pll -> name );
136- pll -> enable (dev_priv , pll );
136+ pll -> funcs . enable (dev_priv , pll );
137137 pll -> on = true;
138138}
139139
@@ -168,7 +168,7 @@ void intel_disable_shared_dpll(struct intel_crtc *crtc)
168168 return ;
169169
170170 DRM_DEBUG_KMS ("disabling %s\n" , pll -> name );
171- pll -> disable (dev_priv , pll );
171+ pll -> funcs . disable (dev_priv , pll );
172172 pll -> on = false;
173173
174174 intel_display_power_put (dev_priv , POWER_DOMAIN_PLLS );
@@ -398,29 +398,13 @@ static void ibx_pch_dpll_disable(struct drm_i915_private *dev_priv,
398398 udelay (200 );
399399}
400400
401- static char * ibx_pch_dpll_names [] = {
402- "PCH DPLL A" ,
403- "PCH DPLL B" ,
401+ static const struct intel_shared_dpll_funcs ibx_pch_dpll_funcs = {
402+ .mode_set = ibx_pch_dpll_mode_set ,
403+ .enable = ibx_pch_dpll_enable ,
404+ .disable = ibx_pch_dpll_disable ,
405+ .get_hw_state = ibx_pch_dpll_get_hw_state ,
404406};
405407
406- static void ibx_pch_dpll_init (struct drm_device * dev )
407- {
408- struct drm_i915_private * dev_priv = dev -> dev_private ;
409- int i ;
410-
411- dev_priv -> num_shared_dpll = 2 ;
412-
413- for (i = 0 ; i < dev_priv -> num_shared_dpll ; i ++ ) {
414- dev_priv -> shared_dplls [i ].id = i ;
415- dev_priv -> shared_dplls [i ].name = ibx_pch_dpll_names [i ];
416- dev_priv -> shared_dplls [i ].mode_set = ibx_pch_dpll_mode_set ;
417- dev_priv -> shared_dplls [i ].enable = ibx_pch_dpll_enable ;
418- dev_priv -> shared_dplls [i ].disable = ibx_pch_dpll_disable ;
419- dev_priv -> shared_dplls [i ].get_hw_state =
420- ibx_pch_dpll_get_hw_state ;
421- }
422- }
423-
424408static void hsw_ddi_wrpll_enable (struct drm_i915_private * dev_priv ,
425409 struct intel_shared_dpll * pll )
426410{
@@ -492,40 +476,16 @@ static bool hsw_ddi_spll_get_hw_state(struct drm_i915_private *dev_priv,
492476}
493477
494478
495- static const char * const hsw_ddi_pll_names [] = {
496- "WRPLL 1" ,
497- "WRPLL 2" ,
498- "SPLL"
479+ static const struct intel_shared_dpll_funcs hsw_ddi_wrpll_funcs = {
480+ . enable = hsw_ddi_wrpll_enable ,
481+ . disable = hsw_ddi_wrpll_disable ,
482+ . get_hw_state = hsw_ddi_wrpll_get_hw_state ,
499483};
500484
501- static void hsw_shared_dplls_init (struct drm_i915_private * dev_priv )
502- {
503- int i ;
504-
505- dev_priv -> num_shared_dpll = 3 ;
506-
507- for (i = 0 ; i < 2 ; i ++ ) {
508- dev_priv -> shared_dplls [i ].id = i ;
509- dev_priv -> shared_dplls [i ].name = hsw_ddi_pll_names [i ];
510- dev_priv -> shared_dplls [i ].disable = hsw_ddi_wrpll_disable ;
511- dev_priv -> shared_dplls [i ].enable = hsw_ddi_wrpll_enable ;
512- dev_priv -> shared_dplls [i ].get_hw_state =
513- hsw_ddi_wrpll_get_hw_state ;
514- }
515-
516- /* SPLL is special, but needs to be initialized anyway.. */
517- dev_priv -> shared_dplls [i ].id = i ;
518- dev_priv -> shared_dplls [i ].name = hsw_ddi_pll_names [i ];
519- dev_priv -> shared_dplls [i ].disable = hsw_ddi_spll_disable ;
520- dev_priv -> shared_dplls [i ].enable = hsw_ddi_spll_enable ;
521- dev_priv -> shared_dplls [i ].get_hw_state = hsw_ddi_spll_get_hw_state ;
522-
523- }
524-
525- static const char * const skl_ddi_pll_names [] = {
526- "DPLL 1" ,
527- "DPLL 2" ,
528- "DPLL 3" ,
485+ static const struct intel_shared_dpll_funcs hsw_ddi_spll_funcs = {
486+ .enable = hsw_ddi_spll_enable ,
487+ .disable = hsw_ddi_spll_disable ,
488+ .get_hw_state = hsw_ddi_spll_get_hw_state ,
529489};
530490
531491struct skl_dpll_regs {
@@ -634,26 +594,10 @@ static bool skl_ddi_pll_get_hw_state(struct drm_i915_private *dev_priv,
634594 return ret ;
635595}
636596
637- static void skl_shared_dplls_init (struct drm_i915_private * dev_priv )
638- {
639- int i ;
640-
641- dev_priv -> num_shared_dpll = 3 ;
642-
643- for (i = 0 ; i < dev_priv -> num_shared_dpll ; i ++ ) {
644- dev_priv -> shared_dplls [i ].id = i ;
645- dev_priv -> shared_dplls [i ].name = skl_ddi_pll_names [i ];
646- dev_priv -> shared_dplls [i ].disable = skl_ddi_pll_disable ;
647- dev_priv -> shared_dplls [i ].enable = skl_ddi_pll_enable ;
648- dev_priv -> shared_dplls [i ].get_hw_state =
649- skl_ddi_pll_get_hw_state ;
650- }
651- }
652-
653- static const char * const bxt_ddi_pll_names [] = {
654- "PORT PLL A" ,
655- "PORT PLL B" ,
656- "PORT PLL C" ,
597+ static const struct intel_shared_dpll_funcs skl_ddi_pll_funcs = {
598+ .enable = skl_ddi_pll_enable ,
599+ .disable = skl_ddi_pll_disable ,
600+ .get_hw_state = skl_ddi_pll_get_hw_state ,
657601};
658602
659603static void bxt_ddi_pll_enable (struct drm_i915_private * dev_priv ,
@@ -838,34 +782,17 @@ static bool bxt_ddi_pll_get_hw_state(struct drm_i915_private *dev_priv,
838782 return ret ;
839783}
840784
841- static void bxt_shared_dplls_init (struct drm_i915_private * dev_priv )
842- {
843- int i ;
844-
845- dev_priv -> num_shared_dpll = 3 ;
846-
847- for (i = 0 ; i < dev_priv -> num_shared_dpll ; i ++ ) {
848- dev_priv -> shared_dplls [i ].id = i ;
849- dev_priv -> shared_dplls [i ].name = bxt_ddi_pll_names [i ];
850- dev_priv -> shared_dplls [i ].disable = bxt_ddi_pll_disable ;
851- dev_priv -> shared_dplls [i ].enable = bxt_ddi_pll_enable ;
852- dev_priv -> shared_dplls [i ].get_hw_state =
853- bxt_ddi_pll_get_hw_state ;
854- }
855- }
785+ static const struct intel_shared_dpll_funcs bxt_ddi_pll_funcs = {
786+ .enable = bxt_ddi_pll_enable ,
787+ .disable = bxt_ddi_pll_disable ,
788+ .get_hw_state = bxt_ddi_pll_get_hw_state ,
789+ };
856790
857791static void intel_ddi_pll_init (struct drm_device * dev )
858792{
859793 struct drm_i915_private * dev_priv = dev -> dev_private ;
860794 uint32_t val = I915_READ (LCPLL_CTL );
861795
862- if (IS_SKYLAKE (dev ) || IS_KABYLAKE (dev ))
863- skl_shared_dplls_init (dev_priv );
864- else if (IS_BROXTON (dev ))
865- bxt_shared_dplls_init (dev_priv );
866- else
867- hsw_shared_dplls_init (dev_priv );
868-
869796 if (IS_SKYLAKE (dev ) || IS_KABYLAKE (dev )) {
870797 int cdclk_freq ;
871798
@@ -893,16 +820,72 @@ static void intel_ddi_pll_init(struct drm_device *dev)
893820 }
894821}
895822
823+ struct dpll_info {
824+ const char * name ;
825+ const int id ;
826+ const struct intel_shared_dpll_funcs * funcs ;
827+ };
828+
829+ static const struct dpll_info pch_plls [] = {
830+ { "PCH DPLL A" , DPLL_ID_PCH_PLL_A , & ibx_pch_dpll_funcs },
831+ { "PCH DPLL B" , DPLL_ID_PCH_PLL_B , & ibx_pch_dpll_funcs },
832+ { NULL , -1 , NULL },
833+ };
834+
835+ static const struct dpll_info hsw_plls [] = {
836+ { "WRPLL 1" , DPLL_ID_WRPLL1 , & hsw_ddi_wrpll_funcs },
837+ { "WRPLL 2" , DPLL_ID_WRPLL2 , & hsw_ddi_wrpll_funcs },
838+ { "SPLL" , DPLL_ID_SPLL , & hsw_ddi_spll_funcs },
839+ { NULL , -1 , NULL , },
840+ };
841+
842+ static const struct dpll_info skl_plls [] = {
843+ { "DPPL 1" , DPLL_ID_SKL_DPLL1 , & skl_ddi_pll_funcs },
844+ { "DPPL 2" , DPLL_ID_SKL_DPLL2 , & skl_ddi_pll_funcs },
845+ { "DPPL 3" , DPLL_ID_SKL_DPLL3 , & skl_ddi_pll_funcs },
846+ { NULL , -1 , NULL , },
847+ };
848+
849+ static const struct dpll_info bxt_plls [] = {
850+ { "PORT PLL A" , 0 , & bxt_ddi_pll_funcs },
851+ { "PORT PLL B" , 1 , & bxt_ddi_pll_funcs },
852+ { "PORT PLL C" , 2 , & bxt_ddi_pll_funcs },
853+ { NULL , -1 , NULL , },
854+ };
855+
896856void intel_shared_dpll_init (struct drm_device * dev )
897857{
898858 struct drm_i915_private * dev_priv = dev -> dev_private ;
859+ const struct dpll_info * dpll_info = NULL ;
860+ int i ;
899861
900- if (HAS_DDI (dev ))
901- intel_ddi_pll_init (dev );
862+ if (IS_SKYLAKE (dev ) || IS_KABYLAKE (dev ))
863+ dpll_info = skl_plls ;
864+ else if IS_BROXTON (dev )
865+ dpll_info = bxt_plls ;
866+ else if (HAS_DDI (dev ))
867+ dpll_info = hsw_plls ;
902868 else if (HAS_PCH_IBX (dev ) || HAS_PCH_CPT (dev ))
903- ibx_pch_dpll_init (dev );
904- else
869+ dpll_info = pch_plls ;
870+
871+ if (!dpll_info ) {
905872 dev_priv -> num_shared_dpll = 0 ;
873+ return ;
874+ }
875+
876+ for (i = 0 ; dpll_info [i ].id >= 0 ; i ++ ) {
877+ WARN_ON (i != dpll_info [i ].id );
878+
879+ dev_priv -> shared_dplls [i ].id = dpll_info [i ].id ;
880+ dev_priv -> shared_dplls [i ].name = dpll_info [i ].name ;
881+ dev_priv -> shared_dplls [i ].funcs = * dpll_info [i ].funcs ;
882+ }
883+
884+ dev_priv -> num_shared_dpll = i ;
906885
907886 BUG_ON (dev_priv -> num_shared_dpll > I915_NUM_PLLS );
887+
888+ /* FIXME: Move this to a more suitable place */
889+ if (HAS_DDI (dev ))
890+ intel_ddi_pll_init (dev );
908891}
0 commit comments