irqreturn_t ath_wdt_isr(int cpl, void *dev_id) { unsigned delay; extern int ath_gpio_in_val(int); #define UDELAY_COUNT 4000 wddbg("%s: invoked\n", __func__); for (delay = UDELAY_COUNT; delay; delay--) { if (ath_gpio_in_val(ATH_GPIO_RESET)) { break; } udelay(1000); } wddbg("%s: %d", __func__, delay); if (!delay) { wake_up(&wdt->wq); } else { extern void ath_restart(char *); ath_restart(NULL); } return IRQ_HANDLED; }
/* * Irq for front panel SW jumpstart switch * Connected to XSCALE through GPIO4 */ irqreturn_t jumpstart_irq(int cpl, void *dev_id) { unsigned int delay; if (atomic_read(&ath_fr_status)) { local_irq_disable(); #define UDELAY_COUNT 4000 for (delay = UDELAY_COUNT; delay; delay--) { if (ath_gpio_in_val(JUMPSTART_GPIO)) { break; } udelay(1000); } if (!delay) { atomic_dec(&ath_fr_status); /* * since we are going to reboot the board, we * don't need the interrupt handler anymore, * so disable it. */ disable_irq(ATH_GPIO_IRQn(JUMPSTART_GPIO)); wake_up(&ath_fr_wq); local_irq_enable(); return IRQ_HANDLED; } else { return (ath_simple_config_invoke_cb (0, 1, cpl)); } } else return (ath_simple_config_invoke_cb(1, 0, cpl)); }
static int gpio_simple_config_led_write(struct file *file, const char *buf, unsigned long count, void *data) { u_int32_t val; if (sscanf(buf, "%d", &val) != 1) return -EINVAL; if(val == SIMPLE_CONFIG_BLINK){ if( ath_gpio_in_val(WPS_LED_GPIO) == 0 ){ initial_led_state = WPS_LED_ON; }else{ initial_led_state = WPS_LED_OFF; } } if ((val == SIMPLE_CONFIG_BLINK) && !wps_led_blinking) { /* wps LED blinking */ wps_led_blinking = 1; simple_config_led_state = SIMPLE_CONFIG_BLINK; ath_gpio_out_val(WPS_LED_GPIO, WPS_LED_ON); OS_CANCEL_TIMER(&os_timer_t); OS_INIT_TIMER(NULL, &os_timer_t, wps_led_blink, &os_timer_t); OS_SET_TIMER(&os_timer_t, 1000); } else if (val == SIMPLE_CONFIG_FAIL) { /* WPS failed */ wps_led_blinking = 0; simple_config_led_state = SIMPLE_CONFIG_FAIL; ath_gpio_out_val(WPS_LED_GPIO, WPS_LED_ON); OS_CANCEL_TIMER(&os_timer_t); OS_INIT_TIMER(NULL, &os_timer_t, wps_led_fail, &os_timer_t); OS_SET_TIMER(&os_timer_t, 200); } else if (val == SIMPLE_CONFIG_ON) { /* WPS Success */ wps_led_blinking = 0; simple_config_led_state = SIMPLE_CONFIG_ON; OS_CANCEL_TIMER(&os_timer_t); ath_gpio_out_val(WPS_LED_GPIO, WPS_LED_ON); OS_INIT_TIMER(NULL, &os_timer_t, wps_led_success, &os_timer_t); OS_SET_TIMER(&os_timer_t, 120000); } else if (val == SIMPLE_CONFIG_OFF) { /* wps LED off */ wps_led_blinking = 0; simple_config_led_state = SIMPLE_CONFIG_OFF; OS_CANCEL_TIMER(&os_timer_t); ath_gpio_out_val(WPS_LED_GPIO, initial_led_state); } return count; }
/* ioctl for reset default detection and system led switch*/ int ar7240_gpio_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) { int i; int* argp = (int *)arg; if (_IOC_TYPE(cmd) != AR7240_GPIO_MAGIC || _IOC_NR(cmd) < AR7240_GPIO_IOCTL_BASE || _IOC_NR(cmd) > AR7240_GPIO_IOCTL_MAX) { printk("type:%d nr:%d\n", _IOC_TYPE(cmd), _IOC_NR(cmd)); printk("ar7240_gpio_ioctl:unknown command\n"); return -1; } switch (cmd) { case AR7240_GPIO_BTN_READ: *argp = counter; counter = 0; break; case AR7240_GPIO_LED_READ: printk("\n\n"); for (i = 0; i < ATH_GPIO_COUNT; i ++) { printk("pin%d: %d\n", i, ath_gpio_in_val(i)); } printk("\n"); #ifdef CONFIG_GPIO_DEBUG print_gpio_regs(""); #endif break; case AR7240_GPIO_LED_WRITE: if (unlikely(bBlockWps)) bBlockWps = 0; ath_gpio_out_val(SYS_LED_GPIO, *argp); /* PB92 use gpio 1 to config switch */ break; case AR7240_GPIO_USB_LED1_WRITE: #ifdef AP_USB_LED_GPIO ath_gpio_out_val(AP_USB_LED_GPIO, *argp); #endif break; case AR7240_GPIO_USB_1_LED1_WRITE: #ifdef AP_USB_1_LED_GPIO ath_gpio_out_val(AP_USB_1_LED_GPIO, *argp); #endif break; case AR7240_GPIO_USB_POWER_WRITE: #ifdef USB_POWER_SW_GPIO ath_gpio_out_val(USB_POWER_SW_GPIO, *argp); #endif break; case AR7240_GPIO_USB_1_POWER_WRITE: #ifdef USB_1_POWER_SW_GPIO ath_gpio_out_val(USB_1_POWER_SW_GPIO, *argp); #endif break; default: printk("command not supported\n"); return -1; } return 0; }