Lines Matching refs:pctrl

111 struct intel_community *intel_get_community(struct intel_pinctrl *pctrl, unsigned int pin)
116 for (i = 0; i < pctrl->ncommunities; i++) {
117 community = &pctrl->communities[i];
123 dev_warn(pctrl->dev, "failed to find community for pin %u\n", pin);
144 static void __iomem *intel_get_padcfg(struct intel_pinctrl *pctrl,
151 community = intel_get_community(pctrl, pin);
164 static bool intel_pad_owned_by_host(struct intel_pinctrl *pctrl, unsigned int pin)
171 community = intel_get_community(pctrl, pin);
189 static bool intel_pad_acpi_mode(struct intel_pinctrl *pctrl, unsigned int pin)
196 community = intel_get_community(pctrl, pin);
232 static int intel_pad_locked(struct intel_pinctrl *pctrl, unsigned int pin)
240 community = intel_get_community(pctrl, pin);
270 static bool intel_pad_is_unlocked(struct intel_pinctrl *pctrl, unsigned int pin)
272 return (intel_pad_locked(pctrl, pin) & PAD_LOCKED) == PAD_UNLOCKED;
275 static bool intel_pad_usable(struct intel_pinctrl *pctrl, unsigned int pin)
277 return intel_pad_owned_by_host(pctrl, pin) && intel_pad_is_unlocked(pctrl, pin);
282 struct intel_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
284 return pctrl->soc->ngroups;
290 struct intel_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
292 return pctrl->soc->groups[group].grp.name;
299 struct intel_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
301 *pins = pctrl->soc->groups[group].grp.pins;
302 *npins = pctrl->soc->groups[group].grp.npins;
310 struct intel_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
316 if (!intel_pad_owned_by_host(pctrl, pin)) {
321 cfg0 = readl(intel_get_padcfg(pctrl, pin, PADCFG0));
322 cfg1 = readl(intel_get_padcfg(pctrl, pin, PADCFG1));
333 padcfg = intel_get_padcfg(pctrl, pin, PADCFG2);
337 locked = intel_pad_locked(pctrl, pin);
338 acpi = intel_pad_acpi_mode(pctrl, pin);
367 struct intel_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
369 return pctrl->soc->nfunctions;
375 struct intel_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
377 return pctrl->soc->functions[function].func.name;
384 struct intel_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
386 *groups = pctrl->soc->functions[function].func.groups;
387 *ngroups = pctrl->soc->functions[function].func.ngroups;
395 struct intel_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
396 const struct intel_pingroup *grp = &pctrl->soc->groups[group];
399 guard(raw_spinlock_irqsave)(&pctrl->lock);
406 if (!intel_pad_usable(pctrl, grp->grp.pins[i]))
415 padcfg0 = intel_get_padcfg(pctrl, grp->grp.pins[i], PADCFG0);
482 struct intel_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
485 padcfg0 = intel_get_padcfg(pctrl, pin, PADCFG0);
487 guard(raw_spinlock_irqsave)(&pctrl->lock);
489 if (!intel_pad_owned_by_host(pctrl, pin))
492 if (!intel_pad_is_unlocked(pctrl, pin))
513 struct intel_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
516 padcfg0 = intel_get_padcfg(pctrl, pin, PADCFG0);
518 guard(raw_spinlock_irqsave)(&pctrl->lock);
534 static int intel_config_get_pull(struct intel_pinctrl *pctrl, unsigned int pin,
540 padcfg1 = intel_get_padcfg(pctrl, pin, PADCFG1);
542 scoped_guard(raw_spinlock_irqsave, &pctrl->lock)
578 const struct intel_community *community = intel_get_community(pctrl, pin);
615 static int intel_config_get_debounce(struct intel_pinctrl *pctrl, unsigned int pin,
622 padcfg2 = intel_get_padcfg(pctrl, pin, PADCFG2);
626 scoped_guard(raw_spinlock_irqsave, &pctrl->lock)
641 struct intel_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
646 if (!intel_pad_owned_by_host(pctrl, pin))
653 ret = intel_config_get_pull(pctrl, pin, param, &arg);
659 ret = intel_config_get_debounce(pctrl, pin, param, &arg);
672 static int intel_config_set_pull(struct intel_pinctrl *pctrl, unsigned int pin,
710 const struct intel_community *community = intel_get_community(pctrl, pin);
744 padcfg1 = intel_get_padcfg(pctrl, pin, PADCFG1);
746 guard(raw_spinlock_irqsave)(&pctrl->lock);
756 static int intel_config_set_debounce(struct intel_pinctrl *pctrl,
762 padcfg2 = intel_get_padcfg(pctrl, pin, PADCFG2);
766 padcfg0 = intel_get_padcfg(pctrl, pin, PADCFG0);
768 guard(raw_spinlock_irqsave)(&pctrl->lock);
799 struct intel_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
802 if (!intel_pad_usable(pctrl, pin))
810 ret = intel_config_set_pull(pctrl, pin, configs[i]);
816 ret = intel_config_set_debounce(pctrl, pin,
845 * @pctrl: Pinctrl structure
857 static int intel_gpio_to_pin(struct intel_pinctrl *pctrl, unsigned int offset,
863 for (i = 0; i < pctrl->ncommunities; i++) {
864 const struct intel_community *comm = &pctrl->communities[i];
893 * @pctrl: Pinctrl structure
900 static int intel_pin_to_gpio(struct intel_pinctrl *pctrl, int pin)
905 community = intel_get_community(pctrl, pin);
918 struct intel_pinctrl *pctrl = gpiochip_get_data(chip);
923 pin = intel_gpio_to_pin(pctrl, offset, NULL, NULL);
927 reg = intel_get_padcfg(pctrl, pin, PADCFG0);
941 struct intel_pinctrl *pctrl = gpiochip_get_data(chip);
946 pin = intel_gpio_to_pin(pctrl, offset, NULL, NULL);
950 reg = intel_get_padcfg(pctrl, pin, PADCFG0);
954 guard(raw_spinlock_irqsave)(&pctrl->lock);
966 struct intel_pinctrl *pctrl = gpiochip_get_data(chip);
971 pin = intel_gpio_to_pin(pctrl, offset, NULL, NULL);
975 reg = intel_get_padcfg(pctrl, pin, PADCFG0);
979 scoped_guard(raw_spinlock_irqsave, &pctrl->lock)
1018 struct intel_pinctrl *pctrl = gpiochip_get_data(gc);
1023 pin = intel_gpio_to_pin(pctrl, irqd_to_hwirq(d), &community, &padgrp);
1033 guard(raw_spinlock)(&pctrl->lock);
1041 struct intel_pinctrl *pctrl = gpiochip_get_data(gc);
1046 pin = intel_gpio_to_pin(pctrl, hwirq, &community, &padgrp);
1058 guard(raw_spinlock_irqsave)(&pctrl->lock);
1093 struct intel_pinctrl *pctrl = gpiochip_get_data(gc);
1094 unsigned int pin = intel_gpio_to_pin(pctrl, irqd_to_hwirq(d), NULL, NULL);
1098 reg = intel_get_padcfg(pctrl, pin, PADCFG0);
1107 if (intel_pad_acpi_mode(pctrl, pin)) {
1108 dev_warn(pctrl->dev, "pin %u cannot be used as IRQ\n", pin);
1129 guard(raw_spinlock_irqsave)(&pctrl->lock);
1151 struct intel_pinctrl *pctrl = gpiochip_get_data(gc);
1152 unsigned int pin = intel_gpio_to_pin(pctrl, irqd_to_hwirq(d), NULL, NULL);
1155 enable_irq_wake(pctrl->irq);
1157 disable_irq_wake(pctrl->irq);
1159 dev_dbg(pctrl->dev, "%s wake for pin %u\n", str_enable_disable(on), pin);
1174 static int intel_gpio_community_irq_handler(struct intel_pinctrl *pctrl,
1177 struct gpio_chip *gc = &pctrl->chip;
1192 scoped_guard(raw_spinlock, &pctrl->lock) {
1212 struct intel_pinctrl *pctrl = data;
1217 for (i = 0; i < pctrl->ncommunities; i++) {
1218 community = &pctrl->communities[i];
1219 ret += intel_gpio_community_irq_handler(pctrl, community);
1225 static void intel_gpio_irq_init(struct intel_pinctrl *pctrl)
1229 for (i = 0; i < pctrl->ncommunities; i++) {
1234 community = &pctrl->communities[i];
1249 struct intel_pinctrl *pctrl = gpiochip_get_data(gc);
1255 intel_gpio_irq_init(pctrl);
1260 static int intel_gpio_add_community_ranges(struct intel_pinctrl *pctrl,
1271 ret = gpiochip_add_pin_range(&pctrl->chip, dev_name(pctrl->dev),
1283 struct intel_pinctrl *pctrl = gpiochip_get_data(gc);
1286 for (i = 0; i < pctrl->ncommunities; i++) {
1287 struct intel_community *community = &pctrl->communities[i];
1289 ret = intel_gpio_add_community_ranges(pctrl, community);
1291 dev_err(pctrl->dev, "failed to add GPIO pin range\n");
1299 static unsigned int intel_gpio_ngpio(const struct intel_pinctrl *pctrl)
1305 for (i = 0; i < pctrl->ncommunities; i++) {
1306 community = &pctrl->communities[i];
1321 static int intel_gpio_probe(struct intel_pinctrl *pctrl, int irq)
1326 pctrl->chip = intel_gpio_chip;
1329 pctrl->chip.ngpio = intel_gpio_ngpio(pctrl);
1330 pctrl->chip.label = dev_name(pctrl->dev);
1331 pctrl->chip.parent = pctrl->dev;
1332 pctrl->chip.base = -1;
1333 pctrl->chip.add_pin_ranges = intel_gpio_add_pin_ranges;
1334 pctrl->irq = irq;
1340 ret = devm_request_irq(pctrl->dev, irq, intel_gpio_irq,
1342 dev_name(pctrl->dev), pctrl);
1344 dev_err(pctrl->dev, "failed to request interrupt\n");
1349 girq = &pctrl->chip.irq;
1358 ret = devm_gpiochip_add_data(pctrl->dev, &pctrl->chip, pctrl);
1360 dev_err(pctrl->dev, "failed to register gpiochip\n");
1367 static int intel_pinctrl_add_padgroups_by_gpps(struct intel_pinctrl *pctrl,
1374 gpps = devm_kcalloc(pctrl->dev, ngpps, sizeof(*gpps), GFP_KERNEL);
1407 static int intel_pinctrl_add_padgroups_by_size(struct intel_pinctrl *pctrl,
1418 gpps = devm_kcalloc(pctrl->dev, ngpps, sizeof(*gpps), GFP_KERNEL);
1442 static int intel_pinctrl_pm_init(struct intel_pinctrl *pctrl)
1445 const struct intel_pinctrl_soc_data *soc = pctrl->soc;
1450 pads = devm_kcalloc(pctrl->dev, soc->npins, sizeof(*pads), GFP_KERNEL);
1454 communities = devm_kcalloc(pctrl->dev, pctrl->ncommunities,
1460 for (i = 0; i < pctrl->ncommunities; i++) {
1461 struct intel_community *community = &pctrl->communities[i];
1464 intmask = devm_kcalloc(pctrl->dev, community->ngpps,
1471 hostown = devm_kcalloc(pctrl->dev, community->ngpps,
1479 pctrl->context.pads = pads;
1480 pctrl->context.communities = communities;
1486 static int intel_pinctrl_probe_pwm(struct intel_pinctrl *pctrl,
1503 chip = devm_pwm_lpss_probe(pctrl->dev, community->regs + PWMC, &info);
1511 struct intel_pinctrl *pctrl;
1514 pctrl = devm_kzalloc(dev, sizeof(*pctrl), GFP_KERNEL);
1515 if (!pctrl)
1518 pctrl->dev = dev;
1519 pctrl->soc = soc_data;
1520 raw_spin_lock_init(&pctrl->lock);
1526 pctrl->ncommunities = pctrl->soc->ncommunities;
1527 pctrl->communities = devm_kcalloc(dev, pctrl->ncommunities,
1528 sizeof(*pctrl->communities), GFP_KERNEL);
1529 if (!pctrl->communities)
1532 for (i = 0; i < pctrl->ncommunities; i++) {
1533 struct intel_community *community = &pctrl->communities[i];
1538 *community = pctrl->soc->communities[i];
1588 ret = intel_pinctrl_add_padgroups_by_gpps(pctrl, community);
1590 ret = intel_pinctrl_add_padgroups_by_size(pctrl, community);
1594 ret = intel_pinctrl_probe_pwm(pctrl, community);
1603 ret = intel_pinctrl_pm_init(pctrl);
1607 pctrl->pctldesc = intel_pinctrl_desc;
1608 pctrl->pctldesc.name = dev_name(dev);
1609 pctrl->pctldesc.pins = pctrl->soc->pins;
1610 pctrl->pctldesc.npins = pctrl->soc->npins;
1612 pctrl->pctldev = devm_pinctrl_register(dev, &pctrl->pctldesc, pctrl);
1613 if (IS_ERR(pctrl->pctldev)) {
1615 return PTR_ERR(pctrl->pctldev);
1618 ret = intel_gpio_probe(pctrl, irq);
1622 platform_set_drvdata(pdev, pctrl);
1689 static bool intel_pinctrl_should_save(struct intel_pinctrl *pctrl, unsigned int pin)
1691 const struct pin_desc *pd = pin_desc_get(pctrl->pctldev, pin);
1694 if (!pd || !intel_pad_usable(pctrl, pin))
1704 gpiochip_line_is_irq(&pctrl->chip, intel_pin_to_gpio(pctrl, pin)))
1721 value = readl(intel_get_padcfg(pctrl, pin, PADCFG0));
1730 struct intel_pinctrl *pctrl = dev_get_drvdata(dev);
1735 pads = pctrl->context.pads;
1736 for (i = 0; i < pctrl->soc->npins; i++) {
1737 const struct pinctrl_pin_desc *desc = &pctrl->soc->pins[i];
1741 if (!intel_pinctrl_should_save(pctrl, desc->number))
1744 val = readl(intel_get_padcfg(pctrl, desc->number, PADCFG0));
1746 val = readl(intel_get_padcfg(pctrl, desc->number, PADCFG1));
1749 padcfg = intel_get_padcfg(pctrl, desc->number, PADCFG2);
1754 communities = pctrl->context.communities;
1755 for (i = 0; i < pctrl->ncommunities; i++) {
1756 struct intel_community *community = &pctrl->communities[i];
1786 static void intel_restore_hostown(struct intel_pinctrl *pctrl, unsigned int c,
1789 const struct intel_community *community = &pctrl->communities[c];
1791 struct device *dev = pctrl->dev;
1799 for_each_requested_gpio_in_range(&pctrl->chip, i, padgrp->gpio_base, padgrp->size, dummy)
1808 static void intel_restore_intmask(struct intel_pinctrl *pctrl, unsigned int c,
1811 struct device *dev = pctrl->dev;
1819 static void intel_restore_padcfg(struct intel_pinctrl *pctrl, unsigned int pin,
1824 struct device *dev = pctrl->dev;
1827 padcfg = intel_get_padcfg(pctrl, pin, reg);
1839 struct intel_pinctrl *pctrl = dev_get_drvdata(dev);
1845 intel_gpio_irq_init(pctrl);
1847 pads = pctrl->context.pads;
1848 for (i = 0; i < pctrl->soc->npins; i++) {
1849 const struct pinctrl_pin_desc *desc = &pctrl->soc->pins[i];
1851 if (!(intel_pinctrl_should_save(pctrl, desc->number) ||
1859 intel_restore_padcfg(pctrl, desc->number, PADCFG0, pads[i].padcfg0);
1860 intel_restore_padcfg(pctrl, desc->number, PADCFG1, pads[i].padcfg1);
1861 intel_restore_padcfg(pctrl, desc->number, PADCFG2, pads[i].padcfg2);
1864 communities = pctrl->context.communities;
1865 for (i = 0; i < pctrl->ncommunities; i++) {
1866 struct intel_community *community = &pctrl->communities[i];
1872 intel_restore_intmask(pctrl, i, base, gpp, communities[i].intmask[gpp]);
1876 intel_restore_hostown(pctrl, i, base, gpp, communities[i].hostown[gpp]);