[PATCH 4/4] Allow fbset to change pixclock
Chia-I Wu
olv at openmoko.com
Wed Dec 5 15:19:36 CET 2007
This is a multi-part message in MIME format.
--------------1.5.3.1
Content-Type: text/plain; charset=UTF-8; format=fixed
Content-Transfer-Encoding: 8bit
Adjust DCLK ratio to match the desired pixclock.
Signed-off-by: Chia-I Wu <olv at openmoko.com>
---
drivers/video/glamo/glamo-core.c | 105 +++++++++++++++++++++++++++----------
drivers/video/glamo/glamo-core.h | 2 +
drivers/video/glamo/glamo-fb.c | 5 ++
3 files changed, 83 insertions(+), 29 deletions(-)
--------------1.5.3.1
Content-Type: text/x-patch; name="52f9557c1ffc098c25d20c34535f7171355ce737.diff"
Content-Transfer-Encoding: 8bit
Content-Disposition: inline; filename="52f9557c1ffc098c25d20c34535f7171355ce737.diff"
diff --git a/drivers/video/glamo/glamo-core.c b/drivers/video/glamo/glamo-core.c
index 3a53e00..e2c2b95 100644
--- a/drivers/video/glamo/glamo-core.c
+++ b/drivers/video/glamo/glamo-core.c
@@ -488,9 +488,85 @@ void glamo_engine_reset(struct glamo_core *glamo, enum glamo_engine engine)
spin_lock(&glamo->lock);
__reg_clear_bit(glamo, rst->reg, rst->val);
spin_unlock(&glamo->lock);
+
+ msleep(1);
}
EXPORT_SYMBOL_GPL(glamo_engine_reset);
+enum glamo_pll {
+ GLAMO_PLL1,
+ GLAMO_PLL2,
+};
+
+static int glamo_pll_rate(struct glamo_core *glamo,
+ enum glamo_pll pll)
+{
+ u_int16_t reg;
+ unsigned int div = 512;
+ /* FIXME: move osci into platform_data */
+ unsigned int osci = 32768;
+
+ if (osci == 32768)
+ div = 1;
+
+ switch (pll) {
+ case GLAMO_PLL1:
+ reg = __reg_read(glamo, GLAMO_REG_PLL_GEN1);
+ break;
+ case GLAMO_PLL2:
+ reg = __reg_read(glamo, GLAMO_REG_PLL_GEN3);
+ break;
+ default:
+ return -EINVAL;
+ }
+ return (osci/div)*reg;
+}
+
+int glamo_engine_reclock(struct glamo_core *glamo,
+ enum glamo_engine engine,
+ int ps)
+{
+ int pll, khz;
+ u_int16_t reg, mask, val = 0;
+
+ if (!ps)
+ return 0;
+
+ switch (engine) {
+ case GLAMO_ENGINE_LCD:
+ pll = GLAMO_PLL1;
+ reg = GLAMO_REG_CLOCK_GEN7;
+ mask = 0xff;
+ break;
+ default:
+ dev_warn(&glamo->pdev->dev,
+ "reclock of engine 0x%x not supported\n", engine);
+ return -EINVAL;
+ break;
+ }
+
+ pll = glamo_pll_rate(glamo, pll);
+ khz = 1000000000UL / ps;
+
+ if (khz)
+ val = (pll / khz) / 1000;
+
+ dev_dbg(&glamo->pdev->dev,
+ "PLL %d, kHZ %d, div %d\n", pll, khz, val);
+
+ if (val) {
+ val--;
+
+ reg_set_bit_mask(glamo, reg, mask, val);
+ msleep(5); /* wait some time to stabilize */
+
+ return 0;
+ } else {
+ return -EINVAL;
+ }
+}
+EXPORT_SYMBOL_GPL(glamo_engine_reclock);
+
/***********************************************************************
* script support
***********************************************************************/
@@ -643,35 +719,6 @@ static const struct glamo_script regs_vram_8mb = {
};
#endif
-enum glamo_pll {
- GLAMO_PLL1,
- GLAMO_PLL2,
-};
-
-static int glamo_pll_rate(struct glamo_core *glamo,
- enum glamo_pll pll)
-{
- u_int16_t reg;
- unsigned int div = 512;
- /* FIXME: move osci into platform_data */
- unsigned int osci = 32768;
-
- if (osci == 32768)
- div = 1;
-
- switch (pll) {
- case GLAMO_PLL1:
- reg = __reg_read(glamo, GLAMO_REG_PLL_GEN1);
- break;
- case GLAMO_PLL2:
- reg = __reg_read(glamo, GLAMO_REG_PLL_GEN3);
- break;
- default:
- return -EINVAL;
- }
- return (osci/div)*reg;
-}
-
enum glamo_power {
GLAMO_POWER_ON,
GLAMO_POWER_STANDBY,
diff --git a/drivers/video/glamo/glamo-core.h b/drivers/video/glamo/glamo-core.h
index a66e847..215bd9e 100644
--- a/drivers/video/glamo/glamo-core.h
+++ b/drivers/video/glamo/glamo-core.h
@@ -47,5 +47,7 @@ enum glamo_engine {
int glamo_engine_enable(struct glamo_core *glamo, enum glamo_engine engine);
int glamo_engine_disable(struct glamo_core *glamo, enum glamo_engine engine);
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);
#endif /* __GLAMO_CORE_H */
diff --git a/drivers/video/glamo/glamo-fb.c b/drivers/video/glamo/glamo-fb.c
index 2a5814f..8ccf9fc 100644
--- a/drivers/video/glamo/glamo-fb.c
+++ b/drivers/video/glamo/glamo-fb.c
@@ -201,6 +201,11 @@ static void glamofb_activate_var(struct glamofb_handle *glamo,
glamofb_cmd_mode(glamo, 1);
+ if (var->pixclock)
+ glamo_engine_reclock(glamo->mach_info->glamo,
+ GLAMO_ENGINE_LCD,
+ var->pixclock);
+
/* XXX highest bits of the following two regs have other meanings */
reg_write(glamo, GLAMO_REG_LCD_WIDTH, var->xres);
reg_write(glamo, GLAMO_REG_LCD_HEIGHT, var->yres);
--------------1.5.3.1--
More information about the openmoko-kernel
mailing list