spmi-pmic-arb.c 30.2 KB
Newer Older
1 2
/*
 * Copyright (c) 2012-2015, The Linux Foundation. All rights reserved.
3 4 5 6 7 8 9 10 11 12
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 and
 * only version 2 as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 */
13
#include <linux/bitmap.h>
14 15 16 17
#include <linux/delay.h>
#include <linux/err.h>
#include <linux/interrupt.h>
#include <linux/io.h>
18 19 20
#include <linux/irqchip/chained_irq.h>
#include <linux/irqdomain.h>
#include <linux/irq.h>
21 22 23 24 25 26 27 28 29
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/platform_device.h>
#include <linux/slab.h>
#include <linux/spmi.h>

/* PMIC Arbiter configuration registers */
#define PMIC_ARB_VERSION		0x0000
30
#define PMIC_ARB_VERSION_V2_MIN		0x20010000
31
#define PMIC_ARB_VERSION_V3_MIN		0x30000000
32 33
#define PMIC_ARB_INT_EN			0x0004

34 35 36 37 38 39 40 41 42
/* PMIC Arbiter channel registers offsets */
#define PMIC_ARB_CMD			0x00
#define PMIC_ARB_CONFIG			0x04
#define PMIC_ARB_STATUS			0x08
#define PMIC_ARB_WDATA0			0x10
#define PMIC_ARB_WDATA1			0x14
#define PMIC_ARB_RDATA0			0x18
#define PMIC_ARB_RDATA1			0x1C
#define PMIC_ARB_REG_CHNL(N)		(0x800 + 0x4 * (N))
43 44 45 46 47 48 49 50 51 52

/* Mapping Table */
#define SPMI_MAPPING_TABLE_REG(N)	(0x0B00 + (4 * (N)))
#define SPMI_MAPPING_BIT_INDEX(X)	(((X) >> 18) & 0xF)
#define SPMI_MAPPING_BIT_IS_0_FLAG(X)	(((X) >> 17) & 0x1)
#define SPMI_MAPPING_BIT_IS_0_RESULT(X)	(((X) >> 9) & 0xFF)
#define SPMI_MAPPING_BIT_IS_1_FLAG(X)	(((X) >> 8) & 0x1)
#define SPMI_MAPPING_BIT_IS_1_RESULT(X)	(((X) >> 0) & 0xFF)

#define SPMI_MAPPING_TABLE_TREE_DEPTH	16	/* Maximum of 16-bits */
53 54
#define PMIC_ARB_MAX_PPID		BIT(12) /* PPID is 12bit */
#define PMIC_ARB_CHAN_VALID		BIT(15)
55 56 57 58 59 60 61

/* Ownership Table */
#define SPMI_OWNERSHIP_TABLE_REG(N)	(0x0700 + (4 * (N)))
#define SPMI_OWNERSHIP_PERIPH2OWNER(X)	((X) & 0x7)

/* Channel Status fields */
enum pmic_arb_chnl_status {
62 63 64 65
	PMIC_ARB_STATUS_DONE	= BIT(0),
	PMIC_ARB_STATUS_FAILURE	= BIT(1),
	PMIC_ARB_STATUS_DENIED	= BIT(2),
	PMIC_ARB_STATUS_DROPPED	= BIT(3),
66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
};

/* Command register fields */
#define PMIC_ARB_CMD_MAX_BYTE_COUNT	8

/* Command Opcodes */
enum pmic_arb_cmd_op_code {
	PMIC_ARB_OP_EXT_WRITEL = 0,
	PMIC_ARB_OP_EXT_READL = 1,
	PMIC_ARB_OP_EXT_WRITE = 2,
	PMIC_ARB_OP_RESET = 3,
	PMIC_ARB_OP_SLEEP = 4,
	PMIC_ARB_OP_SHUTDOWN = 5,
	PMIC_ARB_OP_WAKEUP = 6,
	PMIC_ARB_OP_AUTHENTICATE = 7,
	PMIC_ARB_OP_MSTR_READ = 8,
	PMIC_ARB_OP_MSTR_WRITE = 9,
	PMIC_ARB_OP_EXT_READ = 13,
	PMIC_ARB_OP_WRITE = 14,
	PMIC_ARB_OP_READ = 15,
	PMIC_ARB_OP_ZERO_WRITE = 16,
};

/* Maximum number of support PMIC peripherals */
90
#define PMIC_ARB_MAX_PERIPHS		512
91 92 93 94 95 96 97 98 99
#define PMIC_ARB_TIMEOUT_US		100
#define PMIC_ARB_MAX_TRANS_BYTES	(8)

#define PMIC_ARB_APID_MASK		0xFF
#define PMIC_ARB_PPID_MASK		0xFFF

/* interrupt enable bit */
#define SPMI_PIC_ACC_ENABLE_BIT		BIT(0)

100 101 102 103 104 105 106 107 108 109 110
#define HWIRQ(slave_id, periph_id, irq_id, apid) \
	((((slave_id) & 0xF)   << 28) | \
	(((periph_id) & 0xFF)  << 20) | \
	(((irq_id)    & 0x7)   << 16) | \
	(((apid)      & 0x1FF) << 0))

#define HWIRQ_SID(hwirq)  (((hwirq) >> 28) & 0xF)
#define HWIRQ_PER(hwirq)  (((hwirq) >> 20) & 0xFF)
#define HWIRQ_IRQ(hwirq)  (((hwirq) >> 16) & 0x7)
#define HWIRQ_APID(hwirq) (((hwirq) >> 0)  & 0x1FF)

111 112
struct pmic_arb_ver_ops;

113 114 115 116 117
struct apid_data {
	u16		ppid;
	u8		owner;
};

118
/**
119
 * spmi_pmic_arb - SPMI PMIC Arbiter object
120
 *
121 122
 * @rd_base:		on v1 "core", on v2 "observer" register base off DT.
 * @wr_base:		on v1 "core", on v2 "chnls"    register base off DT.
123 124 125
 * @intr:		address of the SPMI interrupt control registers.
 * @cnfg:		address of the PMIC Arbiter configuration registers.
 * @lock:		lock to synchronize accesses.
126
 * @channel:		execution environment channel to use for accesses.
127 128 129 130
 * @irq:		PMIC ARB interrupt.
 * @ee:			the current Execution Environment
 * @min_apid:		minimum APID (used for bounding IRQ search)
 * @max_apid:		maximum APID
131
 * @max_periph:		maximum number of PMIC peripherals supported by HW.
132 133 134
 * @mapping_table:	in-memory copy of PPID -> APID mapping table.
 * @domain:		irq domain object for PMIC IRQ domain
 * @spmic:		SPMI controller object
135
 * @ver_ops:		version dependent operations.
136
 * @ppid_to_apid	in-memory copy of PPID -> channel (APID) mapping table.
137
 *			v2 only.
138
 */
