mirror of
				https://xff.cz/git/u-boot/
				synced 2025-10-30 18:05:48 +01:00 
			
		
		
		
	dm: pwm: Add a PWM uclass
Add a uclass that supports Pulse Width Modulation (PWM) devices. It provides methods to enable/disable and configure the device. Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
		| @@ -46,6 +46,8 @@ source "drivers/pinctrl/Kconfig" | |||||||
|  |  | ||||||
| source "drivers/power/Kconfig" | source "drivers/power/Kconfig" | ||||||
|  |  | ||||||
|  | source "drivers/pwm/Kconfig" | ||||||
|  |  | ||||||
| source "drivers/ram/Kconfig" | source "drivers/ram/Kconfig" | ||||||
|  |  | ||||||
| source "drivers/remoteproc/Kconfig" | source "drivers/remoteproc/Kconfig" | ||||||
|   | |||||||
							
								
								
									
										10
									
								
								drivers/pwm/Kconfig
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								drivers/pwm/Kconfig
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,10 @@ | |||||||
|  | config DM_PWM | ||||||
|  | 	bool "Enable support for pulse-width modulation devices (PWM)" | ||||||
|  | 	depends on DM | ||||||
|  | 	help | ||||||
|  | 	  A pulse-width modulator emits a pulse of varying width and provides | ||||||
|  | 	  control over the duty cycle (high and low time) of the signal. This | ||||||
|  | 	  is often used to control a voltage level. The more time the PWM | ||||||
|  | 	  spends in the 'high' state, the higher the voltage. The PWM's | ||||||
|  | 	  frequency/period can be controlled along with the proportion of that | ||||||
|  | 	  time that the signal is high. | ||||||
| @@ -10,4 +10,5 @@ | |||||||
|  |  | ||||||
| #ccflags-y += -DDEBUG | #ccflags-y += -DDEBUG | ||||||
|  |  | ||||||
|  | obj-$(CONFIG_DM_PWM) += pwm-uclass.o | ||||||
| obj-$(CONFIG_PWM_IMX) += pwm-imx.o pwm-imx-util.o | obj-$(CONFIG_PWM_IMX) += pwm-imx.o pwm-imx-util.o | ||||||
|   | |||||||
							
								
								
									
										36
									
								
								drivers/pwm/pwm-uclass.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								drivers/pwm/pwm-uclass.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,36 @@ | |||||||
