sec-irq.c 8.8 KB
Newer Older
S
Sangbeom Kim 已提交
1
/*
2
 * sec-irq.c
S
Sangbeom Kim 已提交
3
 *
4
 * Copyright (c) 2011-2014 Samsung Electronics Co., Ltd
S
Sangbeom Kim 已提交
5 6 7 8 9 10 11 12 13 14 15 16
 *              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>
22
#include <linux/mfd/samsung/s2mps14.h>
S
Sangbeom Kim 已提交
23 24
#include <linux/mfd/samsung/s5m8763.h>
#include <linux/mfd/samsung/s5m8767.h>
S
Sangbeom Kim 已提交
25

26
static const struct regmap_irq s2mps11_irqs[] = {
S
Sangbeom Kim 已提交
27
	[S2MPS11_IRQ_PWRONF] = {
28
		.reg_offset = 0,
S
Sangbeom Kim 已提交
29 30 31
		.mask = S2MPS11_IRQ_PWRONF_MASK,
	},
	[S2MPS11_IRQ_PWRONR] = {
32
		.reg_offset = 0,
S
Sangbeom Kim 已提交
33 34 35
		.mask = S2MPS11_IRQ_PWRONR_MASK,
	},
	[S2MPS11_IRQ_JIGONBF] = {
36
		.reg_offset = 0,
S
Sangbeom Kim 已提交
37 38 39
		.mask = S2MPS11_IRQ_JIGONBF_MASK,
	},
	[S2MPS11_IRQ_JIGONBR] = {
40
		.reg_offset = 0,
S
Sangbeom Kim 已提交
41 42 43
		.mask = S2MPS11_IRQ_JIGONBR_MASK,
	},
	[S2MPS11_IRQ_ACOKBF] = {
44
		.reg_offset = 0,
S
Sangbeom Kim 已提交
45 46 47
		.mask = S2MPS11_IRQ_ACOKBF_MASK,
	},
	[S2MPS11_IRQ_ACOKBR] = {
48
		.reg_offset = 0,
S
Sangbeom Kim 已提交
49 50 51
		.mask = S2MPS11_IRQ_ACOKBR_MASK,
	},
	[S2MPS11_IRQ_PWRON1S] = {
52
		.reg_offset = 0,
S
Sangbeom Kim 已提交
53 54 55
		.mask = S2MPS11_IRQ_PWRON1S_MASK,
	},
	[S2MPS11_IRQ_MRB] = {
56
		.reg_offset = 0,
S
Sangbeom Kim 已提交
57 58 59
		.mask = S2MPS11_IRQ_MRB_MASK,
	},
	[S2MPS11_IRQ_RTC60S] = {
60
		.reg_offset = 1,
S
Sangbeom Kim 已提交
61 62
		.mask = S2MPS11_IRQ_RTC60S_MASK,
	},
63
	[S2MPS11_IRQ_RTCA0] = {
64
		.reg_offset = 1,
65
		.mask = S2MPS11_IRQ_RTCA0_MASK,
S
Sangbeom Kim 已提交
66
	},
67
	[S2MPS11_IRQ_RTCA1] = {
68
		.reg_offset = 1,
69
		.mask = S2MPS11_IRQ_RTCA1_MASK,
S
Sangbeom Kim 已提交
70 71
	},
	[S2MPS11_IRQ_SMPL] = {
72
		.reg_offset = 1,
S
Sangbeom Kim 已提交
73 74 75
		.mask = S2MPS11_IRQ_SMPL_MASK,
	},
	[S2MPS11_IRQ_RTC1S] = {
76
		.reg_offset = 1,
S
Sangbeom Kim 已提交
77 78 79
		.mask = S2MPS11_IRQ_RTC1S_MASK,
	},
	[S2MPS11_IRQ_WTSR] = {
80
		.reg_offset = 1,
S
Sangbeom Kim 已提交
81 82 83
		.mask = S2MPS11_IRQ_WTSR_MASK,
	},
	[S2MPS11_IRQ_INT120C] = {
84
		.reg_offset = 2,
S
Sangbeom Kim 已提交
85 86 87
		.mask = S2MPS11_IRQ_INT120C_MASK,
	},
	[S2MPS11_IRQ_INT140C] = {
88
		.reg_offset = 2,
S
Sangbeom Kim 已提交
89 90
		.mask = S2MPS11_IRQ_INT140C_MASK,
	},
S
Sangbeom Kim 已提交
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 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162
static const struct regmap_irq s2mps14_irqs[] = {
	[S2MPS14_IRQ_PWRONF] = {
		.reg_offset = 0,
		.mask = S2MPS11_IRQ_PWRONF_MASK,
	},
	[S2MPS14_IRQ_PWRONR] = {
		.reg_offset = 0,
		.mask = S2MPS11_IRQ_PWRONR_MASK,
	},
	[S2MPS14_IRQ_JIGONBF] = {
		.reg_offset = 0,
		.mask = S2MPS11_IRQ_JIGONBF_MASK,
	},
	[S2MPS14_IRQ_JIGONBR] = {
		.reg_offset = 0,
		.mask = S2MPS11_IRQ_JIGONBR_MASK,
	},
	[S2MPS14_IRQ_ACOKBF] = {
		.reg_offset = 0,
		.mask = S2MPS11_IRQ_ACOKBF_MASK,
	},
	[S2MPS14_IRQ_ACOKBR] = {
		.reg_offset = 0,
		.mask = S2MPS11_IRQ_ACOKBR_MASK,
	},
	[S2MPS14_IRQ_PWRON1S] = {
		.reg_offset = 0,
		.mask = S2MPS11_IRQ_PWRON1S_MASK,
	},
	[S2MPS14_IRQ_MRB] = {
		.reg_offset = 0,
		.mask = S2MPS11_IRQ_MRB_MASK,
	},
	[S2MPS14_IRQ_RTC60S] = {
		.reg_offset = 1,
		.mask = S2MPS11_IRQ_RTC60S_MASK,
	},
	[S2MPS14_IRQ_RTCA1] = {
		.reg_offset = 1,
		.mask = S2MPS11_IRQ_RTCA1_MASK,
	},
	[S2MPS14_IRQ_RTCA0] = {
		.reg_offset = 1,
		.mask = S2MPS11_IRQ_RTCA0_MASK,
	},
	[S2MPS14_IRQ_SMPL] = {
		.reg_offset = 1,
		.mask = S2MPS11_IRQ_SMPL_MASK,
	},
	[S2MPS14_IRQ_RTC1S] = {
		.reg_offset = 1,
		.mask = S2MPS11_IRQ_RTC1S_MASK,
	},
	[S2MPS14_IRQ_WTSR] = {
		.reg_offset = 1,
		.mask = S2MPS11_IRQ_WTSR_MASK,
	},
	[S2MPS14_IRQ_INT120C] = {
		.reg_offset = 2,
		.mask = S2MPS11_IRQ_INT120C_MASK,
	},
	[S2MPS14_IRQ_INT140C] = {
		.reg_offset = 2,
		.mask = S2MPS11_IRQ_INT140C_MASK,
	},
	[S2MPS14_IRQ_TSD] = {
		.reg_offset = 2,
		.mask = S2MPS14_IRQ_TSD_MASK,
	},
};
S
Sangbeom Kim 已提交
163

164
static const struct regmap_irq s5m8767_irqs[] = {
S
Sangbeom Kim 已提交
165
	[S5M8767_IRQ_PWRR] = {
166
		.reg_offset = 0,
S
Sangbeom Kim 已提交
167 168 169
		.mask = S5M8767_IRQ_PWRR_MASK,
	},
	[S5M8767_IRQ_PWRF] = {
170
		.reg_offset = 0,
S
Sangbeom Kim 已提交
171 172 173
		.mask = S5M8767_IRQ_PWRF_MASK,
	},
	[S5M8767_IRQ_PWR1S] = {
174
		.reg_offset = 0,
S
Sangbeom Kim 已提交
175 176 177
		.mask = S5M8767_IRQ_PWR1S_MASK,
	},
	[S5M8767_IRQ_JIGR] = {
178
		.reg_offset = 0,
S
Sangbeom Kim 已提交
179 180 181
		.mask = S5M8767_IRQ_JIGR_MASK,
	},
	[S5M8767_IRQ_JIGF] = {
182
		.reg_offset = 0,
S
Sangbeom Kim 已提交
183 184 185
		.mask = S5M8767_IRQ_JIGF_MASK,
	},
	[S5M8767_IRQ_LOWBAT2] = {
186
		.reg_offset = 0,
S
Sangbeom Kim 已提交
187 188 189
		.mask = S5M8767_IRQ_LOWBAT2_MASK,
	},
	[S5M8767_IRQ_LOWBAT1] = {
190
		.reg_offset = 0,
S
Sangbeom Kim 已提交
191 192 193
		.mask = S5M8767_IRQ_LOWBAT1_MASK,
	},
	[S5M8767_IRQ_MRB] = {
194
		.reg_offset = 1,
S
Sangbeom Kim 已提交
195 196 197
		.mask = S5M8767_IRQ_MRB_MASK,
	},
	[S5M8767_IRQ_DVSOK2] = {
198
		.reg_offset = 1,
S
Sangbeom Kim 已提交
199 200 201
		.mask = S5M8767_IRQ_DVSOK2_MASK,
	},
	[S5M8767_IRQ_DVSOK3] = {
202
		.reg_offset = 1,
S
Sangbeom Kim 已提交
203 204 205
		.mask = S5M8767_IRQ_DVSOK3_MASK,
	},
	[S5M8767_IRQ_DVSOK4] = {
206
		.reg_offset = 1,
S
Sangbeom Kim 已提交
207 208 209
		.mask = S5M8767_IRQ_DVSOK4_MASK,
	},
	[S5M8767_IRQ_RTC60S] = {
210
		.reg_offset = 2,
S
Sangbeom Kim 已提交
211 212 213
		.mask = S5M8767_IRQ_RTC60S_MASK,
	},
	[S5M8767_IRQ_RTCA1] = {
214
		.reg_offset = 2,
S
Sangbeom Kim 已提交
215 216 217
		.mask = S5M8767_IRQ_RTCA1_MASK,
	},
	[S5M8767_IRQ_RTCA2] = {
218
		.reg_offset = 2,
S
Sangbeom Kim 已提交
219 220 221
		.mask = S5M8767_IRQ_RTCA2_MASK,
	},
	[S5M8767_IRQ_SMPL] = {
222
		.reg_offset = 2,
S
Sangbeom Kim 已提交
223 224 225
		.mask = S5M8767_IRQ_SMPL_MASK,
	},
	[S5M8767_IRQ_RTC1S] = {
226
		.reg_offset = 2,
S
Sangbeom Kim 已提交
227 228 229
		.mask = S5M8767_IRQ_RTC1S_MASK,
	},
	[S5M8767_IRQ_WTSR] = {
230
		.reg_offset = 2,
S
Sangbeom Kim 已提交
231 232 233 234
		.mask = S5M8767_IRQ_WTSR_MASK,
	},
};

235
static const struct regmap_irq s5m8763_irqs[] = {
S
Sangbeom Kim 已提交
236
	[S5M8763_IRQ_DCINF] = {
237
		.reg_offset = 0,
S
Sangbeom Kim 已提交
238 239 240
		.mask = S5M8763_IRQ_DCINF_MASK,
	},
	[S5M8763_IRQ_DCINR] = {
241
		.reg_offset = 0,
S
Sangbeom Kim 已提交
242 243 244
		.mask = S5M8763_IRQ_DCINR_MASK,
	},
	[S5M8763_IRQ_JIGF] = {
245
		.reg_offset = 0,
S
Sangbeom Kim 已提交
246 247 248
		.mask = S5M8763_IRQ_JIGF_MASK,
	},
	[S5M8763_IRQ_JIGR] = {
249
		.reg_offset = 0,
S
Sangbeom Kim 已提交
250 251 252
		.mask = S5M8763_IRQ_JIGR_MASK,
	},
	[S5M8763_IRQ_PWRONF] = {
253
		.reg_offset = 0,
S
Sangbeom Kim 已提交
254 255 256
		.mask = S5M8763_IRQ_PWRONF_MASK,
	},
	[S5M8763_IRQ_PWRONR] = {
257
		.reg_offset = 0,
S
Sangbeom Kim 已提交
258 259 260
		.mask = S5M8763_IRQ_PWRONR_MASK,
	},
	[S5M8763_IRQ_WTSREVNT] = {
261
		.reg_offset = 1,
S
Sangbeom Kim 已提交
262 263 264
		.mask = S5M8763_IRQ_WTSREVNT_MASK,
	},
	[S5M8763_IRQ_SMPLEVNT] = {
265
		.reg_offset = 1,
S
Sangbeom Kim 已提交
266 267 268
		.mask = S5M8763_IRQ_SMPLEVNT_MASK,
	},
	[S5M8763_IRQ_ALARM1] = {
269
		.reg_offset = 1,
S
Sangbeom Kim 已提交
270 271 272
		.mask = S5M8763_IRQ_ALARM1_MASK,
	},
	[S5M8763_IRQ_ALARM0] = {
273
		.reg_offset = 1,
S
Sangbeom Kim 已提交
274 275 276
		.mask = S5M8763_IRQ_ALARM0_MASK,
	},
	[S5M8763_IRQ_ONKEY1S] = {
277
		.reg_offset = 2,
S
Sangbeom Kim 已提交
278 279 280
		.mask = S5M8763_IRQ_ONKEY1S_MASK,
	},
	[S5M8763_IRQ_TOPOFFR] = {
281
		.reg_offset = 2,
S
Sangbeom Kim 已提交
282 283 284
		.mask = S5M8763_IRQ_TOPOFFR_MASK,
	},
	[S5M8763_IRQ_DCINOVPR] = {
285
		.reg_offset = 2,
S
Sangbeom Kim 已提交
286 287 288
		.mask = S5M8763_IRQ_DCINOVPR_MASK,
	},
	[S5M8763_IRQ_CHGRSTF] = {
289
		.reg_offset = 2,
S
Sangbeom Kim 已提交
290 291 292
		.mask = S5M8763_IRQ_CHGRSTF_MASK,
	},
	[S5M8763_IRQ_DONER] = {
293
		.reg_offset = 2,
S
Sangbeom Kim 已提交
294 295 296
		.mask = S5M8763_IRQ_DONER_MASK,
	},
	[S5M8763_IRQ_CHGFAULT] = {
297
		.reg_offset = 2,
S
Sangbeom Kim 已提交
298 299 300
		.mask = S5M8763_IRQ_CHGFAULT_MASK,
	},
	[S5M8763_IRQ_LOBAT1] = {
301
		.reg_offset = 3,
S
Sangbeom Kim 已提交
302 303 304
		.mask = S5M8763_IRQ_LOBAT1_MASK,
	},
	[S5M8763_IRQ_LOBAT2] = {
305
		.reg_offset = 3,
S
Sangbeom Kim 已提交
306 307 308 309
		.mask = S5M8763_IRQ_LOBAT2_MASK,
	},
};

310
static const struct regmap_irq_chip s2mps11_irq_chip = {
S
Sangbeom Kim 已提交
311 312 313 314 315 316 317 318
	.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 已提交
319

320 321 322 323 324 325 326 327 328 329
static const struct regmap_irq_chip s2mps14_irq_chip = {
	.name = "s2mps14",
	.irqs = s2mps14_irqs,
	.num_irqs = ARRAY_SIZE(s2mps14_irqs),
	.num_regs = 3,
	.status_base = S2MPS14_REG_INT1,
	.mask_base = S2MPS14_REG_INT1M,
	.ack_base = S2MPS14_REG_INT1,
};

330
static const struct regmap_irq_chip s5m8767_irq_chip = {
S
Sangbeom Kim 已提交
331
	.name = "s5m8767",
S
Sangbeom Kim 已提交
332 333 334 335 336 337
	.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 已提交
338 339
};

340
static const struct regmap_irq_chip s5m8763_irq_chip = {
S
Sangbeom Kim 已提交
341
	.name = "s5m8763",
S
Sangbeom Kim 已提交
342 343 344 345 346 347
	.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 已提交
348 349
};

350
int sec_irq_init(struct sec_pmic_dev *sec_pmic)
S
Sangbeom Kim 已提交
351 352
{
	int ret = 0;
353
	int type = sec_pmic->device_type;
S
Sangbeom Kim 已提交
354

355 356
	if (!sec_pmic->irq) {
		dev_warn(sec_pmic->dev,
S
Sangbeom Kim 已提交
357
			 "No interrupt specified, no interrupts\n");
358
		sec_pmic->irq_base = 0;
S
Sangbeom Kim 已提交
359 360 361 362 363
		return 0;
	}

	switch (type) {
	case S5M8763X:
364
		ret = regmap_add_irq_chip(sec_pmic->regmap_pmic, sec_pmic->irq,
S
Sangbeom Kim 已提交
365 366 367
				  IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
				  sec_pmic->irq_base, &s5m8763_irq_chip,
				  &sec_pmic->irq_data);
S
Sangbeom Kim 已提交
368 369
		break;
	case S5M8767X:
370
		ret = regmap_add_irq_chip(sec_pmic->regmap_pmic, sec_pmic->irq,
S
Sangbeom Kim 已提交
371 372 373
				  IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
				  sec_pmic->irq_base, &s5m8767_irq_chip,
				  &sec_pmic->irq_data);
S
Sangbeom Kim 已提交
374
		break;
S
Sangbeom Kim 已提交
375
	case S2MPS11X:
376
		ret = regmap_add_irq_chip(sec_pmic->regmap_pmic, sec_pmic->irq,
S
Sangbeom Kim 已提交
377 378 379
				  IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
				  sec_pmic->irq_base, &s2mps11_irq_chip,
				  &sec_pmic->irq_data);
S
Sangbeom Kim 已提交
380
		break;
381 382 383 384 385 386
	case S2MPS14X:
		ret = regmap_add_irq_chip(sec_pmic->regmap_pmic, sec_pmic->irq,
				  IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
				  sec_pmic->irq_base, &s2mps14_irq_chip,
				  &sec_pmic->irq_data);
		break;
S
Sangbeom Kim 已提交
387
	default:
388
		dev_err(sec_pmic->dev, "Unknown device type %lu\n",
S
Sangbeom Kim 已提交
389 390
			sec_pmic->device_type);
		return -EINVAL;
S
Sangbeom Kim 已提交
391 392
	}

S
Sangbeom Kim 已提交
393 394
	if (ret != 0) {
		dev_err(sec_pmic->dev, "Failed to register IRQ chip: %d\n", ret);
395 396
		return ret;
	}
S
Sangbeom Kim 已提交
397 398 399 400

	return 0;
}

401
void sec_irq_exit(struct sec_pmic_dev *sec_pmic)
S
Sangbeom Kim 已提交
402
{
S
Sangbeom Kim 已提交
403
	regmap_del_irq_chip(sec_pmic->irq, sec_pmic->irq_data);
S
Sangbeom Kim 已提交
404
}