• Home
  • Raw
  • Download

Lines Matching +full:jz4770 +full:- +full:gpio

2  * Ingenic JZ47xx GPIO driver
9 #include <linux/gpio/driver.h>
54 regmap_read(jzgc->map, jzgc->reg_base + reg, &val); in gpio_ingenic_read_reg()
67 regmap_write(jzgc->map, jzgc->reg_base + reg, BIT(offset)); in gpio_ingenic_set_bit()
79 if (jzgc->version >= ID_JZ4770) in gpio_set_value()
90 if (jzgc->version >= ID_JZ4770) { in irq_set_type()
124 gpio_ingenic_set_bit(jzgc, GPIO_MSK, irqd->hwirq, true); in ingenic_gpio_irq_mask()
132 gpio_ingenic_set_bit(jzgc, GPIO_MSK, irqd->hwirq, false); in ingenic_gpio_irq_unmask()
139 int irq = irqd->hwirq; in ingenic_gpio_irq_enable()
141 if (jzgc->version >= ID_JZ4770) in ingenic_gpio_irq_enable()
153 int irq = irqd->hwirq; in ingenic_gpio_irq_disable()
157 if (jzgc->version >= ID_JZ4770) in ingenic_gpio_irq_disable()
167 int irq = irqd->hwirq; in ingenic_gpio_irq_ack()
182 if (jzgc->version >= ID_JZ4770) in ingenic_gpio_irq_ack()
210 * best we can do is to set up a single-edge interrupt and then in ingenic_gpio_irq_set_type()
213 bool high = gpio_get_value(jzgc, irqd->hwirq); in ingenic_gpio_irq_set_type()
218 irq_set_type(jzgc, irqd->hwirq, type); in ingenic_gpio_irq_set_type()
227 return irq_set_irq_wake(jzgc->irq, on); in ingenic_gpio_irq_set_wake()
234 struct irq_chip *irq_chip = irq_data_get_irq_chip(&desc->irq_data); in ingenic_gpio_irq_handler()
239 if (jzgc->version >= ID_JZ4770) in ingenic_gpio_irq_handler()
245 generic_handle_irq(irq_linear_revmap(gc->irq.domain, i)); in ingenic_gpio_irq_handler()
267 return pinctrl_gpio_direction_input(gc->base + offset); in ingenic_gpio_direction_input()
274 return pinctrl_gpio_direction_output(gc->base + offset); in ingenic_gpio_direction_output()
278 { .compatible = "ingenic,jz4740-gpio", .data = (void *)ID_JZ4740 },
279 { .compatible = "ingenic,jz4770-gpio", .data = (void *)ID_JZ4770 },
280 { .compatible = "ingenic,jz4780-gpio", .data = (void *)ID_JZ4780 },
287 struct device *dev = &pdev->dev; in ingenic_gpio_probe()
294 return -ENOMEM; in ingenic_gpio_probe()
296 jzgc->map = dev_get_drvdata(dev->parent); in ingenic_gpio_probe()
297 if (!jzgc->map) { in ingenic_gpio_probe()
299 return -ENXIO; in ingenic_gpio_probe()
302 err = of_property_read_u32(dev->of_node, "reg", &bank); in ingenic_gpio_probe()
308 jzgc->reg_base = bank * 0x100; in ingenic_gpio_probe()
310 jzgc->gc.label = devm_kasprintf(dev, GFP_KERNEL, "GPIO%c", 'A' + bank); in ingenic_gpio_probe()
311 if (!jzgc->gc.label) in ingenic_gpio_probe()
312 return -ENOMEM; in ingenic_gpio_probe()
314 /* DO NOT EXPAND THIS: FOR BACKWARD GPIO NUMBERSPACE COMPATIBIBILITY in ingenic_gpio_probe()
315 * ONLY: WORK TO TRANSITION CONSUMERS TO USE THE GPIO DESCRIPTOR API IN in ingenic_gpio_probe()
316 * <linux/gpio/consumer.h> INSTEAD. in ingenic_gpio_probe()
318 jzgc->gc.base = bank * 32; in ingenic_gpio_probe()
320 jzgc->gc.ngpio = 32; in ingenic_gpio_probe()
321 jzgc->gc.parent = dev; in ingenic_gpio_probe()
322 jzgc->gc.of_node = dev->of_node; in ingenic_gpio_probe()
323 jzgc->gc.owner = THIS_MODULE; in ingenic_gpio_probe()
324 jzgc->version = (enum jz_version)of_device_get_match_data(dev); in ingenic_gpio_probe()
326 jzgc->gc.set = ingenic_gpio_set; in ingenic_gpio_probe()
327 jzgc->gc.get = ingenic_gpio_get; in ingenic_gpio_probe()
328 jzgc->gc.direction_input = ingenic_gpio_direction_input; in ingenic_gpio_probe()
329 jzgc->gc.direction_output = ingenic_gpio_direction_output; in ingenic_gpio_probe()
331 if (of_property_read_bool(dev->of_node, "gpio-ranges")) { in ingenic_gpio_probe()
332 jzgc->gc.request = gpiochip_generic_request; in ingenic_gpio_probe()
333 jzgc->gc.free = gpiochip_generic_free; in ingenic_gpio_probe()
336 err = devm_gpiochip_add_data(dev, &jzgc->gc, jzgc); in ingenic_gpio_probe()
340 jzgc->irq = irq_of_parse_and_map(dev->of_node, 0); in ingenic_gpio_probe()
341 if (!jzgc->irq) in ingenic_gpio_probe()
342 return -EINVAL; in ingenic_gpio_probe()
344 jzgc->irq_chip.name = jzgc->gc.label; in ingenic_gpio_probe()
345 jzgc->irq_chip.irq_enable = ingenic_gpio_irq_enable; in ingenic_gpio_probe()
346 jzgc->irq_chip.irq_disable = ingenic_gpio_irq_disable; in ingenic_gpio_probe()
347 jzgc->irq_chip.irq_unmask = ingenic_gpio_irq_unmask; in ingenic_gpio_probe()
348 jzgc->irq_chip.irq_mask = ingenic_gpio_irq_mask; in ingenic_gpio_probe()
349 jzgc->irq_chip.irq_ack = ingenic_gpio_irq_ack; in ingenic_gpio_probe()
350 jzgc->irq_chip.irq_set_type = ingenic_gpio_irq_set_type; in ingenic_gpio_probe()
351 jzgc->irq_chip.irq_set_wake = ingenic_gpio_irq_set_wake; in ingenic_gpio_probe()
352 jzgc->irq_chip.flags = IRQCHIP_MASK_ON_SUSPEND; in ingenic_gpio_probe()
354 err = gpiochip_irqchip_add(&jzgc->gc, &jzgc->irq_chip, 0, in ingenic_gpio_probe()
359 gpiochip_set_chained_irqchip(&jzgc->gc, &jzgc->irq_chip, in ingenic_gpio_probe()
360 jzgc->irq, ingenic_gpio_irq_handler); in ingenic_gpio_probe()
371 .name = "gpio-ingenic",
391 MODULE_DESCRIPTION("Ingenic JZ47xx GPIO driver");