Commit 7741fa19 authored by Olof Johansson's avatar Olof Johansson

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 next/drivers

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
parents 75d6bc5f cf7eb979
...@@ -29,6 +29,6 @@ edma: edma@49000000 { ...@@ -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>;
}; };
...@@ -144,7 +144,7 @@ edma: edma@49000000 { ...@@ -144,7 +144,7 @@ edma: edma@49000000 {
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>;
......
...@@ -1423,55 +1423,38 @@ EXPORT_SYMBOL(edma_clear_event); ...@@ -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, ...@@ -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;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment