From mboxrd@z Thu Jan 1 00:00:00 1970 From: Mike Turquette Date: Tue, 17 Sep 2013 09:38:13 +0000 Subject: Re: [PATCH 02/11] omapdss: HDMI: create a HDMI PLL library Message-Id: <20130917093813.27384.67975@quantum> List-Id: References: <1379401597-27222-1-git-send-email-archit@ti.com> <1379401597-27222-3-git-send-email-archit@ti.com> In-Reply-To: <1379401597-27222-3-git-send-email-archit@ti.com> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: tomi.valkeinen@ti.com Cc: linux-omap@vger.kernel.org, linux-fbdev@vger.kernel.org, Archit Taneja Quoting Archit Taneja (2013-09-17 00:06:28) > HDMI PLL is a block common to DSS in OMAP4, OMAP5 and DRA7x. Move the > existing PLL functions from ti_hdmi_4xxx_ip.c and hdmi.c to a separate file. > These funcs are called directly from the hdmi driver rather than hdmi_ip_ops > function pointer calls. > > Add the PLL library function declarations to ti_hdmi.h. These will be shared > amongst the omap4/5 hdmi platform drivers. Remove the PLL function pointer ops > from the ti_hdmi_ip_ops struct. These will be shared amongst the omap4/5 hdmi > platform drivers and other libraries. > > Signed-off-by: Archit Taneja Would be cool to see this convert to the common clock framework implementation (include/linux/clk-provider.h). It appears that this PLL only needs to support .enable, .disable and .recalc_rate callbacks at first glance. Regards, Mike > --- > drivers/video/omap2/dss/Makefile | 2 +- > drivers/video/omap2/dss/dss_features.c | 3 - > drivers/video/omap2/dss/hdmi.c | 65 ++------ > drivers/video/omap2/dss/hdmi_pll.c | 243 ++++++++++++++++++++++++++++++ > drivers/video/omap2/dss/ti_hdmi.h | 25 +-- > drivers/video/omap2/dss/ti_hdmi_4xxx_ip.c | 132 ---------------- > 6 files changed, 267 insertions(+), 203 deletions(-) > create mode 100644 drivers/video/omap2/dss/hdmi_pll.c > > diff --git a/drivers/video/omap2/dss/Makefile b/drivers/video/omap2/dss/Makefile > index 56ce6bd..5ea65d3 100644 > --- a/drivers/video/omap2/dss/Makefile > +++ b/drivers/video/omap2/dss/Makefile > @@ -10,5 +10,5 @@ omapdss-$(CONFIG_OMAP2_DSS_RFBI) += rfbi.o > omapdss-$(CONFIG_OMAP2_DSS_VENC) += venc.o > omapdss-$(CONFIG_OMAP2_DSS_SDI) += sdi.o > omapdss-$(CONFIG_OMAP2_DSS_DSI) += dsi.o > -omapdss-$(CONFIG_OMAP4_DSS_HDMI) += hdmi.o hdmi_wp.o ti_hdmi_4xxx_ip.o > +omapdss-$(CONFIG_OMAP4_DSS_HDMI) += hdmi.o hdmi_wp.o hdmi_pll.o ti_hdmi_4xxx_ip.o > ccflags-$(CONFIG_OMAP2_DSS_DEBUG) += -DDEBUG > diff --git a/drivers/video/omap2/dss/dss_features.c b/drivers/video/omap2/dss/dss_features.c > index db359e8..9ee92e9 100644 > --- a/drivers/video/omap2/dss/dss_features.c > +++ b/drivers/video/omap2/dss/dss_features.c > @@ -797,10 +797,7 @@ static const struct ti_hdmi_ip_ops omap4_hdmi_functions = { > .phy_enable = ti_hdmi_4xxx_phy_enable, > .phy_disable = ti_hdmi_4xxx_phy_disable, > .read_edid = ti_hdmi_4xxx_read_edid, > - .pll_enable = ti_hdmi_4xxx_pll_enable, > - .pll_disable = ti_hdmi_4xxx_pll_disable, > .dump_core = ti_hdmi_4xxx_core_dump, > - .dump_pll = ti_hdmi_4xxx_pll_dump, > .dump_phy = ti_hdmi_4xxx_phy_dump, > #if defined(CONFIG_OMAP4_DSS_HDMI_AUDIO) > .audio_start = ti_hdmi_4xxx_audio_start, > diff --git a/drivers/video/omap2/dss/hdmi.c b/drivers/video/omap2/dss/hdmi.c > index f2475fc..f6a2eba 100644 > --- a/drivers/video/omap2/dss/hdmi.c > +++ b/drivers/video/omap2/dss/hdmi.c > @@ -42,7 +42,6 @@ > > #define HDMI_CORE_SYS 0x400 > #define HDMI_CORE_AV 0x900 > -#define HDMI_PLLCTRL 0x200 > #define HDMI_PHY 0x300 > > /* HDMI EDID Length move this */ > @@ -53,9 +52,6 @@ > #define EDID_SIZE_BLOCK0_TIMING_DESCRIPTOR 4 > #define EDID_SIZE_BLOCK1_TIMING_DESCRIPTOR 4 > > -#define HDMI_DEFAULT_REGN 16 > -#define HDMI_DEFAULT_REGM2 1 > - > static struct { > struct mutex lock; > struct platform_device *pdev; > @@ -428,52 +424,6 @@ end: return cm; > > } > > -static void hdmi_compute_pll(struct omap_dss_device *dssdev, int phy, > - struct hdmi_pll_info *pi) > -{ > - unsigned long clkin, refclk; > - u32 mf; > - > - clkin = clk_get_rate(hdmi.sys_clk) / 10000; > - /* > - * Input clock is predivided by N + 1 > - * out put of which is reference clk > - */ > - > - pi->regn = HDMI_DEFAULT_REGN; > - > - refclk = clkin / pi->regn; > - > - pi->regm2 = HDMI_DEFAULT_REGM2; > - > - /* > - * multiplier is pixel_clk/ref_clk > - * Multiplying by 100 to avoid fractional part removal > - */ > - pi->regm = phy * pi->regm2 / refclk; > - > - /* > - * fractional multiplier is remainder of the difference between > - * multiplier and actual phy(required pixel clock thus should be > - * multiplied by 2^18(262144) divided by the reference clock > - */ > - mf = (phy - pi->regm / pi->regm2 * refclk) * 262144; > - pi->regmf = pi->regm2 * mf / refclk; > - > - /* > - * Dcofreq should be set to 1 if required pixel clock > - * is greater than 1000MHz > - */ > - pi->dcofreq = phy > 1000 * 100; > - pi->regsd = ((pi->regm * clkin / 10) / (pi->regn * 250) + 5) / 10; > - > - /* Set the reference clock to sysclk reference */ > - pi->refsel = HDMI_REFSEL_SYSCLK; > - > - DSSDBG("M = %d Mf = %d\n", pi->regm, pi->regmf); > - DSSDBG("range = %d sd = %d\n", pi->dcofreq, pi->regsd); > -} > - > static int hdmi_power_on_core(struct omap_dss_device *dssdev) > { > int r; > @@ -526,12 +476,12 @@ static int hdmi_power_on_full(struct omap_dss_device *dssdev) > > phy = p->pixel_clock; > > - hdmi_compute_pll(dssdev, phy, &hdmi.ip_data.pll_data); > + hdmi_pll_compute(&hdmi.ip_data.pll, clk_get_rate(hdmi.sys_clk), phy); > > hdmi_wp_video_stop(&hdmi.ip_data.wp); > > /* config the PLL and PHY hdmi_set_pll_pwrfirst */ > - r = hdmi.ip_data.ops->pll_enable(&hdmi.ip_data); > + r = hdmi_pll_enable(&hdmi.ip_data.pll, &hdmi.ip_data.wp); > if (r) { > DSSDBG("Failed to lock PLL\n"); > goto err_pll_enable; > @@ -566,7 +516,7 @@ err_mgr_enable: > err_vid_enable: > hdmi.ip_data.ops->phy_disable(&hdmi.ip_data); > err_phy_enable: > - hdmi.ip_data.ops->pll_disable(&hdmi.ip_data); > + hdmi_pll_disable(&hdmi.ip_data.pll, &hdmi.ip_data.wp); > err_pll_enable: > hdmi_power_off_core(dssdev); > return -EIO; > @@ -580,7 +530,7 @@ static void hdmi_power_off_full(struct omap_dss_device *dssdev) > > hdmi_wp_video_stop(&hdmi.ip_data.wp); > hdmi.ip_data.ops->phy_disable(&hdmi.ip_data); > - hdmi.ip_data.ops->pll_disable(&hdmi.ip_data); > + hdmi_pll_disable(&hdmi.ip_data.pll, &hdmi.ip_data.wp); > > hdmi_power_off_core(dssdev); > } > @@ -642,7 +592,7 @@ static void hdmi_dump_regs(struct seq_file *s) > } > > hdmi_wp_dump(&hdmi.ip_data.wp, s); > - hdmi.ip_data.ops->dump_pll(&hdmi.ip_data, s); > + hdmi_pll_dump(&hdmi.ip_data.pll, s); > hdmi.ip_data.ops->dump_phy(&hdmi.ip_data, s); > hdmi.ip_data.ops->dump_core(&hdmi.ip_data, s); > > @@ -1095,6 +1045,10 @@ static int omapdss_hdmihw_probe(struct platform_device *pdev) > if (r) > return r; > > + r = hdmi_pll_init(pdev, &hdmi.ip_data.pll); > + if (r) > + return r; > + > hdmi.ip_data.irq = platform_get_irq(pdev, 0); > if (hdmi.ip_data.irq < 0) { > DSSERR("platform_get_irq failed\n"); > @@ -1111,7 +1065,6 @@ static int omapdss_hdmihw_probe(struct platform_device *pdev) > > hdmi.ip_data.core_sys_offset = HDMI_CORE_SYS; > hdmi.ip_data.core_av_offset = HDMI_CORE_AV; > - hdmi.ip_data.pll_offset = HDMI_PLLCTRL; > hdmi.ip_data.phy_offset = HDMI_PHY; > > hdmi_init_output(pdev); > diff --git a/drivers/video/omap2/dss/hdmi_pll.c b/drivers/video/omap2/dss/hdmi_pll.c > new file mode 100644 > index 0000000..d53b8e2 > --- /dev/null > +++ b/drivers/video/omap2/dss/hdmi_pll.c > @@ -0,0 +1,243 @@ > +/* > + * HDMI PLL > + * > + * Copyright (C) 2013 Texas Instruments Incorporated > + * > + * This program is free software; you can redistribute it and/or modify it > + * under the terms of the GNU General Public License version 2 as published by > + * the Free Software Foundation. > + */ > + > +#include > +#include > +#include > +#include > +#include > +#include > +#include