diff options
Diffstat (limited to 'arch/arm/cpu')
| -rw-r--r-- | arch/arm/cpu/armv7/exynos/clock.c | 59 | ||||
| -rw-r--r-- | arch/arm/cpu/armv7/exynos/pinmux.c | 23 | 
2 files changed, 62 insertions, 20 deletions
| diff --git a/arch/arm/cpu/armv7/exynos/clock.c b/arch/arm/cpu/armv7/exynos/clock.c index 0cb1a61aa..36fedd630 100644 --- a/arch/arm/cpu/armv7/exynos/clock.c +++ b/arch/arm/cpu/armv7/exynos/clock.c @@ -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(void) +int exynos5_set_i2s_clk_source(unsigned int i2s_id)  {  	struct exynos5_clock *clk =  		(struct exynos5_clock *)samsung_get_base_clock(); +	unsigned int *audio_ass = (unsigned int *)samsung_get_base_audio_ass(); -	clrsetbits_le32(&clk->src_peric1, AUDIO1_SEL_MASK, -			(CLK_SRC_SCLK_EPLL)); +	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(void) +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) diff --git a/arch/arm/cpu/armv7/exynos/pinmux.c b/arch/arm/cpu/armv7/exynos/pinmux.c index 1b05ebfd7..8002bce79 100644 --- a/arch/arm/cpu/armv7/exynos/pinmux.c +++ b/arch/arm/cpu/armv7/exynos/pinmux.c @@ -220,10 +220,20 @@ static void exynos5_i2s_config(int peripheral)  {  	int i;  	struct exynos5_gpio_part1 *gpio1 = -		(struct exynos5_gpio_part1 *) samsung_get_base_gpio_part1(); +		(struct exynos5_gpio_part1 *)samsung_get_base_gpio_part1(); +	struct exynos5_gpio_part4 *gpio4 = +		(struct exynos5_gpio_part4 *)samsung_get_base_gpio_part4(); -	for (i = 0; i < 5; i++) -		s5p_gpio_cfg_pin(&gpio1->b0, i, GPIO_FUNC(0x02)); +	switch (peripheral) { +	case PERIPH_ID_I2S0: +		for (i = 0; i < 5; i++) +			s5p_gpio_cfg_pin(&gpio4->z, i, GPIO_FUNC(0x02)); +		break; +	case PERIPH_ID_I2S1: +		for (i = 0; i < 5; i++) +			s5p_gpio_cfg_pin(&gpio1->b0, i, GPIO_FUNC(0x02)); +		break; +	}  }  void exynos5_spi_config(int peripheral) @@ -296,6 +306,7 @@ static int exynos5_pinmux_config(int peripheral, int flags)  	case PERIPH_ID_I2C7:  		exynos5_i2c_config(peripheral, flags);  		break; +	case PERIPH_ID_I2S0:  	case PERIPH_ID_I2S1:  		exynos5_i2s_config(peripheral);  		break; @@ -463,11 +474,11 @@ static int exynos4_pinmux_config(int peripheral, int flags)  int exynos_pinmux_config(int peripheral, int flags)  { -	if (cpu_is_exynos5()) +	if (cpu_is_exynos5()) {  		return exynos5_pinmux_config(peripheral, flags); -	else if (cpu_is_exynos4()) +	} else if (cpu_is_exynos4()) {  		return exynos4_pinmux_config(peripheral, flags); -	else { +	} else {  		debug("pinmux functionality not supported\n");  		return -1;  	} |