@ -160,7 +160,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 ;
@ -201,7 +200,7 @@ static struct fb_videomode known_lcd_panels[] = {
. name = " Sharp_LCD035Q3DG01 " ,
. xres = 320 ,
. yres = 240 ,
. pixclock = 4608000 ,
. pixclock = KHZ2PICOS ( 4607 ) ,
. left_margin = 6 ,
. right_margin = 8 ,
. upper_margin = 2 ,
@ -216,7 +215,7 @@ static struct fb_videomode known_lcd_panels[] = {
. name = " Sharp_LK043T1DG01 " ,
. xres = 480 ,
. yres = 272 ,
. pixclock = 7833600 ,
. pixclock = KHZ2PICOS ( 7833 ) ,
. left_margin = 2 ,
. right_margin = 2 ,
. upper_margin = 2 ,
@ -231,7 +230,7 @@ static struct fb_videomode known_lcd_panels[] = {
. name = " SP10Q010 " ,
. xres = 320 ,
. yres = 240 ,
. pixclock = 7833600 ,
. pixclock = KHZ2PICOS ( 7833 ) ,
. left_margin = 10 ,
. right_margin = 10 ,
. upper_margin = 10 ,
@ -680,13 +679,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 ) ;
@ -694,7 +694,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 ,
@ -705,8 +712,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 ) |
@ -969,7 +975,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 ) ;
lc d_calc_clk_divider( par ) ;
da8xx_fb _calc_config _clk_divider ( par , & par - > mode ) ;
if ( par - > blank = = FB_BLANK_UNBLANK )
lcd_enable_raster ( ) ;
}
@ -1195,22 +1201,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 fb_probe ( struct platform_device * device )
{
struct da8xx_lcdc_platform_data * fb_pdata =
@ -1303,7 +1293,6 @@ static int 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 ) ;
@ -1368,7 +1357,6 @@ static int 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 ;