changed Makefile and profiles, added patches for kernel 2.6.24 (stable-branch of...
[openwrt/staging/dedeckeh.git] / target / linux / s3c24xx / patches-2.6.24 / 1299-glamo_fb-Implement-screen-blanking.patch
diff --git a/target/linux/s3c24xx/patches-2.6.24/1299-glamo_fb-Implement-screen-blanking.patch b/target/linux/s3c24xx/patches-2.6.24/1299-glamo_fb-Implement-screen-blanking.patch
new file mode 100644 (file)
index 0000000..3004a83
--- /dev/null
@@ -0,0 +1,128 @@
+From a2ef813d2f439a3e9f377d33a2e5baad098afb7e Mon Sep 17 00:00:00 2001
+From: Harald Welte <laforge@openmoko.org>
+Date: Wed, 8 Oct 2008 21:36:23 +0100
+Subject: [PATCH] glamo_fb: Implement screen blanking
+
+This patch implements fb_blank() for the glamo-fb driver, which switches off
+the pixel clock (DCLK) for power saving.
+
+We currently delay the actual pixel clock switch until we enter
+FB_BLANK_POWERDOWN, since the backlight fade is slow and we don't want the
+user to see artefacts on the screen while the backlight is fading out.
+
+So since the X server first sends FB_BLANK_{V,H}SYNC_SUSPEND, we start the
+backlight fade here, and only once we get FB_BLANK_POWERDOWN the pixel clock is
+disabled.
+
+There are no measurements yet, but the power savings should be double, since
+there is no longer any  generation of the high-frequency LCM signals, and
+there are no video-related SDRAM accesses anymore.
+
+Signed-off-by: Harald Welte <laforge@openmoko.org>
+---
+ drivers/mfd/glamo/glamo-core.c |   32 ++++++++++++++++++++++++++++++++
+ drivers/mfd/glamo/glamo-core.h |    6 ++++++
+ drivers/mfd/glamo/glamo-fb.c   |   29 ++++++++++++++++++++++++++++-
+ 3 files changed, 66 insertions(+), 1 deletions(-)
+
+diff --git a/drivers/mfd/glamo/glamo-core.c b/drivers/mfd/glamo/glamo-core.c
+index 2619c5f..58ee3e2 100644
+--- a/drivers/mfd/glamo/glamo-core.c
++++ b/drivers/mfd/glamo/glamo-core.c
+@@ -524,6 +524,38 @@ int glamo_engine_disable(struct glamo_core *glamo, enum glamo_engine engine)
+ }
+ EXPORT_SYMBOL_GPL(glamo_engine_disable);
++static const u_int16_t engine_clock_regs[__NUM_GLAMO_ENGINES] = {
++      [GLAMO_ENGINE_LCD]      = GLAMO_REG_CLOCK_LCD,
++      [GLAMO_ENGINE_MMC]      = GLAMO_REG_CLOCK_MMC,
++      [GLAMO_ENGINE_ISP]      = GLAMO_REG_CLOCK_ISP,
++      [GLAMO_ENGINE_JPEG]     = GLAMO_REG_CLOCK_JPEG,
++      [GLAMO_ENGINE_3D]       = GLAMO_REG_CLOCK_3D,
++      [GLAMO_ENGINE_2D]       = GLAMO_REG_CLOCK_2D,
++      [GLAMO_ENGINE_MPEG_ENC] = GLAMO_REG_CLOCK_MPEG,
++      [GLAMO_ENGINE_MPEG_DEC] = GLAMO_REG_CLOCK_MPEG,
++};
++
++void glamo_engine_clkreg_set(struct glamo_core *glamo,
++                           enum glamo_engine engine,
++                           u_int16_t mask, u_int16_t val)
++{
++      reg_set_bit_mask(glamo, engine_clock_regs[engine], mask, val);
++}
++EXPORT_SYMBOL_GPL(glamo_engine_clkreg_set);
++
++u_int16_t glamo_engine_clkreg_get(struct glamo_core *glamo,
++                                enum glamo_engine engine)
++{
++      u_int16_t val;
++
++      spin_lock(&glamo->lock);
++      val = __reg_read(glamo, engine_clock_regs[engine]);
++      spin_unlock(&glamo->lock);
++
++      return val;
++}
++EXPORT_SYMBOL_GPL(glamo_engine_clkreg_get);
++
+ struct glamo_script reset_regs[] = {
+       [GLAMO_ENGINE_LCD] = {
+               GLAMO_REG_CLOCK_LCD, GLAMO_CLOCK_LCD_RESET
+diff --git a/drivers/mfd/glamo/glamo-core.h b/drivers/mfd/glamo/glamo-core.h
+index ac5eacf..fb5f0f6 100644
+--- a/drivers/mfd/glamo/glamo-core.h
++++ b/drivers/mfd/glamo/glamo-core.h
+@@ -98,4 +98,10 @@ void glamo_engine_reset(struct glamo_core *glamo, enum glamo_engine engine);
+ int glamo_engine_reclock(struct glamo_core *glamo,
+                        enum glamo_engine engine, int ps);
++void glamo_engine_clkreg_set(struct glamo_core *glamo,
++                           enum glamo_engine engine,
++                           u_int16_t mask, u_int16_t val);
++
++u_int16_t glamo_engine_clkreg_get(struct glamo_core *glamo,
++                                enum glamo_engine engine);
+ #endif /* __GLAMO_CORE_H */
+diff --git a/drivers/mfd/glamo/glamo-fb.c b/drivers/mfd/glamo/glamo-fb.c
+index 8f5d6b1..5cd6e05 100644
+--- a/drivers/mfd/glamo/glamo-fb.c
++++ b/drivers/mfd/glamo/glamo-fb.c
+@@ -420,7 +420,34 @@ static int glamofb_set_par(struct fb_info *info)
+ static int glamofb_blank(int blank_mode, struct fb_info *info)
+ {
+-      /* FIXME */
++      struct glamofb_handle *gfb = info->par;
++      struct glamo_core *gcore = gfb->mach_info->glamo;
++
++      dev_dbg(gfb->dev, "glamofb_blank(%u)\n", blank_mode);
++
++      switch (blank_mode) {
++      case FB_BLANK_VSYNC_SUSPEND:
++      case FB_BLANK_HSYNC_SUSPEND:
++              /* FIXME: add pdata hook/flag to indicate whether
++               * we should already switch off pixel clock here */
++              break;
++      case FB_BLANK_POWERDOWN:
++              /* disable the pixel clock */
++              glamo_engine_clkreg_set(gcore, GLAMO_ENGINE_LCD,
++                                      GLAMO_CLOCK_LCD_EN_DCLK, 0);
++              break;
++      case FB_BLANK_UNBLANK:
++      case FB_BLANK_NORMAL:
++              /* enable the pixel clock */
++              glamo_engine_clkreg_set(gcore, GLAMO_ENGINE_LCD,
++                                      GLAMO_CLOCK_LCD_EN_DCLK,
++                                      GLAMO_CLOCK_LCD_EN_DCLK);
++              break;
++      }
++
++      /* FIXME: once we have proper clock management in glamo-core,
++       * we can determine if other units need MCLK1 or the PLL, and
++       * disable it if not used. */
+       return 0;
+ }
+-- 
+1.5.6.5
+