@ -69,6 +69,8 @@
# define PERIPH_CLK_SOURCE_MASK (3<<30)
# define PERIPH_CLK_SOURCE_SHIFT 30
# define PERIPH_CLK_SOURCE_PWM_MASK (7<<28)
# define PERIPH_CLK_SOURCE_PWM_SHIFT 28
# define PERIPH_CLK_SOURCE_ENABLE (1<<28)
# define PERIPH_CLK_SOURCE_DIVU71_MASK 0xFF
# define PERIPH_CLK_SOURCE_DIVU16_MASK 0xFFFF
@ -908,9 +910,20 @@ static void tegra2_periph_clk_init(struct clk *c)
u32 val = clk_readl ( c - > reg ) ;
const struct clk_mux_sel * mux = NULL ;
const struct clk_mux_sel * sel ;
u32 shift ;
u32 mask ;
if ( c - > flags & MUX_PWM ) {
shift = PERIPH_CLK_SOURCE_PWM_SHIFT ;
mask = PERIPH_CLK_SOURCE_PWM_MASK ;
} else {
shift = PERIPH_CLK_SOURCE_SHIFT ;
mask = PERIPH_CLK_SOURCE_MASK ;
}
if ( c - > flags & MUX ) {
for ( sel = c - > inputs ; sel - > input ! = NULL ; sel + + ) {
if ( val > > PERIPH_CLK_SOURCE_SHIFT = = sel - > value )
if ( ( val & mask ) > > shift = = sel - > value )
mux = sel ;
}
BUG_ON ( ! mux ) ;
@ -1023,12 +1036,23 @@ static int tegra2_periph_clk_set_parent(struct clk *c, struct clk *p)
{
u32 val ;
const struct clk_mux_sel * sel ;
u32 mask , shift ;
pr_debug ( " %s: %s %s \n " , __func__ , c - > name , p - > name ) ;
if ( c - > flags & MUX_PWM ) {
shift = PERIPH_CLK_SOURCE_PWM_SHIFT ;
mask = PERIPH_CLK_SOURCE_PWM_MASK ;
} else {
shift = PERIPH_CLK_SOURCE_SHIFT ;
mask = PERIPH_CLK_SOURCE_MASK ;
}
for ( sel = c - > inputs ; sel - > input ! = NULL ; sel + + ) {
if ( sel - > input = = p ) {
val = clk_readl ( c - > reg ) ;
val & = ~ PERIPH_CLK_SOURCE_MASK ;
val | = ( sel - > value ) < < PERIPH_CLK_SOURCE_SHIFT ;
val & = ~ mask ;
val | = ( sel - > value ) < < shift ;
if ( c - > refcnt )
clk_enable ( p ) ;
@ -2149,14 +2173,14 @@ static struct clk tegra_clk_emc = {
}
static struct clk tegra_list_clks [ ] = {
PERIPH_CLK ( " apbdma " , " tegra-dma " , NULL , 34 , 0 , 108000000 , mux_pclk , 0 ) ,
PERIPH_CLK ( " apbdma " , " tegra-apb dma " , NULL , 34 , 0 , 108000000 , mux_pclk , 0 ) ,
PERIPH_CLK ( " rtc " , " rtc-tegra " , NULL , 4 , 0 , 32768 , mux_clk_32k , PERIPH_NO_RESET ) ,
PERIPH_CLK ( " timer " , " timer " , NULL , 5 , 0 , 26000000 , mux_clk_m , 0 ) ,
PERIPH_CLK ( " i2s1 " , " tegra20-i2s.0 " , NULL , 11 , 0x100 , 26000000 , mux_pllaout0_audio2x_pllp_clkm , MUX | DIV_U71 ) ,
PERIPH_CLK ( " i2s2 " , " tegra20-i2s.1 " , NULL , 18 , 0x104 , 26000000 , mux_pllaout0_audio2x_pllp_clkm , MUX | DIV_U71 ) ,
PERIPH_CLK ( " spdif_out " , " spdif_out " , NULL , 10 , 0x108 , 100000000 , mux_pllaout0_audio2x_pllp_clkm , MUX | DIV_U71 ) ,
PERIPH_CLK ( " spdif_in " , " spdif_in " , NULL , 10 , 0x10c , 100000000 , mux_pllp_pllc_pllm , MUX | DIV_U71 ) ,
PERIPH_CLK ( " pwm " , " pwm " , NULL , 17 , 0x110 , 432000000 , mux_pllp_pllc_audio_clkm_clk32 , MUX | DIV_U71 ) ,
PERIPH_CLK ( " pwm " , " tegra- pwm" , NULL , 17 , 0x110 , 432000000 , mux_pllp_pllc_audio_clkm_clk32 , MUX | DIV_U71 | MUX_PWM ) ,
PERIPH_CLK ( " spi " , " spi " , NULL , 43 , 0x114 , 40000000 , mux_pllp_pllc_pllm_clkm , MUX | DIV_U71 ) ,
PERIPH_CLK ( " xio " , " xio " , NULL , 45 , 0x120 , 150000000 , mux_pllp_pllc_pllm_clkm , MUX | DIV_U71 ) ,
PERIPH_CLK ( " twc " , " twc " , NULL , 16 , 0x12c , 150000000 , mux_pllp_pllc_pllm_clkm , MUX | DIV_U71 ) ,
@ -2189,11 +2213,11 @@ static struct clk tegra_list_clks[] = {
PERIPH_CLK ( " i2c2_i2c " , " tegra-i2c.1 " , " i2c " , 0 , 0 , 72000000 , mux_pllp_out3 , 0 ) ,
PERIPH_CLK ( " i2c3_i2c " , " tegra-i2c.2 " , " i2c " , 0 , 0 , 72000000 , mux_pllp_out3 , 0 ) ,
PERIPH_CLK ( " dvc_i2c " , " tegra-i2c.3 " , " i2c " , 0 , 0 , 72000000 , mux_pllp_out3 , 0 ) ,
PERIPH_CLK ( " uarta " , " uart.0 " , NULL , 6 , 0x178 , 600000000 , mux_pllp_pllc_pllm_clkm , MUX ) ,
PERIPH_CLK ( " uartb " , " uart.1 " , NULL , 7 , 0x17c , 600000000 , mux_pllp_pllc_pllm_clkm , MUX ) ,
PERIPH_CLK ( " uartc " , " uart.2 " , NULL , 55 , 0x1a0 , 600000000 , mux_pllp_pllc_pllm_clkm , MUX ) ,
PERIPH_CLK ( " uartd " , " uart.3 " , NULL , 65 , 0x1c0 , 600000000 , mux_pllp_pllc_pllm_clkm , MUX ) ,
PERIPH_CLK ( " uarte " , " uart.4 " , NULL , 66 , 0x1c4 , 600000000 , mux_pllp_pllc_pllm_clkm , MUX ) ,
PERIPH_CLK ( " uarta " , " tegra- uart.0" , NULL , 6 , 0x178 , 600000000 , mux_pllp_pllc_pllm_clkm , MUX ) ,
PERIPH_CLK ( " uartb " , " tegra- uart.1" , NULL , 7 , 0x17c , 600000000 , mux_pllp_pllc_pllm_clkm , MUX ) ,
PERIPH_CLK ( " uartc " , " tegra- uart.2" , NULL , 55 , 0x1a0 , 600000000 , mux_pllp_pllc_pllm_clkm , MUX ) ,
PERIPH_CLK ( " uartd " , " tegra- uart.3" , NULL , 65 , 0x1c0 , 600000000 , mux_pllp_pllc_pllm_clkm , MUX ) ,
PERIPH_CLK ( " uarte " , " tegra- uart.4" , NULL , 66 , 0x1c4 , 600000000 , mux_pllp_pllc_pllm_clkm , MUX ) ,
PERIPH_CLK ( " 3d " , " 3d " , NULL , 24 , 0x158 , 300000000 , mux_pllm_pllc_pllp_plla , MUX | DIV_U71 | PERIPH_MANUAL_RESET ) , /* scales with voltage and process_id */
PERIPH_CLK ( " 2d " , " 2d " , NULL , 21 , 0x15c , 300000000 , mux_pllm_pllc_pllp_plla , MUX | DIV_U71 ) , /* scales with voltage and process_id */
PERIPH_CLK ( " vi " , " tegra_camera " , " vi " , 20 , 0x148 , 150000000 , mux_pllm_pllc_pllp_plla , MUX | DIV_U71 ) , /* scales with voltage and process_id */
@ -2245,20 +2269,16 @@ static struct clk tegra_list_clks[] = {
* table under two names .
*/
static struct clk_duplicate tegra_clk_duplicates [ ] = {
CLK_DUPLICATE ( " uarta " , " tegra_uart.0 " , NULL ) ,
CLK_DUPLICATE ( " uartb " , " tegra_uart.1 " , NULL ) ,
CLK_DUPLICATE ( " uartc " , " tegra_uart.2 " , NULL ) ,
CLK_DUPLICATE ( " uartd " , " tegra_uart.3 " , NULL ) ,
CLK_DUPLICATE ( " uarte " , " tegra_uart.4 " , NULL ) ,
CLK_DUPLICATE ( " uarta " , " serial8250.0 " , NULL ) ,
CLK_DUPLICATE ( " uartb " , " serial8250.1 " , NULL ) ,
CLK_DUPLICATE ( " uartc " , " serial8250.2 " , NULL ) ,
CLK_DUPLICATE ( " uartd " , " serial8250.3 " , NULL ) ,
CLK_DUPLICATE ( " uarte " , " serial8250.4 " , NULL ) ,
CLK_DUPLICATE ( " usbd " , " utmip-pad " , NULL ) ,
CLK_DUPLICATE ( " usbd " , " tegra-ehci.0 " , NULL ) ,
CLK_DUPLICATE ( " usbd " , " tegra-otg " , NULL ) ,
CLK_DUPLICATE ( " hdmi " , " tegradc.0 " , " hdmi " ) ,
CLK_DUPLICATE ( " hdmi " , " tegradc.1 " , " hdmi " ) ,
CLK_DUPLICATE ( " pwm " , " tegra_pwm.0 " , NULL ) ,
CLK_DUPLICATE ( " pwm " , " tegra_pwm.1 " , NULL ) ,
CLK_DUPLICATE ( " pwm " , " tegra_pwm.2 " , NULL ) ,
CLK_DUPLICATE ( " pwm " , " tegra_pwm.3 " , NULL ) ,
CLK_DUPLICATE ( " host1x " , " tegra_grhost " , " host1x " ) ,
CLK_DUPLICATE ( " 2d " , " tegra_grhost " , " gr2d " ) ,
CLK_DUPLICATE ( " 3d " , " tegra_grhost " , " gr3d " ) ,