139
struct spmi_pmic_arb {
140 141
	void __iomem		*rd_base;
	void __iomem		*wr_base;
142 143
	void __iomem		*intr;
	void __iomem		*cnfg;
144 145
	void __iomem		*core;
	resource_size_t		core_size;
146 147
	raw_spinlock_t		lock;
	u8			channel;
148 149
	int			irq;
	u8			ee;
150 151
	u16			min_apid;
	u16			max_apid;
152
	u16			max_periph;
153 154
	u32			*mapping_table;
	DECLARE_BITMAP(mapping_table_valid, PMIC_ARB_MAX_PERIPHS);
155 156
	struct irq_domain	*domain;
	struct spmi_controller	*spmic;
157
	const struct pmic_arb_ver_ops *ver_ops;
158 159
	u16			*ppid_to_apid;
	u16			last_apid;
160
	struct apid_data	apid_data[PMIC_ARB_MAX_PERIPHS];
161 162 163 164 165
};

/**
 * pmic_arb_ver: version dependent functionality.
 *
166 167 168
 * @ver_str:		version string.
 * @ppid_to_apid:	finds the apid for a given ppid.
 * @mode:		access rights to specified pmic peripheral.
169 170 171 172 173 174 175 176 177 178 179 180 181 182 183
 * @non_data_cmd:	on v1 issues an spmi non-data command.
 *			on v2 no HW support, returns -EOPNOTSUPP.
 * @offset:		on v1 offset of per-ee channel.
 *			on v2 offset of per-ee and per-ppid channel.
 * @fmt_cmd:		formats a GENI/SPMI command.
 * @owner_acc_status:	on v1 offset of PMIC_ARB_SPMI_PIC_OWNERm_ACC_STATUSn
 *			on v2 offset of SPMI_PIC_OWNERm_ACC_STATUSn.
 * @acc_enable:		on v1 offset of PMIC_ARB_SPMI_PIC_ACC_ENABLEn
 *			on v2 offset of SPMI_PIC_ACC_ENABLEn.
 * @irq_status:		on v1 offset of PMIC_ARB_SPMI_PIC_IRQ_STATUSn
 *			on v2 offset of SPMI_PIC_IRQ_STATUSn.
 * @irq_clear:		on v1 offset of PMIC_ARB_SPMI_PIC_IRQ_CLEARn
 *			on v2 offset of SPMI_PIC_IRQ_CLEARn.
 */
struct pmic_arb_ver_ops {
184
	const char *ver_str;
185
	int (*ppid_to_apid)(struct spmi_pmic_arb *pa, u8 sid, u16 addr,
186
			u16 *apid);
187
	int (*mode)(struct spmi_pmic_arb *dev, u8 sid, u16 addr,
188
			mode_t *mode);
189
	/* spmi commands (read_cmd, write_cmd, cmd) functionality */
190
	int (*offset)(struct spmi_pmic_arb *dev, u8 sid, u16 addr,
191
		      u32 *offset);
192 193 194
	u32 (*fmt_cmd)(u8 opc, u8 sid, u16 addr, u8 bc);
	int (*non_data_cmd)(struct spmi_controller *ctrl, u8 opc, u8 sid);
	/* Interrupts controller functionality (offset of PIC registers) */
195 196 197 198
	u32 (*owner_acc_status)(u8 m, u16 n);
	u32 (*acc_enable)(u16 n);
	u32 (*irq_status)(u16 n);
	u32 (*irq_clear)(u16 n);
199 200
};

201
static inline void pmic_arb_base_write(struct spmi_pmic_arb *pa,
202 203
				       u32 offset, u32 val)
{
204
	writel_relaxed(val, pa->wr_base + offset);
205 206
}

207
static inline void pmic_arb_set_rd_cmd(struct spmi_pmic_arb *pa,
208 209
				       u32 offset, u32 val)
{
210
	writel_relaxed(val, pa->rd_base + offset);
211 212 213 214 215 216 217 218
}

/**
 * pa_read_data: reads pmic-arb's register and copy 1..4 bytes to buf
 * @bc:		byte count -1. range: 0..3
 * @reg:	register's address
 * @buf:	output parameter, length must be bc + 1
 */
219
static void pa_read_data(struct spmi_pmic_arb *pa, u8 *buf, u32 reg, u8 bc)
220
{
221 222
	u32 data = __raw_readl(pa->rd_base + reg);

223 224 225 226 227 228 229 230 231 232
	memcpy(buf, &data, (bc & 3) + 1);
}

/**
 * pa_write_data: write 1..4 bytes from buf to pmic-arb's register
 * @bc:		byte-count -1. range: 0..3.
 * @reg:	register's address.
 * @buf:	buffer to write. length must be bc + 1.
 */
static void
233
pa_write_data(struct spmi_pmic_arb *pa, const u8 *buf, u32 reg, u8 bc)
234 235
{
	u32 data = 0;
236

237
	memcpy(&data, buf, (bc & 3) + 1);
238
	pmic_arb_base_write(pa, reg, data);
239 240
}

241 242
static int pmic_arb_wait_for_done(struct spmi_controller *ctrl,
				  void __iomem *base, u8 sid, u16 addr)
243
{
244
	struct spmi_pmic_arb *pa = spmi_controller_get_drvdata(ctrl);
245 246
	u32 status = 0;
	u32 timeout = PMIC_ARB_TIMEOUT_US;
247 248 249
	u32 offset;
	int rc;

250
	rc = pa->ver_ops->offset(pa, sid, addr, &offset);
251 252 253 254
	if (rc)
		return rc;

	offset += PMIC_ARB_STATUS;
255 256

	while (timeout--) {
257
		status = readl_relaxed(base + offset);
258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291

		if (status & PMIC_ARB_STATUS_DONE) {
			if (status & PMIC_ARB_STATUS_DENIED) {
				dev_err(&ctrl->dev,
					"%s: transaction denied (0x%x)\n",
					__func__, status);
				return -EPERM;
			}

			if (status & PMIC_ARB_STATUS_FAILURE) {
				dev_err(&ctrl->dev,
					"%s: transaction failed (0x%x)\n",
					__func__, status);
				return -EIO;
			}

			if (status & PMIC_ARB_STATUS_DROPPED) {
				dev_err(&ctrl->dev,
					"%s: transaction dropped (0x%x)\n",
					__func__, status);
				return -EIO;
			}

			return 0;
		}
		udelay(1);
	}

	dev_err(&ctrl->dev,
		"%s: timeout, status 0x%x\n",
		__func__, status);
	return -ETIMEDOUT;
}

