···11/*22 * Include file for NEC VR4100 series General-purpose I/O Unit.33 *44- * Copyright (C) 2005 Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp>44+ * Copyright (C) 2005-2009 Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp>55 *66 * This program is free software; you can redistribute it and/or modify77 * it under the terms of the GNU General Public License as published by···4141 IRQ_SIGNAL_HOLD,4242} irq_signal_t;43434444-extern void vr41xx_set_irq_trigger(unsigned int pin, irq_trigger_t trigger, irq_signal_t signal);4444+extern void vr41xx_set_irq_trigger(unsigned int pin, irq_trigger_t trigger,4545+ irq_signal_t signal);45464647typedef enum {4748 IRQ_LEVEL_LOW,···5049} irq_level_t;51505251extern void vr41xx_set_irq_level(unsigned int pin, irq_level_t level);5353-5454-typedef enum {5555- GPIO_DATA_LOW,5656- GPIO_DATA_HIGH,5757- GPIO_DATA_INVAL,5858-} gpio_data_t;5959-6060-extern gpio_data_t vr41xx_gpio_get_pin(unsigned int pin);6161-extern int vr41xx_gpio_set_pin(unsigned int pin, gpio_data_t data);6262-6363-typedef enum {6464- GPIO_INPUT,6565- GPIO_OUTPUT,6666- GPIO_OUTPUT_DISABLE,6767-} gpio_direction_t;6868-6969-extern int vr41xx_gpio_set_direction(unsigned int pin, gpio_direction_t dir);70527153typedef enum {7254 GPIO_PULL_DOWN,
-4
drivers/char/Kconfig
···1029102910301030 If compiled as a module, it will be called cs5535_gpio.1031103110321032-config GPIO_VR41XX10331033- tristate "NEC VR4100 series General-purpose I/O Unit support"10341034- depends on CPU_VR41XX10351035-10361032config RAW_DRIVER10371033 tristate "RAW driver (/dev/raw/rawN)"10381034 depends on BLOCK
···11-/*22- * Driver for NEC VR4100 series General-purpose I/O Unit.33- *44- * Copyright (C) 2002 MontaVista Software Inc.55- * Author: Yoichi Yuasa <yyuasa@mvista.com or source@mvista.com>66- * Copyright (C) 2003-2007 Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp>77- *88- * This program is free software; you can redistribute it and/or modify99- * it under the terms of the GNU General Public License as published by1010- * the Free Software Foundation; either version 2 of the License, or1111- * (at your option) any later version.1212- *1313- * This program is distributed in the hope that it will be useful,1414- * but WITHOUT ANY WARRANTY; without even the implied warranty of1515- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the1616- * GNU General Public License for more details.1717- *1818- * You should have received a copy of the GNU General Public License1919- * along with this program; if not, write to the Free Software2020- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA2121- */2222-#include <linux/errno.h>2323-#include <linux/fs.h>2424-#include <linux/init.h>2525-#include <linux/interrupt.h>2626-#include <linux/irq.h>2727-#include <linux/kernel.h>2828-#include <linux/module.h>2929-#include <linux/platform_device.h>3030-#include <linux/smp_lock.h>3131-#include <linux/spinlock.h>3232-#include <linux/types.h>3333-3434-#include <asm/io.h>3535-#include <asm/vr41xx/giu.h>3636-#include <asm/vr41xx/irq.h>3737-#include <asm/vr41xx/vr41xx.h>3838-3939-MODULE_AUTHOR("Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp>");4040-MODULE_DESCRIPTION("NEC VR4100 series General-purpose I/O Unit driver");4141-MODULE_LICENSE("GPL");4242-4343-static int major; /* default is dynamic major device number */4444-module_param(major, int, 0);4545-MODULE_PARM_DESC(major, "Major device number");4646-4747-#define GIUIOSELL 0x004848-#define GIUIOSELH 0x024949-#define GIUPIODL 0x045050-#define GIUPIODH 0x065151-#define GIUINTSTATL 0x085252-#define GIUINTSTATH 0x0a5353-#define GIUINTENL 0x0c5454-#define GIUINTENH 0x0e5555-#define GIUINTTYPL 0x105656-#define GIUINTTYPH 0x125757-#define GIUINTALSELL 0x145858-#define GIUINTALSELH 0x165959-#define GIUINTHTSELL 0x186060-#define GIUINTHTSELH 0x1a6161-#define GIUPODATL 0x1c6262-#define GIUPODATEN 0x1c6363-#define GIUPODATH 0x1e6464- #define PIOEN0 0x01006565- #define PIOEN1 0x02006666-#define GIUPODAT 0x1e6767-#define GIUFEDGEINHL 0x206868-#define GIUFEDGEINHH 0x226969-#define GIUREDGEINHL 0x247070-#define GIUREDGEINHH 0x267171-7272-#define GIUUSEUPDN 0x1e07373-#define GIUTERMUPDN 0x1e27474-7575-#define GPIO_HAS_PULLUPDOWN_IO 0x00017676-#define GPIO_HAS_OUTPUT_ENABLE 0x00027777-#define GPIO_HAS_INTERRUPT_EDGE_SELECT 0x01007878-7979-static spinlock_t giu_lock;8080-static unsigned long giu_flags;8181-static unsigned int giu_nr_pins;8282-8383-static void __iomem *giu_base;8484-8585-#define giu_read(offset) readw(giu_base + (offset))8686-#define giu_write(offset, value) writew((value), giu_base + (offset))8787-8888-#define GPIO_PIN_OF_IRQ(irq) ((irq) - GIU_IRQ_BASE)8989-#define GIUINT_HIGH_OFFSET 169090-#define GIUINT_HIGH_MAX 329191-9292-static inline uint16_t giu_set(uint16_t offset, uint16_t set)9393-{9494- uint16_t data;9595-9696- data = giu_read(offset);9797- data |= set;9898- giu_write(offset, data);9999-100100- return data;101101-}102102-103103-static inline uint16_t giu_clear(uint16_t offset, uint16_t clear)104104-{105105- uint16_t data;106106-107107- data = giu_read(offset);108108- data &= ~clear;109109- giu_write(offset, data);110110-111111- return data;112112-}113113-114114-static void ack_giuint_low(unsigned int irq)115115-{116116- giu_write(GIUINTSTATL, 1 << GPIO_PIN_OF_IRQ(irq));117117-}118118-119119-static void mask_giuint_low(unsigned int irq)120120-{121121- giu_clear(GIUINTENL, 1 << GPIO_PIN_OF_IRQ(irq));122122-}123123-124124-static void mask_ack_giuint_low(unsigned int irq)125125-{126126- unsigned int pin;127127-128128- pin = GPIO_PIN_OF_IRQ(irq);129129- giu_clear(GIUINTENL, 1 << pin);130130- giu_write(GIUINTSTATL, 1 << pin);131131-}132132-133133-static void unmask_giuint_low(unsigned int irq)134134-{135135- giu_set(GIUINTENL, 1 << GPIO_PIN_OF_IRQ(irq));136136-}137137-138138-static struct irq_chip giuint_low_irq_chip = {139139- .name = "GIUINTL",140140- .ack = ack_giuint_low,141141- .mask = mask_giuint_low,142142- .mask_ack = mask_ack_giuint_low,143143- .unmask = unmask_giuint_low,144144-};145145-146146-static void ack_giuint_high(unsigned int irq)147147-{148148- giu_write(GIUINTSTATH, 1 << (GPIO_PIN_OF_IRQ(irq) - GIUINT_HIGH_OFFSET));149149-}150150-151151-static void mask_giuint_high(unsigned int irq)152152-{153153- giu_clear(GIUINTENH, 1 << (GPIO_PIN_OF_IRQ(irq) - GIUINT_HIGH_OFFSET));154154-}155155-156156-static void mask_ack_giuint_high(unsigned int irq)157157-{158158- unsigned int pin;159159-160160- pin = GPIO_PIN_OF_IRQ(irq) - GIUINT_HIGH_OFFSET;161161- giu_clear(GIUINTENH, 1 << pin);162162- giu_write(GIUINTSTATH, 1 << pin);163163-}164164-165165-static void unmask_giuint_high(unsigned int irq)166166-{167167- giu_set(GIUINTENH, 1 << (GPIO_PIN_OF_IRQ(irq) - GIUINT_HIGH_OFFSET));168168-}169169-170170-static struct irq_chip giuint_high_irq_chip = {171171- .name = "GIUINTH",172172- .ack = ack_giuint_high,173173- .mask = mask_giuint_high,174174- .mask_ack = mask_ack_giuint_high,175175- .unmask = unmask_giuint_high,176176-};177177-178178-static int giu_get_irq(unsigned int irq)179179-{180180- uint16_t pendl, pendh, maskl, maskh;181181- int i;182182-183183- pendl = giu_read(GIUINTSTATL);184184- pendh = giu_read(GIUINTSTATH);185185- maskl = giu_read(GIUINTENL);186186- maskh = giu_read(GIUINTENH);187187-188188- maskl &= pendl;189189- maskh &= pendh;190190-191191- if (maskl) {192192- for (i = 0; i < 16; i++) {193193- if (maskl & (1 << i))194194- return GIU_IRQ(i);195195- }196196- } else if (maskh) {197197- for (i = 0; i < 16; i++) {198198- if (maskh & (1 << i))199199- return GIU_IRQ(i + GIUINT_HIGH_OFFSET);200200- }201201- }202202-203203- printk(KERN_ERR "spurious GIU interrupt: %04x(%04x),%04x(%04x)\n",204204- maskl, pendl, maskh, pendh);205205-206206- atomic_inc(&irq_err_count);207207-208208- return -EINVAL;209209-}210210-211211-void vr41xx_set_irq_trigger(unsigned int pin, irq_trigger_t trigger, irq_signal_t signal)212212-{213213- uint16_t mask;214214-215215- if (pin < GIUINT_HIGH_OFFSET) {216216- mask = 1 << pin;217217- if (trigger != IRQ_TRIGGER_LEVEL) {218218- giu_set(GIUINTTYPL, mask);219219- if (signal == IRQ_SIGNAL_HOLD)220220- giu_set(GIUINTHTSELL, mask);221221- else222222- giu_clear(GIUINTHTSELL, mask);223223- if (giu_flags & GPIO_HAS_INTERRUPT_EDGE_SELECT) {224224- switch (trigger) {225225- case IRQ_TRIGGER_EDGE_FALLING:226226- giu_set(GIUFEDGEINHL, mask);227227- giu_clear(GIUREDGEINHL, mask);228228- break;229229- case IRQ_TRIGGER_EDGE_RISING:230230- giu_clear(GIUFEDGEINHL, mask);231231- giu_set(GIUREDGEINHL, mask);232232- break;233233- default:234234- giu_set(GIUFEDGEINHL, mask);235235- giu_set(GIUREDGEINHL, mask);236236- break;237237- }238238- }239239- set_irq_chip_and_handler(GIU_IRQ(pin),240240- &giuint_low_irq_chip,241241- handle_edge_irq);242242- } else {243243- giu_clear(GIUINTTYPL, mask);244244- giu_clear(GIUINTHTSELL, mask);245245- set_irq_chip_and_handler(GIU_IRQ(pin),246246- &giuint_low_irq_chip,247247- handle_level_irq);248248- }249249- giu_write(GIUINTSTATL, mask);250250- } else if (pin < GIUINT_HIGH_MAX) {251251- mask = 1 << (pin - GIUINT_HIGH_OFFSET);252252- if (trigger != IRQ_TRIGGER_LEVEL) {253253- giu_set(GIUINTTYPH, mask);254254- if (signal == IRQ_SIGNAL_HOLD)255255- giu_set(GIUINTHTSELH, mask);256256- else257257- giu_clear(GIUINTHTSELH, mask);258258- if (giu_flags & GPIO_HAS_INTERRUPT_EDGE_SELECT) {259259- switch (trigger) {260260- case IRQ_TRIGGER_EDGE_FALLING:261261- giu_set(GIUFEDGEINHH, mask);262262- giu_clear(GIUREDGEINHH, mask);263263- break;264264- case IRQ_TRIGGER_EDGE_RISING:265265- giu_clear(GIUFEDGEINHH, mask);266266- giu_set(GIUREDGEINHH, mask);267267- break;268268- default:269269- giu_set(GIUFEDGEINHH, mask);270270- giu_set(GIUREDGEINHH, mask);271271- break;272272- }273273- }274274- set_irq_chip_and_handler(GIU_IRQ(pin),275275- &giuint_high_irq_chip,276276- handle_edge_irq);277277- } else {278278- giu_clear(GIUINTTYPH, mask);279279- giu_clear(GIUINTHTSELH, mask);280280- set_irq_chip_and_handler(GIU_IRQ(pin),281281- &giuint_high_irq_chip,282282- handle_level_irq);283283- }284284- giu_write(GIUINTSTATH, mask);285285- }286286-}287287-EXPORT_SYMBOL_GPL(vr41xx_set_irq_trigger);288288-289289-void vr41xx_set_irq_level(unsigned int pin, irq_level_t level)290290-{291291- uint16_t mask;292292-293293- if (pin < GIUINT_HIGH_OFFSET) {294294- mask = 1 << pin;295295- if (level == IRQ_LEVEL_HIGH)296296- giu_set(GIUINTALSELL, mask);297297- else298298- giu_clear(GIUINTALSELL, mask);299299- giu_write(GIUINTSTATL, mask);300300- } else if (pin < GIUINT_HIGH_MAX) {301301- mask = 1 << (pin - GIUINT_HIGH_OFFSET);302302- if (level == IRQ_LEVEL_HIGH)303303- giu_set(GIUINTALSELH, mask);304304- else305305- giu_clear(GIUINTALSELH, mask);306306- giu_write(GIUINTSTATH, mask);307307- }308308-}309309-EXPORT_SYMBOL_GPL(vr41xx_set_irq_level);310310-311311-gpio_data_t vr41xx_gpio_get_pin(unsigned int pin)312312-{313313- uint16_t reg, mask;314314-315315- if (pin >= giu_nr_pins)316316- return GPIO_DATA_INVAL;317317-318318- if (pin < 16) {319319- reg = giu_read(GIUPIODL);320320- mask = (uint16_t)1 << pin;321321- } else if (pin < 32) {322322- reg = giu_read(GIUPIODH);323323- mask = (uint16_t)1 << (pin - 16);324324- } else if (pin < 48) {325325- reg = giu_read(GIUPODATL);326326- mask = (uint16_t)1 << (pin - 32);327327- } else {328328- reg = giu_read(GIUPODATH);329329- mask = (uint16_t)1 << (pin - 48);330330- }331331-332332- if (reg & mask)333333- return GPIO_DATA_HIGH;334334-335335- return GPIO_DATA_LOW;336336-}337337-EXPORT_SYMBOL_GPL(vr41xx_gpio_get_pin);338338-339339-int vr41xx_gpio_set_pin(unsigned int pin, gpio_data_t data)340340-{341341- uint16_t offset, mask, reg;342342- unsigned long flags;343343-344344- if (pin >= giu_nr_pins)345345- return -EINVAL;346346-347347- if (pin < 16) {348348- offset = GIUPIODL;349349- mask = (uint16_t)1 << pin;350350- } else if (pin < 32) {351351- offset = GIUPIODH;352352- mask = (uint16_t)1 << (pin - 16);353353- } else if (pin < 48) {354354- offset = GIUPODATL;355355- mask = (uint16_t)1 << (pin - 32);356356- } else {357357- offset = GIUPODATH;358358- mask = (uint16_t)1 << (pin - 48);359359- }360360-361361- spin_lock_irqsave(&giu_lock, flags);362362-363363- reg = giu_read(offset);364364- if (data == GPIO_DATA_HIGH)365365- reg |= mask;366366- else367367- reg &= ~mask;368368- giu_write(offset, reg);369369-370370- spin_unlock_irqrestore(&giu_lock, flags);371371-372372- return 0;373373-}374374-EXPORT_SYMBOL_GPL(vr41xx_gpio_set_pin);375375-376376-int vr41xx_gpio_set_direction(unsigned int pin, gpio_direction_t dir)377377-{378378- uint16_t offset, mask, reg;379379- unsigned long flags;380380-381381- if (pin >= giu_nr_pins)382382- return -EINVAL;383383-384384- if (pin < 16) {385385- offset = GIUIOSELL;386386- mask = (uint16_t)1 << pin;387387- } else if (pin < 32) {388388- offset = GIUIOSELH;389389- mask = (uint16_t)1 << (pin - 16);390390- } else {391391- if (giu_flags & GPIO_HAS_OUTPUT_ENABLE) {392392- offset = GIUPODATEN;393393- mask = (uint16_t)1 << (pin - 32);394394- } else {395395- switch (pin) {396396- case 48:397397- offset = GIUPODATH;398398- mask = PIOEN0;399399- break;400400- case 49:401401- offset = GIUPODATH;402402- mask = PIOEN1;403403- break;404404- default:405405- return -EINVAL;406406- }407407- }408408- }409409-410410- spin_lock_irqsave(&giu_lock, flags);411411-412412- reg = giu_read(offset);413413- if (dir == GPIO_OUTPUT)414414- reg |= mask;415415- else416416- reg &= ~mask;417417- giu_write(offset, reg);418418-419419- spin_unlock_irqrestore(&giu_lock, flags);420420-421421- return 0;422422-}423423-EXPORT_SYMBOL_GPL(vr41xx_gpio_set_direction);424424-425425-int vr41xx_gpio_pullupdown(unsigned int pin, gpio_pull_t pull)426426-{427427- uint16_t reg, mask;428428- unsigned long flags;429429-430430- if ((giu_flags & GPIO_HAS_PULLUPDOWN_IO) != GPIO_HAS_PULLUPDOWN_IO)431431- return -EPERM;432432-433433- if (pin >= 15)434434- return -EINVAL;435435-436436- mask = (uint16_t)1 << pin;437437-438438- spin_lock_irqsave(&giu_lock, flags);439439-440440- if (pull == GPIO_PULL_UP || pull == GPIO_PULL_DOWN) {441441- reg = giu_read(GIUTERMUPDN);442442- if (pull == GPIO_PULL_UP)443443- reg |= mask;444444- else445445- reg &= ~mask;446446- giu_write(GIUTERMUPDN, reg);447447-448448- reg = giu_read(GIUUSEUPDN);449449- reg |= mask;450450- giu_write(GIUUSEUPDN, reg);451451- } else {452452- reg = giu_read(GIUUSEUPDN);453453- reg &= ~mask;454454- giu_write(GIUUSEUPDN, reg);455455- }456456-457457- spin_unlock_irqrestore(&giu_lock, flags);458458-459459- return 0;460460-}461461-EXPORT_SYMBOL_GPL(vr41xx_gpio_pullupdown);462462-463463-static ssize_t gpio_read(struct file *file, char __user *buf, size_t len,464464- loff_t *ppos)465465-{466466- unsigned int pin;467467- char value = '0';468468-469469- pin = iminor(file->f_path.dentry->d_inode);470470- if (pin >= giu_nr_pins)471471- return -EBADF;472472-473473- if (vr41xx_gpio_get_pin(pin) == GPIO_DATA_HIGH)474474- value = '1';475475-476476- if (len <= 0)477477- return -EFAULT;478478-479479- if (put_user(value, buf))480480- return -EFAULT;481481-482482- return 1;483483-}484484-485485-static ssize_t gpio_write(struct file *file, const char __user *data,486486- size_t len, loff_t *ppos)487487-{488488- unsigned int pin;489489- size_t i;490490- char c;491491- int retval = 0;492492-493493- pin = iminor(file->f_path.dentry->d_inode);494494- if (pin >= giu_nr_pins)495495- return -EBADF;496496-497497- for (i = 0; i < len; i++) {498498- if (get_user(c, data + i))499499- return -EFAULT;500500-501501- switch (c) {502502- case '0':503503- retval = vr41xx_gpio_set_pin(pin, GPIO_DATA_LOW);504504- break;505505- case '1':506506- retval = vr41xx_gpio_set_pin(pin, GPIO_DATA_HIGH);507507- break;508508- case 'D':509509- printk(KERN_INFO "GPIO%d: pull down\n", pin);510510- retval = vr41xx_gpio_pullupdown(pin, GPIO_PULL_DOWN);511511- break;512512- case 'd':513513- printk(KERN_INFO "GPIO%d: pull up/down disable\n", pin);514514- retval = vr41xx_gpio_pullupdown(pin, GPIO_PULL_DISABLE);515515- break;516516- case 'I':517517- printk(KERN_INFO "GPIO%d: input\n", pin);518518- retval = vr41xx_gpio_set_direction(pin, GPIO_INPUT);519519- break;520520- case 'O':521521- printk(KERN_INFO "GPIO%d: output\n", pin);522522- retval = vr41xx_gpio_set_direction(pin, GPIO_OUTPUT);523523- break;524524- case 'o':525525- printk(KERN_INFO "GPIO%d: output disable\n", pin);526526- retval = vr41xx_gpio_set_direction(pin, GPIO_OUTPUT_DISABLE);527527- break;528528- case 'P':529529- printk(KERN_INFO "GPIO%d: pull up\n", pin);530530- retval = vr41xx_gpio_pullupdown(pin, GPIO_PULL_UP);531531- break;532532- case 'p':533533- printk(KERN_INFO "GPIO%d: pull up/down disable\n", pin);534534- retval = vr41xx_gpio_pullupdown(pin, GPIO_PULL_DISABLE);535535- break;536536- default:537537- break;538538- }539539-540540- if (retval < 0)541541- break;542542- }543543-544544- return i;545545-}546546-547547-static int gpio_open(struct inode *inode, struct file *file)548548-{549549- unsigned int pin;550550-551551- cycle_kernel_lock();552552- pin = iminor(inode);553553- if (pin >= giu_nr_pins)554554- return -EBADF;555555-556556- return nonseekable_open(inode, file);557557-}558558-559559-static int gpio_release(struct inode *inode, struct file *file)560560-{561561- unsigned int pin;562562-563563- pin = iminor(inode);564564- if (pin >= giu_nr_pins)565565- return -EBADF;566566-567567- return 0;568568-}569569-570570-static const struct file_operations gpio_fops = {571571- .owner = THIS_MODULE,572572- .read = gpio_read,573573- .write = gpio_write,574574- .open = gpio_open,575575- .release = gpio_release,576576-};577577-578578-static int __devinit giu_probe(struct platform_device *dev)579579-{580580- struct resource *res;581581- unsigned int trigger, i, pin;582582- struct irq_chip *chip;583583- int irq, retval;584584-585585- switch (dev->id) {586586- case GPIO_50PINS_PULLUPDOWN:587587- giu_flags = GPIO_HAS_PULLUPDOWN_IO;588588- giu_nr_pins = 50;589589- break;590590- case GPIO_36PINS:591591- giu_nr_pins = 36;592592- break;593593- case GPIO_48PINS_EDGE_SELECT:594594- giu_flags = GPIO_HAS_INTERRUPT_EDGE_SELECT;595595- giu_nr_pins = 48;596596- break;597597- default:598598- printk(KERN_ERR "GIU: unknown ID %d\n", dev->id);599599- return -ENODEV;600600- }601601-602602- res = platform_get_resource(dev, IORESOURCE_MEM, 0);603603- if (!res)604604- return -EBUSY;605605-606606- giu_base = ioremap(res->start, res->end - res->start + 1);607607- if (!giu_base)608608- return -ENOMEM;609609-610610- retval = register_chrdev(major, "GIU", &gpio_fops);611611- if (retval < 0) {612612- iounmap(giu_base);613613- giu_base = NULL;614614- return retval;615615- }616616-617617- if (major == 0) {618618- major = retval;619619- printk(KERN_INFO "GIU: major number %d\n", major);620620- }621621-622622- spin_lock_init(&giu_lock);623623-624624- giu_write(GIUINTENL, 0);625625- giu_write(GIUINTENH, 0);626626-627627- trigger = giu_read(GIUINTTYPH) << 16;628628- trigger |= giu_read(GIUINTTYPL);629629- for (i = GIU_IRQ_BASE; i <= GIU_IRQ_LAST; i++) {630630- pin = GPIO_PIN_OF_IRQ(i);631631- if (pin < GIUINT_HIGH_OFFSET)632632- chip = &giuint_low_irq_chip;633633- else634634- chip = &giuint_high_irq_chip;635635-636636- if (trigger & (1 << pin))637637- set_irq_chip_and_handler(i, chip, handle_edge_irq);638638- else639639- set_irq_chip_and_handler(i, chip, handle_level_irq);640640-641641- }642642-643643- irq = platform_get_irq(dev, 0);644644- if (irq < 0 || irq >= nr_irqs)645645- return -EBUSY;646646-647647- return cascade_irq(irq, giu_get_irq);648648-}649649-650650-static int __devexit giu_remove(struct platform_device *dev)651651-{652652- if (giu_base) {653653- iounmap(giu_base);654654- giu_base = NULL;655655- }656656-657657- return 0;658658-}659659-660660-static struct platform_driver giu_device_driver = {661661- .probe = giu_probe,662662- .remove = __devexit_p(giu_remove),663663- .driver = {664664- .name = "GIU",665665- .owner = THIS_MODULE,666666- },667667-};668668-669669-static int __init vr41xx_giu_init(void)670670-{671671- return platform_driver_register(&giu_device_driver);672672-}673673-674674-static void __exit vr41xx_giu_exit(void)675675-{676676- platform_driver_unregister(&giu_device_driver);677677-}678678-679679-module_init(vr41xx_giu_init);680680-module_exit(vr41xx_giu_exit);
+6
drivers/gpio/Kconfig
···7979 help8080 Say yes here to support the Xilinx FPGA GPIO device81818282+config GPIO_VR41XX8383+ tristate "NEC VR4100 series General-purpose I/O Uint support"8484+ depends on CPU_VR41XX8585+ help8686+ Say yes here to support the NEC VR4100 series General-purpose I/O Uint8787+8288comment "I2C GPIO expanders:"83898490config GPIO_MAX732X