xref: /linux/arch/arm/include/asm/cti.h (revision 498495dba268b20e8eadd7fe93c140c68b6cc9d2)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef __ASMARM_CTI_H
3 #define __ASMARM_CTI_H
4 
5 #include	<asm/io.h>
6 #include	<asm/hardware/coresight.h>
7 
8 /* The registers' definition is from section 3.2 of
9  * Embedded Cross Trigger Revision: r0p0
10  */
11 #define		CTICONTROL		0x000
12 #define		CTISTATUS		0x004
13 #define		CTILOCK			0x008
14 #define		CTIPROTECTION		0x00C
15 #define		CTIINTACK		0x010
16 #define		CTIAPPSET		0x014
17 #define		CTIAPPCLEAR		0x018
18 #define		CTIAPPPULSE		0x01c
19 #define		CTIINEN			0x020
20 #define		CTIOUTEN		0x0A0
21 #define		CTITRIGINSTATUS		0x130
22 #define		CTITRIGOUTSTATUS	0x134
23 #define		CTICHINSTATUS		0x138
24 #define		CTICHOUTSTATUS		0x13c
25 #define		CTIPERIPHID0		0xFE0
26 #define		CTIPERIPHID1		0xFE4
27 #define		CTIPERIPHID2		0xFE8
28 #define		CTIPERIPHID3		0xFEC
29 #define		CTIPCELLID0		0xFF0
30 #define		CTIPCELLID1		0xFF4
31 #define		CTIPCELLID2		0xFF8
32 #define		CTIPCELLID3		0xFFC
33 
34 /* The below are from section 3.6.4 of
35  * CoreSight v1.0 Architecture Specification
36  */
37 #define		LOCKACCESS		0xFB0
38 #define		LOCKSTATUS		0xFB4
39 
40 /**
41  * struct cti - cross trigger interface struct
42  * @base: mapped virtual address for the cti base
43  * @irq: irq number for the cti
44  * @trig_out_for_irq: triger out number which will cause
45  *	the @irq happen
46  *
47  * cti struct used to operate cti registers.
48  */
49 struct cti {
50 	void __iomem *base;
51 	int irq;
52 	int trig_out_for_irq;
53 };
54 
55 /**
56  * cti_init - initialize the cti instance
57  * @cti: cti instance
58  * @base: mapped virtual address for the cti base
59  * @irq: irq number for the cti
60  * @trig_out: triger out number which will cause
61  *	the @irq happen
62  *
63  * called by machine code to pass the board dependent
64  * @base, @irq and @trig_out to cti.
65  */
cti_init(struct cti * cti,void __iomem * base,int irq,int trig_out)66 static inline void cti_init(struct cti *cti,
67 	void __iomem *base, int irq, int trig_out)
68 {
69 	cti->base = base;
70 	cti->irq  = irq;
71 	cti->trig_out_for_irq = trig_out;
72 }
73 
74 /**
75  * cti_map_trigger - use the @chan to map @trig_in to @trig_out
76  * @cti: cti instance
77  * @trig_in: trigger in number
78  * @trig_out: trigger out number
79  * @channel: channel number
80  *
81  * This function maps one trigger in of @trig_in to one trigger
82  * out of @trig_out using the channel @chan.
83  */
cti_map_trigger(struct cti * cti,int trig_in,int trig_out,int chan)84 static inline void cti_map_trigger(struct cti *cti,
85 	int trig_in, int trig_out, int chan)
86 {
87 	void __iomem *base = cti->base;
88 	unsigned long val;
89 
90 	val = __raw_readl(base + CTIINEN + trig_in * 4);
91 	val |= BIT(chan);
92 	__raw_writel(val, base + CTIINEN + trig_in * 4);
93 
94 	val = __raw_readl(base + CTIOUTEN + trig_out * 4);
95 	val |= BIT(chan);
96 	__raw_writel(val, base + CTIOUTEN + trig_out * 4);
97 }
98 
99 /**
100  * cti_enable - enable the cti module
101  * @cti: cti instance
102  *
103  * enable the cti module
104  */
cti_enable(struct cti * cti)105 static inline void cti_enable(struct cti *cti)
106 {
107 	__raw_writel(0x1, cti->base + CTICONTROL);
108 }
109 
110 /**
111  * cti_disable - disable the cti module
112  * @cti: cti instance
113  *
114  * enable the cti module
115  */
cti_disable(struct cti * cti)116 static inline void cti_disable(struct cti *cti)
117 {
118 	__raw_writel(0, cti->base + CTICONTROL);
119 }
120 
121 /**
122  * cti_irq_ack - clear the cti irq
123  * @cti: cti instance
124  *
125  * clear the cti irq
126  */
cti_irq_ack(struct cti * cti)127 static inline void cti_irq_ack(struct cti *cti)
128 {
129 	void __iomem *base = cti->base;
130 	unsigned long val;
131 
132 	val = __raw_readl(base + CTIINTACK);
133 	val |= BIT(cti->trig_out_for_irq);
134 	__raw_writel(val, base + CTIINTACK);
135 }
136 
137 /**
138  * cti_unlock - unlock cti module
139  * @cti: cti instance
140  *
141  * unlock the cti module, or else any writes to the cti
142  * module is not allowed.
143  */
cti_unlock(struct cti * cti)144 static inline void cti_unlock(struct cti *cti)
145 {
146 	__raw_writel(CS_LAR_KEY, cti->base + LOCKACCESS);
147 }
148 
149 /**
150  * cti_lock - lock cti module
151  * @cti: cti instance
152  *
153  * lock the cti module, so any writes to the cti
154  * module will be not allowed.
155  */
cti_lock(struct cti * cti)156 static inline void cti_lock(struct cti *cti)
157 {
158 	__raw_writel(~CS_LAR_KEY, cti->base + LOCKACCESS);
159 }
160 #endif
161