root/drivers/pinctrl/pxa/pinctrl-pxa25x.c
// SPDX-License-Identifier: GPL-2.0-only
/*
 * Marvell PXA25x family pin control
 *
 * Copyright (C) 2016 Robert Jarzmik
 */
#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/of.h>
#include <linux/pinctrl/pinctrl.h>

#include "pinctrl-pxa2xx.h"

static const struct pxa_desc_pin pxa25x_pins[] = {
        PXA_GPIO_ONLY_PIN(PXA_PINCTRL_PIN(0)),
        PXA_GPIO_PIN(PXA_PINCTRL_PIN(1),
                     PXA_FUNCTION(0, 1, "GP_RST")),
        PXA_GPIO_ONLY_PIN(PXA_PINCTRL_PIN(2)),
        PXA_GPIO_ONLY_PIN(PXA_PINCTRL_PIN(3)),
        PXA_GPIO_ONLY_PIN(PXA_PINCTRL_PIN(4)),
        PXA_GPIO_ONLY_PIN(PXA_PINCTRL_PIN(5)),
        PXA_GPIO_PIN(PXA_PINCTRL_PIN(6),
                     PXA_FUNCTION(1, 1, "MMCCLK")),
        PXA_GPIO_PIN(PXA_PINCTRL_PIN(7),
                     PXA_FUNCTION(1, 1, "48_MHz")),
        PXA_GPIO_PIN(PXA_PINCTRL_PIN(8),
                     PXA_FUNCTION(1, 1, "MMCCS0")),
        PXA_GPIO_PIN(PXA_PINCTRL_PIN(9),
                     PXA_FUNCTION(1, 1, "MMCCS1")),
        PXA_GPIO_PIN(PXA_PINCTRL_PIN(10),
                     PXA_FUNCTION(1, 1, "RTCCLK")),
        PXA_GPIO_PIN(PXA_PINCTRL_PIN(11),
                     PXA_FUNCTION(1, 1, "3_6_MHz")),
        PXA_GPIO_PIN(PXA_PINCTRL_PIN(12),
                     PXA_FUNCTION(1, 1, "32_kHz")),
        PXA_GPIO_PIN(PXA_PINCTRL_PIN(13),
                     PXA_FUNCTION(1, 2, "MBGNT")),
        PXA_GPIO_PIN(PXA_PINCTRL_PIN(14),
                     PXA_FUNCTION(0, 1, "MBREQ")),
        PXA_GPIO_PIN(PXA_PINCTRL_PIN(15),
                     PXA_FUNCTION(1, 2, "nCS_1")),
        PXA_GPIO_PIN(PXA_PINCTRL_PIN(16),
                     PXA_FUNCTION(1, 2, "PWM0")),
        PXA_GPIO_PIN(PXA_PINCTRL_PIN(17),
                     PXA_FUNCTION(1, 2, "PWM1")),
        PXA_GPIO_PIN(PXA_PINCTRL_PIN(18),
                     PXA_FUNCTION(0, 1, "RDY")),
        PXA_GPIO_PIN(PXA_PINCTRL_PIN(19),
                     PXA_FUNCTION(0, 1, "DREQ[1]")),
        PXA_GPIO_PIN(PXA_PINCTRL_PIN(20),
                     PXA_FUNCTION(0, 1, "DREQ[0]")),
        PXA_GPIO_ONLY_PIN(PXA_PINCTRL_PIN(21)),
        PXA_GPIO_ONLY_PIN(PXA_PINCTRL_PIN(22)),
        PXA_GPIO_PIN(PXA_PINCTRL_PIN(23),
                     PXA_FUNCTION(1, 2, "SCLK")),
        PXA_GPIO_PIN(PXA_PINCTRL_PIN(24),
                     PXA_FUNCTION(1, 2, "SFRM")),
        PXA_GPIO_PIN(PXA_PINCTRL_PIN(25),
                     PXA_FUNCTION(1, 2, "TXD")),
        PXA_GPIO_PIN(PXA_PINCTRL_PIN(26),
                     PXA_FUNCTION(0, 1, "RXD")),
        PXA_GPIO_PIN(PXA_PINCTRL_PIN(27),
                     PXA_FUNCTION(0, 1, "EXTCLK")),
        PXA_GPIO_PIN(PXA_PINCTRL_PIN(28),
                     PXA_FUNCTION(0, 1, "BITCLK"),
                     PXA_FUNCTION(0, 2, "BITCLK"),
                     PXA_FUNCTION(1, 1, "BITCLK")),
        PXA_GPIO_PIN(PXA_PINCTRL_PIN(29),
                     PXA_FUNCTION(0, 1, "SDATA_IN0"),
                     PXA_FUNCTION(0, 2, "SDATA_IN")),
        PXA_GPIO_PIN(PXA_PINCTRL_PIN(30),
                     PXA_FUNCTION(1, 1, "SDATA_OUT"),
                     PXA_FUNCTION(1, 2, "SDATA_OUT")),
        PXA_GPIO_PIN(PXA_PINCTRL_PIN(31),
                     PXA_FUNCTION(1, 1, "SYNC"),
                     PXA_FUNCTION(1, 2, "SYNC")),
        PXA_GPIO_PIN(PXA_PINCTRL_PIN(32),
                     PXA_FUNCTION(0, 1, "SDATA_IN1"),
                     PXA_FUNCTION(1, 1, "SYSCLK")),
        PXA_GPIO_PIN(PXA_PINCTRL_PIN(33),
                     PXA_FUNCTION(1, 2, "nCS[5]")),
        PXA_GPIO_PIN(PXA_PINCTRL_PIN(34),
                     PXA_FUNCTION(0, 1, "FFRXD"),
                     PXA_FUNCTION(1, 2, "MMCCS0")),
        PXA_GPIO_PIN(PXA_PINCTRL_PIN(35),
                     PXA_FUNCTION(0, 1, "CTS")),
        PXA_GPIO_PIN(PXA_PINCTRL_PIN(36),
                     PXA_FUNCTION(0, 1, "DCD")),
        PXA_GPIO_PIN(PXA_PINCTRL_PIN(37),
                     PXA_FUNCTION(0, 1, "DSR")),
        PXA_GPIO_PIN(PXA_PINCTRL_PIN(38),
                     PXA_FUNCTION(0, 1, "RI")),
        PXA_GPIO_PIN(PXA_PINCTRL_PIN(39),
                     PXA_FUNCTION(1, 1, "MMCC1"),
                     PXA_FUNCTION(1, 2, "FFTXD")),
        PXA_GPIO_PIN(PXA_PINCTRL_PIN(40),
                     PXA_FUNCTION(1, 2, "DTR")),
        PXA_GPIO_PIN(PXA_PINCTRL_PIN(41),
                     PXA_FUNCTION(1, 2, "RTS")),
        PXA_GPIO_PIN(PXA_PINCTRL_PIN(42),
                     PXA_FUNCTION(0, 1, "BTRXD"),
                     PXA_FUNCTION(0, 3, "HWRXD")),
        PXA_GPIO_PIN(PXA_PINCTRL_PIN(43),
                     PXA_FUNCTION(1, 2, "BTTXD"),
                     PXA_FUNCTION(1, 3, "HWTXD")),
        PXA_GPIO_PIN(PXA_PINCTRL_PIN(44),
                     PXA_FUNCTION(0, 1, "BTCTS"),
                     PXA_FUNCTION(0, 3, "HWCTS")),
        PXA_GPIO_PIN(PXA_PINCTRL_PIN(45),
                     PXA_FUNCTION(1, 2, "BTRTS"),
                     PXA_FUNCTION(1, 3, "HWRTS")),
        PXA_GPIO_PIN(PXA_PINCTRL_PIN(46),
                     PXA_FUNCTION(0, 1, "ICP_RXD"),
                     PXA_FUNCTION(0, 2, "RXD")),
        PXA_GPIO_PIN(PXA_PINCTRL_PIN(47),
                     PXA_FUNCTION(1, 1, "TXD"),
                     PXA_FUNCTION(1, 2, "ICP_TXD")),
        PXA_GPIO_PIN(PXA_PINCTRL_PIN(48),
                     PXA_FUNCTION(1, 1, "HWTXD"),
                     PXA_FUNCTION(1, 2, "nPOE")),
        PXA_GPIO_PIN(PXA_PINCTRL_PIN(49),
                     PXA_FUNCTION(0, 1, "HWRXD"),
                     PXA_FUNCTION(1, 2, "nPWE")),
        PXA_GPIO_PIN(PXA_PINCTRL_PIN(50),
                     PXA_FUNCTION(0, 1, "HWCTS"),
                     PXA_FUNCTION(1, 2, "nPIOR")),
        PXA_GPIO_PIN(PXA_PINCTRL_PIN(51),
                     PXA_FUNCTION(1, 1, "HWRTS"),
                     PXA_FUNCTION(1, 2, "nPIOW")),
        PXA_GPIO_PIN(PXA_PINCTRL_PIN(52),
                     PXA_FUNCTION(1, 2, "nPCE[1]")),
        PXA_GPIO_PIN(PXA_PINCTRL_PIN(53),
                     PXA_FUNCTION(1, 1, "MMCCLK"),
                     PXA_FUNCTION(1, 2, "nPCE[2]")),
        PXA_GPIO_PIN(PXA_PINCTRL_PIN(54),
                     PXA_FUNCTION(1, 1, "MMCCLK"),
                     PXA_FUNCTION(1, 2, "nPSKTSEL")),
        PXA_GPIO_PIN(PXA_PINCTRL_PIN(55),
                     PXA_FUNCTION(1, 2, "nPREG")),
        PXA_GPIO_PIN(PXA_PINCTRL_PIN(56),
                     PXA_FUNCTION(0, 1, "nPWAIT")),
        PXA_GPIO_PIN(PXA_PINCTRL_PIN(57),
                     PXA_FUNCTION(0, 1, "nIOIS16")),
        PXA_GPIO_PIN(PXA_PINCTRL_PIN(58),
                     PXA_FUNCTION(1, 2, "LDD<0>")),
        PXA_GPIO_PIN(PXA_PINCTRL_PIN(59),
                     PXA_FUNCTION(1, 2, "LDD<1>")),
        PXA_GPIO_PIN(PXA_PINCTRL_PIN(60),
                     PXA_FUNCTION(1, 2, "LDD<2>")),
        PXA_GPIO_PIN(PXA_PINCTRL_PIN(61),
                     PXA_FUNCTION(1, 2, "LDD<3>")),
        PXA_GPIO_PIN(PXA_PINCTRL_PIN(62),
                     PXA_FUNCTION(1, 2, "LDD<4>")),
        PXA_GPIO_PIN(PXA_PINCTRL_PIN(63),
                     PXA_FUNCTION(1, 2, "LDD<5>")),
        PXA_GPIO_PIN(PXA_PINCTRL_PIN(64),
                     PXA_FUNCTION(1, 2, "LDD<6>")),
        PXA_GPIO_PIN(PXA_PINCTRL_PIN(65),
                     PXA_FUNCTION(1, 2, "LDD<7>")),
        PXA_GPIO_PIN(PXA_PINCTRL_PIN(66),
                     PXA_FUNCTION(0, 1, "MBREQ"),
                     PXA_FUNCTION(1, 2, "LDD<8>")),
        PXA_GPIO_PIN(PXA_PINCTRL_PIN(67),
                     PXA_FUNCTION(1, 1, "MMCCS0"),
                     PXA_FUNCTION(1, 2, "LDD<9>")),
        PXA_GPIO_PIN(PXA_PINCTRL_PIN(68),
                     PXA_FUNCTION(1, 1, "MMCCS1"),
                     PXA_FUNCTION(1, 2, "LDD<10>")),
        PXA_GPIO_PIN(PXA_PINCTRL_PIN(69),
                     PXA_FUNCTION(1, 1, "MMCCLK"),
                     PXA_FUNCTION(1, 2, "LDD<11>")),
        PXA_GPIO_PIN(PXA_PINCTRL_PIN(70),
                     PXA_FUNCTION(1, 1, "RTCCLK"),
                     PXA_FUNCTION(1, 2, "LDD<12>")),
        PXA_GPIO_PIN(PXA_PINCTRL_PIN(71),
                     PXA_FUNCTION(1, 1, "3_6_MHz"),
                     PXA_FUNCTION(1, 2, "LDD<13>")),
        PXA_GPIO_PIN(PXA_PINCTRL_PIN(72),
                     PXA_FUNCTION(1, 1, "32_kHz"),
                     PXA_FUNCTION(1, 2, "LDD<14>")),
        PXA_GPIO_PIN(PXA_PINCTRL_PIN(73),
                     PXA_FUNCTION(1, 1, "MBGNT"),
                     PXA_FUNCTION(1, 2, "LDD<15>")),
        PXA_GPIO_PIN(PXA_PINCTRL_PIN(74),
                     PXA_FUNCTION(1, 2, "LCD_FCLK")),
        PXA_GPIO_PIN(PXA_PINCTRL_PIN(75),
                     PXA_FUNCTION(1, 2, "LCD_LCLK")),
        PXA_GPIO_PIN(PXA_PINCTRL_PIN(76),
                     PXA_FUNCTION(1, 2, "LCD_PCLK")),
        PXA_GPIO_PIN(PXA_PINCTRL_PIN(77),
                     PXA_FUNCTION(1, 2, "LCD_ACBIAS")),
        PXA_GPIO_PIN(PXA_PINCTRL_PIN(78),
                     PXA_FUNCTION(1, 2, "nCS<2>")),
        PXA_GPIO_PIN(PXA_PINCTRL_PIN(79),
                     PXA_FUNCTION(1, 2, "nCS<3>")),
        PXA_GPIO_PIN(PXA_PINCTRL_PIN(80),
                     PXA_FUNCTION(1, 2, "nCS<4>")),
        PXA_GPIO_PIN(PXA_PINCTRL_PIN(81),
                     PXA_FUNCTION(0, 1, "NSSPSCLK"),
                     PXA_FUNCTION(1, 1, "NSSPSCLK")),
        PXA_GPIO_PIN(PXA_PINCTRL_PIN(82),
                     PXA_FUNCTION(0, 1, "NSSPSFRM"),
                     PXA_FUNCTION(1, 1, "NSSPSFRM")),
        PXA_GPIO_PIN(PXA_PINCTRL_PIN(83),
                     PXA_FUNCTION(0, 2, "NSSPRXD"),
                     PXA_FUNCTION(1, 1, "NSSPTXD")),
        PXA_GPIO_PIN(PXA_PINCTRL_PIN(84),
                     PXA_FUNCTION(0, 2, "NSSPRXD"),
                     PXA_FUNCTION(1, 1, "NSSPTXD")),
};

