1fa93f5b7SBenjamin Gaignard // SPDX-License-Identifier: GPL-2.0 2d0f949e2SBenjamin Gaignard /* 3d0f949e2SBenjamin Gaignard * Copyright (C) STMicroelectronics 2016 4d0f949e2SBenjamin Gaignard * Author: Benjamin Gaignard <benjamin.gaignard@st.com> 5d0f949e2SBenjamin Gaignard */ 6d0f949e2SBenjamin Gaignard 7d0f949e2SBenjamin Gaignard #include <linux/mfd/stm32-timers.h> 8d0f949e2SBenjamin Gaignard #include <linux/module.h> 9d0f949e2SBenjamin Gaignard #include <linux/of_platform.h> 10d0f949e2SBenjamin Gaignard #include <linux/reset.h> 11d0f949e2SBenjamin Gaignard 12d0f949e2SBenjamin Gaignard static const struct regmap_config stm32_timers_regmap_cfg = { 13d0f949e2SBenjamin Gaignard .reg_bits = 32, 14d0f949e2SBenjamin Gaignard .val_bits = 32, 15d0f949e2SBenjamin Gaignard .reg_stride = sizeof(u32), 16ae6816baSFabrice Gasnier .max_register = 0x3fc, 17d0f949e2SBenjamin Gaignard }; 18d0f949e2SBenjamin Gaignard 19d0f949e2SBenjamin Gaignard static void stm32_timers_get_arr_size(struct stm32_timers *ddata) 20d0f949e2SBenjamin Gaignard { 21d0f949e2SBenjamin Gaignard /* 22d0f949e2SBenjamin Gaignard * Only the available bits will be written so when readback 23d0f949e2SBenjamin Gaignard * we get the maximum value of auto reload register 24d0f949e2SBenjamin Gaignard */ 25d0f949e2SBenjamin Gaignard regmap_write(ddata->regmap, TIM_ARR, ~0L); 26d0f949e2SBenjamin Gaignard regmap_read(ddata->regmap, TIM_ARR, &ddata->max_arr); 27d0f949e2SBenjamin Gaignard regmap_write(ddata->regmap, TIM_ARR, 0x0); 28d0f949e2SBenjamin Gaignard } 29d0f949e2SBenjamin Gaignard 30d0f949e2SBenjamin Gaignard static int stm32_timers_probe(struct platform_device *pdev) 31d0f949e2SBenjamin Gaignard { 32d0f949e2SBenjamin Gaignard struct device *dev = &pdev->dev; 33d0f949e2SBenjamin Gaignard struct stm32_timers *ddata; 34d0f949e2SBenjamin Gaignard struct resource *res; 35d0f949e2SBenjamin Gaignard void __iomem *mmio; 36d0f949e2SBenjamin Gaignard 37d0f949e2SBenjamin Gaignard ddata = devm_kzalloc(dev, sizeof(*ddata), GFP_KERNEL); 38d0f949e2SBenjamin Gaignard if (!ddata) 39d0f949e2SBenjamin Gaignard return -ENOMEM; 40d0f949e2SBenjamin Gaignard 41d0f949e2SBenjamin Gaignard res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 42d0f949e2SBenjamin Gaignard mmio = devm_ioremap_resource(dev, res); 43d0f949e2SBenjamin Gaignard if (IS_ERR(mmio)) 44d0f949e2SBenjamin Gaignard return PTR_ERR(mmio); 45d0f949e2SBenjamin Gaignard 46d0f949e2SBenjamin Gaignard ddata->regmap = devm_regmap_init_mmio_clk(dev, "int", mmio, 47d0f949e2SBenjamin Gaignard &stm32_timers_regmap_cfg); 48d0f949e2SBenjamin Gaignard if (IS_ERR(ddata->regmap)) 49d0f949e2SBenjamin Gaignard return PTR_ERR(ddata->regmap); 50d0f949e2SBenjamin Gaignard 51d0f949e2SBenjamin Gaignard ddata->clk = devm_clk_get(dev, NULL); 52d0f949e2SBenjamin Gaignard if (IS_ERR(ddata->clk)) 53d0f949e2SBenjamin Gaignard return PTR_ERR(ddata->clk); 54d0f949e2SBenjamin Gaignard 55d0f949e2SBenjamin Gaignard stm32_timers_get_arr_size(ddata); 56d0f949e2SBenjamin Gaignard 57d0f949e2SBenjamin Gaignard platform_set_drvdata(pdev, ddata); 58d0f949e2SBenjamin Gaignard 59c42a8edbSBenjamin Gaignard return devm_of_platform_populate(&pdev->dev); 60f8b7ce67SFabrice Gasnier } 61f8b7ce67SFabrice Gasnier 62d0f949e2SBenjamin Gaignard static const struct of_device_id stm32_timers_of_match[] = { 63d0f949e2SBenjamin Gaignard { .compatible = "st,stm32-timers", }, 64d0f949e2SBenjamin Gaignard { /* end node */ }, 65d0f949e2SBenjamin Gaignard }; 66d0f949e2SBenjamin Gaignard MODULE_DEVICE_TABLE(of, stm32_timers_of_match); 67d0f949e2SBenjamin Gaignard 68d0f949e2SBenjamin Gaignard static struct platform_driver stm32_timers_driver = { 69d0f949e2SBenjamin Gaignard .probe = stm32_timers_probe, 70d0f949e2SBenjamin Gaignard .driver = { 71d0f949e2SBenjamin Gaignard .name = "stm32-timers", 72d0f949e2SBenjamin Gaignard .of_match_table = stm32_timers_of_match, 73d0f949e2SBenjamin Gaignard }, 74d0f949e2SBenjamin Gaignard }; 75d0f949e2SBenjamin Gaignard module_platform_driver(stm32_timers_driver); 76d0f949e2SBenjamin Gaignard 77d0f949e2SBenjamin Gaignard MODULE_DESCRIPTION("STMicroelectronics STM32 Timers"); 78d0f949e2SBenjamin Gaignard MODULE_LICENSE("GPL v2"); 79