summaryrefslogtreecommitdiffstats
path: root/drivers/pinctrl
diff options
context:
space:
mode:
authorLinus Walleij <linus.walleij@linaro.org>2017-04-10 03:35:30 -0400
committerLinus Walleij <linus.walleij@linaro.org>2017-04-10 03:35:30 -0400
commit8d4264d86c1a31d7e0efd3e4c3e08bc91dbdb48c (patch)
tree54f74ed92952148c9923d70471e7cbc62b9e57d6 /drivers/pinctrl
parentba9e7f2794d8158c93aacd279830a6f1f98b19b0 (diff)
parentf69ae4f58a198ad15b0422637434d2bcf6fc2e2a (diff)
Merge tag 'samsung-pinctrl-4.12' of git://git.kernel.org/pub/scm/linux/kernel/git/pinctrl/samsung into devel
Samsung pinctrl drivers update for v4.12: 1. Add support for pad retention control through pinctrl drivers which moves us forward to better runtime PM of pinctrl, clocks, power domains and other devices. 2. Fix GPIO hogs by registering pinctrl before registering gpiolib. 3. Use devm-like interface.
Diffstat (limited to 'drivers/pinctrl')
-rw-r--r--drivers/pinctrl/samsung/pinctrl-exynos.c63
-rw-r--r--drivers/pinctrl/samsung/pinctrl-samsung.c45
2 files changed, 83 insertions, 25 deletions
diff --git a/drivers/pinctrl/samsung/pinctrl-exynos.c b/drivers/pinctrl/samsung/pinctrl-exynos.c
index f9b49967f512..c0dfd31c0fa2 100644
--- a/drivers/pinctrl/samsung/pinctrl-exynos.c
+++ b/drivers/pinctrl/samsung/pinctrl-exynos.c
@@ -777,6 +777,7 @@ exynos_retention_init(struct samsung_pinctrl_drv_data *drvdata,
777{ 777{
778 struct samsung_retention_ctrl *ctrl; 778 struct samsung_retention_ctrl *ctrl;
779 struct regmap *pmu_regs; 779 struct regmap *pmu_regs;
780 int i;
780 781
781 ctrl = devm_kzalloc(drvdata->dev, sizeof(*ctrl), GFP_KERNEL); 782 ctrl = devm_kzalloc(drvdata->dev, sizeof(*ctrl), GFP_KERNEL);
782 if (!ctrl) 783 if (!ctrl)
@@ -794,6 +795,10 @@ exynos_retention_init(struct samsung_pinctrl_drv_data *drvdata,
794 ctrl->enable = exynos_retention_enable; 795 ctrl->enable = exynos_retention_enable;
795 ctrl->disable = exynos_retention_disable; 796 ctrl->disable = exynos_retention_disable;
796 797
798 /* Ensure that retention is disabled on driver init */
799 for (i = 0; i < ctrl->nr_regs; i++)
800 regmap_write(pmu_regs, ctrl->regs[i], ctrl->value);
801
797 return ctrl; 802 return ctrl;
798} 803}
799 804
@@ -1546,6 +1551,54 @@ static const struct samsung_pin_bank_data exynos5433_pin_banks9[] __initconst =
1546 EXYNOS_PIN_BANK_EINTG(3, 0x000, "gpj1", 0x00), 1551 EXYNOS_PIN_BANK_EINTG(3, 0x000, "gpj1", 0x00),
1547}; 1552};
1548 1553
1554/* PMU pin retention groups registers for Exynos5433 (without audio & fsys) */
1555static const u32 exynos5433_retention_regs[] = {
1556 EXYNOS5433_PAD_RETENTION_TOP_OPTION,
1557 EXYNOS5433_PAD_RETENTION_UART_OPTION,
1558 EXYNOS5433_PAD_RETENTION_EBIA_OPTION,
1559 EXYNOS5433_PAD_RETENTION_EBIB_OPTION,
1560 EXYNOS5433_PAD_RETENTION_SPI_OPTION,
1561 EXYNOS5433_PAD_RETENTION_MIF_OPTION,
1562 EXYNOS5433_PAD_RETENTION_USBXTI_OPTION,
1563 EXYNOS5433_PAD_RETENTION_BOOTLDO_OPTION,
1564 EXYNOS5433_PAD_RETENTION_UFS_OPTION,
1565 EXYNOS5433_PAD_RETENTION_FSYSGENIO_OPTION,
1566};
1567
1568static const struct samsung_retention_data exynos5433_retention_data __initconst = {
1569 .regs = exynos5433_retention_regs,
1570 .nr_regs = ARRAY_SIZE(exynos5433_retention_regs),
1571 .value = EXYNOS_WAKEUP_FROM_LOWPWR,
1572 .refcnt = &exynos_shared_retention_refcnt,
1573 .init = exynos_retention_init,
1574};
1575
1576/* PMU retention control for audio pins can be tied to audio pin bank */
1577static const u32 exynos5433_audio_retention_regs[] = {
1578 EXYNOS5433_PAD_RETENTION_AUD_OPTION,
1579};
1580
1581static const struct samsung_retention_data exynos5433_audio_retention_data __initconst = {
1582 .regs = exynos5433_audio_retention_regs,
1583 .nr_regs = ARRAY_SIZE(exynos5433_audio_retention_regs),
1584 .value = EXYNOS_WAKEUP_FROM_LOWPWR,
1585 .init = exynos_retention_init,
1586};
1587
1588/* PMU retention control for mmc pins can be tied to fsys pin bank */
1589static const u32 exynos5433_fsys_retention_regs[] = {
1590 EXYNOS5433_PAD_RETENTION_MMC0_OPTION,
1591 EXYNOS5433_PAD_RETENTION_MMC1_OPTION,
1592 EXYNOS5433_PAD_RETENTION_MMC2_OPTION,
1593};
1594
1595static const struct samsung_retention_data exynos5433_fsys_retention_data __initconst = {
1596 .regs = exynos5433_fsys_retention_regs,
1597 .nr_regs = ARRAY_SIZE(exynos5433_fsys_retention_regs),
1598 .value = EXYNOS_WAKEUP_FROM_LOWPWR,
1599 .init = exynos_retention_init,
1600};
1601
1549/* 1602/*
1550 * Samsung pinctrl driver data for Exynos5433 SoC. Exynos5433 SoC includes 1603 * Samsung pinctrl driver data for Exynos5433 SoC. Exynos5433 SoC includes
1551 * ten gpio/pin-mux/pinconfig controllers. 1604 * ten gpio/pin-mux/pinconfig controllers.
@@ -1559,6 +1612,7 @@ const struct samsung_pin_ctrl exynos5433_pin_ctrl[] __initconst = {
1559 .suspend = exynos_pinctrl_suspend, 1612 .suspend = exynos_pinctrl_suspend,
1560 .resume = exynos_pinctrl_resume, 1613 .resume = exynos_pinctrl_resume,
1561 .nr_ext_resources = 1, 1614 .nr_ext_resources = 1,
1615 .retention_data = &exynos5433_retention_data,
1562 }, { 1616 }, {
1563 /* pin-controller instance 1 data */ 1617 /* pin-controller instance 1 data */
1564 .pin_banks = exynos5433_pin_banks1, 1618 .pin_banks = exynos5433_pin_banks1,
@@ -1566,6 +1620,7 @@ const struct samsung_pin_ctrl exynos5433_pin_ctrl[] __initconst = {
1566 .eint_gpio_init = exynos_eint_gpio_init, 1620 .eint_gpio_init = exynos_eint_gpio_init,
1567 .suspend = exynos_pinctrl_suspend, 1621 .suspend = exynos_pinctrl_suspend,
1568 .resume = exynos_pinctrl_resume, 1622 .resume = exynos_pinctrl_resume,
1623 .retention_data = &exynos5433_audio_retention_data,
1569 }, { 1624 }, {
1570 /* pin-controller instance 2 data */ 1625 /* pin-controller instance 2 data */
1571 .pin_banks = exynos5433_pin_banks2, 1626 .pin_banks = exynos5433_pin_banks2,
@@ -1573,6 +1628,7 @@ const struct samsung_pin_ctrl exynos5433_pin_ctrl[] __initconst = {
1573 .eint_gpio_init = exynos_eint_gpio_init, 1628 .eint_gpio_init = exynos_eint_gpio_init,
1574 .suspend = exynos_pinctrl_suspend, 1629 .suspend = exynos_pinctrl_suspend,
1575 .resume = exynos_pinctrl_resume, 1630 .resume = exynos_pinctrl_resume,
1631 .retention_data = &exynos5433_retention_data,
1576 }, { 1632 }, {
1577 /* pin-controller instance 3 data */ 1633 /* pin-controller instance 3 data */
1578 .pin_banks = exynos5433_pin_banks3, 1634 .pin_banks = exynos5433_pin_banks3,
@@ -1580,6 +1636,7 @@ const struct samsung_pin_ctrl exynos5433_pin_ctrl[] __initconst = {
1580 .eint_gpio_init = exynos_eint_gpio_init, 1636 .eint_gpio_init = exynos_eint_gpio_init,
1581 .suspend = exynos_pinctrl_suspend, 1637 .suspend = exynos_pinctrl_suspend,
1582 .resume = exynos_pinctrl_resume, 1638 .resume = exynos_pinctrl_resume,
1639 .retention_data = &exynos5433_retention_data,
1583 }, { 1640 }, {
1584 /* pin-controller instance 4 data */ 1641 /* pin-controller instance 4 data */
1585 .pin_banks = exynos5433_pin_banks4, 1642 .pin_banks = exynos5433_pin_banks4,
@@ -1587,6 +1644,7 @@ const struct samsung_pin_ctrl exynos5433_pin_ctrl[] __initconst = {
1587 .eint_gpio_init = exynos_eint_gpio_init, 1644 .eint_gpio_init = exynos_eint_gpio_init,
1588 .suspend = exynos_pinctrl_suspend, 1645 .suspend = exynos_pinctrl_suspend,
1589 .resume = exynos_pinctrl_resume, 1646 .resume = exynos_pinctrl_resume,
1647 .retention_data = &exynos5433_retention_data,
1590 }, { 1648 }, {
1591 /* pin-controller instance 5 data */ 1649 /* pin-controller instance 5 data */
1592 .pin_banks = exynos5433_pin_banks5, 1650 .pin_banks = exynos5433_pin_banks5,
@@ -1594,6 +1652,7 @@ const struct samsung_pin_ctrl exynos5433_pin_ctrl[] __initconst = {
1594 .eint_gpio_init = exynos_eint_gpio_init, 1652 .eint_gpio_init = exynos_eint_gpio_init,
1595 .suspend = exynos_pinctrl_suspend, 1653 .suspend = exynos_pinctrl_suspend,
1596 .resume = exynos_pinctrl_resume, 1654 .resume = exynos_pinctrl_resume,
1655 .retention_data = &exynos5433_fsys_retention_data,
1597 }, { 1656 }, {
1598 /* pin-controller instance 6 data */ 1657 /* pin-controller instance 6 data */
1599 .pin_banks = exynos5433_pin_banks6, 1658 .pin_banks = exynos5433_pin_banks6,
@@ -1601,6 +1660,7 @@ const struct samsung_pin_ctrl exynos5433_pin_ctrl[] __initconst = {
1601 .eint_gpio_init = exynos_eint_gpio_init, 1660 .eint_gpio_init = exynos_eint_gpio_init,
1602 .suspend = exynos_pinctrl_suspend, 1661 .suspend = exynos_pinctrl_suspend,
1603 .resume = exynos_pinctrl_resume, 1662 .resume = exynos_pinctrl_resume,
1663 .retention_data = &exynos5433_retention_data,
1604 }, { 1664 }, {
1605 /* pin-controller instance 7 data */ 1665 /* pin-controller instance 7 data */
1606 .pin_banks = exynos5433_pin_banks7, 1666 .pin_banks = exynos5433_pin_banks7,
@@ -1608,6 +1668,7 @@ const struct samsung_pin_ctrl exynos5433_pin_ctrl[] __initconst = {
1608 .eint_gpio_init = exynos_eint_gpio_init, 1668 .eint_gpio_init = exynos_eint_gpio_init,
1609 .suspend = exynos_pinctrl_suspend, 1669 .suspend = exynos_pinctrl_suspend,
1610 .resume = exynos_pinctrl_resume, 1670 .resume = exynos_pinctrl_resume,
1671 .retention_data = &exynos5433_retention_data,
1611 }, { 1672 }, {
1612 /* pin-controller instance 8 data */ 1673 /* pin-controller instance 8 data */
1613 .pin_banks = exynos5433_pin_banks8, 1674 .pin_banks = exynos5433_pin_banks8,
@@ -1615,6 +1676,7 @@ const struct samsung_pin_ctrl exynos5433_pin_ctrl[] __initconst = {
1615 .eint_gpio_init = exynos_eint_gpio_init, 1676 .eint_gpio_init = exynos_eint_gpio_init,
1616 .suspend = exynos_pinctrl_suspend, 1677 .suspend = exynos_pinctrl_suspend,
1617 .resume = exynos_pinctrl_resume, 1678 .resume = exynos_pinctrl_resume,
1679 .retention_data = &exynos5433_retention_data,
1618 }, { 1680 }, {
1619 /* pin-controller instance 9 data */ 1681 /* pin-controller instance 9 data */
1620 .pin_banks = exynos5433_pin_banks9, 1682 .pin_banks = exynos5433_pin_banks9,
@@ -1622,6 +1684,7 @@ const struct samsung_pin_ctrl exynos5433_pin_ctrl[] __initconst = {
1622 .eint_gpio_init = exynos_eint_gpio_init, 1684 .eint_gpio_init = exynos_eint_gpio_init,
1623 .suspend = exynos_pinctrl_suspend, 1685 .suspend = exynos_pinctrl_suspend,
1624 .resume = exynos_pinctrl_resume, 1686 .resume = exynos_pinctrl_resume,
1687 .retention_data = &exynos5433_retention_data,
1625 }, 1688 },
1626}; 1689};
1627 1690
diff --git a/drivers/pinctrl/samsung/pinctrl-samsung.c b/drivers/pinctrl/samsung/pinctrl-samsung.c
index 0d2989d98bc3..b618dae84cec 100644
--- a/drivers/pinctrl/samsung/pinctrl-samsung.c
+++ b/drivers/pinctrl/samsung/pinctrl-samsung.c
@@ -882,7 +882,7 @@ static int samsung_pinctrl_register(struct platform_device *pdev,
882 pin_bank->grange.id = bank; 882 pin_bank->grange.id = bank;
883 pin_bank->grange.pin_base = drvdata->pin_base 883 pin_bank->grange.pin_base = drvdata->pin_base
884 + pin_bank->pin_base; 884 + pin_bank->pin_base;
885 pin_bank->grange.base = pin_bank->gpio_chip.base; 885 pin_bank->grange.base = pin_bank->grange.pin_base;
886 pin_bank->grange.npins = pin_bank->gpio_chip.ngpio; 886 pin_bank->grange.npins = pin_bank->gpio_chip.ngpio;
887 pin_bank->grange.gc = &pin_bank->gpio_chip; 887 pin_bank->grange.gc = &pin_bank->gpio_chip;
888 pinctrl_add_gpio_range(drvdata->pctl_dev, &pin_bank->grange); 888 pinctrl_add_gpio_range(drvdata->pctl_dev, &pin_bank->grange);
@@ -891,6 +891,19 @@ static int samsung_pinctrl_register(struct platform_device *pdev,
891 return 0; 891 return 0;
892} 892}
893 893
894/* unregister the pinctrl interface with the pinctrl subsystem */
895static int samsung_pinctrl_unregister(struct platform_device *pdev,
896 struct samsung_pinctrl_drv_data *drvdata)
897{
898 struct samsung_pin_bank *bank = drvdata->pin_banks;
899 int i;
900
901 for (i = 0; i < drvdata->nr_banks; ++i, ++bank)
902 pinctrl_remove_gpio_range(drvdata->pctl_dev, &bank->grange);
903
904 return 0;
905}
906
894static const struct gpio_chip samsung_gpiolib_chip = { 907static const struct gpio_chip samsung_gpiolib_chip = {
895 .request = gpiochip_generic_request, 908 .request = gpiochip_generic_request,
896 .free = gpiochip_generic_free, 909 .free = gpiochip_generic_free,
@@ -915,39 +928,21 @@ static int samsung_gpiolib_register(struct platform_device *pdev,
915 bank->gpio_chip = samsung_gpiolib_chip; 928 bank->gpio_chip = samsung_gpiolib_chip;
916 929
917 gc = &bank->gpio_chip; 930 gc = &bank->gpio_chip;
918 gc->base = drvdata->pin_base + bank->pin_base; 931 gc->base = bank->grange.base;
919 gc->ngpio = bank->nr_pins; 932 gc->ngpio = bank->nr_pins;
920 gc->parent = &pdev->dev; 933 gc->parent = &pdev->dev;
921 gc->of_node = bank->of_node; 934 gc->of_node = bank->of_node;
922 gc->label = bank->name; 935 gc->label = bank->name;
923 936
924 ret = gpiochip_add_data(gc, bank); 937 ret = devm_gpiochip_add_data(&pdev->dev, gc, bank);
925 if (ret) { 938 if (ret) {
926 dev_err(&pdev->dev, "failed to register gpio_chip %s, error code: %d\n", 939 dev_err(&pdev->dev, "failed to register gpio_chip %s, error code: %d\n",
927 gc->label, ret); 940 gc->label, ret);
928 goto fail; 941 return ret;
929 } 942 }
930 } 943 }
931 944
932 return 0; 945 return 0;
933
934fail:
935 for (--i, --bank; i >= 0; --i, --bank)
936 gpiochip_remove(&bank->gpio_chip);
937 return ret;
938}
939
940/* unregister the gpiolib interface with the gpiolib subsystem */
941static int samsung_gpiolib_unregister(struct platform_device *pdev,
942 struct samsung_pinctrl_drv_data *drvdata)
943{
944 struct samsung_pin_bank *bank = drvdata->pin_banks;
945 int i;
946
947 for (i = 0; i < drvdata->nr_banks; ++i, ++bank)
948 gpiochip_remove(&bank->gpio_chip);
949
950 return 0;
951} 946}
952 947
953/* retrieve the soc specific data */ 948/* retrieve the soc specific data */
@@ -1060,13 +1055,13 @@ static int samsung_pinctrl_probe(struct platform_device *pdev)
1060 return PTR_ERR(drvdata->retention_ctrl); 1055 return PTR_ERR(drvdata->retention_ctrl);
1061 } 1056 }
1062 1057
1063 ret = samsung_gpiolib_register(pdev, drvdata); 1058 ret = samsung_pinctrl_register(pdev, drvdata);
1064 if (ret) 1059 if (ret)
1065 return ret; 1060 return ret;
1066 1061
1067 ret = samsung_pinctrl_register(pdev, drvdata); 1062 ret = samsung_gpiolib_register(pdev, drvdata);
1068 if (ret) { 1063 if (ret) {
1069 samsung_gpiolib_unregister(pdev, drvdata); 1064 samsung_pinctrl_unregister(pdev, drvdata);
1070 return ret; 1065 return ret;
1071 } 1066 }
1072 1067