]> Pileus Git - ~andy/linux/blob - arch/arm/mach-omap2/omap_hwmod.c
Merge tag 'omap-devel-c-for-3.6' of git://git.kernel.org/pub/scm/linux/kernel/git...
[~andy/linux] / arch / arm / mach-omap2 / omap_hwmod.c
1 /*
2  * omap_hwmod implementation for OMAP2/3/4
3  *
4  * Copyright (C) 2009-2011 Nokia Corporation
5  * Copyright (C) 2011-2012 Texas Instruments, Inc.
6  *
7  * Paul Walmsley, BenoĆ®t Cousson, Kevin Hilman
8  *
9  * Created in collaboration with (alphabetical order): Thara Gopinath,
10  * Tony Lindgren, Rajendra Nayak, Vikram Pandita, Sakari Poussa, Anand
11  * Sawant, Santosh Shilimkar, Richard Woodruff
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  * Introduction
18  * ------------
19  * One way to view an OMAP SoC is as a collection of largely unrelated
20  * IP blocks connected by interconnects.  The IP blocks include
21  * devices such as ARM processors, audio serial interfaces, UARTs,
22  * etc.  Some of these devices, like the DSP, are created by TI;
23  * others, like the SGX, largely originate from external vendors.  In
24  * TI's documentation, on-chip devices are referred to as "OMAP
25  * modules."  Some of these IP blocks are identical across several
26  * OMAP versions.  Others are revised frequently.
27  *
28  * These OMAP modules are tied together by various interconnects.
29  * Most of the address and data flow between modules is via OCP-based
30  * interconnects such as the L3 and L4 buses; but there are other
31  * interconnects that distribute the hardware clock tree, handle idle
32  * and reset signaling, supply power, and connect the modules to
33  * various pads or balls on the OMAP package.
34  *
35  * OMAP hwmod provides a consistent way to describe the on-chip
36  * hardware blocks and their integration into the rest of the chip.
37  * This description can be automatically generated from the TI
38  * hardware database.  OMAP hwmod provides a standard, consistent API
39  * to reset, enable, idle, and disable these hardware blocks.  And
40  * hwmod provides a way for other core code, such as the Linux device
41  * code or the OMAP power management and address space mapping code,
42  * to query the hardware database.
43  *
44  * Using hwmod
45  * -----------
46  * Drivers won't call hwmod functions directly.  That is done by the
47  * omap_device code, and in rare occasions, by custom integration code
48  * in arch/arm/ *omap*.  The omap_device code includes functions to
49  * build a struct platform_device using omap_hwmod data, and that is
50  * currently how hwmod data is communicated to drivers and to the
51  * Linux driver model.  Most drivers will call omap_hwmod functions only
52  * indirectly, via pm_runtime*() functions.
53  *
54  * From a layering perspective, here is where the OMAP hwmod code
55  * fits into the kernel software stack:
56  *
57  *            +-------------------------------+
58  *            |      Device driver code       |
59  *            |      (e.g., drivers/)         |
60  *            +-------------------------------+
61  *            |      Linux driver model       |
62  *            |     (platform_device /        |
63  *            |  platform_driver data/code)   |
64  *            +-------------------------------+
65  *            | OMAP core-driver integration  |
66  *            |(arch/arm/mach-omap2/devices.c)|
67  *            +-------------------------------+
68  *            |      omap_device code         |
69  *            | (../plat-omap/omap_device.c)  |
70  *            +-------------------------------+
71  *   ---->    |    omap_hwmod code/data       |    <-----
72  *            | (../mach-omap2/omap_hwmod*)   |
73  *            +-------------------------------+
74  *            | OMAP clock/PRCM/register fns  |
75  *            | (__raw_{read,write}l, clk*)   |
76  *            +-------------------------------+
77  *
78  * Device drivers should not contain any OMAP-specific code or data in
79  * them.  They should only contain code to operate the IP block that
80  * the driver is responsible for.  This is because these IP blocks can
81  * also appear in other SoCs, either from TI (such as DaVinci) or from
82  * other manufacturers; and drivers should be reusable across other
83  * platforms.
84  *
85  * The OMAP hwmod code also will attempt to reset and idle all on-chip
86  * devices upon boot.  The goal here is for the kernel to be
87  * completely self-reliant and independent from bootloaders.  This is
88  * to ensure a repeatable configuration, both to ensure consistent
89  * runtime behavior, and to make it easier for others to reproduce
90  * bugs.
91  *
92  * OMAP module activity states
93  * ---------------------------
94  * The hwmod code considers modules to be in one of several activity
95  * states.  IP blocks start out in an UNKNOWN state, then once they
96  * are registered via the hwmod code, proceed to the REGISTERED state.
97  * Once their clock names are resolved to clock pointers, the module
98  * enters the CLKS_INITED state; and finally, once the module has been
99  * reset and the integration registers programmed, the INITIALIZED state
100  * is entered.  The hwmod code will then place the module into either
101  * the IDLE state to save power, or in the case of a critical system
102  * module, the ENABLED state.
103  *
104  * OMAP core integration code can then call omap_hwmod*() functions
105  * directly to move the module between the IDLE, ENABLED, and DISABLED
106  * states, as needed.  This is done during both the PM idle loop, and
107  * in the OMAP core integration code's implementation of the PM runtime
108  * functions.
109  *
110  * References
111  * ----------
112  * This is a partial list.
113  * - OMAP2420 Multimedia Processor Silicon Revision 2.1.1, 2.2 (SWPU064)
114  * - OMAP2430 Multimedia Device POP Silicon Revision 2.1 (SWPU090)
115  * - OMAP34xx Multimedia Device Silicon Revision 3.1 (SWPU108)
116  * - OMAP4430 Multimedia Device Silicon Revision 1.0 (SWPU140)
117  * - Open Core Protocol Specification 2.2
118  *
119  * To do:
120  * - handle IO mapping
121  * - bus throughput & module latency measurement code
122  *
123  * XXX add tests at the beginning of each function to ensure the hwmod is
124  * in the appropriate state
125  * XXX error return values should be checked to ensure that they are
126  * appropriate
127  */
128 #undef DEBUG
129
130 #include <linux/kernel.h>
131 #include <linux/errno.h>
132 #include <linux/io.h>
133 #include <linux/clk.h>
134 #include <linux/delay.h>
135 #include <linux/err.h>
136 #include <linux/list.h>
137 #include <linux/mutex.h>
138 #include <linux/spinlock.h>
139 #include <linux/slab.h>
140 #include <linux/bootmem.h>
141
142 #include "common.h"
143 #include <plat/cpu.h>
144 #include "clockdomain.h"
145 #include "powerdomain.h"
146 #include <plat/clock.h>
147 #include <plat/omap_hwmod.h>
148 #include <plat/prcm.h>
149
150 #include "cm2xxx_3xxx.h"
151 #include "cminst44xx.h"
152 #include "prm2xxx_3xxx.h"
153 #include "prm44xx.h"
154 #include "prminst44xx.h"
155 #include "mux.h"
156 #include "pm.h"
157
158 /* Maximum microseconds to wait for OMAP module to softreset */
159 #define MAX_MODULE_SOFTRESET_WAIT       10000
160
161 /* Name of the OMAP hwmod for the MPU */
162 #define MPU_INITIATOR_NAME              "mpu"
163
164 /*
165  * Number of struct omap_hwmod_link records per struct
166  * omap_hwmod_ocp_if record (master->slave and slave->master)
167  */
168 #define LINKS_PER_OCP_IF                2
169
170 /* omap_hwmod_list contains all registered struct omap_hwmods */
171 static LIST_HEAD(omap_hwmod_list);
172
173 /* mpu_oh: used to add/remove MPU initiator from sleepdep list */
174 static struct omap_hwmod *mpu_oh;
175
176 /* io_chain_lock: used to serialize reconfigurations of the I/O chain */
177 static DEFINE_SPINLOCK(io_chain_lock);
178
179 /*
180  * linkspace: ptr to a buffer that struct omap_hwmod_link records are
181  * allocated from - used to reduce the number of small memory
182  * allocations, which has a significant impact on performance
183  */
184 static struct omap_hwmod_link *linkspace;
185
186 /*
187  * free_ls, max_ls: array indexes into linkspace; representing the
188  * next free struct omap_hwmod_link index, and the maximum number of
189  * struct omap_hwmod_link records allocated (respectively)
190  */
191 static unsigned short free_ls, max_ls, ls_supp;
192
193 /* Private functions */
194
195 /**
196  * _fetch_next_ocp_if - return the next OCP interface in a list
197  * @p: ptr to a ptr to the list_head inside the ocp_if to return
198  * @i: pointer to the index of the element pointed to by @p in the list
199  *
200  * Return a pointer to the struct omap_hwmod_ocp_if record
201  * containing the struct list_head pointed to by @p, and increment
202  * @p such that a future call to this routine will return the next
203  * record.
204  */
205 static struct omap_hwmod_ocp_if *_fetch_next_ocp_if(struct list_head **p,
206                                                     int *i)
207 {
208         struct omap_hwmod_ocp_if *oi;
209
210         oi = list_entry(*p, struct omap_hwmod_link, node)->ocp_if;
211         *p = (*p)->next;
212
213         *i = *i + 1;
214
215         return oi;
216 }
217
218 /**
219  * _update_sysc_cache - return the module OCP_SYSCONFIG register, keep copy
220  * @oh: struct omap_hwmod *
221  *
222  * Load the current value of the hwmod OCP_SYSCONFIG register into the
223  * struct omap_hwmod for later use.  Returns -EINVAL if the hwmod has no
224  * OCP_SYSCONFIG register or 0 upon success.
225  */
226 static int _update_sysc_cache(struct omap_hwmod *oh)
227 {
228         if (!oh->class->sysc) {
229                 WARN(1, "omap_hwmod: %s: cannot read OCP_SYSCONFIG: not defined on hwmod's class\n", oh->name);
230                 return -EINVAL;
231         }
232
233         /* XXX ensure module interface clock is up */
234
235         oh->_sysc_cache = omap_hwmod_read(oh, oh->class->sysc->sysc_offs);
236
237         if (!(oh->class->sysc->sysc_flags & SYSC_NO_CACHE))
238                 oh->_int_flags |= _HWMOD_SYSCONFIG_LOADED;
239
240         return 0;
241 }
242
243 /**
244  * _write_sysconfig - write a value to the module's OCP_SYSCONFIG register
245  * @v: OCP_SYSCONFIG value to write
246  * @oh: struct omap_hwmod *
247  *
248  * Write @v into the module class' OCP_SYSCONFIG register, if it has
249  * one.  No return value.
250  */
251 static void _write_sysconfig(u32 v, struct omap_hwmod *oh)
252 {
253         if (!oh->class->sysc) {
254                 WARN(1, "omap_hwmod: %s: cannot write OCP_SYSCONFIG: not defined on hwmod's class\n", oh->name);
255                 return;
256         }
257
258         /* XXX ensure module interface clock is up */
259
260         /* Module might have lost context, always update cache and register */
261         oh->_sysc_cache = v;
262         omap_hwmod_write(v, oh, oh->class->sysc->sysc_offs);
263 }
264
265 /**
266  * _set_master_standbymode: set the OCP_SYSCONFIG MIDLEMODE field in @v
267  * @oh: struct omap_hwmod *
268  * @standbymode: MIDLEMODE field bits
269  * @v: pointer to register contents to modify
270  *
271  * Update the master standby mode bits in @v to be @standbymode for
272  * the @oh hwmod.  Does not write to the hardware.  Returns -EINVAL
273  * upon error or 0 upon success.
274  */
275 static int _set_master_standbymode(struct omap_hwmod *oh, u8 standbymode,
276                                    u32 *v)
277 {
278         u32 mstandby_mask;
279         u8 mstandby_shift;
280
281         if (!oh->class->sysc ||
282             !(oh->class->sysc->sysc_flags & SYSC_HAS_MIDLEMODE))
283                 return -EINVAL;
284
285         if (!oh->class->sysc->sysc_fields) {
286                 WARN(1, "omap_hwmod: %s: offset struct for sysconfig not provided in class\n", oh->name);
287                 return -EINVAL;
288         }
289
290         mstandby_shift = oh->class->sysc->sysc_fields->midle_shift;
291         mstandby_mask = (0x3 << mstandby_shift);
292
293         *v &= ~mstandby_mask;
294         *v |= __ffs(standbymode) << mstandby_shift;
295
296         return 0;
297 }
298
299 /**
300  * _set_slave_idlemode: set the OCP_SYSCONFIG SIDLEMODE field in @v
301  * @oh: struct omap_hwmod *
302  * @idlemode: SIDLEMODE field bits
303  * @v: pointer to register contents to modify
304  *
305  * Update the slave idle mode bits in @v to be @idlemode for the @oh
306  * hwmod.  Does not write to the hardware.  Returns -EINVAL upon error
307  * or 0 upon success.
308  */
309 static int _set_slave_idlemode(struct omap_hwmod *oh, u8 idlemode, u32 *v)
310 {
311         u32 sidle_mask;
312         u8 sidle_shift;
313
314         if (!oh->class->sysc ||
315             !(oh->class->sysc->sysc_flags & SYSC_HAS_SIDLEMODE))
316                 return -EINVAL;
317
318         if (!oh->class->sysc->sysc_fields) {
319                 WARN(1, "omap_hwmod: %s: offset struct for sysconfig not provided in class\n", oh->name);
320                 return -EINVAL;
321         }
322
323         sidle_shift = oh->class->sysc->sysc_fields->sidle_shift;
324         sidle_mask = (0x3 << sidle_shift);
325
326         *v &= ~sidle_mask;
327         *v |= __ffs(idlemode) << sidle_shift;
328
329         return 0;
330 }
331
332 /**
333  * _set_clockactivity: set OCP_SYSCONFIG.CLOCKACTIVITY bits in @v
334  * @oh: struct omap_hwmod *
335  * @clockact: CLOCKACTIVITY field bits
336  * @v: pointer to register contents to modify
337  *
338  * Update the clockactivity mode bits in @v to be @clockact for the
339  * @oh hwmod.  Used for additional powersaving on some modules.  Does
340  * not write to the hardware.  Returns -EINVAL upon error or 0 upon
341  * success.
342  */
343 static int _set_clockactivity(struct omap_hwmod *oh, u8 clockact, u32 *v)
344 {
345         u32 clkact_mask;
346         u8  clkact_shift;
347
348         if (!oh->class->sysc ||
349             !(oh->class->sysc->sysc_flags & SYSC_HAS_CLOCKACTIVITY))
350                 return -EINVAL;
351
352         if (!oh->class->sysc->sysc_fields) {
353                 WARN(1, "omap_hwmod: %s: offset struct for sysconfig not provided in class\n", oh->name);
354                 return -EINVAL;
355         }
356
357         clkact_shift = oh->class->sysc->sysc_fields->clkact_shift;
358         clkact_mask = (0x3 << clkact_shift);
359
360         *v &= ~clkact_mask;
361         *v |= clockact << clkact_shift;
362
363         return 0;
364 }
365
366 /**
367  * _set_softreset: set OCP_SYSCONFIG.CLOCKACTIVITY bits in @v
368  * @oh: struct omap_hwmod *
369  * @v: pointer to register contents to modify
370  *
371  * Set the SOFTRESET bit in @v for hwmod @oh.  Returns -EINVAL upon
372  * error or 0 upon success.
373  */
374 static int _set_softreset(struct omap_hwmod *oh, u32 *v)
375 {
376         u32 softrst_mask;
377
378         if (!oh->class->sysc ||
379             !(oh->class->sysc->sysc_flags & SYSC_HAS_SOFTRESET))
380                 return -EINVAL;
381
382         if (!oh->class->sysc->sysc_fields) {
383                 WARN(1, "omap_hwmod: %s: offset struct for sysconfig not provided in class\n", oh->name);
384                 return -EINVAL;
385         }
386
387         softrst_mask = (0x1 << oh->class->sysc->sysc_fields->srst_shift);
388
389         *v |= softrst_mask;
390
391         return 0;
392 }
393
394 /**
395  * _set_module_autoidle: set the OCP_SYSCONFIG AUTOIDLE field in @v
396  * @oh: struct omap_hwmod *
397  * @autoidle: desired AUTOIDLE bitfield value (0 or 1)
398  * @v: pointer to register contents to modify
399  *
400  * Update the module autoidle bit in @v to be @autoidle for the @oh
401  * hwmod.  The autoidle bit controls whether the module can gate
402  * internal clocks automatically when it isn't doing anything; the
403  * exact function of this bit varies on a per-module basis.  This
404  * function does not write to the hardware.  Returns -EINVAL upon
405  * error or 0 upon success.
406  */
407 static int _set_module_autoidle(struct omap_hwmod *oh, u8 autoidle,
408                                 u32 *v)
409 {
410         u32 autoidle_mask;
411         u8 autoidle_shift;
412
413         if (!oh->class->sysc ||
414             !(oh->class->sysc->sysc_flags & SYSC_HAS_AUTOIDLE))
415                 return -EINVAL;
416
417         if (!oh->class->sysc->sysc_fields) {
418                 WARN(1, "omap_hwmod: %s: offset struct for sysconfig not provided in class\n", oh->name);
419                 return -EINVAL;
420         }
421
422         autoidle_shift = oh->class->sysc->sysc_fields->autoidle_shift;
423         autoidle_mask = (0x1 << autoidle_shift);
424
425         *v &= ~autoidle_mask;
426         *v |= autoidle << autoidle_shift;
427
428         return 0;
429 }
430
431 /**
432  * _set_idle_ioring_wakeup - enable/disable IO pad wakeup on hwmod idle for mux
433  * @oh: struct omap_hwmod *
434  * @set_wake: bool value indicating to set (true) or clear (false) wakeup enable
435  *
436  * Set or clear the I/O pad wakeup flag in the mux entries for the
437  * hwmod @oh.  This function changes the @oh->mux->pads_dynamic array
438  * in memory.  If the hwmod is currently idled, and the new idle
439  * values don't match the previous ones, this function will also
440  * update the SCM PADCTRL registers.  Otherwise, if the hwmod is not
441  * currently idled, this function won't touch the hardware: the new
442  * mux settings are written to the SCM PADCTRL registers when the
443  * hwmod is idled.  No return value.
444  */
445 static void _set_idle_ioring_wakeup(struct omap_hwmod *oh, bool set_wake)
446 {
447         struct omap_device_pad *pad;
448         bool change = false;
449         u16 prev_idle;
450         int j;
451
452         if (!oh->mux || !oh->mux->enabled)
453                 return;
454
455         for (j = 0; j < oh->mux->nr_pads_dynamic; j++) {
456                 pad = oh->mux->pads_dynamic[j];
457
458                 if (!(pad->flags & OMAP_DEVICE_PAD_WAKEUP))
459                         continue;
460
461                 prev_idle = pad->idle;
462
463                 if (set_wake)
464                         pad->idle |= OMAP_WAKEUP_EN;
465                 else
466                         pad->idle &= ~OMAP_WAKEUP_EN;
467
468                 if (prev_idle != pad->idle)
469                         change = true;
470         }
471
472         if (change && oh->_state == _HWMOD_STATE_IDLE)
473                 omap_hwmod_mux(oh->mux, _HWMOD_STATE_IDLE);
474 }
475
476 /**
477  * _enable_wakeup: set OCP_SYSCONFIG.ENAWAKEUP bit in the hardware
478  * @oh: struct omap_hwmod *
479  *
480  * Allow the hardware module @oh to send wakeups.  Returns -EINVAL
481  * upon error or 0 upon success.
482  */
483 static int _enable_wakeup(struct omap_hwmod *oh, u32 *v)
484 {
485         if (!oh->class->sysc ||
486             !((oh->class->sysc->sysc_flags & SYSC_HAS_ENAWAKEUP) ||
487               (oh->class->sysc->idlemodes & SIDLE_SMART_WKUP) ||
488               (oh->class->sysc->idlemodes & MSTANDBY_SMART_WKUP)))
489                 return -EINVAL;
490
491         if (!oh->class->sysc->sysc_fields) {
492                 WARN(1, "omap_hwmod: %s: offset struct for sysconfig not provided in class\n", oh->name);
493                 return -EINVAL;
494         }
495
496         if (oh->class->sysc->sysc_flags & SYSC_HAS_ENAWAKEUP)
497                 *v |= 0x1 << oh->class->sysc->sysc_fields->enwkup_shift;
498
499         if (oh->class->sysc->idlemodes & SIDLE_SMART_WKUP)
500                 _set_slave_idlemode(oh, HWMOD_IDLEMODE_SMART_WKUP, v);
501         if (oh->class->sysc->idlemodes & MSTANDBY_SMART_WKUP)
502                 _set_master_standbymode(oh, HWMOD_IDLEMODE_SMART_WKUP, v);
503
504         /* XXX test pwrdm_get_wken for this hwmod's subsystem */
505
506         oh->_int_flags |= _HWMOD_WAKEUP_ENABLED;
507
508         return 0;
509 }
510
511 /**
512  * _disable_wakeup: clear OCP_SYSCONFIG.ENAWAKEUP bit in the hardware
513  * @oh: struct omap_hwmod *
514  *
515  * Prevent the hardware module @oh to send wakeups.  Returns -EINVAL
516  * upon error or 0 upon success.
517  */
518 static int _disable_wakeup(struct omap_hwmod *oh, u32 *v)
519 {
520         if (!oh->class->sysc ||
521             !((oh->class->sysc->sysc_flags & SYSC_HAS_ENAWAKEUP) ||
522               (oh->class->sysc->idlemodes & SIDLE_SMART_WKUP) ||
523               (oh->class->sysc->idlemodes & MSTANDBY_SMART_WKUP)))
524                 return -EINVAL;
525
526         if (!oh->class->sysc->sysc_fields) {
527                 WARN(1, "omap_hwmod: %s: offset struct for sysconfig not provided in class\n", oh->name);
528                 return -EINVAL;
529         }
530
531         if (oh->class->sysc->sysc_flags & SYSC_HAS_ENAWAKEUP)
532                 *v &= ~(0x1 << oh->class->sysc->sysc_fields->enwkup_shift);
533
534         if (oh->class->sysc->idlemodes & SIDLE_SMART_WKUP)
535                 _set_slave_idlemode(oh, HWMOD_IDLEMODE_SMART, v);
536         if (oh->class->sysc->idlemodes & MSTANDBY_SMART_WKUP)
537                 _set_master_standbymode(oh, HWMOD_IDLEMODE_SMART, v);
538
539         /* XXX test pwrdm_get_wken for this hwmod's subsystem */
540
541         oh->_int_flags &= ~_HWMOD_WAKEUP_ENABLED;
542
543         return 0;
544 }
545
546 /**
547  * _add_initiator_dep: prevent @oh from smart-idling while @init_oh is active
548  * @oh: struct omap_hwmod *
549  *
550  * Prevent the hardware module @oh from entering idle while the
551  * hardare module initiator @init_oh is active.  Useful when a module
552  * will be accessed by a particular initiator (e.g., if a module will
553  * be accessed by the IVA, there should be a sleepdep between the IVA
554  * initiator and the module).  Only applies to modules in smart-idle
555  * mode.  If the clockdomain is marked as not needing autodeps, return
556  * 0 without doing anything.  Otherwise, returns -EINVAL upon error or
557  * passes along clkdm_add_sleepdep() value upon success.
558  */
559 static int _add_initiator_dep(struct omap_hwmod *oh, struct omap_hwmod *init_oh)
560 {
561         if (!oh->_clk)
562                 return -EINVAL;
563
564         if (oh->_clk->clkdm && oh->_clk->clkdm->flags & CLKDM_NO_AUTODEPS)
565                 return 0;
566
567         return clkdm_add_sleepdep(oh->_clk->clkdm, init_oh->_clk->clkdm);
568 }
569
570 /**
571  * _del_initiator_dep: allow @oh to smart-idle even if @init_oh is active
572  * @oh: struct omap_hwmod *
573  *
574  * Allow the hardware module @oh to enter idle while the hardare
575  * module initiator @init_oh is active.  Useful when a module will not
576  * be accessed by a particular initiator (e.g., if a module will not
577  * be accessed by the IVA, there should be no sleepdep between the IVA
578  * initiator and the module).  Only applies to modules in smart-idle
579  * mode.  If the clockdomain is marked as not needing autodeps, return
580  * 0 without doing anything.  Returns -EINVAL upon error or passes
581  * along clkdm_del_sleepdep() value upon success.
582  */
583 static int _del_initiator_dep(struct omap_hwmod *oh, struct omap_hwmod *init_oh)
584 {
585         if (!oh->_clk)
586                 return -EINVAL;
587
588         if (oh->_clk->clkdm && oh->_clk->clkdm->flags & CLKDM_NO_AUTODEPS)
589                 return 0;
590
591         return clkdm_del_sleepdep(oh->_clk->clkdm, init_oh->_clk->clkdm);
592 }
593
594 /**
595  * _init_main_clk - get a struct clk * for the the hwmod's main functional clk
596  * @oh: struct omap_hwmod *
597  *
598  * Called from _init_clocks().  Populates the @oh _clk (main
599  * functional clock pointer) if a main_clk is present.  Returns 0 on
600  * success or -EINVAL on error.
601  */
602 static int _init_main_clk(struct omap_hwmod *oh)
603 {
604         int ret = 0;
605
606         if (!oh->main_clk)
607                 return 0;
608
609         oh->_clk = omap_clk_get_by_name(oh->main_clk);
610         if (!oh->_clk) {
611                 pr_warning("omap_hwmod: %s: cannot clk_get main_clk %s\n",
612                            oh->name, oh->main_clk);
613                 return -EINVAL;
614         }
615
616         if (!oh->_clk->clkdm)
617                 pr_warning("omap_hwmod: %s: missing clockdomain for %s.\n",
618                            oh->main_clk, oh->_clk->name);
619
620         return ret;
621 }
622
623 /**
624  * _init_interface_clks - get a struct clk * for the the hwmod's interface clks
625  * @oh: struct omap_hwmod *
626  *
627  * Called from _init_clocks().  Populates the @oh OCP slave interface
628  * clock pointers.  Returns 0 on success or -EINVAL on error.
629  */
630 static int _init_interface_clks(struct omap_hwmod *oh)
631 {
632         struct omap_hwmod_ocp_if *os;
633         struct list_head *p;
634         struct clk *c;
635         int i = 0;
636         int ret = 0;
637
638         p = oh->slave_ports.next;
639
640         while (i < oh->slaves_cnt) {
641                 os = _fetch_next_ocp_if(&p, &i);
642                 if (!os->clk)
643                         continue;
644
645                 c = omap_clk_get_by_name(os->clk);
646                 if (!c) {
647                         pr_warning("omap_hwmod: %s: cannot clk_get interface_clk %s\n",
648                                    oh->name, os->clk);
649                         ret = -EINVAL;
650                 }
651                 os->_clk = c;
652         }
653
654         return ret;
655 }
656
657 /**
658  * _init_opt_clk - get a struct clk * for the the hwmod's optional clocks
659  * @oh: struct omap_hwmod *
660  *
661  * Called from _init_clocks().  Populates the @oh omap_hwmod_opt_clk
662  * clock pointers.  Returns 0 on success or -EINVAL on error.
663  */
664 static int _init_opt_clks(struct omap_hwmod *oh)
665 {
666         struct omap_hwmod_opt_clk *oc;
667         struct clk *c;
668         int i;
669         int ret = 0;
670
671         for (i = oh->opt_clks_cnt, oc = oh->opt_clks; i > 0; i--, oc++) {
672                 c = omap_clk_get_by_name(oc->clk);
673                 if (!c) {
674                         pr_warning("omap_hwmod: %s: cannot clk_get opt_clk %s\n",
675                                    oh->name, oc->clk);
676                         ret = -EINVAL;
677                 }
678                 oc->_clk = c;
679         }
680
681         return ret;
682 }
683
684 /**
685  * _enable_clocks - enable hwmod main clock and interface clocks
686  * @oh: struct omap_hwmod *
687  *
688  * Enables all clocks necessary for register reads and writes to succeed
689  * on the hwmod @oh.  Returns 0.
690  */
691 static int _enable_clocks(struct omap_hwmod *oh)
692 {
693         struct omap_hwmod_ocp_if *os;
694         struct list_head *p;
695         int i = 0;
696
697         pr_debug("omap_hwmod: %s: enabling clocks\n", oh->name);
698
699         if (oh->_clk)
700                 clk_enable(oh->_clk);
701
702         p = oh->slave_ports.next;
703
704         while (i < oh->slaves_cnt) {
705                 os = _fetch_next_ocp_if(&p, &i);
706
707                 if (os->_clk && (os->flags & OCPIF_SWSUP_IDLE))
708                         clk_enable(os->_clk);
709         }
710
711         /* The opt clocks are controlled by the device driver. */
712
713         return 0;
714 }
715
716 /**
717  * _disable_clocks - disable hwmod main clock and interface clocks
718  * @oh: struct omap_hwmod *
719  *
720  * Disables the hwmod @oh main functional and interface clocks.  Returns 0.
721  */
722 static int _disable_clocks(struct omap_hwmod *oh)
723 {
724         struct omap_hwmod_ocp_if *os;
725         struct list_head *p;
726         int i = 0;
727
728         pr_debug("omap_hwmod: %s: disabling clocks\n", oh->name);
729
730         if (oh->_clk)
731                 clk_disable(oh->_clk);
732
733         p = oh->slave_ports.next;
734
735         while (i < oh->slaves_cnt) {
736                 os = _fetch_next_ocp_if(&p, &i);
737
738                 if (os->_clk && (os->flags & OCPIF_SWSUP_IDLE))
739                         clk_disable(os->_clk);
740         }
741
742         /* The opt clocks are controlled by the device driver. */
743
744         return 0;
745 }
746
747 static void _enable_optional_clocks(struct omap_hwmod *oh)
748 {
749         struct omap_hwmod_opt_clk *oc;
750         int i;
751
752         pr_debug("omap_hwmod: %s: enabling optional clocks\n", oh->name);
753
754         for (i = oh->opt_clks_cnt, oc = oh->opt_clks; i > 0; i--, oc++)
755                 if (oc->_clk) {
756                         pr_debug("omap_hwmod: enable %s:%s\n", oc->role,
757                                  oc->_clk->name);
758                         clk_enable(oc->_clk);
759                 }
760 }
761
762 static void _disable_optional_clocks(struct omap_hwmod *oh)
763 {
764         struct omap_hwmod_opt_clk *oc;
765         int i;
766
767         pr_debug("omap_hwmod: %s: disabling optional clocks\n", oh->name);
768
769         for (i = oh->opt_clks_cnt, oc = oh->opt_clks; i > 0; i--, oc++)
770                 if (oc->_clk) {
771                         pr_debug("omap_hwmod: disable %s:%s\n", oc->role,
772                                  oc->_clk->name);
773                         clk_disable(oc->_clk);
774                 }
775 }
776
777 /**
778  * _enable_module - enable CLKCTRL modulemode on OMAP4
779  * @oh: struct omap_hwmod *
780  *
781  * Enables the PRCM module mode related to the hwmod @oh.
782  * No return value.
783  */
784 static void _enable_module(struct omap_hwmod *oh)
785 {
786         /* The module mode does not exist prior OMAP4 */
787         if (cpu_is_omap24xx() || cpu_is_omap34xx())
788                 return;
789
790         if (!oh->clkdm || !oh->prcm.omap4.modulemode)
791                 return;
792
793         pr_debug("omap_hwmod: %s: _enable_module: %d\n",
794                  oh->name, oh->prcm.omap4.modulemode);
795
796         omap4_cminst_module_enable(oh->prcm.omap4.modulemode,
797                                    oh->clkdm->prcm_partition,
798                                    oh->clkdm->cm_inst,
799                                    oh->clkdm->clkdm_offs,
800                                    oh->prcm.omap4.clkctrl_offs);
801 }
802
803 /**
804  * _omap4_wait_target_disable - wait for a module to be disabled on OMAP4
805  * @oh: struct omap_hwmod *
806  *
807  * Wait for a module @oh to enter slave idle.  Returns 0 if the module
808  * does not have an IDLEST bit or if the module successfully enters
809  * slave idle; otherwise, pass along the return value of the
810  * appropriate *_cm*_wait_module_idle() function.
811  */
812 static int _omap4_wait_target_disable(struct omap_hwmod *oh)
813 {
814         if (!cpu_is_omap44xx())
815                 return 0;
816
817         if (!oh)
818                 return -EINVAL;
819
820         if (oh->_int_flags & _HWMOD_NO_MPU_PORT)
821                 return 0;
822
823         if (oh->flags & HWMOD_NO_IDLEST)
824                 return 0;
825
826         return omap4_cminst_wait_module_idle(oh->clkdm->prcm_partition,
827                                              oh->clkdm->cm_inst,
828                                              oh->clkdm->clkdm_offs,
829                                              oh->prcm.omap4.clkctrl_offs);
830 }
831
832 /**
833  * _count_mpu_irqs - count the number of MPU IRQ lines associated with @oh
834  * @oh: struct omap_hwmod *oh
835  *
836  * Count and return the number of MPU IRQs associated with the hwmod
837  * @oh.  Used to allocate struct resource data.  Returns 0 if @oh is
838  * NULL.
839  */
840 static int _count_mpu_irqs(struct omap_hwmod *oh)
841 {
842         struct omap_hwmod_irq_info *ohii;
843         int i = 0;
844
845         if (!oh || !oh->mpu_irqs)
846                 return 0;
847
848         do {
849                 ohii = &oh->mpu_irqs[i++];
850         } while (ohii->irq != -1);
851
852         return i-1;
853 }
854
855 /**
856  * _count_sdma_reqs - count the number of SDMA request lines associated with @oh
857  * @oh: struct omap_hwmod *oh
858  *
859  * Count and return the number of SDMA request lines associated with
860  * the hwmod @oh.  Used to allocate struct resource data.  Returns 0
861  * if @oh is NULL.
862  */
863 static int _count_sdma_reqs(struct omap_hwmod *oh)
864 {
865         struct omap_hwmod_dma_info *ohdi;
866         int i = 0;
867
868         if (!oh || !oh->sdma_reqs)
869                 return 0;
870
871         do {
872                 ohdi = &oh->sdma_reqs[i++];
873         } while (ohdi->dma_req != -1);
874
875         return i-1;
876 }
877
878 /**
879  * _count_ocp_if_addr_spaces - count the number of address space entries for @oh
880  * @oh: struct omap_hwmod *oh
881  *
882  * Count and return the number of address space ranges associated with
883  * the hwmod @oh.  Used to allocate struct resource data.  Returns 0
884  * if @oh is NULL.
885  */
886 static int _count_ocp_if_addr_spaces(struct omap_hwmod_ocp_if *os)
887 {
888         struct omap_hwmod_addr_space *mem;
889         int i = 0;
890
891         if (!os || !os->addr)
892                 return 0;
893
894         do {
895                 mem = &os->addr[i++];
896         } while (mem->pa_start != mem->pa_end);
897
898         return i-1;
899 }
900
901 /**
902  * _get_mpu_irq_by_name - fetch MPU interrupt line number by name
903  * @oh: struct omap_hwmod * to operate on
904  * @name: pointer to the name of the MPU interrupt number to fetch (optional)
905  * @irq: pointer to an unsigned int to store the MPU IRQ number to
906  *
907  * Retrieve a MPU hardware IRQ line number named by @name associated
908  * with the IP block pointed to by @oh.  The IRQ number will be filled
909  * into the address pointed to by @dma.  When @name is non-null, the
910  * IRQ line number associated with the named entry will be returned.
911  * If @name is null, the first matching entry will be returned.  Data
912  * order is not meaningful in hwmod data, so callers are strongly
913  * encouraged to use a non-null @name whenever possible to avoid
914  * unpredictable effects if hwmod data is later added that causes data
915  * ordering to change.  Returns 0 upon success or a negative error
916  * code upon error.
917  */
918 static int _get_mpu_irq_by_name(struct omap_hwmod *oh, const char *name,
919                                 unsigned int *irq)
920 {
921         int i;
922         bool found = false;
923
924         if (!oh->mpu_irqs)
925                 return -ENOENT;
926
927         i = 0;
928         while (oh->mpu_irqs[i].irq != -1) {
929                 if (name == oh->mpu_irqs[i].name ||
930                     !strcmp(name, oh->mpu_irqs[i].name)) {
931                         found = true;
932                         break;
933                 }
934                 i++;
935         }
936
937         if (!found)
938                 return -ENOENT;
939
940         *irq = oh->mpu_irqs[i].irq;
941
942         return 0;
943 }
944
945 /**
946  * _get_sdma_req_by_name - fetch SDMA request line ID by name
947  * @oh: struct omap_hwmod * to operate on
948  * @name: pointer to the name of the SDMA request line to fetch (optional)
949  * @dma: pointer to an unsigned int to store the request line ID to
950  *
951  * Retrieve an SDMA request line ID named by @name on the IP block
952  * pointed to by @oh.  The ID will be filled into the address pointed
953  * to by @dma.  When @name is non-null, the request line ID associated
954  * with the named entry will be returned.  If @name is null, the first
955  * matching entry will be returned.  Data order is not meaningful in
956  * hwmod data, so callers are strongly encouraged to use a non-null
957  * @name whenever possible to avoid unpredictable effects if hwmod
958  * data is later added that causes data ordering to change.  Returns 0
959  * upon success or a negative error code upon error.
960  */
961 static int _get_sdma_req_by_name(struct omap_hwmod *oh, const char *name,
962                                  unsigned int *dma)
963 {
964         int i;
965         bool found = false;
966
967         if (!oh->sdma_reqs)
968                 return -ENOENT;
969
970         i = 0;
971         while (oh->sdma_reqs[i].dma_req != -1) {
972                 if (name == oh->sdma_reqs[i].name ||
973                     !strcmp(name, oh->sdma_reqs[i].name)) {
974                         found = true;
975                         break;
976                 }
977                 i++;
978         }
979
980         if (!found)
981                 return -ENOENT;
982
983         *dma = oh->sdma_reqs[i].dma_req;
984
985         return 0;
986 }
987
988 /**
989  * _get_addr_space_by_name - fetch address space start & end by name
990  * @oh: struct omap_hwmod * to operate on
991  * @name: pointer to the name of the address space to fetch (optional)
992  * @pa_start: pointer to a u32 to store the starting address to
993  * @pa_end: pointer to a u32 to store the ending address to
994  *
995  * Retrieve address space start and end addresses for the IP block
996  * pointed to by @oh.  The data will be filled into the addresses
997  * pointed to by @pa_start and @pa_end.  When @name is non-null, the
998  * address space data associated with the named entry will be
999  * returned.  If @name is null, the first matching entry will be
1000  * returned.  Data order is not meaningful in hwmod data, so callers
1001  * are strongly encouraged to use a non-null @name whenever possible
1002  * to avoid unpredictable effects if hwmod data is later added that
1003  * causes data ordering to change.  Returns 0 upon success or a
1004  * negative error code upon error.
1005  */
1006 static int _get_addr_space_by_name(struct omap_hwmod *oh, const char *name,
1007                                    u32 *pa_start, u32 *pa_end)
1008 {
1009         int i, j;
1010         struct omap_hwmod_ocp_if *os;
1011         struct list_head *p = NULL;
1012         bool found = false;
1013
1014         p = oh->slave_ports.next;
1015
1016         i = 0;
1017         while (i < oh->slaves_cnt) {
1018                 os = _fetch_next_ocp_if(&p, &i);
1019
1020                 if (!os->addr)
1021                         return -ENOENT;
1022
1023                 j = 0;
1024                 while (os->addr[j].pa_start != os->addr[j].pa_end) {
1025                         if (name == os->addr[j].name ||
1026                             !strcmp(name, os->addr[j].name)) {
1027                                 found = true;
1028                                 break;
1029                         }
1030                         j++;
1031                 }
1032
1033                 if (found)
1034                         break;
1035         }
1036
1037         if (!found)
1038                 return -ENOENT;
1039
1040         *pa_start = os->addr[j].pa_start;
1041         *pa_end = os->addr[j].pa_end;
1042
1043         return 0;
1044 }
1045
1046 /**
1047  * _save_mpu_port_index - find and save the index to @oh's MPU port
1048  * @oh: struct omap_hwmod *
1049  *
1050  * Determines the array index of the OCP slave port that the MPU uses
1051  * to address the device, and saves it into the struct omap_hwmod.
1052  * Intended to be called during hwmod registration only. No return
1053  * value.
1054  */
1055 static void __init _save_mpu_port_index(struct omap_hwmod *oh)
1056 {
1057         struct omap_hwmod_ocp_if *os = NULL;
1058         struct list_head *p;
1059         int i = 0;
1060
1061         if (!oh)
1062                 return;
1063
1064         oh->_int_flags |= _HWMOD_NO_MPU_PORT;
1065
1066         p = oh->slave_ports.next;
1067
1068         while (i < oh->slaves_cnt) {
1069                 os = _fetch_next_ocp_if(&p, &i);
1070                 if (os->user & OCP_USER_MPU) {
1071                         oh->_mpu_port = os;
1072                         oh->_int_flags &= ~_HWMOD_NO_MPU_PORT;
1073                         break;
1074                 }
1075         }
1076
1077         return;
1078 }
1079
1080 /**
1081  * _find_mpu_rt_port - return omap_hwmod_ocp_if accessible by the MPU
1082  * @oh: struct omap_hwmod *
1083  *
1084  * Given a pointer to a struct omap_hwmod record @oh, return a pointer
1085  * to the struct omap_hwmod_ocp_if record that is used by the MPU to
1086  * communicate with the IP block.  This interface need not be directly
1087  * connected to the MPU (and almost certainly is not), but is directly
1088  * connected to the IP block represented by @oh.  Returns a pointer
1089  * to the struct omap_hwmod_ocp_if * upon success, or returns NULL upon
1090  * error or if there does not appear to be a path from the MPU to this
1091  * IP block.
1092  */
1093 static struct omap_hwmod_ocp_if *_find_mpu_rt_port(struct omap_hwmod *oh)
1094 {
1095         if (!oh || oh->_int_flags & _HWMOD_NO_MPU_PORT || oh->slaves_cnt == 0)
1096                 return NULL;
1097
1098         return oh->_mpu_port;
1099 };
1100
1101 /**
1102  * _find_mpu_rt_addr_space - return MPU register target address space for @oh
1103  * @oh: struct omap_hwmod *
1104  *
1105  * Returns a pointer to the struct omap_hwmod_addr_space record representing
1106  * the register target MPU address space; or returns NULL upon error.
1107  */
1108 static struct omap_hwmod_addr_space * __init _find_mpu_rt_addr_space(struct omap_hwmod *oh)
1109 {
1110         struct omap_hwmod_ocp_if *os;
1111         struct omap_hwmod_addr_space *mem;
1112         int found = 0, i = 0;
1113
1114         os = _find_mpu_rt_port(oh);
1115         if (!os || !os->addr)
1116                 return NULL;
1117
1118         do {
1119                 mem = &os->addr[i++];
1120                 if (mem->flags & ADDR_TYPE_RT)
1121                         found = 1;
1122         } while (!found && mem->pa_start != mem->pa_end);
1123
1124         return (found) ? mem : NULL;
1125 }
1126
1127 /**
1128  * _enable_sysc - try to bring a module out of idle via OCP_SYSCONFIG
1129  * @oh: struct omap_hwmod *
1130  *
1131  * If module is marked as SWSUP_SIDLE, force the module out of slave
1132  * idle; otherwise, configure it for smart-idle.  If module is marked
1133  * as SWSUP_MSUSPEND, force the module out of master standby;
1134  * otherwise, configure it for smart-standby.  No return value.
1135  */
1136 static void _enable_sysc(struct omap_hwmod *oh)
1137 {
1138         u8 idlemode, sf;
1139         u32 v;
1140
1141         if (!oh->class->sysc)
1142                 return;
1143
1144         v = oh->_sysc_cache;
1145         sf = oh->class->sysc->sysc_flags;
1146
1147         if (sf & SYSC_HAS_SIDLEMODE) {
1148                 idlemode = (oh->flags & HWMOD_SWSUP_SIDLE) ?
1149                         HWMOD_IDLEMODE_NO : HWMOD_IDLEMODE_SMART;
1150                 _set_slave_idlemode(oh, idlemode, &v);
1151         }
1152
1153         if (sf & SYSC_HAS_MIDLEMODE) {
1154                 if (oh->flags & HWMOD_SWSUP_MSTANDBY) {
1155                         idlemode = HWMOD_IDLEMODE_NO;
1156                 } else {
1157                         if (sf & SYSC_HAS_ENAWAKEUP)
1158                                 _enable_wakeup(oh, &v);
1159                         if (oh->class->sysc->idlemodes & MSTANDBY_SMART_WKUP)
1160                                 idlemode = HWMOD_IDLEMODE_SMART_WKUP;
1161                         else
1162                                 idlemode = HWMOD_IDLEMODE_SMART;
1163                 }
1164                 _set_master_standbymode(oh, idlemode, &v);
1165         }
1166
1167         /*
1168          * XXX The clock framework should handle this, by
1169          * calling into this code.  But this must wait until the
1170          * clock structures are tagged with omap_hwmod entries
1171          */
1172         if ((oh->flags & HWMOD_SET_DEFAULT_CLOCKACT) &&
1173             (sf & SYSC_HAS_CLOCKACTIVITY))
1174                 _set_clockactivity(oh, oh->class->sysc->clockact, &v);
1175
1176         /* If slave is in SMARTIDLE, also enable wakeup */
1177         if ((sf & SYSC_HAS_SIDLEMODE) && !(oh->flags & HWMOD_SWSUP_SIDLE))
1178                 _enable_wakeup(oh, &v);
1179
1180         _write_sysconfig(v, oh);
1181
1182         /*
1183          * Set the autoidle bit only after setting the smartidle bit
1184          * Setting this will not have any impact on the other modules.
1185          */
1186         if (sf & SYSC_HAS_AUTOIDLE) {
1187                 idlemode = (oh->flags & HWMOD_NO_OCP_AUTOIDLE) ?
1188                         0 : 1;
1189                 _set_module_autoidle(oh, idlemode, &v);
1190                 _write_sysconfig(v, oh);
1191         }
1192 }
1193
1194 /**
1195  * _idle_sysc - try to put a module into idle via OCP_SYSCONFIG
1196  * @oh: struct omap_hwmod *
1197  *
1198  * If module is marked as SWSUP_SIDLE, force the module into slave
1199  * idle; otherwise, configure it for smart-idle.  If module is marked
1200  * as SWSUP_MSUSPEND, force the module into master standby; otherwise,
1201  * configure it for smart-standby.  No return value.
1202  */
1203 static void _idle_sysc(struct omap_hwmod *oh)
1204 {
1205         u8 idlemode, sf;
1206         u32 v;
1207
1208         if (!oh->class->sysc)
1209                 return;
1210
1211         v = oh->_sysc_cache;
1212         sf = oh->class->sysc->sysc_flags;
1213
1214         if (sf & SYSC_HAS_SIDLEMODE) {
1215                 idlemode = (oh->flags & HWMOD_SWSUP_SIDLE) ?
1216                         HWMOD_IDLEMODE_FORCE : HWMOD_IDLEMODE_SMART;
1217                 _set_slave_idlemode(oh, idlemode, &v);
1218         }
1219
1220         if (sf & SYSC_HAS_MIDLEMODE) {
1221                 if (oh->flags & HWMOD_SWSUP_MSTANDBY) {
1222                         idlemode = HWMOD_IDLEMODE_FORCE;
1223                 } else {
1224                         if (sf & SYSC_HAS_ENAWAKEUP)
1225                                 _enable_wakeup(oh, &v);
1226                         if (oh->class->sysc->idlemodes & MSTANDBY_SMART_WKUP)
1227                                 idlemode = HWMOD_IDLEMODE_SMART_WKUP;
1228                         else
1229                                 idlemode = HWMOD_IDLEMODE_SMART;
1230                 }
1231                 _set_master_standbymode(oh, idlemode, &v);
1232         }
1233
1234         /* If slave is in SMARTIDLE, also enable wakeup */
1235         if ((sf & SYSC_HAS_SIDLEMODE) && !(oh->flags & HWMOD_SWSUP_SIDLE))
1236                 _enable_wakeup(oh, &v);
1237
1238         _write_sysconfig(v, oh);
1239 }
1240
1241 /**
1242  * _shutdown_sysc - force a module into idle via OCP_SYSCONFIG
1243  * @oh: struct omap_hwmod *
1244  *
1245  * Force the module into slave idle and master suspend. No return
1246  * value.
1247  */
1248 static void _shutdown_sysc(struct omap_hwmod *oh)
1249 {
1250         u32 v;
1251         u8 sf;
1252
1253         if (!oh->class->sysc)
1254                 return;
1255
1256         v = oh->_sysc_cache;
1257         sf = oh->class->sysc->sysc_flags;
1258
1259         if (sf & SYSC_HAS_SIDLEMODE)
1260                 _set_slave_idlemode(oh, HWMOD_IDLEMODE_FORCE, &v);
1261
1262         if (sf & SYSC_HAS_MIDLEMODE)
1263                 _set_master_standbymode(oh, HWMOD_IDLEMODE_FORCE, &v);
1264
1265         if (sf & SYSC_HAS_AUTOIDLE)
1266                 _set_module_autoidle(oh, 1, &v);
1267
1268         _write_sysconfig(v, oh);
1269 }
1270
1271 /**
1272  * _lookup - find an omap_hwmod by name
1273  * @name: find an omap_hwmod by name
1274  *
1275  * Return a pointer to an omap_hwmod by name, or NULL if not found.
1276  */
1277 static struct omap_hwmod *_lookup(const char *name)
1278 {
1279         struct omap_hwmod *oh, *temp_oh;
1280
1281         oh = NULL;
1282
1283         list_for_each_entry(temp_oh, &omap_hwmod_list, node) {
1284                 if (!strcmp(name, temp_oh->name)) {
1285                         oh = temp_oh;
1286                         break;
1287                 }
1288         }
1289
1290         return oh;
1291 }
1292 /**
1293  * _init_clkdm - look up a clockdomain name, store pointer in omap_hwmod
1294  * @oh: struct omap_hwmod *
1295  *
1296  * Convert a clockdomain name stored in a struct omap_hwmod into a
1297  * clockdomain pointer, and save it into the struct omap_hwmod.
1298  * return -EINVAL if clkdm_name does not exist or if the lookup failed.
1299  */
1300 static int _init_clkdm(struct omap_hwmod *oh)
1301 {
1302         if (cpu_is_omap24xx() || cpu_is_omap34xx())
1303                 return 0;
1304
1305         if (!oh->clkdm_name) {
1306                 pr_warning("omap_hwmod: %s: no clkdm_name\n", oh->name);
1307                 return -EINVAL;
1308         }
1309
1310         oh->clkdm = clkdm_lookup(oh->clkdm_name);
1311         if (!oh->clkdm) {
1312                 pr_warning("omap_hwmod: %s: could not associate to clkdm %s\n",
1313                         oh->name, oh->clkdm_name);
1314                 return -EINVAL;
1315         }
1316
1317         pr_debug("omap_hwmod: %s: associated to clkdm %s\n",
1318                 oh->name, oh->clkdm_name);
1319
1320         return 0;
1321 }
1322
1323 /**
1324  * _init_clocks - clk_get() all clocks associated with this hwmod. Retrieve as
1325  * well the clockdomain.
1326  * @oh: struct omap_hwmod *
1327  * @data: not used; pass NULL
1328  *
1329  * Called by omap_hwmod_setup_*() (after omap2_clk_init()).
1330  * Resolves all clock names embedded in the hwmod.  Returns 0 on
1331  * success, or a negative error code on failure.
1332  */
1333 static int _init_clocks(struct omap_hwmod *oh, void *data)
1334 {
1335         int ret = 0;
1336
1337         if (oh->_state != _HWMOD_STATE_REGISTERED)
1338                 return 0;
1339
1340         pr_debug("omap_hwmod: %s: looking up clocks\n", oh->name);
1341
1342         ret |= _init_main_clk(oh);
1343         ret |= _init_interface_clks(oh);
1344         ret |= _init_opt_clks(oh);
1345         ret |= _init_clkdm(oh);
1346
1347         if (!ret)
1348                 oh->_state = _HWMOD_STATE_CLKS_INITED;
1349         else
1350                 pr_warning("omap_hwmod: %s: cannot _init_clocks\n", oh->name);
1351
1352         return ret;
1353 }
1354
1355 /**
1356  * _wait_target_ready - wait for a module to leave slave idle
1357  * @oh: struct omap_hwmod *
1358  *
1359  * Wait for a module @oh to leave slave idle.  Returns 0 if the module
1360  * does not have an IDLEST bit or if the module successfully leaves
1361  * slave idle; otherwise, pass along the return value of the
1362  * appropriate *_cm*_wait_module_ready() function.
1363  */
1364 static int _wait_target_ready(struct omap_hwmod *oh)
1365 {
1366         struct omap_hwmod_ocp_if *os;
1367         int ret;
1368
1369         if (!oh)
1370                 return -EINVAL;
1371
1372         if (oh->flags & HWMOD_NO_IDLEST)
1373                 return 0;
1374
1375         os = _find_mpu_rt_port(oh);
1376         if (!os)
1377                 return 0;
1378
1379         /* XXX check module SIDLEMODE */
1380
1381         /* XXX check clock enable states */
1382
1383         if (cpu_is_omap24xx() || cpu_is_omap34xx()) {
1384                 ret = omap2_cm_wait_module_ready(oh->prcm.omap2.module_offs,
1385                                                  oh->prcm.omap2.idlest_reg_id,
1386                                                  oh->prcm.omap2.idlest_idle_bit);
1387         } else if (cpu_is_omap44xx()) {
1388                 if (!oh->clkdm)
1389                         return -EINVAL;
1390
1391                 ret = omap4_cminst_wait_module_ready(oh->clkdm->prcm_partition,
1392                                                      oh->clkdm->cm_inst,
1393                                                      oh->clkdm->clkdm_offs,
1394                                                      oh->prcm.omap4.clkctrl_offs);
1395         } else {
1396                 BUG();
1397         };
1398
1399         return ret;
1400 }
1401
1402 /**
1403  * _lookup_hardreset - fill register bit info for this hwmod/reset line
1404  * @oh: struct omap_hwmod *
1405  * @name: name of the reset line in the context of this hwmod
1406  * @ohri: struct omap_hwmod_rst_info * that this function will fill in
1407  *
1408  * Return the bit position of the reset line that match the
1409  * input name. Return -ENOENT if not found.
1410  */
1411 static u8 _lookup_hardreset(struct omap_hwmod *oh, const char *name,
1412                             struct omap_hwmod_rst_info *ohri)
1413 {
1414         int i;
1415
1416         for (i = 0; i < oh->rst_lines_cnt; i++) {
1417                 const char *rst_line = oh->rst_lines[i].name;
1418                 if (!strcmp(rst_line, name)) {
1419                         ohri->rst_shift = oh->rst_lines[i].rst_shift;
1420                         ohri->st_shift = oh->rst_lines[i].st_shift;
1421                         pr_debug("omap_hwmod: %s: %s: %s: rst %d st %d\n",
1422                                  oh->name, __func__, rst_line, ohri->rst_shift,
1423                                  ohri->st_shift);
1424
1425                         return 0;
1426                 }
1427         }
1428
1429         return -ENOENT;
1430 }
1431
1432 /**
1433  * _assert_hardreset - assert the HW reset line of submodules
1434  * contained in the hwmod module.
1435  * @oh: struct omap_hwmod *
1436  * @name: name of the reset line to lookup and assert
1437  *
1438  * Some IP like dsp, ipu or iva contain processor that require
1439  * an HW reset line to be assert / deassert in order to enable fully
1440  * the IP.
1441  */
1442 static int _assert_hardreset(struct omap_hwmod *oh, const char *name)
1443 {
1444         struct omap_hwmod_rst_info ohri;
1445         u8 ret;
1446
1447         if (!oh)
1448                 return -EINVAL;
1449
1450         ret = _lookup_hardreset(oh, name, &ohri);
1451         if (IS_ERR_VALUE(ret))
1452                 return ret;
1453
1454         if (cpu_is_omap24xx() || cpu_is_omap34xx())
1455                 return omap2_prm_assert_hardreset(oh->prcm.omap2.module_offs,
1456                                                   ohri.rst_shift);
1457         else if (cpu_is_omap44xx())
1458                 return omap4_prminst_assert_hardreset(ohri.rst_shift,
1459                                   oh->clkdm->pwrdm.ptr->prcm_partition,
1460                                   oh->clkdm->pwrdm.ptr->prcm_offs,
1461                                   oh->prcm.omap4.rstctrl_offs);
1462         else
1463                 return -EINVAL;
1464 }
1465
1466 /**
1467  * _deassert_hardreset - deassert the HW reset line of submodules contained
1468  * in the hwmod module.
1469  * @oh: struct omap_hwmod *
1470  * @name: name of the reset line to look up and deassert
1471  *
1472  * Some IP like dsp, ipu or iva contain processor that require
1473  * an HW reset line to be assert / deassert in order to enable fully
1474  * the IP.
1475  */
1476 static int _deassert_hardreset(struct omap_hwmod *oh, const char *name)
1477 {
1478         struct omap_hwmod_rst_info ohri;
1479         int ret;
1480
1481         if (!oh)
1482                 return -EINVAL;
1483
1484         ret = _lookup_hardreset(oh, name, &ohri);
1485         if (IS_ERR_VALUE(ret))
1486                 return ret;
1487
1488         if (cpu_is_omap24xx() || cpu_is_omap34xx()) {
1489                 ret = omap2_prm_deassert_hardreset(oh->prcm.omap2.module_offs,
1490                                                    ohri.rst_shift,
1491                                                    ohri.st_shift);
1492         } else if (cpu_is_omap44xx()) {
1493                 if (ohri.st_shift)
1494                         pr_err("omap_hwmod: %s: %s: hwmod data error: OMAP4 does not support st_shift\n",
1495                                oh->name, name);
1496                 ret = omap4_prminst_deassert_hardreset(ohri.rst_shift,
1497                                   oh->clkdm->pwrdm.ptr->prcm_partition,
1498                                   oh->clkdm->pwrdm.ptr->prcm_offs,
1499                                   oh->prcm.omap4.rstctrl_offs);
1500         } else {
1501                 return -EINVAL;
1502         }
1503
1504         if (ret == -EBUSY)
1505                 pr_warning("omap_hwmod: %s: failed to hardreset\n", oh->name);
1506
1507         return ret;
1508 }
1509
1510 /**
1511  * _read_hardreset - read the HW reset line state of submodules
1512  * contained in the hwmod module
1513  * @oh: struct omap_hwmod *
1514  * @name: name of the reset line to look up and read
1515  *
1516  * Return the state of the reset line.
1517  */
1518 static int _read_hardreset(struct omap_hwmod *oh, const char *name)
1519 {
1520         struct omap_hwmod_rst_info ohri;
1521         u8 ret;
1522
1523         if (!oh)
1524                 return -EINVAL;
1525
1526         ret = _lookup_hardreset(oh, name, &ohri);
1527         if (IS_ERR_VALUE(ret))
1528                 return ret;
1529
1530         if (cpu_is_omap24xx() || cpu_is_omap34xx()) {
1531                 return omap2_prm_is_hardreset_asserted(oh->prcm.omap2.module_offs,
1532                                                        ohri.st_shift);
1533         } else if (cpu_is_omap44xx()) {
1534                 return omap4_prminst_is_hardreset_asserted(ohri.rst_shift,
1535                                   oh->clkdm->pwrdm.ptr->prcm_partition,
1536                                   oh->clkdm->pwrdm.ptr->prcm_offs,
1537                                   oh->prcm.omap4.rstctrl_offs);
1538         } else {
1539                 return -EINVAL;
1540         }
1541 }
1542
1543 /**
1544  * _are_any_hardreset_lines_asserted - return true if part of @oh is hard-reset
1545  * @oh: struct omap_hwmod *
1546  *
1547  * If any hardreset line associated with @oh is asserted, then return true.
1548  * Otherwise, if @oh has no hardreset lines associated with it, or if
1549  * no hardreset lines associated with @oh are asserted, then return false.
1550  * This function is used to avoid executing some parts of the IP block
1551  * enable/disable sequence if a hardreset line is set.
1552  */
1553 static bool _are_any_hardreset_lines_asserted(struct omap_hwmod *oh)
1554 {
1555         int i;
1556
1557         if (oh->rst_lines_cnt == 0)
1558                 return false;
1559
1560         for (i = 0; i < oh->rst_lines_cnt; i++)
1561                 if (_read_hardreset(oh, oh->rst_lines[i].name) > 0)
1562                         return true;
1563
1564         return false;
1565 }
1566
1567 /**
1568  * _omap4_disable_module - enable CLKCTRL modulemode on OMAP4
1569  * @oh: struct omap_hwmod *
1570  *
1571  * Disable the PRCM module mode related to the hwmod @oh.
1572  * Return EINVAL if the modulemode is not supported and 0 in case of success.
1573  */
1574 static int _omap4_disable_module(struct omap_hwmod *oh)
1575 {
1576         int v;
1577
1578         /* The module mode does not exist prior OMAP4 */
1579         if (!cpu_is_omap44xx())
1580                 return -EINVAL;
1581
1582         if (!oh->clkdm || !oh->prcm.omap4.modulemode)
1583                 return -EINVAL;
1584
1585         pr_debug("omap_hwmod: %s: %s\n", oh->name, __func__);
1586
1587         omap4_cminst_module_disable(oh->clkdm->prcm_partition,
1588                                     oh->clkdm->cm_inst,
1589                                     oh->clkdm->clkdm_offs,
1590                                     oh->prcm.omap4.clkctrl_offs);
1591
1592         if (_are_any_hardreset_lines_asserted(oh))
1593                 return 0;
1594
1595         v = _omap4_wait_target_disable(oh);
1596         if (v)
1597                 pr_warn("omap_hwmod: %s: _wait_target_disable failed\n",
1598                         oh->name);
1599
1600         return 0;
1601 }
1602
1603 /**
1604  * _ocp_softreset - reset an omap_hwmod via the OCP_SYSCONFIG bit
1605  * @oh: struct omap_hwmod *
1606  *
1607  * Resets an omap_hwmod @oh via the OCP_SYSCONFIG bit.  hwmod must be
1608  * enabled for this to work.  Returns -ENOENT if the hwmod cannot be
1609  * reset this way, -EINVAL if the hwmod is in the wrong state,
1610  * -ETIMEDOUT if the module did not reset in time, or 0 upon success.
1611  *
1612  * In OMAP3 a specific SYSSTATUS register is used to get the reset status.
1613  * Starting in OMAP4, some IPs do not have SYSSTATUS registers and instead
1614  * use the SYSCONFIG softreset bit to provide the status.
1615  *
1616  * Note that some IP like McBSP do have reset control but don't have
1617  * reset status.
1618  */
1619 static int _ocp_softreset(struct omap_hwmod *oh)
1620 {
1621         u32 v, softrst_mask;
1622         int c = 0;
1623         int ret = 0;
1624
1625         if (!oh->class->sysc ||
1626             !(oh->class->sysc->sysc_flags & SYSC_HAS_SOFTRESET))
1627                 return -ENOENT;
1628
1629         /* clocks must be on for this operation */
1630         if (oh->_state != _HWMOD_STATE_ENABLED) {
1631                 pr_warning("omap_hwmod: %s: reset can only be entered from "
1632                            "enabled state\n", oh->name);
1633                 return -EINVAL;
1634         }
1635
1636         /* For some modules, all optionnal clocks need to be enabled as well */
1637         if (oh->flags & HWMOD_CONTROL_OPT_CLKS_IN_RESET)
1638                 _enable_optional_clocks(oh);
1639
1640         pr_debug("omap_hwmod: %s: resetting via OCP SOFTRESET\n", oh->name);
1641
1642         v = oh->_sysc_cache;
1643         ret = _set_softreset(oh, &v);
1644         if (ret)
1645                 goto dis_opt_clks;
1646         _write_sysconfig(v, oh);
1647
1648         if (oh->class->sysc->srst_udelay)
1649                 udelay(oh->class->sysc->srst_udelay);
1650
1651         if (oh->class->sysc->sysc_flags & SYSS_HAS_RESET_STATUS)
1652                 omap_test_timeout((omap_hwmod_read(oh,
1653                                                     oh->class->sysc->syss_offs)
1654                                    & SYSS_RESETDONE_MASK),
1655                                   MAX_MODULE_SOFTRESET_WAIT, c);
1656         else if (oh->class->sysc->sysc_flags & SYSC_HAS_RESET_STATUS) {
1657                 softrst_mask = (0x1 << oh->class->sysc->sysc_fields->srst_shift);
1658                 omap_test_timeout(!(omap_hwmod_read(oh,
1659                                                      oh->class->sysc->sysc_offs)
1660                                    & softrst_mask),
1661                                   MAX_MODULE_SOFTRESET_WAIT, c);
1662         }
1663
1664         if (c == MAX_MODULE_SOFTRESET_WAIT)
1665                 pr_warning("omap_hwmod: %s: softreset failed (waited %d usec)\n",
1666                            oh->name, MAX_MODULE_SOFTRESET_WAIT);
1667         else
1668                 pr_debug("omap_hwmod: %s: softreset in %d usec\n", oh->name, c);
1669
1670         /*
1671          * XXX add _HWMOD_STATE_WEDGED for modules that don't come back from
1672          * _wait_target_ready() or _reset()
1673          */
1674
1675         ret = (c == MAX_MODULE_SOFTRESET_WAIT) ? -ETIMEDOUT : 0;
1676
1677 dis_opt_clks:
1678         if (oh->flags & HWMOD_CONTROL_OPT_CLKS_IN_RESET)
1679                 _disable_optional_clocks(oh);
1680
1681         return ret;
1682 }
1683
1684 /**
1685  * _reset - reset an omap_hwmod
1686  * @oh: struct omap_hwmod *
1687  *
1688  * Resets an omap_hwmod @oh.  If the module has a custom reset
1689  * function pointer defined, then call it to reset the IP block, and
1690  * pass along its return value to the caller.  Otherwise, if the IP
1691  * block has an OCP_SYSCONFIG register with a SOFTRESET bitfield
1692  * associated with it, call a function to reset the IP block via that
1693  * method, and pass along the return value to the caller.  Finally, if
1694  * the IP block has some hardreset lines associated with it, assert
1695  * all of those, but do _not_ deassert them. (This is because driver
1696  * authors have expressed an apparent requirement to control the
1697  * deassertion of the hardreset lines themselves.)
1698  *
1699  * The default software reset mechanism for most OMAP IP blocks is
1700  * triggered via the OCP_SYSCONFIG.SOFTRESET bit.  However, some
1701  * hwmods cannot be reset via this method.  Some are not targets and
1702  * therefore have no OCP header registers to access.  Others (like the
1703  * IVA) have idiosyncratic reset sequences.  So for these relatively
1704  * rare cases, custom reset code can be supplied in the struct
1705  * omap_hwmod_class .reset function pointer.  Passes along the return
1706  * value from either _ocp_softreset() or the custom reset function -
1707  * these must return -EINVAL if the hwmod cannot be reset this way or
1708  * if the hwmod is in the wrong state, -ETIMEDOUT if the module did
1709  * not reset in time, or 0 upon success.
1710  */
1711 static int _reset(struct omap_hwmod *oh)
1712 {
1713         int i, r;
1714
1715         pr_debug("omap_hwmod: %s: resetting\n", oh->name);
1716
1717         if (oh->class->reset) {
1718                 r = oh->class->reset(oh);
1719         } else {
1720                 if (oh->rst_lines_cnt > 0) {
1721                         for (i = 0; i < oh->rst_lines_cnt; i++)
1722                                 _assert_hardreset(oh, oh->rst_lines[i].name);
1723                         return 0;
1724                 } else {
1725                         r = _ocp_softreset(oh);
1726                         if (r == -ENOENT)
1727                                 r = 0;
1728                 }
1729         }
1730
1731         /*
1732          * OCP_SYSCONFIG bits need to be reprogrammed after a
1733          * softreset.  The _enable() function should be split to avoid
1734          * the rewrite of the OCP_SYSCONFIG register.
1735          */
1736         if (oh->class->sysc) {
1737                 _update_sysc_cache(oh);
1738                 _enable_sysc(oh);
1739         }
1740
1741         return r;
1742 }
1743
1744 /**
1745  * _reconfigure_io_chain - clear any I/O chain wakeups and reconfigure chain
1746  *
1747  * Call the appropriate PRM function to clear any logged I/O chain
1748  * wakeups and to reconfigure the chain.  This apparently needs to be
1749  * done upon every mux change.  Since hwmods can be concurrently
1750  * enabled and idled, hold a spinlock around the I/O chain
1751  * reconfiguration sequence.  No return value.
1752  *
1753  * XXX When the PRM code is moved to drivers, this function can be removed,
1754  * as the PRM infrastructure should abstract this.
1755  */
1756 static void _reconfigure_io_chain(void)
1757 {
1758         unsigned long flags;
1759
1760         spin_lock_irqsave(&io_chain_lock, flags);
1761
1762         if (cpu_is_omap34xx() && omap3_has_io_chain_ctrl())
1763                 omap3xxx_prm_reconfigure_io_chain();
1764         else if (cpu_is_omap44xx())
1765                 omap44xx_prm_reconfigure_io_chain();
1766
1767         spin_unlock_irqrestore(&io_chain_lock, flags);
1768 }
1769
1770 /**
1771  * _enable - enable an omap_hwmod
1772  * @oh: struct omap_hwmod *
1773  *
1774  * Enables an omap_hwmod @oh such that the MPU can access the hwmod's
1775  * register target.  Returns -EINVAL if the hwmod is in the wrong
1776  * state or passes along the return value of _wait_target_ready().
1777  */
1778 static int _enable(struct omap_hwmod *oh)
1779 {
1780         int r;
1781         int hwsup = 0;
1782
1783         pr_debug("omap_hwmod: %s: enabling\n", oh->name);
1784
1785         /*
1786          * hwmods with HWMOD_INIT_NO_IDLE flag set are left in enabled
1787          * state at init.  Now that someone is really trying to enable
1788          * them, just ensure that the hwmod mux is set.
1789          */
1790         if (oh->_int_flags & _HWMOD_SKIP_ENABLE) {
1791                 /*
1792                  * If the caller has mux data populated, do the mux'ing
1793                  * which wouldn't have been done as part of the _enable()
1794                  * done during setup.
1795                  */
1796                 if (oh->mux)
1797                         omap_hwmod_mux(oh->mux, _HWMOD_STATE_ENABLED);
1798
1799                 oh->_int_flags &= ~_HWMOD_SKIP_ENABLE;
1800                 return 0;
1801         }
1802
1803         if (oh->_state != _HWMOD_STATE_INITIALIZED &&
1804             oh->_state != _HWMOD_STATE_IDLE &&
1805             oh->_state != _HWMOD_STATE_DISABLED) {
1806                 WARN(1, "omap_hwmod: %s: enabled state can only be entered from initialized, idle, or disabled state\n",
1807                         oh->name);
1808                 return -EINVAL;
1809         }
1810
1811         /*
1812          * If an IP block contains HW reset lines and any of them are
1813          * asserted, we let integration code associated with that
1814          * block handle the enable.  We've received very little
1815          * information on what those driver authors need, and until
1816          * detailed information is provided and the driver code is
1817          * posted to the public lists, this is probably the best we
1818          * can do.
1819          */
1820         if (_are_any_hardreset_lines_asserted(oh))
1821                 return 0;
1822
1823         /* Mux pins for device runtime if populated */
1824         if (oh->mux && (!oh->mux->enabled ||
1825                         ((oh->_state == _HWMOD_STATE_IDLE) &&
1826                          oh->mux->pads_dynamic))) {
1827                 omap_hwmod_mux(oh->mux, _HWMOD_STATE_ENABLED);
1828                 _reconfigure_io_chain();
1829         }
1830
1831         _add_initiator_dep(oh, mpu_oh);
1832
1833         if (oh->clkdm) {
1834                 /*
1835                  * A clockdomain must be in SW_SUP before enabling
1836                  * completely the module. The clockdomain can be set
1837                  * in HW_AUTO only when the module become ready.
1838                  */
1839                 hwsup = clkdm_in_hwsup(oh->clkdm);
1840                 r = clkdm_hwmod_enable(oh->clkdm, oh);
1841                 if (r) {
1842                         WARN(1, "omap_hwmod: %s: could not enable clockdomain %s: %d\n",
1843                              oh->name, oh->clkdm->name, r);
1844                         return r;
1845                 }
1846         }
1847
1848         _enable_clocks(oh);
1849         _enable_module(oh);
1850
1851         r = _wait_target_ready(oh);
1852         if (!r) {
1853                 /*
1854                  * Set the clockdomain to HW_AUTO only if the target is ready,
1855                  * assuming that the previous state was HW_AUTO
1856                  */
1857                 if (oh->clkdm && hwsup)
1858                         clkdm_allow_idle(oh->clkdm);
1859
1860                 oh->_state = _HWMOD_STATE_ENABLED;
1861
1862                 /* Access the sysconfig only if the target is ready */
1863                 if (oh->class->sysc) {
1864                         if (!(oh->_int_flags & _HWMOD_SYSCONFIG_LOADED))
1865                                 _update_sysc_cache(oh);
1866                         _enable_sysc(oh);
1867                 }
1868         } else {
1869                 _disable_clocks(oh);
1870                 pr_debug("omap_hwmod: %s: _wait_target_ready: %d\n",
1871                          oh->name, r);
1872
1873                 if (oh->clkdm)
1874                         clkdm_hwmod_disable(oh->clkdm, oh);
1875         }
1876
1877         return r;
1878 }
1879
1880 /**
1881  * _idle - idle an omap_hwmod
1882  * @oh: struct omap_hwmod *
1883  *
1884  * Idles an omap_hwmod @oh.  This should be called once the hwmod has
1885  * no further work.  Returns -EINVAL if the hwmod is in the wrong
1886  * state or returns 0.
1887  */
1888 static int _idle(struct omap_hwmod *oh)
1889 {
1890         pr_debug("omap_hwmod: %s: idling\n", oh->name);
1891
1892         if (oh->_state != _HWMOD_STATE_ENABLED) {
1893                 WARN(1, "omap_hwmod: %s: idle state can only be entered from enabled state\n",
1894                         oh->name);
1895                 return -EINVAL;
1896         }
1897
1898         if (_are_any_hardreset_lines_asserted(oh))
1899                 return 0;
1900
1901         if (oh->class->sysc)
1902                 _idle_sysc(oh);
1903         _del_initiator_dep(oh, mpu_oh);
1904
1905         _omap4_disable_module(oh);
1906
1907         /*
1908          * The module must be in idle mode before disabling any parents
1909          * clocks. Otherwise, the parent clock might be disabled before
1910          * the module transition is done, and thus will prevent the
1911          * transition to complete properly.
1912          */
1913         _disable_clocks(oh);
1914         if (oh->clkdm)
1915                 clkdm_hwmod_disable(oh->clkdm, oh);
1916
1917         /* Mux pins for device idle if populated */
1918         if (oh->mux && oh->mux->pads_dynamic) {
1919                 omap_hwmod_mux(oh->mux, _HWMOD_STATE_IDLE);
1920                 _reconfigure_io_chain();
1921         }
1922
1923         oh->_state = _HWMOD_STATE_IDLE;
1924
1925         return 0;
1926 }
1927
1928 /**
1929  * omap_hwmod_set_ocp_autoidle - set the hwmod's OCP autoidle bit
1930  * @oh: struct omap_hwmod *
1931  * @autoidle: desired AUTOIDLE bitfield value (0 or 1)
1932  *
1933  * Sets the IP block's OCP autoidle bit in hardware, and updates our
1934  * local copy. Intended to be used by drivers that require
1935  * direct manipulation of the AUTOIDLE bits.
1936  * Returns -EINVAL if @oh is null or is not in the ENABLED state, or passes
1937  * along the return value from _set_module_autoidle().
1938  *
1939  * Any users of this function should be scrutinized carefully.
1940  */
1941 int omap_hwmod_set_ocp_autoidle(struct omap_hwmod *oh, u8 autoidle)
1942 {
1943         u32 v;
1944         int retval = 0;
1945         unsigned long flags;
1946
1947         if (!oh || oh->_state != _HWMOD_STATE_ENABLED)
1948                 return -EINVAL;
1949
1950         spin_lock_irqsave(&oh->_lock, flags);
1951
1952         v = oh->_sysc_cache;
1953
1954         retval = _set_module_autoidle(oh, autoidle, &v);
1955
1956         if (!retval)
1957                 _write_sysconfig(v, oh);
1958
1959         spin_unlock_irqrestore(&oh->_lock, flags);
1960
1961         return retval;
1962 }
1963
1964 /**
1965  * _shutdown - shutdown an omap_hwmod
1966  * @oh: struct omap_hwmod *
1967  *
1968  * Shut down an omap_hwmod @oh.  This should be called when the driver
1969  * used for the hwmod is removed or unloaded or if the driver is not
1970  * used by the system.  Returns -EINVAL if the hwmod is in the wrong
1971  * state or returns 0.
1972  */
1973 static int _shutdown(struct omap_hwmod *oh)
1974 {
1975         int ret, i;
1976         u8 prev_state;
1977
1978         if (oh->_state != _HWMOD_STATE_IDLE &&
1979             oh->_state != _HWMOD_STATE_ENABLED) {
1980                 WARN(1, "omap_hwmod: %s: disabled state can only be entered from idle, or enabled state\n",
1981                         oh->name);
1982                 return -EINVAL;
1983         }
1984
1985         if (_are_any_hardreset_lines_asserted(oh))
1986                 return 0;
1987
1988         pr_debug("omap_hwmod: %s: disabling\n", oh->name);
1989
1990         if (oh->class->pre_shutdown) {
1991                 prev_state = oh->_state;
1992                 if (oh->_state == _HWMOD_STATE_IDLE)
1993                         _enable(oh);
1994                 ret = oh->class->pre_shutdown(oh);
1995                 if (ret) {
1996                         if (prev_state == _HWMOD_STATE_IDLE)
1997                                 _idle(oh);
1998                         return ret;
1999                 }
2000         }
2001
2002         if (oh->class->sysc) {
2003                 if (oh->_state == _HWMOD_STATE_IDLE)
2004                         _enable(oh);
2005                 _shutdown_sysc(oh);
2006         }
2007
2008         /* clocks and deps are already disabled in idle */
2009         if (oh->_state == _HWMOD_STATE_ENABLED) {
2010                 _del_initiator_dep(oh, mpu_oh);
2011                 /* XXX what about the other system initiators here? dma, dsp */
2012                 _omap4_disable_module(oh);
2013                 _disable_clocks(oh);
2014                 if (oh->clkdm)
2015                         clkdm_hwmod_disable(oh->clkdm, oh);
2016         }
2017         /* XXX Should this code also force-disable the optional clocks? */
2018
2019         for (i = 0; i < oh->rst_lines_cnt; i++)
2020                 _assert_hardreset(oh, oh->rst_lines[i].name);
2021
2022         /* Mux pins to safe mode or use populated off mode values */
2023         if (oh->mux)
2024                 omap_hwmod_mux(oh->mux, _HWMOD_STATE_DISABLED);
2025
2026         oh->_state = _HWMOD_STATE_DISABLED;
2027
2028         return 0;
2029 }
2030
2031 /**
2032  * _init_mpu_rt_base - populate the virtual address for a hwmod
2033  * @oh: struct omap_hwmod * to locate the virtual address
2034  *
2035  * Cache the virtual address used by the MPU to access this IP block's
2036  * registers.  This address is needed early so the OCP registers that
2037  * are part of the device's address space can be ioremapped properly.
2038  * No return value.
2039  */
2040 static void __init _init_mpu_rt_base(struct omap_hwmod *oh, void *data)
2041 {
2042         struct omap_hwmod_addr_space *mem;
2043         void __iomem *va_start;
2044
2045         if (!oh)
2046                 return;
2047
2048         _save_mpu_port_index(oh);
2049
2050         if (oh->_int_flags & _HWMOD_NO_MPU_PORT)
2051                 return;
2052
2053         mem = _find_mpu_rt_addr_space(oh);
2054         if (!mem) {
2055                 pr_debug("omap_hwmod: %s: no MPU register target found\n",
2056                          oh->name);
2057                 return;
2058         }
2059
2060         va_start = ioremap(mem->pa_start, mem->pa_end - mem->pa_start);
2061         if (!va_start) {
2062                 pr_err("omap_hwmod: %s: Could not ioremap\n", oh->name);
2063                 return;
2064         }
2065
2066         pr_debug("omap_hwmod: %s: MPU register target at va %p\n",
2067                  oh->name, va_start);
2068
2069         oh->_mpu_rt_va = va_start;
2070 }
2071
2072 /**
2073  * _init - initialize internal data for the hwmod @oh
2074  * @oh: struct omap_hwmod *
2075  * @n: (unused)
2076  *
2077  * Look up the clocks and the address space used by the MPU to access
2078  * registers belonging to the hwmod @oh.  @oh must already be
2079  * registered at this point.  This is the first of two phases for
2080  * hwmod initialization.  Code called here does not touch any hardware
2081  * registers, it simply prepares internal data structures.  Returns 0
2082  * upon success or if the hwmod isn't registered, or -EINVAL upon
2083  * failure.
2084  */
2085 static int __init _init(struct omap_hwmod *oh, void *data)
2086 {
2087         int r;
2088
2089         if (oh->_state != _HWMOD_STATE_REGISTERED)
2090                 return 0;
2091
2092         _init_mpu_rt_base(oh, NULL);
2093
2094         r = _init_clocks(oh, NULL);
2095         if (IS_ERR_VALUE(r)) {
2096                 WARN(1, "omap_hwmod: %s: couldn't init clocks\n", oh->name);
2097                 return -EINVAL;
2098         }
2099
2100         oh->_state = _HWMOD_STATE_INITIALIZED;
2101
2102         return 0;
2103 }
2104
2105 /**
2106  * _setup_iclk_autoidle - configure an IP block's interface clocks
2107  * @oh: struct omap_hwmod *
2108  *
2109  * Set up the module's interface clocks.  XXX This function is still mostly
2110  * a stub; implementing this properly requires iclk autoidle usecounting in
2111  * the clock code.   No return value.
2112  */
2113 static void __init _setup_iclk_autoidle(struct omap_hwmod *oh)
2114 {
2115         struct omap_hwmod_ocp_if *os;
2116         struct list_head *p;
2117         int i = 0;
2118         if (oh->_state != _HWMOD_STATE_INITIALIZED)
2119                 return;
2120
2121         p = oh->slave_ports.next;
2122
2123         while (i < oh->slaves_cnt) {
2124                 os = _fetch_next_ocp_if(&p, &i);
2125                 if (!os->_clk)
2126                         continue;
2127
2128                 if (os->flags & OCPIF_SWSUP_IDLE) {
2129                         /* XXX omap_iclk_deny_idle(c); */
2130                 } else {
2131                         /* XXX omap_iclk_allow_idle(c); */
2132                         clk_enable(os->_clk);
2133                 }
2134         }
2135
2136         return;
2137 }
2138
2139 /**
2140  * _setup_reset - reset an IP block during the setup process
2141  * @oh: struct omap_hwmod *
2142  *
2143  * Reset the IP block corresponding to the hwmod @oh during the setup
2144  * process.  The IP block is first enabled so it can be successfully
2145  * reset.  Returns 0 upon success or a negative error code upon
2146  * failure.
2147  */
2148 static int __init _setup_reset(struct omap_hwmod *oh)
2149 {
2150         int r;
2151
2152         if (oh->_state != _HWMOD_STATE_INITIALIZED)
2153                 return -EINVAL;
2154
2155         if (oh->rst_lines_cnt == 0) {
2156                 r = _enable(oh);
2157                 if (r) {
2158                         pr_warning("omap_hwmod: %s: cannot be enabled for reset (%d)\n",
2159                                    oh->name, oh->_state);
2160                         return -EINVAL;
2161                 }
2162         }
2163
2164         if (!(oh->flags & HWMOD_INIT_NO_RESET))
2165                 r = _reset(oh);
2166
2167         return r;
2168 }
2169
2170 /**
2171  * _setup_postsetup - transition to the appropriate state after _setup
2172  * @oh: struct omap_hwmod *
2173  *
2174  * Place an IP block represented by @oh into a "post-setup" state --
2175  * either IDLE, ENABLED, or DISABLED.  ("post-setup" simply means that
2176  * this function is called at the end of _setup().)  The postsetup
2177  * state for an IP block can be changed by calling
2178  * omap_hwmod_enter_postsetup_state() early in the boot process,
2179  * before one of the omap_hwmod_setup*() functions are called for the
2180  * IP block.
2181  *
2182  * The IP block stays in this state until a PM runtime-based driver is
2183  * loaded for that IP block.  A post-setup state of IDLE is
2184  * appropriate for almost all IP blocks with runtime PM-enabled
2185  * drivers, since those drivers are able to enable the IP block.  A
2186  * post-setup state of ENABLED is appropriate for kernels with PM
2187  * runtime disabled.  The DISABLED state is appropriate for unusual IP
2188  * blocks such as the MPU WDTIMER on kernels without WDTIMER drivers
2189  * included, since the WDTIMER starts running on reset and will reset
2190  * the MPU if left active.
2191  *
2192  * This post-setup mechanism is deprecated.  Once all of the OMAP
2193  * drivers have been converted to use PM runtime, and all of the IP
2194  * block data and interconnect data is available to the hwmod code, it
2195  * should be possible to replace this mechanism with a "lazy reset"
2196  * arrangement.  In a "lazy reset" setup, each IP block is enabled
2197  * when the driver first probes, then all remaining IP blocks without
2198  * drivers are either shut down or enabled after the drivers have
2199  * loaded.  However, this cannot take place until the above
2200  * preconditions have been met, since otherwise the late reset code
2201  * has no way of knowing which IP blocks are in use by drivers, and
2202  * which ones are unused.
2203  *
2204  * No return value.
2205  */
2206 static void __init _setup_postsetup(struct omap_hwmod *oh)
2207 {
2208         u8 postsetup_state;
2209
2210         if (oh->rst_lines_cnt > 0)
2211                 return;
2212
2213         postsetup_state = oh->_postsetup_state;
2214         if (postsetup_state == _HWMOD_STATE_UNKNOWN)
2215                 postsetup_state = _HWMOD_STATE_ENABLED;
2216
2217         /*
2218          * XXX HWMOD_INIT_NO_IDLE does not belong in hwmod data -
2219          * it should be set by the core code as a runtime flag during startup
2220          */
2221         if ((oh->flags & HWMOD_INIT_NO_IDLE) &&
2222             (postsetup_state == _HWMOD_STATE_IDLE)) {
2223                 oh->_int_flags |= _HWMOD_SKIP_ENABLE;
2224                 postsetup_state = _HWMOD_STATE_ENABLED;
2225         }
2226
2227         if (postsetup_state == _HWMOD_STATE_IDLE)
2228                 _idle(oh);
2229         else if (postsetup_state == _HWMOD_STATE_DISABLED)
2230                 _shutdown(oh);
2231         else if (postsetup_state != _HWMOD_STATE_ENABLED)
2232                 WARN(1, "hwmod: %s: unknown postsetup state %d! defaulting to enabled\n",
2233                      oh->name, postsetup_state);
2234
2235         return;
2236 }
2237
2238 /**
2239  * _setup - prepare IP block hardware for use
2240  * @oh: struct omap_hwmod *
2241  * @n: (unused, pass NULL)
2242  *
2243  * Configure the IP block represented by @oh.  This may include
2244  * enabling the IP block, resetting it, and placing it into a
2245  * post-setup state, depending on the type of IP block and applicable
2246  * flags.  IP blocks are reset to prevent any previous configuration
2247  * by the bootloader or previous operating system from interfering
2248  * with power management or other parts of the system.  The reset can
2249  * be avoided; see omap_hwmod_no_setup_reset().  This is the second of
2250  * two phases for hwmod initialization.  Code called here generally
2251  * affects the IP block hardware, or system integration hardware
2252  * associated with the IP block.  Returns 0.
2253  */
2254 static int __init _setup(struct omap_hwmod *oh, void *data)
2255 {
2256         if (oh->_state != _HWMOD_STATE_INITIALIZED)
2257                 return 0;
2258
2259         _setup_iclk_autoidle(oh);
2260
2261         if (!_setup_reset(oh))
2262                 _setup_postsetup(oh);
2263
2264         return 0;
2265 }
2266
2267 /**
2268  * _register - register a struct omap_hwmod
2269  * @oh: struct omap_hwmod *
2270  *
2271  * Registers the omap_hwmod @oh.  Returns -EEXIST if an omap_hwmod
2272  * already has been registered by the same name; -EINVAL if the
2273  * omap_hwmod is in the wrong state, if @oh is NULL, if the
2274  * omap_hwmod's class field is NULL; if the omap_hwmod is missing a
2275  * name, or if the omap_hwmod's class is missing a name; or 0 upon
2276  * success.
2277  *
2278  * XXX The data should be copied into bootmem, so the original data
2279  * should be marked __initdata and freed after init.  This would allow
2280  * unneeded omap_hwmods to be freed on multi-OMAP configurations.  Note
2281  * that the copy process would be relatively complex due to the large number
2282  * of substructures.
2283  */
2284 static int __init _register(struct omap_hwmod *oh)
2285 {
2286         if (!oh || !oh->name || !oh->class || !oh->class->name ||
2287             (oh->_state != _HWMOD_STATE_UNKNOWN))
2288                 return -EINVAL;
2289
2290         pr_debug("omap_hwmod: %s: registering\n", oh->name);
2291
2292         if (_lookup(oh->name))
2293                 return -EEXIST;
2294
2295         list_add_tail(&oh->node, &omap_hwmod_list);
2296
2297         INIT_LIST_HEAD(&oh->master_ports);
2298         INIT_LIST_HEAD(&oh->slave_ports);
2299         spin_lock_init(&oh->_lock);
2300
2301         oh->_state = _HWMOD_STATE_REGISTERED;
2302
2303         /*
2304          * XXX Rather than doing a strcmp(), this should test a flag
2305          * set in the hwmod data, inserted by the autogenerator code.
2306          */
2307         if (!strcmp(oh->name, MPU_INITIATOR_NAME))
2308                 mpu_oh = oh;
2309
2310         return 0;
2311 }
2312
2313 /**
2314  * _alloc_links - return allocated memory for hwmod links
2315  * @ml: pointer to a struct omap_hwmod_link * for the master link
2316  * @sl: pointer to a struct omap_hwmod_link * for the slave link
2317  *
2318  * Return pointers to two struct omap_hwmod_link records, via the
2319  * addresses pointed to by @ml and @sl.  Will first attempt to return
2320  * memory allocated as part of a large initial block, but if that has
2321  * been exhausted, will allocate memory itself.  Since ideally this
2322  * second allocation path will never occur, the number of these
2323  * 'supplemental' allocations will be logged when debugging is
2324  * enabled.  Returns 0.
2325  */
2326 static int __init _alloc_links(struct omap_hwmod_link **ml,
2327                                struct omap_hwmod_link **sl)
2328 {
2329         unsigned int sz;
2330
2331         if ((free_ls + LINKS_PER_OCP_IF) <= max_ls) {
2332                 *ml = &linkspace[free_ls++];
2333                 *sl = &linkspace[free_ls++];
2334                 return 0;
2335         }
2336
2337         sz = sizeof(struct omap_hwmod_link) * LINKS_PER_OCP_IF;
2338
2339         *sl = NULL;
2340         *ml = alloc_bootmem(sz);
2341
2342         memset(*ml, 0, sz);
2343
2344         *sl = (void *)(*ml) + sizeof(struct omap_hwmod_link);
2345
2346         ls_supp++;
2347         pr_debug("omap_hwmod: supplemental link allocations needed: %d\n",
2348                  ls_supp * LINKS_PER_OCP_IF);
2349
2350         return 0;
2351 };
2352
2353 /**
2354  * _add_link - add an interconnect between two IP blocks
2355  * @oi: pointer to a struct omap_hwmod_ocp_if record
2356  *
2357  * Add struct omap_hwmod_link records connecting the master IP block
2358  * specified in @oi->master to @oi, and connecting the slave IP block
2359  * specified in @oi->slave to @oi.  This code is assumed to run before
2360  * preemption or SMP has been enabled, thus avoiding the need for
2361  * locking in this code.  Changes to this assumption will require
2362  * additional locking.  Returns 0.
2363  */
2364 static int __init _add_link(struct omap_hwmod_ocp_if *oi)
2365 {
2366         struct omap_hwmod_link *ml, *sl;
2367
2368         pr_debug("omap_hwmod: %s -> %s: adding link\n", oi->master->name,
2369                  oi->slave->name);
2370
2371         _alloc_links(&ml, &sl);
2372
2373         ml->ocp_if = oi;
2374         INIT_LIST_HEAD(&ml->node);
2375         list_add(&ml->node, &oi->master->master_ports);
2376         oi->master->masters_cnt++;
2377
2378         sl->ocp_if = oi;
2379         INIT_LIST_HEAD(&sl->node);
2380         list_add(&sl->node, &oi->slave->slave_ports);
2381         oi->slave->slaves_cnt++;
2382
2383         return 0;
2384 }
2385
2386 /**
2387  * _register_link - register a struct omap_hwmod_ocp_if
2388  * @oi: struct omap_hwmod_ocp_if *
2389  *
2390  * Registers the omap_hwmod_ocp_if record @oi.  Returns -EEXIST if it
2391  * has already been registered; -EINVAL if @oi is NULL or if the
2392  * record pointed to by @oi is missing required fields; or 0 upon
2393  * success.
2394  *
2395  * XXX The data should be copied into bootmem, so the original data
2396  * should be marked __initdata and freed after init.  This would allow
2397  * unneeded omap_hwmods to be freed on multi-OMAP configurations.
2398  */
2399 static int __init _register_link(struct omap_hwmod_ocp_if *oi)
2400 {
2401         if (!oi || !oi->master || !oi->slave || !oi->user)
2402                 return -EINVAL;
2403
2404         if (oi->_int_flags & _OCPIF_INT_FLAGS_REGISTERED)
2405                 return -EEXIST;
2406
2407         pr_debug("omap_hwmod: registering link from %s to %s\n",
2408                  oi->master->name, oi->slave->name);
2409
2410         /*
2411          * Register the connected hwmods, if they haven't been
2412          * registered already
2413          */
2414         if (oi->master->_state != _HWMOD_STATE_REGISTERED)
2415                 _register(oi->master);
2416
2417         if (oi->slave->_state != _HWMOD_STATE_REGISTERED)
2418                 _register(oi->slave);
2419
2420         _add_link(oi);
2421
2422         oi->_int_flags |= _OCPIF_INT_FLAGS_REGISTERED;
2423
2424         return 0;
2425 }
2426
2427 /**
2428  * _alloc_linkspace - allocate large block of hwmod links
2429  * @ois: pointer to an array of struct omap_hwmod_ocp_if records to count
2430  *
2431  * Allocate a large block of struct omap_hwmod_link records.  This
2432  * improves boot time significantly by avoiding the need to allocate
2433  * individual records one by one.  If the number of records to
2434  * allocate in the block hasn't been manually specified, this function
2435  * will count the number of struct omap_hwmod_ocp_if records in @ois
2436  * and use that to determine the allocation size.  For SoC families
2437  * that require multiple list registrations, such as OMAP3xxx, this
2438  * estimation process isn't optimal, so manual estimation is advised
2439  * in those cases.  Returns -EEXIST if the allocation has already occurred
2440  * or 0 upon success.
2441  */
2442 static int __init _alloc_linkspace(struct omap_hwmod_ocp_if **ois)
2443 {
2444         unsigned int i = 0;
2445         unsigned int sz;
2446
2447         if (linkspace) {
2448                 WARN(1, "linkspace already allocated\n");
2449                 return -EEXIST;
2450         }
2451
2452         if (max_ls == 0)
2453                 while (ois[i++])
2454                         max_ls += LINKS_PER_OCP_IF;
2455
2456         sz = sizeof(struct omap_hwmod_link) * max_ls;
2457
2458         pr_debug("omap_hwmod: %s: allocating %d byte linkspace (%d links)\n",
2459                  __func__, sz, max_ls);
2460
2461         linkspace = alloc_bootmem(sz);
2462
2463         memset(linkspace, 0, sz);
2464
2465         return 0;
2466 }
2467
2468 /* Public functions */
2469
2470 u32 omap_hwmod_read(struct omap_hwmod *oh, u16 reg_offs)
2471 {
2472         if (oh->flags & HWMOD_16BIT_REG)
2473                 return __raw_readw(oh->_mpu_rt_va + reg_offs);
2474         else
2475                 return __raw_readl(oh->_mpu_rt_va + reg_offs);
2476 }
2477
2478 void omap_hwmod_write(u32 v, struct omap_hwmod *oh, u16 reg_offs)
2479 {
2480         if (oh->flags & HWMOD_16BIT_REG)
2481                 __raw_writew(v, oh->_mpu_rt_va + reg_offs);
2482         else
2483                 __raw_writel(v, oh->_mpu_rt_va + reg_offs);
2484 }
2485
2486 /**
2487  * omap_hwmod_softreset - reset a module via SYSCONFIG.SOFTRESET bit
2488  * @oh: struct omap_hwmod *
2489  *
2490  * This is a public function exposed to drivers. Some drivers may need to do
2491  * some settings before and after resetting the device.  Those drivers after
2492  * doing the necessary settings could use this function to start a reset by
2493  * setting the SYSCONFIG.SOFTRESET bit.
2494  */
2495 int omap_hwmod_softreset(struct omap_hwmod *oh)
2496 {
2497         u32 v;
2498         int ret;
2499
2500         if (!oh || !(oh->_sysc_cache))
2501                 return -EINVAL;
2502
2503         v = oh->_sysc_cache;
2504         ret = _set_softreset(oh, &v);
2505         if (ret)
2506                 goto error;
2507         _write_sysconfig(v, oh);
2508
2509 error:
2510         return ret;
2511 }
2512
2513 /**
2514  * omap_hwmod_set_slave_idlemode - set the hwmod's OCP slave idlemode
2515  * @oh: struct omap_hwmod *
2516  * @idlemode: SIDLEMODE field bits (shifted to bit 0)
2517  *
2518  * Sets the IP block's OCP slave idlemode in hardware, and updates our
2519  * local copy.  Intended to be used by drivers that have some erratum
2520  * that requires direct manipulation of the SIDLEMODE bits.  Returns
2521  * -EINVAL if @oh is null, or passes along the return value from
2522  * _set_slave_idlemode().
2523  *
2524  * XXX Does this function have any current users?  If not, we should
2525  * remove it; it is better to let the rest of the hwmod code handle this.
2526  * Any users of this function should be scrutinized carefully.
2527  */
2528 int omap_hwmod_set_slave_idlemode(struct omap_hwmod *oh, u8 idlemode)
2529 {
2530         u32 v;
2531         int retval = 0;
2532
2533         if (!oh)
2534                 return -EINVAL;
2535
2536         v = oh->_sysc_cache;
2537
2538         retval = _set_slave_idlemode(oh, idlemode, &v);
2539         if (!retval)
2540                 _write_sysconfig(v, oh);
2541
2542         return retval;
2543 }
2544
2545 /**
2546  * omap_hwmod_lookup - look up a registered omap_hwmod by name
2547  * @name: name of the omap_hwmod to look up
2548  *
2549  * Given a @name of an omap_hwmod, return a pointer to the registered
2550  * struct omap_hwmod *, or NULL upon error.
2551  */
2552 struct omap_hwmod *omap_hwmod_lookup(const char *name)
2553 {
2554         struct omap_hwmod *oh;
2555
2556         if (!name)
2557                 return NULL;
2558
2559         oh = _lookup(name);
2560
2561         return oh;
2562 }
2563
2564 /**
2565  * omap_hwmod_for_each - call function for each registered omap_hwmod
2566  * @fn: pointer to a callback function
2567  * @data: void * data to pass to callback function
2568  *
2569  * Call @fn for each registered omap_hwmod, passing @data to each
2570  * function.  @fn must return 0 for success or any other value for
2571  * failure.  If @fn returns non-zero, the iteration across omap_hwmods
2572  * will stop and the non-zero return value will be passed to the
2573  * caller of omap_hwmod_for_each().  @fn is called with
2574  * omap_hwmod_for_each() held.
2575  */
2576 int omap_hwmod_for_each(int (*fn)(struct omap_hwmod *oh, void *data),
2577                         void *data)
2578 {
2579         struct omap_hwmod *temp_oh;
2580         int ret = 0;
2581
2582         if (!fn)
2583                 return -EINVAL;
2584
2585         list_for_each_entry(temp_oh, &omap_hwmod_list, node) {
2586                 ret = (*fn)(temp_oh, data);
2587                 if (ret)
2588                         break;
2589         }
2590
2591         return ret;
2592 }
2593
2594 /**
2595  * omap_hwmod_register_links - register an array of hwmod links
2596  * @ois: pointer to an array of omap_hwmod_ocp_if to register
2597  *
2598  * Intended to be called early in boot before the clock framework is
2599  * initialized.  If @ois is not null, will register all omap_hwmods
2600  * listed in @ois that are valid for this chip.  Returns 0.
2601  */
2602 int __init omap_hwmod_register_links(struct omap_hwmod_ocp_if **ois)
2603 {
2604         int r, i;
2605
2606         if (!ois)
2607                 return 0;
2608
2609         if (!linkspace) {
2610                 if (_alloc_linkspace(ois)) {
2611                         pr_err("omap_hwmod: could not allocate link space\n");
2612                         return -ENOMEM;
2613                 }
2614         }
2615
2616         i = 0;
2617         do {
2618                 r = _register_link(ois[i]);
2619                 WARN(r && r != -EEXIST,
2620                      "omap_hwmod: _register_link(%s -> %s) returned %d\n",
2621                      ois[i]->master->name, ois[i]->slave->name, r);
2622         } while (ois[++i]);
2623
2624         return 0;
2625 }
2626
2627 /**
2628  * _ensure_mpu_hwmod_is_setup - ensure the MPU SS hwmod is init'ed and set up
2629  * @oh: pointer to the hwmod currently being set up (usually not the MPU)
2630  *
2631  * If the hwmod data corresponding to the MPU subsystem IP block
2632  * hasn't been initialized and set up yet, do so now.  This must be
2633  * done first since sleep dependencies may be added from other hwmods
2634  * to the MPU.  Intended to be called only by omap_hwmod_setup*().  No
2635  * return value.
2636  */
2637 static void __init _ensure_mpu_hwmod_is_setup(struct omap_hwmod *oh)
2638 {
2639         if (!mpu_oh || mpu_oh->_state == _HWMOD_STATE_UNKNOWN)
2640                 pr_err("omap_hwmod: %s: MPU initiator hwmod %s not yet registered\n",
2641                        __func__, MPU_INITIATOR_NAME);
2642         else if (mpu_oh->_state == _HWMOD_STATE_REGISTERED && oh != mpu_oh)
2643                 omap_hwmod_setup_one(MPU_INITIATOR_NAME);
2644 }
2645
2646 /**
2647  * omap_hwmod_setup_one - set up a single hwmod
2648  * @oh_name: const char * name of the already-registered hwmod to set up
2649  *
2650  * Initialize and set up a single hwmod.  Intended to be used for a
2651  * small number of early devices, such as the timer IP blocks used for
2652  * the scheduler clock.  Must be called after omap2_clk_init().
2653  * Resolves the struct clk names to struct clk pointers for each
2654  * registered omap_hwmod.  Also calls _setup() on each hwmod.  Returns
2655  * -EINVAL upon error or 0 upon success.
2656  */
2657 int __init omap_hwmod_setup_one(const char *oh_name)
2658 {
2659         struct omap_hwmod *oh;
2660
2661         pr_debug("omap_hwmod: %s: %s\n", oh_name, __func__);
2662
2663         oh = _lookup(oh_name);
2664         if (!oh) {
2665                 WARN(1, "omap_hwmod: %s: hwmod not yet registered\n", oh_name);
2666                 return -EINVAL;
2667         }
2668
2669         _ensure_mpu_hwmod_is_setup(oh);
2670
2671         _init(oh, NULL);
2672         _setup(oh, NULL);
2673
2674         return 0;
2675 }
2676
2677 /**
2678  * omap_hwmod_setup_all - set up all registered IP blocks
2679  *
2680  * Initialize and set up all IP blocks registered with the hwmod code.
2681  * Must be called after omap2_clk_init().  Resolves the struct clk
2682  * names to struct clk pointers for each registered omap_hwmod.  Also
2683  * calls _setup() on each hwmod.  Returns 0 upon success.
2684  */
2685 static int __init omap_hwmod_setup_all(void)
2686 {
2687         _ensure_mpu_hwmod_is_setup(NULL);
2688
2689         omap_hwmod_for_each(_init, NULL);
2690         omap_hwmod_for_each(_setup, NULL);
2691
2692         return 0;
2693 }
2694 core_initcall(omap_hwmod_setup_all);
2695
2696 /**
2697  * omap_hwmod_enable - enable an omap_hwmod
2698  * @oh: struct omap_hwmod *
2699  *
2700  * Enable an omap_hwmod @oh.  Intended to be called by omap_device_enable().
2701  * Returns -EINVAL on error or passes along the return value from _enable().
2702  */
2703 int omap_hwmod_enable(struct omap_hwmod *oh)
2704 {
2705         int r;
2706         unsigned long flags;
2707
2708         if (!oh)
2709                 return -EINVAL;
2710
2711         spin_lock_irqsave(&oh->_lock, flags);
2712         r = _enable(oh);
2713         spin_unlock_irqrestore(&oh->_lock, flags);
2714
2715         return r;
2716 }
2717
2718 /**
2719  * omap_hwmod_idle - idle an omap_hwmod
2720  * @oh: struct omap_hwmod *
2721  *
2722  * Idle an omap_hwmod @oh.  Intended to be called by omap_device_idle().
2723  * Returns -EINVAL on error or passes along the return value from _idle().
2724  */
2725 int omap_hwmod_idle(struct omap_hwmod *oh)
2726 {
2727         unsigned long flags;
2728
2729         if (!oh)
2730                 return -EINVAL;
2731
2732         spin_lock_irqsave(&oh->_lock, flags);
2733         _idle(oh);
2734         spin_unlock_irqrestore(&oh->_lock, flags);
2735
2736         return 0;
2737 }
2738
2739 /**
2740  * omap_hwmod_shutdown - shutdown an omap_hwmod
2741  * @oh: struct omap_hwmod *
2742  *
2743  * Shutdown an omap_hwmod @oh.  Intended to be called by
2744  * omap_device_shutdown().  Returns -EINVAL on error or passes along
2745  * the return value from _shutdown().
2746  */
2747 int omap_hwmod_shutdown(struct omap_hwmod *oh)
2748 {
2749         unsigned long flags;
2750
2751         if (!oh)
2752                 return -EINVAL;
2753
2754         spin_lock_irqsave(&oh->_lock, flags);
2755         _shutdown(oh);
2756         spin_unlock_irqrestore(&oh->_lock, flags);
2757
2758         return 0;
2759 }
2760
2761 /**
2762  * omap_hwmod_enable_clocks - enable main_clk, all interface clocks
2763  * @oh: struct omap_hwmod *oh
2764  *
2765  * Intended to be called by the omap_device code.
2766  */
2767 int omap_hwmod_enable_clocks(struct omap_hwmod *oh)
2768 {
2769         unsigned long flags;
2770
2771         spin_lock_irqsave(&oh->_lock, flags);
2772         _enable_clocks(oh);
2773         spin_unlock_irqrestore(&oh->_lock, flags);
2774
2775         return 0;
2776 }
2777
2778 /**
2779  * omap_hwmod_disable_clocks - disable main_clk, all interface clocks
2780  * @oh: struct omap_hwmod *oh
2781  *
2782  * Intended to be called by the omap_device code.
2783  */
2784 int omap_hwmod_disable_clocks(struct omap_hwmod *oh)
2785 {
2786         unsigned long flags;
2787
2788         spin_lock_irqsave(&oh->_lock, flags);
2789         _disable_clocks(oh);
2790         spin_unlock_irqrestore(&oh->_lock, flags);
2791
2792         return 0;
2793 }
2794
2795 /**
2796  * omap_hwmod_ocp_barrier - wait for posted writes against the hwmod to complete
2797  * @oh: struct omap_hwmod *oh
2798  *
2799  * Intended to be called by drivers and core code when all posted
2800  * writes to a device must complete before continuing further
2801  * execution (for example, after clearing some device IRQSTATUS
2802  * register bits)
2803  *
2804  * XXX what about targets with multiple OCP threads?
2805  */
2806 void omap_hwmod_ocp_barrier(struct omap_hwmod *oh)
2807 {
2808         BUG_ON(!oh);
2809
2810         if (!oh->class->sysc || !oh->class->sysc->sysc_flags) {
2811                 WARN(1, "omap_device: %s: OCP barrier impossible due to device configuration\n",
2812                         oh->name);
2813                 return;
2814         }
2815
2816         /*
2817          * Forces posted writes to complete on the OCP thread handling
2818          * register writes
2819          */
2820         omap_hwmod_read(oh, oh->class->sysc->sysc_offs);
2821 }
2822
2823 /**
2824  * omap_hwmod_reset - reset the hwmod
2825  * @oh: struct omap_hwmod *
2826  *
2827  * Under some conditions, a driver may wish to reset the entire device.
2828  * Called from omap_device code.  Returns -EINVAL on error or passes along
2829  * the return value from _reset().
2830  */
2831 int omap_hwmod_reset(struct omap_hwmod *oh)
2832 {
2833         int r;
2834         unsigned long flags;
2835
2836         if (!oh)
2837                 return -EINVAL;
2838
2839         spin_lock_irqsave(&oh->_lock, flags);
2840         r = _reset(oh);
2841         spin_unlock_irqrestore(&oh->_lock, flags);
2842
2843         return r;
2844 }
2845
2846 /*
2847  * IP block data retrieval functions
2848  */
2849
2850 /**
2851  * omap_hwmod_count_resources - count number of struct resources needed by hwmod
2852  * @oh: struct omap_hwmod *
2853  * @res: pointer to the first element of an array of struct resource to fill
2854  *
2855  * Count the number of struct resource array elements necessary to
2856  * contain omap_hwmod @oh resources.  Intended to be called by code
2857  * that registers omap_devices.  Intended to be used to determine the
2858  * size of a dynamically-allocated struct resource array, before
2859  * calling omap_hwmod_fill_resources().  Returns the number of struct
2860  * resource array elements needed.
2861  *
2862  * XXX This code is not optimized.  It could attempt to merge adjacent
2863  * resource IDs.
2864  *
2865  */
2866 int omap_hwmod_count_resources(struct omap_hwmod *oh)
2867 {
2868         struct omap_hwmod_ocp_if *os;
2869         struct list_head *p;
2870         int ret;
2871         int i = 0;
2872
2873         ret = _count_mpu_irqs(oh) + _count_sdma_reqs(oh);
2874
2875         p = oh->slave_ports.next;
2876
2877         while (i < oh->slaves_cnt) {
2878                 os = _fetch_next_ocp_if(&p, &i);
2879                 ret += _count_ocp_if_addr_spaces(os);
2880         }
2881
2882         return ret;
2883 }
2884
2885 /**
2886  * omap_hwmod_fill_resources - fill struct resource array with hwmod data
2887  * @oh: struct omap_hwmod *
2888  * @res: pointer to the first element of an array of struct resource to fill
2889  *
2890  * Fill the struct resource array @res with resource data from the
2891  * omap_hwmod @oh.  Intended to be called by code that registers
2892  * omap_devices.  See also omap_hwmod_count_resources().  Returns the
2893  * number of array elements filled.
2894  */
2895 int omap_hwmod_fill_resources(struct omap_hwmod *oh, struct resource *res)
2896 {
2897         struct omap_hwmod_ocp_if *os;
2898         struct list_head *p;
2899         int i, j, mpu_irqs_cnt, sdma_reqs_cnt, addr_cnt;
2900         int r = 0;
2901
2902         /* For each IRQ, DMA, memory area, fill in array.*/
2903
2904         mpu_irqs_cnt = _count_mpu_irqs(oh);
2905         for (i = 0; i < mpu_irqs_cnt; i++) {
2906                 (res + r)->name = (oh->mpu_irqs + i)->name;
2907                 (res + r)->start = (oh->mpu_irqs + i)->irq;
2908                 (res + r)->end = (oh->mpu_irqs + i)->irq;
2909                 (res + r)->flags = IORESOURCE_IRQ;
2910                 r++;
2911         }
2912
2913         sdma_reqs_cnt = _count_sdma_reqs(oh);
2914         for (i = 0; i < sdma_reqs_cnt; i++) {
2915                 (res + r)->name = (oh->sdma_reqs + i)->name;
2916                 (res + r)->start = (oh->sdma_reqs + i)->dma_req;
2917                 (res + r)->end = (oh->sdma_reqs + i)->dma_req;
2918                 (res + r)->flags = IORESOURCE_DMA;
2919                 r++;
2920         }
2921
2922         p = oh->slave_ports.next;
2923
2924         i = 0;
2925         while (i < oh->slaves_cnt) {
2926                 os = _fetch_next_ocp_if(&p, &i);
2927                 addr_cnt = _count_ocp_if_addr_spaces(os);
2928
2929                 for (j = 0; j < addr_cnt; j++) {
2930                         (res + r)->name = (os->addr + j)->name;
2931                         (res + r)->start = (os->addr + j)->pa_start;
2932                         (res + r)->end = (os->addr + j)->pa_end;
2933                         (res + r)->flags = IORESOURCE_MEM;
2934                         r++;
2935                 }
2936         }
2937
2938         return r;
2939 }
2940
2941 /**
2942  * omap_hwmod_get_resource_byname - fetch IP block integration data by name
2943  * @oh: struct omap_hwmod * to operate on
2944  * @type: one of the IORESOURCE_* constants from include/linux/ioport.h
2945  * @name: pointer to the name of the data to fetch (optional)
2946  * @rsrc: pointer to a struct resource, allocated by the caller
2947  *
2948  * Retrieve MPU IRQ, SDMA request line, or address space start/end
2949  * data for the IP block pointed to by @oh.  The data will be filled
2950  * into a struct resource record pointed to by @rsrc.  The struct
2951  * resource must be allocated by the caller.  When @name is non-null,
2952  * the data associated with the matching entry in the IRQ/SDMA/address
2953  * space hwmod data arrays will be returned.  If @name is null, the
2954  * first array entry will be returned.  Data order is not meaningful
2955  * in hwmod data, so callers are strongly encouraged to use a non-null
2956  * @name whenever possible to avoid unpredictable effects if hwmod
2957  * data is later added that causes data ordering to change.  This
2958  * function is only intended for use by OMAP core code.  Device
2959  * drivers should not call this function - the appropriate bus-related
2960  * data accessor functions should be used instead.  Returns 0 upon
2961  * success or a negative error code upon error.
2962  */
2963 int omap_hwmod_get_resource_byname(struct omap_hwmod *oh, unsigned int type,
2964                                    const char *name, struct resource *rsrc)
2965 {
2966         int r;
2967         unsigned int irq, dma;
2968         u32 pa_start, pa_end;
2969
2970         if (!oh || !rsrc)
2971                 return -EINVAL;
2972
2973         if (type == IORESOURCE_IRQ) {
2974                 r = _get_mpu_irq_by_name(oh, name, &irq);
2975                 if (r)
2976                         return r;
2977
2978                 rsrc->start = irq;
2979                 rsrc->end = irq;
2980         } else if (type == IORESOURCE_DMA) {
2981                 r = _get_sdma_req_by_name(oh, name, &dma);
2982                 if (r)
2983                         return r;
2984
2985                 rsrc->start = dma;
2986                 rsrc->end = dma;
2987         } else if (type == IORESOURCE_MEM) {
2988                 r = _get_addr_space_by_name(oh, name, &pa_start, &pa_end);
2989                 if (r)
2990                         return r;
2991
2992                 rsrc->start = pa_start;
2993                 rsrc->end = pa_end;
2994         } else {
2995                 return -EINVAL;
2996         }
2997
2998         rsrc->flags = type;
2999         rsrc->name = name;
3000
3001         return 0;
3002 }
3003
3004 /**
3005  * omap_hwmod_get_pwrdm - return pointer to this module's main powerdomain
3006  * @oh: struct omap_hwmod *
3007  *
3008  * Return the powerdomain pointer associated with the OMAP module
3009  * @oh's main clock.  If @oh does not have a main clk, return the
3010  * powerdomain associated with the interface clock associated with the
3011  * module's MPU port. (XXX Perhaps this should use the SDMA port
3012  * instead?)  Returns NULL on error, or a struct powerdomain * on
3013  * success.
3014  */
3015 struct powerdomain *omap_hwmod_get_pwrdm(struct omap_hwmod *oh)
3016 {
3017         struct clk *c;
3018         struct omap_hwmod_ocp_if *oi;
3019
3020         if (!oh)
3021                 return NULL;
3022
3023         if (oh->_clk) {
3024                 c = oh->_clk;
3025         } else {
3026                 oi = _find_mpu_rt_port(oh);
3027                 if (!oi)
3028                         return NULL;
3029                 c = oi->_clk;
3030         }
3031
3032         if (!c->clkdm)
3033                 return NULL;
3034
3035         return c->clkdm->pwrdm.ptr;
3036
3037 }
3038
3039 /**
3040  * omap_hwmod_get_mpu_rt_va - return the module's base address (for the MPU)
3041  * @oh: struct omap_hwmod *
3042  *
3043  * Returns the virtual address corresponding to the beginning of the
3044  * module's register target, in the address range that is intended to
3045  * be used by the MPU.  Returns the virtual address upon success or NULL
3046  * upon error.
3047  */
3048 void __iomem *omap_hwmod_get_mpu_rt_va(struct omap_hwmod *oh)
3049 {
3050         if (!oh)
3051                 return NULL;
3052
3053         if (oh->_int_flags & _HWMOD_NO_MPU_PORT)
3054                 return NULL;
3055
3056         if (oh->_state == _HWMOD_STATE_UNKNOWN)
3057                 return NULL;
3058
3059         return oh->_mpu_rt_va;
3060 }
3061
3062 /**
3063  * omap_hwmod_add_initiator_dep - add sleepdep from @init_oh to @oh
3064  * @oh: struct omap_hwmod *
3065  * @init_oh: struct omap_hwmod * (initiator)
3066  *
3067  * Add a sleep dependency between the initiator @init_oh and @oh.
3068  * Intended to be called by DSP/Bridge code via platform_data for the
3069  * DSP case; and by the DMA code in the sDMA case.  DMA code, *Bridge
3070  * code needs to add/del initiator dependencies dynamically
3071  * before/after accessing a device.  Returns the return value from
3072  * _add_initiator_dep().
3073  *
3074  * XXX Keep a usecount in the clockdomain code
3075  */
3076 int omap_hwmod_add_initiator_dep(struct omap_hwmod *oh,
3077                                  struct omap_hwmod *init_oh)
3078 {
3079         return _add_initiator_dep(oh, init_oh);
3080 }
3081
3082 /*
3083  * XXX what about functions for drivers to save/restore ocp_sysconfig
3084  * for context save/restore operations?
3085  */
3086
3087 /**
3088  * omap_hwmod_del_initiator_dep - remove sleepdep from @init_oh to @oh
3089  * @oh: struct omap_hwmod *
3090  * @init_oh: struct omap_hwmod * (initiator)
3091  *
3092  * Remove a sleep dependency between the initiator @init_oh and @oh.
3093  * Intended to be called by DSP/Bridge code via platform_data for the
3094  * DSP case; and by the DMA code in the sDMA case.  DMA code, *Bridge
3095  * code needs to add/del initiator dependencies dynamically
3096  * before/after accessing a device.  Returns the return value from
3097  * _del_initiator_dep().
3098  *
3099  * XXX Keep a usecount in the clockdomain code
3100  */
3101 int omap_hwmod_del_initiator_dep(struct omap_hwmod *oh,
3102                                  struct omap_hwmod *init_oh)
3103 {
3104         return _del_initiator_dep(oh, init_oh);
3105 }
3106
3107 /**
3108  * omap_hwmod_enable_wakeup - allow device to wake up the system
3109  * @oh: struct omap_hwmod *
3110  *
3111  * Sets the module OCP socket ENAWAKEUP bit to allow the module to
3112  * send wakeups to the PRCM, and enable I/O ring wakeup events for
3113  * this IP block if it has dynamic mux entries.  Eventually this
3114  * should set PRCM wakeup registers to cause the PRCM to receive
3115  * wakeup events from the module.  Does not set any wakeup routing
3116  * registers beyond this point - if the module is to wake up any other
3117  * module or subsystem, that must be set separately.  Called by
3118  * omap_device code.  Returns -EINVAL on error or 0 upon success.
3119  */
3120 int omap_hwmod_enable_wakeup(struct omap_hwmod *oh)
3121 {
3122         unsigned long flags;
3123         u32 v;
3124
3125         spin_lock_irqsave(&oh->_lock, flags);
3126
3127         if (oh->class->sysc &&
3128             (oh->class->sysc->sysc_flags & SYSC_HAS_ENAWAKEUP)) {
3129                 v = oh->_sysc_cache;
3130                 _enable_wakeup(oh, &v);
3131                 _write_sysconfig(v, oh);
3132         }
3133
3134         _set_idle_ioring_wakeup(oh, true);
3135         spin_unlock_irqrestore(&oh->_lock, flags);
3136
3137         return 0;
3138 }
3139
3140 /**
3141  * omap_hwmod_disable_wakeup - prevent device from waking the system
3142  * @oh: struct omap_hwmod *
3143  *
3144  * Clears the module OCP socket ENAWAKEUP bit to prevent the module
3145  * from sending wakeups to the PRCM, and disable I/O ring wakeup
3146  * events for this IP block if it has dynamic mux entries.  Eventually
3147  * this should clear PRCM wakeup registers to cause the PRCM to ignore
3148  * wakeup events from the module.  Does not set any wakeup routing
3149  * registers beyond this point - if the module is to wake up any other
3150  * module or subsystem, that must be set separately.  Called by
3151  * omap_device code.  Returns -EINVAL on error or 0 upon success.
3152  */
3153 int omap_hwmod_disable_wakeup(struct omap_hwmod *oh)
3154 {
3155         unsigned long flags;
3156         u32 v;
3157
3158         spin_lock_irqsave(&oh->_lock, flags);
3159
3160         if (oh->class->sysc &&
3161             (oh->class->sysc->sysc_flags & SYSC_HAS_ENAWAKEUP)) {
3162                 v = oh->_sysc_cache;
3163                 _disable_wakeup(oh, &v);
3164                 _write_sysconfig(v, oh);
3165         }
3166
3167         _set_idle_ioring_wakeup(oh, false);
3168         spin_unlock_irqrestore(&oh->_lock, flags);
3169
3170         return 0;
3171 }
3172
3173 /**
3174  * omap_hwmod_assert_hardreset - assert the HW reset line of submodules
3175  * contained in the hwmod module.
3176  * @oh: struct omap_hwmod *
3177  * @name: name of the reset line to lookup and assert
3178  *
3179  * Some IP like dsp, ipu or iva contain processor that require
3180  * an HW reset line to be assert / deassert in order to enable fully
3181  * the IP.  Returns -EINVAL if @oh is null or if the operation is not
3182  * yet supported on this OMAP; otherwise, passes along the return value
3183  * from _assert_hardreset().
3184  */
3185 int omap_hwmod_assert_hardreset(struct omap_hwmod *oh, const char *name)
3186 {
3187         int ret;
3188         unsigned long flags;
3189
3190         if (!oh)
3191                 return -EINVAL;
3192
3193         spin_lock_irqsave(&oh->_lock, flags);
3194         ret = _assert_hardreset(oh, name);
3195         spin_unlock_irqrestore(&oh->_lock, flags);
3196
3197         return ret;
3198 }
3199
3200 /**
3201  * omap_hwmod_deassert_hardreset - deassert the HW reset line of submodules
3202  * contained in the hwmod module.
3203  * @oh: struct omap_hwmod *
3204  * @name: name of the reset line to look up and deassert
3205  *
3206  * Some IP like dsp, ipu or iva contain processor that require
3207  * an HW reset line to be assert / deassert in order to enable fully
3208  * the IP.  Returns -EINVAL if @oh is null or if the operation is not
3209  * yet supported on this OMAP; otherwise, passes along the return value
3210  * from _deassert_hardreset().
3211  */
3212 int omap_hwmod_deassert_hardreset(struct omap_hwmod *oh, const char *name)
3213 {
3214         int ret;
3215         unsigned long flags;
3216
3217         if (!oh)
3218                 return -EINVAL;
3219
3220         spin_lock_irqsave(&oh->_lock, flags);
3221         ret = _deassert_hardreset(oh, name);
3222         spin_unlock_irqrestore(&oh->_lock, flags);
3223
3224         return ret;
3225 }
3226
3227 /**
3228  * omap_hwmod_read_hardreset - read the HW reset line state of submodules
3229  * contained in the hwmod module
3230  * @oh: struct omap_hwmod *
3231  * @name: name of the reset line to look up and read
3232  *
3233  * Return the current state of the hwmod @oh's reset line named @name:
3234  * returns -EINVAL upon parameter error or if this operation
3235  * is unsupported on the current OMAP; otherwise, passes along the return
3236  * value from _read_hardreset().
3237  */
3238 int omap_hwmod_read_hardreset(struct omap_hwmod *oh, const char *name)
3239 {
3240         int ret;
3241         unsigned long flags;
3242
3243         if (!oh)
3244                 return -EINVAL;
3245
3246         spin_lock_irqsave(&oh->_lock, flags);
3247         ret = _read_hardreset(oh, name);
3248         spin_unlock_irqrestore(&oh->_lock, flags);
3249
3250         return ret;
3251 }
3252
3253
3254 /**
3255  * omap_hwmod_for_each_by_class - call @fn for each hwmod of class @classname
3256  * @classname: struct omap_hwmod_class name to search for
3257  * @fn: callback function pointer to call for each hwmod in class @classname
3258  * @user: arbitrary context data to pass to the callback function
3259  *
3260  * For each omap_hwmod of class @classname, call @fn.
3261  * If the callback function returns something other than
3262  * zero, the iterator is terminated, and the callback function's return
3263  * value is passed back to the caller.  Returns 0 upon success, -EINVAL
3264  * if @classname or @fn are NULL, or passes back the error code from @fn.
3265  */
3266 int omap_hwmod_for_each_by_class(const char *classname,
3267                                  int (*fn)(struct omap_hwmod *oh,
3268                                            void *user),
3269                                  void *user)
3270 {
3271         struct omap_hwmod *temp_oh;
3272         int ret = 0;
3273
3274         if (!classname || !fn)
3275                 return -EINVAL;
3276
3277         pr_debug("omap_hwmod: %s: looking for modules of class %s\n",
3278                  __func__, classname);
3279
3280         list_for_each_entry(temp_oh, &omap_hwmod_list, node) {
3281                 if (!strcmp(temp_oh->class->name, classname)) {
3282                         pr_debug("omap_hwmod: %s: %s: calling callback fn\n",
3283                                  __func__, temp_oh->name);
3284                         ret = (*fn)(temp_oh, user);
3285                         if (ret)
3286                                 break;
3287                 }
3288         }
3289
3290         if (ret)
3291                 pr_debug("omap_hwmod: %s: iterator terminated early: %d\n",
3292                          __func__, ret);
3293
3294         return ret;
3295 }
3296
3297 /**
3298  * omap_hwmod_set_postsetup_state - set the post-_setup() state for this hwmod
3299  * @oh: struct omap_hwmod *
3300  * @state: state that _setup() should leave the hwmod in
3301  *
3302  * Sets the hwmod state that @oh will enter at the end of _setup()
3303  * (called by omap_hwmod_setup_*()).  See also the documentation
3304  * for _setup_postsetup(), above.  Returns 0 upon success or
3305  * -EINVAL if there is a problem with the arguments or if the hwmod is
3306  * in the wrong state.
3307  */
3308 int omap_hwmod_set_postsetup_state(struct omap_hwmod *oh, u8 state)
3309 {
3310         int ret;
3311         unsigned long flags;
3312
3313         if (!oh)
3314                 return -EINVAL;
3315
3316         if (state != _HWMOD_STATE_DISABLED &&
3317             state != _HWMOD_STATE_ENABLED &&
3318             state != _HWMOD_STATE_IDLE)
3319                 return -EINVAL;
3320
3321         spin_lock_irqsave(&oh->_lock, flags);
3322
3323         if (oh->_state != _HWMOD_STATE_REGISTERED) {
3324                 ret = -EINVAL;
3325                 goto ohsps_unlock;
3326         }
3327
3328         oh->_postsetup_state = state;
3329         ret = 0;
3330
3331 ohsps_unlock:
3332         spin_unlock_irqrestore(&oh->_lock, flags);
3333
3334         return ret;
3335 }
3336
3337 /**
3338  * omap_hwmod_get_context_loss_count - get lost context count
3339  * @oh: struct omap_hwmod *
3340  *
3341  * Query the powerdomain of of @oh to get the context loss
3342  * count for this device.
3343  *
3344  * Returns the context loss count of the powerdomain assocated with @oh
3345  * upon success, or zero if no powerdomain exists for @oh.
3346  */
3347 int omap_hwmod_get_context_loss_count(struct omap_hwmod *oh)
3348 {
3349         struct powerdomain *pwrdm;
3350         int ret = 0;
3351
3352         pwrdm = omap_hwmod_get_pwrdm(oh);
3353         if (pwrdm)
3354                 ret = pwrdm_get_context_loss_count(pwrdm);
3355
3356         return ret;
3357 }
3358
3359 /**
3360  * omap_hwmod_no_setup_reset - prevent a hwmod from being reset upon setup
3361  * @oh: struct omap_hwmod *
3362  *
3363  * Prevent the hwmod @oh from being reset during the setup process.
3364  * Intended for use by board-*.c files on boards with devices that
3365  * cannot tolerate being reset.  Must be called before the hwmod has
3366  * been set up.  Returns 0 upon success or negative error code upon
3367  * failure.
3368  */
3369 int omap_hwmod_no_setup_reset(struct omap_hwmod *oh)
3370 {
3371         if (!oh)
3372                 return -EINVAL;
3373
3374         if (oh->_state != _HWMOD_STATE_REGISTERED) {
3375                 pr_err("omap_hwmod: %s: cannot prevent setup reset; in wrong state\n",
3376                         oh->name);
3377                 return -EINVAL;
3378         }
3379
3380         oh->flags |= HWMOD_INIT_NO_RESET;
3381
3382         return 0;
3383 }
3384
3385 /**
3386  * omap_hwmod_pad_route_irq - route an I/O pad wakeup to a particular MPU IRQ
3387  * @oh: struct omap_hwmod * containing hwmod mux entries
3388  * @pad_idx: array index in oh->mux of the hwmod mux entry to route wakeup
3389  * @irq_idx: the hwmod mpu_irqs array index of the IRQ to trigger on wakeup
3390  *
3391  * When an I/O pad wakeup arrives for the dynamic or wakeup hwmod mux
3392  * entry number @pad_idx for the hwmod @oh, trigger the interrupt
3393  * service routine for the hwmod's mpu_irqs array index @irq_idx.  If
3394  * this function is not called for a given pad_idx, then the ISR
3395  * associated with @oh's first MPU IRQ will be triggered when an I/O
3396  * pad wakeup occurs on that pad.  Note that @pad_idx is the index of
3397  * the _dynamic or wakeup_ entry: if there are other entries not
3398  * marked with OMAP_DEVICE_PAD_WAKEUP or OMAP_DEVICE_PAD_REMUX, these
3399  * entries are NOT COUNTED in the dynamic pad index.  This function
3400  * must be called separately for each pad that requires its interrupt
3401  * to be re-routed this way.  Returns -EINVAL if there is an argument
3402  * problem or if @oh does not have hwmod mux entries or MPU IRQs;
3403  * returns -ENOMEM if memory cannot be allocated; or 0 upon success.
3404  *
3405  * XXX This function interface is fragile.  Rather than using array
3406  * indexes, which are subject to unpredictable change, it should be
3407  * using hwmod IRQ names, and some other stable key for the hwmod mux
3408  * pad records.
3409  */
3410 int omap_hwmod_pad_route_irq(struct omap_hwmod *oh, int pad_idx, int irq_idx)
3411 {
3412         int nr_irqs;
3413
3414         might_sleep();
3415
3416         if (!oh || !oh->mux || !oh->mpu_irqs || pad_idx < 0 ||
3417             pad_idx >= oh->mux->nr_pads_dynamic)
3418                 return -EINVAL;
3419
3420         /* Check the number of available mpu_irqs */
3421         for (nr_irqs = 0; oh->mpu_irqs[nr_irqs].irq >= 0; nr_irqs++)
3422                 ;
3423
3424         if (irq_idx >= nr_irqs)
3425                 return -EINVAL;
3426
3427         if (!oh->mux->irqs) {
3428                 /* XXX What frees this? */
3429                 oh->mux->irqs = kzalloc(sizeof(int) * oh->mux->nr_pads_dynamic,
3430                         GFP_KERNEL);
3431                 if (!oh->mux->irqs)
3432                         return -ENOMEM;
3433         }
3434         oh->mux->irqs[pad_idx] = irq_idx;
3435
3436         return 0;
3437 }