Lines Matching refs:atmel_pioctrl
114 struct atmel_pioctrl { struct
137 static unsigned int atmel_gpio_read(struct atmel_pioctrl *atmel_pioctrl, in atmel_gpio_read() argument
140 return readl_relaxed(atmel_pioctrl->reg_base in atmel_gpio_read()
144 static void atmel_gpio_write(struct atmel_pioctrl *atmel_pioctrl, in atmel_gpio_write() argument
148 writel_relaxed(val, atmel_pioctrl->reg_base in atmel_gpio_write()
162 struct atmel_pioctrl *atmel_pioctrl = irq_data_get_irq_chip_data(d); in atmel_gpio_irq_set_type() local
163 struct atmel_pin *pin = atmel_pioctrl->pins[d->hwirq]; in atmel_gpio_irq_set_type()
166 atmel_gpio_write(atmel_pioctrl, pin->bank, ATMEL_PIO_MSKR, in atmel_gpio_irq_set_type()
168 reg = atmel_gpio_read(atmel_pioctrl, pin->bank, ATMEL_PIO_CFGR); in atmel_gpio_irq_set_type()
197 atmel_gpio_write(atmel_pioctrl, pin->bank, ATMEL_PIO_CFGR, reg); in atmel_gpio_irq_set_type()
204 struct atmel_pioctrl *atmel_pioctrl = irq_data_get_irq_chip_data(d); in atmel_gpio_irq_mask() local
205 struct atmel_pin *pin = atmel_pioctrl->pins[d->hwirq]; in atmel_gpio_irq_mask()
207 atmel_gpio_write(atmel_pioctrl, pin->bank, ATMEL_PIO_IDR, in atmel_gpio_irq_mask()
213 struct atmel_pioctrl *atmel_pioctrl = irq_data_get_irq_chip_data(d); in atmel_gpio_irq_unmask() local
214 struct atmel_pin *pin = atmel_pioctrl->pins[d->hwirq]; in atmel_gpio_irq_unmask()
216 atmel_gpio_write(atmel_pioctrl, pin->bank, ATMEL_PIO_IER, in atmel_gpio_irq_unmask()
224 struct atmel_pioctrl *atmel_pioctrl = irq_data_get_irq_chip_data(d); in atmel_gpio_irq_set_wake() local
229 irq_set_irq_wake(atmel_pioctrl->irqs[bank], on); in atmel_gpio_irq_set_wake()
232 atmel_pioctrl->pm_wakeup_sources[bank] |= BIT(line); in atmel_gpio_irq_set_wake()
234 atmel_pioctrl->pm_wakeup_sources[bank] &= ~(BIT(line)); in atmel_gpio_irq_set_wake()
254 struct atmel_pioctrl *atmel_pioctrl = irq_desc_get_handler_data(desc); in atmel_gpio_irq_handler() local
260 for (n = 0; n < atmel_pioctrl->nbanks; n++) { in atmel_gpio_irq_handler()
261 if (atmel_pioctrl->irqs[n] == irq) { in atmel_gpio_irq_handler()
268 dev_err(atmel_pioctrl->dev, in atmel_gpio_irq_handler()
276 isr = (unsigned long)atmel_gpio_read(atmel_pioctrl, bank, in atmel_gpio_irq_handler()
278 isr &= (unsigned long)atmel_gpio_read(atmel_pioctrl, bank, in atmel_gpio_irq_handler()
293 struct atmel_pioctrl *atmel_pioctrl = dev_get_drvdata(chip->dev); in atmel_gpio_direction_input() local
294 struct atmel_pin *pin = atmel_pioctrl->pins[offset]; in atmel_gpio_direction_input()
297 atmel_gpio_write(atmel_pioctrl, pin->bank, ATMEL_PIO_MSKR, in atmel_gpio_direction_input()
299 reg = atmel_gpio_read(atmel_pioctrl, pin->bank, ATMEL_PIO_CFGR); in atmel_gpio_direction_input()
301 atmel_gpio_write(atmel_pioctrl, pin->bank, ATMEL_PIO_CFGR, reg); in atmel_gpio_direction_input()
308 struct atmel_pioctrl *atmel_pioctrl = dev_get_drvdata(chip->dev); in atmel_gpio_get() local
309 struct atmel_pin *pin = atmel_pioctrl->pins[offset]; in atmel_gpio_get()
312 reg = atmel_gpio_read(atmel_pioctrl, pin->bank, ATMEL_PIO_PDSR); in atmel_gpio_get()
320 struct atmel_pioctrl *atmel_pioctrl = dev_get_drvdata(chip->dev); in atmel_gpio_direction_output() local
321 struct atmel_pin *pin = atmel_pioctrl->pins[offset]; in atmel_gpio_direction_output()
324 atmel_gpio_write(atmel_pioctrl, pin->bank, in atmel_gpio_direction_output()
328 atmel_gpio_write(atmel_pioctrl, pin->bank, ATMEL_PIO_MSKR, in atmel_gpio_direction_output()
330 reg = atmel_gpio_read(atmel_pioctrl, pin->bank, ATMEL_PIO_CFGR); in atmel_gpio_direction_output()
332 atmel_gpio_write(atmel_pioctrl, pin->bank, ATMEL_PIO_CFGR, reg); in atmel_gpio_direction_output()
339 struct atmel_pioctrl *atmel_pioctrl = dev_get_drvdata(chip->dev); in atmel_gpio_set() local
340 struct atmel_pin *pin = atmel_pioctrl->pins[offset]; in atmel_gpio_set()
342 atmel_gpio_write(atmel_pioctrl, pin->bank, in atmel_gpio_set()
349 struct atmel_pioctrl *atmel_pioctrl = dev_get_drvdata(chip->dev); in atmel_gpio_to_irq() local
351 return irq_find_mapping(atmel_pioctrl->irq_domain, offset); in atmel_gpio_to_irq()
367 struct atmel_pioctrl *atmel_pioctrl = pinctrl_dev_get_drvdata(pctldev); in atmel_pin_config_read() local
368 unsigned bank = atmel_pioctrl->pins[pin_id]->bank; in atmel_pin_config_read()
369 unsigned line = atmel_pioctrl->pins[pin_id]->line; in atmel_pin_config_read()
370 void __iomem *addr = atmel_pioctrl->reg_base in atmel_pin_config_read()
383 struct atmel_pioctrl *atmel_pioctrl = pinctrl_dev_get_drvdata(pctldev); in atmel_pin_config_write() local
384 unsigned bank = atmel_pioctrl->pins[pin_id]->bank; in atmel_pin_config_write()
385 unsigned line = atmel_pioctrl->pins[pin_id]->line; in atmel_pin_config_write()
386 void __iomem *addr = atmel_pioctrl->reg_base in atmel_pin_config_write()
397 struct atmel_pioctrl *atmel_pioctrl = pinctrl_dev_get_drvdata(pctldev); in atmel_pctl_get_groups_count() local
399 return atmel_pioctrl->npins; in atmel_pctl_get_groups_count()
405 struct atmel_pioctrl *atmel_pioctrl = pinctrl_dev_get_drvdata(pctldev); in atmel_pctl_get_group_name() local
407 return atmel_pioctrl->groups[selector].name; in atmel_pctl_get_group_name()
414 struct atmel_pioctrl *atmel_pioctrl = pinctrl_dev_get_drvdata(pctldev); in atmel_pctl_get_group_pins() local
416 *pins = (unsigned *)&atmel_pioctrl->groups[selector].pin; in atmel_pctl_get_group_pins()
425 struct atmel_pioctrl *atmel_pioctrl = pinctrl_dev_get_drvdata(pctldev); in atmel_pctl_find_group_by_pin() local
428 for (i = 0; i < atmel_pioctrl->npins; i++) { in atmel_pctl_find_group_by_pin()
429 struct atmel_group *grp = atmel_pioctrl->groups + i; in atmel_pctl_find_group_by_pin()
443 struct atmel_pioctrl *atmel_pioctrl = pinctrl_dev_get_drvdata(pctldev); in atmel_pctl_xlate_pinfunc() local
460 atmel_pioctrl->pins[pin_id]->mux = func_id; in atmel_pctl_xlate_pinfunc()
461 atmel_pioctrl->pins[pin_id]->ioset = ATMEL_GET_PIN_IOSET(pinfunc); in atmel_pctl_xlate_pinfunc()
463 if (np->parent == atmel_pioctrl->node) in atmel_pctl_xlate_pinfunc()
464 atmel_pioctrl->pins[pin_id]->device = np->name; in atmel_pctl_xlate_pinfunc()
466 atmel_pioctrl->pins[pin_id]->device = np->parent->name; in atmel_pctl_xlate_pinfunc()
609 struct atmel_pioctrl *atmel_pioctrl = pinctrl_dev_get_drvdata(pctldev); in atmel_pmx_get_function_groups() local
611 *groups = atmel_pioctrl->group_names; in atmel_pmx_get_function_groups()
612 *num_groups = atmel_pioctrl->npins; in atmel_pmx_get_function_groups()
621 struct atmel_pioctrl *atmel_pioctrl = pinctrl_dev_get_drvdata(pctldev); in atmel_pmx_set_mux() local
626 atmel_functions[function], atmel_pioctrl->groups[group].name); in atmel_pmx_set_mux()
628 pin = atmel_pioctrl->groups[group].pin; in atmel_pmx_set_mux()
649 struct atmel_pioctrl *atmel_pioctrl = pinctrl_dev_get_drvdata(pctldev); in atmel_conf_pin_config_group_get() local
651 struct atmel_group *grp = atmel_pioctrl->groups + group; in atmel_conf_pin_config_group_get()
698 struct atmel_pioctrl *atmel_pioctrl = pinctrl_dev_get_drvdata(pctldev); in atmel_conf_pin_config_group_set() local
699 struct atmel_group *grp = atmel_pioctrl->groups + group; in atmel_conf_pin_config_group_set()
761 writel_relaxed(mask, atmel_pioctrl->reg_base + in atmel_conf_pin_config_group_set()
765 writel_relaxed(mask, atmel_pioctrl->reg_base + in atmel_conf_pin_config_group_set()
787 struct atmel_pioctrl *atmel_pioctrl = pinctrl_dev_get_drvdata(pctldev); in atmel_conf_pin_config_dbg_show() local
790 if (!atmel_pioctrl->pins[pin_id]->device) in atmel_conf_pin_config_dbg_show()
793 if (atmel_pioctrl->pins[pin_id]) in atmel_conf_pin_config_dbg_show()
795 atmel_pioctrl->pins[pin_id]->device, in atmel_conf_pin_config_dbg_show()
796 atmel_pioctrl->pins[pin_id]->ioset); in atmel_conf_pin_config_dbg_show()
827 struct atmel_pioctrl *atmel_pioctrl = platform_get_drvdata(pdev); in atmel_pctrl_suspend() local
834 for (i = 0; i < atmel_pioctrl->nbanks; i++) { in atmel_pctrl_suspend()
835 atmel_pioctrl->pm_suspend_backup[i] = in atmel_pctrl_suspend()
836 atmel_gpio_read(atmel_pioctrl, i, ATMEL_PIO_IMR); in atmel_pctrl_suspend()
837 atmel_gpio_write(atmel_pioctrl, i, ATMEL_PIO_IDR, in atmel_pctrl_suspend()
838 ~atmel_pioctrl->pm_wakeup_sources[i]); in atmel_pctrl_suspend()
847 struct atmel_pioctrl *atmel_pioctrl = platform_get_drvdata(pdev); in atmel_pctrl_resume() local
850 for (i = 0; i < atmel_pioctrl->nbanks; i++) in atmel_pctrl_resume()
851 atmel_gpio_write(atmel_pioctrl, i, ATMEL_PIO_IER, in atmel_pctrl_resume()
852 atmel_pioctrl->pm_suspend_backup[i]); in atmel_pctrl_resume()
887 struct atmel_pioctrl *atmel_pioctrl; in atmel_pinctrl_probe() local
890 atmel_pioctrl = devm_kzalloc(dev, sizeof(*atmel_pioctrl), GFP_KERNEL); in atmel_pinctrl_probe()
891 if (!atmel_pioctrl) in atmel_pinctrl_probe()
893 atmel_pioctrl->dev = dev; in atmel_pinctrl_probe()
894 atmel_pioctrl->node = dev->of_node; in atmel_pinctrl_probe()
895 platform_set_drvdata(pdev, atmel_pioctrl); in atmel_pinctrl_probe()
903 atmel_pioctrl->nbanks = atmel_pioctrl_data->nbanks; in atmel_pinctrl_probe()
904 atmel_pioctrl->npins = atmel_pioctrl->nbanks * ATMEL_PIO_NPINS_PER_BANK; in atmel_pinctrl_probe()
911 atmel_pioctrl->reg_base = devm_ioremap_resource(dev, res); in atmel_pinctrl_probe()
912 if (IS_ERR(atmel_pioctrl->reg_base)) in atmel_pinctrl_probe()
915 atmel_pioctrl->clk = devm_clk_get(dev, NULL); in atmel_pinctrl_probe()
916 if (IS_ERR(atmel_pioctrl->clk)) { in atmel_pinctrl_probe()
918 return PTR_ERR(atmel_pioctrl->clk); in atmel_pinctrl_probe()
921 atmel_pioctrl->pins = devm_kzalloc(dev, sizeof(*atmel_pioctrl->pins) in atmel_pinctrl_probe()
922 * atmel_pioctrl->npins, GFP_KERNEL); in atmel_pinctrl_probe()
923 if (!atmel_pioctrl->pins) in atmel_pinctrl_probe()
927 * atmel_pioctrl->npins, GFP_KERNEL); in atmel_pinctrl_probe()
931 atmel_pinctrl_desc.npins = atmel_pioctrl->npins; in atmel_pinctrl_probe()
935 * atmel_pioctrl->npins, GFP_KERNEL); in atmel_pinctrl_probe()
938 atmel_pioctrl->group_names = group_names; in atmel_pinctrl_probe()
940 atmel_pioctrl->groups = devm_kzalloc(&pdev->dev, in atmel_pinctrl_probe()
941 sizeof(*atmel_pioctrl->groups) * atmel_pioctrl->npins, in atmel_pinctrl_probe()
943 if (!atmel_pioctrl->groups) in atmel_pinctrl_probe()
945 for (i = 0 ; i < atmel_pioctrl->npins; i++) { in atmel_pinctrl_probe()
946 struct atmel_group *group = atmel_pioctrl->groups + i; in atmel_pinctrl_probe()
950 atmel_pioctrl->pins[i] = devm_kzalloc(dev, in atmel_pinctrl_probe()
951 sizeof(**atmel_pioctrl->pins), GFP_KERNEL); in atmel_pinctrl_probe()
952 if (!atmel_pioctrl->pins[i]) in atmel_pinctrl_probe()
955 atmel_pioctrl->pins[i]->pin_id = i; in atmel_pinctrl_probe()
956 atmel_pioctrl->pins[i]->bank = bank; in atmel_pinctrl_probe()
957 atmel_pioctrl->pins[i]->line = line; in atmel_pinctrl_probe()
970 atmel_pioctrl->gpio_chip = &atmel_gpio_chip; in atmel_pinctrl_probe()
971 atmel_pioctrl->gpio_chip->of_node = dev->of_node; in atmel_pinctrl_probe()
972 atmel_pioctrl->gpio_chip->ngpio = atmel_pioctrl->npins; in atmel_pinctrl_probe()
973 atmel_pioctrl->gpio_chip->label = dev_name(dev); in atmel_pinctrl_probe()
974 atmel_pioctrl->gpio_chip->dev = dev; in atmel_pinctrl_probe()
975 atmel_pioctrl->gpio_chip->names = atmel_pioctrl->group_names; in atmel_pinctrl_probe()
977 atmel_pioctrl->pm_wakeup_sources = devm_kzalloc(dev, in atmel_pinctrl_probe()
978 sizeof(*atmel_pioctrl->pm_wakeup_sources) in atmel_pinctrl_probe()
979 * atmel_pioctrl->nbanks, GFP_KERNEL); in atmel_pinctrl_probe()
980 if (!atmel_pioctrl->pm_wakeup_sources) in atmel_pinctrl_probe()
983 atmel_pioctrl->pm_suspend_backup = devm_kzalloc(dev, in atmel_pinctrl_probe()
984 sizeof(*atmel_pioctrl->pm_suspend_backup) in atmel_pinctrl_probe()
985 * atmel_pioctrl->nbanks, GFP_KERNEL); in atmel_pinctrl_probe()
986 if (!atmel_pioctrl->pm_suspend_backup) in atmel_pinctrl_probe()
989 atmel_pioctrl->irqs = devm_kzalloc(dev, sizeof(*atmel_pioctrl->irqs) in atmel_pinctrl_probe()
990 * atmel_pioctrl->nbanks, GFP_KERNEL); in atmel_pinctrl_probe()
991 if (!atmel_pioctrl->irqs) in atmel_pinctrl_probe()
995 for (i = 0; i < atmel_pioctrl->nbanks; i++) { in atmel_pinctrl_probe()
1002 atmel_pioctrl->irqs[i] = res->start; in atmel_pinctrl_probe()
1004 irq_set_handler_data(res->start, atmel_pioctrl); in atmel_pinctrl_probe()
1008 atmel_pioctrl->irq_domain = irq_domain_add_linear(dev->of_node, in atmel_pinctrl_probe()
1009 atmel_pioctrl->gpio_chip->ngpio, in atmel_pinctrl_probe()
1011 if (!atmel_pioctrl->irq_domain) { in atmel_pinctrl_probe()
1015 atmel_pioctrl->irq_domain->name = "atmel gpio"; in atmel_pinctrl_probe()
1017 for (i = 0; i < atmel_pioctrl->npins; i++) { in atmel_pinctrl_probe()
1018 int irq = irq_create_mapping(atmel_pioctrl->irq_domain, i); in atmel_pinctrl_probe()
1022 irq_set_chip_data(irq, atmel_pioctrl); in atmel_pinctrl_probe()
1028 ret = clk_prepare_enable(atmel_pioctrl->clk); in atmel_pinctrl_probe()
1034 atmel_pioctrl->pinctrl_dev = pinctrl_register(&atmel_pinctrl_desc, in atmel_pinctrl_probe()
1036 atmel_pioctrl); in atmel_pinctrl_probe()
1037 if (!atmel_pioctrl->pinctrl_dev) { in atmel_pinctrl_probe()
1042 ret = gpiochip_add(atmel_pioctrl->gpio_chip); in atmel_pinctrl_probe()
1048 ret = gpiochip_add_pin_range(atmel_pioctrl->gpio_chip, dev_name(dev), in atmel_pinctrl_probe()
1049 0, 0, atmel_pioctrl->gpio_chip->ngpio); in atmel_pinctrl_probe()
1060 irq_domain_remove(atmel_pioctrl->irq_domain); in atmel_pinctrl_probe()
1062 clk_disable_unprepare(atmel_pioctrl->clk); in atmel_pinctrl_probe()
1064 pinctrl_unregister(atmel_pioctrl->pinctrl_dev); in atmel_pinctrl_probe()
1066 gpiochip_remove(atmel_pioctrl->gpio_chip); in atmel_pinctrl_probe()
1073 struct atmel_pioctrl *atmel_pioctrl = platform_get_drvdata(pdev); in atmel_pinctrl_remove() local
1075 irq_domain_remove(atmel_pioctrl->irq_domain); in atmel_pinctrl_remove()
1076 clk_disable_unprepare(atmel_pioctrl->clk); in atmel_pinctrl_remove()
1077 pinctrl_unregister(atmel_pioctrl->pinctrl_dev); in atmel_pinctrl_remove()
1078 gpiochip_remove(atmel_pioctrl->gpio_chip); in atmel_pinctrl_remove()