Lines Matching defs:pctrl

129 #define for_each_intel_pin_community(pctrl, community)					\
131 __ci < pctrl->ncommunities && (community = &pctrl->communities[__ci]); \
139 #define for_each_intel_pad_group(pctrl, community, grp) \
140 for_each_intel_pin_community(pctrl, community) \
143 #define for_each_intel_gpio_group(pctrl, community, grp) \
144 for_each_intel_pad_group(pctrl, community, grp) \
147 const struct intel_community *intel_get_community(const struct intel_pinctrl *pctrl,
152 for_each_intel_pin_community(pctrl, community) {
158 dev_warn(pctrl->dev, "failed to find community for pin %u\n", pin);
177 static void __iomem *intel_get_padcfg(struct intel_pinctrl *pctrl,
184 community = intel_get_community(pctrl, pin);
197 static bool intel_pad_owned_by_host(const struct intel_pinctrl *pctrl, unsigned int pin)
204 community = intel_get_community(pctrl, pin);
222 static bool intel_pad_acpi_mode(const struct intel_pinctrl *pctrl, unsigned int pin)
229 community = intel_get_community(pctrl, pin);
264 static int intel_pad_locked(const struct intel_pinctrl *pctrl, unsigned int pin)
272 community = intel_get_community(pctrl, pin);
302 static bool intel_pad_is_unlocked(const struct intel_pinctrl *pctrl, unsigned int pin)
304 return (intel_pad_locked(pctrl, pin) & PAD_LOCKED) == PAD_UNLOCKED;
307 static bool intel_pad_usable(const struct intel_pinctrl *pctrl, unsigned int pin)
309 return intel_pad_owned_by_host(pctrl, pin) && intel_pad_is_unlocked(pctrl, pin);
314 const struct intel_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
316 return pctrl->soc->ngroups;
322 const struct intel_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
324 return pctrl->soc->groups[group].grp.name;
331 const struct intel_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
333 *pins = pctrl->soc->groups[group].grp.pins;
334 *npins = pctrl->soc->groups[group].grp.npins;
342 struct intel_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
348 if (!intel_pad_owned_by_host(pctrl, pin)) {
353 cfg0 = readl(intel_get_padcfg(pctrl, pin, PADCFG0));
354 cfg1 = readl(intel_get_padcfg(pctrl, pin, PADCFG1));
365 padcfg = intel_get_padcfg(pctrl, pin, PADCFG2);
369 locked = intel_pad_locked(pctrl, pin);
370 acpi = intel_pad_acpi_mode(pctrl, pin);
399 const struct intel_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
401 return pctrl->soc->nfunctions;
407 const struct intel_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
409 return pctrl->soc->functions[function].func.name;
416 const struct intel_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
418 *groups = pctrl->soc->functions[function].func.groups;
419 *ngroups = pctrl->soc->functions[function].func.ngroups;
427 struct intel_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
428 const struct intel_pingroup *grp = &pctrl->soc->groups[group];
431 guard(raw_spinlock_irqsave)(&pctrl->lock);
438 if (!intel_pad_usable(pctrl, grp->grp.pins[i]))
447 padcfg0 = intel_get_padcfg(pctrl, grp->grp.pins[i], PADCFG0);
543 struct intel_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
546 padcfg0 = intel_get_padcfg(pctrl, pin, PADCFG0);
548 guard(raw_spinlock_irqsave)(&pctrl->lock);
550 if (!intel_pad_owned_by_host(pctrl, pin))
553 if (!intel_pad_is_unlocked(pctrl, pin))
574 struct intel_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
578 padcfg0 = intel_get_padcfg(pctrl, pin, PADCFG0);
580 guard(raw_spinlock_irqsave)(&pctrl->lock);
601 static int intel_config_get_pull(struct intel_pinctrl *pctrl, unsigned int pin,
607 padcfg1 = intel_get_padcfg(pctrl, pin, PADCFG1);
609 scoped_guard(raw_spinlock_irqsave, &pctrl->lock)
645 const struct intel_community *community = intel_get_community(pctrl, pin);
682 static int intel_config_get_high_impedance(struct intel_pinctrl *pctrl, unsigned int pin,
688 padcfg0 = intel_get_padcfg(pctrl, pin, PADCFG0);
690 scoped_guard(raw_spinlock_irqsave, &pctrl->lock)
699 static int intel_config_get_debounce(struct intel_pinctrl *pctrl, unsigned int pin,
706 padcfg2 = intel_get_padcfg(pctrl, pin, PADCFG2);
710 scoped_guard(raw_spinlock_irqsave, &pctrl->lock)
725 struct intel_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
730 if (!intel_pad_owned_by_host(pctrl, pin))
737 ret = intel_config_get_pull(pctrl, pin, param, &arg);
743 ret = intel_config_get_high_impedance(pctrl, pin, param, &arg);
749 ret = intel_config_get_debounce(pctrl, pin, param, &arg);
762 static int intel_config_set_pull(struct intel_pinctrl *pctrl, unsigned int pin,
800 const struct intel_community *community = intel_get_community(pctrl, pin);
834 padcfg1 = intel_get_padcfg(pctrl, pin, PADCFG1);
836 guard(raw_spinlock_irqsave)(&pctrl->lock);
846 static void intel_gpio_set_high_impedance(struct intel_pinctrl *pctrl, unsigned int pin)
851 padcfg0 = intel_get_padcfg(pctrl, pin, PADCFG0);
853 guard(raw_spinlock_irqsave)(&pctrl->lock);
860 static int intel_config_set_debounce(struct intel_pinctrl *pctrl,
875 padcfg2 = intel_get_padcfg(pctrl, pin, PADCFG2);
879 padcfg0 = intel_get_padcfg(pctrl, pin, PADCFG0);
881 guard(raw_spinlock_irqsave)(&pctrl->lock);
906 struct intel_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
909 if (!intel_pad_usable(pctrl, pin))
917 ret = intel_config_set_pull(pctrl, pin, configs[i]);
923 intel_gpio_set_high_impedance(pctrl, pin);
927 ret = intel_config_set_debounce(pctrl, pin,
956 * @pctrl: Pinctrl structure
968 static int intel_gpio_to_pin(const struct intel_pinctrl *pctrl, unsigned int offset,
975 for_each_intel_gpio_group(pctrl, comm, grp) {
991 * @pctrl: Pinctrl structure
998 static int intel_pin_to_gpio(const struct intel_pinctrl *pctrl, int pin)
1003 community = intel_get_community(pctrl, pin);
1016 struct intel_pinctrl *pctrl = gpiochip_get_data(chip);
1021 pin = intel_gpio_to_pin(pctrl, offset, NULL, NULL);
1025 reg = intel_get_padcfg(pctrl, pin, PADCFG0);
1039 struct intel_pinctrl *pctrl = gpiochip_get_data(chip);
1044 pin = intel_gpio_to_pin(pctrl, offset, NULL, NULL);
1048 reg = intel_get_padcfg(pctrl, pin, PADCFG0);
1052 guard(raw_spinlock_irqsave)(&pctrl->lock);
1064 struct intel_pinctrl *pctrl = gpiochip_get_data(chip);
1069 pin = intel_gpio_to_pin(pctrl, offset, NULL, NULL);
1073 reg = intel_get_padcfg(pctrl, pin, PADCFG0);
1077 scoped_guard(raw_spinlock_irqsave, &pctrl->lock)
1116 struct intel_pinctrl *pctrl = gpiochip_get_data(gc);
1121 pin = intel_gpio_to_pin(pctrl, irqd_to_hwirq(d), &community, &padgrp);
1131 guard(raw_spinlock)(&pctrl->lock);
1139 struct intel_pinctrl *pctrl = gpiochip_get_data(gc);
1144 pin = intel_gpio_to_pin(pctrl, hwirq, &community, &padgrp);
1156 guard(raw_spinlock_irqsave)(&pctrl->lock);
1191 struct intel_pinctrl *pctrl = gpiochip_get_data(gc);
1192 unsigned int pin = intel_gpio_to_pin(pctrl, irqd_to_hwirq(d), NULL, NULL);
1196 reg = intel_get_padcfg(pctrl, pin, PADCFG0);
1205 if (intel_pad_acpi_mode(pctrl, pin)) {
1206 dev_warn(pctrl->dev, "pin %u cannot be used as IRQ\n", pin);
1227 guard(raw_spinlock_irqsave)(&pctrl->lock);
1249 struct intel_pinctrl *pctrl = gpiochip_get_data(gc);
1250 unsigned int pin = intel_gpio_to_pin(pctrl, irqd_to_hwirq(d), NULL, NULL);
1253 enable_irq_wake(pctrl->irq);
1255 disable_irq_wake(pctrl->irq);
1257 dev_dbg(pctrl->dev, "%s wake for pin %u\n", str_enable_disable(on), pin);
1276 struct intel_pinctrl *pctrl = data;
1280 for_each_intel_pad_group(pctrl, community, padgrp) {
1281 struct gpio_chip *gc = &pctrl->chip;
1291 scoped_guard(raw_spinlock, &pctrl->lock) {
1308 static void intel_gpio_irq_init(struct intel_pinctrl *pctrl)
1312 for_each_intel_pin_community(pctrl, community) {
1329 struct intel_pinctrl *pctrl = gpiochip_get_data(gc);
1335 intel_gpio_irq_init(pctrl);
1342 struct intel_pinctrl *pctrl = gpiochip_get_data(gc);
1347 for_each_intel_gpio_group(pctrl, community, grp) {
1348 ret = gpiochip_add_pin_range(&pctrl->chip, dev_name(pctrl->dev),
1352 dev_err(pctrl->dev, "failed to add GPIO pin range\n");
1360 static unsigned int intel_gpio_ngpio(const struct intel_pinctrl *pctrl)
1366 for_each_intel_gpio_group(pctrl, community, grp) {
1374 static int intel_gpio_probe(struct intel_pinctrl *pctrl, int irq)
1379 pctrl->chip = intel_gpio_chip;
1382 pctrl->chip.ngpio = intel_gpio_ngpio(pctrl);
1383 pctrl->chip.label = dev_name(pctrl->dev);
1384 pctrl->chip.parent = pctrl->dev;
1385 pctrl->chip.base = -1;
1386 pctrl->chip.add_pin_ranges = intel_gpio_add_pin_ranges;
1387 pctrl->irq = irq;
1393 ret = devm_request_irq(pctrl->dev, irq, intel_gpio_irq,
1395 dev_name(pctrl->dev), pctrl);
1397 dev_err(pctrl->dev, "failed to request interrupt\n");
1402 girq = &pctrl->chip.irq;
1411 ret = devm_gpiochip_add_data(pctrl->dev, &pctrl->chip, pctrl);
1413 dev_err(pctrl->dev, "failed to register gpiochip\n");
1420 static int intel_pinctrl_add_padgroups_by_gpps(struct intel_pinctrl *pctrl,
1427 gpps = devm_kcalloc(pctrl->dev, ngpps, sizeof(*gpps), GFP_KERNEL);
1460 static int intel_pinctrl_add_padgroups_by_size(struct intel_pinctrl *pctrl,
1471 gpps = devm_kcalloc(pctrl->dev, ngpps, sizeof(*gpps), GFP_KERNEL);
1495 static int intel_pinctrl_pm_init(struct intel_pinctrl *pctrl)
1498 const struct intel_pinctrl_soc_data *soc = pctrl->soc;
1503 pads = devm_kcalloc(pctrl->dev, soc->npins, sizeof(*pads), GFP_KERNEL);
1507 communities = devm_kcalloc(pctrl->dev, pctrl->ncommunities,
1513 for (i = 0; i < pctrl->ncommunities; i++) {
1514 struct intel_community *community = &pctrl->communities[i];
1517 intmask = devm_kcalloc(pctrl->dev, community->ngpps,
1524 hostown = devm_kcalloc(pctrl->dev, community->ngpps,
1532 pctrl->context.pads = pads;
1533 pctrl->context.communities = communities;
1539 static int intel_pinctrl_probe_pwm(struct intel_pinctrl *pctrl,
1555 chip = devm_pwm_lpss_probe(pctrl->dev, community->regs + PWMC, &info);
1563 struct intel_pinctrl *pctrl;
1566 pctrl = devm_kzalloc(dev, sizeof(*pctrl), GFP_KERNEL);
1567 if (!pctrl)
1570 pctrl->dev = dev;
1571 pctrl->soc = soc_data;
1572 raw_spin_lock_init(&pctrl->lock);
1578 pctrl->ncommunities = pctrl->soc->ncommunities;
1579 pctrl->communities = devm_kmemdup_array(dev, pctrl->soc->communities, pctrl->ncommunities,
1580 sizeof(*pctrl->soc->communities), GFP_KERNEL);
1581 if (!pctrl->communities)
1584 for (i = 0; i < pctrl->ncommunities; i++) {
1585 struct intel_community *community = &pctrl->communities[i];
1638 ret = intel_pinctrl_add_padgroups_by_gpps(pctrl, community);
1640 ret = intel_pinctrl_add_padgroups_by_size(pctrl, community);
1644 ret = intel_pinctrl_probe_pwm(pctrl, community);
1653 ret = intel_pinctrl_pm_init(pctrl);
1657 pctrl->pctldesc = intel_pinctrl_desc;
1658 pctrl->pctldesc.name = dev_name(dev);
1659 pctrl->pctldesc.pins = pctrl->soc->pins;
1660 pctrl->pctldesc.npins = pctrl->soc->npins;
1662 pctrl->pctldev = devm_pinctrl_register(dev, &pctrl->pctldesc, pctrl);
1663 if (IS_ERR(pctrl->pctldev)) {
1665 return PTR_ERR(pctrl->pctldev);
1668 ret = intel_gpio_probe(pctrl, irq);
1672 platform_set_drvdata(pdev, pctrl);
1740 static bool intel_pinctrl_should_save(struct intel_pinctrl *pctrl, unsigned int pin)
1742 const struct pin_desc *pd = pin_desc_get(pctrl->pctldev, pin);
1745 if (!pd || !intel_pad_usable(pctrl, pin))
1755 gpiochip_line_is_irq(&pctrl->chip, intel_pin_to_gpio(pctrl, pin)))
1772 value = readl(intel_get_padcfg(pctrl, pin, PADCFG0));
1781 struct intel_pinctrl *pctrl = dev_get_drvdata(dev);
1786 pads = pctrl->context.pads;
1787 for (i = 0; i < pctrl->soc->npins; i++) {
1788 const struct pinctrl_pin_desc *desc = &pctrl->soc->pins[i];
1792 if (!intel_pinctrl_should_save(pctrl, desc->number))
1795 val = readl(intel_get_padcfg(pctrl, desc->number, PADCFG0));
1797 val = readl(intel_get_padcfg(pctrl, desc->number, PADCFG1));
1800 padcfg = intel_get_padcfg(pctrl, desc->number, PADCFG2);
1805 communities = pctrl->context.communities;
1806 for (i = 0; i < pctrl->ncommunities; i++) {
1807 struct intel_community *community = &pctrl->communities[i];
1837 static void intel_restore_hostown(struct intel_pinctrl *pctrl, unsigned int c,
1840 const struct intel_community *community = &pctrl->communities[c];
1842 struct device *dev = pctrl->dev;
1850 for_each_requested_gpio_in_range(&pctrl->chip, i, padgrp->gpio_base, padgrp->size, dummy)
1859 static void intel_restore_intmask(struct intel_pinctrl *pctrl, unsigned int c,
1862 struct device *dev = pctrl->dev;
1870 static void intel_restore_padcfg(struct intel_pinctrl *pctrl, unsigned int pin,
1875 struct device *dev = pctrl->dev;
1878 padcfg = intel_get_padcfg(pctrl, pin, reg);
1890 struct intel_pinctrl *pctrl = dev_get_drvdata(dev);
1896 intel_gpio_irq_init(pctrl);
1898 pads = pctrl->context.pads;
1899 for (i = 0; i < pctrl->soc->npins; i++) {
1900 const struct pinctrl_pin_desc *desc = &pctrl->soc->pins[i];
1902 if (!(intel_pinctrl_should_save(pctrl, desc->number) ||
1910 intel_restore_padcfg(pctrl, desc->number, PADCFG0, pads[i].padcfg0);
1911 intel_restore_padcfg(pctrl, desc->number, PADCFG1, pads[i].padcfg1);
1912 intel_restore_padcfg(pctrl, desc->number, PADCFG2, pads[i].padcfg2);
1915 communities = pctrl->context.communities;
1916 for (i = 0; i < pctrl->ncommunities; i++) {
1917 struct intel_community *community = &pctrl->communities[i];
1923 intel_restore_intmask(pctrl, i, base, gpp, communities[i].intmask[gpp]);
1927 intel_restore_hostown(pctrl, i, base, gpp, communities[i].hostown[gpp]);