Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/bridge: analogix_dp: handle clock via runtime PM

There is no reason to enable the controller clock in driver probe, as
there is no HW initialization done in this function. Instead rely on
either runtime PM to handle the controller clock or statically enable
it in the driver bind routine, after which real hardware access is
required to work.

Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
Reviewed-by: Robert Foss <rfoss@kernel.org>
Tested-by: Heiko Stuebner <heiko@sntech.de>
Signed-off-by: Robert Foss <rfoss@kernel.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20240619182200.3752465-4-l.stach@pengutronix.de

authored by

Lucas Stach and committed by
Robert Foss
f3795233 2d192f4a

+44 -33
+44 -33
drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
··· 1651 1651 return ERR_CAST(dp->clock); 1652 1652 } 1653 1653 1654 - clk_prepare_enable(dp->clock); 1655 - 1656 1654 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 1657 1655 1658 1656 dp->reg_base = devm_ioremap_resource(&pdev->dev, res); ··· 1712 1714 } 1713 1715 EXPORT_SYMBOL_GPL(analogix_dp_probe); 1714 1716 1717 + int analogix_dp_suspend(struct analogix_dp_device *dp) 1718 + { 1719 + clk_disable_unprepare(dp->clock); 1720 + 1721 + return 0; 1722 + } 1723 + EXPORT_SYMBOL_GPL(analogix_dp_suspend); 1724 + 1725 + int analogix_dp_resume(struct analogix_dp_device *dp) 1726 + { 1727 + int ret; 1728 + 1729 + ret = clk_prepare_enable(dp->clock); 1730 + if (ret < 0) { 1731 + DRM_ERROR("Failed to prepare_enable the clock clk [%d]\n", ret); 1732 + return ret; 1733 + } 1734 + 1735 + return 0; 1736 + } 1737 + EXPORT_SYMBOL_GPL(analogix_dp_resume); 1738 + 1715 1739 int analogix_dp_bind(struct analogix_dp_device *dp, struct drm_device *drm_dev) 1716 1740 { 1717 1741 int ret; ··· 1741 1721 dp->drm_dev = drm_dev; 1742 1722 dp->encoder = dp->plat_data->encoder; 1743 1723 1744 - pm_runtime_use_autosuspend(dp->dev); 1745 - pm_runtime_set_autosuspend_delay(dp->dev, 100); 1746 - pm_runtime_enable(dp->dev); 1724 + if (IS_ENABLED(CONFIG_PM)) { 1725 + pm_runtime_use_autosuspend(dp->dev); 1726 + pm_runtime_set_autosuspend_delay(dp->dev, 100); 1727 + pm_runtime_enable(dp->dev); 1728 + } else { 1729 + ret = analogix_dp_resume(dp); 1730 + if (ret) 1731 + return ret; 1732 + } 1747 1733 1748 1734 dp->aux.name = "DP-AUX"; 1749 1735 dp->aux.transfer = analogix_dpaux_transfer; ··· 1773 1747 err_unregister_aux: 1774 1748 drm_dp_aux_unregister(&dp->aux); 1775 1749 err_disable_pm_runtime: 1776 - pm_runtime_dont_use_autosuspend(dp->dev); 1777 - pm_runtime_disable(dp->dev); 1750 + if (IS_ENABLED(CONFIG_PM)) { 1751 + pm_runtime_dont_use_autosuspend(dp->dev); 1752 + pm_runtime_disable(dp->dev); 1753 + } else { 1754 + analogix_dp_suspend(dp); 1755 + } 1778 1756 1779 1757 return ret; 1780 1758 } ··· 1795 1765 } 1796 1766 1797 1767 drm_dp_aux_unregister(&dp->aux); 1798 - pm_runtime_dont_use_autosuspend(dp->dev); 1799 - pm_runtime_disable(dp->dev); 1768 + 1769 + if (IS_ENABLED(CONFIG_PM)) { 1770 + pm_runtime_dont_use_autosuspend(dp->dev); 1771 + pm_runtime_disable(dp->dev); 1772 + } else { 1773 + analogix_dp_suspend(dp); 1774 + } 1800 1775 } 1801 1776 EXPORT_SYMBOL_GPL(analogix_dp_unbind); 1802 1777 1803 1778 void analogix_dp_remove(struct analogix_dp_device *dp) 1804 1779 { 1805 - clk_disable_unprepare(dp->clock); 1806 1780 } 1807 1781 EXPORT_SYMBOL_GPL(analogix_dp_remove); 1808 - 1809 - #ifdef CONFIG_PM 1810 - int analogix_dp_suspend(struct analogix_dp_device *dp) 1811 - { 1812 - clk_disable_unprepare(dp->clock); 1813 - return 0; 1814 - } 1815 - EXPORT_SYMBOL_GPL(analogix_dp_suspend); 1816 - 1817 - int analogix_dp_resume(struct analogix_dp_device *dp) 1818 - { 1819 - int ret; 1820 - 1821 - ret = clk_prepare_enable(dp->clock); 1822 - if (ret < 0) { 1823 - DRM_ERROR("Failed to prepare_enable the clock clk [%d]\n", ret); 1824 - return ret; 1825 - } 1826 - 1827 - return 0; 1828 - } 1829 - EXPORT_SYMBOL_GPL(analogix_dp_resume); 1830 - #endif 1831 1782 1832 1783 int analogix_dp_start_crc(struct drm_connector *connector) 1833 1784 {