sec-irq.c 6.9 KB
Newer Older
S
Sangbeom Kim 已提交
1
/*
2
 * sec-irq.c
S
Sangbeom Kim 已提交
3 4 5 6 7 8 9 10 11 12 13 14 15 16
 *
 * Copyright (c) 2011 Samsung Electronics Co., Ltd
 *              http://www.samsung.com
 *
 *  This program is free software; you can redistribute  it and/or modify it
 *  under  the terms of  the GNU General  Public License as published by the
 *  Free Software Foundation;  either version 2 of the  License, or (at your
 *  option) any later version.
 *
 */

#include <linux/device.h>
#include <linux/interrupt.h>
#include <linux/irq.h>
S
Sangbeom Kim 已提交
17 18
#include <linux/regmap.h>

S
Sangbeom Kim 已提交
19 20
#include <linux/mfd/samsung/core.h>
#include <linux/mfd/samsung/irq.h>
S
Sangbeom Kim 已提交
21
#include <linux/mfd/samsung/s2mps11.h>
S
Sangbeom Kim 已提交
22 23
#include <linux/mfd/samsung/s5m8763.h>
#include <linux/mfd/samsung/s5m8767.h>
S
Sangbeom Kim 已提交
24

25
static const struct regmap_irq s2mps11_irqs[] = {
S
Sangbeom Kim 已提交
26
	[S2MPS11_IRQ_PWRONF] = {
27
		.reg_offset = 0,
S
Sangbeom Kim 已提交
28 29 30
		.mask = S2MPS11_IRQ_PWRONF_MASK,
	},
	[S2MPS11_IRQ_PWRONR] = {
31
		.reg_offset = 0,
S
Sangbeom Kim 已提交
32 33 34
		.mask = S2MPS11_IRQ_PWRONR_MASK,
	},
	[S2MPS11_IRQ_JIGONBF] = {
35
		.reg_offset = 0,
S
Sangbeom Kim 已提交
36 37 38
		.mask = S2MPS11_IRQ_JIGONBF_MASK,
	},
	[S2MPS11_IRQ_JIGONBR] = {
39
		.reg_offset = 0,
S
Sangbeom Kim 已提交
40 41 42
		.mask = S2MPS11_IRQ_JIGONBR_MASK,
	},
	[S2MPS11_IRQ_ACOKBF] = {
43
		.reg_offset = 0,
S
Sangbeom Kim 已提交
44 45 46
		.mask = S2MPS11_IRQ_ACOKBF_MASK,
	},
	[S2MPS11_IRQ_ACOKBR] = {
47
		.reg_offset = 0,
S
Sangbeom Kim 已提交
48 49 50
		.mask = S2MPS11_IRQ_ACOKBR_MASK,
	},
	[S2MPS11_IRQ_PWRON1S] = {
51
		.reg_offset = 0,
S
Sangbeom Kim 已提交
52 53 54
		.mask = S2MPS11_IRQ_PWRON1S_MASK,
	},
	[S2MPS11_IRQ_MRB] = {
55
		.reg_offset = 0,
S
Sangbeom Kim 已提交
56 57 58
		.mask = S2MPS11_IRQ_MRB_MASK,
	},
	[S2MPS11_IRQ_RTC60S] = {
59
		.reg_offset = 1,
S
Sangbeom Kim 已提交
60 61 62
		.mask = S2MPS11_IRQ_RTC60S_MASK,
	},
	[S2MPS11_IRQ_RTCA1] = {
63
		.reg_offset = 1,
S
Sangbeom Kim 已提交
64 65 66
		.mask = S2MPS11_IRQ_RTCA1_MASK,
	},
	[S2MPS11_IRQ_RTCA2] = {
67
		.reg_offset = 1,
S
Sangbeom Kim 已提交
68 69 70
		.mask = S2MPS11_IRQ_RTCA2_MASK,
	},
	[S2MPS11_IRQ_SMPL] = {
71
		.reg_offset = 1,
S
Sangbeom Kim 已提交
72 73 74
		.mask = S2MPS11_IRQ_SMPL_MASK,
	},
	[S2MPS11_IRQ_RTC1S] = {
75
		.reg_offset = 1,
S
Sangbeom Kim 已提交
76 77 78
		.mask = S2MPS11_IRQ_RTC1S_MASK,
	},
	[S2MPS11_IRQ_WTSR] = {
79
		.reg_offset = 1,
S
Sangbeom Kim 已提交
80 81 82
		.mask = S2MPS11_IRQ_WTSR_MASK,
	},
	[S2MPS11_IRQ_INT120C] = {
83
		.reg_offset = 2,
S
Sangbeom Kim 已提交
84 85 86
		.mask = S2MPS11_IRQ_INT120C_MASK,
	},
	[S2MPS11_IRQ_INT140C] = {
87
		.reg_offset = 2,
S
Sangbeom Kim 已提交
88 89
		.mask = S2MPS11_IRQ_INT140C_MASK,
	},
S
Sangbeom Kim 已提交
90 91
};

