@ -39,7 +39,17 @@ static struct {
struct regulator * vdds_dsi_reg ;
} dpi ;
# ifdef CONFIG_OMAP2_DSS_USE_DSI_PLL
static bool dpi_use_dsi_pll ( struct omap_dss_device * dssdev )
{
if ( dssdev - > clocks . dispc . dispc_fclk_src = =
OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DISPC | |
dssdev - > clocks . dispc . channel . lcd_clk_src = =
OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DISPC )
return true ;
else
return false ;
}
static int dpi_set_dsi_clk ( struct omap_dss_device * dssdev , bool is_tft ,
unsigned long pck_req , unsigned long * fck , int * lck_div ,
int * pck_div )
@ -69,7 +79,7 @@ static int dpi_set_dsi_clk(struct omap_dss_device *dssdev, bool is_tft,
return 0 ;
}
# else
static int dpi_set_dispc_clk ( struct omap_dss_device * dssdev , bool is_tft ,
unsigned long pck_req , unsigned long * fck , int * lck_div ,
int * pck_div )
@ -96,13 +106,12 @@ static int dpi_set_dispc_clk(struct omap_dss_device *dssdev, bool is_tft,
return 0 ;
}
# endif
static int dpi_set_mode ( struct omap_dss_device * dssdev )
{
struct omap_video_timings * t = & dssdev - > panel . timings ;
int lck_div , pck_div ;
unsigned long fck ;
int lck_div = 0 , pck_div = 0 ;
unsigned long fck = 0 ;
unsigned long pck ;
bool is_tft ;
int r = 0 ;
@ -114,13 +123,12 @@ static int dpi_set_mode(struct omap_dss_device *dssdev)
is_tft = ( dssdev - > panel . config & OMAP_DSS_LCD_TFT ) ! = 0 ;
# ifdef CONFIG_OMAP2_DSS_USE_DSI_PLL
r = dpi_set_dsi_clk ( dssdev , is_tft , t - > pixel_clock * 1000 , & fck ,
& lck_div , & pck_div ) ;
# else
r = dpi_set_dispc_clk ( dssdev , is_tft , t - > pixel_clock * 1000 , & fck ,
& lck_div , & pck_div ) ;
# endif
if ( dpi_use_dsi_pll ( dssdev ) )
r = dpi_set_dsi_clk ( dssdev , is_tft , t - > pixel_clock * 1000 ,
& fck , & lck_div , & pck_div ) ;
else
r = dpi_set_dispc_clk ( dssdev , is_tft , t - > pixel_clock * 1000 ,
& fck , & lck_div , & pck_div ) ;
if ( r )
goto err0 ;
@ -179,12 +187,13 @@ int omapdss_dpi_display_enable(struct omap_dss_device *dssdev)
if ( r )
goto err2 ;
# ifdef CONFIG_OMAP2_DSS_USE_DSI_PLL
dss_clk_enable ( DSS_CLK_SYSCK ) ;
r = dsi_pll_init ( dssdev , 0 , 1 ) ;
if ( r )
goto err3 ;
# endif
if ( dpi_use_dsi_pll ( dssdev ) ) {
dss_clk_enable ( DSS_CLK_SYSCK ) ;
r = dsi_pll_init ( dssdev , 0 , 1 ) ;
if ( r )
goto err3 ;
}
r = dpi_set_mode ( dssdev ) ;
if ( r )
goto err4 ;
@ -196,11 +205,11 @@ int omapdss_dpi_display_enable(struct omap_dss_device *dssdev)
return 0 ;
err4 :
# ifdef CONFIG_OMAP2_DSS_USE_DSI_PLL
dsi_pll_uninit ( ) ;
if ( dpi_use_dsi_pll ( dssdev ) )
dsi_pll_uninit ( ) ;
err3 :
dss_clk_disable ( DSS_CLK_SYSCK ) ;
# endif
if ( dpi_use_dsi_pll ( dssdev ) )
dss_clk_disable ( DSS_CLK_SYSCK ) ;
err2 :
dss_clk_disable ( DSS_CLK_ICK | DSS_CLK_FCK ) ;
if ( cpu_is_omap34xx ( ) )
@ -216,11 +225,11 @@ void omapdss_dpi_display_disable(struct omap_dss_device *dssdev)
{
dssdev - > manager - > disable ( dssdev - > manager ) ;
# ifdef CONFIG_OMAP2_DSS_USE_DSI_PLL
dss_select_dispc_clk_source ( OMAP_DSS_CLK_SRC_FCK ) ;
dsi_pll_uninit ( ) ;
dss_clk_disable ( DSS_CLK_SYSCK ) ;
# endif
if ( dpi_use_dsi_pll ( dssdev ) ) {
dss_select_dispc_clk_source ( OMAP_DSS_CLK_SRC_FCK ) ;
dsi_pll_uninit ( ) ;
dss_clk_disable ( DSS_CLK_SYSCK ) ;
}
dss_clk_disable ( DSS_CLK_ICK | DSS_CLK_FCK ) ;
@ -251,6 +260,7 @@ int dpi_check_timings(struct omap_dss_device *dssdev,
int lck_div , pck_div ;
unsigned long fck ;
unsigned long pck ;
struct dispc_clock_info dispc_cinfo ;
if ( ! dispc_lcd_timings_ok ( timings ) )
return - EINVAL ;
@ -260,10 +270,8 @@ int dpi_check_timings(struct omap_dss_device *dssdev,
is_tft = ( dssdev - > panel . config & OMAP_DSS_LCD_TFT ) ! = 0 ;
# ifdef CONFIG_OMAP2_DSS_USE_DSI_PLL
{
if ( dpi_use_dsi_pll ( dssdev ) ) {
struct dsi_clock_info dsi_cinfo ;
struct dispc_clock_info dispc_cinfo ;
r = dsi_pll_calc_clock_div_pck ( is_tft ,
timings - > pixel_clock * 1000 ,
& dsi_cinfo , & dispc_cinfo ) ;
@ -272,13 +280,8 @@ int dpi_check_timings(struct omap_dss_device *dssdev,
return r ;
fck = dsi_cinfo . dsi_pll_hsdiv_dispc_clk ;
lck_div = dispc_cinfo . lck_div ;
pck_div = dispc_cinfo . pck_div ;
}
# else
{
} else {
struct dss_clock_info dss_cinfo ;
struct dispc_clock_info dispc_cinfo ;
r = dss_calc_clock_div ( is_tft , timings - > pixel_clock * 1000 ,
& dss_cinfo , & dispc_cinfo ) ;
@ -286,10 +289,10 @@ int dpi_check_timings(struct omap_dss_device *dssdev,
return r ;
fck = dss_cinfo . fck ;
lck_div = dispc_cinfo . lck_div ;
pck_div = dispc_cinfo . pck_div ;
}
# endif
lck_div = dispc_cinfo . lck_div ;
pck_div = dispc_cinfo . pck_div ;
pck = fck / lck_div / pck_div / 1000 ;