Lines Matching +full:em +full:- +full:gio
2 * Emma Mobile GPIO Support - GIO
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
73 return ioread32(p->base0 + offs); in em_gio_read()
75 return ioread32(p->base1 + (offs - GIO_IDT0)); in em_gio_read()
82 iowrite32(value, p->base0 + offs); in em_gio_write()
84 iowrite32(value, p->base1 + (offs - GIO_IDT0)); in em_gio_write()
106 ret = gpiochip_lock_as_irq(&p->gpio_chip, irqd_to_hwirq(d)); in em_gio_irq_reqres()
108 dev_err(p->gpio_chip.parent, in em_gio_irq_reqres()
120 gpiochip_unlock_as_irq(&p->gpio_chip, irqd_to_hwirq(d)); in em_gio_irq_relres()
143 return -EINVAL; in em_gio_irq_set_type()
147 pr_debug("gio: sense irq = %d, mode = %d\n", offset, value); in em_gio_irq_set_type()
153 spin_lock_irqsave(&p->sense_lock, flags); in em_gio_irq_set_type()
174 spin_unlock_irqrestore(&p->sense_lock, flags); in em_gio_irq_set_type()
188 generic_handle_irq(irq_find_mapping(p->irq_domain, offset)); in em_gio_irq_handler()
225 __em_gio_set(chip, GIO_OH, offset - 16, value); in em_gio_set()
239 return irq_create_mapping(gpio_to_priv(chip)->irq_domain, offset); in em_gio_to_irq()
244 return pinctrl_gpio_request(chip->base + offset); in em_gio_request()
249 pinctrl_gpio_free(chip->base + offset); in em_gio_free()
260 struct em_gio_priv *p = h->host_data; in em_gio_irq_domain_map()
262 pr_debug("gio: map hw irq = %d, irq = %d\n", (int)hwirq, irq); in em_gio_irq_domain_map()
264 irq_set_chip_data(irq, h->host_data); in em_gio_irq_domain_map()
265 irq_set_chip_and_handler(irq, &p->irq_chip, handle_level_irq); in em_gio_irq_domain_map()
280 const char *name = dev_name(&pdev->dev); in em_gio_probe()
284 p = devm_kzalloc(&pdev->dev, sizeof(*p), GFP_KERNEL); in em_gio_probe()
286 ret = -ENOMEM; in em_gio_probe()
290 p->pdev = pdev; in em_gio_probe()
292 spin_lock_init(&p->sense_lock); in em_gio_probe()
300 dev_err(&pdev->dev, "missing IRQ or IOMEM\n"); in em_gio_probe()
301 ret = -EINVAL; in em_gio_probe()
305 p->base0 = devm_ioremap_nocache(&pdev->dev, io[0]->start, in em_gio_probe()
307 if (!p->base0) { in em_gio_probe()
308 dev_err(&pdev->dev, "failed to remap low I/O memory\n"); in em_gio_probe()
309 ret = -ENXIO; in em_gio_probe()
313 p->base1 = devm_ioremap_nocache(&pdev->dev, io[1]->start, in em_gio_probe()
315 if (!p->base1) { in em_gio_probe()
316 dev_err(&pdev->dev, "failed to remap high I/O memory\n"); in em_gio_probe()
317 ret = -ENXIO; in em_gio_probe()
321 if (of_property_read_u32(pdev->dev.of_node, "ngpios", &ngpios)) { in em_gio_probe()
322 dev_err(&pdev->dev, "Missing ngpios OF property\n"); in em_gio_probe()
323 ret = -EINVAL; in em_gio_probe()
327 gpio_chip = &p->gpio_chip; in em_gio_probe()
328 gpio_chip->of_node = pdev->dev.of_node; in em_gio_probe()
329 gpio_chip->direction_input = em_gio_direction_input; in em_gio_probe()
330 gpio_chip->get = em_gio_get; in em_gio_probe()
331 gpio_chip->direction_output = em_gio_direction_output; in em_gio_probe()
332 gpio_chip->set = em_gio_set; in em_gio_probe()
333 gpio_chip->to_irq = em_gio_to_irq; in em_gio_probe()
334 gpio_chip->request = em_gio_request; in em_gio_probe()
335 gpio_chip->free = em_gio_free; in em_gio_probe()
336 gpio_chip->label = name; in em_gio_probe()
337 gpio_chip->parent = &pdev->dev; in em_gio_probe()
338 gpio_chip->owner = THIS_MODULE; in em_gio_probe()
339 gpio_chip->base = -1; in em_gio_probe()
340 gpio_chip->ngpio = ngpios; in em_gio_probe()
342 irq_chip = &p->irq_chip; in em_gio_probe()
343 irq_chip->name = name; in em_gio_probe()
344 irq_chip->irq_mask = em_gio_irq_disable; in em_gio_probe()
345 irq_chip->irq_unmask = em_gio_irq_enable; in em_gio_probe()
346 irq_chip->irq_set_type = em_gio_irq_set_type; in em_gio_probe()
347 irq_chip->irq_request_resources = em_gio_irq_reqres; in em_gio_probe()
348 irq_chip->irq_release_resources = em_gio_irq_relres; in em_gio_probe()
349 irq_chip->flags = IRQCHIP_SKIP_SET_WAKE | IRQCHIP_MASK_ON_SUSPEND; in em_gio_probe()
351 p->irq_domain = irq_domain_add_simple(pdev->dev.of_node, ngpios, 0, in em_gio_probe()
353 if (!p->irq_domain) { in em_gio_probe()
354 ret = -ENXIO; in em_gio_probe()
355 dev_err(&pdev->dev, "cannot initialize irq domain\n"); in em_gio_probe()
359 if (devm_request_irq(&pdev->dev, irq[0]->start, in em_gio_probe()
361 dev_err(&pdev->dev, "failed to request low IRQ\n"); in em_gio_probe()
362 ret = -ENOENT; in em_gio_probe()
366 if (devm_request_irq(&pdev->dev, irq[1]->start, in em_gio_probe()
368 dev_err(&pdev->dev, "failed to request high IRQ\n"); in em_gio_probe()
369 ret = -ENOENT; in em_gio_probe()
375 dev_err(&pdev->dev, "failed to add GPIO controller\n"); in em_gio_probe()
382 irq_domain_remove(p->irq_domain); in em_gio_probe()
391 gpiochip_remove(&p->gpio_chip); in em_gio_remove()
393 irq_domain_remove(p->irq_domain); in em_gio_remove()
398 { .compatible = "renesas,em-gio", },
425 MODULE_DESCRIPTION("Renesas Emma Mobile GIO Driver");