0001
0002
0003
0004
0005
0006
0007 #include <linux/err.h>
0008 #include <linux/init.h>
0009 #include <linux/io.h>
0010 #include <linux/of.h>
0011 #include <linux/of_device.h>
0012 #include <linux/pinctrl/pinctrl.h>
0013
0014 #include "pinctrl-imx.h"
0015
0016 enum vf610_pads {
0017 VF610_PAD_PTA6 = 0,
0018 VF610_PAD_PTA8 = 1,
0019 VF610_PAD_PTA9 = 2,
0020 VF610_PAD_PTA10 = 3,
0021 VF610_PAD_PTA11 = 4,
0022 VF610_PAD_PTA12 = 5,
0023 VF610_PAD_PTA16 = 6,
0024 VF610_PAD_PTA17 = 7,
0025 VF610_PAD_PTA18 = 8,
0026 VF610_PAD_PTA19 = 9,
0027 VF610_PAD_PTA20 = 10,
0028 VF610_PAD_PTA21 = 11,
0029 VF610_PAD_PTA22 = 12,
0030 VF610_PAD_PTA23 = 13,
0031 VF610_PAD_PTA24 = 14,
0032 VF610_PAD_PTA25 = 15,
0033 VF610_PAD_PTA26 = 16,
0034 VF610_PAD_PTA27 = 17,
0035 VF610_PAD_PTA28 = 18,
0036 VF610_PAD_PTA29 = 19,
0037 VF610_PAD_PTA30 = 20,
0038 VF610_PAD_PTA31 = 21,
0039 VF610_PAD_PTB0 = 22,
0040 VF610_PAD_PTB1 = 23,
0041 VF610_PAD_PTB2 = 24,
0042 VF610_PAD_PTB3 = 25,
0043 VF610_PAD_PTB4 = 26,
0044 VF610_PAD_PTB5 = 27,
0045 VF610_PAD_PTB6 = 28,
0046 VF610_PAD_PTB7 = 29,
0047 VF610_PAD_PTB8 = 30,
0048 VF610_PAD_PTB9 = 31,
0049 VF610_PAD_PTB10 = 32,
0050 VF610_PAD_PTB11 = 33,
0051 VF610_PAD_PTB12 = 34,
0052 VF610_PAD_PTB13 = 35,
0053 VF610_PAD_PTB14 = 36,
0054 VF610_PAD_PTB15 = 37,
0055 VF610_PAD_PTB16 = 38,
0056 VF610_PAD_PTB17 = 39,
0057 VF610_PAD_PTB18 = 40,
0058 VF610_PAD_PTB19 = 41,
0059 VF610_PAD_PTB20 = 42,
0060 VF610_PAD_PTB21 = 43,
0061 VF610_PAD_PTB22 = 44,
0062 VF610_PAD_PTC0 = 45,
0063 VF610_PAD_PTC1 = 46,
0064 VF610_PAD_PTC2 = 47,
0065 VF610_PAD_PTC3 = 48,
0066 VF610_PAD_PTC4 = 49,
0067 VF610_PAD_PTC5 = 50,
0068 VF610_PAD_PTC6 = 51,
0069 VF610_PAD_PTC7 = 52,
0070 VF610_PAD_PTC8 = 53,
0071 VF610_PAD_PTC9 = 54,
0072 VF610_PAD_PTC10 = 55,
0073 VF610_PAD_PTC11 = 56,
0074 VF610_PAD_PTC12 = 57,
0075 VF610_PAD_PTC13 = 58,
0076 VF610_PAD_PTC14 = 59,
0077 VF610_PAD_PTC15 = 60,
0078 VF610_PAD_PTC16 = 61,
0079 VF610_PAD_PTC17 = 62,
0080 VF610_PAD_PTD31 = 63,
0081 VF610_PAD_PTD30 = 64,
0082 VF610_PAD_PTD29 = 65,
0083 VF610_PAD_PTD28 = 66,
0084 VF610_PAD_PTD27 = 67,
0085 VF610_PAD_PTD26 = 68,
0086 VF610_PAD_PTD25 = 69,
0087 VF610_PAD_PTD24 = 70,
0088 VF610_PAD_PTD23 = 71,
0089 VF610_PAD_PTD22 = 72,
0090 VF610_PAD_PTD21 = 73,
0091 VF610_PAD_PTD20 = 74,
0092 VF610_PAD_PTD19 = 75,
0093 VF610_PAD_PTD18 = 76,
0094 VF610_PAD_PTD17 = 77,
0095 VF610_PAD_PTD16 = 78,
0096 VF610_PAD_PTD0 = 79,
0097 VF610_PAD_PTD1 = 80,
0098 VF610_PAD_PTD2 = 81,
0099 VF610_PAD_PTD3 = 82,
0100 VF610_PAD_PTD4 = 83,
0101 VF610_PAD_PTD5 = 84,
0102 VF610_PAD_PTD6 = 85,
0103 VF610_PAD_PTD7 = 86,
0104 VF610_PAD_PTD8 = 87,
0105 VF610_PAD_PTD9 = 88,
0106 VF610_PAD_PTD10 = 89,
0107 VF610_PAD_PTD11 = 90,
0108 VF610_PAD_PTD12 = 91,
0109 VF610_PAD_PTD13 = 92,
0110 VF610_PAD_PTB23 = 93,
0111 VF610_PAD_PTB24 = 94,
0112 VF610_PAD_PTB25 = 95,
0113 VF610_PAD_PTB26 = 96,
0114 VF610_PAD_PTB27 = 97,
0115 VF610_PAD_PTB28 = 98,
0116 VF610_PAD_PTC26 = 99,
0117 VF610_PAD_PTC27 = 100,
0118 VF610_PAD_PTC28 = 101,
0119 VF610_PAD_PTC29 = 102,
0120 VF610_PAD_PTC30 = 103,
0121 VF610_PAD_PTC31 = 104,
0122 VF610_PAD_PTE0 = 105,
0123 VF610_PAD_PTE1 = 106,
0124 VF610_PAD_PTE2 = 107,
0125 VF610_PAD_PTE3 = 108,
0126 VF610_PAD_PTE4 = 109,
0127 VF610_PAD_PTE5 = 110,
0128 VF610_PAD_PTE6 = 111,
0129 VF610_PAD_PTE7 = 112,
0130 VF610_PAD_PTE8 = 113,
0131 VF610_PAD_PTE9 = 114,
0132 VF610_PAD_PTE10 = 115,
0133 VF610_PAD_PTE11 = 116,
0134 VF610_PAD_PTE12 = 117,
0135 VF610_PAD_PTE13 = 118,
0136 VF610_PAD_PTE14 = 119,
0137 VF610_PAD_PTE15 = 120,
0138 VF610_PAD_PTE16 = 121,
0139 VF610_PAD_PTE17 = 122,
0140 VF610_PAD_PTE18 = 123,
0141 VF610_PAD_PTE19 = 124,
0142 VF610_PAD_PTE20 = 125,
0143 VF610_PAD_PTE21 = 126,
0144 VF610_PAD_PTE22 = 127,
0145 VF610_PAD_PTE23 = 128,
0146 VF610_PAD_PTE24 = 129,
0147 VF610_PAD_PTE25 = 130,
0148 VF610_PAD_PTE26 = 131,
0149 VF610_PAD_PTE27 = 132,
0150 VF610_PAD_PTE28 = 133,
0151 VF610_PAD_PTA7 = 134,
0152 };
0153
0154
0155 static const struct pinctrl_pin_desc vf610_pinctrl_pads[] = {
0156 IMX_PINCTRL_PIN(VF610_PAD_PTA6),
0157 IMX_PINCTRL_PIN(VF610_PAD_PTA8),
0158 IMX_PINCTRL_PIN(VF610_PAD_PTA9),
0159 IMX_PINCTRL_PIN(VF610_PAD_PTA10),
0160 IMX_PINCTRL_PIN(VF610_PAD_PTA11),
0161 IMX_PINCTRL_PIN(VF610_PAD_PTA12),
0162 IMX_PINCTRL_PIN(VF610_PAD_PTA16),
0163 IMX_PINCTRL_PIN(VF610_PAD_PTA17),
0164 IMX_PINCTRL_PIN(VF610_PAD_PTA18),
0165 IMX_PINCTRL_PIN(VF610_PAD_PTA19),
0166 IMX_PINCTRL_PIN(VF610_PAD_PTA20),
0167 IMX_PINCTRL_PIN(VF610_PAD_PTA21),
0168 IMX_PINCTRL_PIN(VF610_PAD_PTA22),
0169 IMX_PINCTRL_PIN(VF610_PAD_PTA23),
0170 IMX_PINCTRL_PIN(VF610_PAD_PTA24),
0171 IMX_PINCTRL_PIN(VF610_PAD_PTA25),
0172 IMX_PINCTRL_PIN(VF610_PAD_PTA26),
0173 IMX_PINCTRL_PIN(VF610_PAD_PTA27),
0174 IMX_PINCTRL_PIN(VF610_PAD_PTA28),
0175 IMX_PINCTRL_PIN(VF610_PAD_PTA29),
0176 IMX_PINCTRL_PIN(VF610_PAD_PTA30),
0177 IMX_PINCTRL_PIN(VF610_PAD_PTA31),
0178 IMX_PINCTRL_PIN(VF610_PAD_PTB0),
0179 IMX_PINCTRL_PIN(VF610_PAD_PTB1),
0180 IMX_PINCTRL_PIN(VF610_PAD_PTB2),
0181 IMX_PINCTRL_PIN(VF610_PAD_PTB3),
0182 IMX_PINCTRL_PIN(VF610_PAD_PTB4),
0183 IMX_PINCTRL_PIN(VF610_PAD_PTB5),
0184 IMX_PINCTRL_PIN(VF610_PAD_PTB6),
0185 IMX_PINCTRL_PIN(VF610_PAD_PTB7),
0186 IMX_PINCTRL_PIN(VF610_PAD_PTB8),
0187 IMX_PINCTRL_PIN(VF610_PAD_PTB9),
0188 IMX_PINCTRL_PIN(VF610_PAD_PTB10),
0189 IMX_PINCTRL_PIN(VF610_PAD_PTB11),
0190 IMX_PINCTRL_PIN(VF610_PAD_PTB12),
0191 IMX_PINCTRL_PIN(VF610_PAD_PTB13),
0192 IMX_PINCTRL_PIN(VF610_PAD_PTB14),
0193 IMX_PINCTRL_PIN(VF610_PAD_PTB15),
0194 IMX_PINCTRL_PIN(VF610_PAD_PTB16),
0195 IMX_PINCTRL_PIN(VF610_PAD_PTB17),
0196 IMX_PINCTRL_PIN(VF610_PAD_PTB18),
0197 IMX_PINCTRL_PIN(VF610_PAD_PTB19),
0198 IMX_PINCTRL_PIN(VF610_PAD_PTB20),
0199 IMX_PINCTRL_PIN(VF610_PAD_PTB21),
0200 IMX_PINCTRL_PIN(VF610_PAD_PTB22),
0201 IMX_PINCTRL_PIN(VF610_PAD_PTC0),
0202 IMX_PINCTRL_PIN(VF610_PAD_PTC1),
0203 IMX_PINCTRL_PIN(VF610_PAD_PTC2),
0204 IMX_PINCTRL_PIN(VF610_PAD_PTC3),
0205 IMX_PINCTRL_PIN(VF610_PAD_PTC4),
0206 IMX_PINCTRL_PIN(VF610_PAD_PTC5),
0207 IMX_PINCTRL_PIN(VF610_PAD_PTC6),
0208 IMX_PINCTRL_PIN(VF610_PAD_PTC7),
0209 IMX_PINCTRL_PIN(VF610_PAD_PTC8),
0210 IMX_PINCTRL_PIN(VF610_PAD_PTC9),
0211 IMX_PINCTRL_PIN(VF610_PAD_PTC10),
0212 IMX_PINCTRL_PIN(VF610_PAD_PTC11),
0213 IMX_PINCTRL_PIN(VF610_PAD_PTC12),
0214 IMX_PINCTRL_PIN(VF610_PAD_PTC13),
0215 IMX_PINCTRL_PIN(VF610_PAD_PTC14),
0216 IMX_PINCTRL_PIN(VF610_PAD_PTC15),
0217 IMX_PINCTRL_PIN(VF610_PAD_PTC16),
0218 IMX_PINCTRL_PIN(VF610_PAD_PTC17),
0219 IMX_PINCTRL_PIN(VF610_PAD_PTD31),
0220 IMX_PINCTRL_PIN(VF610_PAD_PTD30),
0221 IMX_PINCTRL_PIN(VF610_PAD_PTD29),
0222 IMX_PINCTRL_PIN(VF610_PAD_PTD28),
0223 IMX_PINCTRL_PIN(VF610_PAD_PTD27),
0224 IMX_PINCTRL_PIN(VF610_PAD_PTD26),
0225 IMX_PINCTRL_PIN(VF610_PAD_PTD25),
0226 IMX_PINCTRL_PIN(VF610_PAD_PTD24),
0227 IMX_PINCTRL_PIN(VF610_PAD_PTD23),
0228 IMX_PINCTRL_PIN(VF610_PAD_PTD22),
0229 IMX_PINCTRL_PIN(VF610_PAD_PTD21),
0230 IMX_PINCTRL_PIN(VF610_PAD_PTD20),
0231 IMX_PINCTRL_PIN(VF610_PAD_PTD19),
0232 IMX_PINCTRL_PIN(VF610_PAD_PTD18),
0233 IMX_PINCTRL_PIN(VF610_PAD_PTD17),
0234 IMX_PINCTRL_PIN(VF610_PAD_PTD16),
0235 IMX_PINCTRL_PIN(VF610_PAD_PTD0),
0236 IMX_PINCTRL_PIN(VF610_PAD_PTD1),
0237 IMX_PINCTRL_PIN(VF610_PAD_PTD2),
0238 IMX_PINCTRL_PIN(VF610_PAD_PTD3),
0239 IMX_PINCTRL_PIN(VF610_PAD_PTD4),
0240 IMX_PINCTRL_PIN(VF610_PAD_PTD5),
0241 IMX_PINCTRL_PIN(VF610_PAD_PTD6),
0242 IMX_PINCTRL_PIN(VF610_PAD_PTD7),
0243 IMX_PINCTRL_PIN(VF610_PAD_PTD8),
0244 IMX_PINCTRL_PIN(VF610_PAD_PTD9),
0245 IMX_PINCTRL_PIN(VF610_PAD_PTD10),
0246 IMX_PINCTRL_PIN(VF610_PAD_PTD11),
0247 IMX_PINCTRL_PIN(VF610_PAD_PTD12),
0248 IMX_PINCTRL_PIN(VF610_PAD_PTD13),
0249 IMX_PINCTRL_PIN(VF610_PAD_PTB23),
0250 IMX_PINCTRL_PIN(VF610_PAD_PTB24),
0251 IMX_PINCTRL_PIN(VF610_PAD_PTB25),
0252 IMX_PINCTRL_PIN(VF610_PAD_PTB26),
0253 IMX_PINCTRL_PIN(VF610_PAD_PTB27),
0254 IMX_PINCTRL_PIN(VF610_PAD_PTB28),
0255 IMX_PINCTRL_PIN(VF610_PAD_PTC26),
0256 IMX_PINCTRL_PIN(VF610_PAD_PTC27),
0257 IMX_PINCTRL_PIN(VF610_PAD_PTC28),
0258 IMX_PINCTRL_PIN(VF610_PAD_PTC29),
0259 IMX_PINCTRL_PIN(VF610_PAD_PTC30),
0260 IMX_PINCTRL_PIN(VF610_PAD_PTC31),
0261 IMX_PINCTRL_PIN(VF610_PAD_PTE0),
0262 IMX_PINCTRL_PIN(VF610_PAD_PTE1),
0263 IMX_PINCTRL_PIN(VF610_PAD_PTE2),
0264 IMX_PINCTRL_PIN(VF610_PAD_PTE3),
0265 IMX_PINCTRL_PIN(VF610_PAD_PTE4),
0266 IMX_PINCTRL_PIN(VF610_PAD_PTE5),
0267 IMX_PINCTRL_PIN(VF610_PAD_PTE6),
0268 IMX_PINCTRL_PIN(VF610_PAD_PTE7),
0269 IMX_PINCTRL_PIN(VF610_PAD_PTE8),
0270 IMX_PINCTRL_PIN(VF610_PAD_PTE9),
0271 IMX_PINCTRL_PIN(VF610_PAD_PTE10),
0272 IMX_PINCTRL_PIN(VF610_PAD_PTE11),
0273 IMX_PINCTRL_PIN(VF610_PAD_PTE12),
0274 IMX_PINCTRL_PIN(VF610_PAD_PTE13),
0275 IMX_PINCTRL_PIN(VF610_PAD_PTE14),
0276 IMX_PINCTRL_PIN(VF610_PAD_PTE15),
0277 IMX_PINCTRL_PIN(VF610_PAD_PTE16),
0278 IMX_PINCTRL_PIN(VF610_PAD_PTE17),
0279 IMX_PINCTRL_PIN(VF610_PAD_PTE18),
0280 IMX_PINCTRL_PIN(VF610_PAD_PTE19),
0281 IMX_PINCTRL_PIN(VF610_PAD_PTE20),
0282 IMX_PINCTRL_PIN(VF610_PAD_PTE21),
0283 IMX_PINCTRL_PIN(VF610_PAD_PTE22),
0284 IMX_PINCTRL_PIN(VF610_PAD_PTE23),
0285 IMX_PINCTRL_PIN(VF610_PAD_PTE24),
0286 IMX_PINCTRL_PIN(VF610_PAD_PTE25),
0287 IMX_PINCTRL_PIN(VF610_PAD_PTE26),
0288 IMX_PINCTRL_PIN(VF610_PAD_PTE27),
0289 IMX_PINCTRL_PIN(VF610_PAD_PTE28),
0290 IMX_PINCTRL_PIN(VF610_PAD_PTA7),
0291 };
0292
0293 static int vf610_pmx_gpio_set_direction(struct pinctrl_dev *pctldev,
0294 struct pinctrl_gpio_range *range,
0295 unsigned offset, bool input)
0296 {
0297 struct imx_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev);
0298 const struct imx_pin_reg *pin_reg;
0299 u32 reg;
0300
0301 pin_reg = &ipctl->pin_regs[offset];
0302 if (pin_reg->mux_reg == -1)
0303 return -EINVAL;
0304
0305
0306 reg = readl(ipctl->base + pin_reg->mux_reg);
0307 if (input)
0308 reg &= ~0x2;
0309 else
0310 reg |= 0x2;
0311 writel(reg, ipctl->base + pin_reg->mux_reg);
0312
0313 return 0;
0314 }
0315
0316 static const struct imx_pinctrl_soc_info vf610_pinctrl_info = {
0317 .pins = vf610_pinctrl_pads,
0318 .npins = ARRAY_SIZE(vf610_pinctrl_pads),
0319 .flags = SHARE_MUX_CONF_REG | ZERO_OFFSET_VALID,
0320 .gpio_set_direction = vf610_pmx_gpio_set_direction,
0321 .mux_mask = 0x700000,
0322 .mux_shift = 20,
0323 };
0324
0325 static const struct of_device_id vf610_pinctrl_of_match[] = {
0326 { .compatible = "fsl,vf610-iomuxc", },
0327 { }
0328 };
0329
0330 static int vf610_pinctrl_probe(struct platform_device *pdev)
0331 {
0332 return imx_pinctrl_probe(pdev, &vf610_pinctrl_info);
0333 }
0334
0335 static struct platform_driver vf610_pinctrl_driver = {
0336 .driver = {
0337 .name = "vf610-pinctrl",
0338 .of_match_table = vf610_pinctrl_of_match,
0339 .suppress_bind_attrs = true,
0340 },
0341 .probe = vf610_pinctrl_probe,
0342 };
0343
0344 static int __init vf610_pinctrl_init(void)
0345 {
0346 return platform_driver_register(&vf610_pinctrl_driver);
0347 }
0348 arch_initcall(vf610_pinctrl_init);