116b343e8SAnson Huang // SPDX-License-Identifier: GPL-2.0 216b343e8SAnson Huang /* 316b343e8SAnson Huang * Copyright 2021 NXP 416b343e8SAnson Huang */ 516b343e8SAnson Huang 616b343e8SAnson Huang #include <linux/err.h> 716b343e8SAnson Huang #include <linux/init.h> 816b343e8SAnson Huang #include <linux/io.h> 9060f03e9SRob Herring #include <linux/mod_devicetable.h> 1016b343e8SAnson Huang #include <linux/module.h> 1116b343e8SAnson Huang #include <linux/pinctrl/pinctrl.h> 12060f03e9SRob Herring #include <linux/platform_device.h> 1316b343e8SAnson Huang 1416b343e8SAnson Huang #include "pinctrl-imx.h" 1516b343e8SAnson Huang 1616b343e8SAnson Huang enum imx8ulp_pads { 1716b343e8SAnson Huang IMX8ULP_PAD_PTD0 = 0, 1816b343e8SAnson Huang IMX8ULP_PAD_PTD1, 1916b343e8SAnson Huang IMX8ULP_PAD_PTD2, 2016b343e8SAnson Huang IMX8ULP_PAD_PTD3, 2116b343e8SAnson Huang IMX8ULP_PAD_PTD4, 2216b343e8SAnson Huang IMX8ULP_PAD_PTD5, 2316b343e8SAnson Huang IMX8ULP_PAD_PTD6, 2416b343e8SAnson Huang IMX8ULP_PAD_PTD7, 2516b343e8SAnson Huang IMX8ULP_PAD_PTD8, 2616b343e8SAnson Huang IMX8ULP_PAD_PTD9, 2716b343e8SAnson Huang IMX8ULP_PAD_PTD10, 2816b343e8SAnson Huang IMX8ULP_PAD_PTD11, 2916b343e8SAnson Huang IMX8ULP_PAD_PTD12, 3016b343e8SAnson Huang IMX8ULP_PAD_PTD13, 3116b343e8SAnson Huang IMX8ULP_PAD_PTD14, 3216b343e8SAnson Huang IMX8ULP_PAD_PTD15, 3316b343e8SAnson Huang IMX8ULP_PAD_PTD16, 3416b343e8SAnson Huang IMX8ULP_PAD_PTD17, 3516b343e8SAnson Huang IMX8ULP_PAD_PTD18, 3616b343e8SAnson Huang IMX8ULP_PAD_PTD19, 3716b343e8SAnson Huang IMX8ULP_PAD_PTD20, 3816b343e8SAnson Huang IMX8ULP_PAD_PTD21, 3916b343e8SAnson Huang IMX8ULP_PAD_PTD22, 4016b343e8SAnson Huang IMX8ULP_PAD_PTD23, 4116b343e8SAnson Huang IMX8ULP_PAD_RESERVE0, 4216b343e8SAnson Huang IMX8ULP_PAD_RESERVE1, 4316b343e8SAnson Huang IMX8ULP_PAD_RESERVE2, 4416b343e8SAnson Huang IMX8ULP_PAD_RESERVE3, 4516b343e8SAnson Huang IMX8ULP_PAD_RESERVE4, 4616b343e8SAnson Huang IMX8ULP_PAD_RESERVE5, 4716b343e8SAnson Huang IMX8ULP_PAD_RESERVE6, 4816b343e8SAnson Huang IMX8ULP_PAD_RESERVE7, 4916b343e8SAnson Huang IMX8ULP_PAD_PTE0, 5016b343e8SAnson Huang IMX8ULP_PAD_PTE1, 5116b343e8SAnson Huang IMX8ULP_PAD_PTE2, 5216b343e8SAnson Huang IMX8ULP_PAD_PTE3, 5316b343e8SAnson Huang IMX8ULP_PAD_PTE4, 5416b343e8SAnson Huang IMX8ULP_PAD_PTE5, 5516b343e8SAnson Huang IMX8ULP_PAD_PTE6, 5616b343e8SAnson Huang IMX8ULP_PAD_PTE7, 5716b343e8SAnson Huang IMX8ULP_PAD_PTE8, 5816b343e8SAnson Huang IMX8ULP_PAD_PTE9, 5916b343e8SAnson Huang IMX8ULP_PAD_PTE10, 6016b343e8SAnson Huang IMX8ULP_PAD_PTE11, 6116b343e8SAnson Huang IMX8ULP_PAD_PTE12, 6216b343e8SAnson Huang IMX8ULP_PAD_PTE13, 6316b343e8SAnson Huang IMX8ULP_PAD_PTE14, 6416b343e8SAnson Huang IMX8ULP_PAD_PTE15, 6516b343e8SAnson Huang IMX8ULP_PAD_PTE16, 6616b343e8SAnson Huang IMX8ULP_PAD_PTE17, 6716b343e8SAnson Huang IMX8ULP_PAD_PTE18, 6816b343e8SAnson Huang IMX8ULP_PAD_PTE19, 6916b343e8SAnson Huang IMX8ULP_PAD_PTE20, 7016b343e8SAnson Huang IMX8ULP_PAD_PTE21, 7116b343e8SAnson Huang IMX8ULP_PAD_PTE22, 7216b343e8SAnson Huang IMX8ULP_PAD_PTE23, 7316b343e8SAnson Huang IMX8ULP_PAD_RESERVE8, 7416b343e8SAnson Huang IMX8ULP_PAD_RESERVE9, 7516b343e8SAnson Huang IMX8ULP_PAD_RESERVE10, 7616b343e8SAnson Huang IMX8ULP_PAD_RESERVE11, 7716b343e8SAnson Huang IMX8ULP_PAD_RESERVE12, 7816b343e8SAnson Huang IMX8ULP_PAD_RESERVE13, 7916b343e8SAnson Huang IMX8ULP_PAD_RESERVE14, 8016b343e8SAnson Huang IMX8ULP_PAD_RESERVE15, 8116b343e8SAnson Huang IMX8ULP_PAD_PTF0, 8216b343e8SAnson Huang IMX8ULP_PAD_PTF1, 8316b343e8SAnson Huang IMX8ULP_PAD_PTF2, 8416b343e8SAnson Huang IMX8ULP_PAD_PTF3, 8516b343e8SAnson Huang IMX8ULP_PAD_PTF4, 8616b343e8SAnson Huang IMX8ULP_PAD_PTF5, 8716b343e8SAnson Huang IMX8ULP_PAD_PTF6, 8816b343e8SAnson Huang IMX8ULP_PAD_PTF7, 8916b343e8SAnson Huang IMX8ULP_PAD_PTF8, 9016b343e8SAnson Huang IMX8ULP_PAD_PTF9, 9116b343e8SAnson Huang IMX8ULP_PAD_PTF10, 9216b343e8SAnson Huang IMX8ULP_PAD_PTF11, 9316b343e8SAnson Huang IMX8ULP_PAD_PTF12, 9416b343e8SAnson Huang IMX8ULP_PAD_PTF13, 9516b343e8SAnson Huang IMX8ULP_PAD_PTF14, 9616b343e8SAnson Huang IMX8ULP_PAD_PTF15, 9716b343e8SAnson Huang IMX8ULP_PAD_PTF16, 9816b343e8SAnson Huang IMX8ULP_PAD_PTF17, 9916b343e8SAnson Huang IMX8ULP_PAD_PTF18, 10016b343e8SAnson Huang IMX8ULP_PAD_PTF19, 10116b343e8SAnson Huang IMX8ULP_PAD_PTF20, 10216b343e8SAnson Huang IMX8ULP_PAD_PTF21, 10316b343e8SAnson Huang IMX8ULP_PAD_PTF22, 10416b343e8SAnson Huang IMX8ULP_PAD_PTF23, 10516b343e8SAnson Huang IMX8ULP_PAD_PTF24, 10616b343e8SAnson Huang IMX8ULP_PAD_PTF25, 10716b343e8SAnson Huang IMX8ULP_PAD_PTF26, 10816b343e8SAnson Huang IMX8ULP_PAD_PTF27, 10916b343e8SAnson Huang IMX8ULP_PAD_PTF28, 11016b343e8SAnson Huang IMX8ULP_PAD_PTF29, 11116b343e8SAnson Huang IMX8ULP_PAD_PTF30, 11216b343e8SAnson Huang IMX8ULP_PAD_PTF31, 11316b343e8SAnson Huang }; 11416b343e8SAnson Huang 11516b343e8SAnson Huang /* Pad names for the pinmux subsystem */ 11616b343e8SAnson Huang static const struct pinctrl_pin_desc imx8ulp_pinctrl_pads[] = { 11716b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_PTD0), 11816b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_PTD1), 11916b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_PTD2), 12016b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_PTD3), 12116b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_PTD4), 12216b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_PTD5), 12316b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_PTD6), 12416b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_PTD7), 12516b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_PTD8), 12616b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_PTD9), 12716b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_PTD10), 12816b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_PTD11), 12916b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_PTD12), 13016b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_PTD13), 13116b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_PTD14), 13216b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_PTD15), 13316b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_PTD16), 13416b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_PTD17), 13516b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_PTD18), 13616b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_PTD19), 13716b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_PTD20), 13816b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_PTD21), 13916b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_PTD22), 14016b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_PTD23), 14116b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_RESERVE0), 14216b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_RESERVE1), 14316b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_RESERVE2), 14416b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_RESERVE3), 14516b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_RESERVE4), 14616b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_RESERVE5), 14716b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_RESERVE6), 14816b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_RESERVE7), 14916b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_PTE0), 15016b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_PTE1), 15116b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_PTE2), 15216b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_PTE3), 15316b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_PTE4), 15416b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_PTE5), 15516b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_PTE6), 15616b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_PTE7), 15716b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_PTE8), 15816b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_PTE9), 15916b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_PTE10), 16016b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_PTE11), 16116b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_PTE12), 16216b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_PTE13), 16316b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_PTE14), 16416b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_PTE15), 16516b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_PTE16), 16616b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_PTE17), 16716b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_PTE18), 16816b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_PTE19), 16916b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_PTE20), 17016b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_PTE21), 17116b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_PTE22), 17216b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_PTE23), 17316b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_RESERVE8), 17416b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_RESERVE9), 17516b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_RESERVE10), 17616b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_RESERVE11), 17716b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_RESERVE12), 17816b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_RESERVE13), 17916b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_RESERVE14), 18016b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_RESERVE15), 18116b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_PTF0), 18216b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_PTF1), 18316b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_PTF2), 18416b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_PTF3), 18516b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_PTF4), 18616b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_PTF5), 18716b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_PTF6), 18816b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_PTF7), 18916b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_PTF8), 19016b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_PTF9), 19116b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_PTF10), 19216b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_PTF11), 19316b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_PTF12), 19416b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_PTF13), 19516b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_PTF14), 19616b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_PTF15), 19716b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_PTF16), 19816b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_PTF17), 19916b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_PTF18), 20016b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_PTF19), 20116b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_PTF20), 20216b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_PTF21), 20316b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_PTF22), 20416b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_PTF23), 20516b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_PTF24), 20616b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_PTF25), 20716b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_PTF26), 20816b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_PTF27), 20916b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_PTF28), 21016b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_PTF29), 21116b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_PTF30), 21216b343e8SAnson Huang IMX_PINCTRL_PIN(IMX8ULP_PAD_PTF31), 21316b343e8SAnson Huang }; 21416b343e8SAnson Huang 21516b343e8SAnson Huang #define BM_OBE_ENABLED BIT(17) 21616b343e8SAnson Huang #define BM_IBE_ENABLED BIT(16) 21716b343e8SAnson Huang #define BM_MUX_MODE 0xf00 21816b343e8SAnson Huang #define BP_MUX_MODE 8 21916b343e8SAnson Huang 22016b343e8SAnson Huang static int imx8ulp_pmx_gpio_set_direction(struct pinctrl_dev *pctldev, 22116b343e8SAnson Huang struct pinctrl_gpio_range *range, 22216b343e8SAnson Huang unsigned offset, bool input) 22316b343e8SAnson Huang { 22416b343e8SAnson Huang struct imx_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev); 22516b343e8SAnson Huang const struct imx_pin_reg *pin_reg; 22616b343e8SAnson Huang u32 reg; 22716b343e8SAnson Huang 228af0ca06fSFabio Estevam pin_reg = &ipctl->pin_regs[offset]; 229af0ca06fSFabio Estevam if (pin_reg->mux_reg == -1) 230af0ca06fSFabio Estevam return -EINVAL; 231af0ca06fSFabio Estevam 23216b343e8SAnson Huang reg = readl(ipctl->base + pin_reg->mux_reg); 23316b343e8SAnson Huang if (input) 23416b343e8SAnson Huang reg = (reg & ~BM_OBE_ENABLED) | BM_IBE_ENABLED; 23516b343e8SAnson Huang else 23616b343e8SAnson Huang reg = (reg & ~BM_IBE_ENABLED) | BM_OBE_ENABLED; 23716b343e8SAnson Huang writel(reg, ipctl->base + pin_reg->mux_reg); 23816b343e8SAnson Huang 23916b343e8SAnson Huang return 0; 24016b343e8SAnson Huang } 24116b343e8SAnson Huang 24216b343e8SAnson Huang static const struct imx_pinctrl_soc_info imx8ulp_pinctrl_info = { 24316b343e8SAnson Huang .pins = imx8ulp_pinctrl_pads, 24416b343e8SAnson Huang .npins = ARRAY_SIZE(imx8ulp_pinctrl_pads), 24516b343e8SAnson Huang .flags = ZERO_OFFSET_VALID | SHARE_MUX_CONF_REG, 24616b343e8SAnson Huang .gpio_set_direction = imx8ulp_pmx_gpio_set_direction, 24716b343e8SAnson Huang .mux_mask = BM_MUX_MODE, 24816b343e8SAnson Huang .mux_shift = BP_MUX_MODE, 24916b343e8SAnson Huang }; 25016b343e8SAnson Huang 25116b343e8SAnson Huang static const struct of_device_id imx8ulp_pinctrl_of_match[] = { 25216b343e8SAnson Huang { .compatible = "fsl,imx8ulp-iomuxc1", }, 25316b343e8SAnson Huang { /* sentinel */ } 25416b343e8SAnson Huang }; 255*a310822fSKrzysztof Kozlowski MODULE_DEVICE_TABLE(of, imx8ulp_pinctrl_of_match); 25616b343e8SAnson Huang 25716b343e8SAnson Huang static int imx8ulp_pinctrl_probe(struct platform_device *pdev) 25816b343e8SAnson Huang { 25916b343e8SAnson Huang return imx_pinctrl_probe(pdev, &imx8ulp_pinctrl_info); 26016b343e8SAnson Huang } 26116b343e8SAnson Huang 26216b343e8SAnson Huang static struct platform_driver imx8ulp_pinctrl_driver = { 26316b343e8SAnson Huang .driver = { 26416b343e8SAnson Huang .name = "imx8ulp-pinctrl", 26516b343e8SAnson Huang .of_match_table = imx8ulp_pinctrl_of_match, 26616b343e8SAnson Huang .suppress_bind_attrs = true, 26716b343e8SAnson Huang }, 26816b343e8SAnson Huang .probe = imx8ulp_pinctrl_probe, 26916b343e8SAnson Huang }; 27016b343e8SAnson Huang 27116b343e8SAnson Huang static int __init imx8ulp_pinctrl_init(void) 27216b343e8SAnson Huang { 27316b343e8SAnson Huang return platform_driver_register(&imx8ulp_pinctrl_driver); 27416b343e8SAnson Huang } 27516b343e8SAnson Huang arch_initcall(imx8ulp_pinctrl_init); 27616b343e8SAnson Huang 27716b343e8SAnson Huang MODULE_AUTHOR("Jacky Bai <ping.bai@nxp.com>"); 27816b343e8SAnson Huang MODULE_DESCRIPTION("NXP i.MX8ULP pinctrl driver"); 27916b343e8SAnson Huang MODULE_LICENSE("GPL v2"); 280