static int pxa25x_pinctrl_probe(struct platform_device *pdev)
{
        int ret, i;
        void __iomem *base_af[8];
        void __iomem *base_dir[4];
        void __iomem *base_sleep[4];

        base_af[0] = devm_platform_ioremap_resource(pdev, 0);
        if (IS_ERR(base_af[0]))
                return PTR_ERR(base_af[0]);

        base_dir[0] = devm_platform_ioremap_resource(pdev, 1);
        if (IS_ERR(base_dir[0]))
                return PTR_ERR(base_dir[0]);

        base_dir[3] = devm_platform_ioremap_resource(pdev, 2);
        if (IS_ERR(base_dir[3]))
                return PTR_ERR(base_dir[3]);

        base_sleep[0] = devm_platform_ioremap_resource(pdev, 3);
        if (IS_ERR(base_sleep[0]))
                return PTR_ERR(base_sleep[0]);

        for (i = 0; i < ARRAY_SIZE(base_af); i++)
                base_af[i] = base_af[0] + sizeof(base_af[0]) * i;
        for (i = 0; i < 3; i++)
                base_dir[i] = base_dir[0] + sizeof(base_dir[0]) * i;
        for (i = 0; i < ARRAY_SIZE(base_sleep); i++)
                base_sleep[i] = base_sleep[0] + sizeof(base_af[0]) * i;

        ret = pxa2xx_pinctrl_init(pdev, pxa25x_pins, ARRAY_SIZE(pxa25x_pins),
                                  base_af, base_dir, base_sleep);
        return ret;
}

static const struct of_device_id pxa25x_pinctrl_match[] = {
        { .compatible = "marvell,pxa25x-pinctrl", },
        {}
};
MODULE_DEVICE_TABLE(of, pxa25x_pinctrl_match);

static struct platform_driver pxa25x_pinctrl_driver = {
        .probe  = pxa25x_pinctrl_probe,
        .driver = {
                .name           = "pxa25x-pinctrl",
                .of_match_table = pxa25x_pinctrl_match,
        },
};
module_platform_driver(pxa25x_pinctrl_driver);

MODULE_AUTHOR("Robert Jarzmik <robert.jarzmik@free.fr>");
MODULE_DESCRIPTION("Marvell PXA25x pinctrl driver");
MODULE_LICENSE("GPL v2");