diff --git a/drivers/counter/Kconfig.sam0 b/drivers/counter/Kconfig.sam0 index e71d24a2749..0cc090c0e5f 100644 --- a/drivers/counter/Kconfig.sam0 +++ b/drivers/counter/Kconfig.sam0 @@ -1,26 +1,10 @@ # Copyright (c) 2019 Derek Hageman # SPDX-License-Identifier: Apache-2.0 -menuconfig COUNTER_SAM0_TC32 +config COUNTER_SAM0_TC32 bool "SAM0 series 32-bit basic timer driver" default y depends on SOC_FAMILY_SAM0 help Enable the SAM0 series timer counter (TC) driver in 32-bit wide mode. - -if COUNTER_SAM0_TC32 - -index = 0 -source "drivers/counter/Kconfig.template.sam0_tc32" - -index = 2 -source "drivers/counter/Kconfig.template.sam0_tc32" - -index = 4 -source "drivers/counter/Kconfig.template.sam0_tc32" - -index = 6 -source "drivers/counter/Kconfig.template.sam0_tc32" - -endif # COUNTER_SAM0_TC32 diff --git a/drivers/counter/Kconfig.template.sam0_tc32 b/drivers/counter/Kconfig.template.sam0_tc32 deleted file mode 100644 index 129ae245521..00000000000 --- a/drivers/counter/Kconfig.template.sam0_tc32 +++ /dev/null @@ -1,35 +0,0 @@ -# Copyright (c) 2019 Derek Hageman -# SPDX-License-Identifier: Apache-2.0 - -choice - bool "Timer $(index) prescaler" - - config COUNTER_SAM0_TC32_$(index)_PRESCALER_1 - bool "clock / 1" - config COUNTER_SAM0_TC32_$(index)_PRESCALER_2 - bool "clock / 2" - config COUNTER_SAM0_TC32_$(index)_PRESCALER_4 - bool "clock / 4" - config COUNTER_SAM0_TC32_$(index)_PRESCALER_8 - bool "clock / 8" - config COUNTER_SAM0_TC32_$(index)_PRESCALER_16 - bool "clock / 16" - config COUNTER_SAM0_TC32_$(index)_PRESCALER_64 - bool "clock / 64" - config COUNTER_SAM0_TC32_$(index)_PRESCALER_256 - bool "clock / 256" - config COUNTER_SAM0_TC32_$(index)_PRESCALER_1024 - bool "clock / 1024" - -endchoice - -config COUNTER_SAM0_TC32_$(index)_DIVISOR - int - default 1 if COUNTER_SAM0_TC32_$(index)_PRESCALER_1 - default 2 if COUNTER_SAM0_TC32_$(index)_PRESCALER_2 - default 4 if COUNTER_SAM0_TC32_$(index)_PRESCALER_4 - default 8 if COUNTER_SAM0_TC32_$(index)_PRESCALER_8 - default 16 if COUNTER_SAM0_TC32_$(index)_PRESCALER_16 - default 64 if COUNTER_SAM0_TC32_$(index)_PRESCALER_64 - default 256 if COUNTER_SAM0_TC32_$(index)_PRESCALER_256 - default 1024 if COUNTER_SAM0_TC32_$(index)_PRESCALER_1024 diff --git a/drivers/counter/counter_sam0_tc32.c b/drivers/counter/counter_sam0_tc32.c index 3371fc33228..48cd86e97cf 100644 --- a/drivers/counter/counter_sam0_tc32.c +++ b/drivers/counter/counter_sam0_tc32.c @@ -4,6 +4,8 @@ * SPDX-License-Identifier: Apache-2.0 */ +#define DT_DRV_COMPAT atmel_sam0_tc32 + #include #include #include @@ -402,64 +404,57 @@ static const struct counter_driver_api counter_sam0_tc32_driver_api = { #ifdef MCLK -#define COUNTER_SAM0_TC32_CLOCK_CONTROL(n) \ - .mclk = MCLK_TC##n, \ - .mclk_mask = MCLK_TC##n##_MASK, \ - .gclk_id = TC##n##_GCLK_ID, +#define COUNTER_SAM0_TC32_CLOCK_CONTROL(n) \ + .mclk = (volatile uint32_t *)MCLK_MASK_DT_INT_REG_ADDR(n), \ + .mclk_mask = BIT(DT_INST_CLOCKS_CELL_BY_NAME(n, mclk, bit)), \ + .gclk_id = DT_INST_CLOCKS_CELL_BY_NAME(n, gclk, periph_ch), #else -#define COUNTER_SAM0_TC32_CLOCK_CONTROL(n) \ - .pm_apbcmask = PM_APBCMASK_TC##n, \ - .gclk_clkctrl_id = UTIL_CAT(GCLK_CLKCTRL_ID_TC ## n ## _TC, \ - UTIL_INC(n)), +#define COUNTER_SAM0_TC32_CLOCK_CONTROL(n) \ + .pm_apbcmask = BIT(DT_INST_CLOCKS_CELL_BY_NAME(n, pm, bit)), \ + .gclk_clkctrl_id = DT_INST_CLOCKS_CELL_BY_NAME(n, gclk, clkctrl_id), #endif -#define COUNTER_SAM0_TC32_DEVICE(n) \ - static void counter_sam0_tc32_config_##n(struct device *dev); \ - static const struct counter_sam0_tc32_config \ - counter_sam0_tc32_dev_config_##n = { \ - .info = { \ - .max_top_value = UINT32_MAX, \ - .freq = SOC_ATMEL_SAM0_GCLK0_FREQ_HZ / \ - CONFIG_COUNTER_SAM0_TC32_##n##_DIVISOR, \ - .flags = COUNTER_CONFIG_INFO_COUNT_UP, \ - .channels = 1 \ - }, \ - .regs = (TcCount32 *)DT_ATMEL_SAM0_TC32_TC_##n##_BASE_ADDRESS,\ - COUNTER_SAM0_TC32_CLOCK_CONTROL(n) \ - .prescaler = UTIL_CAT(TC_CTRLA_PRESCALER_DIV, \ - CONFIG_COUNTER_SAM0_TC32_##n##_DIVISOR), \ - .irq_config_func = &counter_sam0_tc32_config_##n, \ - }; \ - static struct counter_sam0_tc32_data counter_sam0_tc32_dev_data_##n; \ - DEVICE_AND_API_INIT(counter_sam0_tc32_##n, \ - DT_ATMEL_SAM0_TC32_TC_##n##_LABEL, \ - &counter_sam0_tc32_initialize, \ - &counter_sam0_tc32_dev_data_##n, \ - &counter_sam0_tc32_dev_config_##n, PRE_KERNEL_1, \ - CONFIG_KERNEL_INIT_PRIORITY_DEVICE, \ - &counter_sam0_tc32_driver_api); \ - static void counter_sam0_tc32_config_##n(struct device *dev) \ - { \ - IRQ_CONNECT(DT_ATMEL_SAM0_TC32_TC_##n##_IRQ_0, \ - DT_ATMEL_SAM0_TC32_TC_##n##_IRQ_0_PRIORITY, \ - counter_sam0_tc32_isr, \ - DEVICE_GET(counter_sam0_tc32_##n), \ - 0); \ - irq_enable(DT_ATMEL_SAM0_TC32_TC_##n##_IRQ_0); \ +#define SAM0_TC32_PRESCALER(n) \ + COND_CODE_1(DT_INST_NODE_HAS_PROP(n, prescaler), \ + (DT_INST_PROP(n, prescaler)), (1)) + +#define COUNTER_SAM0_TC32_DEVICE(n) \ + static void counter_sam0_tc32_config_##n(struct device *dev); \ + static const struct counter_sam0_tc32_config \ + \ + counter_sam0_tc32_dev_config_##n = { \ + .info = { \ + .max_top_value = UINT32_MAX, \ + .freq = SOC_ATMEL_SAM0_GCLK0_FREQ_HZ / \ + SAM0_TC32_PRESCALER(n), \ + .flags = COUNTER_CONFIG_INFO_COUNT_UP, \ + .channels = 1 \ + }, \ + .regs = (TcCount32 *)DT_INST_REG_ADDR(n), \ + COUNTER_SAM0_TC32_CLOCK_CONTROL(n) \ + .prescaler = UTIL_CAT(TC_CTRLA_PRESCALER_DIV, \ + SAM0_TC32_PRESCALER(n)), \ + .irq_config_func = &counter_sam0_tc32_config_##n, \ + }; \ + \ + static struct counter_sam0_tc32_data counter_sam0_tc32_dev_data_##n;\ + \ + DEVICE_AND_API_INIT(counter_sam0_tc32_##n, \ + DT_INST_LABEL(n), \ + &counter_sam0_tc32_initialize, \ + &counter_sam0_tc32_dev_data_##n, \ + &counter_sam0_tc32_dev_config_##n, \ + PRE_KERNEL_1, \ + CONFIG_KERNEL_INIT_PRIORITY_DEVICE, \ + &counter_sam0_tc32_driver_api); \ + \ + static void counter_sam0_tc32_config_##n(struct device *dev) \ + { \ + IRQ_CONNECT(DT_INST_IRQN(n), \ + DT_INST_IRQ(n, priority), \ + counter_sam0_tc32_isr, \ + DEVICE_GET(counter_sam0_tc32_##n), 0); \ + irq_enable(DT_INST_IRQN(n)); \ } -#if DT_ATMEL_SAM0_TC32_TC_0_BASE_ADDRESS -COUNTER_SAM0_TC32_DEVICE(0); -#endif - -#if DT_ATMEL_SAM0_TC32_TC_2_BASE_ADDRESS -COUNTER_SAM0_TC32_DEVICE(2); -#endif - -#if DT_ATMEL_SAM0_TC32_TC_4_BASE_ADDRESS -COUNTER_SAM0_TC32_DEVICE(4); -#endif - -#if DT_ATMEL_SAM0_TC32_TC_6_BASE_ADDRESS -COUNTER_SAM0_TC32_DEVICE(6); -#endif +DT_INST_FOREACH(COUNTER_SAM0_TC32_DEVICE) diff --git a/dts/bindings/timer/atmel,sam0-tc32.yaml b/dts/bindings/timer/atmel,sam0-tc32.yaml index c2df39359d8..c8cf4430509 100644 --- a/dts/bindings/timer/atmel,sam0-tc32.yaml +++ b/dts/bindings/timer/atmel,sam0-tc32.yaml @@ -22,3 +22,17 @@ properties: label: required: true + + prescaler: + type: int + required: false + description: Timer prescaler + enum: + - 1 + - 2 + - 4 + - 8 + - 16 + - 64 + - 256 + - 1024