Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 /*
0003  * Interrupt support for Cirrus Logic Madera codecs
0004  *
0005  * Copyright (C) 2016-2018 Cirrus Logic, Inc. and
0006  *                         Cirrus Logic International Semiconductor Ltd.
0007  */
0008 
0009 #ifndef IRQCHIP_MADERA_H
0010 #define IRQCHIP_MADERA_H
0011 
0012 #include <linux/interrupt.h>
0013 #include <linux/mfd/madera/core.h>
0014 
0015 #define MADERA_IRQ_FLL1_LOCK        0
0016 #define MADERA_IRQ_FLL2_LOCK        1
0017 #define MADERA_IRQ_FLL3_LOCK        2
0018 #define MADERA_IRQ_FLLAO_LOCK       3
0019 #define MADERA_IRQ_CLK_SYS_ERR      4
0020 #define MADERA_IRQ_CLK_ASYNC_ERR    5
0021 #define MADERA_IRQ_CLK_DSP_ERR      6
0022 #define MADERA_IRQ_HPDET        7
0023 #define MADERA_IRQ_MICDET1      8
0024 #define MADERA_IRQ_MICDET2      9
0025 #define MADERA_IRQ_JD1_RISE     10
0026 #define MADERA_IRQ_JD1_FALL     11
0027 #define MADERA_IRQ_JD2_RISE     12
0028 #define MADERA_IRQ_JD2_FALL     13
0029 #define MADERA_IRQ_MICD_CLAMP_RISE  14
0030 #define MADERA_IRQ_MICD_CLAMP_FALL  15
0031 #define MADERA_IRQ_DRC2_SIG_DET     16
0032 #define MADERA_IRQ_DRC1_SIG_DET     17
0033 #define MADERA_IRQ_ASRC1_IN1_LOCK   18
0034 #define MADERA_IRQ_ASRC1_IN2_LOCK   19
0035 #define MADERA_IRQ_ASRC2_IN1_LOCK   20
0036 #define MADERA_IRQ_ASRC2_IN2_LOCK   21
0037 #define MADERA_IRQ_DSP_IRQ1     22
0038 #define MADERA_IRQ_DSP_IRQ2     23
0039 #define MADERA_IRQ_DSP_IRQ3     24
0040 #define MADERA_IRQ_DSP_IRQ4     25
0041 #define MADERA_IRQ_DSP_IRQ5     26
0042 #define MADERA_IRQ_DSP_IRQ6     27
0043 #define MADERA_IRQ_DSP_IRQ7     28
0044 #define MADERA_IRQ_DSP_IRQ8     29
0045 #define MADERA_IRQ_DSP_IRQ9     30
0046 #define MADERA_IRQ_DSP_IRQ10        31
0047 #define MADERA_IRQ_DSP_IRQ11        32
0048 #define MADERA_IRQ_DSP_IRQ12        33
0049 #define MADERA_IRQ_DSP_IRQ13        34
0050 #define MADERA_IRQ_DSP_IRQ14        35
0051 #define MADERA_IRQ_DSP_IRQ15        36
0052 #define MADERA_IRQ_DSP_IRQ16        37
0053 #define MADERA_IRQ_HP1L_SC      38
0054 #define MADERA_IRQ_HP1R_SC      39
0055 #define MADERA_IRQ_HP2L_SC      40
0056 #define MADERA_IRQ_HP2R_SC      41
0057 #define MADERA_IRQ_HP3L_SC      42
0058 #define MADERA_IRQ_HP3R_SC      43
0059 #define MADERA_IRQ_SPKOUTL_SC       44
0060 #define MADERA_IRQ_SPKOUTR_SC       45
0061 #define MADERA_IRQ_HP1L_ENABLE_DONE 46
0062 #define MADERA_IRQ_HP1R_ENABLE_DONE 47
0063 #define MADERA_IRQ_HP2L_ENABLE_DONE 48
0064 #define MADERA_IRQ_HP2R_ENABLE_DONE 49
0065 #define MADERA_IRQ_HP3L_ENABLE_DONE 50
0066 #define MADERA_IRQ_HP3R_ENABLE_DONE 51
0067 #define MADERA_IRQ_SPKOUTL_ENABLE_DONE  52
0068 #define MADERA_IRQ_SPKOUTR_ENABLE_DONE  53
0069 #define MADERA_IRQ_SPK_SHUTDOWN     54
0070 #define MADERA_IRQ_SPK_OVERHEAT     55
0071 #define MADERA_IRQ_SPK_OVERHEAT_WARN    56
0072 #define MADERA_IRQ_GPIO1        57
0073 #define MADERA_IRQ_GPIO2        58
0074 #define MADERA_IRQ_GPIO3        59
0075 #define MADERA_IRQ_GPIO4        60
0076 #define MADERA_IRQ_GPIO5        61
0077 #define MADERA_IRQ_GPIO6        62
0078 #define MADERA_IRQ_GPIO7        63
0079 #define MADERA_IRQ_GPIO8        64
0080 #define MADERA_IRQ_DSP1_BUS_ERR     65
0081 #define MADERA_IRQ_DSP2_BUS_ERR     66
0082 #define MADERA_IRQ_DSP3_BUS_ERR     67
0083 #define MADERA_IRQ_DSP4_BUS_ERR     68
0084 #define MADERA_IRQ_DSP5_BUS_ERR     69
0085 #define MADERA_IRQ_DSP6_BUS_ERR     70
0086 #define MADERA_IRQ_DSP7_BUS_ERR     71
0087 
0088 #define MADERA_NUM_IRQ          72
0089 
0090 /*
0091  * These wrapper functions are for use by other child drivers of the
0092  * same parent MFD.
0093  */
0094 static inline int madera_get_irq_mapping(struct madera *madera, int irq)
0095 {
0096     if (!madera->irq_dev)
0097         return -ENODEV;
0098 
0099     return regmap_irq_get_virq(madera->irq_data, irq);
0100 }
0101 
0102 static inline int madera_request_irq(struct madera *madera, int irq,
0103                      const char *name,
0104                      irq_handler_t handler, void *data)
0105 {
0106     irq = madera_get_irq_mapping(madera, irq);
0107     if (irq < 0)
0108         return irq;
0109 
0110     return request_threaded_irq(irq, NULL, handler, IRQF_ONESHOT, name,
0111                     data);
0112 }
0113 
0114 static inline void madera_free_irq(struct madera *madera, int irq, void *data)
0115 {
0116     irq = madera_get_irq_mapping(madera, irq);
0117     if (irq < 0)
0118         return;
0119 
0120     free_irq(irq, data);
0121 }
0122 
0123 static inline int madera_set_irq_wake(struct madera *madera, int irq, int on)
0124 {
0125     irq = madera_get_irq_mapping(madera, irq);
0126     if (irq < 0)
0127         return irq;
0128 
0129     return irq_set_irq_wake(irq, on);
0130 }
0131 
0132 #endif