#include <linux/mtk23d.h>
#endif
+#ifdef CONFIG_USE_GPIO_GENERATE_WAVE
+#include "../../../drivers/testcode/gpio_wave.h"
+#endif
+
#include "../../../drivers/headset_observe/rk_headset.h"
/*set touchscreen different type header*/
#if defined(CONFIG_TOUCHSCREEN_XPT2046_NORMAL_SPI)
#elif defined(CONFIG_TOUCHSCREEN_XPT2046_CBN_SPI)
#include "../../../drivers/input/touchscreen/xpt2046_cbn_ts.h"
#endif
-
#include "../../../drivers/misc/gps/rk29_gps.h"
#include "../../../drivers/serial/sc8800.h"
#ifdef CONFIG_VIDEO_RK29
};
#endif
+#ifdef CONFIG_USE_GPIO_GENERATE_WAVE
+static struct gpio_wave_platform_data gpio_wave_pdata = {
+ .gpio = RK29_PIN0_PA0,
+ .Htime = 2000,
+ .Ltime = 300,
+ .Dvalue = GPIO_HIGH,
+};
+static struct platform_device gpio_wave_device = {
+ .name = "gpio_wave",
+ .id = -1,
+ .dev = {
+ .platform_data = &gpio_wave_pdata,
+ },
+};
+#endif
+
static void __init rk29_board_iomux_init(void)
{
#ifdef CONFIG_RK29_PWM_REGULATOR
#ifdef CONFIG_KEYS_RK29
&rk29_device_keys,
#endif
+#ifdef CONFIG_USE_GPIO_GENERATE_WAVE
+ &gpio_wave_device,
+#endif
#ifdef CONFIG_SDMMC0_RK29
&rk29_device_sdmmc0,
#endif
--- /dev/null
+#include <linux/delay.h>\r
+#include <linux/platform_device.h>\r
+#include <linux/clk.h>\r
+#include <mach/gpio.h>\r
+#include <linux/wakelock.h>\r
+\r
+#include "gpio_wave.h"\r
+\r
+struct wave_data {\r
+ struct delayed_work d_work;\r
+ int Htime;\r
+ int Ltime;\r
+ unsigned int gpio;\r
+ int cur_value;\r
+ int last_value;\r
+ struct device *dev; \r
+};\r
+\r
+static struct wake_lock w_lock;\r
+\r
+static void gpio_wave_dwork_handle(struct work_struct *work)\r
+{\r
+ struct wave_data *data = (struct wave_data *)container_of(work, struct wave_data, d_work.work);\r
+ \r
+ int delay_time = data->cur_value ? data->Ltime : data->Htime;\r
+ data->cur_value = !data->cur_value;\r
+ gpio_set_value(data->gpio, data->cur_value);\r
+ schedule_delayed_work(&(data->d_work), msecs_to_jiffies(delay_time));\r
+}\r
+\r
+\r
+static int gpio_wave_probe(struct platform_device *pdev)\r
+{\r
+ int ret;\r
+ struct wave_data *data;\r
+ struct gpio_wave_platform_data *pdata = pdev->dev.platform_data;\r
+\r
+ data = kmalloc(sizeof(struct wave_data), GFP_KERNEL);\r
+ if (!data) {\r
+ printk("func %s, line %d, malloc fail\n", __func__, __LINE__);\r
+ return -ENOMEM;\r
+ }\r
+\r
+ data->dev = &pdev->dev;\r
+ platform_set_drvdata(pdev, data);\r
+ \r
+ if (pdata) {\r
+ int dtime = pdata->Dvalue ? pdata->Htime : pdata->Ltime;\r
+ data->gpio = pdata->gpio;\r
+ data->cur_value = pdata->Dvalue;\r
+ data->last_value = pdata->Dvalue;\r
+ data->Htime = pdata->Htime;\r
+ data->Ltime = pdata->Ltime;\r
+ \r
+ ret = gpio_request(data->gpio, NULL);\r
+ if (ret) {\r
+ printk("func %s, line %d, gpio request err\n", __func__, __LINE__);\r
+ return ret;\r
+ }\r
+ gpio_direction_output(data->gpio, data->cur_value);\r
+ gpio_set_value(data->gpio, data->cur_value);\r
+ wake_lock_init(&w_lock, WAKE_LOCK_SUSPEND, "gpio_wave");\r
+ INIT_DELAYED_WORK(&(data->d_work), gpio_wave_dwork_handle);\r
+ wake_lock(&w_lock);\r
+ schedule_delayed_work(&(data->d_work), msecs_to_jiffies(dtime));\r
+ }\r
+ else {\r
+ kfree(data);\r
+ }\r
+ \r
+ return 0;\r
+}\r
+\r
+static int gpio_wave_remove(struct platform_device *pdev)\r
+{\r
+ struct wave_data *data = platform_get_drvdata(pdev);\r
+ gpio_free(data->gpio);\r
+ kfree(data);\r
+ return 0;\r
+}\r
+\r
+static struct platform_driver gpio_wave_driver = {\r
+ .probe = gpio_wave_probe,\r
+ .remove = gpio_wave_remove,\r
+ .driver = {\r
+ .owner = THIS_MODULE,\r
+ .name = "gpio_wave",\r
+ },\r
+};\r
+\r
+static int __init gpio_wave_init(void)\r
+{\r
+ return platform_driver_register(&gpio_wave_driver);\r
+}\r
+\r
+static void __exit gpio_wave_exit(void)\r
+{\r
+ platform_driver_unregister(&gpio_wave_driver);\r
+}\r
+\r
+\r
+module_init(gpio_wave_init);\r
+module_exit(gpio_wave_exit);\r
+\r
+MODULE_DESCRIPTION("Driver for gpio wave");\r
+MODULE_AUTHOR("lyx, lyx@rock-chips.com");\r
+MODULE_LICENSE("GPL");\r
+\r