Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

mfd: stm32-timers: Use dma_request_chan() instead dma_request_slave_channel()

dma_request_slave_channel() is a wrapper on top of dma_request_chan()
eating up the error code.

By using dma_request_chan() directly the driver can support deferred
probing against DMA.

Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
Acked-by: Fabrice Gasnier <fabrice.gasnier@st.com>
Signed-off-by: Lee Jones <lee.jones@linaro.org>

authored by

Peter Ujfalusi and committed by
Lee Jones
8d7de077 c085c664

+23 -9
+23 -9
drivers/mfd/stm32-timers.c
··· 167 167 regmap_write(ddata->regmap, TIM_ARR, 0x0); 168 168 } 169 169 170 - static void stm32_timers_dma_probe(struct device *dev, 170 + static int stm32_timers_dma_probe(struct device *dev, 171 171 struct stm32_timers *ddata) 172 172 { 173 173 int i; 174 + int ret = 0; 174 175 char name[4]; 175 176 176 177 init_completion(&ddata->dma.completion); ··· 180 179 /* Optional DMA support: get valid DMA channel(s) or NULL */ 181 180 for (i = STM32_TIMERS_DMA_CH1; i <= STM32_TIMERS_DMA_CH4; i++) { 182 181 snprintf(name, ARRAY_SIZE(name), "ch%1d", i + 1); 183 - ddata->dma.chans[i] = dma_request_slave_channel(dev, name); 182 + ddata->dma.chans[i] = dma_request_chan(dev, name); 184 183 } 185 - ddata->dma.chans[STM32_TIMERS_DMA_UP] = 186 - dma_request_slave_channel(dev, "up"); 187 - ddata->dma.chans[STM32_TIMERS_DMA_TRIG] = 188 - dma_request_slave_channel(dev, "trig"); 189 - ddata->dma.chans[STM32_TIMERS_DMA_COM] = 190 - dma_request_slave_channel(dev, "com"); 184 + ddata->dma.chans[STM32_TIMERS_DMA_UP] = dma_request_chan(dev, "up"); 185 + ddata->dma.chans[STM32_TIMERS_DMA_TRIG] = dma_request_chan(dev, "trig"); 186 + ddata->dma.chans[STM32_TIMERS_DMA_COM] = dma_request_chan(dev, "com"); 187 + 188 + for (i = STM32_TIMERS_DMA_CH1; i < STM32_TIMERS_MAX_DMAS; i++) { 189 + if (IS_ERR(ddata->dma.chans[i])) { 190 + /* Save the first error code to return */ 191 + if (PTR_ERR(ddata->dma.chans[i]) != -ENODEV && !ret) 192 + ret = PTR_ERR(ddata->dma.chans[i]); 193 + 194 + ddata->dma.chans[i] = NULL; 195 + } 196 + } 197 + 198 + return ret; 191 199 } 192 200 193 201 static void stm32_timers_dma_remove(struct device *dev, ··· 240 230 241 231 stm32_timers_get_arr_size(ddata); 242 232 243 - stm32_timers_dma_probe(dev, ddata); 233 + ret = stm32_timers_dma_probe(dev, ddata); 234 + if (ret) { 235 + stm32_timers_dma_remove(dev, ddata); 236 + return ret; 237 + } 244 238 245 239 platform_set_drvdata(pdev, ddata); 246 240