hc
2024-01-05 071106ecf68c401173c58808b1cf5f68cc50d390
kernel/drivers/acpi/acpi_lpss.c
....@@ -1,24 +1,22 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * ACPI support for Intel Lynxpoint LPSS.
34 *
45 * Copyright (C) 2013, Intel Corporation
56 * Authors: Mika Westerberg <mika.westerberg@linux.intel.com>
67 * Rafael J. Wysocki <rafael.j.wysocki@intel.com>
7
- *
8
- * This program is free software; you can redistribute it and/or modify
9
- * it under the terms of the GNU General Public License version 2 as
10
- * published by the Free Software Foundation.
118 */
129
1310 #include <linux/acpi.h>
1411 #include <linux/clkdev.h>
1512 #include <linux/clk-provider.h>
13
+#include <linux/dmi.h>
1614 #include <linux/err.h>
1715 #include <linux/io.h>
1816 #include <linux/mutex.h>
1917 #include <linux/pci.h>
2018 #include <linux/platform_device.h>
21
-#include <linux/platform_data/clk-lpss.h>
19
+#include <linux/platform_data/x86/clk-lpss.h>
2220 #include <linux/platform_data/x86/pmc_atom.h>
2321 #include <linux/pm_domain.h>
2422 #include <linux/pm_runtime.h>
....@@ -27,8 +25,6 @@
2725 #include <linux/delay.h>
2826
2927 #include "internal.h"
30
-
31
-ACPI_MODULE_NAME("acpi_lpss");
3228
3329 #ifdef CONFIG_X86_INTEL_LPSS
3430
....@@ -69,11 +65,15 @@
6965 #define LPSS_CLK_DIVIDER BIT(2)
7066 #define LPSS_LTR BIT(3)
7167 #define LPSS_SAVE_CTX BIT(4)
72
-#define LPSS_NO_D3_DELAY BIT(5)
73
-
74
-/* Crystal Cove PMIC shares same ACPI ID between different platforms */
75
-#define BYT_CRC_HRV 2
76
-#define CHT_CRC_HRV 3
68
+/*
69
+ * For some devices the DSDT AML code for another device turns off the device
70
+ * before our suspend handler runs, causing us to read/save all 1-s (0xffffffff)
71
+ * as ctx register values.
72
+ * Luckily these devices always use the same ctx register values, so we can
73
+ * work around this by saving the ctx registers once on activation.
74
+ */
75
+#define LPSS_SAVE_CTX_ONCE BIT(5)
76
+#define LPSS_NO_D3_DELAY BIT(6)
7777
7878 struct lpss_private_data;
7979
....@@ -160,7 +160,7 @@
160160 */
161161 static struct pwm_lookup byt_pwm_lookup[] = {
162162 PWM_LOOKUP_WITH_MODULE("80860F09:00", 0, "0000:00:02.0",
163
- "pwm_backlight", 0, PWM_POLARITY_NORMAL,
163
+ "pwm_soc_backlight", 0, PWM_POLARITY_NORMAL,
164164 "pwm-lpss-platform"),
165165 };
166166
....@@ -172,8 +172,7 @@
172172 if (!adev->pnp.unique_id || strcmp(adev->pnp.unique_id, "1"))
173173 return;
174174
175
- if (!acpi_dev_present("INT33FD", NULL, BYT_CRC_HRV))
176
- pwm_add_table(byt_pwm_lookup, ARRAY_SIZE(byt_pwm_lookup));
175
+ pwm_add_table(byt_pwm_lookup, ARRAY_SIZE(byt_pwm_lookup));
177176 }
178177
179178 #define LPSS_I2C_ENABLE 0x6c
....@@ -206,7 +205,7 @@
206205 /* BSW PWM used for backlight control by the i915 driver */
207206 static struct pwm_lookup bsw_pwm_lookup[] = {
208207 PWM_LOOKUP_WITH_MODULE("80862288:00", 0, "0000:00:02.0",
209
- "pwm_backlight", 0, PWM_POLARITY_NORMAL,
208
+ "pwm_soc_backlight", 0, PWM_POLARITY_NORMAL,
210209 "pwm-lpss-platform"),
211210 };
212211
....@@ -222,12 +221,13 @@
222221 }
223222
224223 static const struct lpss_device_desc lpt_dev_desc = {
225
- .flags = LPSS_CLK | LPSS_CLK_GATE | LPSS_CLK_DIVIDER | LPSS_LTR,
224
+ .flags = LPSS_CLK | LPSS_CLK_GATE | LPSS_CLK_DIVIDER | LPSS_LTR
225
+ | LPSS_SAVE_CTX,
226226 .prv_offset = 0x800,
227227 };
228228
229229 static const struct lpss_device_desc lpt_i2c_dev_desc = {
230
- .flags = LPSS_CLK | LPSS_CLK_GATE | LPSS_LTR,
230
+ .flags = LPSS_CLK | LPSS_CLK_GATE | LPSS_LTR | LPSS_SAVE_CTX,
231231 .prv_offset = 0x800,
232232 };
233233
....@@ -239,7 +239,8 @@
239239 };
240240
241241 static const struct lpss_device_desc lpt_uart_dev_desc = {
242
- .flags = LPSS_CLK | LPSS_CLK_GATE | LPSS_CLK_DIVIDER | LPSS_LTR,
242
+ .flags = LPSS_CLK | LPSS_CLK_GATE | LPSS_CLK_DIVIDER | LPSS_LTR
243
+ | LPSS_SAVE_CTX,
243244 .clk_con_id = "baudclk",
244245 .prv_offset = 0x800,
245246 .setup = lpss_uart_setup,
....@@ -259,9 +260,10 @@
259260 };
260261
261262 static const struct lpss_device_desc bsw_pwm_dev_desc = {
262
- .flags = LPSS_SAVE_CTX | LPSS_NO_D3_DELAY,
263
+ .flags = LPSS_SAVE_CTX_ONCE | LPSS_NO_D3_DELAY,
263264 .prv_offset = 0x800,
264265 .setup = bsw_pwm_setup,
266
+ .resume_from_noirq = true,
265267 };
266268
267269 static const struct lpss_device_desc byt_uart_dev_desc = {
....@@ -311,11 +313,9 @@
311313 .setup = lpss_deassert_reset,
312314 };
313315
314
-#define ICPU(model) { X86_VENDOR_INTEL, 6, model, X86_FEATURE_ANY, }
315
-
316316 static const struct x86_cpu_id lpss_cpu_ids[] = {
317
- ICPU(INTEL_FAM6_ATOM_SILVERMONT), /* Valleyview, Bay Trail */
318
- ICPU(INTEL_FAM6_ATOM_AIRMONT), /* Braswell, Cherry Trail */
317
+ X86_MATCH_INTEL_FAM6_MODEL(ATOM_SILVERMONT, NULL),
318
+ X86_MATCH_INTEL_FAM6_MODEL(ATOM_AIRMONT, NULL),
319319 {}
320320 };
321321
....@@ -401,6 +401,9 @@
401401 if (!lpss_clk_dev)
402402 lpt_register_clock_device();
403403
404
+ if (IS_ERR(lpss_clk_dev))
405
+ return PTR_ERR(lpss_clk_dev);
406
+
404407 clk_data = platform_get_drvdata(lpss_clk_dev);
405408 if (!clk_data)
406409 return -ENODEV;
....@@ -464,6 +467,18 @@
464467 const char *consumer_hid;
465468 const char *consumer_uid;
466469 u32 flags;
470
+ const struct dmi_system_id *dep_missing_ids;
471
+};
472
+
473
+/* Please keep this list sorted alphabetically by vendor and model */
474
+static const struct dmi_system_id i2c1_dep_missing_dmi_ids[] = {
475
+ {
476
+ .matches = {
477
+ DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
478
+ DMI_MATCH(DMI_PRODUCT_NAME, "T200TA"),
479
+ },
480
+ },
481
+ {}
467482 };
468483
469484 /*
....@@ -474,27 +489,29 @@
474489 * the supplier is not enumerated until after the consumer is probed.
475490 */
476491 static const struct lpss_device_links lpss_device_links[] = {
492
+ /* CHT External sdcard slot controller depends on PMIC I2C ctrl */
477493 {"808622C1", "7", "80860F14", "3", DL_FLAG_PM_RUNTIME},
494
+ /* CHT iGPU depends on PMIC I2C controller */
495
+ {"808622C1", "7", "LNXVIDEO", NULL, DL_FLAG_PM_RUNTIME},
496
+ /* BYT iGPU depends on the Embedded Controller I2C controller (UID 1) */
497
+ {"80860F41", "1", "LNXVIDEO", NULL, DL_FLAG_PM_RUNTIME,
498
+ i2c1_dep_missing_dmi_ids},
499
+ /* BYT CR iGPU depends on PMIC I2C controller (UID 5 on CR) */
500
+ {"80860F41", "5", "LNXVIDEO", NULL, DL_FLAG_PM_RUNTIME},
501
+ /* BYT iGPU depends on PMIC I2C controller (UID 7 on non CR) */
502
+ {"80860F41", "7", "LNXVIDEO", NULL, DL_FLAG_PM_RUNTIME},
478503 };
479
-
480
-static bool hid_uid_match(const char *hid1, const char *uid1,
481
- const char *hid2, const char *uid2)
482
-{
483
- return !strcmp(hid1, hid2) && uid1 && uid2 && !strcmp(uid1, uid2);
484
-}
485504
486505 static bool acpi_lpss_is_supplier(struct acpi_device *adev,
487506 const struct lpss_device_links *link)
488507 {
489
- return hid_uid_match(acpi_device_hid(adev), acpi_device_uid(adev),
490
- link->supplier_hid, link->supplier_uid);
508
+ return acpi_dev_hid_uid_match(adev, link->supplier_hid, link->supplier_uid);
491509 }
492510
493511 static bool acpi_lpss_is_consumer(struct acpi_device *adev,
494512 const struct lpss_device_links *link)
495513 {
496
- return hid_uid_match(acpi_device_hid(adev), acpi_device_uid(adev),
497
- link->consumer_hid, link->consumer_uid);
514
+ return acpi_dev_hid_uid_match(adev, link->consumer_hid, link->consumer_uid);
498515 }
499516
500517 struct hid_uid {
....@@ -502,16 +519,15 @@
502519 const char *uid;
503520 };
504521
505
-static int match_hid_uid(struct device *dev, void *data)
522
+static int match_hid_uid(struct device *dev, const void *data)
506523 {
507524 struct acpi_device *adev = ACPI_COMPANION(dev);
508
- struct hid_uid *id = data;
525
+ const struct hid_uid *id = data;
509526
510527 if (!adev)
511528 return 0;
512529
513
- return hid_uid_match(acpi_device_hid(adev), acpi_device_uid(adev),
514
- id->hid, id->uid);
530
+ return acpi_dev_hid_uid_match(adev, id->hid, id->uid);
515531 }
516532
517533 static struct device *acpi_lpss_find_device(const char *hid, const char *uid)
....@@ -563,7 +579,8 @@
563579 if (!dev2)
564580 return;
565581
566
- if (acpi_lpss_dep(ACPI_COMPANION(dev2), ACPI_HANDLE(dev1)))
582
+ if ((link->dep_missing_ids && dmi_check_system(link->dep_missing_ids))
583
+ || acpi_lpss_dep(ACPI_COMPANION(dev2), ACPI_HANDLE(dev1)))
567584 device_link_add(dev2, dev1, link->flags);
568585
569586 put_device(dev2);
....@@ -578,7 +595,8 @@
578595 if (!dev2)
579596 return;
580597
581
- if (acpi_lpss_dep(ACPI_COMPANION(dev1), ACPI_HANDLE(dev2)))
598
+ if ((link->dep_missing_ids && dmi_check_system(link->dep_missing_ids))
599
+ || acpi_lpss_dep(ACPI_COMPANION(dev1), ACPI_HANDLE(dev2)))
582600 device_link_add(dev1, dev2, link->flags);
583601
584602 put_device(dev2);
....@@ -876,8 +894,13 @@
876894 * we have to deassert reset line to be sure that ->probe() will
877895 * recognize the device.
878896 */
879
- if (pdata->dev_desc->flags & LPSS_SAVE_CTX)
897
+ if (pdata->dev_desc->flags & (LPSS_SAVE_CTX | LPSS_SAVE_CTX_ONCE))
880898 lpss_deassert_reset(pdata);
899
+
900
+#ifdef CONFIG_PM
901
+ if (pdata->dev_desc->flags & LPSS_SAVE_CTX_ONCE)
902
+ acpi_lpss_save_ctx(dev, pdata);
903
+#endif
881904
882905 return 0;
883906 }
....@@ -1022,7 +1045,7 @@
10221045
10231046 acpi_lpss_d3_to_d0_delay(pdata);
10241047
1025
- if (pdata->dev_desc->flags & LPSS_SAVE_CTX)
1048
+ if (pdata->dev_desc->flags & (LPSS_SAVE_CTX | LPSS_SAVE_CTX_ONCE))
10261049 acpi_lpss_restore_ctx(dev, pdata);
10271050
10281051 return 0;
....@@ -1033,7 +1056,7 @@
10331056 {
10341057 int ret;
10351058
1036
- if (dev_pm_smart_suspend_and_suspended(dev))
1059
+ if (dev_pm_skip_suspend(dev))
10371060 return 0;
10381061
10391062 ret = pm_generic_suspend_late(dev);
....@@ -1085,6 +1108,9 @@
10851108 if (pdata->dev_desc->resume_from_noirq)
10861109 return 0;
10871110
1111
+ if (dev_pm_skip_resume(dev))
1112
+ return 0;
1113
+
10881114 return acpi_lpss_do_resume_early(dev);
10891115 }
10901116
....@@ -1094,11 +1120,8 @@
10941120 int ret;
10951121
10961122 /* Follow acpi_subsys_resume_noirq(). */
1097
- if (dev_pm_may_skip_resume(dev))
1123
+ if (dev_pm_skip_resume(dev))
10981124 return 0;
1099
-
1100
- if (dev_pm_smart_suspend_and_suspended(dev))
1101
- pm_runtime_set_active(dev);
11021125
11031126 ret = pm_generic_resume_noirq(dev);
11041127 if (ret)
....@@ -1161,7 +1184,7 @@
11611184 {
11621185 struct lpss_private_data *pdata = acpi_driver_data(ACPI_COMPANION(dev));
11631186
1164
- if (dev_pm_smart_suspend_and_suspended(dev))
1187
+ if (dev_pm_skip_suspend(dev))
11651188 return 0;
11661189
11671190 if (pdata->dev_desc->resume_from_noirq)
....@@ -1174,7 +1197,7 @@
11741197 {
11751198 struct lpss_private_data *pdata = acpi_driver_data(ACPI_COMPANION(dev));
11761199
1177
- if (dev_pm_smart_suspend_and_suspended(dev))
1200
+ if (dev_pm_skip_suspend(dev))
11781201 return 0;
11791202
11801203 if (pdata->dev_desc->resume_from_noirq) {