292 293
static int
pmic_arb_non_data_cmd_v1(struct spmi_controller *ctrl, u8 opc, u8 sid)
294
{
295
	struct spmi_pmic_arb *pa = spmi_controller_get_drvdata(ctrl);
296 297 298
	unsigned long flags;
	u32 cmd;
	int rc;
299 300
	u32 offset;

301
	rc = pa->ver_ops->offset(pa, sid, 0, &offset);
302 303
	if (rc)
		return rc;
304 305 306

	cmd = ((opc | 0x40) << 27) | ((sid & 0xf) << 20);

307 308 309 310
	raw_spin_lock_irqsave(&pa->lock, flags);
	pmic_arb_base_write(pa, offset + PMIC_ARB_CMD, cmd);
	rc = pmic_arb_wait_for_done(ctrl, pa->wr_base, sid, 0);
	raw_spin_unlock_irqrestore(&pa->lock, flags);
311 312 313 314

	return rc;
}

315 316 317 318 319 320 321 322 323
static int
pmic_arb_non_data_cmd_v2(struct spmi_controller *ctrl, u8 opc, u8 sid)
{
	return -EOPNOTSUPP;
}

/* Non-data command */
static int pmic_arb_cmd(struct spmi_controller *ctrl, u8 opc, u8 sid)
{
324
	struct spmi_pmic_arb *pa = spmi_controller_get_drvdata(ctrl);
325 326 327 328 329 330 331

	dev_dbg(&ctrl->dev, "cmd op:0x%x sid:%d\n", opc, sid);

	/* Check for valid non-data command */
	if (opc < SPMI_CMD_RESET || opc > SPMI_CMD_WAKEUP)
		return -EINVAL;

332
	return pa->ver_ops->non_data_cmd(ctrl, opc, sid);
333 334
}

335 336 337
static int pmic_arb_read_cmd(struct spmi_controller *ctrl, u8 opc, u8 sid,
			     u16 addr, u8 *buf, size_t len)
{
338
	struct spmi_pmic_arb *pa = spmi_controller_get_drvdata(ctrl);
339 340 341 342
	unsigned long flags;
	u8 bc = len - 1;
	u32 cmd;
	int rc;
343
	u32 offset;
344
	mode_t mode;
345

346
	rc = pa->ver_ops->offset(pa, sid, addr, &offset);
347 348
	if (rc)
		return rc;
349

350
	rc = pa->ver_ops->mode(pa, sid, addr, &mode);
351 352 353 354
	if (rc)
		return rc;

	if (!(mode & S_IRUSR)) {
355
		dev_err(&pa->spmic->dev,
356 357 358 359 360
			"error: impermissible read from peripheral sid:%d addr:0x%x\n",
			sid, addr);
		return -EPERM;
	}

361 362
	if (bc >= PMIC_ARB_MAX_TRANS_BYTES) {
		dev_err(&ctrl->dev,
363
			"pmic-arb supports 1..%d bytes per trans, but:%zu requested",
364 365 366 367 368 369 370 371 372 373 374 375 376 377
			PMIC_ARB_MAX_TRANS_BYTES, len);
		return  -EINVAL;
	}

	/* Check the opcode */
	if (opc >= 0x60 && opc <= 0x7F)
		opc = PMIC_ARB_OP_READ;
	else if (opc >= 0x20 && opc <= 0x2F)
		opc = PMIC_ARB_OP_EXT_READ;
	else if (opc >= 0x38 && opc <= 0x3F)
		opc = PMIC_ARB_OP_EXT_READL;
	else
		return -EINVAL;

378
	cmd = pa->ver_ops->fmt_cmd(opc, sid, addr, bc);
379

380 381 382
	raw_spin_lock_irqsave(&pa->lock, flags);
	pmic_arb_set_rd_cmd(pa, offset + PMIC_ARB_CMD, cmd);
	rc = pmic_arb_wait_for_done(ctrl, pa->rd_base, sid, addr);
383 384 385
	if (rc)
		goto done;

386
	pa_read_data(pa, buf, offset + PMIC_ARB_RDATA0,
387 388 389
		     min_t(u8, bc, 3));

	if (bc > 3)
390
		pa_read_data(pa, buf + 4, offset + PMIC_ARB_RDATA1, bc - 4);
391 392

done:
393
	raw_spin_unlock_irqrestore(&pa->lock, flags);
394 395 396 397 398 399
	return rc;
}

static int pmic_arb_write_cmd(struct spmi_controller *ctrl, u8 opc, u8 sid,
			      u16 addr, const u8 *buf, size_t len)
{
400
	struct spmi_pmic_arb *pa = spmi_controller_get_drvdata(ctrl);
401 402 403 404
	unsigned long flags;
	u8 bc = len - 1;
	u32 cmd;
	int rc;
405
	u32 offset;
406
	mode_t mode;
407

408
	rc = pa->ver_ops->offset(pa, sid, addr, &offset);
409 410
	if (rc)
		return rc;
411

412
	rc = pa->ver_ops->mode(pa, sid, addr, &mode);
413 414 415 416
	if (rc)
		return rc;

	if (!(mode & S_IWUSR)) {
417
		dev_err(&pa->spmic->dev,
418 419 420 421 422
			"error: impermissible write to peripheral sid:%d addr:0x%x\n",
			sid, addr);
		return -EPERM;
	}

423 424
	if (bc >= PMIC_ARB_MAX_TRANS_BYTES) {
		dev_err(&ctrl->dev,
425
			"pmic-arb supports 1..%d bytes per trans, but:%zu requested",
426 427 428 429 430 431 432 433 434 435 436
			PMIC_ARB_MAX_TRANS_BYTES, len);
		return  -EINVAL;
	}

	/* Check the opcode */
	if (opc >= 0x40 && opc <= 0x5F)
		opc = PMIC_ARB_OP_WRITE;
	else if (opc >= 0x00 && opc <= 0x0F)
		opc = PMIC_ARB_OP_EXT_WRITE;
	else if (opc >= 0x30 && opc <= 0x37)
		opc = PMIC_ARB_OP_EXT_WRITEL;
437
	else if (opc >= 0x80)
438 439 440 441
		opc = PMIC_ARB_OP_ZERO_WRITE;
	else
		return -EINVAL;

442
	cmd = pa->ver_ops->fmt_cmd(opc, sid, addr, bc);
443 444

	/* Write data to FIFOs */
445 446
	raw_spin_lock_irqsave(&pa->lock, flags);
	pa_write_data(pa, buf, offset + PMIC_ARB_WDATA0, min_t(u8, bc, 3));
447
	if (bc > 3)
448
		pa_write_data(pa, buf + 4, offset + PMIC_ARB_WDATA1, bc - 4);
449 450

	/* Start the transaction */
451 452 453
	pmic_arb_base_write(pa, offset + PMIC_ARB_CMD, cmd);
	rc = pmic_arb_wait_for_done(ctrl, pa->wr_base, sid, addr);
	raw_spin_unlock_irqrestore(&pa->lock, flags);
454 455 456 457

	return rc;
}

458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478
enum qpnpint_regs {
	QPNPINT_REG_RT_STS		= 0x10,
	QPNPINT_REG_SET_TYPE		= 0x11,
	QPNPINT_REG_POLARITY_HIGH	= 0x12,
	QPNPINT_REG_POLARITY_LOW	= 0x13,
	QPNPINT_REG_LATCHED_CLR		= 0x14,
	QPNPINT_REG_EN_SET		= 0x15,
	QPNPINT_REG_EN_CLR		= 0x16,
	QPNPINT_REG_LATCHED_STS		= 0x18,
};

struct spmi_pmic_arb_qpnpint_type {
	u8 type; /* 1 -> edge */
	u8 polarity_high;
	u8 polarity_low;
} __packed;

/* Simplified accessor functions for irqchip callbacks */
static void qpnpint_spmi_write(struct irq_data *d, u8 reg, void *buf,
			       size_t len)
{
479
	struct spmi_pmic_arb *pa = irq_data_get_irq_chip_data(d);
480 481
	u8 sid = HWIRQ_SID(d->hwirq);
	u8 per = HWIRQ_PER(d->hwirq);
482 483 484 485 486 487 488 489 490 491

	if (pmic_arb_write_cmd(pa->spmic, SPMI_CMD_EXT_WRITEL, sid,
			       (per << 8) + reg, buf, len))
		dev_err_ratelimited(&pa->spmic->dev,
				"failed irqchip transaction on %x\n",
				    d->irq);
}

static void qpnpint_spmi_read(struct irq_data *d, u8 reg, void *buf, size_t len)
{
492
	struct spmi_pmic_arb *pa = irq_data_get_irq_chip_data(d);
493 494
	u8 sid = HWIRQ_SID(d->hwirq);
	u8 per = HWIRQ_PER(d->hwirq);
495 496 497 498 499 500 501 502

	if (pmic_arb_read_cmd(pa->spmic, SPMI_CMD_EXT_READL, sid,
			      (per << 8) + reg, buf, len))
		dev_err_ratelimited(&pa->spmic->dev,
				"failed irqchip transaction on %x\n",
				    d->irq);
}

503
static void cleanup_irq(struct spmi_pmic_arb *pa, u16 apid, int id)
504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524
{
	u16 ppid = pa->apid_data[apid].ppid;
	u8 sid = ppid >> 8;
	u8 per = ppid & 0xFF;
	u8 irq_mask = BIT(id);

	writel_relaxed(irq_mask, pa->intr + pa->ver_ops->irq_clear(apid));

	if (pmic_arb_write_cmd(pa->spmic, SPMI_CMD_EXT_WRITEL, sid,
			(per << 8) + QPNPINT_REG_LATCHED_CLR, &irq_mask, 1))
		dev_err_ratelimited(&pa->spmic->dev,
				"failed to ack irq_mask = 0x%x for ppid = %x\n",
				irq_mask, ppid);

	if (pmic_arb_write_cmd(pa->spmic, SPMI_CMD_EXT_WRITEL, sid,
			       (per << 8) + QPNPINT_REG_EN_CLR, &irq_mask, 1))
		dev_err_ratelimited(&pa->spmic->dev,
				"failed to ack irq_mask = 0x%x for ppid = %x\n",
				irq_mask, ppid);
}

525
static void periph_interrupt(struct spmi_pmic_arb *pa, u16 apid)
526 527 528 529
{
	unsigned int irq;
	u32 status;
	int id;
530 531
	u8 sid = (pa->apid_data[apid].ppid >> 8) & 0xF;
	u8 per = pa->apid_data[apid].ppid & 0xFF;
532

533
	status = readl_relaxed(pa->intr + pa->ver_ops->irq_status(apid));
534 535
	while (status) {
		id = ffs(status) - 1;
536
		status &= ~BIT(id);
537
		irq = irq_find_mapping(pa->domain, HWIRQ(sid, per, id, apid));
538 539 540 541
		if (irq == 0) {
			cleanup_irq(pa, apid, id);
			continue;
		}
542 543 544 545
		generic_handle_irq(irq);
	}
}

546
static void pmic_arb_chained_irq(struct irq_desc *desc)
547
{
548
	struct spmi_pmic_arb *pa = irq_desc_get_handler_data(desc);
549
	struct irq_chip *chip = irq_desc_get_chip(desc);
550 551 552
	void __iomem *intr = pa->intr;
	int first = pa->min_apid >> 5;
	int last = pa->max_apid >> 5;
553 554
	u32 status, enable;
	int i, id, apid;
555 556 557 558 559

	chained_irq_enter(chip, desc);

	for (i = first; i <= last; ++i) {
		status = readl_relaxed(intr +
560
				      pa->ver_ops->owner_acc_status(pa->ee, i));
561 562
		while (status) {
			id = ffs(status) - 1;
563
			status &= ~BIT(id);
564 565 566 567 568
			apid = id + i * 32;
			enable = readl_relaxed(intr +
					pa->ver_ops->acc_enable(apid));
			if (enable & SPMI_PIC_ACC_ENABLE_BIT)
				periph_interrupt(pa, apid);
569 570 571 572 573 574 575 576
		}
	}

	chained_irq_exit(chip, desc);
}

