Patchwork [22/48] drm: omapdrm: dss: Pass DSS private structure to runtime PM functions

login
register
mail settings
Submitter Laurent Pinchart
Date Oct. 13, 2017, 2:59 p.m.
Message ID <20171013145944.26557-23-laurent.pinchart@ideasonboard.com>
Download mbox | patch
Permalink /patch/10005003/
State New
Headers show

Comments

Laurent Pinchart - Oct. 13, 2017, 2:59 p.m.
To prepare for the removal of the global variable storing DSS private
data, pass its pointer to the dss_runtime_{get,put}() functions.

As this requires getting hold of the DSS private structure in the
callers, we expose the structure through an opaque pointer that can be
retrieved through a new dss_device_get() function. The function
currently returns a pointer to the global data structure, and will later
be updated to get the pointer from device driver data when the DSS
private structure will be allocated dynamically.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 drivers/gpu/drm/omapdrm/dss/dsi.c       |  7 +++++--
 drivers/gpu/drm/omapdrm/dss/dss.c       | 37 ++++++++++++++++++++-------------
 drivers/gpu/drm/omapdrm/dss/dss.h       | 13 ++++++++----
 drivers/gpu/drm/omapdrm/dss/hdmi.h      |  6 ++++--
 drivers/gpu/drm/omapdrm/dss/hdmi4.c     |  3 ++-
 drivers/gpu/drm/omapdrm/dss/hdmi5.c     |  3 ++-
 drivers/gpu/drm/omapdrm/dss/hdmi_pll.c  | 10 +++++----
 drivers/gpu/drm/omapdrm/dss/video-pll.c | 12 ++++++-----
 8 files changed, 58 insertions(+), 33 deletions(-)
Sebastian Reichel - Oct. 16, 2017, 8:39 a.m.
Hi,

On Fri, Oct 13, 2017 at 05:59:18PM +0300, Laurent Pinchart wrote:
> To prepare for the removal of the global variable storing DSS private
> data, pass its pointer to the dss_runtime_{get,put}() functions.
> 
> As this requires getting hold of the DSS private structure in the
> callers, we expose the structure through an opaque pointer that can be
> retrieved through a new dss_device_get() function. The function
> currently returns a pointer to the global data structure, and will later
> be updated to get the pointer from device driver data when the DSS
> private structure will be allocated dynamically.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

Reviewed-by: Sebastian Reichel <sebastian.reichel@collabora.co.uk>

-- Sebastian

