aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/generic/files/include/linux/pwm/pwm.h
blob: e01cca90360d10cdcd49e0353e4cd3eef0053193 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
/*
 * include/linux/pwm.h
 *
 * Copyright (C) 2008 Bill Gatliff < bgat@billgatliff.com>
 *
 * This program is free software; you may redistribute and/or modify
 * it under the terms of the GNU General Public License version 2, as
 * published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
 * USA
 */
#ifndef __LINUX_PWM_H
#define __LINUX_PWM_H

enum {
	PWM_CONFIG_DUTY_TICKS = BIT(0),
	PWM_CONFIG_PERIOD_TICKS = BIT(1),
	PWM_CONFIG_POLARITY = BIT(2),
	PWM_CONFIG_START = BIT(3),
	PWM_CONFIG_STOP = BIT(4),

	PWM_CONFIG_HANDLER = BIT(5),

	PWM_CONFIG_DUTY_NS = BIT(6),
	PWM_CONFIG_DUTY_PERCENT = BIT(7),
	PWM_CONFIG_PERIOD_NS = BIT(8),
};

struct pwm_channel;
struct work_struct;

typedef int (*pwm_handler_t)(struct pwm_channel *p, void *data);
typedef void (*pwm_callback_t)(struct pwm_channel *p);

struct pwm_channel_config {
	int config_mask;
	unsigned long duty_ticks;
	unsigned long period_ticks;
	int polarity;

	pwm_handler_t handler;

	unsigned long duty_ns;
	unsigned long period_ns;
	int duty_percent;
};

struct pwm_device {
	struct list_head list;
	spinlock_t list_lock;
	struct device *dev;
	struct module *owner;
	struct pwm_channel *channels;

	const char *bus_id;
	int nchan;

	int	(*request)	(struct pwm_channel *p);
	void	(*free)		(struct pwm_channel *p);
	int	(*config)	(struct pwm_channel *p,
				 struct pwm_channel_config *c);
	int	(*config_nosleep)(struct pwm_channel *p,
				  struct pwm_channel_config *c);
	int	(*synchronize)	(struct pwm_channel *p,
				 struct pwm_channel *to_p);
	int	(*unsynchronize)(struct pwm_channel *p,
				 struct pwm_channel *from_p);
	int	(*set_callback)	(struct pwm_channel *p,
				 pwm_callback_t callback);
};

int pwm_register(struct pwm_device *pwm);
int pwm_unregister(struct pwm_device *pwm);

enum {
	FLAG_REQUESTED = 0,
	FLAG_STOP = 1,
};

struct pwm_channel {
	struct list_head list;
	struct pwm_device *pwm;
	const char *requester;
	pid_t pid;
	int chan;
	unsigned long flags;
	unsigned long tick_hz;

	spinlock_t lock;
	struct completion complete;

	pwm_callback_t callback;

	struct work_struct handler_work;
	pwm_handler_t handler;
	void *handler_data;

	int active_high;
	unsigned long period_ticks;
	unsigned long duty_ticks;
};

struct gpio_pwm_platform_data {
	int gpio;
};

struct pwm_channel *
pwm_request(const char *bus_id, int chan,
	    const char *requester);

void pwm_free(struct pwm_channel *pwm);

int pwm_config_nosleep(struct pwm_channel *pwm,
		       struct pwm_channel_config *c);

int pwm_config(struct pwm_channel *pwm,
	       struct pwm_channel_config *c);

unsigned long pwm_ns_to_ticks(struct pwm_channel *pwm,
			      unsigned long nsecs);

unsigned long pwm_ticks_to_ns(struct pwm_channel *pwm,
			      unsigned long ticks);

int pwm_set_period_ns(struct pwm_channel *pwm,
		      unsigned long period_ns);

unsigned long int pwm_get_period_ns(struct pwm_channel *pwm);

int pwm_set_duty_ns(struct pwm_channel *pwm,
		    unsigned long duty_ns);

int pwm_set_duty_percent(struct pwm_channel *pwm,
			 int percent);

unsigned long pwm_get_duty_ns(struct pwm_channel *pwm);

int pwm_set_polarity(struct pwm_channel *pwm,
		     int active_high);

int pwm_start(struct pwm_channel *pwm);

int pwm_stop(struct pwm_channel *pwm);

int pwm_set_handler(struct pwm_channel *pwm,
		    pwm_handler_t handler,
		    void *data);

int pwm_synchronize(struct pwm_channel *p,
		    struct pwm_channel *to_p);


int pwm_unsynchronize(struct pwm_channel *p,
		      struct pwm_channel *from_p);


#endif /* __LINUX_PWM_H */