[PATCH v2 3/4] fbdev: imxfb: Convert to devm_platform_ioremap_resource()

2023-07-10 Thread Yangtao Li
Use devm_platform_ioremap_resource() to simplify code.

Signed-off-by: Yangtao Li 
---
 drivers/video/fbdev/imxfb.c | 7 +--
 1 file changed, 1 insertion(+), 6 deletions(-)

diff --git a/drivers/video/fbdev/imxfb.c b/drivers/video/fbdev/imxfb.c
index 7020b5f6434d..4582ea801121 100644
--- a/drivers/video/fbdev/imxfb.c
+++ b/drivers/video/fbdev/imxfb.c
@@ -869,7 +869,6 @@ static int imxfb_probe(struct platform_device *pdev)
struct imxfb_info *fbi;
struct lcd_device *lcd;
struct fb_info *info;
-   struct resource *res;
struct imx_fb_videomode *m;
const struct of_device_id *of_id;
struct device_node *display_np;
@@ -886,10 +885,6 @@ static int imxfb_probe(struct platform_device *pdev)
if (of_id)
pdev->id_entry = of_id->data;
 
-   res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-   if (!res)
-   return -ENODEV;
-
info = framebuffer_alloc(sizeof(struct imxfb_info), >dev);
if (!info)
return -ENOMEM;
@@ -971,7 +966,7 @@ static int imxfb_probe(struct platform_device *pdev)
goto failed_getclock;
}
 
