Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
omap_hwmod.c
Go to the documentation of this file.
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 <plat/clock.h>
143 #include <plat/omap_hwmod.h>
144 #include <plat/prcm.h>
145 
146 #include "soc.h"
147 #include "common.h"
148 #include "clockdomain.h"
149 #include "powerdomain.h"
150 #include "cm2xxx_3xxx.h"
151 #include "cminst44xx.h"
152 #include "cm33xx.h"
153 #include "prm2xxx_3xxx.h"
154 #include "prm44xx.h"
155 #include "prm33xx.h"
156 #include "prminst44xx.h"
157 #include "mux.h"
158 #include "pm.h"
159 
160 /* Maximum microseconds to wait for OMAP module to softreset */
161 #define MAX_MODULE_SOFTRESET_WAIT 10000
162 
163 /* Name of the OMAP hwmod for the MPU */
164 #define MPU_INITIATOR_NAME "mpu"
165 
166 /*
167  * Number of struct omap_hwmod_link records per struct
168  * omap_hwmod_ocp_if record (master->slave and slave->master)
169  */
170 #define LINKS_PER_OCP_IF 2
171 
182  void (*enable_module)(struct omap_hwmod *oh);
183  int (*disable_module)(struct omap_hwmod *oh);
186  struct omap_hwmod_rst_info *ohri);
188  struct omap_hwmod_rst_info *ohri);
190  struct omap_hwmod_rst_info *ohri);
191  int (*init_clkdm)(struct omap_hwmod *oh);
192 };
193 
194 /* soc_ops: adapts the omap_hwmod code to the currently-booted SoC */
195 static struct omap_hwmod_soc_ops soc_ops;
196 
197 /* omap_hwmod_list contains all registered struct omap_hwmods */
198 static LIST_HEAD(omap_hwmod_list);
199 
200 /* mpu_oh: used to add/remove MPU initiator from sleepdep list */
201 static struct omap_hwmod *mpu_oh;
202 
203 /* io_chain_lock: used to serialize reconfigurations of the I/O chain */
204 static DEFINE_SPINLOCK(io_chain_lock);
205 
206 /*
207  * linkspace: ptr to a buffer that struct omap_hwmod_link records are
208  * allocated from - used to reduce the number of small memory
209  * allocations, which has a significant impact on performance
210  */
211 static struct omap_hwmod_link *linkspace;
212 
213 /*
214  * free_ls, max_ls: array indexes into linkspace; representing the
215  * next free struct omap_hwmod_link index, and the maximum number of
216  * struct omap_hwmod_link records allocated (respectively)
217  */
218 static unsigned short free_ls, max_ls, ls_supp;
219 
220 /* inited: set to true once the hwmod code is initialized */
221 static bool inited;
222 
223 /* Private functions */
224 
235 static struct omap_hwmod_ocp_if *_fetch_next_ocp_if(struct list_head **p,
236  int *i)
237 {
238  struct omap_hwmod_ocp_if *oi;
239 
240  oi = list_entry(*p, struct omap_hwmod_link, node)->ocp_if;
241  *p = (*p)->next;
242 
243  *i = *i + 1;
244 
245  return oi;
246 }
247 
256 static int _update_sysc_cache(struct omap_hwmod *oh)
257 {
258  if (!oh->class->sysc) {
259  WARN(1, "omap_hwmod: %s: cannot read OCP_SYSCONFIG: not defined on hwmod's class\n", oh->name);
260  return -EINVAL;
261  }
262 
263  /* XXX ensure module interface clock is up */
264 
265  oh->_sysc_cache = omap_hwmod_read(oh, oh->class->sysc->sysc_offs);
266 
267  if (!(oh->class->sysc->sysc_flags & SYSC_NO_CACHE))
269 
270  return 0;
271 }
272 
281 static void _write_sysconfig(u32 v, struct omap_hwmod *oh)
282 {
283  if (!oh->class->sysc) {
284  WARN(1, "omap_hwmod: %s: cannot write OCP_SYSCONFIG: not defined on hwmod's class\n", oh->name);
285  return;
286  }
287 
288  /* XXX ensure module interface clock is up */
289 
290  /* Module might have lost context, always update cache and register */
291  oh->_sysc_cache = v;
292  omap_hwmod_write(v, oh, oh->class->sysc->sysc_offs);
293 }
294 
305 static int _set_master_standbymode(struct omap_hwmod *oh, u8 standbymode,
306  u32 *v)
307 {
308  u32 mstandby_mask;
309  u8 mstandby_shift;
310 
311  if (!oh->class->sysc ||
312  !(oh->class->sysc->sysc_flags & SYSC_HAS_MIDLEMODE))
313  return -EINVAL;
314 
315  if (!oh->class->sysc->sysc_fields) {
316  WARN(1, "omap_hwmod: %s: offset struct for sysconfig not provided in class\n", oh->name);
317  return -EINVAL;
318  }
319 
320  mstandby_shift = oh->class->sysc->sysc_fields->midle_shift;
321  mstandby_mask = (0x3 << mstandby_shift);
322 
323  *v &= ~mstandby_mask;
324  *v |= __ffs(standbymode) << mstandby_shift;
325 
326  return 0;
327 }
328 
339 static int _set_slave_idlemode(struct omap_hwmod *oh, u8 idlemode, u32 *v)
340 {
341  u32 sidle_mask;
342  u8 sidle_shift;
343 
344  if (!oh->class->sysc ||
345  !(oh->class->sysc->sysc_flags & SYSC_HAS_SIDLEMODE))
346  return -EINVAL;
347 
348  if (!oh->class->sysc->sysc_fields) {
349  WARN(1, "omap_hwmod: %s: offset struct for sysconfig not provided in class\n", oh->name);
350  return -EINVAL;
351  }
352 
353  sidle_shift = oh->class->sysc->sysc_fields->sidle_shift;
354  sidle_mask = (0x3 << sidle_shift);
355 
356  *v &= ~sidle_mask;
357  *v |= __ffs(idlemode) << sidle_shift;
358 
359  return 0;
360 }
361 
373 static int _set_clockactivity(struct omap_hwmod *oh, u8 clockact, u32 *v)
374 {
375  u32 clkact_mask;
376  u8 clkact_shift;
377 
378  if (!oh->class->sysc ||
379  !(oh->class->sysc->sysc_flags & SYSC_HAS_CLOCKACTIVITY))
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  clkact_shift = oh->class->sysc->sysc_fields->clkact_shift;
388  clkact_mask = (0x3 << clkact_shift);
389 
390  *v &= ~clkact_mask;
391  *v |= clockact << clkact_shift;
392 
393  return 0;
394 }
395 
404 static int _set_softreset(struct omap_hwmod *oh, u32 *v)
405 {
406  u32 softrst_mask;
407 
408  if (!oh->class->sysc ||
409  !(oh->class->sysc->sysc_flags & SYSC_HAS_SOFTRESET))
410  return -EINVAL;
411 
412  if (!oh->class->sysc->sysc_fields) {
413  WARN(1, "omap_hwmod: %s: offset struct for sysconfig not provided in class\n", oh->name);
414  return -EINVAL;
415  }
416 
417  softrst_mask = (0x1 << oh->class->sysc->sysc_fields->srst_shift);
418 
419  *v |= softrst_mask;
420 
421  return 0;
422 }
423 
434 static int _wait_softreset_complete(struct omap_hwmod *oh)
435 {
436  struct omap_hwmod_class_sysconfig *sysc;
437  u32 softrst_mask;
438  int c = 0;
439 
440  sysc = oh->class->sysc;
441 
442  if (sysc->sysc_flags & SYSS_HAS_RESET_STATUS)
443  omap_test_timeout((omap_hwmod_read(oh, sysc->syss_offs)
446  else if (sysc->sysc_flags & SYSC_HAS_RESET_STATUS) {
447  softrst_mask = (0x1 << sysc->sysc_fields->srst_shift);
448  omap_test_timeout(!(omap_hwmod_read(oh, sysc->sysc_offs)
449  & softrst_mask),
451  }
452 
453  return c;
454 }
455 
468 static int _set_dmadisable(struct omap_hwmod *oh)
469 {
470  u32 v;
471  u32 dmadisable_mask;
472 
473  if (!oh->class->sysc ||
474  !(oh->class->sysc->sysc_flags & SYSC_HAS_DMADISABLE))
475  return -EINVAL;
476 
477  if (!oh->class->sysc->sysc_fields) {
478  WARN(1, "omap_hwmod: %s: offset struct for sysconfig not provided in class\n", oh->name);
479  return -EINVAL;
480  }
481 
482  /* clocks must be on for this operation */
483  if (oh->_state != _HWMOD_STATE_ENABLED) {
484  pr_warn("omap_hwmod: %s: dma can be disabled only from enabled state\n", oh->name);
485  return -EINVAL;
486  }
487 
488  pr_debug("omap_hwmod: %s: setting DMADISABLE\n", oh->name);
489 
490  v = oh->_sysc_cache;
491  dmadisable_mask =
492  (0x1 << oh->class->sysc->sysc_fields->dmadisable_shift);
493  v |= dmadisable_mask;
494  _write_sysconfig(v, oh);
495 
496  return 0;
497 }
498 
512 static int _set_module_autoidle(struct omap_hwmod *oh, u8 autoidle,
513  u32 *v)
514 {
515  u32 autoidle_mask;
516  u8 autoidle_shift;
517 
518  if (!oh->class->sysc ||
519  !(oh->class->sysc->sysc_flags & SYSC_HAS_AUTOIDLE))
520  return -EINVAL;
521 
522  if (!oh->class->sysc->sysc_fields) {
523  WARN(1, "omap_hwmod: %s: offset struct for sysconfig not provided in class\n", oh->name);
524  return -EINVAL;
525  }
526 
527  autoidle_shift = oh->class->sysc->sysc_fields->autoidle_shift;
528  autoidle_mask = (0x1 << autoidle_shift);
529 
530  *v &= ~autoidle_mask;
531  *v |= autoidle << autoidle_shift;
532 
533  return 0;
534 }
535 
550 static void _set_idle_ioring_wakeup(struct omap_hwmod *oh, bool set_wake)
551 {
552  struct omap_device_pad *pad;
553  bool change = false;
554  u16 prev_idle;
555  int j;
556 
557  if (!oh->mux || !oh->mux->enabled)
558  return;
559 
560  for (j = 0; j < oh->mux->nr_pads_dynamic; j++) {
561  pad = oh->mux->pads_dynamic[j];
562 
563  if (!(pad->flags & OMAP_DEVICE_PAD_WAKEUP))
564  continue;
565 
566  prev_idle = pad->idle;
567 
568  if (set_wake)
569  pad->idle |= OMAP_WAKEUP_EN;
570  else
571  pad->idle &= ~OMAP_WAKEUP_EN;
572 
573  if (prev_idle != pad->idle)
574  change = true;
575  }
576 
577  if (change && oh->_state == _HWMOD_STATE_IDLE)
578  omap_hwmod_mux(oh->mux, _HWMOD_STATE_IDLE);
579 }
580 
588 static int _enable_wakeup(struct omap_hwmod *oh, u32 *v)
589 {
590  if (!oh->class->sysc ||
591  !((oh->class->sysc->sysc_flags & SYSC_HAS_ENAWAKEUP) ||
592  (oh->class->sysc->idlemodes & SIDLE_SMART_WKUP) ||
593  (oh->class->sysc->idlemodes & MSTANDBY_SMART_WKUP)))
594  return -EINVAL;
595 
596  if (!oh->class->sysc->sysc_fields) {
597  WARN(1, "omap_hwmod: %s: offset struct for sysconfig not provided in class\n", oh->name);
598  return -EINVAL;
599  }
600 
601  if (oh->class->sysc->sysc_flags & SYSC_HAS_ENAWAKEUP)
602  *v |= 0x1 << oh->class->sysc->sysc_fields->enwkup_shift;
603 
604  if (oh->class->sysc->idlemodes & SIDLE_SMART_WKUP)
605  _set_slave_idlemode(oh, HWMOD_IDLEMODE_SMART_WKUP, v);
606  if (oh->class->sysc->idlemodes & MSTANDBY_SMART_WKUP)
607  _set_master_standbymode(oh, HWMOD_IDLEMODE_SMART_WKUP, v);
608 
609  /* XXX test pwrdm_get_wken for this hwmod's subsystem */
610 
612 
613  return 0;
614 }
615 
623 static int _disable_wakeup(struct omap_hwmod *oh, u32 *v)
624 {
625  if (!oh->class->sysc ||
626  !((oh->class->sysc->sysc_flags & SYSC_HAS_ENAWAKEUP) ||
627  (oh->class->sysc->idlemodes & SIDLE_SMART_WKUP) ||
628  (oh->class->sysc->idlemodes & MSTANDBY_SMART_WKUP)))
629  return -EINVAL;
630 
631  if (!oh->class->sysc->sysc_fields) {
632  WARN(1, "omap_hwmod: %s: offset struct for sysconfig not provided in class\n", oh->name);
633  return -EINVAL;
634  }
635 
636  if (oh->class->sysc->sysc_flags & SYSC_HAS_ENAWAKEUP)
637  *v &= ~(0x1 << oh->class->sysc->sysc_fields->enwkup_shift);
638 
639  if (oh->class->sysc->idlemodes & SIDLE_SMART_WKUP)
640  _set_slave_idlemode(oh, HWMOD_IDLEMODE_SMART, v);
641  if (oh->class->sysc->idlemodes & MSTANDBY_SMART_WKUP)
642  _set_master_standbymode(oh, HWMOD_IDLEMODE_SMART, v);
643 
644  /* XXX test pwrdm_get_wken for this hwmod's subsystem */
645 
647 
648  return 0;
649 }
650 
664 static int _add_initiator_dep(struct omap_hwmod *oh, struct omap_hwmod *init_oh)
665 {
666  if (!oh->_clk)
667  return -EINVAL;
668 
669  if (oh->_clk->clkdm && oh->_clk->clkdm->flags & CLKDM_NO_AUTODEPS)
670  return 0;
671 
672  return clkdm_add_sleepdep(oh->_clk->clkdm, init_oh->_clk->clkdm);
673 }
674 
688 static int _del_initiator_dep(struct omap_hwmod *oh, struct omap_hwmod *init_oh)
689 {
690  if (!oh->_clk)
691  return -EINVAL;
692 
693  if (oh->_clk->clkdm && oh->_clk->clkdm->flags & CLKDM_NO_AUTODEPS)
694  return 0;
695 
696  return clkdm_del_sleepdep(oh->_clk->clkdm, init_oh->_clk->clkdm);
697 }
698 
707 static int _init_main_clk(struct omap_hwmod *oh)
708 {
709  int ret = 0;
710 
711  if (!oh->main_clk)
712  return 0;
713 
714  oh->_clk = clk_get(NULL, oh->main_clk);
715  if (IS_ERR(oh->_clk)) {
716  pr_warning("omap_hwmod: %s: cannot clk_get main_clk %s\n",
717  oh->name, oh->main_clk);
718  return -EINVAL;
719  }
720  /*
721  * HACK: This needs a re-visit once clk_prepare() is implemented
722  * to do something meaningful. Today its just a no-op.
723  * If clk_prepare() is used at some point to do things like
724  * voltage scaling etc, then this would have to be moved to
725  * some point where subsystems like i2c and pmic become
726  * available.
727  */
728  clk_prepare(oh->_clk);
729 
730  if (!oh->_clk->clkdm)
731  pr_debug("omap_hwmod: %s: missing clockdomain for %s.\n",
732  oh->name, oh->main_clk);
733 
734  return ret;
735 }
736 
744 static int _init_interface_clks(struct omap_hwmod *oh)
745 {
746  struct omap_hwmod_ocp_if *os;
747  struct list_head *p;
748  struct clk *c;
749  int i = 0;
750  int ret = 0;
751 
752  p = oh->slave_ports.next;
753 
754  while (i < oh->slaves_cnt) {
755  os = _fetch_next_ocp_if(&p, &i);
756  if (!os->clk)
757  continue;
758 
759  c = clk_get(NULL, os->clk);
760  if (IS_ERR(c)) {
761  pr_warning("omap_hwmod: %s: cannot clk_get interface_clk %s\n",
762  oh->name, os->clk);
763  ret = -EINVAL;
764  }
765  os->_clk = c;
766  /*
767  * HACK: This needs a re-visit once clk_prepare() is implemented
768  * to do something meaningful. Today its just a no-op.
769  * If clk_prepare() is used at some point to do things like
770  * voltage scaling etc, then this would have to be moved to
771  * some point where subsystems like i2c and pmic become
772  * available.
773  */
774  clk_prepare(os->_clk);
775  }
776 
777  return ret;
778 }
779 
787 static int _init_opt_clks(struct omap_hwmod *oh)
788 {
789  struct omap_hwmod_opt_clk *oc;
790  struct clk *c;
791  int i;
792  int ret = 0;
793 
794  for (i = oh->opt_clks_cnt, oc = oh->opt_clks; i > 0; i--, oc++) {
795  c = clk_get(NULL, oc->clk);
796  if (IS_ERR(c)) {
797  pr_warning("omap_hwmod: %s: cannot clk_get opt_clk %s\n",
798  oh->name, oc->clk);
799  ret = -EINVAL;
800  }
801  oc->_clk = c;
802  /*
803  * HACK: This needs a re-visit once clk_prepare() is implemented
804  * to do something meaningful. Today its just a no-op.
805  * If clk_prepare() is used at some point to do things like
806  * voltage scaling etc, then this would have to be moved to
807  * some point where subsystems like i2c and pmic become
808  * available.
809  */
810  clk_prepare(oc->_clk);
811  }
812 
813  return ret;
814 }
815 
823 static int _enable_clocks(struct omap_hwmod *oh)
824 {
825  struct omap_hwmod_ocp_if *os;
826  struct list_head *p;
827  int i = 0;
828 
829  pr_debug("omap_hwmod: %s: enabling clocks\n", oh->name);
830 
831  if (oh->_clk)
832  clk_enable(oh->_clk);
833 
834  p = oh->slave_ports.next;
835 
836  while (i < oh->slaves_cnt) {
837  os = _fetch_next_ocp_if(&p, &i);
838 
839  if (os->_clk && (os->flags & OCPIF_SWSUP_IDLE))
840  clk_enable(os->_clk);
841  }
842 
843  /* The opt clocks are controlled by the device driver. */
844 
845  return 0;
846 }
847 
854 static int _disable_clocks(struct omap_hwmod *oh)
855 {
856  struct omap_hwmod_ocp_if *os;
857  struct list_head *p;
858  int i = 0;
859 
860  pr_debug("omap_hwmod: %s: disabling clocks\n", oh->name);
861 
862  if (oh->_clk)
863  clk_disable(oh->_clk);
864 
865  p = oh->slave_ports.next;
866 
867  while (i < oh->slaves_cnt) {
868  os = _fetch_next_ocp_if(&p, &i);
869 
870  if (os->_clk && (os->flags & OCPIF_SWSUP_IDLE))
871  clk_disable(os->_clk);
872  }
873 
874  /* The opt clocks are controlled by the device driver. */
875 
876  return 0;
877 }
878 
879 static void _enable_optional_clocks(struct omap_hwmod *oh)
880 {
881  struct omap_hwmod_opt_clk *oc;
882  int i;
883 
884  pr_debug("omap_hwmod: %s: enabling optional clocks\n", oh->name);
885 
886  for (i = oh->opt_clks_cnt, oc = oh->opt_clks; i > 0; i--, oc++)
887  if (oc->_clk) {
888  pr_debug("omap_hwmod: enable %s:%s\n", oc->role,
889  __clk_get_name(oc->_clk));
890  clk_enable(oc->_clk);
891  }
892 }
893 
894 static void _disable_optional_clocks(struct omap_hwmod *oh)
895 {
896  struct omap_hwmod_opt_clk *oc;
897  int i;
898 
899  pr_debug("omap_hwmod: %s: disabling optional clocks\n", oh->name);
900 
901  for (i = oh->opt_clks_cnt, oc = oh->opt_clks; i > 0; i--, oc++)
902  if (oc->_clk) {
903  pr_debug("omap_hwmod: disable %s:%s\n", oc->role,
904  __clk_get_name(oc->_clk));
905  clk_disable(oc->_clk);
906  }
907 }
908 
916 static void _omap4_enable_module(struct omap_hwmod *oh)
917 {
918  if (!oh->clkdm || !oh->prcm.omap4.modulemode)
919  return;
920 
921  pr_debug("omap_hwmod: %s: %s: %d\n",
922  oh->name, __func__, oh->prcm.omap4.modulemode);
923 
924  omap4_cminst_module_enable(oh->prcm.omap4.modulemode,
925  oh->clkdm->prcm_partition,
926  oh->clkdm->cm_inst,
927  oh->clkdm->clkdm_offs,
928  oh->prcm.omap4.clkctrl_offs);
929 }
930 
938 static void _am33xx_enable_module(struct omap_hwmod *oh)
939 {
940  if (!oh->clkdm || !oh->prcm.omap4.modulemode)
941  return;
942 
943  pr_debug("omap_hwmod: %s: %s: %d\n",
944  oh->name, __func__, oh->prcm.omap4.modulemode);
945 
946  am33xx_cm_module_enable(oh->prcm.omap4.modulemode, oh->clkdm->cm_inst,
947  oh->clkdm->clkdm_offs,
948  oh->prcm.omap4.clkctrl_offs);
949 }
950 
960 static int _omap4_wait_target_disable(struct omap_hwmod *oh)
961 {
962  if (!oh)
963  return -EINVAL;
964 
965  if (oh->_int_flags & _HWMOD_NO_MPU_PORT || !oh->clkdm)
966  return 0;
967 
968  if (oh->flags & HWMOD_NO_IDLEST)
969  return 0;
970 
971  return omap4_cminst_wait_module_idle(oh->clkdm->prcm_partition,
972  oh->clkdm->cm_inst,
973  oh->clkdm->clkdm_offs,
974  oh->prcm.omap4.clkctrl_offs);
975 }
976 
986 static int _am33xx_wait_target_disable(struct omap_hwmod *oh)
987 {
988  if (!oh)
989  return -EINVAL;
990 
991  if (oh->_int_flags & _HWMOD_NO_MPU_PORT)
992  return 0;
993 
994  if (oh->flags & HWMOD_NO_IDLEST)
995  return 0;
996 
997  return am33xx_cm_wait_module_idle(oh->clkdm->cm_inst,
998  oh->clkdm->clkdm_offs,
999  oh->prcm.omap4.clkctrl_offs);
1000 }
1001 
1010 static int _count_mpu_irqs(struct omap_hwmod *oh)
1011 {
1012  struct omap_hwmod_irq_info *ohii;
1013  int i = 0;
1014 
1015  if (!oh || !oh->mpu_irqs)
1016  return 0;
1017 
1018  do {
1019  ohii = &oh->mpu_irqs[i++];
1020  } while (ohii->irq != -1);
1021 
1022  return i-1;
1023 }
1024 
1033 static int _count_sdma_reqs(struct omap_hwmod *oh)
1034 {
1035  struct omap_hwmod_dma_info *ohdi;
1036  int i = 0;
1037 
1038  if (!oh || !oh->sdma_reqs)
1039  return 0;
1040 
1041  do {
1042  ohdi = &oh->sdma_reqs[i++];
1043  } while (ohdi->dma_req != -1);
1044 
1045  return i-1;
1046 }
1047 
1056 static int _count_ocp_if_addr_spaces(struct omap_hwmod_ocp_if *os)
1057 {
1058  struct omap_hwmod_addr_space *mem;
1059  int i = 0;
1060 
1061  if (!os || !os->addr)
1062  return 0;
1063 
1064  do {
1065  mem = &os->addr[i++];
1066  } while (mem->pa_start != mem->pa_end);
1067 
1068  return i-1;
1069 }
1070 
1088 static int _get_mpu_irq_by_name(struct omap_hwmod *oh, const char *name,
1089  unsigned int *irq)
1090 {
1091  int i;
1092  bool found = false;
1093 
1094  if (!oh->mpu_irqs)
1095  return -ENOENT;
1096 
1097  i = 0;
1098  while (oh->mpu_irqs[i].irq != -1) {
1099  if (name == oh->mpu_irqs[i].name ||
1100  !strcmp(name, oh->mpu_irqs[i].name)) {
1101  found = true;
1102  break;
1103  }
1104  i++;
1105  }
1106 
1107  if (!found)
1108  return -ENOENT;
1109 
1110  *irq = oh->mpu_irqs[i].irq;
1111 
1112  return 0;
1113 }
1114 
1131 static int _get_sdma_req_by_name(struct omap_hwmod *oh, const char *name,
1132  unsigned int *dma)
1133 {
1134  int i;
1135  bool found = false;
1136 
1137  if (!oh->sdma_reqs)
1138  return -ENOENT;
1139 
1140  i = 0;
1141  while (oh->sdma_reqs[i].dma_req != -1) {
1142  if (name == oh->sdma_reqs[i].name ||
1143  !strcmp(name, oh->sdma_reqs[i].name)) {
1144  found = true;
1145  break;
1146  }
1147  i++;
1148  }
1149 
1150  if (!found)
1151  return -ENOENT;
1152 
1153  *dma = oh->sdma_reqs[i].dma_req;
1154 
1155  return 0;
1156 }
1157 
1176 static int _get_addr_space_by_name(struct omap_hwmod *oh, const char *name,
1177  u32 *pa_start, u32 *pa_end)
1178 {
1179  int i, j;
1180  struct omap_hwmod_ocp_if *os;
1181  struct list_head *p = NULL;
1182  bool found = false;
1183 
1184  p = oh->slave_ports.next;
1185 
1186  i = 0;
1187  while (i < oh->slaves_cnt) {
1188  os = _fetch_next_ocp_if(&p, &i);
1189 
1190  if (!os->addr)
1191  return -ENOENT;
1192 
1193  j = 0;
1194  while (os->addr[j].pa_start != os->addr[j].pa_end) {
1195  if (name == os->addr[j].name ||
1196  !strcmp(name, os->addr[j].name)) {
1197  found = true;
1198  break;
1199  }
1200  j++;
1201  }
1202 
1203  if (found)
1204  break;
1205  }
1206 
1207  if (!found)
1208  return -ENOENT;
1209 
1210  *pa_start = os->addr[j].pa_start;
1211  *pa_end = os->addr[j].pa_end;
1212 
1213  return 0;
1214 }
1215 
1225 static void __init _save_mpu_port_index(struct omap_hwmod *oh)
1226 {
1227  struct omap_hwmod_ocp_if *os = NULL;
1228  struct list_head *p;
1229  int i = 0;
1230 
1231  if (!oh)
1232  return;
1233 
1235 
1236  p = oh->slave_ports.next;
1237 
1238  while (i < oh->slaves_cnt) {
1239  os = _fetch_next_ocp_if(&p, &i);
1240  if (os->user & OCP_USER_MPU) {
1241  oh->_mpu_port = os;
1243  break;
1244  }
1245  }
1246 
1247  return;
1248 }
1249 
1263 static struct omap_hwmod_ocp_if *_find_mpu_rt_port(struct omap_hwmod *oh)
1264 {
1265  if (!oh || oh->_int_flags & _HWMOD_NO_MPU_PORT || oh->slaves_cnt == 0)
1266  return NULL;
1267 
1268  return oh->_mpu_port;
1269 };
1270 
1278 static struct omap_hwmod_addr_space * __init _find_mpu_rt_addr_space(struct omap_hwmod *oh)
1279 {
1280  struct omap_hwmod_ocp_if *os;
1281  struct omap_hwmod_addr_space *mem;
1282  int found = 0, i = 0;
1283 
1284  os = _find_mpu_rt_port(oh);
1285  if (!os || !os->addr)
1286  return NULL;
1287 
1288  do {
1289  mem = &os->addr[i++];
1290  if (mem->flags & ADDR_TYPE_RT)
1291  found = 1;
1292  } while (!found && mem->pa_start != mem->pa_end);
1293 
1294  return (found) ? mem : NULL;
1295 }
1296 
1308 static void _enable_sysc(struct omap_hwmod *oh)
1309 {
1310  u8 idlemode, sf;
1311  u32 v;
1312  bool clkdm_act;
1313 
1314  if (!oh->class->sysc)
1315  return;
1316 
1317  /*
1318  * Wait until reset has completed, this is needed as the IP
1319  * block is reset automatically by hardware in some cases
1320  * (off-mode for example), and the drivers require the
1321  * IP to be ready when they access it
1322  */
1324  _enable_optional_clocks(oh);
1325  _wait_softreset_complete(oh);
1327  _disable_optional_clocks(oh);
1328 
1329  v = oh->_sysc_cache;
1330  sf = oh->class->sysc->sysc_flags;
1331 
1332  if (sf & SYSC_HAS_SIDLEMODE) {
1333  clkdm_act = ((oh->clkdm &&
1334  oh->clkdm->flags & CLKDM_ACTIVE_WITH_MPU) ||
1335  (oh->_clk && oh->_clk->clkdm &&
1336  oh->_clk->clkdm->flags & CLKDM_ACTIVE_WITH_MPU));
1337  if (clkdm_act && !(oh->class->sysc->idlemodes &
1339  idlemode = HWMOD_IDLEMODE_FORCE;
1340  else
1341  idlemode = (oh->flags & HWMOD_SWSUP_SIDLE) ?
1343  _set_slave_idlemode(oh, idlemode, &v);
1344  }
1345 
1346  if (sf & SYSC_HAS_MIDLEMODE) {
1347  if (oh->flags & HWMOD_SWSUP_MSTANDBY) {
1348  idlemode = HWMOD_IDLEMODE_NO;
1349  } else {
1350  if (sf & SYSC_HAS_ENAWAKEUP)
1351  _enable_wakeup(oh, &v);
1352  if (oh->class->sysc->idlemodes & MSTANDBY_SMART_WKUP)
1353  idlemode = HWMOD_IDLEMODE_SMART_WKUP;
1354  else
1355  idlemode = HWMOD_IDLEMODE_SMART;
1356  }
1357  _set_master_standbymode(oh, idlemode, &v);
1358  }
1359 
1360  /*
1361  * XXX The clock framework should handle this, by
1362  * calling into this code. But this must wait until the
1363  * clock structures are tagged with omap_hwmod entries
1364  */
1365  if ((oh->flags & HWMOD_SET_DEFAULT_CLOCKACT) &&
1366  (sf & SYSC_HAS_CLOCKACTIVITY))
1367  _set_clockactivity(oh, oh->class->sysc->clockact, &v);
1368 
1369  /* If slave is in SMARTIDLE, also enable wakeup */
1370  if ((sf & SYSC_HAS_SIDLEMODE) && !(oh->flags & HWMOD_SWSUP_SIDLE))
1371  _enable_wakeup(oh, &v);
1372 
1373  _write_sysconfig(v, oh);
1374 
1375  /*
1376  * Set the autoidle bit only after setting the smartidle bit
1377  * Setting this will not have any impact on the other modules.
1378  */
1379  if (sf & SYSC_HAS_AUTOIDLE) {
1380  idlemode = (oh->flags & HWMOD_NO_OCP_AUTOIDLE) ?
1381  0 : 1;
1382  _set_module_autoidle(oh, idlemode, &v);
1383  _write_sysconfig(v, oh);
1384  }
1385 }
1386 
1396 static void _idle_sysc(struct omap_hwmod *oh)
1397 {
1398  u8 idlemode, sf;
1399  u32 v;
1400 
1401  if (!oh->class->sysc)
1402  return;
1403 
1404  v = oh->_sysc_cache;
1405  sf = oh->class->sysc->sysc_flags;
1406 
1407  if (sf & SYSC_HAS_SIDLEMODE) {
1408  /* XXX What about HWMOD_IDLEMODE_SMART_WKUP? */
1409  if (oh->flags & HWMOD_SWSUP_SIDLE ||
1410  !(oh->class->sysc->idlemodes &
1412  idlemode = HWMOD_IDLEMODE_FORCE;
1413  else
1414  idlemode = HWMOD_IDLEMODE_SMART;
1415  _set_slave_idlemode(oh, idlemode, &v);
1416  }
1417 
1418  if (sf & SYSC_HAS_MIDLEMODE) {
1419  if (oh->flags & HWMOD_SWSUP_MSTANDBY) {
1420  idlemode = HWMOD_IDLEMODE_FORCE;
1421  } else {
1422  if (sf & SYSC_HAS_ENAWAKEUP)
1423  _enable_wakeup(oh, &v);
1424  if (oh->class->sysc->idlemodes & MSTANDBY_SMART_WKUP)
1425  idlemode = HWMOD_IDLEMODE_SMART_WKUP;
1426  else
1427  idlemode = HWMOD_IDLEMODE_SMART;
1428  }
1429  _set_master_standbymode(oh, idlemode, &v);
1430  }
1431 
1432  /* If slave is in SMARTIDLE, also enable wakeup */
1433  if ((sf & SYSC_HAS_SIDLEMODE) && !(oh->flags & HWMOD_SWSUP_SIDLE))
1434  _enable_wakeup(oh, &v);
1435 
1436  _write_sysconfig(v, oh);
1437 }
1438 
1446 static void _shutdown_sysc(struct omap_hwmod *oh)
1447 {
1448  u32 v;
1449  u8 sf;
1450 
1451  if (!oh->class->sysc)
1452  return;
1453 
1454  v = oh->_sysc_cache;
1455  sf = oh->class->sysc->sysc_flags;
1456 
1457  if (sf & SYSC_HAS_SIDLEMODE)
1458  _set_slave_idlemode(oh, HWMOD_IDLEMODE_FORCE, &v);
1459 
1460  if (sf & SYSC_HAS_MIDLEMODE)
1461  _set_master_standbymode(oh, HWMOD_IDLEMODE_FORCE, &v);
1462 
1463  if (sf & SYSC_HAS_AUTOIDLE)
1464  _set_module_autoidle(oh, 1, &v);
1465 
1466  _write_sysconfig(v, oh);
1467 }
1468 
1475 static struct omap_hwmod *_lookup(const char *name)
1476 {
1477  struct omap_hwmod *oh, *temp_oh;
1478 
1479  oh = NULL;
1480 
1481  list_for_each_entry(temp_oh, &omap_hwmod_list, node) {
1482  if (!strcmp(name, temp_oh->name)) {
1483  oh = temp_oh;
1484  break;
1485  }
1486  }
1487 
1488  return oh;
1489 }
1490 
1499 static int _init_clkdm(struct omap_hwmod *oh)
1500 {
1501  if (!oh->clkdm_name) {
1502  pr_debug("omap_hwmod: %s: missing clockdomain\n", oh->name);
1503  return 0;
1504  }
1505 
1506  oh->clkdm = clkdm_lookup(oh->clkdm_name);
1507  if (!oh->clkdm) {
1508  pr_warning("omap_hwmod: %s: could not associate to clkdm %s\n",
1509  oh->name, oh->clkdm_name);
1510  return -EINVAL;
1511  }
1512 
1513  pr_debug("omap_hwmod: %s: associated to clkdm %s\n",
1514  oh->name, oh->clkdm_name);
1515 
1516  return 0;
1517 }
1518 
1529 static int _init_clocks(struct omap_hwmod *oh, void *data)
1530 {
1531  int ret = 0;
1532 
1533  if (oh->_state != _HWMOD_STATE_REGISTERED)
1534  return 0;
1535 
1536  pr_debug("omap_hwmod: %s: looking up clocks\n", oh->name);
1537 
1538  ret |= _init_main_clk(oh);
1539  ret |= _init_interface_clks(oh);
1540  ret |= _init_opt_clks(oh);
1541  if (soc_ops.init_clkdm)
1542  ret |= soc_ops.init_clkdm(oh);
1543 
1544  if (!ret)
1546  else
1547  pr_warning("omap_hwmod: %s: cannot _init_clocks\n", oh->name);
1548 
1549  return ret;
1550 }
1551 
1561 static int _lookup_hardreset(struct omap_hwmod *oh, const char *name,
1562  struct omap_hwmod_rst_info *ohri)
1563 {
1564  int i;
1565 
1566  for (i = 0; i < oh->rst_lines_cnt; i++) {
1567  const char *rst_line = oh->rst_lines[i].name;
1568  if (!strcmp(rst_line, name)) {
1569  ohri->rst_shift = oh->rst_lines[i].rst_shift;
1570  ohri->st_shift = oh->rst_lines[i].st_shift;
1571  pr_debug("omap_hwmod: %s: %s: %s: rst %d st %d\n",
1572  oh->name, __func__, rst_line, ohri->rst_shift,
1573  ohri->st_shift);
1574 
1575  return 0;
1576  }
1577  }
1578 
1579  return -ENOENT;
1580 }
1581 
1595 static int _assert_hardreset(struct omap_hwmod *oh, const char *name)
1596 {
1597  struct omap_hwmod_rst_info ohri;
1598  int ret = -EINVAL;
1599 
1600  if (!oh)
1601  return -EINVAL;
1602 
1603  if (!soc_ops.assert_hardreset)
1604  return -ENOSYS;
1605 
1606  ret = _lookup_hardreset(oh, name, &ohri);
1607  if (ret < 0)
1608  return ret;
1609 
1610  ret = soc_ops.assert_hardreset(oh, &ohri);
1611 
1612  return ret;
1613 }
1614 
1628 static int _deassert_hardreset(struct omap_hwmod *oh, const char *name)
1629 {
1630  struct omap_hwmod_rst_info ohri;
1631  int ret = -EINVAL;
1632  int hwsup = 0;
1633 
1634  if (!oh)
1635  return -EINVAL;
1636 
1637  if (!soc_ops.deassert_hardreset)
1638  return -ENOSYS;
1639 
1640  ret = _lookup_hardreset(oh, name, &ohri);
1641  if (IS_ERR_VALUE(ret))
1642  return ret;
1643 
1644  if (oh->clkdm) {
1645  /*
1646  * A clockdomain must be in SW_SUP otherwise reset
1647  * might not be completed. The clockdomain can be set
1648  * in HW_AUTO only when the module become ready.
1649  */
1650  hwsup = clkdm_in_hwsup(oh->clkdm);
1651  ret = clkdm_hwmod_enable(oh->clkdm, oh);
1652  if (ret) {
1653  WARN(1, "omap_hwmod: %s: could not enable clockdomain %s: %d\n",
1654  oh->name, oh->clkdm->name, ret);
1655  return ret;
1656  }
1657  }
1658 
1659  _enable_clocks(oh);
1660  if (soc_ops.enable_module)
1661  soc_ops.enable_module(oh);
1662 
1663  ret = soc_ops.deassert_hardreset(oh, &ohri);
1664 
1665  if (soc_ops.disable_module)
1666  soc_ops.disable_module(oh);
1667  _disable_clocks(oh);
1668 
1669  if (ret == -EBUSY)
1670  pr_warning("omap_hwmod: %s: failed to hardreset\n", oh->name);
1671 
1672  if (!ret) {
1673  /*
1674  * Set the clockdomain to HW_AUTO, assuming that the
1675  * previous state was HW_AUTO.
1676  */
1677  if (oh->clkdm && hwsup)
1678  clkdm_allow_idle(oh->clkdm);
1679  } else {
1680  if (oh->clkdm)
1681  clkdm_hwmod_disable(oh->clkdm, oh);
1682  }
1683 
1684  return ret;
1685 }
1686 
1699 static int _read_hardreset(struct omap_hwmod *oh, const char *name)
1700 {
1701  struct omap_hwmod_rst_info ohri;
1702  int ret = -EINVAL;
1703 
1704  if (!oh)
1705  return -EINVAL;
1706 
1707  if (!soc_ops.is_hardreset_asserted)
1708  return -ENOSYS;
1709 
1710  ret = _lookup_hardreset(oh, name, &ohri);
1711  if (ret < 0)
1712  return ret;
1713 
1714  return soc_ops.is_hardreset_asserted(oh, &ohri);
1715 }
1716 
1727 static bool _are_all_hardreset_lines_asserted(struct omap_hwmod *oh)
1728 {
1729  int i, rst_cnt = 0;
1730 
1731  if (oh->rst_lines_cnt == 0)
1732  return false;
1733 
1734  for (i = 0; i < oh->rst_lines_cnt; i++)
1735  if (_read_hardreset(oh, oh->rst_lines[i].name) > 0)
1736  rst_cnt++;
1737 
1738  if (oh->rst_lines_cnt == rst_cnt)
1739  return true;
1740 
1741  return false;
1742 }
1743 
1755 static bool _are_any_hardreset_lines_asserted(struct omap_hwmod *oh)
1756 {
1757  int rst_cnt = 0;
1758  int i;
1759 
1760  for (i = 0; i < oh->rst_lines_cnt && rst_cnt == 0; i++)
1761  if (_read_hardreset(oh, oh->rst_lines[i].name) > 0)
1762  rst_cnt++;
1763 
1764  return (rst_cnt) ? true : false;
1765 }
1766 
1774 static int _omap4_disable_module(struct omap_hwmod *oh)
1775 {
1776  int v;
1777 
1778  if (!oh->clkdm || !oh->prcm.omap4.modulemode)
1779  return -EINVAL;
1780 
1781  /*
1782  * Since integration code might still be doing something, only
1783  * disable if all lines are under hardreset.
1784  */
1785  if (_are_any_hardreset_lines_asserted(oh))
1786  return 0;
1787 
1788  pr_debug("omap_hwmod: %s: %s\n", oh->name, __func__);
1789 
1790  omap4_cminst_module_disable(oh->clkdm->prcm_partition,
1791  oh->clkdm->cm_inst,
1792  oh->clkdm->clkdm_offs,
1793  oh->prcm.omap4.clkctrl_offs);
1794 
1795  v = _omap4_wait_target_disable(oh);
1796  if (v)
1797  pr_warn("omap_hwmod: %s: _wait_target_disable failed\n",
1798  oh->name);
1799 
1800  return 0;
1801 }
1802 
1810 static int _am33xx_disable_module(struct omap_hwmod *oh)
1811 {
1812  int v;
1813 
1814  if (!oh->clkdm || !oh->prcm.omap4.modulemode)
1815  return -EINVAL;
1816 
1817  pr_debug("omap_hwmod: %s: %s\n", oh->name, __func__);
1818 
1819  if (_are_any_hardreset_lines_asserted(oh))
1820  return 0;
1821 
1822  am33xx_cm_module_disable(oh->clkdm->cm_inst, oh->clkdm->clkdm_offs,
1823  oh->prcm.omap4.clkctrl_offs);
1824 
1825  v = _am33xx_wait_target_disable(oh);
1826  if (v)
1827  pr_warn("omap_hwmod: %s: _wait_target_disable failed\n",
1828  oh->name);
1829 
1830  return 0;
1831 }
1832 
1849 static int _ocp_softreset(struct omap_hwmod *oh)
1850 {
1851  u32 v;
1852  int c = 0;
1853  int ret = 0;
1854 
1855  if (!oh->class->sysc ||
1856  !(oh->class->sysc->sysc_flags & SYSC_HAS_SOFTRESET))
1857  return -ENOENT;
1858 
1859  /* clocks must be on for this operation */
1860  if (oh->_state != _HWMOD_STATE_ENABLED) {
1861  pr_warn("omap_hwmod: %s: reset can only be entered from enabled state\n",
1862  oh->name);
1863  return -EINVAL;
1864  }
1865 
1866  /* For some modules, all optionnal clocks need to be enabled as well */
1868  _enable_optional_clocks(oh);
1869 
1870  pr_debug("omap_hwmod: %s: resetting via OCP SOFTRESET\n", oh->name);
1871 
1872  v = oh->_sysc_cache;
1873  ret = _set_softreset(oh, &v);
1874  if (ret)
1875  goto dis_opt_clks;
1876  _write_sysconfig(v, oh);
1877 
1878  if (oh->class->sysc->srst_udelay)
1879  udelay(oh->class->sysc->srst_udelay);
1880 
1881  c = _wait_softreset_complete(oh);
1882  if (c == MAX_MODULE_SOFTRESET_WAIT)
1883  pr_warning("omap_hwmod: %s: softreset failed (waited %d usec)\n",
1885  else
1886  pr_debug("omap_hwmod: %s: softreset in %d usec\n", oh->name, c);
1887 
1888  /*
1889  * XXX add _HWMOD_STATE_WEDGED for modules that don't come back from
1890  * _wait_target_ready() or _reset()
1891  */
1892 
1893  ret = (c == MAX_MODULE_SOFTRESET_WAIT) ? -ETIMEDOUT : 0;
1894 
1895 dis_opt_clks:
1897  _disable_optional_clocks(oh);
1898 
1899  return ret;
1900 }
1901 
1935 static int _reset(struct omap_hwmod *oh)
1936 {
1937  int i, r;
1938 
1939  pr_debug("omap_hwmod: %s: resetting\n", oh->name);
1940 
1941  if (oh->class->reset) {
1942  r = oh->class->reset(oh);
1943  } else {
1944  if (oh->rst_lines_cnt > 0) {
1945  for (i = 0; i < oh->rst_lines_cnt; i++)
1946  _assert_hardreset(oh, oh->rst_lines[i].name);
1947  return 0;
1948  } else {
1949  r = _ocp_softreset(oh);
1950  if (r == -ENOENT)
1951  r = 0;
1952  }
1953  }
1954 
1955  _set_dmadisable(oh);
1956 
1957  /*
1958  * OCP_SYSCONFIG bits need to be reprogrammed after a
1959  * softreset. The _enable() function should be split to avoid
1960  * the rewrite of the OCP_SYSCONFIG register.
1961  */
1962  if (oh->class->sysc) {
1963  _update_sysc_cache(oh);
1964  _enable_sysc(oh);
1965  }
1966 
1967  return r;
1968 }
1969 
1982 static void _reconfigure_io_chain(void)
1983 {
1984  unsigned long flags;
1985 
1986  spin_lock_irqsave(&io_chain_lock, flags);
1987 
1988  if (cpu_is_omap34xx() && omap3_has_io_chain_ctrl())
1990  else if (cpu_is_omap44xx())
1992 
1993  spin_unlock_irqrestore(&io_chain_lock, flags);
1994 }
1995 
2004 static int _enable(struct omap_hwmod *oh)
2005 {
2006  int r;
2007  int hwsup = 0;
2008 
2009  pr_debug("omap_hwmod: %s: enabling\n", oh->name);
2010 
2011  /*
2012  * hwmods with HWMOD_INIT_NO_IDLE flag set are left in enabled
2013  * state at init. Now that someone is really trying to enable
2014  * them, just ensure that the hwmod mux is set.
2015  */
2016  if (oh->_int_flags & _HWMOD_SKIP_ENABLE) {
2017  /*
2018  * If the caller has mux data populated, do the mux'ing
2019  * which wouldn't have been done as part of the _enable()
2020  * done during setup.
2021  */
2022  if (oh->mux)
2023  omap_hwmod_mux(oh->mux, _HWMOD_STATE_ENABLED);
2024 
2026  return 0;
2027  }
2028 
2029  if (oh->_state != _HWMOD_STATE_INITIALIZED &&
2030  oh->_state != _HWMOD_STATE_IDLE &&
2031  oh->_state != _HWMOD_STATE_DISABLED) {
2032  WARN(1, "omap_hwmod: %s: enabled state can only be entered from initialized, idle, or disabled state\n",
2033  oh->name);
2034  return -EINVAL;
2035  }
2036 
2037  /*
2038  * If an IP block contains HW reset lines and all of them are
2039  * asserted, we let integration code associated with that
2040  * block handle the enable. We've received very little
2041  * information on what those driver authors need, and until
2042  * detailed information is provided and the driver code is
2043  * posted to the public lists, this is probably the best we
2044  * can do.
2045  */
2046  if (_are_all_hardreset_lines_asserted(oh))
2047  return 0;
2048 
2049  /* Mux pins for device runtime if populated */
2050  if (oh->mux && (!oh->mux->enabled ||
2051  ((oh->_state == _HWMOD_STATE_IDLE) &&
2052  oh->mux->pads_dynamic))) {
2053  omap_hwmod_mux(oh->mux, _HWMOD_STATE_ENABLED);
2054  _reconfigure_io_chain();
2055  }
2056 
2057  _add_initiator_dep(oh, mpu_oh);
2058 
2059  if (oh->clkdm) {
2060  /*
2061  * A clockdomain must be in SW_SUP before enabling
2062  * completely the module. The clockdomain can be set
2063  * in HW_AUTO only when the module become ready.
2064  */
2065  hwsup = clkdm_in_hwsup(oh->clkdm) &&
2067  r = clkdm_hwmod_enable(oh->clkdm, oh);
2068  if (r) {
2069  WARN(1, "omap_hwmod: %s: could not enable clockdomain %s: %d\n",
2070  oh->name, oh->clkdm->name, r);
2071  return r;
2072  }
2073  }
2074 
2075  _enable_clocks(oh);
2076  if (soc_ops.enable_module)
2077  soc_ops.enable_module(oh);
2078 
2079  r = (soc_ops.wait_target_ready) ? soc_ops.wait_target_ready(oh) :
2080  -EINVAL;
2081  if (!r) {
2082  /*
2083  * Set the clockdomain to HW_AUTO only if the target is ready,
2084  * assuming that the previous state was HW_AUTO
2085  */
2086  if (oh->clkdm && hwsup)
2087  clkdm_allow_idle(oh->clkdm);
2088 
2090 
2091  /* Access the sysconfig only if the target is ready */
2092  if (oh->class->sysc) {
2093  if (!(oh->_int_flags & _HWMOD_SYSCONFIG_LOADED))
2094  _update_sysc_cache(oh);
2095  _enable_sysc(oh);
2096  }
2097  } else {
2098  _omap4_disable_module(oh);
2099  _disable_clocks(oh);
2100  pr_debug("omap_hwmod: %s: _wait_target_ready: %d\n",
2101  oh->name, r);
2102 
2103  if (oh->clkdm)
2104  clkdm_hwmod_disable(oh->clkdm, oh);
2105  }
2106 
2107  return r;
2108 }
2109 
2118 static int _idle(struct omap_hwmod *oh)
2119 {
2120  pr_debug("omap_hwmod: %s: idling\n", oh->name);
2121 
2122  if (oh->_state != _HWMOD_STATE_ENABLED) {
2123  WARN(1, "omap_hwmod: %s: idle state can only be entered from enabled state\n",
2124  oh->name);
2125  return -EINVAL;
2126  }
2127 
2128  if (_are_all_hardreset_lines_asserted(oh))
2129  return 0;
2130 
2131  if (oh->class->sysc)
2132  _idle_sysc(oh);
2133  _del_initiator_dep(oh, mpu_oh);
2134 
2135  if (soc_ops.disable_module)
2136  soc_ops.disable_module(oh);
2137 
2138  /*
2139  * The module must be in idle mode before disabling any parents
2140  * clocks. Otherwise, the parent clock might be disabled before
2141  * the module transition is done, and thus will prevent the
2142  * transition to complete properly.
2143  */
2144  _disable_clocks(oh);
2145  if (oh->clkdm)
2146  clkdm_hwmod_disable(oh->clkdm, oh);
2147 
2148  /* Mux pins for device idle if populated */
2149  if (oh->mux && oh->mux->pads_dynamic) {
2150  omap_hwmod_mux(oh->mux, _HWMOD_STATE_IDLE);
2151  _reconfigure_io_chain();
2152  }
2153 
2154  oh->_state = _HWMOD_STATE_IDLE;
2155 
2156  return 0;
2157 }
2158 
2172 int omap_hwmod_set_ocp_autoidle(struct omap_hwmod *oh, u8 autoidle)
2173 {
2174  u32 v;
2175  int retval = 0;
2176  unsigned long flags;
2177 
2178  if (!oh || oh->_state != _HWMOD_STATE_ENABLED)
2179  return -EINVAL;
2180 
2181  spin_lock_irqsave(&oh->_lock, flags);
2182 
2183  v = oh->_sysc_cache;
2184 
2185  retval = _set_module_autoidle(oh, autoidle, &v);
2186 
2187  if (!retval)
2188  _write_sysconfig(v, oh);
2189 
2190  spin_unlock_irqrestore(&oh->_lock, flags);
2191 
2192  return retval;
2193 }
2194 
2204 static int _shutdown(struct omap_hwmod *oh)
2205 {
2206  int ret, i;
2207  u8 prev_state;
2208 
2209  if (oh->_state != _HWMOD_STATE_IDLE &&
2210  oh->_state != _HWMOD_STATE_ENABLED) {
2211  WARN(1, "omap_hwmod: %s: disabled state can only be entered from idle, or enabled state\n",
2212  oh->name);
2213  return -EINVAL;
2214  }
2215 
2216  if (_are_all_hardreset_lines_asserted(oh))
2217  return 0;
2218 
2219  pr_debug("omap_hwmod: %s: disabling\n", oh->name);
2220 
2221  if (oh->class->pre_shutdown) {
2222  prev_state = oh->_state;
2223  if (oh->_state == _HWMOD_STATE_IDLE)
2224  _enable(oh);
2225  ret = oh->class->pre_shutdown(oh);
2226  if (ret) {
2227  if (prev_state == _HWMOD_STATE_IDLE)
2228  _idle(oh);
2229  return ret;
2230  }
2231  }
2232 
2233  if (oh->class->sysc) {
2234  if (oh->_state == _HWMOD_STATE_IDLE)
2235  _enable(oh);
2236  _shutdown_sysc(oh);
2237  }
2238 
2239  /* clocks and deps are already disabled in idle */
2240  if (oh->_state == _HWMOD_STATE_ENABLED) {
2241  _del_initiator_dep(oh, mpu_oh);
2242  /* XXX what about the other system initiators here? dma, dsp */
2243  if (soc_ops.disable_module)
2244  soc_ops.disable_module(oh);
2245  _disable_clocks(oh);
2246  if (oh->clkdm)
2247  clkdm_hwmod_disable(oh->clkdm, oh);
2248  }
2249  /* XXX Should this code also force-disable the optional clocks? */
2250 
2251  for (i = 0; i < oh->rst_lines_cnt; i++)
2252  _assert_hardreset(oh, oh->rst_lines[i].name);
2253 
2254  /* Mux pins to safe mode or use populated off mode values */
2255  if (oh->mux)
2256  omap_hwmod_mux(oh->mux, _HWMOD_STATE_DISABLED);
2257 
2259 
2260  return 0;
2261 }
2262 
2272 static void __init _init_mpu_rt_base(struct omap_hwmod *oh, void *data)
2273 {
2274  struct omap_hwmod_addr_space *mem;
2275  void __iomem *va_start;
2276 
2277  if (!oh)
2278  return;
2279 
2280  _save_mpu_port_index(oh);
2281 
2282  if (oh->_int_flags & _HWMOD_NO_MPU_PORT)
2283  return;
2284 
2285  mem = _find_mpu_rt_addr_space(oh);
2286  if (!mem) {
2287  pr_debug("omap_hwmod: %s: no MPU register target found\n",
2288  oh->name);
2289  return;
2290  }
2291 
2292  va_start = ioremap(mem->pa_start, mem->pa_end - mem->pa_start);
2293  if (!va_start) {
2294  pr_err("omap_hwmod: %s: Could not ioremap\n", oh->name);
2295  return;
2296  }
2297 
2298  pr_debug("omap_hwmod: %s: MPU register target at va %p\n",
2299  oh->name, va_start);
2300 
2301  oh->_mpu_rt_va = va_start;
2302 }
2303 
2317 static int __init _init(struct omap_hwmod *oh, void *data)
2318 {
2319  int r;
2320 
2321  if (oh->_state != _HWMOD_STATE_REGISTERED)
2322  return 0;
2323 
2324  _init_mpu_rt_base(oh, NULL);
2325 
2326  r = _init_clocks(oh, NULL);
2327  if (IS_ERR_VALUE(r)) {
2328  WARN(1, "omap_hwmod: %s: couldn't init clocks\n", oh->name);
2329  return -EINVAL;
2330  }
2331 
2333 
2334  return 0;
2335 }
2336 
2345 static void __init _setup_iclk_autoidle(struct omap_hwmod *oh)
2346 {
2347  struct omap_hwmod_ocp_if *os;
2348  struct list_head *p;
2349  int i = 0;
2350  if (oh->_state != _HWMOD_STATE_INITIALIZED)
2351  return;
2352 
2353  p = oh->slave_ports.next;
2354 
2355  while (i < oh->slaves_cnt) {
2356  os = _fetch_next_ocp_if(&p, &i);
2357  if (!os->_clk)
2358  continue;
2359 
2360  if (os->flags & OCPIF_SWSUP_IDLE) {
2361  /* XXX omap_iclk_deny_idle(c); */
2362  } else {
2363  /* XXX omap_iclk_allow_idle(c); */
2364  clk_enable(os->_clk);
2365  }
2366  }
2367 
2368  return;
2369 }
2370 
2380 static int __init _setup_reset(struct omap_hwmod *oh)
2381 {
2382  int r;
2383 
2384  if (oh->_state != _HWMOD_STATE_INITIALIZED)
2385  return -EINVAL;
2386 
2387  if (oh->flags & HWMOD_EXT_OPT_MAIN_CLK)
2388  return -EPERM;
2389 
2390  if (oh->rst_lines_cnt == 0) {
2391  r = _enable(oh);
2392  if (r) {
2393  pr_warning("omap_hwmod: %s: cannot be enabled for reset (%d)\n",
2394  oh->name, oh->_state);
2395  return -EINVAL;
2396  }
2397  }
2398 
2399  if (!(oh->flags & HWMOD_INIT_NO_RESET))
2400  r = _reset(oh);
2401 
2402  return r;
2403 }
2404 
2441 static void __init _setup_postsetup(struct omap_hwmod *oh)
2442 {
2443  u8 postsetup_state;
2444 
2445  if (oh->rst_lines_cnt > 0)
2446  return;
2447 
2448  postsetup_state = oh->_postsetup_state;
2449  if (postsetup_state == _HWMOD_STATE_UNKNOWN)
2450  postsetup_state = _HWMOD_STATE_ENABLED;
2451 
2452  /*
2453  * XXX HWMOD_INIT_NO_IDLE does not belong in hwmod data -
2454  * it should be set by the core code as a runtime flag during startup
2455  */
2456  if ((oh->flags & HWMOD_INIT_NO_IDLE) &&
2457  (postsetup_state == _HWMOD_STATE_IDLE)) {
2459  postsetup_state = _HWMOD_STATE_ENABLED;
2460  }
2461 
2462  if (postsetup_state == _HWMOD_STATE_IDLE)
2463  _idle(oh);
2464  else if (postsetup_state == _HWMOD_STATE_DISABLED)
2465  _shutdown(oh);
2466  else if (postsetup_state != _HWMOD_STATE_ENABLED)
2467  WARN(1, "hwmod: %s: unknown postsetup state %d! defaulting to enabled\n",
2468  oh->name, postsetup_state);
2469 
2470  return;
2471 }
2472 
2489 static int __init _setup(struct omap_hwmod *oh, void *data)
2490 {
2491  if (oh->_state != _HWMOD_STATE_INITIALIZED)
2492  return 0;
2493 
2494  _setup_iclk_autoidle(oh);
2495 
2496  if (!_setup_reset(oh))
2497  _setup_postsetup(oh);
2498 
2499  return 0;
2500 }
2501 
2519 static int __init _register(struct omap_hwmod *oh)
2520 {
2521  if (!oh || !oh->name || !oh->class || !oh->class->name ||
2522  (oh->_state != _HWMOD_STATE_UNKNOWN))
2523  return -EINVAL;
2524 
2525  pr_debug("omap_hwmod: %s: registering\n", oh->name);
2526 
2527  if (_lookup(oh->name))
2528  return -EEXIST;
2529 
2530  list_add_tail(&oh->node, &omap_hwmod_list);
2531 
2532  INIT_LIST_HEAD(&oh->master_ports);
2533  INIT_LIST_HEAD(&oh->slave_ports);
2534  spin_lock_init(&oh->_lock);
2535 
2537 
2538  /*
2539  * XXX Rather than doing a strcmp(), this should test a flag
2540  * set in the hwmod data, inserted by the autogenerator code.
2541  */
2542  if (!strcmp(oh->name, MPU_INITIATOR_NAME))
2543  mpu_oh = oh;
2544 
2545  return 0;
2546 }
2547 
2561 static int __init _alloc_links(struct omap_hwmod_link **ml,
2562  struct omap_hwmod_link **sl)
2563 {
2564  unsigned int sz;
2565 
2566  if ((free_ls + LINKS_PER_OCP_IF) <= max_ls) {
2567  *ml = &linkspace[free_ls++];
2568  *sl = &linkspace[free_ls++];
2569  return 0;
2570  }
2571 
2572  sz = sizeof(struct omap_hwmod_link) * LINKS_PER_OCP_IF;
2573 
2574  *sl = NULL;
2575  *ml = alloc_bootmem(sz);
2576 
2577  memset(*ml, 0, sz);
2578 
2579  *sl = (void *)(*ml) + sizeof(struct omap_hwmod_link);
2580 
2581  ls_supp++;
2582  pr_debug("omap_hwmod: supplemental link allocations needed: %d\n",
2583  ls_supp * LINKS_PER_OCP_IF);
2584 
2585  return 0;
2586 };
2587 
2599 static int __init _add_link(struct omap_hwmod_ocp_if *oi)
2600 {
2601  struct omap_hwmod_link *ml, *sl;
2602 
2603  pr_debug("omap_hwmod: %s -> %s: adding link\n", oi->master->name,
2604  oi->slave->name);
2605 
2606  _alloc_links(&ml, &sl);
2607 
2608  ml->ocp_if = oi;
2609  INIT_LIST_HEAD(&ml->node);
2610  list_add(&ml->node, &oi->master->master_ports);
2611  oi->master->masters_cnt++;
2612 
2613  sl->ocp_if = oi;
2614  INIT_LIST_HEAD(&sl->node);
2615  list_add(&sl->node, &oi->slave->slave_ports);
2616  oi->slave->slaves_cnt++;
2617 
2618  return 0;
2619 }
2620 
2634 static int __init _register_link(struct omap_hwmod_ocp_if *oi)
2635 {
2636  if (!oi || !oi->master || !oi->slave || !oi->user)
2637  return -EINVAL;
2638 
2640  return -EEXIST;
2641 
2642  pr_debug("omap_hwmod: registering link from %s to %s\n",
2643  oi->master->name, oi->slave->name);
2644 
2645  /*
2646  * Register the connected hwmods, if they haven't been
2647  * registered already
2648  */
2649  if (oi->master->_state != _HWMOD_STATE_REGISTERED)
2650  _register(oi->master);
2651 
2652  if (oi->slave->_state != _HWMOD_STATE_REGISTERED)
2653  _register(oi->slave);
2654 
2655  _add_link(oi);
2656 
2658 
2659  return 0;
2660 }
2661 
2677 static int __init _alloc_linkspace(struct omap_hwmod_ocp_if **ois)
2678 {
2679  unsigned int i = 0;
2680  unsigned int sz;
2681 
2682  if (linkspace) {
2683  WARN(1, "linkspace already allocated\n");
2684  return -EEXIST;
2685  }
2686 
2687  if (max_ls == 0)
2688  while (ois[i++])
2689  max_ls += LINKS_PER_OCP_IF;
2690 
2691  sz = sizeof(struct omap_hwmod_link) * max_ls;
2692 
2693  pr_debug("omap_hwmod: %s: allocating %d byte linkspace (%d links)\n",
2694  __func__, sz, max_ls);
2695 
2696  linkspace = alloc_bootmem(sz);
2697 
2698  memset(linkspace, 0, sz);
2699 
2700  return 0;
2701 }
2702 
2703 /* Static functions intended only for use in soc_ops field function pointers */
2704 
2714 static int _omap2_wait_target_ready(struct omap_hwmod *oh)
2715 {
2716  if (!oh)
2717  return -EINVAL;
2718 
2719  if (oh->flags & HWMOD_NO_IDLEST)
2720  return 0;
2721 
2722  if (!_find_mpu_rt_port(oh))
2723  return 0;
2724 
2725  /* XXX check module SIDLEMODE, hardreset status, enabled clocks */
2726 
2727  return omap2_cm_wait_module_ready(oh->prcm.omap2.module_offs,
2728  oh->prcm.omap2.idlest_reg_id,
2729  oh->prcm.omap2.idlest_idle_bit);
2730 }
2731 
2741 static int _omap4_wait_target_ready(struct omap_hwmod *oh)
2742 {
2743  if (!oh)
2744  return -EINVAL;
2745 
2746  if (oh->flags & HWMOD_NO_IDLEST || !oh->clkdm)
2747  return 0;
2748 
2749  if (!_find_mpu_rt_port(oh))
2750  return 0;
2751 
2752  /* XXX check module SIDLEMODE, hardreset status */
2753 
2754  return omap4_cminst_wait_module_ready(oh->clkdm->prcm_partition,
2755  oh->clkdm->cm_inst,
2756  oh->clkdm->clkdm_offs,
2757  oh->prcm.omap4.clkctrl_offs);
2758 }
2759 
2769 static int _am33xx_wait_target_ready(struct omap_hwmod *oh)
2770 {
2771  if (!oh || !oh->clkdm)
2772  return -EINVAL;
2773 
2774  if (oh->flags & HWMOD_NO_IDLEST)
2775  return 0;
2776 
2777  if (!_find_mpu_rt_port(oh))
2778  return 0;
2779 
2780  /* XXX check module SIDLEMODE, hardreset status */
2781 
2782  return am33xx_cm_wait_module_ready(oh->clkdm->cm_inst,
2783  oh->clkdm->clkdm_offs,
2784  oh->prcm.omap4.clkctrl_offs);
2785 }
2786 
2798 static int _omap2_assert_hardreset(struct omap_hwmod *oh,
2799  struct omap_hwmod_rst_info *ohri)
2800 {
2801  return omap2_prm_assert_hardreset(oh->prcm.omap2.module_offs,
2802  ohri->rst_shift);
2803 }
2804 
2816 static int _omap2_deassert_hardreset(struct omap_hwmod *oh,
2817  struct omap_hwmod_rst_info *ohri)
2818 {
2819  return omap2_prm_deassert_hardreset(oh->prcm.omap2.module_offs,
2820  ohri->rst_shift,
2821  ohri->st_shift);
2822 }
2823 
2836 static int _omap2_is_hardreset_asserted(struct omap_hwmod *oh,
2837  struct omap_hwmod_rst_info *ohri)
2838 {
2839  return omap2_prm_is_hardreset_asserted(oh->prcm.omap2.module_offs,
2840  ohri->st_shift);
2841 }
2842 
2855 static int _omap4_assert_hardreset(struct omap_hwmod *oh,
2856  struct omap_hwmod_rst_info *ohri)
2857 {
2858  if (!oh->clkdm)
2859  return -EINVAL;
2860 
2862  oh->clkdm->pwrdm.ptr->prcm_partition,
2863  oh->clkdm->pwrdm.ptr->prcm_offs,
2864  oh->prcm.omap4.rstctrl_offs);
2865 }
2866 
2879 static int _omap4_deassert_hardreset(struct omap_hwmod *oh,
2880  struct omap_hwmod_rst_info *ohri)
2881 {
2882  if (!oh->clkdm)
2883  return -EINVAL;
2884 
2885  if (ohri->st_shift)
2886  pr_err("omap_hwmod: %s: %s: hwmod data error: OMAP4 does not support st_shift\n",
2887  oh->name, ohri->name);
2889  oh->clkdm->pwrdm.ptr->prcm_partition,
2890  oh->clkdm->pwrdm.ptr->prcm_offs,
2891  oh->prcm.omap4.rstctrl_offs);
2892 }
2893 
2906 static int _omap4_is_hardreset_asserted(struct omap_hwmod *oh,
2907  struct omap_hwmod_rst_info *ohri)
2908 {
2909  if (!oh->clkdm)
2910  return -EINVAL;
2911 
2913  oh->clkdm->pwrdm.ptr->prcm_partition,
2914  oh->clkdm->pwrdm.ptr->prcm_offs,
2915  oh->prcm.omap4.rstctrl_offs);
2916 }
2917 
2930 static int _am33xx_assert_hardreset(struct omap_hwmod *oh,
2931  struct omap_hwmod_rst_info *ohri)
2932 
2933 {
2935  oh->clkdm->pwrdm.ptr->prcm_offs,
2936  oh->prcm.omap4.rstctrl_offs);
2937 }
2938 
2951 static int _am33xx_deassert_hardreset(struct omap_hwmod *oh,
2952  struct omap_hwmod_rst_info *ohri)
2953 {
2954  if (ohri->st_shift)
2955  pr_err("omap_hwmod: %s: %s: hwmod data error: OMAP4 does not support st_shift\n",
2956  oh->name, ohri->name);
2957 
2959  oh->clkdm->pwrdm.ptr->prcm_offs,
2960  oh->prcm.omap4.rstctrl_offs,
2961  oh->prcm.omap4.rstst_offs);
2962 }
2963 
2976 static int _am33xx_is_hardreset_asserted(struct omap_hwmod *oh,
2977  struct omap_hwmod_rst_info *ohri)
2978 {
2980  oh->clkdm->pwrdm.ptr->prcm_offs,
2981  oh->prcm.omap4.rstctrl_offs);
2982 }
2983 
2984 /* Public functions */
2985 
2986 u32 omap_hwmod_read(struct omap_hwmod *oh, u16 reg_offs)
2987 {
2988  if (oh->flags & HWMOD_16BIT_REG)
2989  return __raw_readw(oh->_mpu_rt_va + reg_offs);
2990  else
2991  return __raw_readl(oh->_mpu_rt_va + reg_offs);
2992 }
2993 
2994 void omap_hwmod_write(u32 v, struct omap_hwmod *oh, u16 reg_offs)
2995 {
2996  if (oh->flags & HWMOD_16BIT_REG)
2997  __raw_writew(v, oh->_mpu_rt_va + reg_offs);
2998  else
2999  __raw_writel(v, oh->_mpu_rt_va + reg_offs);
3000 }
3001 
3012 {
3013  u32 v;
3014  int ret;
3015 
3016  if (!oh || !(oh->_sysc_cache))
3017  return -EINVAL;
3018 
3019  v = oh->_sysc_cache;
3020  ret = _set_softreset(oh, &v);
3021  if (ret)
3022  goto error;
3023  _write_sysconfig(v, oh);
3024 
3025 error:
3026  return ret;
3027 }
3028 
3045 {
3046  u32 v;
3047  int retval = 0;
3048 
3049  if (!oh)
3050  return -EINVAL;
3051 
3052  v = oh->_sysc_cache;
3053 
3054  retval = _set_slave_idlemode(oh, idlemode, &v);
3055  if (!retval)
3056  _write_sysconfig(v, oh);
3057 
3058  return retval;
3059 }
3060 
3068 struct omap_hwmod *omap_hwmod_lookup(const char *name)
3069 {
3070  struct omap_hwmod *oh;
3071 
3072  if (!name)
3073  return NULL;
3074 
3075  oh = _lookup(name);
3076 
3077  return oh;
3078 }
3079 
3092 int omap_hwmod_for_each(int (*fn)(struct omap_hwmod *oh, void *data),
3093  void *data)
3094 {
3095  struct omap_hwmod *temp_oh;
3096  int ret = 0;
3097 
3098  if (!fn)
3099  return -EINVAL;
3100 
3101  list_for_each_entry(temp_oh, &omap_hwmod_list, node) {
3102  ret = (*fn)(temp_oh, data);
3103  if (ret)
3104  break;
3105  }
3106 
3107  return ret;
3108 }
3109 
3122 {
3123  int r, i;
3124 
3125  if (!inited)
3126  return -EINVAL;
3127 
3128  if (!ois)
3129  return 0;
3130 
3131  if (!linkspace) {
3132  if (_alloc_linkspace(ois)) {
3133  pr_err("omap_hwmod: could not allocate link space\n");
3134  return -ENOMEM;
3135  }
3136  }
3137 
3138  i = 0;
3139  do {
3140  r = _register_link(ois[i]);
3141  WARN(r && r != -EEXIST,
3142  "omap_hwmod: _register_link(%s -> %s) returned %d\n",
3143  ois[i]->master->name, ois[i]->slave->name, r);
3144  } while (ois[++i]);
3145 
3146  return 0;
3147 }
3148 
3159 static void __init _ensure_mpu_hwmod_is_setup(struct omap_hwmod *oh)
3160 {
3161  if (!mpu_oh || mpu_oh->_state == _HWMOD_STATE_UNKNOWN)
3162  pr_err("omap_hwmod: %s: MPU initiator hwmod %s not yet registered\n",
3163  __func__, MPU_INITIATOR_NAME);
3164  else if (mpu_oh->_state == _HWMOD_STATE_REGISTERED && oh != mpu_oh)
3166 }
3167 
3179 int __init omap_hwmod_setup_one(const char *oh_name)
3180 {
3181  struct omap_hwmod *oh;
3182 
3183  pr_debug("omap_hwmod: %s: %s\n", oh_name, __func__);
3184 
3185  oh = _lookup(oh_name);
3186  if (!oh) {
3187  WARN(1, "omap_hwmod: %s: hwmod not yet registered\n", oh_name);
3188  return -EINVAL;
3189  }
3190 
3191  _ensure_mpu_hwmod_is_setup(oh);
3192 
3193  _init(oh, NULL);
3194  _setup(oh, NULL);
3195 
3196  return 0;
3197 }
3198 
3207 static int __init omap_hwmod_setup_all(void)
3208 {
3209  _ensure_mpu_hwmod_is_setup(NULL);
3210 
3211  omap_hwmod_for_each(_init, NULL);
3212  omap_hwmod_for_each(_setup, NULL);
3213 
3214  return 0;
3215 }
3216 core_initcall(omap_hwmod_setup_all);
3217 
3226 {
3227  int r;
3228  unsigned long flags;
3229 
3230  if (!oh)
3231  return -EINVAL;
3232 
3233  spin_lock_irqsave(&oh->_lock, flags);
3234  r = _enable(oh);
3235  spin_unlock_irqrestore(&oh->_lock, flags);
3236 
3237  return r;
3238 }
3239 
3248 {
3249  unsigned long flags;
3250 
3251  if (!oh)
3252  return -EINVAL;
3253 
3254  spin_lock_irqsave(&oh->_lock, flags);
3255  _idle(oh);
3256  spin_unlock_irqrestore(&oh->_lock, flags);
3257 
3258  return 0;
3259 }
3260 
3270 {
3271  unsigned long flags;
3272 
3273  if (!oh)
3274  return -EINVAL;
3275 
3276  spin_lock_irqsave(&oh->_lock, flags);
3277  _shutdown(oh);
3278  spin_unlock_irqrestore(&oh->_lock, flags);
3279 
3280  return 0;
3281 }
3282 
3290 {
3291  unsigned long flags;
3292 
3293  spin_lock_irqsave(&oh->_lock, flags);
3294  _enable_clocks(oh);
3295  spin_unlock_irqrestore(&oh->_lock, flags);
3296 
3297  return 0;
3298 }
3299 
3307 {
3308  unsigned long flags;
3309 
3310  spin_lock_irqsave(&oh->_lock, flags);
3311  _disable_clocks(oh);
3312  spin_unlock_irqrestore(&oh->_lock, flags);
3313 
3314  return 0;
3315 }
3316 
3329 {
3330  BUG_ON(!oh);
3331 
3332  if (!oh->class->sysc || !oh->class->sysc->sysc_flags) {
3333  WARN(1, "omap_device: %s: OCP barrier impossible due to device configuration\n",
3334  oh->name);
3335  return;
3336  }
3337 
3338  /*
3339  * Forces posted writes to complete on the OCP thread handling
3340  * register writes
3341  */
3342  omap_hwmod_read(oh, oh->class->sysc->sysc_offs);
3343 }
3344 
3354 {
3355  int r;
3356  unsigned long flags;
3357 
3358  if (!oh)
3359  return -EINVAL;
3360 
3361  spin_lock_irqsave(&oh->_lock, flags);
3362  r = _reset(oh);
3363  spin_unlock_irqrestore(&oh->_lock, flags);
3364 
3365  return r;
3366 }
3367 
3368 /*
3369  * IP block data retrieval functions
3370  */
3371 
3389 {
3390  struct omap_hwmod_ocp_if *os;
3391  struct list_head *p;
3392  int ret;
3393  int i = 0;
3394 
3395  ret = _count_mpu_irqs(oh) + _count_sdma_reqs(oh);
3396 
3397  p = oh->slave_ports.next;
3398 
3399  while (i < oh->slaves_cnt) {
3400  os = _fetch_next_ocp_if(&p, &i);
3401  ret += _count_ocp_if_addr_spaces(os);
3402  }
3403 
3404  return ret;
3405 }
3406 
3418 {
3419  struct omap_hwmod_ocp_if *os;
3420  struct list_head *p;
3421  int i, j, mpu_irqs_cnt, sdma_reqs_cnt, addr_cnt;
3422  int r = 0;
3423 
3424  /* For each IRQ, DMA, memory area, fill in array.*/
3425 
3426  mpu_irqs_cnt = _count_mpu_irqs(oh);
3427  for (i = 0; i < mpu_irqs_cnt; i++) {
3428  (res + r)->name = (oh->mpu_irqs + i)->name;
3429  (res + r)->start = (oh->mpu_irqs + i)->irq;
3430  (res + r)->end = (oh->mpu_irqs + i)->irq;
3431  (res + r)->flags = IORESOURCE_IRQ;
3432  r++;
3433  }
3434 
3435  sdma_reqs_cnt = _count_sdma_reqs(oh);
3436  for (i = 0; i < sdma_reqs_cnt; i++) {
3437  (res + r)->name = (oh->sdma_reqs + i)->name;
3438  (res + r)->start = (oh->sdma_reqs + i)->dma_req;
3439  (res + r)->end = (oh->sdma_reqs + i)->dma_req;
3440  (res + r)->flags = IORESOURCE_DMA;
3441  r++;
3442  }
3443 
3444  p = oh->slave_ports.next;
3445 
3446  i = 0;
3447  while (i < oh->slaves_cnt) {
3448  os = _fetch_next_ocp_if(&p, &i);
3449  addr_cnt = _count_ocp_if_addr_spaces(os);
3450 
3451  for (j = 0; j < addr_cnt; j++) {
3452  (res + r)->name = (os->addr + j)->name;
3453  (res + r)->start = (os->addr + j)->pa_start;
3454  (res + r)->end = (os->addr + j)->pa_end;
3455  (res + r)->flags = IORESOURCE_MEM;
3456  r++;
3457  }
3458  }
3459 
3460  return r;
3461 }
3462 
3474 {
3475  int i, sdma_reqs_cnt;
3476  int r = 0;
3477 
3478  sdma_reqs_cnt = _count_sdma_reqs(oh);
3479  for (i = 0; i < sdma_reqs_cnt; i++) {
3480  (res + r)->name = (oh->sdma_reqs + i)->name;
3481  (res + r)->start = (oh->sdma_reqs + i)->dma_req;
3482  (res + r)->end = (oh->sdma_reqs + i)->dma_req;
3483  (res + r)->flags = IORESOURCE_DMA;
3484  r++;
3485  }
3486 
3487  return r;
3488 }
3489 
3512 int omap_hwmod_get_resource_byname(struct omap_hwmod *oh, unsigned int type,
3513  const char *name, struct resource *rsrc)
3514 {
3515  int r;
3516  unsigned int irq, dma;
3517  u32 pa_start, pa_end;
3518 
3519  if (!oh || !rsrc)
3520  return -EINVAL;
3521 
3522  if (type == IORESOURCE_IRQ) {
3523  r = _get_mpu_irq_by_name(oh, name, &irq);
3524  if (r)
3525  return r;
3526 
3527  rsrc->start = irq;
3528  rsrc->end = irq;
3529  } else if (type == IORESOURCE_DMA) {
3530  r = _get_sdma_req_by_name(oh, name, &dma);
3531  if (r)
3532  return r;
3533 
3534  rsrc->start = dma;
3535  rsrc->end = dma;
3536  } else if (type == IORESOURCE_MEM) {
3537  r = _get_addr_space_by_name(oh, name, &pa_start, &pa_end);
3538  if (r)
3539  return r;
3540 
3541  rsrc->start = pa_start;
3542  rsrc->end = pa_end;
3543  } else {
3544  return -EINVAL;
3545  }
3546 
3547  rsrc->flags = type;
3548  rsrc->name = name;
3549 
3550  return 0;
3551 }
3552 
3565 {
3566  struct clk *c;
3567  struct omap_hwmod_ocp_if *oi;
3568 
3569  if (!oh)
3570  return NULL;
3571 
3572  if (oh->_clk) {
3573  c = oh->_clk;
3574  } else {
3575  oi = _find_mpu_rt_port(oh);
3576  if (!oi)
3577  return NULL;
3578  c = oi->_clk;
3579  }
3580 
3581  if (!c->clkdm)
3582  return NULL;
3583 
3584  return c->clkdm->pwrdm.ptr;
3585 
3586 }
3587 
3598 {
3599  if (!oh)
3600  return NULL;
3601 
3602  if (oh->_int_flags & _HWMOD_NO_MPU_PORT)
3603  return NULL;
3604 
3605  if (oh->_state == _HWMOD_STATE_UNKNOWN)
3606  return NULL;
3607 
3608  return oh->_mpu_rt_va;
3609 }
3610 
3626  struct omap_hwmod *init_oh)
3627 {
3628  return _add_initiator_dep(oh, init_oh);
3629 }
3630 
3631 /*
3632  * XXX what about functions for drivers to save/restore ocp_sysconfig
3633  * for context save/restore operations?
3634  */
3635 
3651  struct omap_hwmod *init_oh)
3652 {
3653  return _del_initiator_dep(oh, init_oh);
3654 }
3655 
3670 {
3671  unsigned long flags;
3672  u32 v;
3673 
3674  spin_lock_irqsave(&oh->_lock, flags);
3675 
3676  if (oh->class->sysc &&
3677  (oh->class->sysc->sysc_flags & SYSC_HAS_ENAWAKEUP)) {
3678  v = oh->_sysc_cache;
3679  _enable_wakeup(oh, &v);
3680  _write_sysconfig(v, oh);
3681  }
3682 
3683  _set_idle_ioring_wakeup(oh, true);
3684  spin_unlock_irqrestore(&oh->_lock, flags);
3685 
3686  return 0;
3687 }
3688 
3703 {
3704  unsigned long flags;
3705  u32 v;
3706 
3707  spin_lock_irqsave(&oh->_lock, flags);
3708 
3709  if (oh->class->sysc &&
3710  (oh->class->sysc->sysc_flags & SYSC_HAS_ENAWAKEUP)) {
3711  v = oh->_sysc_cache;
3712  _disable_wakeup(oh, &v);
3713  _write_sysconfig(v, oh);
3714  }
3715 
3716  _set_idle_ioring_wakeup(oh, false);
3717  spin_unlock_irqrestore(&oh->_lock, flags);
3718 
3719  return 0;
3720 }
3721 
3734 int omap_hwmod_assert_hardreset(struct omap_hwmod *oh, const char *name)
3735 {
3736  int ret;
3737  unsigned long flags;
3738 
3739  if (!oh)
3740  return -EINVAL;
3741 
3742  spin_lock_irqsave(&oh->_lock, flags);
3743  ret = _assert_hardreset(oh, name);
3744  spin_unlock_irqrestore(&oh->_lock, flags);
3745 
3746  return ret;
3747 }
3748 
3761 int omap_hwmod_deassert_hardreset(struct omap_hwmod *oh, const char *name)
3762 {
3763  int ret;
3764  unsigned long flags;
3765 
3766  if (!oh)
3767  return -EINVAL;
3768 
3769  spin_lock_irqsave(&oh->_lock, flags);
3770  ret = _deassert_hardreset(oh, name);
3771  spin_unlock_irqrestore(&oh->_lock, flags);
3772 
3773  return ret;
3774 }
3775 
3787 int omap_hwmod_read_hardreset(struct omap_hwmod *oh, const char *name)
3788 {
3789  int ret;
3790  unsigned long flags;
3791 
3792  if (!oh)
3793  return -EINVAL;
3794 
3795  spin_lock_irqsave(&oh->_lock, flags);
3796  ret = _read_hardreset(oh, name);
3797  spin_unlock_irqrestore(&oh->_lock, flags);
3798 
3799  return ret;
3800 }
3801 
3802 
3815 int omap_hwmod_for_each_by_class(const char *classname,
3816  int (*fn)(struct omap_hwmod *oh,
3817  void *user),
3818  void *user)
3819 {
3820  struct omap_hwmod *temp_oh;
3821  int ret = 0;
3822 
3823  if (!classname || !fn)
3824  return -EINVAL;
3825 
3826  pr_debug("omap_hwmod: %s: looking for modules of class %s\n",
3827  __func__, classname);
3828 
3829  list_for_each_entry(temp_oh, &omap_hwmod_list, node) {
3830  if (!strcmp(temp_oh->class->name, classname)) {
3831  pr_debug("omap_hwmod: %s: %s: calling callback fn\n",
3832  __func__, temp_oh->name);
3833  ret = (*fn)(temp_oh, user);
3834  if (ret)
3835  break;
3836  }
3837  }
3838 
3839  if (ret)
3840  pr_debug("omap_hwmod: %s: iterator terminated early: %d\n",
3841  __func__, ret);
3842 
3843  return ret;
3844 }
3845 
3858 {
3859  int ret;
3860  unsigned long flags;
3861 
3862  if (!oh)
3863  return -EINVAL;
3864 
3865  if (state != _HWMOD_STATE_DISABLED &&
3866  state != _HWMOD_STATE_ENABLED &&
3867  state != _HWMOD_STATE_IDLE)
3868  return -EINVAL;
3869 
3870  spin_lock_irqsave(&oh->_lock, flags);
3871 
3872  if (oh->_state != _HWMOD_STATE_REGISTERED) {
3873  ret = -EINVAL;
3874  goto ohsps_unlock;
3875  }
3876 
3877  oh->_postsetup_state = state;
3878  ret = 0;
3879 
3880 ohsps_unlock:
3881  spin_unlock_irqrestore(&oh->_lock, flags);
3882 
3883  return ret;
3884 }
3885 
3897 {
3898  struct powerdomain *pwrdm;
3899  int ret = 0;
3900 
3901  pwrdm = omap_hwmod_get_pwrdm(oh);
3902  if (pwrdm)
3903  ret = pwrdm_get_context_loss_count(pwrdm);
3904 
3905  return ret;
3906 }
3907 
3919 {
3920  if (!oh)
3921  return -EINVAL;
3922 
3923  if (oh->_state != _HWMOD_STATE_REGISTERED) {
3924  pr_err("omap_hwmod: %s: cannot prevent setup reset; in wrong state\n",
3925  oh->name);
3926  return -EINVAL;
3927  }
3928 
3929  oh->flags |= HWMOD_INIT_NO_RESET;
3930 
3931  return 0;
3932 }
3933 
3959 int omap_hwmod_pad_route_irq(struct omap_hwmod *oh, int pad_idx, int irq_idx)
3960 {
3961  int nr_irqs;
3962 
3963  might_sleep();
3964 
3965  if (!oh || !oh->mux || !oh->mpu_irqs || pad_idx < 0 ||
3966  pad_idx >= oh->mux->nr_pads_dynamic)
3967  return -EINVAL;
3968 
3969  /* Check the number of available mpu_irqs */
3970  for (nr_irqs = 0; oh->mpu_irqs[nr_irqs].irq >= 0; nr_irqs++)
3971  ;
3972 
3973  if (irq_idx >= nr_irqs)
3974  return -EINVAL;
3975 
3976  if (!oh->mux->irqs) {
3977  /* XXX What frees this? */
3978  oh->mux->irqs = kzalloc(sizeof(int) * oh->mux->nr_pads_dynamic,
3979  GFP_KERNEL);
3980  if (!oh->mux->irqs)
3981  return -ENOMEM;
3982  }
3983  oh->mux->irqs[pad_idx] = irq_idx;
3984 
3985  return 0;
3986 }
3987 
3996 {
3997  if (cpu_is_omap24xx() || cpu_is_omap34xx()) {
3998  soc_ops.wait_target_ready = _omap2_wait_target_ready;
3999  soc_ops.assert_hardreset = _omap2_assert_hardreset;
4000  soc_ops.deassert_hardreset = _omap2_deassert_hardreset;
4001  soc_ops.is_hardreset_asserted = _omap2_is_hardreset_asserted;
4002  } else if (cpu_is_omap44xx() || soc_is_omap54xx()) {
4003  soc_ops.enable_module = _omap4_enable_module;
4004  soc_ops.disable_module = _omap4_disable_module;
4005  soc_ops.wait_target_ready = _omap4_wait_target_ready;
4006  soc_ops.assert_hardreset = _omap4_assert_hardreset;
4007  soc_ops.deassert_hardreset = _omap4_deassert_hardreset;
4008  soc_ops.is_hardreset_asserted = _omap4_is_hardreset_asserted;
4009  soc_ops.init_clkdm = _init_clkdm;
4010  } else if (soc_is_am33xx()) {
4011  soc_ops.enable_module = _am33xx_enable_module;
4012  soc_ops.disable_module = _am33xx_disable_module;
4013  soc_ops.wait_target_ready = _am33xx_wait_target_ready;
4014  soc_ops.assert_hardreset = _am33xx_assert_hardreset;
4015  soc_ops.deassert_hardreset = _am33xx_deassert_hardreset;
4016  soc_ops.is_hardreset_asserted = _am33xx_is_hardreset_asserted;
4017  soc_ops.init_clkdm = _init_clkdm;
4018  } else {
4019  WARN(1, "omap_hwmod: unknown SoC type\n");
4020  }
4021 
4022  inited = true;
4023 }
4024 
4032 const char *omap_hwmod_get_main_clk(struct omap_hwmod *oh)
4033 {
4034  if (!oh)
4035  return NULL;
4036 
4037  return oh->main_clk;
4038 }