linux-fbdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 00/10] video: da8xx-fb: runtime timing configuration and cleanup
@ 2012-12-07 11:55 Afzal Mohammed
  2012-12-07 11:55 ` [PATCH 01/10] video: da8xx-fb: fb_check_var enhancement Afzal Mohammed
                   ` (9 more replies)
  0 siblings, 10 replies; 11+ messages in thread
From: Afzal Mohammed @ 2012-12-07 11:55 UTC (permalink / raw)
  To: Florian Tobias Schandinat, Tomi Valkeinen
  Cc: Vaibhav Hiremath, Sekhar Nori, linux-fbdev, linux-kernel

Hi,

This series makes da8xx-fb driver (device found on DaVinci and AM335x)
capable of handling runtime timing configuration by adding fb_set_par.

The last change adds actual fb_set_par support. Other preceeding
changes makes the way clear for it as well as does certain cleanup's
on the way.

This has been tested on DA850 EVM.

Not sure whether Florian or Tomi would be handling fbdev patches after
the coming merge window, as Tomi is queueing fbdev patches currently,
these changes has been made over Tomi Valkeinen's for-next branch.

Regards
Afzal

Afzal Mohammed (10):
  video: da8xx-fb: fb_check_var enhancement
  video: da8xx-fb: simplify lcd_reset
  video: da8xx-fb: use modedb helper to update var
  video: da8xx-fb: remove unneeded "var" initialization
  video: da8xx-fb: store current display information
  video: da8xx-fb: store clk rate even if !CPUFREQ
  video: da8xx-fb: pix clk and clk div handling cleanup
  video: da8xx-fb: store struct device *
  video: da8xx-fb: report correct pixclock
  video: da8xx-fb: fb_set_par support

 drivers/video/da8xx-fb.c | 181 +++++++++++++++++++++++++++--------------------
 1 file changed, 105 insertions(+), 76 deletions(-)

-- 
1.7.12


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [PATCH 01/10] video: da8xx-fb: fb_check_var enhancement
  2012-12-07 11:55 [PATCH 00/10] video: da8xx-fb: runtime timing configuration and cleanup Afzal Mohammed
@ 2012-12-07 11:55 ` Afzal Mohammed
  2012-12-07 11:55 ` [PATCH 02/10] video: da8xx-fb: simplify lcd_reset Afzal Mohammed
                   ` (8 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Afzal Mohammed @ 2012-12-07 11:55 UTC (permalink / raw)
  To: Florian Tobias Schandinat, Tomi Valkeinen
  Cc: Vaibhav Hiremath, Sekhar Nori, linux-fbdev, linux-kernel,
	Afzal Mohammed

Check whether "struct fb_var_screeninfo" fields are sane, if not
update it to be within allowed limits.

If user sends down buggy "var" values, this will bring those within
allowable limits. And fb_set_par is not supposed to change "var"
values, fb_check_var has to ensure that values are proper.

Signed-off-by: Afzal Mohammed <afzal@ti.com>
---
 drivers/video/da8xx-fb.c | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)

diff --git a/drivers/video/da8xx-fb.c b/drivers/video/da8xx-fb.c
index 46534e0..89446aa 100644
--- a/drivers/video/da8xx-fb.c
+++ b/drivers/video/da8xx-fb.c
@@ -888,6 +888,9 @@ static int fb_check_var(struct fb_var_screeninfo *var,
 			struct fb_info *info)
 {
 	int err = 0;
+	struct da8xx_fb_par *par = info->par;
+	int bpp = var->bits_per_pixel >> 3;
+	unsigned long line_size = var->xres_virtual * bpp;
 
 	if (var->bits_per_pixel > 16 && lcd_revision = LCD_VERSION_1)
 		return -EINVAL;
@@ -955,6 +958,21 @@ static int fb_check_var(struct fb_var_screeninfo *var,
 	var->green.msb_right = 0;
 	var->blue.msb_right = 0;
 	var->transp.msb_right = 0;
+
+	if (line_size * var->yres_virtual > par->vram_size)
+		var->yres_virtual = par->vram_size / line_size;
+
+	if (var->yres > var->yres_virtual)
+		var->yres = var->yres_virtual;
+
+	if (var->xres > var->xres_virtual)
+		var->xres = var->xres_virtual;
+
+	if (var->xres + var->xoffset > var->xres_virtual)
+		var->xoffset = var->xres_virtual - var->xres;
+	if (var->yres + var->yoffset > var->yres_virtual)
+		var->yoffset = var->yres_virtual - var->yres;
+
 	return err;
 }
 
-- 
1.7.12


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 02/10] video: da8xx-fb: simplify lcd_reset
  2012-12-07 11:55 [PATCH 00/10] video: da8xx-fb: runtime timing configuration and cleanup Afzal Mohammed
  2012-12-07 11:55 ` [PATCH 01/10] video: da8xx-fb: fb_check_var enhancement Afzal Mohammed
@ 2012-12-07 11:55 ` Afzal Mohammed
  2012-12-07 11:55 ` [PATCH 03/10] video: da8xx-fb: use modedb helper to update var Afzal Mohammed
                   ` (7 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Afzal Mohammed @ 2012-12-07 11:55 UTC (permalink / raw)
  To: Florian Tobias Schandinat, Tomi Valkeinen
  Cc: Vaibhav Hiremath, Sekhar Nori, linux-fbdev, linux-kernel,
	Afzal Mohammed

lcd_reset function doesn't require any arguement, remove it.

Signed-off-by: Afzal Mohammed <afzal@ti.com>
---
 drivers/video/da8xx-fb.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/video/da8xx-fb.c b/drivers/video/da8xx-fb.c
index 89446aa..c8e97de 100644
--- a/drivers/video/da8xx-fb.c
+++ b/drivers/video/da8xx-fb.c
@@ -681,7 +681,7 @@ static int fb_setcolreg(unsigned regno, unsigned red, unsigned green,
 }
 #undef CNVT_TOHW
 
-static void lcd_reset(struct da8xx_fb_par *par)
+static void da8xx_fb_lcd_reset(void)
 {
 	/* Disable the Raster if previously Enabled */
 	lcd_disable_raster(false);
@@ -721,7 +721,7 @@ static int lcd_init(struct da8xx_fb_par *par, const struct lcd_ctrl_config *cfg,
 	u32 bpp;
 	int ret = 0;
 
-	lcd_reset(par);
+	da8xx_fb_lcd_reset();
 
 	/* Calculate the divider */
 	lcd_calc_clk_divider(par);
-- 
1.7.12


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 03/10] video: da8xx-fb: use modedb helper to update var
  2012-12-07 11:55 [PATCH 00/10] video: da8xx-fb: runtime timing configuration and cleanup Afzal Mohammed
  2012-12-07 11:55 ` [PATCH 01/10] video: da8xx-fb: fb_check_var enhancement Afzal Mohammed
  2012-12-07 11:55 ` [PATCH 02/10] video: da8xx-fb: simplify lcd_reset Afzal Mohammed
@ 2012-12-07 11:55 ` Afzal Mohammed
  2012-12-07 11:55 ` [PATCH 04/10] video: da8xx-fb: remove unneeded "var" initialization Afzal Mohammed
                   ` (6 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Afzal Mohammed @ 2012-12-07 11:55 UTC (permalink / raw)
  To: Florian Tobias Schandinat, Tomi Valkeinen
  Cc: Vaibhav Hiremath, Sekhar Nori, linux-fbdev, linux-kernel,
	Afzal Mohammed

modedb structure is now used to store panel information, run modedb
helper over it for initial update of "var" information instead of
equating each fields.

While at it, remove redundant update of bits_per_pixel.

Note: pixclock is overridden with proper value using an existing code
as currently modedb is having it in Hz instead of ps, this would be
fixed in a later change and this overide would be removed.

Signed-off-by: Afzal Mohammed <afzal@ti.com>
---
 drivers/video/da8xx-fb.c | 18 ++----------------
 1 file changed, 2 insertions(+), 16 deletions(-)

diff --git a/drivers/video/da8xx-fb.c b/drivers/video/da8xx-fb.c
index c8e97de..0c404ed 100644
--- a/drivers/video/da8xx-fb.c
+++ b/drivers/video/da8xx-fb.c
@@ -1329,6 +1329,8 @@ static int __devinit fb_probe(struct platform_device *device)
 		par->panel_power_ctrl(1);
 	}
 
+	fb_videomode_to_var(&da8xx_fb_var, lcdc_info);
+
 	if (lcd_init(par, lcd_cfg, lcdc_info) < 0) {
 		dev_err(&device->dev, "lcd_init failed\n");
 		ret = -EFAULT;
@@ -1381,25 +1383,9 @@ static int __devinit fb_probe(struct platform_device *device)
 		goto err_release_pl_mem;
 	}
 
-	/* Initialize par */
-	da8xx_fb_info->var.bits_per_pixel = lcd_cfg->bpp;
-
-	da8xx_fb_var.xres = lcdc_info->xres;
-	da8xx_fb_var.xres_virtual = lcdc_info->xres;
-
-	da8xx_fb_var.yres         = lcdc_info->yres;
-	da8xx_fb_var.yres_virtual = lcdc_info->yres * LCD_NUM_BUFFERS;
-
 	da8xx_fb_var.grayscale  	    lcd_cfg->panel_shade = MONOCHROME ? 1 : 0;
 	da8xx_fb_var.bits_per_pixel = lcd_cfg->bpp;
