da1bb88a2b
SVN-Revision: 21952
165 lines
3.9 KiB
C
165 lines
3.9 KiB
C
/*
|
|
* 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 */
|