-   fbi->regs = devm_ioremap_resource(>dev, res);
+   fbi->regs = devm_platform_ioremap_resource(pdev, 0);
if (IS_ERR(fbi->regs)) {
ret = PTR_ERR(fbi->regs);
goto failed_ioremap;
-- 
2.39.0



[PATCH v2 4/4] fbdev: imxfb: remove unneeded lable

2023-07-10 Thread Yangtao Li
These lables are redundant and don't do anything, let's remove it.

Signed-off-by: Yangtao Li 
---
 drivers/video/fbdev/imxfb.c | 23 +--
 1 file changed, 9 insertions(+), 14 deletions(-)

diff --git a/drivers/video/fbdev/imxfb.c b/drivers/video/fbdev/imxfb.c
index 4582ea801121..77dedd2c05fd 100644
--- a/drivers/video/fbdev/imxfb.c
+++ b/drivers/video/fbdev/imxfb.c
@@ -903,7 +903,7 @@ static int imxfb_probe(struct platform_device *pdev)
if (!display_np) {
dev_err(>dev, "No display defined in devicetree\n");
ret = -EINVAL;
-   goto failed_of_parse;
+   goto failed_init;
}
 
/*
@@ -917,13 +917,13 @@ static int imxfb_probe(struct platform_device *pdev)
if (!fbi->mode) {
ret = -ENOMEM;
of_node_put(display_np);
-   goto failed_of_parse;
+   goto failed_init;
}
 
ret = imxfb_of_read_mode(>dev, display_np, fbi->mode);
of_node_put(display_np);
if (ret)
-   goto failed_of_parse;
+   goto failed_init;
 
/* Calculate maximum bytes used per pixel. In most cases this should
 * be the same as m->bpp/8 */
@@ -936,7 +936,7 @@ static int imxfb_probe(struct platform_device *pdev)
fbi->clk_ipg = devm_clk_get(>dev, "ipg");
if (IS_ERR(fbi->clk_ipg)) {
ret = PTR_ERR(fbi->clk_ipg);
-   goto failed_getclock;
+   goto failed_init;
}
 
/*
@@ -951,25 +951,25 @@ static int imxfb_probe(struct platform_device *pdev)
 */
ret = clk_prepare_enable(fbi->clk_ipg);
if (ret)
-   goto failed_getclock;
+   goto failed_init;
clk_disable_unprepare(fbi->clk_ipg);
 
fbi->clk_ahb = devm_clk_get(>dev, "ahb");
if (IS_ERR(fbi->clk_ahb)) {
ret = PTR_ERR(fbi->clk_ahb);
-   goto failed_getclock;
+   goto failed_init;
}
 
fbi->clk_per = devm_clk_get(>dev, "per");
if (IS_ERR(fbi->clk_per)) {
ret = PTR_ERR(fbi->clk_per);
-   goto failed_getclock;
+   goto failed_init;
}
 
fbi->regs = devm_platform_ioremap_resource(pdev, 0);
if (IS_ERR(fbi->regs)) {
ret = PTR_ERR(fbi->regs);
-   goto failed_ioremap;
+   goto failed_init;
}
 
fbi->map_size = PAGE_ALIGN(info->fix.smem_len);
@@ -978,7 +978,7 @@ static int imxfb_probe(struct platform_device *pdev)
if (!info->screen_buffer) {
dev_err(>dev, "Failed to allocate video RAM\n");
ret = -ENOMEM;
-   goto failed_map;
+   goto failed_init;
}
 
info->fix.smem_start = fbi->map_dma;
@@ -1030,16 +1030,11 @@ static int imxfb_probe(struct platform_device *pdev)
 
 failed_lcd:
unregister_framebuffer(info);
-
 failed_register:
fb_dealloc_cmap(>cmap);
 failed_cmap:
dma_free_wc(>dev, fbi->map_size, info->screen_buffer,
fbi->map_dma);
-failed_map:
-failed_ioremap:
-failed_getclock:
-failed_of_parse:
 failed_init:
framebuffer_release(info);
return ret;
-- 
2.39.0



[PATCH v2 1/4] fbdev: imxfb: Removed unneeded release_mem_region

2023-07-10 Thread Yangtao Li
Remove unnecessary release_mem_region from the error path to prevent
mem region from being released twice, which could avoid resource leak
or other unexpected issues.

Fixes: b083c22d5114 ("video: fbdev: imxfb: Convert request_mem_region + ioremap 
to devm_ioremap_resource")
Signed-off-by: Yangtao Li 
---
 drivers/video/fbdev/imxfb.c | 1 -
 1 file changed, 1 deletion(-)

diff --git a/drivers/video/fbdev/imxfb.c b/drivers/video/fbdev/imxfb.c
index 04f3bf30a529..385c4715c7b7 100644
--- a/drivers/video/fbdev/imxfb.c
+++ b/drivers/video/fbdev/imxfb.c
@@ -1043,7 +1043,6 @@ static int imxfb_probe(struct platform_device *pdev)
 failed_map:
 failed_ioremap:
 failed_getclock:
-   release_mem_region(res->start, resource_size(res));
 failed_of_parse:
kfree(info->pseudo_palette);
 failed_init:
-- 
2.39.0



[PATCH v2 2/4] fbdev: imxfb: Convert to devm_kmalloc_array()

2023-07-10 Thread Yangtao Li
No need for manual kfree in the error path and the remove function.

Signed-off-by: Yangtao Li 
---
 drivers/video/fbdev/imxfb.c | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/drivers/video/fbdev/imxfb.c b/drivers/video/fbdev/imxfb.c
index 385c4715c7b7..7020b5f6434d 100644
--- a/drivers/video/fbdev/imxfb.c
+++ b/drivers/video/fbdev/imxfb.c
@@ -673,7 +673,8 @@ static int imxfb_init_fbinfo(struct platform_device *pdev)
 
pr_debug("%s\n",__func__);
 
-   info->pseudo_palette = kmalloc_array(16, sizeof(u32), GFP_KERNEL);
+   info->pseudo_palette = devm_kmalloc_array(>dev, 16,
+ sizeof(u32), GFP_KERNEL);
if (!info->pseudo_palette)
return -ENOMEM;
 
@@ -1044,7 +1045,6 @@ static int imxfb_probe(struct platform_device *pdev)
 failed_ioremap:
 failed_getclock:
 failed_of_parse:
-   kfree(info->pseudo_palette);
 failed_init:
framebuffer_release(info);
return ret;
@@ -1061,7 +1061,6 @@ static void imxfb_remove(struct platform_device *pdev)
fb_dealloc_cmap(>cmap);
dma_free_wc(>dev, fbi->map_size, info->screen_buffer,
fbi->map_dma);
-   kfree(info->pseudo_palette);
framebuffer_release(info);
 }
 
-- 
2.39.0



Re: [PATCH] fbdev: imxfb: Convert to devm_platform_ioremap_resource()

2023-07-10 Thread Yangtao Li

Hi Geert,

On 2023/7/10 15:10, Geert Uytterhoeven wrote:

[你通常不会收到来自 ge...@linux-m68k.org 的电子邮件。请访问 
https://aka.ms/LearnAboutSenderIdentification,以了解这一点为什么很重要]

Hi Yangtao,

On Tue, Jul 4, 2023 at 11:38 AM Yangtao Li  wrote:

Use devm_platform_ioremap_resource() to simplify code.

Signed-off-by: Yangtao Li 

Thanks for your patch, which is now commit c1cd7a7a231a26c6 ("fbdev:
imxfb: Convert to devm_platform_ioremap_resource()") in fbdev/for-next


--- a/drivers/video/fbdev/imxfb.c
+++ b/drivers/video/fbdev/imxfb.c
@@ -868,7 +868,6 @@ static int imxfb_probe(struct platform_device *pdev)
 struct imxfb_info *fbi;
 struct lcd_device *lcd;
 struct fb_info *info;
-   struct resource *res;
 struct imx_fb_videomode *m;
 const struct of_device_id *of_id;
 struct device_node *display_np;
@@ -885,10 +884,6 @@ static int imxfb_probe(struct platform_device *pdev)
 if (of_id)
 pdev->id_entry = of_id->data;

-   res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-   if (!res)
-   return -ENODEV;
-
 info = framebuffer_alloc(sizeof(struct imxfb_info), >dev);
 if (!info)
 return -ENOMEM;
@@ -970,7 +965,7 @@ static int imxfb_probe(struct platform_device *pdev)
 goto failed_getclock;
 }

-   fbi->regs = devm_ioremap_resource(>dev, res);
+   fbi->regs = devm_platform_ioremap_resource(pdev, 0);
 if (IS_ERR(fbi->regs)) {
 ret = PTR_ERR(fbi->regs);
 goto failed_ioremap;
@@ -1043,7 +1038,6 @@ static int imxfb_probe(struct platform_device *pdev)
  failed_map:
  failed_ioremap:
  failed_getclock:
-   release_mem_region(res->start, resource_size(res));

This part is not directly related, but a bug fix for commit
b083c22d51148f3d ("video: fbdev: imxfb: Convert request_mem_region +
ioremap to devm_ioremap_resource") in v6.0.



IIUC, split this patch into two, remove release_mem_region in one and

mark it as Fixes: b083c22d51148f3d ("video: fbdev: imxfb: Convert 
request_mem_region +


ioremap to devm_ioremap_resource")?


MBR,

Yangtao




Please do not mix bug fixes with other changes.
The stable teams want to backport only bugfixes .


  failed_of_parse:
 kfree(info->pseudo_palette);
  failed_init:
--
2.39.0

Gr{oetje,eeting}s,

 Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- ge...@linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
 -- Linus Torvalds


[PATCH v2 19/19] drm/fsl-dcu: Convert to devm_platform_ioremap_resource()

2023-07-09 Thread Yangtao Li
Use devm_platform_ioremap_resource() to simplify code.

Signed-off-by: Yangtao Li 
---
 drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c 
b/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c
index c09ba019ba5e..14661912e60f 100644
--- a/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c
+++ b/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c
@@ -246,7 +246,6 @@ static int fsl_dcu_drm_probe(struct platform_device *pdev)
struct fsl_dcu_drm_device *fsl_dev;
struct drm_device *drm;
struct device *dev = >dev;
-   struct resource *res;
void __iomem *base;
struct clk *pix_clk_in;
char pix_clk_name[32];
@@ -264,8 +263,7 @@ static int fsl_dcu_drm_probe(struct platform_device *pdev)
return -ENODEV;
fsl_dev->soc = id->data;
 
-   res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-   base = devm_ioremap_resource(dev, res);
+   base = devm_platform_ioremap_resource(pdev, 0);
if (IS_ERR(base)) {
ret = PTR_ERR(base);
return ret;
-- 
2.39.0



[PATCH v2 14/19] drm/stm: ltdc: Convert to devm_platform_ioremap_resource()

2023-07-09 Thread Yangtao Li
Use devm_platform_ioremap_resource() to simplify code.

Signed-off-by: Yangtao Li 
Acked-by: Raphaël Gallais-Pou 
---
 drivers/gpu/drm/stm/ltdc.c | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/stm/ltdc.c b/drivers/gpu/drm/stm/ltdc.c
index b8be4c1db423..734dca4d7dd8 100644
--- a/drivers/gpu/drm/stm/ltdc.c
+++ b/drivers/gpu/drm/stm/ltdc.c
@@ -1925,7 +1925,6 @@ int ltdc_load(struct drm_device *ddev)
struct drm_panel *panel;
struct drm_crtc *crtc;
struct reset_control *rstc;
-   struct resource *res;
int irq, i, nb_endpoints;
int ret = -ENODEV;
 
@@ -1992,8 +1991,7 @@ int ltdc_load(struct drm_device *ddev)
reset_control_deassert(rstc);
}
 
-   res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-   ldev->regs = devm_ioremap_resource(dev, res);
+   ldev->regs = devm_platform_ioremap_resource(pdev, 0);
if (IS_ERR(ldev->regs)) {
DRM_ERROR("Unable to get ltdc registers\n");
ret = PTR_ERR(ldev->regs);
-- 
2.39.0



[PATCH v2 18/19] drm/arcpgu: Convert to devm_platform_ioremap_resource()

2023-07-09 Thread Yangtao Li
Use devm_platform_ioremap_resource() to simplify code.

Signed-off-by: Yangtao Li 
Acked-by: Alexey Brodkin 
---
 drivers/gpu/drm/tiny/arcpgu.c | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/tiny/arcpgu.c b/drivers/gpu/drm/tiny/arcpgu.c
index e5b10e41554a..3a5e66d909a4 100644
--- a/drivers/gpu/drm/tiny/arcpgu.c
+++ b/drivers/gpu/drm/tiny/arcpgu.c
@@ -251,7 +251,6 @@ static int arcpgu_load(struct arcpgu_drm_private *arcpgu)
struct device_node *encoder_node = NULL, *endpoint_node = NULL;
struct drm_connector *connector = NULL;
struct drm_device *drm = >drm;
-   struct resource *res;
int ret;
 
arcpgu->clk = devm_clk_get(drm->dev, "pxlclk");
@@ -268,8 +267,7 @@ static int arcpgu_load(struct arcpgu_drm_private *arcpgu)
drm->mode_config.max_height = 1080;
drm->mode_config.funcs = _drm_modecfg_funcs;
 
-   res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-   arcpgu->regs = devm_ioremap_resource(>dev, res);
+   arcpgu->regs = devm_platform_ioremap_resource(pdev, 0);
if (IS_ERR(arcpgu->regs))
return PTR_ERR(arcpgu->regs);
 
-- 
2.39.0



[PATCH v2 15/19] drm/aspeed: Convert to devm_platform_ioremap_resource()

2023-07-09 Thread Yangtao Li
Use devm_platform_ioremap_resource() to simplify code.

Signed-off-by: Yangtao Li 
---
 drivers/gpu/drm/aspeed/aspeed_gfx_drv.c | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/aspeed/aspeed_gfx_drv.c 
b/drivers/gpu/drm/aspeed/aspeed_gfx_drv.c
index c8c7f8215155..d681248f098c 100644
--- a/drivers/gpu/drm/aspeed/aspeed_gfx_drv.c
+++ b/drivers/gpu/drm/aspeed/aspeed_gfx_drv.c
@@ -144,11 +144,9 @@ static int aspeed_gfx_load(struct drm_device *drm)
struct device_node *np = pdev->dev.of_node;
const struct aspeed_gfx_config *config;
const struct of_device_id *match;
-   struct resource *res;
int ret;
 
-   res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-   priv->base = devm_ioremap_resource(drm->dev, res);
+   priv->base = devm_platform_ioremap_resource(pdev, 0);
if (IS_ERR(priv->base))
return PTR_ERR(priv->base);
 
-- 
2.39.0



[PATCH v2 17/19] drm/rockchip: vop: Use devm_platform_get_and_ioremap_resource()

2023-07-09 Thread Yangtao Li
Convert platform_get_resource(), devm_ioremap_resource() to a single
call to devm_platform_get_and_ioremap_resource(), as this is exactly
what this function does.

Signed-off-by: Yangtao Li 
---
 drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c 
b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
index a530ecc4d207..e95d94ce1869 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
@@ -2179,8 +2179,7 @@ static int vop_bind(struct device *dev, struct device 
*master, void *data)
 
vop_win_init(vop);
 
-   res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-   vop->regs = devm_ioremap_resource(dev, res);
+   vop->regs = devm_platform_get_and_ioremap_resource(pdev, 0, );
if (IS_ERR(vop->regs))
return PTR_ERR(vop->regs);
vop->len = resource_size(res);
-- 
2.39.0



[PATCH v2 16/19] drm/tegra: sor: Convert to devm_platform_ioremap_resource()

2023-07-09 Thread Yangtao Li
Use devm_platform_ioremap_resource() to simplify code.

Signed-off-by: Yangtao Li 
---
 drivers/gpu/drm/tegra/sor.c | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/tegra/sor.c b/drivers/gpu/drm/tegra/sor.c
index abd6e3b92293..f23d54626883 100644
--- a/drivers/gpu/drm/tegra/sor.c
+++ b/drivers/gpu/drm/tegra/sor.c
@@ -3708,7 +3708,6 @@ static int tegra_sor_probe(struct platform_device *pdev)
 {
struct device_node *np;
struct tegra_sor *sor;
-   struct resource *regs;
int err;
 
sor = devm_kzalloc(>dev, sizeof(*sor), GFP_KERNEL);
@@ -3781,8 +3780,7 @@ static int tegra_sor_probe(struct platform_device *pdev)
}
}
 
-   regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-   sor->regs = devm_ioremap_resource(>dev, regs);
+   sor->regs = devm_platform_ioremap_resource(pdev, 0);
if (IS_ERR(sor->regs)) {
err = PTR_ERR(sor->regs);
goto remove;
-- 
2.39.0



[PATCH v2 13/19] drm/tegra: dpaux: Fix incorrect return value of platform_get_irq

2023-07-09 Thread Yangtao Li
When platform_get_irq fails, we should return dpaux->irq
instead of -ENXIO.

Fixes: 6b6b604215c6 ("drm/tegra: Add eDP support")
Signed-off-by: Yangtao Li 
---
 drivers/gpu/drm/tegra/dpaux.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/tegra/dpaux.c b/drivers/gpu/drm/tegra/dpaux.c
index 4699def04190..f120897ce4b3 100644
--- a/drivers/gpu/drm/tegra/dpaux.c
+++ b/drivers/gpu/drm/tegra/dpaux.c
@@ -466,7 +466,7 @@ static int tegra_dpaux_probe(struct platform_device *pdev)
 
dpaux->irq = platform_get_irq(pdev, 0);
if (dpaux->irq < 0)
-   return -ENXIO;
+   return dpaux->irq;
 
if (!pdev->dev.pm_domain) {
dpaux->rst = devm_reset_control_get(>dev, "dpaux");
-- 
2.39.0



[PATCH v2 11/19] drm/mxsfb: Convert to devm_platform_ioremap_resource()

2023-07-09 Thread Yangtao Li
Use devm_platform_ioremap_resource() to simplify code.

Signed-off-by: Yangtao Li 
---
 drivers/gpu/drm/mxsfb/mxsfb_drv.c | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/mxsfb/mxsfb_drv.c 
b/drivers/gpu/drm/mxsfb/mxsfb_drv.c
index 368b1fbd8305..c8b3fdb1ab09 100644
--- a/drivers/gpu/drm/mxsfb/mxsfb_drv.c
+++ b/drivers/gpu/drm/mxsfb/mxsfb_drv.c
@@ -213,7 +213,6 @@ static int mxsfb_load(struct drm_device *drm,
 {
struct platform_device *pdev = to_platform_device(drm->dev);
struct mxsfb_drm_private *mxsfb;
-   struct resource *res;
int ret;
 
mxsfb = devm_kzalloc(>dev, sizeof(*mxsfb), GFP_KERNEL);
@@ -224,8 +223,7 @@ static int mxsfb_load(struct drm_device *drm,
drm->dev_private = mxsfb;
mxsfb->devdata = devdata;
 
-   res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-   mxsfb->base = devm_ioremap_resource(drm->dev, res);
+   mxsfb->base = devm_platform_ioremap_resource(pdev, 0);
if (IS_ERR(mxsfb->base))
return PTR_ERR(mxsfb->base);
 
-- 
2.39.0



[PATCH v2 12/19] drm/tegra: dpaux: Convert to devm_platform_ioremap_resource()

2023-07-09 Thread Yangtao Li
Use devm_platform_ioremap_resource() to simplify code.

Signed-off-by: Yangtao Li 
---
 drivers/gpu/drm/tegra/dpaux.c | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/tegra/dpaux.c b/drivers/gpu/drm/tegra/dpaux.c
index 4d2677dcd831..4699def04190 100644
--- a/drivers/gpu/drm/tegra/dpaux.c
+++ b/drivers/gpu/drm/tegra/dpaux.c
@@ -447,7 +447,6 @@ static const struct pinmux_ops tegra_dpaux_pinmux_ops = {
 static int tegra_dpaux_probe(struct platform_device *pdev)
 {
struct tegra_dpaux *dpaux;
-   struct resource *regs;
u32 value;
int err;
 
@@ -461,8 +460,7 @@ static int tegra_dpaux_probe(struct platform_device *pdev)
INIT_LIST_HEAD(>list);
dpaux->dev = >dev;
 
-   regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-   dpaux->regs = devm_ioremap_resource(>dev, regs);
+   dpaux->regs = devm_platform_ioremap_resource(pdev, 0);
if (IS_ERR(dpaux->regs))
return PTR_ERR(dpaux->regs);
 
-- 
2.39.0



[PATCH v2 10/19] drm: lcdif: Convert to devm_platform_ioremap_resource()

2023-07-09 Thread Yangtao Li
Use devm_platform_ioremap_resource() to simplify code.

Signed-off-by: Yangtao Li 
---
 drivers/gpu/drm/mxsfb/lcdif_drv.c | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/mxsfb/lcdif_drv.c 
b/drivers/gpu/drm/mxsfb/lcdif_drv.c
index c9d8cbb21407..a7cdd0eec7a2 100644
--- a/drivers/gpu/drm/mxsfb/lcdif_drv.c
+++ b/drivers/gpu/drm/mxsfb/lcdif_drv.c
@@ -134,7 +134,6 @@ static int lcdif_load(struct drm_device *drm)
 {
struct platform_device *pdev = to_platform_device(drm->dev);
struct lcdif_drm_private *lcdif;
-   struct resource *res;
int ret;
 
lcdif = devm_kzalloc(>dev, sizeof(*lcdif), GFP_KERNEL);
@@ -144,8 +143,7 @@ static int lcdif_load(struct drm_device *drm)
lcdif->drm = drm;
drm->dev_private = lcdif;
 
-   res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-   lcdif->base = devm_ioremap_resource(drm->dev, res);
+   lcdif->base = devm_platform_ioremap_resource(pdev, 0);
if (IS_ERR(lcdif->base))
return PTR_ERR(lcdif->base);
 
-- 
2.39.0



[PATCH v2 09/19] drm/hisilicon: Convert to devm_platform_ioremap_resource()

2023-07-09 Thread Yangtao Li
Use devm_platform_ioremap_resource() to simplify code.

Signed-off-by: Yangtao Li 
---
 drivers/gpu/drm/hisilicon/kirin/dw_drm_dsi.c | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/hisilicon/kirin/dw_drm_dsi.c 
b/drivers/gpu/drm/hisilicon/kirin/dw_drm_dsi.c
index d9978b79828c..ff4ed4639509 100644
--- a/drivers/gpu/drm/hisilicon/kirin/dw_drm_dsi.c
+++ b/drivers/gpu/drm/hisilicon/kirin/dw_drm_dsi.c
@@ -826,7 +826,6 @@ static const struct component_ops dsi_ops = {
 static int dsi_parse_dt(struct platform_device *pdev, struct dw_dsi *dsi)
 {
struct dsi_hw_ctx *ctx = dsi->ctx;
-   struct resource *res;
 
ctx->pclk = devm_clk_get(>dev, "pclk");
if (IS_ERR(ctx->pclk)) {
@@ -834,8 +833,7 @@ static int dsi_parse_dt(struct platform_device *pdev, 
struct dw_dsi *dsi)
return PTR_ERR(ctx->pclk);
}
 
-   res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-   ctx->base = devm_ioremap_resource(>dev, res);
+   ctx->base = devm_platform_ioremap_resource(pdev, 0);
if (IS_ERR(ctx->base)) {
DRM_ERROR("failed to remap dsi io region\n");
return PTR_ERR(ctx->base);
-- 
2.39.0



[PATCH v2 07/19] drm/bridge: analogix_dp: Convert to devm_platform_ioremap_resource()

2023-07-09 Thread Yangtao Li
Use devm_platform_ioremap_resource() to simplify code.

Signed-off-by: Yangtao Li 
Reviewed-by: Neil Armstrong 
---
 drivers/gpu/drm/bridge/analogix/analogix_dp_core.c | 5 +
 1 file changed, 1 insertion(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c 
b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
index df9370e0ff23..c6b228f1ed4c 100644
--- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
+++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
@@ -1686,7 +1686,6 @@ analogix_dp_probe(struct device *dev, struct 
analogix_dp_plat_data *plat_data)
 {
struct platform_device *pdev = to_platform_device(dev);
struct analogix_dp_device *dp;
-   struct resource *res;
unsigned int irq_flags;
int ret;
 
@@ -1740,9 +1739,7 @@ analogix_dp_probe(struct device *dev, struct 
analogix_dp_plat_data *plat_data)
 
clk_prepare_enable(dp->clock);
 
-   res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-
-   dp->reg_base = devm_ioremap_resource(>dev, res);
+   dp->reg_base = devm_platform_ioremap_resource(pdev, 0);
if (IS_ERR(dp->reg_base)) {
ret = PTR_ERR(dp->reg_base);
goto err_disable_clk;
-- 
2.39.0



[PATCH v2 08/19] gpu: ipu-v3: prg: Convert to devm_platform_ioremap_resource()

2023-07-09 Thread Yangtao Li
Use devm_platform_ioremap_resource() to simplify code.

Signed-off-by: Yangtao Li 
Reviewed-by: Philipp Zabel 
---
 drivers/gpu/ipu-v3/ipu-prg.c | 5 +
 1 file changed, 1 insertion(+), 4 deletions(-)

diff --git a/drivers/gpu/ipu-v3/ipu-prg.c b/drivers/gpu/ipu-v3/ipu-prg.c
index 196797c1b4b3..729605709955 100644
--- a/drivers/gpu/ipu-v3/ipu-prg.c
+++ b/drivers/gpu/ipu-v3/ipu-prg.c
@@ -358,7 +358,6 @@ EXPORT_SYMBOL_GPL(ipu_prg_channel_configure_pending);
 static int ipu_prg_probe(struct platform_device *pdev)
 {
struct device *dev = >dev;
-   struct resource *res;
struct ipu_prg *prg;
u32 val;
int i, ret;
@@ -367,12 +366,10 @@ static int ipu_prg_probe(struct platform_device *pdev)
if (!prg)
return -ENOMEM;
 
-   res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-   prg->regs = devm_ioremap_resource(>dev, res);
+   prg->regs = devm_platform_ioremap_resource(pdev, 0);
if (IS_ERR(prg->regs))
return PTR_ERR(prg->regs);
 
-
prg->clk_ipg = devm_clk_get(dev, "ipg");
if (IS_ERR(prg->clk_ipg))
return PTR_ERR(prg->clk_ipg);
-- 
2.39.0



[PATCH v2 06/19] drm: bridge: dw_hdmi: Use devm_platform_get_and_ioremap_resource()

2023-07-09 Thread Yangtao Li
Convert platform_get_resource(), devm_ioremap_resource() to a single
call to devm_platform_get_and_ioremap_resource(), as this is exactly
what this function does.

Signed-off-by: Yangtao Li 
Reviewed-by: Neil Armstrong 
---
 drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c 
b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
index 7b66f362afd8..b2b320ba2196 100644
--- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
+++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
@@ -3417,8 +3417,7 @@ struct dw_hdmi *dw_hdmi_probe(struct platform_device 
*pdev,
return ERR_PTR(-EINVAL);
}
 
-   iores = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-   hdmi->regs = devm_ioremap_resource(dev, iores);
+   hdmi->regs = devm_platform_get_and_ioremap_resource(pdev, 0, 
);
if (IS_ERR(hdmi->regs)) {
ret = PTR_ERR(hdmi->regs);
goto err_res;
-- 
2.39.0



[PATCH v2 05/19] drm/tegra: hdmi: Convert to devm_platform_ioremap_resource()

2023-07-09 Thread Yangtao Li
Use devm_platform_ioremap_resource() to simplify code.

Signed-off-by: Yangtao Li 
---
 drivers/gpu/drm/tegra/hdmi.c | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/tegra/hdmi.c b/drivers/gpu/drm/tegra/hdmi.c
index 6eac54ae1205..f3a44ca87151 100644
--- a/drivers/gpu/drm/tegra/hdmi.c
+++ b/drivers/gpu/drm/tegra/hdmi.c
@@ -1769,7 +1769,6 @@ static irqreturn_t tegra_hdmi_irq(int irq, void *data)
 static int tegra_hdmi_probe(struct platform_device *pdev)
 {
struct tegra_hdmi *hdmi;
-   struct resource *regs;
int err;
 
hdmi = devm_kzalloc(>dev, sizeof(*hdmi), GFP_KERNEL);
@@ -1831,8 +1830,7 @@ static int tegra_hdmi_probe(struct platform_device *pdev)
if (err < 0)
return err;
 
-   regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-   hdmi->regs = devm_ioremap_resource(>dev, regs);
+   hdmi->regs = devm_platform_ioremap_resource(pdev, 0);
if (IS_ERR(hdmi->regs))
return PTR_ERR(hdmi->regs);
 
-- 
2.39.0



[PATCH v2 04/19] drm: kirin: Convert to devm_platform_ioremap_resource()

2023-07-09 Thread Yangtao Li
Use devm_platform_ioremap_resource() to simplify code.

Signed-off-by: Yangtao Li 
---
 drivers/gpu/drm/hisilicon/kirin/kirin_drm_ade.c | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/hisilicon/kirin/kirin_drm_ade.c 
b/drivers/gpu/drm/hisilicon/kirin/kirin_drm_ade.c
index 871f79a6b17e..42ae68c70880 100644
--- a/drivers/gpu/drm/hisilicon/kirin/kirin_drm_ade.c
+++ b/drivers/gpu/drm/hisilicon/kirin/kirin_drm_ade.c
@@ -843,7 +843,6 @@ static struct drm_plane_funcs ade_plane_funcs = {
 static void *ade_hw_ctx_alloc(struct platform_device *pdev,
  struct drm_crtc *crtc)
 {
-   struct resource *res;
struct device *dev = >dev;
struct device_node *np = pdev->dev.of_node;
struct ade_hw_ctx *ctx = NULL;
@@ -855,8 +854,7 @@ static void *ade_hw_ctx_alloc(struct platform_device *pdev,
return ERR_PTR(-ENOMEM);
}
 
-   res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-   ctx->base = devm_ioremap_resource(dev, res);
+   ctx->base = devm_platform_ioremap_resource(pdev, 0);
if (IS_ERR(ctx->base)) {
DRM_ERROR("failed to remap ade io base\n");
return ERR_PTR(-EIO);
-- 
2.39.0



[PATCH v2 02/19] gpu: ipu-v3: pre: Convert to devm_platform_ioremap_resource()

2023-07-09 Thread Yangtao Li
Use devm_platform_ioremap_resource() to simplify code.

Signed-off-by: Yangtao Li 
Reviewed-by: Philipp Zabel 
---
 drivers/gpu/ipu-v3/ipu-pre.c | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/drivers/gpu/ipu-v3/ipu-pre.c b/drivers/gpu/ipu-v3/ipu-pre.c
index ad82c9e0252f..aef984a43190 100644
--- a/drivers/gpu/ipu-v3/ipu-pre.c
+++ b/drivers/gpu/ipu-v3/ipu-pre.c
@@ -271,15 +271,13 @@ u32 ipu_pre_get_baddr(struct ipu_pre *pre)
 static int ipu_pre_probe(struct platform_device *pdev)
 {
struct device *dev = >dev;
-   struct resource *res;
struct ipu_pre *pre;
 
pre = devm_kzalloc(dev, sizeof(*pre), GFP_KERNEL);
if (!pre)
return -ENOMEM;
 
-   res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-   pre->regs = devm_ioremap_resource(>dev, res);
+   pre->regs = devm_platform_ioremap_resource(pdev, 0);
if (IS_ERR(pre->regs))
return PTR_ERR(pre->regs);
 
-- 
2.39.0



[PATCH v2 03/19] drm/rockchip: dsi: Use devm_platform_get_and_ioremap_resource()

2023-07-09 Thread Yangtao Li
Convert platform_get_resource(), devm_ioremap_resource() to a single
call to devm_platform_get_and_ioremap_resource(), as this is exactly
what this function does.

Signed-off-by: Yangtao Li 
---
 drivers/gpu/drm/rockchip/dw-mipi-dsi-rockchip.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/rockchip/dw-mipi-dsi-rockchip.c 
b/drivers/gpu/drm/rockchip/dw-mipi-dsi-rockchip.c
index 917e79951aac..ab57df7c6eab 100644
--- a/drivers/gpu/drm/rockchip/dw-mipi-dsi-rockchip.c
+++ b/drivers/gpu/drm/rockchip/dw-mipi-dsi-rockchip.c
@@ -1351,8 +1351,7 @@ static int dw_mipi_dsi_rockchip_probe(struct 
platform_device *pdev)
if (!dsi)
return -ENOMEM;
 
-   res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-   dsi->base = devm_ioremap_resource(dev, res);
+   dsi->base = devm_platform_get_and_ioremap_resource(pdev, 0, );
if (IS_ERR(dsi->base)) {
DRM_DEV_ERROR(dev, "Unable to get dsi registers\n");
return PTR_ERR(dsi->base);
-- 
2.39.0



[PATCH v2 01/19] drm/renesas: Convert to devm_platform_ioremap_resource()

2023-07-09 Thread Yangtao Li
Use devm_platform_ioremap_resource() to simplify code.

Signed-off-by: Yangtao Li 
Reviewed-by: Laurent Pinchart 
---
 drivers/gpu/drm/renesas/rcar-du/rcar_mipi_dsi.c | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/renesas/rcar-du/rcar_mipi_dsi.c 
b/drivers/gpu/drm/renesas/rcar-du/rcar_mipi_dsi.c
index e10e4d4b89a2..4bf9f5d15fa8 100644
--- a/drivers/gpu/drm/renesas/rcar-du/rcar_mipi_dsi.c
+++ b/drivers/gpu/drm/renesas/rcar-du/rcar_mipi_dsi.c
@@ -1002,7 +1002,6 @@ static int rcar_mipi_dsi_get_clocks(struct rcar_mipi_dsi 
*dsi)
 static int rcar_mipi_dsi_probe(struct platform_device *pdev)
 {
struct rcar_mipi_dsi *dsi;
-   struct resource *mem;
int ret;
 
dsi = devm_kzalloc(>dev, sizeof(*dsi), GFP_KERNEL);
@@ -1019,8 +1018,7 @@ static int rcar_mipi_dsi_probe(struct platform_device 
*pdev)
return ret;
 
/* Acquire resources. */
-   mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-   dsi->mmio = devm_ioremap_resource(dsi->dev, mem);
+   dsi->mmio = devm_platform_ioremap_resource(pdev, 0);
if (IS_ERR(dsi->mmio))
return PTR_ERR(dsi->mmio);
 
-- 
2.39.0



[PATCH 18/18] drm/fsl-dcu: Convert to devm_platform_ioremap_resource()

2023-07-07 Thread Yangtao Li
Use devm_platform_ioremap_resource() to simplify code.

Signed-off-by: Yangtao Li 
---
 drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c 
b/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c
index c09ba019ba5e..14661912e60f 100644
--- a/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c
+++ b/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c
@@ -246,7 +246,6 @@ static int fsl_dcu_drm_probe(struct platform_device *pdev)
struct fsl_dcu_drm_device *fsl_dev;
struct drm_device *drm;
struct device *dev = >dev;
-   struct resource *res;
void __iomem *base;
struct clk *pix_clk_in;
char pix_clk_name[32];
@@ -264,8 +263,7 @@ static int fsl_dcu_drm_probe(struct platform_device *pdev)
return -ENODEV;
fsl_dev->soc = id->data;
 
-   res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-   base = devm_ioremap_resource(dev, res);
+   base = devm_platform_ioremap_resource(pdev, 0);
if (IS_ERR(base)) {
ret = PTR_ERR(base);
return ret;
-- 
2.39.0



[PATCH 12/18] drm/tegra: dpaux: Convert to devm_platform_ioremap_resource()

2023-07-07 Thread Yangtao Li
Use devm_platform_ioremap_resource() to simplify code.

Signed-off-by: Yangtao Li 
---
 drivers/gpu/drm/tegra/dpaux.c | 6 ++
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/tegra/dpaux.c b/drivers/gpu/drm/tegra/dpaux.c
index 4d2677dcd831..f120897ce4b3 100644
--- a/drivers/gpu/drm/tegra/dpaux.c
+++ b/drivers/gpu/drm/tegra/dpaux.c
@@ -447,7 +447,6 @@ static const struct pinmux_ops tegra_dpaux_pinmux_ops = {
 static int tegra_dpaux_probe(struct platform_device *pdev)
 {
struct tegra_dpaux *dpaux;
-   struct resource *regs;
u32 value;
int err;
 
@@ -461,14 +460,13 @@ static int tegra_dpaux_probe(struct platform_device *pdev)
INIT_LIST_HEAD(>list);
dpaux->dev = >dev;
 
-   regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-   dpaux->regs = devm_ioremap_resource(>dev, regs);
+   dpaux->regs = devm_platform_ioremap_resource(pdev, 0);
if (IS_ERR(dpaux->regs))
return PTR_ERR(dpaux->regs);
 
dpaux->irq = platform_get_irq(pdev, 0);
if (dpaux->irq < 0)
-   return -ENXIO;
+   return dpaux->irq;
 
if (!pdev->dev.pm_domain) {
dpaux->rst = devm_reset_control_get(>dev, "dpaux");
-- 
2.39.0



[PATCH 13/18] drm/stm: ltdc: Convert to devm_platform_ioremap_resource()

2023-07-07 Thread Yangtao Li
Use devm_platform_ioremap_resource() to simplify code.

Signed-off-by: Yangtao Li 
---
 drivers/gpu/drm/stm/ltdc.c | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/stm/ltdc.c b/drivers/gpu/drm/stm/ltdc.c
index b8be4c1db423..734dca4d7dd8 100644
--- a/drivers/gpu/drm/stm/ltdc.c
+++ b/drivers/gpu/drm/stm/ltdc.c
@@ -1925,7 +1925,6 @@ int ltdc_load(struct drm_device *ddev)
struct drm_panel *panel;
struct drm_crtc *crtc;
struct reset_control *rstc;
-   struct resource *res;
int irq, i, nb_endpoints;
int ret = -ENODEV;
 
@@ -1992,8 +1991,7 @@ int ltdc_load(struct drm_device *ddev)
reset_control_deassert(rstc);
}
 
-   res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-   ldev->regs = devm_ioremap_resource(dev, res);
+   ldev->regs = devm_platform_ioremap_resource(pdev, 0);
if (IS_ERR(ldev->regs)) {
DRM_ERROR("Unable to get ltdc registers\n");
ret = PTR_ERR(ldev->regs);
-- 
2.39.0



[PATCH 08/18] gpu: ipu-v3: prg: Convert to devm_platform_ioremap_resource()

2023-07-07 Thread Yangtao Li
Use devm_platform_ioremap_resource() to simplify code.

Signed-off-by: Yangtao Li 
---
 drivers/gpu/ipu-v3/ipu-prg.c | 5 +
 1 file changed, 1 insertion(+), 4 deletions(-)

diff --git a/drivers/gpu/ipu-v3/ipu-prg.c b/drivers/gpu/ipu-v3/ipu-prg.c
index 196797c1b4b3..729605709955 100644
--- a/drivers/gpu/ipu-v3/ipu-prg.c
+++ b/drivers/gpu/ipu-v3/ipu-prg.c
@@ -358,7 +358,6 @@ EXPORT_SYMBOL_GPL(ipu_prg_channel_configure_pending);
 static int ipu_prg_probe(struct platform_device *pdev)
 {
struct device *dev = >dev;
-   struct resource *res;
struct ipu_prg *prg;
u32 val;
int i, ret;
@@ -367,12 +366,10 @@ static int ipu_prg_probe(struct platform_device *pdev)
if (!prg)
return -ENOMEM;
 
-   res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-   prg->regs = devm_ioremap_resource(>dev, res);
+   prg->regs = devm_platform_ioremap_resource(pdev, 0);
if (IS_ERR(prg->regs))
return PTR_ERR(prg->regs);
 
-
prg->clk_ipg = devm_clk_get(dev, "ipg");
if (IS_ERR(prg->clk_ipg))
return PTR_ERR(prg->clk_ipg);
-- 
2.39.0



[PATCH 01/18] drm/renesas: Convert to devm_platform_ioremap_resource()

2023-07-07 Thread Yangtao Li
Use devm_platform_ioremap_resource() to simplify code.

Signed-off-by: Yangtao Li 
---
 drivers/gpu/drm/renesas/rcar-du/rcar_mipi_dsi.c | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/renesas/rcar-du/rcar_mipi_dsi.c 
b/drivers/gpu/drm/renesas/rcar-du/rcar_mipi_dsi.c
index e10e4d4b89a2..4bf9f5d15fa8 100644
--- a/drivers/gpu/drm/renesas/rcar-du/rcar_mipi_dsi.c
+++ b/drivers/gpu/drm/renesas/rcar-du/rcar_mipi_dsi.c
@@ -1002,7 +1002,6 @@ static int rcar_mipi_dsi_get_clocks(struct rcar_mipi_dsi 
*dsi)
 static int rcar_mipi_dsi_probe(struct platform_device *pdev)
 {
struct rcar_mipi_dsi *dsi;
-   struct resource *mem;
int ret;
 
dsi = devm_kzalloc(>dev, sizeof(*dsi), GFP_KERNEL);
@@ -1019,8 +1018,7 @@ static int rcar_mipi_dsi_probe(struct platform_device 
*pdev)
return ret;
 
/* Acquire resources. */
-   mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-   dsi->mmio = devm_ioremap_resource(dsi->dev, mem);
+   dsi->mmio = devm_platform_ioremap_resource(pdev, 0);
if (IS_ERR(dsi->mmio))
return PTR_ERR(dsi->mmio);
 
-- 
2.39.0



[PATCH 10/18] drm: lcdif: Convert to devm_platform_ioremap_resource()

2023-07-07 Thread Yangtao Li
Use devm_platform_ioremap_resource() to simplify code.

Signed-off-by: Yangtao Li 
---
 drivers/gpu/drm/mxsfb/lcdif_drv.c | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/mxsfb/lcdif_drv.c 
b/drivers/gpu/drm/mxsfb/lcdif_drv.c
index c9d8cbb21407..a7cdd0eec7a2 100644
--- a/drivers/gpu/drm/mxsfb/lcdif_drv.c
+++ b/drivers/gpu/drm/mxsfb/lcdif_drv.c
@@ -134,7 +134,6 @@ static int lcdif_load(struct drm_device *drm)
 {
struct platform_device *pdev = to_platform_device(drm->dev);
struct lcdif_drm_private *lcdif;
-   struct resource *res;
int ret;
 
lcdif = devm_kzalloc(>dev, sizeof(*lcdif), GFP_KERNEL);
@@ -144,8 +143,7 @@ static int lcdif_load(struct drm_device *drm)
lcdif->drm = drm;
drm->dev_private = lcdif;
 
-   res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-   lcdif->base = devm_ioremap_resource(drm->dev, res);
+   lcdif->base = devm_platform_ioremap_resource(pdev, 0);
if (IS_ERR(lcdif->base))
return PTR_ERR(lcdif->base);
 
-- 
2.39.0



[PATCH 03/18] drm/rockchip: dsi: Use devm_platform_get_and_ioremap_resource()

2023-07-07 Thread Yangtao Li
Convert platform_get_resource(), devm_ioremap_resource() to a single
call to devm_platform_get_and_ioremap_resource(), as this is exactly
what this function does.

Signed-off-by: Yangtao Li 
---
 drivers/gpu/drm/rockchip/dw-mipi-dsi-rockchip.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/rockchip/dw-mipi-dsi-rockchip.c 
b/drivers/gpu/drm/rockchip/dw-mipi-dsi-rockchip.c
index 917e79951aac..ab57df7c6eab 100644
--- a/drivers/gpu/drm/rockchip/dw-mipi-dsi-rockchip.c
+++ b/drivers/gpu/drm/rockchip/dw-mipi-dsi-rockchip.c
@@ -1351,8 +1351,7 @@ static int dw_mipi_dsi_rockchip_probe(struct 
platform_device *pdev)
if (!dsi)
return -ENOMEM;
 
-   res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-   dsi->base = devm_ioremap_resource(dev, res);
+   dsi->base = devm_platform_get_and_ioremap_resource(pdev, 0, );
if (IS_ERR(dsi->base)) {
DRM_DEV_ERROR(dev, "Unable to get dsi registers\n");
return PTR_ERR(dsi->base);
-- 
2.39.0



[PATCH 16/18] drm/rockchip: vop: Use devm_platform_get_and_ioremap_resource()

2023-07-07 Thread Yangtao Li
Convert platform_get_resource(), devm_ioremap_resource() to a single
call to devm_platform_get_and_ioremap_resource(), as this is exactly
what this function does.

Signed-off-by: Yangtao Li 
---
 drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c 
b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
index a530ecc4d207..e95d94ce1869 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
@@ -2179,8 +2179,7 @@ static int vop_bind(struct device *dev, struct device 
*master, void *data)
 
vop_win_init(vop);
 
-   res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-   vop->regs = devm_ioremap_resource(dev, res);
+   vop->regs = devm_platform_get_and_ioremap_resource(pdev, 0, );
if (IS_ERR(vop->regs))
return PTR_ERR(vop->regs);
vop->len = resource_size(res);
-- 
2.39.0



[PATCH 05/18] drm/tegra: hdmi: Convert to devm_platform_ioremap_resource()

2023-07-07 Thread Yangtao Li
Use devm_platform_ioremap_resource() to simplify code.

Signed-off-by: Yangtao Li 
---
 drivers/gpu/drm/tegra/hdmi.c | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/tegra/hdmi.c b/drivers/gpu/drm/tegra/hdmi.c
index 6eac54ae1205..f3a44ca87151 100644
--- a/drivers/gpu/drm/tegra/hdmi.c
+++ b/drivers/gpu/drm/tegra/hdmi.c
@@ -1769,7 +1769,6 @@ static irqreturn_t tegra_hdmi_irq(int irq, void *data)
 static int tegra_hdmi_probe(struct platform_device *pdev)
 {
struct tegra_hdmi *hdmi;
-   struct resource *regs;
int err;
 
hdmi = devm_kzalloc(>dev, sizeof(*hdmi), GFP_KERNEL);
@@ -1831,8 +1830,7 @@ static int tegra_hdmi_probe(struct platform_device *pdev)
if (err < 0)
return err;
 
-   regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-   hdmi->regs = devm_ioremap_resource(>dev, regs);
+   hdmi->regs = devm_platform_ioremap_resource(pdev, 0);
if (IS_ERR(hdmi->regs))
return PTR_ERR(hdmi->regs);
 
-- 
2.39.0



[PATCH 11/18] drm/mxsfb: Convert to devm_platform_ioremap_resource()

2023-07-07 Thread Yangtao Li
Use devm_platform_ioremap_resource() to simplify code.

Signed-off-by: Yangtao Li 
---
 drivers/gpu/drm/mxsfb/mxsfb_drv.c | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/mxsfb/mxsfb_drv.c 
b/drivers/gpu/drm/mxsfb/mxsfb_drv.c
index 368b1fbd8305..c8b3fdb1ab09 100644
--- a/drivers/gpu/drm/mxsfb/mxsfb_drv.c
+++ b/drivers/gpu/drm/mxsfb/mxsfb_drv.c
@@ -213,7 +213,6 @@ static int mxsfb_load(struct drm_device *drm,
 {
struct platform_device *pdev = to_platform_device(drm->dev);
struct mxsfb_drm_private *mxsfb;
-   struct resource *res;
int ret;
 
mxsfb = devm_kzalloc(>dev, sizeof(*mxsfb), GFP_KERNEL);
@@ -224,8 +223,7 @@ static int mxsfb_load(struct drm_device *drm,
drm->dev_private = mxsfb;
mxsfb->devdata = devdata;
 
-   res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-   mxsfb->base = devm_ioremap_resource(drm->dev, res);
+   mxsfb->base = devm_platform_ioremap_resource(pdev, 0);
if (IS_ERR(mxsfb->base))
return PTR_ERR(mxsfb->base);
 
-- 
2.39.0



[PATCH 09/18] drm/hisilicon: Convert to devm_platform_ioremap_resource()

2023-07-07 Thread Yangtao Li
Use devm_platform_ioremap_resource() to simplify code.

Signed-off-by: Yangtao Li 
---
 drivers/gpu/drm/hisilicon/kirin/dw_drm_dsi.c | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/hisilicon/kirin/dw_drm_dsi.c 
b/drivers/gpu/drm/hisilicon/kirin/dw_drm_dsi.c
index d9978b79828c..ff4ed4639509 100644
--- a/drivers/gpu/drm/hisilicon/kirin/dw_drm_dsi.c
+++ b/drivers/gpu/drm/hisilicon/kirin/dw_drm_dsi.c
@@ -826,7 +826,6 @@ static const struct component_ops dsi_ops = {
 static int dsi_parse_dt(struct platform_device *pdev, struct dw_dsi *dsi)
 {
struct dsi_hw_ctx *ctx = dsi->ctx;
-   struct resource *res;
 
ctx->pclk = devm_clk_get(>dev, "pclk");
if (IS_ERR(ctx->pclk)) {
@@ -834,8 +833,7 @@ static int dsi_parse_dt(struct platform_device *pdev, 
struct dw_dsi *dsi)
return PTR_ERR(ctx->pclk);
}
 
-   res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-   ctx->base = devm_ioremap_resource(>dev, res);
+   ctx->base = devm_platform_ioremap_resource(pdev, 0);
if (IS_ERR(ctx->base)) {
DRM_ERROR("failed to remap dsi io region\n");
return PTR_ERR(ctx->base);
-- 
2.39.0



[PATCH 14/18] drm/aspeed: Convert to devm_platform_ioremap_resource()

2023-07-07 Thread Yangtao Li
Use devm_platform_ioremap_resource() to simplify code.

Signed-off-by: Yangtao Li 
---
 drivers/gpu/drm/aspeed/aspeed_gfx_drv.c | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/aspeed/aspeed_gfx_drv.c 
b/drivers/gpu/drm/aspeed/aspeed_gfx_drv.c
index c8c7f8215155..d681248f098c 100644
--- a/drivers/gpu/drm/aspeed/aspeed_gfx_drv.c
+++ b/drivers/gpu/drm/aspeed/aspeed_gfx_drv.c
@@ -144,11 +144,9 @@ static int aspeed_gfx_load(struct drm_device *drm)
struct device_node *np = pdev->dev.of_node;
const struct aspeed_gfx_config *config;
const struct of_device_id *match;
-   struct resource *res;
int ret;
 
-   res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-   priv->base = devm_ioremap_resource(drm->dev, res);
+   priv->base = devm_platform_ioremap_resource(pdev, 0);
if (IS_ERR(priv->base))
return PTR_ERR(priv->base);
 
-- 
2.39.0



[PATCH 07/18] drm/bridge: analogix_dp: Convert to devm_platform_ioremap_resource()

2023-07-07 Thread Yangtao Li
Use devm_platform_ioremap_resource() to simplify code.

Signed-off-by: Yangtao Li 
---
 drivers/gpu/drm/bridge/analogix/analogix_dp_core.c | 5 +
 1 file changed, 1 insertion(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c 
b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
index df9370e0ff23..c6b228f1ed4c 100644
--- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
+++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
@@ -1686,7 +1686,6 @@ analogix_dp_probe(struct device *dev, struct 
analogix_dp_plat_data *plat_data)
 {
struct platform_device *pdev = to_platform_device(dev);
struct analogix_dp_device *dp;
-   struct resource *res;
unsigned int irq_flags;
int ret;
 
@@ -1740,9 +1739,7 @@ analogix_dp_probe(struct device *dev, struct 
analogix_dp_plat_data *plat_data)
 
clk_prepare_enable(dp->clock);
 
-   res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-
-   dp->reg_base = devm_ioremap_resource(>dev, res);
+   dp->reg_base = devm_platform_ioremap_resource(pdev, 0);
if (IS_ERR(dp->reg_base)) {
ret = PTR_ERR(dp->reg_base);
goto err_disable_clk;
-- 
2.39.0



[PATCH 17/18] drm/arcpgu: Convert to devm_platform_ioremap_resource()

2023-07-07 Thread Yangtao Li
Use devm_platform_ioremap_resource() to simplify code.

Signed-off-by: Yangtao Li 
---
 drivers/gpu/drm/tiny/arcpgu.c | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/tiny/arcpgu.c b/drivers/gpu/drm/tiny/arcpgu.c
index e5b10e41554a..3a5e66d909a4 100644
--- a/drivers/gpu/drm/tiny/arcpgu.c
+++ b/drivers/gpu/drm/tiny/arcpgu.c
@@ -251,7 +251,6 @@ static int arcpgu_load(struct arcpgu_drm_private *arcpgu)
struct device_node *encoder_node = NULL, *endpoint_node = NULL;
struct drm_connector *connector = NULL;
struct drm_device *drm = >drm;
-   struct resource *res;
int ret;
 
arcpgu->clk = devm_clk_get(drm->dev, "pxlclk");
@@ -268,8 +267,7 @@ static int arcpgu_load(struct arcpgu_drm_private *arcpgu)
drm->mode_config.max_height = 1080;
drm->mode_config.funcs = _drm_modecfg_funcs;
 
-   res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-   arcpgu->regs = devm_ioremap_resource(>dev, res);
+   arcpgu->regs = devm_platform_ioremap_resource(pdev, 0);
if (IS_ERR(arcpgu->regs))
return PTR_ERR(arcpgu->regs);
 
-- 
2.39.0



[PATCH 06/18] drm: bridge: dw_hdmi: Use devm_platform_get_and_ioremap_resource()

2023-07-07 Thread Yangtao Li
Convert platform_get_resource(), devm_ioremap_resource() to a single
call to devm_platform_get_and_ioremap_resource(), as this is exactly
what this function does.

Signed-off-by: Yangtao Li 
---
 drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c 
b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
index 7b66f362afd8..b2b320ba2196 100644
--- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
+++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
@@ -3417,8 +3417,7 @@ struct dw_hdmi *dw_hdmi_probe(struct platform_device 
*pdev,
return ERR_PTR(-EINVAL);
}
 
-   iores = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-   hdmi->regs = devm_ioremap_resource(dev, iores);
+   hdmi->regs = devm_platform_get_and_ioremap_resource(pdev, 0, 
);
if (IS_ERR(hdmi->regs)) {
ret = PTR_ERR(hdmi->regs);
goto err_res;
-- 
2.39.0



[PATCH 04/18] drm: kirin: Convert to devm_platform_ioremap_resource()

2023-07-07 Thread Yangtao Li
Use devm_platform_ioremap_resource() to simplify code.

Signed-off-by: Yangtao Li 
---
 drivers/gpu/drm/hisilicon/kirin/kirin_drm_ade.c | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/hisilicon/kirin/kirin_drm_ade.c 
b/drivers/gpu/drm/hisilicon/kirin/kirin_drm_ade.c
index 871f79a6b17e..42ae68c70880 100644
--- a/drivers/gpu/drm/hisilicon/kirin/kirin_drm_ade.c
+++ b/drivers/gpu/drm/hisilicon/kirin/kirin_drm_ade.c
@@ -843,7 +843,6 @@ static struct drm_plane_funcs ade_plane_funcs = {
 static void *ade_hw_ctx_alloc(struct platform_device *pdev,
  struct drm_crtc *crtc)
 {
-   struct resource *res;
struct device *dev = >dev;
struct device_node *np = pdev->dev.of_node;
struct ade_hw_ctx *ctx = NULL;
@@ -855,8 +854,7 @@ static void *ade_hw_ctx_alloc(struct platform_device *pdev,
return ERR_PTR(-ENOMEM);
}
 
-   res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-   ctx->base = devm_ioremap_resource(dev, res);
+   ctx->base = devm_platform_ioremap_resource(pdev, 0);
if (IS_ERR(ctx->base)) {
DRM_ERROR("failed to remap ade io base\n");
return ERR_PTR(-EIO);
-- 
2.39.0



[PATCH 02/18] gpu: ipu-v3: pre: Convert to devm_platform_ioremap_resource()

2023-07-07 Thread Yangtao Li
Use devm_platform_ioremap_resource() to simplify code.

Signed-off-by: Yangtao Li 
---
 drivers/gpu/ipu-v3/ipu-pre.c | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/drivers/gpu/ipu-v3/ipu-pre.c b/drivers/gpu/ipu-v3/ipu-pre.c
index ad82c9e0252f..aef984a43190 100644
--- a/drivers/gpu/ipu-v3/ipu-pre.c
+++ b/drivers/gpu/ipu-v3/ipu-pre.c
@@ -271,15 +271,13 @@ u32 ipu_pre_get_baddr(struct ipu_pre *pre)
 static int ipu_pre_probe(struct platform_device *pdev)
 {
struct device *dev = >dev;
-   struct resource *res;
struct ipu_pre *pre;
 
pre = devm_kzalloc(dev, sizeof(*pre), GFP_KERNEL);
if (!pre)
return -ENOMEM;
 
-   res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-   pre->regs = devm_ioremap_resource(>dev, res);
+   pre->regs = devm_platform_ioremap_resource(pdev, 0);
if (IS_ERR(pre->regs))
return PTR_ERR(pre->regs);
 
-- 
2.39.0



[PATCH 15/18] drm/tegra: sor: Convert to devm_platform_ioremap_resource()

2023-07-07 Thread Yangtao Li
Use devm_platform_ioremap_resource() to simplify code.

Signed-off-by: Yangtao Li 
---
 drivers/gpu/drm/tegra/sor.c | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/tegra/sor.c b/drivers/gpu/drm/tegra/sor.c
index abd6e3b92293..f23d54626883 100644
--- a/drivers/gpu/drm/tegra/sor.c
+++ b/drivers/gpu/drm/tegra/sor.c
@@ -3708,7 +3708,6 @@ static int tegra_sor_probe(struct platform_device *pdev)
 {
struct device_node *np;
struct tegra_sor *sor;
-   struct resource *regs;
int err;
 
sor = devm_kzalloc(>dev, sizeof(*sor), GFP_KERNEL);
@@ -3781,8 +3780,7 @@ static int tegra_sor_probe(struct platform_device *pdev)
}
}
 
-   regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-   sor->regs = devm_ioremap_resource(>dev, regs);
+   sor->regs = devm_platform_ioremap_resource(pdev, 0);
if (IS_ERR(sor->regs)) {
err = PTR_ERR(sor->regs);
goto remove;
-- 
2.39.0



[PATCH] fbdev: imxfb: Convert to devm_platform_ioremap_resource()

2023-07-04 Thread Yangtao Li
Use devm_platform_ioremap_resource() to simplify code.

Signed-off-by: Yangtao Li 
---
 drivers/video/fbdev/imxfb.c | 8 +---
 1 file changed, 1 insertion(+), 7 deletions(-)

diff --git a/drivers/video/fbdev/imxfb.c b/drivers/video/fbdev/imxfb.c
index adf36690c342..517eb65bbaa6 100644
--- a/drivers/video/fbdev/imxfb.c
+++ b/drivers/video/fbdev/imxfb.c
@@ -868,7 +868,6 @@ static int imxfb_probe(struct platform_device *pdev)
struct imxfb_info *fbi;
struct lcd_device *lcd;
struct fb_info *info;
-   struct resource *res;
struct imx_fb_videomode *m;
const struct of_device_id *of_id;
struct device_node *display_np;
@@ -885,10 +884,6 @@ static int imxfb_probe(struct platform_device *pdev)
if (of_id)
pdev->id_entry = of_id->data;
 
-   res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-   if (!res)
-   return -ENODEV;
-
info = framebuffer_alloc(sizeof(struct imxfb_info), >dev);
if (!info)
return -ENOMEM;
@@ -970,7 +965,7 @@ static int imxfb_probe(struct platform_device *pdev)
goto failed_getclock;
}
 
-   fbi->regs = devm_ioremap_resource(>dev, res);
+   fbi->regs = devm_platform_ioremap_resource(pdev, 0);
if (IS_ERR(fbi->regs)) {
ret = PTR_ERR(fbi->regs);
goto failed_ioremap;
@@ -1043,7 +1038,6 @@ static int imxfb_probe(struct platform_device *pdev)
 failed_map:
 failed_ioremap:
 failed_getclock:
-   release_mem_region(res->start, resource_size(res));
 failed_of_parse:
kfree(info->pseudo_palette);
 failed_init:
-- 
2.39.0



[PATCH 25/31] memory: tegra30: convert to use devm_pm_opp_* API

2021-01-04 Thread Yangtao Li
Use devm_pm_opp_* API to simplify code.

Signed-off-by: Yangtao Li 
---
 drivers/memory/tegra/tegra30-emc.c | 29 +
 1 file changed, 9 insertions(+), 20 deletions(-)

diff --git a/drivers/memory/tegra/tegra30-emc.c 
b/drivers/memory/tegra/tegra30-emc.c
index 44ac155936aa..a93d8c3629fe 100644
--- a/drivers/memory/tegra/tegra30-emc.c
+++ b/drivers/memory/tegra/tegra30-emc.c
@@ -1483,31 +1483,31 @@ static int tegra_emc_interconnect_init(struct tegra_emc 
*emc)
 static int tegra_emc_opp_table_init(struct tegra_emc *emc)
 {
u32 hw_version = BIT(tegra_sku_info.soc_speedo_id);
-   struct opp_table *clk_opp_table, *hw_opp_table;
+   struct opp_table *opp_table;
int err;
 
-   clk_opp_table = dev_pm_opp_set_clkname(emc->dev, NULL);
-   err = PTR_ERR_OR_ZERO(clk_opp_table);
+   opp_table = devm_pm_opp_set_clkname(emc->dev, NULL);
+   err = PTR_ERR_OR_ZERO(opp_table);
if (err) {
dev_err(emc->dev, "failed to set OPP clk: %d\n", err);
return err;
}
 
-   hw_opp_table = dev_pm_opp_set_supported_hw(emc->dev, _version, 1);
-   err = PTR_ERR_OR_ZERO(hw_opp_table);
+   opp_table = devm_pm_opp_set_supported_hw(emc->dev, _version, 1);
+   err = PTR_ERR_OR_ZERO(opp_table);
if (err) {
dev_err(emc->dev, "failed to set OPP supported HW: %d\n", err);
-   goto put_clk_table;
+   return err;
}
 
-   err = dev_pm_opp_of_add_table(emc->dev);
+   err = devm_pm_opp_of_add_table(emc->dev);
if (err) {
if (err == -ENODEV)
dev_err(emc->dev, "OPP table not found, please update 
your device tree\n");
else
dev_err(emc->dev, "failed to add OPP table: %d\n", err);
 
-   goto put_hw_table;
+   return err;
}
 
dev_info(emc->dev, "OPP HW ver. 0x%x, current clock rate %lu MHz\n",
@@ -1515,19 +1515,8 @@ static int tegra_emc_opp_table_init(struct tegra_emc 
*emc)
 
/* first dummy rate-set initializes voltage state */
err = dev_pm_opp_set_rate(emc->dev, clk_get_rate(emc->clk));
-   if (err) {
+   if (err)
dev_err(emc->dev, "failed to initialize OPP clock: %d\n", err);
-   goto remove_table;
-   }
-
-   return 0;
-
-remove_table:
-   dev_pm_opp_of_remove_table(emc->dev);
-put_hw_table:
-   dev_pm_opp_put_supported_hw(hw_opp_table);
-put_clk_table:
-   dev_pm_opp_put_clkname(clk_opp_table);
 
return err;
 }
-- 
2.25.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 29/31] PM / devfreq: imx-bus: convert to use devm_pm_opp_* API

2021-01-04 Thread Yangtao Li
Use devm_pm_opp_* API to simplify code.

Signed-off-by: Yangtao Li 
---
 drivers/devfreq/imx-bus.c | 14 +++---
 1 file changed, 3 insertions(+), 11 deletions(-)

diff --git a/drivers/devfreq/imx-bus.c b/drivers/devfreq/imx-bus.c
index 4f38455ad742..ff26ef049b1b 100644
--- a/drivers/devfreq/imx-bus.c
+++ b/drivers/devfreq/imx-bus.c
@@ -61,7 +61,6 @@ static void imx_bus_exit(struct device *dev)
 {
struct imx_bus *priv = dev_get_drvdata(dev);
 
-   dev_pm_opp_of_remove_table(dev);
platform_device_unregister(priv->icc_pdev);
 }
 
@@ -123,7 +122,7 @@ static int imx_bus_probe(struct platform_device *pdev)
}
platform_set_drvdata(pdev, priv);
 
-   ret = dev_pm_opp_of_add_table(dev);
+   ret = devm_pm_opp_of_add_table(dev);
if (ret < 0) {
dev_err(dev, "failed to get OPP table\n");
return ret;
@@ -141,18 +140,11 @@ static int imx_bus_probe(struct platform_device *pdev)
if (IS_ERR(priv->devfreq)) {
ret = PTR_ERR(priv->devfreq);
dev_err(dev, "failed to add devfreq device: %d\n", ret);
-   goto err;
+   return ret;
}
 
-   ret = imx_bus_init_icc(dev);
-   if (ret)
-   goto err;
-
-   return 0;
+   return imx_bus_init_icc(dev);
 
-err:
-   dev_pm_opp_of_remove_table(dev);
-   return ret;
 }
 
 static const struct of_device_id imx_bus_of_match[] = {
-- 
2.25.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 02/31] opp: Add devres wrapper for dev_pm_opp_set_regulators and dev_pm_opp_put_regulators

2021-01-04 Thread Yangtao Li
Add devres wrapper for dev_pm_opp_set_regulators()
dev_pm_opp_put_regulators () to simplify driver code.

Signed-off-by: Yangtao Li 
---
 drivers/opp/core.c | 50 ++
 include/linux/pm_opp.h |  9 
 2 files changed, 59 insertions(+)

diff --git a/drivers/opp/core.c b/drivers/opp/core.c
index 53fdf33732d5..8709689a7152 100644
--- a/drivers/opp/core.c
+++ b/drivers/opp/core.c
@@ -1878,6 +1878,56 @@ void dev_pm_opp_put_regulators(struct opp_table 
*opp_table)
 }
 EXPORT_SYMBOL_GPL(dev_pm_opp_put_regulators);
 
+static void devm_pm_opp_regulators_release(void *data)
+{
+   dev_pm_opp_put_regulators(data);
+}
+
+/**
+ * devm_pm_opp_set_regulators() - Set regulator names for the device
+ * @dev: Device for which regulator name is being set.
+ * @names: Array of pointers to the names of the regulator.
+ * @count: Number of regulators.
+ *
+ * In order to support OPP switching, OPP layer needs to know the name of the
+ * device's regulators, as the core would be required to switch voltages as
+ * well.
+ *
+ * This must be called before any OPPs are initialized for the device.
+ *
+ * The opp_table structure will be freed after the device is destroyed.
+ */
+struct opp_table *devm_pm_opp_set_regulators(struct device *dev,
+   const char * const names[],
+   unsigned int count)
+{
+   struct opp_table *opp_table;
+   int err;
+
+   opp_table = dev_pm_opp_set_regulators(dev, names, count);
+   if (IS_ERR(opp_table))
+   return opp_table;
+
+   err = devm_add_action_or_reset(dev, devm_pm_opp_regulators_release,
+  opp_table);
+   if (err)
+   opp_table = ERR_PTR(err);
+
+   return opp_table;
+}
+EXPORT_SYMBOL_GPL(devm_pm_opp_set_regulators);
+
+/**
+ * devm_pm_opp_put_regulators() - Releases resources blocked for regulator
+ * @dev: Device for which we do this operation.
+ * @opp_table: OPP table returned from dev_pm_opp_set_regulators().
+ */
+void devm_pm_opp_put_regulators(struct device *dev, struct opp_table 
*opp_table)
+{
+   devm_release_action(dev, devm_pm_opp_regulators_release, opp_table);
+}
+EXPORT_SYMBOL_GPL(devm_pm_opp_put_regulators);
+
 /**
  * dev_pm_opp_set_clkname() - Set clk name for the device
  * @dev: Device for which clk name is being set.
diff --git a/include/linux/pm_opp.h b/include/linux/pm_opp.h
index 3418a2874f88..8a329247e08e 100644
--- a/include/linux/pm_opp.h
+++ b/include/linux/pm_opp.h
@@ -143,6 +143,8 @@ struct opp_table *dev_pm_opp_set_prop_name(struct device 
*dev, const char *name)
 void dev_pm_opp_put_prop_name(struct opp_table *opp_table);
 struct opp_table *dev_pm_opp_set_regulators(struct device *dev, const char * 
const names[], unsigned int count);
 void dev_pm_opp_put_regulators(struct opp_table *opp_table);
+struct opp_table *devm_pm_opp_set_regulators(struct device *dev, const char * 
const names[], unsigned int count);
+void devm_pm_opp_put_regulators(struct device *dev, struct opp_table 
*opp_table);
 struct opp_table *dev_pm_opp_set_clkname(struct device *dev, const char * 
name);
 void dev_pm_opp_put_clkname(struct opp_table *opp_table);
 struct opp_table *devm_pm_opp_set_clkname(struct device *dev, const char 
*name);
@@ -321,6 +323,13 @@ static inline struct opp_table 
*dev_pm_opp_set_regulators(struct device *dev, co
 
 static inline void dev_pm_opp_put_regulators(struct opp_table *opp_table) {}
 
+static inline struct opp_table *devm_pm_opp_set_regulators(struct device *dev, 
const char * const names[], unsigned int count)
+{
+   return ERR_PTR(-ENOTSUPP);
+}
+
+static inline void devm_pm_opp_put_regulators(struct device *dev, struct 
opp_table *opp_table) {}
+
 static inline struct opp_table *dev_pm_opp_set_clkname(struct device *dev, 
const char * name)
 {
return ERR_PTR(-ENOTSUPP);
-- 
2.25.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 24/31] memory: tegra20: convert to use devm_pm_opp_* API

2021-01-04 Thread Yangtao Li
Use devm_pm_opp_* API to simplify code.

Signed-off-by: Yangtao Li 
---
 drivers/memory/tegra/tegra20-emc.c | 29 +
 1 file changed, 9 insertions(+), 20 deletions(-)

diff --git a/drivers/memory/tegra/tegra20-emc.c 
b/drivers/memory/tegra/tegra20-emc.c
index 686aaf477d8a..223d9d97eb8f 100644
--- a/drivers/memory/tegra/tegra20-emc.c
+++ b/drivers/memory/tegra/tegra20-emc.c
@@ -911,31 +911,31 @@ static int tegra_emc_interconnect_init(struct tegra_emc 
*emc)
 static int tegra_emc_opp_table_init(struct tegra_emc *emc)
 {
u32 hw_version = BIT(tegra_sku_info.soc_process_id);
-   struct opp_table *clk_opp_table, *hw_opp_table;
+   struct opp_table *opp_table;
int err;
 
-   clk_opp_table = dev_pm_opp_set_clkname(emc->dev, NULL);
-   err = PTR_ERR_OR_ZERO(clk_opp_table);
+   opp_table = devm_pm_opp_set_clkname(emc->dev, NULL);
+   err = PTR_ERR_OR_ZERO(opp_table);
if (err) {
dev_err(emc->dev, "failed to set OPP clk: %d\n", err);
return err;
}
 
-   hw_opp_table = dev_pm_opp_set_supported_hw(emc->dev, _version, 1);
-   err = PTR_ERR_OR_ZERO(hw_opp_table);
+   opp_table = devm_pm_opp_set_supported_hw(emc->dev, _version, 1);
+   err = PTR_ERR_OR_ZERO(opp_table);
if (err) {
dev_err(emc->dev, "failed to set OPP supported HW: %d\n", err);
-   goto put_clk_table;
+   return err;
}
 
-   err = dev_pm_opp_of_add_table(emc->dev);
+   err = devm_pm_opp_of_add_table(emc->dev);
if (err) {
if (err == -ENODEV)
dev_err(emc->dev, "OPP table not found, please update 
your device tree\n");
else
dev_err(emc->dev, "failed to add OPP table: %d\n", err);
 
-   goto put_hw_table;
+   return err;
}
 
dev_info(emc->dev, "OPP HW ver. 0x%x, current clock rate %lu MHz\n",
@@ -943,19 +943,8 @@ static int tegra_emc_opp_table_init(struct tegra_emc *emc)
 
/* first dummy rate-set initializes voltage state */
err = dev_pm_opp_set_rate(emc->dev, clk_get_rate(emc->clk));
-   if (err) {
+   if (err)
dev_err(emc->dev, "failed to initialize OPP clock: %d\n", err);
-   goto remove_table;
-   }
-
-   return 0;
-
-remove_table:
-   dev_pm_opp_of_remove_table(emc->dev);
-put_hw_table:
-   dev_pm_opp_put_supported_hw(hw_opp_table);
-put_clk_table:
-   dev_pm_opp_put_clkname(clk_opp_table);
 
return err;
 }
-- 
2.25.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 22/31] memory: samsung: exynos5422-dmc: fix return error in exynos5_init_freq_table

2021-01-04 Thread Yangtao Li
We can't always return -EINVAL, let's fix it.

Signed-off-by: Yangtao Li 
---
 drivers/memory/samsung/exynos5422-dmc.c | 10 +++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/drivers/memory/samsung/exynos5422-dmc.c 
b/drivers/memory/samsung/exynos5422-dmc.c
index c5ee4121a4d2..62a83633f837 100644
--- a/drivers/memory/samsung/exynos5422-dmc.c
+++ b/drivers/memory/samsung/exynos5422-dmc.c
@@ -353,16 +353,20 @@ static int exynos5_init_freq_table(struct exynos5_dmc 
*dmc,
 
dmc->opp = devm_kmalloc_array(dmc->dev, dmc->opp_count,
  sizeof(struct dmc_opp_table), GFP_KERNEL);
-   if (!dmc->opp)
+   if (!dmc->opp) {
+   ret = -ENOMEM;
goto err_opp;
+   }
 
idx = dmc->opp_count - 1;
for (i = 0, freq = ULONG_MAX; i < dmc->opp_count; i++, freq--) {
struct dev_pm_opp *opp;
 
opp = dev_pm_opp_find_freq_floor(dmc->dev, );
-   if (IS_ERR(opp))
+   if (IS_ERR(opp)) {
+   ret = PTR_ERR(opp);
goto err_opp;
+   }
 
dmc->opp[idx - i].freq_hz = freq;
dmc->opp[idx - i].volt_uv = dev_pm_opp_get_voltage(opp);
@@ -375,7 +379,7 @@ static int exynos5_init_freq_table(struct exynos5_dmc *dmc,
 err_opp:
dev_pm_opp_of_remove_table(dmc->dev);
 
-   return -EINVAL;
+   return ret;
 }
 
 /**
-- 
2.25.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 19/31] drm/panfrost: convert to use devm_pm_opp_* API

2021-01-04 Thread Yangtao Li
Use devm_pm_opp_* API to simplify code, and remove opp_table
from panfrost_devfreq.

Signed-off-by: Yangtao Li 
---
 drivers/gpu/drm/panfrost/panfrost_devfreq.c | 34 ++---
 drivers/gpu/drm/panfrost/panfrost_devfreq.h |  1 -
 2 files changed, 10 insertions(+), 25 deletions(-)

diff --git a/drivers/gpu/drm/panfrost/panfrost_devfreq.c 
b/drivers/gpu/drm/panfrost/panfrost_devfreq.c
index f44d28fad085..c42fa9eb43b1 100644
--- a/drivers/gpu/drm/panfrost/panfrost_devfreq.c
+++ b/drivers/gpu/drm/panfrost/panfrost_devfreq.c
@@ -92,25 +92,26 @@ int panfrost_devfreq_init(struct panfrost_device *pfdev)
struct thermal_cooling_device *cooling;
struct panfrost_devfreq *pfdevfreq = >pfdevfreq;
 
-   opp_table = dev_pm_opp_set_regulators(dev, pfdev->comp->supply_names,
+   opp_table = devm_pm_opp_set_regulators(dev, pfdev->comp->supply_names,
  pfdev->comp->num_supplies);
if (IS_ERR(opp_table)) {
ret = PTR_ERR(opp_table);
/* Continue if the optional regulator is missing */
if (ret != -ENODEV) {
DRM_DEV_ERROR(dev, "Couldn't set OPP regulators\n");
-   goto err_fini;
+   return ret;
}
-   } else {
-   pfdevfreq->regulators_opp_table = opp_table;
}
 
-   ret = dev_pm_opp_of_add_table(dev);
+   ret = devm_pm_opp_of_add_table(dev);
if (ret) {
+   if (!IS_ERR(opp_table))
+   devm_pm_opp_put_regulators(dev, opp_table);
+
/* Optional, continue without devfreq */
if (ret == -ENODEV)
ret = 0;
-   goto err_fini;
+   return ret;
}
pfdevfreq->opp_of_table_added = true;
 
@@ -121,10 +122,8 @@ int panfrost_devfreq_init(struct panfrost_device *pfdev)
cur_freq = clk_get_rate(pfdev->clock);
 
opp = devfreq_recommended_opp(dev, _freq, 0);
-   if (IS_ERR(opp)) {
-   ret = PTR_ERR(opp);
-   goto err_fini;
-   }
+   if (IS_ERR(opp))
+   return PTR_ERR(opp);
 
panfrost_devfreq_profile.initial_freq = cur_freq;
dev_pm_opp_put(opp);
@@ -133,8 +132,7 @@ int panfrost_devfreq_init(struct panfrost_device *pfdev)
  DEVFREQ_GOV_SIMPLE_ONDEMAND, NULL);
if (IS_ERR(devfreq)) {
DRM_DEV_ERROR(dev, "Couldn't initialize GPU devfreq\n");
-   ret = PTR_ERR(devfreq);
-   goto err_fini;
+   return PTR_ERR(devfreq);
}
pfdevfreq->devfreq = devfreq;
 
@@ -145,10 +143,6 @@ int panfrost_devfreq_init(struct panfrost_device *pfdev)
pfdevfreq->cooling = cooling;
 
return 0;
-
-err_fini:
-   panfrost_devfreq_fini(pfdev);
-   return ret;
 }
 
 void panfrost_devfreq_fini(struct panfrost_device *pfdev)
@@ -159,14 +153,6 @@ void panfrost_devfreq_fini(struct panfrost_device *pfdev)
devfreq_cooling_unregister(pfdevfreq->cooling);
pfdevfreq->cooling = NULL;
}
-
-   if (pfdevfreq->opp_of_table_added) {
-   dev_pm_opp_of_remove_table(>pdev->dev);
-   pfdevfreq->opp_of_table_added = false;
-   }
-
-   dev_pm_opp_put_regulators(pfdevfreq->regulators_opp_table);
-   pfdevfreq->regulators_opp_table = NULL;
 }
 
 void panfrost_devfreq_resume(struct panfrost_device *pfdev)
diff --git a/drivers/gpu/drm/panfrost/panfrost_devfreq.h 
b/drivers/gpu/drm/panfrost/panfrost_devfreq.h
index db6ea48e21f9..a51854cc8c06 100644
--- a/drivers/gpu/drm/panfrost/panfrost_devfreq.h
+++ b/drivers/gpu/drm/panfrost/panfrost_devfreq.h
@@ -15,7 +15,6 @@ struct panfrost_device;
 
 struct panfrost_devfreq {
struct devfreq *devfreq;
-   struct opp_table *regulators_opp_table;
struct thermal_cooling_device *cooling;
bool opp_of_table_added;
 
-- 
2.25.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 18/31] drm/lima: remove unneeded devm_devfreq_remove_device()

2021-01-04 Thread Yangtao Li
There is no need to manually release devm related resources.

Signed-off-by: Yangtao Li 
---
 drivers/gpu/drm/lima/lima_devfreq.c | 5 -
 1 file changed, 5 deletions(-)

diff --git a/drivers/gpu/drm/lima/lima_devfreq.c 
b/drivers/gpu/drm/lima/lima_devfreq.c
index d5937cf86504..7690c5c69f9f 100644
--- a/drivers/gpu/drm/lima/lima_devfreq.c
+++ b/drivers/gpu/drm/lima/lima_devfreq.c
@@ -94,11 +94,6 @@ void lima_devfreq_fini(struct lima_device *ldev)
devfreq_cooling_unregister(devfreq->cooling);
devfreq->cooling = NULL;
}
-
-   if (devfreq->devfreq) {
-   devm_devfreq_remove_device(ldev->dev, devfreq->devfreq);
-   devfreq->devfreq = NULL;
-   }
 }
 
 int lima_devfreq_init(struct lima_device *ldev)
-- 
2.25.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 27/31] PM / devfreq: rk3399_dmc: convert to use devm_pm_opp_* API

2021-01-04 Thread Yangtao Li
Use devm_pm_opp_* API to simplify code. Since devres release
can guarantee the order, let's remove
devm_devfreq_unregister_opp_notifier().

Signed-off-by: Yangtao Li 
---
 drivers/devfreq/rk3399_dmc.c | 22 +++---
 1 file changed, 3 insertions(+), 19 deletions(-)

diff --git a/drivers/devfreq/rk3399_dmc.c b/drivers/devfreq/rk3399_dmc.c
index 2e912166a993..9b8ab8be29d1 100644
--- a/drivers/devfreq/rk3399_dmc.c
+++ b/drivers/devfreq/rk3399_dmc.c
@@ -432,7 +432,7 @@ static int rk3399_dmcfreq_probe(struct platform_device 
*pdev)
 * We add a devfreq driver to our parent since it has a device tree node
 * with operating points.
 */
-   if (dev_pm_opp_of_add_table(dev)) {
+   if (devm_pm_opp_of_add_table(dev)) {
dev_err(dev, "Invalid operating-points in device tree.\n");
ret = -EINVAL;
goto err_edev;
@@ -448,7 +448,7 @@ static int rk3399_dmcfreq_probe(struct platform_device 
*pdev)
opp = devfreq_recommended_opp(dev, >rate, 0);
if (IS_ERR(opp)) {
ret = PTR_ERR(opp);
-   goto err_free_opp;
+   goto err_edev;
}
 
data->rate = dev_pm_opp_get_freq(opp);
@@ -463,7 +463,7 @@ static int rk3399_dmcfreq_probe(struct platform_device 
*pdev)
   >ondemand_data);
if (IS_ERR(data->devfreq)) {
ret = PTR_ERR(data->devfreq);
-   goto err_free_opp;
+   goto err_edev;
}
 
devm_devfreq_register_opp_notifier(dev, data->devfreq);
@@ -473,27 +473,12 @@ static int rk3399_dmcfreq_probe(struct platform_device 
*pdev)
 
return 0;
 
-err_free_opp:
-   dev_pm_opp_of_remove_table(>dev);
 err_edev:
devfreq_event_disable_edev(data->edev);
 
return ret;
 }
 
-static int rk3399_dmcfreq_remove(struct platform_device *pdev)
-{
-   struct rk3399_dmcfreq *dmcfreq = dev_get_drvdata(>dev);
-
-   /*
-* Before remove the opp table we need to unregister the opp notifier.
-*/
-   devm_devfreq_unregister_opp_notifier(dmcfreq->dev, dmcfreq->devfreq);
-   dev_pm_opp_of_remove_table(dmcfreq->dev);
-
-   return 0;
-}
-
 static const struct of_device_id rk3399dmc_devfreq_of_match[] = {
{ .compatible = "rockchip,rk3399-dmc" },
{ },
@@ -502,7 +487,6 @@ MODULE_DEVICE_TABLE(of, rk3399dmc_devfreq_of_match);
 
 static struct platform_driver rk3399_dmcfreq_driver = {
.probe  = rk3399_dmcfreq_probe,
-   .remove = rk3399_dmcfreq_remove,
.driver = {
.name   = "rk3399-dmc-freq",
.pm = _dmcfreq_pm,
-- 
2.25.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 28/31] PM / devfreq: imx8m-ddrc: convert to use devm_pm_opp_* API

2021-01-04 Thread Yangtao Li
Use devm_pm_opp_* API to simplify code.

Signed-off-by: Yangtao Li 
---
 drivers/devfreq/imx8m-ddrc.c | 15 ++-
 1 file changed, 2 insertions(+), 13 deletions(-)

diff --git a/drivers/devfreq/imx8m-ddrc.c b/drivers/devfreq/imx8m-ddrc.c
index bc82d3653bff..9383d6e5538b 100644
--- a/drivers/devfreq/imx8m-ddrc.c
+++ b/drivers/devfreq/imx8m-ddrc.c
@@ -370,11 +370,6 @@ static int imx8m_ddrc_check_opps(struct device *dev)
return 0;
 }
 
-static void imx8m_ddrc_exit(struct device *dev)
-{
-   dev_pm_opp_of_remove_table(dev);
-}
-
 static int imx8m_ddrc_probe(struct platform_device *pdev)
 {
struct device *dev = >dev;
@@ -419,7 +414,7 @@ static int imx8m_ddrc_probe(struct platform_device *pdev)
return ret;
}
 
-   ret = dev_pm_opp_of_add_table(dev);
+   ret = devm_pm_opp_of_add_table(dev);
if (ret < 0) {
dev_err(dev, "failed to get OPP table\n");
return ret;
@@ -427,12 +422,11 @@ static int imx8m_ddrc_probe(struct platform_device *pdev)
 
ret = imx8m_ddrc_check_opps(dev);
if (ret < 0)
-   goto err;
+   return ret;
 
priv->profile.polling_ms = 1000;
priv->profile.target = imx8m_ddrc_target;
priv->profile.get_dev_status = imx8m_ddrc_get_dev_status;
-   priv->profile.exit = imx8m_ddrc_exit;
priv->profile.get_cur_freq = imx8m_ddrc_get_cur_freq;
priv->profile.initial_freq = clk_get_rate(priv->dram_core);
 
@@ -441,13 +435,8 @@ static int imx8m_ddrc_probe(struct platform_device *pdev)
if (IS_ERR(priv->devfreq)) {
ret = PTR_ERR(priv->devfreq);
dev_err(dev, "failed to add devfreq device: %d\n", ret);
-   goto err;
}
 
-   return 0;
-
-err:
-   dev_pm_opp_of_remove_table(dev);
return ret;
 }
 
-- 
2.25.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 21/31] media: venus: convert to use devm_pm_opp_* API

2021-01-04 Thread Yangtao Li
Use devm_pm_opp_* API to simplify code.

Signed-off-by: Yangtao Li 
---
 .../media/platform/qcom/venus/pm_helpers.c| 21 ---
 1 file changed, 4 insertions(+), 17 deletions(-)

diff --git a/drivers/media/platform/qcom/venus/pm_helpers.c 
b/drivers/media/platform/qcom/venus/pm_helpers.c
index 59cbd6c39450..9684c25558ef 100644
--- a/drivers/media/platform/qcom/venus/pm_helpers.c
+++ b/drivers/media/platform/qcom/venus/pm_helpers.c
@@ -871,31 +871,23 @@ static int core_get_v4(struct device *dev)
if (legacy_binding)
return 0;
 
-   core->opp_table = dev_pm_opp_set_clkname(dev, "core");
+   core->opp_table = devm_pm_opp_set_clkname(dev, "core");
if (IS_ERR(core->opp_table))
return PTR_ERR(core->opp_table);
 
if (core->res->opp_pmdomain) {
-   ret = dev_pm_opp_of_add_table(dev);
+   ret = devm_pm_opp_of_add_table(dev);
if (!ret) {
core->has_opp_table = true;
} else if (ret != -ENODEV) {
dev_err(dev, "invalid OPP table in device tree\n");
return ret;
} else {
-   dev_pm_opp_put_clkname(core->opp_table);
+   devm_pm_opp_put_clkname(dev, core->opp_table);
}
}
 
-   ret = vcodec_domains_get(dev);
-   if (ret) {
-   if (core->has_opp_table)
-   dev_pm_opp_of_remove_table(dev);
-   dev_pm_opp_put_clkname(core->opp_table);
-   return ret;
-   }
-
-   return 0;
+   return vcodec_domains_get(dev);
 }
 
 static void core_put_v4(struct device *dev)
@@ -906,11 +898,6 @@ static void core_put_v4(struct device *dev)
return;
 
vcodec_domains_put(dev);
-
-   if (core->has_opp_table)
-   dev_pm_opp_of_remove_table(dev);
-   dev_pm_opp_put_clkname(core->opp_table);
-
 }
 
 static int core_power_v4(struct device *dev, int on)
-- 
2.25.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 13/31] spi: spi-qcom-qspi: fix potential mem leak in qcom_qspi_probe()

2021-01-04 Thread Yangtao Li
We should use dev_pm_opp_put_clkname() to free opp table each time
dev_pm_opp_of_add_table() got error.

Signed-off-by: Yangtao Li 
---
 drivers/spi/spi-qcom-qspi.c | 11 ++-
 1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/drivers/spi/spi-qcom-qspi.c b/drivers/spi/spi-qcom-qspi.c
index 8863be370884..915ae115d8c1 100644
--- a/drivers/spi/spi-qcom-qspi.c
+++ b/drivers/spi/spi-qcom-qspi.c
@@ -536,9 +536,12 @@ static int qcom_qspi_probe(struct platform_device *pdev)
return PTR_ERR(ctrl->opp_table);
/* OPP table is optional */
ret = dev_pm_opp_of_add_table(>dev);
-   if (ret && ret != -ENODEV) {
-   dev_err(>dev, "invalid OPP table in device tree\n");
-   goto exit_probe_put_clkname;
+   if (ret) {
+   dev_pm_opp_put_clkname(ctrl->opp_table);
+   if (ret != -ENODEV) {
+   dev_err(>dev, "invalid OPP table in device 
tree\n");
+   return ret;
+   }
}
 
pm_runtime_use_autosuspend(dev);
@@ -551,8 +554,6 @@ static int qcom_qspi_probe(struct platform_device *pdev)
 
pm_runtime_disable(dev);
dev_pm_opp_of_remove_table(>dev);
-
-exit_probe_put_clkname:
dev_pm_opp_put_clkname(ctrl->opp_table);
 
return ret;
-- 
2.25.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 04/31] opp: Add devres wrapper for dev_pm_opp_of_add_table

2021-01-04 Thread Yangtao Li
Add devres wrapper for dev_pm_opp_of_add_table() to simplify driver
code.

Signed-off-by: Yangtao Li 
---
 drivers/opp/of.c   | 36 
 include/linux/pm_opp.h |  6 ++
 2 files changed, 42 insertions(+)

diff --git a/drivers/opp/of.c b/drivers/opp/of.c
index 03cb387236c4..50df483c7dc3 100644
--- a/drivers/opp/of.c
+++ b/drivers/opp/of.c
@@ -998,6 +998,42 @@ int dev_pm_opp_of_add_table(struct device *dev)
 }
 EXPORT_SYMBOL_GPL(dev_pm_opp_of_add_table);
 
+static void devm_pm_opp_of_table_release(void *data)
+{
+   dev_pm_opp_of_remove_table(data);
+}
+
+/**
+ * devm_pm_opp_of_add_table() - Initialize opp table from device tree
+ * @dev:   device pointer used to lookup OPP table.
+ *
+ * Register the initial OPP table with the OPP library for given device.
+ *
+ * The opp_table structure will be freed after the device is destroyed.
+ *
+ * Return:
+ * 0   On success OR
+ * Duplicate OPPs (both freq and volt are same) and opp->available
+ * -EEXIST Freq are same and volt are different OR
+ * Duplicate OPPs (both freq and volt are same) and !opp->available
+ * -ENOMEM Memory allocation failure
+ * -ENODEV when 'operating-points' property is not found or is invalid data
+ * in device node.
+ * -ENODATAwhen empty 'operating-points' property is found
+ * -EINVAL when invalid entries are found in opp-v2 table
+ */
+int devm_pm_opp_of_add_table(struct device *dev)
+{
+   int ret;
+
+   ret = dev_pm_opp_of_add_table(dev);
+   if (ret)
+   return ret;
+
+   return devm_add_action_or_reset(dev, devm_pm_opp_of_table_release, dev);
+}
+EXPORT_SYMBOL_GPL(devm_pm_opp_of_add_table);
+
 /**
  * dev_pm_opp_of_add_table_indexed() - Initialize indexed opp table from 
device tree
  * @dev:   device pointer used to lookup OPP table.
diff --git a/include/linux/pm_opp.h b/include/linux/pm_opp.h
index e5260fc82ba1..e8bdac5f9555 100644
--- a/include/linux/pm_opp.h
+++ b/include/linux/pm_opp.h
@@ -398,6 +398,7 @@ static inline void dev_pm_opp_cpumask_remove_table(const 
struct cpumask *cpumask
 int dev_pm_opp_of_add_table(struct device *dev);
 int dev_pm_opp_of_add_table_indexed(struct device *dev, int index);
 void dev_pm_opp_of_remove_table(struct device *dev);
+int devm_pm_opp_of_add_table(struct device *dev);
 int dev_pm_opp_of_cpumask_add_table(const struct cpumask *cpumask);
 void dev_pm_opp_of_cpumask_remove_table(const struct cpumask *cpumask);
 int dev_pm_opp_of_get_sharing_cpus(struct device *cpu_dev, struct cpumask 
*cpumask);
@@ -425,6 +426,11 @@ static inline void dev_pm_opp_of_remove_table(struct 
device *dev)
 {
 }
 
+static inline int devm_pm_opp_of_add_table(struct device *dev)
+{
+   return -ENOTSUPP;
+}
+
 static inline int dev_pm_opp_of_cpumask_add_table(const struct cpumask 
*cpumask)
 {
return -ENOTSUPP;
-- 
2.25.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 17/31] drm/lima: convert to use devm_pm_opp_* API

2021-01-04 Thread Yangtao Li
Use devm_pm_opp_* API to simplify code, and remove opp_table
from lima_devfreq.

Signed-off-by: Yangtao Li 
---
 drivers/gpu/drm/lima/lima_devfreq.c | 40 -
 drivers/gpu/drm/lima/lima_devfreq.h |  2 --
 2 files changed, 10 insertions(+), 32 deletions(-)

diff --git a/drivers/gpu/drm/lima/lima_devfreq.c 
b/drivers/gpu/drm/lima/lima_devfreq.c
index 5686ad4aaf7c..d5937cf86504 100644
--- a/drivers/gpu/drm/lima/lima_devfreq.c
+++ b/drivers/gpu/drm/lima/lima_devfreq.c
@@ -99,13 +99,6 @@ void lima_devfreq_fini(struct lima_device *ldev)
devm_devfreq_remove_device(ldev->dev, devfreq->devfreq);
devfreq->devfreq = NULL;
}
-
-   dev_pm_opp_of_remove_table(ldev->dev);
-
-   dev_pm_opp_put_regulators(devfreq->regulators_opp_table);
-   dev_pm_opp_put_clkname(devfreq->clkname_opp_table);
-   devfreq->regulators_opp_table = NULL;
-   devfreq->clkname_opp_table = NULL;
 }
 
 int lima_devfreq_init(struct lima_device *ldev)
@@ -125,15 +118,11 @@ int lima_devfreq_init(struct lima_device *ldev)
 
spin_lock_init(>lock);
 
-   opp_table = dev_pm_opp_set_clkname(dev, "core");
-   if (IS_ERR(opp_table)) {
-   ret = PTR_ERR(opp_table);
-   goto err_fini;
-   }
-
-   ldevfreq->clkname_opp_table = opp_table;
+   opp_table = devm_pm_opp_set_clkname(dev, "core");
+   if (IS_ERR(opp_table))
+   return PTR_ERR(opp_table);
 
-   opp_table = dev_pm_opp_set_regulators(dev,
+   opp_table = devm_pm_opp_set_regulators(dev,
  (const char *[]){ "mali" },
  1);
if (IS_ERR(opp_table)) {
@@ -141,24 +130,20 @@ int lima_devfreq_init(struct lima_device *ldev)
 
/* Continue if the optional regulator is missing */
if (ret != -ENODEV)
-   goto err_fini;
-   } else {
-   ldevfreq->regulators_opp_table = opp_table;
+   return ret;
}
 
-   ret = dev_pm_opp_of_add_table(dev);
+   ret = devm_pm_opp_of_add_table(dev);
if (ret)
-   goto err_fini;
+   return ret;
 
lima_devfreq_reset(ldevfreq);
 
cur_freq = clk_get_rate(ldev->clk_gpu);
 
opp = devfreq_recommended_opp(dev, _freq, 0);
-   if (IS_ERR(opp)) {
-   ret = PTR_ERR(opp);
-   goto err_fini;
-   }
+   if (IS_ERR(opp))
+   return PTR_ERR(opp);
 
lima_devfreq_profile.initial_freq = cur_freq;
dev_pm_opp_put(opp);
@@ -167,8 +152,7 @@ int lima_devfreq_init(struct lima_device *ldev)
  DEVFREQ_GOV_SIMPLE_ONDEMAND, NULL);
if (IS_ERR(devfreq)) {
dev_err(dev, "Couldn't initialize GPU devfreq\n");
-   ret = PTR_ERR(devfreq);
-   goto err_fini;
+   return PTR_ERR(devfreq);
}
 
ldevfreq->devfreq = devfreq;
@@ -180,10 +164,6 @@ int lima_devfreq_init(struct lima_device *ldev)
ldevfreq->cooling = cooling;
 
return 0;
-
-err_fini:
-   lima_devfreq_fini(ldev);
-   return ret;
 }
 
 void lima_devfreq_record_busy(struct lima_devfreq *devfreq)
diff --git a/drivers/gpu/drm/lima/lima_devfreq.h 
b/drivers/gpu/drm/lima/lima_devfreq.h
index 2d9b3008ce77..c3bcae76ca07 100644
--- a/drivers/gpu/drm/lima/lima_devfreq.h
+++ b/drivers/gpu/drm/lima/lima_devfreq.h
@@ -15,8 +15,6 @@ struct lima_device;
 
 struct lima_devfreq {
struct devfreq *devfreq;
-   struct opp_table *clkname_opp_table;
-   struct opp_table *regulators_opp_table;
struct thermal_cooling_device *cooling;
 
ktime_t busy_time;
-- 
2.25.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 10/31] qcom-geni-se: remove opp_table

2021-01-04 Thread Yangtao Li
opp_table isn't used anymore, remove it.

Signed-off-by: Yangtao Li 
---
 include/linux/qcom-geni-se.h | 2 --
 1 file changed, 2 deletions(-)

diff --git a/include/linux/qcom-geni-se.h b/include/linux/qcom-geni-se.h
index ec2ad4b0fe14..cddef864a760 100644
--- a/include/linux/qcom-geni-se.h
+++ b/include/linux/qcom-geni-se.h
@@ -47,7 +47,6 @@ struct geni_icc_path {
  * @num_clk_levels:Number of valid clock levels in clk_perf_tbl
  * @clk_perf_tbl:  Table of clock frequency input to serial engine clock
  * @icc_paths: Array of ICC paths for SE
- * @opp_table: Pointer to the OPP table
  */
 struct geni_se {
void __iomem *base;
@@ -57,7 +56,6 @@ struct geni_se {
unsigned int num_clk_levels;
unsigned long *clk_perf_tbl;
struct geni_icc_path icc_paths[3];
-   struct opp_table *opp_table;
 };
 
 /* Common SE registers */
-- 
2.25.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 30/31] PM / devfreq: exynos: convert to use devm_pm_opp_* API

2021-01-04 Thread Yangtao Li
Use devm_pm_opp_* API to simplify code, and remove opp_table
from exynos_bus.

Signed-off-by: Yangtao Li 
---
 drivers/devfreq/exynos-bus.c | 42 
 1 file changed, 9 insertions(+), 33 deletions(-)

diff --git a/drivers/devfreq/exynos-bus.c b/drivers/devfreq/exynos-bus.c
index e689101abc93..51752e5ce980 100644
--- a/drivers/devfreq/exynos-bus.c
+++ b/drivers/devfreq/exynos-bus.c
@@ -33,7 +33,6 @@ struct exynos_bus {
 
unsigned long curr_freq;
 
-   struct opp_table *opp_table;
struct clk *clk;
unsigned int ratio;
 };
@@ -159,10 +158,7 @@ static void exynos_bus_exit(struct device *dev)
 
platform_device_unregister(bus->icc_pdev);
 
-   dev_pm_opp_of_remove_table(dev);
clk_disable_unprepare(bus->clk);
-   dev_pm_opp_put_regulators(bus->opp_table);
-   bus->opp_table = NULL;
 }
 
 static void exynos_bus_passive_exit(struct device *dev)
@@ -171,7 +167,6 @@ static void exynos_bus_passive_exit(struct device *dev)
 
platform_device_unregister(bus->icc_pdev);
 
-   dev_pm_opp_of_remove_table(dev);
clk_disable_unprepare(bus->clk);
 }
 
@@ -183,15 +178,13 @@ static int exynos_bus_parent_parse_of(struct device_node 
*np,
const char *vdd = "vdd";
int i, ret, count, size;
 
-   opp_table = dev_pm_opp_set_regulators(dev, , 1);
+   opp_table = devm_pm_opp_set_regulators(dev, , 1);
if (IS_ERR(opp_table)) {
ret = PTR_ERR(opp_table);
dev_err(dev, "failed to set regulators %d\n", ret);
return ret;
}
 
-   bus->opp_table = opp_table;
-
/*
 * Get the devfreq-event devices to get the current utilization of
 * buses. This raw data will be used in devfreq ondemand governor.
@@ -199,25 +192,20 @@ static int exynos_bus_parent_parse_of(struct device_node 
*np,
count = devfreq_event_get_edev_count(dev, "devfreq-events");
if (count < 0) {
dev_err(dev, "failed to get the count of devfreq-event dev\n");
-   ret = count;
-   goto err_regulator;
+   return count;
}
bus->edev_count = count;
 
size = sizeof(*bus->edev) * count;
bus->edev = devm_kzalloc(dev, size, GFP_KERNEL);
-   if (!bus->edev) {
-   ret = -ENOMEM;
-   goto err_regulator;
-   }
+   if (!bus->edev)
+   return -ENOMEM;
 
for (i = 0; i < count; i++) {
bus->edev[i] = devfreq_event_get_edev_by_phandle(dev,
"devfreq-events", i);
-   if (IS_ERR(bus->edev[i])) {
-   ret = -EPROBE_DEFER;
-   goto err_regulator;
-   }
+   if (IS_ERR(bus->edev[i]))
+   return -EPROBE_DEFER;
}
 
/*
@@ -234,12 +222,6 @@ static int exynos_bus_parent_parse_of(struct device_node 
*np,
bus->ratio = DEFAULT_SATURATION_RATIO;
 
return 0;
-
-err_regulator:
-   dev_pm_opp_put_regulators(bus->opp_table);
-   bus->opp_table = NULL;
-
-   return ret;
 }
 
 static int exynos_bus_parse_of(struct device_node *np,
@@ -264,7 +246,7 @@ static int exynos_bus_parse_of(struct device_node *np,
}
 
/* Get the freq and voltage from OPP table to scale the bus freq */
-   ret = dev_pm_opp_of_add_table(dev);
+   ret = devm_pm_opp_of_add_table(dev);
if (ret < 0) {
dev_err(dev, "failed to get OPP table\n");
goto err_clk;
@@ -276,15 +258,13 @@ static int exynos_bus_parse_of(struct device_node *np,
if (IS_ERR(opp)) {
dev_err(dev, "failed to find dev_pm_opp\n");
ret = PTR_ERR(opp);
-   goto err_opp;
+   goto err_clk;
}
bus->curr_freq = dev_pm_opp_get_freq(opp);
dev_pm_opp_put(opp);
 
return 0;
 
-err_opp:
-   dev_pm_opp_of_remove_table(dev);
 err_clk:
clk_disable_unprepare(bus->clk);
 
@@ -425,7 +405,7 @@ static int exynos_bus_probe(struct platform_device *pdev)
/* Parse the device-tree to get the resource information */
ret = exynos_bus_parse_of(np, bus);
if (ret < 0)
-   goto err_reg;
+   return ret;
 
if (passive)
ret = exynos_bus_profile_init_passive(bus, profile);
@@ -456,11 +436,7 @@ static int exynos_bus_probe(struct platform_device *pdev)
return 0;
 
 err:
-   dev_pm_opp_of_remove_table(dev);
clk_disable_unprepare(bus->clk);
-err_reg:
-   dev_pm_opp_put_regulators(bus->opp_table);
-   bus->opp_table = NULL;
 
return ret;
 }
-- 
2.25.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 11/31] mmc: sdhci-msm: fix potential mem leak in sdhci_msm_probe()

2021-01-04 Thread Yangtao Li
We should use dev_pm_opp_put_clkname() to free opp table each time
dev_pm_opp_of_add_table() got error.

Signed-off-by: Yangtao Li 
---
 drivers/mmc/host/sdhci-msm.c | 10 ++
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/drivers/mmc/host/sdhci-msm.c b/drivers/mmc/host/sdhci-msm.c
index 9c7927b03253..094ef95f5ecc 100644
--- a/drivers/mmc/host/sdhci-msm.c
+++ b/drivers/mmc/host/sdhci-msm.c
@@ -2291,9 +2291,12 @@ static int sdhci_msm_probe(struct platform_device *pdev)
 
/* OPP table is optional */
ret = dev_pm_opp_of_add_table(>dev);
-   if (ret && ret != -ENODEV) {
-   dev_err(>dev, "Invalid OPP table in Device tree\n");
-   goto opp_put_clkname;
+   if (ret) {
+   dev_pm_opp_put_clkname(msm_host->opp_table);
+   if (ret != -ENODEV) {
+   dev_err(>dev, "Invalid OPP table in Device 
tree\n");
+   goto bus_clk_disable;
+   }
}
 
/* Vote for maximum clock rate for maximum performance */
@@ -2461,7 +2464,6 @@ static int sdhci_msm_probe(struct platform_device *pdev)
   msm_host->bulk_clks);
 opp_cleanup:
dev_pm_opp_of_remove_table(>dev);
-opp_put_clkname:
dev_pm_opp_put_clkname(msm_host->opp_table);
 bus_clk_disable:
if (!IS_ERR(msm_host->bus_clk))
-- 
2.25.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 20/31] media: venus: fix error check in core_get_v4()

2021-01-04 Thread Yangtao Li
Don't call dev_pm_opp_put_clkname() when got invalid OPP table
in device tree, since we do this in core_put_v4().

Signed-off-by: Yangtao Li 
---
 drivers/media/platform/qcom/venus/pm_helpers.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/media/platform/qcom/venus/pm_helpers.c 
b/drivers/media/platform/qcom/venus/pm_helpers.c
index a3850261d697..59cbd6c39450 100644
--- a/drivers/media/platform/qcom/venus/pm_helpers.c
+++ b/drivers/media/platform/qcom/venus/pm_helpers.c
@@ -881,8 +881,9 @@ static int core_get_v4(struct device *dev)
core->has_opp_table = true;
} else if (ret != -ENODEV) {
dev_err(dev, "invalid OPP table in device tree\n");
-   dev_pm_opp_put_clkname(core->opp_table);
return ret;
+   } else {
+   dev_pm_opp_put_clkname(core->opp_table);
}
}
 
-- 
2.25.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 31/31] PM / devfreq: convert to devm_pm_opp_register_notifier and remove unused API

2021-01-04 Thread Yangtao Li
 Use devm_pm_opp_* API to simplify code.

Signed-off-by: Yangtao Li 
---
 drivers/devfreq/devfreq.c | 66 +--
 include/linux/devfreq.h   | 23 --
 2 files changed, 1 insertion(+), 88 deletions(-)

diff --git a/drivers/devfreq/devfreq.c b/drivers/devfreq/devfreq.c
index 6aa10de792b3..f593f30529ec 100644
--- a/drivers/devfreq/devfreq.c
+++ b/drivers/devfreq/devfreq.c
@@ -2004,40 +2004,6 @@ struct dev_pm_opp *devfreq_recommended_opp(struct device 
*dev,
 }
 EXPORT_SYMBOL(devfreq_recommended_opp);
 
-/**
- * devfreq_register_opp_notifier() - Helper function to get devfreq notified
- *  for any changes in the OPP availability
- *  changes
- * @dev:   The devfreq user device. (parent of devfreq)
- * @devfreq:   The devfreq object.
- */
-int devfreq_register_opp_notifier(struct device *dev, struct devfreq *devfreq)
-{
-   return dev_pm_opp_register_notifier(dev, >nb);
-}
-EXPORT_SYMBOL(devfreq_register_opp_notifier);
-
-/**
- * devfreq_unregister_opp_notifier() - Helper function to stop getting devfreq
- *notified for any changes in the OPP
- *availability changes anymore.
- * @dev:   The devfreq user device. (parent of devfreq)
- * @devfreq:   The devfreq object.
- *
- * At exit() callback of devfreq_dev_profile, this must be included if
- * devfreq_recommended_opp is used.
- */
-int devfreq_unregister_opp_notifier(struct device *dev, struct devfreq 
*devfreq)
-{
-   return dev_pm_opp_unregister_notifier(dev, >nb);
-}
-EXPORT_SYMBOL(devfreq_unregister_opp_notifier);
-
-static void devm_devfreq_opp_release(struct device *dev, void *res)
-{
-   devfreq_unregister_opp_notifier(dev, *(struct devfreq **)res);
-}
-
 /**
  * devm_devfreq_register_opp_notifier() - Resource-managed
  *   devfreq_register_opp_notifier()
@@ -2047,40 +2013,10 @@ static void devm_devfreq_opp_release(struct device 
*dev, void *res)
 int devm_devfreq_register_opp_notifier(struct device *dev,
   struct devfreq *devfreq)
 {
-   struct devfreq **ptr;
-   int ret;
-
-   ptr = devres_alloc(devm_devfreq_opp_release, sizeof(*ptr), GFP_KERNEL);
-   if (!ptr)
-   return -ENOMEM;
-
-   ret = devfreq_register_opp_notifier(dev, devfreq);
-   if (ret) {
-   devres_free(ptr);
-   return ret;
-   }
-
-   *ptr = devfreq;
-   devres_add(dev, ptr);
-
-   return 0;
+   return devm_pm_opp_register_notifier(dev, >nb);
 }
 EXPORT_SYMBOL(devm_devfreq_register_opp_notifier);
 
-/**
- * devm_devfreq_unregister_opp_notifier() - Resource-managed
- * devfreq_unregister_opp_notifier()
- * @dev:   The devfreq user device. (parent of devfreq)
- * @devfreq:   The devfreq object.
- */
-void devm_devfreq_unregister_opp_notifier(struct device *dev,
-struct devfreq *devfreq)
-{
-   WARN_ON(devres_release(dev, devm_devfreq_opp_release,
-  devm_devfreq_dev_match, devfreq));
-}
-EXPORT_SYMBOL(devm_devfreq_unregister_opp_notifier);
-
 /**
  * devfreq_register_notifier() - Register a driver with devfreq
  * @devfreq:   The devfreq object.
diff --git a/include/linux/devfreq.h b/include/linux/devfreq.h
index b6d3bae1c74d..aca2cc4f4fa4 100644
--- a/include/linux/devfreq.h
+++ b/include/linux/devfreq.h
@@ -230,14 +230,8 @@ int update_devfreq(struct devfreq *devfreq);
 /* Helper functions for devfreq user device driver with OPP. */
 struct dev_pm_opp *devfreq_recommended_opp(struct device *dev,
unsigned long *freq, u32 flags);
-int devfreq_register_opp_notifier(struct device *dev,
-   struct devfreq *devfreq);
-int devfreq_unregister_opp_notifier(struct device *dev,
-   struct devfreq *devfreq);
 int devm_devfreq_register_opp_notifier(struct device *dev,
struct devfreq *devfreq);
-void devm_devfreq_unregister_opp_notifier(struct device *dev,
-   struct devfreq *devfreq);
 int devfreq_register_notifier(struct devfreq *devfreq,
struct notifier_block *nb,
unsigned int list);
@@ -355,29 +349,12 @@ static inline struct dev_pm_opp 
*devfreq_recommended_opp(struct device *dev,
return ERR_PTR(-EINVAL);
 }
 
-static inline int devfreq_register_opp_notifier(struct device *dev,
-   struct devfreq *devfreq)
-{
-   return -EINVAL;
-}
-
-static inline int devfreq_unregister_opp_notifier(struct device *dev,
-   struct devfreq *devfreq)
-{
-   return -EINVAL;
-}
-
 static inline int devm_devfreq_register_opp_notifier(struct de

[PATCH 09/31] spi: spi-qcom-qspi: fix potential mem leak in spi_geni_probe()

2021-01-04 Thread Yangtao Li
Use devm_pm_opp_* API to simplify code, and we don't need
to make opp_table glabal.

Let's remove opp_table from geni_se later.

Signed-off-by: Yangtao Li 
---
 drivers/spi/spi-geni-qcom.c | 15 ++-
 1 file changed, 6 insertions(+), 9 deletions(-)

diff --git a/drivers/spi/spi-geni-qcom.c b/drivers/spi/spi-geni-qcom.c
index 2b5a164fecb9..e330c46a9243 100644
--- a/drivers/spi/spi-geni-qcom.c
+++ b/drivers/spi/spi-geni-qcom.c
@@ -590,6 +590,7 @@ static int spi_geni_probe(struct platform_device *pdev)
void __iomem *base;
struct clk *clk;
struct device *dev = >dev;
+   struct opp_table *opp_table;
 
irq = platform_get_irq(pdev, 0);
if (irq < 0)
@@ -615,13 +616,13 @@ static int spi_geni_probe(struct platform_device *pdev)
mas->se.wrapper = dev_get_drvdata(dev->parent);
mas->se.base = base;
mas->se.clk = clk;
-   mas->se.opp_table = dev_pm_opp_set_clkname(>dev, "se");
-   if (IS_ERR(mas->se.opp_table))
-   return PTR_ERR(mas->se.opp_table);
+   opp_table = devm_pm_opp_set_clkname(dev, "se");
+   if (IS_ERR(opp_table))
+   return PTR_ERR(opp_table);
/* OPP table is optional */
-   ret = dev_pm_opp_of_add_table(>dev);
+   ret = devm_pm_opp_of_add_table(dev);
if (ret) {
-   dev_pm_opp_put_clkname(mas->se.opp_table);
+   devm_pm_opp_put_clkname(dev, opp_table);
if (ret != -ENODEV) {
dev_err(>dev, "invalid OPP table in device 
tree\n");
return ret;
@@ -677,8 +678,6 @@ static int spi_geni_probe(struct platform_device *pdev)
free_irq(mas->irq, spi);
 spi_geni_probe_runtime_disable:
pm_runtime_disable(dev);
-   dev_pm_opp_of_remove_table(>dev);
-   dev_pm_opp_put_clkname(mas->se.opp_table);
return ret;
 }
 
@@ -692,8 +691,6 @@ static int spi_geni_remove(struct platform_device *pdev)
 
free_irq(mas->irq, spi);
pm_runtime_disable(>dev);
-   dev_pm_opp_of_remove_table(>dev);
-   dev_pm_opp_put_clkname(mas->se.opp_table);
return 0;
 }
 
-- 
2.25.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 05/31] opp: Add devres wrapper for dev_pm_opp_register_notifier

2021-01-04 Thread Yangtao Li
Add devres wrapper for dev_pm_opp_register_notifier() to simplify driver
code.

Signed-off-by: Yangtao Li 
---
 drivers/opp/core.c | 38 ++
 include/linux/pm_opp.h |  6 ++
 2 files changed, 44 insertions(+)

diff --git a/drivers/opp/core.c b/drivers/opp/core.c
index 6b83e373f0d8..ef3544f8cecd 100644
--- a/drivers/opp/core.c
+++ b/drivers/opp/core.c
@@ -2599,6 +2599,44 @@ int dev_pm_opp_unregister_notifier(struct device *dev,
 }
 EXPORT_SYMBOL(dev_pm_opp_unregister_notifier);
 
+static void devm_pm_opp_notifier_release(struct device *dev, void *res)
+{
+   struct notifier_block *nb = *(struct notifier_block **)res;
+
+   WARN_ON(dev_pm_opp_unregister_notifier(dev, nb));
+}
+
+/**
+ * devm_pm_opp_register_notifier() - Register OPP notifier for the device
+ * @dev:   Device for which notifier needs to be registered
+ * @nb:Notifier block to be registered
+ *
+ * Return: 0 on success or a negative error value.
+ *
+ * The notifier will be unregistered after the device is destroyed.
+ */
+int devm_pm_opp_register_notifier(struct device *dev, struct notifier_block 
*nb)
+{
+   struct notifier_block **ptr;
+   int ret;
+
+   ptr = devres_alloc(devm_pm_opp_notifier_release, sizeof(*ptr), 
GFP_KERNEL);
+   if (!ptr)
+   return -ENOMEM;
+
+   ret = dev_pm_opp_register_notifier(dev, nb);
+   if (ret) {
+   devres_free(ptr);
+   return ret;
+   }
+
+   *ptr = nb;
+   devres_add(dev, ptr);
+
+   return 0;
+}
+EXPORT_SYMBOL(devm_pm_opp_register_notifier);
+
 /**
  * dev_pm_opp_remove_table() - Free all OPPs associated with the device
  * @dev:   device pointer used to lookup OPP table.
diff --git a/include/linux/pm_opp.h b/include/linux/pm_opp.h
index e8bdac5f9555..c24bd34339d7 100644
--- a/include/linux/pm_opp.h
+++ b/include/linux/pm_opp.h
@@ -136,6 +136,7 @@ int dev_pm_opp_disable(struct device *dev, unsigned long 
freq);
 
 int dev_pm_opp_register_notifier(struct device *dev, struct notifier_block 
*nb);
 int dev_pm_opp_unregister_notifier(struct device *dev, struct notifier_block 
*nb);
+int devm_pm_opp_register_notifier(struct device *dev, struct notifier_block 
*nb);
 
 struct opp_table *dev_pm_opp_set_supported_hw(struct device *dev, const u32 
*versions, unsigned int count);
 void dev_pm_opp_put_supported_hw(struct opp_table *opp_table);
@@ -288,6 +289,11 @@ static inline int dev_pm_opp_register_notifier(struct 
device *dev, struct notifi
return -ENOTSUPP;
 }
 
+static inline int devm_pm_opp_register_notifier(struct device *dev, struct 
notifier_block *nb)
+{
+   return -ENOTSUPP;
+}
+
 static inline int dev_pm_opp_unregister_notifier(struct device *dev, struct 
notifier_block *nb)
 {
return -ENOTSUPP;
-- 
2.25.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 07/31] serial: qcom_geni_serial: convert to use devm_pm_opp_* API

2021-01-04 Thread Yangtao Li
Use devm_pm_opp_* API to simplify code, and we don't need
to make opp_table glabal.

Let's remove opp_table from geni_se later.

Signed-off-by: Yangtao Li 
---
 drivers/tty/serial/qcom_geni_serial.c | 23 +--
 1 file changed, 9 insertions(+), 14 deletions(-)

diff --git a/drivers/tty/serial/qcom_geni_serial.c 
b/drivers/tty/serial/qcom_geni_serial.c
index 5aada7ebae35..36a92df8ec11 100644
--- a/drivers/tty/serial/qcom_geni_serial.c
+++ b/drivers/tty/serial/qcom_geni_serial.c
@@ -1352,6 +1352,7 @@ static int qcom_geni_serial_probe(struct platform_device 
*pdev)
int irq;
bool console = false;
struct uart_driver *drv;
+   struct opp_table *opp_table;
 
if (of_device_is_compatible(pdev->dev.of_node, "qcom,geni-debug-uart"))
console = true;
@@ -1433,13 +1434,13 @@ static int qcom_geni_serial_probe(struct 
platform_device *pdev)
if (of_property_read_bool(pdev->dev.of_node, "cts-rts-swap"))
port->cts_rts_swap = true;
 
-   port->se.opp_table = dev_pm_opp_set_clkname(>dev, "se");
-   if (IS_ERR(port->se.opp_table))
-   return PTR_ERR(port->se.opp_table);
+   opp_table = devm_pm_opp_set_clkname(>dev, "se");
+   if (IS_ERR(opp_table))
+   return PTR_ERR(opp_table);
/* OPP table is optional */
-   ret = dev_pm_opp_of_add_table(>dev);
+   ret = devm_pm_opp_of_add_table(>dev);
if (ret) {
-   dev_pm_opp_put_clkname(port->se.opp_table);
+   devm_pm_opp_put_clkname(>dev, opp_table);
if (ret != -ENODEV) {
dev_err(>dev, "invalid OPP table in device 
tree\n");
return ret;
@@ -1453,7 +1454,7 @@ static int qcom_geni_serial_probe(struct platform_device 
*pdev)
 
ret = uart_add_one_port(drv, uport);
if (ret)
-   goto err;
+   return ret;
 
irq_set_status_flags(uport->irq, IRQ_NOAUTOEN);
ret = devm_request_irq(uport->dev, uport->irq, qcom_geni_serial_isr,
@@ -1461,7 +1462,7 @@ static int qcom_geni_serial_probe(struct platform_device 
*pdev)
if (ret) {
dev_err(uport->dev, "Failed to get IRQ ret %d\n", ret);
uart_remove_one_port(drv, uport);
-   goto err;
+   return ret;
}
 
/*
@@ -1478,15 +1479,11 @@ static int qcom_geni_serial_probe(struct 
platform_device *pdev)
if (ret) {
device_init_wakeup(>dev, false);
uart_remove_one_port(drv, uport);
-   goto err;
+   return ret;
}
}
 
return 0;
-err:
-   dev_pm_opp_of_remove_table(>dev);
-   dev_pm_opp_put_clkname(port->se.opp_table);
-   return ret;
 }
 
 static int qcom_geni_serial_remove(struct platform_device *pdev)
@@ -1494,8 +1491,6 @@ static int qcom_geni_serial_remove(struct platform_device 
*pdev)
struct qcom_geni_serial_port *port = platform_get_drvdata(pdev);
struct uart_driver *drv = port->private_data.drv;
 
-   dev_pm_opp_of_remove_table(>dev);
-   dev_pm_opp_put_clkname(port->se.opp_table);
dev_pm_clear_wake_irq(>dev);
device_init_wakeup(>dev, false);
uart_remove_one_port(drv, >uport);
-- 
2.25.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 14/31] spi: spi-qcom-qspi: convert to use devm_pm_opp_* API

2021-01-04 Thread Yangtao Li
Use devm_pm_opp_* API to simplify code, and remove opp_table
from qcom_qspi.

Signed-off-by: Yangtao Li 
---
 drivers/spi/spi-qcom-qspi.c | 16 ++--
 1 file changed, 6 insertions(+), 10 deletions(-)

diff --git a/drivers/spi/spi-qcom-qspi.c b/drivers/spi/spi-qcom-qspi.c
index 915ae115d8c1..1a1ab153ff59 100644
--- a/drivers/spi/spi-qcom-qspi.c
+++ b/drivers/spi/spi-qcom-qspi.c
@@ -142,7 +142,6 @@ struct qcom_qspi {
struct clk_bulk_data *clks;
struct qspi_xfer xfer;
struct icc_path *icc_path_cpu_to_qspi;
-   struct opp_table *opp_table;
unsigned long last_speed;
/* Lock to protect data accessed by IRQs */
spinlock_t lock;
@@ -459,6 +458,7 @@ static int qcom_qspi_probe(struct platform_device *pdev)
struct device *dev;
struct spi_master *master;
struct qcom_qspi *ctrl;
+   struct opp_table *opp_table;
 
dev = >dev;
 
@@ -531,13 +531,13 @@ static int qcom_qspi_probe(struct platform_device *pdev)
master->handle_err = qcom_qspi_handle_err;
master->auto_runtime_pm = true;
 
-   ctrl->opp_table = dev_pm_opp_set_clkname(>dev, "core");
-   if (IS_ERR(ctrl->opp_table))
-   return PTR_ERR(ctrl->opp_table);
+   opp_table = devm_pm_opp_set_clkname(dev, "core");
+   if (IS_ERR(opp_table))
+   return PTR_ERR(opp_table);
/* OPP table is optional */
-   ret = dev_pm_opp_of_add_table(>dev);
+   ret = devm_pm_opp_of_add_table(dev);
if (ret) {
-   dev_pm_opp_put_clkname(ctrl->opp_table);
+   devm_pm_opp_put_clkname(dev, opp_table);
if (ret != -ENODEV) {
dev_err(>dev, "invalid OPP table in device 
tree\n");
return ret;
@@ -553,8 +553,6 @@ static int qcom_qspi_probe(struct platform_device *pdev)
return 0;
 
pm_runtime_disable(dev);
-   dev_pm_opp_of_remove_table(>dev);
-   dev_pm_opp_put_clkname(ctrl->opp_table);
 
return ret;
 }
@@ -568,8 +566,6 @@ static int qcom_qspi_remove(struct platform_device *pdev)
spi_unregister_master(master);
 
pm_runtime_disable(>dev);
-   dev_pm_opp_of_remove_table(>dev);
-   dev_pm_opp_put_clkname(ctrl->opp_table);
 
return 0;
 }
-- 
2.25.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 15/31] drm/msm: fix potential mem leak

2021-01-04 Thread Yangtao Li
We should use dev_pm_opp_put_clkname() to free opp table each time
dev_pm_opp_of_add_table() got error.

Signed-off-by: Yangtao Li 
---
 drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 10 ++
 drivers/gpu/drm/msm/dsi/dsi_host.c  |  8 +---
 2 files changed, 11 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c 
b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
index 374b0e8471e6..6f19dfcb4965 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
@@ -1093,9 +1093,12 @@ static int dpu_bind(struct device *dev, struct device 
*master, void *data)
return PTR_ERR(dpu_kms->opp_table);
/* OPP table is optional */
ret = dev_pm_opp_of_add_table(dev);
-   if (ret && ret != -ENODEV) {
-   dev_err(dev, "invalid OPP table in device tree\n");
-   goto put_clkname;
+   if (ret) {
+   dev_pm_opp_put_clkname(dpu_kms->opp_table);
+   if (ret != -ENODEV) {
+   dev_err(dev, "invalid OPP table in device tree\n");
+   return ret;
+   }
}
 
mp = _kms->mp;
@@ -1122,7 +1125,6 @@ static int dpu_bind(struct device *dev, struct device 
*master, void *data)
return ret;
 err:
dev_pm_opp_of_remove_table(dev);
-put_clkname:
dev_pm_opp_put_clkname(dpu_kms->opp_table);
return ret;
 }
diff --git a/drivers/gpu/drm/msm/dsi/dsi_host.c 
b/drivers/gpu/drm/msm/dsi/dsi_host.c
index ab281cba0f08..a282307f2799 100644
--- a/drivers/gpu/drm/msm/dsi/dsi_host.c
+++ b/drivers/gpu/drm/msm/dsi/dsi_host.c
@@ -1891,10 +1891,12 @@ int msm_dsi_host_init(struct msm_dsi *msm_dsi)
return PTR_ERR(msm_host->opp_table);
/* OPP table is optional */
ret = dev_pm_opp_of_add_table(>dev);
-   if (ret && ret != -ENODEV) {
-   dev_err(>dev, "invalid OPP table in device tree\n");
+   if (ret) {
dev_pm_opp_put_clkname(msm_host->opp_table);
-   return ret;
+   if (ret != -ENODEV) {
+   dev_err(>dev, "invalid OPP table in device 
tree\n");
+   return ret;
+   }
}
 
init_completion(_host->dma_comp);
-- 
2.25.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 26/31] PM / devfreq: tegra30: convert to use devm_pm_opp_* API

2021-01-04 Thread Yangtao Li
Use devm_pm_opp_* API to simplify code, and remove opp_table
from tegra_devfreq.

Signed-off-by: Yangtao Li 
---
 drivers/devfreq/tegra30-devfreq.c | 21 +++--
 1 file changed, 7 insertions(+), 14 deletions(-)

diff --git a/drivers/devfreq/tegra30-devfreq.c 
b/drivers/devfreq/tegra30-devfreq.c
index 117cad7968ab..4984cb91e9ea 100644
--- a/drivers/devfreq/tegra30-devfreq.c
+++ b/drivers/devfreq/tegra30-devfreq.c
@@ -178,7 +178,6 @@ struct tegra_devfreq_soc_data {
 
 struct tegra_devfreq {
struct devfreq  *devfreq;
-   struct opp_table*opp_table;
 
struct reset_control*reset;
struct clk  *clock;
@@ -794,6 +793,7 @@ static int tegra_devfreq_probe(struct platform_device *pdev)
struct tegra_devfreq_device *dev;
struct tegra_devfreq *tegra;
struct devfreq *devfreq;
+   struct opp_tabl *opp_table;
unsigned int i;
long rate;
int err;
@@ -841,25 +841,25 @@ static int tegra_devfreq_probe(struct platform_device 
*pdev)
return err;
}
 
-   tegra->opp_table = dev_pm_opp_set_supported_hw(>dev,
-  _version, 1);
-   err = PTR_ERR_OR_ZERO(tegra->opp_table);
+   opp_table = devm_pm_opp_set_supported_hw(>dev,
+_version, 1);
+   err = PTR_ERR_OR_ZERO(opp_table);
if (err) {
dev_err(>dev, "Failed to set supported HW: %d\n", err);
return err;
}
 
-   err = dev_pm_opp_of_add_table(>dev);
+   err = devm_pm_opp_of_add_table(>dev);
if (err) {
dev_err(>dev, "Failed to add OPP table: %d\n", err);
-   goto put_hw;
+   return err;
}
 
err = clk_prepare_enable(tegra->clock);
if (err) {
dev_err(>dev,
"Failed to prepare and enable ACTMON clock\n");
-   goto remove_table;
+   return err;
}
 
err = reset_control_reset(tegra->reset);
@@ -917,10 +917,6 @@ static int tegra_devfreq_probe(struct platform_device 
*pdev)
reset_control_reset(tegra->reset);
 disable_clk:
clk_disable_unprepare(tegra->clock);
-remove_table:
-   dev_pm_opp_of_remove_table(>dev);
-put_hw:
-   dev_pm_opp_put_supported_hw(tegra->opp_table);
 
return err;
 }
@@ -935,9 +931,6 @@ static int tegra_devfreq_remove(struct platform_device 
*pdev)
reset_control_reset(tegra->reset);
clk_disable_unprepare(tegra->clock);
 
-   dev_pm_opp_of_remove_table(>dev);
-   dev_pm_opp_put_supported_hw(tegra->opp_table);
-
return 0;
 }
 
-- 
2.25.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 08/31] spi: spi-qcom-qspi: fix potential mem leak in spi_geni_probe()

2021-01-04 Thread Yangtao Li
We should use dev_pm_opp_put_clkname() to free opp table each time
dev_pm_opp_of_add_table() got error.

Signed-off-by: Yangtao Li 
---
 drivers/spi/spi-geni-qcom.c | 10 ++
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/drivers/spi/spi-geni-qcom.c b/drivers/spi/spi-geni-qcom.c
index 512e925d5ea4..2b5a164fecb9 100644
--- a/drivers/spi/spi-geni-qcom.c
+++ b/drivers/spi/spi-geni-qcom.c
@@ -620,9 +620,12 @@ static int spi_geni_probe(struct platform_device *pdev)
return PTR_ERR(mas->se.opp_table);
/* OPP table is optional */
ret = dev_pm_opp_of_add_table(>dev);
-   if (ret && ret != -ENODEV) {
-   dev_err(>dev, "invalid OPP table in device tree\n");
-   goto put_clkname;
+   if (ret) {
+   dev_pm_opp_put_clkname(mas->se.opp_table);
+   if (ret != -ENODEV) {
+   dev_err(>dev, "invalid OPP table in device 
tree\n");
+   return ret;
+   }
}
 
spi->bus_num = -1;
@@ -675,7 +678,6 @@ static int spi_geni_probe(struct platform_device *pdev)
 spi_geni_probe_runtime_disable:
pm_runtime_disable(dev);
dev_pm_opp_of_remove_table(>dev);
-put_clkname:
dev_pm_opp_put_clkname(mas->se.opp_table);
return ret;
 }
-- 
2.25.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 23/31] memory: samsung: exynos5422-dmc: convert to use devm_pm_opp_* API

2021-01-04 Thread Yangtao Li
Use devm_pm_opp_* API to simplify code.

Signed-off-by: Yangtao Li 
---
 drivers/memory/samsung/exynos5422-dmc.c | 21 +
 1 file changed, 5 insertions(+), 16 deletions(-)

diff --git a/drivers/memory/samsung/exynos5422-dmc.c 
b/drivers/memory/samsung/exynos5422-dmc.c
index 62a83633f837..cab9fd74322b 100644
--- a/drivers/memory/samsung/exynos5422-dmc.c
+++ b/drivers/memory/samsung/exynos5422-dmc.c
@@ -343,7 +343,7 @@ static int exynos5_init_freq_table(struct exynos5_dmc *dmc,
int idx;
unsigned long freq;
 
-   ret = dev_pm_opp_of_add_table(dmc->dev);
+   ret = devm_pm_opp_of_add_table(dmc->dev);
if (ret < 0) {
dev_err(dmc->dev, "Failed to get OPP table\n");
return ret;
@@ -353,20 +353,16 @@ static int exynos5_init_freq_table(struct exynos5_dmc 
*dmc,
 
dmc->opp = devm_kmalloc_array(dmc->dev, dmc->opp_count,
  sizeof(struct dmc_opp_table), GFP_KERNEL);
-   if (!dmc->opp) {
-   ret = -ENOMEM;
-   goto err_opp;
-   }
+   if (!dmc->opp)
+   return -ENOMEM;
 
idx = dmc->opp_count - 1;
for (i = 0, freq = ULONG_MAX; i < dmc->opp_count; i++, freq--) {
struct dev_pm_opp *opp;
 
opp = dev_pm_opp_find_freq_floor(dmc->dev, );
-   if (IS_ERR(opp)) {
-   ret = PTR_ERR(opp);
-   goto err_opp;
-   }
+   if (IS_ERR(opp))
+   return PTR_ERR(opp);
 
dmc->opp[idx - i].freq_hz = freq;
dmc->opp[idx - i].volt_uv = dev_pm_opp_get_voltage(opp);
@@ -375,11 +371,6 @@ static int exynos5_init_freq_table(struct exynos5_dmc *dmc,
}
 
return 0;
-
-err_opp:
-   dev_pm_opp_of_remove_table(dmc->dev);
-
-   return ret;
 }
 
 /**
@@ -1571,8 +1562,6 @@ static int exynos5_dmc_remove(struct platform_device 
*pdev)
clk_disable_unprepare(dmc->mout_bpll);
clk_disable_unprepare(dmc->fout_bpll);
 
-   dev_pm_opp_remove_table(dmc->dev);
-
return 0;
 }
 
-- 
2.25.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 06/31] serial: qcom_geni_serial: fix potential mem leak in qcom_geni_serial_probe()

2021-01-04 Thread Yangtao Li
We should use dev_pm_opp_put_clkname() to free opp table each time
dev_pm_opp_of_add_table() got error.

Signed-off-by: Yangtao Li 
---
 drivers/tty/serial/qcom_geni_serial.c | 10 ++
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/drivers/tty/serial/qcom_geni_serial.c 
b/drivers/tty/serial/qcom_geni_serial.c
index 291649f02821..5aada7ebae35 100644
--- a/drivers/tty/serial/qcom_geni_serial.c
+++ b/drivers/tty/serial/qcom_geni_serial.c
@@ -1438,9 +1438,12 @@ static int qcom_geni_serial_probe(struct platform_device 
*pdev)
return PTR_ERR(port->se.opp_table);
/* OPP table is optional */
ret = dev_pm_opp_of_add_table(>dev);
-   if (ret && ret != -ENODEV) {
-   dev_err(>dev, "invalid OPP table in device tree\n");
-   goto put_clkname;
+   if (ret) {
+   dev_pm_opp_put_clkname(port->se.opp_table);
+   if (ret != -ENODEV) {
+   dev_err(>dev, "invalid OPP table in device 
tree\n");
+   return ret;
+   }
}
 
port->private_data.drv = drv;
@@ -1482,7 +1485,6 @@ static int qcom_geni_serial_probe(struct platform_device 
*pdev)
return 0;
 err:
dev_pm_opp_of_remove_table(>dev);
-put_clkname:
dev_pm_opp_put_clkname(port->se.opp_table);
return ret;
 }
-- 
2.25.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 00/31] Introduce devm_pm_opp_* API

2021-01-04 Thread Yangtao Li
Hi,

This patchset add devm_pm_opp_set_clkname, devm_pm_opp_put_clkname,
devm_pm_opp_set_regulators, devm_pm_opp_put_regulators,
devm_pm_opp_set_supported_hw, devm_pm_opp_of_add_table and
devm_pm_opp_register_notifier.

Yangtao Li (31):
  opp: Add devres wrapper for dev_pm_opp_set_clkname and
dev_pm_opp_put_clkname
  opp: Add devres wrapper for dev_pm_opp_set_regulators and
dev_pm_opp_put_regulators
  opp: Add devres wrapper for dev_pm_opp_set_supported_hw
  opp: Add devres wrapper for dev_pm_opp_of_add_table
  opp: Add devres wrapper for dev_pm_opp_register_notifier
  serial: qcom_geni_serial: fix potential mem leak in
qcom_geni_serial_probe()
  serial: qcom_geni_serial: convert to use devm_pm_opp_* API
  spi: spi-qcom-qspi: fix potential mem leak in spi_geni_probe()
  spi: spi-qcom-qspi: fix potential mem leak in spi_geni_probe()
  qcom-geni-se: remove opp_table
  mmc: sdhci-msm: fix potential mem leak in sdhci_msm_probe()
  mmc: sdhci-msm: convert to use devm_pm_opp_* API
  spi: spi-qcom-qspi: fix potential mem leak in qcom_qspi_probe()
  spi: spi-qcom-qspi: convert to use devm_pm_opp_* API
  drm/msm: fix potential mem leak
  drm/msm: convert to use devm_pm_opp_* API and remove dp_ctrl_put
  drm/lima: convert to use devm_pm_opp_* API
  drm/lima: remove unneeded devm_devfreq_remove_device()
  drm/panfrost: convert to use devm_pm_opp_* API
  media: venus: fix error check in core_get_v4()
  media: venus: convert to use devm_pm_opp_* API
  memory: samsung: exynos5422-dmc: fix return error in
exynos5_init_freq_table
  memory: samsung: exynos5422-dmc: convert to use devm_pm_opp_* API
  memory: tegra20: convert to use devm_pm_opp_* API
  memory: tegra30: convert to use devm_pm_opp_* API
  PM / devfreq: tegra30: convert to use devm_pm_opp_* API
  PM / devfreq: rk3399_dmc: convert to use devm_pm_opp_* API
  PM / devfreq: imx8m-ddrc: convert to use devm_pm_opp_* API
  PM / devfreq: imx-bus: convert to use devm_pm_opp_* API
  PM / devfreq: exynos: convert to use devm_pm_opp_* API
  PM / devfreq: convert to devm_pm_opp_register_notifier and remove
unused API

 drivers/devfreq/devfreq.c |  66 +--
 drivers/devfreq/exynos-bus.c  |  42 +
 drivers/devfreq/imx-bus.c |  14 +-
 drivers/devfreq/imx8m-ddrc.c  |  15 +-
 drivers/devfreq/rk3399_dmc.c  |  22 +--
 drivers/devfreq/tegra30-devfreq.c |  21 +--
 drivers/gpu/drm/lima/lima_devfreq.c   |  45 +
 drivers/gpu/drm/lima/lima_devfreq.h   |   2 -
 drivers/gpu/drm/msm/adreno/a5xx_gpu.c |   2 +-
 drivers/gpu/drm/msm/adreno/a6xx_gmu.c |   2 +-
 drivers/gpu/drm/msm/adreno/adreno_gpu.c   |   2 +-
 drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c   |  31 ++--
 drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h   |   2 -
 drivers/gpu/drm/msm/dp/dp_ctrl.c  |  29 +--
 drivers/gpu/drm/msm/dp/dp_ctrl.h  |   1 -
 drivers/gpu/drm/msm/dp/dp_display.c   |   5 +-
 drivers/gpu/drm/msm/dsi/dsi_host.c|  23 ++-
 drivers/gpu/drm/panfrost/panfrost_devfreq.c   |  34 +---
 drivers/gpu/drm/panfrost/panfrost_devfreq.h   |   1 -
 .../media/platform/qcom/venus/pm_helpers.c|  22 +--
 drivers/memory/samsung/exynos5422-dmc.c   |  13 +-
 drivers/memory/tegra/tegra20-emc.c|  29 +--
 drivers/memory/tegra/tegra30-emc.c|  29 +--
 drivers/mmc/host/sdhci-msm.c  |  27 ++-
 drivers/opp/core.c| 173 ++
 drivers/opp/of.c  |  36 
 drivers/spi/spi-geni-qcom.c   |  23 ++-
 drivers/spi/spi-qcom-qspi.c   |  25 ++-
 drivers/tty/serial/qcom_geni_serial.c |  31 ++--
 include/linux/devfreq.h   |  23 ---
 include/linux/pm_opp.h|  38 
 include/linux/qcom-geni-se.h  |   2 -
 32 files changed, 402 insertions(+), 428 deletions(-)

-- 
2.25.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 03/31] opp: Add devres wrapper for dev_pm_opp_set_supported_hw

2021-01-04 Thread Yangtao Li
Add devres wrapper for dev_pm_opp_set_supported_hw() to simplify driver
code.

Signed-off-by: Yangtao Li 
---
 drivers/opp/core.c | 38 ++
 include/linux/pm_opp.h |  8 
 2 files changed, 46 insertions(+)

diff --git a/drivers/opp/core.c b/drivers/opp/core.c
index 8709689a7152..6b83e373f0d8 100644
--- a/drivers/opp/core.c
+++ b/drivers/opp/core.c
@@ -1674,6 +1674,44 @@ void dev_pm_opp_put_supported_hw(struct opp_table 
*opp_table)
 }
 EXPORT_SYMBOL_GPL(dev_pm_opp_put_supported_hw);
 
+static void devm_pm_opp_supported_hw_release(void *data)
+{
+   dev_pm_opp_put_supported_hw(data);
+}
+
+/**
+ * devm_pm_opp_set_supported_hw() - Set supported platforms
+ * @dev: Device for which supported-hw has to be set.
+ * @versions: Array of hierarchy of versions to match.
+ * @count: Number of elements in the array.
+ *
+ * This is required only for the V2 bindings, and it enables a platform to
+ * specify the hierarchy of versions it supports. OPP layer will then enable
+ * OPPs, which are available for those versions, based on its 
'opp-supported-hw'
+ * property.
+ *
+ * The opp_table structure will be freed after the device is destroyed.
+ */
+struct opp_table *devm_pm_opp_set_supported_hw(struct device *dev,
+  const u32 *versions,
+  unsigned int count)
+{
+   struct opp_table *opp_table;
+   int err;
+
+   opp_table = dev_pm_opp_set_supported_hw(dev, versions, count);
+   if (IS_ERR(opp_table))
+   return opp_table;
+
+   err = devm_add_action_or_reset(dev, devm_pm_opp_supported_hw_release,
+  opp_table);
+   if (err)
+   opp_table = ERR_PTR(err);
+
+   return opp_table;
+}
+EXPORT_SYMBOL_GPL(devm_pm_opp_set_supported_hw);
+
 /**
  * dev_pm_opp_set_prop_name() - Set prop-extn name
  * @dev: Device for which the prop-name has to be set.
diff --git a/include/linux/pm_opp.h b/include/linux/pm_opp.h
index 8a329247e08e..e5260fc82ba1 100644
--- a/include/linux/pm_opp.h
+++ b/include/linux/pm_opp.h
@@ -139,6 +139,7 @@ int dev_pm_opp_unregister_notifier(struct device *dev, 
struct notifier_block *nb
 
 struct opp_table *dev_pm_opp_set_supported_hw(struct device *dev, const u32 
*versions, unsigned int count);
 void dev_pm_opp_put_supported_hw(struct opp_table *opp_table);
+struct opp_table *devm_pm_opp_set_supported_hw(struct device *dev, const u32 
*versions, unsigned int count);
 struct opp_table *dev_pm_opp_set_prop_name(struct device *dev, const char 
*name);
 void dev_pm_opp_put_prop_name(struct opp_table *opp_table);
 struct opp_table *dev_pm_opp_set_regulators(struct device *dev, const char * 
const names[], unsigned int count);
@@ -301,6 +302,13 @@ static inline struct opp_table 
*dev_pm_opp_set_supported_hw(struct device *dev,
 
 static inline void dev_pm_opp_put_supported_hw(struct opp_table *opp_table) {}
 
+static inline struct opp_table *devm_pm_opp_set_supported_hw(struct device 
*dev,
+   const u32 *versions,
+   unsigned int count)
+{
+   return ERR_PTR(-ENOTSUPP);
+}
+
 static inline struct opp_table *dev_pm_opp_register_set_opp_helper(struct 
device *dev,
int (*set_opp)(struct dev_pm_set_opp_data *data))
 {
-- 
2.25.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 01/31] opp: Add devres wrapper for dev_pm_opp_set_clkname and dev_pm_opp_put_clkname

2021-01-04 Thread Yangtao Li
Add devres wrapper for dev_pm_opp_set_clkname() and
dev_pm_opp_put_clkname() to simplify driver code.

Signed-off-by: Yangtao Li 
---
 drivers/opp/core.c | 47 ++
 include/linux/pm_opp.h |  9 
 2 files changed, 56 insertions(+)

diff --git a/drivers/opp/core.c b/drivers/opp/core.c
index 4268eb359915..53fdf33732d5 100644
--- a/drivers/opp/core.c
+++ b/drivers/opp/core.c
@@ -1948,6 +1948,53 @@ void dev_pm_opp_put_clkname(struct opp_table *opp_table)
 }
 EXPORT_SYMBOL_GPL(dev_pm_opp_put_clkname);
 
+static void devm_pm_opp_clkname_release(void *data)
+{
+   dev_pm_opp_put_clkname(data);
+}
+
+/**
+ * devm_pm_opp_set_clkname() - Set clk name for the device
+ * @dev: Device for which clk name is being set.
+ * @name: Clk name.
+ *
+ * In order to support OPP switching, OPP layer needs to get pointer to the
+ * clock for the device. Simple cases work fine without using this routine 
(i.e.
+ * by passing connection-id as NULL), but for a device with multiple clocks
+ * available, the OPP core needs to know the exact name of the clk to use.
+ *
+ * This must be called before any OPPs are initialized for the device.
+ *
+ * The opp_table structure will be freed after the device is destroyed.
+ */
+struct opp_table *devm_pm_opp_set_clkname(struct device *dev, const char *name)
+{
+   struct opp_table *opp_table;
+   int err;
+
+   opp_table = dev_pm_opp_set_clkname(dev, name);
+   if (IS_ERR(opp_table))
+   return opp_table;
+
+   err = devm_add_action_or_reset(dev, devm_pm_opp_clkname_release, 
opp_table);
+   if (err)
+   opp_table = ERR_PTR(err);
+
+   return opp_table;
+}
+EXPORT_SYMBOL_GPL(devm_pm_opp_set_clkname);
+
+/**
+ * devm_pm_opp_put_clkname() - Releases resources blocked for clk.
+ * @dev: Device for which we do this operation.
+ * @opp_table: OPP table returned from devm_pm_opp_set_clkname().
+ */
+void devm_pm_opp_put_clkname(struct device *dev, struct opp_table *opp_table)
+{
+   devm_release_action(dev, devm_pm_opp_clkname_release, opp_table);
+}
+EXPORT_SYMBOL_GPL(devm_pm_opp_put_clkname);
+
 /**
  * dev_pm_opp_register_set_opp_helper() - Register custom set OPP helper
  * @dev: Device for which the helper is getting registered.
diff --git a/include/linux/pm_opp.h b/include/linux/pm_opp.h
index 1435c054016a..3418a2874f88 100644
--- a/include/linux/pm_opp.h
+++ b/include/linux/pm_opp.h
@@ -145,6 +145,8 @@ struct opp_table *dev_pm_opp_set_regulators(struct device 
*dev, const char * con
 void dev_pm_opp_put_regulators(struct opp_table *opp_table);
 struct opp_table *dev_pm_opp_set_clkname(struct device *dev, const char * 
name);
 void dev_pm_opp_put_clkname(struct opp_table *opp_table);
+struct opp_table *devm_pm_opp_set_clkname(struct device *dev, const char 
*name);
+void devm_pm_opp_put_clkname(struct device *dev, struct opp_table *opp_table);
 struct opp_table *dev_pm_opp_register_set_opp_helper(struct device *dev, int 
(*set_opp)(struct dev_pm_set_opp_data *data));
 void dev_pm_opp_unregister_set_opp_helper(struct opp_table *opp_table);
 struct opp_table *dev_pm_opp_attach_genpd(struct device *dev, const char 
**names, struct device ***virt_devs);
@@ -326,6 +328,13 @@ static inline struct opp_table 
*dev_pm_opp_set_clkname(struct device *dev, const
 
 static inline void dev_pm_opp_put_clkname(struct opp_table *opp_table) {}
 
+static inline struct opp_table *devm_pm_opp_set_clkname(struct device *dev, 
const char *name)
+{
+   return ERR_PTR(-ENOTSUPP);
+}
+
+static inline void devm_pm_opp_put_clkname(struct device *dev, struct 
opp_table *opp_table) {}
+
 static inline struct opp_table *dev_pm_opp_attach_genpd(struct device *dev, 
const char **names, struct device ***virt_devs)
 {
return ERR_PTR(-ENOTSUPP);
-- 
2.25.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 16/31] drm/msm: convert to use devm_pm_opp_* API and remove dp_ctrl_put

2021-01-04 Thread Yangtao Li
1. Use devm_pm_opp_* to simplif code and avoid mem leak.
2. Remove opp_table from dpu_kms, dp_ctrl_private and msm_dsi_host,
since it does not need a global scope.
3. Remove dp_ctrl_put.

Signed-off-by: Yangtao Li 
---
 drivers/gpu/drm/msm/adreno/a5xx_gpu.c   |  2 +-
 drivers/gpu/drm/msm/adreno/a6xx_gmu.c   |  2 +-
 drivers/gpu/drm/msm/adreno/adreno_gpu.c |  2 +-
 drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 23 
 drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h |  2 --
 drivers/gpu/drm/msm/dp/dp_ctrl.c| 29 ++---
 drivers/gpu/drm/msm/dp/dp_ctrl.h|  1 -
 drivers/gpu/drm/msm/dp/dp_display.c |  5 +
 drivers/gpu/drm/msm/dsi/dsi_host.c  | 15 +
 9 files changed, 26 insertions(+), 55 deletions(-)

diff --git a/drivers/gpu/drm/msm/adreno/a5xx_gpu.c 
b/drivers/gpu/drm/msm/adreno/a5xx_gpu.c
index a5af223eaf50..47e51c632209 100644
--- a/drivers/gpu/drm/msm/adreno/a5xx_gpu.c
+++ b/drivers/gpu/drm/msm/adreno/a5xx_gpu.c
@@ -1560,7 +1560,7 @@ static void check_speed_bin(struct device *dev)
nvmem_cell_put(cell);
}
 
-   dev_pm_opp_set_supported_hw(dev, , 1);
+   devm_pm_opp_set_supported_hw(dev, , 1);
 }
 
 struct msm_gpu *a5xx_gpu_init(struct drm_device *dev)
diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gmu.c 
b/drivers/gpu/drm/msm/adreno/a6xx_gmu.c
index e6703ae98760..bd159e6fac5a 100644
--- a/drivers/gpu/drm/msm/adreno/a6xx_gmu.c
+++ b/drivers/gpu/drm/msm/adreno/a6xx_gmu.c
@@ -1321,7 +1321,7 @@ static int a6xx_gmu_pwrlevels_probe(struct a6xx_gmu *gmu)
 * The GMU handles its own frequency switching so build a list of
 * available frequencies to send during initialization
 */
-   ret = dev_pm_opp_of_add_table(gmu->dev);
+   ret = devm_pm_opp_of_add_table(gmu->dev);
if (ret) {
DRM_DEV_ERROR(gmu->dev, "Unable to set the OPP table for the 
GMU\n");
return ret;
diff --git a/drivers/gpu/drm/msm/adreno/adreno_gpu.c 
b/drivers/gpu/drm/msm/adreno/adreno_gpu.c
index 6cf9975e951e..e6c446c436e3 100644
--- a/drivers/gpu/drm/msm/adreno/adreno_gpu.c
+++ b/drivers/gpu/drm/msm/adreno/adreno_gpu.c
@@ -845,7 +845,7 @@ static void adreno_get_pwrlevels(struct device *dev,
if (!of_find_property(dev->of_node, "operating-points-v2", NULL))
ret = adreno_get_legacy_pwrlevels(dev);
else {
-   ret = dev_pm_opp_of_add_table(dev);
+   ret = devm_pm_opp_of_add_table(dev);
if (ret)
DRM_DEV_ERROR(dev, "Unable to set the OPP table\n");
}
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c 
b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
index 6f19dfcb4965..cb7e4fddf268 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
@@ -1082,19 +1082,20 @@ static int dpu_bind(struct device *dev, struct device 
*master, void *data)
struct msm_drm_private *priv = ddev->dev_private;
struct dpu_kms *dpu_kms;
struct dss_module_power *mp;
+   struct opp_table *opp_table;
int ret = 0;
 
dpu_kms = devm_kzalloc(>dev, sizeof(*dpu_kms), GFP_KERNEL);
if (!dpu_kms)
return -ENOMEM;
 
-   dpu_kms->opp_table = dev_pm_opp_set_clkname(dev, "core");
-   if (IS_ERR(dpu_kms->opp_table))
-   return PTR_ERR(dpu_kms->opp_table);
+   opp_table = devm_pm_opp_set_clkname(dev, "core");
+   if (IS_ERR(opp_table))
+   return PTR_ERR(opp_table);
/* OPP table is optional */
-   ret = dev_pm_opp_of_add_table(dev);
+   ret = devm_pm_opp_of_add_table(dev);
if (ret) {
-   dev_pm_opp_put_clkname(dpu_kms->opp_table);
+   devm_pm_opp_put_clkname(dev, opp_table);
if (ret != -ENODEV) {
dev_err(dev, "invalid OPP table in device tree\n");
return ret;
@@ -1105,7 +1106,7 @@ static int dpu_bind(struct device *dev, struct device 
*master, void *data)
ret = msm_dss_parse_clock(pdev, mp);
if (ret) {
DPU_ERROR("failed to parse clocks, ret=%d\n", ret);
-   goto err;
+   return ret;
}
 
platform_set_drvdata(pdev, dpu_kms);
@@ -1113,7 +1114,7 @@ static int dpu_bind(struct device *dev, struct device 
*master, void *data)
ret = msm_kms_init(_kms->base, _funcs);
if (ret) {
DPU_ERROR("failed to init kms, ret=%d\n", ret);
-   goto err;
+   return ret;
}
dpu_kms->dev = ddev;
dpu_kms->pdev = pdev;
@@ -1122,10 +1123,7 @@ static int dpu_bind(struct device *dev, struct device 
*master, void *data)
dpu_kms->rpm_enabled = true;
 
priv->kms = _kms->base;
-   return ret;
-err:
-   dev_pm_opp_of_rem

[PATCH 12/31] mmc: sdhci-msm: convert to use devm_pm_opp_* API

2021-01-04 Thread Yangtao Li
Use devm_pm_opp_* API to simplify code, and remove opp_table
from sdhci_msm_host.

Signed-off-by: Yangtao Li 
---
 drivers/mmc/host/sdhci-msm.c | 19 +++
 1 file changed, 7 insertions(+), 12 deletions(-)

diff --git a/drivers/mmc/host/sdhci-msm.c b/drivers/mmc/host/sdhci-msm.c
index 094ef95f5ecc..490ba5d68f72 100644
--- a/drivers/mmc/host/sdhci-msm.c
+++ b/drivers/mmc/host/sdhci-msm.c
@@ -261,7 +261,6 @@ struct sdhci_msm_host {
struct clk_bulk_data bulk_clks[4]; /* core, iface, cal, sleep clocks */
unsigned long clk_rate;
struct mmc_host *mmc;
-   struct opp_table *opp_table;
bool use_14lpp_dll_reset;
bool tuning_done;
bool calibration_done;
@@ -2215,6 +2214,7 @@ static int sdhci_msm_probe(struct platform_device *pdev)
const struct sdhci_msm_offset *msm_offset;
const struct sdhci_msm_variant_info *var_info;
struct device_node *node = pdev->dev.of_node;
+   struct opp_table *opp_table;
 
host = sdhci_pltfm_init(pdev, _msm_pdata, sizeof(*msm_host));
if (IS_ERR(host))
@@ -2283,16 +2283,16 @@ static int sdhci_msm_probe(struct platform_device *pdev)
if (ret)
goto bus_clk_disable;
 
-   msm_host->opp_table = dev_pm_opp_set_clkname(>dev, "core");
-   if (IS_ERR(msm_host->opp_table)) {
-   ret = PTR_ERR(msm_host->opp_table);
+   opp_table = devm_pm_opp_set_clkname(>dev, "core");
+   if (IS_ERR(opp_table)) {
+   ret = PTR_ERR(opp_table);
goto bus_clk_disable;
}
 
/* OPP table is optional */
-   ret = dev_pm_opp_of_add_table(>dev);
+   ret = devm_pm_opp_of_add_table(>dev);
if (ret) {
-   dev_pm_opp_put_clkname(msm_host->opp_table);
+   devm_pm_opp_put_clkname(>dev, opp_table);
if (ret != -ENODEV) {
dev_err(>dev, "Invalid OPP table in Device 
tree\n");
goto bus_clk_disable;
@@ -2317,7 +2317,7 @@ static int sdhci_msm_probe(struct platform_device *pdev)
ret = clk_bulk_prepare_enable(ARRAY_SIZE(msm_host->bulk_clks),
  msm_host->bulk_clks);
if (ret)
-   goto opp_cleanup;
+   goto bus_clk_disable;
 
/*
 * xo clock is needed for FLL feature of cm_dll.
@@ -2462,9 +2462,6 @@ static int sdhci_msm_probe(struct platform_device *pdev)
 clk_disable:
clk_bulk_disable_unprepare(ARRAY_SIZE(msm_host->bulk_clks),
   msm_host->bulk_clks);
-opp_cleanup:
-   dev_pm_opp_of_remove_table(>dev);
-   dev_pm_opp_put_clkname(msm_host->opp_table);
 bus_clk_disable:
if (!IS_ERR(msm_host->bus_clk))
clk_disable_unprepare(msm_host->bus_clk);
@@ -2483,8 +2480,6 @@ static int sdhci_msm_remove(struct platform_device *pdev)
 
sdhci_remove_host(host, dead);
 
-   dev_pm_opp_of_remove_table(>dev);
-   dev_pm_opp_put_clkname(msm_host->opp_table);
pm_runtime_get_sync(>dev);
pm_runtime_disable(>dev);
pm_runtime_put_noidle(>dev);
-- 
2.25.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH] gpu/drm: remove DEFINE_DPU_DEBUGFS_SEQ_FOPS()

2018-12-02 Thread Yangtao Li
We already have the DEFINE_SHOW_ATTRIBUTE.There is no need to define
such a macro separately,so remove DEFINE_DPU_DEBUGFS_SEQ_FOPS.
Also use DEFINE_SHOW_ATTRIBUTE to simplify some code.

Signed-off-by: Yangtao Li 
---
 drivers/gpu/drm/armada/armada_debugfs.c  | 21 
 drivers/gpu/drm/msm/disp/dpu1/dpu_core_irq.c | 14 +---
 drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 33 +++---
 drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c  | 17 ++---
 drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c  | 36 
 drivers/gpu/host1x/debug.c   | 34 --
 6 files changed, 29 insertions(+), 126 deletions(-)

diff --git a/drivers/gpu/drm/armada/armada_debugfs.c 
b/drivers/gpu/drm/armada/armada_debugfs.c
index 6758c3a83de2..64dccb7c8be2 100644
--- a/drivers/gpu/drm/armada/armada_debugfs.c
+++ b/drivers/gpu/drm/armada/armada_debugfs.c
@@ -28,7 +28,7 @@ static int armada_debugfs_gem_linear_show(struct seq_file *m, 
void *data)
return 0;
 }
 
-static int armada_debugfs_reg_show(struct seq_file *m, void *data)
+static int reg_show(struct seq_file *m, void *data)
 {
struct drm_device *dev = m->private;
struct armada_private *priv = dev->dev_private;
@@ -50,18 +50,7 @@ static int armada_debugfs_reg_show(struct seq_file *m, void 
*data)
return 0;
 }
 
-static int armada_debugfs_reg_r_open(struct inode *inode, struct file *file)
-{
-   return single_open(file, armada_debugfs_reg_show, inode->i_private);
-}
-
-static const struct file_operations fops_reg_r = {
-   .owner = THIS_MODULE,
-   .open = armada_debugfs_reg_r_open,
-   .read = seq_read,
-   .llseek = seq_lseek,
-   .release = single_release,
-};
+DEFINE_SHOW_ATTRIBUTE(reg);
 
 static int armada_debugfs_write(struct file *file, const char __user *ptr,
size_t len, loff_t *off)
@@ -119,12 +108,14 @@ int armada_drm_debugfs_init(struct drm_minor *minor)
return ret;
 
de = debugfs_create_file("reg", S_IFREG | S_IRUSR,
-minor->debugfs_root, minor->dev, _reg_r);
+minor->debugfs_root, minor->dev,
+_fops);
if (!de)
return -ENOMEM;
 
de = debugfs_create_file("reg_wr", S_IFREG | S_IWUSR,
-minor->debugfs_root, minor->dev, _reg_w);
+minor->debugfs_root, minor->dev,
+_reg_w);
if (!de)
return -ENOMEM;
 
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_core_irq.c 
b/drivers/gpu/drm/msm/disp/dpu1/dpu_core_irq.c
index 879c13fe74e0..7607aac9449c 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_core_irq.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_core_irq.c
@@ -299,18 +299,6 @@ static void dpu_disable_all_irqs(struct dpu_kms *dpu_kms)
 }
 
 #ifdef CONFIG_DEBUG_FS
-#define DEFINE_DPU_DEBUGFS_SEQ_FOPS(__prefix)  \
-static int __prefix ## _open(struct inode *inode, struct file *file)   \
-{  \
-   return single_open(file, __prefix ## _show, inode->i_private);  \
-}  \
-static const struct file_operations __prefix ## _fops = {  \
-   .owner = THIS_MODULE,   \
-   .open = __prefix ## _open,  \
-   .release = single_release,  \
-   .read = seq_read,   \
-   .llseek = seq_lseek,\
-}
 
 static int dpu_debugfs_core_irq_show(struct seq_file *s, void *v)
 {
@@ -341,7 +329,7 @@ static int dpu_debugfs_core_irq_show(struct seq_file *s, 
void *v)
return 0;
 }
 
-DEFINE_DPU_DEBUGFS_SEQ_FOPS(dpu_debugfs_core_irq);
+DEFINE_SHOW_ATTRIBUTE(dpu_debugfs_core_irq);
 
 int dpu_debugfs_core_irq_init(struct dpu_kms *dpu_kms,
struct dentry *parent)
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c 
b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
index d4530d60767b..e705bad980ee 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
@@ -1309,7 +1309,7 @@ int dpu_crtc_vblank(struct drm_crtc *crtc, bool en)
 }
 
 #ifdef CONFIG_DEBUG_FS
-static int _dpu_debugfs_status_show(struct seq_file *s, void *data)
+static int status_show(struct seq_file *s, void *data)
 {
struct dpu_crtc *dpu_crtc;
struct dpu_plane_state *pstate = NULL;
@@ -1428,24 +1428,6 @@ static int _dpu_debugfs_status_show(struct seq_file *s, 
void *data)
return 0;
 }
 
-static int _dpu_debugfs_status_open(struct inode *inode, struct file *file)
-{
-   return single_open(file, _dpu_debugfs_status_show, inode->i_p

[PATCH] staging: android: ion: Remove unused header files

2018-12-02 Thread Yangtao Li
seq_file.h does not need to be included,so remove it.

Signed-off-by: Yangtao Li 
---
 drivers/staging/android/ion/ion.c | 1 -
 drivers/staging/android/ion/ion_system_heap.c | 1 -
 2 files changed, 2 deletions(-)

diff --git a/drivers/staging/android/ion/ion.c 
b/drivers/staging/android/ion/ion.c
index 99073325b0c0..0d61e9cd0887 100644
--- a/drivers/staging/android/ion/ion.c
+++ b/drivers/staging/android/ion/ion.c
@@ -23,7 +23,6 @@
 #include 
 #include 
 #include 
-#include 
 #include 
 #include 
 #include 
diff --git a/drivers/staging/android/ion/ion_system_heap.c 
b/drivers/staging/android/ion/ion_system_heap.c
index 548bb02c0ca6..9ce2c0d7ac17 100644
--- a/drivers/staging/android/ion/ion_system_heap.c
+++ b/drivers/staging/android/ion/ion_system_heap.c
@@ -11,7 +11,6 @@
 #include 
 #include 
 #include 
-#include 
 #include 
 #include 
 #include "ion.h"
-- 
2.17.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH] dma-buf: Change to use DEFINE_SHOW_ATTRIBUTE macro

2018-12-02 Thread Yangtao Li
Use DEFINE_SHOW_ATTRIBUTE macro to simplify the code.

Signed-off-by: Yangtao Li 
---
 drivers/dma-buf/dma-buf.c| 12 +---
 drivers/dma-buf/sync_debug.c | 16 +++-
 2 files changed, 4 insertions(+), 24 deletions(-)

diff --git a/drivers/dma-buf/dma-buf.c b/drivers/dma-buf/dma-buf.c
index 02f7f9a89979..7c858020d14b 100644
--- a/drivers/dma-buf/dma-buf.c
+++ b/drivers/dma-buf/dma-buf.c
@@ -1093,17 +1093,7 @@ static int dma_buf_debug_show(struct seq_file *s, void 
*unused)
return 0;
 }
 
-static int dma_buf_debug_open(struct inode *inode, struct file *file)
-{
-   return single_open(file, dma_buf_debug_show, NULL);
-}
-
-static const struct file_operations dma_buf_debug_fops = {
-   .open   = dma_buf_debug_open,
-   .read   = seq_read,
-   .llseek = seq_lseek,
-   .release= single_release,
-};
+DEFINE_SHOW_ATTRIBUTE(dma_buf_debug);
 
 static struct dentry *dma_buf_debugfs_dir;
 
diff --git a/drivers/dma-buf/sync_debug.c b/drivers/dma-buf/sync_debug.c
index c4c8ecb24aa9..c0abf37df88b 100644
--- a/drivers/dma-buf/sync_debug.c
+++ b/drivers/dma-buf/sync_debug.c
@@ -147,7 +147,7 @@ static void sync_print_sync_file(struct seq_file *s,
}
 }
 
-static int sync_debugfs_show(struct seq_file *s, void *unused)
+static int sync_info_debugfs_show(struct seq_file *s, void *unused)
 {
struct list_head *pos;
 
@@ -178,17 +178,7 @@ static int sync_debugfs_show(struct seq_file *s, void 
*unused)
return 0;
 }
 
-static int sync_info_debugfs_open(struct inode *inode, struct file *file)
-{
-   return single_open(file, sync_debugfs_show, inode->i_private);
-}
-
-static const struct file_operations sync_info_debugfs_fops = {
-   .open   = sync_info_debugfs_open,
-   .read   = seq_read,
-   .llseek = seq_lseek,
-   .release= single_release,
-};
+DEFINE_SHOW_ATTRIBUTE(sync_info_debugfs);
 
 static __init int sync_debugfs_init(void)
 {
@@ -218,7 +208,7 @@ void sync_dump(void)
};
int i;
 
-   sync_debugfs_show(, NULL);
+   sync_info_debugfs_show(, NULL);
 
for (i = 0; i < s.count; i += DUMP_CHUNK) {
if ((s.count - i) > DUMP_CHUNK) {
-- 
2.17.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v2] media: omap2: omapfb: convert to DEFINE_SHOW_ATTRIBUTE

2018-12-02 Thread Yangtao Li
Use DEFINE_SHOW_ATTRIBUTE macro to simplify the code.

Signed-off-by: Yangtao Li 
---
 drivers/video/fbdev/omap2/omapfb/dss/core.c | 18 --
 1 file changed, 4 insertions(+), 14 deletions(-)

diff --git a/drivers/video/fbdev/omap2/omapfb/dss/core.c 
b/drivers/video/fbdev/omap2/omapfb/dss/core.c
index a5e58a829ea0..b4bcf3a4a647 100644
--- a/drivers/video/fbdev/omap2/omapfb/dss/core.c
+++ b/drivers/video/fbdev/omap2/omapfb/dss/core.c
@@ -99,24 +99,14 @@ int dss_set_min_bus_tput(struct device *dev, unsigned long 
tput)
 }
 
 #if defined(CONFIG_FB_OMAP2_DSS_DEBUGFS)
-static int dss_debug_show(struct seq_file *s, void *unused)
+static int dss_show(struct seq_file *s, void *unused)
 {
void (*func)(struct seq_file *) = s->private;
func(s);
return 0;
 }
 
-static int dss_debug_open(struct inode *inode, struct file *file)
-{
-   return single_open(file, dss_debug_show, inode->i_private);
-}
-
-static const struct file_operations dss_debug_fops = {
-   .open   = dss_debug_open,
-   .read   = seq_read,
-   .llseek = seq_lseek,
-   .release= single_release,
-};
+DEFINE_SHOW_ATTRIBUTE(dss);
 
 static struct dentry *dss_debugfs_dir;
 
@@ -130,7 +120,7 @@ static int dss_initialize_debugfs(void)
}
 
debugfs_create_file("clk", S_IRUGO, dss_debugfs_dir,
-   _debug_dump_clocks, _debug_fops);
+   _debug_dump_clocks, _fops);
 
return 0;
 }
@@ -145,7 +135,7 @@ int dss_debugfs_create_file(const char *name, void 
(*write)(struct seq_file *))
struct dentry *d;
 
d = debugfs_create_file(name, S_IRUGO, dss_debugfs_dir,
-   write, _debug_fops);
+   write, _fops);
 
return PTR_ERR_OR_ZERO(d);
 }
-- 
2.17.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH] media: omap2: omapfb: convert to DEFINE_SHOW_ATTRIBUTE

2018-12-02 Thread Yangtao Li
Use DEFINE_SHOW_ATTRIBUTE macro to simplify the code.

Signed-off-by: Yangtao Li 
---
 drivers/video/fbdev/omap2/omapfb/dss/core.c | 16 +++-
 1 file changed, 3 insertions(+), 13 deletions(-)

diff --git a/drivers/video/fbdev/omap2/omapfb/dss/core.c 
b/drivers/video/fbdev/omap2/omapfb/dss/core.c
index a5e58a829ea0..7d3d9f6fad10 100644
--- a/drivers/video/fbdev/omap2/omapfb/dss/core.c
+++ b/drivers/video/fbdev/omap2/omapfb/dss/core.c
@@ -99,24 +99,14 @@ int dss_set_min_bus_tput(struct device *dev, unsigned long 
tput)
 }
 
 #if defined(CONFIG_FB_OMAP2_DSS_DEBUGFS)
-static int dss_debug_show(struct seq_file *s, void *unused)
+static int dss_show(struct seq_file *s, void *unused)
 {
void (*func)(struct seq_file *) = s->private;
func(s);
return 0;
 }
 
-static int dss_debug_open(struct inode *inode, struct file *file)
-{
-   return single_open(file, dss_debug_show, inode->i_private);
-}
-
-static const struct file_operations dss_debug_fops = {
-   .open   = dss_debug_open,
-   .read   = seq_read,
-   .llseek = seq_lseek,
-   .release= single_release,
-};
+DEFINE_SHOW_ATTRIBUTE(dss);
 
 static struct dentry *dss_debugfs_dir;
 
@@ -130,7 +120,7 @@ static int dss_initialize_debugfs(void)
}
 
debugfs_create_file("clk", S_IRUGO, dss_debugfs_dir,
-   _debug_dump_clocks, _debug_fops);
+   _debug_dump_clocks, _fops);
 
return 0;
 }
-- 
2.17.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH] drm/pl111: add of_node_put()

2018-11-22 Thread Yangtao Li
of_find_node_by_path() acquires a reference to the node
returned by it and that reference needs to be dropped by its caller.
bl_idle_init() doesn't do that, so fix it.

Signed-off-by: Yangtao Li 
---
 drivers/gpu/drm/pl111/pl111_vexpress.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/gpu/drm/pl111/pl111_vexpress.c 
b/drivers/gpu/drm/pl111/pl111_vexpress.c
index 5fa0441bb6df..38c938c9adda 100644
--- a/drivers/gpu/drm/pl111/pl111_vexpress.c
+++ b/drivers/gpu/drm/pl111/pl111_vexpress.c
@@ -55,6 +55,8 @@ int pl111_vexpress_clcd_init(struct device *dev,
}
}
 
+   of_node_put(root);
+
/*
 * If there is a coretile HDLCD and it has a driver,
 * do not mux the CLCD on the motherboard to the DVI.
-- 
2.17.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel