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

Commit d2378797 authored by Vipin Deep Kaur's avatar Vipin Deep Kaur Committed by Gerrit - the friendly Code Review server
Browse files

dma: gpi: Add support to assign static GPII for I2C Touch on Lahaina



Add support to assign static GPII0 for I2C LA Touch usecase on Lahaina.

Change-Id: Ib0ea811626796825e280bf77f04ef68ab5f833a8
Signed-off-by: default avatarVipin Deep Kaur <vkaur@codeaurora.org>
parent e9b202cb
Loading
Loading
Loading
Loading
+24 −9
Original line number Diff line number Diff line
@@ -441,6 +441,7 @@ struct gpi_dev {
	void *ee_base; /*ee register base address*/
	u32 max_gpii; /* maximum # of gpii instances available per gpi block */
	u32 gpii_mask; /* gpii instances available for apps */
	u32 static_gpii_mask; /* gpii instances assigned statically */
	u32 ev_factor; /* ev ring length factor */
	u32 smmu_cfg;
	dma_addr_t iova_base;
@@ -2777,14 +2778,17 @@ static int gpi_alloc_chan_resources(struct dma_chan *chan)
	return ret;
}

static int gpi_find_avail_gpii(struct gpi_dev *gpi_dev, u32 seid)
static int gpi_find_avail_gpii(struct gpi_dev *gpi_dev, u32 seid,
		bool static_gpii)
{
	int gpii;
	struct gpii_chan *tx_chan, *rx_chan;
	u32 gpii_mask =
		static_gpii ? gpi_dev->static_gpii_mask : gpi_dev->gpii_mask;

	/* check if same seid is already configured for another chid */
	for (gpii = 0; gpii < gpi_dev->max_gpii; gpii++) {
		if (!((1 << gpii) & gpi_dev->gpii_mask))
		if (!((1 << gpii) & gpii_mask))
			continue;

		tx_chan = &gpi_dev->gpiis[gpii].gpii_chan[GPI_TX_CHAN];
@@ -2798,7 +2802,7 @@ static int gpi_find_avail_gpii(struct gpi_dev *gpi_dev, u32 seid)

	/* no channels configured with same seid, return next avail gpii */
	for (gpii = 0; gpii < gpi_dev->max_gpii; gpii++) {
		if (!((1 << gpii) & gpi_dev->gpii_mask))
		if (!((1 << gpii) & gpii_mask))
			continue;

		tx_chan = &gpi_dev->gpiis[gpii].gpii_chan[GPI_TX_CHAN];
@@ -2823,8 +2827,9 @@ static struct dma_chan *gpi_of_dma_xlate(struct of_phandle_args *args,
{
	struct gpi_dev *gpi_dev = (struct gpi_dev *)of_dma->of_dma_data;
	u32 seid, chid;
	int gpii;
	int gpii, val;
	struct gpii_chan *gpii_chan;
	bool static_gpii;

	if (args->args_count < REQ_OF_DMA_ARGS) {
		GPI_ERR(gpi_dev,
@@ -2840,9 +2845,11 @@ static struct dma_chan *gpi_of_dma_xlate(struct of_phandle_args *args,
	}

	seid = args->args[1];
	val = (args->args[4] & STATIC_GPII_BMSK) >> STATIC_GPII_SHFT;
	static_gpii = (val == 1) ? true : false;

	/* find next available gpii to use */
	gpii = gpi_find_avail_gpii(gpi_dev, seid);
	gpii = gpi_find_avail_gpii(gpi_dev, seid, static_gpii);
	if (gpii < 0) {
		GPI_ERR(gpi_dev, "no available gpii instances\n");
		return NULL;
@@ -2859,7 +2866,7 @@ static struct dma_chan *gpi_of_dma_xlate(struct of_phandle_args *args,
	gpii_chan->seid = seid;
	gpii_chan->protocol = args->args[2];
	gpii_chan->req_tres = args->args[3];
	gpii_chan->priority = args->args[4];
	gpii_chan->priority = args->args[4] & GPI_EV_PRIORITY_BMSK;

	GPI_LOG(gpi_dev,
		"client req. gpii:%u chid:%u #_tre:%u priority:%u protocol:%u\n",
@@ -2897,7 +2904,8 @@ static void gpi_setup_debug(struct gpi_dev *gpi_dev)
	for (i = 0; i < gpi_dev->max_gpii; i++) {
		struct gpii *gpii;

		if (!((1 << i) & gpi_dev->gpii_mask))
		if (!(((1 << i) & gpi_dev->gpii_mask)  ||
				((1 << i) & gpi_dev->static_gpii_mask)))
			continue;

		gpii = &gpi_dev->gpiis[i];
@@ -2969,6 +2977,11 @@ static int gpi_probe(struct platform_device *pdev)
		return ret;
	}

	ret = of_property_read_u32(gpi_dev->dev->of_node,
		"qcom,static-gpii-mask", &gpi_dev->static_gpii_mask);
	if (!ret)
		GPI_LOG(gpi_dev, "static GPII usecase\n");

	ret = of_property_read_u32(gpi_dev->dev->of_node,
					"qcom,gpi-ee-offset", &gpi_ee_offset);
	if (ret)
@@ -3011,7 +3024,8 @@ static int gpi_probe(struct platform_device *pdev)
		struct gpii *gpii = &gpi_dev->gpiis[i];
		int chan;

		if (!((1 << i) & gpi_dev->gpii_mask))
		if (!(((1 << i) & gpi_dev->gpii_mask)  ||
				((1 << i) & gpi_dev->static_gpii_mask)))
			continue;

		/* set up ev cntxt register map */
@@ -3139,7 +3153,8 @@ static int gpi_remove(struct platform_device *pdev)
		struct gpii *gpii = &gpi_dev->gpiis[i];
		int chan;

		if (!((1 << i) & gpi_dev->gpii_mask))
		if (!(((1 << i) & gpi_dev->gpii_mask)  ||
				((1 << i) & gpi_dev->static_gpii_mask)))
			continue;

		for (chan = 0; chan < MAX_CHANNELS_PER_GPII; chan++) {
+5 −0
Original line number Diff line number Diff line
@@ -179,6 +179,11 @@ enum msm_gpi_tre_type {
#define MSM_GPI_RING_PHYS_ADDR_UPPER(ptr) 0
#endif

/* Static GPII */
#define STATIC_GPII_BMSK (0x2)
#define STATIC_GPII_SHFT (0x1)
#define GPI_EV_PRIORITY_BMSK (0x1)

/* cmds to perform by using dmaengine_slave_config() */
enum msm_gpi_ctrl_cmd {
	MSM_GPI_INIT,