Lines Matching +full:spmi +full:- +full:channel

1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (c) 2012-2015, 2017, The Linux Foundation. All rights reserved.
18 #include <linux/spmi.h>
27 /* PMIC Arbiter channel registers offsets */
44 #define SPMI_MAPPING_TABLE_TREE_DEPTH 16 /* Maximum of 16-bits */
54 /* Channel Status fields */
123 * spmi_pmic_arb - SPMI PMIC Arbiter object
127 * @intr: address of the SPMI interrupt control registers.
130 * @channel: execution environment channel to use for accesses.
135 * @mapping_table: in-memory copy of PPID -> APID mapping table.
137 * @spmic: SPMI controller object
139 * @ppid_to_apid in-memory copy of PPID -> APID mapping table.
149 u8 channel; member
169 * @non_data_cmd: on v1 issues an spmi non-data command.
170 * on v2 no HW support, returns -EOPNOTSUPP.
171 * @offset: on v1 offset of per-ee channel.
172 * on v2 offset of per-ee and per-ppid channel.
173 * @fmt_cmd: formats a GENI/SPMI command.
187 /* spmi commands (read_cmd, write_cmd, cmd) functionality */
204 writel_relaxed(val, pmic_arb->wr_base + offset); in pmic_arb_base_write()
210 writel_relaxed(val, pmic_arb->rd_base + offset); in pmic_arb_set_rd_cmd()
214 * pmic_arb_read_data: reads pmic-arb's register and copy 1..4 bytes to buf
215 * @bc: byte count -1. range: 0..3
222 u32 data = __raw_readl(pmic_arb->rd_base + reg); in pmic_arb_read_data()
228 * pmic_arb_write_data: write 1..4 bytes from buf to pmic-arb's register
229 * @bc: byte-count -1. range: 0..3.
239 __raw_writel(data, pmic_arb->wr_base + reg); in pmic_arb_write_data()
252 rc = pmic_arb->ver_ops->offset(pmic_arb, sid, addr, ch_type); in pmic_arb_wait_for_done()
259 while (timeout--) { in pmic_arb_wait_for_done()
264 dev_err(&ctrl->dev, "%s: transaction denied (0x%x)\n", in pmic_arb_wait_for_done()
266 return -EPERM; in pmic_arb_wait_for_done()
270 dev_err(&ctrl->dev, "%s: transaction failed (0x%x)\n", in pmic_arb_wait_for_done()
272 return -EIO; in pmic_arb_wait_for_done()
276 dev_err(&ctrl->dev, "%s: transaction dropped (0x%x)\n", in pmic_arb_wait_for_done()
278 return -EIO; in pmic_arb_wait_for_done()
286 dev_err(&ctrl->dev, "%s: timeout, status 0x%x\n", in pmic_arb_wait_for_done()
288 return -ETIMEDOUT; in pmic_arb_wait_for_done()
300 rc = pmic_arb->ver_ops->offset(pmic_arb, sid, 0, PMIC_ARB_CHANNEL_RW); in pmic_arb_non_data_cmd_v1()
307 raw_spin_lock_irqsave(&pmic_arb->lock, flags); in pmic_arb_non_data_cmd_v1()
309 rc = pmic_arb_wait_for_done(ctrl, pmic_arb->wr_base, sid, 0, in pmic_arb_non_data_cmd_v1()
311 raw_spin_unlock_irqrestore(&pmic_arb->lock, flags); in pmic_arb_non_data_cmd_v1()
319 return -EOPNOTSUPP; in pmic_arb_non_data_cmd_v2()
322 /* Non-data command */
327 dev_dbg(&ctrl->dev, "cmd op:0x%x sid:%d\n", opc, sid); in pmic_arb_cmd()
329 /* Check for valid non-data command */ in pmic_arb_cmd()
331 return -EINVAL; in pmic_arb_cmd()
333 return pmic_arb->ver_ops->non_data_cmd(ctrl, opc, sid); in pmic_arb_cmd()
341 u8 bc = len - 1; in pmic_arb_read_cmd()
346 rc = pmic_arb->ver_ops->offset(pmic_arb, sid, addr, in pmic_arb_read_cmd()
353 dev_err(&ctrl->dev, "pmic-arb supports 1..%d bytes per trans, but:%zu requested", in pmic_arb_read_cmd()
355 return -EINVAL; in pmic_arb_read_cmd()
366 return -EINVAL; in pmic_arb_read_cmd()
368 cmd = pmic_arb->ver_ops->fmt_cmd(opc, sid, addr, bc); in pmic_arb_read_cmd()
370 raw_spin_lock_irqsave(&pmic_arb->lock, flags); in pmic_arb_read_cmd()
372 rc = pmic_arb_wait_for_done(ctrl, pmic_arb->rd_base, sid, addr, in pmic_arb_read_cmd()
382 bc - 4); in pmic_arb_read_cmd()
385 raw_spin_unlock_irqrestore(&pmic_arb->lock, flags); in pmic_arb_read_cmd()
394 u8 bc = len - 1; in pmic_arb_write_cmd()
399 rc = pmic_arb->ver_ops->offset(pmic_arb, sid, addr, in pmic_arb_write_cmd()
406 dev_err(&ctrl->dev, "pmic-arb supports 1..%d bytes per trans, but:%zu requested", in pmic_arb_write_cmd()
408 return -EINVAL; in pmic_arb_write_cmd()
421 return -EINVAL; in pmic_arb_write_cmd()
423 cmd = pmic_arb->ver_ops->fmt_cmd(opc, sid, addr, bc); in pmic_arb_write_cmd()
426 raw_spin_lock_irqsave(&pmic_arb->lock, flags); in pmic_arb_write_cmd()
431 bc - 4); in pmic_arb_write_cmd()
435 rc = pmic_arb_wait_for_done(ctrl, pmic_arb->wr_base, sid, addr, in pmic_arb_write_cmd()
437 raw_spin_unlock_irqrestore(&pmic_arb->lock, flags); in pmic_arb_write_cmd()
454 u8 type; /* 1 -> edge */
464 u8 sid = hwirq_to_sid(d->hwirq); in qpnpint_spmi_write()
465 u8 per = hwirq_to_per(d->hwirq); in qpnpint_spmi_write()
467 if (pmic_arb_write_cmd(pmic_arb->spmic, SPMI_CMD_EXT_WRITEL, sid, in qpnpint_spmi_write()
469 dev_err_ratelimited(&pmic_arb->spmic->dev, "failed irqchip transaction on %x\n", in qpnpint_spmi_write()
470 d->irq); in qpnpint_spmi_write()
476 u8 sid = hwirq_to_sid(d->hwirq); in qpnpint_spmi_read()
477 u8 per = hwirq_to_per(d->hwirq); in qpnpint_spmi_read()
479 if (pmic_arb_read_cmd(pmic_arb->spmic, SPMI_CMD_EXT_READL, sid, in qpnpint_spmi_read()
481 dev_err_ratelimited(&pmic_arb->spmic->dev, "failed irqchip transaction on %x\n", in qpnpint_spmi_read()
482 d->irq); in qpnpint_spmi_read()
487 u16 ppid = pmic_arb->apid_data[apid].ppid; in cleanup_irq()
492 writel_relaxed(irq_mask, pmic_arb->ver_ops->irq_clear(pmic_arb, apid)); in cleanup_irq()
494 if (pmic_arb_write_cmd(pmic_arb->spmic, SPMI_CMD_EXT_WRITEL, sid, in cleanup_irq()
496 dev_err_ratelimited(&pmic_arb->spmic->dev, "failed to ack irq_mask = 0x%x for ppid = %x\n", in cleanup_irq()
499 if (pmic_arb_write_cmd(pmic_arb->spmic, SPMI_CMD_EXT_WRITEL, sid, in cleanup_irq()
501 dev_err_ratelimited(&pmic_arb->spmic->dev, "failed to ack irq_mask = 0x%x for ppid = %x\n", in cleanup_irq()
510 u8 sid = (pmic_arb->apid_data[apid].ppid >> 8) & 0xF; in periph_interrupt()
511 u8 per = pmic_arb->apid_data[apid].ppid & 0xFF; in periph_interrupt()
513 status = readl_relaxed(pmic_arb->ver_ops->irq_status(pmic_arb, apid)); in periph_interrupt()
515 id = ffs(status) - 1; in periph_interrupt()
517 irq = irq_find_mapping(pmic_arb->domain, in periph_interrupt()
530 const struct pmic_arb_ver_ops *ver_ops = pmic_arb->ver_ops; in pmic_arb_chained_irq()
532 int first = pmic_arb->min_apid >> 5; in pmic_arb_chained_irq()
533 int last = pmic_arb->max_apid >> 5; in pmic_arb_chained_irq()
534 u8 ee = pmic_arb->ee; in pmic_arb_chained_irq()
542 ver_ops->owner_acc_status(pmic_arb, ee, i)); in pmic_arb_chained_irq()
544 id = ffs(status) - 1; in pmic_arb_chained_irq()
548 ver_ops->acc_enable(pmic_arb, apid)); in pmic_arb_chained_irq()
560 u8 irq = hwirq_to_irq(d->hwirq); in qpnpint_irq_ack()
561 u16 apid = hwirq_to_apid(d->hwirq); in qpnpint_irq_ack()
564 writel_relaxed(BIT(irq), pmic_arb->ver_ops->irq_clear(pmic_arb, apid)); in qpnpint_irq_ack()
572 u8 irq = hwirq_to_irq(d->hwirq); in qpnpint_irq_mask()
581 const struct pmic_arb_ver_ops *ver_ops = pmic_arb->ver_ops; in qpnpint_irq_unmask()
582 u8 irq = hwirq_to_irq(d->hwirq); in qpnpint_irq_unmask()
583 u16 apid = hwirq_to_apid(d->hwirq); in qpnpint_irq_unmask()
587 ver_ops->acc_enable(pmic_arb, apid)); in qpnpint_irq_unmask()
606 u8 irq = hwirq_to_irq(d->hwirq); in qpnpint_irq_set_type()
621 return -EINVAL; in qpnpint_irq_set_type()
642 return irq_set_irq_wake(pmic_arb->irq, on); in qpnpint_irq_set_wake()
649 u8 irq = hwirq_to_irq(d->hwirq); in qpnpint_get_irqchip_state()
653 return -EINVAL; in qpnpint_get_irqchip_state()
665 u16 periph = hwirq_to_per(d->hwirq); in qpnpint_irq_domain_activate()
666 u16 apid = hwirq_to_apid(d->hwirq); in qpnpint_irq_domain_activate()
667 u16 sid = hwirq_to_sid(d->hwirq); in qpnpint_irq_domain_activate()
668 u16 irq = hwirq_to_irq(d->hwirq); in qpnpint_irq_domain_activate()
670 if (pmic_arb->apid_data[apid].irq_ee != pmic_arb->ee) { in qpnpint_irq_domain_activate()
671 …dev_err(&pmic_arb->spmic->dev, "failed to xlate sid = %#x, periph = %#x, irq = %u: ee=%u but owner… in qpnpint_irq_domain_activate()
672 sid, periph, irq, pmic_arb->ee, in qpnpint_irq_domain_activate()
673 pmic_arb->apid_data[apid].irq_ee); in qpnpint_irq_domain_activate()
674 return -ENODEV; in qpnpint_irq_domain_activate()
696 struct spmi_pmic_arb *pmic_arb = d->host_data; in qpnpint_irq_domain_translate()
697 u32 *intspec = fwspec->param; in qpnpint_irq_domain_translate()
701 dev_dbg(&pmic_arb->spmic->dev, "intspec[0] 0x%1x intspec[1] 0x%02x intspec[2] 0x%02x\n", in qpnpint_irq_domain_translate()
704 if (irq_domain_get_of_node(d) != pmic_arb->spmic->dev.of_node) in qpnpint_irq_domain_translate()
705 return -EINVAL; in qpnpint_irq_domain_translate()
706 if (fwspec->param_count != 4) in qpnpint_irq_domain_translate()
707 return -EINVAL; in qpnpint_irq_domain_translate()
709 return -EINVAL; in qpnpint_irq_domain_translate()
712 rc = pmic_arb->ver_ops->ppid_to_apid(pmic_arb, ppid); in qpnpint_irq_domain_translate()
714 dev_err(&pmic_arb->spmic->dev, "failed to xlate sid = %#x, periph = %#x, irq = %u rc = %d\n", in qpnpint_irq_domain_translate()
721 if (apid > pmic_arb->max_apid) in qpnpint_irq_domain_translate()
722 pmic_arb->max_apid = apid; in qpnpint_irq_domain_translate()
723 if (apid < pmic_arb->min_apid) in qpnpint_irq_domain_translate()
724 pmic_arb->min_apid = apid; in qpnpint_irq_domain_translate()
729 dev_dbg(&pmic_arb->spmic->dev, "out_hwirq = %lu\n", *out_hwirq); in qpnpint_irq_domain_translate()
742 dev_dbg(&pmic_arb->spmic->dev, "virq = %u, hwirq = %lu, type = %u\n", in qpnpint_irq_domain_map()
761 struct spmi_pmic_arb *pmic_arb = domain->host_data; in qpnpint_irq_domain_alloc()
780 u32 *mapping_table = pmic_arb->mapping_table; in pmic_arb_ppid_to_apid_v1()
786 apid_valid = pmic_arb->ppid_to_apid[ppid]; in pmic_arb_ppid_to_apid_v1()
793 if (!test_and_set_bit(index, pmic_arb->mapping_table_valid)) in pmic_arb_ppid_to_apid_v1()
794 mapping_table[index] = readl_relaxed(pmic_arb->cnfg + in pmic_arb_ppid_to_apid_v1()
804 pmic_arb->ppid_to_apid[ppid] in pmic_arb_ppid_to_apid_v1()
806 pmic_arb->apid_data[apid].ppid = ppid; in pmic_arb_ppid_to_apid_v1()
814 pmic_arb->ppid_to_apid[ppid] in pmic_arb_ppid_to_apid_v1()
816 pmic_arb->apid_data[apid].ppid = ppid; in pmic_arb_ppid_to_apid_v1()
822 return -ENODEV; in pmic_arb_ppid_to_apid_v1()
829 return 0x800 + 0x80 * pmic_arb->channel; in pmic_arb_offset_v1()
834 struct apid_data *apidd = &pmic_arb->apid_data[pmic_arb->last_apid]; in pmic_arb_find_apid()
838 for (apid = pmic_arb->last_apid; ; apid++, apidd++) { in pmic_arb_find_apid()
839 offset = pmic_arb->ver_ops->apid_map_offset(apid); in pmic_arb_find_apid()
840 if (offset >= pmic_arb->core_size) in pmic_arb_find_apid()
843 regval = readl_relaxed(pmic_arb->cnfg + in pmic_arb_find_apid()
845 apidd->irq_ee = SPMI_OWNERSHIP_PERIPH2OWNER(regval); in pmic_arb_find_apid()
846 apidd->write_ee = apidd->irq_ee; in pmic_arb_find_apid()
848 regval = readl_relaxed(pmic_arb->core + offset); in pmic_arb_find_apid()
853 pmic_arb->ppid_to_apid[id] = apid | PMIC_ARB_APID_VALID; in pmic_arb_find_apid()
854 apidd->ppid = id; in pmic_arb_find_apid()
860 pmic_arb->last_apid = apid & ~PMIC_ARB_APID_VALID; in pmic_arb_find_apid()
869 apid_valid = pmic_arb->ppid_to_apid[ppid]; in pmic_arb_ppid_to_apid_v2()
873 return -ENODEV; in pmic_arb_ppid_to_apid_v2()
880 struct apid_data *apidd = pmic_arb->apid_data; in pmic_arb_read_apid_map_v5()
894 offset = pmic_arb->ver_ops->apid_map_offset(i); in pmic_arb_read_apid_map_v5()
895 if (offset >= pmic_arb->core_size) in pmic_arb_read_apid_map_v5()
898 regval = readl_relaxed(pmic_arb->core + offset); in pmic_arb_read_apid_map_v5()
904 regval = readl_relaxed(pmic_arb->cnfg + in pmic_arb_read_apid_map_v5()
906 apidd->write_ee = SPMI_OWNERSHIP_PERIPH2OWNER(regval); in pmic_arb_read_apid_map_v5()
908 apidd->irq_ee = is_irq_ee ? apidd->write_ee : INVALID_EE; in pmic_arb_read_apid_map_v5()
910 valid = pmic_arb->ppid_to_apid[ppid] & PMIC_ARB_APID_VALID; in pmic_arb_read_apid_map_v5()
911 apid = pmic_arb->ppid_to_apid[ppid] & ~PMIC_ARB_APID_VALID; in pmic_arb_read_apid_map_v5()
912 prev_apidd = &pmic_arb->apid_data[apid]; in pmic_arb_read_apid_map_v5()
915 prev_apidd->write_ee == pmic_arb->ee) { in pmic_arb_read_apid_map_v5()
920 prev_apidd->irq_ee = apidd->irq_ee; in pmic_arb_read_apid_map_v5()
923 pmic_arb->ppid_to_apid[ppid] = i | PMIC_ARB_APID_VALID; in pmic_arb_read_apid_map_v5()
926 apidd->ppid = ppid; in pmic_arb_read_apid_map_v5()
927 pmic_arb->last_apid = i; in pmic_arb_read_apid_map_v5()
931 dev_dbg(&pmic_arb->spmic->dev, "PPID APID Write-EE IRQ-EE\n"); in pmic_arb_read_apid_map_v5()
933 apid = pmic_arb->ppid_to_apid[ppid]; in pmic_arb_read_apid_map_v5()
936 apidd = &pmic_arb->apid_data[apid]; in pmic_arb_read_apid_map_v5()
937 dev_dbg(&pmic_arb->spmic->dev, "%#03X %3u %2u %2u\n", in pmic_arb_read_apid_map_v5()
938 ppid, apid, apidd->write_ee, apidd->irq_ee); in pmic_arb_read_apid_map_v5()
947 if (!(pmic_arb->ppid_to_apid[ppid] & PMIC_ARB_APID_VALID)) in pmic_arb_ppid_to_apid_v5()
948 return -ENODEV; in pmic_arb_ppid_to_apid_v5()
950 return pmic_arb->ppid_to_apid[ppid] & ~PMIC_ARB_APID_VALID; in pmic_arb_ppid_to_apid_v5()
967 return 0x1000 * pmic_arb->ee + 0x8000 * apid; in pmic_arb_offset_v2()
989 offset = 0x10000 * pmic_arb->ee + 0x80 * apid; in pmic_arb_offset_v5()
1012 return pmic_arb->intr + 0x20 * m + 0x4 * n; in pmic_arb_owner_acc_status_v1()
1018 return pmic_arb->intr + 0x100000 + 0x1000 * m + 0x4 * n; in pmic_arb_owner_acc_status_v2()
1024 return pmic_arb->intr + 0x200000 + 0x1000 * m + 0x4 * n; in pmic_arb_owner_acc_status_v3()
1030 return pmic_arb->intr + 0x10000 * m + 0x4 * n; in pmic_arb_owner_acc_status_v5()
1036 return pmic_arb->intr + 0x200 + 0x4 * n; in pmic_arb_acc_enable_v1()
1042 return pmic_arb->intr + 0x1000 * n; in pmic_arb_acc_enable_v2()
1048 return pmic_arb->wr_base + 0x100 + 0x10000 * n; in pmic_arb_acc_enable_v5()
1054 return pmic_arb->intr + 0x600 + 0x4 * n; in pmic_arb_irq_status_v1()
1060 return pmic_arb->intr + 0x4 + 0x1000 * n; in pmic_arb_irq_status_v2()
1066 return pmic_arb->wr_base + 0x104 + 0x10000 * n; in pmic_arb_irq_status_v5()
1072 return pmic_arb->intr + 0xA00 + 0x4 * n; in pmic_arb_irq_clear_v1()
1078 return pmic_arb->intr + 0x8 + 0x1000 * n; in pmic_arb_irq_clear_v2()
1084 return pmic_arb->wr_base + 0x108 + 0x10000 * n; in pmic_arb_irq_clear_v5()
1163 u32 channel, ee, hw_ver; in spmi_pmic_arb_probe() local
1166 ctrl = spmi_controller_alloc(&pdev->dev, sizeof(*pmic_arb)); in spmi_pmic_arb_probe()
1168 return -ENOMEM; in spmi_pmic_arb_probe()
1171 pmic_arb->spmic = ctrl; in spmi_pmic_arb_probe()
1174 core = devm_ioremap_resource(&ctrl->dev, res); in spmi_pmic_arb_probe()
1180 pmic_arb->core_size = resource_size(res); in spmi_pmic_arb_probe()
1182 pmic_arb->ppid_to_apid = devm_kcalloc(&ctrl->dev, PMIC_ARB_MAX_PPID, in spmi_pmic_arb_probe()
1183 sizeof(*pmic_arb->ppid_to_apid), in spmi_pmic_arb_probe()
1185 if (!pmic_arb->ppid_to_apid) { in spmi_pmic_arb_probe()
1186 err = -ENOMEM; in spmi_pmic_arb_probe()
1193 pmic_arb->ver_ops = &pmic_arb_v1; in spmi_pmic_arb_probe()
1194 pmic_arb->wr_base = core; in spmi_pmic_arb_probe()
1195 pmic_arb->rd_base = core; in spmi_pmic_arb_probe()
1197 pmic_arb->core = core; in spmi_pmic_arb_probe()
1200 pmic_arb->ver_ops = &pmic_arb_v2; in spmi_pmic_arb_probe()
1202 pmic_arb->ver_ops = &pmic_arb_v3; in spmi_pmic_arb_probe()
1204 pmic_arb->ver_ops = &pmic_arb_v5; in spmi_pmic_arb_probe()
1208 pmic_arb->rd_base = devm_ioremap_resource(&ctrl->dev, res); in spmi_pmic_arb_probe()
1209 if (IS_ERR(pmic_arb->rd_base)) { in spmi_pmic_arb_probe()
1210 err = PTR_ERR(pmic_arb->rd_base); in spmi_pmic_arb_probe()
1216 pmic_arb->wr_base = devm_ioremap_resource(&ctrl->dev, res); in spmi_pmic_arb_probe()
1217 if (IS_ERR(pmic_arb->wr_base)) { in spmi_pmic_arb_probe()
1218 err = PTR_ERR(pmic_arb->wr_base); in spmi_pmic_arb_probe()
1223 dev_info(&ctrl->dev, "PMIC arbiter version %s (0x%x)\n", in spmi_pmic_arb_probe()
1224 pmic_arb->ver_ops->ver_str, hw_ver); in spmi_pmic_arb_probe()
1227 pmic_arb->intr = devm_ioremap_resource(&ctrl->dev, res); in spmi_pmic_arb_probe()
1228 if (IS_ERR(pmic_arb->intr)) { in spmi_pmic_arb_probe()
1229 err = PTR_ERR(pmic_arb->intr); in spmi_pmic_arb_probe()
1234 pmic_arb->cnfg = devm_ioremap_resource(&ctrl->dev, res); in spmi_pmic_arb_probe()
1235 if (IS_ERR(pmic_arb->cnfg)) { in spmi_pmic_arb_probe()
1236 err = PTR_ERR(pmic_arb->cnfg); in spmi_pmic_arb_probe()
1240 pmic_arb->irq = platform_get_irq_byname(pdev, "periph_irq"); in spmi_pmic_arb_probe()
1241 if (pmic_arb->irq < 0) { in spmi_pmic_arb_probe()
1242 err = pmic_arb->irq; in spmi_pmic_arb_probe()
1246 err = of_property_read_u32(pdev->dev.of_node, "qcom,channel", &channel); in spmi_pmic_arb_probe()
1248 dev_err(&pdev->dev, "channel unspecified.\n"); in spmi_pmic_arb_probe()
1252 if (channel > 5) { in spmi_pmic_arb_probe()
1253 dev_err(&pdev->dev, "invalid channel (%u) specified.\n", in spmi_pmic_arb_probe()
1254 channel); in spmi_pmic_arb_probe()
1255 err = -EINVAL; in spmi_pmic_arb_probe()
1259 pmic_arb->channel = channel; in spmi_pmic_arb_probe()
1261 err = of_property_read_u32(pdev->dev.of_node, "qcom,ee", &ee); in spmi_pmic_arb_probe()
1263 dev_err(&pdev->dev, "EE unspecified.\n"); in spmi_pmic_arb_probe()
1268 dev_err(&pdev->dev, "invalid EE (%u) specified\n", ee); in spmi_pmic_arb_probe()
1269 err = -EINVAL; in spmi_pmic_arb_probe()
1273 pmic_arb->ee = ee; in spmi_pmic_arb_probe()
1274 mapping_table = devm_kcalloc(&ctrl->dev, PMIC_ARB_MAX_PERIPHS, in spmi_pmic_arb_probe()
1277 err = -ENOMEM; in spmi_pmic_arb_probe()
1281 pmic_arb->mapping_table = mapping_table; in spmi_pmic_arb_probe()
1284 pmic_arb->max_apid = 0; in spmi_pmic_arb_probe()
1285 pmic_arb->min_apid = PMIC_ARB_MAX_PERIPHS - 1; in spmi_pmic_arb_probe()
1288 raw_spin_lock_init(&pmic_arb->lock); in spmi_pmic_arb_probe()
1290 ctrl->cmd = pmic_arb_cmd; in spmi_pmic_arb_probe()
1291 ctrl->read_cmd = pmic_arb_read_cmd; in spmi_pmic_arb_probe()
1292 ctrl->write_cmd = pmic_arb_write_cmd; in spmi_pmic_arb_probe()
1297 dev_err(&pdev->dev, "could not read APID->PPID mapping table, rc= %d\n", in spmi_pmic_arb_probe()
1303 dev_dbg(&pdev->dev, "adding irq domain\n"); in spmi_pmic_arb_probe()
1304 pmic_arb->domain = irq_domain_add_tree(pdev->dev.of_node, in spmi_pmic_arb_probe()
1306 if (!pmic_arb->domain) { in spmi_pmic_arb_probe()
1307 dev_err(&pdev->dev, "unable to create irq_domain\n"); in spmi_pmic_arb_probe()
1308 err = -ENOMEM; in spmi_pmic_arb_probe()
1312 irq_set_chained_handler_and_data(pmic_arb->irq, pmic_arb_chained_irq, in spmi_pmic_arb_probe()
1321 irq_set_chained_handler_and_data(pmic_arb->irq, NULL, NULL); in spmi_pmic_arb_probe()
1322 irq_domain_remove(pmic_arb->domain); in spmi_pmic_arb_probe()
1333 irq_set_chained_handler_and_data(pmic_arb->irq, NULL, NULL); in spmi_pmic_arb_remove()
1334 irq_domain_remove(pmic_arb->domain); in spmi_pmic_arb_remove()
1340 { .compatible = "qcom,spmi-pmic-arb", },