Loading drivers/spmi/spmi-pmic-arb.c +34 −34 Original line number Diff line number Diff line Loading @@ -117,7 +117,7 @@ struct pmic_arb_ver_ops; * @spmic: SPMI controller object * @apid_to_ppid: in-memory copy of APID -> PPID mapping table. * @ver_ops: version dependent operations. * @ppid_to_chan in-memory copy of PPID -> channel (APID) mapping table. * @ppid_to_apid in-memory copy of PPID -> channel (APID) mapping table. * v2 only. */ struct spmi_pmic_arb { Loading @@ -140,9 +140,9 @@ struct spmi_pmic_arb { struct spmi_controller *spmic; u16 *apid_to_ppid; const struct pmic_arb_ver_ops *ver_ops; u16 *ppid_to_chan; u16 last_channel; u8 *chan_to_owner; u16 *ppid_to_apid; u16 last_apid; u8 *apid_to_owner; }; /** Loading Loading @@ -772,22 +772,22 @@ pmic_arb_offset_v1(struct spmi_pmic_arb *pa, u8 sid, u16 addr, u32 *offset) return 0; } static u16 pmic_arb_find_chan(struct spmi_pmic_arb *pa, u16 ppid) static u16 pmic_arb_find_apid(struct spmi_pmic_arb *pa, u16 ppid) { u32 regval, offset; u16 chan; u16 apid; u16 id; /* * PMIC_ARB_REG_CHNL is a table in HW mapping channel to ppid. * ppid_to_chan is an in-memory invert of that table. * ppid_to_apid is an in-memory invert of that table. */ for (chan = pa->last_channel; chan < pa->max_periph; chan++) { for (apid = pa->last_apid; apid < pa->max_periph; apid++) { regval = readl_relaxed(pa->cnfg + SPMI_OWNERSHIP_TABLE_REG(chan)); pa->chan_to_owner[chan] = SPMI_OWNERSHIP_PERIPH2OWNER(regval); SPMI_OWNERSHIP_TABLE_REG(apid)); pa->apid_to_owner[apid] = SPMI_OWNERSHIP_PERIPH2OWNER(regval); offset = PMIC_ARB_REG_CHNL(chan); offset = PMIC_ARB_REG_CHNL(apid); if (offset >= pa->core_size) break; Loading @@ -796,53 +796,53 @@ static u16 pmic_arb_find_chan(struct spmi_pmic_arb *pa, u16 ppid) continue; id = (regval >> 8) & PMIC_ARB_PPID_MASK; pa->ppid_to_chan[id] = chan | PMIC_ARB_CHAN_VALID; pa->ppid_to_apid[id] = apid | PMIC_ARB_CHAN_VALID; if (id == ppid) { chan |= PMIC_ARB_CHAN_VALID; apid |= PMIC_ARB_CHAN_VALID; break; } } pa->last_channel = chan & ~PMIC_ARB_CHAN_VALID; pa->last_apid = apid & ~PMIC_ARB_CHAN_VALID; return chan; return apid; } static int pmic_arb_mode_v2(struct spmi_pmic_arb *pa, u8 sid, u16 addr, mode_t *mode) { u16 ppid = (sid << 8) | (addr >> 8); u16 chan; u16 apid; u8 owner; chan = pa->ppid_to_chan[ppid]; if (!(chan & PMIC_ARB_CHAN_VALID)) apid = pa->ppid_to_apid[ppid]; if (!(apid & PMIC_ARB_CHAN_VALID)) return -ENODEV; *mode = 0; *mode |= 0400; chan &= ~PMIC_ARB_CHAN_VALID; owner = pa->chan_to_owner[chan]; apid &= ~PMIC_ARB_CHAN_VALID; owner = pa->apid_to_owner[apid]; if (owner == pa->ee) *mode |= 0200; return 0; } /* v2 offset per ppid (chan) and per ee */ /* v2 offset per ppid and per ee */ static int pmic_arb_offset_v2(struct spmi_pmic_arb *pa, u8 sid, u16 addr, u32 *offset) { u16 ppid = (sid << 8) | (addr >> 8); u16 chan; u16 apid; chan = pa->ppid_to_chan[ppid]; if (!(chan & PMIC_ARB_CHAN_VALID)) chan = pmic_arb_find_chan(pa, ppid); if (!(chan & PMIC_ARB_CHAN_VALID)) apid = pa->ppid_to_apid[ppid]; if (!(apid & PMIC_ARB_CHAN_VALID)) apid = pmic_arb_find_apid(pa, ppid); if (!(apid & PMIC_ARB_CHAN_VALID)) return -ENODEV; chan &= ~PMIC_ARB_CHAN_VALID; apid &= ~PMIC_ARB_CHAN_VALID; *offset = 0x1000 * pa->ee + 0x8000 * chan; *offset = 0x1000 * pa->ee + 0x8000 * apid; return 0; } Loading Loading @@ -987,20 +987,20 @@ static int spmi_pmic_arb_probe(struct platform_device *pdev) goto err_put_ctrl; } pa->ppid_to_chan = devm_kcalloc(&ctrl->dev, pa->ppid_to_apid = devm_kcalloc(&ctrl->dev, PMIC_ARB_MAX_PPID, sizeof(*pa->ppid_to_chan), sizeof(*pa->ppid_to_apid), GFP_KERNEL); if (!pa->ppid_to_chan) { if (!pa->ppid_to_apid) { err = -ENOMEM; goto err_put_ctrl; } pa->chan_to_owner = devm_kcalloc(&ctrl->dev, pa->apid_to_owner = devm_kcalloc(&ctrl->dev, pa->max_periph, sizeof(*pa->chan_to_owner), sizeof(*pa->apid_to_owner), GFP_KERNEL); if (!pa->chan_to_owner) { if (!pa->apid_to_owner) { err = -ENOMEM; goto err_put_ctrl; } Loading Loading
drivers/spmi/spmi-pmic-arb.c +34 −34 Original line number Diff line number Diff line Loading @@ -117,7 +117,7 @@ struct pmic_arb_ver_ops; * @spmic: SPMI controller object * @apid_to_ppid: in-memory copy of APID -> PPID mapping table. * @ver_ops: version dependent operations. * @ppid_to_chan in-memory copy of PPID -> channel (APID) mapping table. * @ppid_to_apid in-memory copy of PPID -> channel (APID) mapping table. * v2 only. */ struct spmi_pmic_arb { Loading @@ -140,9 +140,9 @@ struct spmi_pmic_arb { struct spmi_controller *spmic; u16 *apid_to_ppid; const struct pmic_arb_ver_ops *ver_ops; u16 *ppid_to_chan; u16 last_channel; u8 *chan_to_owner; u16 *ppid_to_apid; u16 last_apid; u8 *apid_to_owner; }; /** Loading Loading @@ -772,22 +772,22 @@ pmic_arb_offset_v1(struct spmi_pmic_arb *pa, u8 sid, u16 addr, u32 *offset) return 0; } static u16 pmic_arb_find_chan(struct spmi_pmic_arb *pa, u16 ppid) static u16 pmic_arb_find_apid(struct spmi_pmic_arb *pa, u16 ppid) { u32 regval, offset; u16 chan; u16 apid; u16 id; /* * PMIC_ARB_REG_CHNL is a table in HW mapping channel to ppid. * ppid_to_chan is an in-memory invert of that table. * ppid_to_apid is an in-memory invert of that table. */ for (chan = pa->last_channel; chan < pa->max_periph; chan++) { for (apid = pa->last_apid; apid < pa->max_periph; apid++) { regval = readl_relaxed(pa->cnfg + SPMI_OWNERSHIP_TABLE_REG(chan)); pa->chan_to_owner[chan] = SPMI_OWNERSHIP_PERIPH2OWNER(regval); SPMI_OWNERSHIP_TABLE_REG(apid)); pa->apid_to_owner[apid] = SPMI_OWNERSHIP_PERIPH2OWNER(regval); offset = PMIC_ARB_REG_CHNL(chan); offset = PMIC_ARB_REG_CHNL(apid); if (offset >= pa->core_size) break; Loading @@ -796,53 +796,53 @@ static u16 pmic_arb_find_chan(struct spmi_pmic_arb *pa, u16 ppid) continue; id = (regval >> 8) & PMIC_ARB_PPID_MASK; pa->ppid_to_chan[id] = chan | PMIC_ARB_CHAN_VALID; pa->ppid_to_apid[id] = apid | PMIC_ARB_CHAN_VALID; if (id == ppid) { chan |= PMIC_ARB_CHAN_VALID; apid |= PMIC_ARB_CHAN_VALID; break; } } pa->last_channel = chan & ~PMIC_ARB_CHAN_VALID; pa->last_apid = apid & ~PMIC_ARB_CHAN_VALID; return chan; return apid; } static int pmic_arb_mode_v2(struct spmi_pmic_arb *pa, u8 sid, u16 addr, mode_t *mode) { u16 ppid = (sid << 8) | (addr >> 8); u16 chan; u16 apid; u8 owner; chan = pa->ppid_to_chan[ppid]; if (!(chan & PMIC_ARB_CHAN_VALID)) apid = pa->ppid_to_apid[ppid]; if (!(apid & PMIC_ARB_CHAN_VALID)) return -ENODEV; *mode = 0; *mode |= 0400; chan &= ~PMIC_ARB_CHAN_VALID; owner = pa->chan_to_owner[chan]; apid &= ~PMIC_ARB_CHAN_VALID; owner = pa->apid_to_owner[apid]; if (owner == pa->ee) *mode |= 0200; return 0; } /* v2 offset per ppid (chan) and per ee */ /* v2 offset per ppid and per ee */ static int pmic_arb_offset_v2(struct spmi_pmic_arb *pa, u8 sid, u16 addr, u32 *offset) { u16 ppid = (sid << 8) | (addr >> 8); u16 chan; u16 apid; chan = pa->ppid_to_chan[ppid]; if (!(chan & PMIC_ARB_CHAN_VALID)) chan = pmic_arb_find_chan(pa, ppid); if (!(chan & PMIC_ARB_CHAN_VALID)) apid = pa->ppid_to_apid[ppid]; if (!(apid & PMIC_ARB_CHAN_VALID)) apid = pmic_arb_find_apid(pa, ppid); if (!(apid & PMIC_ARB_CHAN_VALID)) return -ENODEV; chan &= ~PMIC_ARB_CHAN_VALID; apid &= ~PMIC_ARB_CHAN_VALID; *offset = 0x1000 * pa->ee + 0x8000 * chan; *offset = 0x1000 * pa->ee + 0x8000 * apid; return 0; } Loading Loading @@ -987,20 +987,20 @@ static int spmi_pmic_arb_probe(struct platform_device *pdev) goto err_put_ctrl; } pa->ppid_to_chan = devm_kcalloc(&ctrl->dev, pa->ppid_to_apid = devm_kcalloc(&ctrl->dev, PMIC_ARB_MAX_PPID, sizeof(*pa->ppid_to_chan), sizeof(*pa->ppid_to_apid), GFP_KERNEL); if (!pa->ppid_to_chan) { if (!pa->ppid_to_apid) { err = -ENOMEM; goto err_put_ctrl; } pa->chan_to_owner = devm_kcalloc(&ctrl->dev, pa->apid_to_owner = devm_kcalloc(&ctrl->dev, pa->max_periph, sizeof(*pa->chan_to_owner), sizeof(*pa->apid_to_owner), GFP_KERNEL); if (!pa->chan_to_owner) { if (!pa->apid_to_owner) { err = -ENOMEM; goto err_put_ctrl; } Loading