diff options
-rw-r--r-- | Documentation/devicetree/bindings/dma/ti-edma.txt | 5 | ||||
-rw-r--r-- | drivers/dma/edma.c | 31 |
2 files changed, 27 insertions, 9 deletions
diff --git a/Documentation/devicetree/bindings/dma/ti-edma.txt b/Documentation/devicetree/bindings/dma/ti-edma.txt index ae8b8f1d6e69..079b42a81d7c 100644 --- a/Documentation/devicetree/bindings/dma/ti-edma.txt +++ b/Documentation/devicetree/bindings/dma/ti-edma.txt | |||
@@ -56,9 +56,8 @@ edma: edma@49000000 { | |||
56 | 56 | ||
57 | /* Channel 20 and 21 is allocated for memcpy */ | 57 | /* Channel 20 and 21 is allocated for memcpy */ |
58 | ti,edma-memcpy-channels = <20 21>; | 58 | ti,edma-memcpy-channels = <20 21>; |
59 | /* The following PaRAM slots are reserved: 35-45 and 100-110 */ | 59 | /* The following PaRAM slots are reserved: 35-44 and 100-109 */ |
60 | ti,edma-reserved-slot-ranges = /bits/ 16 <35 10>, | 60 | ti,edma-reserved-slot-ranges = <35 10>, <100 10>; |
61 | /bits/ 16 <100 10>; | ||
62 | }; | 61 | }; |
63 | 62 | ||
64 | edma_tptc0: tptc@49800000 { | 63 | edma_tptc0: tptc@49800000 { |
diff --git a/drivers/dma/edma.c b/drivers/dma/edma.c index 3da20291db56..ee3091c45c95 100644 --- a/drivers/dma/edma.c +++ b/drivers/dma/edma.c | |||
@@ -2015,31 +2015,50 @@ static struct edma_soc_info *edma_setup_info_from_dt(struct device *dev, | |||
2015 | &sz); | 2015 | &sz); |
2016 | if (prop) { | 2016 | if (prop) { |
2017 | const char pname[] = "ti,edma-reserved-slot-ranges"; | 2017 | const char pname[] = "ti,edma-reserved-slot-ranges"; |
2018 | u32 (*tmp)[2]; | ||
2018 | s16 (*rsv_slots)[2]; | 2019 | s16 (*rsv_slots)[2]; |
2019 | size_t nelm = sz / sizeof(*rsv_slots); | 2020 | size_t nelm = sz / sizeof(*tmp); |
2020 | struct edma_rsv_info *rsv_info; | 2021 | struct edma_rsv_info *rsv_info; |
2022 | int i; | ||
2021 | 2023 | ||
2022 | if (!nelm) | 2024 | if (!nelm) |
2023 | return info; | 2025 | return info; |
2024 | 2026 | ||
2027 | tmp = kcalloc(nelm, sizeof(*tmp), GFP_KERNEL); | ||
2028 | if (!tmp) | ||
2029 | return ERR_PTR(-ENOMEM); | ||
2030 | |||
2025 | rsv_info = devm_kzalloc(dev, sizeof(*rsv_info), GFP_KERNEL); | 2031 | rsv_info = devm_kzalloc(dev, sizeof(*rsv_info), GFP_KERNEL); |
2026 | if (!rsv_info) | 2032 | if (!rsv_info) { |
2033 | kfree(tmp); | ||
2027 | return ERR_PTR(-ENOMEM); | 2034 | return ERR_PTR(-ENOMEM); |
2035 | } | ||
2028 | 2036 | ||
2029 | rsv_slots = devm_kcalloc(dev, nelm + 1, sizeof(*rsv_slots), | 2037 | rsv_slots = devm_kcalloc(dev, nelm + 1, sizeof(*rsv_slots), |
2030 | GFP_KERNEL); | 2038 | GFP_KERNEL); |
2031 | if (!rsv_slots) | 2039 | if (!rsv_slots) { |
2040 | kfree(tmp); | ||
2032 | return ERR_PTR(-ENOMEM); | 2041 | return ERR_PTR(-ENOMEM); |
2042 | } | ||
2033 | 2043 | ||
2034 | ret = of_property_read_u16_array(dev->of_node, pname, | 2044 | ret = of_property_read_u32_array(dev->of_node, pname, |
2035 | (u16 *)rsv_slots, nelm * 2); | 2045 | (u32 *)tmp, nelm * 2); |
2036 | if (ret) | 2046 | if (ret) { |
2047 | kfree(tmp); | ||
2037 | return ERR_PTR(ret); | 2048 | return ERR_PTR(ret); |
2049 | } | ||
2038 | 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 | } | ||
2039 | rsv_slots[nelm][0] = -1; | 2055 | rsv_slots[nelm][0] = -1; |
2040 | rsv_slots[nelm][1] = -1; | 2056 | rsv_slots[nelm][1] = -1; |
2057 | |||
2041 | info->rsv = rsv_info; | 2058 | info->rsv = rsv_info; |
2042 | info->rsv->rsv_slots = (const s16 (*)[2])rsv_slots; | 2059 | info->rsv->rsv_slots = (const s16 (*)[2])rsv_slots; |
2060 | |||
2061 | kfree(tmp); | ||
2043 | } | 2062 | } |
2044 | 2063 | ||
2045 | return info; | 2064 | return info; |