|
@@ -1026,6 +1026,28 @@ static struct fb_ops s3c_fb_ops = {
|
|
|
.fb_ioctl = s3c_fb_ioctl,
|
|
|
};
|
|
|
|
|
|
+/**
|
|
|
+ * 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.
|
|
@@ -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) {
|