diff options
Diffstat (limited to 'drivers/dma/edma.c')
-rw-r--r-- | drivers/dma/edma.c | 53 |
1 files changed, 35 insertions, 18 deletions
diff --git a/drivers/dma/edma.c b/drivers/dma/edma.c index 0675e268d577..16fe773fb846 100644 --- a/drivers/dma/edma.c +++ b/drivers/dma/edma.c | |||
@@ -1752,16 +1752,14 @@ static enum dma_status edma_tx_status(struct dma_chan *chan, | |||
1752 | return ret; | 1752 | return ret; |
1753 | } | 1753 | } |
1754 | 1754 | ||
1755 | static bool edma_is_memcpy_channel(int ch_num, u16 *memcpy_channels) | 1755 | static bool edma_is_memcpy_channel(int ch_num, s32 *memcpy_channels) |
1756 | { | 1756 | { |
1757 | s16 *memcpy_ch = memcpy_channels; | ||
1758 | |||
1759 | if (!memcpy_channels) | 1757 | if (!memcpy_channels) |
1760 | return false; | 1758 | return false; |
1761 | while (*memcpy_ch != -1) { | 1759 | while (*memcpy_channels != -1) { |
1762 | if (*memcpy_ch == ch_num) | 1760 | if (*memcpy_channels == ch_num) |
1763 | return true; | 1761 | return true; |
1764 | memcpy_ch++; | 1762 | memcpy_channels++; |
1765 | } | 1763 | } |
1766 | return false; | 1764 | return false; |
1767 | } | 1765 | } |
@@ -1775,7 +1773,7 @@ static void edma_dma_init(struct edma_cc *ecc, bool legacy_mode) | |||
1775 | { | 1773 | { |
1776 | struct dma_device *s_ddev = &ecc->dma_slave; | 1774 | struct dma_device *s_ddev = &ecc->dma_slave; |
1777 | struct dma_device *m_ddev = NULL; | 1775 | struct dma_device *m_ddev = NULL; |
1778 | s16 *memcpy_channels = ecc->info->memcpy_channels; | 1776 | s32 *memcpy_channels = ecc->info->memcpy_channels; |
1779 | int i, j; | 1777 | int i, j; |
1780 | 1778 | ||
1781 | dma_cap_zero(s_ddev->cap_mask); | 1779 | dma_cap_zero(s_ddev->cap_mask); |
@@ -1996,16 +1994,16 @@ static struct edma_soc_info *edma_setup_info_from_dt(struct device *dev, | |||
1996 | prop = of_find_property(dev->of_node, "ti,edma-memcpy-channels", &sz); | 1994 | prop = of_find_property(dev->of_node, "ti,edma-memcpy-channels", &sz); |
1997 | if (prop) { | 1995 | if (prop) { |
1998 | const char pname[] = "ti,edma-memcpy-channels"; | 1996 | const char pname[] = "ti,edma-memcpy-channels"; |
1999 | size_t nelm = sz / sizeof(s16); | 1997 | size_t nelm = sz / sizeof(s32); |
2000 | s16 *memcpy_ch; | 1998 | s32 *memcpy_ch; |
2001 | 1999 | ||
2002 | memcpy_ch = devm_kcalloc(dev, nelm + 1, sizeof(s16), | 2000 | memcpy_ch = devm_kcalloc(dev, nelm + 1, sizeof(s32), |
2003 | GFP_KERNEL); | 2001 | GFP_KERNEL); |
2004 | if (!memcpy_ch) | 2002 | if (!memcpy_ch) |
2005 | return ERR_PTR(-ENOMEM); | 2003 | return ERR_PTR(-ENOMEM); |
2006 | 2004 | ||
2007 | ret = of_property_read_u16_array(dev->of_node, pname, | 2005 | ret = of_property_read_u32_array(dev->of_node, pname, |
2008 | (u16 *)memcpy_ch, nelm); | 2006 | (u32 *)memcpy_ch, nelm); |
2009 | if (ret) | 2007 | if (ret) |
2010 | return ERR_PTR(ret); | 2008 | return ERR_PTR(ret); |
2011 | 2009 | ||
@@ -2017,31 +2015,50 @@ static struct edma_soc_info *edma_setup_info_from_dt(struct device *dev, | |||
2017 | &sz); | 2015 | &sz); |
2018 | if (prop) { | 2016 | if (prop) { |
2019 | const char pname[] = "ti,edma-reserved-slot-ranges"; | 2017 | const char pname[] = "ti,edma-reserved-slot-ranges"; |
2018 | u32 (*tmp)[2]; | ||
2020 | s16 (*rsv_slots)[2]; | 2019 | s16 (*rsv_slots)[2]; |
2021 | size_t nelm = sz / sizeof(*rsv_slots); | 2020 | size_t nelm = sz / sizeof(*tmp); |
2022 | struct edma_rsv_info *rsv_info; | 2021 | struct edma_rsv_info *rsv_info; |
2022 | int i; | ||
2023 | 2023 | ||
2024 | if (!nelm) | 2024 | if (!nelm) |
2025 | return info; | 2025 | return info; |
2026 | 2026 | ||
2027 | tmp = kcalloc(nelm, sizeof(*tmp), GFP_KERNEL); | ||
2028 | if (!tmp) | ||
2029 | return ERR_PTR(-ENOMEM); | ||
2030 | |||
2027 | rsv_info = devm_kzalloc(dev, sizeof(*rsv_info), GFP_KERNEL); | 2031 | rsv_info = devm_kzalloc(dev, sizeof(*rsv_info), GFP_KERNEL); |
2028 | if (!rsv_info) | 2032 | if (!rsv_info) { |
2033 | kfree(tmp); | ||
2029 | return ERR_PTR(-ENOMEM); | 2034 | return ERR_PTR(-ENOMEM); |
2035 | } | ||
2030 | 2036 | ||
2031 | rsv_slots = devm_kcalloc(dev, nelm + 1, sizeof(*rsv_slots), | 2037 | rsv_slots = devm_kcalloc(dev, nelm + 1, sizeof(*rsv_slots), |
2032 | GFP_KERNEL); | 2038 | GFP_KERNEL); |
2033 | if (!rsv_slots) | 2039 | if (!rsv_slots) { |
2040 | kfree(tmp); | ||
2034 | return ERR_PTR(-ENOMEM); | 2041 | return ERR_PTR(-ENOMEM); |
2042 | } | ||
2035 | 2043 | ||
2036 | ret = of_property_read_u16_array(dev->of_node, pname, | 2044 | ret = of_property_read_u32_array(dev->of_node, pname, |
2037 | (u16 *)rsv_slots, nelm * 2); | 2045 | (u32 *)tmp, nelm * 2); |
2038 | if (ret) | 2046 | if (ret) { |
2047 | kfree(tmp); | ||
2039 | return ERR_PTR(ret); | 2048 | return ERR_PTR(ret); |
2049 | } | ||
2040 | 2050 | ||
2051 | for (i = 0; i < nelm; i++) { | ||
2052 | rsv_slots[i][0] = tmp[i][0]; | ||
2053 | rsv_slots[i][1] = tmp[i][1]; | ||
2054 | } | ||
2041 | rsv_slots[nelm][0] = -1; | 2055 | rsv_slots[nelm][0] = -1; |
2042 | rsv_slots[nelm][1] = -1; | 2056 | rsv_slots[nelm][1] = -1; |
2057 | |||
2043 | info->rsv = rsv_info; | 2058 | info->rsv = rsv_info; |
2044 | info->rsv->rsv_slots = (const s16 (*)[2])rsv_slots; | 2059 | info->rsv->rsv_slots = (const s16 (*)[2])rsv_slots; |
2060 | |||
2061 | kfree(tmp); | ||
2045 | } | 2062 | } |
2046 | 2063 | ||
2047 | return info; | 2064 | return info; |