S
Sangbeom Kim 已提交
92

93
static const struct regmap_irq s5m8767_irqs[] = {
S
Sangbeom Kim 已提交
94
	[S5M8767_IRQ_PWRR] = {
95
		.reg_offset = 0,
S
Sangbeom Kim 已提交
96 97 98
		.mask = S5M8767_IRQ_PWRR_MASK,
	},
	[S5M8767_IRQ_PWRF] = {
99
		.reg_offset = 0,
S
Sangbeom Kim 已提交
100 101 102
		.mask = S5M8767_IRQ_PWRF_MASK,
	},
	[S5M8767_IRQ_PWR1S] = {
103
		.reg_offset = 0,
S
Sangbeom Kim 已提交
104 105 106
		.mask = S5M8767_IRQ_PWR1S_MASK,
	},
	[S5M8767_IRQ_JIGR] = {
107
		.reg_offset = 0,
S
Sangbeom Kim 已提交
108 109 110
		.mask = S5M8767_IRQ_JIGR_MASK,
	},
	[S5M8767_IRQ_JIGF] = {
111
		.reg_offset = 0,
S
Sangbeom Kim 已提交
112 113 114
		.mask = S5M8767_IRQ_JIGF_MASK,
	},
	[S5M8767_IRQ_LOWBAT2] = {
115
		.reg_offset = 0,
S
Sangbeom Kim 已提交
116 117 118
		.mask = S5M8767_IRQ_LOWBAT2_MASK,
	},
	[S5M8767_IRQ_LOWBAT1] = {
119
		.reg_offset = 0,
S
Sangbeom Kim 已提交
120 121 122
		.mask = S5M8767_IRQ_LOWBAT1_MASK,
	},
	[S5M8767_IRQ_MRB] = {
123
		.reg_offset = 1,
S
Sangbeom Kim 已提交
124 125 126
		.mask = S5M8767_IRQ_MRB_MASK,
	},
	[S5M8767_IRQ_DVSOK2] = {
127
		.reg_offset = 1,
S
Sangbeom Kim 已提交
128 129 130
		.mask = S5M8767_IRQ_DVSOK2_MASK,
	},
	[S5M8767_IRQ_DVSOK3] = {
131
		.reg_offset = 1,
S
Sangbeom Kim 已提交
132 133 134
		.mask = S5M8767_IRQ_DVSOK3_MASK,
	},
	[S5M8767_IRQ_DVSOK4] = {
135
		.reg_offset = 1,
S
Sangbeom Kim 已提交
136 137 138
		.mask = S5M8767_IRQ_DVSOK4_MASK,
	},
	[S5M8767_IRQ_RTC60S] = {
139
		.reg_offset = 2,
S
Sangbeom Kim 已提交
140 141 142
		.mask = S5M8767_IRQ_RTC60S_MASK,
	},
	[S5M8767_IRQ_RTCA1] = {
143
		.reg_offset = 2,
S
Sangbeom Kim 已提交
144 145 146
		.mask = S5M8767_IRQ_RTCA1_MASK,
	},
	[S5M8767_IRQ_RTCA2] = {
147
		.reg_offset = 2,
S
Sangbeom Kim 已提交
148 149 150
		.mask = S5M8767_IRQ_RTCA2_MASK,
	},
	[S5M8767_IRQ_SMPL] = {
151
		.reg_offset = 2,
S
Sangbeom Kim 已提交
152 153 154
		.mask = S5M8767_IRQ_SMPL_MASK,
	},
	[S5M8767_IRQ_RTC1S] = {
155
		.reg_offset = 2,
S
Sangbeom Kim 已提交
156 157 158
		.mask = S5M8767_IRQ_RTC1S_MASK,
	},
	[S5M8767_IRQ_WTSR] = {
159
		.reg_offset = 2,
S
Sangbeom Kim 已提交
160 161 162 163
		.mask = S5M8767_IRQ_WTSR_MASK,
	},
};

