Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v3.4-rc1 179 lines 4.0 kB view raw
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 */ 52struct 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 */ 69static 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 */ 87static 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 */ 108static 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 */ 119static 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 */ 130static 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 */ 147static 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 */ 167static 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