Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
omap_hwmod.h
Go to the documentation of this file.
1 /*
2  * omap_hwmod macros, structures
3  *
4  * Copyright (C) 2009-2011 Nokia Corporation
5  * Copyright (C) 2012 Texas Instruments, Inc.
6  * Paul Walmsley
7  *
8  * Created in collaboration with (alphabetical order): BenoĆ®t Cousson,
9  * Kevin Hilman, Tony Lindgren, Rajendra Nayak, Vikram Pandita, Sakari
10  * Poussa, Anand Sawant, Santosh Shilimkar, Richard Woodruff
11  *
12  * This program is free software; you can redistribute it and/or modify
13  * it under the terms of the GNU General Public License version 2 as
14  * published by the Free Software Foundation.
15  *
16  * These headers and macros are used to define OMAP on-chip module
17  * data and their integration with other OMAP modules and Linux.
18  * Copious documentation and references can also be found in the
19  * omap_hwmod code, in arch/arm/mach-omap2/omap_hwmod.c (as of this
20  * writing).
21  *
22  * To do:
23  * - add interconnect error log structures
24  * - add pinmuxing
25  * - init_conn_id_bit (CONNID_BIT_VECTOR)
26  * - implement default hwmod SMS/SDRC flags?
27  * - move Linux-specific data ("non-ROM data") out
28  *
29  */
30 #ifndef __ARCH_ARM_PLAT_OMAP_INCLUDE_MACH_OMAP_HWMOD_H
31 #define __ARCH_ARM_PLAT_OMAP_INCLUDE_MACH_OMAP_HWMOD_H
32 
33 #include <linux/kernel.h>
34 #include <linux/init.h>
35 #include <linux/list.h>
36 #include <linux/ioport.h>
37 #include <linux/spinlock.h>
38 #include <plat/cpu.h>
39 
40 struct omap_device;
41 
45 
46 /*
47  * OCP SYSCONFIG bit shifts/masks TYPE1. These are for IPs compliant
48  * with the original PRCM protocol defined for OMAP2420
49  */
50 #define SYSC_TYPE1_MIDLEMODE_SHIFT 12
51 #define SYSC_TYPE1_MIDLEMODE_MASK (0x3 << SYSC_TYPE1_MIDLEMODE_SHIFT)
52 #define SYSC_TYPE1_CLOCKACTIVITY_SHIFT 8
53 #define SYSC_TYPE1_CLOCKACTIVITY_MASK (0x3 << SYSC_TYPE1_CLOCKACTIVITY_SHIFT)
54 #define SYSC_TYPE1_SIDLEMODE_SHIFT 3
55 #define SYSC_TYPE1_SIDLEMODE_MASK (0x3 << SYSC_TYPE1_SIDLEMODE_SHIFT)
56 #define SYSC_TYPE1_ENAWAKEUP_SHIFT 2
57 #define SYSC_TYPE1_ENAWAKEUP_MASK (1 << SYSC_TYPE1_ENAWAKEUP_SHIFT)
58 #define SYSC_TYPE1_SOFTRESET_SHIFT 1
59 #define SYSC_TYPE1_SOFTRESET_MASK (1 << SYSC_TYPE1_SOFTRESET_SHIFT)
60 #define SYSC_TYPE1_AUTOIDLE_SHIFT 0
61 #define SYSC_TYPE1_AUTOIDLE_MASK (1 << SYSC_TYPE1_AUTOIDLE_SHIFT)
62 
63 /*
64  * OCP SYSCONFIG bit shifts/masks TYPE2. These are for IPs compliant
65  * with the new PRCM protocol defined for new OMAP4 IPs.
66  */
67 #define SYSC_TYPE2_SOFTRESET_SHIFT 0
68 #define SYSC_TYPE2_SOFTRESET_MASK (1 << SYSC_TYPE2_SOFTRESET_SHIFT)
69 #define SYSC_TYPE2_SIDLEMODE_SHIFT 2
70 #define SYSC_TYPE2_SIDLEMODE_MASK (0x3 << SYSC_TYPE2_SIDLEMODE_SHIFT)
71 #define SYSC_TYPE2_MIDLEMODE_SHIFT 4
72 #define SYSC_TYPE2_MIDLEMODE_MASK (0x3 << SYSC_TYPE2_MIDLEMODE_SHIFT)
73 #define SYSC_TYPE2_DMADISABLE_SHIFT 16
74 #define SYSC_TYPE2_DMADISABLE_MASK (0x1 << SYSC_TYPE2_DMADISABLE_SHIFT)
75 
76 /*
77  * OCP SYSCONFIG bit shifts/masks TYPE3.
78  * This is applicable for some IPs present in AM33XX
79  */
80 #define SYSC_TYPE3_SIDLEMODE_SHIFT 0
81 #define SYSC_TYPE3_SIDLEMODE_MASK (0x3 << SYSC_TYPE3_SIDLEMODE_SHIFT)
82 #define SYSC_TYPE3_MIDLEMODE_SHIFT 2
83 #define SYSC_TYPE3_MIDLEMODE_MASK (0x3 << SYSC_TYPE3_MIDLEMODE_SHIFT)
84 
85 /* OCP SYSSTATUS bit shifts/masks */
86 #define SYSS_RESETDONE_SHIFT 0
87 #define SYSS_RESETDONE_MASK (1 << SYSS_RESETDONE_SHIFT)
88 
89 /* Master standby/slave idle mode flags */
90 #define HWMOD_IDLEMODE_FORCE (1 << 0)
91 #define HWMOD_IDLEMODE_NO (1 << 1)
92 #define HWMOD_IDLEMODE_SMART (1 << 2)
93 #define HWMOD_IDLEMODE_SMART_WKUP (1 << 3)
94 
95 /* modulemode control type (SW or HW) */
96 #define MODULEMODE_HWCTRL 1
97 #define MODULEMODE_SWCTRL 2
98 
99 
108  int nr_pads;
112  int *irqs;
113  bool enabled;
114 };
115 
126  const char *name;
128 };
129 
140  const char *name;
142 };
143 
154  const char *name;
157 };
158 
169  const char *role;
170  const char *clk;
171  struct clk *_clk;
172 };
173 
174 
175 /* omap_hwmod_omap2_firewall.flags bits */
176 #define OMAP_FIREWALL_L3 (1 << 0)
177 #define OMAP_FIREWALL_L4 (1 << 1)
178 
191 };
192 
193 
194 /*
195  * omap_hwmod_addr_space.flags bits
196  *
197  * ADDR_MAP_ON_INIT: Map this address space during omap_hwmod init.
198  * ADDR_TYPE_RT: Address space contains module register target data.
199  */
200 #define ADDR_MAP_ON_INIT (1 << 0) /* XXX does not belong */
201 #define ADDR_TYPE_RT (1 << 1)
202 
214  const char *name;
218 };
219 
220 
221 /*
222  * omap_hwmod_ocp_if.user bits: these indicate the initiators that use this
223  * interface to interact with the hwmod. Used to add sleep dependencies
224  * when the module is enabled or disabled.
225  */
226 #define OCP_USER_MPU (1 << 0)
227 #define OCP_USER_SDMA (1 << 1)
228 #define OCP_USER_DSP (1 << 2)
229 #define OCP_USER_IVA (1 << 3)
230 
231 /* omap_hwmod_ocp_if.flags bits */
232 #define OCPIF_SWSUP_IDLE (1 << 0)
233 #define OCPIF_CAN_BURST (1 << 1)
234 
235 /* omap_hwmod_ocp_if._int_flags possibilities */
236 #define _OCPIF_INT_FLAGS_REGISTERED (1 << 0)
237 
238 
259  struct omap_hwmod *slave;
261  const char *clk;
262  struct clk *_clk;
263  union {
265  } fw;
270 };
271 
272 
273 /* Macros for use in struct omap_hwmod_sysconfig */
274 
275 /* Flags for use in omap_hwmod_sysconfig.idlemodes */
276 #define MASTER_STANDBY_SHIFT 4
277 #define SLAVE_IDLE_SHIFT 0
278 #define SIDLE_FORCE (HWMOD_IDLEMODE_FORCE << SLAVE_IDLE_SHIFT)
279 #define SIDLE_NO (HWMOD_IDLEMODE_NO << SLAVE_IDLE_SHIFT)
280 #define SIDLE_SMART (HWMOD_IDLEMODE_SMART << SLAVE_IDLE_SHIFT)
281 #define SIDLE_SMART_WKUP (HWMOD_IDLEMODE_SMART_WKUP << SLAVE_IDLE_SHIFT)
282 #define MSTANDBY_FORCE (HWMOD_IDLEMODE_FORCE << MASTER_STANDBY_SHIFT)
283 #define MSTANDBY_NO (HWMOD_IDLEMODE_NO << MASTER_STANDBY_SHIFT)
284 #define MSTANDBY_SMART (HWMOD_IDLEMODE_SMART << MASTER_STANDBY_SHIFT)
285 #define MSTANDBY_SMART_WKUP (HWMOD_IDLEMODE_SMART_WKUP << MASTER_STANDBY_SHIFT)
286 
287 /* omap_hwmod_sysconfig.sysc_flags capability flags */
288 #define SYSC_HAS_AUTOIDLE (1 << 0)
289 #define SYSC_HAS_SOFTRESET (1 << 1)
290 #define SYSC_HAS_ENAWAKEUP (1 << 2)
291 #define SYSC_HAS_EMUFREE (1 << 3)
292 #define SYSC_HAS_CLOCKACTIVITY (1 << 4)
293 #define SYSC_HAS_SIDLEMODE (1 << 5)
294 #define SYSC_HAS_MIDLEMODE (1 << 6)
295 #define SYSS_HAS_RESET_STATUS (1 << 7)
296 #define SYSC_NO_CACHE (1 << 8) /* XXX SW flag, belongs elsewhere */
297 #define SYSC_HAS_RESET_STATUS (1 << 9)
298 #define SYSC_HAS_DMADISABLE (1 << 10)
299 
300 /* omap_hwmod_sysconfig.clockact flags */
301 #define CLOCKACT_TEST_BOTH 0x0
302 #define CLOCKACT_TEST_MAIN 0x1
303 #define CLOCKACT_TEST_ICLK 0x2
304 #define CLOCKACT_TEST_NONE 0x3
305 
324 };
325 
361 };
362 
385 };
386 
387 /*
388  * Possible values for struct omap_hwmod_omap4_prcm.flags
389  *
390  * HWMOD_OMAP4_NO_CONTEXT_LOSS_BIT: Some IP blocks don't have a PRCM
391  * module-level context loss register associated with them; this
392  * flag bit should be set in those cases
393  */
394 #define HWMOD_OMAP4_NO_CONTEXT_LOSS_BIT (1 << 0)
395 
419 };
420 
421 
422 /*
423  * omap_hwmod.flags definitions
424  *
425  * HWMOD_SWSUP_SIDLE: omap_hwmod code should manually bring module in and out
426  * of idle, rather than relying on module smart-idle
427  * HWMOD_SWSUP_MSTDBY: omap_hwmod code should manually bring module in and out
428  * of standby, rather than relying on module smart-standby
429  * HWMOD_INIT_NO_RESET: don't reset this module at boot - important for
430  * SDRAM controller, etc. XXX probably belongs outside the main hwmod file
431  * XXX Should be HWMOD_SETUP_NO_RESET
432  * HWMOD_INIT_NO_IDLE: don't idle this module at boot - important for SDRAM
433  * controller, etc. XXX probably belongs outside the main hwmod file
434  * XXX Should be HWMOD_SETUP_NO_IDLE
435  * HWMOD_NO_OCP_AUTOIDLE: disable module autoidle (OCP_SYSCONFIG.AUTOIDLE)
436  * when module is enabled, rather than the default, which is to
437  * enable autoidle
438  * HWMOD_SET_DEFAULT_CLOCKACT: program CLOCKACTIVITY bits at startup
439  * HWMOD_NO_IDLEST: this module does not have idle status - this is the case
440  * only for few initiator modules on OMAP2 & 3.
441  * HWMOD_CONTROL_OPT_CLKS_IN_RESET: Enable all optional clocks during reset.
442  * This is needed for devices like DSS that require optional clocks enabled
443  * in order to complete the reset. Optional clocks will be disabled
444  * again after the reset.
445  * HWMOD_16BIT_REG: Module has 16bit registers
446  * HWMOD_EXT_OPT_MAIN_CLK: The only main functional clock source for
447  * this IP block comes from an off-chip source and is not always
448  * enabled. This prevents the hwmod code from being able to
449  * enable and reset the IP block early. XXX Eventually it should
450  * be possible to query the clock framework for this information.
451  */
452 #define HWMOD_SWSUP_SIDLE (1 << 0)
453 #define HWMOD_SWSUP_MSTANDBY (1 << 1)
454 #define HWMOD_INIT_NO_RESET (1 << 2)
455 #define HWMOD_INIT_NO_IDLE (1 << 3)
456 #define HWMOD_NO_OCP_AUTOIDLE (1 << 4)
457 #define HWMOD_SET_DEFAULT_CLOCKACT (1 << 5)
458 #define HWMOD_NO_IDLEST (1 << 6)
459 #define HWMOD_CONTROL_OPT_CLKS_IN_RESET (1 << 7)
460 #define HWMOD_16BIT_REG (1 << 8)
461 #define HWMOD_EXT_OPT_MAIN_CLK (1 << 9)
462 
463 /*
464  * omap_hwmod._int_flags definitions
465  * These are for internal use only and are managed by the omap_hwmod code.
466  *
467  * _HWMOD_NO_MPU_PORT: no path exists for the MPU to write to this module
468  * _HWMOD_WAKEUP_ENABLED: set when the omap_hwmod code has enabled ENAWAKEUP
469  * _HWMOD_SYSCONFIG_LOADED: set when the OCP_SYSCONFIG value has been cached
470  * _HWMOD_SKIP_ENABLE: set if hwmod enabled during init (HWMOD_INIT_NO_IDLE) -
471  * causes the first call to _enable() to only update the pinmux
472  */
473 #define _HWMOD_NO_MPU_PORT (1 << 0)
474 #define _HWMOD_WAKEUP_ENABLED (1 << 1)
475 #define _HWMOD_SYSCONFIG_LOADED (1 << 2)
476 #define _HWMOD_SKIP_ENABLE (1 << 3)
477 
478 /*
479  * omap_hwmod._state definitions
480  *
481  * INITIALIZED: reset (optionally), initialized, enabled, disabled
482  * (optionally)
483  *
484  *
485  */
486 #define _HWMOD_STATE_UNKNOWN 0
487 #define _HWMOD_STATE_REGISTERED 1
488 #define _HWMOD_STATE_CLKS_INITED 2
489 #define _HWMOD_STATE_INITIALIZED 3
490 #define _HWMOD_STATE_ENABLED 4
491 #define _HWMOD_STATE_IDLE 5
492 #define _HWMOD_STATE_DISABLED 6
493 
519  const char *name;
522  int (*pre_shutdown)(struct omap_hwmod *oh);
523  int (*reset)(struct omap_hwmod *oh);
524 };
525 
533  struct list_head node;
534 };
535 
573 struct omap_hwmod {
574  const char *name;
575  struct omap_hwmod_class *class;
576  struct omap_device *od;
581  union {
584  } prcm;
585  const char *main_clk;
586  struct clk *_clk;
588  char *clkdm_name;
590  struct list_head master_ports; /* connect to *_IA */
591  struct list_head slave_ports; /* connect to *_TA */
592  void *dev_attr;
596  struct list_head node;
608 };
609 
610 struct omap_hwmod *omap_hwmod_lookup(const char *name);
611 int omap_hwmod_for_each(int (*fn)(struct omap_hwmod *oh, void *data),
612  void *data);
613 
614 int __init omap_hwmod_setup_one(const char *name);
615 
616 int omap_hwmod_enable(struct omap_hwmod *oh);
617 int omap_hwmod_idle(struct omap_hwmod *oh);
618 int omap_hwmod_shutdown(struct omap_hwmod *oh);
619 
620 int omap_hwmod_assert_hardreset(struct omap_hwmod *oh, const char *name);
621 int omap_hwmod_deassert_hardreset(struct omap_hwmod *oh, const char *name);
622 int omap_hwmod_read_hardreset(struct omap_hwmod *oh, const char *name);
623 
624 int omap_hwmod_enable_clocks(struct omap_hwmod *oh);
625 int omap_hwmod_disable_clocks(struct omap_hwmod *oh);
626 
627 int omap_hwmod_set_slave_idlemode(struct omap_hwmod *oh, u8 idlemode);
628 int omap_hwmod_set_ocp_autoidle(struct omap_hwmod *oh, u8 autoidle);
629 
630 int omap_hwmod_reset(struct omap_hwmod *oh);
631 void omap_hwmod_ocp_barrier(struct omap_hwmod *oh);
632 
633 void omap_hwmod_write(u32 v, struct omap_hwmod *oh, u16 reg_offs);
634 u32 omap_hwmod_read(struct omap_hwmod *oh, u16 reg_offs);
635 int omap_hwmod_softreset(struct omap_hwmod *oh);
636 
637 int omap_hwmod_count_resources(struct omap_hwmod *oh);
638 int omap_hwmod_fill_resources(struct omap_hwmod *oh, struct resource *res);
639 int omap_hwmod_fill_dma_resources(struct omap_hwmod *oh, struct resource *res);
640 int omap_hwmod_get_resource_byname(struct omap_hwmod *oh, unsigned int type,
641  const char *name, struct resource *res);
642 
643 struct powerdomain *omap_hwmod_get_pwrdm(struct omap_hwmod *oh);
645 
647  struct omap_hwmod *init_oh);
649  struct omap_hwmod *init_oh);
650 
651 int omap_hwmod_enable_wakeup(struct omap_hwmod *oh);
652 int omap_hwmod_disable_wakeup(struct omap_hwmod *oh);
653 
654 int omap_hwmod_for_each_by_class(const char *classname,
655  int (*fn)(struct omap_hwmod *oh,
656  void *user),
657  void *user);
658 
661 
662 int omap_hwmod_no_setup_reset(struct omap_hwmod *oh);
663 
664 int omap_hwmod_pad_route_irq(struct omap_hwmod *oh, int pad_idx, int irq_idx);
665 
666 extern void __init omap_hwmod_init(void);
667 
668 const char *omap_hwmod_get_main_clk(struct omap_hwmod *oh);
669 
670 /*
671  * Chip variant-specific hwmod init routines - XXX should be converted
672  * to use initcalls once the initial boot ordering is straightened out
673  */
674 extern int omap2420_hwmod_init(void);
675 extern int omap2430_hwmod_init(void);
676 extern int omap3xxx_hwmod_init(void);
677 extern int omap44xx_hwmod_init(void);
678 extern int am33xx_hwmod_init(void);
679 
680 extern int __init omap_hwmod_register_links(struct omap_hwmod_ocp_if **ois);
681 
682 #endif