static void qpnpint_irq_ack(struct irq_data *d)
{
577
	struct spmi_pmic_arb *pa = irq_data_get_irq_chip_data(d);
578 579
	u8 irq = HWIRQ_IRQ(d->hwirq);
	u16 apid = HWIRQ_APID(d->hwirq);
580 581
	u8 data;

582
	writel_relaxed(BIT(irq), pa->intr + pa->ver_ops->irq_clear(apid));
583

584
	data = BIT(irq);
585 586 587 588 589
	qpnpint_spmi_write(d, QPNPINT_REG_LATCHED_CLR, &data, 1);
}

static void qpnpint_irq_mask(struct irq_data *d)
{
590
	u8 irq = HWIRQ_IRQ(d->hwirq);
591
	u8 data = BIT(irq);
592 593 594 595 596 597

	qpnpint_spmi_write(d, QPNPINT_REG_EN_CLR, &data, 1);
}

static void qpnpint_irq_unmask(struct irq_data *d)
{
598
	struct spmi_pmic_arb *pa = irq_data_get_irq_chip_data(d);
599 600
	u8 irq = HWIRQ_IRQ(d->hwirq);
	u16 apid = HWIRQ_APID(d->hwirq);
601
	u8 buf[2];
602

603 604
	writel_relaxed(SPMI_PIC_ACC_ENABLE_BIT,
		pa->intr + pa->ver_ops->acc_enable(apid));
605

606 607 608 609 610 611 612 613 614 615 616
	qpnpint_spmi_read(d, QPNPINT_REG_EN_SET, &buf[0], 1);
	if (!(buf[0] & BIT(irq))) {
		/*
		 * Since the interrupt is currently disabled, write to both the
		 * LATCHED_CLR and EN_SET registers so that a spurious interrupt
		 * cannot be triggered when the interrupt is enabled
		 */
		buf[0] = BIT(irq);
		buf[1] = BIT(irq);
		qpnpint_spmi_write(d, QPNPINT_REG_LATCHED_CLR, &buf, 2);
	}
617 618 619 620 621
}

static int qpnpint_irq_set_type(struct irq_data *d, unsigned int flow_type)
{
	struct spmi_pmic_arb_qpnpint_type type;
622
	u8 irq = HWIRQ_IRQ(d->hwirq);
623
	u8 bit_mask_irq = BIT(irq);
624 625 626 627

	qpnpint_spmi_read(d, QPNPINT_REG_SET_TYPE, &type, sizeof(type));

	if (flow_type & (IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING)) {
628
		type.type |= bit_mask_irq;
629
		if (flow_type & IRQF_TRIGGER_RISING)
630
			type.polarity_high |= bit_mask_irq;
631
		if (flow_type & IRQF_TRIGGER_FALLING)
632
			type.polarity_low  |= bit_mask_irq;
633 634 635 636 637
	} else {
		if ((flow_type & (IRQF_TRIGGER_HIGH)) &&
		    (flow_type & (IRQF_TRIGGER_LOW)))
			return -EINVAL;

638
		type.type &= ~bit_mask_irq; /* level trig */
639
		if (flow_type & IRQF_TRIGGER_HIGH)
640
			type.polarity_high |= bit_mask_irq;
641
		else
642
			type.polarity_low  |= bit_mask_irq;
643 644 645
	}

	qpnpint_spmi_write(d, QPNPINT_REG_SET_TYPE, &type, sizeof(type));
646 647 648 649 650 651

	if (flow_type & IRQ_TYPE_EDGE_BOTH)
		irq_set_handler_locked(d, handle_edge_irq);
	else
		irq_set_handler_locked(d, handle_level_irq);

652 653 654
	return 0;
}

655 656 657 658
static int qpnpint_get_irqchip_state(struct irq_data *d,
				     enum irqchip_irq_state which,
				     bool *state)
{
659
	u8 irq = HWIRQ_IRQ(d->hwirq);
660 661 662 663 664 665 666 667 668 669 670
	u8 status = 0;

	if (which != IRQCHIP_STATE_LINE_LEVEL)
		return -EINVAL;

	qpnpint_spmi_read(d, QPNPINT_REG_RT_STS, &status, 1);
	*state = !!(status & BIT(irq));

	return 0;
}

671 672 673 674 675 676
static struct irq_chip pmic_arb_irqchip = {
	.name		= "pmic_arb",
	.irq_ack	= qpnpint_irq_ack,
	.irq_mask	= qpnpint_irq_mask,
	.irq_unmask	= qpnpint_irq_unmask,
	.irq_set_type	= qpnpint_irq_set_type,
677
	.irq_get_irqchip_state	= qpnpint_get_irqchip_state,
678 679 680 681 682 683 684 685 686 687 688
	.flags		= IRQCHIP_MASK_ON_SUSPEND
			| IRQCHIP_SKIP_SET_WAKE,
};

static int qpnpint_irq_domain_dt_translate(struct irq_domain *d,
					   struct device_node *controller,
					   const u32 *intspec,
					   unsigned int intsize,
					   unsigned long *out_hwirq,
					   unsigned int *out_type)
{
689
	struct spmi_pmic_arb *pa = d->host_data;
690
	int rc;
691
	u16 apid;
692 693 694 695 696

	dev_dbg(&pa->spmic->dev,
		"intspec[0] 0x%1x intspec[1] 0x%02x intspec[2] 0x%02x\n",
		intspec[0], intspec[1], intspec[2]);

697
	if (irq_domain_get_of_node(d) != controller)
698 699 700 701 702 703
		return -EINVAL;
	if (intsize != 4)
		return -EINVAL;
	if (intspec[0] > 0xF || intspec[1] > 0xFF || intspec[2] > 0x7)
		return -EINVAL;

704 705 706 707 708 709 710 711
	rc = pa->ver_ops->ppid_to_apid(pa, intspec[0],
			(intspec[1] << 8), &apid);
	if (rc < 0) {
		dev_err(&pa->spmic->dev,
		"failed to xlate sid = 0x%x, periph = 0x%x, irq = %x rc = %d\n",
		intspec[0], intspec[1], intspec[2], rc);
		return rc;
	}
712 713 714 715 716 717 718

	/* Keep track of {max,min}_apid for bounding search during interrupt */
	if (apid > pa->max_apid)
		pa->max_apid = apid;
	if (apid < pa->min_apid)
		pa->min_apid = apid;

719
	*out_hwirq = HWIRQ(intspec[0], intspec[1], intspec[2], apid);
720 721 722 723 724 725 726 727 728 729 730
	*out_type  = intspec[3] & IRQ_TYPE_SENSE_MASK;

	dev_dbg(&pa->spmic->dev, "out_hwirq = %lu\n", *out_hwirq);

	return 0;
}

