Пост #132855 |
сохранен 17.03.2020 11:18
- Редактировать пост
- Печать
- Скачать
-
Сравнить с постом
#
Текст поста
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | diff --git a/drivers/i2c/busses/i2c-designware-master.c b/drivers/i2c/busses/i2c-designware-master.c index d464799e40a3..4048a66355f6 100644 --- a/drivers/i2c/busses/i2c-designware-master.c +++ b/drivers/i2c/busses/i2c-designware-master.c @@ -9,6 +9,7 @@ * Copyright (C) 2009 Provigent Ltd. */ #include <linux/delay.h> +#include <linux/dmi.h> #include <linux/err.h> #include <linux/errno.h> #include <linux/export.h> @@ -22,6 +23,25 @@ #include "i2c-designware-core.h" +static int no_runtime_pm; +static const struct dmi_system_id i2c_dw_no_runtime_pm[] = { + { + .ident = "Dell Inspiron 5390", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), + DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron 5390"), + }, + }, + { + .ident = "Dell Vostro 5390", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), + DMI_MATCH(DMI_PRODUCT_NAME, "Vostro 5390"), + }, + }, + { } +}; + static void i2c_dw_configure_fifo_master(struct dw_i2c_dev *dev) { /* Configure Tx/Rx FIFO threshold levels */ @@ -424,7 +444,8 @@ i2c_dw_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num) dev_dbg(dev->dev, "%s: msgs: %d\n", __func__, num); - pm_runtime_get_sync(dev->dev); + if (!no_runtime_pm) + pm_runtime_get_sync(dev->dev); if (dev_WARN_ONCE(dev->dev, dev->suspended, "Transfer while suspended\n")) { ret = -ESHUTDOWN; @@ -501,7 +522,8 @@ i2c_dw_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num) done_nolock: pm_runtime_mark_last_busy(dev->dev); - pm_runtime_put_autosuspend(dev->dev); + if (!no_runtime_pm) + pm_runtime_put_autosuspend(dev->dev); return ret; } @@ -733,6 +755,10 @@ int i2c_dw_probe(struct dw_i2c_dev *dev) if (ret) return ret; + no_runtime_pm = dmi_check_system(i2c_dw_no_runtime_pm); + if (no_runtime_pm) + __pm_runtime_disable(dev->dev, true); + /* * Increment PM usage count during adapter registration in order to * avoid possible spurious runtime suspend when adapter device is |