@ -282,6 +282,9 @@ static unsigned long exynos5_get_periph_rate(int peripheral)
src = readl ( & clk - > src_peric0 ) ;
div = readl ( & clk - > div_peric3 ) ;
break ;
case PERIPH_ID_I2S0 :
src = readl ( & clk - > src_mau ) ;
div = readl ( & clk - > div_mau ) ;
case PERIPH_ID_SPI0 :
case PERIPH_ID_SPI1 :
src = readl ( & clk - > src_peric1 ) ;
@ -1146,17 +1149,29 @@ int exynos5_set_epll_clk(unsigned long rate)
return 0 ;
}
void exynos5_set_i2s_clk_source ( vo id)
int exynos5_set_i2s_clk_source ( unsigned int i2s_ id)
{
struct exynos5_clock * clk =
( struct exynos5_clock * ) samsung_get_base_clock ( ) ;
clrsetbits_le32 ( & clk - > src_peric1 , AUDIO1_SEL_MASK ,
( CLK_SRC_SCLK_EPLL ) ) ;
unsigned int * audio_ass = ( unsigned int * ) samsung_get_base_audio_ass ( ) ;
if ( i2s_id = = 0 ) {
setbits_le32 ( & clk - > src_top2 , CLK_SRC_MOUT_EPLL ) ;
clrsetbits_le32 ( & clk - > src_mau , AUDIO0_SEL_MASK ,
( CLK_SRC_SCLK_EPLL ) ) ;
setbits_le32 ( audio_ass , AUDIO_CLKMUX_ASS ) ;
} else if ( i2s_id = = 1 ) {
clrsetbits_le32 ( & clk - > src_peric1 , AUDIO1_SEL_MASK ,
( CLK_SRC_SCLK_EPLL ) ) ;
} else {
return - 1 ;
}
return 0 ;
}
int exynos5_set_i2s_clk_prescaler ( unsigned int src_frq ,
unsigned int dst_frq )
unsigned int dst_frq ,
unsigned int i2s_id )
{
struct exynos5_clock * clk =
( struct exynos5_clock * ) samsung_get_base_clock ( ) ;
@ -1169,13 +1184,27 @@ int exynos5_set_i2s_clk_prescaler(unsigned int src_frq,
}
div = ( src_frq / dst_frq ) ;
if ( div > AUDIO_1_RATIO_MASK ) {
debug ( " %s: Frequency ratio is out of range \n " , __func__ ) ;
debug ( " src frq = %d des frq = %d " , src_frq , dst_frq ) ;
if ( i2s_id = = 0 ) {
if ( div > AUDIO_0_RATIO_MASK ) {
debug ( " %s: Frequency ratio is out of range \n " ,
__func__ ) ;
debug ( " src frq = %d des frq = %d " , src_frq , dst_frq ) ;
return - 1 ;
}
clrsetbits_le32 ( & clk - > div_mau , AUDIO_0_RATIO_MASK ,
( div & AUDIO_0_RATIO_MASK ) ) ;
} else if ( i2s_id = = 1 ) {
if ( div > AUDIO_1_RATIO_MASK ) {
debug ( " %s: Frequency ratio is out of range \n " ,
__func__ ) ;
debug ( " src frq = %d des frq = %d " , src_frq , dst_frq ) ;
return - 1 ;
}
clrsetbits_le32 ( & clk - > div_peric4 , AUDIO_1_RATIO_MASK ,
( div & AUDIO_1_RATIO_MASK ) ) ;
} else {
return - 1 ;
}
clrsetbits_le32 ( & clk - > div_peric4 , AUDIO_1_RATIO_MASK ,
( div & AUDIO_1_RATIO_MASK ) ) ;
return 0 ;
}
@ -1415,19 +1444,21 @@ int set_spi_clk(int periph_id, unsigned int rate)
return 0 ;
}
int set_i2s_clk_prescaler ( unsigned int src_frq , unsigned int dst_frq )
int set_i2s_clk_prescaler ( unsigned int src_frq , unsigned int dst_frq ,
unsigned int i2s_id )
{
if ( cpu_is_exynos5 ( ) )
return exynos5_set_i2s_clk_prescaler ( src_frq , dst_frq ) ;
return exynos5_set_i2s_clk_prescaler ( src_frq , dst_frq , i2s_id ) ;
else
return 0 ;
}
void set_i2s_clk_source ( vo id)
int set_i2s_clk_source ( unsigned int i2s_ id)
{
if ( cpu_is_exynos5 ( ) )
exynos5_set_i2s_clk_source ( ) ;
return exynos5_set_i2s_clk_source ( i2s_id ) ;
else
return 0 ;
}
int set_epll_clk ( unsigned long rate )