H A D | gpio.c | 51 static void __iomem *GPIO_OUT(struct orion_gpio_chip *ochip) GPIO_OUT() argument 53 return ochip->base + GPIO_OUT_OFF; GPIO_OUT() 56 static void __iomem *GPIO_IO_CONF(struct orion_gpio_chip *ochip) GPIO_IO_CONF() argument 58 return ochip->base + GPIO_IO_CONF_OFF; GPIO_IO_CONF() 61 static void __iomem *GPIO_BLINK_EN(struct orion_gpio_chip *ochip) GPIO_BLINK_EN() argument 63 return ochip->base + GPIO_BLINK_EN_OFF; GPIO_BLINK_EN() 66 static void __iomem *GPIO_IN_POL(struct orion_gpio_chip *ochip) GPIO_IN_POL() argument 68 return ochip->base + GPIO_IN_POL_OFF; GPIO_IN_POL() 71 static void __iomem *GPIO_DATA_IN(struct orion_gpio_chip *ochip) GPIO_DATA_IN() argument 73 return ochip->base + GPIO_DATA_IN_OFF; GPIO_DATA_IN() 76 static void __iomem *GPIO_EDGE_CAUSE(struct orion_gpio_chip *ochip) GPIO_EDGE_CAUSE() argument 78 return ochip->base + GPIO_EDGE_CAUSE_OFF; GPIO_EDGE_CAUSE() 81 static void __iomem *GPIO_EDGE_MASK(struct orion_gpio_chip *ochip) GPIO_EDGE_MASK() argument 83 return ochip->base + ochip->mask_offset + GPIO_EDGE_MASK_OFF; GPIO_EDGE_MASK() 86 static void __iomem *GPIO_LEVEL_MASK(struct orion_gpio_chip *ochip) GPIO_LEVEL_MASK() argument 88 return ochip->base + ochip->mask_offset + GPIO_LEVEL_MASK_OFF; GPIO_LEVEL_MASK() 96 __set_direction(struct orion_gpio_chip *ochip, unsigned pin, int input) __set_direction() argument 100 u = readl(GPIO_IO_CONF(ochip)); __set_direction() 105 writel(u, GPIO_IO_CONF(ochip)); __set_direction() 108 static void __set_level(struct orion_gpio_chip *ochip, unsigned pin, int high) __set_level() argument 112 u = readl(GPIO_OUT(ochip)); __set_level() 117 writel(u, GPIO_OUT(ochip)); __set_level() 121 __set_blinking(struct orion_gpio_chip *ochip, unsigned pin, int blink) __set_blinking() argument 125 u = readl(GPIO_BLINK_EN(ochip)); __set_blinking() 130 writel(u, GPIO_BLINK_EN(ochip)); __set_blinking() 134 orion_gpio_is_valid(struct orion_gpio_chip *ochip, unsigned pin, int mode) orion_gpio_is_valid() argument 136 if (pin >= ochip->chip.ngpio) orion_gpio_is_valid() 139 if ((mode & GPIO_INPUT_OK) && !test_bit(pin, &ochip->valid_input)) orion_gpio_is_valid() 142 if ((mode & GPIO_OUTPUT_OK) && !test_bit(pin, &ochip->valid_output)) orion_gpio_is_valid() 157 struct orion_gpio_chip *ochip = orion_gpio_request() local 160 if (orion_gpio_is_valid(ochip, pin, GPIO_INPUT_OK) || orion_gpio_request() 161 orion_gpio_is_valid(ochip, pin, GPIO_OUTPUT_OK)) orion_gpio_request() 169 struct orion_gpio_chip *ochip = orion_gpio_direction_input() local 173 if (!orion_gpio_is_valid(ochip, pin, GPIO_INPUT_OK)) orion_gpio_direction_input() 176 spin_lock_irqsave(&ochip->lock, flags); orion_gpio_direction_input() 177 __set_direction(ochip, pin, 1); orion_gpio_direction_input() 178 spin_unlock_irqrestore(&ochip->lock, flags); orion_gpio_direction_input() 185 struct orion_gpio_chip *ochip = orion_gpio_get() local 189 if (readl(GPIO_IO_CONF(ochip)) & (1 << pin)) { orion_gpio_get() 190 val = readl(GPIO_DATA_IN(ochip)) ^ readl(GPIO_IN_POL(ochip)); orion_gpio_get() 192 val = readl(GPIO_OUT(ochip)); orion_gpio_get() 201 struct orion_gpio_chip *ochip = orion_gpio_direction_output() local 205 if (!orion_gpio_is_valid(ochip, pin, GPIO_OUTPUT_OK)) orion_gpio_direction_output() 208 spin_lock_irqsave(&ochip->lock, flags); orion_gpio_direction_output() 209 __set_blinking(ochip, pin, 0); orion_gpio_direction_output() 210 __set_level(ochip, pin, value); orion_gpio_direction_output() 211 __set_direction(ochip, pin, 0); orion_gpio_direction_output() 212 spin_unlock_irqrestore(&ochip->lock, flags); orion_gpio_direction_output() 219 struct orion_gpio_chip *ochip = orion_gpio_set() local 223 spin_lock_irqsave(&ochip->lock, flags); orion_gpio_set() 224 __set_level(ochip, pin, value); orion_gpio_set() 225 spin_unlock_irqrestore(&ochip->lock, flags); orion_gpio_set() 230 struct orion_gpio_chip *ochip = orion_gpio_to_irq() local 233 return irq_create_mapping(ochip->domain, orion_gpio_to_irq() 234 ochip->secondary_irq_base + pin); orion_gpio_to_irq() 245 struct orion_gpio_chip *ochip = orion_gpio_chips + i; orion_gpio_chip_find() local 246 struct gpio_chip *chip = &ochip->chip; orion_gpio_chip_find() 249 return ochip; orion_gpio_chip_find() 257 struct orion_gpio_chip *ochip = orion_gpio_chip_find(pin); orion_gpio_set_unused() local 259 if (ochip == NULL) orion_gpio_set_unused() 262 pin -= ochip->chip.base; orion_gpio_set_unused() 265 __set_level(ochip, pin, 0); orion_gpio_set_unused() 266 __set_direction(ochip, pin, 0); orion_gpio_set_unused() 271 struct orion_gpio_chip *ochip = orion_gpio_chip_find(pin); orion_gpio_set_valid() local 273 if (ochip == NULL) orion_gpio_set_valid() 276 pin -= ochip->chip.base; orion_gpio_set_valid() 282 __set_bit(pin, &ochip->valid_input); orion_gpio_set_valid() 284 __clear_bit(pin, &ochip->valid_input); orion_gpio_set_valid() 287 __set_bit(pin, &ochip->valid_output); orion_gpio_set_valid() 289 __clear_bit(pin, &ochip->valid_output); orion_gpio_set_valid() 294 struct orion_gpio_chip *ochip = orion_gpio_chip_find(pin); orion_gpio_set_blink() local 297 if (ochip == NULL) orion_gpio_set_blink() 300 spin_lock_irqsave(&ochip->lock, flags); orion_gpio_set_blink() 301 __set_level(ochip, pin & 31, 0); orion_gpio_set_blink() 302 __set_blinking(ochip, pin & 31, blink); orion_gpio_set_blink() 303 spin_unlock_irqrestore(&ochip->lock, flags); orion_gpio_set_blink() 361 struct orion_gpio_chip *ochip = gc->private; gpio_irq_set_type() local 365 pin = d->hwirq - ochip->secondary_irq_base; gpio_irq_set_type() 367 u = readl(GPIO_IO_CONF(ochip)) & (1 << pin); gpio_irq_set_type() 385 u = readl(GPIO_IN_POL(ochip)); gpio_irq_set_type() 387 writel(u, GPIO_IN_POL(ochip)); gpio_irq_set_type() 389 u = readl(GPIO_IN_POL(ochip)); gpio_irq_set_type() 391 writel(u, GPIO_IN_POL(ochip)); gpio_irq_set_type() 395 v = readl(GPIO_IN_POL(ochip)) ^ readl(GPIO_DATA_IN(ochip)); gpio_irq_set_type() 400 u = readl(GPIO_IN_POL(ochip)); gpio_irq_set_type() 405 writel(u, GPIO_IN_POL(ochip)); gpio_irq_set_type() 412 struct orion_gpio_chip *ochip = irq_desc_get_handler_data(desc); gpio_irq_handler() local 416 if (ochip == NULL) gpio_irq_handler() 419 cause = readl(GPIO_DATA_IN(ochip)) & readl(GPIO_LEVEL_MASK(ochip)); gpio_irq_handler() 420 cause |= readl(GPIO_EDGE_CAUSE(ochip)) & readl(GPIO_EDGE_MASK(ochip)); gpio_irq_handler() 422 for (i = 0; i < ochip->chip.ngpio; i++) { gpio_irq_handler() 425 irq = ochip->secondary_irq_base + i; gpio_irq_handler() 435 polarity = readl(GPIO_IN_POL(ochip)); gpio_irq_handler() 437 writel(polarity, GPIO_IN_POL(ochip)); gpio_irq_handler() 448 struct orion_gpio_chip *ochip = orion_gpio_dbg_show() local 453 out = readl_relaxed(GPIO_OUT(ochip)); orion_gpio_dbg_show() 454 io_conf = readl_relaxed(GPIO_IO_CONF(ochip)); orion_gpio_dbg_show() 455 blink = readl_relaxed(GPIO_BLINK_EN(ochip)); orion_gpio_dbg_show() 456 in_pol = readl_relaxed(GPIO_IN_POL(ochip)); orion_gpio_dbg_show() 457 data_in = readl_relaxed(GPIO_DATA_IN(ochip)); orion_gpio_dbg_show() 458 cause = readl_relaxed(GPIO_EDGE_CAUSE(ochip)); orion_gpio_dbg_show() 459 edg_msk = readl_relaxed(GPIO_EDGE_MASK(ochip)); orion_gpio_dbg_show() 460 lvl_msk = readl_relaxed(GPIO_LEVEL_MASK(ochip)); orion_gpio_dbg_show() 535 struct orion_gpio_chip *ochip; orion_gpio_init() local 547 ochip = orion_gpio_chips + orion_gpio_chip_count; orion_gpio_init() 548 ochip->chip.label = kstrdup(gc_label, GFP_KERNEL); orion_gpio_init() 549 ochip->chip.request = orion_gpio_request; orion_gpio_init() 550 ochip->chip.direction_input = orion_gpio_direction_input; orion_gpio_init() 551 ochip->chip.get = orion_gpio_get; orion_gpio_init() 552 ochip->chip.direction_output = orion_gpio_direction_output; orion_gpio_init() 553 ochip->chip.set = orion_gpio_set; orion_gpio_init() 554 ochip->chip.to_irq = orion_gpio_to_irq; orion_gpio_init() 555 ochip->chip.base = gpio_base; orion_gpio_init() 556 ochip->chip.ngpio = ngpio; orion_gpio_init() 557 ochip->chip.can_sleep = 0; orion_gpio_init() 559 ochip->chip.of_node = np; orion_gpio_init() 561 ochip->chip.dbg_show = orion_gpio_dbg_show; orion_gpio_init() 563 spin_lock_init(&ochip->lock); orion_gpio_init() 564 ochip->base = (void __iomem *)base; orion_gpio_init() 565 ochip->valid_input = 0; orion_gpio_init() 566 ochip->valid_output = 0; orion_gpio_init() 567 ochip->mask_offset = mask_offset; orion_gpio_init() 568 ochip->secondary_irq_base = secondary_irq_base; orion_gpio_init() 570 gpiochip_add(&ochip->chip); orion_gpio_init() 575 writel(0, GPIO_EDGE_CAUSE(ochip)); orion_gpio_init() 576 writel(0, GPIO_EDGE_MASK(ochip)); orion_gpio_init() 577 writel(0, GPIO_LEVEL_MASK(ochip)); orion_gpio_init() 587 ochip); orion_gpio_init() 593 ochip->base, handle_level_irq); orion_gpio_init() 594 gc->private = ochip; orion_gpio_init() 596 ct->regs.mask = ochip->mask_offset + GPIO_LEVEL_MASK_OFF; orion_gpio_init() 601 ct->chip.name = ochip->chip.label; orion_gpio_init() 604 ct->regs.mask = ochip->mask_offset + GPIO_EDGE_MASK_OFF; orion_gpio_init() 612 ct->chip.name = ochip->chip.label; orion_gpio_init() 618 ochip->domain = irq_domain_add_legacy(np, orion_gpio_init() 619 ochip->chip.ngpio, orion_gpio_init() 620 ochip->secondary_irq_base, orion_gpio_init() 621 ochip->secondary_irq_base, orion_gpio_init() 623 ochip); orion_gpio_init() 624 if (!ochip->domain) orion_gpio_init() 626 ochip->chip.label); orion_gpio_init()
|