xref: /OK3568_Linux_fs/kernel/include/linux/platform_data/ti-sysc.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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