Lines Matching refs:pctl

39 sunxi_pinctrl_find_group_by_name(struct sunxi_pinctrl *pctl, const char *group)  in sunxi_pinctrl_find_group_by_name()  argument
43 for (i = 0; i < pctl->ngroups; i++) { in sunxi_pinctrl_find_group_by_name()
44 struct sunxi_pinctrl_group *grp = pctl->groups + i; in sunxi_pinctrl_find_group_by_name()
54 sunxi_pinctrl_find_function_by_name(struct sunxi_pinctrl *pctl, in sunxi_pinctrl_find_function_by_name() argument
57 struct sunxi_pinctrl_function *func = pctl->functions; in sunxi_pinctrl_find_function_by_name()
60 for (i = 0; i < pctl->nfunctions; i++) { in sunxi_pinctrl_find_function_by_name()
72 sunxi_pinctrl_desc_find_function_by_name(struct sunxi_pinctrl *pctl, in sunxi_pinctrl_desc_find_function_by_name() argument
78 for (i = 0; i < pctl->desc->npins; i++) { in sunxi_pinctrl_desc_find_function_by_name()
79 const struct sunxi_desc_pin *pin = pctl->desc->pins + i; in sunxi_pinctrl_desc_find_function_by_name()
97 sunxi_pinctrl_desc_find_function_by_pin(struct sunxi_pinctrl *pctl, in sunxi_pinctrl_desc_find_function_by_pin() argument
103 for (i = 0; i < pctl->desc->npins; i++) { in sunxi_pinctrl_desc_find_function_by_pin()
104 const struct sunxi_desc_pin *pin = pctl->desc->pins + i; in sunxi_pinctrl_desc_find_function_by_pin()
123 struct sunxi_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); in sunxi_pctrl_get_groups_count() local
125 return pctl->ngroups; in sunxi_pctrl_get_groups_count()
131 struct sunxi_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); in sunxi_pctrl_get_group_name() local
133 return pctl->groups[group].name; in sunxi_pctrl_get_group_name()
141 struct sunxi_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); in sunxi_pctrl_get_group_pins() local
143 *pins = (unsigned *)&pctl->groups[group].pin; in sunxi_pctrl_get_group_pins()
154 struct sunxi_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); in sunxi_pctrl_dt_node_to_map() local
167 dev_err(pctl->dev, in sunxi_pctrl_dt_node_to_map()
175 dev_err(pctl->dev, in sunxi_pctrl_dt_node_to_map()
187 sunxi_pinctrl_find_group_by_name(pctl, group); in sunxi_pctrl_dt_node_to_map()
191 dev_err(pctl->dev, "unknown pin %s", group); in sunxi_pctrl_dt_node_to_map()
195 if (!sunxi_pinctrl_desc_find_function_by_name(pctl, in sunxi_pctrl_dt_node_to_map()
198 dev_err(pctl->dev, "unsupported function %s on pin %s", in sunxi_pctrl_dt_node_to_map()
276 struct sunxi_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); in sunxi_pconf_group_get() local
278 *config = pctl->groups[group].config; in sunxi_pconf_group_get()
288 struct sunxi_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); in sunxi_pconf_group_set() local
289 struct sunxi_pinctrl_group *g = &pctl->groups[group]; in sunxi_pconf_group_set()
291 unsigned pin = g->pin - pctl->desc->pin_base; in sunxi_pconf_group_set()
297 spin_lock_irqsave(&pctl->lock, flags); in sunxi_pconf_group_set()
304 spin_unlock_irqrestore(&pctl->lock, flags); in sunxi_pconf_group_set()
315 val = readl(pctl->membase + sunxi_dlevel_reg(pin)); in sunxi_pconf_group_set()
319 pctl->membase + sunxi_dlevel_reg(pin)); in sunxi_pconf_group_set()
322 val = readl(pctl->membase + sunxi_pull_reg(pin)); in sunxi_pconf_group_set()
325 pctl->membase + sunxi_pull_reg(pin)); in sunxi_pconf_group_set()
328 val = readl(pctl->membase + sunxi_pull_reg(pin)); in sunxi_pconf_group_set()
331 pctl->membase + sunxi_pull_reg(pin)); in sunxi_pconf_group_set()
340 spin_unlock_irqrestore(&pctl->lock, flags); in sunxi_pconf_group_set()
352 struct sunxi_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); in sunxi_pmx_get_funcs_cnt() local
354 return pctl->nfunctions; in sunxi_pmx_get_funcs_cnt()
360 struct sunxi_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); in sunxi_pmx_get_func_name() local
362 return pctl->functions[function].name; in sunxi_pmx_get_func_name()
370 struct sunxi_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); in sunxi_pmx_get_func_groups() local
372 *groups = pctl->functions[function].groups; in sunxi_pmx_get_func_groups()
373 *num_groups = pctl->functions[function].ngroups; in sunxi_pmx_get_func_groups()
382 struct sunxi_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); in sunxi_pmx_set() local
386 spin_lock_irqsave(&pctl->lock, flags); in sunxi_pmx_set()
388 pin -= pctl->desc->pin_base; in sunxi_pmx_set()
389 val = readl(pctl->membase + sunxi_mux_reg(pin)); in sunxi_pmx_set()
392 pctl->membase + sunxi_mux_reg(pin)); in sunxi_pmx_set()
394 spin_unlock_irqrestore(&pctl->lock, flags); in sunxi_pmx_set()
401 struct sunxi_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); in sunxi_pmx_set_mux() local
402 struct sunxi_pinctrl_group *g = pctl->groups + group; in sunxi_pmx_set_mux()
403 struct sunxi_pinctrl_function *func = pctl->functions + function; in sunxi_pmx_set_mux()
405 sunxi_pinctrl_desc_find_function_by_name(pctl, in sunxi_pmx_set_mux()
423 struct sunxi_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); in sunxi_pmx_gpio_set_direction() local
432 desc = sunxi_pinctrl_desc_find_function_by_pin(pctl, offset, func); in sunxi_pmx_gpio_set_direction()
467 struct sunxi_pinctrl *pctl = dev_get_drvdata(chip->dev); in sunxi_pinctrl_gpio_get() local
470 u32 set_mux = pctl->desc->irq_read_needs_mux && in sunxi_pinctrl_gpio_get()
475 sunxi_pmx_set(pctl->pctl_dev, offset, SUN4I_FUNC_INPUT); in sunxi_pinctrl_gpio_get()
477 val = (readl(pctl->membase + reg) >> index) & DATA_PINS_MASK; in sunxi_pinctrl_gpio_get()
480 sunxi_pmx_set(pctl->pctl_dev, offset, SUN4I_FUNC_IRQ); in sunxi_pinctrl_gpio_get()
488 struct sunxi_pinctrl *pctl = dev_get_drvdata(chip->dev); in sunxi_pinctrl_gpio_set() local
494 spin_lock_irqsave(&pctl->lock, flags); in sunxi_pinctrl_gpio_set()
496 regval = readl(pctl->membase + reg); in sunxi_pinctrl_gpio_set()
503 writel(regval, pctl->membase + reg); in sunxi_pinctrl_gpio_set()
505 spin_unlock_irqrestore(&pctl->lock, flags); in sunxi_pinctrl_gpio_set()
535 struct sunxi_pinctrl *pctl = dev_get_drvdata(chip->dev); in sunxi_pinctrl_gpio_to_irq() local
537 unsigned pinnum = pctl->desc->pin_base + offset; in sunxi_pinctrl_gpio_to_irq()
543 desc = sunxi_pinctrl_desc_find_function_by_pin(pctl, pinnum, "irq"); in sunxi_pinctrl_gpio_to_irq()
552 return irq_find_mapping(pctl->domain, irqnum); in sunxi_pinctrl_gpio_to_irq()
557 struct sunxi_pinctrl *pctl = irq_data_get_irq_chip_data(d); in sunxi_pinctrl_irq_request_resources() local
561 func = sunxi_pinctrl_desc_find_function_by_pin(pctl, in sunxi_pinctrl_irq_request_resources()
562 pctl->irq_array[d->hwirq], "irq"); in sunxi_pinctrl_irq_request_resources()
566 ret = gpiochip_lock_as_irq(pctl->chip, in sunxi_pinctrl_irq_request_resources()
567 pctl->irq_array[d->hwirq] - pctl->desc->pin_base); in sunxi_pinctrl_irq_request_resources()
569 dev_err(pctl->dev, "unable to lock HW IRQ %lu for IRQ\n", in sunxi_pinctrl_irq_request_resources()
575 sunxi_pmx_set(pctl->pctl_dev, pctl->irq_array[d->hwirq], func->muxval); in sunxi_pinctrl_irq_request_resources()
582 struct sunxi_pinctrl *pctl = irq_data_get_irq_chip_data(d); in sunxi_pinctrl_irq_release_resources() local
584 gpiochip_unlock_as_irq(pctl->chip, in sunxi_pinctrl_irq_release_resources()
585 pctl->irq_array[d->hwirq] - pctl->desc->pin_base); in sunxi_pinctrl_irq_release_resources()
590 struct sunxi_pinctrl *pctl = irq_data_get_irq_chip_data(d); in sunxi_pinctrl_irq_set_type() local
626 spin_lock_irqsave(&pctl->lock, flags); in sunxi_pinctrl_irq_set_type()
628 regval = readl(pctl->membase + reg); in sunxi_pinctrl_irq_set_type()
630 writel(regval | (mode << index), pctl->membase + reg); in sunxi_pinctrl_irq_set_type()
632 spin_unlock_irqrestore(&pctl->lock, flags); in sunxi_pinctrl_irq_set_type()
639 struct sunxi_pinctrl *pctl = irq_data_get_irq_chip_data(d); in sunxi_pinctrl_irq_ack() local
644 writel(1 << status_idx, pctl->membase + status_reg); in sunxi_pinctrl_irq_ack()
649 struct sunxi_pinctrl *pctl = irq_data_get_irq_chip_data(d); in sunxi_pinctrl_irq_mask() local
655 spin_lock_irqsave(&pctl->lock, flags); in sunxi_pinctrl_irq_mask()
658 val = readl(pctl->membase + reg); in sunxi_pinctrl_irq_mask()
659 writel(val & ~(1 << idx), pctl->membase + reg); in sunxi_pinctrl_irq_mask()
661 spin_unlock_irqrestore(&pctl->lock, flags); in sunxi_pinctrl_irq_mask()
666 struct sunxi_pinctrl *pctl = irq_data_get_irq_chip_data(d); in sunxi_pinctrl_irq_unmask() local
672 spin_lock_irqsave(&pctl->lock, flags); in sunxi_pinctrl_irq_unmask()
675 val = readl(pctl->membase + reg); in sunxi_pinctrl_irq_unmask()
676 writel(val | (1 << idx), pctl->membase + reg); in sunxi_pinctrl_irq_unmask()
678 spin_unlock_irqrestore(&pctl->lock, flags); in sunxi_pinctrl_irq_unmask()
715 struct sunxi_pinctrl *pctl = irq_get_handler_data(irq); in sunxi_pinctrl_irq_handler() local
718 for (bank = 0; bank < pctl->desc->irq_banks; bank++) in sunxi_pinctrl_irq_handler()
719 if (irq == pctl->irq[bank]) in sunxi_pinctrl_irq_handler()
722 if (bank == pctl->desc->irq_banks) in sunxi_pinctrl_irq_handler()
726 val = readl(pctl->membase + reg); in sunxi_pinctrl_irq_handler()
733 int pin_irq = irq_find_mapping(pctl->domain, in sunxi_pinctrl_irq_handler()
741 static int sunxi_pinctrl_add_function(struct sunxi_pinctrl *pctl, in sunxi_pinctrl_add_function() argument
744 struct sunxi_pinctrl_function *func = pctl->functions; in sunxi_pinctrl_add_function()
758 pctl->nfunctions++; in sunxi_pinctrl_add_function()
765 struct sunxi_pinctrl *pctl = platform_get_drvdata(pdev); in sunxi_pinctrl_build_state() local
768 pctl->ngroups = pctl->desc->npins; in sunxi_pinctrl_build_state()
771 pctl->groups = devm_kzalloc(&pdev->dev, in sunxi_pinctrl_build_state()
772 pctl->ngroups * sizeof(*pctl->groups), in sunxi_pinctrl_build_state()
774 if (!pctl->groups) in sunxi_pinctrl_build_state()
777 for (i = 0; i < pctl->desc->npins; i++) { in sunxi_pinctrl_build_state()
778 const struct sunxi_desc_pin *pin = pctl->desc->pins + i; in sunxi_pinctrl_build_state()
779 struct sunxi_pinctrl_group *group = pctl->groups + i; in sunxi_pinctrl_build_state()
789 pctl->functions = devm_kzalloc(&pdev->dev, in sunxi_pinctrl_build_state()
790 pctl->desc->npins * sizeof(*pctl->functions), in sunxi_pinctrl_build_state()
792 if (!pctl->functions) in sunxi_pinctrl_build_state()
796 for (i = 0; i < pctl->desc->npins; i++) { in sunxi_pinctrl_build_state()
797 const struct sunxi_desc_pin *pin = pctl->desc->pins + i; in sunxi_pinctrl_build_state()
804 pctl->irq_array[irqnum] = pin->pin.number; in sunxi_pinctrl_build_state()
807 sunxi_pinctrl_add_function(pctl, func->name); in sunxi_pinctrl_build_state()
812 pctl->functions = krealloc(pctl->functions, in sunxi_pinctrl_build_state()
813 pctl->nfunctions * sizeof(*pctl->functions), in sunxi_pinctrl_build_state()
816 for (i = 0; i < pctl->desc->npins; i++) { in sunxi_pinctrl_build_state()
817 const struct sunxi_desc_pin *pin = pctl->desc->pins + i; in sunxi_pinctrl_build_state()
824 func_item = sunxi_pinctrl_find_function_by_name(pctl, in sunxi_pinctrl_build_state()
856 struct sunxi_pinctrl *pctl; in sunxi_pinctrl_init() local
861 pctl = devm_kzalloc(&pdev->dev, sizeof(*pctl), GFP_KERNEL); in sunxi_pinctrl_init()
862 if (!pctl) in sunxi_pinctrl_init()
864 platform_set_drvdata(pdev, pctl); in sunxi_pinctrl_init()
866 spin_lock_init(&pctl->lock); in sunxi_pinctrl_init()
869 pctl->membase = devm_ioremap_resource(&pdev->dev, res); in sunxi_pinctrl_init()
870 if (IS_ERR(pctl->membase)) in sunxi_pinctrl_init()
871 return PTR_ERR(pctl->membase); in sunxi_pinctrl_init()
873 pctl->dev = &pdev->dev; in sunxi_pinctrl_init()
874 pctl->desc = desc; in sunxi_pinctrl_init()
876 pctl->irq_array = devm_kcalloc(&pdev->dev, in sunxi_pinctrl_init()
877 IRQ_PER_BANK * pctl->desc->irq_banks, in sunxi_pinctrl_init()
878 sizeof(*pctl->irq_array), in sunxi_pinctrl_init()
880 if (!pctl->irq_array) in sunxi_pinctrl_init()
890 pctl->desc->npins * sizeof(*pins), in sunxi_pinctrl_init()
895 for (i = 0; i < pctl->desc->npins; i++) in sunxi_pinctrl_init()
896 pins[i] = pctl->desc->pins[i].pin; in sunxi_pinctrl_init()
907 pctrl_desc->npins = pctl->desc->npins; in sunxi_pinctrl_init()
912 pctl->pctl_dev = pinctrl_register(pctrl_desc, in sunxi_pinctrl_init()
913 &pdev->dev, pctl); in sunxi_pinctrl_init()
914 if (!pctl->pctl_dev) { in sunxi_pinctrl_init()
919 pctl->chip = devm_kzalloc(&pdev->dev, sizeof(*pctl->chip), GFP_KERNEL); in sunxi_pinctrl_init()
920 if (!pctl->chip) { in sunxi_pinctrl_init()
925 last_pin = pctl->desc->pins[pctl->desc->npins - 1].pin.number; in sunxi_pinctrl_init()
926 pctl->chip->owner = THIS_MODULE; in sunxi_pinctrl_init()
927 pctl->chip->request = sunxi_pinctrl_gpio_request, in sunxi_pinctrl_init()
928 pctl->chip->free = sunxi_pinctrl_gpio_free, in sunxi_pinctrl_init()
929 pctl->chip->direction_input = sunxi_pinctrl_gpio_direction_input, in sunxi_pinctrl_init()
930 pctl->chip->direction_output = sunxi_pinctrl_gpio_direction_output, in sunxi_pinctrl_init()
931 pctl->chip->get = sunxi_pinctrl_gpio_get, in sunxi_pinctrl_init()
932 pctl->chip->set = sunxi_pinctrl_gpio_set, in sunxi_pinctrl_init()
933 pctl->chip->of_xlate = sunxi_pinctrl_gpio_of_xlate, in sunxi_pinctrl_init()
934 pctl->chip->to_irq = sunxi_pinctrl_gpio_to_irq, in sunxi_pinctrl_init()
935 pctl->chip->of_gpio_n_cells = 3, in sunxi_pinctrl_init()
936 pctl->chip->can_sleep = false, in sunxi_pinctrl_init()
937 pctl->chip->ngpio = round_up(last_pin, PINS_PER_BANK) - in sunxi_pinctrl_init()
938 pctl->desc->pin_base; in sunxi_pinctrl_init()
939 pctl->chip->label = dev_name(&pdev->dev); in sunxi_pinctrl_init()
940 pctl->chip->dev = &pdev->dev; in sunxi_pinctrl_init()
941 pctl->chip->base = pctl->desc->pin_base; in sunxi_pinctrl_init()
943 ret = gpiochip_add(pctl->chip); in sunxi_pinctrl_init()
947 for (i = 0; i < pctl->desc->npins; i++) { in sunxi_pinctrl_init()
948 const struct sunxi_desc_pin *pin = pctl->desc->pins + i; in sunxi_pinctrl_init()
950 ret = gpiochip_add_pin_range(pctl->chip, dev_name(&pdev->dev), in sunxi_pinctrl_init()
951 pin->pin.number - pctl->desc->pin_base, in sunxi_pinctrl_init()
967 pctl->irq = devm_kcalloc(&pdev->dev, in sunxi_pinctrl_init()
968 pctl->desc->irq_banks, in sunxi_pinctrl_init()
969 sizeof(*pctl->irq), in sunxi_pinctrl_init()
971 if (!pctl->irq) { in sunxi_pinctrl_init()
976 for (i = 0; i < pctl->desc->irq_banks; i++) { in sunxi_pinctrl_init()
977 pctl->irq[i] = platform_get_irq(pdev, i); in sunxi_pinctrl_init()
978 if (pctl->irq[i] < 0) { in sunxi_pinctrl_init()
979 ret = pctl->irq[i]; in sunxi_pinctrl_init()
984 pctl->domain = irq_domain_add_linear(node, in sunxi_pinctrl_init()
985 pctl->desc->irq_banks * IRQ_PER_BANK, in sunxi_pinctrl_init()
988 if (!pctl->domain) { in sunxi_pinctrl_init()
994 for (i = 0; i < (pctl->desc->irq_banks * IRQ_PER_BANK); i++) { in sunxi_pinctrl_init()
995 int irqno = irq_create_mapping(pctl->domain, i); in sunxi_pinctrl_init()
999 irq_set_chip_data(irqno, pctl); in sunxi_pinctrl_init()
1002 for (i = 0; i < pctl->desc->irq_banks; i++) { in sunxi_pinctrl_init()
1004 writel(0, pctl->membase + sunxi_irq_ctrl_reg_from_bank(i)); in sunxi_pinctrl_init()
1006 pctl->membase + sunxi_irq_status_reg_from_bank(i)); in sunxi_pinctrl_init()
1008 irq_set_chained_handler(pctl->irq[i], in sunxi_pinctrl_init()
1010 irq_set_handler_data(pctl->irq[i], pctl); in sunxi_pinctrl_init()
1020 gpiochip_remove(pctl->chip); in sunxi_pinctrl_init()
1022 pinctrl_unregister(pctl->pctl_dev); in sunxi_pinctrl_init()