]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
ENGR00216010-2: [e|s]pdc: re-initialize the controller after resume
authorRobby Cai <R63905@freescale.com>
Fri, 6 Jul 2012 10:07:24 +0000 (18:07 +0800)
committerLothar Waßmann <LW@KARO-electronics.de>
Fri, 24 May 2013 06:34:58 +0000 (08:34 +0200)
Because we have DISPLAY power down/up request when do suspend/resume,
EPDC/SPDC has been powered off and powered on again, thus re-initialization
is needed.

Signed-off-by: Robby Cai <R63905@freescale.com>
drivers/video/mxc/mxc_epdc_fb.c
drivers/video/mxc/mxc_spdc_fb.c

index 730fba6961c37754de87623ae7e7e8a75aa6560f..f78200887054326c9019dc45178177c7d83fcf2c 100644 (file)
@@ -847,7 +847,7 @@ static void epdc_set_vertical_timing(u32 vert_start, u32 vert_end,
        __raw_writel(reg_val, EPDC_TCE_VSCAN);
 }
 
-void epdc_init_settings(struct mxc_epdc_fb_data *fb_data)
+static void epdc_init_settings(struct mxc_epdc_fb_data *fb_data)
 {
        struct imx_epdc_fb_mode *epdc_mode = fb_data->cur_mode;
        struct fb_var_screeninfo *screeninfo = &fb_data->epdc_fb_var;
@@ -855,6 +855,9 @@ void epdc_init_settings(struct mxc_epdc_fb_data *fb_data)
        int num_ce;
        int i;
 
+       /* Enable clocks to access EPDC regs */
+       clk_enable(fb_data->epdc_clk_axi);
+
        /* Reset */
        __raw_writel(EPDC_CTRL_SFTRST, EPDC_CTRL_SET);
        while (!(__raw_readl(EPDC_CTRL) & EPDC_CTRL_CLKGATE))
@@ -1017,6 +1020,13 @@ void epdc_init_settings(struct mxc_epdc_fb_data *fb_data)
        reg_val = ((0 << EPDC_GPIO_PWRCTRL_OFFSET) & EPDC_GPIO_PWRCTRL_MASK)
            | ((0 << EPDC_GPIO_BDR_OFFSET) & EPDC_GPIO_BDR_MASK);
        __raw_writel(reg_val, EPDC_GPIO);
+
+       __raw_writel(fb_data->waveform_buffer_phys, EPDC_WVADDR);
+       __raw_writel(fb_data->working_buffer_phys, EPDC_WB_ADDR);
+       __raw_writel(fb_data->working_buffer_phys, EPDC_WB_ADDR_TCE);
+
+       /* Disable clock */
+       clk_disable(fb_data->epdc_clk_axi);
 }
 
 static void epdc_powerup(struct mxc_epdc_fb_data *fb_data)
@@ -1128,9 +1138,6 @@ static void epdc_init_sequence(struct mxc_epdc_fb_data *fb_data)
 {
        /* Initialize EPDC, passing pointer to EPDC registers */
        epdc_init_settings(fb_data);
-       __raw_writel(fb_data->waveform_buffer_phys, EPDC_WVADDR);
-       __raw_writel(fb_data->working_buffer_phys, EPDC_WB_ADDR);
-       __raw_writel(fb_data->working_buffer_phys, EPDC_WB_ADDR_TCE);
        fb_data->in_init = true;
        epdc_powerup(fb_data);
        draw_mode0(fb_data);
@@ -4830,6 +4837,7 @@ static int mxc_epdc_fb_suspend(struct platform_device *pdev, pm_message_t state)
        struct mxc_epdc_fb_data *data = platform_get_drvdata(pdev);
        int ret;
 
+       data->pwrdown_delay = FB_POWERDOWN_DISABLE;
        ret = mxc_epdc_fb_blank(FB_BLANK_POWERDOWN, &data->info);
        if (ret)
                goto out;
@@ -4843,6 +4851,9 @@ static int mxc_epdc_fb_resume(struct platform_device *pdev)
        struct mxc_epdc_fb_data *data = platform_get_drvdata(pdev);
 
        mxc_epdc_fb_blank(FB_BLANK_UNBLANK, &data->info);
+       epdc_init_settings(data);
+       data->updates_active = false;
+
        return 0;
 }
 #else
index 67561a788403c9e804283a214ef1ae941fa9f089..8226dc724e3ef6d724d718e6772de45fb0689d17 100644 (file)
@@ -4128,6 +4128,7 @@ static int mxc_spdc_fb_suspend(struct platform_device *pdev,
        mxc_spdc_t *data = platform_get_drvdata(pdev);
        int ret;
 
+       data->pwrdown_delay = FB_POWERDOWN_DISABLE;
        ret = mxc_spdc_fb_blank(FB_BLANK_POWERDOWN, &data->info);
 
        return ret;
@@ -4138,6 +4139,8 @@ static int mxc_spdc_fb_resume(struct platform_device *pdev)
        mxc_spdc_t *data = platform_get_drvdata(pdev);
 
        mxc_spdc_fb_blank(FB_BLANK_UNBLANK, &data->info);
+       spdc_init_sequence(data);
+
        return 0;
 }
 #else