diff options
Diffstat (limited to 'drivers/i2c')
| -rw-r--r-- | drivers/i2c/busses/Kconfig | 1 | ||||
| -rw-r--r-- | drivers/i2c/busses/i2c-designware-master.c | 3 | ||||
| -rw-r--r-- | drivers/i2c/busses/i2c-i801.c | 4 | ||||
| -rw-r--r-- | drivers/i2c/busses/i2c-imx.c | 8 | ||||
| -rw-r--r-- | drivers/i2c/busses/i2c-synquacer.c | 2 | ||||
| -rw-r--r-- | drivers/i2c/i2c-core-base.c | 6 | 
6 files changed, 18 insertions, 6 deletions
diff --git a/drivers/i2c/busses/Kconfig b/drivers/i2c/busses/Kconfig index f2c681971201..f8979abb9a19 100644 --- a/drivers/i2c/busses/Kconfig +++ b/drivers/i2c/busses/Kconfig @@ -131,6 +131,7 @@ config I2C_I801  	    Cannon Lake (PCH)  	    Cedar Fork (PCH)  	    Ice Lake (PCH) +	    Comet Lake (PCH)  	  This driver can also be built as a module.  If so, the module  	  will be called i2c-i801. diff --git a/drivers/i2c/busses/i2c-designware-master.c b/drivers/i2c/busses/i2c-designware-master.c index bb8e3f149979..d464799e40a3 100644 --- a/drivers/i2c/busses/i2c-designware-master.c +++ b/drivers/i2c/busses/i2c-designware-master.c @@ -426,8 +426,7 @@ i2c_dw_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num)  	pm_runtime_get_sync(dev->dev); -	if (dev->suspended) { -		dev_err(dev->dev, "Error %s call while suspended\n", __func__); +	if (dev_WARN_ONCE(dev->dev, dev->suspended, "Transfer while suspended\n")) {  		ret = -ESHUTDOWN;  		goto done_nolock;  	} diff --git a/drivers/i2c/busses/i2c-i801.c b/drivers/i2c/busses/i2c-i801.c index c91e145ef5a5..679c6c41f64b 100644 --- a/drivers/i2c/busses/i2c-i801.c +++ b/drivers/i2c/busses/i2c-i801.c @@ -71,6 +71,7 @@   * Cannon Lake-LP (PCH)		0x9da3	32	hard	yes	yes	yes   * Cedar Fork (PCH)		0x18df	32	hard	yes	yes	yes   * Ice Lake-LP (PCH)		0x34a3	32	hard	yes	yes	yes + * Comet Lake (PCH)		0x02a3	32	hard	yes	yes	yes   *   * Features supported by this driver:   * Software PEC				no @@ -240,6 +241,7 @@  #define PCI_DEVICE_ID_INTEL_LEWISBURG_SSKU_SMBUS	0xa223  #define PCI_DEVICE_ID_INTEL_KABYLAKE_PCH_H_SMBUS	0xa2a3  #define PCI_DEVICE_ID_INTEL_CANNONLAKE_H_SMBUS		0xa323 +#define PCI_DEVICE_ID_INTEL_COMETLAKE_SMBUS		0x02a3  struct i801_mux_config {  	char *gpio_chip; @@ -1038,6 +1040,7 @@ static const struct pci_device_id i801_ids[] = {  	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_CANNONLAKE_H_SMBUS) },  	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_CANNONLAKE_LP_SMBUS) },  	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICELAKE_LP_SMBUS) }, +	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_COMETLAKE_SMBUS) },  	{ 0, }  }; @@ -1534,6 +1537,7 @@ static int i801_probe(struct pci_dev *dev, const struct pci_device_id *id)  	case PCI_DEVICE_ID_INTEL_DNV_SMBUS:  	case PCI_DEVICE_ID_INTEL_KABYLAKE_PCH_H_SMBUS:  	case PCI_DEVICE_ID_INTEL_ICELAKE_LP_SMBUS: +	case PCI_DEVICE_ID_INTEL_COMETLAKE_SMBUS:  		priv->features |= FEATURE_I2C_BLOCK_READ;  		priv->features |= FEATURE_IRQ;  		priv->features |= FEATURE_SMBUS_PEC; diff --git a/drivers/i2c/busses/i2c-imx.c b/drivers/i2c/busses/i2c-imx.c index 42fed40198a0..fd70b110e8f4 100644 --- a/drivers/i2c/busses/i2c-imx.c +++ b/drivers/i2c/busses/i2c-imx.c @@ -515,9 +515,9 @@ static int i2c_imx_clk_notifier_call(struct notifier_block *nb,  				     unsigned long action, void *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, -						      clk); +						      clk_change_nb);  	if (action & POST_RATE_CHANGE)  		i2c_imx_set_clk(i2c_imx, ndata->new_rate); @@ -1169,11 +1169,13 @@ static int i2c_imx_probe(struct platform_device *pdev)  	/* Init DMA config if supported */  	ret = i2c_imx_dma_request(i2c_imx, phy_addr);  	if (ret < 0) -		goto clk_notifier_unregister; +		goto del_adapter;  	dev_info(&i2c_imx->adapter.dev, "IMX I2C adapter registered\n");  	return 0;   /* Return OK */ +del_adapter: +	i2c_del_adapter(&i2c_imx->adapter);  clk_notifier_unregister:  	clk_notifier_unregister(i2c_imx->clk, &i2c_imx->clk_change_nb);  rpm_disable: diff --git a/drivers/i2c/busses/i2c-synquacer.c b/drivers/i2c/busses/i2c-synquacer.c index d18b0941b71a..f14d4b3fab44 100644 --- a/drivers/i2c/busses/i2c-synquacer.c +++ b/drivers/i2c/busses/i2c-synquacer.c @@ -597,6 +597,8 @@ static int synquacer_i2c_probe(struct platform_device *pdev)  	i2c->adapter = synquacer_i2c_ops;  	i2c_set_adapdata(&i2c->adapter, i2c);  	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;  	init_completion(&i2c->completion); diff --git a/drivers/i2c/i2c-core-base.c b/drivers/i2c/i2c-core-base.c index 38af18645133..688aa3b5f3ac 100644 --- a/drivers/i2c/i2c-core-base.c +++ b/drivers/i2c/i2c-core-base.c @@ -185,7 +185,7 @@ static int i2c_generic_bus_free(struct i2c_adapter *adap)  int i2c_generic_scl_recovery(struct i2c_adapter *adap)  {  	struct i2c_bus_recovery_info *bri = adap->bus_recovery_info; -	int i = 0, scl = 1, ret; +	int i = 0, scl = 1, ret = 0;  	if (bri->prepare_recovery)  		bri->prepare_recovery(adap); @@ -327,6 +327,8 @@ static int i2c_device_probe(struct device *dev)  		if (client->flags & I2C_CLIENT_HOST_NOTIFY) {  			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);  		} else if (dev->of_node) {  			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);  	client->irq = client->init_irq; +	if (client->flags & I2C_CLIENT_HOST_NOTIFY) +		pm_runtime_put(&client->adapter->dev);  	return status;  }  | 
