// SPDX-License-Identifier: GPL-2.0-only /* * Driver for the EP93xx pin controller * based on linux/drivers/pinctrl/pinmux-gemini.c * * Copyright (C) 2022 Nikita Shubin * * This is a group-only pin controller. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "pinctrl-utils.h" #define DRIVER_NAME "pinctrl-ep93xx" enum ep93xx_pinctrl_model { EP93XX_9301_PINCTRL, EP93XX_9307_PINCTRL, EP93XX_9312_PINCTRL, }; struct ep93xx_pmx { struct device *dev; struct pinctrl_dev *pctl; struct ep93xx_regmap_adev *aux_dev; struct regmap *map; enum ep93xx_pinctrl_model model; }; static void ep93xx_pinctrl_update_bits(struct ep93xx_pmx *pmx, unsigned int reg, unsigned int mask, unsigned int val) { struct ep93xx_regmap_adev *aux = pmx->aux_dev; aux->update_bits(aux->map, aux->lock, reg, mask, val); } struct ep93xx_pin_group { struct pingroup grp; u32 mask; u32 value; }; #define PMX_GROUP(_name, _pins, _mask, _value) \ { \ .grp = PINCTRL_PINGROUP(_name, _pins, ARRAY_SIZE(_pins)), \ .mask = _mask, \ .value = _value, \ } #define EP93XX_SYSCON_DEVCFG 0x80 /* * There are several system configuration options selectable by the DeviceCfg and SysCfg * registers. These registers provide the selection of several pin multiplexing options and also * provide software access to the system reset configuration options. Please refer to the * descriptions of the registers, “DeviceCfg” on page 5-25 and “SysCfg” on page 5-34, for a * detailed explanation. */ #define EP93XX_SYSCON_DEVCFG_D1ONG BIT(30) #define EP93XX_SYSCON_DEVCFG_D0ONG BIT(29) #define EP93XX_SYSCON_DEVCFG_IONU2 BIT(28) #define EP93XX_SYSCON_DEVCFG_GONK BIT(27) #define EP93XX_SYSCON_DEVCFG_TONG BIT(26) #define EP93XX_SYSCON_DEVCFG_MONG BIT(25) #define EP93XX_SYSCON_DEVCFG_A2ONG BIT(22) #define EP93XX_SYSCON_DEVCFG_A1ONG BIT(21) #define EP93XX_SYSCON_DEVCFG_HONIDE BIT(11) #define EP93XX_SYSCON_DEVCFG_GONIDE BIT(10) #define EP93XX_SYSCON_DEVCFG_PONG BIT(9) #define EP93XX_SYSCON_DEVCFG_EONIDE BIT(8) #define EP93XX_SYSCON_DEVCFG_I2SONSSP BIT(7) #define EP93XX_SYSCON_DEVCFG_I2SONAC97 BIT(6) #define EP93XX_SYSCON_DEVCFG_RASONP3 BIT(4) #define PADS_MASK (GENMASK(30, 25) | BIT(22) | BIT(21) | GENMASK(11, 6) | BIT(4)) #define PADS_MAXBIT 30 /* Ordered by bit index */ static const char * const ep93xx_padgroups[] = { NULL, NULL, NULL, NULL, "RasOnP3", NULL, "I2SonAC97", "I2SonSSP", "EonIDE", "PonG", "GonIDE", "HonIDE", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "A1onG", "A2onG", NULL, NULL, "MonG", "TonG", "GonK", "IonU2", "D0onG", "D1onG", }; /* ep9301, ep9302 */ static const struct pinctrl_pin_desc ep9301_pins[] = { PINCTRL_PIN(1, "CSn[7]"), PINCTRL_PIN(2, "CSn[6]"), PINCTRL_PIN(3, "CSn[3]"), PINCTRL_PIN(4, "CSn[2]"), PINCTRL_PIN(5, "CSn[1]"), PINCTRL_PIN(6, "AD[25]"), PINCTRL_PIN(7, "vdd_ring"), PINCTRL_PIN(8, "gnd_ring"), PINCTRL_PIN(9, "AD[24]"), PINCTRL_PIN(10, "SDCLK"), PINCTRL_PIN(11, "AD[23]"), PINCTRL_PIN(12, "vdd_core"), PINCTRL_PIN(13, "gnd_core"), PINCTRL_PIN(14, "SDWEn"), PINCTRL_PIN(15, "SDCSn[3]"), PINCTRL_PIN(16, "SDCSn[2]"), PINCTRL_PIN(17, "SDCSn[1]"), PINCTRL_PIN(18, "SDCSn[0]"), PINCTRL_PIN(19, "vdd_ring"), PINCTRL_PIN(20, "gnd_ring"), PINCTRL_PIN(21, "RASn"), PINCTRL_PIN(22, "CASn"), PINCTRL_PIN(23, "DQMn[1]"), PINCTRL_PIN(24, "DQMn[0]"), PINCTRL_PIN(25, "AD[22]"), PINCTRL_PIN(26, "AD[21]"), PINCTRL_PIN(27, "vdd_ring"), PINCTRL_PIN(28, "gnd_ring"), PINCTRL_PIN(29, "DA[15]"), PINCTRL_PIN(30, "AD[7]"), PINCTRL_PIN(31, "DA[14]"), PINCTRL_PIN(32, "AD[6]"), PINCTRL_PIN(33, "DA[13]"), PINCTRL_PIN(34, "vdd_core"), PINCTRL_PIN(35, "gnd_core"), PINCTRL_PIN(36, "AD[5]"), PINCTRL_PIN(37, "DA[12]"), PINCTRL_PIN(38, "AD[4]"), PINCTRL_PIN(39, "DA[11]"), PINCTRL_PIN(40, "AD[3]"), PINCTRL_PIN(41, "vdd_ring"), PINCTRL_PIN(42, "gnd_ring"), PINCTRL_PIN(43, "DA[10]"), PINCTRL_PIN(44, "AD[2]"), PINCTRL_PIN(45, "DA[9]"), PINCTRL_PIN(46, "AD[1]"), PINCTRL_PIN(47, "DA[8]"), PINCTRL_PIN(48, "AD[0]"), PINCTRL_PIN(49, "vdd_ring"), PINCTRL_PIN(50, "gnd_ring"), PINCTRL_PIN(51, "NC"), PINCTRL_PIN(52, "NC"), PINCTRL_PIN(53, "vdd_ring"), PINCTRL_PIN(54, "gnd_ring"), PINCTRL_PIN(55, "AD[15]"), PINCTRL_PIN(56, "DA[7]"), PINCTRL_PIN(57, "vdd_core"), PINCTRL_PIN(58, "gnd_core"), PINCTRL_PIN(59, "AD[14]"), PINCTRL_PIN(60, "DA[6]"), PINCTRL_PIN(61, "AD[13]"), PINCTRL_PIN(62, "DA[5]"), PINCTRL_PIN(63, "AD[12]"), PINCTRL_PIN(64, "DA[4]"), PINCTRL_PIN(65, "AD[11]"), PINCTRL_PIN(66, "vdd_ring"), PINCTRL_PIN(67, "gnd_ring"), PINCTRL_PIN(68, "DA[3]"), PINCTRL_PIN(69, "AD[10]"), PINCTRL_PIN(70, "DA[2]"), PINCTRL_PIN(71, "AD[9]"), PINCTRL_PIN(72, "DA[1]"), PINCTRL_PIN(73, "AD[8]"), PINCTRL_PIN(74, "DA[0]"), PINCTRL_PIN(75, "DSRn"), PINCTRL_PIN(76, "DTRn"), PINCTRL_PIN(77, "TCK"), PINCTRL_PIN(78, "TDI"), PINCTRL_PIN(79, "TDO"), PINCTRL_PIN(80, "TMS"), PINCTRL_PIN(81, "vdd_ring"), PINCTRL_PIN(82, "gnd_ring"), PINCTRL_PIN(83, "BOOT[1]"), PINCTRL_PIN(84, "BOOT[0]"), PINCTRL_PIN(85, "gnd_ring"), PINCTRL_PIN(86, "NC"), PINCTRL_PIN(87, "EECLK"), PINCTRL_PIN(88, "EEDAT"), PINCTRL_PIN(89, "ASYNC"), PINCTRL_PIN(90, "vdd_core"), PINCTRL_PIN(91, "gnd_core"), PINCTRL_PIN(92, "ASDO"), PINCTRL_PIN(93, "SCLK1"), PINCTRL_PIN(94, "SFRM1"), PINCTRL_PIN(95, "SSPRX1"), PINCTRL_PIN(96, "SSPTX1"), PINCTRL_PIN(97, "GRLED"), PINCTRL_PIN(98, "RDLED"), PINCTRL_PIN(99, "vdd_ring"), PINCTRL_PIN(100, "gnd_ring"), PINCTRL_PIN(101, "INT[3]"), PINCTRL_PIN(102, "INT[1]"), PINCTRL_PIN(103, "INT[0]"), PINCTRL_PIN(104, "RTSn"), PINCTRL_PIN(105, "USBm[0]"), PINCTRL_PIN(106, "USBp[0]"), PINCTRL_PIN(107, "ABITCLK"), PINCTRL_PIN(108, "CTSn"), PINCTRL_PIN(109, "RXD[0]"), PINCTRL_PIN(110, "RXD[1]"), PINCTRL_PIN(111, "vdd_ring"), PINCTRL_PIN(112, "gnd_ring"), PINCTRL_PIN(113, "TXD[0]"), PINCTRL_PIN(114, "TXD[1]"), PINCTRL_PIN(115, "CGPIO[0]"), PINCTRL_PIN(116, "gnd_core"), PINCTRL_PIN(117, "PLL_GND"), PINCTRL_PIN(118, "XTALI"), PINCTRL_PIN(119, "XTALO"), PINCTRL_PIN(120, "PLL_VDD"), PINCTRL_PIN(121, "vdd_core"), PINCTRL_PIN(122, "gnd_ring"), PINCTRL_PIN(123, "vdd_ring"), PINCTRL_PIN(124, "RSTOn"), PINCTRL_PIN(125, "PRSTn"), PINCTRL_PIN(126, "CSn[0]"), PINCTRL_PIN(127, "gnd_core"), PINCTRL_PIN(128, "vdd_core"), PINCTRL_PIN(129, "gnd_ring"), PINCTRL_PIN(130, "vdd_ring"), PINCTRL_PIN(131, "ADC[4]"), PINCTRL_PIN(132, "ADC[3]"), PINCTRL_PIN(133, "ADC[2]"), PINCTRL_PIN(134, "ADC[1]"), PINCTRL_PIN(135, "ADC[0]"), PINCTRL_PIN(136, "ADC_VDD"), PINCTRL_PIN(137, "RTCXTALI"), PINCTRL_PIN(138, "RTCXTALO"), PINCTRL_PIN(139, "ADC_GND"), PINCTRL_PIN(140, "EGPIO[11]"), PINCTRL_PIN(141, "EGPIO[10]"), PINCTRL_PIN(142, "EGPIO[9]"), PINCTRL_PIN(143, "EGPIO[8]"), PINCTRL_PIN(144, "EGPIO[7]"), PINCTRL_PIN(145, "EGPIO[6]"), PINCTRL_PIN(146, "EGPIO[5]"), PINCTRL_PIN(147, "EGPIO[4]"), PINCTRL_PIN(148, "EGPIO[3]"), PINCTRL_PIN(149, "gnd_ring"), PINCTRL_PIN(150, "vdd_ring"), PINCTRL_PIN(151, "EGPIO[2]"), PINCTRL_PIN(152, "EGPIO[1]"), PINCTRL_PIN(153, "EGPIO[0]"), PINCTRL_PIN(154, "ARSTn"), PINCTRL_PIN(155, "TRSTn"), PINCTRL_PIN(156, "ASDI"), PINCTRL_PIN(157, "USBm[2]"), PINCTRL_PIN(158, "USBp[2]"), PINCTRL_PIN(159, "WAITn"), PINCTRL_PIN(160, "EGPIO[15]"), PINCTRL_PIN(161, "gnd_ring"), PINCTRL_PIN(162, "vdd_ring"), PINCTRL_PIN(163, "EGPIO[14]"), PINCTRL_PIN(164, "EGPIO[13]"), PINCTRL_PIN(165, "EGPIO[12]"), PINCTRL_PIN(166, "gnd_core"), PINCTRL_PIN(167, "vdd_core"), PINCTRL_PIN(168, "FGPIO[3]"), PINCTRL_PIN(169, "FGPIO[2]"), PINCTRL_PIN(170, "FGPIO[1]"), PINCTRL_PIN(171, "gnd_ring"), PINCTRL_PIN(172, "vdd_ring"), PINCTRL_PIN(173, "CLD"), PINCTRL_PIN(174, "CRS"), PINCTRL_PIN(175, "TXERR"), PINCTRL_PIN(176, "TXEN"), PINCTRL_PIN(177, "MIITXD[0]"), PINCTRL_PIN(178, "MIITXD[1]"), PINCTRL_PIN(179, "MIITXD[2]"), PINCTRL_PIN(180, "MIITXD[3]"), PINCTRL_PIN(181, "TXCLK"), PINCTRL_PIN(182, "RXERR"), PINCTRL_PIN(183, "RXDVAL"), PINCTRL_PIN(184, "MIIRXD[0]"), PINCTRL_PIN(185, "MIIRXD[1]"), PINCTRL_PIN(186, "MIIRXD[2]"), PINCTRL_PIN(187, "gnd_ring"), PINCTRL_PIN(188, "vdd_ring"), PINCTRL_PIN(189, "MIIRXD[3]"), PINCTRL_PIN(190, "RXCLK"), PINCTRL_PIN(191, "MDIO"), PINCTRL_PIN(192, "MDC"), PINCTRL_PIN(193, "RDn"), PINCTRL_PIN(194, "WRn"), PINCTRL_PIN(195, "AD[16]"), PINCTRL_PIN(196, "AD[17]"), PINCTRL_PIN(197, "gnd_core"), PINCTRL_PIN(198, "vdd_core"), PINCTRL_PIN(199, "HGPIO[2]"), PINCTRL_PIN(200, "HGPIO[3]"), PINCTRL_PIN(201, "HGPIO[4]"), PINCTRL_PIN(202, "HGPIO[5]"), PINCTRL_PIN(203, "gnd_ring"), PINCTRL_PIN(204, "vdd_ring"), PINCTRL_PIN(205, "AD[18]"), PINCTRL_PIN(206, "AD[19]"), PINCTRL_PIN(207, "AD[20]"), PINCTRL_PIN(208, "SDCLKEN"), }; static const unsigned int ssp_ep9301_pins[] = { 93, 94, 95, 96, }; static const unsigned int ac97_ep9301_pins[] = { 89, 92, 107, 154, 156, }; /* * Note: The EP9307 processor has one PWM with one output, PWMOUT. * Note: The EP9301, EP9302, EP9312, and EP9315 processors each have two PWMs with * two outputs, PWMOUT and PWMO1. PWMO1 is an alternate function for EGPIO14. */ /* The GPIO14E (14) pin overlap with pwm1 */ static const unsigned int pwm_9301_pins[] = { 163 }; static const unsigned int gpio1a_9301_pins[] = { 163 }; /* ep9301/9302 have only 0 pin of GPIO C Port exposed */ static const unsigned int gpio2a_9301_pins[] = { 115 }; /* ep9301/9302 have only 4,5 pin of GPIO E Port exposed */ static const unsigned int gpio4a_9301_pins[] = { 97, 98 }; /* ep9301/9302 have only 4,5 pin of GPIO G Port exposed */ static const unsigned int gpio6a_9301_pins[] = { 87, 88 }; static const unsigned int gpio7a_9301_pins[] = { 199, 200, 201, 202 }; /* Groups for the ep9301/ep9302 SoC/package */ static const struct ep93xx_pin_group ep9301_pin_groups[] = { PMX_GROUP("ssp", ssp_ep9301_pins, EP93XX_SYSCON_DEVCFG_I2SONSSP, 0), PMX_GROUP("i2s_on_ssp", ssp_ep9301_pins, EP93XX_SYSCON_DEVCFG_I2SONSSP, EP93XX_SYSCON_DEVCFG_I2SONSSP), PMX_GROUP("ac97", ac97_ep9301_pins, EP93XX_SYSCON_DEVCFG_I2SONAC97, 0), PMX_GROUP("i2s_on_ac97", ac97_ep9301_pins, EP93XX_SYSCON_DEVCFG_I2SONAC97, EP93XX_SYSCON_DEVCFG_I2SONAC97), PMX_GROUP("pwm1", pwm_9301_pins, EP93XX_SYSCON_DEVCFG_PONG, EP93XX_SYSCON_DEVCFG_PONG), PMX_GROUP("gpio1agrp", gpio1a_9301_pins, EP93XX_SYSCON_DEVCFG_PONG, 0), PMX_GROUP("gpio2agrp", gpio2a_9301_pins, EP93XX_SYSCON_DEVCFG_GONK, EP93XX_SYSCON_DEVCFG_GONK), PMX_GROUP("gpio4agrp", gpio4a_9301_pins, EP93XX_SYSCON_DEVCFG_EONIDE, EP93XX_SYSCON_DEVCFG_EONIDE), PMX_GROUP("gpio6agrp", gpio6a_9301_pins, EP93XX_SYSCON_DEVCFG_GONIDE, EP93XX_SYSCON_DEVCFG_GONIDE), PMX_GROUP("gpio7agrp", gpio7a_9301_pins, EP93XX_SYSCON_DEVCFG_HONIDE, EP93XX_SYSCON_DEVCFG_HONIDE), }; static const struct pinctrl_pin_desc ep9307_pins[] = { /* Row A */ PINCTRL_PIN(0, "CSn[1]"), /* A1 */ PINCTRL_PIN(1, "CSn[7]"), /* A2 */ PINCTRL_PIN(2, "SDCLKEN"), /* A3 */ PINCTRL_PIN(3, "DA[31]"), /* A4 */ PINCTRL_PIN(4, "DA[29]"), /* A5 */ PINCTRL_PIN(5, "DA[27]"), /* A6 */ PINCTRL_PIN(6, "HGPIO[2]"), /* A7 */ PINCTRL_PIN(7, "RDn"), /* A8 */ PINCTRL_PIN(8, "MIIRXD[3]"), /* A9 */ PINCTRL_PIN(9, "RXDVAL"), /* A10 */ PINCTRL_PIN(10, "MIITXD[1]"), /* A11 */ PINCTRL_PIN(11, "CRS"), /* A12 */ PINCTRL_PIN(12, "FGPIO[7]"), /* A13 */ PINCTRL_PIN(13, "FGPIO[0]"), /* A14 */ PINCTRL_PIN(14, "WAITn"), /* A15 */ PINCTRL_PIN(15, "USBm[2]"), /* A16 */ PINCTRL_PIN(16, "ASDI"), /* A17 */ /* Row B */ PINCTRL_PIN(17, "AD[25]"), /* B1 */ PINCTRL_PIN(18, "CSn[2]"), /* B2 */ PINCTRL_PIN(19, "CSn[6]"), /* B3 */ PINCTRL_PIN(20, "AD[20]"), /* B4 */ PINCTRL_PIN(21, "DA[30]"), /* B5 */ PINCTRL_PIN(22, "AD[18]"), /* B6 */ PINCTRL_PIN(23, "HGPIO[3]"), /* B7 */ PINCTRL_PIN(24, "AD[17]"), /* B8 */ PINCTRL_PIN(25, "RXCLK"), /* B9 */ PINCTRL_PIN(26, "MIIRXD[1]"), /* B10 */ PINCTRL_PIN(27, "MIITXD[2]"), /* B11 */ PINCTRL_PIN(28, "TXEN"), /* B12 */ PINCTRL_PIN(29, "FGPIO[5]"), /* B13 */ PINCTRL_PIN(30, "EGPIO[15]"), /* B14 */ PINCTRL_PIN(31, "USBp[2]"), /* B15 */ PINCTRL_PIN(32, "ARSTn"), /* B16 */ PINCTRL_PIN(33, "ADC_VDD"), /* B17 */ /* Row C */ PINCTRL_PIN(34, "AD[23]"), /* C1 */ PINCTRL_PIN(35, "DA[26]"), /* C2 */ PINCTRL_PIN(36, "CSn[3]"), /* C3 */ PINCTRL_PIN(37, "DA[25]"), /* C4 */ PINCTRL_PIN(38, "AD[24]"), /* C5 */ PINCTRL_PIN(39, "AD[19]"), /* C6 */ PINCTRL_PIN(40, "HGPIO[5]"), /* C7 */ PINCTRL_PIN(41, "WRn"), /* C8 */ PINCTRL_PIN(42, "MDIO"), /* C9 */ PINCTRL_PIN(43, "MIIRXD[2]"), /* C10 */ PINCTRL_PIN(44, "TXCLK"), /* C11 */ PINCTRL_PIN(45, "MIITXD[0]"), /* C12 */ PINCTRL_PIN(46, "CLD"), /* C13 */ PINCTRL_PIN(47, "EGPIO[13]"), /* C14 */ PINCTRL_PIN(48, "TRSTn"), /* C15 */ PINCTRL_PIN(49, "Xp"), /* C16 */ PINCTRL_PIN(50, "Xm"), /* C17 */ /* Row D */ PINCTRL_PIN(51, "SDCSn[3]"), /* D1 */ PINCTRL_PIN(52, "DA[23]"), /* D2 */ PINCTRL_PIN(53, "SDCLK"), /* D3 */ PINCTRL_PIN(54, "DA[24]"), /* D4 */ PINCTRL_PIN(55, "HGPIO[7]"), /* D5 */ PINCTRL_PIN(56, "HGPIO[6]"), /* D6 */ PINCTRL_PIN(57, "A[28]"), /* D7 */ PINCTRL_PIN(58, "HGPIO[4]"), /* D8 */ PINCTRL_PIN(59, "AD[16]"), /* D9 */ PINCTRL_PIN(60, "MDC"), /* D10 */ PINCTRL_PIN(61, "RXERR"), /* D11 */ PINCTRL_PIN(62, "MIITXD[3]"), /* D12 */ PINCTRL_PIN(63, "EGPIO[12]"), /* D13 */ PINCTRL_PIN(64, "EGPIO[1]"), /* D14 */ PINCTRL_PIN(65, "EGPIO[0]"), /* D15 */ PINCTRL_PIN(66, "Ym"), /* D16 */ PINCTRL_PIN(67, "Yp"), /* D17 */ /* Row E */ PINCTRL_PIN(68, "SDCSn[2]"), /* E1 */ PINCTRL_PIN(69, "SDWEN"), /* E2 */ PINCTRL_PIN(70, "DA[22]"), /* E3 */ PINCTRL_PIN(71, "AD[3]"), /* E4 */ PINCTRL_PIN(72, "DA[15]"), /* E5 */ PINCTRL_PIN(73, "AD[21]"), /* E6 */ PINCTRL_PIN(74, "DA[17]"), /* E7 */ PINCTRL_PIN(75, "vddr"), /* E8 */ PINCTRL_PIN(76, "vddr"), /* E9 */ PINCTRL_PIN(77, "vddr"), /* E10 */ PINCTRL_PIN(78, "MIIRXD[0]"), /* E11 */ PINCTRL_PIN(79, "TXERR"), /* E12 */ PINCTRL_PIN(80, "EGPIO[2]"), /* E13 */ PINCTRL_PIN(81, "EGPIO[4]"), /* E14 */ PINCTRL_PIN(82, "EGPIO[3]"), /* E15 */ PINCTRL_PIN(83, "sXp"), /* E16 */ PINCTRL_PIN(84, "sXm"), /* E17 */ /* Row F */ PINCTRL_PIN(85, "RASn"), /* F1 */ PINCTRL_PIN(86, "SDCSn[1]"), /* F2 */ PINCTRL_PIN(87, "SDCSn[0]"), /* F3 */ PINCTRL_PIN(88, "DQMn[3]"), /* F4 */ PINCTRL_PIN(89, "AD[5]"), /* F5 */ PINCTRL_PIN(90, "gndr"), /* F6 */ PINCTRL_PIN(91, "gndr"), /* F7 */ PINCTRL_PIN(92, "gndr"), /* F8 */ PINCTRL_PIN(93, "vddc"), /* F9 */ PINCTRL_PIN(94, "vddc"), /* F10 */ PINCTRL_PIN(95, "gndr"), /* F11 */ PINCTRL_PIN(96, "EGPIO[7]"), /* F12 */ PINCTRL_PIN(97, "EGPIO[5]"), /* F13 */ PINCTRL_PIN(98, "ADC GND"), /* F14 */ PINCTRL_PIN(99, "EGPIO[6]"), /* F15 */ PINCTRL_PIN(100, "sYm"), /* F16 */ PINCTRL_PIN(101, "syp"), /* F17 */ /* Row G */ PINCTRL_PIN(102, "DQMn[0]"), /* G1 */ PINCTRL_PIN(103, "CASn"), /* G2 */ PINCTRL_PIN(104, "DA[21]"), /* G3 */ PINCTRL_PIN(105, "AD[22]"), /* G4 */ PINCTRL_PIN(106, "vddr"), /* G5 */ PINCTRL_PIN(107, "gndr"), /* G6 */ PINCTRL_PIN(108, "gndr"), /* G12 */ PINCTRL_PIN(109, "EGPIO[9]"), /* G13 */ PINCTRL_PIN(110, "EGPIO[10]"), /* G14 */ PINCTRL_PIN(111, "EGPIO[11]"), /* G15 */ PINCTRL_PIN(112, "RTCXTALO"), /* G16 */ PINCTRL_PIN(113, "RTCXTALI"), /* G17 */ /* Row H */ PINCTRL_PIN(114, "DA[18]"), /* H1 */ PINCTRL_PIN(115, "DA[20]"), /* H2 */ PINCTRL_PIN(116, "DA[19]"), /* H3 */ PINCTRL_PIN(117, "DA[16]"), /* H4 */ PINCTRL_PIN(118, "vddr"), /* H5 */ PINCTRL_PIN(119, "vddc"), /* H6 */ PINCTRL_PIN(120, "gndc"), /* H7 */ PINCTRL_PIN(121, "gndc"), /* H9 */ PINCTRL_PIN(122, "gndc"), /* H10 */ PINCTRL_PIN(123, "gndr"), /* H12 */ PINCTRL_PIN(124, "vddr"), /* H13 */ PINCTRL_PIN(125, "EGPIO[8]"), /* H14 */ PINCTRL_PIN(126, "PRSTN"), /* H15 */ PINCTRL_PIN(127, "COL[7]"), /* H16 */ PINCTRL_PIN(128, "RSTON"), /* H17 */ /* Row J */ PINCTRL_PIN(129, "AD[6]"), /* J1 */ PINCTRL_PIN(130, "DA[14]"), /* J2 */ PINCTRL_PIN(131, "AD[7]"), /* J3 */ PINCTRL_PIN(132, "DA[13]"), /* J4 */ PINCTRL_PIN(133, "vddr"), /* J5 */ PINCTRL_PIN(134, "vddc"), /* J6 */ PINCTRL_PIN(135, "gndc"), /* J8 */ PINCTRL_PIN(136, "gndc"), /* J10 */ PINCTRL_PIN(137, "vddc"), /* J12 */ PINCTRL_PIN(138, "vddr"), /* J13 */ PINCTRL_PIN(139, "COL[5]"), /* J14 */ PINCTRL_PIN(140, "COL[6]"), /* J15 */ PINCTRL_PIN(141, "CSn[0]"), /* J16 */ PINCTRL_PIN(142, "COL[3]"), /* J17 */ /* Row K */ PINCTRL_PIN(143, "AD[4]"), /* K1 */ PINCTRL_PIN(144, "DA[12]"), /* K2 */ PINCTRL_PIN(145, "DA[10]"), /* K3 */ PINCTRL_PIN(146, "DA[11]"), /* K4 */ PINCTRL_PIN(147, "vddr"), /* K5 */ PINCTRL_PIN(148, "gndr"), /* K6 */ PINCTRL_PIN(149, "gndc"), /* K8 */ PINCTRL_PIN(150, "gndc"), /* K9 */ PINCTRL_PIN(151, "gndc"), /* K10 */ PINCTRL_PIN(152, "vddc"), /* K12 */ PINCTRL_PIN(153, "COL[4]"), /* K13 */ PINCTRL_PIN(154, "PLL_VDD"), /* K14 */ PINCTRL_PIN(155, "COL[2]"), /* K15 */ PINCTRL_PIN(156, "COL[1]"), /* K16 */ PINCTRL_PIN(157, "COL[0]"), /* K17 */ /* Row L */ PINCTRL_PIN(158, "DA[9]"), /* L1 */ PINCTRL_PIN(159, "AD[2]"), /* L2 */ PINCTRL_PIN(160, "AD[1]"), /* L3 */ PINCTRL_PIN(161, "DA[8]"), /* L4 */ PINCTRL_PIN(162, "BLANK"), /* L5 */ PINCTRL_PIN(163, "gndr"), /* L6 */ PINCTRL_PIN(164, "gndr"), /* L7 */ PINCTRL_PIN(165, "ROW[7]"), /* L8 */ PINCTRL_PIN(166, "ROW[5]"), /* L9 */ PINCTRL_PIN(167, "PLL GND"), /* L10 */ PINCTRL_PIN(168, "XTALI"), /* L11 */ PINCTRL_PIN(169, "XTALO"), /* L12 */ /* Row M */ PINCTRL_PIN(170, "BRIGHT"), /* M1 */ PINCTRL_PIN(171, "AD[0]"), /* M2 */ PINCTRL_PIN(172, "DQMn[1]"), /* M3 */ PINCTRL_PIN(173, "DQMn[2]"), /* M4 */ PINCTRL_PIN(174, "P[17]"), /* M5 */ PINCTRL_PIN(175, "gndr"), /* M6 */ PINCTRL_PIN(176, "gndr"), /* M7 */ PINCTRL_PIN(177, "vddc"), /* M8 */ PINCTRL_PIN(178, "vddc"), /* M9 */ PINCTRL_PIN(179, "gndr"), /* M10 */ PINCTRL_PIN(180, "gndr"), /* M11 */ PINCTRL_PIN(181, "ROW[6]"), /* M12 */ PINCTRL_PIN(182, "ROW[4]"), /* M13 */ PINCTRL_PIN(183, "ROW[1]"), /* M14 */ PINCTRL_PIN(184, "ROW[0]"), /* M15 */ PINCTRL_PIN(185, "ROW[3]"), /* M16 */ PINCTRL_PIN(186, "ROW[2]"), /* M17 */ /* Row N */ PINCTRL_PIN(187, "P[14]"), /* N1 */ PINCTRL_PIN(188, "P[16]"), /* N2 */ PINCTRL_PIN(189, "P[15]"), /* N3 */ PINCTRL_PIN(190, "P[13]"), /* N4 */ PINCTRL_PIN(191, "P[12]"), /* N5 */ PINCTRL_PIN(192, "DA[5]"), /* N6 */ PINCTRL_PIN(193, "vddr"), /* N7 */ PINCTRL_PIN(194, "vddr"), /* N8 */ PINCTRL_PIN(195, "vddr"), /* N9 */ PINCTRL_PIN(196, "vddr"), /* N10 */ PINCTRL_PIN(197, "EECLK"), /* N11 */ PINCTRL_PIN(198, "ASDO"), /* N12 */ PINCTRL_PIN(199, "CTSn"), /* N13 */ PINCTRL_PIN(200, "RXD[0]"), /* N14 */ PINCTRL_PIN(201, "TXD[0]"), /* N15 */ PINCTRL_PIN(202, "TXD[1]"), /* N16 */ PINCTRL_PIN(203, "TXD[2]"), /* N17 */ /* Row P */ PINCTRL_PIN(204, "SPCLK"), /* P1 */ PINCTRL_PIN(205, "P[10]"), /* P2 */ PINCTRL_PIN(206, "P[11]"), /* P3 */ PINCTRL_PIN(207, "P[3]"), /* P4 */ PINCTRL_PIN(208, "AD[15]"), /* P5 */ PINCTRL_PIN(209, "AD[13]"), /* P6 */ PINCTRL_PIN(210, "AD[12]"), /* P7 */ PINCTRL_PIN(211, "DA[2]"), /* P8 */ PINCTRL_PIN(212, "AD[8]"), /* P9 */ PINCTRL_PIN(213, "TCK"), /* P10 */ PINCTRL_PIN(214, "BOOT[1]"), /* P11 */ PINCTRL_PIN(215, "EEDAT"), /* P12 */ PINCTRL_PIN(216, "GRLED"), /* P13 */ PINCTRL_PIN(217, "RDLED"), /* P14 */ PINCTRL_PIN(218, "GGPIO[2]"), /* P15 */ PINCTRL_PIN(219, "RXD[1]"), /* P16 */ PINCTRL_PIN(220, "RXD[2]"), /* P17 */ /* Row R */ PINCTRL_PIN(221, "P[9]"), /* R1 */ PINCTRL_PIN(222, "HSYNC"), /* R2 */ PINCTRL_PIN(223, "P[6]"), /* R3 */ PINCTRL_PIN(224, "P[5]"), /* R4 */ PINCTRL_PIN(225, "P[0]"), /* R5 */ PINCTRL_PIN(226, "AD[14]"), /* R6 */ PINCTRL_PIN(227, "DA[4]"), /* R7 */ PINCTRL_PIN(228, "DA[1]"), /* R8 */ PINCTRL_PIN(229, "DTRn"), /* R9 */ PINCTRL_PIN(230, "TDI"), /* R10 */ PINCTRL_PIN(231, "BOOT[0]"), /* R11 */ PINCTRL_PIN(232, "ASYNC"), /* R12 */ PINCTRL_PIN(233, "SSPTX[1]"), /* R13 */ PINCTRL_PIN(234, "PWMOUT"), /* R14 */ PINCTRL_PIN(235, "USBm[0]"), /* R15 */ PINCTRL_PIN(236, "ABITCLK"), /* R16 */ PINCTRL_PIN(237, "USBp[0]"), /* R17 */ /* Row T */ PINCTRL_PIN(238, "NC"), /* T1 */ PINCTRL_PIN(239, "NC"), /* T2 */ PINCTRL_PIN(240, "V_CSYNC"), /* T3 */ PINCTRL_PIN(241, "P[7]"), /* T4 */ PINCTRL_PIN(242, "P[2]"), /* T5 */ PINCTRL_PIN(243, "DA[7]"), /* T6 */ PINCTRL_PIN(244, "AD[11]"), /* T7 */ PINCTRL_PIN(245, "AD[9]"), /* T8 */ PINCTRL_PIN(246, "DSRn"), /* T9 */ PINCTRL_PIN(247, "TMS"), /* T10 */ PINCTRL_PIN(248, "gndr"), /* T11 */ PINCTRL_PIN(249, "SFRM[1]"), /* T12 */ PINCTRL_PIN(250, "INT[2]"), /* T13 */ PINCTRL_PIN(251, "INT[0]"), /* T14 */ PINCTRL_PIN(252, "USBp[1]"), /* T15 */ PINCTRL_PIN(253, "NC"), /* T16 */ PINCTRL_PIN(254, "NC"), /* T17 */ /* Row U */ PINCTRL_PIN(255, "NC"), /* U1 */ PINCTRL_PIN(256, "NC"), /* U2 */ PINCTRL_PIN(257, "P[8]"), /* U3 */ PINCTRL_PIN(258, "P[4]"), /* U4 */ PINCTRL_PIN(259, "P[1]"), /* U5 */ PINCTRL_PIN(260, "DA[6]"), /* U6 */ PINCTRL_PIN(261, "DA[3]"), /* U7 */ PINCTRL_PIN(262, "AD[10]"), /* U8 */ PINCTRL_PIN(263, "DA[0]"), /* U9 */ PINCTRL_PIN(264, "TDO"), /* U10 */ PINCTRL_PIN(265, "NC"), /* U11 */ PINCTRL_PIN(266, "SCLK[1]"), /* U12 */ PINCTRL_PIN(267, "SSPRX[1]"), /* U13 */ PINCTRL_PIN(268, "INT[1]"), /* U14 */ PINCTRL_PIN(269, "RTSn"), /* U15 */ PINCTRL_PIN(270, "USBm[1]"), /* U16 */ PINCTRL_PIN(271, "NC"), /* U17 */ }; static const unsigned int ssp_ep9307_pins[] = { 233, 249, 266, 267, }; static const unsigned int ac97_ep9307_pins[] = { 16, 32, 198, 232, 236, }; /* I can't find info on those - it's some internal state */ static const unsigned int raster_on_sdram0_pins[] = { }; static const unsigned int raster_on_sdram3_pins[] = { }; /* ROW[N] */ static const unsigned int gpio2a_9307_pins[] = { 165, 166, 181, 182, 183, 184, 185, 186, }; /* COL[N] */ static const unsigned int gpio3a_9307_pins[] = { 127, 139, 140, 142, 153, 155, 156, 157, }; static const unsigned int keypad_9307_pins[] = { 127, 139, 140, 142, 153, 155, 156, 157, 165, 166, 181, 182, 183, 184, 185, 186, }; /* ep9307 have only 4,5 pin of GPIO E Port exposed */ static const unsigned int gpio4a_9307_pins[] = { 216, 217 }; /* ep9307 have only 2 pin of GPIO G Port exposed */ static const unsigned int gpio6a_9307_pins[] = { 219 }; static const unsigned int gpio7a_9307_pins[] = { 7, 24, 41, 56, 57, 59 }; static const struct ep93xx_pin_group ep9307_pin_groups[] = { PMX_GROUP("ssp", ssp_ep9307_pins, EP93XX_SYSCON_DEVCFG_I2SONSSP, 0), PMX_GROUP("i2s_on_ssp", ssp_ep9307_pins, EP93XX_SYSCON_DEVCFG_I2SONSSP, EP93XX_SYSCON_DEVCFG_I2SONSSP), PMX_GROUP("ac97", ac97_ep9307_pins, EP93XX_SYSCON_DEVCFG_I2SONAC97, 0), PMX_GROUP("i2s_on_ac97", ac97_ep9301_pins, EP93XX_SYSCON_DEVCFG_I2SONAC97, EP93XX_SYSCON_DEVCFG_I2SONAC97), PMX_GROUP("rasteronsdram0grp", raster_on_sdram0_pins, EP93XX_SYSCON_DEVCFG_RASONP3, 0), PMX_GROUP("rasteronsdram3grp", raster_on_sdram3_pins, EP93XX_SYSCON_DEVCFG_RASONP3, EP93XX_SYSCON_DEVCFG_RASONP3), PMX_GROUP("gpio2agrp", gpio2a_9307_pins, EP93XX_SYSCON_DEVCFG_GONK, EP93XX_SYSCON_DEVCFG_GONK), PMX_GROUP("gpio3agrp", gpio3a_9307_pins, EP93XX_SYSCON_DEVCFG_GONK, EP93XX_SYSCON_DEVCFG_GONK), PMX_GROUP("keypadgrp", keypad_9307_pins, EP93XX_SYSCON_DEVCFG_GONK, 0), PMX_GROUP("gpio4agrp", gpio4a_9307_pins, EP93XX_SYSCON_DEVCFG_EONIDE, EP93XX_SYSCON_DEVCFG_EONIDE), PMX_GROUP("gpio6agrp", gpio6a_9307_pins, EP93XX_SYSCON_DEVCFG_GONIDE, EP93XX_SYSCON_DEVCFG_GONIDE), PMX_GROUP("gpio7agrp", gpio7a_9307_pins, EP93XX_SYSCON_DEVCFG_HONIDE, EP93XX_SYSCON_DEVCFG_HONIDE), }; /* ep9312, ep9315 */ static const struct pinctrl_pin_desc ep9312_pins[] = { /* Row A */ PINCTRL_PIN(0, "CSN[7]"), /* A1 */ PINCTRL_PIN(1, "DA[28]"), /* A2 */ PINCTRL_PIN(2, "AD[18]"), /* A3 */ PINCTRL_PIN(3, "DD[8]"), /* A4 */ PINCTRL_PIN(4, "DD[4]"), /* A5 */ PINCTRL_PIN(5, "AD[17]"), /* A6 */ PINCTRL_PIN(6, "RDN"), /* A7 */ PINCTRL_PIN(7, "RXCLK"), /* A8 */ PINCTRL_PIN(8, "MIIRXD[0]"), /* A9 */ PINCTRL_PIN(9, "RXDVAL"), /* A10 */ PINCTRL_PIN(10, "MIITXD[2]"), /* A11 */ PINCTRL_PIN(11, "TXERR"), /* A12 */ PINCTRL_PIN(12, "CLD"), /* A13 */ PINCTRL_PIN(13, "NC"), /* A14 */ PINCTRL_PIN(14, "NC"), /* A15 */ PINCTRL_PIN(15, "NC"), /* A16 */ PINCTRL_PIN(16, "EGPIO[12]"), /* A17 */ PINCTRL_PIN(17, "EGPIO[15]"), /* A18 */ PINCTRL_PIN(18, "NC"), /* A19 */ PINCTRL_PIN(19, "NC"), /* A20 */ /* Row B */ PINCTRL_PIN(20, "CSN[2]"), /* B1 */ PINCTRL_PIN(21, "DA[31]"), /* B2 */ PINCTRL_PIN(22, "DA[30]"), /* B3 */ PINCTRL_PIN(23, "DA[27]"), /* B4 */ PINCTRL_PIN(24, "DD[7]"), /* B5 */ PINCTRL_PIN(25, "DD[3]"), /* B6 */ PINCTRL_PIN(26, "WRN"), /* B7 */ PINCTRL_PIN(27, "MDIO"), /* B8 */ PINCTRL_PIN(28, "MIIRXD[1]"), /* B9 */ PINCTRL_PIN(29, "RXERR"), /* B10 */ PINCTRL_PIN(30, "MIITXD[1]"), /* B11 */ PINCTRL_PIN(31, "CRS"), /* B12 */ PINCTRL_PIN(32, "NC"), /* B13 */ PINCTRL_PIN(33, "NC"), /* B14 */ PINCTRL_PIN(34, "NC"), /* B15 */ PINCTRL_PIN(35, "NC"), /* B16 */ PINCTRL_PIN(36, "EGPIO[13]"), /* B17 */ PINCTRL_PIN(37, "NC"), /* B18 */ PINCTRL_PIN(38, "WAITN"), /* B19 */ PINCTRL_PIN(39, "TRSTN"), /* B20 */ /* Row C */ PINCTRL_PIN(40, "CSN[1]"), /* C1 */ PINCTRL_PIN(41, "CSN[3]"), /* C2 */ PINCTRL_PIN(42, "AD[20]"), /* C3 */ PINCTRL_PIN(43, "DA[29]"), /* C4 */ PINCTRL_PIN(44, "DD[10]"), /* C5 */ PINCTRL_PIN(45, "DD[6]"), /* C6 */ PINCTRL_PIN(46, "DD[2]"), /* C7 */ PINCTRL_PIN(47, "MDC"), /* C8 */ PINCTRL_PIN(48, "MIIRXD[3]"), /* C9 */ PINCTRL_PIN(49, "TXCLK"), /* C10 */ PINCTRL_PIN(50, "MIITXD[0]"), /* C11 */ PINCTRL_PIN(51, "NC"), /* C12 */ PINCTRL_PIN(52, "NC"), /* C13 */ PINCTRL_PIN(53, "NC"), /* C14 */ PINCTRL_PIN(54, "NC"), /* C15 */ PINCTRL_PIN(55, "NC"), /* C16 */ PINCTRL_PIN(56, "NC"), /* C17 */ PINCTRL_PIN(57, "USBP[2]"), /* C18 */ PINCTRL_PIN(58, "IORDY"), /* C19 */ PINCTRL_PIN(59, "DMACKN"), /* C20 */ /* Row D */ PINCTRL_PIN(60, "AD[24]"), /* D1 */ PINCTRL_PIN(61, "DA[25]"), /* D2 */ PINCTRL_PIN(62, "DD[11]"), /* D3 */ PINCTRL_PIN(63, "SDCLKEN"), /* D4 */ PINCTRL_PIN(64, "AD[19]"), /* D5 */ PINCTRL_PIN(65, "DD[9]"), /* D6 */ PINCTRL_PIN(66, "DD[5]"), /* D7 */ PINCTRL_PIN(67, "AD[16]"), /* D8 */ PINCTRL_PIN(68, "MIIRXD[2]"), /* D9 */ PINCTRL_PIN(69, "MIITXD[3]"), /* D10 */ PINCTRL_PIN(70, "TXEN"), /* D11 */ PINCTRL_PIN(71, "NC"), /* D12 */ PINCTRL_PIN(72, "NC"), /* D13 */ PINCTRL_PIN(73, "NC"), /* D14 */ PINCTRL_PIN(74, "EGPIO[14]"), /* D15 */ PINCTRL_PIN(75, "NC"), /* D16 */ PINCTRL_PIN(76, "USBM[2]"), /* D17 */ PINCTRL_PIN(77, "ARSTN"), /* D18 */ PINCTRL_PIN(78, "DIORN"), /* D19 */ PINCTRL_PIN(79, "EGPIO[1]"), /* D20 */ /* Row E */ PINCTRL_PIN(80, "AD[23]"), /* E1 */ PINCTRL_PIN(81, "DA[23]"), /* E2 */ PINCTRL_PIN(82, "DA[26]"), /* E3 */ PINCTRL_PIN(83, "CSN[6]"), /* E4 */ PINCTRL_PIN(84, "GND"), /* E5 */ PINCTRL_PIN(85, "GND"), /* E6 */ PINCTRL_PIN(86, "CVDD"), /* E7 */ PINCTRL_PIN(87, "CVDD"), /* E8 */ PINCTRL_PIN(88, "RVDD"), /* E9 */ PINCTRL_PIN(89, "GND"), /* E10 */ PINCTRL_PIN(90, "GND"), /* E11 */ PINCTRL_PIN(91, "RVDD"), /* E12 */ PINCTRL_PIN(92, "CVDD"), /* E13 */ PINCTRL_PIN(93, "CVDD"), /* E14 */ PINCTRL_PIN(94, "GND"), /* E15 */ PINCTRL_PIN(95, "ASDI"), /* E16 */ PINCTRL_PIN(96, "DIOWN"), /* E17 */ PINCTRL_PIN(97, "EGPIO[0]"), /* E18 */ PINCTRL_PIN(98, "EGPIO[3]"), /* E19 */ PINCTRL_PIN(99, "EGPIO[5]"), /* E20 */ /* Row F */ PINCTRL_PIN(100, "SDCSN[3]"), /* F1 */ PINCTRL_PIN(101, "DA[22]"), /* F2 */ PINCTRL_PIN(102, "DA[24]"), /* F3 */ PINCTRL_PIN(103, "AD[25]"), /* F4 */ PINCTRL_PIN(104, "RVDD"), /* F5 */ PINCTRL_PIN(105, "GND"), /* F6 */ PINCTRL_PIN(106, "CVDD"), /* F7 */ PINCTRL_PIN(107, "CVDD"), /* F14 */ PINCTRL_PIN(108, "GND"), /* F15 */ PINCTRL_PIN(109, "GND"), /* F16 */ PINCTRL_PIN(110, "EGPIO[2]"), /* F17 */ PINCTRL_PIN(111, "EGPIO[4]"), /* F18 */ PINCTRL_PIN(112, "EGPIO[6]"), /* F19 */ PINCTRL_PIN(113, "EGPIO[8]"), /* F20 */ /* Row G */ PINCTRL_PIN(114, "SDCSN[0]"), /* G1 */ PINCTRL_PIN(115, "SDCSN[1]"), /* G2 */ PINCTRL_PIN(116, "SDWEN"), /* G3 */ PINCTRL_PIN(117, "SDCLK"), /* G4 */ PINCTRL_PIN(118, "RVDD"), /* G5 */ PINCTRL_PIN(119, "RVDD"), /* G6 */ PINCTRL_PIN(120, "RVDD"), /* G15 */ PINCTRL_PIN(121, "RVDD"), /* G16 */ PINCTRL_PIN(122, "EGPIO[7]"), /* G17 */ PINCTRL_PIN(123, "EGPIO[9]"), /* G18 */ PINCTRL_PIN(124, "EGPIO[10]"), /* G19 */ PINCTRL_PIN(125, "EGPIO[11]"), /* G20 */ /* Row H */ PINCTRL_PIN(126, "DQMN[3]"), /* H1 */ PINCTRL_PIN(127, "CASN"), /* H2 */ PINCTRL_PIN(128, "RASN"), /* H3 */ PINCTRL_PIN(129, "SDCSN[2]"), /* H4 */ PINCTRL_PIN(130, "CVDD"), /* H5 */ PINCTRL_PIN(131, "GND"), /* H8 */ PINCTRL_PIN(132, "GND"), /* H9 */ PINCTRL_PIN(133, "GND"), /* H10 */ PINCTRL_PIN(134, "GND"), /* H11 */ PINCTRL_PIN(135, "GND"), /* H12 */ PINCTRL_PIN(136, "GND"), /* H13 */ PINCTRL_PIN(137, "RVDD"), /* H16 */ PINCTRL_PIN(138, "RTCXTALO"), /* H17 */ PINCTRL_PIN(139, "ADC_VDD"), /* H18 */ PINCTRL_PIN(140, "ADC_GND"), /* H19 */ PINCTRL_PIN(141, "XP"), /* H20 */ /* Row J */ PINCTRL_PIN(142, "DA[21]"), /* J1 */ PINCTRL_PIN(143, "DQMN[0]"), /* J2 */ PINCTRL_PIN(144, "DQMN[1]"), /* J3 */ PINCTRL_PIN(145, "DQMN[2]"), /* J4 */ PINCTRL_PIN(146, "GND"), /* J5 */ PINCTRL_PIN(147, "GND"), /* J8 */ PINCTRL_PIN(148, "GND"), /* J9 */ PINCTRL_PIN(149, "GND"), /* J10 */ PINCTRL_PIN(150, "GND"), /* J11 */ PINCTRL_PIN(151, "GND"), /* J12 */ PINCTRL_PIN(152, "GND"), /* J13 */ PINCTRL_PIN(153, "CVDD"), /* J16 */ PINCTRL_PIN(154, "RTCXTALI"), /* J17 */ PINCTRL_PIN(155, "XM"), /* J18 */ PINCTRL_PIN(156, "YP"), /* J19 */ PINCTRL_PIN(157, "YM"), /* J20 */ /* Row K */ PINCTRL_PIN(158, "AD[22]"), /* K1 */ PINCTRL_PIN(159, "DA[20]"), /* K2 */ PINCTRL_PIN(160, "AD[21]"), /* K3 */ PINCTRL_PIN(161, "DA[19]"), /* K4 */ PINCTRL_PIN(162, "RVDD"), /* K5 */ PINCTRL_PIN(163, "GND"), /* K8 */ PINCTRL_PIN(164, "GND"), /* K9 */ PINCTRL_PIN(165, "GND"), /* K10 */ PINCTRL_PIN(166, "GND"), /* K11 */ PINCTRL_PIN(167, "GND"), /* K12 */ PINCTRL_PIN(168, "GND"), /* K13 */ PINCTRL_PIN(169, "CVDD"), /* K16 */ PINCTRL_PIN(170, "SYM"), /* K17 */ PINCTRL_PIN(171, "SYP"), /* K18 */ PINCTRL_PIN(172, "SXM"), /* K19 */ PINCTRL_PIN(173, "SXP"), /* K20 */ /* Row L */ PINCTRL_PIN(174, "DA[18]"), /* L1 */ PINCTRL_PIN(175, "DA[17]"), /* L2 */ PINCTRL_PIN(176, "DA[16]"), /* L3 */ PINCTRL_PIN(177, "DA[15]"), /* L4 */ PINCTRL_PIN(178, "GND"), /* L5 */ PINCTRL_PIN(179, "GND"), /* L8 */ PINCTRL_PIN(180, "GND"), /* L9 */ PINCTRL_PIN(181, "GND"), /* L10 */ PINCTRL_PIN(182, "GND"), /* L11 */ PINCTRL_PIN(183, "GND"), /* L12 */ PINCTRL_PIN(184, "GND"), /* L13 */ PINCTRL_PIN(185, "CVDD"), /* L16 */ PINCTRL_PIN(186, "COL[5]"), /* L17 */ PINCTRL_PIN(187, "COL[7]"), /* L18 */ PINCTRL_PIN(188, "RSTON"), /* L19 */ PINCTRL_PIN(189, "PRSTN"), /* L20 */ /* Row M */ PINCTRL_PIN(190, "AD[7]"), /* M1 */ PINCTRL_PIN(191, "DA[14]"), /* M2 */ PINCTRL_PIN(192, "AD[6]"), /* M3 */ PINCTRL_PIN(193, "AD[5]"), /* M4 */ PINCTRL_PIN(194, "CVDD"), /* M5 */ PINCTRL_PIN(195, "GND"), /* M8 */ PINCTRL_PIN(196, "GND"), /* M9 */ PINCTRL_PIN(197, "GND"), /* M10 */ PINCTRL_PIN(198, "GND"), /* M11 */ PINCTRL_PIN(199, "GND"), /* M12 */ PINCTRL_PIN(200, "GND"), /* M13 */ PINCTRL_PIN(201, "GND"), /* M16 */ PINCTRL_PIN(202, "COL[4]"), /* M17 */ PINCTRL_PIN(203, "COL[3]"), /* M18 */ PINCTRL_PIN(204, "COL[6]"), /* M19 */ PINCTRL_PIN(205, "CSN[0]"), /* M20 */ /* Row N */ PINCTRL_PIN(206, "DA[13]"), /* N1 */ PINCTRL_PIN(207, "DA[12]"), /* N2 */ PINCTRL_PIN(208, "DA[11]"), /* N3 */ PINCTRL_PIN(209, "AD[3]"), /* N4 */ PINCTRL_PIN(210, "CVDD"), /* N5 */ PINCTRL_PIN(211, "CVDD"), /* N6 */ PINCTRL_PIN(212, "GND"), /* N8 */ PINCTRL_PIN(213, "GND"), /* N9 */ PINCTRL_PIN(214, "GND"), /* N10 */ PINCTRL_PIN(215, "GND"), /* N11 */ PINCTRL_PIN(216, "GND"), /* N12 */ PINCTRL_PIN(217, "GND"), /* N13 */ PINCTRL_PIN(218, "GND"), /* N15 */ PINCTRL_PIN(219, "GND"), /* N16 */ PINCTRL_PIN(220, "XTALO"), /* N17 */ PINCTRL_PIN(221, "COL[0]"), /* N18 */ PINCTRL_PIN(222, "COL[1]"), /* N19 */ PINCTRL_PIN(223, "COL[2]"), /* N20 */ /* Row P */ PINCTRL_PIN(224, "AD[4]"), /* P1 */ PINCTRL_PIN(225, "DA[10]"), /* P2 */ PINCTRL_PIN(226, "DA[9]"), /* P3 */ PINCTRL_PIN(227, "BRIGHT"), /* P4 */ PINCTRL_PIN(228, "RVDD"), /* P5 */ PINCTRL_PIN(229, "RVDD"), /* P6 */ PINCTRL_PIN(230, "RVDD"), /* P15 */ PINCTRL_PIN(231, "RVDD"), /* P16 */ PINCTRL_PIN(232, "XTALI"), /* P17 */ PINCTRL_PIN(233, "PLL_VDD"), /* P18 */ PINCTRL_PIN(234, "ROW[6]"), /* P19 */ PINCTRL_PIN(235, "ROW[7]"), /* P20 */ /* Row R */ PINCTRL_PIN(236, "AD[2]"), /* R1 */ PINCTRL_PIN(237, "AD[1]"), /* R2 */ PINCTRL_PIN(238, "P[17]"), /* R3 */ PINCTRL_PIN(239, "P[14]"), /* R4 */ PINCTRL_PIN(240, "RVDD"), /* R5 */ PINCTRL_PIN(241, "RVDD"), /* R6 */ PINCTRL_PIN(242, "GND"), /* R7 */ PINCTRL_PIN(243, "CVDD"), /* R8 */ PINCTRL_PIN(244, "CVDD"), /* R13 */ PINCTRL_PIN(245, "GND"), /* R14 */ PINCTRL_PIN(246, "RVDD"), /* R15 */ PINCTRL_PIN(247, "RVDD"), /* R16 */ PINCTRL_PIN(248, "ROW[0]"), /* R17 */ PINCTRL_PIN(249, "ROW[3]"), /* R18 */ PINCTRL_PIN(250, "PLL_GND"), /* R19 */ PINCTRL_PIN(251, "ROW[5]"), /* R20 */ /* Row T */ PINCTRL_PIN(252, "DA[8]"), /* T1 */ PINCTRL_PIN(253, "BLANK"), /* T2 */ PINCTRL_PIN(254, "P[13]"), /* T3 */ PINCTRL_PIN(255, "SPCLK"), /* T4 */ PINCTRL_PIN(256, "V_CSYNC"), /* T5 */ PINCTRL_PIN(257, "DD[14]"), /* T6 */ PINCTRL_PIN(258, "GND"), /* T7 */ PINCTRL_PIN(259, "CVDD"), /* T8 */ PINCTRL_PIN(260, "RVDD"), /* T9 */ PINCTRL_PIN(261, "GND"), /* T10 */ PINCTRL_PIN(262, "GND"), /* T11 */ PINCTRL_PIN(263, "RVDD"), /* T12 */ PINCTRL_PIN(264, "CVDD"), /* T13 */ PINCTRL_PIN(265, "GND"), /* T14 */ PINCTRL_PIN(266, "INT[0]"), /* T15 */ PINCTRL_PIN(267, "USBM[1]"), /* T16 */ PINCTRL_PIN(268, "RXD[0]"), /* T17 */ PINCTRL_PIN(269, "TXD[2]"), /* T18 */ PINCTRL_PIN(270, "ROW[2]"), /* T19 */ PINCTRL_PIN(271, "ROW[4]"), /* T20 */ /* Row U */ PINCTRL_PIN(272, "AD[0]"), /* U1 */ PINCTRL_PIN(273, "P[15]"), /* U2 */ PINCTRL_PIN(274, "P[10]"), /* U3 */ PINCTRL_PIN(275, "P[7]"), /* U4 */ PINCTRL_PIN(276, "P[6]"), /* U5 */ PINCTRL_PIN(277, "P[4]"), /* U6 */ PINCTRL_PIN(278, "P[0]"), /* U7 */ PINCTRL_PIN(279, "AD[13]"), /* U8 */ PINCTRL_PIN(280, "DA[3]"), /* U9 */ PINCTRL_PIN(281, "DA[0]"), /* U10 */ PINCTRL_PIN(282, "DSRN"), /* U11 */ PINCTRL_PIN(283, "BOOT[1]"), /* U12 */ PINCTRL_PIN(284, "NC"), /* U13 */ PINCTRL_PIN(285, "SSPRX1"), /* U14 */ PINCTRL_PIN(286, "INT[1]"), /* U15 */ PINCTRL_PIN(287, "PWMOUT"), /* U16 */ PINCTRL_PIN(288, "USBM[0]"), /* U17 */ PINCTRL_PIN(289, "RXD[1]"), /* U18 */ PINCTRL_PIN(290, "TXD[1]"), /* U19 */ PINCTRL_PIN(291, "ROW[1]"), /* U20 */ /* Row V */ PINCTRL_PIN(292, "P[16]"), /* V1 */ PINCTRL_PIN(293, "P[11]"), /* V2 */ PINCTRL_PIN(294, "P[8]"), /* V3 */ PINCTRL_PIN(295, "DD[15]"), /* V4 */ PINCTRL_PIN(296, "DD[13]"), /* V5 */ PINCTRL_PIN(297, "P[1]"), /* V6 */ PINCTRL_PIN(298, "AD[14]"), /* V7 */ PINCTRL_PIN(299, "AD[12]"), /* V8 */ PINCTRL_PIN(300, "DA[2]"), /* V9 */ PINCTRL_PIN(301, "IDECS0N"), /* V10 */ PINCTRL_PIN(302, "IDEDA[2]"), /* V11 */ PINCTRL_PIN(303, "TDI"), /* V12 */ PINCTRL_PIN(304, "GND"), /* V13 */ PINCTRL_PIN(305, "ASYNC"), /* V14 */ PINCTRL_PIN(306, "SSPTX1"), /* V15 */ PINCTRL_PIN(307, "INT[2]"), /* V16 */ PINCTRL_PIN(308, "RTSN"), /* V17 */ PINCTRL_PIN(309, "USBP[0]"), /* V18 */ PINCTRL_PIN(310, "CTSN"), /* V19 */ PINCTRL_PIN(311, "TXD[0]"), /* V20 */ /* Row W */ PINCTRL_PIN(312, "P[12]"), /* W1 */ PINCTRL_PIN(313, "P[9]"), /* W2 */ PINCTRL_PIN(314, "DD[0]"), /* W3 */ PINCTRL_PIN(315, "P[5]"), /* W4 */ PINCTRL_PIN(316, "P[3]"), /* W5 */ PINCTRL_PIN(317, "DA[7]"), /* W6 */ PINCTRL_PIN(318, "DA[5]"), /* W7 */ PINCTRL_PIN(319, "AD[11]"), /* W8 */ PINCTRL_PIN(320, "AD[9]"), /* W9 */ PINCTRL_PIN(321, "IDECS1N"), /* W10 */ PINCTRL_PIN(322, "IDEDA[1]"), /* W11 */ PINCTRL_PIN(323, "TCK"), /* W12 */ PINCTRL_PIN(324, "TMS"), /* W13 */ PINCTRL_PIN(325, "EECLK"), /* W14 */ PINCTRL_PIN(326, "SCLK1"), /* W15 */ PINCTRL_PIN(327, "GRLED"), /* W16 */ PINCTRL_PIN(328, "INT[3]"), /* W17 */ PINCTRL_PIN(329, "SLA[1]"), /* W18 */ PINCTRL_PIN(330, "SLA[0]"), /* W19 */ PINCTRL_PIN(331, "RXD[2]"), /* W20 */ /* Row Y */ PINCTRL_PIN(332, "HSYNC"), /* Y1 */ PINCTRL_PIN(333, "DD[1]"), /* Y2 */ PINCTRL_PIN(334, "DD[12]"), /* Y3 */ PINCTRL_PIN(335, "P[2]"), /* Y4 */ PINCTRL_PIN(336, "AD[15]"), /* Y5 */ PINCTRL_PIN(337, "DA[6]"), /* Y6 */ PINCTRL_PIN(338, "DA[4]"), /* Y7 */ PINCTRL_PIN(339, "AD[10]"), /* Y8 */ PINCTRL_PIN(340, "DA[1]"), /* Y9 */ PINCTRL_PIN(341, "AD[8]"), /* Y10 */ PINCTRL_PIN(342, "IDEDA[0]"), /* Y11 */ PINCTRL_PIN(343, "DTRN"), /* Y12 */ PINCTRL_PIN(344, "TDO"), /* Y13 */ PINCTRL_PIN(345, "BOOT[0]"), /* Y14 */ PINCTRL_PIN(346, "EEDAT"), /* Y15 */ PINCTRL_PIN(347, "ASDO"), /* Y16 */ PINCTRL_PIN(348, "SFRM1"), /* Y17 */ PINCTRL_PIN(349, "RDLED"), /* Y18 */ PINCTRL_PIN(350, "USBP[1]"), /* Y19 */ PINCTRL_PIN(351, "ABITCLK"), /* Y20 */ }; static const unsigned int ssp_ep9312_pins[] = { 285, 306, 326, 348, }; static const unsigned int ac97_ep9312_pins[] = { 77, 95, 305, 347, 351, }; static const unsigned int pwm_ep9312_pins[] = { 74 }; static const unsigned int gpio1a_ep9312_pins[] = { 74 }; static const unsigned int gpio2a_9312_pins[] = { 234, 235, 248, 249, 251, 270, 271, 291, }; static const unsigned int gpio3a_9312_pins[] = { 186, 187, 202, 203, 204, 221, 222, 223, }; static const unsigned int keypad_9312_pins[] = { 186, 187, 202, 203, 204, 221, 222, 223, 234, 235, 248, 249, 251, 270, 271, 291, }; static const unsigned int gpio4a_9312_pins[] = { 78, 301, 302, 321, 322, 342, }; static const unsigned int gpio6a_9312_pins[] = { 257, 295, 296, 334, }; static const unsigned int gpio7a_9312_pins[] = { 4, 24, 25, 45, 46, 66, 314, 333, }; static const unsigned int ide_9312_pins[] = { 78, 301, 302, 321, 322, 342, 257, 295, 296, 334, 4, 24, 25, 45, 46, 66, 314, 333, }; static const struct ep93xx_pin_group ep9312_pin_groups[] = { PMX_GROUP("ssp", ssp_ep9312_pins, EP93XX_SYSCON_DEVCFG_I2SONSSP, 0), PMX_GROUP("i2s_on_ssp", ssp_ep9312_pins, EP93XX_SYSCON_DEVCFG_I2SONSSP, EP93XX_SYSCON_DEVCFG_I2SONSSP), PMX_GROUP("pwm1", pwm_ep9312_pins, EP93XX_SYSCON_DEVCFG_PONG, EP93XX_SYSCON_DEVCFG_PONG), PMX_GROUP("gpio1agrp", gpio1a_ep9312_pins, EP93XX_SYSCON_DEVCFG_PONG, 0), PMX_GROUP("ac97", ac97_ep9312_pins, EP93XX_SYSCON_DEVCFG_I2SONAC97, 0), PMX_GROUP("i2s_on_ac97", ac97_ep9312_pins, EP93XX_SYSCON_DEVCFG_I2SONAC97, EP93XX_SYSCON_DEVCFG_I2SONAC97), PMX_GROUP("rasteronsdram0grp", raster_on_sdram0_pins, EP93XX_SYSCON_DEVCFG_RASONP3, 0), PMX_GROUP("rasteronsdram3grp", raster_on_sdram3_pins, EP93XX_SYSCON_DEVCFG_RASONP3, EP93XX_SYSCON_DEVCFG_RASONP3), PMX_GROUP("gpio2agrp", gpio2a_9312_pins, EP93XX_SYSCON_DEVCFG_GONK, EP93XX_SYSCON_DEVCFG_GONK), PMX_GROUP("gpio3agrp", gpio3a_9312_pins, EP93XX_SYSCON_DEVCFG_GONK, EP93XX_SYSCON_DEVCFG_GONK), PMX_GROUP("keypadgrp", keypad_9312_pins, EP93XX_SYSCON_DEVCFG_GONK, 0), PMX_GROUP("gpio4agrp", gpio4a_9312_pins, EP93XX_SYSCON_DEVCFG_EONIDE, EP93XX_SYSCON_DEVCFG_EONIDE), PMX_GROUP("gpio6agrp", gpio6a_9312_pins, EP93XX_SYSCON_DEVCFG_GONIDE, EP93XX_SYSCON_DEVCFG_GONIDE), PMX_GROUP("gpio7agrp", gpio7a_9312_pins, EP93XX_SYSCON_DEVCFG_HONIDE, EP93XX_SYSCON_DEVCFG_HONIDE), PMX_GROUP("idegrp", ide_9312_pins, EP93XX_SYSCON_DEVCFG_EONIDE | EP93XX_SYSCON_DEVCFG_GONIDE | EP93XX_SYSCON_DEVCFG_HONIDE, 0), }; static int ep93xx_get_groups_count(struct pinctrl_dev *pctldev) { struct ep93xx_pmx *pmx = pinctrl_dev_get_drvdata(pctldev); switch (pmx->model) { case EP93XX_9301_PINCTRL: return ARRAY_SIZE(ep9301_pin_groups); case EP93XX_9307_PINCTRL: return ARRAY_SIZE(ep9307_pin_groups); case EP93XX_9312_PINCTRL: return ARRAY_SIZE(ep9312_pin_groups); default: return 0; } } static const char *ep93xx_get_group_name(struct pinctrl_dev *pctldev, unsigned int selector) { struct ep93xx_pmx *pmx = pinctrl_dev_get_drvdata(pctldev); switch (pmx->model) { case EP93XX_9301_PINCTRL: return ep9301_pin_groups[selector].grp.name; case EP93XX_9307_PINCTRL: return ep9307_pin_groups[selector].grp.name; case EP93XX_9312_PINCTRL: return ep9312_pin_groups[selector].grp.name; default: return NULL; } } static int ep93xx_get_group_pins(struct pinctrl_dev *pctldev, unsigned int selector, const unsigned int **pins, unsigned int *num_pins) { struct ep93xx_pmx *pmx = pinctrl_dev_get_drvdata(pctldev); switch (pmx->model) { case EP93XX_9301_PINCTRL: *pins = ep9301_pin_groups[selector].grp.pins; *num_pins = ep9301_pin_groups[selector].grp.npins; break; case EP93XX_9307_PINCTRL: *pins = ep9307_pin_groups[selector].grp.pins; *num_pins = ep9307_pin_groups[selector].grp.npins; break; case EP93XX_9312_PINCTRL: *pins = ep9312_pin_groups[selector].grp.pins; *num_pins = ep9312_pin_groups[selector].grp.npins; break; default: return -EINVAL; } return 0; } static const struct pinctrl_ops ep93xx_pctrl_ops = { .get_groups_count = ep93xx_get_groups_count, .get_group_name = ep93xx_get_group_name, .get_group_pins = ep93xx_get_group_pins, .dt_node_to_map = pinconf_generic_dt_node_to_map_all, .dt_free_map = pinconf_generic_dt_free_map, }; static const char * const spigrps[] = { "ssp" }; static const char * const ac97grps[] = { "ac97" }; static const char * const i2sgrps[] = { "i2s_on_ssp", "i2s_on_ac97" }; static const char * const pwm1grps[] = { "pwm1" }; static const char * const gpiogrps[] = { "gpio1agrp", "gpio2agrp", "gpio3agrp", "gpio4agrp", "gpio6agrp", "gpio7agrp" }; static const char * const rastergrps[] = { "rasteronsdram0grp", "rasteronsdram3grp"}; static const char * const keypadgrps[] = { "keypadgrp"}; static const char * const idegrps[] = { "idegrp"}; static const struct pinfunction ep93xx_pmx_functions[] = { PINCTRL_PINFUNCTION("spi", spigrps, ARRAY_SIZE(spigrps)), PINCTRL_PINFUNCTION("ac97", ac97grps, ARRAY_SIZE(ac97grps)), PINCTRL_PINFUNCTION("i2s", i2sgrps, ARRAY_SIZE(i2sgrps)), PINCTRL_PINFUNCTION("pwm", pwm1grps, ARRAY_SIZE(pwm1grps)), PINCTRL_PINFUNCTION("keypad", keypadgrps, ARRAY_SIZE(keypadgrps)), PINCTRL_PINFUNCTION("pata", idegrps, ARRAY_SIZE(idegrps)), PINCTRL_PINFUNCTION("lcd", rastergrps, ARRAY_SIZE(rastergrps)), PINCTRL_PINFUNCTION("gpio", gpiogrps, ARRAY_SIZE(gpiogrps)), }; static int ep93xx_pmx_set_mux(struct pinctrl_dev *pctldev, unsigned int selector, unsigned int group) { struct ep93xx_pmx *pmx; const struct pinfunction *func; const struct ep93xx_pin_group *grp; u32 before, after, expected; unsigned long tmp; int i; pmx = pinctrl_dev_get_drvdata(pctldev); switch (pmx->model) { case EP93XX_9301_PINCTRL: grp = &ep9301_pin_groups[group]; break; case EP93XX_9307_PINCTRL: grp = &ep9307_pin_groups[group]; break; case EP93XX_9312_PINCTRL: grp = &ep9312_pin_groups[group]; break; default: dev_err(pmx->dev, "invalid SoC type\n"); return -ENODEV; } func = &ep93xx_pmx_functions[selector]; dev_dbg(pmx->dev, "ACTIVATE function \"%s\" with group \"%s\" (mask=0x%x, value=0x%x)\n", func->name, grp->grp.name, grp->mask, grp->value); regmap_read(pmx->map, EP93XX_SYSCON_DEVCFG, &before); ep93xx_pinctrl_update_bits(pmx, EP93XX_SYSCON_DEVCFG, grp->mask, grp->value); regmap_read(pmx->map, EP93XX_SYSCON_DEVCFG, &after); dev_dbg(pmx->dev, "before=0x%x, after=0x%x, mask=0x%lx\n", before, after, PADS_MASK); /* Which bits changed */ before &= PADS_MASK; after &= PADS_MASK; expected = before & ~grp->mask; expected |= grp->value; expected &= PADS_MASK; /* Print changed states */ tmp = expected ^ after; for_each_set_bit(i, &tmp, PADS_MAXBIT) { bool enabled = expected & BIT(i); dev_err(pmx->dev, "pin group %s could not be %s: probably a hardware limitation\n", ep93xx_padgroups[i], str_enabled_disabled(enabled)); dev_err(pmx->dev, "DeviceCfg before: %08x, after %08x, expected %08x\n", before, after, expected); } return tmp ? -EINVAL : 0; }; static int ep93xx_pmx_get_funcs_count(struct pinctrl_dev *pctldev) { return ARRAY_SIZE(ep93xx_pmx_functions); } static const char *ep93xx_pmx_get_func_name(struct pinctrl_dev *pctldev, unsigned int selector) { return ep93xx_pmx_functions[selector].name; } static int ep93xx_pmx_get_groups(struct pinctrl_dev *pctldev, unsigned int selector, const char * const **groups, unsigned int * const num_groups) { *groups = ep93xx_pmx_functions[selector].groups; *num_groups = ep93xx_pmx_functions[selector].ngroups; return 0; } static const struct pinmux_ops ep93xx_pmx_ops = { .get_functions_count = ep93xx_pmx_get_funcs_count, .get_function_name = ep93xx_pmx_get_func_name, .get_function_groups = ep93xx_pmx_get_groups, .set_mux = ep93xx_pmx_set_mux, }; static struct pinctrl_desc ep93xx_pmx_desc = { .name = DRIVER_NAME, .pctlops = &ep93xx_pctrl_ops, .pmxops = &ep93xx_pmx_ops, .owner = THIS_MODULE, }; static int ep93xx_pmx_probe(struct auxiliary_device *adev, const struct auxiliary_device_id *id) { struct ep93xx_regmap_adev *rdev = to_ep93xx_regmap_adev(adev); struct device *dev = &adev->dev; struct ep93xx_pmx *pmx; /* Create state holders etc for this driver */ pmx = devm_kzalloc(dev, sizeof(*pmx), GFP_KERNEL); if (!pmx) return -ENOMEM; pmx->dev = dev; pmx->map = rdev->map; pmx->aux_dev = rdev; pmx->model = (enum ep93xx_pinctrl_model)(uintptr_t)id->driver_data; switch (pmx->model) { case EP93XX_9301_PINCTRL: ep93xx_pmx_desc.pins = ep9301_pins; ep93xx_pmx_desc.npins = ARRAY_SIZE(ep9301_pins); dev_info(dev, "detected 9301/9302 chip variant\n"); break; case EP93XX_9307_PINCTRL: ep93xx_pmx_desc.pins = ep9307_pins; ep93xx_pmx_desc.npins = ARRAY_SIZE(ep9307_pins); dev_info(dev, "detected 9307 chip variant\n"); break; case EP93XX_9312_PINCTRL: ep93xx_pmx_desc.pins = ep9312_pins; ep93xx_pmx_desc.npins = ARRAY_SIZE(ep9312_pins); dev_info(dev, "detected 9312/9315 chip variant\n"); break; default: return dev_err_probe(dev, -EINVAL, "unknown pin control model: %u\n", pmx->model); } /* using parent of_node to match in get_pinctrl_dev_from_of_node() */ device_set_node(dev, dev_fwnode(adev->dev.parent)); pmx->pctl = devm_pinctrl_register(dev, &ep93xx_pmx_desc, pmx); if (IS_ERR(pmx->pctl)) return dev_err_probe(dev, PTR_ERR(pmx->pctl), "could not register pinmux driver\n"); return 0; }; static const struct auxiliary_device_id ep93xx_pinctrl_ids[] = { { .name = "soc_ep93xx.pinctrl-ep9301", .driver_data = (kernel_ulong_t)EP93XX_9301_PINCTRL, }, { .name = "soc_ep93xx.pinctrl-ep9307", .driver_data = (kernel_ulong_t)EP93XX_9307_PINCTRL, }, { .name = "soc_ep93xx.pinctrl-ep9312", .driver_data = (kernel_ulong_t)EP93XX_9312_PINCTRL, }, { /* sentinel */ } }; MODULE_DEVICE_TABLE(auxiliary, ep93xx_pinctrl_ids); static struct auxiliary_driver ep93xx_pmx_driver = { .probe = ep93xx_pmx_probe, .id_table = ep93xx_pinctrl_ids, }; module_auxiliary_driver(ep93xx_pmx_driver);