Lines Matching +full:parent +full:- +full:interrupt +full:- +full:base
1 // SPDX-License-Identifier: GPL-2.0
15 #include <dt-bindings/gpio/msc313-gpio.h>
16 #include <dt-bindings/interrupt-controller/arm-gic.h>
18 #define DRIVER_NAME "gpio-msc313"
227 void __iomem *base; member
235 u8 gpioreg = readb_relaxed(gpio->base + gpio->gpio_data->offsets[offset]); in msc313_gpio_set()
242 writeb_relaxed(gpioreg, gpio->base + gpio->gpio_data->offsets[offset]); in msc313_gpio_set()
249 return readb_relaxed(gpio->base + gpio->gpio_data->offsets[offset]) & MSC313_GPIO_IN; in msc313_gpio_get()
255 u8 gpioreg = readb_relaxed(gpio->base + gpio->gpio_data->offsets[offset]); in msc313_gpio_direction_input()
258 writeb_relaxed(gpioreg, gpio->base + gpio->gpio_data->offsets[offset]); in msc313_gpio_direction_input()
266 u8 gpioreg = readb_relaxed(gpio->base + gpio->gpio_data->offsets[offset]); in msc313_gpio_direction_output()
273 writeb_relaxed(gpioreg, gpio->base + gpio->gpio_data->offsets[offset]); in msc313_gpio_direction_output()
279 * The interrupt handling happens in the parent interrupt controller,
292 * The parent interrupt controller needs the GIC interrupt type set to GIC_SPI
306 fwspec->fwnode = gc->irq.parent_domain->fwnode; in msc313_gpio_populate_parent_fwspec()
307 fwspec->param_count = 3; in msc313_gpio_populate_parent_fwspec()
308 fwspec->param[0] = GIC_SPI; in msc313_gpio_populate_parent_fwspec()
309 fwspec->param[1] = parent_hwirq; in msc313_gpio_populate_parent_fwspec()
310 fwspec->param[2] = parent_type; in msc313_gpio_populate_parent_fwspec()
318 unsigned int *parent, in msc313e_gpio_child_to_parent_hwirq() argument
322 unsigned int offset = priv->gpio_data->offsets[child]; in msc313e_gpio_child_to_parent_hwirq()
325 * only the spi0 pins have interrupts on the parent in msc313e_gpio_child_to_parent_hwirq()
331 *parent = ((offset - OFF_SPI0_CZ) >> 2) + 28; in msc313e_gpio_child_to_parent_hwirq()
335 return -EINVAL; in msc313e_gpio_child_to_parent_hwirq()
346 struct device *dev = &pdev->dev; in msc313_gpio_probe()
351 return -EINVAL; in msc313_gpio_probe()
353 parent_node = of_irq_find_parent(dev->of_node); in msc313_gpio_probe()
355 return -ENODEV; in msc313_gpio_probe()
359 return -ENODEV; in msc313_gpio_probe()
363 return -ENOMEM; in msc313_gpio_probe()
365 gpio->gpio_data = match_data; in msc313_gpio_probe()
367 gpio->saved = devm_kcalloc(dev, gpio->gpio_data->num, sizeof(*gpio->saved), GFP_KERNEL); in msc313_gpio_probe()
368 if (!gpio->saved) in msc313_gpio_probe()
369 return -ENOMEM; in msc313_gpio_probe()
371 gpio->base = devm_platform_ioremap_resource(pdev, 0); in msc313_gpio_probe()
372 if (IS_ERR(gpio->base)) in msc313_gpio_probe()
373 return PTR_ERR(gpio->base); in msc313_gpio_probe()
379 return -ENOMEM; in msc313_gpio_probe()
381 gpiochip->label = DRIVER_NAME; in msc313_gpio_probe()
382 gpiochip->parent = dev; in msc313_gpio_probe()
383 gpiochip->request = gpiochip_generic_request; in msc313_gpio_probe()
384 gpiochip->free = gpiochip_generic_free; in msc313_gpio_probe()
385 gpiochip->direction_input = msc313_gpio_direction_input; in msc313_gpio_probe()
386 gpiochip->direction_output = msc313_gpio_direction_output; in msc313_gpio_probe()
387 gpiochip->get = msc313_gpio_get; in msc313_gpio_probe()
388 gpiochip->set = msc313_gpio_set; in msc313_gpio_probe()
389 gpiochip->base = -1; in msc313_gpio_probe()
390 gpiochip->ngpio = gpio->gpio_data->num; in msc313_gpio_probe()
391 gpiochip->names = gpio->gpio_data->names; in msc313_gpio_probe()
393 gpioirqchip = &gpiochip->irq; in msc313_gpio_probe()
394 gpioirqchip->chip = &msc313_gpio_irqchip; in msc313_gpio_probe()
395 gpioirqchip->fwnode = of_node_to_fwnode(dev->of_node); in msc313_gpio_probe()
396 gpioirqchip->parent_domain = parent_domain; in msc313_gpio_probe()
397 gpioirqchip->child_to_parent_hwirq = msc313e_gpio_child_to_parent_hwirq; in msc313_gpio_probe()
398 gpioirqchip->populate_parent_alloc_arg = msc313_gpio_populate_parent_fwspec; in msc313_gpio_probe()
399 gpioirqchip->handler = handle_bad_irq; in msc313_gpio_probe()
400 gpioirqchip->default_type = IRQ_TYPE_NONE; in msc313_gpio_probe()
414 .compatible = "mstar,msc313-gpio",
431 for (i = 0; i < gpio->gpio_data->num; i++) in msc313_gpio_suspend()
432 gpio->saved[i] = readb_relaxed(gpio->base + gpio->gpio_data->offsets[i]) & MSC313_GPIO_BITSTOSAVE; in msc313_gpio_suspend()
442 for (i = 0; i < gpio->gpio_data->num; i++) in msc313_gpio_resume()
443 writeb_relaxed(gpio->saved[i], gpio->base + gpio->gpio_data->offsets[i]); in msc313_gpio_resume()