static int qpnpint_irq_domain_map(struct irq_domain *d,
				  unsigned int virq,
				  irq_hw_number_t hwirq)
{
731
	struct spmi_pmic_arb *pa = d->host_data;
732 733 734 735 736 737 738 739 740

	dev_dbg(&pa->spmic->dev, "virq = %u, hwirq = %lu\n", virq, hwirq);

	irq_set_chip_and_handler(virq, &pmic_arb_irqchip, handle_level_irq);
	irq_set_chip_data(virq, d->host_data);
	irq_set_noprobe(virq);
	return 0;
}

741
static int
742
pmic_arb_ppid_to_apid_v1(struct spmi_pmic_arb *pa, u8 sid, u16 addr, u16 *apid)
743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769
{
	u16 ppid = sid << 8 | ((addr >> 8) & 0xFF);
	u32 *mapping_table = pa->mapping_table;
	int index = 0, i;
	u16 apid_valid;
	u32 data;

	apid_valid = pa->ppid_to_apid[ppid];
	if (apid_valid & PMIC_ARB_CHAN_VALID) {
		*apid = (apid_valid & ~PMIC_ARB_CHAN_VALID);
		return 0;
	}

	for (i = 0; i < SPMI_MAPPING_TABLE_TREE_DEPTH; ++i) {
		if (!test_and_set_bit(index, pa->mapping_table_valid))
			mapping_table[index] = readl_relaxed(pa->cnfg +
						SPMI_MAPPING_TABLE_REG(index));

		data = mapping_table[index];

		if (ppid & BIT(SPMI_MAPPING_BIT_INDEX(data))) {
			if (SPMI_MAPPING_BIT_IS_1_FLAG(data)) {
				index = SPMI_MAPPING_BIT_IS_1_RESULT(data);
			} else {
				*apid = SPMI_MAPPING_BIT_IS_1_RESULT(data);
				pa->ppid_to_apid[ppid]
					= *apid | PMIC_ARB_CHAN_VALID;
770
				pa->apid_data[*apid].ppid = ppid;
771 772 773 774 775 776 777 778 779
				return 0;
			}
		} else {
			if (SPMI_MAPPING_BIT_IS_0_FLAG(data)) {
				index = SPMI_MAPPING_BIT_IS_0_RESULT(data);
			} else {
				*apid = SPMI_MAPPING_BIT_IS_0_RESULT(data);
				pa->ppid_to_apid[ppid]
					= *apid | PMIC_ARB_CHAN_VALID;
780
				pa->apid_data[*apid].ppid = ppid;
781 782 783 784 785 786 787 788
				return 0;
			}
		}
	}

	return -ENODEV;
}

789
static int
790
pmic_arb_mode_v1_v3(struct spmi_pmic_arb *pa, u8 sid, u16 addr, mode_t *mode)
791 792 793 794 795
{
	*mode = S_IRUSR | S_IWUSR;
	return 0;
}

796
/* v1 offset per ee */
797
static int
798
pmic_arb_offset_v1(struct spmi_pmic_arb *pa, u8 sid, u16 addr, u32 *offset)
799
{
800 801 802 803
	*offset = 0x800 + 0x80 * pa->channel;
	return 0;
}

804
static u16 pmic_arb_find_apid(struct spmi_pmic_arb *pa, u16 ppid)
805 806
{
	u32 regval, offset;
807
	u16 apid;
808 809 810 811
	u16 id;

	/*
	 * PMIC_ARB_REG_CHNL is a table in HW mapping channel to ppid.
812
	 * ppid_to_apid is an in-memory invert of that table.
813
	 */
814
	for (apid = pa->last_apid; apid < pa->max_periph; apid++) {
815
		regval = readl_relaxed(pa->cnfg +
816
				      SPMI_OWNERSHIP_TABLE_REG(apid));
817
		pa->apid_data[apid].owner = SPMI_OWNERSHIP_PERIPH2OWNER(regval);
818

819
		offset = PMIC_ARB_REG_CHNL(apid);
820 821 822 823 824 825 826 827
		if (offset >= pa->core_size)
			break;

		regval = readl_relaxed(pa->core + offset);
		if (!regval)
			continue;

		id = (regval >> 8) & PMIC_ARB_PPID_MASK;
828
		pa->ppid_to_apid[id] = apid | PMIC_ARB_CHAN_VALID;
829
		pa->apid_data[apid].ppid = id;
830
		if (id == ppid) {
831
			apid |= PMIC_ARB_CHAN_VALID;
832 833 834
			break;
		}
	}
835
	pa->last_apid = apid & ~PMIC_ARB_CHAN_VALID;
836

837
	return apid;
838 839
}

840

841
static int
842
pmic_arb_ppid_to_apid_v2(struct spmi_pmic_arb *pa, u8 sid, u16 addr, u16 *apid)
843 844
{
	u16 ppid = (sid << 8) | (addr >> 8);
845
	u16 apid_valid;
846

847 848 849 850
	apid_valid = pa->ppid_to_apid[ppid];
	if (!(apid_valid & PMIC_ARB_CHAN_VALID))
		apid_valid = pmic_arb_find_apid(pa, ppid);
	if (!(apid_valid & PMIC_ARB_CHAN_VALID))
851 852
		return -ENODEV;

853 854 855 856 857 858 859
	*apid = (apid_valid & ~PMIC_ARB_CHAN_VALID);
	return 0;
}

static int
pmic_arb_mode_v2(struct spmi_pmic_arb *pa, u8 sid, u16 addr, mode_t *mode)
{
860
	u16 apid;
861 862 863 864 865 866
	int rc;

	rc = pmic_arb_ppid_to_apid_v2(pa, sid, addr, &apid);
	if (rc < 0)
		return rc;

867 868 869
	*mode = 0;
	*mode |= S_IRUSR;

870
	if (pa->ee == pa->apid_data[apid].owner)
871 872 873 874
		*mode |= S_IWUSR;
	return 0;
}

