Ignore:
Timestamp:
2010-03-25T12:50:46+01:00 (7 years ago)
Author:
blogic
Message:

[ifxmips] implement gpiolib drivers for core gpio and ebu attached latches

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/target/linux/ifxmips/files/arch/mips/ifxmips/gpio.c

    r18010 r20418  
    3737#include <linux/uaccess.h> 
    3838#include <linux/semaphore.h> 
     39#include <linux/gpio.h> 
    3940 
    4041#include <net/sock.h> 
     
    4546#define PINS_PER_PORT           16 
    4647 
    47 #ifdef CONFIG_IFXMIPS_GPIO_RST_BTN 
    48  
    49 unsigned int rst_port = 1; 
    50 unsigned int rst_pin = 15; 
    51 static struct timer_list rst_button_timer; 
    52  
    53 extern struct sock *uevent_sock; 
    54 extern u64 uevent_next_seqnum(void); 
    55 static unsigned long seen; 
    56 static int pressed; 
    57  
    58 struct event_t { 
    59         struct work_struct wq; 
    60         int set; 
    61         unsigned long jiffies; 
    62 }; 
    63 #endif 
    64  
    6548#define IFXMIPS_GPIO_SANITY             {if (port > MAX_PORTS || pin > PINS_PER_PORT) return -EINVAL; } 
    6649 
    67 int ifxmips_port_reserve_pin(unsigned int port, unsigned int pin) 
     50#define GPIO_TO_PORT(x) ((x > 15) ? (1) : (0)) 
     51#define GPIO_TO_GPIO(x) ((x > 15) ? (x - 16) : (x)) 
     52 
     53int 
     54ifxmips_port_reserve_pin(unsigned int port, unsigned int pin) 
    6855{ 
    6956        IFXMIPS_GPIO_SANITY; 
     
    7360EXPORT_SYMBOL(ifxmips_port_reserve_pin); 
    7461 
    75 int ifxmips_port_free_pin(unsigned int port, unsigned int pin) 
     62int 
     63ifxmips_port_free_pin(unsigned int port, unsigned int pin) 
    7664{ 
    7765        IFXMIPS_GPIO_SANITY; 
     
    8169EXPORT_SYMBOL(ifxmips_port_free_pin); 
    8270 
    83 int ifxmips_port_set_open_drain(unsigned int port, unsigned int pin) 
     71int 
     72ifxmips_port_set_open_drain(unsigned int port, unsigned int pin) 
    8473{ 
    8574        IFXMIPS_GPIO_SANITY; 
     
    9079EXPORT_SYMBOL(ifxmips_port_set_open_drain); 
    9180 
    92 int ifxmips_port_clear_open_drain(unsigned int port, unsigned int pin) 
     81int 
     82ifxmips_port_clear_open_drain(unsigned int port, unsigned int pin) 
    9383{ 
    9484        IFXMIPS_GPIO_SANITY; 
     
    9989EXPORT_SYMBOL(ifxmips_port_clear_open_drain); 
    10090 
    101 int ifxmips_port_set_pudsel(unsigned int port, unsigned int pin) 
     91int 
     92ifxmips_port_set_pudsel(unsigned int port, unsigned int pin) 
    10293{ 
    10394        IFXMIPS_GPIO_SANITY; 
     
    10899EXPORT_SYMBOL(ifxmips_port_set_pudsel); 
    109100 
    110 int ifxmips_port_clear_pudsel(unsigned int port, unsigned int pin) 
     101int 
     102ifxmips_port_clear_pudsel(unsigned int port, unsigned int pin) 
    111103{ 
    112104        IFXMIPS_GPIO_SANITY; 
     
    117109EXPORT_SYMBOL(ifxmips_port_clear_pudsel); 
    118110 
    119 int ifxmips_port_set_puden(unsigned int port, unsigned int pin) 
     111int 
     112ifxmips_port_set_puden(unsigned int port, unsigned int pin) 
    120113{ 
    121114        IFXMIPS_GPIO_SANITY; 
     
    126119EXPORT_SYMBOL(ifxmips_port_set_puden); 
    127120 
    128 int ifxmips_port_clear_puden(unsigned int port, unsigned int pin) 
     121int 
     122ifxmips_port_clear_puden(unsigned int port, unsigned int pin) 
    129123{ 
    130124        IFXMIPS_GPIO_SANITY; 
     
    135129EXPORT_SYMBOL(ifxmips_port_clear_puden); 
    136130 
    137 int ifxmips_port_set_stoff(unsigned int port, unsigned int pin) 
     131int 
     132ifxmips_port_set_stoff(unsigned int port, unsigned int pin) 
    138133{ 
    139134        IFXMIPS_GPIO_SANITY; 
     
    144139EXPORT_SYMBOL(ifxmips_port_set_stoff); 
    145140 
    146 int ifxmips_port_clear_stoff(unsigned int port, unsigned int pin) 
     141int 
     142ifxmips_port_clear_stoff(unsigned int port, unsigned int pin) 
    147143{ 
    148144        IFXMIPS_GPIO_SANITY; 
     
    153149EXPORT_SYMBOL(ifxmips_port_clear_stoff); 
    154150 
    155 int ifxmips_port_set_dir_out(unsigned int port, unsigned int pin) 
     151int 
     152ifxmips_port_set_dir_out(unsigned int port, unsigned int pin) 
    156153{ 
    157154        IFXMIPS_GPIO_SANITY; 
     
    162159EXPORT_SYMBOL(ifxmips_port_set_dir_out); 
    163160 
    164 int ifxmips_port_set_dir_in(unsigned int port, unsigned int pin) 
     161int 
     162ifxmips_port_set_dir_in(unsigned int port, unsigned int pin) 
    165163{ 
    166164        IFXMIPS_GPIO_SANITY; 
     
    171169EXPORT_SYMBOL(ifxmips_port_set_dir_in); 
    172170 
    173 int ifxmips_port_set_output(unsigned int port, unsigned int pin) 
     171int 
     172ifxmips_port_set_output(unsigned int port, unsigned int pin) 
    174173{ 
    175174        IFXMIPS_GPIO_SANITY; 
     
    180179EXPORT_SYMBOL(ifxmips_port_set_output); 
    181180 
    182 int ifxmips_port_clear_output(unsigned int port, unsigned int pin) 
     181int 
     182ifxmips_port_clear_output(unsigned int port, unsigned int pin) 
    183183{ 
    184184        IFXMIPS_GPIO_SANITY; 
     
    189189EXPORT_SYMBOL(ifxmips_port_clear_output); 
    190190 
    191 int ifxmips_port_get_input(unsigned int port, unsigned int pin) 
     191int 
     192ifxmips_port_get_input(unsigned int port, unsigned int pin) 
    192193{ 
    193194        IFXMIPS_GPIO_SANITY; 
     
    199200EXPORT_SYMBOL(ifxmips_port_get_input); 
    200201 
    201 int ifxmips_port_set_altsel0(unsigned int port, unsigned int pin) 
     202int 
     203ifxmips_port_set_altsel0(unsigned int port, unsigned int pin) 
    202204{ 
    203205        IFXMIPS_GPIO_SANITY; 
     
    208210EXPORT_SYMBOL(ifxmips_port_set_altsel0); 
    209211 
    210 int ifxmips_port_clear_altsel0(unsigned int port, unsigned int pin) 
     212int 
     213ifxmips_port_clear_altsel0(unsigned int port, unsigned int pin) 
    211214{ 
    212215        IFXMIPS_GPIO_SANITY; 
     
    217220EXPORT_SYMBOL(ifxmips_port_clear_altsel0); 
    218221 
    219 int ifxmips_port_set_altsel1(unsigned int port, unsigned int pin) 
     222int 
     223ifxmips_port_set_altsel1(unsigned int port, unsigned int pin) 
    220224{ 
    221225        IFXMIPS_GPIO_SANITY; 
     
    226230EXPORT_SYMBOL(ifxmips_port_set_altsel1); 
    227231 
    228 int ifxmips_port_clear_altsel1(unsigned int port, unsigned int pin) 
     232int 
     233ifxmips_port_clear_altsel1(unsigned int port, unsigned int pin) 
    229234{ 
    230235        IFXMIPS_GPIO_SANITY; 
     
    235240EXPORT_SYMBOL(ifxmips_port_clear_altsel1); 
    236241 
    237 #ifdef CONFIG_IFXMIPS_GPIO_RST_BTN 
    238 static inline void add_msg(struct sk_buff *skb, char *msg) 
    239 { 
    240         char *scratch; 
    241         scratch = skb_put(skb, strlen(msg) + 1); 
    242         sprintf(scratch, msg); 
    243 } 
    244  
    245 static void hotplug_button(struct work_struct *wq) 
    246 { 
    247         struct sk_buff *skb; 
    248         struct event_t *event; 
    249         size_t len; 
    250         char *scratch, *s; 
    251         char buf[128]; 
    252  
    253         event = container_of(wq, struct event_t, wq); 
    254         if (!uevent_sock) 
    255                 goto done; 
    256  
    257         s = event->set ? "pressed" : "released"; 
    258         len = strlen(s) + 2; 
    259         skb = alloc_skb(len + 2048, GFP_KERNEL); 
    260         if (!skb) 
    261                 goto done; 
    262  
    263         scratch = skb_put(skb, len); 
    264         sprintf(scratch, "%s@", s); 
    265         add_msg(skb, "HOME=/"); 
    266         add_msg(skb, "PATH=/sbin:/bin:/usr/sbin:/usr/bin"); 
    267         add_msg(skb, "SUBSYSTEM=button"); 
    268         add_msg(skb, "BUTTON=reset"); 
    269         add_msg(skb, (event->set ? "ACTION=pressed" : "ACTION=released")); 
    270         sprintf(buf, "SEEN=%ld", (event->jiffies - seen)/HZ); 
    271         add_msg(skb, buf); 
    272         snprintf(buf, 128, "SEQNUM=%llu", uevent_next_seqnum()); 
    273         add_msg(skb, buf); 
    274  
    275         NETLINK_CB(skb).dst_group = 1; 
    276         netlink_broadcast(uevent_sock, skb, 0, 1, GFP_KERNEL); 
    277 done: 
    278         kfree(event); 
    279 } 
    280  
    281 static void reset_button_poll(unsigned long unused) 
    282 { 
    283         struct event_t *event; 
    284  
    285         rst_button_timer.expires = jiffies + (HZ / 4); 
    286         add_timer(&rst_button_timer); 
    287  
    288         if (pressed != ifxmips_port_get_input(rst_port, rst_pin)) { 
    289                 if (pressed) 
    290                         pressed = 0; 
    291                 else 
    292                         pressed = 1; 
    293                 event = kzalloc(sizeof(struct event_t), GFP_ATOMIC); 
    294                 if (!event) { 
    295                         printk(KERN_INFO "Could not alloc hotplug event\n"); 
    296                         return; 
    297                 } 
    298                 event->set = pressed; 
    299                 event->jiffies = jiffies; 
    300                 INIT_WORK(&event->wq, (void *)(void *)hotplug_button); 
    301                 schedule_work(&event->wq); 
    302                 seen = jiffies; 
    303         } 
    304 } 
    305 #endif 
    306  
    307 static int ifxmips_gpio_probe(struct platform_device *dev) 
    308 { 
    309         int retval = 0; 
    310  
    311 #ifdef CONFIG_IFXMIPS_GPIO_RST_BTN 
    312         rst_port = dev->resource[0].start; 
    313         rst_pin = dev->resource[0].end; 
    314         ifxmips_port_set_open_drain(rst_port, rst_pin); 
    315         ifxmips_port_clear_altsel0(rst_port, rst_pin); 
    316         ifxmips_port_clear_altsel1(rst_port, rst_pin); 
    317         ifxmips_port_set_dir_in(rst_port, rst_pin); 
    318         seen = jiffies; 
    319         init_timer(&rst_button_timer); 
    320         rst_button_timer.function = reset_button_poll; 
    321         rst_button_timer.expires = jiffies + HZ; 
    322         add_timer(&rst_button_timer); 
    323 #endif 
    324         return retval; 
    325 } 
    326  
    327 static int ifxmips_gpio_remove(struct platform_device *pdev) 
    328 { 
    329 #ifdef CONFIG_IFXMIPS_GPIO_RST_BTN 
    330         del_timer_sync(&rst_button_timer); 
    331 #endif 
    332         return 0; 
    333 } 
    334  
    335 static struct platform_driver ifxmips_gpio_driver = { 
     242static void 
     243ifxmips_gpio_set(struct gpio_chip *chip, unsigned int offset, int value) 
     244{ 
     245        int port = GPIO_TO_PORT(offset); 
     246        int gpio = GPIO_TO_GPIO(offset); 
     247        if(value) 
     248                ifxmips_port_set_output(port, gpio); 
     249        else 
     250                ifxmips_port_clear_output(port, gpio); 
     251} 
     252 
     253static int 
     254ifxmips_gpio_get(struct gpio_chip *chip, unsigned int offset) 
     255{ 
     256        int port = GPIO_TO_PORT(offset); 
     257        int gpio = GPIO_TO_GPIO(offset); 
     258        return ifxmips_port_get_input(port, gpio); 
     259} 
     260 
     261static int 
     262ifxmips_gpio_direction_input(struct gpio_chip *chip, unsigned int offset) 
     263{ 
     264        int port = GPIO_TO_PORT(offset); 
     265        int gpio = GPIO_TO_GPIO(offset); 
     266        ifxmips_port_set_open_drain(port, gpio); 
     267        ifxmips_port_clear_altsel0(port, gpio); 
     268        ifxmips_port_clear_altsel1(port, gpio); 
     269        ifxmips_port_set_dir_in(port, gpio); 
     270        return 0; 
     271} 
     272 
     273static int 
     274ifxmips_gpio_direction_output(struct gpio_chip *chip, unsigned int offset, int value) 
     275{ 
     276        int port = GPIO_TO_PORT(offset); 
     277        int gpio = GPIO_TO_GPIO(offset); 
     278        ifxmips_port_clear_open_drain(port, gpio); 
     279        ifxmips_port_clear_altsel0(port, gpio); 
     280        ifxmips_port_clear_altsel1(port, gpio); 
     281        ifxmips_port_set_dir_out(port, gpio); 
     282        ifxmips_gpio_set(chip, offset, value); 
     283        return 0; 
     284} 
     285 
     286int 
     287gpio_to_irq(unsigned int gpio) 
     288{ 
     289        return -EINVAL; 
     290} 
     291EXPORT_SYMBOL(gpio_to_irq); 
     292 
     293struct gpio_chip 
     294ifxmips_gpio_chip = 
     295{ 
     296        .label = "ifxmips-gpio", 
     297        .direction_input = ifxmips_gpio_direction_input, 
     298        .direction_output = ifxmips_gpio_direction_output, 
     299        .get = ifxmips_gpio_get, 
     300        .set = ifxmips_gpio_set, 
     301        .base = 0, 
     302        .ngpio = 32, 
     303}; 
     304 
     305static int 
     306ifxmips_gpio_probe(struct platform_device *dev) 
     307{ 
     308        gpiochip_add(&ifxmips_gpio_chip); 
     309        return 0; 
     310} 
     311 
     312static int 
     313ifxmips_gpio_remove(struct platform_device *pdev) 
     314{ 
     315        gpiochip_remove(&ifxmips_gpio_chip); 
     316        return 0; 
     317} 
     318 
     319static struct platform_driver 
     320ifxmips_gpio_driver = { 
    336321        .probe = ifxmips_gpio_probe, 
    337322        .remove = ifxmips_gpio_remove, 
     
    342327}; 
    343328 
    344 int __init ifxmips_gpio_init(void) 
     329int __init 
     330ifxmips_gpio_init(void) 
    345331{ 
    346332        int ret = platform_driver_register(&ifxmips_gpio_driver); 
     
    350336} 
    351337 
    352 void __exit ifxmips_gpio_exit(void) 
     338void __exit 
     339ifxmips_gpio_exit(void) 
    353340{ 
    354341        platform_driver_unregister(&ifxmips_gpio_driver); 
Note: See TracChangeset for help on using the changeset viewer.