source: trunk/target/linux/generic-2.6/patches-2.6.29/924-cs5535_gpio.patch @ 15251

Last change on this file since 15251 was 15251, checked in by nbd, 7 years ago

add generic 2.6.29 patches and config (squashfs still untested, user space mkfs still missing)

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#include <linux/smp_lock.h> 
    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) 
    177184{ 
    178185        dev_t   dev_id; 
    179186        u32     low, hi; 
    180         int     retval; 
     187        int     retval, i; 
    181188 
    182189        if (pci_dev_present(divil_pci) == 0) { 
    183190                printk(KERN_WARNING NAME ": DIVIL not found\n"); 
    static int __init cs5535_gpio_init(void) 
    232239                major = MAJOR(dev_id); 
    233240        } 
    234241 
    235         if (retval) { 
    236                 release_region(gpio_base, CS5535_GPIO_SIZE); 
    237                 return -1; 
    238         } 
     242        if (retval) 
     243                goto error; 
    239244 
    240245        printk(KERN_DEBUG NAME ": base=%#x mask=%#lx major=%d\n", 
    241246               gpio_base, mask, major); 
    242247 
    243248        cdev_init(&cs5535_gpio_cdev, &cs5535_gpio_fops); 
    244         cdev_add(&cs5535_gpio_cdev, dev_id, CS5535_GPIO_COUNT); 
     249        retval = cdev_add(&cs5535_gpio_cdev, dev_id, CS5535_GPIO_COUNT); 
     250        if (retval) { 
     251                kobject_put(&cs5535_gpio_cdev.kobj); 
     252                goto error_region; 
     253        } 
     254 
     255        cs5535_gpio_class = class_create(THIS_MODULE, "cs5535_gpio"); 
     256        if (IS_ERR(cs5535_gpio_class)) { 
     257                printk(KERN_ERR "Error creating cs5535_gpio class\n"); 
     258                cdev_del(&cs5535_gpio_cdev); 
     259                retval = PTR_ERR(cs5535_gpio_class); 
     260                goto error_region; 
     261        } 
     262 
     263        for (i = 0; i < CS5535_GPIO_COUNT; i++) { 
     264                if (mask & (1<<i)) { 
     265                        device_create(cs5535_gpio_class, NULL, MKDEV(major, i), NULL, "cs5535_gpio%d", i); 
     266                } 
     267        } 
    245268 
    246269        return 0; 
     270 
     271error_region: 
     272        unregister_chrdev_region(dev_id, CS5535_GPIO_COUNT); 
     273error: 
     274        release_region(gpio_base, CS5535_GPIO_SIZE); 
     275        return retval; 
    247276} 
    248277 
    249278static void __exit cs5535_gpio_cleanup(void) 
    250279{ 
    251280        dev_t dev_id = MKDEV(major, 0); 
     281        int i; 
     282 
     283        for (i = 0; i < CS5535_GPIO_COUNT; i++) { 
     284                if (mask & (1<<i)) { 
     285                        device_destroy(cs5535_gpio_class, MKDEV(major, i)); 
     286                } 
     287        } 
     288 
     289        class_destroy(cs5535_gpio_class); 
    252290 
    253291        cdev_del(&cs5535_gpio_cdev); 
    254292        unregister_chrdev_region(dev_id, CS5535_GPIO_COUNT); 
Note: See TracBrowser for help on using the repository browser.