|  | /* | ||||||
|  |  * Copyright (c) 2016 Google, Inc | ||||||
|  |  * Written by Simon Glass <sjg@chromium.org> | ||||||
|  |  * | ||||||
|  |  * SPDX-License-Identifier:	GPL-2.0+ | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #include <common.h> | ||||||
|  | #include <dm.h> | ||||||
|  | #include <pwm.h> | ||||||
|  |  | ||||||
|  | int pwm_set_config(struct udevice *dev, uint channel, uint period_ns, | ||||||
|  | 		   uint duty_ns) | ||||||
|  | { | ||||||
|  | 	struct pwm_ops *ops = pwm_get_ops(dev); | ||||||
|  |  | ||||||
|  | 	if (!ops->set_config) | ||||||
|  | 		return -ENOSYS; | ||||||
|  |  | ||||||
|  | 	return ops->set_config(dev, channel, period_ns, duty_ns); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int pwm_set_enable(struct udevice *dev, uint channel, bool enable) | ||||||
|  | { | ||||||
|  | 	struct pwm_ops *ops = pwm_get_ops(dev); | ||||||
|  |  | ||||||
|  | 	if (!ops->set_enable) | ||||||
|  | 		return -ENOSYS; | ||||||
|  |  | ||||||
|  | 	return ops->set_enable(dev, channel, enable); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | UCLASS_DRIVER(pwm) = { | ||||||
|  | 	.id		= UCLASS_PWM, | ||||||
|  | 	.name		= "pwm", | ||||||
|  | }; | ||||||
| @@ -51,6 +51,7 @@ enum uclass_id { | |||||||
| 	UCLASS_PINCTRL,		/* Pinctrl (pin muxing/configuration) device */ | 	UCLASS_PINCTRL,		/* Pinctrl (pin muxing/configuration) device */ | ||||||
| 	UCLASS_PINCONFIG,	/* Pin configuration node device */ | 	UCLASS_PINCONFIG,	/* Pin configuration node device */ | ||||||
| 	UCLASS_PMIC,		/* PMIC I/O device */ | 	UCLASS_PMIC,		/* PMIC I/O device */ | ||||||
|  | 	UCLASS_PWM,		/* Pulse-width modulator */ | ||||||
| 	UCLASS_PWRSEQ,		/* Power sequence device */ | 	UCLASS_PWRSEQ,		/* Power sequence device */ | ||||||
| 	UCLASS_REGULATOR,	/* Regulator device */ | 	UCLASS_REGULATOR,	/* Regulator device */ | ||||||
| 	UCLASS_RESET,		/* Reset device */ | 	UCLASS_RESET,		/* Reset device */ | ||||||
|   | |||||||
| @@ -1,6 +1,7 @@ | |||||||
| /* | /* | ||||||
|  * header file for pwm driver. |  * header file for pwm driver. | ||||||
|  * |  * | ||||||
|  |  * Copyright 2016 Google Inc. | ||||||
|  * Copyright (c) 2011 samsung electronics |  * Copyright (c) 2011 samsung electronics | ||||||
|  * Donghwa Lee <dh09.lee@samsung.com> |  * Donghwa Lee <dh09.lee@samsung.com> | ||||||
|  * |  * | ||||||
| @@ -10,9 +11,61 @@ | |||||||
| #ifndef _pwm_h_ | #ifndef _pwm_h_ | ||||||
| #define _pwm_h_ | #define _pwm_h_ | ||||||
|  |  | ||||||
|  | /* struct pwm_ops: Operations for the PWM uclass */ | ||||||
|  | struct pwm_ops { | ||||||
|  | 	/** | ||||||
|  | 	 * set_config() - Set the PWM configuration | ||||||
|  | 	 * | ||||||
|  | 	 * @dev:	PWM device to update | ||||||
|  | 	 * @channel:	PWM channel to update | ||||||
|  | 	 * @period_ns:	PWM period in nanoseconds | ||||||
|  | 	 * @duty_ns:	PWM duty period in nanoseconds | ||||||
|  | 	 * @return 0 if OK, -ve on error | ||||||
|  | 	 */ | ||||||
|  | 	int (*set_config)(struct udevice *dev, uint channel, uint period_ns, | ||||||
|  | 			  uint duty_ns); | ||||||
|  |  | ||||||
|  | 	/** | ||||||
|  | 	 * set_enable() - Enable or disable the PWM | ||||||
|  | 	 * | ||||||
|  | 	 * @dev:	PWM device to update | ||||||
|  | 	 * @channel:	PWM channel to update | ||||||
|  | 	 * @enable:	true to enable, false to disable | ||||||
|  | 	 * @return 0 if OK, -ve on error | ||||||
|  | 	 */ | ||||||
|  | 	int (*set_enable)(struct udevice *dev, uint channel, bool enable); | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | #define pwm_get_ops(dev)	((struct pwm_ops *)(dev)->driver->ops) | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * pwm_set_config() - Set the PWM configuration | ||||||
|  |  * | ||||||
|  |  * @dev:	PWM device to update | ||||||
|  |  * @channel:	PWM channel to update | ||||||
|  |  * @period_ns:	PWM period in nanoseconds | ||||||
|  |  * @duty_ns:	PWM duty period in nanoseconds | ||||||
|  |  * @return 0 if OK, -ve on error | ||||||
|  |  */ | ||||||
|  | int pwm_set_config(struct udevice *dev, uint channel, uint period_ns, | ||||||
|  | 		   uint duty_ns); | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * pwm_set_enable() - Enable or disable the PWM | ||||||
|  |  * | ||||||
|  |  * @dev:	PWM device to update | ||||||
|  |  * @channel:	PWM channel to update | ||||||
|  |  * @enable:	true to enable, false to disable | ||||||
|  |  * @return 0 if OK, -ve on error | ||||||
|  |  */ | ||||||
|  | int pwm_set_enable(struct udevice *dev, uint channel, bool enable); | ||||||
|  |  | ||||||
|  | /* Legacy interface */ | ||||||
|  | #ifndef CONFIG_DM_PWM | ||||||
| int	pwm_init		(int pwm_id, int div, int invert); | int	pwm_init		(int pwm_id, int div, int invert); | ||||||
| int	pwm_config		(int pwm_id, int duty_ns, int period_ns); | int	pwm_config		(int pwm_id, int duty_ns, int period_ns); | ||||||
| int	pwm_enable		(int pwm_id); | int	pwm_enable		(int pwm_id); | ||||||
| void	pwm_disable		(int pwm_id); | void	pwm_disable		(int pwm_id); | ||||||
|  | #endif | ||||||
|  |  | ||||||
| #endif /* _pwm_h_ */ | #endif /* _pwm_h_ */ | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user