Commit 47db92f4 authored by Gerald Baeza's avatar Gerald Baeza Committed by Fabio Baltieri

dmaengine: ste_dma40: physical channels number correction

DMAC_ICFG[0:2]=SCHNB only allows to count 'multiple of 4' physical
channels so it was ok with platforms having 8 channels but cannot be
used for next versions (with 10 or 14 channels).  This patch allows to
provide the number of physical channels for a DMA device via
platform_data, or still rely on SCHNB if platform_data announces 0
channel.
Signed-off-by: default avatarGerald Baeza <gerald.baeza@stericsson.com>
Reviewed-by: default avatarPer Forlin <per.forlin@stericsson.com>
Acked-by: default avatarLinus Walleij <linus.walleij@linaro.org>
Acked-by: default avatarVinod Koul <vinod.koul@intel.com>
Signed-off-by: default avatarFabio Baltieri <fabio.baltieri@linaro.org>
parent f000df8c
...@@ -3004,14 +3004,21 @@ static struct d40_base * __init d40_hw_detect_init(struct platform_device *pdev) ...@@ -3004,14 +3004,21 @@ static struct d40_base * __init d40_hw_detect_init(struct platform_device *pdev)
* ? has revision 1 * ? has revision 1
* DB8500v1 has revision 2 * DB8500v1 has revision 2
* DB8500v2 has revision 3 * DB8500v2 has revision 3
* AP9540v1 has revision 4
* DB8540v1 has revision 4
*/ */
rev = AMBA_REV_BITS(pid); rev = AMBA_REV_BITS(pid);
plat_data = pdev->dev.platform_data;
/* The number of physical channels on this HW */ /* The number of physical channels on this HW */
num_phy_chans = 4 * (readl(virtbase + D40_DREG_ICFG) & 0x7) + 4; if (plat_data->num_of_phy_chans)
num_phy_chans = plat_data->num_of_phy_chans;
else
num_phy_chans = 4 * (readl(virtbase + D40_DREG_ICFG) & 0x7) + 4;
dev_info(&pdev->dev, "hardware revision: %d @ 0x%x\n", dev_info(&pdev->dev, "hardware revision: %d @ 0x%x with %d physical channels\n",
rev, res->start); rev, res->start, num_phy_chans);
if (rev < 2) { if (rev < 2) {
d40_err(&pdev->dev, "hardware revision: %d is not supported", d40_err(&pdev->dev, "hardware revision: %d is not supported",
...@@ -3019,8 +3026,6 @@ static struct d40_base * __init d40_hw_detect_init(struct platform_device *pdev) ...@@ -3019,8 +3026,6 @@ static struct d40_base * __init d40_hw_detect_init(struct platform_device *pdev)
goto failure; goto failure;
} }
plat_data = pdev->dev.platform_data;
/* Count the number of logical channels in use */ /* Count the number of logical channels in use */
for (i = 0; i < plat_data->dev_len; i++) for (i = 0; i < plat_data->dev_len; i++)
if (plat_data->dev_rx[i] != 0) if (plat_data->dev_rx[i] != 0)
......
...@@ -147,6 +147,9 @@ struct stedma40_chan_cfg { ...@@ -147,6 +147,9 @@ struct stedma40_chan_cfg {
* @memcpy_conf_log: default configuration of logical channel memcpy * @memcpy_conf_log: default configuration of logical channel memcpy
* @disabled_channels: A vector, ending with -1, that marks physical channels * @disabled_channels: A vector, ending with -1, that marks physical channels
* that are for different reasons not available for the driver. * that are for different reasons not available for the driver.
* @num_of_phy_chans: The number of physical channels implemented in HW.
* 0 means reading the number of channels from DMA HW but this is only valid
* for 'multiple of 4' channels, like 8.
*/ */
struct stedma40_platform_data { struct stedma40_platform_data {
u32 dev_len; u32 dev_len;
...@@ -158,6 +161,7 @@ struct stedma40_platform_data { ...@@ -158,6 +161,7 @@ struct stedma40_platform_data {
struct stedma40_chan_cfg *memcpy_conf_log; struct stedma40_chan_cfg *memcpy_conf_log;
int disabled_channels[STEDMA40_MAX_PHYS]; int disabled_channels[STEDMA40_MAX_PHYS];
bool use_esram_lcla; bool use_esram_lcla;
int num_of_phy_chans;
}; };
#ifdef CONFIG_STE_DMA40 #ifdef CONFIG_STE_DMA40
......
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