-
-	da8xx_fb_var.hsync_len = lcdc_info->hsync_len;
-	da8xx_fb_var.vsync_len = lcdc_info->vsync_len;
-	da8xx_fb_var.right_margin = lcdc_info->right_margin;
-	da8xx_fb_var.left_margin  = lcdc_info->left_margin;
-	da8xx_fb_var.lower_margin = lcdc_info->lower_margin;
-	da8xx_fb_var.upper_margin = lcdc_info->upper_margin;
 	da8xx_fb_var.pixclock = da8xxfb_pixel_clk_period(par);
 
 	/* Initialize fbinfo */
-- 
1.7.12


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 04/10] video: da8xx-fb: remove unneeded "var" initialization
  2012-12-07 11:55 [PATCH 00/10] video: da8xx-fb: runtime timing configuration and cleanup Afzal Mohammed
                   ` (2 preceding siblings ...)
  2012-12-07 11:55 ` [PATCH 03/10] video: da8xx-fb: use modedb helper to update var Afzal Mohammed
@ 2012-12-07 11:55 ` Afzal Mohammed
  2012-12-07 11:56 ` [PATCH 05/10] video: da8xx-fb: store current display information Afzal Mohammed
                   ` (5 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Afzal Mohammed @ 2012-12-07 11:55 UTC (permalink / raw)
  To: Florian Tobias Schandinat, Tomi Valkeinen
  Cc: Vaibhav Hiremath, Sekhar Nori, linux-fbdev, linux-kernel,
	Afzal Mohammed

modedb helper now updates "var" information based on the detected
panel, remove the unnecessary initialization.

Signed-off-by: Afzal Mohammed <afzal@ti.com>
---
 drivers/video/da8xx-fb.c | 18 +-----------------
 1 file changed, 1 insertion(+), 17 deletions(-)

diff --git a/drivers/video/da8xx-fb.c b/drivers/video/da8xx-fb.c
index 0c404ed..79862ff 100644
--- a/drivers/video/da8xx-fb.c
+++ b/drivers/video/da8xx-fb.c
@@ -184,23 +184,7 @@ struct da8xx_fb_par {
 	u32 pseudo_palette[16];
 };
 
-/* Variable Screen Information */
-static struct fb_var_screeninfo da8xx_fb_var __devinitdata = {
-	.xoffset = 0,
-	.yoffset = 0,
-	.transp = {0, 0, 0},
-	.nonstd = 0,
-	.activate = 0,
-	.height = -1,
-	.width = -1,
-	.accel_flags = 0,
-	.left_margin = LEFT_MARGIN,
-	.right_margin = RIGHT_MARGIN,
-	.upper_margin = UPPER_MARGIN,
-	.lower_margin = LOWER_MARGIN,
-	.sync = 0,
-	.vmode = FB_VMODE_NONINTERLACED
-};
+static struct fb_var_screeninfo da8xx_fb_var;
 
 static struct fb_fix_screeninfo da8xx_fb_fix __devinitdata = {
 	.id = "DA8xx FB Drv",
-- 
1.7.12


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 05/10] video: da8xx-fb: store current display information
  2012-12-07 11:55 [PATCH 00/10] video: da8xx-fb: runtime timing configuration and cleanup Afzal Mohammed
                   ` (3 preceding siblings ...)
  2012-12-07 11:55 ` [PATCH 04/10] video: da8xx-fb: remove unneeded "var" initialization Afzal Mohammed
@ 2012-12-07 11:56 ` Afzal Mohammed
  2012-12-07 11:56 ` [PATCH 06/10] video: da8xx-fb: store clk rate even if !CPUFREQ Afzal Mohammed
                   ` (4 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Afzal Mohammed @ 2012-12-07 11:56 UTC (permalink / raw)
  To: Florian Tobias Schandinat, Tomi Valkeinen
  Cc: Vaibhav Hiremath, Sekhar Nori, linux-fbdev, linux-kernel,
	Afzal Mohammed

store current videomode and controller data so that reconfiguring can
be done easily. Reconfiguring would be required in fb_set_par, which
is going to be added soon.

If these details are not stored, the work probe does to retrieve these
information would have to repeated at the place of reconfiguring and
modifying platform data would be necessary to handle controller data
changes like bpp.

Signed-off-by: Afzal Mohammed <afzal@ti.com>
---
 drivers/video/da8xx-fb.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/drivers/video/da8xx-fb.c b/drivers/video/da8xx-fb.c
index 79862ff..072074d 100644
--- a/drivers/video/da8xx-fb.c
+++ b/drivers/video/da8xx-fb.c
@@ -182,6 +182,8 @@ struct da8xx_fb_par {
 #endif
 	void (*panel_power_ctrl)(int);
 	u32 pseudo_palette[16];
+	struct fb_videomode	mode;
+	struct lcd_ctrl_config	cfg;
 };
 
 static struct fb_var_screeninfo da8xx_fb_var;
@@ -1314,6 +1316,8 @@ static int __devinit fb_probe(struct platform_device *device)
 	}
 
 	fb_videomode_to_var(&da8xx_fb_var, lcdc_info);
