Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 42b96d5e authored by Kyle Yan's avatar Kyle Yan Committed by Gerrit - the friendly Code Review server
Browse files

Merge "spmi: pmic-arb: fix inconsistent use of ppid and chan" into msm-4.8

parents 6d676eca 39155b66
Loading
Loading
Loading
Loading
+34 −34
Original line number Diff line number Diff line
@@ -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 {
@@ -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;
};

/**
@@ -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;

@@ -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;
}

@@ -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;
		}