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

Commit 932c130a authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "ASoC: WCD9335: add support for I2C bulk write"

parents 8220b4df e6e34eda
Loading
Loading
Loading
Loading
+61 −7
Original line number Diff line number Diff line
@@ -12877,6 +12877,38 @@ err:
	return ret;
}

static int tasha_swrm_i2s_bulk_write(struct wcd9xxx *wcd9xxx,
				struct wcd9xxx_reg_val *bulk_reg,
				size_t len)
{
	int i, ret = 0;
	unsigned short swr_wr_addr_base;
	unsigned short swr_wr_data_base;

	swr_wr_addr_base = WCD9335_SWR_AHB_BRIDGE_WR_ADDR_0;
	swr_wr_data_base = WCD9335_SWR_AHB_BRIDGE_WR_DATA_0;

	for (i = 0; i < (len * 2); i += 2) {
		/* First Write the Data to register */
		ret = wcd9xxx_bulk_write(&wcd9xxx->core_res,
			swr_wr_data_base, 4, bulk_reg[i].buf);
		if (ret < 0) {
			dev_err(wcd9xxx->dev, "%s: WR Data Failure\n",
				__func__);
			break;
		}
		/* Next Write Address */
		ret = wcd9xxx_bulk_write(&wcd9xxx->core_res,
			swr_wr_addr_base, 4, bulk_reg[i+1].buf);
		if (ret < 0) {
			dev_err(wcd9xxx->dev, "%s: WR Addr Failure\n",
				__func__);
			break;
		}
	}
	return ret;
}

static int tasha_swrm_bulk_write(void *handle, u32 *reg, u32 *val, size_t len)
{
	struct tasha_priv *tasha;
@@ -12914,10 +12946,22 @@ static int tasha_swrm_bulk_write(void *handle, u32 *reg, u32 *val, size_t len)
		bulk_reg[i+1].bytes = 4;
	}
	mutex_lock(&tasha->swr_write_lock);
	ret = wcd9xxx_slim_bulk_write(wcd9xxx, bulk_reg, (len * 2), false);
	if (ret)

	if (wcd9xxx_get_intf_type() == WCD9XXX_INTERFACE_TYPE_I2C) {
		ret = tasha_swrm_i2s_bulk_write(wcd9xxx, bulk_reg, len);
		if (ret) {
			dev_err(tasha->dev, "%s: i2s bulk write failed, ret: %d\n",
				__func__, ret);
		}
	} else {
		ret = wcd9xxx_slim_bulk_write(wcd9xxx, bulk_reg,
				 (len * 2), false);
		if (ret) {
			dev_err(tasha->dev, "%s: swrm bulk write failed, ret: %d\n",
				__func__, ret);
		}
	}

	mutex_unlock(&tasha->swr_write_lock);
	kfree(bulk_reg);

@@ -12952,9 +12996,19 @@ static int tasha_swrm_write(void *handle, int reg, int val)
	bulk_reg[1].bytes = 4;

	mutex_lock(&tasha->swr_write_lock);

	if (wcd9xxx_get_intf_type() == WCD9XXX_INTERFACE_TYPE_I2C) {
		ret = tasha_swrm_i2s_bulk_write(wcd9xxx, bulk_reg, 1);
		if (ret) {
			dev_err(tasha->dev, "%s: i2s swrm write failed, ret: %d\n",
				__func__, ret);
		}
	} else {
		ret = wcd9xxx_slim_bulk_write(wcd9xxx, bulk_reg, 2, false);
		if (ret < 0)
			pr_err("%s: WR Data Failure\n", __func__);
	}

	mutex_unlock(&tasha->swr_write_lock);
	return ret;
}