1 #include <linux/wakelock.h>
2 #include <linux/workqueue.h>
3 #include <linux/interrupt.h>
5 #include <linux/gpio.h>
6 #include <mach/board.h>
8 #define WAKE_LOCK_TIMEOUT (10 * HZ)
10 static irqreturn_t usb_detect_irq_handler(int irq, void *dev_id);
11 static int detect_gpio = INVALID_GPIO;
13 static void usb_detect_do_wakeup(struct work_struct *work)
16 int irq = gpio_to_irq(detect_gpio);
19 rk28_send_wakeup_key();
20 type = gpio_get_value(detect_gpio) ? IRQ_TYPE_EDGE_FALLING : IRQ_TYPE_EDGE_RISING;
21 ret = irq_set_irq_type(irq, type);
23 pr_err("%s: irq_set_irq_type(%d, %d) failed\n", __func__, irq, type);
28 static DECLARE_DELAYED_WORK(wakeup_work, usb_detect_do_wakeup);
29 static bool wakelock_inited;
30 static struct wake_lock usb_wakelock;
32 static irqreturn_t usb_detect_irq_handler(int irq, void *dev_id)
34 disable_irq_nosync(irq); // for irq debounce
35 wake_lock_timeout(&usb_wakelock, WAKE_LOCK_TIMEOUT);
36 schedule_delayed_work(&wakeup_work, HZ / 10);
40 int __init board_usb_detect_init(unsigned gpio)
43 int irq = gpio_to_irq(gpio);
46 if (detect_gpio != INVALID_GPIO) {
47 pr_err("only support call %s once\n", __func__);
51 ret = gpio_request(gpio, "usb_detect");
53 pr_err("%s: gpio_request(%d) failed\n", __func__, gpio);
57 if (!wakelock_inited) {
58 wake_lock_init(&usb_wakelock, WAKE_LOCK_SUSPEND, "usb_detect");
59 wakelock_inited = true;
62 gpio_direction_input(gpio);
66 flags = gpio_get_value(gpio) ? IRQF_TRIGGER_FALLING : IRQF_TRIGGER_RISING;
67 ret = request_irq(irq, usb_detect_irq_handler, flags, "usb_detect", NULL);
69 pr_err("%s: request_irq(%d) failed\n", __func__, irq);
71 detect_gpio = INVALID_GPIO;
81 #include <mach/iomux.h>
83 static irqreturn_t bvalid_irq_handler(int irq, void *dev_id)
86 #ifdef CONFIG_ARCH_RK2928
87 writel_relaxed((1 << 31) | (1 << 15), RK2928_GRF_BASE + GRF_UOC0_CON5);
88 #ifdef CONFIG_RK_USB_UART
89 /* usb otg dp/dm switch to usb phy */
90 writel_relaxed((3 << (12 + 16)),RK2928_GRF_BASE + GRF_UOC1_CON4);
92 #elif defined(CONFIG_ARCH_RK3188)
93 writel_relaxed((1 << 31) | (1 << 15), RK30_GRF_BASE + GRF_UOC0_CON3);
94 #ifdef CONFIG_RK_USB_UART
95 /* usb otg dp/dm switch to usb phy */
96 writel_relaxed((0x0300 << 16), RK30_GRF_BASE + GRF_UOC0_CON0);
100 #ifdef CONFIG_RK_USB_DETECT_BY_OTG_BVALID
101 wake_lock_timeout(&usb_wakelock, WAKE_LOCK_TIMEOUT);
102 rk28_send_wakeup_key();
108 static int __init bvalid_init(void)
111 int irq = IRQ_OTG_BVALID;
113 #ifndef CONFIG_RK_USB_UART
114 if (detect_gpio != INVALID_GPIO) {
115 printk("usb detect inited by board_usb_detect_init, disable detect by bvalid irq\n");
120 #ifdef CONFIG_RK_USB_DETECT_BY_OTG_BVALID
121 if (!wakelock_inited) {
122 wake_lock_init(&usb_wakelock, WAKE_LOCK_SUSPEND, "usb_detect");
123 wakelock_inited = true;
127 ret = request_irq(irq, bvalid_irq_handler, 0, "bvalid", NULL);
129 pr_err("%s: request_irq(%d) failed\n", __func__, irq);
133 /* clear & enable bvalid irq */
134 #ifdef CONFIG_ARCH_RK2928
135 writel_relaxed((3 << 30) | (3 << 14), RK2928_GRF_BASE + GRF_UOC0_CON5);
136 #elif defined(CONFIG_ARCH_RK3188)
137 writel_relaxed((3 << 30) | (3 << 14), RK30_GRF_BASE + GRF_UOC0_CON3);
140 #ifdef CONFIG_RK_USB_DETECT_BY_OTG_BVALID
141 enable_irq_wake(irq);
146 late_initcall(bvalid_init);