source: trunk/target/linux/generic-2.6/patches-2.6.33/924-cs5535_gpio.patch @ 21217

Last change on this file since 21217 was 21217, checked in by acoul, 6 years ago

[generic-2.6] refresh kernel patches

File size: 2.8 KB
  • drivers/char/cs5535_gpio.c

    a b  
    1515#include <linux/kernel.h> 
    1616#include <linux/init.h> 
    1717#include <linux/cdev.h> 
     18#include <linux/device.h> 
    1819#include <linux/ioport.h> 
    1920#include <linux/pci.h> 
    2021 
    static struct pci_device_id divil_pci[] 
    4849MODULE_DEVICE_TABLE(pci, divil_pci); 
    4950 
    5051static struct cdev cs5535_gpio_cdev; 
     52static struct class *cs5535_gpio_class; 
    5153 
    5254/* reserve 32 entries even though some aren't usable */ 
    5355#define CS5535_GPIO_COUNT       32 
    static struct gpio_regmap rm[] = 
    6668        { 0x30, 0x00, '1', '0' },       /* GPIOx_READ_BACK / GPIOx_OUT_VAL */ 
    6769        { 0x20, 0x20, 'I', 'i' },       /* GPIOx_IN_EN */ 
    6870        { 0x04, 0x04, 'O', 'o' },       /* GPIOx_OUT_EN */ 
     71        { 0x10, 0x10, 'A', 'a' },       /* GPIOx_OUT_AUX1_SEL */ 
     72        { 0x14, 0x14, 'B', 'b' },       /* GPIOx_OUT_AUX2_SEL */ 
    6973        { 0x08, 0x08, 't', 'T' },       /* GPIOx_OUT_OD_EN */ 
    7074        { 0x18, 0x18, 'P', 'p' },       /* GPIOx_OUT_PU_EN */ 
    7175        { 0x1c, 0x1c, 'D', 'd' },       /* GPIOx_OUT_PD_EN */ 
     76        { 0x24, 0x24, 'N', 'n' },       /* GPIOx_IN_INV_EN */ 
     77        { 0x0c, 0x0c, 'X', 'x' },       /* GPIOx_OUT_INV_EN */ 
     78        { 0x00, 0x00, 'H', 'L' },       /* GPIOx_OUT_VAL */ 
    7279}; 
    7380 
    7481 
    static int __init cs5535_gpio_init(void) 
    176183{ 
    177184        dev_t   dev_id; 
    178185        u32     low, hi; 
    179         int     retval; 
     186        int     retval, i; 
    180187 
    181188        if (pci_dev_present(divil_pci) == 0) { 
    182189                printk(KERN_WARNING NAME ": DIVIL not found\n"); 
    static int __init cs5535_gpio_init(void) 
    231238                major = MAJOR(dev_id); 
    232239        } 
    233240 
    234         if (retval) { 
    235                 release_region(gpio_base, CS5535_GPIO_SIZE); 
    236                 return -1; 
    237         } 
     241        if (retval) 
     242                goto error; 
    238243 
    239244        printk(KERN_DEBUG NAME ": base=%#x mask=%#lx major=%d\n", 
    240245               gpio_base, mask, major); 
    241246 
    242247        cdev_init(&cs5535_gpio_cdev, &cs5535_gpio_fops); 
    243         cdev_add(&cs5535_gpio_cdev, dev_id, CS5535_GPIO_COUNT); 
     248        retval = cdev_add(&cs5535_gpio_cdev, dev_id, CS5535_GPIO_COUNT); 
     249        if (retval) { 
     250                kobject_put(&cs5535_gpio_cdev.kobj); 
     251                goto error_region; 
     252        } 
     253 
     254        cs5535_gpio_class = class_create(THIS_MODULE, "cs5535_gpio"); 
     255        if (IS_ERR(cs5535_gpio_class)) { 
     256                printk(KERN_ERR "Error creating cs5535_gpio class\n"); 
     257                cdev_del(&cs5535_gpio_cdev); 
     258                retval = PTR_ERR(cs5535_gpio_class); 
     259                goto error_region; 
     260        } 
     261 
     262        for (i = 0; i < CS5535_GPIO_COUNT; i++) { 
     263                if (mask & (1<<i)) { 
     264                        device_create(cs5535_gpio_class, NULL, MKDEV(major, i), NULL, "cs5535_gpio%d", i); 
     265                } 
     266        } 
    244267 
    245268        return 0; 
     269 
     270error_region: 
     271        unregister_chrdev_region(dev_id, CS5535_GPIO_COUNT); 
     272error: 
     273        release_region(gpio_base, CS5535_GPIO_SIZE); 
     274        return retval; 
    246275} 
    247276 
    248277static void __exit cs5535_gpio_cleanup(void) 
    249278{ 
    250279        dev_t dev_id = MKDEV(major, 0); 
     280        int i; 
     281 
     282        for (i = 0; i < CS5535_GPIO_COUNT; i++) { 
     283                if (mask & (1<<i)) { 
     284                        device_destroy(cs5535_gpio_class, MKDEV(major, i)); 
     285                } 
     286        } 
     287 
     288        class_destroy(cs5535_gpio_class); 
    251289 
    252290        cdev_del(&cs5535_gpio_cdev); 
    253291        unregister_chrdev_region(dev_id, CS5535_GPIO_COUNT); 
Note: See TracBrowser for help on using the repository browser.