18ce574deSOleksandr Tymoshenko /*- 2*4d846d26SWarner Losh * SPDX-License-Identifier: BSD-2-Clause 38ce574deSOleksandr Tymoshenko * 48ce574deSOleksandr Tymoshenko * Copyright (c) 2018 Advanced Micro Devices 58ce574deSOleksandr Tymoshenko * All rights reserved. 68ce574deSOleksandr Tymoshenko * 78ce574deSOleksandr Tymoshenko * Redistribution and use in source and binary forms, with or without 88ce574deSOleksandr Tymoshenko * modification, are permitted provided that the following conditions 98ce574deSOleksandr Tymoshenko * are met: 108ce574deSOleksandr Tymoshenko * 1. Redistributions of source code must retain the above copyright 118ce574deSOleksandr Tymoshenko * notice, this list of conditions and the following disclaimer. 128ce574deSOleksandr Tymoshenko * 2. Redistributions in binary form must reproduce the above copyright 138ce574deSOleksandr Tymoshenko * notice, this list of conditions and the following disclaimer in the 148ce574deSOleksandr Tymoshenko * documentation and/or other materials provided with the distribution. 158ce574deSOleksandr Tymoshenko * 168ce574deSOleksandr Tymoshenko * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 178ce574deSOleksandr Tymoshenko * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 188ce574deSOleksandr Tymoshenko * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 198ce574deSOleksandr Tymoshenko * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 208ce574deSOleksandr Tymoshenko * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 218ce574deSOleksandr Tymoshenko * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 228ce574deSOleksandr Tymoshenko * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 238ce574deSOleksandr Tymoshenko * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 248ce574deSOleksandr Tymoshenko * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 258ce574deSOleksandr Tymoshenko * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 268ce574deSOleksandr Tymoshenko * SUCH DAMAGE. 278ce574deSOleksandr Tymoshenko */ 288ce574deSOleksandr Tymoshenko 298ce574deSOleksandr Tymoshenko #ifdef DEBUG 308ce574deSOleksandr Tymoshenko #define dprintf(fmt, args...) do { \ 318ce574deSOleksandr Tymoshenko printf("%s(): ", __func__); \ 328ce574deSOleksandr Tymoshenko printf(fmt,##args); \ 338ce574deSOleksandr Tymoshenko } while (0) 348ce574deSOleksandr Tymoshenko #else 358ce574deSOleksandr Tymoshenko #define dprintf(fmt, args...) 368ce574deSOleksandr Tymoshenko #endif 378ce574deSOleksandr Tymoshenko 388ce574deSOleksandr Tymoshenko #define AMD_GPIO_PREFIX "AMDGPIO" 398ce574deSOleksandr Tymoshenko 408ce574deSOleksandr Tymoshenko #define AMD_GPIO_NUM_PIN_BANK 4 418ce574deSOleksandr Tymoshenko #define AMD_GPIO_PINS_PER_BANK 64 428ce574deSOleksandr Tymoshenko #define AMD_GPIO_PINS_MAX 256 /* 4 banks * 64 pins */ 438ce574deSOleksandr Tymoshenko 448ce574deSOleksandr Tymoshenko /* Number of pins in each bank */ 458ce574deSOleksandr Tymoshenko #define AMD_GPIO_PINS_BANK0 63 468ce574deSOleksandr Tymoshenko #define AMD_GPIO_PINS_BANK1 64 478ce574deSOleksandr Tymoshenko #define AMD_GPIO_PINS_BANK2 56 488ce574deSOleksandr Tymoshenko #define AMD_GPIO_PINS_BANK3 32 498ce574deSOleksandr Tymoshenko #define AMD_GPIO_PIN_PRESENT (AMD_GPIO_PINS_BANK0 + \ 508ce574deSOleksandr Tymoshenko AMD_GPIO_PINS_BANK1 + \ 518ce574deSOleksandr Tymoshenko AMD_GPIO_PINS_BANK2 + \ 528ce574deSOleksandr Tymoshenko AMD_GPIO_PINS_BANK3) 538ce574deSOleksandr Tymoshenko #define AMDGPIO_DEFAULT_CAPS (GPIO_PIN_INPUT | GPIO_PIN_OUTPUT) 548ce574deSOleksandr Tymoshenko 558ce574deSOleksandr Tymoshenko /* Register related macros */ 568ce574deSOleksandr Tymoshenko #define AMDGPIO_PIN_REGISTER(pin) (pin * 4) 578ce574deSOleksandr Tymoshenko 588ce574deSOleksandr Tymoshenko #define WAKE_INT_MASTER_REG 0xfc 598ce574deSOleksandr Tymoshenko #define EOI_MASK (1 << 29) 608ce574deSOleksandr Tymoshenko #define WAKE_INT_STATUS_REG0 0x2f8 618ce574deSOleksandr Tymoshenko #define WAKE_INT_STATUS_REG1 0x2fc 628ce574deSOleksandr Tymoshenko 638ce574deSOleksandr Tymoshenko /* Bit definition of 32 bits of each pin register */ 648ce574deSOleksandr Tymoshenko #define DB_TMR_OUT_OFF 0 658ce574deSOleksandr Tymoshenko #define DB_TMR_OUT_UNIT_OFF 4 668ce574deSOleksandr Tymoshenko #define DB_CNTRL_OFF 5 678ce574deSOleksandr Tymoshenko #define DB_TMR_LARGE_OFF 7 688ce574deSOleksandr Tymoshenko #define LEVEL_TRIG_OFF 8 698ce574deSOleksandr Tymoshenko #define ACTIVE_LEVEL_OFF 9 708ce574deSOleksandr Tymoshenko #define INTERRUPT_ENABLE_OFF 11 718ce574deSOleksandr Tymoshenko #define INTERRUPT_MASK_OFF 12 728ce574deSOleksandr Tymoshenko #define WAKE_CNTRL_OFF_S0I3 13 738ce574deSOleksandr Tymoshenko #define WAKE_CNTRL_OFF_S3 14 748ce574deSOleksandr Tymoshenko #define WAKE_CNTRL_OFF_S4 15 758ce574deSOleksandr Tymoshenko #define PIN_STS_OFF 16 768ce574deSOleksandr Tymoshenko #define DRV_STRENGTH_SEL_OFF 17 778ce574deSOleksandr Tymoshenko #define PULL_UP_SEL_OFF 19 788ce574deSOleksandr Tymoshenko #define PULL_UP_ENABLE_OFF 20 798ce574deSOleksandr Tymoshenko #define PULL_DOWN_ENABLE_OFF 21 808ce574deSOleksandr Tymoshenko #define OUTPUT_VALUE_OFF 22 818ce574deSOleksandr Tymoshenko #define OUTPUT_ENABLE_OFF 23 828ce574deSOleksandr Tymoshenko #define SW_CNTRL_IN_OFF 24 838ce574deSOleksandr Tymoshenko #define SW_CNTRL_EN_OFF 25 848ce574deSOleksandr Tymoshenko #define INTERRUPT_STS_OFF 28 858ce574deSOleksandr Tymoshenko #define WAKE_STS_OFF 29 868ce574deSOleksandr Tymoshenko 878ce574deSOleksandr Tymoshenko #define DB_TMR_OUT_MASK 0xFUL 888ce574deSOleksandr Tymoshenko #define DB_CNTRL_MASK 0x3UL 898ce574deSOleksandr Tymoshenko #define ACTIVE_LEVEL_MASK 0x3UL 908ce574deSOleksandr Tymoshenko #define DRV_STRENGTH_SEL_MASK 0x3UL 918ce574deSOleksandr Tymoshenko 928ce574deSOleksandr Tymoshenko #define DB_TYPE_NO_DEBOUNCE 0x0UL 938ce574deSOleksandr Tymoshenko #define DB_TYPE_PRESERVE_LOW_GLITCH 0x1UL 948ce574deSOleksandr Tymoshenko #define DB_TYPE_PRESERVE_HIGH_GLITCH 0x2UL 958ce574deSOleksandr Tymoshenko #define DB_TYPE_REMOVE_GLITCH 0x3UL 968ce574deSOleksandr Tymoshenko 978ce574deSOleksandr Tymoshenko #define EDGE_TRIGGER 0x0UL 988ce574deSOleksandr Tymoshenko #define LEVEL_TRIGGER 0x1UL 998ce574deSOleksandr Tymoshenko 1008ce574deSOleksandr Tymoshenko #define ACTIVE_HIGH 0x0UL 1018ce574deSOleksandr Tymoshenko #define ACTIVE_LOW 0x1UL 1028ce574deSOleksandr Tymoshenko #define BOTH_EDGE 0x2UL 1038ce574deSOleksandr Tymoshenko 1048ce574deSOleksandr Tymoshenko #define ENABLE_INTERRUPT 0x1UL 1058ce574deSOleksandr Tymoshenko #define DISABLE_INTERRUPT 0x0UL 1068ce574deSOleksandr Tymoshenko 1078ce574deSOleksandr Tymoshenko #define ENABLE_INTERRUPT_MASK 0x0UL 1088ce574deSOleksandr Tymoshenko #define DISABLE_INTERRUPT_MASK 0x1UL 1098ce574deSOleksandr Tymoshenko #define CLR_INTR_STAT 0x1UL 1108ce574deSOleksandr Tymoshenko 1118ce574deSOleksandr Tymoshenko #define BIT(bit) (1 << bit) 1128ce574deSOleksandr Tymoshenko #define GPIO_PIN_INFO(p, n) { .pin_num = (p), .pin_name = (n) } 1138ce574deSOleksandr Tymoshenko 1148ce574deSOleksandr Tymoshenko struct pin_info { 1158ce574deSOleksandr Tymoshenko int pin_num; 1168ce574deSOleksandr Tymoshenko char *pin_name; 1178ce574deSOleksandr Tymoshenko }; 1188ce574deSOleksandr Tymoshenko 1198ce574deSOleksandr Tymoshenko /* Pins exposed to drivers */ 1208ce574deSOleksandr Tymoshenko static const struct pin_info kernzp_pins[] = { 1218ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(0, "PIN_0"), 1228ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(1, "PIN_1"), 1238ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(2, "PIN_2"), 1248ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(3, "PIN_3"), 1258ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(4, "PIN_4"), 1268ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(5, "PIN_5"), 1278ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(6, "PIN_6"), 1288ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(7, "PIN_7"), 1298ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(8, "PIN_8"), 1308ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(9, "PIN_9"), 1318ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(10, "PIN_10"), 1328ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(11, "PIN_11"), 1338ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(12, "PIN_12"), 1348ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(13, "PIN_13"), 1358ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(14, "PIN_14"), 1368ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(15, "PIN_15"), 1378ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(16, "PIN_16"), 1388ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(17, "PIN_17"), 1398ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(18, "PIN_18"), 1408ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(19, "PIN_19"), 1418ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(20, "PIN_20"), 1428ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(23, "PIN_23"), 1438ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(24, "PIN_24"), 1448ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(25, "PIN_25"), 1458ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(26, "PIN_26"), 1468ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(39, "PIN_39"), 1478ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(40, "PIN_40"), 1488ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(43, "PIN_43"), 1498ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(46, "PIN_46"), 1508ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(47, "PIN_47"), 1518ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(48, "PIN_48"), 1528ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(49, "PIN_49"), 1538ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(50, "PIN_50"), 1548ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(51, "PIN_51"), 1558ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(52, "PIN_52"), 1568ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(53, "PIN_53"), 1578ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(54, "PIN_54"), 1588ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(55, "PIN_55"), 1598ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(56, "PIN_56"), 1608ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(57, "PIN_57"), 1618ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(58, "PIN_58"), 1628ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(59, "PIN_59"), 1638ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(60, "PIN_60"), 1648ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(61, "PIN_61"), 1658ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(62, "PIN_62"), 1668ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(64, "PIN_64"), 1678ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(65, "PIN_65"), 1688ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(66, "PIN_66"), 1698ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(68, "PIN_68"), 1708ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(69, "PIN_69"), 1718ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(70, "PIN_70"), 1728ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(71, "PIN_71"), 1738ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(72, "PIN_72"), 1748ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(74, "PIN_74"), 1758ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(75, "PIN_75"), 1768ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(76, "PIN_76"), 1778ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(84, "PIN_84"), 1788ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(85, "PIN_85"), 1798ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(86, "PIN_86"), 1808ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(87, "PIN_87"), 1818ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(88, "PIN_88"), 1828ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(89, "PIN_89"), 1838ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(90, "PIN_90"), 1848ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(91, "PIN_91"), 1858ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(92, "PIN_92"), 1868ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(93, "PIN_93"), 1878ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(95, "PIN_95"), 1888ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(96, "PIN_96"), 1898ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(97, "PIN_97"), 1908ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(98, "PIN_98"), 1918ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(99, "PIN_99"), 1928ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(100, "PIN_100"), 1938ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(101, "PIN_101"), 1948ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(102, "PIN_102"), 1958ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(113, "PIN_113"), 1968ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(114, "PIN_114"), 1978ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(115, "PIN_115"), 1988ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(116, "PIN_116"), 1998ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(117, "PIN_117"), 2008ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(118, "PIN_118"), 2018ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(119, "PIN_119"), 2028ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(120, "PIN_120"), 2038ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(121, "PIN_121"), 2048ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(122, "PIN_122"), 2058ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(126, "PIN_126"), 2068ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(129, "PIN_129"), 2078ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(130, "PIN_130"), 2088ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(131, "PIN_131"), 2098ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(132, "PIN_132"), 2108ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(133, "PIN_133"), 2118ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(135, "PIN_135"), 2128ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(136, "PIN_136"), 2138ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(137, "PIN_137"), 2148ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(138, "PIN_138"), 2158ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(139, "PIN_139"), 2168ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(140, "PIN_140"), 2178ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(141, "PIN_141"), 2188ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(142, "PIN_142"), 2198ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(143, "PIN_143"), 2208ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(144, "PIN_144"), 2218ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(145, "PIN_145"), 2228ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(146, "PIN_146"), 2238ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(147, "PIN_147"), 2248ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(148, "PIN_148"), 2258ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(166, "PIN_166"), 2268ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(167, "PIN_167"), 2278ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(168, "PIN_168"), 2288ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(169, "PIN_169"), 2298ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(170, "PIN_170"), 2308ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(171, "PIN_171"), 2318ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(172, "PIN_172"), 2328ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(173, "PIN_173"), 2338ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(174, "PIN_174"), 2348ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(175, "PIN_175"), 2358ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(176, "PIN_176"), 2368ce574deSOleksandr Tymoshenko GPIO_PIN_INFO(177, "PIN_177"), 2378ce574deSOleksandr Tymoshenko }; 2388ce574deSOleksandr Tymoshenko 2398ce574deSOleksandr Tymoshenko #define AMD_GPIO_PINS_EXPOSED nitems(kernzp_pins) 2408ce574deSOleksandr Tymoshenko 2418ce574deSOleksandr Tymoshenko static const unsigned i2c0_pins[] = {145, 146}; 2428ce574deSOleksandr Tymoshenko static const unsigned i2c1_pins[] = {147, 148}; 2438ce574deSOleksandr Tymoshenko static const unsigned i2c2_pins[] = {113, 114}; 2448ce574deSOleksandr Tymoshenko static const unsigned i2c3_pins[] = {19, 20}; 2458ce574deSOleksandr Tymoshenko static const unsigned i2c4_pins[] = {149, 150}; 2468ce574deSOleksandr Tymoshenko static const unsigned i2c5_pins[] = {151, 152}; 2478ce574deSOleksandr Tymoshenko 2488ce574deSOleksandr Tymoshenko static const unsigned uart0_pins[] = {135, 136, 137, 138, 139}; 2498ce574deSOleksandr Tymoshenko static const unsigned uart1_pins[] = {140, 141, 142, 143, 144}; 2508ce574deSOleksandr Tymoshenko 2518ce574deSOleksandr Tymoshenko struct amd_pingroup { 2528ce574deSOleksandr Tymoshenko const char *name; 2538ce574deSOleksandr Tymoshenko const unsigned *pins; 2548ce574deSOleksandr Tymoshenko unsigned npins; 2558ce574deSOleksandr Tymoshenko }; 2568ce574deSOleksandr Tymoshenko 2578ce574deSOleksandr Tymoshenko static const struct amd_pingroup kernzp_groups[] = { 2588ce574deSOleksandr Tymoshenko { 2598ce574deSOleksandr Tymoshenko .name = "i2c0", 2608ce574deSOleksandr Tymoshenko .pins = i2c0_pins, 2618ce574deSOleksandr Tymoshenko .npins = 2, 2628ce574deSOleksandr Tymoshenko }, 2638ce574deSOleksandr Tymoshenko { 2648ce574deSOleksandr Tymoshenko .name = "i2c1", 2658ce574deSOleksandr Tymoshenko .pins = i2c1_pins, 2668ce574deSOleksandr Tymoshenko .npins = 2, 2678ce574deSOleksandr Tymoshenko }, 2688ce574deSOleksandr Tymoshenko { 2698ce574deSOleksandr Tymoshenko .name = "i2c2", 2708ce574deSOleksandr Tymoshenko .pins = i2c2_pins, 2718ce574deSOleksandr Tymoshenko .npins = 2, 2728ce574deSOleksandr Tymoshenko }, 2738ce574deSOleksandr Tymoshenko { 2748ce574deSOleksandr Tymoshenko .name = "i2c3", 2758ce574deSOleksandr Tymoshenko .pins = i2c3_pins, 2768ce574deSOleksandr Tymoshenko .npins = 2, 2778ce574deSOleksandr Tymoshenko }, 2788ce574deSOleksandr Tymoshenko { 2798ce574deSOleksandr Tymoshenko .name = "i2c4", 2808ce574deSOleksandr Tymoshenko .pins = i2c4_pins, 2818ce574deSOleksandr Tymoshenko .npins = 2, 2828ce574deSOleksandr Tymoshenko }, 2838ce574deSOleksandr Tymoshenko { 2848ce574deSOleksandr Tymoshenko .name = "i2c5", 2858ce574deSOleksandr Tymoshenko .pins = i2c5_pins, 2868ce574deSOleksandr Tymoshenko .npins = 2, 2878ce574deSOleksandr Tymoshenko }, 2888ce574deSOleksandr Tymoshenko { 2898ce574deSOleksandr Tymoshenko .name = "uart0", 2908ce574deSOleksandr Tymoshenko .pins = uart0_pins, 2918ce574deSOleksandr Tymoshenko .npins = 5, 2928ce574deSOleksandr Tymoshenko }, 2938ce574deSOleksandr Tymoshenko { 2948ce574deSOleksandr Tymoshenko .name = "uart1", 2958ce574deSOleksandr Tymoshenko .pins = uart1_pins, 2968ce574deSOleksandr Tymoshenko .npins = 5, 2978ce574deSOleksandr Tymoshenko }, 2988ce574deSOleksandr Tymoshenko }; 2998ce574deSOleksandr Tymoshenko 3008ce574deSOleksandr Tymoshenko /* Macros for driver mutex locking */ 3018ce574deSOleksandr Tymoshenko #define AMDGPIO_LOCK_INIT(_sc) \ 3028ce574deSOleksandr Tymoshenko mtx_init(&_sc->sc_mtx, device_get_nameunit((_sc)->sc_dev), \ 3038ce574deSOleksandr Tymoshenko "amdgpio", MTX_SPIN) 3048ce574deSOleksandr Tymoshenko #define AMDGPIO_LOCK_DESTROY(_sc) mtx_destroy(&(_sc)->sc_mtx) 3058ce574deSOleksandr Tymoshenko #define AMDGPIO_LOCK(_sc) mtx_lock_spin(&(_sc)->sc_mtx) 3068ce574deSOleksandr Tymoshenko #define AMDGPIO_UNLOCK(_sc) mtx_unlock_spin(&(_sc)->sc_mtx) 3078ce574deSOleksandr Tymoshenko #define AMDGPIO_ASSERT_LOCKED(_sc) mtx_assert(&(_sc)->sc_mtx, MA_OWNED) 3088ce574deSOleksandr Tymoshenko #define AMDGPIO_ASSERT_UNLOCKED(_sc) mtx_assert(&(_sc)->sc_mtx, MA_NOTOWNED) 3098ce574deSOleksandr Tymoshenko 3108ce574deSOleksandr Tymoshenko struct amdgpio_softc { 3118ce574deSOleksandr Tymoshenko ACPI_HANDLE sc_handle; 3128ce574deSOleksandr Tymoshenko device_t sc_dev; 3138ce574deSOleksandr Tymoshenko device_t sc_busdev; 3148ce574deSOleksandr Tymoshenko const char* sc_bank_prefix; 3158ce574deSOleksandr Tymoshenko int sc_nbanks; 3168ce574deSOleksandr Tymoshenko int sc_npins; 3178ce574deSOleksandr Tymoshenko int sc_ngroups; 3188ce574deSOleksandr Tymoshenko struct mtx sc_mtx; 3198ce574deSOleksandr Tymoshenko struct resource *sc_res[AMD_GPIO_NUM_PIN_BANK + 1]; 3208ce574deSOleksandr Tymoshenko bus_space_tag_t sc_bst; 3218ce574deSOleksandr Tymoshenko bus_space_handle_t sc_bsh; 3228ce574deSOleksandr Tymoshenko struct gpio_pin sc_gpio_pins[AMD_GPIO_PINS_MAX]; 3238ce574deSOleksandr Tymoshenko const struct pin_info *sc_pin_info; 3248ce574deSOleksandr Tymoshenko const struct amd_pingroup *sc_groups; 3258ce574deSOleksandr Tymoshenko }; 3268ce574deSOleksandr Tymoshenko 3278ce574deSOleksandr Tymoshenko struct amdgpio_sysctl { 3288ce574deSOleksandr Tymoshenko struct amdgpio_softc *sc; 3298ce574deSOleksandr Tymoshenko uint32_t pin; 3308ce574deSOleksandr Tymoshenko }; 331