diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2020-04-16 18:40:42 +0200 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2020-04-16 18:40:42 +0200 |
commit | 32a48332753ac141998197f9f0e9c99d0d855102 (patch) | |
tree | 458d76d9917dc6640f0d0f53e718c4b12cd95242 /include | |
parent | ddc3394069ab2e43e64b3f0c2465a3fb3069a970 (diff) | |
parent | b2cd220105a6bd03ff819a99ce0c3c853a6d00f3 (diff) | |
download | barebox-32a48332753ac141998197f9f0e9c99d0d855102.tar.gz barebox-32a48332753ac141998197f9f0e9c99d0d855102.tar.xz |
Merge branch 'for-next/pwm'
Diffstat (limited to 'include')
-rw-r--r-- | include/linux/mfd/stm32-timers.h | 97 | ||||
-rw-r--r-- | include/of.h | 8 | ||||
-rw-r--r-- | include/pwm.h | 62 |
3 files changed, 153 insertions, 14 deletions
diff --git a/include/linux/mfd/stm32-timers.h b/include/linux/mfd/stm32-timers.h new file mode 100644 index 0000000000..28fad44598 --- /dev/null +++ b/include/linux/mfd/stm32-timers.h @@ -0,0 +1,97 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Copyright (C) STMicroelectronics 2016 + * Author: Benjamin Gaignard <benjamin.gaignard@st.com> + */ + +#ifndef _LINUX_STM32_GPTIMER_H_ +#define _LINUX_STM32_GPTIMER_H_ + +#include <clock.h> +#include <regmap.h> + +#define TIM_CR1 0x00 /* Control Register 1 */ +#define TIM_CR2 0x04 /* Control Register 2 */ +#define TIM_SMCR 0x08 /* Slave mode control reg */ +#define TIM_DIER 0x0C /* DMA/interrupt register */ +#define TIM_SR 0x10 /* Status register */ +#define TIM_EGR 0x14 /* Event Generation Reg */ +#define TIM_CCMR1 0x18 /* Capt/Comp 1 Mode Reg */ +#define TIM_CCMR2 0x1C /* Capt/Comp 2 Mode Reg */ +#define TIM_CCER 0x20 /* Capt/Comp Enable Reg */ +#define TIM_CNT 0x24 /* Counter */ +#define TIM_PSC 0x28 /* Prescaler */ +#define TIM_ARR 0x2c /* Auto-Reload Register */ +#define TIM_CCR1 0x34 /* Capt/Comp Register 1 */ +#define TIM_CCR2 0x38 /* Capt/Comp Register 2 */ +#define TIM_CCR3 0x3C /* Capt/Comp Register 3 */ +#define TIM_CCR4 0x40 /* Capt/Comp Register 4 */ +#define TIM_BDTR 0x44 /* Break and Dead-Time Reg */ +#define TIM_DCR 0x48 /* DMA control register */ +#define TIM_DMAR 0x4C /* DMA register for transfer */ + +#define TIM_CR1_CEN BIT(0) /* Counter Enable */ +#define TIM_CR1_DIR BIT(4) /* Counter Direction */ +#define TIM_CR1_ARPE BIT(7) /* Auto-reload Preload Ena */ +#define TIM_CR2_MMS (BIT(4) | BIT(5) | BIT(6)) /* Master mode selection */ +#define TIM_CR2_MMS2 GENMASK(23, 20) /* Master mode selection 2 */ +#define TIM_SMCR_SMS (BIT(0) | BIT(1) | BIT(2)) /* Slave mode selection */ +#define TIM_SMCR_TS (BIT(4) | BIT(5) | BIT(6)) /* Trigger selection */ +#define TIM_DIER_UIE BIT(0) /* Update interrupt */ +#define TIM_DIER_UDE BIT(8) /* Update DMA request Enable */ +#define TIM_DIER_CC1DE BIT(9) /* CC1 DMA request Enable */ +#define TIM_DIER_CC2DE BIT(10) /* CC2 DMA request Enable */ +#define TIM_DIER_CC3DE BIT(11) /* CC3 DMA request Enable */ +#define TIM_DIER_CC4DE BIT(12) /* CC4 DMA request Enable */ +#define TIM_DIER_COMDE BIT(13) /* COM DMA request Enable */ +#define TIM_DIER_TDE BIT(14) /* Trigger DMA request Enable */ +#define TIM_SR_UIF BIT(0) /* Update interrupt flag */ +#define TIM_EGR_UG BIT(0) /* Update Generation */ +#define TIM_CCMR_PE BIT(3) /* Channel Preload Enable */ +#define TIM_CCMR_M1 (BIT(6) | BIT(5)) /* Channel PWM Mode 1 */ +#define TIM_CCMR_CC1S (BIT(0) | BIT(1)) /* Capture/compare 1 sel */ +#define TIM_CCMR_IC1PSC GENMASK(3, 2) /* Input capture 1 prescaler */ +#define TIM_CCMR_CC2S (BIT(8) | BIT(9)) /* Capture/compare 2 sel */ +#define TIM_CCMR_IC2PSC GENMASK(11, 10) /* Input capture 2 prescaler */ +#define TIM_CCMR_CC1S_TI1 BIT(0) /* IC1/IC3 selects TI1/TI3 */ +#define TIM_CCMR_CC1S_TI2 BIT(1) /* IC1/IC3 selects TI2/TI4 */ +#define TIM_CCMR_CC2S_TI2 BIT(8) /* IC2/IC4 selects TI2/TI4 */ +#define TIM_CCMR_CC2S_TI1 BIT(9) /* IC2/IC4 selects TI1/TI3 */ +#define TIM_CCER_CC1E BIT(0) /* Capt/Comp 1 out Ena */ +#define TIM_CCER_CC1P BIT(1) /* Capt/Comp 1 Polarity */ +#define TIM_CCER_CC1NE BIT(2) /* Capt/Comp 1N out Ena */ +#define TIM_CCER_CC1NP BIT(3) /* Capt/Comp 1N Polarity */ +#define TIM_CCER_CC2E BIT(4) /* Capt/Comp 2 out Ena */ +#define TIM_CCER_CC2P BIT(5) /* Capt/Comp 2 Polarity */ +#define TIM_CCER_CC3E BIT(8) /* Capt/Comp 3 out Ena */ +#define TIM_CCER_CC3P BIT(9) /* Capt/Comp 3 Polarity */ +#define TIM_CCER_CC4E BIT(12) /* Capt/Comp 4 out Ena */ +#define TIM_CCER_CC4P BIT(13) /* Capt/Comp 4 Polarity */ +#define TIM_CCER_CCXE (BIT(0) | BIT(4) | BIT(8) | BIT(12)) +#define TIM_BDTR_BKE BIT(12) /* Break input enable */ +#define TIM_BDTR_BKP BIT(13) /* Break input polarity */ +#define TIM_BDTR_AOE BIT(14) /* Automatic Output Enable */ +#define TIM_BDTR_MOE BIT(15) /* Main Output Enable */ +#define TIM_BDTR_BKF (BIT(16) | BIT(17) | BIT(18) | BIT(19)) +#define TIM_BDTR_BK2F (BIT(20) | BIT(21) | BIT(22) | BIT(23)) +#define TIM_BDTR_BK2E BIT(24) /* Break 2 input enable */ +#define TIM_BDTR_BK2P BIT(25) /* Break 2 input polarity */ +#define TIM_DCR_DBA GENMASK(4, 0) /* DMA base addr */ +#define TIM_DCR_DBL GENMASK(12, 8) /* DMA burst len */ + +#define MAX_TIM_PSC 0xFFFF +#define MAX_TIM_ICPSC 0x3 +#define TIM_CR2_MMS_SHIFT 4 +#define TIM_CR2_MMS2_SHIFT 20 +#define TIM_SMCR_TS_SHIFT 4 +#define TIM_BDTR_BKF_MASK 0xF +#define TIM_BDTR_BKF_SHIFT 16 +#define TIM_BDTR_BK2F_SHIFT 20 + +struct stm32_timers { + struct clk *clk; + struct regmap *regmap; + u32 max_arr; +}; + +#endif diff --git a/include/of.h b/include/of.h index 3a613dcdcf..85d55f9b57 100644 --- a/include/of.h +++ b/include/of.h @@ -188,6 +188,8 @@ extern struct device_node *of_find_node_by_reproducible_name(struct device_node extern int of_property_read_u32_index(const struct device_node *np, const char *propname, u32 index, u32 *out_value); +extern int of_property_count_elems_of_size(const struct device_node *np, + const char *propname, int elem_size); extern int of_property_read_u8_array(const struct device_node *np, const char *propname, u8 *out_values, size_t sz); extern int of_property_read_u16_array(const struct device_node *np, @@ -433,6 +435,12 @@ static inline int of_property_read_u32_index(const struct device_node *np, return -ENOSYS; } +static inline int of_property_count_elems_of_size(const struct device_node *np, + const char *propname, int elem_size) +{ + return -ENOSYS; +} + static inline int of_property_read_u8_array(const struct device_node *np, const char *propname, u8 *out_values, size_t sz) { diff --git a/include/pwm.h b/include/pwm.h index ca01f5b53d..b67ab13d2e 100644 --- a/include/pwm.h +++ b/include/pwm.h @@ -2,9 +2,27 @@ #ifndef __PWM_H #define __PWM_H +#include <dt-bindings/pwm/pwm.h> + struct pwm_device; struct device_d; +#define PWM_POLARITY_NORMAL 0 + +/* + * struct pwm_state - state of a PWM channel + * @period_ns: PWM period (in nanoseconds) + * @duty_ns: PWM duty cycle (in nanoseconds) + * @polarity: PWM polarity + * @p_enable: PWM enabled status + */ +struct pwm_state { + unsigned int period_ns; + unsigned int duty_ns; + unsigned int polarity; + unsigned int p_enable; +}; + /* * pwm_request - request a PWM device */ @@ -18,6 +36,17 @@ struct pwm_device *of_pwm_request(struct device_node *np, const char *con_id); void pwm_free(struct pwm_device *pwm); /* + * pwm_init_state - prepare a new state from device tree args + */ +void pwm_init_state(const struct pwm_device *pwm, + struct pwm_state *state); + +/* + * pwm_config - change a PWM device configuration + */ +int pwm_apply_state(struct pwm_device *pwm, const struct pwm_state *state); + +/* * pwm_config - change a PWM device configuration */ int pwm_config(struct pwm_device *pwm, int duty_ns, int period_ns); @@ -32,28 +61,34 @@ int pwm_enable(struct pwm_device *pwm); */ void pwm_disable(struct pwm_device *pwm); -void pwm_set_period(struct pwm_device *pwm, unsigned int period); unsigned int pwm_get_period(struct pwm_device *pwm); -void pwm_set_duty_cycle(struct pwm_device *pwm, unsigned int duty); -unsigned int pwm_get_duty_cycle(struct pwm_device *pwm); struct pwm_chip; /** + * pwm_get_state() - retrieve the current PWM state + * @pwm: PWM device + * @state: state to fill with the current PWM state + */ +void pwm_get_state(const struct pwm_device *pwm, struct pwm_state *state); + +/** + * pwm_apply_state() - apply the passed PWM state + * @pwm: PWM device + * @state: state to apply to pwm device + */ +int pwm_apply_state(struct pwm_device *pwm, const struct pwm_state *state); + +/** * struct pwm_ops - PWM operations * @request: optional hook for requesting a PWM * @free: optional hook for freeing a PWM - * @config: configure duty cycles and period length for this PWM - * @enable: enable PWM output toggling - * @disable: disable PWM output toggling + * @apply: apply specified pwm state */ struct pwm_ops { int (*request)(struct pwm_chip *chip); void (*free)(struct pwm_chip *chip); - int (*config)(struct pwm_chip *chip, int duty_ns, - int period_ns); - int (*enable)(struct pwm_chip *chip); - void (*disable)(struct pwm_chip *chip); + int (*apply)(struct pwm_chip *chip, const struct pwm_state *state); }; /** @@ -61,15 +96,14 @@ struct pwm_ops { * @id: The id of this pwm * @devname: unique identifier for this pwm * @ops: The callbacks for this PWM - * @duty_ns: The duty cycle of the PWM, in nano-seconds - * @period_ns: The period of the PWM, in nano-seconds + * @state: current state of the PWM */ struct pwm_chip { int id; const char *devname; const struct pwm_ops *ops; - int duty_ns; - int period_ns; + + struct pwm_state state; }; int pwmchip_add(struct pwm_chip *chip, struct device_d *dev); |