1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun 3*4882a593Smuzhiyun #ifndef __TI_SYSC_DATA_H__ 4*4882a593Smuzhiyun #define __TI_SYSC_DATA_H__ 5*4882a593Smuzhiyun 6*4882a593Smuzhiyun enum ti_sysc_module_type { 7*4882a593Smuzhiyun TI_SYSC_OMAP2, 8*4882a593Smuzhiyun TI_SYSC_OMAP2_TIMER, 9*4882a593Smuzhiyun TI_SYSC_OMAP3_SHAM, 10*4882a593Smuzhiyun TI_SYSC_OMAP3_AES, 11*4882a593Smuzhiyun TI_SYSC_OMAP4, 12*4882a593Smuzhiyun TI_SYSC_OMAP4_TIMER, 13*4882a593Smuzhiyun TI_SYSC_OMAP4_SIMPLE, 14*4882a593Smuzhiyun TI_SYSC_OMAP34XX_SR, 15*4882a593Smuzhiyun TI_SYSC_OMAP36XX_SR, 16*4882a593Smuzhiyun TI_SYSC_OMAP4_SR, 17*4882a593Smuzhiyun TI_SYSC_OMAP4_MCASP, 18*4882a593Smuzhiyun TI_SYSC_OMAP4_USB_HOST_FS, 19*4882a593Smuzhiyun TI_SYSC_DRA7_MCAN, 20*4882a593Smuzhiyun TI_SYSC_PRUSS, 21*4882a593Smuzhiyun }; 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun struct ti_sysc_cookie { 24*4882a593Smuzhiyun void *data; 25*4882a593Smuzhiyun void *clkdm; 26*4882a593Smuzhiyun }; 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun /** 29*4882a593Smuzhiyun * struct sysc_regbits - TI OCP_SYSCONFIG register field offsets 30*4882a593Smuzhiyun * @midle_shift: Offset of the midle bit 31*4882a593Smuzhiyun * @clkact_shift: Offset of the clockactivity bit 32*4882a593Smuzhiyun * @sidle_shift: Offset of the sidle bit 33*4882a593Smuzhiyun * @enwkup_shift: Offset of the enawakeup bit 34*4882a593Smuzhiyun * @srst_shift: Offset of the softreset bit 35*4882a593Smuzhiyun * @autoidle_shift: Offset of the autoidle bit 36*4882a593Smuzhiyun * @dmadisable_shift: Offset of the dmadisable bit 37*4882a593Smuzhiyun * @emufree_shift; Offset of the emufree bit 38*4882a593Smuzhiyun * 39*4882a593Smuzhiyun * Note that 0 is a valid shift, and for ti-sysc.c -ENODEV can be used if a 40*4882a593Smuzhiyun * feature is not available. 41*4882a593Smuzhiyun */ 42*4882a593Smuzhiyun struct sysc_regbits { 43*4882a593Smuzhiyun s8 midle_shift; 44*4882a593Smuzhiyun s8 clkact_shift; 45*4882a593Smuzhiyun s8 sidle_shift; 46*4882a593Smuzhiyun s8 enwkup_shift; 47*4882a593Smuzhiyun s8 srst_shift; 48*4882a593Smuzhiyun s8 autoidle_shift; 49*4882a593Smuzhiyun s8 dmadisable_shift; 50*4882a593Smuzhiyun s8 emufree_shift; 51*4882a593Smuzhiyun }; 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun #define SYSC_QUIRK_REINIT_ON_CTX_LOST BIT(28) 54*4882a593Smuzhiyun #define SYSC_QUIRK_REINIT_ON_RESUME BIT(27) 55*4882a593Smuzhiyun #define SYSC_QUIRK_GPMC_DEBUG BIT(26) 56*4882a593Smuzhiyun #define SYSC_MODULE_QUIRK_ENA_RESETDONE BIT(25) 57*4882a593Smuzhiyun #define SYSC_MODULE_QUIRK_PRUSS BIT(24) 58*4882a593Smuzhiyun #define SYSC_MODULE_QUIRK_DSS_RESET BIT(23) 59*4882a593Smuzhiyun #define SYSC_MODULE_QUIRK_RTC_UNLOCK BIT(22) 60*4882a593Smuzhiyun #define SYSC_QUIRK_CLKDM_NOAUTO BIT(21) 61*4882a593Smuzhiyun #define SYSC_QUIRK_FORCE_MSTANDBY BIT(20) 62*4882a593Smuzhiyun #define SYSC_MODULE_QUIRK_AESS BIT(19) 63*4882a593Smuzhiyun #define SYSC_MODULE_QUIRK_SGX BIT(18) 64*4882a593Smuzhiyun #define SYSC_MODULE_QUIRK_HDQ1W BIT(17) 65*4882a593Smuzhiyun #define SYSC_MODULE_QUIRK_I2C BIT(16) 66*4882a593Smuzhiyun #define SYSC_MODULE_QUIRK_WDT BIT(15) 67*4882a593Smuzhiyun #define SYSS_QUIRK_RESETDONE_INVERTED BIT(14) 68*4882a593Smuzhiyun #define SYSC_QUIRK_SWSUP_MSTANDBY BIT(13) 69*4882a593Smuzhiyun #define SYSC_QUIRK_SWSUP_SIDLE_ACT BIT(12) 70*4882a593Smuzhiyun #define SYSC_QUIRK_SWSUP_SIDLE BIT(11) 71*4882a593Smuzhiyun #define SYSC_QUIRK_EXT_OPT_CLOCK BIT(10) 72*4882a593Smuzhiyun #define SYSC_QUIRK_LEGACY_IDLE BIT(9) 73*4882a593Smuzhiyun #define SYSC_QUIRK_RESET_STATUS BIT(8) 74*4882a593Smuzhiyun #define SYSC_QUIRK_NO_IDLE BIT(7) 75*4882a593Smuzhiyun #define SYSC_QUIRK_NO_IDLE_ON_INIT BIT(6) 76*4882a593Smuzhiyun #define SYSC_QUIRK_NO_RESET_ON_INIT BIT(5) 77*4882a593Smuzhiyun #define SYSC_QUIRK_OPT_CLKS_NEEDED BIT(4) 78*4882a593Smuzhiyun #define SYSC_QUIRK_OPT_CLKS_IN_RESET BIT(3) 79*4882a593Smuzhiyun #define SYSC_QUIRK_16BIT BIT(2) 80*4882a593Smuzhiyun #define SYSC_QUIRK_UNCACHED BIT(1) 81*4882a593Smuzhiyun #define SYSC_QUIRK_USE_CLOCKACT BIT(0) 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun #define SYSC_NR_IDLEMODES 4 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun /** 86*4882a593Smuzhiyun * struct sysc_capabilities - capabilities for an interconnect target module 87*4882a593Smuzhiyun * @type: sysc type identifier for the module 88*4882a593Smuzhiyun * @sysc_mask: bitmask of supported SYSCONFIG register bits 89*4882a593Smuzhiyun * @regbits: bitmask of SYSCONFIG register bits 90*4882a593Smuzhiyun * @mod_quirks: bitmask of module specific quirks 91*4882a593Smuzhiyun */ 92*4882a593Smuzhiyun struct sysc_capabilities { 93*4882a593Smuzhiyun const enum ti_sysc_module_type type; 94*4882a593Smuzhiyun const u32 sysc_mask; 95*4882a593Smuzhiyun const struct sysc_regbits *regbits; 96*4882a593Smuzhiyun const u32 mod_quirks; 97*4882a593Smuzhiyun }; 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun /** 100*4882a593Smuzhiyun * struct sysc_config - configuration for an interconnect target module 101*4882a593Smuzhiyun * @sysc_val: configured value for sysc register 102*4882a593Smuzhiyun * @syss_mask: configured mask value for SYSSTATUS register 103*4882a593Smuzhiyun * @midlemodes: bitmask of supported master idle modes 104*4882a593Smuzhiyun * @sidlemodes: bitmask of supported slave idle modes 105*4882a593Smuzhiyun * @srst_udelay: optional delay needed after OCP soft reset 106*4882a593Smuzhiyun * @quirks: bitmask of enabled quirks 107*4882a593Smuzhiyun */ 108*4882a593Smuzhiyun struct sysc_config { 109*4882a593Smuzhiyun u32 sysc_val; 110*4882a593Smuzhiyun u32 syss_mask; 111*4882a593Smuzhiyun u8 midlemodes; 112*4882a593Smuzhiyun u8 sidlemodes; 113*4882a593Smuzhiyun u8 srst_udelay; 114*4882a593Smuzhiyun u32 quirks; 115*4882a593Smuzhiyun }; 116*4882a593Smuzhiyun 117*4882a593Smuzhiyun enum sysc_registers { 118*4882a593Smuzhiyun SYSC_REVISION, 119*4882a593Smuzhiyun SYSC_SYSCONFIG, 120*4882a593Smuzhiyun SYSC_SYSSTATUS, 121*4882a593Smuzhiyun SYSC_MAX_REGS, 122*4882a593Smuzhiyun }; 123*4882a593Smuzhiyun 124*4882a593Smuzhiyun /** 125*4882a593Smuzhiyun * struct ti_sysc_module_data - ti-sysc to hwmod translation data for a module 126*4882a593Smuzhiyun * @name: legacy "ti,hwmods" module name 127*4882a593Smuzhiyun * @module_pa: physical address of the interconnect target module 128*4882a593Smuzhiyun * @module_size: size of the interconnect target module 129*4882a593Smuzhiyun * @offsets: array of register offsets as listed in enum sysc_registers 130*4882a593Smuzhiyun * @nr_offsets: number of registers 131*4882a593Smuzhiyun * @cap: interconnect target module capabilities 132*4882a593Smuzhiyun * @cfg: interconnect target module configuration 133*4882a593Smuzhiyun * 134*4882a593Smuzhiyun * This data is enough to allocate a new struct omap_hwmod_class_sysconfig 135*4882a593Smuzhiyun * based on device tree data parsed by ti-sysc driver. 136*4882a593Smuzhiyun */ 137*4882a593Smuzhiyun struct ti_sysc_module_data { 138*4882a593Smuzhiyun const char *name; 139*4882a593Smuzhiyun u64 module_pa; 140*4882a593Smuzhiyun u32 module_size; 141*4882a593Smuzhiyun int *offsets; 142*4882a593Smuzhiyun int nr_offsets; 143*4882a593Smuzhiyun const struct sysc_capabilities *cap; 144*4882a593Smuzhiyun struct sysc_config *cfg; 145*4882a593Smuzhiyun }; 146*4882a593Smuzhiyun 147*4882a593Smuzhiyun struct device; 148*4882a593Smuzhiyun struct clk; 149*4882a593Smuzhiyun 150*4882a593Smuzhiyun struct ti_sysc_platform_data { 151*4882a593Smuzhiyun struct of_dev_auxdata *auxdata; 152*4882a593Smuzhiyun bool (*soc_type_gp)(void); 153*4882a593Smuzhiyun int (*init_clockdomain)(struct device *dev, struct clk *fck, 154*4882a593Smuzhiyun struct clk *ick, struct ti_sysc_cookie *cookie); 155*4882a593Smuzhiyun void (*clkdm_deny_idle)(struct device *dev, 156*4882a593Smuzhiyun const struct ti_sysc_cookie *cookie); 157*4882a593Smuzhiyun void (*clkdm_allow_idle)(struct device *dev, 158*4882a593Smuzhiyun const struct ti_sysc_cookie *cookie); 159*4882a593Smuzhiyun int (*init_module)(struct device *dev, 160*4882a593Smuzhiyun const struct ti_sysc_module_data *data, 161*4882a593Smuzhiyun struct ti_sysc_cookie *cookie); 162*4882a593Smuzhiyun int (*enable_module)(struct device *dev, 163*4882a593Smuzhiyun const struct ti_sysc_cookie *cookie); 164*4882a593Smuzhiyun int (*idle_module)(struct device *dev, 165*4882a593Smuzhiyun const struct ti_sysc_cookie *cookie); 166*4882a593Smuzhiyun int (*shutdown_module)(struct device *dev, 167*4882a593Smuzhiyun const struct ti_sysc_cookie *cookie); 168*4882a593Smuzhiyun }; 169*4882a593Smuzhiyun 170*4882a593Smuzhiyun #endif /* __TI_SYSC_DATA_H__ */ 171