Changeset 12179


Ignore:
Timestamp:
2008-08-06T00:17:16+02:00 (10 years ago)
Author:
blogic
Message:

add proper uci/hotplug based button handling on atheros and work around boards, where the gpio release irq does not fire correctly

Location:
trunk/target/linux/atheros
Files:
5 added
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/target/linux/atheros/files/arch/mips/atheros/reset.c

    r12164 r12179  
    1919 
    2020static struct ar531x_boarddata *bcfg; 
     21static struct timer_list rst_button_timer; 
    2122 
    2223extern struct sock *uevent_sock; 
     
    7273} 
    7374 
     75static int no_release_workaround = 1; 
     76 
     77static void 
     78reset_button_poll(unsigned long unused) 
     79{ 
     80        struct event_t *event; 
     81        int gpio = ~0; 
     82 
     83        if(!no_release_workaround) 
     84                return; 
     85 
     86        DO_AR5315(gpio = sysRegRead(AR5315_GPIO_DI);) 
     87    gpio &= 1 << (AR531X_RESET_GPIO_IRQ - AR531X_GPIO_IRQ_BASE); 
     88        if(gpio) 
     89        { 
     90                rst_button_timer.expires = jiffies + (HZ / 4); 
     91                add_timer(&rst_button_timer); 
     92        } else { 
     93                event = (struct event_t *) kzalloc(sizeof(struct event_t), GFP_ATOMIC); 
     94                if (!event) 
     95                { 
     96                        printk("Could not alloc hotplug event\n"); 
     97                        return; 
     98                } 
     99                event->set = 0; 
     100                event->jiffies = jiffies; 
     101                INIT_WORK(&event->wq, (void *)(void *)hotplug_button); 
     102                schedule_work(&event->wq); 
     103        } 
     104} 
     105 
    74106static irqreturn_t button_handler(int irq, void *dev_id) 
    75107{ 
     
    88120 
    89121        event->set = gpio; 
     122        if(!event->set) 
     123                no_release_workaround = 0; 
     124 
    90125        event->jiffies = jiffies; 
    91126 
     
    94129 
    95130        seen = jiffies; 
    96  
     131        if(event->set && no_release_workaround) 
     132        { 
     133                rst_button_timer.expires = jiffies + (HZ / 4); 
     134                add_timer(&rst_button_timer); 
     135        } 
    97136        return IRQ_HANDLED; 
    98137} 
     
    111150        seen = jiffies; 
    112151 
     152        init_timer(&rst_button_timer); 
     153        rst_button_timer.function = reset_button_poll; 
     154        rst_button_timer.expires = jiffies + HZ / 50; 
     155        add_timer(&rst_button_timer); 
     156 
    113157        request_irq(AR531X_RESET_GPIO_IRQ, &button_handler, IRQF_SAMPLE_RANDOM, "ar531x_reset", NULL); 
    114158 
Note: See TracChangeset for help on using the changeset viewer.