+	fb_var_to_videomode(&par->mode, &da8xx_fb_var);
+	par->cfg = *lcd_cfg;
 
 	if (lcd_init(par, lcd_cfg, lcdc_info) < 0) {
 		dev_err(&device->dev, "lcd_init failed\n");
-- 
1.7.12


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 06/10] video: da8xx-fb: store clk rate even if !CPUFREQ
  2012-12-07 11:55 [PATCH 00/10] video: da8xx-fb: runtime timing configuration and cleanup Afzal Mohammed
                   ` (4 preceding siblings ...)
  2012-12-07 11:56 ` [PATCH 05/10] video: da8xx-fb: store current display information Afzal Mohammed
@ 2012-12-07 11:56 ` Afzal Mohammed
  2012-12-07 11:56 ` [PATCH 07/10] video: da8xx-fb: pix clk and clk div handling cleanup Afzal Mohammed
                   ` (3 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Afzal Mohammed @ 2012-12-07 11:56 UTC (permalink / raw)
  To: Florian Tobias Schandinat, Tomi Valkeinen
  Cc: Vaibhav Hiremath, Sekhar Nori, linux-fbdev, linux-kernel,
	Afzal Mohammed

store lcd clk rate always, i.e. irrespective of whether CPUFREQ is
enabled or not. This can be used to get clk rate directly instead of
enquiring with clock framework with clk handle every time.

Signed-off-by: Afzal Mohammed <afzal@ti.com>
---
 drivers/video/da8xx-fb.c | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/drivers/video/da8xx-fb.c b/drivers/video/da8xx-fb.c
index 072074d..e858438 100644
--- a/drivers/video/da8xx-fb.c
+++ b/drivers/video/da8xx-fb.c
@@ -178,8 +178,8 @@ struct da8xx_fb_par {
 	unsigned int		which_dma_channel_done;
 #ifdef CONFIG_CPU_FREQ
 	struct notifier_block	freq_transition;
-	unsigned int		lcd_fck_rate;
 #endif
+	unsigned int		lcd_fck_rate;
 	void (*panel_power_ctrl)(int);
 	u32 pseudo_palette[16];
 	struct fb_videomode	mode;
@@ -1306,9 +1306,7 @@ static int __devinit fb_probe(struct platform_device *device)
 
 	par = da8xx_fb_info->par;
 	par->lcdc_clk = fb_clk;
-#ifdef CONFIG_CPU_FREQ
 	par->lcd_fck_rate = clk_get_rate(fb_clk);
-#endif
 	par->pxl_clk = lcdc_info->pixclock;
 	if (fb_pdata->panel_power_ctrl) {
 		par->panel_power_ctrl = fb_pdata->panel_power_ctrl;
-- 
1.7.12


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 07/10] video: da8xx-fb: pix clk and clk div handling cleanup
  2012-12-07 11:55 [PATCH 00/10] video: da8xx-fb: runtime timing configuration and cleanup Afzal Mohammed
                   ` (5 preceding siblings ...)
  2012-12-07 11:56 ` [PATCH 06/10] video: da8xx-fb: store clk rate even if !CPUFREQ Afzal Mohammed
@ 2012-12-07 11:56 ` Afzal Mohammed
  2012-12-07 11:56 ` [PATCH 08/10] video: da8xx-fb: store struct device * Afzal Mohammed
                   ` (2 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Afzal Mohammed @ 2012-12-07 11:56 UTC (permalink / raw)
  To: Florian Tobias Schandinat, Tomi Valkeinen
  Cc: Vaibhav Hiremath, Sekhar Nori, linux-fbdev, linux-kernel,
	Afzal Mohammed

Use the new modedb field to store pix clk. Reorganize existing clock
divider functions with names now corresponding to what they do, add
common function prefix.

Fix existing panel modedb pixclock to be in ps instead of Hz. This
needed a change in the way clock divider is calculated. As modedb
pixclock information is now in ps, override on "var" pixclock over
modedb to var conversion is removed.

Signed-off-by: Afzal Mohammed <afzal@ti.com>
---
 drivers/video/da8xx-fb.c | 48 ++++++++++++++++++------------------------------
 1 file changed, 18 insertions(+), 30 deletions(-)

diff --git a/drivers/video/da8xx-fb.c b/drivers/video/da8xx-fb.c
index e858438..19ee560 100644
--- a/drivers/video/da8xx-fb.c
+++ b/drivers/video/da8xx-fb.c
@@ -164,7 +164,6 @@ struct da8xx_fb_par {
 	struct clk *lcdc_clk;
 	int irq;
 	unsigned int palette_sz;
-	unsigned int pxl_clk;
 	int blank;
 	wait_queue_head_t	vsync_wait;
 	int			vsync_flag;
@@ -205,7 +204,7 @@ static struct fb_videomode known_lcd_panels[] = {
 		.name           = "Sharp_LCD035Q3DG01",
 		.xres           = 320,
 		.yres           = 240,
-		.pixclock       = 4608000,
+		.pixclock       = 217014,
 		.left_margin    = 6,
 		.right_margin   = 8,
 		.upper_margin   = 2,
@@ -220,7 +219,7 @@ static struct fb_videomode known_lcd_panels[] = {
 		.name           = "Sharp_LK043T1DG01",
 		.xres           = 480,
 		.yres           = 272,
-		.pixclock       = 7833600,
+		.pixclock       = 127655,
 		.left_margin    = 2,
 		.right_margin   = 2,
 		.upper_margin   = 2,
@@ -235,7 +234,7 @@ static struct fb_videomode known_lcd_panels[] = {
 		.name           = "SP10Q010",
 		.xres           = 320,
 		.yres           = 240,
-		.pixclock       = 7833600,
+		.pixclock       = 127655,
 		.left_margin    = 10,
 		.right_margin   = 10,
 		.upper_margin   = 10,
@@ -684,13 +683,14 @@ static void da8xx_fb_lcd_reset(void)
 	}
 }
 
-static void lcd_calc_clk_divider(struct da8xx_fb_par *par)
+static inline unsigned da8xx_fb_calc_clk_divider(struct da8xx_fb_par *par,
+						 unsigned pixclock)
 {
-	unsigned int lcd_clk, div;
-
-	lcd_clk = clk_get_rate(par->lcdc_clk);
-	div = lcd_clk / par->pxl_clk;
+	return par->lcd_fck_rate / (PICOS2KHZ(pixclock) * 1000);
+}
 
+static inline void da8xx_fb_config_clk_divider(unsigned div)
+{
 	/* Configure the LCD clock divisor. */
 	lcdc_write(LCD_CLK_DIVISOR(div) |
 			(LCD_RASTER_MODE & 0x1), LCD_CTRL_REG);
@@ -698,7 +698,14 @@ static void lcd_calc_clk_divider(struct da8xx_fb_par *par)
 	if (lcd_revision = LCD_VERSION_2)
 		lcdc_write(LCD_V2_DMA_CLK_EN | LCD_V2_LIDD_CLK_EN |
 				LCD_V2_CORE_CLK_EN, LCD_CLK_ENABLE_REG);
+}
+
+static inline void da8xx_fb_calc_config_clk_divider(struct da8xx_fb_par *par,
+						    struct fb_videomode *mode)
+{
+	unsigned div = da8xx_fb_calc_clk_divider(par, mode->pixclock);
 
+	da8xx_fb_config_clk_divider(div);
 }
 
 static int lcd_init(struct da8xx_fb_par *par, const struct lcd_ctrl_config *cfg,
@@ -709,8 +716,7 @@ static int lcd_init(struct da8xx_fb_par *par, const struct lcd_ctrl_config *cfg,
 
 	da8xx_fb_lcd_reset();
 
-	/* Calculate the divider */
-	lcd_calc_clk_divider(par);
+	da8xx_fb_calc_config_clk_divider(par, panel);
 
 	if (panel->sync & FB_SYNC_CLK_INVERT)
 		lcdc_write((lcdc_read(LCD_RASTER_TIMING_2_REG) |
@@ -973,7 +979,7 @@ static int lcd_da8xx_cpufreq_transition(struct notifier_block *nb,
 		if (par->lcd_fck_rate != clk_get_rate(par->lcdc_clk)) {
 			par->lcd_fck_rate = clk_get_rate(par->lcdc_clk);
 			lcd_disable_raster(true);
-			lcd_calc_clk_divider(par);
+			da8xx_fb_calc_config_clk_divider(par, &par->mode);
 			if (par->blank = FB_BLANK_UNBLANK)
 				lcd_enable_raster();
 		}
@@ -1199,22 +1205,6 @@ static struct fb_ops da8xx_fb_ops = {
 	.fb_blank = cfb_blank,
 };
 
-/* Calculate and return pixel clock period in pico seconds */
-static unsigned int da8xxfb_pixel_clk_period(struct da8xx_fb_par *par)
-{
-	unsigned int lcd_clk, div;
-	unsigned int configured_pix_clk;
-	unsigned long long pix_clk_period_picosec = 1000000000000ULL;
-
-	lcd_clk = clk_get_rate(par->lcdc_clk);
-	div = lcd_clk / par->pxl_clk;
-	configured_pix_clk = (lcd_clk / div);
-
-	do_div(pix_clk_period_picosec, configured_pix_clk);
-
-	return pix_clk_period_picosec;
-}
-
 static int __devinit fb_probe(struct platform_device *device)
 {
 	struct da8xx_lcdc_platform_data *fb_pdata @@ -1307,7 +1297,6 @@ static int __devinit fb_probe(struct platform_device *device)
 	par = da8xx_fb_info->par;
 	par->lcdc_clk = fb_clk;
 	par->lcd_fck_rate = clk_get_rate(fb_clk);
-	par->pxl_clk = lcdc_info->pixclock;
 	if (fb_pdata->panel_power_ctrl) {
 		par->panel_power_ctrl = fb_pdata->panel_power_ctrl;
 		par->panel_power_ctrl(1);
@@ -1372,7 +1361,6 @@ static int __devinit fb_probe(struct platform_device *device)
 	da8xx_fb_var.grayscale  	    lcd_cfg->panel_shade = MONOCHROME ? 1 : 0;
 	da8xx_fb_var.bits_per_pixel = lcd_cfg->bpp;
-	da8xx_fb_var.pixclock = da8xxfb_pixel_clk_period(par);
 
 	/* Initialize fbinfo */
 	da8xx_fb_info->flags = FBINFO_FLAG_DEFAULT;
-- 
1.7.12


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 08/10] video: da8xx-fb: store struct device *
  2012-12-07 11:55 [PATCH 00/10] video: da8xx-fb: runtime timing configuration and cleanup Afzal Mohammed
                   ` (6 preceding siblings ...)
  2012-12-07 11:56 ` [PATCH 07/10] video: da8xx-fb: pix clk and clk div handling cleanup Afzal Mohammed
@ 2012-12-07 11:56 ` Afzal Mohammed
  2012-12-07 11:56 ` [PATCH 09/10] video: da8xx-fb: report correct pixclock Afzal Mohammed
  2012-12-07 11:56 ` [PATCH 10/10] video: da8xx-fb: fb_set_par support Afzal Mohammed
  9 siblings, 0 replies; 11+ messages in thread
From: Afzal Mohammed @ 2012-12-07 11:56 UTC (permalink / raw)
  To: Florian Tobias Schandinat, Tomi Valkeinen
  Cc: Vaibhav Hiremath, Sekhar Nori, linux-fbdev, linux-kernel,
	Afzal Mohammed

store struct device pointer so that dev_dbg/err can be used outside
of probe.

Signed-off-by: Afzal Mohammed <afzal@ti.com>
---
 drivers/video/da8xx-fb.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/video/da8xx-fb.c b/drivers/video/da8xx-fb.c
index 19ee560..663b3c5 100644
--- a/drivers/video/da8xx-fb.c
+++ b/drivers/video/da8xx-fb.c
@@ -154,6 +154,7 @@ static inline void lcdc_write(unsigned int val, unsigned int addr)
 }
 
 struct da8xx_fb_par {
+	struct device		*dev;
 	resource_size_t p_palette_base;
 	unsigned char *v_palette_base;
 	dma_addr_t		vram_phys;
@@ -1295,6 +1296,7 @@ static int __devinit fb_probe(struct platform_device *device)
 	}
 
 	par = da8xx_fb_info->par;
+	par->dev = &device->dev;
 	par->lcdc_clk = fb_clk;
 	par->lcd_fck_rate = clk_get_rate(fb_clk);
 	if (fb_pdata->panel_power_ctrl) {
-- 
1.7.12


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 09/10] video: da8xx-fb: report correct pixclock
  2012-12-07 11:55 [PATCH 00/10] video: da8xx-fb: runtime timing configuration and cleanup Afzal Mohammed
                   ` (7 preceding siblings ...)
  2012-12-07 11:56 ` [PATCH 08/10] video: da8xx-fb: store struct device * Afzal Mohammed
@ 2012-12-07 11:56 ` Afzal Mohammed
  2012-12-07 11:56 ` [PATCH 10/10] video: da8xx-fb: fb_set_par support Afzal Mohammed
  9 siblings, 0 replies; 11+ messages in thread
From: Afzal Mohammed @ 2012-12-07 11:56 UTC (permalink / raw)
  To: Florian Tobias Schandinat, Tomi Valkeinen
  Cc: Vaibhav Hiremath, Sekhar Nori, linux-fbdev, linux-kernel,
	Afzal Mohammed

Update "var" pixclock with the value that is configurable in hardware.
This lets user know the actual pixclock.

Signed-off-by: Afzal Mohammed <afzal@ti.com>
---
 drivers/video/da8xx-fb.c | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/drivers/video/da8xx-fb.c b/drivers/video/da8xx-fb.c
index 663b3c5..c7393f1 100644
--- a/drivers/video/da8xx-fb.c
+++ b/drivers/video/da8xx-fb.c
@@ -690,6 +690,15 @@ static inline unsigned da8xx_fb_calc_clk_divider(struct da8xx_fb_par *par,
 	return par->lcd_fck_rate / (PICOS2KHZ(pixclock) * 1000);
 }
 
+static inline unsigned da8xx_fb_round_clk(struct da8xx_fb_par *par,
+					  unsigned pixclock)
+{
+	unsigned div;
+
+	div = da8xx_fb_calc_clk_divider(par, pixclock);
+	return KHZ2PICOS(par->lcd_fck_rate / (1000 * div));
+}
+
 static inline void da8xx_fb_config_clk_divider(unsigned div)
 {
 	/* Configure the LCD clock divisor. */
@@ -966,6 +975,8 @@ static int fb_check_var(struct fb_var_screeninfo *var,
 	if (var->yres + var->yoffset > var->yres_virtual)
 		var->yoffset = var->yres_virtual - var->yres;
 
+	var->pixclock = da8xx_fb_round_clk(par, var->pixclock);
+
 	return err;
 }
 
-- 
1.7.12


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 10/10] video: da8xx-fb: fb_set_par support
  2012-12-07 11:55 [PATCH 00/10] video: da8xx-fb: runtime timing configuration and cleanup Afzal Mohammed
                   ` (8 preceding siblings ...)
  2012-12-07 11:56 ` [PATCH 09/10] video: da8xx-fb: report correct pixclock Afzal Mohammed
@ 2012-12-07 11:56 ` Afzal Mohammed
  9 siblings, 0 replies; 11+ messages in thread
From: Afzal Mohammed @ 2012-12-07 11:56 UTC (permalink / raw)
  To: Florian Tobias Schandinat, Tomi Valkeinen
  Cc: Vaibhav Hiremath, Sekhar Nori, linux-fbdev, linux-kernel,
	Afzal Mohammed

fb_set_par helps in runtime configuration of lcd controller like
changing resolution, pixel clock etc. (eg. using fbset utility)

Reconfigure lcd controller based on information passed by framework.
Enable raster back if it was already enabled.

As fb_set_par would get invoked indirectly from probe via fb_set_var,
remove existing lcdc initialization in probe and do lcdc reset in
probe so that reset happens only at the begining.

Signed-off-by: Afzal Mohammed <afzal@ti.com>
---
 drivers/video/da8xx-fb.c | 60 +++++++++++++++++++++++++++++++++++++++---------
 1 file changed, 49 insertions(+), 11 deletions(-)

diff --git a/drivers/video/da8xx-fb.c b/drivers/video/da8xx-fb.c
index c7393f1..1293ab9 100644
--- a/drivers/video/da8xx-fb.c
+++ b/drivers/video/da8xx-fb.c
@@ -247,6 +247,11 @@ static struct fb_videomode known_lcd_panels[] = {
 	},
 };
 
+static inline bool da8xx_fb_is_raster_enabled(void)
+{
+	return !!(lcdc_read(LCD_RASTER_CTRL_REG) & LCD_RASTER_ENABLE);
+}
+
 /* Enable the Raster Engine of the LCD Controller */
 static inline void lcd_enable_raster(void)
 {
@@ -669,9 +674,6 @@ static int fb_setcolreg(unsigned regno, unsigned red, unsigned green,
 
 static void da8xx_fb_lcd_reset(void)
 {
-	/* Disable the Raster if previously Enabled */
-	lcd_disable_raster(false);
-
 	/* DMA has to be disabled */
 	lcdc_write(0, LCD_DMA_CTRL_REG);
 	lcdc_write(0, LCD_RASTER_CTRL_REG);
@@ -724,8 +726,6 @@ static int lcd_init(struct da8xx_fb_par *par, const struct lcd_ctrl_config *cfg,
 	u32 bpp;
 	int ret = 0;
 
-	da8xx_fb_lcd_reset();
-
 	da8xx_fb_calc_config_clk_divider(par, panel);
 
 	if (panel->sync & FB_SYNC_CLK_INVERT)
@@ -1205,9 +1205,52 @@ static int da8xx_pan_display(struct fb_var_screeninfo *var,
 	return ret;
 }
 
+static int da8xxfb_set_par(struct fb_info *info)
+{
+	struct da8xx_fb_par *par = info->par;
+	int ret;
+	bool raster = da8xx_fb_is_raster_enabled();
+
+	if (raster)
+		lcd_disable_raster(false);
+	else
+		lcd_disable_raster(true);
+
+	fb_var_to_videomode(&par->mode, &info->var);
+
+	par->cfg.bpp = info->var.bits_per_pixel;
+
+	info->fix.visual = (par->cfg.bpp <= 8) ?
+				FB_VISUAL_PSEUDOCOLOR : FB_VISUAL_TRUECOLOR;
+	info->fix.line_length = (par->mode.xres * par->cfg.bpp) / 8;
+
+	ret = lcd_init(par, &par->cfg, &par->mode);
+	if (ret < 0) {
+		dev_err(par->dev, "lcd init failed\n");
+		return ret;
+	}
+
+	par->dma_start = info->fix.smem_start +
+			 info->var.yoffset * info->fix.line_length +
+			 info->var.xoffset * info->var.bits_per_pixel / 8;
+	par->dma_end   = par->dma_start +
+			 info->var.yres * info->fix.line_length - 1;
+
+	lcdc_write(par->dma_start, LCD_DMA_FRM_BUF_BASE_ADDR_0_REG);
+	lcdc_write(par->dma_end, LCD_DMA_FRM_BUF_CEILING_ADDR_0_REG);
+	lcdc_write(par->dma_start, LCD_DMA_FRM_BUF_BASE_ADDR_1_REG);
+	lcdc_write(par->dma_end, LCD_DMA_FRM_BUF_CEILING_ADDR_1_REG);
+
+	if (raster)
+		lcd_enable_raster();
+
+	return 0;
+}
+
 static struct fb_ops da8xx_fb_ops = {
 	.owner = THIS_MODULE,
 	.fb_check_var = fb_check_var,
+	.fb_set_par = da8xxfb_set_par,
 	.fb_setcolreg = fb_setcolreg,
 	.fb_pan_display = da8xx_pan_display,
 	.fb_ioctl = fb_ioctl,
@@ -1316,14 +1359,9 @@ static int __devinit fb_probe(struct platform_device *device)
 	}
 
 	fb_videomode_to_var(&da8xx_fb_var, lcdc_info);
-	fb_var_to_videomode(&par->mode, &da8xx_fb_var);
 	par->cfg = *lcd_cfg;
 
-	if (lcd_init(par, lcd_cfg, lcdc_info) < 0) {
-		dev_err(&device->dev, "lcd_init failed\n");
-		ret = -EFAULT;
-		goto err_release_fb;
-	}
+	da8xx_fb_lcd_reset();
 
 	/* allocate frame buffer */
 	par->vram_size = lcdc_info->xres * lcdc_info->yres * lcd_cfg->bpp;
-- 
1.7.12


^ permalink raw reply related	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2012-12-07 11:56 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-12-07 11:55 [PATCH 00/10] video: da8xx-fb: runtime timing configuration and cleanup Afzal Mohammed
2012-12-07 11:55 ` [PATCH 01/10] video: da8xx-fb: fb_check_var enhancement Afzal Mohammed
2012-12-07 11:55 ` [PATCH 02/10] video: da8xx-fb: simplify lcd_reset Afzal Mohammed
2012-12-07 11:55 ` [PATCH 03/10] video: da8xx-fb: use modedb helper to update var Afzal Mohammed
2012-12-07 11:55 ` [PATCH 04/10] video: da8xx-fb: remove unneeded "var" initialization Afzal Mohammed
2012-12-07 11:56 ` [PATCH 05/10] video: da8xx-fb: store current display information Afzal Mohammed
2012-12-07 11:56 ` [PATCH 06/10] video: da8xx-fb: store clk rate even if !CPUFREQ Afzal Mohammed
2012-12-07 11:56 ` [PATCH 07/10] video: da8xx-fb: pix clk and clk div handling cleanup Afzal Mohammed
2012-12-07 11:56 ` [PATCH 08/10] video: da8xx-fb: store struct device * Afzal Mohammed
2012-12-07 11:56 ` [PATCH 09/10] video: da8xx-fb: report correct pixclock Afzal Mohammed
2012-12-07 11:56 ` [PATCH 10/10] video: da8xx-fb: fb_set_par support Afzal Mohammed

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).