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