From: Maurus Cuelenaere Date: Wed, 11 Aug 2010 01:02:44 +0000 (-0700) Subject: s3c-fb: automatically calculate pixel clock when none is given X-Git-Tag: v3.0~3745 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=2bb567a38950f0917aecfe1a3e46720d8bbb0020;p=platform%2Fkernel%2Flinux-amlogic.git s3c-fb: automatically calculate pixel clock when none is given Add a simple algorithm which calculates the pixel clock based on the video mode parameters. This is only done when no pixel clock is supplied through the platform data. This allows drivers to omit the pixel clock data and thus share the algorithm used for calculating it. Signed-off-by: Maurus Cuelenaere Cc: Pawel Osciak Cc: Marek Szyprowski Cc: Kyungmin Park Cc: InKi Dae Cc: Ben Dooks Cc: Russell King Tested-by: Donghwa Lee Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds --- diff --git a/drivers/video/s3c-fb.c b/drivers/video/s3c-fb.c index 8ea974d..f9aca9d 100644 --- a/drivers/video/s3c-fb.c +++ b/drivers/video/s3c-fb.c @@ -1027,6 +1027,28 @@ static struct fb_ops s3c_fb_ops = { }; /** + * s3c_fb_missing_pixclock() - calculates pixel clock + * @mode: The video mode to change. + * + * Calculate the pixel clock when none has been given through platform data. + */ +static void __devinit s3c_fb_missing_pixclock(struct fb_videomode *mode) +{ + u64 pixclk = 1000000000000ULL; + u32 div; + + div = mode->left_margin + mode->hsync_len + mode->right_margin + + mode->xres; + div *= mode->upper_margin + mode->vsync_len + mode->lower_margin + + mode->yres; + div *= mode->refresh ? : 60; + + do_div(pixclk, div); + + mode->pixclock = pixclk; +} + +/** * s3c_fb_alloc_memory() - allocate display memory for framebuffer window * @sfb: The base resources for the hardware. * @win: The window to initialise memory for. @@ -1364,6 +1386,9 @@ static int __devinit s3c_fb_probe(struct platform_device *pdev) if (!pd->win[win]) continue; + if (!pd->win[win]->win_mode.pixclock) + s3c_fb_missing_pixclock(&pd->win[win]->win_mode); + ret = s3c_fb_probe_win(sfb, win, fbdrv->win[win], &sfb->windows[win]); if (ret < 0) {