Hi Fabrice,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on pwm/for-next]
[also build test WARNING on v4.17-rc1 next-20180416]
[cannot apply to ljones-mfd/for-mfd-next]
[if your patch is applied to the wrong git tree, please drop us a note to help 
improve the system]

url:    
https://github.com/0day-ci/linux/commits/Fabrice-Gasnier/Add-support-for-PWM-input-capture-on-STM32/20180417-052347
base:   
https://git.kernel.org/pub/scm/linux/kernel/git/thierry.reding/linux-pwm.git 
for-next

smatch warnings:
drivers/mfd/stm32-timers.c:165 stm32_timers_dma_burst_read() warn: warn: 
dma_mapping_error() doesn't return an error code

# 
https://github.com/0day-ci/linux/commit/402362a100e6b02b807fbebdc05b7159b565ffa5
git remote add linux-review https://github.com/0day-ci/linux
git remote update linux-review
git checkout 402362a100e6b02b807fbebdc05b7159b565ffa5
vim +165 drivers/mfd/stm32-timers.c

402362a1 Fabrice Gasnier 2018-04-16   54  
402362a1 Fabrice Gasnier 2018-04-16   55  /**
402362a1 Fabrice Gasnier 2018-04-16   56   * stm32_timers_dma_burst_read - Read 
from timers registers using DMA.
402362a1 Fabrice Gasnier 2018-04-16   57   *
402362a1 Fabrice Gasnier 2018-04-16   58   * Read from STM32 timers registers 
using DMA on a single event.
402362a1 Fabrice Gasnier 2018-04-16   59   * @dev: reference to stm32_timers 
MFD device
402362a1 Fabrice Gasnier 2018-04-16   60   * @buf: DMA'able destination buffer
402362a1 Fabrice Gasnier 2018-04-16   61   * @id: stm32_timers_dmas event 
identifier (ch[1..4], up, trig or com)
402362a1 Fabrice Gasnier 2018-04-16   62   * @reg: registers start offset for 
DMA to read from (like CCRx for capture)
402362a1 Fabrice Gasnier 2018-04-16   63   * @num_reg: number of registers to 
read upon each DMA request, starting @reg.
402362a1 Fabrice Gasnier 2018-04-16   64   * @bursts: number of bursts to read 
(e.g. like two for pwm period capture)
402362a1 Fabrice Gasnier 2018-04-16   65   * @tmo_ms: timeout (milliseconds)
402362a1 Fabrice Gasnier 2018-04-16   66   */
402362a1 Fabrice Gasnier 2018-04-16   67  int 
stm32_timers_dma_burst_read(struct device *dev, u32 *buf,
402362a1 Fabrice Gasnier 2018-04-16   68                                enum 
stm32_timers_dmas id, u32 reg,
402362a1 Fabrice Gasnier 2018-04-16   69                                
unsigned int num_reg, unsigned int bursts,
402362a1 Fabrice Gasnier 2018-04-16   70                                
unsigned long tmo_ms)
402362a1 Fabrice Gasnier 2018-04-16   71  {
402362a1 Fabrice Gasnier 2018-04-16   72        struct stm32_timers *ddata = 
dev_get_drvdata(dev);
402362a1 Fabrice Gasnier 2018-04-16   73        unsigned long timeout = 
msecs_to_jiffies(tmo_ms);
402362a1 Fabrice Gasnier 2018-04-16   74        struct regmap *regmap = 
ddata->regmap;
402362a1 Fabrice Gasnier 2018-04-16   75        struct stm32_timers_dma *dma = 
ddata->dma;
402362a1 Fabrice Gasnier 2018-04-16   76        size_t len = num_reg * bursts * 
sizeof(u32);
402362a1 Fabrice Gasnier 2018-04-16   77        struct dma_async_tx_descriptor 
*desc;
402362a1 Fabrice Gasnier 2018-04-16   78        struct dma_slave_config config;
402362a1 Fabrice Gasnier 2018-04-16   79        dma_cookie_t cookie;
402362a1 Fabrice Gasnier 2018-04-16   80        dma_addr_t dma_buf;
402362a1 Fabrice Gasnier 2018-04-16   81        u32 dbl, dba;
402362a1 Fabrice Gasnier 2018-04-16   82        long err;
402362a1 Fabrice Gasnier 2018-04-16   83        int ret;
402362a1 Fabrice Gasnier 2018-04-16   84  
402362a1 Fabrice Gasnier 2018-04-16   85        /* Sanity check */
402362a1 Fabrice Gasnier 2018-04-16   86        if (id < STM32_TIMERS_DMA_CH1 
|| id >= STM32_TIMERS_MAX_DMAS)
402362a1 Fabrice Gasnier 2018-04-16   87                return -EINVAL;
402362a1 Fabrice Gasnier 2018-04-16   88  
402362a1 Fabrice Gasnier 2018-04-16   89        if (!num_reg || !bursts || reg 
> STM32_TIMERS_MAX_REGISTERS ||
402362a1 Fabrice Gasnier 2018-04-16   90            (reg + num_reg * 
sizeof(u32)) > STM32_TIMERS_MAX_REGISTERS)
402362a1 Fabrice Gasnier 2018-04-16   91                return -EINVAL;
402362a1 Fabrice Gasnier 2018-04-16   92  
402362a1 Fabrice Gasnier 2018-04-16   93        if (!dma->chans[id])
402362a1 Fabrice Gasnier 2018-04-16   94                return -ENODEV;
402362a1 Fabrice Gasnier 2018-04-16   95        mutex_lock(&dma->lock);
402362a1 Fabrice Gasnier 2018-04-16   96  
402362a1 Fabrice Gasnier 2018-04-16   97        /* Select DMA channel in use */
402362a1 Fabrice Gasnier 2018-04-16   98        dma->chan = dma->chans[id];
402362a1 Fabrice Gasnier 2018-04-16   99        dma_buf = dma_map_single(dev, 
buf, len, DMA_FROM_DEVICE);
402362a1 Fabrice Gasnier 2018-04-16  100        ret = dma_mapping_error(dev, 
dma_buf);
                                                
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
This should be:

        if (dma_mapping_error(dev, dma_buf)) {
                ret = -ENOMEM;
                goto unlock;
        }

402362a1 Fabrice Gasnier 2018-04-16  101        if (ret)
402362a1 Fabrice Gasnier 2018-04-16  102                goto unlock;
402362a1 Fabrice Gasnier 2018-04-16  103  
402362a1 Fabrice Gasnier 2018-04-16  104        /* Prepare DMA read from timer 
registers, using DMA burst mode */
402362a1 Fabrice Gasnier 2018-04-16  105        memset(&config, 0, 
sizeof(config));
402362a1 Fabrice Gasnier 2018-04-16  106        config.src_addr = 
(dma_addr_t)dma->phys_base + TIM_DMAR;
402362a1 Fabrice Gasnier 2018-04-16  107        config.src_addr_width = 
DMA_SLAVE_BUSWIDTH_4_BYTES;
402362a1 Fabrice Gasnier 2018-04-16  108        ret = 
dmaengine_slave_config(dma->chan, &config);
402362a1 Fabrice Gasnier 2018-04-16  109        if (ret)
402362a1 Fabrice Gasnier 2018-04-16  110                goto unmap;
402362a1 Fabrice Gasnier 2018-04-16  111  
402362a1 Fabrice Gasnier 2018-04-16  112        desc = 
dmaengine_prep_slave_single(dma->chan, dma_buf, len,
402362a1 Fabrice Gasnier 2018-04-16  113                                        
   DMA_DEV_TO_MEM, DMA_PREP_INTERRUPT);
402362a1 Fabrice Gasnier 2018-04-16  114        if (!desc) {
402362a1 Fabrice Gasnier 2018-04-16  115                ret = -EBUSY;
402362a1 Fabrice Gasnier 2018-04-16  116                goto unmap;
402362a1 Fabrice Gasnier 2018-04-16  117        }
402362a1 Fabrice Gasnier 2018-04-16  118  
402362a1 Fabrice Gasnier 2018-04-16  119        desc->callback = 
stm32_timers_dma_done;
402362a1 Fabrice Gasnier 2018-04-16  120        desc->callback_param = dma;
402362a1 Fabrice Gasnier 2018-04-16  121        cookie = dmaengine_submit(desc);
402362a1 Fabrice Gasnier 2018-04-16  122        ret = dma_submit_error(cookie);
402362a1 Fabrice Gasnier 2018-04-16  123        if (ret)
402362a1 Fabrice Gasnier 2018-04-16  124                goto dma_term;
402362a1 Fabrice Gasnier 2018-04-16  125  
402362a1 Fabrice Gasnier 2018-04-16  126        
reinit_completion(&dma->completion);
402362a1 Fabrice Gasnier 2018-04-16  127        
dma_async_issue_pending(dma->chan);
402362a1 Fabrice Gasnier 2018-04-16  128  
402362a1 Fabrice Gasnier 2018-04-16  129        /* Setup and enable timer DMA 
burst mode */
402362a1 Fabrice Gasnier 2018-04-16  130        dbl = FIELD_PREP(TIM_DCR_DBL, 
bursts - 1);
402362a1 Fabrice Gasnier 2018-04-16  131        dba = FIELD_PREP(TIM_DCR_DBA, 
reg >> 2);
402362a1 Fabrice Gasnier 2018-04-16  132        ret = regmap_write(regmap, 
TIM_DCR, dbl | dba);
402362a1 Fabrice Gasnier 2018-04-16  133        if (ret)
402362a1 Fabrice Gasnier 2018-04-16  134                goto dma_term;
402362a1 Fabrice Gasnier 2018-04-16  135  
402362a1 Fabrice Gasnier 2018-04-16  136        /* Clear pending flags before 
enabling DMA request */
402362a1 Fabrice Gasnier 2018-04-16  137        ret = regmap_write(regmap, 
TIM_SR, 0);
402362a1 Fabrice Gasnier 2018-04-16  138        if (ret)
402362a1 Fabrice Gasnier 2018-04-16  139                goto dcr_clr;
402362a1 Fabrice Gasnier 2018-04-16  140  
402362a1 Fabrice Gasnier 2018-04-16  141        ret = 
regmap_update_bits(regmap, TIM_DIER, stm32_timers_dier_dmaen[id],
402362a1 Fabrice Gasnier 2018-04-16  142                                 
stm32_timers_dier_dmaen[id]);
402362a1 Fabrice Gasnier 2018-04-16  143        if (ret)
402362a1 Fabrice Gasnier 2018-04-16  144                goto dcr_clr;
402362a1 Fabrice Gasnier 2018-04-16  145  
402362a1 Fabrice Gasnier 2018-04-16  146        err = 
wait_for_completion_interruptible_timeout(&dma->completion,
402362a1 Fabrice Gasnier 2018-04-16  147                                        
                timeout);
402362a1 Fabrice Gasnier 2018-04-16  148        if (err == 0)
402362a1 Fabrice Gasnier 2018-04-16  149                ret = -ETIMEDOUT;
402362a1 Fabrice Gasnier 2018-04-16  150        else if (err < 0)
402362a1 Fabrice Gasnier 2018-04-16  151                ret = err;
402362a1 Fabrice Gasnier 2018-04-16  152  
402362a1 Fabrice Gasnier 2018-04-16  153        regmap_update_bits(regmap, 
TIM_DIER, stm32_timers_dier_dmaen[id], 0);
402362a1 Fabrice Gasnier 2018-04-16  154        regmap_write(regmap, TIM_SR, 0);
402362a1 Fabrice Gasnier 2018-04-16  155  dcr_clr:
402362a1 Fabrice Gasnier 2018-04-16  156        regmap_write(regmap, TIM_DCR, 
0);
402362a1 Fabrice Gasnier 2018-04-16  157  dma_term:
402362a1 Fabrice Gasnier 2018-04-16  158        
dmaengine_terminate_all(dma->chan);
402362a1 Fabrice Gasnier 2018-04-16  159  unmap:
402362a1 Fabrice Gasnier 2018-04-16  160        dma_unmap_single(dev, dma_buf, 
len, DMA_FROM_DEVICE);
402362a1 Fabrice Gasnier 2018-04-16  161  unlock:
402362a1 Fabrice Gasnier 2018-04-16  162        dma->chan = NULL;
402362a1 Fabrice Gasnier 2018-04-16  163        mutex_unlock(&dma->lock);
402362a1 Fabrice Gasnier 2018-04-16  164  
402362a1 Fabrice Gasnier 2018-04-16 @165        return ret;
402362a1 Fabrice Gasnier 2018-04-16  166  }
402362a1 Fabrice Gasnier 2018-04-16  167  
EXPORT_SYMBOL_GPL(stm32_timers_dma_burst_read);
402362a1 Fabrice Gasnier 2018-04-16  168  

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

Reply via email to