>  drivers/gpu/drm/omapdrm/dss/dsi.c       |  7 +++++--
>  drivers/gpu/drm/omapdrm/dss/dss.c       | 37 ++++++++++++++++++++-------------
>  drivers/gpu/drm/omapdrm/dss/dss.h       | 13 ++++++++----
>  drivers/gpu/drm/omapdrm/dss/hdmi.h      |  6 ++++--
>  drivers/gpu/drm/omapdrm/dss/hdmi4.c     |  3 ++-
>  drivers/gpu/drm/omapdrm/dss/hdmi5.c     |  3 ++-
>  drivers/gpu/drm/omapdrm/dss/hdmi_pll.c  | 10 +++++----
>  drivers/gpu/drm/omapdrm/dss/video-pll.c | 12 ++++++-----
>  8 files changed, 58 insertions(+), 33 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/dss/dsi.c b/drivers/gpu/drm/omapdrm/dss/dsi.c
> index a64e6a39ebf1..1dab308c9bc1 100644
> --- a/drivers/gpu/drm/omapdrm/dss/dsi.c
> +++ b/drivers/gpu/drm/omapdrm/dss/dsi.c
> @@ -5333,7 +5333,8 @@ static const struct dss_pll_hw dss_omap5_dsi_pll_hw = {
>  	.has_refsel = true,
>  };
>  
> -static int dsi_init_pll_data(struct platform_device *dsidev)
> +static int dsi_init_pll_data(struct dss_device *dss,
> +			     struct platform_device *dsidev)
>  {
>  	struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev);
>  	struct dss_pll *pll = &dsi->pll;
> @@ -5352,6 +5353,7 @@ static int dsi_init_pll_data(struct platform_device *dsidev)
>  	pll->base = dsi->pll_base;
>  	pll->hw = dsi->data->pll_hw;
>  	pll->ops = &dsi_pll_ops;
> +	pll->dss = dss;
>  
>  	r = dss_pll_register(pll);
>  	if (r)
> @@ -5428,6 +5430,7 @@ static const struct soc_device_attribute dsi_soc_devices[] = {
>  static int dsi_bind(struct device *dev, struct device *master, void *data)
>  {
>  	struct platform_device *dsidev = to_platform_device(dev);
> +	struct dss_device *dss = dss_get_device(master);
>  	const struct soc_device_attribute *soc;
>  	const struct dsi_module_id_data *d;
>  	u32 rev;
> @@ -5538,7 +5541,7 @@ static int dsi_bind(struct device *dev, struct device *master, void *data)
>  	if (r)
>  		return r;
>  
> -	dsi_init_pll_data(dsidev);
> +	dsi_init_pll_data(dss, dsidev);
>  
>  	pm_runtime_enable(&dsidev->dev);
>  
> diff --git a/drivers/gpu/drm/omapdrm/dss/dss.c b/drivers/gpu/drm/omapdrm/dss/dss.c
> index b45641f6a844..a83277ebe1ef 100644
> --- a/drivers/gpu/drm/omapdrm/dss/dss.c
> +++ b/drivers/gpu/drm/omapdrm/dss/dss.c
> @@ -93,7 +93,7 @@ struct dss_features {
>  	bool has_lcd_clk_src;
>  };
>  
> -static struct {
> +struct dss_device {
>  	struct platform_device *pdev;
>  	struct omap_drm_private drm;
>  
> @@ -125,7 +125,9 @@ static struct {
>  
>  	struct dss_pll	*video1_pll;
>  	struct dss_pll	*video2_pll;
> -} dss;
> +};
> +
> +static struct dss_device dss;
>  
>  static const char * const dss_generic_clk_source_names[] = {
>  	[DSS_CLK_SRC_FCK]	= "FCK",
> @@ -382,7 +384,7 @@ static void dss_dump_clocks(struct seq_file *s)
>  	const char *fclk_name;
>  	unsigned long fclk_rate;
>  
> -	if (dss_runtime_get())
> +	if (dss_runtime_get(&dss))
>  		return;
>  
>  	seq_printf(s, "- DSS -\n");
> @@ -394,7 +396,7 @@ static void dss_dump_clocks(struct seq_file *s)
>  			fclk_name,
>  			fclk_rate);
>  
> -	dss_runtime_put();
> +	dss_runtime_put(&dss);
>  }
>  #endif
>  
> @@ -402,7 +404,7 @@ static int dss_dump_regs(struct seq_file *s, void *p)
>  {
>  #define DUMPREG(r) seq_printf(s, "%-35s %08x\n", #r, dss_read_reg(r))
>  
> -	if (dss_runtime_get())
> +	if (dss_runtime_get(&dss))
>  		return 0;
>  
>  	DUMPREG(DSS_REVISION);
> @@ -416,7 +418,7 @@ static int dss_dump_regs(struct seq_file *s, void *p)
>  		DUMPREG(DSS_SDI_STATUS);
>  	}
>  
> -	dss_runtime_put();
> +	dss_runtime_put(&dss);
>  #undef DUMPREG
>  	return 0;
>  }
> @@ -889,27 +891,32 @@ static void dss_put_clocks(void)
>  		clk_put(dss.parent_clk);
>  }
>  
> -int dss_runtime_get(void)
> +int dss_runtime_get(struct dss_device *dss)
>  {
>  	int r;
>  
>  	DSSDBG("dss_runtime_get\n");
>  
> -	r = pm_runtime_get_sync(&dss.pdev->dev);
> +	r = pm_runtime_get_sync(&dss->pdev->dev);
>  	WARN_ON(r < 0);
>  	return r < 0 ? r : 0;
>  }
>  
> -void dss_runtime_put(void)
> +void dss_runtime_put(struct dss_device *dss)
>  {
>  	int r;
>  
>  	DSSDBG("dss_runtime_put\n");
>  
> -	r = pm_runtime_put_sync(&dss.pdev->dev);
> +	r = pm_runtime_put_sync(&dss->pdev->dev);
>  	WARN_ON(r < 0 && r != -ENOSYS && r != -EBUSY);
>  }
>  
> +struct dss_device *dss_get_device(struct device *dev)
> +{
> +	return &dss;
> +}
> +
>  /* DEBUGFS */
>  #if defined(CONFIG_OMAP2_DSS_DEBUGFS)
>  static int dss_debug_dump_clocks(struct seq_file *s, void *p)
> @@ -1297,13 +1304,15 @@ static int dss_video_pll_probe(struct platform_device *pdev)
>  	}
>  
>  	if (of_property_match_string(np, "reg-names", "pll1") >= 0) {
> -		dss.video1_pll = dss_video_pll_init(pdev, 0, pll_regulator);
> +		dss.video1_pll = dss_video_pll_init(&dss, pdev, 0,
> +						    pll_regulator);
>  		if (IS_ERR(dss.video1_pll))
>  			return PTR_ERR(dss.video1_pll);
>  	}
>  
>  	if (of_property_match_string(np, "reg-names", "pll2") >= 0) {
> -		dss.video2_pll = dss_video_pll_init(pdev, 1, pll_regulator);
> +		dss.video2_pll = dss_video_pll_init(&dss, pdev, 1,
> +						    pll_regulator);
>  		if (IS_ERR(dss.video2_pll)) {
>  			dss_video_pll_uninit(dss.video1_pll);
>  			return PTR_ERR(dss.video2_pll);
> @@ -1361,7 +1370,7 @@ static int dss_bind(struct device *dev)
>  
>  	pm_runtime_enable(&pdev->dev);
>  
> -	r = dss_runtime_get();
> +	r = dss_runtime_get(&dss);
>  	if (r)
>  		goto err_runtime_get;
>  
> @@ -1386,7 +1395,7 @@ static int dss_bind(struct device *dev)
>  	rev = dss_read_reg(DSS_REVISION);
>  	pr_info("OMAP DSS rev %d.%d\n", FLD_GET(rev, 7, 4), FLD_GET(rev, 3, 0));
>  
> -	dss_runtime_put();
> +	dss_runtime_put(&dss);
>  
>  	r = component_bind_all(&pdev->dev, NULL);
>  	if (r)
> diff --git a/drivers/gpu/drm/omapdrm/dss/dss.h b/drivers/gpu/drm/omapdrm/dss/dss.h
> index e688e937da28..009b7ef200cd 100644
> --- a/drivers/gpu/drm/omapdrm/dss/dss.h
> +++ b/drivers/gpu/drm/omapdrm/dss/dss.h
> @@ -29,6 +29,7 @@
>  
>  struct dentry;
>  struct dss_debugfs_entry;
> +struct dss_device;
>  struct platform_device;
>  struct seq_file;
>  
> @@ -198,6 +199,7 @@ struct dss_pll_hw {
>  struct dss_pll {
>  	const char *name;
>  	enum dss_pll_id id;
> +	struct dss_device *dss;
>  
>  	struct clk *clkin;
>  	struct regulator *regulator;
> @@ -277,8 +279,10 @@ static inline void dss_debugfs_remove_file(struct dss_debugfs_entry *entry)
>  int dss_init_platform_driver(void) __init;
>  void dss_uninit_platform_driver(void);
>  
> -int dss_runtime_get(void);
> -void dss_runtime_put(void);
> +struct dss_device *dss_get_device(struct device *dev);
> +
> +int dss_runtime_get(struct dss_device *dss);
> +void dss_runtime_put(struct dss_device *dss);
>  
>  unsigned long dss_get_dispc_clk_rate(void);
>  unsigned long dss_get_max_fck_rate(void);
> @@ -289,8 +293,9 @@ enum dss_hdmi_venc_clk_source_select dss_get_hdmi_venc_clk_source(void);
>  const char *dss_get_clk_source_name(enum dss_clk_source clk_src);
>  
>  /* DSS VIDEO PLL */
> -struct dss_pll *dss_video_pll_init(struct platform_device *pdev, int id,
> -	struct regulator *regulator);
> +struct dss_pll *dss_video_pll_init(struct dss_device *dss,
> +				   struct platform_device *pdev, int id,
> +				   struct regulator *regulator);
>  void dss_video_pll_uninit(struct dss_pll *pll);
>  
>  void dss_ctrl_pll_enable(enum dss_pll_id pll_id, bool enable);
> diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi.h b/drivers/gpu/drm/omapdrm/dss/hdmi.h
> index a66f8ff06c24..4dbc4f3d728c 100644
> --- a/drivers/gpu/drm/omapdrm/dss/hdmi.h
> +++ b/drivers/gpu/drm/omapdrm/dss/hdmi.h
> @@ -29,6 +29,8 @@
>  #include "omapdss.h"
>  #include "dss.h"
>  
> +struct dss_device;
> +
>  /* HDMI Wrapper */
>  
>  #define HDMI_WP_REVISION			0x0
> @@ -324,8 +326,8 @@ phys_addr_t hdmi_wp_get_audio_dma_addr(struct hdmi_wp_data *wp);
>  
>  /* HDMI PLL funcs */
>  void hdmi_pll_dump(struct hdmi_pll_data *pll, struct seq_file *s);
> -int hdmi_pll_init(struct platform_device *pdev, struct hdmi_pll_data *pll,
> -	struct hdmi_wp_data *wp);
> +int hdmi_pll_init(struct dss_device *dss, struct platform_device *pdev,
> +		  struct hdmi_pll_data *pll, struct hdmi_wp_data *wp);
>  void hdmi_pll_uninit(struct hdmi_pll_data *hpll);
>  
>  /* HDMI PHY funcs */
> diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi4.c b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
> index ada4e3a9dba7..d84eba8440c8 100644
> --- a/drivers/gpu/drm/omapdrm/dss/hdmi4.c
> +++ b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
> @@ -717,6 +717,7 @@ static int hdmi_audio_register(struct device *dev)
>  static int hdmi4_bind(struct device *dev, struct device *master, void *data)
>  {
>  	struct platform_device *pdev = to_platform_device(dev);
> +	struct dss_device *dss = dss_get_device(master);
>  	int r;
>  	int irq;
>  
> @@ -734,7 +735,7 @@ static int hdmi4_bind(struct device *dev, struct device *master, void *data)
>  	if (r)
>  		return r;
>  
> -	r = hdmi_pll_init(pdev, &hdmi.pll, &hdmi.wp);
> +	r = hdmi_pll_init(dss, pdev, &hdmi.pll, &hdmi.wp);
>  	if (r)
>  		return r;
>  
> diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi5.c b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
> index 00ea975b75f9..64cfed89c79b 100644
> --- a/drivers/gpu/drm/omapdrm/dss/hdmi5.c
> +++ b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
> @@ -719,6 +719,7 @@ static int hdmi_audio_register(struct device *dev)
>  static int hdmi5_bind(struct device *dev, struct device *master, void *data)
>  {
>  	struct platform_device *pdev = to_platform_device(dev);
> +	struct dss_device *dss = dss_get_device(master);
>  	int r;
>  	int irq;
>  
> @@ -736,7 +737,7 @@ static int hdmi5_bind(struct device *dev, struct device *master, void *data)
>  	if (r)
>  		return r;
>  
> -	r = hdmi_pll_init(pdev, &hdmi.pll, &hdmi.wp);
> +	r = hdmi_pll_init(dss, pdev, &hdmi.pll, &hdmi.wp);
>  	if (r)
>  		return r;
>  
> diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi_pll.c b/drivers/gpu/drm/omapdrm/dss/hdmi_pll.c
> index 55bee81f4dd5..9915354b66c9 100644
> --- a/drivers/gpu/drm/omapdrm/dss/hdmi_pll.c
> +++ b/drivers/gpu/drm/omapdrm/dss/hdmi_pll.c
> @@ -128,7 +128,8 @@ static const struct dss_pll_hw dss_omap5_hdmi_pll_hw = {
>  	.has_refsel = true,
>  };
>  
> -static int hdmi_init_pll_data(struct platform_device *pdev,
> +static int hdmi_init_pll_data(struct dss_device *dss,
> +			      struct platform_device *pdev,
>  			      struct hdmi_pll_data *hpll)
>  {
>  	struct dss_pll *pll = &hpll->pll;
> @@ -145,6 +146,7 @@ static int hdmi_init_pll_data(struct platform_device *pdev,
>  	pll->id = DSS_PLL_HDMI;
>  	pll->base = hpll->base;
>  	pll->clkin = clk;
> +	pll->dss = dss;
>  
>  	if (hpll->wp->version == 4)
>  		pll->hw = &dss_omap4_hdmi_pll_hw;
> @@ -160,8 +162,8 @@ static int hdmi_init_pll_data(struct platform_device *pdev,
>  	return 0;
>  }
>  
> -int hdmi_pll_init(struct platform_device *pdev, struct hdmi_pll_data *pll,
> -	struct hdmi_wp_data *wp)
> +int hdmi_pll_init(struct dss_device *dss, struct platform_device *pdev,
> +		  struct hdmi_pll_data *pll, struct hdmi_wp_data *wp)
>  {
>  	int r;
>  	struct resource *res;
> @@ -174,7 +176,7 @@ int hdmi_pll_init(struct platform_device *pdev, struct hdmi_pll_data *pll,
>  	if (IS_ERR(pll->base))
>  		return PTR_ERR(pll->base);
>  
> -	r = hdmi_init_pll_data(pdev, pll);
> +	r = hdmi_init_pll_data(dss, pdev, pll);
>  	if (r) {
>  		DSSERR("failed to init HDMI PLL\n");
>  		return r;
> diff --git a/drivers/gpu/drm/omapdrm/dss/video-pll.c b/drivers/gpu/drm/omapdrm/dss/video-pll.c
> index 38a239cc5e04..7ef30f61c52b 100644
> --- a/drivers/gpu/drm/omapdrm/dss/video-pll.c
> +++ b/drivers/gpu/drm/omapdrm/dss/video-pll.c
> @@ -62,7 +62,7 @@ static int dss_video_pll_enable(struct dss_pll *pll)
>  	struct dss_video_pll *vpll = container_of(pll, struct dss_video_pll, pll);
>  	int r;
>  
> -	r = dss_runtime_get();
> +	r = dss_runtime_get(pll->dss);
>  	if (r)
>  		return r;
>  
> @@ -81,7 +81,7 @@ static int dss_video_pll_enable(struct dss_pll *pll)
>  err_reset:
>  	dss_dpll_disable_scp_clk(vpll);
>  	dss_ctrl_pll_enable(pll->id, false);
> -	dss_runtime_put();
> +	dss_runtime_put(pll->dss);
>  
>  	return r;
>  }
> @@ -96,7 +96,7 @@ static void dss_video_pll_disable(struct dss_pll *pll)
>  
>  	dss_ctrl_pll_enable(pll->id, false);
>  
> -	dss_runtime_put();
> +	dss_runtime_put(pll->dss);
>  }
>  
>  static const struct dss_pll_ops dss_pll_ops = {
> @@ -134,8 +134,9 @@ static const struct dss_pll_hw dss_dra7_video_pll_hw = {
>  	.errata_i886 = true,
>  };
>  
> -struct dss_pll *dss_video_pll_init(struct platform_device *pdev, int id,
> -	struct regulator *regulator)
> +struct dss_pll *dss_video_pll_init(struct dss_device *dss,
> +				   struct platform_device *pdev, int id,
> +				   struct regulator *regulator)
>  {
>  	const char * const reg_name[] = { "pll1", "pll2" };
>  	const char * const clkctrl_name[] = { "pll1_clkctrl", "pll2_clkctrl" };
> @@ -187,6 +188,7 @@ struct dss_pll *dss_video_pll_init(struct platform_device *pdev, int id,
>  	pll->base = pll_base;
>  	pll->hw = &dss_dra7_video_pll_hw;
>  	pll->ops = &dss_pll_ops;
> +	pll->dss = dss;
>  
>  	r = dss_pll_register(pll);
>  	if (r)
> -- 
> Regards,
> 
> Laurent Pinchart
> 
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel

Patch

diff --git a/drivers/gpu/drm/omapdrm/dss/dsi.c b/drivers/gpu/drm/omapdrm/dss/dsi.c
index a64e6a39ebf1..1dab308c9bc1 100644
--- a/drivers/gpu/drm/omapdrm/dss/dsi.c
+++ b/drivers/gpu/drm/omapdrm/dss/dsi.c
@@ -5333,7 +5333,8 @@  static const struct dss_pll_hw dss_omap5_dsi_pll_hw = {
 	.has_refsel = true,
 };
 
-static int dsi_init_pll_data(struct platform_device *dsidev)
+static int dsi_init_pll_data(struct dss_device *dss,
+			     struct platform_device *dsidev)
 {
 	struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev);
 	struct dss_pll *pll = &dsi->pll;
@@ -5352,6 +5353,7 @@  static int dsi_init_pll_data(struct platform_device *dsidev)
 	pll->base = dsi->pll_base;
 	pll->hw = dsi->data->pll_hw;
 	pll->ops = &dsi_pll_ops;
+	pll->dss = dss;
 
 	r = dss_pll_register(pll);
 	if (r)
@@ -5428,6 +5430,7 @@  static const struct soc_device_attribute dsi_soc_devices[] = {
 static int dsi_bind(struct device *dev, struct device *master, void *data)
 {
 	struct platform_device *dsidev = to_platform_device(dev);
+	struct dss_device *dss = dss_get_device(master);
 	const struct soc_device_attribute *soc;
 	const struct dsi_module_id_data *d;
 	u32 rev;
@@ -5538,7 +5541,7 @@  static int dsi_bind(struct device *dev, struct device *master, void *data)
 	if (r)
 		return r;
 
-	dsi_init_pll_data(dsidev);
+	dsi_init_pll_data(dss, dsidev);
 
 	pm_runtime_enable(&dsidev->dev);
 
diff --git a/drivers/gpu/drm/omapdrm/dss/dss.c b/drivers/gpu/drm/omapdrm/dss/dss.c
index b45641f6a844..a83277ebe1ef 100644
--- a/drivers/gpu/drm/omapdrm/dss/dss.c
+++ b/drivers/gpu/drm/omapdrm/dss/dss.c
@@ -93,7 +93,7 @@  struct dss_features {
 	bool has_lcd_clk_src;
 };
 
-static struct {
+struct dss_device {
 	struct platform_device *pdev;
 	struct omap_drm_private drm;
 
@@ -125,7 +125,9 @@  static struct {
 
 	struct dss_pll	*video1_pll;
 	struct dss_pll	*video2_pll;
-} dss;
+};
+
+static struct dss_device dss;
 
 static const char * const dss_generic_clk_source_names[] = {
 	[DSS_CLK_SRC_FCK]	= "FCK",
@@ -382,7 +384,7 @@  static void dss_dump_clocks(struct seq_file *s)
 	const char *fclk_name;
 	unsigned long fclk_rate;
 
-	if (dss_runtime_get())
+	if (dss_runtime_get(&dss))
 		return;
 
 	seq_printf(s, "- DSS -\n");
@@ -394,7 +396,7 @@  static void dss_dump_clocks(struct seq_file *s)
 			fclk_name,
 			fclk_rate);
 
-	dss_runtime_put();
+	dss_runtime_put(&dss);
 }
 #endif
 
@@ -402,7 +404,7 @@  static int dss_dump_regs(struct seq_file *s, void *p)
 {
 #define DUMPREG(r) seq_printf(s, "%-35s %08x\n", #r, dss_read_reg(r))
 
-	if (dss_runtime_get())
+	if (dss_runtime_get(&dss))
 		return 0;
 
 	DUMPREG(DSS_REVISION);
@@ -416,7 +418,7 @@  static int dss_dump_regs(struct seq_file *s, void *p)
 		DUMPREG(DSS_SDI_STATUS);
 	}
 
-	dss_runtime_put();
+	dss_runtime_put(&dss);
 #undef DUMPREG
 	return 0;
 }
@@ -889,27 +891,32 @@  static void dss_put_clocks(void)
 		clk_put(dss.parent_clk);
 }
 
-int dss_runtime_get(void)
+int dss_runtime_get(struct dss_device *dss)
 {
 	int r;
 
 	DSSDBG("dss_runtime_get\n");
 
-	r = pm_runtime_get_sync(&dss.pdev->dev);
+	r = pm_runtime_get_sync(&dss->pdev->dev);
 	WARN_ON(r < 0);
 	return r < 0 ? r : 0;
 }
 
-void dss_runtime_put(void)
+void dss_runtime_put(struct dss_device *dss)
 {
 	int r;
 
 	DSSDBG("dss_runtime_put\n");
 
-	r = pm_runtime_put_sync(&dss.pdev->dev);
+	r = pm_runtime_put_sync(&dss->pdev->dev);
 	WARN_ON(r < 0 && r != -ENOSYS && r != -EBUSY);
 }
 
+struct dss_device *dss_get_device(struct device *dev)
+{
+	return &dss;
+}
+
 /* DEBUGFS */
 #if defined(CONFIG_OMAP2_DSS_DEBUGFS)
 static int dss_debug_dump_clocks(struct seq_file *s, void *p)
@@ -1297,13 +1304,15 @@  static int dss_video_pll_probe(struct platform_device *pdev)
 	}
 
 	if (of_property_match_string(np, "reg-names", "pll1") >= 0) {
-		dss.video1_pll = dss_video_pll_init(pdev, 0, pll_regulator);
+		dss.video1_pll = dss_video_pll_init(&dss, pdev, 0,
+						    pll_regulator);
 		if (IS_ERR(dss.video1_pll))
 			return PTR_ERR(dss.video1_pll);
 	}
 
 	if (of_property_match_string(np, "reg-names", "pll2") >= 0) {
-		dss.video2_pll = dss_video_pll_init(pdev, 1, pll_regulator);
+		dss.video2_pll = dss_video_pll_init(&dss, pdev, 1,
+						    pll_regulator);
 		if (IS_ERR(dss.video2_pll)) {
 			dss_video_pll_uninit(dss.video1_pll);
 			return PTR_ERR(dss.video2_pll);
@@ -1361,7 +1370,7 @@  static int dss_bind(struct device *dev)
 
 	pm_runtime_enable(&pdev->dev);
 
-	r = dss_runtime_get();
+	r = dss_runtime_get(&dss);
 	if (r)
 		goto err_runtime_get;
 
@@ -1386,7 +1395,7 @@  static int dss_bind(struct device *dev)
 	rev = dss_read_reg(DSS_REVISION);
 	pr_info("OMAP DSS rev %d.%d\n", FLD_GET(rev, 7, 4), FLD_GET(rev, 3, 0));
 
-	dss_runtime_put();
+	dss_runtime_put(&dss);
 
 	r = component_bind_all(&pdev->dev, NULL);
 	if (r)
diff --git a/drivers/gpu/drm/omapdrm/dss/dss.h b/drivers/gpu/drm/omapdrm/dss/dss.h
index e688e937da28..009b7ef200cd 100644
--- a/drivers/gpu/drm/omapdrm/dss/dss.h
+++ b/drivers/gpu/drm/omapdrm/dss/dss.h
@@ -29,6 +29,7 @@ 
 
 struct dentry;
 struct dss_debugfs_entry;
+struct dss_device;
 struct platform_device;
 struct seq_file;
 
@@ -198,6 +199,7 @@  struct dss_pll_hw {
 struct dss_pll {
 	const char *name;
 	enum dss_pll_id id;
+	struct dss_device *dss;
 
 	struct clk *clkin;
 	struct regulator *regulator;
@@ -277,8 +279,10 @@  static inline void dss_debugfs_remove_file(struct dss_debugfs_entry *entry)
 int dss_init_platform_driver(void) __init;
 void dss_uninit_platform_driver(void);
 
-int dss_runtime_get(void);
-void dss_runtime_put(void);
+struct dss_device *dss_get_device(struct device *dev);
+
+int dss_runtime_get(struct dss_device *dss);
+void dss_runtime_put(struct dss_device *dss);
 
 unsigned long dss_get_dispc_clk_rate(void);
 unsigned long dss_get_max_fck_rate(void);
@@ -289,8 +293,9 @@  enum dss_hdmi_venc_clk_source_select dss_get_hdmi_venc_clk_source(void);
 const char *dss_get_clk_source_name(enum dss_clk_source clk_src);
 
 /* DSS VIDEO PLL */
-struct dss_pll *dss_video_pll_init(struct platform_device *pdev, int id,
-	struct regulator *regulator);
+struct dss_pll *dss_video_pll_init(struct dss_device *dss,
+				   struct platform_device *pdev, int id,
+				   struct regulator *regulator);
 void dss_video_pll_uninit(struct dss_pll *pll);
 
 void dss_ctrl_pll_enable(enum dss_pll_id pll_id, bool enable);
diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi.h b/drivers/gpu/drm/omapdrm/dss/hdmi.h
index a66f8ff06c24..4dbc4f3d728c 100644
--- a/drivers/gpu/drm/omapdrm/dss/hdmi.h
+++ b/drivers/gpu/drm/omapdrm/dss/hdmi.h
@@ -29,6 +29,8 @@ 
 #include "omapdss.h"
 #include "dss.h"
 
+struct dss_device;
+
 /* HDMI Wrapper */
 
 #define HDMI_WP_REVISION			0x0
@@ -324,8 +326,8 @@  phys_addr_t hdmi_wp_get_audio_dma_addr(struct hdmi_wp_data *wp);
 
 /* HDMI PLL funcs */
 void hdmi_pll_dump(struct hdmi_pll_data *pll, struct seq_file *s);
-int hdmi_pll_init(struct platform_device *pdev, struct hdmi_pll_data *pll,
-	struct hdmi_wp_data *wp);
+int hdmi_pll_init(struct dss_device *dss, struct platform_device *pdev,
+		  struct hdmi_pll_data *pll, struct hdmi_wp_data *wp);
 void hdmi_pll_uninit(struct hdmi_pll_data *hpll);
 
 /* HDMI PHY funcs */
diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi4.c b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
index ada4e3a9dba7..d84eba8440c8 100644
--- a/drivers/gpu/drm/omapdrm/dss/hdmi4.c
+++ b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
@@ -717,6 +717,7 @@  static int hdmi_audio_register(struct device *dev)
 static int hdmi4_bind(struct device *dev, struct device *master, void *data)
 {
 	struct platform_device *pdev = to_platform_device(dev);
+	struct dss_device *dss = dss_get_device(master);
 	int r;
 	int irq;
 
@@ -734,7 +735,7 @@  static int hdmi4_bind(struct device *dev, struct device *master, void *data)
 	if (r)
 		return r;
 
-	r = hdmi_pll_init(pdev, &hdmi.pll, &hdmi.wp);
+	r = hdmi_pll_init(dss, pdev, &hdmi.pll, &hdmi.wp);
 	if (r)
 		return r;
 
diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi5.c b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
index 00ea975b75f9..64cfed89c79b 100644
--- a/drivers/gpu/drm/omapdrm/dss/hdmi5.c
+++ b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
@@ -719,6 +719,7 @@  static int hdmi_audio_register(struct device *dev)
 static int hdmi5_bind(struct device *dev, struct device *master, void *data)
 {
 	struct platform_device *pdev = to_platform_device(dev);
+	struct dss_device *dss = dss_get_device(master);
 	int r;
 	int irq;
 
@@ -736,7 +737,7 @@  static int hdmi5_bind(struct device *dev, struct device *master, void *data)
 	if (r)
 		return r;
 
-	r = hdmi_pll_init(pdev, &hdmi.pll, &hdmi.wp);
+	r = hdmi_pll_init(dss, pdev, &hdmi.pll, &hdmi.wp);
 	if (r)
 		return r;
 
diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi_pll.c b/drivers/gpu/drm/omapdrm/dss/hdmi_pll.c
index 55bee81f4dd5..9915354b66c9 100644
--- a/drivers/gpu/drm/omapdrm/dss/hdmi_pll.c
+++ b/drivers/gpu/drm/omapdrm/dss/hdmi_pll.c
@@ -128,7 +128,8 @@  static const struct dss_pll_hw dss_omap5_hdmi_pll_hw = {
 	.has_refsel = true,
 };
 
-static int hdmi_init_pll_data(struct platform_device *pdev,
+static int hdmi_init_pll_data(struct dss_device *dss,
+			      struct platform_device *pdev,
 			      struct hdmi_pll_data *hpll)
 {
 	struct dss_pll *pll = &hpll->pll;
@@ -145,6 +146,7 @@  static int hdmi_init_pll_data(struct platform_device *pdev,
 	pll->id = DSS_PLL_HDMI;
 	pll->base = hpll->base;
 	pll->clkin = clk;
+	pll->dss = dss;
 
 	if (hpll->wp->version == 4)
 		pll->hw = &dss_omap4_hdmi_pll_hw;
@@ -160,8 +162,8 @@  static int hdmi_init_pll_data(struct platform_device *pdev,
 	return 0;
 }
 
-int hdmi_pll_init(struct platform_device *pdev, struct hdmi_pll_data *pll,
-	struct hdmi_wp_data *wp)
+int hdmi_pll_init(struct dss_device *dss, struct platform_device *pdev,
+		  struct hdmi_pll_data *pll, struct hdmi_wp_data *wp)
 {
 	int r;
 	struct resource *res;
@@ -174,7 +176,7 @@  int hdmi_pll_init(struct platform_device *pdev, struct hdmi_pll_data *pll,
 	if (IS_ERR(pll->base))
 		return PTR_ERR(pll->base);
 
-	r = hdmi_init_pll_data(pdev, pll);
+	r = hdmi_init_pll_data(dss, pdev, pll);
 	if (r) {
 		DSSERR("failed to init HDMI PLL\n");
 		return r;
diff --git a/drivers/gpu/drm/omapdrm/dss/video-pll.c b/drivers/gpu/drm/omapdrm/dss/video-pll.c
index 38a239cc5e04..7ef30f61c52b 100644
--- a/drivers/gpu/drm/omapdrm/dss/video-pll.c
+++ b/drivers/gpu/drm/omapdrm/dss/video-pll.c
@@ -62,7 +62,7 @@  static int dss_video_pll_enable(struct dss_pll *pll)
 	struct dss_video_pll *vpll = container_of(pll, struct dss_video_pll, pll);
 	int r;
 
-	r = dss_runtime_get();
+	r = dss_runtime_get(pll->dss);
 	if (r)
 		return r;
 
@@ -81,7 +81,7 @@  static int dss_video_pll_enable(struct dss_pll *pll)
 err_reset:
 	dss_dpll_disable_scp_clk(vpll);
 	dss_ctrl_pll_enable(pll->id, false);
-	dss_runtime_put();
+	dss_runtime_put(pll->dss);
 
 	return r;
 }
@@ -96,7 +96,7 @@  static void dss_video_pll_disable(struct dss_pll *pll)
 
 	dss_ctrl_pll_enable(pll->id, false);
 
-	dss_runtime_put();
+	dss_runtime_put(pll->dss);
 }
 
 static const struct dss_pll_ops dss_pll_ops = {
@@ -134,8 +134,9 @@  static const struct dss_pll_hw dss_dra7_video_pll_hw = {
 	.errata_i886 = true,
 };
 
-struct dss_pll *dss_video_pll_init(struct platform_device *pdev, int id,
-	struct regulator *regulator)
+struct dss_pll *dss_video_pll_init(struct dss_device *dss,
+				   struct platform_device *pdev, int id,
+				   struct regulator *regulator)
 {
 	const char * const reg_name[] = { "pll1", "pll2" };
 	const char * const clkctrl_name[] = { "pll1_clkctrl", "pll2_clkctrl" };
@@ -187,6 +188,7 @@  struct dss_pll *dss_video_pll_init(struct platform_device *pdev, int id,
 	pll->base = pll_base;
 	pll->hw = &dss_dra7_video_pll_hw;
 	pll->ops = &dss_pll_ops;
+	pll->dss = dss;
 
 	r = dss_pll_register(pll);
 	if (r)