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