Add two PLL helper functions:

dss_pll_find_by_src() which returns the dss_pll for the given
dss_clk_source.

dss_pll_get_clkout_idx_for_src() which returns the clkout index for the
given dss_clk_source.

Signed-off-by: Tomi Valkeinen <tomi.valkeinen at ti.com>
---
 drivers/gpu/drm/omapdrm/dss/dss.h |  2 ++
 drivers/gpu/drm/omapdrm/dss/pll.c | 53 +++++++++++++++++++++++++++++++++++++++
 2 files changed, 55 insertions(+)

diff --git a/drivers/gpu/drm/omapdrm/dss/dss.h 
b/drivers/gpu/drm/omapdrm/dss/dss.h
index 1ef53bbdddea..57ee26e5d1cd 100644
--- a/drivers/gpu/drm/omapdrm/dss/dss.h
+++ b/drivers/gpu/drm/omapdrm/dss/dss.h
@@ -428,6 +428,8 @@ typedef bool (*dss_hsdiv_calc_func)(int m_dispc, unsigned 
long dispc,
 int dss_pll_register(struct dss_pll *pll);
 void dss_pll_unregister(struct dss_pll *pll);
 struct dss_pll *dss_pll_find(const char *name);
+struct dss_pll *dss_pll_find_by_src(enum dss_clk_source src);
+unsigned dss_pll_get_clkout_idx_for_src(enum dss_clk_source src);
 int dss_pll_enable(struct dss_pll *pll);
 void dss_pll_disable(struct dss_pll *pll);
 int dss_pll_set_config(struct dss_pll *pll,
diff --git a/drivers/gpu/drm/omapdrm/dss/pll.c 
b/drivers/gpu/drm/omapdrm/dss/pll.c
index f974ddcd3b6e..c93233ed3601 100644
--- a/drivers/gpu/drm/omapdrm/dss/pll.c
+++ b/drivers/gpu/drm/omapdrm/dss/pll.c
@@ -76,6 +76,59 @@ struct dss_pll *dss_pll_find(const char *name)
        return NULL;
 }

+struct dss_pll *dss_pll_find_by_src(enum dss_clk_source src)
+{
+       struct dss_pll *pll;
+
+       switch (src) {
+       default:
+       case DSS_CLK_SRC_FCK:
+               return NULL;
+
+       case DSS_CLK_SRC_HDMI_PLL:
+               return dss_pll_find("hdmi");
+
+       case DSS_CLK_SRC_PLL1_1:
+       case DSS_CLK_SRC_PLL1_2:
+       case DSS_CLK_SRC_PLL1_3:
+               pll = dss_pll_find("dsi0");
+               if (!pll)
+                       pll = dss_pll_find("video0");
+               return pll;
+
+       case DSS_CLK_SRC_PLL2_1:
+       case DSS_CLK_SRC_PLL2_2:
+       case DSS_CLK_SRC_PLL2_3:
+               pll = dss_pll_find("dsi1");
+               if (!pll)
+                       pll = dss_pll_find("video1");
+               return pll;
+       }
+}
+
+unsigned dss_pll_get_clkout_idx_for_src(enum dss_clk_source src)
+{
+       switch (src) {
+       case DSS_CLK_SRC_HDMI_PLL:
+               return 0;
+
+       case DSS_CLK_SRC_PLL1_1:
+       case DSS_CLK_SRC_PLL2_1:
+               return 0;
+
+       case DSS_CLK_SRC_PLL1_2:
+       case DSS_CLK_SRC_PLL2_2:
+               return 1;
+
+       case DSS_CLK_SRC_PLL1_3:
+       case DSS_CLK_SRC_PLL2_3:
+               return 2;
+
+       default:
+               return 0;
+       }
+}
+
 int dss_pll_enable(struct dss_pll *pll)
 {
        int r;
-- 
2.5.0

Reply via email to