acpi/acpigen_ps2_keybd: Reduce minimum keys, optional alpha/num/punct

Librem 11's volume keys act as a PS/2 keyboard with only those two
keys.  Reduce the minimum number of top-row keys to 2.  Make the
"rest of keys" (alphanumerics, punctuation, etc.) optional.

Change-Id: Idf80b184ec816043138750ee0a869b23f1e6dcf2
Signed-off-by: Jonathon Hall <jonathon.hall@puri.sm>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/78095
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Tim Wawrzynczak <inforichland@gmail.com>
Reviewed-by: Matt DeVillier <matt.devillier@gmail.com>
diff --git a/src/acpi/acpigen_ps2_keybd.c b/src/acpi/acpigen_ps2_keybd.c
index 7928dad..67e92a9 100644
--- a/src/acpi/acpigen_ps2_keybd.c
+++ b/src/acpi/acpigen_ps2_keybd.c
@@ -209,7 +209,8 @@
 				 enum ps2_action_key action_keys[],
 				 bool can_send_function_keys,
 				 bool has_numeric_keypad,
-				 bool has_scrnlock_key)
+				 bool has_scrnlock_key,
+				 bool has_alpha_num_punct_keys)
 {
 	struct acpi_dp *dp_array;
 	enum ps2_action_key key;
@@ -261,10 +262,14 @@
 		total++;
 	}
 
-	/* Write out keymap for rest of keys */
-	for (i = 0; i < ARRAY_SIZE(rest_of_keymaps); i++) {
-		keymap = rest_of_keymaps[i];
-		acpi_dp_add_integer(dp_array, NULL, keymap);
+	/* Provide alphanumeric and punctuation keys (rest of the keyboard) if
+	 * present
+	 */
+	if (has_alpha_num_punct_keys) {
+		for (i = 0; i < ARRAY_SIZE(rest_of_keymaps); i++) {
+			keymap = rest_of_keymaps[i];
+			acpi_dp_add_integer(dp_array, NULL, keymap);
+		}
 	}
 
 	total += ARRAY_SIZE(rest_of_keymaps);
@@ -277,7 +282,8 @@
 			      enum ps2_action_key action_keys[],
 			      bool can_send_function_keys,
 			      bool has_numeric_keypad,
-			      bool has_scrnlock_key)
+			      bool has_scrnlock_key,
+			      bool has_alpha_num_punct_keys)
 {
 	struct acpi_dp *dsd;
 
@@ -298,7 +304,7 @@
 	ssdt_generate_physmap(dsd, num_top_row_keys, action_keys);
 	ssdt_generate_keymap(dsd, num_top_row_keys, action_keys,
 			     can_send_function_keys, has_numeric_keypad,
-			     has_scrnlock_key);
+			     has_scrnlock_key, has_alpha_num_punct_keys);
 	acpi_dp_write(dsd);
 	acpigen_pop_len(); /* Scope */
 }
diff --git a/src/ec/google/chromeec/ec_acpi.c b/src/ec/google/chromeec/ec_acpi.c
index 53a4e75..3367cfa 100644
--- a/src/ec/google/chromeec/ec_acpi.c
+++ b/src/ec/google/chromeec/ec_acpi.c
@@ -251,7 +251,8 @@
 				 ps2_action_keys,
 				 !!(keybd.capabilities & KEYBD_CAP_FUNCTION_KEYS),
 				 !!(keybd.capabilities & KEYBD_CAP_NUMERIC_KEYPAD),
-				 !!(keybd.capabilities & KEYBD_CAP_SCRNLOCK_KEY));
+				 !!(keybd.capabilities & KEYBD_CAP_SCRNLOCK_KEY),
+				 true);
 }
 
 static const char *ec_acpi_name(const struct device *dev)
diff --git a/src/include/acpi/acpigen_ps2_keybd.h b/src/include/acpi/acpigen_ps2_keybd.h
index 7dd8282..bac991b 100644
--- a/src/include/acpi/acpigen_ps2_keybd.h
+++ b/src/include/acpi/acpigen_ps2_keybd.h
@@ -29,12 +29,13 @@
 	PS2_KEY_MENU,
 };
 
-#define PS2_MIN_TOP_ROW_KEYS		10
+#define PS2_MIN_TOP_ROW_KEYS		2
 #define PS2_MAX_TOP_ROW_KEYS		15
 
 void acpigen_ps2_keyboard_dsd(const char *scope, uint8_t num_top_row_keys,
 			      enum ps2_action_key action_keys[],
 			      bool can_send_function_keys,
-			      bool has_numeric_keypad, bool has_scrnlock_key);
+			      bool has_numeric_keypad, bool has_scrnlock_key,
+			      bool has_alpha_num_punct_keys);
 
 #endif /* __ACPI_ACPIGEN_PS2_KEYBD_H__ */