From f9727cc2ee422417618b62ab902c44e799c7acfb Mon Sep 17 00:00:00 2001 From: Vitor Sato Eschholz <vsatoes@baylibre.com> Date: Thu, 30 Nov 2023 10:55:00 +0000 Subject: [PATCH] BL_INTERNAL: drm: mediatek: mtk_lvds: add suspend/resume callbacks Add suspend and resume power management operations. This enables S3 on devices using LVDS panels. Signed-off-by: Vitor Sato Eschholz <vsatoes@baylibre.com> Signed-off-by: Stoyan Bogdanov <sbogdanov@baylibre.com> --- drivers/gpu/drm/mediatek/mtk_lvds.c | 44 +++++++++++++++++++++++++---- 1 file changed, 38 insertions(+), 6 deletions(-) diff --git a/drivers/gpu/drm/mediatek/mtk_lvds.c b/drivers/gpu/drm/mediatek/mtk_lvds.c index 4b7e7df194ef5..3943f87b373bd 100644 --- a/drivers/gpu/drm/mediatek/mtk_lvds.c +++ b/drivers/gpu/drm/mediatek/mtk_lvds.c @@ -181,6 +181,13 @@ return 0; return ret; } +static void mtk_lvds_disable_clks(struct mtk_lvds *lvds) +{ + clk_disable_unprepare(lvds->lvdstx_dig_clk); + clk_disable_unprepare(lvds->lvdstx_pxl_clk); + clk_disable_unprepare(lvds->lvdstx_cts_clk); +} + static const struct mtk_ddp_comp_funcs mtk_lvds_funcs = { .config = mtk_lvds_config, .start = mtk_lvds_start, @@ -297,9 +304,7 @@ static int mtk_lvds_probe(struct platform_device *pdev) return 0; err_comp: - clk_disable_unprepare(lvds->lvdstx_dig_clk); - clk_disable_unprepare(lvds->lvdstx_pxl_clk); - clk_disable_unprepare(lvds->lvdstx_cts_clk); + mtk_lvds_disable_clks(lvds); return ret; } @@ -310,12 +315,38 @@ static int mtk_lvds_remove(struct platform_device *pdev) component_del(&pdev->dev, &mtk_lvds_component_ops); - clk_disable_unprepare(lvds->lvdstx_dig_clk); - clk_disable_unprepare(lvds->lvdstx_pxl_clk); - clk_disable_unprepare(lvds->lvdstx_cts_clk); + mtk_lvds_disable_clks(lvds); + + return 0; +} + + +#ifdef CONFIG_PM_SLEEP +static int mtk_lvds_suspend(struct device *dev) +{ + struct mtk_lvds *lvds = dev_get_drvdata(dev); + mtk_lvds_disable_clks(lvds); + + return 0; +} + +static int mtk_lvds_resume(struct device *dev) +{ + struct mtk_lvds *lvds = dev_get_drvdata(dev); + int ret = 0; + ret = mtk_lvds_enable_clks(lvds); + if (ret) { + dev_err(dev, "lvds resume failed!\n"); + return ret; + } + + mtk_lvds_soft_reset(lvds); return 0; } +#endif +static SIMPLE_DEV_PM_OPS(mtk_lvds_pm_ops, + mtk_lvds_suspend, mtk_lvds_resume); static const struct of_device_id mtk_lvds_of_ids[] = { { .compatible = "mediatek,mt8365-lvds",}, @@ -329,6 +360,7 @@ struct platform_driver mtk_lvds_driver = { .driver = { .name = "mediatek-lvds", .of_match_table = mtk_lvds_of_ids, + .pm = &mtk_lvds_pm_ops, }, }; -- GitLab