1c103de24SGrant Likely /* 2c103de24SGrant Likely * Copyright (C) 2010 OKI SEMICONDUCTOR Co., LTD. 3c103de24SGrant Likely * 4c103de24SGrant Likely * This program is free software; you can redistribute it and/or modify 5c103de24SGrant Likely * it under the terms of the GNU General Public License as published by 6c103de24SGrant Likely * the Free Software Foundation; version 2 of the License. 7c103de24SGrant Likely * 8c103de24SGrant Likely * This program is distributed in the hope that it will be useful, 9c103de24SGrant Likely * but WITHOUT ANY WARRANTY; without even the implied warranty of 10c103de24SGrant Likely * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11c103de24SGrant Likely * GNU General Public License for more details. 12c103de24SGrant Likely * 13c103de24SGrant Likely * You should have received a copy of the GNU General Public License 14c103de24SGrant Likely * along with this program; if not, write to the Free Software 15c103de24SGrant Likely * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. 16c103de24SGrant Likely */ 17c103de24SGrant Likely #include <linux/kernel.h> 18c103de24SGrant Likely #include <linux/slab.h> 19c103de24SGrant Likely #include <linux/pci.h> 20c103de24SGrant Likely #include <linux/gpio.h> 2154be5663STomoya MORINAGA #include <linux/interrupt.h> 2254be5663STomoya MORINAGA #include <linux/irq.h> 2354be5663STomoya MORINAGA 2454be5663STomoya MORINAGA #define IOH_EDGE_FALLING 0 2554be5663STomoya MORINAGA #define IOH_EDGE_RISING BIT(0) 2654be5663STomoya MORINAGA #define IOH_LEVEL_L BIT(1) 2754be5663STomoya MORINAGA #define IOH_LEVEL_H (BIT(0) | BIT(1)) 2854be5663STomoya MORINAGA #define IOH_EDGE_BOTH BIT(2) 2954be5663STomoya MORINAGA #define IOH_IM_MASK (BIT(0) | BIT(1) | BIT(2)) 3054be5663STomoya MORINAGA 3154be5663STomoya MORINAGA #define IOH_IRQ_BASE 0 32c103de24SGrant Likely 33c103de24SGrant Likely #define PCI_VENDOR_ID_ROHM 0x10DB 34c103de24SGrant Likely 35c103de24SGrant Likely struct ioh_reg_comn { 36c103de24SGrant Likely u32 ien; 37c103de24SGrant Likely u32 istatus; 38c103de24SGrant Likely u32 idisp; 39c103de24SGrant Likely u32 iclr; 40c103de24SGrant Likely u32 imask; 41c103de24SGrant Likely u32 imaskclr; 42c103de24SGrant Likely u32 po; 43c103de24SGrant Likely u32 pi; 44c103de24SGrant Likely u32 pm; 45c103de24SGrant Likely u32 im_0; 46c103de24SGrant Likely u32 im_1; 47c103de24SGrant Likely u32 reserved; 48c103de24SGrant Likely }; 49c103de24SGrant Likely 50c103de24SGrant Likely struct ioh_regs { 51c103de24SGrant Likely struct ioh_reg_comn regs[8]; 52c103de24SGrant Likely u32 reserve1[16]; 53c103de24SGrant Likely u32 ioh_sel_reg[4]; 54c103de24SGrant Likely u32 reserve2[11]; 55c103de24SGrant Likely u32 srst; 56c103de24SGrant Likely }; 57c103de24SGrant Likely 58c103de24SGrant Likely /** 59c103de24SGrant Likely * struct ioh_gpio_reg_data - The register store data. 6054be5663STomoya MORINAGA * @ien_reg To store contents of interrupt enable register. 6154be5663STomoya MORINAGA * @imask_reg: To store contents of interrupt mask regist 62c103de24SGrant Likely * @po_reg: To store contents of PO register. 63c103de24SGrant Likely * @pm_reg: To store contents of PM register. 6454be5663STomoya MORINAGA * @im0_reg: To store contents of interrupt mode regist0 6554be5663STomoya MORINAGA * @im1_reg: To store contents of interrupt mode regist1 66*b490fa0bSTomoya MORINAGA * @use_sel_reg: To store contents of GPIO_USE_SEL0~3 67c103de24SGrant Likely */ 68c103de24SGrant Likely struct ioh_gpio_reg_data { 6954be5663STomoya MORINAGA u32 ien_reg; 7054be5663STomoya MORINAGA u32 imask_reg; 71c103de24SGrant Likely u32 po_reg; 72c103de24SGrant Likely u32 pm_reg; 7354be5663STomoya MORINAGA u32 im0_reg; 7454be5663STomoya MORINAGA u32 im1_reg; 75*b490fa0bSTomoya MORINAGA u32 use_sel_reg; 76c103de24SGrant Likely }; 77c103de24SGrant Likely 78c103de24SGrant Likely /** 79c103de24SGrant Likely * struct ioh_gpio - GPIO private data structure. 80c103de24SGrant Likely * @base: PCI base address of Memory mapped I/O register. 81c103de24SGrant Likely * @reg: Memory mapped IOH GPIO register list. 82c103de24SGrant Likely * @dev: Pointer to device structure. 83c103de24SGrant Likely * @gpio: Data for GPIO infrastructure. 84c103de24SGrant Likely * @ioh_gpio_reg: Memory mapped Register data is saved here 85c103de24SGrant Likely * when suspend. 86*b490fa0bSTomoya MORINAGA * @gpio_use_sel: Save GPIO_USE_SEL1~4 register for PM 87c103de24SGrant Likely * @ch: Indicate GPIO channel 8854be5663STomoya MORINAGA * @irq_base: Save base of IRQ number for interrupt 8954be5663STomoya MORINAGA * @spinlock: Used for register access protection in 9054be5663STomoya MORINAGA * interrupt context ioh_irq_type and PM; 91c103de24SGrant Likely */ 92c103de24SGrant Likely struct ioh_gpio { 93c103de24SGrant Likely void __iomem *base; 94c103de24SGrant Likely struct ioh_regs __iomem *reg; 95c103de24SGrant Likely struct device *dev; 96c103de24SGrant Likely struct gpio_chip gpio; 97c103de24SGrant Likely struct ioh_gpio_reg_data ioh_gpio_reg; 98*b490fa0bSTomoya MORINAGA u32 gpio_use_sel; 99c103de24SGrant Likely struct mutex lock; 100c103de24SGrant Likely int ch; 10154be5663STomoya MORINAGA int irq_base; 10254be5663STomoya MORINAGA spinlock_t spinlock; 103c103de24SGrant Likely }; 104c103de24SGrant Likely 105c103de24SGrant Likely static const int num_ports[] = {6, 12, 16, 16, 15, 16, 16, 12}; 106c103de24SGrant Likely 107c103de24SGrant Likely static void ioh_gpio_set(struct gpio_chip *gpio, unsigned nr, int val) 108c103de24SGrant Likely { 109c103de24SGrant Likely u32 reg_val; 110c103de24SGrant Likely struct ioh_gpio *chip = container_of(gpio, struct ioh_gpio, gpio); 111c103de24SGrant Likely 112c103de24SGrant Likely mutex_lock(&chip->lock); 113c103de24SGrant Likely reg_val = ioread32(&chip->reg->regs[chip->ch].po); 114c103de24SGrant Likely if (val) 115c103de24SGrant Likely reg_val |= (1 << nr); 116c103de24SGrant Likely else 117c103de24SGrant Likely reg_val &= ~(1 << nr); 118c103de24SGrant Likely 119c103de24SGrant Likely iowrite32(reg_val, &chip->reg->regs[chip->ch].po); 120c103de24SGrant Likely mutex_unlock(&chip->lock); 121c103de24SGrant Likely } 122c103de24SGrant Likely 123c103de24SGrant Likely static int ioh_gpio_get(struct gpio_chip *gpio, unsigned nr) 124c103de24SGrant Likely { 125c103de24SGrant Likely struct ioh_gpio *chip = container_of(gpio, struct ioh_gpio, gpio); 126c103de24SGrant Likely 127c103de24SGrant Likely return ioread32(&chip->reg->regs[chip->ch].pi) & (1 << nr); 128c103de24SGrant Likely } 129c103de24SGrant Likely 130c103de24SGrant Likely static int ioh_gpio_direction_output(struct gpio_chip *gpio, unsigned nr, 131c103de24SGrant Likely int val) 132c103de24SGrant Likely { 133c103de24SGrant Likely struct ioh_gpio *chip = container_of(gpio, struct ioh_gpio, gpio); 134c103de24SGrant Likely u32 pm; 135c103de24SGrant Likely u32 reg_val; 136c103de24SGrant Likely 137c103de24SGrant Likely mutex_lock(&chip->lock); 138c103de24SGrant Likely pm = ioread32(&chip->reg->regs[chip->ch].pm) & 139c103de24SGrant Likely ((1 << num_ports[chip->ch]) - 1); 140c103de24SGrant Likely pm |= (1 << nr); 141c103de24SGrant Likely iowrite32(pm, &chip->reg->regs[chip->ch].pm); 142c103de24SGrant Likely 143c103de24SGrant Likely reg_val = ioread32(&chip->reg->regs[chip->ch].po); 144c103de24SGrant Likely if (val) 145c103de24SGrant Likely reg_val |= (1 << nr); 146c103de24SGrant Likely else 147c103de24SGrant Likely reg_val &= ~(1 << nr); 148c103de24SGrant Likely iowrite32(reg_val, &chip->reg->regs[chip->ch].po); 149c103de24SGrant Likely 150c103de24SGrant Likely mutex_unlock(&chip->lock); 151c103de24SGrant Likely 152c103de24SGrant Likely return 0; 153c103de24SGrant Likely } 154c103de24SGrant Likely 155c103de24SGrant Likely static int ioh_gpio_direction_input(struct gpio_chip *gpio, unsigned nr) 156c103de24SGrant Likely { 157c103de24SGrant Likely struct ioh_gpio *chip = container_of(gpio, struct ioh_gpio, gpio); 158c103de24SGrant Likely u32 pm; 159c103de24SGrant Likely 160c103de24SGrant Likely mutex_lock(&chip->lock); 161c103de24SGrant Likely pm = ioread32(&chip->reg->regs[chip->ch].pm) & 162c103de24SGrant Likely ((1 << num_ports[chip->ch]) - 1); 163c103de24SGrant Likely pm &= ~(1 << nr); 164c103de24SGrant Likely iowrite32(pm, &chip->reg->regs[chip->ch].pm); 165c103de24SGrant Likely mutex_unlock(&chip->lock); 166c103de24SGrant Likely 167c103de24SGrant Likely return 0; 168c103de24SGrant Likely } 169c103de24SGrant Likely 170c103de24SGrant Likely #ifdef CONFIG_PM 171c103de24SGrant Likely /* 172c103de24SGrant Likely * Save register configuration and disable interrupts. 173c103de24SGrant Likely */ 174c103de24SGrant Likely static void ioh_gpio_save_reg_conf(struct ioh_gpio *chip) 175c103de24SGrant Likely { 176*b490fa0bSTomoya MORINAGA int i; 177*b490fa0bSTomoya MORINAGA 178*b490fa0bSTomoya MORINAGA for (i = 0; i < 8; i ++, chip++) { 179*b490fa0bSTomoya MORINAGA chip->ioh_gpio_reg.po_reg = 180*b490fa0bSTomoya MORINAGA ioread32(&chip->reg->regs[chip->ch].po); 181*b490fa0bSTomoya MORINAGA chip->ioh_gpio_reg.pm_reg = 182*b490fa0bSTomoya MORINAGA ioread32(&chip->reg->regs[chip->ch].pm); 183*b490fa0bSTomoya MORINAGA chip->ioh_gpio_reg.ien_reg = 184*b490fa0bSTomoya MORINAGA ioread32(&chip->reg->regs[chip->ch].ien); 185*b490fa0bSTomoya MORINAGA chip->ioh_gpio_reg.imask_reg = 186*b490fa0bSTomoya MORINAGA ioread32(&chip->reg->regs[chip->ch].imask); 187*b490fa0bSTomoya MORINAGA chip->ioh_gpio_reg.im0_reg = 188*b490fa0bSTomoya MORINAGA ioread32(&chip->reg->regs[chip->ch].im_0); 189*b490fa0bSTomoya MORINAGA chip->ioh_gpio_reg.im1_reg = 190*b490fa0bSTomoya MORINAGA ioread32(&chip->reg->regs[chip->ch].im_1); 191*b490fa0bSTomoya MORINAGA if (i < 4) 192*b490fa0bSTomoya MORINAGA chip->ioh_gpio_reg.use_sel_reg = 193*b490fa0bSTomoya MORINAGA ioread32(&chip->reg->ioh_sel_reg[i]); 194*b490fa0bSTomoya MORINAGA } 195c103de24SGrant Likely } 196c103de24SGrant Likely 197c103de24SGrant Likely /* 198c103de24SGrant Likely * This function restores the register configuration of the GPIO device. 199c103de24SGrant Likely */ 200c103de24SGrant Likely static void ioh_gpio_restore_reg_conf(struct ioh_gpio *chip) 201c103de24SGrant Likely { 202*b490fa0bSTomoya MORINAGA int i; 203*b490fa0bSTomoya MORINAGA 204*b490fa0bSTomoya MORINAGA for (i = 0; i < 8; i ++, chip++) { 205*b490fa0bSTomoya MORINAGA iowrite32(chip->ioh_gpio_reg.po_reg, 206*b490fa0bSTomoya MORINAGA &chip->reg->regs[chip->ch].po); 207*b490fa0bSTomoya MORINAGA iowrite32(chip->ioh_gpio_reg.pm_reg, 208*b490fa0bSTomoya MORINAGA &chip->reg->regs[chip->ch].pm); 209*b490fa0bSTomoya MORINAGA iowrite32(chip->ioh_gpio_reg.ien_reg, 210*b490fa0bSTomoya MORINAGA &chip->reg->regs[chip->ch].ien); 211*b490fa0bSTomoya MORINAGA iowrite32(chip->ioh_gpio_reg.imask_reg, 212*b490fa0bSTomoya MORINAGA &chip->reg->regs[chip->ch].imask); 213*b490fa0bSTomoya MORINAGA iowrite32(chip->ioh_gpio_reg.im0_reg, 214*b490fa0bSTomoya MORINAGA &chip->reg->regs[chip->ch].im_0); 215*b490fa0bSTomoya MORINAGA iowrite32(chip->ioh_gpio_reg.im1_reg, 216*b490fa0bSTomoya MORINAGA &chip->reg->regs[chip->ch].im_1); 217*b490fa0bSTomoya MORINAGA if (i < 4) 218*b490fa0bSTomoya MORINAGA iowrite32(chip->ioh_gpio_reg.use_sel_reg, 219*b490fa0bSTomoya MORINAGA &chip->reg->ioh_sel_reg[i]); 220*b490fa0bSTomoya MORINAGA } 221c103de24SGrant Likely } 222c103de24SGrant Likely #endif 223c103de24SGrant Likely 22454be5663STomoya MORINAGA static int ioh_gpio_to_irq(struct gpio_chip *gpio, unsigned offset) 22554be5663STomoya MORINAGA { 22654be5663STomoya MORINAGA struct ioh_gpio *chip = container_of(gpio, struct ioh_gpio, gpio); 22754be5663STomoya MORINAGA return chip->irq_base + offset; 22854be5663STomoya MORINAGA } 22954be5663STomoya MORINAGA 230c103de24SGrant Likely static void ioh_gpio_setup(struct ioh_gpio *chip, int num_port) 231c103de24SGrant Likely { 232c103de24SGrant Likely struct gpio_chip *gpio = &chip->gpio; 233c103de24SGrant Likely 234c103de24SGrant Likely gpio->label = dev_name(chip->dev); 235c103de24SGrant Likely gpio->owner = THIS_MODULE; 236c103de24SGrant Likely gpio->direction_input = ioh_gpio_direction_input; 237c103de24SGrant Likely gpio->get = ioh_gpio_get; 238c103de24SGrant Likely gpio->direction_output = ioh_gpio_direction_output; 239c103de24SGrant Likely gpio->set = ioh_gpio_set; 240c103de24SGrant Likely gpio->dbg_show = NULL; 241c103de24SGrant Likely gpio->base = -1; 242c103de24SGrant Likely gpio->ngpio = num_port; 243c103de24SGrant Likely gpio->can_sleep = 0; 24454be5663STomoya MORINAGA gpio->to_irq = ioh_gpio_to_irq; 24554be5663STomoya MORINAGA } 24654be5663STomoya MORINAGA 24754be5663STomoya MORINAGA static int ioh_irq_type(struct irq_data *d, unsigned int type) 24854be5663STomoya MORINAGA { 24954be5663STomoya MORINAGA u32 im; 25054be5663STomoya MORINAGA u32 *im_reg; 25154be5663STomoya MORINAGA u32 ien; 25254be5663STomoya MORINAGA u32 im_pos; 25354be5663STomoya MORINAGA int ch; 25454be5663STomoya MORINAGA unsigned long flags; 25554be5663STomoya MORINAGA u32 val; 25654be5663STomoya MORINAGA int irq = d->irq; 25754be5663STomoya MORINAGA struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d); 25854be5663STomoya MORINAGA struct ioh_gpio *chip = gc->private; 25954be5663STomoya MORINAGA 26054be5663STomoya MORINAGA ch = irq - chip->irq_base; 26154be5663STomoya MORINAGA if (irq <= chip->irq_base + 7) { 26254be5663STomoya MORINAGA im_reg = &chip->reg->regs[chip->ch].im_0; 26354be5663STomoya MORINAGA im_pos = ch; 26454be5663STomoya MORINAGA } else { 26554be5663STomoya MORINAGA im_reg = &chip->reg->regs[chip->ch].im_1; 26654be5663STomoya MORINAGA im_pos = ch - 8; 26754be5663STomoya MORINAGA } 26854be5663STomoya MORINAGA dev_dbg(chip->dev, "%s:irq=%d type=%d ch=%d pos=%d type=%d\n", 26954be5663STomoya MORINAGA __func__, irq, type, ch, im_pos, type); 27054be5663STomoya MORINAGA 27154be5663STomoya MORINAGA spin_lock_irqsave(&chip->spinlock, flags); 27254be5663STomoya MORINAGA 27354be5663STomoya MORINAGA switch (type) { 27454be5663STomoya MORINAGA case IRQ_TYPE_EDGE_RISING: 27554be5663STomoya MORINAGA val = IOH_EDGE_RISING; 27654be5663STomoya MORINAGA break; 27754be5663STomoya MORINAGA case IRQ_TYPE_EDGE_FALLING: 27854be5663STomoya MORINAGA val = IOH_EDGE_FALLING; 27954be5663STomoya MORINAGA break; 28054be5663STomoya MORINAGA case IRQ_TYPE_EDGE_BOTH: 28154be5663STomoya MORINAGA val = IOH_EDGE_BOTH; 28254be5663STomoya MORINAGA break; 28354be5663STomoya MORINAGA case IRQ_TYPE_LEVEL_HIGH: 28454be5663STomoya MORINAGA val = IOH_LEVEL_H; 28554be5663STomoya MORINAGA break; 28654be5663STomoya MORINAGA case IRQ_TYPE_LEVEL_LOW: 28754be5663STomoya MORINAGA val = IOH_LEVEL_L; 28854be5663STomoya MORINAGA break; 28954be5663STomoya MORINAGA case IRQ_TYPE_PROBE: 29054be5663STomoya MORINAGA goto end; 29154be5663STomoya MORINAGA default: 29254be5663STomoya MORINAGA dev_warn(chip->dev, "%s: unknown type(%dd)", 29354be5663STomoya MORINAGA __func__, type); 29454be5663STomoya MORINAGA goto end; 29554be5663STomoya MORINAGA } 29654be5663STomoya MORINAGA 29754be5663STomoya MORINAGA /* Set interrupt mode */ 29854be5663STomoya MORINAGA im = ioread32(im_reg) & ~(IOH_IM_MASK << (im_pos * 4)); 29954be5663STomoya MORINAGA iowrite32(im | (val << (im_pos * 4)), im_reg); 30054be5663STomoya MORINAGA 30154be5663STomoya MORINAGA /* iclr */ 30254be5663STomoya MORINAGA iowrite32(BIT(ch), &chip->reg->regs[chip->ch].iclr); 30354be5663STomoya MORINAGA 30454be5663STomoya MORINAGA /* IMASKCLR */ 30554be5663STomoya MORINAGA iowrite32(BIT(ch), &chip->reg->regs[chip->ch].imaskclr); 30654be5663STomoya MORINAGA 30754be5663STomoya MORINAGA /* Enable interrupt */ 30854be5663STomoya MORINAGA ien = ioread32(&chip->reg->regs[chip->ch].ien); 30954be5663STomoya MORINAGA iowrite32(ien | BIT(ch), &chip->reg->regs[chip->ch].ien); 31054be5663STomoya MORINAGA end: 31154be5663STomoya MORINAGA spin_unlock_irqrestore(&chip->spinlock, flags); 31254be5663STomoya MORINAGA 31354be5663STomoya MORINAGA return 0; 31454be5663STomoya MORINAGA } 31554be5663STomoya MORINAGA 31654be5663STomoya MORINAGA static void ioh_irq_unmask(struct irq_data *d) 31754be5663STomoya MORINAGA { 31854be5663STomoya MORINAGA struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d); 31954be5663STomoya MORINAGA struct ioh_gpio *chip = gc->private; 32054be5663STomoya MORINAGA 32154be5663STomoya MORINAGA iowrite32(1 << (d->irq - chip->irq_base), 32254be5663STomoya MORINAGA &chip->reg->regs[chip->ch].imaskclr); 32354be5663STomoya MORINAGA } 32454be5663STomoya MORINAGA 32554be5663STomoya MORINAGA static void ioh_irq_mask(struct irq_data *d) 32654be5663STomoya MORINAGA { 32754be5663STomoya MORINAGA struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d); 32854be5663STomoya MORINAGA struct ioh_gpio *chip = gc->private; 32954be5663STomoya MORINAGA 33054be5663STomoya MORINAGA iowrite32(1 << (d->irq - chip->irq_base), 33154be5663STomoya MORINAGA &chip->reg->regs[chip->ch].imask); 33254be5663STomoya MORINAGA } 33354be5663STomoya MORINAGA 33454be5663STomoya MORINAGA static irqreturn_t ioh_gpio_handler(int irq, void *dev_id) 33554be5663STomoya MORINAGA { 33654be5663STomoya MORINAGA struct ioh_gpio *chip = dev_id; 33754be5663STomoya MORINAGA u32 reg_val; 33854be5663STomoya MORINAGA int i, j; 33954be5663STomoya MORINAGA int ret = IRQ_NONE; 34054be5663STomoya MORINAGA 34154be5663STomoya MORINAGA for (i = 0; i < 8; i++) { 34254be5663STomoya MORINAGA reg_val = ioread32(&chip->reg->regs[i].istatus); 34354be5663STomoya MORINAGA for (j = 0; j < num_ports[i]; j++) { 34454be5663STomoya MORINAGA if (reg_val & BIT(j)) { 34554be5663STomoya MORINAGA dev_dbg(chip->dev, 34654be5663STomoya MORINAGA "%s:[%d]:irq=%d status=0x%x\n", 34754be5663STomoya MORINAGA __func__, j, irq, reg_val); 34854be5663STomoya MORINAGA iowrite32(BIT(j), 34954be5663STomoya MORINAGA &chip->reg->regs[chip->ch].iclr); 35054be5663STomoya MORINAGA generic_handle_irq(chip->irq_base + j); 35154be5663STomoya MORINAGA ret = IRQ_HANDLED; 35254be5663STomoya MORINAGA } 35354be5663STomoya MORINAGA } 35454be5663STomoya MORINAGA } 35554be5663STomoya MORINAGA return ret; 35654be5663STomoya MORINAGA } 35754be5663STomoya MORINAGA 35854be5663STomoya MORINAGA static __devinit void ioh_gpio_alloc_generic_chip(struct ioh_gpio *chip, 35954be5663STomoya MORINAGA unsigned int irq_start, unsigned int num) 36054be5663STomoya MORINAGA { 36154be5663STomoya MORINAGA struct irq_chip_generic *gc; 36254be5663STomoya MORINAGA struct irq_chip_type *ct; 36354be5663STomoya MORINAGA 36454be5663STomoya MORINAGA gc = irq_alloc_generic_chip("ioh_gpio", 1, irq_start, chip->base, 36554be5663STomoya MORINAGA handle_simple_irq); 36654be5663STomoya MORINAGA gc->private = chip; 36754be5663STomoya MORINAGA ct = gc->chip_types; 36854be5663STomoya MORINAGA 36954be5663STomoya MORINAGA ct->chip.irq_mask = ioh_irq_mask; 37054be5663STomoya MORINAGA ct->chip.irq_unmask = ioh_irq_unmask; 37154be5663STomoya MORINAGA ct->chip.irq_set_type = ioh_irq_type; 37254be5663STomoya MORINAGA 37354be5663STomoya MORINAGA irq_setup_generic_chip(gc, IRQ_MSK(num), IRQ_GC_INIT_MASK_CACHE, 37454be5663STomoya MORINAGA IRQ_NOREQUEST | IRQ_NOPROBE, 0); 375c103de24SGrant Likely } 376c103de24SGrant Likely 377c103de24SGrant Likely static int __devinit ioh_gpio_probe(struct pci_dev *pdev, 378c103de24SGrant Likely const struct pci_device_id *id) 379c103de24SGrant Likely { 380c103de24SGrant Likely int ret; 38154be5663STomoya MORINAGA int i, j; 382c103de24SGrant Likely struct ioh_gpio *chip; 383c103de24SGrant Likely void __iomem *base; 384c103de24SGrant Likely void __iomem *chip_save; 38554be5663STomoya MORINAGA int irq_base; 386c103de24SGrant Likely 387c103de24SGrant Likely ret = pci_enable_device(pdev); 388c103de24SGrant Likely if (ret) { 389c103de24SGrant Likely dev_err(&pdev->dev, "%s : pci_enable_device failed", __func__); 390c103de24SGrant Likely goto err_pci_enable; 391c103de24SGrant Likely } 392c103de24SGrant Likely 393c103de24SGrant Likely ret = pci_request_regions(pdev, KBUILD_MODNAME); 394c103de24SGrant Likely if (ret) { 395c103de24SGrant Likely dev_err(&pdev->dev, "pci_request_regions failed-%d", ret); 396c103de24SGrant Likely goto err_request_regions; 397c103de24SGrant Likely } 398c103de24SGrant Likely 399c103de24SGrant Likely base = pci_iomap(pdev, 1, 0); 400c103de24SGrant Likely if (base == 0) { 401c103de24SGrant Likely dev_err(&pdev->dev, "%s : pci_iomap failed", __func__); 402c103de24SGrant Likely ret = -ENOMEM; 403c103de24SGrant Likely goto err_iomap; 404c103de24SGrant Likely } 405c103de24SGrant Likely 406c103de24SGrant Likely chip_save = kzalloc(sizeof(*chip) * 8, GFP_KERNEL); 407c103de24SGrant Likely if (chip_save == NULL) { 408c103de24SGrant Likely dev_err(&pdev->dev, "%s : kzalloc failed", __func__); 409c103de24SGrant Likely ret = -ENOMEM; 410c103de24SGrant Likely goto err_kzalloc; 411c103de24SGrant Likely } 412c103de24SGrant Likely 413c103de24SGrant Likely chip = chip_save; 414c103de24SGrant Likely for (i = 0; i < 8; i++, chip++) { 415c103de24SGrant Likely chip->dev = &pdev->dev; 416c103de24SGrant Likely chip->base = base; 417c103de24SGrant Likely chip->reg = chip->base; 418c103de24SGrant Likely chip->ch = i; 419c103de24SGrant Likely mutex_init(&chip->lock); 420c103de24SGrant Likely ioh_gpio_setup(chip, num_ports[i]); 421c103de24SGrant Likely ret = gpiochip_add(&chip->gpio); 422c103de24SGrant Likely if (ret) { 423c103de24SGrant Likely dev_err(&pdev->dev, "IOH gpio: Failed to register GPIO\n"); 424c103de24SGrant Likely goto err_gpiochip_add; 425c103de24SGrant Likely } 426c103de24SGrant Likely } 427c103de24SGrant Likely 428c103de24SGrant Likely chip = chip_save; 42954be5663STomoya MORINAGA for (j = 0; j < 8; j++, chip++) { 43054be5663STomoya MORINAGA irq_base = irq_alloc_descs(-1, IOH_IRQ_BASE, num_ports[j], 43154be5663STomoya MORINAGA GFP_KERNEL); 43254be5663STomoya MORINAGA if (irq_base < 0) { 43354be5663STomoya MORINAGA dev_warn(&pdev->dev, 43454be5663STomoya MORINAGA "ml_ioh_gpio: Failed to get IRQ base num\n"); 43554be5663STomoya MORINAGA chip->irq_base = -1; 43654be5663STomoya MORINAGA goto err_irq_alloc_descs; 43754be5663STomoya MORINAGA } 43854be5663STomoya MORINAGA chip->irq_base = irq_base; 43954be5663STomoya MORINAGA ioh_gpio_alloc_generic_chip(chip, irq_base, num_ports[j]); 44054be5663STomoya MORINAGA } 44154be5663STomoya MORINAGA 44254be5663STomoya MORINAGA chip = chip_save; 44354be5663STomoya MORINAGA ret = request_irq(pdev->irq, ioh_gpio_handler, 44454be5663STomoya MORINAGA IRQF_SHARED, KBUILD_MODNAME, chip); 44554be5663STomoya MORINAGA if (ret != 0) { 44654be5663STomoya MORINAGA dev_err(&pdev->dev, 44754be5663STomoya MORINAGA "%s request_irq failed\n", __func__); 44854be5663STomoya MORINAGA goto err_request_irq; 44954be5663STomoya MORINAGA } 45054be5663STomoya MORINAGA 451c103de24SGrant Likely pci_set_drvdata(pdev, chip); 452c103de24SGrant Likely 453c103de24SGrant Likely return 0; 454c103de24SGrant Likely 45554be5663STomoya MORINAGA err_request_irq: 45654be5663STomoya MORINAGA chip = chip_save; 45754be5663STomoya MORINAGA err_irq_alloc_descs: 45854be5663STomoya MORINAGA while (--j >= 0) { 45954be5663STomoya MORINAGA chip--; 46054be5663STomoya MORINAGA irq_free_descs(chip->irq_base, num_ports[j]); 46154be5663STomoya MORINAGA } 46254be5663STomoya MORINAGA 46354be5663STomoya MORINAGA chip = chip_save; 464c103de24SGrant Likely err_gpiochip_add: 46533300571SAxel Lin while (--i >= 0) { 466c103de24SGrant Likely chip--; 467c103de24SGrant Likely ret = gpiochip_remove(&chip->gpio); 468c103de24SGrant Likely if (ret) 469c103de24SGrant Likely dev_err(&pdev->dev, "Failed gpiochip_remove(%d)\n", i); 470c103de24SGrant Likely } 471c103de24SGrant Likely kfree(chip_save); 472c103de24SGrant Likely 473c103de24SGrant Likely err_kzalloc: 474c103de24SGrant Likely pci_iounmap(pdev, base); 475c103de24SGrant Likely 476c103de24SGrant Likely err_iomap: 477c103de24SGrant Likely pci_release_regions(pdev); 478c103de24SGrant Likely 479c103de24SGrant Likely err_request_regions: 480c103de24SGrant Likely pci_disable_device(pdev); 481c103de24SGrant Likely 482c103de24SGrant Likely err_pci_enable: 483c103de24SGrant Likely 484c103de24SGrant Likely dev_err(&pdev->dev, "%s Failed returns %d\n", __func__, ret); 485c103de24SGrant Likely return ret; 486c103de24SGrant Likely } 487c103de24SGrant Likely 488c103de24SGrant Likely static void __devexit ioh_gpio_remove(struct pci_dev *pdev) 489c103de24SGrant Likely { 490c103de24SGrant Likely int err; 491c103de24SGrant Likely int i; 492c103de24SGrant Likely struct ioh_gpio *chip = pci_get_drvdata(pdev); 493c103de24SGrant Likely void __iomem *chip_save; 494c103de24SGrant Likely 495c103de24SGrant Likely chip_save = chip; 49654be5663STomoya MORINAGA 49754be5663STomoya MORINAGA free_irq(pdev->irq, chip); 49854be5663STomoya MORINAGA 499c103de24SGrant Likely for (i = 0; i < 8; i++, chip++) { 50054be5663STomoya MORINAGA irq_free_descs(chip->irq_base, num_ports[i]); 501c103de24SGrant Likely err = gpiochip_remove(&chip->gpio); 502c103de24SGrant Likely if (err) 503c103de24SGrant Likely dev_err(&pdev->dev, "Failed gpiochip_remove\n"); 504c103de24SGrant Likely } 505c103de24SGrant Likely 506c103de24SGrant Likely chip = chip_save; 507c103de24SGrant Likely pci_iounmap(pdev, chip->base); 508c103de24SGrant Likely pci_release_regions(pdev); 509c103de24SGrant Likely pci_disable_device(pdev); 510c103de24SGrant Likely kfree(chip); 511c103de24SGrant Likely } 512c103de24SGrant Likely 513c103de24SGrant Likely #ifdef CONFIG_PM 514c103de24SGrant Likely static int ioh_gpio_suspend(struct pci_dev *pdev, pm_message_t state) 515c103de24SGrant Likely { 516c103de24SGrant Likely s32 ret; 517c103de24SGrant Likely struct ioh_gpio *chip = pci_get_drvdata(pdev); 518*b490fa0bSTomoya MORINAGA unsigned long flags; 519c103de24SGrant Likely 520*b490fa0bSTomoya MORINAGA spin_lock_irqsave(&chip->spinlock, flags); 521c103de24SGrant Likely ioh_gpio_save_reg_conf(chip); 522*b490fa0bSTomoya MORINAGA spin_unlock_irqrestore(&chip->spinlock, flags); 523c103de24SGrant Likely 524c103de24SGrant Likely ret = pci_save_state(pdev); 525c103de24SGrant Likely if (ret) { 526c103de24SGrant Likely dev_err(&pdev->dev, "pci_save_state Failed-%d\n", ret); 527c103de24SGrant Likely return ret; 528c103de24SGrant Likely } 529c103de24SGrant Likely pci_disable_device(pdev); 530c103de24SGrant Likely pci_set_power_state(pdev, PCI_D0); 531c103de24SGrant Likely ret = pci_enable_wake(pdev, PCI_D0, 1); 532c103de24SGrant Likely if (ret) 533c103de24SGrant Likely dev_err(&pdev->dev, "pci_enable_wake Failed -%d\n", ret); 534c103de24SGrant Likely 535c103de24SGrant Likely return 0; 536c103de24SGrant Likely } 537c103de24SGrant Likely 538c103de24SGrant Likely static int ioh_gpio_resume(struct pci_dev *pdev) 539c103de24SGrant Likely { 540c103de24SGrant Likely s32 ret; 541c103de24SGrant Likely struct ioh_gpio *chip = pci_get_drvdata(pdev); 542*b490fa0bSTomoya MORINAGA unsigned long flags; 543c103de24SGrant Likely 544c103de24SGrant Likely ret = pci_enable_wake(pdev, PCI_D0, 0); 545c103de24SGrant Likely 546c103de24SGrant Likely pci_set_power_state(pdev, PCI_D0); 547c103de24SGrant Likely ret = pci_enable_device(pdev); 548c103de24SGrant Likely if (ret) { 549c103de24SGrant Likely dev_err(&pdev->dev, "pci_enable_device Failed-%d ", ret); 550c103de24SGrant Likely return ret; 551c103de24SGrant Likely } 552c103de24SGrant Likely pci_restore_state(pdev); 553c103de24SGrant Likely 554*b490fa0bSTomoya MORINAGA spin_lock_irqsave(&chip->spinlock, flags); 555c103de24SGrant Likely iowrite32(0x01, &chip->reg->srst); 556c103de24SGrant Likely iowrite32(0x00, &chip->reg->srst); 557c103de24SGrant Likely ioh_gpio_restore_reg_conf(chip); 558*b490fa0bSTomoya MORINAGA spin_unlock_irqrestore(&chip->spinlock, flags); 559c103de24SGrant Likely 560c103de24SGrant Likely return 0; 561c103de24SGrant Likely } 562c103de24SGrant Likely #else 563c103de24SGrant Likely #define ioh_gpio_suspend NULL 564c103de24SGrant Likely #define ioh_gpio_resume NULL 565c103de24SGrant Likely #endif 566c103de24SGrant Likely 567c103de24SGrant Likely static DEFINE_PCI_DEVICE_TABLE(ioh_gpio_pcidev_id) = { 568c103de24SGrant Likely { PCI_DEVICE(PCI_VENDOR_ID_ROHM, 0x802E) }, 569c103de24SGrant Likely { 0, } 570c103de24SGrant Likely }; 571c103de24SGrant Likely MODULE_DEVICE_TABLE(pci, ioh_gpio_pcidev_id); 572c103de24SGrant Likely 573c103de24SGrant Likely static struct pci_driver ioh_gpio_driver = { 574c103de24SGrant Likely .name = "ml_ioh_gpio", 575c103de24SGrant Likely .id_table = ioh_gpio_pcidev_id, 576c103de24SGrant Likely .probe = ioh_gpio_probe, 577c103de24SGrant Likely .remove = __devexit_p(ioh_gpio_remove), 578c103de24SGrant Likely .suspend = ioh_gpio_suspend, 579c103de24SGrant Likely .resume = ioh_gpio_resume 580c103de24SGrant Likely }; 581c103de24SGrant Likely 582c103de24SGrant Likely static int __init ioh_gpio_pci_init(void) 583c103de24SGrant Likely { 584c103de24SGrant Likely return pci_register_driver(&ioh_gpio_driver); 585c103de24SGrant Likely } 586c103de24SGrant Likely module_init(ioh_gpio_pci_init); 587c103de24SGrant Likely 588c103de24SGrant Likely static void __exit ioh_gpio_pci_exit(void) 589c103de24SGrant Likely { 590c103de24SGrant Likely pci_unregister_driver(&ioh_gpio_driver); 591c103de24SGrant Likely } 592c103de24SGrant Likely module_exit(ioh_gpio_pci_exit); 593c103de24SGrant Likely 594c103de24SGrant Likely MODULE_DESCRIPTION("OKI SEMICONDUCTOR ML-IOH series GPIO Driver"); 595c103de24SGrant Likely MODULE_LICENSE("GPL"); 596