diff options
| author | Tony Lindgren <tony@atomide.com> | 2010-08-04 01:46:24 -0400 |
|---|---|---|
| committer | Tony Lindgren <tony@atomide.com> | 2010-08-04 01:46:24 -0400 |
| commit | 331d919af416b9b92428947ef8c535a3e24c6b31 (patch) | |
| tree | 1f58dfe4ea6ed130f7b970f07cd7589864e9cbad | |
| parent | 047b51fb208c716294b4682c904df8a3ad8b6a69 (diff) | |
| parent | fb8ce14c7e16bd218decb3e1655c5d4ff08042f2 (diff) | |
Merge branch 'for_2.6.36' of git://git.pwsan.com/linux-2.6 into omap-for-linus
24 files changed, 790 insertions, 225 deletions
diff --git a/arch/arm/mach-omap1/Kconfig b/arch/arm/mach-omap1/Kconfig index c911cdbf886f..3b02d3b944af 100644 --- a/arch/arm/mach-omap1/Kconfig +++ b/arch/arm/mach-omap1/Kconfig | |||
| @@ -228,6 +228,12 @@ config OMAP_ARM_120MHZ | |||
| 228 | help | 228 | help |
| 229 | Enable 120MHz clock for OMAP CPU. If unsure, say N. | 229 | Enable 120MHz clock for OMAP CPU. If unsure, say N. |
| 230 | 230 | ||
| 231 | config OMAP_ARM_96MHZ | ||
| 232 | bool "OMAP ARM 96 MHz CPU" | ||
| 233 | depends on ARCH_OMAP1 && (ARCH_OMAP15XX || ARCH_OMAP16XX || ARCH_OMAP730 || ARCH_OMAP850) | ||
| 234 | help | ||
| 235 | Enable 96MHz clock for OMAP CPU. If unsure, say N. | ||
| 236 | |||
| 231 | config OMAP_ARM_60MHZ | 237 | config OMAP_ARM_60MHZ |
| 232 | bool "OMAP ARM 60 MHz CPU" | 238 | bool "OMAP ARM 60 MHz CPU" |
| 233 | depends on ARCH_OMAP1 && (ARCH_OMAP15XX || ARCH_OMAP16XX || ARCH_OMAP730 || ARCH_OMAP850) | 239 | depends on ARCH_OMAP1 && (ARCH_OMAP15XX || ARCH_OMAP16XX || ARCH_OMAP730 || ARCH_OMAP850) |
diff --git a/arch/arm/mach-omap1/clock.c b/arch/arm/mach-omap1/clock.c index 6bbb1b8b8294..b8c7fb9d7921 100644 --- a/arch/arm/mach-omap1/clock.c +++ b/arch/arm/mach-omap1/clock.c | |||
| @@ -11,7 +11,6 @@ | |||
| 11 | * it under the terms of the GNU General Public License version 2 as | 11 | * it under the terms of the GNU General Public License version 2 as |
| 12 | * published by the Free Software Foundation. | 12 | * published by the Free Software Foundation. |
| 13 | */ | 13 | */ |
| 14 | #include <linux/module.h> | ||
| 15 | #include <linux/kernel.h> | 14 | #include <linux/kernel.h> |
| 16 | #include <linux/list.h> | 15 | #include <linux/list.h> |
| 17 | #include <linux/errno.h> | 16 | #include <linux/errno.h> |
| @@ -34,9 +33,9 @@ | |||
| 34 | __u32 arm_idlect1_mask; | 33 | __u32 arm_idlect1_mask; |
| 35 | struct clk *api_ck_p, *ck_dpll1_p, *ck_ref_p; | 34 | struct clk *api_ck_p, *ck_dpll1_p, *ck_ref_p; |
| 36 | 35 | ||
| 37 | /*------------------------------------------------------------------------- | 36 | /* |
| 38 | * Omap1 specific clock functions | 37 | * Omap1 specific clock functions |
| 39 | *-------------------------------------------------------------------------*/ | 38 | */ |
| 40 | 39 | ||
| 41 | unsigned long omap1_uart_recalc(struct clk *clk) | 40 | unsigned long omap1_uart_recalc(struct clk *clk) |
| 42 | { | 41 | { |
| @@ -523,7 +522,8 @@ const struct clkops clkops_dspck = { | |||
| 523 | .disable = omap1_clk_disable_dsp_domain, | 522 | .disable = omap1_clk_disable_dsp_domain, |
| 524 | }; | 523 | }; |
| 525 | 524 | ||
| 526 | static int omap1_clk_enable_uart_functional(struct clk *clk) | 525 | /* XXX SYSC register handling does not belong in the clock framework */ |
| 526 | static int omap1_clk_enable_uart_functional_16xx(struct clk *clk) | ||
| 527 | { | 527 | { |
| 528 | int ret; | 528 | int ret; |
| 529 | struct uart_clk *uclk; | 529 | struct uart_clk *uclk; |
| @@ -539,7 +539,8 @@ static int omap1_clk_enable_uart_functional(struct clk *clk) | |||
| 539 | return ret; | 539 | return ret; |
| 540 | } | 540 | } |
| 541 | 541 | ||
| 542 | static void omap1_clk_disable_uart_functional(struct clk *clk) | 542 | /* XXX SYSC register handling does not belong in the clock framework */ |
| 543 | static void omap1_clk_disable_uart_functional_16xx(struct clk *clk) | ||
| 543 | { | 544 | { |
| 544 | struct uart_clk *uclk; | 545 | struct uart_clk *uclk; |
| 545 | 546 | ||
| @@ -550,9 +551,10 @@ static void omap1_clk_disable_uart_functional(struct clk *clk) | |||
| 550 | omap1_clk_disable_generic(clk); | 551 | omap1_clk_disable_generic(clk); |
| 551 | } | 552 | } |
| 552 | 553 | ||
| 553 | const struct clkops clkops_uart = { | 554 | /* XXX SYSC register handling does not belong in the clock framework */ |
| 554 | .enable = omap1_clk_enable_uart_functional, | 555 | const struct clkops clkops_uart_16xx = { |
| 555 | .disable = omap1_clk_disable_uart_functional, | 556 | .enable = omap1_clk_enable_uart_functional_16xx, |
| 557 | .disable = omap1_clk_disable_uart_functional_16xx, | ||
| 556 | }; | 558 | }; |
| 557 | 559 | ||
| 558 | long omap1_clk_round_rate(struct clk *clk, unsigned long rate) | 560 | long omap1_clk_round_rate(struct clk *clk, unsigned long rate) |
| @@ -572,9 +574,9 @@ int omap1_clk_set_rate(struct clk *clk, unsigned long rate) | |||
| 572 | return ret; | 574 | return ret; |
| 573 | } | 575 | } |
| 574 | 576 | ||
| 575 | /*------------------------------------------------------------------------- | 577 | /* |
| 576 | * Omap1 clock reset and init functions | 578 | * Omap1 clock reset and init functions |
| 577 | *-------------------------------------------------------------------------*/ | 579 | */ |
| 578 | 580 | ||
| 579 | #ifdef CONFIG_OMAP_RESET_CLOCKS | 581 | #ifdef CONFIG_OMAP_RESET_CLOCKS |
| 580 | 582 | ||
diff --git a/arch/arm/mach-omap1/clock.h b/arch/arm/mach-omap1/clock.h index 75d0d7d90bff..eaf09efb91ca 100644 --- a/arch/arm/mach-omap1/clock.h +++ b/arch/arm/mach-omap1/clock.h | |||
| @@ -107,7 +107,7 @@ extern struct clk *api_ck_p, *ck_dpll1_p, *ck_ref_p; | |||
| 107 | 107 | ||
| 108 | extern const struct clkops clkops_dspck; | 108 | extern const struct clkops clkops_dspck; |
| 109 | extern const struct clkops clkops_dummy; | 109 | extern const struct clkops clkops_dummy; |
| 110 | extern const struct clkops clkops_uart; | 110 | extern const struct clkops clkops_uart_16xx; |
| 111 | extern const struct clkops clkops_generic; | 111 | extern const struct clkops clkops_generic; |
| 112 | 112 | ||
| 113 | #endif | 113 | #endif |
diff --git a/arch/arm/mach-omap1/clock_data.c b/arch/arm/mach-omap1/clock_data.c index 9240bc1026a3..af54114b8f08 100644 --- a/arch/arm/mach-omap1/clock_data.c +++ b/arch/arm/mach-omap1/clock_data.c | |||
| @@ -8,6 +8,10 @@ | |||
| 8 | * This program is free software; you can redistribute it and/or modify | 8 | * This program is free software; you can redistribute it and/or modify |
| 9 | * it under the terms of the GNU General Public License version 2 as | 9 | * it under the terms of the GNU General Public License version 2 as |
| 10 | * published by the Free Software Foundation. | 10 | * published by the Free Software Foundation. |
| 11 | * | ||
| 12 | * To do: | ||
| 13 | * - Clocks that are only available on some chips should be marked with the | ||
| 14 | * chips that they are present on. | ||
| 11 | */ | 15 | */ |
| 12 | 16 | ||
| 13 | #include <linux/kernel.h> | 17 | #include <linux/kernel.h> |
| @@ -23,9 +27,49 @@ | |||
| 23 | 27 | ||
| 24 | #include "clock.h" | 28 | #include "clock.h" |
| 25 | 29 | ||
| 26 | /*------------------------------------------------------------------------ | 30 | /* Some ARM_IDLECT1 bit shifts - used in struct arm_idlect1_clk */ |
| 31 | #define IDL_CLKOUT_ARM_SHIFT 12 | ||
| 32 | #define IDLTIM_ARM_SHIFT 9 | ||
| 33 | #define IDLAPI_ARM_SHIFT 8 | ||
| 34 | #define IDLIF_ARM_SHIFT 6 | ||
| 35 | #define IDLLB_ARM_SHIFT 4 /* undocumented? */ | ||
| 36 | #define OMAP1510_IDLLCD_ARM_SHIFT 3 /* undocumented? */ | ||
| 37 | #define IDLPER_ARM_SHIFT 2 | ||
| 38 | #define IDLXORP_ARM_SHIFT 1 | ||
| 39 | #define IDLWDT_ARM_SHIFT 0 | ||
| 40 | |||
| 41 | /* Some MOD_CONF_CTRL_0 bit shifts - used in struct clk.enable_bit */ | ||
| 42 | #define CONF_MOD_UART3_CLK_MODE_R 31 | ||
| 43 | #define CONF_MOD_UART2_CLK_MODE_R 30 | ||
| 44 | #define CONF_MOD_UART1_CLK_MODE_R 29 | ||
| 45 | #define CONF_MOD_MMC_SD_CLK_REQ_R 23 | ||
| 46 | #define CONF_MOD_MCBSP3_AUXON 20 | ||
| 47 | |||
| 48 | /* Some MOD_CONF_CTRL_1 bit shifts - used in struct clk.enable_bit */ | ||
| 49 | #define CONF_MOD_SOSSI_CLK_EN_R 16 | ||
| 50 | |||
| 51 | /* Some OTG_SYSCON_2-specific bit fields */ | ||
| 52 | #define OTG_SYSCON_2_UHOST_EN_SHIFT 8 | ||
| 53 | |||
| 54 | /* Some SOFT_REQ_REG bit fields - used in struct clk.enable_bit */ | ||
| 55 | #define SOFT_MMC2_DPLL_REQ_SHIFT 13 | ||
| 56 | #define SOFT_MMC_DPLL_REQ_SHIFT 12 | ||
| 57 | #define SOFT_UART3_DPLL_REQ_SHIFT 11 | ||
| 58 | #define SOFT_UART2_DPLL_REQ_SHIFT 10 | ||
| 59 | #define SOFT_UART1_DPLL_REQ_SHIFT 9 | ||
| 60 | #define SOFT_USB_OTG_DPLL_REQ_SHIFT 8 | ||
| 61 | #define SOFT_CAM_DPLL_REQ_SHIFT 7 | ||
| 62 | #define SOFT_COM_MCKO_REQ_SHIFT 6 | ||
| 63 | #define SOFT_PERIPH_REQ_SHIFT 5 /* sys_ck gate for UART2 ? */ | ||
| 64 | #define USB_REQ_EN_SHIFT 4 | ||
| 65 | #define SOFT_USB_REQ_SHIFT 3 /* sys_ck gate for USB host? */ | ||
| 66 | #define SOFT_SDW_REQ_SHIFT 2 /* sys_ck gate for Bluetooth? */ | ||
| 67 | #define SOFT_COM_REQ_SHIFT 1 /* sys_ck gate for com proc? */ | ||
| 68 | #define SOFT_DPLL_REQ_SHIFT 0 | ||
| 69 | |||
| 70 | /* | ||
| 27 | * Omap1 clocks | 71 | * Omap1 clocks |
| 28 | *-------------------------------------------------------------------------*/ | 72 | */ |
| 29 | 73 | ||
| 30 | static struct clk ck_ref = { | 74 | static struct clk ck_ref = { |
| 31 | .name = "ck_ref", | 75 | .name = "ck_ref", |
| @@ -54,7 +98,7 @@ static struct arm_idlect1_clk ck_dpll1out = { | |||
| 54 | .enable_bit = EN_CKOUT_ARM, | 98 | .enable_bit = EN_CKOUT_ARM, |
| 55 | .recalc = &followparent_recalc, | 99 | .recalc = &followparent_recalc, |
| 56 | }, | 100 | }, |
| 57 | .idlect_shift = 12, | 101 | .idlect_shift = IDL_CLKOUT_ARM_SHIFT, |
| 58 | }; | 102 | }; |
| 59 | 103 | ||
| 60 | static struct clk sossi_ck = { | 104 | static struct clk sossi_ck = { |
| @@ -63,7 +107,7 @@ static struct clk sossi_ck = { | |||
| 63 | .parent = &ck_dpll1out.clk, | 107 | .parent = &ck_dpll1out.clk, |
| 64 | .flags = CLOCK_NO_IDLE_PARENT | ENABLE_REG_32BIT, | 108 | .flags = CLOCK_NO_IDLE_PARENT | ENABLE_REG_32BIT, |
| 65 | .enable_reg = OMAP1_IO_ADDRESS(MOD_CONF_CTRL_1), | 109 | .enable_reg = OMAP1_IO_ADDRESS(MOD_CONF_CTRL_1), |
| 66 | .enable_bit = 16, | 110 | .enable_bit = CONF_MOD_SOSSI_CLK_EN_R, |
| 67 | .recalc = &omap1_sossi_recalc, | 111 | .recalc = &omap1_sossi_recalc, |
| 68 | .set_rate = &omap1_set_sossi_rate, | 112 | .set_rate = &omap1_set_sossi_rate, |
| 69 | }; | 113 | }; |
| @@ -91,7 +135,7 @@ static struct arm_idlect1_clk armper_ck = { | |||
| 91 | .round_rate = omap1_clk_round_rate_ckctl_arm, | 135 | .round_rate = omap1_clk_round_rate_ckctl_arm, |
| 92 | .set_rate = omap1_clk_set_rate_ckctl_arm, | 136 | .set_rate = omap1_clk_set_rate_ckctl_arm, |
| 93 | }, | 137 | }, |
| 94 | .idlect_shift = 2, | 138 | .idlect_shift = IDLPER_ARM_SHIFT, |
| 95 | }; | 139 | }; |
| 96 | 140 | ||
| 97 | /* | 141 | /* |
| @@ -118,7 +162,7 @@ static struct arm_idlect1_clk armxor_ck = { | |||
| 118 | .enable_bit = EN_XORPCK, | 162 | .enable_bit = EN_XORPCK, |
| 119 | .recalc = &followparent_recalc, | 163 | .recalc = &followparent_recalc, |
| 120 | }, | 164 | }, |
| 121 | .idlect_shift = 1, | 165 | .idlect_shift = IDLXORP_ARM_SHIFT, |
| 122 | }; | 166 | }; |
| 123 | 167 | ||
| 124 | static struct arm_idlect1_clk armtim_ck = { | 168 | static struct arm_idlect1_clk armtim_ck = { |
| @@ -131,7 +175,7 @@ static struct arm_idlect1_clk armtim_ck = { | |||
| 131 | .enable_bit = EN_TIMCK, | 175 | .enable_bit = EN_TIMCK, |
| 132 | .recalc = &followparent_recalc, | 176 | .recalc = &followparent_recalc, |
| 133 | }, | 177 | }, |
| 134 | .idlect_shift = 9, | 178 | .idlect_shift = IDLTIM_ARM_SHIFT, |
| 135 | }; | 179 | }; |
| 136 | 180 | ||
| 137 | static struct arm_idlect1_clk armwdt_ck = { | 181 | static struct arm_idlect1_clk armwdt_ck = { |
| @@ -145,7 +189,7 @@ static struct arm_idlect1_clk armwdt_ck = { | |||
| 145 | .fixed_div = 14, | 189 | .fixed_div = 14, |
| 146 | .recalc = &omap_fixed_divisor_recalc, | 190 | .recalc = &omap_fixed_divisor_recalc, |
| 147 | }, | 191 | }, |
| 148 | .idlect_shift = 0, | 192 | .idlect_shift = IDLWDT_ARM_SHIFT, |
| 149 | }; | 193 | }; |
| 150 | 194 | ||
| 151 | static struct clk arminth_ck16xx = { | 195 | static struct clk arminth_ck16xx = { |
| @@ -212,7 +256,6 @@ static struct clk dsptim_ck = { | |||
| 212 | .recalc = &followparent_recalc, | 256 | .recalc = &followparent_recalc, |
| 213 | }; | 257 | }; |
| 214 | 258 | ||
| 215 | /* Tie ARM_IDLECT1:IDLIF_ARM to this logical clock structure */ | ||
| 216 | static struct arm_idlect1_clk tc_ck = { | 259 | static struct arm_idlect1_clk tc_ck = { |
| 217 | .clk = { | 260 | .clk = { |
| 218 | .name = "tc_ck", | 261 | .name = "tc_ck", |
| @@ -224,7 +267,7 @@ static struct arm_idlect1_clk tc_ck = { | |||
| 224 | .round_rate = omap1_clk_round_rate_ckctl_arm, | 267 | .round_rate = omap1_clk_round_rate_ckctl_arm, |
| 225 | .set_rate = omap1_clk_set_rate_ckctl_arm, | 268 | .set_rate = omap1_clk_set_rate_ckctl_arm, |
| 226 | }, | 269 | }, |
| 227 | .idlect_shift = 6, | 270 | .idlect_shift = IDLIF_ARM_SHIFT, |
| 228 | }; | 271 | }; |
| 229 | 272 | ||
| 230 | static struct clk arminth_ck1510 = { | 273 | static struct clk arminth_ck1510 = { |
| @@ -304,7 +347,7 @@ static struct arm_idlect1_clk api_ck = { | |||
| 304 | .enable_bit = EN_APICK, | 347 | .enable_bit = EN_APICK, |
| 305 | .recalc = &followparent_recalc, | 348 | .recalc = &followparent_recalc, |
| 306 | }, | 349 | }, |
| 307 | .idlect_shift = 8, | 350 | .idlect_shift = IDLAPI_ARM_SHIFT, |
| 308 | }; | 351 | }; |
| 309 | 352 | ||
| 310 | static struct arm_idlect1_clk lb_ck = { | 353 | static struct arm_idlect1_clk lb_ck = { |
| @@ -317,7 +360,7 @@ static struct arm_idlect1_clk lb_ck = { | |||
| 317 | .enable_bit = EN_LBCK, | 360 | .enable_bit = EN_LBCK, |
| 318 | .recalc = &followparent_recalc, | 361 | .recalc = &followparent_recalc, |
| 319 | }, | 362 | }, |
| 320 | .idlect_shift = 4, | 363 | .idlect_shift = IDLLB_ARM_SHIFT, |
| 321 | }; | 364 | }; |
| 322 | 365 | ||
| 323 | static struct clk rhea1_ck = { | 366 | static struct clk rhea1_ck = { |
| @@ -359,9 +402,15 @@ static struct arm_idlect1_clk lcd_ck_1510 = { | |||
| 359 | .round_rate = omap1_clk_round_rate_ckctl_arm, | 402 | .round_rate = omap1_clk_round_rate_ckctl_arm, |
| 360 | .set_rate = omap1_clk_set_rate_ckctl_arm, | 403 | .set_rate = omap1_clk_set_rate_ckctl_arm, |
| 361 | }, | 404 | }, |
| 362 | .idlect_shift = 3, | 405 | .idlect_shift = OMAP1510_IDLLCD_ARM_SHIFT, |
| 363 | }; | 406 | }; |
| 364 | 407 | ||
| 408 | /* | ||
| 409 | * XXX The enable_bit here is misused - it simply switches between 12MHz | ||
| 410 | * and 48MHz. Reimplement with clksel. | ||
| 411 | * | ||
| 412 | * XXX does this need SYSC register handling? | ||
| 413 | */ | ||
| 365 | static struct clk uart1_1510 = { | 414 | static struct clk uart1_1510 = { |
| 366 | .name = "uart1_ck", | 415 | .name = "uart1_ck", |
| 367 | .ops = &clkops_null, | 416 | .ops = &clkops_null, |
| @@ -370,25 +419,37 @@ static struct clk uart1_1510 = { | |||
| 370 | .rate = 12000000, | 419 | .rate = 12000000, |
| 371 | .flags = ENABLE_REG_32BIT | CLOCK_NO_IDLE_PARENT, | 420 | .flags = ENABLE_REG_32BIT | CLOCK_NO_IDLE_PARENT, |
| 372 | .enable_reg = OMAP1_IO_ADDRESS(MOD_CONF_CTRL_0), | 421 | .enable_reg = OMAP1_IO_ADDRESS(MOD_CONF_CTRL_0), |
| 373 | .enable_bit = 29, /* Chooses between 12MHz and 48MHz */ | 422 | .enable_bit = CONF_MOD_UART1_CLK_MODE_R, |
| 374 | .set_rate = &omap1_set_uart_rate, | 423 | .set_rate = &omap1_set_uart_rate, |
| 375 | .recalc = &omap1_uart_recalc, | 424 | .recalc = &omap1_uart_recalc, |
| 376 | }; | 425 | }; |
| 377 | 426 | ||
| 427 | /* | ||
| 428 | * XXX The enable_bit here is misused - it simply switches between 12MHz | ||
| 429 | * and 48MHz. Reimplement with clksel. | ||
| 430 | * | ||
| 431 | * XXX SYSC register handling does not belong in the clock framework | ||
| 432 | */ | ||
| 378 | static struct uart_clk uart1_16xx = { | 433 | static struct uart_clk uart1_16xx = { |
| 379 | .clk = { | 434 | .clk = { |
| 380 | .name = "uart1_ck", | 435 | .name = "uart1_ck", |
| 381 | .ops = &clkops_uart, | 436 | .ops = &clkops_uart_16xx, |
| 382 | /* Direct from ULPD, no real parent */ | 437 | /* Direct from ULPD, no real parent */ |
| 383 | .parent = &armper_ck.clk, | 438 | .parent = &armper_ck.clk, |
| 384 | .rate = 48000000, | 439 | .rate = 48000000, |
| 385 | .flags = ENABLE_REG_32BIT | CLOCK_NO_IDLE_PARENT, | 440 | .flags = ENABLE_REG_32BIT | CLOCK_NO_IDLE_PARENT, |
| 386 | .enable_reg = OMAP1_IO_ADDRESS(MOD_CONF_CTRL_0), | 441 | .enable_reg = OMAP1_IO_ADDRESS(MOD_CONF_CTRL_0), |
| 387 | .enable_bit = 29, | 442 | .enable_bit = CONF_MOD_UART1_CLK_MODE_R, |
| 388 | }, | 443 | }, |
| 389 | .sysc_addr = 0xfffb0054, | 444 | .sysc_addr = 0xfffb0054, |
| 390 | }; | 445 | }; |
| 391 | 446 | ||
| 447 | /* | ||
| 448 | * XXX The enable_bit here is misused - it simply switches between 12MHz | ||
| 449 | * and 48MHz. Reimplement with clksel. | ||
| 450 | * | ||
| 451 | * XXX does this need SYSC register handling? | ||
| 452 | */ | ||
| 392 | static struct clk uart2_ck = { | 453 | static struct clk uart2_ck = { |
| 393 | .name = "uart2_ck", | 454 | .name = "uart2_ck", |
| 394 | .ops = &clkops_null, | 455 | .ops = &clkops_null, |
| @@ -397,11 +458,17 @@ static struct clk uart2_ck = { | |||
| 397 | .rate = 12000000, | 458 | .rate = 12000000, |
| 398 | .flags = ENABLE_REG_32BIT | CLOCK_NO_IDLE_PARENT, | 459 | .flags = ENABLE_REG_32BIT | CLOCK_NO_IDLE_PARENT, |
| 399 | .enable_reg = OMAP1_IO_ADDRESS(MOD_CONF_CTRL_0), | 460 | .enable_reg = OMAP1_IO_ADDRESS(MOD_CONF_CTRL_0), |
| 400 | .enable_bit = 30, /* Chooses between 12MHz and 48MHz */ | 461 | .enable_bit = CONF_MOD_UART2_CLK_MODE_R, |
| 401 | .set_rate = &omap1_set_uart_rate, | 462 | .set_rate = &omap1_set_uart_rate, |
| 402 | .recalc = &omap1_uart_recalc, | 463 | .recalc = &omap1_uart_recalc, |
| 403 | }; | 464 | }; |
| 404 | 465 | ||
| 466 | /* | ||
| 467 | * XXX The enable_bit here is misused - it simply switches between 12MHz | ||
| 468 | * and 48MHz. Reimplement with clksel. | ||
| 469 | * | ||
| 470 | * XXX does this need SYSC register handling? | ||
| 471 | */ | ||
| 405 | static struct clk uart3_1510 = { | 472 | static struct clk uart3_1510 = { |
| 406 | .name = "uart3_ck", | 473 | .name = "uart3_ck", |
| 407 | .ops = &clkops_null, | 474 | .ops = &clkops_null, |
| @@ -410,21 +477,27 @@ static struct clk uart3_1510 = { | |||
| 410 | .rate = 12000000, | 477 | .rate = 12000000, |
| 411 | .flags = ENABLE_REG_32BIT | CLOCK_NO_IDLE_PARENT, | 478 | .flags = ENABLE_REG_32BIT | CLOCK_NO_IDLE_PARENT, |
| 412 | .enable_reg = OMAP1_IO_ADDRESS(MOD_CONF_CTRL_0), | 479 | .enable_reg = OMAP1_IO_ADDRESS(MOD_CONF_CTRL_0), |
| 413 | .enable_bit = 31, /* Chooses between 12MHz and 48MHz */ | 480 | .enable_bit = CONF_MOD_UART3_CLK_MODE_R, |
| 414 | .set_rate = &omap1_set_uart_rate, | 481 | .set_rate = &omap1_set_uart_rate, |
| 415 | .recalc = &omap1_uart_recalc, | 482 | .recalc = &omap1_uart_recalc, |
| 416 | }; | 483 | }; |
| 417 | 484 | ||
| 485 | /* | ||
| 486 | * XXX The enable_bit here is misused - it simply switches between 12MHz | ||
| 487 | * and 48MHz. Reimplement with clksel. | ||
| 488 | * | ||
| 489 | * XXX SYSC register handling does not belong in the clock framework | ||
| 490 | */ | ||
| 418 | static struct uart_clk uart3_16xx = { | 491 | static struct uart_clk uart3_16xx = { |
| 419 | .clk = { | 492 | .clk = { |
| 420 | .name = "uart3_ck", | 493 | .name = "uart3_ck", |
| 421 | .ops = &clkops_uart, | 494 | .ops = &clkops_uart_16xx, |
| 422 | /* Direct from ULPD, no real parent */ | 495 | /* Direct from ULPD, no real parent */ |
| 423 | .parent = &armper_ck.clk, | 496 | .parent = &armper_ck.clk, |
| 424 | .rate = 48000000, | 497 | .rate = 48000000, |
| 425 | .flags = ENABLE_REG_32BIT | CLOCK_NO_IDLE_PARENT, | 498 | .flags = ENABLE_REG_32BIT | CLOCK_NO_IDLE_PARENT, |
| 426 | .enable_reg = OMAP1_IO_ADDRESS(MOD_CONF_CTRL_0), | 499 | .enable_reg = OMAP1_IO_ADDRESS(MOD_CONF_CTRL_0), |
| 427 | .enable_bit = 31, | 500 | .enable_bit = CONF_MOD_UART3_CLK_MODE_R, |
| 428 | }, | 501 | }, |
| 429 | .sysc_addr = 0xfffb9854, | 502 | .sysc_addr = 0xfffb9854, |
| 430 | }; | 503 | }; |
| @@ -457,7 +530,7 @@ static struct clk usb_hhc_ck16xx = { | |||
| 457 | /* OTG_SYSCON_2.OTG_PADEN == 0 (not 1510-compatible) */ | 530 | /* OTG_SYSCON_2.OTG_PADEN == 0 (not 1510-compatible) */ |
| 458 | .flags = ENABLE_REG_32BIT, | 531 | .flags = ENABLE_REG_32BIT, |
| 459 | .enable_reg = OMAP1_IO_ADDRESS(OTG_BASE + 0x08), /* OTG_SYSCON_2 */ | 532 | .enable_reg = OMAP1_IO_ADDRESS(OTG_BASE + 0x08), /* OTG_SYSCON_2 */ |
| 460 | .enable_bit = 8 /* UHOST_EN */, | 533 | .enable_bit = OTG_SYSCON_2_UHOST_EN_SHIFT |
| 461 | }; | 534 | }; |
| 462 | 535 | ||
| 463 | static struct clk usb_dc_ck = { | 536 | static struct clk usb_dc_ck = { |
| @@ -466,7 +539,7 @@ static struct clk usb_dc_ck = { | |||
| 466 | /* Direct from ULPD, no parent */ | 539 | /* Direct from ULPD, no parent */ |
| 467 | .rate = 48000000, | 540 | .rate = 48000000, |
| 468 | .enable_reg = OMAP1_IO_ADDRESS(SOFT_REQ_REG), | 541 | .enable_reg = OMAP1_IO_ADDRESS(SOFT_REQ_REG), |
| 469 | .enable_bit = 4, | 542 | .enable_bit = USB_REQ_EN_SHIFT, |
| 470 | }; | 543 | }; |
| 471 | 544 | ||
| 472 | static struct clk usb_dc_ck7xx = { | 545 | static struct clk usb_dc_ck7xx = { |
| @@ -475,7 +548,7 @@ static struct clk usb_dc_ck7xx = { | |||
| 475 | /* Direct from ULPD, no parent */ | 548 | /* Direct from ULPD, no parent */ |
| 476 | .rate = 48000000, | 549 | .rate = 48000000, |
| 477 | .enable_reg = OMAP1_IO_ADDRESS(SOFT_REQ_REG), | 550 | .enable_reg = OMAP1_IO_ADDRESS(SOFT_REQ_REG), |
| 478 | .enable_bit = 8, | 551 | .enable_bit = SOFT_USB_OTG_DPLL_REQ_SHIFT, |
| 479 | }; | 552 | }; |
| 480 | 553 | ||
| 481 | static struct clk uart1_7xx = { | 554 | static struct clk uart1_7xx = { |
| @@ -502,7 +575,7 @@ static struct clk mclk_1510 = { | |||
| 502 | /* Direct from ULPD, no parent. May be enabled by ext hardware. */ | 575 | /* Direct from ULPD, no parent. May be enabled by ext hardware. */ |
| 503 | .rate = 12000000, | 576 | .rate = 12000000, |
| 504 | .enable_reg = OMAP1_IO_ADDRESS(SOFT_REQ_REG), | 577 | .enable_reg = OMAP1_IO_ADDRESS(SOFT_REQ_REG), |
| 505 | .enable_bit = 6, | 578 | .enable_bit = SOFT_COM_MCKO_REQ_SHIFT, |
| 506 | }; | 579 | }; |
| 507 | 580 | ||
| 508 | static struct clk mclk_16xx = { | 581 | static struct clk mclk_16xx = { |
| @@ -542,9 +615,13 @@ static struct clk mmc1_ck = { | |||
| 542 | .rate = 48000000, | 615 | .rate = 48000000, |
| 543 | .flags = ENABLE_REG_32BIT | CLOCK_NO_IDLE_PARENT, | 616 | .flags = ENABLE_REG_32BIT | CLOCK_NO_IDLE_PARENT, |
| 544 | .enable_reg = OMAP1_IO_ADDRESS(MOD_CONF_CTRL_0), | 617 | .enable_reg = OMAP1_IO_ADDRESS(MOD_CONF_CTRL_0), |
| 545 | .enable_bit = 23, | 618 | .enable_bit = CONF_MOD_MMC_SD_CLK_REQ_R, |
| 546 | }; | 619 | }; |
| 547 | 620 | ||
| 621 | /* | ||
| 622 | * XXX MOD_CONF_CTRL_0 bit 20 is defined in the 1510 TRM as | ||
| 623 | * CONF_MOD_MCBSP3_AUXON ?? | ||
| 624 | */ | ||
| 548 | static struct clk mmc2_ck = { | 625 | static struct clk mmc2_ck = { |
| 549 | .name = "mmc2_ck", | 626 | .name = "mmc2_ck", |
| 550 | .ops = &clkops_generic, | 627 | .ops = &clkops_generic, |
| @@ -564,7 +641,7 @@ static struct clk mmc3_ck = { | |||
| 564 | .rate = 48000000, | 641 | .rate = 48000000, |
| 565 | .flags = ENABLE_REG_32BIT | CLOCK_NO_IDLE_PARENT, | 642 | .flags = ENABLE_REG_32BIT | CLOCK_NO_IDLE_PARENT, |
| 566 | .enable_reg = OMAP1_IO_ADDRESS(SOFT_REQ_REG), | 643 | .enable_reg = OMAP1_IO_ADDRESS(SOFT_REQ_REG), |
| 567 | .enable_bit = 12, | 644 | .enable_bit = SOFT_MMC_DPLL_REQ_SHIFT, |
| 568 | }; | 645 | }; |
| 569 | 646 | ||
| 570 | static struct clk virtual_ck_mpu = { | 647 | static struct clk virtual_ck_mpu = { |
diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile index a5266fab6177..63b2d8859c3c 100644 --- a/arch/arm/mach-omap2/Makefile +++ b/arch/arm/mach-omap2/Makefile | |||
| @@ -3,7 +3,7 @@ | |||
| 3 | # | 3 | # |
| 4 | 4 | ||
| 5 | # Common support | 5 | # Common support |
| 6 | obj-y := id.o io.o control.o mux.o devices.o serial.o gpmc.o timer-gp.o | 6 | obj-y := id.o io.o control.o mux.o devices.o serial.o gpmc.o timer-gp.o pm.o |
| 7 | 7 | ||
| 8 | omap-2-3-common = irq.o sdrc.o | 8 | omap-2-3-common = irq.o sdrc.o |
| 9 | hwmod-common = omap_hwmod.o \ | 9 | hwmod-common = omap_hwmod.o \ |
| @@ -15,7 +15,7 @@ clock-common = clock.o clock_common_data.o \ | |||
| 15 | 15 | ||
| 16 | obj-$(CONFIG_ARCH_OMAP2) += $(omap-2-3-common) $(prcm-common) $(hwmod-common) | 16 | obj-$(CONFIG_ARCH_OMAP2) += $(omap-2-3-common) $(prcm-common) $(hwmod-common) |
| 17 | obj-$(CONFIG_ARCH_OMAP3) += $(omap-2-3-common) $(prcm-common) $(hwmod-common) | 17 | obj-$(CONFIG_ARCH_OMAP3) += $(omap-2-3-common) $(prcm-common) $(hwmod-common) |
| 18 | obj-$(CONFIG_ARCH_OMAP4) += $(prcm-common) | 18 | obj-$(CONFIG_ARCH_OMAP4) += $(prcm-common) $(hwmod-common) |
| 19 | 19 | ||
| 20 | obj-$(CONFIG_OMAP_MCBSP) += mcbsp.o | 20 | obj-$(CONFIG_OMAP_MCBSP) += mcbsp.o |
| 21 | 21 | ||
diff --git a/arch/arm/mach-omap2/clock3xxx_data.c b/arch/arm/mach-omap2/clock3xxx_data.c index 41b155acfca7..c226798e9ac6 100644 --- a/arch/arm/mach-omap2/clock3xxx_data.c +++ b/arch/arm/mach-omap2/clock3xxx_data.c | |||
| @@ -1408,7 +1408,7 @@ static struct clk ts_fck = { | |||
| 1408 | 1408 | ||
| 1409 | static struct clk usbtll_fck = { | 1409 | static struct clk usbtll_fck = { |
| 1410 | .name = "usbtll_fck", | 1410 | .name = "usbtll_fck", |
| 1411 | .ops = &clkops_omap2_dflt, | 1411 | .ops = &clkops_omap2_dflt_wait, |
| 1412 | .parent = &dpll5_m2_ck, | 1412 | .parent = &dpll5_m2_ck, |
| 1413 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP3430ES2_CM_FCLKEN3), | 1413 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP3430ES2_CM_FCLKEN3), |
| 1414 | .enable_bit = OMAP3430ES2_EN_USBTLL_SHIFT, | 1414 | .enable_bit = OMAP3430ES2_EN_USBTLL_SHIFT, |
diff --git a/arch/arm/mach-omap2/cm.c b/arch/arm/mach-omap2/cm.c index 2d83565d2be2..721c3b66740a 100644 --- a/arch/arm/mach-omap2/cm.c +++ b/arch/arm/mach-omap2/cm.c | |||
| @@ -50,15 +50,15 @@ int omap2_cm_wait_module_ready(s16 prcm_mod, u8 idlest_id, u8 idlest_shift) | |||
| 50 | 50 | ||
| 51 | cm_idlest_reg = cm_idlest_offs[idlest_id - 1]; | 51 | cm_idlest_reg = cm_idlest_offs[idlest_id - 1]; |
| 52 | 52 | ||
| 53 | mask = 1 << idlest_shift; | ||
| 54 | |||
| 53 | if (cpu_is_omap24xx()) | 55 | if (cpu_is_omap24xx()) |
| 54 | ena = idlest_shift; | 56 | ena = mask; |
| 55 | else if (cpu_is_omap34xx()) | 57 | else if (cpu_is_omap34xx()) |
| 56 | ena = 0; | 58 | ena = 0; |
| 57 | else | 59 | else |
| 58 | BUG(); | 60 | BUG(); |
| 59 | 61 | ||
| 60 | mask = 1 << idlest_shift; | ||
| 61 | |||
| 62 | /* XXX should be OMAP2 CM */ | 62 | /* XXX should be OMAP2 CM */ |
| 63 | omap_test_timeout(((cm_read_mod_reg(prcm_mod, cm_idlest_reg) & mask) == ena), | 63 | omap_test_timeout(((cm_read_mod_reg(prcm_mod, cm_idlest_reg) & mask) == ena), |
| 64 | MAX_MODULE_READY_TIME, i); | 64 | MAX_MODULE_READY_TIME, i); |
diff --git a/arch/arm/mach-omap2/io.c b/arch/arm/mach-omap2/io.c index b12d715dee5b..210de9d292fb 100644 --- a/arch/arm/mach-omap2/io.c +++ b/arch/arm/mach-omap2/io.c | |||
| @@ -44,6 +44,7 @@ | |||
| 44 | 44 | ||
| 45 | #include <plat/clockdomain.h> | 45 | #include <plat/clockdomain.h> |
| 46 | #include "clockdomains.h" | 46 | #include "clockdomains.h" |
| 47 | |||
| 47 | #include <plat/omap_hwmod.h> | 48 | #include <plat/omap_hwmod.h> |
| 48 | 49 | ||
| 49 | /* | 50 | /* |
| @@ -315,6 +316,8 @@ static int __init _omap2_init_reprogram_sdrc(void) | |||
| 315 | void __init omap2_init_common_hw(struct omap_sdrc_params *sdrc_cs0, | 316 | void __init omap2_init_common_hw(struct omap_sdrc_params *sdrc_cs0, |
| 316 | struct omap_sdrc_params *sdrc_cs1) | 317 | struct omap_sdrc_params *sdrc_cs1) |
| 317 | { | 318 | { |
| 319 | u8 skip_setup_idle = 0; | ||
| 320 | |||
| 318 | pwrdm_init(powerdomains_omap); | 321 | pwrdm_init(powerdomains_omap); |
| 319 | clkdm_init(clockdomains_omap, clkdm_autodeps); | 322 | clkdm_init(clockdomains_omap, clkdm_autodeps); |
| 320 | if (cpu_is_omap242x()) | 323 | if (cpu_is_omap242x()) |
| @@ -338,9 +341,13 @@ void __init omap2_init_common_hw(struct omap_sdrc_params *sdrc_cs0, | |||
| 338 | pr_err("Could not init clock framework - unknown CPU\n"); | 341 | pr_err("Could not init clock framework - unknown CPU\n"); |
| 339 | 342 | ||
| 340 | omap_serial_early_init(); | 343 | omap_serial_early_init(); |
| 344 | |||
| 345 | #ifndef CONFIG_PM_RUNTIME | ||
| 346 | skip_setup_idle = 1; | ||
| 347 | #endif | ||
| 341 | if (cpu_is_omap24xx() || cpu_is_omap34xx()) /* FIXME: OMAP4 */ | 348 | if (cpu_is_omap24xx() || cpu_is_omap34xx()) /* FIXME: OMAP4 */ |
| 342 | omap_hwmod_late_init(); | 349 | omap_hwmod_late_init(skip_setup_idle); |
| 343 | omap_pm_if_init(); | 350 | |
| 344 | if (cpu_is_omap24xx() || cpu_is_omap34xx()) { | 351 | if (cpu_is_omap24xx() || cpu_is_omap34xx()) { |
| 345 | omap2_sdrc_init(sdrc_cs0, sdrc_cs1); | 352 | omap2_sdrc_init(sdrc_cs0, sdrc_cs1); |
| 346 | _omap2_init_reprogram_sdrc(); | 353 | _omap2_init_reprogram_sdrc(); |
diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c index b7a4133267d8..cb911d7d1a3c 100644 --- a/arch/arm/mach-omap2/omap_hwmod.c +++ b/arch/arm/mach-omap2/omap_hwmod.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * omap_hwmod implementation for OMAP2/3/4 | 2 | * omap_hwmod implementation for OMAP2/3/4 |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2009 Nokia Corporation | 4 | * Copyright (C) 2009-2010 Nokia Corporation |
| 5 | * | 5 | * |
| 6 | * Paul Walmsley, Benoît Cousson, Kevin Hilman | 6 | * Paul Walmsley, Benoît Cousson, Kevin Hilman |
| 7 | * | 7 | * |
| @@ -423,7 +423,7 @@ static int _init_main_clk(struct omap_hwmod *oh) | |||
| 423 | } | 423 | } |
| 424 | 424 | ||
| 425 | /** | 425 | /** |
| 426 | * _init_interface_clk - get a struct clk * for the the hwmod's interface clks | 426 | * _init_interface_clks - get a struct clk * for the the hwmod's interface clks |
| 427 | * @oh: struct omap_hwmod * | 427 | * @oh: struct omap_hwmod * |
| 428 | * | 428 | * |
| 429 | * Called from _init_clocks(). Populates the @oh OCP slave interface | 429 | * Called from _init_clocks(). Populates the @oh OCP slave interface |
| @@ -764,6 +764,7 @@ static struct omap_hwmod *_lookup(const char *name) | |||
| 764 | /** | 764 | /** |
| 765 | * _init_clocks - clk_get() all clocks associated with this hwmod | 765 | * _init_clocks - clk_get() all clocks associated with this hwmod |
| 766 | * @oh: struct omap_hwmod * | 766 | * @oh: struct omap_hwmod * |
| 767 | * @data: not used; pass NULL | ||
| 767 | * | 768 | * |
| 768 | * Called by omap_hwmod_late_init() (after omap2_clk_init()). | 769 | * Called by omap_hwmod_late_init() (after omap2_clk_init()). |
| 769 | * Resolves all clock names embedded in the hwmod. Must be called | 770 | * Resolves all clock names embedded in the hwmod. Must be called |
| @@ -771,7 +772,7 @@ static struct omap_hwmod *_lookup(const char *name) | |||
| 771 | * has not yet been registered or if the clocks have already been | 772 | * has not yet been registered or if the clocks have already been |
| 772 | * initialized, 0 on success, or a non-zero error on failure. | 773 | * initialized, 0 on success, or a non-zero error on failure. |
| 773 | */ | 774 | */ |
| 774 | static int _init_clocks(struct omap_hwmod *oh) | 775 | static int _init_clocks(struct omap_hwmod *oh, void *data) |
| 775 | { | 776 | { |
| 776 | int ret = 0; | 777 | int ret = 0; |
| 777 | 778 | ||
| @@ -886,7 +887,7 @@ static int _reset(struct omap_hwmod *oh) | |||
| 886 | } | 887 | } |
| 887 | 888 | ||
| 888 | /** | 889 | /** |
| 889 | * _enable - enable an omap_hwmod | 890 | * _omap_hwmod_enable - enable an omap_hwmod |
| 890 | * @oh: struct omap_hwmod * | 891 | * @oh: struct omap_hwmod * |
| 891 | * | 892 | * |
| 892 | * Enables an omap_hwmod @oh such that the MPU can access the hwmod's | 893 | * Enables an omap_hwmod @oh such that the MPU can access the hwmod's |
| @@ -894,7 +895,7 @@ static int _reset(struct omap_hwmod *oh) | |||
| 894 | * Returns -EINVAL if the hwmod is in the wrong state or passes along | 895 | * Returns -EINVAL if the hwmod is in the wrong state or passes along |
| 895 | * the return value of _wait_target_ready(). | 896 | * the return value of _wait_target_ready(). |
| 896 | */ | 897 | */ |
| 897 | static int _enable(struct omap_hwmod *oh) | 898 | int _omap_hwmod_enable(struct omap_hwmod *oh) |
| 898 | { | 899 | { |
| 899 | int r; | 900 | int r; |
| 900 | 901 | ||
| @@ -939,7 +940,7 @@ static int _enable(struct omap_hwmod *oh) | |||
| 939 | * no further work. Returns -EINVAL if the hwmod is in the wrong | 940 | * no further work. Returns -EINVAL if the hwmod is in the wrong |
| 940 | * state or returns 0. | 941 | * state or returns 0. |
| 941 | */ | 942 | */ |
| 942 | static int _idle(struct omap_hwmod *oh) | 943 | int _omap_hwmod_idle(struct omap_hwmod *oh) |
| 943 | { | 944 | { |
| 944 | if (oh->_state != _HWMOD_STATE_ENABLED) { | 945 | if (oh->_state != _HWMOD_STATE_ENABLED) { |
| 945 | WARN(1, "omap_hwmod: %s: idle state can only be entered from " | 946 | WARN(1, "omap_hwmod: %s: idle state can only be entered from " |
| @@ -996,19 +997,25 @@ static int _shutdown(struct omap_hwmod *oh) | |||
| 996 | /** | 997 | /** |
| 997 | * _setup - do initial configuration of omap_hwmod | 998 | * _setup - do initial configuration of omap_hwmod |
| 998 | * @oh: struct omap_hwmod * | 999 | * @oh: struct omap_hwmod * |
| 1000 | * @skip_setup_idle_p: do not idle hwmods at the end of the fn if 1 | ||
| 999 | * | 1001 | * |
| 1000 | * Writes the CLOCKACTIVITY bits @clockact to the hwmod @oh | 1002 | * Writes the CLOCKACTIVITY bits @clockact to the hwmod @oh |
| 1001 | * OCP_SYSCONFIG register. Must be called with omap_hwmod_mutex | 1003 | * OCP_SYSCONFIG register. Must be called with omap_hwmod_mutex held. |
| 1002 | * held. Returns -EINVAL if the hwmod is in the wrong state or returns | 1004 | * @skip_setup_idle is intended to be used on a system that will not |
| 1003 | * 0. | 1005 | * call omap_hwmod_enable() to enable devices (e.g., a system without |
| 1006 | * PM runtime). Returns -EINVAL if the hwmod is in the wrong state or | ||
| 1007 | * returns 0. | ||
| 1004 | */ | 1008 | */ |
| 1005 | static int _setup(struct omap_hwmod *oh) | 1009 | static int _setup(struct omap_hwmod *oh, void *data) |
| 1006 | { | 1010 | { |
| 1007 | int i, r; | 1011 | int i, r; |
| 1012 | u8 skip_setup_idle; | ||
| 1008 | 1013 | ||
| 1009 | if (!oh) | 1014 | if (!oh || !data) |
| 1010 | return -EINVAL; | 1015 | return -EINVAL; |
| 1011 | 1016 | ||
| 1017 | skip_setup_idle = *(u8 *)data; | ||
| 1018 | |||
| 1012 | /* Set iclk autoidle mode */ | 1019 | /* Set iclk autoidle mode */ |
| 1013 | if (oh->slaves_cnt > 0) { | 1020 | if (oh->slaves_cnt > 0) { |
| 1014 | for (i = 0; i < oh->slaves_cnt; i++) { | 1021 | for (i = 0; i < oh->slaves_cnt; i++) { |
| @@ -1029,7 +1036,7 @@ static int _setup(struct omap_hwmod *oh) | |||
| 1029 | 1036 | ||
| 1030 | oh->_state = _HWMOD_STATE_INITIALIZED; | 1037 | oh->_state = _HWMOD_STATE_INITIALIZED; |
| 1031 | 1038 | ||
| 1032 | r = _enable(oh); | 1039 | r = _omap_hwmod_enable(oh); |
| 1033 | if (r) { | 1040 | if (r) { |
| 1034 | pr_warning("omap_hwmod: %s: cannot be enabled (%d)\n", | 1041 | pr_warning("omap_hwmod: %s: cannot be enabled (%d)\n", |
| 1035 | oh->name, oh->_state); | 1042 | oh->name, oh->_state); |
| @@ -1041,7 +1048,7 @@ static int _setup(struct omap_hwmod *oh) | |||
| 1041 | * XXX Do the OCP_SYSCONFIG bits need to be | 1048 | * XXX Do the OCP_SYSCONFIG bits need to be |
| 1042 | * reprogrammed after a reset? If not, then this can | 1049 | * reprogrammed after a reset? If not, then this can |
| 1043 | * be removed. If they do, then probably the | 1050 | * be removed. If they do, then probably the |
| 1044 | * _enable() function should be split to avoid the | 1051 | * _omap_hwmod_enable() function should be split to avoid the |
| 1045 | * rewrite of the OCP_SYSCONFIG register. | 1052 | * rewrite of the OCP_SYSCONFIG register. |
| 1046 | */ | 1053 | */ |
| 1047 | if (oh->class->sysc) { | 1054 | if (oh->class->sysc) { |
| @@ -1050,8 +1057,8 @@ static int _setup(struct omap_hwmod *oh) | |||
| 1050 | } | 1057 | } |
| 1051 | } | 1058 | } |
| 1052 | 1059 | ||
| 1053 | if (!(oh->flags & HWMOD_INIT_NO_IDLE)) | 1060 | if (!(oh->flags & HWMOD_INIT_NO_IDLE) && !skip_setup_idle) |
| 1054 | _idle(oh); | 1061 | _omap_hwmod_idle(oh); |
| 1055 | 1062 | ||
| 1056 | return 0; | 1063 | return 0; |
| 1057 | } | 1064 | } |
| @@ -1062,14 +1069,29 @@ static int _setup(struct omap_hwmod *oh) | |||
| 1062 | 1069 | ||
| 1063 | u32 omap_hwmod_readl(struct omap_hwmod *oh, u16 reg_offs) | 1070 | u32 omap_hwmod_readl(struct omap_hwmod *oh, u16 reg_offs) |
| 1064 | { | 1071 | { |
| 1065 | return __raw_readl(oh->_rt_va + reg_offs); | 1072 | return __raw_readl(oh->_mpu_rt_va + reg_offs); |
| 1066 | } | 1073 | } |
| 1067 | 1074 | ||
| 1068 | void omap_hwmod_writel(u32 v, struct omap_hwmod *oh, u16 reg_offs) | 1075 | void omap_hwmod_writel(u32 v, struct omap_hwmod *oh, u16 reg_offs) |
| 1069 | { | 1076 | { |
| 1070 | __raw_writel(v, oh->_rt_va + reg_offs); | 1077 | __raw_writel(v, oh->_mpu_rt_va + reg_offs); |
| 1071 | } | 1078 | } |
| 1072 | 1079 | ||
| 1080 | /** | ||
| 1081 | * omap_hwmod_set_slave_idlemode - set the hwmod's OCP slave idlemode | ||
| 1082 | * @oh: struct omap_hwmod * | ||
| 1083 | * @idlemode: SIDLEMODE field bits (shifted to bit 0) | ||
| 1084 | * | ||
| 1085 | * Sets the IP block's OCP slave idlemode in hardware, and updates our | ||
| 1086 | * local copy. Intended to be used by drivers that have some erratum | ||
| 1087 | * that requires direct manipulation of the SIDLEMODE bits. Returns | ||
| 1088 | * -EINVAL if @oh is null, or passes along the return value from | ||
| 1089 | * _set_slave_idlemode(). | ||
| 1090 | * | ||
| 1091 | * XXX Does this function have any current users? If not, we should | ||
| 1092 | * remove it; it is better to let the rest of the hwmod code handle this. | ||
| 1093 | * Any users of this function should be scrutinized carefully. | ||
| 1094 | */ | ||
| 1073 | int omap_hwmod_set_slave_idlemode(struct omap_hwmod *oh, u8 idlemode) | 1095 | int omap_hwmod_set_slave_idlemode(struct omap_hwmod *oh, u8 idlemode) |
| 1074 | { | 1096 | { |
| 1075 | u32 v; | 1097 | u32 v; |
| @@ -1124,7 +1146,7 @@ int omap_hwmod_register(struct omap_hwmod *oh) | |||
| 1124 | ms_id = _find_mpu_port_index(oh); | 1146 | ms_id = _find_mpu_port_index(oh); |
| 1125 | if (!IS_ERR_VALUE(ms_id)) { | 1147 | if (!IS_ERR_VALUE(ms_id)) { |
| 1126 | oh->_mpu_port_index = ms_id; | 1148 | oh->_mpu_port_index = ms_id; |
| 1127 | oh->_rt_va = _find_mpu_rt_base(oh, oh->_mpu_port_index); | 1149 | oh->_mpu_rt_va = _find_mpu_rt_base(oh, oh->_mpu_port_index); |
| 1128 | } else { | 1150 | } else { |
| 1129 | oh->_int_flags |= _HWMOD_NO_MPU_PORT; | 1151 | oh->_int_flags |= _HWMOD_NO_MPU_PORT; |
| 1130 | } | 1152 | } |
| @@ -1164,6 +1186,7 @@ struct omap_hwmod *omap_hwmod_lookup(const char *name) | |||
| 1164 | /** | 1186 | /** |
| 1165 | * omap_hwmod_for_each - call function for each registered omap_hwmod | 1187 | * omap_hwmod_for_each - call function for each registered omap_hwmod |
| 1166 | * @fn: pointer to a callback function | 1188 | * @fn: pointer to a callback function |
| 1189 | * @data: void * data to pass to callback function | ||
| 1167 | * | 1190 | * |
| 1168 | * Call @fn for each registered omap_hwmod, passing @data to each | 1191 | * Call @fn for each registered omap_hwmod, passing @data to each |
| 1169 | * function. @fn must return 0 for success or any other value for | 1192 | * function. @fn must return 0 for success or any other value for |
| @@ -1172,7 +1195,8 @@ struct omap_hwmod *omap_hwmod_lookup(const char *name) | |||
| 1172 | * caller of omap_hwmod_for_each(). @fn is called with | 1195 | * caller of omap_hwmod_for_each(). @fn is called with |
| 1173 | * omap_hwmod_for_each() held. | 1196 | * omap_hwmod_for_each() held. |
| 1174 | */ | 1197 | */ |
| 1175 | int omap_hwmod_for_each(int (*fn)(struct omap_hwmod *oh)) | 1198 | int omap_hwmod_for_each(int (*fn)(struct omap_hwmod *oh, void *data), |
| 1199 | void *data) | ||
| 1176 | { | 1200 | { |
| 1177 | struct omap_hwmod *temp_oh; | 1201 | struct omap_hwmod *temp_oh; |
| 1178 | int ret; | 1202 | int ret; |
| @@ -1182,7 +1206,7 @@ int omap_hwmod_for_each(int (*fn)(struct omap_hwmod *oh)) | |||
| 1182 | 1206 | ||
| 1183 | mutex_lock(&omap_hwmod_mutex); | 1207 | mutex_lock(&omap_hwmod_mutex); |
| 1184 | list_for_each_entry(temp_oh, &omap_hwmod_list, node) { | 1208 | list_for_each_entry(temp_oh, &omap_hwmod_list, node) { |
| 1185 | ret = (*fn)(temp_oh); | 1209 | ret = (*fn)(temp_oh, data); |
| 1186 | if (ret) | 1210 | if (ret) |
| 1187 | break; | 1211 | break; |
| 1188 | } | 1212 | } |
| @@ -1229,24 +1253,28 @@ int omap_hwmod_init(struct omap_hwmod **ohs) | |||
| 1229 | 1253 | ||
| 1230 | /** | 1254 | /** |
| 1231 | * omap_hwmod_late_init - do some post-clock framework initialization | 1255 | * omap_hwmod_late_init - do some post-clock framework initialization |
| 1256 | * @skip_setup_idle: if 1, do not idle hwmods in _setup() | ||
| 1232 | * | 1257 | * |
| 1233 | * Must be called after omap2_clk_init(). Resolves the struct clk names | 1258 | * Must be called after omap2_clk_init(). Resolves the struct clk names |
| 1234 | * to struct clk pointers for each registered omap_hwmod. Also calls | 1259 | * to struct clk pointers for each registered omap_hwmod. Also calls |
| 1235 | * _setup() on each hwmod. Returns 0. | 1260 | * _setup() on each hwmod. Returns 0. |
| 1236 | */ | 1261 | */ |
| 1237 | int omap_hwmod_late_init(void) | 1262 | int omap_hwmod_late_init(u8 skip_setup_idle) |
| 1238 | { | 1263 | { |
| 1239 | int r; | 1264 | int r; |
| 1240 | 1265 | ||
| 1241 | /* XXX check return value */ | 1266 | /* XXX check return value */ |
| 1242 | r = omap_hwmod_for_each(_init_clocks); | 1267 | r = omap_hwmod_for_each(_init_clocks, NULL); |
| 1243 | WARN(r, "omap_hwmod: omap_hwmod_late_init(): _init_clocks failed\n"); | 1268 | WARN(r, "omap_hwmod: omap_hwmod_late_init(): _init_clocks failed\n"); |
| 1244 | 1269 | ||
| 1245 | mpu_oh = omap_hwmod_lookup(MPU_INITIATOR_NAME); | 1270 | mpu_oh = omap_hwmod_lookup(MPU_INITIATOR_NAME); |
| 1246 | WARN(!mpu_oh, "omap_hwmod: could not find MPU initiator hwmod %s\n", | 1271 | WARN(!mpu_oh, "omap_hwmod: could not find MPU initiator hwmod %s\n", |
| 1247 | MPU_INITIATOR_NAME); | 1272 | MPU_INITIATOR_NAME); |
| 1248 | 1273 | ||
| 1249 | omap_hwmod_for_each(_setup); | 1274 | if (skip_setup_idle) |
| 1275 | pr_debug("omap_hwmod: will leave hwmods enabled during setup\n"); | ||
| 1276 | |||
| 1277 | omap_hwmod_for_each(_setup, &skip_setup_idle); | ||
| 1250 | 1278 | ||
| 1251 | return 0; | 1279 | return 0; |
| 1252 | } | 1280 | } |
| @@ -1270,7 +1298,7 @@ int omap_hwmod_unregister(struct omap_hwmod *oh) | |||
| 1270 | pr_debug("omap_hwmod: %s: unregistering\n", oh->name); | 1298 | pr_debug("omap_hwmod: %s: unregistering\n", oh->name); |
| 1271 | 1299 | ||
| 1272 | mutex_lock(&omap_hwmod_mutex); | 1300 | mutex_lock(&omap_hwmod_mutex); |
| 1273 | iounmap(oh->_rt_va); | 1301 | iounmap(oh->_mpu_rt_va); |
| 1274 | list_del(&oh->node); | 1302 | list_del(&oh->node); |
| 1275 | mutex_unlock(&omap_hwmod_mutex); | 1303 | mutex_unlock(&omap_hwmod_mutex); |
| 1276 | 1304 | ||
| @@ -1292,12 +1320,13 @@ int omap_hwmod_enable(struct omap_hwmod *oh) | |||
| 1292 | return -EINVAL; | 1320 | return -EINVAL; |
| 1293 | 1321 | ||
| 1294 | mutex_lock(&omap_hwmod_mutex); | 1322 | mutex_lock(&omap_hwmod_mutex); |
| 1295 | r = _enable(oh); | 1323 | r = _omap_hwmod_enable(oh); |
| 1296 | mutex_unlock(&omap_hwmod_mutex); | 1324 | mutex_unlock(&omap_hwmod_mutex); |
| 1297 | 1325 | ||
| 1298 | return r; | 1326 | return r; |
| 1299 | } | 1327 | } |
| 1300 | 1328 | ||
| 1329 | |||
| 1301 | /** | 1330 | /** |
| 1302 | * omap_hwmod_idle - idle an omap_hwmod | 1331 | * omap_hwmod_idle - idle an omap_hwmod |
| 1303 | * @oh: struct omap_hwmod * | 1332 | * @oh: struct omap_hwmod * |
| @@ -1311,7 +1340,7 @@ int omap_hwmod_idle(struct omap_hwmod *oh) | |||
| 1311 | return -EINVAL; | 1340 | return -EINVAL; |
| 1312 | 1341 | ||
| 1313 | mutex_lock(&omap_hwmod_mutex); | 1342 | mutex_lock(&omap_hwmod_mutex); |
| 1314 | _idle(oh); | 1343 | _omap_hwmod_idle(oh); |
| 1315 | mutex_unlock(&omap_hwmod_mutex); | 1344 | mutex_unlock(&omap_hwmod_mutex); |
| 1316 | 1345 | ||
| 1317 | return 0; | 1346 | return 0; |
| @@ -1413,7 +1442,7 @@ int omap_hwmod_reset(struct omap_hwmod *oh) | |||
| 1413 | mutex_lock(&omap_hwmod_mutex); | 1442 | mutex_lock(&omap_hwmod_mutex); |
| 1414 | r = _reset(oh); | 1443 | r = _reset(oh); |
| 1415 | if (!r) | 1444 | if (!r) |
| 1416 | r = _enable(oh); | 1445 | r = _omap_hwmod_enable(oh); |
| 1417 | mutex_unlock(&omap_hwmod_mutex); | 1446 | mutex_unlock(&omap_hwmod_mutex); |
| 1418 | 1447 | ||
| 1419 | return r; | 1448 | return r; |
| @@ -1530,6 +1559,29 @@ struct powerdomain *omap_hwmod_get_pwrdm(struct omap_hwmod *oh) | |||
| 1530 | } | 1559 | } |
| 1531 | 1560 | ||
| 1532 | /** | 1561 | /** |
| 1562 | * omap_hwmod_get_mpu_rt_va - return the module's base address (for the MPU) | ||
| 1563 | * @oh: struct omap_hwmod * | ||
| 1564 | * | ||
| 1565 | * Returns the virtual address corresponding to the beginning of the | ||
| 1566 | * module's register target, in the address range that is intended to | ||
| 1567 | * be used by the MPU. Returns the virtual address upon success or NULL | ||
| 1568 | * upon error. | ||
| 1569 | */ | ||
| 1570 | void __iomem *omap_hwmod_get_mpu_rt_va(struct omap_hwmod *oh) | ||
| 1571 | { | ||
| 1572 | if (!oh) | ||
| 1573 | return NULL; | ||
| 1574 | |||
| 1575 | if (oh->_int_flags & _HWMOD_NO_MPU_PORT) | ||
| 1576 | return NULL; | ||
| 1577 | |||
| 1578 | if (oh->_state == _HWMOD_STATE_UNKNOWN) | ||
| 1579 | return NULL; | ||
| 1580 | |||
| 1581 | return oh->_mpu_rt_va; | ||
| 1582 | } | ||
| 1583 | |||
| 1584 | /** | ||
| 1533 | * omap_hwmod_add_initiator_dep - add sleepdep from @init_oh to @oh | 1585 | * omap_hwmod_add_initiator_dep - add sleepdep from @init_oh to @oh |
| 1534 | * @oh: struct omap_hwmod * | 1586 | * @oh: struct omap_hwmod * |
| 1535 | * @init_oh: struct omap_hwmod * (initiator) | 1587 | * @init_oh: struct omap_hwmod * (initiator) |
diff --git a/arch/arm/mach-omap2/omap_hwmod_2420_data.c b/arch/arm/mach-omap2/omap_hwmod_2420_data.c index e5530c51f77d..3cc768e8bc04 100644 --- a/arch/arm/mach-omap2/omap_hwmod_2420_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_2420_data.c | |||
| @@ -30,42 +30,44 @@ | |||
| 30 | */ | 30 | */ |
| 31 | 31 | ||
| 32 | static struct omap_hwmod omap2420_mpu_hwmod; | 32 | static struct omap_hwmod omap2420_mpu_hwmod; |
| 33 | static struct omap_hwmod omap2420_l3_hwmod; | 33 | static struct omap_hwmod omap2420_iva_hwmod; |
| 34 | static struct omap_hwmod omap2420_l3_main_hwmod; | ||
| 34 | static struct omap_hwmod omap2420_l4_core_hwmod; | 35 | static struct omap_hwmod omap2420_l4_core_hwmod; |
| 35 | 36 | ||
| 36 | /* L3 -> L4_CORE interface */ | 37 | /* L3 -> L4_CORE interface */ |
| 37 | static struct omap_hwmod_ocp_if omap2420_l3__l4_core = { | 38 | static struct omap_hwmod_ocp_if omap2420_l3_main__l4_core = { |
| 38 | .master = &omap2420_l3_hwmod, | 39 | .master = &omap2420_l3_main_hwmod, |
| 39 | .slave = &omap2420_l4_core_hwmod, | 40 | .slave = &omap2420_l4_core_hwmod, |
| 40 | .user = OCP_USER_MPU | OCP_USER_SDMA, | 41 | .user = OCP_USER_MPU | OCP_USER_SDMA, |
| 41 | }; | 42 | }; |
| 42 | 43 | ||
| 43 | /* MPU -> L3 interface */ | 44 | /* MPU -> L3 interface */ |
| 44 | static struct omap_hwmod_ocp_if omap2420_mpu__l3 = { | 45 | static struct omap_hwmod_ocp_if omap2420_mpu__l3_main = { |
| 45 | .master = &omap2420_mpu_hwmod, | 46 | .master = &omap2420_mpu_hwmod, |
| 46 | .slave = &omap2420_l3_hwmod, | 47 | .slave = &omap2420_l3_main_hwmod, |
| 47 | .user = OCP_USER_MPU, | 48 | .user = OCP_USER_MPU, |
| 48 | }; | 49 | }; |
| 49 | 50 | ||
| 50 | /* Slave interfaces on the L3 interconnect */ | 51 | /* Slave interfaces on the L3 interconnect */ |
| 51 | static struct omap_hwmod_ocp_if *omap2420_l3_slaves[] = { | 52 | static struct omap_hwmod_ocp_if *omap2420_l3_main_slaves[] = { |
| 52 | &omap2420_mpu__l3, | 53 | &omap2420_mpu__l3_main, |
| 53 | }; | 54 | }; |
| 54 | 55 | ||
| 55 | /* Master interfaces on the L3 interconnect */ | 56 | /* Master interfaces on the L3 interconnect */ |
| 56 | static struct omap_hwmod_ocp_if *omap2420_l3_masters[] = { | 57 | static struct omap_hwmod_ocp_if *omap2420_l3_main_masters[] = { |
| 57 | &omap2420_l3__l4_core, | 58 | &omap2420_l3_main__l4_core, |
| 58 | }; | 59 | }; |
| 59 | 60 | ||
| 60 | /* L3 */ | 61 | /* L3 */ |
| 61 | static struct omap_hwmod omap2420_l3_hwmod = { | 62 | static struct omap_hwmod omap2420_l3_main_hwmod = { |
| 62 | .name = "l3_hwmod", | 63 | .name = "l3_main", |
| 63 | .class = &l3_hwmod_class, | 64 | .class = &l3_hwmod_class, |
| 64 | .masters = omap2420_l3_masters, | 65 | .masters = omap2420_l3_main_masters, |
| 65 | .masters_cnt = ARRAY_SIZE(omap2420_l3_masters), | 66 | .masters_cnt = ARRAY_SIZE(omap2420_l3_main_masters), |
| 66 | .slaves = omap2420_l3_slaves, | 67 | .slaves = omap2420_l3_main_slaves, |
| 67 | .slaves_cnt = ARRAY_SIZE(omap2420_l3_slaves), | 68 | .slaves_cnt = ARRAY_SIZE(omap2420_l3_main_slaves), |
| 68 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2420) | 69 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2420), |
| 70 | .flags = HWMOD_NO_IDLEST, | ||
| 69 | }; | 71 | }; |
| 70 | 72 | ||
| 71 | static struct omap_hwmod omap2420_l4_wkup_hwmod; | 73 | static struct omap_hwmod omap2420_l4_wkup_hwmod; |
| @@ -79,7 +81,7 @@ static struct omap_hwmod_ocp_if omap2420_l4_core__l4_wkup = { | |||
| 79 | 81 | ||
| 80 | /* Slave interfaces on the L4_CORE interconnect */ | 82 | /* Slave interfaces on the L4_CORE interconnect */ |
| 81 | static struct omap_hwmod_ocp_if *omap2420_l4_core_slaves[] = { | 83 | static struct omap_hwmod_ocp_if *omap2420_l4_core_slaves[] = { |
| 82 | &omap2420_l3__l4_core, | 84 | &omap2420_l3_main__l4_core, |
| 83 | }; | 85 | }; |
| 84 | 86 | ||
| 85 | /* Master interfaces on the L4_CORE interconnect */ | 87 | /* Master interfaces on the L4_CORE interconnect */ |
| @@ -89,13 +91,14 @@ static struct omap_hwmod_ocp_if *omap2420_l4_core_masters[] = { | |||
| 89 | 91 | ||
| 90 | /* L4 CORE */ | 92 | /* L4 CORE */ |
| 91 | static struct omap_hwmod omap2420_l4_core_hwmod = { | 93 | static struct omap_hwmod omap2420_l4_core_hwmod = { |
| 92 | .name = "l4_core_hwmod", | 94 | .name = "l4_core", |
| 93 | .class = &l4_hwmod_class, | 95 | .class = &l4_hwmod_class, |
| 94 | .masters = omap2420_l4_core_masters, | 96 | .masters = omap2420_l4_core_masters, |
| 95 | .masters_cnt = ARRAY_SIZE(omap2420_l4_core_masters), | 97 | .masters_cnt = ARRAY_SIZE(omap2420_l4_core_masters), |
| 96 | .slaves = omap2420_l4_core_slaves, | 98 | .slaves = omap2420_l4_core_slaves, |
| 97 | .slaves_cnt = ARRAY_SIZE(omap2420_l4_core_slaves), | 99 | .slaves_cnt = ARRAY_SIZE(omap2420_l4_core_slaves), |
| 98 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2420) | 100 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2420), |
| 101 | .flags = HWMOD_NO_IDLEST, | ||
| 99 | }; | 102 | }; |
| 100 | 103 | ||
| 101 | /* Slave interfaces on the L4_WKUP interconnect */ | 104 | /* Slave interfaces on the L4_WKUP interconnect */ |
| @@ -109,18 +112,19 @@ static struct omap_hwmod_ocp_if *omap2420_l4_wkup_masters[] = { | |||
| 109 | 112 | ||
| 110 | /* L4 WKUP */ | 113 | /* L4 WKUP */ |
| 111 | static struct omap_hwmod omap2420_l4_wkup_hwmod = { | 114 | static struct omap_hwmod omap2420_l4_wkup_hwmod = { |
| 112 | .name = "l4_wkup_hwmod", | 115 | .name = "l4_wkup", |
| 113 | .class = &l4_hwmod_class, | 116 | .class = &l4_hwmod_class, |
| 114 | .masters = omap2420_l4_wkup_masters, | 117 | .masters = omap2420_l4_wkup_masters, |
| 115 | .masters_cnt = ARRAY_SIZE(omap2420_l4_wkup_masters), | 118 | .masters_cnt = ARRAY_SIZE(omap2420_l4_wkup_masters), |
| 116 | .slaves = omap2420_l4_wkup_slaves, | 119 | .slaves = omap2420_l4_wkup_slaves, |
| 117 | .slaves_cnt = ARRAY_SIZE(omap2420_l4_wkup_slaves), | 120 | .slaves_cnt = ARRAY_SIZE(omap2420_l4_wkup_slaves), |
| 118 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2420) | 121 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2420), |
| 122 | .flags = HWMOD_NO_IDLEST, | ||
| 119 | }; | 123 | }; |
| 120 | 124 | ||
| 121 | /* Master interfaces on the MPU device */ | 125 | /* Master interfaces on the MPU device */ |
| 122 | static struct omap_hwmod_ocp_if *omap2420_mpu_masters[] = { | 126 | static struct omap_hwmod_ocp_if *omap2420_mpu_masters[] = { |
| 123 | &omap2420_mpu__l3, | 127 | &omap2420_mpu__l3_main, |
| 124 | }; | 128 | }; |
| 125 | 129 | ||
| 126 | /* MPU */ | 130 | /* MPU */ |
| @@ -133,11 +137,40 @@ static struct omap_hwmod omap2420_mpu_hwmod = { | |||
| 133 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2420), | 137 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2420), |
| 134 | }; | 138 | }; |
| 135 | 139 | ||
| 140 | /* | ||
| 141 | * IVA1 interface data | ||
| 142 | */ | ||
| 143 | |||
| 144 | /* IVA <- L3 interface */ | ||
| 145 | static struct omap_hwmod_ocp_if omap2420_l3__iva = { | ||
| 146 | .master = &omap2420_l3_main_hwmod, | ||
| 147 | .slave = &omap2420_iva_hwmod, | ||
| 148 | .clk = "iva1_ifck", | ||
| 149 | .user = OCP_USER_MPU | OCP_USER_SDMA, | ||
| 150 | }; | ||
| 151 | |||
| 152 | static struct omap_hwmod_ocp_if *omap2420_iva_masters[] = { | ||
| 153 | &omap2420_l3__iva, | ||
| 154 | }; | ||
| 155 | |||
| 156 | /* | ||
| 157 | * IVA2 (IVA2) | ||
| 158 | */ | ||
| 159 | |||
| 160 | static struct omap_hwmod omap2420_iva_hwmod = { | ||
| 161 | .name = "iva", | ||
| 162 | .class = &iva_hwmod_class, | ||
| 163 | .masters = omap2420_iva_masters, | ||
| 164 | .masters_cnt = ARRAY_SIZE(omap2420_iva_masters), | ||
| 165 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2420) | ||
| 166 | }; | ||
| 167 | |||
| 136 | static __initdata struct omap_hwmod *omap2420_hwmods[] = { | 168 | static __initdata struct omap_hwmod *omap2420_hwmods[] = { |
| 137 | &omap2420_l3_hwmod, | 169 | &omap2420_l3_main_hwmod, |
| 138 | &omap2420_l4_core_hwmod, | 170 | &omap2420_l4_core_hwmod, |
| 139 | &omap2420_l4_wkup_hwmod, | 171 | &omap2420_l4_wkup_hwmod, |
| 140 | &omap2420_mpu_hwmod, | 172 | &omap2420_mpu_hwmod, |
| 173 | &omap2420_iva_hwmod, | ||
| 141 | NULL, | 174 | NULL, |
| 142 | }; | 175 | }; |
| 143 | 176 | ||
diff --git a/arch/arm/mach-omap2/omap_hwmod_2430_data.c b/arch/arm/mach-omap2/omap_hwmod_2430_data.c index 0852d954da40..4526628ed287 100644 --- a/arch/arm/mach-omap2/omap_hwmod_2430_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_2430_data.c | |||
| @@ -30,47 +30,47 @@ | |||
| 30 | */ | 30 | */ |
| 31 | 31 | ||
| 32 | static struct omap_hwmod omap2430_mpu_hwmod; | 32 | static struct omap_hwmod omap2430_mpu_hwmod; |
| 33 | static struct omap_hwmod omap2430_l3_hwmod; | 33 | static struct omap_hwmod omap2430_iva_hwmod; |
| 34 | static struct omap_hwmod omap2430_l3_main_hwmod; | ||
| 34 | static struct omap_hwmod omap2430_l4_core_hwmod; | 35 | static struct omap_hwmod omap2430_l4_core_hwmod; |
| 35 | 36 | ||
| 36 | /* L3 -> L4_CORE interface */ | 37 | /* L3 -> L4_CORE interface */ |
| 37 | static struct omap_hwmod_ocp_if omap2430_l3__l4_core = { | 38 | static struct omap_hwmod_ocp_if omap2430_l3_main__l4_core = { |
| 38 | .master = &omap2430_l3_hwmod, | 39 | .master = &omap2430_l3_main_hwmod, |
| 39 | .slave = &omap2430_l4_core_hwmod, | 40 | .slave = &omap2430_l4_core_hwmod, |
| 40 | .user = OCP_USER_MPU | OCP_USER_SDMA, | 41 | .user = OCP_USER_MPU | OCP_USER_SDMA, |
| 41 | }; | 42 | }; |
| 42 | 43 | ||
| 43 | /* MPU -> L3 interface */ | 44 | /* MPU -> L3 interface */ |
| 44 | static struct omap_hwmod_ocp_if omap2430_mpu__l3 = { | 45 | static struct omap_hwmod_ocp_if omap2430_mpu__l3_main = { |
| 45 | .master = &omap2430_mpu_hwmod, | 46 | .master = &omap2430_mpu_hwmod, |
| 46 | .slave = &omap2430_l3_hwmod, | 47 | .slave = &omap2430_l3_main_hwmod, |
| 47 | .user = OCP_USER_MPU, | 48 | .user = OCP_USER_MPU, |
| 48 | }; | 49 | }; |
| 49 | 50 | ||
| 50 | /* Slave interfaces on the L3 interconnect */ | 51 | /* Slave interfaces on the L3 interconnect */ |
| 51 | static struct omap_hwmod_ocp_if *omap2430_l3_slaves[] = { | 52 | static struct omap_hwmod_ocp_if *omap2430_l3_main_slaves[] = { |
| 52 | &omap2430_mpu__l3, | 53 | &omap2430_mpu__l3_main, |
| 53 | }; | 54 | }; |
| 54 | 55 | ||
| 55 | /* Master interfaces on the L3 interconnect */ | 56 | /* Master interfaces on the L3 interconnect */ |
| 56 | static struct omap_hwmod_ocp_if *omap2430_l3_masters[] = { | 57 | static struct omap_hwmod_ocp_if *omap2430_l3_main_masters[] = { |
| 57 | &omap2430_l3__l4_core, | 58 | &omap2430_l3_main__l4_core, |
| 58 | }; | 59 | }; |
| 59 | 60 | ||
| 60 | /* L3 */ | 61 | /* L3 */ |
| 61 | static struct omap_hwmod omap2430_l3_hwmod = { | 62 | static struct omap_hwmod omap2430_l3_main_hwmod = { |
| 62 | .name = "l3_hwmod", | 63 | .name = "l3_main", |
| 63 | .class = &l3_hwmod_class, | 64 | .class = &l3_hwmod_class, |
| 64 | .masters = omap2430_l3_masters, | 65 | .masters = omap2430_l3_main_masters, |
| 65 | .masters_cnt = ARRAY_SIZE(omap2430_l3_masters), | 66 | .masters_cnt = ARRAY_SIZE(omap2430_l3_main_masters), |
| 66 | .slaves = omap2430_l3_slaves, | 67 | .slaves = omap2430_l3_main_slaves, |
| 67 | .slaves_cnt = ARRAY_SIZE(omap2430_l3_slaves), | 68 | .slaves_cnt = ARRAY_SIZE(omap2430_l3_main_slaves), |
| 68 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430) | 69 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430), |
| 70 | .flags = HWMOD_NO_IDLEST, | ||
| 69 | }; | 71 | }; |
| 70 | 72 | ||
| 71 | static struct omap_hwmod omap2430_l4_wkup_hwmod; | 73 | static struct omap_hwmod omap2430_l4_wkup_hwmod; |
| 72 | static struct omap_hwmod omap2430_mmc1_hwmod; | ||
| 73 | static struct omap_hwmod omap2430_mmc2_hwmod; | ||
| 74 | 74 | ||
| 75 | /* L4_CORE -> L4_WKUP interface */ | 75 | /* L4_CORE -> L4_WKUP interface */ |
| 76 | static struct omap_hwmod_ocp_if omap2430_l4_core__l4_wkup = { | 76 | static struct omap_hwmod_ocp_if omap2430_l4_core__l4_wkup = { |
| @@ -81,7 +81,7 @@ static struct omap_hwmod_ocp_if omap2430_l4_core__l4_wkup = { | |||
| 81 | 81 | ||
| 82 | /* Slave interfaces on the L4_CORE interconnect */ | 82 | /* Slave interfaces on the L4_CORE interconnect */ |
| 83 | static struct omap_hwmod_ocp_if *omap2430_l4_core_slaves[] = { | 83 | static struct omap_hwmod_ocp_if *omap2430_l4_core_slaves[] = { |
| 84 | &omap2430_l3__l4_core, | 84 | &omap2430_l3_main__l4_core, |
| 85 | }; | 85 | }; |
| 86 | 86 | ||
| 87 | /* Master interfaces on the L4_CORE interconnect */ | 87 | /* Master interfaces on the L4_CORE interconnect */ |
| @@ -91,13 +91,14 @@ static struct omap_hwmod_ocp_if *omap2430_l4_core_masters[] = { | |||
| 91 | 91 | ||
| 92 | /* L4 CORE */ | 92 | /* L4 CORE */ |
| 93 | static struct omap_hwmod omap2430_l4_core_hwmod = { | 93 | static struct omap_hwmod omap2430_l4_core_hwmod = { |
| 94 | .name = "l4_core_hwmod", | 94 | .name = "l4_core", |
| 95 | .class = &l4_hwmod_class, | 95 | .class = &l4_hwmod_class, |
| 96 | .masters = omap2430_l4_core_masters, | 96 | .masters = omap2430_l4_core_masters, |
| 97 | .masters_cnt = ARRAY_SIZE(omap2430_l4_core_masters), | 97 | .masters_cnt = ARRAY_SIZE(omap2430_l4_core_masters), |
| 98 | .slaves = omap2430_l4_core_slaves, | 98 | .slaves = omap2430_l4_core_slaves, |
| 99 | .slaves_cnt = ARRAY_SIZE(omap2430_l4_core_slaves), | 99 | .slaves_cnt = ARRAY_SIZE(omap2430_l4_core_slaves), |
| 100 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430) | 100 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430), |
| 101 | .flags = HWMOD_NO_IDLEST, | ||
| 101 | }; | 102 | }; |
| 102 | 103 | ||
| 103 | /* Slave interfaces on the L4_WKUP interconnect */ | 104 | /* Slave interfaces on the L4_WKUP interconnect */ |
| @@ -111,18 +112,19 @@ static struct omap_hwmod_ocp_if *omap2430_l4_wkup_masters[] = { | |||
| 111 | 112 | ||
| 112 | /* L4 WKUP */ | 113 | /* L4 WKUP */ |
| 113 | static struct omap_hwmod omap2430_l4_wkup_hwmod = { | 114 | static struct omap_hwmod omap2430_l4_wkup_hwmod = { |
| 114 | .name = "l4_wkup_hwmod", | 115 | .name = "l4_wkup", |
| 115 | .class = &l4_hwmod_class, | 116 | .class = &l4_hwmod_class, |
| 116 | .masters = omap2430_l4_wkup_masters, | 117 | .masters = omap2430_l4_wkup_masters, |
| 117 | .masters_cnt = ARRAY_SIZE(omap2430_l4_wkup_masters), | 118 | .masters_cnt = ARRAY_SIZE(omap2430_l4_wkup_masters), |
| 118 | .slaves = omap2430_l4_wkup_slaves, | 119 | .slaves = omap2430_l4_wkup_slaves, |
| 119 | .slaves_cnt = ARRAY_SIZE(omap2430_l4_wkup_slaves), | 120 | .slaves_cnt = ARRAY_SIZE(omap2430_l4_wkup_slaves), |
| 120 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430) | 121 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430), |
| 122 | .flags = HWMOD_NO_IDLEST, | ||
| 121 | }; | 123 | }; |
| 122 | 124 | ||
| 123 | /* Master interfaces on the MPU device */ | 125 | /* Master interfaces on the MPU device */ |
| 124 | static struct omap_hwmod_ocp_if *omap2430_mpu_masters[] = { | 126 | static struct omap_hwmod_ocp_if *omap2430_mpu_masters[] = { |
| 125 | &omap2430_mpu__l3, | 127 | &omap2430_mpu__l3_main, |
| 126 | }; | 128 | }; |
| 127 | 129 | ||
| 128 | /* MPU */ | 130 | /* MPU */ |
| @@ -135,11 +137,40 @@ static struct omap_hwmod omap2430_mpu_hwmod = { | |||
| 135 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430), | 137 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430), |
| 136 | }; | 138 | }; |
| 137 | 139 | ||
| 140 | /* | ||
| 141 | * IVA2_1 interface data | ||
| 142 | */ | ||
| 143 | |||
| 144 | /* IVA2 <- L3 interface */ | ||
| 145 | static struct omap_hwmod_ocp_if omap2430_l3__iva = { | ||
| 146 | .master = &omap2430_l3_main_hwmod, | ||
| 147 | .slave = &omap2430_iva_hwmod, | ||
| 148 | .clk = "dsp_fck", | ||
| 149 | .user = OCP_USER_MPU | OCP_USER_SDMA, | ||
| 150 | }; | ||
| 151 | |||
| 152 | static struct omap_hwmod_ocp_if *omap2430_iva_masters[] = { | ||
| 153 | &omap2430_l3__iva, | ||
| 154 | }; | ||
| 155 | |||
| 156 | /* | ||
| 157 | * IVA2 (IVA2) | ||
| 158 | */ | ||
| 159 | |||
| 160 | static struct omap_hwmod omap2430_iva_hwmod = { | ||
| 161 | .name = "iva", | ||
| 162 | .class = &iva_hwmod_class, | ||
| 163 | .masters = omap2430_iva_masters, | ||
| 164 | .masters_cnt = ARRAY_SIZE(omap2430_iva_masters), | ||
| 165 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430) | ||
| 166 | }; | ||
| 167 | |||
| 138 | static __initdata struct omap_hwmod *omap2430_hwmods[] = { | 168 | static __initdata struct omap_hwmod *omap2430_hwmods[] = { |
| 139 | &omap2430_l3_hwmod, | 169 | &omap2430_l3_main_hwmod, |
| 140 | &omap2430_l4_core_hwmod, | 170 | &omap2430_l4_core_hwmod, |
| 141 | &omap2430_l4_wkup_hwmod, | 171 | &omap2430_l4_wkup_hwmod, |
| 142 | &omap2430_mpu_hwmod, | 172 | &omap2430_mpu_hwmod, |
| 173 | &omap2430_iva_hwmod, | ||
| 143 | NULL, | 174 | NULL, |
| 144 | }; | 175 | }; |
| 145 | 176 | ||
diff --git a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c index 39b0c0eaa37d..5d8eb58ba5e3 100644 --- a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c | |||
| @@ -32,51 +32,53 @@ | |||
| 32 | */ | 32 | */ |
| 33 | 33 | ||
| 34 | static struct omap_hwmod omap3xxx_mpu_hwmod; | 34 | static struct omap_hwmod omap3xxx_mpu_hwmod; |
| 35 | static struct omap_hwmod omap3xxx_l3_hwmod; | 35 | static struct omap_hwmod omap3xxx_iva_hwmod; |
| 36 | static struct omap_hwmod omap3xxx_l3_main_hwmod; | ||
| 36 | static struct omap_hwmod omap3xxx_l4_core_hwmod; | 37 | static struct omap_hwmod omap3xxx_l4_core_hwmod; |
| 37 | static struct omap_hwmod omap3xxx_l4_per_hwmod; | 38 | static struct omap_hwmod omap3xxx_l4_per_hwmod; |
| 38 | 39 | ||
| 39 | /* L3 -> L4_CORE interface */ | 40 | /* L3 -> L4_CORE interface */ |
| 40 | static struct omap_hwmod_ocp_if omap3xxx_l3__l4_core = { | 41 | static struct omap_hwmod_ocp_if omap3xxx_l3_main__l4_core = { |
| 41 | .master = &omap3xxx_l3_hwmod, | 42 | .master = &omap3xxx_l3_main_hwmod, |
| 42 | .slave = &omap3xxx_l4_core_hwmod, | 43 | .slave = &omap3xxx_l4_core_hwmod, |
| 43 | .user = OCP_USER_MPU | OCP_USER_SDMA, | 44 | .user = OCP_USER_MPU | OCP_USER_SDMA, |
| 44 | }; | 45 | }; |
| 45 | 46 | ||
| 46 | /* L3 -> L4_PER interface */ | 47 | /* L3 -> L4_PER interface */ |
| 47 | static struct omap_hwmod_ocp_if omap3xxx_l3__l4_per = { | 48 | static struct omap_hwmod_ocp_if omap3xxx_l3_main__l4_per = { |
| 48 | .master = &omap3xxx_l3_hwmod, | 49 | .master = &omap3xxx_l3_main_hwmod, |
| 49 | .slave = &omap3xxx_l4_per_hwmod, | 50 | .slave = &omap3xxx_l4_per_hwmod, |
| 50 | .user = OCP_USER_MPU | OCP_USER_SDMA, | 51 | .user = OCP_USER_MPU | OCP_USER_SDMA, |
| 51 | }; | 52 | }; |
| 52 | 53 | ||
| 53 | /* MPU -> L3 interface */ | 54 | /* MPU -> L3 interface */ |
| 54 | static struct omap_hwmod_ocp_if omap3xxx_mpu__l3 = { | 55 | static struct omap_hwmod_ocp_if omap3xxx_mpu__l3_main = { |
| 55 | .master = &omap3xxx_mpu_hwmod, | 56 | .master = &omap3xxx_mpu_hwmod, |
| 56 | .slave = &omap3xxx_l3_hwmod, | 57 | .slave = &omap3xxx_l3_main_hwmod, |
| 57 | .user = OCP_USER_MPU, | 58 | .user = OCP_USER_MPU, |
| 58 | }; | 59 | }; |
| 59 | 60 | ||
| 60 | /* Slave interfaces on the L3 interconnect */ | 61 | /* Slave interfaces on the L3 interconnect */ |
| 61 | static struct omap_hwmod_ocp_if *omap3xxx_l3_slaves[] = { | 62 | static struct omap_hwmod_ocp_if *omap3xxx_l3_main_slaves[] = { |
| 62 | &omap3xxx_mpu__l3, | 63 | &omap3xxx_mpu__l3_main, |
| 63 | }; | 64 | }; |
| 64 | 65 | ||
| 65 | /* Master interfaces on the L3 interconnect */ | 66 | /* Master interfaces on the L3 interconnect */ |
| 66 | static struct omap_hwmod_ocp_if *omap3xxx_l3_masters[] = { | 67 | static struct omap_hwmod_ocp_if *omap3xxx_l3_main_masters[] = { |
| 67 | &omap3xxx_l3__l4_core, | 68 | &omap3xxx_l3_main__l4_core, |
| 68 | &omap3xxx_l3__l4_per, | 69 | &omap3xxx_l3_main__l4_per, |
| 69 | }; | 70 | }; |
| 70 | 71 | ||
| 71 | /* L3 */ | 72 | /* L3 */ |
| 72 | static struct omap_hwmod omap3xxx_l3_hwmod = { | 73 | static struct omap_hwmod omap3xxx_l3_main_hwmod = { |
| 73 | .name = "l3_hwmod", | 74 | .name = "l3_main", |
| 74 | .class = &l3_hwmod_class, | 75 | .class = &l3_hwmod_class, |
| 75 | .masters = omap3xxx_l3_masters, | 76 | .masters = omap3xxx_l3_main_masters, |
| 76 | .masters_cnt = ARRAY_SIZE(omap3xxx_l3_masters), | 77 | .masters_cnt = ARRAY_SIZE(omap3xxx_l3_main_masters), |
| 77 | .slaves = omap3xxx_l3_slaves, | 78 | .slaves = omap3xxx_l3_main_slaves, |
| 78 | .slaves_cnt = ARRAY_SIZE(omap3xxx_l3_slaves), | 79 | .slaves_cnt = ARRAY_SIZE(omap3xxx_l3_main_slaves), |
| 79 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430) | 80 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430), |
| 81 | .flags = HWMOD_NO_IDLEST, | ||
| 80 | }; | 82 | }; |
| 81 | 83 | ||
| 82 | static struct omap_hwmod omap3xxx_l4_wkup_hwmod; | 84 | static struct omap_hwmod omap3xxx_l4_wkup_hwmod; |
| @@ -90,7 +92,7 @@ static struct omap_hwmod_ocp_if omap3xxx_l4_core__l4_wkup = { | |||
| 90 | 92 | ||
| 91 | /* Slave interfaces on the L4_CORE interconnect */ | 93 | /* Slave interfaces on the L4_CORE interconnect */ |
| 92 | static struct omap_hwmod_ocp_if *omap3xxx_l4_core_slaves[] = { | 94 | static struct omap_hwmod_ocp_if *omap3xxx_l4_core_slaves[] = { |
| 93 | &omap3xxx_l3__l4_core, | 95 | &omap3xxx_l3_main__l4_core, |
| 94 | }; | 96 | }; |
| 95 | 97 | ||
| 96 | /* Master interfaces on the L4_CORE interconnect */ | 98 | /* Master interfaces on the L4_CORE interconnect */ |
| @@ -100,18 +102,19 @@ static struct omap_hwmod_ocp_if *omap3xxx_l4_core_masters[] = { | |||
| 100 | 102 | ||
| 101 | /* L4 CORE */ | 103 | /* L4 CORE */ |
| 102 | static struct omap_hwmod omap3xxx_l4_core_hwmod = { | 104 | static struct omap_hwmod omap3xxx_l4_core_hwmod = { |
| 103 | .name = "l4_core_hwmod", | 105 | .name = "l4_core", |
| 104 | .class = &l4_hwmod_class, | 106 | .class = &l4_hwmod_class, |
| 105 | .masters = omap3xxx_l4_core_masters, | 107 | .masters = omap3xxx_l4_core_masters, |
| 106 | .masters_cnt = ARRAY_SIZE(omap3xxx_l4_core_masters), | 108 | .masters_cnt = ARRAY_SIZE(omap3xxx_l4_core_masters), |
| 107 | .slaves = omap3xxx_l4_core_slaves, | 109 | .slaves = omap3xxx_l4_core_slaves, |
| 108 | .slaves_cnt = ARRAY_SIZE(omap3xxx_l4_core_slaves), | 110 | .slaves_cnt = ARRAY_SIZE(omap3xxx_l4_core_slaves), |
| 109 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430) | 111 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430), |
| 112 | .flags = HWMOD_NO_IDLEST, | ||
| 110 | }; | 113 | }; |
| 111 | 114 | ||
| 112 | /* Slave interfaces on the L4_PER interconnect */ | 115 | /* Slave interfaces on the L4_PER interconnect */ |
| 113 | static struct omap_hwmod_ocp_if *omap3xxx_l4_per_slaves[] = { | 116 | static struct omap_hwmod_ocp_if *omap3xxx_l4_per_slaves[] = { |
| 114 | &omap3xxx_l3__l4_per, | 117 | &omap3xxx_l3_main__l4_per, |
| 115 | }; | 118 | }; |
| 116 | 119 | ||
| 117 | /* Master interfaces on the L4_PER interconnect */ | 120 | /* Master interfaces on the L4_PER interconnect */ |
| @@ -120,13 +123,14 @@ static struct omap_hwmod_ocp_if *omap3xxx_l4_per_masters[] = { | |||
| 120 | 123 | ||
| 121 | /* L4 PER */ | 124 | /* L4 PER */ |
| 122 | static struct omap_hwmod omap3xxx_l4_per_hwmod = { | 125 | static struct omap_hwmod omap3xxx_l4_per_hwmod = { |
| 123 | .name = "l4_per_hwmod", | 126 | .name = "l4_per", |
| 124 | .class = &l4_hwmod_class, | 127 | .class = &l4_hwmod_class, |
| 125 | .masters = omap3xxx_l4_per_masters, | 128 | .masters = omap3xxx_l4_per_masters, |
| 126 | .masters_cnt = ARRAY_SIZE(omap3xxx_l4_per_masters), | 129 | .masters_cnt = ARRAY_SIZE(omap3xxx_l4_per_masters), |
| 127 | .slaves = omap3xxx_l4_per_slaves, | 130 | .slaves = omap3xxx_l4_per_slaves, |
| 128 | .slaves_cnt = ARRAY_SIZE(omap3xxx_l4_per_slaves), | 131 | .slaves_cnt = ARRAY_SIZE(omap3xxx_l4_per_slaves), |
| 129 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430) | 132 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430), |
| 133 | .flags = HWMOD_NO_IDLEST, | ||
| 130 | }; | 134 | }; |
| 131 | 135 | ||
| 132 | /* Slave interfaces on the L4_WKUP interconnect */ | 136 | /* Slave interfaces on the L4_WKUP interconnect */ |
| @@ -140,18 +144,19 @@ static struct omap_hwmod_ocp_if *omap3xxx_l4_wkup_masters[] = { | |||
| 140 | 144 | ||
| 141 | /* L4 WKUP */ | 145 | /* L4 WKUP */ |
| 142 | static struct omap_hwmod omap3xxx_l4_wkup_hwmod = { | 146 | static struct omap_hwmod omap3xxx_l4_wkup_hwmod = { |
| 143 | .name = "l4_wkup_hwmod", | 147 | .name = "l4_wkup", |
| 144 | .class = &l4_hwmod_class, | 148 | .class = &l4_hwmod_class, |
| 145 | .masters = omap3xxx_l4_wkup_masters, | 149 | .masters = omap3xxx_l4_wkup_masters, |
| 146 | .masters_cnt = ARRAY_SIZE(omap3xxx_l4_wkup_masters), | 150 | .masters_cnt = ARRAY_SIZE(omap3xxx_l4_wkup_masters), |
| 147 | .slaves = omap3xxx_l4_wkup_slaves, | 151 | .slaves = omap3xxx_l4_wkup_slaves, |
| 148 | .slaves_cnt = ARRAY_SIZE(omap3xxx_l4_wkup_slaves), | 152 | .slaves_cnt = ARRAY_SIZE(omap3xxx_l4_wkup_slaves), |
| 149 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430) | 153 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430), |
| 154 | .flags = HWMOD_NO_IDLEST, | ||
| 150 | }; | 155 | }; |
| 151 | 156 | ||
| 152 | /* Master interfaces on the MPU device */ | 157 | /* Master interfaces on the MPU device */ |
| 153 | static struct omap_hwmod_ocp_if *omap3xxx_mpu_masters[] = { | 158 | static struct omap_hwmod_ocp_if *omap3xxx_mpu_masters[] = { |
| 154 | &omap3xxx_mpu__l3, | 159 | &omap3xxx_mpu__l3_main, |
| 155 | }; | 160 | }; |
| 156 | 161 | ||
| 157 | /* MPU */ | 162 | /* MPU */ |
| @@ -164,12 +169,41 @@ static struct omap_hwmod omap3xxx_mpu_hwmod = { | |||
| 164 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430), | 169 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430), |
| 165 | }; | 170 | }; |
| 166 | 171 | ||
| 172 | /* | ||
| 173 | * IVA2_2 interface data | ||
| 174 | */ | ||
| 175 | |||
| 176 | /* IVA2 <- L3 interface */ | ||
| 177 | static struct omap_hwmod_ocp_if omap3xxx_l3__iva = { | ||
| 178 | .master = &omap3xxx_l3_main_hwmod, | ||
| 179 | .slave = &omap3xxx_iva_hwmod, | ||
| 180 | .clk = "iva2_ck", | ||
| 181 | .user = OCP_USER_MPU | OCP_USER_SDMA, | ||
| 182 | }; | ||
| 183 | |||
| 184 | static struct omap_hwmod_ocp_if *omap3xxx_iva_masters[] = { | ||
| 185 | &omap3xxx_l3__iva, | ||
| 186 | }; | ||
| 187 | |||
| 188 | /* | ||
| 189 | * IVA2 (IVA2) | ||
| 190 | */ | ||
| 191 | |||
| 192 | static struct omap_hwmod omap3xxx_iva_hwmod = { | ||
| 193 | .name = "iva", | ||
| 194 | .class = &iva_hwmod_class, | ||
| 195 | .masters = omap3xxx_iva_masters, | ||
| 196 | .masters_cnt = ARRAY_SIZE(omap3xxx_iva_masters), | ||
| 197 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430) | ||
| 198 | }; | ||
| 199 | |||
| 167 | static __initdata struct omap_hwmod *omap3xxx_hwmods[] = { | 200 | static __initdata struct omap_hwmod *omap3xxx_hwmods[] = { |
| 168 | &omap3xxx_l3_hwmod, | 201 | &omap3xxx_l3_main_hwmod, |
| 169 | &omap3xxx_l4_core_hwmod, | 202 | &omap3xxx_l4_core_hwmod, |
| 170 | &omap3xxx_l4_per_hwmod, | 203 | &omap3xxx_l4_per_hwmod, |
| 171 | &omap3xxx_l4_wkup_hwmod, | 204 | &omap3xxx_l4_wkup_hwmod, |
| 172 | &omap3xxx_mpu_hwmod, | 205 | &omap3xxx_mpu_hwmod, |
| 206 | &omap3xxx_iva_hwmod, | ||
| 173 | NULL, | 207 | NULL, |
| 174 | }; | 208 | }; |
| 175 | 209 | ||
diff --git a/arch/arm/mach-omap2/omap_hwmod_common_data.c b/arch/arm/mach-omap2/omap_hwmod_common_data.c index 1e80b914fa1a..08a134243ecb 100644 --- a/arch/arm/mach-omap2/omap_hwmod_common_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_common_data.c | |||
| @@ -66,3 +66,6 @@ struct omap_hwmod_class mpu_hwmod_class = { | |||
| 66 | .name = "mpu" | 66 | .name = "mpu" |
| 67 | }; | 67 | }; |
| 68 | 68 | ||
| 69 | struct omap_hwmod_class iva_hwmod_class = { | ||
| 70 | .name = "iva" | ||
| 71 | }; | ||
diff --git a/arch/arm/mach-omap2/omap_hwmod_common_data.h b/arch/arm/mach-omap2/omap_hwmod_common_data.h index 3645a28c7c27..c34e98bf1242 100644 --- a/arch/arm/mach-omap2/omap_hwmod_common_data.h +++ b/arch/arm/mach-omap2/omap_hwmod_common_data.h | |||
| @@ -20,5 +20,6 @@ | |||
| 20 | extern struct omap_hwmod_class l3_hwmod_class; | 20 | extern struct omap_hwmod_class l3_hwmod_class; |
| 21 | extern struct omap_hwmod_class l4_hwmod_class; | 21 | extern struct omap_hwmod_class l4_hwmod_class; |
| 22 | extern struct omap_hwmod_class mpu_hwmod_class; | 22 | extern struct omap_hwmod_class mpu_hwmod_class; |
| 23 | extern struct omap_hwmod_class iva_hwmod_class; | ||
| 23 | 24 | ||
| 24 | #endif | 25 | #endif |
diff --git a/arch/arm/mach-omap2/pm.c b/arch/arm/mach-omap2/pm.c new file mode 100644 index 000000000000..68f9f2e95891 --- /dev/null +++ b/arch/arm/mach-omap2/pm.c | |||
| @@ -0,0 +1,84 @@ | |||
| 1 | /* | ||
| 2 | * pm.c - Common OMAP2+ power management-related code | ||
| 3 | * | ||
| 4 | * Copyright (C) 2010 Texas Instruments, Inc. | ||
| 5 | * Copyright (C) 2010 Nokia Corporation | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or modify | ||
| 8 | * it under the terms of the GNU General Public License version 2 as | ||
| 9 | * published by the Free Software Foundation. | ||
| 10 | */ | ||
| 11 | |||
| 12 | #include <linux/kernel.h> | ||
| 13 | #include <linux/init.h> | ||
| 14 | #include <linux/io.h> | ||
| 15 | #include <linux/err.h> | ||
| 16 | |||
| 17 | #include <plat/omap-pm.h> | ||
| 18 | #include <plat/omap_device.h> | ||
| 19 | #include <plat/common.h> | ||
| 20 | |||
| 21 | static struct omap_device_pm_latency *pm_lats; | ||
| 22 | |||
| 23 | static struct device *mpu_dev; | ||
| 24 | static struct device *dsp_dev; | ||
| 25 | static struct device *l3_dev; | ||
| 26 | |||
| 27 | struct device *omap2_get_mpuss_device(void) | ||
| 28 | { | ||
| 29 | WARN_ON_ONCE(!mpu_dev); | ||
| 30 | return mpu_dev; | ||
| 31 | } | ||
| 32 | |||
| 33 | struct device *omap2_get_dsp_device(void) | ||
| 34 | { | ||
| 35 | WARN_ON_ONCE(!dsp_dev); | ||
| 36 | return dsp_dev; | ||
| 37 | } | ||
| 38 | |||
| 39 | struct device *omap2_get_l3_device(void) | ||
| 40 | { | ||
| 41 | WARN_ON_ONCE(!l3_dev); | ||
| 42 | return l3_dev; | ||
| 43 | } | ||
| 44 | |||
| 45 | /* static int _init_omap_device(struct omap_hwmod *oh, void *user) */ | ||
| 46 | static int _init_omap_device(char *name, struct device **new_dev) | ||
| 47 | { | ||
| 48 | struct omap_hwmod *oh; | ||
| 49 | struct omap_device *od; | ||
| 50 | |||
| 51 | oh = omap_hwmod_lookup(name); | ||
| 52 | if (WARN(!oh, "%s: could not find omap_hwmod for %s\n", | ||
| 53 | __func__, name)) | ||
| 54 | return -ENODEV; | ||
| 55 | |||
| 56 | od = omap_device_build(oh->name, 0, oh, NULL, 0, pm_lats, 0, false); | ||
| 57 | if (WARN(IS_ERR(od), "%s: could not build omap_device for %s\n", | ||
| 58 | __func__, name)) | ||
| 59 | return -ENODEV; | ||
| 60 | |||
| 61 | *new_dev = &od->pdev.dev; | ||
| 62 | |||
| 63 | return 0; | ||
| 64 | } | ||
| 65 | |||
| 66 | /* | ||
| 67 | * Build omap_devices for processors and bus. | ||
| 68 | */ | ||
| 69 | static void omap2_init_processor_devices(void) | ||
| 70 | { | ||
| 71 | _init_omap_device("mpu", &mpu_dev); | ||
| 72 | _init_omap_device("iva", &dsp_dev); | ||
| 73 | _init_omap_device("l3_main", &l3_dev); | ||
| 74 | } | ||
| 75 | |||
| 76 | static int __init omap2_common_pm_init(void) | ||
| 77 | { | ||
| 78 | omap2_init_processor_devices(); | ||
| 79 | omap_pm_if_init(); | ||
| 80 | |||
| 81 | return 0; | ||
| 82 | } | ||
| 83 | device_initcall(omap2_common_pm_init); | ||
| 84 | |||
diff --git a/arch/arm/plat-omap/Makefile b/arch/arm/plat-omap/Makefile index 98f01910c2cf..9405831b746a 100644 --- a/arch/arm/plat-omap/Makefile +++ b/arch/arm/plat-omap/Makefile | |||
| @@ -15,6 +15,7 @@ obj-$(CONFIG_ARCH_OMAP16XX) += ocpi.o | |||
| 15 | # omap_device support (OMAP2+ only at the moment) | 15 | # omap_device support (OMAP2+ only at the moment) |
| 16 | obj-$(CONFIG_ARCH_OMAP2) += omap_device.o | 16 | obj-$(CONFIG_ARCH_OMAP2) += omap_device.o |
| 17 | obj-$(CONFIG_ARCH_OMAP3) += omap_device.o | 17 | obj-$(CONFIG_ARCH_OMAP3) += omap_device.o |
| 18 | obj-$(CONFIG_ARCH_OMAP4) += omap_device.o | ||
| 18 | 19 | ||
| 19 | obj-$(CONFIG_OMAP_MCBSP) += mcbsp.o | 20 | obj-$(CONFIG_OMAP_MCBSP) += mcbsp.o |
| 20 | obj-$(CONFIG_OMAP_IOMMU) += iommu.o iovmm.o | 21 | obj-$(CONFIG_OMAP_IOMMU) += iommu.o iovmm.o |
diff --git a/arch/arm/plat-omap/i2c.c b/arch/arm/plat-omap/i2c.c index eec2b4993c69..a5ce4f0aad35 100644 --- a/arch/arm/plat-omap/i2c.c +++ b/arch/arm/plat-omap/i2c.c | |||
| @@ -138,6 +138,16 @@ static inline int omap1_i2c_add_bus(struct platform_device *pdev, int bus_id) | |||
| 138 | return platform_device_register(pdev); | 138 | return platform_device_register(pdev); |
| 139 | } | 139 | } |
| 140 | 140 | ||
| 141 | /* | ||
| 142 | * XXX This function is a temporary compatibility wrapper - only | ||
| 143 | * needed until the I2C driver can be converted to call | ||
| 144 | * omap_pm_set_max_dev_wakeup_lat() and handle a return code. | ||
| 145 | */ | ||
| 146 | static void omap_pm_set_max_mpu_wakeup_lat_compat(struct device *dev, long t) | ||
| 147 | { | ||
| 148 | omap_pm_set_max_mpu_wakeup_lat(dev, t); | ||
| 149 | } | ||
| 150 | |||
| 141 | static inline int omap2_i2c_add_bus(struct platform_device *pdev, int bus_id) | 151 | static inline int omap2_i2c_add_bus(struct platform_device *pdev, int bus_id) |
| 142 | { | 152 | { |
| 143 | struct resource *res; | 153 | struct resource *res; |
| @@ -168,7 +178,7 @@ static inline int omap2_i2c_add_bus(struct platform_device *pdev, int bus_id) | |||
| 168 | struct omap_i2c_bus_platform_data *pd; | 178 | struct omap_i2c_bus_platform_data *pd; |
| 169 | 179 | ||
| 170 | pd = pdev->dev.platform_data; | 180 | pd = pdev->dev.platform_data; |
| 171 | pd->set_mpu_wkup_lat = omap_pm_set_max_mpu_wakeup_lat; | 181 | pd->set_mpu_wkup_lat = omap_pm_set_max_mpu_wakeup_lat_compat; |
| 172 | } | 182 | } |
| 173 | 183 | ||
| 174 | return platform_device_register(pdev); | 184 | return platform_device_register(pdev); |
diff --git a/arch/arm/plat-omap/include/plat/clock.h b/arch/arm/plat-omap/include/plat/clock.h index dfc472ca0cc4..fef4696dcf67 100644 --- a/arch/arm/plat-omap/include/plat/clock.h +++ b/arch/arm/plat-omap/include/plat/clock.h | |||
| @@ -19,6 +19,22 @@ struct module; | |||
| 19 | struct clk; | 19 | struct clk; |
| 20 | struct clockdomain; | 20 | struct clockdomain; |
| 21 | 21 | ||
| 22 | /** | ||
| 23 | * struct clkops - some clock function pointers | ||
| 24 | * @enable: fn ptr that enables the current clock in hardware | ||
| 25 | * @disable: fn ptr that enables the current clock in hardware | ||
| 26 | * @find_idlest: function returning the IDLEST register for the clock's IP blk | ||
| 27 | * @find_companion: function returning the "companion" clk reg for the clock | ||
| 28 | * | ||
| 29 | * A "companion" clk is an accompanying clock to the one being queried | ||
| 30 | * that must be enabled for the IP module connected to the clock to | ||
| 31 | * become accessible by the hardware. Neither @find_idlest nor | ||
| 32 | * @find_companion should be needed; that information is IP | ||
| 33 | * block-specific; the hwmod code has been created to handle this, but | ||
| 34 | * until hwmod data is ready and drivers have been converted to use PM | ||
| 35 | * runtime calls in place of clk_enable()/clk_disable(), @find_idlest and | ||
| 36 | * @find_companion must, unfortunately, remain. | ||
| 37 | */ | ||
| 22 | struct clkops { | 38 | struct clkops { |
| 23 | int (*enable)(struct clk *); | 39 | int (*enable)(struct clk *); |
| 24 | void (*disable)(struct clk *); | 40 | void (*disable)(struct clk *); |
| @@ -30,12 +46,45 @@ struct clkops { | |||
| 30 | 46 | ||
| 31 | #ifdef CONFIG_ARCH_OMAP2PLUS | 47 | #ifdef CONFIG_ARCH_OMAP2PLUS |
| 32 | 48 | ||
| 49 | /* struct clksel_rate.flags possibilities */ | ||
| 50 | #define RATE_IN_242X (1 << 0) | ||
| 51 | #define RATE_IN_243X (1 << 1) | ||
| 52 | #define RATE_IN_3XXX (1 << 2) /* rates common to all OMAP3 */ | ||
| 53 | #define RATE_IN_3430ES2 (1 << 3) /* 3430ES2 rates only */ | ||
| 54 | #define RATE_IN_36XX (1 << 4) | ||
| 55 | #define RATE_IN_4430 (1 << 5) | ||
| 56 | |||
| 57 | #define RATE_IN_24XX (RATE_IN_242X | RATE_IN_243X) | ||
| 58 | #define RATE_IN_3430ES2PLUS (RATE_IN_3430ES2 | RATE_IN_36XX) | ||
| 59 | |||
| 60 | /** | ||
| 61 | * struct clksel_rate - register bitfield values corresponding to clk divisors | ||
| 62 | * @val: register bitfield value (shifted to bit 0) | ||
| 63 | * @div: clock divisor corresponding to @val | ||
| 64 | * @flags: (see "struct clksel_rate.flags possibilities" above) | ||
| 65 | * | ||
| 66 | * @val should match the value of a read from struct clk.clksel_reg | ||
| 67 | * AND'ed with struct clk.clksel_mask, shifted right to bit 0. | ||
| 68 | * | ||
| 69 | * @div is the divisor that should be applied to the parent clock's rate | ||
| 70 | * to produce the current clock's rate. | ||
| 71 | * | ||
| 72 | * XXX @flags probably should be replaced with an struct omap_chip. | ||
| 73 | */ | ||
| 33 | struct clksel_rate { | 74 | struct clksel_rate { |
| 34 | u32 val; | 75 | u32 val; |
| 35 | u8 div; | 76 | u8 div; |
| 36 | u8 flags; | 77 | u8 flags; |
| 37 | }; | 78 | }; |
| 38 | 79 | ||
| 80 | /** | ||
| 81 | * struct clksel - available parent clocks, and a pointer to their divisors | ||
| 82 | * @parent: struct clk * to a possible parent clock | ||
| 83 | * @rates: available divisors for this parent clock | ||
| 84 | * | ||
| 85 | * A struct clksel is always associated with one or more struct clks | ||
| 86 | * and one or more struct clksel_rates. | ||
| 87 | */ | ||
| 39 | struct clksel { | 88 | struct clksel { |
| 40 | struct clk *parent; | 89 | struct clk *parent; |
| 41 | const struct clksel_rate *rates; | 90 | const struct clksel_rate *rates; |
| @@ -116,6 +165,60 @@ struct dpll_data { | |||
| 116 | 165 | ||
| 117 | #endif | 166 | #endif |
| 118 | 167 | ||
| 168 | /* struct clk.flags possibilities */ | ||
| 169 | #define ENABLE_REG_32BIT (1 << 0) /* Use 32-bit access */ | ||
| 170 | #define CLOCK_IDLE_CONTROL (1 << 1) | ||
| 171 | #define CLOCK_NO_IDLE_PARENT (1 << 2) | ||
| 172 | #define ENABLE_ON_INIT (1 << 3) /* Enable upon framework init */ | ||
| 173 | #define INVERT_ENABLE (1 << 4) /* 0 enables, 1 disables */ | ||
| 174 | |||
| 175 | /** | ||
| 176 | * struct clk - OMAP struct clk | ||
| 177 | * @node: list_head connecting this clock into the full clock list | ||
| 178 | * @ops: struct clkops * for this clock | ||
| 179 | * @name: the name of the clock in the hardware (used in hwmod data and debug) | ||
| 180 | * @parent: pointer to this clock's parent struct clk | ||
| 181 | * @children: list_head connecting to the child clks' @sibling list_heads | ||
| 182 | * @sibling: list_head connecting this clk to its parent clk's @children | ||
| 183 | * @rate: current clock rate | ||
| 184 | * @enable_reg: register to write to enable the clock (see @enable_bit) | ||
| 185 | * @recalc: fn ptr that returns the clock's current rate | ||
| 186 | * @set_rate: fn ptr that can change the clock's current rate | ||
| 187 | * @round_rate: fn ptr that can round the clock's current rate | ||
| 188 | * @init: fn ptr to do clock-specific initialization | ||
| 189 | * @enable_bit: bitshift to write to enable/disable the clock (see @enable_reg) | ||
| 190 | * @usecount: number of users that have requested this clock to be enabled | ||
| 191 | * @fixed_div: when > 0, this clock's rate is its parent's rate / @fixed_div | ||
| 192 | * @flags: see "struct clk.flags possibilities" above | ||
| 193 | * @clksel_reg: for clksel clks, register va containing src/divisor select | ||
| 194 | * @clksel_mask: bitmask in @clksel_reg for the src/divisor selector | ||
| 195 | * @clksel: for clksel clks, pointer to struct clksel for this clock | ||
| 196 | * @dpll_data: for DPLLs, pointer to struct dpll_data for this clock | ||
| 197 | * @clkdm_name: clockdomain name that this clock is contained in | ||
| 198 | * @clkdm: pointer to struct clockdomain, resolved from @clkdm_name at runtime | ||
| 199 | * @rate_offset: bitshift for rate selection bitfield (OMAP1 only) | ||
| 200 | * @src_offset: bitshift for source selection bitfield (OMAP1 only) | ||
| 201 | * | ||
| 202 | * XXX @rate_offset, @src_offset should probably be removed and OMAP1 | ||
| 203 | * clock code converted to use clksel. | ||
| 204 | * | ||
| 205 | * XXX @usecount is poorly named. It should be "enable_count" or | ||
| 206 | * something similar. "users" in the description refers to kernel | ||
| 207 | * code (core code or drivers) that have called clk_enable() and not | ||
| 208 | * yet called clk_disable(); the usecount of parent clocks is also | ||
| 209 | * incremented by the clock code when clk_enable() is called on child | ||
| 210 | * clocks and decremented by the clock code when clk_disable() is | ||
| 211 | * called on child clocks. | ||
| 212 | * | ||
| 213 | * XXX @clkdm, @usecount, @children, @sibling should be marked for | ||
| 214 | * internal use only. | ||
| 215 | * | ||
| 216 | * @children and @sibling are used to optimize parent-to-child clock | ||
| 217 | * tree traversals. (child-to-parent traversals use @parent.) | ||
| 218 | * | ||
| 219 | * XXX The notion of the clock's current rate probably needs to be | ||
| 220 | * separated from the clock's target rate. | ||
| 221 | */ | ||
| 119 | struct clk { | 222 | struct clk { |
| 120 | struct list_head node; | 223 | struct list_head node; |
| 121 | const struct clkops *ops; | 224 | const struct clkops *ops; |
| @@ -129,8 +232,8 @@ struct clk { | |||
| 129 | int (*set_rate)(struct clk *, unsigned long); | 232 | int (*set_rate)(struct clk *, unsigned long); |
| 130 | long (*round_rate)(struct clk *, unsigned long); | 233 | long (*round_rate)(struct clk *, unsigned long); |
| 131 | void (*init)(struct clk *); | 234 | void (*init)(struct clk *); |
| 132 | __u8 enable_bit; | 235 | u8 enable_bit; |
| 133 | __s8 usecount; | 236 | s8 usecount; |
| 134 | u8 fixed_div; | 237 | u8 fixed_div; |
| 135 | u8 flags; | 238 | u8 flags; |
| 136 | #ifdef CONFIG_ARCH_OMAP2PLUS | 239 | #ifdef CONFIG_ARCH_OMAP2PLUS |
| @@ -141,8 +244,8 @@ struct clk { | |||
| 141 | const char *clkdm_name; | 244 | const char *clkdm_name; |
| 142 | struct clockdomain *clkdm; | 245 | struct clockdomain *clkdm; |
| 143 | #else | 246 | #else |
| 144 | __u8 rate_offset; | 247 | u8 rate_offset; |
| 145 | __u8 src_offset; | 248 | u8 src_offset; |
| 146 | #endif | 249 | #endif |
| 147 | #if defined(CONFIG_PM_DEBUG) && defined(CONFIG_DEBUG_FS) | 250 | #if defined(CONFIG_PM_DEBUG) && defined(CONFIG_DEBUG_FS) |
| 148 | struct dentry *dent; /* For visible tree hierarchy */ | 251 | struct dentry *dent; /* For visible tree hierarchy */ |
| @@ -188,23 +291,4 @@ extern const struct clkops clkops_null; | |||
| 188 | 291 | ||
| 189 | extern struct clk dummy_ck; | 292 | extern struct clk dummy_ck; |
| 190 | 293 | ||
| 191 | /* Clock flags */ | ||
| 192 | #define ENABLE_REG_32BIT (1 << 0) /* Use 32-bit access */ | ||
| 193 | #define CLOCK_IDLE_CONTROL (1 << 1) | ||
| 194 | #define CLOCK_NO_IDLE_PARENT (1 << 2) | ||
| 195 | #define ENABLE_ON_INIT (1 << 3) /* Enable upon framework init */ | ||
| 196 | #define INVERT_ENABLE (1 << 4) /* 0 enables, 1 disables */ | ||
| 197 | |||
| 198 | /* Clksel_rate flags */ | ||
| 199 | #define RATE_IN_242X (1 << 0) | ||
| 200 | #define RATE_IN_243X (1 << 1) | ||
| 201 | #define RATE_IN_3XXX (1 << 2) /* rates common to all OMAP3 */ | ||
| 202 | #define RATE_IN_3430ES2 (1 << 3) /* 3430ES2 rates only */ | ||
| 203 | #define RATE_IN_36XX (1 << 4) | ||
| 204 | #define RATE_IN_4430 (1 << 5) | ||
| 205 | |||
| 206 | #define RATE_IN_24XX (RATE_IN_242X | RATE_IN_243X) | ||
| 207 | |||
| 208 | #define RATE_IN_3430ES2PLUS (RATE_IN_3430ES2 | RATE_IN_36XX) | ||
| 209 | |||
| 210 | #endif | 294 | #endif |
diff --git a/arch/arm/plat-omap/include/plat/common.h b/arch/arm/plat-omap/include/plat/common.h index d265018f5e6b..fe83e901ba6c 100644 --- a/arch/arm/plat-omap/include/plat/common.h +++ b/arch/arm/plat-omap/include/plat/common.h | |||
| @@ -87,4 +87,8 @@ void omap2_set_globals_uart(struct omap_globals *); | |||
| 87 | } \ | 87 | } \ |
| 88 | }) | 88 | }) |
| 89 | 89 | ||
| 90 | extern struct device *omap2_get_mpuss_device(void); | ||
| 91 | extern struct device *omap2_get_dsp_device(void); | ||
| 92 | extern struct device *omap2_get_l3_device(void); | ||
| 93 | |||
| 90 | #endif /* __ARCH_ARM_MACH_OMAP_COMMON_H */ | 94 | #endif /* __ARCH_ARM_MACH_OMAP_COMMON_H */ |
diff --git a/arch/arm/plat-omap/include/plat/omap-pm.h b/arch/arm/plat-omap/include/plat/omap-pm.h index 3ee41d711492..728fbb9dd549 100644 --- a/arch/arm/plat-omap/include/plat/omap-pm.h +++ b/arch/arm/plat-omap/include/plat/omap-pm.h | |||
| @@ -1,8 +1,8 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * omap-pm.h - OMAP power management interface | 2 | * omap-pm.h - OMAP power management interface |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2008-2009 Texas Instruments, Inc. | 4 | * Copyright (C) 2008-2010 Texas Instruments, Inc. |
| 5 | * Copyright (C) 2008-2009 Nokia Corporation | 5 | * Copyright (C) 2008-2010 Nokia Corporation |
| 6 | * Paul Walmsley | 6 | * Paul Walmsley |
| 7 | * | 7 | * |
| 8 | * Interface developed by (in alphabetical order): Karthik Dasu, Jouni | 8 | * Interface developed by (in alphabetical order): Karthik Dasu, Jouni |
| @@ -16,6 +16,7 @@ | |||
| 16 | 16 | ||
| 17 | #include <linux/device.h> | 17 | #include <linux/device.h> |
| 18 | #include <linux/cpufreq.h> | 18 | #include <linux/cpufreq.h> |
| 19 | #include <linux/clk.h> | ||
| 19 | 20 | ||
| 20 | #include "powerdomain.h" | 21 | #include "powerdomain.h" |
| 21 | 22 | ||
| @@ -89,7 +90,7 @@ void omap_pm_if_exit(void); | |||
| 89 | * @t: maximum MPU wakeup latency in microseconds | 90 | * @t: maximum MPU wakeup latency in microseconds |
| 90 | * | 91 | * |
| 91 | * Request that the maximum interrupt latency for the MPU to be no | 92 | * Request that the maximum interrupt latency for the MPU to be no |
| 92 | * greater than 't' microseconds. "Interrupt latency" in this case is | 93 | * greater than @t microseconds. "Interrupt latency" in this case is |
| 93 | * defined as the elapsed time from the occurrence of a hardware or | 94 | * defined as the elapsed time from the occurrence of a hardware or |
| 94 | * timer interrupt to the time when the device driver's interrupt | 95 | * timer interrupt to the time when the device driver's interrupt |
| 95 | * service routine has been entered by the MPU. | 96 | * service routine has been entered by the MPU. |
| @@ -105,15 +106,19 @@ void omap_pm_if_exit(void); | |||
| 105 | * elapsed from when a device driver enables a hardware device with | 106 | * elapsed from when a device driver enables a hardware device with |
| 106 | * clk_enable(), to when the device is ready for register access or | 107 | * clk_enable(), to when the device is ready for register access or |
| 107 | * other use. To control this device wakeup latency, use | 108 | * other use. To control this device wakeup latency, use |
| 108 | * set_max_dev_wakeup_lat() | 109 | * omap_pm_set_max_dev_wakeup_lat() |
| 109 | * | 110 | * |
| 110 | * Multiple calls to set_max_mpu_wakeup_lat() will replace the | 111 | * Multiple calls to omap_pm_set_max_mpu_wakeup_lat() will replace the |
| 111 | * previous t value. To remove the latency target for the MPU, call | 112 | * previous t value. To remove the latency target for the MPU, call |
| 112 | * with t = -1. | 113 | * with t = -1. |
| 113 | * | 114 | * |
| 114 | * No return value. | 115 | * XXX This constraint will be deprecated soon in favor of the more |
| 116 | * general omap_pm_set_max_dev_wakeup_lat() | ||
| 117 | * | ||
| 118 | * Returns -EINVAL for an invalid argument, -ERANGE if the constraint | ||
| 119 | * is not satisfiable, or 0 upon success. | ||
| 115 | */ | 120 | */ |
| 116 | void omap_pm_set_max_mpu_wakeup_lat(struct device *dev, long t); | 121 | int omap_pm_set_max_mpu_wakeup_lat(struct device *dev, long t); |
| 117 | 122 | ||
| 118 | 123 | ||
| 119 | /** | 124 | /** |
| @@ -123,8 +128,8 @@ void omap_pm_set_max_mpu_wakeup_lat(struct device *dev, long t); | |||
| 123 | * @r: minimum throughput (in KiB/s) | 128 | * @r: minimum throughput (in KiB/s) |
| 124 | * | 129 | * |
| 125 | * Request that the minimum data throughput on the OCP interconnect | 130 | * Request that the minimum data throughput on the OCP interconnect |
| 126 | * attached to device 'dev' interconnect agent 'tbus_id' be no less | 131 | * attached to device @dev interconnect agent @tbus_id be no less |
| 127 | * than 'r' KiB/s. | 132 | * than @r KiB/s. |
| 128 | * | 133 | * |
| 129 | * It is expected that the OMAP PM or bus code will use this | 134 | * It is expected that the OMAP PM or bus code will use this |
| 130 | * information to set the interconnect clock to run at the lowest | 135 | * information to set the interconnect clock to run at the lowest |
| @@ -138,40 +143,44 @@ void omap_pm_set_max_mpu_wakeup_lat(struct device *dev, long t); | |||
| 138 | * code will also need to add an minimum L3 interconnect speed | 143 | * code will also need to add an minimum L3 interconnect speed |
| 139 | * constraint, | 144 | * constraint, |
| 140 | * | 145 | * |
| 141 | * Multiple calls to set_min_bus_tput() will replace the previous rate | 146 | * Multiple calls to omap_pm_set_min_bus_tput() will replace the |
| 142 | * value for this device. To remove the interconnect throughput | 147 | * previous rate value for this device. To remove the interconnect |
| 143 | * restriction for this device, call with r = 0. | 148 | * throughput restriction for this device, call with r = 0. |
| 144 | * | 149 | * |
| 145 | * No return value. | 150 | * Returns -EINVAL for an invalid argument, -ERANGE if the constraint |
| 151 | * is not satisfiable, or 0 upon success. | ||
| 146 | */ | 152 | */ |
| 147 | void omap_pm_set_min_bus_tput(struct device *dev, u8 agent_id, unsigned long r); | 153 | int omap_pm_set_min_bus_tput(struct device *dev, u8 agent_id, unsigned long r); |
| 148 | 154 | ||
| 149 | 155 | ||
| 150 | /** | 156 | /** |
| 151 | * omap_pm_set_max_dev_wakeup_lat - set the maximum device enable latency | 157 | * omap_pm_set_max_dev_wakeup_lat - set the maximum device enable latency |
| 152 | * @dev: struct device * | 158 | * @req_dev: struct device * requesting the constraint, or NULL if none |
| 159 | * @dev: struct device * to set the constraint one | ||
| 153 | * @t: maximum device wakeup latency in microseconds | 160 | * @t: maximum device wakeup latency in microseconds |
| 154 | * | 161 | * |
| 155 | * Request that the maximum amount of time necessary for a device to | 162 | * Request that the maximum amount of time necessary for a device @dev |
| 156 | * become accessible after its clocks are enabled should be no greater | 163 | * to become accessible after its clocks are enabled should be no |
| 157 | * than 't' microseconds. Specifically, this represents the time from | 164 | * greater than @t microseconds. Specifically, this represents the |
| 158 | * when a device driver enables device clocks with clk_enable(), to | 165 | * time from when a device driver enables device clocks with |
| 159 | * when the register reads and writes on the device will succeed. | 166 | * clk_enable(), to when the register reads and writes on the device |
| 160 | * This function should be called before clk_disable() is called, | 167 | * will succeed. This function should be called before clk_disable() |
| 161 | * since the power state transition decision may be made during | 168 | * is called, since the power state transition decision may be made |
| 162 | * clk_disable(). | 169 | * during clk_disable(). |
| 163 | * | 170 | * |
| 164 | * It is intended that underlying PM code will use this information to | 171 | * It is intended that underlying PM code will use this information to |
| 165 | * determine what power state to put the powerdomain enclosing this | 172 | * determine what power state to put the powerdomain enclosing this |
| 166 | * device into. | 173 | * device into. |
| 167 | * | 174 | * |
| 168 | * Multiple calls to set_max_dev_wakeup_lat() will replace the | 175 | * Multiple calls to omap_pm_set_max_dev_wakeup_lat() will replace the |
| 169 | * previous wakeup latency values for this device. To remove the wakeup | 176 | * previous wakeup latency values for this device. To remove the |
| 170 | * latency restriction for this device, call with t = -1. | 177 | * wakeup latency restriction for this device, call with t = -1. |
| 171 | * | 178 | * |
| 172 | * No return value. | 179 | * Returns -EINVAL for an invalid argument, -ERANGE if the constraint |
| 180 | * is not satisfiable, or 0 upon success. | ||
| 173 | */ | 181 | */ |
| 174 | void omap_pm_set_max_dev_wakeup_lat(struct device *dev, long t); | 182 | int omap_pm_set_max_dev_wakeup_lat(struct device *req_dev, struct device *dev, |
| 183 | long t); | ||
| 175 | 184 | ||
| 176 | 185 | ||
| 177 | /** | 186 | /** |
| @@ -198,10 +207,71 @@ void omap_pm_set_max_dev_wakeup_lat(struct device *dev, long t); | |||
| 198 | * value for this device. To remove the maximum DMA latency for this | 207 | * value for this device. To remove the maximum DMA latency for this |
| 199 | * device, call with t = -1. | 208 | * device, call with t = -1. |
| 200 | * | 209 | * |
| 201 | * No return value. | 210 | * Returns -EINVAL for an invalid argument, -ERANGE if the constraint |
| 211 | * is not satisfiable, or 0 upon success. | ||
| 202 | */ | 212 | */ |
| 203 | void omap_pm_set_max_sdma_lat(struct device *dev, long t); | 213 | int omap_pm_set_max_sdma_lat(struct device *dev, long t); |
| 214 | |||
| 204 | 215 | ||
| 216 | /** | ||
| 217 | * omap_pm_set_min_clk_rate - set minimum clock rate requested by @dev | ||
| 218 | * @dev: struct device * requesting the constraint | ||
| 219 | * @clk: struct clk * to set the minimum rate constraint on | ||
| 220 | * @r: minimum rate in Hz | ||
| 221 | * | ||
| 222 | * Request that the minimum clock rate on the device @dev's clk @clk | ||
| 223 | * be no less than @r Hz. | ||
| 224 | * | ||
| 225 | * It is expected that the OMAP PM code will use this information to | ||
| 226 | * find an OPP or clock setting that will satisfy this clock rate | ||
| 227 | * constraint, along with any other applicable system constraints on | ||
| 228 | * the clock rate or corresponding voltage, etc. | ||
| 229 | * | ||
| 230 | * omap_pm_set_min_clk_rate() differs from the clock code's | ||
| 231 | * clk_set_rate() in that it considers other constraints before taking | ||
| 232 | * any hardware action, and may change a system OPP rather than just a | ||
| 233 | * clock rate. clk_set_rate() is intended to be a low-level | ||
| 234 | * interface. | ||
| 235 | * | ||
| 236 | * omap_pm_set_min_clk_rate() is easily open to abuse. A better API | ||
| 237 | * would be something like "omap_pm_set_min_dev_performance()"; | ||
| 238 | * however, there is no easily-generalizable concept of performance | ||
| 239 | * that applies to all devices. Only a device (and possibly the | ||
| 240 | * device subsystem) has both the subsystem-specific knowledge, and | ||
| 241 | * the hardware IP block-specific knowledge, to translate a constraint | ||
| 242 | * on "touchscreen sampling accuracy" or "number of pixels or polygons | ||
| 243 | * rendered per second" to a clock rate. This translation can be | ||
| 244 | * dependent on the hardware IP block's revision, or firmware version, | ||
| 245 | * and the driver is the only code on the system that has this | ||
| 246 | * information and can know how to translate that into a clock rate. | ||
| 247 | * | ||
| 248 | * The intended use-case for this function is for userspace or other | ||
| 249 | * kernel code to communicate a particular performance requirement to | ||
| 250 | * a subsystem; then for the subsystem to communicate that requirement | ||
| 251 | * to something that is meaningful to the device driver; then for the | ||
| 252 | * device driver to convert that requirement to a clock rate, and to | ||
| 253 | * then call omap_pm_set_min_clk_rate(). | ||
| 254 | * | ||
| 255 | * Users of this function (such as device drivers) should not simply | ||
| 256 | * call this function with some high clock rate to ensure "high | ||
| 257 | * performance." Rather, the device driver should take a performance | ||
| 258 | * constraint from its subsystem, such as "render at least X polygons | ||
| 259 | * per second," and use some formula or table to convert that into a | ||
| 260 | * clock rate constraint given the hardware type and hardware | ||
| 261 | * revision. Device drivers or subsystems should not assume that they | ||
| 262 | * know how to make a power/performance tradeoff - some device use | ||
| 263 | * cases may tolerate a lower-fidelity device function for lower power | ||
| 264 | * consumption; others may demand a higher-fidelity device function, | ||
| 265 | * no matter what the power consumption. | ||
| 266 | * | ||
| 267 | * Multiple calls to omap_pm_set_min_clk_rate() will replace the | ||
| 268 | * previous rate value for the device @dev. To remove the minimum clock | ||
| 269 | * rate constraint for the device, call with r = 0. | ||
| 270 | * | ||
| 271 | * Returns -EINVAL for an invalid argument, -ERANGE if the constraint | ||
| 272 | * is not satisfiable, or 0 upon success. | ||
| 273 | */ | ||
| 274 | int omap_pm_set_min_clk_rate(struct device *dev, struct clk *c, long r); | ||
| 205 | 275 | ||
| 206 | /* | 276 | /* |
| 207 | * DSP Bridge-specific constraints | 277 | * DSP Bridge-specific constraints |
diff --git a/arch/arm/plat-omap/include/plat/omap_device.h b/arch/arm/plat-omap/include/plat/omap_device.h index 3694b622c4ac..25cd9ac3b095 100644 --- a/arch/arm/plat-omap/include/plat/omap_device.h +++ b/arch/arm/plat-omap/include/plat/omap_device.h | |||
| @@ -101,6 +101,8 @@ struct omap_device *omap_device_build_ss(const char *pdev_name, int pdev_id, | |||
| 101 | int omap_device_register(struct omap_device *od); | 101 | int omap_device_register(struct omap_device *od); |
| 102 | int omap_early_device_register(struct omap_device *od); | 102 | int omap_early_device_register(struct omap_device *od); |
| 103 | 103 | ||
| 104 | void __iomem *omap_device_get_rt_va(struct omap_device *od); | ||
| 105 | |||
| 104 | /* OMAP PM interface */ | 106 | /* OMAP PM interface */ |
| 105 | int omap_device_align_pm_lat(struct platform_device *pdev, | 107 | int omap_device_align_pm_lat(struct platform_device *pdev, |
| 106 | u32 new_wakeup_lat_limit); | 108 | u32 new_wakeup_lat_limit); |
diff --git a/arch/arm/plat-omap/include/plat/omap_hwmod.h b/arch/arm/plat-omap/include/plat/omap_hwmod.h index 0eccc09ac4a9..a4e508dfaba2 100644 --- a/arch/arm/plat-omap/include/plat/omap_hwmod.h +++ b/arch/arm/plat-omap/include/plat/omap_hwmod.h | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * omap_hwmod macros, structures | 2 | * omap_hwmod macros, structures |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2009 Nokia Corporation | 4 | * Copyright (C) 2009-2010 Nokia Corporation |
| 5 | * Paul Walmsley | 5 | * Paul Walmsley |
| 6 | * | 6 | * |
| 7 | * Created in collaboration with (alphabetical order): Benoît Cousson, | 7 | * Created in collaboration with (alphabetical order): Benoît Cousson, |
| @@ -419,7 +419,7 @@ struct omap_hwmod_class { | |||
| 419 | * @slaves: ptr to array of OCP ifs that this hwmod can respond on | 419 | * @slaves: ptr to array of OCP ifs that this hwmod can respond on |
| 420 | * @dev_attr: arbitrary device attributes that can be passed to the driver | 420 | * @dev_attr: arbitrary device attributes that can be passed to the driver |
| 421 | * @_sysc_cache: internal-use hwmod flags | 421 | * @_sysc_cache: internal-use hwmod flags |
| 422 | * @_rt_va: cached register target start address (internal use) | 422 | * @_mpu_rt_va: cached register target start address (internal use) |
| 423 | * @_mpu_port_index: cached MPU register target slave ID (internal use) | 423 | * @_mpu_port_index: cached MPU register target slave ID (internal use) |
| 424 | * @msuspendmux_reg_id: CONTROL_MSUSPENDMUX register ID (1-6) | 424 | * @msuspendmux_reg_id: CONTROL_MSUSPENDMUX register ID (1-6) |
| 425 | * @msuspendmux_shift: CONTROL_MSUSPENDMUX register bit shift | 425 | * @msuspendmux_shift: CONTROL_MSUSPENDMUX register bit shift |
| @@ -460,7 +460,7 @@ struct omap_hwmod { | |||
| 460 | struct omap_hwmod_ocp_if **slaves; /* connect to *_TA */ | 460 | struct omap_hwmod_ocp_if **slaves; /* connect to *_TA */ |
| 461 | void *dev_attr; | 461 | void *dev_attr; |
| 462 | u32 _sysc_cache; | 462 | u32 _sysc_cache; |
| 463 | void __iomem *_rt_va; | 463 | void __iomem *_mpu_rt_va; |
| 464 | struct list_head node; | 464 | struct list_head node; |
| 465 | u16 flags; | 465 | u16 flags; |
| 466 | u8 _mpu_port_index; | 466 | u8 _mpu_port_index; |
| @@ -482,11 +482,14 @@ int omap_hwmod_init(struct omap_hwmod **ohs); | |||
| 482 | int omap_hwmod_register(struct omap_hwmod *oh); | 482 | int omap_hwmod_register(struct omap_hwmod *oh); |
| 483 | int omap_hwmod_unregister(struct omap_hwmod *oh); | 483 | int omap_hwmod_unregister(struct omap_hwmod *oh); |
| 484 | struct omap_hwmod *omap_hwmod_lookup(const char *name); | 484 | struct omap_hwmod *omap_hwmod_lookup(const char *name); |
| 485 | int omap_hwmod_for_each(int (*fn)(struct omap_hwmod *oh)); | 485 | int omap_hwmod_for_each(int (*fn)(struct omap_hwmod *oh, void *data), |
| 486 | int omap_hwmod_late_init(void); | 486 | void *data); |
| 487 | int omap_hwmod_late_init(u8 skip_setup_idle); | ||
| 487 | 488 | ||
| 488 | int omap_hwmod_enable(struct omap_hwmod *oh); | 489 | int omap_hwmod_enable(struct omap_hwmod *oh); |
| 490 | int _omap_hwmod_enable(struct omap_hwmod *oh); | ||
| 489 | int omap_hwmod_idle(struct omap_hwmod *oh); | 491 | int omap_hwmod_idle(struct omap_hwmod *oh); |
| 492 | int _omap_hwmod_idle(struct omap_hwmod *oh); | ||
| 490 | int omap_hwmod_shutdown(struct omap_hwmod *oh); | 493 | int omap_hwmod_shutdown(struct omap_hwmod *oh); |
| 491 | 494 | ||
| 492 | int omap_hwmod_enable_clocks(struct omap_hwmod *oh); | 495 | int omap_hwmod_enable_clocks(struct omap_hwmod *oh); |
| @@ -504,6 +507,7 @@ int omap_hwmod_count_resources(struct omap_hwmod *oh); | |||
| 504 | int omap_hwmod_fill_resources(struct omap_hwmod *oh, struct resource *res); | 507 | int omap_hwmod_fill_resources(struct omap_hwmod *oh, struct resource *res); |
| 505 | 508 | ||
| 506 | struct powerdomain *omap_hwmod_get_pwrdm(struct omap_hwmod *oh); | 509 | struct powerdomain *omap_hwmod_get_pwrdm(struct omap_hwmod *oh); |
| 510 | void __iomem *omap_hwmod_get_mpu_rt_va(struct omap_hwmod *oh); | ||
| 507 | 511 | ||
| 508 | int omap_hwmod_add_initiator_dep(struct omap_hwmod *oh, | 512 | int omap_hwmod_add_initiator_dep(struct omap_hwmod *oh, |
| 509 | struct omap_hwmod *init_oh); | 513 | struct omap_hwmod *init_oh); |
diff --git a/arch/arm/plat-omap/omap-pm-noop.c b/arch/arm/plat-omap/omap-pm-noop.c index 186bca82cfab..e129ce80c53b 100644 --- a/arch/arm/plat-omap/omap-pm-noop.c +++ b/arch/arm/plat-omap/omap-pm-noop.c | |||
| @@ -34,11 +34,11 @@ struct omap_opp *l3_opps; | |||
| 34 | * Device-driver-originated constraints (via board-*.c files) | 34 | * Device-driver-originated constraints (via board-*.c files) |
| 35 | */ | 35 | */ |
| 36 | 36 | ||
| 37 | void omap_pm_set_max_mpu_wakeup_lat(struct device *dev, long t) | 37 | int omap_pm_set_max_mpu_wakeup_lat(struct device *dev, long t) |
| 38 | { | 38 | { |
| 39 | if (!dev || t < -1) { | 39 | if (!dev || t < -1) { |
| 40 | WARN_ON(1); | 40 | WARN(1, "OMAP PM: %s: invalid parameter(s)", __func__); |
| 41 | return; | 41 | return -EINVAL; |
| 42 | }; | 42 | }; |
| 43 | 43 | ||
| 44 | if (t == -1) | 44 | if (t == -1) |
| @@ -58,14 +58,16 @@ void omap_pm_set_max_mpu_wakeup_lat(struct device *dev, long t) | |||
| 58 | * | 58 | * |
| 59 | * TI CDP code can call constraint_set here. | 59 | * TI CDP code can call constraint_set here. |
| 60 | */ | 60 | */ |
| 61 | |||
| 62 | return 0; | ||
| 61 | } | 63 | } |
| 62 | 64 | ||
| 63 | void omap_pm_set_min_bus_tput(struct device *dev, u8 agent_id, unsigned long r) | 65 | int omap_pm_set_min_bus_tput(struct device *dev, u8 agent_id, unsigned long r) |
| 64 | { | 66 | { |
| 65 | if (!dev || (agent_id != OCP_INITIATOR_AGENT && | 67 | if (!dev || (agent_id != OCP_INITIATOR_AGENT && |
| 66 | agent_id != OCP_TARGET_AGENT)) { | 68 | agent_id != OCP_TARGET_AGENT)) { |
| 67 | WARN_ON(1); | 69 | WARN(1, "OMAP PM: %s: invalid parameter(s)", __func__); |
| 68 | return; | 70 | return -EINVAL; |
| 69 | }; | 71 | }; |
| 70 | 72 | ||
| 71 | if (r == 0) | 73 | if (r == 0) |
| @@ -83,13 +85,16 @@ void omap_pm_set_min_bus_tput(struct device *dev, u8 agent_id, unsigned long r) | |||
| 83 | * | 85 | * |
| 84 | * TI CDP code can call constraint_set here on the VDD2 OPP. | 86 | * TI CDP code can call constraint_set here on the VDD2 OPP. |
| 85 | */ | 87 | */ |
| 88 | |||
| 89 | return 0; | ||
| 86 | } | 90 | } |
| 87 | 91 | ||
| 88 | void omap_pm_set_max_dev_wakeup_lat(struct device *dev, long t) | 92 | int omap_pm_set_max_dev_wakeup_lat(struct device *req_dev, struct device *dev, |
| 93 | long t) | ||
| 89 | { | 94 | { |
| 90 | if (!dev || t < -1) { | 95 | if (!req_dev || !dev || t < -1) { |
| 91 | WARN_ON(1); | 96 | WARN(1, "OMAP PM: %s: invalid parameter(s)", __func__); |
| 92 | return; | 97 | return -EINVAL; |
| 93 | }; | 98 | }; |
| 94 | 99 | ||
| 95 | if (t == -1) | 100 | if (t == -1) |
| @@ -111,13 +116,15 @@ void omap_pm_set_max_dev_wakeup_lat(struct device *dev, long t) | |||
| 111 | * | 116 | * |
| 112 | * TI CDP code can call constraint_set here. | 117 | * TI CDP code can call constraint_set here. |
| 113 | */ | 118 | */ |
| 119 | |||
| 120 | return 0; | ||
| 114 | } | 121 | } |
| 115 | 122 | ||
| 116 | void omap_pm_set_max_sdma_lat(struct device *dev, long t) | 123 | int omap_pm_set_max_sdma_lat(struct device *dev, long t) |
| 117 | { | 124 | { |
| 118 | if (!dev || t < -1) { | 125 | if (!dev || t < -1) { |
| 119 | WARN_ON(1); | 126 | WARN(1, "OMAP PM: %s: invalid parameter(s)", __func__); |
| 120 | return; | 127 | return -EINVAL; |
| 121 | }; | 128 | }; |
| 122 | 129 | ||
| 123 | if (t == -1) | 130 | if (t == -1) |
| @@ -139,8 +146,36 @@ void omap_pm_set_max_sdma_lat(struct device *dev, long t) | |||
| 139 | * TI CDP code can call constraint_set here. | 146 | * TI CDP code can call constraint_set here. |
| 140 | */ | 147 | */ |
| 141 | 148 | ||
| 149 | return 0; | ||
| 142 | } | 150 | } |
| 143 | 151 | ||
| 152 | int omap_pm_set_min_clk_rate(struct device *dev, struct clk *c, long r) | ||
| 153 | { | ||
| 154 | if (!dev || !c || r < 0) { | ||
| 155 | WARN(1, "OMAP PM: %s: invalid parameter(s)", __func__); | ||
| 156 | return -EINVAL; | ||
| 157 | } | ||
| 158 | |||
| 159 | if (r == 0) | ||
| 160 | pr_debug("OMAP PM: remove min clk rate constraint: " | ||
| 161 | "dev %s\n", dev_name(dev)); | ||
| 162 | else | ||
| 163 | pr_debug("OMAP PM: add min clk rate constraint: " | ||
| 164 | "dev %s, rate = %ld Hz\n", dev_name(dev), r); | ||
| 165 | |||
| 166 | /* | ||
| 167 | * Code in a real implementation should keep track of these | ||
| 168 | * constraints on the clock, and determine the highest minimum | ||
| 169 | * clock rate. It should iterate over each OPP and determine | ||
| 170 | * whether the OPP will result in a clock rate that would | ||
| 171 | * satisfy this constraint (and any other PM constraint in effect | ||
| 172 | * at that time). Once it finds the lowest-voltage OPP that | ||
| 173 | * meets those conditions, it should switch to it, or return | ||
| 174 | * an error if the code is not capable of doing so. | ||
| 175 | */ | ||
| 176 | |||
| 177 | return 0; | ||
| 178 | } | ||
| 144 | 179 | ||
| 145 | /* | 180 | /* |
| 146 | * DSP Bridge-specific constraints | 181 | * DSP Bridge-specific constraints |
diff --git a/arch/arm/plat-omap/omap_device.c b/arch/arm/plat-omap/omap_device.c index f899603051ac..ea0d659fcb1c 100644 --- a/arch/arm/plat-omap/omap_device.c +++ b/arch/arm/plat-omap/omap_device.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * omap_device implementation | 2 | * omap_device implementation |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2009 Nokia Corporation | 4 | * Copyright (C) 2009-2010 Nokia Corporation |
| 5 | * Paul Walmsley, Kevin Hilman | 5 | * Paul Walmsley, Kevin Hilman |
| 6 | * | 6 | * |
| 7 | * Developed in collaboration with (alphabetical order): Benoit | 7 | * Developed in collaboration with (alphabetical order): Benoit |
| @@ -90,8 +90,11 @@ | |||
| 90 | #define USE_WAKEUP_LAT 0 | 90 | #define USE_WAKEUP_LAT 0 |
| 91 | #define IGNORE_WAKEUP_LAT 1 | 91 | #define IGNORE_WAKEUP_LAT 1 |
| 92 | 92 | ||
| 93 | 93 | /* | |
| 94 | #define OMAP_DEVICE_MAGIC 0xf00dcafe | 94 | * OMAP_DEVICE_MAGIC: used to determine whether a struct omap_device |
| 95 | * obtained via container_of() is in fact a struct omap_device | ||
| 96 | */ | ||
| 97 | #define OMAP_DEVICE_MAGIC 0xf00dcafe | ||
| 95 | 98 | ||
| 96 | /* Private functions */ | 99 | /* Private functions */ |
| 97 | 100 | ||
| @@ -359,7 +362,7 @@ struct omap_device *omap_device_build_ss(const char *pdev_name, int pdev_id, | |||
| 359 | struct omap_device *od; | 362 | struct omap_device *od; |
| 360 | char *pdev_name2; | 363 | char *pdev_name2; |
| 361 | struct resource *res = NULL; | 364 | struct resource *res = NULL; |
| 362 | int res_count; | 365 | int i, res_count; |
| 363 | struct omap_hwmod **hwmods; | 366 | struct omap_hwmod **hwmods; |
| 364 | 367 | ||
| 365 | if (!ohs || oh_cnt == 0 || !pdev_name) | 368 | if (!ohs || oh_cnt == 0 || !pdev_name) |
| @@ -416,6 +419,9 @@ struct omap_device *omap_device_build_ss(const char *pdev_name, int pdev_id, | |||
| 416 | else | 419 | else |
| 417 | ret = omap_device_register(od); | 420 | ret = omap_device_register(od); |
| 418 | 421 | ||
| 422 | for (i = 0; i < oh_cnt; i++) | ||
| 423 | hwmods[i]->od = od; | ||
| 424 | |||
| 419 | if (ret) | 425 | if (ret) |
| 420 | goto odbs_exit4; | 426 | goto odbs_exit4; |
| 421 | 427 | ||
| @@ -652,6 +658,25 @@ struct powerdomain *omap_device_get_pwrdm(struct omap_device *od) | |||
| 652 | return omap_hwmod_get_pwrdm(od->hwmods[0]); | 658 | return omap_hwmod_get_pwrdm(od->hwmods[0]); |
| 653 | } | 659 | } |
| 654 | 660 | ||
| 661 | /** | ||
| 662 | * omap_device_get_mpu_rt_va - return the MPU's virtual addr for the hwmod base | ||
| 663 | * @od: struct omap_device * | ||
| 664 | * | ||
| 665 | * Return the MPU's virtual address for the base of the hwmod, from | ||
| 666 | * the ioremap() that the hwmod code does. Only valid if there is one | ||
| 667 | * hwmod associated with this device. Returns NULL if there are zero | ||
| 668 | * or more than one hwmods associated with this omap_device; | ||
| 669 | * otherwise, passes along the return value from | ||
| 670 | * omap_hwmod_get_mpu_rt_va(). | ||
| 671 | */ | ||
| 672 | void __iomem *omap_device_get_rt_va(struct omap_device *od) | ||
| 673 | { | ||
| 674 | if (od->hwmods_cnt != 1) | ||
| 675 | return NULL; | ||
| 676 | |||
| 677 | return omap_hwmod_get_mpu_rt_va(od->hwmods[0]); | ||
| 678 | } | ||
| 679 | |||
| 655 | /* | 680 | /* |
| 656 | * Public functions intended for use in omap_device_pm_latency | 681 | * Public functions intended for use in omap_device_pm_latency |
| 657 | * .activate_func and .deactivate_func function pointers | 682 | * .activate_func and .deactivate_func function pointers |
