Lines Matching refs:pa
407 struct spmi_pmic_arb_dev *pa = irq_data_get_irq_chip_data(d); in qpnpint_spmi_write() local
411 if (pmic_arb_write_cmd(pa->spmic, SPMI_CMD_EXT_WRITEL, sid, in qpnpint_spmi_write()
413 dev_err_ratelimited(&pa->spmic->dev, in qpnpint_spmi_write()
420 struct spmi_pmic_arb_dev *pa = irq_data_get_irq_chip_data(d); in qpnpint_spmi_read() local
424 if (pmic_arb_read_cmd(pa->spmic, SPMI_CMD_EXT_READL, sid, in qpnpint_spmi_read()
426 dev_err_ratelimited(&pa->spmic->dev, in qpnpint_spmi_read()
431 static void periph_interrupt(struct spmi_pmic_arb_dev *pa, u8 apid) in periph_interrupt() argument
437 status = readl_relaxed(pa->intr + pa->ver_ops->irq_status(apid)); in periph_interrupt()
441 irq = irq_find_mapping(pa->domain, in periph_interrupt()
442 pa->apid_to_ppid[apid] << 16 in periph_interrupt()
451 struct spmi_pmic_arb_dev *pa = irq_desc_get_handler_data(desc); in pmic_arb_chained_irq() local
453 void __iomem *intr = pa->intr; in pmic_arb_chained_irq()
454 int first = pa->min_apid >> 5; in pmic_arb_chained_irq()
455 int last = pa->max_apid >> 5; in pmic_arb_chained_irq()
463 pa->ver_ops->owner_acc_status(pa->ee, i)); in pmic_arb_chained_irq()
467 periph_interrupt(pa, id + i * 32); in pmic_arb_chained_irq()
476 struct spmi_pmic_arb_dev *pa = irq_data_get_irq_chip_data(d); in qpnpint_irq_ack() local
482 raw_spin_lock_irqsave(&pa->lock, flags); in qpnpint_irq_ack()
483 writel_relaxed(1 << irq, pa->intr + pa->ver_ops->irq_clear(apid)); in qpnpint_irq_ack()
484 raw_spin_unlock_irqrestore(&pa->lock, flags); in qpnpint_irq_ack()
492 struct spmi_pmic_arb_dev *pa = irq_data_get_irq_chip_data(d); in qpnpint_irq_mask() local
499 raw_spin_lock_irqsave(&pa->lock, flags); in qpnpint_irq_mask()
500 status = readl_relaxed(pa->intr + pa->ver_ops->acc_enable(apid)); in qpnpint_irq_mask()
503 writel_relaxed(status, pa->intr + in qpnpint_irq_mask()
504 pa->ver_ops->acc_enable(apid)); in qpnpint_irq_mask()
506 raw_spin_unlock_irqrestore(&pa->lock, flags); in qpnpint_irq_mask()
514 struct spmi_pmic_arb_dev *pa = irq_data_get_irq_chip_data(d); in qpnpint_irq_unmask() local
521 raw_spin_lock_irqsave(&pa->lock, flags); in qpnpint_irq_unmask()
522 status = readl_relaxed(pa->intr + pa->ver_ops->acc_enable(apid)); in qpnpint_irq_unmask()
525 pa->intr + pa->ver_ops->acc_enable(apid)); in qpnpint_irq_unmask()
527 raw_spin_unlock_irqrestore(&pa->lock, flags); in qpnpint_irq_unmask()
607 static int search_mapping_table(struct spmi_pmic_arb_dev *pa, in search_mapping_table() argument
612 u32 *mapping_table = pa->mapping_table; in search_mapping_table()
646 struct spmi_pmic_arb_dev *pa = d->host_data; in qpnpint_irq_domain_dt_translate() local
651 dev_dbg(&pa->spmic->dev, in qpnpint_irq_domain_dt_translate()
666 err = search_mapping_table(pa, &spec, &apid); in qpnpint_irq_domain_dt_translate()
670 pa->apid_to_ppid[apid] = spec.slave << 8 | spec.per; in qpnpint_irq_domain_dt_translate()
673 if (apid > pa->max_apid) in qpnpint_irq_domain_dt_translate()
674 pa->max_apid = apid; in qpnpint_irq_domain_dt_translate()
675 if (apid < pa->min_apid) in qpnpint_irq_domain_dt_translate()
676 pa->min_apid = apid; in qpnpint_irq_domain_dt_translate()
684 dev_dbg(&pa->spmic->dev, "out_hwirq = %lu\n", *out_hwirq); in qpnpint_irq_domain_dt_translate()
693 struct spmi_pmic_arb_dev *pa = d->host_data; in qpnpint_irq_domain_map() local
695 dev_dbg(&pa->spmic->dev, "virq = %u, hwirq = %lu\n", virq, hwirq); in qpnpint_irq_domain_map()
704 static u32 pmic_arb_offset_v1(struct spmi_pmic_arb_dev *pa, u8 sid, u16 addr) in pmic_arb_offset_v1() argument
706 return 0x800 + 0x80 * pa->channel; in pmic_arb_offset_v1()
710 static u32 pmic_arb_offset_v2(struct spmi_pmic_arb_dev *pa, u8 sid, u16 addr) in pmic_arb_offset_v2() argument
713 u8 chan = pa->ppid_to_chan[ppid]; in pmic_arb_offset_v2()
715 return 0x1000 * pa->ee + 0x8000 * chan; in pmic_arb_offset_v2()
795 struct spmi_pmic_arb_dev *pa; in spmi_pmic_arb_probe() local
803 ctrl = spmi_controller_alloc(&pdev->dev, sizeof(*pa)); in spmi_pmic_arb_probe()
807 pa = spmi_controller_get_drvdata(ctrl); in spmi_pmic_arb_probe()
808 pa->spmic = ctrl; in spmi_pmic_arb_probe()
824 pa->ver_ops = &pmic_arb_v1; in spmi_pmic_arb_probe()
825 pa->wr_base = core; in spmi_pmic_arb_probe()
826 pa->rd_base = core; in spmi_pmic_arb_probe()
832 pa->ver_ops = &pmic_arb_v2; in spmi_pmic_arb_probe()
836 pa->rd_base = devm_ioremap_resource(&ctrl->dev, res); in spmi_pmic_arb_probe()
837 if (IS_ERR(pa->rd_base)) { in spmi_pmic_arb_probe()
838 err = PTR_ERR(pa->rd_base); in spmi_pmic_arb_probe()
844 pa->wr_base = devm_ioremap_resource(&ctrl->dev, res); in spmi_pmic_arb_probe()
845 if (IS_ERR(pa->wr_base)) { in spmi_pmic_arb_probe()
846 err = PTR_ERR(pa->wr_base); in spmi_pmic_arb_probe()
850 pa->ppid_to_chan = devm_kzalloc(&ctrl->dev, in spmi_pmic_arb_probe()
852 if (!pa->ppid_to_chan) { in spmi_pmic_arb_probe()
866 pa->ppid_to_chan[ppid] = chan; in spmi_pmic_arb_probe()
871 pa->intr = devm_ioremap_resource(&ctrl->dev, res); in spmi_pmic_arb_probe()
872 if (IS_ERR(pa->intr)) { in spmi_pmic_arb_probe()
873 err = PTR_ERR(pa->intr); in spmi_pmic_arb_probe()
878 pa->cnfg = devm_ioremap_resource(&ctrl->dev, res); in spmi_pmic_arb_probe()
879 if (IS_ERR(pa->cnfg)) { in spmi_pmic_arb_probe()
880 err = PTR_ERR(pa->cnfg); in spmi_pmic_arb_probe()
884 pa->irq = platform_get_irq_byname(pdev, "periph_irq"); in spmi_pmic_arb_probe()
885 if (pa->irq < 0) { in spmi_pmic_arb_probe()
886 err = pa->irq; in spmi_pmic_arb_probe()
902 pa->channel = channel; in spmi_pmic_arb_probe()
916 pa->ee = ee; in spmi_pmic_arb_probe()
918 for (i = 0; i < ARRAY_SIZE(pa->mapping_table); ++i) in spmi_pmic_arb_probe()
919 pa->mapping_table[i] = readl_relaxed( in spmi_pmic_arb_probe()
920 pa->cnfg + SPMI_MAPPING_TABLE_REG(i)); in spmi_pmic_arb_probe()
924 pa->max_apid = 0; in spmi_pmic_arb_probe()
925 pa->min_apid = PMIC_ARB_MAX_PERIPHS - 1; in spmi_pmic_arb_probe()
928 raw_spin_lock_init(&pa->lock); in spmi_pmic_arb_probe()
935 pa->domain = irq_domain_add_tree(pdev->dev.of_node, in spmi_pmic_arb_probe()
936 &pmic_arb_irq_domain_ops, pa); in spmi_pmic_arb_probe()
937 if (!pa->domain) { in spmi_pmic_arb_probe()
943 irq_set_chained_handler_and_data(pa->irq, pmic_arb_chained_irq, pa); in spmi_pmic_arb_probe()
952 irq_set_chained_handler_and_data(pa->irq, NULL, NULL); in spmi_pmic_arb_probe()
953 irq_domain_remove(pa->domain); in spmi_pmic_arb_probe()
962 struct spmi_pmic_arb_dev *pa = spmi_controller_get_drvdata(ctrl); in spmi_pmic_arb_remove() local
964 irq_set_chained_handler_and_data(pa->irq, NULL, NULL); in spmi_pmic_arb_remove()
965 irq_domain_remove(pa->domain); in spmi_pmic_arb_remove()