0001
0002
0003
0004
0005
0006
0007 #include <linux/bitfield.h>
0008 #include <linux/mfd/stm32-timers.h>
0009 #include <linux/module.h>
0010 #include <linux/of_platform.h>
0011 #include <linux/reset.h>
0012
0013 #define STM32_TIMERS_MAX_REGISTERS 0x3fc
0014
0015
0016 static const u32 stm32_timers_dier_dmaen[STM32_TIMERS_MAX_DMAS] = {
0017 TIM_DIER_CC1DE,
0018 TIM_DIER_CC2DE,
0019 TIM_DIER_CC3DE,
0020 TIM_DIER_CC4DE,
0021 TIM_DIER_UIE,
0022 TIM_DIER_TDE,
0023 TIM_DIER_COMDE
0024 };
0025
0026 static void stm32_timers_dma_done(void *p)
0027 {
0028 struct stm32_timers_dma *dma = p;
0029 struct dma_tx_state state;
0030 enum dma_status status;
0031
0032 status = dmaengine_tx_status(dma->chan, dma->chan->cookie, &state);
0033 if (status == DMA_COMPLETE)
0034 complete(&dma->completion);
0035 }
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049 int stm32_timers_dma_burst_read(struct device *dev, u32 *buf,
0050 enum stm32_timers_dmas id, u32 reg,
0051 unsigned int num_reg, unsigned int bursts,
0052 unsigned long tmo_ms)
0053 {
0054 struct stm32_timers *ddata = dev_get_drvdata(dev);
0055 unsigned long timeout = msecs_to_jiffies(tmo_ms);
0056 struct regmap *regmap = ddata->regmap;
0057 struct stm32_timers_dma *dma = &ddata->dma;
0058 size_t len = num_reg * bursts * sizeof(u32);
0059 struct dma_async_tx_descriptor *desc;
0060 struct dma_slave_config config;
0061 dma_cookie_t cookie;
0062 dma_addr_t dma_buf;
0063 u32 dbl, dba;
0064 long err;
0065 int ret;
0066
0067
0068 if (id < STM32_TIMERS_DMA_CH1 || id >= STM32_TIMERS_MAX_DMAS)
0069 return -EINVAL;
0070
0071 if (!num_reg || !bursts || reg > STM32_TIMERS_MAX_REGISTERS ||
0072 (reg + num_reg * sizeof(u32)) > STM32_TIMERS_MAX_REGISTERS)
0073 return -EINVAL;
0074
0075 if (!dma->chans[id])
0076 return -ENODEV;
0077 mutex_lock(&dma->lock);
0078
0079
0080 dma->chan = dma->chans[id];
0081 dma_buf = dma_map_single(dev, buf, len, DMA_FROM_DEVICE);
0082 if (dma_mapping_error(dev, dma_buf)) {
0083 ret = -ENOMEM;
0084 goto unlock;
0085 }
0086
0087
0088 memset(&config, 0, sizeof(config));
0089 config.src_addr = (dma_addr_t)dma->phys_base + TIM_DMAR;
0090 config.src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
0091 ret = dmaengine_slave_config(dma->chan, &config);
0092 if (ret)
0093 goto unmap;
0094
0095 desc = dmaengine_prep_slave_single(dma->chan, dma_buf, len,
0096 DMA_DEV_TO_MEM, DMA_PREP_INTERRUPT);
0097 if (!desc) {
0098 ret = -EBUSY;
0099 goto unmap;
0100 }
0101
0102 desc->callback = stm32_timers_dma_done;
0103 desc->callback_param = dma;
0104 cookie = dmaengine_submit(desc);
0105 ret = dma_submit_error(cookie);
0106 if (ret)
0107 goto dma_term;
0108
0109 reinit_completion(&dma->completion);
0110 dma_async_issue_pending(dma->chan);
0111
0112
0113 dbl = FIELD_PREP(TIM_DCR_DBL, bursts - 1);
0114 dba = FIELD_PREP(TIM_DCR_DBA, reg >> 2);
0115 ret = regmap_write(regmap, TIM_DCR, dbl | dba);
0116 if (ret)
0117 goto dma_term;
0118
0119
0120 ret = regmap_write(regmap, TIM_SR, 0);
0121 if (ret)
0122 goto dcr_clr;
0123
0124 ret = regmap_update_bits(regmap, TIM_DIER, stm32_timers_dier_dmaen[id],
0125 stm32_timers_dier_dmaen[id]);
0126 if (ret)
0127 goto dcr_clr;
0128
0129 err = wait_for_completion_interruptible_timeout(&dma->completion,
0130 timeout);
0131 if (err == 0)
0132 ret = -ETIMEDOUT;
0133 else if (err < 0)
0134 ret = err;
0135
0136 regmap_update_bits(regmap, TIM_DIER, stm32_timers_dier_dmaen[id], 0);
0137 regmap_write(regmap, TIM_SR, 0);
0138 dcr_clr:
0139 regmap_write(regmap, TIM_DCR, 0);
0140 dma_term:
0141 dmaengine_terminate_all(dma->chan);
0142 unmap:
0143 dma_unmap_single(dev, dma_buf, len, DMA_FROM_DEVICE);
0144 unlock:
0145 dma->chan = NULL;
0146 mutex_unlock(&dma->lock);
0147
0148 return ret;
0149 }
0150 EXPORT_SYMBOL_GPL(stm32_timers_dma_burst_read);
0151
0152 static const struct regmap_config stm32_timers_regmap_cfg = {
0153 .reg_bits = 32,
0154 .val_bits = 32,
0155 .reg_stride = sizeof(u32),
0156 .max_register = STM32_TIMERS_MAX_REGISTERS,
0157 };
0158
0159 static void stm32_timers_get_arr_size(struct stm32_timers *ddata)
0160 {
0161 u32 arr;
0162
0163
0164 regmap_read(ddata->regmap, TIM_ARR, &arr);
0165
0166
0167
0168
0169
0170 regmap_write(ddata->regmap, TIM_ARR, ~0L);
0171 regmap_read(ddata->regmap, TIM_ARR, &ddata->max_arr);
0172 regmap_write(ddata->regmap, TIM_ARR, arr);
0173 }
0174
0175 static int stm32_timers_dma_probe(struct device *dev,
0176 struct stm32_timers *ddata)
0177 {
0178 int i;
0179 int ret = 0;
0180 char name[4];
0181
0182 init_completion(&ddata->dma.completion);
0183 mutex_init(&ddata->dma.lock);
0184
0185
0186 for (i = STM32_TIMERS_DMA_CH1; i <= STM32_TIMERS_DMA_CH4; i++) {
0187 snprintf(name, ARRAY_SIZE(name), "ch%1d", i + 1);
0188 ddata->dma.chans[i] = dma_request_chan(dev, name);
0189 }
0190 ddata->dma.chans[STM32_TIMERS_DMA_UP] = dma_request_chan(dev, "up");
0191 ddata->dma.chans[STM32_TIMERS_DMA_TRIG] = dma_request_chan(dev, "trig");
0192 ddata->dma.chans[STM32_TIMERS_DMA_COM] = dma_request_chan(dev, "com");
0193
0194 for (i = STM32_TIMERS_DMA_CH1; i < STM32_TIMERS_MAX_DMAS; i++) {
0195 if (IS_ERR(ddata->dma.chans[i])) {
0196
0197 if (PTR_ERR(ddata->dma.chans[i]) != -ENODEV && !ret)
0198 ret = PTR_ERR(ddata->dma.chans[i]);
0199
0200 ddata->dma.chans[i] = NULL;
0201 }
0202 }
0203
0204 return ret;
0205 }
0206
0207 static void stm32_timers_dma_remove(struct device *dev,
0208 struct stm32_timers *ddata)
0209 {
0210 int i;
0211
0212 for (i = STM32_TIMERS_DMA_CH1; i < STM32_TIMERS_MAX_DMAS; i++)
0213 if (ddata->dma.chans[i])
0214 dma_release_channel(ddata->dma.chans[i]);
0215 }
0216
0217 static int stm32_timers_probe(struct platform_device *pdev)
0218 {
0219 struct device *dev = &pdev->dev;
0220 struct stm32_timers *ddata;
0221 struct resource *res;
0222 void __iomem *mmio;
0223 int ret;
0224
0225 ddata = devm_kzalloc(dev, sizeof(*ddata), GFP_KERNEL);
0226 if (!ddata)
0227 return -ENOMEM;
0228
0229 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
0230 mmio = devm_ioremap_resource(dev, res);
0231 if (IS_ERR(mmio))
0232 return PTR_ERR(mmio);
0233
0234
0235 ddata->dma.phys_base = res->start;
0236
0237 ddata->regmap = devm_regmap_init_mmio_clk(dev, "int", mmio,
0238 &stm32_timers_regmap_cfg);
0239 if (IS_ERR(ddata->regmap))
0240 return PTR_ERR(ddata->regmap);
0241
0242 ddata->clk = devm_clk_get(dev, NULL);
0243 if (IS_ERR(ddata->clk))
0244 return PTR_ERR(ddata->clk);
0245
0246 stm32_timers_get_arr_size(ddata);
0247
0248 ret = stm32_timers_dma_probe(dev, ddata);
0249 if (ret) {
0250 stm32_timers_dma_remove(dev, ddata);
0251 return ret;
0252 }
0253
0254 platform_set_drvdata(pdev, ddata);
0255
0256 ret = of_platform_populate(pdev->dev.of_node, NULL, NULL, &pdev->dev);
0257 if (ret)
0258 stm32_timers_dma_remove(dev, ddata);
0259
0260 return ret;
0261 }
0262
0263 static int stm32_timers_remove(struct platform_device *pdev)
0264 {
0265 struct stm32_timers *ddata = platform_get_drvdata(pdev);
0266
0267
0268
0269
0270
0271 of_platform_depopulate(&pdev->dev);
0272 stm32_timers_dma_remove(&pdev->dev, ddata);
0273
0274 return 0;
0275 }
0276
0277 static const struct of_device_id stm32_timers_of_match[] = {
0278 { .compatible = "st,stm32-timers", },
0279 { },
0280 };
0281 MODULE_DEVICE_TABLE(of, stm32_timers_of_match);
0282
0283 static struct platform_driver stm32_timers_driver = {
0284 .probe = stm32_timers_probe,
0285 .remove = stm32_timers_remove,
0286 .driver = {
0287 .name = "stm32-timers",
0288 .of_match_table = stm32_timers_of_match,
0289 },
0290 };
0291 module_platform_driver(stm32_timers_driver);
0292
0293 MODULE_DESCRIPTION("STMicroelectronics STM32 Timers");
0294 MODULE_LICENSE("GPL v2");