1 #include <linux/delay.h>
\r
2 #include <linux/platform_device.h>
\r
3 #include <linux/clk.h>
\r
4 #include <mach/gpio.h>
\r
5 #include <linux/wakelock.h>
\r
7 #include "gpio_wave.h"
\r
10 struct delayed_work d_work;
\r
16 struct device *dev;
\r
19 static struct wake_lock w_lock;
\r
21 static void gpio_wave_dwork_handle(struct work_struct *work)
\r
23 struct wave_data *data = (struct wave_data *)container_of(work, struct wave_data, d_work.work);
\r
25 int delay_time = data->cur_value ? data->Ltime : data->Htime;
\r
26 data->cur_value = !data->cur_value;
\r
27 gpio_set_value(data->gpio, data->cur_value);
\r
28 schedule_delayed_work(&(data->d_work), msecs_to_jiffies(delay_time));
\r
32 static int gpio_wave_probe(struct platform_device *pdev)
\r
35 struct wave_data *data;
\r
36 struct gpio_wave_platform_data *pdata = pdev->dev.platform_data;
\r
38 data = kmalloc(sizeof(struct wave_data), GFP_KERNEL);
\r
40 printk("func %s, line %d, malloc fail\n", __func__, __LINE__);
\r
44 data->dev = &pdev->dev;
\r
45 platform_set_drvdata(pdev, data);
\r
48 int dtime = pdata->Dvalue ? pdata->Htime : pdata->Ltime;
\r
49 data->gpio = pdata->gpio;
\r
50 data->cur_value = pdata->Dvalue;
\r
51 data->last_value = pdata->Dvalue;
\r
52 data->Htime = pdata->Htime;
\r
53 data->Ltime = pdata->Ltime;
\r
55 ret = gpio_request(data->gpio, NULL);
\r
57 printk("func %s, line %d, gpio request err\n", __func__, __LINE__);
\r
60 gpio_direction_output(data->gpio, data->cur_value);
\r
61 gpio_set_value(data->gpio, data->cur_value);
\r
62 wake_lock_init(&w_lock, WAKE_LOCK_SUSPEND, "gpio_wave");
\r
63 INIT_DELAYED_WORK(&(data->d_work), gpio_wave_dwork_handle);
\r
65 schedule_delayed_work(&(data->d_work), msecs_to_jiffies(dtime));
\r
74 static int gpio_wave_remove(struct platform_device *pdev)
\r
76 struct wave_data *data = platform_get_drvdata(pdev);
\r
77 gpio_free(data->gpio);
\r
82 static struct platform_driver gpio_wave_driver = {
\r
83 .probe = gpio_wave_probe,
\r
84 .remove = gpio_wave_remove,
\r
86 .owner = THIS_MODULE,
\r
87 .name = "gpio_wave",
\r
91 static int __init gpio_wave_init(void)
\r
93 return platform_driver_register(&gpio_wave_driver);
\r
96 static void __exit gpio_wave_exit(void)
\r
98 platform_driver_unregister(&gpio_wave_driver);
\r
102 module_init(gpio_wave_init);
\r
103 module_exit(gpio_wave_exit);
\r
105 MODULE_DESCRIPTION("Driver for gpio wave");
\r
106 MODULE_AUTHOR("lyx, lyx@rock-chips.com");
\r
107 MODULE_LICENSE("GPL");
\r