blob: e5a9d40213635e975bfb9966a32bc9ea5d5cb1e8 [file] [log] [blame]
Kenneth Heitke65a5ad22012-02-08 14:00:04 -07001/* Copyright (c) 2012, Code Aurora Forum. All rights reserved.
2 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 and
5 * only version 2 as published by the Free Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 */
12
13#define pr_fmt(fmt) "%s: " fmt, __func__
14
15#include <linux/delay.h>
16#include <linux/err.h>
17#include <linux/io.h>
18#include <linux/kernel.h>
19#include <linux/platform_device.h>
20#include <linux/slab.h>
21#include <linux/spmi.h>
22#include <linux/of.h>
23#include <linux/interrupt.h>
24#include <linux/of_spmi.h>
25#include <mach/qpnp-int.h>
26
27#define SPMI_PMIC_ARB_NAME "spmi_pmic_arb"
28
29/* PMIC Arbiter configuration registers */
30#define PMIC_ARB_VERSION 0x0000
31#define PMIC_ARB_INT_EN 0x0004
32
33/* PMIC Arbiter channel registers */
34#define PMIC_ARB_CMD(N) (0x0800 + (0x80 * (N)))
35#define PMIC_ARB_CONFIG(N) (0x0804 + (0x80 * (N)))
36#define PMIC_ARB_STATUS(N) (0x0808 + (0x80 * (N)))
37#define PMIC_ARB_WDATA0(N) (0x0810 + (0x80 * (N)))
38#define PMIC_ARB_WDATA1(N) (0x0814 + (0x80 * (N)))
39#define PMIC_ARB_RDATA0(N) (0x0818 + (0x80 * (N)))
40#define PMIC_ARB_RDATA1(N) (0x081C + (0x80 * (N)))
41
42/* Interrupt Controller */
43#define SPMI_PIC_OWNER_ACC_STATUS(M, N) (0x0000 + ((32 * (M)) + (4 * (N))))
44#define SPMI_PIC_ACC_ENABLE(N) (0x0200 + (4 * (N)))
45#define SPMI_PIC_IRQ_STATUS(N) (0x0600 + (4 * (N)))
46#define SPMI_PIC_IRQ_CLEAR(N) (0x0A00 + (4 * (N)))
47
48/* Channel Status fields */
49enum pmic_arb_chnl_status {
50 PMIC_ARB_STATUS_DONE = (1 << 0),
51 PMIC_ARB_STATUS_FAILURE = (1 << 1),
52 PMIC_ARB_STATUS_DENIED = (1 << 2),
53 PMIC_ARB_STATUS_DROPPED = (1 << 3),
54};
55
56/* Command register fields */
57#define PMIC_ARB_CMD_MAX_BYTE_COUNT 8
58
59/* Command Opcodes */
60enum pmic_arb_cmd_op_code {
61 PMIC_ARB_OP_EXT_WRITEL = 0,
62 PMIC_ARB_OP_EXT_READL = 1,
63 PMIC_ARB_OP_EXT_WRITE = 2,
64 PMIC_ARB_OP_RESET = 3,
65 PMIC_ARB_OP_SLEEP = 4,
66 PMIC_ARB_OP_SHUTDOWN = 5,
67 PMIC_ARB_OP_WAKEUP = 6,
68 PMIC_ARB_OP_AUTHENTICATE = 7,
69 PMIC_ARB_OP_MSTR_READ = 8,
70 PMIC_ARB_OP_MSTR_WRITE = 9,
71 PMIC_ARB_OP_EXT_READ = 13,
72 PMIC_ARB_OP_WRITE = 14,
73 PMIC_ARB_OP_READ = 15,
74 PMIC_ARB_OP_ZERO_WRITE = 16,
75};
76
77/* Maximum number of support PMIC peripherals */
78#define PMIC_ARB_MAX_PERIPHS 256
79#define PMIC_ARB_PERIPH_ID_VALID (1 << 15)
80#define PMIC_ARB_TIMEOUT_US 100
81#define PMIC_ARB_APID_MASK 0xFF
82#define PMIC_ARB_PPID_MASK 0xFFF
83
84/**
85 * base - base address of the PMIC Arbiter core registers.
86 * intr - base address of the SPMI interrupt control registers
87 */
88struct spmi_pmic_arb_dev {
89 struct spmi_controller controller;
90 struct device *dev;
91 struct device *slave;
92 void __iomem *base;
93 void __iomem *intr;
94 int pic_irq;
95 int pic_enable_cnt;
96 spinlock_t lock;
97 u8 owner;
98 u8 channel;
99 u8 min_apid;
100 u8 max_apid;
101 u16 periph_id_map[PMIC_ARB_MAX_PERIPHS];
102};
103
104static u32 pmic_arb_read(struct spmi_pmic_arb_dev *dev, u32 offset)
105{
106 u32 val = readl_relaxed(dev->base + offset);
107 pr_debug("address 0x%p, val 0x%x\n", dev->base + offset, val);
108 return val;
109}
110
111static void pmic_arb_write(struct spmi_pmic_arb_dev *dev, u32 offset, u32 val)
112{
113 pr_debug("address 0x%p, val 0x%x\n", dev->base + offset, val);
114 writel_relaxed(val, dev->base + offset);
115}
116
117static int pmic_arb_wait_for_done(struct spmi_pmic_arb_dev *dev)
118{
119 u32 status = 0;
120 u32 timeout = PMIC_ARB_TIMEOUT_US;
121 u32 offset = PMIC_ARB_STATUS(dev->channel);
122
123 while (timeout--) {
124 status = pmic_arb_read(dev, offset);
125
126 if (status & PMIC_ARB_STATUS_DONE) {
127 if (status & PMIC_ARB_STATUS_DENIED) {
128 dev_err(dev->dev,
129 "%s: transaction denied (0x%x)\n",
130 __func__, status);
131 return -EPERM;
132 }
133
134 if (status & PMIC_ARB_STATUS_FAILURE) {
135 dev_err(dev->dev,
136 "%s: transaction failed (0x%x)\n",
137 __func__, status);
138 return -EIO;
139 }
140
141 if (status & PMIC_ARB_STATUS_DROPPED) {
142 dev_err(dev->dev,
143 "%s: transaction dropped (0x%x)\n",
144 __func__, status);
145 return -EIO;
146 }
147
148 return 0;
149 }
150 udelay(1);
151 }
152
153 dev_err(dev->dev, "%s: timeout, status 0x%x\n", __func__, status);
154 return -ETIMEDOUT;
155}
156
157static void pa_read_data(struct spmi_pmic_arb_dev *dev, u8 *buf, u32 reg, u8 bc)
158{
159 u32 data = pmic_arb_read(dev, reg);
160
161 switch (bc & 0x3) {
162 case 3:
163 *buf++ = data & 0xff;
164 data >>= 8;
165 case 2:
166 *buf++ = data & 0xff;
167 data >>= 8;
168 case 1:
169 *buf++ = data & 0xff;
170 data >>= 8;
171 case 0:
172 *buf++ = data & 0xff;
173 default:
174 break;
175 }
176}
177
178static void
179pa_write_data(struct spmi_pmic_arb_dev *dev, u8 *buf, u32 reg, u8 bc)
180{
181 u32 data = 0;
182
183 switch (bc & 0x3) {
184 case 3:
185 data = (buf[0]|buf[1]<<8|buf[2]<<16|buf[3]<<24);
186 break;
187 case 2:
188 data = (buf[0]|buf[1]<<8|buf[2]<<16);
189 break;
190 case 1:
191 data = (buf[0]|buf[1]<<8);
192 break;
193 case 0:
194 data = (buf[0]);
195 break;
196 default:
197 break;
198 }
199
200 pmic_arb_write(dev, reg, data);
201}
202
203/* Non-data command */
204static int pmic_arb_cmd(struct spmi_controller *ctrl, u8 opc, u8 sid)
205{
206 struct spmi_pmic_arb_dev *pmic_arb = spmi_get_ctrldata(ctrl);
207 unsigned long flags;
208 u32 cmd;
209 int rc;
210
211 pr_debug("op:0x%x sid:%d\n", opc, sid);
212
213 /* Check for valid non-data command */
214 if (opc < SPMI_CMD_RESET || opc > SPMI_CMD_WAKEUP)
215 return -EINVAL;
216
217 cmd = ((opc | 0x40) << 27) | ((sid & 0xf) << 20);
218
219 spin_lock_irqsave(&pmic_arb->lock, flags);
220 pmic_arb_write(pmic_arb, PMIC_ARB_CMD(pmic_arb->channel), cmd);
221 rc = pmic_arb_wait_for_done(pmic_arb);
222 spin_unlock_irqrestore(&pmic_arb->lock, flags);
223
224 return rc;
225}
226
227static int pmic_arb_read_cmd(struct spmi_controller *ctrl,
228 u8 opc, u8 sid, u16 addr, u8 bc, u8 *buf)
229{
230 struct spmi_pmic_arb_dev *pmic_arb = spmi_get_ctrldata(ctrl);
231 unsigned long flags;
232 u32 cmd;
233 int rc;
234
235 pr_debug("op:0x%x sid:%d bc:%d addr:0x%x\n", opc, sid, bc, addr);
236
237 /* Check the opcode */
238 if (opc >= 0x60 && opc <= 0x7F)
239 opc = PMIC_ARB_OP_READ;
240 else if (opc >= 0x20 && opc <= 0x2F)
241 opc = PMIC_ARB_OP_EXT_READ;
242 else if (opc >= 0x38 && opc <= 0x3F)
243 opc = PMIC_ARB_OP_EXT_READL;
244 else
245 return -EINVAL;
246
247 cmd = (opc << 27) | ((sid & 0xf) << 20) | (addr << 4) | (bc & 0x7);
248
249 spin_lock_irqsave(&pmic_arb->lock, flags);
250 pmic_arb_write(pmic_arb, PMIC_ARB_CMD(pmic_arb->channel), cmd);
251 rc = pmic_arb_wait_for_done(pmic_arb);
252 if (rc)
253 goto done;
254
255 /* Read from FIFO, note 'bc' is actually number of bytes minus 1 */
256 pa_read_data(pmic_arb, buf, PMIC_ARB_RDATA0(pmic_arb->channel), bc);
257
258 if (bc > 3)
259 pa_read_data(pmic_arb, buf + 4,
260 PMIC_ARB_RDATA1(pmic_arb->channel), bc);
261
262done:
263 spin_unlock_irqrestore(&pmic_arb->lock, flags);
264 return rc;
265}
266
267static int pmic_arb_write_cmd(struct spmi_controller *ctrl,
268 u8 opc, u8 sid, u16 addr, u8 bc, u8 *buf)
269{
270 struct spmi_pmic_arb_dev *pmic_arb = spmi_get_ctrldata(ctrl);
271 unsigned long flags;
272 u32 cmd;
273 int rc;
274
275 pr_debug("op:0x%x sid:%d bc:%d addr:0x%x\n", opc, sid, bc, addr);
276
277 /* Check the opcode */
278 if (opc >= 0x40 && opc <= 0x5F)
279 opc = PMIC_ARB_OP_WRITE;
280 else if (opc >= 0x00 && opc <= 0x0F)
281 opc = PMIC_ARB_OP_EXT_WRITE;
282 else if (opc >= 0x30 && opc <= 0x37)
283 opc = PMIC_ARB_OP_EXT_WRITEL;
284 else if (opc >= 0x80 && opc <= 0xFF)
285 opc = PMIC_ARB_OP_ZERO_WRITE;
286 else
287 return -EINVAL;
288
289 cmd = (opc << 27) | ((sid & 0xf) << 20) | (addr << 4) | (bc & 0x7);
290
291 /* Write data to FIFOs */
292 spin_lock_irqsave(&pmic_arb->lock, flags);
293 pa_write_data(pmic_arb, buf, PMIC_ARB_WDATA0(pmic_arb->channel), bc);
294
295 if (bc > 3)
296 pa_write_data(pmic_arb, buf + 4,
297 PMIC_ARB_WDATA1(pmic_arb->channel), bc);
298
299 /* Start the transaction */
300 pmic_arb_write(pmic_arb, PMIC_ARB_CMD(pmic_arb->channel), cmd);
301 rc = pmic_arb_wait_for_done(pmic_arb);
302 spin_unlock_irqrestore(&pmic_arb->lock, flags);
303
304 return rc;
305}
306
307/* APID to PPID */
308static u16 get_peripheral_id(struct spmi_pmic_arb_dev *pmic_arb, u8 apid)
309{
310 return pmic_arb->periph_id_map[apid] & PMIC_ARB_PPID_MASK;
311}
312
313/* APID to PPID, returns valid flag */
314static int is_apid_valid(struct spmi_pmic_arb_dev *pmic_arb, u8 apid)
315{
316 return pmic_arb->periph_id_map[apid] & PMIC_ARB_PERIPH_ID_VALID;
317}
318
319/* PPID to APID */
320static uint32_t map_peripheral_id(struct spmi_pmic_arb_dev *pmic_arb, u16 ppid)
321{
322 int first = pmic_arb->min_apid;
323 int last = pmic_arb->max_apid;
324 int i;
325
326 /* Search table for a matching PPID */
327 for (i = first; i <= last; ++i) {
328 if ((pmic_arb->periph_id_map[i] & PMIC_ARB_PPID_MASK) == ppid)
329 return i;
330 }
331
332 dev_err(pmic_arb->dev, "Unknown ppid 0x%x\n", ppid);
333 return PMIC_ARB_MAX_PERIPHS;
334}
335
336/* Enable interrupt at the PMIC Arbiter PIC */
337static int pmic_arb_pic_enable(struct spmi_controller *ctrl,
338 struct qpnp_irq_spec *spec, uint32_t data)
339{
340 struct spmi_pmic_arb_dev *pmic_arb = spmi_get_ctrldata(ctrl);
341 u8 apid = data & PMIC_ARB_APID_MASK;
342 unsigned long flags;
343 u32 status;
344
345 dev_dbg(pmic_arb->dev, "PIC enable, apid:0x%x, sid:0x%x, pid:0x%x\n",
346 apid, spec->slave, spec->per);
347
348 if (data < pmic_arb->min_apid || data > pmic_arb->max_apid) {
349 dev_err(pmic_arb->dev, "int enable: invalid APID %d\n", data);
350 return -EINVAL;
351 }
352
353 if (!is_apid_valid(pmic_arb, apid)) {
354 dev_err(pmic_arb->dev, "int enable: int not supported\n");
355 return -EINVAL;
356 }
357
358 spin_lock_irqsave(&pmic_arb->lock, flags);
359 status = readl_relaxed(pmic_arb->intr + SPMI_PIC_ACC_ENABLE(apid));
360 if (!status) {
361 if (pmic_arb->pic_enable_cnt++ == 0)
362 enable_irq(pmic_arb->pic_irq);
363 writel_relaxed(0x1, pmic_arb->intr + SPMI_PIC_ACC_ENABLE(apid));
364 /* Interrupt needs to be enabled before returning to caller */
365 wmb();
366 }
367 spin_unlock_irqrestore(&pmic_arb->lock, flags);
368 return 0;
369}
370
371/* Disable interrupt at the PMIC Arbiter PIC */
372static int pmic_arb_pic_disable(struct spmi_controller *ctrl,
373 struct qpnp_irq_spec *spec, uint32_t data)
374{
375 struct spmi_pmic_arb_dev *pmic_arb = spmi_get_ctrldata(ctrl);
376 u8 apid = data & PMIC_ARB_APID_MASK;
377 unsigned long flags;
378 u32 status;
379
380 dev_dbg(pmic_arb->dev, "PIC disable, apid:0x%x, sid:0x%x, pid:0x%x\n",
381 apid, spec->slave, spec->per);
382
383 if (data < pmic_arb->min_apid || data > pmic_arb->max_apid) {
384 dev_err(pmic_arb->dev, "int disable: invalid APID %d\n", data);
385 return -EINVAL;
386 }
387
388 if (!is_apid_valid(pmic_arb, apid)) {
389 dev_err(pmic_arb->dev, "int disable: int not supported\n");
390 return -EINVAL;
391 }
392
393 spin_lock_irqsave(&pmic_arb->lock, flags);
394 status = readl_relaxed(pmic_arb->intr + SPMI_PIC_ACC_ENABLE(apid));
395 if (status) {
396 if (pmic_arb->pic_enable_cnt-- == 1)
397 disable_irq(pmic_arb->pic_irq);
398 writel_relaxed(0x0, pmic_arb->intr + SPMI_PIC_ACC_ENABLE(apid));
399 /* Interrupt needs to be disabled before returning to caller */
400 wmb();
401 }
402 spin_unlock_irqrestore(&pmic_arb->lock, flags);
403 return 0;
404}
405
406static irqreturn_t
407periph_interrupt(struct spmi_pmic_arb_dev *pmic_arb, u8 apid)
408{
409 u16 ppid = get_peripheral_id(pmic_arb, apid);
410 void __iomem *base = pmic_arb->intr;
411 u8 sid = (ppid >> 8) & 0x0F;
412 u8 pid = ppid & 0xFF;
413 u32 status;
414 int i;
415
416 if (!is_apid_valid(pmic_arb, apid)) {
417 dev_err(pmic_arb->dev, "unknown peripheral id 0x%x\n", ppid);
418 /* return IRQ_NONE; */
419 }
420
421 /* Read the peripheral specific interrupt bits */
422 status = readl_relaxed(base + SPMI_PIC_IRQ_STATUS(apid));
423
424 /* Clear the peripheral interrupts */
425 writel_relaxed(status, base + SPMI_PIC_IRQ_CLEAR(apid));
426 /* Interrupt needs to be cleared/acknowledged before exiting ISR */
427 mb();
428
429 dev_dbg(pmic_arb->dev,
430 "interrupt, apid:0x%x, sid:0x%x, pid:0x%x, intr:0x%x\n",
431 apid, sid, pid, status);
432
433 /* Send interrupt notification */
434 for (i = 0; status && i < 8; ++i, status >>= 1) {
435 if (status & 0x1) {
436 struct qpnp_irq_spec irq_spec = {
437 .slave = sid,
438 .per = pid,
439 .irq = i,
440 };
441 qpnpint_handle_irq(&pmic_arb->controller, &irq_spec);
442 }
443 }
444 return IRQ_HANDLED;
445}
446
447/* Peripheral interrupt handler */
448static irqreturn_t pmic_arb_periph_irq(int irq, void *dev_id)
449{
450 struct spmi_pmic_arb_dev *pmic_arb = dev_id;
451 void __iomem *intr = pmic_arb->intr;
452 u8 ee = pmic_arb->owner;
453 u32 ret = IRQ_NONE;
454 u32 status;
455
456 int first = pmic_arb->min_apid >> 5;
457 int last = pmic_arb->max_apid >> 5;
458 int i, j;
459
460 dev_dbg(pmic_arb->dev, "Peripheral interrupt detected\n");
461
462 /* Check the accumulated interrupt status */
463 for (i = first; i <= last; ++i) {
464 status = readl_relaxed(intr + SPMI_PIC_OWNER_ACC_STATUS(ee, i));
465
466 for (j = 0; status && j < 32; ++j, status >>= 1) {
467 if (status & 0x1) {
468 u8 id = (i * 32) + j;
469 ret |= periph_interrupt(pmic_arb, id);
470 }
471 }
472 }
473
474 return ret;
475}
476
477/* Callback to register an APID for specific slave/peripheral */
478static int pmic_arb_intr_priv_data(struct spmi_controller *ctrl,
479 struct qpnp_irq_spec *spec, uint32_t *data)
480{
481 struct spmi_pmic_arb_dev *pmic_arb = spmi_get_ctrldata(ctrl);
482 u16 ppid = ((spec->slave & 0x0F) << 8) | (spec->per & 0xFF);
483 *data = map_peripheral_id(pmic_arb, ppid);
484 return 0;
485}
486
487static int __devinit
488spmi_pmic_arb_get_property(struct platform_device *pdev, char *pname, u32 *prop)
489{
490 int ret = of_property_read_u32(pdev->dev.of_node, pname, prop);
491
492 if (ret)
493 dev_err(&pdev->dev, "missing property: %s\n", pname);
494 else
495 pr_debug("%s = 0x%x\n", pname, *prop);
496
497 return ret;
498}
499
500static int __devinit spmi_pmic_arb_get_map_data(struct platform_device *pdev,
501 struct spmi_pmic_arb_dev *pmic_arb)
502{
503 int i;
504 int ret;
505 int map_size;
506 u32 *map_data;
507 const int map_width = 2 * sizeof(*map_data);
508 const struct device_node *of_node = pdev->dev.of_node;
509
510 /* Get size of the mapping table (in bytes) */
511 if (!of_get_property(of_node, "qcom,pmic-arb-ppid-map", &map_size)) {
512 dev_err(&pdev->dev, "missing ppid mapping table\n");
513 return -ENODEV;
514 }
515
516 /* Map size can't exceed the maximum number of peripherals */
517 if (map_size == 0 || map_size % map_width ||
518 map_size > map_width * PMIC_ARB_MAX_PERIPHS) {
519 dev_err(&pdev->dev, "map size of %d is not valid\n", map_size);
520 return -ENODEV;
521 }
522
523 map_data = kzalloc(map_size, GFP_KERNEL);
524 if (!map_data) {
525 dev_err(&pdev->dev, "can not allocate map data\n");
526 return -ENOMEM;
527 }
528
529 ret = of_property_read_u32_array(of_node,
530 "qcom,pmic-arb-ppid-map", map_data, map_size/sizeof(u32));
531 if (ret) {
532 dev_err(&pdev->dev, "invalid or missing property: ppid-map\n");
533 goto err;
534 };
535
536 pmic_arb->max_apid = 0;
537 pmic_arb->min_apid = PMIC_ARB_MAX_PERIPHS - 1;
538
539 /* Build the mapping table from the data */
540 for (i = 0; i < map_size/sizeof(u32);) {
541 u32 ppid = map_data[i++];
542 u32 apid = map_data[i++];
543
544 if (apid > PMIC_ARB_APID_MASK) {
545 ret = -ENODEV;
546 dev_err(&pdev->dev, "invalid APID: 0x%x\n", apid);
547 goto err;
548 }
549
550 if (ppid > PMIC_ARB_PPID_MASK) {
551 ret = -ENODEV;
552 dev_err(&pdev->dev, "invalid PPID: 0x%x\n", ppid);
553 goto err;
554 }
555
556 if (pmic_arb->periph_id_map[apid] & PMIC_ARB_PERIPH_ID_VALID)
557 dev_warn(&pdev->dev, "duplicate APID 0x%x\n", apid);
558
559 pmic_arb->periph_id_map[apid] = ppid | PMIC_ARB_PERIPH_ID_VALID;
560
561 if (apid > pmic_arb->max_apid)
562 pmic_arb->max_apid = apid;
563
564 if (apid < pmic_arb->min_apid)
565 pmic_arb->min_apid = apid;
566 }
567
568 pr_debug("%d value(s) mapped, min:%d, max:%d\n",
569 map_size/map_width, pmic_arb->min_apid, pmic_arb->max_apid);
570
571err:
572 kfree(map_data);
573 return ret;
574}
575
576static struct qpnp_local_int spmi_pmic_arb_intr_cb = {
577 .mask = pmic_arb_pic_disable,
578 .unmask = pmic_arb_pic_enable,
579 .register_priv_data = pmic_arb_intr_priv_data,
580};
581
582static int __devinit spmi_pmic_arb_probe(struct platform_device *pdev)
583{
584 struct spmi_pmic_arb_dev *pmic_arb;
585 struct resource *mem_res;
586 u32 cell_index;
587 u32 prop;
588 int ret = 0;
589
590 pr_debug("SPMI PMIC Arbiter\n");
591
592 pmic_arb = devm_kzalloc(&pdev->dev,
593 sizeof(struct spmi_pmic_arb_dev), GFP_KERNEL);
594 if (!pmic_arb) {
595 dev_err(&pdev->dev, "can not allocate pmic_arb data\n");
596 return -ENOMEM;
597 }
598
599 mem_res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
600 if (!mem_res) {
601 dev_err(&pdev->dev, "missing base memory resource\n");
602 return -ENODEV;
603 }
604
605 pmic_arb->base = devm_ioremap(&pdev->dev,
606 mem_res->start, resource_size(mem_res));
607 if (!pmic_arb->base) {
608 dev_err(&pdev->dev, "ioremap of 'base' failed\n");
609 return -ENOMEM;
610 }
611
612 mem_res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
613 if (!mem_res) {
614 dev_err(&pdev->dev, "missing mem resource (interrupts)\n");
615 return -ENODEV;
616 }
617
618 pmic_arb->intr = devm_ioremap(&pdev->dev,
619 mem_res->start, resource_size(mem_res));
620 if (!pmic_arb->intr) {
621 dev_err(&pdev->dev, "ioremap of 'intr' failed\n");
622 return -ENOMEM;
623 }
624
625 pmic_arb->pic_irq = platform_get_irq(pdev, 0);
626 if (!pmic_arb->pic_irq) {
627 dev_err(&pdev->dev, "missing IRQ resource\n");
628 return -ENODEV;
629 }
630
631 ret = devm_request_irq(&pdev->dev, pmic_arb->pic_irq,
632 pmic_arb_periph_irq, IRQF_TRIGGER_HIGH, pdev->name, pmic_arb);
633 if (ret) {
634 dev_err(&pdev->dev, "request IRQ failed\n");
635 return ret;
636 }
637 disable_irq(pmic_arb->pic_irq);
638
639 /* Get properties from the device tree */
640 ret = spmi_pmic_arb_get_property(pdev, "cell-index", &cell_index);
641 if (ret)
642 return -ENODEV;
643
644 ret = spmi_pmic_arb_get_map_data(pdev, pmic_arb);
645 if (ret)
646 return ret;
647
648 ret = spmi_pmic_arb_get_property(pdev, "qcom,pmic-arb-ee", &prop);
649 if (ret)
650 return -ENODEV;
651 pmic_arb->owner = (u8)prop;
652
653 ret = spmi_pmic_arb_get_property(pdev, "qcom,pmic-arb-channel", &prop);
654 if (ret)
655 return -ENODEV;
656 pmic_arb->channel = (u8)prop;
657
658 pmic_arb->dev = &pdev->dev;
659 platform_set_drvdata(pdev, pmic_arb);
660 spmi_set_ctrldata(&pmic_arb->controller, pmic_arb);
661
662 spin_lock_init(&pmic_arb->lock);
663
664 pmic_arb->controller.nr = cell_index;
665 pmic_arb->controller.dev.parent = pdev->dev.parent;
666 pmic_arb->controller.dev.of_node = of_node_get(pdev->dev.of_node);
667
668 /* Callbacks */
669 pmic_arb->controller.cmd = pmic_arb_cmd;
670 pmic_arb->controller.read_cmd = pmic_arb_read_cmd;
671 pmic_arb->controller.write_cmd = pmic_arb_write_cmd;
672
673 ret = spmi_add_controller(&pmic_arb->controller);
674 if (ret)
675 goto err_add_controller;
676
677 /* Register the interrupt enable/disable functions */
678 qpnpint_register_controller(cell_index, &spmi_pmic_arb_intr_cb);
679
680 /* Register device(s) from the device tree */
681 of_spmi_register_devices(&pmic_arb->controller);
682
683 pr_debug("PMIC Arb Version 0x%x\n",
684 pmic_arb_read(pmic_arb, PMIC_ARB_VERSION));
685
686 return 0;
687
688err_add_controller:
689 platform_set_drvdata(pdev, NULL);
690 return ret;
691}
692
693static int __devexit spmi_pmic_arb_remove(struct platform_device *pdev)
694{
695 struct spmi_pmic_arb_dev *pmic_arb = platform_get_drvdata(pdev);
696
697 free_irq(pmic_arb->pic_irq, pmic_arb);
698 platform_set_drvdata(pdev, NULL);
699 spmi_del_controller(&pmic_arb->controller);
700 return 0;
701}
702
703static struct of_device_id spmi_pmic_arb_match_table[] = {
704 { .compatible = "qcom,spmi-pmic-arb",
705 },
706 {}
707};
708
709static struct platform_driver spmi_pmic_arb_driver = {
710 .probe = spmi_pmic_arb_probe,
711 .remove = __exit_p(spmi_pmic_arb_remove),
712 .driver = {
713 .name = SPMI_PMIC_ARB_NAME,
714 .owner = THIS_MODULE,
715 .of_match_table = spmi_pmic_arb_match_table,
716 },
717};
718
719static int __init spmi_pmic_arb_init(void)
720{
721 return platform_driver_register(&spmi_pmic_arb_driver);
722}
723postcore_initcall(spmi_pmic_arb_init);
724
725static void __exit spmi_pmic_arb_exit(void)
726{
727 platform_driver_unregister(&spmi_pmic_arb_driver);
728}
729module_exit(spmi_pmic_arb_exit);
730
731MODULE_LICENSE("GPL v2");
732MODULE_VERSION("1.0");
733MODULE_ALIAS("platform:spmi_pmic_arb");