875
/* v2 offset per ppid and per ee */
876
static int
877
pmic_arb_offset_v2(struct spmi_pmic_arb *pa, u8 sid, u16 addr, u32 *offset)
878
{
879
	u16 apid;
880
	int rc;
881

882 883 884
	rc = pmic_arb_ppid_to_apid_v2(pa, sid, addr, &apid);
	if (rc < 0)
		return rc;
885

886
	*offset = 0x1000 * pa->ee + 0x8000 * apid;
887
	return 0;
888 889 890 891 892 893 894 895 896 897 898 899
}

static u32 pmic_arb_fmt_cmd_v1(u8 opc, u8 sid, u16 addr, u8 bc)
{
	return (opc << 27) | ((sid & 0xf) << 20) | (addr << 4) | (bc & 0x7);
}

static u32 pmic_arb_fmt_cmd_v2(u8 opc, u8 sid, u16 addr, u8 bc)
{
	return (opc << 27) | ((addr & 0xff) << 4) | (bc & 0x7);
}

900
static u32 pmic_arb_owner_acc_status_v1(u8 m, u16 n)
901 902 903 904
{
	return 0x20 * m + 0x4 * n;
}

905
static u32 pmic_arb_owner_acc_status_v2(u8 m, u16 n)
906 907 908 909
{
	return 0x100000 + 0x1000 * m + 0x4 * n;
}

910 911 912 913 914 915
static u32 pmic_arb_owner_acc_status_v3(u8 m, u16 n)
{
	return 0x200000 + 0x1000 * m + 0x4 * n;
}

static u32 pmic_arb_acc_enable_v1(u16 n)
916 917 918 919
{
	return 0x200 + 0x4 * n;
}

920
static u32 pmic_arb_acc_enable_v2(u16 n)
921 922 923 924
{
	return 0x1000 * n;
}

925
static u32 pmic_arb_irq_status_v1(u16 n)
926 927 928 929
{
	return 0x600 + 0x4 * n;
}

930
static u32 pmic_arb_irq_status_v2(u16 n)
931 932 933 934
{
	return 0x4 + 0x1000 * n;
}

935
static u32 pmic_arb_irq_clear_v1(u16 n)
936 937 938 939
{
	return 0xA00 + 0x4 * n;
}

940
static u32 pmic_arb_irq_clear_v2(u16 n)
941 942 943 944 945
{
	return 0x8 + 0x1000 * n;
}

static const struct pmic_arb_ver_ops pmic_arb_v1 = {
946
	.ver_str		= "v1",
947
	.ppid_to_apid		= pmic_arb_ppid_to_apid_v1,
948
	.mode			= pmic_arb_mode_v1_v3,
949 950 951 952 953 954 955 956 957 958
	.non_data_cmd		= pmic_arb_non_data_cmd_v1,
	.offset			= pmic_arb_offset_v1,
	.fmt_cmd		= pmic_arb_fmt_cmd_v1,
	.owner_acc_status	= pmic_arb_owner_acc_status_v1,
	.acc_enable		= pmic_arb_acc_enable_v1,
	.irq_status		= pmic_arb_irq_status_v1,
	.irq_clear		= pmic_arb_irq_clear_v1,
};

static const struct pmic_arb_ver_ops pmic_arb_v2 = {
959
	.ver_str		= "v2",
960
	.ppid_to_apid		= pmic_arb_ppid_to_apid_v2,
961
	.mode			= pmic_arb_mode_v2,
962 963 964 965 966 967 968 969 970
	.non_data_cmd		= pmic_arb_non_data_cmd_v2,
	.offset			= pmic_arb_offset_v2,
	.fmt_cmd		= pmic_arb_fmt_cmd_v2,
	.owner_acc_status	= pmic_arb_owner_acc_status_v2,
	.acc_enable		= pmic_arb_acc_enable_v2,
	.irq_status		= pmic_arb_irq_status_v2,
	.irq_clear		= pmic_arb_irq_clear_v2,
};

971 972 973 974 975 976 977 978 979 980 981 982 983
static const struct pmic_arb_ver_ops pmic_arb_v3 = {
	.ver_str		= "v3",
	.ppid_to_apid		= pmic_arb_ppid_to_apid_v2,
	.mode			= pmic_arb_mode_v1_v3,
	.non_data_cmd		= pmic_arb_non_data_cmd_v2,
	.offset			= pmic_arb_offset_v2,
	.fmt_cmd		= pmic_arb_fmt_cmd_v2,
	.owner_acc_status	= pmic_arb_owner_acc_status_v3,
	.acc_enable		= pmic_arb_acc_enable_v2,
	.irq_status		= pmic_arb_irq_status_v2,
	.irq_clear		= pmic_arb_irq_clear_v2,
};

984 985 986 987 988
static const struct irq_domain_ops pmic_arb_irq_domain_ops = {
	.map	= qpnpint_irq_domain_map,
	.xlate	= qpnpint_irq_domain_dt_translate,
};

989 990
static int spmi_pmic_arb_probe(struct platform_device *pdev)
{
991
	struct spmi_pmic_arb *pa;
992 993
	struct spmi_controller *ctrl;
	struct resource *res;
994 995
	void __iomem *core;
	u32 channel, ee, hw_ver;
996
	int err;
997 998 999 1000 1001 1002

	ctrl = spmi_controller_alloc(&pdev->dev, sizeof(*pa));
	if (!ctrl)
		return -ENOMEM;

	pa = spmi_controller_get_drvdata(ctrl);
1003
	pa->spmic = ctrl;
1004 1005

	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "core");
1006
	pa->core_size = resource_size(res);
1007 1008 1009 1010 1011 1012
	if (pa->core_size <= 0x800) {
		dev_err(&pdev->dev, "core_size is smaller than 0x800. Failing Probe\n");
		err = -EINVAL;
		goto err_put_ctrl;
	}

1013 1014 1015
	core = devm_ioremap_resource(&ctrl->dev, res);
	if (IS_ERR(core)) {
		err = PTR_ERR(core);
1016 1017 1018
		goto err_put_ctrl;
	}

1019 1020
	hw_ver = readl_relaxed(core + PMIC_ARB_VERSION);

