aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-omap2/omap_hwmod.c
diff options
context:
space:
mode:
authorGlenn Elliott <gelliott@cs.unc.edu>2012-03-04 19:47:13 -0500
committerGlenn Elliott <gelliott@cs.unc.edu>2012-03-04 19:47:13 -0500
commitc71c03bda1e86c9d5198c5d83f712e695c4f2a1e (patch)
treeecb166cb3e2b7e2adb3b5e292245fefd23381ac8 /arch/arm/mach-omap2/omap_hwmod.c
parentea53c912f8a86a8567697115b6a0d8152beee5c8 (diff)
parent6a00f206debf8a5c8899055726ad127dbeeed098 (diff)
Merge branch 'mpi-master' into wip-k-fmlpwip-k-fmlp
Conflicts: litmus/sched_cedf.c
Diffstat (limited to 'arch/arm/mach-omap2/omap_hwmod.c')
-rw-r--r--arch/arm/mach-omap2/omap_hwmod.c1193
1 files changed, 919 insertions, 274 deletions
diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c
index cb911d7d1a3c..293fa6cd50e1 100644
--- a/arch/arm/mach-omap2/omap_hwmod.c
+++ b/arch/arm/mach-omap2/omap_hwmod.c
@@ -1,7 +1,7 @@
1/* 1/*
2 * omap_hwmod implementation for OMAP2/3/4 2 * omap_hwmod implementation for OMAP2/3/4
3 * 3 *
4 * Copyright (C) 2009-2010 Nokia Corporation 4 * Copyright (C) 2009-2011 Nokia Corporation
5 * 5 *
6 * Paul Walmsley, Benoît Cousson, Kevin Hilman 6 * Paul Walmsley, Benoît Cousson, Kevin Hilman
7 * 7 *
@@ -13,10 +13,102 @@
13 * 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
14 * published by the Free Software Foundation. 14 * published by the Free Software Foundation.
15 * 15 *
16 * This code manages "OMAP modules" (on-chip devices) and their 16 * Introduction
17 * integration with Linux device driver and bus code. 17 * ------------
18 * 18 * One way to view an OMAP SoC is as a collection of largely unrelated
19 * References: 19 * IP blocks connected by interconnects. The IP blocks include
20 * devices such as ARM processors, audio serial interfaces, UARTs,
21 * etc. Some of these devices, like the DSP, are created by TI;
22 * others, like the SGX, largely originate from external vendors. In
23 * TI's documentation, on-chip devices are referred to as "OMAP
24 * modules." Some of these IP blocks are identical across several
25 * OMAP versions. Others are revised frequently.
26 *
27 * These OMAP modules are tied together by various interconnects.
28 * Most of the address and data flow between modules is via OCP-based
29 * interconnects such as the L3 and L4 buses; but there are other
30 * interconnects that distribute the hardware clock tree, handle idle
31 * and reset signaling, supply power, and connect the modules to
32 * various pads or balls on the OMAP package.
33 *
34 * OMAP hwmod provides a consistent way to describe the on-chip
35 * hardware blocks and their integration into the rest of the chip.
36 * This description can be automatically generated from the TI
37 * hardware database. OMAP hwmod provides a standard, consistent API
38 * to reset, enable, idle, and disable these hardware blocks. And
39 * hwmod provides a way for other core code, such as the Linux device
40 * code or the OMAP power management and address space mapping code,
41 * to query the hardware database.
42 *
43 * Using hwmod
44 * -----------
45 * Drivers won't call hwmod functions directly. That is done by the
46 * omap_device code, and in rare occasions, by custom integration code
47 * in arch/arm/ *omap*. The omap_device code includes functions to
48 * build a struct platform_device using omap_hwmod data, and that is
49 * currently how hwmod data is communicated to drivers and to the
50 * Linux driver model. Most drivers will call omap_hwmod functions only
51 * indirectly, via pm_runtime*() functions.
52 *
53 * From a layering perspective, here is where the OMAP hwmod code
54 * fits into the kernel software stack:
55 *
56 * +-------------------------------+
57 * | Device driver code |
58 * | (e.g., drivers/) |
59 * +-------------------------------+
60 * | Linux driver model |
61 * | (platform_device / |
62 * | platform_driver data/code) |
63 * +-------------------------------+
64 * | OMAP core-driver integration |
65 * |(arch/arm/mach-omap2/devices.c)|
66 * +-------------------------------+
67 * | omap_device code |
68 * | (../plat-omap/omap_device.c) |
69 * +-------------------------------+
70 * ----> | omap_hwmod code/data | <-----
71 * | (../mach-omap2/omap_hwmod*) |
72 * +-------------------------------+
73 * | OMAP clock/PRCM/register fns |
74 * | (__raw_{read,write}l, clk*) |
75 * +-------------------------------+
76 *
77 * Device drivers should not contain any OMAP-specific code or data in
78 * them. They should only contain code to operate the IP block that
79 * the driver is responsible for. This is because these IP blocks can
80 * also appear in other SoCs, either from TI (such as DaVinci) or from
81 * other manufacturers; and drivers should be reusable across other
82 * platforms.
83 *
84 * The OMAP hwmod code also will attempt to reset and idle all on-chip
85 * devices upon boot. The goal here is for the kernel to be
86 * completely self-reliant and independent from bootloaders. This is
87 * to ensure a repeatable configuration, both to ensure consistent
88 * runtime behavior, and to make it easier for others to reproduce
89 * bugs.
90 *
91 * OMAP module activity states
92 * ---------------------------
93 * The hwmod code considers modules to be in one of several activity
94 * states. IP blocks start out in an UNKNOWN state, then once they
95 * are registered via the hwmod code, proceed to the REGISTERED state.
96 * Once their clock names are resolved to clock pointers, the module
97 * enters the CLKS_INITED state; and finally, once the module has been
98 * reset and the integration registers programmed, the INITIALIZED state
99 * is entered. The hwmod code will then place the module into either
100 * the IDLE state to save power, or in the case of a critical system
101 * module, the ENABLED state.
102 *
103 * OMAP core integration code can then call omap_hwmod*() functions
104 * directly to move the module between the IDLE, ENABLED, and DISABLED
105 * states, as needed. This is done during both the PM idle loop, and
106 * in the OMAP core integration code's implementation of the PM runtime
107 * functions.
108 *
109 * References
110 * ----------
111 * This is a partial list.
20 * - OMAP2420 Multimedia Processor Silicon Revision 2.1.1, 2.2 (SWPU064) 112 * - OMAP2420 Multimedia Processor Silicon Revision 2.1.1, 2.2 (SWPU064)
21 * - OMAP2430 Multimedia Device POP Silicon Revision 2.1 (SWPU090) 113 * - OMAP2430 Multimedia Device POP Silicon Revision 2.1 (SWPU090)
22 * - OMAP34xx Multimedia Device Silicon Revision 3.1 (SWPU108) 114 * - OMAP34xx Multimedia Device Silicon Revision 3.1 (SWPU108)
@@ -24,7 +116,6 @@
24 * - Open Core Protocol Specification 2.2 116 * - Open Core Protocol Specification 2.2
25 * 117 *
26 * To do: 118 * To do:
27 * - pin mux handling
28 * - handle IO mapping 119 * - handle IO mapping
29 * - bus throughput & module latency measurement code 120 * - bus throughput & module latency measurement code
30 * 121 *
@@ -43,18 +134,24 @@
43#include <linux/err.h> 134#include <linux/err.h>
44#include <linux/list.h> 135#include <linux/list.h>
45#include <linux/mutex.h> 136#include <linux/mutex.h>
137#include <linux/spinlock.h>
46 138
47#include <plat/common.h> 139#include <plat/common.h>
48#include <plat/cpu.h> 140#include <plat/cpu.h>
49#include <plat/clockdomain.h> 141#include "clockdomain.h"
50#include <plat/powerdomain.h> 142#include "powerdomain.h"
51#include <plat/clock.h> 143#include <plat/clock.h>
52#include <plat/omap_hwmod.h> 144#include <plat/omap_hwmod.h>
145#include <plat/prcm.h>
53 146
54#include "cm.h" 147#include "cm2xxx_3xxx.h"
148#include "cm44xx.h"
149#include "prm2xxx_3xxx.h"
150#include "prm44xx.h"
151#include "mux.h"
55 152
56/* Maximum microseconds to wait for OMAP module to reset */ 153/* Maximum microseconds to wait for OMAP module to softreset */
57#define MAX_MODULE_RESET_WAIT 10000 154#define MAX_MODULE_SOFTRESET_WAIT 10000
58 155
59/* Name of the OMAP hwmod for the MPU */ 156/* Name of the OMAP hwmod for the MPU */
60#define MPU_INITIATOR_NAME "mpu" 157#define MPU_INITIATOR_NAME "mpu"
@@ -62,14 +159,9 @@
62/* omap_hwmod_list contains all registered struct omap_hwmods */ 159/* omap_hwmod_list contains all registered struct omap_hwmods */
63static LIST_HEAD(omap_hwmod_list); 160static LIST_HEAD(omap_hwmod_list);
64 161
65static DEFINE_MUTEX(omap_hwmod_mutex);
66
67/* mpu_oh: used to add/remove MPU initiator from sleepdep list */ 162/* mpu_oh: used to add/remove MPU initiator from sleepdep list */
68static struct omap_hwmod *mpu_oh; 163static struct omap_hwmod *mpu_oh;
69 164
70/* inited: 0 if omap_hwmod_init() has not yet been called; 1 otherwise */
71static u8 inited;
72
73 165
74/* Private functions */ 166/* Private functions */
75 167
@@ -90,7 +182,7 @@ static int _update_sysc_cache(struct omap_hwmod *oh)
90 182
91 /* XXX ensure module interface clock is up */ 183 /* XXX ensure module interface clock is up */
92 184
93 oh->_sysc_cache = omap_hwmod_readl(oh, oh->class->sysc->sysc_offs); 185 oh->_sysc_cache = omap_hwmod_read(oh, oh->class->sysc->sysc_offs);
94 186
95 if (!(oh->class->sysc->sysc_flags & SYSC_NO_CACHE)) 187 if (!(oh->class->sysc->sysc_flags & SYSC_NO_CACHE))
96 oh->_int_flags |= _HWMOD_SYSCONFIG_LOADED; 188 oh->_int_flags |= _HWMOD_SYSCONFIG_LOADED;
@@ -115,10 +207,9 @@ static void _write_sysconfig(u32 v, struct omap_hwmod *oh)
115 207
116 /* XXX ensure module interface clock is up */ 208 /* XXX ensure module interface clock is up */
117 209
118 if (oh->_sysc_cache != v) { 210 /* Module might have lost context, always update cache and register */
119 oh->_sysc_cache = v; 211 oh->_sysc_cache = v;
120 omap_hwmod_writel(v, oh, oh->class->sysc->sysc_offs); 212 omap_hwmod_write(v, oh, oh->class->sysc->sysc_offs);
121 }
122} 213}
123 214
124/** 215/**
@@ -279,7 +370,7 @@ static int _set_module_autoidle(struct omap_hwmod *oh, u8 autoidle,
279 } 370 }
280 371
281 autoidle_shift = oh->class->sysc->sysc_fields->autoidle_shift; 372 autoidle_shift = oh->class->sysc->sysc_fields->autoidle_shift;
282 autoidle_mask = (0x3 << autoidle_shift); 373 autoidle_mask = (0x1 << autoidle_shift);
283 374
284 *v &= ~autoidle_mask; 375 *v &= ~autoidle_mask;
285 *v |= autoidle << autoidle_shift; 376 *v |= autoidle << autoidle_shift;
@@ -294,12 +385,13 @@ static int _set_module_autoidle(struct omap_hwmod *oh, u8 autoidle,
294 * Allow the hardware module @oh to send wakeups. Returns -EINVAL 385 * Allow the hardware module @oh to send wakeups. Returns -EINVAL
295 * upon error or 0 upon success. 386 * upon error or 0 upon success.
296 */ 387 */
297static int _enable_wakeup(struct omap_hwmod *oh) 388static int _enable_wakeup(struct omap_hwmod *oh, u32 *v)
298{ 389{
299 u32 v, wakeup_mask; 390 u32 wakeup_mask;
300 391
301 if (!oh->class->sysc || 392 if (!oh->class->sysc ||
302 !(oh->class->sysc->sysc_flags & SYSC_HAS_ENAWAKEUP)) 393 !((oh->class->sysc->sysc_flags & SYSC_HAS_ENAWAKEUP) ||
394 (oh->class->sysc->idlemodes & SIDLE_SMART_WKUP)))
303 return -EINVAL; 395 return -EINVAL;
304 396
305 if (!oh->class->sysc->sysc_fields) { 397 if (!oh->class->sysc->sysc_fields) {
@@ -309,9 +401,10 @@ static int _enable_wakeup(struct omap_hwmod *oh)
309 401
310 wakeup_mask = (0x1 << oh->class->sysc->sysc_fields->enwkup_shift); 402 wakeup_mask = (0x1 << oh->class->sysc->sysc_fields->enwkup_shift);
311 403
312 v = oh->_sysc_cache; 404 *v |= wakeup_mask;
313 v |= wakeup_mask; 405
314 _write_sysconfig(v, oh); 406 if (oh->class->sysc->idlemodes & SIDLE_SMART_WKUP)
407 _set_slave_idlemode(oh, HWMOD_IDLEMODE_SMART_WKUP, v);
315 408
316 /* XXX test pwrdm_get_wken for this hwmod's subsystem */ 409 /* XXX test pwrdm_get_wken for this hwmod's subsystem */
317 410
@@ -327,12 +420,13 @@ static int _enable_wakeup(struct omap_hwmod *oh)
327 * Prevent the hardware module @oh to send wakeups. Returns -EINVAL 420 * Prevent the hardware module @oh to send wakeups. Returns -EINVAL
328 * upon error or 0 upon success. 421 * upon error or 0 upon success.
329 */ 422 */
330static int _disable_wakeup(struct omap_hwmod *oh) 423static int _disable_wakeup(struct omap_hwmod *oh, u32 *v)
331{ 424{
332 u32 v, wakeup_mask; 425 u32 wakeup_mask;
333 426
334 if (!oh->class->sysc || 427 if (!oh->class->sysc ||
335 !(oh->class->sysc->sysc_flags & SYSC_HAS_ENAWAKEUP)) 428 !((oh->class->sysc->sysc_flags & SYSC_HAS_ENAWAKEUP) ||
429 (oh->class->sysc->idlemodes & SIDLE_SMART_WKUP)))
336 return -EINVAL; 430 return -EINVAL;
337 431
338 if (!oh->class->sysc->sysc_fields) { 432 if (!oh->class->sysc->sysc_fields) {
@@ -342,9 +436,10 @@ static int _disable_wakeup(struct omap_hwmod *oh)
342 436
343 wakeup_mask = (0x1 << oh->class->sysc->sysc_fields->enwkup_shift); 437 wakeup_mask = (0x1 << oh->class->sysc->sysc_fields->enwkup_shift);
344 438
345 v = oh->_sysc_cache; 439 *v &= ~wakeup_mask;
346 v &= ~wakeup_mask; 440
347 _write_sysconfig(v, oh); 441 if (oh->class->sysc->idlemodes & SIDLE_SMART_WKUP)
442 _set_slave_idlemode(oh, HWMOD_IDLEMODE_SMART, v);
348 443
349 /* XXX test pwrdm_get_wken for this hwmod's subsystem */ 444 /* XXX test pwrdm_get_wken for this hwmod's subsystem */
350 445
@@ -362,14 +457,18 @@ static int _disable_wakeup(struct omap_hwmod *oh)
362 * 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
363 * 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
364 * initiator and the module). Only applies to modules in smart-idle 459 * initiator and the module). Only applies to modules in smart-idle
365 * mode. Returns -EINVAL upon error or passes along 460 * mode. If the clockdomain is marked as not needing autodeps, return
366 * 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.
367 */ 463 */
368static int _add_initiator_dep(struct omap_hwmod *oh, struct omap_hwmod *init_oh) 464static int _add_initiator_dep(struct omap_hwmod *oh, struct omap_hwmod *init_oh)
369{ 465{
370 if (!oh->_clk) 466 if (!oh->_clk)
371 return -EINVAL; 467 return -EINVAL;
372 468
469 if (oh->_clk->clkdm && oh->_clk->clkdm->flags & CLKDM_NO_AUTODEPS)
470 return 0;
471
373 return clkdm_add_sleepdep(oh->_clk->clkdm, init_oh->_clk->clkdm); 472 return clkdm_add_sleepdep(oh->_clk->clkdm, init_oh->_clk->clkdm);
374} 473}
375 474
@@ -382,14 +481,18 @@ static int _add_initiator_dep(struct omap_hwmod *oh, struct omap_hwmod *init_oh)
382 * 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
383 * 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
384 * initiator and the module). Only applies to modules in smart-idle 483 * initiator and the module). Only applies to modules in smart-idle
385 * mode. Returns -EINVAL upon error or passes along 484 * mode. If the clockdomain is marked as not needing autodeps, return
386 * 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.
387 */ 487 */
388static int _del_initiator_dep(struct omap_hwmod *oh, struct omap_hwmod *init_oh) 488static int _del_initiator_dep(struct omap_hwmod *oh, struct omap_hwmod *init_oh)
389{ 489{
390 if (!oh->_clk) 490 if (!oh->_clk)
391 return -EINVAL; 491 return -EINVAL;
392 492
493 if (oh->_clk->clkdm && oh->_clk->clkdm->flags & CLKDM_NO_AUTODEPS)
494 return 0;
495
393 return clkdm_del_sleepdep(oh->_clk->clkdm, init_oh->_clk->clkdm); 496 return clkdm_del_sleepdep(oh->_clk->clkdm, init_oh->_clk->clkdm);
394} 497}
395 498
@@ -544,6 +647,36 @@ static int _disable_clocks(struct omap_hwmod *oh)
544 return 0; 647 return 0;
545} 648}
546 649
650static void _enable_optional_clocks(struct omap_hwmod *oh)
651{
652 struct omap_hwmod_opt_clk *oc;
653 int i;
654
655 pr_debug("omap_hwmod: %s: enabling optional clocks\n", oh->name);
656
657 for (i = oh->opt_clks_cnt, oc = oh->opt_clks; i > 0; i--, oc++)
658 if (oc->_clk) {
659 pr_debug("omap_hwmod: enable %s:%s\n", oc->role,
660 oc->_clk->name);
661 clk_enable(oc->_clk);
662 }
663}
664
665static void _disable_optional_clocks(struct omap_hwmod *oh)
666{
667 struct omap_hwmod_opt_clk *oc;
668 int i;
669
670 pr_debug("omap_hwmod: %s: disabling optional clocks\n", oh->name);
671
672 for (i = oh->opt_clks_cnt, oc = oh->opt_clks; i > 0; i--, oc++)
673 if (oc->_clk) {
674 pr_debug("omap_hwmod: disable %s:%s\n", oc->role,
675 oc->_clk->name);
676 clk_disable(oc->_clk);
677 }
678}
679
547/** 680/**
548 * _find_mpu_port_index - find hwmod OCP slave port ID intended for MPU use 681 * _find_mpu_port_index - find hwmod OCP slave port ID intended for MPU use
549 * @oh: struct omap_hwmod * 682 * @oh: struct omap_hwmod *
@@ -551,7 +684,7 @@ static int _disable_clocks(struct omap_hwmod *oh)
551 * Returns the array index of the OCP slave port that the MPU 684 * Returns the array index of the OCP slave port that the MPU
552 * addresses the device on, or -EINVAL upon error or not found. 685 * addresses the device on, or -EINVAL upon error or not found.
553 */ 686 */
554static int _find_mpu_port_index(struct omap_hwmod *oh) 687static int __init _find_mpu_port_index(struct omap_hwmod *oh)
555{ 688{
556 int i; 689 int i;
557 int found = 0; 690 int found = 0;
@@ -585,7 +718,7 @@ static int _find_mpu_port_index(struct omap_hwmod *oh)
585 * Return the virtual address of the base of the register target of 718 * Return the virtual address of the base of the register target of
586 * device @oh, or NULL on error. 719 * device @oh, or NULL on error.
587 */ 720 */
588static void __iomem *_find_mpu_rt_base(struct omap_hwmod *oh, u8 index) 721static void __iomem * __init _find_mpu_rt_base(struct omap_hwmod *oh, u8 index)
589{ 722{
590 struct omap_hwmod_ocp_if *os; 723 struct omap_hwmod_ocp_if *os;
591 struct omap_hwmod_addr_space *mem; 724 struct omap_hwmod_addr_space *mem;
@@ -622,7 +755,7 @@ static void __iomem *_find_mpu_rt_base(struct omap_hwmod *oh, u8 index)
622} 755}
623 756
624/** 757/**
625 * _sysc_enable - try to bring a module out of idle via OCP_SYSCONFIG 758 * _enable_sysc - try to bring a module out of idle via OCP_SYSCONFIG
626 * @oh: struct omap_hwmod * 759 * @oh: struct omap_hwmod *
627 * 760 *
628 * If module is marked as SWSUP_SIDLE, force the module out of slave 761 * If module is marked as SWSUP_SIDLE, force the module out of slave
@@ -630,7 +763,7 @@ static void __iomem *_find_mpu_rt_base(struct omap_hwmod *oh, u8 index)
630 * as SWSUP_MSUSPEND, force the module out of master standby; 763 * as SWSUP_MSUSPEND, force the module out of master standby;
631 * otherwise, configure it for smart-standby. No return value. 764 * otherwise, configure it for smart-standby. No return value.
632 */ 765 */
633static void _sysc_enable(struct omap_hwmod *oh) 766static void _enable_sysc(struct omap_hwmod *oh)
634{ 767{
635 u8 idlemode, sf; 768 u8 idlemode, sf;
636 u32 v; 769 u32 v;
@@ -653,14 +786,6 @@ static void _sysc_enable(struct omap_hwmod *oh)
653 _set_master_standbymode(oh, idlemode, &v); 786 _set_master_standbymode(oh, idlemode, &v);
654 } 787 }
655 788
656 if (sf & SYSC_HAS_AUTOIDLE) {
657 idlemode = (oh->flags & HWMOD_NO_OCP_AUTOIDLE) ?
658 0 : 1;
659 _set_module_autoidle(oh, idlemode, &v);
660 }
661
662 /* XXX OCP ENAWAKEUP bit? */
663
664 /* 789 /*
665 * XXX The clock framework should handle this, by 790 * XXX The clock framework should handle this, by
666 * calling into this code. But this must wait until the 791 * calling into this code. But this must wait until the
@@ -670,11 +795,26 @@ static void _sysc_enable(struct omap_hwmod *oh)
670 (sf & SYSC_HAS_CLOCKACTIVITY)) 795 (sf & SYSC_HAS_CLOCKACTIVITY))
671 _set_clockactivity(oh, oh->class->sysc->clockact, &v); 796 _set_clockactivity(oh, oh->class->sysc->clockact, &v);
672 797
798 /* If slave is in SMARTIDLE, also enable wakeup */
799 if ((sf & SYSC_HAS_SIDLEMODE) && !(oh->flags & HWMOD_SWSUP_SIDLE))
800 _enable_wakeup(oh, &v);
801
673 _write_sysconfig(v, oh); 802 _write_sysconfig(v, oh);
803
804 /*
805 * Set the autoidle bit only after setting the smartidle bit
806 * Setting this will not have any impact on the other modules.
807 */
808 if (sf & SYSC_HAS_AUTOIDLE) {
809 idlemode = (oh->flags & HWMOD_NO_OCP_AUTOIDLE) ?
810 0 : 1;
811 _set_module_autoidle(oh, idlemode, &v);
812 _write_sysconfig(v, oh);
813 }
674} 814}
675 815
676/** 816/**
677 * _sysc_idle - try to put a module into idle via OCP_SYSCONFIG 817 * _idle_sysc - try to put a module into idle via OCP_SYSCONFIG
678 * @oh: struct omap_hwmod * 818 * @oh: struct omap_hwmod *
679 * 819 *
680 * If module is marked as SWSUP_SIDLE, force the module into slave 820 * If module is marked as SWSUP_SIDLE, force the module into slave
@@ -682,7 +822,7 @@ static void _sysc_enable(struct omap_hwmod *oh)
682 * as SWSUP_MSUSPEND, force the module into master standby; otherwise, 822 * as SWSUP_MSUSPEND, force the module into master standby; otherwise,
683 * configure it for smart-standby. No return value. 823 * configure it for smart-standby. No return value.
684 */ 824 */
685static void _sysc_idle(struct omap_hwmod *oh) 825static void _idle_sysc(struct omap_hwmod *oh)
686{ 826{
687 u8 idlemode, sf; 827 u8 idlemode, sf;
688 u32 v; 828 u32 v;
@@ -705,17 +845,21 @@ static void _sysc_idle(struct omap_hwmod *oh)
705 _set_master_standbymode(oh, idlemode, &v); 845 _set_master_standbymode(oh, idlemode, &v);
706 } 846 }
707 847
848 /* If slave is in SMARTIDLE, also enable wakeup */
849 if ((sf & SYSC_HAS_SIDLEMODE) && !(oh->flags & HWMOD_SWSUP_SIDLE))
850 _enable_wakeup(oh, &v);
851
708 _write_sysconfig(v, oh); 852 _write_sysconfig(v, oh);
709} 853}
710 854
711/** 855/**
712 * _sysc_shutdown - force a module into idle via OCP_SYSCONFIG 856 * _shutdown_sysc - force a module into idle via OCP_SYSCONFIG
713 * @oh: struct omap_hwmod * 857 * @oh: struct omap_hwmod *
714 * 858 *
715 * Force the module into slave idle and master suspend. No return 859 * Force the module into slave idle and master suspend. No return
716 * value. 860 * value.
717 */ 861 */
718static void _sysc_shutdown(struct omap_hwmod *oh) 862static void _shutdown_sysc(struct omap_hwmod *oh)
719{ 863{
720 u32 v; 864 u32 v;
721 u8 sf; 865 u8 sf;
@@ -743,7 +887,6 @@ static void _sysc_shutdown(struct omap_hwmod *oh)
743 * @name: find an omap_hwmod by name 887 * @name: find an omap_hwmod by name
744 * 888 *
745 * Return a pointer to an omap_hwmod by name, or NULL if not found. 889 * Return a pointer to an omap_hwmod by name, or NULL if not found.
746 * Caller must hold omap_hwmod_mutex.
747 */ 890 */
748static struct omap_hwmod *_lookup(const char *name) 891static struct omap_hwmod *_lookup(const char *name)
749{ 892{
@@ -766,18 +909,16 @@ static struct omap_hwmod *_lookup(const char *name)
766 * @oh: struct omap_hwmod * 909 * @oh: struct omap_hwmod *
767 * @data: not used; pass NULL 910 * @data: not used; pass NULL
768 * 911 *
769 * Called by omap_hwmod_late_init() (after omap2_clk_init()). 912 * Called by omap_hwmod_setup_*() (after omap2_clk_init()).
770 * Resolves all clock names embedded in the hwmod. Must be called 913 * Resolves all clock names embedded in the hwmod. Returns 0 on
771 * with omap_hwmod_mutex held. Returns -EINVAL if the omap_hwmod 914 * success, or a negative error code on failure.
772 * has not yet been registered or if the clocks have already been
773 * initialized, 0 on success, or a non-zero error on failure.
774 */ 915 */
775static int _init_clocks(struct omap_hwmod *oh, void *data) 916static int _init_clocks(struct omap_hwmod *oh, void *data)
776{ 917{
777 int ret = 0; 918 int ret = 0;
778 919
779 if (!oh || (oh->_state != _HWMOD_STATE_REGISTERED)) 920 if (oh->_state != _HWMOD_STATE_REGISTERED)
780 return -EINVAL; 921 return 0;
781 922
782 pr_debug("omap_hwmod: %s: looking up clocks\n", oh->name); 923 pr_debug("omap_hwmod: %s: looking up clocks\n", oh->name);
783 924
@@ -788,7 +929,7 @@ static int _init_clocks(struct omap_hwmod *oh, void *data)
788 if (!ret) 929 if (!ret)
789 oh->_state = _HWMOD_STATE_CLKS_INITED; 930 oh->_state = _HWMOD_STATE_CLKS_INITED;
790 931
791 return 0; 932 return ret;
792} 933}
793 934
794/** 935/**
@@ -834,68 +975,252 @@ static int _wait_target_ready(struct omap_hwmod *oh)
834} 975}
835 976
836/** 977/**
837 * _reset - reset an omap_hwmod 978 * _lookup_hardreset - fill register bit info for this hwmod/reset line
979 * @oh: struct omap_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
982 *
983 * Return the bit position of the reset line that match the
984 * input name. Return -ENOENT if not found.
985 */
986static u8 _lookup_hardreset(struct omap_hwmod *oh, const char *name,
987 struct omap_hwmod_rst_info *ohri)
988{
989 int i;
990
991 for (i = 0; i < oh->rst_lines_cnt; i++) {
992 const char *rst_line = oh->rst_lines[i].name;
993 if (!strcmp(rst_line, name)) {
994 ohri->rst_shift = oh->rst_lines[i].rst_shift;
995 ohri->st_shift = oh->rst_lines[i].st_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);
999
1000 return 0;
1001 }
1002 }
1003
1004 return -ENOENT;
1005}
1006
1007/**
1008 * _assert_hardreset - assert the HW reset line of submodules
1009 * contained in the hwmod module.
1010 * @oh: struct omap_hwmod *
1011 * @name: name of the reset line to lookup and assert
1012 *
1013 * Some IP like dsp, ipu or iva contain processor that require
1014 * an HW reset line to be assert / deassert in order to enable fully
1015 * the IP.
1016 */
1017static int _assert_hardreset(struct omap_hwmod *oh, const char *name)
1018{
1019 struct omap_hwmod_rst_info ohri;
1020 u8 ret;
1021
1022 if (!oh)
1023 return -EINVAL;
1024
1025 ret = _lookup_hardreset(oh, name, &ohri);
1026 if (IS_ERR_VALUE(ret))
1027 return ret;
1028
1029 if (cpu_is_omap24xx() || cpu_is_omap34xx())
1030 return omap2_prm_assert_hardreset(oh->prcm.omap2.module_offs,
1031 ohri.rst_shift);
1032 else if (cpu_is_omap44xx())
1033 return omap4_prm_assert_hardreset(oh->prcm.omap4.rstctrl_reg,
1034 ohri.rst_shift);
1035 else
1036 return -EINVAL;
1037}
1038
1039/**
1040 * _deassert_hardreset - deassert the HW reset line of submodules contained
1041 * in the hwmod module.
1042 * @oh: struct omap_hwmod *
1043 * @name: name of the reset line to look up and deassert
1044 *
1045 * Some IP like dsp, ipu or iva contain processor that require
1046 * an HW reset line to be assert / deassert in order to enable fully
1047 * the IP.
1048 */
1049static int _deassert_hardreset(struct omap_hwmod *oh, const char *name)
1050{
1051 struct omap_hwmod_rst_info ohri;
1052 int ret;
1053
1054 if (!oh)
1055 return -EINVAL;
1056
1057 ret = _lookup_hardreset(oh, name, &ohri);
1058 if (IS_ERR_VALUE(ret))
1059 return ret;
1060
1061 if (cpu_is_omap24xx() || cpu_is_omap34xx()) {
1062 ret = omap2_prm_deassert_hardreset(oh->prcm.omap2.module_offs,
1063 ohri.rst_shift,
1064 ohri.st_shift);
1065 } else if (cpu_is_omap44xx()) {
1066 if (ohri.st_shift)
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 {
1072 return -EINVAL;
1073 }
1074
1075 if (ret == -EBUSY)
1076 pr_warning("omap_hwmod: %s: failed to hardreset\n", oh->name);
1077
1078 return ret;
1079}
1080
1081/**
1082 * _read_hardreset - read the HW reset line state of submodules
1083 * contained in the hwmod module
1084 * @oh: struct omap_hwmod *
1085 * @name: name of the reset line to look up and read
1086 *
1087 * Return the state of the reset line.
1088 */
1089static int _read_hardreset(struct omap_hwmod *oh, const char *name)
1090{
1091 struct omap_hwmod_rst_info ohri;
1092 u8 ret;
1093
1094 if (!oh)
1095 return -EINVAL;
1096
1097 ret = _lookup_hardreset(oh, name, &ohri);
1098 if (IS_ERR_VALUE(ret))
1099 return ret;
1100
1101 if (cpu_is_omap24xx() || cpu_is_omap34xx()) {
1102 return omap2_prm_is_hardreset_asserted(oh->prcm.omap2.module_offs,
1103 ohri.st_shift);
1104 } else if (cpu_is_omap44xx()) {
1105 return omap4_prm_is_hardreset_asserted(oh->prcm.omap4.rstctrl_reg,
1106 ohri.rst_shift);
1107 } else {
1108 return -EINVAL;
1109 }
1110}
1111
1112/**
1113 * _ocp_softreset - reset an omap_hwmod via the OCP_SYSCONFIG bit
838 * @oh: struct omap_hwmod * 1114 * @oh: struct omap_hwmod *
839 * 1115 *
840 * Resets an omap_hwmod @oh via the OCP_SYSCONFIG bit. hwmod must be 1116 * Resets an omap_hwmod @oh via the OCP_SYSCONFIG bit. hwmod must be
841 * enabled for this to work. Must be called with omap_hwmod_mutex 1117 * enabled for this to work. Returns -EINVAL if the hwmod cannot be
842 * held. Returns -EINVAL if the hwmod cannot be reset this way or if 1118 * reset this way or if the hwmod is in the wrong state, -ETIMEDOUT if
843 * the hwmod is in the wrong state, -ETIMEDOUT if the module did not 1119 * the module did not reset in time, or 0 upon success.
844 * reset in time, or 0 upon success. 1120 *
1121 * In OMAP3 a specific SYSSTATUS register is used to get the reset status.
1122 * Starting in OMAP4, some IPs do not have SYSSTATUS registers and instead
1123 * use the SYSCONFIG softreset bit to provide the status.
1124 *
1125 * Note that some IP like McBSP do have reset control but don't have
1126 * reset status.
845 */ 1127 */
846static int _reset(struct omap_hwmod *oh) 1128static int _ocp_softreset(struct omap_hwmod *oh)
847{ 1129{
848 u32 r, v; 1130 u32 v;
849 int c = 0; 1131 int c = 0;
1132 int ret = 0;
850 1133
851 if (!oh->class->sysc || 1134 if (!oh->class->sysc ||
852 !(oh->class->sysc->sysc_flags & SYSC_HAS_SOFTRESET) || 1135 !(oh->class->sysc->sysc_flags & SYSC_HAS_SOFTRESET))
853 (oh->class->sysc->sysc_flags & SYSS_MISSING))
854 return -EINVAL; 1136 return -EINVAL;
855 1137
856 /* clocks must be on for this operation */ 1138 /* clocks must be on for this operation */
857 if (oh->_state != _HWMOD_STATE_ENABLED) { 1139 if (oh->_state != _HWMOD_STATE_ENABLED) {
858 WARN(1, "omap_hwmod: %s: reset can only be entered from " 1140 pr_warning("omap_hwmod: %s: reset can only be entered from "
859 "enabled state\n", oh->name); 1141 "enabled state\n", oh->name);
860 return -EINVAL; 1142 return -EINVAL;
861 } 1143 }
862 1144
863 pr_debug("omap_hwmod: %s: resetting\n", oh->name); 1145 /* For some modules, all optionnal clocks need to be enabled as well */
1146 if (oh->flags & HWMOD_CONTROL_OPT_CLKS_IN_RESET)
1147 _enable_optional_clocks(oh);
1148
1149 pr_debug("omap_hwmod: %s: resetting via OCP SOFTRESET\n", oh->name);
864 1150
865 v = oh->_sysc_cache; 1151 v = oh->_sysc_cache;
866 r = _set_softreset(oh, &v); 1152 ret = _set_softreset(oh, &v);
867 if (r) 1153 if (ret)
868 return r; 1154 goto dis_opt_clks;
869 _write_sysconfig(v, oh); 1155 _write_sysconfig(v, oh);
870 1156
871 omap_test_timeout((omap_hwmod_readl(oh, oh->class->sysc->syss_offs) & 1157 if (oh->class->sysc->sysc_flags & SYSS_HAS_RESET_STATUS)
872 SYSS_RESETDONE_MASK), 1158 omap_test_timeout((omap_hwmod_read(oh,
873 MAX_MODULE_RESET_WAIT, c); 1159 oh->class->sysc->syss_offs)
874 1160 & SYSS_RESETDONE_MASK),
875 if (c == MAX_MODULE_RESET_WAIT) 1161 MAX_MODULE_SOFTRESET_WAIT, c);
876 WARN(1, "omap_hwmod: %s: failed to reset in %d usec\n", 1162 else if (oh->class->sysc->sysc_flags & SYSC_HAS_RESET_STATUS)
877 oh->name, MAX_MODULE_RESET_WAIT); 1163 omap_test_timeout(!(omap_hwmod_read(oh,
1164 oh->class->sysc->sysc_offs)
1165 & SYSC_TYPE2_SOFTRESET_MASK),
1166 MAX_MODULE_SOFTRESET_WAIT, c);
1167
1168 if (c == MAX_MODULE_SOFTRESET_WAIT)
1169 pr_warning("omap_hwmod: %s: softreset failed (waited %d usec)\n",
1170 oh->name, MAX_MODULE_SOFTRESET_WAIT);
878 else 1171 else
879 pr_debug("omap_hwmod: %s: reset in %d usec\n", oh->name, c); 1172 pr_debug("omap_hwmod: %s: softreset in %d usec\n", oh->name, c);
880 1173
881 /* 1174 /*
882 * XXX add _HWMOD_STATE_WEDGED for modules that don't come back from 1175 * XXX add _HWMOD_STATE_WEDGED for modules that don't come back from
883 * _wait_target_ready() or _reset() 1176 * _wait_target_ready() or _reset()
884 */ 1177 */
885 1178
886 return (c == MAX_MODULE_RESET_WAIT) ? -ETIMEDOUT : 0; 1179 ret = (c == MAX_MODULE_SOFTRESET_WAIT) ? -ETIMEDOUT : 0;
1180
1181dis_opt_clks:
1182 if (oh->flags & HWMOD_CONTROL_OPT_CLKS_IN_RESET)
1183 _disable_optional_clocks(oh);
1184
1185 return ret;
887} 1186}
888 1187
889/** 1188/**
890 * _omap_hwmod_enable - enable an omap_hwmod 1189 * _reset - reset an omap_hwmod
1190 * @oh: struct omap_hwmod *
1191 *
1192 * Resets an omap_hwmod @oh. The default software reset mechanism for
1193 * most OMAP IP blocks is triggered via the OCP_SYSCONFIG.SOFTRESET
1194 * bit. However, some hwmods cannot be reset via this method: some
1195 * are not targets and therefore have no OCP header registers to
1196 * access; others (like the IVA) have idiosyncratic reset sequences.
1197 * So for these relatively rare cases, custom reset code can be
1198 * supplied in the struct omap_hwmod_class .reset function pointer.
1199 * Passes along the return value from either _reset() or the custom
1200 * reset function - these must return -EINVAL if the hwmod cannot be
1201 * reset this way or if the hwmod is in the wrong state, -ETIMEDOUT if
1202 * the module did not reset in time, or 0 upon success.
1203 */
1204static int _reset(struct omap_hwmod *oh)
1205{
1206 int ret;
1207
1208 pr_debug("omap_hwmod: %s: resetting\n", oh->name);
1209
1210 ret = (oh->class->reset) ? oh->class->reset(oh) : _ocp_softreset(oh);
1211
1212 return ret;
1213}
1214
1215/**
1216 * _enable - enable an omap_hwmod
891 * @oh: struct omap_hwmod * 1217 * @oh: struct omap_hwmod *
892 * 1218 *
893 * Enables an omap_hwmod @oh such that the MPU can access the hwmod's 1219 * Enables an omap_hwmod @oh such that the MPU can access the hwmod's
894 * register target. Must be called with omap_hwmod_mutex held. 1220 * register target. Returns -EINVAL if the hwmod is in the wrong
895 * Returns -EINVAL if the hwmod is in the wrong state or passes along 1221 * state or passes along the return value of _wait_target_ready().
896 * the return value of _wait_target_ready().
897 */ 1222 */
898int _omap_hwmod_enable(struct omap_hwmod *oh) 1223static int _enable(struct omap_hwmod *oh)
899{ 1224{
900 int r; 1225 int r;
901 1226
@@ -909,7 +1234,20 @@ int _omap_hwmod_enable(struct omap_hwmod *oh)
909 1234
910 pr_debug("omap_hwmod: %s: enabling\n", oh->name); 1235 pr_debug("omap_hwmod: %s: enabling\n", oh->name);
911 1236
912 /* XXX mux balls */ 1237 /*
1238 * If an IP contains only one HW reset line, then de-assert it in order
1239 * to allow to enable the clocks. Otherwise the PRCM will return
1240 * Intransition status, and the init will failed.
1241 */
1242 if ((oh->_state == _HWMOD_STATE_INITIALIZED ||
1243 oh->_state == _HWMOD_STATE_DISABLED) && oh->rst_lines_cnt == 1)
1244 _deassert_hardreset(oh, oh->rst_lines[0].name);
1245
1246 /* Mux pins for device runtime if populated */
1247 if (oh->mux && (!oh->mux->enabled ||
1248 ((oh->_state == _HWMOD_STATE_IDLE) &&
1249 oh->mux->pads_dynamic)))
1250 omap_hwmod_mux(oh->mux, _HWMOD_STATE_ENABLED);
913 1251
914 _add_initiator_dep(oh, mpu_oh); 1252 _add_initiator_dep(oh, mpu_oh);
915 _enable_clocks(oh); 1253 _enable_clocks(oh);
@@ -922,9 +1260,10 @@ int _omap_hwmod_enable(struct omap_hwmod *oh)
922 if (oh->class->sysc) { 1260 if (oh->class->sysc) {
923 if (!(oh->_int_flags & _HWMOD_SYSCONFIG_LOADED)) 1261 if (!(oh->_int_flags & _HWMOD_SYSCONFIG_LOADED))
924 _update_sysc_cache(oh); 1262 _update_sysc_cache(oh);
925 _sysc_enable(oh); 1263 _enable_sysc(oh);
926 } 1264 }
927 } else { 1265 } else {
1266 _disable_clocks(oh);
928 pr_debug("omap_hwmod: %s: _wait_target_ready: %d\n", 1267 pr_debug("omap_hwmod: %s: _wait_target_ready: %d\n",
929 oh->name, r); 1268 oh->name, r);
930 } 1269 }
@@ -940,7 +1279,7 @@ int _omap_hwmod_enable(struct omap_hwmod *oh)
940 * no further work. Returns -EINVAL if the hwmod is in the wrong 1279 * no further work. Returns -EINVAL if the hwmod is in the wrong
941 * state or returns 0. 1280 * state or returns 0.
942 */ 1281 */
943int _omap_hwmod_idle(struct omap_hwmod *oh) 1282static int _idle(struct omap_hwmod *oh)
944{ 1283{
945 if (oh->_state != _HWMOD_STATE_ENABLED) { 1284 if (oh->_state != _HWMOD_STATE_ENABLED) {
946 WARN(1, "omap_hwmod: %s: idle state can only be entered from " 1285 WARN(1, "omap_hwmod: %s: idle state can only be entered from "
@@ -951,16 +1290,56 @@ int _omap_hwmod_idle(struct omap_hwmod *oh)
951 pr_debug("omap_hwmod: %s: idling\n", oh->name); 1290 pr_debug("omap_hwmod: %s: idling\n", oh->name);
952 1291
953 if (oh->class->sysc) 1292 if (oh->class->sysc)
954 _sysc_idle(oh); 1293 _idle_sysc(oh);
955 _del_initiator_dep(oh, mpu_oh); 1294 _del_initiator_dep(oh, mpu_oh);
956 _disable_clocks(oh); 1295 _disable_clocks(oh);
957 1296
1297 /* Mux pins for device idle if populated */
1298 if (oh->mux && oh->mux->pads_dynamic)
1299 omap_hwmod_mux(oh->mux, _HWMOD_STATE_IDLE);
1300
958 oh->_state = _HWMOD_STATE_IDLE; 1301 oh->_state = _HWMOD_STATE_IDLE;
959 1302
960 return 0; 1303 return 0;
961} 1304}
962 1305
963/** 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 */
1319int 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/**
964 * _shutdown - shutdown an omap_hwmod 1343 * _shutdown - shutdown an omap_hwmod
965 * @oh: struct omap_hwmod * 1344 * @oh: struct omap_hwmod *
966 * 1345 *
@@ -971,6 +1350,9 @@ int _omap_hwmod_idle(struct omap_hwmod *oh)
971 */ 1350 */
972static int _shutdown(struct omap_hwmod *oh) 1351static int _shutdown(struct omap_hwmod *oh)
973{ 1352{
1353 int ret;
1354 u8 prev_state;
1355
974 if (oh->_state != _HWMOD_STATE_IDLE && 1356 if (oh->_state != _HWMOD_STATE_IDLE &&
975 oh->_state != _HWMOD_STATE_ENABLED) { 1357 oh->_state != _HWMOD_STATE_ENABLED) {
976 WARN(1, "omap_hwmod: %s: disabled state can only be entered " 1358 WARN(1, "omap_hwmod: %s: disabled state can only be entered "
@@ -980,14 +1362,39 @@ static int _shutdown(struct omap_hwmod *oh)
980 1362
981 pr_debug("omap_hwmod: %s: disabling\n", oh->name); 1363 pr_debug("omap_hwmod: %s: disabling\n", oh->name);
982 1364
1365 if (oh->class->pre_shutdown) {
1366 prev_state = oh->_state;
1367 if (oh->_state == _HWMOD_STATE_IDLE)
1368 _enable(oh);
1369 ret = oh->class->pre_shutdown(oh);
1370 if (ret) {
1371 if (prev_state == _HWMOD_STATE_IDLE)
1372 _idle(oh);
1373 return ret;
1374 }
1375 }
1376
983 if (oh->class->sysc) 1377 if (oh->class->sysc)
984 _sysc_shutdown(oh); 1378 _shutdown_sysc(oh);
985 _del_initiator_dep(oh, mpu_oh); 1379
986 /* XXX what about the other system initiators here? DMA, tesla, d2d */ 1380 /*
987 _disable_clocks(oh); 1381 * If an IP contains only one HW reset line, then assert it
1382 * before disabling the clocks and shutting down the IP.
1383 */
1384 if (oh->rst_lines_cnt == 1)
1385 _assert_hardreset(oh, oh->rst_lines[0].name);
1386
1387 /* clocks and deps are already disabled in idle */
1388 if (oh->_state == _HWMOD_STATE_ENABLED) {
1389 _del_initiator_dep(oh, mpu_oh);
1390 /* XXX what about the other system initiators here? dma, dsp */
1391 _disable_clocks(oh);
1392 }
988 /* XXX Should this code also force-disable the optional clocks? */ 1393 /* XXX Should this code also force-disable the optional clocks? */
989 1394
990 /* XXX mux any associated balls to safe mode */ 1395 /* Mux pins to safe mode or use populated off mode values */
1396 if (oh->mux)
1397 omap_hwmod_mux(oh->mux, _HWMOD_STATE_DISABLED);
991 1398
992 oh->_state = _HWMOD_STATE_DISABLED; 1399 oh->_state = _HWMOD_STATE_DISABLED;
993 1400
@@ -997,24 +1404,17 @@ static int _shutdown(struct omap_hwmod *oh)
997/** 1404/**
998 * _setup - do initial configuration of omap_hwmod 1405 * _setup - do initial configuration of omap_hwmod
999 * @oh: struct omap_hwmod * 1406 * @oh: struct omap_hwmod *
1000 * @skip_setup_idle_p: do not idle hwmods at the end of the fn if 1
1001 * 1407 *
1002 * Writes the CLOCKACTIVITY bits @clockact to the hwmod @oh 1408 * Writes the CLOCKACTIVITY bits @clockact to the hwmod @oh
1003 * OCP_SYSCONFIG register. Must be called with omap_hwmod_mutex held. 1409 * OCP_SYSCONFIG register. Returns 0.
1004 * @skip_setup_idle is intended to be used on a system that will not
1005 * call omap_hwmod_enable() to enable devices (e.g., a system without
1006 * PM runtime). Returns -EINVAL if the hwmod is in the wrong state or
1007 * returns 0.
1008 */ 1410 */
1009static int _setup(struct omap_hwmod *oh, void *data) 1411static int _setup(struct omap_hwmod *oh, void *data)
1010{ 1412{
1011 int i, r; 1413 int i, r;
1012 u8 skip_setup_idle; 1414 u8 postsetup_state;
1013
1014 if (!oh || !data)
1015 return -EINVAL;
1016 1415
1017 skip_setup_idle = *(u8 *)data; 1416 if (oh->_state != _HWMOD_STATE_CLKS_INITED)
1417 return 0;
1018 1418
1019 /* Set iclk autoidle mode */ 1419 /* Set iclk autoidle mode */
1020 if (oh->slaves_cnt > 0) { 1420 if (oh->slaves_cnt > 0) {
@@ -1036,7 +1436,17 @@ static int _setup(struct omap_hwmod *oh, void *data)
1036 1436
1037 oh->_state = _HWMOD_STATE_INITIALIZED; 1437 oh->_state = _HWMOD_STATE_INITIALIZED;
1038 1438
1039 r = _omap_hwmod_enable(oh); 1439 /*
1440 * In the case of hwmod with hardreset that should not be
1441 * de-assert at boot time, we have to keep the module
1442 * initialized, because we cannot enable it properly with the
1443 * reset asserted. Exit without warning because that behavior is
1444 * expected.
1445 */
1446 if ((oh->flags & HWMOD_INIT_NO_RESET) && oh->rst_lines_cnt == 1)
1447 return 0;
1448
1449 r = _enable(oh);
1040 if (r) { 1450 if (r) {
1041 pr_warning("omap_hwmod: %s: cannot be enabled (%d)\n", 1451 pr_warning("omap_hwmod: %s: cannot be enabled (%d)\n",
1042 oh->name, oh->_state); 1452 oh->name, oh->_state);
@@ -1044,37 +1454,111 @@ static int _setup(struct omap_hwmod *oh, void *data)
1044 } 1454 }
1045 1455
1046 if (!(oh->flags & HWMOD_INIT_NO_RESET)) { 1456 if (!(oh->flags & HWMOD_INIT_NO_RESET)) {
1457 _reset(oh);
1458
1047 /* 1459 /*
1048 * XXX Do the OCP_SYSCONFIG bits need to be 1460 * OCP_SYSCONFIG bits need to be reprogrammed after a softreset.
1049 * reprogrammed after a reset? If not, then this can 1461 * The _enable() function should be split to
1050 * be removed. If they do, then probably the 1462 * avoid the rewrite of the OCP_SYSCONFIG register.
1051 * _omap_hwmod_enable() function should be split to avoid the
1052 * rewrite of the OCP_SYSCONFIG register.
1053 */ 1463 */
1054 if (oh->class->sysc) { 1464 if (oh->class->sysc) {
1055 _update_sysc_cache(oh); 1465 _update_sysc_cache(oh);
1056 _sysc_enable(oh); 1466 _enable_sysc(oh);
1057 } 1467 }
1058 } 1468 }
1059 1469
1060 if (!(oh->flags & HWMOD_INIT_NO_IDLE) && !skip_setup_idle) 1470 postsetup_state = oh->_postsetup_state;
1061 _omap_hwmod_idle(oh); 1471 if (postsetup_state == _HWMOD_STATE_UNKNOWN)
1472 postsetup_state = _HWMOD_STATE_ENABLED;
1473
1474 /*
1475 * XXX HWMOD_INIT_NO_IDLE does not belong in hwmod data -
1476 * it should be set by the core code as a runtime flag during startup
1477 */
1478 if ((oh->flags & HWMOD_INIT_NO_IDLE) &&
1479 (postsetup_state == _HWMOD_STATE_IDLE))
1480 postsetup_state = _HWMOD_STATE_ENABLED;
1481
1482 if (postsetup_state == _HWMOD_STATE_IDLE)
1483 _idle(oh);
1484 else if (postsetup_state == _HWMOD_STATE_DISABLED)
1485 _shutdown(oh);
1486 else if (postsetup_state != _HWMOD_STATE_ENABLED)
1487 WARN(1, "hwmod: %s: unknown postsetup state %d! defaulting to enabled\n",
1488 oh->name, postsetup_state);
1062 1489
1063 return 0; 1490 return 0;
1064} 1491}
1065 1492
1493/**
1494 * _register - register a struct omap_hwmod
1495 * @oh: struct omap_hwmod *
1496 *
1497 * Registers the omap_hwmod @oh. Returns -EEXIST if an omap_hwmod
1498 * already has been registered by the same name; -EINVAL if the
1499 * omap_hwmod is in the wrong state, if @oh is NULL, if the
1500 * omap_hwmod's class field is NULL; if the omap_hwmod is missing a
1501 * name, or if the omap_hwmod's class is missing a name; or 0 upon
1502 * success.
1503 *
1504 * XXX The data should be copied into bootmem, so the original data
1505 * should be marked __initdata and freed after init. This would allow
1506 * unneeded omap_hwmods to be freed on multi-OMAP configurations. Note
1507 * that the copy process would be relatively complex due to the large number
1508 * of substructures.
1509 */
1510static int __init _register(struct omap_hwmod *oh)
1511{
1512 int ms_id;
1513
1514 if (!oh || !oh->name || !oh->class || !oh->class->name ||
1515 (oh->_state != _HWMOD_STATE_UNKNOWN))
1516 return -EINVAL;
1517
1518 pr_debug("omap_hwmod: %s: registering\n", oh->name);
1519
1520 if (_lookup(oh->name))
1521 return -EEXIST;
1522
1523 ms_id = _find_mpu_port_index(oh);
1524 if (!IS_ERR_VALUE(ms_id))
1525 oh->_mpu_port_index = ms_id;
1526 else
1527 oh->_int_flags |= _HWMOD_NO_MPU_PORT;
1528
1529 list_add_tail(&oh->node, &omap_hwmod_list);
1530
1531 spin_lock_init(&oh->_lock);
1532
1533 oh->_state = _HWMOD_STATE_REGISTERED;
1534
1535 /*
1536 * XXX Rather than doing a strcmp(), this should test a flag
1537 * set in the hwmod data, inserted by the autogenerator code.
1538 */
1539 if (!strcmp(oh->name, MPU_INITIATOR_NAME))
1540 mpu_oh = oh;
1541
1542 return 0;
1543}
1066 1544
1067 1545
1068/* Public functions */ 1546/* Public functions */
1069 1547
1070u32 omap_hwmod_readl(struct omap_hwmod *oh, u16 reg_offs) 1548u32 omap_hwmod_read(struct omap_hwmod *oh, u16 reg_offs)
1071{ 1549{
1072 return __raw_readl(oh->_mpu_rt_va + reg_offs); 1550 if (oh->flags & HWMOD_16BIT_REG)
1551 return __raw_readw(oh->_mpu_rt_va + reg_offs);
1552 else
1553 return __raw_readl(oh->_mpu_rt_va + reg_offs);
1073} 1554}
1074 1555
1075void omap_hwmod_writel(u32 v, struct omap_hwmod *oh, u16 reg_offs) 1556void omap_hwmod_write(u32 v, struct omap_hwmod *oh, u16 reg_offs)
1076{ 1557{
1077 __raw_writel(v, oh->_mpu_rt_va + reg_offs); 1558 if (oh->flags & HWMOD_16BIT_REG)
1559 __raw_writew(v, oh->_mpu_rt_va + reg_offs);
1560 else
1561 __raw_writel(v, oh->_mpu_rt_va + reg_offs);
1078} 1562}
1079 1563
1080/** 1564/**
@@ -1110,59 +1594,6 @@ int omap_hwmod_set_slave_idlemode(struct omap_hwmod *oh, u8 idlemode)
1110} 1594}
1111 1595
1112/** 1596/**
1113 * omap_hwmod_register - register a struct omap_hwmod
1114 * @oh: struct omap_hwmod *
1115 *
1116 * Registers the omap_hwmod @oh. Returns -EEXIST if an omap_hwmod
1117 * already has been registered by the same name; -EINVAL if the
1118 * omap_hwmod is in the wrong state, if @oh is NULL, if the
1119 * omap_hwmod's class field is NULL; if the omap_hwmod is missing a
1120 * name, or if the omap_hwmod's class is missing a name; or 0 upon
1121 * success.
1122 *
1123 * XXX The data should be copied into bootmem, so the original data
1124 * should be marked __initdata and freed after init. This would allow
1125 * unneeded omap_hwmods to be freed on multi-OMAP configurations. Note
1126 * that the copy process would be relatively complex due to the large number
1127 * of substructures.
1128 */
1129int omap_hwmod_register(struct omap_hwmod *oh)
1130{
1131 int ret, ms_id;
1132
1133 if (!oh || !oh->name || !oh->class || !oh->class->name ||
1134 (oh->_state != _HWMOD_STATE_UNKNOWN))
1135 return -EINVAL;
1136
1137 mutex_lock(&omap_hwmod_mutex);
1138
1139 pr_debug("omap_hwmod: %s: registering\n", oh->name);
1140
1141 if (_lookup(oh->name)) {
1142 ret = -EEXIST;
1143 goto ohr_unlock;
1144 }
1145
1146 ms_id = _find_mpu_port_index(oh);
1147 if (!IS_ERR_VALUE(ms_id)) {
1148 oh->_mpu_port_index = ms_id;
1149 oh->_mpu_rt_va = _find_mpu_rt_base(oh, oh->_mpu_port_index);
1150 } else {
1151 oh->_int_flags |= _HWMOD_NO_MPU_PORT;
1152 }
1153
1154 list_add_tail(&oh->node, &omap_hwmod_list);
1155
1156 oh->_state = _HWMOD_STATE_REGISTERED;
1157
1158 ret = 0;
1159
1160ohr_unlock:
1161 mutex_unlock(&omap_hwmod_mutex);
1162 return ret;
1163}
1164
1165/**
1166 * omap_hwmod_lookup - look up a registered omap_hwmod by name 1597 * omap_hwmod_lookup - look up a registered omap_hwmod by name
1167 * @name: name of the omap_hwmod to look up 1598 * @name: name of the omap_hwmod to look up
1168 * 1599 *
@@ -1176,9 +1607,7 @@ struct omap_hwmod *omap_hwmod_lookup(const char *name)
1176 if (!name) 1607 if (!name)
1177 return NULL; 1608 return NULL;
1178 1609
1179 mutex_lock(&omap_hwmod_mutex);
1180 oh = _lookup(name); 1610 oh = _lookup(name);
1181 mutex_unlock(&omap_hwmod_mutex);
1182 1611
1183 return oh; 1612 return oh;
1184} 1613}
@@ -1199,149 +1628,186 @@ int omap_hwmod_for_each(int (*fn)(struct omap_hwmod *oh, void *data),
1199 void *data) 1628 void *data)
1200{ 1629{
1201 struct omap_hwmod *temp_oh; 1630 struct omap_hwmod *temp_oh;
1202 int ret; 1631 int ret = 0;
1203 1632
1204 if (!fn) 1633 if (!fn)
1205 return -EINVAL; 1634 return -EINVAL;
1206 1635
1207 mutex_lock(&omap_hwmod_mutex);
1208 list_for_each_entry(temp_oh, &omap_hwmod_list, node) { 1636 list_for_each_entry(temp_oh, &omap_hwmod_list, node) {
1209 ret = (*fn)(temp_oh, data); 1637 ret = (*fn)(temp_oh, data);
1210 if (ret) 1638 if (ret)
1211 break; 1639 break;
1212 } 1640 }
1213 mutex_unlock(&omap_hwmod_mutex);
1214 1641
1215 return ret; 1642 return ret;
1216} 1643}
1217 1644
1218
1219/** 1645/**
1220 * omap_hwmod_init - init omap_hwmod code and register hwmods 1646 * omap_hwmod_register - register an array of hwmods
1221 * @ohs: pointer to an array of omap_hwmods to register 1647 * @ohs: pointer to an array of omap_hwmods to register
1222 * 1648 *
1223 * Intended to be called early in boot before the clock framework is 1649 * Intended to be called early in boot before the clock framework is
1224 * initialized. If @ohs is not null, will register all omap_hwmods 1650 * initialized. If @ohs is not null, will register all omap_hwmods
1225 * listed in @ohs that are valid for this chip. Returns -EINVAL if 1651 * listed in @ohs that are valid for this chip. Returns 0.
1226 * omap_hwmod_init() has already been called or 0 otherwise.
1227 */ 1652 */
1228int omap_hwmod_init(struct omap_hwmod **ohs) 1653int __init omap_hwmod_register(struct omap_hwmod **ohs)
1229{ 1654{
1230 struct omap_hwmod *oh; 1655 int r, i;
1231 int r;
1232 1656
1233 if (inited) 1657 if (!ohs)
1234 return -EINVAL; 1658 return 0;
1235 1659
1236 inited = 1; 1660 i = 0;
1661 do {
1662 if (!omap_chip_is(ohs[i]->omap_chip))
1663 continue;
1237 1664
1238 if (!ohs) 1665 r = _register(ohs[i]);
1666 WARN(r, "omap_hwmod: %s: _register returned %d\n", ohs[i]->name,
1667 r);
1668 } while (ohs[++i]);
1669
1670 return 0;
1671}
1672
1673/*
1674 * _populate_mpu_rt_base - populate the virtual address for a hwmod
1675 *
1676 * Must be called only from omap_hwmod_setup_*() so ioremap works properly.
1677 * Assumes the caller takes care of locking if needed.
1678 */
1679static int __init _populate_mpu_rt_base(struct omap_hwmod *oh, void *data)
1680{
1681 if (oh->_state != _HWMOD_STATE_REGISTERED)
1239 return 0; 1682 return 0;
1240 1683
1241 oh = *ohs; 1684 if (oh->_int_flags & _HWMOD_NO_MPU_PORT)
1242 while (oh) { 1685 return 0;
1243 if (omap_chip_is(oh->omap_chip)) { 1686
1244 r = omap_hwmod_register(oh); 1687 oh->_mpu_rt_va = _find_mpu_rt_base(oh, oh->_mpu_port_index);
1245 WARN(r, "omap_hwmod: %s: omap_hwmod_register returned " 1688 if (!oh->_mpu_rt_va)
1246 "%d\n", oh->name, r); 1689 pr_warning("omap_hwmod: %s found no _mpu_rt_va for %s\n",
1247 } 1690 __func__, oh->name);
1248 oh = *++ohs;
1249 }
1250 1691
1251 return 0; 1692 return 0;
1252} 1693}
1253 1694
1254/** 1695/**
1255 * omap_hwmod_late_init - do some post-clock framework initialization 1696 * omap_hwmod_setup_one - set up a single hwmod
1256 * @skip_setup_idle: if 1, do not idle hwmods in _setup() 1697 * @oh_name: const char * name of the already-registered hwmod to set up
1257 * 1698 *
1258 * Must be called after omap2_clk_init(). Resolves the struct clk names 1699 * Must be called after omap2_clk_init(). Resolves the struct clk
1259 * to struct clk pointers for each registered omap_hwmod. Also calls 1700 * names to struct clk pointers for each registered omap_hwmod. Also
1260 * _setup() on each hwmod. Returns 0. 1701 * calls _setup() on each hwmod. Returns -EINVAL upon error or 0 upon
1702 * success.
1261 */ 1703 */
1262int omap_hwmod_late_init(u8 skip_setup_idle) 1704int __init omap_hwmod_setup_one(const char *oh_name)
1263{ 1705{
1706 struct omap_hwmod *oh;
1264 int r; 1707 int r;
1265 1708
1266 /* XXX check return value */ 1709 pr_debug("omap_hwmod: %s: %s\n", oh_name, __func__);
1267 r = omap_hwmod_for_each(_init_clocks, NULL);
1268 WARN(r, "omap_hwmod: omap_hwmod_late_init(): _init_clocks failed\n");
1269 1710
1270 mpu_oh = omap_hwmod_lookup(MPU_INITIATOR_NAME); 1711 if (!mpu_oh) {
1271 WARN(!mpu_oh, "omap_hwmod: could not find MPU initiator hwmod %s\n", 1712 pr_err("omap_hwmod: %s: cannot setup_one: MPU initiator hwmod %s not yet registered\n",
1272 MPU_INITIATOR_NAME); 1713 oh_name, MPU_INITIATOR_NAME);
1714 return -EINVAL;
1715 }
1273 1716
1274 if (skip_setup_idle) 1717 oh = _lookup(oh_name);
1275 pr_debug("omap_hwmod: will leave hwmods enabled during setup\n"); 1718 if (!oh) {
1719 WARN(1, "omap_hwmod: %s: hwmod not yet registered\n", oh_name);
1720 return -EINVAL;
1721 }
1276 1722
1277 omap_hwmod_for_each(_setup, &skip_setup_idle); 1723 if (mpu_oh->_state == _HWMOD_STATE_REGISTERED && oh != mpu_oh)
1724 omap_hwmod_setup_one(MPU_INITIATOR_NAME);
1725
1726 r = _populate_mpu_rt_base(oh, NULL);
1727 if (IS_ERR_VALUE(r)) {
1728 WARN(1, "omap_hwmod: %s: couldn't set mpu_rt_base\n", oh_name);
1729 return -EINVAL;
1730 }
1731
1732 r = _init_clocks(oh, NULL);
1733 if (IS_ERR_VALUE(r)) {
1734 WARN(1, "omap_hwmod: %s: couldn't init clocks\n", oh_name);
1735 return -EINVAL;
1736 }
1737
1738 _setup(oh, NULL);
1278 1739
1279 return 0; 1740 return 0;
1280} 1741}
1281 1742
1282/** 1743/**
1283 * omap_hwmod_unregister - unregister an omap_hwmod 1744 * omap_hwmod_setup - do some post-clock framework initialization
1284 * @oh: struct omap_hwmod *
1285 * 1745 *
1286 * Unregisters a previously-registered omap_hwmod @oh. There's probably 1746 * Must be called after omap2_clk_init(). Resolves the struct clk names
1287 * no use case for this, so it is likely to be removed in a later version. 1747 * to struct clk pointers for each registered omap_hwmod. Also calls
1288 * 1748 * _setup() on each hwmod. Returns 0 upon success.
1289 * XXX Free all of the bootmem-allocated structures here when that is
1290 * implemented. Make it clear that core code is the only code that is
1291 * expected to unregister modules.
1292 */ 1749 */
1293int omap_hwmod_unregister(struct omap_hwmod *oh) 1750static int __init omap_hwmod_setup_all(void)
1294{ 1751{
1295 if (!oh) 1752 int r;
1753
1754 if (!mpu_oh) {
1755 pr_err("omap_hwmod: %s: MPU initiator hwmod %s not yet registered\n",
1756 __func__, MPU_INITIATOR_NAME);
1296 return -EINVAL; 1757 return -EINVAL;
1758 }
1759
1760 r = omap_hwmod_for_each(_populate_mpu_rt_base, NULL);
1297 1761
1298 pr_debug("omap_hwmod: %s: unregistering\n", oh->name); 1762 r = omap_hwmod_for_each(_init_clocks, NULL);
1763 WARN(IS_ERR_VALUE(r),
1764 "omap_hwmod: %s: _init_clocks failed\n", __func__);
1299 1765
1300 mutex_lock(&omap_hwmod_mutex); 1766 omap_hwmod_for_each(_setup, NULL);
1301 iounmap(oh->_mpu_rt_va);
1302 list_del(&oh->node);
1303 mutex_unlock(&omap_hwmod_mutex);
1304 1767
1305 return 0; 1768 return 0;
1306} 1769}
1770core_initcall(omap_hwmod_setup_all);
1307 1771
1308/** 1772/**
1309 * omap_hwmod_enable - enable an omap_hwmod 1773 * omap_hwmod_enable - enable an omap_hwmod
1310 * @oh: struct omap_hwmod * 1774 * @oh: struct omap_hwmod *
1311 * 1775 *
1312 * Enable an omap_hwomd @oh. Intended to be called by omap_device_enable(). 1776 * Enable an omap_hwmod @oh. Intended to be called by omap_device_enable().
1313 * Returns -EINVAL on error or passes along the return value from _enable(). 1777 * Returns -EINVAL on error or passes along the return value from _enable().
1314 */ 1778 */
1315int omap_hwmod_enable(struct omap_hwmod *oh) 1779int omap_hwmod_enable(struct omap_hwmod *oh)
1316{ 1780{
1317 int r; 1781 int r;
1782 unsigned long flags;
1318 1783
1319 if (!oh) 1784 if (!oh)
1320 return -EINVAL; 1785 return -EINVAL;
1321 1786
1322 mutex_lock(&omap_hwmod_mutex); 1787 spin_lock_irqsave(&oh->_lock, flags);
1323 r = _omap_hwmod_enable(oh); 1788 r = _enable(oh);
1324 mutex_unlock(&omap_hwmod_mutex); 1789 spin_unlock_irqrestore(&oh->_lock, flags);
1325 1790
1326 return r; 1791 return r;
1327} 1792}
1328 1793
1329
1330/** 1794/**
1331 * omap_hwmod_idle - idle an omap_hwmod 1795 * omap_hwmod_idle - idle an omap_hwmod
1332 * @oh: struct omap_hwmod * 1796 * @oh: struct omap_hwmod *
1333 * 1797 *
1334 * Idle an omap_hwomd @oh. Intended to be called by omap_device_idle(). 1798 * Idle an omap_hwmod @oh. Intended to be called by omap_device_idle().
1335 * Returns -EINVAL on error or passes along the return value from _idle(). 1799 * Returns -EINVAL on error or passes along the return value from _idle().
1336 */ 1800 */
1337int omap_hwmod_idle(struct omap_hwmod *oh) 1801int omap_hwmod_idle(struct omap_hwmod *oh)
1338{ 1802{
1803 unsigned long flags;
1804
1339 if (!oh) 1805 if (!oh)
1340 return -EINVAL; 1806 return -EINVAL;
1341 1807
1342 mutex_lock(&omap_hwmod_mutex); 1808 spin_lock_irqsave(&oh->_lock, flags);
1343 _omap_hwmod_idle(oh); 1809 _idle(oh);
1344 mutex_unlock(&omap_hwmod_mutex); 1810 spin_unlock_irqrestore(&oh->_lock, flags);
1345 1811
1346 return 0; 1812 return 0;
1347} 1813}
@@ -1350,18 +1816,20 @@ int omap_hwmod_idle(struct omap_hwmod *oh)
1350 * omap_hwmod_shutdown - shutdown an omap_hwmod 1816 * omap_hwmod_shutdown - shutdown an omap_hwmod
1351 * @oh: struct omap_hwmod * 1817 * @oh: struct omap_hwmod *
1352 * 1818 *
1353 * Shutdown an omap_hwomd @oh. Intended to be called by 1819 * Shutdown an omap_hwmod @oh. Intended to be called by
1354 * omap_device_shutdown(). Returns -EINVAL on error or passes along 1820 * omap_device_shutdown(). Returns -EINVAL on error or passes along
1355 * the return value from _shutdown(). 1821 * the return value from _shutdown().
1356 */ 1822 */
1357int omap_hwmod_shutdown(struct omap_hwmod *oh) 1823int omap_hwmod_shutdown(struct omap_hwmod *oh)
1358{ 1824{
1825 unsigned long flags;
1826
1359 if (!oh) 1827 if (!oh)
1360 return -EINVAL; 1828 return -EINVAL;
1361 1829
1362 mutex_lock(&omap_hwmod_mutex); 1830 spin_lock_irqsave(&oh->_lock, flags);
1363 _shutdown(oh); 1831 _shutdown(oh);
1364 mutex_unlock(&omap_hwmod_mutex); 1832 spin_unlock_irqrestore(&oh->_lock, flags);
1365 1833
1366 return 0; 1834 return 0;
1367} 1835}
@@ -1374,9 +1842,11 @@ int omap_hwmod_shutdown(struct omap_hwmod *oh)
1374 */ 1842 */
1375int omap_hwmod_enable_clocks(struct omap_hwmod *oh) 1843int omap_hwmod_enable_clocks(struct omap_hwmod *oh)
1376{ 1844{
1377 mutex_lock(&omap_hwmod_mutex); 1845 unsigned long flags;
1846
1847 spin_lock_irqsave(&oh->_lock, flags);
1378 _enable_clocks(oh); 1848 _enable_clocks(oh);
1379 mutex_unlock(&omap_hwmod_mutex); 1849 spin_unlock_irqrestore(&oh->_lock, flags);
1380 1850
1381 return 0; 1851 return 0;
1382} 1852}
@@ -1389,9 +1859,11 @@ int omap_hwmod_enable_clocks(struct omap_hwmod *oh)
1389 */ 1859 */
1390int omap_hwmod_disable_clocks(struct omap_hwmod *oh) 1860int omap_hwmod_disable_clocks(struct omap_hwmod *oh)
1391{ 1861{
1392 mutex_lock(&omap_hwmod_mutex); 1862 unsigned long flags;
1863
1864 spin_lock_irqsave(&oh->_lock, flags);
1393 _disable_clocks(oh); 1865 _disable_clocks(oh);
1394 mutex_unlock(&omap_hwmod_mutex); 1866 spin_unlock_irqrestore(&oh->_lock, flags);
1395 1867
1396 return 0; 1868 return 0;
1397} 1869}
@@ -1421,7 +1893,7 @@ void omap_hwmod_ocp_barrier(struct omap_hwmod *oh)
1421 * Forces posted writes to complete on the OCP thread handling 1893 * Forces posted writes to complete on the OCP thread handling
1422 * register writes 1894 * register writes
1423 */ 1895 */
1424 omap_hwmod_readl(oh, oh->class->sysc->sysc_offs); 1896 omap_hwmod_read(oh, oh->class->sysc->sysc_offs);
1425} 1897}
1426 1898
1427/** 1899/**
@@ -1430,20 +1902,19 @@ void omap_hwmod_ocp_barrier(struct omap_hwmod *oh)
1430 * 1902 *
1431 * Under some conditions, a driver may wish to reset the entire device. 1903 * Under some conditions, a driver may wish to reset the entire device.
1432 * Called from omap_device code. Returns -EINVAL on error or passes along 1904 * Called from omap_device code. Returns -EINVAL on error or passes along
1433 * the return value from _reset()/_enable(). 1905 * the return value from _reset().
1434 */ 1906 */
1435int omap_hwmod_reset(struct omap_hwmod *oh) 1907int omap_hwmod_reset(struct omap_hwmod *oh)
1436{ 1908{
1437 int r; 1909 int r;
1910 unsigned long flags;
1438 1911
1439 if (!oh || !(oh->_state & _HWMOD_STATE_ENABLED)) 1912 if (!oh)
1440 return -EINVAL; 1913 return -EINVAL;
1441 1914
1442 mutex_lock(&omap_hwmod_mutex); 1915 spin_lock_irqsave(&oh->_lock, flags);
1443 r = _reset(oh); 1916 r = _reset(oh);
1444 if (!r) 1917 spin_unlock_irqrestore(&oh->_lock, flags);
1445 r = _omap_hwmod_enable(oh);
1446 mutex_unlock(&omap_hwmod_mutex);
1447 1918
1448 return r; 1919 return r;
1449} 1920}
@@ -1468,7 +1939,7 @@ int omap_hwmod_count_resources(struct omap_hwmod *oh)
1468{ 1939{
1469 int ret, i; 1940 int ret, i;
1470 1941
1471 ret = oh->mpu_irqs_cnt + oh->sdma_chs_cnt; 1942 ret = oh->mpu_irqs_cnt + oh->sdma_reqs_cnt;
1472 1943
1473 for (i = 0; i < oh->slaves_cnt; i++) 1944 for (i = 0; i < oh->slaves_cnt; i++)
1474 ret += oh->slaves[i]->addr_cnt; 1945 ret += oh->slaves[i]->addr_cnt;
@@ -1501,10 +1972,10 @@ int omap_hwmod_fill_resources(struct omap_hwmod *oh, struct resource *res)
1501 r++; 1972 r++;
1502 } 1973 }
1503 1974
1504 for (i = 0; i < oh->sdma_chs_cnt; i++) { 1975 for (i = 0; i < oh->sdma_reqs_cnt; i++) {
1505 (res + r)->name = (oh->sdma_chs + i)->name; 1976 (res + r)->name = (oh->sdma_reqs + i)->name;
1506 (res + r)->start = (oh->sdma_chs + i)->dma_ch; 1977 (res + r)->start = (oh->sdma_reqs + i)->dma_req;
1507 (res + r)->end = (oh->sdma_chs + i)->dma_ch; 1978 (res + r)->end = (oh->sdma_reqs + i)->dma_req;
1508 (res + r)->flags = IORESOURCE_DMA; 1979 (res + r)->flags = IORESOURCE_DMA;
1509 r++; 1980 r++;
1510 } 1981 }
@@ -1515,6 +1986,7 @@ int omap_hwmod_fill_resources(struct omap_hwmod *oh, struct resource *res)
1515 os = oh->slaves[i]; 1986 os = oh->slaves[i];
1516 1987
1517 for (j = 0; j < os->addr_cnt; j++) { 1988 for (j = 0; j < os->addr_cnt; j++) {
1989 (res + r)->name = (os->addr + j)->name;
1518 (res + r)->start = (os->addr + j)->pa_start; 1990 (res + r)->start = (os->addr + j)->pa_start;
1519 (res + r)->end = (os->addr + j)->pa_end; 1991 (res + r)->end = (os->addr + j)->pa_end;
1520 (res + r)->flags = IORESOURCE_MEM; 1992 (res + r)->flags = IORESOURCE_MEM;
@@ -1640,13 +2112,18 @@ int omap_hwmod_del_initiator_dep(struct omap_hwmod *oh,
1640 */ 2112 */
1641int omap_hwmod_enable_wakeup(struct omap_hwmod *oh) 2113int omap_hwmod_enable_wakeup(struct omap_hwmod *oh)
1642{ 2114{
2115 unsigned long flags;
2116 u32 v;
2117
1643 if (!oh->class->sysc || 2118 if (!oh->class->sysc ||
1644 !(oh->class->sysc->sysc_flags & SYSC_HAS_ENAWAKEUP)) 2119 !(oh->class->sysc->sysc_flags & SYSC_HAS_ENAWAKEUP))
1645 return -EINVAL; 2120 return -EINVAL;
1646 2121
1647 mutex_lock(&omap_hwmod_mutex); 2122 spin_lock_irqsave(&oh->_lock, flags);
1648 _enable_wakeup(oh); 2123 v = oh->_sysc_cache;
1649 mutex_unlock(&omap_hwmod_mutex); 2124 _enable_wakeup(oh, &v);
2125 _write_sysconfig(v, oh);
2126 spin_unlock_irqrestore(&oh->_lock, flags);
1650 2127
1651 return 0; 2128 return 0;
1652} 2129}
@@ -1665,26 +2142,111 @@ int omap_hwmod_enable_wakeup(struct omap_hwmod *oh)
1665 */ 2142 */
1666int omap_hwmod_disable_wakeup(struct omap_hwmod *oh) 2143int omap_hwmod_disable_wakeup(struct omap_hwmod *oh)
1667{ 2144{
2145 unsigned long flags;
2146 u32 v;
2147
1668 if (!oh->class->sysc || 2148 if (!oh->class->sysc ||
1669 !(oh->class->sysc->sysc_flags & SYSC_HAS_ENAWAKEUP)) 2149 !(oh->class->sysc->sysc_flags & SYSC_HAS_ENAWAKEUP))
1670 return -EINVAL; 2150 return -EINVAL;
1671 2151
1672 mutex_lock(&omap_hwmod_mutex); 2152 spin_lock_irqsave(&oh->_lock, flags);
1673 _disable_wakeup(oh); 2153 v = oh->_sysc_cache;
1674 mutex_unlock(&omap_hwmod_mutex); 2154 _disable_wakeup(oh, &v);
2155 _write_sysconfig(v, oh);
2156 spin_unlock_irqrestore(&oh->_lock, flags);
1675 2157
1676 return 0; 2158 return 0;
1677} 2159}
1678 2160
1679/** 2161/**
2162 * omap_hwmod_assert_hardreset - assert the HW reset line of submodules
2163 * contained in the hwmod module.
2164 * @oh: struct omap_hwmod *
2165 * @name: name of the reset line to lookup and assert
2166 *
2167 * Some IP like dsp, ipu or iva contain processor that require
2168 * an HW reset line to be assert / deassert in order to enable fully
2169 * the IP. Returns -EINVAL if @oh is null or if the operation is not
2170 * yet supported on this OMAP; otherwise, passes along the return value
2171 * from _assert_hardreset().
2172 */
2173int omap_hwmod_assert_hardreset(struct omap_hwmod *oh, const char *name)
2174{
2175 int ret;
2176 unsigned long flags;
2177
2178 if (!oh)
2179 return -EINVAL;
2180
2181 spin_lock_irqsave(&oh->_lock, flags);
2182 ret = _assert_hardreset(oh, name);
2183 spin_unlock_irqrestore(&oh->_lock, flags);
2184
2185 return ret;
2186}
2187
2188/**
2189 * omap_hwmod_deassert_hardreset - deassert the HW reset line of submodules
2190 * contained in the hwmod module.
2191 * @oh: struct omap_hwmod *
2192 * @name: name of the reset line to look up and deassert
2193 *
2194 * Some IP like dsp, ipu or iva contain processor that require
2195 * an HW reset line to be assert / deassert in order to enable fully
2196 * the IP. Returns -EINVAL if @oh is null or if the operation is not
2197 * yet supported on this OMAP; otherwise, passes along the return value
2198 * from _deassert_hardreset().
2199 */
2200int omap_hwmod_deassert_hardreset(struct omap_hwmod *oh, const char *name)
2201{
2202 int ret;
2203 unsigned long flags;
2204
2205 if (!oh)
2206 return -EINVAL;
2207
2208 spin_lock_irqsave(&oh->_lock, flags);
2209 ret = _deassert_hardreset(oh, name);
2210 spin_unlock_irqrestore(&oh->_lock, flags);
2211
2212 return ret;
2213}
2214
2215/**
2216 * omap_hwmod_read_hardreset - read the HW reset line state of submodules
2217 * contained in the hwmod module
2218 * @oh: struct omap_hwmod *
2219 * @name: name of the reset line to look up and read
2220 *
2221 * Return the current state of the hwmod @oh's reset line named @name:
2222 * returns -EINVAL upon parameter error or if this operation
2223 * is unsupported on the current OMAP; otherwise, passes along the return
2224 * value from _read_hardreset().
2225 */
2226int omap_hwmod_read_hardreset(struct omap_hwmod *oh, const char *name)
2227{
2228 int ret;
2229 unsigned long flags;
2230
2231 if (!oh)
2232 return -EINVAL;
2233
2234 spin_lock_irqsave(&oh->_lock, flags);
2235 ret = _read_hardreset(oh, name);
2236 spin_unlock_irqrestore(&oh->_lock, flags);
2237
2238 return ret;
2239}
2240
2241
2242/**
1680 * omap_hwmod_for_each_by_class - call @fn for each hwmod of class @classname 2243 * omap_hwmod_for_each_by_class - call @fn for each hwmod of class @classname
1681 * @classname: struct omap_hwmod_class name to search for 2244 * @classname: struct omap_hwmod_class name to search for
1682 * @fn: callback function pointer to call for each hwmod in class @classname 2245 * @fn: callback function pointer to call for each hwmod in class @classname
1683 * @user: arbitrary context data to pass to the callback function 2246 * @user: arbitrary context data to pass to the callback function
1684 * 2247 *
1685 * For each omap_hwmod of class @classname, call @fn. Takes 2248 * For each omap_hwmod of class @classname, call @fn.
1686 * omap_hwmod_mutex to prevent the hwmod list from changing during the 2249 * If the callback function returns something other than
1687 * iteration. If the callback function returns something other than
1688 * zero, the iterator is terminated, and the callback function's return 2250 * zero, the iterator is terminated, and the callback function's return
1689 * value is passed back to the caller. Returns 0 upon success, -EINVAL 2251 * value is passed back to the caller. Returns 0 upon success, -EINVAL
1690 * if @classname or @fn are NULL, or passes back the error code from @fn. 2252 * if @classname or @fn are NULL, or passes back the error code from @fn.
@@ -1703,8 +2265,6 @@ int omap_hwmod_for_each_by_class(const char *classname,
1703 pr_debug("omap_hwmod: %s: looking for modules of class %s\n", 2265 pr_debug("omap_hwmod: %s: looking for modules of class %s\n",
1704 __func__, classname); 2266 __func__, classname);
1705 2267
1706 mutex_lock(&omap_hwmod_mutex);
1707
1708 list_for_each_entry(temp_oh, &omap_hwmod_list, node) { 2268 list_for_each_entry(temp_oh, &omap_hwmod_list, node) {
1709 if (!strcmp(temp_oh->class->name, classname)) { 2269 if (!strcmp(temp_oh->class->name, classname)) {
1710 pr_debug("omap_hwmod: %s: %s: calling callback fn\n", 2270 pr_debug("omap_hwmod: %s: %s: calling callback fn\n",
@@ -1715,8 +2275,6 @@ int omap_hwmod_for_each_by_class(const char *classname,
1715 } 2275 }
1716 } 2276 }
1717 2277
1718 mutex_unlock(&omap_hwmod_mutex);
1719
1720 if (ret) 2278 if (ret)
1721 pr_debug("omap_hwmod: %s: iterator terminated early: %d\n", 2279 pr_debug("omap_hwmod: %s: iterator terminated early: %d\n",
1722 __func__, ret); 2280 __func__, ret);
@@ -1724,3 +2282,90 @@ int omap_hwmod_for_each_by_class(const char *classname,
1724 return ret; 2282 return ret;
1725} 2283}
1726 2284
2285/**
2286 * omap_hwmod_set_postsetup_state - set the post-_setup() state for this hwmod
2287 * @oh: struct omap_hwmod *
2288 * @state: state that _setup() should leave the hwmod in
2289 *
2290 * Sets the hwmod state that @oh will enter at the end of _setup()
2291 * (called by omap_hwmod_setup_*()). Only valid to call between
2292 * calling omap_hwmod_register() and omap_hwmod_setup_*(). Returns
2293 * 0 upon success or -EINVAL if there is a problem with the arguments
2294 * or if the hwmod is in the wrong state.
2295 */
2296int omap_hwmod_set_postsetup_state(struct omap_hwmod *oh, u8 state)
2297{
2298 int ret;
2299 unsigned long flags;
2300
2301 if (!oh)
2302 return -EINVAL;
2303
2304 if (state != _HWMOD_STATE_DISABLED &&
2305 state != _HWMOD_STATE_ENABLED &&
2306 state != _HWMOD_STATE_IDLE)
2307 return -EINVAL;
2308
2309 spin_lock_irqsave(&oh->_lock, flags);
2310
2311 if (oh->_state != _HWMOD_STATE_REGISTERED) {
2312 ret = -EINVAL;
2313 goto ohsps_unlock;
2314 }
2315
2316 oh->_postsetup_state = state;
2317 ret = 0;
2318
2319ohsps_unlock:
2320 spin_unlock_irqrestore(&oh->_lock, flags);
2321
2322 return ret;
2323}
2324
2325/**
2326 * omap_hwmod_get_context_loss_count - get lost context count
2327 * @oh: struct omap_hwmod *
2328 *
2329 * Query the powerdomain of of @oh to get the context loss
2330 * count for this device.
2331 *
2332 * Returns the context loss count of the powerdomain assocated with @oh
2333 * upon success, or zero if no powerdomain exists for @oh.
2334 */
2335u32 omap_hwmod_get_context_loss_count(struct omap_hwmod *oh)
2336{
2337 struct powerdomain *pwrdm;
2338 int ret = 0;
2339
2340 pwrdm = omap_hwmod_get_pwrdm(oh);
2341 if (pwrdm)
2342 ret = pwrdm_get_context_loss_count(pwrdm);
2343
2344 return ret;
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 */
2357int 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}