164
static const struct regmap_irq s5m8763_irqs[] = {
S
Sangbeom Kim 已提交
165
	[S5M8763_IRQ_DCINF] = {
166
		.reg_offset = 0,
S
Sangbeom Kim 已提交
167 168 169
		.mask = S5M8763_IRQ_DCINF_MASK,
	},
	[S5M8763_IRQ_DCINR] = {
170
		.reg_offset = 0,
S
Sangbeom Kim 已提交
171 172 173
		.mask = S5M8763_IRQ_DCINR_MASK,
	},
	[S5M8763_IRQ_JIGF] = {
174
		.reg_offset = 0,
S
Sangbeom Kim 已提交
175 176 177
		.mask = S5M8763_IRQ_JIGF_MASK,
	},
	[S5M8763_IRQ_JIGR] = {
178
		.reg_offset = 0,
S
Sangbeom Kim 已提交
179 180 181
		.mask = S5M8763_IRQ_JIGR_MASK,
	},
	[S5M8763_IRQ_PWRONF] = {
182
		.reg_offset = 0,
S
Sangbeom Kim 已提交
183 184 185
		.mask = S5M8763_IRQ_PWRONF_MASK,
	},
	[S5M8763_IRQ_PWRONR] = {
186
		.reg_offset = 0,
S
Sangbeom Kim 已提交
187 188 189
		.mask = S5M8763_IRQ_PWRONR_MASK,
	},
	[S5M8763_IRQ_WTSREVNT] = {
190
		.reg_offset = 1,
S
Sangbeom Kim 已提交
191 192 193
		.mask = S5M8763_IRQ_WTSREVNT_MASK,
	},
	[S5M8763_IRQ_SMPLEVNT] = {
194
		.reg_offset = 1,
S
Sangbeom Kim 已提交
195 196 197
		.mask = S5M8763_IRQ_SMPLEVNT_MASK,
	},
	[S5M8763_IRQ_ALARM1] = {
198
		.reg_offset = 1,
S
Sangbeom Kim 已提交
199 200 201
		.mask = S5M8763_IRQ_ALARM1_MASK,
	},
	[S5M8763_IRQ_ALARM0] = {
202
		.reg_offset = 1,
S
Sangbeom Kim 已提交
203 204 205
		.mask = S5M8763_IRQ_ALARM0_MASK,
	},
	[S5M8763_IRQ_ONKEY1S] = {
206
		.reg_offset = 2,
S
Sangbeom Kim 已提交
207 208 209
		.mask = S5M8763_IRQ_ONKEY1S_MASK,
	},
	[S5M8763_IRQ_TOPOFFR] = {
210
		.reg_offset = 2,
S
Sangbeom Kim 已提交
211 212 213
		.mask = S5M8763_IRQ_TOPOFFR_MASK,
	},
	[S5M8763_IRQ_DCINOVPR] = {
214
		.reg_offset = 2,
S
Sangbeom Kim 已提交
215 216 217
		.mask = S5M8763_IRQ_DCINOVPR_MASK,
	},
	[S5M8763_IRQ_CHGRSTF] = {
218
		.reg_offset = 2,
S
Sangbeom Kim 已提交
219 220 221
		.mask = S5M8763_IRQ_CHGRSTF_MASK,
	},
	[S5M8763_IRQ_DONER] = {
222
		.reg_offset = 2,
S
Sangbeom Kim 已提交
223 224 225
		.mask = S5M8763_IRQ_DONER_MASK,
	},
	[S5M8763_IRQ_CHGFAULT] = {
226
		.reg_offset = 2,
S
Sangbeom Kim 已提交
227 228 229
		.mask = S5M8763_IRQ_CHGFAULT_MASK,
	},
	[S5M8763_IRQ_LOBAT1] = {
230
		.reg_offset = 3,
S
Sangbeom Kim 已提交
231 232 233
		.mask = S5M8763_IRQ_LOBAT1_MASK,
	},
	[S5M8763_IRQ_LOBAT2] = {
234
		.reg_offset = 3,
S
Sangbeom Kim 已提交
235 236 237 238
		.mask = S5M8763_IRQ_LOBAT2_MASK,
	},
};

