drivers/video/s3c-fb.c: fix clock setting for Samsung SoC Framebuffer
Correct the CLKVAL_F field value of VIDEO MAIN CONTROLLER 0 REGITSTER. Frame Rate is 1 / [ { (VSPW+1) + (VBPD+1) + (LIINEVAL + 1) + (VFPD+1) } x {(HSPW+1) + (HBPD +1) + (HFPD+1) + (HOZVAL + 1) } x { ( CLKVAL+1 ) / ( Frequency of Clock source ) } ] and VCLK = Video Clock Source / (CLKVAL +1). therefore CLKVAL_F should be "CLKVAL_F = Frequency of Clock source / pixel clock * refresh". for this, I added refresh value in platform data like below. static struct s3c_fb_pd_win xxx_fb_win0 = { /* this is to ensure we use win0 */ .win_mode = { .refresh = 60, .pixclock = (66+4+2+480)*(15+5+3+800), .left_margin = 66, .right_margin = 2, .upper_margin = 15, .lower_margin = 3, .hsync_len = 4, .vsync_len = 5, .xres = 480, .yres = 800, }, .max_bpp = 32, .default_bpp = 24, }; static struct s3c_fb_platdata xxx_lcd_pdata __initdata = { .win[0] = &xxx_fb_win0, .vidcon0 = VIDCON0_VIDOUT_RGB | VIDCON0_PNRMODE_RGB, .vidcon1 = VIDCON1_INV_HSYNC | VIDCON1_INV_VSYNC | VIDCON1_INV_VCLK | VIDCON1_INV_VDEN, .setup_gpio = s5pc1xx_fb_gpio_setup_24bpp, }; xxx_machine_init() { . . . s3c_fb_set_platdata(&xxx_lcd_pdata); } platform data defined in machine code should be setting using s3c_fb_set_platdata(). Signed-off-by: InKi Dae <inki.dae@samsung.com> Cc: Kyungmin Park <kmpark@infradead.org> Cc: Krzysztof Helt <krzysztof.h1@poczta.fm> Cc: Marek Szyprowski <m.szyprowski@samsung.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
5bfd756097
commit
600ce1a0fa
1 changed files with 7 additions and 10 deletions
|
@ -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.
|
* s3c_fb_calc_pixclk() - calculate the divider to create the pixel clock.
|
||||||
|
* @id: window id.
|
||||||
* @sfb: The hardware state.
|
* @sfb: The hardware state.
|
||||||
* @pixclock: The pixel clock wanted, in picoseconds.
|
* @pixclock: The pixel clock wanted, in picoseconds.
|
||||||
*
|
*
|
||||||
* Given the specified pixel clock, work out the necessary divider to get
|
* Given the specified pixel clock, work out the necessary divider to get
|
||||||
* close to the output frequency.
|
* 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 clk = clk_get_rate(sfb->bus_clk);
|
||||||
unsigned long long tmp;
|
|
||||||
unsigned int result;
|
unsigned int result;
|
||||||
|
|
||||||
tmp = (unsigned long long)clk;
|
pixclk *= win->win_mode.refresh;
|
||||||
tmp *= pixclk;
|
result = clk / pixclk;
|
||||||
|
|
||||||
do_div(tmp, 1000000000UL);
|
|
||||||
result = (unsigned int)tmp / 1000;
|
|
||||||
|
|
||||||
dev_dbg(sfb->dev, "pixclk=%u, clk=%lu, div=%d (%lu)\n",
|
dev_dbg(sfb->dev, "pixclk=%u, clk=%lu, div=%d (%lu)\n",
|
||||||
pixclk, clk, result, clk / result);
|
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;
|
struct s3c_fb *sfb = win->parent;
|
||||||
void __iomem *regs = sfb->regs;
|
void __iomem *regs = sfb->regs;
|
||||||
int win_no = win->index;
|
int win_no = win->index;
|
||||||
|
u32 osdc_data = 0;
|
||||||
u32 data;
|
u32 data;
|
||||||
u32 pagewidth;
|
u32 pagewidth;
|
||||||
int clkdiv;
|
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 */
|
/* use window 0 as the basis for the lcd output timings */
|
||||||
|
|
||||||
if (win_no == 0) {
|
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 = sfb->pdata->vidcon0;
|
||||||
data &= ~(VIDCON0_CLKVAL_F_MASK | VIDCON0_CLKDIR);
|
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;
|
data = var->xres * var->yres;
|
||||||
|
|
||||||
u32 osdc_data = 0;
|
|
||||||
|
|
||||||
osdc_data = VIDISD14C_ALPHA1_R(0xf) |
|
osdc_data = VIDISD14C_ALPHA1_R(0xf) |
|
||||||
VIDISD14C_ALPHA1_G(0xf) |
|
VIDISD14C_ALPHA1_G(0xf) |
|
||||||
VIDISD14C_ALPHA1_B(0xf);
|
VIDISD14C_ALPHA1_B(0xf);
|
||||||
|
|
Loading…
Reference in a new issue