1021
	if (hw_ver < PMIC_ARB_VERSION_V2_MIN) {
1022 1023 1024 1025
		pa->ver_ops = &pmic_arb_v1;
		pa->wr_base = core;
		pa->rd_base = core;
	} else {
1026
		pa->core = core;
1027 1028 1029 1030 1031

		if (hw_ver < PMIC_ARB_VERSION_V3_MIN)
			pa->ver_ops = &pmic_arb_v2;
		else
			pa->ver_ops = &pmic_arb_v3;
1032

1033
		/* the apid to ppid table starts at PMIC_ARB_REG_CHNL(0) */
1034
		pa->max_periph = (pa->core_size - PMIC_ARB_REG_CHNL(0)) / 4;
1035

1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051
		res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
						   "obsrvr");
		pa->rd_base = devm_ioremap_resource(&ctrl->dev, res);
		if (IS_ERR(pa->rd_base)) {
			err = PTR_ERR(pa->rd_base);
			goto err_put_ctrl;
		}

		res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
						   "chnls");
		pa->wr_base = devm_ioremap_resource(&ctrl->dev, res);
		if (IS_ERR(pa->wr_base)) {
			err = PTR_ERR(pa->wr_base);
			goto err_put_ctrl;
		}

1052
		pa->ppid_to_apid = devm_kcalloc(&ctrl->dev,
1053
						PMIC_ARB_MAX_PPID,
1054
						sizeof(*pa->ppid_to_apid),
1055
						GFP_KERNEL);
1056
		if (!pa->ppid_to_apid) {
1057 1058 1059 1060 1061
			err = -ENOMEM;
			goto err_put_ctrl;
		}
	}

1062 1063 1064
	dev_info(&ctrl->dev, "PMIC arbiter version %s (0x%x)\n",
		 pa->ver_ops->ver_str, hw_ver);

1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078
	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "intr");
	pa->intr = devm_ioremap_resource(&ctrl->dev, res);
	if (IS_ERR(pa->intr)) {
		err = PTR_ERR(pa->intr);
		goto err_put_ctrl;
	}

	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "cnfg");
	pa->cnfg = devm_ioremap_resource(&ctrl->dev, res);
	if (IS_ERR(pa->cnfg)) {
		err = PTR_ERR(pa->cnfg);
		goto err_put_ctrl;
	}

1079 1080 1081 1082 1083 1084
	pa->irq = platform_get_irq_byname(pdev, "periph_irq");
	if (pa->irq < 0) {
		err = pa->irq;
		goto err_put_ctrl;
	}

1085 1086 1087 1088 1089 1090 1091 1092 1093
	err = of_property_read_u32(pdev->dev.of_node, "qcom,channel", &channel);
	if (err) {
		dev_err(&pdev->dev, "channel unspecified.\n");
		goto err_put_ctrl;
	}

	if (channel > 5) {
		dev_err(&pdev->dev, "invalid channel (%u) specified.\n",
			channel);
1094
		err = -EINVAL;
1095 1096 1097 1098 1099
		goto err_put_ctrl;
	}

	pa->channel = channel;

1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113
	err = of_property_read_u32(pdev->dev.of_node, "qcom,ee", &ee);
	if (err) {
		dev_err(&pdev->dev, "EE unspecified.\n");
		goto err_put_ctrl;
	}

	if (ee > 5) {
		dev_err(&pdev->dev, "invalid EE (%u) specified\n", ee);
		err = -EINVAL;
		goto err_put_ctrl;
	}

	pa->ee = ee;

1114 1115 1116 1117 1118 1119
	pa->mapping_table = devm_kcalloc(&ctrl->dev, PMIC_ARB_MAX_PERIPHS - 1,
					sizeof(*pa->mapping_table), GFP_KERNEL);
	if (!pa->mapping_table) {
		err = -ENOMEM;
		goto err_put_ctrl;
	}
1120 1121 1122 1123 1124 1125

	/* Initialize max_apid/min_apid to the opposite bounds, during
	 * the irq domain translation, we are sure to update these */
	pa->max_apid = 0;
	pa->min_apid = PMIC_ARB_MAX_PERIPHS - 1;

1126 1127 1128 1129 1130 1131 1132
	platform_set_drvdata(pdev, ctrl);
	raw_spin_lock_init(&pa->lock);

	ctrl->cmd = pmic_arb_cmd;
	ctrl->read_cmd = pmic_arb_read_cmd;
	ctrl->write_cmd = pmic_arb_write_cmd;

1133 1134 1135 1136 1137 1138 1139 1140 1141
	dev_dbg(&pdev->dev, "adding irq domain\n");
	pa->domain = irq_domain_add_tree(pdev->dev.of_node,
					 &pmic_arb_irq_domain_ops, pa);
	if (!pa->domain) {
		dev_err(&pdev->dev, "unable to create irq_domain\n");
		err = -ENOMEM;
		goto err_put_ctrl;
	}

1142
	irq_set_chained_handler_and_data(pa->irq, pmic_arb_chained_irq, pa);
1143

1144 1145
	err = spmi_controller_add(ctrl);
	if (err)
1146
		goto err_domain_remove;
1147 1148 1149

	return 0;

1150
err_domain_remove:
1151
	irq_set_chained_handler_and_data(pa->irq, NULL, NULL);
1152
	irq_domain_remove(pa->domain);
1153 1154 1155 1156 1157 1158 1159 1160
err_put_ctrl:
	spmi_controller_put(ctrl);
	return err;
}

static int spmi_pmic_arb_remove(struct platform_device *pdev)
{
	struct spmi_controller *ctrl = platform_get_drvdata(pdev);
1161
	struct spmi_pmic_arb *pa = spmi_controller_get_drvdata(ctrl);
1162
	spmi_controller_remove(ctrl);
1163
	irq_set_chained_handler_and_data(pa->irq, NULL, NULL);
1164
	irq_domain_remove(pa->domain);
1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186
	spmi_controller_put(ctrl);
	return 0;
}

static const struct of_device_id spmi_pmic_arb_match_table[] = {
	{ .compatible = "qcom,spmi-pmic-arb", },
	{},
};
MODULE_DEVICE_TABLE(of, spmi_pmic_arb_match_table);

static struct platform_driver spmi_pmic_arb_driver = {
	.probe		= spmi_pmic_arb_probe,
	.remove		= spmi_pmic_arb_remove,
	.driver		= {
		.name	= "spmi_pmic_arb",
		.of_match_table = spmi_pmic_arb_match_table,
	},
};
module_platform_driver(spmi_pmic_arb_driver);

MODULE_LICENSE("GPL v2");
MODULE_ALIAS("platform:spmi_pmic_arb");