1
0
Fork 0

Merge branch 'i2c/for-current-fixed' of ssh://gitolite.kernel.org/pub/scm/linux/kernel/git/wsa/linux

Pull i2c fixes from Wolfram Sang:
 "I2C driver bugfixes and a MAINTAINERS update for you"

* 'i2c/for-current-fixed' of ssh://gitolite.kernel.org/pub/scm/linux/kernel/git/wsa/linux:
  i2c: Prevent runtime suspend of adapter when Host Notify is required
  i2c: synquacer: fix enumeration of slave devices
  MAINTAINERS: friendly takeover of i2c-gpio driver
  i2c: designware: ratelimit 'transfer when suspended' errors
  i2c: imx: correct the method of getting private data in notifier_call
hifive-unleashed-5.1
Linus Torvalds 2019-05-03 11:42:01 -07:00
commit 82463436a7
5 changed files with 10 additions and 5 deletions

View File

@ -6462,7 +6462,7 @@ S: Maintained
F: drivers/media/radio/radio-gemtek* F: drivers/media/radio/radio-gemtek*
GENERIC GPIO I2C DRIVER GENERIC GPIO I2C DRIVER
M: Haavard Skinnemoen <hskinnemoen@gmail.com> M: Wolfram Sang <wsa+renesas@sang-engineering.com>
S: Supported S: Supported
F: drivers/i2c/busses/i2c-gpio.c F: drivers/i2c/busses/i2c-gpio.c
F: include/linux/platform_data/i2c-gpio.h F: include/linux/platform_data/i2c-gpio.h

View File

@ -426,8 +426,7 @@ i2c_dw_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num)
pm_runtime_get_sync(dev->dev); pm_runtime_get_sync(dev->dev);
if (dev->suspended) { if (dev_WARN_ONCE(dev->dev, dev->suspended, "Transfer while suspended\n")) {
dev_err(dev->dev, "Error %s call while suspended\n", __func__);
ret = -ESHUTDOWN; ret = -ESHUTDOWN;
goto done_nolock; goto done_nolock;
} }

View File

@ -515,9 +515,9 @@ static int i2c_imx_clk_notifier_call(struct notifier_block *nb,
unsigned long action, void *data) unsigned long action, void *data)
{ {
struct clk_notifier_data *ndata = data; struct clk_notifier_data *ndata = data;
struct imx_i2c_struct *i2c_imx = container_of(&ndata->clk, struct imx_i2c_struct *i2c_imx = container_of(nb,
struct imx_i2c_struct, struct imx_i2c_struct,
clk); clk_change_nb);
if (action & POST_RATE_CHANGE) if (action & POST_RATE_CHANGE)
i2c_imx_set_clk(i2c_imx, ndata->new_rate); i2c_imx_set_clk(i2c_imx, ndata->new_rate);

View File

@ -597,6 +597,8 @@ static int synquacer_i2c_probe(struct platform_device *pdev)
i2c->adapter = synquacer_i2c_ops; i2c->adapter = synquacer_i2c_ops;
i2c_set_adapdata(&i2c->adapter, i2c); i2c_set_adapdata(&i2c->adapter, i2c);
i2c->adapter.dev.parent = &pdev->dev; i2c->adapter.dev.parent = &pdev->dev;
i2c->adapter.dev.of_node = pdev->dev.of_node;
ACPI_COMPANION_SET(&i2c->adapter.dev, ACPI_COMPANION(&pdev->dev));
i2c->adapter.nr = pdev->id; i2c->adapter.nr = pdev->id;
init_completion(&i2c->completion); init_completion(&i2c->completion);

View File

@ -327,6 +327,8 @@ static int i2c_device_probe(struct device *dev)
if (client->flags & I2C_CLIENT_HOST_NOTIFY) { if (client->flags & I2C_CLIENT_HOST_NOTIFY) {
dev_dbg(dev, "Using Host Notify IRQ\n"); dev_dbg(dev, "Using Host Notify IRQ\n");
/* Keep adapter active when Host Notify is required */
pm_runtime_get_sync(&client->adapter->dev);
irq = i2c_smbus_host_notify_to_irq(client); irq = i2c_smbus_host_notify_to_irq(client);
} else if (dev->of_node) { } else if (dev->of_node) {
irq = of_irq_get_byname(dev->of_node, "irq"); irq = of_irq_get_byname(dev->of_node, "irq");
@ -431,6 +433,8 @@ static int i2c_device_remove(struct device *dev)
device_init_wakeup(&client->dev, false); device_init_wakeup(&client->dev, false);
client->irq = client->init_irq; client->irq = client->init_irq;
if (client->flags & I2C_CLIENT_HOST_NOTIFY)
pm_runtime_put(&client->adapter->dev);
return status; return status;
} }