Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0+
0002 //
0003 // VF610 pinctrl driver based on imx pinmux and pinconf core
0004 //
0005 // Copyright 2013 Freescale Semiconductor, Inc.
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 /* Pad names for the pinmux subsystem */
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     /* IBE always enabled allows us to read the value "on the wire" */
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     { /* sentinel */ }
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);