diff options
| author | Arnd Bergmann <arnd@arndb.de> | 2013-04-09 11:07:36 -0400 |
|---|---|---|
| committer | Arnd Bergmann <arnd@arndb.de> | 2013-04-09 11:07:36 -0400 |
| commit | 1194b152cd4eff475652785ce366b20afe82dfcf (patch) | |
| tree | 78da3848410f05949714b2e475d4cf92b463fb31 /drivers | |
| parent | 86feb64f5bfe75da74f4a2faf18b5e57be9cde5e (diff) | |
| parent | 38be85de698ef3f2755ee0eabf520530757860aa (diff) | |
Merge branch 'tegra/soc' into next/drivers
This is a dependency for the tegra/clk branch.
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Conflicts:
drivers/clocksource/tegra20_timer.c
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/clk/tegra/clk-tegra20.c | 36 | ||||
| -rw-r--r-- | drivers/clocksource/tegra20_timer.c | 4 | ||||
| -rw-r--r-- | drivers/gpio/gpio-tegra.c | 21 |
3 files changed, 23 insertions, 38 deletions
diff --git a/drivers/clk/tegra/clk-tegra20.c b/drivers/clk/tegra/clk-tegra20.c index 1e2de7305362..b92d48be4cc9 100644 --- a/drivers/clk/tegra/clk-tegra20.c +++ b/drivers/clk/tegra/clk-tegra20.c | |||
| @@ -711,8 +711,8 @@ static void tegra20_pll_init(void) | |||
| 711 | } | 711 | } |
| 712 | 712 | ||
| 713 | static const char *cclk_parents[] = { "clk_m", "pll_c", "clk_32k", "pll_m", | 713 | static const char *cclk_parents[] = { "clk_m", "pll_c", "clk_32k", "pll_m", |
| 714 | "pll_p_cclk", "pll_p_out4_cclk", | 714 | "pll_p", "pll_p_out4", |
| 715 | "pll_p_out3_cclk", "clk_d", "pll_x" }; | 715 | "pll_p_out3", "clk_d", "pll_x" }; |
| 716 | static const char *sclk_parents[] = { "clk_m", "pll_c_out1", "pll_p_out4", | 716 | static const char *sclk_parents[] = { "clk_m", "pll_c_out1", "pll_p_out4", |
| 717 | "pll_p_out3", "pll_p_out2", "clk_d", | 717 | "pll_p_out3", "pll_p_out2", "clk_d", |
| 718 | "clk_32k", "pll_m_out1" }; | 718 | "clk_32k", "pll_m_out1" }; |
| @@ -721,38 +721,6 @@ static void tegra20_super_clk_init(void) | |||
| 721 | { | 721 | { |
| 722 | struct clk *clk; | 722 | struct clk *clk; |
| 723 | 723 | ||
| 724 | /* | ||
| 725 | * DIV_U71 dividers for CCLK, these dividers are used only | ||
| 726 | * if parent clock is fixed rate. | ||
| 727 | */ | ||
| 728 | |||
| 729 | /* | ||
| 730 | * Clock input to cclk divided from pll_p using | ||
| 731 | * U71 divider of cclk. | ||
| 732 | */ | ||
| 733 | clk = tegra_clk_register_divider("pll_p_cclk", "pll_p", | ||
| 734 | clk_base + SUPER_CCLK_DIVIDER, 0, | ||
| 735 | TEGRA_DIVIDER_INT, 16, 8, 1, NULL); | ||
| 736 | clk_register_clkdev(clk, "pll_p_cclk", NULL); | ||
| 737 | |||
| 738 | /* | ||
| 739 | * Clock input to cclk divided from pll_p_out3 using | ||
| 740 | * U71 divider of cclk. | ||
| 741 | */ | ||
| 742 | clk = tegra_clk_register_divider("pll_p_out3_cclk", "pll_p_out3", | ||
| 743 | clk_base + SUPER_CCLK_DIVIDER, 0, | ||
| 744 | TEGRA_DIVIDER_INT, 16, 8, 1, NULL); | ||
| 745 | clk_register_clkdev(clk, "pll_p_out3_cclk", NULL); | ||
| 746 | |||
| 747 | /* | ||
| 748 | * Clock input to cclk divided from pll_p_out4 using | ||
| 749 | * U71 divider of cclk. | ||
| 750 | */ | ||
| 751 | clk = tegra_clk_register_divider("pll_p_out4_cclk", "pll_p_out4", | ||
| 752 | clk_base + SUPER_CCLK_DIVIDER, 0, | ||
| 753 | TEGRA_DIVIDER_INT, 16, 8, 1, NULL); | ||
| 754 | clk_register_clkdev(clk, "pll_p_out4_cclk", NULL); | ||
| 755 | |||
| 756 | /* CCLK */ | 724 | /* CCLK */ |
| 757 | clk = tegra_clk_register_super_mux("cclk", cclk_parents, | 725 | clk = tegra_clk_register_super_mux("cclk", cclk_parents, |
| 758 | ARRAY_SIZE(cclk_parents), CLK_SET_RATE_PARENT, | 726 | ARRAY_SIZE(cclk_parents), CLK_SET_RATE_PARENT, |
diff --git a/drivers/clocksource/tegra20_timer.c b/drivers/clocksource/tegra20_timer.c index 2e4d8a666c36..ae877b021b54 100644 --- a/drivers/clocksource/tegra20_timer.c +++ b/drivers/clocksource/tegra20_timer.c | |||
| @@ -172,7 +172,7 @@ static void __init tegra20_init_timer(struct device_node *np) | |||
| 172 | BUG(); | 172 | BUG(); |
| 173 | } | 173 | } |
| 174 | 174 | ||
| 175 | clk = clk_get_sys("timer", NULL); | 175 | clk = of_clk_get(np, 0); |
| 176 | if (IS_ERR(clk)) { | 176 | if (IS_ERR(clk)) { |
| 177 | pr_warn("Unable to get timer clock. Assuming 12Mhz input clock.\n"); | 177 | pr_warn("Unable to get timer clock. Assuming 12Mhz input clock.\n"); |
| 178 | rate = 12000000; | 178 | rate = 12000000; |
| @@ -235,7 +235,7 @@ static void __init tegra20_init_rtc(struct device_node *np) | |||
| 235 | * rtc registers are used by read_persistent_clock, keep the rtc clock | 235 | * rtc registers are used by read_persistent_clock, keep the rtc clock |
| 236 | * enabled | 236 | * enabled |
| 237 | */ | 237 | */ |
| 238 | clk = clk_get_sys("rtc-tegra", NULL); | 238 | clk = of_clk_get(np, 0); |
| 239 | if (IS_ERR(clk)) | 239 | if (IS_ERR(clk)) |
| 240 | pr_warn("Unable to get rtc-tegra clock\n"); | 240 | pr_warn("Unable to get rtc-tegra clock\n"); |
| 241 | else | 241 | else |
diff --git a/drivers/gpio/gpio-tegra.c b/drivers/gpio/gpio-tegra.c index 414ad912232f..e3956359202c 100644 --- a/drivers/gpio/gpio-tegra.c +++ b/drivers/gpio/gpio-tegra.c | |||
| @@ -72,6 +72,7 @@ struct tegra_gpio_bank { | |||
| 72 | u32 oe[4]; | 72 | u32 oe[4]; |
| 73 | u32 int_enb[4]; | 73 | u32 int_enb[4]; |
| 74 | u32 int_lvl[4]; | 74 | u32 int_lvl[4]; |
| 75 | u32 wake_enb[4]; | ||
| 75 | #endif | 76 | #endif |
| 76 | }; | 77 | }; |
| 77 | 78 | ||
| @@ -333,15 +334,31 @@ static int tegra_gpio_suspend(struct device *dev) | |||
| 333 | bank->oe[p] = tegra_gpio_readl(GPIO_OE(gpio)); | 334 | bank->oe[p] = tegra_gpio_readl(GPIO_OE(gpio)); |
| 334 | bank->int_enb[p] = tegra_gpio_readl(GPIO_INT_ENB(gpio)); | 335 | bank->int_enb[p] = tegra_gpio_readl(GPIO_INT_ENB(gpio)); |
| 335 | bank->int_lvl[p] = tegra_gpio_readl(GPIO_INT_LVL(gpio)); | 336 | bank->int_lvl[p] = tegra_gpio_readl(GPIO_INT_LVL(gpio)); |
| 337 | |||
| 338 | /* Enable gpio irq for wake up source */ | ||
| 339 | tegra_gpio_writel(bank->wake_enb[p], | ||
| 340 | GPIO_INT_ENB(gpio)); | ||
| 336 | } | 341 | } |
| 337 | } | 342 | } |
| 338 | local_irq_restore(flags); | 343 | local_irq_restore(flags); |
| 339 | return 0; | 344 | return 0; |
| 340 | } | 345 | } |
| 341 | 346 | ||
| 342 | static int tegra_gpio_wake_enable(struct irq_data *d, unsigned int enable) | 347 | static int tegra_gpio_irq_set_wake(struct irq_data *d, unsigned int enable) |
| 343 | { | 348 | { |
| 344 | struct tegra_gpio_bank *bank = irq_data_get_irq_chip_data(d); | 349 | struct tegra_gpio_bank *bank = irq_data_get_irq_chip_data(d); |
| 350 | int gpio = d->hwirq; | ||
| 351 | u32 port, bit, mask; | ||
| 352 | |||
| 353 | port = GPIO_PORT(gpio); | ||
| 354 | bit = GPIO_BIT(gpio); | ||
| 355 | mask = BIT(bit); | ||
| 356 | |||
| 357 | if (enable) | ||
| 358 | bank->wake_enb[port] |= mask; | ||
| 359 | else | ||
| 360 | bank->wake_enb[port] &= ~mask; | ||
| 361 | |||
| 345 | return irq_set_irq_wake(bank->irq, enable); | 362 | return irq_set_irq_wake(bank->irq, enable); |
| 346 | } | 363 | } |
| 347 | #endif | 364 | #endif |
| @@ -353,7 +370,7 @@ static struct irq_chip tegra_gpio_irq_chip = { | |||
| 353 | .irq_unmask = tegra_gpio_irq_unmask, | 370 | .irq_unmask = tegra_gpio_irq_unmask, |
| 354 | .irq_set_type = tegra_gpio_irq_set_type, | 371 | .irq_set_type = tegra_gpio_irq_set_type, |
| 355 | #ifdef CONFIG_PM_SLEEP | 372 | #ifdef CONFIG_PM_SLEEP |
| 356 | .irq_set_wake = tegra_gpio_wake_enable, | 373 | .irq_set_wake = tegra_gpio_irq_set_wake, |
| 357 | #endif | 374 | #endif |
| 358 | }; | 375 | }; |
| 359 | 376 | ||
