forked from ~ljy/RK356X_SDK_RELEASE

hc
2023-12-08 01573e231f18eb2d99162747186f59511f56b64d
kernel/drivers/platform/x86/intel-vbtn.c
....@@ -30,6 +30,7 @@
3030 {"INT33D6", 0},
3131 {"", 0},
3232 };
33
+MODULE_DEVICE_TABLE(acpi, intel_vbtn_ids);
3334
3435 /* In theory, these are HID usages. */
3536 static const struct key_entry intel_vbtn_keymap[] = {
....@@ -66,16 +67,35 @@
6667 struct intel_vbtn_priv {
6768 struct key_entry keymap[KEYMAP_LEN];
6869 struct input_dev *input_dev;
70
+ bool has_buttons;
6971 bool has_switches;
7072 bool wakeup_mode;
7173 };
74
+
75
+static void detect_tablet_mode(struct platform_device *device)
76
+{
77
+ struct intel_vbtn_priv *priv = dev_get_drvdata(&device->dev);
78
+ acpi_handle handle = ACPI_HANDLE(&device->dev);
79
+ unsigned long long vgbs;
80
+ acpi_status status;
81
+ int m;
82
+
83
+ status = acpi_evaluate_integer(handle, "VGBS", NULL, &vgbs);
84
+ if (ACPI_FAILURE(status))
85
+ return;
86
+
87
+ m = !(vgbs & VGBS_TABLET_MODE_FLAGS);
88
+ input_report_switch(priv->input_dev, SW_TABLET_MODE, m);
89
+ m = (vgbs & VGBS_DOCK_MODE_FLAG) ? 1 : 0;
90
+ input_report_switch(priv->input_dev, SW_DOCK, m);
91
+}
7292
7393 static int intel_vbtn_input_setup(struct platform_device *device)
7494 {
7595 struct intel_vbtn_priv *priv = dev_get_drvdata(&device->dev);
7696 int ret, keymap_len = 0;
7797
78
- if (true) {
98
+ if (priv->has_buttons) {
7999 memcpy(&priv->keymap[keymap_len], intel_vbtn_keymap,
80100 ARRAY_SIZE(intel_vbtn_keymap) *
81101 sizeof(struct key_entry));
....@@ -102,6 +122,9 @@
102122 priv->input_dev->dev.parent = &device->dev;
103123 priv->input_dev->name = "Intel Virtual Button driver";
104124 priv->input_dev->id.bustype = BUS_HOST;
125
+
126
+ if (priv->has_switches)
127
+ detect_tablet_mode(device);
105128
106129 return input_register_device(priv->input_dev);
107130 }
....@@ -148,22 +171,12 @@
148171 dev_dbg(&device->dev, "unknown event index 0x%x\n", event);
149172 }
150173
151
-static void detect_tablet_mode(struct platform_device *device)
174
+static bool intel_vbtn_has_buttons(acpi_handle handle)
152175 {
153
- struct intel_vbtn_priv *priv = dev_get_drvdata(&device->dev);
154
- acpi_handle handle = ACPI_HANDLE(&device->dev);
155
- unsigned long long vgbs;
156176 acpi_status status;
157
- int m;
158177
159
- status = acpi_evaluate_integer(handle, "VGBS", NULL, &vgbs);
160
- if (ACPI_FAILURE(status))
161
- return;
162
-
163
- m = !(vgbs & VGBS_TABLET_MODE_FLAGS);
164
- input_report_switch(priv->input_dev, SW_TABLET_MODE, m);
165
- m = (vgbs & VGBS_DOCK_MODE_FLAG) ? 1 : 0;
166
- input_report_switch(priv->input_dev, SW_DOCK, m);
178
+ status = acpi_evaluate_object(handle, "VBDL", NULL, NULL);
179
+ return ACPI_SUCCESS(status);
167180 }
168181
169182 /*
....@@ -235,12 +248,15 @@
235248 static int intel_vbtn_probe(struct platform_device *device)
236249 {
237250 acpi_handle handle = ACPI_HANDLE(&device->dev);
251
+ bool has_buttons, has_switches;
238252 struct intel_vbtn_priv *priv;
239253 acpi_status status;
240254 int err;
241255
242
- status = acpi_evaluate_object(handle, "VBDL", NULL, NULL);
243
- if (ACPI_FAILURE(status)) {
256
+ has_buttons = intel_vbtn_has_buttons(handle);
257
+ has_switches = intel_vbtn_has_switches(handle);
258
+
259
+ if (!has_buttons && !has_switches) {
244260 dev_warn(&device->dev, "failed to read Intel Virtual Button driver\n");
245261 return -ENODEV;
246262 }
....@@ -250,16 +266,14 @@
250266 return -ENOMEM;
251267 dev_set_drvdata(&device->dev, priv);
252268
253
- priv->has_switches = intel_vbtn_has_switches(handle);
269
+ priv->has_buttons = has_buttons;
270
+ priv->has_switches = has_switches;
254271
255272 err = intel_vbtn_input_setup(device);
256273 if (err) {
257274 pr_err("Failed to setup Intel Virtual Button\n");
258275 return err;
259276 }
260
-
261
- if (priv->has_switches)
262
- detect_tablet_mode(device);
263277
264278 status = acpi_install_notify_handler(handle,
265279 ACPI_DEVICE_NOTIFY,
....@@ -269,6 +283,12 @@
269283 return -EBUSY;
270284
271285 device_init_wakeup(&device->dev, true);
286
+ /*
287
+ * In order for system wakeup to work, the EC GPE has to be marked as
288
+ * a wakeup one, so do that here (this setting will persist, but it has
289
+ * no effect until the wakeup mask is set for the EC GPE).
290
+ */
291
+ acpi_ec_mark_gpe_for_wake();
272292 return 0;
273293 }
274294
....@@ -288,22 +308,30 @@
288308
289309 static int intel_vbtn_pm_prepare(struct device *dev)
290310 {
291
- struct intel_vbtn_priv *priv = dev_get_drvdata(dev);
311
+ if (device_may_wakeup(dev)) {
312
+ struct intel_vbtn_priv *priv = dev_get_drvdata(dev);
292313
293
- priv->wakeup_mode = true;
314
+ priv->wakeup_mode = true;
315
+ }
294316 return 0;
295317 }
296318
297
-static int intel_vbtn_pm_resume(struct device *dev)
319
+static void intel_vbtn_pm_complete(struct device *dev)
298320 {
299321 struct intel_vbtn_priv *priv = dev_get_drvdata(dev);
300322
301323 priv->wakeup_mode = false;
324
+}
325
+
326
+static int intel_vbtn_pm_resume(struct device *dev)
327
+{
328
+ intel_vbtn_pm_complete(dev);
302329 return 0;
303330 }
304331
305332 static const struct dev_pm_ops intel_vbtn_pm_ops = {
306333 .prepare = intel_vbtn_pm_prepare,
334
+ .complete = intel_vbtn_pm_complete,
307335 .resume = intel_vbtn_pm_resume,
308336 .restore = intel_vbtn_pm_resume,
309337 .thaw = intel_vbtn_pm_resume,
....@@ -318,7 +346,6 @@
318346 .probe = intel_vbtn_probe,
319347 .remove = intel_vbtn_remove,
320348 };
321
-MODULE_DEVICE_TABLE(acpi, intel_vbtn_ids);
322349
323350 static acpi_status __init
324351 check_acpi_dev(acpi_handle handle, u32 lvl, void *context, void **rv)