0001
0002
0003
0004
0005
0006
0007
0008 #include <linux/err.h>
0009 #include <linux/init.h>
0010 #include <linux/io.h>
0011 #include <linux/module.h>
0012 #include <linux/of.h>
0013 #include <linux/of_device.h>
0014 #include <linux/pinctrl/pinctrl.h>
0015
0016 #include "pinctrl-imx.h"
0017
0018 enum imx7ulp_pads {
0019 IMX7ULP_PAD_PTC0 = 0,
0020 IMX7ULP_PAD_PTC1,
0021 IMX7ULP_PAD_PTC2,
0022 IMX7ULP_PAD_PTC3,
0023 IMX7ULP_PAD_PTC4,
0024 IMX7ULP_PAD_PTC5,
0025 IMX7ULP_PAD_PTC6,
0026 IMX7ULP_PAD_PTC7,
0027 IMX7ULP_PAD_PTC8,
0028 IMX7ULP_PAD_PTC9,
0029 IMX7ULP_PAD_PTC10,
0030 IMX7ULP_PAD_PTC11,
0031 IMX7ULP_PAD_PTC12,
0032 IMX7ULP_PAD_PTC13,
0033 IMX7ULP_PAD_PTC14,
0034 IMX7ULP_PAD_PTC15,
0035 IMX7ULP_PAD_PTC16,
0036 IMX7ULP_PAD_PTC17,
0037 IMX7ULP_PAD_PTC18,
0038 IMX7ULP_PAD_PTC19,
0039 IMX7ULP_PAD_RESERVE0,
0040 IMX7ULP_PAD_RESERVE1,
0041 IMX7ULP_PAD_RESERVE2,
0042 IMX7ULP_PAD_RESERVE3,
0043 IMX7ULP_PAD_RESERVE4,
0044 IMX7ULP_PAD_RESERVE5,
0045 IMX7ULP_PAD_RESERVE6,
0046 IMX7ULP_PAD_RESERVE7,
0047 IMX7ULP_PAD_RESERVE8,
0048 IMX7ULP_PAD_RESERVE9,
0049 IMX7ULP_PAD_RESERVE10,
0050 IMX7ULP_PAD_RESERVE11,
0051 IMX7ULP_PAD_PTD0,
0052 IMX7ULP_PAD_PTD1,
0053 IMX7ULP_PAD_PTD2,
0054 IMX7ULP_PAD_PTD3,
0055 IMX7ULP_PAD_PTD4,
0056 IMX7ULP_PAD_PTD5,
0057 IMX7ULP_PAD_PTD6,
0058 IMX7ULP_PAD_PTD7,
0059 IMX7ULP_PAD_PTD8,
0060 IMX7ULP_PAD_PTD9,
0061 IMX7ULP_PAD_PTD10,
0062 IMX7ULP_PAD_PTD11,
0063 IMX7ULP_PAD_RESERVE12,
0064 IMX7ULP_PAD_RESERVE13,
0065 IMX7ULP_PAD_RESERVE14,
0066 IMX7ULP_PAD_RESERVE15,
0067 IMX7ULP_PAD_RESERVE16,
0068 IMX7ULP_PAD_RESERVE17,
0069 IMX7ULP_PAD_RESERVE18,
0070 IMX7ULP_PAD_RESERVE19,
0071 IMX7ULP_PAD_RESERVE20,
0072 IMX7ULP_PAD_RESERVE21,
0073 IMX7ULP_PAD_RESERVE22,
0074 IMX7ULP_PAD_RESERVE23,
0075 IMX7ULP_PAD_RESERVE24,
0076 IMX7ULP_PAD_RESERVE25,
0077 IMX7ULP_PAD_RESERVE26,
0078 IMX7ULP_PAD_RESERVE27,
0079 IMX7ULP_PAD_RESERVE28,
0080 IMX7ULP_PAD_RESERVE29,
0081 IMX7ULP_PAD_RESERVE30,
0082 IMX7ULP_PAD_RESERVE31,
0083 IMX7ULP_PAD_PTE0,
0084 IMX7ULP_PAD_PTE1,
0085 IMX7ULP_PAD_PTE2,
0086 IMX7ULP_PAD_PTE3,
0087 IMX7ULP_PAD_PTE4,
0088 IMX7ULP_PAD_PTE5,
0089 IMX7ULP_PAD_PTE6,
0090 IMX7ULP_PAD_PTE7,
0091 IMX7ULP_PAD_PTE8,
0092 IMX7ULP_PAD_PTE9,
0093 IMX7ULP_PAD_PTE10,
0094 IMX7ULP_PAD_PTE11,
0095 IMX7ULP_PAD_PTE12,
0096 IMX7ULP_PAD_PTE13,
0097 IMX7ULP_PAD_PTE14,
0098 IMX7ULP_PAD_PTE15,
0099 IMX7ULP_PAD_RESERVE32,
0100 IMX7ULP_PAD_RESERVE33,
0101 IMX7ULP_PAD_RESERVE34,
0102 IMX7ULP_PAD_RESERVE35,
0103 IMX7ULP_PAD_RESERVE36,
0104 IMX7ULP_PAD_RESERVE37,
0105 IMX7ULP_PAD_RESERVE38,
0106 IMX7ULP_PAD_RESERVE39,
0107 IMX7ULP_PAD_RESERVE40,
0108 IMX7ULP_PAD_RESERVE41,
0109 IMX7ULP_PAD_RESERVE42,
0110 IMX7ULP_PAD_RESERVE43,
0111 IMX7ULP_PAD_RESERVE44,
0112 IMX7ULP_PAD_RESERVE45,
0113 IMX7ULP_PAD_RESERVE46,
0114 IMX7ULP_PAD_RESERVE47,
0115 IMX7ULP_PAD_PTF0,
0116 IMX7ULP_PAD_PTF1,
0117 IMX7ULP_PAD_PTF2,
0118 IMX7ULP_PAD_PTF3,
0119 IMX7ULP_PAD_PTF4,
0120 IMX7ULP_PAD_PTF5,
0121 IMX7ULP_PAD_PTF6,
0122 IMX7ULP_PAD_PTF7,
0123 IMX7ULP_PAD_PTF8,
0124 IMX7ULP_PAD_PTF9,
0125 IMX7ULP_PAD_PTF10,
0126 IMX7ULP_PAD_PTF11,
0127 IMX7ULP_PAD_PTF12,
0128 IMX7ULP_PAD_PTF13,
0129 IMX7ULP_PAD_PTF14,
0130 IMX7ULP_PAD_PTF15,
0131 IMX7ULP_PAD_PTF16,
0132 IMX7ULP_PAD_PTF17,
0133 IMX7ULP_PAD_PTF18,
0134 IMX7ULP_PAD_PTF19,
0135 };
0136
0137
0138 static const struct pinctrl_pin_desc imx7ulp_pinctrl_pads[] = {
0139 IMX_PINCTRL_PIN(IMX7ULP_PAD_PTC0),
0140 IMX_PINCTRL_PIN(IMX7ULP_PAD_PTC1),
0141 IMX_PINCTRL_PIN(IMX7ULP_PAD_PTC2),
0142 IMX_PINCTRL_PIN(IMX7ULP_PAD_PTC3),
0143 IMX_PINCTRL_PIN(IMX7ULP_PAD_PTC4),
0144 IMX_PINCTRL_PIN(IMX7ULP_PAD_PTC5),
0145 IMX_PINCTRL_PIN(IMX7ULP_PAD_PTC6),
0146 IMX_PINCTRL_PIN(IMX7ULP_PAD_PTC7),
0147 IMX_PINCTRL_PIN(IMX7ULP_PAD_PTC8),
0148 IMX_PINCTRL_PIN(IMX7ULP_PAD_PTC9),
0149 IMX_PINCTRL_PIN(IMX7ULP_PAD_PTC10),
0150 IMX_PINCTRL_PIN(IMX7ULP_PAD_PTC11),
0151 IMX_PINCTRL_PIN(IMX7ULP_PAD_PTC12),
0152 IMX_PINCTRL_PIN(IMX7ULP_PAD_PTC13),
0153 IMX_PINCTRL_PIN(IMX7ULP_PAD_PTC14),
0154 IMX_PINCTRL_PIN(IMX7ULP_PAD_PTC15),
0155 IMX_PINCTRL_PIN(IMX7ULP_PAD_PTC16),
0156 IMX_PINCTRL_PIN(IMX7ULP_PAD_PTC17),
0157 IMX_PINCTRL_PIN(IMX7ULP_PAD_PTC18),
0158 IMX_PINCTRL_PIN(IMX7ULP_PAD_PTC19),
0159 IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE0),
0160 IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE1),
0161 IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE2),
0162 IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE3),
0163 IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE4),
0164 IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE5),
0165 IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE6),
0166 IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE7),
0167 IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE8),
0168 IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE9),
0169 IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE10),
0170 IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE11),
0171 IMX_PINCTRL_PIN(IMX7ULP_PAD_PTD0),
0172 IMX_PINCTRL_PIN(IMX7ULP_PAD_PTD1),
0173 IMX_PINCTRL_PIN(IMX7ULP_PAD_PTD2),
0174 IMX_PINCTRL_PIN(IMX7ULP_PAD_PTD3),
0175 IMX_PINCTRL_PIN(IMX7ULP_PAD_PTD4),
0176 IMX_PINCTRL_PIN(IMX7ULP_PAD_PTD5),
0177 IMX_PINCTRL_PIN(IMX7ULP_PAD_PTD6),
0178 IMX_PINCTRL_PIN(IMX7ULP_PAD_PTD7),
0179 IMX_PINCTRL_PIN(IMX7ULP_PAD_PTD8),
0180 IMX_PINCTRL_PIN(IMX7ULP_PAD_PTD9),
0181 IMX_PINCTRL_PIN(IMX7ULP_PAD_PTD10),
0182 IMX_PINCTRL_PIN(IMX7ULP_PAD_PTD11),
0183 IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE12),
0184 IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE13),
0185 IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE14),
0186 IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE15),
0187 IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE16),
0188 IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE17),
0189 IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE18),
0190 IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE19),
0191 IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE20),
0192 IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE21),
0193 IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE22),
0194 IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE23),
0195 IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE24),
0196 IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE25),
0197 IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE26),
0198 IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE27),
0199 IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE28),
0200 IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE29),
0201 IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE30),
0202 IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE31),
0203 IMX_PINCTRL_PIN(IMX7ULP_PAD_PTE0),
0204 IMX_PINCTRL_PIN(IMX7ULP_PAD_PTE1),
0205 IMX_PINCTRL_PIN(IMX7ULP_PAD_PTE2),
0206 IMX_PINCTRL_PIN(IMX7ULP_PAD_PTE3),
0207 IMX_PINCTRL_PIN(IMX7ULP_PAD_PTE4),
0208 IMX_PINCTRL_PIN(IMX7ULP_PAD_PTE5),
0209 IMX_PINCTRL_PIN(IMX7ULP_PAD_PTE6),
0210 IMX_PINCTRL_PIN(IMX7ULP_PAD_PTE7),
0211 IMX_PINCTRL_PIN(IMX7ULP_PAD_PTE8),
0212 IMX_PINCTRL_PIN(IMX7ULP_PAD_PTE9),
0213 IMX_PINCTRL_PIN(IMX7ULP_PAD_PTE10),
0214 IMX_PINCTRL_PIN(IMX7ULP_PAD_PTE11),
0215 IMX_PINCTRL_PIN(IMX7ULP_PAD_PTE12),
0216 IMX_PINCTRL_PIN(IMX7ULP_PAD_PTE13),
0217 IMX_PINCTRL_PIN(IMX7ULP_PAD_PTE14),
0218 IMX_PINCTRL_PIN(IMX7ULP_PAD_PTE15),
0219 IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE32),
0220 IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE33),
0221 IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE34),
0222 IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE35),
0223 IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE36),
0224 IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE37),
0225 IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE38),
0226 IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE39),
0227 IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE40),
0228 IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE41),
0229 IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE42),
0230 IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE43),
0231 IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE44),
0232 IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE45),
0233 IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE46),
0234 IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE47),
0235 IMX_PINCTRL_PIN(IMX7ULP_PAD_PTF0),
0236 IMX_PINCTRL_PIN(IMX7ULP_PAD_PTF1),
0237 IMX_PINCTRL_PIN(IMX7ULP_PAD_PTF2),
0238 IMX_PINCTRL_PIN(IMX7ULP_PAD_PTF3),
0239 IMX_PINCTRL_PIN(IMX7ULP_PAD_PTF4),
0240 IMX_PINCTRL_PIN(IMX7ULP_PAD_PTF5),
0241 IMX_PINCTRL_PIN(IMX7ULP_PAD_PTF6),
0242 IMX_PINCTRL_PIN(IMX7ULP_PAD_PTF7),
0243 IMX_PINCTRL_PIN(IMX7ULP_PAD_PTF8),
0244 IMX_PINCTRL_PIN(IMX7ULP_PAD_PTF9),
0245 IMX_PINCTRL_PIN(IMX7ULP_PAD_PTF10),
0246 IMX_PINCTRL_PIN(IMX7ULP_PAD_PTF11),
0247 IMX_PINCTRL_PIN(IMX7ULP_PAD_PTF12),
0248 IMX_PINCTRL_PIN(IMX7ULP_PAD_PTF13),
0249 IMX_PINCTRL_PIN(IMX7ULP_PAD_PTF14),
0250 IMX_PINCTRL_PIN(IMX7ULP_PAD_PTF15),
0251 IMX_PINCTRL_PIN(IMX7ULP_PAD_PTF16),
0252 IMX_PINCTRL_PIN(IMX7ULP_PAD_PTF17),
0253 IMX_PINCTRL_PIN(IMX7ULP_PAD_PTF18),
0254 IMX_PINCTRL_PIN(IMX7ULP_PAD_PTF19),
0255 };
0256
0257 #define BM_OBE_ENABLED BIT(17)
0258 #define BM_IBE_ENABLED BIT(16)
0259 #define BM_MUX_MODE 0xf00
0260 #define BP_MUX_MODE 8
0261
0262 static int imx7ulp_pmx_gpio_set_direction(struct pinctrl_dev *pctldev,
0263 struct pinctrl_gpio_range *range,
0264 unsigned offset, bool input)
0265 {
0266 struct imx_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev);
0267 const struct imx_pin_reg *pin_reg;
0268 u32 reg;
0269
0270 pin_reg = &ipctl->pin_regs[offset];
0271 if (pin_reg->mux_reg == -1)
0272 return -EINVAL;
0273
0274 reg = readl(ipctl->base + pin_reg->mux_reg);
0275 if (input)
0276 reg = (reg & ~BM_OBE_ENABLED) | BM_IBE_ENABLED;
0277 else
0278 reg = (reg & ~BM_IBE_ENABLED) | BM_OBE_ENABLED;
0279 writel(reg, ipctl->base + pin_reg->mux_reg);
0280
0281 return 0;
0282 }
0283
0284 static const struct imx_pinctrl_soc_info imx7ulp_pinctrl_info = {
0285 .pins = imx7ulp_pinctrl_pads,
0286 .npins = ARRAY_SIZE(imx7ulp_pinctrl_pads),
0287 .flags = ZERO_OFFSET_VALID | SHARE_MUX_CONF_REG,
0288 .gpio_set_direction = imx7ulp_pmx_gpio_set_direction,
0289 .mux_mask = BM_MUX_MODE,
0290 .mux_shift = BP_MUX_MODE,
0291 };
0292
0293 static const struct of_device_id imx7ulp_pinctrl_of_match[] = {
0294 { .compatible = "fsl,imx7ulp-iomuxc1", },
0295 { }
0296 };
0297
0298 static int imx7ulp_pinctrl_probe(struct platform_device *pdev)
0299 {
0300 return imx_pinctrl_probe(pdev, &imx7ulp_pinctrl_info);
0301 }
0302
0303 static struct platform_driver imx7ulp_pinctrl_driver = {
0304 .driver = {
0305 .name = "imx7ulp-pinctrl",
0306 .of_match_table = imx7ulp_pinctrl_of_match,
0307 .suppress_bind_attrs = true,
0308 },
0309 .probe = imx7ulp_pinctrl_probe,
0310 };
0311
0312 static int __init imx7ulp_pinctrl_init(void)
0313 {
0314 return platform_driver_register(&imx7ulp_pinctrl_driver);
0315 }
0316 arch_initcall(imx7ulp_pinctrl_init);