x86: Add definitions for APU6 platform
The board is similar to an APU4 except it has an SFP cage for eth0. Signed-off-by: Philip Prindeville <philipp@redfish-solutions.com> Signed-off-by: Petr Štetiar <ynezz@true.cz> [patch refresh]
This commit is contained in:
		 Philip Prindeville
					Philip Prindeville
				
			
				
					committed by
					
						 Petr Štetiar
						Petr Štetiar
					
				
			
			
				
	
			
			
			 Petr Štetiar
						Petr Štetiar
					
				
			
						parent
						
							5c3679e39b
						
					
				
				
					commit
					5ffa8d06c8
				
			
							
								
								
									
										280
									
								
								target/linux/x86/patches-5.15/103-pcengines_apu6_platform.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										280
									
								
								target/linux/x86/patches-5.15/103-pcengines_apu6_platform.patch
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,280 @@ | ||||
| From 970d9af9015a387bb81841faf05dcc1a171eb97a Mon Sep 17 00:00:00 2001 | ||||
| From: Philip Prindeville <philipp@redfish-solutions.com> | ||||
| Date: Sun, 1 Jan 2023 15:25:04 -0700 | ||||
| Subject: [PATCH v3 1/1] x86: Support APU5 in PCEngines platform driver | ||||
| To: platform-driver-x86@vger.kernel.org, linux-x86_64@vger.kernel.org | ||||
| Cc: Ed Wildgoose <lists@wildgooses.com>, Andres Salomon <dilinger@queued.net>, Andreas Eberlein <foodeas@aeberlein.de>, Paul Spooren <paul@spooren.de> | ||||
|  | ||||
| PCEngines make a number of SBC. APU5 has 5 mpcie slots + MSATA. | ||||
| It also has support for 3x LTE modems with 6x SIM slots (pairs with a | ||||
| SIM switch device). Each mpcie slot for modems has a reset GPIO | ||||
|  | ||||
| To ensure that the naming is sane between APU2-6 the GPIOS are | ||||
| renamed to be modem1-reset, modem2-reset, etc. This is significant | ||||
| because the slots that can be reset change between APU2 and APU3/4 | ||||
|  | ||||
| GPIO for simswap is moved to the end of the list as it could be dropped | ||||
| for APU2 boards (but causes no harm to leave it in, hardware could be | ||||
| added to a future rev of the board). | ||||
|  | ||||
| Structure of the GPIOs for APU5 is extremely similar to APU2-4, but | ||||
| many lines are moved around and there are simply more | ||||
| modems/resets/sim-swap lines to breakout. | ||||
|  | ||||
| Also added APU6, which is essentially APU4 with a different ethernet | ||||
| interface and SFP cage on eth0. | ||||
|  | ||||
| Revision history: | ||||
|  | ||||
| v1: originally titled, "apu6: add apu6 variation to apu2 driver family" | ||||
| this dealt only with detecting the APUv6, which is otherwise identical | ||||
| to the v4 excepting the SFP cage on eth0. | ||||
|  | ||||
| v2: at Ed's request, merged with his previous pull-request titled | ||||
| "x86: Support APU5 in PCEngines platform driver", and some cleanup | ||||
| to that changeset (including dropping the table "apu5_driver_data" | ||||
| which did not have a defined type "struct apu_driver_data"), but got | ||||
| mistitled when the Subject of that commit got accidentally dropped. | ||||
|  | ||||
| v3: retitled to match Ed's previous pull-request. | ||||
|  | ||||
| Cc: platform-driver-x86@vger.kernel.org | ||||
| Cc: linux-x86_64@vger.kernel.org | ||||
| Reviewed-by: Andreas Eberlein <foodeas@aeberlein.de> | ||||
| Reviewed-by: Paul Spooren <paul@spooren.de> | ||||
| Signed-off-by: Ed Wildgoose <lists@wildgooses.com> | ||||
| Sighed-off-by: Philip Prindeville <philipp@redfish-solutions.com> | ||||
| --- | ||||
|  drivers/leds/leds-apu.c                |   2 +- | ||||
|  drivers/platform/x86/Kconfig           |   4 +- | ||||
|  drivers/platform/x86/pcengines-apuv2.c | 118 ++++++++++++++++++++++--- | ||||
|  3 files changed, 107 insertions(+), 17 deletions(-) | ||||
|  | ||||
| --- a/drivers/leds/leds-apu.c | ||||
| +++ b/drivers/leds/leds-apu.c | ||||
| @@ -183,7 +183,7 @@ static int __init apu_led_init(void) | ||||
|   | ||||
|  	if (!(dmi_match(DMI_SYS_VENDOR, "PC Engines") && | ||||
|  	      (dmi_match(DMI_PRODUCT_NAME, "APU") || dmi_match(DMI_PRODUCT_NAME, "apu1")))) { | ||||
| -		pr_err("No PC Engines APUv1 board detected. For APUv2,3 support, enable CONFIG_PCENGINES_APU2\n"); | ||||
| +		pr_err("No PC Engines APUv1 board detected. For APUv2,3,4,5,6 support, enable CONFIG_PCENGINES_APU2\n"); | ||||
|  		return -ENODEV; | ||||
|  	} | ||||
|   | ||||
| --- a/drivers/platform/x86/Kconfig | ||||
| +++ b/drivers/platform/x86/Kconfig | ||||
| @@ -700,7 +700,7 @@ config XO1_RFKILL | ||||
|  	  laptop. | ||||
|   | ||||
|  config PCENGINES_APU2 | ||||
| -	tristate "PC Engines APUv2/3 front button and LEDs driver" | ||||
| +	tristate "PC Engines APUv2/3/4/5/6 front button and LEDs driver" | ||||
|  	depends on INPUT && INPUT_KEYBOARD && GPIOLIB | ||||
|  	depends on LEDS_CLASS | ||||
|  	select GPIO_AMD_FCH | ||||
| @@ -708,7 +708,7 @@ config PCENGINES_APU2 | ||||
|  	select LEDS_GPIO | ||||
|  	help | ||||
|  	  This driver provides support for the front button and LEDs on | ||||
| -	  PC Engines APUv2/APUv3 board. | ||||
| +	  PC Engines APUv2/APUv3/APUv4/APUv5/APUv6 board. | ||||
|   | ||||
|  	  To compile this driver as a module, choose M here: the module | ||||
|  	  will be called pcengines-apuv2. | ||||
| --- a/drivers/platform/x86/pcengines-apuv2.c | ||||
| +++ b/drivers/platform/x86/pcengines-apuv2.c | ||||
| @@ -1,10 +1,12 @@ | ||||
|  // SPDX-License-Identifier: GPL-2.0+ | ||||
|   | ||||
|  /* | ||||
| - * PC-Engines APUv2/APUv3 board platform driver | ||||
| + * PC-Engines APUv2-6 board platform driver | ||||
|   * for GPIO buttons and LEDs | ||||
|   * | ||||
|   * Copyright (C) 2018 metux IT consult | ||||
| + * Copyright (C) 2022 Ed Wildgoose <lists@wildgooses.com> | ||||
| + * Copyright (C) 2022 Philip Prindeville <philipp@redfish-solutions.com> | ||||
|   * Author: Enrico Weigelt <info@metux.net> | ||||
|   */ | ||||
|   | ||||
| @@ -22,38 +24,70 @@ | ||||
|  #include <linux/platform_data/gpio/gpio-amd-fch.h> | ||||
|   | ||||
|  /* | ||||
| - * NOTE: this driver only supports APUv2/3 - not APUv1, as this one | ||||
| + * NOTE: this driver only supports APUv2-6 - not APUv1, as this one | ||||
|   * has completely different register layouts. | ||||
|   */ | ||||
|   | ||||
| +/* | ||||
| + * There are a number of APU variants, with differing features | ||||
| + * APU2 has SIM slots 1/2 mapping to mPCIe sockets 1/2 | ||||
| + * APU3/4 moved SIM slot 1 to mPCIe socket 3, ie logically reversed | ||||
| + * However, most APU3/4 have a SIM switch which we default on to reverse | ||||
| + * the order and keep physical SIM order matching physical modem order | ||||
| + * APU6 is approximately the same as APU4 with different ethernet layout | ||||
| + * | ||||
| + * APU5 has 3x SIM sockets, all with a SIM switch | ||||
| + * several GPIOs are shuffled (see schematic), including MODESW | ||||
| + */ | ||||
| + | ||||
|  /* Register mappings */ | ||||
|  #define APU2_GPIO_REG_LED1		AMD_FCH_GPIO_REG_GPIO57 | ||||
|  #define APU2_GPIO_REG_LED2		AMD_FCH_GPIO_REG_GPIO58 | ||||
|  #define APU2_GPIO_REG_LED3		AMD_FCH_GPIO_REG_GPIO59_DEVSLP1 | ||||
|  #define APU2_GPIO_REG_MODESW		AMD_FCH_GPIO_REG_GPIO32_GE1 | ||||
|  #define APU2_GPIO_REG_SIMSWAP		AMD_FCH_GPIO_REG_GPIO33_GE2 | ||||
| -#define APU2_GPIO_REG_MPCIE2		AMD_FCH_GPIO_REG_GPIO55_DEVSLP0 | ||||
| -#define APU2_GPIO_REG_MPCIE3		AMD_FCH_GPIO_REG_GPIO51 | ||||
| +#define APU2_GPIO_REG_RESETM1		AMD_FCH_GPIO_REG_GPIO51 | ||||
| +#define APU2_GPIO_REG_RESETM2		AMD_FCH_GPIO_REG_GPIO55_DEVSLP0 | ||||
| + | ||||
| +#define APU5_GPIO_REG_MODESW		AMT_FCH_GPIO_REG_GEVT22 | ||||
| +#define APU5_GPIO_REG_SIMSWAP1		AMD_FCH_GPIO_REG_GPIO68 | ||||
| +#define APU5_GPIO_REG_SIMSWAP2		AMD_FCH_GPIO_REG_GPIO32_GE1 | ||||
| +#define APU5_GPIO_REG_SIMSWAP3		AMD_FCH_GPIO_REG_GPIO33_GE2 | ||||
| +#define APU5_GPIO_REG_RESETM1		AMD_FCH_GPIO_REG_GPIO51 | ||||
| +#define APU5_GPIO_REG_RESETM2		AMD_FCH_GPIO_REG_GPIO55_DEVSLP0 | ||||
| +#define APU5_GPIO_REG_RESETM3		AMD_FCH_GPIO_REG_GPIO64 | ||||
|   | ||||
|  /* Order in which the GPIO lines are defined in the register list */ | ||||
|  #define APU2_GPIO_LINE_LED1		0 | ||||
|  #define APU2_GPIO_LINE_LED2		1 | ||||
|  #define APU2_GPIO_LINE_LED3		2 | ||||
|  #define APU2_GPIO_LINE_MODESW		3 | ||||
| -#define APU2_GPIO_LINE_SIMSWAP		4 | ||||
| -#define APU2_GPIO_LINE_MPCIE2		5 | ||||
| -#define APU2_GPIO_LINE_MPCIE3		6 | ||||
| +#define APU2_GPIO_LINE_RESETM1		4 | ||||
| +#define APU2_GPIO_LINE_RESETM2		5 | ||||
| +#define APU2_GPIO_LINE_SIMSWAP		6 | ||||
| + | ||||
| +#define APU5_GPIO_LINE_LED1		0 | ||||
| +#define APU5_GPIO_LINE_LED2		1 | ||||
| +#define APU5_GPIO_LINE_LED3		2 | ||||
| +#define APU5_GPIO_LINE_MODESW		3 | ||||
| +#define APU5_GPIO_LINE_RESETM1		4 | ||||
| +#define APU5_GPIO_LINE_RESETM2		5 | ||||
| +#define APU5_GPIO_LINE_RESETM3		6 | ||||
| +#define APU5_GPIO_LINE_SIMSWAP1		7 | ||||
| +#define APU5_GPIO_LINE_SIMSWAP2		8 | ||||
| +#define APU5_GPIO_LINE_SIMSWAP3		9 | ||||
| + | ||||
|   | ||||
| -/* GPIO device */ | ||||
| +/* GPIO device - APU2/3/4/6 */ | ||||
|   | ||||
|  static int apu2_gpio_regs[] = { | ||||
|  	[APU2_GPIO_LINE_LED1]		= APU2_GPIO_REG_LED1, | ||||
|  	[APU2_GPIO_LINE_LED2]		= APU2_GPIO_REG_LED2, | ||||
|  	[APU2_GPIO_LINE_LED3]		= APU2_GPIO_REG_LED3, | ||||
|  	[APU2_GPIO_LINE_MODESW]		= APU2_GPIO_REG_MODESW, | ||||
| +	[APU2_GPIO_LINE_RESETM1]	= APU2_GPIO_REG_RESETM1, | ||||
| +	[APU2_GPIO_LINE_RESETM2]	= APU2_GPIO_REG_RESETM2, | ||||
|  	[APU2_GPIO_LINE_SIMSWAP]	= APU2_GPIO_REG_SIMSWAP, | ||||
| -	[APU2_GPIO_LINE_MPCIE2]		= APU2_GPIO_REG_MPCIE2, | ||||
| -	[APU2_GPIO_LINE_MPCIE3]		= APU2_GPIO_REG_MPCIE3, | ||||
|  }; | ||||
|   | ||||
|  static const char * const apu2_gpio_names[] = { | ||||
| @@ -61,9 +95,9 @@ static const char * const apu2_gpio_name | ||||
|  	[APU2_GPIO_LINE_LED2]		= "front-led2", | ||||
|  	[APU2_GPIO_LINE_LED3]		= "front-led3", | ||||
|  	[APU2_GPIO_LINE_MODESW]		= "front-button", | ||||
| +	[APU2_GPIO_LINE_RESETM1]	= "modem1-reset", | ||||
| +	[APU2_GPIO_LINE_RESETM2]	= "modem2-reset", | ||||
|  	[APU2_GPIO_LINE_SIMSWAP]	= "simswap", | ||||
| -	[APU2_GPIO_LINE_MPCIE2]		= "mpcie2_reset", | ||||
| -	[APU2_GPIO_LINE_MPCIE3]		= "mpcie3_reset", | ||||
|  }; | ||||
|   | ||||
|  static const struct amd_fch_gpio_pdata board_apu2 = { | ||||
| @@ -72,6 +106,40 @@ static const struct amd_fch_gpio_pdata b | ||||
|  	.gpio_names	= apu2_gpio_names, | ||||
|  }; | ||||
|   | ||||
| +/* GPIO device - APU5 */ | ||||
| + | ||||
| +static int apu5_gpio_regs[] = { | ||||
| +	[APU5_GPIO_LINE_LED1]		= APU2_GPIO_REG_LED1, | ||||
| +	[APU5_GPIO_LINE_LED2]		= APU2_GPIO_REG_LED2, | ||||
| +	[APU5_GPIO_LINE_LED3]		= APU2_GPIO_REG_LED3, | ||||
| +	[APU5_GPIO_LINE_MODESW]		= APU5_GPIO_REG_MODESW, | ||||
| +	[APU5_GPIO_LINE_RESETM1]	= APU5_GPIO_REG_RESETM1, | ||||
| +	[APU5_GPIO_LINE_RESETM2]	= APU5_GPIO_REG_RESETM2, | ||||
| +	[APU5_GPIO_LINE_RESETM3]	= APU5_GPIO_REG_RESETM3, | ||||
| +	[APU5_GPIO_LINE_SIMSWAP1]	= APU5_GPIO_REG_SIMSWAP1, | ||||
| +	[APU5_GPIO_LINE_SIMSWAP2]	= APU5_GPIO_REG_SIMSWAP2, | ||||
| +	[APU5_GPIO_LINE_SIMSWAP3]	= APU5_GPIO_REG_SIMSWAP3, | ||||
| +}; | ||||
| + | ||||
| +static const char * const apu5_gpio_names[] = { | ||||
| +	[APU5_GPIO_LINE_LED1]		= "front-led1", | ||||
| +	[APU5_GPIO_LINE_LED2]		= "front-led2", | ||||
| +	[APU5_GPIO_LINE_LED3]		= "front-led3", | ||||
| +	[APU5_GPIO_LINE_MODESW]		= "front-button", | ||||
| +	[APU5_GPIO_LINE_RESETM1]	= "modem1-reset", | ||||
| +	[APU5_GPIO_LINE_RESETM2]	= "modem2-reset", | ||||
| +	[APU5_GPIO_LINE_RESETM3]	= "modem3-reset", | ||||
| +	[APU5_GPIO_LINE_SIMSWAP1]	= "simswap1", | ||||
| +	[APU5_GPIO_LINE_SIMSWAP2]	= "simswap2", | ||||
| +	[APU5_GPIO_LINE_SIMSWAP3]	= "simswap3", | ||||
| +}; | ||||
| + | ||||
| +static const struct amd_fch_gpio_pdata board_apu5 = { | ||||
| +	.gpio_num	= ARRAY_SIZE(apu5_gpio_regs), | ||||
| +	.gpio_reg	= apu5_gpio_regs, | ||||
| +	.gpio_names	= apu5_gpio_names, | ||||
| +}; | ||||
| + | ||||
|  /* GPIO LEDs device */ | ||||
|   | ||||
|  static const struct gpio_led apu2_leds[] = { | ||||
| @@ -215,6 +283,24 @@ static const struct dmi_system_id apu_gp | ||||
|  		}, | ||||
|  		.driver_data = (void *)&board_apu2, | ||||
|  	}, | ||||
| +	/* APU5 w/ mainline BIOS */ | ||||
| +	{ | ||||
| +		.ident		= "apu5", | ||||
| +		.matches	= { | ||||
| +			DMI_MATCH(DMI_SYS_VENDOR, "PC Engines"), | ||||
| +			DMI_MATCH(DMI_BOARD_NAME, "apu5") | ||||
| +		}, | ||||
| +		.driver_data	= (void *)&board_apu5, | ||||
| +	}, | ||||
| +	/* APU6 w/ mainline BIOS */ | ||||
| +	{ | ||||
| +		.ident		= "apu6", | ||||
| +		.matches	= { | ||||
| +			DMI_MATCH(DMI_SYS_VENDOR, "PC Engines"), | ||||
| +			DMI_MATCH(DMI_BOARD_NAME, "apu6") | ||||
| +		}, | ||||
| +		.driver_data	= (void *)&board_apu2, | ||||
| +	}, | ||||
|  	{} | ||||
|  }; | ||||
|   | ||||
| @@ -249,7 +335,7 @@ static int __init apu_board_init(void) | ||||
|   | ||||
|  	id = dmi_first_match(apu_gpio_dmi_table); | ||||
|  	if (!id) { | ||||
| -		pr_err("failed to detect APU board via DMI\n"); | ||||
| +		pr_err("No APU board detected via DMI\n"); | ||||
|  		return -ENODEV; | ||||
|  	} | ||||
|   | ||||
| @@ -288,8 +374,12 @@ module_init(apu_board_init); | ||||
|  module_exit(apu_board_exit); | ||||
|   | ||||
|  MODULE_AUTHOR("Enrico Weigelt, metux IT consult <info@metux.net>"); | ||||
| -MODULE_DESCRIPTION("PC Engines APUv2/APUv3 board GPIO/LEDs/keys driver"); | ||||
| +MODULE_DESCRIPTION("PC Engines APUv2-6 board GPIO/LEDs/keys driver"); | ||||
|  MODULE_LICENSE("GPL"); | ||||
|  MODULE_DEVICE_TABLE(dmi, apu_gpio_dmi_table); | ||||
|  MODULE_ALIAS("platform:pcengines-apuv2"); | ||||
| +MODULE_ALIAS("platform:pcengines-apuv3"); | ||||
| +MODULE_ALIAS("platform:pcengines-apuv4"); | ||||
| +MODULE_ALIAS("platform:pcengines-apuv5"); | ||||
| +MODULE_ALIAS("platform:pcengines-apuv6"); | ||||
|  MODULE_SOFTDEP("pre: platform:" AMD_FCH_GPIO_DRIVER_NAME " platform:leds-gpio platform:gpio_keys_polled"); | ||||
		Reference in New Issue
	
	Block a user