|
@@ -256,6 +256,41 @@ static int axp20x_pek_probe_input_device(struct axp20x_pek *axp20x_pek,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+#ifdef CONFIG_ACPI
|
|
|
+static bool axp20x_pek_should_register_input(struct axp20x_pek *axp20x_pek,
|
|
|
+ struct platform_device *pdev)
|
|
|
+{
|
|
|
+ unsigned long long hrv = 0;
|
|
|
+ acpi_status status;
|
|
|
+
|
|
|
+ if (IS_ENABLED(CONFIG_INPUT_SOC_BUTTON_ARRAY) &&
|
|
|
+ axp20x_pek->axp20x->variant == AXP288_ID) {
|
|
|
+ status = acpi_evaluate_integer(ACPI_HANDLE(pdev->dev.parent),
|
|
|
+ "_HRV", NULL, &hrv);
|
|
|
+ if (ACPI_FAILURE(status))
|
|
|
+ dev_err(&pdev->dev, "Failed to get PMIC hardware revision\n");
|
|
|
+
|
|
|
+ /*
|
|
|
+ * On Cherry Trail platforms (hrv == 3), do not register the
|
|
|
+ * input device if there is an "INTCFD9" gpio
|
|
|
+ * button ACPI device, as that handles the power button too,
|
|
|
+ * and otherwise we end up reporting all presses twice.
|
|
|
+ */
|
|
|
+ if (hrv == 3 && acpi_dev_found("INTCFD9"))
|
|
|
+ return false;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ return true;
|
|
|
+}
|
|
|
+#else
|
|
|
+static bool axp20x_pek_should_register_input(struct axp20x_pek *axp20x_pek,
|
|
|
+ struct platform_device *pdev)
|
|
|
+{
|
|
|
+ return true;
|
|
|
+}
|
|
|
+#endif
|
|
|
+
|
|
|
static int axp20x_pek_probe(struct platform_device *pdev)
|
|
|
{
|
|
|
struct axp20x_pek *axp20x_pek;
|
|
@@ -268,13 +303,7 @@ static int axp20x_pek_probe(struct platform_device *pdev)
|
|
|
|
|
|
axp20x_pek->axp20x = dev_get_drvdata(pdev->dev.parent);
|
|
|
|
|
|
- /*
|
|
|
- * Do not register the input device if there is an "INTCFD9"
|
|
|
- * gpio button ACPI device, that handles the power button too,
|
|
|
- * and otherwise we end up reporting all presses twice.
|
|
|
- */
|
|
|
- if (!acpi_dev_found("INTCFD9") ||
|
|
|
- !IS_ENABLED(CONFIG_INPUT_SOC_BUTTON_ARRAY)) {
|
|
|
+ if (axp20x_pek_should_register_input(axp20x_pek, pdev)) {
|
|
|
error = axp20x_pek_probe_input_device(axp20x_pek, pdev);
|
|
|
if (error)
|
|
|
return error;
|