diff options
Diffstat (limited to 'drivers/gpu/drm/meson/meson_dw_hdmi.c')
| -rw-r--r-- | drivers/gpu/drm/meson/meson_dw_hdmi.c | 13 | 
1 files changed, 11 insertions, 2 deletions
| diff --git a/drivers/gpu/drm/meson/meson_dw_hdmi.c b/drivers/gpu/drm/meson/meson_dw_hdmi.c index 29a8ff41595d..7f8eea494147 100644 --- a/drivers/gpu/drm/meson/meson_dw_hdmi.c +++ b/drivers/gpu/drm/meson/meson_dw_hdmi.c @@ -941,6 +941,11 @@ static void meson_dw_hdmi_init(struct meson_dw_hdmi *meson_dw_hdmi)  } +static void meson_disable_regulator(void *data) +{ +	regulator_disable(data); +} +  static int meson_dw_hdmi_bind(struct device *dev, struct device *master,  				void *data)  { @@ -989,6 +994,10 @@ static int meson_dw_hdmi_bind(struct device *dev, struct device *master,  		ret = regulator_enable(meson_dw_hdmi->hdmi_supply);  		if (ret)  			return ret; +		ret = devm_add_action_or_reset(dev, meson_disable_regulator, +					       meson_dw_hdmi->hdmi_supply); +		if (ret) +			return ret;  	}  	meson_dw_hdmi->hdmitx_apb = devm_reset_control_get_exclusive(dev, @@ -1064,8 +1073,6 @@ static int meson_dw_hdmi_bind(struct device *dev, struct device *master,  	DRM_DEBUG_DRIVER("encoder initialized\n"); -	meson_dw_hdmi_init(meson_dw_hdmi); -  	/* Bridge / Connector */  	dw_plat_data->priv_data = meson_dw_hdmi; @@ -1088,6 +1095,8 @@ static int meson_dw_hdmi_bind(struct device *dev, struct device *master,  	if (IS_ERR(meson_dw_hdmi->hdmi))  		return PTR_ERR(meson_dw_hdmi->hdmi); +	meson_dw_hdmi_init(meson_dw_hdmi); +  	next_bridge = of_drm_find_bridge(pdev->dev.of_node);  	if (next_bridge)  		drm_bridge_attach(encoder, next_bridge, | 
