1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * omap_hwmod macros, structures 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (C) 2009-2011 Nokia Corporation 6*4882a593Smuzhiyun * Copyright (C) 2011-2012 Texas Instruments, Inc. 7*4882a593Smuzhiyun * Paul Walmsley 8*4882a593Smuzhiyun * 9*4882a593Smuzhiyun * Created in collaboration with (alphabetical order): Benoît Cousson, 10*4882a593Smuzhiyun * Kevin Hilman, Tony Lindgren, Rajendra Nayak, Vikram Pandita, Sakari 11*4882a593Smuzhiyun * Poussa, Anand Sawant, Santosh Shilimkar, Richard Woodruff 12*4882a593Smuzhiyun * 13*4882a593Smuzhiyun * These headers and macros are used to define OMAP on-chip module 14*4882a593Smuzhiyun * data and their integration with other OMAP modules and Linux. 15*4882a593Smuzhiyun * Copious documentation and references can also be found in the 16*4882a593Smuzhiyun * omap_hwmod code, in arch/arm/mach-omap2/omap_hwmod.c (as of this 17*4882a593Smuzhiyun * writing). 18*4882a593Smuzhiyun * 19*4882a593Smuzhiyun * To do: 20*4882a593Smuzhiyun * - add interconnect error log structures 21*4882a593Smuzhiyun * - init_conn_id_bit (CONNID_BIT_VECTOR) 22*4882a593Smuzhiyun * - implement default hwmod SMS/SDRC flags? 23*4882a593Smuzhiyun * - move Linux-specific data ("non-ROM data") out 24*4882a593Smuzhiyun */ 25*4882a593Smuzhiyun #ifndef __ARCH_ARM_PLAT_OMAP_INCLUDE_MACH_OMAP_HWMOD_H 26*4882a593Smuzhiyun #define __ARCH_ARM_PLAT_OMAP_INCLUDE_MACH_OMAP_HWMOD_H 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun #include <linux/kernel.h> 29*4882a593Smuzhiyun #include <linux/init.h> 30*4882a593Smuzhiyun #include <linux/list.h> 31*4882a593Smuzhiyun #include <linux/ioport.h> 32*4882a593Smuzhiyun #include <linux/spinlock.h> 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun struct omap_device; 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun extern struct sysc_regbits omap_hwmod_sysc_type1; 37*4882a593Smuzhiyun extern struct sysc_regbits omap_hwmod_sysc_type2; 38*4882a593Smuzhiyun extern struct sysc_regbits omap_hwmod_sysc_type3; 39*4882a593Smuzhiyun extern struct sysc_regbits omap34xx_sr_sysc_fields; 40*4882a593Smuzhiyun extern struct sysc_regbits omap36xx_sr_sysc_fields; 41*4882a593Smuzhiyun extern struct sysc_regbits omap3_sham_sysc_fields; 42*4882a593Smuzhiyun extern struct sysc_regbits omap3xxx_aes_sysc_fields; 43*4882a593Smuzhiyun extern struct sysc_regbits omap_hwmod_sysc_type_mcasp; 44*4882a593Smuzhiyun extern struct sysc_regbits omap_hwmod_sysc_type_usb_host_fs; 45*4882a593Smuzhiyun 46*4882a593Smuzhiyun /* 47*4882a593Smuzhiyun * OCP SYSCONFIG bit shifts/masks TYPE1. These are for IPs compliant 48*4882a593Smuzhiyun * with the original PRCM protocol defined for OMAP2420 49*4882a593Smuzhiyun */ 50*4882a593Smuzhiyun #define SYSC_TYPE1_MIDLEMODE_SHIFT 12 51*4882a593Smuzhiyun #define SYSC_TYPE1_MIDLEMODE_MASK (0x3 << SYSC_TYPE1_MIDLEMODE_SHIFT) 52*4882a593Smuzhiyun #define SYSC_TYPE1_CLOCKACTIVITY_SHIFT 8 53*4882a593Smuzhiyun #define SYSC_TYPE1_CLOCKACTIVITY_MASK (0x3 << SYSC_TYPE1_CLOCKACTIVITY_SHIFT) 54*4882a593Smuzhiyun #define SYSC_TYPE1_SIDLEMODE_SHIFT 3 55*4882a593Smuzhiyun #define SYSC_TYPE1_SIDLEMODE_MASK (0x3 << SYSC_TYPE1_SIDLEMODE_SHIFT) 56*4882a593Smuzhiyun #define SYSC_TYPE1_ENAWAKEUP_SHIFT 2 57*4882a593Smuzhiyun #define SYSC_TYPE1_ENAWAKEUP_MASK (1 << SYSC_TYPE1_ENAWAKEUP_SHIFT) 58*4882a593Smuzhiyun #define SYSC_TYPE1_SOFTRESET_SHIFT 1 59*4882a593Smuzhiyun #define SYSC_TYPE1_SOFTRESET_MASK (1 << SYSC_TYPE1_SOFTRESET_SHIFT) 60*4882a593Smuzhiyun #define SYSC_TYPE1_AUTOIDLE_SHIFT 0 61*4882a593Smuzhiyun #define SYSC_TYPE1_AUTOIDLE_MASK (1 << SYSC_TYPE1_AUTOIDLE_SHIFT) 62*4882a593Smuzhiyun 63*4882a593Smuzhiyun /* 64*4882a593Smuzhiyun * OCP SYSCONFIG bit shifts/masks TYPE2. These are for IPs compliant 65*4882a593Smuzhiyun * with the new PRCM protocol defined for new OMAP4 IPs. 66*4882a593Smuzhiyun */ 67*4882a593Smuzhiyun #define SYSC_TYPE2_SOFTRESET_SHIFT 0 68*4882a593Smuzhiyun #define SYSC_TYPE2_SOFTRESET_MASK (1 << SYSC_TYPE2_SOFTRESET_SHIFT) 69*4882a593Smuzhiyun #define SYSC_TYPE2_SIDLEMODE_SHIFT 2 70*4882a593Smuzhiyun #define SYSC_TYPE2_SIDLEMODE_MASK (0x3 << SYSC_TYPE2_SIDLEMODE_SHIFT) 71*4882a593Smuzhiyun #define SYSC_TYPE2_MIDLEMODE_SHIFT 4 72*4882a593Smuzhiyun #define SYSC_TYPE2_MIDLEMODE_MASK (0x3 << SYSC_TYPE2_MIDLEMODE_SHIFT) 73*4882a593Smuzhiyun #define SYSC_TYPE2_DMADISABLE_SHIFT 16 74*4882a593Smuzhiyun #define SYSC_TYPE2_DMADISABLE_MASK (0x1 << SYSC_TYPE2_DMADISABLE_SHIFT) 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun /* 77*4882a593Smuzhiyun * OCP SYSCONFIG bit shifts/masks TYPE3. 78*4882a593Smuzhiyun * This is applicable for some IPs present in AM33XX 79*4882a593Smuzhiyun */ 80*4882a593Smuzhiyun #define SYSC_TYPE3_SIDLEMODE_SHIFT 0 81*4882a593Smuzhiyun #define SYSC_TYPE3_SIDLEMODE_MASK (0x3 << SYSC_TYPE3_SIDLEMODE_SHIFT) 82*4882a593Smuzhiyun #define SYSC_TYPE3_MIDLEMODE_SHIFT 2 83*4882a593Smuzhiyun #define SYSC_TYPE3_MIDLEMODE_MASK (0x3 << SYSC_TYPE3_MIDLEMODE_SHIFT) 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun /* OCP SYSSTATUS bit shifts/masks */ 86*4882a593Smuzhiyun #define SYSS_RESETDONE_SHIFT 0 87*4882a593Smuzhiyun #define SYSS_RESETDONE_MASK (1 << SYSS_RESETDONE_SHIFT) 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun /* Master standby/slave idle mode flags */ 90*4882a593Smuzhiyun #define HWMOD_IDLEMODE_FORCE (1 << 0) 91*4882a593Smuzhiyun #define HWMOD_IDLEMODE_NO (1 << 1) 92*4882a593Smuzhiyun #define HWMOD_IDLEMODE_SMART (1 << 2) 93*4882a593Smuzhiyun #define HWMOD_IDLEMODE_SMART_WKUP (1 << 3) 94*4882a593Smuzhiyun 95*4882a593Smuzhiyun /* modulemode control type (SW or HW) */ 96*4882a593Smuzhiyun #define MODULEMODE_HWCTRL 1 97*4882a593Smuzhiyun #define MODULEMODE_SWCTRL 2 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun #define DEBUG_OMAP2UART1_FLAGS 0 100*4882a593Smuzhiyun #define DEBUG_OMAP2UART2_FLAGS 0 101*4882a593Smuzhiyun #define DEBUG_OMAP2UART3_FLAGS 0 102*4882a593Smuzhiyun #define DEBUG_OMAP3UART3_FLAGS 0 103*4882a593Smuzhiyun #define DEBUG_OMAP3UART4_FLAGS 0 104*4882a593Smuzhiyun #define DEBUG_OMAP4UART3_FLAGS 0 105*4882a593Smuzhiyun #define DEBUG_OMAP4UART4_FLAGS 0 106*4882a593Smuzhiyun #define DEBUG_TI81XXUART1_FLAGS 0 107*4882a593Smuzhiyun #define DEBUG_TI81XXUART2_FLAGS 0 108*4882a593Smuzhiyun #define DEBUG_TI81XXUART3_FLAGS 0 109*4882a593Smuzhiyun #define DEBUG_AM33XXUART1_FLAGS 0 110*4882a593Smuzhiyun 111*4882a593Smuzhiyun #define DEBUG_OMAPUART_FLAGS (HWMOD_INIT_NO_IDLE | HWMOD_INIT_NO_RESET) 112*4882a593Smuzhiyun 113*4882a593Smuzhiyun #ifdef CONFIG_OMAP_GPMC_DEBUG 114*4882a593Smuzhiyun #define DEBUG_OMAP_GPMC_HWMOD_FLAGS HWMOD_INIT_NO_RESET 115*4882a593Smuzhiyun #else 116*4882a593Smuzhiyun #define DEBUG_OMAP_GPMC_HWMOD_FLAGS 0 117*4882a593Smuzhiyun #endif 118*4882a593Smuzhiyun 119*4882a593Smuzhiyun #if defined(CONFIG_DEBUG_OMAP2UART1) 120*4882a593Smuzhiyun #undef DEBUG_OMAP2UART1_FLAGS 121*4882a593Smuzhiyun #define DEBUG_OMAP2UART1_FLAGS DEBUG_OMAPUART_FLAGS 122*4882a593Smuzhiyun #elif defined(CONFIG_DEBUG_OMAP2UART2) 123*4882a593Smuzhiyun #undef DEBUG_OMAP2UART2_FLAGS 124*4882a593Smuzhiyun #define DEBUG_OMAP2UART2_FLAGS DEBUG_OMAPUART_FLAGS 125*4882a593Smuzhiyun #elif defined(CONFIG_DEBUG_OMAP2UART3) 126*4882a593Smuzhiyun #undef DEBUG_OMAP2UART3_FLAGS 127*4882a593Smuzhiyun #define DEBUG_OMAP2UART3_FLAGS DEBUG_OMAPUART_FLAGS 128*4882a593Smuzhiyun #elif defined(CONFIG_DEBUG_OMAP3UART3) 129*4882a593Smuzhiyun #undef DEBUG_OMAP3UART3_FLAGS 130*4882a593Smuzhiyun #define DEBUG_OMAP3UART3_FLAGS DEBUG_OMAPUART_FLAGS 131*4882a593Smuzhiyun #elif defined(CONFIG_DEBUG_OMAP3UART4) 132*4882a593Smuzhiyun #undef DEBUG_OMAP3UART4_FLAGS 133*4882a593Smuzhiyun #define DEBUG_OMAP3UART4_FLAGS DEBUG_OMAPUART_FLAGS 134*4882a593Smuzhiyun #elif defined(CONFIG_DEBUG_OMAP4UART3) 135*4882a593Smuzhiyun #undef DEBUG_OMAP4UART3_FLAGS 136*4882a593Smuzhiyun #define DEBUG_OMAP4UART3_FLAGS DEBUG_OMAPUART_FLAGS 137*4882a593Smuzhiyun #elif defined(CONFIG_DEBUG_OMAP4UART4) 138*4882a593Smuzhiyun #undef DEBUG_OMAP4UART4_FLAGS 139*4882a593Smuzhiyun #define DEBUG_OMAP4UART4_FLAGS DEBUG_OMAPUART_FLAGS 140*4882a593Smuzhiyun #elif defined(CONFIG_DEBUG_TI81XXUART1) 141*4882a593Smuzhiyun #undef DEBUG_TI81XXUART1_FLAGS 142*4882a593Smuzhiyun #define DEBUG_TI81XXUART1_FLAGS DEBUG_OMAPUART_FLAGS 143*4882a593Smuzhiyun #elif defined(CONFIG_DEBUG_TI81XXUART2) 144*4882a593Smuzhiyun #undef DEBUG_TI81XXUART2_FLAGS 145*4882a593Smuzhiyun #define DEBUG_TI81XXUART2_FLAGS DEBUG_OMAPUART_FLAGS 146*4882a593Smuzhiyun #elif defined(CONFIG_DEBUG_TI81XXUART3) 147*4882a593Smuzhiyun #undef DEBUG_TI81XXUART3_FLAGS 148*4882a593Smuzhiyun #define DEBUG_TI81XXUART3_FLAGS DEBUG_OMAPUART_FLAGS 149*4882a593Smuzhiyun #elif defined(CONFIG_DEBUG_AM33XXUART1) 150*4882a593Smuzhiyun #undef DEBUG_AM33XXUART1_FLAGS 151*4882a593Smuzhiyun #define DEBUG_AM33XXUART1_FLAGS DEBUG_OMAPUART_FLAGS 152*4882a593Smuzhiyun #endif 153*4882a593Smuzhiyun 154*4882a593Smuzhiyun /** 155*4882a593Smuzhiyun * struct omap_hwmod_rst_info - IPs reset lines use by hwmod 156*4882a593Smuzhiyun * @name: name of the reset line (module local name) 157*4882a593Smuzhiyun * @rst_shift: Offset of the reset bit 158*4882a593Smuzhiyun * @st_shift: Offset of the reset status bit (OMAP2/3 only) 159*4882a593Smuzhiyun * 160*4882a593Smuzhiyun * @name should be something short, e.g., "cpu0" or "rst". It is defined 161*4882a593Smuzhiyun * locally to the hwmod. 162*4882a593Smuzhiyun */ 163*4882a593Smuzhiyun struct omap_hwmod_rst_info { 164*4882a593Smuzhiyun const char *name; 165*4882a593Smuzhiyun u8 rst_shift; 166*4882a593Smuzhiyun u8 st_shift; 167*4882a593Smuzhiyun }; 168*4882a593Smuzhiyun 169*4882a593Smuzhiyun /** 170*4882a593Smuzhiyun * struct omap_hwmod_opt_clk - optional clocks used by this hwmod 171*4882a593Smuzhiyun * @role: "sys", "32k", "tv", etc -- for use in clk_get() 172*4882a593Smuzhiyun * @clk: opt clock: OMAP clock name 173*4882a593Smuzhiyun * @_clk: pointer to the struct clk (filled in at runtime) 174*4882a593Smuzhiyun * 175*4882a593Smuzhiyun * The module's interface clock and main functional clock should not 176*4882a593Smuzhiyun * be added as optional clocks. 177*4882a593Smuzhiyun */ 178*4882a593Smuzhiyun struct omap_hwmod_opt_clk { 179*4882a593Smuzhiyun const char *role; 180*4882a593Smuzhiyun const char *clk; 181*4882a593Smuzhiyun struct clk *_clk; 182*4882a593Smuzhiyun }; 183*4882a593Smuzhiyun 184*4882a593Smuzhiyun 185*4882a593Smuzhiyun /* omap_hwmod_omap2_firewall.flags bits */ 186*4882a593Smuzhiyun #define OMAP_FIREWALL_L3 (1 << 0) 187*4882a593Smuzhiyun #define OMAP_FIREWALL_L4 (1 << 1) 188*4882a593Smuzhiyun 189*4882a593Smuzhiyun /** 190*4882a593Smuzhiyun * struct omap_hwmod_omap2_firewall - OMAP2/3 device firewall data 191*4882a593Smuzhiyun * @l3_perm_bit: bit shift for L3_PM_*_PERMISSION_* 192*4882a593Smuzhiyun * @l4_fw_region: L4 firewall region ID 193*4882a593Smuzhiyun * @l4_prot_group: L4 protection group ID 194*4882a593Smuzhiyun * @flags: (see omap_hwmod_omap2_firewall.flags macros above) 195*4882a593Smuzhiyun */ 196*4882a593Smuzhiyun struct omap_hwmod_omap2_firewall { 197*4882a593Smuzhiyun u8 l3_perm_bit; 198*4882a593Smuzhiyun u8 l4_fw_region; 199*4882a593Smuzhiyun u8 l4_prot_group; 200*4882a593Smuzhiyun u8 flags; 201*4882a593Smuzhiyun }; 202*4882a593Smuzhiyun 203*4882a593Smuzhiyun /* 204*4882a593Smuzhiyun * omap_hwmod_ocp_if.user bits: these indicate the initiators that use this 205*4882a593Smuzhiyun * interface to interact with the hwmod. Used to add sleep dependencies 206*4882a593Smuzhiyun * when the module is enabled or disabled. 207*4882a593Smuzhiyun */ 208*4882a593Smuzhiyun #define OCP_USER_MPU (1 << 0) 209*4882a593Smuzhiyun #define OCP_USER_SDMA (1 << 1) 210*4882a593Smuzhiyun #define OCP_USER_DSP (1 << 2) 211*4882a593Smuzhiyun #define OCP_USER_IVA (1 << 3) 212*4882a593Smuzhiyun 213*4882a593Smuzhiyun /* omap_hwmod_ocp_if.flags bits */ 214*4882a593Smuzhiyun #define OCPIF_SWSUP_IDLE (1 << 0) 215*4882a593Smuzhiyun #define OCPIF_CAN_BURST (1 << 1) 216*4882a593Smuzhiyun 217*4882a593Smuzhiyun /* omap_hwmod_ocp_if._int_flags possibilities */ 218*4882a593Smuzhiyun #define _OCPIF_INT_FLAGS_REGISTERED (1 << 0) 219*4882a593Smuzhiyun 220*4882a593Smuzhiyun 221*4882a593Smuzhiyun /** 222*4882a593Smuzhiyun * struct omap_hwmod_ocp_if - OCP interface data 223*4882a593Smuzhiyun * @master: struct omap_hwmod that initiates OCP transactions on this link 224*4882a593Smuzhiyun * @slave: struct omap_hwmod that responds to OCP transactions on this link 225*4882a593Smuzhiyun * @addr: address space associated with this link 226*4882a593Smuzhiyun * @clk: interface clock: OMAP clock name 227*4882a593Smuzhiyun * @_clk: pointer to the interface struct clk (filled in at runtime) 228*4882a593Smuzhiyun * @fw: interface firewall data 229*4882a593Smuzhiyun * @width: OCP data width 230*4882a593Smuzhiyun * @user: initiators using this interface (see OCP_USER_* macros above) 231*4882a593Smuzhiyun * @flags: OCP interface flags (see OCPIF_* macros above) 232*4882a593Smuzhiyun * @_int_flags: internal flags (see _OCPIF_INT_FLAGS* macros above) 233*4882a593Smuzhiyun * 234*4882a593Smuzhiyun * It may also be useful to add a tag_cnt field for OCP2.x devices. 235*4882a593Smuzhiyun * 236*4882a593Smuzhiyun * Parameter names beginning with an underscore are managed internally by 237*4882a593Smuzhiyun * the omap_hwmod code and should not be set during initialization. 238*4882a593Smuzhiyun */ 239*4882a593Smuzhiyun struct omap_hwmod_ocp_if { 240*4882a593Smuzhiyun struct omap_hwmod *master; 241*4882a593Smuzhiyun struct omap_hwmod *slave; 242*4882a593Smuzhiyun struct omap_hwmod_addr_space *addr; 243*4882a593Smuzhiyun const char *clk; 244*4882a593Smuzhiyun struct clk *_clk; 245*4882a593Smuzhiyun struct list_head node; 246*4882a593Smuzhiyun union { 247*4882a593Smuzhiyun struct omap_hwmod_omap2_firewall omap2; 248*4882a593Smuzhiyun } fw; 249*4882a593Smuzhiyun u8 width; 250*4882a593Smuzhiyun u8 user; 251*4882a593Smuzhiyun u8 flags; 252*4882a593Smuzhiyun u8 _int_flags; 253*4882a593Smuzhiyun }; 254*4882a593Smuzhiyun 255*4882a593Smuzhiyun 256*4882a593Smuzhiyun /* Macros for use in struct omap_hwmod_sysconfig */ 257*4882a593Smuzhiyun 258*4882a593Smuzhiyun /* Flags for use in omap_hwmod_sysconfig.idlemodes */ 259*4882a593Smuzhiyun #define MASTER_STANDBY_SHIFT 4 260*4882a593Smuzhiyun #define SLAVE_IDLE_SHIFT 0 261*4882a593Smuzhiyun #define SIDLE_FORCE (HWMOD_IDLEMODE_FORCE << SLAVE_IDLE_SHIFT) 262*4882a593Smuzhiyun #define SIDLE_NO (HWMOD_IDLEMODE_NO << SLAVE_IDLE_SHIFT) 263*4882a593Smuzhiyun #define SIDLE_SMART (HWMOD_IDLEMODE_SMART << SLAVE_IDLE_SHIFT) 264*4882a593Smuzhiyun #define SIDLE_SMART_WKUP (HWMOD_IDLEMODE_SMART_WKUP << SLAVE_IDLE_SHIFT) 265*4882a593Smuzhiyun #define MSTANDBY_FORCE (HWMOD_IDLEMODE_FORCE << MASTER_STANDBY_SHIFT) 266*4882a593Smuzhiyun #define MSTANDBY_NO (HWMOD_IDLEMODE_NO << MASTER_STANDBY_SHIFT) 267*4882a593Smuzhiyun #define MSTANDBY_SMART (HWMOD_IDLEMODE_SMART << MASTER_STANDBY_SHIFT) 268*4882a593Smuzhiyun #define MSTANDBY_SMART_WKUP (HWMOD_IDLEMODE_SMART_WKUP << MASTER_STANDBY_SHIFT) 269*4882a593Smuzhiyun 270*4882a593Smuzhiyun /* omap_hwmod_sysconfig.sysc_flags capability flags */ 271*4882a593Smuzhiyun #define SYSC_HAS_AUTOIDLE (1 << 0) 272*4882a593Smuzhiyun #define SYSC_HAS_SOFTRESET (1 << 1) 273*4882a593Smuzhiyun #define SYSC_HAS_ENAWAKEUP (1 << 2) 274*4882a593Smuzhiyun #define SYSC_HAS_EMUFREE (1 << 3) 275*4882a593Smuzhiyun #define SYSC_HAS_CLOCKACTIVITY (1 << 4) 276*4882a593Smuzhiyun #define SYSC_HAS_SIDLEMODE (1 << 5) 277*4882a593Smuzhiyun #define SYSC_HAS_MIDLEMODE (1 << 6) 278*4882a593Smuzhiyun #define SYSS_HAS_RESET_STATUS (1 << 7) 279*4882a593Smuzhiyun #define SYSC_NO_CACHE (1 << 8) /* XXX SW flag, belongs elsewhere */ 280*4882a593Smuzhiyun #define SYSC_HAS_RESET_STATUS (1 << 9) 281*4882a593Smuzhiyun #define SYSC_HAS_DMADISABLE (1 << 10) 282*4882a593Smuzhiyun 283*4882a593Smuzhiyun /* omap_hwmod_sysconfig.clockact flags */ 284*4882a593Smuzhiyun #define CLOCKACT_TEST_BOTH 0x0 285*4882a593Smuzhiyun #define CLOCKACT_TEST_MAIN 0x1 286*4882a593Smuzhiyun #define CLOCKACT_TEST_ICLK 0x2 287*4882a593Smuzhiyun #define CLOCKACT_TEST_NONE 0x3 288*4882a593Smuzhiyun 289*4882a593Smuzhiyun /** 290*4882a593Smuzhiyun * struct omap_hwmod_class_sysconfig - hwmod class OCP_SYS* data 291*4882a593Smuzhiyun * @rev_offs: IP block revision register offset (from module base addr) 292*4882a593Smuzhiyun * @sysc_offs: OCP_SYSCONFIG register offset (from module base addr) 293*4882a593Smuzhiyun * @syss_offs: OCP_SYSSTATUS register offset (from module base addr) 294*4882a593Smuzhiyun * @srst_udelay: Delay needed after doing a softreset in usecs 295*4882a593Smuzhiyun * @idlemodes: One or more of {SIDLE,MSTANDBY}_{OFF,FORCE,SMART} 296*4882a593Smuzhiyun * @sysc_flags: SYS{C,S}_HAS* flags indicating SYSCONFIG bits supported 297*4882a593Smuzhiyun * @clockact: the default value of the module CLOCKACTIVITY bits 298*4882a593Smuzhiyun * 299*4882a593Smuzhiyun * @clockact describes to the module which clocks are likely to be 300*4882a593Smuzhiyun * disabled when the PRCM issues its idle request to the module. Some 301*4882a593Smuzhiyun * modules have separate clockdomains for the interface clock and main 302*4882a593Smuzhiyun * functional clock, and can check whether they should acknowledge the 303*4882a593Smuzhiyun * idle request based on the internal module functionality that has 304*4882a593Smuzhiyun * been associated with the clocks marked in @clockact. This field is 305*4882a593Smuzhiyun * only used if HWMOD_SET_DEFAULT_CLOCKACT is set (see below) 306*4882a593Smuzhiyun * 307*4882a593Smuzhiyun * @sysc_fields: structure containing the offset positions of various bits in 308*4882a593Smuzhiyun * SYSCONFIG register. This can be populated using omap_hwmod_sysc_type1 or 309*4882a593Smuzhiyun * omap_hwmod_sysc_type2 defined in omap_hwmod_common_data.c depending on 310*4882a593Smuzhiyun * whether the device ip is compliant with the original PRCM protocol 311*4882a593Smuzhiyun * defined for OMAP2420 or the new PRCM protocol for new OMAP4 IPs. 312*4882a593Smuzhiyun * If the device follows a different scheme for the sysconfig register , 313*4882a593Smuzhiyun * then this field has to be populated with the correct offset structure. 314*4882a593Smuzhiyun */ 315*4882a593Smuzhiyun struct omap_hwmod_class_sysconfig { 316*4882a593Smuzhiyun s32 rev_offs; 317*4882a593Smuzhiyun s32 sysc_offs; 318*4882a593Smuzhiyun s32 syss_offs; 319*4882a593Smuzhiyun u16 sysc_flags; 320*4882a593Smuzhiyun struct sysc_regbits *sysc_fields; 321*4882a593Smuzhiyun u8 srst_udelay; 322*4882a593Smuzhiyun u8 idlemodes; 323*4882a593Smuzhiyun }; 324*4882a593Smuzhiyun 325*4882a593Smuzhiyun /** 326*4882a593Smuzhiyun * struct omap_hwmod_omap2_prcm - OMAP2/3-specific PRCM data 327*4882a593Smuzhiyun * @module_offs: PRCM submodule offset from the start of the PRM/CM 328*4882a593Smuzhiyun * @idlest_reg_id: IDLEST register ID (e.g., 3 for CM_IDLEST3) 329*4882a593Smuzhiyun * @idlest_idle_bit: register bit shift for CM_IDLEST slave idle bit 330*4882a593Smuzhiyun * 331*4882a593Smuzhiyun * @prcm_reg_id and @module_bit are specific to the AUTOIDLE, WKST, 332*4882a593Smuzhiyun * WKEN, GRPSEL registers. In an ideal world, no extra information 333*4882a593Smuzhiyun * would be needed for IDLEST information, but alas, there are some 334*4882a593Smuzhiyun * exceptions, so @idlest_reg_id, @idlest_idle_bit, @idlest_stdby_bit 335*4882a593Smuzhiyun * are needed for the IDLEST registers (c.f. 2430 I2CHS, 3430 USBHOST) 336*4882a593Smuzhiyun */ 337*4882a593Smuzhiyun struct omap_hwmod_omap2_prcm { 338*4882a593Smuzhiyun s16 module_offs; 339*4882a593Smuzhiyun u8 idlest_reg_id; 340*4882a593Smuzhiyun u8 idlest_idle_bit; 341*4882a593Smuzhiyun }; 342*4882a593Smuzhiyun 343*4882a593Smuzhiyun /* 344*4882a593Smuzhiyun * Possible values for struct omap_hwmod_omap4_prcm.flags 345*4882a593Smuzhiyun * 346*4882a593Smuzhiyun * HWMOD_OMAP4_NO_CONTEXT_LOSS_BIT: Some IP blocks don't have a PRCM 347*4882a593Smuzhiyun * module-level context loss register associated with them; this 348*4882a593Smuzhiyun * flag bit should be set in those cases 349*4882a593Smuzhiyun * HWMOD_OMAP4_ZERO_CLKCTRL_OFFSET: Some IP blocks have a valid CLKCTRL 350*4882a593Smuzhiyun * offset of zero; this flag bit should be set in those cases to 351*4882a593Smuzhiyun * distinguish from hwmods that have no clkctrl offset. 352*4882a593Smuzhiyun * HWMOD_OMAP4_CLKFWK_CLKCTR_CLOCK: Module clockctrl clock is managed 353*4882a593Smuzhiyun * by the common clock framework and not hwmod. 354*4882a593Smuzhiyun */ 355*4882a593Smuzhiyun #define HWMOD_OMAP4_NO_CONTEXT_LOSS_BIT (1 << 0) 356*4882a593Smuzhiyun #define HWMOD_OMAP4_ZERO_CLKCTRL_OFFSET (1 << 1) 357*4882a593Smuzhiyun #define HWMOD_OMAP4_CLKFWK_CLKCTR_CLOCK (1 << 2) 358*4882a593Smuzhiyun 359*4882a593Smuzhiyun /** 360*4882a593Smuzhiyun * struct omap_hwmod_omap4_prcm - OMAP4-specific PRCM data 361*4882a593Smuzhiyun * @clkctrl_offs: offset of the PRCM clock control register 362*4882a593Smuzhiyun * @rstctrl_offs: offset of the XXX_RSTCTRL register located in the PRM 363*4882a593Smuzhiyun * @context_offs: offset of the RM_*_CONTEXT register 364*4882a593Smuzhiyun * @lostcontext_mask: bitmask for selecting bits from RM_*_CONTEXT register 365*4882a593Smuzhiyun * @rstst_reg: (AM33XX only) address of the XXX_RSTST register in the PRM 366*4882a593Smuzhiyun * @submodule_wkdep_bit: bit shift of the WKDEP range 367*4882a593Smuzhiyun * @flags: PRCM register capabilities for this IP block 368*4882a593Smuzhiyun * @modulemode: allowable modulemodes 369*4882a593Smuzhiyun * @context_lost_counter: Count of module level context lost 370*4882a593Smuzhiyun * 371*4882a593Smuzhiyun * If @lostcontext_mask is not defined, context loss check code uses 372*4882a593Smuzhiyun * whole register without masking. @lostcontext_mask should only be 373*4882a593Smuzhiyun * defined in cases where @context_offs register is shared by two or 374*4882a593Smuzhiyun * more hwmods. 375*4882a593Smuzhiyun */ 376*4882a593Smuzhiyun struct omap_hwmod_omap4_prcm { 377*4882a593Smuzhiyun u16 clkctrl_offs; 378*4882a593Smuzhiyun u16 rstctrl_offs; 379*4882a593Smuzhiyun u16 rstst_offs; 380*4882a593Smuzhiyun u16 context_offs; 381*4882a593Smuzhiyun u32 lostcontext_mask; 382*4882a593Smuzhiyun u8 submodule_wkdep_bit; 383*4882a593Smuzhiyun u8 modulemode; 384*4882a593Smuzhiyun u8 flags; 385*4882a593Smuzhiyun int context_lost_counter; 386*4882a593Smuzhiyun }; 387*4882a593Smuzhiyun 388*4882a593Smuzhiyun 389*4882a593Smuzhiyun /* 390*4882a593Smuzhiyun * omap_hwmod.flags definitions 391*4882a593Smuzhiyun * 392*4882a593Smuzhiyun * HWMOD_SWSUP_SIDLE: omap_hwmod code should manually bring module in and out 393*4882a593Smuzhiyun * of idle, rather than relying on module smart-idle 394*4882a593Smuzhiyun * HWMOD_SWSUP_MSTANDBY: omap_hwmod code should manually bring module in and 395*4882a593Smuzhiyun * out of standby, rather than relying on module smart-standby 396*4882a593Smuzhiyun * HWMOD_INIT_NO_RESET: don't reset this module at boot - important for 397*4882a593Smuzhiyun * SDRAM controller, etc. XXX probably belongs outside the main hwmod file 398*4882a593Smuzhiyun * XXX Should be HWMOD_SETUP_NO_RESET 399*4882a593Smuzhiyun * HWMOD_INIT_NO_IDLE: don't idle this module at boot - important for SDRAM 400*4882a593Smuzhiyun * controller, etc. XXX probably belongs outside the main hwmod file 401*4882a593Smuzhiyun * XXX Should be HWMOD_SETUP_NO_IDLE 402*4882a593Smuzhiyun * HWMOD_NO_OCP_AUTOIDLE: disable module autoidle (OCP_SYSCONFIG.AUTOIDLE) 403*4882a593Smuzhiyun * when module is enabled, rather than the default, which is to 404*4882a593Smuzhiyun * enable autoidle 405*4882a593Smuzhiyun * HWMOD_SET_DEFAULT_CLOCKACT: program CLOCKACTIVITY bits at startup 406*4882a593Smuzhiyun * HWMOD_NO_IDLEST: this module does not have idle status - this is the case 407*4882a593Smuzhiyun * only for few initiator modules on OMAP2 & 3. 408*4882a593Smuzhiyun * HWMOD_CONTROL_OPT_CLKS_IN_RESET: Enable all optional clocks during reset. 409*4882a593Smuzhiyun * This is needed for devices like DSS that require optional clocks enabled 410*4882a593Smuzhiyun * in order to complete the reset. Optional clocks will be disabled 411*4882a593Smuzhiyun * again after the reset. 412*4882a593Smuzhiyun * HWMOD_16BIT_REG: Module has 16bit registers 413*4882a593Smuzhiyun * HWMOD_EXT_OPT_MAIN_CLK: The only main functional clock source for 414*4882a593Smuzhiyun * this IP block comes from an off-chip source and is not always 415*4882a593Smuzhiyun * enabled. This prevents the hwmod code from being able to 416*4882a593Smuzhiyun * enable and reset the IP block early. XXX Eventually it should 417*4882a593Smuzhiyun * be possible to query the clock framework for this information. 418*4882a593Smuzhiyun * HWMOD_BLOCK_WFI: Some OMAP peripherals apparently don't work 419*4882a593Smuzhiyun * correctly if the MPU is allowed to go idle while the 420*4882a593Smuzhiyun * peripherals are active. This is apparently true for the I2C on 421*4882a593Smuzhiyun * OMAP2420, and also the EMAC on AM3517/3505. It's unlikely that 422*4882a593Smuzhiyun * this is really true -- we're probably not configuring something 423*4882a593Smuzhiyun * correctly, or this is being abused to deal with some PM latency 424*4882a593Smuzhiyun * issues -- but we're currently suffering from a shortage of 425*4882a593Smuzhiyun * folks who are able to track these issues down properly. 426*4882a593Smuzhiyun * HWMOD_FORCE_MSTANDBY: Always keep MIDLEMODE bits cleared so that device 427*4882a593Smuzhiyun * is kept in force-standby mode. Failing to do so causes PM problems 428*4882a593Smuzhiyun * with musb on OMAP3630 at least. Note that musb has a dedicated register 429*4882a593Smuzhiyun * to control MSTANDBY signal when MIDLEMODE is set to force-standby. 430*4882a593Smuzhiyun * HWMOD_SWSUP_SIDLE_ACT: omap_hwmod code should manually bring the module 431*4882a593Smuzhiyun * out of idle, but rely on smart-idle to the put it back in idle, 432*4882a593Smuzhiyun * so the wakeups are still functional (Only known case for now is UART) 433*4882a593Smuzhiyun * HWMOD_RECONFIG_IO_CHAIN: omap_hwmod code needs to reconfigure wake-up 434*4882a593Smuzhiyun * events by calling _reconfigure_io_chain() when a device is enabled 435*4882a593Smuzhiyun * or idled. 436*4882a593Smuzhiyun * HWMOD_OPT_CLKS_NEEDED: The optional clocks are needed for the module to 437*4882a593Smuzhiyun * operate and they need to be handled at the same time as the main_clk. 438*4882a593Smuzhiyun * HWMOD_NO_IDLE: Do not idle the hwmod at all. Useful to handle certain 439*4882a593Smuzhiyun * IPs like CPSW on DRA7, where clocks to this module cannot be disabled. 440*4882a593Smuzhiyun * HWMOD_CLKDM_NOAUTO: Allows the hwmod's clockdomain to be prevented from 441*4882a593Smuzhiyun * entering HW_AUTO while hwmod is active. This is needed to workaround 442*4882a593Smuzhiyun * some modules which don't function correctly with HW_AUTO. For example, 443*4882a593Smuzhiyun * DCAN on DRA7x SoC needs this to workaround errata i893. 444*4882a593Smuzhiyun */ 445*4882a593Smuzhiyun #define HWMOD_SWSUP_SIDLE (1 << 0) 446*4882a593Smuzhiyun #define HWMOD_SWSUP_MSTANDBY (1 << 1) 447*4882a593Smuzhiyun #define HWMOD_INIT_NO_RESET (1 << 2) 448*4882a593Smuzhiyun #define HWMOD_INIT_NO_IDLE (1 << 3) 449*4882a593Smuzhiyun #define HWMOD_NO_OCP_AUTOIDLE (1 << 4) 450*4882a593Smuzhiyun #define HWMOD_SET_DEFAULT_CLOCKACT (1 << 5) 451*4882a593Smuzhiyun #define HWMOD_NO_IDLEST (1 << 6) 452*4882a593Smuzhiyun #define HWMOD_CONTROL_OPT_CLKS_IN_RESET (1 << 7) 453*4882a593Smuzhiyun #define HWMOD_16BIT_REG (1 << 8) 454*4882a593Smuzhiyun #define HWMOD_EXT_OPT_MAIN_CLK (1 << 9) 455*4882a593Smuzhiyun #define HWMOD_BLOCK_WFI (1 << 10) 456*4882a593Smuzhiyun #define HWMOD_FORCE_MSTANDBY (1 << 11) 457*4882a593Smuzhiyun #define HWMOD_SWSUP_SIDLE_ACT (1 << 12) 458*4882a593Smuzhiyun #define HWMOD_RECONFIG_IO_CHAIN (1 << 13) 459*4882a593Smuzhiyun #define HWMOD_OPT_CLKS_NEEDED (1 << 14) 460*4882a593Smuzhiyun #define HWMOD_NO_IDLE (1 << 15) 461*4882a593Smuzhiyun #define HWMOD_CLKDM_NOAUTO (1 << 16) 462*4882a593Smuzhiyun 463*4882a593Smuzhiyun /* 464*4882a593Smuzhiyun * omap_hwmod._int_flags definitions 465*4882a593Smuzhiyun * These are for internal use only and are managed by the omap_hwmod code. 466*4882a593Smuzhiyun * 467*4882a593Smuzhiyun * _HWMOD_NO_MPU_PORT: no path exists for the MPU to write to this module 468*4882a593Smuzhiyun * _HWMOD_SYSCONFIG_LOADED: set when the OCP_SYSCONFIG value has been cached 469*4882a593Smuzhiyun * _HWMOD_SKIP_ENABLE: set if hwmod enabled during init (HWMOD_INIT_NO_IDLE) - 470*4882a593Smuzhiyun * causes the first call to _enable() to only update the pinmux 471*4882a593Smuzhiyun */ 472*4882a593Smuzhiyun #define _HWMOD_NO_MPU_PORT (1 << 0) 473*4882a593Smuzhiyun #define _HWMOD_SYSCONFIG_LOADED (1 << 1) 474*4882a593Smuzhiyun #define _HWMOD_SKIP_ENABLE (1 << 2) 475*4882a593Smuzhiyun 476*4882a593Smuzhiyun /* 477*4882a593Smuzhiyun * omap_hwmod._state definitions 478*4882a593Smuzhiyun * 479*4882a593Smuzhiyun * INITIALIZED: reset (optionally), initialized, enabled, disabled 480*4882a593Smuzhiyun * (optionally) 481*4882a593Smuzhiyun * 482*4882a593Smuzhiyun * 483*4882a593Smuzhiyun */ 484*4882a593Smuzhiyun #define _HWMOD_STATE_UNKNOWN 0 485*4882a593Smuzhiyun #define _HWMOD_STATE_REGISTERED 1 486*4882a593Smuzhiyun #define _HWMOD_STATE_CLKS_INITED 2 487*4882a593Smuzhiyun #define _HWMOD_STATE_INITIALIZED 3 488*4882a593Smuzhiyun #define _HWMOD_STATE_ENABLED 4 489*4882a593Smuzhiyun #define _HWMOD_STATE_IDLE 5 490*4882a593Smuzhiyun #define _HWMOD_STATE_DISABLED 6 491*4882a593Smuzhiyun 492*4882a593Smuzhiyun #ifdef CONFIG_PM 493*4882a593Smuzhiyun #define _HWMOD_STATE_DEFAULT _HWMOD_STATE_IDLE 494*4882a593Smuzhiyun #else 495*4882a593Smuzhiyun #define _HWMOD_STATE_DEFAULT _HWMOD_STATE_ENABLED 496*4882a593Smuzhiyun #endif 497*4882a593Smuzhiyun 498*4882a593Smuzhiyun /** 499*4882a593Smuzhiyun * struct omap_hwmod_class - the type of an IP block 500*4882a593Smuzhiyun * @name: name of the hwmod_class 501*4882a593Smuzhiyun * @sysc: device SYSCONFIG/SYSSTATUS register data 502*4882a593Smuzhiyun * @pre_shutdown: ptr to fn to be executed immediately prior to device shutdown 503*4882a593Smuzhiyun * @reset: ptr to fn to be executed in place of the standard hwmod reset fn 504*4882a593Smuzhiyun * @lock: ptr to fn to be executed to lock IP registers 505*4882a593Smuzhiyun * @unlock: ptr to fn to be executed to unlock IP registers 506*4882a593Smuzhiyun * 507*4882a593Smuzhiyun * Represent the class of a OMAP hardware "modules" (e.g. timer, 508*4882a593Smuzhiyun * smartreflex, gpio, uart...) 509*4882a593Smuzhiyun * 510*4882a593Smuzhiyun * @pre_shutdown is a function that will be run immediately before 511*4882a593Smuzhiyun * hwmod clocks are disabled, etc. It is intended for use for hwmods 512*4882a593Smuzhiyun * like the MPU watchdog, which cannot be disabled with the standard 513*4882a593Smuzhiyun * omap_hwmod_shutdown(). The function should return 0 upon success, 514*4882a593Smuzhiyun * or some negative error upon failure. Returning an error will cause 515*4882a593Smuzhiyun * omap_hwmod_shutdown() to abort the device shutdown and return an 516*4882a593Smuzhiyun * error. 517*4882a593Smuzhiyun * 518*4882a593Smuzhiyun * If @reset is defined, then the function it points to will be 519*4882a593Smuzhiyun * executed in place of the standard hwmod _reset() code in 520*4882a593Smuzhiyun * mach-omap2/omap_hwmod.c. This is needed for IP blocks which have 521*4882a593Smuzhiyun * unusual reset sequences - usually processor IP blocks like the IVA. 522*4882a593Smuzhiyun */ 523*4882a593Smuzhiyun struct omap_hwmod_class { 524*4882a593Smuzhiyun const char *name; 525*4882a593Smuzhiyun struct omap_hwmod_class_sysconfig *sysc; 526*4882a593Smuzhiyun int (*pre_shutdown)(struct omap_hwmod *oh); 527*4882a593Smuzhiyun int (*reset)(struct omap_hwmod *oh); 528*4882a593Smuzhiyun void (*lock)(struct omap_hwmod *oh); 529*4882a593Smuzhiyun void (*unlock)(struct omap_hwmod *oh); 530*4882a593Smuzhiyun }; 531*4882a593Smuzhiyun 532*4882a593Smuzhiyun /** 533*4882a593Smuzhiyun * struct omap_hwmod - integration data for OMAP hardware "modules" (IP blocks) 534*4882a593Smuzhiyun * @name: name of the hwmod 535*4882a593Smuzhiyun * @class: struct omap_hwmod_class * to the class of this hwmod 536*4882a593Smuzhiyun * @od: struct omap_device currently associated with this hwmod (internal use) 537*4882a593Smuzhiyun * @prcm: PRCM data pertaining to this hwmod 538*4882a593Smuzhiyun * @main_clk: main clock: OMAP clock name 539*4882a593Smuzhiyun * @_clk: pointer to the main struct clk (filled in at runtime) 540*4882a593Smuzhiyun * @opt_clks: other device clocks that drivers can request (0..*) 541*4882a593Smuzhiyun * @voltdm: pointer to voltage domain (filled in at runtime) 542*4882a593Smuzhiyun * @dev_attr: arbitrary device attributes that can be passed to the driver 543*4882a593Smuzhiyun * @_sysc_cache: internal-use hwmod flags 544*4882a593Smuzhiyun * @mpu_rt_idx: index of device address space for register target (for DT boot) 545*4882a593Smuzhiyun * @_mpu_rt_va: cached register target start address (internal use) 546*4882a593Smuzhiyun * @_mpu_port: cached MPU register target slave (internal use) 547*4882a593Smuzhiyun * @opt_clks_cnt: number of @opt_clks 548*4882a593Smuzhiyun * @master_cnt: number of @master entries 549*4882a593Smuzhiyun * @slaves_cnt: number of @slave entries 550*4882a593Smuzhiyun * @response_lat: device OCP response latency (in interface clock cycles) 551*4882a593Smuzhiyun * @_int_flags: internal-use hwmod flags 552*4882a593Smuzhiyun * @_state: internal-use hwmod state 553*4882a593Smuzhiyun * @_postsetup_state: internal-use state to leave the hwmod in after _setup() 554*4882a593Smuzhiyun * @flags: hwmod flags (documented below) 555*4882a593Smuzhiyun * @_lock: spinlock serializing operations on this hwmod 556*4882a593Smuzhiyun * @node: list node for hwmod list (internal use) 557*4882a593Smuzhiyun * @parent_hwmod: (temporary) a pointer to the hierarchical parent of this hwmod 558*4882a593Smuzhiyun * 559*4882a593Smuzhiyun * @main_clk refers to this module's "main clock," which for our 560*4882a593Smuzhiyun * purposes is defined as "the functional clock needed for register 561*4882a593Smuzhiyun * accesses to complete." Modules may not have a main clock if the 562*4882a593Smuzhiyun * interface clock also serves as a main clock. 563*4882a593Smuzhiyun * 564*4882a593Smuzhiyun * Parameter names beginning with an underscore are managed internally by 565*4882a593Smuzhiyun * the omap_hwmod code and should not be set during initialization. 566*4882a593Smuzhiyun * 567*4882a593Smuzhiyun * @masters and @slaves are now deprecated. 568*4882a593Smuzhiyun * 569*4882a593Smuzhiyun * @parent_hwmod is temporary; there should be no need for it, as this 570*4882a593Smuzhiyun * information should already be expressed in the OCP interface 571*4882a593Smuzhiyun * structures. @parent_hwmod is present as a workaround until we improve 572*4882a593Smuzhiyun * handling for hwmods with multiple parents (e.g., OMAP4+ DSS with 573*4882a593Smuzhiyun * multiple register targets across different interconnects). 574*4882a593Smuzhiyun */ 575*4882a593Smuzhiyun struct omap_hwmod { 576*4882a593Smuzhiyun const char *name; 577*4882a593Smuzhiyun struct omap_hwmod_class *class; 578*4882a593Smuzhiyun struct omap_device *od; 579*4882a593Smuzhiyun struct omap_hwmod_rst_info *rst_lines; 580*4882a593Smuzhiyun union { 581*4882a593Smuzhiyun struct omap_hwmod_omap2_prcm omap2; 582*4882a593Smuzhiyun struct omap_hwmod_omap4_prcm omap4; 583*4882a593Smuzhiyun } prcm; 584*4882a593Smuzhiyun const char *main_clk; 585*4882a593Smuzhiyun struct clk *_clk; 586*4882a593Smuzhiyun struct omap_hwmod_opt_clk *opt_clks; 587*4882a593Smuzhiyun const char *clkdm_name; 588*4882a593Smuzhiyun struct clockdomain *clkdm; 589*4882a593Smuzhiyun struct list_head slave_ports; /* connect to *_TA */ 590*4882a593Smuzhiyun void *dev_attr; 591*4882a593Smuzhiyun u32 _sysc_cache; 592*4882a593Smuzhiyun void __iomem *_mpu_rt_va; 593*4882a593Smuzhiyun spinlock_t _lock; 594*4882a593Smuzhiyun struct lock_class_key hwmod_key; /* unique lock class */ 595*4882a593Smuzhiyun struct list_head node; 596*4882a593Smuzhiyun struct omap_hwmod_ocp_if *_mpu_port; 597*4882a593Smuzhiyun u32 flags; 598*4882a593Smuzhiyun u8 mpu_rt_idx; 599*4882a593Smuzhiyun u8 response_lat; 600*4882a593Smuzhiyun u8 rst_lines_cnt; 601*4882a593Smuzhiyun u8 opt_clks_cnt; 602*4882a593Smuzhiyun u8 slaves_cnt; 603*4882a593Smuzhiyun u8 hwmods_cnt; 604*4882a593Smuzhiyun u8 _int_flags; 605*4882a593Smuzhiyun u8 _state; 606*4882a593Smuzhiyun u8 _postsetup_state; 607*4882a593Smuzhiyun struct omap_hwmod *parent_hwmod; 608*4882a593Smuzhiyun }; 609*4882a593Smuzhiyun 610*4882a593Smuzhiyun struct device_node; 611*4882a593Smuzhiyun 612*4882a593Smuzhiyun struct omap_hwmod *omap_hwmod_lookup(const char *name); 613*4882a593Smuzhiyun int omap_hwmod_for_each(int (*fn)(struct omap_hwmod *oh, void *data), 614*4882a593Smuzhiyun void *data); 615*4882a593Smuzhiyun 616*4882a593Smuzhiyun int __init omap_hwmod_setup_one(const char *name); 617*4882a593Smuzhiyun int omap_hwmod_parse_module_range(struct omap_hwmod *oh, 618*4882a593Smuzhiyun struct device_node *np, 619*4882a593Smuzhiyun struct resource *res); 620*4882a593Smuzhiyun 621*4882a593Smuzhiyun struct ti_sysc_module_data; 622*4882a593Smuzhiyun struct ti_sysc_cookie; 623*4882a593Smuzhiyun 624*4882a593Smuzhiyun int omap_hwmod_init_module(struct device *dev, 625*4882a593Smuzhiyun const struct ti_sysc_module_data *data, 626*4882a593Smuzhiyun struct ti_sysc_cookie *cookie); 627*4882a593Smuzhiyun 628*4882a593Smuzhiyun int omap_hwmod_enable(struct omap_hwmod *oh); 629*4882a593Smuzhiyun int omap_hwmod_idle(struct omap_hwmod *oh); 630*4882a593Smuzhiyun int omap_hwmod_shutdown(struct omap_hwmod *oh); 631*4882a593Smuzhiyun 632*4882a593Smuzhiyun int omap_hwmod_assert_hardreset(struct omap_hwmod *oh, const char *name); 633*4882a593Smuzhiyun int omap_hwmod_deassert_hardreset(struct omap_hwmod *oh, const char *name); 634*4882a593Smuzhiyun 635*4882a593Smuzhiyun void omap_hwmod_write(u32 v, struct omap_hwmod *oh, u16 reg_offs); 636*4882a593Smuzhiyun u32 omap_hwmod_read(struct omap_hwmod *oh, u16 reg_offs); 637*4882a593Smuzhiyun int omap_hwmod_softreset(struct omap_hwmod *oh); 638*4882a593Smuzhiyun 639*4882a593Smuzhiyun int omap_hwmod_count_resources(struct omap_hwmod *oh, unsigned long flags); 640*4882a593Smuzhiyun int omap_hwmod_fill_resources(struct omap_hwmod *oh, struct resource *res); 641*4882a593Smuzhiyun int omap_hwmod_get_resource_byname(struct omap_hwmod *oh, unsigned int type, 642*4882a593Smuzhiyun const char *name, struct resource *res); 643*4882a593Smuzhiyun 644*4882a593Smuzhiyun struct powerdomain *omap_hwmod_get_pwrdm(struct omap_hwmod *oh); 645*4882a593Smuzhiyun void __iomem *omap_hwmod_get_mpu_rt_va(struct omap_hwmod *oh); 646*4882a593Smuzhiyun 647*4882a593Smuzhiyun int omap_hwmod_for_each_by_class(const char *classname, 648*4882a593Smuzhiyun int (*fn)(struct omap_hwmod *oh, 649*4882a593Smuzhiyun void *user), 650*4882a593Smuzhiyun void *user); 651*4882a593Smuzhiyun 652*4882a593Smuzhiyun int omap_hwmod_set_postsetup_state(struct omap_hwmod *oh, u8 state); 653*4882a593Smuzhiyun int omap_hwmod_get_context_loss_count(struct omap_hwmod *oh); 654*4882a593Smuzhiyun 655*4882a593Smuzhiyun extern void __init omap_hwmod_init(void); 656*4882a593Smuzhiyun 657*4882a593Smuzhiyun const char *omap_hwmod_get_main_clk(struct omap_hwmod *oh); 658*4882a593Smuzhiyun 659*4882a593Smuzhiyun /* 660*4882a593Smuzhiyun * 661*4882a593Smuzhiyun */ 662*4882a593Smuzhiyun 663*4882a593Smuzhiyun void omap_hwmod_rtc_unlock(struct omap_hwmod *oh); 664*4882a593Smuzhiyun void omap_hwmod_rtc_lock(struct omap_hwmod *oh); 665*4882a593Smuzhiyun 666*4882a593Smuzhiyun /* 667*4882a593Smuzhiyun * Chip variant-specific hwmod init routines - XXX should be converted 668*4882a593Smuzhiyun * to use initcalls once the initial boot ordering is straightened out 669*4882a593Smuzhiyun */ 670*4882a593Smuzhiyun extern int omap2420_hwmod_init(void); 671*4882a593Smuzhiyun extern int omap2430_hwmod_init(void); 672*4882a593Smuzhiyun extern int omap3xxx_hwmod_init(void); 673*4882a593Smuzhiyun extern int omap44xx_hwmod_init(void); 674*4882a593Smuzhiyun extern int omap54xx_hwmod_init(void); 675*4882a593Smuzhiyun extern int am33xx_hwmod_init(void); 676*4882a593Smuzhiyun extern int dm814x_hwmod_init(void); 677*4882a593Smuzhiyun extern int dm816x_hwmod_init(void); 678*4882a593Smuzhiyun extern int dra7xx_hwmod_init(void); 679*4882a593Smuzhiyun int am43xx_hwmod_init(void); 680*4882a593Smuzhiyun 681*4882a593Smuzhiyun extern int __init omap_hwmod_register_links(struct omap_hwmod_ocp_if **ois); 682*4882a593Smuzhiyun 683*4882a593Smuzhiyun #endif 684