hc
2024-08-09 d3d58fa5ee2428cd2dde78fd8eeeeabe916b3835
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
/* SPDX-License-Identifier: GPL-2.0 */
/*
 * Interrupt support for Cirrus Logic Madera codecs
 *
 * Copyright (C) 2016-2018 Cirrus Logic, Inc. and
 *                         Cirrus Logic International Semiconductor Ltd.
 */
 
#ifndef IRQCHIP_MADERA_H
#define IRQCHIP_MADERA_H
 
#include <linux/interrupt.h>
#include <linux/mfd/madera/core.h>
 
#define MADERA_IRQ_FLL1_LOCK        0
#define MADERA_IRQ_FLL2_LOCK        1
#define MADERA_IRQ_FLL3_LOCK        2
#define MADERA_IRQ_FLLAO_LOCK        3
#define MADERA_IRQ_CLK_SYS_ERR        4
#define MADERA_IRQ_CLK_ASYNC_ERR    5
#define MADERA_IRQ_CLK_DSP_ERR        6
#define MADERA_IRQ_HPDET        7
#define MADERA_IRQ_MICDET1        8
#define MADERA_IRQ_MICDET2        9
#define MADERA_IRQ_JD1_RISE        10
#define MADERA_IRQ_JD1_FALL        11
#define MADERA_IRQ_JD2_RISE        12
#define MADERA_IRQ_JD2_FALL        13
#define MADERA_IRQ_MICD_CLAMP_RISE    14
#define MADERA_IRQ_MICD_CLAMP_FALL    15
#define MADERA_IRQ_DRC2_SIG_DET        16
#define MADERA_IRQ_DRC1_SIG_DET        17
#define MADERA_IRQ_ASRC1_IN1_LOCK    18
#define MADERA_IRQ_ASRC1_IN2_LOCK    19
#define MADERA_IRQ_ASRC2_IN1_LOCK    20
#define MADERA_IRQ_ASRC2_IN2_LOCK    21
#define MADERA_IRQ_DSP_IRQ1        22
#define MADERA_IRQ_DSP_IRQ2        23
#define MADERA_IRQ_DSP_IRQ3        24
#define MADERA_IRQ_DSP_IRQ4        25
#define MADERA_IRQ_DSP_IRQ5        26
#define MADERA_IRQ_DSP_IRQ6        27
#define MADERA_IRQ_DSP_IRQ7        28
#define MADERA_IRQ_DSP_IRQ8        29
#define MADERA_IRQ_DSP_IRQ9        30
#define MADERA_IRQ_DSP_IRQ10        31
#define MADERA_IRQ_DSP_IRQ11        32
#define MADERA_IRQ_DSP_IRQ12        33
#define MADERA_IRQ_DSP_IRQ13        34
#define MADERA_IRQ_DSP_IRQ14        35
#define MADERA_IRQ_DSP_IRQ15        36
#define MADERA_IRQ_DSP_IRQ16        37
#define MADERA_IRQ_HP1L_SC        38
#define MADERA_IRQ_HP1R_SC        39
#define MADERA_IRQ_HP2L_SC        40
#define MADERA_IRQ_HP2R_SC        41
#define MADERA_IRQ_HP3L_SC        42
#define MADERA_IRQ_HP3R_SC        43
#define MADERA_IRQ_SPKOUTL_SC        44
#define MADERA_IRQ_SPKOUTR_SC        45
#define MADERA_IRQ_HP1L_ENABLE_DONE    46
#define MADERA_IRQ_HP1R_ENABLE_DONE    47
#define MADERA_IRQ_HP2L_ENABLE_DONE    48
#define MADERA_IRQ_HP2R_ENABLE_DONE    49
#define MADERA_IRQ_HP3L_ENABLE_DONE    50
#define MADERA_IRQ_HP3R_ENABLE_DONE    51
#define MADERA_IRQ_SPKOUTL_ENABLE_DONE    52
#define MADERA_IRQ_SPKOUTR_ENABLE_DONE    53
#define MADERA_IRQ_SPK_SHUTDOWN        54
#define MADERA_IRQ_SPK_OVERHEAT        55
#define MADERA_IRQ_SPK_OVERHEAT_WARN    56
#define MADERA_IRQ_GPIO1        57
#define MADERA_IRQ_GPIO2        58
#define MADERA_IRQ_GPIO3        59
#define MADERA_IRQ_GPIO4        60
#define MADERA_IRQ_GPIO5        61
#define MADERA_IRQ_GPIO6        62
#define MADERA_IRQ_GPIO7        63
#define MADERA_IRQ_GPIO8        64
#define MADERA_IRQ_DSP1_BUS_ERR        65
#define MADERA_IRQ_DSP2_BUS_ERR        66
#define MADERA_IRQ_DSP3_BUS_ERR        67
#define MADERA_IRQ_DSP4_BUS_ERR        68
#define MADERA_IRQ_DSP5_BUS_ERR        69
#define MADERA_IRQ_DSP6_BUS_ERR        70
#define MADERA_IRQ_DSP7_BUS_ERR        71
 
#define MADERA_NUM_IRQ            72
 
/*
 * These wrapper functions are for use by other child drivers of the
 * same parent MFD.
 */
static inline int madera_get_irq_mapping(struct madera *madera, int irq)
{
   if (!madera->irq_dev)
       return -ENODEV;
 
   return regmap_irq_get_virq(madera->irq_data, irq);
}
 
static inline int madera_request_irq(struct madera *madera, int irq,
                    const char *name,
                    irq_handler_t handler, void *data)
{
   irq = madera_get_irq_mapping(madera, irq);
   if (irq < 0)
       return irq;
 
   return request_threaded_irq(irq, NULL, handler, IRQF_ONESHOT, name,
                   data);
}
 
static inline void madera_free_irq(struct madera *madera, int irq, void *data)
{
   irq = madera_get_irq_mapping(madera, irq);
   if (irq < 0)
       return;
 
   free_irq(irq, data);
}
 
static inline int madera_set_irq_wake(struct madera *madera, int irq, int on)
{
   irq = madera_get_irq_mapping(madera, irq);
   if (irq < 0)
       return irq;
 
   return irq_set_irq_wake(irq, on);
}
 
#endif