drm/exynos: add support for 'hdmi' clock
authorMarek Szyprowski <m.szyprowski@samsung.com>
Mon, 2 Feb 2015 13:20:28 +0000 (14:20 +0100)
committerInki Dae <inki.dae@samsung.com>
Sat, 7 Feb 2015 07:38:40 +0000 (16:38 +0900)
Mixed need to have hdmi clock enabled to properly perform power on/off
sequences, so add handling of this clock directly to the mixer driver.
Dependency between hdmi clock and mixer module has been observed on
Exynos4 based boards.

Suggested-by: Andrzej Hajda <a.hajda@samsung.com>
Reviewed-by: Javier Martinez Canillas <javier.martinez@collabora.co.uk>
Tested-by: Javier Martinez Canillas <javier.martinez@collabora.co.uk>
Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
Signed-off-by: Inki Dae <inki.dae@samsung.com>
Documentation/devicetree/bindings/video/exynos_mixer.txt
drivers/gpu/drm/exynos/exynos_mixer.c

index 08b394b..3e38128 100644 (file)
@@ -15,6 +15,7 @@ Required properties:
        a) mixer: Gate of Mixer IP bus clock.
        b) sclk_hdmi: HDMI Special clock, one of the two possible inputs of
                mixer mux.
+       c) hdmi: Gate of HDMI IP bus clock, needed together with sclk_hdmi.
 
 Example:
 
index ed44cd4..1c65a31 100644 (file)
@@ -72,6 +72,7 @@ struct mixer_resources {
        spinlock_t              reg_slock;
        struct clk              *mixer;
        struct clk              *vp;
+       struct clk              *hdmi;
        struct clk              *sclk_mixer;
        struct clk              *sclk_hdmi;
        struct clk              *mout_mixer;
@@ -769,6 +770,12 @@ static int mixer_resources_init(struct mixer_context *mixer_ctx)
                return -ENODEV;
        }
 
+       mixer_res->hdmi = devm_clk_get(dev, "hdmi");
+       if (IS_ERR(mixer_res->hdmi)) {
+               dev_err(dev, "failed to get clock 'hdmi'\n");
+               return PTR_ERR(mixer_res->hdmi);
+       }
+
        mixer_res->sclk_hdmi = devm_clk_get(dev, "sclk_hdmi");
        if (IS_ERR(mixer_res->sclk_hdmi)) {
                dev_err(dev, "failed to get clock 'sclk_hdmi'\n");
@@ -1092,6 +1099,7 @@ static void mixer_poweron(struct exynos_drm_crtc *crtc)
        pm_runtime_get_sync(ctx->dev);
 
        clk_prepare_enable(res->mixer);
+       clk_prepare_enable(res->hdmi);
        if (ctx->vp_enabled) {
                clk_prepare_enable(res->vp);
                if (ctx->has_sclk)
@@ -1131,6 +1139,7 @@ static void mixer_poweroff(struct exynos_drm_crtc *crtc)
        ctx->powered = false;
        mutex_unlock(&ctx->mixer_mutex);
 
+       clk_disable_unprepare(res->hdmi);
        clk_disable_unprepare(res->mixer);
        if (ctx->vp_enabled) {
                clk_disable_unprepare(res->vp);