xref: /freebsd/sys/dev/amdgpio/amdgpio.h (revision 95ee2897e98f5d444f26ed2334cc7c439f9c16c6)
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