diff options
287 files changed, 5733 insertions, 3395 deletions
diff --git a/Documentation/networking/00-INDEX b/Documentation/networking/00-INDEX index fe5c099b8fc..4edd78dfb36 100644 --- a/Documentation/networking/00-INDEX +++ b/Documentation/networking/00-INDEX | |||
| @@ -40,8 +40,6 @@ decnet.txt | |||
| 40 | - info on using the DECnet networking layer in Linux. | 40 | - info on using the DECnet networking layer in Linux. |
| 41 | depca.txt | 41 | depca.txt |
| 42 | - the Digital DEPCA/EtherWORKS DE1?? and DE2?? LANCE Ethernet driver | 42 | - the Digital DEPCA/EtherWORKS DE1?? and DE2?? LANCE Ethernet driver |
| 43 | dgrs.txt | ||
| 44 | - the Digi International RightSwitch SE-X Ethernet driver | ||
| 45 | dmfe.txt | 43 | dmfe.txt |
| 46 | - info on the Davicom DM9102(A)/DM9132/DM9801 fast ethernet driver. | 44 | - info on the Davicom DM9102(A)/DM9132/DM9801 fast ethernet driver. |
| 47 | e100.txt | 45 | e100.txt |
| @@ -50,8 +48,6 @@ e1000.txt | |||
| 50 | - info on Intel's E1000 line of gigabit ethernet boards | 48 | - info on Intel's E1000 line of gigabit ethernet boards |
| 51 | eql.txt | 49 | eql.txt |
| 52 | - serial IP load balancing | 50 | - serial IP load balancing |
| 53 | ethertap.txt | ||
| 54 | - the Ethertap user space packet reception and transmission driver | ||
| 55 | ewrk3.txt | 51 | ewrk3.txt |
| 56 | - the Digital EtherWORKS 3 DE203/4/5 Ethernet driver | 52 | - the Digital EtherWORKS 3 DE203/4/5 Ethernet driver |
| 57 | filter.txt | 53 | filter.txt |
| @@ -104,8 +100,6 @@ tuntap.txt | |||
| 104 | - TUN/TAP device driver, allowing user space Rx/Tx of packets. | 100 | - TUN/TAP device driver, allowing user space Rx/Tx of packets. |
| 105 | vortex.txt | 101 | vortex.txt |
| 106 | - info on using 3Com Vortex (3c590, 3c592, 3c595, 3c597) Ethernet cards. | 102 | - info on using 3Com Vortex (3c590, 3c592, 3c595, 3c597) Ethernet cards. |
| 107 | wavelan.txt | ||
| 108 | - AT&T GIS (nee NCR) WaveLAN card: An Ethernet-like radio transceiver | ||
| 109 | x25.txt | 103 | x25.txt |
| 110 | - general info on X.25 development. | 104 | - general info on X.25 development. |
| 111 | x25-iface.txt | 105 | x25-iface.txt |
diff --git a/Documentation/networking/dns_resolver.txt b/Documentation/networking/dns_resolver.txt index aefd1e68180..04ca06325b0 100644 --- a/Documentation/networking/dns_resolver.txt +++ b/Documentation/networking/dns_resolver.txt | |||
| @@ -61,7 +61,6 @@ before the more general line given above as the first match is the one taken. | |||
| 61 | create dns_resolver foo:* * /usr/sbin/dns.foo %k | 61 | create dns_resolver foo:* * /usr/sbin/dns.foo %k |
| 62 | 62 | ||
| 63 | 63 | ||
| 64 | |||
| 65 | ===== | 64 | ===== |
| 66 | USAGE | 65 | USAGE |
| 67 | ===== | 66 | ===== |
| @@ -104,6 +103,14 @@ implemented in the module can be called after doing: | |||
| 104 | returned also. | 103 | returned also. |
| 105 | 104 | ||
| 106 | 105 | ||
| 106 | =============================== | ||
| 107 | READING DNS KEYS FROM USERSPACE | ||
| 108 | =============================== | ||
| 109 | |||
| 110 | Keys of dns_resolver type can be read from userspace using keyctl_read() or | ||
| 111 | "keyctl read/print/pipe". | ||
| 112 | |||
| 113 | |||
| 107 | ========= | 114 | ========= |
| 108 | MECHANISM | 115 | MECHANISM |
| 109 | ========= | 116 | ========= |
diff --git a/MAINTAINERS b/MAINTAINERS index 8afba6321e2..44fb1217798 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
| @@ -1010,6 +1010,15 @@ L: linux-samsung-soc@vger.kernel.org (moderated for non-subscribers) | |||
| 1010 | S: Maintained | 1010 | S: Maintained |
| 1011 | F: arch/arm/mach-s5p*/ | 1011 | F: arch/arm/mach-s5p*/ |
| 1012 | 1012 | ||
| 1013 | ARM/SAMSUNG MOBILE MACHINE SUPPORT | ||
| 1014 | M: Kyungmin Park <kyungmin.park@samsung.com> | ||
| 1015 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | ||
| 1016 | S: Maintained | ||
| 1017 | F: arch/arm/mach-s5pv210/mach-aquila.c | ||
| 1018 | F: arch/arm/mach-s5pv210/mach-goni.c | ||
| 1019 | F: arch/arm/mach-exynos4/mach-universal_c210.c | ||
| 1020 | F: arch/arm/mach-exynos4/mach-nuri.c | ||
| 1021 | |||
| 1013 | ARM/SAMSUNG S5P SERIES FIMC SUPPORT | 1022 | ARM/SAMSUNG S5P SERIES FIMC SUPPORT |
| 1014 | M: Kyungmin Park <kyungmin.park@samsung.com> | 1023 | M: Kyungmin Park <kyungmin.park@samsung.com> |
| 1015 | M: Sylwester Nawrocki <s.nawrocki@samsung.com> | 1024 | M: Sylwester Nawrocki <s.nawrocki@samsung.com> |
| @@ -1467,6 +1476,7 @@ F: include/net/bluetooth/ | |||
| 1467 | 1476 | ||
| 1468 | BONDING DRIVER | 1477 | BONDING DRIVER |
| 1469 | M: Jay Vosburgh <fubar@us.ibm.com> | 1478 | M: Jay Vosburgh <fubar@us.ibm.com> |
| 1479 | M: Andy Gospodarek <andy@greyhouse.net> | ||
| 1470 | L: netdev@vger.kernel.org | 1480 | L: netdev@vger.kernel.org |
| 1471 | W: http://sourceforge.net/projects/bonding/ | 1481 | W: http://sourceforge.net/projects/bonding/ |
| 1472 | S: Supported | 1482 | S: Supported |
| @@ -2033,7 +2043,7 @@ F: Documentation/scsi/dc395x.txt | |||
| 2033 | F: drivers/scsi/dc395x.* | 2043 | F: drivers/scsi/dc395x.* |
| 2034 | 2044 | ||
| 2035 | DCCP PROTOCOL | 2045 | DCCP PROTOCOL |
| 2036 | M: Arnaldo Carvalho de Melo <acme@ghostprotocols.net> | 2046 | M: Gerrit Renker <gerrit@erg.abdn.ac.uk> |
| 2037 | L: dccp@vger.kernel.org | 2047 | L: dccp@vger.kernel.org |
| 2038 | W: http://www.linuxfoundation.org/collaborate/workgroups/networking/dccp | 2048 | W: http://www.linuxfoundation.org/collaborate/workgroups/networking/dccp |
| 2039 | S: Maintained | 2049 | S: Maintained |
| @@ -3519,7 +3529,7 @@ F: drivers/hwmon/jc42.c | |||
| 3519 | F: Documentation/hwmon/jc42 | 3529 | F: Documentation/hwmon/jc42 |
| 3520 | 3530 | ||
| 3521 | JFS FILESYSTEM | 3531 | JFS FILESYSTEM |
| 3522 | M: Dave Kleikamp <shaggy@linux.vnet.ibm.com> | 3532 | M: Dave Kleikamp <shaggy@kernel.org> |
| 3523 | L: jfs-discussion@lists.sourceforge.net | 3533 | L: jfs-discussion@lists.sourceforge.net |
| 3524 | W: http://jfs.sourceforge.net/ | 3534 | W: http://jfs.sourceforge.net/ |
| 3525 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/shaggy/jfs-2.6.git | 3535 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/shaggy/jfs-2.6.git |
| @@ -4491,11 +4501,21 @@ S: Maintained | |||
| 4491 | F: arch/arm/*omap*/*clock* | 4501 | F: arch/arm/*omap*/*clock* |
| 4492 | 4502 | ||
| 4493 | OMAP POWER MANAGEMENT SUPPORT | 4503 | OMAP POWER MANAGEMENT SUPPORT |
| 4494 | M: Kevin Hilman <khilman@deeprootsystems.com> | 4504 | M: Kevin Hilman <khilman@ti.com> |
| 4495 | L: linux-omap@vger.kernel.org | 4505 | L: linux-omap@vger.kernel.org |
| 4496 | S: Maintained | 4506 | S: Maintained |
| 4497 | F: arch/arm/*omap*/*pm* | 4507 | F: arch/arm/*omap*/*pm* |
| 4498 | 4508 | ||
| 4509 | OMAP POWERDOMAIN/CLOCKDOMAIN SOC ADAPTATION LAYER SUPPORT | ||
| 4510 | M: Rajendra Nayak <rnayak@ti.com> | ||
| 4511 | M: Paul Walmsley <paul@pwsan.com> | ||
| 4512 | L: linux-omap@vger.kernel.org | ||
| 4513 | S: Maintained | ||
| 4514 | F: arch/arm/mach-omap2/powerdomain2xxx_3xxx.c | ||
| 4515 | F: arch/arm/mach-omap2/powerdomain44xx.c | ||
| 4516 | F: arch/arm/mach-omap2/clockdomain2xxx_3xxx.c | ||
| 4517 | F: arch/arm/mach-omap2/clockdomain44xx.c | ||
| 4518 | |||
| 4499 | OMAP AUDIO SUPPORT | 4519 | OMAP AUDIO SUPPORT |
| 4500 | M: Jarkko Nikula <jhnikula@gmail.com> | 4520 | M: Jarkko Nikula <jhnikula@gmail.com> |
| 4501 | L: alsa-devel@alsa-project.org (subscribers-only) | 4521 | L: alsa-devel@alsa-project.org (subscribers-only) |
| @@ -5171,6 +5191,7 @@ F: drivers/char/random.c | |||
| 5171 | 5191 | ||
| 5172 | RAPIDIO SUBSYSTEM | 5192 | RAPIDIO SUBSYSTEM |
| 5173 | M: Matt Porter <mporter@kernel.crashing.org> | 5193 | M: Matt Porter <mporter@kernel.crashing.org> |
| 5194 | M: Alexandre Bounine <alexandre.bounine@idt.com> | ||
| 5174 | S: Maintained | 5195 | S: Maintained |
| 5175 | F: drivers/rapidio/ | 5196 | F: drivers/rapidio/ |
| 5176 | 5197 | ||
| @@ -1,7 +1,7 @@ | |||
| 1 | VERSION = 2 | 1 | VERSION = 2 |
| 2 | PATCHLEVEL = 6 | 2 | PATCHLEVEL = 6 |
| 3 | SUBLEVEL = 38 | 3 | SUBLEVEL = 38 |
| 4 | EXTRAVERSION = -rc7 | 4 | EXTRAVERSION = -rc8 |
| 5 | NAME = Flesh-Eating Bats with Fangs | 5 | NAME = Flesh-Eating Bats with Fangs |
| 6 | 6 | ||
| 7 | # *DOCUMENTATION* | 7 | # *DOCUMENTATION* |
diff --git a/arch/alpha/Kconfig b/arch/alpha/Kconfig index 47f63d48014..cc31bec2e31 100644 --- a/arch/alpha/Kconfig +++ b/arch/alpha/Kconfig | |||
| @@ -11,6 +11,7 @@ config ALPHA | |||
| 11 | select HAVE_GENERIC_HARDIRQS | 11 | select HAVE_GENERIC_HARDIRQS |
| 12 | select GENERIC_IRQ_PROBE | 12 | select GENERIC_IRQ_PROBE |
| 13 | select AUTO_IRQ_AFFINITY if SMP | 13 | select AUTO_IRQ_AFFINITY if SMP |
| 14 | select GENERIC_HARDIRQS_NO_DEPRECATED | ||
| 14 | help | 15 | help |
| 15 | The Alpha is a 64-bit general-purpose processor designed and | 16 | The Alpha is a 64-bit general-purpose processor designed and |
| 16 | marketed by the Digital Equipment Corporation of blessed memory, | 17 | marketed by the Digital Equipment Corporation of blessed memory, |
diff --git a/arch/alpha/kernel/irq.c b/arch/alpha/kernel/irq.c index 9ab234f48dd..a19d6008229 100644 --- a/arch/alpha/kernel/irq.c +++ b/arch/alpha/kernel/irq.c | |||
| @@ -44,11 +44,16 @@ static char irq_user_affinity[NR_IRQS]; | |||
| 44 | 44 | ||
| 45 | int irq_select_affinity(unsigned int irq) | 45 | int irq_select_affinity(unsigned int irq) |
| 46 | { | 46 | { |
| 47 | struct irq_desc *desc = irq_to_desc[irq]; | 47 | struct irq_data *data = irq_get_irq_data(irq); |
| 48 | struct irq_chip *chip; | ||
| 48 | static int last_cpu; | 49 | static int last_cpu; |
| 49 | int cpu = last_cpu + 1; | 50 | int cpu = last_cpu + 1; |
| 50 | 51 | ||
| 51 | if (!desc || !get_irq_desc_chip(desc)->set_affinity || irq_user_affinity[irq]) | 52 | if (!data) |
| 53 | return 1; | ||
| 54 | chip = irq_data_get_irq_chip(data); | ||
| 55 | |||
| 56 | if (!chip->irq_set_affinity || irq_user_affinity[irq]) | ||
| 52 | return 1; | 57 | return 1; |
| 53 | 58 | ||
| 54 | while (!cpu_possible(cpu) || | 59 | while (!cpu_possible(cpu) || |
| @@ -56,8 +61,8 @@ int irq_select_affinity(unsigned int irq) | |||
| 56 | cpu = (cpu < (NR_CPUS-1) ? cpu + 1 : 0); | 61 | cpu = (cpu < (NR_CPUS-1) ? cpu + 1 : 0); |
| 57 | last_cpu = cpu; | 62 | last_cpu = cpu; |
| 58 | 63 | ||
| 59 | cpumask_copy(desc->affinity, cpumask_of(cpu)); | 64 | cpumask_copy(data->affinity, cpumask_of(cpu)); |
| 60 | get_irq_desc_chip(desc)->set_affinity(irq, cpumask_of(cpu)); | 65 | chip->irq_set_affinity(data, cpumask_of(cpu), false); |
| 61 | return 0; | 66 | return 0; |
| 62 | } | 67 | } |
| 63 | #endif /* CONFIG_SMP */ | 68 | #endif /* CONFIG_SMP */ |
diff --git a/arch/alpha/kernel/irq_alpha.c b/arch/alpha/kernel/irq_alpha.c index 2d0679b6093..411ca11d0a1 100644 --- a/arch/alpha/kernel/irq_alpha.c +++ b/arch/alpha/kernel/irq_alpha.c | |||
| @@ -228,14 +228,9 @@ struct irqaction timer_irqaction = { | |||
| 228 | void __init | 228 | void __init |
| 229 | init_rtc_irq(void) | 229 | init_rtc_irq(void) |
| 230 | { | 230 | { |
| 231 | struct irq_desc *desc = irq_to_desc(RTC_IRQ); | 231 | set_irq_chip_and_handler_name(RTC_IRQ, &no_irq_chip, |
| 232 | 232 | handle_simple_irq, "RTC"); | |
| 233 | if (desc) { | 233 | setup_irq(RTC_IRQ, &timer_irqaction); |
| 234 | desc->status |= IRQ_DISABLED; | ||
| 235 | set_irq_chip_and_handler_name(RTC_IRQ, &no_irq_chip, | ||
| 236 | handle_simple_irq, "RTC"); | ||
| 237 | setup_irq(RTC_IRQ, &timer_irqaction); | ||
| 238 | } | ||
| 239 | } | 234 | } |
| 240 | 235 | ||
| 241 | /* Dummy irqactions. */ | 236 | /* Dummy irqactions. */ |
diff --git a/arch/alpha/kernel/irq_i8259.c b/arch/alpha/kernel/irq_i8259.c index 956ea0ed169..c7cc9813e45 100644 --- a/arch/alpha/kernel/irq_i8259.c +++ b/arch/alpha/kernel/irq_i8259.c | |||
| @@ -33,10 +33,10 @@ i8259_update_irq_hw(unsigned int irq, unsigned long mask) | |||
| 33 | } | 33 | } |
| 34 | 34 | ||
| 35 | inline void | 35 | inline void |
| 36 | i8259a_enable_irq(unsigned int irq) | 36 | i8259a_enable_irq(struct irq_data *d) |
| 37 | { | 37 | { |
| 38 | spin_lock(&i8259_irq_lock); | 38 | spin_lock(&i8259_irq_lock); |
| 39 | i8259_update_irq_hw(irq, cached_irq_mask &= ~(1 << irq)); | 39 | i8259_update_irq_hw(d->irq, cached_irq_mask &= ~(1 << d->irq)); |
| 40 | spin_unlock(&i8259_irq_lock); | 40 | spin_unlock(&i8259_irq_lock); |
| 41 | } | 41 | } |
| 42 | 42 | ||
| @@ -47,16 +47,18 @@ __i8259a_disable_irq(unsigned int irq) | |||
| 47 | } | 47 | } |
| 48 | 48 | ||
| 49 | void | 49 | void |
| 50 | i8259a_disable_irq(unsigned int irq) | 50 | i8259a_disable_irq(struct irq_data *d) |
| 51 | { | 51 | { |
| 52 | spin_lock(&i8259_irq_lock); | 52 | spin_lock(&i8259_irq_lock); |
| 53 | __i8259a_disable_irq(irq); | 53 | __i8259a_disable_irq(d->irq); |
| 54 | spin_unlock(&i8259_irq_lock); | 54 | spin_unlock(&i8259_irq_lock); |
| 55 | } | 55 | } |
| 56 | 56 | ||
| 57 | void | 57 | void |
| 58 | i8259a_mask_and_ack_irq(unsigned int irq) | 58 | i8259a_mask_and_ack_irq(struct irq_data *d) |
| 59 | { | 59 | { |
| 60 | unsigned int irq = d->irq; | ||
| 61 | |||
| 60 | spin_lock(&i8259_irq_lock); | 62 | spin_lock(&i8259_irq_lock); |
| 61 | __i8259a_disable_irq(irq); | 63 | __i8259a_disable_irq(irq); |
| 62 | 64 | ||
| @@ -71,9 +73,9 @@ i8259a_mask_and_ack_irq(unsigned int irq) | |||
| 71 | 73 | ||
| 72 | struct irq_chip i8259a_irq_type = { | 74 | struct irq_chip i8259a_irq_type = { |
| 73 | .name = "XT-PIC", | 75 | .name = "XT-PIC", |
| 74 | .unmask = i8259a_enable_irq, | 76 | .irq_unmask = i8259a_enable_irq, |
| 75 | .mask = i8259a_disable_irq, | 77 | .irq_mask = i8259a_disable_irq, |
| 76 | .mask_ack = i8259a_mask_and_ack_irq, | 78 | .irq_mask_ack = i8259a_mask_and_ack_irq, |
| 77 | }; | 79 | }; |
| 78 | 80 | ||
| 79 | void __init | 81 | void __init |
diff --git a/arch/alpha/kernel/irq_impl.h b/arch/alpha/kernel/irq_impl.h index b63ccd7386f..d507a234b05 100644 --- a/arch/alpha/kernel/irq_impl.h +++ b/arch/alpha/kernel/irq_impl.h | |||
| @@ -31,11 +31,9 @@ extern void init_rtc_irq(void); | |||
| 31 | 31 | ||
| 32 | extern void common_init_isa_dma(void); | 32 | extern void common_init_isa_dma(void); |
| 33 | 33 | ||
| 34 | extern void i8259a_enable_irq(unsigned int); | 34 | extern void i8259a_enable_irq(struct irq_data *d); |
| 35 | extern void i8259a_disable_irq(unsigned int); | 35 | extern void i8259a_disable_irq(struct irq_data *d); |
| 36 | extern void i8259a_mask_and_ack_irq(unsigned int); | 36 | extern void i8259a_mask_and_ack_irq(struct irq_data *d); |
| 37 | extern unsigned int i8259a_startup_irq(unsigned int); | ||
| 38 | extern void i8259a_end_irq(unsigned int); | ||
| 39 | extern struct irq_chip i8259a_irq_type; | 37 | extern struct irq_chip i8259a_irq_type; |
| 40 | extern void init_i8259a_irqs(void); | 38 | extern void init_i8259a_irqs(void); |
| 41 | 39 | ||
diff --git a/arch/alpha/kernel/irq_pyxis.c b/arch/alpha/kernel/irq_pyxis.c index 2863458c853..b30227fa7f5 100644 --- a/arch/alpha/kernel/irq_pyxis.c +++ b/arch/alpha/kernel/irq_pyxis.c | |||
| @@ -29,21 +29,21 @@ pyxis_update_irq_hw(unsigned long mask) | |||
| 29 | } | 29 | } |
| 30 | 30 | ||
| 31 | static inline void | 31 | static inline void |
| 32 | pyxis_enable_irq(unsigned int irq) | 32 | pyxis_enable_irq(struct irq_data *d) |
| 33 | { | 33 | { |
| 34 | pyxis_update_irq_hw(cached_irq_mask |= 1UL << (irq - 16)); | 34 | pyxis_update_irq_hw(cached_irq_mask |= 1UL << (d->irq - 16)); |
| 35 | } | 35 | } |
| 36 | 36 | ||
| 37 | static void | 37 | static void |
| 38 | pyxis_disable_irq(unsigned int irq) | 38 | pyxis_disable_irq(struct irq_data *d) |
| 39 | { | 39 | { |
| 40 | pyxis_update_irq_hw(cached_irq_mask &= ~(1UL << (irq - 16))); | 40 | pyxis_update_irq_hw(cached_irq_mask &= ~(1UL << (d->irq - 16))); |
| 41 | } | 41 | } |
| 42 | 42 | ||
| 43 | static void | 43 | static void |
| 44 | pyxis_mask_and_ack_irq(unsigned int irq) | 44 | pyxis_mask_and_ack_irq(struct irq_data *d) |
| 45 | { | 45 | { |
| 46 | unsigned long bit = 1UL << (irq - 16); | 46 | unsigned long bit = 1UL << (d->irq - 16); |
| 47 | unsigned long mask = cached_irq_mask &= ~bit; | 47 | unsigned long mask = cached_irq_mask &= ~bit; |
| 48 | 48 | ||
| 49 | /* Disable the interrupt. */ | 49 | /* Disable the interrupt. */ |
| @@ -58,9 +58,9 @@ pyxis_mask_and_ack_irq(unsigned int irq) | |||
| 58 | 58 | ||
| 59 | static struct irq_chip pyxis_irq_type = { | 59 | static struct irq_chip pyxis_irq_type = { |
| 60 | .name = "PYXIS", | 60 | .name = "PYXIS", |
| 61 | .mask_ack = pyxis_mask_and_ack_irq, | 61 | .irq_mask_ack = pyxis_mask_and_ack_irq, |
| 62 | .mask = pyxis_disable_irq, | 62 | .irq_mask = pyxis_disable_irq, |
| 63 | .unmask = pyxis_enable_irq, | 63 | .irq_unmask = pyxis_enable_irq, |
| 64 | }; | 64 | }; |
| 65 | 65 | ||
| 66 | void | 66 | void |
| @@ -103,7 +103,7 @@ init_pyxis_irqs(unsigned long ignore_mask) | |||
| 103 | if ((ignore_mask >> i) & 1) | 103 | if ((ignore_mask >> i) & 1) |
| 104 | continue; | 104 | continue; |
| 105 | set_irq_chip_and_handler(i, &pyxis_irq_type, handle_level_irq); | 105 | set_irq_chip_and_handler(i, &pyxis_irq_type, handle_level_irq); |
| 106 | irq_to_desc(i)->status |= IRQ_LEVEL; | 106 | irq_set_status_flags(i, IRQ_LEVEL); |
| 107 | } | 107 | } |
| 108 | 108 | ||
| 109 | setup_irq(16+7, &isa_cascade_irqaction); | 109 | setup_irq(16+7, &isa_cascade_irqaction); |
diff --git a/arch/alpha/kernel/irq_srm.c b/arch/alpha/kernel/irq_srm.c index 0e57e828b41..82a47bba41c 100644 --- a/arch/alpha/kernel/irq_srm.c +++ b/arch/alpha/kernel/irq_srm.c | |||
| @@ -18,27 +18,27 @@ | |||
| 18 | DEFINE_SPINLOCK(srm_irq_lock); | 18 | DEFINE_SPINLOCK(srm_irq_lock); |
| 19 | 19 | ||
| 20 | static inline void | 20 | static inline void |
| 21 | srm_enable_irq(unsigned int irq) | 21 | srm_enable_irq(struct irq_data *d) |
| 22 | { | 22 | { |
| 23 | spin_lock(&srm_irq_lock); | 23 | spin_lock(&srm_irq_lock); |
| 24 | cserve_ena(irq - 16); | 24 | cserve_ena(d->irq - 16); |
| 25 | spin_unlock(&srm_irq_lock); | 25 | spin_unlock(&srm_irq_lock); |
| 26 | } | 26 | } |
| 27 | 27 | ||
| 28 | static void | 28 | static void |
| 29 | srm_disable_irq(unsigned int irq) | 29 | srm_disable_irq(struct irq_data *d) |
| 30 | { | 30 | { |
| 31 | spin_lock(&srm_irq_lock); | 31 | spin_lock(&srm_irq_lock); |
| 32 | cserve_dis(irq - 16); | 32 | cserve_dis(d->irq - 16); |
| 33 | spin_unlock(&srm_irq_lock); | 33 | spin_unlock(&srm_irq_lock); |
| 34 | } | 34 | } |
| 35 | 35 | ||
| 36 | /* Handle interrupts from the SRM, assuming no additional weirdness. */ | 36 | /* Handle interrupts from the SRM, assuming no additional weirdness. */ |
| 37 | static struct irq_chip srm_irq_type = { | 37 | static struct irq_chip srm_irq_type = { |
| 38 | .name = "SRM", | 38 | .name = "SRM", |
| 39 | .unmask = srm_enable_irq, | 39 | .irq_unmask = srm_enable_irq, |
| 40 | .mask = srm_disable_irq, | 40 | .irq_mask = srm_disable_irq, |
| 41 | .mask_ack = srm_disable_irq, | 41 | .irq_mask_ack = srm_disable_irq, |
| 42 | }; | 42 | }; |
| 43 | 43 | ||
| 44 | void __init | 44 | void __init |
| @@ -52,7 +52,7 @@ init_srm_irqs(long max, unsigned long ignore_mask) | |||
| 52 | if (i < 64 && ((ignore_mask >> i) & 1)) | 52 | if (i < 64 && ((ignore_mask >> i) & 1)) |
| 53 | continue; | 53 | continue; |
| 54 | set_irq_chip_and_handler(i, &srm_irq_type, handle_level_irq); | 54 | set_irq_chip_and_handler(i, &srm_irq_type, handle_level_irq); |
| 55 | irq_to_desc(i)->status |= IRQ_LEVEL; | 55 | irq_set_status_flags(i, IRQ_LEVEL); |
| 56 | } | 56 | } |
| 57 | } | 57 | } |
| 58 | 58 | ||
diff --git a/arch/alpha/kernel/sys_alcor.c b/arch/alpha/kernel/sys_alcor.c index 7bef6176823..88d95e872f5 100644 --- a/arch/alpha/kernel/sys_alcor.c +++ b/arch/alpha/kernel/sys_alcor.c | |||
| @@ -44,31 +44,31 @@ alcor_update_irq_hw(unsigned long mask) | |||
| 44 | } | 44 | } |
| 45 | 45 | ||
| 46 | static inline void | 46 | static inline void |
| 47 | alcor_enable_irq(unsigned int irq) | 47 | alcor_enable_irq(struct irq_data *d) |
| 48 | { | 48 | { |
| 49 | alcor_update_irq_hw(cached_irq_mask |= 1UL << (irq - 16)); | 49 | alcor_update_irq_hw(cached_irq_mask |= 1UL << (d->irq - 16)); |
| 50 | } | 50 | } |
| 51 | 51 | ||
| 52 | static void | 52 | static void |
| 53 | alcor_disable_irq(unsigned int irq) | 53 | alcor_disable_irq(struct irq_data *d) |
| 54 | { | 54 | { |
| 55 | alcor_update_irq_hw(cached_irq_mask &= ~(1UL << (irq - 16))); | 55 | alcor_update_irq_hw(cached_irq_mask &= ~(1UL << (d->irq - 16))); |
| 56 | } | 56 | } |
| 57 | 57 | ||
| 58 | static void | 58 | static void |
| 59 | alcor_mask_and_ack_irq(unsigned int irq) | 59 | alcor_mask_and_ack_irq(struct irq_data *d) |
| 60 | { | 60 | { |
| 61 | alcor_disable_irq(irq); | 61 | alcor_disable_irq(d); |
| 62 | 62 | ||
| 63 | /* On ALCOR/XLT, need to dismiss interrupt via GRU. */ | 63 | /* On ALCOR/XLT, need to dismiss interrupt via GRU. */ |
| 64 | *(vuip)GRU_INT_CLEAR = 1 << (irq - 16); mb(); | 64 | *(vuip)GRU_INT_CLEAR = 1 << (d->irq - 16); mb(); |
| 65 | *(vuip)GRU_INT_CLEAR = 0; mb(); | 65 | *(vuip)GRU_INT_CLEAR = 0; mb(); |
| 66 | } | 66 | } |
| 67 | 67 | ||
| 68 | static void | 68 | static void |
| 69 | alcor_isa_mask_and_ack_irq(unsigned int irq) | 69 | alcor_isa_mask_and_ack_irq(struct irq_data *d) |
| 70 | { | 70 | { |
| 71 | i8259a_mask_and_ack_irq(irq); | 71 | i8259a_mask_and_ack_irq(d); |
| 72 | 72 | ||
| 73 | /* On ALCOR/XLT, need to dismiss interrupt via GRU. */ | 73 | /* On ALCOR/XLT, need to dismiss interrupt via GRU. */ |
| 74 | *(vuip)GRU_INT_CLEAR = 0x80000000; mb(); | 74 | *(vuip)GRU_INT_CLEAR = 0x80000000; mb(); |
| @@ -77,9 +77,9 @@ alcor_isa_mask_and_ack_irq(unsigned int irq) | |||
| 77 | 77 | ||
| 78 | static struct irq_chip alcor_irq_type = { | 78 | static struct irq_chip alcor_irq_type = { |
| 79 | .name = "ALCOR", | 79 | .name = "ALCOR", |
| 80 | .unmask = alcor_enable_irq, | 80 | .irq_unmask = alcor_enable_irq, |
| 81 | .mask = alcor_disable_irq, | 81 | .irq_mask = alcor_disable_irq, |
| 82 | .mask_ack = alcor_mask_and_ack_irq, | 82 | .irq_mask_ack = alcor_mask_and_ack_irq, |
| 83 | }; | 83 | }; |
| 84 | 84 | ||
| 85 | static void | 85 | static void |
| @@ -126,9 +126,9 @@ alcor_init_irq(void) | |||
| 126 | if (i >= 16+20 && i <= 16+30) | 126 | if (i >= 16+20 && i <= 16+30) |
| 127 | continue; | 127 | continue; |
| 128 | set_irq_chip_and_handler(i, &alcor_irq_type, handle_level_irq); | 128 | set_irq_chip_and_handler(i, &alcor_irq_type, handle_level_irq); |
| 129 | irq_to_desc(i)->status |= IRQ_LEVEL; | 129 | irq_set_status_flags(i, IRQ_LEVEL); |
| 130 | } | 130 | } |
| 131 | i8259a_irq_type.ack = alcor_isa_mask_and_ack_irq; | 131 | i8259a_irq_type.irq_ack = alcor_isa_mask_and_ack_irq; |
| 132 | 132 | ||
| 133 | init_i8259a_irqs(); | 133 | init_i8259a_irqs(); |
| 134 | common_init_isa_dma(); | 134 | common_init_isa_dma(); |
diff --git a/arch/alpha/kernel/sys_cabriolet.c b/arch/alpha/kernel/sys_cabriolet.c index b0c916493ae..57eb6307bc2 100644 --- a/arch/alpha/kernel/sys_cabriolet.c +++ b/arch/alpha/kernel/sys_cabriolet.c | |||
| @@ -46,22 +46,22 @@ cabriolet_update_irq_hw(unsigned int irq, unsigned long mask) | |||
| 46 | } | 46 | } |
| 47 | 47 | ||
| 48 | static inline void | 48 | static inline void |
| 49 | cabriolet_enable_irq(unsigned int irq) | 49 | cabriolet_enable_irq(struct irq_data *d) |
| 50 | { | 50 | { |
| 51 | cabriolet_update_irq_hw(irq, cached_irq_mask &= ~(1UL << irq)); | 51 | cabriolet_update_irq_hw(d->irq, cached_irq_mask &= ~(1UL << d->irq)); |
| 52 | } | 52 | } |
| 53 | 53 | ||
| 54 | static void | 54 | static void |
| 55 | cabriolet_disable_irq(unsigned int irq) | 55 | cabriolet_disable_irq(struct irq_data *d) |
| 56 | { | 56 | { |
| 57 | cabriolet_update_irq_hw(irq, cached_irq_mask |= 1UL << irq); | 57 | cabriolet_update_irq_hw(d->irq, cached_irq_mask |= 1UL << d->irq); |
| 58 | } | 58 | } |
| 59 | 59 | ||
| 60 | static struct irq_chip cabriolet_irq_type = { | 60 | static struct irq_chip cabriolet_irq_type = { |
| 61 | .name = "CABRIOLET", | 61 | .name = "CABRIOLET", |
| 62 | .unmask = cabriolet_enable_irq, | 62 | .irq_unmask = cabriolet_enable_irq, |
| 63 | .mask = cabriolet_disable_irq, | 63 | .irq_mask = cabriolet_disable_irq, |
| 64 | .mask_ack = cabriolet_disable_irq, | 64 | .irq_mask_ack = cabriolet_disable_irq, |
| 65 | }; | 65 | }; |
| 66 | 66 | ||
| 67 | static void | 67 | static void |
| @@ -107,7 +107,7 @@ common_init_irq(void (*srm_dev_int)(unsigned long v)) | |||
| 107 | for (i = 16; i < 35; ++i) { | 107 | for (i = 16; i < 35; ++i) { |
| 108 | set_irq_chip_and_handler(i, &cabriolet_irq_type, | 108 | set_irq_chip_and_handler(i, &cabriolet_irq_type, |
| 109 | handle_level_irq); | 109 | handle_level_irq); |
| 110 | irq_to_desc(i)->status |= IRQ_LEVEL; | 110 | irq_set_status_flags(i, IRQ_LEVEL); |
| 111 | } | 111 | } |
| 112 | } | 112 | } |
| 113 | 113 | ||
diff --git a/arch/alpha/kernel/sys_dp264.c b/arch/alpha/kernel/sys_dp264.c index edad5f759cc..481df4ecb65 100644 --- a/arch/alpha/kernel/sys_dp264.c +++ b/arch/alpha/kernel/sys_dp264.c | |||
| @@ -98,37 +98,37 @@ tsunami_update_irq_hw(unsigned long mask) | |||
| 98 | } | 98 | } |
| 99 | 99 | ||
| 100 | static void | 100 | static void |
| 101 | dp264_enable_irq(unsigned int irq) | 101 | dp264_enable_irq(struct irq_data *d) |
| 102 | { | 102 | { |
| 103 | spin_lock(&dp264_irq_lock); | 103 | spin_lock(&dp264_irq_lock); |
| 104 | cached_irq_mask |= 1UL << irq; | 104 | cached_irq_mask |= 1UL << d->irq; |
| 105 | tsunami_update_irq_hw(cached_irq_mask); | 105 | tsunami_update_irq_hw(cached_irq_mask); |
| 106 | spin_unlock(&dp264_irq_lock); | 106 | spin_unlock(&dp264_irq_lock); |
| 107 | } | 107 | } |
| 108 | 108 | ||
| 109 | static void | 109 | static void |
| 110 | dp264_disable_irq(unsigned int irq) | 110 | dp264_disable_irq(struct irq_data *d) |
| 111 | { | 111 | { |
| 112 | spin_lock(&dp264_irq_lock); | 112 | spin_lock(&dp264_irq_lock); |
| 113 | cached_irq_mask &= ~(1UL << irq); | 113 | cached_irq_mask &= ~(1UL << d->irq); |
| 114 | tsunami_update_irq_hw(cached_irq_mask); | 114 | tsunami_update_irq_hw(cached_irq_mask); |
| 115 | spin_unlock(&dp264_irq_lock); | 115 | spin_unlock(&dp264_irq_lock); |
| 116 | } | 116 | } |
| 117 | 117 | ||
| 118 | static void | 118 | static void |
| 119 | clipper_enable_irq(unsigned int irq) | 119 | clipper_enable_irq(struct irq_data *d) |
| 120 | { | 120 | { |
| 121 | spin_lock(&dp264_irq_lock); | 121 | spin_lock(&dp264_irq_lock); |
| 122 | cached_irq_mask |= 1UL << (irq - 16); | 122 | cached_irq_mask |= 1UL << (d->irq - 16); |
| 123 | tsunami_update_irq_hw(cached_irq_mask); | 123 | tsunami_update_irq_hw(cached_irq_mask); |
| 124 | spin_unlock(&dp264_irq_lock); | 124 | spin_unlock(&dp264_irq_lock); |
| 125 | } | 125 | } |
| 126 | 126 | ||
| 127 | static void | 127 | static void |
| 128 | clipper_disable_irq(unsigned int irq) | 128 | clipper_disable_irq(struct irq_data *d) |
| 129 | { | 129 | { |
| 130 | spin_lock(&dp264_irq_lock); | 130 | spin_lock(&dp264_irq_lock); |
| 131 | cached_irq_mask &= ~(1UL << (irq - 16)); | 131 | cached_irq_mask &= ~(1UL << (d->irq - 16)); |
| 132 | tsunami_update_irq_hw(cached_irq_mask); | 132 | tsunami_update_irq_hw(cached_irq_mask); |
| 133 | spin_unlock(&dp264_irq_lock); | 133 | spin_unlock(&dp264_irq_lock); |
| 134 | } | 134 | } |
| @@ -149,10 +149,11 @@ cpu_set_irq_affinity(unsigned int irq, cpumask_t affinity) | |||
| 149 | } | 149 | } |
| 150 | 150 | ||
| 151 | static int | 151 | static int |
| 152 | dp264_set_affinity(unsigned int irq, const struct cpumask *affinity) | 152 | dp264_set_affinity(struct irq_data *d, const struct cpumask *affinity, |
| 153 | { | 153 | bool force) |
| 154 | { | ||
| 154 | spin_lock(&dp264_irq_lock); | 155 | spin_lock(&dp264_irq_lock); |
| 155 | cpu_set_irq_affinity(irq, *affinity); | 156 | cpu_set_irq_affinity(d->irq, *affinity); |
| 156 | tsunami_update_irq_hw(cached_irq_mask); | 157 | tsunami_update_irq_hw(cached_irq_mask); |
| 157 | spin_unlock(&dp264_irq_lock); | 158 | spin_unlock(&dp264_irq_lock); |
| 158 | 159 | ||
| @@ -160,10 +161,11 @@ dp264_set_affinity(unsigned int irq, const struct cpumask *affinity) | |||
| 160 | } | 161 | } |
| 161 | 162 | ||
| 162 | static int | 163 | static int |
| 163 | clipper_set_affinity(unsigned int irq, const struct cpumask *affinity) | 164 | clipper_set_affinity(struct irq_data *d, const struct cpumask *affinity, |
| 164 | { | 165 | bool force) |
| 166 | { | ||
| 165 | spin_lock(&dp264_irq_lock); | 167 | spin_lock(&dp264_irq_lock); |
| 166 | cpu_set_irq_affinity(irq - 16, *affinity); | 168 | cpu_set_irq_affinity(d->irq - 16, *affinity); |
| 167 | tsunami_update_irq_hw(cached_irq_mask); | 169 | tsunami_update_irq_hw(cached_irq_mask); |
| 168 | spin_unlock(&dp264_irq_lock); | 170 | spin_unlock(&dp264_irq_lock); |
| 169 | 171 | ||
| @@ -171,19 +173,19 @@ clipper_set_affinity(unsigned int irq, const struct cpumask *affinity) | |||
| 171 | } | 173 | } |
| 172 | 174 | ||
| 173 | static struct irq_chip dp264_irq_type = { | 175 | static struct irq_chip dp264_irq_type = { |
| 174 | .name = "DP264", | 176 | .name = "DP264", |
| 175 | .unmask = dp264_enable_irq, | 177 | .irq_unmask = dp264_enable_irq, |
| 176 | .mask = dp264_disable_irq, | 178 | .irq_mask = dp264_disable_irq, |
| 177 | .mask_ack = dp264_disable_irq, | 179 | .irq_mask_ack = dp264_disable_irq, |
| 178 | .set_affinity = dp264_set_affinity, | 180 | .irq_set_affinity = dp264_set_affinity, |
| 179 | }; | 181 | }; |
| 180 | 182 | ||
| 181 | static struct irq_chip clipper_irq_type = { | 183 | static struct irq_chip clipper_irq_type = { |
| 182 | .name = "CLIPPER", | 184 | .name = "CLIPPER", |
| 183 | .unmask = clipper_enable_irq, | 185 | .irq_unmask = clipper_enable_irq, |
| 184 | .mask = clipper_disable_irq, | 186 | .irq_mask = clipper_disable_irq, |
| 185 | .mask_ack = clipper_disable_irq, | 187 | .irq_mask_ack = clipper_disable_irq, |
| 186 | .set_affinity = clipper_set_affinity, | 188 | .irq_set_affinity = clipper_set_affinity, |
| 187 | }; | 189 | }; |
| 188 | 190 | ||
| 189 | static void | 191 | static void |
| @@ -268,8 +270,8 @@ init_tsunami_irqs(struct irq_chip * ops, int imin, int imax) | |||
| 268 | { | 270 | { |
| 269 | long i; | 271 | long i; |
| 270 | for (i = imin; i <= imax; ++i) { | 272 | for (i = imin; i <= imax; ++i) { |
| 271 | irq_to_desc(i)->status |= IRQ_LEVEL; | ||
| 272 | set_irq_chip_and_handler(i, ops, handle_level_irq); | 273 | set_irq_chip_and_handler(i, ops, handle_level_irq); |
| 274 | irq_set_status_flags(i, IRQ_LEVEL); | ||
| 273 | } | 275 | } |
| 274 | } | 276 | } |
| 275 | 277 | ||
diff --git a/arch/alpha/kernel/sys_eb64p.c b/arch/alpha/kernel/sys_eb64p.c index ae5f29d127b..402e908ffb3 100644 --- a/arch/alpha/kernel/sys_eb64p.c +++ b/arch/alpha/kernel/sys_eb64p.c | |||
| @@ -44,22 +44,22 @@ eb64p_update_irq_hw(unsigned int irq, unsigned long mask) | |||
| 44 | } | 44 | } |
| 45 | 45 | ||
| 46 | static inline void | 46 | static inline void |
| 47 | eb64p_enable_irq(unsigned int irq) | 47 | eb64p_enable_irq(struct irq_data *d) |
| 48 | { | 48 | { |
| 49 | eb64p_update_irq_hw(irq, cached_irq_mask &= ~(1 << irq)); | 49 | eb64p_update_irq_hw(d->irq, cached_irq_mask &= ~(1 << d->irq)); |
| 50 | } | 50 | } |
| 51 | 51 | ||
| 52 | static void | 52 | static void |
| 53 | eb64p_disable_irq(unsigned int irq) | 53 | eb64p_disable_irq(struct irq_data *d) |
| 54 | { | 54 | { |
| 55 | eb64p_update_irq_hw(irq, cached_irq_mask |= 1 << irq); | 55 | eb64p_update_irq_hw(d->irq, cached_irq_mask |= 1 << d->irq); |
| 56 | } | 56 | } |
| 57 | 57 | ||
| 58 | static struct irq_chip eb64p_irq_type = { | 58 | static struct irq_chip eb64p_irq_type = { |
| 59 | .name = "EB64P", | 59 | .name = "EB64P", |
| 60 | .unmask = eb64p_enable_irq, | 60 | .irq_unmask = eb64p_enable_irq, |
| 61 | .mask = eb64p_disable_irq, | 61 | .irq_mask = eb64p_disable_irq, |
| 62 | .mask_ack = eb64p_disable_irq, | 62 | .irq_mask_ack = eb64p_disable_irq, |
| 63 | }; | 63 | }; |
| 64 | 64 | ||
| 65 | static void | 65 | static void |
| @@ -118,9 +118,9 @@ eb64p_init_irq(void) | |||
| 118 | init_i8259a_irqs(); | 118 | init_i8259a_irqs(); |
| 119 | 119 | ||
| 120 | for (i = 16; i < 32; ++i) { | 120 | for (i = 16; i < 32; ++i) { |
| 121 | irq_to_desc(i)->status |= IRQ_LEVEL; | ||
| 122 | set_irq_chip_and_handler(i, &eb64p_irq_type, handle_level_irq); | 121 | set_irq_chip_and_handler(i, &eb64p_irq_type, handle_level_irq); |
| 123 | } | 122 | irq_set_status_flags(i, IRQ_LEVEL); |
| 123 | } | ||
| 124 | 124 | ||
| 125 | common_init_isa_dma(); | 125 | common_init_isa_dma(); |
| 126 | setup_irq(16+5, &isa_cascade_irqaction); | 126 | setup_irq(16+5, &isa_cascade_irqaction); |
diff --git a/arch/alpha/kernel/sys_eiger.c b/arch/alpha/kernel/sys_eiger.c index 1121bc5c6c6..0b44a54c152 100644 --- a/arch/alpha/kernel/sys_eiger.c +++ b/arch/alpha/kernel/sys_eiger.c | |||
| @@ -51,16 +51,18 @@ eiger_update_irq_hw(unsigned long irq, unsigned long mask) | |||
| 51 | } | 51 | } |
| 52 | 52 | ||
| 53 | static inline void | 53 | static inline void |
| 54 | eiger_enable_irq(unsigned int irq) | 54 | eiger_enable_irq(struct irq_data *d) |
| 55 | { | 55 | { |
| 56 | unsigned int irq = d->irq; | ||
| 56 | unsigned long mask; | 57 | unsigned long mask; |
| 57 | mask = (cached_irq_mask[irq >= 64] &= ~(1UL << (irq & 63))); | 58 | mask = (cached_irq_mask[irq >= 64] &= ~(1UL << (irq & 63))); |
| 58 | eiger_update_irq_hw(irq, mask); | 59 | eiger_update_irq_hw(irq, mask); |
| 59 | } | 60 | } |
| 60 | 61 | ||
| 61 | static void | 62 | static void |
| 62 | eiger_disable_irq(unsigned int irq) | 63 | eiger_disable_irq(struct irq_data *d) |
| 63 | { | 64 | { |
| 65 | unsigned int irq = d->irq; | ||
| 64 | unsigned long mask; | 66 | unsigned long mask; |
| 65 | mask = (cached_irq_mask[irq >= 64] |= 1UL << (irq & 63)); | 67 | mask = (cached_irq_mask[irq >= 64] |= 1UL << (irq & 63)); |
| 66 | eiger_update_irq_hw(irq, mask); | 68 | eiger_update_irq_hw(irq, mask); |
| @@ -68,9 +70,9 @@ eiger_disable_irq(unsigned int irq) | |||
| 68 | 70 | ||
| 69 | static struct irq_chip eiger_irq_type = { | 71 | static struct irq_chip eiger_irq_type = { |
| 70 | .name = "EIGER", | 72 | .name = "EIGER", |
| 71 | .unmask = eiger_enable_irq, | 73 | .irq_unmask = eiger_enable_irq, |
| 72 | .mask = eiger_disable_irq, | 74 | .irq_mask = eiger_disable_irq, |
| 73 | .mask_ack = eiger_disable_irq, | 75 | .irq_mask_ack = eiger_disable_irq, |
| 74 | }; | 76 | }; |
| 75 | 77 | ||
| 76 | static void | 78 | static void |
| @@ -136,8 +138,8 @@ eiger_init_irq(void) | |||
| 136 | init_i8259a_irqs(); | 138 | init_i8259a_irqs(); |
| 137 | 139 | ||
| 138 | for (i = 16; i < 128; ++i) { | 140 | for (i = 16; i < 128; ++i) { |
| 139 | irq_to_desc(i)->status |= IRQ_LEVEL; | ||
| 140 | set_irq_chip_and_handler(i, &eiger_irq_type, handle_level_irq); | 141 | set_irq_chip_and_handler(i, &eiger_irq_type, handle_level_irq); |
| 142 | irq_set_status_flags(i, IRQ_LEVEL); | ||
| 141 | } | 143 | } |
| 142 | } | 144 | } |
| 143 | 145 | ||
diff --git a/arch/alpha/kernel/sys_jensen.c b/arch/alpha/kernel/sys_jensen.c index 34f55e03d33..00341b75c8b 100644 --- a/arch/alpha/kernel/sys_jensen.c +++ b/arch/alpha/kernel/sys_jensen.c | |||
| @@ -63,34 +63,34 @@ | |||
| 63 | */ | 63 | */ |
| 64 | 64 | ||
| 65 | static void | 65 | static void |
| 66 | jensen_local_enable(unsigned int irq) | 66 | jensen_local_enable(struct irq_data *d) |
| 67 | { | 67 | { |
| 68 | /* the parport is really hw IRQ 1, silly Jensen. */ | 68 | /* the parport is really hw IRQ 1, silly Jensen. */ |
| 69 | if (irq == 7) | 69 | if (d->irq == 7) |
| 70 | i8259a_enable_irq(1); | 70 | i8259a_enable_irq(d); |
| 71 | } | 71 | } |
| 72 | 72 | ||
| 73 | static void | 73 | static void |
| 74 | jensen_local_disable(unsigned int irq) | 74 | jensen_local_disable(struct irq_data *d) |
| 75 | { | 75 | { |
| 76 | /* the parport is really hw IRQ 1, silly Jensen. */ | 76 | /* the parport is really hw IRQ 1, silly Jensen. */ |
| 77 | if (irq == 7) | 77 | if (d->irq == 7) |
| 78 | i8259a_disable_irq(1); | 78 | i8259a_disable_irq(d); |
| 79 | } | 79 | } |
| 80 | 80 | ||
| 81 | static void | 81 | static void |
| 82 | jensen_local_mask_ack(unsigned int irq) | 82 | jensen_local_mask_ack(struct irq_data *d) |
| 83 | { | 83 | { |
| 84 | /* the parport is really hw IRQ 1, silly Jensen. */ | 84 | /* the parport is really hw IRQ 1, silly Jensen. */ |
| 85 | if (irq == 7) | 85 | if (d->irq == 7) |
| 86 | i8259a_mask_and_ack_irq(1); | 86 | i8259a_mask_and_ack_irq(d); |
| 87 | } | 87 | } |
| 88 | 88 | ||
| 89 | static struct irq_chip jensen_local_irq_type = { | 89 | static struct irq_chip jensen_local_irq_type = { |
| 90 | .name = "LOCAL", | 90 | .name = "LOCAL", |
| 91 | .unmask = jensen_local_enable, | 91 | .irq_unmask = jensen_local_enable, |
| 92 | .mask = jensen_local_disable, | 92 | .irq_mask = jensen_local_disable, |
| 93 | .mask_ack = jensen_local_mask_ack, | 93 | .irq_mask_ack = jensen_local_mask_ack, |
| 94 | }; | 94 | }; |
| 95 | 95 | ||
| 96 | static void | 96 | static void |
diff --git a/arch/alpha/kernel/sys_marvel.c b/arch/alpha/kernel/sys_marvel.c index 2bfc9f1b1dd..e61910734e4 100644 --- a/arch/alpha/kernel/sys_marvel.c +++ b/arch/alpha/kernel/sys_marvel.c | |||
| @@ -104,9 +104,10 @@ io7_get_irq_ctl(unsigned int irq, struct io7 **pio7) | |||
| 104 | } | 104 | } |
| 105 | 105 | ||
| 106 | static void | 106 | static void |
| 107 | io7_enable_irq(unsigned int irq) | 107 | io7_enable_irq(struct irq_data *d) |
| 108 | { | 108 | { |
| 109 | volatile unsigned long *ctl; | 109 | volatile unsigned long *ctl; |
| 110 | unsigned int irq = d->irq; | ||
| 110 | struct io7 *io7; | 111 | struct io7 *io7; |
| 111 | 112 | ||
| 112 | ctl = io7_get_irq_ctl(irq, &io7); | 113 | ctl = io7_get_irq_ctl(irq, &io7); |
| @@ -115,7 +116,7 @@ io7_enable_irq(unsigned int irq) | |||
| 115 | __func__, irq); | 116 | __func__, irq); |
| 116 | return; | 117 | return; |
| 117 | } | 118 | } |
| 118 | 119 | ||
| 119 | spin_lock(&io7->irq_lock); | 120 | spin_lock(&io7->irq_lock); |
| 120 | *ctl |= 1UL << 24; | 121 | *ctl |= 1UL << 24; |
| 121 | mb(); | 122 | mb(); |
| @@ -124,9 +125,10 @@ io7_enable_irq(unsigned int irq) | |||
| 124 | } | 125 | } |
| 125 | 126 | ||
| 126 | static void | 127 | static void |
| 127 | io7_disable_irq(unsigned int irq) | 128 | io7_disable_irq(struct irq_data *d) |
| 128 | { | 129 | { |
| 129 | volatile unsigned long *ctl; | 130 | volatile unsigned long *ctl; |
| 131 | unsigned int irq = d->irq; | ||
| 130 | struct io7 *io7; | 132 | struct io7 *io7; |
| 131 | 133 | ||
| 132 | ctl = io7_get_irq_ctl(irq, &io7); | 134 | ctl = io7_get_irq_ctl(irq, &io7); |
| @@ -135,7 +137,7 @@ io7_disable_irq(unsigned int irq) | |||
| 135 | __func__, irq); | 137 | __func__, irq); |
| 136 | return; | 138 | return; |
| 137 | } | 139 | } |
| 138 | 140 | ||
| 139 | spin_lock(&io7->irq_lock); | 141 | spin_lock(&io7->irq_lock); |
| 140 | *ctl &= ~(1UL << 24); | 142 | *ctl &= ~(1UL << 24); |
| 141 | mb(); | 143 | mb(); |
| @@ -144,35 +146,29 @@ io7_disable_irq(unsigned int irq) | |||
| 144 | } | 146 | } |
| 145 | 147 | ||
| 146 | static void | 148 | static void |
| 147 | marvel_irq_noop(unsigned int irq) | 149 | marvel_irq_noop(struct irq_data *d) |
| 148 | { | 150 | { |
| 149 | return; | 151 | return; |
| 150 | } | ||
| 151 | |||
| 152 | static unsigned int | ||
| 153 | marvel_irq_noop_return(unsigned int irq) | ||
| 154 | { | ||
| 155 | return 0; | ||
| 156 | } | 152 | } |
| 157 | 153 | ||
| 158 | static struct irq_chip marvel_legacy_irq_type = { | 154 | static struct irq_chip marvel_legacy_irq_type = { |
| 159 | .name = "LEGACY", | 155 | .name = "LEGACY", |
| 160 | .mask = marvel_irq_noop, | 156 | .irq_mask = marvel_irq_noop, |
| 161 | .unmask = marvel_irq_noop, | 157 | .irq_unmask = marvel_irq_noop, |
| 162 | }; | 158 | }; |
| 163 | 159 | ||
| 164 | static struct irq_chip io7_lsi_irq_type = { | 160 | static struct irq_chip io7_lsi_irq_type = { |
| 165 | .name = "LSI", | 161 | .name = "LSI", |
| 166 | .unmask = io7_enable_irq, | 162 | .irq_unmask = io7_enable_irq, |
| 167 | .mask = io7_disable_irq, | 163 | .irq_mask = io7_disable_irq, |
| 168 | .mask_ack = io7_disable_irq, | 164 | .irq_mask_ack = io7_disable_irq, |
| 169 | }; | 165 | }; |
| 170 | 166 | ||
| 171 | static struct irq_chip io7_msi_irq_type = { | 167 | static struct irq_chip io7_msi_irq_type = { |
| 172 | .name = "MSI", | 168 | .name = "MSI", |
| 173 | .unmask = io7_enable_irq, | 169 | .irq_unmask = io7_enable_irq, |
| 174 | .mask = io7_disable_irq, | 170 | .irq_mask = io7_disable_irq, |
| 175 | .ack = marvel_irq_noop, | 171 | .irq_ack = marvel_irq_noop, |
| 176 | }; | 172 | }; |
| 177 | 173 | ||
| 178 | static void | 174 | static void |
| @@ -280,8 +276,8 @@ init_io7_irqs(struct io7 *io7, | |||
| 280 | 276 | ||
| 281 | /* Set up the lsi irqs. */ | 277 | /* Set up the lsi irqs. */ |
| 282 | for (i = 0; i < 128; ++i) { | 278 | for (i = 0; i < 128; ++i) { |
| 283 | irq_to_desc(base + i)->status |= IRQ_LEVEL; | ||
| 284 | set_irq_chip_and_handler(base + i, lsi_ops, handle_level_irq); | 279 | set_irq_chip_and_handler(base + i, lsi_ops, handle_level_irq); |
| 280 | irq_set_status_flags(i, IRQ_LEVEL); | ||
| 285 | } | 281 | } |
| 286 | 282 | ||
| 287 | /* Disable the implemented irqs in hardware. */ | 283 | /* Disable the implemented irqs in hardware. */ |
| @@ -294,8 +290,8 @@ init_io7_irqs(struct io7 *io7, | |||
| 294 | 290 | ||
| 295 | /* Set up the msi irqs. */ | 291 | /* Set up the msi irqs. */ |
| 296 | for (i = 128; i < (128 + 512); ++i) { | 292 | for (i = 128; i < (128 + 512); ++i) { |
| 297 | irq_to_desc(base + i)->status |= IRQ_LEVEL; | ||
| 298 | set_irq_chip_and_handler(base + i, msi_ops, handle_level_irq); | 293 | set_irq_chip_and_handler(base + i, msi_ops, handle_level_irq); |
| 294 | irq_set_status_flags(i, IRQ_LEVEL); | ||
| 299 | } | 295 | } |
| 300 | 296 | ||
| 301 | for (i = 0; i < 16; ++i) | 297 | for (i = 0; i < 16; ++i) |
diff --git a/arch/alpha/kernel/sys_mikasa.c b/arch/alpha/kernel/sys_mikasa.c index bcc1639e8ef..cf7f43dd314 100644 --- a/arch/alpha/kernel/sys_mikasa.c +++ b/arch/alpha/kernel/sys_mikasa.c | |||
| @@ -43,22 +43,22 @@ mikasa_update_irq_hw(int mask) | |||
| 43 | } | 43 | } |
| 44 | 44 | ||
| 45 | static inline void | 45 | static inline void |
| 46 | mikasa_enable_irq(unsigned int irq) | 46 | mikasa_enable_irq(struct irq_data *d) |
| 47 | { | 47 | { |
| 48 | mikasa_update_irq_hw(cached_irq_mask |= 1 << (irq - 16)); | 48 | mikasa_update_irq_hw(cached_irq_mask |= 1 << (d->irq - 16)); |
| 49 | } | 49 | } |
| 50 | 50 | ||
| 51 | static void | 51 | static void |
| 52 | mikasa_disable_irq(unsigned int irq) | 52 | mikasa_disable_irq(struct irq_data *d) |
| 53 | { | 53 | { |
| 54 | mikasa_update_irq_hw(cached_irq_mask &= ~(1 << (irq - 16))); | 54 | mikasa_update_irq_hw(cached_irq_mask &= ~(1 << (d->irq - 16))); |
| 55 | } | 55 | } |
| 56 | 56 | ||
| 57 | static struct irq_chip mikasa_irq_type = { | 57 | static struct irq_chip mikasa_irq_type = { |
| 58 | .name = "MIKASA", | 58 | .name = "MIKASA", |
| 59 | .unmask = mikasa_enable_irq, | 59 | .irq_unmask = mikasa_enable_irq, |
| 60 | .mask = mikasa_disable_irq, | 60 | .irq_mask = mikasa_disable_irq, |
| 61 | .mask_ack = mikasa_disable_irq, | 61 | .irq_mask_ack = mikasa_disable_irq, |
| 62 | }; | 62 | }; |
| 63 | 63 | ||
| 64 | static void | 64 | static void |
| @@ -98,8 +98,8 @@ mikasa_init_irq(void) | |||
| 98 | mikasa_update_irq_hw(0); | 98 | mikasa_update_irq_hw(0); |
| 99 | 99 | ||
| 100 | for (i = 16; i < 32; ++i) { | 100 | for (i = 16; i < 32; ++i) { |
| 101 | irq_to_desc(i)->status |= IRQ_LEVEL; | ||
| 102 | set_irq_chip_and_handler(i, &mikasa_irq_type, handle_level_irq); | 101 | set_irq_chip_and_handler(i, &mikasa_irq_type, handle_level_irq); |
| 102 | irq_set_status_flags(i, IRQ_LEVEL); | ||
| 103 | } | 103 | } |
| 104 | 104 | ||
| 105 | init_i8259a_irqs(); | 105 | init_i8259a_irqs(); |
diff --git a/arch/alpha/kernel/sys_noritake.c b/arch/alpha/kernel/sys_noritake.c index e88f4ae1260..92bc188e94a 100644 --- a/arch/alpha/kernel/sys_noritake.c +++ b/arch/alpha/kernel/sys_noritake.c | |||
| @@ -48,22 +48,22 @@ noritake_update_irq_hw(int irq, int mask) | |||
| 48 | } | 48 | } |
| 49 | 49 | ||
| 50 | static void | 50 | static void |
| 51 | noritake_enable_irq(unsigned int irq) | 51 | noritake_enable_irq(struct irq_data *d) |
| 52 | { | 52 | { |
| 53 | noritake_update_irq_hw(irq, cached_irq_mask |= 1 << (irq - 16)); | 53 | noritake_update_irq_hw(d->irq, cached_irq_mask |= 1 << (d->irq - 16)); |
| 54 | } | 54 | } |
| 55 | 55 | ||
| 56 | static void | 56 | static void |
| 57 | noritake_disable_irq(unsigned int irq) | 57 | noritake_disable_irq(struct irq_data *d) |
| 58 | { | 58 | { |
| 59 | noritake_update_irq_hw(irq, cached_irq_mask &= ~(1 << (irq - 16))); | 59 | noritake_update_irq_hw(d->irq, cached_irq_mask &= ~(1 << (d->irq - 16))); |
| 60 | } | 60 | } |
| 61 | 61 | ||
| 62 | static struct irq_chip noritake_irq_type = { | 62 | static struct irq_chip noritake_irq_type = { |
| 63 | .name = "NORITAKE", | 63 | .name = "NORITAKE", |
| 64 | .unmask = noritake_enable_irq, | 64 | .irq_unmask = noritake_enable_irq, |
| 65 | .mask = noritake_disable_irq, | 65 | .irq_mask = noritake_disable_irq, |
| 66 | .mask_ack = noritake_disable_irq, | 66 | .irq_mask_ack = noritake_disable_irq, |
| 67 | }; | 67 | }; |
| 68 | 68 | ||
| 69 | static void | 69 | static void |
| @@ -127,8 +127,8 @@ noritake_init_irq(void) | |||
| 127 | outw(0, 0x54c); | 127 | outw(0, 0x54c); |
| 128 | 128 | ||
| 129 | for (i = 16; i < 48; ++i) { | 129 | for (i = 16; i < 48; ++i) { |
| 130 | irq_to_desc(i)->status |= IRQ_LEVEL; | ||
| 131 | set_irq_chip_and_handler(i, &noritake_irq_type, handle_level_irq); | 130 | set_irq_chip_and_handler(i, &noritake_irq_type, handle_level_irq); |
| 131 | irq_set_status_flags(i, IRQ_LEVEL); | ||
| 132 | } | 132 | } |
| 133 | 133 | ||
| 134 | init_i8259a_irqs(); | 134 | init_i8259a_irqs(); |
diff --git a/arch/alpha/kernel/sys_rawhide.c b/arch/alpha/kernel/sys_rawhide.c index 6a51364dd1c..936d4140ed5 100644 --- a/arch/alpha/kernel/sys_rawhide.c +++ b/arch/alpha/kernel/sys_rawhide.c | |||
| @@ -56,9 +56,10 @@ rawhide_update_irq_hw(int hose, int mask) | |||
| 56 | (((h) < MCPCIA_MAX_HOSES) && (cached_irq_masks[(h)] != 0)) | 56 | (((h) < MCPCIA_MAX_HOSES) && (cached_irq_masks[(h)] != 0)) |
| 57 | 57 | ||
| 58 | static inline void | 58 | static inline void |
| 59 | rawhide_enable_irq(unsigned int irq) | 59 | rawhide_enable_irq(struct irq_data *d) |
| 60 | { | 60 | { |
| 61 | unsigned int mask, hose; | 61 | unsigned int mask, hose; |
| 62 | unsigned int irq = d->irq; | ||
| 62 | 63 | ||
| 63 | irq -= 16; | 64 | irq -= 16; |
| 64 | hose = irq / 24; | 65 | hose = irq / 24; |
| @@ -76,9 +77,10 @@ rawhide_enable_irq(unsigned int irq) | |||
| 76 | } | 77 | } |
| 77 | 78 | ||
| 78 | static void | 79 | static void |
| 79 | rawhide_disable_irq(unsigned int irq) | 80 | rawhide_disable_irq(struct irq_data *d) |
| 80 | { | 81 | { |
| 81 | unsigned int mask, hose; | 82 | unsigned int mask, hose; |
| 83 | unsigned int irq = d->irq; | ||
| 82 | 84 | ||
| 83 | irq -= 16; | 85 | irq -= 16; |
| 84 | hose = irq / 24; | 86 | hose = irq / 24; |
| @@ -96,9 +98,10 @@ rawhide_disable_irq(unsigned int irq) | |||
| 96 | } | 98 | } |
| 97 | 99 | ||
| 98 | static void | 100 | static void |
| 99 | rawhide_mask_and_ack_irq(unsigned int irq) | 101 | rawhide_mask_and_ack_irq(struct irq_data *d) |
| 100 | { | 102 | { |
| 101 | unsigned int mask, mask1, hose; | 103 | unsigned int mask, mask1, hose; |
| 104 | unsigned int irq = d->irq; | ||
| 102 | 105 | ||
| 103 | irq -= 16; | 106 | irq -= 16; |
| 104 | hose = irq / 24; | 107 | hose = irq / 24; |
| @@ -123,9 +126,9 @@ rawhide_mask_and_ack_irq(unsigned int irq) | |||
| 123 | 126 | ||
| 124 | static struct irq_chip rawhide_irq_type = { | 127 | static struct irq_chip rawhide_irq_type = { |
| 125 | .name = "RAWHIDE", | 128 | .name = "RAWHIDE", |
| 126 | .unmask = rawhide_enable_irq, | 129 | .irq_unmask = rawhide_enable_irq, |
| 127 | .mask = rawhide_disable_irq, | 130 | .irq_mask = rawhide_disable_irq, |
| 128 | .mask_ack = rawhide_mask_and_ack_irq, | 131 | .irq_mask_ack = rawhide_mask_and_ack_irq, |
| 129 | }; | 132 | }; |
| 130 | 133 | ||
| 131 | static void | 134 | static void |
| @@ -177,8 +180,8 @@ rawhide_init_irq(void) | |||
| 177 | } | 180 | } |
| 178 | 181 | ||
| 179 | for (i = 16; i < 128; ++i) { | 182 | for (i = 16; i < 128; ++i) { |
| 180 | irq_to_desc(i)->status |= IRQ_LEVEL; | ||
| 181 | set_irq_chip_and_handler(i, &rawhide_irq_type, handle_level_irq); | 183 | set_irq_chip_and_handler(i, &rawhide_irq_type, handle_level_irq); |
| 184 | irq_set_status_flags(i, IRQ_LEVEL); | ||
| 182 | } | 185 | } |
| 183 | 186 | ||
| 184 | init_i8259a_irqs(); | 187 | init_i8259a_irqs(); |
diff --git a/arch/alpha/kernel/sys_rx164.c b/arch/alpha/kernel/sys_rx164.c index 89e7e37ec84..cea22a62913 100644 --- a/arch/alpha/kernel/sys_rx164.c +++ b/arch/alpha/kernel/sys_rx164.c | |||
| @@ -47,22 +47,22 @@ rx164_update_irq_hw(unsigned long mask) | |||
| 47 | } | 47 | } |
| 48 | 48 | ||
| 49 | static inline void | 49 | static inline void |
| 50 | rx164_enable_irq(unsigned int irq) | 50 | rx164_enable_irq(struct irq_data *d) |
| 51 | { | 51 | { |
| 52 | rx164_update_irq_hw(cached_irq_mask |= 1UL << (irq - 16)); | 52 | rx164_update_irq_hw(cached_irq_mask |= 1UL << (d->irq - 16)); |
| 53 | } | 53 | } |
| 54 | 54 | ||
| 55 | static void | 55 | static void |
| 56 | rx164_disable_irq(unsigned int irq) | 56 | rx164_disable_irq(struct irq_data *d) |
| 57 | { | 57 | { |
| 58 | rx164_update_irq_hw(cached_irq_mask &= ~(1UL << (irq - 16))); | 58 | rx164_update_irq_hw(cached_irq_mask &= ~(1UL << (d->irq - 16))); |
| 59 | } | 59 | } |
| 60 | 60 | ||
| 61 | static struct irq_chip rx164_irq_type = { | 61 | static struct irq_chip rx164_irq_type = { |
| 62 | .name = "RX164", | 62 | .name = "RX164", |
| 63 | .unmask = rx164_enable_irq, | 63 | .irq_unmask = rx164_enable_irq, |
| 64 | .mask = rx164_disable_irq, | 64 | .irq_mask = rx164_disable_irq, |
| 65 | .mask_ack = rx164_disable_irq, | 65 | .irq_mask_ack = rx164_disable_irq, |
| 66 | }; | 66 | }; |
| 67 | 67 | ||
| 68 | static void | 68 | static void |
| @@ -99,8 +99,8 @@ rx164_init_irq(void) | |||
| 99 | 99 | ||
| 100 | rx164_update_irq_hw(0); | 100 | rx164_update_irq_hw(0); |
| 101 | for (i = 16; i < 40; ++i) { | 101 | for (i = 16; i < 40; ++i) { |
| 102 | irq_to_desc(i)->status |= IRQ_LEVEL; | ||
| 103 | set_irq_chip_and_handler(i, &rx164_irq_type, handle_level_irq); | 102 | set_irq_chip_and_handler(i, &rx164_irq_type, handle_level_irq); |
| 103 | irq_set_status_flags(i, IRQ_LEVEL); | ||
| 104 | } | 104 | } |
| 105 | 105 | ||
| 106 | init_i8259a_irqs(); | 106 | init_i8259a_irqs(); |
diff --git a/arch/alpha/kernel/sys_sable.c b/arch/alpha/kernel/sys_sable.c index 5c4423d1b06..a349538aabc 100644 --- a/arch/alpha/kernel/sys_sable.c +++ b/arch/alpha/kernel/sys_sable.c | |||
| @@ -443,11 +443,11 @@ lynx_swizzle(struct pci_dev *dev, u8 *pinp) | |||
| 443 | /* GENERIC irq routines */ | 443 | /* GENERIC irq routines */ |
| 444 | 444 | ||
| 445 | static inline void | 445 | static inline void |
| 446 | sable_lynx_enable_irq(unsigned int irq) | 446 | sable_lynx_enable_irq(struct irq_data *d) |
| 447 | { | 447 | { |
| 448 | unsigned long bit, mask; | 448 | unsigned long bit, mask; |
| 449 | 449 | ||
| 450 | bit = sable_lynx_irq_swizzle->irq_to_mask[irq]; | 450 | bit = sable_lynx_irq_swizzle->irq_to_mask[d->irq]; |
| 451 | spin_lock(&sable_lynx_irq_lock); | 451 | spin_lock(&sable_lynx_irq_lock); |
| 452 | mask = sable_lynx_irq_swizzle->shadow_mask &= ~(1UL << bit); | 452 | mask = sable_lynx_irq_swizzle->shadow_mask &= ~(1UL << bit); |
| 453 | sable_lynx_irq_swizzle->update_irq_hw(bit, mask); | 453 | sable_lynx_irq_swizzle->update_irq_hw(bit, mask); |
| @@ -459,11 +459,11 @@ sable_lynx_enable_irq(unsigned int irq) | |||
| 459 | } | 459 | } |
| 460 | 460 | ||
| 461 | static void | 461 | static void |
| 462 | sable_lynx_disable_irq(unsigned int irq) | 462 | sable_lynx_disable_irq(struct irq_data *d) |
| 463 | { | 463 | { |
| 464 | unsigned long bit, mask; | 464 | unsigned long bit, mask; |
| 465 | 465 | ||
| 466 | bit = sable_lynx_irq_swizzle->irq_to_mask[irq]; | 466 | bit = sable_lynx_irq_swizzle->irq_to_mask[d->irq]; |
| 467 | spin_lock(&sable_lynx_irq_lock); | 467 | spin_lock(&sable_lynx_irq_lock); |
| 468 | mask = sable_lynx_irq_swizzle->shadow_mask |= 1UL << bit; | 468 | mask = sable_lynx_irq_swizzle->shadow_mask |= 1UL << bit; |
| 469 | sable_lynx_irq_swizzle->update_irq_hw(bit, mask); | 469 | sable_lynx_irq_swizzle->update_irq_hw(bit, mask); |
| @@ -475,11 +475,11 @@ sable_lynx_disable_irq(unsigned int irq) | |||
| 475 | } | 475 | } |
| 476 | 476 | ||
| 477 | static void | 477 | static void |
| 478 | sable_lynx_mask_and_ack_irq(unsigned int irq) | 478 | sable_lynx_mask_and_ack_irq(struct irq_data *d) |
| 479 | { | 479 | { |
| 480 | unsigned long bit, mask; | 480 | unsigned long bit, mask; |
| 481 | 481 | ||
| 482 | bit = sable_lynx_irq_swizzle->irq_to_mask[irq]; | 482 | bit = sable_lynx_irq_swizzle->irq_to_mask[d->irq]; |
| 483 | spin_lock(&sable_lynx_irq_lock); | 483 | spin_lock(&sable_lynx_irq_lock); |
| 484 | mask = sable_lynx_irq_swizzle->shadow_mask |= 1UL << bit; | 484 | mask = sable_lynx_irq_swizzle->shadow_mask |= 1UL << bit; |
| 485 | sable_lynx_irq_swizzle->update_irq_hw(bit, mask); | 485 | sable_lynx_irq_swizzle->update_irq_hw(bit, mask); |
| @@ -489,9 +489,9 @@ sable_lynx_mask_and_ack_irq(unsigned int irq) | |||
| 489 | 489 | ||
| 490 | static struct irq_chip sable_lynx_irq_type = { | 490 | static struct irq_chip sable_lynx_irq_type = { |
| 491 | .name = "SABLE/LYNX", | 491 | .name = "SABLE/LYNX", |
| 492 | .unmask = sable_lynx_enable_irq, | 492 | .irq_unmask = sable_lynx_enable_irq, |
| 493 | .mask = sable_lynx_disable_irq, | 493 | .irq_mask = sable_lynx_disable_irq, |
| 494 | .mask_ack = sable_lynx_mask_and_ack_irq, | 494 | .irq_mask_ack = sable_lynx_mask_and_ack_irq, |
| 495 | }; | 495 | }; |
| 496 | 496 | ||
| 497 | static void | 497 | static void |
| @@ -518,9 +518,9 @@ sable_lynx_init_irq(int nr_of_irqs) | |||
| 518 | long i; | 518 | long i; |
| 519 | 519 | ||
| 520 | for (i = 0; i < nr_of_irqs; ++i) { | 520 | for (i = 0; i < nr_of_irqs; ++i) { |
| 521 | irq_to_desc(i)->status |= IRQ_LEVEL; | ||
| 522 | set_irq_chip_and_handler(i, &sable_lynx_irq_type, | 521 | set_irq_chip_and_handler(i, &sable_lynx_irq_type, |
| 523 | handle_level_irq); | 522 | handle_level_irq); |
| 523 | irq_set_status_flags(i, IRQ_LEVEL); | ||
| 524 | } | 524 | } |
| 525 | 525 | ||
| 526 | common_init_isa_dma(); | 526 | common_init_isa_dma(); |
diff --git a/arch/alpha/kernel/sys_takara.c b/arch/alpha/kernel/sys_takara.c index f8a1e8a862f..42a5331f13c 100644 --- a/arch/alpha/kernel/sys_takara.c +++ b/arch/alpha/kernel/sys_takara.c | |||
| @@ -45,16 +45,18 @@ takara_update_irq_hw(unsigned long irq, unsigned long mask) | |||
| 45 | } | 45 | } |
| 46 | 46 | ||
| 47 | static inline void | 47 | static inline void |
| 48 | takara_enable_irq(unsigned int irq) | 48 | takara_enable_irq(struct irq_data *d) |
| 49 | { | 49 | { |
| 50 | unsigned int irq = d->irq; | ||
| 50 | unsigned long mask; | 51 | unsigned long mask; |
| 51 | mask = (cached_irq_mask[irq >= 64] &= ~(1UL << (irq & 63))); | 52 | mask = (cached_irq_mask[irq >= 64] &= ~(1UL << (irq & 63))); |
| 52 | takara_update_irq_hw(irq, mask); | 53 | takara_update_irq_hw(irq, mask); |
| 53 | } | 54 | } |
| 54 | 55 | ||
| 55 | static void | 56 | static void |
| 56 | takara_disable_irq(unsigned int irq) | 57 | takara_disable_irq(struct irq_data *d) |
| 57 | { | 58 | { |
| 59 | unsigned int irq = d->irq; | ||
| 58 | unsigned long mask; | 60 | unsigned long mask; |
| 59 | mask = (cached_irq_mask[irq >= 64] |= 1UL << (irq & 63)); | 61 | mask = (cached_irq_mask[irq >= 64] |= 1UL << (irq & 63)); |
| 60 | takara_update_irq_hw(irq, mask); | 62 | takara_update_irq_hw(irq, mask); |
| @@ -62,9 +64,9 @@ takara_disable_irq(unsigned int irq) | |||
| 62 | 64 | ||
| 63 | static struct irq_chip takara_irq_type = { | 65 | static struct irq_chip takara_irq_type = { |
| 64 | .name = "TAKARA", | 66 | .name = "TAKARA", |
| 65 | .unmask = takara_enable_irq, | 67 | .irq_unmask = takara_enable_irq, |
| 66 | .mask = takara_disable_irq, | 68 | .irq_mask = takara_disable_irq, |
| 67 | .mask_ack = takara_disable_irq, | 69 | .irq_mask_ack = takara_disable_irq, |
| 68 | }; | 70 | }; |
| 69 | 71 | ||
| 70 | static void | 72 | static void |
| @@ -136,8 +138,8 @@ takara_init_irq(void) | |||
| 136 | takara_update_irq_hw(i, -1); | 138 | takara_update_irq_hw(i, -1); |
| 137 | 139 | ||
| 138 | for (i = 16; i < 128; ++i) { | 140 | for (i = 16; i < 128; ++i) { |
| 139 | irq_to_desc(i)->status |= IRQ_LEVEL; | ||
| 140 | set_irq_chip_and_handler(i, &takara_irq_type, handle_level_irq); | 141 | set_irq_chip_and_handler(i, &takara_irq_type, handle_level_irq); |
| 142 | irq_set_status_flags(i, IRQ_LEVEL); | ||
| 141 | } | 143 | } |
| 142 | 144 | ||
| 143 | common_init_isa_dma(); | 145 | common_init_isa_dma(); |
diff --git a/arch/alpha/kernel/sys_titan.c b/arch/alpha/kernel/sys_titan.c index e02494bf5ef..f6c108a3d67 100644 --- a/arch/alpha/kernel/sys_titan.c +++ b/arch/alpha/kernel/sys_titan.c | |||
| @@ -112,8 +112,9 @@ titan_update_irq_hw(unsigned long mask) | |||
| 112 | } | 112 | } |
| 113 | 113 | ||
| 114 | static inline void | 114 | static inline void |
| 115 | titan_enable_irq(unsigned int irq) | 115 | titan_enable_irq(struct irq_data *d) |
| 116 | { | 116 | { |
| 117 | unsigned int irq = d->irq; | ||
| 117 | spin_lock(&titan_irq_lock); | 118 | spin_lock(&titan_irq_lock); |
| 118 | titan_cached_irq_mask |= 1UL << (irq - 16); | 119 | titan_cached_irq_mask |= 1UL << (irq - 16); |
| 119 | titan_update_irq_hw(titan_cached_irq_mask); | 120 | titan_update_irq_hw(titan_cached_irq_mask); |
| @@ -121,8 +122,9 @@ titan_enable_irq(unsigned int irq) | |||
| 121 | } | 122 | } |
| 122 | 123 | ||
| 123 | static inline void | 124 | static inline void |
| 124 | titan_disable_irq(unsigned int irq) | 125 | titan_disable_irq(struct irq_data *d) |
| 125 | { | 126 | { |
| 127 | unsigned int irq = d->irq; | ||
| 126 | spin_lock(&titan_irq_lock); | 128 | spin_lock(&titan_irq_lock); |
| 127 | titan_cached_irq_mask &= ~(1UL << (irq - 16)); | 129 | titan_cached_irq_mask &= ~(1UL << (irq - 16)); |
| 128 | titan_update_irq_hw(titan_cached_irq_mask); | 130 | titan_update_irq_hw(titan_cached_irq_mask); |
| @@ -144,7 +146,8 @@ titan_cpu_set_irq_affinity(unsigned int irq, cpumask_t affinity) | |||
| 144 | } | 146 | } |
| 145 | 147 | ||
| 146 | static int | 148 | static int |
| 147 | titan_set_irq_affinity(unsigned int irq, const struct cpumask *affinity) | 149 | titan_set_irq_affinity(struct irq_data *d, const struct cpumask *affinity, |
| 150 | bool force) | ||
| 148 | { | 151 | { |
| 149 | spin_lock(&titan_irq_lock); | 152 | spin_lock(&titan_irq_lock); |
| 150 | titan_cpu_set_irq_affinity(irq - 16, *affinity); | 153 | titan_cpu_set_irq_affinity(irq - 16, *affinity); |
| @@ -175,17 +178,17 @@ init_titan_irqs(struct irq_chip * ops, int imin, int imax) | |||
| 175 | { | 178 | { |
| 176 | long i; | 179 | long i; |
| 177 | for (i = imin; i <= imax; ++i) { | 180 | for (i = imin; i <= imax; ++i) { |
| 178 | irq_to_desc(i)->status |= IRQ_LEVEL; | ||
| 179 | set_irq_chip_and_handler(i, ops, handle_level_irq); | 181 | set_irq_chip_and_handler(i, ops, handle_level_irq); |
| 182 | irq_set_status_flags(i, IRQ_LEVEL); | ||
| 180 | } | 183 | } |
| 181 | } | 184 | } |
| 182 | 185 | ||
| 183 | static struct irq_chip titan_irq_type = { | 186 | static struct irq_chip titan_irq_type = { |
| 184 | .name = "TITAN", | 187 | .name = "TITAN", |
| 185 | .unmask = titan_enable_irq, | 188 | .irq_unmask = titan_enable_irq, |
| 186 | .mask = titan_disable_irq, | 189 | .irq_mask = titan_disable_irq, |
| 187 | .mask_ack = titan_disable_irq, | 190 | .irq_mask_ack = titan_disable_irq, |
| 188 | .set_affinity = titan_set_irq_affinity, | 191 | .irq_set_affinity = titan_set_irq_affinity, |
| 189 | }; | 192 | }; |
| 190 | 193 | ||
| 191 | static irqreturn_t | 194 | static irqreturn_t |
diff --git a/arch/alpha/kernel/sys_wildfire.c b/arch/alpha/kernel/sys_wildfire.c index eec52594d41..ca60a387ef0 100644 --- a/arch/alpha/kernel/sys_wildfire.c +++ b/arch/alpha/kernel/sys_wildfire.c | |||
| @@ -104,10 +104,12 @@ wildfire_init_irq_hw(void) | |||
| 104 | } | 104 | } |
| 105 | 105 | ||
| 106 | static void | 106 | static void |
| 107 | wildfire_enable_irq(unsigned int irq) | 107 | wildfire_enable_irq(struct irq_data *d) |
| 108 | { | 108 | { |
| 109 | unsigned int irq = d->irq; | ||
| 110 | |||
| 109 | if (irq < 16) | 111 | if (irq < 16) |
| 110 | i8259a_enable_irq(irq); | 112 | i8259a_enable_irq(d); |
| 111 | 113 | ||
| 112 | spin_lock(&wildfire_irq_lock); | 114 | spin_lock(&wildfire_irq_lock); |
| 113 | set_bit(irq, &cached_irq_mask); | 115 | set_bit(irq, &cached_irq_mask); |
| @@ -116,10 +118,12 @@ wildfire_enable_irq(unsigned int irq) | |||
| 116 | } | 118 | } |
| 117 | 119 | ||
| 118 | static void | 120 | static void |
| 119 | wildfire_disable_irq(unsigned int irq) | 121 | wildfire_disable_irq(struct irq_data *d) |
| 120 | { | 122 | { |
| 123 | unsigned int irq = d->irq; | ||
| 124 | |||
| 121 | if (irq < 16) | 125 | if (irq < 16) |
| 122 | i8259a_disable_irq(irq); | 126 | i8259a_disable_irq(d); |
| 123 | 127 | ||
| 124 | spin_lock(&wildfire_irq_lock); | 128 | spin_lock(&wildfire_irq_lock); |
| 125 | clear_bit(irq, &cached_irq_mask); | 129 | clear_bit(irq, &cached_irq_mask); |
| @@ -128,10 +132,12 @@ wildfire_disable_irq(unsigned int irq) | |||
| 128 | } | 132 | } |
| 129 | 133 | ||
| 130 | static void | 134 | static void |
| 131 | wildfire_mask_and_ack_irq(unsigned int irq) | 135 | wildfire_mask_and_ack_irq(struct irq_data *d) |
| 132 | { | 136 | { |
| 137 | unsigned int irq = d->irq; | ||
| 138 | |||
| 133 | if (irq < 16) | 139 | if (irq < 16) |
| 134 | i8259a_mask_and_ack_irq(irq); | 140 | i8259a_mask_and_ack_irq(d); |
| 135 | 141 | ||
| 136 | spin_lock(&wildfire_irq_lock); | 142 | spin_lock(&wildfire_irq_lock); |
| 137 | clear_bit(irq, &cached_irq_mask); | 143 | clear_bit(irq, &cached_irq_mask); |
| @@ -141,9 +147,9 @@ wildfire_mask_and_ack_irq(unsigned int irq) | |||
| 141 | 147 | ||
| 142 | static struct irq_chip wildfire_irq_type = { | 148 | static struct irq_chip wildfire_irq_type = { |
| 143 | .name = "WILDFIRE", | 149 | .name = "WILDFIRE", |
| 144 | .unmask = wildfire_enable_irq, | 150 | .irq_unmask = wildfire_enable_irq, |
| 145 | .mask = wildfire_disable_irq, | 151 | .irq_mask = wildfire_disable_irq, |
| 146 | .mask_ack = wildfire_mask_and_ack_irq, | 152 | .irq_mask_ack = wildfire_mask_and_ack_irq, |
| 147 | }; | 153 | }; |
| 148 | 154 | ||
| 149 | static void __init | 155 | static void __init |
| @@ -177,21 +183,21 @@ wildfire_init_irq_per_pca(int qbbno, int pcano) | |||
| 177 | for (i = 0; i < 16; ++i) { | 183 | for (i = 0; i < 16; ++i) { |
| 178 | if (i == 2) | 184 | if (i == 2) |
| 179 | continue; | 185 | continue; |
| 180 | irq_to_desc(i+irq_bias)->status |= IRQ_LEVEL; | ||
| 181 | set_irq_chip_and_handler(i+irq_bias, &wildfire_irq_type, | 186 | set_irq_chip_and_handler(i+irq_bias, &wildfire_irq_type, |
| 182 | handle_level_irq); | 187 | handle_level_irq); |
| 188 | irq_set_status_flags(i + irq_bias, IRQ_LEVEL); | ||
| 183 | } | 189 | } |
| 184 | 190 | ||
| 185 | irq_to_desc(36+irq_bias)->status |= IRQ_LEVEL; | ||
| 186 | set_irq_chip_and_handler(36+irq_bias, &wildfire_irq_type, | 191 | set_irq_chip_and_handler(36+irq_bias, &wildfire_irq_type, |
| 187 | handle_level_irq); | 192 | handle_level_irq); |
| 193 | irq_set_status_flags(36 + irq_bias, IRQ_LEVEL); | ||
| 188 | for (i = 40; i < 64; ++i) { | 194 | for (i = 40; i < 64; ++i) { |
| 189 | irq_to_desc(i+irq_bias)->status |= IRQ_LEVEL; | ||
| 190 | set_irq_chip_and_handler(i+irq_bias, &wildfire_irq_type, | 195 | set_irq_chip_and_handler(i+irq_bias, &wildfire_irq_type, |
| 191 | handle_level_irq); | 196 | handle_level_irq); |
| 197 | irq_set_status_flags(i + irq_bias, IRQ_LEVEL); | ||
| 192 | } | 198 | } |
| 193 | 199 | ||
| 194 | setup_irq(32+irq_bias, &isa_enable); | 200 | setup_irq(32+irq_bias, &isa_enable); |
| 195 | } | 201 | } |
| 196 | 202 | ||
| 197 | static void __init | 203 | static void __init |
diff --git a/arch/arm/common/Kconfig b/arch/arm/common/Kconfig index 778655f0257..ea5ee4d067f 100644 --- a/arch/arm/common/Kconfig +++ b/arch/arm/common/Kconfig | |||
| @@ -6,6 +6,8 @@ config ARM_VIC | |||
| 6 | 6 | ||
| 7 | config ARM_VIC_NR | 7 | config ARM_VIC_NR |
| 8 | int | 8 | int |
| 9 | default 4 if ARCH_S5PV210 | ||
| 10 | default 3 if ARCH_S5P6442 || ARCH_S5PC100 | ||
| 9 | default 2 | 11 | default 2 |
| 10 | depends on ARM_VIC | 12 | depends on ARM_VIC |
| 11 | help | 13 | help |
diff --git a/arch/arm/include/asm/mach/arch.h b/arch/arm/include/asm/mach/arch.h index 3a0893a76a3..bf13b814c1b 100644 --- a/arch/arm/include/asm/mach/arch.h +++ b/arch/arm/include/asm/mach/arch.h | |||
| @@ -15,10 +15,6 @@ struct meminfo; | |||
| 15 | struct sys_timer; | 15 | struct sys_timer; |
| 16 | 16 | ||
| 17 | struct machine_desc { | 17 | struct machine_desc { |
| 18 | /* | ||
| 19 | * Note! The first two elements are used | ||
| 20 | * by assembler code in head.S, head-common.S | ||
| 21 | */ | ||
| 22 | unsigned int nr; /* architecture number */ | 18 | unsigned int nr; /* architecture number */ |
| 23 | const char *name; /* architecture name */ | 19 | const char *name; /* architecture name */ |
| 24 | unsigned long boot_params; /* tagged list */ | 20 | unsigned long boot_params; /* tagged list */ |
diff --git a/arch/arm/include/asm/pgalloc.h b/arch/arm/include/asm/pgalloc.h index 9763be04f77..22de005f159 100644 --- a/arch/arm/include/asm/pgalloc.h +++ b/arch/arm/include/asm/pgalloc.h | |||
| @@ -10,6 +10,8 @@ | |||
| 10 | #ifndef _ASMARM_PGALLOC_H | 10 | #ifndef _ASMARM_PGALLOC_H |
| 11 | #define _ASMARM_PGALLOC_H | 11 | #define _ASMARM_PGALLOC_H |
| 12 | 12 | ||
| 13 | #include <linux/pagemap.h> | ||
| 14 | |||
| 13 | #include <asm/domain.h> | 15 | #include <asm/domain.h> |
| 14 | #include <asm/pgtable-hwdef.h> | 16 | #include <asm/pgtable-hwdef.h> |
| 15 | #include <asm/processor.h> | 17 | #include <asm/processor.h> |
diff --git a/arch/arm/kernel/hw_breakpoint.c b/arch/arm/kernel/hw_breakpoint.c index d600bd35070..44b84fe6e1b 100644 --- a/arch/arm/kernel/hw_breakpoint.c +++ b/arch/arm/kernel/hw_breakpoint.c | |||
| @@ -836,9 +836,11 @@ static int hw_breakpoint_pending(unsigned long addr, unsigned int fsr, | |||
| 836 | /* | 836 | /* |
| 837 | * One-time initialisation. | 837 | * One-time initialisation. |
| 838 | */ | 838 | */ |
| 839 | static void reset_ctrl_regs(void *unused) | 839 | static void reset_ctrl_regs(void *info) |
| 840 | { | 840 | { |
| 841 | int i; | 841 | int i, cpu = smp_processor_id(); |
| 842 | u32 dbg_power; | ||
| 843 | cpumask_t *cpumask = info; | ||
| 842 | 844 | ||
| 843 | /* | 845 | /* |
| 844 | * v7 debug contains save and restore registers so that debug state | 846 | * v7 debug contains save and restore registers so that debug state |
| @@ -850,6 +852,17 @@ static void reset_ctrl_regs(void *unused) | |||
| 850 | */ | 852 | */ |
| 851 | if (debug_arch >= ARM_DEBUG_ARCH_V7_ECP14) { | 853 | if (debug_arch >= ARM_DEBUG_ARCH_V7_ECP14) { |
| 852 | /* | 854 | /* |
| 855 | * Ensure sticky power-down is clear (i.e. debug logic is | ||
| 856 | * powered up). | ||
| 857 | */ | ||
| 858 | asm volatile("mrc p14, 0, %0, c1, c5, 4" : "=r" (dbg_power)); | ||
| 859 | if ((dbg_power & 0x1) == 0) { | ||
| 860 | pr_warning("CPU %d debug is powered down!\n", cpu); | ||
| 861 | cpumask_or(cpumask, cpumask, cpumask_of(cpu)); | ||
| 862 | return; | ||
| 863 | } | ||
| 864 | |||
| 865 | /* | ||
| 853 | * Unconditionally clear the lock by writing a value | 866 | * Unconditionally clear the lock by writing a value |
| 854 | * other than 0xC5ACCE55 to the access register. | 867 | * other than 0xC5ACCE55 to the access register. |
| 855 | */ | 868 | */ |
| @@ -887,6 +900,7 @@ static struct notifier_block __cpuinitdata dbg_reset_nb = { | |||
| 887 | static int __init arch_hw_breakpoint_init(void) | 900 | static int __init arch_hw_breakpoint_init(void) |
| 888 | { | 901 | { |
| 889 | u32 dscr; | 902 | u32 dscr; |
| 903 | cpumask_t cpumask = { CPU_BITS_NONE }; | ||
| 890 | 904 | ||
| 891 | debug_arch = get_debug_arch(); | 905 | debug_arch = get_debug_arch(); |
| 892 | 906 | ||
| @@ -911,7 +925,13 @@ static int __init arch_hw_breakpoint_init(void) | |||
| 911 | * Reset the breakpoint resources. We assume that a halting | 925 | * Reset the breakpoint resources. We assume that a halting |
| 912 | * debugger will leave the world in a nice state for us. | 926 | * debugger will leave the world in a nice state for us. |
| 913 | */ | 927 | */ |
| 914 | on_each_cpu(reset_ctrl_regs, NULL, 1); | 928 | on_each_cpu(reset_ctrl_regs, &cpumask, 1); |
| 929 | if (!cpumask_empty(&cpumask)) { | ||
| 930 | core_num_brps = 0; | ||
| 931 | core_num_reserved_brps = 0; | ||
| 932 | core_num_wrps = 0; | ||
| 933 | return 0; | ||
| 934 | } | ||
| 915 | 935 | ||
| 916 | ARM_DBG_READ(c1, 0, dscr); | 936 | ARM_DBG_READ(c1, 0, dscr); |
| 917 | if (dscr & ARM_DSCR_HDBGEN) { | 937 | if (dscr & ARM_DSCR_HDBGEN) { |
diff --git a/arch/arm/kernel/ptrace.c b/arch/arm/kernel/ptrace.c index 19c6816db61..b13e70f63d7 100644 --- a/arch/arm/kernel/ptrace.c +++ b/arch/arm/kernel/ptrace.c | |||
| @@ -996,10 +996,10 @@ static int ptrace_gethbpregs(struct task_struct *tsk, long num, | |||
| 996 | while (!(arch_ctrl.len & 0x1)) | 996 | while (!(arch_ctrl.len & 0x1)) |
| 997 | arch_ctrl.len >>= 1; | 997 | arch_ctrl.len >>= 1; |
| 998 | 998 | ||
| 999 | if (idx & 0x1) | 999 | if (num & 0x1) |
| 1000 | reg = encode_ctrl_reg(arch_ctrl); | ||
| 1001 | else | ||
| 1002 | reg = bp->attr.bp_addr; | 1000 | reg = bp->attr.bp_addr; |
| 1001 | else | ||
| 1002 | reg = encode_ctrl_reg(arch_ctrl); | ||
| 1003 | } | 1003 | } |
| 1004 | 1004 | ||
| 1005 | put: | 1005 | put: |
diff --git a/arch/arm/mach-davinci/cpufreq.c b/arch/arm/mach-davinci/cpufreq.c index 343de73161f..4a68c2b1ec1 100644 --- a/arch/arm/mach-davinci/cpufreq.c +++ b/arch/arm/mach-davinci/cpufreq.c | |||
| @@ -132,7 +132,7 @@ out: | |||
| 132 | return ret; | 132 | return ret; |
| 133 | } | 133 | } |
| 134 | 134 | ||
| 135 | static int __init davinci_cpu_init(struct cpufreq_policy *policy) | 135 | static int davinci_cpu_init(struct cpufreq_policy *policy) |
| 136 | { | 136 | { |
| 137 | int result = 0; | 137 | int result = 0; |
| 138 | struct davinci_cpufreq_config *pdata = cpufreq.dev->platform_data; | 138 | struct davinci_cpufreq_config *pdata = cpufreq.dev->platform_data; |
diff --git a/arch/arm/mach-davinci/devices-da8xx.c b/arch/arm/mach-davinci/devices-da8xx.c index 9eec63070e0..beda8a4133a 100644 --- a/arch/arm/mach-davinci/devices-da8xx.c +++ b/arch/arm/mach-davinci/devices-da8xx.c | |||
| @@ -480,8 +480,15 @@ static struct platform_device da850_mcasp_device = { | |||
| 480 | .resource = da850_mcasp_resources, | 480 | .resource = da850_mcasp_resources, |
| 481 | }; | 481 | }; |
| 482 | 482 | ||
| 483 | struct platform_device davinci_pcm_device = { | ||
| 484 | .name = "davinci-pcm-audio", | ||
| 485 | .id = -1, | ||
| 486 | }; | ||
| 487 | |||
| 483 | void __init da8xx_register_mcasp(int id, struct snd_platform_data *pdata) | 488 | void __init da8xx_register_mcasp(int id, struct snd_platform_data *pdata) |
| 484 | { | 489 | { |
| 490 | platform_device_register(&davinci_pcm_device); | ||
| 491 | |||
| 485 | /* DA830/OMAP-L137 has 3 instances of McASP */ | 492 | /* DA830/OMAP-L137 has 3 instances of McASP */ |
| 486 | if (cpu_is_davinci_da830() && id == 1) { | 493 | if (cpu_is_davinci_da830() && id == 1) { |
| 487 | da830_mcasp1_device.dev.platform_data = pdata; | 494 | da830_mcasp1_device.dev.platform_data = pdata; |
diff --git a/arch/arm/mach-davinci/gpio-tnetv107x.c b/arch/arm/mach-davinci/gpio-tnetv107x.c index d10298620e2..3fa3e2867e1 100644 --- a/arch/arm/mach-davinci/gpio-tnetv107x.c +++ b/arch/arm/mach-davinci/gpio-tnetv107x.c | |||
| @@ -58,7 +58,7 @@ static int tnetv107x_gpio_request(struct gpio_chip *chip, unsigned offset) | |||
| 58 | 58 | ||
| 59 | spin_lock_irqsave(&ctlr->lock, flags); | 59 | spin_lock_irqsave(&ctlr->lock, flags); |
| 60 | 60 | ||
| 61 | gpio_reg_set_bit(®s->enable, gpio); | 61 | gpio_reg_set_bit(regs->enable, gpio); |
| 62 | 62 | ||
| 63 | spin_unlock_irqrestore(&ctlr->lock, flags); | 63 | spin_unlock_irqrestore(&ctlr->lock, flags); |
| 64 | 64 | ||
| @@ -74,7 +74,7 @@ static void tnetv107x_gpio_free(struct gpio_chip *chip, unsigned offset) | |||
| 74 | 74 | ||
| 75 | spin_lock_irqsave(&ctlr->lock, flags); | 75 | spin_lock_irqsave(&ctlr->lock, flags); |
| 76 | 76 | ||
| 77 | gpio_reg_clear_bit(®s->enable, gpio); | 77 | gpio_reg_clear_bit(regs->enable, gpio); |
| 78 | 78 | ||
| 79 | spin_unlock_irqrestore(&ctlr->lock, flags); | 79 | spin_unlock_irqrestore(&ctlr->lock, flags); |
| 80 | } | 80 | } |
| @@ -88,7 +88,7 @@ static int tnetv107x_gpio_dir_in(struct gpio_chip *chip, unsigned offset) | |||
| 88 | 88 | ||
| 89 | spin_lock_irqsave(&ctlr->lock, flags); | 89 | spin_lock_irqsave(&ctlr->lock, flags); |
| 90 | 90 | ||
| 91 | gpio_reg_set_bit(®s->direction, gpio); | 91 | gpio_reg_set_bit(regs->direction, gpio); |
| 92 | 92 | ||
| 93 | spin_unlock_irqrestore(&ctlr->lock, flags); | 93 | spin_unlock_irqrestore(&ctlr->lock, flags); |
| 94 | 94 | ||
| @@ -106,11 +106,11 @@ static int tnetv107x_gpio_dir_out(struct gpio_chip *chip, | |||
| 106 | spin_lock_irqsave(&ctlr->lock, flags); | 106 | spin_lock_irqsave(&ctlr->lock, flags); |
| 107 | 107 | ||
| 108 | if (value) | 108 | if (value) |
| 109 | gpio_reg_set_bit(®s->data_out, gpio); | 109 | gpio_reg_set_bit(regs->data_out, gpio); |
| 110 | else | 110 | else |
| 111 | gpio_reg_clear_bit(®s->data_out, gpio); | 111 | gpio_reg_clear_bit(regs->data_out, gpio); |
| 112 | 112 | ||
| 113 | gpio_reg_clear_bit(®s->direction, gpio); | 113 | gpio_reg_clear_bit(regs->direction, gpio); |
| 114 | 114 | ||
| 115 | spin_unlock_irqrestore(&ctlr->lock, flags); | 115 | spin_unlock_irqrestore(&ctlr->lock, flags); |
| 116 | 116 | ||
| @@ -124,7 +124,7 @@ static int tnetv107x_gpio_get(struct gpio_chip *chip, unsigned offset) | |||
| 124 | unsigned gpio = chip->base + offset; | 124 | unsigned gpio = chip->base + offset; |
| 125 | int ret; | 125 | int ret; |
| 126 | 126 | ||
| 127 | ret = gpio_reg_get_bit(®s->data_in, gpio); | 127 | ret = gpio_reg_get_bit(regs->data_in, gpio); |
| 128 | 128 | ||
| 129 | return ret ? 1 : 0; | 129 | return ret ? 1 : 0; |
| 130 | } | 130 | } |
| @@ -140,9 +140,9 @@ static void tnetv107x_gpio_set(struct gpio_chip *chip, | |||
| 140 | spin_lock_irqsave(&ctlr->lock, flags); | 140 | spin_lock_irqsave(&ctlr->lock, flags); |
| 141 | 141 | ||
| 142 | if (value) | 142 | if (value) |
| 143 | gpio_reg_set_bit(®s->data_out, gpio); | 143 | gpio_reg_set_bit(regs->data_out, gpio); |
| 144 | else | 144 | else |
| 145 | gpio_reg_clear_bit(®s->data_out, gpio); | 145 | gpio_reg_clear_bit(regs->data_out, gpio); |
| 146 | 146 | ||
| 147 | spin_unlock_irqrestore(&ctlr->lock, flags); | 147 | spin_unlock_irqrestore(&ctlr->lock, flags); |
| 148 | } | 148 | } |
diff --git a/arch/arm/mach-davinci/include/mach/clkdev.h b/arch/arm/mach-davinci/include/mach/clkdev.h index 730c49d1ebd..14a50488718 100644 --- a/arch/arm/mach-davinci/include/mach/clkdev.h +++ b/arch/arm/mach-davinci/include/mach/clkdev.h | |||
| @@ -1,6 +1,8 @@ | |||
| 1 | #ifndef __MACH_CLKDEV_H | 1 | #ifndef __MACH_CLKDEV_H |
| 2 | #define __MACH_CLKDEV_H | 2 | #define __MACH_CLKDEV_H |
| 3 | 3 | ||
| 4 | struct clk; | ||
| 5 | |||
| 4 | static inline int __clk_get(struct clk *clk) | 6 | static inline int __clk_get(struct clk *clk) |
| 5 | { | 7 | { |
| 6 | return 1; | 8 | return 1; |
diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile index 8ef8711eac9..82b2a67f42b 100644 --- a/arch/arm/mach-omap2/Makefile +++ b/arch/arm/mach-omap2/Makefile | |||
| @@ -59,10 +59,10 @@ endif | |||
| 59 | # Power Management | 59 | # Power Management |
| 60 | ifeq ($(CONFIG_PM),y) | 60 | ifeq ($(CONFIG_PM),y) |
| 61 | obj-$(CONFIG_ARCH_OMAP2) += pm24xx.o | 61 | obj-$(CONFIG_ARCH_OMAP2) += pm24xx.o |
| 62 | obj-$(CONFIG_ARCH_OMAP2) += sleep24xx.o pm_bus.o voltage.o | 62 | obj-$(CONFIG_ARCH_OMAP2) += sleep24xx.o pm_bus.o |
| 63 | obj-$(CONFIG_ARCH_OMAP3) += pm34xx.o sleep34xx.o voltage.o \ | 63 | obj-$(CONFIG_ARCH_OMAP3) += pm34xx.o sleep34xx.o \ |
| 64 | cpuidle34xx.o pm_bus.o | 64 | cpuidle34xx.o pm_bus.o |
| 65 | obj-$(CONFIG_ARCH_OMAP4) += pm44xx.o voltage.o pm_bus.o | 65 | obj-$(CONFIG_ARCH_OMAP4) += pm44xx.o pm_bus.o |
| 66 | obj-$(CONFIG_PM_DEBUG) += pm-debug.o | 66 | obj-$(CONFIG_PM_DEBUG) += pm-debug.o |
| 67 | obj-$(CONFIG_OMAP_SMARTREFLEX) += sr_device.o smartreflex.o | 67 | obj-$(CONFIG_OMAP_SMARTREFLEX) += sr_device.o smartreflex.o |
| 68 | obj-$(CONFIG_OMAP_SMARTREFLEX_CLASS3) += smartreflex-class3.o | 68 | obj-$(CONFIG_OMAP_SMARTREFLEX_CLASS3) += smartreflex-class3.o |
| @@ -78,13 +78,25 @@ endif | |||
| 78 | 78 | ||
| 79 | # PRCM | 79 | # PRCM |
| 80 | obj-$(CONFIG_ARCH_OMAP2) += prcm.o cm2xxx_3xxx.o prm2xxx_3xxx.o | 80 | obj-$(CONFIG_ARCH_OMAP2) += prcm.o cm2xxx_3xxx.o prm2xxx_3xxx.o |
| 81 | obj-$(CONFIG_ARCH_OMAP3) += prcm.o cm2xxx_3xxx.o prm2xxx_3xxx.o | 81 | obj-$(CONFIG_ARCH_OMAP3) += prcm.o cm2xxx_3xxx.o prm2xxx_3xxx.o \ |
| 82 | vc3xxx_data.o vp3xxx_data.o | ||
| 82 | # XXX The presence of cm2xxx_3xxx.o on the line below is temporary and | 83 | # XXX The presence of cm2xxx_3xxx.o on the line below is temporary and |
| 83 | # will be removed once the OMAP4 part of the codebase is converted to | 84 | # will be removed once the OMAP4 part of the codebase is converted to |
| 84 | # use OMAP4-specific PRCM functions. | 85 | # use OMAP4-specific PRCM functions. |
| 85 | obj-$(CONFIG_ARCH_OMAP4) += prcm.o cm2xxx_3xxx.o cminst44xx.o \ | 86 | obj-$(CONFIG_ARCH_OMAP4) += prcm.o cm2xxx_3xxx.o cminst44xx.o \ |
| 86 | cm44xx.o prcm_mpu44xx.o \ | 87 | cm44xx.o prcm_mpu44xx.o \ |
| 87 | prminst44xx.o | 88 | prminst44xx.o vc44xx_data.o \ |
| 89 | vp44xx_data.o | ||
| 90 | |||
| 91 | # OMAP voltage domains | ||
| 92 | ifeq ($(CONFIG_PM),y) | ||
| 93 | voltagedomain-common := voltage.o | ||
| 94 | obj-$(CONFIG_ARCH_OMAP2) += $(voltagedomain-common) | ||
| 95 | obj-$(CONFIG_ARCH_OMAP3) += $(voltagedomain-common) \ | ||
| 96 | voltagedomains3xxx_data.o | ||
| 97 | obj-$(CONFIG_ARCH_OMAP4) += $(voltagedomain-common) \ | ||
| 98 | voltagedomains44xx_data.o | ||
| 99 | endif | ||
| 88 | 100 | ||
| 89 | # OMAP powerdomain framework | 101 | # OMAP powerdomain framework |
| 90 | powerdomain-common += powerdomain.o powerdomain-common.o | 102 | powerdomain-common += powerdomain.o powerdomain-common.o |
| @@ -102,25 +114,31 @@ obj-$(CONFIG_ARCH_OMAP4) += $(powerdomain-common) \ | |||
| 102 | 114 | ||
| 103 | # PRCM clockdomain control | 115 | # PRCM clockdomain control |
| 104 | obj-$(CONFIG_ARCH_OMAP2) += clockdomain.o \ | 116 | obj-$(CONFIG_ARCH_OMAP2) += clockdomain.o \ |
| 117 | clockdomain2xxx_3xxx.o \ | ||
| 105 | clockdomains2xxx_3xxx_data.o | 118 | clockdomains2xxx_3xxx_data.o |
| 106 | obj-$(CONFIG_ARCH_OMAP3) += clockdomain.o \ | 119 | obj-$(CONFIG_ARCH_OMAP3) += clockdomain.o \ |
| 120 | clockdomain2xxx_3xxx.o \ | ||
| 107 | clockdomains2xxx_3xxx_data.o | 121 | clockdomains2xxx_3xxx_data.o |
| 108 | obj-$(CONFIG_ARCH_OMAP4) += clockdomain.o \ | 122 | obj-$(CONFIG_ARCH_OMAP4) += clockdomain.o \ |
| 123 | clockdomain44xx.o \ | ||
| 109 | clockdomains44xx_data.o | 124 | clockdomains44xx_data.o |
| 125 | |||
| 110 | # Clock framework | 126 | # Clock framework |
| 111 | obj-$(CONFIG_ARCH_OMAP2) += $(clock-common) clock2xxx.o \ | 127 | obj-$(CONFIG_ARCH_OMAP2) += $(clock-common) clock2xxx.o \ |
| 112 | clkt2xxx_sys.o \ | 128 | clkt2xxx_sys.o \ |
| 113 | clkt2xxx_dpllcore.o \ | 129 | clkt2xxx_dpllcore.o \ |
| 114 | clkt2xxx_virt_prcm_set.o \ | 130 | clkt2xxx_virt_prcm_set.o \ |
| 115 | clkt2xxx_apll.o clkt2xxx_osc.o | 131 | clkt2xxx_apll.o clkt2xxx_osc.o \ |
| 132 | clkt2xxx_dpll.o clkt_iclk.o | ||
| 116 | obj-$(CONFIG_SOC_OMAP2420) += clock2420_data.o | 133 | obj-$(CONFIG_SOC_OMAP2420) += clock2420_data.o |
| 117 | obj-$(CONFIG_SOC_OMAP2430) += clock2430.o clock2430_data.o | 134 | obj-$(CONFIG_SOC_OMAP2430) += clock2430.o clock2430_data.o |
| 118 | obj-$(CONFIG_ARCH_OMAP3) += $(clock-common) clock3xxx.o \ | 135 | obj-$(CONFIG_ARCH_OMAP3) += $(clock-common) clock3xxx.o \ |
| 119 | clock34xx.o clkt34xx_dpll3m2.o \ | 136 | clock34xx.o clkt34xx_dpll3m2.o \ |
| 120 | clock3517.o clock36xx.o \ | 137 | clock3517.o clock36xx.o \ |
| 121 | dpll3xxx.o clock3xxx_data.o | 138 | dpll3xxx.o clock3xxx_data.o \ |
| 139 | clkt_iclk.o | ||
| 122 | obj-$(CONFIG_ARCH_OMAP4) += $(clock-common) clock44xx_data.o \ | 140 | obj-$(CONFIG_ARCH_OMAP4) += $(clock-common) clock44xx_data.o \ |
| 123 | dpll3xxx.o | 141 | dpll3xxx.o dpll44xx.o |
| 124 | 142 | ||
| 125 | # OMAP2 clock rate set data (old "OPP" data) | 143 | # OMAP2 clock rate set data (old "OPP" data) |
| 126 | obj-$(CONFIG_SOC_OMAP2420) += opp2420_data.o | 144 | obj-$(CONFIG_SOC_OMAP2420) += opp2420_data.o |
diff --git a/arch/arm/mach-omap2/board-3430sdp.c b/arch/arm/mach-omap2/board-3430sdp.c index 5464bec156a..b3918044e05 100644 --- a/arch/arm/mach-omap2/board-3430sdp.c +++ b/arch/arm/mach-omap2/board-3430sdp.c | |||
| @@ -652,6 +652,106 @@ static const struct ehci_hcd_omap_platform_data ehci_pdata __initconst = { | |||
| 652 | static struct omap_board_mux board_mux[] __initdata = { | 652 | static struct omap_board_mux board_mux[] __initdata = { |
| 653 | { .reg_offset = OMAP_MUX_TERMINATOR }, | 653 | { .reg_offset = OMAP_MUX_TERMINATOR }, |
| 654 | }; | 654 | }; |
| 655 | |||
| 656 | static struct omap_device_pad serial1_pads[] __initdata = { | ||
| 657 | /* | ||
| 658 | * Note that off output enable is an active low | ||
| 659 | * signal. So setting this means pin is a | ||
| 660 | * input enabled in off mode | ||
| 661 | */ | ||
| 662 | OMAP_MUX_STATIC("uart1_cts.uart1_cts", | ||
| 663 | OMAP_PIN_INPUT | | ||
| 664 | OMAP_PIN_OFF_INPUT_PULLDOWN | | ||
| 665 | OMAP_OFFOUT_EN | | ||
| 666 | OMAP_MUX_MODE0), | ||
| 667 | OMAP_MUX_STATIC("uart1_rts.uart1_rts", | ||
| 668 | OMAP_PIN_OUTPUT | | ||
| 669 | OMAP_OFF_EN | | ||
| 670 | OMAP_MUX_MODE0), | ||
| 671 | OMAP_MUX_STATIC("uart1_rx.uart1_rx", | ||
| 672 | OMAP_PIN_INPUT | | ||
| 673 | OMAP_PIN_OFF_INPUT_PULLDOWN | | ||
| 674 | OMAP_OFFOUT_EN | | ||
| 675 | OMAP_MUX_MODE0), | ||
| 676 | OMAP_MUX_STATIC("uart1_tx.uart1_tx", | ||
| 677 | OMAP_PIN_OUTPUT | | ||
| 678 | OMAP_OFF_EN | | ||
| 679 | OMAP_MUX_MODE0), | ||
| 680 | }; | ||
| 681 | |||
| 682 | static struct omap_device_pad serial2_pads[] __initdata = { | ||
| 683 | OMAP_MUX_STATIC("uart2_cts.uart2_cts", | ||
| 684 | OMAP_PIN_INPUT_PULLUP | | ||
| 685 | OMAP_PIN_OFF_INPUT_PULLDOWN | | ||
| 686 | OMAP_OFFOUT_EN | | ||
| 687 | OMAP_MUX_MODE0), | ||
| 688 | OMAP_MUX_STATIC("uart2_rts.uart2_rts", | ||
| 689 | OMAP_PIN_OUTPUT | | ||
| 690 | OMAP_OFF_EN | | ||
| 691 | OMAP_MUX_MODE0), | ||
| 692 | OMAP_MUX_STATIC("uart2_rx.uart2_rx", | ||
| 693 | OMAP_PIN_INPUT | | ||
| 694 | OMAP_PIN_OFF_INPUT_PULLDOWN | | ||
| 695 | OMAP_OFFOUT_EN | | ||
| 696 | OMAP_MUX_MODE0), | ||
| 697 | OMAP_MUX_STATIC("uart2_tx.uart2_tx", | ||
| 698 | OMAP_PIN_OUTPUT | | ||
| 699 | OMAP_OFF_EN | | ||
| 700 | OMAP_MUX_MODE0), | ||
| 701 | }; | ||
| 702 | |||
| 703 | static struct omap_device_pad serial3_pads[] __initdata = { | ||
| 704 | OMAP_MUX_STATIC("uart3_cts_rctx.uart3_cts_rctx", | ||
| 705 | OMAP_PIN_INPUT_PULLDOWN | | ||
| 706 | OMAP_PIN_OFF_INPUT_PULLDOWN | | ||
| 707 | OMAP_OFFOUT_EN | | ||
| 708 | OMAP_MUX_MODE0), | ||
| 709 | OMAP_MUX_STATIC("uart3_rts_sd.uart3_rts_sd", | ||
| 710 | OMAP_PIN_OUTPUT | | ||
| 711 | OMAP_OFF_EN | | ||
| 712 | OMAP_MUX_MODE0), | ||
| 713 | OMAP_MUX_STATIC("uart3_rx_irrx.uart3_rx_irrx", | ||
| 714 | OMAP_PIN_INPUT | | ||
| 715 | OMAP_PIN_OFF_INPUT_PULLDOWN | | ||
| 716 | OMAP_OFFOUT_EN | | ||
| 717 | OMAP_MUX_MODE0), | ||
| 718 | OMAP_MUX_STATIC("uart3_tx_irtx.uart3_tx_irtx", | ||
| 719 | OMAP_PIN_OUTPUT | | ||
| 720 | OMAP_OFF_EN | | ||
| 721 | OMAP_MUX_MODE0), | ||
| 722 | }; | ||
| 723 | |||
| 724 | static struct omap_board_data serial1_data = { | ||
| 725 | .id = 0, | ||
| 726 | .pads = serial1_pads, | ||
| 727 | .pads_cnt = ARRAY_SIZE(serial1_pads), | ||
| 728 | }; | ||
| 729 | |||
| 730 | static struct omap_board_data serial2_data = { | ||
| 731 | .id = 1, | ||
| 732 | .pads = serial2_pads, | ||
| 733 | .pads_cnt = ARRAY_SIZE(serial2_pads), | ||
| 734 | }; | ||
| 735 | |||
| 736 | static struct omap_board_data serial3_data = { | ||
| 737 | .id = 2, | ||
| 738 | .pads = serial3_pads, | ||
| 739 | .pads_cnt = ARRAY_SIZE(serial3_pads), | ||
| 740 | }; | ||
| 741 | |||
| 742 | static inline void board_serial_init(void) | ||
| 743 | { | ||
| 744 | omap_serial_init_port(&serial1_data); | ||
| 745 | omap_serial_init_port(&serial2_data); | ||
| 746 | omap_serial_init_port(&serial3_data); | ||
| 747 | } | ||
| 748 | #else | ||
| 749 | #define board_mux NULL | ||
| 750 | |||
| 751 | static inline void board_serial_init(void) | ||
| 752 | { | ||
| 753 | omap_serial_init(); | ||
| 754 | } | ||
| 655 | #endif | 755 | #endif |
| 656 | 756 | ||
| 657 | /* | 757 | /* |
| @@ -796,7 +896,7 @@ static void __init omap_3430sdp_init(void) | |||
| 796 | spi_register_board_info(sdp3430_spi_board_info, | 896 | spi_register_board_info(sdp3430_spi_board_info, |
| 797 | ARRAY_SIZE(sdp3430_spi_board_info)); | 897 | ARRAY_SIZE(sdp3430_spi_board_info)); |
| 798 | ads7846_dev_init(); | 898 | ads7846_dev_init(); |
| 799 | omap_serial_init(); | 899 | board_serial_init(); |
| 800 | usb_musb_init(&musb_board_data); | 900 | usb_musb_init(&musb_board_data); |
| 801 | board_smc91x_init(); | 901 | board_smc91x_init(); |
| 802 | board_flash_init(sdp_flash_partitions, chip_sel_3430, 0); | 902 | board_flash_init(sdp_flash_partitions, chip_sel_3430, 0); |
diff --git a/arch/arm/mach-omap2/board-4430sdp.c b/arch/arm/mach-omap2/board-4430sdp.c index 85805d432e3..670cbd567bf 100644 --- a/arch/arm/mach-omap2/board-4430sdp.c +++ b/arch/arm/mach-omap2/board-4430sdp.c | |||
| @@ -625,9 +625,76 @@ static struct omap_board_mux board_mux[] __initdata = { | |||
| 625 | OMAP4_MUX(USBB2_ULPITLL_CLK, OMAP_MUX_MODE4 | OMAP_PIN_OUTPUT), | 625 | OMAP4_MUX(USBB2_ULPITLL_CLK, OMAP_MUX_MODE4 | OMAP_PIN_OUTPUT), |
| 626 | { .reg_offset = OMAP_MUX_TERMINATOR }, | 626 | { .reg_offset = OMAP_MUX_TERMINATOR }, |
| 627 | }; | 627 | }; |
| 628 | |||
| 629 | static struct omap_device_pad serial2_pads[] __initdata = { | ||
| 630 | OMAP_MUX_STATIC("uart2_cts.uart2_cts", | ||
| 631 | OMAP_PIN_INPUT_PULLUP | OMAP_MUX_MODE0), | ||
| 632 | OMAP_MUX_STATIC("uart2_rts.uart2_rts", | ||
| 633 | OMAP_PIN_OUTPUT | OMAP_MUX_MODE0), | ||
| 634 | OMAP_MUX_STATIC("uart2_rx.uart2_rx", | ||
| 635 | OMAP_PIN_INPUT_PULLUP | OMAP_MUX_MODE0), | ||
| 636 | OMAP_MUX_STATIC("uart2_tx.uart2_tx", | ||
| 637 | OMAP_PIN_OUTPUT | OMAP_MUX_MODE0), | ||
| 638 | }; | ||
| 639 | |||
| 640 | static struct omap_device_pad serial3_pads[] __initdata = { | ||
| 641 | OMAP_MUX_STATIC("uart3_cts_rctx.uart3_cts_rctx", | ||
| 642 | OMAP_PIN_INPUT_PULLUP | OMAP_MUX_MODE0), | ||
| 643 | OMAP_MUX_STATIC("uart3_rts_sd.uart3_rts_sd", | ||
| 644 | OMAP_PIN_OUTPUT | OMAP_MUX_MODE0), | ||
| 645 | OMAP_MUX_STATIC("uart3_rx_irrx.uart3_rx_irrx", | ||
| 646 | OMAP_PIN_INPUT | OMAP_MUX_MODE0), | ||
| 647 | OMAP_MUX_STATIC("uart3_tx_irtx.uart3_tx_irtx", | ||
| 648 | OMAP_PIN_OUTPUT | OMAP_MUX_MODE0), | ||
| 649 | }; | ||
| 650 | |||
| 651 | static struct omap_device_pad serial4_pads[] __initdata = { | ||
| 652 | OMAP_MUX_STATIC("uart4_rx.uart4_rx", | ||
| 653 | OMAP_PIN_INPUT | OMAP_MUX_MODE0), | ||
| 654 | OMAP_MUX_STATIC("uart4_tx.uart4_tx", | ||
| 655 | OMAP_PIN_OUTPUT | OMAP_MUX_MODE0), | ||
| 656 | }; | ||
| 657 | |||
| 658 | static struct omap_board_data serial2_data = { | ||
| 659 | .id = 1, | ||
| 660 | .pads = serial2_pads, | ||
| 661 | .pads_cnt = ARRAY_SIZE(serial2_pads), | ||
| 662 | }; | ||
| 663 | |||
| 664 | static struct omap_board_data serial3_data = { | ||
| 665 | .id = 2, | ||
| 666 | .pads = serial3_pads, | ||
| 667 | .pads_cnt = ARRAY_SIZE(serial3_pads), | ||
| 668 | }; | ||
| 669 | |||
| 670 | static struct omap_board_data serial4_data = { | ||
| 671 | .id = 3, | ||
| 672 | .pads = serial4_pads, | ||
| 673 | .pads_cnt = ARRAY_SIZE(serial4_pads), | ||
| 674 | }; | ||
| 675 | |||
| 676 | static inline void board_serial_init(void) | ||
| 677 | { | ||
| 678 | struct omap_board_data bdata; | ||
| 679 | bdata.flags = 0; | ||
| 680 | bdata.pads = NULL; | ||
| 681 | bdata.pads_cnt = 0; | ||
| 682 | bdata.id = 0; | ||
| 683 | /* pass dummy data for UART1 */ | ||
| 684 | omap_serial_init_port(&bdata); | ||
| 685 | |||
| 686 | omap_serial_init_port(&serial2_data); | ||
| 687 | omap_serial_init_port(&serial3_data); | ||
| 688 | omap_serial_init_port(&serial4_data); | ||
| 689 | } | ||
| 628 | #else | 690 | #else |
| 629 | #define board_mux NULL | 691 | #define board_mux NULL |
| 630 | #endif | 692 | |
| 693 | static inline void board_serial_init(void) | ||
| 694 | { | ||
| 695 | omap_serial_init(); | ||
| 696 | } | ||
| 697 | #endif | ||
| 631 | 698 | ||
| 632 | static void __init omap_4430sdp_init(void) | 699 | static void __init omap_4430sdp_init(void) |
| 633 | { | 700 | { |
| @@ -644,7 +711,7 @@ static void __init omap_4430sdp_init(void) | |||
| 644 | omap4_i2c_init(); | 711 | omap4_i2c_init(); |
| 645 | omap_sfh7741prox_init(); | 712 | omap_sfh7741prox_init(); |
| 646 | platform_add_devices(sdp4430_devices, ARRAY_SIZE(sdp4430_devices)); | 713 | platform_add_devices(sdp4430_devices, ARRAY_SIZE(sdp4430_devices)); |
| 647 | omap_serial_init(); | 714 | board_serial_init(); |
| 648 | omap4_twl6030_hsmmc_init(mmc); | 715 | omap4_twl6030_hsmmc_init(mmc); |
| 649 | 716 | ||
| 650 | usb_musb_init(&musb_board_data); | 717 | usb_musb_init(&musb_board_data); |
diff --git a/arch/arm/mach-omap2/board-cm-t35.c b/arch/arm/mach-omap2/board-cm-t35.c index 27bea540ccb..71545c95238 100644 --- a/arch/arm/mach-omap2/board-cm-t35.c +++ b/arch/arm/mach-omap2/board-cm-t35.c | |||
| @@ -675,6 +675,7 @@ static void __init cm_t35_init_early(void) | |||
| 675 | mt46h32m32lf6_sdrc_params); | 675 | mt46h32m32lf6_sdrc_params); |
| 676 | } | 676 | } |
| 677 | 677 | ||
| 678 | #ifdef CONFIG_OMAP_MUX | ||
| 678 | static struct omap_board_mux board_mux[] __initdata = { | 679 | static struct omap_board_mux board_mux[] __initdata = { |
| 679 | /* nCS and IRQ for CM-T35 ethernet */ | 680 | /* nCS and IRQ for CM-T35 ethernet */ |
| 680 | OMAP3_MUX(GPMC_NCS5, OMAP_MUX_MODE0), | 681 | OMAP3_MUX(GPMC_NCS5, OMAP_MUX_MODE0), |
| @@ -772,6 +773,7 @@ static struct omap_board_mux board_mux[] __initdata = { | |||
| 772 | 773 | ||
| 773 | { .reg_offset = OMAP_MUX_TERMINATOR }, | 774 | { .reg_offset = OMAP_MUX_TERMINATOR }, |
| 774 | }; | 775 | }; |
| 776 | #endif | ||
| 775 | 777 | ||
| 776 | static struct omap_musb_board_data musb_board_data = { | 778 | static struct omap_musb_board_data musb_board_data = { |
| 777 | .interface_type = MUSB_INTERFACE_ULPI, | 779 | .interface_type = MUSB_INTERFACE_ULPI, |
diff --git a/arch/arm/mach-omap2/board-cm-t3517.c b/arch/arm/mach-omap2/board-cm-t3517.c index 9da6e8240e8..4c737e4953c 100644 --- a/arch/arm/mach-omap2/board-cm-t3517.c +++ b/arch/arm/mach-omap2/board-cm-t3517.c | |||
| @@ -260,6 +260,7 @@ static void __init cm_t3517_init_early(void) | |||
| 260 | omap2_init_common_devices(NULL, NULL); | 260 | omap2_init_common_devices(NULL, NULL); |
| 261 | } | 261 | } |
| 262 | 262 | ||
| 263 | #ifdef CONFIG_OMAP_MUX | ||
| 263 | static struct omap_board_mux board_mux[] __initdata = { | 264 | static struct omap_board_mux board_mux[] __initdata = { |
| 264 | /* GPIO186 - Green LED */ | 265 | /* GPIO186 - Green LED */ |
| 265 | OMAP3_MUX(SYS_CLKOUT2, OMAP_MUX_MODE4 | OMAP_PIN_OUTPUT), | 266 | OMAP3_MUX(SYS_CLKOUT2, OMAP_MUX_MODE4 | OMAP_PIN_OUTPUT), |
| @@ -285,6 +286,7 @@ static struct omap_board_mux board_mux[] __initdata = { | |||
| 285 | 286 | ||
| 286 | { .reg_offset = OMAP_MUX_TERMINATOR }, | 287 | { .reg_offset = OMAP_MUX_TERMINATOR }, |
| 287 | }; | 288 | }; |
| 289 | #endif | ||
| 288 | 290 | ||
| 289 | static void __init cm_t3517_init(void) | 291 | static void __init cm_t3517_init(void) |
| 290 | { | 292 | { |
diff --git a/arch/arm/mach-omap2/board-devkit8000.c b/arch/arm/mach-omap2/board-devkit8000.c index 728f27c5bcb..472a25b2dad 100644 --- a/arch/arm/mach-omap2/board-devkit8000.c +++ b/arch/arm/mach-omap2/board-devkit8000.c | |||
| @@ -625,6 +625,7 @@ static const struct ehci_hcd_omap_platform_data ehci_pdata __initconst = { | |||
| 625 | .reset_gpio_port[2] = -EINVAL | 625 | .reset_gpio_port[2] = -EINVAL |
| 626 | }; | 626 | }; |
| 627 | 627 | ||
| 628 | #ifdef CONFIG_OMAP_MUX | ||
| 628 | static struct omap_board_mux board_mux[] __initdata = { | 629 | static struct omap_board_mux board_mux[] __initdata = { |
| 629 | /* nCS and IRQ for Devkit8000 ethernet */ | 630 | /* nCS and IRQ for Devkit8000 ethernet */ |
| 630 | OMAP3_MUX(GPMC_NCS6, OMAP_MUX_MODE0), | 631 | OMAP3_MUX(GPMC_NCS6, OMAP_MUX_MODE0), |
| @@ -778,6 +779,7 @@ static struct omap_board_mux board_mux[] __initdata = { | |||
| 778 | 779 | ||
| 779 | { .reg_offset = OMAP_MUX_TERMINATOR }, | 780 | { .reg_offset = OMAP_MUX_TERMINATOR }, |
| 780 | }; | 781 | }; |
| 782 | #endif | ||
| 781 | 783 | ||
| 782 | static void __init devkit8000_init(void) | 784 | static void __init devkit8000_init(void) |
| 783 | { | 785 | { |
diff --git a/arch/arm/mach-omap2/board-omap3beagle.c b/arch/arm/mach-omap2/board-omap3beagle.c index b6752ac5b97..20c5dbea895 100644 --- a/arch/arm/mach-omap2/board-omap3beagle.c +++ b/arch/arm/mach-omap2/board-omap3beagle.c | |||
| @@ -23,6 +23,7 @@ | |||
| 23 | #include <linux/gpio.h> | 23 | #include <linux/gpio.h> |
| 24 | #include <linux/input.h> | 24 | #include <linux/input.h> |
| 25 | #include <linux/gpio_keys.h> | 25 | #include <linux/gpio_keys.h> |
| 26 | #include <linux/opp.h> | ||
| 26 | 27 | ||
| 27 | #include <linux/mtd/mtd.h> | 28 | #include <linux/mtd/mtd.h> |
| 28 | #include <linux/mtd/partitions.h> | 29 | #include <linux/mtd/partitions.h> |
| @@ -45,10 +46,12 @@ | |||
| 45 | #include <plat/gpmc.h> | 46 | #include <plat/gpmc.h> |
| 46 | #include <plat/nand.h> | 47 | #include <plat/nand.h> |
| 47 | #include <plat/usb.h> | 48 | #include <plat/usb.h> |
| 49 | #include <plat/omap_device.h> | ||
| 48 | 50 | ||
| 49 | #include "mux.h" | 51 | #include "mux.h" |
| 50 | #include "hsmmc.h" | 52 | #include "hsmmc.h" |
| 51 | #include "timer-gp.h" | 53 | #include "timer-gp.h" |
| 54 | #include "pm.h" | ||
| 52 | 55 | ||
| 53 | #define NAND_BLOCK_SIZE SZ_128K | 56 | #define NAND_BLOCK_SIZE SZ_128K |
| 54 | 57 | ||
| @@ -603,6 +606,52 @@ static struct omap_musb_board_data musb_board_data = { | |||
| 603 | .power = 100, | 606 | .power = 100, |
| 604 | }; | 607 | }; |
| 605 | 608 | ||
| 609 | static void __init beagle_opp_init(void) | ||
| 610 | { | ||
| 611 | int r = 0; | ||
| 612 | |||
| 613 | /* Initialize the omap3 opp table */ | ||
| 614 | if (omap3_opp_init()) { | ||
| 615 | pr_err("%s: opp default init failed\n", __func__); | ||
| 616 | return; | ||
| 617 | } | ||
| 618 | |||
| 619 | /* Custom OPP enabled for XM */ | ||
| 620 | if (omap3_beagle_get_rev() == OMAP3BEAGLE_BOARD_XM) { | ||
| 621 | struct omap_hwmod *mh = omap_hwmod_lookup("mpu"); | ||
| 622 | struct omap_hwmod *dh = omap_hwmod_lookup("iva"); | ||
| 623 | struct device *dev; | ||
| 624 | |||
| 625 | if (!mh || !dh) { | ||
| 626 | pr_err("%s: Aiee.. no mpu/dsp devices? %p %p\n", | ||
| 627 | __func__, mh, dh); | ||
| 628 | return; | ||
| 629 | } | ||
| 630 | /* Enable MPU 1GHz and lower opps */ | ||
| 631 | dev = &mh->od->pdev.dev; | ||
| 632 | r = opp_enable(dev, 800000000); | ||
| 633 | /* TODO: MPU 1GHz needs SR and ABB */ | ||
| 634 | |||
| 635 | /* Enable IVA 800MHz and lower opps */ | ||
| 636 | dev = &dh->od->pdev.dev; | ||
| 637 | r |= opp_enable(dev, 660000000); | ||
| 638 | /* TODO: DSP 800MHz needs SR and ABB */ | ||
| 639 | if (r) { | ||
| 640 | pr_err("%s: failed to enable higher opp %d\n", | ||
| 641 | __func__, r); | ||
| 642 | /* | ||
| 643 | * Cleanup - disable the higher freqs - we dont care | ||
| 644 | * about the results | ||
| 645 | */ | ||
| 646 | dev = &mh->od->pdev.dev; | ||
| 647 | opp_disable(dev, 800000000); | ||
| 648 | dev = &dh->od->pdev.dev; | ||
| 649 | opp_disable(dev, 660000000); | ||
| 650 | } | ||
| 651 | } | ||
| 652 | return; | ||
| 653 | } | ||
| 654 | |||
| 606 | static void __init omap3_beagle_init(void) | 655 | static void __init omap3_beagle_init(void) |
| 607 | { | 656 | { |
| 608 | omap3_mux_init(board_mux, OMAP_PACKAGE_CBB); | 657 | omap3_mux_init(board_mux, OMAP_PACKAGE_CBB); |
| @@ -627,6 +676,7 @@ static void __init omap3_beagle_init(void) | |||
| 627 | omap_mux_init_signal("sdrc_cke1", OMAP_PIN_OUTPUT); | 676 | omap_mux_init_signal("sdrc_cke1", OMAP_PIN_OUTPUT); |
| 628 | 677 | ||
| 629 | beagle_display_init(); | 678 | beagle_display_init(); |
| 679 | beagle_opp_init(); | ||
| 630 | } | 680 | } |
| 631 | 681 | ||
| 632 | MACHINE_START(OMAP3_BEAGLE, "OMAP3 Beagle Board") | 682 | MACHINE_START(OMAP3_BEAGLE, "OMAP3 Beagle Board") |
diff --git a/arch/arm/mach-omap2/board-omap4panda.c b/arch/arm/mach-omap2/board-omap4panda.c index a94ce07be72..1dd4401e646 100644 --- a/arch/arm/mach-omap2/board-omap4panda.c +++ b/arch/arm/mach-omap2/board-omap4panda.c | |||
| @@ -463,8 +463,75 @@ static struct omap_board_mux board_mux[] __initdata = { | |||
| 463 | OMAP4_MUX(SDMMC5_DAT3, OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLUP), | 463 | OMAP4_MUX(SDMMC5_DAT3, OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLUP), |
| 464 | { .reg_offset = OMAP_MUX_TERMINATOR }, | 464 | { .reg_offset = OMAP_MUX_TERMINATOR }, |
| 465 | }; | 465 | }; |
| 466 | |||
| 467 | static struct omap_device_pad serial2_pads[] __initdata = { | ||
| 468 | OMAP_MUX_STATIC("uart2_cts.uart2_cts", | ||
| 469 | OMAP_PIN_INPUT_PULLUP | OMAP_MUX_MODE0), | ||
| 470 | OMAP_MUX_STATIC("uart2_rts.uart2_rts", | ||
| 471 | OMAP_PIN_OUTPUT | OMAP_MUX_MODE0), | ||
| 472 | OMAP_MUX_STATIC("uart2_rx.uart2_rx", | ||
| 473 | OMAP_PIN_INPUT_PULLUP | OMAP_MUX_MODE0), | ||
| 474 | OMAP_MUX_STATIC("uart2_tx.uart2_tx", | ||
| 475 | OMAP_PIN_OUTPUT | OMAP_MUX_MODE0), | ||
| 476 | }; | ||
| 477 | |||
| 478 | static struct omap_device_pad serial3_pads[] __initdata = { | ||
| 479 | OMAP_MUX_STATIC("uart3_cts_rctx.uart3_cts_rctx", | ||
| 480 | OMAP_PIN_INPUT_PULLUP | OMAP_MUX_MODE0), | ||
| 481 | OMAP_MUX_STATIC("uart3_rts_sd.uart3_rts_sd", | ||
| 482 | OMAP_PIN_OUTPUT | OMAP_MUX_MODE0), | ||
| 483 | OMAP_MUX_STATIC("uart3_rx_irrx.uart3_rx_irrx", | ||
| 484 | OMAP_PIN_INPUT | OMAP_MUX_MODE0), | ||
| 485 | OMAP_MUX_STATIC("uart3_tx_irtx.uart3_tx_irtx", | ||
| 486 | OMAP_PIN_OUTPUT | OMAP_MUX_MODE0), | ||
| 487 | }; | ||
| 488 | |||
| 489 | static struct omap_device_pad serial4_pads[] __initdata = { | ||
| 490 | OMAP_MUX_STATIC("uart4_rx.uart4_rx", | ||
| 491 | OMAP_PIN_INPUT | OMAP_MUX_MODE0), | ||
| 492 | OMAP_MUX_STATIC("uart4_tx.uart4_tx", | ||
| 493 | OMAP_PIN_OUTPUT | OMAP_MUX_MODE0), | ||
| 494 | }; | ||
| 495 | |||
| 496 | static struct omap_board_data serial2_data = { | ||
| 497 | .id = 1, | ||
| 498 | .pads = serial2_pads, | ||
| 499 | .pads_cnt = ARRAY_SIZE(serial2_pads), | ||
| 500 | }; | ||
| 501 | |||
| 502 | static struct omap_board_data serial3_data = { | ||
| 503 | .id = 2, | ||
| 504 | .pads = serial3_pads, | ||
| 505 | .pads_cnt = ARRAY_SIZE(serial3_pads), | ||
| 506 | }; | ||
| 507 | |||
| 508 | static struct omap_board_data serial4_data = { | ||
| 509 | .id = 3, | ||
| 510 | .pads = serial4_pads, | ||
| 511 | .pads_cnt = ARRAY_SIZE(serial4_pads), | ||
| 512 | }; | ||
| 513 | |||
| 514 | static inline void board_serial_init(void) | ||
| 515 | { | ||
| 516 | struct omap_board_data bdata; | ||
| 517 | bdata.flags = 0; | ||
| 518 | bdata.pads = NULL; | ||
| 519 | bdata.pads_cnt = 0; | ||
| 520 | bdata.id = 0; | ||
| 521 | /* pass dummy data for UART1 */ | ||
| 522 | omap_serial_init_port(&bdata); | ||
| 523 | |||
| 524 | omap_serial_init_port(&serial2_data); | ||
| 525 | omap_serial_init_port(&serial3_data); | ||
| 526 | omap_serial_init_port(&serial4_data); | ||
| 527 | } | ||
| 466 | #else | 528 | #else |
| 467 | #define board_mux NULL | 529 | #define board_mux NULL |
| 530 | |||
| 531 | static inline void board_serial_init(void) | ||
| 532 | { | ||
| 533 | omap_serial_init(); | ||
| 534 | } | ||
| 468 | #endif | 535 | #endif |
| 469 | 536 | ||
| 470 | static void __init omap4_panda_init(void) | 537 | static void __init omap4_panda_init(void) |
| @@ -481,7 +548,7 @@ static void __init omap4_panda_init(void) | |||
| 481 | omap4_panda_i2c_init(); | 548 | omap4_panda_i2c_init(); |
| 482 | platform_add_devices(panda_devices, ARRAY_SIZE(panda_devices)); | 549 | platform_add_devices(panda_devices, ARRAY_SIZE(panda_devices)); |
| 483 | platform_device_register(&omap_vwlan_device); | 550 | platform_device_register(&omap_vwlan_device); |
| 484 | omap_serial_init(); | 551 | board_serial_init(); |
| 485 | omap4_twl6030_hsmmc_init(mmc); | 552 | omap4_twl6030_hsmmc_init(mmc); |
| 486 | omap4_ehci_init(); | 553 | omap4_ehci_init(); |
| 487 | usb_musb_init(&musb_board_data); | 554 | usb_musb_init(&musb_board_data); |
diff --git a/arch/arm/mach-omap2/clkt2xxx_apll.c b/arch/arm/mach-omap2/clkt2xxx_apll.c index f51cffd1fc5..b19a1f7234a 100644 --- a/arch/arm/mach-omap2/clkt2xxx_apll.c +++ b/arch/arm/mach-omap2/clkt2xxx_apll.c | |||
| @@ -78,6 +78,26 @@ static int omap2_clk_apll54_enable(struct clk *clk) | |||
| 78 | return omap2_clk_apll_enable(clk, OMAP24XX_ST_54M_APLL_MASK); | 78 | return omap2_clk_apll_enable(clk, OMAP24XX_ST_54M_APLL_MASK); |
| 79 | } | 79 | } |
| 80 | 80 | ||
| 81 | static void _apll96_allow_idle(struct clk *clk) | ||
| 82 | { | ||
| 83 | omap2xxx_cm_set_apll96_auto_low_power_stop(); | ||
| 84 | } | ||
| 85 | |||
| 86 | static void _apll96_deny_idle(struct clk *clk) | ||
| 87 | { | ||
| 88 | omap2xxx_cm_set_apll96_disable_autoidle(); | ||
| 89 | } | ||
| 90 | |||
| 91 | static void _apll54_allow_idle(struct clk *clk) | ||
| 92 | { | ||
| 93 | omap2xxx_cm_set_apll54_auto_low_power_stop(); | ||
| 94 | } | ||
| 95 | |||
| 96 | static void _apll54_deny_idle(struct clk *clk) | ||
| 97 | { | ||
| 98 | omap2xxx_cm_set_apll54_disable_autoidle(); | ||
| 99 | } | ||
| 100 | |||
| 81 | /* Stop APLL */ | 101 | /* Stop APLL */ |
| 82 | static void omap2_clk_apll_disable(struct clk *clk) | 102 | static void omap2_clk_apll_disable(struct clk *clk) |
| 83 | { | 103 | { |
| @@ -93,11 +113,15 @@ static void omap2_clk_apll_disable(struct clk *clk) | |||
| 93 | const struct clkops clkops_apll96 = { | 113 | const struct clkops clkops_apll96 = { |
| 94 | .enable = omap2_clk_apll96_enable, | 114 | .enable = omap2_clk_apll96_enable, |
| 95 | .disable = omap2_clk_apll_disable, | 115 | .disable = omap2_clk_apll_disable, |
| 116 | .allow_idle = _apll96_allow_idle, | ||
| 117 | .deny_idle = _apll96_deny_idle, | ||
| 96 | }; | 118 | }; |
| 97 | 119 | ||
| 98 | const struct clkops clkops_apll54 = { | 120 | const struct clkops clkops_apll54 = { |
| 99 | .enable = omap2_clk_apll54_enable, | 121 | .enable = omap2_clk_apll54_enable, |
| 100 | .disable = omap2_clk_apll_disable, | 122 | .disable = omap2_clk_apll_disable, |
| 123 | .allow_idle = _apll54_allow_idle, | ||
| 124 | .deny_idle = _apll54_deny_idle, | ||
| 101 | }; | 125 | }; |
| 102 | 126 | ||
| 103 | /* Public functions */ | 127 | /* Public functions */ |
diff --git a/arch/arm/mach-omap2/clkt2xxx_dpll.c b/arch/arm/mach-omap2/clkt2xxx_dpll.c new file mode 100644 index 00000000000..1502a7bc20b --- /dev/null +++ b/arch/arm/mach-omap2/clkt2xxx_dpll.c | |||
| @@ -0,0 +1,63 @@ | |||
| 1 | /* | ||
| 2 | * OMAP2-specific DPLL control functions | ||
| 3 | * | ||
| 4 | * Copyright (C) 2011 Nokia Corporation | ||
| 5 | * Paul Walmsley | ||
| 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/errno.h> | ||
| 14 | #include <linux/clk.h> | ||
| 15 | #include <linux/io.h> | ||
| 16 | |||
| 17 | #include <plat/clock.h> | ||
| 18 | |||
| 19 | #include "clock.h" | ||
| 20 | #include "cm2xxx_3xxx.h" | ||
| 21 | #include "cm-regbits-24xx.h" | ||
| 22 | |||
| 23 | /* Private functions */ | ||
| 24 | |||
| 25 | /** | ||
| 26 | * _allow_idle - enable DPLL autoidle bits | ||
| 27 | * @clk: struct clk * of the DPLL to operate on | ||
| 28 | * | ||
| 29 | * Enable DPLL automatic idle control. The DPLL will enter low-power | ||
| 30 | * stop when its downstream clocks are gated. No return value. | ||
| 31 | * REVISIT: DPLL can optionally enter low-power bypass by writing 0x1 | ||
| 32 | * instead. Add some mechanism to optionally enter this mode. | ||
| 33 | */ | ||
| 34 | static void _allow_idle(struct clk *clk) | ||
| 35 | { | ||
| 36 | if (!clk || !clk->dpll_data) | ||
| 37 | return; | ||
| 38 | |||
| 39 | omap2xxx_cm_set_dpll_auto_low_power_stop(); | ||
| 40 | } | ||
| 41 | |||
| 42 | /** | ||
| 43 | * _deny_idle - prevent DPLL from automatically idling | ||
| 44 | * @clk: struct clk * of the DPLL to operate on | ||
| 45 | * | ||
| 46 | * Disable DPLL automatic idle control. No return value. | ||
| 47 | */ | ||
| 48 | static void _deny_idle(struct clk *clk) | ||
| 49 | { | ||
| 50 | if (!clk || !clk->dpll_data) | ||
| 51 | return; | ||
| 52 | |||
| 53 | omap2xxx_cm_set_dpll_disable_autoidle(); | ||
| 54 | } | ||
| 55 | |||
| 56 | |||
| 57 | /* Public data */ | ||
| 58 | |||
| 59 | const struct clkops clkops_omap2xxx_dpll_ops = { | ||
| 60 | .allow_idle = _allow_idle, | ||
| 61 | .deny_idle = _deny_idle, | ||
| 62 | }; | ||
| 63 | |||
diff --git a/arch/arm/mach-omap2/clkt2xxx_osc.c b/arch/arm/mach-omap2/clkt2xxx_osc.c index df7b8050648..c3460928b5e 100644 --- a/arch/arm/mach-omap2/clkt2xxx_osc.c +++ b/arch/arm/mach-omap2/clkt2xxx_osc.c | |||
| @@ -30,6 +30,13 @@ | |||
| 30 | #include "prm2xxx_3xxx.h" | 30 | #include "prm2xxx_3xxx.h" |
| 31 | #include "prm-regbits-24xx.h" | 31 | #include "prm-regbits-24xx.h" |
| 32 | 32 | ||
| 33 | /* | ||
| 34 | * XXX This does not actually enable the osc_ck, since the osc_ck must | ||
| 35 | * be running for this function to be called. Instead, this function | ||
| 36 | * is used to disable an autoidle mode on the osc_ck. The existing | ||
| 37 | * clk_enable/clk_disable()-based usecounting for osc_ck should be | ||
| 38 | * replaced with autoidle-based usecounting. | ||
| 39 | */ | ||
| 33 | static int omap2_enable_osc_ck(struct clk *clk) | 40 | static int omap2_enable_osc_ck(struct clk *clk) |
| 34 | { | 41 | { |
| 35 | u32 pcc; | 42 | u32 pcc; |
| @@ -41,6 +48,13 @@ static int omap2_enable_osc_ck(struct clk *clk) | |||
| 41 | return 0; | 48 | return 0; |
| 42 | } | 49 | } |
| 43 | 50 | ||
| 51 | /* | ||
| 52 | * XXX This does not actually disable the osc_ck, since doing so would | ||
| 53 | * immediately halt the system. Instead, this function is used to | ||
| 54 | * enable an autoidle mode on the osc_ck. The existing | ||
| 55 | * clk_enable/clk_disable()-based usecounting for osc_ck should be | ||
| 56 | * replaced with autoidle-based usecounting. | ||
| 57 | */ | ||
| 44 | static void omap2_disable_osc_ck(struct clk *clk) | 58 | static void omap2_disable_osc_ck(struct clk *clk) |
| 45 | { | 59 | { |
| 46 | u32 pcc; | 60 | u32 pcc; |
diff --git a/arch/arm/mach-omap2/clkt_dpll.c b/arch/arm/mach-omap2/clkt_dpll.c index acb7ae5b0a2..bcffee001bf 100644 --- a/arch/arm/mach-omap2/clkt_dpll.c +++ b/arch/arm/mach-omap2/clkt_dpll.c | |||
| @@ -178,12 +178,11 @@ void omap2_init_dpll_parent(struct clk *clk) | |||
| 178 | if (!dd) | 178 | if (!dd) |
| 179 | return; | 179 | return; |
| 180 | 180 | ||
| 181 | /* Return bypass rate if DPLL is bypassed */ | ||
| 182 | v = __raw_readl(dd->control_reg); | 181 | v = __raw_readl(dd->control_reg); |
| 183 | v &= dd->enable_mask; | 182 | v &= dd->enable_mask; |
| 184 | v >>= __ffs(dd->enable_mask); | 183 | v >>= __ffs(dd->enable_mask); |
| 185 | 184 | ||
| 186 | /* Reparent in case the dpll is in bypass */ | 185 | /* Reparent the struct clk in case the dpll is in bypass */ |
| 187 | if (cpu_is_omap24xx()) { | 186 | if (cpu_is_omap24xx()) { |
| 188 | if (v == OMAP2XXX_EN_DPLL_LPBYPASS || | 187 | if (v == OMAP2XXX_EN_DPLL_LPBYPASS || |
| 189 | v == OMAP2XXX_EN_DPLL_FRBYPASS) | 188 | v == OMAP2XXX_EN_DPLL_FRBYPASS) |
| @@ -260,50 +259,22 @@ u32 omap2_get_dpll_rate(struct clk *clk) | |||
| 260 | /* DPLL rate rounding code */ | 259 | /* DPLL rate rounding code */ |
| 261 | 260 | ||
| 262 | /** | 261 | /** |
| 263 | * omap2_dpll_set_rate_tolerance: set the error tolerance during rate rounding | ||
| 264 | * @clk: struct clk * of the DPLL | ||
| 265 | * @tolerance: maximum rate error tolerance | ||
| 266 | * | ||
| 267 | * Set the maximum DPLL rate error tolerance for the rate rounding | ||
| 268 | * algorithm. The rate tolerance is an attempt to balance DPLL power | ||
| 269 | * saving (the least divider value "n") vs. rate fidelity (the least | ||
| 270 | * difference between the desired DPLL target rate and the rounded | ||
| 271 | * rate out of the algorithm). So, increasing the tolerance is likely | ||
| 272 | * to decrease DPLL power consumption and increase DPLL rate error. | ||
| 273 | * Returns -EINVAL if provided a null clock ptr or a clk that is not a | ||
| 274 | * DPLL; or 0 upon success. | ||
| 275 | */ | ||
| 276 | int omap2_dpll_set_rate_tolerance(struct clk *clk, unsigned int tolerance) | ||
| 277 | { | ||
| 278 | if (!clk || !clk->dpll_data) | ||
| 279 | return -EINVAL; | ||
| 280 | |||
| 281 | clk->dpll_data->rate_tolerance = tolerance; | ||
| 282 | |||
| 283 | return 0; | ||
| 284 | } | ||
| 285 | |||
| 286 | /** | ||
| 287 | * omap2_dpll_round_rate - round a target rate for an OMAP DPLL | 262 | * omap2_dpll_round_rate - round a target rate for an OMAP DPLL |
| 288 | * @clk: struct clk * for a DPLL | 263 | * @clk: struct clk * for a DPLL |
| 289 | * @target_rate: desired DPLL clock rate | 264 | * @target_rate: desired DPLL clock rate |
| 290 | * | 265 | * |
| 291 | * Given a DPLL, a desired target rate, and a rate tolerance, round | 266 | * Given a DPLL and a desired target rate, round the target rate to a |
| 292 | * the target rate to a possible, programmable rate for this DPLL. | 267 | * possible, programmable rate for this DPLL. Attempts to select the |
| 293 | * Rate tolerance is assumed to be set by the caller before this | 268 | * minimum possible n. Stores the computed (m, n) in the DPLL's |
| 294 | * function is called. Attempts to select the minimum possible n | 269 | * dpll_data structure so set_rate() will not need to call this |
| 295 | * within the tolerance to reduce power consumption. Stores the | 270 | * (expensive) function again. Returns ~0 if the target rate cannot |
| 296 | * computed (m, n) in the DPLL's dpll_data structure so set_rate() | 271 | * be rounded, or the rounded rate upon success. |
| 297 | * will not need to call this (expensive) function again. Returns ~0 | ||
| 298 | * if the target rate cannot be rounded, either because the rate is | ||
| 299 | * too low or because the rate tolerance is set too tightly; or the | ||
| 300 | * rounded rate upon success. | ||
| 301 | */ | 272 | */ |
| 302 | long omap2_dpll_round_rate(struct clk *clk, unsigned long target_rate) | 273 | long omap2_dpll_round_rate(struct clk *clk, unsigned long target_rate) |
| 303 | { | 274 | { |
| 304 | int m, n, r, e, scaled_max_m; | 275 | int m, n, r, scaled_max_m; |
| 305 | unsigned long scaled_rt_rp, new_rate; | 276 | unsigned long scaled_rt_rp; |
| 306 | int min_e = -1, min_e_m = -1, min_e_n = -1; | 277 | unsigned long new_rate = 0; |
| 307 | struct dpll_data *dd; | 278 | struct dpll_data *dd; |
| 308 | 279 | ||
| 309 | if (!clk || !clk->dpll_data) | 280 | if (!clk || !clk->dpll_data) |
| @@ -311,8 +282,8 @@ long omap2_dpll_round_rate(struct clk *clk, unsigned long target_rate) | |||
| 311 | 282 | ||
| 312 | dd = clk->dpll_data; | 283 | dd = clk->dpll_data; |
| 313 | 284 | ||
| 314 | pr_debug("clock: starting DPLL round_rate for clock %s, target rate " | 285 | pr_debug("clock: %s: starting DPLL round_rate, target rate %ld\n", |
| 315 | "%ld\n", clk->name, target_rate); | 286 | clk->name, target_rate); |
| 316 | 287 | ||
| 317 | scaled_rt_rp = target_rate / (dd->clk_ref->rate / DPLL_SCALE_FACTOR); | 288 | scaled_rt_rp = target_rate / (dd->clk_ref->rate / DPLL_SCALE_FACTOR); |
| 318 | scaled_max_m = dd->max_multiplier * DPLL_SCALE_FACTOR; | 289 | scaled_max_m = dd->max_multiplier * DPLL_SCALE_FACTOR; |
| @@ -347,39 +318,23 @@ long omap2_dpll_round_rate(struct clk *clk, unsigned long target_rate) | |||
| 347 | if (r == DPLL_MULT_UNDERFLOW) | 318 | if (r == DPLL_MULT_UNDERFLOW) |
| 348 | continue; | 319 | continue; |
| 349 | 320 | ||
| 350 | e = target_rate - new_rate; | 321 | pr_debug("clock: %s: m = %d: n = %d: new_rate = %ld\n", |
| 351 | pr_debug("clock: n = %d: m = %d: rate error is %d " | 322 | clk->name, m, n, new_rate); |
| 352 | "(new_rate = %ld)\n", n, m, e, new_rate); | ||
| 353 | |||
| 354 | if (min_e == -1 || | ||
| 355 | min_e >= (int)(abs(e) - dd->rate_tolerance)) { | ||
| 356 | min_e = e; | ||
| 357 | min_e_m = m; | ||
| 358 | min_e_n = n; | ||
| 359 | |||
| 360 | pr_debug("clock: found new least error %d\n", min_e); | ||
| 361 | 323 | ||
| 362 | /* We found good settings -- bail out now */ | 324 | if (target_rate == new_rate) { |
| 363 | if (min_e <= dd->rate_tolerance) | 325 | dd->last_rounded_m = m; |
| 364 | break; | 326 | dd->last_rounded_n = n; |
| 327 | dd->last_rounded_rate = target_rate; | ||
| 328 | break; | ||
| 365 | } | 329 | } |
| 366 | } | 330 | } |
| 367 | 331 | ||
| 368 | if (min_e < 0) { | 332 | if (target_rate != new_rate) { |
| 369 | pr_debug("clock: error: target rate or tolerance too low\n"); | 333 | pr_debug("clock: %s: cannot round to rate %ld\n", clk->name, |
| 334 | target_rate); | ||
| 370 | return ~0; | 335 | return ~0; |
| 371 | } | 336 | } |
| 372 | 337 | ||
| 373 | dd->last_rounded_m = min_e_m; | 338 | return target_rate; |
| 374 | dd->last_rounded_n = min_e_n; | ||
| 375 | dd->last_rounded_rate = _dpll_compute_new_rate(dd->clk_ref->rate, | ||
| 376 | min_e_m, min_e_n); | ||
| 377 | |||
| 378 | pr_debug("clock: final least error: e = %d, m = %d, n = %d\n", | ||
| 379 | min_e, min_e_m, min_e_n); | ||
| 380 | pr_debug("clock: final rate: %ld (target rate: %ld)\n", | ||
| 381 | dd->last_rounded_rate, target_rate); | ||
| 382 | |||
| 383 | return dd->last_rounded_rate; | ||
| 384 | } | 339 | } |
| 385 | 340 | ||
diff --git a/arch/arm/mach-omap2/clkt_iclk.c b/arch/arm/mach-omap2/clkt_iclk.c new file mode 100644 index 00000000000..3d43fba2542 --- /dev/null +++ b/arch/arm/mach-omap2/clkt_iclk.c | |||
| @@ -0,0 +1,82 @@ | |||
| 1 | /* | ||
| 2 | * OMAP2/3 interface clock control | ||
| 3 | * | ||
| 4 | * Copyright (C) 2011 Nokia Corporation | ||
| 5 | * Paul Walmsley | ||
| 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 | #undef DEBUG | ||
| 12 | |||
| 13 | #include <linux/kernel.h> | ||
| 14 | #include <linux/clk.h> | ||
| 15 | #include <linux/io.h> | ||
| 16 | |||
| 17 | #include <plat/clock.h> | ||
| 18 | #include <plat/prcm.h> | ||
| 19 | |||
| 20 | #include "clock.h" | ||
| 21 | #include "clock2xxx.h" | ||
| 22 | #include "cm2xxx_3xxx.h" | ||
| 23 | #include "cm-regbits-24xx.h" | ||
| 24 | |||
| 25 | /* Private functions */ | ||
| 26 | |||
| 27 | /* XXX */ | ||
| 28 | void omap2_clkt_iclk_allow_idle(struct clk *clk) | ||
| 29 | { | ||
| 30 | u32 v, r; | ||
| 31 | |||
| 32 | r = ((__force u32)clk->enable_reg ^ (CM_AUTOIDLE ^ CM_ICLKEN)); | ||
| 33 | |||
| 34 | v = __raw_readl((__force void __iomem *)r); | ||
| 35 | v |= (1 << clk->enable_bit); | ||
| 36 | __raw_writel(v, (__force void __iomem *)r); | ||
| 37 | } | ||
| 38 | |||
| 39 | /* XXX */ | ||
| 40 | void omap2_clkt_iclk_deny_idle(struct clk *clk) | ||
| 41 | { | ||
| 42 | u32 v, r; | ||
| 43 | |||
| 44 | r = ((__force u32)clk->enable_reg ^ (CM_AUTOIDLE ^ CM_ICLKEN)); | ||
| 45 | |||
| 46 | v = __raw_readl((__force void __iomem *)r); | ||
| 47 | v &= ~(1 << clk->enable_bit); | ||
| 48 | __raw_writel(v, (__force void __iomem *)r); | ||
| 49 | } | ||
| 50 | |||
| 51 | /* Public data */ | ||
| 52 | |||
| 53 | const struct clkops clkops_omap2_iclk_dflt_wait = { | ||
| 54 | .enable = omap2_dflt_clk_enable, | ||
| 55 | .disable = omap2_dflt_clk_disable, | ||
| 56 | .find_companion = omap2_clk_dflt_find_companion, | ||
| 57 | .find_idlest = omap2_clk_dflt_find_idlest, | ||
| 58 | .allow_idle = omap2_clkt_iclk_allow_idle, | ||
| 59 | .deny_idle = omap2_clkt_iclk_deny_idle, | ||
| 60 | }; | ||
| 61 | |||
| 62 | const struct clkops clkops_omap2_iclk_dflt = { | ||
| 63 | .enable = omap2_dflt_clk_enable, | ||
| 64 | .disable = omap2_dflt_clk_disable, | ||
| 65 | .allow_idle = omap2_clkt_iclk_allow_idle, | ||
| 66 | .deny_idle = omap2_clkt_iclk_deny_idle, | ||
| 67 | }; | ||
| 68 | |||
| 69 | const struct clkops clkops_omap2_iclk_idle_only = { | ||
| 70 | .allow_idle = omap2_clkt_iclk_allow_idle, | ||
| 71 | .deny_idle = omap2_clkt_iclk_deny_idle, | ||
| 72 | }; | ||
| 73 | |||
| 74 | const struct clkops clkops_omap2_mdmclk_dflt_wait = { | ||
| 75 | .enable = omap2_dflt_clk_enable, | ||
| 76 | .disable = omap2_dflt_clk_disable, | ||
| 77 | .find_companion = omap2_clk_dflt_find_companion, | ||
| 78 | .find_idlest = omap2_clk_dflt_find_idlest, | ||
| 79 | .allow_idle = omap2_clkt_iclk_allow_idle, | ||
| 80 | .deny_idle = omap2_clkt_iclk_deny_idle, | ||
| 81 | }; | ||
| 82 | |||
diff --git a/arch/arm/mach-omap2/clock.c b/arch/arm/mach-omap2/clock.c index 2a2f15213ad..180299e4a83 100644 --- a/arch/arm/mach-omap2/clock.c +++ b/arch/arm/mach-omap2/clock.c | |||
| @@ -22,7 +22,9 @@ | |||
| 22 | #include <linux/clk.h> | 22 | #include <linux/clk.h> |
| 23 | #include <linux/io.h> | 23 | #include <linux/io.h> |
| 24 | #include <linux/bitops.h> | 24 | #include <linux/bitops.h> |
| 25 | #include <trace/events/power.h> | ||
| 25 | 26 | ||
| 27 | #include <asm/cpu.h> | ||
| 26 | #include <plat/clock.h> | 28 | #include <plat/clock.h> |
| 27 | #include "clockdomain.h" | 29 | #include "clockdomain.h" |
| 28 | #include <plat/cpu.h> | 30 | #include <plat/cpu.h> |
| @@ -261,10 +263,13 @@ void omap2_clk_disable(struct clk *clk) | |||
| 261 | 263 | ||
| 262 | pr_debug("clock: %s: disabling in hardware\n", clk->name); | 264 | pr_debug("clock: %s: disabling in hardware\n", clk->name); |
| 263 | 265 | ||
| 264 | clk->ops->disable(clk); | 266 | if (clk->ops && clk->ops->disable) { |
| 267 | trace_clock_disable(clk->name, 0, smp_processor_id()); | ||
| 268 | clk->ops->disable(clk); | ||
| 269 | } | ||
| 265 | 270 | ||
| 266 | if (clk->clkdm) | 271 | if (clk->clkdm) |
| 267 | omap2_clkdm_clk_disable(clk->clkdm, clk); | 272 | clkdm_clk_disable(clk->clkdm, clk); |
| 268 | 273 | ||
| 269 | if (clk->parent) | 274 | if (clk->parent) |
| 270 | omap2_clk_disable(clk->parent); | 275 | omap2_clk_disable(clk->parent); |
| @@ -304,7 +309,7 @@ int omap2_clk_enable(struct clk *clk) | |||
| 304 | } | 309 | } |
| 305 | 310 | ||
| 306 | if (clk->clkdm) { | 311 | if (clk->clkdm) { |
| 307 | ret = omap2_clkdm_clk_enable(clk->clkdm, clk); | 312 | ret = clkdm_clk_enable(clk->clkdm, clk); |
| 308 | if (ret) { | 313 | if (ret) { |
| 309 | WARN(1, "clock: %s: could not enable clockdomain %s: " | 314 | WARN(1, "clock: %s: could not enable clockdomain %s: " |
| 310 | "%d\n", clk->name, clk->clkdm->name, ret); | 315 | "%d\n", clk->name, clk->clkdm->name, ret); |
| @@ -312,17 +317,21 @@ int omap2_clk_enable(struct clk *clk) | |||
| 312 | } | 317 | } |
| 313 | } | 318 | } |
| 314 | 319 | ||
| 315 | ret = clk->ops->enable(clk); | 320 | if (clk->ops && clk->ops->enable) { |
| 316 | if (ret) { | 321 | trace_clock_enable(clk->name, 1, smp_processor_id()); |
| 317 | WARN(1, "clock: %s: could not enable: %d\n", clk->name, ret); | 322 | ret = clk->ops->enable(clk); |
| 318 | goto oce_err3; | 323 | if (ret) { |
| 324 | WARN(1, "clock: %s: could not enable: %d\n", | ||
| 325 | clk->name, ret); | ||
| 326 | goto oce_err3; | ||
| 327 | } | ||
| 319 | } | 328 | } |
| 320 | 329 | ||
| 321 | return 0; | 330 | return 0; |
| 322 | 331 | ||
| 323 | oce_err3: | 332 | oce_err3: |
| 324 | if (clk->clkdm) | 333 | if (clk->clkdm) |
| 325 | omap2_clkdm_clk_disable(clk->clkdm, clk); | 334 | clkdm_clk_disable(clk->clkdm, clk); |
| 326 | oce_err2: | 335 | oce_err2: |
| 327 | if (clk->parent) | 336 | if (clk->parent) |
| 328 | omap2_clk_disable(clk->parent); | 337 | omap2_clk_disable(clk->parent); |
| @@ -349,8 +358,10 @@ int omap2_clk_set_rate(struct clk *clk, unsigned long rate) | |||
| 349 | pr_debug("clock: set_rate for clock %s to rate %ld\n", clk->name, rate); | 358 | pr_debug("clock: set_rate for clock %s to rate %ld\n", clk->name, rate); |
| 350 | 359 | ||
| 351 | /* dpll_ck, core_ck, virt_prcm_set; plus all clksel clocks */ | 360 | /* dpll_ck, core_ck, virt_prcm_set; plus all clksel clocks */ |
| 352 | if (clk->set_rate) | 361 | if (clk->set_rate) { |
| 362 | trace_clock_set_rate(clk->name, rate, smp_processor_id()); | ||
| 353 | ret = clk->set_rate(clk, rate); | 363 | ret = clk->set_rate(clk, rate); |
| 364 | } | ||
| 354 | 365 | ||
| 355 | return ret; | 366 | return ret; |
| 356 | } | 367 | } |
| @@ -373,10 +384,16 @@ int omap2_clk_set_parent(struct clk *clk, struct clk *new_parent) | |||
| 373 | const struct clkops clkops_omap3_noncore_dpll_ops = { | 384 | const struct clkops clkops_omap3_noncore_dpll_ops = { |
| 374 | .enable = omap3_noncore_dpll_enable, | 385 | .enable = omap3_noncore_dpll_enable, |
| 375 | .disable = omap3_noncore_dpll_disable, | 386 | .disable = omap3_noncore_dpll_disable, |
| 387 | .allow_idle = omap3_dpll_allow_idle, | ||
| 388 | .deny_idle = omap3_dpll_deny_idle, | ||
| 376 | }; | 389 | }; |
| 377 | 390 | ||
| 378 | #endif | 391 | const struct clkops clkops_omap3_core_dpll_ops = { |
| 392 | .allow_idle = omap3_dpll_allow_idle, | ||
| 393 | .deny_idle = omap3_dpll_deny_idle, | ||
| 394 | }; | ||
| 379 | 395 | ||
| 396 | #endif | ||
| 380 | 397 | ||
| 381 | /* | 398 | /* |
| 382 | * OMAP2+ clock reset and init functions | 399 | * OMAP2+ clock reset and init functions |
diff --git a/arch/arm/mach-omap2/clock.h b/arch/arm/mach-omap2/clock.h index 896584e3c4a..e10ff2b5484 100644 --- a/arch/arm/mach-omap2/clock.h +++ b/arch/arm/mach-omap2/clock.h | |||
| @@ -2,7 +2,7 @@ | |||
| 2 | * linux/arch/arm/mach-omap2/clock.h | 2 | * linux/arch/arm/mach-omap2/clock.h |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2005-2009 Texas Instruments, Inc. | 4 | * Copyright (C) 2005-2009 Texas Instruments, Inc. |
| 5 | * Copyright (C) 2004-2009 Nokia Corporation | 5 | * Copyright (C) 2004-2011 Nokia Corporation |
| 6 | * | 6 | * |
| 7 | * Contacts: | 7 | * Contacts: |
| 8 | * Richard Woodruff <r-woodruff2@ti.com> | 8 | * Richard Woodruff <r-woodruff2@ti.com> |
| @@ -18,9 +18,6 @@ | |||
| 18 | 18 | ||
| 19 | #include <plat/clock.h> | 19 | #include <plat/clock.h> |
| 20 | 20 | ||
| 21 | /* The maximum error between a target DPLL rate and the rounded rate in Hz */ | ||
| 22 | #define DEFAULT_DPLL_RATE_TOLERANCE 50000 | ||
| 23 | |||
| 24 | /* CM_CLKSEL2_PLL.CORE_CLK_SRC bits (2XXX) */ | 21 | /* CM_CLKSEL2_PLL.CORE_CLK_SRC bits (2XXX) */ |
| 25 | #define CORE_CLK_SRC_32K 0x0 | 22 | #define CORE_CLK_SRC_32K 0x0 |
| 26 | #define CORE_CLK_SRC_DPLL 0x1 | 23 | #define CORE_CLK_SRC_DPLL 0x1 |
| @@ -55,7 +52,6 @@ void omap2_clk_disable(struct clk *clk); | |||
| 55 | long omap2_clk_round_rate(struct clk *clk, unsigned long rate); | 52 | long omap2_clk_round_rate(struct clk *clk, unsigned long rate); |
| 56 | int omap2_clk_set_rate(struct clk *clk, unsigned long rate); | 53 | int omap2_clk_set_rate(struct clk *clk, unsigned long rate); |
| 57 | int omap2_clk_set_parent(struct clk *clk, struct clk *new_parent); | 54 | int omap2_clk_set_parent(struct clk *clk, struct clk *new_parent); |
| 58 | int omap2_dpll_set_rate_tolerance(struct clk *clk, unsigned int tolerance); | ||
| 59 | long omap2_dpll_round_rate(struct clk *clk, unsigned long target_rate); | 55 | long omap2_dpll_round_rate(struct clk *clk, unsigned long target_rate); |
| 60 | unsigned long omap3_dpll_recalc(struct clk *clk); | 56 | unsigned long omap3_dpll_recalc(struct clk *clk); |
| 61 | unsigned long omap3_clkoutx2_recalc(struct clk *clk); | 57 | unsigned long omap3_clkoutx2_recalc(struct clk *clk); |
| @@ -65,6 +61,9 @@ u32 omap3_dpll_autoidle_read(struct clk *clk); | |||
| 65 | int omap3_noncore_dpll_set_rate(struct clk *clk, unsigned long rate); | 61 | int omap3_noncore_dpll_set_rate(struct clk *clk, unsigned long rate); |
| 66 | int omap3_noncore_dpll_enable(struct clk *clk); | 62 | int omap3_noncore_dpll_enable(struct clk *clk); |
| 67 | void omap3_noncore_dpll_disable(struct clk *clk); | 63 | void omap3_noncore_dpll_disable(struct clk *clk); |
| 64 | int omap4_dpllmx_gatectrl_read(struct clk *clk); | ||
| 65 | void omap4_dpllmx_allow_gatectrl(struct clk *clk); | ||
| 66 | void omap4_dpllmx_deny_gatectrl(struct clk *clk); | ||
| 68 | 67 | ||
| 69 | #ifdef CONFIG_OMAP_RESET_CLOCKS | 68 | #ifdef CONFIG_OMAP_RESET_CLOCKS |
| 70 | void omap2_clk_disable_unused(struct clk *clk); | 69 | void omap2_clk_disable_unused(struct clk *clk); |
| @@ -83,6 +82,10 @@ long omap2_clksel_round_rate(struct clk *clk, unsigned long target_rate); | |||
| 83 | int omap2_clksel_set_rate(struct clk *clk, unsigned long rate); | 82 | int omap2_clksel_set_rate(struct clk *clk, unsigned long rate); |
| 84 | int omap2_clksel_set_parent(struct clk *clk, struct clk *new_parent); | 83 | int omap2_clksel_set_parent(struct clk *clk, struct clk *new_parent); |
| 85 | 84 | ||
| 85 | /* clkt_iclk.c public functions */ | ||
| 86 | extern void omap2_clkt_iclk_allow_idle(struct clk *clk); | ||
| 87 | extern void omap2_clkt_iclk_deny_idle(struct clk *clk); | ||
| 88 | |||
| 86 | u32 omap2_get_dpll_rate(struct clk *clk); | 89 | u32 omap2_get_dpll_rate(struct clk *clk); |
| 87 | void omap2_init_dpll_parent(struct clk *clk); | 90 | void omap2_init_dpll_parent(struct clk *clk); |
| 88 | 91 | ||
| @@ -136,6 +139,7 @@ extern struct clk *vclk, *sclk; | |||
| 136 | extern const struct clksel_rate gpt_32k_rates[]; | 139 | extern const struct clksel_rate gpt_32k_rates[]; |
| 137 | extern const struct clksel_rate gpt_sys_rates[]; | 140 | extern const struct clksel_rate gpt_sys_rates[]; |
| 138 | extern const struct clksel_rate gfx_l3_rates[]; | 141 | extern const struct clksel_rate gfx_l3_rates[]; |
| 142 | extern const struct clksel_rate dsp_ick_rates[]; | ||
| 139 | 143 | ||
| 140 | #if defined(CONFIG_ARCH_OMAP2) && defined(CONFIG_CPU_FREQ) | 144 | #if defined(CONFIG_ARCH_OMAP2) && defined(CONFIG_CPU_FREQ) |
| 141 | extern void omap2_clk_init_cpufreq_table(struct cpufreq_frequency_table **table); | 145 | extern void omap2_clk_init_cpufreq_table(struct cpufreq_frequency_table **table); |
| @@ -145,6 +149,13 @@ extern void omap2_clk_exit_cpufreq_table(struct cpufreq_frequency_table **table) | |||
| 145 | #define omap2_clk_exit_cpufreq_table 0 | 149 | #define omap2_clk_exit_cpufreq_table 0 |
| 146 | #endif | 150 | #endif |
| 147 | 151 | ||
| 152 | extern const struct clkops clkops_omap2_iclk_dflt_wait; | ||
| 153 | extern const struct clkops clkops_omap2_iclk_dflt; | ||
| 154 | extern const struct clkops clkops_omap2_iclk_idle_only; | ||
| 155 | extern const struct clkops clkops_omap2_mdmclk_dflt_wait; | ||
| 156 | extern const struct clkops clkops_omap2xxx_dpll_ops; | ||
| 148 | extern const struct clkops clkops_omap3_noncore_dpll_ops; | 157 | extern const struct clkops clkops_omap3_noncore_dpll_ops; |
| 158 | extern const struct clkops clkops_omap3_core_dpll_ops; | ||
| 159 | extern const struct clkops clkops_omap4_dpllmx_ops; | ||
| 149 | 160 | ||
| 150 | #endif | 161 | #endif |
diff --git a/arch/arm/mach-omap2/clock2420_data.c b/arch/arm/mach-omap2/clock2420_data.c index 0a992bc8d0d..b6f65d4ac97 100644 --- a/arch/arm/mach-omap2/clock2420_data.c +++ b/arch/arm/mach-omap2/clock2420_data.c | |||
| @@ -1,12 +1,12 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * linux/arch/arm/mach-omap2/clock2420_data.c | 2 | * OMAP2420 clock data |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2005-2009 Texas Instruments, Inc. | 4 | * Copyright (C) 2005-2009 Texas Instruments, Inc. |
| 5 | * Copyright (C) 2004-2010 Nokia Corporation | 5 | * Copyright (C) 2004-2011 Nokia Corporation |
| 6 | * | 6 | * |
| 7 | * Contacts: | 7 | * Contacts: |
| 8 | * Richard Woodruff <r-woodruff2@ti.com> | 8 | * Richard Woodruff <r-woodruff2@ti.com> |
| 9 | * Paul Walmsley | 9 | * Paul Walmsley |
| 10 | * | 10 | * |
| 11 | * This program is free software; you can redistribute it and/or modify | 11 | * This program is free software; you can redistribute it and/or modify |
| 12 | * it under the terms of the GNU General Public License version 2 as | 12 | * it under the terms of the GNU General Public License version 2 as |
| @@ -34,18 +34,15 @@ | |||
| 34 | /* | 34 | /* |
| 35 | * 2420 clock tree. | 35 | * 2420 clock tree. |
| 36 | * | 36 | * |
| 37 | * NOTE:In many cases here we are assigning a 'default' parent. In many | 37 | * NOTE:In many cases here we are assigning a 'default' parent. In |
| 38 | * cases the parent is selectable. The get/set parent calls will also | 38 | * many cases the parent is selectable. The set parent calls will |
| 39 | * switch sources. | 39 | * also switch sources. |
| 40 | * | ||
| 41 | * Many some clocks say always_enabled, but they can be auto idled for | ||
| 42 | * power savings. They will always be available upon clock request. | ||
| 43 | * | 40 | * |
| 44 | * Several sources are given initial rates which may be wrong, this will | 41 | * Several sources are given initial rates which may be wrong, this will |
| 45 | * be fixed up in the init func. | 42 | * be fixed up in the init func. |
| 46 | * | 43 | * |
| 47 | * Things are broadly separated below by clock domains. It is | 44 | * Things are broadly separated below by clock domains. It is |
| 48 | * noteworthy that most periferals have dependencies on multiple clock | 45 | * noteworthy that most peripherals have dependencies on multiple clock |
| 49 | * domains. Many get their interface clocks from the L4 domain, but get | 46 | * domains. Many get their interface clocks from the L4 domain, but get |
| 50 | * functional clocks from fixed sources or other core domain derived | 47 | * functional clocks from fixed sources or other core domain derived |
| 51 | * clocks. | 48 | * clocks. |
| @@ -55,7 +52,7 @@ | |||
| 55 | static struct clk func_32k_ck = { | 52 | static struct clk func_32k_ck = { |
| 56 | .name = "func_32k_ck", | 53 | .name = "func_32k_ck", |
| 57 | .ops = &clkops_null, | 54 | .ops = &clkops_null, |
| 58 | .rate = 32000, | 55 | .rate = 32768, |
| 59 | .clkdm_name = "wkup_clkdm", | 56 | .clkdm_name = "wkup_clkdm", |
| 60 | }; | 57 | }; |
| 61 | 58 | ||
| @@ -116,7 +113,6 @@ static struct dpll_data dpll_dd = { | |||
| 116 | .max_multiplier = 1023, | 113 | .max_multiplier = 1023, |
| 117 | .min_divider = 1, | 114 | .min_divider = 1, |
| 118 | .max_divider = 16, | 115 | .max_divider = 16, |
| 119 | .rate_tolerance = DEFAULT_DPLL_RATE_TOLERANCE | ||
| 120 | }; | 116 | }; |
| 121 | 117 | ||
| 122 | /* | 118 | /* |
| @@ -125,7 +121,7 @@ static struct dpll_data dpll_dd = { | |||
| 125 | */ | 121 | */ |
| 126 | static struct clk dpll_ck = { | 122 | static struct clk dpll_ck = { |
| 127 | .name = "dpll_ck", | 123 | .name = "dpll_ck", |
| 128 | .ops = &clkops_null, | 124 | .ops = &clkops_omap2xxx_dpll_ops, |
| 129 | .parent = &sys_ck, /* Can be func_32k also */ | 125 | .parent = &sys_ck, /* Can be func_32k also */ |
| 130 | .dpll_data = &dpll_dd, | 126 | .dpll_data = &dpll_dd, |
| 131 | .clkdm_name = "wkup_clkdm", | 127 | .clkdm_name = "wkup_clkdm", |
| @@ -455,36 +451,22 @@ static struct clk dsp_fck = { | |||
| 455 | .recalc = &omap2_clksel_recalc, | 451 | .recalc = &omap2_clksel_recalc, |
| 456 | }; | 452 | }; |
| 457 | 453 | ||
| 458 | /* DSP interface clock */ | 454 | static const struct clksel dsp_ick_clksel[] = { |
| 459 | static const struct clksel_rate dsp_irate_ick_rates[] = { | 455 | { .parent = &dsp_fck, .rates = dsp_ick_rates }, |
| 460 | { .div = 1, .val = 1, .flags = RATE_IN_24XX }, | ||
| 461 | { .div = 2, .val = 2, .flags = RATE_IN_24XX }, | ||
| 462 | { .div = 0 }, | ||
| 463 | }; | ||
| 464 | |||
| 465 | static const struct clksel dsp_irate_ick_clksel[] = { | ||
| 466 | { .parent = &dsp_fck, .rates = dsp_irate_ick_rates }, | ||
| 467 | { .parent = NULL } | 456 | { .parent = NULL } |
| 468 | }; | 457 | }; |
| 469 | 458 | ||
| 470 | /* This clock does not exist as such in the TRM. */ | ||
| 471 | static struct clk dsp_irate_ick = { | ||
| 472 | .name = "dsp_irate_ick", | ||
| 473 | .ops = &clkops_null, | ||
| 474 | .parent = &dsp_fck, | ||
| 475 | .clksel_reg = OMAP_CM_REGADDR(OMAP24XX_DSP_MOD, CM_CLKSEL), | ||
| 476 | .clksel_mask = OMAP24XX_CLKSEL_DSP_IF_MASK, | ||
| 477 | .clksel = dsp_irate_ick_clksel, | ||
| 478 | .recalc = &omap2_clksel_recalc, | ||
| 479 | }; | ||
| 480 | |||
| 481 | /* 2420 only */ | ||
| 482 | static struct clk dsp_ick = { | 459 | static struct clk dsp_ick = { |
| 483 | .name = "dsp_ick", /* apparently ipi and isp */ | 460 | .name = "dsp_ick", /* apparently ipi and isp */ |
| 484 | .ops = &clkops_omap2_dflt_wait, | 461 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 485 | .parent = &dsp_irate_ick, | 462 | .parent = &dsp_fck, |
| 463 | .clkdm_name = "dsp_clkdm", | ||
| 486 | .enable_reg = OMAP_CM_REGADDR(OMAP24XX_DSP_MOD, CM_ICLKEN), | 464 | .enable_reg = OMAP_CM_REGADDR(OMAP24XX_DSP_MOD, CM_ICLKEN), |
| 487 | .enable_bit = OMAP2420_EN_DSP_IPI_SHIFT, /* for ipi */ | 465 | .enable_bit = OMAP2420_EN_DSP_IPI_SHIFT, /* for ipi */ |
| 466 | .clksel_reg = OMAP_CM_REGADDR(OMAP24XX_DSP_MOD, CM_CLKSEL), | ||
| 467 | .clksel_mask = OMAP24XX_CLKSEL_DSP_IF_MASK, | ||
| 468 | .clksel = dsp_ick_clksel, | ||
| 469 | .recalc = &omap2_clksel_recalc, | ||
| 488 | }; | 470 | }; |
| 489 | 471 | ||
| 490 | /* | 472 | /* |
| @@ -579,7 +561,7 @@ static const struct clksel usb_l4_ick_clksel[] = { | |||
| 579 | /* It is unclear from TRM whether usb_l4_ick is really in L3 or L4 clkdm */ | 561 | /* It is unclear from TRM whether usb_l4_ick is really in L3 or L4 clkdm */ |
| 580 | static struct clk usb_l4_ick = { /* FS-USB interface clock */ | 562 | static struct clk usb_l4_ick = { /* FS-USB interface clock */ |
| 581 | .name = "usb_l4_ick", | 563 | .name = "usb_l4_ick", |
| 582 | .ops = &clkops_omap2_dflt_wait, | 564 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 583 | .parent = &core_l3_ck, | 565 | .parent = &core_l3_ck, |
| 584 | .clkdm_name = "core_l4_clkdm", | 566 | .clkdm_name = "core_l4_clkdm", |
| 585 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2), | 567 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2), |
| @@ -661,7 +643,7 @@ static struct clk ssi_ssr_sst_fck = { | |||
| 661 | */ | 643 | */ |
| 662 | static struct clk ssi_l4_ick = { | 644 | static struct clk ssi_l4_ick = { |
| 663 | .name = "ssi_l4_ick", | 645 | .name = "ssi_l4_ick", |
| 664 | .ops = &clkops_omap2_dflt_wait, | 646 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 665 | .parent = &l4_ck, | 647 | .parent = &l4_ck, |
| 666 | .clkdm_name = "core_l4_clkdm", | 648 | .clkdm_name = "core_l4_clkdm", |
| 667 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2), | 649 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2), |
| @@ -716,6 +698,7 @@ static struct clk gfx_2d_fck = { | |||
| 716 | .recalc = &omap2_clksel_recalc, | 698 | .recalc = &omap2_clksel_recalc, |
| 717 | }; | 699 | }; |
| 718 | 700 | ||
| 701 | /* This interface clock does not have a CM_AUTOIDLE bit */ | ||
| 719 | static struct clk gfx_ick = { | 702 | static struct clk gfx_ick = { |
| 720 | .name = "gfx_ick", /* From l3 */ | 703 | .name = "gfx_ick", /* From l3 */ |
| 721 | .ops = &clkops_omap2_dflt_wait, | 704 | .ops = &clkops_omap2_dflt_wait, |
| @@ -763,7 +746,7 @@ static const struct clksel dss1_fck_clksel[] = { | |||
| 763 | 746 | ||
| 764 | static struct clk dss_ick = { /* Enables both L3,L4 ICLK's */ | 747 | static struct clk dss_ick = { /* Enables both L3,L4 ICLK's */ |
| 765 | .name = "dss_ick", | 748 | .name = "dss_ick", |
| 766 | .ops = &clkops_omap2_dflt, | 749 | .ops = &clkops_omap2_iclk_dflt, |
| 767 | .parent = &l4_ck, /* really both l3 and l4 */ | 750 | .parent = &l4_ck, /* really both l3 and l4 */ |
| 768 | .clkdm_name = "dss_clkdm", | 751 | .clkdm_name = "dss_clkdm", |
| 769 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 752 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| @@ -825,6 +808,14 @@ static struct clk dss_54m_fck = { /* Alt clk used in power management */ | |||
| 825 | .recalc = &followparent_recalc, | 808 | .recalc = &followparent_recalc, |
| 826 | }; | 809 | }; |
| 827 | 810 | ||
| 811 | static struct clk wu_l4_ick = { | ||
| 812 | .name = "wu_l4_ick", | ||
| 813 | .ops = &clkops_null, | ||
| 814 | .parent = &sys_ck, | ||
| 815 | .clkdm_name = "wkup_clkdm", | ||
| 816 | .recalc = &followparent_recalc, | ||
| 817 | }; | ||
| 818 | |||
| 828 | /* | 819 | /* |
| 829 | * CORE power domain ICLK & FCLK defines. | 820 | * CORE power domain ICLK & FCLK defines. |
| 830 | * Many of the these can have more than one possible parent. Entries | 821 | * Many of the these can have more than one possible parent. Entries |
| @@ -845,9 +836,9 @@ static const struct clksel omap24xx_gpt_clksel[] = { | |||
| 845 | 836 | ||
| 846 | static struct clk gpt1_ick = { | 837 | static struct clk gpt1_ick = { |
| 847 | .name = "gpt1_ick", | 838 | .name = "gpt1_ick", |
| 848 | .ops = &clkops_omap2_dflt_wait, | 839 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 849 | .parent = &l4_ck, | 840 | .parent = &wu_l4_ick, |
| 850 | .clkdm_name = "core_l4_clkdm", | 841 | .clkdm_name = "wkup_clkdm", |
| 851 | .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN), | 842 | .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN), |
| 852 | .enable_bit = OMAP24XX_EN_GPT1_SHIFT, | 843 | .enable_bit = OMAP24XX_EN_GPT1_SHIFT, |
| 853 | .recalc = &followparent_recalc, | 844 | .recalc = &followparent_recalc, |
| @@ -871,7 +862,7 @@ static struct clk gpt1_fck = { | |||
| 871 | 862 | ||
| 872 | static struct clk gpt2_ick = { | 863 | static struct clk gpt2_ick = { |
| 873 | .name = "gpt2_ick", | 864 | .name = "gpt2_ick", |
| 874 | .ops = &clkops_omap2_dflt_wait, | 865 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 875 | .parent = &l4_ck, | 866 | .parent = &l4_ck, |
| 876 | .clkdm_name = "core_l4_clkdm", | 867 | .clkdm_name = "core_l4_clkdm", |
| 877 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 868 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| @@ -895,7 +886,7 @@ static struct clk gpt2_fck = { | |||
| 895 | 886 | ||
| 896 | static struct clk gpt3_ick = { | 887 | static struct clk gpt3_ick = { |
| 897 | .name = "gpt3_ick", | 888 | .name = "gpt3_ick", |
| 898 | .ops = &clkops_omap2_dflt_wait, | 889 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 899 | .parent = &l4_ck, | 890 | .parent = &l4_ck, |
| 900 | .clkdm_name = "core_l4_clkdm", | 891 | .clkdm_name = "core_l4_clkdm", |
| 901 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 892 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| @@ -919,7 +910,7 @@ static struct clk gpt3_fck = { | |||
| 919 | 910 | ||
| 920 | static struct clk gpt4_ick = { | 911 | static struct clk gpt4_ick = { |
| 921 | .name = "gpt4_ick", | 912 | .name = "gpt4_ick", |
| 922 | .ops = &clkops_omap2_dflt_wait, | 913 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 923 | .parent = &l4_ck, | 914 | .parent = &l4_ck, |
| 924 | .clkdm_name = "core_l4_clkdm", | 915 | .clkdm_name = "core_l4_clkdm", |
| 925 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 916 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| @@ -943,7 +934,7 @@ static struct clk gpt4_fck = { | |||
| 943 | 934 | ||
| 944 | static struct clk gpt5_ick = { | 935 | static struct clk gpt5_ick = { |
| 945 | .name = "gpt5_ick", | 936 | .name = "gpt5_ick", |
| 946 | .ops = &clkops_omap2_dflt_wait, | 937 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 947 | .parent = &l4_ck, | 938 | .parent = &l4_ck, |
| 948 | .clkdm_name = "core_l4_clkdm", | 939 | .clkdm_name = "core_l4_clkdm", |
| 949 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 940 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| @@ -967,7 +958,7 @@ static struct clk gpt5_fck = { | |||
| 967 | 958 | ||
| 968 | static struct clk gpt6_ick = { | 959 | static struct clk gpt6_ick = { |
| 969 | .name = "gpt6_ick", | 960 | .name = "gpt6_ick", |
| 970 | .ops = &clkops_omap2_dflt_wait, | 961 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 971 | .parent = &l4_ck, | 962 | .parent = &l4_ck, |
| 972 | .clkdm_name = "core_l4_clkdm", | 963 | .clkdm_name = "core_l4_clkdm", |
| 973 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 964 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| @@ -991,8 +982,9 @@ static struct clk gpt6_fck = { | |||
| 991 | 982 | ||
| 992 | static struct clk gpt7_ick = { | 983 | static struct clk gpt7_ick = { |
| 993 | .name = "gpt7_ick", | 984 | .name = "gpt7_ick", |
| 994 | .ops = &clkops_omap2_dflt_wait, | 985 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 995 | .parent = &l4_ck, | 986 | .parent = &l4_ck, |
| 987 | .clkdm_name = "core_l4_clkdm", | ||
| 996 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 988 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| 997 | .enable_bit = OMAP24XX_EN_GPT7_SHIFT, | 989 | .enable_bit = OMAP24XX_EN_GPT7_SHIFT, |
| 998 | .recalc = &followparent_recalc, | 990 | .recalc = &followparent_recalc, |
| @@ -1014,7 +1006,7 @@ static struct clk gpt7_fck = { | |||
| 1014 | 1006 | ||
| 1015 | static struct clk gpt8_ick = { | 1007 | static struct clk gpt8_ick = { |
| 1016 | .name = "gpt8_ick", | 1008 | .name = "gpt8_ick", |
| 1017 | .ops = &clkops_omap2_dflt_wait, | 1009 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1018 | .parent = &l4_ck, | 1010 | .parent = &l4_ck, |
| 1019 | .clkdm_name = "core_l4_clkdm", | 1011 | .clkdm_name = "core_l4_clkdm", |
| 1020 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1012 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| @@ -1038,7 +1030,7 @@ static struct clk gpt8_fck = { | |||
| 1038 | 1030 | ||
| 1039 | static struct clk gpt9_ick = { | 1031 | static struct clk gpt9_ick = { |
| 1040 | .name = "gpt9_ick", | 1032 | .name = "gpt9_ick", |
| 1041 | .ops = &clkops_omap2_dflt_wait, | 1033 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1042 | .parent = &l4_ck, | 1034 | .parent = &l4_ck, |
| 1043 | .clkdm_name = "core_l4_clkdm", | 1035 | .clkdm_name = "core_l4_clkdm", |
| 1044 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1036 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| @@ -1062,7 +1054,7 @@ static struct clk gpt9_fck = { | |||
| 1062 | 1054 | ||
| 1063 | static struct clk gpt10_ick = { | 1055 | static struct clk gpt10_ick = { |
| 1064 | .name = "gpt10_ick", | 1056 | .name = "gpt10_ick", |
| 1065 | .ops = &clkops_omap2_dflt_wait, | 1057 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1066 | .parent = &l4_ck, | 1058 | .parent = &l4_ck, |
| 1067 | .clkdm_name = "core_l4_clkdm", | 1059 | .clkdm_name = "core_l4_clkdm", |
| 1068 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1060 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| @@ -1086,7 +1078,7 @@ static struct clk gpt10_fck = { | |||
| 1086 | 1078 | ||
| 1087 | static struct clk gpt11_ick = { | 1079 | static struct clk gpt11_ick = { |
| 1088 | .name = "gpt11_ick", | 1080 | .name = "gpt11_ick", |
| 1089 | .ops = &clkops_omap2_dflt_wait, | 1081 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1090 | .parent = &l4_ck, | 1082 | .parent = &l4_ck, |
| 1091 | .clkdm_name = "core_l4_clkdm", | 1083 | .clkdm_name = "core_l4_clkdm", |
| 1092 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1084 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| @@ -1110,7 +1102,7 @@ static struct clk gpt11_fck = { | |||
| 1110 | 1102 | ||
| 1111 | static struct clk gpt12_ick = { | 1103 | static struct clk gpt12_ick = { |
| 1112 | .name = "gpt12_ick", | 1104 | .name = "gpt12_ick", |
| 1113 | .ops = &clkops_omap2_dflt_wait, | 1105 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1114 | .parent = &l4_ck, | 1106 | .parent = &l4_ck, |
| 1115 | .clkdm_name = "core_l4_clkdm", | 1107 | .clkdm_name = "core_l4_clkdm", |
| 1116 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1108 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| @@ -1134,7 +1126,7 @@ static struct clk gpt12_fck = { | |||
| 1134 | 1126 | ||
| 1135 | static struct clk mcbsp1_ick = { | 1127 | static struct clk mcbsp1_ick = { |
| 1136 | .name = "mcbsp1_ick", | 1128 | .name = "mcbsp1_ick", |
| 1137 | .ops = &clkops_omap2_dflt_wait, | 1129 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1138 | .parent = &l4_ck, | 1130 | .parent = &l4_ck, |
| 1139 | .clkdm_name = "core_l4_clkdm", | 1131 | .clkdm_name = "core_l4_clkdm", |
| 1140 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1132 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| @@ -1174,7 +1166,7 @@ static struct clk mcbsp1_fck = { | |||
| 1174 | 1166 | ||
| 1175 | static struct clk mcbsp2_ick = { | 1167 | static struct clk mcbsp2_ick = { |
| 1176 | .name = "mcbsp2_ick", | 1168 | .name = "mcbsp2_ick", |
| 1177 | .ops = &clkops_omap2_dflt_wait, | 1169 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1178 | .parent = &l4_ck, | 1170 | .parent = &l4_ck, |
| 1179 | .clkdm_name = "core_l4_clkdm", | 1171 | .clkdm_name = "core_l4_clkdm", |
| 1180 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1172 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| @@ -1198,7 +1190,7 @@ static struct clk mcbsp2_fck = { | |||
| 1198 | 1190 | ||
| 1199 | static struct clk mcspi1_ick = { | 1191 | static struct clk mcspi1_ick = { |
| 1200 | .name = "mcspi1_ick", | 1192 | .name = "mcspi1_ick", |
| 1201 | .ops = &clkops_omap2_dflt_wait, | 1193 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1202 | .parent = &l4_ck, | 1194 | .parent = &l4_ck, |
| 1203 | .clkdm_name = "core_l4_clkdm", | 1195 | .clkdm_name = "core_l4_clkdm", |
| 1204 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1196 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| @@ -1218,7 +1210,7 @@ static struct clk mcspi1_fck = { | |||
| 1218 | 1210 | ||
| 1219 | static struct clk mcspi2_ick = { | 1211 | static struct clk mcspi2_ick = { |
| 1220 | .name = "mcspi2_ick", | 1212 | .name = "mcspi2_ick", |
| 1221 | .ops = &clkops_omap2_dflt_wait, | 1213 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1222 | .parent = &l4_ck, | 1214 | .parent = &l4_ck, |
| 1223 | .clkdm_name = "core_l4_clkdm", | 1215 | .clkdm_name = "core_l4_clkdm", |
| 1224 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1216 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| @@ -1238,7 +1230,7 @@ static struct clk mcspi2_fck = { | |||
| 1238 | 1230 | ||
| 1239 | static struct clk uart1_ick = { | 1231 | static struct clk uart1_ick = { |
| 1240 | .name = "uart1_ick", | 1232 | .name = "uart1_ick", |
| 1241 | .ops = &clkops_omap2_dflt_wait, | 1233 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1242 | .parent = &l4_ck, | 1234 | .parent = &l4_ck, |
| 1243 | .clkdm_name = "core_l4_clkdm", | 1235 | .clkdm_name = "core_l4_clkdm", |
| 1244 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1236 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| @@ -1258,7 +1250,7 @@ static struct clk uart1_fck = { | |||
| 1258 | 1250 | ||
| 1259 | static struct clk uart2_ick = { | 1251 | static struct clk uart2_ick = { |
| 1260 | .name = "uart2_ick", | 1252 | .name = "uart2_ick", |
| 1261 | .ops = &clkops_omap2_dflt_wait, | 1253 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1262 | .parent = &l4_ck, | 1254 | .parent = &l4_ck, |
| 1263 | .clkdm_name = "core_l4_clkdm", | 1255 | .clkdm_name = "core_l4_clkdm", |
| 1264 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1256 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| @@ -1278,7 +1270,7 @@ static struct clk uart2_fck = { | |||
| 1278 | 1270 | ||
| 1279 | static struct clk uart3_ick = { | 1271 | static struct clk uart3_ick = { |
| 1280 | .name = "uart3_ick", | 1272 | .name = "uart3_ick", |
| 1281 | .ops = &clkops_omap2_dflt_wait, | 1273 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1282 | .parent = &l4_ck, | 1274 | .parent = &l4_ck, |
| 1283 | .clkdm_name = "core_l4_clkdm", | 1275 | .clkdm_name = "core_l4_clkdm", |
| 1284 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2), | 1276 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2), |
| @@ -1298,9 +1290,9 @@ static struct clk uart3_fck = { | |||
| 1298 | 1290 | ||
| 1299 | static struct clk gpios_ick = { | 1291 | static struct clk gpios_ick = { |
| 1300 | .name = "gpios_ick", | 1292 | .name = "gpios_ick", |
| 1301 | .ops = &clkops_omap2_dflt_wait, | 1293 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1302 | .parent = &l4_ck, | 1294 | .parent = &wu_l4_ick, |
| 1303 | .clkdm_name = "core_l4_clkdm", | 1295 | .clkdm_name = "wkup_clkdm", |
| 1304 | .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN), | 1296 | .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN), |
| 1305 | .enable_bit = OMAP24XX_EN_GPIOS_SHIFT, | 1297 | .enable_bit = OMAP24XX_EN_GPIOS_SHIFT, |
| 1306 | .recalc = &followparent_recalc, | 1298 | .recalc = &followparent_recalc, |
| @@ -1318,9 +1310,9 @@ static struct clk gpios_fck = { | |||
| 1318 | 1310 | ||
| 1319 | static struct clk mpu_wdt_ick = { | 1311 | static struct clk mpu_wdt_ick = { |
| 1320 | .name = "mpu_wdt_ick", | 1312 | .name = "mpu_wdt_ick", |
| 1321 | .ops = &clkops_omap2_dflt_wait, | 1313 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1322 | .parent = &l4_ck, | 1314 | .parent = &wu_l4_ick, |
| 1323 | .clkdm_name = "core_l4_clkdm", | 1315 | .clkdm_name = "wkup_clkdm", |
| 1324 | .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN), | 1316 | .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN), |
| 1325 | .enable_bit = OMAP24XX_EN_MPU_WDT_SHIFT, | 1317 | .enable_bit = OMAP24XX_EN_MPU_WDT_SHIFT, |
| 1326 | .recalc = &followparent_recalc, | 1318 | .recalc = &followparent_recalc, |
| @@ -1338,10 +1330,10 @@ static struct clk mpu_wdt_fck = { | |||
| 1338 | 1330 | ||
| 1339 | static struct clk sync_32k_ick = { | 1331 | static struct clk sync_32k_ick = { |
| 1340 | .name = "sync_32k_ick", | 1332 | .name = "sync_32k_ick", |
| 1341 | .ops = &clkops_omap2_dflt_wait, | 1333 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1342 | .parent = &l4_ck, | 1334 | .parent = &wu_l4_ick, |
| 1335 | .clkdm_name = "wkup_clkdm", | ||
| 1343 | .flags = ENABLE_ON_INIT, | 1336 | .flags = ENABLE_ON_INIT, |
| 1344 | .clkdm_name = "core_l4_clkdm", | ||
| 1345 | .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN), | 1337 | .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN), |
| 1346 | .enable_bit = OMAP24XX_EN_32KSYNC_SHIFT, | 1338 | .enable_bit = OMAP24XX_EN_32KSYNC_SHIFT, |
| 1347 | .recalc = &followparent_recalc, | 1339 | .recalc = &followparent_recalc, |
| @@ -1349,9 +1341,9 @@ static struct clk sync_32k_ick = { | |||
| 1349 | 1341 | ||
| 1350 | static struct clk wdt1_ick = { | 1342 | static struct clk wdt1_ick = { |
| 1351 | .name = "wdt1_ick", | 1343 | .name = "wdt1_ick", |
| 1352 | .ops = &clkops_omap2_dflt_wait, | 1344 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1353 | .parent = &l4_ck, | 1345 | .parent = &wu_l4_ick, |
| 1354 | .clkdm_name = "core_l4_clkdm", | 1346 | .clkdm_name = "wkup_clkdm", |
| 1355 | .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN), | 1347 | .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN), |
| 1356 | .enable_bit = OMAP24XX_EN_WDT1_SHIFT, | 1348 | .enable_bit = OMAP24XX_EN_WDT1_SHIFT, |
| 1357 | .recalc = &followparent_recalc, | 1349 | .recalc = &followparent_recalc, |
| @@ -1359,10 +1351,10 @@ static struct clk wdt1_ick = { | |||
| 1359 | 1351 | ||
| 1360 | static struct clk omapctrl_ick = { | 1352 | static struct clk omapctrl_ick = { |
| 1361 | .name = "omapctrl_ick", | 1353 | .name = "omapctrl_ick", |
| 1362 | .ops = &clkops_omap2_dflt_wait, | 1354 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1363 | .parent = &l4_ck, | 1355 | .parent = &wu_l4_ick, |
| 1356 | .clkdm_name = "wkup_clkdm", | ||
| 1364 | .flags = ENABLE_ON_INIT, | 1357 | .flags = ENABLE_ON_INIT, |
| 1365 | .clkdm_name = "core_l4_clkdm", | ||
| 1366 | .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN), | 1358 | .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN), |
| 1367 | .enable_bit = OMAP24XX_EN_OMAPCTRL_SHIFT, | 1359 | .enable_bit = OMAP24XX_EN_OMAPCTRL_SHIFT, |
| 1368 | .recalc = &followparent_recalc, | 1360 | .recalc = &followparent_recalc, |
| @@ -1370,7 +1362,7 @@ static struct clk omapctrl_ick = { | |||
| 1370 | 1362 | ||
| 1371 | static struct clk cam_ick = { | 1363 | static struct clk cam_ick = { |
| 1372 | .name = "cam_ick", | 1364 | .name = "cam_ick", |
| 1373 | .ops = &clkops_omap2_dflt, | 1365 | .ops = &clkops_omap2_iclk_dflt, |
| 1374 | .parent = &l4_ck, | 1366 | .parent = &l4_ck, |
| 1375 | .clkdm_name = "core_l4_clkdm", | 1367 | .clkdm_name = "core_l4_clkdm", |
| 1376 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1368 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| @@ -1395,7 +1387,7 @@ static struct clk cam_fck = { | |||
| 1395 | 1387 | ||
| 1396 | static struct clk mailboxes_ick = { | 1388 | static struct clk mailboxes_ick = { |
| 1397 | .name = "mailboxes_ick", | 1389 | .name = "mailboxes_ick", |
| 1398 | .ops = &clkops_omap2_dflt_wait, | 1390 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1399 | .parent = &l4_ck, | 1391 | .parent = &l4_ck, |
| 1400 | .clkdm_name = "core_l4_clkdm", | 1392 | .clkdm_name = "core_l4_clkdm", |
| 1401 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1393 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| @@ -1405,7 +1397,7 @@ static struct clk mailboxes_ick = { | |||
| 1405 | 1397 | ||
| 1406 | static struct clk wdt4_ick = { | 1398 | static struct clk wdt4_ick = { |
| 1407 | .name = "wdt4_ick", | 1399 | .name = "wdt4_ick", |
| 1408 | .ops = &clkops_omap2_dflt_wait, | 1400 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1409 | .parent = &l4_ck, | 1401 | .parent = &l4_ck, |
| 1410 | .clkdm_name = "core_l4_clkdm", | 1402 | .clkdm_name = "core_l4_clkdm", |
| 1411 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1403 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| @@ -1425,7 +1417,7 @@ static struct clk wdt4_fck = { | |||
| 1425 | 1417 | ||
| 1426 | static struct clk wdt3_ick = { | 1418 | static struct clk wdt3_ick = { |
| 1427 | .name = "wdt3_ick", | 1419 | .name = "wdt3_ick", |
| 1428 | .ops = &clkops_omap2_dflt_wait, | 1420 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1429 | .parent = &l4_ck, | 1421 | .parent = &l4_ck, |
| 1430 | .clkdm_name = "core_l4_clkdm", | 1422 | .clkdm_name = "core_l4_clkdm", |
| 1431 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1423 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| @@ -1445,7 +1437,7 @@ static struct clk wdt3_fck = { | |||
| 1445 | 1437 | ||
| 1446 | static struct clk mspro_ick = { | 1438 | static struct clk mspro_ick = { |
| 1447 | .name = "mspro_ick", | 1439 | .name = "mspro_ick", |
| 1448 | .ops = &clkops_omap2_dflt_wait, | 1440 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1449 | .parent = &l4_ck, | 1441 | .parent = &l4_ck, |
| 1450 | .clkdm_name = "core_l4_clkdm", | 1442 | .clkdm_name = "core_l4_clkdm", |
| 1451 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1443 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| @@ -1465,7 +1457,7 @@ static struct clk mspro_fck = { | |||
| 1465 | 1457 | ||
| 1466 | static struct clk mmc_ick = { | 1458 | static struct clk mmc_ick = { |
| 1467 | .name = "mmc_ick", | 1459 | .name = "mmc_ick", |
| 1468 | .ops = &clkops_omap2_dflt_wait, | 1460 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1469 | .parent = &l4_ck, | 1461 | .parent = &l4_ck, |
| 1470 | .clkdm_name = "core_l4_clkdm", | 1462 | .clkdm_name = "core_l4_clkdm", |
| 1471 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1463 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| @@ -1485,7 +1477,7 @@ static struct clk mmc_fck = { | |||
| 1485 | 1477 | ||
| 1486 | static struct clk fac_ick = { | 1478 | static struct clk fac_ick = { |
| 1487 | .name = "fac_ick", | 1479 | .name = "fac_ick", |
| 1488 | .ops = &clkops_omap2_dflt_wait, | 1480 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1489 | .parent = &l4_ck, | 1481 | .parent = &l4_ck, |
| 1490 | .clkdm_name = "core_l4_clkdm", | 1482 | .clkdm_name = "core_l4_clkdm", |
| 1491 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1483 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| @@ -1505,7 +1497,7 @@ static struct clk fac_fck = { | |||
| 1505 | 1497 | ||
| 1506 | static struct clk eac_ick = { | 1498 | static struct clk eac_ick = { |
| 1507 | .name = "eac_ick", | 1499 | .name = "eac_ick", |
| 1508 | .ops = &clkops_omap2_dflt_wait, | 1500 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1509 | .parent = &l4_ck, | 1501 | .parent = &l4_ck, |
| 1510 | .clkdm_name = "core_l4_clkdm", | 1502 | .clkdm_name = "core_l4_clkdm", |
| 1511 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1503 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| @@ -1525,7 +1517,7 @@ static struct clk eac_fck = { | |||
| 1525 | 1517 | ||
| 1526 | static struct clk hdq_ick = { | 1518 | static struct clk hdq_ick = { |
| 1527 | .name = "hdq_ick", | 1519 | .name = "hdq_ick", |
| 1528 | .ops = &clkops_omap2_dflt_wait, | 1520 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1529 | .parent = &l4_ck, | 1521 | .parent = &l4_ck, |
| 1530 | .clkdm_name = "core_l4_clkdm", | 1522 | .clkdm_name = "core_l4_clkdm", |
| 1531 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1523 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| @@ -1545,7 +1537,7 @@ static struct clk hdq_fck = { | |||
| 1545 | 1537 | ||
| 1546 | static struct clk i2c2_ick = { | 1538 | static struct clk i2c2_ick = { |
| 1547 | .name = "i2c2_ick", | 1539 | .name = "i2c2_ick", |
| 1548 | .ops = &clkops_omap2_dflt_wait, | 1540 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1549 | .parent = &l4_ck, | 1541 | .parent = &l4_ck, |
| 1550 | .clkdm_name = "core_l4_clkdm", | 1542 | .clkdm_name = "core_l4_clkdm", |
| 1551 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1543 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| @@ -1565,7 +1557,7 @@ static struct clk i2c2_fck = { | |||
| 1565 | 1557 | ||
| 1566 | static struct clk i2c1_ick = { | 1558 | static struct clk i2c1_ick = { |
| 1567 | .name = "i2c1_ick", | 1559 | .name = "i2c1_ick", |
| 1568 | .ops = &clkops_omap2_dflt_wait, | 1560 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1569 | .parent = &l4_ck, | 1561 | .parent = &l4_ck, |
| 1570 | .clkdm_name = "core_l4_clkdm", | 1562 | .clkdm_name = "core_l4_clkdm", |
| 1571 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1563 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| @@ -1583,12 +1575,18 @@ static struct clk i2c1_fck = { | |||
| 1583 | .recalc = &followparent_recalc, | 1575 | .recalc = &followparent_recalc, |
| 1584 | }; | 1576 | }; |
| 1585 | 1577 | ||
| 1578 | /* | ||
| 1579 | * The enable_reg/enable_bit in this clock is only used for CM_AUTOIDLE | ||
| 1580 | * accesses derived from this data. | ||
| 1581 | */ | ||
| 1586 | static struct clk gpmc_fck = { | 1582 | static struct clk gpmc_fck = { |
| 1587 | .name = "gpmc_fck", | 1583 | .name = "gpmc_fck", |
| 1588 | .ops = &clkops_null, /* RMK: missing? */ | 1584 | .ops = &clkops_omap2_iclk_idle_only, |
| 1589 | .parent = &core_l3_ck, | 1585 | .parent = &core_l3_ck, |
| 1590 | .flags = ENABLE_ON_INIT, | 1586 | .flags = ENABLE_ON_INIT, |
| 1591 | .clkdm_name = "core_l3_clkdm", | 1587 | .clkdm_name = "core_l3_clkdm", |
| 1588 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN3), | ||
| 1589 | .enable_bit = OMAP24XX_AUTO_GPMC_SHIFT, | ||
| 1592 | .recalc = &followparent_recalc, | 1590 | .recalc = &followparent_recalc, |
| 1593 | }; | 1591 | }; |
| 1594 | 1592 | ||
| @@ -1600,17 +1598,38 @@ static struct clk sdma_fck = { | |||
| 1600 | .recalc = &followparent_recalc, | 1598 | .recalc = &followparent_recalc, |
| 1601 | }; | 1599 | }; |
| 1602 | 1600 | ||
| 1601 | /* | ||
| 1602 | * The enable_reg/enable_bit in this clock is only used for CM_AUTOIDLE | ||
| 1603 | * accesses derived from this data. | ||
| 1604 | */ | ||
| 1603 | static struct clk sdma_ick = { | 1605 | static struct clk sdma_ick = { |
| 1604 | .name = "sdma_ick", | 1606 | .name = "sdma_ick", |
| 1605 | .ops = &clkops_null, /* RMK: missing? */ | 1607 | .ops = &clkops_omap2_iclk_idle_only, |
| 1606 | .parent = &l4_ck, | 1608 | .parent = &core_l3_ck, |
| 1609 | .clkdm_name = "core_l3_clkdm", | ||
| 1610 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN3), | ||
| 1611 | .enable_bit = OMAP24XX_AUTO_SDMA_SHIFT, | ||
| 1612 | .recalc = &followparent_recalc, | ||
| 1613 | }; | ||
| 1614 | |||
| 1615 | /* | ||
| 1616 | * The enable_reg/enable_bit in this clock is only used for CM_AUTOIDLE | ||
| 1617 | * accesses derived from this data. | ||
| 1618 | */ | ||
| 1619 | static struct clk sdrc_ick = { | ||
| 1620 | .name = "sdrc_ick", | ||
| 1621 | .ops = &clkops_omap2_iclk_idle_only, | ||
| 1622 | .parent = &core_l3_ck, | ||
| 1623 | .flags = ENABLE_ON_INIT, | ||
| 1607 | .clkdm_name = "core_l3_clkdm", | 1624 | .clkdm_name = "core_l3_clkdm", |
| 1625 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN3), | ||
| 1626 | .enable_bit = OMAP24XX_AUTO_SDRC_SHIFT, | ||
| 1608 | .recalc = &followparent_recalc, | 1627 | .recalc = &followparent_recalc, |
| 1609 | }; | 1628 | }; |
| 1610 | 1629 | ||
| 1611 | static struct clk vlynq_ick = { | 1630 | static struct clk vlynq_ick = { |
| 1612 | .name = "vlynq_ick", | 1631 | .name = "vlynq_ick", |
| 1613 | .ops = &clkops_omap2_dflt_wait, | 1632 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1614 | .parent = &core_l3_ck, | 1633 | .parent = &core_l3_ck, |
| 1615 | .clkdm_name = "core_l3_clkdm", | 1634 | .clkdm_name = "core_l3_clkdm", |
| 1616 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1635 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| @@ -1659,7 +1678,7 @@ static struct clk vlynq_fck = { | |||
| 1659 | 1678 | ||
| 1660 | static struct clk des_ick = { | 1679 | static struct clk des_ick = { |
| 1661 | .name = "des_ick", | 1680 | .name = "des_ick", |
| 1662 | .ops = &clkops_omap2_dflt_wait, | 1681 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1663 | .parent = &l4_ck, | 1682 | .parent = &l4_ck, |
| 1664 | .clkdm_name = "core_l4_clkdm", | 1683 | .clkdm_name = "core_l4_clkdm", |
| 1665 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_ICLKEN4), | 1684 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_ICLKEN4), |
| @@ -1669,7 +1688,7 @@ static struct clk des_ick = { | |||
| 1669 | 1688 | ||
| 1670 | static struct clk sha_ick = { | 1689 | static struct clk sha_ick = { |
| 1671 | .name = "sha_ick", | 1690 | .name = "sha_ick", |
| 1672 | .ops = &clkops_omap2_dflt_wait, | 1691 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1673 | .parent = &l4_ck, | 1692 | .parent = &l4_ck, |
| 1674 | .clkdm_name = "core_l4_clkdm", | 1693 | .clkdm_name = "core_l4_clkdm", |
| 1675 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_ICLKEN4), | 1694 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_ICLKEN4), |
| @@ -1679,7 +1698,7 @@ static struct clk sha_ick = { | |||
| 1679 | 1698 | ||
| 1680 | static struct clk rng_ick = { | 1699 | static struct clk rng_ick = { |
| 1681 | .name = "rng_ick", | 1700 | .name = "rng_ick", |
| 1682 | .ops = &clkops_omap2_dflt_wait, | 1701 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1683 | .parent = &l4_ck, | 1702 | .parent = &l4_ck, |
| 1684 | .clkdm_name = "core_l4_clkdm", | 1703 | .clkdm_name = "core_l4_clkdm", |
| 1685 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_ICLKEN4), | 1704 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_ICLKEN4), |
| @@ -1689,7 +1708,7 @@ static struct clk rng_ick = { | |||
| 1689 | 1708 | ||
| 1690 | static struct clk aes_ick = { | 1709 | static struct clk aes_ick = { |
| 1691 | .name = "aes_ick", | 1710 | .name = "aes_ick", |
| 1692 | .ops = &clkops_omap2_dflt_wait, | 1711 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1693 | .parent = &l4_ck, | 1712 | .parent = &l4_ck, |
| 1694 | .clkdm_name = "core_l4_clkdm", | 1713 | .clkdm_name = "core_l4_clkdm", |
| 1695 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_ICLKEN4), | 1714 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_ICLKEN4), |
| @@ -1699,7 +1718,7 @@ static struct clk aes_ick = { | |||
| 1699 | 1718 | ||
| 1700 | static struct clk pka_ick = { | 1719 | static struct clk pka_ick = { |
| 1701 | .name = "pka_ick", | 1720 | .name = "pka_ick", |
| 1702 | .ops = &clkops_omap2_dflt_wait, | 1721 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1703 | .parent = &l4_ck, | 1722 | .parent = &l4_ck, |
| 1704 | .clkdm_name = "core_l4_clkdm", | 1723 | .clkdm_name = "core_l4_clkdm", |
| 1705 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_ICLKEN4), | 1724 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_ICLKEN4), |
| @@ -1777,7 +1796,6 @@ static struct omap_clk omap2420_clks[] = { | |||
| 1777 | CLK(NULL, "mpu_ck", &mpu_ck, CK_242X), | 1796 | CLK(NULL, "mpu_ck", &mpu_ck, CK_242X), |
| 1778 | /* dsp domain clocks */ | 1797 | /* dsp domain clocks */ |
| 1779 | CLK(NULL, "dsp_fck", &dsp_fck, CK_242X), | 1798 | CLK(NULL, "dsp_fck", &dsp_fck, CK_242X), |
| 1780 | CLK(NULL, "dsp_irate_ick", &dsp_irate_ick, CK_242X), | ||
| 1781 | CLK(NULL, "dsp_ick", &dsp_ick, CK_242X), | 1799 | CLK(NULL, "dsp_ick", &dsp_ick, CK_242X), |
| 1782 | CLK(NULL, "iva1_ifck", &iva1_ifck, CK_242X), | 1800 | CLK(NULL, "iva1_ifck", &iva1_ifck, CK_242X), |
| 1783 | CLK(NULL, "iva1_mpu_int_ifck", &iva1_mpu_int_ifck, CK_242X), | 1801 | CLK(NULL, "iva1_mpu_int_ifck", &iva1_mpu_int_ifck, CK_242X), |
| @@ -1797,6 +1815,7 @@ static struct omap_clk omap2420_clks[] = { | |||
| 1797 | /* L4 domain clocks */ | 1815 | /* L4 domain clocks */ |
| 1798 | CLK(NULL, "l4_ck", &l4_ck, CK_242X), | 1816 | CLK(NULL, "l4_ck", &l4_ck, CK_242X), |
| 1799 | CLK(NULL, "ssi_l4_ick", &ssi_l4_ick, CK_242X), | 1817 | CLK(NULL, "ssi_l4_ick", &ssi_l4_ick, CK_242X), |
| 1818 | CLK(NULL, "wu_l4_ick", &wu_l4_ick, CK_242X), | ||
| 1800 | /* virtual meta-group clock */ | 1819 | /* virtual meta-group clock */ |
| 1801 | CLK(NULL, "virt_prcm_set", &virt_prcm_set, CK_242X), | 1820 | CLK(NULL, "virt_prcm_set", &virt_prcm_set, CK_242X), |
| 1802 | /* general l4 interface ck, multi-parent functional clk */ | 1821 | /* general l4 interface ck, multi-parent functional clk */ |
| @@ -1869,6 +1888,7 @@ static struct omap_clk omap2420_clks[] = { | |||
| 1869 | CLK(NULL, "gpmc_fck", &gpmc_fck, CK_242X), | 1888 | CLK(NULL, "gpmc_fck", &gpmc_fck, CK_242X), |
| 1870 | CLK(NULL, "sdma_fck", &sdma_fck, CK_242X), | 1889 | CLK(NULL, "sdma_fck", &sdma_fck, CK_242X), |
| 1871 | CLK(NULL, "sdma_ick", &sdma_ick, CK_242X), | 1890 | CLK(NULL, "sdma_ick", &sdma_ick, CK_242X), |
| 1891 | CLK(NULL, "sdrc_ick", &sdrc_ick, CK_242X), | ||
| 1872 | CLK(NULL, "vlynq_ick", &vlynq_ick, CK_242X), | 1892 | CLK(NULL, "vlynq_ick", &vlynq_ick, CK_242X), |
| 1873 | CLK(NULL, "vlynq_fck", &vlynq_fck, CK_242X), | 1893 | CLK(NULL, "vlynq_fck", &vlynq_fck, CK_242X), |
| 1874 | CLK(NULL, "des_ick", &des_ick, CK_242X), | 1894 | CLK(NULL, "des_ick", &des_ick, CK_242X), |
| @@ -1913,6 +1933,9 @@ int __init omap2420_clk_init(void) | |||
| 1913 | omap2_init_clk_clkdm(c->lk.clk); | 1933 | omap2_init_clk_clkdm(c->lk.clk); |
| 1914 | } | 1934 | } |
| 1915 | 1935 | ||
| 1936 | /* Disable autoidle on all clocks; let the PM code enable it later */ | ||
| 1937 | omap_clk_disable_autoidle_all(); | ||
| 1938 | |||
| 1916 | /* Check the MPU rate set by bootloader */ | 1939 | /* Check the MPU rate set by bootloader */ |
| 1917 | clkrate = omap2xxx_clk_get_core_rate(&dpll_ck); | 1940 | clkrate = omap2xxx_clk_get_core_rate(&dpll_ck); |
| 1918 | for (prcm = rate_table; prcm->mpu_speed; prcm++) { | 1941 | for (prcm = rate_table; prcm->mpu_speed; prcm++) { |
diff --git a/arch/arm/mach-omap2/clock2430_data.c b/arch/arm/mach-omap2/clock2430_data.c index 5c647ce05b0..bba018331a7 100644 --- a/arch/arm/mach-omap2/clock2430_data.c +++ b/arch/arm/mach-omap2/clock2430_data.c | |||
| @@ -1,12 +1,12 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * linux/arch/arm/mach-omap2/clock2430_data.c | 2 | * OMAP2430 clock data |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2005-2009 Texas Instruments, Inc. | 4 | * Copyright (C) 2005-2009 Texas Instruments, Inc. |
| 5 | * Copyright (C) 2004-2010 Nokia Corporation | 5 | * Copyright (C) 2004-2011 Nokia Corporation |
| 6 | * | 6 | * |
| 7 | * Contacts: | 7 | * Contacts: |
| 8 | * Richard Woodruff <r-woodruff2@ti.com> | 8 | * Richard Woodruff <r-woodruff2@ti.com> |
| 9 | * Paul Walmsley | 9 | * Paul Walmsley |
| 10 | * | 10 | * |
| 11 | * This program is free software; you can redistribute it and/or modify | 11 | * This program is free software; you can redistribute it and/or modify |
| 12 | * it under the terms of the GNU General Public License version 2 as | 12 | * it under the terms of the GNU General Public License version 2 as |
| @@ -34,18 +34,15 @@ | |||
| 34 | /* | 34 | /* |
| 35 | * 2430 clock tree. | 35 | * 2430 clock tree. |
| 36 | * | 36 | * |
| 37 | * NOTE:In many cases here we are assigning a 'default' parent. In many | 37 | * NOTE:In many cases here we are assigning a 'default' parent. In |
| 38 | * cases the parent is selectable. The get/set parent calls will also | 38 | * many cases the parent is selectable. The set parent calls will |
| 39 | * switch sources. | 39 | * also switch sources. |
| 40 | * | ||
| 41 | * Many some clocks say always_enabled, but they can be auto idled for | ||
| 42 | * power savings. They will always be available upon clock request. | ||
| 43 | * | 40 | * |
| 44 | * Several sources are given initial rates which may be wrong, this will | 41 | * Several sources are given initial rates which may be wrong, this will |
| 45 | * be fixed up in the init func. | 42 | * be fixed up in the init func. |
| 46 | * | 43 | * |
| 47 | * Things are broadly separated below by clock domains. It is | 44 | * Things are broadly separated below by clock domains. It is |
| 48 | * noteworthy that most periferals have dependencies on multiple clock | 45 | * noteworthy that most peripherals have dependencies on multiple clock |
| 49 | * domains. Many get their interface clocks from the L4 domain, but get | 46 | * domains. Many get their interface clocks from the L4 domain, but get |
| 50 | * functional clocks from fixed sources or other core domain derived | 47 | * functional clocks from fixed sources or other core domain derived |
| 51 | * clocks. | 48 | * clocks. |
| @@ -55,7 +52,7 @@ | |||
| 55 | static struct clk func_32k_ck = { | 52 | static struct clk func_32k_ck = { |
| 56 | .name = "func_32k_ck", | 53 | .name = "func_32k_ck", |
| 57 | .ops = &clkops_null, | 54 | .ops = &clkops_null, |
| 58 | .rate = 32000, | 55 | .rate = 32768, |
| 59 | .clkdm_name = "wkup_clkdm", | 56 | .clkdm_name = "wkup_clkdm", |
| 60 | }; | 57 | }; |
| 61 | 58 | ||
| @@ -116,7 +113,6 @@ static struct dpll_data dpll_dd = { | |||
| 116 | .max_multiplier = 1023, | 113 | .max_multiplier = 1023, |
| 117 | .min_divider = 1, | 114 | .min_divider = 1, |
| 118 | .max_divider = 16, | 115 | .max_divider = 16, |
| 119 | .rate_tolerance = DEFAULT_DPLL_RATE_TOLERANCE | ||
| 120 | }; | 116 | }; |
| 121 | 117 | ||
| 122 | /* | 118 | /* |
| @@ -125,7 +121,7 @@ static struct dpll_data dpll_dd = { | |||
| 125 | */ | 121 | */ |
| 126 | static struct clk dpll_ck = { | 122 | static struct clk dpll_ck = { |
| 127 | .name = "dpll_ck", | 123 | .name = "dpll_ck", |
| 128 | .ops = &clkops_null, | 124 | .ops = &clkops_omap2xxx_dpll_ops, |
| 129 | .parent = &sys_ck, /* Can be func_32k also */ | 125 | .parent = &sys_ck, /* Can be func_32k also */ |
| 130 | .dpll_data = &dpll_dd, | 126 | .dpll_data = &dpll_dd, |
| 131 | .clkdm_name = "wkup_clkdm", | 127 | .clkdm_name = "wkup_clkdm", |
| @@ -434,37 +430,23 @@ static struct clk dsp_fck = { | |||
| 434 | .recalc = &omap2_clksel_recalc, | 430 | .recalc = &omap2_clksel_recalc, |
| 435 | }; | 431 | }; |
| 436 | 432 | ||
| 437 | /* DSP interface clock */ | 433 | static const struct clksel dsp_ick_clksel[] = { |
| 438 | static const struct clksel_rate dsp_irate_ick_rates[] = { | 434 | { .parent = &dsp_fck, .rates = dsp_ick_rates }, |
| 439 | { .div = 1, .val = 1, .flags = RATE_IN_24XX }, | ||
| 440 | { .div = 2, .val = 2, .flags = RATE_IN_24XX }, | ||
| 441 | { .div = 3, .val = 3, .flags = RATE_IN_243X }, | ||
| 442 | { .div = 0 }, | ||
| 443 | }; | ||
| 444 | |||
| 445 | static const struct clksel dsp_irate_ick_clksel[] = { | ||
| 446 | { .parent = &dsp_fck, .rates = dsp_irate_ick_rates }, | ||
| 447 | { .parent = NULL } | 435 | { .parent = NULL } |
| 448 | }; | 436 | }; |
| 449 | 437 | ||
| 450 | /* This clock does not exist as such in the TRM. */ | ||
| 451 | static struct clk dsp_irate_ick = { | ||
| 452 | .name = "dsp_irate_ick", | ||
| 453 | .ops = &clkops_null, | ||
| 454 | .parent = &dsp_fck, | ||
| 455 | .clksel_reg = OMAP_CM_REGADDR(OMAP24XX_DSP_MOD, CM_CLKSEL), | ||
| 456 | .clksel_mask = OMAP24XX_CLKSEL_DSP_IF_MASK, | ||
| 457 | .clksel = dsp_irate_ick_clksel, | ||
| 458 | .recalc = &omap2_clksel_recalc, | ||
| 459 | }; | ||
| 460 | |||
| 461 | /* 2430 only - EN_DSP controls both dsp fclk and iclk on 2430 */ | 438 | /* 2430 only - EN_DSP controls both dsp fclk and iclk on 2430 */ |
| 462 | static struct clk iva2_1_ick = { | 439 | static struct clk iva2_1_ick = { |
| 463 | .name = "iva2_1_ick", | 440 | .name = "iva2_1_ick", |
| 464 | .ops = &clkops_omap2_dflt_wait, | 441 | .ops = &clkops_omap2_dflt_wait, |
| 465 | .parent = &dsp_irate_ick, | 442 | .parent = &dsp_fck, |
| 443 | .clkdm_name = "dsp_clkdm", | ||
| 466 | .enable_reg = OMAP_CM_REGADDR(OMAP24XX_DSP_MOD, CM_FCLKEN), | 444 | .enable_reg = OMAP_CM_REGADDR(OMAP24XX_DSP_MOD, CM_FCLKEN), |
| 467 | .enable_bit = OMAP24XX_CM_FCLKEN_DSP_EN_DSP_SHIFT, | 445 | .enable_bit = OMAP24XX_CM_FCLKEN_DSP_EN_DSP_SHIFT, |
| 446 | .clksel_reg = OMAP_CM_REGADDR(OMAP24XX_DSP_MOD, CM_CLKSEL), | ||
| 447 | .clksel_mask = OMAP24XX_CLKSEL_DSP_IF_MASK, | ||
| 448 | .clksel = dsp_ick_clksel, | ||
| 449 | .recalc = &omap2_clksel_recalc, | ||
| 468 | }; | 450 | }; |
| 469 | 451 | ||
| 470 | /* | 452 | /* |
| @@ -525,7 +507,7 @@ static const struct clksel usb_l4_ick_clksel[] = { | |||
| 525 | /* It is unclear from TRM whether usb_l4_ick is really in L3 or L4 clkdm */ | 507 | /* It is unclear from TRM whether usb_l4_ick is really in L3 or L4 clkdm */ |
| 526 | static struct clk usb_l4_ick = { /* FS-USB interface clock */ | 508 | static struct clk usb_l4_ick = { /* FS-USB interface clock */ |
| 527 | .name = "usb_l4_ick", | 509 | .name = "usb_l4_ick", |
| 528 | .ops = &clkops_omap2_dflt_wait, | 510 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 529 | .parent = &core_l3_ck, | 511 | .parent = &core_l3_ck, |
| 530 | .clkdm_name = "core_l4_clkdm", | 512 | .clkdm_name = "core_l4_clkdm", |
| 531 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2), | 513 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2), |
| @@ -606,7 +588,7 @@ static struct clk ssi_ssr_sst_fck = { | |||
| 606 | */ | 588 | */ |
| 607 | static struct clk ssi_l4_ick = { | 589 | static struct clk ssi_l4_ick = { |
| 608 | .name = "ssi_l4_ick", | 590 | .name = "ssi_l4_ick", |
| 609 | .ops = &clkops_omap2_dflt_wait, | 591 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 610 | .parent = &l4_ck, | 592 | .parent = &l4_ck, |
| 611 | .clkdm_name = "core_l4_clkdm", | 593 | .clkdm_name = "core_l4_clkdm", |
| 612 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2), | 594 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2), |
| @@ -661,6 +643,7 @@ static struct clk gfx_2d_fck = { | |||
| 661 | .recalc = &omap2_clksel_recalc, | 643 | .recalc = &omap2_clksel_recalc, |
| 662 | }; | 644 | }; |
| 663 | 645 | ||
| 646 | /* This interface clock does not have a CM_AUTOIDLE bit */ | ||
| 664 | static struct clk gfx_ick = { | 647 | static struct clk gfx_ick = { |
| 665 | .name = "gfx_ick", /* From l3 */ | 648 | .name = "gfx_ick", /* From l3 */ |
| 666 | .ops = &clkops_omap2_dflt_wait, | 649 | .ops = &clkops_omap2_dflt_wait, |
| @@ -693,7 +676,7 @@ static const struct clksel mdm_ick_clksel[] = { | |||
| 693 | 676 | ||
| 694 | static struct clk mdm_ick = { /* used both as a ick and fck */ | 677 | static struct clk mdm_ick = { /* used both as a ick and fck */ |
| 695 | .name = "mdm_ick", | 678 | .name = "mdm_ick", |
| 696 | .ops = &clkops_omap2_dflt_wait, | 679 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 697 | .parent = &core_ck, | 680 | .parent = &core_ck, |
| 698 | .clkdm_name = "mdm_clkdm", | 681 | .clkdm_name = "mdm_clkdm", |
| 699 | .enable_reg = OMAP_CM_REGADDR(OMAP2430_MDM_MOD, CM_ICLKEN), | 682 | .enable_reg = OMAP_CM_REGADDR(OMAP2430_MDM_MOD, CM_ICLKEN), |
| @@ -706,7 +689,7 @@ static struct clk mdm_ick = { /* used both as a ick and fck */ | |||
| 706 | 689 | ||
| 707 | static struct clk mdm_osc_ck = { | 690 | static struct clk mdm_osc_ck = { |
| 708 | .name = "mdm_osc_ck", | 691 | .name = "mdm_osc_ck", |
| 709 | .ops = &clkops_omap2_dflt_wait, | 692 | .ops = &clkops_omap2_mdmclk_dflt_wait, |
| 710 | .parent = &osc_ck, | 693 | .parent = &osc_ck, |
| 711 | .clkdm_name = "mdm_clkdm", | 694 | .clkdm_name = "mdm_clkdm", |
| 712 | .enable_reg = OMAP_CM_REGADDR(OMAP2430_MDM_MOD, CM_FCLKEN), | 695 | .enable_reg = OMAP_CM_REGADDR(OMAP2430_MDM_MOD, CM_FCLKEN), |
| @@ -751,7 +734,7 @@ static const struct clksel dss1_fck_clksel[] = { | |||
| 751 | 734 | ||
| 752 | static struct clk dss_ick = { /* Enables both L3,L4 ICLK's */ | 735 | static struct clk dss_ick = { /* Enables both L3,L4 ICLK's */ |
| 753 | .name = "dss_ick", | 736 | .name = "dss_ick", |
| 754 | .ops = &clkops_omap2_dflt, | 737 | .ops = &clkops_omap2_iclk_dflt, |
| 755 | .parent = &l4_ck, /* really both l3 and l4 */ | 738 | .parent = &l4_ck, /* really both l3 and l4 */ |
| 756 | .clkdm_name = "dss_clkdm", | 739 | .clkdm_name = "dss_clkdm", |
| 757 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 740 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| @@ -813,6 +796,14 @@ static struct clk dss_54m_fck = { /* Alt clk used in power management */ | |||
| 813 | .recalc = &followparent_recalc, | 796 | .recalc = &followparent_recalc, |
| 814 | }; | 797 | }; |
| 815 | 798 | ||
| 799 | static struct clk wu_l4_ick = { | ||
| 800 | .name = "wu_l4_ick", | ||
| 801 | .ops = &clkops_null, | ||
| 802 | .parent = &sys_ck, | ||
| 803 | .clkdm_name = "wkup_clkdm", | ||
| 804 | .recalc = &followparent_recalc, | ||
| 805 | }; | ||
| 806 | |||
| 816 | /* | 807 | /* |
| 817 | * CORE power domain ICLK & FCLK defines. | 808 | * CORE power domain ICLK & FCLK defines. |
| 818 | * Many of the these can have more than one possible parent. Entries | 809 | * Many of the these can have more than one possible parent. Entries |
| @@ -833,9 +824,9 @@ static const struct clksel omap24xx_gpt_clksel[] = { | |||
| 833 | 824 | ||
| 834 | static struct clk gpt1_ick = { | 825 | static struct clk gpt1_ick = { |
| 835 | .name = "gpt1_ick", | 826 | .name = "gpt1_ick", |
| 836 | .ops = &clkops_omap2_dflt_wait, | 827 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 837 | .parent = &l4_ck, | 828 | .parent = &wu_l4_ick, |
| 838 | .clkdm_name = "core_l4_clkdm", | 829 | .clkdm_name = "wkup_clkdm", |
| 839 | .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN), | 830 | .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN), |
| 840 | .enable_bit = OMAP24XX_EN_GPT1_SHIFT, | 831 | .enable_bit = OMAP24XX_EN_GPT1_SHIFT, |
| 841 | .recalc = &followparent_recalc, | 832 | .recalc = &followparent_recalc, |
| @@ -859,7 +850,7 @@ static struct clk gpt1_fck = { | |||
| 859 | 850 | ||
| 860 | static struct clk gpt2_ick = { | 851 | static struct clk gpt2_ick = { |
| 861 | .name = "gpt2_ick", | 852 | .name = "gpt2_ick", |
| 862 | .ops = &clkops_omap2_dflt_wait, | 853 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 863 | .parent = &l4_ck, | 854 | .parent = &l4_ck, |
| 864 | .clkdm_name = "core_l4_clkdm", | 855 | .clkdm_name = "core_l4_clkdm", |
| 865 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 856 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| @@ -883,7 +874,7 @@ static struct clk gpt2_fck = { | |||
| 883 | 874 | ||
| 884 | static struct clk gpt3_ick = { | 875 | static struct clk gpt3_ick = { |
| 885 | .name = "gpt3_ick", | 876 | .name = "gpt3_ick", |
| 886 | .ops = &clkops_omap2_dflt_wait, | 877 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 887 | .parent = &l4_ck, | 878 | .parent = &l4_ck, |
| 888 | .clkdm_name = "core_l4_clkdm", | 879 | .clkdm_name = "core_l4_clkdm", |
| 889 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 880 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| @@ -907,7 +898,7 @@ static struct clk gpt3_fck = { | |||
| 907 | 898 | ||
| 908 | static struct clk gpt4_ick = { | 899 | static struct clk gpt4_ick = { |
| 909 | .name = "gpt4_ick", | 900 | .name = "gpt4_ick", |
| 910 | .ops = &clkops_omap2_dflt_wait, | 901 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 911 | .parent = &l4_ck, | 902 | .parent = &l4_ck, |
| 912 | .clkdm_name = "core_l4_clkdm", | 903 | .clkdm_name = "core_l4_clkdm", |
| 913 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 904 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| @@ -931,7 +922,7 @@ static struct clk gpt4_fck = { | |||
| 931 | 922 | ||
| 932 | static struct clk gpt5_ick = { | 923 | static struct clk gpt5_ick = { |
| 933 | .name = "gpt5_ick", | 924 | .name = "gpt5_ick", |
| 934 | .ops = &clkops_omap2_dflt_wait, | 925 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 935 | .parent = &l4_ck, | 926 | .parent = &l4_ck, |
| 936 | .clkdm_name = "core_l4_clkdm", | 927 | .clkdm_name = "core_l4_clkdm", |
| 937 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 928 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| @@ -955,7 +946,7 @@ static struct clk gpt5_fck = { | |||
| 955 | 946 | ||
| 956 | static struct clk gpt6_ick = { | 947 | static struct clk gpt6_ick = { |
| 957 | .name = "gpt6_ick", | 948 | .name = "gpt6_ick", |
| 958 | .ops = &clkops_omap2_dflt_wait, | 949 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 959 | .parent = &l4_ck, | 950 | .parent = &l4_ck, |
| 960 | .clkdm_name = "core_l4_clkdm", | 951 | .clkdm_name = "core_l4_clkdm", |
| 961 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 952 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| @@ -979,8 +970,9 @@ static struct clk gpt6_fck = { | |||
| 979 | 970 | ||
| 980 | static struct clk gpt7_ick = { | 971 | static struct clk gpt7_ick = { |
| 981 | .name = "gpt7_ick", | 972 | .name = "gpt7_ick", |
| 982 | .ops = &clkops_omap2_dflt_wait, | 973 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 983 | .parent = &l4_ck, | 974 | .parent = &l4_ck, |
| 975 | .clkdm_name = "core_l4_clkdm", | ||
| 984 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 976 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| 985 | .enable_bit = OMAP24XX_EN_GPT7_SHIFT, | 977 | .enable_bit = OMAP24XX_EN_GPT7_SHIFT, |
| 986 | .recalc = &followparent_recalc, | 978 | .recalc = &followparent_recalc, |
| @@ -1002,7 +994,7 @@ static struct clk gpt7_fck = { | |||
| 1002 | 994 | ||
| 1003 | static struct clk gpt8_ick = { | 995 | static struct clk gpt8_ick = { |
| 1004 | .name = "gpt8_ick", | 996 | .name = "gpt8_ick", |
| 1005 | .ops = &clkops_omap2_dflt_wait, | 997 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1006 | .parent = &l4_ck, | 998 | .parent = &l4_ck, |
| 1007 | .clkdm_name = "core_l4_clkdm", | 999 | .clkdm_name = "core_l4_clkdm", |
| 1008 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1000 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| @@ -1026,7 +1018,7 @@ static struct clk gpt8_fck = { | |||
| 1026 | 1018 | ||
| 1027 | static struct clk gpt9_ick = { | 1019 | static struct clk gpt9_ick = { |
| 1028 | .name = "gpt9_ick", | 1020 | .name = "gpt9_ick", |
| 1029 | .ops = &clkops_omap2_dflt_wait, | 1021 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1030 | .parent = &l4_ck, | 1022 | .parent = &l4_ck, |
| 1031 | .clkdm_name = "core_l4_clkdm", | 1023 | .clkdm_name = "core_l4_clkdm", |
| 1032 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1024 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| @@ -1050,7 +1042,7 @@ static struct clk gpt9_fck = { | |||
| 1050 | 1042 | ||
| 1051 | static struct clk gpt10_ick = { | 1043 | static struct clk gpt10_ick = { |
| 1052 | .name = "gpt10_ick", | 1044 | .name = "gpt10_ick", |
| 1053 | .ops = &clkops_omap2_dflt_wait, | 1045 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1054 | .parent = &l4_ck, | 1046 | .parent = &l4_ck, |
| 1055 | .clkdm_name = "core_l4_clkdm", | 1047 | .clkdm_name = "core_l4_clkdm", |
| 1056 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1048 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| @@ -1074,7 +1066,7 @@ static struct clk gpt10_fck = { | |||
| 1074 | 1066 | ||
| 1075 | static struct clk gpt11_ick = { | 1067 | static struct clk gpt11_ick = { |
| 1076 | .name = "gpt11_ick", | 1068 | .name = "gpt11_ick", |
| 1077 | .ops = &clkops_omap2_dflt_wait, | 1069 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1078 | .parent = &l4_ck, | 1070 | .parent = &l4_ck, |
| 1079 | .clkdm_name = "core_l4_clkdm", | 1071 | .clkdm_name = "core_l4_clkdm", |
| 1080 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1072 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| @@ -1098,7 +1090,7 @@ static struct clk gpt11_fck = { | |||
| 1098 | 1090 | ||
| 1099 | static struct clk gpt12_ick = { | 1091 | static struct clk gpt12_ick = { |
| 1100 | .name = "gpt12_ick", | 1092 | .name = "gpt12_ick", |
| 1101 | .ops = &clkops_omap2_dflt_wait, | 1093 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1102 | .parent = &l4_ck, | 1094 | .parent = &l4_ck, |
| 1103 | .clkdm_name = "core_l4_clkdm", | 1095 | .clkdm_name = "core_l4_clkdm", |
| 1104 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1096 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| @@ -1122,7 +1114,7 @@ static struct clk gpt12_fck = { | |||
| 1122 | 1114 | ||
| 1123 | static struct clk mcbsp1_ick = { | 1115 | static struct clk mcbsp1_ick = { |
| 1124 | .name = "mcbsp1_ick", | 1116 | .name = "mcbsp1_ick", |
| 1125 | .ops = &clkops_omap2_dflt_wait, | 1117 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1126 | .parent = &l4_ck, | 1118 | .parent = &l4_ck, |
| 1127 | .clkdm_name = "core_l4_clkdm", | 1119 | .clkdm_name = "core_l4_clkdm", |
| 1128 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1120 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| @@ -1162,7 +1154,7 @@ static struct clk mcbsp1_fck = { | |||
| 1162 | 1154 | ||
| 1163 | static struct clk mcbsp2_ick = { | 1155 | static struct clk mcbsp2_ick = { |
| 1164 | .name = "mcbsp2_ick", | 1156 | .name = "mcbsp2_ick", |
| 1165 | .ops = &clkops_omap2_dflt_wait, | 1157 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1166 | .parent = &l4_ck, | 1158 | .parent = &l4_ck, |
| 1167 | .clkdm_name = "core_l4_clkdm", | 1159 | .clkdm_name = "core_l4_clkdm", |
| 1168 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1160 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| @@ -1186,7 +1178,7 @@ static struct clk mcbsp2_fck = { | |||
| 1186 | 1178 | ||
| 1187 | static struct clk mcbsp3_ick = { | 1179 | static struct clk mcbsp3_ick = { |
| 1188 | .name = "mcbsp3_ick", | 1180 | .name = "mcbsp3_ick", |
| 1189 | .ops = &clkops_omap2_dflt_wait, | 1181 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1190 | .parent = &l4_ck, | 1182 | .parent = &l4_ck, |
| 1191 | .clkdm_name = "core_l4_clkdm", | 1183 | .clkdm_name = "core_l4_clkdm", |
| 1192 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2), | 1184 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2), |
| @@ -1210,7 +1202,7 @@ static struct clk mcbsp3_fck = { | |||
| 1210 | 1202 | ||
| 1211 | static struct clk mcbsp4_ick = { | 1203 | static struct clk mcbsp4_ick = { |
| 1212 | .name = "mcbsp4_ick", | 1204 | .name = "mcbsp4_ick", |
| 1213 | .ops = &clkops_omap2_dflt_wait, | 1205 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1214 | .parent = &l4_ck, | 1206 | .parent = &l4_ck, |
| 1215 | .clkdm_name = "core_l4_clkdm", | 1207 | .clkdm_name = "core_l4_clkdm", |
| 1216 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2), | 1208 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2), |
| @@ -1234,7 +1226,7 @@ static struct clk mcbsp4_fck = { | |||
| 1234 | 1226 | ||
| 1235 | static struct clk mcbsp5_ick = { | 1227 | static struct clk mcbsp5_ick = { |
| 1236 | .name = "mcbsp5_ick", | 1228 | .name = "mcbsp5_ick", |
| 1237 | .ops = &clkops_omap2_dflt_wait, | 1229 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1238 | .parent = &l4_ck, | 1230 | .parent = &l4_ck, |
| 1239 | .clkdm_name = "core_l4_clkdm", | 1231 | .clkdm_name = "core_l4_clkdm", |
| 1240 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2), | 1232 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2), |
| @@ -1258,7 +1250,7 @@ static struct clk mcbsp5_fck = { | |||
| 1258 | 1250 | ||
| 1259 | static struct clk mcspi1_ick = { | 1251 | static struct clk mcspi1_ick = { |
| 1260 | .name = "mcspi1_ick", | 1252 | .name = "mcspi1_ick", |
| 1261 | .ops = &clkops_omap2_dflt_wait, | 1253 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1262 | .parent = &l4_ck, | 1254 | .parent = &l4_ck, |
| 1263 | .clkdm_name = "core_l4_clkdm", | 1255 | .clkdm_name = "core_l4_clkdm", |
| 1264 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1256 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| @@ -1278,7 +1270,7 @@ static struct clk mcspi1_fck = { | |||
| 1278 | 1270 | ||
| 1279 | static struct clk mcspi2_ick = { | 1271 | static struct clk mcspi2_ick = { |
| 1280 | .name = "mcspi2_ick", | 1272 | .name = "mcspi2_ick", |
| 1281 | .ops = &clkops_omap2_dflt_wait, | 1273 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1282 | .parent = &l4_ck, | 1274 | .parent = &l4_ck, |
| 1283 | .clkdm_name = "core_l4_clkdm", | 1275 | .clkdm_name = "core_l4_clkdm", |
| 1284 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1276 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| @@ -1298,7 +1290,7 @@ static struct clk mcspi2_fck = { | |||
| 1298 | 1290 | ||
| 1299 | static struct clk mcspi3_ick = { | 1291 | static struct clk mcspi3_ick = { |
| 1300 | .name = "mcspi3_ick", | 1292 | .name = "mcspi3_ick", |
| 1301 | .ops = &clkops_omap2_dflt_wait, | 1293 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1302 | .parent = &l4_ck, | 1294 | .parent = &l4_ck, |
| 1303 | .clkdm_name = "core_l4_clkdm", | 1295 | .clkdm_name = "core_l4_clkdm", |
| 1304 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2), | 1296 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2), |
| @@ -1318,7 +1310,7 @@ static struct clk mcspi3_fck = { | |||
| 1318 | 1310 | ||
| 1319 | static struct clk uart1_ick = { | 1311 | static struct clk uart1_ick = { |
| 1320 | .name = "uart1_ick", | 1312 | .name = "uart1_ick", |
| 1321 | .ops = &clkops_omap2_dflt_wait, | 1313 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1322 | .parent = &l4_ck, | 1314 | .parent = &l4_ck, |
| 1323 | .clkdm_name = "core_l4_clkdm", | 1315 | .clkdm_name = "core_l4_clkdm", |
| 1324 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1316 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| @@ -1338,7 +1330,7 @@ static struct clk uart1_fck = { | |||
| 1338 | 1330 | ||
| 1339 | static struct clk uart2_ick = { | 1331 | static struct clk uart2_ick = { |
| 1340 | .name = "uart2_ick", | 1332 | .name = "uart2_ick", |
| 1341 | .ops = &clkops_omap2_dflt_wait, | 1333 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1342 | .parent = &l4_ck, | 1334 | .parent = &l4_ck, |
| 1343 | .clkdm_name = "core_l4_clkdm", | 1335 | .clkdm_name = "core_l4_clkdm", |
| 1344 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1336 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| @@ -1358,7 +1350,7 @@ static struct clk uart2_fck = { | |||
| 1358 | 1350 | ||
| 1359 | static struct clk uart3_ick = { | 1351 | static struct clk uart3_ick = { |
| 1360 | .name = "uart3_ick", | 1352 | .name = "uart3_ick", |
| 1361 | .ops = &clkops_omap2_dflt_wait, | 1353 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1362 | .parent = &l4_ck, | 1354 | .parent = &l4_ck, |
| 1363 | .clkdm_name = "core_l4_clkdm", | 1355 | .clkdm_name = "core_l4_clkdm", |
| 1364 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2), | 1356 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2), |
| @@ -1378,9 +1370,9 @@ static struct clk uart3_fck = { | |||
| 1378 | 1370 | ||
| 1379 | static struct clk gpios_ick = { | 1371 | static struct clk gpios_ick = { |
| 1380 | .name = "gpios_ick", | 1372 | .name = "gpios_ick", |
| 1381 | .ops = &clkops_omap2_dflt_wait, | 1373 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1382 | .parent = &l4_ck, | 1374 | .parent = &wu_l4_ick, |
| 1383 | .clkdm_name = "core_l4_clkdm", | 1375 | .clkdm_name = "wkup_clkdm", |
| 1384 | .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN), | 1376 | .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN), |
| 1385 | .enable_bit = OMAP24XX_EN_GPIOS_SHIFT, | 1377 | .enable_bit = OMAP24XX_EN_GPIOS_SHIFT, |
| 1386 | .recalc = &followparent_recalc, | 1378 | .recalc = &followparent_recalc, |
| @@ -1398,9 +1390,9 @@ static struct clk gpios_fck = { | |||
| 1398 | 1390 | ||
| 1399 | static struct clk mpu_wdt_ick = { | 1391 | static struct clk mpu_wdt_ick = { |
| 1400 | .name = "mpu_wdt_ick", | 1392 | .name = "mpu_wdt_ick", |
| 1401 | .ops = &clkops_omap2_dflt_wait, | 1393 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1402 | .parent = &l4_ck, | 1394 | .parent = &wu_l4_ick, |
| 1403 | .clkdm_name = "core_l4_clkdm", | 1395 | .clkdm_name = "wkup_clkdm", |
| 1404 | .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN), | 1396 | .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN), |
| 1405 | .enable_bit = OMAP24XX_EN_MPU_WDT_SHIFT, | 1397 | .enable_bit = OMAP24XX_EN_MPU_WDT_SHIFT, |
| 1406 | .recalc = &followparent_recalc, | 1398 | .recalc = &followparent_recalc, |
| @@ -1418,10 +1410,10 @@ static struct clk mpu_wdt_fck = { | |||
| 1418 | 1410 | ||
| 1419 | static struct clk sync_32k_ick = { | 1411 | static struct clk sync_32k_ick = { |
| 1420 | .name = "sync_32k_ick", | 1412 | .name = "sync_32k_ick", |
| 1421 | .ops = &clkops_omap2_dflt_wait, | 1413 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1422 | .parent = &l4_ck, | ||
| 1423 | .flags = ENABLE_ON_INIT, | 1414 | .flags = ENABLE_ON_INIT, |
| 1424 | .clkdm_name = "core_l4_clkdm", | 1415 | .parent = &wu_l4_ick, |
| 1416 | .clkdm_name = "wkup_clkdm", | ||
| 1425 | .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN), | 1417 | .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN), |
| 1426 | .enable_bit = OMAP24XX_EN_32KSYNC_SHIFT, | 1418 | .enable_bit = OMAP24XX_EN_32KSYNC_SHIFT, |
| 1427 | .recalc = &followparent_recalc, | 1419 | .recalc = &followparent_recalc, |
| @@ -1429,9 +1421,9 @@ static struct clk sync_32k_ick = { | |||
| 1429 | 1421 | ||
| 1430 | static struct clk wdt1_ick = { | 1422 | static struct clk wdt1_ick = { |
| 1431 | .name = "wdt1_ick", | 1423 | .name = "wdt1_ick", |
| 1432 | .ops = &clkops_omap2_dflt_wait, | 1424 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1433 | .parent = &l4_ck, | 1425 | .parent = &wu_l4_ick, |
| 1434 | .clkdm_name = "core_l4_clkdm", | 1426 | .clkdm_name = "wkup_clkdm", |
| 1435 | .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN), | 1427 | .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN), |
| 1436 | .enable_bit = OMAP24XX_EN_WDT1_SHIFT, | 1428 | .enable_bit = OMAP24XX_EN_WDT1_SHIFT, |
| 1437 | .recalc = &followparent_recalc, | 1429 | .recalc = &followparent_recalc, |
| @@ -1439,10 +1431,10 @@ static struct clk wdt1_ick = { | |||
| 1439 | 1431 | ||
| 1440 | static struct clk omapctrl_ick = { | 1432 | static struct clk omapctrl_ick = { |
| 1441 | .name = "omapctrl_ick", | 1433 | .name = "omapctrl_ick", |
| 1442 | .ops = &clkops_omap2_dflt_wait, | 1434 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1443 | .parent = &l4_ck, | ||
| 1444 | .flags = ENABLE_ON_INIT, | 1435 | .flags = ENABLE_ON_INIT, |
| 1445 | .clkdm_name = "core_l4_clkdm", | 1436 | .parent = &wu_l4_ick, |
| 1437 | .clkdm_name = "wkup_clkdm", | ||
| 1446 | .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN), | 1438 | .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN), |
| 1447 | .enable_bit = OMAP24XX_EN_OMAPCTRL_SHIFT, | 1439 | .enable_bit = OMAP24XX_EN_OMAPCTRL_SHIFT, |
| 1448 | .recalc = &followparent_recalc, | 1440 | .recalc = &followparent_recalc, |
| @@ -1450,9 +1442,9 @@ static struct clk omapctrl_ick = { | |||
| 1450 | 1442 | ||
| 1451 | static struct clk icr_ick = { | 1443 | static struct clk icr_ick = { |
| 1452 | .name = "icr_ick", | 1444 | .name = "icr_ick", |
| 1453 | .ops = &clkops_omap2_dflt_wait, | 1445 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1454 | .parent = &l4_ck, | 1446 | .parent = &wu_l4_ick, |
| 1455 | .clkdm_name = "core_l4_clkdm", | 1447 | .clkdm_name = "wkup_clkdm", |
| 1456 | .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN), | 1448 | .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN), |
| 1457 | .enable_bit = OMAP2430_EN_ICR_SHIFT, | 1449 | .enable_bit = OMAP2430_EN_ICR_SHIFT, |
| 1458 | .recalc = &followparent_recalc, | 1450 | .recalc = &followparent_recalc, |
| @@ -1460,7 +1452,7 @@ static struct clk icr_ick = { | |||
| 1460 | 1452 | ||
| 1461 | static struct clk cam_ick = { | 1453 | static struct clk cam_ick = { |
| 1462 | .name = "cam_ick", | 1454 | .name = "cam_ick", |
| 1463 | .ops = &clkops_omap2_dflt, | 1455 | .ops = &clkops_omap2_iclk_dflt, |
| 1464 | .parent = &l4_ck, | 1456 | .parent = &l4_ck, |
| 1465 | .clkdm_name = "core_l4_clkdm", | 1457 | .clkdm_name = "core_l4_clkdm", |
| 1466 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1458 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| @@ -1485,7 +1477,7 @@ static struct clk cam_fck = { | |||
| 1485 | 1477 | ||
| 1486 | static struct clk mailboxes_ick = { | 1478 | static struct clk mailboxes_ick = { |
| 1487 | .name = "mailboxes_ick", | 1479 | .name = "mailboxes_ick", |
| 1488 | .ops = &clkops_omap2_dflt_wait, | 1480 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1489 | .parent = &l4_ck, | 1481 | .parent = &l4_ck, |
| 1490 | .clkdm_name = "core_l4_clkdm", | 1482 | .clkdm_name = "core_l4_clkdm", |
| 1491 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1483 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| @@ -1495,7 +1487,7 @@ static struct clk mailboxes_ick = { | |||
| 1495 | 1487 | ||
| 1496 | static struct clk wdt4_ick = { | 1488 | static struct clk wdt4_ick = { |
| 1497 | .name = "wdt4_ick", | 1489 | .name = "wdt4_ick", |
| 1498 | .ops = &clkops_omap2_dflt_wait, | 1490 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1499 | .parent = &l4_ck, | 1491 | .parent = &l4_ck, |
| 1500 | .clkdm_name = "core_l4_clkdm", | 1492 | .clkdm_name = "core_l4_clkdm", |
| 1501 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1493 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| @@ -1515,7 +1507,7 @@ static struct clk wdt4_fck = { | |||
| 1515 | 1507 | ||
| 1516 | static struct clk mspro_ick = { | 1508 | static struct clk mspro_ick = { |
| 1517 | .name = "mspro_ick", | 1509 | .name = "mspro_ick", |
| 1518 | .ops = &clkops_omap2_dflt_wait, | 1510 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1519 | .parent = &l4_ck, | 1511 | .parent = &l4_ck, |
| 1520 | .clkdm_name = "core_l4_clkdm", | 1512 | .clkdm_name = "core_l4_clkdm", |
| 1521 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1513 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| @@ -1535,7 +1527,7 @@ static struct clk mspro_fck = { | |||
| 1535 | 1527 | ||
| 1536 | static struct clk fac_ick = { | 1528 | static struct clk fac_ick = { |
| 1537 | .name = "fac_ick", | 1529 | .name = "fac_ick", |
| 1538 | .ops = &clkops_omap2_dflt_wait, | 1530 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1539 | .parent = &l4_ck, | 1531 | .parent = &l4_ck, |
| 1540 | .clkdm_name = "core_l4_clkdm", | 1532 | .clkdm_name = "core_l4_clkdm", |
| 1541 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1533 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| @@ -1555,7 +1547,7 @@ static struct clk fac_fck = { | |||
| 1555 | 1547 | ||
| 1556 | static struct clk hdq_ick = { | 1548 | static struct clk hdq_ick = { |
| 1557 | .name = "hdq_ick", | 1549 | .name = "hdq_ick", |
| 1558 | .ops = &clkops_omap2_dflt_wait, | 1550 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1559 | .parent = &l4_ck, | 1551 | .parent = &l4_ck, |
| 1560 | .clkdm_name = "core_l4_clkdm", | 1552 | .clkdm_name = "core_l4_clkdm", |
| 1561 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1553 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| @@ -1579,7 +1571,7 @@ static struct clk hdq_fck = { | |||
| 1579 | */ | 1571 | */ |
| 1580 | static struct clk i2c2_ick = { | 1572 | static struct clk i2c2_ick = { |
| 1581 | .name = "i2c2_ick", | 1573 | .name = "i2c2_ick", |
| 1582 | .ops = &clkops_omap2_dflt_wait, | 1574 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1583 | .parent = &l4_ck, | 1575 | .parent = &l4_ck, |
| 1584 | .clkdm_name = "core_l4_clkdm", | 1576 | .clkdm_name = "core_l4_clkdm", |
| 1585 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1577 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| @@ -1603,7 +1595,7 @@ static struct clk i2chs2_fck = { | |||
| 1603 | */ | 1595 | */ |
| 1604 | static struct clk i2c1_ick = { | 1596 | static struct clk i2c1_ick = { |
| 1605 | .name = "i2c1_ick", | 1597 | .name = "i2c1_ick", |
| 1606 | .ops = &clkops_omap2_dflt_wait, | 1598 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1607 | .parent = &l4_ck, | 1599 | .parent = &l4_ck, |
| 1608 | .clkdm_name = "core_l4_clkdm", | 1600 | .clkdm_name = "core_l4_clkdm", |
| 1609 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1601 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| @@ -1621,12 +1613,18 @@ static struct clk i2chs1_fck = { | |||
| 1621 | .recalc = &followparent_recalc, | 1613 | .recalc = &followparent_recalc, |
| 1622 | }; | 1614 | }; |
| 1623 | 1615 | ||
| 1616 | /* | ||
| 1617 | * The enable_reg/enable_bit in this clock is only used for CM_AUTOIDLE | ||
| 1618 | * accesses derived from this data. | ||
| 1619 | */ | ||
| 1624 | static struct clk gpmc_fck = { | 1620 | static struct clk gpmc_fck = { |
| 1625 | .name = "gpmc_fck", | 1621 | .name = "gpmc_fck", |
| 1626 | .ops = &clkops_null, /* RMK: missing? */ | 1622 | .ops = &clkops_omap2_iclk_idle_only, |
| 1627 | .parent = &core_l3_ck, | 1623 | .parent = &core_l3_ck, |
| 1628 | .flags = ENABLE_ON_INIT, | 1624 | .flags = ENABLE_ON_INIT, |
| 1629 | .clkdm_name = "core_l3_clkdm", | 1625 | .clkdm_name = "core_l3_clkdm", |
| 1626 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN3), | ||
| 1627 | .enable_bit = OMAP24XX_AUTO_GPMC_SHIFT, | ||
| 1630 | .recalc = &followparent_recalc, | 1628 | .recalc = &followparent_recalc, |
| 1631 | }; | 1629 | }; |
| 1632 | 1630 | ||
| @@ -1638,20 +1636,26 @@ static struct clk sdma_fck = { | |||
| 1638 | .recalc = &followparent_recalc, | 1636 | .recalc = &followparent_recalc, |
| 1639 | }; | 1637 | }; |
| 1640 | 1638 | ||
| 1639 | /* | ||
| 1640 | * The enable_reg/enable_bit in this clock is only used for CM_AUTOIDLE | ||
| 1641 | * accesses derived from this data. | ||
| 1642 | */ | ||
| 1641 | static struct clk sdma_ick = { | 1643 | static struct clk sdma_ick = { |
| 1642 | .name = "sdma_ick", | 1644 | .name = "sdma_ick", |
| 1643 | .ops = &clkops_null, /* RMK: missing? */ | 1645 | .ops = &clkops_omap2_iclk_idle_only, |
| 1644 | .parent = &l4_ck, | 1646 | .parent = &core_l3_ck, |
| 1645 | .clkdm_name = "core_l3_clkdm", | 1647 | .clkdm_name = "core_l3_clkdm", |
| 1648 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN3), | ||
| 1649 | .enable_bit = OMAP24XX_AUTO_SDMA_SHIFT, | ||
| 1646 | .recalc = &followparent_recalc, | 1650 | .recalc = &followparent_recalc, |
| 1647 | }; | 1651 | }; |
| 1648 | 1652 | ||
| 1649 | static struct clk sdrc_ick = { | 1653 | static struct clk sdrc_ick = { |
| 1650 | .name = "sdrc_ick", | 1654 | .name = "sdrc_ick", |
| 1651 | .ops = &clkops_omap2_dflt_wait, | 1655 | .ops = &clkops_omap2_iclk_idle_only, |
| 1652 | .parent = &l4_ck, | 1656 | .parent = &core_l3_ck, |
| 1653 | .flags = ENABLE_ON_INIT, | 1657 | .flags = ENABLE_ON_INIT, |
| 1654 | .clkdm_name = "core_l4_clkdm", | 1658 | .clkdm_name = "core_l3_clkdm", |
| 1655 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN3), | 1659 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN3), |
| 1656 | .enable_bit = OMAP2430_EN_SDRC_SHIFT, | 1660 | .enable_bit = OMAP2430_EN_SDRC_SHIFT, |
| 1657 | .recalc = &followparent_recalc, | 1661 | .recalc = &followparent_recalc, |
| @@ -1659,7 +1663,7 @@ static struct clk sdrc_ick = { | |||
| 1659 | 1663 | ||
| 1660 | static struct clk des_ick = { | 1664 | static struct clk des_ick = { |
| 1661 | .name = "des_ick", | 1665 | .name = "des_ick", |
| 1662 | .ops = &clkops_omap2_dflt_wait, | 1666 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1663 | .parent = &l4_ck, | 1667 | .parent = &l4_ck, |
| 1664 | .clkdm_name = "core_l4_clkdm", | 1668 | .clkdm_name = "core_l4_clkdm", |
| 1665 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_ICLKEN4), | 1669 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_ICLKEN4), |
| @@ -1669,7 +1673,7 @@ static struct clk des_ick = { | |||
| 1669 | 1673 | ||
| 1670 | static struct clk sha_ick = { | 1674 | static struct clk sha_ick = { |
| 1671 | .name = "sha_ick", | 1675 | .name = "sha_ick", |
| 1672 | .ops = &clkops_omap2_dflt_wait, | 1676 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1673 | .parent = &l4_ck, | 1677 | .parent = &l4_ck, |
| 1674 | .clkdm_name = "core_l4_clkdm", | 1678 | .clkdm_name = "core_l4_clkdm", |
| 1675 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_ICLKEN4), | 1679 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_ICLKEN4), |
| @@ -1679,7 +1683,7 @@ static struct clk sha_ick = { | |||
| 1679 | 1683 | ||
| 1680 | static struct clk rng_ick = { | 1684 | static struct clk rng_ick = { |
| 1681 | .name = "rng_ick", | 1685 | .name = "rng_ick", |
| 1682 | .ops = &clkops_omap2_dflt_wait, | 1686 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1683 | .parent = &l4_ck, | 1687 | .parent = &l4_ck, |
| 1684 | .clkdm_name = "core_l4_clkdm", | 1688 | .clkdm_name = "core_l4_clkdm", |
| 1685 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_ICLKEN4), | 1689 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_ICLKEN4), |
| @@ -1689,7 +1693,7 @@ static struct clk rng_ick = { | |||
| 1689 | 1693 | ||
| 1690 | static struct clk aes_ick = { | 1694 | static struct clk aes_ick = { |
| 1691 | .name = "aes_ick", | 1695 | .name = "aes_ick", |
| 1692 | .ops = &clkops_omap2_dflt_wait, | 1696 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1693 | .parent = &l4_ck, | 1697 | .parent = &l4_ck, |
| 1694 | .clkdm_name = "core_l4_clkdm", | 1698 | .clkdm_name = "core_l4_clkdm", |
| 1695 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_ICLKEN4), | 1699 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_ICLKEN4), |
| @@ -1699,7 +1703,7 @@ static struct clk aes_ick = { | |||
| 1699 | 1703 | ||
| 1700 | static struct clk pka_ick = { | 1704 | static struct clk pka_ick = { |
| 1701 | .name = "pka_ick", | 1705 | .name = "pka_ick", |
| 1702 | .ops = &clkops_omap2_dflt_wait, | 1706 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1703 | .parent = &l4_ck, | 1707 | .parent = &l4_ck, |
| 1704 | .clkdm_name = "core_l4_clkdm", | 1708 | .clkdm_name = "core_l4_clkdm", |
| 1705 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_ICLKEN4), | 1709 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_ICLKEN4), |
| @@ -1719,7 +1723,7 @@ static struct clk usb_fck = { | |||
| 1719 | 1723 | ||
| 1720 | static struct clk usbhs_ick = { | 1724 | static struct clk usbhs_ick = { |
| 1721 | .name = "usbhs_ick", | 1725 | .name = "usbhs_ick", |
| 1722 | .ops = &clkops_omap2_dflt_wait, | 1726 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1723 | .parent = &core_l3_ck, | 1727 | .parent = &core_l3_ck, |
| 1724 | .clkdm_name = "core_l3_clkdm", | 1728 | .clkdm_name = "core_l3_clkdm", |
| 1725 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2), | 1729 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2), |
| @@ -1729,7 +1733,7 @@ static struct clk usbhs_ick = { | |||
| 1729 | 1733 | ||
| 1730 | static struct clk mmchs1_ick = { | 1734 | static struct clk mmchs1_ick = { |
| 1731 | .name = "mmchs1_ick", | 1735 | .name = "mmchs1_ick", |
| 1732 | .ops = &clkops_omap2_dflt_wait, | 1736 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1733 | .parent = &l4_ck, | 1737 | .parent = &l4_ck, |
| 1734 | .clkdm_name = "core_l4_clkdm", | 1738 | .clkdm_name = "core_l4_clkdm", |
| 1735 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2), | 1739 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2), |
| @@ -1741,7 +1745,7 @@ static struct clk mmchs1_fck = { | |||
| 1741 | .name = "mmchs1_fck", | 1745 | .name = "mmchs1_fck", |
| 1742 | .ops = &clkops_omap2_dflt_wait, | 1746 | .ops = &clkops_omap2_dflt_wait, |
| 1743 | .parent = &func_96m_ck, | 1747 | .parent = &func_96m_ck, |
| 1744 | .clkdm_name = "core_l3_clkdm", | 1748 | .clkdm_name = "core_l4_clkdm", |
| 1745 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_FCLKEN2), | 1749 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_FCLKEN2), |
| 1746 | .enable_bit = OMAP2430_EN_MMCHS1_SHIFT, | 1750 | .enable_bit = OMAP2430_EN_MMCHS1_SHIFT, |
| 1747 | .recalc = &followparent_recalc, | 1751 | .recalc = &followparent_recalc, |
| @@ -1749,7 +1753,7 @@ static struct clk mmchs1_fck = { | |||
| 1749 | 1753 | ||
| 1750 | static struct clk mmchs2_ick = { | 1754 | static struct clk mmchs2_ick = { |
| 1751 | .name = "mmchs2_ick", | 1755 | .name = "mmchs2_ick", |
| 1752 | .ops = &clkops_omap2_dflt_wait, | 1756 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1753 | .parent = &l4_ck, | 1757 | .parent = &l4_ck, |
| 1754 | .clkdm_name = "core_l4_clkdm", | 1758 | .clkdm_name = "core_l4_clkdm", |
| 1755 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2), | 1759 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2), |
| @@ -1761,6 +1765,7 @@ static struct clk mmchs2_fck = { | |||
| 1761 | .name = "mmchs2_fck", | 1765 | .name = "mmchs2_fck", |
| 1762 | .ops = &clkops_omap2_dflt_wait, | 1766 | .ops = &clkops_omap2_dflt_wait, |
| 1763 | .parent = &func_96m_ck, | 1767 | .parent = &func_96m_ck, |
| 1768 | .clkdm_name = "core_l4_clkdm", | ||
| 1764 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_FCLKEN2), | 1769 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_FCLKEN2), |
| 1765 | .enable_bit = OMAP2430_EN_MMCHS2_SHIFT, | 1770 | .enable_bit = OMAP2430_EN_MMCHS2_SHIFT, |
| 1766 | .recalc = &followparent_recalc, | 1771 | .recalc = &followparent_recalc, |
| @@ -1768,7 +1773,7 @@ static struct clk mmchs2_fck = { | |||
| 1768 | 1773 | ||
| 1769 | static struct clk gpio5_ick = { | 1774 | static struct clk gpio5_ick = { |
| 1770 | .name = "gpio5_ick", | 1775 | .name = "gpio5_ick", |
| 1771 | .ops = &clkops_omap2_dflt_wait, | 1776 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1772 | .parent = &l4_ck, | 1777 | .parent = &l4_ck, |
| 1773 | .clkdm_name = "core_l4_clkdm", | 1778 | .clkdm_name = "core_l4_clkdm", |
| 1774 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2), | 1779 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2), |
| @@ -1788,7 +1793,7 @@ static struct clk gpio5_fck = { | |||
| 1788 | 1793 | ||
| 1789 | static struct clk mdm_intc_ick = { | 1794 | static struct clk mdm_intc_ick = { |
| 1790 | .name = "mdm_intc_ick", | 1795 | .name = "mdm_intc_ick", |
| 1791 | .ops = &clkops_omap2_dflt_wait, | 1796 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1792 | .parent = &l4_ck, | 1797 | .parent = &l4_ck, |
| 1793 | .clkdm_name = "core_l4_clkdm", | 1798 | .clkdm_name = "core_l4_clkdm", |
| 1794 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2), | 1799 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2), |
| @@ -1880,7 +1885,6 @@ static struct omap_clk omap2430_clks[] = { | |||
| 1880 | CLK(NULL, "mpu_ck", &mpu_ck, CK_243X), | 1885 | CLK(NULL, "mpu_ck", &mpu_ck, CK_243X), |
| 1881 | /* dsp domain clocks */ | 1886 | /* dsp domain clocks */ |
| 1882 | CLK(NULL, "dsp_fck", &dsp_fck, CK_243X), | 1887 | CLK(NULL, "dsp_fck", &dsp_fck, CK_243X), |
| 1883 | CLK(NULL, "dsp_irate_ick", &dsp_irate_ick, CK_243X), | ||
| 1884 | CLK(NULL, "iva2_1_ick", &iva2_1_ick, CK_243X), | 1888 | CLK(NULL, "iva2_1_ick", &iva2_1_ick, CK_243X), |
| 1885 | /* GFX domain clocks */ | 1889 | /* GFX domain clocks */ |
| 1886 | CLK(NULL, "gfx_3d_fck", &gfx_3d_fck, CK_243X), | 1890 | CLK(NULL, "gfx_3d_fck", &gfx_3d_fck, CK_243X), |
| @@ -1901,6 +1905,7 @@ static struct omap_clk omap2430_clks[] = { | |||
| 1901 | /* L4 domain clocks */ | 1905 | /* L4 domain clocks */ |
| 1902 | CLK(NULL, "l4_ck", &l4_ck, CK_243X), | 1906 | CLK(NULL, "l4_ck", &l4_ck, CK_243X), |
| 1903 | CLK(NULL, "ssi_l4_ick", &ssi_l4_ick, CK_243X), | 1907 | CLK(NULL, "ssi_l4_ick", &ssi_l4_ick, CK_243X), |
| 1908 | CLK(NULL, "wu_l4_ick", &wu_l4_ick, CK_243X), | ||
| 1904 | /* virtual meta-group clock */ | 1909 | /* virtual meta-group clock */ |
| 1905 | CLK(NULL, "virt_prcm_set", &virt_prcm_set, CK_243X), | 1910 | CLK(NULL, "virt_prcm_set", &virt_prcm_set, CK_243X), |
| 1906 | /* general l4 interface ck, multi-parent functional clk */ | 1911 | /* general l4 interface ck, multi-parent functional clk */ |
| @@ -2028,6 +2033,9 @@ int __init omap2430_clk_init(void) | |||
| 2028 | omap2_init_clk_clkdm(c->lk.clk); | 2033 | omap2_init_clk_clkdm(c->lk.clk); |
| 2029 | } | 2034 | } |
| 2030 | 2035 | ||
| 2036 | /* Disable autoidle on all clocks; let the PM code enable it later */ | ||
| 2037 | omap_clk_disable_autoidle_all(); | ||
| 2038 | |||
| 2031 | /* Check the MPU rate set by bootloader */ | 2039 | /* Check the MPU rate set by bootloader */ |
| 2032 | clkrate = omap2xxx_clk_get_core_rate(&dpll_ck); | 2040 | clkrate = omap2xxx_clk_get_core_rate(&dpll_ck); |
| 2033 | for (prcm = rate_table; prcm->mpu_speed; prcm++) { | 2041 | for (prcm = rate_table; prcm->mpu_speed; prcm++) { |
diff --git a/arch/arm/mach-omap2/clock2xxx.h b/arch/arm/mach-omap2/clock2xxx.h index cc5c8d422c5..cb6df8ca9e4 100644 --- a/arch/arm/mach-omap2/clock2xxx.h +++ b/arch/arm/mach-omap2/clock2xxx.h | |||
| @@ -23,13 +23,13 @@ void omap2xxx_clk_prepare_for_reboot(void); | |||
| 23 | #ifdef CONFIG_SOC_OMAP2420 | 23 | #ifdef CONFIG_SOC_OMAP2420 |
| 24 | int omap2420_clk_init(void); | 24 | int omap2420_clk_init(void); |
| 25 | #else | 25 | #else |
| 26 | #define omap2420_clk_init() 0 | 26 | #define omap2420_clk_init() do { } while(0) |
| 27 | #endif | 27 | #endif |
| 28 | 28 | ||
| 29 | #ifdef CONFIG_SOC_OMAP2430 | 29 | #ifdef CONFIG_SOC_OMAP2430 |
| 30 | int omap2430_clk_init(void); | 30 | int omap2430_clk_init(void); |
| 31 | #else | 31 | #else |
| 32 | #define omap2430_clk_init() 0 | 32 | #define omap2430_clk_init() do { } while(0) |
| 33 | #endif | 33 | #endif |
| 34 | 34 | ||
| 35 | extern void __iomem *prcm_clksrc_ctrl, *cm_idlest_pll; | 35 | extern void __iomem *prcm_clksrc_ctrl, *cm_idlest_pll; |
diff --git a/arch/arm/mach-omap2/clock34xx.c b/arch/arm/mach-omap2/clock34xx.c index 287abc48092..1fc96b9ee33 100644 --- a/arch/arm/mach-omap2/clock34xx.c +++ b/arch/arm/mach-omap2/clock34xx.c | |||
| @@ -2,7 +2,7 @@ | |||
| 2 | * OMAP3-specific clock framework functions | 2 | * OMAP3-specific clock framework functions |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2007-2008 Texas Instruments, Inc. | 4 | * Copyright (C) 2007-2008 Texas Instruments, Inc. |
| 5 | * Copyright (C) 2007-2010 Nokia Corporation | 5 | * Copyright (C) 2007-2011 Nokia Corporation |
| 6 | * | 6 | * |
| 7 | * Paul Walmsley | 7 | * Paul Walmsley |
| 8 | * Jouni Högander | 8 | * Jouni Högander |
| @@ -59,6 +59,15 @@ const struct clkops clkops_omap3430es2_ssi_wait = { | |||
| 59 | .find_companion = omap2_clk_dflt_find_companion, | 59 | .find_companion = omap2_clk_dflt_find_companion, |
| 60 | }; | 60 | }; |
| 61 | 61 | ||
| 62 | const struct clkops clkops_omap3430es2_iclk_ssi_wait = { | ||
| 63 | .enable = omap2_dflt_clk_enable, | ||
| 64 | .disable = omap2_dflt_clk_disable, | ||
| 65 | .find_idlest = omap3430es2_clk_ssi_find_idlest, | ||
| 66 | .find_companion = omap2_clk_dflt_find_companion, | ||
| 67 | .allow_idle = omap2_clkt_iclk_allow_idle, | ||
| 68 | .deny_idle = omap2_clkt_iclk_deny_idle, | ||
| 69 | }; | ||
| 70 | |||
| 62 | /** | 71 | /** |
| 63 | * omap3430es2_clk_dss_usbhost_find_idlest - CM_IDLEST info for DSS, USBHOST | 72 | * omap3430es2_clk_dss_usbhost_find_idlest - CM_IDLEST info for DSS, USBHOST |
| 64 | * @clk: struct clk * being enabled | 73 | * @clk: struct clk * being enabled |
| @@ -94,6 +103,15 @@ const struct clkops clkops_omap3430es2_dss_usbhost_wait = { | |||
| 94 | .find_companion = omap2_clk_dflt_find_companion, | 103 | .find_companion = omap2_clk_dflt_find_companion, |
| 95 | }; | 104 | }; |
| 96 | 105 | ||
| 106 | const struct clkops clkops_omap3430es2_iclk_dss_usbhost_wait = { | ||
| 107 | .enable = omap2_dflt_clk_enable, | ||
| 108 | .disable = omap2_dflt_clk_disable, | ||
| 109 | .find_idlest = omap3430es2_clk_dss_usbhost_find_idlest, | ||
| 110 | .find_companion = omap2_clk_dflt_find_companion, | ||
| 111 | .allow_idle = omap2_clkt_iclk_allow_idle, | ||
| 112 | .deny_idle = omap2_clkt_iclk_deny_idle, | ||
| 113 | }; | ||
| 114 | |||
| 97 | /** | 115 | /** |
| 98 | * omap3430es2_clk_hsotgusb_find_idlest - return CM_IDLEST info for HSOTGUSB | 116 | * omap3430es2_clk_hsotgusb_find_idlest - return CM_IDLEST info for HSOTGUSB |
| 99 | * @clk: struct clk * being enabled | 117 | * @clk: struct clk * being enabled |
| @@ -124,3 +142,12 @@ const struct clkops clkops_omap3430es2_hsotgusb_wait = { | |||
| 124 | .find_idlest = omap3430es2_clk_hsotgusb_find_idlest, | 142 | .find_idlest = omap3430es2_clk_hsotgusb_find_idlest, |
| 125 | .find_companion = omap2_clk_dflt_find_companion, | 143 | .find_companion = omap2_clk_dflt_find_companion, |
| 126 | }; | 144 | }; |
| 145 | |||
| 146 | const struct clkops clkops_omap3430es2_iclk_hsotgusb_wait = { | ||
| 147 | .enable = omap2_dflt_clk_enable, | ||
| 148 | .disable = omap2_dflt_clk_disable, | ||
| 149 | .find_idlest = omap3430es2_clk_hsotgusb_find_idlest, | ||
| 150 | .find_companion = omap2_clk_dflt_find_companion, | ||
| 151 | .allow_idle = omap2_clkt_iclk_allow_idle, | ||
| 152 | .deny_idle = omap2_clkt_iclk_deny_idle, | ||
| 153 | }; | ||
diff --git a/arch/arm/mach-omap2/clock34xx.h b/arch/arm/mach-omap2/clock34xx.h index 628e8de5768..084ba71b2b3 100644 --- a/arch/arm/mach-omap2/clock34xx.h +++ b/arch/arm/mach-omap2/clock34xx.h | |||
| @@ -2,14 +2,17 @@ | |||
| 2 | * OMAP34xx clock function prototypes and macros | 2 | * OMAP34xx clock function prototypes and macros |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2007-2010 Texas Instruments, Inc. | 4 | * Copyright (C) 2007-2010 Texas Instruments, Inc. |
| 5 | * Copyright (C) 2007-2010 Nokia Corporation | 5 | * Copyright (C) 2007-2011 Nokia Corporation |
| 6 | */ | 6 | */ |
| 7 | 7 | ||
| 8 | #ifndef __ARCH_ARM_MACH_OMAP2_CLOCK34XX_H | 8 | #ifndef __ARCH_ARM_MACH_OMAP2_CLOCK34XX_H |
| 9 | #define __ARCH_ARM_MACH_OMAP2_CLOCK34XX_H | 9 | #define __ARCH_ARM_MACH_OMAP2_CLOCK34XX_H |
| 10 | 10 | ||
| 11 | extern const struct clkops clkops_omap3430es2_ssi_wait; | 11 | extern const struct clkops clkops_omap3430es2_ssi_wait; |
| 12 | extern const struct clkops clkops_omap3430es2_iclk_ssi_wait; | ||
| 12 | extern const struct clkops clkops_omap3430es2_hsotgusb_wait; | 13 | extern const struct clkops clkops_omap3430es2_hsotgusb_wait; |
| 14 | extern const struct clkops clkops_omap3430es2_iclk_hsotgusb_wait; | ||
| 13 | extern const struct clkops clkops_omap3430es2_dss_usbhost_wait; | 15 | extern const struct clkops clkops_omap3430es2_dss_usbhost_wait; |
| 16 | extern const struct clkops clkops_omap3430es2_iclk_dss_usbhost_wait; | ||
| 14 | 17 | ||
| 15 | #endif | 18 | #endif |
diff --git a/arch/arm/mach-omap2/clock3517.c b/arch/arm/mach-omap2/clock3517.c index 74116a3cf09..2e97d08f0e5 100644 --- a/arch/arm/mach-omap2/clock3517.c +++ b/arch/arm/mach-omap2/clock3517.c | |||
| @@ -2,7 +2,7 @@ | |||
| 2 | * OMAP3517/3505-specific clock framework functions | 2 | * OMAP3517/3505-specific clock framework functions |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2010 Texas Instruments, Inc. | 4 | * Copyright (C) 2010 Texas Instruments, Inc. |
| 5 | * Copyright (C) 2010 Nokia Corporation | 5 | * Copyright (C) 2011 Nokia Corporation |
| 6 | * | 6 | * |
| 7 | * Ranjith Lohithakshan | 7 | * Ranjith Lohithakshan |
| 8 | * Paul Walmsley | 8 | * Paul Walmsley |
| @@ -119,6 +119,8 @@ const struct clkops clkops_am35xx_ipss_wait = { | |||
| 119 | .disable = omap2_dflt_clk_disable, | 119 | .disable = omap2_dflt_clk_disable, |
| 120 | .find_idlest = am35xx_clk_ipss_find_idlest, | 120 | .find_idlest = am35xx_clk_ipss_find_idlest, |
| 121 | .find_companion = omap2_clk_dflt_find_companion, | 121 | .find_companion = omap2_clk_dflt_find_companion, |
| 122 | .allow_idle = omap2_clkt_iclk_allow_idle, | ||
| 123 | .deny_idle = omap2_clkt_iclk_deny_idle, | ||
| 122 | }; | 124 | }; |
| 123 | 125 | ||
| 124 | 126 | ||
diff --git a/arch/arm/mach-omap2/clock3xxx.c b/arch/arm/mach-omap2/clock3xxx.c index e9f66b6dec1..952c3e01c9e 100644 --- a/arch/arm/mach-omap2/clock3xxx.c +++ b/arch/arm/mach-omap2/clock3xxx.c | |||
| @@ -65,9 +65,6 @@ void __init omap3_clk_lock_dpll5(void) | |||
| 65 | clk_set_rate(dpll5_clk, DPLL5_FREQ_FOR_USBHOST); | 65 | clk_set_rate(dpll5_clk, DPLL5_FREQ_FOR_USBHOST); |
| 66 | clk_enable(dpll5_clk); | 66 | clk_enable(dpll5_clk); |
| 67 | 67 | ||
| 68 | /* Enable autoidle to allow it to enter low power bypass */ | ||
| 69 | omap3_dpll_allow_idle(dpll5_clk); | ||
| 70 | |||
| 71 | /* Program dpll5_m2_clk divider for no division */ | 68 | /* Program dpll5_m2_clk divider for no division */ |
| 72 | dpll5_m2_clk = clk_get(NULL, "dpll5_m2_ck"); | 69 | dpll5_m2_clk = clk_get(NULL, "dpll5_m2_ck"); |
| 73 | clk_enable(dpll5_m2_clk); | 70 | clk_enable(dpll5_m2_clk); |
diff --git a/arch/arm/mach-omap2/clock3xxx_data.c b/arch/arm/mach-omap2/clock3xxx_data.c index 052ac329282..d905ecc7989 100644 --- a/arch/arm/mach-omap2/clock3xxx_data.c +++ b/arch/arm/mach-omap2/clock3xxx_data.c | |||
| @@ -2,7 +2,7 @@ | |||
| 2 | * OMAP3 clock data | 2 | * OMAP3 clock data |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2007-2010 Texas Instruments, Inc. | 4 | * Copyright (C) 2007-2010 Texas Instruments, Inc. |
| 5 | * Copyright (C) 2007-2010 Nokia Corporation | 5 | * Copyright (C) 2007-2011 Nokia Corporation |
| 6 | * | 6 | * |
| 7 | * Written by Paul Walmsley | 7 | * Written by Paul Walmsley |
| 8 | * With many device clock fixes by Kevin Hilman and Jouni Högander | 8 | * With many device clock fixes by Kevin Hilman and Jouni Högander |
| @@ -291,12 +291,11 @@ static struct dpll_data dpll1_dd = { | |||
| 291 | .max_multiplier = OMAP3_MAX_DPLL_MULT, | 291 | .max_multiplier = OMAP3_MAX_DPLL_MULT, |
| 292 | .min_divider = 1, | 292 | .min_divider = 1, |
| 293 | .max_divider = OMAP3_MAX_DPLL_DIV, | 293 | .max_divider = OMAP3_MAX_DPLL_DIV, |
| 294 | .rate_tolerance = DEFAULT_DPLL_RATE_TOLERANCE | ||
| 295 | }; | 294 | }; |
| 296 | 295 | ||
| 297 | static struct clk dpll1_ck = { | 296 | static struct clk dpll1_ck = { |
| 298 | .name = "dpll1_ck", | 297 | .name = "dpll1_ck", |
| 299 | .ops = &clkops_null, | 298 | .ops = &clkops_omap3_noncore_dpll_ops, |
| 300 | .parent = &sys_ck, | 299 | .parent = &sys_ck, |
| 301 | .dpll_data = &dpll1_dd, | 300 | .dpll_data = &dpll1_dd, |
| 302 | .round_rate = &omap2_dpll_round_rate, | 301 | .round_rate = &omap2_dpll_round_rate, |
| @@ -364,7 +363,6 @@ static struct dpll_data dpll2_dd = { | |||
| 364 | .max_multiplier = OMAP3_MAX_DPLL_MULT, | 363 | .max_multiplier = OMAP3_MAX_DPLL_MULT, |
| 365 | .min_divider = 1, | 364 | .min_divider = 1, |
| 366 | .max_divider = OMAP3_MAX_DPLL_DIV, | 365 | .max_divider = OMAP3_MAX_DPLL_DIV, |
| 367 | .rate_tolerance = DEFAULT_DPLL_RATE_TOLERANCE | ||
| 368 | }; | 366 | }; |
| 369 | 367 | ||
| 370 | static struct clk dpll2_ck = { | 368 | static struct clk dpll2_ck = { |
| @@ -424,12 +422,11 @@ static struct dpll_data dpll3_dd = { | |||
| 424 | .max_multiplier = OMAP3_MAX_DPLL_MULT, | 422 | .max_multiplier = OMAP3_MAX_DPLL_MULT, |
| 425 | .min_divider = 1, | 423 | .min_divider = 1, |
| 426 | .max_divider = OMAP3_MAX_DPLL_DIV, | 424 | .max_divider = OMAP3_MAX_DPLL_DIV, |
| 427 | .rate_tolerance = DEFAULT_DPLL_RATE_TOLERANCE | ||
| 428 | }; | 425 | }; |
| 429 | 426 | ||
| 430 | static struct clk dpll3_ck = { | 427 | static struct clk dpll3_ck = { |
| 431 | .name = "dpll3_ck", | 428 | .name = "dpll3_ck", |
| 432 | .ops = &clkops_null, | 429 | .ops = &clkops_omap3_core_dpll_ops, |
| 433 | .parent = &sys_ck, | 430 | .parent = &sys_ck, |
| 434 | .dpll_data = &dpll3_dd, | 431 | .dpll_data = &dpll3_dd, |
| 435 | .round_rate = &omap2_dpll_round_rate, | 432 | .round_rate = &omap2_dpll_round_rate, |
| @@ -583,7 +580,6 @@ static struct dpll_data dpll4_dd_34xx __initdata = { | |||
| 583 | .max_multiplier = OMAP3_MAX_DPLL_MULT, | 580 | .max_multiplier = OMAP3_MAX_DPLL_MULT, |
| 584 | .min_divider = 1, | 581 | .min_divider = 1, |
| 585 | .max_divider = OMAP3_MAX_DPLL_DIV, | 582 | .max_divider = OMAP3_MAX_DPLL_DIV, |
| 586 | .rate_tolerance = DEFAULT_DPLL_RATE_TOLERANCE | ||
| 587 | }; | 583 | }; |
| 588 | 584 | ||
| 589 | static struct dpll_data dpll4_dd_3630 __initdata = { | 585 | static struct dpll_data dpll4_dd_3630 __initdata = { |
| @@ -607,7 +603,6 @@ static struct dpll_data dpll4_dd_3630 __initdata = { | |||
| 607 | .max_multiplier = OMAP3630_MAX_JTYPE_DPLL_MULT, | 603 | .max_multiplier = OMAP3630_MAX_JTYPE_DPLL_MULT, |
| 608 | .min_divider = 1, | 604 | .min_divider = 1, |
| 609 | .max_divider = OMAP3_MAX_DPLL_DIV, | 605 | .max_divider = OMAP3_MAX_DPLL_DIV, |
| 610 | .rate_tolerance = DEFAULT_DPLL_RATE_TOLERANCE, | ||
| 611 | .flags = DPLL_J_TYPE | 606 | .flags = DPLL_J_TYPE |
| 612 | }; | 607 | }; |
| 613 | 608 | ||
| @@ -939,7 +934,6 @@ static struct dpll_data dpll5_dd = { | |||
| 939 | .max_multiplier = OMAP3_MAX_DPLL_MULT, | 934 | .max_multiplier = OMAP3_MAX_DPLL_MULT, |
| 940 | .min_divider = 1, | 935 | .min_divider = 1, |
| 941 | .max_divider = OMAP3_MAX_DPLL_DIV, | 936 | .max_divider = OMAP3_MAX_DPLL_DIV, |
| 942 | .rate_tolerance = DEFAULT_DPLL_RATE_TOLERANCE | ||
| 943 | }; | 937 | }; |
| 944 | 938 | ||
| 945 | static struct clk dpll5_ck = { | 939 | static struct clk dpll5_ck = { |
| @@ -1205,7 +1199,10 @@ static const struct clksel gfx_l3_clksel[] = { | |||
| 1205 | { .parent = NULL } | 1199 | { .parent = NULL } |
| 1206 | }; | 1200 | }; |
| 1207 | 1201 | ||
| 1208 | /* Virtual parent clock for gfx_l3_ick and gfx_l3_fck */ | 1202 | /* |
| 1203 | * Virtual parent clock for gfx_l3_ick and gfx_l3_fck | ||
| 1204 | * This interface clock does not have a CM_AUTOIDLE bit | ||
| 1205 | */ | ||
| 1209 | static struct clk gfx_l3_ck = { | 1206 | static struct clk gfx_l3_ck = { |
| 1210 | .name = "gfx_l3_ck", | 1207 | .name = "gfx_l3_ck", |
| 1211 | .ops = &clkops_omap2_dflt_wait, | 1208 | .ops = &clkops_omap2_dflt_wait, |
| @@ -1304,6 +1301,7 @@ static struct clk sgx_fck = { | |||
| 1304 | .round_rate = &omap2_clksel_round_rate | 1301 | .round_rate = &omap2_clksel_round_rate |
| 1305 | }; | 1302 | }; |
| 1306 | 1303 | ||
| 1304 | /* This interface clock does not have a CM_AUTOIDLE bit */ | ||
| 1307 | static struct clk sgx_ick = { | 1305 | static struct clk sgx_ick = { |
| 1308 | .name = "sgx_ick", | 1306 | .name = "sgx_ick", |
| 1309 | .ops = &clkops_omap2_dflt_wait, | 1307 | .ops = &clkops_omap2_dflt_wait, |
| @@ -1328,7 +1326,7 @@ static struct clk d2d_26m_fck = { | |||
| 1328 | 1326 | ||
| 1329 | static struct clk modem_fck = { | 1327 | static struct clk modem_fck = { |
| 1330 | .name = "modem_fck", | 1328 | .name = "modem_fck", |
| 1331 | .ops = &clkops_omap2_dflt_wait, | 1329 | .ops = &clkops_omap2_mdmclk_dflt_wait, |
| 1332 | .parent = &sys_ck, | 1330 | .parent = &sys_ck, |
| 1333 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1), | 1331 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1), |
| 1334 | .enable_bit = OMAP3430_EN_MODEM_SHIFT, | 1332 | .enable_bit = OMAP3430_EN_MODEM_SHIFT, |
| @@ -1338,7 +1336,7 @@ static struct clk modem_fck = { | |||
| 1338 | 1336 | ||
| 1339 | static struct clk sad2d_ick = { | 1337 | static struct clk sad2d_ick = { |
| 1340 | .name = "sad2d_ick", | 1338 | .name = "sad2d_ick", |
| 1341 | .ops = &clkops_omap2_dflt_wait, | 1339 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1342 | .parent = &l3_ick, | 1340 | .parent = &l3_ick, |
| 1343 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1341 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| 1344 | .enable_bit = OMAP3430_EN_SAD2D_SHIFT, | 1342 | .enable_bit = OMAP3430_EN_SAD2D_SHIFT, |
| @@ -1348,7 +1346,7 @@ static struct clk sad2d_ick = { | |||
| 1348 | 1346 | ||
| 1349 | static struct clk mad2d_ick = { | 1347 | static struct clk mad2d_ick = { |
| 1350 | .name = "mad2d_ick", | 1348 | .name = "mad2d_ick", |
| 1351 | .ops = &clkops_omap2_dflt_wait, | 1349 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1352 | .parent = &l3_ick, | 1350 | .parent = &l3_ick, |
| 1353 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN3), | 1351 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN3), |
| 1354 | .enable_bit = OMAP3430_EN_MAD2D_SHIFT, | 1352 | .enable_bit = OMAP3430_EN_MAD2D_SHIFT, |
| @@ -1718,7 +1716,7 @@ static struct clk core_l3_ick = { | |||
| 1718 | 1716 | ||
| 1719 | static struct clk hsotgusb_ick_3430es1 = { | 1717 | static struct clk hsotgusb_ick_3430es1 = { |
| 1720 | .name = "hsotgusb_ick", | 1718 | .name = "hsotgusb_ick", |
| 1721 | .ops = &clkops_omap2_dflt, | 1719 | .ops = &clkops_omap2_iclk_dflt, |
| 1722 | .parent = &core_l3_ick, | 1720 | .parent = &core_l3_ick, |
| 1723 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1721 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| 1724 | .enable_bit = OMAP3430_EN_HSOTGUSB_SHIFT, | 1722 | .enable_bit = OMAP3430_EN_HSOTGUSB_SHIFT, |
| @@ -1728,7 +1726,7 @@ static struct clk hsotgusb_ick_3430es1 = { | |||
| 1728 | 1726 | ||
| 1729 | static struct clk hsotgusb_ick_3430es2 = { | 1727 | static struct clk hsotgusb_ick_3430es2 = { |
| 1730 | .name = "hsotgusb_ick", | 1728 | .name = "hsotgusb_ick", |
| 1731 | .ops = &clkops_omap3430es2_hsotgusb_wait, | 1729 | .ops = &clkops_omap3430es2_iclk_hsotgusb_wait, |
| 1732 | .parent = &core_l3_ick, | 1730 | .parent = &core_l3_ick, |
| 1733 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1731 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| 1734 | .enable_bit = OMAP3430_EN_HSOTGUSB_SHIFT, | 1732 | .enable_bit = OMAP3430_EN_HSOTGUSB_SHIFT, |
| @@ -1736,6 +1734,7 @@ static struct clk hsotgusb_ick_3430es2 = { | |||
| 1736 | .recalc = &followparent_recalc, | 1734 | .recalc = &followparent_recalc, |
| 1737 | }; | 1735 | }; |
| 1738 | 1736 | ||
| 1737 | /* This interface clock does not have a CM_AUTOIDLE bit */ | ||
| 1739 | static struct clk sdrc_ick = { | 1738 | static struct clk sdrc_ick = { |
| 1740 | .name = "sdrc_ick", | 1739 | .name = "sdrc_ick", |
| 1741 | .ops = &clkops_omap2_dflt_wait, | 1740 | .ops = &clkops_omap2_dflt_wait, |
| @@ -1767,7 +1766,7 @@ static struct clk security_l3_ick = { | |||
| 1767 | 1766 | ||
| 1768 | static struct clk pka_ick = { | 1767 | static struct clk pka_ick = { |
| 1769 | .name = "pka_ick", | 1768 | .name = "pka_ick", |
| 1770 | .ops = &clkops_omap2_dflt_wait, | 1769 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1771 | .parent = &security_l3_ick, | 1770 | .parent = &security_l3_ick, |
| 1772 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2), | 1771 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2), |
| 1773 | .enable_bit = OMAP3430_EN_PKA_SHIFT, | 1772 | .enable_bit = OMAP3430_EN_PKA_SHIFT, |
| @@ -1786,7 +1785,7 @@ static struct clk core_l4_ick = { | |||
| 1786 | 1785 | ||
| 1787 | static struct clk usbtll_ick = { | 1786 | static struct clk usbtll_ick = { |
| 1788 | .name = "usbtll_ick", | 1787 | .name = "usbtll_ick", |
| 1789 | .ops = &clkops_omap2_dflt_wait, | 1788 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1790 | .parent = &core_l4_ick, | 1789 | .parent = &core_l4_ick, |
| 1791 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN3), | 1790 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN3), |
| 1792 | .enable_bit = OMAP3430ES2_EN_USBTLL_SHIFT, | 1791 | .enable_bit = OMAP3430ES2_EN_USBTLL_SHIFT, |
| @@ -1796,7 +1795,7 @@ static struct clk usbtll_ick = { | |||
| 1796 | 1795 | ||
| 1797 | static struct clk mmchs3_ick = { | 1796 | static struct clk mmchs3_ick = { |
| 1798 | .name = "mmchs3_ick", | 1797 | .name = "mmchs3_ick", |
| 1799 | .ops = &clkops_omap2_dflt_wait, | 1798 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1800 | .parent = &core_l4_ick, | 1799 | .parent = &core_l4_ick, |
| 1801 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1800 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| 1802 | .enable_bit = OMAP3430ES2_EN_MMC3_SHIFT, | 1801 | .enable_bit = OMAP3430ES2_EN_MMC3_SHIFT, |
| @@ -1807,7 +1806,7 @@ static struct clk mmchs3_ick = { | |||
| 1807 | /* Intersystem Communication Registers - chassis mode only */ | 1806 | /* Intersystem Communication Registers - chassis mode only */ |
| 1808 | static struct clk icr_ick = { | 1807 | static struct clk icr_ick = { |
| 1809 | .name = "icr_ick", | 1808 | .name = "icr_ick", |
| 1810 | .ops = &clkops_omap2_dflt_wait, | 1809 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1811 | .parent = &core_l4_ick, | 1810 | .parent = &core_l4_ick, |
| 1812 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1811 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| 1813 | .enable_bit = OMAP3430_EN_ICR_SHIFT, | 1812 | .enable_bit = OMAP3430_EN_ICR_SHIFT, |
| @@ -1817,7 +1816,7 @@ static struct clk icr_ick = { | |||
| 1817 | 1816 | ||
| 1818 | static struct clk aes2_ick = { | 1817 | static struct clk aes2_ick = { |
| 1819 | .name = "aes2_ick", | 1818 | .name = "aes2_ick", |
| 1820 | .ops = &clkops_omap2_dflt_wait, | 1819 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1821 | .parent = &core_l4_ick, | 1820 | .parent = &core_l4_ick, |
| 1822 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1821 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| 1823 | .enable_bit = OMAP3430_EN_AES2_SHIFT, | 1822 | .enable_bit = OMAP3430_EN_AES2_SHIFT, |
| @@ -1827,7 +1826,7 @@ static struct clk aes2_ick = { | |||
| 1827 | 1826 | ||
| 1828 | static struct clk sha12_ick = { | 1827 | static struct clk sha12_ick = { |
| 1829 | .name = "sha12_ick", | 1828 | .name = "sha12_ick", |
| 1830 | .ops = &clkops_omap2_dflt_wait, | 1829 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1831 | .parent = &core_l4_ick, | 1830 | .parent = &core_l4_ick, |
| 1832 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1831 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| 1833 | .enable_bit = OMAP3430_EN_SHA12_SHIFT, | 1832 | .enable_bit = OMAP3430_EN_SHA12_SHIFT, |
| @@ -1837,7 +1836,7 @@ static struct clk sha12_ick = { | |||
| 1837 | 1836 | ||
| 1838 | static struct clk des2_ick = { | 1837 | static struct clk des2_ick = { |
| 1839 | .name = "des2_ick", | 1838 | .name = "des2_ick", |
| 1840 | .ops = &clkops_omap2_dflt_wait, | 1839 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1841 | .parent = &core_l4_ick, | 1840 | .parent = &core_l4_ick, |
| 1842 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1841 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| 1843 | .enable_bit = OMAP3430_EN_DES2_SHIFT, | 1842 | .enable_bit = OMAP3430_EN_DES2_SHIFT, |
| @@ -1847,7 +1846,7 @@ static struct clk des2_ick = { | |||
| 1847 | 1846 | ||
| 1848 | static struct clk mmchs2_ick = { | 1847 | static struct clk mmchs2_ick = { |
| 1849 | .name = "mmchs2_ick", | 1848 | .name = "mmchs2_ick", |
| 1850 | .ops = &clkops_omap2_dflt_wait, | 1849 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1851 | .parent = &core_l4_ick, | 1850 | .parent = &core_l4_ick, |
| 1852 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1851 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| 1853 | .enable_bit = OMAP3430_EN_MMC2_SHIFT, | 1852 | .enable_bit = OMAP3430_EN_MMC2_SHIFT, |
| @@ -1857,7 +1856,7 @@ static struct clk mmchs2_ick = { | |||
| 1857 | 1856 | ||
| 1858 | static struct clk mmchs1_ick = { | 1857 | static struct clk mmchs1_ick = { |
| 1859 | .name = "mmchs1_ick", | 1858 | .name = "mmchs1_ick", |
| 1860 | .ops = &clkops_omap2_dflt_wait, | 1859 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1861 | .parent = &core_l4_ick, | 1860 | .parent = &core_l4_ick, |
| 1862 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1861 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| 1863 | .enable_bit = OMAP3430_EN_MMC1_SHIFT, | 1862 | .enable_bit = OMAP3430_EN_MMC1_SHIFT, |
| @@ -1867,7 +1866,7 @@ static struct clk mmchs1_ick = { | |||
| 1867 | 1866 | ||
| 1868 | static struct clk mspro_ick = { | 1867 | static struct clk mspro_ick = { |
| 1869 | .name = "mspro_ick", | 1868 | .name = "mspro_ick", |
| 1870 | .ops = &clkops_omap2_dflt_wait, | 1869 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1871 | .parent = &core_l4_ick, | 1870 | .parent = &core_l4_ick, |
| 1872 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1871 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| 1873 | .enable_bit = OMAP3430_EN_MSPRO_SHIFT, | 1872 | .enable_bit = OMAP3430_EN_MSPRO_SHIFT, |
| @@ -1877,7 +1876,7 @@ static struct clk mspro_ick = { | |||
| 1877 | 1876 | ||
| 1878 | static struct clk hdq_ick = { | 1877 | static struct clk hdq_ick = { |
| 1879 | .name = "hdq_ick", | 1878 | .name = "hdq_ick", |
| 1880 | .ops = &clkops_omap2_dflt_wait, | 1879 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1881 | .parent = &core_l4_ick, | 1880 | .parent = &core_l4_ick, |
| 1882 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1881 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| 1883 | .enable_bit = OMAP3430_EN_HDQ_SHIFT, | 1882 | .enable_bit = OMAP3430_EN_HDQ_SHIFT, |
| @@ -1887,7 +1886,7 @@ static struct clk hdq_ick = { | |||
| 1887 | 1886 | ||
| 1888 | static struct clk mcspi4_ick = { | 1887 | static struct clk mcspi4_ick = { |
| 1889 | .name = "mcspi4_ick", | 1888 | .name = "mcspi4_ick", |
| 1890 | .ops = &clkops_omap2_dflt_wait, | 1889 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1891 | .parent = &core_l4_ick, | 1890 | .parent = &core_l4_ick, |
| 1892 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1891 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| 1893 | .enable_bit = OMAP3430_EN_MCSPI4_SHIFT, | 1892 | .enable_bit = OMAP3430_EN_MCSPI4_SHIFT, |
| @@ -1897,7 +1896,7 @@ static struct clk mcspi4_ick = { | |||
| 1897 | 1896 | ||
| 1898 | static struct clk mcspi3_ick = { | 1897 | static struct clk mcspi3_ick = { |
| 1899 | .name = "mcspi3_ick", | 1898 | .name = "mcspi3_ick", |
| 1900 | .ops = &clkops_omap2_dflt_wait, | 1899 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1901 | .parent = &core_l4_ick, | 1900 | .parent = &core_l4_ick, |
| 1902 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1901 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| 1903 | .enable_bit = OMAP3430_EN_MCSPI3_SHIFT, | 1902 | .enable_bit = OMAP3430_EN_MCSPI3_SHIFT, |
| @@ -1907,7 +1906,7 @@ static struct clk mcspi3_ick = { | |||
| 1907 | 1906 | ||
| 1908 | static struct clk mcspi2_ick = { | 1907 | static struct clk mcspi2_ick = { |
| 1909 | .name = "mcspi2_ick", | 1908 | .name = "mcspi2_ick", |
| 1910 | .ops = &clkops_omap2_dflt_wait, | 1909 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1911 | .parent = &core_l4_ick, | 1910 | .parent = &core_l4_ick, |
| 1912 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1911 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| 1913 | .enable_bit = OMAP3430_EN_MCSPI2_SHIFT, | 1912 | .enable_bit = OMAP3430_EN_MCSPI2_SHIFT, |
| @@ -1917,7 +1916,7 @@ static struct clk mcspi2_ick = { | |||
| 1917 | 1916 | ||
| 1918 | static struct clk mcspi1_ick = { | 1917 | static struct clk mcspi1_ick = { |
| 1919 | .name = "mcspi1_ick", | 1918 | .name = "mcspi1_ick", |
| 1920 | .ops = &clkops_omap2_dflt_wait, | 1919 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1921 | .parent = &core_l4_ick, | 1920 | .parent = &core_l4_ick, |
| 1922 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1921 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| 1923 | .enable_bit = OMAP3430_EN_MCSPI1_SHIFT, | 1922 | .enable_bit = OMAP3430_EN_MCSPI1_SHIFT, |
| @@ -1927,7 +1926,7 @@ static struct clk mcspi1_ick = { | |||
| 1927 | 1926 | ||
| 1928 | static struct clk i2c3_ick = { | 1927 | static struct clk i2c3_ick = { |
| 1929 | .name = "i2c3_ick", | 1928 | .name = "i2c3_ick", |
| 1930 | .ops = &clkops_omap2_dflt_wait, | 1929 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1931 | .parent = &core_l4_ick, | 1930 | .parent = &core_l4_ick, |
| 1932 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1931 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| 1933 | .enable_bit = OMAP3430_EN_I2C3_SHIFT, | 1932 | .enable_bit = OMAP3430_EN_I2C3_SHIFT, |
| @@ -1937,7 +1936,7 @@ static struct clk i2c3_ick = { | |||
| 1937 | 1936 | ||
| 1938 | static struct clk i2c2_ick = { | 1937 | static struct clk i2c2_ick = { |
| 1939 | .name = "i2c2_ick", | 1938 | .name = "i2c2_ick", |
| 1940 | .ops = &clkops_omap2_dflt_wait, | 1939 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1941 | .parent = &core_l4_ick, | 1940 | .parent = &core_l4_ick, |
| 1942 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1941 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| 1943 | .enable_bit = OMAP3430_EN_I2C2_SHIFT, | 1942 | .enable_bit = OMAP3430_EN_I2C2_SHIFT, |
| @@ -1947,7 +1946,7 @@ static struct clk i2c2_ick = { | |||
| 1947 | 1946 | ||
| 1948 | static struct clk i2c1_ick = { | 1947 | static struct clk i2c1_ick = { |
| 1949 | .name = "i2c1_ick", | 1948 | .name = "i2c1_ick", |
| 1950 | .ops = &clkops_omap2_dflt_wait, | 1949 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1951 | .parent = &core_l4_ick, | 1950 | .parent = &core_l4_ick, |
| 1952 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1951 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| 1953 | .enable_bit = OMAP3430_EN_I2C1_SHIFT, | 1952 | .enable_bit = OMAP3430_EN_I2C1_SHIFT, |
| @@ -1957,7 +1956,7 @@ static struct clk i2c1_ick = { | |||
| 1957 | 1956 | ||
| 1958 | static struct clk uart2_ick = { | 1957 | static struct clk uart2_ick = { |
| 1959 | .name = "uart2_ick", | 1958 | .name = "uart2_ick", |
| 1960 | .ops = &clkops_omap2_dflt_wait, | 1959 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1961 | .parent = &core_l4_ick, | 1960 | .parent = &core_l4_ick, |
| 1962 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1961 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| 1963 | .enable_bit = OMAP3430_EN_UART2_SHIFT, | 1962 | .enable_bit = OMAP3430_EN_UART2_SHIFT, |
| @@ -1967,7 +1966,7 @@ static struct clk uart2_ick = { | |||
| 1967 | 1966 | ||
| 1968 | static struct clk uart1_ick = { | 1967 | static struct clk uart1_ick = { |
| 1969 | .name = "uart1_ick", | 1968 | .name = "uart1_ick", |
| 1970 | .ops = &clkops_omap2_dflt_wait, | 1969 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1971 | .parent = &core_l4_ick, | 1970 | .parent = &core_l4_ick, |
| 1972 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1971 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| 1973 | .enable_bit = OMAP3430_EN_UART1_SHIFT, | 1972 | .enable_bit = OMAP3430_EN_UART1_SHIFT, |
| @@ -1977,7 +1976,7 @@ static struct clk uart1_ick = { | |||
| 1977 | 1976 | ||
| 1978 | static struct clk gpt11_ick = { | 1977 | static struct clk gpt11_ick = { |
| 1979 | .name = "gpt11_ick", | 1978 | .name = "gpt11_ick", |
| 1980 | .ops = &clkops_omap2_dflt_wait, | 1979 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1981 | .parent = &core_l4_ick, | 1980 | .parent = &core_l4_ick, |
| 1982 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1981 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| 1983 | .enable_bit = OMAP3430_EN_GPT11_SHIFT, | 1982 | .enable_bit = OMAP3430_EN_GPT11_SHIFT, |
| @@ -1987,7 +1986,7 @@ static struct clk gpt11_ick = { | |||
| 1987 | 1986 | ||
| 1988 | static struct clk gpt10_ick = { | 1987 | static struct clk gpt10_ick = { |
| 1989 | .name = "gpt10_ick", | 1988 | .name = "gpt10_ick", |
| 1990 | .ops = &clkops_omap2_dflt_wait, | 1989 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 1991 | .parent = &core_l4_ick, | 1990 | .parent = &core_l4_ick, |
| 1992 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1991 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| 1993 | .enable_bit = OMAP3430_EN_GPT10_SHIFT, | 1992 | .enable_bit = OMAP3430_EN_GPT10_SHIFT, |
| @@ -1997,7 +1996,7 @@ static struct clk gpt10_ick = { | |||
| 1997 | 1996 | ||
| 1998 | static struct clk mcbsp5_ick = { | 1997 | static struct clk mcbsp5_ick = { |
| 1999 | .name = "mcbsp5_ick", | 1998 | .name = "mcbsp5_ick", |
| 2000 | .ops = &clkops_omap2_dflt_wait, | 1999 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 2001 | .parent = &core_l4_ick, | 2000 | .parent = &core_l4_ick, |
| 2002 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 2001 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| 2003 | .enable_bit = OMAP3430_EN_MCBSP5_SHIFT, | 2002 | .enable_bit = OMAP3430_EN_MCBSP5_SHIFT, |
| @@ -2007,7 +2006,7 @@ static struct clk mcbsp5_ick = { | |||
| 2007 | 2006 | ||
| 2008 | static struct clk mcbsp1_ick = { | 2007 | static struct clk mcbsp1_ick = { |
| 2009 | .name = "mcbsp1_ick", | 2008 | .name = "mcbsp1_ick", |
| 2010 | .ops = &clkops_omap2_dflt_wait, | 2009 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 2011 | .parent = &core_l4_ick, | 2010 | .parent = &core_l4_ick, |
| 2012 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 2011 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| 2013 | .enable_bit = OMAP3430_EN_MCBSP1_SHIFT, | 2012 | .enable_bit = OMAP3430_EN_MCBSP1_SHIFT, |
| @@ -2017,7 +2016,7 @@ static struct clk mcbsp1_ick = { | |||
| 2017 | 2016 | ||
| 2018 | static struct clk fac_ick = { | 2017 | static struct clk fac_ick = { |
| 2019 | .name = "fac_ick", | 2018 | .name = "fac_ick", |
| 2020 | .ops = &clkops_omap2_dflt_wait, | 2019 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 2021 | .parent = &core_l4_ick, | 2020 | .parent = &core_l4_ick, |
| 2022 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 2021 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| 2023 | .enable_bit = OMAP3430ES1_EN_FAC_SHIFT, | 2022 | .enable_bit = OMAP3430ES1_EN_FAC_SHIFT, |
| @@ -2027,7 +2026,7 @@ static struct clk fac_ick = { | |||
| 2027 | 2026 | ||
| 2028 | static struct clk mailboxes_ick = { | 2027 | static struct clk mailboxes_ick = { |
| 2029 | .name = "mailboxes_ick", | 2028 | .name = "mailboxes_ick", |
| 2030 | .ops = &clkops_omap2_dflt_wait, | 2029 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 2031 | .parent = &core_l4_ick, | 2030 | .parent = &core_l4_ick, |
| 2032 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 2031 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| 2033 | .enable_bit = OMAP3430_EN_MAILBOXES_SHIFT, | 2032 | .enable_bit = OMAP3430_EN_MAILBOXES_SHIFT, |
| @@ -2037,7 +2036,7 @@ static struct clk mailboxes_ick = { | |||
| 2037 | 2036 | ||
| 2038 | static struct clk omapctrl_ick = { | 2037 | static struct clk omapctrl_ick = { |
| 2039 | .name = "omapctrl_ick", | 2038 | .name = "omapctrl_ick", |
| 2040 | .ops = &clkops_omap2_dflt_wait, | 2039 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 2041 | .parent = &core_l4_ick, | 2040 | .parent = &core_l4_ick, |
| 2042 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 2041 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| 2043 | .enable_bit = OMAP3430_EN_OMAPCTRL_SHIFT, | 2042 | .enable_bit = OMAP3430_EN_OMAPCTRL_SHIFT, |
| @@ -2057,7 +2056,7 @@ static struct clk ssi_l4_ick = { | |||
| 2057 | 2056 | ||
| 2058 | static struct clk ssi_ick_3430es1 = { | 2057 | static struct clk ssi_ick_3430es1 = { |
| 2059 | .name = "ssi_ick", | 2058 | .name = "ssi_ick", |
| 2060 | .ops = &clkops_omap2_dflt, | 2059 | .ops = &clkops_omap2_iclk_dflt, |
| 2061 | .parent = &ssi_l4_ick, | 2060 | .parent = &ssi_l4_ick, |
| 2062 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 2061 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| 2063 | .enable_bit = OMAP3430_EN_SSI_SHIFT, | 2062 | .enable_bit = OMAP3430_EN_SSI_SHIFT, |
| @@ -2067,7 +2066,7 @@ static struct clk ssi_ick_3430es1 = { | |||
| 2067 | 2066 | ||
| 2068 | static struct clk ssi_ick_3430es2 = { | 2067 | static struct clk ssi_ick_3430es2 = { |
| 2069 | .name = "ssi_ick", | 2068 | .name = "ssi_ick", |
| 2070 | .ops = &clkops_omap3430es2_ssi_wait, | 2069 | .ops = &clkops_omap3430es2_iclk_ssi_wait, |
| 2071 | .parent = &ssi_l4_ick, | 2070 | .parent = &ssi_l4_ick, |
| 2072 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 2071 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| 2073 | .enable_bit = OMAP3430_EN_SSI_SHIFT, | 2072 | .enable_bit = OMAP3430_EN_SSI_SHIFT, |
| @@ -2085,7 +2084,7 @@ static const struct clksel usb_l4_clksel[] = { | |||
| 2085 | 2084 | ||
| 2086 | static struct clk usb_l4_ick = { | 2085 | static struct clk usb_l4_ick = { |
| 2087 | .name = "usb_l4_ick", | 2086 | .name = "usb_l4_ick", |
| 2088 | .ops = &clkops_omap2_dflt_wait, | 2087 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 2089 | .parent = &l4_ick, | 2088 | .parent = &l4_ick, |
| 2090 | .init = &omap2_init_clksel_parent, | 2089 | .init = &omap2_init_clksel_parent, |
| 2091 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 2090 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| @@ -2107,7 +2106,7 @@ static struct clk security_l4_ick2 = { | |||
| 2107 | 2106 | ||
| 2108 | static struct clk aes1_ick = { | 2107 | static struct clk aes1_ick = { |
| 2109 | .name = "aes1_ick", | 2108 | .name = "aes1_ick", |
| 2110 | .ops = &clkops_omap2_dflt_wait, | 2109 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 2111 | .parent = &security_l4_ick2, | 2110 | .parent = &security_l4_ick2, |
| 2112 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2), | 2111 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2), |
| 2113 | .enable_bit = OMAP3430_EN_AES1_SHIFT, | 2112 | .enable_bit = OMAP3430_EN_AES1_SHIFT, |
| @@ -2116,7 +2115,7 @@ static struct clk aes1_ick = { | |||
| 2116 | 2115 | ||
| 2117 | static struct clk rng_ick = { | 2116 | static struct clk rng_ick = { |
| 2118 | .name = "rng_ick", | 2117 | .name = "rng_ick", |
| 2119 | .ops = &clkops_omap2_dflt_wait, | 2118 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 2120 | .parent = &security_l4_ick2, | 2119 | .parent = &security_l4_ick2, |
| 2121 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2), | 2120 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2), |
| 2122 | .enable_bit = OMAP3430_EN_RNG_SHIFT, | 2121 | .enable_bit = OMAP3430_EN_RNG_SHIFT, |
| @@ -2125,7 +2124,7 @@ static struct clk rng_ick = { | |||
| 2125 | 2124 | ||
| 2126 | static struct clk sha11_ick = { | 2125 | static struct clk sha11_ick = { |
| 2127 | .name = "sha11_ick", | 2126 | .name = "sha11_ick", |
| 2128 | .ops = &clkops_omap2_dflt_wait, | 2127 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 2129 | .parent = &security_l4_ick2, | 2128 | .parent = &security_l4_ick2, |
| 2130 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2), | 2129 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2), |
| 2131 | .enable_bit = OMAP3430_EN_SHA11_SHIFT, | 2130 | .enable_bit = OMAP3430_EN_SHA11_SHIFT, |
| @@ -2134,7 +2133,7 @@ static struct clk sha11_ick = { | |||
| 2134 | 2133 | ||
| 2135 | static struct clk des1_ick = { | 2134 | static struct clk des1_ick = { |
| 2136 | .name = "des1_ick", | 2135 | .name = "des1_ick", |
| 2137 | .ops = &clkops_omap2_dflt_wait, | 2136 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 2138 | .parent = &security_l4_ick2, | 2137 | .parent = &security_l4_ick2, |
| 2139 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2), | 2138 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2), |
| 2140 | .enable_bit = OMAP3430_EN_DES1_SHIFT, | 2139 | .enable_bit = OMAP3430_EN_DES1_SHIFT, |
| @@ -2195,7 +2194,7 @@ static struct clk dss2_alwon_fck = { | |||
| 2195 | static struct clk dss_ick_3430es1 = { | 2194 | static struct clk dss_ick_3430es1 = { |
| 2196 | /* Handles both L3 and L4 clocks */ | 2195 | /* Handles both L3 and L4 clocks */ |
| 2197 | .name = "dss_ick", | 2196 | .name = "dss_ick", |
| 2198 | .ops = &clkops_omap2_dflt, | 2197 | .ops = &clkops_omap2_iclk_dflt, |
| 2199 | .parent = &l4_ick, | 2198 | .parent = &l4_ick, |
| 2200 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_ICLKEN), | 2199 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_ICLKEN), |
| 2201 | .enable_bit = OMAP3430_CM_ICLKEN_DSS_EN_DSS_SHIFT, | 2200 | .enable_bit = OMAP3430_CM_ICLKEN_DSS_EN_DSS_SHIFT, |
| @@ -2206,7 +2205,7 @@ static struct clk dss_ick_3430es1 = { | |||
| 2206 | static struct clk dss_ick_3430es2 = { | 2205 | static struct clk dss_ick_3430es2 = { |
| 2207 | /* Handles both L3 and L4 clocks */ | 2206 | /* Handles both L3 and L4 clocks */ |
| 2208 | .name = "dss_ick", | 2207 | .name = "dss_ick", |
| 2209 | .ops = &clkops_omap3430es2_dss_usbhost_wait, | 2208 | .ops = &clkops_omap3430es2_iclk_dss_usbhost_wait, |
| 2210 | .parent = &l4_ick, | 2209 | .parent = &l4_ick, |
| 2211 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_ICLKEN), | 2210 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_ICLKEN), |
| 2212 | .enable_bit = OMAP3430_CM_ICLKEN_DSS_EN_DSS_SHIFT, | 2211 | .enable_bit = OMAP3430_CM_ICLKEN_DSS_EN_DSS_SHIFT, |
| @@ -2229,7 +2228,7 @@ static struct clk cam_mclk = { | |||
| 2229 | static struct clk cam_ick = { | 2228 | static struct clk cam_ick = { |
| 2230 | /* Handles both L3 and L4 clocks */ | 2229 | /* Handles both L3 and L4 clocks */ |
| 2231 | .name = "cam_ick", | 2230 | .name = "cam_ick", |
| 2232 | .ops = &clkops_omap2_dflt, | 2231 | .ops = &clkops_omap2_iclk_dflt, |
| 2233 | .parent = &l4_ick, | 2232 | .parent = &l4_ick, |
| 2234 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_CAM_MOD, CM_ICLKEN), | 2233 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_CAM_MOD, CM_ICLKEN), |
| 2235 | .enable_bit = OMAP3430_EN_CAM_SHIFT, | 2234 | .enable_bit = OMAP3430_EN_CAM_SHIFT, |
| @@ -2272,7 +2271,7 @@ static struct clk usbhost_48m_fck = { | |||
| 2272 | static struct clk usbhost_ick = { | 2271 | static struct clk usbhost_ick = { |
| 2273 | /* Handles both L3 and L4 clocks */ | 2272 | /* Handles both L3 and L4 clocks */ |
| 2274 | .name = "usbhost_ick", | 2273 | .name = "usbhost_ick", |
| 2275 | .ops = &clkops_omap3430es2_dss_usbhost_wait, | 2274 | .ops = &clkops_omap3430es2_iclk_dss_usbhost_wait, |
| 2276 | .parent = &l4_ick, | 2275 | .parent = &l4_ick, |
| 2277 | .enable_reg = OMAP_CM_REGADDR(OMAP3430ES2_USBHOST_MOD, CM_ICLKEN), | 2276 | .enable_reg = OMAP_CM_REGADDR(OMAP3430ES2_USBHOST_MOD, CM_ICLKEN), |
| 2278 | .enable_bit = OMAP3430ES2_EN_USBHOST_SHIFT, | 2277 | .enable_bit = OMAP3430ES2_EN_USBHOST_SHIFT, |
| @@ -2372,7 +2371,7 @@ static struct clk wkup_l4_ick = { | |||
| 2372 | /* Never specifically named in the TRM, so we have to infer a likely name */ | 2371 | /* Never specifically named in the TRM, so we have to infer a likely name */ |
| 2373 | static struct clk usim_ick = { | 2372 | static struct clk usim_ick = { |
| 2374 | .name = "usim_ick", | 2373 | .name = "usim_ick", |
| 2375 | .ops = &clkops_omap2_dflt_wait, | 2374 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 2376 | .parent = &wkup_l4_ick, | 2375 | .parent = &wkup_l4_ick, |
| 2377 | .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN), | 2376 | .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN), |
| 2378 | .enable_bit = OMAP3430ES2_EN_USIMOCP_SHIFT, | 2377 | .enable_bit = OMAP3430ES2_EN_USIMOCP_SHIFT, |
| @@ -2382,7 +2381,7 @@ static struct clk usim_ick = { | |||
| 2382 | 2381 | ||
| 2383 | static struct clk wdt2_ick = { | 2382 | static struct clk wdt2_ick = { |
| 2384 | .name = "wdt2_ick", | 2383 | .name = "wdt2_ick", |
| 2385 | .ops = &clkops_omap2_dflt_wait, | 2384 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 2386 | .parent = &wkup_l4_ick, | 2385 | .parent = &wkup_l4_ick, |
| 2387 | .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN), | 2386 | .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN), |
| 2388 | .enable_bit = OMAP3430_EN_WDT2_SHIFT, | 2387 | .enable_bit = OMAP3430_EN_WDT2_SHIFT, |
| @@ -2392,7 +2391,7 @@ static struct clk wdt2_ick = { | |||
| 2392 | 2391 | ||
| 2393 | static struct clk wdt1_ick = { | 2392 | static struct clk wdt1_ick = { |
| 2394 | .name = "wdt1_ick", | 2393 | .name = "wdt1_ick", |
| 2395 | .ops = &clkops_omap2_dflt_wait, | 2394 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 2396 | .parent = &wkup_l4_ick, | 2395 | .parent = &wkup_l4_ick, |
| 2397 | .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN), | 2396 | .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN), |
| 2398 | .enable_bit = OMAP3430_EN_WDT1_SHIFT, | 2397 | .enable_bit = OMAP3430_EN_WDT1_SHIFT, |
| @@ -2402,7 +2401,7 @@ static struct clk wdt1_ick = { | |||
| 2402 | 2401 | ||
| 2403 | static struct clk gpio1_ick = { | 2402 | static struct clk gpio1_ick = { |
| 2404 | .name = "gpio1_ick", | 2403 | .name = "gpio1_ick", |
| 2405 | .ops = &clkops_omap2_dflt_wait, | 2404 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 2406 | .parent = &wkup_l4_ick, | 2405 | .parent = &wkup_l4_ick, |
| 2407 | .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN), | 2406 | .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN), |
| 2408 | .enable_bit = OMAP3430_EN_GPIO1_SHIFT, | 2407 | .enable_bit = OMAP3430_EN_GPIO1_SHIFT, |
| @@ -2412,7 +2411,7 @@ static struct clk gpio1_ick = { | |||
| 2412 | 2411 | ||
| 2413 | static struct clk omap_32ksync_ick = { | 2412 | static struct clk omap_32ksync_ick = { |
| 2414 | .name = "omap_32ksync_ick", | 2413 | .name = "omap_32ksync_ick", |
| 2415 | .ops = &clkops_omap2_dflt_wait, | 2414 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 2416 | .parent = &wkup_l4_ick, | 2415 | .parent = &wkup_l4_ick, |
| 2417 | .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN), | 2416 | .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN), |
| 2418 | .enable_bit = OMAP3430_EN_32KSYNC_SHIFT, | 2417 | .enable_bit = OMAP3430_EN_32KSYNC_SHIFT, |
| @@ -2423,7 +2422,7 @@ static struct clk omap_32ksync_ick = { | |||
| 2423 | /* XXX This clock no longer exists in 3430 TRM rev F */ | 2422 | /* XXX This clock no longer exists in 3430 TRM rev F */ |
| 2424 | static struct clk gpt12_ick = { | 2423 | static struct clk gpt12_ick = { |
| 2425 | .name = "gpt12_ick", | 2424 | .name = "gpt12_ick", |
| 2426 | .ops = &clkops_omap2_dflt_wait, | 2425 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 2427 | .parent = &wkup_l4_ick, | 2426 | .parent = &wkup_l4_ick, |
| 2428 | .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN), | 2427 | .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN), |
| 2429 | .enable_bit = OMAP3430_EN_GPT12_SHIFT, | 2428 | .enable_bit = OMAP3430_EN_GPT12_SHIFT, |
| @@ -2433,7 +2432,7 @@ static struct clk gpt12_ick = { | |||
| 2433 | 2432 | ||
| 2434 | static struct clk gpt1_ick = { | 2433 | static struct clk gpt1_ick = { |
| 2435 | .name = "gpt1_ick", | 2434 | .name = "gpt1_ick", |
| 2436 | .ops = &clkops_omap2_dflt_wait, | 2435 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 2437 | .parent = &wkup_l4_ick, | 2436 | .parent = &wkup_l4_ick, |
| 2438 | .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN), | 2437 | .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN), |
| 2439 | .enable_bit = OMAP3430_EN_GPT1_SHIFT, | 2438 | .enable_bit = OMAP3430_EN_GPT1_SHIFT, |
| @@ -2663,7 +2662,7 @@ static struct clk per_l4_ick = { | |||
| 2663 | 2662 | ||
| 2664 | static struct clk gpio6_ick = { | 2663 | static struct clk gpio6_ick = { |
| 2665 | .name = "gpio6_ick", | 2664 | .name = "gpio6_ick", |
| 2666 | .ops = &clkops_omap2_dflt_wait, | 2665 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 2667 | .parent = &per_l4_ick, | 2666 | .parent = &per_l4_ick, |
| 2668 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN), | 2667 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN), |
| 2669 | .enable_bit = OMAP3430_EN_GPIO6_SHIFT, | 2668 | .enable_bit = OMAP3430_EN_GPIO6_SHIFT, |
| @@ -2673,7 +2672,7 @@ static struct clk gpio6_ick = { | |||
| 2673 | 2672 | ||
| 2674 | static struct clk gpio5_ick = { | 2673 | static struct clk gpio5_ick = { |
| 2675 | .name = "gpio5_ick", | 2674 | .name = "gpio5_ick", |
| 2676 | .ops = &clkops_omap2_dflt_wait, | 2675 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 2677 | .parent = &per_l4_ick, | 2676 | .parent = &per_l4_ick, |
| 2678 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN), | 2677 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN), |
| 2679 | .enable_bit = OMAP3430_EN_GPIO5_SHIFT, | 2678 | .enable_bit = OMAP3430_EN_GPIO5_SHIFT, |
| @@ -2683,7 +2682,7 @@ static struct clk gpio5_ick = { | |||
| 2683 | 2682 | ||
| 2684 | static struct clk gpio4_ick = { | 2683 | static struct clk gpio4_ick = { |
| 2685 | .name = "gpio4_ick", | 2684 | .name = "gpio4_ick", |
| 2686 | .ops = &clkops_omap2_dflt_wait, | 2685 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 2687 | .parent = &per_l4_ick, | 2686 | .parent = &per_l4_ick, |
| 2688 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN), | 2687 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN), |
| 2689 | .enable_bit = OMAP3430_EN_GPIO4_SHIFT, | 2688 | .enable_bit = OMAP3430_EN_GPIO4_SHIFT, |
| @@ -2693,7 +2692,7 @@ static struct clk gpio4_ick = { | |||
| 2693 | 2692 | ||
| 2694 | static struct clk gpio3_ick = { | 2693 | static struct clk gpio3_ick = { |
| 2695 | .name = "gpio3_ick", | 2694 | .name = "gpio3_ick", |
| 2696 | .ops = &clkops_omap2_dflt_wait, | 2695 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 2697 | .parent = &per_l4_ick, | 2696 | .parent = &per_l4_ick, |
| 2698 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN), | 2697 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN), |
| 2699 | .enable_bit = OMAP3430_EN_GPIO3_SHIFT, | 2698 | .enable_bit = OMAP3430_EN_GPIO3_SHIFT, |
| @@ -2703,7 +2702,7 @@ static struct clk gpio3_ick = { | |||
| 2703 | 2702 | ||
| 2704 | static struct clk gpio2_ick = { | 2703 | static struct clk gpio2_ick = { |
| 2705 | .name = "gpio2_ick", | 2704 | .name = "gpio2_ick", |
| 2706 | .ops = &clkops_omap2_dflt_wait, | 2705 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 2707 | .parent = &per_l4_ick, | 2706 | .parent = &per_l4_ick, |
| 2708 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN), | 2707 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN), |
| 2709 | .enable_bit = OMAP3430_EN_GPIO2_SHIFT, | 2708 | .enable_bit = OMAP3430_EN_GPIO2_SHIFT, |
| @@ -2713,7 +2712,7 @@ static struct clk gpio2_ick = { | |||
| 2713 | 2712 | ||
| 2714 | static struct clk wdt3_ick = { | 2713 | static struct clk wdt3_ick = { |
| 2715 | .name = "wdt3_ick", | 2714 | .name = "wdt3_ick", |
| 2716 | .ops = &clkops_omap2_dflt_wait, | 2715 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 2717 | .parent = &per_l4_ick, | 2716 | .parent = &per_l4_ick, |
| 2718 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN), | 2717 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN), |
| 2719 | .enable_bit = OMAP3430_EN_WDT3_SHIFT, | 2718 | .enable_bit = OMAP3430_EN_WDT3_SHIFT, |
| @@ -2723,7 +2722,7 @@ static struct clk wdt3_ick = { | |||
| 2723 | 2722 | ||
| 2724 | static struct clk uart3_ick = { | 2723 | static struct clk uart3_ick = { |
| 2725 | .name = "uart3_ick", | 2724 | .name = "uart3_ick", |
| 2726 | .ops = &clkops_omap2_dflt_wait, | 2725 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 2727 | .parent = &per_l4_ick, | 2726 | .parent = &per_l4_ick, |
| 2728 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN), | 2727 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN), |
| 2729 | .enable_bit = OMAP3430_EN_UART3_SHIFT, | 2728 | .enable_bit = OMAP3430_EN_UART3_SHIFT, |
| @@ -2733,7 +2732,7 @@ static struct clk uart3_ick = { | |||
| 2733 | 2732 | ||
| 2734 | static struct clk uart4_ick = { | 2733 | static struct clk uart4_ick = { |
| 2735 | .name = "uart4_ick", | 2734 | .name = "uart4_ick", |
| 2736 | .ops = &clkops_omap2_dflt_wait, | 2735 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 2737 | .parent = &per_l4_ick, | 2736 | .parent = &per_l4_ick, |
| 2738 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN), | 2737 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN), |
| 2739 | .enable_bit = OMAP3630_EN_UART4_SHIFT, | 2738 | .enable_bit = OMAP3630_EN_UART4_SHIFT, |
| @@ -2743,7 +2742,7 @@ static struct clk uart4_ick = { | |||
| 2743 | 2742 | ||
| 2744 | static struct clk gpt9_ick = { | 2743 | static struct clk gpt9_ick = { |
| 2745 | .name = "gpt9_ick", | 2744 | .name = "gpt9_ick", |
| 2746 | .ops = &clkops_omap2_dflt_wait, | 2745 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 2747 | .parent = &per_l4_ick, | 2746 | .parent = &per_l4_ick, |
| 2748 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN), | 2747 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN), |
| 2749 | .enable_bit = OMAP3430_EN_GPT9_SHIFT, | 2748 | .enable_bit = OMAP3430_EN_GPT9_SHIFT, |
| @@ -2753,7 +2752,7 @@ static struct clk gpt9_ick = { | |||
| 2753 | 2752 | ||
| 2754 | static struct clk gpt8_ick = { | 2753 | static struct clk gpt8_ick = { |
| 2755 | .name = "gpt8_ick", | 2754 | .name = "gpt8_ick", |
| 2756 | .ops = &clkops_omap2_dflt_wait, | 2755 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 2757 | .parent = &per_l4_ick, | 2756 | .parent = &per_l4_ick, |
| 2758 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN), | 2757 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN), |
| 2759 | .enable_bit = OMAP3430_EN_GPT8_SHIFT, | 2758 | .enable_bit = OMAP3430_EN_GPT8_SHIFT, |
| @@ -2763,7 +2762,7 @@ static struct clk gpt8_ick = { | |||
| 2763 | 2762 | ||
| 2764 | static struct clk gpt7_ick = { | 2763 | static struct clk gpt7_ick = { |
| 2765 | .name = "gpt7_ick", | 2764 | .name = "gpt7_ick", |
| 2766 | .ops = &clkops_omap2_dflt_wait, | 2765 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 2767 | .parent = &per_l4_ick, | 2766 | .parent = &per_l4_ick, |
| 2768 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN), | 2767 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN), |
| 2769 | .enable_bit = OMAP3430_EN_GPT7_SHIFT, | 2768 | .enable_bit = OMAP3430_EN_GPT7_SHIFT, |
| @@ -2773,7 +2772,7 @@ static struct clk gpt7_ick = { | |||
| 2773 | 2772 | ||
| 2774 | static struct clk gpt6_ick = { | 2773 | static struct clk gpt6_ick = { |
| 2775 | .name = "gpt6_ick", | 2774 | .name = "gpt6_ick", |
| 2776 | .ops = &clkops_omap2_dflt_wait, | 2775 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 2777 | .parent = &per_l4_ick, | 2776 | .parent = &per_l4_ick, |
| 2778 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN), | 2777 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN), |
| 2779 | .enable_bit = OMAP3430_EN_GPT6_SHIFT, | 2778 | .enable_bit = OMAP3430_EN_GPT6_SHIFT, |
| @@ -2783,7 +2782,7 @@ static struct clk gpt6_ick = { | |||
| 2783 | 2782 | ||
| 2784 | static struct clk gpt5_ick = { | 2783 | static struct clk gpt5_ick = { |
| 2785 | .name = "gpt5_ick", | 2784 | .name = "gpt5_ick", |
| 2786 | .ops = &clkops_omap2_dflt_wait, | 2785 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 2787 | .parent = &per_l4_ick, | 2786 | .parent = &per_l4_ick, |
| 2788 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN), | 2787 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN), |
| 2789 | .enable_bit = OMAP3430_EN_GPT5_SHIFT, | 2788 | .enable_bit = OMAP3430_EN_GPT5_SHIFT, |
| @@ -2793,7 +2792,7 @@ static struct clk gpt5_ick = { | |||
| 2793 | 2792 | ||
| 2794 | static struct clk gpt4_ick = { | 2793 | static struct clk gpt4_ick = { |
| 2795 | .name = "gpt4_ick", | 2794 | .name = "gpt4_ick", |
| 2796 | .ops = &clkops_omap2_dflt_wait, | 2795 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 2797 | .parent = &per_l4_ick, | 2796 | .parent = &per_l4_ick, |
| 2798 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN), | 2797 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN), |
| 2799 | .enable_bit = OMAP3430_EN_GPT4_SHIFT, | 2798 | .enable_bit = OMAP3430_EN_GPT4_SHIFT, |
| @@ -2803,7 +2802,7 @@ static struct clk gpt4_ick = { | |||
| 2803 | 2802 | ||
| 2804 | static struct clk gpt3_ick = { | 2803 | static struct clk gpt3_ick = { |
| 2805 | .name = "gpt3_ick", | 2804 | .name = "gpt3_ick", |
| 2806 | .ops = &clkops_omap2_dflt_wait, | 2805 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 2807 | .parent = &per_l4_ick, | 2806 | .parent = &per_l4_ick, |
| 2808 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN), | 2807 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN), |
| 2809 | .enable_bit = OMAP3430_EN_GPT3_SHIFT, | 2808 | .enable_bit = OMAP3430_EN_GPT3_SHIFT, |
| @@ -2813,7 +2812,7 @@ static struct clk gpt3_ick = { | |||
| 2813 | 2812 | ||
| 2814 | static struct clk gpt2_ick = { | 2813 | static struct clk gpt2_ick = { |
| 2815 | .name = "gpt2_ick", | 2814 | .name = "gpt2_ick", |
| 2816 | .ops = &clkops_omap2_dflt_wait, | 2815 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 2817 | .parent = &per_l4_ick, | 2816 | .parent = &per_l4_ick, |
| 2818 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN), | 2817 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN), |
| 2819 | .enable_bit = OMAP3430_EN_GPT2_SHIFT, | 2818 | .enable_bit = OMAP3430_EN_GPT2_SHIFT, |
| @@ -2823,7 +2822,7 @@ static struct clk gpt2_ick = { | |||
| 2823 | 2822 | ||
| 2824 | static struct clk mcbsp2_ick = { | 2823 | static struct clk mcbsp2_ick = { |
| 2825 | .name = "mcbsp2_ick", | 2824 | .name = "mcbsp2_ick", |
| 2826 | .ops = &clkops_omap2_dflt_wait, | 2825 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 2827 | .parent = &per_l4_ick, | 2826 | .parent = &per_l4_ick, |
| 2828 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN), | 2827 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN), |
| 2829 | .enable_bit = OMAP3430_EN_MCBSP2_SHIFT, | 2828 | .enable_bit = OMAP3430_EN_MCBSP2_SHIFT, |
| @@ -2833,7 +2832,7 @@ static struct clk mcbsp2_ick = { | |||
| 2833 | 2832 | ||
| 2834 | static struct clk mcbsp3_ick = { | 2833 | static struct clk mcbsp3_ick = { |
| 2835 | .name = "mcbsp3_ick", | 2834 | .name = "mcbsp3_ick", |
| 2836 | .ops = &clkops_omap2_dflt_wait, | 2835 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 2837 | .parent = &per_l4_ick, | 2836 | .parent = &per_l4_ick, |
| 2838 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN), | 2837 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN), |
| 2839 | .enable_bit = OMAP3430_EN_MCBSP3_SHIFT, | 2838 | .enable_bit = OMAP3430_EN_MCBSP3_SHIFT, |
| @@ -2843,7 +2842,7 @@ static struct clk mcbsp3_ick = { | |||
| 2843 | 2842 | ||
| 2844 | static struct clk mcbsp4_ick = { | 2843 | static struct clk mcbsp4_ick = { |
| 2845 | .name = "mcbsp4_ick", | 2844 | .name = "mcbsp4_ick", |
| 2846 | .ops = &clkops_omap2_dflt_wait, | 2845 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 2847 | .parent = &per_l4_ick, | 2846 | .parent = &per_l4_ick, |
| 2848 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN), | 2847 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN), |
| 2849 | .enable_bit = OMAP3430_EN_MCBSP4_SHIFT, | 2848 | .enable_bit = OMAP3430_EN_MCBSP4_SHIFT, |
| @@ -3186,7 +3185,7 @@ static struct clk vpfe_fck = { | |||
| 3186 | */ | 3185 | */ |
| 3187 | static struct clk uart4_ick_am35xx = { | 3186 | static struct clk uart4_ick_am35xx = { |
| 3188 | .name = "uart4_ick", | 3187 | .name = "uart4_ick", |
| 3189 | .ops = &clkops_omap2_dflt_wait, | 3188 | .ops = &clkops_omap2_iclk_dflt_wait, |
| 3190 | .parent = &core_l4_ick, | 3189 | .parent = &core_l4_ick, |
| 3191 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 3190 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| 3192 | .enable_bit = AM35XX_EN_UART4_SHIFT, | 3191 | .enable_bit = AM35XX_EN_UART4_SHIFT, |
| @@ -3538,6 +3537,9 @@ int __init omap3xxx_clk_init(void) | |||
| 3538 | omap2_init_clk_clkdm(c->lk.clk); | 3537 | omap2_init_clk_clkdm(c->lk.clk); |
| 3539 | } | 3538 | } |
| 3540 | 3539 | ||
| 3540 | /* Disable autoidle on all clocks; let the PM code enable it later */ | ||
| 3541 | omap_clk_disable_autoidle_all(); | ||
| 3542 | |||
| 3541 | recalculate_root_clocks(); | 3543 | recalculate_root_clocks(); |
| 3542 | 3544 | ||
| 3543 | pr_info("Clocking rate (Crystal/Core/MPU): %ld.%01ld/%ld/%ld MHz\n", | 3545 | pr_info("Clocking rate (Crystal/Core/MPU): %ld.%01ld/%ld/%ld MHz\n", |
| @@ -3551,7 +3553,8 @@ int __init omap3xxx_clk_init(void) | |||
| 3551 | clk_enable_init_clocks(); | 3553 | clk_enable_init_clocks(); |
| 3552 | 3554 | ||
| 3553 | /* | 3555 | /* |
| 3554 | * Lock DPLL5 and put it in autoidle. | 3556 | * Lock DPLL5 -- here only until other device init code can |
| 3557 | * handle this | ||
| 3555 | */ | 3558 | */ |
| 3556 | if (!cpu_is_ti816x() && (omap_rev() >= OMAP3430_REV_ES2_0)) | 3559 | if (!cpu_is_ti816x() && (omap_rev() >= OMAP3430_REV_ES2_0)) |
| 3557 | omap3_clk_lock_dpll5(); | 3560 | omap3_clk_lock_dpll5(); |
diff --git a/arch/arm/mach-omap2/clock44xx_data.c b/arch/arm/mach-omap2/clock44xx_data.c index fdbc0426b6f..f1fedb71ae0 100644 --- a/arch/arm/mach-omap2/clock44xx_data.c +++ b/arch/arm/mach-omap2/clock44xx_data.c | |||
| @@ -278,8 +278,10 @@ static struct clk dpll_abe_ck = { | |||
| 278 | static struct clk dpll_abe_x2_ck = { | 278 | static struct clk dpll_abe_x2_ck = { |
| 279 | .name = "dpll_abe_x2_ck", | 279 | .name = "dpll_abe_x2_ck", |
| 280 | .parent = &dpll_abe_ck, | 280 | .parent = &dpll_abe_ck, |
| 281 | .ops = &clkops_null, | 281 | .flags = CLOCK_CLKOUTX2, |
| 282 | .ops = &clkops_omap4_dpllmx_ops, | ||
| 282 | .recalc = &omap3_clkoutx2_recalc, | 283 | .recalc = &omap3_clkoutx2_recalc, |
| 284 | .clksel_reg = OMAP4430_CM_DIV_M2_DPLL_ABE, | ||
| 283 | }; | 285 | }; |
| 284 | 286 | ||
| 285 | static const struct clksel_rate div31_1to31_rates[] = { | 287 | static const struct clksel_rate div31_1to31_rates[] = { |
| @@ -328,7 +330,7 @@ static struct clk dpll_abe_m2x2_ck = { | |||
| 328 | .clksel = dpll_abe_m2x2_div, | 330 | .clksel = dpll_abe_m2x2_div, |
| 329 | .clksel_reg = OMAP4430_CM_DIV_M2_DPLL_ABE, | 331 | .clksel_reg = OMAP4430_CM_DIV_M2_DPLL_ABE, |
| 330 | .clksel_mask = OMAP4430_DPLL_CLKOUT_DIV_MASK, | 332 | .clksel_mask = OMAP4430_DPLL_CLKOUT_DIV_MASK, |
| 331 | .ops = &clkops_null, | 333 | .ops = &clkops_omap4_dpllmx_ops, |
| 332 | .recalc = &omap2_clksel_recalc, | 334 | .recalc = &omap2_clksel_recalc, |
| 333 | .round_rate = &omap2_clksel_round_rate, | 335 | .round_rate = &omap2_clksel_round_rate, |
| 334 | .set_rate = &omap2_clksel_set_rate, | 336 | .set_rate = &omap2_clksel_set_rate, |
| @@ -395,7 +397,7 @@ static struct clk dpll_abe_m3x2_ck = { | |||
| 395 | .clksel = dpll_abe_m2x2_div, | 397 | .clksel = dpll_abe_m2x2_div, |
| 396 | .clksel_reg = OMAP4430_CM_DIV_M3_DPLL_ABE, | 398 | .clksel_reg = OMAP4430_CM_DIV_M3_DPLL_ABE, |
| 397 | .clksel_mask = OMAP4430_DPLL_CLKOUTHIF_DIV_MASK, | 399 | .clksel_mask = OMAP4430_DPLL_CLKOUTHIF_DIV_MASK, |
| 398 | .ops = &clkops_null, | 400 | .ops = &clkops_omap4_dpllmx_ops, |
| 399 | .recalc = &omap2_clksel_recalc, | 401 | .recalc = &omap2_clksel_recalc, |
| 400 | .round_rate = &omap2_clksel_round_rate, | 402 | .round_rate = &omap2_clksel_round_rate, |
| 401 | .set_rate = &omap2_clksel_set_rate, | 403 | .set_rate = &omap2_clksel_set_rate, |
| @@ -443,13 +445,14 @@ static struct clk dpll_core_ck = { | |||
| 443 | .parent = &sys_clkin_ck, | 445 | .parent = &sys_clkin_ck, |
| 444 | .dpll_data = &dpll_core_dd, | 446 | .dpll_data = &dpll_core_dd, |
| 445 | .init = &omap2_init_dpll_parent, | 447 | .init = &omap2_init_dpll_parent, |
| 446 | .ops = &clkops_null, | 448 | .ops = &clkops_omap3_core_dpll_ops, |
| 447 | .recalc = &omap3_dpll_recalc, | 449 | .recalc = &omap3_dpll_recalc, |
| 448 | }; | 450 | }; |
| 449 | 451 | ||
| 450 | static struct clk dpll_core_x2_ck = { | 452 | static struct clk dpll_core_x2_ck = { |
| 451 | .name = "dpll_core_x2_ck", | 453 | .name = "dpll_core_x2_ck", |
| 452 | .parent = &dpll_core_ck, | 454 | .parent = &dpll_core_ck, |
| 455 | .flags = CLOCK_CLKOUTX2, | ||
| 453 | .ops = &clkops_null, | 456 | .ops = &clkops_null, |
| 454 | .recalc = &omap3_clkoutx2_recalc, | 457 | .recalc = &omap3_clkoutx2_recalc, |
| 455 | }; | 458 | }; |
| @@ -465,7 +468,7 @@ static struct clk dpll_core_m6x2_ck = { | |||
| 465 | .clksel = dpll_core_m6x2_div, | 468 | .clksel = dpll_core_m6x2_div, |
| 466 | .clksel_reg = OMAP4430_CM_DIV_M6_DPLL_CORE, | 469 | .clksel_reg = OMAP4430_CM_DIV_M6_DPLL_CORE, |
| 467 | .clksel_mask = OMAP4430_HSDIVIDER_CLKOUT3_DIV_MASK, | 470 | .clksel_mask = OMAP4430_HSDIVIDER_CLKOUT3_DIV_MASK, |
| 468 | .ops = &clkops_null, | 471 | .ops = &clkops_omap4_dpllmx_ops, |
| 469 | .recalc = &omap2_clksel_recalc, | 472 | .recalc = &omap2_clksel_recalc, |
| 470 | .round_rate = &omap2_clksel_round_rate, | 473 | .round_rate = &omap2_clksel_round_rate, |
| 471 | .set_rate = &omap2_clksel_set_rate, | 474 | .set_rate = &omap2_clksel_set_rate, |
| @@ -495,7 +498,7 @@ static struct clk dpll_core_m2_ck = { | |||
| 495 | .clksel = dpll_core_m2_div, | 498 | .clksel = dpll_core_m2_div, |
| 496 | .clksel_reg = OMAP4430_CM_DIV_M2_DPLL_CORE, | 499 | .clksel_reg = OMAP4430_CM_DIV_M2_DPLL_CORE, |
| 497 | .clksel_mask = OMAP4430_DPLL_CLKOUT_DIV_MASK, | 500 | .clksel_mask = OMAP4430_DPLL_CLKOUT_DIV_MASK, |
| 498 | .ops = &clkops_null, | 501 | .ops = &clkops_omap4_dpllmx_ops, |
| 499 | .recalc = &omap2_clksel_recalc, | 502 | .recalc = &omap2_clksel_recalc, |
| 500 | .round_rate = &omap2_clksel_round_rate, | 503 | .round_rate = &omap2_clksel_round_rate, |
| 501 | .set_rate = &omap2_clksel_set_rate, | 504 | .set_rate = &omap2_clksel_set_rate, |
| @@ -515,7 +518,7 @@ static struct clk dpll_core_m5x2_ck = { | |||
| 515 | .clksel = dpll_core_m6x2_div, | 518 | .clksel = dpll_core_m6x2_div, |
| 516 | .clksel_reg = OMAP4430_CM_DIV_M5_DPLL_CORE, | 519 | .clksel_reg = OMAP4430_CM_DIV_M5_DPLL_CORE, |
| 517 | .clksel_mask = OMAP4430_HSDIVIDER_CLKOUT2_DIV_MASK, | 520 | .clksel_mask = OMAP4430_HSDIVIDER_CLKOUT2_DIV_MASK, |
| 518 | .ops = &clkops_null, | 521 | .ops = &clkops_omap4_dpllmx_ops, |
| 519 | .recalc = &omap2_clksel_recalc, | 522 | .recalc = &omap2_clksel_recalc, |
| 520 | .round_rate = &omap2_clksel_round_rate, | 523 | .round_rate = &omap2_clksel_round_rate, |
| 521 | .set_rate = &omap2_clksel_set_rate, | 524 | .set_rate = &omap2_clksel_set_rate, |
| @@ -581,7 +584,7 @@ static struct clk dpll_core_m4x2_ck = { | |||
| 581 | .clksel = dpll_core_m6x2_div, | 584 | .clksel = dpll_core_m6x2_div, |
| 582 | .clksel_reg = OMAP4430_CM_DIV_M4_DPLL_CORE, | 585 | .clksel_reg = OMAP4430_CM_DIV_M4_DPLL_CORE, |
| 583 | .clksel_mask = OMAP4430_HSDIVIDER_CLKOUT1_DIV_MASK, | 586 | .clksel_mask = OMAP4430_HSDIVIDER_CLKOUT1_DIV_MASK, |
| 584 | .ops = &clkops_null, | 587 | .ops = &clkops_omap4_dpllmx_ops, |
| 585 | .recalc = &omap2_clksel_recalc, | 588 | .recalc = &omap2_clksel_recalc, |
| 586 | .round_rate = &omap2_clksel_round_rate, | 589 | .round_rate = &omap2_clksel_round_rate, |
| 587 | .set_rate = &omap2_clksel_set_rate, | 590 | .set_rate = &omap2_clksel_set_rate, |
| @@ -606,7 +609,7 @@ static struct clk dpll_abe_m2_ck = { | |||
| 606 | .clksel = dpll_abe_m2_div, | 609 | .clksel = dpll_abe_m2_div, |
| 607 | .clksel_reg = OMAP4430_CM_DIV_M2_DPLL_ABE, | 610 | .clksel_reg = OMAP4430_CM_DIV_M2_DPLL_ABE, |
| 608 | .clksel_mask = OMAP4430_DPLL_CLKOUT_DIV_MASK, | 611 | .clksel_mask = OMAP4430_DPLL_CLKOUT_DIV_MASK, |
| 609 | .ops = &clkops_null, | 612 | .ops = &clkops_omap4_dpllmx_ops, |
| 610 | .recalc = &omap2_clksel_recalc, | 613 | .recalc = &omap2_clksel_recalc, |
| 611 | .round_rate = &omap2_clksel_round_rate, | 614 | .round_rate = &omap2_clksel_round_rate, |
| 612 | .set_rate = &omap2_clksel_set_rate, | 615 | .set_rate = &omap2_clksel_set_rate, |
| @@ -632,7 +635,7 @@ static struct clk dpll_core_m7x2_ck = { | |||
| 632 | .clksel = dpll_core_m6x2_div, | 635 | .clksel = dpll_core_m6x2_div, |
| 633 | .clksel_reg = OMAP4430_CM_DIV_M7_DPLL_CORE, | 636 | .clksel_reg = OMAP4430_CM_DIV_M7_DPLL_CORE, |
| 634 | .clksel_mask = OMAP4430_HSDIVIDER_CLKOUT4_DIV_MASK, | 637 | .clksel_mask = OMAP4430_HSDIVIDER_CLKOUT4_DIV_MASK, |
| 635 | .ops = &clkops_null, | 638 | .ops = &clkops_omap4_dpllmx_ops, |
| 636 | .recalc = &omap2_clksel_recalc, | 639 | .recalc = &omap2_clksel_recalc, |
| 637 | .round_rate = &omap2_clksel_round_rate, | 640 | .round_rate = &omap2_clksel_round_rate, |
| 638 | .set_rate = &omap2_clksel_set_rate, | 641 | .set_rate = &omap2_clksel_set_rate, |
| @@ -689,6 +692,7 @@ static struct clk dpll_iva_ck = { | |||
| 689 | static struct clk dpll_iva_x2_ck = { | 692 | static struct clk dpll_iva_x2_ck = { |
| 690 | .name = "dpll_iva_x2_ck", | 693 | .name = "dpll_iva_x2_ck", |
| 691 | .parent = &dpll_iva_ck, | 694 | .parent = &dpll_iva_ck, |
| 695 | .flags = CLOCK_CLKOUTX2, | ||
| 692 | .ops = &clkops_null, | 696 | .ops = &clkops_null, |
| 693 | .recalc = &omap3_clkoutx2_recalc, | 697 | .recalc = &omap3_clkoutx2_recalc, |
| 694 | }; | 698 | }; |
| @@ -704,7 +708,7 @@ static struct clk dpll_iva_m4x2_ck = { | |||
| 704 | .clksel = dpll_iva_m4x2_div, | 708 | .clksel = dpll_iva_m4x2_div, |
| 705 | .clksel_reg = OMAP4430_CM_DIV_M4_DPLL_IVA, | 709 | .clksel_reg = OMAP4430_CM_DIV_M4_DPLL_IVA, |
| 706 | .clksel_mask = OMAP4430_HSDIVIDER_CLKOUT1_DIV_MASK, | 710 | .clksel_mask = OMAP4430_HSDIVIDER_CLKOUT1_DIV_MASK, |
| 707 | .ops = &clkops_null, | 711 | .ops = &clkops_omap4_dpllmx_ops, |
| 708 | .recalc = &omap2_clksel_recalc, | 712 | .recalc = &omap2_clksel_recalc, |
| 709 | .round_rate = &omap2_clksel_round_rate, | 713 | .round_rate = &omap2_clksel_round_rate, |
| 710 | .set_rate = &omap2_clksel_set_rate, | 714 | .set_rate = &omap2_clksel_set_rate, |
| @@ -716,7 +720,7 @@ static struct clk dpll_iva_m5x2_ck = { | |||
| 716 | .clksel = dpll_iva_m4x2_div, | 720 | .clksel = dpll_iva_m4x2_div, |
| 717 | .clksel_reg = OMAP4430_CM_DIV_M5_DPLL_IVA, | 721 | .clksel_reg = OMAP4430_CM_DIV_M5_DPLL_IVA, |
| 718 | .clksel_mask = OMAP4430_HSDIVIDER_CLKOUT2_DIV_MASK, | 722 | .clksel_mask = OMAP4430_HSDIVIDER_CLKOUT2_DIV_MASK, |
| 719 | .ops = &clkops_null, | 723 | .ops = &clkops_omap4_dpllmx_ops, |
| 720 | .recalc = &omap2_clksel_recalc, | 724 | .recalc = &omap2_clksel_recalc, |
| 721 | .round_rate = &omap2_clksel_round_rate, | 725 | .round_rate = &omap2_clksel_round_rate, |
| 722 | .set_rate = &omap2_clksel_set_rate, | 726 | .set_rate = &omap2_clksel_set_rate, |
| @@ -764,7 +768,7 @@ static struct clk dpll_mpu_m2_ck = { | |||
| 764 | .clksel = dpll_mpu_m2_div, | 768 | .clksel = dpll_mpu_m2_div, |
| 765 | .clksel_reg = OMAP4430_CM_DIV_M2_DPLL_MPU, | 769 | .clksel_reg = OMAP4430_CM_DIV_M2_DPLL_MPU, |
| 766 | .clksel_mask = OMAP4430_DPLL_CLKOUT_DIV_MASK, | 770 | .clksel_mask = OMAP4430_DPLL_CLKOUT_DIV_MASK, |
| 767 | .ops = &clkops_null, | 771 | .ops = &clkops_omap4_dpllmx_ops, |
| 768 | .recalc = &omap2_clksel_recalc, | 772 | .recalc = &omap2_clksel_recalc, |
| 769 | .round_rate = &omap2_clksel_round_rate, | 773 | .round_rate = &omap2_clksel_round_rate, |
| 770 | .set_rate = &omap2_clksel_set_rate, | 774 | .set_rate = &omap2_clksel_set_rate, |
| @@ -837,7 +841,7 @@ static struct clk dpll_per_m2_ck = { | |||
| 837 | .clksel = dpll_per_m2_div, | 841 | .clksel = dpll_per_m2_div, |
| 838 | .clksel_reg = OMAP4430_CM_DIV_M2_DPLL_PER, | 842 | .clksel_reg = OMAP4430_CM_DIV_M2_DPLL_PER, |
| 839 | .clksel_mask = OMAP4430_DPLL_CLKOUT_DIV_MASK, | 843 | .clksel_mask = OMAP4430_DPLL_CLKOUT_DIV_MASK, |
| 840 | .ops = &clkops_null, | 844 | .ops = &clkops_omap4_dpllmx_ops, |
| 841 | .recalc = &omap2_clksel_recalc, | 845 | .recalc = &omap2_clksel_recalc, |
| 842 | .round_rate = &omap2_clksel_round_rate, | 846 | .round_rate = &omap2_clksel_round_rate, |
| 843 | .set_rate = &omap2_clksel_set_rate, | 847 | .set_rate = &omap2_clksel_set_rate, |
| @@ -846,8 +850,10 @@ static struct clk dpll_per_m2_ck = { | |||
| 846 | static struct clk dpll_per_x2_ck = { | 850 | static struct clk dpll_per_x2_ck = { |
| 847 | .name = "dpll_per_x2_ck", | 851 | .name = "dpll_per_x2_ck", |
| 848 | .parent = &dpll_per_ck, | 852 | .parent = &dpll_per_ck, |
| 849 | .ops = &clkops_null, | 853 | .flags = CLOCK_CLKOUTX2, |
| 854 | .ops = &clkops_omap4_dpllmx_ops, | ||
| 850 | .recalc = &omap3_clkoutx2_recalc, | 855 | .recalc = &omap3_clkoutx2_recalc, |
| 856 | .clksel_reg = OMAP4430_CM_DIV_M2_DPLL_PER, | ||
| 851 | }; | 857 | }; |
| 852 | 858 | ||
| 853 | static const struct clksel dpll_per_m2x2_div[] = { | 859 | static const struct clksel dpll_per_m2x2_div[] = { |
| @@ -861,7 +867,7 @@ static struct clk dpll_per_m2x2_ck = { | |||
| 861 | .clksel = dpll_per_m2x2_div, | 867 | .clksel = dpll_per_m2x2_div, |
| 862 | .clksel_reg = OMAP4430_CM_DIV_M2_DPLL_PER, | 868 | .clksel_reg = OMAP4430_CM_DIV_M2_DPLL_PER, |
| 863 | .clksel_mask = OMAP4430_DPLL_CLKOUT_DIV_MASK, | 869 | .clksel_mask = OMAP4430_DPLL_CLKOUT_DIV_MASK, |
| 864 | .ops = &clkops_null, | 870 | .ops = &clkops_omap4_dpllmx_ops, |
| 865 | .recalc = &omap2_clksel_recalc, | 871 | .recalc = &omap2_clksel_recalc, |
| 866 | .round_rate = &omap2_clksel_round_rate, | 872 | .round_rate = &omap2_clksel_round_rate, |
| 867 | .set_rate = &omap2_clksel_set_rate, | 873 | .set_rate = &omap2_clksel_set_rate, |
| @@ -887,7 +893,7 @@ static struct clk dpll_per_m4x2_ck = { | |||
| 887 | .clksel = dpll_per_m2x2_div, | 893 | .clksel = dpll_per_m2x2_div, |
| 888 | .clksel_reg = OMAP4430_CM_DIV_M4_DPLL_PER, | 894 | .clksel_reg = OMAP4430_CM_DIV_M4_DPLL_PER, |
| 889 | .clksel_mask = OMAP4430_HSDIVIDER_CLKOUT1_DIV_MASK, | 895 | .clksel_mask = OMAP4430_HSDIVIDER_CLKOUT1_DIV_MASK, |
| 890 | .ops = &clkops_null, | 896 | .ops = &clkops_omap4_dpllmx_ops, |
| 891 | .recalc = &omap2_clksel_recalc, | 897 | .recalc = &omap2_clksel_recalc, |
| 892 | .round_rate = &omap2_clksel_round_rate, | 898 | .round_rate = &omap2_clksel_round_rate, |
| 893 | .set_rate = &omap2_clksel_set_rate, | 899 | .set_rate = &omap2_clksel_set_rate, |
| @@ -899,7 +905,7 @@ static struct clk dpll_per_m5x2_ck = { | |||
| 899 | .clksel = dpll_per_m2x2_div, | 905 | .clksel = dpll_per_m2x2_div, |
| 900 | .clksel_reg = OMAP4430_CM_DIV_M5_DPLL_PER, | 906 | .clksel_reg = OMAP4430_CM_DIV_M5_DPLL_PER, |
| 901 | .clksel_mask = OMAP4430_HSDIVIDER_CLKOUT2_DIV_MASK, | 907 | .clksel_mask = OMAP4430_HSDIVIDER_CLKOUT2_DIV_MASK, |
| 902 | .ops = &clkops_null, | 908 | .ops = &clkops_omap4_dpllmx_ops, |
| 903 | .recalc = &omap2_clksel_recalc, | 909 | .recalc = &omap2_clksel_recalc, |
| 904 | .round_rate = &omap2_clksel_round_rate, | 910 | .round_rate = &omap2_clksel_round_rate, |
| 905 | .set_rate = &omap2_clksel_set_rate, | 911 | .set_rate = &omap2_clksel_set_rate, |
| @@ -911,7 +917,7 @@ static struct clk dpll_per_m6x2_ck = { | |||
| 911 | .clksel = dpll_per_m2x2_div, | 917 | .clksel = dpll_per_m2x2_div, |
| 912 | .clksel_reg = OMAP4430_CM_DIV_M6_DPLL_PER, | 918 | .clksel_reg = OMAP4430_CM_DIV_M6_DPLL_PER, |
| 913 | .clksel_mask = OMAP4430_HSDIVIDER_CLKOUT3_DIV_MASK, | 919 | .clksel_mask = OMAP4430_HSDIVIDER_CLKOUT3_DIV_MASK, |
| 914 | .ops = &clkops_null, | 920 | .ops = &clkops_omap4_dpllmx_ops, |
| 915 | .recalc = &omap2_clksel_recalc, | 921 | .recalc = &omap2_clksel_recalc, |
| 916 | .round_rate = &omap2_clksel_round_rate, | 922 | .round_rate = &omap2_clksel_round_rate, |
| 917 | .set_rate = &omap2_clksel_set_rate, | 923 | .set_rate = &omap2_clksel_set_rate, |
| @@ -923,7 +929,7 @@ static struct clk dpll_per_m7x2_ck = { | |||
| 923 | .clksel = dpll_per_m2x2_div, | 929 | .clksel = dpll_per_m2x2_div, |
| 924 | .clksel_reg = OMAP4430_CM_DIV_M7_DPLL_PER, | 930 | .clksel_reg = OMAP4430_CM_DIV_M7_DPLL_PER, |
| 925 | .clksel_mask = OMAP4430_HSDIVIDER_CLKOUT4_DIV_MASK, | 931 | .clksel_mask = OMAP4430_HSDIVIDER_CLKOUT4_DIV_MASK, |
| 926 | .ops = &clkops_null, | 932 | .ops = &clkops_omap4_dpllmx_ops, |
| 927 | .recalc = &omap2_clksel_recalc, | 933 | .recalc = &omap2_clksel_recalc, |
| 928 | .round_rate = &omap2_clksel_round_rate, | 934 | .round_rate = &omap2_clksel_round_rate, |
| 929 | .set_rate = &omap2_clksel_set_rate, | 935 | .set_rate = &omap2_clksel_set_rate, |
| @@ -964,6 +970,7 @@ static struct clk dpll_unipro_ck = { | |||
| 964 | static struct clk dpll_unipro_x2_ck = { | 970 | static struct clk dpll_unipro_x2_ck = { |
| 965 | .name = "dpll_unipro_x2_ck", | 971 | .name = "dpll_unipro_x2_ck", |
| 966 | .parent = &dpll_unipro_ck, | 972 | .parent = &dpll_unipro_ck, |
| 973 | .flags = CLOCK_CLKOUTX2, | ||
| 967 | .ops = &clkops_null, | 974 | .ops = &clkops_null, |
| 968 | .recalc = &omap3_clkoutx2_recalc, | 975 | .recalc = &omap3_clkoutx2_recalc, |
| 969 | }; | 976 | }; |
| @@ -979,7 +986,7 @@ static struct clk dpll_unipro_m2x2_ck = { | |||
| 979 | .clksel = dpll_unipro_m2x2_div, | 986 | .clksel = dpll_unipro_m2x2_div, |
| 980 | .clksel_reg = OMAP4430_CM_DIV_M2_DPLL_UNIPRO, | 987 | .clksel_reg = OMAP4430_CM_DIV_M2_DPLL_UNIPRO, |
| 981 | .clksel_mask = OMAP4430_DPLL_CLKOUT_DIV_MASK, | 988 | .clksel_mask = OMAP4430_DPLL_CLKOUT_DIV_MASK, |
| 982 | .ops = &clkops_null, | 989 | .ops = &clkops_omap4_dpllmx_ops, |
| 983 | .recalc = &omap2_clksel_recalc, | 990 | .recalc = &omap2_clksel_recalc, |
| 984 | .round_rate = &omap2_clksel_round_rate, | 991 | .round_rate = &omap2_clksel_round_rate, |
| 985 | .set_rate = &omap2_clksel_set_rate, | 992 | .set_rate = &omap2_clksel_set_rate, |
| @@ -1028,7 +1035,8 @@ static struct clk dpll_usb_ck = { | |||
| 1028 | static struct clk dpll_usb_clkdcoldo_ck = { | 1035 | static struct clk dpll_usb_clkdcoldo_ck = { |
| 1029 | .name = "dpll_usb_clkdcoldo_ck", | 1036 | .name = "dpll_usb_clkdcoldo_ck", |
| 1030 | .parent = &dpll_usb_ck, | 1037 | .parent = &dpll_usb_ck, |
| 1031 | .ops = &clkops_null, | 1038 | .ops = &clkops_omap4_dpllmx_ops, |
| 1039 | .clksel_reg = OMAP4430_CM_CLKDCOLDO_DPLL_USB, | ||
| 1032 | .recalc = &followparent_recalc, | 1040 | .recalc = &followparent_recalc, |
| 1033 | }; | 1041 | }; |
| 1034 | 1042 | ||
| @@ -1043,7 +1051,7 @@ static struct clk dpll_usb_m2_ck = { | |||
| 1043 | .clksel = dpll_usb_m2_div, | 1051 | .clksel = dpll_usb_m2_div, |
| 1044 | .clksel_reg = OMAP4430_CM_DIV_M2_DPLL_USB, | 1052 | .clksel_reg = OMAP4430_CM_DIV_M2_DPLL_USB, |
| 1045 | .clksel_mask = OMAP4430_DPLL_CLKOUT_DIV_0_6_MASK, | 1053 | .clksel_mask = OMAP4430_DPLL_CLKOUT_DIV_0_6_MASK, |
| 1046 | .ops = &clkops_null, | 1054 | .ops = &clkops_omap4_dpllmx_ops, |
| 1047 | .recalc = &omap2_clksel_recalc, | 1055 | .recalc = &omap2_clksel_recalc, |
| 1048 | .round_rate = &omap2_clksel_round_rate, | 1056 | .round_rate = &omap2_clksel_round_rate, |
| 1049 | .set_rate = &omap2_clksel_set_rate, | 1057 | .set_rate = &omap2_clksel_set_rate, |
| @@ -3301,6 +3309,9 @@ int __init omap4xxx_clk_init(void) | |||
| 3301 | omap2_init_clk_clkdm(c->lk.clk); | 3309 | omap2_init_clk_clkdm(c->lk.clk); |
| 3302 | } | 3310 | } |
| 3303 | 3311 | ||
| 3312 | /* Disable autoidle on all clocks; let the PM code enable it later */ | ||
| 3313 | omap_clk_disable_autoidle_all(); | ||
| 3314 | |||
| 3304 | recalculate_root_clocks(); | 3315 | recalculate_root_clocks(); |
| 3305 | 3316 | ||
| 3306 | /* | 3317 | /* |
diff --git a/arch/arm/mach-omap2/clock_common_data.c b/arch/arm/mach-omap2/clock_common_data.c index 1cf8131205f..6424d46be14 100644 --- a/arch/arm/mach-omap2/clock_common_data.c +++ b/arch/arm/mach-omap2/clock_common_data.c | |||
| @@ -37,3 +37,9 @@ const struct clksel_rate gfx_l3_rates[] = { | |||
| 37 | { .div = 0 } | 37 | { .div = 0 } |
| 38 | }; | 38 | }; |
| 39 | 39 | ||
| 40 | const struct clksel_rate dsp_ick_rates[] = { | ||
| 41 | { .div = 1, .val = 1, .flags = RATE_IN_24XX }, | ||
| 42 | { .div = 2, .val = 2, .flags = RATE_IN_24XX }, | ||
| 43 | { .div = 3, .val = 3, .flags = RATE_IN_243X }, | ||
| 44 | { .div = 0 }, | ||
| 45 | }; | ||
diff --git a/arch/arm/mach-omap2/clockdomain.c b/arch/arm/mach-omap2/clockdomain.c index 58e42f76603..ab878545bd9 100644 --- a/arch/arm/mach-omap2/clockdomain.c +++ b/arch/arm/mach-omap2/clockdomain.c | |||
| @@ -26,17 +26,8 @@ | |||
| 26 | 26 | ||
| 27 | #include <linux/bitops.h> | 27 | #include <linux/bitops.h> |
| 28 | 28 | ||
| 29 | #include "prm2xxx_3xxx.h" | ||
| 30 | #include "prm-regbits-24xx.h" | ||
| 31 | #include "cm2xxx_3xxx.h" | ||
| 32 | #include "cm-regbits-24xx.h" | ||
| 33 | #include "cminst44xx.h" | ||
| 34 | #include "prcm44xx.h" | ||
| 35 | |||
| 36 | #include <plat/clock.h> | 29 | #include <plat/clock.h> |
| 37 | #include "powerdomain.h" | ||
| 38 | #include "clockdomain.h" | 30 | #include "clockdomain.h" |
| 39 | #include <plat/prcm.h> | ||
| 40 | 31 | ||
| 41 | /* clkdm_list contains all registered struct clockdomains */ | 32 | /* clkdm_list contains all registered struct clockdomains */ |
| 42 | static LIST_HEAD(clkdm_list); | 33 | static LIST_HEAD(clkdm_list); |
| @@ -44,6 +35,7 @@ static LIST_HEAD(clkdm_list); | |||
| 44 | /* array of clockdomain deps to be added/removed when clkdm in hwsup mode */ | 35 | /* array of clockdomain deps to be added/removed when clkdm in hwsup mode */ |
| 45 | static struct clkdm_autodep *autodeps; | 36 | static struct clkdm_autodep *autodeps; |
| 46 | 37 | ||
| 38 | static struct clkdm_ops *arch_clkdm; | ||
| 47 | 39 | ||
| 48 | /* Private functions */ | 40 | /* Private functions */ |
| 49 | 41 | ||
| @@ -177,11 +169,11 @@ static void _autodep_lookup(struct clkdm_autodep *autodep) | |||
| 177 | * XXX autodeps are deprecated and should be removed at the earliest | 169 | * XXX autodeps are deprecated and should be removed at the earliest |
| 178 | * opportunity | 170 | * opportunity |
| 179 | */ | 171 | */ |
| 180 | static void _clkdm_add_autodeps(struct clockdomain *clkdm) | 172 | void _clkdm_add_autodeps(struct clockdomain *clkdm) |
| 181 | { | 173 | { |
| 182 | struct clkdm_autodep *autodep; | 174 | struct clkdm_autodep *autodep; |
| 183 | 175 | ||
| 184 | if (!autodeps) | 176 | if (!autodeps || clkdm->flags & CLKDM_NO_AUTODEPS) |
| 185 | return; | 177 | return; |
| 186 | 178 | ||
| 187 | for (autodep = autodeps; autodep->clkdm.ptr; autodep++) { | 179 | for (autodep = autodeps; autodep->clkdm.ptr; autodep++) { |
| @@ -211,11 +203,11 @@ static void _clkdm_add_autodeps(struct clockdomain *clkdm) | |||
| 211 | * XXX autodeps are deprecated and should be removed at the earliest | 203 | * XXX autodeps are deprecated and should be removed at the earliest |
| 212 | * opportunity | 204 | * opportunity |
| 213 | */ | 205 | */ |
| 214 | static void _clkdm_del_autodeps(struct clockdomain *clkdm) | 206 | void _clkdm_del_autodeps(struct clockdomain *clkdm) |
| 215 | { | 207 | { |
| 216 | struct clkdm_autodep *autodep; | 208 | struct clkdm_autodep *autodep; |
| 217 | 209 | ||
| 218 | if (!autodeps) | 210 | if (!autodeps || clkdm->flags & CLKDM_NO_AUTODEPS) |
| 219 | return; | 211 | return; |
| 220 | 212 | ||
| 221 | for (autodep = autodeps; autodep->clkdm.ptr; autodep++) { | 213 | for (autodep = autodeps; autodep->clkdm.ptr; autodep++) { |
| @@ -235,55 +227,29 @@ static void _clkdm_del_autodeps(struct clockdomain *clkdm) | |||
| 235 | } | 227 | } |
| 236 | 228 | ||
| 237 | /** | 229 | /** |
| 238 | * _enable_hwsup - place a clockdomain into hardware-supervised idle | 230 | * _resolve_clkdm_deps() - resolve clkdm_names in @clkdm_deps to clkdms |
| 239 | * @clkdm: struct clockdomain * | 231 | * @clkdm: clockdomain that we are resolving dependencies for |
| 240 | * | 232 | * @clkdm_deps: ptr to array of struct clkdm_deps to resolve |
| 241 | * Place the clockdomain into hardware-supervised idle mode. No return | ||
| 242 | * value. | ||
| 243 | * | 233 | * |
| 244 | * XXX Should this return an error if the clockdomain does not support | 234 | * Iterates through @clkdm_deps, looking up the struct clockdomain named by |
| 245 | * hardware-supervised idle mode? | 235 | * clkdm_name and storing the clockdomain pointer in the struct clkdm_dep. |
| 246 | */ | ||
| 247 | static void _enable_hwsup(struct clockdomain *clkdm) | ||
| 248 | { | ||
| 249 | if (cpu_is_omap24xx()) | ||
| 250 | omap2xxx_cm_clkdm_enable_hwsup(clkdm->pwrdm.ptr->prcm_offs, | ||
| 251 | clkdm->clktrctrl_mask); | ||
| 252 | else if (cpu_is_omap34xx()) | ||
| 253 | omap3xxx_cm_clkdm_enable_hwsup(clkdm->pwrdm.ptr->prcm_offs, | ||
| 254 | clkdm->clktrctrl_mask); | ||
| 255 | else if (cpu_is_omap44xx()) | ||
| 256 | return omap4_cminst_clkdm_enable_hwsup(clkdm->prcm_partition, | ||
| 257 | clkdm->cm_inst, | ||
| 258 | clkdm->clkdm_offs); | ||
| 259 | else | ||
| 260 | BUG(); | ||
| 261 | } | ||
| 262 | |||
| 263 | /** | ||
| 264 | * _disable_hwsup - place a clockdomain into software-supervised idle | ||
| 265 | * @clkdm: struct clockdomain * | ||
| 266 | * | ||
| 267 | * Place the clockdomain @clkdm into software-supervised idle mode. | ||
| 268 | * No return value. | 236 | * No return value. |
| 269 | * | ||
| 270 | * XXX Should this return an error if the clockdomain does not support | ||
| 271 | * software-supervised idle mode? | ||
| 272 | */ | 237 | */ |
| 273 | static void _disable_hwsup(struct clockdomain *clkdm) | 238 | static void _resolve_clkdm_deps(struct clockdomain *clkdm, |
| 239 | struct clkdm_dep *clkdm_deps) | ||
| 274 | { | 240 | { |
| 275 | if (cpu_is_omap24xx()) | 241 | struct clkdm_dep *cd; |
| 276 | omap2xxx_cm_clkdm_disable_hwsup(clkdm->pwrdm.ptr->prcm_offs, | 242 | |
| 277 | clkdm->clktrctrl_mask); | 243 | for (cd = clkdm_deps; cd && cd->clkdm_name; cd++) { |
| 278 | else if (cpu_is_omap34xx()) | 244 | if (!omap_chip_is(cd->omap_chip)) |
| 279 | omap3xxx_cm_clkdm_disable_hwsup(clkdm->pwrdm.ptr->prcm_offs, | 245 | continue; |
| 280 | clkdm->clktrctrl_mask); | 246 | if (cd->clkdm) |
| 281 | else if (cpu_is_omap44xx()) | 247 | continue; |
| 282 | return omap4_cminst_clkdm_disable_hwsup(clkdm->prcm_partition, | 248 | cd->clkdm = _clkdm_lookup(cd->clkdm_name); |
| 283 | clkdm->cm_inst, | 249 | |
| 284 | clkdm->clkdm_offs); | 250 | WARN(!cd->clkdm, "clockdomain: %s: could not find clkdm %s while resolving dependencies - should never happen", |
| 285 | else | 251 | clkdm->name, cd->clkdm_name); |
| 286 | BUG(); | 252 | } |
| 287 | } | 253 | } |
| 288 | 254 | ||
| 289 | /* Public functions */ | 255 | /* Public functions */ |
| @@ -292,6 +258,7 @@ static void _disable_hwsup(struct clockdomain *clkdm) | |||
| 292 | * clkdm_init - set up the clockdomain layer | 258 | * clkdm_init - set up the clockdomain layer |
| 293 | * @clkdms: optional pointer to an array of clockdomains to register | 259 | * @clkdms: optional pointer to an array of clockdomains to register |
| 294 | * @init_autodeps: optional pointer to an array of autodeps to register | 260 | * @init_autodeps: optional pointer to an array of autodeps to register |
| 261 | * @custom_funcs: func pointers for arch specfic implementations | ||
| 295 | * | 262 | * |
| 296 | * Set up internal state. If a pointer to an array of clockdomains | 263 | * Set up internal state. If a pointer to an array of clockdomains |
| 297 | * @clkdms was supplied, loop through the list of clockdomains, | 264 | * @clkdms was supplied, loop through the list of clockdomains, |
| @@ -300,12 +267,18 @@ static void _disable_hwsup(struct clockdomain *clkdm) | |||
| 300 | * @init_autodeps was provided, register those. No return value. | 267 | * @init_autodeps was provided, register those. No return value. |
| 301 | */ | 268 | */ |
| 302 | void clkdm_init(struct clockdomain **clkdms, | 269 | void clkdm_init(struct clockdomain **clkdms, |
| 303 | struct clkdm_autodep *init_autodeps) | 270 | struct clkdm_autodep *init_autodeps, |
| 271 | struct clkdm_ops *custom_funcs) | ||
| 304 | { | 272 | { |
| 305 | struct clockdomain **c = NULL; | 273 | struct clockdomain **c = NULL; |
| 306 | struct clockdomain *clkdm; | 274 | struct clockdomain *clkdm; |
| 307 | struct clkdm_autodep *autodep = NULL; | 275 | struct clkdm_autodep *autodep = NULL; |
| 308 | 276 | ||
| 277 | if (!custom_funcs) | ||
| 278 | WARN(1, "No custom clkdm functions registered\n"); | ||
| 279 | else | ||
| 280 | arch_clkdm = custom_funcs; | ||
| 281 | |||
| 309 | if (clkdms) | 282 | if (clkdms) |
| 310 | for (c = clkdms; *c; c++) | 283 | for (c = clkdms; *c; c++) |
| 311 | _clkdm_register(*c); | 284 | _clkdm_register(*c); |
| @@ -321,11 +294,14 @@ void clkdm_init(struct clockdomain **clkdms, | |||
| 321 | */ | 294 | */ |
| 322 | list_for_each_entry(clkdm, &clkdm_list, node) { | 295 | list_for_each_entry(clkdm, &clkdm_list, node) { |
| 323 | if (clkdm->flags & CLKDM_CAN_FORCE_WAKEUP) | 296 | if (clkdm->flags & CLKDM_CAN_FORCE_WAKEUP) |
| 324 | omap2_clkdm_wakeup(clkdm); | 297 | clkdm_wakeup(clkdm); |
| 325 | else if (clkdm->flags & CLKDM_CAN_DISABLE_AUTO) | 298 | else if (clkdm->flags & CLKDM_CAN_DISABLE_AUTO) |
| 326 | omap2_clkdm_deny_idle(clkdm); | 299 | clkdm_deny_idle(clkdm); |
| 327 | 300 | ||
| 301 | _resolve_clkdm_deps(clkdm, clkdm->wkdep_srcs); | ||
| 328 | clkdm_clear_all_wkdeps(clkdm); | 302 | clkdm_clear_all_wkdeps(clkdm); |
| 303 | |||
| 304 | _resolve_clkdm_deps(clkdm, clkdm->sleepdep_srcs); | ||
| 329 | clkdm_clear_all_sleepdeps(clkdm); | 305 | clkdm_clear_all_sleepdeps(clkdm); |
| 330 | } | 306 | } |
| 331 | } | 307 | } |
| @@ -422,32 +398,32 @@ struct powerdomain *clkdm_get_pwrdm(struct clockdomain *clkdm) | |||
| 422 | int clkdm_add_wkdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2) | 398 | int clkdm_add_wkdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2) |
| 423 | { | 399 | { |
| 424 | struct clkdm_dep *cd; | 400 | struct clkdm_dep *cd; |
| 425 | 401 | int ret = 0; | |
| 426 | if (!cpu_is_omap24xx() && !cpu_is_omap34xx()) { | ||
| 427 | pr_err("clockdomain: %s/%s: %s: not yet implemented\n", | ||
| 428 | clkdm1->name, clkdm2->name, __func__); | ||
| 429 | return -EINVAL; | ||
| 430 | } | ||
| 431 | 402 | ||
| 432 | if (!clkdm1 || !clkdm2) | 403 | if (!clkdm1 || !clkdm2) |
| 433 | return -EINVAL; | 404 | return -EINVAL; |
| 434 | 405 | ||
| 435 | cd = _clkdm_deps_lookup(clkdm2, clkdm1->wkdep_srcs); | 406 | cd = _clkdm_deps_lookup(clkdm2, clkdm1->wkdep_srcs); |
| 436 | if (IS_ERR(cd)) { | 407 | if (IS_ERR(cd)) |
| 408 | ret = PTR_ERR(cd); | ||
| 409 | |||
| 410 | if (!arch_clkdm || !arch_clkdm->clkdm_add_wkdep) | ||
| 411 | ret = -EINVAL; | ||
| 412 | |||
| 413 | if (ret) { | ||
| 437 | pr_debug("clockdomain: hardware cannot set/clear wake up of " | 414 | pr_debug("clockdomain: hardware cannot set/clear wake up of " |
| 438 | "%s when %s wakes up\n", clkdm1->name, clkdm2->name); | 415 | "%s when %s wakes up\n", clkdm1->name, clkdm2->name); |
| 439 | return PTR_ERR(cd); | 416 | return ret; |
| 440 | } | 417 | } |
| 441 | 418 | ||
| 442 | if (atomic_inc_return(&cd->wkdep_usecount) == 1) { | 419 | if (atomic_inc_return(&cd->wkdep_usecount) == 1) { |
| 443 | pr_debug("clockdomain: hardware will wake up %s when %s wakes " | 420 | pr_debug("clockdomain: hardware will wake up %s when %s wakes " |
| 444 | "up\n", clkdm1->name, clkdm2->name); | 421 | "up\n", clkdm1->name, clkdm2->name); |
| 445 | 422 | ||
| 446 | omap2_prm_set_mod_reg_bits((1 << clkdm2->dep_bit), | 423 | ret = arch_clkdm->clkdm_add_wkdep(clkdm1, clkdm2); |
| 447 | clkdm1->pwrdm.ptr->prcm_offs, PM_WKDEP); | ||
| 448 | } | 424 | } |
| 449 | 425 | ||
| 450 | return 0; | 426 | return ret; |
| 451 | } | 427 | } |
| 452 | 428 | ||
| 453 | /** | 429 | /** |
| @@ -463,32 +439,32 @@ int clkdm_add_wkdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2) | |||
| 463 | int clkdm_del_wkdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2) | 439 | int clkdm_del_wkdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2) |
| 464 | { | 440 | { |
| 465 | struct clkdm_dep *cd; | 441 | struct clkdm_dep *cd; |
| 466 | 442 | int ret = 0; | |
| 467 | if (!cpu_is_omap24xx() && !cpu_is_omap34xx()) { | ||
| 468 | pr_err("clockdomain: %s/%s: %s: not yet implemented\n", | ||
| 469 | clkdm1->name, clkdm2->name, __func__); | ||
| 470 | return -EINVAL; | ||
| 471 | } | ||
| 472 | 443 | ||
| 473 | if (!clkdm1 || !clkdm2) | 444 | if (!clkdm1 || !clkdm2) |
| 474 | return -EINVAL; | 445 | return -EINVAL; |
| 475 | 446 | ||
| 476 | cd = _clkdm_deps_lookup(clkdm2, clkdm1->wkdep_srcs); | 447 | cd = _clkdm_deps_lookup(clkdm2, clkdm1->wkdep_srcs); |
| 477 | if (IS_ERR(cd)) { | 448 | if (IS_ERR(cd)) |
| 449 | ret = PTR_ERR(cd); | ||
| 450 | |||
| 451 | if (!arch_clkdm || !arch_clkdm->clkdm_del_wkdep) | ||
| 452 | ret = -EINVAL; | ||
| 453 | |||
| 454 | if (ret) { | ||
| 478 | pr_debug("clockdomain: hardware cannot set/clear wake up of " | 455 | pr_debug("clockdomain: hardware cannot set/clear wake up of " |
| 479 | "%s when %s wakes up\n", clkdm1->name, clkdm2->name); | 456 | "%s when %s wakes up\n", clkdm1->name, clkdm2->name); |
| 480 | return PTR_ERR(cd); | 457 | return ret; |
| 481 | } | 458 | } |
| 482 | 459 | ||
| 483 | if (atomic_dec_return(&cd->wkdep_usecount) == 0) { | 460 | if (atomic_dec_return(&cd->wkdep_usecount) == 0) { |
| 484 | pr_debug("clockdomain: hardware will no longer wake up %s " | 461 | pr_debug("clockdomain: hardware will no longer wake up %s " |
| 485 | "after %s wakes up\n", clkdm1->name, clkdm2->name); | 462 | "after %s wakes up\n", clkdm1->name, clkdm2->name); |
| 486 | 463 | ||
| 487 | omap2_prm_clear_mod_reg_bits((1 << clkdm2->dep_bit), | 464 | ret = arch_clkdm->clkdm_del_wkdep(clkdm1, clkdm2); |
| 488 | clkdm1->pwrdm.ptr->prcm_offs, PM_WKDEP); | ||
| 489 | } | 465 | } |
| 490 | 466 | ||
| 491 | return 0; | 467 | return ret; |
| 492 | } | 468 | } |
| 493 | 469 | ||
| 494 | /** | 470 | /** |
| @@ -508,26 +484,26 @@ int clkdm_del_wkdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2) | |||
| 508 | int clkdm_read_wkdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2) | 484 | int clkdm_read_wkdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2) |
| 509 | { | 485 | { |
| 510 | struct clkdm_dep *cd; | 486 | struct clkdm_dep *cd; |
| 487 | int ret = 0; | ||
| 511 | 488 | ||
| 512 | if (!clkdm1 || !clkdm2) | 489 | if (!clkdm1 || !clkdm2) |
| 513 | return -EINVAL; | 490 | return -EINVAL; |
| 514 | 491 | ||
| 515 | if (!cpu_is_omap24xx() && !cpu_is_omap34xx()) { | ||
| 516 | pr_err("clockdomain: %s/%s: %s: not yet implemented\n", | ||
| 517 | clkdm1->name, clkdm2->name, __func__); | ||
| 518 | return -EINVAL; | ||
| 519 | } | ||
| 520 | |||
| 521 | cd = _clkdm_deps_lookup(clkdm2, clkdm1->wkdep_srcs); | 492 | cd = _clkdm_deps_lookup(clkdm2, clkdm1->wkdep_srcs); |
| 522 | if (IS_ERR(cd)) { | 493 | if (IS_ERR(cd)) |
| 494 | ret = PTR_ERR(cd); | ||
| 495 | |||
| 496 | if (!arch_clkdm || !arch_clkdm->clkdm_read_wkdep) | ||
| 497 | ret = -EINVAL; | ||
| 498 | |||
| 499 | if (ret) { | ||
| 523 | pr_debug("clockdomain: hardware cannot set/clear wake up of " | 500 | pr_debug("clockdomain: hardware cannot set/clear wake up of " |
| 524 | "%s when %s wakes up\n", clkdm1->name, clkdm2->name); | 501 | "%s when %s wakes up\n", clkdm1->name, clkdm2->name); |
| 525 | return PTR_ERR(cd); | 502 | return ret; |
| 526 | } | 503 | } |
| 527 | 504 | ||
| 528 | /* XXX It's faster to return the atomic wkdep_usecount */ | 505 | /* XXX It's faster to return the atomic wkdep_usecount */ |
| 529 | return omap2_prm_read_mod_bits_shift(clkdm1->pwrdm.ptr->prcm_offs, PM_WKDEP, | 506 | return arch_clkdm->clkdm_read_wkdep(clkdm1, clkdm2); |
| 530 | (1 << clkdm2->dep_bit)); | ||
| 531 | } | 507 | } |
| 532 | 508 | ||
| 533 | /** | 509 | /** |
| @@ -542,33 +518,13 @@ int clkdm_read_wkdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2) | |||
| 542 | */ | 518 | */ |
| 543 | int clkdm_clear_all_wkdeps(struct clockdomain *clkdm) | 519 | int clkdm_clear_all_wkdeps(struct clockdomain *clkdm) |
| 544 | { | 520 | { |
| 545 | struct clkdm_dep *cd; | ||
| 546 | u32 mask = 0; | ||
| 547 | |||
| 548 | if (!cpu_is_omap24xx() && !cpu_is_omap34xx()) { | ||
| 549 | pr_err("clockdomain: %s: %s: not yet implemented\n", | ||
| 550 | clkdm->name, __func__); | ||
| 551 | return -EINVAL; | ||
| 552 | } | ||
| 553 | |||
| 554 | if (!clkdm) | 521 | if (!clkdm) |
| 555 | return -EINVAL; | 522 | return -EINVAL; |
| 556 | 523 | ||
| 557 | for (cd = clkdm->wkdep_srcs; cd && cd->clkdm_name; cd++) { | 524 | if (!arch_clkdm || !arch_clkdm->clkdm_clear_all_wkdeps) |
| 558 | if (!omap_chip_is(cd->omap_chip)) | 525 | return -EINVAL; |
| 559 | continue; | ||
| 560 | |||
| 561 | if (!cd->clkdm && cd->clkdm_name) | ||
| 562 | cd->clkdm = _clkdm_lookup(cd->clkdm_name); | ||
| 563 | |||
| 564 | /* PRM accesses are slow, so minimize them */ | ||
| 565 | mask |= 1 << cd->clkdm->dep_bit; | ||
| 566 | atomic_set(&cd->wkdep_usecount, 0); | ||
| 567 | } | ||
| 568 | |||
| 569 | omap2_prm_clear_mod_reg_bits(mask, clkdm->pwrdm.ptr->prcm_offs, PM_WKDEP); | ||
| 570 | 526 | ||
| 571 | return 0; | 527 | return arch_clkdm->clkdm_clear_all_wkdeps(clkdm); |
| 572 | } | 528 | } |
| 573 | 529 | ||
| 574 | /** | 530 | /** |
| @@ -586,31 +542,33 @@ int clkdm_clear_all_wkdeps(struct clockdomain *clkdm) | |||
| 586 | int clkdm_add_sleepdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2) | 542 | int clkdm_add_sleepdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2) |
| 587 | { | 543 | { |
| 588 | struct clkdm_dep *cd; | 544 | struct clkdm_dep *cd; |
| 589 | 545 | int ret = 0; | |
| 590 | if (!cpu_is_omap34xx()) | ||
| 591 | return -EINVAL; | ||
| 592 | 546 | ||
| 593 | if (!clkdm1 || !clkdm2) | 547 | if (!clkdm1 || !clkdm2) |
| 594 | return -EINVAL; | 548 | return -EINVAL; |
| 595 | 549 | ||
| 596 | cd = _clkdm_deps_lookup(clkdm2, clkdm1->sleepdep_srcs); | 550 | cd = _clkdm_deps_lookup(clkdm2, clkdm1->sleepdep_srcs); |
| 597 | if (IS_ERR(cd)) { | 551 | if (IS_ERR(cd)) |
| 552 | ret = PTR_ERR(cd); | ||
| 553 | |||
| 554 | if (!arch_clkdm || !arch_clkdm->clkdm_add_sleepdep) | ||
| 555 | ret = -EINVAL; | ||
| 556 | |||
| 557 | if (ret) { | ||
| 598 | pr_debug("clockdomain: hardware cannot set/clear sleep " | 558 | pr_debug("clockdomain: hardware cannot set/clear sleep " |
| 599 | "dependency affecting %s from %s\n", clkdm1->name, | 559 | "dependency affecting %s from %s\n", clkdm1->name, |
| 600 | clkdm2->name); | 560 | clkdm2->name); |
| 601 | return PTR_ERR(cd); | 561 | return ret; |
| 602 | } | 562 | } |
| 603 | 563 | ||
| 604 | if (atomic_inc_return(&cd->sleepdep_usecount) == 1) { | 564 | if (atomic_inc_return(&cd->sleepdep_usecount) == 1) { |
| 605 | pr_debug("clockdomain: will prevent %s from sleeping if %s " | 565 | pr_debug("clockdomain: will prevent %s from sleeping if %s " |
| 606 | "is active\n", clkdm1->name, clkdm2->name); | 566 | "is active\n", clkdm1->name, clkdm2->name); |
| 607 | 567 | ||
| 608 | omap2_cm_set_mod_reg_bits((1 << clkdm2->dep_bit), | 568 | ret = arch_clkdm->clkdm_add_sleepdep(clkdm1, clkdm2); |
| 609 | clkdm1->pwrdm.ptr->prcm_offs, | ||
| 610 | OMAP3430_CM_SLEEPDEP); | ||
| 611 | } | 569 | } |
| 612 | 570 | ||
| 613 | return 0; | 571 | return ret; |
| 614 | } | 572 | } |
| 615 | 573 | ||
| 616 | /** | 574 | /** |
| @@ -628,19 +586,23 @@ int clkdm_add_sleepdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2) | |||
| 628 | int clkdm_del_sleepdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2) | 586 | int clkdm_del_sleepdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2) |
| 629 | { | 587 | { |
| 630 | struct clkdm_dep *cd; | 588 | struct clkdm_dep *cd; |
| 631 | 589 | int ret = 0; | |
| 632 | if (!cpu_is_omap34xx()) | ||
| 633 | return -EINVAL; | ||
| 634 | 590 | ||
| 635 | if (!clkdm1 || !clkdm2) | 591 | if (!clkdm1 || !clkdm2) |
| 636 | return -EINVAL; | 592 | return -EINVAL; |
| 637 | 593 | ||
| 638 | cd = _clkdm_deps_lookup(clkdm2, clkdm1->sleepdep_srcs); | 594 | cd = _clkdm_deps_lookup(clkdm2, clkdm1->sleepdep_srcs); |
| 639 | if (IS_ERR(cd)) { | 595 | if (IS_ERR(cd)) |
| 596 | ret = PTR_ERR(cd); | ||
| 597 | |||
| 598 | if (!arch_clkdm || !arch_clkdm->clkdm_del_sleepdep) | ||
| 599 | ret = -EINVAL; | ||
| 600 | |||
| 601 | if (ret) { | ||
| 640 | pr_debug("clockdomain: hardware cannot set/clear sleep " | 602 | pr_debug("clockdomain: hardware cannot set/clear sleep " |
| 641 | "dependency affecting %s from %s\n", clkdm1->name, | 603 | "dependency affecting %s from %s\n", clkdm1->name, |
| 642 | clkdm2->name); | 604 | clkdm2->name); |
| 643 | return PTR_ERR(cd); | 605 | return ret; |
| 644 | } | 606 | } |
| 645 | 607 | ||
| 646 | if (atomic_dec_return(&cd->sleepdep_usecount) == 0) { | 608 | if (atomic_dec_return(&cd->sleepdep_usecount) == 0) { |
| @@ -648,12 +610,10 @@ int clkdm_del_sleepdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2) | |||
| 648 | "sleeping if %s is active\n", clkdm1->name, | 610 | "sleeping if %s is active\n", clkdm1->name, |
| 649 | clkdm2->name); | 611 | clkdm2->name); |
| 650 | 612 | ||
| 651 | omap2_cm_clear_mod_reg_bits((1 << clkdm2->dep_bit), | 613 | ret = arch_clkdm->clkdm_del_sleepdep(clkdm1, clkdm2); |
| 652 | clkdm1->pwrdm.ptr->prcm_offs, | ||
| 653 | OMAP3430_CM_SLEEPDEP); | ||
| 654 | } | 614 | } |
| 655 | 615 | ||
| 656 | return 0; | 616 | return ret; |
| 657 | } | 617 | } |
| 658 | 618 | ||
| 659 | /** | 619 | /** |
| @@ -675,25 +635,27 @@ int clkdm_del_sleepdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2) | |||
| 675 | int clkdm_read_sleepdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2) | 635 | int clkdm_read_sleepdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2) |
| 676 | { | 636 | { |
| 677 | struct clkdm_dep *cd; | 637 | struct clkdm_dep *cd; |
| 678 | 638 | int ret = 0; | |
| 679 | if (!cpu_is_omap34xx()) | ||
| 680 | return -EINVAL; | ||
| 681 | 639 | ||
| 682 | if (!clkdm1 || !clkdm2) | 640 | if (!clkdm1 || !clkdm2) |
| 683 | return -EINVAL; | 641 | return -EINVAL; |
| 684 | 642 | ||
| 685 | cd = _clkdm_deps_lookup(clkdm2, clkdm1->sleepdep_srcs); | 643 | cd = _clkdm_deps_lookup(clkdm2, clkdm1->sleepdep_srcs); |
| 686 | if (IS_ERR(cd)) { | 644 | if (IS_ERR(cd)) |
| 645 | ret = PTR_ERR(cd); | ||
| 646 | |||
| 647 | if (!arch_clkdm || !arch_clkdm->clkdm_read_sleepdep) | ||
| 648 | ret = -EINVAL; | ||
| 649 | |||
| 650 | if (ret) { | ||
| 687 | pr_debug("clockdomain: hardware cannot set/clear sleep " | 651 | pr_debug("clockdomain: hardware cannot set/clear sleep " |
| 688 | "dependency affecting %s from %s\n", clkdm1->name, | 652 | "dependency affecting %s from %s\n", clkdm1->name, |
| 689 | clkdm2->name); | 653 | clkdm2->name); |
| 690 | return PTR_ERR(cd); | 654 | return ret; |
| 691 | } | 655 | } |
| 692 | 656 | ||
| 693 | /* XXX It's faster to return the atomic sleepdep_usecount */ | 657 | /* XXX It's faster to return the atomic sleepdep_usecount */ |
| 694 | return omap2_prm_read_mod_bits_shift(clkdm1->pwrdm.ptr->prcm_offs, | 658 | return arch_clkdm->clkdm_read_sleepdep(clkdm1, clkdm2); |
| 695 | OMAP3430_CM_SLEEPDEP, | ||
| 696 | (1 << clkdm2->dep_bit)); | ||
| 697 | } | 659 | } |
| 698 | 660 | ||
| 699 | /** | 661 | /** |
| @@ -708,35 +670,17 @@ int clkdm_read_sleepdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2) | |||
| 708 | */ | 670 | */ |
| 709 | int clkdm_clear_all_sleepdeps(struct clockdomain *clkdm) | 671 | int clkdm_clear_all_sleepdeps(struct clockdomain *clkdm) |
| 710 | { | 672 | { |
| 711 | struct clkdm_dep *cd; | ||
| 712 | u32 mask = 0; | ||
| 713 | |||
| 714 | if (!cpu_is_omap34xx()) | ||
| 715 | return -EINVAL; | ||
| 716 | |||
| 717 | if (!clkdm) | 673 | if (!clkdm) |
| 718 | return -EINVAL; | 674 | return -EINVAL; |
| 719 | 675 | ||
| 720 | for (cd = clkdm->sleepdep_srcs; cd && cd->clkdm_name; cd++) { | 676 | if (!arch_clkdm || !arch_clkdm->clkdm_clear_all_sleepdeps) |
| 721 | if (!omap_chip_is(cd->omap_chip)) | 677 | return -EINVAL; |
| 722 | continue; | ||
| 723 | |||
| 724 | if (!cd->clkdm && cd->clkdm_name) | ||
| 725 | cd->clkdm = _clkdm_lookup(cd->clkdm_name); | ||
| 726 | |||
| 727 | /* PRM accesses are slow, so minimize them */ | ||
| 728 | mask |= 1 << cd->clkdm->dep_bit; | ||
| 729 | atomic_set(&cd->sleepdep_usecount, 0); | ||
| 730 | } | ||
| 731 | |||
| 732 | omap2_prm_clear_mod_reg_bits(mask, clkdm->pwrdm.ptr->prcm_offs, | ||
| 733 | OMAP3430_CM_SLEEPDEP); | ||
| 734 | 678 | ||
| 735 | return 0; | 679 | return arch_clkdm->clkdm_clear_all_sleepdeps(clkdm); |
| 736 | } | 680 | } |
| 737 | 681 | ||
| 738 | /** | 682 | /** |
| 739 | * omap2_clkdm_sleep - force clockdomain sleep transition | 683 | * clkdm_sleep - force clockdomain sleep transition |
| 740 | * @clkdm: struct clockdomain * | 684 | * @clkdm: struct clockdomain * |
| 741 | * | 685 | * |
| 742 | * Instruct the CM to force a sleep transition on the specified | 686 | * Instruct the CM to force a sleep transition on the specified |
| @@ -744,7 +688,7 @@ int clkdm_clear_all_sleepdeps(struct clockdomain *clkdm) | |||
| 744 | * clockdomain does not support software-initiated sleep; 0 upon | 688 | * clockdomain does not support software-initiated sleep; 0 upon |
| 745 | * success. | 689 | * success. |
| 746 | */ | 690 | */ |
| 747 | int omap2_clkdm_sleep(struct clockdomain *clkdm) | 691 | int clkdm_sleep(struct clockdomain *clkdm) |
| 748 | { | 692 | { |
| 749 | if (!clkdm) | 693 | if (!clkdm) |
| 750 | return -EINVAL; | 694 | return -EINVAL; |
| @@ -755,33 +699,16 @@ int omap2_clkdm_sleep(struct clockdomain *clkdm) | |||
| 755 | return -EINVAL; | 699 | return -EINVAL; |
| 756 | } | 700 | } |
| 757 | 701 | ||
| 758 | pr_debug("clockdomain: forcing sleep on %s\n", clkdm->name); | 702 | if (!arch_clkdm || !arch_clkdm->clkdm_sleep) |
| 759 | 703 | return -EINVAL; | |
| 760 | if (cpu_is_omap24xx()) { | ||
| 761 | |||
| 762 | omap2_cm_set_mod_reg_bits(OMAP24XX_FORCESTATE_MASK, | ||
| 763 | clkdm->pwrdm.ptr->prcm_offs, OMAP2_PM_PWSTCTRL); | ||
| 764 | |||
| 765 | } else if (cpu_is_omap34xx()) { | ||
| 766 | |||
| 767 | omap3xxx_cm_clkdm_force_sleep(clkdm->pwrdm.ptr->prcm_offs, | ||
| 768 | clkdm->clktrctrl_mask); | ||
| 769 | |||
| 770 | } else if (cpu_is_omap44xx()) { | ||
| 771 | |||
| 772 | omap4_cminst_clkdm_force_sleep(clkdm->prcm_partition, | ||
| 773 | clkdm->cm_inst, | ||
| 774 | clkdm->clkdm_offs); | ||
| 775 | 704 | ||
| 776 | } else { | 705 | pr_debug("clockdomain: forcing sleep on %s\n", clkdm->name); |
| 777 | BUG(); | ||
| 778 | }; | ||
| 779 | 706 | ||
| 780 | return 0; | 707 | return arch_clkdm->clkdm_sleep(clkdm); |
| 781 | } | 708 | } |
| 782 | 709 | ||
| 783 | /** | 710 | /** |
| 784 | * omap2_clkdm_wakeup - force clockdomain wakeup transition | 711 | * clkdm_wakeup - force clockdomain wakeup transition |
| 785 | * @clkdm: struct clockdomain * | 712 | * @clkdm: struct clockdomain * |
| 786 | * | 713 | * |
| 787 | * Instruct the CM to force a wakeup transition on the specified | 714 | * Instruct the CM to force a wakeup transition on the specified |
| @@ -789,7 +716,7 @@ int omap2_clkdm_sleep(struct clockdomain *clkdm) | |||
| 789 | * clockdomain does not support software-controlled wakeup; 0 upon | 716 | * clockdomain does not support software-controlled wakeup; 0 upon |
| 790 | * success. | 717 | * success. |
| 791 | */ | 718 | */ |
| 792 | int omap2_clkdm_wakeup(struct clockdomain *clkdm) | 719 | int clkdm_wakeup(struct clockdomain *clkdm) |
| 793 | { | 720 | { |
| 794 | if (!clkdm) | 721 | if (!clkdm) |
| 795 | return -EINVAL; | 722 | return -EINVAL; |
| @@ -800,33 +727,16 @@ int omap2_clkdm_wakeup(struct clockdomain *clkdm) | |||
| 800 | return -EINVAL; | 727 | return -EINVAL; |
| 801 | } | 728 | } |
| 802 | 729 | ||
| 803 | pr_debug("clockdomain: forcing wakeup on %s\n", clkdm->name); | 730 | if (!arch_clkdm || !arch_clkdm->clkdm_wakeup) |
| 804 | 731 | return -EINVAL; | |
| 805 | if (cpu_is_omap24xx()) { | ||
| 806 | |||
| 807 | omap2_cm_clear_mod_reg_bits(OMAP24XX_FORCESTATE_MASK, | ||
| 808 | clkdm->pwrdm.ptr->prcm_offs, OMAP2_PM_PWSTCTRL); | ||
| 809 | |||
| 810 | } else if (cpu_is_omap34xx()) { | ||
| 811 | |||
| 812 | omap3xxx_cm_clkdm_force_wakeup(clkdm->pwrdm.ptr->prcm_offs, | ||
| 813 | clkdm->clktrctrl_mask); | ||
| 814 | |||
| 815 | } else if (cpu_is_omap44xx()) { | ||
| 816 | |||
| 817 | omap4_cminst_clkdm_force_wakeup(clkdm->prcm_partition, | ||
| 818 | clkdm->cm_inst, | ||
| 819 | clkdm->clkdm_offs); | ||
| 820 | 732 | ||
| 821 | } else { | 733 | pr_debug("clockdomain: forcing wakeup on %s\n", clkdm->name); |
| 822 | BUG(); | ||
| 823 | }; | ||
| 824 | 734 | ||
| 825 | return 0; | 735 | return arch_clkdm->clkdm_wakeup(clkdm); |
| 826 | } | 736 | } |
| 827 | 737 | ||
| 828 | /** | 738 | /** |
| 829 | * omap2_clkdm_allow_idle - enable hwsup idle transitions for clkdm | 739 | * clkdm_allow_idle - enable hwsup idle transitions for clkdm |
| 830 | * @clkdm: struct clockdomain * | 740 | * @clkdm: struct clockdomain * |
| 831 | * | 741 | * |
| 832 | * Allow the hardware to automatically switch the clockdomain @clkdm into | 742 | * Allow the hardware to automatically switch the clockdomain @clkdm into |
| @@ -835,7 +745,7 @@ int omap2_clkdm_wakeup(struct clockdomain *clkdm) | |||
| 835 | * framework, wkdep/sleepdep autodependencies are added; this is so | 745 | * framework, wkdep/sleepdep autodependencies are added; this is so |
| 836 | * device drivers can read and write to the device. No return value. | 746 | * device drivers can read and write to the device. No return value. |
| 837 | */ | 747 | */ |
| 838 | void omap2_clkdm_allow_idle(struct clockdomain *clkdm) | 748 | void clkdm_allow_idle(struct clockdomain *clkdm) |
| 839 | { | 749 | { |
| 840 | if (!clkdm) | 750 | if (!clkdm) |
| 841 | return; | 751 | return; |
| @@ -846,27 +756,18 @@ void omap2_clkdm_allow_idle(struct clockdomain *clkdm) | |||
| 846 | return; | 756 | return; |
| 847 | } | 757 | } |
| 848 | 758 | ||
| 759 | if (!arch_clkdm || !arch_clkdm->clkdm_allow_idle) | ||
| 760 | return; | ||
| 761 | |||
| 849 | pr_debug("clockdomain: enabling automatic idle transitions for %s\n", | 762 | pr_debug("clockdomain: enabling automatic idle transitions for %s\n", |
| 850 | clkdm->name); | 763 | clkdm->name); |
| 851 | 764 | ||
| 852 | /* | 765 | arch_clkdm->clkdm_allow_idle(clkdm); |
| 853 | * XXX This should be removed once TI adds wakeup/sleep | ||
| 854 | * dependency code and data for OMAP4. | ||
| 855 | */ | ||
| 856 | if (cpu_is_omap44xx()) { | ||
| 857 | pr_err("clockdomain: %s: OMAP4 wakeup/sleep dependency support: not yet implemented\n", clkdm->name); | ||
| 858 | } else { | ||
| 859 | if (atomic_read(&clkdm->usecount) > 0) | ||
| 860 | _clkdm_add_autodeps(clkdm); | ||
| 861 | } | ||
| 862 | |||
| 863 | _enable_hwsup(clkdm); | ||
| 864 | |||
| 865 | pwrdm_clkdm_state_switch(clkdm); | 766 | pwrdm_clkdm_state_switch(clkdm); |
| 866 | } | 767 | } |
| 867 | 768 | ||
| 868 | /** | 769 | /** |
| 869 | * omap2_clkdm_deny_idle - disable hwsup idle transitions for clkdm | 770 | * clkdm_deny_idle - disable hwsup idle transitions for clkdm |
| 870 | * @clkdm: struct clockdomain * | 771 | * @clkdm: struct clockdomain * |
| 871 | * | 772 | * |
| 872 | * Prevent the hardware from automatically switching the clockdomain | 773 | * Prevent the hardware from automatically switching the clockdomain |
| @@ -874,7 +775,7 @@ void omap2_clkdm_allow_idle(struct clockdomain *clkdm) | |||
| 874 | * downstream clocks enabled in the clock framework, wkdep/sleepdep | 775 | * downstream clocks enabled in the clock framework, wkdep/sleepdep |
| 875 | * autodependencies are removed. No return value. | 776 | * autodependencies are removed. No return value. |
| 876 | */ | 777 | */ |
| 877 | void omap2_clkdm_deny_idle(struct clockdomain *clkdm) | 778 | void clkdm_deny_idle(struct clockdomain *clkdm) |
| 878 | { | 779 | { |
| 879 | if (!clkdm) | 780 | if (!clkdm) |
| 880 | return; | 781 | return; |
| @@ -885,28 +786,20 @@ void omap2_clkdm_deny_idle(struct clockdomain *clkdm) | |||
| 885 | return; | 786 | return; |
| 886 | } | 787 | } |
| 887 | 788 | ||
| 789 | if (!arch_clkdm || !arch_clkdm->clkdm_deny_idle) | ||
| 790 | return; | ||
| 791 | |||
| 888 | pr_debug("clockdomain: disabling automatic idle transitions for %s\n", | 792 | pr_debug("clockdomain: disabling automatic idle transitions for %s\n", |
| 889 | clkdm->name); | 793 | clkdm->name); |
| 890 | 794 | ||
| 891 | _disable_hwsup(clkdm); | 795 | arch_clkdm->clkdm_deny_idle(clkdm); |
| 892 | |||
| 893 | /* | ||
| 894 | * XXX This should be removed once TI adds wakeup/sleep | ||
| 895 | * dependency code and data for OMAP4. | ||
| 896 | */ | ||
| 897 | if (cpu_is_omap44xx()) { | ||
| 898 | pr_err("clockdomain: %s: OMAP4 wakeup/sleep dependency support: not yet implemented\n", clkdm->name); | ||
| 899 | } else { | ||
| 900 | if (atomic_read(&clkdm->usecount) > 0) | ||
| 901 | _clkdm_del_autodeps(clkdm); | ||
| 902 | } | ||
| 903 | } | 796 | } |
| 904 | 797 | ||
| 905 | 798 | ||
| 906 | /* Clockdomain-to-clock framework interface code */ | 799 | /* Clockdomain-to-clock framework interface code */ |
| 907 | 800 | ||
| 908 | /** | 801 | /** |
| 909 | * omap2_clkdm_clk_enable - add an enabled downstream clock to this clkdm | 802 | * clkdm_clk_enable - add an enabled downstream clock to this clkdm |
| 910 | * @clkdm: struct clockdomain * | 803 | * @clkdm: struct clockdomain * |
| 911 | * @clk: struct clk * of the enabled downstream clock | 804 | * @clk: struct clk * of the enabled downstream clock |
| 912 | * | 805 | * |
| @@ -919,10 +812,8 @@ void omap2_clkdm_deny_idle(struct clockdomain *clkdm) | |||
| 919 | * by on-chip processors. Returns -EINVAL if passed null pointers; | 812 | * by on-chip processors. Returns -EINVAL if passed null pointers; |
| 920 | * returns 0 upon success or if the clockdomain is in hwsup idle mode. | 813 | * returns 0 upon success or if the clockdomain is in hwsup idle mode. |
| 921 | */ | 814 | */ |
| 922 | int omap2_clkdm_clk_enable(struct clockdomain *clkdm, struct clk *clk) | 815 | int clkdm_clk_enable(struct clockdomain *clkdm, struct clk *clk) |
| 923 | { | 816 | { |
| 924 | bool hwsup = false; | ||
| 925 | |||
| 926 | /* | 817 | /* |
| 927 | * XXX Rewrite this code to maintain a list of enabled | 818 | * XXX Rewrite this code to maintain a list of enabled |
| 928 | * downstream clocks for debugging purposes? | 819 | * downstream clocks for debugging purposes? |
| @@ -931,6 +822,9 @@ int omap2_clkdm_clk_enable(struct clockdomain *clkdm, struct clk *clk) | |||
| 931 | if (!clkdm || !clk) | 822 | if (!clkdm || !clk) |
| 932 | return -EINVAL; | 823 | return -EINVAL; |
| 933 | 824 | ||
| 825 | if (!arch_clkdm || !arch_clkdm->clkdm_clk_enable) | ||
| 826 | return -EINVAL; | ||
| 827 | |||
| 934 | if (atomic_inc_return(&clkdm->usecount) > 1) | 828 | if (atomic_inc_return(&clkdm->usecount) > 1) |
| 935 | return 0; | 829 | return 0; |
| 936 | 830 | ||
| @@ -939,31 +833,7 @@ int omap2_clkdm_clk_enable(struct clockdomain *clkdm, struct clk *clk) | |||
| 939 | pr_debug("clockdomain: clkdm %s: clk %s now enabled\n", clkdm->name, | 833 | pr_debug("clockdomain: clkdm %s: clk %s now enabled\n", clkdm->name, |
| 940 | clk->name); | 834 | clk->name); |
| 941 | 835 | ||
| 942 | if (cpu_is_omap24xx() || cpu_is_omap34xx()) { | 836 | arch_clkdm->clkdm_clk_enable(clkdm); |
| 943 | |||
| 944 | if (!clkdm->clktrctrl_mask) | ||
| 945 | return 0; | ||
| 946 | |||
| 947 | hwsup = omap2_cm_is_clkdm_in_hwsup(clkdm->pwrdm.ptr->prcm_offs, | ||
| 948 | clkdm->clktrctrl_mask); | ||
| 949 | |||
| 950 | } else if (cpu_is_omap44xx()) { | ||
| 951 | |||
| 952 | hwsup = omap4_cminst_is_clkdm_in_hwsup(clkdm->prcm_partition, | ||
| 953 | clkdm->cm_inst, | ||
| 954 | clkdm->clkdm_offs); | ||
| 955 | |||
| 956 | } | ||
| 957 | |||
| 958 | if (hwsup) { | ||
| 959 | /* Disable HW transitions when we are changing deps */ | ||
| 960 | _disable_hwsup(clkdm); | ||
| 961 | _clkdm_add_autodeps(clkdm); | ||
| 962 | _enable_hwsup(clkdm); | ||
| 963 | } else { | ||
| 964 | omap2_clkdm_wakeup(clkdm); | ||
| 965 | } | ||
| 966 | |||
| 967 | pwrdm_wait_transition(clkdm->pwrdm.ptr); | 837 | pwrdm_wait_transition(clkdm->pwrdm.ptr); |
| 968 | pwrdm_clkdm_state_switch(clkdm); | 838 | pwrdm_clkdm_state_switch(clkdm); |
| 969 | 839 | ||
| @@ -971,7 +841,7 @@ int omap2_clkdm_clk_enable(struct clockdomain *clkdm, struct clk *clk) | |||
| 971 | } | 841 | } |
| 972 | 842 | ||
| 973 | /** | 843 | /** |
| 974 | * omap2_clkdm_clk_disable - remove an enabled downstream clock from this clkdm | 844 | * clkdm_clk_disable - remove an enabled downstream clock from this clkdm |
| 975 | * @clkdm: struct clockdomain * | 845 | * @clkdm: struct clockdomain * |
| 976 | * @clk: struct clk * of the disabled downstream clock | 846 | * @clk: struct clk * of the disabled downstream clock |
| 977 | * | 847 | * |
| @@ -984,10 +854,8 @@ int omap2_clkdm_clk_enable(struct clockdomain *clkdm, struct clk *clk) | |||
| 984 | * is enabled; or returns 0 upon success or if the clockdomain is in | 854 | * is enabled; or returns 0 upon success or if the clockdomain is in |
| 985 | * hwsup idle mode. | 855 | * hwsup idle mode. |
| 986 | */ | 856 | */ |
| 987 | int omap2_clkdm_clk_disable(struct clockdomain *clkdm, struct clk *clk) | 857 | int clkdm_clk_disable(struct clockdomain *clkdm, struct clk *clk) |
| 988 | { | 858 | { |
| 989 | bool hwsup = false; | ||
| 990 | |||
| 991 | /* | 859 | /* |
| 992 | * XXX Rewrite this code to maintain a list of enabled | 860 | * XXX Rewrite this code to maintain a list of enabled |
| 993 | * downstream clocks for debugging purposes? | 861 | * downstream clocks for debugging purposes? |
| @@ -996,6 +864,9 @@ int omap2_clkdm_clk_disable(struct clockdomain *clkdm, struct clk *clk) | |||
| 996 | if (!clkdm || !clk) | 864 | if (!clkdm || !clk) |
| 997 | return -EINVAL; | 865 | return -EINVAL; |
| 998 | 866 | ||
| 867 | if (!arch_clkdm || !arch_clkdm->clkdm_clk_disable) | ||
| 868 | return -EINVAL; | ||
| 869 | |||
| 999 | #ifdef DEBUG | 870 | #ifdef DEBUG |
| 1000 | if (atomic_read(&clkdm->usecount) == 0) { | 871 | if (atomic_read(&clkdm->usecount) == 0) { |
| 1001 | WARN_ON(1); /* underflow */ | 872 | WARN_ON(1); /* underflow */ |
| @@ -1011,31 +882,7 @@ int omap2_clkdm_clk_disable(struct clockdomain *clkdm, struct clk *clk) | |||
| 1011 | pr_debug("clockdomain: clkdm %s: clk %s now disabled\n", clkdm->name, | 882 | pr_debug("clockdomain: clkdm %s: clk %s now disabled\n", clkdm->name, |
| 1012 | clk->name); | 883 | clk->name); |
| 1013 | 884 | ||
| 1014 | if (cpu_is_omap24xx() || cpu_is_omap34xx()) { | 885 | arch_clkdm->clkdm_clk_disable(clkdm); |
| 1015 | |||
| 1016 | if (!clkdm->clktrctrl_mask) | ||
| 1017 | return 0; | ||
| 1018 | |||
| 1019 | hwsup = omap2_cm_is_clkdm_in_hwsup(clkdm->pwrdm.ptr->prcm_offs, | ||
| 1020 | clkdm->clktrctrl_mask); | ||
| 1021 | |||
| 1022 | } else if (cpu_is_omap44xx()) { | ||
| 1023 | |||
| 1024 | hwsup = omap4_cminst_is_clkdm_in_hwsup(clkdm->prcm_partition, | ||
| 1025 | clkdm->cm_inst, | ||
| 1026 | clkdm->clkdm_offs); | ||
| 1027 | |||
| 1028 | } | ||
| 1029 | |||
| 1030 | if (hwsup) { | ||
| 1031 | /* Disable HW transitions when we are changing deps */ | ||
| 1032 | _disable_hwsup(clkdm); | ||
| 1033 | _clkdm_del_autodeps(clkdm); | ||
| 1034 | _enable_hwsup(clkdm); | ||
| 1035 | } else { | ||
| 1036 | omap2_clkdm_sleep(clkdm); | ||
| 1037 | } | ||
| 1038 | |||
| 1039 | pwrdm_clkdm_state_switch(clkdm); | 886 | pwrdm_clkdm_state_switch(clkdm); |
| 1040 | 887 | ||
| 1041 | return 0; | 888 | return 0; |
diff --git a/arch/arm/mach-omap2/clockdomain.h b/arch/arm/mach-omap2/clockdomain.h index 9b459c26fb8..85b3dce6564 100644 --- a/arch/arm/mach-omap2/clockdomain.h +++ b/arch/arm/mach-omap2/clockdomain.h | |||
| @@ -4,7 +4,7 @@ | |||
| 4 | * OMAP2/3 clockdomain framework functions | 4 | * OMAP2/3 clockdomain framework functions |
| 5 | * | 5 | * |
| 6 | * Copyright (C) 2008 Texas Instruments, Inc. | 6 | * Copyright (C) 2008 Texas Instruments, Inc. |
| 7 | * Copyright (C) 2008-2010 Nokia Corporation | 7 | * Copyright (C) 2008-2011 Nokia Corporation |
| 8 | * | 8 | * |
| 9 | * Paul Walmsley | 9 | * Paul Walmsley |
| 10 | * | 10 | * |
| @@ -22,11 +22,19 @@ | |||
| 22 | #include <plat/clock.h> | 22 | #include <plat/clock.h> |
| 23 | #include <plat/cpu.h> | 23 | #include <plat/cpu.h> |
| 24 | 24 | ||
| 25 | /* Clockdomain capability flags */ | 25 | /* |
| 26 | * Clockdomain flags | ||
| 27 | * | ||
| 28 | * XXX Document CLKDM_CAN_* flags | ||
| 29 | * | ||
| 30 | * CLKDM_NO_AUTODEPS: Prevent "autodeps" from being added/removed from this | ||
| 31 | * clockdomain. (Currently, this applies to OMAP3 clockdomains only.) | ||
| 32 | */ | ||
| 26 | #define CLKDM_CAN_FORCE_SLEEP (1 << 0) | 33 | #define CLKDM_CAN_FORCE_SLEEP (1 << 0) |
| 27 | #define CLKDM_CAN_FORCE_WAKEUP (1 << 1) | 34 | #define CLKDM_CAN_FORCE_WAKEUP (1 << 1) |
| 28 | #define CLKDM_CAN_ENABLE_AUTO (1 << 2) | 35 | #define CLKDM_CAN_ENABLE_AUTO (1 << 2) |
| 29 | #define CLKDM_CAN_DISABLE_AUTO (1 << 3) | 36 | #define CLKDM_CAN_DISABLE_AUTO (1 << 3) |
| 37 | #define CLKDM_NO_AUTODEPS (1 << 4) | ||
| 30 | 38 | ||
| 31 | #define CLKDM_CAN_HWSUP (CLKDM_CAN_ENABLE_AUTO | CLKDM_CAN_DISABLE_AUTO) | 39 | #define CLKDM_CAN_HWSUP (CLKDM_CAN_ENABLE_AUTO | CLKDM_CAN_DISABLE_AUTO) |
| 32 | #define CLKDM_CAN_SWSUP (CLKDM_CAN_FORCE_SLEEP | CLKDM_CAN_FORCE_WAKEUP) | 40 | #define CLKDM_CAN_SWSUP (CLKDM_CAN_FORCE_SLEEP | CLKDM_CAN_FORCE_WAKEUP) |
| @@ -116,7 +124,42 @@ struct clockdomain { | |||
| 116 | struct list_head node; | 124 | struct list_head node; |
| 117 | }; | 125 | }; |
| 118 | 126 | ||
| 119 | void clkdm_init(struct clockdomain **clkdms, struct clkdm_autodep *autodeps); | 127 | /** |
| 128 | * struct clkdm_ops - Arch specfic function implementations | ||
| 129 | * @clkdm_add_wkdep: Add a wakeup dependency between clk domains | ||
| 130 | * @clkdm_del_wkdep: Delete a wakeup dependency between clk domains | ||
| 131 | * @clkdm_read_wkdep: Read wakeup dependency state between clk domains | ||
| 132 | * @clkdm_clear_all_wkdeps: Remove all wakeup dependencies from the clk domain | ||
| 133 | * @clkdm_add_sleepdep: Add a sleep dependency between clk domains | ||
| 134 | * @clkdm_del_sleepdep: Delete a sleep dependency between clk domains | ||
| 135 | * @clkdm_read_sleepdep: Read sleep dependency state between clk domains | ||
| 136 | * @clkdm_clear_all_sleepdeps: Remove all sleep dependencies from the clk domain | ||
| 137 | * @clkdm_sleep: Force a clockdomain to sleep | ||
| 138 | * @clkdm_wakeup: Force a clockdomain to wakeup | ||
| 139 | * @clkdm_allow_idle: Enable hw supervised idle transitions for clock domain | ||
| 140 | * @clkdm_deny_idle: Disable hw supervised idle transitions for clock domain | ||
| 141 | * @clkdm_clk_enable: Put the clkdm in right state for a clock enable | ||
| 142 | * @clkdm_clk_disable: Put the clkdm in right state for a clock disable | ||
| 143 | */ | ||
| 144 | struct clkdm_ops { | ||
| 145 | int (*clkdm_add_wkdep)(struct clockdomain *clkdm1, struct clockdomain *clkdm2); | ||
| 146 | int (*clkdm_del_wkdep)(struct clockdomain *clkdm1, struct clockdomain *clkdm2); | ||
| 147 | int (*clkdm_read_wkdep)(struct clockdomain *clkdm1, struct clockdomain *clkdm2); | ||
| 148 | int (*clkdm_clear_all_wkdeps)(struct clockdomain *clkdm); | ||
| 149 | int (*clkdm_add_sleepdep)(struct clockdomain *clkdm1, struct clockdomain *clkdm2); | ||
| 150 | int (*clkdm_del_sleepdep)(struct clockdomain *clkdm1, struct clockdomain *clkdm2); | ||
| 151 | int (*clkdm_read_sleepdep)(struct clockdomain *clkdm1, struct clockdomain *clkdm2); | ||
| 152 | int (*clkdm_clear_all_sleepdeps)(struct clockdomain *clkdm); | ||
| 153 | int (*clkdm_sleep)(struct clockdomain *clkdm); | ||
| 154 | int (*clkdm_wakeup)(struct clockdomain *clkdm); | ||
| 155 | void (*clkdm_allow_idle)(struct clockdomain *clkdm); | ||
| 156 | void (*clkdm_deny_idle)(struct clockdomain *clkdm); | ||
| 157 | int (*clkdm_clk_enable)(struct clockdomain *clkdm); | ||
| 158 | int (*clkdm_clk_disable)(struct clockdomain *clkdm); | ||
| 159 | }; | ||
| 160 | |||
| 161 | void clkdm_init(struct clockdomain **clkdms, struct clkdm_autodep *autodeps, | ||
| 162 | struct clkdm_ops *custom_funcs); | ||
| 120 | struct clockdomain *clkdm_lookup(const char *name); | 163 | struct clockdomain *clkdm_lookup(const char *name); |
| 121 | 164 | ||
| 122 | int clkdm_for_each(int (*fn)(struct clockdomain *clkdm, void *user), | 165 | int clkdm_for_each(int (*fn)(struct clockdomain *clkdm, void *user), |
| @@ -132,16 +175,23 @@ int clkdm_del_sleepdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2); | |||
| 132 | int clkdm_read_sleepdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2); | 175 | int clkdm_read_sleepdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2); |
| 133 | int clkdm_clear_all_sleepdeps(struct clockdomain *clkdm); | 176 | int clkdm_clear_all_sleepdeps(struct clockdomain *clkdm); |
| 134 | 177 | ||
| 135 | void omap2_clkdm_allow_idle(struct clockdomain *clkdm); | 178 | void clkdm_allow_idle(struct clockdomain *clkdm); |
| 136 | void omap2_clkdm_deny_idle(struct clockdomain *clkdm); | 179 | void clkdm_deny_idle(struct clockdomain *clkdm); |
| 137 | 180 | ||
| 138 | int omap2_clkdm_wakeup(struct clockdomain *clkdm); | 181 | int clkdm_wakeup(struct clockdomain *clkdm); |
| 139 | int omap2_clkdm_sleep(struct clockdomain *clkdm); | 182 | int clkdm_sleep(struct clockdomain *clkdm); |
| 140 | 183 | ||
| 141 | int omap2_clkdm_clk_enable(struct clockdomain *clkdm, struct clk *clk); | 184 | int clkdm_clk_enable(struct clockdomain *clkdm, struct clk *clk); |
| 142 | int omap2_clkdm_clk_disable(struct clockdomain *clkdm, struct clk *clk); | 185 | int clkdm_clk_disable(struct clockdomain *clkdm, struct clk *clk); |
| 143 | 186 | ||
| 144 | extern void __init omap2_clockdomains_init(void); | 187 | extern void __init omap2xxx_clockdomains_init(void); |
| 188 | extern void __init omap3xxx_clockdomains_init(void); | ||
| 145 | extern void __init omap44xx_clockdomains_init(void); | 189 | extern void __init omap44xx_clockdomains_init(void); |
| 190 | extern void _clkdm_add_autodeps(struct clockdomain *clkdm); | ||
| 191 | extern void _clkdm_del_autodeps(struct clockdomain *clkdm); | ||
| 192 | |||
| 193 | extern struct clkdm_ops omap2_clkdm_operations; | ||
| 194 | extern struct clkdm_ops omap3_clkdm_operations; | ||
| 195 | extern struct clkdm_ops omap4_clkdm_operations; | ||
| 146 | 196 | ||
| 147 | #endif | 197 | #endif |
diff --git a/arch/arm/mach-omap2/clockdomain2xxx_3xxx.c b/arch/arm/mach-omap2/clockdomain2xxx_3xxx.c new file mode 100644 index 00000000000..48d0db7e606 --- /dev/null +++ b/arch/arm/mach-omap2/clockdomain2xxx_3xxx.c | |||
| @@ -0,0 +1,274 @@ | |||
| 1 | /* | ||
| 2 | * OMAP2 and OMAP3 clockdomain control | ||
| 3 | * | ||
| 4 | * Copyright (C) 2008-2010 Texas Instruments, Inc. | ||
| 5 | * Copyright (C) 2008-2010 Nokia Corporation | ||
| 6 | * | ||
| 7 | * Derived from mach-omap2/clockdomain.c written by Paul Walmsley | ||
| 8 | * Rajendra Nayak <rnayak@ti.com> | ||
| 9 | * | ||
| 10 | * This program is free software; you can redistribute it and/or modify | ||
| 11 | * it under the terms of the GNU General Public License version 2 as | ||
| 12 | * published by the Free Software Foundation. | ||
| 13 | */ | ||
| 14 | |||
| 15 | #include <linux/types.h> | ||
| 16 | #include <plat/prcm.h> | ||
| 17 | #include "prm.h" | ||
| 18 | #include "prm2xxx_3xxx.h" | ||
| 19 | #include "cm.h" | ||
| 20 | #include "cm2xxx_3xxx.h" | ||
| 21 | #include "cm-regbits-24xx.h" | ||
| 22 | #include "cm-regbits-34xx.h" | ||
| 23 | #include "prm-regbits-24xx.h" | ||
| 24 | #include "clockdomain.h" | ||
| 25 | |||
| 26 | static int omap2_clkdm_add_wkdep(struct clockdomain *clkdm1, | ||
| 27 | struct clockdomain *clkdm2) | ||
| 28 | { | ||
| 29 | omap2_prm_set_mod_reg_bits((1 << clkdm2->dep_bit), | ||
| 30 | clkdm1->pwrdm.ptr->prcm_offs, PM_WKDEP); | ||
| 31 | return 0; | ||
| 32 | } | ||
| 33 | |||
| 34 | static int omap2_clkdm_del_wkdep(struct clockdomain *clkdm1, | ||
| 35 | struct clockdomain *clkdm2) | ||
| 36 | { | ||
| 37 | omap2_prm_clear_mod_reg_bits((1 << clkdm2->dep_bit), | ||
| 38 | clkdm1->pwrdm.ptr->prcm_offs, PM_WKDEP); | ||
| 39 | return 0; | ||
| 40 | } | ||
| 41 | |||
| 42 | static int omap2_clkdm_read_wkdep(struct clockdomain *clkdm1, | ||
| 43 | struct clockdomain *clkdm2) | ||
| 44 | { | ||
| 45 | return omap2_prm_read_mod_bits_shift(clkdm1->pwrdm.ptr->prcm_offs, | ||
| 46 | PM_WKDEP, (1 << clkdm2->dep_bit)); | ||
| 47 | } | ||
| 48 | |||
| 49 | static int omap2_clkdm_clear_all_wkdeps(struct clockdomain *clkdm) | ||
| 50 | { | ||
| 51 | struct clkdm_dep *cd; | ||
| 52 | u32 mask = 0; | ||
| 53 | |||
| 54 | for (cd = clkdm->wkdep_srcs; cd && cd->clkdm_name; cd++) { | ||
| 55 | if (!omap_chip_is(cd->omap_chip)) | ||
| 56 | continue; | ||
| 57 | if (!cd->clkdm) | ||
| 58 | continue; /* only happens if data is erroneous */ | ||
| 59 | |||
| 60 | /* PRM accesses are slow, so minimize them */ | ||
| 61 | mask |= 1 << cd->clkdm->dep_bit; | ||
| 62 | atomic_set(&cd->wkdep_usecount, 0); | ||
| 63 | } | ||
| 64 | |||
| 65 | omap2_prm_clear_mod_reg_bits(mask, clkdm->pwrdm.ptr->prcm_offs, | ||
| 66 | PM_WKDEP); | ||
| 67 | return 0; | ||
| 68 | } | ||
| 69 | |||
| 70 | static int omap3_clkdm_add_sleepdep(struct clockdomain *clkdm1, | ||
| 71 | struct clockdomain *clkdm2) | ||
| 72 | { | ||
| 73 | omap2_cm_set_mod_reg_bits((1 << clkdm2->dep_bit), | ||
| 74 | clkdm1->pwrdm.ptr->prcm_offs, | ||
| 75 | OMAP3430_CM_SLEEPDEP); | ||
| 76 | return 0; | ||
| 77 | } | ||
| 78 | |||
| 79 | static int omap3_clkdm_del_sleepdep(struct clockdomain *clkdm1, | ||
| 80 | struct clockdomain *clkdm2) | ||
| 81 | { | ||
| 82 | omap2_cm_clear_mod_reg_bits((1 << clkdm2->dep_bit), | ||
| 83 | clkdm1->pwrdm.ptr->prcm_offs, | ||
| 84 | OMAP3430_CM_SLEEPDEP); | ||
| 85 | return 0; | ||
| 86 | } | ||
| 87 | |||
| 88 | static int omap3_clkdm_read_sleepdep(struct clockdomain *clkdm1, | ||
| 89 | struct clockdomain *clkdm2) | ||
| 90 | { | ||
| 91 | return omap2_prm_read_mod_bits_shift(clkdm1->pwrdm.ptr->prcm_offs, | ||
| 92 | OMAP3430_CM_SLEEPDEP, (1 << clkdm2->dep_bit)); | ||
| 93 | } | ||
| 94 | |||
| 95 | static int omap3_clkdm_clear_all_sleepdeps(struct clockdomain *clkdm) | ||
| 96 | { | ||
| 97 | struct clkdm_dep *cd; | ||
| 98 | u32 mask = 0; | ||
| 99 | |||
| 100 | for (cd = clkdm->sleepdep_srcs; cd && cd->clkdm_name; cd++) { | ||
| 101 | if (!omap_chip_is(cd->omap_chip)) | ||
| 102 | continue; | ||
| 103 | if (!cd->clkdm) | ||
| 104 | continue; /* only happens if data is erroneous */ | ||
| 105 | |||
| 106 | /* PRM accesses are slow, so minimize them */ | ||
| 107 | mask |= 1 << cd->clkdm->dep_bit; | ||
| 108 | atomic_set(&cd->sleepdep_usecount, 0); | ||
| 109 | } | ||
| 110 | omap2_prm_clear_mod_reg_bits(mask, clkdm->pwrdm.ptr->prcm_offs, | ||
| 111 | OMAP3430_CM_SLEEPDEP); | ||
| 112 | return 0; | ||
| 113 | } | ||
| 114 | |||
| 115 | static int omap2_clkdm_sleep(struct clockdomain *clkdm) | ||
| 116 | { | ||
| 117 | omap2_cm_set_mod_reg_bits(OMAP24XX_FORCESTATE_MASK, | ||
| 118 | clkdm->pwrdm.ptr->prcm_offs, | ||
| 119 | OMAP2_PM_PWSTCTRL); | ||
| 120 | return 0; | ||
| 121 | } | ||
| 122 | |||
| 123 | static int omap2_clkdm_wakeup(struct clockdomain *clkdm) | ||
| 124 | { | ||
| 125 | omap2_cm_clear_mod_reg_bits(OMAP24XX_FORCESTATE_MASK, | ||
| 126 | clkdm->pwrdm.ptr->prcm_offs, | ||
| 127 | OMAP2_PM_PWSTCTRL); | ||
| 128 | return 0; | ||
| 129 | } | ||
| 130 | |||
| 131 | static void omap2_clkdm_allow_idle(struct clockdomain *clkdm) | ||
| 132 | { | ||
| 133 | if (atomic_read(&clkdm->usecount) > 0) | ||
| 134 | _clkdm_add_autodeps(clkdm); | ||
| 135 | |||
| 136 | omap2xxx_cm_clkdm_enable_hwsup(clkdm->pwrdm.ptr->prcm_offs, | ||
| 137 | clkdm->clktrctrl_mask); | ||
| 138 | } | ||
| 139 | |||
| 140 | static void omap2_clkdm_deny_idle(struct clockdomain *clkdm) | ||
| 141 | { | ||
| 142 | omap2xxx_cm_clkdm_disable_hwsup(clkdm->pwrdm.ptr->prcm_offs, | ||
| 143 | clkdm->clktrctrl_mask); | ||
| 144 | |||
| 145 | if (atomic_read(&clkdm->usecount) > 0) | ||
| 146 | _clkdm_del_autodeps(clkdm); | ||
| 147 | } | ||
| 148 | |||
| 149 | static void _enable_hwsup(struct clockdomain *clkdm) | ||
| 150 | { | ||
| 151 | if (cpu_is_omap24xx()) | ||
| 152 | omap2xxx_cm_clkdm_enable_hwsup(clkdm->pwrdm.ptr->prcm_offs, | ||
| 153 | clkdm->clktrctrl_mask); | ||
| 154 | else if (cpu_is_omap34xx()) | ||
| 155 | omap3xxx_cm_clkdm_enable_hwsup(clkdm->pwrdm.ptr->prcm_offs, | ||
| 156 | clkdm->clktrctrl_mask); | ||
| 157 | } | ||
| 158 | |||
| 159 | static void _disable_hwsup(struct clockdomain *clkdm) | ||
| 160 | { | ||
| 161 | if (cpu_is_omap24xx()) | ||
| 162 | omap2xxx_cm_clkdm_disable_hwsup(clkdm->pwrdm.ptr->prcm_offs, | ||
| 163 | clkdm->clktrctrl_mask); | ||
| 164 | else if (cpu_is_omap34xx()) | ||
| 165 | omap3xxx_cm_clkdm_disable_hwsup(clkdm->pwrdm.ptr->prcm_offs, | ||
| 166 | clkdm->clktrctrl_mask); | ||
| 167 | } | ||
| 168 | |||
| 169 | |||
| 170 | static int omap2_clkdm_clk_enable(struct clockdomain *clkdm) | ||
| 171 | { | ||
| 172 | bool hwsup = false; | ||
| 173 | |||
| 174 | if (!clkdm->clktrctrl_mask) | ||
| 175 | return 0; | ||
| 176 | |||
| 177 | hwsup = omap2_cm_is_clkdm_in_hwsup(clkdm->pwrdm.ptr->prcm_offs, | ||
| 178 | clkdm->clktrctrl_mask); | ||
| 179 | |||
| 180 | if (hwsup) { | ||
| 181 | /* Disable HW transitions when we are changing deps */ | ||
| 182 | _disable_hwsup(clkdm); | ||
| 183 | _clkdm_add_autodeps(clkdm); | ||
| 184 | _enable_hwsup(clkdm); | ||
| 185 | } else { | ||
| 186 | clkdm_wakeup(clkdm); | ||
| 187 | } | ||
| 188 | |||
| 189 | return 0; | ||
| 190 | } | ||
| 191 | |||
| 192 | static int omap2_clkdm_clk_disable(struct clockdomain *clkdm) | ||
| 193 | { | ||
| 194 | bool hwsup = false; | ||
| 195 | |||
| 196 | if (!clkdm->clktrctrl_mask) | ||
| 197 | return 0; | ||
| 198 | |||
| 199 | hwsup = omap2_cm_is_clkdm_in_hwsup(clkdm->pwrdm.ptr->prcm_offs, | ||
| 200 | clkdm->clktrctrl_mask); | ||
| 201 | |||
| 202 | if (hwsup) { | ||
| 203 | /* Disable HW transitions when we are changing deps */ | ||
| 204 | _disable_hwsup(clkdm); | ||
| 205 | _clkdm_del_autodeps(clkdm); | ||
| 206 | _enable_hwsup(clkdm); | ||
| 207 | } else { | ||
| 208 | clkdm_sleep(clkdm); | ||
| 209 | } | ||
| 210 | |||
| 211 | return 0; | ||
| 212 | } | ||
| 213 | |||
| 214 | static int omap3_clkdm_sleep(struct clockdomain *clkdm) | ||
| 215 | { | ||
| 216 | omap3xxx_cm_clkdm_force_sleep(clkdm->pwrdm.ptr->prcm_offs, | ||
| 217 | clkdm->clktrctrl_mask); | ||
| 218 | return 0; | ||
| 219 | } | ||
| 220 | |||
| 221 | static int omap3_clkdm_wakeup(struct clockdomain *clkdm) | ||
| 222 | { | ||
| 223 | omap3xxx_cm_clkdm_force_wakeup(clkdm->pwrdm.ptr->prcm_offs, | ||
| 224 | clkdm->clktrctrl_mask); | ||
| 225 | return 0; | ||
| 226 | } | ||
| 227 | |||
| 228 | static void omap3_clkdm_allow_idle(struct clockdomain *clkdm) | ||
| 229 | { | ||
| 230 | if (atomic_read(&clkdm->usecount) > 0) | ||
| 231 | _clkdm_add_autodeps(clkdm); | ||
| 232 | |||
| 233 | omap3xxx_cm_clkdm_enable_hwsup(clkdm->pwrdm.ptr->prcm_offs, | ||
| 234 | clkdm->clktrctrl_mask); | ||
| 235 | } | ||
| 236 | |||
| 237 | static void omap3_clkdm_deny_idle(struct clockdomain *clkdm) | ||
| 238 | { | ||
| 239 | omap3xxx_cm_clkdm_disable_hwsup(clkdm->pwrdm.ptr->prcm_offs, | ||
| 240 | clkdm->clktrctrl_mask); | ||
| 241 | |||
| 242 | if (atomic_read(&clkdm->usecount) > 0) | ||
| 243 | _clkdm_del_autodeps(clkdm); | ||
| 244 | } | ||
| 245 | |||
| 246 | struct clkdm_ops omap2_clkdm_operations = { | ||
| 247 | .clkdm_add_wkdep = omap2_clkdm_add_wkdep, | ||
| 248 | .clkdm_del_wkdep = omap2_clkdm_del_wkdep, | ||
| 249 | .clkdm_read_wkdep = omap2_clkdm_read_wkdep, | ||
| 250 | .clkdm_clear_all_wkdeps = omap2_clkdm_clear_all_wkdeps, | ||
| 251 | .clkdm_sleep = omap2_clkdm_sleep, | ||
| 252 | .clkdm_wakeup = omap2_clkdm_wakeup, | ||
| 253 | .clkdm_allow_idle = omap2_clkdm_allow_idle, | ||
| 254 | .clkdm_deny_idle = omap2_clkdm_deny_idle, | ||
| 255 | .clkdm_clk_enable = omap2_clkdm_clk_enable, | ||
| 256 | .clkdm_clk_disable = omap2_clkdm_clk_disable, | ||
| 257 | }; | ||
| 258 | |||
| 259 | struct clkdm_ops omap3_clkdm_operations = { | ||
| 260 | .clkdm_add_wkdep = omap2_clkdm_add_wkdep, | ||
| 261 | .clkdm_del_wkdep = omap2_clkdm_del_wkdep, | ||
| 262 | .clkdm_read_wkdep = omap2_clkdm_read_wkdep, | ||
| 263 | .clkdm_clear_all_wkdeps = omap2_clkdm_clear_all_wkdeps, | ||
| 264 | .clkdm_add_sleepdep = omap3_clkdm_add_sleepdep, | ||
| 265 | .clkdm_del_sleepdep = omap3_clkdm_del_sleepdep, | ||
| 266 | .clkdm_read_sleepdep = omap3_clkdm_read_sleepdep, | ||
| 267 | .clkdm_clear_all_sleepdeps = omap3_clkdm_clear_all_sleepdeps, | ||
| 268 | .clkdm_sleep = omap3_clkdm_sleep, | ||
| 269 | .clkdm_wakeup = omap3_clkdm_wakeup, | ||
| 270 | .clkdm_allow_idle = omap3_clkdm_allow_idle, | ||
| 271 | .clkdm_deny_idle = omap3_clkdm_deny_idle, | ||
| 272 | .clkdm_clk_enable = omap2_clkdm_clk_enable, | ||
| 273 | .clkdm_clk_disable = omap2_clkdm_clk_disable, | ||
| 274 | }; | ||
diff --git a/arch/arm/mach-omap2/clockdomain44xx.c b/arch/arm/mach-omap2/clockdomain44xx.c new file mode 100644 index 00000000000..a1a4ecd2654 --- /dev/null +++ b/arch/arm/mach-omap2/clockdomain44xx.c | |||
| @@ -0,0 +1,137 @@ | |||
| 1 | /* | ||
| 2 | * OMAP4 clockdomain control | ||
| 3 | * | ||
| 4 | * Copyright (C) 2008-2010 Texas Instruments, Inc. | ||
| 5 | * Copyright (C) 2008-2010 Nokia Corporation | ||
| 6 | * | ||
| 7 | * Derived from mach-omap2/clockdomain.c written by Paul Walmsley | ||
| 8 | * Rajendra Nayak <rnayak@ti.com> | ||
| 9 | * | ||
| 10 | * This program is free software; you can redistribute it and/or modify | ||
| 11 | * it under the terms of the GNU General Public License version 2 as | ||
| 12 | * published by the Free Software Foundation. | ||
| 13 | */ | ||
| 14 | |||
| 15 | #include <linux/kernel.h> | ||
| 16 | #include "clockdomain.h" | ||
| 17 | #include "cminst44xx.h" | ||
| 18 | #include "cm44xx.h" | ||
| 19 | |||
| 20 | static int omap4_clkdm_add_wkup_sleep_dep(struct clockdomain *clkdm1, | ||
| 21 | struct clockdomain *clkdm2) | ||
| 22 | { | ||
| 23 | omap4_cminst_set_inst_reg_bits((1 << clkdm2->dep_bit), | ||
| 24 | clkdm1->prcm_partition, | ||
| 25 | clkdm1->cm_inst, clkdm1->clkdm_offs + | ||
| 26 | OMAP4_CM_STATICDEP); | ||
| 27 | return 0; | ||
| 28 | } | ||
| 29 | |||
| 30 | static int omap4_clkdm_del_wkup_sleep_dep(struct clockdomain *clkdm1, | ||
| 31 | struct clockdomain *clkdm2) | ||
| 32 | { | ||
| 33 | omap4_cminst_clear_inst_reg_bits((1 << clkdm2->dep_bit), | ||
| 34 | clkdm1->prcm_partition, | ||
| 35 | clkdm1->cm_inst, clkdm1->clkdm_offs + | ||
| 36 | OMAP4_CM_STATICDEP); | ||
| 37 | return 0; | ||
| 38 | } | ||
| 39 | |||
| 40 | static int omap4_clkdm_read_wkup_sleep_dep(struct clockdomain *clkdm1, | ||
| 41 | struct clockdomain *clkdm2) | ||
| 42 | { | ||
| 43 | return omap4_cminst_read_inst_reg_bits(clkdm1->prcm_partition, | ||
| 44 | clkdm1->cm_inst, clkdm1->clkdm_offs + | ||
| 45 | OMAP4_CM_STATICDEP, | ||
| 46 | (1 << clkdm2->dep_bit)); | ||
| 47 | } | ||
| 48 | |||
| 49 | static int omap4_clkdm_clear_all_wkup_sleep_deps(struct clockdomain *clkdm) | ||
| 50 | { | ||
| 51 | struct clkdm_dep *cd; | ||
| 52 | u32 mask = 0; | ||
| 53 | |||
| 54 | for (cd = clkdm->wkdep_srcs; cd && cd->clkdm_name; cd++) { | ||
| 55 | if (!omap_chip_is(cd->omap_chip)) | ||
| 56 | continue; | ||
| 57 | if (!cd->clkdm) | ||
| 58 | continue; /* only happens if data is erroneous */ | ||
| 59 | |||
| 60 | mask |= 1 << cd->clkdm->dep_bit; | ||
| 61 | atomic_set(&cd->wkdep_usecount, 0); | ||
| 62 | } | ||
| 63 | |||
| 64 | omap4_cminst_clear_inst_reg_bits(mask, clkdm->prcm_partition, | ||
| 65 | clkdm->cm_inst, clkdm->clkdm_offs + | ||
| 66 | OMAP4_CM_STATICDEP); | ||
| 67 | return 0; | ||
| 68 | } | ||
| 69 | |||
| 70 | static int omap4_clkdm_sleep(struct clockdomain *clkdm) | ||
| 71 | { | ||
| 72 | omap4_cminst_clkdm_force_sleep(clkdm->prcm_partition, | ||
| 73 | clkdm->cm_inst, clkdm->clkdm_offs); | ||
| 74 | return 0; | ||
| 75 | } | ||
| 76 | |||
| 77 | static int omap4_clkdm_wakeup(struct clockdomain *clkdm) | ||
| 78 | { | ||
| 79 | omap4_cminst_clkdm_force_wakeup(clkdm->prcm_partition, | ||
| 80 | clkdm->cm_inst, clkdm->clkdm_offs); | ||
| 81 | return 0; | ||
| 82 | } | ||
| 83 | |||
| 84 | static void omap4_clkdm_allow_idle(struct clockdomain *clkdm) | ||
| 85 | { | ||
| 86 | omap4_cminst_clkdm_enable_hwsup(clkdm->prcm_partition, | ||
| 87 | clkdm->cm_inst, clkdm->clkdm_offs); | ||
| 88 | } | ||
| 89 | |||
| 90 | static void omap4_clkdm_deny_idle(struct clockdomain *clkdm) | ||
| 91 | { | ||
| 92 | omap4_cminst_clkdm_disable_hwsup(clkdm->prcm_partition, | ||
| 93 | clkdm->cm_inst, clkdm->clkdm_offs); | ||
| 94 | } | ||
| 95 | |||
| 96 | static int omap4_clkdm_clk_enable(struct clockdomain *clkdm) | ||
| 97 | { | ||
| 98 | bool hwsup = false; | ||
| 99 | |||
| 100 | hwsup = omap4_cminst_is_clkdm_in_hwsup(clkdm->prcm_partition, | ||
| 101 | clkdm->cm_inst, clkdm->clkdm_offs); | ||
| 102 | |||
| 103 | if (!hwsup) | ||
| 104 | clkdm_wakeup(clkdm); | ||
| 105 | |||
| 106 | return 0; | ||
| 107 | } | ||
| 108 | |||
| 109 | static int omap4_clkdm_clk_disable(struct clockdomain *clkdm) | ||
| 110 | { | ||
| 111 | bool hwsup = false; | ||
| 112 | |||
| 113 | hwsup = omap4_cminst_is_clkdm_in_hwsup(clkdm->prcm_partition, | ||
| 114 | clkdm->cm_inst, clkdm->clkdm_offs); | ||
| 115 | |||
| 116 | if (!hwsup) | ||
| 117 | clkdm_sleep(clkdm); | ||
| 118 | |||
| 119 | return 0; | ||
| 120 | } | ||
| 121 | |||
| 122 | struct clkdm_ops omap4_clkdm_operations = { | ||
| 123 | .clkdm_add_wkdep = omap4_clkdm_add_wkup_sleep_dep, | ||
| 124 | .clkdm_del_wkdep = omap4_clkdm_del_wkup_sleep_dep, | ||
| 125 | .clkdm_read_wkdep = omap4_clkdm_read_wkup_sleep_dep, | ||
| 126 | .clkdm_clear_all_wkdeps = omap4_clkdm_clear_all_wkup_sleep_deps, | ||
| 127 | .clkdm_add_sleepdep = omap4_clkdm_add_wkup_sleep_dep, | ||
| 128 | .clkdm_del_sleepdep = omap4_clkdm_del_wkup_sleep_dep, | ||
| 129 | .clkdm_read_sleepdep = omap4_clkdm_read_wkup_sleep_dep, | ||
| 130 | .clkdm_clear_all_sleepdeps = omap4_clkdm_clear_all_wkup_sleep_deps, | ||
| 131 | .clkdm_sleep = omap4_clkdm_sleep, | ||
| 132 | .clkdm_wakeup = omap4_clkdm_wakeup, | ||
| 133 | .clkdm_allow_idle = omap4_clkdm_allow_idle, | ||
| 134 | .clkdm_deny_idle = omap4_clkdm_deny_idle, | ||
| 135 | .clkdm_clk_enable = omap4_clkdm_clk_enable, | ||
| 136 | .clkdm_clk_disable = omap4_clkdm_clk_disable, | ||
| 137 | }; | ||
diff --git a/arch/arm/mach-omap2/clockdomains2xxx_3xxx_data.c b/arch/arm/mach-omap2/clockdomains2xxx_3xxx_data.c index e6f0d18d5e8..13bde95b679 100644 --- a/arch/arm/mach-omap2/clockdomains2xxx_3xxx_data.c +++ b/arch/arm/mach-omap2/clockdomains2xxx_3xxx_data.c | |||
| @@ -89,6 +89,8 @@ static struct clkdm_dep gfx_sgx_wkdeps[] = { | |||
| 89 | 89 | ||
| 90 | /* 24XX-specific possible dependencies */ | 90 | /* 24XX-specific possible dependencies */ |
| 91 | 91 | ||
| 92 | #ifdef CONFIG_ARCH_OMAP2 | ||
| 93 | |||
| 92 | /* Wakeup dependency source arrays */ | 94 | /* Wakeup dependency source arrays */ |
| 93 | 95 | ||
| 94 | /* 2420/2430 PM_WKDEP_DSP: CORE, MPU, WKUP */ | 96 | /* 2420/2430 PM_WKDEP_DSP: CORE, MPU, WKUP */ |
| @@ -168,6 +170,7 @@ static struct clkdm_dep core_24xx_wkdeps[] = { | |||
| 168 | { NULL }, | 170 | { NULL }, |
| 169 | }; | 171 | }; |
| 170 | 172 | ||
| 173 | #endif /* CONFIG_ARCH_OMAP2 */ | ||
| 171 | 174 | ||
| 172 | /* 2430-specific possible wakeup dependencies */ | 175 | /* 2430-specific possible wakeup dependencies */ |
| 173 | 176 | ||
| @@ -854,7 +857,12 @@ static struct clockdomain *clockdomains_omap2[] __initdata = { | |||
| 854 | NULL, | 857 | NULL, |
| 855 | }; | 858 | }; |
| 856 | 859 | ||
| 857 | void __init omap2_clockdomains_init(void) | 860 | void __init omap2xxx_clockdomains_init(void) |
| 861 | { | ||
| 862 | clkdm_init(clockdomains_omap2, clkdm_autodeps, &omap2_clkdm_operations); | ||
| 863 | } | ||
| 864 | |||
| 865 | void __init omap3xxx_clockdomains_init(void) | ||
| 858 | { | 866 | { |
| 859 | clkdm_init(clockdomains_omap2, clkdm_autodeps); | 867 | clkdm_init(clockdomains_omap2, clkdm_autodeps, &omap3_clkdm_operations); |
| 860 | } | 868 | } |
diff --git a/arch/arm/mach-omap2/clockdomains44xx_data.c b/arch/arm/mach-omap2/clockdomains44xx_data.c index 10622c914ab..a607ec196e8 100644 --- a/arch/arm/mach-omap2/clockdomains44xx_data.c +++ b/arch/arm/mach-omap2/clockdomains44xx_data.c | |||
| @@ -18,11 +18,6 @@ | |||
| 18 | * published by the Free Software Foundation. | 18 | * published by the Free Software Foundation. |
| 19 | */ | 19 | */ |
| 20 | 20 | ||
| 21 | /* | ||
| 22 | * To-Do List | ||
| 23 | * -> Populate the Sleep/Wakeup dependencies for the domains | ||
| 24 | */ | ||
| 25 | |||
| 26 | #include <linux/kernel.h> | 21 | #include <linux/kernel.h> |
| 27 | #include <linux/io.h> | 22 | #include <linux/io.h> |
| 28 | 23 | ||
| @@ -35,6 +30,355 @@ | |||
| 35 | #include "prcm44xx.h" | 30 | #include "prcm44xx.h" |
| 36 | #include "prcm_mpu44xx.h" | 31 | #include "prcm_mpu44xx.h" |
| 37 | 32 | ||
| 33 | /* Static Dependencies for OMAP4 Clock Domains */ | ||
| 34 | |||
| 35 | static struct clkdm_dep ducati_wkup_sleep_deps[] = { | ||
| 36 | { | ||
| 37 | .clkdm_name = "abe_clkdm", | ||
| 38 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430) | ||
| 39 | }, | ||
| 40 | { | ||
| 41 | .clkdm_name = "ivahd_clkdm", | ||
| 42 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430) | ||
| 43 | }, | ||
| 44 | { | ||
| 45 | .clkdm_name = "l3_1_clkdm", | ||
| 46 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430) | ||
| 47 | }, | ||
| 48 | { | ||
| 49 | .clkdm_name = "l3_2_clkdm", | ||
| 50 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430) | ||
| 51 | }, | ||
| 52 | { | ||
| 53 | .clkdm_name = "l3_dss_clkdm", | ||
| 54 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430) | ||
| 55 | }, | ||
| 56 | { | ||
| 57 | .clkdm_name = "l3_emif_clkdm", | ||
| 58 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430) | ||
| 59 | }, | ||
| 60 | { | ||
| 61 | .clkdm_name = "l3_gfx_clkdm", | ||
| 62 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430) | ||
| 63 | }, | ||
| 64 | { | ||
| 65 | .clkdm_name = "l3_init_clkdm", | ||
| 66 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430) | ||
| 67 | }, | ||
| 68 | { | ||
| 69 | .clkdm_name = "l4_cfg_clkdm", | ||
| 70 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430) | ||
| 71 | }, | ||
| 72 | { | ||
| 73 | .clkdm_name = "l4_per_clkdm", | ||
| 74 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430) | ||
| 75 | }, | ||
| 76 | { | ||
| 77 | .clkdm_name = "l4_secure_clkdm", | ||
| 78 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430) | ||
| 79 | }, | ||
| 80 | { | ||
| 81 | .clkdm_name = "l4_wkup_clkdm", | ||
| 82 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430) | ||
| 83 | }, | ||
| 84 | { | ||
| 85 | .clkdm_name = "tesla_clkdm", | ||
| 86 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430) | ||
| 87 | }, | ||
| 88 | { NULL }, | ||
| 89 | }; | ||
| 90 | |||
| 91 | static struct clkdm_dep iss_wkup_sleep_deps[] = { | ||
| 92 | { | ||
| 93 | .clkdm_name = "ivahd_clkdm", | ||
| 94 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430) | ||
| 95 | }, | ||
| 96 | { | ||
| 97 | .clkdm_name = "l3_1_clkdm", | ||
| 98 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430) | ||
| 99 | }, | ||
| 100 | { | ||
| 101 | .clkdm_name = "l3_emif_clkdm", | ||
| 102 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430) | ||
| 103 | }, | ||
| 104 | { NULL }, | ||
| 105 | }; | ||
| 106 | |||
| 107 | static struct clkdm_dep ivahd_wkup_sleep_deps[] = { | ||
| 108 | { | ||
| 109 | .clkdm_name = "l3_1_clkdm", | ||
| 110 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430) | ||
| 111 | }, | ||
| 112 | { | ||
| 113 | .clkdm_name = "l3_emif_clkdm", | ||
| 114 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430) | ||
| 115 | }, | ||
| 116 | { NULL }, | ||
| 117 | }; | ||
| 118 | |||
| 119 | static struct clkdm_dep l3_d2d_wkup_sleep_deps[] = { | ||
| 120 | { | ||
| 121 | .clkdm_name = "abe_clkdm", | ||
| 122 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430) | ||
| 123 | }, | ||
| 124 | { | ||
| 125 | .clkdm_name = "ivahd_clkdm", | ||
| 126 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430) | ||
| 127 | }, | ||
| 128 | { | ||
| 129 | .clkdm_name = "l3_1_clkdm", | ||
| 130 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430) | ||
| 131 | }, | ||
| 132 | { | ||
| 133 | .clkdm_name = "l3_2_clkdm", | ||
| 134 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430) | ||
| 135 | }, | ||
| 136 | { | ||
| 137 | .clkdm_name = "l3_emif_clkdm", | ||
| 138 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430) | ||
| 139 | }, | ||
| 140 | { | ||
| 141 | .clkdm_name = "l3_init_clkdm", | ||
| 142 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430) | ||
| 143 | }, | ||
| 144 | { | ||
| 145 | .clkdm_name = "l4_cfg_clkdm", | ||
| 146 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430) | ||
| 147 | }, | ||
| 148 | { | ||
| 149 | .clkdm_name = "l4_per_clkdm", | ||
| 150 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430) | ||
| 151 | }, | ||
| 152 | { NULL }, | ||
| 153 | }; | ||
| 154 | |||
| 155 | static struct clkdm_dep l3_dma_wkup_sleep_deps[] = { | ||
| 156 | { | ||
| 157 | .clkdm_name = "abe_clkdm", | ||
| 158 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430) | ||
| 159 | }, | ||
| 160 | { | ||
| 161 | .clkdm_name = "ducati_clkdm", | ||
| 162 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430) | ||
| 163 | }, | ||
| 164 | { | ||
| 165 | .clkdm_name = "ivahd_clkdm", | ||
| 166 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430) | ||
| 167 | }, | ||
| 168 | { | ||
| 169 | .clkdm_name = "l3_1_clkdm", | ||
| 170 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430) | ||
| 171 | }, | ||
| 172 | { | ||
| 173 | .clkdm_name = "l3_dss_clkdm", | ||
| 174 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430) | ||
| 175 | }, | ||
| 176 | { | ||
| 177 | .clkdm_name = "l3_emif_clkdm", | ||
| 178 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430) | ||
| 179 | }, | ||
| 180 | { | ||
| 181 | .clkdm_name = "l3_init_clkdm", | ||
| 182 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430) | ||
| 183 | }, | ||
| 184 | { | ||
| 185 | .clkdm_name = "l4_cfg_clkdm", | ||
| 186 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430) | ||
| 187 | }, | ||
| 188 | { | ||
| 189 | .clkdm_name = "l4_per_clkdm", | ||
| 190 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430) | ||
| 191 | }, | ||
| 192 | { | ||
| 193 | .clkdm_name = "l4_secure_clkdm", | ||
| 194 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430) | ||
| 195 | }, | ||
| 196 | { | ||
| 197 | .clkdm_name = "l4_wkup_clkdm", | ||
| 198 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430) | ||
| 199 | }, | ||
| 200 | { NULL }, | ||
| 201 | }; | ||
| 202 | |||
| 203 | static struct clkdm_dep l3_dss_wkup_sleep_deps[] = { | ||
| 204 | { | ||
| 205 | .clkdm_name = "ivahd_clkdm", | ||
| 206 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430) | ||
| 207 | }, | ||
| 208 | { | ||
| 209 | .clkdm_name = "l3_2_clkdm", | ||
| 210 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430) | ||
| 211 | }, | ||
| 212 | { | ||
| 213 | .clkdm_name = "l3_emif_clkdm", | ||
| 214 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430) | ||
| 215 | }, | ||
| 216 | { NULL }, | ||
| 217 | }; | ||
| 218 | |||
| 219 | static struct clkdm_dep l3_gfx_wkup_sleep_deps[] = { | ||
| 220 | { | ||
| 221 | .clkdm_name = "ivahd_clkdm", | ||
| 222 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430) | ||
| 223 | }, | ||
| 224 | { | ||
| 225 | .clkdm_name = "l3_1_clkdm", | ||
| 226 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430) | ||
| 227 | }, | ||
| 228 | { | ||
| 229 | .clkdm_name = "l3_emif_clkdm", | ||
| 230 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430) | ||
| 231 | }, | ||
| 232 | { NULL }, | ||
| 233 | }; | ||
| 234 | |||
| 235 | static struct clkdm_dep l3_init_wkup_sleep_deps[] = { | ||
| 236 | { | ||
| 237 | .clkdm_name = "abe_clkdm", | ||
| 238 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430) | ||
| 239 | }, | ||
| 240 | { | ||
| 241 | .clkdm_name = "ivahd_clkdm", | ||
| 242 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430) | ||
| 243 | }, | ||
| 244 | { | ||
| 245 | .clkdm_name = "l3_emif_clkdm", | ||
| 246 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430) | ||
| 247 | }, | ||
| 248 | { | ||
| 249 | .clkdm_name = "l4_cfg_clkdm", | ||
| 250 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430) | ||
| 251 | }, | ||
| 252 | { | ||
| 253 | .clkdm_name = "l4_per_clkdm", | ||
| 254 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430) | ||
| 255 | }, | ||
| 256 | { | ||
| 257 | .clkdm_name = "l4_secure_clkdm", | ||
| 258 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430) | ||
| 259 | }, | ||
| 260 | { | ||
| 261 | .clkdm_name = "l4_wkup_clkdm", | ||
| 262 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430) | ||
| 263 | }, | ||
| 264 | { NULL }, | ||
| 265 | }; | ||
| 266 | |||
| 267 | static struct clkdm_dep l4_secure_wkup_sleep_deps[] = { | ||
| 268 | { | ||
| 269 | .clkdm_name = "l3_1_clkdm", | ||
| 270 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430) | ||
| 271 | }, | ||
| 272 | { | ||
| 273 | .clkdm_name = "l3_emif_clkdm", | ||
| 274 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430) | ||
| 275 | }, | ||
| 276 | { | ||
| 277 | .clkdm_name = "l4_per_clkdm", | ||
| 278 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430) | ||
| 279 | }, | ||
| 280 | { NULL }, | ||
| 281 | }; | ||
| 282 | |||
| 283 | static struct clkdm_dep mpuss_wkup_sleep_deps[] = { | ||
| 284 | { | ||
| 285 | .clkdm_name = "abe_clkdm", | ||
| 286 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430) | ||
| 287 | }, | ||
| 288 | { | ||
| 289 | .clkdm_name = "ducati_clkdm", | ||
| 290 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430) | ||
| 291 | }, | ||
| 292 | { | ||
| 293 | .clkdm_name = "ivahd_clkdm", | ||
| 294 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430) | ||
| 295 | }, | ||
| 296 | { | ||
| 297 | .clkdm_name = "l3_1_clkdm", | ||
| 298 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430) | ||
| 299 | }, | ||
| 300 | { | ||
| 301 | .clkdm_name = "l3_2_clkdm", | ||
| 302 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430) | ||
| 303 | }, | ||
| 304 | { | ||
| 305 | .clkdm_name = "l3_dss_clkdm", | ||
| 306 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430) | ||
| 307 | }, | ||
| 308 | { | ||
| 309 | .clkdm_name = "l3_emif_clkdm", | ||
| 310 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430) | ||
| 311 | }, | ||
| 312 | { | ||
| 313 | .clkdm_name = "l3_gfx_clkdm", | ||
| 314 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430) | ||
| 315 | }, | ||
| 316 | { | ||
| 317 | .clkdm_name = "l3_init_clkdm", | ||
| 318 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430) | ||
| 319 | }, | ||
| 320 | { | ||
| 321 | .clkdm_name = "l4_cfg_clkdm", | ||
| 322 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430) | ||
| 323 | }, | ||
| 324 | { | ||
| 325 | .clkdm_name = "l4_per_clkdm", | ||
| 326 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430) | ||
| 327 | }, | ||
| 328 | { | ||
| 329 | .clkdm_name = "l4_secure_clkdm", | ||
| 330 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430) | ||
| 331 | }, | ||
| 332 | { | ||
| 333 | .clkdm_name = "l4_wkup_clkdm", | ||
| 334 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430) | ||
| 335 | }, | ||
| 336 | { | ||
| 337 | .clkdm_name = "tesla_clkdm", | ||
| 338 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430) | ||
| 339 | }, | ||
| 340 | { NULL }, | ||
| 341 | }; | ||
| 342 | |||
| 343 | static struct clkdm_dep tesla_wkup_sleep_deps[] = { | ||
| 344 | { | ||
| 345 | .clkdm_name = "abe_clkdm", | ||
| 346 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430) | ||
| 347 | }, | ||
| 348 | { | ||
| 349 | .clkdm_name = "ivahd_clkdm", | ||
| 350 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430) | ||
| 351 | }, | ||
| 352 | { | ||
| 353 | .clkdm_name = "l3_1_clkdm", | ||
| 354 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430) | ||
| 355 | }, | ||
| 356 | { | ||
| 357 | .clkdm_name = "l3_2_clkdm", | ||
| 358 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430) | ||
| 359 | }, | ||
| 360 | { | ||
| 361 | .clkdm_name = "l3_emif_clkdm", | ||
| 362 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430) | ||
| 363 | }, | ||
| 364 | { | ||
| 365 | .clkdm_name = "l3_init_clkdm", | ||
| 366 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430) | ||
| 367 | }, | ||
| 368 | { | ||
| 369 | .clkdm_name = "l4_cfg_clkdm", | ||
| 370 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430) | ||
| 371 | }, | ||
| 372 | { | ||
| 373 | .clkdm_name = "l4_per_clkdm", | ||
| 374 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430) | ||
| 375 | }, | ||
| 376 | { | ||
| 377 | .clkdm_name = "l4_wkup_clkdm", | ||
| 378 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430) | ||
| 379 | }, | ||
| 380 | { NULL }, | ||
| 381 | }; | ||
| 38 | 382 | ||
| 39 | static struct clockdomain l4_cefuse_44xx_clkdm = { | 383 | static struct clockdomain l4_cefuse_44xx_clkdm = { |
| 40 | .name = "l4_cefuse_clkdm", | 384 | .name = "l4_cefuse_clkdm", |
| @@ -52,6 +396,7 @@ static struct clockdomain l4_cfg_44xx_clkdm = { | |||
| 52 | .prcm_partition = OMAP4430_CM2_PARTITION, | 396 | .prcm_partition = OMAP4430_CM2_PARTITION, |
| 53 | .cm_inst = OMAP4430_CM2_CORE_INST, | 397 | .cm_inst = OMAP4430_CM2_CORE_INST, |
| 54 | .clkdm_offs = OMAP4430_CM2_CORE_L4CFG_CDOFFS, | 398 | .clkdm_offs = OMAP4430_CM2_CORE_L4CFG_CDOFFS, |
| 399 | .dep_bit = OMAP4430_L4CFG_STATDEP_SHIFT, | ||
| 55 | .flags = CLKDM_CAN_HWSUP, | 400 | .flags = CLKDM_CAN_HWSUP, |
| 56 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430), | 401 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430), |
| 57 | }; | 402 | }; |
| @@ -62,6 +407,9 @@ static struct clockdomain tesla_44xx_clkdm = { | |||
| 62 | .prcm_partition = OMAP4430_CM1_PARTITION, | 407 | .prcm_partition = OMAP4430_CM1_PARTITION, |
| 63 | .cm_inst = OMAP4430_CM1_TESLA_INST, | 408 | .cm_inst = OMAP4430_CM1_TESLA_INST, |
| 64 | .clkdm_offs = OMAP4430_CM1_TESLA_TESLA_CDOFFS, | 409 | .clkdm_offs = OMAP4430_CM1_TESLA_TESLA_CDOFFS, |
| 410 | .dep_bit = OMAP4430_TESLA_STATDEP_SHIFT, | ||
| 411 | .wkdep_srcs = tesla_wkup_sleep_deps, | ||
| 412 | .sleepdep_srcs = tesla_wkup_sleep_deps, | ||
| 65 | .flags = CLKDM_CAN_HWSUP_SWSUP, | 413 | .flags = CLKDM_CAN_HWSUP_SWSUP, |
| 66 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430), | 414 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430), |
| 67 | }; | 415 | }; |
| @@ -72,6 +420,9 @@ static struct clockdomain l3_gfx_44xx_clkdm = { | |||
| 72 | .prcm_partition = OMAP4430_CM2_PARTITION, | 420 | .prcm_partition = OMAP4430_CM2_PARTITION, |
| 73 | .cm_inst = OMAP4430_CM2_GFX_INST, | 421 | .cm_inst = OMAP4430_CM2_GFX_INST, |
| 74 | .clkdm_offs = OMAP4430_CM2_GFX_GFX_CDOFFS, | 422 | .clkdm_offs = OMAP4430_CM2_GFX_GFX_CDOFFS, |
| 423 | .dep_bit = OMAP4430_GFX_STATDEP_SHIFT, | ||
| 424 | .wkdep_srcs = l3_gfx_wkup_sleep_deps, | ||
| 425 | .sleepdep_srcs = l3_gfx_wkup_sleep_deps, | ||
| 75 | .flags = CLKDM_CAN_HWSUP_SWSUP, | 426 | .flags = CLKDM_CAN_HWSUP_SWSUP, |
| 76 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430), | 427 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430), |
| 77 | }; | 428 | }; |
| @@ -82,6 +433,9 @@ static struct clockdomain ivahd_44xx_clkdm = { | |||
| 82 | .prcm_partition = OMAP4430_CM2_PARTITION, | 433 | .prcm_partition = OMAP4430_CM2_PARTITION, |
| 83 | .cm_inst = OMAP4430_CM2_IVAHD_INST, | 434 | .cm_inst = OMAP4430_CM2_IVAHD_INST, |
| 84 | .clkdm_offs = OMAP4430_CM2_IVAHD_IVAHD_CDOFFS, | 435 | .clkdm_offs = OMAP4430_CM2_IVAHD_IVAHD_CDOFFS, |
| 436 | .dep_bit = OMAP4430_IVAHD_STATDEP_SHIFT, | ||
| 437 | .wkdep_srcs = ivahd_wkup_sleep_deps, | ||
| 438 | .sleepdep_srcs = ivahd_wkup_sleep_deps, | ||
| 85 | .flags = CLKDM_CAN_HWSUP_SWSUP, | 439 | .flags = CLKDM_CAN_HWSUP_SWSUP, |
| 86 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430), | 440 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430), |
| 87 | }; | 441 | }; |
| @@ -92,6 +446,9 @@ static struct clockdomain l4_secure_44xx_clkdm = { | |||
| 92 | .prcm_partition = OMAP4430_CM2_PARTITION, | 446 | .prcm_partition = OMAP4430_CM2_PARTITION, |
| 93 | .cm_inst = OMAP4430_CM2_L4PER_INST, | 447 | .cm_inst = OMAP4430_CM2_L4PER_INST, |
| 94 | .clkdm_offs = OMAP4430_CM2_L4PER_L4SEC_CDOFFS, | 448 | .clkdm_offs = OMAP4430_CM2_L4PER_L4SEC_CDOFFS, |
| 449 | .dep_bit = OMAP4430_L4SEC_STATDEP_SHIFT, | ||
| 450 | .wkdep_srcs = l4_secure_wkup_sleep_deps, | ||
| 451 | .sleepdep_srcs = l4_secure_wkup_sleep_deps, | ||
| 95 | .flags = CLKDM_CAN_HWSUP_SWSUP, | 452 | .flags = CLKDM_CAN_HWSUP_SWSUP, |
| 96 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430), | 453 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430), |
| 97 | }; | 454 | }; |
| @@ -102,6 +459,7 @@ static struct clockdomain l4_per_44xx_clkdm = { | |||
| 102 | .prcm_partition = OMAP4430_CM2_PARTITION, | 459 | .prcm_partition = OMAP4430_CM2_PARTITION, |
| 103 | .cm_inst = OMAP4430_CM2_L4PER_INST, | 460 | .cm_inst = OMAP4430_CM2_L4PER_INST, |
| 104 | .clkdm_offs = OMAP4430_CM2_L4PER_L4PER_CDOFFS, | 461 | .clkdm_offs = OMAP4430_CM2_L4PER_L4PER_CDOFFS, |
| 462 | .dep_bit = OMAP4430_L4PER_STATDEP_SHIFT, | ||
| 105 | .flags = CLKDM_CAN_HWSUP_SWSUP, | 463 | .flags = CLKDM_CAN_HWSUP_SWSUP, |
| 106 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430), | 464 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430), |
| 107 | }; | 465 | }; |
| @@ -112,6 +470,7 @@ static struct clockdomain abe_44xx_clkdm = { | |||
| 112 | .prcm_partition = OMAP4430_CM1_PARTITION, | 470 | .prcm_partition = OMAP4430_CM1_PARTITION, |
| 113 | .cm_inst = OMAP4430_CM1_ABE_INST, | 471 | .cm_inst = OMAP4430_CM1_ABE_INST, |
| 114 | .clkdm_offs = OMAP4430_CM1_ABE_ABE_CDOFFS, | 472 | .clkdm_offs = OMAP4430_CM1_ABE_ABE_CDOFFS, |
| 473 | .dep_bit = OMAP4430_ABE_STATDEP_SHIFT, | ||
| 115 | .flags = CLKDM_CAN_HWSUP_SWSUP, | 474 | .flags = CLKDM_CAN_HWSUP_SWSUP, |
| 116 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430), | 475 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430), |
| 117 | }; | 476 | }; |
| @@ -131,6 +490,9 @@ static struct clockdomain l3_init_44xx_clkdm = { | |||
| 131 | .prcm_partition = OMAP4430_CM2_PARTITION, | 490 | .prcm_partition = OMAP4430_CM2_PARTITION, |
| 132 | .cm_inst = OMAP4430_CM2_L3INIT_INST, | 491 | .cm_inst = OMAP4430_CM2_L3INIT_INST, |
| 133 | .clkdm_offs = OMAP4430_CM2_L3INIT_L3INIT_CDOFFS, | 492 | .clkdm_offs = OMAP4430_CM2_L3INIT_L3INIT_CDOFFS, |
| 493 | .dep_bit = OMAP4430_L3INIT_STATDEP_SHIFT, | ||
| 494 | .wkdep_srcs = l3_init_wkup_sleep_deps, | ||
| 495 | .sleepdep_srcs = l3_init_wkup_sleep_deps, | ||
| 134 | .flags = CLKDM_CAN_HWSUP_SWSUP, | 496 | .flags = CLKDM_CAN_HWSUP_SWSUP, |
| 135 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430), | 497 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430), |
| 136 | }; | 498 | }; |
| @@ -141,6 +503,8 @@ static struct clockdomain mpuss_44xx_clkdm = { | |||
| 141 | .prcm_partition = OMAP4430_CM1_PARTITION, | 503 | .prcm_partition = OMAP4430_CM1_PARTITION, |
| 142 | .cm_inst = OMAP4430_CM1_MPU_INST, | 504 | .cm_inst = OMAP4430_CM1_MPU_INST, |
| 143 | .clkdm_offs = OMAP4430_CM1_MPU_MPU_CDOFFS, | 505 | .clkdm_offs = OMAP4430_CM1_MPU_MPU_CDOFFS, |
| 506 | .wkdep_srcs = mpuss_wkup_sleep_deps, | ||
| 507 | .sleepdep_srcs = mpuss_wkup_sleep_deps, | ||
| 144 | .flags = CLKDM_CAN_FORCE_WAKEUP | CLKDM_CAN_HWSUP, | 508 | .flags = CLKDM_CAN_FORCE_WAKEUP | CLKDM_CAN_HWSUP, |
| 145 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430), | 509 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430), |
| 146 | }; | 510 | }; |
| @@ -150,7 +514,7 @@ static struct clockdomain mpu0_44xx_clkdm = { | |||
| 150 | .pwrdm = { .name = "cpu0_pwrdm" }, | 514 | .pwrdm = { .name = "cpu0_pwrdm" }, |
| 151 | .prcm_partition = OMAP4430_PRCM_MPU_PARTITION, | 515 | .prcm_partition = OMAP4430_PRCM_MPU_PARTITION, |
| 152 | .cm_inst = OMAP4430_PRCM_MPU_CPU0_INST, | 516 | .cm_inst = OMAP4430_PRCM_MPU_CPU0_INST, |
| 153 | .clkdm_offs = OMAP4430_PRCM_MPU_CPU0_MPU_CDOFFS, | 517 | .clkdm_offs = OMAP4430_PRCM_MPU_CPU0_CPU0_CDOFFS, |
| 154 | .flags = CLKDM_CAN_FORCE_WAKEUP | CLKDM_CAN_HWSUP, | 518 | .flags = CLKDM_CAN_FORCE_WAKEUP | CLKDM_CAN_HWSUP, |
| 155 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430), | 519 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430), |
| 156 | }; | 520 | }; |
| @@ -160,7 +524,7 @@ static struct clockdomain mpu1_44xx_clkdm = { | |||
| 160 | .pwrdm = { .name = "cpu1_pwrdm" }, | 524 | .pwrdm = { .name = "cpu1_pwrdm" }, |
| 161 | .prcm_partition = OMAP4430_PRCM_MPU_PARTITION, | 525 | .prcm_partition = OMAP4430_PRCM_MPU_PARTITION, |
| 162 | .cm_inst = OMAP4430_PRCM_MPU_CPU1_INST, | 526 | .cm_inst = OMAP4430_PRCM_MPU_CPU1_INST, |
| 163 | .clkdm_offs = OMAP4430_PRCM_MPU_CPU1_MPU_CDOFFS, | 527 | .clkdm_offs = OMAP4430_PRCM_MPU_CPU1_CPU1_CDOFFS, |
| 164 | .flags = CLKDM_CAN_FORCE_WAKEUP | CLKDM_CAN_HWSUP, | 528 | .flags = CLKDM_CAN_FORCE_WAKEUP | CLKDM_CAN_HWSUP, |
| 165 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430), | 529 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430), |
| 166 | }; | 530 | }; |
| @@ -171,6 +535,7 @@ static struct clockdomain l3_emif_44xx_clkdm = { | |||
| 171 | .prcm_partition = OMAP4430_CM2_PARTITION, | 535 | .prcm_partition = OMAP4430_CM2_PARTITION, |
| 172 | .cm_inst = OMAP4430_CM2_CORE_INST, | 536 | .cm_inst = OMAP4430_CM2_CORE_INST, |
| 173 | .clkdm_offs = OMAP4430_CM2_CORE_MEMIF_CDOFFS, | 537 | .clkdm_offs = OMAP4430_CM2_CORE_MEMIF_CDOFFS, |
| 538 | .dep_bit = OMAP4430_MEMIF_STATDEP_SHIFT, | ||
| 174 | .flags = CLKDM_CAN_FORCE_WAKEUP | CLKDM_CAN_HWSUP, | 539 | .flags = CLKDM_CAN_FORCE_WAKEUP | CLKDM_CAN_HWSUP, |
| 175 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430), | 540 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430), |
| 176 | }; | 541 | }; |
| @@ -191,6 +556,9 @@ static struct clockdomain ducati_44xx_clkdm = { | |||
| 191 | .prcm_partition = OMAP4430_CM2_PARTITION, | 556 | .prcm_partition = OMAP4430_CM2_PARTITION, |
| 192 | .cm_inst = OMAP4430_CM2_CORE_INST, | 557 | .cm_inst = OMAP4430_CM2_CORE_INST, |
| 193 | .clkdm_offs = OMAP4430_CM2_CORE_DUCATI_CDOFFS, | 558 | .clkdm_offs = OMAP4430_CM2_CORE_DUCATI_CDOFFS, |
| 559 | .dep_bit = OMAP4430_DUCATI_STATDEP_SHIFT, | ||
| 560 | .wkdep_srcs = ducati_wkup_sleep_deps, | ||
| 561 | .sleepdep_srcs = ducati_wkup_sleep_deps, | ||
| 194 | .flags = CLKDM_CAN_HWSUP_SWSUP, | 562 | .flags = CLKDM_CAN_HWSUP_SWSUP, |
| 195 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430), | 563 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430), |
| 196 | }; | 564 | }; |
| @@ -201,6 +569,7 @@ static struct clockdomain l3_2_44xx_clkdm = { | |||
| 201 | .prcm_partition = OMAP4430_CM2_PARTITION, | 569 | .prcm_partition = OMAP4430_CM2_PARTITION, |
| 202 | .cm_inst = OMAP4430_CM2_CORE_INST, | 570 | .cm_inst = OMAP4430_CM2_CORE_INST, |
| 203 | .clkdm_offs = OMAP4430_CM2_CORE_L3_2_CDOFFS, | 571 | .clkdm_offs = OMAP4430_CM2_CORE_L3_2_CDOFFS, |
| 572 | .dep_bit = OMAP4430_L3_2_STATDEP_SHIFT, | ||
| 204 | .flags = CLKDM_CAN_HWSUP, | 573 | .flags = CLKDM_CAN_HWSUP, |
| 205 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430), | 574 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430), |
| 206 | }; | 575 | }; |
| @@ -211,6 +580,7 @@ static struct clockdomain l3_1_44xx_clkdm = { | |||
| 211 | .prcm_partition = OMAP4430_CM2_PARTITION, | 580 | .prcm_partition = OMAP4430_CM2_PARTITION, |
| 212 | .cm_inst = OMAP4430_CM2_CORE_INST, | 581 | .cm_inst = OMAP4430_CM2_CORE_INST, |
| 213 | .clkdm_offs = OMAP4430_CM2_CORE_L3_1_CDOFFS, | 582 | .clkdm_offs = OMAP4430_CM2_CORE_L3_1_CDOFFS, |
| 583 | .dep_bit = OMAP4430_L3_1_STATDEP_SHIFT, | ||
| 214 | .flags = CLKDM_CAN_HWSUP, | 584 | .flags = CLKDM_CAN_HWSUP, |
| 215 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430), | 585 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430), |
| 216 | }; | 586 | }; |
| @@ -221,6 +591,8 @@ static struct clockdomain l3_d2d_44xx_clkdm = { | |||
| 221 | .prcm_partition = OMAP4430_CM2_PARTITION, | 591 | .prcm_partition = OMAP4430_CM2_PARTITION, |
| 222 | .cm_inst = OMAP4430_CM2_CORE_INST, | 592 | .cm_inst = OMAP4430_CM2_CORE_INST, |
| 223 | .clkdm_offs = OMAP4430_CM2_CORE_D2D_CDOFFS, | 593 | .clkdm_offs = OMAP4430_CM2_CORE_D2D_CDOFFS, |
| 594 | .wkdep_srcs = l3_d2d_wkup_sleep_deps, | ||
| 595 | .sleepdep_srcs = l3_d2d_wkup_sleep_deps, | ||
| 224 | .flags = CLKDM_CAN_FORCE_WAKEUP | CLKDM_CAN_HWSUP, | 596 | .flags = CLKDM_CAN_FORCE_WAKEUP | CLKDM_CAN_HWSUP, |
| 225 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430), | 597 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430), |
| 226 | }; | 598 | }; |
| @@ -231,6 +603,8 @@ static struct clockdomain iss_44xx_clkdm = { | |||
| 231 | .prcm_partition = OMAP4430_CM2_PARTITION, | 603 | .prcm_partition = OMAP4430_CM2_PARTITION, |
| 232 | .cm_inst = OMAP4430_CM2_CAM_INST, | 604 | .cm_inst = OMAP4430_CM2_CAM_INST, |
| 233 | .clkdm_offs = OMAP4430_CM2_CAM_CAM_CDOFFS, | 605 | .clkdm_offs = OMAP4430_CM2_CAM_CAM_CDOFFS, |
| 606 | .wkdep_srcs = iss_wkup_sleep_deps, | ||
| 607 | .sleepdep_srcs = iss_wkup_sleep_deps, | ||
| 234 | .flags = CLKDM_CAN_HWSUP_SWSUP, | 608 | .flags = CLKDM_CAN_HWSUP_SWSUP, |
| 235 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430), | 609 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430), |
| 236 | }; | 610 | }; |
| @@ -241,6 +615,9 @@ static struct clockdomain l3_dss_44xx_clkdm = { | |||
| 241 | .prcm_partition = OMAP4430_CM2_PARTITION, | 615 | .prcm_partition = OMAP4430_CM2_PARTITION, |
| 242 | .cm_inst = OMAP4430_CM2_DSS_INST, | 616 | .cm_inst = OMAP4430_CM2_DSS_INST, |
| 243 | .clkdm_offs = OMAP4430_CM2_DSS_DSS_CDOFFS, | 617 | .clkdm_offs = OMAP4430_CM2_DSS_DSS_CDOFFS, |
| 618 | .dep_bit = OMAP4430_DSS_STATDEP_SHIFT, | ||
| 619 | .wkdep_srcs = l3_dss_wkup_sleep_deps, | ||
| 620 | .sleepdep_srcs = l3_dss_wkup_sleep_deps, | ||
| 244 | .flags = CLKDM_CAN_HWSUP_SWSUP, | 621 | .flags = CLKDM_CAN_HWSUP_SWSUP, |
| 245 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430), | 622 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430), |
| 246 | }; | 623 | }; |
| @@ -251,6 +628,7 @@ static struct clockdomain l4_wkup_44xx_clkdm = { | |||
| 251 | .prcm_partition = OMAP4430_PRM_PARTITION, | 628 | .prcm_partition = OMAP4430_PRM_PARTITION, |
| 252 | .cm_inst = OMAP4430_PRM_WKUP_CM_INST, | 629 | .cm_inst = OMAP4430_PRM_WKUP_CM_INST, |
| 253 | .clkdm_offs = OMAP4430_PRM_WKUP_CM_WKUP_CDOFFS, | 630 | .clkdm_offs = OMAP4430_PRM_WKUP_CM_WKUP_CDOFFS, |
| 631 | .dep_bit = OMAP4430_L4WKUP_STATDEP_SHIFT, | ||
| 254 | .flags = CLKDM_CAN_HWSUP, | 632 | .flags = CLKDM_CAN_HWSUP, |
| 255 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430), | 633 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430), |
| 256 | }; | 634 | }; |
| @@ -271,6 +649,8 @@ static struct clockdomain l3_dma_44xx_clkdm = { | |||
| 271 | .prcm_partition = OMAP4430_CM2_PARTITION, | 649 | .prcm_partition = OMAP4430_CM2_PARTITION, |
| 272 | .cm_inst = OMAP4430_CM2_CORE_INST, | 650 | .cm_inst = OMAP4430_CM2_CORE_INST, |
| 273 | .clkdm_offs = OMAP4430_CM2_CORE_SDMA_CDOFFS, | 651 | .clkdm_offs = OMAP4430_CM2_CORE_SDMA_CDOFFS, |
| 652 | .wkdep_srcs = l3_dma_wkup_sleep_deps, | ||
| 653 | .sleepdep_srcs = l3_dma_wkup_sleep_deps, | ||
| 274 | .flags = CLKDM_CAN_FORCE_WAKEUP | CLKDM_CAN_HWSUP, | 654 | .flags = CLKDM_CAN_FORCE_WAKEUP | CLKDM_CAN_HWSUP, |
| 275 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430), | 655 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430), |
| 276 | }; | 656 | }; |
| @@ -305,5 +685,5 @@ static struct clockdomain *clockdomains_omap44xx[] __initdata = { | |||
| 305 | 685 | ||
| 306 | void __init omap44xx_clockdomains_init(void) | 686 | void __init omap44xx_clockdomains_init(void) |
| 307 | { | 687 | { |
| 308 | clkdm_init(clockdomains_omap44xx, NULL); | 688 | clkdm_init(clockdomains_omap44xx, NULL, &omap4_clkdm_operations); |
| 309 | } | 689 | } |
diff --git a/arch/arm/mach-omap2/cm-regbits-24xx.h b/arch/arm/mach-omap2/cm-regbits-24xx.h index d70660e82fe..68629043756 100644 --- a/arch/arm/mach-omap2/cm-regbits-24xx.h +++ b/arch/arm/mach-omap2/cm-regbits-24xx.h | |||
| @@ -210,8 +210,11 @@ | |||
| 210 | #define OMAP24XX_AUTO_USB_MASK (1 << 0) | 210 | #define OMAP24XX_AUTO_USB_MASK (1 << 0) |
| 211 | 211 | ||
| 212 | /* CM_AUTOIDLE3_CORE */ | 212 | /* CM_AUTOIDLE3_CORE */ |
| 213 | #define OMAP24XX_AUTO_SDRC_SHIFT 2 | ||
| 213 | #define OMAP24XX_AUTO_SDRC_MASK (1 << 2) | 214 | #define OMAP24XX_AUTO_SDRC_MASK (1 << 2) |
| 215 | #define OMAP24XX_AUTO_GPMC_SHIFT 1 | ||
| 214 | #define OMAP24XX_AUTO_GPMC_MASK (1 << 1) | 216 | #define OMAP24XX_AUTO_GPMC_MASK (1 << 1) |
| 217 | #define OMAP24XX_AUTO_SDMA_SHIFT 0 | ||
| 215 | #define OMAP24XX_AUTO_SDMA_MASK (1 << 0) | 218 | #define OMAP24XX_AUTO_SDMA_MASK (1 << 0) |
| 216 | 219 | ||
| 217 | /* CM_AUTOIDLE4_CORE */ | 220 | /* CM_AUTOIDLE4_CORE */ |
diff --git a/arch/arm/mach-omap2/cm2xxx_3xxx.c b/arch/arm/mach-omap2/cm2xxx_3xxx.c index 96954aa4867..9d0dec806e9 100644 --- a/arch/arm/mach-omap2/cm2xxx_3xxx.c +++ b/arch/arm/mach-omap2/cm2xxx_3xxx.c | |||
| @@ -25,6 +25,14 @@ | |||
| 25 | #include "cm-regbits-24xx.h" | 25 | #include "cm-regbits-24xx.h" |
| 26 | #include "cm-regbits-34xx.h" | 26 | #include "cm-regbits-34xx.h" |
| 27 | 27 | ||
| 28 | /* CM_AUTOIDLE_PLL.AUTO_* bit values for DPLLs */ | ||
| 29 | #define DPLL_AUTOIDLE_DISABLE 0x0 | ||
| 30 | #define OMAP2XXX_DPLL_AUTOIDLE_LOW_POWER_STOP 0x3 | ||
| 31 | |||
| 32 | /* CM_AUTOIDLE_PLL.AUTO_* bit values for APLLs (OMAP2xxx only) */ | ||
| 33 | #define OMAP2XXX_APLL_AUTOIDLE_DISABLE 0x0 | ||
| 34 | #define OMAP2XXX_APLL_AUTOIDLE_LOW_POWER_STOP 0x3 | ||
| 35 | |||
| 28 | static const u8 cm_idlest_offs[] = { | 36 | static const u8 cm_idlest_offs[] = { |
| 29 | CM_IDLEST1, CM_IDLEST2, OMAP2430_CM_IDLEST3 | 37 | CM_IDLEST1, CM_IDLEST2, OMAP2430_CM_IDLEST3 |
| 30 | }; | 38 | }; |
| @@ -125,6 +133,67 @@ void omap3xxx_cm_clkdm_force_wakeup(s16 module, u32 mask) | |||
| 125 | _write_clktrctrl(OMAP34XX_CLKSTCTRL_FORCE_WAKEUP, module, mask); | 133 | _write_clktrctrl(OMAP34XX_CLKSTCTRL_FORCE_WAKEUP, module, mask); |
| 126 | } | 134 | } |
| 127 | 135 | ||
| 136 | /* | ||
| 137 | * DPLL autoidle control | ||
| 138 | */ | ||
| 139 | |||
| 140 | static void _omap2xxx_set_dpll_autoidle(u8 m) | ||
| 141 | { | ||
| 142 | u32 v; | ||
| 143 | |||
| 144 | v = omap2_cm_read_mod_reg(PLL_MOD, CM_AUTOIDLE); | ||
| 145 | v &= ~OMAP24XX_AUTO_DPLL_MASK; | ||
| 146 | v |= m << OMAP24XX_AUTO_DPLL_SHIFT; | ||
| 147 | omap2_cm_write_mod_reg(v, PLL_MOD, CM_AUTOIDLE); | ||
| 148 | } | ||
| 149 | |||
| 150 | void omap2xxx_cm_set_dpll_disable_autoidle(void) | ||
| 151 | { | ||
| 152 | _omap2xxx_set_dpll_autoidle(OMAP2XXX_DPLL_AUTOIDLE_LOW_POWER_STOP); | ||
| 153 | } | ||
| 154 | |||
| 155 | void omap2xxx_cm_set_dpll_auto_low_power_stop(void) | ||
| 156 | { | ||
| 157 | _omap2xxx_set_dpll_autoidle(DPLL_AUTOIDLE_DISABLE); | ||
| 158 | } | ||
| 159 | |||
| 160 | /* | ||
| 161 | * APLL autoidle control | ||
| 162 | */ | ||
| 163 | |||
| 164 | static void _omap2xxx_set_apll_autoidle(u8 m, u32 mask) | ||
| 165 | { | ||
| 166 | u32 v; | ||
| 167 | |||
| 168 | v = omap2_cm_read_mod_reg(PLL_MOD, CM_AUTOIDLE); | ||
| 169 | v &= ~mask; | ||
| 170 | v |= m << __ffs(mask); | ||
| 171 | omap2_cm_write_mod_reg(v, PLL_MOD, CM_AUTOIDLE); | ||
| 172 | } | ||
| 173 | |||
| 174 | void omap2xxx_cm_set_apll54_disable_autoidle(void) | ||
| 175 | { | ||
| 176 | _omap2xxx_set_apll_autoidle(OMAP2XXX_APLL_AUTOIDLE_LOW_POWER_STOP, | ||
| 177 | OMAP24XX_AUTO_54M_MASK); | ||
| 178 | } | ||
| 179 | |||
| 180 | void omap2xxx_cm_set_apll54_auto_low_power_stop(void) | ||
| 181 | { | ||
| 182 | _omap2xxx_set_apll_autoidle(OMAP2XXX_APLL_AUTOIDLE_DISABLE, | ||
| 183 | OMAP24XX_AUTO_54M_MASK); | ||
| 184 | } | ||
| 185 | |||
| 186 | void omap2xxx_cm_set_apll96_disable_autoidle(void) | ||
| 187 | { | ||
| 188 | _omap2xxx_set_apll_autoidle(OMAP2XXX_APLL_AUTOIDLE_LOW_POWER_STOP, | ||
| 189 | OMAP24XX_AUTO_96M_MASK); | ||
| 190 | } | ||
| 191 | |||
| 192 | void omap2xxx_cm_set_apll96_auto_low_power_stop(void) | ||
| 193 | { | ||
| 194 | _omap2xxx_set_apll_autoidle(OMAP2XXX_APLL_AUTOIDLE_DISABLE, | ||
| 195 | OMAP24XX_AUTO_96M_MASK); | ||
| 196 | } | ||
| 128 | 197 | ||
| 129 | /* | 198 | /* |
| 130 | * | 199 | * |
diff --git a/arch/arm/mach-omap2/cm2xxx_3xxx.h b/arch/arm/mach-omap2/cm2xxx_3xxx.h index 5e9ea5bd60b..088bbad73db 100644 --- a/arch/arm/mach-omap2/cm2xxx_3xxx.h +++ b/arch/arm/mach-omap2/cm2xxx_3xxx.h | |||
| @@ -122,6 +122,14 @@ extern void omap3xxx_cm_clkdm_disable_hwsup(s16 module, u32 mask); | |||
| 122 | extern void omap3xxx_cm_clkdm_force_sleep(s16 module, u32 mask); | 122 | extern void omap3xxx_cm_clkdm_force_sleep(s16 module, u32 mask); |
| 123 | extern void omap3xxx_cm_clkdm_force_wakeup(s16 module, u32 mask); | 123 | extern void omap3xxx_cm_clkdm_force_wakeup(s16 module, u32 mask); |
| 124 | 124 | ||
| 125 | extern void omap2xxx_cm_set_dpll_disable_autoidle(void); | ||
| 126 | extern void omap2xxx_cm_set_dpll_auto_low_power_stop(void); | ||
| 127 | |||
| 128 | extern void omap2xxx_cm_set_apll54_disable_autoidle(void); | ||
| 129 | extern void omap2xxx_cm_set_apll54_auto_low_power_stop(void); | ||
| 130 | extern void omap2xxx_cm_set_apll96_disable_autoidle(void); | ||
| 131 | extern void omap2xxx_cm_set_apll96_auto_low_power_stop(void); | ||
| 132 | |||
| 125 | #endif | 133 | #endif |
| 126 | 134 | ||
| 127 | /* CM register bits shared between 24XX and 3430 */ | 135 | /* CM register bits shared between 24XX and 3430 */ |
diff --git a/arch/arm/mach-omap2/cm44xx.h b/arch/arm/mach-omap2/cm44xx.h index 48fc3f426fb..0b87ec82b41 100644 --- a/arch/arm/mach-omap2/cm44xx.h +++ b/arch/arm/mach-omap2/cm44xx.h | |||
| @@ -21,6 +21,7 @@ | |||
| 21 | #include "cm.h" | 21 | #include "cm.h" |
| 22 | 22 | ||
| 23 | #define OMAP4_CM_CLKSTCTRL 0x0000 | 23 | #define OMAP4_CM_CLKSTCTRL 0x0000 |
| 24 | #define OMAP4_CM_STATICDEP 0x0004 | ||
| 24 | 25 | ||
| 25 | /* Function prototypes */ | 26 | /* Function prototypes */ |
| 26 | # ifndef __ASSEMBLER__ | 27 | # ifndef __ASSEMBLER__ |
diff --git a/arch/arm/mach-omap2/cminst44xx.c b/arch/arm/mach-omap2/cminst44xx.c index c04bbbea17a..a482bfa0a95 100644 --- a/arch/arm/mach-omap2/cminst44xx.c +++ b/arch/arm/mach-omap2/cminst44xx.c | |||
| @@ -73,6 +73,27 @@ u32 omap4_cminst_rmw_inst_reg_bits(u32 mask, u32 bits, u8 part, s16 inst, | |||
| 73 | return v; | 73 | return v; |
| 74 | } | 74 | } |
| 75 | 75 | ||
| 76 | u32 omap4_cminst_set_inst_reg_bits(u32 bits, u8 part, s16 inst, s16 idx) | ||
| 77 | { | ||
| 78 | return omap4_cminst_rmw_inst_reg_bits(bits, bits, part, inst, idx); | ||
| 79 | } | ||
| 80 | |||
| 81 | u32 omap4_cminst_clear_inst_reg_bits(u32 bits, u8 part, s16 inst, s16 idx) | ||
| 82 | { | ||
| 83 | return omap4_cminst_rmw_inst_reg_bits(bits, 0x0, part, inst, idx); | ||
| 84 | } | ||
| 85 | |||
| 86 | u32 omap4_cminst_read_inst_reg_bits(u8 part, u16 inst, s16 idx, u32 mask) | ||
| 87 | { | ||
| 88 | u32 v; | ||
| 89 | |||
| 90 | v = omap4_cminst_read_inst_reg(part, inst, idx); | ||
| 91 | v &= mask; | ||
| 92 | v >>= __ffs(mask); | ||
| 93 | |||
| 94 | return v; | ||
| 95 | } | ||
| 96 | |||
| 76 | /* | 97 | /* |
| 77 | * | 98 | * |
| 78 | */ | 99 | */ |
diff --git a/arch/arm/mach-omap2/cminst44xx.h b/arch/arm/mach-omap2/cminst44xx.h index a6abd0a8cb8..2b32c181a2e 100644 --- a/arch/arm/mach-omap2/cminst44xx.h +++ b/arch/arm/mach-omap2/cminst44xx.h | |||
| @@ -25,6 +25,12 @@ extern u32 omap4_cminst_read_inst_reg(u8 part, s16 inst, u16 idx); | |||
| 25 | extern void omap4_cminst_write_inst_reg(u32 val, u8 part, s16 inst, u16 idx); | 25 | extern void omap4_cminst_write_inst_reg(u32 val, u8 part, s16 inst, u16 idx); |
| 26 | extern u32 omap4_cminst_rmw_inst_reg_bits(u32 mask, u32 bits, u8 part, | 26 | extern u32 omap4_cminst_rmw_inst_reg_bits(u32 mask, u32 bits, u8 part, |
| 27 | s16 inst, s16 idx); | 27 | s16 inst, s16 idx); |
| 28 | extern u32 omap4_cminst_set_inst_reg_bits(u32 bits, u8 part, s16 inst, | ||
| 29 | s16 idx); | ||
| 30 | extern u32 omap4_cminst_clear_inst_reg_bits(u32 bits, u8 part, s16 inst, | ||
| 31 | s16 idx); | ||
| 32 | extern u32 omap4_cminst_read_inst_reg_bits(u8 part, u16 inst, s16 idx, | ||
| 33 | u32 mask); | ||
| 28 | 34 | ||
| 29 | extern int omap4_cm_wait_module_ready(void __iomem *clkctrl_reg); | 35 | extern int omap4_cm_wait_module_ready(void __iomem *clkctrl_reg); |
| 30 | 36 | ||
diff --git a/arch/arm/mach-omap2/common.c b/arch/arm/mach-omap2/common.c index 48de4513de4..3f20cbb9967 100644 --- a/arch/arm/mach-omap2/common.c +++ b/arch/arm/mach-omap2/common.c | |||
| @@ -50,9 +50,6 @@ static struct omap_globals omap242x_globals = { | |||
| 50 | .ctrl = OMAP242X_CTRL_BASE, | 50 | .ctrl = OMAP242X_CTRL_BASE, |
| 51 | .prm = OMAP2420_PRM_BASE, | 51 | .prm = OMAP2420_PRM_BASE, |
| 52 | .cm = OMAP2420_CM_BASE, | 52 | .cm = OMAP2420_CM_BASE, |
| 53 | .uart1_phys = OMAP2_UART1_BASE, | ||
| 54 | .uart2_phys = OMAP2_UART2_BASE, | ||
| 55 | .uart3_phys = OMAP2_UART3_BASE, | ||
| 56 | }; | 53 | }; |
| 57 | 54 | ||
| 58 | void __init omap2_set_globals_242x(void) | 55 | void __init omap2_set_globals_242x(void) |
| @@ -71,9 +68,6 @@ static struct omap_globals omap243x_globals = { | |||
| 71 | .ctrl = OMAP243X_CTRL_BASE, | 68 | .ctrl = OMAP243X_CTRL_BASE, |
| 72 | .prm = OMAP2430_PRM_BASE, | 69 | .prm = OMAP2430_PRM_BASE, |
| 73 | .cm = OMAP2430_CM_BASE, | 70 | .cm = OMAP2430_CM_BASE, |
| 74 | .uart1_phys = OMAP2_UART1_BASE, | ||
| 75 | .uart2_phys = OMAP2_UART2_BASE, | ||
| 76 | .uart3_phys = OMAP2_UART3_BASE, | ||
| 77 | }; | 71 | }; |
| 78 | 72 | ||
| 79 | void __init omap2_set_globals_243x(void) | 73 | void __init omap2_set_globals_243x(void) |
| @@ -92,10 +86,6 @@ static struct omap_globals omap3_globals = { | |||
| 92 | .ctrl = OMAP343X_CTRL_BASE, | 86 | .ctrl = OMAP343X_CTRL_BASE, |
| 93 | .prm = OMAP3430_PRM_BASE, | 87 | .prm = OMAP3430_PRM_BASE, |
| 94 | .cm = OMAP3430_CM_BASE, | 88 | .cm = OMAP3430_CM_BASE, |
| 95 | .uart1_phys = OMAP3_UART1_BASE, | ||
| 96 | .uart2_phys = OMAP3_UART2_BASE, | ||
| 97 | .uart3_phys = OMAP3_UART3_BASE, | ||
| 98 | .uart4_phys = OMAP3_UART4_BASE, /* Only on 3630 */ | ||
| 99 | }; | 89 | }; |
| 100 | 90 | ||
| 101 | void __init omap2_set_globals_3xxx(void) | 91 | void __init omap2_set_globals_3xxx(void) |
| @@ -140,10 +130,6 @@ static struct omap_globals omap4_globals = { | |||
| 140 | .prm = OMAP4430_PRM_BASE, | 130 | .prm = OMAP4430_PRM_BASE, |
| 141 | .cm = OMAP4430_CM_BASE, | 131 | .cm = OMAP4430_CM_BASE, |
| 142 | .cm2 = OMAP4430_CM2_BASE, | 132 | .cm2 = OMAP4430_CM2_BASE, |
| 143 | .uart1_phys = OMAP4_UART1_BASE, | ||
| 144 | .uart2_phys = OMAP4_UART2_BASE, | ||
| 145 | .uart3_phys = OMAP4_UART3_BASE, | ||
| 146 | .uart4_phys = OMAP4_UART4_BASE, | ||
| 147 | }; | 133 | }; |
| 148 | 134 | ||
| 149 | void __init omap2_set_globals_443x(void) | 135 | void __init omap2_set_globals_443x(void) |
diff --git a/arch/arm/mach-omap2/cpuidle34xx.c b/arch/arm/mach-omap2/cpuidle34xx.c index f7b22a16f38..a44c5230340 100644 --- a/arch/arm/mach-omap2/cpuidle34xx.c +++ b/arch/arm/mach-omap2/cpuidle34xx.c | |||
| @@ -58,6 +58,7 @@ struct omap3_processor_cx { | |||
| 58 | u32 core_state; | 58 | u32 core_state; |
| 59 | u32 threshold; | 59 | u32 threshold; |
| 60 | u32 flags; | 60 | u32 flags; |
| 61 | const char *desc; | ||
| 61 | }; | 62 | }; |
| 62 | 63 | ||
| 63 | struct omap3_processor_cx omap3_power_states[OMAP3_MAX_STATES]; | 64 | struct omap3_processor_cx omap3_power_states[OMAP3_MAX_STATES]; |
| @@ -99,14 +100,14 @@ static int omap3_idle_bm_check(void) | |||
| 99 | static int _cpuidle_allow_idle(struct powerdomain *pwrdm, | 100 | static int _cpuidle_allow_idle(struct powerdomain *pwrdm, |
| 100 | struct clockdomain *clkdm) | 101 | struct clockdomain *clkdm) |
| 101 | { | 102 | { |
| 102 | omap2_clkdm_allow_idle(clkdm); | 103 | clkdm_allow_idle(clkdm); |
| 103 | return 0; | 104 | return 0; |
| 104 | } | 105 | } |
| 105 | 106 | ||
| 106 | static int _cpuidle_deny_idle(struct powerdomain *pwrdm, | 107 | static int _cpuidle_deny_idle(struct powerdomain *pwrdm, |
| 107 | struct clockdomain *clkdm) | 108 | struct clockdomain *clkdm) |
| 108 | { | 109 | { |
| 109 | omap2_clkdm_deny_idle(clkdm); | 110 | clkdm_deny_idle(clkdm); |
| 110 | return 0; | 111 | return 0; |
| 111 | } | 112 | } |
| 112 | 113 | ||
| @@ -365,6 +366,7 @@ void omap_init_power_states(void) | |||
| 365 | omap3_power_states[OMAP3_STATE_C1].mpu_state = PWRDM_POWER_ON; | 366 | omap3_power_states[OMAP3_STATE_C1].mpu_state = PWRDM_POWER_ON; |
| 366 | omap3_power_states[OMAP3_STATE_C1].core_state = PWRDM_POWER_ON; | 367 | omap3_power_states[OMAP3_STATE_C1].core_state = PWRDM_POWER_ON; |
| 367 | omap3_power_states[OMAP3_STATE_C1].flags = CPUIDLE_FLAG_TIME_VALID; | 368 | omap3_power_states[OMAP3_STATE_C1].flags = CPUIDLE_FLAG_TIME_VALID; |
| 369 | omap3_power_states[OMAP3_STATE_C1].desc = "MPU ON + CORE ON"; | ||
| 368 | 370 | ||
| 369 | /* C2 . MPU WFI + Core inactive */ | 371 | /* C2 . MPU WFI + Core inactive */ |
| 370 | omap3_power_states[OMAP3_STATE_C2].valid = | 372 | omap3_power_states[OMAP3_STATE_C2].valid = |
| @@ -380,6 +382,7 @@ void omap_init_power_states(void) | |||
| 380 | omap3_power_states[OMAP3_STATE_C2].core_state = PWRDM_POWER_ON; | 382 | omap3_power_states[OMAP3_STATE_C2].core_state = PWRDM_POWER_ON; |
| 381 | omap3_power_states[OMAP3_STATE_C2].flags = CPUIDLE_FLAG_TIME_VALID | | 383 | omap3_power_states[OMAP3_STATE_C2].flags = CPUIDLE_FLAG_TIME_VALID | |
| 382 | CPUIDLE_FLAG_CHECK_BM; | 384 | CPUIDLE_FLAG_CHECK_BM; |
| 385 | omap3_power_states[OMAP3_STATE_C2].desc = "MPU ON + CORE ON"; | ||
| 383 | 386 | ||
| 384 | /* C3 . MPU CSWR + Core inactive */ | 387 | /* C3 . MPU CSWR + Core inactive */ |
| 385 | omap3_power_states[OMAP3_STATE_C3].valid = | 388 | omap3_power_states[OMAP3_STATE_C3].valid = |
| @@ -395,6 +398,7 @@ void omap_init_power_states(void) | |||
| 395 | omap3_power_states[OMAP3_STATE_C3].core_state = PWRDM_POWER_ON; | 398 | omap3_power_states[OMAP3_STATE_C3].core_state = PWRDM_POWER_ON; |
| 396 | omap3_power_states[OMAP3_STATE_C3].flags = CPUIDLE_FLAG_TIME_VALID | | 399 | omap3_power_states[OMAP3_STATE_C3].flags = CPUIDLE_FLAG_TIME_VALID | |
| 397 | CPUIDLE_FLAG_CHECK_BM; | 400 | CPUIDLE_FLAG_CHECK_BM; |
| 401 | omap3_power_states[OMAP3_STATE_C3].desc = "MPU RET + CORE ON"; | ||
| 398 | 402 | ||
| 399 | /* C4 . MPU OFF + Core inactive */ | 403 | /* C4 . MPU OFF + Core inactive */ |
| 400 | omap3_power_states[OMAP3_STATE_C4].valid = | 404 | omap3_power_states[OMAP3_STATE_C4].valid = |
| @@ -410,6 +414,7 @@ void omap_init_power_states(void) | |||
| 410 | omap3_power_states[OMAP3_STATE_C4].core_state = PWRDM_POWER_ON; | 414 | omap3_power_states[OMAP3_STATE_C4].core_state = PWRDM_POWER_ON; |
| 411 | omap3_power_states[OMAP3_STATE_C4].flags = CPUIDLE_FLAG_TIME_VALID | | 415 | omap3_power_states[OMAP3_STATE_C4].flags = CPUIDLE_FLAG_TIME_VALID | |
| 412 | CPUIDLE_FLAG_CHECK_BM; | 416 | CPUIDLE_FLAG_CHECK_BM; |
| 417 | omap3_power_states[OMAP3_STATE_C4].desc = "MPU OFF + CORE ON"; | ||
| 413 | 418 | ||
| 414 | /* C5 . MPU CSWR + Core CSWR*/ | 419 | /* C5 . MPU CSWR + Core CSWR*/ |
| 415 | omap3_power_states[OMAP3_STATE_C5].valid = | 420 | omap3_power_states[OMAP3_STATE_C5].valid = |
| @@ -425,6 +430,7 @@ void omap_init_power_states(void) | |||
| 425 | omap3_power_states[OMAP3_STATE_C5].core_state = PWRDM_POWER_RET; | 430 | omap3_power_states[OMAP3_STATE_C5].core_state = PWRDM_POWER_RET; |
| 426 | omap3_power_states[OMAP3_STATE_C5].flags = CPUIDLE_FLAG_TIME_VALID | | 431 | omap3_power_states[OMAP3_STATE_C5].flags = CPUIDLE_FLAG_TIME_VALID | |
| 427 | CPUIDLE_FLAG_CHECK_BM; | 432 | CPUIDLE_FLAG_CHECK_BM; |
| 433 | omap3_power_states[OMAP3_STATE_C5].desc = "MPU RET + CORE RET"; | ||
| 428 | 434 | ||
| 429 | /* C6 . MPU OFF + Core CSWR */ | 435 | /* C6 . MPU OFF + Core CSWR */ |
| 430 | omap3_power_states[OMAP3_STATE_C6].valid = | 436 | omap3_power_states[OMAP3_STATE_C6].valid = |
| @@ -440,6 +446,7 @@ void omap_init_power_states(void) | |||
| 440 | omap3_power_states[OMAP3_STATE_C6].core_state = PWRDM_POWER_RET; | 446 | omap3_power_states[OMAP3_STATE_C6].core_state = PWRDM_POWER_RET; |
| 441 | omap3_power_states[OMAP3_STATE_C6].flags = CPUIDLE_FLAG_TIME_VALID | | 447 | omap3_power_states[OMAP3_STATE_C6].flags = CPUIDLE_FLAG_TIME_VALID | |
| 442 | CPUIDLE_FLAG_CHECK_BM; | 448 | CPUIDLE_FLAG_CHECK_BM; |
| 449 | omap3_power_states[OMAP3_STATE_C6].desc = "MPU OFF + CORE RET"; | ||
| 443 | 450 | ||
| 444 | /* C7 . MPU OFF + Core OFF */ | 451 | /* C7 . MPU OFF + Core OFF */ |
| 445 | omap3_power_states[OMAP3_STATE_C7].valid = | 452 | omap3_power_states[OMAP3_STATE_C7].valid = |
| @@ -455,6 +462,7 @@ void omap_init_power_states(void) | |||
| 455 | omap3_power_states[OMAP3_STATE_C7].core_state = PWRDM_POWER_OFF; | 462 | omap3_power_states[OMAP3_STATE_C7].core_state = PWRDM_POWER_OFF; |
| 456 | omap3_power_states[OMAP3_STATE_C7].flags = CPUIDLE_FLAG_TIME_VALID | | 463 | omap3_power_states[OMAP3_STATE_C7].flags = CPUIDLE_FLAG_TIME_VALID | |
| 457 | CPUIDLE_FLAG_CHECK_BM; | 464 | CPUIDLE_FLAG_CHECK_BM; |
| 465 | omap3_power_states[OMAP3_STATE_C7].desc = "MPU OFF + CORE OFF"; | ||
| 458 | 466 | ||
| 459 | /* | 467 | /* |
| 460 | * Erratum i583: implementation for ES rev < Es1.2 on 3630. We cannot | 468 | * Erratum i583: implementation for ES rev < Es1.2 on 3630. We cannot |
| @@ -464,7 +472,7 @@ void omap_init_power_states(void) | |||
| 464 | if (IS_PM34XX_ERRATUM(PM_SDRC_WAKEUP_ERRATUM_i583)) { | 472 | if (IS_PM34XX_ERRATUM(PM_SDRC_WAKEUP_ERRATUM_i583)) { |
| 465 | omap3_power_states[OMAP3_STATE_C7].valid = 0; | 473 | omap3_power_states[OMAP3_STATE_C7].valid = 0; |
| 466 | cpuidle_params_table[OMAP3_STATE_C7].valid = 0; | 474 | cpuidle_params_table[OMAP3_STATE_C7].valid = 0; |
| 467 | WARN_ONCE(1, "%s: core off state C7 disabled due to i583\n", | 475 | pr_warn("%s: core off state C7 disabled due to i583\n", |
| 468 | __func__); | 476 | __func__); |
| 469 | } | 477 | } |
| 470 | } | 478 | } |
| @@ -512,6 +520,7 @@ int __init omap3_idle_init(void) | |||
| 512 | if (cx->type == OMAP3_STATE_C1) | 520 | if (cx->type == OMAP3_STATE_C1) |
| 513 | dev->safe_state = state; | 521 | dev->safe_state = state; |
| 514 | sprintf(state->name, "C%d", count+1); | 522 | sprintf(state->name, "C%d", count+1); |
| 523 | strncpy(state->desc, cx->desc, CPUIDLE_DESC_LEN); | ||
| 515 | count++; | 524 | count++; |
| 516 | } | 525 | } |
| 517 | 526 | ||
diff --git a/arch/arm/mach-omap2/dpll44xx.c b/arch/arm/mach-omap2/dpll44xx.c new file mode 100644 index 00000000000..4e4da6160d0 --- /dev/null +++ b/arch/arm/mach-omap2/dpll44xx.c | |||
| @@ -0,0 +1,84 @@ | |||
| 1 | /* | ||
| 2 | * OMAP4-specific DPLL control functions | ||
| 3 | * | ||
| 4 | * Copyright (C) 2011 Texas Instruments, Inc. | ||
| 5 | * Rajendra Nayak | ||
| 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/errno.h> | ||
| 14 | #include <linux/clk.h> | ||
| 15 | #include <linux/io.h> | ||
| 16 | #include <linux/bitops.h> | ||
| 17 | |||
| 18 | #include <plat/cpu.h> | ||
| 19 | #include <plat/clock.h> | ||
| 20 | |||
| 21 | #include "clock.h" | ||
| 22 | #include "cm-regbits-44xx.h" | ||
| 23 | |||
| 24 | /* Supported only on OMAP4 */ | ||
| 25 | int omap4_dpllmx_gatectrl_read(struct clk *clk) | ||
| 26 | { | ||
| 27 | u32 v; | ||
| 28 | u32 mask; | ||
| 29 | |||
| 30 | if (!clk || !clk->clksel_reg || !cpu_is_omap44xx()) | ||
| 31 | return -EINVAL; | ||
| 32 | |||
| 33 | mask = clk->flags & CLOCK_CLKOUTX2 ? | ||
| 34 | OMAP4430_DPLL_CLKOUTX2_GATE_CTRL_MASK : | ||
| 35 | OMAP4430_DPLL_CLKOUT_GATE_CTRL_MASK; | ||
| 36 | |||
| 37 | v = __raw_readl(clk->clksel_reg); | ||
| 38 | v &= mask; | ||
| 39 | v >>= __ffs(mask); | ||
| 40 | |||
| 41 | return v; | ||
| 42 | } | ||
| 43 | |||
| 44 | void omap4_dpllmx_allow_gatectrl(struct clk *clk) | ||
| 45 | { | ||
| 46 | u32 v; | ||
| 47 | u32 mask; | ||
| 48 | |||
| 49 | if (!clk || !clk->clksel_reg || !cpu_is_omap44xx()) | ||
| 50 | return; | ||
| 51 | |||
| 52 | mask = clk->flags & CLOCK_CLKOUTX2 ? | ||
| 53 | OMAP4430_DPLL_CLKOUTX2_GATE_CTRL_MASK : | ||
| 54 | OMAP4430_DPLL_CLKOUT_GATE_CTRL_MASK; | ||
| 55 | |||
| 56 | v = __raw_readl(clk->clksel_reg); | ||
| 57 | /* Clear the bit to allow gatectrl */ | ||
| 58 | v &= ~mask; | ||
| 59 | __raw_writel(v, clk->clksel_reg); | ||
| 60 | } | ||
| 61 | |||
| 62 | void omap4_dpllmx_deny_gatectrl(struct clk *clk) | ||
| 63 | { | ||
| 64 | u32 v; | ||
| 65 | u32 mask; | ||
| 66 | |||
| 67 | if (!clk || !clk->clksel_reg || !cpu_is_omap44xx()) | ||
| 68 | return; | ||
| 69 | |||
| 70 | mask = clk->flags & CLOCK_CLKOUTX2 ? | ||
| 71 | OMAP4430_DPLL_CLKOUTX2_GATE_CTRL_MASK : | ||
| 72 | OMAP4430_DPLL_CLKOUT_GATE_CTRL_MASK; | ||
| 73 | |||
| 74 | v = __raw_readl(clk->clksel_reg); | ||
| 75 | /* Set the bit to deny gatectrl */ | ||
| 76 | v |= mask; | ||
| 77 | __raw_writel(v, clk->clksel_reg); | ||
| 78 | } | ||
| 79 | |||
| 80 | const struct clkops clkops_omap4_dpllmx_ops = { | ||
| 81 | .allow_idle = omap4_dpllmx_allow_gatectrl, | ||
| 82 | .deny_idle = omap4_dpllmx_deny_gatectrl, | ||
| 83 | }; | ||
| 84 | |||
diff --git a/arch/arm/mach-omap2/include/mach/omap4-common.h b/arch/arm/mach-omap2/include/mach/omap4-common.h index 5b0270b2893..de441c05a6a 100644 --- a/arch/arm/mach-omap2/include/mach/omap4-common.h +++ b/arch/arm/mach-omap2/include/mach/omap4-common.h | |||
| @@ -17,8 +17,12 @@ | |||
| 17 | * wfi used in low power code. Directly opcode is used instead | 17 | * wfi used in low power code. Directly opcode is used instead |
| 18 | * of instruction to avoid mulit-omap build break | 18 | * of instruction to avoid mulit-omap build break |
| 19 | */ | 19 | */ |
| 20 | #ifdef CONFIG_THUMB2_KERNEL | ||
| 21 | #define do_wfi() __asm__ __volatile__ ("wfi" : : : "memory") | ||
| 22 | #else | ||
| 20 | #define do_wfi() \ | 23 | #define do_wfi() \ |
| 21 | __asm__ __volatile__ (".word 0xe320f003" : : : "memory") | 24 | __asm__ __volatile__ (".word 0xe320f003" : : : "memory") |
| 25 | #endif | ||
| 22 | 26 | ||
| 23 | #ifdef CONFIG_CACHE_L2X0 | 27 | #ifdef CONFIG_CACHE_L2X0 |
| 24 | extern void __iomem *l2cache_base; | 28 | extern void __iomem *l2cache_base; |
diff --git a/arch/arm/mach-omap2/io.c b/arch/arm/mach-omap2/io.c index 657f3c84687..441e79d043a 100644 --- a/arch/arm/mach-omap2/io.c +++ b/arch/arm/mach-omap2/io.c | |||
| @@ -356,15 +356,15 @@ void __init omap2_init_common_infrastructure(void) | |||
| 356 | 356 | ||
| 357 | if (cpu_is_omap242x()) { | 357 | if (cpu_is_omap242x()) { |
| 358 | omap2xxx_powerdomains_init(); | 358 | omap2xxx_powerdomains_init(); |
| 359 | omap2_clockdomains_init(); | 359 | omap2xxx_clockdomains_init(); |
| 360 | omap2420_hwmod_init(); | 360 | omap2420_hwmod_init(); |
| 361 | } else if (cpu_is_omap243x()) { | 361 | } else if (cpu_is_omap243x()) { |
| 362 | omap2xxx_powerdomains_init(); | 362 | omap2xxx_powerdomains_init(); |
| 363 | omap2_clockdomains_init(); | 363 | omap2xxx_clockdomains_init(); |
| 364 | omap2430_hwmod_init(); | 364 | omap2430_hwmod_init(); |
| 365 | } else if (cpu_is_omap34xx()) { | 365 | } else if (cpu_is_omap34xx()) { |
| 366 | omap3xxx_powerdomains_init(); | 366 | omap3xxx_powerdomains_init(); |
| 367 | omap2_clockdomains_init(); | 367 | omap3xxx_clockdomains_init(); |
| 368 | omap3xxx_hwmod_init(); | 368 | omap3xxx_hwmod_init(); |
| 369 | } else if (cpu_is_omap44xx()) { | 369 | } else if (cpu_is_omap44xx()) { |
| 370 | omap44xx_powerdomains_init(); | 370 | omap44xx_powerdomains_init(); |
diff --git a/arch/arm/mach-omap2/mailbox.c b/arch/arm/mach-omap2/mailbox.c index 6e15e3d7c65..86d564a640b 100644 --- a/arch/arm/mach-omap2/mailbox.c +++ b/arch/arm/mach-omap2/mailbox.c | |||
| @@ -138,10 +138,12 @@ static void omap2_mbox_disable_irq(struct omap_mbox *mbox, | |||
| 138 | omap_mbox_type_t irq) | 138 | omap_mbox_type_t irq) |
| 139 | { | 139 | { |
| 140 | struct omap_mbox2_priv *p = mbox->priv; | 140 | struct omap_mbox2_priv *p = mbox->priv; |
| 141 | u32 l, bit = (irq == IRQ_TX) ? p->notfull_bit : p->newmsg_bit; | 141 | u32 bit = (irq == IRQ_TX) ? p->notfull_bit : p->newmsg_bit; |
| 142 | l = mbox_read_reg(p->irqdisable); | 142 | |
| 143 | l &= ~bit; | 143 | if (!cpu_is_omap44xx()) |
| 144 | mbox_write_reg(l, p->irqdisable); | 144 | bit = mbox_read_reg(p->irqdisable) & ~bit; |
| 145 | |||
| 146 | mbox_write_reg(bit, p->irqdisable); | ||
| 145 | } | 147 | } |
| 146 | 148 | ||
| 147 | static void omap2_mbox_ack_irq(struct omap_mbox *mbox, | 149 | static void omap2_mbox_ack_irq(struct omap_mbox *mbox, |
diff --git a/arch/arm/mach-omap2/mux.c b/arch/arm/mach-omap2/mux.c index 6c84659cf84..bb043cbb388 100644 --- a/arch/arm/mach-omap2/mux.c +++ b/arch/arm/mach-omap2/mux.c | |||
| @@ -258,7 +258,7 @@ struct omap_hwmod_mux_info * __init | |||
| 258 | omap_hwmod_mux_init(struct omap_device_pad *bpads, int nr_pads) | 258 | omap_hwmod_mux_init(struct omap_device_pad *bpads, int nr_pads) |
| 259 | { | 259 | { |
| 260 | struct omap_hwmod_mux_info *hmux; | 260 | struct omap_hwmod_mux_info *hmux; |
| 261 | int i; | 261 | int i, nr_pads_dynamic = 0; |
| 262 | 262 | ||
| 263 | if (!bpads || nr_pads < 1) | 263 | if (!bpads || nr_pads < 1) |
| 264 | return NULL; | 264 | return NULL; |
| @@ -302,9 +302,40 @@ omap_hwmod_mux_init(struct omap_device_pad *bpads, int nr_pads) | |||
| 302 | pad->enable = bpad->enable; | 302 | pad->enable = bpad->enable; |
| 303 | pad->idle = bpad->idle; | 303 | pad->idle = bpad->idle; |
| 304 | pad->off = bpad->off; | 304 | pad->off = bpad->off; |
| 305 | |||
| 306 | if (pad->flags & OMAP_DEVICE_PAD_REMUX) | ||
| 307 | nr_pads_dynamic++; | ||
| 308 | |||
| 305 | pr_debug("%s: Initialized %s\n", __func__, pad->name); | 309 | pr_debug("%s: Initialized %s\n", __func__, pad->name); |
| 306 | } | 310 | } |
| 307 | 311 | ||
| 312 | if (!nr_pads_dynamic) | ||
| 313 | return hmux; | ||
| 314 | |||
| 315 | /* | ||
| 316 | * Add pads that need dynamic muxing into a separate list | ||
| 317 | */ | ||
| 318 | |||
| 319 | hmux->nr_pads_dynamic = nr_pads_dynamic; | ||
| 320 | hmux->pads_dynamic = kzalloc(sizeof(struct omap_device_pad *) * | ||
| 321 | nr_pads_dynamic, GFP_KERNEL); | ||
| 322 | if (!hmux->pads_dynamic) { | ||
| 323 | pr_err("%s: Could not allocate dynamic pads\n", __func__); | ||
| 324 | return hmux; | ||
| 325 | } | ||
| 326 | |||
| 327 | nr_pads_dynamic = 0; | ||
| 328 | for (i = 0; i < hmux->nr_pads; i++) { | ||
| 329 | struct omap_device_pad *pad = &hmux->pads[i]; | ||
| 330 | |||
| 331 | if (pad->flags & OMAP_DEVICE_PAD_REMUX) { | ||
| 332 | pr_debug("%s: pad %s tagged dynamic\n", | ||
| 333 | __func__, pad->name); | ||
| 334 | hmux->pads_dynamic[nr_pads_dynamic] = pad; | ||
| 335 | nr_pads_dynamic++; | ||
| 336 | } | ||
| 337 | } | ||
| 338 | |||
| 308 | return hmux; | 339 | return hmux; |
| 309 | 340 | ||
| 310 | err3: | 341 | err3: |
| @@ -322,6 +353,36 @@ void omap_hwmod_mux(struct omap_hwmod_mux_info *hmux, u8 state) | |||
| 322 | { | 353 | { |
| 323 | int i; | 354 | int i; |
| 324 | 355 | ||
| 356 | /* Runtime idling of dynamic pads */ | ||
| 357 | if (state == _HWMOD_STATE_IDLE && hmux->enabled) { | ||
| 358 | for (i = 0; i < hmux->nr_pads_dynamic; i++) { | ||
| 359 | struct omap_device_pad *pad = hmux->pads_dynamic[i]; | ||
| 360 | int val = -EINVAL; | ||
| 361 | |||
| 362 | val = pad->idle; | ||
| 363 | omap_mux_write(pad->partition, val, | ||
| 364 | pad->mux->reg_offset); | ||
| 365 | } | ||
| 366 | |||
| 367 | return; | ||
| 368 | } | ||
| 369 | |||
| 370 | /* Runtime enabling of dynamic pads */ | ||
| 371 | if ((state == _HWMOD_STATE_ENABLED) && hmux->pads_dynamic | ||
| 372 | && hmux->enabled) { | ||
| 373 | for (i = 0; i < hmux->nr_pads_dynamic; i++) { | ||
| 374 | struct omap_device_pad *pad = hmux->pads_dynamic[i]; | ||
| 375 | int val = -EINVAL; | ||
| 376 | |||
| 377 | val = pad->enable; | ||
| 378 | omap_mux_write(pad->partition, val, | ||
| 379 | pad->mux->reg_offset); | ||
| 380 | } | ||
| 381 | |||
| 382 | return; | ||
| 383 | } | ||
| 384 | |||
| 385 | /* Enabling or disabling of all pads */ | ||
| 325 | for (i = 0; i < hmux->nr_pads; i++) { | 386 | for (i = 0; i < hmux->nr_pads; i++) { |
| 326 | struct omap_device_pad *pad = &hmux->pads[i]; | 387 | struct omap_device_pad *pad = &hmux->pads[i]; |
| 327 | int flags, val = -EINVAL; | 388 | int flags, val = -EINVAL; |
| @@ -330,31 +391,22 @@ void omap_hwmod_mux(struct omap_hwmod_mux_info *hmux, u8 state) | |||
| 330 | 391 | ||
| 331 | switch (state) { | 392 | switch (state) { |
| 332 | case _HWMOD_STATE_ENABLED: | 393 | case _HWMOD_STATE_ENABLED: |
| 333 | if (flags & OMAP_DEVICE_PAD_ENABLED) | ||
| 334 | break; | ||
| 335 | flags |= OMAP_DEVICE_PAD_ENABLED; | ||
| 336 | val = pad->enable; | 394 | val = pad->enable; |
| 337 | pr_debug("%s: Enabling %s %x\n", __func__, | 395 | pr_debug("%s: Enabling %s %x\n", __func__, |
| 338 | pad->name, val); | 396 | pad->name, val); |
| 339 | break; | 397 | break; |
| 340 | case _HWMOD_STATE_IDLE: | ||
| 341 | if (!(flags & OMAP_DEVICE_PAD_REMUX)) | ||
| 342 | break; | ||
| 343 | flags &= ~OMAP_DEVICE_PAD_ENABLED; | ||
| 344 | val = pad->idle; | ||
| 345 | pr_debug("%s: Idling %s %x\n", __func__, | ||
| 346 | pad->name, val); | ||
| 347 | break; | ||
| 348 | case _HWMOD_STATE_DISABLED: | 398 | case _HWMOD_STATE_DISABLED: |
| 349 | default: | ||
| 350 | /* Use safe mode unless OMAP_DEVICE_PAD_REMUX */ | 399 | /* Use safe mode unless OMAP_DEVICE_PAD_REMUX */ |
| 351 | if (flags & OMAP_DEVICE_PAD_REMUX) | 400 | if (flags & OMAP_DEVICE_PAD_REMUX) |
| 352 | val = pad->off; | 401 | val = pad->off; |
| 353 | else | 402 | else |
| 354 | val = OMAP_MUX_MODE7; | 403 | val = OMAP_MUX_MODE7; |
| 355 | flags &= ~OMAP_DEVICE_PAD_ENABLED; | ||
| 356 | pr_debug("%s: Disabling %s %x\n", __func__, | 404 | pr_debug("%s: Disabling %s %x\n", __func__, |
| 357 | pad->name, val); | 405 | pad->name, val); |
| 406 | break; | ||
| 407 | default: | ||
| 408 | /* Nothing to be done */ | ||
| 409 | break; | ||
| 358 | }; | 410 | }; |
| 359 | 411 | ||
| 360 | if (val >= 0) { | 412 | if (val >= 0) { |
| @@ -363,6 +415,11 @@ void omap_hwmod_mux(struct omap_hwmod_mux_info *hmux, u8 state) | |||
| 363 | pad->flags = flags; | 415 | pad->flags = flags; |
| 364 | } | 416 | } |
| 365 | } | 417 | } |
| 418 | |||
| 419 | if (state == _HWMOD_STATE_ENABLED) | ||
| 420 | hmux->enabled = true; | ||
| 421 | else | ||
| 422 | hmux->enabled = false; | ||
| 366 | } | 423 | } |
| 367 | 424 | ||
| 368 | #ifdef CONFIG_DEBUG_FS | 425 | #ifdef CONFIG_DEBUG_FS |
diff --git a/arch/arm/mach-omap2/mux.h b/arch/arm/mach-omap2/mux.h index a4ab17a737a..137f321c029 100644 --- a/arch/arm/mach-omap2/mux.h +++ b/arch/arm/mach-omap2/mux.h | |||
| @@ -159,7 +159,6 @@ struct omap_board_mux { | |||
| 159 | u16 value; | 159 | u16 value; |
| 160 | }; | 160 | }; |
| 161 | 161 | ||
| 162 | #define OMAP_DEVICE_PAD_ENABLED BIT(7) /* Not needed for board-*.c */ | ||
| 163 | #define OMAP_DEVICE_PAD_REMUX BIT(1) /* Dynamically remux a pad, | 162 | #define OMAP_DEVICE_PAD_REMUX BIT(1) /* Dynamically remux a pad, |
| 164 | needs enable, idle and off | 163 | needs enable, idle and off |
| 165 | values */ | 164 | values */ |
| @@ -187,6 +186,12 @@ struct omap_device_pad { | |||
| 187 | 186 | ||
| 188 | struct omap_hwmod_mux_info; | 187 | struct omap_hwmod_mux_info; |
| 189 | 188 | ||
| 189 | #define OMAP_MUX_STATIC(signal, mode) \ | ||
| 190 | { \ | ||
| 191 | .name = (signal), \ | ||
| 192 | .enable = (mode), \ | ||
| 193 | } | ||
| 194 | |||
| 190 | #if defined(CONFIG_OMAP_MUX) | 195 | #if defined(CONFIG_OMAP_MUX) |
| 191 | 196 | ||
| 192 | /** | 197 | /** |
diff --git a/arch/arm/mach-omap2/mux44xx.c b/arch/arm/mach-omap2/mux44xx.c index c322e7bdaa1..9a66445112a 100644 --- a/arch/arm/mach-omap2/mux44xx.c +++ b/arch/arm/mach-omap2/mux44xx.c | |||
| @@ -755,25 +755,9 @@ static struct omap_ball __initdata omap4_core_cbl_ball[] = { | |||
| 755 | #endif | 755 | #endif |
| 756 | 756 | ||
| 757 | /* | 757 | /* |
| 758 | * Superset of all mux modes for omap4 ES2.0 | 758 | * Signals different on ES2.0 compared to superset |
| 759 | */ | 759 | */ |
| 760 | static struct omap_mux __initdata omap4_es2_core_muxmodes[] = { | 760 | static struct omap_mux __initdata omap4_es2_core_subset[] = { |
| 761 | _OMAP4_MUXENTRY(GPMC_AD0, 0, "gpmc_ad0", "sdmmc2_dat0", NULL, NULL, | ||
| 762 | NULL, NULL, NULL, NULL), | ||
| 763 | _OMAP4_MUXENTRY(GPMC_AD1, 0, "gpmc_ad1", "sdmmc2_dat1", NULL, NULL, | ||
| 764 | NULL, NULL, NULL, NULL), | ||
| 765 | _OMAP4_MUXENTRY(GPMC_AD2, 0, "gpmc_ad2", "sdmmc2_dat2", NULL, NULL, | ||
| 766 | NULL, NULL, NULL, NULL), | ||
| 767 | _OMAP4_MUXENTRY(GPMC_AD3, 0, "gpmc_ad3", "sdmmc2_dat3", NULL, NULL, | ||
| 768 | NULL, NULL, NULL, NULL), | ||
| 769 | _OMAP4_MUXENTRY(GPMC_AD4, 0, "gpmc_ad4", "sdmmc2_dat4", | ||
| 770 | "sdmmc2_dir_dat0", NULL, NULL, NULL, NULL, NULL), | ||
| 771 | _OMAP4_MUXENTRY(GPMC_AD5, 0, "gpmc_ad5", "sdmmc2_dat5", | ||
| 772 | "sdmmc2_dir_dat1", NULL, NULL, NULL, NULL, NULL), | ||
| 773 | _OMAP4_MUXENTRY(GPMC_AD6, 0, "gpmc_ad6", "sdmmc2_dat6", | ||
| 774 | "sdmmc2_dir_cmd", NULL, NULL, NULL, NULL, NULL), | ||
| 775 | _OMAP4_MUXENTRY(GPMC_AD7, 0, "gpmc_ad7", "sdmmc2_dat7", | ||
| 776 | "sdmmc2_clk_fdbk", NULL, NULL, NULL, NULL, NULL), | ||
| 777 | _OMAP4_MUXENTRY(GPMC_AD8, 32, "gpmc_ad8", "kpd_row0", "c2c_data15", | 761 | _OMAP4_MUXENTRY(GPMC_AD8, 32, "gpmc_ad8", "kpd_row0", "c2c_data15", |
| 778 | "gpio_32", NULL, "sdmmc1_dat0", NULL, NULL), | 762 | "gpio_32", NULL, "sdmmc1_dat0", NULL, NULL), |
| 779 | _OMAP4_MUXENTRY(GPMC_AD9, 33, "gpmc_ad9", "kpd_row1", "c2c_data14", | 763 | _OMAP4_MUXENTRY(GPMC_AD9, 33, "gpmc_ad9", "kpd_row1", "c2c_data14", |
| @@ -792,52 +776,15 @@ static struct omap_mux __initdata omap4_es2_core_muxmodes[] = { | |||
| 792 | "gpio_39", NULL, "sdmmc1_dat7", NULL, NULL), | 776 | "gpio_39", NULL, "sdmmc1_dat7", NULL, NULL), |
| 793 | _OMAP4_MUXENTRY(GPMC_A16, 40, "gpmc_a16", "kpd_row4", "c2c_datain0", | 777 | _OMAP4_MUXENTRY(GPMC_A16, 40, "gpmc_a16", "kpd_row4", "c2c_datain0", |
| 794 | "gpio_40", "venc_656_data0", NULL, NULL, "safe_mode"), | 778 | "gpio_40", "venc_656_data0", NULL, NULL, "safe_mode"), |
| 795 | _OMAP4_MUXENTRY(GPMC_A17, 41, "gpmc_a17", "kpd_row5", "c2c_datain1", | ||
| 796 | "gpio_41", "venc_656_data1", NULL, NULL, "safe_mode"), | ||
| 797 | _OMAP4_MUXENTRY(GPMC_A18, 42, "gpmc_a18", "kpd_row6", "c2c_datain2", | ||
| 798 | "gpio_42", "venc_656_data2", NULL, NULL, "safe_mode"), | ||
| 799 | _OMAP4_MUXENTRY(GPMC_A19, 43, "gpmc_a19", "kpd_row7", "c2c_datain3", | ||
| 800 | "gpio_43", "venc_656_data3", NULL, NULL, "safe_mode"), | ||
| 801 | _OMAP4_MUXENTRY(GPMC_A20, 44, "gpmc_a20", "kpd_col4", "c2c_datain4", | ||
| 802 | "gpio_44", "venc_656_data4", NULL, NULL, "safe_mode"), | ||
| 803 | _OMAP4_MUXENTRY(GPMC_A21, 45, "gpmc_a21", "kpd_col5", "c2c_datain5", | ||
| 804 | "gpio_45", "venc_656_data5", NULL, NULL, "safe_mode"), | ||
| 805 | _OMAP4_MUXENTRY(GPMC_A22, 46, "gpmc_a22", "kpd_col6", "c2c_datain6", | ||
| 806 | "gpio_46", "venc_656_data6", NULL, NULL, "safe_mode"), | ||
| 807 | _OMAP4_MUXENTRY(GPMC_A23, 47, "gpmc_a23", "kpd_col7", "c2c_datain7", | ||
| 808 | "gpio_47", "venc_656_data7", NULL, NULL, "safe_mode"), | ||
| 809 | _OMAP4_MUXENTRY(GPMC_A24, 48, "gpmc_a24", "kpd_col8", "c2c_clkout0", | 779 | _OMAP4_MUXENTRY(GPMC_A24, 48, "gpmc_a24", "kpd_col8", "c2c_clkout0", |
| 810 | "gpio_48", NULL, NULL, NULL, "safe_mode"), | 780 | "gpio_48", NULL, NULL, NULL, "safe_mode"), |
| 811 | _OMAP4_MUXENTRY(GPMC_A25, 49, "gpmc_a25", NULL, "c2c_clkout1", | ||
| 812 | "gpio_49", NULL, NULL, NULL, "safe_mode"), | ||
| 813 | _OMAP4_MUXENTRY(GPMC_NCS0, 50, "gpmc_ncs0", NULL, NULL, "gpio_50", | ||
| 814 | "sys_ndmareq0", NULL, NULL, NULL), | ||
| 815 | _OMAP4_MUXENTRY(GPMC_NCS1, 51, "gpmc_ncs1", NULL, "c2c_dataout6", | ||
| 816 | "gpio_51", NULL, NULL, NULL, "safe_mode"), | ||
| 817 | _OMAP4_MUXENTRY(GPMC_NCS2, 52, "gpmc_ncs2", "kpd_row8", | 781 | _OMAP4_MUXENTRY(GPMC_NCS2, 52, "gpmc_ncs2", "kpd_row8", |
| 818 | "c2c_dataout7", "gpio_52", NULL, NULL, NULL, | 782 | "c2c_dataout7", "gpio_52", NULL, NULL, NULL, |
| 819 | "safe_mode"), | 783 | "safe_mode"), |
| 820 | _OMAP4_MUXENTRY(GPMC_NCS3, 53, "gpmc_ncs3", "gpmc_dir", | ||
| 821 | "c2c_dataout4", "gpio_53", NULL, NULL, NULL, | ||
| 822 | "safe_mode"), | ||
| 823 | _OMAP4_MUXENTRY(GPMC_NWP, 54, "gpmc_nwp", "dsi1_te0", NULL, "gpio_54", | ||
| 824 | "sys_ndmareq1", NULL, NULL, NULL), | ||
| 825 | _OMAP4_MUXENTRY(GPMC_CLK, 55, "gpmc_clk", NULL, NULL, "gpio_55", | 784 | _OMAP4_MUXENTRY(GPMC_CLK, 55, "gpmc_clk", NULL, NULL, "gpio_55", |
| 826 | "sys_ndmareq2", "sdmmc1_cmd", NULL, NULL), | 785 | "sys_ndmareq2", "sdmmc1_cmd", NULL, NULL), |
| 827 | _OMAP4_MUXENTRY(GPMC_NADV_ALE, 56, "gpmc_nadv_ale", "dsi1_te1", NULL, | 786 | _OMAP4_MUXENTRY(GPMC_NADV_ALE, 56, "gpmc_nadv_ale", "dsi1_te1", NULL, |
| 828 | "gpio_56", "sys_ndmareq3", "sdmmc1_clk", NULL, NULL), | 787 | "gpio_56", "sys_ndmareq3", "sdmmc1_clk", NULL, NULL), |
| 829 | _OMAP4_MUXENTRY(GPMC_NOE, 0, "gpmc_noe", "sdmmc2_clk", NULL, NULL, | ||
| 830 | NULL, NULL, NULL, NULL), | ||
| 831 | _OMAP4_MUXENTRY(GPMC_NWE, 0, "gpmc_nwe", "sdmmc2_cmd", NULL, NULL, | ||
| 832 | NULL, NULL, NULL, NULL), | ||
| 833 | _OMAP4_MUXENTRY(GPMC_NBE0_CLE, 59, "gpmc_nbe0_cle", "dsi2_te0", NULL, | ||
| 834 | "gpio_59", NULL, NULL, NULL, NULL), | ||
| 835 | _OMAP4_MUXENTRY(GPMC_NBE1, 60, "gpmc_nbe1", NULL, "c2c_dataout5", | ||
| 836 | "gpio_60", NULL, NULL, NULL, "safe_mode"), | ||
| 837 | _OMAP4_MUXENTRY(GPMC_WAIT0, 61, "gpmc_wait0", "dsi2_te1", NULL, | ||
| 838 | "gpio_61", NULL, NULL, NULL, NULL), | ||
| 839 | _OMAP4_MUXENTRY(GPMC_WAIT1, 62, "gpmc_wait1", NULL, "c2c_dataout2", | ||
| 840 | "gpio_62", NULL, NULL, NULL, "safe_mode"), | ||
| 841 | _OMAP4_MUXENTRY(GPMC_WAIT2, 100, "gpmc_wait2", "usbc1_icusb_txen", | 788 | _OMAP4_MUXENTRY(GPMC_WAIT2, 100, "gpmc_wait2", "usbc1_icusb_txen", |
| 842 | "c2c_dataout3", "gpio_100", "sys_ndmareq0", NULL, | 789 | "c2c_dataout3", "gpio_100", "sys_ndmareq0", NULL, |
| 843 | NULL, "safe_mode"), | 790 | NULL, "safe_mode"), |
| @@ -851,62 +798,6 @@ static struct omap_mux __initdata omap4_es2_core_muxmodes[] = { | |||
| 851 | _OMAP4_MUXENTRY(GPMC_NCS7, 104, "gpmc_ncs7", "dsi2_te1", | 798 | _OMAP4_MUXENTRY(GPMC_NCS7, 104, "gpmc_ncs7", "dsi2_te1", |
| 852 | "c2c_dataout1", "gpio_104", NULL, NULL, NULL, | 799 | "c2c_dataout1", "gpio_104", NULL, NULL, NULL, |
| 853 | "safe_mode"), | 800 | "safe_mode"), |
| 854 | _OMAP4_MUXENTRY(HDMI_HPD, 63, "hdmi_hpd", NULL, NULL, "gpio_63", NULL, | ||
| 855 | NULL, NULL, "safe_mode"), | ||
| 856 | _OMAP4_MUXENTRY(HDMI_CEC, 64, "hdmi_cec", NULL, NULL, "gpio_64", NULL, | ||
| 857 | NULL, NULL, "safe_mode"), | ||
| 858 | _OMAP4_MUXENTRY(HDMI_DDC_SCL, 65, "hdmi_ddc_scl", NULL, NULL, | ||
| 859 | "gpio_65", NULL, NULL, NULL, "safe_mode"), | ||
| 860 | _OMAP4_MUXENTRY(HDMI_DDC_SDA, 66, "hdmi_ddc_sda", NULL, NULL, | ||
| 861 | "gpio_66", NULL, NULL, NULL, "safe_mode"), | ||
| 862 | _OMAP4_MUXENTRY(CSI21_DX0, 0, "csi21_dx0", NULL, NULL, "gpi_67", NULL, | ||
| 863 | NULL, NULL, "safe_mode"), | ||
| 864 | _OMAP4_MUXENTRY(CSI21_DY0, 0, "csi21_dy0", NULL, NULL, "gpi_68", NULL, | ||
| 865 | NULL, NULL, "safe_mode"), | ||
| 866 | _OMAP4_MUXENTRY(CSI21_DX1, 0, "csi21_dx1", NULL, NULL, "gpi_69", NULL, | ||
| 867 | NULL, NULL, "safe_mode"), | ||
| 868 | _OMAP4_MUXENTRY(CSI21_DY1, 0, "csi21_dy1", NULL, NULL, "gpi_70", NULL, | ||
| 869 | NULL, NULL, "safe_mode"), | ||
| 870 | _OMAP4_MUXENTRY(CSI21_DX2, 0, "csi21_dx2", NULL, NULL, "gpi_71", NULL, | ||
| 871 | NULL, NULL, "safe_mode"), | ||
| 872 | _OMAP4_MUXENTRY(CSI21_DY2, 0, "csi21_dy2", NULL, NULL, "gpi_72", NULL, | ||
| 873 | NULL, NULL, "safe_mode"), | ||
| 874 | _OMAP4_MUXENTRY(CSI21_DX3, 0, "csi21_dx3", NULL, NULL, "gpi_73", NULL, | ||
| 875 | NULL, NULL, "safe_mode"), | ||
| 876 | _OMAP4_MUXENTRY(CSI21_DY3, 0, "csi21_dy3", NULL, NULL, "gpi_74", NULL, | ||
| 877 | NULL, NULL, "safe_mode"), | ||
| 878 | _OMAP4_MUXENTRY(CSI21_DX4, 0, "csi21_dx4", NULL, NULL, "gpi_75", NULL, | ||
| 879 | NULL, NULL, "safe_mode"), | ||
| 880 | _OMAP4_MUXENTRY(CSI21_DY4, 0, "csi21_dy4", NULL, NULL, "gpi_76", NULL, | ||
| 881 | NULL, NULL, "safe_mode"), | ||
| 882 | _OMAP4_MUXENTRY(CSI22_DX0, 0, "csi22_dx0", NULL, NULL, "gpi_77", NULL, | ||
| 883 | NULL, NULL, "safe_mode"), | ||
| 884 | _OMAP4_MUXENTRY(CSI22_DY0, 0, "csi22_dy0", NULL, NULL, "gpi_78", NULL, | ||
| 885 | NULL, NULL, "safe_mode"), | ||
| 886 | _OMAP4_MUXENTRY(CSI22_DX1, 0, "csi22_dx1", NULL, NULL, "gpi_79", NULL, | ||
| 887 | NULL, NULL, "safe_mode"), | ||
| 888 | _OMAP4_MUXENTRY(CSI22_DY1, 0, "csi22_dy1", NULL, NULL, "gpi_80", NULL, | ||
| 889 | NULL, NULL, "safe_mode"), | ||
| 890 | _OMAP4_MUXENTRY(CAM_SHUTTER, 81, "cam_shutter", NULL, NULL, "gpio_81", | ||
| 891 | NULL, NULL, NULL, "safe_mode"), | ||
| 892 | _OMAP4_MUXENTRY(CAM_STROBE, 82, "cam_strobe", NULL, NULL, "gpio_82", | ||
| 893 | NULL, NULL, NULL, "safe_mode"), | ||
| 894 | _OMAP4_MUXENTRY(CAM_GLOBALRESET, 83, "cam_globalreset", NULL, NULL, | ||
| 895 | "gpio_83", NULL, NULL, NULL, "safe_mode"), | ||
| 896 | _OMAP4_MUXENTRY(USBB1_ULPITLL_CLK, 84, "usbb1_ulpitll_clk", | ||
| 897 | "hsi1_cawake", NULL, "gpio_84", "usbb1_ulpiphy_clk", | ||
| 898 | NULL, "hw_dbg20", "safe_mode"), | ||
| 899 | _OMAP4_MUXENTRY(USBB1_ULPITLL_STP, 85, "usbb1_ulpitll_stp", | ||
| 900 | "hsi1_cadata", "mcbsp4_clkr", "gpio_85", | ||
| 901 | "usbb1_ulpiphy_stp", "usbb1_mm_rxdp", "hw_dbg21", | ||
| 902 | "safe_mode"), | ||
| 903 | _OMAP4_MUXENTRY(USBB1_ULPITLL_DIR, 86, "usbb1_ulpitll_dir", | ||
| 904 | "hsi1_caflag", "mcbsp4_fsr", "gpio_86", | ||
| 905 | "usbb1_ulpiphy_dir", NULL, "hw_dbg22", "safe_mode"), | ||
| 906 | _OMAP4_MUXENTRY(USBB1_ULPITLL_NXT, 87, "usbb1_ulpitll_nxt", | ||
| 907 | "hsi1_acready", "mcbsp4_fsx", "gpio_87", | ||
| 908 | "usbb1_ulpiphy_nxt", "usbb1_mm_rxdm", "hw_dbg23", | ||
| 909 | "safe_mode"), | ||
| 910 | _OMAP4_MUXENTRY(USBB1_ULPITLL_DAT0, 88, "usbb1_ulpitll_dat0", | 801 | _OMAP4_MUXENTRY(USBB1_ULPITLL_DAT0, 88, "usbb1_ulpitll_dat0", |
| 911 | "hsi1_acwake", "mcbsp4_clkx", "gpio_88", | 802 | "hsi1_acwake", "mcbsp4_clkx", "gpio_88", |
| 912 | "usbb1_ulpiphy_dat0", "usbb1_mm_txen", "hw_dbg24", | 803 | "usbb1_ulpiphy_dat0", "usbb1_mm_txen", "hw_dbg24", |
| @@ -922,84 +813,6 @@ static struct omap_mux __initdata omap4_es2_core_muxmodes[] = { | |||
| 922 | _OMAP4_MUXENTRY(USBB1_ULPITLL_DAT3, 91, "usbb1_ulpitll_dat3", | 813 | _OMAP4_MUXENTRY(USBB1_ULPITLL_DAT3, 91, "usbb1_ulpitll_dat3", |
| 923 | "hsi1_caready", NULL, "gpio_91", "usbb1_ulpiphy_dat3", | 814 | "hsi1_caready", NULL, "gpio_91", "usbb1_ulpiphy_dat3", |
| 924 | "usbb1_mm_rxrcv", "hw_dbg27", "safe_mode"), | 815 | "usbb1_mm_rxrcv", "hw_dbg27", "safe_mode"), |
| 925 | _OMAP4_MUXENTRY(USBB1_ULPITLL_DAT4, 92, "usbb1_ulpitll_dat4", | ||
| 926 | "dmtimer8_pwm_evt", "abe_mcbsp3_dr", "gpio_92", | ||
| 927 | "usbb1_ulpiphy_dat4", NULL, "hw_dbg28", "safe_mode"), | ||
| 928 | _OMAP4_MUXENTRY(USBB1_ULPITLL_DAT5, 93, "usbb1_ulpitll_dat5", | ||
| 929 | "dmtimer9_pwm_evt", "abe_mcbsp3_dx", "gpio_93", | ||
| 930 | "usbb1_ulpiphy_dat5", NULL, "hw_dbg29", "safe_mode"), | ||
| 931 | _OMAP4_MUXENTRY(USBB1_ULPITLL_DAT6, 94, "usbb1_ulpitll_dat6", | ||
| 932 | "dmtimer10_pwm_evt", "abe_mcbsp3_clkx", "gpio_94", | ||
| 933 | "usbb1_ulpiphy_dat6", "abe_dmic_din3", "hw_dbg30", | ||
| 934 | "safe_mode"), | ||
| 935 | _OMAP4_MUXENTRY(USBB1_ULPITLL_DAT7, 95, "usbb1_ulpitll_dat7", | ||
| 936 | "dmtimer11_pwm_evt", "abe_mcbsp3_fsx", "gpio_95", | ||
| 937 | "usbb1_ulpiphy_dat7", "abe_dmic_clk3", "hw_dbg31", | ||
| 938 | "safe_mode"), | ||
| 939 | _OMAP4_MUXENTRY(USBB1_HSIC_DATA, 96, "usbb1_hsic_data", NULL, NULL, | ||
| 940 | "gpio_96", NULL, NULL, NULL, "safe_mode"), | ||
| 941 | _OMAP4_MUXENTRY(USBB1_HSIC_STROBE, 97, "usbb1_hsic_strobe", NULL, | ||
| 942 | NULL, "gpio_97", NULL, NULL, NULL, "safe_mode"), | ||
| 943 | _OMAP4_MUXENTRY(USBC1_ICUSB_DP, 98, "usbc1_icusb_dp", NULL, NULL, | ||
| 944 | "gpio_98", NULL, NULL, NULL, "safe_mode"), | ||
| 945 | _OMAP4_MUXENTRY(USBC1_ICUSB_DM, 99, "usbc1_icusb_dm", NULL, NULL, | ||
| 946 | "gpio_99", NULL, NULL, NULL, "safe_mode"), | ||
| 947 | _OMAP4_MUXENTRY(SDMMC1_CLK, 100, "sdmmc1_clk", NULL, "dpm_emu19", | ||
| 948 | "gpio_100", NULL, NULL, NULL, "safe_mode"), | ||
| 949 | _OMAP4_MUXENTRY(SDMMC1_CMD, 101, "sdmmc1_cmd", NULL, "uart1_rx", | ||
| 950 | "gpio_101", NULL, NULL, NULL, "safe_mode"), | ||
| 951 | _OMAP4_MUXENTRY(SDMMC1_DAT0, 102, "sdmmc1_dat0", NULL, "dpm_emu18", | ||
| 952 | "gpio_102", NULL, NULL, NULL, "safe_mode"), | ||
| 953 | _OMAP4_MUXENTRY(SDMMC1_DAT1, 103, "sdmmc1_dat1", NULL, "dpm_emu17", | ||
| 954 | "gpio_103", NULL, NULL, NULL, "safe_mode"), | ||
| 955 | _OMAP4_MUXENTRY(SDMMC1_DAT2, 104, "sdmmc1_dat2", NULL, "dpm_emu16", | ||
| 956 | "gpio_104", "jtag_tms_tmsc", NULL, NULL, "safe_mode"), | ||
| 957 | _OMAP4_MUXENTRY(SDMMC1_DAT3, 105, "sdmmc1_dat3", NULL, "dpm_emu15", | ||
| 958 | "gpio_105", "jtag_tck", NULL, NULL, "safe_mode"), | ||
| 959 | _OMAP4_MUXENTRY(SDMMC1_DAT4, 106, "sdmmc1_dat4", NULL, NULL, | ||
| 960 | "gpio_106", NULL, NULL, NULL, "safe_mode"), | ||
| 961 | _OMAP4_MUXENTRY(SDMMC1_DAT5, 107, "sdmmc1_dat5", NULL, NULL, | ||
| 962 | "gpio_107", NULL, NULL, NULL, "safe_mode"), | ||
| 963 | _OMAP4_MUXENTRY(SDMMC1_DAT6, 108, "sdmmc1_dat6", NULL, NULL, | ||
| 964 | "gpio_108", NULL, NULL, NULL, "safe_mode"), | ||
| 965 | _OMAP4_MUXENTRY(SDMMC1_DAT7, 109, "sdmmc1_dat7", NULL, NULL, | ||
| 966 | "gpio_109", NULL, NULL, NULL, "safe_mode"), | ||
| 967 | _OMAP4_MUXENTRY(ABE_MCBSP2_CLKX, 110, "abe_mcbsp2_clkx", "mcspi2_clk", | ||
| 968 | "abe_mcasp_ahclkx", "gpio_110", "usbb2_mm_rxdm", | ||
| 969 | NULL, NULL, "safe_mode"), | ||
| 970 | _OMAP4_MUXENTRY(ABE_MCBSP2_DR, 111, "abe_mcbsp2_dr", "mcspi2_somi", | ||
| 971 | "abe_mcasp_axr", "gpio_111", "usbb2_mm_rxdp", NULL, | ||
| 972 | NULL, "safe_mode"), | ||
| 973 | _OMAP4_MUXENTRY(ABE_MCBSP2_DX, 112, "abe_mcbsp2_dx", "mcspi2_simo", | ||
| 974 | "abe_mcasp_amute", "gpio_112", "usbb2_mm_rxrcv", NULL, | ||
| 975 | NULL, "safe_mode"), | ||
| 976 | _OMAP4_MUXENTRY(ABE_MCBSP2_FSX, 113, "abe_mcbsp2_fsx", "mcspi2_cs0", | ||
| 977 | "abe_mcasp_afsx", "gpio_113", "usbb2_mm_txen", NULL, | ||
| 978 | NULL, "safe_mode"), | ||
| 979 | _OMAP4_MUXENTRY(ABE_MCBSP1_CLKX, 114, "abe_mcbsp1_clkx", | ||
| 980 | "abe_slimbus1_clock", NULL, "gpio_114", NULL, NULL, | ||
| 981 | NULL, "safe_mode"), | ||
| 982 | _OMAP4_MUXENTRY(ABE_MCBSP1_DR, 115, "abe_mcbsp1_dr", | ||
| 983 | "abe_slimbus1_data", NULL, "gpio_115", NULL, NULL, | ||
| 984 | NULL, "safe_mode"), | ||
| 985 | _OMAP4_MUXENTRY(ABE_MCBSP1_DX, 116, "abe_mcbsp1_dx", "sdmmc3_dat2", | ||
| 986 | "abe_mcasp_aclkx", "gpio_116", NULL, NULL, NULL, | ||
| 987 | "safe_mode"), | ||
| 988 | _OMAP4_MUXENTRY(ABE_MCBSP1_FSX, 117, "abe_mcbsp1_fsx", "sdmmc3_dat3", | ||
| 989 | "abe_mcasp_amutein", "gpio_117", NULL, NULL, NULL, | ||
| 990 | "safe_mode"), | ||
| 991 | _OMAP4_MUXENTRY(ABE_PDM_UL_DATA, 0, "abe_pdm_ul_data", | ||
| 992 | "abe_mcbsp3_dr", NULL, NULL, NULL, NULL, NULL, | ||
| 993 | "safe_mode"), | ||
| 994 | _OMAP4_MUXENTRY(ABE_PDM_DL_DATA, 0, "abe_pdm_dl_data", | ||
| 995 | "abe_mcbsp3_dx", NULL, NULL, NULL, NULL, NULL, | ||
| 996 | "safe_mode"), | ||
| 997 | _OMAP4_MUXENTRY(ABE_PDM_FRAME, 0, "abe_pdm_frame", "abe_mcbsp3_clkx", | ||
| 998 | NULL, NULL, NULL, NULL, NULL, "safe_mode"), | ||
| 999 | _OMAP4_MUXENTRY(ABE_PDM_LB_CLK, 0, "abe_pdm_lb_clk", "abe_mcbsp3_fsx", | ||
| 1000 | NULL, NULL, NULL, NULL, NULL, "safe_mode"), | ||
| 1001 | _OMAP4_MUXENTRY(ABE_CLKS, 118, "abe_clks", NULL, NULL, "gpio_118", | ||
| 1002 | NULL, NULL, NULL, "safe_mode"), | ||
| 1003 | _OMAP4_MUXENTRY(ABE_DMIC_CLK1, 119, "abe_dmic_clk1", NULL, NULL, | 816 | _OMAP4_MUXENTRY(ABE_DMIC_CLK1, 119, "abe_dmic_clk1", NULL, NULL, |
| 1004 | "gpio_119", "usbb2_mm_txse0", "uart4_cts", NULL, | 817 | "gpio_119", "usbb2_mm_txse0", "uart4_cts", NULL, |
| 1005 | "safe_mode"), | 818 | "safe_mode"), |
| @@ -1012,58 +825,6 @@ static struct omap_mux __initdata omap4_es2_core_muxmodes[] = { | |||
| 1012 | _OMAP4_MUXENTRY(ABE_DMIC_DIN3, 122, "abe_dmic_din3", "slimbus2_data", | 825 | _OMAP4_MUXENTRY(ABE_DMIC_DIN3, 122, "abe_dmic_din3", "slimbus2_data", |
| 1013 | "abe_dmic_clk2", "gpio_122", NULL, "dmtimer9_pwm_evt", | 826 | "abe_dmic_clk2", "gpio_122", NULL, "dmtimer9_pwm_evt", |
| 1014 | NULL, "safe_mode"), | 827 | NULL, "safe_mode"), |
| 1015 | _OMAP4_MUXENTRY(UART2_CTS, 123, "uart2_cts", "sdmmc3_clk", NULL, | ||
| 1016 | "gpio_123", NULL, NULL, NULL, "safe_mode"), | ||
| 1017 | _OMAP4_MUXENTRY(UART2_RTS, 124, "uart2_rts", "sdmmc3_cmd", NULL, | ||
| 1018 | "gpio_124", NULL, NULL, NULL, "safe_mode"), | ||
| 1019 | _OMAP4_MUXENTRY(UART2_RX, 125, "uart2_rx", "sdmmc3_dat0", NULL, | ||
| 1020 | "gpio_125", NULL, NULL, NULL, "safe_mode"), | ||
| 1021 | _OMAP4_MUXENTRY(UART2_TX, 126, "uart2_tx", "sdmmc3_dat1", NULL, | ||
| 1022 | "gpio_126", NULL, NULL, NULL, "safe_mode"), | ||
| 1023 | _OMAP4_MUXENTRY(HDQ_SIO, 127, "hdq_sio", "i2c3_sccb", "i2c2_sccb", | ||
| 1024 | "gpio_127", NULL, NULL, NULL, "safe_mode"), | ||
| 1025 | _OMAP4_MUXENTRY(I2C1_SCL, 0, "i2c1_scl", NULL, NULL, NULL, NULL, NULL, | ||
| 1026 | NULL, NULL), | ||
| 1027 | _OMAP4_MUXENTRY(I2C1_SDA, 0, "i2c1_sda", NULL, NULL, NULL, NULL, NULL, | ||
| 1028 | NULL, NULL), | ||
| 1029 | _OMAP4_MUXENTRY(I2C2_SCL, 128, "i2c2_scl", "uart1_rx", NULL, | ||
| 1030 | "gpio_128", NULL, NULL, NULL, "safe_mode"), | ||
| 1031 | _OMAP4_MUXENTRY(I2C2_SDA, 129, "i2c2_sda", "uart1_tx", NULL, | ||
| 1032 | "gpio_129", NULL, NULL, NULL, "safe_mode"), | ||
| 1033 | _OMAP4_MUXENTRY(I2C3_SCL, 130, "i2c3_scl", NULL, NULL, "gpio_130", | ||
| 1034 | NULL, NULL, NULL, "safe_mode"), | ||
| 1035 | _OMAP4_MUXENTRY(I2C3_SDA, 131, "i2c3_sda", NULL, NULL, "gpio_131", | ||
| 1036 | NULL, NULL, NULL, "safe_mode"), | ||
| 1037 | _OMAP4_MUXENTRY(I2C4_SCL, 132, "i2c4_scl", NULL, NULL, "gpio_132", | ||
| 1038 | NULL, NULL, NULL, "safe_mode"), | ||
| 1039 | _OMAP4_MUXENTRY(I2C4_SDA, 133, "i2c4_sda", NULL, NULL, "gpio_133", | ||
| 1040 | NULL, NULL, NULL, "safe_mode"), | ||
| 1041 | _OMAP4_MUXENTRY(MCSPI1_CLK, 134, "mcspi1_clk", NULL, NULL, "gpio_134", | ||
| 1042 | NULL, NULL, NULL, "safe_mode"), | ||
| 1043 | _OMAP4_MUXENTRY(MCSPI1_SOMI, 135, "mcspi1_somi", NULL, NULL, | ||
| 1044 | "gpio_135", NULL, NULL, NULL, "safe_mode"), | ||
| 1045 | _OMAP4_MUXENTRY(MCSPI1_SIMO, 136, "mcspi1_simo", NULL, NULL, | ||
| 1046 | "gpio_136", NULL, NULL, NULL, "safe_mode"), | ||
| 1047 | _OMAP4_MUXENTRY(MCSPI1_CS0, 137, "mcspi1_cs0", NULL, NULL, "gpio_137", | ||
| 1048 | NULL, NULL, NULL, "safe_mode"), | ||
| 1049 | _OMAP4_MUXENTRY(MCSPI1_CS1, 138, "mcspi1_cs1", "uart1_rx", NULL, | ||
| 1050 | "gpio_138", NULL, NULL, NULL, "safe_mode"), | ||
| 1051 | _OMAP4_MUXENTRY(MCSPI1_CS2, 139, "mcspi1_cs2", "uart1_cts", | ||
| 1052 | "slimbus2_clock", "gpio_139", NULL, NULL, NULL, | ||
| 1053 | "safe_mode"), | ||
| 1054 | _OMAP4_MUXENTRY(MCSPI1_CS3, 140, "mcspi1_cs3", "uart1_rts", | ||
| 1055 | "slimbus2_data", "gpio_140", NULL, NULL, NULL, | ||
| 1056 | "safe_mode"), | ||
| 1057 | _OMAP4_MUXENTRY(UART3_CTS_RCTX, 141, "uart3_cts_rctx", "uart1_tx", | ||
| 1058 | NULL, "gpio_141", NULL, NULL, NULL, "safe_mode"), | ||
| 1059 | _OMAP4_MUXENTRY(UART3_RTS_SD, 142, "uart3_rts_sd", NULL, NULL, | ||
| 1060 | "gpio_142", NULL, NULL, NULL, "safe_mode"), | ||
| 1061 | _OMAP4_MUXENTRY(UART3_RX_IRRX, 143, "uart3_rx_irrx", | ||
| 1062 | "dmtimer8_pwm_evt", NULL, "gpio_143", NULL, NULL, | ||
| 1063 | NULL, "safe_mode"), | ||
| 1064 | _OMAP4_MUXENTRY(UART3_TX_IRTX, 144, "uart3_tx_irtx", | ||
| 1065 | "dmtimer9_pwm_evt", NULL, "gpio_144", NULL, NULL, | ||
| 1066 | NULL, "safe_mode"), | ||
| 1067 | _OMAP4_MUXENTRY(SDMMC5_CLK, 145, "sdmmc5_clk", "mcspi2_clk", | 828 | _OMAP4_MUXENTRY(SDMMC5_CLK, 145, "sdmmc5_clk", "mcspi2_clk", |
| 1068 | "usbc1_icusb_dp", "gpio_145", NULL, "sdmmc2_clk", | 829 | "usbc1_icusb_dp", "gpio_145", NULL, "sdmmc2_clk", |
| 1069 | NULL, "safe_mode"), | 830 | NULL, "safe_mode"), |
| @@ -1096,9 +857,6 @@ static struct omap_mux __initdata omap4_es2_core_muxmodes[] = { | |||
| 1096 | "gpio_155", NULL, NULL, NULL, "safe_mode"), | 857 | "gpio_155", NULL, NULL, NULL, "safe_mode"), |
| 1097 | _OMAP4_MUXENTRY(UART4_TX, 156, "uart4_tx", "sdmmc4_dat1", "kpd_col8", | 858 | _OMAP4_MUXENTRY(UART4_TX, 156, "uart4_tx", "sdmmc4_dat1", "kpd_col8", |
| 1098 | "gpio_156", NULL, NULL, NULL, "safe_mode"), | 859 | "gpio_156", NULL, NULL, NULL, "safe_mode"), |
| 1099 | _OMAP4_MUXENTRY(USBB2_ULPITLL_CLK, 157, "usbb2_ulpitll_clk", | ||
| 1100 | "usbb2_ulpiphy_clk", "sdmmc4_cmd", "gpio_157", | ||
| 1101 | "hsi2_cawake", NULL, NULL, "safe_mode"), | ||
| 1102 | _OMAP4_MUXENTRY(USBB2_ULPITLL_STP, 158, "usbb2_ulpitll_stp", | 860 | _OMAP4_MUXENTRY(USBB2_ULPITLL_STP, 158, "usbb2_ulpitll_stp", |
| 1103 | "usbb2_ulpiphy_stp", "sdmmc4_clk", "gpio_158", | 861 | "usbb2_ulpiphy_stp", "sdmmc4_clk", "gpio_158", |
| 1104 | "hsi2_cadata", "dispc2_data23", NULL, "safe_mode"), | 862 | "hsi2_cadata", "dispc2_data23", NULL, "safe_mode"), |
| @@ -1140,10 +898,6 @@ static struct omap_mux __initdata omap4_es2_core_muxmodes[] = { | |||
| 1140 | "usbb2_ulpiphy_dat7", "sdmmc3_clk", "gpio_168", | 898 | "usbb2_ulpiphy_dat7", "sdmmc3_clk", "gpio_168", |
| 1141 | "mcspi3_clk", "dispc2_data11", "rfbi_data11", | 899 | "mcspi3_clk", "dispc2_data11", "rfbi_data11", |
| 1142 | "safe_mode"), | 900 | "safe_mode"), |
| 1143 | _OMAP4_MUXENTRY(USBB2_HSIC_DATA, 169, "usbb2_hsic_data", NULL, NULL, | ||
| 1144 | "gpio_169", NULL, NULL, NULL, "safe_mode"), | ||
| 1145 | _OMAP4_MUXENTRY(USBB2_HSIC_STROBE, 170, "usbb2_hsic_strobe", NULL, | ||
| 1146 | NULL, "gpio_170", NULL, NULL, NULL, "safe_mode"), | ||
| 1147 | _OMAP4_MUXENTRY(KPD_COL3, 171, "kpd_col3", "kpd_col0", NULL, | 901 | _OMAP4_MUXENTRY(KPD_COL3, 171, "kpd_col3", "kpd_col0", NULL, |
| 1148 | "gpio_171", NULL, NULL, NULL, "safe_mode"), | 902 | "gpio_171", NULL, NULL, NULL, "safe_mode"), |
| 1149 | _OMAP4_MUXENTRY(KPD_COL4, 172, "kpd_col4", "kpd_col1", NULL, | 903 | _OMAP4_MUXENTRY(KPD_COL4, 172, "kpd_col4", "kpd_col1", NULL, |
| @@ -1168,36 +922,10 @@ static struct omap_mux __initdata omap4_es2_core_muxmodes[] = { | |||
| 1168 | NULL, NULL, NULL, "safe_mode"), | 922 | NULL, NULL, NULL, "safe_mode"), |
| 1169 | _OMAP4_MUXENTRY(KPD_ROW2, 3, "kpd_row2", "kpd_row5", NULL, "gpio_3", | 923 | _OMAP4_MUXENTRY(KPD_ROW2, 3, "kpd_row2", "kpd_row5", NULL, "gpio_3", |
| 1170 | NULL, NULL, NULL, "safe_mode"), | 924 | NULL, NULL, NULL, "safe_mode"), |
| 1171 | _OMAP4_MUXENTRY(USBA0_OTG_CE, 0, "usba0_otg_ce", NULL, NULL, NULL, | ||
| 1172 | NULL, NULL, NULL, NULL), | ||
| 1173 | _OMAP4_MUXENTRY(USBA0_OTG_DP, 0, "usba0_otg_dp", "uart3_rx_irrx", | 925 | _OMAP4_MUXENTRY(USBA0_OTG_DP, 0, "usba0_otg_dp", "uart3_rx_irrx", |
| 1174 | "uart2_rx", NULL, NULL, NULL, NULL, "safe_mode"), | 926 | "uart2_rx", NULL, NULL, NULL, NULL, "safe_mode"), |
| 1175 | _OMAP4_MUXENTRY(USBA0_OTG_DM, 0, "usba0_otg_dm", "uart3_tx_irtx", | 927 | _OMAP4_MUXENTRY(USBA0_OTG_DM, 0, "usba0_otg_dm", "uart3_tx_irtx", |
| 1176 | "uart2_tx", NULL, NULL, NULL, NULL, "safe_mode"), | 928 | "uart2_tx", NULL, NULL, NULL, NULL, "safe_mode"), |
| 1177 | _OMAP4_MUXENTRY(FREF_CLK1_OUT, 181, "fref_clk1_out", NULL, NULL, | ||
| 1178 | "gpio_181", NULL, NULL, NULL, "safe_mode"), | ||
| 1179 | _OMAP4_MUXENTRY(FREF_CLK2_OUT, 182, "fref_clk2_out", NULL, NULL, | ||
| 1180 | "gpio_182", NULL, NULL, NULL, "safe_mode"), | ||
| 1181 | _OMAP4_MUXENTRY(SYS_NIRQ1, 0, "sys_nirq1", NULL, NULL, NULL, NULL, | ||
| 1182 | NULL, NULL, "safe_mode"), | ||
| 1183 | _OMAP4_MUXENTRY(SYS_NIRQ2, 183, "sys_nirq2", NULL, NULL, "gpio_183", | ||
| 1184 | NULL, NULL, NULL, "safe_mode"), | ||
| 1185 | _OMAP4_MUXENTRY(SYS_BOOT0, 184, "sys_boot0", NULL, NULL, "gpio_184", | ||
| 1186 | NULL, NULL, NULL, "safe_mode"), | ||
| 1187 | _OMAP4_MUXENTRY(SYS_BOOT1, 185, "sys_boot1", NULL, NULL, "gpio_185", | ||
| 1188 | NULL, NULL, NULL, "safe_mode"), | ||
| 1189 | _OMAP4_MUXENTRY(SYS_BOOT2, 186, "sys_boot2", NULL, NULL, "gpio_186", | ||
| 1190 | NULL, NULL, NULL, "safe_mode"), | ||
| 1191 | _OMAP4_MUXENTRY(SYS_BOOT3, 187, "sys_boot3", NULL, NULL, "gpio_187", | ||
| 1192 | NULL, NULL, NULL, "safe_mode"), | ||
| 1193 | _OMAP4_MUXENTRY(SYS_BOOT4, 188, "sys_boot4", NULL, NULL, "gpio_188", | ||
| 1194 | NULL, NULL, NULL, "safe_mode"), | ||
| 1195 | _OMAP4_MUXENTRY(SYS_BOOT5, 189, "sys_boot5", NULL, NULL, "gpio_189", | ||
| 1196 | NULL, NULL, NULL, "safe_mode"), | ||
| 1197 | _OMAP4_MUXENTRY(DPM_EMU0, 11, "dpm_emu0", NULL, NULL, "gpio_11", NULL, | ||
| 1198 | NULL, "hw_dbg0", "safe_mode"), | ||
| 1199 | _OMAP4_MUXENTRY(DPM_EMU1, 12, "dpm_emu1", NULL, NULL, "gpio_12", NULL, | ||
| 1200 | NULL, "hw_dbg1", "safe_mode"), | ||
| 1201 | _OMAP4_MUXENTRY(DPM_EMU2, 13, "dpm_emu2", "usba0_ulpiphy_clk", NULL, | 929 | _OMAP4_MUXENTRY(DPM_EMU2, 13, "dpm_emu2", "usba0_ulpiphy_clk", NULL, |
| 1202 | "gpio_13", NULL, "dispc2_fid", "hw_dbg2", | 930 | "gpio_13", NULL, "dispc2_fid", "hw_dbg2", |
| 1203 | "safe_mode"), | 931 | "safe_mode"), |
| @@ -1586,6 +1314,7 @@ int __init omap4_mux_init(struct omap_board_mux *board_subset, int flags) | |||
| 1586 | struct omap_ball *package_balls_core; | 1314 | struct omap_ball *package_balls_core; |
| 1587 | struct omap_ball *package_balls_wkup = omap4_wkup_cbl_cbs_ball; | 1315 | struct omap_ball *package_balls_wkup = omap4_wkup_cbl_cbs_ball; |
| 1588 | struct omap_mux *core_muxmodes; | 1316 | struct omap_mux *core_muxmodes; |
| 1317 | struct omap_mux *core_subset = NULL; | ||
| 1589 | int ret; | 1318 | int ret; |
| 1590 | 1319 | ||
| 1591 | switch (flags & OMAP_PACKAGE_MASK) { | 1320 | switch (flags & OMAP_PACKAGE_MASK) { |
| @@ -1597,7 +1326,8 @@ int __init omap4_mux_init(struct omap_board_mux *board_subset, int flags) | |||
| 1597 | case OMAP_PACKAGE_CBS: | 1326 | case OMAP_PACKAGE_CBS: |
| 1598 | pr_debug("%s: OMAP4430 ES2.X -> OMAP_PACKAGE_CBS\n", __func__); | 1327 | pr_debug("%s: OMAP4430 ES2.X -> OMAP_PACKAGE_CBS\n", __func__); |
| 1599 | package_balls_core = omap4_core_cbs_ball; | 1328 | package_balls_core = omap4_core_cbs_ball; |
| 1600 | core_muxmodes = omap4_es2_core_muxmodes; | 1329 | core_muxmodes = omap4_core_muxmodes; |
| 1330 | core_subset = omap4_es2_core_subset; | ||
| 1601 | break; | 1331 | break; |
| 1602 | default: | 1332 | default: |
| 1603 | pr_err("%s: Unknown omap package, mux disabled\n", __func__); | 1333 | pr_err("%s: Unknown omap package, mux disabled\n", __func__); |
| @@ -1608,7 +1338,7 @@ int __init omap4_mux_init(struct omap_board_mux *board_subset, int flags) | |||
| 1608 | OMAP_MUX_GPIO_IN_MODE3, | 1338 | OMAP_MUX_GPIO_IN_MODE3, |
| 1609 | OMAP4_CTRL_MODULE_PAD_CORE_MUX_PBASE, | 1339 | OMAP4_CTRL_MODULE_PAD_CORE_MUX_PBASE, |
| 1610 | OMAP4_CTRL_MODULE_PAD_CORE_MUX_SIZE, | 1340 | OMAP4_CTRL_MODULE_PAD_CORE_MUX_SIZE, |
| 1611 | core_muxmodes, NULL, board_subset, | 1341 | core_muxmodes, core_subset, board_subset, |
| 1612 | package_balls_core); | 1342 | package_balls_core); |
| 1613 | if (ret) | 1343 | if (ret) |
| 1614 | return ret; | 1344 | return ret; |
diff --git a/arch/arm/mach-omap2/omap-headsmp.S b/arch/arm/mach-omap2/omap-headsmp.S index 6ae937a06cc..4ee6aeca885 100644 --- a/arch/arm/mach-omap2/omap-headsmp.S +++ b/arch/arm/mach-omap2/omap-headsmp.S | |||
| @@ -45,5 +45,5 @@ hold: ldr r12,=0x103 | |||
| 45 | * should now contain the SVC stack for this core | 45 | * should now contain the SVC stack for this core |
| 46 | */ | 46 | */ |
| 47 | b secondary_startup | 47 | b secondary_startup |
| 48 | END(omap_secondary_startup) | 48 | ENDPROC(omap_secondary_startup) |
| 49 | 49 | ||
diff --git a/arch/arm/mach-omap2/omap44xx-smc.S b/arch/arm/mach-omap2/omap44xx-smc.S index 1980dc31a1a..e69d37d9520 100644 --- a/arch/arm/mach-omap2/omap44xx-smc.S +++ b/arch/arm/mach-omap2/omap44xx-smc.S | |||
| @@ -29,7 +29,7 @@ ENTRY(omap_smc1) | |||
| 29 | dsb | 29 | dsb |
| 30 | smc #0 | 30 | smc #0 |
| 31 | ldmfd sp!, {r2-r12, pc} | 31 | ldmfd sp!, {r2-r12, pc} |
| 32 | END(omap_smc1) | 32 | ENDPROC(omap_smc1) |
| 33 | 33 | ||
| 34 | ENTRY(omap_modify_auxcoreboot0) | 34 | ENTRY(omap_modify_auxcoreboot0) |
| 35 | stmfd sp!, {r1-r12, lr} | 35 | stmfd sp!, {r1-r12, lr} |
| @@ -37,7 +37,7 @@ ENTRY(omap_modify_auxcoreboot0) | |||
| 37 | dsb | 37 | dsb |
| 38 | smc #0 | 38 | smc #0 |
| 39 | ldmfd sp!, {r1-r12, pc} | 39 | ldmfd sp!, {r1-r12, pc} |
| 40 | END(omap_modify_auxcoreboot0) | 40 | ENDPROC(omap_modify_auxcoreboot0) |
| 41 | 41 | ||
| 42 | ENTRY(omap_auxcoreboot_addr) | 42 | ENTRY(omap_auxcoreboot_addr) |
| 43 | stmfd sp!, {r2-r12, lr} | 43 | stmfd sp!, {r2-r12, lr} |
| @@ -45,7 +45,7 @@ ENTRY(omap_auxcoreboot_addr) | |||
| 45 | dsb | 45 | dsb |
| 46 | smc #0 | 46 | smc #0 |
| 47 | ldmfd sp!, {r2-r12, pc} | 47 | ldmfd sp!, {r2-r12, pc} |
| 48 | END(omap_auxcoreboot_addr) | 48 | ENDPROC(omap_auxcoreboot_addr) |
| 49 | 49 | ||
| 50 | ENTRY(omap_read_auxcoreboot0) | 50 | ENTRY(omap_read_auxcoreboot0) |
| 51 | stmfd sp!, {r2-r12, lr} | 51 | stmfd sp!, {r2-r12, lr} |
| @@ -54,4 +54,4 @@ ENTRY(omap_read_auxcoreboot0) | |||
| 54 | smc #0 | 54 | smc #0 |
| 55 | mov r0, r0, lsr #9 | 55 | mov r0, r0, lsr #9 |
| 56 | ldmfd sp!, {r2-r12, pc} | 56 | ldmfd sp!, {r2-r12, pc} |
| 57 | END(omap_read_auxcoreboot0) | 57 | ENDPROC(omap_read_auxcoreboot0) |
diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c index 1125134c9a7..e03429453ce 100644 --- a/arch/arm/mach-omap2/omap_hwmod.c +++ b/arch/arm/mach-omap2/omap_hwmod.c | |||
| @@ -370,7 +370,7 @@ static int _set_module_autoidle(struct omap_hwmod *oh, u8 autoidle, | |||
| 370 | } | 370 | } |
| 371 | 371 | ||
| 372 | autoidle_shift = oh->class->sysc->sysc_fields->autoidle_shift; | 372 | autoidle_shift = oh->class->sysc->sysc_fields->autoidle_shift; |
| 373 | autoidle_mask = (0x3 << autoidle_shift); | 373 | autoidle_mask = (0x1 << autoidle_shift); |
| 374 | 374 | ||
| 375 | *v &= ~autoidle_mask; | 375 | *v &= ~autoidle_mask; |
| 376 | *v |= autoidle << autoidle_shift; | 376 | *v |= autoidle << autoidle_shift; |
| @@ -457,14 +457,18 @@ static int _disable_wakeup(struct omap_hwmod *oh, u32 *v) | |||
| 457 | * will be accessed by a particular initiator (e.g., if a module will | 457 | * will be accessed by a particular initiator (e.g., if a module will |
| 458 | * be accessed by the IVA, there should be a sleepdep between the IVA | 458 | * be accessed by the IVA, there should be a sleepdep between the IVA |
| 459 | * initiator and the module). Only applies to modules in smart-idle | 459 | * initiator and the module). Only applies to modules in smart-idle |
| 460 | * mode. Returns -EINVAL upon error or passes along | 460 | * mode. If the clockdomain is marked as not needing autodeps, return |
| 461 | * clkdm_add_sleepdep() value upon success. | 461 | * 0 without doing anything. Otherwise, returns -EINVAL upon error or |
| 462 | * passes along clkdm_add_sleepdep() value upon success. | ||
| 462 | */ | 463 | */ |
| 463 | static int _add_initiator_dep(struct omap_hwmod *oh, struct omap_hwmod *init_oh) | 464 | static int _add_initiator_dep(struct omap_hwmod *oh, struct omap_hwmod *init_oh) |
| 464 | { | 465 | { |
| 465 | if (!oh->_clk) | 466 | if (!oh->_clk) |
| 466 | return -EINVAL; | 467 | return -EINVAL; |
| 467 | 468 | ||
| 469 | if (oh->_clk->clkdm && oh->_clk->clkdm->flags & CLKDM_NO_AUTODEPS) | ||
| 470 | return 0; | ||
| 471 | |||
| 468 | return clkdm_add_sleepdep(oh->_clk->clkdm, init_oh->_clk->clkdm); | 472 | return clkdm_add_sleepdep(oh->_clk->clkdm, init_oh->_clk->clkdm); |
| 469 | } | 473 | } |
| 470 | 474 | ||
| @@ -477,14 +481,18 @@ static int _add_initiator_dep(struct omap_hwmod *oh, struct omap_hwmod *init_oh) | |||
| 477 | * be accessed by a particular initiator (e.g., if a module will not | 481 | * be accessed by a particular initiator (e.g., if a module will not |
| 478 | * be accessed by the IVA, there should be no sleepdep between the IVA | 482 | * be accessed by the IVA, there should be no sleepdep between the IVA |
| 479 | * initiator and the module). Only applies to modules in smart-idle | 483 | * initiator and the module). Only applies to modules in smart-idle |
| 480 | * mode. Returns -EINVAL upon error or passes along | 484 | * mode. If the clockdomain is marked as not needing autodeps, return |
| 481 | * clkdm_del_sleepdep() value upon success. | 485 | * 0 without doing anything. Returns -EINVAL upon error or passes |
| 486 | * along clkdm_del_sleepdep() value upon success. | ||
| 482 | */ | 487 | */ |
| 483 | static int _del_initiator_dep(struct omap_hwmod *oh, struct omap_hwmod *init_oh) | 488 | static int _del_initiator_dep(struct omap_hwmod *oh, struct omap_hwmod *init_oh) |
| 484 | { | 489 | { |
| 485 | if (!oh->_clk) | 490 | if (!oh->_clk) |
| 486 | return -EINVAL; | 491 | return -EINVAL; |
| 487 | 492 | ||
| 493 | if (oh->_clk->clkdm && oh->_clk->clkdm->flags & CLKDM_NO_AUTODEPS) | ||
| 494 | return 0; | ||
| 495 | |||
| 488 | return clkdm_del_sleepdep(oh->_clk->clkdm, init_oh->_clk->clkdm); | 496 | return clkdm_del_sleepdep(oh->_clk->clkdm, init_oh->_clk->clkdm); |
| 489 | } | 497 | } |
| 490 | 498 | ||
| @@ -921,7 +929,7 @@ static int _init_clocks(struct omap_hwmod *oh, void *data) | |||
| 921 | if (!ret) | 929 | if (!ret) |
| 922 | oh->_state = _HWMOD_STATE_CLKS_INITED; | 930 | oh->_state = _HWMOD_STATE_CLKS_INITED; |
| 923 | 931 | ||
| 924 | return 0; | 932 | return ret; |
| 925 | } | 933 | } |
| 926 | 934 | ||
| 927 | /** | 935 | /** |
| @@ -967,25 +975,29 @@ static int _wait_target_ready(struct omap_hwmod *oh) | |||
| 967 | } | 975 | } |
| 968 | 976 | ||
| 969 | /** | 977 | /** |
| 970 | * _lookup_hardreset - return the register bit shift for this hwmod/reset line | 978 | * _lookup_hardreset - fill register bit info for this hwmod/reset line |
| 971 | * @oh: struct omap_hwmod * | 979 | * @oh: struct omap_hwmod * |
| 972 | * @name: name of the reset line in the context of this hwmod | 980 | * @name: name of the reset line in the context of this hwmod |
| 981 | * @ohri: struct omap_hwmod_rst_info * that this function will fill in | ||
| 973 | * | 982 | * |
| 974 | * Return the bit position of the reset line that match the | 983 | * Return the bit position of the reset line that match the |
| 975 | * input name. Return -ENOENT if not found. | 984 | * input name. Return -ENOENT if not found. |
| 976 | */ | 985 | */ |
| 977 | static u8 _lookup_hardreset(struct omap_hwmod *oh, const char *name) | 986 | static u8 _lookup_hardreset(struct omap_hwmod *oh, const char *name, |
| 987 | struct omap_hwmod_rst_info *ohri) | ||
| 978 | { | 988 | { |
| 979 | int i; | 989 | int i; |
| 980 | 990 | ||
| 981 | for (i = 0; i < oh->rst_lines_cnt; i++) { | 991 | for (i = 0; i < oh->rst_lines_cnt; i++) { |
| 982 | const char *rst_line = oh->rst_lines[i].name; | 992 | const char *rst_line = oh->rst_lines[i].name; |
| 983 | if (!strcmp(rst_line, name)) { | 993 | if (!strcmp(rst_line, name)) { |
| 984 | u8 shift = oh->rst_lines[i].rst_shift; | 994 | ohri->rst_shift = oh->rst_lines[i].rst_shift; |
| 985 | pr_debug("omap_hwmod: %s: _lookup_hardreset: %s: %d\n", | 995 | ohri->st_shift = oh->rst_lines[i].st_shift; |
| 986 | oh->name, rst_line, shift); | 996 | pr_debug("omap_hwmod: %s: %s: %s: rst %d st %d\n", |
| 997 | oh->name, __func__, rst_line, ohri->rst_shift, | ||
| 998 | ohri->st_shift); | ||
| 987 | 999 | ||
| 988 | return shift; | 1000 | return 0; |
| 989 | } | 1001 | } |
| 990 | } | 1002 | } |
| 991 | 1003 | ||
| @@ -1004,21 +1016,22 @@ static u8 _lookup_hardreset(struct omap_hwmod *oh, const char *name) | |||
| 1004 | */ | 1016 | */ |
| 1005 | static int _assert_hardreset(struct omap_hwmod *oh, const char *name) | 1017 | static int _assert_hardreset(struct omap_hwmod *oh, const char *name) |
| 1006 | { | 1018 | { |
| 1007 | u8 shift; | 1019 | struct omap_hwmod_rst_info ohri; |
| 1020 | u8 ret; | ||
| 1008 | 1021 | ||
| 1009 | if (!oh) | 1022 | if (!oh) |
| 1010 | return -EINVAL; | 1023 | return -EINVAL; |
| 1011 | 1024 | ||
| 1012 | shift = _lookup_hardreset(oh, name); | 1025 | ret = _lookup_hardreset(oh, name, &ohri); |
| 1013 | if (IS_ERR_VALUE(shift)) | 1026 | if (IS_ERR_VALUE(ret)) |
| 1014 | return shift; | 1027 | return ret; |
| 1015 | 1028 | ||
| 1016 | if (cpu_is_omap24xx() || cpu_is_omap34xx()) | 1029 | if (cpu_is_omap24xx() || cpu_is_omap34xx()) |
| 1017 | return omap2_prm_assert_hardreset(oh->prcm.omap2.module_offs, | 1030 | return omap2_prm_assert_hardreset(oh->prcm.omap2.module_offs, |
| 1018 | shift); | 1031 | ohri.rst_shift); |
| 1019 | else if (cpu_is_omap44xx()) | 1032 | else if (cpu_is_omap44xx()) |
| 1020 | return omap4_prm_assert_hardreset(oh->prcm.omap4.rstctrl_reg, | 1033 | return omap4_prm_assert_hardreset(oh->prcm.omap4.rstctrl_reg, |
| 1021 | shift); | 1034 | ohri.rst_shift); |
| 1022 | else | 1035 | else |
| 1023 | return -EINVAL; | 1036 | return -EINVAL; |
| 1024 | } | 1037 | } |
| @@ -1035,29 +1048,34 @@ static int _assert_hardreset(struct omap_hwmod *oh, const char *name) | |||
| 1035 | */ | 1048 | */ |
| 1036 | static int _deassert_hardreset(struct omap_hwmod *oh, const char *name) | 1049 | static int _deassert_hardreset(struct omap_hwmod *oh, const char *name) |
| 1037 | { | 1050 | { |
| 1038 | u8 shift; | 1051 | struct omap_hwmod_rst_info ohri; |
| 1039 | int r; | 1052 | int ret; |
| 1040 | 1053 | ||
| 1041 | if (!oh) | 1054 | if (!oh) |
| 1042 | return -EINVAL; | 1055 | return -EINVAL; |
| 1043 | 1056 | ||
| 1044 | shift = _lookup_hardreset(oh, name); | 1057 | ret = _lookup_hardreset(oh, name, &ohri); |
| 1045 | if (IS_ERR_VALUE(shift)) | 1058 | if (IS_ERR_VALUE(ret)) |
| 1046 | return shift; | 1059 | return ret; |
| 1047 | 1060 | ||
| 1048 | if (cpu_is_omap24xx() || cpu_is_omap34xx()) | 1061 | if (cpu_is_omap24xx() || cpu_is_omap34xx()) { |
| 1049 | r = omap2_prm_deassert_hardreset(oh->prcm.omap2.module_offs, | 1062 | ret = omap2_prm_deassert_hardreset(oh->prcm.omap2.module_offs, |
| 1050 | shift); | 1063 | ohri.rst_shift, |
| 1051 | else if (cpu_is_omap44xx()) | 1064 | ohri.st_shift); |
| 1052 | r = omap4_prm_deassert_hardreset(oh->prcm.omap4.rstctrl_reg, | 1065 | } else if (cpu_is_omap44xx()) { |
| 1053 | shift); | 1066 | if (ohri.st_shift) |
| 1054 | else | 1067 | pr_err("omap_hwmod: %s: %s: hwmod data error: OMAP4 does not support st_shift\n", |
| 1068 | oh->name, name); | ||
| 1069 | ret = omap4_prm_deassert_hardreset(oh->prcm.omap4.rstctrl_reg, | ||
| 1070 | ohri.rst_shift); | ||
| 1071 | } else { | ||
| 1055 | return -EINVAL; | 1072 | return -EINVAL; |
| 1073 | } | ||
| 1056 | 1074 | ||
| 1057 | if (r == -EBUSY) | 1075 | if (ret == -EBUSY) |
| 1058 | pr_warning("omap_hwmod: %s: failed to hardreset\n", oh->name); | 1076 | pr_warning("omap_hwmod: %s: failed to hardreset\n", oh->name); |
| 1059 | 1077 | ||
| 1060 | return r; | 1078 | return ret; |
| 1061 | } | 1079 | } |
| 1062 | 1080 | ||
| 1063 | /** | 1081 | /** |
| @@ -1070,21 +1088,22 @@ static int _deassert_hardreset(struct omap_hwmod *oh, const char *name) | |||
| 1070 | */ | 1088 | */ |
| 1071 | static int _read_hardreset(struct omap_hwmod *oh, const char *name) | 1089 | static int _read_hardreset(struct omap_hwmod *oh, const char *name) |
| 1072 | { | 1090 | { |
| 1073 | u8 shift; | 1091 | struct omap_hwmod_rst_info ohri; |
| 1092 | u8 ret; | ||
| 1074 | 1093 | ||
| 1075 | if (!oh) | 1094 | if (!oh) |
| 1076 | return -EINVAL; | 1095 | return -EINVAL; |
| 1077 | 1096 | ||
| 1078 | shift = _lookup_hardreset(oh, name); | 1097 | ret = _lookup_hardreset(oh, name, &ohri); |
| 1079 | if (IS_ERR_VALUE(shift)) | 1098 | if (IS_ERR_VALUE(ret)) |
| 1080 | return shift; | 1099 | return ret; |
| 1081 | 1100 | ||
| 1082 | if (cpu_is_omap24xx() || cpu_is_omap34xx()) { | 1101 | if (cpu_is_omap24xx() || cpu_is_omap34xx()) { |
| 1083 | return omap2_prm_is_hardreset_asserted(oh->prcm.omap2.module_offs, | 1102 | return omap2_prm_is_hardreset_asserted(oh->prcm.omap2.module_offs, |
| 1084 | shift); | 1103 | ohri.st_shift); |
| 1085 | } else if (cpu_is_omap44xx()) { | 1104 | } else if (cpu_is_omap44xx()) { |
| 1086 | return omap4_prm_is_hardreset_asserted(oh->prcm.omap4.rstctrl_reg, | 1105 | return omap4_prm_is_hardreset_asserted(oh->prcm.omap4.rstctrl_reg, |
| 1087 | shift); | 1106 | ohri.rst_shift); |
| 1088 | } else { | 1107 | } else { |
| 1089 | return -EINVAL; | 1108 | return -EINVAL; |
| 1090 | } | 1109 | } |
| @@ -1225,7 +1244,9 @@ static int _enable(struct omap_hwmod *oh) | |||
| 1225 | _deassert_hardreset(oh, oh->rst_lines[0].name); | 1244 | _deassert_hardreset(oh, oh->rst_lines[0].name); |
| 1226 | 1245 | ||
| 1227 | /* Mux pins for device runtime if populated */ | 1246 | /* Mux pins for device runtime if populated */ |
| 1228 | if (oh->mux) | 1247 | if (oh->mux && (!oh->mux->enabled || |
| 1248 | ((oh->_state == _HWMOD_STATE_IDLE) && | ||
| 1249 | oh->mux->pads_dynamic))) | ||
| 1229 | omap_hwmod_mux(oh->mux, _HWMOD_STATE_ENABLED); | 1250 | omap_hwmod_mux(oh->mux, _HWMOD_STATE_ENABLED); |
| 1230 | 1251 | ||
| 1231 | _add_initiator_dep(oh, mpu_oh); | 1252 | _add_initiator_dep(oh, mpu_oh); |
| @@ -1274,7 +1295,7 @@ static int _idle(struct omap_hwmod *oh) | |||
| 1274 | _disable_clocks(oh); | 1295 | _disable_clocks(oh); |
| 1275 | 1296 | ||
| 1276 | /* Mux pins for device idle if populated */ | 1297 | /* Mux pins for device idle if populated */ |
| 1277 | if (oh->mux) | 1298 | if (oh->mux && oh->mux->pads_dynamic) |
| 1278 | omap_hwmod_mux(oh->mux, _HWMOD_STATE_IDLE); | 1299 | omap_hwmod_mux(oh->mux, _HWMOD_STATE_IDLE); |
| 1279 | 1300 | ||
| 1280 | oh->_state = _HWMOD_STATE_IDLE; | 1301 | oh->_state = _HWMOD_STATE_IDLE; |
| @@ -1283,6 +1304,42 @@ static int _idle(struct omap_hwmod *oh) | |||
| 1283 | } | 1304 | } |
| 1284 | 1305 | ||
| 1285 | /** | 1306 | /** |
| 1307 | * omap_hwmod_set_ocp_autoidle - set the hwmod's OCP autoidle bit | ||
| 1308 | * @oh: struct omap_hwmod * | ||
| 1309 | * @autoidle: desired AUTOIDLE bitfield value (0 or 1) | ||
| 1310 | * | ||
| 1311 | * Sets the IP block's OCP autoidle bit in hardware, and updates our | ||
| 1312 | * local copy. Intended to be used by drivers that require | ||
| 1313 | * direct manipulation of the AUTOIDLE bits. | ||
| 1314 | * Returns -EINVAL if @oh is null or is not in the ENABLED state, or passes | ||
| 1315 | * along the return value from _set_module_autoidle(). | ||
| 1316 | * | ||
| 1317 | * Any users of this function should be scrutinized carefully. | ||
| 1318 | */ | ||
| 1319 | int omap_hwmod_set_ocp_autoidle(struct omap_hwmod *oh, u8 autoidle) | ||
| 1320 | { | ||
| 1321 | u32 v; | ||
| 1322 | int retval = 0; | ||
| 1323 | unsigned long flags; | ||
| 1324 | |||
| 1325 | if (!oh || oh->_state != _HWMOD_STATE_ENABLED) | ||
| 1326 | return -EINVAL; | ||
| 1327 | |||
| 1328 | spin_lock_irqsave(&oh->_lock, flags); | ||
| 1329 | |||
| 1330 | v = oh->_sysc_cache; | ||
| 1331 | |||
| 1332 | retval = _set_module_autoidle(oh, autoidle, &v); | ||
| 1333 | |||
| 1334 | if (!retval) | ||
| 1335 | _write_sysconfig(v, oh); | ||
| 1336 | |||
| 1337 | spin_unlock_irqrestore(&oh->_lock, flags); | ||
| 1338 | |||
| 1339 | return retval; | ||
| 1340 | } | ||
| 1341 | |||
| 1342 | /** | ||
| 1286 | * _shutdown - shutdown an omap_hwmod | 1343 | * _shutdown - shutdown an omap_hwmod |
| 1287 | * @oh: struct omap_hwmod * | 1344 | * @oh: struct omap_hwmod * |
| 1288 | * | 1345 | * |
| @@ -2286,3 +2343,29 @@ u32 omap_hwmod_get_context_loss_count(struct omap_hwmod *oh) | |||
| 2286 | 2343 | ||
| 2287 | return ret; | 2344 | return ret; |
| 2288 | } | 2345 | } |
| 2346 | |||
| 2347 | /** | ||
| 2348 | * omap_hwmod_no_setup_reset - prevent a hwmod from being reset upon setup | ||
| 2349 | * @oh: struct omap_hwmod * | ||
| 2350 | * | ||
| 2351 | * Prevent the hwmod @oh from being reset during the setup process. | ||
| 2352 | * Intended for use by board-*.c files on boards with devices that | ||
| 2353 | * cannot tolerate being reset. Must be called before the hwmod has | ||
| 2354 | * been set up. Returns 0 upon success or negative error code upon | ||
| 2355 | * failure. | ||
| 2356 | */ | ||
| 2357 | int omap_hwmod_no_setup_reset(struct omap_hwmod *oh) | ||
| 2358 | { | ||
| 2359 | if (!oh) | ||
| 2360 | return -EINVAL; | ||
| 2361 | |||
| 2362 | if (oh->_state != _HWMOD_STATE_REGISTERED) { | ||
| 2363 | pr_err("omap_hwmod: %s: cannot prevent setup reset; in wrong state\n", | ||
| 2364 | oh->name); | ||
| 2365 | return -EINVAL; | ||
| 2366 | } | ||
| 2367 | |||
| 2368 | oh->flags |= HWMOD_INIT_NO_RESET; | ||
| 2369 | |||
| 2370 | return 0; | ||
| 2371 | } | ||
diff --git a/arch/arm/mach-omap2/omap_hwmod_2420_data.c b/arch/arm/mach-omap2/omap_hwmod_2420_data.c index 61e58bd27ae..62823467163 100644 --- a/arch/arm/mach-omap2/omap_hwmod_2420_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_2420_data.c | |||
| @@ -988,7 +988,7 @@ static struct omap_hwmod_class_sysconfig omap2420_wd_timer_sysc = { | |||
| 988 | .sysc_offs = 0x0010, | 988 | .sysc_offs = 0x0010, |
| 989 | .syss_offs = 0x0014, | 989 | .syss_offs = 0x0014, |
| 990 | .sysc_flags = (SYSC_HAS_EMUFREE | SYSC_HAS_SOFTRESET | | 990 | .sysc_flags = (SYSC_HAS_EMUFREE | SYSC_HAS_SOFTRESET | |
| 991 | SYSC_HAS_AUTOIDLE), | 991 | SYSC_HAS_AUTOIDLE | SYSS_HAS_RESET_STATUS), |
| 992 | .sysc_fields = &omap_hwmod_sysc_type1, | 992 | .sysc_fields = &omap_hwmod_sysc_type1, |
| 993 | }; | 993 | }; |
| 994 | 994 | ||
| @@ -1029,7 +1029,7 @@ static struct omap_hwmod_class_sysconfig uart_sysc = { | |||
| 1029 | .syss_offs = 0x58, | 1029 | .syss_offs = 0x58, |
| 1030 | .sysc_flags = (SYSC_HAS_SIDLEMODE | | 1030 | .sysc_flags = (SYSC_HAS_SIDLEMODE | |
| 1031 | SYSC_HAS_ENAWAKEUP | SYSC_HAS_SOFTRESET | | 1031 | SYSC_HAS_ENAWAKEUP | SYSC_HAS_SOFTRESET | |
| 1032 | SYSC_HAS_AUTOIDLE), | 1032 | SYSC_HAS_AUTOIDLE | SYSS_HAS_RESET_STATUS), |
| 1033 | .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART), | 1033 | .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART), |
| 1034 | .sysc_fields = &omap_hwmod_sysc_type1, | 1034 | .sysc_fields = &omap_hwmod_sysc_type1, |
| 1035 | }; | 1035 | }; |
| @@ -1441,7 +1441,7 @@ static struct omap_hwmod_class_sysconfig i2c_sysc = { | |||
| 1441 | .rev_offs = 0x00, | 1441 | .rev_offs = 0x00, |
| 1442 | .sysc_offs = 0x20, | 1442 | .sysc_offs = 0x20, |
| 1443 | .syss_offs = 0x10, | 1443 | .syss_offs = 0x10, |
| 1444 | .sysc_flags = SYSC_HAS_SOFTRESET, | 1444 | .sysc_flags = (SYSC_HAS_SOFTRESET | SYSS_HAS_RESET_STATUS), |
| 1445 | .sysc_fields = &omap_hwmod_sysc_type1, | 1445 | .sysc_fields = &omap_hwmod_sysc_type1, |
| 1446 | }; | 1446 | }; |
| 1447 | 1447 | ||
| @@ -1613,7 +1613,8 @@ static struct omap_hwmod_class_sysconfig omap242x_gpio_sysc = { | |||
| 1613 | .sysc_offs = 0x0010, | 1613 | .sysc_offs = 0x0010, |
| 1614 | .syss_offs = 0x0014, | 1614 | .syss_offs = 0x0014, |
| 1615 | .sysc_flags = (SYSC_HAS_ENAWAKEUP | SYSC_HAS_SIDLEMODE | | 1615 | .sysc_flags = (SYSC_HAS_ENAWAKEUP | SYSC_HAS_SIDLEMODE | |
| 1616 | SYSC_HAS_SOFTRESET | SYSC_HAS_AUTOIDLE), | 1616 | SYSC_HAS_SOFTRESET | SYSC_HAS_AUTOIDLE | |
| 1617 | SYSS_HAS_RESET_STATUS), | ||
| 1617 | .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART), | 1618 | .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART), |
| 1618 | .sysc_fields = &omap_hwmod_sysc_type1, | 1619 | .sysc_fields = &omap_hwmod_sysc_type1, |
| 1619 | }; | 1620 | }; |
| @@ -1755,7 +1756,7 @@ static struct omap_hwmod_class_sysconfig omap2420_dma_sysc = { | |||
| 1755 | .syss_offs = 0x0028, | 1756 | .syss_offs = 0x0028, |
| 1756 | .sysc_flags = (SYSC_HAS_SOFTRESET | SYSC_HAS_MIDLEMODE | | 1757 | .sysc_flags = (SYSC_HAS_SOFTRESET | SYSC_HAS_MIDLEMODE | |
| 1757 | SYSC_HAS_CLOCKACTIVITY | SYSC_HAS_EMUFREE | | 1758 | SYSC_HAS_CLOCKACTIVITY | SYSC_HAS_EMUFREE | |
| 1758 | SYSC_HAS_AUTOIDLE), | 1759 | SYSC_HAS_AUTOIDLE | SYSS_HAS_RESET_STATUS), |
| 1759 | .idlemodes = (MSTANDBY_FORCE | MSTANDBY_NO | MSTANDBY_SMART), | 1760 | .idlemodes = (MSTANDBY_FORCE | MSTANDBY_NO | MSTANDBY_SMART), |
| 1760 | .sysc_fields = &omap_hwmod_sysc_type1, | 1761 | .sysc_fields = &omap_hwmod_sysc_type1, |
| 1761 | }; | 1762 | }; |
diff --git a/arch/arm/mach-omap2/omap_hwmod_2430_data.c b/arch/arm/mach-omap2/omap_hwmod_2430_data.c index 490789a6bed..0fdf2cabfb1 100644 --- a/arch/arm/mach-omap2/omap_hwmod_2430_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_2430_data.c | |||
| @@ -1088,7 +1088,7 @@ static struct omap_hwmod_class_sysconfig omap2430_wd_timer_sysc = { | |||
| 1088 | .sysc_offs = 0x0010, | 1088 | .sysc_offs = 0x0010, |
| 1089 | .syss_offs = 0x0014, | 1089 | .syss_offs = 0x0014, |
| 1090 | .sysc_flags = (SYSC_HAS_EMUFREE | SYSC_HAS_SOFTRESET | | 1090 | .sysc_flags = (SYSC_HAS_EMUFREE | SYSC_HAS_SOFTRESET | |
| 1091 | SYSC_HAS_AUTOIDLE), | 1091 | SYSC_HAS_AUTOIDLE | SYSS_HAS_RESET_STATUS), |
| 1092 | .sysc_fields = &omap_hwmod_sysc_type1, | 1092 | .sysc_fields = &omap_hwmod_sysc_type1, |
| 1093 | }; | 1093 | }; |
| 1094 | 1094 | ||
| @@ -1129,7 +1129,7 @@ static struct omap_hwmod_class_sysconfig uart_sysc = { | |||
| 1129 | .syss_offs = 0x58, | 1129 | .syss_offs = 0x58, |
| 1130 | .sysc_flags = (SYSC_HAS_SIDLEMODE | | 1130 | .sysc_flags = (SYSC_HAS_SIDLEMODE | |
| 1131 | SYSC_HAS_ENAWAKEUP | SYSC_HAS_SOFTRESET | | 1131 | SYSC_HAS_ENAWAKEUP | SYSC_HAS_SOFTRESET | |
| 1132 | SYSC_HAS_AUTOIDLE), | 1132 | SYSC_HAS_AUTOIDLE | SYSS_HAS_RESET_STATUS), |
| 1133 | .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART), | 1133 | .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART), |
| 1134 | .sysc_fields = &omap_hwmod_sysc_type1, | 1134 | .sysc_fields = &omap_hwmod_sysc_type1, |
| 1135 | }; | 1135 | }; |
| @@ -1516,7 +1516,8 @@ static struct omap_hwmod_class_sysconfig i2c_sysc = { | |||
| 1516 | .rev_offs = 0x00, | 1516 | .rev_offs = 0x00, |
| 1517 | .sysc_offs = 0x20, | 1517 | .sysc_offs = 0x20, |
| 1518 | .syss_offs = 0x10, | 1518 | .syss_offs = 0x10, |
| 1519 | .sysc_flags = (SYSC_HAS_SOFTRESET | SYSC_HAS_AUTOIDLE), | 1519 | .sysc_flags = (SYSC_HAS_SOFTRESET | SYSC_HAS_AUTOIDLE | |
| 1520 | SYSS_HAS_RESET_STATUS), | ||
| 1520 | .sysc_fields = &omap_hwmod_sysc_type1, | 1521 | .sysc_fields = &omap_hwmod_sysc_type1, |
| 1521 | }; | 1522 | }; |
| 1522 | 1523 | ||
| @@ -1714,7 +1715,8 @@ static struct omap_hwmod_class_sysconfig omap243x_gpio_sysc = { | |||
| 1714 | .sysc_offs = 0x0010, | 1715 | .sysc_offs = 0x0010, |
| 1715 | .syss_offs = 0x0014, | 1716 | .syss_offs = 0x0014, |
| 1716 | .sysc_flags = (SYSC_HAS_ENAWAKEUP | SYSC_HAS_SIDLEMODE | | 1717 | .sysc_flags = (SYSC_HAS_ENAWAKEUP | SYSC_HAS_SIDLEMODE | |
| 1717 | SYSC_HAS_SOFTRESET | SYSC_HAS_AUTOIDLE), | 1718 | SYSC_HAS_SOFTRESET | SYSC_HAS_AUTOIDLE | |
| 1719 | SYSS_HAS_RESET_STATUS), | ||
| 1718 | .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART), | 1720 | .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART), |
| 1719 | .sysc_fields = &omap_hwmod_sysc_type1, | 1721 | .sysc_fields = &omap_hwmod_sysc_type1, |
| 1720 | }; | 1722 | }; |
| @@ -1886,7 +1888,7 @@ static struct omap_hwmod_class_sysconfig omap2430_dma_sysc = { | |||
| 1886 | .syss_offs = 0x0028, | 1888 | .syss_offs = 0x0028, |
| 1887 | .sysc_flags = (SYSC_HAS_SOFTRESET | SYSC_HAS_MIDLEMODE | | 1889 | .sysc_flags = (SYSC_HAS_SOFTRESET | SYSC_HAS_MIDLEMODE | |
| 1888 | SYSC_HAS_CLOCKACTIVITY | SYSC_HAS_EMUFREE | | 1890 | SYSC_HAS_CLOCKACTIVITY | SYSC_HAS_EMUFREE | |
| 1889 | SYSC_HAS_AUTOIDLE), | 1891 | SYSC_HAS_AUTOIDLE | SYSS_HAS_RESET_STATUS), |
| 1890 | .idlemodes = (MSTANDBY_FORCE | MSTANDBY_NO | MSTANDBY_SMART), | 1892 | .idlemodes = (MSTANDBY_FORCE | MSTANDBY_NO | MSTANDBY_SMART), |
| 1891 | .sysc_fields = &omap_hwmod_sysc_type1, | 1893 | .sysc_fields = &omap_hwmod_sysc_type1, |
| 1892 | }; | 1894 | }; |
diff --git a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c index c4ca005f8bb..c819c306693 100644 --- a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c | |||
| @@ -23,7 +23,6 @@ | |||
| 23 | #include <plat/i2c.h> | 23 | #include <plat/i2c.h> |
| 24 | #include <plat/gpio.h> | 24 | #include <plat/gpio.h> |
| 25 | #include <plat/mmc.h> | 25 | #include <plat/mmc.h> |
| 26 | #include <plat/smartreflex.h> | ||
| 27 | #include <plat/mcbsp.h> | 26 | #include <plat/mcbsp.h> |
| 28 | #include <plat/mcspi.h> | 27 | #include <plat/mcspi.h> |
| 29 | #include <plat/dmtimer.h> | 28 | #include <plat/dmtimer.h> |
| @@ -491,26 +490,12 @@ static struct omap_hwmod_ocp_if *am35xx_usbhsotg_slaves[] = { | |||
| 491 | /* Slave interfaces on the L4_CORE interconnect */ | 490 | /* Slave interfaces on the L4_CORE interconnect */ |
| 492 | static struct omap_hwmod_ocp_if *omap3xxx_l4_core_slaves[] = { | 491 | static struct omap_hwmod_ocp_if *omap3xxx_l4_core_slaves[] = { |
| 493 | &omap3xxx_l3_main__l4_core, | 492 | &omap3xxx_l3_main__l4_core, |
| 494 | &omap3_l4_core__sr1, | ||
| 495 | &omap3_l4_core__sr2, | ||
| 496 | }; | ||
| 497 | |||
| 498 | /* Master interfaces on the L4_CORE interconnect */ | ||
| 499 | static struct omap_hwmod_ocp_if *omap3xxx_l4_core_masters[] = { | ||
| 500 | &omap3xxx_l4_core__l4_wkup, | ||
| 501 | &omap3_l4_core__uart1, | ||
| 502 | &omap3_l4_core__uart2, | ||
| 503 | &omap3_l4_core__i2c1, | ||
| 504 | &omap3_l4_core__i2c2, | ||
| 505 | &omap3_l4_core__i2c3, | ||
| 506 | }; | 493 | }; |
| 507 | 494 | ||
| 508 | /* L4 CORE */ | 495 | /* L4 CORE */ |
| 509 | static struct omap_hwmod omap3xxx_l4_core_hwmod = { | 496 | static struct omap_hwmod omap3xxx_l4_core_hwmod = { |
| 510 | .name = "l4_core", | 497 | .name = "l4_core", |
| 511 | .class = &l4_hwmod_class, | 498 | .class = &l4_hwmod_class, |
| 512 | .masters = omap3xxx_l4_core_masters, | ||
| 513 | .masters_cnt = ARRAY_SIZE(omap3xxx_l4_core_masters), | ||
| 514 | .slaves = omap3xxx_l4_core_slaves, | 499 | .slaves = omap3xxx_l4_core_slaves, |
| 515 | .slaves_cnt = ARRAY_SIZE(omap3xxx_l4_core_slaves), | 500 | .slaves_cnt = ARRAY_SIZE(omap3xxx_l4_core_slaves), |
| 516 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430), | 501 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430), |
| @@ -522,18 +507,10 @@ static struct omap_hwmod_ocp_if *omap3xxx_l4_per_slaves[] = { | |||
| 522 | &omap3xxx_l3_main__l4_per, | 507 | &omap3xxx_l3_main__l4_per, |
| 523 | }; | 508 | }; |
| 524 | 509 | ||
| 525 | /* Master interfaces on the L4_PER interconnect */ | ||
| 526 | static struct omap_hwmod_ocp_if *omap3xxx_l4_per_masters[] = { | ||
| 527 | &omap3_l4_per__uart3, | ||
| 528 | &omap3_l4_per__uart4, | ||
| 529 | }; | ||
| 530 | |||
| 531 | /* L4 PER */ | 510 | /* L4 PER */ |
| 532 | static struct omap_hwmod omap3xxx_l4_per_hwmod = { | 511 | static struct omap_hwmod omap3xxx_l4_per_hwmod = { |
| 533 | .name = "l4_per", | 512 | .name = "l4_per", |
| 534 | .class = &l4_hwmod_class, | 513 | .class = &l4_hwmod_class, |
| 535 | .masters = omap3xxx_l4_per_masters, | ||
| 536 | .masters_cnt = ARRAY_SIZE(omap3xxx_l4_per_masters), | ||
| 537 | .slaves = omap3xxx_l4_per_slaves, | 514 | .slaves = omap3xxx_l4_per_slaves, |
| 538 | .slaves_cnt = ARRAY_SIZE(omap3xxx_l4_per_slaves), | 515 | .slaves_cnt = ARRAY_SIZE(omap3xxx_l4_per_slaves), |
| 539 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430), | 516 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430), |
| @@ -545,16 +522,10 @@ static struct omap_hwmod_ocp_if *omap3xxx_l4_wkup_slaves[] = { | |||
| 545 | &omap3xxx_l4_core__l4_wkup, | 522 | &omap3xxx_l4_core__l4_wkup, |
| 546 | }; | 523 | }; |
| 547 | 524 | ||
| 548 | /* Master interfaces on the L4_WKUP interconnect */ | ||
| 549 | static struct omap_hwmod_ocp_if *omap3xxx_l4_wkup_masters[] = { | ||
| 550 | }; | ||
| 551 | |||
| 552 | /* L4 WKUP */ | 525 | /* L4 WKUP */ |
| 553 | static struct omap_hwmod omap3xxx_l4_wkup_hwmod = { | 526 | static struct omap_hwmod omap3xxx_l4_wkup_hwmod = { |
| 554 | .name = "l4_wkup", | 527 | .name = "l4_wkup", |
| 555 | .class = &l4_hwmod_class, | 528 | .class = &l4_hwmod_class, |
| 556 | .masters = omap3xxx_l4_wkup_masters, | ||
| 557 | .masters_cnt = ARRAY_SIZE(omap3xxx_l4_wkup_masters), | ||
| 558 | .slaves = omap3xxx_l4_wkup_slaves, | 529 | .slaves = omap3xxx_l4_wkup_slaves, |
| 559 | .slaves_cnt = ARRAY_SIZE(omap3xxx_l4_wkup_slaves), | 530 | .slaves_cnt = ARRAY_SIZE(omap3xxx_l4_wkup_slaves), |
| 560 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430), | 531 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430), |
| @@ -1268,7 +1239,8 @@ static struct omap_hwmod_class_sysconfig omap3xxx_wd_timer_sysc = { | |||
| 1268 | .syss_offs = 0x0014, | 1239 | .syss_offs = 0x0014, |
| 1269 | .sysc_flags = (SYSC_HAS_SIDLEMODE | SYSC_HAS_EMUFREE | | 1240 | .sysc_flags = (SYSC_HAS_SIDLEMODE | SYSC_HAS_EMUFREE | |
| 1270 | SYSC_HAS_ENAWAKEUP | SYSC_HAS_SOFTRESET | | 1241 | SYSC_HAS_ENAWAKEUP | SYSC_HAS_SOFTRESET | |
| 1271 | SYSC_HAS_AUTOIDLE | SYSC_HAS_CLOCKACTIVITY), | 1242 | SYSC_HAS_AUTOIDLE | SYSC_HAS_CLOCKACTIVITY | |
| 1243 | SYSS_HAS_RESET_STATUS), | ||
| 1272 | .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART), | 1244 | .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART), |
| 1273 | .sysc_fields = &omap_hwmod_sysc_type1, | 1245 | .sysc_fields = &omap_hwmod_sysc_type1, |
| 1274 | }; | 1246 | }; |
| @@ -1280,7 +1252,7 @@ static struct omap_hwmod_class_sysconfig i2c_sysc = { | |||
| 1280 | .syss_offs = 0x10, | 1252 | .syss_offs = 0x10, |
| 1281 | .sysc_flags = (SYSC_HAS_CLOCKACTIVITY | SYSC_HAS_SIDLEMODE | | 1253 | .sysc_flags = (SYSC_HAS_CLOCKACTIVITY | SYSC_HAS_SIDLEMODE | |
| 1282 | SYSC_HAS_ENAWAKEUP | SYSC_HAS_SOFTRESET | | 1254 | SYSC_HAS_ENAWAKEUP | SYSC_HAS_SOFTRESET | |
| 1283 | SYSC_HAS_AUTOIDLE), | 1255 | SYSC_HAS_AUTOIDLE | SYSS_HAS_RESET_STATUS), |
| 1284 | .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART), | 1256 | .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART), |
| 1285 | .sysc_fields = &omap_hwmod_sysc_type1, | 1257 | .sysc_fields = &omap_hwmod_sysc_type1, |
| 1286 | }; | 1258 | }; |
| @@ -1312,6 +1284,11 @@ static struct omap_hwmod omap3xxx_wd_timer2_hwmod = { | |||
| 1312 | .slaves = omap3xxx_wd_timer2_slaves, | 1284 | .slaves = omap3xxx_wd_timer2_slaves, |
| 1313 | .slaves_cnt = ARRAY_SIZE(omap3xxx_wd_timer2_slaves), | 1285 | .slaves_cnt = ARRAY_SIZE(omap3xxx_wd_timer2_slaves), |
| 1314 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430), | 1286 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430), |
| 1287 | /* | ||
| 1288 | * XXX: Use software supervised mode, HW supervised smartidle seems to | ||
| 1289 | * block CORE power domain idle transitions. Maybe a HW bug in wdt2? | ||
| 1290 | */ | ||
| 1291 | .flags = HWMOD_SWSUP_SIDLE, | ||
| 1315 | }; | 1292 | }; |
| 1316 | 1293 | ||
| 1317 | /* UART common */ | 1294 | /* UART common */ |
| @@ -1322,7 +1299,7 @@ static struct omap_hwmod_class_sysconfig uart_sysc = { | |||
| 1322 | .syss_offs = 0x58, | 1299 | .syss_offs = 0x58, |
| 1323 | .sysc_flags = (SYSC_HAS_SIDLEMODE | | 1300 | .sysc_flags = (SYSC_HAS_SIDLEMODE | |
| 1324 | SYSC_HAS_ENAWAKEUP | SYSC_HAS_SOFTRESET | | 1301 | SYSC_HAS_ENAWAKEUP | SYSC_HAS_SOFTRESET | |
| 1325 | SYSC_HAS_AUTOIDLE), | 1302 | SYSC_HAS_AUTOIDLE | SYSS_HAS_RESET_STATUS), |
| 1326 | .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART), | 1303 | .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART), |
| 1327 | .sysc_fields = &omap_hwmod_sysc_type1, | 1304 | .sysc_fields = &omap_hwmod_sysc_type1, |
| 1328 | }; | 1305 | }; |
| @@ -2128,7 +2105,8 @@ static struct omap_hwmod_class_sysconfig omap3xxx_gpio_sysc = { | |||
| 2128 | .sysc_offs = 0x0010, | 2105 | .sysc_offs = 0x0010, |
| 2129 | .syss_offs = 0x0014, | 2106 | .syss_offs = 0x0014, |
| 2130 | .sysc_flags = (SYSC_HAS_ENAWAKEUP | SYSC_HAS_SIDLEMODE | | 2107 | .sysc_flags = (SYSC_HAS_ENAWAKEUP | SYSC_HAS_SIDLEMODE | |
| 2131 | SYSC_HAS_SOFTRESET | SYSC_HAS_AUTOIDLE), | 2108 | SYSC_HAS_SOFTRESET | SYSC_HAS_AUTOIDLE | |
| 2109 | SYSS_HAS_RESET_STATUS), | ||
| 2132 | .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART), | 2110 | .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART), |
| 2133 | .sysc_fields = &omap_hwmod_sysc_type1, | 2111 | .sysc_fields = &omap_hwmod_sysc_type1, |
| 2134 | }; | 2112 | }; |
| @@ -2382,7 +2360,8 @@ static struct omap_hwmod_class_sysconfig omap3xxx_dma_sysc = { | |||
| 2382 | .syss_offs = 0x0028, | 2360 | .syss_offs = 0x0028, |
| 2383 | .sysc_flags = (SYSC_HAS_SIDLEMODE | SYSC_HAS_SOFTRESET | | 2361 | .sysc_flags = (SYSC_HAS_SIDLEMODE | SYSC_HAS_SOFTRESET | |
| 2384 | SYSC_HAS_MIDLEMODE | SYSC_HAS_CLOCKACTIVITY | | 2362 | SYSC_HAS_MIDLEMODE | SYSC_HAS_CLOCKACTIVITY | |
| 2385 | SYSC_HAS_EMUFREE | SYSC_HAS_AUTOIDLE), | 2363 | SYSC_HAS_EMUFREE | SYSC_HAS_AUTOIDLE | |
| 2364 | SYSS_HAS_RESET_STATUS), | ||
| 2386 | .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART | | 2365 | .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART | |
| 2387 | MSTANDBY_FORCE | MSTANDBY_NO | MSTANDBY_SMART), | 2366 | MSTANDBY_FORCE | MSTANDBY_NO | MSTANDBY_SMART), |
| 2388 | .sysc_fields = &omap_hwmod_sysc_type1, | 2367 | .sysc_fields = &omap_hwmod_sysc_type1, |
diff --git a/arch/arm/mach-omap2/omap_opp_data.h b/arch/arm/mach-omap2/omap_opp_data.h index 46ac27dd6c8..c784c12f98a 100644 --- a/arch/arm/mach-omap2/omap_opp_data.h +++ b/arch/arm/mach-omap2/omap_opp_data.h | |||
| @@ -21,6 +21,8 @@ | |||
| 21 | 21 | ||
| 22 | #include <plat/omap_hwmod.h> | 22 | #include <plat/omap_hwmod.h> |
| 23 | 23 | ||
| 24 | #include "voltage.h" | ||
| 25 | |||
| 24 | /* | 26 | /* |
| 25 | * *BIG FAT WARNING*: | 27 | * *BIG FAT WARNING*: |
| 26 | * USE the following ONLY in opp data initialization common to an SoC. | 28 | * USE the following ONLY in opp data initialization common to an SoC. |
| @@ -65,8 +67,30 @@ struct omap_opp_def { | |||
| 65 | .u_volt = _uv, \ | 67 | .u_volt = _uv, \ |
| 66 | } | 68 | } |
| 67 | 69 | ||
| 70 | /* | ||
| 71 | * Initialization wrapper used to define SmartReflex process data | ||
| 72 | * XXX Is this needed? Just use C99 initializers in data files? | ||
| 73 | */ | ||
| 74 | #define VOLT_DATA_DEFINE(_v_nom, _efuse_offs, _errminlimit, _errgain) \ | ||
| 75 | { \ | ||
| 76 | .volt_nominal = _v_nom, \ | ||
| 77 | .sr_efuse_offs = _efuse_offs, \ | ||
| 78 | .sr_errminlimit = _errminlimit, \ | ||
| 79 | .vp_errgain = _errgain \ | ||
| 80 | } | ||
| 81 | |||
| 68 | /* Use this to initialize the default table */ | 82 | /* Use this to initialize the default table */ |
| 69 | extern int __init omap_init_opp_table(struct omap_opp_def *opp_def, | 83 | extern int __init omap_init_opp_table(struct omap_opp_def *opp_def, |
| 70 | u32 opp_def_size); | 84 | u32 opp_def_size); |
| 71 | 85 | ||
| 86 | |||
| 87 | extern struct omap_volt_data omap34xx_vddmpu_volt_data[]; | ||
| 88 | extern struct omap_volt_data omap34xx_vddcore_volt_data[]; | ||
| 89 | extern struct omap_volt_data omap36xx_vddmpu_volt_data[]; | ||
| 90 | extern struct omap_volt_data omap36xx_vddcore_volt_data[]; | ||
| 91 | |||
| 92 | extern struct omap_volt_data omap44xx_vdd_mpu_volt_data[]; | ||
| 93 | extern struct omap_volt_data omap44xx_vdd_iva_volt_data[]; | ||
| 94 | extern struct omap_volt_data omap44xx_vdd_core_volt_data[]; | ||
| 95 | |||
| 72 | #endif /* __ARCH_ARM_MACH_OMAP2_OMAP_OPP_DATA_H */ | 96 | #endif /* __ARCH_ARM_MACH_OMAP2_OMAP_OPP_DATA_H */ |
diff --git a/arch/arm/mach-omap2/omap_twl.c b/arch/arm/mach-omap2/omap_twl.c index 00e1d2b5368..0a8e74e3e81 100644 --- a/arch/arm/mach-omap2/omap_twl.c +++ b/arch/arm/mach-omap2/omap_twl.c | |||
| @@ -18,7 +18,7 @@ | |||
| 18 | #include <linux/kernel.h> | 18 | #include <linux/kernel.h> |
| 19 | #include <linux/i2c/twl.h> | 19 | #include <linux/i2c/twl.h> |
| 20 | 20 | ||
| 21 | #include <plat/voltage.h> | 21 | #include "voltage.h" |
| 22 | 22 | ||
| 23 | #include "pm.h" | 23 | #include "pm.h" |
| 24 | 24 | ||
| @@ -59,8 +59,15 @@ | |||
| 59 | 59 | ||
| 60 | static bool is_offset_valid; | 60 | static bool is_offset_valid; |
| 61 | static u8 smps_offset; | 61 | static u8 smps_offset; |
| 62 | /* | ||
| 63 | * Flag to ensure Smartreflex bit in TWL | ||
| 64 | * being cleared in board file is not overwritten. | ||
| 65 | */ | ||
| 66 | static bool __initdata twl_sr_enable_autoinit; | ||
| 62 | 67 | ||
| 68 | #define TWL4030_DCDC_GLOBAL_CFG 0x06 | ||
| 63 | #define REG_SMPS_OFFSET 0xE0 | 69 | #define REG_SMPS_OFFSET 0xE0 |
| 70 | #define SMARTREFLEX_ENABLE BIT(3) | ||
| 64 | 71 | ||
| 65 | static unsigned long twl4030_vsel_to_uv(const u8 vsel) | 72 | static unsigned long twl4030_vsel_to_uv(const u8 vsel) |
| 66 | { | 73 | { |
| @@ -269,6 +276,18 @@ int __init omap3_twl_init(void) | |||
| 269 | omap3_core_volt_info.vp_vddmax = OMAP3630_VP2_VLIMITTO_VDDMAX; | 276 | omap3_core_volt_info.vp_vddmax = OMAP3630_VP2_VLIMITTO_VDDMAX; |
| 270 | } | 277 | } |
| 271 | 278 | ||
| 279 | /* | ||
| 280 | * The smartreflex bit on twl4030 specifies if the setting of voltage | ||
| 281 | * is done over the I2C_SR path. Since this setting is independent of | ||
| 282 | * the actual usage of smartreflex AVS module, we enable TWL SR bit | ||
| 283 | * by default irrespective of whether smartreflex AVS module is enabled | ||
| 284 | * on the OMAP side or not. This is because without this bit enabled, | ||
| 285 | * the voltage scaling through vp forceupdate/bypass mechanism of | ||
| 286 | * voltage scaling will not function on TWL over I2C_SR. | ||
| 287 | */ | ||
| 288 | if (!twl_sr_enable_autoinit) | ||
| 289 | omap3_twl_set_sr_bit(true); | ||
| 290 | |||
| 272 | voltdm = omap_voltage_domain_lookup("mpu"); | 291 | voltdm = omap_voltage_domain_lookup("mpu"); |
| 273 | omap_voltage_register_pmic(voltdm, &omap3_mpu_volt_info); | 292 | omap_voltage_register_pmic(voltdm, &omap3_mpu_volt_info); |
| 274 | 293 | ||
| @@ -277,3 +296,44 @@ int __init omap3_twl_init(void) | |||
| 277 | 296 | ||
| 278 | return 0; | 297 | return 0; |
| 279 | } | 298 | } |
| 299 | |||
| 300 | /** | ||
| 301 | * omap3_twl_set_sr_bit() - Set/Clear SR bit on TWL | ||
| 302 | * @enable: enable SR mode in twl or not | ||
| 303 | * | ||
| 304 | * If 'enable' is true, enables Smartreflex bit on TWL 4030 to make sure | ||
| 305 | * voltage scaling through OMAP SR works. Else, the smartreflex bit | ||
| 306 | * on twl4030 is cleared as there are platforms which use OMAP3 and T2 but | ||
| 307 | * use Synchronized Scaling Hardware Strategy (ENABLE_VMODE=1) and Direct | ||
| 308 | * Strategy Software Scaling Mode (ENABLE_VMODE=0), for setting the voltages, | ||
| 309 | * in those scenarios this bit is to be cleared (enable = false). | ||
| 310 | * | ||
| 311 | * Returns 0 on sucess, error is returned if I2C read/write fails. | ||
| 312 | */ | ||
| 313 | int __init omap3_twl_set_sr_bit(bool enable) | ||
| 314 | { | ||
| 315 | u8 temp; | ||
| 316 | int ret; | ||
| 317 | if (twl_sr_enable_autoinit) | ||
| 318 | pr_warning("%s: unexpected multiple calls\n", __func__); | ||
| 319 | |||
| 320 | ret = twl_i2c_read_u8(TWL4030_MODULE_PM_RECEIVER, &temp, | ||
| 321 | TWL4030_DCDC_GLOBAL_CFG); | ||
| 322 | if (ret) | ||
| 323 | goto err; | ||
| 324 | |||
| 325 | if (enable) | ||
| 326 | temp |= SMARTREFLEX_ENABLE; | ||
| 327 | else | ||
| 328 | temp &= ~SMARTREFLEX_ENABLE; | ||
| 329 | |||
| 330 | ret = twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, temp, | ||
| 331 | TWL4030_DCDC_GLOBAL_CFG); | ||
| 332 | if (!ret) { | ||
| 333 | twl_sr_enable_autoinit = true; | ||
| 334 | return 0; | ||
| 335 | } | ||
| 336 | err: | ||
| 337 | pr_err("%s: Error access to TWL4030 (%d)\n", __func__, ret); | ||
| 338 | return ret; | ||
| 339 | } | ||
diff --git a/arch/arm/mach-omap2/opp3xxx_data.c b/arch/arm/mach-omap2/opp3xxx_data.c index 0486fce8a92..d95f3f945d4 100644 --- a/arch/arm/mach-omap2/opp3xxx_data.c +++ b/arch/arm/mach-omap2/opp3xxx_data.c | |||
| @@ -4,8 +4,9 @@ | |||
| 4 | * Copyright (C) 2009-2010 Texas Instruments Incorporated - http://www.ti.com/ | 4 | * Copyright (C) 2009-2010 Texas Instruments Incorporated - http://www.ti.com/ |
| 5 | * Nishanth Menon | 5 | * Nishanth Menon |
| 6 | * Kevin Hilman | 6 | * Kevin Hilman |
| 7 | * Copyright (C) 2010 Nokia Corporation. | 7 | * Copyright (C) 2010-2011 Nokia Corporation. |
| 8 | * Eduardo Valentin | 8 | * Eduardo Valentin |
| 9 | * Paul Walmsley | ||
| 9 | * | 10 | * |
| 10 | * This program is free software; you can redistribute it and/or modify | 11 | * This program is free software; you can redistribute it and/or modify |
| 11 | * it under the terms of the GNU General Public License version 2 as | 12 | * it under the terms of the GNU General Public License version 2 as |
| @@ -20,19 +21,83 @@ | |||
| 20 | 21 | ||
| 21 | #include <plat/cpu.h> | 22 | #include <plat/cpu.h> |
| 22 | 23 | ||
| 24 | #include "control.h" | ||
| 23 | #include "omap_opp_data.h" | 25 | #include "omap_opp_data.h" |
| 26 | #include "pm.h" | ||
| 27 | |||
| 28 | /* 34xx */ | ||
| 29 | |||
| 30 | /* VDD1 */ | ||
| 31 | |||
| 32 | #define OMAP3430_VDD_MPU_OPP1_UV 975000 | ||
| 33 | #define OMAP3430_VDD_MPU_OPP2_UV 1075000 | ||
| 34 | #define OMAP3430_VDD_MPU_OPP3_UV 1200000 | ||
| 35 | #define OMAP3430_VDD_MPU_OPP4_UV 1270000 | ||
| 36 | #define OMAP3430_VDD_MPU_OPP5_UV 1350000 | ||
| 37 | |||
| 38 | struct omap_volt_data omap34xx_vddmpu_volt_data[] = { | ||
| 39 | VOLT_DATA_DEFINE(OMAP3430_VDD_MPU_OPP1_UV, OMAP343X_CONTROL_FUSE_OPP1_VDD1, 0xf4, 0x0c), | ||
| 40 | VOLT_DATA_DEFINE(OMAP3430_VDD_MPU_OPP2_UV, OMAP343X_CONTROL_FUSE_OPP2_VDD1, 0xf4, 0x0c), | ||
| 41 | VOLT_DATA_DEFINE(OMAP3430_VDD_MPU_OPP3_UV, OMAP343X_CONTROL_FUSE_OPP3_VDD1, 0xf9, 0x18), | ||
| 42 | VOLT_DATA_DEFINE(OMAP3430_VDD_MPU_OPP4_UV, OMAP343X_CONTROL_FUSE_OPP4_VDD1, 0xf9, 0x18), | ||
| 43 | VOLT_DATA_DEFINE(OMAP3430_VDD_MPU_OPP5_UV, OMAP343X_CONTROL_FUSE_OPP5_VDD1, 0xf9, 0x18), | ||
| 44 | VOLT_DATA_DEFINE(0, 0, 0, 0), | ||
| 45 | }; | ||
| 46 | |||
| 47 | /* VDD2 */ | ||
| 48 | |||
| 49 | #define OMAP3430_VDD_CORE_OPP1_UV 975000 | ||
| 50 | #define OMAP3430_VDD_CORE_OPP2_UV 1050000 | ||
| 51 | #define OMAP3430_VDD_CORE_OPP3_UV 1150000 | ||
| 52 | |||
| 53 | struct omap_volt_data omap34xx_vddcore_volt_data[] = { | ||
| 54 | VOLT_DATA_DEFINE(OMAP3430_VDD_CORE_OPP1_UV, OMAP343X_CONTROL_FUSE_OPP1_VDD2, 0xf4, 0x0c), | ||
| 55 | VOLT_DATA_DEFINE(OMAP3430_VDD_CORE_OPP2_UV, OMAP343X_CONTROL_FUSE_OPP2_VDD2, 0xf4, 0x0c), | ||
| 56 | VOLT_DATA_DEFINE(OMAP3430_VDD_CORE_OPP3_UV, OMAP343X_CONTROL_FUSE_OPP3_VDD2, 0xf9, 0x18), | ||
| 57 | VOLT_DATA_DEFINE(0, 0, 0, 0), | ||
| 58 | }; | ||
| 59 | |||
| 60 | /* 36xx */ | ||
| 61 | |||
| 62 | /* VDD1 */ | ||
| 63 | |||
| 64 | #define OMAP3630_VDD_MPU_OPP50_UV 1012500 | ||
| 65 | #define OMAP3630_VDD_MPU_OPP100_UV 1200000 | ||
| 66 | #define OMAP3630_VDD_MPU_OPP120_UV 1325000 | ||
| 67 | #define OMAP3630_VDD_MPU_OPP1G_UV 1375000 | ||
| 68 | |||
| 69 | struct omap_volt_data omap36xx_vddmpu_volt_data[] = { | ||
| 70 | VOLT_DATA_DEFINE(OMAP3630_VDD_MPU_OPP50_UV, OMAP3630_CONTROL_FUSE_OPP50_VDD1, 0xf4, 0x0c), | ||
| 71 | VOLT_DATA_DEFINE(OMAP3630_VDD_MPU_OPP100_UV, OMAP3630_CONTROL_FUSE_OPP100_VDD1, 0xf9, 0x16), | ||
| 72 | VOLT_DATA_DEFINE(OMAP3630_VDD_MPU_OPP120_UV, OMAP3630_CONTROL_FUSE_OPP120_VDD1, 0xfa, 0x23), | ||
| 73 | VOLT_DATA_DEFINE(OMAP3630_VDD_MPU_OPP1G_UV, OMAP3630_CONTROL_FUSE_OPP1G_VDD1, 0xfa, 0x27), | ||
| 74 | VOLT_DATA_DEFINE(0, 0, 0, 0), | ||
| 75 | }; | ||
| 76 | |||
| 77 | /* VDD2 */ | ||
| 78 | |||
| 79 | #define OMAP3630_VDD_CORE_OPP50_UV 1000000 | ||
| 80 | #define OMAP3630_VDD_CORE_OPP100_UV 1200000 | ||
| 81 | |||
| 82 | struct omap_volt_data omap36xx_vddcore_volt_data[] = { | ||
| 83 | VOLT_DATA_DEFINE(OMAP3630_VDD_CORE_OPP50_UV, OMAP3630_CONTROL_FUSE_OPP50_VDD2, 0xf4, 0x0c), | ||
| 84 | VOLT_DATA_DEFINE(OMAP3630_VDD_CORE_OPP100_UV, OMAP3630_CONTROL_FUSE_OPP100_VDD2, 0xf9, 0x16), | ||
| 85 | VOLT_DATA_DEFINE(0, 0, 0, 0), | ||
| 86 | }; | ||
| 87 | |||
| 88 | /* OPP data */ | ||
| 24 | 89 | ||
| 25 | static struct omap_opp_def __initdata omap34xx_opp_def_list[] = { | 90 | static struct omap_opp_def __initdata omap34xx_opp_def_list[] = { |
| 26 | /* MPU OPP1 */ | 91 | /* MPU OPP1 */ |
| 27 | OPP_INITIALIZER("mpu", true, 125000000, 975000), | 92 | OPP_INITIALIZER("mpu", true, 125000000, OMAP3430_VDD_MPU_OPP1_UV), |
| 28 | /* MPU OPP2 */ | 93 | /* MPU OPP2 */ |
| 29 | OPP_INITIALIZER("mpu", true, 250000000, 1075000), | 94 | OPP_INITIALIZER("mpu", true, 250000000, OMAP3430_VDD_MPU_OPP2_UV), |
| 30 | /* MPU OPP3 */ | 95 | /* MPU OPP3 */ |
| 31 | OPP_INITIALIZER("mpu", true, 500000000, 1200000), | 96 | OPP_INITIALIZER("mpu", true, 500000000, OMAP3430_VDD_MPU_OPP3_UV), |
| 32 | /* MPU OPP4 */ | 97 | /* MPU OPP4 */ |
| 33 | OPP_INITIALIZER("mpu", true, 550000000, 1270000), | 98 | OPP_INITIALIZER("mpu", true, 550000000, OMAP3430_VDD_MPU_OPP4_UV), |
| 34 | /* MPU OPP5 */ | 99 | /* MPU OPP5 */ |
| 35 | OPP_INITIALIZER("mpu", true, 600000000, 1350000), | 100 | OPP_INITIALIZER("mpu", true, 600000000, OMAP3430_VDD_MPU_OPP5_UV), |
| 36 | 101 | ||
| 37 | /* | 102 | /* |
| 38 | * L3 OPP1 - 41.5 MHz is disabled because: The voltage for that OPP is | 103 | * L3 OPP1 - 41.5 MHz is disabled because: The voltage for that OPP is |
| @@ -42,53 +107,53 @@ static struct omap_opp_def __initdata omap34xx_opp_def_list[] = { | |||
| 42 | * impact that frequency will do to the MPU and the whole system in | 107 | * impact that frequency will do to the MPU and the whole system in |
| 43 | * general. | 108 | * general. |
| 44 | */ | 109 | */ |
| 45 | OPP_INITIALIZER("l3_main", false, 41500000, 975000), | 110 | OPP_INITIALIZER("l3_main", false, 41500000, OMAP3430_VDD_CORE_OPP1_UV), |
| 46 | /* L3 OPP2 */ | 111 | /* L3 OPP2 */ |
| 47 | OPP_INITIALIZER("l3_main", true, 83000000, 1050000), | 112 | OPP_INITIALIZER("l3_main", true, 83000000, OMAP3430_VDD_CORE_OPP2_UV), |
| 48 | /* L3 OPP3 */ | 113 | /* L3 OPP3 */ |
| 49 | OPP_INITIALIZER("l3_main", true, 166000000, 1150000), | 114 | OPP_INITIALIZER("l3_main", true, 166000000, OMAP3430_VDD_CORE_OPP3_UV), |
| 50 | 115 | ||
| 51 | /* DSP OPP1 */ | 116 | /* DSP OPP1 */ |
| 52 | OPP_INITIALIZER("iva", true, 90000000, 975000), | 117 | OPP_INITIALIZER("iva", true, 90000000, OMAP3430_VDD_MPU_OPP1_UV), |
| 53 | /* DSP OPP2 */ | 118 | /* DSP OPP2 */ |
| 54 | OPP_INITIALIZER("iva", true, 180000000, 1075000), | 119 | OPP_INITIALIZER("iva", true, 180000000, OMAP3430_VDD_MPU_OPP2_UV), |
| 55 | /* DSP OPP3 */ | 120 | /* DSP OPP3 */ |
| 56 | OPP_INITIALIZER("iva", true, 360000000, 1200000), | 121 | OPP_INITIALIZER("iva", true, 360000000, OMAP3430_VDD_MPU_OPP3_UV), |
| 57 | /* DSP OPP4 */ | 122 | /* DSP OPP4 */ |
| 58 | OPP_INITIALIZER("iva", true, 400000000, 1270000), | 123 | OPP_INITIALIZER("iva", true, 400000000, OMAP3430_VDD_MPU_OPP4_UV), |
| 59 | /* DSP OPP5 */ | 124 | /* DSP OPP5 */ |
| 60 | OPP_INITIALIZER("iva", true, 430000000, 1350000), | 125 | OPP_INITIALIZER("iva", true, 430000000, OMAP3430_VDD_MPU_OPP5_UV), |
| 61 | }; | 126 | }; |
| 62 | 127 | ||
| 63 | static struct omap_opp_def __initdata omap36xx_opp_def_list[] = { | 128 | static struct omap_opp_def __initdata omap36xx_opp_def_list[] = { |
| 64 | /* MPU OPP1 - OPP50 */ | 129 | /* MPU OPP1 - OPP50 */ |
| 65 | OPP_INITIALIZER("mpu", true, 300000000, 1012500), | 130 | OPP_INITIALIZER("mpu", true, 300000000, OMAP3630_VDD_MPU_OPP50_UV), |
| 66 | /* MPU OPP2 - OPP100 */ | 131 | /* MPU OPP2 - OPP100 */ |
| 67 | OPP_INITIALIZER("mpu", true, 600000000, 1200000), | 132 | OPP_INITIALIZER("mpu", true, 600000000, OMAP3630_VDD_MPU_OPP100_UV), |
| 68 | /* MPU OPP3 - OPP-Turbo */ | 133 | /* MPU OPP3 - OPP-Turbo */ |
| 69 | OPP_INITIALIZER("mpu", false, 800000000, 1325000), | 134 | OPP_INITIALIZER("mpu", false, 800000000, OMAP3630_VDD_MPU_OPP120_UV), |
| 70 | /* MPU OPP4 - OPP-SB */ | 135 | /* MPU OPP4 - OPP-SB */ |
| 71 | OPP_INITIALIZER("mpu", false, 1000000000, 1375000), | 136 | OPP_INITIALIZER("mpu", false, 1000000000, OMAP3630_VDD_MPU_OPP1G_UV), |
| 72 | 137 | ||
| 73 | /* L3 OPP1 - OPP50 */ | 138 | /* L3 OPP1 - OPP50 */ |
| 74 | OPP_INITIALIZER("l3_main", true, 100000000, 1000000), | 139 | OPP_INITIALIZER("l3_main", true, 100000000, OMAP3630_VDD_CORE_OPP50_UV), |
| 75 | /* L3 OPP2 - OPP100, OPP-Turbo, OPP-SB */ | 140 | /* L3 OPP2 - OPP100, OPP-Turbo, OPP-SB */ |
| 76 | OPP_INITIALIZER("l3_main", true, 200000000, 1200000), | 141 | OPP_INITIALIZER("l3_main", true, 200000000, OMAP3630_VDD_CORE_OPP100_UV), |
| 77 | 142 | ||
| 78 | /* DSP OPP1 - OPP50 */ | 143 | /* DSP OPP1 - OPP50 */ |
| 79 | OPP_INITIALIZER("iva", true, 260000000, 1012500), | 144 | OPP_INITIALIZER("iva", true, 260000000, OMAP3630_VDD_MPU_OPP50_UV), |
| 80 | /* DSP OPP2 - OPP100 */ | 145 | /* DSP OPP2 - OPP100 */ |
| 81 | OPP_INITIALIZER("iva", true, 520000000, 1200000), | 146 | OPP_INITIALIZER("iva", true, 520000000, OMAP3630_VDD_MPU_OPP100_UV), |
| 82 | /* DSP OPP3 - OPP-Turbo */ | 147 | /* DSP OPP3 - OPP-Turbo */ |
| 83 | OPP_INITIALIZER("iva", false, 660000000, 1325000), | 148 | OPP_INITIALIZER("iva", false, 660000000, OMAP3630_VDD_MPU_OPP120_UV), |
| 84 | /* DSP OPP4 - OPP-SB */ | 149 | /* DSP OPP4 - OPP-SB */ |
| 85 | OPP_INITIALIZER("iva", false, 800000000, 1375000), | 150 | OPP_INITIALIZER("iva", false, 800000000, OMAP3630_VDD_MPU_OPP1G_UV), |
| 86 | }; | 151 | }; |
| 87 | 152 | ||
| 88 | /** | 153 | /** |
| 89 | * omap3_opp_init() - initialize omap3 opp table | 154 | * omap3_opp_init() - initialize omap3 opp table |
| 90 | */ | 155 | */ |
| 91 | static int __init omap3_opp_init(void) | 156 | int __init omap3_opp_init(void) |
| 92 | { | 157 | { |
| 93 | int r = -ENODEV; | 158 | int r = -ENODEV; |
| 94 | 159 | ||
diff --git a/arch/arm/mach-omap2/opp4xxx_data.c b/arch/arm/mach-omap2/opp4xxx_data.c index a11fa566d8e..2293ba27101 100644 --- a/arch/arm/mach-omap2/opp4xxx_data.c +++ b/arch/arm/mach-omap2/opp4xxx_data.c | |||
| @@ -5,8 +5,9 @@ | |||
| 5 | * Nishanth Menon | 5 | * Nishanth Menon |
| 6 | * Kevin Hilman | 6 | * Kevin Hilman |
| 7 | * Thara Gopinath | 7 | * Thara Gopinath |
| 8 | * Copyright (C) 2010 Nokia Corporation. | 8 | * Copyright (C) 2010-2011 Nokia Corporation. |
| 9 | * Eduardo Valentin | 9 | * Eduardo Valentin |
| 10 | * Paul Walmsley | ||
| 10 | * | 11 | * |
| 11 | * This program is free software; you can redistribute it and/or modify | 12 | * This program is free software; you can redistribute it and/or modify |
| 12 | * it under the terms of the GNU General Public License version 2 as | 13 | * it under the terms of the GNU General Public License version 2 as |
| @@ -21,28 +22,75 @@ | |||
| 21 | 22 | ||
| 22 | #include <plat/cpu.h> | 23 | #include <plat/cpu.h> |
| 23 | 24 | ||
| 25 | #include "control.h" | ||
| 24 | #include "omap_opp_data.h" | 26 | #include "omap_opp_data.h" |
| 27 | #include "pm.h" | ||
| 28 | |||
| 29 | /* | ||
| 30 | * Structures containing OMAP4430 voltage supported and various | ||
| 31 | * voltage dependent data for each VDD. | ||
| 32 | */ | ||
| 33 | |||
| 34 | #define OMAP4430_VDD_MPU_OPP50_UV 1025000 | ||
| 35 | #define OMAP4430_VDD_MPU_OPP100_UV 1200000 | ||
| 36 | #define OMAP4430_VDD_MPU_OPPTURBO_UV 1313000 | ||
| 37 | #define OMAP4430_VDD_MPU_OPPNITRO_UV 1375000 | ||
| 38 | |||
| 39 | struct omap_volt_data omap44xx_vdd_mpu_volt_data[] = { | ||
| 40 | VOLT_DATA_DEFINE(OMAP4430_VDD_MPU_OPP50_UV, OMAP44XX_CONTROL_FUSE_MPU_OPP50, 0xf4, 0x0c), | ||
| 41 | VOLT_DATA_DEFINE(OMAP4430_VDD_MPU_OPP100_UV, OMAP44XX_CONTROL_FUSE_MPU_OPP100, 0xf9, 0x16), | ||
| 42 | VOLT_DATA_DEFINE(OMAP4430_VDD_MPU_OPPTURBO_UV, OMAP44XX_CONTROL_FUSE_MPU_OPPTURBO, 0xfa, 0x23), | ||
| 43 | VOLT_DATA_DEFINE(OMAP4430_VDD_MPU_OPPNITRO_UV, OMAP44XX_CONTROL_FUSE_MPU_OPPNITRO, 0xfa, 0x27), | ||
| 44 | VOLT_DATA_DEFINE(0, 0, 0, 0), | ||
| 45 | }; | ||
| 46 | |||
| 47 | #define OMAP4430_VDD_IVA_OPP50_UV 1013000 | ||
| 48 | #define OMAP4430_VDD_IVA_OPP100_UV 1188000 | ||
| 49 | #define OMAP4430_VDD_IVA_OPPTURBO_UV 1300000 | ||
| 50 | |||
| 51 | struct omap_volt_data omap44xx_vdd_iva_volt_data[] = { | ||
| 52 | VOLT_DATA_DEFINE(OMAP4430_VDD_IVA_OPP50_UV, OMAP44XX_CONTROL_FUSE_IVA_OPP50, 0xf4, 0x0c), | ||
| 53 | VOLT_DATA_DEFINE(OMAP4430_VDD_IVA_OPP100_UV, OMAP44XX_CONTROL_FUSE_IVA_OPP100, 0xf9, 0x16), | ||
| 54 | VOLT_DATA_DEFINE(OMAP4430_VDD_IVA_OPPTURBO_UV, OMAP44XX_CONTROL_FUSE_IVA_OPPTURBO, 0xfa, 0x23), | ||
| 55 | VOLT_DATA_DEFINE(0, 0, 0, 0), | ||
| 56 | }; | ||
| 57 | |||
| 58 | #define OMAP4430_VDD_CORE_OPP50_UV 1025000 | ||
| 59 | #define OMAP4430_VDD_CORE_OPP100_UV 1200000 | ||
| 60 | |||
| 61 | struct omap_volt_data omap44xx_vdd_core_volt_data[] = { | ||
| 62 | VOLT_DATA_DEFINE(OMAP4430_VDD_CORE_OPP50_UV, OMAP44XX_CONTROL_FUSE_CORE_OPP50, 0xf4, 0x0c), | ||
| 63 | VOLT_DATA_DEFINE(OMAP4430_VDD_CORE_OPP100_UV, OMAP44XX_CONTROL_FUSE_CORE_OPP100, 0xf9, 0x16), | ||
| 64 | VOLT_DATA_DEFINE(0, 0, 0, 0), | ||
| 65 | }; | ||
| 66 | |||
| 25 | 67 | ||
| 26 | static struct omap_opp_def __initdata omap44xx_opp_def_list[] = { | 68 | static struct omap_opp_def __initdata omap44xx_opp_def_list[] = { |
| 27 | /* MPU OPP1 - OPP50 */ | 69 | /* MPU OPP1 - OPP50 */ |
| 28 | OPP_INITIALIZER("mpu", true, 300000000, 1100000), | 70 | OPP_INITIALIZER("mpu", true, 300000000, OMAP4430_VDD_MPU_OPP50_UV), |
| 29 | /* MPU OPP2 - OPP100 */ | 71 | /* MPU OPP2 - OPP100 */ |
| 30 | OPP_INITIALIZER("mpu", true, 600000000, 1200000), | 72 | OPP_INITIALIZER("mpu", true, 600000000, OMAP4430_VDD_MPU_OPP100_UV), |
| 31 | /* MPU OPP3 - OPP-Turbo */ | 73 | /* MPU OPP3 - OPP-Turbo */ |
| 32 | OPP_INITIALIZER("mpu", false, 800000000, 1260000), | 74 | OPP_INITIALIZER("mpu", true, 800000000, OMAP4430_VDD_MPU_OPPTURBO_UV), |
| 33 | /* MPU OPP4 - OPP-SB */ | 75 | /* MPU OPP4 - OPP-SB */ |
| 34 | OPP_INITIALIZER("mpu", false, 1008000000, 1350000), | 76 | OPP_INITIALIZER("mpu", true, 1008000000, OMAP4430_VDD_MPU_OPPNITRO_UV), |
| 35 | /* L3 OPP1 - OPP50 */ | 77 | /* L3 OPP1 - OPP50 */ |
| 36 | OPP_INITIALIZER("l3_main_1", true, 100000000, 930000), | 78 | OPP_INITIALIZER("l3_main_1", true, 100000000, OMAP4430_VDD_CORE_OPP50_UV), |
| 37 | /* L3 OPP2 - OPP100, OPP-Turbo, OPP-SB */ | 79 | /* L3 OPP2 - OPP100, OPP-Turbo, OPP-SB */ |
| 38 | OPP_INITIALIZER("l3_main_1", true, 200000000, 1100000), | 80 | OPP_INITIALIZER("l3_main_1", true, 200000000, OMAP4430_VDD_CORE_OPP100_UV), |
| 39 | /* TODO: add IVA, DSP, aess, fdif, gpu */ | 81 | /* IVA OPP1 - OPP50 */ |
| 82 | OPP_INITIALIZER("iva", true, 133000000, OMAP4430_VDD_IVA_OPP50_UV), | ||
| 83 | /* IVA OPP2 - OPP100 */ | ||
| 84 | OPP_INITIALIZER("iva", true, 266100000, OMAP4430_VDD_IVA_OPP100_UV), | ||
| 85 | /* IVA OPP3 - OPP-Turbo */ | ||
| 86 | OPP_INITIALIZER("iva", false, 332000000, OMAP4430_VDD_IVA_OPPTURBO_UV), | ||
| 87 | /* TODO: add DSP, aess, fdif, gpu */ | ||
| 40 | }; | 88 | }; |
| 41 | 89 | ||
| 42 | /** | 90 | /** |
| 43 | * omap4_opp_init() - initialize omap4 opp table | 91 | * omap4_opp_init() - initialize omap4 opp table |
| 44 | */ | 92 | */ |
| 45 | static int __init omap4_opp_init(void) | 93 | int __init omap4_opp_init(void) |
| 46 | { | 94 | { |
| 47 | int r = -ENODEV; | 95 | int r = -ENODEV; |
| 48 | 96 | ||
diff --git a/arch/arm/mach-omap2/pm.c b/arch/arm/mach-omap2/pm.c index d5a102c7198..30af3351c2d 100644 --- a/arch/arm/mach-omap2/pm.c +++ b/arch/arm/mach-omap2/pm.c | |||
| @@ -18,8 +18,8 @@ | |||
| 18 | #include <plat/omap-pm.h> | 18 | #include <plat/omap-pm.h> |
| 19 | #include <plat/omap_device.h> | 19 | #include <plat/omap_device.h> |
| 20 | #include <plat/common.h> | 20 | #include <plat/common.h> |
| 21 | #include <plat/voltage.h> | ||
| 22 | 21 | ||
| 22 | #include "voltage.h" | ||
| 23 | #include "powerdomain.h" | 23 | #include "powerdomain.h" |
| 24 | #include "clockdomain.h" | 24 | #include "clockdomain.h" |
| 25 | #include "pm.h" | 25 | #include "pm.h" |
| @@ -83,7 +83,9 @@ static int _init_omap_device(char *name, struct device **new_dev) | |||
| 83 | static void omap2_init_processor_devices(void) | 83 | static void omap2_init_processor_devices(void) |
| 84 | { | 84 | { |
| 85 | _init_omap_device("mpu", &mpu_dev); | 85 | _init_omap_device("mpu", &mpu_dev); |
| 86 | _init_omap_device("iva", &iva_dev); | 86 | if (omap3_has_iva()) |
| 87 | _init_omap_device("iva", &iva_dev); | ||
| 88 | |||
| 87 | if (cpu_is_omap44xx()) { | 89 | if (cpu_is_omap44xx()) { |
| 88 | _init_omap_device("l3_main_1", &l3_dev); | 90 | _init_omap_device("l3_main_1", &l3_dev); |
| 89 | _init_omap_device("dsp", &dsp_dev); | 91 | _init_omap_device("dsp", &dsp_dev); |
| @@ -124,7 +126,7 @@ int omap_set_pwrdm_state(struct powerdomain *pwrdm, u32 state) | |||
| 124 | (pwrdm->flags & PWRDM_HAS_LOWPOWERSTATECHANGE)) { | 126 | (pwrdm->flags & PWRDM_HAS_LOWPOWERSTATECHANGE)) { |
| 125 | sleep_switch = LOWPOWERSTATE_SWITCH; | 127 | sleep_switch = LOWPOWERSTATE_SWITCH; |
| 126 | } else { | 128 | } else { |
| 127 | omap2_clkdm_wakeup(pwrdm->pwrdm_clkdms[0]); | 129 | clkdm_wakeup(pwrdm->pwrdm_clkdms[0]); |
| 128 | pwrdm_wait_transition(pwrdm); | 130 | pwrdm_wait_transition(pwrdm); |
| 129 | sleep_switch = FORCEWAKEUP_SWITCH; | 131 | sleep_switch = FORCEWAKEUP_SWITCH; |
| 130 | } | 132 | } |
| @@ -140,9 +142,9 @@ int omap_set_pwrdm_state(struct powerdomain *pwrdm, u32 state) | |||
| 140 | switch (sleep_switch) { | 142 | switch (sleep_switch) { |
| 141 | case FORCEWAKEUP_SWITCH: | 143 | case FORCEWAKEUP_SWITCH: |
| 142 | if (pwrdm->pwrdm_clkdms[0]->flags & CLKDM_CAN_ENABLE_AUTO) | 144 | if (pwrdm->pwrdm_clkdms[0]->flags & CLKDM_CAN_ENABLE_AUTO) |
| 143 | omap2_clkdm_allow_idle(pwrdm->pwrdm_clkdms[0]); | 145 | clkdm_allow_idle(pwrdm->pwrdm_clkdms[0]); |
| 144 | else | 146 | else |
| 145 | omap2_clkdm_sleep(pwrdm->pwrdm_clkdms[0]); | 147 | clkdm_sleep(pwrdm->pwrdm_clkdms[0]); |
| 146 | break; | 148 | break; |
| 147 | case LOWPOWERSTATE_SWITCH: | 149 | case LOWPOWERSTATE_SWITCH: |
| 148 | pwrdm_set_lowpwrstchange(pwrdm); | 150 | pwrdm_set_lowpwrstchange(pwrdm); |
diff --git a/arch/arm/mach-omap2/pm.h b/arch/arm/mach-omap2/pm.h index 1c1b0ab5b97..f4a5f716422 100644 --- a/arch/arm/mach-omap2/pm.h +++ b/arch/arm/mach-omap2/pm.h | |||
| @@ -127,6 +127,7 @@ static inline void omap_enable_smartreflex_on_init(void) {} | |||
| 127 | #ifdef CONFIG_TWL4030_CORE | 127 | #ifdef CONFIG_TWL4030_CORE |
| 128 | extern int omap3_twl_init(void); | 128 | extern int omap3_twl_init(void); |
| 129 | extern int omap4_twl_init(void); | 129 | extern int omap4_twl_init(void); |
| 130 | extern int omap3_twl_set_sr_bit(bool enable); | ||
| 130 | #else | 131 | #else |
| 131 | static inline int omap3_twl_init(void) | 132 | static inline int omap3_twl_init(void) |
| 132 | { | 133 | { |
diff --git a/arch/arm/mach-omap2/pm24xx.c b/arch/arm/mach-omap2/pm24xx.c index 97feb3ab6a6..df3ded6fe19 100644 --- a/arch/arm/mach-omap2/pm24xx.c +++ b/arch/arm/mach-omap2/pm24xx.c | |||
| @@ -363,14 +363,11 @@ static const struct platform_suspend_ops __initdata omap_pm_ops; | |||
| 363 | /* XXX This function should be shareable between OMAP2xxx and OMAP3 */ | 363 | /* XXX This function should be shareable between OMAP2xxx and OMAP3 */ |
| 364 | static int __init clkdms_setup(struct clockdomain *clkdm, void *unused) | 364 | static int __init clkdms_setup(struct clockdomain *clkdm, void *unused) |
| 365 | { | 365 | { |
| 366 | clkdm_clear_all_wkdeps(clkdm); | ||
| 367 | clkdm_clear_all_sleepdeps(clkdm); | ||
| 368 | |||
| 369 | if (clkdm->flags & CLKDM_CAN_ENABLE_AUTO) | 366 | if (clkdm->flags & CLKDM_CAN_ENABLE_AUTO) |
| 370 | omap2_clkdm_allow_idle(clkdm); | 367 | clkdm_allow_idle(clkdm); |
| 371 | else if (clkdm->flags & CLKDM_CAN_FORCE_SLEEP && | 368 | else if (clkdm->flags & CLKDM_CAN_FORCE_SLEEP && |
| 372 | atomic_read(&clkdm->usecount) == 0) | 369 | atomic_read(&clkdm->usecount) == 0) |
| 373 | omap2_clkdm_sleep(clkdm); | 370 | clkdm_sleep(clkdm); |
| 374 | return 0; | 371 | return 0; |
| 375 | } | 372 | } |
| 376 | 373 | ||
| @@ -379,7 +376,10 @@ static void __init prcm_setup_regs(void) | |||
| 379 | int i, num_mem_banks; | 376 | int i, num_mem_banks; |
| 380 | struct powerdomain *pwrdm; | 377 | struct powerdomain *pwrdm; |
| 381 | 378 | ||
| 382 | /* Enable autoidle */ | 379 | /* |
| 380 | * Enable autoidle | ||
| 381 | * XXX This should be handled by hwmod code or PRCM init code | ||
| 382 | */ | ||
| 383 | omap2_prm_write_mod_reg(OMAP24XX_AUTOIDLE_MASK, OCP_MOD, | 383 | omap2_prm_write_mod_reg(OMAP24XX_AUTOIDLE_MASK, OCP_MOD, |
| 384 | OMAP2_PRCM_SYSCONFIG_OFFSET); | 384 | OMAP2_PRCM_SYSCONFIG_OFFSET); |
| 385 | 385 | ||
| @@ -405,83 +405,16 @@ static void __init prcm_setup_regs(void) | |||
| 405 | 405 | ||
| 406 | pwrdm = clkdm_get_pwrdm(dsp_clkdm); | 406 | pwrdm = clkdm_get_pwrdm(dsp_clkdm); |
| 407 | pwrdm_set_next_pwrst(pwrdm, PWRDM_POWER_OFF); | 407 | pwrdm_set_next_pwrst(pwrdm, PWRDM_POWER_OFF); |
| 408 | omap2_clkdm_sleep(dsp_clkdm); | 408 | clkdm_sleep(dsp_clkdm); |
| 409 | 409 | ||
| 410 | pwrdm = clkdm_get_pwrdm(gfx_clkdm); | 410 | pwrdm = clkdm_get_pwrdm(gfx_clkdm); |
| 411 | pwrdm_set_next_pwrst(pwrdm, PWRDM_POWER_OFF); | 411 | pwrdm_set_next_pwrst(pwrdm, PWRDM_POWER_OFF); |
| 412 | omap2_clkdm_sleep(gfx_clkdm); | 412 | clkdm_sleep(gfx_clkdm); |
| 413 | 413 | ||
| 414 | /* | 414 | /* Enable hardware-supervised idle for all clkdms */ |
| 415 | * Clear clockdomain wakeup dependencies and enable | ||
| 416 | * hardware-supervised idle for all clkdms | ||
| 417 | */ | ||
| 418 | clkdm_for_each(clkdms_setup, NULL); | 415 | clkdm_for_each(clkdms_setup, NULL); |
| 419 | clkdm_add_wkdep(mpu_clkdm, wkup_clkdm); | 416 | clkdm_add_wkdep(mpu_clkdm, wkup_clkdm); |
| 420 | 417 | ||
| 421 | /* Enable clock autoidle for all domains */ | ||
| 422 | omap2_cm_write_mod_reg(OMAP24XX_AUTO_CAM_MASK | | ||
| 423 | OMAP24XX_AUTO_MAILBOXES_MASK | | ||
| 424 | OMAP24XX_AUTO_WDT4_MASK | | ||
| 425 | OMAP2420_AUTO_WDT3_MASK | | ||
| 426 | OMAP24XX_AUTO_MSPRO_MASK | | ||
| 427 | OMAP2420_AUTO_MMC_MASK | | ||
| 428 | OMAP24XX_AUTO_FAC_MASK | | ||
| 429 | OMAP2420_AUTO_EAC_MASK | | ||
| 430 | OMAP24XX_AUTO_HDQ_MASK | | ||
| 431 | OMAP24XX_AUTO_UART2_MASK | | ||
| 432 | OMAP24XX_AUTO_UART1_MASK | | ||
| 433 | OMAP24XX_AUTO_I2C2_MASK | | ||
| 434 | OMAP24XX_AUTO_I2C1_MASK | | ||
| 435 | OMAP24XX_AUTO_MCSPI2_MASK | | ||
| 436 | OMAP24XX_AUTO_MCSPI1_MASK | | ||
| 437 | OMAP24XX_AUTO_MCBSP2_MASK | | ||
| 438 | OMAP24XX_AUTO_MCBSP1_MASK | | ||
| 439 | OMAP24XX_AUTO_GPT12_MASK | | ||
| 440 | OMAP24XX_AUTO_GPT11_MASK | | ||
| 441 | OMAP24XX_AUTO_GPT10_MASK | | ||
| 442 | OMAP24XX_AUTO_GPT9_MASK | | ||
| 443 | OMAP24XX_AUTO_GPT8_MASK | | ||
| 444 | OMAP24XX_AUTO_GPT7_MASK | | ||
| 445 | OMAP24XX_AUTO_GPT6_MASK | | ||
| 446 | OMAP24XX_AUTO_GPT5_MASK | | ||
| 447 | OMAP24XX_AUTO_GPT4_MASK | | ||
| 448 | OMAP24XX_AUTO_GPT3_MASK | | ||
| 449 | OMAP24XX_AUTO_GPT2_MASK | | ||
| 450 | OMAP2420_AUTO_VLYNQ_MASK | | ||
| 451 | OMAP24XX_AUTO_DSS_MASK, | ||
| 452 | CORE_MOD, CM_AUTOIDLE1); | ||
| 453 | omap2_cm_write_mod_reg(OMAP24XX_AUTO_UART3_MASK | | ||
| 454 | OMAP24XX_AUTO_SSI_MASK | | ||
| 455 | OMAP24XX_AUTO_USB_MASK, | ||
| 456 | CORE_MOD, CM_AUTOIDLE2); | ||
| 457 | omap2_cm_write_mod_reg(OMAP24XX_AUTO_SDRC_MASK | | ||
| 458 | OMAP24XX_AUTO_GPMC_MASK | | ||
| 459 | OMAP24XX_AUTO_SDMA_MASK, | ||
| 460 | CORE_MOD, CM_AUTOIDLE3); | ||
| 461 | omap2_cm_write_mod_reg(OMAP24XX_AUTO_PKA_MASK | | ||
| 462 | OMAP24XX_AUTO_AES_MASK | | ||
| 463 | OMAP24XX_AUTO_RNG_MASK | | ||
| 464 | OMAP24XX_AUTO_SHA_MASK | | ||
| 465 | OMAP24XX_AUTO_DES_MASK, | ||
| 466 | CORE_MOD, OMAP24XX_CM_AUTOIDLE4); | ||
| 467 | |||
| 468 | omap2_cm_write_mod_reg(OMAP2420_AUTO_DSP_IPI_MASK, OMAP24XX_DSP_MOD, | ||
| 469 | CM_AUTOIDLE); | ||
| 470 | |||
| 471 | /* Put DPLL and both APLLs into autoidle mode */ | ||
| 472 | omap2_cm_write_mod_reg((0x03 << OMAP24XX_AUTO_DPLL_SHIFT) | | ||
| 473 | (0x03 << OMAP24XX_AUTO_96M_SHIFT) | | ||
| 474 | (0x03 << OMAP24XX_AUTO_54M_SHIFT), | ||
| 475 | PLL_MOD, CM_AUTOIDLE); | ||
| 476 | |||
| 477 | omap2_cm_write_mod_reg(OMAP24XX_AUTO_OMAPCTRL_MASK | | ||
| 478 | OMAP24XX_AUTO_WDT1_MASK | | ||
| 479 | OMAP24XX_AUTO_MPU_WDT_MASK | | ||
| 480 | OMAP24XX_AUTO_GPIOS_MASK | | ||
| 481 | OMAP24XX_AUTO_32KSYNC_MASK | | ||
| 482 | OMAP24XX_AUTO_GPT1_MASK, | ||
| 483 | WKUP_MOD, CM_AUTOIDLE); | ||
| 484 | |||
| 485 | /* REVISIT: Configure number of 32 kHz clock cycles for sys_clk | 418 | /* REVISIT: Configure number of 32 kHz clock cycles for sys_clk |
| 486 | * stabilisation */ | 419 | * stabilisation */ |
| 487 | omap2_prm_write_mod_reg(15 << OMAP_SETUP_TIME_SHIFT, OMAP24XX_GR_MOD, | 420 | omap2_prm_write_mod_reg(15 << OMAP_SETUP_TIME_SHIFT, OMAP24XX_GR_MOD, |
diff --git a/arch/arm/mach-omap2/pm34xx.c b/arch/arm/mach-omap2/pm34xx.c index 2f864e4b085..0c5e3a46a3a 100644 --- a/arch/arm/mach-omap2/pm34xx.c +++ b/arch/arm/mach-omap2/pm34xx.c | |||
| @@ -29,6 +29,7 @@ | |||
| 29 | #include <linux/delay.h> | 29 | #include <linux/delay.h> |
| 30 | #include <linux/slab.h> | 30 | #include <linux/slab.h> |
| 31 | #include <linux/console.h> | 31 | #include <linux/console.h> |
| 32 | #include <trace/events/power.h> | ||
| 32 | 33 | ||
| 33 | #include <plat/sram.h> | 34 | #include <plat/sram.h> |
| 34 | #include "clockdomain.h" | 35 | #include "clockdomain.h" |
| @@ -311,11 +312,6 @@ static irqreturn_t prcm_interrupt_handler (int irq, void *dev_id) | |||
| 311 | return IRQ_HANDLED; | 312 | return IRQ_HANDLED; |
| 312 | } | 313 | } |
| 313 | 314 | ||
| 314 | static void restore_control_register(u32 val) | ||
| 315 | { | ||
| 316 | __asm__ __volatile__ ("mcr p15, 0, %0, c1, c0, 0" : : "r" (val)); | ||
| 317 | } | ||
| 318 | |||
| 319 | /* Function to restore the table entry that was modified for enabling MMU */ | 315 | /* Function to restore the table entry that was modified for enabling MMU */ |
| 320 | static void restore_table_entry(void) | 316 | static void restore_table_entry(void) |
| 321 | { | 317 | { |
| @@ -337,7 +333,7 @@ static void restore_table_entry(void) | |||
| 337 | control_reg_value = __raw_readl(scratchpad_address | 333 | control_reg_value = __raw_readl(scratchpad_address |
| 338 | + OMAP343X_CONTROL_REG_VALUE_OFFSET); | 334 | + OMAP343X_CONTROL_REG_VALUE_OFFSET); |
| 339 | /* This will enable caches and prediction */ | 335 | /* This will enable caches and prediction */ |
| 340 | restore_control_register(control_reg_value); | 336 | set_cr(control_reg_value); |
| 341 | } | 337 | } |
| 342 | 338 | ||
| 343 | void omap_sram_idle(void) | 339 | void omap_sram_idle(void) |
| @@ -496,7 +492,7 @@ console_still_active: | |||
| 496 | 492 | ||
| 497 | pwrdm_post_transition(); | 493 | pwrdm_post_transition(); |
| 498 | 494 | ||
| 499 | omap2_clkdm_allow_idle(mpu_pwrdm->pwrdm_clkdms[0]); | 495 | clkdm_allow_idle(mpu_pwrdm->pwrdm_clkdms[0]); |
| 500 | } | 496 | } |
| 501 | 497 | ||
| 502 | int omap3_can_sleep(void) | 498 | int omap3_can_sleep(void) |
| @@ -519,8 +515,14 @@ static void omap3_pm_idle(void) | |||
| 519 | if (omap_irq_pending() || need_resched()) | 515 | if (omap_irq_pending() || need_resched()) |
| 520 | goto out; | 516 | goto out; |
| 521 | 517 | ||
| 518 | trace_power_start(POWER_CSTATE, 1, smp_processor_id()); | ||
| 519 | trace_cpu_idle(1, smp_processor_id()); | ||
| 520 | |||
| 522 | omap_sram_idle(); | 521 | omap_sram_idle(); |
| 523 | 522 | ||
| 523 | trace_power_end(smp_processor_id()); | ||
| 524 | trace_cpu_idle(PWR_EVENT_EXIT, smp_processor_id()); | ||
| 525 | |||
| 524 | out: | 526 | out: |
| 525 | local_fiq_enable(); | 527 | local_fiq_enable(); |
| 526 | local_irq_enable(); | 528 | local_irq_enable(); |
| @@ -688,149 +690,15 @@ static void __init omap3_d2d_idle(void) | |||
| 688 | 690 | ||
| 689 | static void __init prcm_setup_regs(void) | 691 | static void __init prcm_setup_regs(void) |
| 690 | { | 692 | { |
| 691 | u32 omap3630_auto_uart4_mask = cpu_is_omap3630() ? | ||
| 692 | OMAP3630_AUTO_UART4_MASK : 0; | ||
| 693 | u32 omap3630_en_uart4_mask = cpu_is_omap3630() ? | 693 | u32 omap3630_en_uart4_mask = cpu_is_omap3630() ? |
| 694 | OMAP3630_EN_UART4_MASK : 0; | 694 | OMAP3630_EN_UART4_MASK : 0; |
| 695 | u32 omap3630_grpsel_uart4_mask = cpu_is_omap3630() ? | 695 | u32 omap3630_grpsel_uart4_mask = cpu_is_omap3630() ? |
| 696 | OMAP3630_GRPSEL_UART4_MASK : 0; | 696 | OMAP3630_GRPSEL_UART4_MASK : 0; |
| 697 | 697 | ||
| 698 | 698 | /* XXX This should be handled by hwmod code or SCM init code */ | |
| 699 | /* XXX Reset all wkdeps. This should be done when initializing | ||
| 700 | * powerdomains */ | ||
| 701 | omap2_prm_write_mod_reg(0, OMAP3430_IVA2_MOD, PM_WKDEP); | ||
| 702 | omap2_prm_write_mod_reg(0, MPU_MOD, PM_WKDEP); | ||
| 703 | omap2_prm_write_mod_reg(0, OMAP3430_DSS_MOD, PM_WKDEP); | ||
| 704 | omap2_prm_write_mod_reg(0, OMAP3430_NEON_MOD, PM_WKDEP); | ||
| 705 | omap2_prm_write_mod_reg(0, OMAP3430_CAM_MOD, PM_WKDEP); | ||
| 706 | omap2_prm_write_mod_reg(0, OMAP3430_PER_MOD, PM_WKDEP); | ||
| 707 | if (omap_rev() > OMAP3430_REV_ES1_0) { | ||
| 708 | omap2_prm_write_mod_reg(0, OMAP3430ES2_SGX_MOD, PM_WKDEP); | ||
| 709 | omap2_prm_write_mod_reg(0, OMAP3430ES2_USBHOST_MOD, PM_WKDEP); | ||
| 710 | } else | ||
| 711 | omap2_prm_write_mod_reg(0, GFX_MOD, PM_WKDEP); | ||
| 712 | |||
| 713 | /* | ||
| 714 | * Enable interface clock autoidle for all modules. | ||
| 715 | * Note that in the long run this should be done by clockfw | ||
| 716 | */ | ||
| 717 | omap2_cm_write_mod_reg( | ||
| 718 | OMAP3430_AUTO_MODEM_MASK | | ||
| 719 | OMAP3430ES2_AUTO_MMC3_MASK | | ||
| 720 | OMAP3430ES2_AUTO_ICR_MASK | | ||
| 721 | OMAP3430_AUTO_AES2_MASK | | ||
| 722 | OMAP3430_AUTO_SHA12_MASK | | ||
| 723 | OMAP3430_AUTO_DES2_MASK | | ||
| 724 | OMAP3430_AUTO_MMC2_MASK | | ||
| 725 | OMAP3430_AUTO_MMC1_MASK | | ||
| 726 | OMAP3430_AUTO_MSPRO_MASK | | ||
| 727 | OMAP3430_AUTO_HDQ_MASK | | ||
| 728 | OMAP3430_AUTO_MCSPI4_MASK | | ||
| 729 | OMAP3430_AUTO_MCSPI3_MASK | | ||
| 730 | OMAP3430_AUTO_MCSPI2_MASK | | ||
| 731 | OMAP3430_AUTO_MCSPI1_MASK | | ||
| 732 | OMAP3430_AUTO_I2C3_MASK | | ||
| 733 | OMAP3430_AUTO_I2C2_MASK | | ||
| 734 | OMAP3430_AUTO_I2C1_MASK | | ||
| 735 | OMAP3430_AUTO_UART2_MASK | | ||
| 736 | OMAP3430_AUTO_UART1_MASK | | ||
| 737 | OMAP3430_AUTO_GPT11_MASK | | ||
| 738 | OMAP3430_AUTO_GPT10_MASK | | ||
| 739 | OMAP3430_AUTO_MCBSP5_MASK | | ||
| 740 | OMAP3430_AUTO_MCBSP1_MASK | | ||
| 741 | OMAP3430ES1_AUTO_FAC_MASK | /* This is es1 only */ | ||
| 742 | OMAP3430_AUTO_MAILBOXES_MASK | | ||
| 743 | OMAP3430_AUTO_OMAPCTRL_MASK | | ||
| 744 | OMAP3430ES1_AUTO_FSHOSTUSB_MASK | | ||
| 745 | OMAP3430_AUTO_HSOTGUSB_MASK | | ||
| 746 | OMAP3430_AUTO_SAD2D_MASK | | ||
| 747 | OMAP3430_AUTO_SSI_MASK, | ||
| 748 | CORE_MOD, CM_AUTOIDLE1); | ||
| 749 | |||
| 750 | omap2_cm_write_mod_reg( | ||
| 751 | OMAP3430_AUTO_PKA_MASK | | ||
| 752 | OMAP3430_AUTO_AES1_MASK | | ||
| 753 | OMAP3430_AUTO_RNG_MASK | | ||
| 754 | OMAP3430_AUTO_SHA11_MASK | | ||
| 755 | OMAP3430_AUTO_DES1_MASK, | ||
| 756 | CORE_MOD, CM_AUTOIDLE2); | ||
| 757 | |||
| 758 | if (omap_rev() > OMAP3430_REV_ES1_0) { | ||
| 759 | omap2_cm_write_mod_reg( | ||
| 760 | OMAP3430_AUTO_MAD2D_MASK | | ||
| 761 | OMAP3430ES2_AUTO_USBTLL_MASK, | ||
| 762 | CORE_MOD, CM_AUTOIDLE3); | ||
| 763 | } | ||
| 764 | |||
| 765 | omap2_cm_write_mod_reg( | ||
| 766 | OMAP3430_AUTO_WDT2_MASK | | ||
| 767 | OMAP3430_AUTO_WDT1_MASK | | ||
| 768 | OMAP3430_AUTO_GPIO1_MASK | | ||
| 769 | OMAP3430_AUTO_32KSYNC_MASK | | ||
| 770 | OMAP3430_AUTO_GPT12_MASK | | ||
| 771 | OMAP3430_AUTO_GPT1_MASK, | ||
| 772 | WKUP_MOD, CM_AUTOIDLE); | ||
| 773 | |||
| 774 | omap2_cm_write_mod_reg( | ||
| 775 | OMAP3430_AUTO_DSS_MASK, | ||
| 776 | OMAP3430_DSS_MOD, | ||
| 777 | CM_AUTOIDLE); | ||
| 778 | |||
| 779 | omap2_cm_write_mod_reg( | ||
| 780 | OMAP3430_AUTO_CAM_MASK, | ||
| 781 | OMAP3430_CAM_MOD, | ||
| 782 | CM_AUTOIDLE); | ||
| 783 | |||
| 784 | omap2_cm_write_mod_reg( | ||
| 785 | omap3630_auto_uart4_mask | | ||
| 786 | OMAP3430_AUTO_GPIO6_MASK | | ||
| 787 | OMAP3430_AUTO_GPIO5_MASK | | ||
| 788 | OMAP3430_AUTO_GPIO4_MASK | | ||
| 789 | OMAP3430_AUTO_GPIO3_MASK | | ||
| 790 | OMAP3430_AUTO_GPIO2_MASK | | ||
| 791 | OMAP3430_AUTO_WDT3_MASK | | ||
| 792 | OMAP3430_AUTO_UART3_MASK | | ||
| 793 | OMAP3430_AUTO_GPT9_MASK | | ||
| 794 | OMAP3430_AUTO_GPT8_MASK | | ||
| 795 | OMAP3430_AUTO_GPT7_MASK | | ||
| 796 | OMAP3430_AUTO_GPT6_MASK | | ||
| 797 | OMAP3430_AUTO_GPT5_MASK | | ||
| 798 | OMAP3430_AUTO_GPT4_MASK | | ||
| 799 | OMAP3430_AUTO_GPT3_MASK | | ||
| 800 | OMAP3430_AUTO_GPT2_MASK | | ||
| 801 | OMAP3430_AUTO_MCBSP4_MASK | | ||
| 802 | OMAP3430_AUTO_MCBSP3_MASK | | ||
| 803 | OMAP3430_AUTO_MCBSP2_MASK, | ||
| 804 | OMAP3430_PER_MOD, | ||
| 805 | CM_AUTOIDLE); | ||
| 806 | |||
| 807 | if (omap_rev() > OMAP3430_REV_ES1_0) { | ||
| 808 | omap2_cm_write_mod_reg( | ||
| 809 | OMAP3430ES2_AUTO_USBHOST_MASK, | ||
| 810 | OMAP3430ES2_USBHOST_MOD, | ||
| 811 | CM_AUTOIDLE); | ||
| 812 | } | ||
| 813 | |||
| 814 | omap_ctrl_writel(OMAP3430_AUTOIDLE_MASK, OMAP2_CONTROL_SYSCONFIG); | 699 | omap_ctrl_writel(OMAP3430_AUTOIDLE_MASK, OMAP2_CONTROL_SYSCONFIG); |
| 815 | 700 | ||
| 816 | /* | 701 | /* |
| 817 | * Set all plls to autoidle. This is needed until autoidle is | ||
| 818 | * enabled by clockfw | ||
| 819 | */ | ||
| 820 | omap2_cm_write_mod_reg(1 << OMAP3430_AUTO_IVA2_DPLL_SHIFT, | ||
| 821 | OMAP3430_IVA2_MOD, CM_AUTOIDLE2); | ||
| 822 | omap2_cm_write_mod_reg(1 << OMAP3430_AUTO_MPU_DPLL_SHIFT, | ||
| 823 | MPU_MOD, | ||
| 824 | CM_AUTOIDLE2); | ||
| 825 | omap2_cm_write_mod_reg((1 << OMAP3430_AUTO_PERIPH_DPLL_SHIFT) | | ||
| 826 | (1 << OMAP3430_AUTO_CORE_DPLL_SHIFT), | ||
| 827 | PLL_MOD, | ||
| 828 | CM_AUTOIDLE); | ||
| 829 | omap2_cm_write_mod_reg(1 << OMAP3430ES2_AUTO_PERIPH2_DPLL_SHIFT, | ||
| 830 | PLL_MOD, | ||
| 831 | CM_AUTOIDLE2); | ||
| 832 | |||
| 833 | /* | ||
| 834 | * Enable control of expternal oscillator through | 702 | * Enable control of expternal oscillator through |
| 835 | * sys_clkreq. In the long run clock framework should | 703 | * sys_clkreq. In the long run clock framework should |
| 836 | * take care of this. | 704 | * take care of this. |
| @@ -928,8 +796,7 @@ void omap3_pm_off_mode_enable(int enable) | |||
| 928 | pwrst->pwrdm == core_pwrdm && | 796 | pwrst->pwrdm == core_pwrdm && |
| 929 | state == PWRDM_POWER_OFF) { | 797 | state == PWRDM_POWER_OFF) { |
| 930 | pwrst->next_state = PWRDM_POWER_RET; | 798 | pwrst->next_state = PWRDM_POWER_RET; |
| 931 | WARN_ONCE(1, | 799 | pr_warn("%s: Core OFF disabled due to errata i583\n", |
| 932 | "%s: Core OFF disabled due to errata i583\n", | ||
| 933 | __func__); | 800 | __func__); |
| 934 | } else { | 801 | } else { |
| 935 | pwrst->next_state = state; | 802 | pwrst->next_state = state; |
| @@ -990,10 +857,10 @@ static int __init pwrdms_setup(struct powerdomain *pwrdm, void *unused) | |||
| 990 | static int __init clkdms_setup(struct clockdomain *clkdm, void *unused) | 857 | static int __init clkdms_setup(struct clockdomain *clkdm, void *unused) |
| 991 | { | 858 | { |
| 992 | if (clkdm->flags & CLKDM_CAN_ENABLE_AUTO) | 859 | if (clkdm->flags & CLKDM_CAN_ENABLE_AUTO) |
| 993 | omap2_clkdm_allow_idle(clkdm); | 860 | clkdm_allow_idle(clkdm); |
| 994 | else if (clkdm->flags & CLKDM_CAN_FORCE_SLEEP && | 861 | else if (clkdm->flags & CLKDM_CAN_FORCE_SLEEP && |
| 995 | atomic_read(&clkdm->usecount) == 0) | 862 | atomic_read(&clkdm->usecount) == 0) |
| 996 | omap2_clkdm_sleep(clkdm); | 863 | clkdm_sleep(clkdm); |
| 997 | return 0; | 864 | return 0; |
| 998 | } | 865 | } |
| 999 | 866 | ||
diff --git a/arch/arm/mach-omap2/powerdomain.c b/arch/arm/mach-omap2/powerdomain.c index eaed0df1669..49c6513e90d 100644 --- a/arch/arm/mach-omap2/powerdomain.c +++ b/arch/arm/mach-omap2/powerdomain.c | |||
| @@ -2,7 +2,7 @@ | |||
| 2 | * OMAP powerdomain control | 2 | * OMAP powerdomain control |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2007-2008 Texas Instruments, Inc. | 4 | * Copyright (C) 2007-2008 Texas Instruments, Inc. |
| 5 | * Copyright (C) 2007-2009 Nokia Corporation | 5 | * Copyright (C) 2007-2011 Nokia Corporation |
| 6 | * | 6 | * |
| 7 | * Written by Paul Walmsley | 7 | * Written by Paul Walmsley |
| 8 | * Added OMAP4 specific support by Abhijit Pagare <abhijitpagare@ti.com> | 8 | * Added OMAP4 specific support by Abhijit Pagare <abhijitpagare@ti.com> |
| @@ -19,12 +19,15 @@ | |||
| 19 | #include <linux/list.h> | 19 | #include <linux/list.h> |
| 20 | #include <linux/errno.h> | 20 | #include <linux/errno.h> |
| 21 | #include <linux/string.h> | 21 | #include <linux/string.h> |
| 22 | #include <trace/events/power.h> | ||
| 23 | |||
| 22 | #include "cm2xxx_3xxx.h" | 24 | #include "cm2xxx_3xxx.h" |
| 23 | #include "prcm44xx.h" | 25 | #include "prcm44xx.h" |
| 24 | #include "cm44xx.h" | 26 | #include "cm44xx.h" |
| 25 | #include "prm2xxx_3xxx.h" | 27 | #include "prm2xxx_3xxx.h" |
| 26 | #include "prm44xx.h" | 28 | #include "prm44xx.h" |
| 27 | 29 | ||
| 30 | #include <asm/cpu.h> | ||
| 28 | #include <plat/cpu.h> | 31 | #include <plat/cpu.h> |
| 29 | #include "powerdomain.h" | 32 | #include "powerdomain.h" |
| 30 | #include "clockdomain.h" | 33 | #include "clockdomain.h" |
| @@ -32,6 +35,8 @@ | |||
| 32 | 35 | ||
| 33 | #include "pm.h" | 36 | #include "pm.h" |
| 34 | 37 | ||
| 38 | #define PWRDM_TRACE_STATES_FLAG (1<<31) | ||
| 39 | |||
| 35 | enum { | 40 | enum { |
| 36 | PWRDM_STATE_NOW = 0, | 41 | PWRDM_STATE_NOW = 0, |
| 37 | PWRDM_STATE_PREV, | 42 | PWRDM_STATE_PREV, |
| @@ -130,8 +135,7 @@ static void _update_logic_membank_counters(struct powerdomain *pwrdm) | |||
| 130 | static int _pwrdm_state_switch(struct powerdomain *pwrdm, int flag) | 135 | static int _pwrdm_state_switch(struct powerdomain *pwrdm, int flag) |
| 131 | { | 136 | { |
| 132 | 137 | ||
| 133 | int prev; | 138 | int prev, state, trace_state = 0; |
| 134 | int state; | ||
| 135 | 139 | ||
| 136 | if (pwrdm == NULL) | 140 | if (pwrdm == NULL) |
| 137 | return -EINVAL; | 141 | return -EINVAL; |
| @@ -148,6 +152,17 @@ static int _pwrdm_state_switch(struct powerdomain *pwrdm, int flag) | |||
| 148 | pwrdm->state_counter[prev]++; | 152 | pwrdm->state_counter[prev]++; |
| 149 | if (prev == PWRDM_POWER_RET) | 153 | if (prev == PWRDM_POWER_RET) |
| 150 | _update_logic_membank_counters(pwrdm); | 154 | _update_logic_membank_counters(pwrdm); |
| 155 | /* | ||
| 156 | * If the power domain did not hit the desired state, | ||
| 157 | * generate a trace event with both the desired and hit states | ||
| 158 | */ | ||
| 159 | if (state != prev) { | ||
| 160 | trace_state = (PWRDM_TRACE_STATES_FLAG | | ||
| 161 | ((state & OMAP_POWERSTATE_MASK) << 8) | | ||
| 162 | ((prev & OMAP_POWERSTATE_MASK) << 0)); | ||
| 163 | trace_power_domain_target(pwrdm->name, trace_state, | ||
| 164 | smp_processor_id()); | ||
| 165 | } | ||
| 151 | break; | 166 | break; |
| 152 | default: | 167 | default: |
| 153 | return -EINVAL; | 168 | return -EINVAL; |
| @@ -406,8 +421,13 @@ int pwrdm_set_next_pwrst(struct powerdomain *pwrdm, u8 pwrst) | |||
| 406 | pr_debug("powerdomain: setting next powerstate for %s to %0x\n", | 421 | pr_debug("powerdomain: setting next powerstate for %s to %0x\n", |
| 407 | pwrdm->name, pwrst); | 422 | pwrdm->name, pwrst); |
| 408 | 423 | ||
| 409 | if (arch_pwrdm && arch_pwrdm->pwrdm_set_next_pwrst) | 424 | if (arch_pwrdm && arch_pwrdm->pwrdm_set_next_pwrst) { |
| 425 | /* Trace the pwrdm desired target state */ | ||
| 426 | trace_power_domain_target(pwrdm->name, pwrst, | ||
| 427 | smp_processor_id()); | ||
| 428 | /* Program the pwrdm desired target state */ | ||
| 410 | ret = arch_pwrdm->pwrdm_set_next_pwrst(pwrdm, pwrst); | 429 | ret = arch_pwrdm->pwrdm_set_next_pwrst(pwrdm, pwrst); |
| 430 | } | ||
| 411 | 431 | ||
| 412 | return ret; | 432 | return ret; |
| 413 | } | 433 | } |
| @@ -938,3 +958,44 @@ u32 pwrdm_get_context_loss_count(struct powerdomain *pwrdm) | |||
| 938 | 958 | ||
| 939 | return count; | 959 | return count; |
| 940 | } | 960 | } |
| 961 | |||
| 962 | /** | ||
| 963 | * pwrdm_can_ever_lose_context - can this powerdomain ever lose context? | ||
| 964 | * @pwrdm: struct powerdomain * | ||
| 965 | * | ||
| 966 | * Given a struct powerdomain * @pwrdm, returns 1 if the powerdomain | ||
| 967 | * can lose either memory or logic context or if @pwrdm is invalid, or | ||
| 968 | * returns 0 otherwise. This function is not concerned with how the | ||
| 969 | * powerdomain registers are programmed (i.e., to go off or not); it's | ||
| 970 | * concerned with whether it's ever possible for this powerdomain to | ||
| 971 | * go off while some other part of the chip is active. This function | ||
| 972 | * assumes that every powerdomain can go to either ON or INACTIVE. | ||
| 973 | */ | ||
| 974 | bool pwrdm_can_ever_lose_context(struct powerdomain *pwrdm) | ||
| 975 | { | ||
| 976 | int i; | ||
| 977 | |||
| 978 | if (IS_ERR_OR_NULL(pwrdm)) { | ||
| 979 | pr_debug("powerdomain: %s: invalid powerdomain pointer\n", | ||
| 980 | __func__); | ||
| 981 | return 1; | ||
| 982 | } | ||
| 983 | |||
| 984 | if (pwrdm->pwrsts & PWRSTS_OFF) | ||
| 985 | return 1; | ||
| 986 | |||
| 987 | if (pwrdm->pwrsts & PWRSTS_RET) { | ||
| 988 | if (pwrdm->pwrsts_logic_ret & PWRSTS_OFF) | ||
| 989 | return 1; | ||
| 990 | |||
| 991 | for (i = 0; i < pwrdm->banks; i++) | ||
| 992 | if (pwrdm->pwrsts_mem_ret[i] & PWRSTS_OFF) | ||
| 993 | return 1; | ||
| 994 | } | ||
| 995 | |||
| 996 | for (i = 0; i < pwrdm->banks; i++) | ||
| 997 | if (pwrdm->pwrsts_mem_on[i] & PWRSTS_OFF) | ||
| 998 | return 1; | ||
| 999 | |||
| 1000 | return 0; | ||
| 1001 | } | ||
diff --git a/arch/arm/mach-omap2/powerdomain.h b/arch/arm/mach-omap2/powerdomain.h index c66431edfeb..027f40bd235 100644 --- a/arch/arm/mach-omap2/powerdomain.h +++ b/arch/arm/mach-omap2/powerdomain.h | |||
| @@ -2,7 +2,7 @@ | |||
| 2 | * OMAP2/3/4 powerdomain control | 2 | * OMAP2/3/4 powerdomain control |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2007-2008, 2010 Texas Instruments, Inc. | 4 | * Copyright (C) 2007-2008, 2010 Texas Instruments, Inc. |
| 5 | * Copyright (C) 2007-2010 Nokia Corporation | 5 | * Copyright (C) 2007-2011 Nokia Corporation |
| 6 | * | 6 | * |
| 7 | * Paul Walmsley | 7 | * Paul Walmsley |
| 8 | * | 8 | * |
| @@ -34,17 +34,14 @@ | |||
| 34 | 34 | ||
| 35 | /* Powerdomain allowable state bitfields */ | 35 | /* Powerdomain allowable state bitfields */ |
| 36 | #define PWRSTS_ON (1 << PWRDM_POWER_ON) | 36 | #define PWRSTS_ON (1 << PWRDM_POWER_ON) |
| 37 | #define PWRSTS_INACTIVE (1 << PWRDM_POWER_INACTIVE) | ||
| 38 | #define PWRSTS_RET (1 << PWRDM_POWER_RET) | ||
| 37 | #define PWRSTS_OFF (1 << PWRDM_POWER_OFF) | 39 | #define PWRSTS_OFF (1 << PWRDM_POWER_OFF) |
| 38 | #define PWRSTS_OFF_ON ((1 << PWRDM_POWER_OFF) | \ | ||
| 39 | (1 << PWRDM_POWER_ON)) | ||
| 40 | 40 | ||
| 41 | #define PWRSTS_OFF_RET ((1 << PWRDM_POWER_OFF) | \ | 41 | #define PWRSTS_OFF_ON (PWRSTS_OFF | PWRSTS_ON) |
| 42 | (1 << PWRDM_POWER_RET)) | 42 | #define PWRSTS_OFF_RET (PWRSTS_OFF | PWRSTS_RET) |
| 43 | 43 | #define PWRSTS_RET_ON (PWRSTS_RET | PWRSTS_ON) | |
| 44 | #define PWRSTS_RET_ON ((1 << PWRDM_POWER_RET) | \ | 44 | #define PWRSTS_OFF_RET_ON (PWRSTS_OFF_RET | PWRSTS_ON) |
| 45 | (1 << PWRDM_POWER_ON)) | ||
| 46 | |||
| 47 | #define PWRSTS_OFF_RET_ON (PWRSTS_OFF_RET | (1 << PWRDM_POWER_ON)) | ||
| 48 | 45 | ||
| 49 | 46 | ||
| 50 | /* Powerdomain flags */ | 47 | /* Powerdomain flags */ |
| @@ -165,7 +162,6 @@ struct pwrdm_ops { | |||
| 165 | int (*pwrdm_wait_transition)(struct powerdomain *pwrdm); | 162 | int (*pwrdm_wait_transition)(struct powerdomain *pwrdm); |
| 166 | }; | 163 | }; |
| 167 | 164 | ||
| 168 | void pwrdm_fw_init(void); | ||
| 169 | void pwrdm_init(struct powerdomain **pwrdm_list, struct pwrdm_ops *custom_funcs); | 165 | void pwrdm_init(struct powerdomain **pwrdm_list, struct pwrdm_ops *custom_funcs); |
| 170 | 166 | ||
| 171 | struct powerdomain *pwrdm_lookup(const char *name); | 167 | struct powerdomain *pwrdm_lookup(const char *name); |
| @@ -212,6 +208,7 @@ int pwrdm_pre_transition(void); | |||
| 212 | int pwrdm_post_transition(void); | 208 | int pwrdm_post_transition(void); |
| 213 | int pwrdm_set_lowpwrstchange(struct powerdomain *pwrdm); | 209 | int pwrdm_set_lowpwrstchange(struct powerdomain *pwrdm); |
| 214 | u32 pwrdm_get_context_loss_count(struct powerdomain *pwrdm); | 210 | u32 pwrdm_get_context_loss_count(struct powerdomain *pwrdm); |
| 211 | bool pwrdm_can_ever_lose_context(struct powerdomain *pwrdm); | ||
| 215 | 212 | ||
| 216 | extern void omap2xxx_powerdomains_init(void); | 213 | extern void omap2xxx_powerdomains_init(void); |
| 217 | extern void omap3xxx_powerdomains_init(void); | 214 | extern void omap3xxx_powerdomains_init(void); |
diff --git a/arch/arm/mach-omap2/powerdomains2xxx_3xxx_data.c b/arch/arm/mach-omap2/powerdomains2xxx_3xxx_data.c index 5b4dd971320..4210c339976 100644 --- a/arch/arm/mach-omap2/powerdomains2xxx_3xxx_data.c +++ b/arch/arm/mach-omap2/powerdomains2xxx_3xxx_data.c | |||
| @@ -2,7 +2,7 @@ | |||
| 2 | * OMAP2/3 common powerdomain definitions | 2 | * OMAP2/3 common powerdomain definitions |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2007-2008 Texas Instruments, Inc. | 4 | * Copyright (C) 2007-2008 Texas Instruments, Inc. |
| 5 | * Copyright (C) 2007-2010 Nokia Corporation | 5 | * Copyright (C) 2007-2011 Nokia Corporation |
| 6 | * | 6 | * |
| 7 | * Paul Walmsley, Jouni Högander | 7 | * Paul Walmsley, Jouni Högander |
| 8 | * | 8 | * |
| @@ -62,13 +62,13 @@ struct powerdomain gfx_omap2_pwrdm = { | |||
| 62 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX | | 62 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX | |
| 63 | CHIP_IS_OMAP3430ES1), | 63 | CHIP_IS_OMAP3430ES1), |
| 64 | .pwrsts = PWRSTS_OFF_RET_ON, | 64 | .pwrsts = PWRSTS_OFF_RET_ON, |
| 65 | .pwrsts_logic_ret = PWRDM_POWER_RET, | 65 | .pwrsts_logic_ret = PWRSTS_RET, |
| 66 | .banks = 1, | 66 | .banks = 1, |
| 67 | .pwrsts_mem_ret = { | 67 | .pwrsts_mem_ret = { |
| 68 | [0] = PWRDM_POWER_RET, /* MEMRETSTATE */ | 68 | [0] = PWRSTS_RET, /* MEMRETSTATE */ |
| 69 | }, | 69 | }, |
| 70 | .pwrsts_mem_on = { | 70 | .pwrsts_mem_on = { |
| 71 | [0] = PWRDM_POWER_ON, /* MEMONSTATE */ | 71 | [0] = PWRSTS_ON, /* MEMONSTATE */ |
| 72 | }, | 72 | }, |
| 73 | }; | 73 | }; |
| 74 | 74 | ||
| @@ -76,4 +76,5 @@ struct powerdomain wkup_omap2_pwrdm = { | |||
| 76 | .name = "wkup_pwrdm", | 76 | .name = "wkup_pwrdm", |
| 77 | .prcm_offs = WKUP_MOD, | 77 | .prcm_offs = WKUP_MOD, |
| 78 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX | CHIP_IS_OMAP3430), | 78 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX | CHIP_IS_OMAP3430), |
| 79 | .pwrsts = PWRSTS_ON, | ||
| 79 | }; | 80 | }; |
diff --git a/arch/arm/mach-omap2/powerdomains2xxx_data.c b/arch/arm/mach-omap2/powerdomains2xxx_data.c index 78739e10f5b..cc389fb2005 100644 --- a/arch/arm/mach-omap2/powerdomains2xxx_data.c +++ b/arch/arm/mach-omap2/powerdomains2xxx_data.c | |||
| @@ -2,7 +2,7 @@ | |||
| 2 | * OMAP2XXX powerdomain definitions | 2 | * OMAP2XXX powerdomain definitions |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2007-2008 Texas Instruments, Inc. | 4 | * Copyright (C) 2007-2008 Texas Instruments, Inc. |
| 5 | * Copyright (C) 2007-2010 Nokia Corporation | 5 | * Copyright (C) 2007-2011 Nokia Corporation |
| 6 | * | 6 | * |
| 7 | * Paul Walmsley, Jouni Högander | 7 | * Paul Walmsley, Jouni Högander |
| 8 | * | 8 | * |
| @@ -30,13 +30,13 @@ static struct powerdomain dsp_pwrdm = { | |||
| 30 | .prcm_offs = OMAP24XX_DSP_MOD, | 30 | .prcm_offs = OMAP24XX_DSP_MOD, |
| 31 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX), | 31 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX), |
| 32 | .pwrsts = PWRSTS_OFF_RET_ON, | 32 | .pwrsts = PWRSTS_OFF_RET_ON, |
| 33 | .pwrsts_logic_ret = PWRDM_POWER_RET, | 33 | .pwrsts_logic_ret = PWRSTS_RET, |
| 34 | .banks = 1, | 34 | .banks = 1, |
| 35 | .pwrsts_mem_ret = { | 35 | .pwrsts_mem_ret = { |
| 36 | [0] = PWRDM_POWER_RET, | 36 | [0] = PWRSTS_RET, |
| 37 | }, | 37 | }, |
| 38 | .pwrsts_mem_on = { | 38 | .pwrsts_mem_on = { |
| 39 | [0] = PWRDM_POWER_ON, | 39 | [0] = PWRSTS_ON, |
| 40 | }, | 40 | }, |
| 41 | }; | 41 | }; |
| 42 | 42 | ||
| @@ -48,10 +48,10 @@ static struct powerdomain mpu_24xx_pwrdm = { | |||
| 48 | .pwrsts_logic_ret = PWRSTS_OFF_RET, | 48 | .pwrsts_logic_ret = PWRSTS_OFF_RET, |
| 49 | .banks = 1, | 49 | .banks = 1, |
| 50 | .pwrsts_mem_ret = { | 50 | .pwrsts_mem_ret = { |
| 51 | [0] = PWRDM_POWER_RET, | 51 | [0] = PWRSTS_RET, |
| 52 | }, | 52 | }, |
| 53 | .pwrsts_mem_on = { | 53 | .pwrsts_mem_on = { |
| 54 | [0] = PWRDM_POWER_ON, | 54 | [0] = PWRSTS_ON, |
| 55 | }, | 55 | }, |
| 56 | }; | 56 | }; |
| 57 | 57 | ||
| @@ -87,13 +87,13 @@ static struct powerdomain mdm_pwrdm = { | |||
| 87 | .prcm_offs = OMAP2430_MDM_MOD, | 87 | .prcm_offs = OMAP2430_MDM_MOD, |
| 88 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430), | 88 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430), |
| 89 | .pwrsts = PWRSTS_OFF_RET_ON, | 89 | .pwrsts = PWRSTS_OFF_RET_ON, |
| 90 | .pwrsts_logic_ret = PWRDM_POWER_RET, | 90 | .pwrsts_logic_ret = PWRSTS_RET, |
| 91 | .banks = 1, | 91 | .banks = 1, |
| 92 | .pwrsts_mem_ret = { | 92 | .pwrsts_mem_ret = { |
| 93 | [0] = PWRDM_POWER_RET, /* MEMRETSTATE */ | 93 | [0] = PWRSTS_RET, /* MEMRETSTATE */ |
| 94 | }, | 94 | }, |
| 95 | .pwrsts_mem_on = { | 95 | .pwrsts_mem_on = { |
| 96 | [0] = PWRDM_POWER_ON, /* MEMONSTATE */ | 96 | [0] = PWRSTS_ON, /* MEMONSTATE */ |
| 97 | }, | 97 | }, |
| 98 | }; | 98 | }; |
| 99 | 99 | ||
diff --git a/arch/arm/mach-omap2/powerdomains3xxx_data.c b/arch/arm/mach-omap2/powerdomains3xxx_data.c index e1bec562625..9c9c113788b 100644 --- a/arch/arm/mach-omap2/powerdomains3xxx_data.c +++ b/arch/arm/mach-omap2/powerdomains3xxx_data.c | |||
| @@ -2,7 +2,7 @@ | |||
| 2 | * OMAP3 powerdomain definitions | 2 | * OMAP3 powerdomain definitions |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2007-2008 Texas Instruments, Inc. | 4 | * Copyright (C) 2007-2008 Texas Instruments, Inc. |
| 5 | * Copyright (C) 2007-2010 Nokia Corporation | 5 | * Copyright (C) 2007-2011 Nokia Corporation |
| 6 | * | 6 | * |
| 7 | * Paul Walmsley, Jouni Högander | 7 | * Paul Walmsley, Jouni Högander |
| 8 | * | 8 | * |
| @@ -47,10 +47,10 @@ static struct powerdomain iva2_pwrdm = { | |||
| 47 | [3] = PWRSTS_OFF_RET, | 47 | [3] = PWRSTS_OFF_RET, |
| 48 | }, | 48 | }, |
| 49 | .pwrsts_mem_on = { | 49 | .pwrsts_mem_on = { |
| 50 | [0] = PWRDM_POWER_ON, | 50 | [0] = PWRSTS_ON, |
| 51 | [1] = PWRDM_POWER_ON, | 51 | [1] = PWRSTS_ON, |
| 52 | [2] = PWRSTS_OFF_ON, | 52 | [2] = PWRSTS_OFF_ON, |
| 53 | [3] = PWRDM_POWER_ON, | 53 | [3] = PWRSTS_ON, |
| 54 | }, | 54 | }, |
| 55 | }; | 55 | }; |
| 56 | 56 | ||
| @@ -128,13 +128,13 @@ static struct powerdomain dss_pwrdm = { | |||
| 128 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430), | 128 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430), |
| 129 | .prcm_offs = OMAP3430_DSS_MOD, | 129 | .prcm_offs = OMAP3430_DSS_MOD, |
| 130 | .pwrsts = PWRSTS_OFF_RET_ON, | 130 | .pwrsts = PWRSTS_OFF_RET_ON, |
| 131 | .pwrsts_logic_ret = PWRDM_POWER_RET, | 131 | .pwrsts_logic_ret = PWRSTS_RET, |
| 132 | .banks = 1, | 132 | .banks = 1, |
| 133 | .pwrsts_mem_ret = { | 133 | .pwrsts_mem_ret = { |
| 134 | [0] = PWRDM_POWER_RET, /* MEMRETSTATE */ | 134 | [0] = PWRSTS_RET, /* MEMRETSTATE */ |
| 135 | }, | 135 | }, |
| 136 | .pwrsts_mem_on = { | 136 | .pwrsts_mem_on = { |
| 137 | [0] = PWRDM_POWER_ON, /* MEMONSTATE */ | 137 | [0] = PWRSTS_ON, /* MEMONSTATE */ |
| 138 | }, | 138 | }, |
| 139 | }; | 139 | }; |
| 140 | 140 | ||
| @@ -149,13 +149,13 @@ static struct powerdomain sgx_pwrdm = { | |||
| 149 | .omap_chip = OMAP_CHIP_INIT(CHIP_GE_OMAP3430ES2), | 149 | .omap_chip = OMAP_CHIP_INIT(CHIP_GE_OMAP3430ES2), |
| 150 | /* XXX This is accurate for 3430 SGX, but what about GFX? */ | 150 | /* XXX This is accurate for 3430 SGX, but what about GFX? */ |
| 151 | .pwrsts = PWRSTS_OFF_ON, | 151 | .pwrsts = PWRSTS_OFF_ON, |
| 152 | .pwrsts_logic_ret = PWRDM_POWER_RET, | 152 | .pwrsts_logic_ret = PWRSTS_RET, |
| 153 | .banks = 1, | 153 | .banks = 1, |
| 154 | .pwrsts_mem_ret = { | 154 | .pwrsts_mem_ret = { |
| 155 | [0] = PWRDM_POWER_RET, /* MEMRETSTATE */ | 155 | [0] = PWRSTS_RET, /* MEMRETSTATE */ |
| 156 | }, | 156 | }, |
| 157 | .pwrsts_mem_on = { | 157 | .pwrsts_mem_on = { |
| 158 | [0] = PWRDM_POWER_ON, /* MEMONSTATE */ | 158 | [0] = PWRSTS_ON, /* MEMONSTATE */ |
| 159 | }, | 159 | }, |
| 160 | }; | 160 | }; |
| 161 | 161 | ||
| @@ -164,13 +164,13 @@ static struct powerdomain cam_pwrdm = { | |||
| 164 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430), | 164 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430), |
| 165 | .prcm_offs = OMAP3430_CAM_MOD, | 165 | .prcm_offs = OMAP3430_CAM_MOD, |
| 166 | .pwrsts = PWRSTS_OFF_RET_ON, | 166 | .pwrsts = PWRSTS_OFF_RET_ON, |
| 167 | .pwrsts_logic_ret = PWRDM_POWER_RET, | 167 | .pwrsts_logic_ret = PWRSTS_RET, |
| 168 | .banks = 1, | 168 | .banks = 1, |
| 169 | .pwrsts_mem_ret = { | 169 | .pwrsts_mem_ret = { |
| 170 | [0] = PWRDM_POWER_RET, /* MEMRETSTATE */ | 170 | [0] = PWRSTS_RET, /* MEMRETSTATE */ |
| 171 | }, | 171 | }, |
| 172 | .pwrsts_mem_on = { | 172 | .pwrsts_mem_on = { |
| 173 | [0] = PWRDM_POWER_ON, /* MEMONSTATE */ | 173 | [0] = PWRSTS_ON, /* MEMONSTATE */ |
| 174 | }, | 174 | }, |
| 175 | }; | 175 | }; |
| 176 | 176 | ||
| @@ -182,10 +182,10 @@ static struct powerdomain per_pwrdm = { | |||
| 182 | .pwrsts_logic_ret = PWRSTS_OFF_RET, | 182 | .pwrsts_logic_ret = PWRSTS_OFF_RET, |
| 183 | .banks = 1, | 183 | .banks = 1, |
| 184 | .pwrsts_mem_ret = { | 184 | .pwrsts_mem_ret = { |
| 185 | [0] = PWRDM_POWER_RET, /* MEMRETSTATE */ | 185 | [0] = PWRSTS_RET, /* MEMRETSTATE */ |
| 186 | }, | 186 | }, |
| 187 | .pwrsts_mem_on = { | 187 | .pwrsts_mem_on = { |
| 188 | [0] = PWRDM_POWER_ON, /* MEMONSTATE */ | 188 | [0] = PWRSTS_ON, /* MEMONSTATE */ |
| 189 | }, | 189 | }, |
| 190 | }; | 190 | }; |
| 191 | 191 | ||
| @@ -200,7 +200,7 @@ static struct powerdomain neon_pwrdm = { | |||
| 200 | .prcm_offs = OMAP3430_NEON_MOD, | 200 | .prcm_offs = OMAP3430_NEON_MOD, |
| 201 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430), | 201 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430), |
| 202 | .pwrsts = PWRSTS_OFF_RET_ON, | 202 | .pwrsts = PWRSTS_OFF_RET_ON, |
| 203 | .pwrsts_logic_ret = PWRDM_POWER_RET, | 203 | .pwrsts_logic_ret = PWRSTS_RET, |
| 204 | }; | 204 | }; |
| 205 | 205 | ||
| 206 | static struct powerdomain usbhost_pwrdm = { | 206 | static struct powerdomain usbhost_pwrdm = { |
| @@ -208,7 +208,7 @@ static struct powerdomain usbhost_pwrdm = { | |||
| 208 | .prcm_offs = OMAP3430ES2_USBHOST_MOD, | 208 | .prcm_offs = OMAP3430ES2_USBHOST_MOD, |
| 209 | .omap_chip = OMAP_CHIP_INIT(CHIP_GE_OMAP3430ES2), | 209 | .omap_chip = OMAP_CHIP_INIT(CHIP_GE_OMAP3430ES2), |
| 210 | .pwrsts = PWRSTS_OFF_RET_ON, | 210 | .pwrsts = PWRSTS_OFF_RET_ON, |
| 211 | .pwrsts_logic_ret = PWRDM_POWER_RET, | 211 | .pwrsts_logic_ret = PWRSTS_RET, |
| 212 | /* | 212 | /* |
| 213 | * REVISIT: Enabling usb host save and restore mechanism seems to | 213 | * REVISIT: Enabling usb host save and restore mechanism seems to |
| 214 | * leave the usb host domain permanently in ACTIVE mode after | 214 | * leave the usb host domain permanently in ACTIVE mode after |
| @@ -218,10 +218,10 @@ static struct powerdomain usbhost_pwrdm = { | |||
| 218 | /*.flags = PWRDM_HAS_HDWR_SAR,*/ /* for USBHOST ctrlr only */ | 218 | /*.flags = PWRDM_HAS_HDWR_SAR,*/ /* for USBHOST ctrlr only */ |
| 219 | .banks = 1, | 219 | .banks = 1, |
| 220 | .pwrsts_mem_ret = { | 220 | .pwrsts_mem_ret = { |
| 221 | [0] = PWRDM_POWER_RET, /* MEMRETSTATE */ | 221 | [0] = PWRSTS_RET, /* MEMRETSTATE */ |
| 222 | }, | 222 | }, |
| 223 | .pwrsts_mem_on = { | 223 | .pwrsts_mem_on = { |
| 224 | [0] = PWRDM_POWER_ON, /* MEMONSTATE */ | 224 | [0] = PWRSTS_ON, /* MEMONSTATE */ |
| 225 | }, | 225 | }, |
| 226 | }; | 226 | }; |
| 227 | 227 | ||
diff --git a/arch/arm/mach-omap2/powerdomains44xx_data.c b/arch/arm/mach-omap2/powerdomains44xx_data.c index 26d7641076d..c4222c7036a 100644 --- a/arch/arm/mach-omap2/powerdomains44xx_data.c +++ b/arch/arm/mach-omap2/powerdomains44xx_data.c | |||
| @@ -2,7 +2,7 @@ | |||
| 2 | * OMAP4 Power domains framework | 2 | * OMAP4 Power domains framework |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2009-2010 Texas Instruments, Inc. | 4 | * Copyright (C) 2009-2010 Texas Instruments, Inc. |
| 5 | * Copyright (C) 2009-2010 Nokia Corporation | 5 | * Copyright (C) 2009-2011 Nokia Corporation |
| 6 | * | 6 | * |
| 7 | * Abhijit Pagare (abhijitpagare@ti.com) | 7 | * Abhijit Pagare (abhijitpagare@ti.com) |
| 8 | * Benoit Cousson (b-cousson@ti.com) | 8 | * Benoit Cousson (b-cousson@ti.com) |
| @@ -40,18 +40,18 @@ static struct powerdomain core_44xx_pwrdm = { | |||
| 40 | .pwrsts_logic_ret = PWRSTS_OFF_RET, | 40 | .pwrsts_logic_ret = PWRSTS_OFF_RET, |
| 41 | .banks = 5, | 41 | .banks = 5, |
| 42 | .pwrsts_mem_ret = { | 42 | .pwrsts_mem_ret = { |
| 43 | [0] = PWRDM_POWER_OFF, /* core_nret_bank */ | 43 | [0] = PWRSTS_OFF, /* core_nret_bank */ |
| 44 | [1] = PWRSTS_OFF_RET, /* core_ocmram */ | 44 | [1] = PWRSTS_OFF_RET, /* core_ocmram */ |
| 45 | [2] = PWRDM_POWER_RET, /* core_other_bank */ | 45 | [2] = PWRSTS_RET, /* core_other_bank */ |
| 46 | [3] = PWRSTS_OFF_RET, /* ducati_l2ram */ | 46 | [3] = PWRSTS_OFF_RET, /* ducati_l2ram */ |
| 47 | [4] = PWRSTS_OFF_RET, /* ducati_unicache */ | 47 | [4] = PWRSTS_OFF_RET, /* ducati_unicache */ |
| 48 | }, | 48 | }, |
| 49 | .pwrsts_mem_on = { | 49 | .pwrsts_mem_on = { |
| 50 | [0] = PWRDM_POWER_ON, /* core_nret_bank */ | 50 | [0] = PWRSTS_ON, /* core_nret_bank */ |
| 51 | [1] = PWRSTS_OFF_RET, /* core_ocmram */ | 51 | [1] = PWRSTS_OFF_RET, /* core_ocmram */ |
| 52 | [2] = PWRDM_POWER_ON, /* core_other_bank */ | 52 | [2] = PWRSTS_ON, /* core_other_bank */ |
| 53 | [3] = PWRDM_POWER_ON, /* ducati_l2ram */ | 53 | [3] = PWRSTS_ON, /* ducati_l2ram */ |
| 54 | [4] = PWRDM_POWER_ON, /* ducati_unicache */ | 54 | [4] = PWRSTS_ON, /* ducati_unicache */ |
| 55 | }, | 55 | }, |
| 56 | .flags = PWRDM_HAS_LOWPOWERSTATECHANGE, | 56 | .flags = PWRDM_HAS_LOWPOWERSTATECHANGE, |
| 57 | }; | 57 | }; |
| @@ -65,10 +65,10 @@ static struct powerdomain gfx_44xx_pwrdm = { | |||
| 65 | .pwrsts = PWRSTS_OFF_ON, | 65 | .pwrsts = PWRSTS_OFF_ON, |
| 66 | .banks = 1, | 66 | .banks = 1, |
| 67 | .pwrsts_mem_ret = { | 67 | .pwrsts_mem_ret = { |
| 68 | [0] = PWRDM_POWER_OFF, /* gfx_mem */ | 68 | [0] = PWRSTS_OFF, /* gfx_mem */ |
| 69 | }, | 69 | }, |
| 70 | .pwrsts_mem_on = { | 70 | .pwrsts_mem_on = { |
| 71 | [0] = PWRDM_POWER_ON, /* gfx_mem */ | 71 | [0] = PWRSTS_ON, /* gfx_mem */ |
| 72 | }, | 72 | }, |
| 73 | .flags = PWRDM_HAS_LOWPOWERSTATECHANGE, | 73 | .flags = PWRDM_HAS_LOWPOWERSTATECHANGE, |
| 74 | }; | 74 | }; |
| @@ -80,15 +80,15 @@ static struct powerdomain abe_44xx_pwrdm = { | |||
| 80 | .prcm_partition = OMAP4430_PRM_PARTITION, | 80 | .prcm_partition = OMAP4430_PRM_PARTITION, |
| 81 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430), | 81 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430), |
| 82 | .pwrsts = PWRSTS_OFF_RET_ON, | 82 | .pwrsts = PWRSTS_OFF_RET_ON, |
| 83 | .pwrsts_logic_ret = PWRDM_POWER_OFF, | 83 | .pwrsts_logic_ret = PWRSTS_OFF, |
| 84 | .banks = 2, | 84 | .banks = 2, |
| 85 | .pwrsts_mem_ret = { | 85 | .pwrsts_mem_ret = { |
| 86 | [0] = PWRDM_POWER_RET, /* aessmem */ | 86 | [0] = PWRSTS_RET, /* aessmem */ |
| 87 | [1] = PWRDM_POWER_OFF, /* periphmem */ | 87 | [1] = PWRSTS_OFF, /* periphmem */ |
| 88 | }, | 88 | }, |
| 89 | .pwrsts_mem_on = { | 89 | .pwrsts_mem_on = { |
| 90 | [0] = PWRDM_POWER_ON, /* aessmem */ | 90 | [0] = PWRSTS_ON, /* aessmem */ |
| 91 | [1] = PWRDM_POWER_ON, /* periphmem */ | 91 | [1] = PWRSTS_ON, /* periphmem */ |
| 92 | }, | 92 | }, |
| 93 | .flags = PWRDM_HAS_LOWPOWERSTATECHANGE, | 93 | .flags = PWRDM_HAS_LOWPOWERSTATECHANGE, |
| 94 | }; | 94 | }; |
| @@ -103,10 +103,10 @@ static struct powerdomain dss_44xx_pwrdm = { | |||
| 103 | .pwrsts_logic_ret = PWRSTS_OFF, | 103 | .pwrsts_logic_ret = PWRSTS_OFF, |
| 104 | .banks = 1, | 104 | .banks = 1, |
| 105 | .pwrsts_mem_ret = { | 105 | .pwrsts_mem_ret = { |
| 106 | [0] = PWRDM_POWER_OFF, /* dss_mem */ | 106 | [0] = PWRSTS_OFF, /* dss_mem */ |
| 107 | }, | 107 | }, |
| 108 | .pwrsts_mem_on = { | 108 | .pwrsts_mem_on = { |
| 109 | [0] = PWRDM_POWER_ON, /* dss_mem */ | 109 | [0] = PWRSTS_ON, /* dss_mem */ |
| 110 | }, | 110 | }, |
| 111 | .flags = PWRDM_HAS_LOWPOWERSTATECHANGE, | 111 | .flags = PWRDM_HAS_LOWPOWERSTATECHANGE, |
| 112 | }; | 112 | }; |
| @@ -121,14 +121,14 @@ static struct powerdomain tesla_44xx_pwrdm = { | |||
| 121 | .pwrsts_logic_ret = PWRSTS_OFF_RET, | 121 | .pwrsts_logic_ret = PWRSTS_OFF_RET, |
| 122 | .banks = 3, | 122 | .banks = 3, |
| 123 | .pwrsts_mem_ret = { | 123 | .pwrsts_mem_ret = { |
| 124 | [0] = PWRDM_POWER_RET, /* tesla_edma */ | 124 | [0] = PWRSTS_RET, /* tesla_edma */ |
| 125 | [1] = PWRSTS_OFF_RET, /* tesla_l1 */ | 125 | [1] = PWRSTS_OFF_RET, /* tesla_l1 */ |
| 126 | [2] = PWRSTS_OFF_RET, /* tesla_l2 */ | 126 | [2] = PWRSTS_OFF_RET, /* tesla_l2 */ |
| 127 | }, | 127 | }, |
| 128 | .pwrsts_mem_on = { | 128 | .pwrsts_mem_on = { |
| 129 | [0] = PWRDM_POWER_ON, /* tesla_edma */ | 129 | [0] = PWRSTS_ON, /* tesla_edma */ |
| 130 | [1] = PWRDM_POWER_ON, /* tesla_l1 */ | 130 | [1] = PWRSTS_ON, /* tesla_l1 */ |
| 131 | [2] = PWRDM_POWER_ON, /* tesla_l2 */ | 131 | [2] = PWRSTS_ON, /* tesla_l2 */ |
| 132 | }, | 132 | }, |
| 133 | .flags = PWRDM_HAS_LOWPOWERSTATECHANGE, | 133 | .flags = PWRDM_HAS_LOWPOWERSTATECHANGE, |
| 134 | }; | 134 | }; |
| @@ -142,10 +142,10 @@ static struct powerdomain wkup_44xx_pwrdm = { | |||
| 142 | .pwrsts = PWRSTS_ON, | 142 | .pwrsts = PWRSTS_ON, |
| 143 | .banks = 1, | 143 | .banks = 1, |
| 144 | .pwrsts_mem_ret = { | 144 | .pwrsts_mem_ret = { |
| 145 | [0] = PWRDM_POWER_OFF, /* wkup_bank */ | 145 | [0] = PWRSTS_OFF, /* wkup_bank */ |
| 146 | }, | 146 | }, |
| 147 | .pwrsts_mem_on = { | 147 | .pwrsts_mem_on = { |
| 148 | [0] = PWRDM_POWER_ON, /* wkup_bank */ | 148 | [0] = PWRSTS_ON, /* wkup_bank */ |
| 149 | }, | 149 | }, |
| 150 | }; | 150 | }; |
| 151 | 151 | ||
| @@ -162,7 +162,7 @@ static struct powerdomain cpu0_44xx_pwrdm = { | |||
| 162 | [0] = PWRSTS_OFF_RET, /* cpu0_l1 */ | 162 | [0] = PWRSTS_OFF_RET, /* cpu0_l1 */ |
| 163 | }, | 163 | }, |
| 164 | .pwrsts_mem_on = { | 164 | .pwrsts_mem_on = { |
| 165 | [0] = PWRDM_POWER_ON, /* cpu0_l1 */ | 165 | [0] = PWRSTS_ON, /* cpu0_l1 */ |
| 166 | }, | 166 | }, |
| 167 | }; | 167 | }; |
| 168 | 168 | ||
| @@ -179,7 +179,7 @@ static struct powerdomain cpu1_44xx_pwrdm = { | |||
| 179 | [0] = PWRSTS_OFF_RET, /* cpu1_l1 */ | 179 | [0] = PWRSTS_OFF_RET, /* cpu1_l1 */ |
| 180 | }, | 180 | }, |
| 181 | .pwrsts_mem_on = { | 181 | .pwrsts_mem_on = { |
| 182 | [0] = PWRDM_POWER_ON, /* cpu1_l1 */ | 182 | [0] = PWRSTS_ON, /* cpu1_l1 */ |
| 183 | }, | 183 | }, |
| 184 | }; | 184 | }; |
| 185 | 185 | ||
| @@ -192,10 +192,10 @@ static struct powerdomain emu_44xx_pwrdm = { | |||
| 192 | .pwrsts = PWRSTS_OFF_ON, | 192 | .pwrsts = PWRSTS_OFF_ON, |
| 193 | .banks = 1, | 193 | .banks = 1, |
| 194 | .pwrsts_mem_ret = { | 194 | .pwrsts_mem_ret = { |
| 195 | [0] = PWRDM_POWER_OFF, /* emu_bank */ | 195 | [0] = PWRSTS_OFF, /* emu_bank */ |
| 196 | }, | 196 | }, |
| 197 | .pwrsts_mem_on = { | 197 | .pwrsts_mem_on = { |
| 198 | [0] = PWRDM_POWER_ON, /* emu_bank */ | 198 | [0] = PWRSTS_ON, /* emu_bank */ |
| 199 | }, | 199 | }, |
| 200 | }; | 200 | }; |
| 201 | 201 | ||
| @@ -211,12 +211,12 @@ static struct powerdomain mpu_44xx_pwrdm = { | |||
| 211 | .pwrsts_mem_ret = { | 211 | .pwrsts_mem_ret = { |
| 212 | [0] = PWRSTS_OFF_RET, /* mpu_l1 */ | 212 | [0] = PWRSTS_OFF_RET, /* mpu_l1 */ |
| 213 | [1] = PWRSTS_OFF_RET, /* mpu_l2 */ | 213 | [1] = PWRSTS_OFF_RET, /* mpu_l2 */ |
| 214 | [2] = PWRDM_POWER_RET, /* mpu_ram */ | 214 | [2] = PWRSTS_RET, /* mpu_ram */ |
| 215 | }, | 215 | }, |
| 216 | .pwrsts_mem_on = { | 216 | .pwrsts_mem_on = { |
| 217 | [0] = PWRDM_POWER_ON, /* mpu_l1 */ | 217 | [0] = PWRSTS_ON, /* mpu_l1 */ |
| 218 | [1] = PWRDM_POWER_ON, /* mpu_l2 */ | 218 | [1] = PWRSTS_ON, /* mpu_l2 */ |
| 219 | [2] = PWRDM_POWER_ON, /* mpu_ram */ | 219 | [2] = PWRSTS_ON, /* mpu_ram */ |
| 220 | }, | 220 | }, |
| 221 | }; | 221 | }; |
| 222 | 222 | ||
| @@ -227,19 +227,19 @@ static struct powerdomain ivahd_44xx_pwrdm = { | |||
| 227 | .prcm_partition = OMAP4430_PRM_PARTITION, | 227 | .prcm_partition = OMAP4430_PRM_PARTITION, |
| 228 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430), | 228 | .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430), |
| 229 | .pwrsts = PWRSTS_OFF_RET_ON, | 229 | .pwrsts = PWRSTS_OFF_RET_ON, |
| 230 | .pwrsts_logic_ret = PWRDM_POWER_OFF, | 230 | .pwrsts_logic_ret = PWRSTS_OFF, |
| 231 | .banks = 4, | 231 | .banks = 4, |
| 232 | .pwrsts_mem_ret = { | 232 | .pwrsts_mem_ret = { |
| 233 | [0] = PWRDM_POWER_OFF, /* hwa_mem */ | 233 | [0] = PWRSTS_OFF, /* hwa_mem */ |
| 234 | [1] = PWRSTS_OFF_RET, /* sl2_mem */ | 234 | [1] = PWRSTS_OFF_RET, /* sl2_mem */ |
| 235 | [2] = PWRSTS_OFF_RET, /* tcm1_mem */ | 235 | [2] = PWRSTS_OFF_RET, /* tcm1_mem */ |
| 236 | [3] = PWRSTS_OFF_RET, /* tcm2_mem */ | 236 | [3] = PWRSTS_OFF_RET, /* tcm2_mem */ |
| 237 | }, | 237 | }, |
| 238 | .pwrsts_mem_on = { | 238 | .pwrsts_mem_on = { |
| 239 | [0] = PWRDM_POWER_ON, /* hwa_mem */ | 239 | [0] = PWRSTS_ON, /* hwa_mem */ |
| 240 | [1] = PWRDM_POWER_ON, /* sl2_mem */ | 240 | [1] = PWRSTS_ON, /* sl2_mem */ |
| 241 | [2] = PWRDM_POWER_ON, /* tcm1_mem */ | 241 | [2] = PWRSTS_ON, /* tcm1_mem */ |
| 242 | [3] = PWRDM_POWER_ON, /* tcm2_mem */ | 242 | [3] = PWRSTS_ON, /* tcm2_mem */ |
| 243 | }, | 243 | }, |
| 244 | .flags = PWRDM_HAS_LOWPOWERSTATECHANGE, | 244 | .flags = PWRDM_HAS_LOWPOWERSTATECHANGE, |
| 245 | }; | 245 | }; |
| @@ -253,10 +253,10 @@ static struct powerdomain cam_44xx_pwrdm = { | |||
| 253 | .pwrsts = PWRSTS_OFF_ON, | 253 | .pwrsts = PWRSTS_OFF_ON, |
| 254 | .banks = 1, | 254 | .banks = 1, |
| 255 | .pwrsts_mem_ret = { | 255 | .pwrsts_mem_ret = { |
| 256 | [0] = PWRDM_POWER_OFF, /* cam_mem */ | 256 | [0] = PWRSTS_OFF, /* cam_mem */ |
| 257 | }, | 257 | }, |
| 258 | .pwrsts_mem_on = { | 258 | .pwrsts_mem_on = { |
| 259 | [0] = PWRDM_POWER_ON, /* cam_mem */ | 259 | [0] = PWRSTS_ON, /* cam_mem */ |
| 260 | }, | 260 | }, |
| 261 | .flags = PWRDM_HAS_LOWPOWERSTATECHANGE, | 261 | .flags = PWRDM_HAS_LOWPOWERSTATECHANGE, |
| 262 | }; | 262 | }; |
| @@ -271,10 +271,10 @@ static struct powerdomain l3init_44xx_pwrdm = { | |||
| 271 | .pwrsts_logic_ret = PWRSTS_OFF_RET, | 271 | .pwrsts_logic_ret = PWRSTS_OFF_RET, |
| 272 | .banks = 1, | 272 | .banks = 1, |
| 273 | .pwrsts_mem_ret = { | 273 | .pwrsts_mem_ret = { |
| 274 | [0] = PWRDM_POWER_OFF, /* l3init_bank1 */ | 274 | [0] = PWRSTS_OFF, /* l3init_bank1 */ |
| 275 | }, | 275 | }, |
| 276 | .pwrsts_mem_on = { | 276 | .pwrsts_mem_on = { |
| 277 | [0] = PWRDM_POWER_ON, /* l3init_bank1 */ | 277 | [0] = PWRSTS_ON, /* l3init_bank1 */ |
| 278 | }, | 278 | }, |
| 279 | .flags = PWRDM_HAS_LOWPOWERSTATECHANGE, | 279 | .flags = PWRDM_HAS_LOWPOWERSTATECHANGE, |
| 280 | }; | 280 | }; |
| @@ -289,12 +289,12 @@ static struct powerdomain l4per_44xx_pwrdm = { | |||
| 289 | .pwrsts_logic_ret = PWRSTS_OFF_RET, | 289 | .pwrsts_logic_ret = PWRSTS_OFF_RET, |
| 290 | .banks = 2, | 290 | .banks = 2, |
| 291 | .pwrsts_mem_ret = { | 291 | .pwrsts_mem_ret = { |
| 292 | [0] = PWRDM_POWER_OFF, /* nonretained_bank */ | 292 | [0] = PWRSTS_OFF, /* nonretained_bank */ |
| 293 | [1] = PWRDM_POWER_RET, /* retained_bank */ | 293 | [1] = PWRSTS_RET, /* retained_bank */ |
| 294 | }, | 294 | }, |
| 295 | .pwrsts_mem_on = { | 295 | .pwrsts_mem_on = { |
| 296 | [0] = PWRDM_POWER_ON, /* nonretained_bank */ | 296 | [0] = PWRSTS_ON, /* nonretained_bank */ |
| 297 | [1] = PWRDM_POWER_ON, /* retained_bank */ | 297 | [1] = PWRSTS_ON, /* retained_bank */ |
| 298 | }, | 298 | }, |
| 299 | .flags = PWRDM_HAS_LOWPOWERSTATECHANGE, | 299 | .flags = PWRDM_HAS_LOWPOWERSTATECHANGE, |
| 300 | }; | 300 | }; |
diff --git a/arch/arm/mach-omap2/prcm_mpu44xx.h b/arch/arm/mach-omap2/prcm_mpu44xx.h index 3300ff6e3cf..d22d1b43bcc 100644 --- a/arch/arm/mach-omap2/prcm_mpu44xx.h +++ b/arch/arm/mach-omap2/prcm_mpu44xx.h | |||
| @@ -38,8 +38,8 @@ | |||
| 38 | #define OMAP4430_PRCM_MPU_CPU1_INST 0x0800 | 38 | #define OMAP4430_PRCM_MPU_CPU1_INST 0x0800 |
| 39 | 39 | ||
| 40 | /* PRCM_MPU clockdomain register offsets (from instance start) */ | 40 | /* PRCM_MPU clockdomain register offsets (from instance start) */ |
| 41 | #define OMAP4430_PRCM_MPU_CPU0_MPU_CDOFFS 0x0018 | 41 | #define OMAP4430_PRCM_MPU_CPU0_CPU0_CDOFFS 0x0018 |
| 42 | #define OMAP4430_PRCM_MPU_CPU1_MPU_CDOFFS 0x0018 | 42 | #define OMAP4430_PRCM_MPU_CPU1_CPU1_CDOFFS 0x0018 |
| 43 | 43 | ||
| 44 | 44 | ||
| 45 | /* | 45 | /* |
diff --git a/arch/arm/mach-omap2/prm2xxx_3xxx.c b/arch/arm/mach-omap2/prm2xxx_3xxx.c index ec0362574b5..051213fbc34 100644 --- a/arch/arm/mach-omap2/prm2xxx_3xxx.c +++ b/arch/arm/mach-omap2/prm2xxx_3xxx.c | |||
| @@ -118,7 +118,8 @@ int omap2_prm_assert_hardreset(s16 prm_mod, u8 shift) | |||
| 118 | /** | 118 | /** |
| 119 | * omap2_prm_deassert_hardreset - deassert a submodule hardreset line and wait | 119 | * omap2_prm_deassert_hardreset - deassert a submodule hardreset line and wait |
| 120 | * @prm_mod: PRM submodule base (e.g. CORE_MOD) | 120 | * @prm_mod: PRM submodule base (e.g. CORE_MOD) |
| 121 | * @shift: register bit shift corresponding to the reset line to deassert | 121 | * @rst_shift: register bit shift corresponding to the reset line to deassert |
| 122 | * @st_shift: register bit shift for the status of the deasserted submodule | ||
| 122 | * | 123 | * |
| 123 | * Some IPs like dsp or iva contain processors that require an HW | 124 | * Some IPs like dsp or iva contain processors that require an HW |
| 124 | * reset line to be asserted / deasserted in order to fully enable the | 125 | * reset line to be asserted / deasserted in order to fully enable the |
| @@ -129,27 +130,28 @@ int omap2_prm_assert_hardreset(s16 prm_mod, u8 shift) | |||
| 129 | * -EINVAL upon an argument error, -EEXIST if the submodule was already out | 130 | * -EINVAL upon an argument error, -EEXIST if the submodule was already out |
| 130 | * of reset, or -EBUSY if the submodule did not exit reset promptly. | 131 | * of reset, or -EBUSY if the submodule did not exit reset promptly. |
| 131 | */ | 132 | */ |
| 132 | int omap2_prm_deassert_hardreset(s16 prm_mod, u8 shift) | 133 | int omap2_prm_deassert_hardreset(s16 prm_mod, u8 rst_shift, u8 st_shift) |
| 133 | { | 134 | { |
| 134 | u32 mask; | 135 | u32 rst, st; |
| 135 | int c; | 136 | int c; |
| 136 | 137 | ||
| 137 | if (!(cpu_is_omap24xx() || cpu_is_omap34xx())) | 138 | if (!(cpu_is_omap24xx() || cpu_is_omap34xx())) |
| 138 | return -EINVAL; | 139 | return -EINVAL; |
| 139 | 140 | ||
| 140 | mask = 1 << shift; | 141 | rst = 1 << rst_shift; |
| 142 | st = 1 << st_shift; | ||
| 141 | 143 | ||
| 142 | /* Check the current status to avoid de-asserting the line twice */ | 144 | /* Check the current status to avoid de-asserting the line twice */ |
| 143 | if (omap2_prm_read_mod_bits_shift(prm_mod, OMAP2_RM_RSTCTRL, mask) == 0) | 145 | if (omap2_prm_read_mod_bits_shift(prm_mod, OMAP2_RM_RSTCTRL, rst) == 0) |
| 144 | return -EEXIST; | 146 | return -EEXIST; |
| 145 | 147 | ||
| 146 | /* Clear the reset status by writing 1 to the status bit */ | 148 | /* Clear the reset status by writing 1 to the status bit */ |
| 147 | omap2_prm_rmw_mod_reg_bits(0xffffffff, mask, prm_mod, OMAP2_RM_RSTST); | 149 | omap2_prm_rmw_mod_reg_bits(0xffffffff, st, prm_mod, OMAP2_RM_RSTST); |
| 148 | /* de-assert the reset control line */ | 150 | /* de-assert the reset control line */ |
| 149 | omap2_prm_rmw_mod_reg_bits(mask, 0, prm_mod, OMAP2_RM_RSTCTRL); | 151 | omap2_prm_rmw_mod_reg_bits(rst, 0, prm_mod, OMAP2_RM_RSTCTRL); |
| 150 | /* wait the status to be set */ | 152 | /* wait the status to be set */ |
| 151 | omap_test_timeout(omap2_prm_read_mod_bits_shift(prm_mod, OMAP2_RM_RSTST, | 153 | omap_test_timeout(omap2_prm_read_mod_bits_shift(prm_mod, OMAP2_RM_RSTST, |
| 152 | mask), | 154 | st), |
| 153 | MAX_MODULE_HARDRESET_WAIT, c); | 155 | MAX_MODULE_HARDRESET_WAIT, c); |
| 154 | 156 | ||
| 155 | return (c == MAX_MODULE_HARDRESET_WAIT) ? -EBUSY : 0; | 157 | return (c == MAX_MODULE_HARDRESET_WAIT) ? -EBUSY : 0; |
diff --git a/arch/arm/mach-omap2/prm2xxx_3xxx.h b/arch/arm/mach-omap2/prm2xxx_3xxx.h index 49654c8d18f..a1fc62a39db 100644 --- a/arch/arm/mach-omap2/prm2xxx_3xxx.h +++ b/arch/arm/mach-omap2/prm2xxx_3xxx.h | |||
| @@ -282,7 +282,8 @@ static inline int omap2_prm_assert_hardreset(s16 prm_mod, u8 shift) | |||
| 282 | "not suppose to be used on omap4\n"); | 282 | "not suppose to be used on omap4\n"); |
| 283 | return 0; | 283 | return 0; |
| 284 | } | 284 | } |
| 285 | static inline int omap2_prm_deassert_hardreset(s16 prm_mod, u8 shift) | 285 | static inline int omap2_prm_deassert_hardreset(s16 prm_mod, u8 rst_shift, |
| 286 | u8 st_shift) | ||
| 286 | { | 287 | { |
| 287 | WARN(1, "prm: omap2xxx/omap3xxx specific function and " | 288 | WARN(1, "prm: omap2xxx/omap3xxx specific function and " |
| 288 | "not suppose to be used on omap4\n"); | 289 | "not suppose to be used on omap4\n"); |
| @@ -300,7 +301,7 @@ extern u32 omap2_prm_read_mod_bits_shift(s16 domain, s16 idx, u32 mask); | |||
| 300 | /* These omap2_ PRM functions apply to both OMAP2 and 3 */ | 301 | /* These omap2_ PRM functions apply to both OMAP2 and 3 */ |
| 301 | extern int omap2_prm_is_hardreset_asserted(s16 prm_mod, u8 shift); | 302 | extern int omap2_prm_is_hardreset_asserted(s16 prm_mod, u8 shift); |
| 302 | extern int omap2_prm_assert_hardreset(s16 prm_mod, u8 shift); | 303 | extern int omap2_prm_assert_hardreset(s16 prm_mod, u8 shift); |
| 303 | extern int omap2_prm_deassert_hardreset(s16 prm_mod, u8 shift); | 304 | extern int omap2_prm_deassert_hardreset(s16 prm_mod, u8 rst_shift, u8 st_shift); |
| 304 | 305 | ||
| 305 | #endif /* CONFIG_ARCH_OMAP4 */ | 306 | #endif /* CONFIG_ARCH_OMAP4 */ |
| 306 | #endif | 307 | #endif |
diff --git a/arch/arm/mach-omap2/sleep34xx.S b/arch/arm/mach-omap2/sleep34xx.S index 98d8232808b..e60ac1f71bd 100644 --- a/arch/arm/mach-omap2/sleep34xx.S +++ b/arch/arm/mach-omap2/sleep34xx.S | |||
| @@ -64,6 +64,11 @@ | |||
| 64 | #define SDRC_DLLA_STATUS_V OMAP34XX_SDRC_REGADDR(SDRC_DLLA_STATUS) | 64 | #define SDRC_DLLA_STATUS_V OMAP34XX_SDRC_REGADDR(SDRC_DLLA_STATUS) |
| 65 | #define SDRC_DLLA_CTRL_V OMAP34XX_SDRC_REGADDR(SDRC_DLLA_CTRL) | 65 | #define SDRC_DLLA_CTRL_V OMAP34XX_SDRC_REGADDR(SDRC_DLLA_CTRL) |
| 66 | 66 | ||
| 67 | /* | ||
| 68 | * This file needs be built unconditionally as ARM to interoperate correctly | ||
| 69 | * with non-Thumb-2-capable firmware. | ||
| 70 | */ | ||
| 71 | .arm | ||
| 67 | 72 | ||
| 68 | /* | 73 | /* |
| 69 | * API functions | 74 | * API functions |
| @@ -82,6 +87,8 @@ ENTRY(get_restore_pointer) | |||
| 82 | stmfd sp!, {lr} @ save registers on stack | 87 | stmfd sp!, {lr} @ save registers on stack |
| 83 | adr r0, restore | 88 | adr r0, restore |
| 84 | ldmfd sp!, {pc} @ restore regs and return | 89 | ldmfd sp!, {pc} @ restore regs and return |
| 90 | ENDPROC(get_restore_pointer) | ||
| 91 | .align | ||
| 85 | ENTRY(get_restore_pointer_sz) | 92 | ENTRY(get_restore_pointer_sz) |
| 86 | .word . - get_restore_pointer | 93 | .word . - get_restore_pointer |
| 87 | 94 | ||
| @@ -91,6 +98,8 @@ ENTRY(get_omap3630_restore_pointer) | |||
| 91 | stmfd sp!, {lr} @ save registers on stack | 98 | stmfd sp!, {lr} @ save registers on stack |
| 92 | adr r0, restore_3630 | 99 | adr r0, restore_3630 |
| 93 | ldmfd sp!, {pc} @ restore regs and return | 100 | ldmfd sp!, {pc} @ restore regs and return |
| 101 | ENDPROC(get_omap3630_restore_pointer) | ||
| 102 | .align | ||
| 94 | ENTRY(get_omap3630_restore_pointer_sz) | 103 | ENTRY(get_omap3630_restore_pointer_sz) |
| 95 | .word . - get_omap3630_restore_pointer | 104 | .word . - get_omap3630_restore_pointer |
| 96 | 105 | ||
| @@ -100,6 +109,8 @@ ENTRY(get_es3_restore_pointer) | |||
| 100 | stmfd sp!, {lr} @ save registers on stack | 109 | stmfd sp!, {lr} @ save registers on stack |
| 101 | adr r0, restore_es3 | 110 | adr r0, restore_es3 |
| 102 | ldmfd sp!, {pc} @ restore regs and return | 111 | ldmfd sp!, {pc} @ restore regs and return |
| 112 | ENDPROC(get_es3_restore_pointer) | ||
| 113 | .align | ||
| 103 | ENTRY(get_es3_restore_pointer_sz) | 114 | ENTRY(get_es3_restore_pointer_sz) |
| 104 | .word . - get_es3_restore_pointer | 115 | .word . - get_es3_restore_pointer |
| 105 | 116 | ||
| @@ -113,8 +124,10 @@ ENTRY(enable_omap3630_toggle_l2_on_restore) | |||
| 113 | stmfd sp!, {lr} @ save registers on stack | 124 | stmfd sp!, {lr} @ save registers on stack |
| 114 | /* Setup so that we will disable and enable l2 */ | 125 | /* Setup so that we will disable and enable l2 */ |
| 115 | mov r1, #0x1 | 126 | mov r1, #0x1 |
| 116 | str r1, l2dis_3630 | 127 | adrl r2, l2dis_3630 @ may be too distant for plain adr |
| 128 | str r1, [r2] | ||
| 117 | ldmfd sp!, {pc} @ restore regs and return | 129 | ldmfd sp!, {pc} @ restore regs and return |
| 130 | ENDPROC(enable_omap3630_toggle_l2_on_restore) | ||
| 118 | 131 | ||
| 119 | .text | 132 | .text |
| 120 | /* Function to call rom code to save secure ram context */ | 133 | /* Function to call rom code to save secure ram context */ |
| @@ -131,20 +144,22 @@ ENTRY(save_secure_ram_context) | |||
| 131 | mov r1, #0 @ set task id for ROM code in r1 | 144 | mov r1, #0 @ set task id for ROM code in r1 |
| 132 | mov r2, #4 @ set some flags in r2, r6 | 145 | mov r2, #4 @ set some flags in r2, r6 |
| 133 | mov r6, #0xff | 146 | mov r6, #0xff |
| 134 | mcr p15, 0, r0, c7, c10, 4 @ data write barrier | 147 | dsb @ data write barrier |
| 135 | mcr p15, 0, r0, c7, c10, 5 @ data memory barrier | 148 | dmb @ data memory barrier |
| 136 | .word 0xE1600071 @ call SMI monitor (smi #1) | 149 | smc #1 @ call SMI monitor (smi #1) |
| 137 | nop | 150 | nop |
| 138 | nop | 151 | nop |
| 139 | nop | 152 | nop |
| 140 | nop | 153 | nop |
| 141 | ldmfd sp!, {r1-r12, pc} | 154 | ldmfd sp!, {r1-r12, pc} |
| 155 | .align | ||
| 142 | sram_phy_addr_mask: | 156 | sram_phy_addr_mask: |
| 143 | .word SRAM_BASE_P | 157 | .word SRAM_BASE_P |
| 144 | high_mask: | 158 | high_mask: |
| 145 | .word 0xffff | 159 | .word 0xffff |
| 146 | api_params: | 160 | api_params: |
| 147 | .word 0x4, 0x0, 0x0, 0x1, 0x1 | 161 | .word 0x4, 0x0, 0x0, 0x1, 0x1 |
| 162 | ENDPROC(save_secure_ram_context) | ||
| 148 | ENTRY(save_secure_ram_context_sz) | 163 | ENTRY(save_secure_ram_context_sz) |
| 149 | .word . - save_secure_ram_context | 164 | .word . - save_secure_ram_context |
| 150 | 165 | ||
| @@ -173,12 +188,12 @@ ENTRY(omap34xx_cpu_suspend) | |||
| 173 | stmfd sp!, {r0-r12, lr} @ save registers on stack | 188 | stmfd sp!, {r0-r12, lr} @ save registers on stack |
| 174 | 189 | ||
| 175 | /* | 190 | /* |
| 176 | * r0 contains restore pointer in sdram | 191 | * r0 contains CPU context save/restore pointer in sdram |
| 177 | * r1 contains information about saving context: | 192 | * r1 contains information about saving context: |
| 178 | * 0 - No context lost | 193 | * 0 - No context lost |
| 179 | * 1 - Only L1 and logic lost | 194 | * 1 - Only L1 and logic lost |
| 180 | * 2 - Only L2 lost | 195 | * 2 - Only L2 lost (Even L1 is retained we clean it along with L2) |
| 181 | * 3 - Both L1 and L2 lost | 196 | * 3 - Both L1 and L2 lost and logic lost |
| 182 | */ | 197 | */ |
| 183 | 198 | ||
| 184 | /* Directly jump to WFI is the context save is not required */ | 199 | /* Directly jump to WFI is the context save is not required */ |
| @@ -199,89 +214,74 @@ save_context_wfi: | |||
| 199 | beq clean_caches | 214 | beq clean_caches |
| 200 | 215 | ||
| 201 | l1_logic_lost: | 216 | l1_logic_lost: |
| 202 | /* Store sp and spsr to SDRAM */ | 217 | mov r4, sp @ Store sp |
| 203 | mov r4, sp | 218 | mrs r5, spsr @ Store spsr |
| 204 | mrs r5, spsr | 219 | mov r6, lr @ Store lr |
| 205 | mov r6, lr | ||
| 206 | stmia r8!, {r4-r6} | 220 | stmia r8!, {r4-r6} |
| 207 | /* Save all ARM registers */ | 221 | |
| 208 | /* Coprocessor access control register */ | 222 | mrc p15, 0, r4, c1, c0, 2 @ Coprocessor access control register |
| 209 | mrc p15, 0, r6, c1, c0, 2 | 223 | mrc p15, 0, r5, c2, c0, 0 @ TTBR0 |
| 210 | stmia r8!, {r6} | 224 | mrc p15, 0, r6, c2, c0, 1 @ TTBR1 |
| 211 | /* TTBR0, TTBR1 and Translation table base control */ | 225 | mrc p15, 0, r7, c2, c0, 2 @ TTBCR |
| 212 | mrc p15, 0, r4, c2, c0, 0 | ||
| 213 | mrc p15, 0, r5, c2, c0, 1 | ||
| 214 | mrc p15, 0, r6, c2, c0, 2 | ||
| 215 | stmia r8!, {r4-r6} | ||
| 216 | /* | ||
| 217 | * Domain access control register, data fault status register, | ||
| 218 | * and instruction fault status register | ||
| 219 | */ | ||
| 220 | mrc p15, 0, r4, c3, c0, 0 | ||
| 221 | mrc p15, 0, r5, c5, c0, 0 | ||
| 222 | mrc p15, 0, r6, c5, c0, 1 | ||
| 223 | stmia r8!, {r4-r6} | ||
| 224 | /* | ||
| 225 | * Data aux fault status register, instruction aux fault status, | ||
| 226 | * data fault address register and instruction fault address register | ||
| 227 | */ | ||
| 228 | mrc p15, 0, r4, c5, c1, 0 | ||
| 229 | mrc p15, 0, r5, c5, c1, 1 | ||
| 230 | mrc p15, 0, r6, c6, c0, 0 | ||
| 231 | mrc p15, 0, r7, c6, c0, 2 | ||
| 232 | stmia r8!, {r4-r7} | ||
| 233 | /* | ||
| 234 | * user r/w thread and process ID, user r/o thread and process ID, | ||
| 235 | * priv only thread and process ID, cache size selection | ||
| 236 | */ | ||
| 237 | mrc p15, 0, r4, c13, c0, 2 | ||
| 238 | mrc p15, 0, r5, c13, c0, 3 | ||
| 239 | mrc p15, 0, r6, c13, c0, 4 | ||
| 240 | mrc p15, 2, r7, c0, c0, 0 | ||
| 241 | stmia r8!, {r4-r7} | 226 | stmia r8!, {r4-r7} |
| 242 | /* Data TLB lockdown, instruction TLB lockdown registers */ | ||
| 243 | mrc p15, 0, r5, c10, c0, 0 | ||
| 244 | mrc p15, 0, r6, c10, c0, 1 | ||
| 245 | stmia r8!, {r5-r6} | ||
| 246 | /* Secure or non secure vector base address, FCSE PID, Context PID*/ | ||
| 247 | mrc p15, 0, r4, c12, c0, 0 | ||
| 248 | mrc p15, 0, r5, c13, c0, 0 | ||
| 249 | mrc p15, 0, r6, c13, c0, 1 | ||
| 250 | stmia r8!, {r4-r6} | ||
| 251 | /* Primary remap, normal remap registers */ | ||
| 252 | mrc p15, 0, r4, c10, c2, 0 | ||
| 253 | mrc p15, 0, r5, c10, c2, 1 | ||
| 254 | stmia r8!,{r4-r5} | ||
| 255 | 227 | ||
| 256 | /* Store current cpsr*/ | 228 | mrc p15, 0, r4, c3, c0, 0 @ Domain access Control Register |
| 257 | mrs r2, cpsr | 229 | mrc p15, 0, r5, c10, c2, 0 @ PRRR |
| 258 | stmia r8!, {r2} | 230 | mrc p15, 0, r6, c10, c2, 1 @ NMRR |
| 231 | stmia r8!,{r4-r6} | ||
| 259 | 232 | ||
| 260 | mrc p15, 0, r4, c1, c0, 0 | 233 | mrc p15, 0, r4, c13, c0, 1 @ Context ID |
| 261 | /* save control register */ | 234 | mrc p15, 0, r5, c13, c0, 2 @ User r/w thread and process ID |
| 235 | mrc p15, 0, r6, c12, c0, 0 @ Secure or NS vector base address | ||
| 236 | mrs r7, cpsr @ Store current cpsr | ||
| 237 | stmia r8!, {r4-r7} | ||
| 238 | |||
| 239 | mrc p15, 0, r4, c1, c0, 0 @ save control register | ||
| 262 | stmia r8!, {r4} | 240 | stmia r8!, {r4} |
| 263 | 241 | ||
| 264 | clean_caches: | 242 | clean_caches: |
| 265 | /* | 243 | /* |
| 266 | * Clean Data or unified cache to POU | ||
| 267 | * How to invalidate only L1 cache???? - #FIX_ME# | ||
| 268 | * mcr p15, 0, r11, c7, c11, 1 | ||
| 269 | */ | ||
| 270 | cmp r1, #0x1 @ Check whether L2 inval is required | ||
| 271 | beq omap3_do_wfi | ||
| 272 | |||
| 273 | clean_l2: | ||
| 274 | /* | ||
| 275 | * jump out to kernel flush routine | 244 | * jump out to kernel flush routine |
| 276 | * - reuse that code is better | 245 | * - reuse that code is better |
| 277 | * - it executes in a cached space so is faster than refetch per-block | 246 | * - it executes in a cached space so is faster than refetch per-block |
| 278 | * - should be faster and will change with kernel | 247 | * - should be faster and will change with kernel |
| 279 | * - 'might' have to copy address, load and jump to it | 248 | * - 'might' have to copy address, load and jump to it |
| 249 | * Flush all data from the L1 data cache before disabling | ||
| 250 | * SCTLR.C bit. | ||
| 280 | */ | 251 | */ |
| 281 | ldr r1, kernel_flush | 252 | ldr r1, kernel_flush |
| 282 | mov lr, pc | 253 | mov lr, pc |
| 283 | bx r1 | 254 | bx r1 |
| 284 | 255 | ||
| 256 | /* | ||
| 257 | * Clear the SCTLR.C bit to prevent further data cache | ||
| 258 | * allocation. Clearing SCTLR.C would make all the data accesses | ||
| 259 | * strongly ordered and would not hit the cache. | ||
| 260 | */ | ||
| 261 | mrc p15, 0, r0, c1, c0, 0 | ||
| 262 | bic r0, r0, #(1 << 2) @ Disable the C bit | ||
| 263 | mcr p15, 0, r0, c1, c0, 0 | ||
| 264 | isb | ||
| 265 | |||
| 266 | /* | ||
| 267 | * Invalidate L1 data cache. Even though only invalidate is | ||
| 268 | * necessary exported flush API is used here. Doing clean | ||
| 269 | * on already clean cache would be almost NOP. | ||
| 270 | */ | ||
| 271 | ldr r1, kernel_flush | ||
| 272 | blx r1 | ||
| 273 | /* | ||
| 274 | * The kernel doesn't interwork: v7_flush_dcache_all in particluar will | ||
| 275 | * always return in Thumb state when CONFIG_THUMB2_KERNEL is enabled. | ||
| 276 | * This sequence switches back to ARM. Note that .align may insert a | ||
| 277 | * nop: bx pc needs to be word-aligned in order to work. | ||
| 278 | */ | ||
| 279 | THUMB( .thumb ) | ||
| 280 | THUMB( .align ) | ||
| 281 | THUMB( bx pc ) | ||
| 282 | THUMB( nop ) | ||
| 283 | .arm | ||
| 284 | |||
| 285 | omap3_do_wfi: | 285 | omap3_do_wfi: |
| 286 | ldr r4, sdrc_power @ read the SDRC_POWER register | 286 | ldr r4, sdrc_power @ read the SDRC_POWER register |
| 287 | ldr r5, [r4] @ read the contents of SDRC_POWER | 287 | ldr r5, [r4] @ read the contents of SDRC_POWER |
| @@ -289,9 +289,8 @@ omap3_do_wfi: | |||
| 289 | str r5, [r4] @ write back to SDRC_POWER register | 289 | str r5, [r4] @ write back to SDRC_POWER register |
| 290 | 290 | ||
| 291 | /* Data memory barrier and Data sync barrier */ | 291 | /* Data memory barrier and Data sync barrier */ |
| 292 | mov r1, #0 | 292 | dsb |
| 293 | mcr p15, 0, r1, c7, c10, 4 | 293 | dmb |
| 294 | mcr p15, 0, r1, c7, c10, 5 | ||
| 295 | 294 | ||
| 296 | /* | 295 | /* |
| 297 | * =================================== | 296 | * =================================== |
| @@ -317,6 +316,12 @@ omap3_do_wfi: | |||
| 317 | nop | 316 | nop |
| 318 | bl wait_sdrc_ok | 317 | bl wait_sdrc_ok |
| 319 | 318 | ||
| 319 | mrc p15, 0, r0, c1, c0, 0 | ||
| 320 | tst r0, #(1 << 2) @ Check C bit enabled? | ||
| 321 | orreq r0, r0, #(1 << 2) @ Enable the C bit if cleared | ||
| 322 | mcreq p15, 0, r0, c1, c0, 0 | ||
| 323 | isb | ||
| 324 | |||
| 320 | /* | 325 | /* |
| 321 | * =================================== | 326 | * =================================== |
| 322 | * == Exit point from non-OFF modes == | 327 | * == Exit point from non-OFF modes == |
| @@ -406,9 +411,9 @@ skipl2dis: | |||
| 406 | mov r2, #4 @ set some flags in r2, r6 | 411 | mov r2, #4 @ set some flags in r2, r6 |
| 407 | mov r6, #0xff | 412 | mov r6, #0xff |
| 408 | adr r3, l2_inv_api_params @ r3 points to dummy parameters | 413 | adr r3, l2_inv_api_params @ r3 points to dummy parameters |
| 409 | mcr p15, 0, r0, c7, c10, 4 @ data write barrier | 414 | dsb @ data write barrier |
| 410 | mcr p15, 0, r0, c7, c10, 5 @ data memory barrier | 415 | dmb @ data memory barrier |
| 411 | .word 0xE1600071 @ call SMI monitor (smi #1) | 416 | smc #1 @ call SMI monitor (smi #1) |
| 412 | /* Write to Aux control register to set some bits */ | 417 | /* Write to Aux control register to set some bits */ |
| 413 | mov r0, #42 @ set service ID for PPA | 418 | mov r0, #42 @ set service ID for PPA |
| 414 | mov r12, r0 @ copy secure Service ID in r12 | 419 | mov r12, r0 @ copy secure Service ID in r12 |
| @@ -417,9 +422,9 @@ skipl2dis: | |||
| 417 | mov r6, #0xff | 422 | mov r6, #0xff |
| 418 | ldr r4, scratchpad_base | 423 | ldr r4, scratchpad_base |
| 419 | ldr r3, [r4, #0xBC] @ r3 points to parameters | 424 | ldr r3, [r4, #0xBC] @ r3 points to parameters |
| 420 | mcr p15, 0, r0, c7, c10, 4 @ data write barrier | 425 | dsb @ data write barrier |
| 421 | mcr p15, 0, r0, c7, c10, 5 @ data memory barrier | 426 | dmb @ data memory barrier |
| 422 | .word 0xE1600071 @ call SMI monitor (smi #1) | 427 | smc #1 @ call SMI monitor (smi #1) |
| 423 | 428 | ||
| 424 | #ifdef CONFIG_OMAP3_L2_AUX_SECURE_SAVE_RESTORE | 429 | #ifdef CONFIG_OMAP3_L2_AUX_SECURE_SAVE_RESTORE |
| 425 | /* Restore L2 aux control register */ | 430 | /* Restore L2 aux control register */ |
| @@ -432,29 +437,30 @@ skipl2dis: | |||
| 432 | ldr r4, scratchpad_base | 437 | ldr r4, scratchpad_base |
| 433 | ldr r3, [r4, #0xBC] | 438 | ldr r3, [r4, #0xBC] |
| 434 | adds r3, r3, #8 @ r3 points to parameters | 439 | adds r3, r3, #8 @ r3 points to parameters |
| 435 | mcr p15, 0, r0, c7, c10, 4 @ data write barrier | 440 | dsb @ data write barrier |
| 436 | mcr p15, 0, r0, c7, c10, 5 @ data memory barrier | 441 | dmb @ data memory barrier |
| 437 | .word 0xE1600071 @ call SMI monitor (smi #1) | 442 | smc #1 @ call SMI monitor (smi #1) |
| 438 | #endif | 443 | #endif |
| 439 | b logic_l1_restore | 444 | b logic_l1_restore |
| 440 | 445 | ||
| 446 | .align | ||
| 441 | l2_inv_api_params: | 447 | l2_inv_api_params: |
| 442 | .word 0x1, 0x00 | 448 | .word 0x1, 0x00 |
| 443 | l2_inv_gp: | 449 | l2_inv_gp: |
| 444 | /* Execute smi to invalidate L2 cache */ | 450 | /* Execute smi to invalidate L2 cache */ |
| 445 | mov r12, #0x1 @ set up to invalidate L2 | 451 | mov r12, #0x1 @ set up to invalidate L2 |
| 446 | .word 0xE1600070 @ Call SMI monitor (smieq) | 452 | smc #0 @ Call SMI monitor (smieq) |
| 447 | /* Write to Aux control register to set some bits */ | 453 | /* Write to Aux control register to set some bits */ |
| 448 | ldr r4, scratchpad_base | 454 | ldr r4, scratchpad_base |
| 449 | ldr r3, [r4,#0xBC] | 455 | ldr r3, [r4,#0xBC] |
| 450 | ldr r0, [r3,#4] | 456 | ldr r0, [r3,#4] |
| 451 | mov r12, #0x3 | 457 | mov r12, #0x3 |
| 452 | .word 0xE1600070 @ Call SMI monitor (smieq) | 458 | smc #0 @ Call SMI monitor (smieq) |
| 453 | ldr r4, scratchpad_base | 459 | ldr r4, scratchpad_base |
| 454 | ldr r3, [r4,#0xBC] | 460 | ldr r3, [r4,#0xBC] |
| 455 | ldr r0, [r3,#12] | 461 | ldr r0, [r3,#12] |
| 456 | mov r12, #0x2 | 462 | mov r12, #0x2 |
| 457 | .word 0xE1600070 @ Call SMI monitor (smieq) | 463 | smc #0 @ Call SMI monitor (smieq) |
| 458 | logic_l1_restore: | 464 | logic_l1_restore: |
| 459 | ldr r1, l2dis_3630 | 465 | ldr r1, l2dis_3630 |
| 460 | cmp r1, #0x1 @ Test if L2 re-enable needed on 3630 | 466 | cmp r1, #0x1 @ Test if L2 re-enable needed on 3630 |
| @@ -473,68 +479,29 @@ skipl2reen: | |||
| 473 | ldr r4, scratchpad_base | 479 | ldr r4, scratchpad_base |
| 474 | ldr r3, [r4,#0xBC] | 480 | ldr r3, [r4,#0xBC] |
| 475 | adds r3, r3, #16 | 481 | adds r3, r3, #16 |
| 482 | |||
| 476 | ldmia r3!, {r4-r6} | 483 | ldmia r3!, {r4-r6} |
| 477 | mov sp, r4 | 484 | mov sp, r4 @ Restore sp |
| 478 | msr spsr_cxsf, r5 | 485 | msr spsr_cxsf, r5 @ Restore spsr |
| 479 | mov lr, r6 | 486 | mov lr, r6 @ Restore lr |
| 480 | 487 | ||
| 481 | ldmia r3!, {r4-r9} | 488 | ldmia r3!, {r4-r7} |
| 482 | /* Coprocessor access Control Register */ | 489 | mcr p15, 0, r4, c1, c0, 2 @ Coprocessor access Control Register |
| 483 | mcr p15, 0, r4, c1, c0, 2 | 490 | mcr p15, 0, r5, c2, c0, 0 @ TTBR0 |
| 484 | 491 | mcr p15, 0, r6, c2, c0, 1 @ TTBR1 | |
| 485 | /* TTBR0 */ | 492 | mcr p15, 0, r7, c2, c0, 2 @ TTBCR |
| 486 | MCR p15, 0, r5, c2, c0, 0 | 493 | |
| 487 | /* TTBR1 */ | 494 | ldmia r3!,{r4-r6} |
| 488 | MCR p15, 0, r6, c2, c0, 1 | 495 | mcr p15, 0, r4, c3, c0, 0 @ Domain access Control Register |
| 489 | /* Translation table base control register */ | 496 | mcr p15, 0, r5, c10, c2, 0 @ PRRR |
| 490 | MCR p15, 0, r7, c2, c0, 2 | 497 | mcr p15, 0, r6, c10, c2, 1 @ NMRR |
| 491 | /* Domain access Control Register */ | 498 | |
| 492 | MCR p15, 0, r8, c3, c0, 0 | ||
| 493 | /* Data fault status Register */ | ||
| 494 | MCR p15, 0, r9, c5, c0, 0 | ||
| 495 | |||
| 496 | ldmia r3!,{r4-r8} | ||
| 497 | /* Instruction fault status Register */ | ||
| 498 | MCR p15, 0, r4, c5, c0, 1 | ||
| 499 | /* Data Auxiliary Fault Status Register */ | ||
| 500 | MCR p15, 0, r5, c5, c1, 0 | ||
| 501 | /* Instruction Auxiliary Fault Status Register*/ | ||
| 502 | MCR p15, 0, r6, c5, c1, 1 | ||
| 503 | /* Data Fault Address Register */ | ||
| 504 | MCR p15, 0, r7, c6, c0, 0 | ||
| 505 | /* Instruction Fault Address Register*/ | ||
| 506 | MCR p15, 0, r8, c6, c0, 2 | ||
| 507 | ldmia r3!,{r4-r7} | ||
| 508 | 499 | ||
| 509 | /* User r/w thread and process ID */ | 500 | ldmia r3!,{r4-r7} |
| 510 | MCR p15, 0, r4, c13, c0, 2 | 501 | mcr p15, 0, r4, c13, c0, 1 @ Context ID |
| 511 | /* User ro thread and process ID */ | 502 | mcr p15, 0, r5, c13, c0, 2 @ User r/w thread and process ID |
| 512 | MCR p15, 0, r5, c13, c0, 3 | 503 | mrc p15, 0, r6, c12, c0, 0 @ Secure or NS vector base address |
| 513 | /* Privileged only thread and process ID */ | 504 | msr cpsr, r7 @ store cpsr |
| 514 | MCR p15, 0, r6, c13, c0, 4 | ||
| 515 | /* Cache size selection */ | ||
| 516 | MCR p15, 2, r7, c0, c0, 0 | ||
| 517 | ldmia r3!,{r4-r8} | ||
| 518 | /* Data TLB lockdown registers */ | ||
| 519 | MCR p15, 0, r4, c10, c0, 0 | ||
| 520 | /* Instruction TLB lockdown registers */ | ||
| 521 | MCR p15, 0, r5, c10, c0, 1 | ||
| 522 | /* Secure or Nonsecure Vector Base Address */ | ||
| 523 | MCR p15, 0, r6, c12, c0, 0 | ||
| 524 | /* FCSE PID */ | ||
| 525 | MCR p15, 0, r7, c13, c0, 0 | ||
| 526 | /* Context PID */ | ||
| 527 | MCR p15, 0, r8, c13, c0, 1 | ||
| 528 | |||
| 529 | ldmia r3!,{r4-r5} | ||
| 530 | /* Primary memory remap register */ | ||
| 531 | MCR p15, 0, r4, c10, c2, 0 | ||
| 532 | /* Normal memory remap register */ | ||
| 533 | MCR p15, 0, r5, c10, c2, 1 | ||
| 534 | |||
| 535 | /* Restore cpsr */ | ||
| 536 | ldmia r3!,{r4} @ load CPSR from SDRAM | ||
| 537 | msr cpsr, r4 @ store cpsr | ||
| 538 | 505 | ||
| 539 | /* Enabling MMU here */ | 506 | /* Enabling MMU here */ |
| 540 | mrc p15, 0, r7, c2, c0, 2 @ Read TTBRControl | 507 | mrc p15, 0, r7, c2, c0, 2 @ Read TTBRControl |
| @@ -592,12 +559,17 @@ usettbr0: | |||
| 592 | ldr r2, cache_pred_disable_mask | 559 | ldr r2, cache_pred_disable_mask |
| 593 | and r4, r2 | 560 | and r4, r2 |
| 594 | mcr p15, 0, r4, c1, c0, 0 | 561 | mcr p15, 0, r4, c1, c0, 0 |
| 562 | dsb | ||
| 563 | isb | ||
| 564 | ldr r0, =restoremmu_on | ||
| 565 | bx r0 | ||
| 595 | 566 | ||
| 596 | /* | 567 | /* |
| 597 | * ============================== | 568 | * ============================== |
| 598 | * == Exit point from OFF mode == | 569 | * == Exit point from OFF mode == |
| 599 | * ============================== | 570 | * ============================== |
| 600 | */ | 571 | */ |
| 572 | restoremmu_on: | ||
| 601 | ldmfd sp!, {r0-r12, pc} @ restore regs and return | 573 | ldmfd sp!, {r0-r12, pc} @ restore regs and return |
| 602 | 574 | ||
| 603 | 575 | ||
| @@ -607,6 +579,7 @@ usettbr0: | |||
| 607 | 579 | ||
| 608 | /* This function implements the erratum ID i443 WA, applies to 34xx >= ES3.0 */ | 580 | /* This function implements the erratum ID i443 WA, applies to 34xx >= ES3.0 */ |
| 609 | .text | 581 | .text |
| 582 | .align 3 | ||
| 610 | ENTRY(es3_sdrc_fix) | 583 | ENTRY(es3_sdrc_fix) |
| 611 | ldr r4, sdrc_syscfg @ get config addr | 584 | ldr r4, sdrc_syscfg @ get config addr |
| 612 | ldr r5, [r4] @ get value | 585 | ldr r5, [r4] @ get value |
| @@ -634,6 +607,7 @@ ENTRY(es3_sdrc_fix) | |||
| 634 | str r5, [r4] @ kick off refreshes | 607 | str r5, [r4] @ kick off refreshes |
| 635 | bx lr | 608 | bx lr |
| 636 | 609 | ||
| 610 | .align | ||
| 637 | sdrc_syscfg: | 611 | sdrc_syscfg: |
| 638 | .word SDRC_SYSCONFIG_P | 612 | .word SDRC_SYSCONFIG_P |
| 639 | sdrc_mr_0: | 613 | sdrc_mr_0: |
| @@ -648,6 +622,7 @@ sdrc_emr2_1: | |||
| 648 | .word SDRC_EMR2_1_P | 622 | .word SDRC_EMR2_1_P |
| 649 | sdrc_manual_1: | 623 | sdrc_manual_1: |
| 650 | .word SDRC_MANUAL_1_P | 624 | .word SDRC_MANUAL_1_P |
| 625 | ENDPROC(es3_sdrc_fix) | ||
| 651 | ENTRY(es3_sdrc_fix_sz) | 626 | ENTRY(es3_sdrc_fix_sz) |
| 652 | .word . - es3_sdrc_fix | 627 | .word . - es3_sdrc_fix |
| 653 | 628 | ||
| @@ -682,6 +657,12 @@ wait_sdrc_ready: | |||
| 682 | bic r5, r5, #0x40 | 657 | bic r5, r5, #0x40 |
| 683 | str r5, [r4] | 658 | str r5, [r4] |
| 684 | 659 | ||
| 660 | /* | ||
| 661 | * PC-relative stores lead to undefined behaviour in Thumb-2: use a r7 as a | ||
| 662 | * base instead. | ||
| 663 | * Be careful not to clobber r7 when maintaing this code. | ||
| 664 | */ | ||
| 665 | |||
| 685 | is_dll_in_lock_mode: | 666 | is_dll_in_lock_mode: |
| 686 | /* Is dll in lock mode? */ | 667 | /* Is dll in lock mode? */ |
| 687 | ldr r4, sdrc_dlla_ctrl | 668 | ldr r4, sdrc_dlla_ctrl |
| @@ -689,10 +670,11 @@ is_dll_in_lock_mode: | |||
| 689 | tst r5, #0x4 | 670 | tst r5, #0x4 |
| 690 | bxne lr @ Return if locked | 671 | bxne lr @ Return if locked |
| 691 | /* wait till dll locks */ | 672 | /* wait till dll locks */ |
| 673 | adr r7, kick_counter | ||
| 692 | wait_dll_lock_timed: | 674 | wait_dll_lock_timed: |
| 693 | ldr r4, wait_dll_lock_counter | 675 | ldr r4, wait_dll_lock_counter |
| 694 | add r4, r4, #1 | 676 | add r4, r4, #1 |
| 695 | str r4, wait_dll_lock_counter | 677 | str r4, [r7, #wait_dll_lock_counter - kick_counter] |
| 696 | ldr r4, sdrc_dlla_status | 678 | ldr r4, sdrc_dlla_status |
| 697 | /* Wait 20uS for lock */ | 679 | /* Wait 20uS for lock */ |
| 698 | mov r6, #8 | 680 | mov r6, #8 |
| @@ -718,9 +700,10 @@ kick_dll: | |||
| 718 | dsb | 700 | dsb |
| 719 | ldr r4, kick_counter | 701 | ldr r4, kick_counter |
| 720 | add r4, r4, #1 | 702 | add r4, r4, #1 |
| 721 | str r4, kick_counter | 703 | str r4, [r7] @ kick_counter |
| 722 | b wait_dll_lock_timed | 704 | b wait_dll_lock_timed |
| 723 | 705 | ||
| 706 | .align | ||
| 724 | cm_idlest1_core: | 707 | cm_idlest1_core: |
| 725 | .word CM_IDLEST1_CORE_V | 708 | .word CM_IDLEST1_CORE_V |
| 726 | cm_idlest_ckgen: | 709 | cm_idlest_ckgen: |
| @@ -763,6 +746,7 @@ kick_counter: | |||
| 763 | .word 0 | 746 | .word 0 |
| 764 | wait_dll_lock_counter: | 747 | wait_dll_lock_counter: |
| 765 | .word 0 | 748 | .word 0 |
| 749 | ENDPROC(omap34xx_cpu_suspend) | ||
| 766 | 750 | ||
| 767 | ENTRY(omap34xx_cpu_suspend_sz) | 751 | ENTRY(omap34xx_cpu_suspend_sz) |
| 768 | .word . - omap34xx_cpu_suspend | 752 | .word . - omap34xx_cpu_suspend |
diff --git a/arch/arm/mach-omap2/smartreflex-class3.c b/arch/arm/mach-omap2/smartreflex-class3.c index 60e70552b4c..f438cf4d847 100644 --- a/arch/arm/mach-omap2/smartreflex-class3.c +++ b/arch/arm/mach-omap2/smartreflex-class3.c | |||
| @@ -11,7 +11,7 @@ | |||
| 11 | * published by the Free Software Foundation. | 11 | * published by the Free Software Foundation. |
| 12 | */ | 12 | */ |
| 13 | 13 | ||
| 14 | #include <plat/smartreflex.h> | 14 | #include "smartreflex.h" |
| 15 | 15 | ||
| 16 | static int sr_class3_enable(struct voltagedomain *voltdm) | 16 | static int sr_class3_enable(struct voltagedomain *voltdm) |
| 17 | { | 17 | { |
diff --git a/arch/arm/mach-omap2/smartreflex.c b/arch/arm/mach-omap2/smartreflex.c index 95ac336fe3f..8f674c9442b 100644 --- a/arch/arm/mach-omap2/smartreflex.c +++ b/arch/arm/mach-omap2/smartreflex.c | |||
| @@ -26,9 +26,9 @@ | |||
| 26 | #include <linux/pm_runtime.h> | 26 | #include <linux/pm_runtime.h> |
| 27 | 27 | ||
| 28 | #include <plat/common.h> | 28 | #include <plat/common.h> |
| 29 | #include <plat/smartreflex.h> | ||
| 30 | 29 | ||
| 31 | #include "pm.h" | 30 | #include "pm.h" |
| 31 | #include "smartreflex.h" | ||
| 32 | 32 | ||
| 33 | #define SMARTREFLEX_NAME_LEN 16 | 33 | #define SMARTREFLEX_NAME_LEN 16 |
| 34 | #define NVALUE_NAME_LEN 40 | 34 | #define NVALUE_NAME_LEN 40 |
| @@ -54,6 +54,7 @@ struct omap_sr { | |||
| 54 | struct list_head node; | 54 | struct list_head node; |
| 55 | struct omap_sr_nvalue_table *nvalue_table; | 55 | struct omap_sr_nvalue_table *nvalue_table; |
| 56 | struct voltagedomain *voltdm; | 56 | struct voltagedomain *voltdm; |
| 57 | struct dentry *dbg_dir; | ||
| 57 | }; | 58 | }; |
| 58 | 59 | ||
| 59 | /* sr_list contains all the instances of smartreflex module */ | 60 | /* sr_list contains all the instances of smartreflex module */ |
| @@ -260,9 +261,11 @@ static int sr_late_init(struct omap_sr *sr_info) | |||
| 260 | if (sr_class->class_type == SR_CLASS2 && | 261 | if (sr_class->class_type == SR_CLASS2 && |
| 261 | sr_class->notify_flags && sr_info->irq) { | 262 | sr_class->notify_flags && sr_info->irq) { |
| 262 | 263 | ||
| 263 | name = kzalloc(SMARTREFLEX_NAME_LEN + 1, GFP_KERNEL); | 264 | name = kasprintf(GFP_KERNEL, "sr_%s", sr_info->voltdm->name); |
| 264 | strcpy(name, "sr_"); | 265 | if (name == NULL) { |
| 265 | strcat(name, sr_info->voltdm->name); | 266 | ret = -ENOMEM; |
| 267 | goto error; | ||
| 268 | } | ||
| 266 | ret = request_irq(sr_info->irq, sr_interrupt, | 269 | ret = request_irq(sr_info->irq, sr_interrupt, |
| 267 | 0, name, (void *)sr_info); | 270 | 0, name, (void *)sr_info); |
| 268 | if (ret) | 271 | if (ret) |
| @@ -282,6 +285,7 @@ error: | |||
| 282 | dev_err(&sr_info->pdev->dev, "%s: ERROR in registering" | 285 | dev_err(&sr_info->pdev->dev, "%s: ERROR in registering" |
| 283 | "interrupt handler. Smartreflex will" | 286 | "interrupt handler. Smartreflex will" |
| 284 | "not function as desired\n", __func__); | 287 | "not function as desired\n", __func__); |
| 288 | kfree(name); | ||
| 285 | kfree(sr_info); | 289 | kfree(sr_info); |
| 286 | return ret; | 290 | return ret; |
| 287 | } | 291 | } |
| @@ -820,7 +824,7 @@ static int __init omap_sr_probe(struct platform_device *pdev) | |||
| 820 | struct omap_sr *sr_info = kzalloc(sizeof(struct omap_sr), GFP_KERNEL); | 824 | struct omap_sr *sr_info = kzalloc(sizeof(struct omap_sr), GFP_KERNEL); |
| 821 | struct omap_sr_data *pdata = pdev->dev.platform_data; | 825 | struct omap_sr_data *pdata = pdev->dev.platform_data; |
| 822 | struct resource *mem, *irq; | 826 | struct resource *mem, *irq; |
| 823 | struct dentry *vdd_dbg_dir, *dbg_dir, *nvalue_dir; | 827 | struct dentry *vdd_dbg_dir, *nvalue_dir; |
| 824 | struct omap_volt_data *volt_data; | 828 | struct omap_volt_data *volt_data; |
| 825 | int i, ret = 0; | 829 | int i, ret = 0; |
| 826 | 830 | ||
| @@ -879,7 +883,7 @@ static int __init omap_sr_probe(struct platform_device *pdev) | |||
| 879 | ret = sr_late_init(sr_info); | 883 | ret = sr_late_init(sr_info); |
| 880 | if (ret) { | 884 | if (ret) { |
| 881 | pr_warning("%s: Error in SR late init\n", __func__); | 885 | pr_warning("%s: Error in SR late init\n", __func__); |
| 882 | return ret; | 886 | goto err_release_region; |
| 883 | } | 887 | } |
| 884 | } | 888 | } |
| 885 | 889 | ||
| @@ -890,30 +894,34 @@ static int __init omap_sr_probe(struct platform_device *pdev) | |||
| 890 | * not try to create rest of the debugfs entries. | 894 | * not try to create rest of the debugfs entries. |
| 891 | */ | 895 | */ |
| 892 | vdd_dbg_dir = omap_voltage_get_dbgdir(sr_info->voltdm); | 896 | vdd_dbg_dir = omap_voltage_get_dbgdir(sr_info->voltdm); |
| 893 | if (!vdd_dbg_dir) | 897 | if (!vdd_dbg_dir) { |
| 894 | return -EINVAL; | 898 | ret = -EINVAL; |
| 899 | goto err_release_region; | ||
| 900 | } | ||
| 895 | 901 | ||
| 896 | dbg_dir = debugfs_create_dir("smartreflex", vdd_dbg_dir); | 902 | sr_info->dbg_dir = debugfs_create_dir("smartreflex", vdd_dbg_dir); |
| 897 | if (IS_ERR(dbg_dir)) { | 903 | if (IS_ERR(sr_info->dbg_dir)) { |
| 898 | dev_err(&pdev->dev, "%s: Unable to create debugfs directory\n", | 904 | dev_err(&pdev->dev, "%s: Unable to create debugfs directory\n", |
| 899 | __func__); | 905 | __func__); |
| 900 | return PTR_ERR(dbg_dir); | 906 | ret = PTR_ERR(sr_info->dbg_dir); |
| 907 | goto err_release_region; | ||
| 901 | } | 908 | } |
| 902 | 909 | ||
| 903 | (void) debugfs_create_file("autocomp", S_IRUGO | S_IWUSR, dbg_dir, | 910 | (void) debugfs_create_file("autocomp", S_IRUGO | S_IWUSR, |
| 904 | (void *)sr_info, &pm_sr_fops); | 911 | sr_info->dbg_dir, (void *)sr_info, &pm_sr_fops); |
| 905 | (void) debugfs_create_x32("errweight", S_IRUGO, dbg_dir, | 912 | (void) debugfs_create_x32("errweight", S_IRUGO, sr_info->dbg_dir, |
| 906 | &sr_info->err_weight); | 913 | &sr_info->err_weight); |
| 907 | (void) debugfs_create_x32("errmaxlimit", S_IRUGO, dbg_dir, | 914 | (void) debugfs_create_x32("errmaxlimit", S_IRUGO, sr_info->dbg_dir, |
| 908 | &sr_info->err_maxlimit); | 915 | &sr_info->err_maxlimit); |
| 909 | (void) debugfs_create_x32("errminlimit", S_IRUGO, dbg_dir, | 916 | (void) debugfs_create_x32("errminlimit", S_IRUGO, sr_info->dbg_dir, |
| 910 | &sr_info->err_minlimit); | 917 | &sr_info->err_minlimit); |
| 911 | 918 | ||
| 912 | nvalue_dir = debugfs_create_dir("nvalue", dbg_dir); | 919 | nvalue_dir = debugfs_create_dir("nvalue", sr_info->dbg_dir); |
| 913 | if (IS_ERR(nvalue_dir)) { | 920 | if (IS_ERR(nvalue_dir)) { |
| 914 | dev_err(&pdev->dev, "%s: Unable to create debugfs directory" | 921 | dev_err(&pdev->dev, "%s: Unable to create debugfs directory" |
| 915 | "for n-values\n", __func__); | 922 | "for n-values\n", __func__); |
| 916 | return PTR_ERR(nvalue_dir); | 923 | ret = PTR_ERR(nvalue_dir); |
| 924 | goto err_release_region; | ||
| 917 | } | 925 | } |
| 918 | 926 | ||
| 919 | omap_voltage_get_volttable(sr_info->voltdm, &volt_data); | 927 | omap_voltage_get_volttable(sr_info->voltdm, &volt_data); |
| @@ -922,23 +930,15 @@ static int __init omap_sr_probe(struct platform_device *pdev) | |||
| 922 | " corresponding vdd vdd_%s. Cannot create debugfs" | 930 | " corresponding vdd vdd_%s. Cannot create debugfs" |
| 923 | "entries for n-values\n", | 931 | "entries for n-values\n", |
| 924 | __func__, sr_info->voltdm->name); | 932 | __func__, sr_info->voltdm->name); |
| 925 | return -ENODATA; | 933 | ret = -ENODATA; |
| 934 | goto err_release_region; | ||
| 926 | } | 935 | } |
| 927 | 936 | ||
| 928 | for (i = 0; i < sr_info->nvalue_count; i++) { | 937 | for (i = 0; i < sr_info->nvalue_count; i++) { |
| 929 | char *name; | 938 | char name[NVALUE_NAME_LEN + 1]; |
| 930 | char volt_name[32]; | ||
| 931 | |||
| 932 | name = kzalloc(NVALUE_NAME_LEN + 1, GFP_KERNEL); | ||
| 933 | if (!name) { | ||
| 934 | dev_err(&pdev->dev, "%s: Unable to allocate memory" | ||
| 935 | " for n-value directory name\n", __func__); | ||
| 936 | return -ENOMEM; | ||
| 937 | } | ||
| 938 | 939 | ||
| 939 | strcpy(name, "volt_"); | 940 | snprintf(name, sizeof(name), "volt_%d", |
| 940 | sprintf(volt_name, "%d", volt_data[i].volt_nominal); | 941 | volt_data[i].volt_nominal); |
| 941 | strcat(name, volt_name); | ||
| 942 | (void) debugfs_create_x32(name, S_IRUGO | S_IWUSR, nvalue_dir, | 942 | (void) debugfs_create_x32(name, S_IRUGO | S_IWUSR, nvalue_dir, |
| 943 | &(sr_info->nvalue_table[i].nvalue)); | 943 | &(sr_info->nvalue_table[i].nvalue)); |
| 944 | } | 944 | } |
| @@ -973,6 +973,8 @@ static int __devexit omap_sr_remove(struct platform_device *pdev) | |||
| 973 | 973 | ||
| 974 | if (sr_info->autocomp_active) | 974 | if (sr_info->autocomp_active) |
| 975 | sr_stop_vddautocomp(sr_info); | 975 | sr_stop_vddautocomp(sr_info); |
| 976 | if (sr_info->dbg_dir) | ||
| 977 | debugfs_remove_recursive(sr_info->dbg_dir); | ||
| 976 | 978 | ||
| 977 | list_del(&sr_info->node); | 979 | list_del(&sr_info->node); |
| 978 | iounmap(sr_info->base); | 980 | iounmap(sr_info->base); |
diff --git a/arch/arm/plat-omap/include/plat/smartreflex.h b/arch/arm/mach-omap2/smartreflex.h index 6568c885f37..5f35b9e2555 100644 --- a/arch/arm/plat-omap/include/plat/smartreflex.h +++ b/arch/arm/mach-omap2/smartreflex.h | |||
| @@ -21,7 +21,8 @@ | |||
| 21 | #define __ASM_ARM_OMAP_SMARTREFLEX_H | 21 | #define __ASM_ARM_OMAP_SMARTREFLEX_H |
| 22 | 22 | ||
| 23 | #include <linux/platform_device.h> | 23 | #include <linux/platform_device.h> |
| 24 | #include <plat/voltage.h> | 24 | |
| 25 | #include "voltage.h" | ||
| 25 | 26 | ||
| 26 | /* | 27 | /* |
| 27 | * Different Smartreflex IPs version. The v1 is the 65nm version used in | 28 | * Different Smartreflex IPs version. The v1 is the 65nm version used in |
diff --git a/arch/arm/mach-omap2/sr_device.c b/arch/arm/mach-omap2/sr_device.c index b1e0af18a26..10d3c5ee801 100644 --- a/arch/arm/mach-omap2/sr_device.c +++ b/arch/arm/mach-omap2/sr_device.c | |||
| @@ -23,9 +23,9 @@ | |||
| 23 | #include <linux/io.h> | 23 | #include <linux/io.h> |
| 24 | 24 | ||
| 25 | #include <plat/omap_device.h> | 25 | #include <plat/omap_device.h> |
| 26 | #include <plat/smartreflex.h> | ||
| 27 | #include <plat/voltage.h> | ||
| 28 | 26 | ||
| 27 | #include "smartreflex.h" | ||
| 28 | #include "voltage.h" | ||
| 29 | #include "control.h" | 29 | #include "control.h" |
| 30 | #include "pm.h" | 30 | #include "pm.h" |
| 31 | 31 | ||
diff --git a/arch/arm/mach-omap2/sram34xx.S b/arch/arm/mach-omap2/sram34xx.S index 7f893a29d50..1078bfbc25c 100644 --- a/arch/arm/mach-omap2/sram34xx.S +++ b/arch/arm/mach-omap2/sram34xx.S | |||
| @@ -34,6 +34,12 @@ | |||
| 34 | #include "sdrc.h" | 34 | #include "sdrc.h" |
| 35 | #include "cm2xxx_3xxx.h" | 35 | #include "cm2xxx_3xxx.h" |
| 36 | 36 | ||
| 37 | /* | ||
| 38 | * This file needs be built unconditionally as ARM to interoperate correctly | ||
| 39 | * with non-Thumb-2-capable firmware. | ||
| 40 | */ | ||
| 41 | .arm | ||
| 42 | |||
| 37 | .text | 43 | .text |
| 38 | 44 | ||
| 39 | /* r1 parameters */ | 45 | /* r1 parameters */ |
| @@ -116,24 +122,36 @@ ENTRY(omap3_sram_configure_core_dpll) | |||
| 116 | 122 | ||
| 117 | @ pull the extra args off the stack | 123 | @ pull the extra args off the stack |
| 118 | @ and store them in SRAM | 124 | @ and store them in SRAM |
| 125 | |||
| 126 | /* | ||
| 127 | * PC-relative stores are deprecated in ARMv7 and lead to undefined behaviour | ||
| 128 | * in Thumb-2: use a r7 as a base instead. | ||
| 129 | * Be careful not to clobber r7 when maintaing this file. | ||
| 130 | */ | ||
| 131 | THUMB( adr r7, omap3_sram_configure_core_dpll ) | ||
| 132 | .macro strtext Rt:req, label:req | ||
| 133 | ARM( str \Rt, \label ) | ||
| 134 | THUMB( str \Rt, [r7, \label - omap3_sram_configure_core_dpll] ) | ||
| 135 | .endm | ||
| 136 | |||
| 119 | ldr r4, [sp, #52] | 137 | ldr r4, [sp, #52] |
| 120 | str r4, omap_sdrc_rfr_ctrl_0_val | 138 | strtext r4, omap_sdrc_rfr_ctrl_0_val |
| 121 | ldr r4, [sp, #56] | 139 | ldr r4, [sp, #56] |
| 122 | str r4, omap_sdrc_actim_ctrl_a_0_val | 140 | strtext r4, omap_sdrc_actim_ctrl_a_0_val |
| 123 | ldr r4, [sp, #60] | 141 | ldr r4, [sp, #60] |
| 124 | str r4, omap_sdrc_actim_ctrl_b_0_val | 142 | strtext r4, omap_sdrc_actim_ctrl_b_0_val |
| 125 | ldr r4, [sp, #64] | 143 | ldr r4, [sp, #64] |
| 126 | str r4, omap_sdrc_mr_0_val | 144 | strtext r4, omap_sdrc_mr_0_val |
| 127 | ldr r4, [sp, #68] | 145 | ldr r4, [sp, #68] |
| 128 | str r4, omap_sdrc_rfr_ctrl_1_val | 146 | strtext r4, omap_sdrc_rfr_ctrl_1_val |
| 129 | cmp r4, #0 @ if SDRC_RFR_CTRL_1 is 0, | 147 | cmp r4, #0 @ if SDRC_RFR_CTRL_1 is 0, |
| 130 | beq skip_cs1_params @ do not use cs1 params | 148 | beq skip_cs1_params @ do not use cs1 params |
| 131 | ldr r4, [sp, #72] | 149 | ldr r4, [sp, #72] |
| 132 | str r4, omap_sdrc_actim_ctrl_a_1_val | 150 | strtext r4, omap_sdrc_actim_ctrl_a_1_val |
| 133 | ldr r4, [sp, #76] | 151 | ldr r4, [sp, #76] |
| 134 | str r4, omap_sdrc_actim_ctrl_b_1_val | 152 | strtext r4, omap_sdrc_actim_ctrl_b_1_val |
| 135 | ldr r4, [sp, #80] | 153 | ldr r4, [sp, #80] |
| 136 | str r4, omap_sdrc_mr_1_val | 154 | strtext r4, omap_sdrc_mr_1_val |
| 137 | skip_cs1_params: | 155 | skip_cs1_params: |
| 138 | mrc p15, 0, r8, c1, c0, 0 @ read ctrl register | 156 | mrc p15, 0, r8, c1, c0, 0 @ read ctrl register |
| 139 | bic r10, r8, #0x800 @ clear Z-bit, disable branch prediction | 157 | bic r10, r8, #0x800 @ clear Z-bit, disable branch prediction |
| @@ -271,6 +289,7 @@ skip_cs1_prog: | |||
| 271 | ldr r12, [r11] @ posted-write barrier for SDRC | 289 | ldr r12, [r11] @ posted-write barrier for SDRC |
| 272 | bx lr | 290 | bx lr |
| 273 | 291 | ||
| 292 | .align | ||
| 274 | omap3_sdrc_power: | 293 | omap3_sdrc_power: |
| 275 | .word OMAP34XX_SDRC_REGADDR(SDRC_POWER) | 294 | .word OMAP34XX_SDRC_REGADDR(SDRC_POWER) |
| 276 | omap3_cm_clksel1_pll: | 295 | omap3_cm_clksel1_pll: |
| @@ -319,6 +338,7 @@ omap3_sdrc_dlla_ctrl: | |||
| 319 | .word OMAP34XX_SDRC_REGADDR(SDRC_DLLA_CTRL) | 338 | .word OMAP34XX_SDRC_REGADDR(SDRC_DLLA_CTRL) |
| 320 | core_m2_mask_val: | 339 | core_m2_mask_val: |
| 321 | .word 0x07FFFFFF | 340 | .word 0x07FFFFFF |
| 341 | ENDPROC(omap3_sram_configure_core_dpll) | ||
| 322 | 342 | ||
| 323 | ENTRY(omap3_sram_configure_core_dpll_sz) | 343 | ENTRY(omap3_sram_configure_core_dpll_sz) |
| 324 | .word . - omap3_sram_configure_core_dpll | 344 | .word . - omap3_sram_configure_core_dpll |
diff --git a/arch/arm/mach-omap2/vc.h b/arch/arm/mach-omap2/vc.h new file mode 100644 index 00000000000..e7767771de4 --- /dev/null +++ b/arch/arm/mach-omap2/vc.h | |||
| @@ -0,0 +1,83 @@ | |||
| 1 | /* | ||
| 2 | * OMAP3/4 Voltage Controller (VC) structure and macro definitions | ||
| 3 | * | ||
| 4 | * Copyright (C) 2007, 2010 Texas Instruments, Inc. | ||
| 5 | * Rajendra Nayak <rnayak@ti.com> | ||
| 6 | * Lesly A M <x0080970@ti.com> | ||
| 7 | * Thara Gopinath <thara@ti.com> | ||
| 8 | * | ||
| 9 | * Copyright (C) 2008, 2011 Nokia Corporation | ||
| 10 | * Kalle Jokiniemi | ||
| 11 | * Paul Walmsley | ||
| 12 | * | ||
| 13 | * This program is free software; you can redistribute it and/or | ||
| 14 | * modify it under the terms of the GNU General Public License version | ||
| 15 | * 2 as published by the Free Software Foundation. | ||
| 16 | */ | ||
| 17 | #ifndef __ARCH_ARM_MACH_OMAP2_VC_H | ||
| 18 | #define __ARCH_ARM_MACH_OMAP2_VC_H | ||
| 19 | |||
| 20 | #include <linux/kernel.h> | ||
| 21 | |||
| 22 | /** | ||
| 23 | * struct omap_vc_common_data - per-VC register/bitfield data | ||
| 24 | * @cmd_on_mask: ON bitmask in PRM_VC_CMD_VAL* register | ||
| 25 | * @valid: VALID bitmask in PRM_VC_BYPASS_VAL register | ||
| 26 | * @smps_sa_reg: Offset of PRM_VC_SMPS_SA reg from PRM start | ||
| 27 | * @smps_volra_reg: Offset of PRM_VC_SMPS_VOL_RA reg from PRM start | ||
| 28 | * @bypass_val_reg: Offset of PRM_VC_BYPASS_VAL reg from PRM start | ||
| 29 | * @data_shift: DATA field shift in PRM_VC_BYPASS_VAL register | ||
| 30 | * @slaveaddr_shift: SLAVEADDR field shift in PRM_VC_BYPASS_VAL register | ||
| 31 | * @regaddr_shift: REGADDR field shift in PRM_VC_BYPASS_VAL register | ||
| 32 | * @cmd_on_shift: ON field shift in PRM_VC_CMD_VAL_* register | ||
| 33 | * @cmd_onlp_shift: ONLP field shift in PRM_VC_CMD_VAL_* register | ||
| 34 | * @cmd_ret_shift: RET field shift in PRM_VC_CMD_VAL_* register | ||
| 35 | * @cmd_off_shift: OFF field shift in PRM_VC_CMD_VAL_* register | ||
| 36 | * | ||
| 37 | * XXX One of cmd_on_mask and cmd_on_shift are not needed | ||
| 38 | * XXX VALID should probably be a shift, not a mask | ||
| 39 | */ | ||
| 40 | struct omap_vc_common_data { | ||
| 41 | u32 cmd_on_mask; | ||
| 42 | u32 valid; | ||
| 43 | u8 smps_sa_reg; | ||
| 44 | u8 smps_volra_reg; | ||
| 45 | u8 bypass_val_reg; | ||
| 46 | u8 data_shift; | ||
| 47 | u8 slaveaddr_shift; | ||
| 48 | u8 regaddr_shift; | ||
| 49 | u8 cmd_on_shift; | ||
| 50 | u8 cmd_onlp_shift; | ||
| 51 | u8 cmd_ret_shift; | ||
| 52 | u8 cmd_off_shift; | ||
| 53 | }; | ||
| 54 | |||
| 55 | /** | ||
| 56 | * struct omap_vc_instance_data - VC per-instance data | ||
| 57 | * @vc_common: pointer to VC common data for this platform | ||
| 58 | * @smps_sa_mask: SA* bitmask in the PRM_VC_SMPS_SA register | ||
| 59 | * @smps_volra_mask: VOLRA* bitmask in the PRM_VC_VOL_RA register | ||
| 60 | * @smps_sa_shift: SA* field shift in the PRM_VC_SMPS_SA register | ||
| 61 | * @smps_volra_shift: VOLRA* field shift in the PRM_VC_VOL_RA register | ||
| 62 | * | ||
| 63 | * XXX It is not necessary to have both a *_mask and a *_shift - | ||
| 64 | * remove one | ||
| 65 | */ | ||
| 66 | struct omap_vc_instance_data { | ||
| 67 | const struct omap_vc_common_data *vc_common; | ||
| 68 | u32 smps_sa_mask; | ||
| 69 | u32 smps_volra_mask; | ||
| 70 | u8 cmdval_reg; | ||
| 71 | u8 smps_sa_shift; | ||
| 72 | u8 smps_volra_shift; | ||
| 73 | }; | ||
| 74 | |||
| 75 | extern struct omap_vc_instance_data omap3_vc1_data; | ||
| 76 | extern struct omap_vc_instance_data omap3_vc2_data; | ||
| 77 | |||
| 78 | extern struct omap_vc_instance_data omap4_vc_mpu_data; | ||
| 79 | extern struct omap_vc_instance_data omap4_vc_iva_data; | ||
| 80 | extern struct omap_vc_instance_data omap4_vc_core_data; | ||
| 81 | |||
| 82 | #endif | ||
| 83 | |||
diff --git a/arch/arm/mach-omap2/vc3xxx_data.c b/arch/arm/mach-omap2/vc3xxx_data.c new file mode 100644 index 00000000000..f37dc4bc379 --- /dev/null +++ b/arch/arm/mach-omap2/vc3xxx_data.c | |||
| @@ -0,0 +1,63 @@ | |||
| 1 | /* | ||
| 2 | * OMAP3 Voltage Controller (VC) data | ||
| 3 | * | ||
| 4 | * Copyright (C) 2007, 2010 Texas Instruments, Inc. | ||
| 5 | * Rajendra Nayak <rnayak@ti.com> | ||
| 6 | * Lesly A M <x0080970@ti.com> | ||
| 7 | * Thara Gopinath <thara@ti.com> | ||
| 8 | * | ||
| 9 | * Copyright (C) 2008, 2011 Nokia Corporation | ||
| 10 | * Kalle Jokiniemi | ||
| 11 | * Paul Walmsley | ||
| 12 | * | ||
| 13 | * This program is free software; you can redistribute it and/or modify | ||
| 14 | * it under the terms of the GNU General Public License version 2 as | ||
| 15 | * published by the Free Software Foundation. | ||
| 16 | */ | ||
| 17 | #include <linux/io.h> | ||
| 18 | #include <linux/err.h> | ||
| 19 | #include <linux/init.h> | ||
| 20 | |||
| 21 | #include <plat/common.h> | ||
| 22 | |||
| 23 | #include "prm-regbits-34xx.h" | ||
| 24 | #include "voltage.h" | ||
| 25 | |||
| 26 | #include "vc.h" | ||
| 27 | |||
| 28 | /* | ||
| 29 | * VC data common to 34xx/36xx chips | ||
| 30 | * XXX This stuff presumably belongs in the vc3xxx.c or vc.c file. | ||
| 31 | */ | ||
| 32 | static struct omap_vc_common_data omap3_vc_common = { | ||
| 33 | .smps_sa_reg = OMAP3_PRM_VC_SMPS_SA_OFFSET, | ||
| 34 | .smps_volra_reg = OMAP3_PRM_VC_SMPS_VOL_RA_OFFSET, | ||
| 35 | .bypass_val_reg = OMAP3_PRM_VC_BYPASS_VAL_OFFSET, | ||
| 36 | .data_shift = OMAP3430_DATA_SHIFT, | ||
| 37 | .slaveaddr_shift = OMAP3430_SLAVEADDR_SHIFT, | ||
| 38 | .regaddr_shift = OMAP3430_REGADDR_SHIFT, | ||
| 39 | .valid = OMAP3430_VALID_MASK, | ||
| 40 | .cmd_on_shift = OMAP3430_VC_CMD_ON_SHIFT, | ||
| 41 | .cmd_on_mask = OMAP3430_VC_CMD_ON_MASK, | ||
| 42 | .cmd_onlp_shift = OMAP3430_VC_CMD_ONLP_SHIFT, | ||
| 43 | .cmd_ret_shift = OMAP3430_VC_CMD_RET_SHIFT, | ||
| 44 | .cmd_off_shift = OMAP3430_VC_CMD_OFF_SHIFT, | ||
| 45 | }; | ||
| 46 | |||
| 47 | struct omap_vc_instance_data omap3_vc1_data = { | ||
| 48 | .vc_common = &omap3_vc_common, | ||
| 49 | .cmdval_reg = OMAP3_PRM_VC_CMD_VAL_0_OFFSET, | ||
| 50 | .smps_sa_shift = OMAP3430_PRM_VC_SMPS_SA_SA0_SHIFT, | ||
| 51 | .smps_sa_mask = OMAP3430_PRM_VC_SMPS_SA_SA0_MASK, | ||
| 52 | .smps_volra_shift = OMAP3430_VOLRA0_SHIFT, | ||
| 53 | .smps_volra_mask = OMAP3430_VOLRA0_MASK, | ||
| 54 | }; | ||
| 55 | |||
| 56 | struct omap_vc_instance_data omap3_vc2_data = { | ||
| 57 | .vc_common = &omap3_vc_common, | ||
| 58 | .cmdval_reg = OMAP3_PRM_VC_CMD_VAL_1_OFFSET, | ||
| 59 | .smps_sa_shift = OMAP3430_PRM_VC_SMPS_SA_SA1_SHIFT, | ||
| 60 | .smps_sa_mask = OMAP3430_PRM_VC_SMPS_SA_SA1_MASK, | ||
| 61 | .smps_volra_shift = OMAP3430_VOLRA1_SHIFT, | ||
| 62 | .smps_volra_mask = OMAP3430_VOLRA1_MASK, | ||
| 63 | }; | ||
diff --git a/arch/arm/mach-omap2/vc44xx_data.c b/arch/arm/mach-omap2/vc44xx_data.c new file mode 100644 index 00000000000..a98da8ddec5 --- /dev/null +++ b/arch/arm/mach-omap2/vc44xx_data.c | |||
| @@ -0,0 +1,75 @@ | |||
| 1 | /* | ||
| 2 | * OMAP4 Voltage Controller (VC) data | ||
| 3 | * | ||
| 4 | * Copyright (C) 2007, 2010 Texas Instruments, Inc. | ||
| 5 | * Rajendra Nayak <rnayak@ti.com> | ||
| 6 | * Lesly A M <x0080970@ti.com> | ||
| 7 | * Thara Gopinath <thara@ti.com> | ||
| 8 | * | ||
| 9 | * Copyright (C) 2008, 2011 Nokia Corporation | ||
| 10 | * Kalle Jokiniemi | ||
| 11 | * Paul Walmsley | ||
| 12 | * | ||
| 13 | * This program is free software; you can redistribute it and/or modify | ||
| 14 | * it under the terms of the GNU General Public License version 2 as | ||
| 15 | * published by the Free Software Foundation. | ||
| 16 | */ | ||
| 17 | #include <linux/io.h> | ||
| 18 | #include <linux/err.h> | ||
| 19 | #include <linux/init.h> | ||
| 20 | |||
| 21 | #include <plat/common.h> | ||
| 22 | |||
| 23 | #include "prm44xx.h" | ||
| 24 | #include "prm-regbits-44xx.h" | ||
| 25 | #include "voltage.h" | ||
| 26 | |||
| 27 | #include "vc.h" | ||
| 28 | |||
| 29 | /* | ||
| 30 | * VC data common to 44xx chips | ||
| 31 | * XXX This stuff presumably belongs in the vc3xxx.c or vc.c file. | ||
| 32 | */ | ||
| 33 | static const struct omap_vc_common_data omap4_vc_common = { | ||
| 34 | .smps_sa_reg = OMAP4_PRM_VC_SMPS_SA_OFFSET, | ||
| 35 | .smps_volra_reg = OMAP4_PRM_VC_VAL_SMPS_RA_VOL_OFFSET, | ||
| 36 | .bypass_val_reg = OMAP4_PRM_VC_VAL_BYPASS_OFFSET, | ||
| 37 | .data_shift = OMAP4430_DATA_SHIFT, | ||
| 38 | .slaveaddr_shift = OMAP4430_SLAVEADDR_SHIFT, | ||
| 39 | .regaddr_shift = OMAP4430_REGADDR_SHIFT, | ||
| 40 | .valid = OMAP4430_VALID_MASK, | ||
| 41 | .cmd_on_shift = OMAP4430_ON_SHIFT, | ||
| 42 | .cmd_on_mask = OMAP4430_ON_MASK, | ||
| 43 | .cmd_onlp_shift = OMAP4430_ONLP_SHIFT, | ||
| 44 | .cmd_ret_shift = OMAP4430_RET_SHIFT, | ||
| 45 | .cmd_off_shift = OMAP4430_OFF_SHIFT, | ||
| 46 | }; | ||
| 47 | |||
| 48 | /* VC instance data for each controllable voltage line */ | ||
| 49 | struct omap_vc_instance_data omap4_vc_mpu_data = { | ||
| 50 | .vc_common = &omap4_vc_common, | ||
| 51 | .cmdval_reg = OMAP4_PRM_VC_VAL_CMD_VDD_MPU_L_OFFSET, | ||
| 52 | .smps_sa_shift = OMAP4430_SA_VDD_MPU_L_PRM_VC_SMPS_SA_SHIFT, | ||
| 53 | .smps_sa_mask = OMAP4430_SA_VDD_MPU_L_PRM_VC_SMPS_SA_MASK, | ||
| 54 | .smps_volra_shift = OMAP4430_VOLRA_VDD_MPU_L_SHIFT, | ||
| 55 | .smps_volra_mask = OMAP4430_VOLRA_VDD_MPU_L_MASK, | ||
| 56 | }; | ||
| 57 | |||
| 58 | struct omap_vc_instance_data omap4_vc_iva_data = { | ||
| 59 | .vc_common = &omap4_vc_common, | ||
| 60 | .cmdval_reg = OMAP4_PRM_VC_VAL_CMD_VDD_IVA_L_OFFSET, | ||
| 61 | .smps_sa_shift = OMAP4430_SA_VDD_IVA_L_PRM_VC_SMPS_SA_SHIFT, | ||
| 62 | .smps_sa_mask = OMAP4430_SA_VDD_IVA_L_PRM_VC_SMPS_SA_MASK, | ||
| 63 | .smps_volra_shift = OMAP4430_VOLRA_VDD_IVA_L_SHIFT, | ||
| 64 | .smps_volra_mask = OMAP4430_VOLRA_VDD_IVA_L_MASK, | ||
| 65 | }; | ||
| 66 | |||
| 67 | struct omap_vc_instance_data omap4_vc_core_data = { | ||
| 68 | .vc_common = &omap4_vc_common, | ||
| 69 | .cmdval_reg = OMAP4_PRM_VC_VAL_CMD_VDD_CORE_L_OFFSET, | ||
| 70 | .smps_sa_shift = OMAP4430_SA_VDD_CORE_L_0_6_SHIFT, | ||
| 71 | .smps_sa_mask = OMAP4430_SA_VDD_CORE_L_0_6_MASK, | ||
| 72 | .smps_volra_shift = OMAP4430_VOLRA_VDD_CORE_L_SHIFT, | ||
| 73 | .smps_volra_mask = OMAP4430_VOLRA_VDD_CORE_L_MASK, | ||
| 74 | }; | ||
| 75 | |||
diff --git a/arch/arm/mach-omap2/voltage.c b/arch/arm/mach-omap2/voltage.c index 12be525b8df..c6facf7becf 100644 --- a/arch/arm/mach-omap2/voltage.c +++ b/arch/arm/mach-omap2/voltage.c | |||
| @@ -7,8 +7,9 @@ | |||
| 7 | * Rajendra Nayak <rnayak@ti.com> | 7 | * Rajendra Nayak <rnayak@ti.com> |
| 8 | * Lesly A M <x0080970@ti.com> | 8 | * Lesly A M <x0080970@ti.com> |
| 9 | * | 9 | * |
| 10 | * Copyright (C) 2008 Nokia Corporation | 10 | * Copyright (C) 2008, 2011 Nokia Corporation |
| 11 | * Kalle Jokiniemi | 11 | * Kalle Jokiniemi |
| 12 | * Paul Walmsley | ||
| 12 | * | 13 | * |
| 13 | * Copyright (C) 2010 Texas Instruments, Inc. | 14 | * Copyright (C) 2010 Texas Instruments, Inc. |
| 14 | * Thara Gopinath <thara@ti.com> | 15 | * Thara Gopinath <thara@ti.com> |
| @@ -26,7 +27,6 @@ | |||
| 26 | #include <linux/slab.h> | 27 | #include <linux/slab.h> |
| 27 | 28 | ||
| 28 | #include <plat/common.h> | 29 | #include <plat/common.h> |
| 29 | #include <plat/voltage.h> | ||
| 30 | 30 | ||
| 31 | #include "prm-regbits-34xx.h" | 31 | #include "prm-regbits-34xx.h" |
| 32 | #include "prm-regbits-44xx.h" | 32 | #include "prm-regbits-44xx.h" |
| @@ -35,284 +35,30 @@ | |||
| 35 | #include "prminst44xx.h" | 35 | #include "prminst44xx.h" |
| 36 | #include "control.h" | 36 | #include "control.h" |
| 37 | 37 | ||
| 38 | #define VP_IDLE_TIMEOUT 200 | 38 | #include "voltage.h" |
| 39 | #define VP_TRANXDONE_TIMEOUT 300 | 39 | |
| 40 | #include "vc.h" | ||
| 41 | #include "vp.h" | ||
| 42 | |||
| 40 | #define VOLTAGE_DIR_SIZE 16 | 43 | #define VOLTAGE_DIR_SIZE 16 |
| 41 | 44 | ||
| 42 | /* Voltage processor register offsets */ | ||
| 43 | struct vp_reg_offs { | ||
| 44 | u8 vpconfig; | ||
| 45 | u8 vstepmin; | ||
| 46 | u8 vstepmax; | ||
| 47 | u8 vlimitto; | ||
| 48 | u8 vstatus; | ||
| 49 | u8 voltage; | ||
| 50 | }; | ||
| 51 | |||
| 52 | /* Voltage Processor bit field values, shifts and masks */ | ||
| 53 | struct vp_reg_val { | ||
| 54 | /* PRM module */ | ||
| 55 | u16 prm_mod; | ||
| 56 | /* VPx_VPCONFIG */ | ||
| 57 | u32 vpconfig_erroroffset; | ||
| 58 | u16 vpconfig_errorgain; | ||
| 59 | u32 vpconfig_errorgain_mask; | ||
| 60 | u8 vpconfig_errorgain_shift; | ||
| 61 | u32 vpconfig_initvoltage_mask; | ||
| 62 | u8 vpconfig_initvoltage_shift; | ||
| 63 | u32 vpconfig_timeouten; | ||
| 64 | u32 vpconfig_initvdd; | ||
| 65 | u32 vpconfig_forceupdate; | ||
| 66 | u32 vpconfig_vpenable; | ||
| 67 | /* VPx_VSTEPMIN */ | ||
| 68 | u8 vstepmin_stepmin; | ||
| 69 | u16 vstepmin_smpswaittimemin; | ||
| 70 | u8 vstepmin_stepmin_shift; | ||
| 71 | u8 vstepmin_smpswaittimemin_shift; | ||
| 72 | /* VPx_VSTEPMAX */ | ||
| 73 | u8 vstepmax_stepmax; | ||
| 74 | u16 vstepmax_smpswaittimemax; | ||
| 75 | u8 vstepmax_stepmax_shift; | ||
| 76 | u8 vstepmax_smpswaittimemax_shift; | ||
| 77 | /* VPx_VLIMITTO */ | ||
| 78 | u8 vlimitto_vddmin; | ||
| 79 | u8 vlimitto_vddmax; | ||
| 80 | u16 vlimitto_timeout; | ||
| 81 | u8 vlimitto_vddmin_shift; | ||
| 82 | u8 vlimitto_vddmax_shift; | ||
| 83 | u8 vlimitto_timeout_shift; | ||
| 84 | /* PRM_IRQSTATUS*/ | ||
| 85 | u32 tranxdone_status; | ||
| 86 | }; | ||
| 87 | |||
| 88 | /* Voltage controller registers and offsets */ | ||
| 89 | struct vc_reg_info { | ||
| 90 | /* PRM module */ | ||
| 91 | u16 prm_mod; | ||
| 92 | /* VC register offsets */ | ||
| 93 | u8 smps_sa_reg; | ||
| 94 | u8 smps_volra_reg; | ||
| 95 | u8 bypass_val_reg; | ||
| 96 | u8 cmdval_reg; | ||
| 97 | u8 voltsetup_reg; | ||
| 98 | /*VC_SMPS_SA*/ | ||
| 99 | u8 smps_sa_shift; | ||
| 100 | u32 smps_sa_mask; | ||
| 101 | /* VC_SMPS_VOL_RA */ | ||
| 102 | u8 smps_volra_shift; | ||
| 103 | u32 smps_volra_mask; | ||
| 104 | /* VC_BYPASS_VAL */ | ||
| 105 | u8 data_shift; | ||
| 106 | u8 slaveaddr_shift; | ||
| 107 | u8 regaddr_shift; | ||
| 108 | u32 valid; | ||
| 109 | /* VC_CMD_VAL */ | ||
| 110 | u8 cmd_on_shift; | ||
| 111 | u8 cmd_onlp_shift; | ||
| 112 | u8 cmd_ret_shift; | ||
| 113 | u8 cmd_off_shift; | ||
| 114 | u32 cmd_on_mask; | ||
| 115 | /* PRM_VOLTSETUP */ | ||
| 116 | u8 voltsetup_shift; | ||
| 117 | u32 voltsetup_mask; | ||
| 118 | }; | ||
| 119 | 45 | ||
| 120 | /** | 46 | static struct omap_vdd_info **vdd_info; |
| 121 | * omap_vdd_info - Per Voltage Domain info | 47 | |
| 122 | * | ||
| 123 | * @volt_data : voltage table having the distinct voltages supported | ||
| 124 | * by the domain and other associated per voltage data. | ||
| 125 | * @pmic_info : pmic specific parameters which should be populted by | ||
| 126 | * the pmic drivers. | ||
| 127 | * @vp_offs : structure containing the offsets for various | ||
| 128 | * vp registers | ||
| 129 | * @vp_reg : the register values, shifts, masks for various | ||
| 130 | * vp registers | ||
| 131 | * @vc_reg : structure containing various various vc registers, | ||
| 132 | * shifts, masks etc. | ||
| 133 | * @voltdm : pointer to the voltage domain structure | ||
| 134 | * @debug_dir : debug directory for this voltage domain. | ||
| 135 | * @curr_volt : current voltage for this vdd. | ||
| 136 | * @ocp_mod : The prm module for accessing the prm irqstatus reg. | ||
| 137 | * @prm_irqst_reg : prm irqstatus register. | ||
| 138 | * @vp_enabled : flag to keep track of whether vp is enabled or not | ||
| 139 | * @volt_scale : API to scale the voltage of the vdd. | ||
| 140 | */ | ||
| 141 | struct omap_vdd_info { | ||
| 142 | struct omap_volt_data *volt_data; | ||
| 143 | struct omap_volt_pmic_info *pmic_info; | ||
| 144 | struct vp_reg_offs vp_offs; | ||
| 145 | struct vp_reg_val vp_reg; | ||
| 146 | struct vc_reg_info vc_reg; | ||
| 147 | struct voltagedomain voltdm; | ||
| 148 | struct dentry *debug_dir; | ||
| 149 | u32 curr_volt; | ||
| 150 | u16 ocp_mod; | ||
| 151 | u8 prm_irqst_reg; | ||
| 152 | bool vp_enabled; | ||
| 153 | u32 (*read_reg) (u16 mod, u8 offset); | ||
| 154 | void (*write_reg) (u32 val, u16 mod, u8 offset); | ||
| 155 | int (*volt_scale) (struct omap_vdd_info *vdd, | ||
| 156 | unsigned long target_volt); | ||
| 157 | }; | ||
| 158 | |||
| 159 | static struct omap_vdd_info *vdd_info; | ||
| 160 | /* | 48 | /* |
| 161 | * Number of scalable voltage domains. | 49 | * Number of scalable voltage domains. |
| 162 | */ | 50 | */ |
| 163 | static int nr_scalable_vdd; | 51 | static int nr_scalable_vdd; |
| 164 | 52 | ||
| 165 | /* OMAP3 VDD sturctures */ | 53 | /* XXX document */ |
| 166 | static struct omap_vdd_info omap3_vdd_info[] = { | 54 | static s16 prm_mod_offs; |
| 167 | { | 55 | static s16 prm_irqst_ocp_mod_offs; |
| 168 | .vp_offs = { | ||
| 169 | .vpconfig = OMAP3_PRM_VP1_CONFIG_OFFSET, | ||
| 170 | .vstepmin = OMAP3_PRM_VP1_VSTEPMIN_OFFSET, | ||
| 171 | .vstepmax = OMAP3_PRM_VP1_VSTEPMAX_OFFSET, | ||
| 172 | .vlimitto = OMAP3_PRM_VP1_VLIMITTO_OFFSET, | ||
| 173 | .vstatus = OMAP3_PRM_VP1_STATUS_OFFSET, | ||
| 174 | .voltage = OMAP3_PRM_VP1_VOLTAGE_OFFSET, | ||
| 175 | }, | ||
| 176 | .voltdm = { | ||
| 177 | .name = "mpu", | ||
| 178 | }, | ||
| 179 | }, | ||
| 180 | { | ||
| 181 | .vp_offs = { | ||
| 182 | .vpconfig = OMAP3_PRM_VP2_CONFIG_OFFSET, | ||
| 183 | .vstepmin = OMAP3_PRM_VP2_VSTEPMIN_OFFSET, | ||
| 184 | .vstepmax = OMAP3_PRM_VP2_VSTEPMAX_OFFSET, | ||
| 185 | .vlimitto = OMAP3_PRM_VP2_VLIMITTO_OFFSET, | ||
| 186 | .vstatus = OMAP3_PRM_VP2_STATUS_OFFSET, | ||
| 187 | .voltage = OMAP3_PRM_VP2_VOLTAGE_OFFSET, | ||
| 188 | }, | ||
| 189 | .voltdm = { | ||
| 190 | .name = "core", | ||
| 191 | }, | ||
| 192 | }, | ||
| 193 | }; | ||
| 194 | |||
| 195 | #define OMAP3_NR_SCALABLE_VDD ARRAY_SIZE(omap3_vdd_info) | ||
| 196 | |||
| 197 | /* OMAP4 VDD sturctures */ | ||
| 198 | static struct omap_vdd_info omap4_vdd_info[] = { | ||
| 199 | { | ||
| 200 | .vp_offs = { | ||
| 201 | .vpconfig = OMAP4_PRM_VP_MPU_CONFIG_OFFSET, | ||
| 202 | .vstepmin = OMAP4_PRM_VP_MPU_VSTEPMIN_OFFSET, | ||
| 203 | .vstepmax = OMAP4_PRM_VP_MPU_VSTEPMAX_OFFSET, | ||
| 204 | .vlimitto = OMAP4_PRM_VP_MPU_VLIMITTO_OFFSET, | ||
| 205 | .vstatus = OMAP4_PRM_VP_MPU_STATUS_OFFSET, | ||
| 206 | .voltage = OMAP4_PRM_VP_MPU_VOLTAGE_OFFSET, | ||
| 207 | }, | ||
| 208 | .voltdm = { | ||
| 209 | .name = "mpu", | ||
| 210 | }, | ||
| 211 | }, | ||
| 212 | { | ||
| 213 | .vp_offs = { | ||
| 214 | .vpconfig = OMAP4_PRM_VP_IVA_CONFIG_OFFSET, | ||
| 215 | .vstepmin = OMAP4_PRM_VP_IVA_VSTEPMIN_OFFSET, | ||
| 216 | .vstepmax = OMAP4_PRM_VP_IVA_VSTEPMAX_OFFSET, | ||
| 217 | .vlimitto = OMAP4_PRM_VP_IVA_VLIMITTO_OFFSET, | ||
| 218 | .vstatus = OMAP4_PRM_VP_IVA_STATUS_OFFSET, | ||
| 219 | .voltage = OMAP4_PRM_VP_IVA_VOLTAGE_OFFSET, | ||
| 220 | }, | ||
| 221 | .voltdm = { | ||
| 222 | .name = "iva", | ||
| 223 | }, | ||
| 224 | }, | ||
| 225 | { | ||
| 226 | .vp_offs = { | ||
| 227 | .vpconfig = OMAP4_PRM_VP_CORE_CONFIG_OFFSET, | ||
| 228 | .vstepmin = OMAP4_PRM_VP_CORE_VSTEPMIN_OFFSET, | ||
| 229 | .vstepmax = OMAP4_PRM_VP_CORE_VSTEPMAX_OFFSET, | ||
| 230 | .vlimitto = OMAP4_PRM_VP_CORE_VLIMITTO_OFFSET, | ||
| 231 | .vstatus = OMAP4_PRM_VP_CORE_STATUS_OFFSET, | ||
| 232 | .voltage = OMAP4_PRM_VP_CORE_VOLTAGE_OFFSET, | ||
| 233 | }, | ||
| 234 | .voltdm = { | ||
| 235 | .name = "core", | ||
| 236 | }, | ||
| 237 | }, | ||
| 238 | }; | ||
| 239 | |||
| 240 | #define OMAP4_NR_SCALABLE_VDD ARRAY_SIZE(omap4_vdd_info) | ||
| 241 | |||
| 242 | /* | ||
| 243 | * Structures containing OMAP3430/OMAP3630 voltage supported and various | ||
| 244 | * voltage dependent data for each VDD. | ||
| 245 | */ | ||
| 246 | #define VOLT_DATA_DEFINE(_v_nom, _efuse_offs, _errminlimit, _errgain) \ | ||
| 247 | { \ | ||
| 248 | .volt_nominal = _v_nom, \ | ||
| 249 | .sr_efuse_offs = _efuse_offs, \ | ||
| 250 | .sr_errminlimit = _errminlimit, \ | ||
| 251 | .vp_errgain = _errgain \ | ||
| 252 | } | ||
| 253 | |||
| 254 | /* VDD1 */ | ||
| 255 | static struct omap_volt_data omap34xx_vddmpu_volt_data[] = { | ||
| 256 | VOLT_DATA_DEFINE(OMAP3430_VDD_MPU_OPP1_UV, OMAP343X_CONTROL_FUSE_OPP1_VDD1, 0xf4, 0x0c), | ||
| 257 | VOLT_DATA_DEFINE(OMAP3430_VDD_MPU_OPP2_UV, OMAP343X_CONTROL_FUSE_OPP2_VDD1, 0xf4, 0x0c), | ||
| 258 | VOLT_DATA_DEFINE(OMAP3430_VDD_MPU_OPP3_UV, OMAP343X_CONTROL_FUSE_OPP3_VDD1, 0xf9, 0x18), | ||
| 259 | VOLT_DATA_DEFINE(OMAP3430_VDD_MPU_OPP4_UV, OMAP343X_CONTROL_FUSE_OPP4_VDD1, 0xf9, 0x18), | ||
| 260 | VOLT_DATA_DEFINE(OMAP3430_VDD_MPU_OPP5_UV, OMAP343X_CONTROL_FUSE_OPP5_VDD1, 0xf9, 0x18), | ||
| 261 | VOLT_DATA_DEFINE(0, 0, 0, 0), | ||
| 262 | }; | ||
| 263 | |||
| 264 | static struct omap_volt_data omap36xx_vddmpu_volt_data[] = { | ||
| 265 | VOLT_DATA_DEFINE(OMAP3630_VDD_MPU_OPP50_UV, OMAP3630_CONTROL_FUSE_OPP50_VDD1, 0xf4, 0x0c), | ||
| 266 | VOLT_DATA_DEFINE(OMAP3630_VDD_MPU_OPP100_UV, OMAP3630_CONTROL_FUSE_OPP100_VDD1, 0xf9, 0x16), | ||
| 267 | VOLT_DATA_DEFINE(OMAP3630_VDD_MPU_OPP120_UV, OMAP3630_CONTROL_FUSE_OPP120_VDD1, 0xfa, 0x23), | ||
| 268 | VOLT_DATA_DEFINE(OMAP3630_VDD_MPU_OPP1G_UV, OMAP3630_CONTROL_FUSE_OPP1G_VDD1, 0xfa, 0x27), | ||
| 269 | VOLT_DATA_DEFINE(0, 0, 0, 0), | ||
| 270 | }; | ||
| 271 | |||
| 272 | /* VDD2 */ | ||
| 273 | static struct omap_volt_data omap34xx_vddcore_volt_data[] = { | ||
| 274 | VOLT_DATA_DEFINE(OMAP3430_VDD_CORE_OPP1_UV, OMAP343X_CONTROL_FUSE_OPP1_VDD2, 0xf4, 0x0c), | ||
| 275 | VOLT_DATA_DEFINE(OMAP3430_VDD_CORE_OPP2_UV, OMAP343X_CONTROL_FUSE_OPP2_VDD2, 0xf4, 0x0c), | ||
| 276 | VOLT_DATA_DEFINE(OMAP3430_VDD_CORE_OPP3_UV, OMAP343X_CONTROL_FUSE_OPP3_VDD2, 0xf9, 0x18), | ||
| 277 | VOLT_DATA_DEFINE(0, 0, 0, 0), | ||
| 278 | }; | ||
| 279 | |||
| 280 | static struct omap_volt_data omap36xx_vddcore_volt_data[] = { | ||
| 281 | VOLT_DATA_DEFINE(OMAP3630_VDD_CORE_OPP50_UV, OMAP3630_CONTROL_FUSE_OPP50_VDD2, 0xf4, 0x0c), | ||
| 282 | VOLT_DATA_DEFINE(OMAP3630_VDD_CORE_OPP100_UV, OMAP3630_CONTROL_FUSE_OPP100_VDD2, 0xf9, 0x16), | ||
| 283 | VOLT_DATA_DEFINE(0, 0, 0, 0), | ||
| 284 | }; | ||
| 285 | |||
| 286 | /* | ||
| 287 | * Structures containing OMAP4430 voltage supported and various | ||
| 288 | * voltage dependent data for each VDD. | ||
| 289 | */ | ||
| 290 | static struct omap_volt_data omap44xx_vdd_mpu_volt_data[] = { | ||
| 291 | VOLT_DATA_DEFINE(OMAP4430_VDD_MPU_OPP50_UV, OMAP44XX_CONTROL_FUSE_MPU_OPP50, 0xf4, 0x0c), | ||
| 292 | VOLT_DATA_DEFINE(OMAP4430_VDD_MPU_OPP100_UV, OMAP44XX_CONTROL_FUSE_MPU_OPP100, 0xf9, 0x16), | ||
| 293 | VOLT_DATA_DEFINE(OMAP4430_VDD_MPU_OPPTURBO_UV, OMAP44XX_CONTROL_FUSE_MPU_OPPTURBO, 0xfa, 0x23), | ||
| 294 | VOLT_DATA_DEFINE(OMAP4430_VDD_MPU_OPPNITRO_UV, OMAP44XX_CONTROL_FUSE_MPU_OPPNITRO, 0xfa, 0x27), | ||
| 295 | VOLT_DATA_DEFINE(0, 0, 0, 0), | ||
| 296 | }; | ||
| 297 | |||
| 298 | static struct omap_volt_data omap44xx_vdd_iva_volt_data[] = { | ||
| 299 | VOLT_DATA_DEFINE(OMAP4430_VDD_IVA_OPP50_UV, OMAP44XX_CONTROL_FUSE_IVA_OPP50, 0xf4, 0x0c), | ||
| 300 | VOLT_DATA_DEFINE(OMAP4430_VDD_IVA_OPP100_UV, OMAP44XX_CONTROL_FUSE_IVA_OPP100, 0xf9, 0x16), | ||
| 301 | VOLT_DATA_DEFINE(OMAP4430_VDD_IVA_OPPTURBO_UV, OMAP44XX_CONTROL_FUSE_IVA_OPPTURBO, 0xfa, 0x23), | ||
| 302 | VOLT_DATA_DEFINE(0, 0, 0, 0), | ||
| 303 | }; | ||
| 304 | |||
| 305 | static struct omap_volt_data omap44xx_vdd_core_volt_data[] = { | ||
| 306 | VOLT_DATA_DEFINE(OMAP4430_VDD_CORE_OPP50_UV, OMAP44XX_CONTROL_FUSE_CORE_OPP50, 0xf4, 0x0c), | ||
| 307 | VOLT_DATA_DEFINE(OMAP4430_VDD_CORE_OPP100_UV, OMAP44XX_CONTROL_FUSE_CORE_OPP100, 0xf9, 0x16), | ||
| 308 | VOLT_DATA_DEFINE(0, 0, 0, 0), | ||
| 309 | }; | ||
| 310 | 56 | ||
| 311 | static struct dentry *voltage_dir; | 57 | static struct dentry *voltage_dir; |
| 312 | 58 | ||
| 313 | /* Init function pointers */ | 59 | /* Init function pointers */ |
| 314 | static void (*vc_init) (struct omap_vdd_info *vdd); | 60 | static int vp_forceupdate_scale_voltage(struct omap_vdd_info *vdd, |
| 315 | static int (*vdd_data_configure) (struct omap_vdd_info *vdd); | 61 | unsigned long target_volt); |
| 316 | 62 | ||
| 317 | static u32 omap3_voltage_read_reg(u16 mod, u8 offset) | 63 | static u32 omap3_voltage_read_reg(u16 mod, u8 offset) |
| 318 | { | 64 | { |
| @@ -335,6 +81,62 @@ static void omap4_voltage_write_reg(u32 val, u16 mod, u8 offset) | |||
| 335 | omap4_prminst_write_inst_reg(val, OMAP4430_PRM_PARTITION, mod, offset); | 81 | omap4_prminst_write_inst_reg(val, OMAP4430_PRM_PARTITION, mod, offset); |
| 336 | } | 82 | } |
| 337 | 83 | ||
| 84 | static int __init _config_common_vdd_data(struct omap_vdd_info *vdd) | ||
| 85 | { | ||
| 86 | char *sys_ck_name; | ||
| 87 | struct clk *sys_ck; | ||
| 88 | u32 sys_clk_speed, timeout_val, waittime; | ||
| 89 | |||
| 90 | /* | ||
| 91 | * XXX Clockfw should handle this, or this should be in a | ||
| 92 | * struct record | ||
| 93 | */ | ||
| 94 | if (cpu_is_omap24xx() || cpu_is_omap34xx()) | ||
| 95 | sys_ck_name = "sys_ck"; | ||
| 96 | else if (cpu_is_omap44xx()) | ||
| 97 | sys_ck_name = "sys_clkin_ck"; | ||
| 98 | else | ||
| 99 | return -EINVAL; | ||
| 100 | |||
| 101 | /* | ||
| 102 | * Sys clk rate is require to calculate vp timeout value and | ||
| 103 | * smpswaittimemin and smpswaittimemax. | ||
| 104 | */ | ||
| 105 | sys_ck = clk_get(NULL, sys_ck_name); | ||
| 106 | if (IS_ERR(sys_ck)) { | ||
| 107 | pr_warning("%s: Could not get the sys clk to calculate" | ||
| 108 | "various vdd_%s params\n", __func__, vdd->voltdm.name); | ||
| 109 | return -EINVAL; | ||
| 110 | } | ||
| 111 | sys_clk_speed = clk_get_rate(sys_ck); | ||
| 112 | clk_put(sys_ck); | ||
| 113 | /* Divide to avoid overflow */ | ||
| 114 | sys_clk_speed /= 1000; | ||
| 115 | |||
| 116 | /* Generic voltage parameters */ | ||
| 117 | vdd->curr_volt = 1200000; | ||
| 118 | vdd->volt_scale = vp_forceupdate_scale_voltage; | ||
| 119 | vdd->vp_enabled = false; | ||
| 120 | |||
| 121 | vdd->vp_rt_data.vpconfig_erroroffset = | ||
| 122 | (vdd->pmic_info->vp_erroroffset << | ||
| 123 | vdd->vp_data->vp_common->vpconfig_erroroffset_shift); | ||
| 124 | |||
| 125 | timeout_val = (sys_clk_speed * vdd->pmic_info->vp_timeout_us) / 1000; | ||
| 126 | vdd->vp_rt_data.vlimitto_timeout = timeout_val; | ||
| 127 | vdd->vp_rt_data.vlimitto_vddmin = vdd->pmic_info->vp_vddmin; | ||
| 128 | vdd->vp_rt_data.vlimitto_vddmax = vdd->pmic_info->vp_vddmax; | ||
| 129 | |||
| 130 | waittime = ((vdd->pmic_info->step_size / vdd->pmic_info->slew_rate) * | ||
| 131 | sys_clk_speed) / 1000; | ||
| 132 | vdd->vp_rt_data.vstepmin_smpswaittimemin = waittime; | ||
| 133 | vdd->vp_rt_data.vstepmax_smpswaittimemax = waittime; | ||
| 134 | vdd->vp_rt_data.vstepmin_stepmin = vdd->pmic_info->vp_vstepmin; | ||
| 135 | vdd->vp_rt_data.vstepmax_stepmax = vdd->pmic_info->vp_vstepmax; | ||
| 136 | |||
| 137 | return 0; | ||
| 138 | } | ||
| 139 | |||
| 338 | /* Voltage debugfs support */ | 140 | /* Voltage debugfs support */ |
| 339 | static int vp_volt_debug_get(void *data, u64 *val) | 141 | static int vp_volt_debug_get(void *data, u64 *val) |
| 340 | { | 142 | { |
| @@ -346,7 +148,7 @@ static int vp_volt_debug_get(void *data, u64 *val) | |||
| 346 | return -EINVAL; | 148 | return -EINVAL; |
| 347 | } | 149 | } |
| 348 | 150 | ||
| 349 | vsel = vdd->read_reg(vdd->vp_reg.prm_mod, vdd->vp_offs.voltage); | 151 | vsel = vdd->read_reg(prm_mod_offs, vdd->vp_data->voltage); |
| 350 | pr_notice("curr_vsel = %x\n", vsel); | 152 | pr_notice("curr_vsel = %x\n", vsel); |
| 351 | 153 | ||
| 352 | if (!vdd->pmic_info->vsel_to_uv) { | 154 | if (!vdd->pmic_info->vsel_to_uv) { |
| @@ -379,7 +181,6 @@ DEFINE_SIMPLE_ATTRIBUTE(nom_volt_debug_fops, nom_volt_debug_get, NULL, | |||
| 379 | static void vp_latch_vsel(struct omap_vdd_info *vdd) | 181 | static void vp_latch_vsel(struct omap_vdd_info *vdd) |
| 380 | { | 182 | { |
| 381 | u32 vpconfig; | 183 | u32 vpconfig; |
| 382 | u16 mod; | ||
| 383 | unsigned long uvdc; | 184 | unsigned long uvdc; |
| 384 | char vsel; | 185 | char vsel; |
| 385 | 186 | ||
| @@ -396,30 +197,27 @@ static void vp_latch_vsel(struct omap_vdd_info *vdd) | |||
| 396 | return; | 197 | return; |
| 397 | } | 198 | } |
| 398 | 199 | ||
| 399 | mod = vdd->vp_reg.prm_mod; | ||
| 400 | |||
| 401 | vsel = vdd->pmic_info->uv_to_vsel(uvdc); | 200 | vsel = vdd->pmic_info->uv_to_vsel(uvdc); |
| 402 | 201 | ||
| 403 | vpconfig = vdd->read_reg(mod, vdd->vp_offs.vpconfig); | 202 | vpconfig = vdd->read_reg(prm_mod_offs, vdd->vp_data->vpconfig); |
| 404 | vpconfig &= ~(vdd->vp_reg.vpconfig_initvoltage_mask | | 203 | vpconfig &= ~(vdd->vp_data->vp_common->vpconfig_initvoltage_mask | |
| 405 | vdd->vp_reg.vpconfig_initvdd); | 204 | vdd->vp_data->vp_common->vpconfig_initvdd); |
| 406 | vpconfig |= vsel << vdd->vp_reg.vpconfig_initvoltage_shift; | 205 | vpconfig |= vsel << vdd->vp_data->vp_common->vpconfig_initvoltage_shift; |
| 407 | 206 | ||
| 408 | vdd->write_reg(vpconfig, mod, vdd->vp_offs.vpconfig); | 207 | vdd->write_reg(vpconfig, prm_mod_offs, vdd->vp_data->vpconfig); |
| 409 | 208 | ||
| 410 | /* Trigger initVDD value copy to voltage processor */ | 209 | /* Trigger initVDD value copy to voltage processor */ |
| 411 | vdd->write_reg((vpconfig | vdd->vp_reg.vpconfig_initvdd), mod, | 210 | vdd->write_reg((vpconfig | vdd->vp_data->vp_common->vpconfig_initvdd), |
| 412 | vdd->vp_offs.vpconfig); | 211 | prm_mod_offs, vdd->vp_data->vpconfig); |
| 413 | 212 | ||
| 414 | /* Clear initVDD copy trigger bit */ | 213 | /* Clear initVDD copy trigger bit */ |
| 415 | vdd->write_reg(vpconfig, mod, vdd->vp_offs.vpconfig); | 214 | vdd->write_reg(vpconfig, prm_mod_offs, vdd->vp_data->vpconfig); |
| 416 | } | 215 | } |
| 417 | 216 | ||
| 418 | /* Generic voltage init functions */ | 217 | /* Generic voltage init functions */ |
| 419 | static void __init vp_init(struct omap_vdd_info *vdd) | 218 | static void __init vp_init(struct omap_vdd_info *vdd) |
| 420 | { | 219 | { |
| 421 | u32 vp_val; | 220 | u32 vp_val; |
| 422 | u16 mod; | ||
| 423 | 221 | ||
| 424 | if (!vdd->read_reg || !vdd->write_reg) { | 222 | if (!vdd->read_reg || !vdd->write_reg) { |
| 425 | pr_err("%s: No read/write API for accessing vdd_%s regs\n", | 223 | pr_err("%s: No read/write API for accessing vdd_%s regs\n", |
| @@ -427,33 +225,31 @@ static void __init vp_init(struct omap_vdd_info *vdd) | |||
| 427 | return; | 225 | return; |
| 428 | } | 226 | } |
| 429 | 227 | ||
| 430 | mod = vdd->vp_reg.prm_mod; | 228 | vp_val = vdd->vp_rt_data.vpconfig_erroroffset | |
| 431 | 229 | (vdd->vp_rt_data.vpconfig_errorgain << | |
| 432 | vp_val = vdd->vp_reg.vpconfig_erroroffset | | 230 | vdd->vp_data->vp_common->vpconfig_errorgain_shift) | |
| 433 | (vdd->vp_reg.vpconfig_errorgain << | 231 | vdd->vp_data->vp_common->vpconfig_timeouten; |
| 434 | vdd->vp_reg.vpconfig_errorgain_shift) | | 232 | vdd->write_reg(vp_val, prm_mod_offs, vdd->vp_data->vpconfig); |
| 435 | vdd->vp_reg.vpconfig_timeouten; | 233 | |
| 436 | vdd->write_reg(vp_val, mod, vdd->vp_offs.vpconfig); | 234 | vp_val = ((vdd->vp_rt_data.vstepmin_smpswaittimemin << |
| 437 | 235 | vdd->vp_data->vp_common->vstepmin_smpswaittimemin_shift) | | |
| 438 | vp_val = ((vdd->vp_reg.vstepmin_smpswaittimemin << | 236 | (vdd->vp_rt_data.vstepmin_stepmin << |
| 439 | vdd->vp_reg.vstepmin_smpswaittimemin_shift) | | 237 | vdd->vp_data->vp_common->vstepmin_stepmin_shift)); |
| 440 | (vdd->vp_reg.vstepmin_stepmin << | 238 | vdd->write_reg(vp_val, prm_mod_offs, vdd->vp_data->vstepmin); |
| 441 | vdd->vp_reg.vstepmin_stepmin_shift)); | 239 | |
| 442 | vdd->write_reg(vp_val, mod, vdd->vp_offs.vstepmin); | 240 | vp_val = ((vdd->vp_rt_data.vstepmax_smpswaittimemax << |
| 443 | 241 | vdd->vp_data->vp_common->vstepmax_smpswaittimemax_shift) | | |
| 444 | vp_val = ((vdd->vp_reg.vstepmax_smpswaittimemax << | 242 | (vdd->vp_rt_data.vstepmax_stepmax << |
| 445 | vdd->vp_reg.vstepmax_smpswaittimemax_shift) | | 243 | vdd->vp_data->vp_common->vstepmax_stepmax_shift)); |
| 446 | (vdd->vp_reg.vstepmax_stepmax << | 244 | vdd->write_reg(vp_val, prm_mod_offs, vdd->vp_data->vstepmax); |
| 447 | vdd->vp_reg.vstepmax_stepmax_shift)); | 245 | |
| 448 | vdd->write_reg(vp_val, mod, vdd->vp_offs.vstepmax); | 246 | vp_val = ((vdd->vp_rt_data.vlimitto_vddmax << |
| 449 | 247 | vdd->vp_data->vp_common->vlimitto_vddmax_shift) | | |
| 450 | vp_val = ((vdd->vp_reg.vlimitto_vddmax << | 248 | (vdd->vp_rt_data.vlimitto_vddmin << |
| 451 | vdd->vp_reg.vlimitto_vddmax_shift) | | 249 | vdd->vp_data->vp_common->vlimitto_vddmin_shift) | |
| 452 | (vdd->vp_reg.vlimitto_vddmin << | 250 | (vdd->vp_rt_data.vlimitto_timeout << |
| 453 | vdd->vp_reg.vlimitto_vddmin_shift) | | 251 | vdd->vp_data->vp_common->vlimitto_timeout_shift)); |
| 454 | (vdd->vp_reg.vlimitto_timeout << | 252 | vdd->write_reg(vp_val, prm_mod_offs, vdd->vp_data->vlimitto); |
| 455 | vdd->vp_reg.vlimitto_timeout_shift)); | ||
| 456 | vdd->write_reg(vp_val, mod, vdd->vp_offs.vlimitto); | ||
| 457 | } | 253 | } |
| 458 | 254 | ||
| 459 | static void __init vdd_debugfs_init(struct omap_vdd_info *vdd) | 255 | static void __init vdd_debugfs_init(struct omap_vdd_info *vdd) |
| @@ -480,23 +276,23 @@ static void __init vdd_debugfs_init(struct omap_vdd_info *vdd) | |||
| 480 | } | 276 | } |
| 481 | 277 | ||
| 482 | (void) debugfs_create_x16("vp_errorgain", S_IRUGO, vdd->debug_dir, | 278 | (void) debugfs_create_x16("vp_errorgain", S_IRUGO, vdd->debug_dir, |
| 483 | &(vdd->vp_reg.vpconfig_errorgain)); | 279 | &(vdd->vp_rt_data.vpconfig_errorgain)); |
| 484 | (void) debugfs_create_x16("vp_smpswaittimemin", S_IRUGO, | 280 | (void) debugfs_create_x16("vp_smpswaittimemin", S_IRUGO, |
| 485 | vdd->debug_dir, | 281 | vdd->debug_dir, |
| 486 | &(vdd->vp_reg.vstepmin_smpswaittimemin)); | 282 | &(vdd->vp_rt_data.vstepmin_smpswaittimemin)); |
| 487 | (void) debugfs_create_x8("vp_stepmin", S_IRUGO, vdd->debug_dir, | 283 | (void) debugfs_create_x8("vp_stepmin", S_IRUGO, vdd->debug_dir, |
| 488 | &(vdd->vp_reg.vstepmin_stepmin)); | 284 | &(vdd->vp_rt_data.vstepmin_stepmin)); |
| 489 | (void) debugfs_create_x16("vp_smpswaittimemax", S_IRUGO, | 285 | (void) debugfs_create_x16("vp_smpswaittimemax", S_IRUGO, |
| 490 | vdd->debug_dir, | 286 | vdd->debug_dir, |
| 491 | &(vdd->vp_reg.vstepmax_smpswaittimemax)); | 287 | &(vdd->vp_rt_data.vstepmax_smpswaittimemax)); |
| 492 | (void) debugfs_create_x8("vp_stepmax", S_IRUGO, vdd->debug_dir, | 288 | (void) debugfs_create_x8("vp_stepmax", S_IRUGO, vdd->debug_dir, |
| 493 | &(vdd->vp_reg.vstepmax_stepmax)); | 289 | &(vdd->vp_rt_data.vstepmax_stepmax)); |
| 494 | (void) debugfs_create_x8("vp_vddmax", S_IRUGO, vdd->debug_dir, | 290 | (void) debugfs_create_x8("vp_vddmax", S_IRUGO, vdd->debug_dir, |
| 495 | &(vdd->vp_reg.vlimitto_vddmax)); | 291 | &(vdd->vp_rt_data.vlimitto_vddmax)); |
| 496 | (void) debugfs_create_x8("vp_vddmin", S_IRUGO, vdd->debug_dir, | 292 | (void) debugfs_create_x8("vp_vddmin", S_IRUGO, vdd->debug_dir, |
| 497 | &(vdd->vp_reg.vlimitto_vddmin)); | 293 | &(vdd->vp_rt_data.vlimitto_vddmin)); |
| 498 | (void) debugfs_create_x16("vp_timeout", S_IRUGO, vdd->debug_dir, | 294 | (void) debugfs_create_x16("vp_timeout", S_IRUGO, vdd->debug_dir, |
| 499 | &(vdd->vp_reg.vlimitto_timeout)); | 295 | &(vdd->vp_rt_data.vlimitto_timeout)); |
| 500 | (void) debugfs_create_file("curr_vp_volt", S_IRUGO, vdd->debug_dir, | 296 | (void) debugfs_create_file("curr_vp_volt", S_IRUGO, vdd->debug_dir, |
| 501 | (void *) vdd, &vp_volt_debug_fops); | 297 | (void *) vdd, &vp_volt_debug_fops); |
| 502 | (void) debugfs_create_file("curr_nominal_volt", S_IRUGO, | 298 | (void) debugfs_create_file("curr_nominal_volt", S_IRUGO, |
| @@ -509,8 +305,12 @@ static int _pre_volt_scale(struct omap_vdd_info *vdd, | |||
| 509 | unsigned long target_volt, u8 *target_vsel, u8 *current_vsel) | 305 | unsigned long target_volt, u8 *target_vsel, u8 *current_vsel) |
| 510 | { | 306 | { |
| 511 | struct omap_volt_data *volt_data; | 307 | struct omap_volt_data *volt_data; |
| 308 | const struct omap_vc_common_data *vc_common; | ||
| 309 | const struct omap_vp_common_data *vp_common; | ||
| 512 | u32 vc_cmdval, vp_errgain_val; | 310 | u32 vc_cmdval, vp_errgain_val; |
| 513 | u16 vp_mod, vc_mod; | 311 | |
| 312 | vc_common = vdd->vc_data->vc_common; | ||
| 313 | vp_common = vdd->vp_data->vp_common; | ||
| 514 | 314 | ||
| 515 | /* Check if suffiecient pmic info is available for this vdd */ | 315 | /* Check if suffiecient pmic info is available for this vdd */ |
| 516 | if (!vdd->pmic_info) { | 316 | if (!vdd->pmic_info) { |
| @@ -532,33 +332,30 @@ static int _pre_volt_scale(struct omap_vdd_info *vdd, | |||
| 532 | return -EINVAL; | 332 | return -EINVAL; |
| 533 | } | 333 | } |
| 534 | 334 | ||
| 535 | vp_mod = vdd->vp_reg.prm_mod; | ||
| 536 | vc_mod = vdd->vc_reg.prm_mod; | ||
| 537 | |||
| 538 | /* Get volt_data corresponding to target_volt */ | 335 | /* Get volt_data corresponding to target_volt */ |
| 539 | volt_data = omap_voltage_get_voltdata(&vdd->voltdm, target_volt); | 336 | volt_data = omap_voltage_get_voltdata(&vdd->voltdm, target_volt); |
| 540 | if (IS_ERR(volt_data)) | 337 | if (IS_ERR(volt_data)) |
| 541 | volt_data = NULL; | 338 | volt_data = NULL; |
| 542 | 339 | ||
| 543 | *target_vsel = vdd->pmic_info->uv_to_vsel(target_volt); | 340 | *target_vsel = vdd->pmic_info->uv_to_vsel(target_volt); |
| 544 | *current_vsel = vdd->read_reg(vp_mod, vdd->vp_offs.voltage); | 341 | *current_vsel = vdd->read_reg(prm_mod_offs, vdd->vp_data->voltage); |
| 545 | 342 | ||
| 546 | /* Setting the ON voltage to the new target voltage */ | 343 | /* Setting the ON voltage to the new target voltage */ |
| 547 | vc_cmdval = vdd->read_reg(vc_mod, vdd->vc_reg.cmdval_reg); | 344 | vc_cmdval = vdd->read_reg(prm_mod_offs, vdd->vc_data->cmdval_reg); |
| 548 | vc_cmdval &= ~vdd->vc_reg.cmd_on_mask; | 345 | vc_cmdval &= ~vc_common->cmd_on_mask; |
| 549 | vc_cmdval |= (*target_vsel << vdd->vc_reg.cmd_on_shift); | 346 | vc_cmdval |= (*target_vsel << vc_common->cmd_on_shift); |
| 550 | vdd->write_reg(vc_cmdval, vc_mod, vdd->vc_reg.cmdval_reg); | 347 | vdd->write_reg(vc_cmdval, prm_mod_offs, vdd->vc_data->cmdval_reg); |
| 551 | 348 | ||
| 552 | /* Setting vp errorgain based on the voltage */ | 349 | /* Setting vp errorgain based on the voltage */ |
| 553 | if (volt_data) { | 350 | if (volt_data) { |
| 554 | vp_errgain_val = vdd->read_reg(vp_mod, | 351 | vp_errgain_val = vdd->read_reg(prm_mod_offs, |
| 555 | vdd->vp_offs.vpconfig); | 352 | vdd->vp_data->vpconfig); |
| 556 | vdd->vp_reg.vpconfig_errorgain = volt_data->vp_errgain; | 353 | vdd->vp_rt_data.vpconfig_errorgain = volt_data->vp_errgain; |
| 557 | vp_errgain_val &= ~vdd->vp_reg.vpconfig_errorgain_mask; | 354 | vp_errgain_val &= ~vp_common->vpconfig_errorgain_mask; |
| 558 | vp_errgain_val |= vdd->vp_reg.vpconfig_errorgain << | 355 | vp_errgain_val |= vdd->vp_rt_data.vpconfig_errorgain << |
| 559 | vdd->vp_reg.vpconfig_errorgain_shift; | 356 | vp_common->vpconfig_errorgain_shift; |
| 560 | vdd->write_reg(vp_errgain_val, vp_mod, | 357 | vdd->write_reg(vp_errgain_val, prm_mod_offs, |
| 561 | vdd->vp_offs.vpconfig); | 358 | vdd->vp_data->vpconfig); |
| 562 | } | 359 | } |
| 563 | 360 | ||
| 564 | return 0; | 361 | return 0; |
| @@ -584,7 +381,6 @@ static int vc_bypass_scale_voltage(struct omap_vdd_info *vdd, | |||
| 584 | { | 381 | { |
| 585 | u32 loop_cnt = 0, retries_cnt = 0; | 382 | u32 loop_cnt = 0, retries_cnt = 0; |
| 586 | u32 vc_valid, vc_bypass_val_reg, vc_bypass_value; | 383 | u32 vc_valid, vc_bypass_val_reg, vc_bypass_value; |
| 587 | u16 mod; | ||
| 588 | u8 target_vsel, current_vsel; | 384 | u8 target_vsel, current_vsel; |
| 589 | int ret; | 385 | int ret; |
| 590 | 386 | ||
| @@ -592,20 +388,19 @@ static int vc_bypass_scale_voltage(struct omap_vdd_info *vdd, | |||
| 592 | if (ret) | 388 | if (ret) |
| 593 | return ret; | 389 | return ret; |
| 594 | 390 | ||
| 595 | mod = vdd->vc_reg.prm_mod; | 391 | vc_valid = vdd->vc_data->vc_common->valid; |
| 596 | 392 | vc_bypass_val_reg = vdd->vc_data->vc_common->bypass_val_reg; | |
| 597 | vc_valid = vdd->vc_reg.valid; | 393 | vc_bypass_value = (target_vsel << vdd->vc_data->vc_common->data_shift) | |
| 598 | vc_bypass_val_reg = vdd->vc_reg.bypass_val_reg; | ||
| 599 | vc_bypass_value = (target_vsel << vdd->vc_reg.data_shift) | | ||
| 600 | (vdd->pmic_info->pmic_reg << | 394 | (vdd->pmic_info->pmic_reg << |
| 601 | vdd->vc_reg.regaddr_shift) | | 395 | vdd->vc_data->vc_common->regaddr_shift) | |
| 602 | (vdd->pmic_info->i2c_slave_addr << | 396 | (vdd->pmic_info->i2c_slave_addr << |
| 603 | vdd->vc_reg.slaveaddr_shift); | 397 | vdd->vc_data->vc_common->slaveaddr_shift); |
| 604 | 398 | ||
| 605 | vdd->write_reg(vc_bypass_value, mod, vc_bypass_val_reg); | 399 | vdd->write_reg(vc_bypass_value, prm_mod_offs, vc_bypass_val_reg); |
| 606 | vdd->write_reg(vc_bypass_value | vc_valid, mod, vc_bypass_val_reg); | 400 | vdd->write_reg(vc_bypass_value | vc_valid, prm_mod_offs, |
| 401 | vc_bypass_val_reg); | ||
| 607 | 402 | ||
| 608 | vc_bypass_value = vdd->read_reg(mod, vc_bypass_val_reg); | 403 | vc_bypass_value = vdd->read_reg(prm_mod_offs, vc_bypass_val_reg); |
| 609 | /* | 404 | /* |
| 610 | * Loop till the bypass command is acknowledged from the SMPS. | 405 | * Loop till the bypass command is acknowledged from the SMPS. |
| 611 | * NOTE: This is legacy code. The loop count and retry count needs | 406 | * NOTE: This is legacy code. The loop count and retry count needs |
| @@ -624,7 +419,8 @@ static int vc_bypass_scale_voltage(struct omap_vdd_info *vdd, | |||
| 624 | loop_cnt = 0; | 419 | loop_cnt = 0; |
| 625 | udelay(10); | 420 | udelay(10); |
| 626 | } | 421 | } |
| 627 | vc_bypass_value = vdd->read_reg(mod, vc_bypass_val_reg); | 422 | vc_bypass_value = vdd->read_reg(prm_mod_offs, |
| 423 | vc_bypass_val_reg); | ||
| 628 | } | 424 | } |
| 629 | 425 | ||
| 630 | _post_volt_scale(vdd, target_volt, target_vsel, current_vsel); | 426 | _post_volt_scale(vdd, target_volt, target_vsel, current_vsel); |
| @@ -636,7 +432,6 @@ static int vp_forceupdate_scale_voltage(struct omap_vdd_info *vdd, | |||
| 636 | unsigned long target_volt) | 432 | unsigned long target_volt) |
| 637 | { | 433 | { |
| 638 | u32 vpconfig; | 434 | u32 vpconfig; |
| 639 | u16 mod, ocp_mod; | ||
| 640 | u8 target_vsel, current_vsel, prm_irqst_reg; | 435 | u8 target_vsel, current_vsel, prm_irqst_reg; |
| 641 | int ret, timeout = 0; | 436 | int ret, timeout = 0; |
| 642 | 437 | ||
| @@ -644,20 +439,18 @@ static int vp_forceupdate_scale_voltage(struct omap_vdd_info *vdd, | |||
| 644 | if (ret) | 439 | if (ret) |
| 645 | return ret; | 440 | return ret; |
| 646 | 441 | ||
| 647 | mod = vdd->vp_reg.prm_mod; | 442 | prm_irqst_reg = vdd->vp_data->prm_irqst_data->prm_irqst_reg; |
| 648 | ocp_mod = vdd->ocp_mod; | ||
| 649 | prm_irqst_reg = vdd->prm_irqst_reg; | ||
| 650 | 443 | ||
| 651 | /* | 444 | /* |
| 652 | * Clear all pending TransactionDone interrupt/status. Typical latency | 445 | * Clear all pending TransactionDone interrupt/status. Typical latency |
| 653 | * is <3us | 446 | * is <3us |
| 654 | */ | 447 | */ |
| 655 | while (timeout++ < VP_TRANXDONE_TIMEOUT) { | 448 | while (timeout++ < VP_TRANXDONE_TIMEOUT) { |
| 656 | vdd->write_reg(vdd->vp_reg.tranxdone_status, | 449 | vdd->write_reg(vdd->vp_data->prm_irqst_data->tranxdone_status, |
| 657 | ocp_mod, prm_irqst_reg); | 450 | prm_irqst_ocp_mod_offs, prm_irqst_reg); |
| 658 | if (!(vdd->read_reg(ocp_mod, prm_irqst_reg) & | 451 | if (!(vdd->read_reg(prm_irqst_ocp_mod_offs, prm_irqst_reg) & |
| 659 | vdd->vp_reg.tranxdone_status)) | 452 | vdd->vp_data->prm_irqst_data->tranxdone_status)) |
| 660 | break; | 453 | break; |
| 661 | udelay(1); | 454 | udelay(1); |
| 662 | } | 455 | } |
| 663 | if (timeout >= VP_TRANXDONE_TIMEOUT) { | 456 | if (timeout >= VP_TRANXDONE_TIMEOUT) { |
| @@ -667,30 +460,30 @@ static int vp_forceupdate_scale_voltage(struct omap_vdd_info *vdd, | |||
| 667 | } | 460 | } |
| 668 | 461 | ||
| 669 | /* Configure for VP-Force Update */ | 462 | /* Configure for VP-Force Update */ |
| 670 | vpconfig = vdd->read_reg(mod, vdd->vp_offs.vpconfig); | 463 | vpconfig = vdd->read_reg(prm_mod_offs, vdd->vp_data->vpconfig); |
| 671 | vpconfig &= ~(vdd->vp_reg.vpconfig_initvdd | | 464 | vpconfig &= ~(vdd->vp_data->vp_common->vpconfig_initvdd | |
| 672 | vdd->vp_reg.vpconfig_forceupdate | | 465 | vdd->vp_data->vp_common->vpconfig_forceupdate | |
| 673 | vdd->vp_reg.vpconfig_initvoltage_mask); | 466 | vdd->vp_data->vp_common->vpconfig_initvoltage_mask); |
| 674 | vpconfig |= ((target_vsel << | 467 | vpconfig |= ((target_vsel << |
| 675 | vdd->vp_reg.vpconfig_initvoltage_shift)); | 468 | vdd->vp_data->vp_common->vpconfig_initvoltage_shift)); |
| 676 | vdd->write_reg(vpconfig, mod, vdd->vp_offs.vpconfig); | 469 | vdd->write_reg(vpconfig, prm_mod_offs, vdd->vp_data->vpconfig); |
| 677 | 470 | ||
| 678 | /* Trigger initVDD value copy to voltage processor */ | 471 | /* Trigger initVDD value copy to voltage processor */ |
| 679 | vpconfig |= vdd->vp_reg.vpconfig_initvdd; | 472 | vpconfig |= vdd->vp_data->vp_common->vpconfig_initvdd; |
| 680 | vdd->write_reg(vpconfig, mod, vdd->vp_offs.vpconfig); | 473 | vdd->write_reg(vpconfig, prm_mod_offs, vdd->vp_data->vpconfig); |
| 681 | 474 | ||
| 682 | /* Force update of voltage */ | 475 | /* Force update of voltage */ |
| 683 | vpconfig |= vdd->vp_reg.vpconfig_forceupdate; | 476 | vpconfig |= vdd->vp_data->vp_common->vpconfig_forceupdate; |
| 684 | vdd->write_reg(vpconfig, mod, vdd->vp_offs.vpconfig); | 477 | vdd->write_reg(vpconfig, prm_mod_offs, vdd->vp_data->vpconfig); |
| 685 | 478 | ||
| 686 | /* | 479 | /* |
| 687 | * Wait for TransactionDone. Typical latency is <200us. | 480 | * Wait for TransactionDone. Typical latency is <200us. |
| 688 | * Depends on SMPSWAITTIMEMIN/MAX and voltage change | 481 | * Depends on SMPSWAITTIMEMIN/MAX and voltage change |
| 689 | */ | 482 | */ |
| 690 | timeout = 0; | 483 | timeout = 0; |
| 691 | omap_test_timeout((vdd->read_reg(ocp_mod, prm_irqst_reg) & | 484 | omap_test_timeout((vdd->read_reg(prm_irqst_ocp_mod_offs, prm_irqst_reg) & |
| 692 | vdd->vp_reg.tranxdone_status), | 485 | vdd->vp_data->prm_irqst_data->tranxdone_status), |
| 693 | VP_TRANXDONE_TIMEOUT, timeout); | 486 | VP_TRANXDONE_TIMEOUT, timeout); |
| 694 | if (timeout >= VP_TRANXDONE_TIMEOUT) | 487 | if (timeout >= VP_TRANXDONE_TIMEOUT) |
| 695 | pr_err("%s: vdd_%s TRANXDONE timeout exceeded." | 488 | pr_err("%s: vdd_%s TRANXDONE timeout exceeded." |
| 696 | "TRANXDONE never got set after the voltage update\n", | 489 | "TRANXDONE never got set after the voltage update\n", |
| @@ -704,11 +497,11 @@ static int vp_forceupdate_scale_voltage(struct omap_vdd_info *vdd, | |||
| 704 | */ | 497 | */ |
| 705 | timeout = 0; | 498 | timeout = 0; |
| 706 | while (timeout++ < VP_TRANXDONE_TIMEOUT) { | 499 | while (timeout++ < VP_TRANXDONE_TIMEOUT) { |
| 707 | vdd->write_reg(vdd->vp_reg.tranxdone_status, | 500 | vdd->write_reg(vdd->vp_data->prm_irqst_data->tranxdone_status, |
| 708 | ocp_mod, prm_irqst_reg); | 501 | prm_irqst_ocp_mod_offs, prm_irqst_reg); |
| 709 | if (!(vdd->read_reg(ocp_mod, prm_irqst_reg) & | 502 | if (!(vdd->read_reg(prm_irqst_ocp_mod_offs, prm_irqst_reg) & |
| 710 | vdd->vp_reg.tranxdone_status)) | 503 | vdd->vp_data->prm_irqst_data->tranxdone_status)) |
| 711 | break; | 504 | break; |
| 712 | udelay(1); | 505 | udelay(1); |
| 713 | } | 506 | } |
| 714 | 507 | ||
| @@ -717,222 +510,95 @@ static int vp_forceupdate_scale_voltage(struct omap_vdd_info *vdd, | |||
| 717 | "to clear the TRANXDONE status\n", | 510 | "to clear the TRANXDONE status\n", |
| 718 | __func__, vdd->voltdm.name); | 511 | __func__, vdd->voltdm.name); |
| 719 | 512 | ||
| 720 | vpconfig = vdd->read_reg(mod, vdd->vp_offs.vpconfig); | 513 | vpconfig = vdd->read_reg(prm_mod_offs, vdd->vp_data->vpconfig); |
| 721 | /* Clear initVDD copy trigger bit */ | 514 | /* Clear initVDD copy trigger bit */ |
| 722 | vpconfig &= ~vdd->vp_reg.vpconfig_initvdd;; | 515 | vpconfig &= ~vdd->vp_data->vp_common->vpconfig_initvdd; |
| 723 | vdd->write_reg(vpconfig, mod, vdd->vp_offs.vpconfig); | 516 | vdd->write_reg(vpconfig, prm_mod_offs, vdd->vp_data->vpconfig); |
| 724 | /* Clear force bit */ | 517 | /* Clear force bit */ |
| 725 | vpconfig &= ~vdd->vp_reg.vpconfig_forceupdate; | 518 | vpconfig &= ~vdd->vp_data->vp_common->vpconfig_forceupdate; |
| 726 | vdd->write_reg(vpconfig, mod, vdd->vp_offs.vpconfig); | 519 | vdd->write_reg(vpconfig, prm_mod_offs, vdd->vp_data->vpconfig); |
| 727 | 520 | ||
| 728 | return 0; | 521 | return 0; |
| 729 | } | 522 | } |
| 730 | 523 | ||
| 731 | /* OMAP3 specific voltage init functions */ | 524 | static void __init omap3_vfsm_init(struct omap_vdd_info *vdd) |
| 525 | { | ||
| 526 | /* | ||
| 527 | * Voltage Manager FSM parameters init | ||
| 528 | * XXX This data should be passed in from the board file | ||
| 529 | */ | ||
| 530 | vdd->write_reg(OMAP3_CLKSETUP, prm_mod_offs, OMAP3_PRM_CLKSETUP_OFFSET); | ||
| 531 | vdd->write_reg(OMAP3_VOLTOFFSET, prm_mod_offs, | ||
| 532 | OMAP3_PRM_VOLTOFFSET_OFFSET); | ||
| 533 | vdd->write_reg(OMAP3_VOLTSETUP2, prm_mod_offs, | ||
| 534 | OMAP3_PRM_VOLTSETUP2_OFFSET); | ||
| 535 | } | ||
| 732 | 536 | ||
| 733 | /* | ||
| 734 | * Intializes the voltage controller registers with the PMIC and board | ||
| 735 | * specific parameters and voltage setup times for OMAP3. | ||
| 736 | */ | ||
| 737 | static void __init omap3_vc_init(struct omap_vdd_info *vdd) | 537 | static void __init omap3_vc_init(struct omap_vdd_info *vdd) |
| 738 | { | 538 | { |
| 739 | u32 vc_val; | ||
| 740 | u16 mod; | ||
| 741 | u8 on_vsel, onlp_vsel, ret_vsel, off_vsel; | ||
| 742 | static bool is_initialized; | 539 | static bool is_initialized; |
| 540 | u8 on_vsel, onlp_vsel, ret_vsel, off_vsel; | ||
| 541 | u32 vc_val; | ||
| 743 | 542 | ||
| 744 | if (!vdd->pmic_info || !vdd->pmic_info->uv_to_vsel) { | 543 | if (is_initialized) |
| 745 | pr_err("%s: PMIC info requried to configure vc for" | ||
| 746 | "vdd_%s not populated.Hence cannot initialize vc\n", | ||
| 747 | __func__, vdd->voltdm.name); | ||
| 748 | return; | ||
| 749 | } | ||
| 750 | |||
| 751 | if (!vdd->read_reg || !vdd->write_reg) { | ||
| 752 | pr_err("%s: No read/write API for accessing vdd_%s regs\n", | ||
| 753 | __func__, vdd->voltdm.name); | ||
| 754 | return; | 544 | return; |
| 755 | } | ||
| 756 | |||
| 757 | mod = vdd->vc_reg.prm_mod; | ||
| 758 | |||
| 759 | /* Set up the SMPS_SA(i2c slave address in VC */ | ||
| 760 | vc_val = vdd->read_reg(mod, vdd->vc_reg.smps_sa_reg); | ||
| 761 | vc_val &= ~vdd->vc_reg.smps_sa_mask; | ||
| 762 | vc_val |= vdd->pmic_info->i2c_slave_addr << vdd->vc_reg.smps_sa_shift; | ||
| 763 | vdd->write_reg(vc_val, mod, vdd->vc_reg.smps_sa_reg); | ||
| 764 | |||
| 765 | /* Setup the VOLRA(pmic reg addr) in VC */ | ||
| 766 | vc_val = vdd->read_reg(mod, vdd->vc_reg.smps_volra_reg); | ||
| 767 | vc_val &= ~vdd->vc_reg.smps_volra_mask; | ||
| 768 | vc_val |= vdd->pmic_info->pmic_reg << vdd->vc_reg.smps_volra_shift; | ||
| 769 | vdd->write_reg(vc_val, mod, vdd->vc_reg.smps_volra_reg); | ||
| 770 | |||
| 771 | /*Configure the setup times */ | ||
| 772 | vc_val = vdd->read_reg(mod, vdd->vc_reg.voltsetup_reg); | ||
| 773 | vc_val &= ~vdd->vc_reg.voltsetup_mask; | ||
| 774 | vc_val |= vdd->pmic_info->volt_setup_time << | ||
| 775 | vdd->vc_reg.voltsetup_shift; | ||
| 776 | vdd->write_reg(vc_val, mod, vdd->vc_reg.voltsetup_reg); | ||
| 777 | 545 | ||
| 778 | /* Set up the on, inactive, retention and off voltage */ | 546 | /* Set up the on, inactive, retention and off voltage */ |
| 779 | on_vsel = vdd->pmic_info->uv_to_vsel(vdd->pmic_info->on_volt); | 547 | on_vsel = vdd->pmic_info->uv_to_vsel(vdd->pmic_info->on_volt); |
| 780 | onlp_vsel = vdd->pmic_info->uv_to_vsel(vdd->pmic_info->onlp_volt); | 548 | onlp_vsel = vdd->pmic_info->uv_to_vsel(vdd->pmic_info->onlp_volt); |
| 781 | ret_vsel = vdd->pmic_info->uv_to_vsel(vdd->pmic_info->ret_volt); | 549 | ret_vsel = vdd->pmic_info->uv_to_vsel(vdd->pmic_info->ret_volt); |
| 782 | off_vsel = vdd->pmic_info->uv_to_vsel(vdd->pmic_info->off_volt); | 550 | off_vsel = vdd->pmic_info->uv_to_vsel(vdd->pmic_info->off_volt); |
| 783 | vc_val = ((on_vsel << vdd->vc_reg.cmd_on_shift) | | 551 | vc_val = ((on_vsel << vdd->vc_data->vc_common->cmd_on_shift) | |
| 784 | (onlp_vsel << vdd->vc_reg.cmd_onlp_shift) | | 552 | (onlp_vsel << vdd->vc_data->vc_common->cmd_onlp_shift) | |
| 785 | (ret_vsel << vdd->vc_reg.cmd_ret_shift) | | 553 | (ret_vsel << vdd->vc_data->vc_common->cmd_ret_shift) | |
| 786 | (off_vsel << vdd->vc_reg.cmd_off_shift)); | 554 | (off_vsel << vdd->vc_data->vc_common->cmd_off_shift)); |
| 787 | vdd->write_reg(vc_val, mod, vdd->vc_reg.cmdval_reg); | 555 | vdd->write_reg(vc_val, prm_mod_offs, vdd->vc_data->cmdval_reg); |
| 788 | |||
| 789 | if (is_initialized) | ||
| 790 | return; | ||
| 791 | 556 | ||
| 792 | /* Generic VC parameters init */ | 557 | /* |
| 793 | vdd->write_reg(OMAP3430_CMD1_MASK | OMAP3430_RAV1_MASK, mod, | 558 | * Generic VC parameters init |
| 559 | * XXX This data should be abstracted out | ||
| 560 | */ | ||
| 561 | vdd->write_reg(OMAP3430_CMD1_MASK | OMAP3430_RAV1_MASK, prm_mod_offs, | ||
| 794 | OMAP3_PRM_VC_CH_CONF_OFFSET); | 562 | OMAP3_PRM_VC_CH_CONF_OFFSET); |
| 795 | vdd->write_reg(OMAP3430_MCODE_SHIFT | OMAP3430_HSEN_MASK, mod, | 563 | vdd->write_reg(OMAP3430_MCODE_SHIFT | OMAP3430_HSEN_MASK, prm_mod_offs, |
| 796 | OMAP3_PRM_VC_I2C_CFG_OFFSET); | 564 | OMAP3_PRM_VC_I2C_CFG_OFFSET); |
| 797 | vdd->write_reg(OMAP3_CLKSETUP, mod, OMAP3_PRM_CLKSETUP_OFFSET); | 565 | |
| 798 | vdd->write_reg(OMAP3_VOLTOFFSET, mod, OMAP3_PRM_VOLTOFFSET_OFFSET); | 566 | omap3_vfsm_init(vdd); |
| 799 | vdd->write_reg(OMAP3_VOLTSETUP2, mod, OMAP3_PRM_VOLTSETUP2_OFFSET); | 567 | |
| 800 | is_initialized = true; | 568 | is_initialized = true; |
| 801 | } | 569 | } |
| 802 | 570 | ||
| 803 | /* Sets up all the VDD related info for OMAP3 */ | 571 | |
| 804 | static int __init omap3_vdd_data_configure(struct omap_vdd_info *vdd) | 572 | /* OMAP4 specific voltage init functions */ |
| 573 | static void __init omap4_vc_init(struct omap_vdd_info *vdd) | ||
| 805 | { | 574 | { |
| 806 | struct clk *sys_ck; | 575 | static bool is_initialized; |
| 807 | u32 sys_clk_speed, timeout_val, waittime; | 576 | u32 vc_val; |
| 808 | 577 | ||
| 809 | if (!vdd->pmic_info) { | 578 | if (is_initialized) |
| 810 | pr_err("%s: PMIC info requried to configure vdd_%s not" | 579 | return; |
| 811 | "populated.Hence cannot initialize vdd_%s\n", | ||
| 812 | __func__, vdd->voltdm.name, vdd->voltdm.name); | ||
| 813 | return -EINVAL; | ||
| 814 | } | ||
| 815 | 580 | ||
| 816 | if (!strcmp(vdd->voltdm.name, "mpu")) { | 581 | /* TODO: Configure setup times and CMD_VAL values*/ |
| 817 | if (cpu_is_omap3630()) | ||
| 818 | vdd->volt_data = omap36xx_vddmpu_volt_data; | ||
| 819 | else | ||
| 820 | vdd->volt_data = omap34xx_vddmpu_volt_data; | ||
| 821 | |||
| 822 | vdd->vp_reg.tranxdone_status = OMAP3430_VP1_TRANXDONE_ST_MASK; | ||
| 823 | vdd->vc_reg.cmdval_reg = OMAP3_PRM_VC_CMD_VAL_0_OFFSET; | ||
| 824 | vdd->vc_reg.smps_sa_shift = OMAP3430_PRM_VC_SMPS_SA_SA0_SHIFT; | ||
| 825 | vdd->vc_reg.smps_sa_mask = OMAP3430_PRM_VC_SMPS_SA_SA0_MASK; | ||
| 826 | vdd->vc_reg.smps_volra_shift = OMAP3430_VOLRA0_SHIFT; | ||
| 827 | vdd->vc_reg.smps_volra_mask = OMAP3430_VOLRA0_MASK; | ||
| 828 | vdd->vc_reg.voltsetup_shift = OMAP3430_SETUP_TIME1_SHIFT; | ||
| 829 | vdd->vc_reg.voltsetup_mask = OMAP3430_SETUP_TIME1_MASK; | ||
| 830 | } else if (!strcmp(vdd->voltdm.name, "core")) { | ||
| 831 | if (cpu_is_omap3630()) | ||
| 832 | vdd->volt_data = omap36xx_vddcore_volt_data; | ||
| 833 | else | ||
| 834 | vdd->volt_data = omap34xx_vddcore_volt_data; | ||
| 835 | |||
| 836 | vdd->vp_reg.tranxdone_status = OMAP3430_VP2_TRANXDONE_ST_MASK; | ||
| 837 | vdd->vc_reg.cmdval_reg = OMAP3_PRM_VC_CMD_VAL_1_OFFSET; | ||
| 838 | vdd->vc_reg.smps_sa_shift = OMAP3430_PRM_VC_SMPS_SA_SA1_SHIFT; | ||
| 839 | vdd->vc_reg.smps_sa_mask = OMAP3430_PRM_VC_SMPS_SA_SA1_MASK; | ||
| 840 | vdd->vc_reg.smps_volra_shift = OMAP3430_VOLRA1_SHIFT; | ||
| 841 | vdd->vc_reg.smps_volra_mask = OMAP3430_VOLRA1_MASK; | ||
| 842 | vdd->vc_reg.voltsetup_shift = OMAP3430_SETUP_TIME2_SHIFT; | ||
| 843 | vdd->vc_reg.voltsetup_mask = OMAP3430_SETUP_TIME2_MASK; | ||
| 844 | } else { | ||
| 845 | pr_warning("%s: vdd_%s does not exisit in OMAP3\n", | ||
| 846 | __func__, vdd->voltdm.name); | ||
| 847 | return -EINVAL; | ||
| 848 | } | ||
| 849 | 582 | ||
| 850 | /* | 583 | /* |
| 851 | * Sys clk rate is require to calculate vp timeout value and | 584 | * Generic VC parameters init |
| 852 | * smpswaittimemin and smpswaittimemax. | 585 | * XXX This data should be abstracted out |
| 853 | */ | 586 | */ |
| 854 | sys_ck = clk_get(NULL, "sys_ck"); | 587 | vc_val = (OMAP4430_RAV_VDD_MPU_L_MASK | OMAP4430_CMD_VDD_MPU_L_MASK | |
| 855 | if (IS_ERR(sys_ck)) { | 588 | OMAP4430_RAV_VDD_IVA_L_MASK | OMAP4430_CMD_VDD_IVA_L_MASK | |
| 856 | pr_warning("%s: Could not get the sys clk to calculate" | 589 | OMAP4430_RAV_VDD_CORE_L_MASK | OMAP4430_CMD_VDD_CORE_L_MASK); |
| 857 | "various vdd_%s params\n", __func__, vdd->voltdm.name); | 590 | vdd->write_reg(vc_val, prm_mod_offs, OMAP4_PRM_VC_CFG_CHANNEL_OFFSET); |
| 858 | return -EINVAL; | ||
| 859 | } | ||
| 860 | sys_clk_speed = clk_get_rate(sys_ck); | ||
| 861 | clk_put(sys_ck); | ||
| 862 | /* Divide to avoid overflow */ | ||
| 863 | sys_clk_speed /= 1000; | ||
| 864 | |||
| 865 | /* Generic voltage parameters */ | ||
| 866 | vdd->curr_volt = 1200000; | ||
| 867 | vdd->ocp_mod = OCP_MOD; | ||
| 868 | vdd->prm_irqst_reg = OMAP3_PRM_IRQSTATUS_MPU_OFFSET; | ||
| 869 | vdd->read_reg = omap3_voltage_read_reg; | ||
| 870 | vdd->write_reg = omap3_voltage_write_reg; | ||
| 871 | vdd->volt_scale = vp_forceupdate_scale_voltage; | ||
| 872 | vdd->vp_enabled = false; | ||
| 873 | 591 | ||
| 874 | /* VC parameters */ | 592 | /* XXX These are magic numbers and do not belong! */ |
| 875 | vdd->vc_reg.prm_mod = OMAP3430_GR_MOD; | 593 | vc_val = (0x60 << OMAP4430_SCLL_SHIFT | 0x26 << OMAP4430_SCLH_SHIFT); |
| 876 | vdd->vc_reg.smps_sa_reg = OMAP3_PRM_VC_SMPS_SA_OFFSET; | 594 | vdd->write_reg(vc_val, prm_mod_offs, OMAP4_PRM_VC_CFG_I2C_CLK_OFFSET); |
| 877 | vdd->vc_reg.smps_volra_reg = OMAP3_PRM_VC_SMPS_VOL_RA_OFFSET; | ||
| 878 | vdd->vc_reg.bypass_val_reg = OMAP3_PRM_VC_BYPASS_VAL_OFFSET; | ||
| 879 | vdd->vc_reg.voltsetup_reg = OMAP3_PRM_VOLTSETUP1_OFFSET; | ||
| 880 | vdd->vc_reg.data_shift = OMAP3430_DATA_SHIFT; | ||
| 881 | vdd->vc_reg.slaveaddr_shift = OMAP3430_SLAVEADDR_SHIFT; | ||
| 882 | vdd->vc_reg.regaddr_shift = OMAP3430_REGADDR_SHIFT; | ||
| 883 | vdd->vc_reg.valid = OMAP3430_VALID_MASK; | ||
| 884 | vdd->vc_reg.cmd_on_shift = OMAP3430_VC_CMD_ON_SHIFT; | ||
| 885 | vdd->vc_reg.cmd_on_mask = OMAP3430_VC_CMD_ON_MASK; | ||
| 886 | vdd->vc_reg.cmd_onlp_shift = OMAP3430_VC_CMD_ONLP_SHIFT; | ||
| 887 | vdd->vc_reg.cmd_ret_shift = OMAP3430_VC_CMD_RET_SHIFT; | ||
| 888 | vdd->vc_reg.cmd_off_shift = OMAP3430_VC_CMD_OFF_SHIFT; | ||
| 889 | |||
| 890 | vdd->vp_reg.prm_mod = OMAP3430_GR_MOD; | ||
| 891 | |||
| 892 | /* VPCONFIG bit fields */ | ||
| 893 | vdd->vp_reg.vpconfig_erroroffset = (vdd->pmic_info->vp_erroroffset << | ||
| 894 | OMAP3430_ERROROFFSET_SHIFT); | ||
| 895 | vdd->vp_reg.vpconfig_errorgain_mask = OMAP3430_ERRORGAIN_MASK; | ||
| 896 | vdd->vp_reg.vpconfig_errorgain_shift = OMAP3430_ERRORGAIN_SHIFT; | ||
| 897 | vdd->vp_reg.vpconfig_initvoltage_shift = OMAP3430_INITVOLTAGE_SHIFT; | ||
| 898 | vdd->vp_reg.vpconfig_initvoltage_mask = OMAP3430_INITVOLTAGE_MASK; | ||
| 899 | vdd->vp_reg.vpconfig_timeouten = OMAP3430_TIMEOUTEN_MASK; | ||
| 900 | vdd->vp_reg.vpconfig_initvdd = OMAP3430_INITVDD_MASK; | ||
| 901 | vdd->vp_reg.vpconfig_forceupdate = OMAP3430_FORCEUPDATE_MASK; | ||
| 902 | vdd->vp_reg.vpconfig_vpenable = OMAP3430_VPENABLE_MASK; | ||
| 903 | |||
| 904 | /* VSTEPMIN VSTEPMAX bit fields */ | ||
| 905 | waittime = ((vdd->pmic_info->step_size / vdd->pmic_info->slew_rate) * | ||
| 906 | sys_clk_speed) / 1000; | ||
| 907 | vdd->vp_reg.vstepmin_smpswaittimemin = waittime; | ||
| 908 | vdd->vp_reg.vstepmax_smpswaittimemax = waittime; | ||
| 909 | vdd->vp_reg.vstepmin_stepmin = vdd->pmic_info->vp_vstepmin; | ||
| 910 | vdd->vp_reg.vstepmax_stepmax = vdd->pmic_info->vp_vstepmax; | ||
| 911 | vdd->vp_reg.vstepmin_smpswaittimemin_shift = | ||
| 912 | OMAP3430_SMPSWAITTIMEMIN_SHIFT; | ||
| 913 | vdd->vp_reg.vstepmax_smpswaittimemax_shift = | ||
| 914 | OMAP3430_SMPSWAITTIMEMAX_SHIFT; | ||
| 915 | vdd->vp_reg.vstepmin_stepmin_shift = OMAP3430_VSTEPMIN_SHIFT; | ||
| 916 | vdd->vp_reg.vstepmax_stepmax_shift = OMAP3430_VSTEPMAX_SHIFT; | ||
| 917 | |||
| 918 | /* VLIMITTO bit fields */ | ||
| 919 | timeout_val = (sys_clk_speed * vdd->pmic_info->vp_timeout_us) / 1000; | ||
| 920 | vdd->vp_reg.vlimitto_timeout = timeout_val; | ||
| 921 | vdd->vp_reg.vlimitto_vddmin = vdd->pmic_info->vp_vddmin; | ||
| 922 | vdd->vp_reg.vlimitto_vddmax = vdd->pmic_info->vp_vddmax; | ||
| 923 | vdd->vp_reg.vlimitto_vddmin_shift = OMAP3430_VDDMIN_SHIFT; | ||
| 924 | vdd->vp_reg.vlimitto_vddmax_shift = OMAP3430_VDDMAX_SHIFT; | ||
| 925 | vdd->vp_reg.vlimitto_timeout_shift = OMAP3430_TIMEOUT_SHIFT; | ||
| 926 | 595 | ||
| 927 | return 0; | 596 | is_initialized = true; |
| 928 | } | 597 | } |
| 929 | 598 | ||
| 930 | /* OMAP4 specific voltage init functions */ | 599 | static void __init omap_vc_init(struct omap_vdd_info *vdd) |
| 931 | static void __init omap4_vc_init(struct omap_vdd_info *vdd) | ||
| 932 | { | 600 | { |
| 933 | u32 vc_val; | 601 | u32 vc_val; |
| 934 | u16 mod; | ||
| 935 | static bool is_initialized; | ||
| 936 | 602 | ||
| 937 | if (!vdd->pmic_info || !vdd->pmic_info->uv_to_vsel) { | 603 | if (!vdd->pmic_info || !vdd->pmic_info->uv_to_vsel) { |
| 938 | pr_err("%s: PMIC info requried to configure vc for" | 604 | pr_err("%s: PMIC info requried to configure vc for" |
| @@ -947,173 +613,61 @@ static void __init omap4_vc_init(struct omap_vdd_info *vdd) | |||
| 947 | return; | 613 | return; |
| 948 | } | 614 | } |
| 949 | 615 | ||
| 950 | mod = vdd->vc_reg.prm_mod; | ||
| 951 | |||
| 952 | /* Set up the SMPS_SA(i2c slave address in VC */ | 616 | /* Set up the SMPS_SA(i2c slave address in VC */ |
| 953 | vc_val = vdd->read_reg(mod, vdd->vc_reg.smps_sa_reg); | 617 | vc_val = vdd->read_reg(prm_mod_offs, |
| 954 | vc_val &= ~vdd->vc_reg.smps_sa_mask; | 618 | vdd->vc_data->vc_common->smps_sa_reg); |
| 955 | vc_val |= vdd->pmic_info->i2c_slave_addr << vdd->vc_reg.smps_sa_shift; | 619 | vc_val &= ~vdd->vc_data->smps_sa_mask; |
| 956 | vdd->write_reg(vc_val, mod, vdd->vc_reg.smps_sa_reg); | 620 | vc_val |= vdd->pmic_info->i2c_slave_addr << vdd->vc_data->smps_sa_shift; |
| 621 | vdd->write_reg(vc_val, prm_mod_offs, | ||
| 622 | vdd->vc_data->vc_common->smps_sa_reg); | ||
| 957 | 623 | ||
| 958 | /* Setup the VOLRA(pmic reg addr) in VC */ | 624 | /* Setup the VOLRA(pmic reg addr) in VC */ |
| 959 | vc_val = vdd->read_reg(mod, vdd->vc_reg.smps_volra_reg); | 625 | vc_val = vdd->read_reg(prm_mod_offs, |
| 960 | vc_val &= ~vdd->vc_reg.smps_volra_mask; | 626 | vdd->vc_data->vc_common->smps_volra_reg); |
| 961 | vc_val |= vdd->pmic_info->pmic_reg << vdd->vc_reg.smps_volra_shift; | 627 | vc_val &= ~vdd->vc_data->smps_volra_mask; |
| 962 | vdd->write_reg(vc_val, mod, vdd->vc_reg.smps_volra_reg); | 628 | vc_val |= vdd->pmic_info->pmic_reg << vdd->vc_data->smps_volra_shift; |
| 963 | 629 | vdd->write_reg(vc_val, prm_mod_offs, | |
| 964 | /* TODO: Configure setup times and CMD_VAL values*/ | 630 | vdd->vc_data->vc_common->smps_volra_reg); |
| 965 | 631 | ||
| 966 | if (is_initialized) | 632 | /* Configure the setup times */ |
| 967 | return; | 633 | vc_val = vdd->read_reg(prm_mod_offs, vdd->vfsm->voltsetup_reg); |
| 968 | 634 | vc_val &= ~vdd->vfsm->voltsetup_mask; | |
| 969 | /* Generic VC parameters init */ | 635 | vc_val |= vdd->pmic_info->volt_setup_time << |
| 970 | vc_val = (OMAP4430_RAV_VDD_MPU_L_MASK | OMAP4430_CMD_VDD_MPU_L_MASK | | 636 | vdd->vfsm->voltsetup_shift; |
| 971 | OMAP4430_RAV_VDD_IVA_L_MASK | OMAP4430_CMD_VDD_IVA_L_MASK | | 637 | vdd->write_reg(vc_val, prm_mod_offs, vdd->vfsm->voltsetup_reg); |
| 972 | OMAP4430_RAV_VDD_CORE_L_MASK | OMAP4430_CMD_VDD_CORE_L_MASK); | ||
| 973 | vdd->write_reg(vc_val, mod, OMAP4_PRM_VC_CFG_CHANNEL_OFFSET); | ||
| 974 | |||
| 975 | vc_val = (0x60 << OMAP4430_SCLL_SHIFT | 0x26 << OMAP4430_SCLH_SHIFT); | ||
| 976 | vdd->write_reg(vc_val, mod, OMAP4_PRM_VC_CFG_I2C_CLK_OFFSET); | ||
| 977 | 638 | ||
| 978 | is_initialized = true; | 639 | if (cpu_is_omap34xx()) |
| 640 | omap3_vc_init(vdd); | ||
| 641 | else if (cpu_is_omap44xx()) | ||
| 642 | omap4_vc_init(vdd); | ||
| 979 | } | 643 | } |
| 980 | 644 | ||
| 981 | /* Sets up all the VDD related info for OMAP4 */ | 645 | static int __init omap_vdd_data_configure(struct omap_vdd_info *vdd) |
| 982 | static int __init omap4_vdd_data_configure(struct omap_vdd_info *vdd) | ||
| 983 | { | 646 | { |
| 984 | struct clk *sys_ck; | 647 | int ret = -EINVAL; |
| 985 | u32 sys_clk_speed, timeout_val, waittime; | ||
| 986 | 648 | ||
| 987 | if (!vdd->pmic_info) { | 649 | if (!vdd->pmic_info) { |
| 988 | pr_err("%s: PMIC info requried to configure vdd_%s not" | 650 | pr_err("%s: PMIC info requried to configure vdd_%s not" |
| 989 | "populated.Hence cannot initialize vdd_%s\n", | 651 | "populated.Hence cannot initialize vdd_%s\n", |
| 990 | __func__, vdd->voltdm.name, vdd->voltdm.name); | 652 | __func__, vdd->voltdm.name, vdd->voltdm.name); |
| 991 | return -EINVAL; | 653 | goto ovdc_out; |
| 992 | } | 654 | } |
| 993 | 655 | ||
| 994 | if (!strcmp(vdd->voltdm.name, "mpu")) { | 656 | if (IS_ERR_VALUE(_config_common_vdd_data(vdd))) |
| 995 | vdd->volt_data = omap44xx_vdd_mpu_volt_data; | 657 | goto ovdc_out; |
| 996 | vdd->vp_reg.tranxdone_status = | ||
| 997 | OMAP4430_VP_MPU_TRANXDONE_ST_MASK; | ||
| 998 | vdd->vc_reg.cmdval_reg = OMAP4_PRM_VC_VAL_CMD_VDD_MPU_L_OFFSET; | ||
| 999 | vdd->vc_reg.smps_sa_shift = | ||
| 1000 | OMAP4430_SA_VDD_MPU_L_PRM_VC_SMPS_SA_SHIFT; | ||
| 1001 | vdd->vc_reg.smps_sa_mask = | ||
| 1002 | OMAP4430_SA_VDD_MPU_L_PRM_VC_SMPS_SA_MASK; | ||
| 1003 | vdd->vc_reg.smps_volra_shift = OMAP4430_VOLRA_VDD_MPU_L_SHIFT; | ||
| 1004 | vdd->vc_reg.smps_volra_mask = OMAP4430_VOLRA_VDD_MPU_L_MASK; | ||
| 1005 | vdd->vc_reg.voltsetup_reg = | ||
| 1006 | OMAP4_PRM_VOLTSETUP_MPU_RET_SLEEP_OFFSET; | ||
| 1007 | vdd->prm_irqst_reg = OMAP4_PRM_IRQSTATUS_MPU_2_OFFSET; | ||
| 1008 | } else if (!strcmp(vdd->voltdm.name, "core")) { | ||
| 1009 | vdd->volt_data = omap44xx_vdd_core_volt_data; | ||
| 1010 | vdd->vp_reg.tranxdone_status = | ||
| 1011 | OMAP4430_VP_CORE_TRANXDONE_ST_MASK; | ||
| 1012 | vdd->vc_reg.cmdval_reg = | ||
| 1013 | OMAP4_PRM_VC_VAL_CMD_VDD_CORE_L_OFFSET; | ||
| 1014 | vdd->vc_reg.smps_sa_shift = OMAP4430_SA_VDD_CORE_L_0_6_SHIFT; | ||
| 1015 | vdd->vc_reg.smps_sa_mask = OMAP4430_SA_VDD_CORE_L_0_6_MASK; | ||
| 1016 | vdd->vc_reg.smps_volra_shift = OMAP4430_VOLRA_VDD_CORE_L_SHIFT; | ||
| 1017 | vdd->vc_reg.smps_volra_mask = OMAP4430_VOLRA_VDD_CORE_L_MASK; | ||
| 1018 | vdd->vc_reg.voltsetup_reg = | ||
| 1019 | OMAP4_PRM_VOLTSETUP_CORE_RET_SLEEP_OFFSET; | ||
| 1020 | vdd->prm_irqst_reg = OMAP4_PRM_IRQSTATUS_MPU_OFFSET; | ||
| 1021 | } else if (!strcmp(vdd->voltdm.name, "iva")) { | ||
| 1022 | vdd->volt_data = omap44xx_vdd_iva_volt_data; | ||
| 1023 | vdd->vp_reg.tranxdone_status = | ||
| 1024 | OMAP4430_VP_IVA_TRANXDONE_ST_MASK; | ||
| 1025 | vdd->vc_reg.cmdval_reg = OMAP4_PRM_VC_VAL_CMD_VDD_IVA_L_OFFSET; | ||
| 1026 | vdd->vc_reg.smps_sa_shift = | ||
| 1027 | OMAP4430_SA_VDD_IVA_L_PRM_VC_SMPS_SA_SHIFT; | ||
| 1028 | vdd->vc_reg.smps_sa_mask = | ||
| 1029 | OMAP4430_SA_VDD_IVA_L_PRM_VC_SMPS_SA_MASK; | ||
| 1030 | vdd->vc_reg.smps_volra_shift = OMAP4430_VOLRA_VDD_IVA_L_SHIFT; | ||
| 1031 | vdd->vc_reg.smps_volra_mask = OMAP4430_VOLRA_VDD_IVA_L_MASK; | ||
| 1032 | vdd->vc_reg.voltsetup_reg = | ||
| 1033 | OMAP4_PRM_VOLTSETUP_IVA_RET_SLEEP_OFFSET; | ||
| 1034 | vdd->prm_irqst_reg = OMAP4_PRM_IRQSTATUS_MPU_OFFSET; | ||
| 1035 | } else { | ||
| 1036 | pr_warning("%s: vdd_%s does not exisit in OMAP4\n", | ||
| 1037 | __func__, vdd->voltdm.name); | ||
| 1038 | return -EINVAL; | ||
| 1039 | } | ||
| 1040 | 658 | ||
| 1041 | /* | 659 | if (cpu_is_omap34xx()) { |
| 1042 | * Sys clk rate is require to calculate vp timeout value and | 660 | vdd->read_reg = omap3_voltage_read_reg; |
| 1043 | * smpswaittimemin and smpswaittimemax. | 661 | vdd->write_reg = omap3_voltage_write_reg; |
| 1044 | */ | 662 | ret = 0; |
| 1045 | sys_ck = clk_get(NULL, "sys_clkin_ck"); | 663 | } else if (cpu_is_omap44xx()) { |
| 1046 | if (IS_ERR(sys_ck)) { | 664 | vdd->read_reg = omap4_voltage_read_reg; |
| 1047 | pr_warning("%s: Could not get the sys clk to calculate" | 665 | vdd->write_reg = omap4_voltage_write_reg; |
| 1048 | "various vdd_%s params\n", __func__, vdd->voltdm.name); | 666 | ret = 0; |
| 1049 | return -EINVAL; | ||
| 1050 | } | 667 | } |
| 1051 | sys_clk_speed = clk_get_rate(sys_ck); | ||
| 1052 | clk_put(sys_ck); | ||
| 1053 | /* Divide to avoid overflow */ | ||
| 1054 | sys_clk_speed /= 1000; | ||
| 1055 | |||
| 1056 | /* Generic voltage parameters */ | ||
| 1057 | vdd->curr_volt = 1200000; | ||
| 1058 | vdd->ocp_mod = OMAP4430_PRM_OCP_SOCKET_INST; | ||
| 1059 | vdd->read_reg = omap4_voltage_read_reg; | ||
| 1060 | vdd->write_reg = omap4_voltage_write_reg; | ||
| 1061 | vdd->volt_scale = vp_forceupdate_scale_voltage; | ||
| 1062 | vdd->vp_enabled = false; | ||
| 1063 | 668 | ||
| 1064 | /* VC parameters */ | 669 | ovdc_out: |
| 1065 | vdd->vc_reg.prm_mod = OMAP4430_PRM_DEVICE_INST; | 670 | return ret; |
| 1066 | vdd->vc_reg.smps_sa_reg = OMAP4_PRM_VC_SMPS_SA_OFFSET; | ||
| 1067 | vdd->vc_reg.smps_volra_reg = OMAP4_PRM_VC_VAL_SMPS_RA_VOL_OFFSET; | ||
| 1068 | vdd->vc_reg.bypass_val_reg = OMAP4_PRM_VC_VAL_BYPASS_OFFSET; | ||
| 1069 | vdd->vc_reg.data_shift = OMAP4430_DATA_SHIFT; | ||
| 1070 | vdd->vc_reg.slaveaddr_shift = OMAP4430_SLAVEADDR_SHIFT; | ||
| 1071 | vdd->vc_reg.regaddr_shift = OMAP4430_REGADDR_SHIFT; | ||
| 1072 | vdd->vc_reg.valid = OMAP4430_VALID_MASK; | ||
| 1073 | vdd->vc_reg.cmd_on_shift = OMAP4430_ON_SHIFT; | ||
| 1074 | vdd->vc_reg.cmd_on_mask = OMAP4430_ON_MASK; | ||
| 1075 | vdd->vc_reg.cmd_onlp_shift = OMAP4430_ONLP_SHIFT; | ||
| 1076 | vdd->vc_reg.cmd_ret_shift = OMAP4430_RET_SHIFT; | ||
| 1077 | vdd->vc_reg.cmd_off_shift = OMAP4430_OFF_SHIFT; | ||
| 1078 | |||
| 1079 | vdd->vp_reg.prm_mod = OMAP4430_PRM_DEVICE_INST; | ||
| 1080 | |||
| 1081 | /* VPCONFIG bit fields */ | ||
| 1082 | vdd->vp_reg.vpconfig_erroroffset = (vdd->pmic_info->vp_erroroffset << | ||
| 1083 | OMAP4430_ERROROFFSET_SHIFT); | ||
| 1084 | vdd->vp_reg.vpconfig_errorgain_mask = OMAP4430_ERRORGAIN_MASK; | ||
| 1085 | vdd->vp_reg.vpconfig_errorgain_shift = OMAP4430_ERRORGAIN_SHIFT; | ||
| 1086 | vdd->vp_reg.vpconfig_initvoltage_shift = OMAP4430_INITVOLTAGE_SHIFT; | ||
| 1087 | vdd->vp_reg.vpconfig_initvoltage_mask = OMAP4430_INITVOLTAGE_MASK; | ||
| 1088 | vdd->vp_reg.vpconfig_timeouten = OMAP4430_TIMEOUTEN_MASK; | ||
| 1089 | vdd->vp_reg.vpconfig_initvdd = OMAP4430_INITVDD_MASK; | ||
| 1090 | vdd->vp_reg.vpconfig_forceupdate = OMAP4430_FORCEUPDATE_MASK; | ||
| 1091 | vdd->vp_reg.vpconfig_vpenable = OMAP4430_VPENABLE_MASK; | ||
| 1092 | |||
| 1093 | /* VSTEPMIN VSTEPMAX bit fields */ | ||
| 1094 | waittime = ((vdd->pmic_info->step_size / vdd->pmic_info->slew_rate) * | ||
| 1095 | sys_clk_speed) / 1000; | ||
| 1096 | vdd->vp_reg.vstepmin_smpswaittimemin = waittime; | ||
| 1097 | vdd->vp_reg.vstepmax_smpswaittimemax = waittime; | ||
| 1098 | vdd->vp_reg.vstepmin_stepmin = vdd->pmic_info->vp_vstepmin; | ||
| 1099 | vdd->vp_reg.vstepmax_stepmax = vdd->pmic_info->vp_vstepmax; | ||
| 1100 | vdd->vp_reg.vstepmin_smpswaittimemin_shift = | ||
| 1101 | OMAP4430_SMPSWAITTIMEMIN_SHIFT; | ||
| 1102 | vdd->vp_reg.vstepmax_smpswaittimemax_shift = | ||
| 1103 | OMAP4430_SMPSWAITTIMEMAX_SHIFT; | ||
| 1104 | vdd->vp_reg.vstepmin_stepmin_shift = OMAP4430_VSTEPMIN_SHIFT; | ||
| 1105 | vdd->vp_reg.vstepmax_stepmax_shift = OMAP4430_VSTEPMAX_SHIFT; | ||
| 1106 | |||
| 1107 | /* VLIMITTO bit fields */ | ||
| 1108 | timeout_val = (sys_clk_speed * vdd->pmic_info->vp_timeout_us) / 1000; | ||
| 1109 | vdd->vp_reg.vlimitto_timeout = timeout_val; | ||
| 1110 | vdd->vp_reg.vlimitto_vddmin = vdd->pmic_info->vp_vddmin; | ||
| 1111 | vdd->vp_reg.vlimitto_vddmax = vdd->pmic_info->vp_vddmax; | ||
| 1112 | vdd->vp_reg.vlimitto_vddmin_shift = OMAP4430_VDDMIN_SHIFT; | ||
| 1113 | vdd->vp_reg.vlimitto_vddmax_shift = OMAP4430_VDDMAX_SHIFT; | ||
| 1114 | vdd->vp_reg.vlimitto_timeout_shift = OMAP4430_TIMEOUT_SHIFT; | ||
| 1115 | |||
| 1116 | return 0; | ||
| 1117 | } | 671 | } |
| 1118 | 672 | ||
| 1119 | /* Public functions */ | 673 | /* Public functions */ |
| @@ -1161,8 +715,7 @@ unsigned long omap_vp_get_curr_volt(struct voltagedomain *voltdm) | |||
| 1161 | return 0; | 715 | return 0; |
| 1162 | } | 716 | } |
| 1163 | 717 | ||
| 1164 | curr_vsel = vdd->read_reg(vdd->vp_reg.prm_mod, | 718 | curr_vsel = vdd->read_reg(prm_mod_offs, vdd->vp_data->voltage); |
| 1165 | vdd->vp_offs.voltage); | ||
| 1166 | 719 | ||
| 1167 | if (!vdd->pmic_info || !vdd->pmic_info->vsel_to_uv) { | 720 | if (!vdd->pmic_info || !vdd->pmic_info->vsel_to_uv) { |
| 1168 | pr_warning("%s: PMIC function to convert vsel to voltage" | 721 | pr_warning("%s: PMIC function to convert vsel to voltage" |
| @@ -1184,7 +737,6 @@ void omap_vp_enable(struct voltagedomain *voltdm) | |||
| 1184 | { | 737 | { |
| 1185 | struct omap_vdd_info *vdd; | 738 | struct omap_vdd_info *vdd; |
| 1186 | u32 vpconfig; | 739 | u32 vpconfig; |
| 1187 | u16 mod; | ||
| 1188 | 740 | ||
| 1189 | if (!voltdm || IS_ERR(voltdm)) { | 741 | if (!voltdm || IS_ERR(voltdm)) { |
| 1190 | pr_warning("%s: VDD specified does not exist!\n", __func__); | 742 | pr_warning("%s: VDD specified does not exist!\n", __func__); |
| @@ -1198,8 +750,6 @@ void omap_vp_enable(struct voltagedomain *voltdm) | |||
| 1198 | return; | 750 | return; |
| 1199 | } | 751 | } |
| 1200 | 752 | ||
| 1201 | mod = vdd->vp_reg.prm_mod; | ||
| 1202 | |||
| 1203 | /* If VP is already enabled, do nothing. Return */ | 753 | /* If VP is already enabled, do nothing. Return */ |
| 1204 | if (vdd->vp_enabled) | 754 | if (vdd->vp_enabled) |
| 1205 | return; | 755 | return; |
| @@ -1207,9 +757,9 @@ void omap_vp_enable(struct voltagedomain *voltdm) | |||
| 1207 | vp_latch_vsel(vdd); | 757 | vp_latch_vsel(vdd); |
| 1208 | 758 | ||
| 1209 | /* Enable VP */ | 759 | /* Enable VP */ |
| 1210 | vpconfig = vdd->read_reg(mod, vdd->vp_offs.vpconfig); | 760 | vpconfig = vdd->read_reg(prm_mod_offs, vdd->vp_data->vpconfig); |
| 1211 | vpconfig |= vdd->vp_reg.vpconfig_vpenable; | 761 | vpconfig |= vdd->vp_data->vp_common->vpconfig_vpenable; |
| 1212 | vdd->write_reg(vpconfig, mod, vdd->vp_offs.vpconfig); | 762 | vdd->write_reg(vpconfig, prm_mod_offs, vdd->vp_data->vpconfig); |
| 1213 | vdd->vp_enabled = true; | 763 | vdd->vp_enabled = true; |
| 1214 | } | 764 | } |
| 1215 | 765 | ||
| @@ -1224,7 +774,6 @@ void omap_vp_disable(struct voltagedomain *voltdm) | |||
| 1224 | { | 774 | { |
| 1225 | struct omap_vdd_info *vdd; | 775 | struct omap_vdd_info *vdd; |
| 1226 | u32 vpconfig; | 776 | u32 vpconfig; |
| 1227 | u16 mod; | ||
| 1228 | int timeout; | 777 | int timeout; |
| 1229 | 778 | ||
| 1230 | if (!voltdm || IS_ERR(voltdm)) { | 779 | if (!voltdm || IS_ERR(voltdm)) { |
| @@ -1239,8 +788,6 @@ void omap_vp_disable(struct voltagedomain *voltdm) | |||
| 1239 | return; | 788 | return; |
| 1240 | } | 789 | } |
| 1241 | 790 | ||
| 1242 | mod = vdd->vp_reg.prm_mod; | ||
| 1243 | |||
| 1244 | /* If VP is already disabled, do nothing. Return */ | 791 | /* If VP is already disabled, do nothing. Return */ |
| 1245 | if (!vdd->vp_enabled) { | 792 | if (!vdd->vp_enabled) { |
| 1246 | pr_warning("%s: Trying to disable VP for vdd_%s when" | 793 | pr_warning("%s: Trying to disable VP for vdd_%s when" |
| @@ -1249,14 +796,14 @@ void omap_vp_disable(struct voltagedomain *voltdm) | |||
| 1249 | } | 796 | } |
| 1250 | 797 | ||
| 1251 | /* Disable VP */ | 798 | /* Disable VP */ |
| 1252 | vpconfig = vdd->read_reg(mod, vdd->vp_offs.vpconfig); | 799 | vpconfig = vdd->read_reg(prm_mod_offs, vdd->vp_data->vpconfig); |
| 1253 | vpconfig &= ~vdd->vp_reg.vpconfig_vpenable; | 800 | vpconfig &= ~vdd->vp_data->vp_common->vpconfig_vpenable; |
| 1254 | vdd->write_reg(vpconfig, mod, vdd->vp_offs.vpconfig); | 801 | vdd->write_reg(vpconfig, prm_mod_offs, vdd->vp_data->vpconfig); |
| 1255 | 802 | ||
| 1256 | /* | 803 | /* |
| 1257 | * Wait for VP idle Typical latency is <2us. Maximum latency is ~100us | 804 | * Wait for VP idle Typical latency is <2us. Maximum latency is ~100us |
| 1258 | */ | 805 | */ |
| 1259 | omap_test_timeout((vdd->read_reg(mod, vdd->vp_offs.vstatus)), | 806 | omap_test_timeout((vdd->read_reg(prm_mod_offs, vdd->vp_data->vstatus)), |
| 1260 | VP_IDLE_TIMEOUT, timeout); | 807 | VP_IDLE_TIMEOUT, timeout); |
| 1261 | 808 | ||
| 1262 | if (timeout >= VP_IDLE_TIMEOUT) | 809 | if (timeout >= VP_IDLE_TIMEOUT) |
| @@ -1509,8 +1056,8 @@ struct voltagedomain *omap_voltage_domain_lookup(char *name) | |||
| 1509 | } | 1056 | } |
| 1510 | 1057 | ||
| 1511 | for (i = 0; i < nr_scalable_vdd; i++) { | 1058 | for (i = 0; i < nr_scalable_vdd; i++) { |
| 1512 | if (!(strcmp(name, vdd_info[i].voltdm.name))) | 1059 | if (!(strcmp(name, vdd_info[i]->voltdm.name))) |
| 1513 | return &vdd_info[i].voltdm; | 1060 | return &vdd_info[i]->voltdm; |
| 1514 | } | 1061 | } |
| 1515 | 1062 | ||
| 1516 | return ERR_PTR(-EINVAL); | 1063 | return ERR_PTR(-EINVAL); |
| @@ -1538,35 +1085,24 @@ int __init omap_voltage_late_init(void) | |||
| 1538 | pr_err("%s: Unable to create voltage debugfs main dir\n", | 1085 | pr_err("%s: Unable to create voltage debugfs main dir\n", |
| 1539 | __func__); | 1086 | __func__); |
| 1540 | for (i = 0; i < nr_scalable_vdd; i++) { | 1087 | for (i = 0; i < nr_scalable_vdd; i++) { |
| 1541 | if (vdd_data_configure(&vdd_info[i])) | 1088 | if (omap_vdd_data_configure(vdd_info[i])) |
| 1542 | continue; | 1089 | continue; |
| 1543 | vc_init(&vdd_info[i]); | 1090 | omap_vc_init(vdd_info[i]); |
| 1544 | vp_init(&vdd_info[i]); | 1091 | vp_init(vdd_info[i]); |
| 1545 | vdd_debugfs_init(&vdd_info[i]); | 1092 | vdd_debugfs_init(vdd_info[i]); |
| 1546 | } | 1093 | } |
| 1547 | 1094 | ||
| 1548 | return 0; | 1095 | return 0; |
| 1549 | } | 1096 | } |
| 1550 | 1097 | ||
| 1551 | /** | 1098 | /* XXX document */ |
| 1552 | * omap_voltage_early_init()- Volatage driver early init | 1099 | int __init omap_voltage_early_init(s16 prm_mod, s16 prm_irqst_ocp_mod, |
| 1553 | */ | 1100 | struct omap_vdd_info *omap_vdd_array[], |
| 1554 | static int __init omap_voltage_early_init(void) | 1101 | u8 omap_vdd_count) |
| 1555 | { | 1102 | { |
| 1556 | if (cpu_is_omap34xx()) { | 1103 | prm_mod_offs = prm_mod; |
| 1557 | vdd_info = omap3_vdd_info; | 1104 | prm_irqst_ocp_mod_offs = prm_irqst_ocp_mod; |
| 1558 | nr_scalable_vdd = OMAP3_NR_SCALABLE_VDD; | 1105 | vdd_info = omap_vdd_array; |
| 1559 | vc_init = omap3_vc_init; | 1106 | nr_scalable_vdd = omap_vdd_count; |
| 1560 | vdd_data_configure = omap3_vdd_data_configure; | ||
| 1561 | } else if (cpu_is_omap44xx()) { | ||
| 1562 | vdd_info = omap4_vdd_info; | ||
| 1563 | nr_scalable_vdd = OMAP4_NR_SCALABLE_VDD; | ||
| 1564 | vc_init = omap4_vc_init; | ||
| 1565 | vdd_data_configure = omap4_vdd_data_configure; | ||
| 1566 | } else { | ||
| 1567 | pr_warning("%s: voltage driver support not added\n", __func__); | ||
| 1568 | } | ||
| 1569 | |||
| 1570 | return 0; | 1107 | return 0; |
| 1571 | } | 1108 | } |
| 1572 | core_initcall(omap_voltage_early_init); | ||
diff --git a/arch/arm/plat-omap/include/plat/voltage.h b/arch/arm/mach-omap2/voltage.h index 5bd204e55c3..e9f5408244e 100644 --- a/arch/arm/plat-omap/include/plat/voltage.h +++ b/arch/arm/mach-omap2/voltage.h | |||
| @@ -16,6 +16,10 @@ | |||
| 16 | 16 | ||
| 17 | #include <linux/err.h> | 17 | #include <linux/err.h> |
| 18 | 18 | ||
| 19 | #include "vc.h" | ||
| 20 | #include "vp.h" | ||
| 21 | |||
| 22 | /* XXX document */ | ||
| 19 | #define VOLTSCALE_VPFORCEUPDATE 1 | 23 | #define VOLTSCALE_VPFORCEUPDATE 1 |
| 20 | #define VOLTSCALE_VCBYPASS 2 | 24 | #define VOLTSCALE_VCBYPASS 2 |
| 21 | 25 | ||
| @@ -27,36 +31,22 @@ | |||
| 27 | #define OMAP3_VOLTOFFSET 0xff | 31 | #define OMAP3_VOLTOFFSET 0xff |
| 28 | #define OMAP3_VOLTSETUP2 0xff | 32 | #define OMAP3_VOLTSETUP2 0xff |
| 29 | 33 | ||
| 30 | /* Voltage value defines */ | 34 | /** |
| 31 | #define OMAP3430_VDD_MPU_OPP1_UV 975000 | 35 | * struct omap_vfsm_instance_data - per-voltage manager FSM register/bitfield |
| 32 | #define OMAP3430_VDD_MPU_OPP2_UV 1075000 | 36 | * data |
| 33 | #define OMAP3430_VDD_MPU_OPP3_UV 1200000 | 37 | * @voltsetup_mask: SETUP_TIME* bitmask in the PRM_VOLTSETUP* register |
| 34 | #define OMAP3430_VDD_MPU_OPP4_UV 1270000 | 38 | * @voltsetup_reg: register offset of PRM_VOLTSETUP from PRM base |
| 35 | #define OMAP3430_VDD_MPU_OPP5_UV 1350000 | 39 | * @voltsetup_shift: SETUP_TIME* field shift in the PRM_VOLTSETUP* register |
| 36 | 40 | * | |
| 37 | #define OMAP3430_VDD_CORE_OPP1_UV 975000 | 41 | * XXX What about VOLTOFFSET/VOLTCTRL? |
| 38 | #define OMAP3430_VDD_CORE_OPP2_UV 1050000 | 42 | * XXX It is not necessary to have both a _mask and a _shift for the same |
| 39 | #define OMAP3430_VDD_CORE_OPP3_UV 1150000 | 43 | * bitfield - remove one! |
| 40 | 44 | */ | |
| 41 | #define OMAP3630_VDD_MPU_OPP50_UV 1012500 | 45 | struct omap_vfsm_instance_data { |
| 42 | #define OMAP3630_VDD_MPU_OPP100_UV 1200000 | 46 | u32 voltsetup_mask; |
| 43 | #define OMAP3630_VDD_MPU_OPP120_UV 1325000 | 47 | u8 voltsetup_reg; |
| 44 | #define OMAP3630_VDD_MPU_OPP1G_UV 1375000 | 48 | u8 voltsetup_shift; |
| 45 | 49 | }; | |
| 46 | #define OMAP3630_VDD_CORE_OPP50_UV 1000000 | ||
| 47 | #define OMAP3630_VDD_CORE_OPP100_UV 1200000 | ||
| 48 | |||
| 49 | #define OMAP4430_VDD_MPU_OPP50_UV 930000 | ||
| 50 | #define OMAP4430_VDD_MPU_OPP100_UV 1100000 | ||
| 51 | #define OMAP4430_VDD_MPU_OPPTURBO_UV 1260000 | ||
| 52 | #define OMAP4430_VDD_MPU_OPPNITRO_UV 1350000 | ||
| 53 | |||
| 54 | #define OMAP4430_VDD_IVA_OPP50_UV 930000 | ||
| 55 | #define OMAP4430_VDD_IVA_OPP100_UV 1100000 | ||
| 56 | #define OMAP4430_VDD_IVA_OPPTURBO_UV 1260000 | ||
| 57 | |||
| 58 | #define OMAP4430_VDD_CORE_OPP50_UV 930000 | ||
| 59 | #define OMAP4430_VDD_CORE_OPP100_UV 1100000 | ||
| 60 | 50 | ||
| 61 | /** | 51 | /** |
| 62 | * struct voltagedomain - omap voltage domain global structure. | 52 | * struct voltagedomain - omap voltage domain global structure. |
| @@ -113,6 +103,42 @@ struct omap_volt_pmic_info { | |||
| 113 | u8 (*uv_to_vsel) (unsigned long uV); | 103 | u8 (*uv_to_vsel) (unsigned long uV); |
| 114 | }; | 104 | }; |
| 115 | 105 | ||
| 106 | /** | ||
| 107 | * omap_vdd_info - Per Voltage Domain info | ||
| 108 | * | ||
| 109 | * @volt_data : voltage table having the distinct voltages supported | ||
| 110 | * by the domain and other associated per voltage data. | ||
| 111 | * @pmic_info : pmic specific parameters which should be populted by | ||
| 112 | * the pmic drivers. | ||
| 113 | * @vp_data : the register values, shifts, masks for various | ||
| 114 | * vp registers | ||
| 115 | * @vp_rt_data : VP data derived at runtime, not predefined | ||
| 116 | * @vc_data : structure containing various various vc registers, | ||
| 117 | * shifts, masks etc. | ||
| 118 | * @vfsm : voltage manager FSM data | ||
| 119 | * @voltdm : pointer to the voltage domain structure | ||
| 120 | * @debug_dir : debug directory for this voltage domain. | ||
| 121 | * @curr_volt : current voltage for this vdd. | ||
| 122 | * @vp_enabled : flag to keep track of whether vp is enabled or not | ||
| 123 | * @volt_scale : API to scale the voltage of the vdd. | ||
| 124 | */ | ||
| 125 | struct omap_vdd_info { | ||
| 126 | struct omap_volt_data *volt_data; | ||
| 127 | struct omap_volt_pmic_info *pmic_info; | ||
| 128 | struct omap_vp_instance_data *vp_data; | ||
| 129 | struct omap_vp_runtime_data vp_rt_data; | ||
| 130 | struct omap_vc_instance_data *vc_data; | ||
| 131 | const struct omap_vfsm_instance_data *vfsm; | ||
| 132 | struct voltagedomain voltdm; | ||
| 133 | struct dentry *debug_dir; | ||
| 134 | u32 curr_volt; | ||
| 135 | bool vp_enabled; | ||
| 136 | u32 (*read_reg) (u16 mod, u8 offset); | ||
| 137 | void (*write_reg) (u32 val, u16 mod, u8 offset); | ||
| 138 | int (*volt_scale) (struct omap_vdd_info *vdd, | ||
| 139 | unsigned long target_volt); | ||
| 140 | }; | ||
| 141 | |||
| 116 | unsigned long omap_vp_get_curr_volt(struct voltagedomain *voltdm); | 142 | unsigned long omap_vp_get_curr_volt(struct voltagedomain *voltdm); |
| 117 | void omap_vp_enable(struct voltagedomain *voltdm); | 143 | void omap_vp_enable(struct voltagedomain *voltdm); |
| 118 | void omap_vp_disable(struct voltagedomain *voltdm); | 144 | void omap_vp_disable(struct voltagedomain *voltdm); |
| @@ -125,6 +151,9 @@ struct omap_volt_data *omap_voltage_get_voltdata(struct voltagedomain *voltdm, | |||
| 125 | unsigned long volt); | 151 | unsigned long volt); |
| 126 | unsigned long omap_voltage_get_nom_volt(struct voltagedomain *voltdm); | 152 | unsigned long omap_voltage_get_nom_volt(struct voltagedomain *voltdm); |
| 127 | struct dentry *omap_voltage_get_dbgdir(struct voltagedomain *voltdm); | 153 | struct dentry *omap_voltage_get_dbgdir(struct voltagedomain *voltdm); |
| 154 | int __init omap_voltage_early_init(s16 prm_mod, s16 prm_irqst_mod, | ||
| 155 | struct omap_vdd_info *omap_vdd_array[], | ||
| 156 | u8 omap_vdd_count); | ||
| 128 | #ifdef CONFIG_PM | 157 | #ifdef CONFIG_PM |
| 129 | int omap_voltage_register_pmic(struct voltagedomain *voltdm, | 158 | int omap_voltage_register_pmic(struct voltagedomain *voltdm, |
| 130 | struct omap_volt_pmic_info *pmic_info); | 159 | struct omap_volt_pmic_info *pmic_info); |
diff --git a/arch/arm/mach-omap2/voltagedomains3xxx_data.c b/arch/arm/mach-omap2/voltagedomains3xxx_data.c new file mode 100644 index 00000000000..def230fd2fd --- /dev/null +++ b/arch/arm/mach-omap2/voltagedomains3xxx_data.c | |||
| @@ -0,0 +1,95 @@ | |||
| 1 | /* | ||
| 2 | * OMAP3 voltage domain data | ||
| 3 | * | ||
| 4 | * Copyright (C) 2007, 2010 Texas Instruments, Inc. | ||
| 5 | * Rajendra Nayak <rnayak@ti.com> | ||
| 6 | * Lesly A M <x0080970@ti.com> | ||
| 7 | * Thara Gopinath <thara@ti.com> | ||
| 8 | * | ||
| 9 | * Copyright (C) 2008, 2011 Nokia Corporation | ||
| 10 | * Kalle Jokiniemi | ||
| 11 | * Paul Walmsley | ||
| 12 | * | ||
| 13 | * This program is free software; you can redistribute it and/or modify | ||
| 14 | * it under the terms of the GNU General Public License version 2 as | ||
| 15 | * published by the Free Software Foundation. | ||
| 16 | */ | ||
| 17 | #include <linux/kernel.h> | ||
| 18 | #include <linux/err.h> | ||
| 19 | #include <linux/init.h> | ||
| 20 | |||
| 21 | #include <plat/common.h> | ||
| 22 | #include <plat/cpu.h> | ||
| 23 | |||
| 24 | #include "prm-regbits-34xx.h" | ||
| 25 | #include "omap_opp_data.h" | ||
| 26 | #include "voltage.h" | ||
| 27 | #include "vc.h" | ||
| 28 | #include "vp.h" | ||
| 29 | |||
| 30 | /* | ||
| 31 | * VDD data | ||
| 32 | */ | ||
| 33 | |||
| 34 | static const struct omap_vfsm_instance_data omap3_vdd1_vfsm_data = { | ||
| 35 | .voltsetup_reg = OMAP3_PRM_VOLTSETUP1_OFFSET, | ||
| 36 | .voltsetup_shift = OMAP3430_SETUP_TIME1_SHIFT, | ||
| 37 | .voltsetup_mask = OMAP3430_SETUP_TIME1_MASK, | ||
| 38 | }; | ||
| 39 | |||
| 40 | static struct omap_vdd_info omap3_vdd1_info = { | ||
| 41 | .vp_data = &omap3_vp1_data, | ||
| 42 | .vc_data = &omap3_vc1_data, | ||
| 43 | .vfsm = &omap3_vdd1_vfsm_data, | ||
| 44 | .voltdm = { | ||
| 45 | .name = "mpu", | ||
| 46 | }, | ||
| 47 | }; | ||
| 48 | |||
| 49 | static const struct omap_vfsm_instance_data omap3_vdd2_vfsm_data = { | ||
| 50 | .voltsetup_reg = OMAP3_PRM_VOLTSETUP1_OFFSET, | ||
| 51 | .voltsetup_shift = OMAP3430_SETUP_TIME2_SHIFT, | ||
| 52 | .voltsetup_mask = OMAP3430_SETUP_TIME2_MASK, | ||
| 53 | }; | ||
| 54 | |||
| 55 | static struct omap_vdd_info omap3_vdd2_info = { | ||
| 56 | .vp_data = &omap3_vp2_data, | ||
| 57 | .vc_data = &omap3_vc2_data, | ||
| 58 | .vfsm = &omap3_vdd2_vfsm_data, | ||
| 59 | .voltdm = { | ||
| 60 | .name = "core", | ||
| 61 | }, | ||
| 62 | }; | ||
| 63 | |||
| 64 | /* OMAP3 VDD structures */ | ||
| 65 | static struct omap_vdd_info *omap3_vdd_info[] = { | ||
| 66 | &omap3_vdd1_info, | ||
| 67 | &omap3_vdd2_info, | ||
| 68 | }; | ||
| 69 | |||
| 70 | /* OMAP3 specific voltage init functions */ | ||
| 71 | static int __init omap3xxx_voltage_early_init(void) | ||
| 72 | { | ||
| 73 | s16 prm_mod = OMAP3430_GR_MOD; | ||
| 74 | s16 prm_irqst_ocp_mod = OCP_MOD; | ||
| 75 | |||
| 76 | if (!cpu_is_omap34xx()) | ||
| 77 | return 0; | ||
| 78 | |||
| 79 | /* | ||
| 80 | * XXX Will depend on the process, validation, and binning | ||
| 81 | * for the currently-running IC | ||
| 82 | */ | ||
| 83 | if (cpu_is_omap3630()) { | ||
| 84 | omap3_vdd1_info.volt_data = omap36xx_vddmpu_volt_data; | ||
| 85 | omap3_vdd2_info.volt_data = omap36xx_vddcore_volt_data; | ||
| 86 | } else { | ||
| 87 | omap3_vdd1_info.volt_data = omap34xx_vddmpu_volt_data; | ||
| 88 | omap3_vdd2_info.volt_data = omap34xx_vddcore_volt_data; | ||
| 89 | } | ||
| 90 | |||
| 91 | return omap_voltage_early_init(prm_mod, prm_irqst_ocp_mod, | ||
| 92 | omap3_vdd_info, | ||
| 93 | ARRAY_SIZE(omap3_vdd_info)); | ||
| 94 | }; | ||
| 95 | core_initcall(omap3xxx_voltage_early_init); | ||
diff --git a/arch/arm/mach-omap2/voltagedomains44xx_data.c b/arch/arm/mach-omap2/voltagedomains44xx_data.c new file mode 100644 index 00000000000..cb64996de0e --- /dev/null +++ b/arch/arm/mach-omap2/voltagedomains44xx_data.c | |||
| @@ -0,0 +1,102 @@ | |||
| 1 | /* | ||
| 2 | * OMAP3/OMAP4 Voltage Management Routines | ||
| 3 | * | ||
| 4 | * Author: Thara Gopinath <thara@ti.com> | ||
| 5 | * | ||
| 6 | * Copyright (C) 2007 Texas Instruments, Inc. | ||
| 7 | * Rajendra Nayak <rnayak@ti.com> | ||
| 8 | * Lesly A M <x0080970@ti.com> | ||
| 9 | * | ||
| 10 | * Copyright (C) 2008 Nokia Corporation | ||
| 11 | * Kalle Jokiniemi | ||
| 12 | * | ||
| 13 | * Copyright (C) 2010 Texas Instruments, Inc. | ||
| 14 | * Thara Gopinath <thara@ti.com> | ||
| 15 | * | ||
| 16 | * This program is free software; you can redistribute it and/or modify | ||
| 17 | * it under the terms of the GNU General Public License version 2 as | ||
| 18 | * published by the Free Software Foundation. | ||
| 19 | */ | ||
| 20 | #include <linux/kernel.h> | ||
| 21 | #include <linux/err.h> | ||
| 22 | #include <linux/init.h> | ||
| 23 | |||
| 24 | #include <plat/common.h> | ||
| 25 | |||
| 26 | #include "prm-regbits-44xx.h" | ||
| 27 | #include "prm44xx.h" | ||
| 28 | #include "prcm44xx.h" | ||
| 29 | #include "prminst44xx.h" | ||
| 30 | #include "voltage.h" | ||
| 31 | #include "omap_opp_data.h" | ||
| 32 | #include "vc.h" | ||
| 33 | #include "vp.h" | ||
| 34 | |||
| 35 | static const struct omap_vfsm_instance_data omap4_vdd_mpu_vfsm_data = { | ||
| 36 | .voltsetup_reg = OMAP4_PRM_VOLTSETUP_MPU_RET_SLEEP_OFFSET, | ||
| 37 | }; | ||
| 38 | |||
| 39 | static struct omap_vdd_info omap4_vdd_mpu_info = { | ||
| 40 | .vp_data = &omap4_vp_mpu_data, | ||
| 41 | .vc_data = &omap4_vc_mpu_data, | ||
| 42 | .vfsm = &omap4_vdd_mpu_vfsm_data, | ||
| 43 | .voltdm = { | ||
| 44 | .name = "mpu", | ||
| 45 | }, | ||
| 46 | }; | ||
| 47 | |||
| 48 | static const struct omap_vfsm_instance_data omap4_vdd_iva_vfsm_data = { | ||
| 49 | .voltsetup_reg = OMAP4_PRM_VOLTSETUP_IVA_RET_SLEEP_OFFSET, | ||
| 50 | }; | ||
| 51 | |||
| 52 | static struct omap_vdd_info omap4_vdd_iva_info = { | ||
| 53 | .vp_data = &omap4_vp_iva_data, | ||
| 54 | .vc_data = &omap4_vc_iva_data, | ||
| 55 | .vfsm = &omap4_vdd_iva_vfsm_data, | ||
| 56 | .voltdm = { | ||
| 57 | .name = "iva", | ||
| 58 | }, | ||
| 59 | }; | ||
| 60 | |||
| 61 | static const struct omap_vfsm_instance_data omap4_vdd_core_vfsm_data = { | ||
| 62 | .voltsetup_reg = OMAP4_PRM_VOLTSETUP_CORE_RET_SLEEP_OFFSET, | ||
| 63 | }; | ||
| 64 | |||
| 65 | static struct omap_vdd_info omap4_vdd_core_info = { | ||
| 66 | .vp_data = &omap4_vp_core_data, | ||
| 67 | .vc_data = &omap4_vc_core_data, | ||
| 68 | .vfsm = &omap4_vdd_core_vfsm_data, | ||
| 69 | .voltdm = { | ||
| 70 | .name = "core", | ||
| 71 | }, | ||
| 72 | }; | ||
| 73 | |||
| 74 | /* OMAP4 VDD structures */ | ||
| 75 | static struct omap_vdd_info *omap4_vdd_info[] = { | ||
| 76 | &omap4_vdd_mpu_info, | ||
| 77 | &omap4_vdd_iva_info, | ||
| 78 | &omap4_vdd_core_info, | ||
| 79 | }; | ||
| 80 | |||
| 81 | /* OMAP4 specific voltage init functions */ | ||
| 82 | static int __init omap44xx_voltage_early_init(void) | ||
| 83 | { | ||
| 84 | s16 prm_mod = OMAP4430_PRM_DEVICE_INST; | ||
| 85 | s16 prm_irqst_ocp_mod = OMAP4430_PRM_OCP_SOCKET_INST; | ||
| 86 | |||
| 87 | if (!cpu_is_omap44xx()) | ||
| 88 | return 0; | ||
| 89 | |||
| 90 | /* | ||
| 91 | * XXX Will depend on the process, validation, and binning | ||
| 92 | * for the currently-running IC | ||
| 93 | */ | ||
| 94 | omap4_vdd_mpu_info.volt_data = omap44xx_vdd_mpu_volt_data; | ||
| 95 | omap4_vdd_iva_info.volt_data = omap44xx_vdd_iva_volt_data; | ||
| 96 | omap4_vdd_core_info.volt_data = omap44xx_vdd_core_volt_data; | ||
| 97 | |||
| 98 | return omap_voltage_early_init(prm_mod, prm_irqst_ocp_mod, | ||
| 99 | omap4_vdd_info, | ||
| 100 | ARRAY_SIZE(omap4_vdd_info)); | ||
| 101 | }; | ||
| 102 | core_initcall(omap44xx_voltage_early_init); | ||
diff --git a/arch/arm/mach-omap2/vp.h b/arch/arm/mach-omap2/vp.h new file mode 100644 index 00000000000..7ce134f7de7 --- /dev/null +++ b/arch/arm/mach-omap2/vp.h | |||
| @@ -0,0 +1,143 @@ | |||
| 1 | /* | ||
| 2 | * OMAP3/4 Voltage Processor (VP) structure and macro definitions | ||
| 3 | * | ||
| 4 | * Copyright (C) 2007, 2010 Texas Instruments, Inc. | ||
| 5 | * Rajendra Nayak <rnayak@ti.com> | ||
| 6 | * Lesly A M <x0080970@ti.com> | ||
| 7 | * Thara Gopinath <thara@ti.com> | ||
| 8 | * | ||
| 9 | * Copyright (C) 2008, 2011 Nokia Corporation | ||
| 10 | * Kalle Jokiniemi | ||
| 11 | * Paul Walmsley | ||
| 12 | * | ||
| 13 | * This program is free software; you can redistribute it and/or | ||
| 14 | * modify it under the terms of the GNU General Public License version | ||
| 15 | * 2 as published by the Free Software Foundation. | ||
| 16 | */ | ||
| 17 | #ifndef __ARCH_ARM_MACH_OMAP2_VP_H | ||
| 18 | #define __ARCH_ARM_MACH_OMAP2_VP_H | ||
| 19 | |||
| 20 | #include <linux/kernel.h> | ||
| 21 | |||
| 22 | /* XXX document */ | ||
| 23 | #define VP_IDLE_TIMEOUT 200 | ||
| 24 | #define VP_TRANXDONE_TIMEOUT 300 | ||
| 25 | |||
| 26 | |||
| 27 | /** | ||
| 28 | * struct omap_vp_common_data - register data common to all VDDs | ||
| 29 | * @vpconfig_errorgain_mask: ERRORGAIN bitmask in the PRM_VP*_CONFIG reg | ||
| 30 | * @vpconfig_initvoltage_mask: INITVOLTAGE bitmask in the PRM_VP*_CONFIG reg | ||
| 31 | * @vpconfig_timeouten_mask: TIMEOUT bitmask in the PRM_VP*_CONFIG reg | ||
| 32 | * @vpconfig_initvdd: INITVDD bitmask in the PRM_VP*_CONFIG reg | ||
| 33 | * @vpconfig_forceupdate: FORCEUPDATE bitmask in the PRM_VP*_CONFIG reg | ||
| 34 | * @vpconfig_vpenable: VPENABLE bitmask in the PRM_VP*_CONFIG reg | ||
| 35 | * @vpconfig_erroroffset_shift: ERROROFFSET field shift in PRM_VP*_CONFIG reg | ||
| 36 | * @vpconfig_errorgain_shift: ERRORGAIN field shift in PRM_VP*_CONFIG reg | ||
| 37 | * @vpconfig_initvoltage_shift: INITVOLTAGE field shift in PRM_VP*_CONFIG reg | ||
| 38 | * @vpconfig_stepmin_shift: VSTEPMIN field shift in the PRM_VP*_VSTEPMIN reg | ||
| 39 | * @vpconfig_smpswaittimemin_shift: SMPSWAITTIMEMIN field shift in PRM_VP*_VSTEPMIN reg | ||
| 40 | * @vpconfig_stepmax_shift: VSTEPMAX field shift in the PRM_VP*_VSTEPMAX reg | ||
| 41 | * @vpconfig_smpswaittimemax_shift: SMPSWAITTIMEMAX field shift in PRM_VP*_VSTEPMAX reg | ||
| 42 | * @vpconfig_vlimitto_vddmin_shift: VDDMIN field shift in PRM_VP*_VLIMITTO reg | ||
| 43 | * @vpconfig_vlimitto_vddmax_shift: VDDMAX field shift in PRM_VP*_VLIMITTO reg | ||
| 44 | * @vpconfig_vlimitto_timeout_shift: TIMEOUT field shift in PRM_VP*_VLIMITTO reg | ||
| 45 | * | ||
| 46 | * XXX It it not necessary to have both a mask and a shift for the same | ||
| 47 | * bitfield - remove one | ||
| 48 | * XXX Many of these fields are wrongly named -- e.g., vpconfig_smps* -- fix! | ||
| 49 | */ | ||
| 50 | struct omap_vp_common_data { | ||
| 51 | u32 vpconfig_errorgain_mask; | ||
| 52 | u32 vpconfig_initvoltage_mask; | ||
| 53 | u32 vpconfig_timeouten; | ||
| 54 | u32 vpconfig_initvdd; | ||
| 55 | u32 vpconfig_forceupdate; | ||
| 56 | u32 vpconfig_vpenable; | ||
| 57 | u8 vpconfig_erroroffset_shift; | ||
| 58 | u8 vpconfig_errorgain_shift; | ||
| 59 | u8 vpconfig_initvoltage_shift; | ||
| 60 | u8 vstepmin_stepmin_shift; | ||
| 61 | u8 vstepmin_smpswaittimemin_shift; | ||
| 62 | u8 vstepmax_stepmax_shift; | ||
| 63 | u8 vstepmax_smpswaittimemax_shift; | ||
| 64 | u8 vlimitto_vddmin_shift; | ||
| 65 | u8 vlimitto_vddmax_shift; | ||
| 66 | u8 vlimitto_timeout_shift; | ||
| 67 | }; | ||
| 68 | |||
| 69 | /** | ||
| 70 | * struct omap_vp_prm_irqst_data - PRM_IRQSTATUS_MPU.VP_TRANXDONE_ST data | ||
| 71 | * @prm_irqst_reg: reg offset for PRM_IRQSTATUS_MPU from top of PRM | ||
| 72 | * @tranxdone_status: VP_TRANXDONE_ST bitmask in PRM_IRQSTATUS_MPU reg | ||
| 73 | * | ||
| 74 | * XXX prm_irqst_reg does not belong here | ||
| 75 | * XXX Note that on OMAP3, VP_TRANXDONE interrupt may not work due to a | ||
| 76 | * hardware bug | ||
| 77 | * XXX This structure is probably not needed | ||
| 78 | */ | ||
| 79 | struct omap_vp_prm_irqst_data { | ||
| 80 | u8 prm_irqst_reg; | ||
| 81 | u32 tranxdone_status; | ||
| 82 | }; | ||
| 83 | |||
| 84 | /** | ||
| 85 | * struct omap_vp_instance_data - VP register offsets (per-VDD) | ||
| 86 | * @vp_common: pointer to struct omap_vp_common_data * for this SoC | ||
| 87 | * @prm_irqst_data: pointer to struct omap_vp_prm_irqst_data for this VDD | ||
| 88 | * @vpconfig: PRM_VP*_CONFIG reg offset from PRM start | ||
| 89 | * @vstepmin: PRM_VP*_VSTEPMIN reg offset from PRM start | ||
| 90 | * @vlimitto: PRM_VP*_VLIMITTO reg offset from PRM start | ||
| 91 | * @vstatus: PRM_VP*_VSTATUS reg offset from PRM start | ||
| 92 | * @voltage: PRM_VP*_VOLTAGE reg offset from PRM start | ||
| 93 | * | ||
| 94 | * XXX vp_common is probably not needed since it is per-SoC | ||
| 95 | */ | ||
| 96 | struct omap_vp_instance_data { | ||
| 97 | const struct omap_vp_common_data *vp_common; | ||
| 98 | const struct omap_vp_prm_irqst_data *prm_irqst_data; | ||
| 99 | u8 vpconfig; | ||
| 100 | u8 vstepmin; | ||
| 101 | u8 vstepmax; | ||
| 102 | u8 vlimitto; | ||
| 103 | u8 vstatus; | ||
| 104 | u8 voltage; | ||
| 105 | }; | ||
| 106 | |||
| 107 | /** | ||
| 108 | * struct omap_vp_runtime_data - VP data populated at runtime by code | ||
| 109 | * @vpconfig_erroroffset: value of ERROROFFSET bitfield in PRM_VP*_CONFIG | ||
| 110 | * @vpconfig_errorgain: value of ERRORGAIN bitfield in PRM_VP*_CONFIG | ||
| 111 | * @vstepmin_smpswaittimemin: value of SMPSWAITTIMEMIN bitfield in PRM_VP*_VSTEPMIN | ||
| 112 | * @vstepmax_smpswaittimemax: value of SMPSWAITTIMEMAX bitfield in PRM_VP*_VSTEPMAX | ||
| 113 | * @vlimitto_timeout: value of TIMEOUT bitfield in PRM_VP*_VLIMITTO | ||
| 114 | * @vstepmin_stepmin: value of VSTEPMIN bitfield in PRM_VP*_VSTEPMIN | ||
| 115 | * @vstepmax_stepmax: value of VSTEPMAX bitfield in PRM_VP*_VSTEPMAX | ||
| 116 | * @vlimitto_vddmin: value of VDDMIN bitfield in PRM_VP*_VLIMITTO | ||
| 117 | * @vlimitto_vddmax: value of VDDMAX bitfield in PRM_VP*_VLIMITTO | ||
| 118 | * | ||
| 119 | * XXX Is this structure really needed? Why not just program the | ||
| 120 | * device directly? They are in PRM space, therefore in the WKUP | ||
| 121 | * powerdomain, so register contents should not be lost in off-mode. | ||
| 122 | * XXX Some of these fields are incorrectly named, e.g., vstep* | ||
| 123 | */ | ||
| 124 | struct omap_vp_runtime_data { | ||
| 125 | u32 vpconfig_erroroffset; | ||
| 126 | u16 vpconfig_errorgain; | ||
| 127 | u16 vstepmin_smpswaittimemin; | ||
| 128 | u16 vstepmax_smpswaittimemax; | ||
| 129 | u16 vlimitto_timeout; | ||
| 130 | u8 vstepmin_stepmin; | ||
| 131 | u8 vstepmax_stepmax; | ||
| 132 | u8 vlimitto_vddmin; | ||
| 133 | u8 vlimitto_vddmax; | ||
| 134 | }; | ||
| 135 | |||
| 136 | extern struct omap_vp_instance_data omap3_vp1_data; | ||
| 137 | extern struct omap_vp_instance_data omap3_vp2_data; | ||
| 138 | |||
| 139 | extern struct omap_vp_instance_data omap4_vp_mpu_data; | ||
| 140 | extern struct omap_vp_instance_data omap4_vp_iva_data; | ||
| 141 | extern struct omap_vp_instance_data omap4_vp_core_data; | ||
| 142 | |||
| 143 | #endif | ||
diff --git a/arch/arm/mach-omap2/vp3xxx_data.c b/arch/arm/mach-omap2/vp3xxx_data.c new file mode 100644 index 00000000000..645217094e5 --- /dev/null +++ b/arch/arm/mach-omap2/vp3xxx_data.c | |||
| @@ -0,0 +1,82 @@ | |||
| 1 | /* | ||
| 2 | * OMAP3 Voltage Processor (VP) data | ||
| 3 | * | ||
| 4 | * Copyright (C) 2007, 2010 Texas Instruments, Inc. | ||
| 5 | * Rajendra Nayak <rnayak@ti.com> | ||
| 6 | * Lesly A M <x0080970@ti.com> | ||
| 7 | * Thara Gopinath <thara@ti.com> | ||
| 8 | * | ||
| 9 | * Copyright (C) 2008, 2011 Nokia Corporation | ||
| 10 | * Kalle Jokiniemi | ||
| 11 | * Paul Walmsley | ||
| 12 | * | ||
| 13 | * This program is free software; you can redistribute it and/or modify | ||
| 14 | * it under the terms of the GNU General Public License version 2 as | ||
| 15 | * published by the Free Software Foundation. | ||
| 16 | */ | ||
| 17 | |||
| 18 | #include <linux/io.h> | ||
| 19 | #include <linux/err.h> | ||
| 20 | #include <linux/init.h> | ||
| 21 | |||
| 22 | #include <plat/common.h> | ||
| 23 | |||
| 24 | #include "prm-regbits-34xx.h" | ||
| 25 | #include "voltage.h" | ||
| 26 | |||
| 27 | #include "vp.h" | ||
| 28 | |||
| 29 | /* | ||
| 30 | * VP data common to 34xx/36xx chips | ||
| 31 | * XXX This stuff presumably belongs in the vp3xxx.c or vp.c file. | ||
| 32 | */ | ||
| 33 | static const struct omap_vp_common_data omap3_vp_common = { | ||
| 34 | .vpconfig_erroroffset_shift = OMAP3430_ERROROFFSET_SHIFT, | ||
| 35 | .vpconfig_errorgain_mask = OMAP3430_ERRORGAIN_MASK, | ||
| 36 | .vpconfig_errorgain_shift = OMAP3430_ERRORGAIN_SHIFT, | ||
| 37 | .vpconfig_initvoltage_shift = OMAP3430_INITVOLTAGE_SHIFT, | ||
| 38 | .vpconfig_initvoltage_mask = OMAP3430_INITVOLTAGE_MASK, | ||
| 39 | .vpconfig_timeouten = OMAP3430_TIMEOUTEN_MASK, | ||
| 40 | .vpconfig_initvdd = OMAP3430_INITVDD_MASK, | ||
| 41 | .vpconfig_forceupdate = OMAP3430_FORCEUPDATE_MASK, | ||
| 42 | .vpconfig_vpenable = OMAP3430_VPENABLE_MASK, | ||
| 43 | .vstepmin_smpswaittimemin_shift = OMAP3430_SMPSWAITTIMEMIN_SHIFT, | ||
| 44 | .vstepmax_smpswaittimemax_shift = OMAP3430_SMPSWAITTIMEMAX_SHIFT, | ||
| 45 | .vstepmin_stepmin_shift = OMAP3430_VSTEPMIN_SHIFT, | ||
| 46 | .vstepmax_stepmax_shift = OMAP3430_VSTEPMAX_SHIFT, | ||
| 47 | .vlimitto_vddmin_shift = OMAP3430_VDDMIN_SHIFT, | ||
| 48 | .vlimitto_vddmax_shift = OMAP3430_VDDMAX_SHIFT, | ||
| 49 | .vlimitto_timeout_shift = OMAP3430_TIMEOUT_SHIFT, | ||
| 50 | }; | ||
| 51 | |||
| 52 | static const struct omap_vp_prm_irqst_data omap3_vp1_prm_irqst_data = { | ||
| 53 | .prm_irqst_reg = OMAP3_PRM_IRQSTATUS_MPU_OFFSET, | ||
| 54 | .tranxdone_status = OMAP3430_VP1_TRANXDONE_ST_MASK, | ||
| 55 | }; | ||
| 56 | |||
| 57 | struct omap_vp_instance_data omap3_vp1_data = { | ||
| 58 | .vp_common = &omap3_vp_common, | ||
| 59 | .vpconfig = OMAP3_PRM_VP1_CONFIG_OFFSET, | ||
| 60 | .vstepmin = OMAP3_PRM_VP1_VSTEPMIN_OFFSET, | ||
| 61 | .vstepmax = OMAP3_PRM_VP1_VSTEPMAX_OFFSET, | ||
| 62 | .vlimitto = OMAP3_PRM_VP1_VLIMITTO_OFFSET, | ||
| 63 | .vstatus = OMAP3_PRM_VP1_STATUS_OFFSET, | ||
| 64 | .voltage = OMAP3_PRM_VP1_VOLTAGE_OFFSET, | ||
| 65 | .prm_irqst_data = &omap3_vp1_prm_irqst_data, | ||
| 66 | }; | ||
| 67 | |||
| 68 | static const struct omap_vp_prm_irqst_data omap3_vp2_prm_irqst_data = { | ||
| 69 | .prm_irqst_reg = OMAP3_PRM_IRQSTATUS_MPU_OFFSET, | ||
| 70 | .tranxdone_status = OMAP3430_VP2_TRANXDONE_ST_MASK, | ||
| 71 | }; | ||
| 72 | |||
| 73 | struct omap_vp_instance_data omap3_vp2_data = { | ||
| 74 | .vp_common = &omap3_vp_common, | ||
| 75 | .vpconfig = OMAP3_PRM_VP2_CONFIG_OFFSET, | ||
| 76 | .vstepmin = OMAP3_PRM_VP2_VSTEPMIN_OFFSET, | ||
| 77 | .vstepmax = OMAP3_PRM_VP2_VSTEPMAX_OFFSET, | ||
| 78 | .vlimitto = OMAP3_PRM_VP2_VLIMITTO_OFFSET, | ||
| 79 | .vstatus = OMAP3_PRM_VP2_STATUS_OFFSET, | ||
| 80 | .voltage = OMAP3_PRM_VP2_VOLTAGE_OFFSET, | ||
| 81 | .prm_irqst_data = &omap3_vp2_prm_irqst_data, | ||
| 82 | }; | ||
diff --git a/arch/arm/mach-omap2/vp44xx_data.c b/arch/arm/mach-omap2/vp44xx_data.c new file mode 100644 index 00000000000..65d1ad63800 --- /dev/null +++ b/arch/arm/mach-omap2/vp44xx_data.c | |||
| @@ -0,0 +1,100 @@ | |||
| 1 | /* | ||
| 2 | * OMAP3 Voltage Processor (VP) data | ||
| 3 | * | ||
| 4 | * Copyright (C) 2007, 2010 Texas Instruments, Inc. | ||
| 5 | * Rajendra Nayak <rnayak@ti.com> | ||
| 6 | * Lesly A M <x0080970@ti.com> | ||
| 7 | * Thara Gopinath <thara@ti.com> | ||
| 8 | * | ||
| 9 | * Copyright (C) 2008, 2011 Nokia Corporation | ||
| 10 | * Kalle Jokiniemi | ||
| 11 | * Paul Walmsley | ||
| 12 | * | ||
| 13 | * This program is free software; you can redistribute it and/or modify | ||
| 14 | * it under the terms of the GNU General Public License version 2 as | ||
| 15 | * published by the Free Software Foundation. | ||
| 16 | */ | ||
| 17 | |||
| 18 | #include <linux/io.h> | ||
| 19 | #include <linux/err.h> | ||
| 20 | #include <linux/init.h> | ||
| 21 | |||
| 22 | #include <plat/common.h> | ||
| 23 | |||
| 24 | #include "prm44xx.h" | ||
| 25 | #include "prm-regbits-44xx.h" | ||
| 26 | #include "voltage.h" | ||
| 27 | |||
| 28 | #include "vp.h" | ||
| 29 | |||
| 30 | /* | ||
| 31 | * VP data common to 44xx chips | ||
| 32 | * XXX This stuff presumably belongs in the vp44xx.c or vp.c file. | ||
| 33 | */ | ||
| 34 | static const struct omap_vp_common_data omap4_vp_common = { | ||
| 35 | .vpconfig_erroroffset_shift = OMAP4430_ERROROFFSET_SHIFT, | ||
| 36 | .vpconfig_errorgain_mask = OMAP4430_ERRORGAIN_MASK, | ||
| 37 | .vpconfig_errorgain_shift = OMAP4430_ERRORGAIN_SHIFT, | ||
| 38 | .vpconfig_initvoltage_shift = OMAP4430_INITVOLTAGE_SHIFT, | ||
| 39 | .vpconfig_initvoltage_mask = OMAP4430_INITVOLTAGE_MASK, | ||
| 40 | .vpconfig_timeouten = OMAP4430_TIMEOUTEN_MASK, | ||
| 41 | .vpconfig_initvdd = OMAP4430_INITVDD_MASK, | ||
| 42 | .vpconfig_forceupdate = OMAP4430_FORCEUPDATE_MASK, | ||
| 43 | .vpconfig_vpenable = OMAP4430_VPENABLE_MASK, | ||
| 44 | .vstepmin_smpswaittimemin_shift = OMAP4430_SMPSWAITTIMEMIN_SHIFT, | ||
| 45 | .vstepmax_smpswaittimemax_shift = OMAP4430_SMPSWAITTIMEMAX_SHIFT, | ||
| 46 | .vstepmin_stepmin_shift = OMAP4430_VSTEPMIN_SHIFT, | ||
| 47 | .vstepmax_stepmax_shift = OMAP4430_VSTEPMAX_SHIFT, | ||
| 48 | .vlimitto_vddmin_shift = OMAP4430_VDDMIN_SHIFT, | ||
| 49 | .vlimitto_vddmax_shift = OMAP4430_VDDMAX_SHIFT, | ||
| 50 | .vlimitto_timeout_shift = OMAP4430_TIMEOUT_SHIFT, | ||
| 51 | }; | ||
| 52 | |||
| 53 | static const struct omap_vp_prm_irqst_data omap4_vp_mpu_prm_irqst_data = { | ||
| 54 | .prm_irqst_reg = OMAP4_PRM_IRQSTATUS_MPU_2_OFFSET, | ||
| 55 | .tranxdone_status = OMAP4430_VP_MPU_TRANXDONE_ST_MASK, | ||
| 56 | }; | ||
| 57 | |||
| 58 | struct omap_vp_instance_data omap4_vp_mpu_data = { | ||
| 59 | .vp_common = &omap4_vp_common, | ||
| 60 | .vpconfig = OMAP4_PRM_VP_MPU_CONFIG_OFFSET, | ||
| 61 | .vstepmin = OMAP4_PRM_VP_MPU_VSTEPMIN_OFFSET, | ||
| 62 | .vstepmax = OMAP4_PRM_VP_MPU_VSTEPMAX_OFFSET, | ||
| 63 | .vlimitto = OMAP4_PRM_VP_MPU_VLIMITTO_OFFSET, | ||
| 64 | .vstatus = OMAP4_PRM_VP_MPU_STATUS_OFFSET, | ||
| 65 | .voltage = OMAP4_PRM_VP_MPU_VOLTAGE_OFFSET, | ||
| 66 | .prm_irqst_data = &omap4_vp_mpu_prm_irqst_data, | ||
| 67 | }; | ||
| 68 | |||
| 69 | static const struct omap_vp_prm_irqst_data omap4_vp_iva_prm_irqst_data = { | ||
| 70 | .prm_irqst_reg = OMAP4_PRM_IRQSTATUS_MPU_OFFSET, | ||
| 71 | .tranxdone_status = OMAP4430_VP_IVA_TRANXDONE_ST_MASK, | ||
| 72 | }; | ||
| 73 | |||
| 74 | struct omap_vp_instance_data omap4_vp_iva_data = { | ||
| 75 | .vp_common = &omap4_vp_common, | ||
| 76 | .vpconfig = OMAP4_PRM_VP_IVA_CONFIG_OFFSET, | ||
| 77 | .vstepmin = OMAP4_PRM_VP_IVA_VSTEPMIN_OFFSET, | ||
| 78 | .vstepmax = OMAP4_PRM_VP_IVA_VSTEPMAX_OFFSET, | ||
| 79 | .vlimitto = OMAP4_PRM_VP_IVA_VLIMITTO_OFFSET, | ||
| 80 | .vstatus = OMAP4_PRM_VP_IVA_STATUS_OFFSET, | ||
| 81 | .voltage = OMAP4_PRM_VP_IVA_VOLTAGE_OFFSET, | ||
| 82 | .prm_irqst_data = &omap4_vp_iva_prm_irqst_data, | ||
| 83 | }; | ||
| 84 | |||
| 85 | static const struct omap_vp_prm_irqst_data omap4_vp_core_prm_irqst_data = { | ||
| 86 | .prm_irqst_reg = OMAP4_PRM_IRQSTATUS_MPU_OFFSET, | ||
| 87 | .tranxdone_status = OMAP4430_VP_CORE_TRANXDONE_ST_MASK, | ||
| 88 | }; | ||
| 89 | |||
| 90 | struct omap_vp_instance_data omap4_vp_core_data = { | ||
| 91 | .vp_common = &omap4_vp_common, | ||
| 92 | .vpconfig = OMAP4_PRM_VP_CORE_CONFIG_OFFSET, | ||
| 93 | .vstepmin = OMAP4_PRM_VP_CORE_VSTEPMIN_OFFSET, | ||
| 94 | .vstepmax = OMAP4_PRM_VP_CORE_VSTEPMAX_OFFSET, | ||
| 95 | .vlimitto = OMAP4_PRM_VP_CORE_VLIMITTO_OFFSET, | ||
| 96 | .vstatus = OMAP4_PRM_VP_CORE_STATUS_OFFSET, | ||
| 97 | .voltage = OMAP4_PRM_VP_CORE_VOLTAGE_OFFSET, | ||
| 98 | .prm_irqst_data = &omap4_vp_core_prm_irqst_data, | ||
| 99 | }; | ||
| 100 | |||
diff --git a/arch/arm/mach-pxa/pxa25x.c b/arch/arm/mach-pxa/pxa25x.c index fbc5b775f89..b166b1d845d 100644 --- a/arch/arm/mach-pxa/pxa25x.c +++ b/arch/arm/mach-pxa/pxa25x.c | |||
| @@ -347,6 +347,7 @@ static struct platform_device *pxa25x_devices[] __initdata = { | |||
| 347 | &pxa25x_device_assp, | 347 | &pxa25x_device_assp, |
| 348 | &pxa25x_device_pwm0, | 348 | &pxa25x_device_pwm0, |
| 349 | &pxa25x_device_pwm1, | 349 | &pxa25x_device_pwm1, |
| 350 | &pxa_device_asoc_platform, | ||
| 350 | }; | 351 | }; |
| 351 | 352 | ||
| 352 | static struct sys_device pxa25x_sysdev[] = { | 353 | static struct sys_device pxa25x_sysdev[] = { |
diff --git a/arch/arm/mach-pxa/tosa-bt.c b/arch/arm/mach-pxa/tosa-bt.c index c31e601eb49..b9b1e5c2b29 100644 --- a/arch/arm/mach-pxa/tosa-bt.c +++ b/arch/arm/mach-pxa/tosa-bt.c | |||
| @@ -81,8 +81,6 @@ static int tosa_bt_probe(struct platform_device *dev) | |||
| 81 | goto err_rfk_alloc; | 81 | goto err_rfk_alloc; |
| 82 | } | 82 | } |
| 83 | 83 | ||
| 84 | rfkill_set_led_trigger_name(rfk, "tosa-bt"); | ||
| 85 | |||
| 86 | rc = rfkill_register(rfk); | 84 | rc = rfkill_register(rfk); |
| 87 | if (rc) | 85 | if (rc) |
| 88 | goto err_rfkill; | 86 | goto err_rfkill; |
diff --git a/arch/arm/mach-pxa/tosa.c b/arch/arm/mach-pxa/tosa.c index af152e70cfc..f2582ec300d 100644 --- a/arch/arm/mach-pxa/tosa.c +++ b/arch/arm/mach-pxa/tosa.c | |||
| @@ -875,6 +875,11 @@ static struct platform_device sharpsl_rom_device = { | |||
| 875 | .dev.platform_data = &sharpsl_rom_data, | 875 | .dev.platform_data = &sharpsl_rom_data, |
| 876 | }; | 876 | }; |
| 877 | 877 | ||
| 878 | static struct platform_device wm9712_device = { | ||
| 879 | .name = "wm9712-codec", | ||
| 880 | .id = -1, | ||
| 881 | }; | ||
| 882 | |||
| 878 | static struct platform_device *devices[] __initdata = { | 883 | static struct platform_device *devices[] __initdata = { |
| 879 | &tosascoop_device, | 884 | &tosascoop_device, |
| 880 | &tosascoop_jc_device, | 885 | &tosascoop_jc_device, |
| @@ -885,6 +890,7 @@ static struct platform_device *devices[] __initdata = { | |||
| 885 | &tosaled_device, | 890 | &tosaled_device, |
| 886 | &tosa_bt_device, | 891 | &tosa_bt_device, |
| 887 | &sharpsl_rom_device, | 892 | &sharpsl_rom_device, |
| 893 | &wm9712_device, | ||
| 888 | }; | 894 | }; |
| 889 | 895 | ||
| 890 | static void tosa_poweroff(void) | 896 | static void tosa_poweroff(void) |
diff --git a/arch/arm/mach-s3c2440/Kconfig b/arch/arm/mach-s3c2440/Kconfig index a0cb2581894..50825a3f91c 100644 --- a/arch/arm/mach-s3c2440/Kconfig +++ b/arch/arm/mach-s3c2440/Kconfig | |||
| @@ -99,6 +99,7 @@ config MACH_NEO1973_GTA02 | |||
| 99 | select POWER_SUPPLY | 99 | select POWER_SUPPLY |
| 100 | select MACH_NEO1973 | 100 | select MACH_NEO1973 |
| 101 | select S3C2410_PWM | 101 | select S3C2410_PWM |
| 102 | select S3C_DEV_USB_HOST | ||
| 102 | help | 103 | help |
| 103 | Say Y here if you are using the Openmoko GTA02 / Freerunner GSM Phone | 104 | Say Y here if you are using the Openmoko GTA02 / Freerunner GSM Phone |
| 104 | 105 | ||
diff --git a/arch/arm/mach-s3c2440/include/mach/gta02.h b/arch/arm/mach-s3c2440/include/mach/gta02.h index 953331d8d56..3a56a229cac 100644 --- a/arch/arm/mach-s3c2440/include/mach/gta02.h +++ b/arch/arm/mach-s3c2440/include/mach/gta02.h | |||
| @@ -44,19 +44,19 @@ | |||
| 44 | #define GTA02v3_GPIO_nUSB_FLT S3C2410_GPG(10) /* v3 + v4 only */ | 44 | #define GTA02v3_GPIO_nUSB_FLT S3C2410_GPG(10) /* v3 + v4 only */ |
| 45 | #define GTA02v3_GPIO_nGSM_OC S3C2410_GPG(11) /* v3 + v4 only */ | 45 | #define GTA02v3_GPIO_nGSM_OC S3C2410_GPG(11) /* v3 + v4 only */ |
| 46 | 46 | ||
| 47 | #define GTA02_GPIO_AMP_SHUT S3C2440_GPJ1 /* v2 + v3 + v4 only */ | 47 | #define GTA02_GPIO_AMP_SHUT S3C2410_GPJ(1) /* v2 + v3 + v4 only */ |
| 48 | #define GTA02v1_GPIO_WLAN_GPIO10 S3C2440_GPJ2 | 48 | #define GTA02v1_GPIO_WLAN_GPIO10 S3C2410_GPJ(2) |
| 49 | #define GTA02_GPIO_HP_IN S3C2440_GPJ2 /* v2 + v3 + v4 only */ | 49 | #define GTA02_GPIO_HP_IN S3C2410_GPJ(2) /* v2 + v3 + v4 only */ |
| 50 | #define GTA02_GPIO_INT0 S3C2440_GPJ3 /* v2 + v3 + v4 only */ | 50 | #define GTA02_GPIO_INT0 S3C2410_GPJ(3) /* v2 + v3 + v4 only */ |
| 51 | #define GTA02_GPIO_nGSM_EN S3C2440_GPJ4 | 51 | #define GTA02_GPIO_nGSM_EN S3C2410_GPJ(4) |
| 52 | #define GTA02_GPIO_3D_RESET S3C2440_GPJ5 | 52 | #define GTA02_GPIO_3D_RESET S3C2410_GPJ(5) |
| 53 | #define GTA02_GPIO_nDL_GSM S3C2440_GPJ6 /* v4 + v5 only */ | 53 | #define GTA02_GPIO_nDL_GSM S3C2410_GPJ(6) /* v4 + v5 only */ |
| 54 | #define GTA02_GPIO_WLAN_GPIO0 S3C2440_GPJ7 | 54 | #define GTA02_GPIO_WLAN_GPIO0 S3C2410_GPJ(7) |
| 55 | #define GTA02v1_GPIO_BAT_ID S3C2440_GPJ8 | 55 | #define GTA02v1_GPIO_BAT_ID S3C2410_GPJ(8) |
| 56 | #define GTA02_GPIO_KEEPACT S3C2440_GPJ8 | 56 | #define GTA02_GPIO_KEEPACT S3C2410_GPJ(8) |
| 57 | #define GTA02v1_GPIO_HP_IN S3C2440_GPJ10 | 57 | #define GTA02v1_GPIO_HP_IN S3C2410_GPJ(10) |
| 58 | #define GTA02_CHIP_PWD S3C2440_GPJ11 /* v2 + v3 + v4 only */ | 58 | #define GTA02_CHIP_PWD S3C2410_GPJ(11) /* v2 + v3 + v4 only */ |
| 59 | #define GTA02_GPIO_nWLAN_RESET S3C2440_GPJ12 /* v2 + v3 + v4 only */ | 59 | #define GTA02_GPIO_nWLAN_RESET S3C2410_GPJ(12) /* v2 + v3 + v4 only */ |
| 60 | 60 | ||
| 61 | #define GTA02_IRQ_GSENSOR_1 IRQ_EINT0 | 61 | #define GTA02_IRQ_GSENSOR_1 IRQ_EINT0 |
| 62 | #define GTA02_IRQ_MODEM IRQ_EINT1 | 62 | #define GTA02_IRQ_MODEM IRQ_EINT1 |
diff --git a/arch/arm/mach-s3c64xx/clock.c b/arch/arm/mach-s3c64xx/clock.c index dd378206450..fdfc4d5e37a 100644 --- a/arch/arm/mach-s3c64xx/clock.c +++ b/arch/arm/mach-s3c64xx/clock.c | |||
| @@ -151,6 +151,12 @@ static struct clk init_clocks_off[] = { | |||
| 151 | .enable = s3c64xx_pclk_ctrl, | 151 | .enable = s3c64xx_pclk_ctrl, |
| 152 | .ctrlbit = S3C_CLKCON_PCLK_IIC, | 152 | .ctrlbit = S3C_CLKCON_PCLK_IIC, |
| 153 | }, { | 153 | }, { |
| 154 | .name = "i2c", | ||
| 155 | .id = 1, | ||
| 156 | .parent = &clk_p, | ||
| 157 | .enable = s3c64xx_pclk_ctrl, | ||
| 158 | .ctrlbit = S3C6410_CLKCON_PCLK_I2C1, | ||
| 159 | }, { | ||
| 154 | .name = "iis", | 160 | .name = "iis", |
| 155 | .id = 0, | 161 | .id = 0, |
| 156 | .parent = &clk_p, | 162 | .parent = &clk_p, |
diff --git a/arch/arm/mach-s3c64xx/dma.c b/arch/arm/mach-s3c64xx/dma.c index 135db1b4125..c35585cf8c4 100644 --- a/arch/arm/mach-s3c64xx/dma.c +++ b/arch/arm/mach-s3c64xx/dma.c | |||
| @@ -690,12 +690,12 @@ static int s3c64xx_dma_init1(int chno, enum dma_ch chbase, | |||
| 690 | 690 | ||
| 691 | regptr = regs + PL080_Cx_BASE(0); | 691 | regptr = regs + PL080_Cx_BASE(0); |
| 692 | 692 | ||
| 693 | for (ch = 0; ch < 8; ch++, chno++, chptr++) { | 693 | for (ch = 0; ch < 8; ch++, chptr++) { |
| 694 | printk(KERN_INFO "%s: registering DMA %d (%p)\n", | 694 | pr_debug("%s: registering DMA %d (%p)\n", |
| 695 | __func__, chno, regptr); | 695 | __func__, chno + ch, regptr); |
| 696 | 696 | ||
| 697 | chptr->bit = 1 << ch; | 697 | chptr->bit = 1 << ch; |
| 698 | chptr->number = chno; | 698 | chptr->number = chno + ch; |
| 699 | chptr->dmac = dmac; | 699 | chptr->dmac = dmac; |
| 700 | chptr->regs = regptr; | 700 | chptr->regs = regptr; |
| 701 | regptr += PL080_Cx_STRIDE; | 701 | regptr += PL080_Cx_STRIDE; |
| @@ -704,7 +704,8 @@ static int s3c64xx_dma_init1(int chno, enum dma_ch chbase, | |||
| 704 | /* for the moment, permanently enable the controller */ | 704 | /* for the moment, permanently enable the controller */ |
| 705 | writel(PL080_CONFIG_ENABLE, regs + PL080_CONFIG); | 705 | writel(PL080_CONFIG_ENABLE, regs + PL080_CONFIG); |
| 706 | 706 | ||
| 707 | printk(KERN_INFO "PL080: IRQ %d, at %p\n", irq, regs); | 707 | printk(KERN_INFO "PL080: IRQ %d, at %p, channels %d..%d\n", |
| 708 | irq, regs, chno, chno+8); | ||
| 708 | 709 | ||
| 709 | return 0; | 710 | return 0; |
| 710 | 711 | ||
diff --git a/arch/arm/mach-s3c64xx/gpiolib.c b/arch/arm/mach-s3c64xx/gpiolib.c index fd99a82e82c..92b09085caa 100644 --- a/arch/arm/mach-s3c64xx/gpiolib.c +++ b/arch/arm/mach-s3c64xx/gpiolib.c | |||
| @@ -72,7 +72,7 @@ static struct s3c_gpio_cfg gpio_4bit_cfg_eint0011 = { | |||
| 72 | .get_pull = s3c_gpio_getpull_updown, | 72 | .get_pull = s3c_gpio_getpull_updown, |
| 73 | }; | 73 | }; |
| 74 | 74 | ||
| 75 | int s3c64xx_gpio2int_gpm(struct gpio_chip *chip, unsigned pin) | 75 | static int s3c64xx_gpio2int_gpm(struct gpio_chip *chip, unsigned pin) |
| 76 | { | 76 | { |
| 77 | return pin < 5 ? IRQ_EINT(23) + pin : -ENXIO; | 77 | return pin < 5 ? IRQ_EINT(23) + pin : -ENXIO; |
| 78 | } | 78 | } |
| @@ -138,7 +138,7 @@ static struct s3c_gpio_chip gpio_4bit[] = { | |||
| 138 | }, | 138 | }, |
| 139 | }; | 139 | }; |
| 140 | 140 | ||
| 141 | int s3c64xx_gpio2int_gpl(struct gpio_chip *chip, unsigned pin) | 141 | static int s3c64xx_gpio2int_gpl(struct gpio_chip *chip, unsigned pin) |
| 142 | { | 142 | { |
| 143 | return pin >= 8 ? IRQ_EINT(16) + pin - 8 : -ENXIO; | 143 | return pin >= 8 ? IRQ_EINT(16) + pin - 8 : -ENXIO; |
| 144 | } | 144 | } |
diff --git a/arch/arm/mach-s3c64xx/mach-smdk6410.c b/arch/arm/mach-s3c64xx/mach-smdk6410.c index e85192a86fb..a80a3163dd3 100644 --- a/arch/arm/mach-s3c64xx/mach-smdk6410.c +++ b/arch/arm/mach-s3c64xx/mach-smdk6410.c | |||
| @@ -28,6 +28,7 @@ | |||
| 28 | #include <linux/delay.h> | 28 | #include <linux/delay.h> |
| 29 | #include <linux/smsc911x.h> | 29 | #include <linux/smsc911x.h> |
| 30 | #include <linux/regulator/fixed.h> | 30 | #include <linux/regulator/fixed.h> |
| 31 | #include <linux/regulator/machine.h> | ||
| 31 | 32 | ||
| 32 | #ifdef CONFIG_SMDK6410_WM1190_EV1 | 33 | #ifdef CONFIG_SMDK6410_WM1190_EV1 |
| 33 | #include <linux/mfd/wm8350/core.h> | 34 | #include <linux/mfd/wm8350/core.h> |
| @@ -351,7 +352,7 @@ static struct regulator_init_data smdk6410_vddpll = { | |||
| 351 | /* VDD_UH_MMC, LDO5 on J5 */ | 352 | /* VDD_UH_MMC, LDO5 on J5 */ |
| 352 | static struct regulator_init_data smdk6410_vdduh_mmc = { | 353 | static struct regulator_init_data smdk6410_vdduh_mmc = { |
| 353 | .constraints = { | 354 | .constraints = { |
| 354 | .name = "PVDD_UH/PVDD_MMC", | 355 | .name = "PVDD_UH+PVDD_MMC", |
| 355 | .always_on = 1, | 356 | .always_on = 1, |
| 356 | }, | 357 | }, |
| 357 | }; | 358 | }; |
| @@ -417,7 +418,7 @@ static struct regulator_init_data smdk6410_vddaudio = { | |||
| 417 | /* S3C64xx internal logic & PLL */ | 418 | /* S3C64xx internal logic & PLL */ |
| 418 | static struct regulator_init_data wm8350_dcdc1_data = { | 419 | static struct regulator_init_data wm8350_dcdc1_data = { |
| 419 | .constraints = { | 420 | .constraints = { |
| 420 | .name = "PVDD_INT/PVDD_PLL", | 421 | .name = "PVDD_INT+PVDD_PLL", |
| 421 | .min_uV = 1200000, | 422 | .min_uV = 1200000, |
| 422 | .max_uV = 1200000, | 423 | .max_uV = 1200000, |
| 423 | .always_on = 1, | 424 | .always_on = 1, |
| @@ -452,7 +453,7 @@ static struct regulator_consumer_supply wm8350_dcdc4_consumers[] = { | |||
| 452 | 453 | ||
| 453 | static struct regulator_init_data wm8350_dcdc4_data = { | 454 | static struct regulator_init_data wm8350_dcdc4_data = { |
| 454 | .constraints = { | 455 | .constraints = { |
| 455 | .name = "PVDD_HI/PVDD_EXT/PVDD_SYS/PVCCM2MTV", | 456 | .name = "PVDD_HI+PVDD_EXT+PVDD_SYS+PVCCM2MTV", |
| 456 | .min_uV = 3000000, | 457 | .min_uV = 3000000, |
| 457 | .max_uV = 3000000, | 458 | .max_uV = 3000000, |
| 458 | .always_on = 1, | 459 | .always_on = 1, |
| @@ -464,7 +465,7 @@ static struct regulator_init_data wm8350_dcdc4_data = { | |||
| 464 | /* OTGi/1190-EV1 HPVDD & AVDD */ | 465 | /* OTGi/1190-EV1 HPVDD & AVDD */ |
| 465 | static struct regulator_init_data wm8350_ldo4_data = { | 466 | static struct regulator_init_data wm8350_ldo4_data = { |
| 466 | .constraints = { | 467 | .constraints = { |
| 467 | .name = "PVDD_OTGI/HPVDD/AVDD", | 468 | .name = "PVDD_OTGI+HPVDD+AVDD", |
| 468 | .min_uV = 1200000, | 469 | .min_uV = 1200000, |
| 469 | .max_uV = 1200000, | 470 | .max_uV = 1200000, |
| 470 | .apply_uV = 1, | 471 | .apply_uV = 1, |
| @@ -552,7 +553,7 @@ static struct wm831x_backlight_pdata wm1192_backlight_pdata = { | |||
| 552 | 553 | ||
| 553 | static struct regulator_init_data wm1192_dcdc3 = { | 554 | static struct regulator_init_data wm1192_dcdc3 = { |
| 554 | .constraints = { | 555 | .constraints = { |
| 555 | .name = "PVDD_MEM/PVDD_GPS", | 556 | .name = "PVDD_MEM+PVDD_GPS", |
| 556 | .always_on = 1, | 557 | .always_on = 1, |
| 557 | }, | 558 | }, |
| 558 | }; | 559 | }; |
| @@ -563,7 +564,7 @@ static struct regulator_consumer_supply wm1192_ldo1_consumers[] = { | |||
| 563 | 564 | ||
| 564 | static struct regulator_init_data wm1192_ldo1 = { | 565 | static struct regulator_init_data wm1192_ldo1 = { |
| 565 | .constraints = { | 566 | .constraints = { |
| 566 | .name = "PVDD_LCD/PVDD_EXT", | 567 | .name = "PVDD_LCD+PVDD_EXT", |
| 567 | .always_on = 1, | 568 | .always_on = 1, |
| 568 | }, | 569 | }, |
| 569 | .consumer_supplies = wm1192_ldo1_consumers, | 570 | .consumer_supplies = wm1192_ldo1_consumers, |
diff --git a/arch/arm/mach-s3c64xx/setup-keypad.c b/arch/arm/mach-s3c64xx/setup-keypad.c index f8ed0d22db7..1d4d0ee9e87 100644 --- a/arch/arm/mach-s3c64xx/setup-keypad.c +++ b/arch/arm/mach-s3c64xx/setup-keypad.c | |||
| @@ -17,7 +17,7 @@ | |||
| 17 | void samsung_keypad_cfg_gpio(unsigned int rows, unsigned int cols) | 17 | void samsung_keypad_cfg_gpio(unsigned int rows, unsigned int cols) |
| 18 | { | 18 | { |
| 19 | /* Set all the necessary GPK pins to special-function 3: KP_ROW[x] */ | 19 | /* Set all the necessary GPK pins to special-function 3: KP_ROW[x] */ |
| 20 | s3c_gpio_cfgrange_nopull(S3C64XX_GPK(8), 8 + rows, S3C_GPIO_SFN(3)); | 20 | s3c_gpio_cfgrange_nopull(S3C64XX_GPK(8), rows, S3C_GPIO_SFN(3)); |
| 21 | 21 | ||
| 22 | /* Set all the necessary GPL pins to special-function 3: KP_COL[x] */ | 22 | /* Set all the necessary GPL pins to special-function 3: KP_COL[x] */ |
| 23 | s3c_gpio_cfgrange_nopull(S3C64XX_GPL(0), cols, S3C_GPIO_SFN(3)); | 23 | s3c_gpio_cfgrange_nopull(S3C64XX_GPL(0), cols, S3C_GPIO_SFN(3)); |
diff --git a/arch/arm/mach-s3c64xx/setup-sdhci.c b/arch/arm/mach-s3c64xx/setup-sdhci.c index 1a942037c4e..f344a222bc8 100644 --- a/arch/arm/mach-s3c64xx/setup-sdhci.c +++ b/arch/arm/mach-s3c64xx/setup-sdhci.c | |||
| @@ -56,7 +56,7 @@ void s3c6400_setup_sdhci_cfg_card(struct platform_device *dev, | |||
| 56 | else | 56 | else |
| 57 | ctrl3 = (S3C_SDHCI_CTRL3_FCSEL1 | S3C_SDHCI_CTRL3_FCSEL0); | 57 | ctrl3 = (S3C_SDHCI_CTRL3_FCSEL1 | S3C_SDHCI_CTRL3_FCSEL0); |
| 58 | 58 | ||
| 59 | printk(KERN_INFO "%s: CTRL 2=%08x, 3=%08x\n", __func__, ctrl2, ctrl3); | 59 | pr_debug("%s: CTRL 2=%08x, 3=%08x\n", __func__, ctrl2, ctrl3); |
| 60 | writel(ctrl2, r + S3C_SDHCI_CONTROL2); | 60 | writel(ctrl2, r + S3C_SDHCI_CONTROL2); |
| 61 | writel(ctrl3, r + S3C_SDHCI_CONTROL3); | 61 | writel(ctrl3, r + S3C_SDHCI_CONTROL3); |
| 62 | } | 62 | } |
diff --git a/arch/arm/mach-s5p64x0/include/mach/gpio.h b/arch/arm/mach-s5p64x0/include/mach/gpio.h index 5486c8f01f1..adb5f298ead 100644 --- a/arch/arm/mach-s5p64x0/include/mach/gpio.h +++ b/arch/arm/mach-s5p64x0/include/mach/gpio.h | |||
| @@ -23,7 +23,7 @@ | |||
| 23 | #define S5P6440_GPIO_A_NR (6) | 23 | #define S5P6440_GPIO_A_NR (6) |
| 24 | #define S5P6440_GPIO_B_NR (7) | 24 | #define S5P6440_GPIO_B_NR (7) |
| 25 | #define S5P6440_GPIO_C_NR (8) | 25 | #define S5P6440_GPIO_C_NR (8) |
| 26 | #define S5P6440_GPIO_F_NR (2) | 26 | #define S5P6440_GPIO_F_NR (16) |
| 27 | #define S5P6440_GPIO_G_NR (7) | 27 | #define S5P6440_GPIO_G_NR (7) |
| 28 | #define S5P6440_GPIO_H_NR (10) | 28 | #define S5P6440_GPIO_H_NR (10) |
| 29 | #define S5P6440_GPIO_I_NR (16) | 29 | #define S5P6440_GPIO_I_NR (16) |
| @@ -36,7 +36,7 @@ | |||
| 36 | #define S5P6450_GPIO_B_NR (7) | 36 | #define S5P6450_GPIO_B_NR (7) |
| 37 | #define S5P6450_GPIO_C_NR (8) | 37 | #define S5P6450_GPIO_C_NR (8) |
| 38 | #define S5P6450_GPIO_D_NR (8) | 38 | #define S5P6450_GPIO_D_NR (8) |
| 39 | #define S5P6450_GPIO_F_NR (2) | 39 | #define S5P6450_GPIO_F_NR (16) |
| 40 | #define S5P6450_GPIO_G_NR (14) | 40 | #define S5P6450_GPIO_G_NR (14) |
| 41 | #define S5P6450_GPIO_H_NR (10) | 41 | #define S5P6450_GPIO_H_NR (10) |
| 42 | #define S5P6450_GPIO_I_NR (16) | 42 | #define S5P6450_GPIO_I_NR (16) |
diff --git a/arch/arm/mach-shmobile/board-ag5evm.c b/arch/arm/mach-shmobile/board-ag5evm.c index 2123b96b563..4303a86e6e3 100644 --- a/arch/arm/mach-shmobile/board-ag5evm.c +++ b/arch/arm/mach-shmobile/board-ag5evm.c | |||
| @@ -454,6 +454,7 @@ static void __init ag5evm_init(void) | |||
| 454 | gpio_direction_output(GPIO_PORT217, 0); | 454 | gpio_direction_output(GPIO_PORT217, 0); |
| 455 | mdelay(1); | 455 | mdelay(1); |
| 456 | gpio_set_value(GPIO_PORT217, 1); | 456 | gpio_set_value(GPIO_PORT217, 1); |
| 457 | mdelay(100); | ||
| 457 | 458 | ||
| 458 | /* LCD backlight controller */ | 459 | /* LCD backlight controller */ |
| 459 | gpio_request(GPIO_PORT235, NULL); /* RESET */ | 460 | gpio_request(GPIO_PORT235, NULL); /* RESET */ |
diff --git a/arch/arm/mach-shmobile/board-ap4evb.c b/arch/arm/mach-shmobile/board-ap4evb.c index 3cf0951caa2..81d6536552a 100644 --- a/arch/arm/mach-shmobile/board-ap4evb.c +++ b/arch/arm/mach-shmobile/board-ap4evb.c | |||
| @@ -1303,7 +1303,7 @@ static void __init ap4evb_init(void) | |||
| 1303 | 1303 | ||
| 1304 | lcdc_info.clock_source = LCDC_CLK_BUS; | 1304 | lcdc_info.clock_source = LCDC_CLK_BUS; |
| 1305 | lcdc_info.ch[0].interface_type = RGB18; | 1305 | lcdc_info.ch[0].interface_type = RGB18; |
| 1306 | lcdc_info.ch[0].clock_divider = 2; | 1306 | lcdc_info.ch[0].clock_divider = 3; |
| 1307 | lcdc_info.ch[0].flags = 0; | 1307 | lcdc_info.ch[0].flags = 0; |
| 1308 | lcdc_info.ch[0].lcd_size_cfg.width = 152; | 1308 | lcdc_info.ch[0].lcd_size_cfg.width = 152; |
| 1309 | lcdc_info.ch[0].lcd_size_cfg.height = 91; | 1309 | lcdc_info.ch[0].lcd_size_cfg.height = 91; |
diff --git a/arch/arm/mach-shmobile/board-mackerel.c b/arch/arm/mach-shmobile/board-mackerel.c index fb4213a4e15..1657eac5dde 100644 --- a/arch/arm/mach-shmobile/board-mackerel.c +++ b/arch/arm/mach-shmobile/board-mackerel.c | |||
| @@ -303,7 +303,7 @@ static struct sh_mobile_lcdc_info lcdc_info = { | |||
| 303 | .lcd_cfg = mackerel_lcdc_modes, | 303 | .lcd_cfg = mackerel_lcdc_modes, |
| 304 | .num_cfg = ARRAY_SIZE(mackerel_lcdc_modes), | 304 | .num_cfg = ARRAY_SIZE(mackerel_lcdc_modes), |
| 305 | .interface_type = RGB24, | 305 | .interface_type = RGB24, |
| 306 | .clock_divider = 2, | 306 | .clock_divider = 3, |
| 307 | .flags = 0, | 307 | .flags = 0, |
| 308 | .lcd_size_cfg.width = 152, | 308 | .lcd_size_cfg.width = 152, |
| 309 | .lcd_size_cfg.height = 91, | 309 | .lcd_size_cfg.height = 91, |
diff --git a/arch/arm/mach-shmobile/clock-sh73a0.c b/arch/arm/mach-shmobile/clock-sh73a0.c index ddd4a1b775f..7e58904c1c8 100644 --- a/arch/arm/mach-shmobile/clock-sh73a0.c +++ b/arch/arm/mach-shmobile/clock-sh73a0.c | |||
| @@ -263,7 +263,7 @@ static struct clk div6_clks[DIV6_NR] = { | |||
| 263 | }; | 263 | }; |
| 264 | 264 | ||
| 265 | enum { MSTP001, | 265 | enum { MSTP001, |
| 266 | MSTP125, MSTP118, MSTP116, MSTP100, | 266 | MSTP129, MSTP128, MSTP127, MSTP126, MSTP125, MSTP118, MSTP116, MSTP100, |
| 267 | MSTP219, | 267 | MSTP219, |
| 268 | MSTP207, MSTP206, MSTP204, MSTP203, MSTP202, MSTP201, MSTP200, | 268 | MSTP207, MSTP206, MSTP204, MSTP203, MSTP202, MSTP201, MSTP200, |
| 269 | MSTP331, MSTP329, MSTP325, MSTP323, MSTP312, | 269 | MSTP331, MSTP329, MSTP325, MSTP323, MSTP312, |
| @@ -275,6 +275,10 @@ enum { MSTP001, | |||
| 275 | 275 | ||
| 276 | static struct clk mstp_clks[MSTP_NR] = { | 276 | static struct clk mstp_clks[MSTP_NR] = { |
| 277 | [MSTP001] = MSTP(&div4_clks[DIV4_HP], SMSTPCR0, 1, 0), /* IIC2 */ | 277 | [MSTP001] = MSTP(&div4_clks[DIV4_HP], SMSTPCR0, 1, 0), /* IIC2 */ |
| 278 | [MSTP129] = MSTP(&div4_clks[DIV4_B], SMSTPCR1, 29, 0), /* CEU1 */ | ||
| 279 | [MSTP128] = MSTP(&div4_clks[DIV4_B], SMSTPCR1, 28, 0), /* CSI2-RX1 */ | ||
| 280 | [MSTP127] = MSTP(&div4_clks[DIV4_B], SMSTPCR1, 27, 0), /* CEU0 */ | ||
| 281 | [MSTP126] = MSTP(&div4_clks[DIV4_B], SMSTPCR1, 26, 0), /* CSI2-RX0 */ | ||
| 278 | [MSTP125] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR1, 25, 0), /* TMU0 */ | 282 | [MSTP125] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR1, 25, 0), /* TMU0 */ |
| 279 | [MSTP118] = MSTP(&div4_clks[DIV4_B], SMSTPCR1, 18, 0), /* DSITX0 */ | 283 | [MSTP118] = MSTP(&div4_clks[DIV4_B], SMSTPCR1, 18, 0), /* DSITX0 */ |
| 280 | [MSTP116] = MSTP(&div4_clks[DIV4_HP], SMSTPCR1, 16, 0), /* IIC0 */ | 284 | [MSTP116] = MSTP(&div4_clks[DIV4_HP], SMSTPCR1, 16, 0), /* IIC0 */ |
| @@ -306,6 +310,9 @@ static struct clk_lookup lookups[] = { | |||
| 306 | CLKDEV_CON_ID("r_clk", &r_clk), | 310 | CLKDEV_CON_ID("r_clk", &r_clk), |
| 307 | 311 | ||
| 308 | /* DIV6 clocks */ | 312 | /* DIV6 clocks */ |
| 313 | CLKDEV_CON_ID("vck1_clk", &div6_clks[DIV6_VCK1]), | ||
| 314 | CLKDEV_CON_ID("vck2_clk", &div6_clks[DIV6_VCK2]), | ||
| 315 | CLKDEV_CON_ID("vck3_clk", &div6_clks[DIV6_VCK3]), | ||
| 309 | CLKDEV_ICK_ID("dsit_clk", "sh-mipi-dsi.0", &div6_clks[DIV6_DSIT]), | 316 | CLKDEV_ICK_ID("dsit_clk", "sh-mipi-dsi.0", &div6_clks[DIV6_DSIT]), |
| 310 | CLKDEV_ICK_ID("dsit_clk", "sh-mipi-dsi.1", &div6_clks[DIV6_DSIT]), | 317 | CLKDEV_ICK_ID("dsit_clk", "sh-mipi-dsi.1", &div6_clks[DIV6_DSIT]), |
| 311 | CLKDEV_ICK_ID("dsi0p_clk", "sh-mipi-dsi.0", &div6_clks[DIV6_DSI0P]), | 318 | CLKDEV_ICK_ID("dsi0p_clk", "sh-mipi-dsi.0", &div6_clks[DIV6_DSI0P]), |
| @@ -313,11 +320,15 @@ static struct clk_lookup lookups[] = { | |||
| 313 | 320 | ||
| 314 | /* MSTP32 clocks */ | 321 | /* MSTP32 clocks */ |
| 315 | CLKDEV_DEV_ID("i2c-sh_mobile.2", &mstp_clks[MSTP001]), /* I2C2 */ | 322 | CLKDEV_DEV_ID("i2c-sh_mobile.2", &mstp_clks[MSTP001]), /* I2C2 */ |
| 316 | CLKDEV_DEV_ID("sh_mobile_lcdc_fb.0", &mstp_clks[MSTP100]), /* LCDC0 */ | 323 | CLKDEV_DEV_ID("sh_mobile_ceu.1", &mstp_clks[MSTP129]), /* CEU1 */ |
| 324 | CLKDEV_DEV_ID("sh-mobile-csi2.1", &mstp_clks[MSTP128]), /* CSI2-RX1 */ | ||
| 325 | CLKDEV_DEV_ID("sh_mobile_ceu.0", &mstp_clks[MSTP127]), /* CEU0 */ | ||
| 326 | CLKDEV_DEV_ID("sh-mobile-csi2.0", &mstp_clks[MSTP126]), /* CSI2-RX0 */ | ||
| 317 | CLKDEV_DEV_ID("sh_tmu.0", &mstp_clks[MSTP125]), /* TMU00 */ | 327 | CLKDEV_DEV_ID("sh_tmu.0", &mstp_clks[MSTP125]), /* TMU00 */ |
| 318 | CLKDEV_DEV_ID("sh_tmu.1", &mstp_clks[MSTP125]), /* TMU01 */ | 328 | CLKDEV_DEV_ID("sh_tmu.1", &mstp_clks[MSTP125]), /* TMU01 */ |
| 319 | CLKDEV_DEV_ID("i2c-sh_mobile.0", &mstp_clks[MSTP116]), /* I2C0 */ | ||
| 320 | CLKDEV_DEV_ID("sh-mipi-dsi.0", &mstp_clks[MSTP118]), /* DSITX */ | 329 | CLKDEV_DEV_ID("sh-mipi-dsi.0", &mstp_clks[MSTP118]), /* DSITX */ |
| 330 | CLKDEV_DEV_ID("i2c-sh_mobile.0", &mstp_clks[MSTP116]), /* I2C0 */ | ||
| 331 | CLKDEV_DEV_ID("sh_mobile_lcdc_fb.0", &mstp_clks[MSTP100]), /* LCDC0 */ | ||
| 321 | CLKDEV_DEV_ID("sh-sci.7", &mstp_clks[MSTP219]), /* SCIFA7 */ | 332 | CLKDEV_DEV_ID("sh-sci.7", &mstp_clks[MSTP219]), /* SCIFA7 */ |
| 322 | CLKDEV_DEV_ID("sh-sci.5", &mstp_clks[MSTP207]), /* SCIFA5 */ | 333 | CLKDEV_DEV_ID("sh-sci.5", &mstp_clks[MSTP207]), /* SCIFA5 */ |
| 323 | CLKDEV_DEV_ID("sh-sci.8", &mstp_clks[MSTP206]), /* SCIFB */ | 334 | CLKDEV_DEV_ID("sh-sci.8", &mstp_clks[MSTP206]), /* SCIFB */ |
diff --git a/arch/arm/mach-shmobile/include/mach/head-ap4evb.txt b/arch/arm/mach-shmobile/include/mach/head-ap4evb.txt index efd3687ba19..3029aba3868 100644 --- a/arch/arm/mach-shmobile/include/mach/head-ap4evb.txt +++ b/arch/arm/mach-shmobile/include/mach/head-ap4evb.txt | |||
| @@ -6,13 +6,10 @@ LIST "RWT Setting" | |||
| 6 | EW 0xE6020004, 0xA500 | 6 | EW 0xE6020004, 0xA500 |
| 7 | EW 0xE6030004, 0xA500 | 7 | EW 0xE6030004, 0xA500 |
| 8 | 8 | ||
| 9 | DD 0x01001000, 0x01001000 | ||
| 10 | |||
| 11 | LIST "GPIO Setting" | 9 | LIST "GPIO Setting" |
| 12 | EB 0xE6051013, 0xA2 | 10 | EB 0xE6051013, 0xA2 |
| 13 | 11 | ||
| 14 | LIST "CPG" | 12 | LIST "CPG" |
| 15 | ED 0xE6150080, 0x00000180 | ||
| 16 | ED 0xE61500C0, 0x00000002 | 13 | ED 0xE61500C0, 0x00000002 |
| 17 | 14 | ||
| 18 | WAIT 1, 0xFE40009C | 15 | WAIT 1, 0xFE40009C |
| @@ -37,6 +34,9 @@ ED 0xE615002C, 0x93000040 | |||
| 37 | 34 | ||
| 38 | WAIT 1, 0xFE40009C | 35 | WAIT 1, 0xFE40009C |
| 39 | 36 | ||
| 37 | LIST "SUB/USBClk" | ||
| 38 | ED 0xE6150080, 0x00000180 | ||
| 39 | |||
| 40 | LIST "BSC" | 40 | LIST "BSC" |
| 41 | ED 0xFEC10000, 0x00E0001B | 41 | ED 0xFEC10000, 0x00E0001B |
| 42 | 42 | ||
| @@ -53,7 +53,7 @@ ED 0xFE400048, 0x20C18505 | |||
| 53 | ED 0xFE40004C, 0x00110209 | 53 | ED 0xFE40004C, 0x00110209 |
| 54 | ED 0xFE400010, 0x00000087 | 54 | ED 0xFE400010, 0x00000087 |
| 55 | 55 | ||
| 56 | WAIT 10, 0xFE40009C | 56 | WAIT 30, 0xFE40009C |
| 57 | 57 | ||
| 58 | ED 0xFE400084, 0x0000003F | 58 | ED 0xFE400084, 0x0000003F |
| 59 | EB 0xFE500000, 0x00 | 59 | EB 0xFE500000, 0x00 |
| @@ -84,7 +84,7 @@ ED 0xE6150004, 0x80331050 | |||
| 84 | 84 | ||
| 85 | WAIT 1, 0xFE40009C | 85 | WAIT 1, 0xFE40009C |
| 86 | 86 | ||
| 87 | ED 0xE6150354, 0x00000002 | 87 | ED 0xFE400354, 0x01AD8002 |
| 88 | 88 | ||
| 89 | LIST "SCIF0 - Serial port for earlyprintk" | 89 | LIST "SCIF0 - Serial port for earlyprintk" |
| 90 | EB 0xE6053098, 0x11 | 90 | EB 0xE6053098, 0x11 |
diff --git a/arch/arm/mach-shmobile/include/mach/head-mackerel.txt b/arch/arm/mach-shmobile/include/mach/head-mackerel.txt index efd3687ba19..3029aba3868 100644 --- a/arch/arm/mach-shmobile/include/mach/head-mackerel.txt +++ b/arch/arm/mach-shmobile/include/mach/head-mackerel.txt | |||
| @@ -6,13 +6,10 @@ LIST "RWT Setting" | |||
| 6 | EW 0xE6020004, 0xA500 | 6 | EW 0xE6020004, 0xA500 |
| 7 | EW 0xE6030004, 0xA500 | 7 | EW 0xE6030004, 0xA500 |
| 8 | 8 | ||
| 9 | DD 0x01001000, 0x01001000 | ||
| 10 | |||
| 11 | LIST "GPIO Setting" | 9 | LIST "GPIO Setting" |
| 12 | EB 0xE6051013, 0xA2 | 10 | EB 0xE6051013, 0xA2 |
| 13 | 11 | ||
| 14 | LIST "CPG" | 12 | LIST "CPG" |
| 15 | ED 0xE6150080, 0x00000180 | ||
| 16 | ED 0xE61500C0, 0x00000002 | 13 | ED 0xE61500C0, 0x00000002 |
| 17 | 14 | ||
| 18 | WAIT 1, 0xFE40009C | 15 | WAIT 1, 0xFE40009C |
| @@ -37,6 +34,9 @@ ED 0xE615002C, 0x93000040 | |||
| 37 | 34 | ||
| 38 | WAIT 1, 0xFE40009C | 35 | WAIT 1, 0xFE40009C |
| 39 | 36 | ||
| 37 | LIST "SUB/USBClk" | ||
| 38 | ED 0xE6150080, 0x00000180 | ||
| 39 | |||
| 40 | LIST "BSC" | 40 | LIST "BSC" |
| 41 | ED 0xFEC10000, 0x00E0001B | 41 | ED 0xFEC10000, 0x00E0001B |
| 42 | 42 | ||
| @@ -53,7 +53,7 @@ ED 0xFE400048, 0x20C18505 | |||
| 53 | ED 0xFE40004C, 0x00110209 | 53 | ED 0xFE40004C, 0x00110209 |
| 54 | ED 0xFE400010, 0x00000087 | 54 | ED 0xFE400010, 0x00000087 |
| 55 | 55 | ||
| 56 | WAIT 10, 0xFE40009C | 56 | WAIT 30, 0xFE40009C |
| 57 | 57 | ||
| 58 | ED 0xFE400084, 0x0000003F | 58 | ED 0xFE400084, 0x0000003F |
| 59 | EB 0xFE500000, 0x00 | 59 | EB 0xFE500000, 0x00 |
| @@ -84,7 +84,7 @@ ED 0xE6150004, 0x80331050 | |||
| 84 | 84 | ||
| 85 | WAIT 1, 0xFE40009C | 85 | WAIT 1, 0xFE40009C |
| 86 | 86 | ||
| 87 | ED 0xE6150354, 0x00000002 | 87 | ED 0xFE400354, 0x01AD8002 |
| 88 | 88 | ||
| 89 | LIST "SCIF0 - Serial port for earlyprintk" | 89 | LIST "SCIF0 - Serial port for earlyprintk" |
| 90 | EB 0xE6053098, 0x11 | 90 | EB 0xE6053098, 0x11 |
diff --git a/arch/arm/plat-omap/clock.c b/arch/arm/plat-omap/clock.c index fc62fb5fc20..c9122dd6ee8 100644 --- a/arch/arm/plat-omap/clock.c +++ b/arch/arm/plat-omap/clock.c | |||
| @@ -37,14 +37,16 @@ static struct clk_functions *arch_clock; | |||
| 37 | int clk_enable(struct clk *clk) | 37 | int clk_enable(struct clk *clk) |
| 38 | { | 38 | { |
| 39 | unsigned long flags; | 39 | unsigned long flags; |
| 40 | int ret = 0; | 40 | int ret; |
| 41 | 41 | ||
| 42 | if (clk == NULL || IS_ERR(clk)) | 42 | if (clk == NULL || IS_ERR(clk)) |
| 43 | return -EINVAL; | 43 | return -EINVAL; |
| 44 | 44 | ||
| 45 | if (!arch_clock || !arch_clock->clk_enable) | ||
| 46 | return -EINVAL; | ||
| 47 | |||
| 45 | spin_lock_irqsave(&clockfw_lock, flags); | 48 | spin_lock_irqsave(&clockfw_lock, flags); |
| 46 | if (arch_clock->clk_enable) | 49 | ret = arch_clock->clk_enable(clk); |
| 47 | ret = arch_clock->clk_enable(clk); | ||
| 48 | spin_unlock_irqrestore(&clockfw_lock, flags); | 50 | spin_unlock_irqrestore(&clockfw_lock, flags); |
| 49 | 51 | ||
| 50 | return ret; | 52 | return ret; |
| @@ -58,6 +60,9 @@ void clk_disable(struct clk *clk) | |||
| 58 | if (clk == NULL || IS_ERR(clk)) | 60 | if (clk == NULL || IS_ERR(clk)) |
| 59 | return; | 61 | return; |
| 60 | 62 | ||
| 63 | if (!arch_clock || !arch_clock->clk_disable) | ||
| 64 | return; | ||
| 65 | |||
| 61 | spin_lock_irqsave(&clockfw_lock, flags); | 66 | spin_lock_irqsave(&clockfw_lock, flags); |
| 62 | if (clk->usecount == 0) { | 67 | if (clk->usecount == 0) { |
| 63 | pr_err("Trying disable clock %s with 0 usecount\n", | 68 | pr_err("Trying disable clock %s with 0 usecount\n", |
| @@ -66,8 +71,7 @@ void clk_disable(struct clk *clk) | |||
| 66 | goto out; | 71 | goto out; |
| 67 | } | 72 | } |
| 68 | 73 | ||
| 69 | if (arch_clock->clk_disable) | 74 | arch_clock->clk_disable(clk); |
| 70 | arch_clock->clk_disable(clk); | ||
| 71 | 75 | ||
| 72 | out: | 76 | out: |
| 73 | spin_unlock_irqrestore(&clockfw_lock, flags); | 77 | spin_unlock_irqrestore(&clockfw_lock, flags); |
| @@ -77,7 +81,7 @@ EXPORT_SYMBOL(clk_disable); | |||
| 77 | unsigned long clk_get_rate(struct clk *clk) | 81 | unsigned long clk_get_rate(struct clk *clk) |
| 78 | { | 82 | { |
| 79 | unsigned long flags; | 83 | unsigned long flags; |
| 80 | unsigned long ret = 0; | 84 | unsigned long ret; |
| 81 | 85 | ||
| 82 | if (clk == NULL || IS_ERR(clk)) | 86 | if (clk == NULL || IS_ERR(clk)) |
| 83 | return 0; | 87 | return 0; |
| @@ -97,14 +101,16 @@ EXPORT_SYMBOL(clk_get_rate); | |||
| 97 | long clk_round_rate(struct clk *clk, unsigned long rate) | 101 | long clk_round_rate(struct clk *clk, unsigned long rate) |
| 98 | { | 102 | { |
| 99 | unsigned long flags; | 103 | unsigned long flags; |
| 100 | long ret = 0; | 104 | long ret; |
| 101 | 105 | ||
| 102 | if (clk == NULL || IS_ERR(clk)) | 106 | if (clk == NULL || IS_ERR(clk)) |
| 103 | return ret; | 107 | return 0; |
| 108 | |||
| 109 | if (!arch_clock || !arch_clock->clk_round_rate) | ||
| 110 | return 0; | ||
| 104 | 111 | ||
| 105 | spin_lock_irqsave(&clockfw_lock, flags); | 112 | spin_lock_irqsave(&clockfw_lock, flags); |
| 106 | if (arch_clock->clk_round_rate) | 113 | ret = arch_clock->clk_round_rate(clk, rate); |
| 107 | ret = arch_clock->clk_round_rate(clk, rate); | ||
| 108 | spin_unlock_irqrestore(&clockfw_lock, flags); | 114 | spin_unlock_irqrestore(&clockfw_lock, flags); |
| 109 | 115 | ||
| 110 | return ret; | 116 | return ret; |
| @@ -119,14 +125,13 @@ int clk_set_rate(struct clk *clk, unsigned long rate) | |||
| 119 | if (clk == NULL || IS_ERR(clk)) | 125 | if (clk == NULL || IS_ERR(clk)) |
| 120 | return ret; | 126 | return ret; |
| 121 | 127 | ||
| 128 | if (!arch_clock || !arch_clock->clk_set_rate) | ||
| 129 | return ret; | ||
| 130 | |||
| 122 | spin_lock_irqsave(&clockfw_lock, flags); | 131 | spin_lock_irqsave(&clockfw_lock, flags); |
| 123 | if (arch_clock->clk_set_rate) | 132 | ret = arch_clock->clk_set_rate(clk, rate); |
| 124 | ret = arch_clock->clk_set_rate(clk, rate); | 133 | if (ret == 0) |
| 125 | if (ret == 0) { | ||
| 126 | if (clk->recalc) | ||
| 127 | clk->rate = clk->recalc(clk); | ||
| 128 | propagate_rate(clk); | 134 | propagate_rate(clk); |
| 129 | } | ||
| 130 | spin_unlock_irqrestore(&clockfw_lock, flags); | 135 | spin_unlock_irqrestore(&clockfw_lock, flags); |
| 131 | 136 | ||
| 132 | return ret; | 137 | return ret; |
| @@ -141,15 +146,14 @@ int clk_set_parent(struct clk *clk, struct clk *parent) | |||
| 141 | if (clk == NULL || IS_ERR(clk) || parent == NULL || IS_ERR(parent)) | 146 | if (clk == NULL || IS_ERR(clk) || parent == NULL || IS_ERR(parent)) |
| 142 | return ret; | 147 | return ret; |
| 143 | 148 | ||
| 149 | if (!arch_clock || !arch_clock->clk_set_parent) | ||
| 150 | return ret; | ||
| 151 | |||
| 144 | spin_lock_irqsave(&clockfw_lock, flags); | 152 | spin_lock_irqsave(&clockfw_lock, flags); |
| 145 | if (clk->usecount == 0) { | 153 | if (clk->usecount == 0) { |
| 146 | if (arch_clock->clk_set_parent) | 154 | ret = arch_clock->clk_set_parent(clk, parent); |
| 147 | ret = arch_clock->clk_set_parent(clk, parent); | 155 | if (ret == 0) |
| 148 | if (ret == 0) { | ||
| 149 | if (clk->recalc) | ||
| 150 | clk->rate = clk->recalc(clk); | ||
| 151 | propagate_rate(clk); | 156 | propagate_rate(clk); |
| 152 | } | ||
| 153 | } else | 157 | } else |
| 154 | ret = -EBUSY; | 158 | ret = -EBUSY; |
| 155 | spin_unlock_irqrestore(&clockfw_lock, flags); | 159 | spin_unlock_irqrestore(&clockfw_lock, flags); |
| @@ -335,6 +339,38 @@ struct clk *omap_clk_get_by_name(const char *name) | |||
| 335 | return ret; | 339 | return ret; |
| 336 | } | 340 | } |
| 337 | 341 | ||
| 342 | int omap_clk_enable_autoidle_all(void) | ||
| 343 | { | ||
| 344 | struct clk *c; | ||
| 345 | unsigned long flags; | ||
| 346 | |||
| 347 | spin_lock_irqsave(&clockfw_lock, flags); | ||
| 348 | |||
| 349 | list_for_each_entry(c, &clocks, node) | ||
| 350 | if (c->ops->allow_idle) | ||
| 351 | c->ops->allow_idle(c); | ||
| 352 | |||
| 353 | spin_unlock_irqrestore(&clockfw_lock, flags); | ||
| 354 | |||
| 355 | return 0; | ||
| 356 | } | ||
| 357 | |||
| 358 | int omap_clk_disable_autoidle_all(void) | ||
| 359 | { | ||
| 360 | struct clk *c; | ||
| 361 | unsigned long flags; | ||
| 362 | |||
| 363 | spin_lock_irqsave(&clockfw_lock, flags); | ||
| 364 | |||
| 365 | list_for_each_entry(c, &clocks, node) | ||
| 366 | if (c->ops->deny_idle) | ||
| 367 | c->ops->deny_idle(c); | ||
| 368 | |||
| 369 | spin_unlock_irqrestore(&clockfw_lock, flags); | ||
| 370 | |||
| 371 | return 0; | ||
| 372 | } | ||
| 373 | |||
| 338 | /* | 374 | /* |
| 339 | * Low level helpers | 375 | * Low level helpers |
| 340 | */ | 376 | */ |
| @@ -367,9 +403,11 @@ void clk_init_cpufreq_table(struct cpufreq_frequency_table **table) | |||
| 367 | { | 403 | { |
| 368 | unsigned long flags; | 404 | unsigned long flags; |
| 369 | 405 | ||
| 406 | if (!arch_clock || !arch_clock->clk_init_cpufreq_table) | ||
| 407 | return; | ||
| 408 | |||
| 370 | spin_lock_irqsave(&clockfw_lock, flags); | 409 | spin_lock_irqsave(&clockfw_lock, flags); |
| 371 | if (arch_clock->clk_init_cpufreq_table) | 410 | arch_clock->clk_init_cpufreq_table(table); |
| 372 | arch_clock->clk_init_cpufreq_table(table); | ||
| 373 | spin_unlock_irqrestore(&clockfw_lock, flags); | 411 | spin_unlock_irqrestore(&clockfw_lock, flags); |
| 374 | } | 412 | } |
| 375 | 413 | ||
| @@ -377,9 +415,11 @@ void clk_exit_cpufreq_table(struct cpufreq_frequency_table **table) | |||
| 377 | { | 415 | { |
| 378 | unsigned long flags; | 416 | unsigned long flags; |
| 379 | 417 | ||
| 418 | if (!arch_clock || !arch_clock->clk_exit_cpufreq_table) | ||
| 419 | return; | ||
| 420 | |||
| 380 | spin_lock_irqsave(&clockfw_lock, flags); | 421 | spin_lock_irqsave(&clockfw_lock, flags); |
| 381 | if (arch_clock->clk_exit_cpufreq_table) | 422 | arch_clock->clk_exit_cpufreq_table(table); |
| 382 | arch_clock->clk_exit_cpufreq_table(table); | ||
| 383 | spin_unlock_irqrestore(&clockfw_lock, flags); | 423 | spin_unlock_irqrestore(&clockfw_lock, flags); |
| 384 | } | 424 | } |
| 385 | #endif | 425 | #endif |
| @@ -397,6 +437,9 @@ static int __init clk_disable_unused(void) | |||
| 397 | struct clk *ck; | 437 | struct clk *ck; |
| 398 | unsigned long flags; | 438 | unsigned long flags; |
| 399 | 439 | ||
| 440 | if (!arch_clock || !arch_clock->clk_disable_unused) | ||
| 441 | return 0; | ||
| 442 | |||
| 400 | pr_info("clock: disabling unused clocks to save power\n"); | 443 | pr_info("clock: disabling unused clocks to save power\n"); |
| 401 | list_for_each_entry(ck, &clocks, node) { | 444 | list_for_each_entry(ck, &clocks, node) { |
| 402 | if (ck->ops == &clkops_null) | 445 | if (ck->ops == &clkops_null) |
| @@ -406,14 +449,14 @@ static int __init clk_disable_unused(void) | |||
| 406 | continue; | 449 | continue; |
| 407 | 450 | ||
| 408 | spin_lock_irqsave(&clockfw_lock, flags); | 451 | spin_lock_irqsave(&clockfw_lock, flags); |
| 409 | if (arch_clock->clk_disable_unused) | 452 | arch_clock->clk_disable_unused(ck); |
| 410 | arch_clock->clk_disable_unused(ck); | ||
| 411 | spin_unlock_irqrestore(&clockfw_lock, flags); | 453 | spin_unlock_irqrestore(&clockfw_lock, flags); |
| 412 | } | 454 | } |
| 413 | 455 | ||
| 414 | return 0; | 456 | return 0; |
| 415 | } | 457 | } |
| 416 | late_initcall(clk_disable_unused); | 458 | late_initcall(clk_disable_unused); |
| 459 | late_initcall(omap_clk_enable_autoidle_all); | ||
| 417 | #endif | 460 | #endif |
| 418 | 461 | ||
| 419 | int __init clk_init(struct clk_functions * custom_clocks) | 462 | int __init clk_init(struct clk_functions * custom_clocks) |
diff --git a/arch/arm/plat-omap/dmtimer.c b/arch/arm/plat-omap/dmtimer.c index 1d706cf63ca..ee9f6ebba29 100644 --- a/arch/arm/plat-omap/dmtimer.c +++ b/arch/arm/plat-omap/dmtimer.c | |||
| @@ -342,6 +342,10 @@ static void omap_dm_timer_reset(struct omap_dm_timer *timer) | |||
| 342 | l |= 0x02 << 3; /* Set to smart-idle mode */ | 342 | l |= 0x02 << 3; /* Set to smart-idle mode */ |
| 343 | l |= 0x2 << 8; /* Set clock activity to perserve f-clock on idle */ | 343 | l |= 0x2 << 8; /* Set clock activity to perserve f-clock on idle */ |
| 344 | 344 | ||
| 345 | /* Enable autoidle on OMAP2 / OMAP3 */ | ||
| 346 | if (cpu_is_omap24xx() || cpu_is_omap34xx()) | ||
| 347 | l |= 0x1 << 0; | ||
| 348 | |||
| 345 | /* | 349 | /* |
| 346 | * Enable wake-up on OMAP2 CPUs. | 350 | * Enable wake-up on OMAP2 CPUs. |
| 347 | */ | 351 | */ |
diff --git a/arch/arm/plat-omap/include/plat/clock.h b/arch/arm/plat-omap/include/plat/clock.h index d43e6234dbb..006e599c661 100644 --- a/arch/arm/plat-omap/include/plat/clock.h +++ b/arch/arm/plat-omap/include/plat/clock.h | |||
| @@ -25,6 +25,8 @@ struct clockdomain; | |||
| 25 | * @disable: 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 | 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 | 27 | * @find_companion: function returning the "companion" clk reg for the clock |
| 28 | * @allow_idle: fn ptr that enables autoidle for the current clock in hardware | ||
| 29 | * @deny_idle: fn ptr that disables autoidle for the current clock in hardware | ||
| 28 | * | 30 | * |
| 29 | * A "companion" clk is an accompanying clock to the one being queried | 31 | * 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 | 32 | * that must be enabled for the IP module connected to the clock to |
| @@ -42,6 +44,8 @@ struct clkops { | |||
| 42 | u8 *, u8 *); | 44 | u8 *, u8 *); |
| 43 | void (*find_companion)(struct clk *, void __iomem **, | 45 | void (*find_companion)(struct clk *, void __iomem **, |
| 44 | u8 *); | 46 | u8 *); |
| 47 | void (*allow_idle)(struct clk *); | ||
| 48 | void (*deny_idle)(struct clk *); | ||
| 45 | }; | 49 | }; |
| 46 | 50 | ||
| 47 | #ifdef CONFIG_ARCH_OMAP2PLUS | 51 | #ifdef CONFIG_ARCH_OMAP2PLUS |
| @@ -105,7 +109,6 @@ struct clksel { | |||
| 105 | * @clk_ref: struct clk pointer to the clock's reference clock input | 109 | * @clk_ref: struct clk pointer to the clock's reference clock input |
| 106 | * @control_reg: register containing the DPLL mode bitfield | 110 | * @control_reg: register containing the DPLL mode bitfield |
| 107 | * @enable_mask: mask of the DPLL mode bitfield in @control_reg | 111 | * @enable_mask: mask of the DPLL mode bitfield in @control_reg |
| 108 | * @rate_tolerance: maximum variance allowed from target rate (in Hz) | ||
| 109 | * @last_rounded_rate: cache of the last rate result of omap2_dpll_round_rate() | 112 | * @last_rounded_rate: cache of the last rate result of omap2_dpll_round_rate() |
| 110 | * @last_rounded_m: cache of the last M result of omap2_dpll_round_rate() | 113 | * @last_rounded_m: cache of the last M result of omap2_dpll_round_rate() |
| 111 | * @max_multiplier: maximum valid non-bypass multiplier value (actual) | 114 | * @max_multiplier: maximum valid non-bypass multiplier value (actual) |
| @@ -131,12 +134,9 @@ struct clksel { | |||
| 131 | * XXX Some DPLLs have multiple bypass inputs, so it's not technically | 134 | * XXX Some DPLLs have multiple bypass inputs, so it's not technically |
| 132 | * correct to only have one @clk_bypass pointer. | 135 | * correct to only have one @clk_bypass pointer. |
| 133 | * | 136 | * |
| 134 | * XXX @rate_tolerance should probably be deprecated - currently there | ||
| 135 | * don't seem to be any usecases for DPLL rounding that is not exact. | ||
| 136 | * | ||
| 137 | * XXX The runtime-variable fields (@last_rounded_rate, @last_rounded_m, | 137 | * XXX The runtime-variable fields (@last_rounded_rate, @last_rounded_m, |
| 138 | * @last_rounded_n) should be separated from the runtime-fixed fields | 138 | * @last_rounded_n) should be separated from the runtime-fixed fields |
| 139 | * and placed into a differenct structure, so that the runtime-fixed data | 139 | * and placed into a different structure, so that the runtime-fixed data |
| 140 | * can be placed into read-only space. | 140 | * can be placed into read-only space. |
| 141 | */ | 141 | */ |
| 142 | struct dpll_data { | 142 | struct dpll_data { |
| @@ -147,7 +147,6 @@ struct dpll_data { | |||
| 147 | struct clk *clk_ref; | 147 | struct clk *clk_ref; |
| 148 | void __iomem *control_reg; | 148 | void __iomem *control_reg; |
| 149 | u32 enable_mask; | 149 | u32 enable_mask; |
| 150 | unsigned int rate_tolerance; | ||
| 151 | unsigned long last_rounded_rate; | 150 | unsigned long last_rounded_rate; |
| 152 | u16 last_rounded_m; | 151 | u16 last_rounded_m; |
| 153 | u16 max_multiplier; | 152 | u16 max_multiplier; |
| @@ -172,12 +171,24 @@ struct dpll_data { | |||
| 172 | 171 | ||
| 173 | #endif | 172 | #endif |
| 174 | 173 | ||
| 175 | /* struct clk.flags possibilities */ | 174 | /* |
| 175 | * struct clk.flags possibilities | ||
| 176 | * | ||
| 177 | * XXX document the rest of the clock flags here | ||
| 178 | * | ||
| 179 | * CLOCK_CLKOUTX2: (OMAP4 only) DPLL CLKOUT and CLKOUTX2 GATE_CTRL | ||
| 180 | * bits share the same register. This flag allows the | ||
| 181 | * omap4_dpllmx*() code to determine which GATE_CTRL bit field | ||
| 182 | * should be used. This is a temporary solution - a better approach | ||
| 183 | * would be to associate clock type-specific data with the clock, | ||
| 184 | * similar to the struct dpll_data approach. | ||
| 185 | */ | ||
| 176 | #define ENABLE_REG_32BIT (1 << 0) /* Use 32-bit access */ | 186 | #define ENABLE_REG_32BIT (1 << 0) /* Use 32-bit access */ |
| 177 | #define CLOCK_IDLE_CONTROL (1 << 1) | 187 | #define CLOCK_IDLE_CONTROL (1 << 1) |
| 178 | #define CLOCK_NO_IDLE_PARENT (1 << 2) | 188 | #define CLOCK_NO_IDLE_PARENT (1 << 2) |
| 179 | #define ENABLE_ON_INIT (1 << 3) /* Enable upon framework init */ | 189 | #define ENABLE_ON_INIT (1 << 3) /* Enable upon framework init */ |
| 180 | #define INVERT_ENABLE (1 << 4) /* 0 enables, 1 disables */ | 190 | #define INVERT_ENABLE (1 << 4) /* 0 enables, 1 disables */ |
| 191 | #define CLOCK_CLKOUTX2 (1 << 5) | ||
| 181 | 192 | ||
| 182 | /** | 193 | /** |
| 183 | * struct clk - OMAP struct clk | 194 | * struct clk - OMAP struct clk |
| @@ -293,6 +304,8 @@ extern void clk_init_cpufreq_table(struct cpufreq_frequency_table **table); | |||
| 293 | extern void clk_exit_cpufreq_table(struct cpufreq_frequency_table **table); | 304 | extern void clk_exit_cpufreq_table(struct cpufreq_frequency_table **table); |
| 294 | #endif | 305 | #endif |
| 295 | extern struct clk *omap_clk_get_by_name(const char *name); | 306 | extern struct clk *omap_clk_get_by_name(const char *name); |
| 307 | extern int omap_clk_enable_autoidle_all(void); | ||
| 308 | extern int omap_clk_disable_autoidle_all(void); | ||
| 296 | 309 | ||
| 297 | extern const struct clkops clkops_null; | 310 | extern const struct clkops clkops_null; |
| 298 | 311 | ||
diff --git a/arch/arm/plat-omap/include/plat/common.h b/arch/arm/plat-omap/include/plat/common.h index 1dd97e7461c..5288130be96 100644 --- a/arch/arm/plat-omap/include/plat/common.h +++ b/arch/arm/plat-omap/include/plat/common.h | |||
| @@ -56,10 +56,6 @@ struct omap_globals { | |||
| 56 | unsigned long prm; /* Power and Reset Management */ | 56 | unsigned long prm; /* Power and Reset Management */ |
| 57 | unsigned long cm; /* Clock Management */ | 57 | unsigned long cm; /* Clock Management */ |
| 58 | unsigned long cm2; | 58 | unsigned long cm2; |
| 59 | unsigned long uart1_phys; | ||
| 60 | unsigned long uart2_phys; | ||
| 61 | unsigned long uart3_phys; | ||
| 62 | unsigned long uart4_phys; | ||
| 63 | }; | 59 | }; |
| 64 | 60 | ||
| 65 | void omap2_set_globals_242x(void); | 61 | void omap2_set_globals_242x(void); |
diff --git a/arch/arm/plat-omap/include/plat/omap_hwmod.h b/arch/arm/plat-omap/include/plat/omap_hwmod.h index 97aa8e763e1..1adea9c6298 100644 --- a/arch/arm/plat-omap/include/plat/omap_hwmod.h +++ b/arch/arm/plat-omap/include/plat/omap_hwmod.h | |||
| @@ -35,7 +35,6 @@ | |||
| 35 | #include <linux/ioport.h> | 35 | #include <linux/ioport.h> |
| 36 | #include <linux/spinlock.h> | 36 | #include <linux/spinlock.h> |
| 37 | #include <plat/cpu.h> | 37 | #include <plat/cpu.h> |
| 38 | #include <plat/voltage.h> | ||
| 39 | 38 | ||
| 40 | struct omap_device; | 39 | struct omap_device; |
| 41 | 40 | ||
| @@ -91,6 +90,9 @@ extern struct omap_hwmod_sysc_fields omap_hwmod_sysc_type2; | |||
| 91 | struct omap_hwmod_mux_info { | 90 | struct omap_hwmod_mux_info { |
| 92 | int nr_pads; | 91 | int nr_pads; |
| 93 | struct omap_device_pad *pads; | 92 | struct omap_device_pad *pads; |
| 93 | int nr_pads_dynamic; | ||
| 94 | struct omap_device_pad **pads_dynamic; | ||
| 95 | bool enabled; | ||
| 94 | }; | 96 | }; |
| 95 | 97 | ||
| 96 | /** | 98 | /** |
| @@ -125,6 +127,7 @@ struct omap_hwmod_dma_info { | |||
| 125 | * struct omap_hwmod_rst_info - IPs reset lines use by hwmod | 127 | * struct omap_hwmod_rst_info - IPs reset lines use by hwmod |
| 126 | * @name: name of the reset line (module local name) | 128 | * @name: name of the reset line (module local name) |
| 127 | * @rst_shift: Offset of the reset bit | 129 | * @rst_shift: Offset of the reset bit |
| 130 | * @st_shift: Offset of the reset status bit (OMAP2/3 only) | ||
| 128 | * | 131 | * |
| 129 | * @name should be something short, e.g., "cpu0" or "rst". It is defined | 132 | * @name should be something short, e.g., "cpu0" or "rst". It is defined |
| 130 | * locally to the hwmod. | 133 | * locally to the hwmod. |
| @@ -132,6 +135,7 @@ struct omap_hwmod_dma_info { | |||
| 132 | struct omap_hwmod_rst_info { | 135 | struct omap_hwmod_rst_info { |
| 133 | const char *name; | 136 | const char *name; |
| 134 | u8 rst_shift; | 137 | u8 rst_shift; |
| 138 | u8 st_shift; | ||
| 135 | }; | 139 | }; |
| 136 | 140 | ||
| 137 | /** | 141 | /** |
| @@ -377,7 +381,7 @@ struct omap_hwmod_omap4_prcm { | |||
| 377 | * HWMOD_INIT_NO_IDLE: don't idle this module at boot - important for SDRAM | 381 | * HWMOD_INIT_NO_IDLE: don't idle this module at boot - important for SDRAM |
| 378 | * controller, etc. XXX probably belongs outside the main hwmod file | 382 | * controller, etc. XXX probably belongs outside the main hwmod file |
| 379 | * XXX Should be HWMOD_SETUP_NO_IDLE | 383 | * XXX Should be HWMOD_SETUP_NO_IDLE |
| 380 | * HWMOD_NO_AUTOIDLE: disable module autoidle (OCP_SYSCONFIG.AUTOIDLE) | 384 | * HWMOD_NO_OCP_AUTOIDLE: disable module autoidle (OCP_SYSCONFIG.AUTOIDLE) |
| 381 | * when module is enabled, rather than the default, which is to | 385 | * when module is enabled, rather than the default, which is to |
| 382 | * enable autoidle | 386 | * enable autoidle |
| 383 | * HWMOD_SET_DEFAULT_CLOCKACT: program CLOCKACTIVITY bits at startup | 387 | * HWMOD_SET_DEFAULT_CLOCKACT: program CLOCKACTIVITY bits at startup |
| @@ -561,6 +565,7 @@ int omap_hwmod_enable_clocks(struct omap_hwmod *oh); | |||
| 561 | int omap_hwmod_disable_clocks(struct omap_hwmod *oh); | 565 | int omap_hwmod_disable_clocks(struct omap_hwmod *oh); |
| 562 | 566 | ||
| 563 | int omap_hwmod_set_slave_idlemode(struct omap_hwmod *oh, u8 idlemode); | 567 | int omap_hwmod_set_slave_idlemode(struct omap_hwmod *oh, u8 idlemode); |
| 568 | int omap_hwmod_set_ocp_autoidle(struct omap_hwmod *oh, u8 autoidle); | ||
| 564 | 569 | ||
| 565 | int omap_hwmod_reset(struct omap_hwmod *oh); | 570 | int omap_hwmod_reset(struct omap_hwmod *oh); |
| 566 | void omap_hwmod_ocp_barrier(struct omap_hwmod *oh); | 571 | void omap_hwmod_ocp_barrier(struct omap_hwmod *oh); |
| @@ -595,6 +600,8 @@ int omap_hwmod_for_each_by_class(const char *classname, | |||
| 595 | int omap_hwmod_set_postsetup_state(struct omap_hwmod *oh, u8 state); | 600 | int omap_hwmod_set_postsetup_state(struct omap_hwmod *oh, u8 state); |
| 596 | u32 omap_hwmod_get_context_loss_count(struct omap_hwmod *oh); | 601 | u32 omap_hwmod_get_context_loss_count(struct omap_hwmod *oh); |
| 597 | 602 | ||
| 603 | int omap_hwmod_no_setup_reset(struct omap_hwmod *oh); | ||
| 604 | |||
| 598 | /* | 605 | /* |
| 599 | * Chip variant-specific hwmod init routines - XXX should be converted | 606 | * Chip variant-specific hwmod init routines - XXX should be converted |
| 600 | * to use initcalls once the initial boot ordering is straightened out | 607 | * to use initcalls once the initial boot ordering is straightened out |
diff --git a/arch/arm/plat-omap/omap_device.c b/arch/arm/plat-omap/omap_device.c index 57adb270767..9bbda9acb73 100644 --- a/arch/arm/plat-omap/omap_device.c +++ b/arch/arm/plat-omap/omap_device.c | |||
| @@ -83,9 +83,11 @@ | |||
| 83 | #include <linux/err.h> | 83 | #include <linux/err.h> |
| 84 | #include <linux/io.h> | 84 | #include <linux/io.h> |
| 85 | #include <linux/clk.h> | 85 | #include <linux/clk.h> |
| 86 | #include <linux/clkdev.h> | ||
| 86 | 87 | ||
| 87 | #include <plat/omap_device.h> | 88 | #include <plat/omap_device.h> |
| 88 | #include <plat/omap_hwmod.h> | 89 | #include <plat/omap_hwmod.h> |
| 90 | #include <plat/clock.h> | ||
| 89 | 91 | ||
| 90 | /* These parameters are passed to _omap_device_{de,}activate() */ | 92 | /* These parameters are passed to _omap_device_{de,}activate() */ |
| 91 | #define USE_WAKEUP_LAT 0 | 93 | #define USE_WAKEUP_LAT 0 |
| @@ -239,12 +241,12 @@ static inline struct omap_device *_find_by_pdev(struct platform_device *pdev) | |||
| 239 | } | 241 | } |
| 240 | 242 | ||
| 241 | /** | 243 | /** |
| 242 | * _add_optional_clock_alias - Add clock alias for hwmod optional clocks | 244 | * _add_optional_clock_clkdev - Add clkdev entry for hwmod optional clocks |
| 243 | * @od: struct omap_device *od | 245 | * @od: struct omap_device *od |
| 244 | * | 246 | * |
| 245 | * For every optional clock present per hwmod per omap_device, this function | 247 | * For every optional clock present per hwmod per omap_device, this function |
| 246 | * adds an entry in the clocks list of the form <dev-id=dev_name, con-id=role> | 248 | * adds an entry in the clkdev table of the form <dev-id=dev_name, con-id=role> |
| 247 | * if an entry is already present in it with the form <dev-id=NULL, con-id=role> | 249 | * if it does not exist already. |
| 248 | * | 250 | * |
| 249 | * The function is called from inside omap_device_build_ss(), after | 251 | * The function is called from inside omap_device_build_ss(), after |
| 250 | * omap_device_register. | 252 | * omap_device_register. |
| @@ -254,25 +256,39 @@ static inline struct omap_device *_find_by_pdev(struct platform_device *pdev) | |||
| 254 | * | 256 | * |
| 255 | * No return value. | 257 | * No return value. |
| 256 | */ | 258 | */ |
| 257 | static void _add_optional_clock_alias(struct omap_device *od, | 259 | static void _add_optional_clock_clkdev(struct omap_device *od, |
| 258 | struct omap_hwmod *oh) | 260 | struct omap_hwmod *oh) |
| 259 | { | 261 | { |
| 260 | int i; | 262 | int i; |
| 261 | 263 | ||
| 262 | for (i = 0; i < oh->opt_clks_cnt; i++) { | 264 | for (i = 0; i < oh->opt_clks_cnt; i++) { |
| 263 | struct omap_hwmod_opt_clk *oc; | 265 | struct omap_hwmod_opt_clk *oc; |
| 264 | int r; | 266 | struct clk *r; |
| 267 | struct clk_lookup *l; | ||
| 265 | 268 | ||
| 266 | oc = &oh->opt_clks[i]; | 269 | oc = &oh->opt_clks[i]; |
| 267 | 270 | ||
| 268 | if (!oc->_clk) | 271 | if (!oc->_clk) |
| 269 | continue; | 272 | continue; |
| 270 | 273 | ||
| 271 | r = clk_add_alias(oc->role, dev_name(&od->pdev.dev), | 274 | r = clk_get_sys(dev_name(&od->pdev.dev), oc->role); |
| 272 | (char *)oc->clk, &od->pdev.dev); | 275 | if (!IS_ERR(r)) |
| 273 | if (r) | 276 | continue; /* clkdev entry exists */ |
| 274 | pr_err("omap_device: %s: clk_add_alias for %s failed\n", | 277 | |
| 278 | r = omap_clk_get_by_name((char *)oc->clk); | ||
| 279 | if (IS_ERR(r)) { | ||
| 280 | pr_err("omap_device: %s: omap_clk_get_by_name for %s failed\n", | ||
| 281 | dev_name(&od->pdev.dev), oc->clk); | ||
| 282 | continue; | ||
| 283 | } | ||
| 284 | |||
| 285 | l = clkdev_alloc(r, oc->role, dev_name(&od->pdev.dev)); | ||
| 286 | if (!l) { | ||
| 287 | pr_err("omap_device: %s: clkdev_alloc for %s failed\n", | ||
| 275 | dev_name(&od->pdev.dev), oc->role); | 288 | dev_name(&od->pdev.dev), oc->role); |
| 289 | return; | ||
| 290 | } | ||
| 291 | clkdev_add(l); | ||
| 276 | } | 292 | } |
| 277 | } | 293 | } |
| 278 | 294 | ||
| @@ -480,7 +496,7 @@ struct omap_device *omap_device_build_ss(const char *pdev_name, int pdev_id, | |||
| 480 | 496 | ||
| 481 | for (i = 0; i < oh_cnt; i++) { | 497 | for (i = 0; i < oh_cnt; i++) { |
| 482 | hwmods[i]->od = od; | 498 | hwmods[i]->od = od; |
| 483 | _add_optional_clock_alias(od, hwmods[i]); | 499 | _add_optional_clock_clkdev(od, hwmods[i]); |
| 484 | } | 500 | } |
| 485 | 501 | ||
| 486 | if (ret) | 502 | if (ret) |
diff --git a/arch/arm/plat-samsung/dev-uart.c b/arch/arm/plat-samsung/dev-uart.c index 3776cd95245..5928105490f 100644 --- a/arch/arm/plat-samsung/dev-uart.c +++ b/arch/arm/plat-samsung/dev-uart.c | |||
| @@ -15,6 +15,8 @@ | |||
| 15 | #include <linux/kernel.h> | 15 | #include <linux/kernel.h> |
| 16 | #include <linux/platform_device.h> | 16 | #include <linux/platform_device.h> |
| 17 | 17 | ||
| 18 | #include <plat/devs.h> | ||
| 19 | |||
| 18 | /* uart devices */ | 20 | /* uart devices */ |
| 19 | 21 | ||
| 20 | static struct platform_device s3c24xx_uart_device0 = { | 22 | static struct platform_device s3c24xx_uart_device0 = { |
diff --git a/arch/blackfin/lib/outs.S b/arch/blackfin/lib/outs.S index 250f4d4b943..06a5e674401 100644 --- a/arch/blackfin/lib/outs.S +++ b/arch/blackfin/lib/outs.S | |||
| @@ -13,6 +13,8 @@ | |||
| 13 | .align 2 | 13 | .align 2 |
| 14 | 14 | ||
| 15 | ENTRY(_outsl) | 15 | ENTRY(_outsl) |
| 16 | CC = R2 == 0; | ||
| 17 | IF CC JUMP 1f; | ||
| 16 | P0 = R0; /* P0 = port */ | 18 | P0 = R0; /* P0 = port */ |
| 17 | P1 = R1; /* P1 = address */ | 19 | P1 = R1; /* P1 = address */ |
| 18 | P2 = R2; /* P2 = count */ | 20 | P2 = R2; /* P2 = count */ |
| @@ -20,10 +22,12 @@ ENTRY(_outsl) | |||
| 20 | LSETUP( .Llong_loop_s, .Llong_loop_e) LC0 = P2; | 22 | LSETUP( .Llong_loop_s, .Llong_loop_e) LC0 = P2; |
| 21 | .Llong_loop_s: R0 = [P1++]; | 23 | .Llong_loop_s: R0 = [P1++]; |
| 22 | .Llong_loop_e: [P0] = R0; | 24 | .Llong_loop_e: [P0] = R0; |
| 23 | RTS; | 25 | 1: RTS; |
| 24 | ENDPROC(_outsl) | 26 | ENDPROC(_outsl) |
| 25 | 27 | ||
| 26 | ENTRY(_outsw) | 28 | ENTRY(_outsw) |
| 29 | CC = R2 == 0; | ||
| 30 | IF CC JUMP 1f; | ||
| 27 | P0 = R0; /* P0 = port */ | 31 | P0 = R0; /* P0 = port */ |
| 28 | P1 = R1; /* P1 = address */ | 32 | P1 = R1; /* P1 = address */ |
| 29 | P2 = R2; /* P2 = count */ | 33 | P2 = R2; /* P2 = count */ |
| @@ -31,10 +35,12 @@ ENTRY(_outsw) | |||
| 31 | LSETUP( .Lword_loop_s, .Lword_loop_e) LC0 = P2; | 35 | LSETUP( .Lword_loop_s, .Lword_loop_e) LC0 = P2; |
| 32 | .Lword_loop_s: R0 = W[P1++]; | 36 | .Lword_loop_s: R0 = W[P1++]; |
| 33 | .Lword_loop_e: W[P0] = R0; | 37 | .Lword_loop_e: W[P0] = R0; |
| 34 | RTS; | 38 | 1: RTS; |
| 35 | ENDPROC(_outsw) | 39 | ENDPROC(_outsw) |
| 36 | 40 | ||
| 37 | ENTRY(_outsb) | 41 | ENTRY(_outsb) |
| 42 | CC = R2 == 0; | ||
| 43 | IF CC JUMP 1f; | ||
| 38 | P0 = R0; /* P0 = port */ | 44 | P0 = R0; /* P0 = port */ |
| 39 | P1 = R1; /* P1 = address */ | 45 | P1 = R1; /* P1 = address */ |
| 40 | P2 = R2; /* P2 = count */ | 46 | P2 = R2; /* P2 = count */ |
| @@ -42,10 +48,12 @@ ENTRY(_outsb) | |||
| 42 | LSETUP( .Lbyte_loop_s, .Lbyte_loop_e) LC0 = P2; | 48 | LSETUP( .Lbyte_loop_s, .Lbyte_loop_e) LC0 = P2; |
| 43 | .Lbyte_loop_s: R0 = B[P1++]; | 49 | .Lbyte_loop_s: R0 = B[P1++]; |
| 44 | .Lbyte_loop_e: B[P0] = R0; | 50 | .Lbyte_loop_e: B[P0] = R0; |
| 45 | RTS; | 51 | 1: RTS; |
| 46 | ENDPROC(_outsb) | 52 | ENDPROC(_outsb) |
| 47 | 53 | ||
| 48 | ENTRY(_outsw_8) | 54 | ENTRY(_outsw_8) |
| 55 | CC = R2 == 0; | ||
| 56 | IF CC JUMP 1f; | ||
| 49 | P0 = R0; /* P0 = port */ | 57 | P0 = R0; /* P0 = port */ |
| 50 | P1 = R1; /* P1 = address */ | 58 | P1 = R1; /* P1 = address */ |
| 51 | P2 = R2; /* P2 = count */ | 59 | P2 = R2; /* P2 = count */ |
| @@ -56,5 +64,5 @@ ENTRY(_outsw_8) | |||
| 56 | R0 = R0 << 8; | 64 | R0 = R0 << 8; |
| 57 | R0 = R0 + R1; | 65 | R0 = R0 + R1; |
| 58 | .Lword8_loop_e: W[P0] = R0; | 66 | .Lword8_loop_e: W[P0] = R0; |
| 59 | RTS; | 67 | 1: RTS; |
| 60 | ENDPROC(_outsw_8) | 68 | ENDPROC(_outsw_8) |
diff --git a/arch/blackfin/mach-common/cache.S b/arch/blackfin/mach-common/cache.S index 790c767ca95..ab4a925a443 100644 --- a/arch/blackfin/mach-common/cache.S +++ b/arch/blackfin/mach-common/cache.S | |||
| @@ -58,6 +58,8 @@ | |||
| 58 | 1: | 58 | 1: |
| 59 | .ifeqs "\flushins", BROK_FLUSH_INST | 59 | .ifeqs "\flushins", BROK_FLUSH_INST |
| 60 | \flushins [P0++]; | 60 | \flushins [P0++]; |
| 61 | nop; | ||
| 62 | nop; | ||
| 61 | 2: nop; | 63 | 2: nop; |
| 62 | .else | 64 | .else |
| 63 | 2: \flushins [P0++]; | 65 | 2: \flushins [P0++]; |
diff --git a/arch/powerpc/include/asm/machdep.h b/arch/powerpc/include/asm/machdep.h index 991d5998d6b..fe56a23e1ff 100644 --- a/arch/powerpc/include/asm/machdep.h +++ b/arch/powerpc/include/asm/machdep.h | |||
| @@ -240,6 +240,12 @@ struct machdep_calls { | |||
| 240 | * claims to support kexec. | 240 | * claims to support kexec. |
| 241 | */ | 241 | */ |
| 242 | int (*machine_kexec_prepare)(struct kimage *image); | 242 | int (*machine_kexec_prepare)(struct kimage *image); |
| 243 | |||
| 244 | /* Called to perform the _real_ kexec. | ||
| 245 | * Do NOT allocate memory or fail here. We are past the point of | ||
| 246 | * no return. | ||
| 247 | */ | ||
| 248 | void (*machine_kexec)(struct kimage *image); | ||
| 243 | #endif /* CONFIG_KEXEC */ | 249 | #endif /* CONFIG_KEXEC */ |
| 244 | 250 | ||
| 245 | #ifdef CONFIG_SUSPEND | 251 | #ifdef CONFIG_SUSPEND |
diff --git a/arch/powerpc/kernel/machine_kexec.c b/arch/powerpc/kernel/machine_kexec.c index 49a170af814..a5f8672eeff 100644 --- a/arch/powerpc/kernel/machine_kexec.c +++ b/arch/powerpc/kernel/machine_kexec.c | |||
| @@ -87,7 +87,10 @@ void machine_kexec(struct kimage *image) | |||
| 87 | 87 | ||
| 88 | save_ftrace_enabled = __ftrace_enabled_save(); | 88 | save_ftrace_enabled = __ftrace_enabled_save(); |
| 89 | 89 | ||
| 90 | default_machine_kexec(image); | 90 | if (ppc_md.machine_kexec) |
| 91 | ppc_md.machine_kexec(image); | ||
| 92 | else | ||
| 93 | default_machine_kexec(image); | ||
| 91 | 94 | ||
| 92 | __ftrace_enabled_restore(save_ftrace_enabled); | 95 | __ftrace_enabled_restore(save_ftrace_enabled); |
| 93 | 96 | ||
diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c index 7a1d5cb7693..8303a6c65ef 100644 --- a/arch/powerpc/kernel/process.c +++ b/arch/powerpc/kernel/process.c | |||
| @@ -353,6 +353,7 @@ static void switch_booke_debug_regs(struct thread_struct *new_thread) | |||
| 353 | prime_debug_regs(new_thread); | 353 | prime_debug_regs(new_thread); |
| 354 | } | 354 | } |
| 355 | #else /* !CONFIG_PPC_ADV_DEBUG_REGS */ | 355 | #else /* !CONFIG_PPC_ADV_DEBUG_REGS */ |
| 356 | #ifndef CONFIG_HAVE_HW_BREAKPOINT | ||
| 356 | static void set_debug_reg_defaults(struct thread_struct *thread) | 357 | static void set_debug_reg_defaults(struct thread_struct *thread) |
| 357 | { | 358 | { |
| 358 | if (thread->dabr) { | 359 | if (thread->dabr) { |
| @@ -360,6 +361,7 @@ static void set_debug_reg_defaults(struct thread_struct *thread) | |||
| 360 | set_dabr(0); | 361 | set_dabr(0); |
| 361 | } | 362 | } |
| 362 | } | 363 | } |
| 364 | #endif /* !CONFIG_HAVE_HW_BREAKPOINT */ | ||
| 363 | #endif /* CONFIG_PPC_ADV_DEBUG_REGS */ | 365 | #endif /* CONFIG_PPC_ADV_DEBUG_REGS */ |
| 364 | 366 | ||
| 365 | int set_dabr(unsigned long dabr) | 367 | int set_dabr(unsigned long dabr) |
| @@ -670,11 +672,11 @@ void flush_thread(void) | |||
| 670 | { | 672 | { |
| 671 | discard_lazy_cpu_state(); | 673 | discard_lazy_cpu_state(); |
| 672 | 674 | ||
| 673 | #ifdef CONFIG_HAVE_HW_BREAKPOINTS | 675 | #ifdef CONFIG_HAVE_HW_BREAKPOINT |
| 674 | flush_ptrace_hw_breakpoint(current); | 676 | flush_ptrace_hw_breakpoint(current); |
| 675 | #else /* CONFIG_HAVE_HW_BREAKPOINTS */ | 677 | #else /* CONFIG_HAVE_HW_BREAKPOINT */ |
| 676 | set_debug_reg_defaults(¤t->thread); | 678 | set_debug_reg_defaults(¤t->thread); |
| 677 | #endif /* CONFIG_HAVE_HW_BREAKPOINTS */ | 679 | #endif /* CONFIG_HAVE_HW_BREAKPOINT */ |
| 678 | } | 680 | } |
| 679 | 681 | ||
| 680 | void | 682 | void |
diff --git a/arch/powerpc/mm/tlb_hash64.c b/arch/powerpc/mm/tlb_hash64.c index 1ec06576f61..c14d09f614f 100644 --- a/arch/powerpc/mm/tlb_hash64.c +++ b/arch/powerpc/mm/tlb_hash64.c | |||
| @@ -38,13 +38,11 @@ DEFINE_PER_CPU(struct ppc64_tlb_batch, ppc64_tlb_batch); | |||
| 38 | * neesd to be flushed. This function will either perform the flush | 38 | * neesd to be flushed. This function will either perform the flush |
| 39 | * immediately or will batch it up if the current CPU has an active | 39 | * immediately or will batch it up if the current CPU has an active |
| 40 | * batch on it. | 40 | * batch on it. |
| 41 | * | ||
| 42 | * Must be called from within some kind of spinlock/non-preempt region... | ||
| 43 | */ | 41 | */ |
| 44 | void hpte_need_flush(struct mm_struct *mm, unsigned long addr, | 42 | void hpte_need_flush(struct mm_struct *mm, unsigned long addr, |
| 45 | pte_t *ptep, unsigned long pte, int huge) | 43 | pte_t *ptep, unsigned long pte, int huge) |
| 46 | { | 44 | { |
| 47 | struct ppc64_tlb_batch *batch = &__get_cpu_var(ppc64_tlb_batch); | 45 | struct ppc64_tlb_batch *batch = &get_cpu_var(ppc64_tlb_batch); |
| 48 | unsigned long vsid, vaddr; | 46 | unsigned long vsid, vaddr; |
| 49 | unsigned int psize; | 47 | unsigned int psize; |
| 50 | int ssize; | 48 | int ssize; |
| @@ -99,6 +97,7 @@ void hpte_need_flush(struct mm_struct *mm, unsigned long addr, | |||
| 99 | */ | 97 | */ |
| 100 | if (!batch->active) { | 98 | if (!batch->active) { |
| 101 | flush_hash_page(vaddr, rpte, psize, ssize, 0); | 99 | flush_hash_page(vaddr, rpte, psize, ssize, 0); |
| 100 | put_cpu_var(ppc64_tlb_batch); | ||
| 102 | return; | 101 | return; |
| 103 | } | 102 | } |
| 104 | 103 | ||
| @@ -127,6 +126,7 @@ void hpte_need_flush(struct mm_struct *mm, unsigned long addr, | |||
| 127 | batch->index = ++i; | 126 | batch->index = ++i; |
| 128 | if (i >= PPC64_TLB_BATCH_NR) | 127 | if (i >= PPC64_TLB_BATCH_NR) |
| 129 | __flush_tlb_pending(batch); | 128 | __flush_tlb_pending(batch); |
| 129 | put_cpu_var(ppc64_tlb_batch); | ||
| 130 | } | 130 | } |
| 131 | 131 | ||
| 132 | /* | 132 | /* |
diff --git a/arch/sh/include/asm/sections.h b/arch/sh/include/asm/sections.h index a78701da775..4a5350037c8 100644 --- a/arch/sh/include/asm/sections.h +++ b/arch/sh/include/asm/sections.h | |||
| @@ -3,7 +3,7 @@ | |||
| 3 | 3 | ||
| 4 | #include <asm-generic/sections.h> | 4 | #include <asm-generic/sections.h> |
| 5 | 5 | ||
| 6 | extern void __nosave_begin, __nosave_end; | 6 | extern long __nosave_begin, __nosave_end; |
| 7 | extern long __machvec_start, __machvec_end; | 7 | extern long __machvec_start, __machvec_end; |
| 8 | extern char __uncached_start, __uncached_end; | 8 | extern char __uncached_start, __uncached_end; |
| 9 | extern char _ebss[]; | 9 | extern char _ebss[]; |
diff --git a/arch/sh/kernel/cpu/sh4/setup-sh7750.c b/arch/sh/kernel/cpu/sh4/setup-sh7750.c index 672944f5b19..e53b4b38bd1 100644 --- a/arch/sh/kernel/cpu/sh4/setup-sh7750.c +++ b/arch/sh/kernel/cpu/sh4/setup-sh7750.c | |||
| @@ -14,7 +14,7 @@ | |||
| 14 | #include <linux/io.h> | 14 | #include <linux/io.h> |
| 15 | #include <linux/sh_timer.h> | 15 | #include <linux/sh_timer.h> |
| 16 | #include <linux/serial_sci.h> | 16 | #include <linux/serial_sci.h> |
| 17 | #include <asm/machtypes.h> | 17 | #include <generated/machtypes.h> |
| 18 | 18 | ||
| 19 | static struct resource rtc_resources[] = { | 19 | static struct resource rtc_resources[] = { |
| 20 | [0] = { | 20 | [0] = { |
| @@ -255,12 +255,17 @@ static struct platform_device *sh7750_early_devices[] __initdata = { | |||
| 255 | 255 | ||
| 256 | void __init plat_early_device_setup(void) | 256 | void __init plat_early_device_setup(void) |
| 257 | { | 257 | { |
| 258 | struct platform_device *dev[1]; | ||
| 259 | |||
| 258 | if (mach_is_rts7751r2d()) { | 260 | if (mach_is_rts7751r2d()) { |
| 259 | scif_platform_data.scscr |= SCSCR_CKE1; | 261 | scif_platform_data.scscr |= SCSCR_CKE1; |
| 260 | early_platform_add_devices(&scif_device, 1); | 262 | dev[0] = &scif_device; |
| 263 | early_platform_add_devices(dev, 1); | ||
| 261 | } else { | 264 | } else { |
| 262 | early_platform_add_devices(&sci_device, 1); | 265 | dev[0] = &sci_device; |
| 263 | early_platform_add_devices(&scif_device, 1); | 266 | early_platform_add_devices(dev, 1); |
| 267 | dev[0] = &scif_device; | ||
| 268 | early_platform_add_devices(dev, 1); | ||
| 264 | } | 269 | } |
| 265 | 270 | ||
| 266 | early_platform_add_devices(sh7750_early_devices, | 271 | early_platform_add_devices(sh7750_early_devices, |
diff --git a/arch/sh/lib/delay.c b/arch/sh/lib/delay.c index faa8f86c0db..0901b2f14e1 100644 --- a/arch/sh/lib/delay.c +++ b/arch/sh/lib/delay.c | |||
| @@ -10,6 +10,16 @@ | |||
| 10 | void __delay(unsigned long loops) | 10 | void __delay(unsigned long loops) |
| 11 | { | 11 | { |
| 12 | __asm__ __volatile__( | 12 | __asm__ __volatile__( |
| 13 | /* | ||
| 14 | * ST40-300 appears to have an issue with this code, | ||
| 15 | * normally taking two cycles each loop, as with all | ||
| 16 | * other SH variants. If however the branch and the | ||
| 17 | * delay slot straddle an 8 byte boundary, this increases | ||
| 18 | * to 3 cycles. | ||
| 19 | * This align directive ensures this doesn't occur. | ||
| 20 | */ | ||
| 21 | ".balign 8\n\t" | ||
| 22 | |||
| 13 | "tst %0, %0\n\t" | 23 | "tst %0, %0\n\t" |
| 14 | "1:\t" | 24 | "1:\t" |
| 15 | "bf/s 1b\n\t" | 25 | "bf/s 1b\n\t" |
diff --git a/arch/sh/mm/cache.c b/arch/sh/mm/cache.c index 88d3dc3d30d..5a580ea0442 100644 --- a/arch/sh/mm/cache.c +++ b/arch/sh/mm/cache.c | |||
| @@ -108,7 +108,8 @@ void copy_user_highpage(struct page *to, struct page *from, | |||
| 108 | kunmap_atomic(vfrom, KM_USER0); | 108 | kunmap_atomic(vfrom, KM_USER0); |
| 109 | } | 109 | } |
| 110 | 110 | ||
| 111 | if (pages_do_alias((unsigned long)vto, vaddr & PAGE_MASK)) | 111 | if (pages_do_alias((unsigned long)vto, vaddr & PAGE_MASK) || |
| 112 | (vma->vm_flags & VM_EXEC)) | ||
| 112 | __flush_purge_region(vto, PAGE_SIZE); | 113 | __flush_purge_region(vto, PAGE_SIZE); |
| 113 | 114 | ||
| 114 | kunmap_atomic(vto, KM_USER1); | 115 | kunmap_atomic(vto, KM_USER1); |
diff --git a/arch/x86/include/asm/msr-index.h b/arch/x86/include/asm/msr-index.h index 4d0dfa0d998..43a18c77676 100644 --- a/arch/x86/include/asm/msr-index.h +++ b/arch/x86/include/asm/msr-index.h | |||
| @@ -36,6 +36,11 @@ | |||
| 36 | #define MSR_IA32_PERFCTR1 0x000000c2 | 36 | #define MSR_IA32_PERFCTR1 0x000000c2 |
| 37 | #define MSR_FSB_FREQ 0x000000cd | 37 | #define MSR_FSB_FREQ 0x000000cd |
| 38 | 38 | ||
| 39 | #define MSR_NHM_SNB_PKG_CST_CFG_CTL 0x000000e2 | ||
| 40 | #define NHM_C3_AUTO_DEMOTE (1UL << 25) | ||
| 41 | #define NHM_C1_AUTO_DEMOTE (1UL << 26) | ||
| 42 | #define ATM_LNC_C6_AUTO_DEMOTE (1UL << 25) | ||
| 43 | |||
| 39 | #define MSR_MTRRcap 0x000000fe | 44 | #define MSR_MTRRcap 0x000000fe |
| 40 | #define MSR_IA32_BBL_CR_CTL 0x00000119 | 45 | #define MSR_IA32_BBL_CR_CTL 0x00000119 |
| 41 | 46 | ||
diff --git a/arch/x86/kernel/cpu/cpufreq/p4-clockmod.c b/arch/x86/kernel/cpu/cpufreq/p4-clockmod.c index bd1cac747f6..52c93648e49 100644 --- a/arch/x86/kernel/cpu/cpufreq/p4-clockmod.c +++ b/arch/x86/kernel/cpu/cpufreq/p4-clockmod.c | |||
| @@ -158,9 +158,9 @@ static unsigned int cpufreq_p4_get_frequency(struct cpuinfo_x86 *c) | |||
| 158 | { | 158 | { |
| 159 | if (c->x86 == 0x06) { | 159 | if (c->x86 == 0x06) { |
| 160 | if (cpu_has(c, X86_FEATURE_EST)) | 160 | if (cpu_has(c, X86_FEATURE_EST)) |
| 161 | printk(KERN_WARNING PFX "Warning: EST-capable CPU " | 161 | printk_once(KERN_WARNING PFX "Warning: EST-capable " |
| 162 | "detected. The acpi-cpufreq module offers " | 162 | "CPU detected. The acpi-cpufreq module offers " |
| 163 | "voltage scaling in addition of frequency " | 163 | "voltage scaling in addition to frequency " |
| 164 | "scaling. You should use that instead of " | 164 | "scaling. You should use that instead of " |
| 165 | "p4-clockmod, if possible.\n"); | 165 | "p4-clockmod, if possible.\n"); |
| 166 | switch (c->x86_model) { | 166 | switch (c->x86_model) { |
diff --git a/arch/x86/kernel/cpu/cpufreq/powernow-k8.c b/arch/x86/kernel/cpu/cpufreq/powernow-k8.c index 35c7e65e59b..c567dec854f 100644 --- a/arch/x86/kernel/cpu/cpufreq/powernow-k8.c +++ b/arch/x86/kernel/cpu/cpufreq/powernow-k8.c | |||
| @@ -1537,6 +1537,7 @@ static struct notifier_block cpb_nb = { | |||
| 1537 | static int __cpuinit powernowk8_init(void) | 1537 | static int __cpuinit powernowk8_init(void) |
| 1538 | { | 1538 | { |
| 1539 | unsigned int i, supported_cpus = 0, cpu; | 1539 | unsigned int i, supported_cpus = 0, cpu; |
| 1540 | int rv; | ||
| 1540 | 1541 | ||
| 1541 | for_each_online_cpu(i) { | 1542 | for_each_online_cpu(i) { |
| 1542 | int rc; | 1543 | int rc; |
| @@ -1555,14 +1556,14 @@ static int __cpuinit powernowk8_init(void) | |||
| 1555 | 1556 | ||
| 1556 | cpb_capable = true; | 1557 | cpb_capable = true; |
| 1557 | 1558 | ||
| 1558 | register_cpu_notifier(&cpb_nb); | ||
| 1559 | |||
| 1560 | msrs = msrs_alloc(); | 1559 | msrs = msrs_alloc(); |
| 1561 | if (!msrs) { | 1560 | if (!msrs) { |
| 1562 | printk(KERN_ERR "%s: Error allocating msrs!\n", __func__); | 1561 | printk(KERN_ERR "%s: Error allocating msrs!\n", __func__); |
| 1563 | return -ENOMEM; | 1562 | return -ENOMEM; |
| 1564 | } | 1563 | } |
| 1565 | 1564 | ||
| 1565 | register_cpu_notifier(&cpb_nb); | ||
| 1566 | |||
| 1566 | rdmsr_on_cpus(cpu_online_mask, MSR_K7_HWCR, msrs); | 1567 | rdmsr_on_cpus(cpu_online_mask, MSR_K7_HWCR, msrs); |
| 1567 | 1568 | ||
| 1568 | for_each_cpu(cpu, cpu_online_mask) { | 1569 | for_each_cpu(cpu, cpu_online_mask) { |
| @@ -1574,7 +1575,13 @@ static int __cpuinit powernowk8_init(void) | |||
| 1574 | (cpb_enabled ? "on" : "off")); | 1575 | (cpb_enabled ? "on" : "off")); |
| 1575 | } | 1576 | } |
| 1576 | 1577 | ||
| 1577 | return cpufreq_register_driver(&cpufreq_amd64_driver); | 1578 | rv = cpufreq_register_driver(&cpufreq_amd64_driver); |
| 1579 | if (rv < 0 && boot_cpu_has(X86_FEATURE_CPB)) { | ||
| 1580 | unregister_cpu_notifier(&cpb_nb); | ||
| 1581 | msrs_free(msrs); | ||
| 1582 | msrs = NULL; | ||
| 1583 | } | ||
| 1584 | return rv; | ||
| 1578 | } | 1585 | } |
| 1579 | 1586 | ||
| 1580 | /* driver entry point for term */ | 1587 | /* driver entry point for term */ |
diff --git a/arch/x86/platform/olpc/olpc_dt.c b/arch/x86/platform/olpc/olpc_dt.c index dab87464753..044bda5b317 100644 --- a/arch/x86/platform/olpc/olpc_dt.c +++ b/arch/x86/platform/olpc/olpc_dt.c | |||
| @@ -140,8 +140,7 @@ void * __init prom_early_alloc(unsigned long size) | |||
| 140 | * wasted bootmem) and hand off chunks of it to callers. | 140 | * wasted bootmem) and hand off chunks of it to callers. |
| 141 | */ | 141 | */ |
| 142 | res = alloc_bootmem(chunk_size); | 142 | res = alloc_bootmem(chunk_size); |
| 143 | if (!res) | 143 | BUG_ON(!res); |
| 144 | return NULL; | ||
| 145 | prom_early_allocated += chunk_size; | 144 | prom_early_allocated += chunk_size; |
| 146 | memset(res, 0, chunk_size); | 145 | memset(res, 0, chunk_size); |
| 147 | free_mem = chunk_size; | 146 | free_mem = chunk_size; |
diff --git a/block/blk-core.c b/block/blk-core.c index 2f4002f79a2..518dd423a5f 100644 --- a/block/blk-core.c +++ b/block/blk-core.c | |||
| @@ -352,7 +352,7 @@ void blk_start_queue(struct request_queue *q) | |||
| 352 | WARN_ON(!irqs_disabled()); | 352 | WARN_ON(!irqs_disabled()); |
| 353 | 353 | ||
| 354 | queue_flag_clear(QUEUE_FLAG_STOPPED, q); | 354 | queue_flag_clear(QUEUE_FLAG_STOPPED, q); |
| 355 | __blk_run_queue(q); | 355 | __blk_run_queue(q, false); |
| 356 | } | 356 | } |
| 357 | EXPORT_SYMBOL(blk_start_queue); | 357 | EXPORT_SYMBOL(blk_start_queue); |
| 358 | 358 | ||
| @@ -403,13 +403,14 @@ EXPORT_SYMBOL(blk_sync_queue); | |||
| 403 | /** | 403 | /** |
| 404 | * __blk_run_queue - run a single device queue | 404 | * __blk_run_queue - run a single device queue |
| 405 | * @q: The queue to run | 405 | * @q: The queue to run |
| 406 | * @force_kblockd: Don't run @q->request_fn directly. Use kblockd. | ||
| 406 | * | 407 | * |
| 407 | * Description: | 408 | * Description: |
| 408 | * See @blk_run_queue. This variant must be called with the queue lock | 409 | * See @blk_run_queue. This variant must be called with the queue lock |
| 409 | * held and interrupts disabled. | 410 | * held and interrupts disabled. |
| 410 | * | 411 | * |
| 411 | */ | 412 | */ |
| 412 | void __blk_run_queue(struct request_queue *q) | 413 | void __blk_run_queue(struct request_queue *q, bool force_kblockd) |
| 413 | { | 414 | { |
| 414 | blk_remove_plug(q); | 415 | blk_remove_plug(q); |
| 415 | 416 | ||
| @@ -423,7 +424,7 @@ void __blk_run_queue(struct request_queue *q) | |||
| 423 | * Only recurse once to avoid overrunning the stack, let the unplug | 424 | * Only recurse once to avoid overrunning the stack, let the unplug |
| 424 | * handling reinvoke the handler shortly if we already got there. | 425 | * handling reinvoke the handler shortly if we already got there. |
| 425 | */ | 426 | */ |
| 426 | if (!queue_flag_test_and_set(QUEUE_FLAG_REENTER, q)) { | 427 | if (!force_kblockd && !queue_flag_test_and_set(QUEUE_FLAG_REENTER, q)) { |
| 427 | q->request_fn(q); | 428 | q->request_fn(q); |
| 428 | queue_flag_clear(QUEUE_FLAG_REENTER, q); | 429 | queue_flag_clear(QUEUE_FLAG_REENTER, q); |
| 429 | } else { | 430 | } else { |
| @@ -446,7 +447,7 @@ void blk_run_queue(struct request_queue *q) | |||
| 446 | unsigned long flags; | 447 | unsigned long flags; |
| 447 | 448 | ||
| 448 | spin_lock_irqsave(q->queue_lock, flags); | 449 | spin_lock_irqsave(q->queue_lock, flags); |
| 449 | __blk_run_queue(q); | 450 | __blk_run_queue(q, false); |
| 450 | spin_unlock_irqrestore(q->queue_lock, flags); | 451 | spin_unlock_irqrestore(q->queue_lock, flags); |
| 451 | } | 452 | } |
| 452 | EXPORT_SYMBOL(blk_run_queue); | 453 | EXPORT_SYMBOL(blk_run_queue); |
| @@ -1053,7 +1054,7 @@ void blk_insert_request(struct request_queue *q, struct request *rq, | |||
| 1053 | 1054 | ||
| 1054 | drive_stat_acct(rq, 1); | 1055 | drive_stat_acct(rq, 1); |
| 1055 | __elv_add_request(q, rq, where, 0); | 1056 | __elv_add_request(q, rq, where, 0); |
| 1056 | __blk_run_queue(q); | 1057 | __blk_run_queue(q, false); |
| 1057 | spin_unlock_irqrestore(q->queue_lock, flags); | 1058 | spin_unlock_irqrestore(q->queue_lock, flags); |
| 1058 | } | 1059 | } |
| 1059 | EXPORT_SYMBOL(blk_insert_request); | 1060 | EXPORT_SYMBOL(blk_insert_request); |
| @@ -2610,13 +2611,6 @@ int kblockd_schedule_work(struct request_queue *q, struct work_struct *work) | |||
| 2610 | } | 2611 | } |
| 2611 | EXPORT_SYMBOL(kblockd_schedule_work); | 2612 | EXPORT_SYMBOL(kblockd_schedule_work); |
| 2612 | 2613 | ||
| 2613 | int kblockd_schedule_delayed_work(struct request_queue *q, | ||
| 2614 | struct delayed_work *dwork, unsigned long delay) | ||
| 2615 | { | ||
| 2616 | return queue_delayed_work(kblockd_workqueue, dwork, delay); | ||
| 2617 | } | ||
| 2618 | EXPORT_SYMBOL(kblockd_schedule_delayed_work); | ||
| 2619 | |||
| 2620 | int __init blk_dev_init(void) | 2614 | int __init blk_dev_init(void) |
| 2621 | { | 2615 | { |
| 2622 | BUILD_BUG_ON(__REQ_NR_BITS > 8 * | 2616 | BUILD_BUG_ON(__REQ_NR_BITS > 8 * |
diff --git a/block/blk-flush.c b/block/blk-flush.c index 54b123d6563..b27d0208611 100644 --- a/block/blk-flush.c +++ b/block/blk-flush.c | |||
| @@ -66,10 +66,12 @@ static void blk_flush_complete_seq_end_io(struct request_queue *q, | |||
| 66 | 66 | ||
| 67 | /* | 67 | /* |
| 68 | * Moving a request silently to empty queue_head may stall the | 68 | * Moving a request silently to empty queue_head may stall the |
| 69 | * queue. Kick the queue in those cases. | 69 | * queue. Kick the queue in those cases. This function is called |
| 70 | * from request completion path and calling directly into | ||
| 71 | * request_fn may confuse the driver. Always use kblockd. | ||
| 70 | */ | 72 | */ |
| 71 | if (was_empty && next_rq) | 73 | if (was_empty && next_rq) |
| 72 | __blk_run_queue(q); | 74 | __blk_run_queue(q, true); |
| 73 | } | 75 | } |
| 74 | 76 | ||
| 75 | static void pre_flush_end_io(struct request *rq, int error) | 77 | static void pre_flush_end_io(struct request *rq, int error) |
| @@ -130,7 +132,7 @@ static struct request *queue_next_fseq(struct request_queue *q) | |||
| 130 | BUG(); | 132 | BUG(); |
| 131 | } | 133 | } |
| 132 | 134 | ||
| 133 | elv_insert(q, rq, ELEVATOR_INSERT_FRONT); | 135 | elv_insert(q, rq, ELEVATOR_INSERT_REQUEUE); |
| 134 | return rq; | 136 | return rq; |
| 135 | } | 137 | } |
| 136 | 138 | ||
diff --git a/block/blk-lib.c b/block/blk-lib.c index 1a320d2406b..eec78becb35 100644 --- a/block/blk-lib.c +++ b/block/blk-lib.c | |||
| @@ -132,7 +132,7 @@ static void bio_batch_end_io(struct bio *bio, int err) | |||
| 132 | } | 132 | } |
| 133 | 133 | ||
| 134 | /** | 134 | /** |
| 135 | * blkdev_issue_zeroout generate number of zero filed write bios | 135 | * blkdev_issue_zeroout - generate number of zero filed write bios |
| 136 | * @bdev: blockdev to issue | 136 | * @bdev: blockdev to issue |
| 137 | * @sector: start sector | 137 | * @sector: start sector |
| 138 | * @nr_sects: number of sectors to write | 138 | * @nr_sects: number of sectors to write |
diff --git a/block/blk-throttle.c b/block/blk-throttle.c index a89043a3caa..e36cc10a346 100644 --- a/block/blk-throttle.c +++ b/block/blk-throttle.c | |||
| @@ -20,6 +20,11 @@ static int throtl_quantum = 32; | |||
| 20 | /* Throttling is performed over 100ms slice and after that slice is renewed */ | 20 | /* Throttling is performed over 100ms slice and after that slice is renewed */ |
| 21 | static unsigned long throtl_slice = HZ/10; /* 100 ms */ | 21 | static unsigned long throtl_slice = HZ/10; /* 100 ms */ |
| 22 | 22 | ||
| 23 | /* A workqueue to queue throttle related work */ | ||
| 24 | static struct workqueue_struct *kthrotld_workqueue; | ||
| 25 | static void throtl_schedule_delayed_work(struct throtl_data *td, | ||
| 26 | unsigned long delay); | ||
| 27 | |||
| 23 | struct throtl_rb_root { | 28 | struct throtl_rb_root { |
| 24 | struct rb_root rb; | 29 | struct rb_root rb; |
| 25 | struct rb_node *left; | 30 | struct rb_node *left; |
| @@ -345,10 +350,9 @@ static void throtl_schedule_next_dispatch(struct throtl_data *td) | |||
| 345 | update_min_dispatch_time(st); | 350 | update_min_dispatch_time(st); |
| 346 | 351 | ||
| 347 | if (time_before_eq(st->min_disptime, jiffies)) | 352 | if (time_before_eq(st->min_disptime, jiffies)) |
| 348 | throtl_schedule_delayed_work(td->queue, 0); | 353 | throtl_schedule_delayed_work(td, 0); |
| 349 | else | 354 | else |
| 350 | throtl_schedule_delayed_work(td->queue, | 355 | throtl_schedule_delayed_work(td, (st->min_disptime - jiffies)); |
| 351 | (st->min_disptime - jiffies)); | ||
| 352 | } | 356 | } |
| 353 | 357 | ||
| 354 | static inline void | 358 | static inline void |
| @@ -815,10 +819,10 @@ void blk_throtl_work(struct work_struct *work) | |||
| 815 | } | 819 | } |
| 816 | 820 | ||
| 817 | /* Call with queue lock held */ | 821 | /* Call with queue lock held */ |
| 818 | void throtl_schedule_delayed_work(struct request_queue *q, unsigned long delay) | 822 | static void |
| 823 | throtl_schedule_delayed_work(struct throtl_data *td, unsigned long delay) | ||
| 819 | { | 824 | { |
| 820 | 825 | ||
| 821 | struct throtl_data *td = q->td; | ||
| 822 | struct delayed_work *dwork = &td->throtl_work; | 826 | struct delayed_work *dwork = &td->throtl_work; |
| 823 | 827 | ||
| 824 | if (total_nr_queued(td) > 0) { | 828 | if (total_nr_queued(td) > 0) { |
| @@ -827,12 +831,11 @@ void throtl_schedule_delayed_work(struct request_queue *q, unsigned long delay) | |||
| 827 | * Cancel that and schedule a new one. | 831 | * Cancel that and schedule a new one. |
| 828 | */ | 832 | */ |
| 829 | __cancel_delayed_work(dwork); | 833 | __cancel_delayed_work(dwork); |
| 830 | kblockd_schedule_delayed_work(q, dwork, delay); | 834 | queue_delayed_work(kthrotld_workqueue, dwork, delay); |
| 831 | throtl_log(td, "schedule work. delay=%lu jiffies=%lu", | 835 | throtl_log(td, "schedule work. delay=%lu jiffies=%lu", |
| 832 | delay, jiffies); | 836 | delay, jiffies); |
| 833 | } | 837 | } |
| 834 | } | 838 | } |
| 835 | EXPORT_SYMBOL(throtl_schedule_delayed_work); | ||
| 836 | 839 | ||
| 837 | static void | 840 | static void |
| 838 | throtl_destroy_tg(struct throtl_data *td, struct throtl_grp *tg) | 841 | throtl_destroy_tg(struct throtl_data *td, struct throtl_grp *tg) |
| @@ -920,7 +923,7 @@ static void throtl_update_blkio_group_read_bps(void *key, | |||
| 920 | smp_mb__after_atomic_inc(); | 923 | smp_mb__after_atomic_inc(); |
| 921 | 924 | ||
| 922 | /* Schedule a work now to process the limit change */ | 925 | /* Schedule a work now to process the limit change */ |
| 923 | throtl_schedule_delayed_work(td->queue, 0); | 926 | throtl_schedule_delayed_work(td, 0); |
| 924 | } | 927 | } |
| 925 | 928 | ||
| 926 | static void throtl_update_blkio_group_write_bps(void *key, | 929 | static void throtl_update_blkio_group_write_bps(void *key, |
| @@ -934,7 +937,7 @@ static void throtl_update_blkio_group_write_bps(void *key, | |||
| 934 | smp_mb__before_atomic_inc(); | 937 | smp_mb__before_atomic_inc(); |
| 935 | atomic_inc(&td->limits_changed); | 938 | atomic_inc(&td->limits_changed); |
| 936 | smp_mb__after_atomic_inc(); | 939 | smp_mb__after_atomic_inc(); |
| 937 | throtl_schedule_delayed_work(td->queue, 0); | 940 | throtl_schedule_delayed_work(td, 0); |
| 938 | } | 941 | } |
| 939 | 942 | ||
| 940 | static void throtl_update_blkio_group_read_iops(void *key, | 943 | static void throtl_update_blkio_group_read_iops(void *key, |
| @@ -948,7 +951,7 @@ static void throtl_update_blkio_group_read_iops(void *key, | |||
| 948 | smp_mb__before_atomic_inc(); | 951 | smp_mb__before_atomic_inc(); |
| 949 | atomic_inc(&td->limits_changed); | 952 | atomic_inc(&td->limits_changed); |
| 950 | smp_mb__after_atomic_inc(); | 953 | smp_mb__after_atomic_inc(); |
| 951 | throtl_schedule_delayed_work(td->queue, 0); | 954 | throtl_schedule_delayed_work(td, 0); |
| 952 | } | 955 | } |
| 953 | 956 | ||
| 954 | static void throtl_update_blkio_group_write_iops(void *key, | 957 | static void throtl_update_blkio_group_write_iops(void *key, |
| @@ -962,7 +965,7 @@ static void throtl_update_blkio_group_write_iops(void *key, | |||
| 962 | smp_mb__before_atomic_inc(); | 965 | smp_mb__before_atomic_inc(); |
| 963 | atomic_inc(&td->limits_changed); | 966 | atomic_inc(&td->limits_changed); |
| 964 | smp_mb__after_atomic_inc(); | 967 | smp_mb__after_atomic_inc(); |
| 965 | throtl_schedule_delayed_work(td->queue, 0); | 968 | throtl_schedule_delayed_work(td, 0); |
| 966 | } | 969 | } |
| 967 | 970 | ||
| 968 | void throtl_shutdown_timer_wq(struct request_queue *q) | 971 | void throtl_shutdown_timer_wq(struct request_queue *q) |
| @@ -1135,6 +1138,10 @@ void blk_throtl_exit(struct request_queue *q) | |||
| 1135 | 1138 | ||
| 1136 | static int __init throtl_init(void) | 1139 | static int __init throtl_init(void) |
| 1137 | { | 1140 | { |
| 1141 | kthrotld_workqueue = alloc_workqueue("kthrotld", WQ_MEM_RECLAIM, 0); | ||
| 1142 | if (!kthrotld_workqueue) | ||
| 1143 | panic("Failed to create kthrotld\n"); | ||
| 1144 | |||
| 1138 | blkio_policy_register(&blkio_policy_throtl); | 1145 | blkio_policy_register(&blkio_policy_throtl); |
| 1139 | return 0; | 1146 | return 0; |
| 1140 | } | 1147 | } |
diff --git a/block/cfq-iosched.c b/block/cfq-iosched.c index 7be4c795962..ea83a4f0c27 100644 --- a/block/cfq-iosched.c +++ b/block/cfq-iosched.c | |||
| @@ -3355,7 +3355,7 @@ cfq_rq_enqueued(struct cfq_data *cfqd, struct cfq_queue *cfqq, | |||
| 3355 | cfqd->busy_queues > 1) { | 3355 | cfqd->busy_queues > 1) { |
| 3356 | cfq_del_timer(cfqd, cfqq); | 3356 | cfq_del_timer(cfqd, cfqq); |
| 3357 | cfq_clear_cfqq_wait_request(cfqq); | 3357 | cfq_clear_cfqq_wait_request(cfqq); |
| 3358 | __blk_run_queue(cfqd->queue); | 3358 | __blk_run_queue(cfqd->queue, false); |
| 3359 | } else { | 3359 | } else { |
| 3360 | cfq_blkiocg_update_idle_time_stats( | 3360 | cfq_blkiocg_update_idle_time_stats( |
| 3361 | &cfqq->cfqg->blkg); | 3361 | &cfqq->cfqg->blkg); |
| @@ -3370,7 +3370,7 @@ cfq_rq_enqueued(struct cfq_data *cfqd, struct cfq_queue *cfqq, | |||
| 3370 | * this new queue is RT and the current one is BE | 3370 | * this new queue is RT and the current one is BE |
| 3371 | */ | 3371 | */ |
| 3372 | cfq_preempt_queue(cfqd, cfqq); | 3372 | cfq_preempt_queue(cfqd, cfqq); |
| 3373 | __blk_run_queue(cfqd->queue); | 3373 | __blk_run_queue(cfqd->queue, false); |
| 3374 | } | 3374 | } |
| 3375 | } | 3375 | } |
| 3376 | 3376 | ||
| @@ -3731,7 +3731,7 @@ static void cfq_kick_queue(struct work_struct *work) | |||
| 3731 | struct request_queue *q = cfqd->queue; | 3731 | struct request_queue *q = cfqd->queue; |
| 3732 | 3732 | ||
| 3733 | spin_lock_irq(q->queue_lock); | 3733 | spin_lock_irq(q->queue_lock); |
| 3734 | __blk_run_queue(cfqd->queue); | 3734 | __blk_run_queue(cfqd->queue, false); |
| 3735 | spin_unlock_irq(q->queue_lock); | 3735 | spin_unlock_irq(q->queue_lock); |
| 3736 | } | 3736 | } |
| 3737 | 3737 | ||
diff --git a/block/elevator.c b/block/elevator.c index 2569512830d..236e93c1f46 100644 --- a/block/elevator.c +++ b/block/elevator.c | |||
| @@ -602,7 +602,7 @@ void elv_quiesce_start(struct request_queue *q) | |||
| 602 | */ | 602 | */ |
| 603 | elv_drain_elevator(q); | 603 | elv_drain_elevator(q); |
| 604 | while (q->rq.elvpriv) { | 604 | while (q->rq.elvpriv) { |
| 605 | __blk_run_queue(q); | 605 | __blk_run_queue(q, false); |
| 606 | spin_unlock_irq(q->queue_lock); | 606 | spin_unlock_irq(q->queue_lock); |
| 607 | msleep(10); | 607 | msleep(10); |
| 608 | spin_lock_irq(q->queue_lock); | 608 | spin_lock_irq(q->queue_lock); |
| @@ -651,7 +651,7 @@ void elv_insert(struct request_queue *q, struct request *rq, int where) | |||
| 651 | * with anything. There's no point in delaying queue | 651 | * with anything. There's no point in delaying queue |
| 652 | * processing. | 652 | * processing. |
| 653 | */ | 653 | */ |
| 654 | __blk_run_queue(q); | 654 | __blk_run_queue(q, false); |
| 655 | break; | 655 | break; |
| 656 | 656 | ||
| 657 | case ELEVATOR_INSERT_SORT: | 657 | case ELEVATOR_INSERT_SORT: |
diff --git a/drivers/acpi/acpica/aclocal.h b/drivers/acpi/acpica/aclocal.h index 54784bb42ce..edc25867ad9 100644 --- a/drivers/acpi/acpica/aclocal.h +++ b/drivers/acpi/acpica/aclocal.h | |||
| @@ -416,10 +416,15 @@ struct acpi_gpe_handler_info { | |||
| 416 | u8 originally_enabled; /* True if GPE was originally enabled */ | 416 | u8 originally_enabled; /* True if GPE was originally enabled */ |
| 417 | }; | 417 | }; |
| 418 | 418 | ||
| 419 | struct acpi_gpe_notify_object { | ||
| 420 | struct acpi_namespace_node *node; | ||
| 421 | struct acpi_gpe_notify_object *next; | ||
| 422 | }; | ||
| 423 | |||
| 419 | union acpi_gpe_dispatch_info { | 424 | union acpi_gpe_dispatch_info { |
| 420 | struct acpi_namespace_node *method_node; /* Method node for this GPE level */ | 425 | struct acpi_namespace_node *method_node; /* Method node for this GPE level */ |
| 421 | struct acpi_gpe_handler_info *handler; /* Installed GPE handler */ | 426 | struct acpi_gpe_handler_info *handler; /* Installed GPE handler */ |
| 422 | struct acpi_namespace_node *device_node; /* Parent _PRW device for implicit notify */ | 427 | struct acpi_gpe_notify_object device; /* List of _PRW devices for implicit notify */ |
| 423 | }; | 428 | }; |
| 424 | 429 | ||
| 425 | /* | 430 | /* |
diff --git a/drivers/acpi/acpica/evgpe.c b/drivers/acpi/acpica/evgpe.c index 14988a86066..f4725212eb4 100644 --- a/drivers/acpi/acpica/evgpe.c +++ b/drivers/acpi/acpica/evgpe.c | |||
| @@ -457,6 +457,7 @@ static void ACPI_SYSTEM_XFACE acpi_ev_asynch_execute_gpe_method(void *context) | |||
| 457 | acpi_status status; | 457 | acpi_status status; |
| 458 | struct acpi_gpe_event_info *local_gpe_event_info; | 458 | struct acpi_gpe_event_info *local_gpe_event_info; |
| 459 | struct acpi_evaluate_info *info; | 459 | struct acpi_evaluate_info *info; |
| 460 | struct acpi_gpe_notify_object *notify_object; | ||
| 460 | 461 | ||
| 461 | ACPI_FUNCTION_TRACE(ev_asynch_execute_gpe_method); | 462 | ACPI_FUNCTION_TRACE(ev_asynch_execute_gpe_method); |
| 462 | 463 | ||
| @@ -508,10 +509,18 @@ static void ACPI_SYSTEM_XFACE acpi_ev_asynch_execute_gpe_method(void *context) | |||
| 508 | * from this thread -- because handlers may in turn run other | 509 | * from this thread -- because handlers may in turn run other |
| 509 | * control methods. | 510 | * control methods. |
| 510 | */ | 511 | */ |
| 511 | status = | 512 | status = acpi_ev_queue_notify_request( |
| 512 | acpi_ev_queue_notify_request(local_gpe_event_info->dispatch. | 513 | local_gpe_event_info->dispatch.device.node, |
| 513 | device_node, | 514 | ACPI_NOTIFY_DEVICE_WAKE); |
| 514 | ACPI_NOTIFY_DEVICE_WAKE); | 515 | |
| 516 | notify_object = local_gpe_event_info->dispatch.device.next; | ||
| 517 | while (ACPI_SUCCESS(status) && notify_object) { | ||
| 518 | status = acpi_ev_queue_notify_request( | ||
| 519 | notify_object->node, | ||
| 520 | ACPI_NOTIFY_DEVICE_WAKE); | ||
| 521 | notify_object = notify_object->next; | ||
| 522 | } | ||
| 523 | |||
| 515 | break; | 524 | break; |
| 516 | 525 | ||
| 517 | case ACPI_GPE_DISPATCH_METHOD: | 526 | case ACPI_GPE_DISPATCH_METHOD: |
diff --git a/drivers/acpi/acpica/evxfgpe.c b/drivers/acpi/acpica/evxfgpe.c index 3b20a3401b6..52aaff3df56 100644 --- a/drivers/acpi/acpica/evxfgpe.c +++ b/drivers/acpi/acpica/evxfgpe.c | |||
| @@ -198,7 +198,9 @@ acpi_setup_gpe_for_wake(acpi_handle wake_device, | |||
| 198 | acpi_status status = AE_BAD_PARAMETER; | 198 | acpi_status status = AE_BAD_PARAMETER; |
| 199 | struct acpi_gpe_event_info *gpe_event_info; | 199 | struct acpi_gpe_event_info *gpe_event_info; |
| 200 | struct acpi_namespace_node *device_node; | 200 | struct acpi_namespace_node *device_node; |
| 201 | struct acpi_gpe_notify_object *notify_object; | ||
| 201 | acpi_cpu_flags flags; | 202 | acpi_cpu_flags flags; |
| 203 | u8 gpe_dispatch_mask; | ||
| 202 | 204 | ||
| 203 | ACPI_FUNCTION_TRACE(acpi_setup_gpe_for_wake); | 205 | ACPI_FUNCTION_TRACE(acpi_setup_gpe_for_wake); |
| 204 | 206 | ||
| @@ -221,27 +223,49 @@ acpi_setup_gpe_for_wake(acpi_handle wake_device, | |||
| 221 | goto unlock_and_exit; | 223 | goto unlock_and_exit; |
| 222 | } | 224 | } |
| 223 | 225 | ||
| 226 | if (wake_device == ACPI_ROOT_OBJECT) { | ||
| 227 | goto out; | ||
| 228 | } | ||
| 229 | |||
| 224 | /* | 230 | /* |
| 225 | * If there is no method or handler for this GPE, then the | 231 | * If there is no method or handler for this GPE, then the |
| 226 | * wake_device will be notified whenever this GPE fires (aka | 232 | * wake_device will be notified whenever this GPE fires (aka |
| 227 | * "implicit notify") Note: The GPE is assumed to be | 233 | * "implicit notify") Note: The GPE is assumed to be |
| 228 | * level-triggered (for windows compatibility). | 234 | * level-triggered (for windows compatibility). |
| 229 | */ | 235 | */ |
| 230 | if (((gpe_event_info->flags & ACPI_GPE_DISPATCH_MASK) == | 236 | gpe_dispatch_mask = gpe_event_info->flags & ACPI_GPE_DISPATCH_MASK; |
| 231 | ACPI_GPE_DISPATCH_NONE) && (wake_device != ACPI_ROOT_OBJECT)) { | 237 | if (gpe_dispatch_mask != ACPI_GPE_DISPATCH_NONE |
| 238 | && gpe_dispatch_mask != ACPI_GPE_DISPATCH_NOTIFY) { | ||
| 239 | goto out; | ||
| 240 | } | ||
| 232 | 241 | ||
| 233 | /* Validate wake_device is of type Device */ | 242 | /* Validate wake_device is of type Device */ |
| 234 | 243 | ||
| 235 | device_node = ACPI_CAST_PTR(struct acpi_namespace_node, | 244 | device_node = ACPI_CAST_PTR(struct acpi_namespace_node, wake_device); |
| 236 | wake_device); | 245 | if (device_node->type != ACPI_TYPE_DEVICE) { |
| 237 | if (device_node->type != ACPI_TYPE_DEVICE) { | 246 | goto unlock_and_exit; |
| 238 | goto unlock_and_exit; | 247 | } |
| 239 | } | 248 | |
| 249 | if (gpe_dispatch_mask == ACPI_GPE_DISPATCH_NONE) { | ||
| 240 | gpe_event_info->flags = (ACPI_GPE_DISPATCH_NOTIFY | | 250 | gpe_event_info->flags = (ACPI_GPE_DISPATCH_NOTIFY | |
| 241 | ACPI_GPE_LEVEL_TRIGGERED); | 251 | ACPI_GPE_LEVEL_TRIGGERED); |
| 242 | gpe_event_info->dispatch.device_node = device_node; | 252 | gpe_event_info->dispatch.device.node = device_node; |
| 253 | gpe_event_info->dispatch.device.next = NULL; | ||
| 254 | } else { | ||
| 255 | /* There are multiple devices to notify implicitly. */ | ||
| 256 | |||
| 257 | notify_object = ACPI_ALLOCATE_ZEROED(sizeof(*notify_object)); | ||
| 258 | if (!notify_object) { | ||
| 259 | status = AE_NO_MEMORY; | ||
| 260 | goto unlock_and_exit; | ||
| 261 | } | ||
| 262 | |||
| 263 | notify_object->node = device_node; | ||
| 264 | notify_object->next = gpe_event_info->dispatch.device.next; | ||
| 265 | gpe_event_info->dispatch.device.next = notify_object; | ||
| 243 | } | 266 | } |
| 244 | 267 | ||
| 268 | out: | ||
| 245 | gpe_event_info->flags |= ACPI_GPE_CAN_WAKE; | 269 | gpe_event_info->flags |= ACPI_GPE_CAN_WAKE; |
| 246 | status = AE_OK; | 270 | status = AE_OK; |
| 247 | 271 | ||
diff --git a/drivers/acpi/debugfs.c b/drivers/acpi/debugfs.c index 5df67f1d6c6..384f7abcff7 100644 --- a/drivers/acpi/debugfs.c +++ b/drivers/acpi/debugfs.c | |||
| @@ -26,7 +26,9 @@ static ssize_t cm_write(struct file *file, const char __user * user_buf, | |||
| 26 | size_t count, loff_t *ppos) | 26 | size_t count, loff_t *ppos) |
| 27 | { | 27 | { |
| 28 | static char *buf; | 28 | static char *buf; |
| 29 | static int uncopied_bytes; | 29 | static u32 max_size; |
| 30 | static u32 uncopied_bytes; | ||
| 31 | |||
| 30 | struct acpi_table_header table; | 32 | struct acpi_table_header table; |
| 31 | acpi_status status; | 33 | acpi_status status; |
| 32 | 34 | ||
| @@ -37,19 +39,24 @@ static ssize_t cm_write(struct file *file, const char __user * user_buf, | |||
| 37 | if (copy_from_user(&table, user_buf, | 39 | if (copy_from_user(&table, user_buf, |
| 38 | sizeof(struct acpi_table_header))) | 40 | sizeof(struct acpi_table_header))) |
| 39 | return -EFAULT; | 41 | return -EFAULT; |
| 40 | uncopied_bytes = table.length; | 42 | uncopied_bytes = max_size = table.length; |
| 41 | buf = kzalloc(uncopied_bytes, GFP_KERNEL); | 43 | buf = kzalloc(max_size, GFP_KERNEL); |
| 42 | if (!buf) | 44 | if (!buf) |
| 43 | return -ENOMEM; | 45 | return -ENOMEM; |
| 44 | } | 46 | } |
| 45 | 47 | ||
| 46 | if (uncopied_bytes < count) { | 48 | if (buf == NULL) |
| 47 | kfree(buf); | 49 | return -EINVAL; |
| 50 | |||
| 51 | if ((*ppos > max_size) || | ||
| 52 | (*ppos + count > max_size) || | ||
| 53 | (*ppos + count < count) || | ||
| 54 | (count > uncopied_bytes)) | ||
| 48 | return -EINVAL; | 55 | return -EINVAL; |
| 49 | } | ||
| 50 | 56 | ||
| 51 | if (copy_from_user(buf + (*ppos), user_buf, count)) { | 57 | if (copy_from_user(buf + (*ppos), user_buf, count)) { |
| 52 | kfree(buf); | 58 | kfree(buf); |
| 59 | buf = NULL; | ||
| 53 | return -EFAULT; | 60 | return -EFAULT; |
| 54 | } | 61 | } |
| 55 | 62 | ||
| @@ -59,6 +66,7 @@ static ssize_t cm_write(struct file *file, const char __user * user_buf, | |||
| 59 | if (!uncopied_bytes) { | 66 | if (!uncopied_bytes) { |
| 60 | status = acpi_install_method(buf); | 67 | status = acpi_install_method(buf); |
| 61 | kfree(buf); | 68 | kfree(buf); |
| 69 | buf = NULL; | ||
| 62 | if (ACPI_FAILURE(status)) | 70 | if (ACPI_FAILURE(status)) |
| 63 | return -EINVAL; | 71 | return -EINVAL; |
| 64 | add_taint(TAINT_OVERRIDDEN_ACPI_TABLE); | 72 | add_taint(TAINT_OVERRIDDEN_ACPI_TABLE); |
diff --git a/drivers/block/loop.c b/drivers/block/loop.c index 49e6a545eb6..dbf31ec9114 100644 --- a/drivers/block/loop.c +++ b/drivers/block/loop.c | |||
| @@ -78,7 +78,6 @@ | |||
| 78 | 78 | ||
| 79 | #include <asm/uaccess.h> | 79 | #include <asm/uaccess.h> |
| 80 | 80 | ||
| 81 | static DEFINE_MUTEX(loop_mutex); | ||
| 82 | static LIST_HEAD(loop_devices); | 81 | static LIST_HEAD(loop_devices); |
| 83 | static DEFINE_MUTEX(loop_devices_mutex); | 82 | static DEFINE_MUTEX(loop_devices_mutex); |
| 84 | 83 | ||
| @@ -1501,11 +1500,9 @@ static int lo_open(struct block_device *bdev, fmode_t mode) | |||
| 1501 | { | 1500 | { |
| 1502 | struct loop_device *lo = bdev->bd_disk->private_data; | 1501 | struct loop_device *lo = bdev->bd_disk->private_data; |
| 1503 | 1502 | ||
| 1504 | mutex_lock(&loop_mutex); | ||
| 1505 | mutex_lock(&lo->lo_ctl_mutex); | 1503 | mutex_lock(&lo->lo_ctl_mutex); |
| 1506 | lo->lo_refcnt++; | 1504 | lo->lo_refcnt++; |
| 1507 | mutex_unlock(&lo->lo_ctl_mutex); | 1505 | mutex_unlock(&lo->lo_ctl_mutex); |
| 1508 | mutex_unlock(&loop_mutex); | ||
| 1509 | 1506 | ||
| 1510 | return 0; | 1507 | return 0; |
| 1511 | } | 1508 | } |
| @@ -1515,7 +1512,6 @@ static int lo_release(struct gendisk *disk, fmode_t mode) | |||
| 1515 | struct loop_device *lo = disk->private_data; | 1512 | struct loop_device *lo = disk->private_data; |
| 1516 | int err; | 1513 | int err; |
| 1517 | 1514 | ||
| 1518 | mutex_lock(&loop_mutex); | ||
| 1519 | mutex_lock(&lo->lo_ctl_mutex); | 1515 | mutex_lock(&lo->lo_ctl_mutex); |
| 1520 | 1516 | ||
| 1521 | if (--lo->lo_refcnt) | 1517 | if (--lo->lo_refcnt) |
| @@ -1540,7 +1536,6 @@ static int lo_release(struct gendisk *disk, fmode_t mode) | |||
| 1540 | out: | 1536 | out: |
| 1541 | mutex_unlock(&lo->lo_ctl_mutex); | 1537 | mutex_unlock(&lo->lo_ctl_mutex); |
| 1542 | out_unlocked: | 1538 | out_unlocked: |
| 1543 | mutex_unlock(&loop_mutex); | ||
| 1544 | return 0; | 1539 | return 0; |
| 1545 | } | 1540 | } |
| 1546 | 1541 | ||
diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c index 49039318633..84b164d1eb2 100644 --- a/drivers/char/virtio_console.c +++ b/drivers/char/virtio_console.c | |||
| @@ -388,6 +388,10 @@ static void discard_port_data(struct port *port) | |||
| 388 | unsigned int len; | 388 | unsigned int len; |
| 389 | int ret; | 389 | int ret; |
| 390 | 390 | ||
| 391 | if (!port->portdev) { | ||
| 392 | /* Device has been unplugged. vqs are already gone. */ | ||
| 393 | return; | ||
| 394 | } | ||
| 391 | vq = port->in_vq; | 395 | vq = port->in_vq; |
| 392 | if (port->inbuf) | 396 | if (port->inbuf) |
| 393 | buf = port->inbuf; | 397 | buf = port->inbuf; |
| @@ -470,6 +474,10 @@ static void reclaim_consumed_buffers(struct port *port) | |||
| 470 | void *buf; | 474 | void *buf; |
| 471 | unsigned int len; | 475 | unsigned int len; |
| 472 | 476 | ||
| 477 | if (!port->portdev) { | ||
| 478 | /* Device has been unplugged. vqs are already gone. */ | ||
| 479 | return; | ||
| 480 | } | ||
| 473 | while ((buf = virtqueue_get_buf(port->out_vq, &len))) { | 481 | while ((buf = virtqueue_get_buf(port->out_vq, &len))) { |
| 474 | kfree(buf); | 482 | kfree(buf); |
| 475 | port->outvq_full = false; | 483 | port->outvq_full = false; |
diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c index 1109f6848a4..5cb4d09919d 100644 --- a/drivers/cpufreq/cpufreq.c +++ b/drivers/cpufreq/cpufreq.c | |||
| @@ -1919,8 +1919,10 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data) | |||
| 1919 | 1919 | ||
| 1920 | ret = sysdev_driver_register(&cpu_sysdev_class, | 1920 | ret = sysdev_driver_register(&cpu_sysdev_class, |
| 1921 | &cpufreq_sysdev_driver); | 1921 | &cpufreq_sysdev_driver); |
| 1922 | if (ret) | ||
| 1923 | goto err_null_driver; | ||
| 1922 | 1924 | ||
| 1923 | if ((!ret) && !(cpufreq_driver->flags & CPUFREQ_STICKY)) { | 1925 | if (!(cpufreq_driver->flags & CPUFREQ_STICKY)) { |
| 1924 | int i; | 1926 | int i; |
| 1925 | ret = -ENODEV; | 1927 | ret = -ENODEV; |
| 1926 | 1928 | ||
| @@ -1935,21 +1937,22 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data) | |||
| 1935 | if (ret) { | 1937 | if (ret) { |
| 1936 | dprintk("no CPU initialized for driver %s\n", | 1938 | dprintk("no CPU initialized for driver %s\n", |
| 1937 | driver_data->name); | 1939 | driver_data->name); |
| 1938 | sysdev_driver_unregister(&cpu_sysdev_class, | 1940 | goto err_sysdev_unreg; |
| 1939 | &cpufreq_sysdev_driver); | ||
| 1940 | |||
| 1941 | spin_lock_irqsave(&cpufreq_driver_lock, flags); | ||
| 1942 | cpufreq_driver = NULL; | ||
| 1943 | spin_unlock_irqrestore(&cpufreq_driver_lock, flags); | ||
| 1944 | } | 1941 | } |
| 1945 | } | 1942 | } |
| 1946 | 1943 | ||
| 1947 | if (!ret) { | 1944 | register_hotcpu_notifier(&cpufreq_cpu_notifier); |
| 1948 | register_hotcpu_notifier(&cpufreq_cpu_notifier); | 1945 | dprintk("driver %s up and running\n", driver_data->name); |
| 1949 | dprintk("driver %s up and running\n", driver_data->name); | 1946 | cpufreq_debug_enable_ratelimit(); |
| 1950 | cpufreq_debug_enable_ratelimit(); | ||
| 1951 | } | ||
| 1952 | 1947 | ||
| 1948 | return 0; | ||
| 1949 | err_sysdev_unreg: | ||
| 1950 | sysdev_driver_unregister(&cpu_sysdev_class, | ||
| 1951 | &cpufreq_sysdev_driver); | ||
| 1952 | err_null_driver: | ||
| 1953 | spin_lock_irqsave(&cpufreq_driver_lock, flags); | ||
| 1954 | cpufreq_driver = NULL; | ||
| 1955 | spin_unlock_irqrestore(&cpufreq_driver_lock, flags); | ||
| 1953 | return ret; | 1956 | return ret; |
| 1954 | } | 1957 | } |
| 1955 | EXPORT_SYMBOL_GPL(cpufreq_register_driver); | 1958 | EXPORT_SYMBOL_GPL(cpufreq_register_driver); |
diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c index 6977a1ce9d9..f73ef4390db 100644 --- a/drivers/gpu/drm/drm_fb_helper.c +++ b/drivers/gpu/drm/drm_fb_helper.c | |||
| @@ -672,7 +672,7 @@ int drm_fb_helper_setcmap(struct fb_cmap *cmap, struct fb_info *info) | |||
| 672 | struct drm_crtc_helper_funcs *crtc_funcs; | 672 | struct drm_crtc_helper_funcs *crtc_funcs; |
| 673 | u16 *red, *green, *blue, *transp; | 673 | u16 *red, *green, *blue, *transp; |
| 674 | struct drm_crtc *crtc; | 674 | struct drm_crtc *crtc; |
| 675 | int i, rc = 0; | 675 | int i, j, rc = 0; |
| 676 | int start; | 676 | int start; |
| 677 | 677 | ||
| 678 | for (i = 0; i < fb_helper->crtc_count; i++) { | 678 | for (i = 0; i < fb_helper->crtc_count; i++) { |
| @@ -685,7 +685,7 @@ int drm_fb_helper_setcmap(struct fb_cmap *cmap, struct fb_info *info) | |||
| 685 | transp = cmap->transp; | 685 | transp = cmap->transp; |
| 686 | start = cmap->start; | 686 | start = cmap->start; |
| 687 | 687 | ||
| 688 | for (i = 0; i < cmap->len; i++) { | 688 | for (j = 0; j < cmap->len; j++) { |
| 689 | u16 hred, hgreen, hblue, htransp = 0xffff; | 689 | u16 hred, hgreen, hblue, htransp = 0xffff; |
| 690 | 690 | ||
| 691 | hred = *red++; | 691 | hred = *red++; |
diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c index 3601466c550..4ff9b6cc973 100644 --- a/drivers/gpu/drm/i915/i915_debugfs.c +++ b/drivers/gpu/drm/i915/i915_debugfs.c | |||
| @@ -865,7 +865,7 @@ static int i915_cur_delayinfo(struct seq_file *m, void *unused) | |||
| 865 | int max_freq; | 865 | int max_freq; |
| 866 | 866 | ||
| 867 | /* RPSTAT1 is in the GT power well */ | 867 | /* RPSTAT1 is in the GT power well */ |
| 868 | __gen6_force_wake_get(dev_priv); | 868 | __gen6_gt_force_wake_get(dev_priv); |
| 869 | 869 | ||
| 870 | seq_printf(m, "GT_PERF_STATUS: 0x%08x\n", gt_perf_status); | 870 | seq_printf(m, "GT_PERF_STATUS: 0x%08x\n", gt_perf_status); |
| 871 | seq_printf(m, "RPSTAT1: 0x%08x\n", I915_READ(GEN6_RPSTAT1)); | 871 | seq_printf(m, "RPSTAT1: 0x%08x\n", I915_READ(GEN6_RPSTAT1)); |
| @@ -888,7 +888,7 @@ static int i915_cur_delayinfo(struct seq_file *m, void *unused) | |||
| 888 | seq_printf(m, "Max non-overclocked (RP0) frequency: %dMHz\n", | 888 | seq_printf(m, "Max non-overclocked (RP0) frequency: %dMHz\n", |
| 889 | max_freq * 100); | 889 | max_freq * 100); |
| 890 | 890 | ||
| 891 | __gen6_force_wake_put(dev_priv); | 891 | __gen6_gt_force_wake_put(dev_priv); |
| 892 | } else { | 892 | } else { |
| 893 | seq_printf(m, "no P-state info available\n"); | 893 | seq_printf(m, "no P-state info available\n"); |
| 894 | } | 894 | } |
diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c index 17bd766f208..e33d9be7df3 100644 --- a/drivers/gpu/drm/i915/i915_dma.c +++ b/drivers/gpu/drm/i915/i915_dma.c | |||
| @@ -1895,6 +1895,17 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags) | |||
| 1895 | if (IS_GEN2(dev)) | 1895 | if (IS_GEN2(dev)) |
| 1896 | dma_set_coherent_mask(&dev->pdev->dev, DMA_BIT_MASK(30)); | 1896 | dma_set_coherent_mask(&dev->pdev->dev, DMA_BIT_MASK(30)); |
| 1897 | 1897 | ||
| 1898 | /* 965GM sometimes incorrectly writes to hardware status page (HWS) | ||
| 1899 | * using 32bit addressing, overwriting memory if HWS is located | ||
| 1900 | * above 4GB. | ||
| 1901 | * | ||
| 1902 | * The documentation also mentions an issue with undefined | ||
| 1903 | * behaviour if any general state is accessed within a page above 4GB, | ||
| 1904 | * which also needs to be handled carefully. | ||
| 1905 | */ | ||
| 1906 | if (IS_BROADWATER(dev) || IS_CRESTLINE(dev)) | ||
| 1907 | dma_set_coherent_mask(&dev->pdev->dev, DMA_BIT_MASK(32)); | ||
| 1908 | |||
| 1898 | mmio_bar = IS_GEN2(dev) ? 1 : 0; | 1909 | mmio_bar = IS_GEN2(dev) ? 1 : 0; |
| 1899 | dev_priv->regs = pci_iomap(dev->pdev, mmio_bar, 0); | 1910 | dev_priv->regs = pci_iomap(dev->pdev, mmio_bar, 0); |
| 1900 | if (!dev_priv->regs) { | 1911 | if (!dev_priv->regs) { |
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c index 0ad533f06af..22ec066adae 100644 --- a/drivers/gpu/drm/i915/i915_drv.c +++ b/drivers/gpu/drm/i915/i915_drv.c | |||
| @@ -46,6 +46,9 @@ module_param_named(fbpercrtc, i915_fbpercrtc, int, 0400); | |||
| 46 | unsigned int i915_powersave = 1; | 46 | unsigned int i915_powersave = 1; |
| 47 | module_param_named(powersave, i915_powersave, int, 0600); | 47 | module_param_named(powersave, i915_powersave, int, 0600); |
| 48 | 48 | ||
| 49 | unsigned int i915_semaphores = 0; | ||
| 50 | module_param_named(semaphores, i915_semaphores, int, 0600); | ||
| 51 | |||
| 49 | unsigned int i915_enable_rc6 = 0; | 52 | unsigned int i915_enable_rc6 = 0; |
| 50 | module_param_named(i915_enable_rc6, i915_enable_rc6, int, 0600); | 53 | module_param_named(i915_enable_rc6, i915_enable_rc6, int, 0600); |
| 51 | 54 | ||
| @@ -254,7 +257,7 @@ void intel_detect_pch (struct drm_device *dev) | |||
| 254 | } | 257 | } |
| 255 | } | 258 | } |
| 256 | 259 | ||
| 257 | void __gen6_force_wake_get(struct drm_i915_private *dev_priv) | 260 | void __gen6_gt_force_wake_get(struct drm_i915_private *dev_priv) |
| 258 | { | 261 | { |
| 259 | int count; | 262 | int count; |
| 260 | 263 | ||
| @@ -270,12 +273,22 @@ void __gen6_force_wake_get(struct drm_i915_private *dev_priv) | |||
| 270 | udelay(10); | 273 | udelay(10); |
| 271 | } | 274 | } |
| 272 | 275 | ||
| 273 | void __gen6_force_wake_put(struct drm_i915_private *dev_priv) | 276 | void __gen6_gt_force_wake_put(struct drm_i915_private *dev_priv) |
| 274 | { | 277 | { |
| 275 | I915_WRITE_NOTRACE(FORCEWAKE, 0); | 278 | I915_WRITE_NOTRACE(FORCEWAKE, 0); |
| 276 | POSTING_READ(FORCEWAKE); | 279 | POSTING_READ(FORCEWAKE); |
| 277 | } | 280 | } |
| 278 | 281 | ||
| 282 | void __gen6_gt_wait_for_fifo(struct drm_i915_private *dev_priv) | ||
| 283 | { | ||
| 284 | int loop = 500; | ||
| 285 | u32 fifo = I915_READ_NOTRACE(GT_FIFO_FREE_ENTRIES); | ||
| 286 | while (fifo < 20 && loop--) { | ||
| 287 | udelay(10); | ||
| 288 | fifo = I915_READ_NOTRACE(GT_FIFO_FREE_ENTRIES); | ||
| 289 | } | ||
| 290 | } | ||
| 291 | |||
| 279 | static int i915_drm_freeze(struct drm_device *dev) | 292 | static int i915_drm_freeze(struct drm_device *dev) |
| 280 | { | 293 | { |
| 281 | struct drm_i915_private *dev_priv = dev->dev_private; | 294 | struct drm_i915_private *dev_priv = dev->dev_private; |
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 65dfe81d003..456f4048483 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h | |||
| @@ -956,6 +956,7 @@ extern struct drm_ioctl_desc i915_ioctls[]; | |||
| 956 | extern int i915_max_ioctl; | 956 | extern int i915_max_ioctl; |
| 957 | extern unsigned int i915_fbpercrtc; | 957 | extern unsigned int i915_fbpercrtc; |
| 958 | extern unsigned int i915_powersave; | 958 | extern unsigned int i915_powersave; |
| 959 | extern unsigned int i915_semaphores; | ||
| 959 | extern unsigned int i915_lvds_downclock; | 960 | extern unsigned int i915_lvds_downclock; |
| 960 | extern unsigned int i915_panel_use_ssc; | 961 | extern unsigned int i915_panel_use_ssc; |
| 961 | extern unsigned int i915_enable_rc6; | 962 | extern unsigned int i915_enable_rc6; |
| @@ -1177,6 +1178,9 @@ void i915_gem_detach_phys_object(struct drm_device *dev, | |||
| 1177 | void i915_gem_free_all_phys_object(struct drm_device *dev); | 1178 | void i915_gem_free_all_phys_object(struct drm_device *dev); |
| 1178 | void i915_gem_release(struct drm_device *dev, struct drm_file *file); | 1179 | void i915_gem_release(struct drm_device *dev, struct drm_file *file); |
| 1179 | 1180 | ||
| 1181 | uint32_t | ||
| 1182 | i915_gem_get_unfenced_gtt_alignment(struct drm_i915_gem_object *obj); | ||
| 1183 | |||
| 1180 | /* i915_gem_gtt.c */ | 1184 | /* i915_gem_gtt.c */ |
| 1181 | void i915_gem_restore_gtt_mappings(struct drm_device *dev); | 1185 | void i915_gem_restore_gtt_mappings(struct drm_device *dev); |
| 1182 | int __must_check i915_gem_gtt_bind_object(struct drm_i915_gem_object *obj); | 1186 | int __must_check i915_gem_gtt_bind_object(struct drm_i915_gem_object *obj); |
| @@ -1353,22 +1357,32 @@ __i915_write(64, q) | |||
| 1353 | * must be set to prevent GT core from power down and stale values being | 1357 | * must be set to prevent GT core from power down and stale values being |
| 1354 | * returned. | 1358 | * returned. |
| 1355 | */ | 1359 | */ |
| 1356 | void __gen6_force_wake_get(struct drm_i915_private *dev_priv); | 1360 | void __gen6_gt_force_wake_get(struct drm_i915_private *dev_priv); |
| 1357 | void __gen6_force_wake_put (struct drm_i915_private *dev_priv); | 1361 | void __gen6_gt_force_wake_put(struct drm_i915_private *dev_priv); |
| 1358 | static inline u32 i915_safe_read(struct drm_i915_private *dev_priv, u32 reg) | 1362 | void __gen6_gt_wait_for_fifo(struct drm_i915_private *dev_priv); |
| 1363 | |||
| 1364 | static inline u32 i915_gt_read(struct drm_i915_private *dev_priv, u32 reg) | ||
| 1359 | { | 1365 | { |
| 1360 | u32 val; | 1366 | u32 val; |
| 1361 | 1367 | ||
| 1362 | if (dev_priv->info->gen >= 6) { | 1368 | if (dev_priv->info->gen >= 6) { |
| 1363 | __gen6_force_wake_get(dev_priv); | 1369 | __gen6_gt_force_wake_get(dev_priv); |
| 1364 | val = I915_READ(reg); | 1370 | val = I915_READ(reg); |
| 1365 | __gen6_force_wake_put(dev_priv); | 1371 | __gen6_gt_force_wake_put(dev_priv); |
| 1366 | } else | 1372 | } else |
| 1367 | val = I915_READ(reg); | 1373 | val = I915_READ(reg); |
| 1368 | 1374 | ||
| 1369 | return val; | 1375 | return val; |
| 1370 | } | 1376 | } |
| 1371 | 1377 | ||
| 1378 | static inline void i915_gt_write(struct drm_i915_private *dev_priv, | ||
| 1379 | u32 reg, u32 val) | ||
| 1380 | { | ||
| 1381 | if (dev_priv->info->gen >= 6) | ||
| 1382 | __gen6_gt_wait_for_fifo(dev_priv); | ||
| 1383 | I915_WRITE(reg, val); | ||
| 1384 | } | ||
| 1385 | |||
| 1372 | static inline void | 1386 | static inline void |
| 1373 | i915_write(struct drm_i915_private *dev_priv, u32 reg, u64 val, int len) | 1387 | i915_write(struct drm_i915_private *dev_priv, u32 reg, u64 val, int len) |
| 1374 | { | 1388 | { |
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index cf4f74c7c6f..36e66cc5225 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c | |||
| @@ -1398,7 +1398,7 @@ i915_gem_get_gtt_alignment(struct drm_i915_gem_object *obj) | |||
| 1398 | * Return the required GTT alignment for an object, only taking into account | 1398 | * Return the required GTT alignment for an object, only taking into account |
| 1399 | * unfenced tiled surface requirements. | 1399 | * unfenced tiled surface requirements. |
| 1400 | */ | 1400 | */ |
| 1401 | static uint32_t | 1401 | uint32_t |
| 1402 | i915_gem_get_unfenced_gtt_alignment(struct drm_i915_gem_object *obj) | 1402 | i915_gem_get_unfenced_gtt_alignment(struct drm_i915_gem_object *obj) |
| 1403 | { | 1403 | { |
| 1404 | struct drm_device *dev = obj->base.dev; | 1404 | struct drm_device *dev = obj->base.dev; |
diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c index d2f445e825f..50ab1614571 100644 --- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c +++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c | |||
| @@ -772,8 +772,8 @@ i915_gem_execbuffer_sync_rings(struct drm_i915_gem_object *obj, | |||
| 772 | if (from == NULL || to == from) | 772 | if (from == NULL || to == from) |
| 773 | return 0; | 773 | return 0; |
| 774 | 774 | ||
| 775 | /* XXX gpu semaphores are currently causing hard hangs on SNB mobile */ | 775 | /* XXX gpu semaphores are implicated in various hard hangs on SNB */ |
| 776 | if (INTEL_INFO(obj->base.dev)->gen < 6 || IS_MOBILE(obj->base.dev)) | 776 | if (INTEL_INFO(obj->base.dev)->gen < 6 || !i915_semaphores) |
| 777 | return i915_gem_object_wait_rendering(obj, true); | 777 | return i915_gem_object_wait_rendering(obj, true); |
| 778 | 778 | ||
| 779 | idx = intel_ring_sync_index(from, to); | 779 | idx = intel_ring_sync_index(from, to); |
diff --git a/drivers/gpu/drm/i915/i915_gem_tiling.c b/drivers/gpu/drm/i915/i915_gem_tiling.c index 79a04fde69b..d64843e18df 100644 --- a/drivers/gpu/drm/i915/i915_gem_tiling.c +++ b/drivers/gpu/drm/i915/i915_gem_tiling.c | |||
| @@ -184,7 +184,7 @@ i915_gem_detect_bit_6_swizzle(struct drm_device *dev) | |||
| 184 | static bool | 184 | static bool |
| 185 | i915_tiling_ok(struct drm_device *dev, int stride, int size, int tiling_mode) | 185 | i915_tiling_ok(struct drm_device *dev, int stride, int size, int tiling_mode) |
| 186 | { | 186 | { |
| 187 | int tile_width, tile_height; | 187 | int tile_width; |
| 188 | 188 | ||
| 189 | /* Linear is always fine */ | 189 | /* Linear is always fine */ |
| 190 | if (tiling_mode == I915_TILING_NONE) | 190 | if (tiling_mode == I915_TILING_NONE) |
| @@ -215,20 +215,6 @@ i915_tiling_ok(struct drm_device *dev, int stride, int size, int tiling_mode) | |||
| 215 | } | 215 | } |
| 216 | } | 216 | } |
| 217 | 217 | ||
| 218 | if (IS_GEN2(dev) || | ||
| 219 | (tiling_mode == I915_TILING_Y && HAS_128_BYTE_Y_TILING(dev))) | ||
| 220 | tile_height = 32; | ||
| 221 | else | ||
| 222 | tile_height = 8; | ||
| 223 | /* i8xx is strange: It has 2 interleaved rows of tiles, so needs an even | ||
| 224 | * number of tile rows. */ | ||
| 225 | if (IS_GEN2(dev)) | ||
| 226 | tile_height *= 2; | ||
| 227 | |||
| 228 | /* Size needs to be aligned to a full tile row */ | ||
| 229 | if (size & (tile_height * stride - 1)) | ||
| 230 | return false; | ||
| 231 | |||
| 232 | /* 965+ just needs multiples of tile width */ | 218 | /* 965+ just needs multiples of tile width */ |
| 233 | if (INTEL_INFO(dev)->gen >= 4) { | 219 | if (INTEL_INFO(dev)->gen >= 4) { |
| 234 | if (stride & (tile_width - 1)) | 220 | if (stride & (tile_width - 1)) |
| @@ -363,14 +349,27 @@ i915_gem_set_tiling(struct drm_device *dev, void *data, | |||
| 363 | (obj->gtt_offset + obj->base.size <= dev_priv->mm.gtt_mappable_end && | 349 | (obj->gtt_offset + obj->base.size <= dev_priv->mm.gtt_mappable_end && |
| 364 | i915_gem_object_fence_ok(obj, args->tiling_mode)); | 350 | i915_gem_object_fence_ok(obj, args->tiling_mode)); |
| 365 | 351 | ||
| 366 | obj->tiling_changed = true; | 352 | /* Rebind if we need a change of alignment */ |
| 367 | obj->tiling_mode = args->tiling_mode; | 353 | if (!obj->map_and_fenceable) { |
| 368 | obj->stride = args->stride; | 354 | u32 unfenced_alignment = |
| 355 | i915_gem_get_unfenced_gtt_alignment(obj); | ||
| 356 | if (obj->gtt_offset & (unfenced_alignment - 1)) | ||
| 357 | ret = i915_gem_object_unbind(obj); | ||
| 358 | } | ||
| 359 | |||
| 360 | if (ret == 0) { | ||
| 361 | obj->tiling_changed = true; | ||
| 362 | obj->tiling_mode = args->tiling_mode; | ||
| 363 | obj->stride = args->stride; | ||
| 364 | } | ||
| 369 | } | 365 | } |
| 366 | /* we have to maintain this existing ABI... */ | ||
| 367 | args->stride = obj->stride; | ||
| 368 | args->tiling_mode = obj->tiling_mode; | ||
| 370 | drm_gem_object_unreference(&obj->base); | 369 | drm_gem_object_unreference(&obj->base); |
| 371 | mutex_unlock(&dev->struct_mutex); | 370 | mutex_unlock(&dev->struct_mutex); |
| 372 | 371 | ||
| 373 | return 0; | 372 | return ret; |
| 374 | } | 373 | } |
| 375 | 374 | ||
| 376 | /** | 375 | /** |
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h index 729d4233b76..3e6f486f460 100644 --- a/drivers/gpu/drm/i915/i915_reg.h +++ b/drivers/gpu/drm/i915/i915_reg.h | |||
| @@ -3261,6 +3261,8 @@ | |||
| 3261 | #define FORCEWAKE 0xA18C | 3261 | #define FORCEWAKE 0xA18C |
| 3262 | #define FORCEWAKE_ACK 0x130090 | 3262 | #define FORCEWAKE_ACK 0x130090 |
| 3263 | 3263 | ||
| 3264 | #define GT_FIFO_FREE_ENTRIES 0x120008 | ||
| 3265 | |||
| 3264 | #define GEN6_RPNSWREQ 0xA008 | 3266 | #define GEN6_RPNSWREQ 0xA008 |
| 3265 | #define GEN6_TURBO_DISABLE (1<<31) | 3267 | #define GEN6_TURBO_DISABLE (1<<31) |
| 3266 | #define GEN6_FREQUENCY(x) ((x)<<25) | 3268 | #define GEN6_FREQUENCY(x) ((x)<<25) |
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index e79b25bbee6..49fb54fd9a1 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
| @@ -1219,7 +1219,7 @@ static void sandybridge_blit_fbc_update(struct drm_device *dev) | |||
| 1219 | u32 blt_ecoskpd; | 1219 | u32 blt_ecoskpd; |
| 1220 | 1220 | ||
| 1221 | /* Make sure blitter notifies FBC of writes */ | 1221 | /* Make sure blitter notifies FBC of writes */ |
| 1222 | __gen6_force_wake_get(dev_priv); | 1222 | __gen6_gt_force_wake_get(dev_priv); |
| 1223 | blt_ecoskpd = I915_READ(GEN6_BLITTER_ECOSKPD); | 1223 | blt_ecoskpd = I915_READ(GEN6_BLITTER_ECOSKPD); |
| 1224 | blt_ecoskpd |= GEN6_BLITTER_FBC_NOTIFY << | 1224 | blt_ecoskpd |= GEN6_BLITTER_FBC_NOTIFY << |
| 1225 | GEN6_BLITTER_LOCK_SHIFT; | 1225 | GEN6_BLITTER_LOCK_SHIFT; |
| @@ -1230,7 +1230,7 @@ static void sandybridge_blit_fbc_update(struct drm_device *dev) | |||
| 1230 | GEN6_BLITTER_LOCK_SHIFT); | 1230 | GEN6_BLITTER_LOCK_SHIFT); |
| 1231 | I915_WRITE(GEN6_BLITTER_ECOSKPD, blt_ecoskpd); | 1231 | I915_WRITE(GEN6_BLITTER_ECOSKPD, blt_ecoskpd); |
| 1232 | POSTING_READ(GEN6_BLITTER_ECOSKPD); | 1232 | POSTING_READ(GEN6_BLITTER_ECOSKPD); |
| 1233 | __gen6_force_wake_put(dev_priv); | 1233 | __gen6_gt_force_wake_put(dev_priv); |
| 1234 | } | 1234 | } |
| 1235 | 1235 | ||
| 1236 | static void ironlake_enable_fbc(struct drm_crtc *crtc, unsigned long interval) | 1236 | static void ironlake_enable_fbc(struct drm_crtc *crtc, unsigned long interval) |
| @@ -6282,7 +6282,7 @@ void gen6_enable_rps(struct drm_i915_private *dev_priv) | |||
| 6282 | * userspace... | 6282 | * userspace... |
| 6283 | */ | 6283 | */ |
| 6284 | I915_WRITE(GEN6_RC_STATE, 0); | 6284 | I915_WRITE(GEN6_RC_STATE, 0); |
| 6285 | __gen6_force_wake_get(dev_priv); | 6285 | __gen6_gt_force_wake_get(dev_priv); |
| 6286 | 6286 | ||
| 6287 | /* disable the counters and set deterministic thresholds */ | 6287 | /* disable the counters and set deterministic thresholds */ |
| 6288 | I915_WRITE(GEN6_RC_CONTROL, 0); | 6288 | I915_WRITE(GEN6_RC_CONTROL, 0); |
| @@ -6380,7 +6380,7 @@ void gen6_enable_rps(struct drm_i915_private *dev_priv) | |||
| 6380 | /* enable all PM interrupts */ | 6380 | /* enable all PM interrupts */ |
| 6381 | I915_WRITE(GEN6_PMINTRMSK, 0); | 6381 | I915_WRITE(GEN6_PMINTRMSK, 0); |
| 6382 | 6382 | ||
| 6383 | __gen6_force_wake_put(dev_priv); | 6383 | __gen6_gt_force_wake_put(dev_priv); |
| 6384 | } | 6384 | } |
| 6385 | 6385 | ||
| 6386 | void intel_enable_clock_gating(struct drm_device *dev) | 6386 | void intel_enable_clock_gating(struct drm_device *dev) |
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.h b/drivers/gpu/drm/i915/intel_ringbuffer.h index 6d6fde85a63..34306865a5d 100644 --- a/drivers/gpu/drm/i915/intel_ringbuffer.h +++ b/drivers/gpu/drm/i915/intel_ringbuffer.h | |||
| @@ -14,22 +14,23 @@ struct intel_hw_status_page { | |||
| 14 | struct drm_i915_gem_object *obj; | 14 | struct drm_i915_gem_object *obj; |
| 15 | }; | 15 | }; |
| 16 | 16 | ||
| 17 | #define I915_RING_READ(reg) i915_safe_read(dev_priv, reg) | 17 | #define I915_RING_READ(reg) i915_gt_read(dev_priv, reg) |
| 18 | #define I915_RING_WRITE(reg, val) i915_gt_write(dev_priv, reg, val) | ||
| 18 | 19 | ||
| 19 | #define I915_READ_TAIL(ring) I915_RING_READ(RING_TAIL((ring)->mmio_base)) | 20 | #define I915_READ_TAIL(ring) I915_RING_READ(RING_TAIL((ring)->mmio_base)) |
| 20 | #define I915_WRITE_TAIL(ring, val) I915_WRITE(RING_TAIL((ring)->mmio_base), val) | 21 | #define I915_WRITE_TAIL(ring, val) I915_RING_WRITE(RING_TAIL((ring)->mmio_base), val) |
| 21 | 22 | ||
| 22 | #define I915_READ_START(ring) I915_RING_READ(RING_START((ring)->mmio_base)) | 23 | #define I915_READ_START(ring) I915_RING_READ(RING_START((ring)->mmio_base)) |
| 23 | #define I915_WRITE_START(ring, val) I915_WRITE(RING_START((ring)->mmio_base), val) | 24 | #define I915_WRITE_START(ring, val) I915_RING_WRITE(RING_START((ring)->mmio_base), val) |
| 24 | 25 | ||
| 25 | #define I915_READ_HEAD(ring) I915_RING_READ(RING_HEAD((ring)->mmio_base)) | 26 | #define I915_READ_HEAD(ring) I915_RING_READ(RING_HEAD((ring)->mmio_base)) |
| 26 | #define I915_WRITE_HEAD(ring, val) I915_WRITE(RING_HEAD((ring)->mmio_base), val) | 27 | #define I915_WRITE_HEAD(ring, val) I915_RING_WRITE(RING_HEAD((ring)->mmio_base), val) |
| 27 | 28 | ||
| 28 | #define I915_READ_CTL(ring) I915_RING_READ(RING_CTL((ring)->mmio_base)) | 29 | #define I915_READ_CTL(ring) I915_RING_READ(RING_CTL((ring)->mmio_base)) |
| 29 | #define I915_WRITE_CTL(ring, val) I915_WRITE(RING_CTL((ring)->mmio_base), val) | 30 | #define I915_WRITE_CTL(ring, val) I915_RING_WRITE(RING_CTL((ring)->mmio_base), val) |
| 30 | 31 | ||
| 31 | #define I915_WRITE_IMR(ring, val) I915_WRITE(RING_IMR((ring)->mmio_base), val) | ||
| 32 | #define I915_READ_IMR(ring) I915_RING_READ(RING_IMR((ring)->mmio_base)) | 32 | #define I915_READ_IMR(ring) I915_RING_READ(RING_IMR((ring)->mmio_base)) |
| 33 | #define I915_WRITE_IMR(ring, val) I915_RING_WRITE(RING_IMR((ring)->mmio_base), val) | ||
| 33 | 34 | ||
| 34 | #define I915_READ_NOPID(ring) I915_RING_READ(RING_NOPID((ring)->mmio_base)) | 35 | #define I915_READ_NOPID(ring) I915_RING_READ(RING_NOPID((ring)->mmio_base)) |
| 35 | #define I915_READ_SYNC_0(ring) I915_RING_READ(RING_SYNC_0((ring)->mmio_base)) | 36 | #define I915_READ_SYNC_0(ring) I915_RING_READ(RING_SYNC_0((ring)->mmio_base)) |
diff --git a/drivers/gpu/drm/nouveau/nouveau_dma.c b/drivers/gpu/drm/nouveau/nouveau_dma.c index 65699bfaaae..b368ed74aad 100644 --- a/drivers/gpu/drm/nouveau/nouveau_dma.c +++ b/drivers/gpu/drm/nouveau/nouveau_dma.c | |||
| @@ -83,7 +83,8 @@ nouveau_dma_init(struct nouveau_channel *chan) | |||
| 83 | return ret; | 83 | return ret; |
| 84 | 84 | ||
| 85 | /* NV_MEMORY_TO_MEMORY_FORMAT requires a notifier object */ | 85 | /* NV_MEMORY_TO_MEMORY_FORMAT requires a notifier object */ |
| 86 | ret = nouveau_notifier_alloc(chan, NvNotify0, 32, &chan->m2mf_ntfy); | 86 | ret = nouveau_notifier_alloc(chan, NvNotify0, 32, 0xfd0, 0x1000, |
| 87 | &chan->m2mf_ntfy); | ||
| 87 | if (ret) | 88 | if (ret) |
| 88 | return ret; | 89 | return ret; |
| 89 | 90 | ||
diff --git a/drivers/gpu/drm/nouveau/nouveau_drv.h b/drivers/gpu/drm/nouveau/nouveau_drv.h index 9821fcacc3d..982d70b1272 100644 --- a/drivers/gpu/drm/nouveau/nouveau_drv.h +++ b/drivers/gpu/drm/nouveau/nouveau_drv.h | |||
| @@ -852,7 +852,8 @@ extern const struct ttm_mem_type_manager_func nouveau_vram_manager; | |||
| 852 | extern int nouveau_notifier_init_channel(struct nouveau_channel *); | 852 | extern int nouveau_notifier_init_channel(struct nouveau_channel *); |
| 853 | extern void nouveau_notifier_takedown_channel(struct nouveau_channel *); | 853 | extern void nouveau_notifier_takedown_channel(struct nouveau_channel *); |
| 854 | extern int nouveau_notifier_alloc(struct nouveau_channel *, uint32_t handle, | 854 | extern int nouveau_notifier_alloc(struct nouveau_channel *, uint32_t handle, |
| 855 | int cout, uint32_t *offset); | 855 | int cout, uint32_t start, uint32_t end, |
| 856 | uint32_t *offset); | ||
| 856 | extern int nouveau_notifier_offset(struct nouveau_gpuobj *, uint32_t *); | 857 | extern int nouveau_notifier_offset(struct nouveau_gpuobj *, uint32_t *); |
| 857 | extern int nouveau_ioctl_notifier_alloc(struct drm_device *, void *data, | 858 | extern int nouveau_ioctl_notifier_alloc(struct drm_device *, void *data, |
| 858 | struct drm_file *); | 859 | struct drm_file *); |
diff --git a/drivers/gpu/drm/nouveau/nouveau_mem.c b/drivers/gpu/drm/nouveau/nouveau_mem.c index 26347b7cd87..b0fb9bdcddb 100644 --- a/drivers/gpu/drm/nouveau/nouveau_mem.c +++ b/drivers/gpu/drm/nouveau/nouveau_mem.c | |||
| @@ -725,8 +725,10 @@ nouveau_vram_manager_new(struct ttm_mem_type_manager *man, | |||
| 725 | ret = vram->get(dev, mem->num_pages << PAGE_SHIFT, | 725 | ret = vram->get(dev, mem->num_pages << PAGE_SHIFT, |
| 726 | mem->page_alignment << PAGE_SHIFT, size_nc, | 726 | mem->page_alignment << PAGE_SHIFT, size_nc, |
| 727 | (nvbo->tile_flags >> 8) & 0xff, &node); | 727 | (nvbo->tile_flags >> 8) & 0xff, &node); |
| 728 | if (ret) | 728 | if (ret) { |
| 729 | return ret; | 729 | mem->mm_node = NULL; |
| 730 | return (ret == -ENOSPC) ? 0 : ret; | ||
| 731 | } | ||
| 730 | 732 | ||
| 731 | node->page_shift = 12; | 733 | node->page_shift = 12; |
| 732 | if (nvbo->vma.node) | 734 | if (nvbo->vma.node) |
diff --git a/drivers/gpu/drm/nouveau/nouveau_mm.c b/drivers/gpu/drm/nouveau/nouveau_mm.c index 8844b50c3e5..7609756b6fa 100644 --- a/drivers/gpu/drm/nouveau/nouveau_mm.c +++ b/drivers/gpu/drm/nouveau/nouveau_mm.c | |||
| @@ -123,7 +123,7 @@ nouveau_mm_get(struct nouveau_mm *rmm, int type, u32 size, u32 size_nc, | |||
| 123 | return 0; | 123 | return 0; |
| 124 | } | 124 | } |
| 125 | 125 | ||
| 126 | return -ENOMEM; | 126 | return -ENOSPC; |
| 127 | } | 127 | } |
| 128 | 128 | ||
| 129 | int | 129 | int |
diff --git a/drivers/gpu/drm/nouveau/nouveau_notifier.c b/drivers/gpu/drm/nouveau/nouveau_notifier.c index fe29d604b82..5ea167623a8 100644 --- a/drivers/gpu/drm/nouveau/nouveau_notifier.c +++ b/drivers/gpu/drm/nouveau/nouveau_notifier.c | |||
| @@ -96,7 +96,8 @@ nouveau_notifier_gpuobj_dtor(struct drm_device *dev, | |||
| 96 | 96 | ||
| 97 | int | 97 | int |
| 98 | nouveau_notifier_alloc(struct nouveau_channel *chan, uint32_t handle, | 98 | nouveau_notifier_alloc(struct nouveau_channel *chan, uint32_t handle, |
| 99 | int size, uint32_t *b_offset) | 99 | int size, uint32_t start, uint32_t end, |
| 100 | uint32_t *b_offset) | ||
| 100 | { | 101 | { |
| 101 | struct drm_device *dev = chan->dev; | 102 | struct drm_device *dev = chan->dev; |
| 102 | struct nouveau_gpuobj *nobj = NULL; | 103 | struct nouveau_gpuobj *nobj = NULL; |
| @@ -104,9 +105,10 @@ nouveau_notifier_alloc(struct nouveau_channel *chan, uint32_t handle, | |||
| 104 | uint32_t offset; | 105 | uint32_t offset; |
| 105 | int target, ret; | 106 | int target, ret; |
| 106 | 107 | ||
| 107 | mem = drm_mm_search_free(&chan->notifier_heap, size, 0, 0); | 108 | mem = drm_mm_search_free_in_range(&chan->notifier_heap, size, 0, |
| 109 | start, end, 0); | ||
| 108 | if (mem) | 110 | if (mem) |
| 109 | mem = drm_mm_get_block(mem, size, 0); | 111 | mem = drm_mm_get_block_range(mem, size, 0, start, end); |
| 110 | if (!mem) { | 112 | if (!mem) { |
| 111 | NV_ERROR(dev, "Channel %d notifier block full\n", chan->id); | 113 | NV_ERROR(dev, "Channel %d notifier block full\n", chan->id); |
| 112 | return -ENOMEM; | 114 | return -ENOMEM; |
| @@ -177,7 +179,8 @@ nouveau_ioctl_notifier_alloc(struct drm_device *dev, void *data, | |||
| 177 | if (IS_ERR(chan)) | 179 | if (IS_ERR(chan)) |
| 178 | return PTR_ERR(chan); | 180 | return PTR_ERR(chan); |
| 179 | 181 | ||
| 180 | ret = nouveau_notifier_alloc(chan, na->handle, na->size, &na->offset); | 182 | ret = nouveau_notifier_alloc(chan, na->handle, na->size, 0, 0x1000, |
| 183 | &na->offset); | ||
| 181 | nouveau_channel_put(&chan); | 184 | nouveau_channel_put(&chan); |
| 182 | return ret; | 185 | return ret; |
| 183 | } | 186 | } |
diff --git a/drivers/gpu/drm/nouveau/nv50_instmem.c b/drivers/gpu/drm/nouveau/nv50_instmem.c index ea0041810ae..e57caa2a00e 100644 --- a/drivers/gpu/drm/nouveau/nv50_instmem.c +++ b/drivers/gpu/drm/nouveau/nv50_instmem.c | |||
| @@ -403,16 +403,24 @@ nv50_instmem_unmap(struct nouveau_gpuobj *gpuobj) | |||
| 403 | void | 403 | void |
| 404 | nv50_instmem_flush(struct drm_device *dev) | 404 | nv50_instmem_flush(struct drm_device *dev) |
| 405 | { | 405 | { |
| 406 | struct drm_nouveau_private *dev_priv = dev->dev_private; | ||
| 407 | |||
| 408 | spin_lock(&dev_priv->ramin_lock); | ||
| 406 | nv_wr32(dev, 0x00330c, 0x00000001); | 409 | nv_wr32(dev, 0x00330c, 0x00000001); |
| 407 | if (!nv_wait(dev, 0x00330c, 0x00000002, 0x00000000)) | 410 | if (!nv_wait(dev, 0x00330c, 0x00000002, 0x00000000)) |
| 408 | NV_ERROR(dev, "PRAMIN flush timeout\n"); | 411 | NV_ERROR(dev, "PRAMIN flush timeout\n"); |
| 412 | spin_unlock(&dev_priv->ramin_lock); | ||
| 409 | } | 413 | } |
| 410 | 414 | ||
| 411 | void | 415 | void |
| 412 | nv84_instmem_flush(struct drm_device *dev) | 416 | nv84_instmem_flush(struct drm_device *dev) |
| 413 | { | 417 | { |
| 418 | struct drm_nouveau_private *dev_priv = dev->dev_private; | ||
| 419 | |||
| 420 | spin_lock(&dev_priv->ramin_lock); | ||
| 414 | nv_wr32(dev, 0x070000, 0x00000001); | 421 | nv_wr32(dev, 0x070000, 0x00000001); |
| 415 | if (!nv_wait(dev, 0x070000, 0x00000002, 0x00000000)) | 422 | if (!nv_wait(dev, 0x070000, 0x00000002, 0x00000000)) |
| 416 | NV_ERROR(dev, "PRAMIN flush timeout\n"); | 423 | NV_ERROR(dev, "PRAMIN flush timeout\n"); |
| 424 | spin_unlock(&dev_priv->ramin_lock); | ||
| 417 | } | 425 | } |
| 418 | 426 | ||
diff --git a/drivers/gpu/drm/nouveau/nv50_vm.c b/drivers/gpu/drm/nouveau/nv50_vm.c index 459ff08241e..6144156f255 100644 --- a/drivers/gpu/drm/nouveau/nv50_vm.c +++ b/drivers/gpu/drm/nouveau/nv50_vm.c | |||
| @@ -169,7 +169,11 @@ nv50_vm_flush(struct nouveau_vm *vm) | |||
| 169 | void | 169 | void |
| 170 | nv50_vm_flush_engine(struct drm_device *dev, int engine) | 170 | nv50_vm_flush_engine(struct drm_device *dev, int engine) |
| 171 | { | 171 | { |
| 172 | struct drm_nouveau_private *dev_priv = dev->dev_private; | ||
| 173 | |||
| 174 | spin_lock(&dev_priv->ramin_lock); | ||
| 172 | nv_wr32(dev, 0x100c80, (engine << 16) | 1); | 175 | nv_wr32(dev, 0x100c80, (engine << 16) | 1); |
| 173 | if (!nv_wait(dev, 0x100c80, 0x00000001, 0x00000000)) | 176 | if (!nv_wait(dev, 0x100c80, 0x00000001, 0x00000000)) |
| 174 | NV_ERROR(dev, "vm flush timeout: engine %d\n", engine); | 177 | NV_ERROR(dev, "vm flush timeout: engine %d\n", engine); |
| 178 | spin_unlock(&dev_priv->ramin_lock); | ||
| 175 | } | 179 | } |
diff --git a/drivers/idle/intel_idle.c b/drivers/idle/intel_idle.c index 1fa091e0569..4a5c4a44ffb 100644 --- a/drivers/idle/intel_idle.c +++ b/drivers/idle/intel_idle.c | |||
| @@ -62,6 +62,7 @@ | |||
| 62 | #include <linux/notifier.h> | 62 | #include <linux/notifier.h> |
| 63 | #include <linux/cpu.h> | 63 | #include <linux/cpu.h> |
| 64 | #include <asm/mwait.h> | 64 | #include <asm/mwait.h> |
| 65 | #include <asm/msr.h> | ||
| 65 | 66 | ||
| 66 | #define INTEL_IDLE_VERSION "0.4" | 67 | #define INTEL_IDLE_VERSION "0.4" |
| 67 | #define PREFIX "intel_idle: " | 68 | #define PREFIX "intel_idle: " |
| @@ -85,6 +86,12 @@ static int intel_idle(struct cpuidle_device *dev, struct cpuidle_state *state); | |||
| 85 | static struct cpuidle_state *cpuidle_state_table; | 86 | static struct cpuidle_state *cpuidle_state_table; |
| 86 | 87 | ||
| 87 | /* | 88 | /* |
| 89 | * Hardware C-state auto-demotion may not always be optimal. | ||
| 90 | * Indicate which enable bits to clear here. | ||
| 91 | */ | ||
| 92 | static unsigned long long auto_demotion_disable_flags; | ||
| 93 | |||
| 94 | /* | ||
| 88 | * Set this flag for states where the HW flushes the TLB for us | 95 | * Set this flag for states where the HW flushes the TLB for us |
| 89 | * and so we don't need cross-calls to keep it consistent. | 96 | * and so we don't need cross-calls to keep it consistent. |
| 90 | * If this flag is set, SW flushes the TLB, so even if the | 97 | * If this flag is set, SW flushes the TLB, so even if the |
| @@ -281,6 +288,15 @@ static struct notifier_block setup_broadcast_notifier = { | |||
| 281 | .notifier_call = setup_broadcast_cpuhp_notify, | 288 | .notifier_call = setup_broadcast_cpuhp_notify, |
| 282 | }; | 289 | }; |
| 283 | 290 | ||
| 291 | static void auto_demotion_disable(void *dummy) | ||
| 292 | { | ||
| 293 | unsigned long long msr_bits; | ||
| 294 | |||
| 295 | rdmsrl(MSR_NHM_SNB_PKG_CST_CFG_CTL, msr_bits); | ||
| 296 | msr_bits &= ~auto_demotion_disable_flags; | ||
| 297 | wrmsrl(MSR_NHM_SNB_PKG_CST_CFG_CTL, msr_bits); | ||
| 298 | } | ||
| 299 | |||
| 284 | /* | 300 | /* |
| 285 | * intel_idle_probe() | 301 | * intel_idle_probe() |
| 286 | */ | 302 | */ |
| @@ -324,11 +340,17 @@ static int intel_idle_probe(void) | |||
| 324 | case 0x25: /* Westmere */ | 340 | case 0x25: /* Westmere */ |
| 325 | case 0x2C: /* Westmere */ | 341 | case 0x2C: /* Westmere */ |
| 326 | cpuidle_state_table = nehalem_cstates; | 342 | cpuidle_state_table = nehalem_cstates; |
| 343 | auto_demotion_disable_flags = | ||
| 344 | (NHM_C1_AUTO_DEMOTE | NHM_C3_AUTO_DEMOTE); | ||
| 327 | break; | 345 | break; |
| 328 | 346 | ||
| 329 | case 0x1C: /* 28 - Atom Processor */ | 347 | case 0x1C: /* 28 - Atom Processor */ |
| 348 | cpuidle_state_table = atom_cstates; | ||
| 349 | break; | ||
| 350 | |||
| 330 | case 0x26: /* 38 - Lincroft Atom Processor */ | 351 | case 0x26: /* 38 - Lincroft Atom Processor */ |
| 331 | cpuidle_state_table = atom_cstates; | 352 | cpuidle_state_table = atom_cstates; |
| 353 | auto_demotion_disable_flags = ATM_LNC_C6_AUTO_DEMOTE; | ||
| 332 | break; | 354 | break; |
| 333 | 355 | ||
| 334 | case 0x2A: /* SNB */ | 356 | case 0x2A: /* SNB */ |
| @@ -436,6 +458,8 @@ static int intel_idle_cpuidle_devices_init(void) | |||
| 436 | return -EIO; | 458 | return -EIO; |
| 437 | } | 459 | } |
| 438 | } | 460 | } |
| 461 | if (auto_demotion_disable_flags) | ||
| 462 | smp_call_function(auto_demotion_disable, NULL, 1); | ||
| 439 | 463 | ||
| 440 | return 0; | 464 | return 0; |
| 441 | } | 465 | } |
diff --git a/drivers/isdn/hardware/eicon/istream.c b/drivers/isdn/hardware/eicon/istream.c index 18f8798442f..7bd5baa547b 100644 --- a/drivers/isdn/hardware/eicon/istream.c +++ b/drivers/isdn/hardware/eicon/istream.c | |||
| @@ -62,7 +62,7 @@ void diva_xdi_provide_istream_info (ADAPTER* a, | |||
| 62 | stream interface. | 62 | stream interface. |
| 63 | If synchronous service was requested, then function | 63 | If synchronous service was requested, then function |
| 64 | does return amount of data written to stream. | 64 | does return amount of data written to stream. |
| 65 | 'final' does indicate that pice of data to be written is | 65 | 'final' does indicate that piece of data to be written is |
| 66 | final part of frame (necessary only by structured datatransfer) | 66 | final part of frame (necessary only by structured datatransfer) |
| 67 | return 0 if zero lengh packet was written | 67 | return 0 if zero lengh packet was written |
| 68 | return -1 if stream is full | 68 | return -1 if stream is full |
diff --git a/drivers/mfd/asic3.c b/drivers/mfd/asic3.c index 6a1f9404261..c45e6305b26 100644 --- a/drivers/mfd/asic3.c +++ b/drivers/mfd/asic3.c | |||
| @@ -143,9 +143,9 @@ static void asic3_irq_demux(unsigned int irq, struct irq_desc *desc) | |||
| 143 | unsigned long flags; | 143 | unsigned long flags; |
| 144 | struct asic3 *asic; | 144 | struct asic3 *asic; |
| 145 | 145 | ||
| 146 | desc->chip->ack(irq); | 146 | desc->irq_data.chip->irq_ack(&desc->irq_data); |
| 147 | 147 | ||
| 148 | asic = desc->handler_data; | 148 | asic = get_irq_data(irq); |
| 149 | 149 | ||
| 150 | for (iter = 0 ; iter < MAX_ASIC_ISR_LOOPS; iter++) { | 150 | for (iter = 0 ; iter < MAX_ASIC_ISR_LOOPS; iter++) { |
| 151 | u32 status; | 151 | u32 status; |
diff --git a/drivers/mfd/davinci_voicecodec.c b/drivers/mfd/davinci_voicecodec.c index 33c923d215c..fdd8a1b8bc6 100644 --- a/drivers/mfd/davinci_voicecodec.c +++ b/drivers/mfd/davinci_voicecodec.c | |||
| @@ -118,12 +118,12 @@ static int __init davinci_vc_probe(struct platform_device *pdev) | |||
| 118 | 118 | ||
| 119 | /* Voice codec interface client */ | 119 | /* Voice codec interface client */ |
| 120 | cell = &davinci_vc->cells[DAVINCI_VC_VCIF_CELL]; | 120 | cell = &davinci_vc->cells[DAVINCI_VC_VCIF_CELL]; |
| 121 | cell->name = "davinci_vcif"; | 121 | cell->name = "davinci-vcif"; |
| 122 | cell->driver_data = davinci_vc; | 122 | cell->driver_data = davinci_vc; |
| 123 | 123 | ||
| 124 | /* Voice codec CQ93VC client */ | 124 | /* Voice codec CQ93VC client */ |
| 125 | cell = &davinci_vc->cells[DAVINCI_VC_CQ93VC_CELL]; | 125 | cell = &davinci_vc->cells[DAVINCI_VC_CQ93VC_CELL]; |
| 126 | cell->name = "cq93vc"; | 126 | cell->name = "cq93vc-codec"; |
| 127 | cell->driver_data = davinci_vc; | 127 | cell->driver_data = davinci_vc; |
| 128 | 128 | ||
| 129 | ret = mfd_add_devices(&pdev->dev, pdev->id, davinci_vc->cells, | 129 | ret = mfd_add_devices(&pdev->dev, pdev->id, davinci_vc->cells, |
diff --git a/drivers/mfd/tps6586x.c b/drivers/mfd/tps6586x.c index 627cf577b16..e9018d1394e 100644 --- a/drivers/mfd/tps6586x.c +++ b/drivers/mfd/tps6586x.c | |||
| @@ -150,12 +150,12 @@ static inline int __tps6586x_write(struct i2c_client *client, | |||
| 150 | static inline int __tps6586x_writes(struct i2c_client *client, int reg, | 150 | static inline int __tps6586x_writes(struct i2c_client *client, int reg, |
| 151 | int len, uint8_t *val) | 151 | int len, uint8_t *val) |
| 152 | { | 152 | { |
| 153 | int ret; | 153 | int ret, i; |
| 154 | 154 | ||
| 155 | ret = i2c_smbus_write_i2c_block_data(client, reg, len, val); | 155 | for (i = 0; i < len; i++) { |
| 156 | if (ret < 0) { | 156 | ret = __tps6586x_write(client, reg + i, *(val + i)); |
| 157 | dev_err(&client->dev, "failed writings to 0x%02x\n", reg); | 157 | if (ret < 0) |
| 158 | return ret; | 158 | return ret; |
| 159 | } | 159 | } |
| 160 | 160 | ||
| 161 | return 0; | 161 | return 0; |
diff --git a/drivers/mfd/ucb1x00-ts.c b/drivers/mfd/ucb1x00-ts.c index 000cb414a78..92b85e28a15 100644 --- a/drivers/mfd/ucb1x00-ts.c +++ b/drivers/mfd/ucb1x00-ts.c | |||
| @@ -385,12 +385,18 @@ static int ucb1x00_ts_add(struct ucb1x00_dev *dev) | |||
| 385 | idev->close = ucb1x00_ts_close; | 385 | idev->close = ucb1x00_ts_close; |
| 386 | 386 | ||
| 387 | __set_bit(EV_ABS, idev->evbit); | 387 | __set_bit(EV_ABS, idev->evbit); |
| 388 | __set_bit(ABS_X, idev->absbit); | ||
| 389 | __set_bit(ABS_Y, idev->absbit); | ||
| 390 | __set_bit(ABS_PRESSURE, idev->absbit); | ||
| 391 | 388 | ||
| 392 | input_set_drvdata(idev, ts); | 389 | input_set_drvdata(idev, ts); |
| 393 | 390 | ||
| 391 | ucb1x00_adc_enable(ts->ucb); | ||
| 392 | ts->x_res = ucb1x00_ts_read_xres(ts); | ||
| 393 | ts->y_res = ucb1x00_ts_read_yres(ts); | ||
| 394 | ucb1x00_adc_disable(ts->ucb); | ||
| 395 | |||
| 396 | input_set_abs_params(idev, ABS_X, 0, ts->x_res, 0, 0); | ||
| 397 | input_set_abs_params(idev, ABS_Y, 0, ts->y_res, 0, 0); | ||
| 398 | input_set_abs_params(idev, ABS_PRESSURE, 0, 0, 0, 0); | ||
| 399 | |||
| 394 | err = input_register_device(idev); | 400 | err = input_register_device(idev); |
| 395 | if (err) | 401 | if (err) |
| 396 | goto fail; | 402 | goto fail; |
diff --git a/drivers/mfd/wm8994-core.c b/drivers/mfd/wm8994-core.c index 41233c7fa58..f4016a075fd 100644 --- a/drivers/mfd/wm8994-core.c +++ b/drivers/mfd/wm8994-core.c | |||
| @@ -246,6 +246,16 @@ static int wm8994_suspend(struct device *dev) | |||
| 246 | struct wm8994 *wm8994 = dev_get_drvdata(dev); | 246 | struct wm8994 *wm8994 = dev_get_drvdata(dev); |
| 247 | int ret; | 247 | int ret; |
| 248 | 248 | ||
| 249 | /* Don't actually go through with the suspend if the CODEC is | ||
| 250 | * still active (eg, for audio passthrough from CP. */ | ||
| 251 | ret = wm8994_reg_read(wm8994, WM8994_POWER_MANAGEMENT_1); | ||
| 252 | if (ret < 0) { | ||
| 253 | dev_err(dev, "Failed to read power status: %d\n", ret); | ||
| 254 | } else if (ret & WM8994_VMID_SEL_MASK) { | ||
| 255 | dev_dbg(dev, "CODEC still active, ignoring suspend\n"); | ||
| 256 | return 0; | ||
| 257 | } | ||
| 258 | |||
| 249 | /* GPIO configuration state is saved here since we may be configuring | 259 | /* GPIO configuration state is saved here since we may be configuring |
| 250 | * the GPIO alternate functions even if we're not using the gpiolib | 260 | * the GPIO alternate functions even if we're not using the gpiolib |
| 251 | * driver for them. | 261 | * driver for them. |
| @@ -261,6 +271,8 @@ static int wm8994_suspend(struct device *dev) | |||
| 261 | if (ret < 0) | 271 | if (ret < 0) |
| 262 | dev_err(dev, "Failed to save LDO registers: %d\n", ret); | 272 | dev_err(dev, "Failed to save LDO registers: %d\n", ret); |
| 263 | 273 | ||
| 274 | wm8994->suspended = true; | ||
| 275 | |||
| 264 | ret = regulator_bulk_disable(wm8994->num_supplies, | 276 | ret = regulator_bulk_disable(wm8994->num_supplies, |
| 265 | wm8994->supplies); | 277 | wm8994->supplies); |
| 266 | if (ret != 0) { | 278 | if (ret != 0) { |
| @@ -276,6 +288,10 @@ static int wm8994_resume(struct device *dev) | |||
| 276 | struct wm8994 *wm8994 = dev_get_drvdata(dev); | 288 | struct wm8994 *wm8994 = dev_get_drvdata(dev); |
| 277 | int ret; | 289 | int ret; |
| 278 | 290 | ||
| 291 | /* We may have lied to the PM core about suspending */ | ||
| 292 | if (!wm8994->suspended) | ||
| 293 | return 0; | ||
| 294 | |||
| 279 | ret = regulator_bulk_enable(wm8994->num_supplies, | 295 | ret = regulator_bulk_enable(wm8994->num_supplies, |
| 280 | wm8994->supplies); | 296 | wm8994->supplies); |
| 281 | if (ret != 0) { | 297 | if (ret != 0) { |
| @@ -298,6 +314,8 @@ static int wm8994_resume(struct device *dev) | |||
| 298 | if (ret < 0) | 314 | if (ret < 0) |
| 299 | dev_err(dev, "Failed to restore GPIO registers: %d\n", ret); | 315 | dev_err(dev, "Failed to restore GPIO registers: %d\n", ret); |
| 300 | 316 | ||
| 317 | wm8994->suspended = false; | ||
| 318 | |||
| 301 | return 0; | 319 | return 0; |
| 302 | } | 320 | } |
| 303 | #endif | 321 | #endif |
diff --git a/drivers/misc/bmp085.c b/drivers/misc/bmp085.c index 63ee4c1a531..b6e1c9a6679 100644 --- a/drivers/misc/bmp085.c +++ b/drivers/misc/bmp085.c | |||
| @@ -449,6 +449,7 @@ static const struct i2c_device_id bmp085_id[] = { | |||
| 449 | { "bmp085", 0 }, | 449 | { "bmp085", 0 }, |
| 450 | { } | 450 | { } |
| 451 | }; | 451 | }; |
| 452 | MODULE_DEVICE_TABLE(i2c, bmp085_id); | ||
| 452 | 453 | ||
| 453 | static struct i2c_driver bmp085_driver = { | 454 | static struct i2c_driver bmp085_driver = { |
| 454 | .driver = { | 455 | .driver = { |
diff --git a/drivers/mmc/core/sdio.c b/drivers/mmc/core/sdio.c index 5c4a54d9b6a..ebc62ad4cc5 100644 --- a/drivers/mmc/core/sdio.c +++ b/drivers/mmc/core/sdio.c | |||
| @@ -792,7 +792,6 @@ int mmc_attach_sdio(struct mmc_host *host) | |||
| 792 | */ | 792 | */ |
| 793 | mmc_release_host(host); | 793 | mmc_release_host(host); |
| 794 | err = mmc_add_card(host->card); | 794 | err = mmc_add_card(host->card); |
| 795 | mmc_claim_host(host); | ||
| 796 | if (err) | 795 | if (err) |
| 797 | goto remove_added; | 796 | goto remove_added; |
| 798 | 797 | ||
| @@ -805,12 +804,12 @@ int mmc_attach_sdio(struct mmc_host *host) | |||
| 805 | goto remove_added; | 804 | goto remove_added; |
| 806 | } | 805 | } |
| 807 | 806 | ||
| 807 | mmc_claim_host(host); | ||
| 808 | return 0; | 808 | return 0; |
| 809 | 809 | ||
| 810 | 810 | ||
| 811 | remove_added: | 811 | remove_added: |
| 812 | /* Remove without lock if the device has been added. */ | 812 | /* Remove without lock if the device has been added. */ |
| 813 | mmc_release_host(host); | ||
| 814 | mmc_sdio_remove(host); | 813 | mmc_sdio_remove(host); |
| 815 | mmc_claim_host(host); | 814 | mmc_claim_host(host); |
| 816 | remove: | 815 | remove: |
diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c index 191332b845c..158c0ee53b2 100644 --- a/drivers/mmc/host/omap_hsmmc.c +++ b/drivers/mmc/host/omap_hsmmc.c | |||
| @@ -2117,14 +2117,14 @@ static int __init omap_hsmmc_probe(struct platform_device *pdev) | |||
| 2117 | /* we start off in DISABLED state */ | 2117 | /* we start off in DISABLED state */ |
| 2118 | host->dpm_state = DISABLED; | 2118 | host->dpm_state = DISABLED; |
| 2119 | 2119 | ||
| 2120 | if (mmc_host_enable(host->mmc) != 0) { | 2120 | if (clk_enable(host->iclk) != 0) { |
| 2121 | clk_put(host->iclk); | 2121 | clk_put(host->iclk); |
| 2122 | clk_put(host->fclk); | 2122 | clk_put(host->fclk); |
| 2123 | goto err1; | 2123 | goto err1; |
| 2124 | } | 2124 | } |
| 2125 | 2125 | ||
| 2126 | if (clk_enable(host->iclk) != 0) { | 2126 | if (mmc_host_enable(host->mmc) != 0) { |
| 2127 | mmc_host_disable(host->mmc); | 2127 | clk_disable(host->iclk); |
| 2128 | clk_put(host->iclk); | 2128 | clk_put(host->iclk); |
| 2129 | clk_put(host->fclk); | 2129 | clk_put(host->fclk); |
| 2130 | goto err1; | 2130 | goto err1; |
diff --git a/drivers/net/bnx2x/bnx2x.h b/drivers/net/bnx2x/bnx2x.h index 653c62475cb..7897d114b29 100644 --- a/drivers/net/bnx2x/bnx2x.h +++ b/drivers/net/bnx2x/bnx2x.h | |||
| @@ -22,7 +22,7 @@ | |||
| 22 | * (you will need to reboot afterwards) */ | 22 | * (you will need to reboot afterwards) */ |
| 23 | /* #define BNX2X_STOP_ON_ERROR */ | 23 | /* #define BNX2X_STOP_ON_ERROR */ |
| 24 | 24 | ||
| 25 | #define DRV_MODULE_VERSION "1.62.00-5" | 25 | #define DRV_MODULE_VERSION "1.62.00-6" |
| 26 | #define DRV_MODULE_RELDATE "2011/01/30" | 26 | #define DRV_MODULE_RELDATE "2011/01/30" |
| 27 | #define BNX2X_BC_VER 0x040200 | 27 | #define BNX2X_BC_VER 0x040200 |
| 28 | 28 | ||
| @@ -1613,19 +1613,23 @@ static inline u32 reg_poll(struct bnx2x *bp, u32 reg, u32 expected, int ms, | |||
| 1613 | #define BNX2X_BTR 4 | 1613 | #define BNX2X_BTR 4 |
| 1614 | #define MAX_SPQ_PENDING 8 | 1614 | #define MAX_SPQ_PENDING 8 |
| 1615 | 1615 | ||
| 1616 | 1616 | /* CMNG constants, as derived from system spec calculations */ | |
| 1617 | /* CMNG constants | 1617 | /* default MIN rate in case VNIC min rate is configured to zero - 100Mbps */ |
| 1618 | derived from lab experiments, and not from system spec calculations !!! */ | 1618 | #define DEF_MIN_RATE 100 |
| 1619 | #define DEF_MIN_RATE 100 | ||
| 1620 | /* resolution of the rate shaping timer - 100 usec */ | 1619 | /* resolution of the rate shaping timer - 100 usec */ |
| 1621 | #define RS_PERIODIC_TIMEOUT_USEC 100 | 1620 | #define RS_PERIODIC_TIMEOUT_USEC 100 |
| 1622 | /* resolution of fairness algorithm in usecs - | ||
| 1623 | coefficient for calculating the actual t fair */ | ||
| 1624 | #define T_FAIR_COEF 10000000 | ||
| 1625 | /* number of bytes in single QM arbitration cycle - | 1621 | /* number of bytes in single QM arbitration cycle - |
| 1626 | coefficient for calculating the fairness timer */ | 1622 | * coefficient for calculating the fairness timer */ |
| 1627 | #define QM_ARB_BYTES 40000 | 1623 | #define QM_ARB_BYTES 160000 |
| 1628 | #define FAIR_MEM 2 | 1624 | /* resolution of Min algorithm 1:100 */ |
| 1625 | #define MIN_RES 100 | ||
| 1626 | /* how many bytes above threshold for the minimal credit of Min algorithm*/ | ||
| 1627 | #define MIN_ABOVE_THRESH 32768 | ||
| 1628 | /* Fairness algorithm integration time coefficient - | ||
| 1629 | * for calculating the actual Tfair */ | ||
| 1630 | #define T_FAIR_COEF ((MIN_ABOVE_THRESH + QM_ARB_BYTES) * 8 * MIN_RES) | ||
| 1631 | /* Memory of fairness algorithm . 2 cycles */ | ||
| 1632 | #define FAIR_MEM 2 | ||
| 1629 | 1633 | ||
| 1630 | 1634 | ||
| 1631 | #define ATTN_NIG_FOR_FUNC (1L << 8) | 1635 | #define ATTN_NIG_FOR_FUNC (1L << 8) |
diff --git a/drivers/net/bnx2x/bnx2x_cmn.c b/drivers/net/bnx2x/bnx2x_cmn.c index 710ce5d04c5..93798129061 100644 --- a/drivers/net/bnx2x/bnx2x_cmn.c +++ b/drivers/net/bnx2x/bnx2x_cmn.c | |||
| @@ -259,10 +259,44 @@ static void bnx2x_tpa_start(struct bnx2x_fastpath *fp, u16 queue, | |||
| 259 | #endif | 259 | #endif |
| 260 | } | 260 | } |
| 261 | 261 | ||
| 262 | /* Timestamp option length allowed for TPA aggregation: | ||
| 263 | * | ||
| 264 | * nop nop kind length echo val | ||
| 265 | */ | ||
| 266 | #define TPA_TSTAMP_OPT_LEN 12 | ||
| 267 | /** | ||
| 268 | * Calculate the approximate value of the MSS for this | ||
| 269 | * aggregation using the first packet of it. | ||
| 270 | * | ||
| 271 | * @param bp | ||
| 272 | * @param parsing_flags Parsing flags from the START CQE | ||
| 273 | * @param len_on_bd Total length of the first packet for the | ||
| 274 | * aggregation. | ||
| 275 | */ | ||
| 276 | static inline u16 bnx2x_set_lro_mss(struct bnx2x *bp, u16 parsing_flags, | ||
| 277 | u16 len_on_bd) | ||
| 278 | { | ||
| 279 | /* TPA arrgregation won't have an IP options and TCP options | ||
| 280 | * other than timestamp. | ||
| 281 | */ | ||
| 282 | u16 hdrs_len = ETH_HLEN + sizeof(struct iphdr) + sizeof(struct tcphdr); | ||
| 283 | |||
| 284 | |||
| 285 | /* Check if there was a TCP timestamp, if there is it's will | ||
| 286 | * always be 12 bytes length: nop nop kind length echo val. | ||
| 287 | * | ||
| 288 | * Otherwise FW would close the aggregation. | ||
| 289 | */ | ||
| 290 | if (parsing_flags & PARSING_FLAGS_TIME_STAMP_EXIST_FLAG) | ||
| 291 | hdrs_len += TPA_TSTAMP_OPT_LEN; | ||
| 292 | |||
| 293 | return len_on_bd - hdrs_len; | ||
| 294 | } | ||
| 295 | |||
| 262 | static int bnx2x_fill_frag_skb(struct bnx2x *bp, struct bnx2x_fastpath *fp, | 296 | static int bnx2x_fill_frag_skb(struct bnx2x *bp, struct bnx2x_fastpath *fp, |
| 263 | struct sk_buff *skb, | 297 | struct sk_buff *skb, |
| 264 | struct eth_fast_path_rx_cqe *fp_cqe, | 298 | struct eth_fast_path_rx_cqe *fp_cqe, |
| 265 | u16 cqe_idx) | 299 | u16 cqe_idx, u16 parsing_flags) |
| 266 | { | 300 | { |
| 267 | struct sw_rx_page *rx_pg, old_rx_pg; | 301 | struct sw_rx_page *rx_pg, old_rx_pg; |
| 268 | u16 len_on_bd = le16_to_cpu(fp_cqe->len_on_bd); | 302 | u16 len_on_bd = le16_to_cpu(fp_cqe->len_on_bd); |
| @@ -275,8 +309,8 @@ static int bnx2x_fill_frag_skb(struct bnx2x *bp, struct bnx2x_fastpath *fp, | |||
| 275 | 309 | ||
| 276 | /* This is needed in order to enable forwarding support */ | 310 | /* This is needed in order to enable forwarding support */ |
| 277 | if (frag_size) | 311 | if (frag_size) |
| 278 | skb_shinfo(skb)->gso_size = min((u32)SGE_PAGE_SIZE, | 312 | skb_shinfo(skb)->gso_size = bnx2x_set_lro_mss(bp, parsing_flags, |
| 279 | max(frag_size, (u32)len_on_bd)); | 313 | len_on_bd); |
| 280 | 314 | ||
| 281 | #ifdef BNX2X_STOP_ON_ERROR | 315 | #ifdef BNX2X_STOP_ON_ERROR |
| 282 | if (pages > min_t(u32, 8, MAX_SKB_FRAGS)*SGE_PAGE_SIZE*PAGES_PER_SGE) { | 316 | if (pages > min_t(u32, 8, MAX_SKB_FRAGS)*SGE_PAGE_SIZE*PAGES_PER_SGE) { |
| @@ -344,6 +378,8 @@ static void bnx2x_tpa_stop(struct bnx2x *bp, struct bnx2x_fastpath *fp, | |||
| 344 | if (likely(new_skb)) { | 378 | if (likely(new_skb)) { |
| 345 | /* fix ip xsum and give it to the stack */ | 379 | /* fix ip xsum and give it to the stack */ |
| 346 | /* (no need to map the new skb) */ | 380 | /* (no need to map the new skb) */ |
| 381 | u16 parsing_flags = | ||
| 382 | le16_to_cpu(cqe->fast_path_cqe.pars_flags.flags); | ||
| 347 | 383 | ||
| 348 | prefetch(skb); | 384 | prefetch(skb); |
| 349 | prefetch(((char *)(skb)) + L1_CACHE_BYTES); | 385 | prefetch(((char *)(skb)) + L1_CACHE_BYTES); |
| @@ -373,9 +409,9 @@ static void bnx2x_tpa_stop(struct bnx2x *bp, struct bnx2x_fastpath *fp, | |||
| 373 | } | 409 | } |
| 374 | 410 | ||
| 375 | if (!bnx2x_fill_frag_skb(bp, fp, skb, | 411 | if (!bnx2x_fill_frag_skb(bp, fp, skb, |
| 376 | &cqe->fast_path_cqe, cqe_idx)) { | 412 | &cqe->fast_path_cqe, cqe_idx, |
| 377 | if ((le16_to_cpu(cqe->fast_path_cqe. | 413 | parsing_flags)) { |
| 378 | pars_flags.flags) & PARSING_FLAGS_VLAN)) | 414 | if (parsing_flags & PARSING_FLAGS_VLAN) |
| 379 | __vlan_hwaccel_put_tag(skb, | 415 | __vlan_hwaccel_put_tag(skb, |
| 380 | le16_to_cpu(cqe->fast_path_cqe. | 416 | le16_to_cpu(cqe->fast_path_cqe. |
| 381 | vlan_tag)); | 417 | vlan_tag)); |
| @@ -703,19 +739,20 @@ u16 bnx2x_get_mf_speed(struct bnx2x *bp) | |||
| 703 | { | 739 | { |
| 704 | u16 line_speed = bp->link_vars.line_speed; | 740 | u16 line_speed = bp->link_vars.line_speed; |
| 705 | if (IS_MF(bp)) { | 741 | if (IS_MF(bp)) { |
| 706 | u16 maxCfg = (bp->mf_config[BP_VN(bp)] & | 742 | u16 maxCfg = bnx2x_extract_max_cfg(bp, |
| 707 | FUNC_MF_CFG_MAX_BW_MASK) >> | 743 | bp->mf_config[BP_VN(bp)]); |
| 708 | FUNC_MF_CFG_MAX_BW_SHIFT; | 744 | |
| 709 | /* Calculate the current MAX line speed limit for the DCC | 745 | /* Calculate the current MAX line speed limit for the MF |
| 710 | * capable devices | 746 | * devices |
| 711 | */ | 747 | */ |
| 712 | if (IS_MF_SD(bp)) { | 748 | if (IS_MF_SI(bp)) |
| 749 | line_speed = (line_speed * maxCfg) / 100; | ||
| 750 | else { /* SD mode */ | ||
| 713 | u16 vn_max_rate = maxCfg * 100; | 751 | u16 vn_max_rate = maxCfg * 100; |
| 714 | 752 | ||
| 715 | if (vn_max_rate < line_speed) | 753 | if (vn_max_rate < line_speed) |
| 716 | line_speed = vn_max_rate; | 754 | line_speed = vn_max_rate; |
| 717 | } else /* IS_MF_SI(bp)) */ | 755 | } |
| 718 | line_speed = (line_speed * maxCfg) / 100; | ||
| 719 | } | 756 | } |
| 720 | 757 | ||
| 721 | return line_speed; | 758 | return line_speed; |
diff --git a/drivers/net/bnx2x/bnx2x_cmn.h b/drivers/net/bnx2x/bnx2x_cmn.h index 03eb4d68e6b..326ba44b3de 100644 --- a/drivers/net/bnx2x/bnx2x_cmn.h +++ b/drivers/net/bnx2x/bnx2x_cmn.h | |||
| @@ -1044,4 +1044,24 @@ static inline void storm_memset_cmng(struct bnx2x *bp, | |||
| 1044 | void bnx2x_acquire_phy_lock(struct bnx2x *bp); | 1044 | void bnx2x_acquire_phy_lock(struct bnx2x *bp); |
| 1045 | void bnx2x_release_phy_lock(struct bnx2x *bp); | 1045 | void bnx2x_release_phy_lock(struct bnx2x *bp); |
| 1046 | 1046 | ||
| 1047 | /** | ||
| 1048 | * Extracts MAX BW part from MF configuration. | ||
| 1049 | * | ||
| 1050 | * @param bp | ||
| 1051 | * @param mf_cfg | ||
| 1052 | * | ||
| 1053 | * @return u16 | ||
| 1054 | */ | ||
| 1055 | static inline u16 bnx2x_extract_max_cfg(struct bnx2x *bp, u32 mf_cfg) | ||
| 1056 | { | ||
| 1057 | u16 max_cfg = (mf_cfg & FUNC_MF_CFG_MAX_BW_MASK) >> | ||
| 1058 | FUNC_MF_CFG_MAX_BW_SHIFT; | ||
| 1059 | if (!max_cfg) { | ||
| 1060 | BNX2X_ERR("Illegal configuration detected for Max BW - " | ||
| 1061 | "using 100 instead\n"); | ||
| 1062 | max_cfg = 100; | ||
| 1063 | } | ||
| 1064 | return max_cfg; | ||
| 1065 | } | ||
| 1066 | |||
| 1047 | #endif /* BNX2X_CMN_H */ | 1067 | #endif /* BNX2X_CMN_H */ |
diff --git a/drivers/net/bnx2x/bnx2x_ethtool.c b/drivers/net/bnx2x/bnx2x_ethtool.c index 5b44a8b4850..ef2919987a1 100644 --- a/drivers/net/bnx2x/bnx2x_ethtool.c +++ b/drivers/net/bnx2x/bnx2x_ethtool.c | |||
| @@ -238,7 +238,7 @@ static int bnx2x_set_settings(struct net_device *dev, struct ethtool_cmd *cmd) | |||
| 238 | speed |= (cmd->speed_hi << 16); | 238 | speed |= (cmd->speed_hi << 16); |
| 239 | 239 | ||
| 240 | if (IS_MF_SI(bp)) { | 240 | if (IS_MF_SI(bp)) { |
| 241 | u32 param = 0; | 241 | u32 param = 0, part; |
| 242 | u32 line_speed = bp->link_vars.line_speed; | 242 | u32 line_speed = bp->link_vars.line_speed; |
| 243 | 243 | ||
| 244 | /* use 10G if no link detected */ | 244 | /* use 10G if no link detected */ |
| @@ -251,9 +251,11 @@ static int bnx2x_set_settings(struct net_device *dev, struct ethtool_cmd *cmd) | |||
| 251 | REQ_BC_VER_4_SET_MF_BW); | 251 | REQ_BC_VER_4_SET_MF_BW); |
| 252 | return -EINVAL; | 252 | return -EINVAL; |
| 253 | } | 253 | } |
| 254 | if (line_speed < speed) { | 254 | part = (speed * 100) / line_speed; |
| 255 | BNX2X_DEV_INFO("New speed should be less or equal " | 255 | if (line_speed < speed || !part) { |
| 256 | "to actual line speed\n"); | 256 | BNX2X_DEV_INFO("Speed setting should be in a range " |
| 257 | "from 1%% to 100%% " | ||
| 258 | "of actual line speed\n"); | ||
| 257 | return -EINVAL; | 259 | return -EINVAL; |
| 258 | } | 260 | } |
| 259 | /* load old values */ | 261 | /* load old values */ |
| @@ -263,8 +265,7 @@ static int bnx2x_set_settings(struct net_device *dev, struct ethtool_cmd *cmd) | |||
| 263 | param &= FUNC_MF_CFG_MIN_BW_MASK; | 265 | param &= FUNC_MF_CFG_MIN_BW_MASK; |
| 264 | 266 | ||
| 265 | /* set new MAX value */ | 267 | /* set new MAX value */ |
| 266 | param |= (((speed * 100) / line_speed) | 268 | param |= (part << FUNC_MF_CFG_MAX_BW_SHIFT) |
| 267 | << FUNC_MF_CFG_MAX_BW_SHIFT) | ||
| 268 | & FUNC_MF_CFG_MAX_BW_MASK; | 269 | & FUNC_MF_CFG_MAX_BW_MASK; |
| 269 | 270 | ||
| 270 | bnx2x_fw_command(bp, DRV_MSG_CODE_SET_MF_BW, param); | 271 | bnx2x_fw_command(bp, DRV_MSG_CODE_SET_MF_BW, param); |
| @@ -1781,9 +1782,7 @@ static int bnx2x_test_nvram(struct bnx2x *bp) | |||
| 1781 | { 0x100, 0x350 }, /* manuf_info */ | 1782 | { 0x100, 0x350 }, /* manuf_info */ |
| 1782 | { 0x450, 0xf0 }, /* feature_info */ | 1783 | { 0x450, 0xf0 }, /* feature_info */ |
| 1783 | { 0x640, 0x64 }, /* upgrade_key_info */ | 1784 | { 0x640, 0x64 }, /* upgrade_key_info */ |
| 1784 | { 0x6a4, 0x64 }, | ||
| 1785 | { 0x708, 0x70 }, /* manuf_key_info */ | 1785 | { 0x708, 0x70 }, /* manuf_key_info */ |
| 1786 | { 0x778, 0x70 }, | ||
| 1787 | { 0, 0 } | 1786 | { 0, 0 } |
| 1788 | }; | 1787 | }; |
| 1789 | __be32 buf[0x350 / 4]; | 1788 | __be32 buf[0x350 / 4]; |
| @@ -1933,11 +1932,11 @@ static void bnx2x_self_test(struct net_device *dev, | |||
| 1933 | buf[4] = 1; | 1932 | buf[4] = 1; |
| 1934 | etest->flags |= ETH_TEST_FL_FAILED; | 1933 | etest->flags |= ETH_TEST_FL_FAILED; |
| 1935 | } | 1934 | } |
| 1936 | if (bp->port.pmf) | 1935 | |
| 1937 | if (bnx2x_link_test(bp, is_serdes) != 0) { | 1936 | if (bnx2x_link_test(bp, is_serdes) != 0) { |
| 1938 | buf[5] = 1; | 1937 | buf[5] = 1; |
| 1939 | etest->flags |= ETH_TEST_FL_FAILED; | 1938 | etest->flags |= ETH_TEST_FL_FAILED; |
| 1940 | } | 1939 | } |
| 1941 | 1940 | ||
| 1942 | #ifdef BNX2X_EXTRA_DEBUG | 1941 | #ifdef BNX2X_EXTRA_DEBUG |
| 1943 | bnx2x_panic_dump(bp); | 1942 | bnx2x_panic_dump(bp); |
diff --git a/drivers/net/bnx2x/bnx2x_init.h b/drivers/net/bnx2x/bnx2x_init.h index 5a268e9a089..fa6dbe3f205 100644 --- a/drivers/net/bnx2x/bnx2x_init.h +++ b/drivers/net/bnx2x/bnx2x_init.h | |||
| @@ -241,7 +241,7 @@ static const struct { | |||
| 241 | /* Block IGU, MISC, PXP and PXP2 parity errors as long as we don't | 241 | /* Block IGU, MISC, PXP and PXP2 parity errors as long as we don't |
| 242 | * want to handle "system kill" flow at the moment. | 242 | * want to handle "system kill" flow at the moment. |
| 243 | */ | 243 | */ |
| 244 | BLOCK_PRTY_INFO(PXP, 0x3ffffff, 0x3ffffff, 0x3ffffff, 0x3ffffff), | 244 | BLOCK_PRTY_INFO(PXP, 0x7ffffff, 0x3ffffff, 0x3ffffff, 0x7ffffff), |
| 245 | BLOCK_PRTY_INFO_0(PXP2, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff), | 245 | BLOCK_PRTY_INFO_0(PXP2, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff), |
| 246 | BLOCK_PRTY_INFO_1(PXP2, 0x7ff, 0x7f, 0x7f, 0x7ff), | 246 | BLOCK_PRTY_INFO_1(PXP2, 0x7ff, 0x7f, 0x7f, 0x7ff), |
| 247 | BLOCK_PRTY_INFO(HC, 0x7, 0x7, 0x7, 0), | 247 | BLOCK_PRTY_INFO(HC, 0x7, 0x7, 0x7, 0), |
diff --git a/drivers/net/bnx2x/bnx2x_main.c b/drivers/net/bnx2x/bnx2x_main.c index d584d32c747..032ae184b60 100644 --- a/drivers/net/bnx2x/bnx2x_main.c +++ b/drivers/net/bnx2x/bnx2x_main.c | |||
| @@ -1974,13 +1974,22 @@ static void bnx2x_init_vn_minmax(struct bnx2x *bp, int vn) | |||
| 1974 | vn_max_rate = 0; | 1974 | vn_max_rate = 0; |
| 1975 | 1975 | ||
| 1976 | } else { | 1976 | } else { |
| 1977 | u32 maxCfg = bnx2x_extract_max_cfg(bp, vn_cfg); | ||
| 1978 | |||
| 1977 | vn_min_rate = ((vn_cfg & FUNC_MF_CFG_MIN_BW_MASK) >> | 1979 | vn_min_rate = ((vn_cfg & FUNC_MF_CFG_MIN_BW_MASK) >> |
| 1978 | FUNC_MF_CFG_MIN_BW_SHIFT) * 100; | 1980 | FUNC_MF_CFG_MIN_BW_SHIFT) * 100; |
| 1979 | /* If min rate is zero - set it to 1 */ | 1981 | /* If fairness is enabled (not all min rates are zeroes) and |
| 1982 | if current min rate is zero - set it to 1. | ||
| 1983 | This is a requirement of the algorithm. */ | ||
| 1980 | if (bp->vn_weight_sum && (vn_min_rate == 0)) | 1984 | if (bp->vn_weight_sum && (vn_min_rate == 0)) |
| 1981 | vn_min_rate = DEF_MIN_RATE; | 1985 | vn_min_rate = DEF_MIN_RATE; |
| 1982 | vn_max_rate = ((vn_cfg & FUNC_MF_CFG_MAX_BW_MASK) >> | 1986 | |
| 1983 | FUNC_MF_CFG_MAX_BW_SHIFT) * 100; | 1987 | if (IS_MF_SI(bp)) |
| 1988 | /* maxCfg in percents of linkspeed */ | ||
| 1989 | vn_max_rate = (bp->link_vars.line_speed * maxCfg) / 100; | ||
| 1990 | else | ||
| 1991 | /* maxCfg is absolute in 100Mb units */ | ||
| 1992 | vn_max_rate = maxCfg * 100; | ||
| 1984 | } | 1993 | } |
| 1985 | 1994 | ||
| 1986 | DP(NETIF_MSG_IFUP, | 1995 | DP(NETIF_MSG_IFUP, |
| @@ -2006,7 +2015,8 @@ static void bnx2x_init_vn_minmax(struct bnx2x *bp, int vn) | |||
| 2006 | m_fair_vn.vn_credit_delta = | 2015 | m_fair_vn.vn_credit_delta = |
| 2007 | max_t(u32, (vn_min_rate * (T_FAIR_COEF / | 2016 | max_t(u32, (vn_min_rate * (T_FAIR_COEF / |
| 2008 | (8 * bp->vn_weight_sum))), | 2017 | (8 * bp->vn_weight_sum))), |
| 2009 | (bp->cmng.fair_vars.fair_threshold * 2)); | 2018 | (bp->cmng.fair_vars.fair_threshold + |
| 2019 | MIN_ABOVE_THRESH)); | ||
| 2010 | DP(NETIF_MSG_IFUP, "m_fair_vn.vn_credit_delta %d\n", | 2020 | DP(NETIF_MSG_IFUP, "m_fair_vn.vn_credit_delta %d\n", |
| 2011 | m_fair_vn.vn_credit_delta); | 2021 | m_fair_vn.vn_credit_delta); |
| 2012 | } | 2022 | } |
diff --git a/drivers/net/bnx2x/bnx2x_stats.c b/drivers/net/bnx2x/bnx2x_stats.c index bda60d590fa..3445ded6674 100644 --- a/drivers/net/bnx2x/bnx2x_stats.c +++ b/drivers/net/bnx2x/bnx2x_stats.c | |||
| @@ -1239,14 +1239,14 @@ void bnx2x_stats_handle(struct bnx2x *bp, enum bnx2x_stats_event event) | |||
| 1239 | if (unlikely(bp->panic)) | 1239 | if (unlikely(bp->panic)) |
| 1240 | return; | 1240 | return; |
| 1241 | 1241 | ||
| 1242 | bnx2x_stats_stm[bp->stats_state][event].action(bp); | ||
| 1243 | |||
| 1242 | /* Protect a state change flow */ | 1244 | /* Protect a state change flow */ |
| 1243 | spin_lock_bh(&bp->stats_lock); | 1245 | spin_lock_bh(&bp->stats_lock); |
| 1244 | state = bp->stats_state; | 1246 | state = bp->stats_state; |
| 1245 | bp->stats_state = bnx2x_stats_stm[state][event].next_state; | 1247 | bp->stats_state = bnx2x_stats_stm[state][event].next_state; |
| 1246 | spin_unlock_bh(&bp->stats_lock); | 1248 | spin_unlock_bh(&bp->stats_lock); |
| 1247 | 1249 | ||
| 1248 | bnx2x_stats_stm[state][event].action(bp); | ||
| 1249 | |||
| 1250 | if ((event != STATS_EVENT_UPDATE) || netif_msg_timer(bp)) | 1250 | if ((event != STATS_EVENT_UPDATE) || netif_msg_timer(bp)) |
| 1251 | DP(BNX2X_MSG_STATS, "state %d -> event %d -> state %d\n", | 1251 | DP(BNX2X_MSG_STATS, "state %d -> event %d -> state %d\n", |
| 1252 | state, event, bp->stats_state); | 1252 | state, event, bp->stats_state); |
diff --git a/drivers/net/can/softing/softing_main.c b/drivers/net/can/softing/softing_main.c index 5157e15e96e..aeea9f9ff6e 100644 --- a/drivers/net/can/softing/softing_main.c +++ b/drivers/net/can/softing/softing_main.c | |||
| @@ -633,6 +633,7 @@ static const struct net_device_ops softing_netdev_ops = { | |||
| 633 | }; | 633 | }; |
| 634 | 634 | ||
| 635 | static const struct can_bittiming_const softing_btr_const = { | 635 | static const struct can_bittiming_const softing_btr_const = { |
| 636 | .name = "softing", | ||
| 636 | .tseg1_min = 1, | 637 | .tseg1_min = 1, |
| 637 | .tseg1_max = 16, | 638 | .tseg1_max = 16, |
| 638 | .tseg2_min = 1, | 639 | .tseg2_min = 1, |
diff --git a/drivers/net/cnic.c b/drivers/net/cnic.c index 7ff170cbc7d..302be4aa69d 100644 --- a/drivers/net/cnic.c +++ b/drivers/net/cnic.c | |||
| @@ -2760,6 +2760,8 @@ static u32 cnic_service_bnx2_queues(struct cnic_dev *dev) | |||
| 2760 | u32 status_idx = (u16) *cp->kcq1.status_idx_ptr; | 2760 | u32 status_idx = (u16) *cp->kcq1.status_idx_ptr; |
| 2761 | int kcqe_cnt; | 2761 | int kcqe_cnt; |
| 2762 | 2762 | ||
| 2763 | /* status block index must be read before reading other fields */ | ||
| 2764 | rmb(); | ||
| 2763 | cp->kwq_con_idx = *cp->kwq_con_idx_ptr; | 2765 | cp->kwq_con_idx = *cp->kwq_con_idx_ptr; |
| 2764 | 2766 | ||
| 2765 | while ((kcqe_cnt = cnic_get_kcqes(dev, &cp->kcq1))) { | 2767 | while ((kcqe_cnt = cnic_get_kcqes(dev, &cp->kcq1))) { |
| @@ -2770,6 +2772,8 @@ static u32 cnic_service_bnx2_queues(struct cnic_dev *dev) | |||
| 2770 | barrier(); | 2772 | barrier(); |
| 2771 | if (status_idx != *cp->kcq1.status_idx_ptr) { | 2773 | if (status_idx != *cp->kcq1.status_idx_ptr) { |
| 2772 | status_idx = (u16) *cp->kcq1.status_idx_ptr; | 2774 | status_idx = (u16) *cp->kcq1.status_idx_ptr; |
| 2775 | /* status block index must be read first */ | ||
| 2776 | rmb(); | ||
| 2773 | cp->kwq_con_idx = *cp->kwq_con_idx_ptr; | 2777 | cp->kwq_con_idx = *cp->kwq_con_idx_ptr; |
| 2774 | } else | 2778 | } else |
| 2775 | break; | 2779 | break; |
| @@ -2888,6 +2892,8 @@ static u32 cnic_service_bnx2x_kcq(struct cnic_dev *dev, struct kcq_info *info) | |||
| 2888 | u32 last_status = *info->status_idx_ptr; | 2892 | u32 last_status = *info->status_idx_ptr; |
| 2889 | int kcqe_cnt; | 2893 | int kcqe_cnt; |
| 2890 | 2894 | ||
| 2895 | /* status block index must be read before reading the KCQ */ | ||
| 2896 | rmb(); | ||
| 2891 | while ((kcqe_cnt = cnic_get_kcqes(dev, info))) { | 2897 | while ((kcqe_cnt = cnic_get_kcqes(dev, info))) { |
| 2892 | 2898 | ||
| 2893 | service_kcqes(dev, kcqe_cnt); | 2899 | service_kcqes(dev, kcqe_cnt); |
| @@ -2898,6 +2904,8 @@ static u32 cnic_service_bnx2x_kcq(struct cnic_dev *dev, struct kcq_info *info) | |||
| 2898 | break; | 2904 | break; |
| 2899 | 2905 | ||
| 2900 | last_status = *info->status_idx_ptr; | 2906 | last_status = *info->status_idx_ptr; |
| 2907 | /* status block index must be read before reading the KCQ */ | ||
| 2908 | rmb(); | ||
| 2901 | } | 2909 | } |
| 2902 | return last_status; | 2910 | return last_status; |
| 2903 | } | 2911 | } |
| @@ -2906,26 +2914,35 @@ static void cnic_service_bnx2x_bh(unsigned long data) | |||
| 2906 | { | 2914 | { |
| 2907 | struct cnic_dev *dev = (struct cnic_dev *) data; | 2915 | struct cnic_dev *dev = (struct cnic_dev *) data; |
| 2908 | struct cnic_local *cp = dev->cnic_priv; | 2916 | struct cnic_local *cp = dev->cnic_priv; |
| 2909 | u32 status_idx; | 2917 | u32 status_idx, new_status_idx; |
| 2910 | 2918 | ||
| 2911 | if (unlikely(!test_bit(CNIC_F_CNIC_UP, &dev->flags))) | 2919 | if (unlikely(!test_bit(CNIC_F_CNIC_UP, &dev->flags))) |
| 2912 | return; | 2920 | return; |
| 2913 | 2921 | ||
| 2914 | status_idx = cnic_service_bnx2x_kcq(dev, &cp->kcq1); | 2922 | while (1) { |
| 2923 | status_idx = cnic_service_bnx2x_kcq(dev, &cp->kcq1); | ||
| 2915 | 2924 | ||
| 2916 | CNIC_WR16(dev, cp->kcq1.io_addr, cp->kcq1.sw_prod_idx + MAX_KCQ_IDX); | 2925 | CNIC_WR16(dev, cp->kcq1.io_addr, |
| 2926 | cp->kcq1.sw_prod_idx + MAX_KCQ_IDX); | ||
| 2917 | 2927 | ||
| 2918 | if (BNX2X_CHIP_IS_E2(cp->chip_id)) { | 2928 | if (!BNX2X_CHIP_IS_E2(cp->chip_id)) { |
| 2919 | status_idx = cnic_service_bnx2x_kcq(dev, &cp->kcq2); | 2929 | cnic_ack_bnx2x_int(dev, cp->bnx2x_igu_sb_id, USTORM_ID, |
| 2930 | status_idx, IGU_INT_ENABLE, 1); | ||
| 2931 | break; | ||
| 2932 | } | ||
| 2933 | |||
| 2934 | new_status_idx = cnic_service_bnx2x_kcq(dev, &cp->kcq2); | ||
| 2935 | |||
| 2936 | if (new_status_idx != status_idx) | ||
| 2937 | continue; | ||
| 2920 | 2938 | ||
| 2921 | CNIC_WR16(dev, cp->kcq2.io_addr, cp->kcq2.sw_prod_idx + | 2939 | CNIC_WR16(dev, cp->kcq2.io_addr, cp->kcq2.sw_prod_idx + |
| 2922 | MAX_KCQ_IDX); | 2940 | MAX_KCQ_IDX); |
| 2923 | 2941 | ||
| 2924 | cnic_ack_igu_sb(dev, cp->bnx2x_igu_sb_id, IGU_SEG_ACCESS_DEF, | 2942 | cnic_ack_igu_sb(dev, cp->bnx2x_igu_sb_id, IGU_SEG_ACCESS_DEF, |
| 2925 | status_idx, IGU_INT_ENABLE, 1); | 2943 | status_idx, IGU_INT_ENABLE, 1); |
| 2926 | } else { | 2944 | |
| 2927 | cnic_ack_bnx2x_int(dev, cp->bnx2x_igu_sb_id, USTORM_ID, | 2945 | break; |
| 2928 | status_idx, IGU_INT_ENABLE, 1); | ||
| 2929 | } | 2946 | } |
| 2930 | } | 2947 | } |
| 2931 | 2948 | ||
diff --git a/drivers/net/davinci_emac.c b/drivers/net/davinci_emac.c index 2a628d17d17..7018bfe408a 100644 --- a/drivers/net/davinci_emac.c +++ b/drivers/net/davinci_emac.c | |||
| @@ -1008,7 +1008,7 @@ static void emac_rx_handler(void *token, int len, int status) | |||
| 1008 | int ret; | 1008 | int ret; |
| 1009 | 1009 | ||
| 1010 | /* free and bail if we are shutting down */ | 1010 | /* free and bail if we are shutting down */ |
| 1011 | if (unlikely(!netif_running(ndev))) { | 1011 | if (unlikely(!netif_running(ndev) || !netif_carrier_ok(ndev))) { |
| 1012 | dev_kfree_skb_any(skb); | 1012 | dev_kfree_skb_any(skb); |
| 1013 | return; | 1013 | return; |
| 1014 | } | 1014 | } |
diff --git a/drivers/net/dnet.c b/drivers/net/dnet.c index 9d8a20b72fa..8318ea06cb6 100644 --- a/drivers/net/dnet.c +++ b/drivers/net/dnet.c | |||
| @@ -337,8 +337,6 @@ static int dnet_mii_init(struct dnet *bp) | |||
| 337 | for (i = 0; i < PHY_MAX_ADDR; i++) | 337 | for (i = 0; i < PHY_MAX_ADDR; i++) |
| 338 | bp->mii_bus->irq[i] = PHY_POLL; | 338 | bp->mii_bus->irq[i] = PHY_POLL; |
| 339 | 339 | ||
| 340 | platform_set_drvdata(bp->dev, bp->mii_bus); | ||
| 341 | |||
| 342 | if (mdiobus_register(bp->mii_bus)) { | 340 | if (mdiobus_register(bp->mii_bus)) { |
| 343 | err = -ENXIO; | 341 | err = -ENXIO; |
| 344 | goto err_out_free_mdio_irq; | 342 | goto err_out_free_mdio_irq; |
| @@ -863,6 +861,7 @@ static int __devinit dnet_probe(struct platform_device *pdev) | |||
| 863 | bp = netdev_priv(dev); | 861 | bp = netdev_priv(dev); |
| 864 | bp->dev = dev; | 862 | bp->dev = dev; |
| 865 | 863 | ||
| 864 | platform_set_drvdata(pdev, dev); | ||
| 866 | SET_NETDEV_DEV(dev, &pdev->dev); | 865 | SET_NETDEV_DEV(dev, &pdev->dev); |
| 867 | 866 | ||
| 868 | spin_lock_init(&bp->lock); | 867 | spin_lock_init(&bp->lock); |
diff --git a/drivers/net/e1000/e1000_osdep.h b/drivers/net/e1000/e1000_osdep.h index 55c1711f168..33e7c45a4fe 100644 --- a/drivers/net/e1000/e1000_osdep.h +++ b/drivers/net/e1000/e1000_osdep.h | |||
| @@ -42,7 +42,8 @@ | |||
| 42 | #define GBE_CONFIG_RAM_BASE \ | 42 | #define GBE_CONFIG_RAM_BASE \ |
| 43 | ((unsigned int)(CONFIG_RAM_BASE + GBE_CONFIG_OFFSET)) | 43 | ((unsigned int)(CONFIG_RAM_BASE + GBE_CONFIG_OFFSET)) |
| 44 | 44 | ||
| 45 | #define GBE_CONFIG_BASE_VIRT phys_to_virt(GBE_CONFIG_RAM_BASE) | 45 | #define GBE_CONFIG_BASE_VIRT \ |
| 46 | ((void __iomem *)phys_to_virt(GBE_CONFIG_RAM_BASE)) | ||
| 46 | 47 | ||
| 47 | #define GBE_CONFIG_FLASH_WRITE(base, offset, count, data) \ | 48 | #define GBE_CONFIG_FLASH_WRITE(base, offset, count, data) \ |
| 48 | (iowrite16_rep(base + offset, data, count)) | 49 | (iowrite16_rep(base + offset, data, count)) |
diff --git a/drivers/net/e1000e/netdev.c b/drivers/net/e1000e/netdev.c index 3fa110ddb04..2e5022849f1 100644 --- a/drivers/net/e1000e/netdev.c +++ b/drivers/net/e1000e/netdev.c | |||
| @@ -5967,7 +5967,8 @@ static int __devinit e1000_probe(struct pci_dev *pdev, | |||
| 5967 | /* APME bit in EEPROM is mapped to WUC.APME */ | 5967 | /* APME bit in EEPROM is mapped to WUC.APME */ |
| 5968 | eeprom_data = er32(WUC); | 5968 | eeprom_data = er32(WUC); |
| 5969 | eeprom_apme_mask = E1000_WUC_APME; | 5969 | eeprom_apme_mask = E1000_WUC_APME; |
| 5970 | if (eeprom_data & E1000_WUC_PHY_WAKE) | 5970 | if ((hw->mac.type > e1000_ich10lan) && |
| 5971 | (eeprom_data & E1000_WUC_PHY_WAKE)) | ||
| 5971 | adapter->flags2 |= FLAG2_HAS_PHY_WAKEUP; | 5972 | adapter->flags2 |= FLAG2_HAS_PHY_WAKEUP; |
| 5972 | } else if (adapter->flags & FLAG_APME_IN_CTRL3) { | 5973 | } else if (adapter->flags & FLAG_APME_IN_CTRL3) { |
| 5973 | if (adapter->flags & FLAG_APME_CHECK_PORT_B && | 5974 | if (adapter->flags & FLAG_APME_CHECK_PORT_B && |
diff --git a/drivers/net/fec.c b/drivers/net/fec.c index 2a71373719a..cd0282d5d40 100644 --- a/drivers/net/fec.c +++ b/drivers/net/fec.c | |||
| @@ -74,7 +74,8 @@ static struct platform_device_id fec_devtype[] = { | |||
| 74 | }, { | 74 | }, { |
| 75 | .name = "imx28-fec", | 75 | .name = "imx28-fec", |
| 76 | .driver_data = FEC_QUIRK_ENET_MAC | FEC_QUIRK_SWAP_FRAME, | 76 | .driver_data = FEC_QUIRK_ENET_MAC | FEC_QUIRK_SWAP_FRAME, |
| 77 | } | 77 | }, |
| 78 | { } | ||
| 78 | }; | 79 | }; |
| 79 | 80 | ||
| 80 | static unsigned char macaddr[ETH_ALEN]; | 81 | static unsigned char macaddr[ETH_ALEN]; |
diff --git a/drivers/net/igbvf/vf.c b/drivers/net/igbvf/vf.c index 74486a8b009..af3822f9ea9 100644 --- a/drivers/net/igbvf/vf.c +++ b/drivers/net/igbvf/vf.c | |||
| @@ -220,7 +220,7 @@ static u32 e1000_hash_mc_addr_vf(struct e1000_hw *hw, u8 *mc_addr) | |||
| 220 | * The parameter rar_count will usually be hw->mac.rar_entry_count | 220 | * The parameter rar_count will usually be hw->mac.rar_entry_count |
| 221 | * unless there are workarounds that change this. | 221 | * unless there are workarounds that change this. |
| 222 | **/ | 222 | **/ |
| 223 | void e1000_update_mc_addr_list_vf(struct e1000_hw *hw, | 223 | static void e1000_update_mc_addr_list_vf(struct e1000_hw *hw, |
| 224 | u8 *mc_addr_list, u32 mc_addr_count, | 224 | u8 *mc_addr_list, u32 mc_addr_count, |
| 225 | u32 rar_used_count, u32 rar_count) | 225 | u32 rar_used_count, u32 rar_count) |
| 226 | { | 226 | { |
diff --git a/drivers/net/macb.c b/drivers/net/macb.c index f69e73e2191..79ccb54ab00 100644 --- a/drivers/net/macb.c +++ b/drivers/net/macb.c | |||
| @@ -260,7 +260,7 @@ static int macb_mii_init(struct macb *bp) | |||
| 260 | for (i = 0; i < PHY_MAX_ADDR; i++) | 260 | for (i = 0; i < PHY_MAX_ADDR; i++) |
| 261 | bp->mii_bus->irq[i] = PHY_POLL; | 261 | bp->mii_bus->irq[i] = PHY_POLL; |
| 262 | 262 | ||
| 263 | platform_set_drvdata(bp->dev, bp->mii_bus); | 263 | dev_set_drvdata(&bp->dev->dev, bp->mii_bus); |
| 264 | 264 | ||
| 265 | if (mdiobus_register(bp->mii_bus)) | 265 | if (mdiobus_register(bp->mii_bus)) |
| 266 | goto err_out_free_mdio_irq; | 266 | goto err_out_free_mdio_irq; |
diff --git a/drivers/net/pcmcia/fmvj18x_cs.c b/drivers/net/pcmcia/fmvj18x_cs.c index 9226cda4d05..530ab5a10bd 100644 --- a/drivers/net/pcmcia/fmvj18x_cs.c +++ b/drivers/net/pcmcia/fmvj18x_cs.c | |||
| @@ -691,6 +691,7 @@ static struct pcmcia_device_id fmvj18x_ids[] = { | |||
| 691 | PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0105, 0x0e0a), | 691 | PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0105, 0x0e0a), |
| 692 | PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0032, 0x0e01), | 692 | PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0032, 0x0e01), |
| 693 | PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0032, 0x0a05), | 693 | PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0032, 0x0a05), |
| 694 | PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0032, 0x0b05), | ||
| 694 | PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0032, 0x1101), | 695 | PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0032, 0x1101), |
| 695 | PCMCIA_DEVICE_NULL, | 696 | PCMCIA_DEVICE_NULL, |
| 696 | }; | 697 | }; |
diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c index ef2133b16f8..7ffdb80adf4 100644 --- a/drivers/net/r8169.c +++ b/drivers/net/r8169.c | |||
| @@ -25,6 +25,7 @@ | |||
| 25 | #include <linux/dma-mapping.h> | 25 | #include <linux/dma-mapping.h> |
| 26 | #include <linux/pm_runtime.h> | 26 | #include <linux/pm_runtime.h> |
| 27 | #include <linux/firmware.h> | 27 | #include <linux/firmware.h> |
| 28 | #include <linux/pci-aspm.h> | ||
| 28 | 29 | ||
| 29 | #include <asm/system.h> | 30 | #include <asm/system.h> |
| 30 | #include <asm/io.h> | 31 | #include <asm/io.h> |
| @@ -3020,6 +3021,11 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
| 3020 | mii->reg_num_mask = 0x1f; | 3021 | mii->reg_num_mask = 0x1f; |
| 3021 | mii->supports_gmii = !!(cfg->features & RTL_FEATURE_GMII); | 3022 | mii->supports_gmii = !!(cfg->features & RTL_FEATURE_GMII); |
| 3022 | 3023 | ||
| 3024 | /* disable ASPM completely as that cause random device stop working | ||
| 3025 | * problems as well as full system hangs for some PCIe devices users */ | ||
| 3026 | pci_disable_link_state(pdev, PCIE_LINK_STATE_L0S | PCIE_LINK_STATE_L1 | | ||
| 3027 | PCIE_LINK_STATE_CLKPM); | ||
| 3028 | |||
| 3023 | /* enable device (incl. PCI PM wakeup and hotplug setup) */ | 3029 | /* enable device (incl. PCI PM wakeup and hotplug setup) */ |
| 3024 | rc = pci_enable_device(pdev); | 3030 | rc = pci_enable_device(pdev); |
| 3025 | if (rc < 0) { | 3031 | if (rc < 0) { |
diff --git a/drivers/net/skge.c b/drivers/net/skge.c index 42daf98ba73..35b28f42d20 100644 --- a/drivers/net/skge.c +++ b/drivers/net/skge.c | |||
| @@ -3856,9 +3856,6 @@ static struct net_device *skge_devinit(struct skge_hw *hw, int port, | |||
| 3856 | memcpy_fromio(dev->dev_addr, hw->regs + B2_MAC_1 + port*8, ETH_ALEN); | 3856 | memcpy_fromio(dev->dev_addr, hw->regs + B2_MAC_1 + port*8, ETH_ALEN); |
| 3857 | memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len); | 3857 | memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len); |
| 3858 | 3858 | ||
| 3859 | /* device is off until link detection */ | ||
| 3860 | netif_carrier_off(dev); | ||
| 3861 | |||
| 3862 | return dev; | 3859 | return dev; |
| 3863 | } | 3860 | } |
| 3864 | 3861 | ||
diff --git a/drivers/net/wireless/ath/ath9k/hif_usb.c b/drivers/net/wireless/ath/ath9k/hif_usb.c index 5ab3084eb9c..07b1633b7f3 100644 --- a/drivers/net/wireless/ath/ath9k/hif_usb.c +++ b/drivers/net/wireless/ath/ath9k/hif_usb.c | |||
| @@ -219,8 +219,9 @@ static int __hif_usb_tx(struct hif_device_usb *hif_dev) | |||
| 219 | struct tx_buf *tx_buf = NULL; | 219 | struct tx_buf *tx_buf = NULL; |
| 220 | struct sk_buff *nskb = NULL; | 220 | struct sk_buff *nskb = NULL; |
| 221 | int ret = 0, i; | 221 | int ret = 0, i; |
| 222 | u16 *hdr, tx_skb_cnt = 0; | 222 | u16 tx_skb_cnt = 0; |
| 223 | u8 *buf; | 223 | u8 *buf; |
| 224 | __le16 *hdr; | ||
| 224 | 225 | ||
| 225 | if (hif_dev->tx.tx_skb_cnt == 0) | 226 | if (hif_dev->tx.tx_skb_cnt == 0) |
| 226 | return 0; | 227 | return 0; |
| @@ -245,9 +246,9 @@ static int __hif_usb_tx(struct hif_device_usb *hif_dev) | |||
| 245 | 246 | ||
| 246 | buf = tx_buf->buf; | 247 | buf = tx_buf->buf; |
| 247 | buf += tx_buf->offset; | 248 | buf += tx_buf->offset; |
| 248 | hdr = (u16 *)buf; | 249 | hdr = (__le16 *)buf; |
| 249 | *hdr++ = nskb->len; | 250 | *hdr++ = cpu_to_le16(nskb->len); |
| 250 | *hdr++ = ATH_USB_TX_STREAM_MODE_TAG; | 251 | *hdr++ = cpu_to_le16(ATH_USB_TX_STREAM_MODE_TAG); |
| 251 | buf += 4; | 252 | buf += 4; |
| 252 | memcpy(buf, nskb->data, nskb->len); | 253 | memcpy(buf, nskb->data, nskb->len); |
| 253 | tx_buf->len = nskb->len + 4; | 254 | tx_buf->len = nskb->len + 4; |
diff --git a/drivers/net/wireless/ath/ath9k/mac.c b/drivers/net/wireless/ath/ath9k/mac.c index 180170d3ce2..2915b11edef 100644 --- a/drivers/net/wireless/ath/ath9k/mac.c +++ b/drivers/net/wireless/ath/ath9k/mac.c | |||
| @@ -885,7 +885,7 @@ void ath9k_hw_set_interrupts(struct ath_hw *ah, enum ath9k_int ints) | |||
| 885 | struct ath_common *common = ath9k_hw_common(ah); | 885 | struct ath_common *common = ath9k_hw_common(ah); |
| 886 | 886 | ||
| 887 | if (!(ints & ATH9K_INT_GLOBAL)) | 887 | if (!(ints & ATH9K_INT_GLOBAL)) |
| 888 | ath9k_hw_enable_interrupts(ah); | 888 | ath9k_hw_disable_interrupts(ah); |
| 889 | 889 | ||
| 890 | ath_dbg(common, ATH_DBG_INTERRUPT, "0x%x => 0x%x\n", omask, ints); | 890 | ath_dbg(common, ATH_DBG_INTERRUPT, "0x%x => 0x%x\n", omask, ints); |
| 891 | 891 | ||
| @@ -963,7 +963,8 @@ void ath9k_hw_set_interrupts(struct ath_hw *ah, enum ath9k_int ints) | |||
| 963 | REG_CLR_BIT(ah, AR_IMR_S5, AR_IMR_S5_TIM_TIMER); | 963 | REG_CLR_BIT(ah, AR_IMR_S5, AR_IMR_S5_TIM_TIMER); |
| 964 | } | 964 | } |
| 965 | 965 | ||
| 966 | ath9k_hw_enable_interrupts(ah); | 966 | if (ints & ATH9K_INT_GLOBAL) |
| 967 | ath9k_hw_enable_interrupts(ah); | ||
| 967 | 968 | ||
| 968 | return; | 969 | return; |
| 969 | } | 970 | } |
diff --git a/drivers/net/wireless/ath/carl9170/usb.c b/drivers/net/wireless/ath/carl9170/usb.c index 537732e5964..f82c400be28 100644 --- a/drivers/net/wireless/ath/carl9170/usb.c +++ b/drivers/net/wireless/ath/carl9170/usb.c | |||
| @@ -118,6 +118,8 @@ static struct usb_device_id carl9170_usb_ids[] = { | |||
| 118 | { USB_DEVICE(0x057c, 0x8402) }, | 118 | { USB_DEVICE(0x057c, 0x8402) }, |
| 119 | /* Qwest/Actiontec 802AIN Wireless N USB Network Adapter */ | 119 | /* Qwest/Actiontec 802AIN Wireless N USB Network Adapter */ |
| 120 | { USB_DEVICE(0x1668, 0x1200) }, | 120 | { USB_DEVICE(0x1668, 0x1200) }, |
| 121 | /* Airlive X.USB a/b/g/n */ | ||
| 122 | { USB_DEVICE(0x1b75, 0x9170) }, | ||
| 121 | 123 | ||
| 122 | /* terminate */ | 124 | /* terminate */ |
| 123 | {} | 125 | {} |
diff --git a/drivers/net/wireless/iwlwifi/iwl-5000.c b/drivers/net/wireless/iwlwifi/iwl-5000.c index 79ab0a6b138..537fb8c84e3 100644 --- a/drivers/net/wireless/iwlwifi/iwl-5000.c +++ b/drivers/net/wireless/iwlwifi/iwl-5000.c | |||
| @@ -51,7 +51,7 @@ | |||
| 51 | #include "iwl-agn-debugfs.h" | 51 | #include "iwl-agn-debugfs.h" |
| 52 | 52 | ||
| 53 | /* Highest firmware API version supported */ | 53 | /* Highest firmware API version supported */ |
| 54 | #define IWL5000_UCODE_API_MAX 2 | 54 | #define IWL5000_UCODE_API_MAX 5 |
| 55 | #define IWL5150_UCODE_API_MAX 2 | 55 | #define IWL5150_UCODE_API_MAX 2 |
| 56 | 56 | ||
| 57 | /* Lowest firmware API version supported */ | 57 | /* Lowest firmware API version supported */ |
diff --git a/drivers/net/wireless/p54/p54usb.c b/drivers/net/wireless/p54/p54usb.c index 21713a7638c..9b344a921e7 100644 --- a/drivers/net/wireless/p54/p54usb.c +++ b/drivers/net/wireless/p54/p54usb.c | |||
| @@ -98,6 +98,7 @@ static struct usb_device_id p54u_table[] __devinitdata = { | |||
| 98 | {USB_DEVICE(0x1413, 0x5400)}, /* Telsey 802.11g USB2.0 Adapter */ | 98 | {USB_DEVICE(0x1413, 0x5400)}, /* Telsey 802.11g USB2.0 Adapter */ |
| 99 | {USB_DEVICE(0x1435, 0x0427)}, /* Inventel UR054G */ | 99 | {USB_DEVICE(0x1435, 0x0427)}, /* Inventel UR054G */ |
| 100 | {USB_DEVICE(0x1668, 0x1050)}, /* Actiontec 802UIG-1 */ | 100 | {USB_DEVICE(0x1668, 0x1050)}, /* Actiontec 802UIG-1 */ |
| 101 | {USB_DEVICE(0x1740, 0x1000)}, /* Senao NUB-350 */ | ||
| 101 | {USB_DEVICE(0x2001, 0x3704)}, /* DLink DWL-G122 rev A2 */ | 102 | {USB_DEVICE(0x2001, 0x3704)}, /* DLink DWL-G122 rev A2 */ |
| 102 | {USB_DEVICE(0x2001, 0x3705)}, /* D-Link DWL-G120 rev C1 */ | 103 | {USB_DEVICE(0x2001, 0x3705)}, /* D-Link DWL-G120 rev C1 */ |
| 103 | {USB_DEVICE(0x413c, 0x5513)}, /* Dell WLA3310 USB Wireless Adapter */ | 104 | {USB_DEVICE(0x413c, 0x5513)}, /* Dell WLA3310 USB Wireless Adapter */ |
diff --git a/drivers/net/wireless/rndis_wlan.c b/drivers/net/wireless/rndis_wlan.c index 848cc2cce24..518542b4bf9 100644 --- a/drivers/net/wireless/rndis_wlan.c +++ b/drivers/net/wireless/rndis_wlan.c | |||
| @@ -2597,6 +2597,9 @@ static int rndis_set_power_mgmt(struct wiphy *wiphy, struct net_device *dev, | |||
| 2597 | __le32 mode; | 2597 | __le32 mode; |
| 2598 | int ret; | 2598 | int ret; |
| 2599 | 2599 | ||
| 2600 | if (priv->device_type != RNDIS_BCM4320B) | ||
| 2601 | return -ENOTSUPP; | ||
| 2602 | |||
| 2600 | netdev_dbg(usbdev->net, "%s(): %s, %d\n", __func__, | 2603 | netdev_dbg(usbdev->net, "%s(): %s, %d\n", __func__, |
| 2601 | enabled ? "enabled" : "disabled", | 2604 | enabled ? "enabled" : "disabled", |
| 2602 | timeout); | 2605 | timeout); |
diff --git a/drivers/of/pdt.c b/drivers/of/pdt.c index 28295d0a50f..4d87b5dc928 100644 --- a/drivers/of/pdt.c +++ b/drivers/of/pdt.c | |||
| @@ -36,19 +36,55 @@ unsigned int of_pdt_unique_id __initdata; | |||
| 36 | (p)->unique_id = of_pdt_unique_id++; \ | 36 | (p)->unique_id = of_pdt_unique_id++; \ |
| 37 | } while (0) | 37 | } while (0) |
| 38 | 38 | ||
| 39 | static inline const char *of_pdt_node_name(struct device_node *dp) | 39 | static char * __init of_pdt_build_full_name(struct device_node *dp) |
| 40 | { | 40 | { |
| 41 | return dp->path_component_name; | 41 | int len, ourlen, plen; |
| 42 | char *n; | ||
| 43 | |||
| 44 | dp->path_component_name = build_path_component(dp); | ||
| 45 | |||
| 46 | plen = strlen(dp->parent->full_name); | ||
| 47 | ourlen = strlen(dp->path_component_name); | ||
| 48 | len = ourlen + plen + 2; | ||
| 49 | |||
| 50 | n = prom_early_alloc(len); | ||
| 51 | strcpy(n, dp->parent->full_name); | ||
| 52 | if (!of_node_is_root(dp->parent)) { | ||
| 53 | strcpy(n + plen, "/"); | ||
| 54 | plen++; | ||
| 55 | } | ||
| 56 | strcpy(n + plen, dp->path_component_name); | ||
| 57 | |||
| 58 | return n; | ||
| 42 | } | 59 | } |
| 43 | 60 | ||
| 44 | #else | 61 | #else /* CONFIG_SPARC */ |
| 45 | 62 | ||
| 46 | static inline void of_pdt_incr_unique_id(void *p) { } | 63 | static inline void of_pdt_incr_unique_id(void *p) { } |
| 47 | static inline void irq_trans_init(struct device_node *dp) { } | 64 | static inline void irq_trans_init(struct device_node *dp) { } |
| 48 | 65 | ||
| 49 | static inline const char *of_pdt_node_name(struct device_node *dp) | 66 | static char * __init of_pdt_build_full_name(struct device_node *dp) |
| 50 | { | 67 | { |
| 51 | return dp->name; | 68 | static int failsafe_id = 0; /* for generating unique names on failure */ |
| 69 | char *buf; | ||
| 70 | int len; | ||
| 71 | |||
| 72 | if (of_pdt_prom_ops->pkg2path(dp->phandle, NULL, 0, &len)) | ||
| 73 | goto failsafe; | ||
| 74 | |||
| 75 | buf = prom_early_alloc(len + 1); | ||
| 76 | if (of_pdt_prom_ops->pkg2path(dp->phandle, buf, len, &len)) | ||
| 77 | goto failsafe; | ||
| 78 | return buf; | ||
| 79 | |||
| 80 | failsafe: | ||
| 81 | buf = prom_early_alloc(strlen(dp->parent->full_name) + | ||
| 82 | strlen(dp->name) + 16); | ||
| 83 | sprintf(buf, "%s/%s@unknown%i", | ||
| 84 | of_node_is_root(dp->parent) ? "" : dp->parent->full_name, | ||
| 85 | dp->name, failsafe_id++); | ||
| 86 | pr_err("%s: pkg2path failed; assigning %s\n", __func__, buf); | ||
| 87 | return buf; | ||
| 52 | } | 88 | } |
| 53 | 89 | ||
| 54 | #endif /* !CONFIG_SPARC */ | 90 | #endif /* !CONFIG_SPARC */ |
| @@ -132,47 +168,6 @@ static char * __init of_pdt_get_one_property(phandle node, const char *name) | |||
| 132 | return buf; | 168 | return buf; |
| 133 | } | 169 | } |
| 134 | 170 | ||
| 135 | static char * __init of_pdt_try_pkg2path(phandle node) | ||
| 136 | { | ||
| 137 | char *res, *buf = NULL; | ||
| 138 | int len; | ||
| 139 | |||
| 140 | if (!of_pdt_prom_ops->pkg2path) | ||
| 141 | return NULL; | ||
| 142 | |||
| 143 | if (of_pdt_prom_ops->pkg2path(node, buf, 0, &len)) | ||
| 144 | return NULL; | ||
| 145 | buf = prom_early_alloc(len + 1); | ||
| 146 | if (of_pdt_prom_ops->pkg2path(node, buf, len, &len)) { | ||
| 147 | pr_err("%s: package-to-path failed\n", __func__); | ||
| 148 | return NULL; | ||
| 149 | } | ||
| 150 | |||
| 151 | res = strrchr(buf, '/'); | ||
| 152 | if (!res) { | ||
| 153 | pr_err("%s: couldn't find / in %s\n", __func__, buf); | ||
| 154 | return NULL; | ||
| 155 | } | ||
| 156 | return res+1; | ||
| 157 | } | ||
| 158 | |||
| 159 | /* | ||
| 160 | * When fetching the node's name, first try using package-to-path; if | ||
| 161 | * that fails (either because the arch hasn't supplied a PROM callback, | ||
| 162 | * or some other random failure), fall back to just looking at the node's | ||
| 163 | * 'name' property. | ||
| 164 | */ | ||
| 165 | static char * __init of_pdt_build_name(phandle node) | ||
| 166 | { | ||
| 167 | char *buf; | ||
| 168 | |||
| 169 | buf = of_pdt_try_pkg2path(node); | ||
| 170 | if (!buf) | ||
| 171 | buf = of_pdt_get_one_property(node, "name"); | ||
| 172 | |||
| 173 | return buf; | ||
| 174 | } | ||
| 175 | |||
| 176 | static struct device_node * __init of_pdt_create_node(phandle node, | 171 | static struct device_node * __init of_pdt_create_node(phandle node, |
| 177 | struct device_node *parent) | 172 | struct device_node *parent) |
| 178 | { | 173 | { |
| @@ -187,7 +182,7 @@ static struct device_node * __init of_pdt_create_node(phandle node, | |||
| 187 | 182 | ||
| 188 | kref_init(&dp->kref); | 183 | kref_init(&dp->kref); |
| 189 | 184 | ||
| 190 | dp->name = of_pdt_build_name(node); | 185 | dp->name = of_pdt_get_one_property(node, "name"); |
| 191 | dp->type = of_pdt_get_one_property(node, "device_type"); | 186 | dp->type = of_pdt_get_one_property(node, "device_type"); |
| 192 | dp->phandle = node; | 187 | dp->phandle = node; |
| 193 | 188 | ||
| @@ -198,26 +193,6 @@ static struct device_node * __init of_pdt_create_node(phandle node, | |||
| 198 | return dp; | 193 | return dp; |
| 199 | } | 194 | } |
| 200 | 195 | ||
| 201 | static char * __init of_pdt_build_full_name(struct device_node *dp) | ||
| 202 | { | ||
| 203 | int len, ourlen, plen; | ||
| 204 | char *n; | ||
| 205 | |||
| 206 | plen = strlen(dp->parent->full_name); | ||
| 207 | ourlen = strlen(of_pdt_node_name(dp)); | ||
| 208 | len = ourlen + plen + 2; | ||
| 209 | |||
| 210 | n = prom_early_alloc(len); | ||
| 211 | strcpy(n, dp->parent->full_name); | ||
| 212 | if (!of_node_is_root(dp->parent)) { | ||
| 213 | strcpy(n + plen, "/"); | ||
| 214 | plen++; | ||
| 215 | } | ||
| 216 | strcpy(n + plen, of_pdt_node_name(dp)); | ||
| 217 | |||
| 218 | return n; | ||
| 219 | } | ||
| 220 | |||
| 221 | static struct device_node * __init of_pdt_build_tree(struct device_node *parent, | 196 | static struct device_node * __init of_pdt_build_tree(struct device_node *parent, |
| 222 | phandle node, | 197 | phandle node, |
| 223 | struct device_node ***nextp) | 198 | struct device_node ***nextp) |
| @@ -240,9 +215,6 @@ static struct device_node * __init of_pdt_build_tree(struct device_node *parent, | |||
| 240 | *(*nextp) = dp; | 215 | *(*nextp) = dp; |
| 241 | *nextp = &dp->allnext; | 216 | *nextp = &dp->allnext; |
| 242 | 217 | ||
| 243 | #if defined(CONFIG_SPARC) | ||
| 244 | dp->path_component_name = build_path_component(dp); | ||
| 245 | #endif | ||
| 246 | dp->full_name = of_pdt_build_full_name(dp); | 218 | dp->full_name = of_pdt_build_full_name(dp); |
| 247 | 219 | ||
| 248 | dp->child = of_pdt_build_tree(dp, | 220 | dp->child = of_pdt_build_tree(dp, |
diff --git a/drivers/pcmcia/pxa2xx_colibri.c b/drivers/pcmcia/pxa2xx_colibri.c index c3f72192af6..a52039564e7 100644 --- a/drivers/pcmcia/pxa2xx_colibri.c +++ b/drivers/pcmcia/pxa2xx_colibri.c | |||
| @@ -181,6 +181,9 @@ static int __init colibri_pcmcia_init(void) | |||
| 181 | { | 181 | { |
| 182 | int ret; | 182 | int ret; |
| 183 | 183 | ||
| 184 | if (!machine_is_colibri() && !machine_is_colibri320()) | ||
| 185 | return -ENODEV; | ||
| 186 | |||
| 184 | colibri_pcmcia_device = platform_device_alloc("pxa2xx-pcmcia", -1); | 187 | colibri_pcmcia_device = platform_device_alloc("pxa2xx-pcmcia", -1); |
| 185 | if (!colibri_pcmcia_device) | 188 | if (!colibri_pcmcia_device) |
| 186 | return -ENOMEM; | 189 | return -ENOMEM; |
diff --git a/drivers/pps/generators/Kconfig b/drivers/pps/generators/Kconfig index f3a73dd7766..e4c4f3dc072 100644 --- a/drivers/pps/generators/Kconfig +++ b/drivers/pps/generators/Kconfig | |||
| @@ -6,7 +6,7 @@ comment "PPS generators support" | |||
| 6 | 6 | ||
| 7 | config PPS_GENERATOR_PARPORT | 7 | config PPS_GENERATOR_PARPORT |
| 8 | tristate "Parallel port PPS signal generator" | 8 | tristate "Parallel port PPS signal generator" |
| 9 | depends on PARPORT | 9 | depends on PARPORT && BROKEN |
| 10 | help | 10 | help |
| 11 | If you say yes here you get support for a PPS signal generator which | 11 | If you say yes here you get support for a PPS signal generator which |
| 12 | utilizes STROBE pin of a parallel port to send PPS signals. It uses | 12 | utilizes STROBE pin of a parallel port to send PPS signals. It uses |
diff --git a/drivers/rtc/rtc-s3c.c b/drivers/rtc/rtc-s3c.c index cf953ecbfca..b80fa288240 100644 --- a/drivers/rtc/rtc-s3c.c +++ b/drivers/rtc/rtc-s3c.c | |||
| @@ -77,18 +77,20 @@ static irqreturn_t s3c_rtc_tickirq(int irq, void *id) | |||
| 77 | } | 77 | } |
| 78 | 78 | ||
| 79 | /* Update control registers */ | 79 | /* Update control registers */ |
| 80 | static void s3c_rtc_setaie(int to) | 80 | static int s3c_rtc_setaie(struct device *dev, unsigned int enabled) |
| 81 | { | 81 | { |
| 82 | unsigned int tmp; | 82 | unsigned int tmp; |
| 83 | 83 | ||
| 84 | pr_debug("%s: aie=%d\n", __func__, to); | 84 | pr_debug("%s: aie=%d\n", __func__, enabled); |
| 85 | 85 | ||
| 86 | tmp = readb(s3c_rtc_base + S3C2410_RTCALM) & ~S3C2410_RTCALM_ALMEN; | 86 | tmp = readb(s3c_rtc_base + S3C2410_RTCALM) & ~S3C2410_RTCALM_ALMEN; |
| 87 | 87 | ||
| 88 | if (to) | 88 | if (enabled) |
| 89 | tmp |= S3C2410_RTCALM_ALMEN; | 89 | tmp |= S3C2410_RTCALM_ALMEN; |
| 90 | 90 | ||
| 91 | writeb(tmp, s3c_rtc_base + S3C2410_RTCALM); | 91 | writeb(tmp, s3c_rtc_base + S3C2410_RTCALM); |
| 92 | |||
| 93 | return 0; | ||
| 92 | } | 94 | } |
| 93 | 95 | ||
| 94 | static int s3c_rtc_setpie(struct device *dev, int enabled) | 96 | static int s3c_rtc_setpie(struct device *dev, int enabled) |
| @@ -308,7 +310,7 @@ static int s3c_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm) | |||
| 308 | 310 | ||
| 309 | writeb(alrm_en, base + S3C2410_RTCALM); | 311 | writeb(alrm_en, base + S3C2410_RTCALM); |
| 310 | 312 | ||
| 311 | s3c_rtc_setaie(alrm->enabled); | 313 | s3c_rtc_setaie(dev, alrm->enabled); |
| 312 | 314 | ||
| 313 | return 0; | 315 | return 0; |
| 314 | } | 316 | } |
| @@ -440,7 +442,7 @@ static int __devexit s3c_rtc_remove(struct platform_device *dev) | |||
| 440 | rtc_device_unregister(rtc); | 442 | rtc_device_unregister(rtc); |
| 441 | 443 | ||
| 442 | s3c_rtc_setpie(&dev->dev, 0); | 444 | s3c_rtc_setpie(&dev->dev, 0); |
| 443 | s3c_rtc_setaie(0); | 445 | s3c_rtc_setaie(&dev->dev, 0); |
| 444 | 446 | ||
| 445 | clk_disable(rtc_clk); | 447 | clk_disable(rtc_clk); |
| 446 | clk_put(rtc_clk); | 448 | clk_put(rtc_clk); |
diff --git a/drivers/s390/block/xpram.c b/drivers/s390/block/xpram.c index c881a14fa5d..1f6a4d894e7 100644 --- a/drivers/s390/block/xpram.c +++ b/drivers/s390/block/xpram.c | |||
| @@ -62,8 +62,8 @@ static int xpram_devs; | |||
| 62 | /* | 62 | /* |
| 63 | * Parameter parsing functions. | 63 | * Parameter parsing functions. |
| 64 | */ | 64 | */ |
| 65 | static int __initdata devs = XPRAM_DEVS; | 65 | static int devs = XPRAM_DEVS; |
| 66 | static char __initdata *sizes[XPRAM_MAX_DEVS]; | 66 | static char *sizes[XPRAM_MAX_DEVS]; |
| 67 | 67 | ||
| 68 | module_param(devs, int, 0); | 68 | module_param(devs, int, 0); |
| 69 | module_param_array(sizes, charp, NULL, 0); | 69 | module_param_array(sizes, charp, NULL, 0); |
diff --git a/drivers/s390/char/keyboard.c b/drivers/s390/char/keyboard.c index 8cd58e412b5..5ad44daef73 100644 --- a/drivers/s390/char/keyboard.c +++ b/drivers/s390/char/keyboard.c | |||
| @@ -460,7 +460,8 @@ kbd_ioctl(struct kbd_data *kbd, struct file *file, | |||
| 460 | unsigned int cmd, unsigned long arg) | 460 | unsigned int cmd, unsigned long arg) |
| 461 | { | 461 | { |
| 462 | void __user *argp; | 462 | void __user *argp; |
| 463 | int ct, perm; | 463 | unsigned int ct; |
| 464 | int perm; | ||
| 464 | 465 | ||
| 465 | argp = (void __user *)arg; | 466 | argp = (void __user *)arg; |
| 466 | 467 | ||
diff --git a/drivers/s390/char/tape.h b/drivers/s390/char/tape.h index 7a242f07363..267b54e8ff5 100644 --- a/drivers/s390/char/tape.h +++ b/drivers/s390/char/tape.h | |||
| @@ -280,6 +280,14 @@ tape_do_io_free(struct tape_device *device, struct tape_request *request) | |||
| 280 | return rc; | 280 | return rc; |
| 281 | } | 281 | } |
| 282 | 282 | ||
| 283 | static inline void | ||
| 284 | tape_do_io_async_free(struct tape_device *device, struct tape_request *request) | ||
| 285 | { | ||
| 286 | request->callback = (void *) tape_free_request; | ||
| 287 | request->callback_data = NULL; | ||
| 288 | tape_do_io_async(device, request); | ||
| 289 | } | ||
| 290 | |||
| 283 | extern int tape_oper_handler(int irq, int status); | 291 | extern int tape_oper_handler(int irq, int status); |
| 284 | extern void tape_noper_handler(int irq, int status); | 292 | extern void tape_noper_handler(int irq, int status); |
| 285 | extern int tape_open(struct tape_device *); | 293 | extern int tape_open(struct tape_device *); |
diff --git a/drivers/s390/char/tape_34xx.c b/drivers/s390/char/tape_34xx.c index c17f35b6136..c26511171ff 100644 --- a/drivers/s390/char/tape_34xx.c +++ b/drivers/s390/char/tape_34xx.c | |||
| @@ -53,23 +53,11 @@ static void tape_34xx_delete_sbid_from(struct tape_device *, int); | |||
| 53 | * Medium sense for 34xx tapes. There is no 'real' medium sense call. | 53 | * Medium sense for 34xx tapes. There is no 'real' medium sense call. |
| 54 | * So we just do a normal sense. | 54 | * So we just do a normal sense. |
| 55 | */ | 55 | */ |
| 56 | static int | 56 | static void __tape_34xx_medium_sense(struct tape_request *request) |
| 57 | tape_34xx_medium_sense(struct tape_device *device) | ||
| 58 | { | 57 | { |
| 59 | struct tape_request *request; | 58 | struct tape_device *device = request->device; |
| 60 | unsigned char *sense; | 59 | unsigned char *sense; |
| 61 | int rc; | ||
| 62 | |||
| 63 | request = tape_alloc_request(1, 32); | ||
| 64 | if (IS_ERR(request)) { | ||
| 65 | DBF_EXCEPTION(6, "MSEN fail\n"); | ||
| 66 | return PTR_ERR(request); | ||
| 67 | } | ||
| 68 | |||
| 69 | request->op = TO_MSEN; | ||
| 70 | tape_ccw_end(request->cpaddr, SENSE, 32, request->cpdata); | ||
| 71 | 60 | ||
| 72 | rc = tape_do_io_interruptible(device, request); | ||
| 73 | if (request->rc == 0) { | 61 | if (request->rc == 0) { |
| 74 | sense = request->cpdata; | 62 | sense = request->cpdata; |
| 75 | 63 | ||
| @@ -88,15 +76,47 @@ tape_34xx_medium_sense(struct tape_device *device) | |||
| 88 | device->tape_generic_status |= GMT_WR_PROT(~0); | 76 | device->tape_generic_status |= GMT_WR_PROT(~0); |
| 89 | else | 77 | else |
| 90 | device->tape_generic_status &= ~GMT_WR_PROT(~0); | 78 | device->tape_generic_status &= ~GMT_WR_PROT(~0); |
| 91 | } else { | 79 | } else |
| 92 | DBF_EVENT(4, "tape_34xx: medium sense failed with rc=%d\n", | 80 | DBF_EVENT(4, "tape_34xx: medium sense failed with rc=%d\n", |
| 93 | request->rc); | 81 | request->rc); |
| 94 | } | ||
| 95 | tape_free_request(request); | 82 | tape_free_request(request); |
| 83 | } | ||
| 84 | |||
| 85 | static int tape_34xx_medium_sense(struct tape_device *device) | ||
| 86 | { | ||
| 87 | struct tape_request *request; | ||
| 88 | int rc; | ||
| 89 | |||
| 90 | request = tape_alloc_request(1, 32); | ||
| 91 | if (IS_ERR(request)) { | ||
| 92 | DBF_EXCEPTION(6, "MSEN fail\n"); | ||
| 93 | return PTR_ERR(request); | ||
| 94 | } | ||
| 96 | 95 | ||
| 96 | request->op = TO_MSEN; | ||
| 97 | tape_ccw_end(request->cpaddr, SENSE, 32, request->cpdata); | ||
| 98 | rc = tape_do_io_interruptible(device, request); | ||
| 99 | __tape_34xx_medium_sense(request); | ||
| 97 | return rc; | 100 | return rc; |
| 98 | } | 101 | } |
| 99 | 102 | ||
| 103 | static void tape_34xx_medium_sense_async(struct tape_device *device) | ||
| 104 | { | ||
| 105 | struct tape_request *request; | ||
| 106 | |||
| 107 | request = tape_alloc_request(1, 32); | ||
| 108 | if (IS_ERR(request)) { | ||
| 109 | DBF_EXCEPTION(6, "MSEN fail\n"); | ||
| 110 | return; | ||
| 111 | } | ||
| 112 | |||
| 113 | request->op = TO_MSEN; | ||
| 114 | tape_ccw_end(request->cpaddr, SENSE, 32, request->cpdata); | ||
| 115 | request->callback = (void *) __tape_34xx_medium_sense; | ||
| 116 | request->callback_data = NULL; | ||
| 117 | tape_do_io_async(device, request); | ||
| 118 | } | ||
| 119 | |||
| 100 | struct tape_34xx_work { | 120 | struct tape_34xx_work { |
| 101 | struct tape_device *device; | 121 | struct tape_device *device; |
| 102 | enum tape_op op; | 122 | enum tape_op op; |
| @@ -109,6 +129,9 @@ struct tape_34xx_work { | |||
| 109 | * is inserted but cannot call tape_do_io* from an interrupt context. | 129 | * is inserted but cannot call tape_do_io* from an interrupt context. |
| 110 | * Maybe that's useful for other actions we want to start from the | 130 | * Maybe that's useful for other actions we want to start from the |
| 111 | * interrupt handler. | 131 | * interrupt handler. |
| 132 | * Note: the work handler is called by the system work queue. The tape | ||
| 133 | * commands started by the handler need to be asynchrounous, otherwise | ||
| 134 | * a deadlock can occur e.g. in case of a deferred cc=1 (see __tape_do_irq). | ||
| 112 | */ | 135 | */ |
| 113 | static void | 136 | static void |
| 114 | tape_34xx_work_handler(struct work_struct *work) | 137 | tape_34xx_work_handler(struct work_struct *work) |
| @@ -119,7 +142,7 @@ tape_34xx_work_handler(struct work_struct *work) | |||
| 119 | 142 | ||
| 120 | switch(p->op) { | 143 | switch(p->op) { |
| 121 | case TO_MSEN: | 144 | case TO_MSEN: |
| 122 | tape_34xx_medium_sense(device); | 145 | tape_34xx_medium_sense_async(device); |
| 123 | break; | 146 | break; |
| 124 | default: | 147 | default: |
| 125 | DBF_EVENT(3, "T34XX: internal error: unknown work\n"); | 148 | DBF_EVENT(3, "T34XX: internal error: unknown work\n"); |
diff --git a/drivers/s390/char/tape_3590.c b/drivers/s390/char/tape_3590.c index fbe361fcd2c..de2e99e0a71 100644 --- a/drivers/s390/char/tape_3590.c +++ b/drivers/s390/char/tape_3590.c | |||
| @@ -329,17 +329,17 @@ out: | |||
| 329 | /* | 329 | /* |
| 330 | * Enable encryption | 330 | * Enable encryption |
| 331 | */ | 331 | */ |
| 332 | static int tape_3592_enable_crypt(struct tape_device *device) | 332 | static struct tape_request *__tape_3592_enable_crypt(struct tape_device *device) |
| 333 | { | 333 | { |
| 334 | struct tape_request *request; | 334 | struct tape_request *request; |
| 335 | char *data; | 335 | char *data; |
| 336 | 336 | ||
| 337 | DBF_EVENT(6, "tape_3592_enable_crypt\n"); | 337 | DBF_EVENT(6, "tape_3592_enable_crypt\n"); |
| 338 | if (!crypt_supported(device)) | 338 | if (!crypt_supported(device)) |
| 339 | return -ENOSYS; | 339 | return ERR_PTR(-ENOSYS); |
| 340 | request = tape_alloc_request(2, 72); | 340 | request = tape_alloc_request(2, 72); |
| 341 | if (IS_ERR(request)) | 341 | if (IS_ERR(request)) |
| 342 | return PTR_ERR(request); | 342 | return request; |
| 343 | data = request->cpdata; | 343 | data = request->cpdata; |
| 344 | memset(data,0,72); | 344 | memset(data,0,72); |
| 345 | 345 | ||
| @@ -354,23 +354,42 @@ static int tape_3592_enable_crypt(struct tape_device *device) | |||
| 354 | request->op = TO_CRYPT_ON; | 354 | request->op = TO_CRYPT_ON; |
| 355 | tape_ccw_cc(request->cpaddr, MODE_SET_CB, 36, data); | 355 | tape_ccw_cc(request->cpaddr, MODE_SET_CB, 36, data); |
| 356 | tape_ccw_end(request->cpaddr + 1, MODE_SET_CB, 36, data + 36); | 356 | tape_ccw_end(request->cpaddr + 1, MODE_SET_CB, 36, data + 36); |
| 357 | return request; | ||
| 358 | } | ||
| 359 | |||
| 360 | static int tape_3592_enable_crypt(struct tape_device *device) | ||
| 361 | { | ||
| 362 | struct tape_request *request; | ||
| 363 | |||
| 364 | request = __tape_3592_enable_crypt(device); | ||
| 365 | if (IS_ERR(request)) | ||
| 366 | return PTR_ERR(request); | ||
| 357 | return tape_do_io_free(device, request); | 367 | return tape_do_io_free(device, request); |
| 358 | } | 368 | } |
| 359 | 369 | ||
| 370 | static void tape_3592_enable_crypt_async(struct tape_device *device) | ||
| 371 | { | ||
| 372 | struct tape_request *request; | ||
| 373 | |||
| 374 | request = __tape_3592_enable_crypt(device); | ||
| 375 | if (!IS_ERR(request)) | ||
| 376 | tape_do_io_async_free(device, request); | ||
| 377 | } | ||
| 378 | |||
| 360 | /* | 379 | /* |
| 361 | * Disable encryption | 380 | * Disable encryption |
| 362 | */ | 381 | */ |
| 363 | static int tape_3592_disable_crypt(struct tape_device *device) | 382 | static struct tape_request *__tape_3592_disable_crypt(struct tape_device *device) |
| 364 | { | 383 | { |
| 365 | struct tape_request *request; | 384 | struct tape_request *request; |
| 366 | char *data; | 385 | char *data; |
| 367 | 386 | ||
| 368 | DBF_EVENT(6, "tape_3592_disable_crypt\n"); | 387 | DBF_EVENT(6, "tape_3592_disable_crypt\n"); |
| 369 | if (!crypt_supported(device)) | 388 | if (!crypt_supported(device)) |
| 370 | return -ENOSYS; | 389 | return ERR_PTR(-ENOSYS); |
| 371 | request = tape_alloc_request(2, 72); | 390 | request = tape_alloc_request(2, 72); |
| 372 | if (IS_ERR(request)) | 391 | if (IS_ERR(request)) |
| 373 | return PTR_ERR(request); | 392 | return request; |
| 374 | data = request->cpdata; | 393 | data = request->cpdata; |
| 375 | memset(data,0,72); | 394 | memset(data,0,72); |
| 376 | 395 | ||
| @@ -383,9 +402,28 @@ static int tape_3592_disable_crypt(struct tape_device *device) | |||
| 383 | tape_ccw_cc(request->cpaddr, MODE_SET_CB, 36, data); | 402 | tape_ccw_cc(request->cpaddr, MODE_SET_CB, 36, data); |
| 384 | tape_ccw_end(request->cpaddr + 1, MODE_SET_CB, 36, data + 36); | 403 | tape_ccw_end(request->cpaddr + 1, MODE_SET_CB, 36, data + 36); |
| 385 | 404 | ||
| 405 | return request; | ||
| 406 | } | ||
| 407 | |||
| 408 | static int tape_3592_disable_crypt(struct tape_device *device) | ||
| 409 | { | ||
| 410 | struct tape_request *request; | ||
| 411 | |||
| 412 | request = __tape_3592_disable_crypt(device); | ||
| 413 | if (IS_ERR(request)) | ||
| 414 | return PTR_ERR(request); | ||
| 386 | return tape_do_io_free(device, request); | 415 | return tape_do_io_free(device, request); |
| 387 | } | 416 | } |
| 388 | 417 | ||
| 418 | static void tape_3592_disable_crypt_async(struct tape_device *device) | ||
| 419 | { | ||
| 420 | struct tape_request *request; | ||
| 421 | |||
| 422 | request = __tape_3592_disable_crypt(device); | ||
| 423 | if (!IS_ERR(request)) | ||
| 424 | tape_do_io_async_free(device, request); | ||
| 425 | } | ||
| 426 | |||
| 389 | /* | 427 | /* |
| 390 | * IOCTL: Set encryption status | 428 | * IOCTL: Set encryption status |
| 391 | */ | 429 | */ |
| @@ -457,8 +495,7 @@ tape_3590_ioctl(struct tape_device *device, unsigned int cmd, unsigned long arg) | |||
| 457 | /* | 495 | /* |
| 458 | * SENSE Medium: Get Sense data about medium state | 496 | * SENSE Medium: Get Sense data about medium state |
| 459 | */ | 497 | */ |
| 460 | static int | 498 | static int tape_3590_sense_medium(struct tape_device *device) |
| 461 | tape_3590_sense_medium(struct tape_device *device) | ||
| 462 | { | 499 | { |
| 463 | struct tape_request *request; | 500 | struct tape_request *request; |
| 464 | 501 | ||
| @@ -470,6 +507,18 @@ tape_3590_sense_medium(struct tape_device *device) | |||
| 470 | return tape_do_io_free(device, request); | 507 | return tape_do_io_free(device, request); |
| 471 | } | 508 | } |
| 472 | 509 | ||
| 510 | static void tape_3590_sense_medium_async(struct tape_device *device) | ||
| 511 | { | ||
| 512 | struct tape_request *request; | ||
| 513 | |||
| 514 | request = tape_alloc_request(1, 128); | ||
| 515 | if (IS_ERR(request)) | ||
| 516 | return; | ||
| 517 | request->op = TO_MSEN; | ||
| 518 | tape_ccw_end(request->cpaddr, MEDIUM_SENSE, 128, request->cpdata); | ||
| 519 | tape_do_io_async_free(device, request); | ||
| 520 | } | ||
| 521 | |||
| 473 | /* | 522 | /* |
| 474 | * MTTELL: Tell block. Return the number of block relative to current file. | 523 | * MTTELL: Tell block. Return the number of block relative to current file. |
| 475 | */ | 524 | */ |
| @@ -546,15 +595,14 @@ tape_3590_read_opposite(struct tape_device *device, | |||
| 546 | * 2. The attention msg is written to the "read subsystem data" buffer. | 595 | * 2. The attention msg is written to the "read subsystem data" buffer. |
| 547 | * In this case we probably should print it to the console. | 596 | * In this case we probably should print it to the console. |
| 548 | */ | 597 | */ |
| 549 | static int | 598 | static void tape_3590_read_attmsg_async(struct tape_device *device) |
| 550 | tape_3590_read_attmsg(struct tape_device *device) | ||
| 551 | { | 599 | { |
| 552 | struct tape_request *request; | 600 | struct tape_request *request; |
| 553 | char *buf; | 601 | char *buf; |
| 554 | 602 | ||
| 555 | request = tape_alloc_request(3, 4096); | 603 | request = tape_alloc_request(3, 4096); |
| 556 | if (IS_ERR(request)) | 604 | if (IS_ERR(request)) |
| 557 | return PTR_ERR(request); | 605 | return; |
| 558 | request->op = TO_READ_ATTMSG; | 606 | request->op = TO_READ_ATTMSG; |
| 559 | buf = request->cpdata; | 607 | buf = request->cpdata; |
| 560 | buf[0] = PREP_RD_SS_DATA; | 608 | buf[0] = PREP_RD_SS_DATA; |
| @@ -562,12 +610,15 @@ tape_3590_read_attmsg(struct tape_device *device) | |||
| 562 | tape_ccw_cc(request->cpaddr, PERFORM_SS_FUNC, 12, buf); | 610 | tape_ccw_cc(request->cpaddr, PERFORM_SS_FUNC, 12, buf); |
| 563 | tape_ccw_cc(request->cpaddr + 1, READ_SS_DATA, 4096 - 12, buf + 12); | 611 | tape_ccw_cc(request->cpaddr + 1, READ_SS_DATA, 4096 - 12, buf + 12); |
| 564 | tape_ccw_end(request->cpaddr + 2, NOP, 0, NULL); | 612 | tape_ccw_end(request->cpaddr + 2, NOP, 0, NULL); |
| 565 | return tape_do_io_free(device, request); | 613 | tape_do_io_async_free(device, request); |
| 566 | } | 614 | } |
| 567 | 615 | ||
| 568 | /* | 616 | /* |
| 569 | * These functions are used to schedule follow-up actions from within an | 617 | * These functions are used to schedule follow-up actions from within an |
| 570 | * interrupt context (like unsolicited interrupts). | 618 | * interrupt context (like unsolicited interrupts). |
| 619 | * Note: the work handler is called by the system work queue. The tape | ||
| 620 | * commands started by the handler need to be asynchrounous, otherwise | ||
| 621 | * a deadlock can occur e.g. in case of a deferred cc=1 (see __tape_do_irq). | ||
| 571 | */ | 622 | */ |
| 572 | struct work_handler_data { | 623 | struct work_handler_data { |
| 573 | struct tape_device *device; | 624 | struct tape_device *device; |
| @@ -583,16 +634,16 @@ tape_3590_work_handler(struct work_struct *work) | |||
| 583 | 634 | ||
| 584 | switch (p->op) { | 635 | switch (p->op) { |
| 585 | case TO_MSEN: | 636 | case TO_MSEN: |
| 586 | tape_3590_sense_medium(p->device); | 637 | tape_3590_sense_medium_async(p->device); |
| 587 | break; | 638 | break; |
| 588 | case TO_READ_ATTMSG: | 639 | case TO_READ_ATTMSG: |
| 589 | tape_3590_read_attmsg(p->device); | 640 | tape_3590_read_attmsg_async(p->device); |
| 590 | break; | 641 | break; |
| 591 | case TO_CRYPT_ON: | 642 | case TO_CRYPT_ON: |
| 592 | tape_3592_enable_crypt(p->device); | 643 | tape_3592_enable_crypt_async(p->device); |
| 593 | break; | 644 | break; |
| 594 | case TO_CRYPT_OFF: | 645 | case TO_CRYPT_OFF: |
| 595 | tape_3592_disable_crypt(p->device); | 646 | tape_3592_disable_crypt_async(p->device); |
| 596 | break; | 647 | break; |
| 597 | default: | 648 | default: |
| 598 | DBF_EVENT(3, "T3590: work handler undefined for " | 649 | DBF_EVENT(3, "T3590: work handler undefined for " |
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index 9045c52abd2..fb2bb35c62c 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c | |||
| @@ -443,7 +443,7 @@ static void scsi_run_queue(struct request_queue *q) | |||
| 443 | &sdev->request_queue->queue_flags); | 443 | &sdev->request_queue->queue_flags); |
| 444 | if (flagset) | 444 | if (flagset) |
| 445 | queue_flag_set(QUEUE_FLAG_REENTER, sdev->request_queue); | 445 | queue_flag_set(QUEUE_FLAG_REENTER, sdev->request_queue); |
| 446 | __blk_run_queue(sdev->request_queue); | 446 | __blk_run_queue(sdev->request_queue, false); |
| 447 | if (flagset) | 447 | if (flagset) |
| 448 | queue_flag_clear(QUEUE_FLAG_REENTER, sdev->request_queue); | 448 | queue_flag_clear(QUEUE_FLAG_REENTER, sdev->request_queue); |
| 449 | spin_unlock(sdev->request_queue->queue_lock); | 449 | spin_unlock(sdev->request_queue->queue_lock); |
diff --git a/drivers/scsi/scsi_transport_fc.c b/drivers/scsi/scsi_transport_fc.c index 998c01be323..5c3ccfc6b62 100644 --- a/drivers/scsi/scsi_transport_fc.c +++ b/drivers/scsi/scsi_transport_fc.c | |||
| @@ -3829,7 +3829,7 @@ fc_bsg_goose_queue(struct fc_rport *rport) | |||
| 3829 | !test_bit(QUEUE_FLAG_REENTER, &rport->rqst_q->queue_flags); | 3829 | !test_bit(QUEUE_FLAG_REENTER, &rport->rqst_q->queue_flags); |
| 3830 | if (flagset) | 3830 | if (flagset) |
| 3831 | queue_flag_set(QUEUE_FLAG_REENTER, rport->rqst_q); | 3831 | queue_flag_set(QUEUE_FLAG_REENTER, rport->rqst_q); |
| 3832 | __blk_run_queue(rport->rqst_q); | 3832 | __blk_run_queue(rport->rqst_q, false); |
| 3833 | if (flagset) | 3833 | if (flagset) |
| 3834 | queue_flag_clear(QUEUE_FLAG_REENTER, rport->rqst_q); | 3834 | queue_flag_clear(QUEUE_FLAG_REENTER, rport->rqst_q); |
| 3835 | spin_unlock_irqrestore(rport->rqst_q->queue_lock, flags); | 3835 | spin_unlock_irqrestore(rport->rqst_q->queue_lock, flags); |
diff --git a/drivers/tty/serial/serial_cs.c b/drivers/tty/serial/serial_cs.c index 93760b2ea17..1ef4df9bf7e 100644 --- a/drivers/tty/serial/serial_cs.c +++ b/drivers/tty/serial/serial_cs.c | |||
| @@ -712,6 +712,7 @@ static struct pcmcia_device_id serial_ids[] = { | |||
| 712 | PCMCIA_PFC_DEVICE_PROD_ID12(1, "Xircom", "CreditCard Ethernet+Modem II", 0x2e3ee845, 0xeca401bf), | 712 | PCMCIA_PFC_DEVICE_PROD_ID12(1, "Xircom", "CreditCard Ethernet+Modem II", 0x2e3ee845, 0xeca401bf), |
| 713 | PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0032, 0x0e01), | 713 | PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0032, 0x0e01), |
| 714 | PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0032, 0x0a05), | 714 | PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0032, 0x0a05), |
| 715 | PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0032, 0x0b05), | ||
| 715 | PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0032, 0x1101), | 716 | PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0032, 0x1101), |
| 716 | PCMCIA_MFC_DEVICE_MANF_CARD(0, 0x0104, 0x0070), | 717 | PCMCIA_MFC_DEVICE_MANF_CARD(0, 0x0104, 0x0070), |
| 717 | PCMCIA_MFC_DEVICE_MANF_CARD(1, 0x0101, 0x0562), | 718 | PCMCIA_MFC_DEVICE_MANF_CARD(1, 0x0101, 0x0562), |
diff --git a/drivers/usb/gadget/f_phonet.c b/drivers/usb/gadget/f_phonet.c index 3c6e1a05874..5e1495097ec 100644 --- a/drivers/usb/gadget/f_phonet.c +++ b/drivers/usb/gadget/f_phonet.c | |||
| @@ -346,14 +346,19 @@ static void pn_rx_complete(struct usb_ep *ep, struct usb_request *req) | |||
| 346 | 346 | ||
| 347 | if (unlikely(!skb)) | 347 | if (unlikely(!skb)) |
| 348 | break; | 348 | break; |
| 349 | skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags, page, 0, | ||
| 350 | req->actual); | ||
| 351 | page = NULL; | ||
| 352 | 349 | ||
| 353 | if (req->actual < req->length) { /* Last fragment */ | 350 | if (skb->len == 0) { /* First fragment */ |
| 354 | skb->protocol = htons(ETH_P_PHONET); | 351 | skb->protocol = htons(ETH_P_PHONET); |
| 355 | skb_reset_mac_header(skb); | 352 | skb_reset_mac_header(skb); |
| 356 | pskb_pull(skb, 1); | 353 | /* Can't use pskb_pull() on page in IRQ */ |
| 354 | memcpy(skb_put(skb, 1), page_address(page), 1); | ||
| 355 | } | ||
| 356 | |||
| 357 | skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags, page, | ||
| 358 | skb->len == 0, req->actual); | ||
| 359 | page = NULL; | ||
| 360 | |||
| 361 | if (req->actual < req->length) { /* Last fragment */ | ||
| 357 | skb->dev = dev; | 362 | skb->dev = dev; |
| 358 | dev->stats.rx_packets++; | 363 | dev->stats.rx_packets++; |
| 359 | dev->stats.rx_bytes += skb->len; | 364 | dev->stats.rx_bytes += skb->len; |
diff --git a/drivers/usb/host/ehci-xilinx-of.c b/drivers/usb/host/ehci-xilinx-of.c index e8f4f36fdf0..a6f21b891f6 100644 --- a/drivers/usb/host/ehci-xilinx-of.c +++ b/drivers/usb/host/ehci-xilinx-of.c | |||
| @@ -29,6 +29,7 @@ | |||
| 29 | 29 | ||
| 30 | #include <linux/of.h> | 30 | #include <linux/of.h> |
| 31 | #include <linux/of_platform.h> | 31 | #include <linux/of_platform.h> |
| 32 | #include <linux/of_address.h> | ||
| 32 | 33 | ||
| 33 | /** | 34 | /** |
| 34 | * ehci_xilinx_of_setup - Initialize the device for ehci_reset() | 35 | * ehci_xilinx_of_setup - Initialize the device for ehci_reset() |
diff --git a/drivers/video/backlight/ltv350qv.c b/drivers/video/backlight/ltv350qv.c index 8010aaeb5ad..dd0e84a9bd2 100644 --- a/drivers/video/backlight/ltv350qv.c +++ b/drivers/video/backlight/ltv350qv.c | |||
| @@ -239,11 +239,15 @@ static int __devinit ltv350qv_probe(struct spi_device *spi) | |||
| 239 | lcd->spi = spi; | 239 | lcd->spi = spi; |
| 240 | lcd->power = FB_BLANK_POWERDOWN; | 240 | lcd->power = FB_BLANK_POWERDOWN; |
| 241 | lcd->buffer = kzalloc(8, GFP_KERNEL); | 241 | lcd->buffer = kzalloc(8, GFP_KERNEL); |
| 242 | if (!lcd->buffer) { | ||
| 243 | ret = -ENOMEM; | ||
| 244 | goto out_free_lcd; | ||
| 245 | } | ||
| 242 | 246 | ||
| 243 | ld = lcd_device_register("ltv350qv", &spi->dev, lcd, <v_ops); | 247 | ld = lcd_device_register("ltv350qv", &spi->dev, lcd, <v_ops); |
| 244 | if (IS_ERR(ld)) { | 248 | if (IS_ERR(ld)) { |
| 245 | ret = PTR_ERR(ld); | 249 | ret = PTR_ERR(ld); |
| 246 | goto out_free_lcd; | 250 | goto out_free_buffer; |
| 247 | } | 251 | } |
| 248 | lcd->ld = ld; | 252 | lcd->ld = ld; |
| 249 | 253 | ||
| @@ -257,6 +261,8 @@ static int __devinit ltv350qv_probe(struct spi_device *spi) | |||
| 257 | 261 | ||
| 258 | out_unregister: | 262 | out_unregister: |
| 259 | lcd_device_unregister(ld); | 263 | lcd_device_unregister(ld); |
| 264 | out_free_buffer: | ||
| 265 | kfree(lcd->buffer); | ||
| 260 | out_free_lcd: | 266 | out_free_lcd: |
| 261 | kfree(lcd); | 267 | kfree(lcd); |
| 262 | return ret; | 268 | return ret; |
| @@ -268,6 +274,7 @@ static int __devexit ltv350qv_remove(struct spi_device *spi) | |||
| 268 | 274 | ||
| 269 | ltv350qv_power(lcd, FB_BLANK_POWERDOWN); | 275 | ltv350qv_power(lcd, FB_BLANK_POWERDOWN); |
| 270 | lcd_device_unregister(lcd->ld); | 276 | lcd_device_unregister(lcd->ld); |
| 277 | kfree(lcd->buffer); | ||
| 271 | kfree(lcd); | 278 | kfree(lcd); |
| 272 | 279 | ||
| 273 | return 0; | 280 | return 0; |
diff --git a/drivers/watchdog/omap_wdt.c b/drivers/watchdog/omap_wdt.c index 3dd4971160e..2b4acb86c19 100644 --- a/drivers/watchdog/omap_wdt.c +++ b/drivers/watchdog/omap_wdt.c | |||
| @@ -124,6 +124,8 @@ static void omap_wdt_set_timeout(struct omap_wdt_dev *wdev) | |||
| 124 | u32 pre_margin = GET_WLDR_VAL(timer_margin); | 124 | u32 pre_margin = GET_WLDR_VAL(timer_margin); |
| 125 | void __iomem *base = wdev->base; | 125 | void __iomem *base = wdev->base; |
| 126 | 126 | ||
| 127 | pm_runtime_get_sync(wdev->dev); | ||
| 128 | |||
| 127 | /* just count up at 32 KHz */ | 129 | /* just count up at 32 KHz */ |
| 128 | while (__raw_readl(base + OMAP_WATCHDOG_WPS) & 0x04) | 130 | while (__raw_readl(base + OMAP_WATCHDOG_WPS) & 0x04) |
| 129 | cpu_relax(); | 131 | cpu_relax(); |
| @@ -131,6 +133,8 @@ static void omap_wdt_set_timeout(struct omap_wdt_dev *wdev) | |||
| 131 | __raw_writel(pre_margin, base + OMAP_WATCHDOG_LDR); | 133 | __raw_writel(pre_margin, base + OMAP_WATCHDOG_LDR); |
| 132 | while (__raw_readl(base + OMAP_WATCHDOG_WPS) & 0x04) | 134 | while (__raw_readl(base + OMAP_WATCHDOG_WPS) & 0x04) |
| 133 | cpu_relax(); | 135 | cpu_relax(); |
| 136 | |||
| 137 | pm_runtime_put_sync(wdev->dev); | ||
| 134 | } | 138 | } |
| 135 | 139 | ||
| 136 | /* | 140 | /* |
| @@ -160,6 +164,8 @@ static int omap_wdt_open(struct inode *inode, struct file *file) | |||
| 160 | omap_wdt_ping(wdev); /* trigger loading of new timeout value */ | 164 | omap_wdt_ping(wdev); /* trigger loading of new timeout value */ |
| 161 | omap_wdt_enable(wdev); | 165 | omap_wdt_enable(wdev); |
| 162 | 166 | ||
| 167 | pm_runtime_put_sync(wdev->dev); | ||
| 168 | |||
| 163 | return nonseekable_open(inode, file); | 169 | return nonseekable_open(inode, file); |
| 164 | } | 170 | } |
| 165 | 171 | ||
| @@ -171,6 +177,7 @@ static int omap_wdt_release(struct inode *inode, struct file *file) | |||
| 171 | * Shut off the timer unless NOWAYOUT is defined. | 177 | * Shut off the timer unless NOWAYOUT is defined. |
| 172 | */ | 178 | */ |
| 173 | #ifndef CONFIG_WATCHDOG_NOWAYOUT | 179 | #ifndef CONFIG_WATCHDOG_NOWAYOUT |
| 180 | pm_runtime_get_sync(wdev->dev); | ||
| 174 | 181 | ||
| 175 | omap_wdt_disable(wdev); | 182 | omap_wdt_disable(wdev); |
| 176 | 183 | ||
| @@ -190,9 +197,11 @@ static ssize_t omap_wdt_write(struct file *file, const char __user *data, | |||
| 190 | 197 | ||
| 191 | /* Refresh LOAD_TIME. */ | 198 | /* Refresh LOAD_TIME. */ |
| 192 | if (len) { | 199 | if (len) { |
| 200 | pm_runtime_get_sync(wdev->dev); | ||
| 193 | spin_lock(&wdt_lock); | 201 | spin_lock(&wdt_lock); |
| 194 | omap_wdt_ping(wdev); | 202 | omap_wdt_ping(wdev); |
| 195 | spin_unlock(&wdt_lock); | 203 | spin_unlock(&wdt_lock); |
| 204 | pm_runtime_put_sync(wdev->dev); | ||
| 196 | } | 205 | } |
| 197 | return len; | 206 | return len; |
| 198 | } | 207 | } |
| @@ -224,15 +233,18 @@ static long omap_wdt_ioctl(struct file *file, unsigned int cmd, | |||
| 224 | return put_user(omap_prcm_get_reset_sources(), | 233 | return put_user(omap_prcm_get_reset_sources(), |
| 225 | (int __user *)arg); | 234 | (int __user *)arg); |
| 226 | case WDIOC_KEEPALIVE: | 235 | case WDIOC_KEEPALIVE: |
| 236 | pm_runtime_get_sync(wdev->dev); | ||
| 227 | spin_lock(&wdt_lock); | 237 | spin_lock(&wdt_lock); |
| 228 | omap_wdt_ping(wdev); | 238 | omap_wdt_ping(wdev); |
| 229 | spin_unlock(&wdt_lock); | 239 | spin_unlock(&wdt_lock); |
| 240 | pm_runtime_put_sync(wdev->dev); | ||
| 230 | return 0; | 241 | return 0; |
| 231 | case WDIOC_SETTIMEOUT: | 242 | case WDIOC_SETTIMEOUT: |
| 232 | if (get_user(new_margin, (int __user *)arg)) | 243 | if (get_user(new_margin, (int __user *)arg)) |
| 233 | return -EFAULT; | 244 | return -EFAULT; |
| 234 | omap_wdt_adjust_timeout(new_margin); | 245 | omap_wdt_adjust_timeout(new_margin); |
| 235 | 246 | ||
| 247 | pm_runtime_get_sync(wdev->dev); | ||
| 236 | spin_lock(&wdt_lock); | 248 | spin_lock(&wdt_lock); |
| 237 | omap_wdt_disable(wdev); | 249 | omap_wdt_disable(wdev); |
| 238 | omap_wdt_set_timeout(wdev); | 250 | omap_wdt_set_timeout(wdev); |
| @@ -240,6 +252,7 @@ static long omap_wdt_ioctl(struct file *file, unsigned int cmd, | |||
| 240 | 252 | ||
| 241 | omap_wdt_ping(wdev); | 253 | omap_wdt_ping(wdev); |
| 242 | spin_unlock(&wdt_lock); | 254 | spin_unlock(&wdt_lock); |
| 255 | pm_runtime_put_sync(wdev->dev); | ||
| 243 | /* Fall */ | 256 | /* Fall */ |
| 244 | case WDIOC_GETTIMEOUT: | 257 | case WDIOC_GETTIMEOUT: |
| 245 | return put_user(timer_margin, (int __user *)arg); | 258 | return put_user(timer_margin, (int __user *)arg); |
| @@ -345,8 +358,11 @@ static void omap_wdt_shutdown(struct platform_device *pdev) | |||
| 345 | { | 358 | { |
| 346 | struct omap_wdt_dev *wdev = platform_get_drvdata(pdev); | 359 | struct omap_wdt_dev *wdev = platform_get_drvdata(pdev); |
| 347 | 360 | ||
| 348 | if (wdev->omap_wdt_users) | 361 | if (wdev->omap_wdt_users) { |
| 362 | pm_runtime_get_sync(wdev->dev); | ||
| 349 | omap_wdt_disable(wdev); | 363 | omap_wdt_disable(wdev); |
| 364 | pm_runtime_put_sync(wdev->dev); | ||
| 365 | } | ||
| 350 | } | 366 | } |
| 351 | 367 | ||
| 352 | static int __devexit omap_wdt_remove(struct platform_device *pdev) | 368 | static int __devexit omap_wdt_remove(struct platform_device *pdev) |
| @@ -381,8 +397,11 @@ static int omap_wdt_suspend(struct platform_device *pdev, pm_message_t state) | |||
| 381 | { | 397 | { |
| 382 | struct omap_wdt_dev *wdev = platform_get_drvdata(pdev); | 398 | struct omap_wdt_dev *wdev = platform_get_drvdata(pdev); |
| 383 | 399 | ||
| 384 | if (wdev->omap_wdt_users) | 400 | if (wdev->omap_wdt_users) { |
| 401 | pm_runtime_get_sync(wdev->dev); | ||
| 385 | omap_wdt_disable(wdev); | 402 | omap_wdt_disable(wdev); |
| 403 | pm_runtime_put_sync(wdev->dev); | ||
| 404 | } | ||
| 386 | 405 | ||
| 387 | return 0; | 406 | return 0; |
| 388 | } | 407 | } |
| @@ -392,8 +411,10 @@ static int omap_wdt_resume(struct platform_device *pdev) | |||
| 392 | struct omap_wdt_dev *wdev = platform_get_drvdata(pdev); | 411 | struct omap_wdt_dev *wdev = platform_get_drvdata(pdev); |
| 393 | 412 | ||
| 394 | if (wdev->omap_wdt_users) { | 413 | if (wdev->omap_wdt_users) { |
| 414 | pm_runtime_get_sync(wdev->dev); | ||
| 395 | omap_wdt_enable(wdev); | 415 | omap_wdt_enable(wdev); |
| 396 | omap_wdt_ping(wdev); | 416 | omap_wdt_ping(wdev); |
| 417 | pm_runtime_put_sync(wdev->dev); | ||
| 397 | } | 418 | } |
| 398 | 419 | ||
| 399 | return 0; | 420 | return 0; |
diff --git a/fs/ceph/dir.c b/fs/ceph/dir.c index f0aef787a10..099a58615b9 100644 --- a/fs/ceph/dir.c +++ b/fs/ceph/dir.c | |||
| @@ -60,7 +60,6 @@ int ceph_init_dentry(struct dentry *dentry) | |||
| 60 | } | 60 | } |
| 61 | di->dentry = dentry; | 61 | di->dentry = dentry; |
| 62 | di->lease_session = NULL; | 62 | di->lease_session = NULL; |
| 63 | di->parent_inode = igrab(dentry->d_parent->d_inode); | ||
| 64 | dentry->d_fsdata = di; | 63 | dentry->d_fsdata = di; |
| 65 | dentry->d_time = jiffies; | 64 | dentry->d_time = jiffies; |
| 66 | ceph_dentry_lru_add(dentry); | 65 | ceph_dentry_lru_add(dentry); |
| @@ -410,7 +409,7 @@ more: | |||
| 410 | spin_lock(&inode->i_lock); | 409 | spin_lock(&inode->i_lock); |
| 411 | if (ci->i_release_count == fi->dir_release_count) { | 410 | if (ci->i_release_count == fi->dir_release_count) { |
| 412 | dout(" marking %p complete\n", inode); | 411 | dout(" marking %p complete\n", inode); |
| 413 | ci->i_ceph_flags |= CEPH_I_COMPLETE; | 412 | /* ci->i_ceph_flags |= CEPH_I_COMPLETE; */ |
| 414 | ci->i_max_offset = filp->f_pos; | 413 | ci->i_max_offset = filp->f_pos; |
| 415 | } | 414 | } |
| 416 | spin_unlock(&inode->i_lock); | 415 | spin_unlock(&inode->i_lock); |
| @@ -497,6 +496,7 @@ struct dentry *ceph_finish_lookup(struct ceph_mds_request *req, | |||
| 497 | 496 | ||
| 498 | /* .snap dir? */ | 497 | /* .snap dir? */ |
| 499 | if (err == -ENOENT && | 498 | if (err == -ENOENT && |
| 499 | ceph_snap(parent) == CEPH_NOSNAP && | ||
| 500 | strcmp(dentry->d_name.name, | 500 | strcmp(dentry->d_name.name, |
| 501 | fsc->mount_options->snapdir_name) == 0) { | 501 | fsc->mount_options->snapdir_name) == 0) { |
| 502 | struct inode *inode = ceph_get_snapdir(parent); | 502 | struct inode *inode = ceph_get_snapdir(parent); |
| @@ -1030,28 +1030,8 @@ out_touch: | |||
| 1030 | static void ceph_dentry_release(struct dentry *dentry) | 1030 | static void ceph_dentry_release(struct dentry *dentry) |
| 1031 | { | 1031 | { |
| 1032 | struct ceph_dentry_info *di = ceph_dentry(dentry); | 1032 | struct ceph_dentry_info *di = ceph_dentry(dentry); |
| 1033 | struct inode *parent_inode = NULL; | ||
| 1034 | u64 snapid = CEPH_NOSNAP; | ||
| 1035 | 1033 | ||
| 1036 | if (!IS_ROOT(dentry)) { | 1034 | dout("dentry_release %p\n", dentry); |
| 1037 | parent_inode = di->parent_inode; | ||
| 1038 | if (parent_inode) | ||
| 1039 | snapid = ceph_snap(parent_inode); | ||
| 1040 | } | ||
| 1041 | dout("dentry_release %p parent %p\n", dentry, parent_inode); | ||
| 1042 | if (parent_inode && snapid != CEPH_SNAPDIR) { | ||
| 1043 | struct ceph_inode_info *ci = ceph_inode(parent_inode); | ||
| 1044 | |||
| 1045 | spin_lock(&parent_inode->i_lock); | ||
| 1046 | if (ci->i_shared_gen == di->lease_shared_gen || | ||
| 1047 | snapid <= CEPH_MAXSNAP) { | ||
| 1048 | dout(" clearing %p complete (d_release)\n", | ||
| 1049 | parent_inode); | ||
| 1050 | ci->i_ceph_flags &= ~CEPH_I_COMPLETE; | ||
| 1051 | ci->i_release_count++; | ||
| 1052 | } | ||
| 1053 | spin_unlock(&parent_inode->i_lock); | ||
| 1054 | } | ||
| 1055 | if (di) { | 1035 | if (di) { |
| 1056 | ceph_dentry_lru_del(dentry); | 1036 | ceph_dentry_lru_del(dentry); |
| 1057 | if (di->lease_session) | 1037 | if (di->lease_session) |
| @@ -1059,8 +1039,6 @@ static void ceph_dentry_release(struct dentry *dentry) | |||
| 1059 | kmem_cache_free(ceph_dentry_cachep, di); | 1039 | kmem_cache_free(ceph_dentry_cachep, di); |
| 1060 | dentry->d_fsdata = NULL; | 1040 | dentry->d_fsdata = NULL; |
| 1061 | } | 1041 | } |
| 1062 | if (parent_inode) | ||
| 1063 | iput(parent_inode); | ||
| 1064 | } | 1042 | } |
| 1065 | 1043 | ||
| 1066 | static int ceph_snapdir_d_revalidate(struct dentry *dentry, | 1044 | static int ceph_snapdir_d_revalidate(struct dentry *dentry, |
diff --git a/fs/ceph/inode.c b/fs/ceph/inode.c index 5625463aa47..193bfa5e9cb 100644 --- a/fs/ceph/inode.c +++ b/fs/ceph/inode.c | |||
| @@ -707,7 +707,7 @@ static int fill_inode(struct inode *inode, | |||
| 707 | (issued & CEPH_CAP_FILE_EXCL) == 0 && | 707 | (issued & CEPH_CAP_FILE_EXCL) == 0 && |
| 708 | (ci->i_ceph_flags & CEPH_I_COMPLETE) == 0) { | 708 | (ci->i_ceph_flags & CEPH_I_COMPLETE) == 0) { |
| 709 | dout(" marking %p complete (empty)\n", inode); | 709 | dout(" marking %p complete (empty)\n", inode); |
| 710 | ci->i_ceph_flags |= CEPH_I_COMPLETE; | 710 | /* ci->i_ceph_flags |= CEPH_I_COMPLETE; */ |
| 711 | ci->i_max_offset = 2; | 711 | ci->i_max_offset = 2; |
| 712 | } | 712 | } |
| 713 | break; | 713 | break; |
diff --git a/fs/ceph/super.h b/fs/ceph/super.h index 88fcaa21b80..20b907d76ae 100644 --- a/fs/ceph/super.h +++ b/fs/ceph/super.h | |||
| @@ -207,7 +207,6 @@ struct ceph_dentry_info { | |||
| 207 | struct dentry *dentry; | 207 | struct dentry *dentry; |
| 208 | u64 time; | 208 | u64 time; |
| 209 | u64 offset; | 209 | u64 offset; |
| 210 | struct inode *parent_inode; | ||
| 211 | }; | 210 | }; |
| 212 | 211 | ||
| 213 | struct ceph_inode_xattrs_info { | 212 | struct ceph_inode_xattrs_info { |
diff --git a/fs/exofs/namei.c b/fs/exofs/namei.c index 264e95d0283..4d70db110cf 100644 --- a/fs/exofs/namei.c +++ b/fs/exofs/namei.c | |||
| @@ -272,7 +272,6 @@ static int exofs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
| 272 | new_de = exofs_find_entry(new_dir, new_dentry, &new_page); | 272 | new_de = exofs_find_entry(new_dir, new_dentry, &new_page); |
| 273 | if (!new_de) | 273 | if (!new_de) |
| 274 | goto out_dir; | 274 | goto out_dir; |
| 275 | inode_inc_link_count(old_inode); | ||
| 276 | err = exofs_set_link(new_dir, new_de, new_page, old_inode); | 275 | err = exofs_set_link(new_dir, new_de, new_page, old_inode); |
| 277 | new_inode->i_ctime = CURRENT_TIME; | 276 | new_inode->i_ctime = CURRENT_TIME; |
| 278 | if (dir_de) | 277 | if (dir_de) |
| @@ -286,12 +285,9 @@ static int exofs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
| 286 | if (new_dir->i_nlink >= EXOFS_LINK_MAX) | 285 | if (new_dir->i_nlink >= EXOFS_LINK_MAX) |
| 287 | goto out_dir; | 286 | goto out_dir; |
| 288 | } | 287 | } |
| 289 | inode_inc_link_count(old_inode); | ||
| 290 | err = exofs_add_link(new_dentry, old_inode); | 288 | err = exofs_add_link(new_dentry, old_inode); |
| 291 | if (err) { | 289 | if (err) |
| 292 | inode_dec_link_count(old_inode); | ||
| 293 | goto out_dir; | 290 | goto out_dir; |
| 294 | } | ||
| 295 | if (dir_de) | 291 | if (dir_de) |
| 296 | inode_inc_link_count(new_dir); | 292 | inode_inc_link_count(new_dir); |
| 297 | } | 293 | } |
| @@ -299,7 +295,7 @@ static int exofs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
| 299 | old_inode->i_ctime = CURRENT_TIME; | 295 | old_inode->i_ctime = CURRENT_TIME; |
| 300 | 296 | ||
| 301 | exofs_delete_entry(old_de, old_page); | 297 | exofs_delete_entry(old_de, old_page); |
| 302 | inode_dec_link_count(old_inode); | 298 | mark_inode_dirty(old_inode); |
| 303 | 299 | ||
| 304 | if (dir_de) { | 300 | if (dir_de) { |
| 305 | err = exofs_set_link(old_inode, dir_de, dir_page, new_dir); | 301 | err = exofs_set_link(old_inode, dir_de, dir_page, new_dir); |
diff --git a/fs/ext2/namei.c b/fs/ext2/namei.c index 2e1d8341d82..adb91855ccd 100644 --- a/fs/ext2/namei.c +++ b/fs/ext2/namei.c | |||
| @@ -344,7 +344,6 @@ static int ext2_rename (struct inode * old_dir, struct dentry * old_dentry, | |||
| 344 | new_de = ext2_find_entry (new_dir, &new_dentry->d_name, &new_page); | 344 | new_de = ext2_find_entry (new_dir, &new_dentry->d_name, &new_page); |
| 345 | if (!new_de) | 345 | if (!new_de) |
| 346 | goto out_dir; | 346 | goto out_dir; |
| 347 | inode_inc_link_count(old_inode); | ||
| 348 | ext2_set_link(new_dir, new_de, new_page, old_inode, 1); | 347 | ext2_set_link(new_dir, new_de, new_page, old_inode, 1); |
| 349 | new_inode->i_ctime = CURRENT_TIME_SEC; | 348 | new_inode->i_ctime = CURRENT_TIME_SEC; |
| 350 | if (dir_de) | 349 | if (dir_de) |
| @@ -356,12 +355,9 @@ static int ext2_rename (struct inode * old_dir, struct dentry * old_dentry, | |||
| 356 | if (new_dir->i_nlink >= EXT2_LINK_MAX) | 355 | if (new_dir->i_nlink >= EXT2_LINK_MAX) |
| 357 | goto out_dir; | 356 | goto out_dir; |
| 358 | } | 357 | } |
| 359 | inode_inc_link_count(old_inode); | ||
| 360 | err = ext2_add_link(new_dentry, old_inode); | 358 | err = ext2_add_link(new_dentry, old_inode); |
| 361 | if (err) { | 359 | if (err) |
| 362 | inode_dec_link_count(old_inode); | ||
| 363 | goto out_dir; | 360 | goto out_dir; |
| 364 | } | ||
| 365 | if (dir_de) | 361 | if (dir_de) |
| 366 | inode_inc_link_count(new_dir); | 362 | inode_inc_link_count(new_dir); |
| 367 | } | 363 | } |
| @@ -369,12 +365,11 @@ static int ext2_rename (struct inode * old_dir, struct dentry * old_dentry, | |||
| 369 | /* | 365 | /* |
| 370 | * Like most other Unix systems, set the ctime for inodes on a | 366 | * Like most other Unix systems, set the ctime for inodes on a |
| 371 | * rename. | 367 | * rename. |
| 372 | * inode_dec_link_count() will mark the inode dirty. | ||
| 373 | */ | 368 | */ |
| 374 | old_inode->i_ctime = CURRENT_TIME_SEC; | 369 | old_inode->i_ctime = CURRENT_TIME_SEC; |
| 370 | mark_inode_dirty(old_inode); | ||
| 375 | 371 | ||
| 376 | ext2_delete_entry (old_de, old_page); | 372 | ext2_delete_entry (old_de, old_page); |
| 377 | inode_dec_link_count(old_inode); | ||
| 378 | 373 | ||
| 379 | if (dir_de) { | 374 | if (dir_de) { |
| 380 | if (old_dir != new_dir) | 375 | if (old_dir != new_dir) |
diff --git a/fs/hfs/dir.c b/fs/hfs/dir.c index afa66aaa223..b4d70b13be9 100644 --- a/fs/hfs/dir.c +++ b/fs/hfs/dir.c | |||
| @@ -238,46 +238,22 @@ static int hfs_mkdir(struct inode *dir, struct dentry *dentry, int mode) | |||
| 238 | } | 238 | } |
| 239 | 239 | ||
| 240 | /* | 240 | /* |
| 241 | * hfs_unlink() | 241 | * hfs_remove() |
| 242 | * | 242 | * |
| 243 | * This is the unlink() entry in the inode_operations structure for | 243 | * This serves as both unlink() and rmdir() in the inode_operations |
| 244 | * regular HFS directories. The purpose is to delete an existing | 244 | * structure for regular HFS directories. The purpose is to delete |
| 245 | * file, given the inode for the parent directory and the name | 245 | * an existing child, given the inode for the parent directory and |
| 246 | * (and its length) of the existing file. | 246 | * the name (and its length) of the existing directory. |
| 247 | */ | ||
| 248 | static int hfs_unlink(struct inode *dir, struct dentry *dentry) | ||
| 249 | { | ||
| 250 | struct inode *inode; | ||
| 251 | int res; | ||
| 252 | |||
| 253 | inode = dentry->d_inode; | ||
| 254 | res = hfs_cat_delete(inode->i_ino, dir, &dentry->d_name); | ||
| 255 | if (res) | ||
| 256 | return res; | ||
| 257 | |||
| 258 | drop_nlink(inode); | ||
| 259 | hfs_delete_inode(inode); | ||
| 260 | inode->i_ctime = CURRENT_TIME_SEC; | ||
| 261 | mark_inode_dirty(inode); | ||
| 262 | |||
| 263 | return res; | ||
| 264 | } | ||
| 265 | |||
| 266 | /* | ||
| 267 | * hfs_rmdir() | ||
| 268 | * | 247 | * |
| 269 | * This is the rmdir() entry in the inode_operations structure for | 248 | * HFS does not have hardlinks, so both rmdir and unlink set the |
| 270 | * regular HFS directories. The purpose is to delete an existing | 249 | * link count to 0. The only difference is the emptiness check. |
| 271 | * directory, given the inode for the parent directory and the name | ||
| 272 | * (and its length) of the existing directory. | ||
| 273 | */ | 250 | */ |
| 274 | static int hfs_rmdir(struct inode *dir, struct dentry *dentry) | 251 | static int hfs_remove(struct inode *dir, struct dentry *dentry) |
| 275 | { | 252 | { |
| 276 | struct inode *inode; | 253 | struct inode *inode = dentry->d_inode; |
| 277 | int res; | 254 | int res; |
| 278 | 255 | ||
| 279 | inode = dentry->d_inode; | 256 | if (S_ISDIR(inode->i_mode) && inode->i_size != 2) |
| 280 | if (inode->i_size != 2) | ||
| 281 | return -ENOTEMPTY; | 257 | return -ENOTEMPTY; |
| 282 | res = hfs_cat_delete(inode->i_ino, dir, &dentry->d_name); | 258 | res = hfs_cat_delete(inode->i_ino, dir, &dentry->d_name); |
| 283 | if (res) | 259 | if (res) |
| @@ -307,7 +283,7 @@ static int hfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
| 307 | 283 | ||
| 308 | /* Unlink destination if it already exists */ | 284 | /* Unlink destination if it already exists */ |
| 309 | if (new_dentry->d_inode) { | 285 | if (new_dentry->d_inode) { |
| 310 | res = hfs_unlink(new_dir, new_dentry); | 286 | res = hfs_remove(new_dir, new_dentry); |
| 311 | if (res) | 287 | if (res) |
| 312 | return res; | 288 | return res; |
| 313 | } | 289 | } |
| @@ -332,9 +308,9 @@ const struct file_operations hfs_dir_operations = { | |||
| 332 | const struct inode_operations hfs_dir_inode_operations = { | 308 | const struct inode_operations hfs_dir_inode_operations = { |
| 333 | .create = hfs_create, | 309 | .create = hfs_create, |
| 334 | .lookup = hfs_lookup, | 310 | .lookup = hfs_lookup, |
| 335 | .unlink = hfs_unlink, | 311 | .unlink = hfs_remove, |
| 336 | .mkdir = hfs_mkdir, | 312 | .mkdir = hfs_mkdir, |
| 337 | .rmdir = hfs_rmdir, | 313 | .rmdir = hfs_remove, |
| 338 | .rename = hfs_rename, | 314 | .rename = hfs_rename, |
| 339 | .setattr = hfs_inode_setattr, | 315 | .setattr = hfs_inode_setattr, |
| 340 | }; | 316 | }; |
diff --git a/fs/minix/namei.c b/fs/minix/namei.c index ce7337ddfdb..6e6777f1b4b 100644 --- a/fs/minix/namei.c +++ b/fs/minix/namei.c | |||
| @@ -213,7 +213,6 @@ static int minix_rename(struct inode * old_dir, struct dentry *old_dentry, | |||
| 213 | new_de = minix_find_entry(new_dentry, &new_page); | 213 | new_de = minix_find_entry(new_dentry, &new_page); |
| 214 | if (!new_de) | 214 | if (!new_de) |
| 215 | goto out_dir; | 215 | goto out_dir; |
| 216 | inode_inc_link_count(old_inode); | ||
| 217 | minix_set_link(new_de, new_page, old_inode); | 216 | minix_set_link(new_de, new_page, old_inode); |
| 218 | new_inode->i_ctime = CURRENT_TIME_SEC; | 217 | new_inode->i_ctime = CURRENT_TIME_SEC; |
| 219 | if (dir_de) | 218 | if (dir_de) |
| @@ -225,18 +224,15 @@ static int minix_rename(struct inode * old_dir, struct dentry *old_dentry, | |||
| 225 | if (new_dir->i_nlink >= info->s_link_max) | 224 | if (new_dir->i_nlink >= info->s_link_max) |
| 226 | goto out_dir; | 225 | goto out_dir; |
| 227 | } | 226 | } |
| 228 | inode_inc_link_count(old_inode); | ||
| 229 | err = minix_add_link(new_dentry, old_inode); | 227 | err = minix_add_link(new_dentry, old_inode); |
| 230 | if (err) { | 228 | if (err) |
| 231 | inode_dec_link_count(old_inode); | ||
| 232 | goto out_dir; | 229 | goto out_dir; |
| 233 | } | ||
| 234 | if (dir_de) | 230 | if (dir_de) |
| 235 | inode_inc_link_count(new_dir); | 231 | inode_inc_link_count(new_dir); |
| 236 | } | 232 | } |
| 237 | 233 | ||
| 238 | minix_delete_entry(old_de, old_page); | 234 | minix_delete_entry(old_de, old_page); |
| 239 | inode_dec_link_count(old_inode); | 235 | mark_inode_dirty(old_inode); |
| 240 | 236 | ||
| 241 | if (dir_de) { | 237 | if (dir_de) { |
| 242 | minix_set_link(dir_de, dir_page, new_dir); | 238 | minix_set_link(dir_de, dir_page, new_dir); |
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index 78936a8f40a..1ff76acc7e9 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c | |||
| @@ -51,6 +51,7 @@ | |||
| 51 | #include <linux/sunrpc/bc_xprt.h> | 51 | #include <linux/sunrpc/bc_xprt.h> |
| 52 | #include <linux/xattr.h> | 52 | #include <linux/xattr.h> |
| 53 | #include <linux/utsname.h> | 53 | #include <linux/utsname.h> |
| 54 | #include <linux/mm.h> | ||
| 54 | 55 | ||
| 55 | #include "nfs4_fs.h" | 56 | #include "nfs4_fs.h" |
| 56 | #include "delegation.h" | 57 | #include "delegation.h" |
| @@ -3252,6 +3253,35 @@ static void buf_to_pages(const void *buf, size_t buflen, | |||
| 3252 | } | 3253 | } |
| 3253 | } | 3254 | } |
| 3254 | 3255 | ||
| 3256 | static int buf_to_pages_noslab(const void *buf, size_t buflen, | ||
| 3257 | struct page **pages, unsigned int *pgbase) | ||
| 3258 | { | ||
| 3259 | struct page *newpage, **spages; | ||
| 3260 | int rc = 0; | ||
| 3261 | size_t len; | ||
| 3262 | spages = pages; | ||
| 3263 | |||
| 3264 | do { | ||
| 3265 | len = min(PAGE_CACHE_SIZE, buflen); | ||
| 3266 | newpage = alloc_page(GFP_KERNEL); | ||
| 3267 | |||
| 3268 | if (newpage == NULL) | ||
| 3269 | goto unwind; | ||
| 3270 | memcpy(page_address(newpage), buf, len); | ||
| 3271 | buf += len; | ||
| 3272 | buflen -= len; | ||
| 3273 | *pages++ = newpage; | ||
| 3274 | rc++; | ||
| 3275 | } while (buflen != 0); | ||
| 3276 | |||
| 3277 | return rc; | ||
| 3278 | |||
| 3279 | unwind: | ||
| 3280 | for(; rc > 0; rc--) | ||
| 3281 | __free_page(spages[rc-1]); | ||
| 3282 | return -ENOMEM; | ||
| 3283 | } | ||
| 3284 | |||
| 3255 | struct nfs4_cached_acl { | 3285 | struct nfs4_cached_acl { |
| 3256 | int cached; | 3286 | int cached; |
| 3257 | size_t len; | 3287 | size_t len; |
| @@ -3420,13 +3450,23 @@ static int __nfs4_proc_set_acl(struct inode *inode, const void *buf, size_t bufl | |||
| 3420 | .rpc_argp = &arg, | 3450 | .rpc_argp = &arg, |
| 3421 | .rpc_resp = &res, | 3451 | .rpc_resp = &res, |
| 3422 | }; | 3452 | }; |
| 3423 | int ret; | 3453 | int ret, i; |
| 3424 | 3454 | ||
| 3425 | if (!nfs4_server_supports_acls(server)) | 3455 | if (!nfs4_server_supports_acls(server)) |
| 3426 | return -EOPNOTSUPP; | 3456 | return -EOPNOTSUPP; |
| 3457 | i = buf_to_pages_noslab(buf, buflen, arg.acl_pages, &arg.acl_pgbase); | ||
| 3458 | if (i < 0) | ||
| 3459 | return i; | ||
| 3427 | nfs_inode_return_delegation(inode); | 3460 | nfs_inode_return_delegation(inode); |
| 3428 | buf_to_pages(buf, buflen, arg.acl_pages, &arg.acl_pgbase); | ||
| 3429 | ret = nfs4_call_sync(server, &msg, &arg, &res, 1); | 3461 | ret = nfs4_call_sync(server, &msg, &arg, &res, 1); |
| 3462 | |||
| 3463 | /* | ||
| 3464 | * Free each page after tx, so the only ref left is | ||
| 3465 | * held by the network stack | ||
| 3466 | */ | ||
| 3467 | for (; i > 0; i--) | ||
| 3468 | put_page(pages[i-1]); | ||
| 3469 | |||
| 3430 | /* | 3470 | /* |
| 3431 | * Acl update can result in inode attribute update. | 3471 | * Acl update can result in inode attribute update. |
| 3432 | * so mark the attribute cache invalid. | 3472 | * so mark the attribute cache invalid. |
diff --git a/fs/nilfs2/namei.c b/fs/nilfs2/namei.c index 98034271cd0..161791d2645 100644 --- a/fs/nilfs2/namei.c +++ b/fs/nilfs2/namei.c | |||
| @@ -397,7 +397,6 @@ static int nilfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
| 397 | new_de = nilfs_find_entry(new_dir, &new_dentry->d_name, &new_page); | 397 | new_de = nilfs_find_entry(new_dir, &new_dentry->d_name, &new_page); |
| 398 | if (!new_de) | 398 | if (!new_de) |
| 399 | goto out_dir; | 399 | goto out_dir; |
| 400 | inc_nlink(old_inode); | ||
| 401 | nilfs_set_link(new_dir, new_de, new_page, old_inode); | 400 | nilfs_set_link(new_dir, new_de, new_page, old_inode); |
| 402 | nilfs_mark_inode_dirty(new_dir); | 401 | nilfs_mark_inode_dirty(new_dir); |
| 403 | new_inode->i_ctime = CURRENT_TIME; | 402 | new_inode->i_ctime = CURRENT_TIME; |
| @@ -411,13 +410,9 @@ static int nilfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
| 411 | if (new_dir->i_nlink >= NILFS_LINK_MAX) | 410 | if (new_dir->i_nlink >= NILFS_LINK_MAX) |
| 412 | goto out_dir; | 411 | goto out_dir; |
| 413 | } | 412 | } |
| 414 | inc_nlink(old_inode); | ||
| 415 | err = nilfs_add_link(new_dentry, old_inode); | 413 | err = nilfs_add_link(new_dentry, old_inode); |
| 416 | if (err) { | 414 | if (err) |
| 417 | drop_nlink(old_inode); | ||
| 418 | nilfs_mark_inode_dirty(old_inode); | ||
| 419 | goto out_dir; | 415 | goto out_dir; |
| 420 | } | ||
| 421 | if (dir_de) { | 416 | if (dir_de) { |
| 422 | inc_nlink(new_dir); | 417 | inc_nlink(new_dir); |
| 423 | nilfs_mark_inode_dirty(new_dir); | 418 | nilfs_mark_inode_dirty(new_dir); |
| @@ -431,7 +426,6 @@ static int nilfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
| 431 | old_inode->i_ctime = CURRENT_TIME; | 426 | old_inode->i_ctime = CURRENT_TIME; |
| 432 | 427 | ||
| 433 | nilfs_delete_entry(old_de, old_page); | 428 | nilfs_delete_entry(old_de, old_page); |
| 434 | drop_nlink(old_inode); | ||
| 435 | 429 | ||
| 436 | if (dir_de) { | 430 | if (dir_de) { |
| 437 | nilfs_set_link(old_inode, dir_de, dir_page, new_dir); | 431 | nilfs_set_link(old_inode, dir_de, dir_page, new_dir); |
diff --git a/fs/nilfs2/segment.c b/fs/nilfs2/segment.c index 55ebae5c7f3..2de9f636792 100644 --- a/fs/nilfs2/segment.c +++ b/fs/nilfs2/segment.c | |||
| @@ -430,7 +430,8 @@ static void nilfs_segctor_begin_finfo(struct nilfs_sc_info *sci, | |||
| 430 | nilfs_segctor_map_segsum_entry( | 430 | nilfs_segctor_map_segsum_entry( |
| 431 | sci, &sci->sc_binfo_ptr, sizeof(struct nilfs_finfo)); | 431 | sci, &sci->sc_binfo_ptr, sizeof(struct nilfs_finfo)); |
| 432 | 432 | ||
| 433 | if (inode->i_sb && !test_bit(NILFS_SC_HAVE_DELTA, &sci->sc_flags)) | 433 | if (NILFS_I(inode)->i_root && |
| 434 | !test_bit(NILFS_SC_HAVE_DELTA, &sci->sc_flags)) | ||
| 434 | set_bit(NILFS_SC_HAVE_DELTA, &sci->sc_flags); | 435 | set_bit(NILFS_SC_HAVE_DELTA, &sci->sc_flags); |
| 435 | /* skip finfo */ | 436 | /* skip finfo */ |
| 436 | } | 437 | } |
diff --git a/fs/proc/proc_devtree.c b/fs/proc/proc_devtree.c index d9396a4fc7f..927cbd115e5 100644 --- a/fs/proc/proc_devtree.c +++ b/fs/proc/proc_devtree.c | |||
| @@ -233,7 +233,7 @@ void __init proc_device_tree_init(void) | |||
| 233 | return; | 233 | return; |
| 234 | root = of_find_node_by_path("/"); | 234 | root = of_find_node_by_path("/"); |
| 235 | if (root == NULL) { | 235 | if (root == NULL) { |
| 236 | printk(KERN_ERR "/proc/device-tree: can't find root\n"); | 236 | pr_debug("/proc/device-tree: can't find root\n"); |
| 237 | return; | 237 | return; |
| 238 | } | 238 | } |
| 239 | proc_device_tree_add_node(root, proc_device_tree); | 239 | proc_device_tree_add_node(root, proc_device_tree); |
diff --git a/fs/reiserfs/namei.c b/fs/reiserfs/namei.c index ba5f51ec345..68fdf45cc6c 100644 --- a/fs/reiserfs/namei.c +++ b/fs/reiserfs/namei.c | |||
| @@ -771,7 +771,7 @@ static int reiserfs_mkdir(struct inode *dir, struct dentry *dentry, int mode) | |||
| 771 | EMPTY_DIR_SIZE_V1 : EMPTY_DIR_SIZE, | 771 | EMPTY_DIR_SIZE_V1 : EMPTY_DIR_SIZE, |
| 772 | dentry, inode, &security); | 772 | dentry, inode, &security); |
| 773 | if (retval) { | 773 | if (retval) { |
| 774 | dir->i_nlink--; | 774 | DEC_DIR_INODE_NLINK(dir) |
| 775 | goto out_failed; | 775 | goto out_failed; |
| 776 | } | 776 | } |
| 777 | 777 | ||
diff --git a/fs/sysv/namei.c b/fs/sysv/namei.c index b427b1208c2..e474fbcf8bd 100644 --- a/fs/sysv/namei.c +++ b/fs/sysv/namei.c | |||
| @@ -245,7 +245,6 @@ static int sysv_rename(struct inode * old_dir, struct dentry * old_dentry, | |||
| 245 | new_de = sysv_find_entry(new_dentry, &new_page); | 245 | new_de = sysv_find_entry(new_dentry, &new_page); |
| 246 | if (!new_de) | 246 | if (!new_de) |
| 247 | goto out_dir; | 247 | goto out_dir; |
| 248 | inode_inc_link_count(old_inode); | ||
| 249 | sysv_set_link(new_de, new_page, old_inode); | 248 | sysv_set_link(new_de, new_page, old_inode); |
| 250 | new_inode->i_ctime = CURRENT_TIME_SEC; | 249 | new_inode->i_ctime = CURRENT_TIME_SEC; |
| 251 | if (dir_de) | 250 | if (dir_de) |
| @@ -257,18 +256,15 @@ static int sysv_rename(struct inode * old_dir, struct dentry * old_dentry, | |||
| 257 | if (new_dir->i_nlink >= SYSV_SB(new_dir->i_sb)->s_link_max) | 256 | if (new_dir->i_nlink >= SYSV_SB(new_dir->i_sb)->s_link_max) |
| 258 | goto out_dir; | 257 | goto out_dir; |
| 259 | } | 258 | } |
| 260 | inode_inc_link_count(old_inode); | ||
| 261 | err = sysv_add_link(new_dentry, old_inode); | 259 | err = sysv_add_link(new_dentry, old_inode); |
| 262 | if (err) { | 260 | if (err) |
| 263 | inode_dec_link_count(old_inode); | ||
| 264 | goto out_dir; | 261 | goto out_dir; |
| 265 | } | ||
| 266 | if (dir_de) | 262 | if (dir_de) |
| 267 | inode_inc_link_count(new_dir); | 263 | inode_inc_link_count(new_dir); |
| 268 | } | 264 | } |
| 269 | 265 | ||
| 270 | sysv_delete_entry(old_de, old_page); | 266 | sysv_delete_entry(old_de, old_page); |
| 271 | inode_dec_link_count(old_inode); | 267 | mark_inode_dirty(old_inode); |
| 272 | 268 | ||
| 273 | if (dir_de) { | 269 | if (dir_de) { |
| 274 | sysv_set_link(dir_de, dir_page, new_dir); | 270 | sysv_set_link(dir_de, dir_page, new_dir); |
diff --git a/fs/udf/namei.c b/fs/udf/namei.c index 2be0f9eb86d..b7c338d5e9d 100644 --- a/fs/udf/namei.c +++ b/fs/udf/namei.c | |||
| @@ -32,6 +32,8 @@ | |||
| 32 | #include <linux/crc-itu-t.h> | 32 | #include <linux/crc-itu-t.h> |
| 33 | #include <linux/exportfs.h> | 33 | #include <linux/exportfs.h> |
| 34 | 34 | ||
| 35 | enum { UDF_MAX_LINKS = 0xffff }; | ||
| 36 | |||
| 35 | static inline int udf_match(int len1, const unsigned char *name1, int len2, | 37 | static inline int udf_match(int len1, const unsigned char *name1, int len2, |
| 36 | const unsigned char *name2) | 38 | const unsigned char *name2) |
| 37 | { | 39 | { |
| @@ -650,7 +652,7 @@ static int udf_mkdir(struct inode *dir, struct dentry *dentry, int mode) | |||
| 650 | struct udf_inode_info *iinfo; | 652 | struct udf_inode_info *iinfo; |
| 651 | 653 | ||
| 652 | err = -EMLINK; | 654 | err = -EMLINK; |
| 653 | if (dir->i_nlink >= (256 << sizeof(dir->i_nlink)) - 1) | 655 | if (dir->i_nlink >= UDF_MAX_LINKS) |
| 654 | goto out; | 656 | goto out; |
| 655 | 657 | ||
| 656 | err = -EIO; | 658 | err = -EIO; |
| @@ -1034,9 +1036,8 @@ static int udf_link(struct dentry *old_dentry, struct inode *dir, | |||
| 1034 | struct fileIdentDesc cfi, *fi; | 1036 | struct fileIdentDesc cfi, *fi; |
| 1035 | int err; | 1037 | int err; |
| 1036 | 1038 | ||
| 1037 | if (inode->i_nlink >= (256 << sizeof(inode->i_nlink)) - 1) { | 1039 | if (inode->i_nlink >= UDF_MAX_LINKS) |
| 1038 | return -EMLINK; | 1040 | return -EMLINK; |
| 1039 | } | ||
| 1040 | 1041 | ||
| 1041 | fi = udf_add_entry(dir, dentry, &fibh, &cfi, &err); | 1042 | fi = udf_add_entry(dir, dentry, &fibh, &cfi, &err); |
| 1042 | if (!fi) { | 1043 | if (!fi) { |
| @@ -1131,9 +1132,7 @@ static int udf_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
| 1131 | goto end_rename; | 1132 | goto end_rename; |
| 1132 | 1133 | ||
| 1133 | retval = -EMLINK; | 1134 | retval = -EMLINK; |
| 1134 | if (!new_inode && | 1135 | if (!new_inode && new_dir->i_nlink >= UDF_MAX_LINKS) |
| 1135 | new_dir->i_nlink >= | ||
| 1136 | (256 << sizeof(new_dir->i_nlink)) - 1) | ||
| 1137 | goto end_rename; | 1136 | goto end_rename; |
| 1138 | } | 1137 | } |
| 1139 | if (!nfi) { | 1138 | if (!nfi) { |
diff --git a/fs/ufs/namei.c b/fs/ufs/namei.c index 12f39b9e443..d6f681535eb 100644 --- a/fs/ufs/namei.c +++ b/fs/ufs/namei.c | |||
| @@ -306,7 +306,6 @@ static int ufs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
| 306 | new_de = ufs_find_entry(new_dir, &new_dentry->d_name, &new_page); | 306 | new_de = ufs_find_entry(new_dir, &new_dentry->d_name, &new_page); |
| 307 | if (!new_de) | 307 | if (!new_de) |
| 308 | goto out_dir; | 308 | goto out_dir; |
| 309 | inode_inc_link_count(old_inode); | ||
| 310 | ufs_set_link(new_dir, new_de, new_page, old_inode); | 309 | ufs_set_link(new_dir, new_de, new_page, old_inode); |
| 311 | new_inode->i_ctime = CURRENT_TIME_SEC; | 310 | new_inode->i_ctime = CURRENT_TIME_SEC; |
| 312 | if (dir_de) | 311 | if (dir_de) |
| @@ -318,12 +317,9 @@ static int ufs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
| 318 | if (new_dir->i_nlink >= UFS_LINK_MAX) | 317 | if (new_dir->i_nlink >= UFS_LINK_MAX) |
| 319 | goto out_dir; | 318 | goto out_dir; |
| 320 | } | 319 | } |
| 321 | inode_inc_link_count(old_inode); | ||
| 322 | err = ufs_add_link(new_dentry, old_inode); | 320 | err = ufs_add_link(new_dentry, old_inode); |
| 323 | if (err) { | 321 | if (err) |
| 324 | inode_dec_link_count(old_inode); | ||
| 325 | goto out_dir; | 322 | goto out_dir; |
| 326 | } | ||
| 327 | if (dir_de) | 323 | if (dir_de) |
| 328 | inode_inc_link_count(new_dir); | 324 | inode_inc_link_count(new_dir); |
| 329 | } | 325 | } |
| @@ -331,12 +327,11 @@ static int ufs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
| 331 | /* | 327 | /* |
| 332 | * Like most other Unix systems, set the ctime for inodes on a | 328 | * Like most other Unix systems, set the ctime for inodes on a |
| 333 | * rename. | 329 | * rename. |
| 334 | * inode_dec_link_count() will mark the inode dirty. | ||
| 335 | */ | 330 | */ |
| 336 | old_inode->i_ctime = CURRENT_TIME_SEC; | 331 | old_inode->i_ctime = CURRENT_TIME_SEC; |
| 337 | 332 | ||
| 338 | ufs_delete_entry(old_dir, old_de, old_page); | 333 | ufs_delete_entry(old_dir, old_de, old_page); |
| 339 | inode_dec_link_count(old_inode); | 334 | mark_inode_dirty(old_inode); |
| 340 | 335 | ||
| 341 | if (dir_de) { | 336 | if (dir_de) { |
| 342 | ufs_set_link(old_inode, dir_de, dir_page, new_dir); | 337 | ufs_set_link(old_inode, dir_de, dir_page, new_dir); |
diff --git a/fs/xfs/linux-2.6/xfs_ioctl.c b/fs/xfs/linux-2.6/xfs_ioctl.c index f5e2a19e0f8..0ca0e3c024d 100644 --- a/fs/xfs/linux-2.6/xfs_ioctl.c +++ b/fs/xfs/linux-2.6/xfs_ioctl.c | |||
| @@ -695,14 +695,19 @@ xfs_ioc_fsgeometry_v1( | |||
| 695 | xfs_mount_t *mp, | 695 | xfs_mount_t *mp, |
| 696 | void __user *arg) | 696 | void __user *arg) |
| 697 | { | 697 | { |
| 698 | xfs_fsop_geom_v1_t fsgeo; | 698 | xfs_fsop_geom_t fsgeo; |
| 699 | int error; | 699 | int error; |
| 700 | 700 | ||
| 701 | error = xfs_fs_geometry(mp, (xfs_fsop_geom_t *)&fsgeo, 3); | 701 | error = xfs_fs_geometry(mp, &fsgeo, 3); |
| 702 | if (error) | 702 | if (error) |
| 703 | return -error; | 703 | return -error; |
| 704 | 704 | ||
| 705 | if (copy_to_user(arg, &fsgeo, sizeof(fsgeo))) | 705 | /* |
| 706 | * Caller should have passed an argument of type | ||
| 707 | * xfs_fsop_geom_v1_t. This is a proper subset of the | ||
| 708 | * xfs_fsop_geom_t that xfs_fs_geometry() fills in. | ||
| 709 | */ | ||
| 710 | if (copy_to_user(arg, &fsgeo, sizeof(xfs_fsop_geom_v1_t))) | ||
| 706 | return -XFS_ERROR(EFAULT); | 711 | return -XFS_ERROR(EFAULT); |
| 707 | return 0; | 712 | return 0; |
| 708 | } | 713 | } |
diff --git a/include/keys/rxrpc-type.h b/include/keys/rxrpc-type.h index 5cb86c307f5..fc487543381 100644 --- a/include/keys/rxrpc-type.h +++ b/include/keys/rxrpc-type.h | |||
| @@ -99,7 +99,6 @@ struct rxrpc_key_token { | |||
| 99 | * structure of raw payloads passed to add_key() or instantiate key | 99 | * structure of raw payloads passed to add_key() or instantiate key |
| 100 | */ | 100 | */ |
| 101 | struct rxrpc_key_data_v1 { | 101 | struct rxrpc_key_data_v1 { |
| 102 | u32 kif_version; /* 1 */ | ||
| 103 | u16 security_index; | 102 | u16 security_index; |
| 104 | u16 ticket_length; | 103 | u16 ticket_length; |
| 105 | u32 expiry; /* time_t */ | 104 | u32 expiry; /* time_t */ |
diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 4d18ff34670..d5063e1b555 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h | |||
| @@ -699,7 +699,7 @@ extern void blk_start_queue(struct request_queue *q); | |||
| 699 | extern void blk_stop_queue(struct request_queue *q); | 699 | extern void blk_stop_queue(struct request_queue *q); |
| 700 | extern void blk_sync_queue(struct request_queue *q); | 700 | extern void blk_sync_queue(struct request_queue *q); |
| 701 | extern void __blk_stop_queue(struct request_queue *q); | 701 | extern void __blk_stop_queue(struct request_queue *q); |
| 702 | extern void __blk_run_queue(struct request_queue *); | 702 | extern void __blk_run_queue(struct request_queue *q, bool force_kblockd); |
| 703 | extern void blk_run_queue(struct request_queue *); | 703 | extern void blk_run_queue(struct request_queue *); |
| 704 | extern int blk_rq_map_user(struct request_queue *, struct request *, | 704 | extern int blk_rq_map_user(struct request_queue *, struct request *, |
| 705 | struct rq_map_data *, void __user *, unsigned long, | 705 | struct rq_map_data *, void __user *, unsigned long, |
| @@ -1088,7 +1088,6 @@ static inline void put_dev_sector(Sector p) | |||
| 1088 | 1088 | ||
| 1089 | struct work_struct; | 1089 | struct work_struct; |
| 1090 | int kblockd_schedule_work(struct request_queue *q, struct work_struct *work); | 1090 | int kblockd_schedule_work(struct request_queue *q, struct work_struct *work); |
| 1091 | int kblockd_schedule_delayed_work(struct request_queue *q, struct delayed_work *dwork, unsigned long delay); | ||
| 1092 | 1091 | ||
| 1093 | #ifdef CONFIG_BLK_CGROUP | 1092 | #ifdef CONFIG_BLK_CGROUP |
| 1094 | /* | 1093 | /* |
| @@ -1136,7 +1135,6 @@ static inline uint64_t rq_io_start_time_ns(struct request *req) | |||
| 1136 | extern int blk_throtl_init(struct request_queue *q); | 1135 | extern int blk_throtl_init(struct request_queue *q); |
| 1137 | extern void blk_throtl_exit(struct request_queue *q); | 1136 | extern void blk_throtl_exit(struct request_queue *q); |
| 1138 | extern int blk_throtl_bio(struct request_queue *q, struct bio **bio); | 1137 | extern int blk_throtl_bio(struct request_queue *q, struct bio **bio); |
| 1139 | extern void throtl_schedule_delayed_work(struct request_queue *q, unsigned long delay); | ||
| 1140 | extern void throtl_shutdown_timer_wq(struct request_queue *q); | 1138 | extern void throtl_shutdown_timer_wq(struct request_queue *q); |
| 1141 | #else /* CONFIG_BLK_DEV_THROTTLING */ | 1139 | #else /* CONFIG_BLK_DEV_THROTTLING */ |
| 1142 | static inline int blk_throtl_bio(struct request_queue *q, struct bio **bio) | 1140 | static inline int blk_throtl_bio(struct request_queue *q, struct bio **bio) |
| @@ -1146,7 +1144,6 @@ static inline int blk_throtl_bio(struct request_queue *q, struct bio **bio) | |||
| 1146 | 1144 | ||
| 1147 | static inline int blk_throtl_init(struct request_queue *q) { return 0; } | 1145 | static inline int blk_throtl_init(struct request_queue *q) { return 0; } |
| 1148 | static inline int blk_throtl_exit(struct request_queue *q) { return 0; } | 1146 | static inline int blk_throtl_exit(struct request_queue *q) { return 0; } |
| 1149 | static inline void throtl_schedule_delayed_work(struct request_queue *q, unsigned long delay) {} | ||
| 1150 | static inline void throtl_shutdown_timer_wq(struct request_queue *q) {} | 1147 | static inline void throtl_shutdown_timer_wq(struct request_queue *q) {} |
| 1151 | #endif /* CONFIG_BLK_DEV_THROTTLING */ | 1148 | #endif /* CONFIG_BLK_DEV_THROTTLING */ |
| 1152 | 1149 | ||
diff --git a/include/linux/blktrace_api.h b/include/linux/blktrace_api.h index 3395cf7130f..b22fb0d3db0 100644 --- a/include/linux/blktrace_api.h +++ b/include/linux/blktrace_api.h | |||
| @@ -245,7 +245,6 @@ static inline int blk_cmd_buf_len(struct request *rq) | |||
| 245 | 245 | ||
| 246 | extern void blk_dump_cmd(char *buf, struct request *rq); | 246 | extern void blk_dump_cmd(char *buf, struct request *rq); |
| 247 | extern void blk_fill_rwbs(char *rwbs, u32 rw, int bytes); | 247 | extern void blk_fill_rwbs(char *rwbs, u32 rw, int bytes); |
| 248 | extern void blk_fill_rwbs_rq(char *rwbs, struct request *rq); | ||
| 249 | 248 | ||
| 250 | #endif /* CONFIG_EVENT_TRACING && CONFIG_BLOCK */ | 249 | #endif /* CONFIG_EVENT_TRACING && CONFIG_BLOCK */ |
| 251 | 250 | ||
diff --git a/include/linux/ceph/messenger.h b/include/linux/ceph/messenger.h index c3011beac30..31d91a64838 100644 --- a/include/linux/ceph/messenger.h +++ b/include/linux/ceph/messenger.h | |||
| @@ -123,6 +123,7 @@ struct ceph_msg_pos { | |||
| 123 | #define SOCK_CLOSED 11 /* socket state changed to closed */ | 123 | #define SOCK_CLOSED 11 /* socket state changed to closed */ |
| 124 | #define OPENING 13 /* open connection w/ (possibly new) peer */ | 124 | #define OPENING 13 /* open connection w/ (possibly new) peer */ |
| 125 | #define DEAD 14 /* dead, about to kfree */ | 125 | #define DEAD 14 /* dead, about to kfree */ |
| 126 | #define BACKOFF 15 | ||
| 126 | 127 | ||
| 127 | /* | 128 | /* |
| 128 | * A single connection with another host. | 129 | * A single connection with another host. |
| @@ -160,7 +161,6 @@ struct ceph_connection { | |||
| 160 | struct list_head out_queue; | 161 | struct list_head out_queue; |
| 161 | struct list_head out_sent; /* sending or sent but unacked */ | 162 | struct list_head out_sent; /* sending or sent but unacked */ |
| 162 | u64 out_seq; /* last message queued for send */ | 163 | u64 out_seq; /* last message queued for send */ |
| 163 | bool out_keepalive_pending; | ||
| 164 | 164 | ||
| 165 | u64 in_seq, in_seq_acked; /* last message received, acked */ | 165 | u64 in_seq, in_seq_acked; /* last message received, acked */ |
| 166 | 166 | ||
diff --git a/include/linux/gfp.h b/include/linux/gfp.h index 0b84c61607e..dca31761b31 100644 --- a/include/linux/gfp.h +++ b/include/linux/gfp.h | |||
| @@ -332,16 +332,19 @@ alloc_pages(gfp_t gfp_mask, unsigned int order) | |||
| 332 | return alloc_pages_current(gfp_mask, order); | 332 | return alloc_pages_current(gfp_mask, order); |
| 333 | } | 333 | } |
| 334 | extern struct page *alloc_pages_vma(gfp_t gfp_mask, int order, | 334 | extern struct page *alloc_pages_vma(gfp_t gfp_mask, int order, |
| 335 | struct vm_area_struct *vma, unsigned long addr); | 335 | struct vm_area_struct *vma, unsigned long addr, |
| 336 | int node); | ||
| 336 | #else | 337 | #else |
| 337 | #define alloc_pages(gfp_mask, order) \ | 338 | #define alloc_pages(gfp_mask, order) \ |
| 338 | alloc_pages_node(numa_node_id(), gfp_mask, order) | 339 | alloc_pages_node(numa_node_id(), gfp_mask, order) |
| 339 | #define alloc_pages_vma(gfp_mask, order, vma, addr) \ | 340 | #define alloc_pages_vma(gfp_mask, order, vma, addr, node) \ |
| 340 | alloc_pages(gfp_mask, order) | 341 | alloc_pages(gfp_mask, order) |
| 341 | #endif | 342 | #endif |
| 342 | #define alloc_page(gfp_mask) alloc_pages(gfp_mask, 0) | 343 | #define alloc_page(gfp_mask) alloc_pages(gfp_mask, 0) |
| 343 | #define alloc_page_vma(gfp_mask, vma, addr) \ | 344 | #define alloc_page_vma(gfp_mask, vma, addr) \ |
| 344 | alloc_pages_vma(gfp_mask, 0, vma, addr) | 345 | alloc_pages_vma(gfp_mask, 0, vma, addr, numa_node_id()) |
| 346 | #define alloc_page_vma_node(gfp_mask, vma, addr, node) \ | ||
| 347 | alloc_pages_vma(gfp_mask, 0, vma, addr, node) | ||
| 345 | 348 | ||
| 346 | extern unsigned long __get_free_pages(gfp_t gfp_mask, unsigned int order); | 349 | extern unsigned long __get_free_pages(gfp_t gfp_mask, unsigned int order); |
| 347 | extern unsigned long get_zeroed_page(gfp_t gfp_mask); | 350 | extern unsigned long get_zeroed_page(gfp_t gfp_mask); |
diff --git a/include/linux/mfd/wm8994/core.h b/include/linux/mfd/wm8994/core.h index 3fd36845ca4..ef4f0b6083a 100644 --- a/include/linux/mfd/wm8994/core.h +++ b/include/linux/mfd/wm8994/core.h | |||
| @@ -71,6 +71,7 @@ struct wm8994 { | |||
| 71 | u16 irq_masks_cache[WM8994_NUM_IRQ_REGS]; | 71 | u16 irq_masks_cache[WM8994_NUM_IRQ_REGS]; |
| 72 | 72 | ||
| 73 | /* Used over suspend/resume */ | 73 | /* Used over suspend/resume */ |
| 74 | bool suspended; | ||
| 74 | u16 ldo_regs[WM8994_NUM_LDO_REGS]; | 75 | u16 ldo_regs[WM8994_NUM_LDO_REGS]; |
| 75 | u16 gpio_regs[WM8994_NUM_GPIO_REGS]; | 76 | u16 gpio_regs[WM8994_NUM_GPIO_REGS]; |
| 76 | 77 | ||
diff --git a/include/linux/ptrace.h b/include/linux/ptrace.h index 092a04f874a..a1147e5dd24 100644 --- a/include/linux/ptrace.h +++ b/include/linux/ptrace.h | |||
| @@ -102,11 +102,8 @@ | |||
| 102 | 102 | ||
| 103 | extern long arch_ptrace(struct task_struct *child, long request, | 103 | extern long arch_ptrace(struct task_struct *child, long request, |
| 104 | unsigned long addr, unsigned long data); | 104 | unsigned long addr, unsigned long data); |
| 105 | extern int ptrace_traceme(void); | ||
| 106 | extern int ptrace_readdata(struct task_struct *tsk, unsigned long src, char __user *dst, int len); | 105 | extern int ptrace_readdata(struct task_struct *tsk, unsigned long src, char __user *dst, int len); |
| 107 | extern int ptrace_writedata(struct task_struct *tsk, char __user *src, unsigned long dst, int len); | 106 | extern int ptrace_writedata(struct task_struct *tsk, char __user *src, unsigned long dst, int len); |
| 108 | extern int ptrace_attach(struct task_struct *tsk); | ||
| 109 | extern int ptrace_detach(struct task_struct *, unsigned int); | ||
| 110 | extern void ptrace_disable(struct task_struct *); | 107 | extern void ptrace_disable(struct task_struct *); |
| 111 | extern int ptrace_check_attach(struct task_struct *task, int kill); | 108 | extern int ptrace_check_attach(struct task_struct *task, int kill); |
| 112 | extern int ptrace_request(struct task_struct *child, long request, | 109 | extern int ptrace_request(struct task_struct *child, long request, |
diff --git a/include/trace/events/block.h b/include/trace/events/block.h index aba421d68f6..78f18adb49c 100644 --- a/include/trace/events/block.h +++ b/include/trace/events/block.h | |||
| @@ -31,7 +31,7 @@ DECLARE_EVENT_CLASS(block_rq_with_error, | |||
| 31 | 0 : blk_rq_sectors(rq); | 31 | 0 : blk_rq_sectors(rq); |
| 32 | __entry->errors = rq->errors; | 32 | __entry->errors = rq->errors; |
| 33 | 33 | ||
| 34 | blk_fill_rwbs_rq(__entry->rwbs, rq); | 34 | blk_fill_rwbs(__entry->rwbs, rq->cmd_flags, blk_rq_bytes(rq)); |
| 35 | blk_dump_cmd(__get_str(cmd), rq); | 35 | blk_dump_cmd(__get_str(cmd), rq); |
| 36 | ), | 36 | ), |
| 37 | 37 | ||
| @@ -118,7 +118,7 @@ DECLARE_EVENT_CLASS(block_rq, | |||
| 118 | __entry->bytes = (rq->cmd_type == REQ_TYPE_BLOCK_PC) ? | 118 | __entry->bytes = (rq->cmd_type == REQ_TYPE_BLOCK_PC) ? |
| 119 | blk_rq_bytes(rq) : 0; | 119 | blk_rq_bytes(rq) : 0; |
| 120 | 120 | ||
| 121 | blk_fill_rwbs_rq(__entry->rwbs, rq); | 121 | blk_fill_rwbs(__entry->rwbs, rq->cmd_flags, blk_rq_bytes(rq)); |
| 122 | blk_dump_cmd(__get_str(cmd), rq); | 122 | blk_dump_cmd(__get_str(cmd), rq); |
| 123 | memcpy(__entry->comm, current->comm, TASK_COMM_LEN); | 123 | memcpy(__entry->comm, current->comm, TASK_COMM_LEN); |
| 124 | ), | 124 | ), |
| @@ -563,7 +563,7 @@ TRACE_EVENT(block_rq_remap, | |||
| 563 | __entry->nr_sector = blk_rq_sectors(rq); | 563 | __entry->nr_sector = blk_rq_sectors(rq); |
| 564 | __entry->old_dev = dev; | 564 | __entry->old_dev = dev; |
| 565 | __entry->old_sector = from; | 565 | __entry->old_sector = from; |
| 566 | blk_fill_rwbs_rq(__entry->rwbs, rq); | 566 | blk_fill_rwbs(__entry->rwbs, rq->cmd_flags, blk_rq_bytes(rq)); |
| 567 | ), | 567 | ), |
| 568 | 568 | ||
| 569 | TP_printk("%d,%d %s %llu + %u <- (%d,%d) %llu", | 569 | TP_printk("%d,%d %s %llu + %u <- (%d,%d) %llu", |
diff --git a/kernel/cpuset.c b/kernel/cpuset.c index 4349935c2ad..e92e9818903 100644 --- a/kernel/cpuset.c +++ b/kernel/cpuset.c | |||
| @@ -1575,8 +1575,10 @@ static int cpuset_write_resmask(struct cgroup *cgrp, struct cftype *cft, | |||
| 1575 | return -ENODEV; | 1575 | return -ENODEV; |
| 1576 | 1576 | ||
| 1577 | trialcs = alloc_trial_cpuset(cs); | 1577 | trialcs = alloc_trial_cpuset(cs); |
| 1578 | if (!trialcs) | 1578 | if (!trialcs) { |
| 1579 | return -ENOMEM; | 1579 | retval = -ENOMEM; |
| 1580 | goto out; | ||
| 1581 | } | ||
| 1580 | 1582 | ||
| 1581 | switch (cft->private) { | 1583 | switch (cft->private) { |
| 1582 | case FILE_CPULIST: | 1584 | case FILE_CPULIST: |
| @@ -1591,6 +1593,7 @@ static int cpuset_write_resmask(struct cgroup *cgrp, struct cftype *cft, | |||
| 1591 | } | 1593 | } |
| 1592 | 1594 | ||
| 1593 | free_trial_cpuset(trialcs); | 1595 | free_trial_cpuset(trialcs); |
| 1596 | out: | ||
| 1594 | cgroup_unlock(); | 1597 | cgroup_unlock(); |
| 1595 | return retval; | 1598 | return retval; |
| 1596 | } | 1599 | } |
diff --git a/kernel/ptrace.c b/kernel/ptrace.c index 1708b1e2972..e2302e40b36 100644 --- a/kernel/ptrace.c +++ b/kernel/ptrace.c | |||
| @@ -163,7 +163,7 @@ bool ptrace_may_access(struct task_struct *task, unsigned int mode) | |||
| 163 | return !err; | 163 | return !err; |
| 164 | } | 164 | } |
| 165 | 165 | ||
| 166 | int ptrace_attach(struct task_struct *task) | 166 | static int ptrace_attach(struct task_struct *task) |
| 167 | { | 167 | { |
| 168 | int retval; | 168 | int retval; |
| 169 | 169 | ||
| @@ -219,7 +219,7 @@ out: | |||
| 219 | * Performs checks and sets PT_PTRACED. | 219 | * Performs checks and sets PT_PTRACED. |
| 220 | * Should be used by all ptrace implementations for PTRACE_TRACEME. | 220 | * Should be used by all ptrace implementations for PTRACE_TRACEME. |
| 221 | */ | 221 | */ |
| 222 | int ptrace_traceme(void) | 222 | static int ptrace_traceme(void) |
| 223 | { | 223 | { |
| 224 | int ret = -EPERM; | 224 | int ret = -EPERM; |
| 225 | 225 | ||
| @@ -293,7 +293,7 @@ static bool __ptrace_detach(struct task_struct *tracer, struct task_struct *p) | |||
| 293 | return false; | 293 | return false; |
| 294 | } | 294 | } |
| 295 | 295 | ||
| 296 | int ptrace_detach(struct task_struct *child, unsigned int data) | 296 | static int ptrace_detach(struct task_struct *child, unsigned int data) |
| 297 | { | 297 | { |
| 298 | bool dead = false; | 298 | bool dead = false; |
| 299 | 299 | ||
diff --git a/kernel/trace/blktrace.c b/kernel/trace/blktrace.c index d95721f3370..cbafed7d4f3 100644 --- a/kernel/trace/blktrace.c +++ b/kernel/trace/blktrace.c | |||
| @@ -1827,21 +1827,5 @@ void blk_fill_rwbs(char *rwbs, u32 rw, int bytes) | |||
| 1827 | rwbs[i] = '\0'; | 1827 | rwbs[i] = '\0'; |
| 1828 | } | 1828 | } |
| 1829 | 1829 | ||
| 1830 | void blk_fill_rwbs_rq(char *rwbs, struct request *rq) | ||
| 1831 | { | ||
| 1832 | int rw = rq->cmd_flags & 0x03; | ||
| 1833 | int bytes; | ||
| 1834 | |||
| 1835 | if (rq->cmd_flags & REQ_DISCARD) | ||
| 1836 | rw |= REQ_DISCARD; | ||
| 1837 | |||
| 1838 | if (rq->cmd_flags & REQ_SECURE) | ||
| 1839 | rw |= REQ_SECURE; | ||
| 1840 | |||
| 1841 | bytes = blk_rq_bytes(rq); | ||
| 1842 | |||
| 1843 | blk_fill_rwbs(rwbs, rw, bytes); | ||
| 1844 | } | ||
| 1845 | |||
| 1846 | #endif /* CONFIG_EVENT_TRACING */ | 1830 | #endif /* CONFIG_EVENT_TRACING */ |
| 1847 | 1831 | ||
diff --git a/lib/nlattr.c b/lib/nlattr.c index 5021cbc3441..ac09f2226dc 100644 --- a/lib/nlattr.c +++ b/lib/nlattr.c | |||
| @@ -148,7 +148,7 @@ nla_policy_len(const struct nla_policy *p, int n) | |||
| 148 | { | 148 | { |
| 149 | int i, len = 0; | 149 | int i, len = 0; |
| 150 | 150 | ||
| 151 | for (i = 0; i < n; i++) { | 151 | for (i = 0; i < n; i++, p++) { |
| 152 | if (p->len) | 152 | if (p->len) |
| 153 | len += nla_total_size(p->len); | 153 | len += nla_total_size(p->len); |
| 154 | else if (nla_attr_minlen[p->type]) | 154 | else if (nla_attr_minlen[p->type]) |
diff --git a/mm/huge_memory.c b/mm/huge_memory.c index 3e29781ee76..dbe99a5f207 100644 --- a/mm/huge_memory.c +++ b/mm/huge_memory.c | |||
| @@ -650,10 +650,10 @@ static inline gfp_t alloc_hugepage_gfpmask(int defrag) | |||
| 650 | 650 | ||
| 651 | static inline struct page *alloc_hugepage_vma(int defrag, | 651 | static inline struct page *alloc_hugepage_vma(int defrag, |
| 652 | struct vm_area_struct *vma, | 652 | struct vm_area_struct *vma, |
| 653 | unsigned long haddr) | 653 | unsigned long haddr, int nd) |
| 654 | { | 654 | { |
| 655 | return alloc_pages_vma(alloc_hugepage_gfpmask(defrag), | 655 | return alloc_pages_vma(alloc_hugepage_gfpmask(defrag), |
| 656 | HPAGE_PMD_ORDER, vma, haddr); | 656 | HPAGE_PMD_ORDER, vma, haddr, nd); |
| 657 | } | 657 | } |
| 658 | 658 | ||
| 659 | #ifndef CONFIG_NUMA | 659 | #ifndef CONFIG_NUMA |
| @@ -678,7 +678,7 @@ int do_huge_pmd_anonymous_page(struct mm_struct *mm, struct vm_area_struct *vma, | |||
| 678 | if (unlikely(khugepaged_enter(vma))) | 678 | if (unlikely(khugepaged_enter(vma))) |
| 679 | return VM_FAULT_OOM; | 679 | return VM_FAULT_OOM; |
| 680 | page = alloc_hugepage_vma(transparent_hugepage_defrag(vma), | 680 | page = alloc_hugepage_vma(transparent_hugepage_defrag(vma), |
| 681 | vma, haddr); | 681 | vma, haddr, numa_node_id()); |
| 682 | if (unlikely(!page)) | 682 | if (unlikely(!page)) |
| 683 | goto out; | 683 | goto out; |
| 684 | if (unlikely(mem_cgroup_newpage_charge(page, mm, GFP_KERNEL))) { | 684 | if (unlikely(mem_cgroup_newpage_charge(page, mm, GFP_KERNEL))) { |
| @@ -799,8 +799,8 @@ static int do_huge_pmd_wp_page_fallback(struct mm_struct *mm, | |||
| 799 | } | 799 | } |
| 800 | 800 | ||
| 801 | for (i = 0; i < HPAGE_PMD_NR; i++) { | 801 | for (i = 0; i < HPAGE_PMD_NR; i++) { |
| 802 | pages[i] = alloc_page_vma(GFP_HIGHUSER_MOVABLE, | 802 | pages[i] = alloc_page_vma_node(GFP_HIGHUSER_MOVABLE, |
| 803 | vma, address); | 803 | vma, address, page_to_nid(page)); |
| 804 | if (unlikely(!pages[i] || | 804 | if (unlikely(!pages[i] || |
| 805 | mem_cgroup_newpage_charge(pages[i], mm, | 805 | mem_cgroup_newpage_charge(pages[i], mm, |
| 806 | GFP_KERNEL))) { | 806 | GFP_KERNEL))) { |
| @@ -902,7 +902,7 @@ int do_huge_pmd_wp_page(struct mm_struct *mm, struct vm_area_struct *vma, | |||
| 902 | if (transparent_hugepage_enabled(vma) && | 902 | if (transparent_hugepage_enabled(vma) && |
| 903 | !transparent_hugepage_debug_cow()) | 903 | !transparent_hugepage_debug_cow()) |
| 904 | new_page = alloc_hugepage_vma(transparent_hugepage_defrag(vma), | 904 | new_page = alloc_hugepage_vma(transparent_hugepage_defrag(vma), |
| 905 | vma, haddr); | 905 | vma, haddr, numa_node_id()); |
| 906 | else | 906 | else |
| 907 | new_page = NULL; | 907 | new_page = NULL; |
| 908 | 908 | ||
| @@ -1745,7 +1745,8 @@ static void __collapse_huge_page_copy(pte_t *pte, struct page *page, | |||
| 1745 | static void collapse_huge_page(struct mm_struct *mm, | 1745 | static void collapse_huge_page(struct mm_struct *mm, |
| 1746 | unsigned long address, | 1746 | unsigned long address, |
| 1747 | struct page **hpage, | 1747 | struct page **hpage, |
| 1748 | struct vm_area_struct *vma) | 1748 | struct vm_area_struct *vma, |
| 1749 | int node) | ||
| 1749 | { | 1750 | { |
| 1750 | pgd_t *pgd; | 1751 | pgd_t *pgd; |
| 1751 | pud_t *pud; | 1752 | pud_t *pud; |
| @@ -1773,7 +1774,8 @@ static void collapse_huge_page(struct mm_struct *mm, | |||
| 1773 | * mmap_sem in read mode is good idea also to allow greater | 1774 | * mmap_sem in read mode is good idea also to allow greater |
| 1774 | * scalability. | 1775 | * scalability. |
| 1775 | */ | 1776 | */ |
| 1776 | new_page = alloc_hugepage_vma(khugepaged_defrag(), vma, address); | 1777 | new_page = alloc_hugepage_vma(khugepaged_defrag(), vma, address, |
| 1778 | node); | ||
| 1777 | if (unlikely(!new_page)) { | 1779 | if (unlikely(!new_page)) { |
| 1778 | up_read(&mm->mmap_sem); | 1780 | up_read(&mm->mmap_sem); |
| 1779 | *hpage = ERR_PTR(-ENOMEM); | 1781 | *hpage = ERR_PTR(-ENOMEM); |
| @@ -1919,6 +1921,7 @@ static int khugepaged_scan_pmd(struct mm_struct *mm, | |||
| 1919 | struct page *page; | 1921 | struct page *page; |
| 1920 | unsigned long _address; | 1922 | unsigned long _address; |
| 1921 | spinlock_t *ptl; | 1923 | spinlock_t *ptl; |
| 1924 | int node = -1; | ||
| 1922 | 1925 | ||
| 1923 | VM_BUG_ON(address & ~HPAGE_PMD_MASK); | 1926 | VM_BUG_ON(address & ~HPAGE_PMD_MASK); |
| 1924 | 1927 | ||
| @@ -1949,6 +1952,13 @@ static int khugepaged_scan_pmd(struct mm_struct *mm, | |||
| 1949 | page = vm_normal_page(vma, _address, pteval); | 1952 | page = vm_normal_page(vma, _address, pteval); |
| 1950 | if (unlikely(!page)) | 1953 | if (unlikely(!page)) |
| 1951 | goto out_unmap; | 1954 | goto out_unmap; |
| 1955 | /* | ||
| 1956 | * Chose the node of the first page. This could | ||
| 1957 | * be more sophisticated and look at more pages, | ||
| 1958 | * but isn't for now. | ||
| 1959 | */ | ||
| 1960 | if (node == -1) | ||
| 1961 | node = page_to_nid(page); | ||
| 1952 | VM_BUG_ON(PageCompound(page)); | 1962 | VM_BUG_ON(PageCompound(page)); |
| 1953 | if (!PageLRU(page) || PageLocked(page) || !PageAnon(page)) | 1963 | if (!PageLRU(page) || PageLocked(page) || !PageAnon(page)) |
| 1954 | goto out_unmap; | 1964 | goto out_unmap; |
| @@ -1965,7 +1975,7 @@ out_unmap: | |||
| 1965 | pte_unmap_unlock(pte, ptl); | 1975 | pte_unmap_unlock(pte, ptl); |
| 1966 | if (ret) | 1976 | if (ret) |
| 1967 | /* collapse_huge_page will return with the mmap_sem released */ | 1977 | /* collapse_huge_page will return with the mmap_sem released */ |
| 1968 | collapse_huge_page(mm, address, hpage, vma); | 1978 | collapse_huge_page(mm, address, hpage, vma, node); |
| 1969 | out: | 1979 | out: |
| 1970 | return ret; | 1980 | return ret; |
| 1971 | } | 1981 | } |
diff --git a/mm/mempolicy.c b/mm/mempolicy.c index 49355a970be..b53ec99f142 100644 --- a/mm/mempolicy.c +++ b/mm/mempolicy.c | |||
| @@ -1524,10 +1524,9 @@ static nodemask_t *policy_nodemask(gfp_t gfp, struct mempolicy *policy) | |||
| 1524 | } | 1524 | } |
| 1525 | 1525 | ||
| 1526 | /* Return a zonelist indicated by gfp for node representing a mempolicy */ | 1526 | /* Return a zonelist indicated by gfp for node representing a mempolicy */ |
| 1527 | static struct zonelist *policy_zonelist(gfp_t gfp, struct mempolicy *policy) | 1527 | static struct zonelist *policy_zonelist(gfp_t gfp, struct mempolicy *policy, |
| 1528 | int nd) | ||
| 1528 | { | 1529 | { |
| 1529 | int nd = numa_node_id(); | ||
| 1530 | |||
| 1531 | switch (policy->mode) { | 1530 | switch (policy->mode) { |
| 1532 | case MPOL_PREFERRED: | 1531 | case MPOL_PREFERRED: |
| 1533 | if (!(policy->flags & MPOL_F_LOCAL)) | 1532 | if (!(policy->flags & MPOL_F_LOCAL)) |
| @@ -1679,7 +1678,7 @@ struct zonelist *huge_zonelist(struct vm_area_struct *vma, unsigned long addr, | |||
| 1679 | zl = node_zonelist(interleave_nid(*mpol, vma, addr, | 1678 | zl = node_zonelist(interleave_nid(*mpol, vma, addr, |
| 1680 | huge_page_shift(hstate_vma(vma))), gfp_flags); | 1679 | huge_page_shift(hstate_vma(vma))), gfp_flags); |
| 1681 | } else { | 1680 | } else { |
| 1682 | zl = policy_zonelist(gfp_flags, *mpol); | 1681 | zl = policy_zonelist(gfp_flags, *mpol, numa_node_id()); |
| 1683 | if ((*mpol)->mode == MPOL_BIND) | 1682 | if ((*mpol)->mode == MPOL_BIND) |
| 1684 | *nodemask = &(*mpol)->v.nodes; | 1683 | *nodemask = &(*mpol)->v.nodes; |
| 1685 | } | 1684 | } |
| @@ -1820,7 +1819,7 @@ static struct page *alloc_page_interleave(gfp_t gfp, unsigned order, | |||
| 1820 | */ | 1819 | */ |
| 1821 | struct page * | 1820 | struct page * |
| 1822 | alloc_pages_vma(gfp_t gfp, int order, struct vm_area_struct *vma, | 1821 | alloc_pages_vma(gfp_t gfp, int order, struct vm_area_struct *vma, |
| 1823 | unsigned long addr) | 1822 | unsigned long addr, int node) |
| 1824 | { | 1823 | { |
| 1825 | struct mempolicy *pol = get_vma_policy(current, vma, addr); | 1824 | struct mempolicy *pol = get_vma_policy(current, vma, addr); |
| 1826 | struct zonelist *zl; | 1825 | struct zonelist *zl; |
| @@ -1836,7 +1835,7 @@ alloc_pages_vma(gfp_t gfp, int order, struct vm_area_struct *vma, | |||
| 1836 | put_mems_allowed(); | 1835 | put_mems_allowed(); |
| 1837 | return page; | 1836 | return page; |
| 1838 | } | 1837 | } |
| 1839 | zl = policy_zonelist(gfp, pol); | 1838 | zl = policy_zonelist(gfp, pol, node); |
| 1840 | if (unlikely(mpol_needs_cond_ref(pol))) { | 1839 | if (unlikely(mpol_needs_cond_ref(pol))) { |
| 1841 | /* | 1840 | /* |
| 1842 | * slow path: ref counted shared policy | 1841 | * slow path: ref counted shared policy |
| @@ -1892,7 +1891,8 @@ struct page *alloc_pages_current(gfp_t gfp, unsigned order) | |||
| 1892 | page = alloc_page_interleave(gfp, order, interleave_nodes(pol)); | 1891 | page = alloc_page_interleave(gfp, order, interleave_nodes(pol)); |
| 1893 | else | 1892 | else |
| 1894 | page = __alloc_pages_nodemask(gfp, order, | 1893 | page = __alloc_pages_nodemask(gfp, order, |
| 1895 | policy_zonelist(gfp, pol), policy_nodemask(gfp, pol)); | 1894 | policy_zonelist(gfp, pol, numa_node_id()), |
| 1895 | policy_nodemask(gfp, pol)); | ||
| 1896 | put_mems_allowed(); | 1896 | put_mems_allowed(); |
| 1897 | return page; | 1897 | return page; |
| 1898 | } | 1898 | } |
diff --git a/net/ceph/messenger.c b/net/ceph/messenger.c index 35b36b86d76..05f357828a2 100644 --- a/net/ceph/messenger.c +++ b/net/ceph/messenger.c | |||
| @@ -336,7 +336,6 @@ static void reset_connection(struct ceph_connection *con) | |||
| 336 | ceph_msg_put(con->out_msg); | 336 | ceph_msg_put(con->out_msg); |
| 337 | con->out_msg = NULL; | 337 | con->out_msg = NULL; |
| 338 | } | 338 | } |
| 339 | con->out_keepalive_pending = false; | ||
| 340 | con->in_seq = 0; | 339 | con->in_seq = 0; |
| 341 | con->in_seq_acked = 0; | 340 | con->in_seq_acked = 0; |
| 342 | } | 341 | } |
| @@ -1248,8 +1247,6 @@ static int process_connect(struct ceph_connection *con) | |||
| 1248 | con->auth_retry); | 1247 | con->auth_retry); |
| 1249 | if (con->auth_retry == 2) { | 1248 | if (con->auth_retry == 2) { |
| 1250 | con->error_msg = "connect authorization failure"; | 1249 | con->error_msg = "connect authorization failure"; |
| 1251 | reset_connection(con); | ||
| 1252 | set_bit(CLOSED, &con->state); | ||
| 1253 | return -1; | 1250 | return -1; |
| 1254 | } | 1251 | } |
| 1255 | con->auth_retry = 1; | 1252 | con->auth_retry = 1; |
| @@ -1715,14 +1712,6 @@ more: | |||
| 1715 | 1712 | ||
| 1716 | /* open the socket first? */ | 1713 | /* open the socket first? */ |
| 1717 | if (con->sock == NULL) { | 1714 | if (con->sock == NULL) { |
| 1718 | /* | ||
| 1719 | * if we were STANDBY and are reconnecting _this_ | ||
| 1720 | * connection, bump connect_seq now. Always bump | ||
| 1721 | * global_seq. | ||
| 1722 | */ | ||
| 1723 | if (test_and_clear_bit(STANDBY, &con->state)) | ||
| 1724 | con->connect_seq++; | ||
| 1725 | |||
| 1726 | prepare_write_banner(msgr, con); | 1715 | prepare_write_banner(msgr, con); |
| 1727 | prepare_write_connect(msgr, con, 1); | 1716 | prepare_write_connect(msgr, con, 1); |
| 1728 | prepare_read_banner(con); | 1717 | prepare_read_banner(con); |
| @@ -1951,7 +1940,24 @@ static void con_work(struct work_struct *work) | |||
| 1951 | work.work); | 1940 | work.work); |
| 1952 | 1941 | ||
| 1953 | mutex_lock(&con->mutex); | 1942 | mutex_lock(&con->mutex); |
| 1943 | if (test_and_clear_bit(BACKOFF, &con->state)) { | ||
| 1944 | dout("con_work %p backing off\n", con); | ||
| 1945 | if (queue_delayed_work(ceph_msgr_wq, &con->work, | ||
| 1946 | round_jiffies_relative(con->delay))) { | ||
| 1947 | dout("con_work %p backoff %lu\n", con, con->delay); | ||
| 1948 | mutex_unlock(&con->mutex); | ||
| 1949 | return; | ||
| 1950 | } else { | ||
| 1951 | con->ops->put(con); | ||
| 1952 | dout("con_work %p FAILED to back off %lu\n", con, | ||
| 1953 | con->delay); | ||
| 1954 | } | ||
| 1955 | } | ||
| 1954 | 1956 | ||
| 1957 | if (test_bit(STANDBY, &con->state)) { | ||
| 1958 | dout("con_work %p STANDBY\n", con); | ||
| 1959 | goto done; | ||
| 1960 | } | ||
| 1955 | if (test_bit(CLOSED, &con->state)) { /* e.g. if we are replaced */ | 1961 | if (test_bit(CLOSED, &con->state)) { /* e.g. if we are replaced */ |
| 1956 | dout("con_work CLOSED\n"); | 1962 | dout("con_work CLOSED\n"); |
| 1957 | con_close_socket(con); | 1963 | con_close_socket(con); |
| @@ -2008,10 +2014,12 @@ static void ceph_fault(struct ceph_connection *con) | |||
| 2008 | /* Requeue anything that hasn't been acked */ | 2014 | /* Requeue anything that hasn't been acked */ |
| 2009 | list_splice_init(&con->out_sent, &con->out_queue); | 2015 | list_splice_init(&con->out_sent, &con->out_queue); |
| 2010 | 2016 | ||
| 2011 | /* If there are no messages in the queue, place the connection | 2017 | /* If there are no messages queued or keepalive pending, place |
| 2012 | * in a STANDBY state (i.e., don't try to reconnect just yet). */ | 2018 | * the connection in a STANDBY state */ |
| 2013 | if (list_empty(&con->out_queue) && !con->out_keepalive_pending) { | 2019 | if (list_empty(&con->out_queue) && |
| 2014 | dout("fault setting STANDBY\n"); | 2020 | !test_bit(KEEPALIVE_PENDING, &con->state)) { |
| 2021 | dout("fault %p setting STANDBY clearing WRITE_PENDING\n", con); | ||
| 2022 | clear_bit(WRITE_PENDING, &con->state); | ||
| 2015 | set_bit(STANDBY, &con->state); | 2023 | set_bit(STANDBY, &con->state); |
| 2016 | } else { | 2024 | } else { |
| 2017 | /* retry after a delay. */ | 2025 | /* retry after a delay. */ |
| @@ -2019,11 +2027,24 @@ static void ceph_fault(struct ceph_connection *con) | |||
| 2019 | con->delay = BASE_DELAY_INTERVAL; | 2027 | con->delay = BASE_DELAY_INTERVAL; |
| 2020 | else if (con->delay < MAX_DELAY_INTERVAL) | 2028 | else if (con->delay < MAX_DELAY_INTERVAL) |
| 2021 | con->delay *= 2; | 2029 | con->delay *= 2; |
| 2022 | dout("fault queueing %p delay %lu\n", con, con->delay); | ||
| 2023 | con->ops->get(con); | 2030 | con->ops->get(con); |
| 2024 | if (queue_delayed_work(ceph_msgr_wq, &con->work, | 2031 | if (queue_delayed_work(ceph_msgr_wq, &con->work, |
| 2025 | round_jiffies_relative(con->delay)) == 0) | 2032 | round_jiffies_relative(con->delay))) { |
| 2033 | dout("fault queued %p delay %lu\n", con, con->delay); | ||
| 2034 | } else { | ||
| 2026 | con->ops->put(con); | 2035 | con->ops->put(con); |
| 2036 | dout("fault failed to queue %p delay %lu, backoff\n", | ||
| 2037 | con, con->delay); | ||
| 2038 | /* | ||
| 2039 | * In many cases we see a socket state change | ||
| 2040 | * while con_work is running and end up | ||
| 2041 | * queuing (non-delayed) work, such that we | ||
| 2042 | * can't backoff with a delay. Set a flag so | ||
| 2043 | * that when con_work restarts we schedule the | ||
| 2044 | * delay then. | ||
| 2045 | */ | ||
| 2046 | set_bit(BACKOFF, &con->state); | ||
| 2047 | } | ||
| 2027 | } | 2048 | } |
| 2028 | 2049 | ||
| 2029 | out_unlock: | 2050 | out_unlock: |
| @@ -2094,6 +2115,19 @@ void ceph_messenger_destroy(struct ceph_messenger *msgr) | |||
| 2094 | } | 2115 | } |
| 2095 | EXPORT_SYMBOL(ceph_messenger_destroy); | 2116 | EXPORT_SYMBOL(ceph_messenger_destroy); |
| 2096 | 2117 | ||
| 2118 | static void clear_standby(struct ceph_connection *con) | ||
| 2119 | { | ||
| 2120 | /* come back from STANDBY? */ | ||
| 2121 | if (test_and_clear_bit(STANDBY, &con->state)) { | ||
| 2122 | mutex_lock(&con->mutex); | ||
| 2123 | dout("clear_standby %p and ++connect_seq\n", con); | ||
| 2124 | con->connect_seq++; | ||
| 2125 | WARN_ON(test_bit(WRITE_PENDING, &con->state)); | ||
| 2126 | WARN_ON(test_bit(KEEPALIVE_PENDING, &con->state)); | ||
| 2127 | mutex_unlock(&con->mutex); | ||
| 2128 | } | ||
| 2129 | } | ||
| 2130 | |||
| 2097 | /* | 2131 | /* |
| 2098 | * Queue up an outgoing message on the given connection. | 2132 | * Queue up an outgoing message on the given connection. |
| 2099 | */ | 2133 | */ |
| @@ -2126,6 +2160,7 @@ void ceph_con_send(struct ceph_connection *con, struct ceph_msg *msg) | |||
| 2126 | 2160 | ||
| 2127 | /* if there wasn't anything waiting to send before, queue | 2161 | /* if there wasn't anything waiting to send before, queue |
| 2128 | * new work */ | 2162 | * new work */ |
| 2163 | clear_standby(con); | ||
| 2129 | if (test_and_set_bit(WRITE_PENDING, &con->state) == 0) | 2164 | if (test_and_set_bit(WRITE_PENDING, &con->state) == 0) |
| 2130 | queue_con(con); | 2165 | queue_con(con); |
| 2131 | } | 2166 | } |
| @@ -2191,6 +2226,8 @@ void ceph_con_revoke_message(struct ceph_connection *con, struct ceph_msg *msg) | |||
| 2191 | */ | 2226 | */ |
| 2192 | void ceph_con_keepalive(struct ceph_connection *con) | 2227 | void ceph_con_keepalive(struct ceph_connection *con) |
| 2193 | { | 2228 | { |
| 2229 | dout("con_keepalive %p\n", con); | ||
| 2230 | clear_standby(con); | ||
| 2194 | if (test_and_set_bit(KEEPALIVE_PENDING, &con->state) == 0 && | 2231 | if (test_and_set_bit(KEEPALIVE_PENDING, &con->state) == 0 && |
| 2195 | test_and_set_bit(WRITE_PENDING, &con->state) == 0) | 2232 | test_and_set_bit(WRITE_PENDING, &con->state) == 0) |
| 2196 | queue_con(con); | 2233 | queue_con(con); |
diff --git a/net/ceph/pagevec.c b/net/ceph/pagevec.c index 1a040e64c69..cd9c21df87d 100644 --- a/net/ceph/pagevec.c +++ b/net/ceph/pagevec.c | |||
| @@ -16,22 +16,30 @@ struct page **ceph_get_direct_page_vector(const char __user *data, | |||
| 16 | int num_pages, bool write_page) | 16 | int num_pages, bool write_page) |
| 17 | { | 17 | { |
| 18 | struct page **pages; | 18 | struct page **pages; |
| 19 | int rc; | 19 | int got = 0; |
| 20 | int rc = 0; | ||
| 20 | 21 | ||
| 21 | pages = kmalloc(sizeof(*pages) * num_pages, GFP_NOFS); | 22 | pages = kmalloc(sizeof(*pages) * num_pages, GFP_NOFS); |
| 22 | if (!pages) | 23 | if (!pages) |
| 23 | return ERR_PTR(-ENOMEM); | 24 | return ERR_PTR(-ENOMEM); |
| 24 | 25 | ||
| 25 | down_read(¤t->mm->mmap_sem); | 26 | down_read(¤t->mm->mmap_sem); |
| 26 | rc = get_user_pages(current, current->mm, (unsigned long)data, | 27 | while (got < num_pages) { |
| 27 | num_pages, write_page, 0, pages, NULL); | 28 | rc = get_user_pages(current, current->mm, |
| 29 | (unsigned long)data + ((unsigned long)got * PAGE_SIZE), | ||
| 30 | num_pages - got, write_page, 0, pages + got, NULL); | ||
| 31 | if (rc < 0) | ||
| 32 | break; | ||
| 33 | BUG_ON(rc == 0); | ||
| 34 | got += rc; | ||
| 35 | } | ||
| 28 | up_read(¤t->mm->mmap_sem); | 36 | up_read(¤t->mm->mmap_sem); |
| 29 | if (rc < num_pages) | 37 | if (rc < 0) |
| 30 | goto fail; | 38 | goto fail; |
| 31 | return pages; | 39 | return pages; |
| 32 | 40 | ||
| 33 | fail: | 41 | fail: |
| 34 | ceph_put_page_vector(pages, rc > 0 ? rc : 0, false); | 42 | ceph_put_page_vector(pages, got, false); |
| 35 | return ERR_PTR(rc); | 43 | return ERR_PTR(rc); |
| 36 | } | 44 | } |
| 37 | EXPORT_SYMBOL(ceph_get_direct_page_vector); | 45 | EXPORT_SYMBOL(ceph_get_direct_page_vector); |
diff --git a/net/core/dev_addr_lists.c b/net/core/dev_addr_lists.c index 508f9c18992..133fd22ea28 100644 --- a/net/core/dev_addr_lists.c +++ b/net/core/dev_addr_lists.c | |||
| @@ -144,7 +144,7 @@ void __hw_addr_del_multiple(struct netdev_hw_addr_list *to_list, | |||
| 144 | 144 | ||
| 145 | list_for_each_entry(ha, &from_list->list, list) { | 145 | list_for_each_entry(ha, &from_list->list, list) { |
| 146 | type = addr_type ? addr_type : ha->type; | 146 | type = addr_type ? addr_type : ha->type; |
| 147 | __hw_addr_del(to_list, ha->addr, addr_len, addr_type); | 147 | __hw_addr_del(to_list, ha->addr, addr_len, type); |
| 148 | } | 148 | } |
| 149 | } | 149 | } |
| 150 | EXPORT_SYMBOL(__hw_addr_del_multiple); | 150 | EXPORT_SYMBOL(__hw_addr_del_multiple); |
diff --git a/net/dcb/dcbnl.c b/net/dcb/dcbnl.c index d5074a56728..c44348adba3 100644 --- a/net/dcb/dcbnl.c +++ b/net/dcb/dcbnl.c | |||
| @@ -1193,7 +1193,7 @@ static int dcbnl_ieee_set(struct net_device *netdev, struct nlattr **tb, | |||
| 1193 | goto err; | 1193 | goto err; |
| 1194 | } | 1194 | } |
| 1195 | 1195 | ||
| 1196 | if (ieee[DCB_ATTR_IEEE_PFC] && ops->ieee_setets) { | 1196 | if (ieee[DCB_ATTR_IEEE_PFC] && ops->ieee_setpfc) { |
| 1197 | struct ieee_pfc *pfc = nla_data(ieee[DCB_ATTR_IEEE_PFC]); | 1197 | struct ieee_pfc *pfc = nla_data(ieee[DCB_ATTR_IEEE_PFC]); |
| 1198 | err = ops->ieee_setpfc(netdev, pfc); | 1198 | err = ops->ieee_setpfc(netdev, pfc); |
| 1199 | if (err) | 1199 | if (err) |
diff --git a/net/dccp/input.c b/net/dccp/input.c index 8cde009e8b8..4222e7a654b 100644 --- a/net/dccp/input.c +++ b/net/dccp/input.c | |||
| @@ -614,6 +614,9 @@ int dccp_rcv_state_process(struct sock *sk, struct sk_buff *skb, | |||
| 614 | /* Caller (dccp_v4_do_rcv) will send Reset */ | 614 | /* Caller (dccp_v4_do_rcv) will send Reset */ |
| 615 | dcb->dccpd_reset_code = DCCP_RESET_CODE_NO_CONNECTION; | 615 | dcb->dccpd_reset_code = DCCP_RESET_CODE_NO_CONNECTION; |
| 616 | return 1; | 616 | return 1; |
| 617 | } else if (sk->sk_state == DCCP_CLOSED) { | ||
| 618 | dcb->dccpd_reset_code = DCCP_RESET_CODE_NO_CONNECTION; | ||
| 619 | return 1; | ||
| 617 | } | 620 | } |
| 618 | 621 | ||
| 619 | if (sk->sk_state != DCCP_REQUESTING && sk->sk_state != DCCP_RESPOND) { | 622 | if (sk->sk_state != DCCP_REQUESTING && sk->sk_state != DCCP_RESPOND) { |
| @@ -668,10 +671,6 @@ int dccp_rcv_state_process(struct sock *sk, struct sk_buff *skb, | |||
| 668 | } | 671 | } |
| 669 | 672 | ||
| 670 | switch (sk->sk_state) { | 673 | switch (sk->sk_state) { |
| 671 | case DCCP_CLOSED: | ||
| 672 | dcb->dccpd_reset_code = DCCP_RESET_CODE_NO_CONNECTION; | ||
| 673 | return 1; | ||
| 674 | |||
| 675 | case DCCP_REQUESTING: | 674 | case DCCP_REQUESTING: |
| 676 | queued = dccp_rcv_request_sent_state_process(sk, skb, dh, len); | 675 | queued = dccp_rcv_request_sent_state_process(sk, skb, dh, len); |
| 677 | if (queued >= 0) | 676 | if (queued >= 0) |
diff --git a/net/dns_resolver/dns_key.c b/net/dns_resolver/dns_key.c index 739435a6af3..cfa7a5e1c5c 100644 --- a/net/dns_resolver/dns_key.c +++ b/net/dns_resolver/dns_key.c | |||
| @@ -67,8 +67,9 @@ dns_resolver_instantiate(struct key *key, const void *_data, size_t datalen) | |||
| 67 | size_t result_len = 0; | 67 | size_t result_len = 0; |
| 68 | const char *data = _data, *end, *opt; | 68 | const char *data = _data, *end, *opt; |
| 69 | 69 | ||
| 70 | kenter("%%%d,%s,'%s',%zu", | 70 | kenter("%%%d,%s,'%*.*s',%zu", |
| 71 | key->serial, key->description, data, datalen); | 71 | key->serial, key->description, |
| 72 | (int)datalen, (int)datalen, data, datalen); | ||
| 72 | 73 | ||
| 73 | if (datalen <= 1 || !data || data[datalen - 1] != '\0') | 74 | if (datalen <= 1 || !data || data[datalen - 1] != '\0') |
| 74 | return -EINVAL; | 75 | return -EINVAL; |
| @@ -217,6 +218,19 @@ static void dns_resolver_describe(const struct key *key, struct seq_file *m) | |||
| 217 | seq_printf(m, ": %u", key->datalen); | 218 | seq_printf(m, ": %u", key->datalen); |
| 218 | } | 219 | } |
| 219 | 220 | ||
| 221 | /* | ||
| 222 | * read the DNS data | ||
| 223 | * - the key's semaphore is read-locked | ||
| 224 | */ | ||
| 225 | static long dns_resolver_read(const struct key *key, | ||
| 226 | char __user *buffer, size_t buflen) | ||
| 227 | { | ||
| 228 | if (key->type_data.x[0]) | ||
| 229 | return key->type_data.x[0]; | ||
| 230 | |||
| 231 | return user_read(key, buffer, buflen); | ||
| 232 | } | ||
| 233 | |||
| 220 | struct key_type key_type_dns_resolver = { | 234 | struct key_type key_type_dns_resolver = { |
| 221 | .name = "dns_resolver", | 235 | .name = "dns_resolver", |
| 222 | .instantiate = dns_resolver_instantiate, | 236 | .instantiate = dns_resolver_instantiate, |
| @@ -224,7 +238,7 @@ struct key_type key_type_dns_resolver = { | |||
| 224 | .revoke = user_revoke, | 238 | .revoke = user_revoke, |
| 225 | .destroy = user_destroy, | 239 | .destroy = user_destroy, |
| 226 | .describe = dns_resolver_describe, | 240 | .describe = dns_resolver_describe, |
| 227 | .read = user_read, | 241 | .read = dns_resolver_read, |
| 228 | }; | 242 | }; |
| 229 | 243 | ||
| 230 | static int __init init_dns_resolver(void) | 244 | static int __init init_dns_resolver(void) |
diff --git a/net/ipv6/route.c b/net/ipv6/route.c index a998db6e789..904312e25a3 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c | |||
| @@ -2557,14 +2557,16 @@ static | |||
| 2557 | int ipv6_sysctl_rtcache_flush(ctl_table *ctl, int write, | 2557 | int ipv6_sysctl_rtcache_flush(ctl_table *ctl, int write, |
| 2558 | void __user *buffer, size_t *lenp, loff_t *ppos) | 2558 | void __user *buffer, size_t *lenp, loff_t *ppos) |
| 2559 | { | 2559 | { |
| 2560 | struct net *net = current->nsproxy->net_ns; | 2560 | struct net *net; |
| 2561 | int delay = net->ipv6.sysctl.flush_delay; | 2561 | int delay; |
| 2562 | if (write) { | 2562 | if (!write) |
| 2563 | proc_dointvec(ctl, write, buffer, lenp, ppos); | ||
| 2564 | fib6_run_gc(delay <= 0 ? ~0UL : (unsigned long)delay, net); | ||
| 2565 | return 0; | ||
| 2566 | } else | ||
| 2567 | return -EINVAL; | 2563 | return -EINVAL; |
| 2564 | |||
| 2565 | net = (struct net *)ctl->extra1; | ||
| 2566 | delay = net->ipv6.sysctl.flush_delay; | ||
| 2567 | proc_dointvec(ctl, write, buffer, lenp, ppos); | ||
| 2568 | fib6_run_gc(delay <= 0 ? ~0UL : (unsigned long)delay, net); | ||
| 2569 | return 0; | ||
| 2568 | } | 2570 | } |
| 2569 | 2571 | ||
| 2570 | ctl_table ipv6_route_table_template[] = { | 2572 | ctl_table ipv6_route_table_template[] = { |
| @@ -2651,6 +2653,7 @@ struct ctl_table * __net_init ipv6_route_sysctl_init(struct net *net) | |||
| 2651 | 2653 | ||
| 2652 | if (table) { | 2654 | if (table) { |
| 2653 | table[0].data = &net->ipv6.sysctl.flush_delay; | 2655 | table[0].data = &net->ipv6.sysctl.flush_delay; |
| 2656 | table[0].extra1 = net; | ||
| 2654 | table[1].data = &net->ipv6.ip6_dst_ops.gc_thresh; | 2657 | table[1].data = &net->ipv6.ip6_dst_ops.gc_thresh; |
| 2655 | table[2].data = &net->ipv6.sysctl.ip6_rt_max_size; | 2658 | table[2].data = &net->ipv6.sysctl.ip6_rt_max_size; |
| 2656 | table[3].data = &net->ipv6.sysctl.ip6_rt_gc_min_interval; | 2659 | table[3].data = &net->ipv6.sysctl.ip6_rt_gc_min_interval; |
diff --git a/net/netfilter/ipvs/ip_vs_ctl.c b/net/netfilter/ipvs/ip_vs_ctl.c index 22f7ad5101a..ba98e1308f3 100644 --- a/net/netfilter/ipvs/ip_vs_ctl.c +++ b/net/netfilter/ipvs/ip_vs_ctl.c | |||
| @@ -808,9 +808,9 @@ __ip_vs_update_dest(struct ip_vs_service *svc, struct ip_vs_dest *dest, | |||
| 808 | dest->u_threshold = udest->u_threshold; | 808 | dest->u_threshold = udest->u_threshold; |
| 809 | dest->l_threshold = udest->l_threshold; | 809 | dest->l_threshold = udest->l_threshold; |
| 810 | 810 | ||
| 811 | spin_lock(&dest->dst_lock); | 811 | spin_lock_bh(&dest->dst_lock); |
| 812 | ip_vs_dst_reset(dest); | 812 | ip_vs_dst_reset(dest); |
| 813 | spin_unlock(&dest->dst_lock); | 813 | spin_unlock_bh(&dest->dst_lock); |
| 814 | 814 | ||
| 815 | if (add) | 815 | if (add) |
| 816 | ip_vs_new_estimator(&dest->stats); | 816 | ip_vs_new_estimator(&dest->stats); |
diff --git a/net/netfilter/nf_log.c b/net/netfilter/nf_log.c index b07393eab88..91816998ed8 100644 --- a/net/netfilter/nf_log.c +++ b/net/netfilter/nf_log.c | |||
| @@ -85,6 +85,8 @@ EXPORT_SYMBOL(nf_log_unregister); | |||
| 85 | 85 | ||
| 86 | int nf_log_bind_pf(u_int8_t pf, const struct nf_logger *logger) | 86 | int nf_log_bind_pf(u_int8_t pf, const struct nf_logger *logger) |
| 87 | { | 87 | { |
| 88 | if (pf >= ARRAY_SIZE(nf_loggers)) | ||
| 89 | return -EINVAL; | ||
| 88 | mutex_lock(&nf_log_mutex); | 90 | mutex_lock(&nf_log_mutex); |
| 89 | if (__find_logger(pf, logger->name) == NULL) { | 91 | if (__find_logger(pf, logger->name) == NULL) { |
| 90 | mutex_unlock(&nf_log_mutex); | 92 | mutex_unlock(&nf_log_mutex); |
| @@ -98,6 +100,8 @@ EXPORT_SYMBOL(nf_log_bind_pf); | |||
| 98 | 100 | ||
| 99 | void nf_log_unbind_pf(u_int8_t pf) | 101 | void nf_log_unbind_pf(u_int8_t pf) |
| 100 | { | 102 | { |
| 103 | if (pf >= ARRAY_SIZE(nf_loggers)) | ||
| 104 | return; | ||
| 101 | mutex_lock(&nf_log_mutex); | 105 | mutex_lock(&nf_log_mutex); |
| 102 | rcu_assign_pointer(nf_loggers[pf], NULL); | 106 | rcu_assign_pointer(nf_loggers[pf], NULL); |
| 103 | mutex_unlock(&nf_log_mutex); | 107 | mutex_unlock(&nf_log_mutex); |
diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c index 478181d53c5..1f924595bde 100644 --- a/net/netlink/af_netlink.c +++ b/net/netlink/af_netlink.c | |||
| @@ -1407,7 +1407,7 @@ static int netlink_recvmsg(struct kiocb *kiocb, struct socket *sock, | |||
| 1407 | int noblock = flags&MSG_DONTWAIT; | 1407 | int noblock = flags&MSG_DONTWAIT; |
| 1408 | size_t copied; | 1408 | size_t copied; |
| 1409 | struct sk_buff *skb, *data_skb; | 1409 | struct sk_buff *skb, *data_skb; |
| 1410 | int err; | 1410 | int err, ret; |
| 1411 | 1411 | ||
| 1412 | if (flags&MSG_OOB) | 1412 | if (flags&MSG_OOB) |
| 1413 | return -EOPNOTSUPP; | 1413 | return -EOPNOTSUPP; |
| @@ -1470,8 +1470,13 @@ static int netlink_recvmsg(struct kiocb *kiocb, struct socket *sock, | |||
| 1470 | 1470 | ||
| 1471 | skb_free_datagram(sk, skb); | 1471 | skb_free_datagram(sk, skb); |
| 1472 | 1472 | ||
| 1473 | if (nlk->cb && atomic_read(&sk->sk_rmem_alloc) <= sk->sk_rcvbuf / 2) | 1473 | if (nlk->cb && atomic_read(&sk->sk_rmem_alloc) <= sk->sk_rcvbuf / 2) { |
| 1474 | netlink_dump(sk); | 1474 | ret = netlink_dump(sk); |
| 1475 | if (ret) { | ||
| 1476 | sk->sk_err = ret; | ||
| 1477 | sk->sk_error_report(sk); | ||
| 1478 | } | ||
| 1479 | } | ||
| 1475 | 1480 | ||
| 1476 | scm_recv(sock, msg, siocb->scm, flags); | 1481 | scm_recv(sock, msg, siocb->scm, flags); |
| 1477 | out: | 1482 | out: |
| @@ -1736,6 +1741,7 @@ int netlink_dump_start(struct sock *ssk, struct sk_buff *skb, | |||
| 1736 | struct netlink_callback *cb; | 1741 | struct netlink_callback *cb; |
| 1737 | struct sock *sk; | 1742 | struct sock *sk; |
| 1738 | struct netlink_sock *nlk; | 1743 | struct netlink_sock *nlk; |
| 1744 | int ret; | ||
| 1739 | 1745 | ||
| 1740 | cb = kzalloc(sizeof(*cb), GFP_KERNEL); | 1746 | cb = kzalloc(sizeof(*cb), GFP_KERNEL); |
| 1741 | if (cb == NULL) | 1747 | if (cb == NULL) |
| @@ -1764,9 +1770,13 @@ int netlink_dump_start(struct sock *ssk, struct sk_buff *skb, | |||
| 1764 | nlk->cb = cb; | 1770 | nlk->cb = cb; |
| 1765 | mutex_unlock(nlk->cb_mutex); | 1771 | mutex_unlock(nlk->cb_mutex); |
| 1766 | 1772 | ||
| 1767 | netlink_dump(sk); | 1773 | ret = netlink_dump(sk); |
| 1774 | |||
| 1768 | sock_put(sk); | 1775 | sock_put(sk); |
| 1769 | 1776 | ||
| 1777 | if (ret) | ||
| 1778 | return ret; | ||
| 1779 | |||
| 1770 | /* We successfully started a dump, by returning -EINTR we | 1780 | /* We successfully started a dump, by returning -EINTR we |
| 1771 | * signal not to send ACK even if it was requested. | 1781 | * signal not to send ACK even if it was requested. |
| 1772 | */ | 1782 | */ |
diff --git a/net/rxrpc/ar-input.c b/net/rxrpc/ar-input.c index 89315009bab..1a2b0633fec 100644 --- a/net/rxrpc/ar-input.c +++ b/net/rxrpc/ar-input.c | |||
| @@ -423,6 +423,7 @@ void rxrpc_fast_process_packet(struct rxrpc_call *call, struct sk_buff *skb) | |||
| 423 | goto protocol_error; | 423 | goto protocol_error; |
| 424 | } | 424 | } |
| 425 | 425 | ||
| 426 | case RXRPC_PACKET_TYPE_ACKALL: | ||
| 426 | case RXRPC_PACKET_TYPE_ACK: | 427 | case RXRPC_PACKET_TYPE_ACK: |
| 427 | /* ACK processing is done in process context */ | 428 | /* ACK processing is done in process context */ |
| 428 | read_lock_bh(&call->state_lock); | 429 | read_lock_bh(&call->state_lock); |
diff --git a/sound/pci/hda/patch_cirrus.c b/sound/pci/hda/patch_cirrus.c index a07b031090d..067982f4f18 100644 --- a/sound/pci/hda/patch_cirrus.c +++ b/sound/pci/hda/patch_cirrus.c | |||
| @@ -1039,9 +1039,11 @@ static struct hda_verb cs_errata_init_verbs[] = { | |||
| 1039 | {0x11, AC_VERB_SET_PROC_COEF, 0x0008}, | 1039 | {0x11, AC_VERB_SET_PROC_COEF, 0x0008}, |
| 1040 | {0x11, AC_VERB_SET_PROC_STATE, 0x00}, | 1040 | {0x11, AC_VERB_SET_PROC_STATE, 0x00}, |
| 1041 | 1041 | ||
| 1042 | #if 0 /* Don't to set to D3 as we are in power-up sequence */ | ||
| 1042 | {0x07, AC_VERB_SET_POWER_STATE, 0x03}, /* S/PDIF Rx: D3 */ | 1043 | {0x07, AC_VERB_SET_POWER_STATE, 0x03}, /* S/PDIF Rx: D3 */ |
| 1043 | {0x08, AC_VERB_SET_POWER_STATE, 0x03}, /* S/PDIF Tx: D3 */ | 1044 | {0x08, AC_VERB_SET_POWER_STATE, 0x03}, /* S/PDIF Tx: D3 */ |
| 1044 | /*{0x01, AC_VERB_SET_POWER_STATE, 0x03},*/ /* AFG: D3 This is already handled */ | 1045 | /*{0x01, AC_VERB_SET_POWER_STATE, 0x03},*/ /* AFG: D3 This is already handled */ |
| 1046 | #endif | ||
| 1045 | 1047 | ||
| 1046 | {} /* terminator */ | 1048 | {} /* terminator */ |
| 1047 | }; | 1049 | }; |
diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c index a5876773672..ec0fa2dd0a2 100644 --- a/sound/pci/hda/patch_hdmi.c +++ b/sound/pci/hda/patch_hdmi.c | |||
| @@ -1634,6 +1634,9 @@ static struct hda_codec_preset snd_hda_preset_hdmi[] = { | |||
| 1634 | { .id = 0x10de0012, .name = "GPU 12 HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, | 1634 | { .id = 0x10de0012, .name = "GPU 12 HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, |
| 1635 | { .id = 0x10de0013, .name = "GPU 13 HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, | 1635 | { .id = 0x10de0013, .name = "GPU 13 HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, |
| 1636 | { .id = 0x10de0014, .name = "GPU 14 HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, | 1636 | { .id = 0x10de0014, .name = "GPU 14 HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, |
| 1637 | { .id = 0x10de0015, .name = "GPU 15 HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, | ||
| 1638 | { .id = 0x10de0016, .name = "GPU 16 HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, | ||
| 1639 | /* 17 is known to be absent */ | ||
| 1637 | { .id = 0x10de0018, .name = "GPU 18 HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, | 1640 | { .id = 0x10de0018, .name = "GPU 18 HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, |
| 1638 | { .id = 0x10de0019, .name = "GPU 19 HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, | 1641 | { .id = 0x10de0019, .name = "GPU 19 HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, |
| 1639 | { .id = 0x10de001a, .name = "GPU 1a HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, | 1642 | { .id = 0x10de001a, .name = "GPU 1a HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, |
| @@ -1676,6 +1679,8 @@ MODULE_ALIAS("snd-hda-codec-id:10de0011"); | |||
| 1676 | MODULE_ALIAS("snd-hda-codec-id:10de0012"); | 1679 | MODULE_ALIAS("snd-hda-codec-id:10de0012"); |
| 1677 | MODULE_ALIAS("snd-hda-codec-id:10de0013"); | 1680 | MODULE_ALIAS("snd-hda-codec-id:10de0013"); |
| 1678 | MODULE_ALIAS("snd-hda-codec-id:10de0014"); | 1681 | MODULE_ALIAS("snd-hda-codec-id:10de0014"); |
| 1682 | MODULE_ALIAS("snd-hda-codec-id:10de0015"); | ||
| 1683 | MODULE_ALIAS("snd-hda-codec-id:10de0016"); | ||
| 1679 | MODULE_ALIAS("snd-hda-codec-id:10de0018"); | 1684 | MODULE_ALIAS("snd-hda-codec-id:10de0018"); |
| 1680 | MODULE_ALIAS("snd-hda-codec-id:10de0019"); | 1685 | MODULE_ALIAS("snd-hda-codec-id:10de0019"); |
| 1681 | MODULE_ALIAS("snd-hda-codec-id:10de001a"); | 1686 | MODULE_ALIAS("snd-hda-codec-id:10de001a"); |
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 3328a259a24..4261bb8eec1 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
| @@ -1133,11 +1133,8 @@ static void alc_automute_speaker(struct hda_codec *codec, int pinctl) | |||
| 1133 | nid = spec->autocfg.hp_pins[i]; | 1133 | nid = spec->autocfg.hp_pins[i]; |
| 1134 | if (!nid) | 1134 | if (!nid) |
| 1135 | break; | 1135 | break; |
| 1136 | if (snd_hda_jack_detect(codec, nid)) { | 1136 | alc_report_jack(codec, nid); |
| 1137 | spec->jack_present = 1; | 1137 | spec->jack_present |= snd_hda_jack_detect(codec, nid); |
| 1138 | break; | ||
| 1139 | } | ||
| 1140 | alc_report_jack(codec, spec->autocfg.hp_pins[i]); | ||
| 1141 | } | 1138 | } |
| 1142 | 1139 | ||
| 1143 | mute = spec->jack_present ? HDA_AMP_MUTE : 0; | 1140 | mute = spec->jack_present ? HDA_AMP_MUTE : 0; |
| @@ -15015,7 +15012,7 @@ static struct snd_pci_quirk alc269_cfg_tbl[] = { | |||
| 15015 | SND_PCI_QUIRK(0x1043, 0x11e3, "ASUS U33Jc", ALC269VB_AMIC), | 15012 | SND_PCI_QUIRK(0x1043, 0x11e3, "ASUS U33Jc", ALC269VB_AMIC), |
| 15016 | SND_PCI_QUIRK(0x1043, 0x1273, "ASUS UL80Jt", ALC269VB_AMIC), | 15013 | SND_PCI_QUIRK(0x1043, 0x1273, "ASUS UL80Jt", ALC269VB_AMIC), |
| 15017 | SND_PCI_QUIRK(0x1043, 0x1283, "ASUS U53Jc", ALC269_AMIC), | 15014 | SND_PCI_QUIRK(0x1043, 0x1283, "ASUS U53Jc", ALC269_AMIC), |
| 15018 | SND_PCI_QUIRK(0x1043, 0x12b3, "ASUS N82Jv", ALC269_AMIC), | 15015 | SND_PCI_QUIRK(0x1043, 0x12b3, "ASUS N82JV", ALC269VB_AMIC), |
| 15019 | SND_PCI_QUIRK(0x1043, 0x12d3, "ASUS N61Jv", ALC269_AMIC), | 15016 | SND_PCI_QUIRK(0x1043, 0x12d3, "ASUS N61Jv", ALC269_AMIC), |
| 15020 | SND_PCI_QUIRK(0x1043, 0x13a3, "ASUS UL30Vt", ALC269_AMIC), | 15017 | SND_PCI_QUIRK(0x1043, 0x13a3, "ASUS UL30Vt", ALC269_AMIC), |
| 15021 | SND_PCI_QUIRK(0x1043, 0x1373, "ASUS G73JX", ALC269_AMIC), | 15018 | SND_PCI_QUIRK(0x1043, 0x1373, "ASUS G73JX", ALC269_AMIC), |
diff --git a/sound/soc/codecs/wm8994.c b/sound/soc/codecs/wm8994.c index ebaee5ca743..4afbe3b2e44 100644 --- a/sound/soc/codecs/wm8994.c +++ b/sound/soc/codecs/wm8994.c | |||
| @@ -110,6 +110,9 @@ struct wm8994_priv { | |||
| 110 | 110 | ||
| 111 | unsigned int aif1clk_enable:1; | 111 | unsigned int aif1clk_enable:1; |
| 112 | unsigned int aif2clk_enable:1; | 112 | unsigned int aif2clk_enable:1; |
| 113 | |||
| 114 | unsigned int aif1clk_disable:1; | ||
| 115 | unsigned int aif2clk_disable:1; | ||
| 113 | }; | 116 | }; |
| 114 | 117 | ||
| 115 | static int wm8994_readable(unsigned int reg) | 118 | static int wm8994_readable(unsigned int reg) |
| @@ -1015,14 +1018,18 @@ static int late_enable_ev(struct snd_soc_dapm_widget *w, | |||
| 1015 | 1018 | ||
| 1016 | switch (event) { | 1019 | switch (event) { |
| 1017 | case SND_SOC_DAPM_PRE_PMU: | 1020 | case SND_SOC_DAPM_PRE_PMU: |
| 1018 | if (wm8994->aif1clk_enable) | 1021 | if (wm8994->aif1clk_enable) { |
| 1019 | snd_soc_update_bits(codec, WM8994_AIF1_CLOCKING_1, | 1022 | snd_soc_update_bits(codec, WM8994_AIF1_CLOCKING_1, |
| 1020 | WM8994_AIF1CLK_ENA_MASK, | 1023 | WM8994_AIF1CLK_ENA_MASK, |
| 1021 | WM8994_AIF1CLK_ENA); | 1024 | WM8994_AIF1CLK_ENA); |
| 1022 | if (wm8994->aif2clk_enable) | 1025 | wm8994->aif1clk_enable = 0; |
| 1026 | } | ||
| 1027 | if (wm8994->aif2clk_enable) { | ||
| 1023 | snd_soc_update_bits(codec, WM8994_AIF2_CLOCKING_1, | 1028 | snd_soc_update_bits(codec, WM8994_AIF2_CLOCKING_1, |
| 1024 | WM8994_AIF2CLK_ENA_MASK, | 1029 | WM8994_AIF2CLK_ENA_MASK, |
| 1025 | WM8994_AIF2CLK_ENA); | 1030 | WM8994_AIF2CLK_ENA); |
| 1031 | wm8994->aif2clk_enable = 0; | ||
| 1032 | } | ||
| 1026 | break; | 1033 | break; |
| 1027 | } | 1034 | } |
| 1028 | 1035 | ||
| @@ -1037,15 +1044,15 @@ static int late_disable_ev(struct snd_soc_dapm_widget *w, | |||
| 1037 | 1044 | ||
| 1038 | switch (event) { | 1045 | switch (event) { |
| 1039 | case SND_SOC_DAPM_POST_PMD: | 1046 | case SND_SOC_DAPM_POST_PMD: |
| 1040 | if (wm8994->aif1clk_enable) { | 1047 | if (wm8994->aif1clk_disable) { |
| 1041 | snd_soc_update_bits(codec, WM8994_AIF1_CLOCKING_1, | 1048 | snd_soc_update_bits(codec, WM8994_AIF1_CLOCKING_1, |
| 1042 | WM8994_AIF1CLK_ENA_MASK, 0); | 1049 | WM8994_AIF1CLK_ENA_MASK, 0); |
| 1043 | wm8994->aif1clk_enable = 0; | 1050 | wm8994->aif1clk_disable = 0; |
| 1044 | } | 1051 | } |
| 1045 | if (wm8994->aif2clk_enable) { | 1052 | if (wm8994->aif2clk_disable) { |
| 1046 | snd_soc_update_bits(codec, WM8994_AIF2_CLOCKING_1, | 1053 | snd_soc_update_bits(codec, WM8994_AIF2_CLOCKING_1, |
| 1047 | WM8994_AIF2CLK_ENA_MASK, 0); | 1054 | WM8994_AIF2CLK_ENA_MASK, 0); |
| 1048 | wm8994->aif2clk_enable = 0; | 1055 | wm8994->aif2clk_disable = 0; |
| 1049 | } | 1056 | } |
| 1050 | break; | 1057 | break; |
| 1051 | } | 1058 | } |
| @@ -1063,6 +1070,9 @@ static int aif1clk_ev(struct snd_soc_dapm_widget *w, | |||
| 1063 | case SND_SOC_DAPM_PRE_PMU: | 1070 | case SND_SOC_DAPM_PRE_PMU: |
| 1064 | wm8994->aif1clk_enable = 1; | 1071 | wm8994->aif1clk_enable = 1; |
| 1065 | break; | 1072 | break; |
| 1073 | case SND_SOC_DAPM_POST_PMD: | ||
| 1074 | wm8994->aif1clk_disable = 1; | ||
| 1075 | break; | ||
| 1066 | } | 1076 | } |
| 1067 | 1077 | ||
| 1068 | return 0; | 1078 | return 0; |
| @@ -1078,11 +1088,21 @@ static int aif2clk_ev(struct snd_soc_dapm_widget *w, | |||
| 1078 | case SND_SOC_DAPM_PRE_PMU: | 1088 | case SND_SOC_DAPM_PRE_PMU: |
| 1079 | wm8994->aif2clk_enable = 1; | 1089 | wm8994->aif2clk_enable = 1; |
| 1080 | break; | 1090 | break; |
| 1091 | case SND_SOC_DAPM_POST_PMD: | ||
| 1092 | wm8994->aif2clk_disable = 1; | ||
| 1093 | break; | ||
| 1081 | } | 1094 | } |
| 1082 | 1095 | ||
| 1083 | return 0; | 1096 | return 0; |
| 1084 | } | 1097 | } |
| 1085 | 1098 | ||
| 1099 | static int adc_mux_ev(struct snd_soc_dapm_widget *w, | ||
| 1100 | struct snd_kcontrol *kcontrol, int event) | ||
| 1101 | { | ||
| 1102 | late_enable_ev(w, kcontrol, event); | ||
| 1103 | return 0; | ||
| 1104 | } | ||
| 1105 | |||
| 1086 | static int dac_ev(struct snd_soc_dapm_widget *w, | 1106 | static int dac_ev(struct snd_soc_dapm_widget *w, |
| 1087 | struct snd_kcontrol *kcontrol, int event) | 1107 | struct snd_kcontrol *kcontrol, int event) |
| 1088 | { | 1108 | { |
| @@ -1403,6 +1423,18 @@ SND_SOC_DAPM_DAC("DAC1L", NULL, WM8994_POWER_MANAGEMENT_5, 1, 0), | |||
| 1403 | SND_SOC_DAPM_DAC("DAC1R", NULL, WM8994_POWER_MANAGEMENT_5, 0, 0), | 1423 | SND_SOC_DAPM_DAC("DAC1R", NULL, WM8994_POWER_MANAGEMENT_5, 0, 0), |
| 1404 | }; | 1424 | }; |
| 1405 | 1425 | ||
| 1426 | static const struct snd_soc_dapm_widget wm8994_adc_revd_widgets[] = { | ||
| 1427 | SND_SOC_DAPM_MUX_E("ADCL Mux", WM8994_POWER_MANAGEMENT_4, 1, 0, &adcl_mux, | ||
| 1428 | adc_mux_ev, SND_SOC_DAPM_PRE_PMU), | ||
| 1429 | SND_SOC_DAPM_MUX_E("ADCR Mux", WM8994_POWER_MANAGEMENT_4, 0, 0, &adcr_mux, | ||
| 1430 | adc_mux_ev, SND_SOC_DAPM_PRE_PMU), | ||
| 1431 | }; | ||
| 1432 | |||
| 1433 | static const struct snd_soc_dapm_widget wm8994_adc_widgets[] = { | ||
| 1434 | SND_SOC_DAPM_MUX("ADCL Mux", WM8994_POWER_MANAGEMENT_4, 1, 0, &adcl_mux), | ||
| 1435 | SND_SOC_DAPM_MUX("ADCR Mux", WM8994_POWER_MANAGEMENT_4, 0, 0, &adcr_mux), | ||
| 1436 | }; | ||
| 1437 | |||
| 1406 | static const struct snd_soc_dapm_widget wm8994_dapm_widgets[] = { | 1438 | static const struct snd_soc_dapm_widget wm8994_dapm_widgets[] = { |
| 1407 | SND_SOC_DAPM_INPUT("DMIC1DAT"), | 1439 | SND_SOC_DAPM_INPUT("DMIC1DAT"), |
| 1408 | SND_SOC_DAPM_INPUT("DMIC2DAT"), | 1440 | SND_SOC_DAPM_INPUT("DMIC2DAT"), |
| @@ -1497,9 +1529,6 @@ SND_SOC_DAPM_ADC("DMIC1R", NULL, WM8994_POWER_MANAGEMENT_4, 2, 0), | |||
| 1497 | SND_SOC_DAPM_ADC("ADCL", NULL, SND_SOC_NOPM, 1, 0), | 1529 | SND_SOC_DAPM_ADC("ADCL", NULL, SND_SOC_NOPM, 1, 0), |
| 1498 | SND_SOC_DAPM_ADC("ADCR", NULL, SND_SOC_NOPM, 0, 0), | 1530 | SND_SOC_DAPM_ADC("ADCR", NULL, SND_SOC_NOPM, 0, 0), |
| 1499 | 1531 | ||
| 1500 | SND_SOC_DAPM_MUX("ADCL Mux", WM8994_POWER_MANAGEMENT_4, 1, 0, &adcl_mux), | ||
| 1501 | SND_SOC_DAPM_MUX("ADCR Mux", WM8994_POWER_MANAGEMENT_4, 0, 0, &adcr_mux), | ||
| 1502 | |||
| 1503 | SND_SOC_DAPM_MUX("Left Headphone Mux", SND_SOC_NOPM, 0, 0, &hpl_mux), | 1532 | SND_SOC_DAPM_MUX("Left Headphone Mux", SND_SOC_NOPM, 0, 0, &hpl_mux), |
| 1504 | SND_SOC_DAPM_MUX("Right Headphone Mux", SND_SOC_NOPM, 0, 0, &hpr_mux), | 1533 | SND_SOC_DAPM_MUX("Right Headphone Mux", SND_SOC_NOPM, 0, 0, &hpr_mux), |
| 1505 | 1534 | ||
| @@ -3280,11 +3309,15 @@ static int wm8994_codec_probe(struct snd_soc_codec *codec) | |||
| 3280 | if (wm8994->revision < 4) { | 3309 | if (wm8994->revision < 4) { |
| 3281 | snd_soc_dapm_new_controls(dapm, wm8994_lateclk_revd_widgets, | 3310 | snd_soc_dapm_new_controls(dapm, wm8994_lateclk_revd_widgets, |
| 3282 | ARRAY_SIZE(wm8994_lateclk_revd_widgets)); | 3311 | ARRAY_SIZE(wm8994_lateclk_revd_widgets)); |
| 3312 | snd_soc_dapm_new_controls(dapm, wm8994_adc_revd_widgets, | ||
| 3313 | ARRAY_SIZE(wm8994_adc_revd_widgets)); | ||
| 3283 | snd_soc_dapm_new_controls(dapm, wm8994_dac_revd_widgets, | 3314 | snd_soc_dapm_new_controls(dapm, wm8994_dac_revd_widgets, |
| 3284 | ARRAY_SIZE(wm8994_dac_revd_widgets)); | 3315 | ARRAY_SIZE(wm8994_dac_revd_widgets)); |
| 3285 | } else { | 3316 | } else { |
| 3286 | snd_soc_dapm_new_controls(dapm, wm8994_lateclk_widgets, | 3317 | snd_soc_dapm_new_controls(dapm, wm8994_lateclk_widgets, |
| 3287 | ARRAY_SIZE(wm8994_lateclk_widgets)); | 3318 | ARRAY_SIZE(wm8994_lateclk_widgets)); |
| 3319 | snd_soc_dapm_new_controls(dapm, wm8994_adc_widgets, | ||
| 3320 | ARRAY_SIZE(wm8994_adc_widgets)); | ||
| 3288 | snd_soc_dapm_new_controls(dapm, wm8994_dac_widgets, | 3321 | snd_soc_dapm_new_controls(dapm, wm8994_dac_widgets, |
| 3289 | ARRAY_SIZE(wm8994_dac_widgets)); | 3322 | ARRAY_SIZE(wm8994_dac_widgets)); |
| 3290 | } | 3323 | } |
diff --git a/sound/soc/codecs/wm9081.c b/sound/soc/codecs/wm9081.c index 43825b2102a..cce704c275c 100644 --- a/sound/soc/codecs/wm9081.c +++ b/sound/soc/codecs/wm9081.c | |||
| @@ -15,6 +15,7 @@ | |||
| 15 | #include <linux/moduleparam.h> | 15 | #include <linux/moduleparam.h> |
| 16 | #include <linux/init.h> | 16 | #include <linux/init.h> |
| 17 | #include <linux/delay.h> | 17 | #include <linux/delay.h> |
| 18 | #include <linux/device.h> | ||
| 18 | #include <linux/pm.h> | 19 | #include <linux/pm.h> |
| 19 | #include <linux/i2c.h> | 20 | #include <linux/i2c.h> |
| 20 | #include <linux/platform_device.h> | 21 | #include <linux/platform_device.h> |
| @@ -1341,6 +1342,10 @@ static __devinit int wm9081_i2c_probe(struct i2c_client *i2c, | |||
| 1341 | wm9081->control_type = SND_SOC_I2C; | 1342 | wm9081->control_type = SND_SOC_I2C; |
| 1342 | wm9081->control_data = i2c; | 1343 | wm9081->control_data = i2c; |
| 1343 | 1344 | ||
| 1345 | if (dev_get_platdata(&i2c->dev)) | ||
| 1346 | memcpy(&wm9081->retune, dev_get_platdata(&i2c->dev), | ||
| 1347 | sizeof(wm9081->retune)); | ||
| 1348 | |||
| 1344 | ret = snd_soc_register_codec(&i2c->dev, | 1349 | ret = snd_soc_register_codec(&i2c->dev, |
| 1345 | &soc_codec_dev_wm9081, &wm9081_dai, 1); | 1350 | &soc_codec_dev_wm9081, &wm9081_dai, 1); |
| 1346 | if (ret < 0) | 1351 | if (ret < 0) |