239
static const struct regmap_irq_chip s2mps11_irq_chip = {
S
Sangbeom Kim 已提交
240 241 242 243 244 245 246 247
	.name = "s2mps11",
	.irqs = s2mps11_irqs,
	.num_irqs = ARRAY_SIZE(s2mps11_irqs),
	.num_regs = 3,
	.status_base = S2MPS11_REG_INT1,
	.mask_base = S2MPS11_REG_INT1M,
	.ack_base = S2MPS11_REG_INT1,
};
S
Sangbeom Kim 已提交
248

249
static const struct regmap_irq_chip s5m8767_irq_chip = {
S
Sangbeom Kim 已提交
250
	.name = "s5m8767",
S
Sangbeom Kim 已提交
251 252 253 254 255 256
	.irqs = s5m8767_irqs,
	.num_irqs = ARRAY_SIZE(s5m8767_irqs),
	.num_regs = 3,
	.status_base = S5M8767_REG_INT1,
	.mask_base = S5M8767_REG_INT1M,
	.ack_base = S5M8767_REG_INT1,
S
Sangbeom Kim 已提交
257 258
};

259
static const struct regmap_irq_chip s5m8763_irq_chip = {
S
Sangbeom Kim 已提交
260
	.name = "s5m8763",
S
Sangbeom Kim 已提交
261 262 263 264 265 266
	.irqs = s5m8763_irqs,
	.num_irqs = ARRAY_SIZE(s5m8763_irqs),
	.num_regs = 4,
	.status_base = S5M8763_REG_IRQ1,
	.mask_base = S5M8763_REG_IRQM1,
	.ack_base = S5M8763_REG_IRQ1,
S
Sangbeom Kim 已提交
267 268
};

269
int sec_irq_init(struct sec_pmic_dev *sec_pmic)
S
Sangbeom Kim 已提交
270 271
{
	int ret = 0;
272
	int type = sec_pmic->device_type;
S
Sangbeom Kim 已提交
273

274 275
	if (!sec_pmic->irq) {
		dev_warn(sec_pmic->dev,
S
Sangbeom Kim 已提交
276
			 "No interrupt specified, no interrupts\n");
277
		sec_pmic->irq_base = 0;
S
Sangbeom Kim 已提交
278 279 280 281 282
		return 0;
	}

	switch (type) {
	case S5M8763X:
283
		ret = regmap_add_irq_chip(sec_pmic->regmap_pmic, sec_pmic->irq,
S
Sangbeom Kim 已提交
284 285 286
				  IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
				  sec_pmic->irq_base, &s5m8763_irq_chip,
				  &sec_pmic->irq_data);
S
Sangbeom Kim 已提交
287 288
		break;
	case S5M8767X:
289
		ret = regmap_add_irq_chip(sec_pmic->regmap_pmic, sec_pmic->irq,
S
Sangbeom Kim 已提交
290 291 292
				  IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
				  sec_pmic->irq_base, &s5m8767_irq_chip,
				  &sec_pmic->irq_data);
S
Sangbeom Kim 已提交
293
		break;
S
Sangbeom Kim 已提交
294
	case S2MPS11X:
295
		ret = regmap_add_irq_chip(sec_pmic->regmap_pmic, sec_pmic->irq,
S
Sangbeom Kim 已提交
296 297 298
				  IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
				  sec_pmic->irq_base, &s2mps11_irq_chip,
				  &sec_pmic->irq_data);
S
Sangbeom Kim 已提交
299 300
		break;
	default:
S
Sangbeom Kim 已提交
301 302 303
		dev_err(sec_pmic->dev, "Unknown device type %d\n",
			sec_pmic->device_type);
		return -EINVAL;
S
Sangbeom Kim 已提交
304 305
	}

S
Sangbeom Kim 已提交
306 307
	if (ret != 0) {
		dev_err(sec_pmic->dev, "Failed to register IRQ chip: %d\n", ret);
308 309
		return ret;
	}
S
Sangbeom Kim 已提交
310 311 312 313

	return 0;
}

314
void sec_irq_exit(struct sec_pmic_dev *sec_pmic)
S
Sangbeom Kim 已提交
315
{
S
Sangbeom Kim 已提交
316
	regmap_del_irq_chip(sec_pmic->irq, sec_pmic->irq_data);
S
Sangbeom Kim 已提交
317
}