1/* SPDX-License-Identifier: GPL-2.0+ */
2/*
3 * header file for pwm driver.
4 *
5 * Copyright 2016 Google Inc.
6 * Copyright (c) 2011 samsung electronics
7 * Donghwa Lee <dh09.lee@samsung.com>
8 */
9
10#ifndef _pwm_h_
11#define _pwm_h_
12
13struct udevice;
14
15/* struct pwm_ops: Operations for the PWM uclass */
16struct pwm_ops {
17	/**
18	 * set_config() - Set the PWM configuration
19	 *
20	 * Change both the PWM device's period and it's duty period if
21	 * possible. Otherwise, set an appropriate duty period that best
22	 * matches the given period_ns / duty_ns ratio for the device.
23	 *
24	 * @dev:	PWM device to update
25	 * @channel:	PWM channel to update
26	 * @period_ns:	PWM period in nanoseconds
27	 * @duty_ns:	PWM duty period in nanoseconds
28	 * @return 0 if OK, -ve on error
29	 */
30	int (*set_config)(struct udevice *dev, uint channel, uint period_ns,
31			  uint duty_ns);
32
33	/**
34	 * set_enable() - Enable or disable the PWM
35	 *
36	 * @dev:	PWM device to update
37	 * @channel:	PWM channel to update
38	 * @enable:	true to enable, false to disable
39	 * @return 0 if OK, -ve on error
40	 */
41	int (*set_enable)(struct udevice *dev, uint channel, bool enable);
42	/**
43	 * set_invert() - Set the PWM invert
44	 *
45	 * @dev:        PWM device to update
46	 * @channel:    PWM channel to update
47	 * @polarity:   true to invert, false to keep normal polarity
48	 * @return 0 if OK, -ve on error
49	 */
50	int (*set_invert)(struct udevice *dev, uint channel, bool polarity);
51};
52
53#define pwm_get_ops(dev)	((struct pwm_ops *)(dev)->driver->ops)
54
55/**
56 * pwm_set_config() - Set the PWM configuration
57 *
58 * Change both the PWM device's period and it's duty period if
59 * possible. Otherwise, set an appropriate duty period that best
60 * matches the given period_ns / duty_ns ratio for the device.
61 *
62 * @dev:	PWM device to update
63 * @channel:	PWM channel to update
64 * @period_ns:	PWM period in nanoseconds
65 * @duty_ns:	PWM duty period in nanoseconds
66 * Return: 0 if OK, -ve on error
67 */
68int pwm_set_config(struct udevice *dev, uint channel, uint period_ns,
69		   uint duty_ns);
70
71/**
72 * pwm_set_enable() - Enable or disable the PWM
73 *
74 * @dev:	PWM device to update
75 * @channel:	PWM channel to update
76 * @enable:	true to enable, false to disable
77 * Return: 0 if OK, -ve on error
78 */
79int pwm_set_enable(struct udevice *dev, uint channel, bool enable);
80
81/**
82 * pwm_set_invert() - Set pwm default polarity
83 *
84 * @dev:	PWM device to update
85 * @channel:	PWM channel to update
86 * @polarity:	true to invert, false to keep normal polarity
87 * Return: 0 if OK, -ve on error
88 */
89int pwm_set_invert(struct udevice *dev, uint channel, bool polarity);
90
91/* Legacy interface */
92#ifndef CONFIG_DM_PWM
93int	pwm_init		(int pwm_id, int div, int invert);
94int	pwm_config		(int pwm_id, int duty_ns, int period_ns);
95int	pwm_enable		(int pwm_id);
96void	pwm_disable		(int pwm_id);
97#endif
98
99#endif /* _pwm_h_ */
100