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

Commit 3b27dcec authored by Olof Johansson's avatar Olof Johansson
Browse files

Merge tag 'davinci-fixes-for-v3.15-rc4' of...

Merge tag 'davinci-fixes-for-v3.15-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/nsekhar/linux-davinci into fixes

Pull "DaVinci fixes for v3.15" from Sekhar Nori:

The patch fixes EDMA crossbar mapping to actually
make it work. The patch has been tagged for stable.

* tag 'davinci-fixes-for-v3.15-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/nsekhar/linux-davinci

:
  ARM: common: edma: Fix xbar mapping

Signed-off-by: default avatarOlof Johansson <olof@lixom.net>
parents 6a7c7b00 cf7eb979
Loading
Loading
Loading
Loading
+2 −2
Original line number Original line Diff line number Diff line
@@ -29,6 +29,6 @@ edma: edma@49000000 {
	dma-channels = <64>;
	dma-channels = <64>;
	ti,edma-regions = <4>;
	ti,edma-regions = <4>;
	ti,edma-slots = <256>;
	ti,edma-slots = <256>;
	ti,edma-xbar-event-map = <1 12
	ti,edma-xbar-event-map = /bits/ 16 <1 12
					    2 13>;
					    2 13>;
};
};
+1 −1
Original line number Original line Diff line number Diff line
@@ -144,7 +144,7 @@
			compatible = "ti,edma3";
			compatible = "ti,edma3";
			ti,hwmods = "tpcc", "tptc0", "tptc1", "tptc2";
			ti,hwmods = "tpcc", "tptc0", "tptc1", "tptc2";
			reg =	<0x49000000 0x10000>,
			reg =	<0x49000000 0x10000>,
				<0x44e10f90 0x10>;
				<0x44e10f90 0x40>;
			interrupts = <12 13 14>;
			interrupts = <12 13 14>;
			#dma-cells = <1>;
			#dma-cells = <1>;
			dma-channels = <64>;
			dma-channels = <64>;
+15 −33
Original line number Original line Diff line number Diff line
@@ -1423,55 +1423,38 @@ EXPORT_SYMBOL(edma_clear_event);


#if IS_ENABLED(CONFIG_OF) && IS_ENABLED(CONFIG_DMADEVICES)
#if IS_ENABLED(CONFIG_OF) && IS_ENABLED(CONFIG_DMADEVICES)


static int edma_of_read_u32_to_s16_array(const struct device_node *np,
static int edma_xbar_event_map(struct device *dev, struct device_node *node,
					 const char *propname, s16 *out_values,
			       struct edma_soc_info *pdata, size_t sz)
					 size_t sz)
{
{
	int ret;
	const char pname[] = "ti,edma-xbar-event-map";

	ret = of_property_read_u16_array(np, propname, out_values, sz);
	if (ret)
		return ret;

	/* Terminate it */
	*out_values++ = -1;
	*out_values++ = -1;

	return 0;
}

static int edma_xbar_event_map(struct device *dev,
			       struct device_node *node,
			       struct edma_soc_info *pdata, int len)
{
	int ret, i;
	struct resource res;
	struct resource res;
	void __iomem *xbar;
	void __iomem *xbar;
	const s16 (*xbar_chans)[2];
	s16 (*xbar_chans)[2];
	size_t nelm = sz / sizeof(s16);
	u32 shift, offset, mux;
	u32 shift, offset, mux;
	int ret, i;


	xbar_chans = devm_kzalloc(dev,
	xbar_chans = devm_kzalloc(dev, (nelm + 2) * sizeof(s16), GFP_KERNEL);
				  len/sizeof(s16) + 2*sizeof(s16),
				  GFP_KERNEL);
	if (!xbar_chans)
	if (!xbar_chans)
		return -ENOMEM;
		return -ENOMEM;


	ret = of_address_to_resource(node, 1, &res);
	ret = of_address_to_resource(node, 1, &res);
	if (ret)
	if (ret)
		return -EIO;
		return -ENOMEM;


	xbar = devm_ioremap(dev, res.start, resource_size(&res));
	xbar = devm_ioremap(dev, res.start, resource_size(&res));
	if (!xbar)
	if (!xbar)
		return -ENOMEM;
		return -ENOMEM;


	ret = edma_of_read_u32_to_s16_array(node,
	ret = of_property_read_u16_array(node, pname, (u16 *)xbar_chans, nelm);
					    "ti,edma-xbar-event-map",
					    (s16 *)xbar_chans,
					    len/sizeof(u32));
	if (ret)
	if (ret)
		return -EIO;
		return -EIO;


	for (i = 0; xbar_chans[i][0] != -1; i++) {
	/* Invalidate last entry for the other user of this mess */
	nelm >>= 1;
	xbar_chans[nelm][0] = xbar_chans[nelm][1] = -1;

	for (i = 0; i < nelm; i++) {
		shift = (xbar_chans[i][1] & 0x03) << 3;
		shift = (xbar_chans[i][1] & 0x03) << 3;
		offset = xbar_chans[i][1] & 0xfffffffc;
		offset = xbar_chans[i][1] & 0xfffffffc;
		mux = readl(xbar + offset);
		mux = readl(xbar + offset);
@@ -1480,8 +1463,7 @@ static int edma_xbar_event_map(struct device *dev,
		writel(mux, (xbar + offset));
		writel(mux, (xbar + offset));
	}
	}


	pdata->xbar_chans = xbar_chans;
	pdata->xbar_chans = (const s16 (*)[2]) xbar_chans;

	return 0;
	return 0;
}
}