aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTomi Valkeinen <tomi.valkeinen@ti.com>2016-08-10 04:04:29 -0400
committerTomi Valkeinen <tomi.valkeinen@ti.com>2017-04-03 05:36:40 -0400
commit7bbdef2b4b77be09910b9ae71b27ee29a8cdad0c (patch)
tree3216dbab4368a5f7e0e53c49520530e2aec73626
parent1e90711d237fef7b3781706d8202304b1e646271 (diff)
drm/omap: improve DPI clock selection on DRA7xx
The clock source selection for the LCD outputs is too hardcoded at the moment. For example, LCD3 is set to use PLL2_1, and PLL2 doesn't exist on DRA72x SoCs. There are quite many ways to configure the clocks, even using HDMI PLL for LCD outputs, but enabling full configuration of the clocks is rather tricky. This patch improves the situation a bit by checking if the PLL about to be used exists, and if not, tries another one. Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
-rw-r--r--drivers/gpu/drm/omapdrm/dss/dpi.c50
1 files changed, 40 insertions, 10 deletions
diff --git a/drivers/gpu/drm/omapdrm/dss/dpi.c b/drivers/gpu/drm/omapdrm/dss/dpi.c
index e0b0c5c24c55..51d90a8a61cd 100644
--- a/drivers/gpu/drm/omapdrm/dss/dpi.c
+++ b/drivers/gpu/drm/omapdrm/dss/dpi.c
@@ -67,6 +67,45 @@ static struct dpi_data *dpi_get_data_from_pdev(struct platform_device *pdev)
67 return dev_get_drvdata(&pdev->dev); 67 return dev_get_drvdata(&pdev->dev);
68} 68}
69 69
70static enum dss_clk_source dpi_get_clk_src_dra7xx(enum omap_channel channel)
71{
72 /*
73 * Possible clock sources:
74 * LCD1: FCK/PLL1_1/HDMI_PLL
75 * LCD2: FCK/PLL1_3/HDMI_PLL (DRA74x: PLL2_3)
76 * LCD3: FCK/PLL1_3/HDMI_PLL (DRA74x: PLL2_1)
77 */
78
79 switch (channel) {
80 case OMAP_DSS_CHANNEL_LCD:
81 {
82 if (dss_pll_find_by_src(DSS_CLK_SRC_PLL1_1))
83 return DSS_CLK_SRC_PLL1_1;
84 break;
85 }
86 case OMAP_DSS_CHANNEL_LCD2:
87 {
88 if (dss_pll_find_by_src(DSS_CLK_SRC_PLL1_3))
89 return DSS_CLK_SRC_PLL1_3;
90 if (dss_pll_find_by_src(DSS_CLK_SRC_PLL2_3))
91 return DSS_CLK_SRC_PLL2_3;
92 break;
93 }
94 case OMAP_DSS_CHANNEL_LCD3:
95 {
96 if (dss_pll_find_by_src(DSS_CLK_SRC_PLL2_1))
97 return DSS_CLK_SRC_PLL2_1;
98 if (dss_pll_find_by_src(DSS_CLK_SRC_PLL1_3))
99 return DSS_CLK_SRC_PLL1_3;
100 break;
101 }
102 default:
103 break;
104 }
105
106 return DSS_CLK_SRC_FCK;
107}
108
70static enum dss_clk_source dpi_get_clk_src(enum omap_channel channel) 109static enum dss_clk_source dpi_get_clk_src(enum omap_channel channel)
71{ 110{
72 /* 111 /*
@@ -107,16 +146,7 @@ static enum dss_clk_source dpi_get_clk_src(enum omap_channel channel)
107 } 146 }
108 147
109 case OMAPDSS_VER_DRA7xx: 148 case OMAPDSS_VER_DRA7xx:
110 switch (channel) { 149 return dpi_get_clk_src_dra7xx(channel);
111 case OMAP_DSS_CHANNEL_LCD:
112 return DSS_CLK_SRC_PLL1_1;
113 case OMAP_DSS_CHANNEL_LCD2:
114 return DSS_CLK_SRC_PLL1_3;
115 case OMAP_DSS_CHANNEL_LCD3:
116 return DSS_CLK_SRC_PLL2_1;
117 default:
118 return DSS_CLK_SRC_FCK;
119 }
120 150
121 default: 151 default:
122 return DSS_CLK_SRC_FCK; 152 return DSS_CLK_SRC_FCK;