|
@@ -211,23 +211,21 @@ static int s3c_fb_check_var(struct fb_var_screeninfo *var,
|
|
|
|
|
|
/**
|
|
|
* s3c_fb_calc_pixclk() - calculate the divider to create the pixel clock.
|
|
|
+ * @id: window id.
|
|
|
* @sfb: The hardware state.
|
|
|
* @pixclock: The pixel clock wanted, in picoseconds.
|
|
|
*
|
|
|
* Given the specified pixel clock, work out the necessary divider to get
|
|
|
* close to the output frequency.
|
|
|
*/
|
|
|
-static int s3c_fb_calc_pixclk(struct s3c_fb *sfb, unsigned int pixclk)
|
|
|
+static int s3c_fb_calc_pixclk(unsigned char id, struct s3c_fb *sfb, unsigned int pixclk)
|
|
|
{
|
|
|
+ struct s3c_fb_pd_win *win = sfb->pdata->win[id];
|
|
|
unsigned long clk = clk_get_rate(sfb->bus_clk);
|
|
|
- unsigned long long tmp;
|
|
|
unsigned int result;
|
|
|
|
|
|
- tmp = (unsigned long long)clk;
|
|
|
- tmp *= pixclk;
|
|
|
-
|
|
|
- do_div(tmp, 1000000000UL);
|
|
|
- result = (unsigned int)tmp / 1000;
|
|
|
+ pixclk *= win->win_mode.refresh;
|
|
|
+ result = clk / pixclk;
|
|
|
|
|
|
dev_dbg(sfb->dev, "pixclk=%u, clk=%lu, div=%d (%lu)\n",
|
|
|
pixclk, clk, result, clk / result);
|
|
@@ -267,6 +265,7 @@ static int s3c_fb_set_par(struct fb_info *info)
|
|
|
struct s3c_fb *sfb = win->parent;
|
|
|
void __iomem *regs = sfb->regs;
|
|
|
int win_no = win->index;
|
|
|
+ u32 osdc_data = 0;
|
|
|
u32 data;
|
|
|
u32 pagewidth;
|
|
|
int clkdiv;
|
|
@@ -302,7 +301,7 @@ static int s3c_fb_set_par(struct fb_info *info)
|
|
|
/* use window 0 as the basis for the lcd output timings */
|
|
|
|
|
|
if (win_no == 0) {
|
|
|
- clkdiv = s3c_fb_calc_pixclk(sfb, var->pixclock);
|
|
|
+ clkdiv = s3c_fb_calc_pixclk(win_no, sfb, var->pixclock);
|
|
|
|
|
|
data = sfb->pdata->vidcon0;
|
|
|
data &= ~(VIDCON0_CLKVAL_F_MASK | VIDCON0_CLKDIR);
|
|
@@ -359,8 +358,6 @@ static int s3c_fb_set_par(struct fb_info *info)
|
|
|
|
|
|
data = var->xres * var->yres;
|
|
|
|
|
|
- u32 osdc_data = 0;
|
|
|
-
|
|
|
osdc_data = VIDISD14C_ALPHA1_R(0xf) |
|
|
|
VIDISD14C_ALPHA1_G(0xf) |
|
|
|
VIDISD14C_ALPHA1_B(0xf);
|