* [PATCHv2 0/5] i2c: i801: Few cleanups
@ 2015-02-11 12:32 Jarkko Nikula
[not found] ` <1423657928-25534-1-git-send-email-jarkko.nikula-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
0 siblings, 1 reply; 14+ messages in thread
From: Jarkko Nikula @ 2015-02-11 12:32 UTC (permalink / raw)
To: linux-i2c-u79uwXL29TY76Z2rM5mHXA
Cc: Jean Delvare, Wolfram Sang, Jarkko Nikula
Hi Jean
Patches 2-3/5 are otherwise the same I sent last week but now on top
of 1/5.
Jarkko Nikula (5):
i2c: i801: Don't break user-visible strings
i2c: i801: Remove i801_driver forward declaration
i2c: i801: Use managed devm_* memory and irq allocation
i2c: i801: Remove pci_enable_device() call from i801_resume()
i2c: i801: Use managed pcim_* PCI device initialization and
reservation
drivers/i2c/busses/i2c-i801.c | 37 ++++++++++++++-----------------------
1 file changed, 14 insertions(+), 23 deletions(-)
--
2.1.4
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCHv2 1/5] i2c: i801: Don't break user-visible strings
[not found] ` <1423657928-25534-1-git-send-email-jarkko.nikula-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
@ 2015-02-11 12:32 ` Jarkko Nikula
[not found] ` <1423657928-25534-2-git-send-email-jarkko.nikula-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
2015-02-11 12:32 ` [PATCHv2 2/5] i2c: i801: Remove i801_driver forward declaration Jarkko Nikula
` (3 subsequent siblings)
4 siblings, 1 reply; 14+ messages in thread
From: Jarkko Nikula @ 2015-02-11 12:32 UTC (permalink / raw)
To: linux-i2c-u79uwXL29TY76Z2rM5mHXA
Cc: Jean Delvare, Wolfram Sang, Jarkko Nikula
It makes more difficult to grep these error prints from sources if they are
split to multiple source lines.
Signed-off-by: Jarkko Nikula <jarkko.nikula-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
---
drivers/i2c/busses/i2c-i801.c | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/drivers/i2c/busses/i2c-i801.c b/drivers/i2c/busses/i2c-i801.c
index 8fafb254e42a..7d1f4a478c54 100644
--- a/drivers/i2c/busses/i2c-i801.c
+++ b/drivers/i2c/busses/i2c-i801.c
@@ -1192,8 +1192,8 @@ static int i801_probe(struct pci_dev *dev, const struct pci_device_id *id)
/* Determine the address of the SMBus area */
priv->smba = pci_resource_start(dev, SMBBAR);
if (!priv->smba) {
- dev_err(&dev->dev, "SMBus base address uninitialized, "
- "upgrade BIOS\n");
+ dev_err(&dev->dev,
+ "SMBus base address uninitialized, upgrade BIOS\n");
err = -ENODEV;
goto exit;
}
@@ -1206,8 +1206,9 @@ static int i801_probe(struct pci_dev *dev, const struct pci_device_id *id)
err = pci_request_region(dev, SMBBAR, i801_driver.name);
if (err) {
- dev_err(&dev->dev, "Failed to request SMBus region "
- "0x%lx-0x%Lx\n", priv->smba,
+ dev_err(&dev->dev,
+ "Failed to request SMBus region 0x%lx-0x%Lx\n",
+ priv->smba,
(unsigned long long)pci_resource_end(dev, SMBBAR));
goto exit;
}
--
2.1.4
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCHv2 2/5] i2c: i801: Remove i801_driver forward declaration
[not found] ` <1423657928-25534-1-git-send-email-jarkko.nikula-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
2015-02-11 12:32 ` [PATCHv2 1/5] i2c: i801: Don't break user-visible strings Jarkko Nikula
@ 2015-02-11 12:32 ` Jarkko Nikula
2015-02-11 12:32 ` [PATCHv2 3/5] i2c: i801: Use managed devm_* memory and irq allocation Jarkko Nikula
` (2 subsequent siblings)
4 siblings, 0 replies; 14+ messages in thread
From: Jarkko Nikula @ 2015-02-11 12:32 UTC (permalink / raw)
To: linux-i2c-u79uwXL29TY76Z2rM5mHXA
Cc: Jean Delvare, Wolfram Sang, Jarkko Nikula
struct pci_driver i801_driver forward declaration is needed only for
accessing the name field. Remove it and use dev_driver_string() instead.
Signed-off-by: Jarkko Nikula <jarkko.nikula-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
Reviewed-by: Jean Delvare <jdelvare-l3A5Bk7waGM@public.gmane.org>
---
drivers/i2c/busses/i2c-i801.c | 6 ++----
1 file changed, 2 insertions(+), 4 deletions(-)
diff --git a/drivers/i2c/busses/i2c-i801.c b/drivers/i2c/busses/i2c-i801.c
index 7d1f4a478c54..5f827dfc671a 100644
--- a/drivers/i2c/busses/i2c-i801.c
+++ b/drivers/i2c/busses/i2c-i801.c
@@ -223,8 +223,6 @@ struct i801_priv {
#endif
};
-static struct pci_driver i801_driver;
-
#define FEATURE_SMBUS_PEC (1 << 0)
#define FEATURE_BLOCK_BUFFER (1 << 1)
#define FEATURE_BLOCK_PROC (1 << 2)
@@ -1204,7 +1202,7 @@ static int i801_probe(struct pci_dev *dev, const struct pci_device_id *id)
goto exit;
}
- err = pci_request_region(dev, SMBBAR, i801_driver.name);
+ err = pci_request_region(dev, SMBBAR, dev_driver_string(&dev->dev));
if (err) {
dev_err(&dev->dev,
"Failed to request SMBus region 0x%lx-0x%Lx\n",
@@ -1256,7 +1254,7 @@ static int i801_probe(struct pci_dev *dev, const struct pci_device_id *id)
init_waitqueue_head(&priv->waitq);
err = request_irq(dev->irq, i801_isr, IRQF_SHARED,
- i801_driver.name, priv);
+ dev_driver_string(&dev->dev), priv);
if (err) {
dev_err(&dev->dev, "Failed to allocate irq %d: %d\n",
dev->irq, err);
--
2.1.4
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCHv2 3/5] i2c: i801: Use managed devm_* memory and irq allocation
[not found] ` <1423657928-25534-1-git-send-email-jarkko.nikula-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
2015-02-11 12:32 ` [PATCHv2 1/5] i2c: i801: Don't break user-visible strings Jarkko Nikula
2015-02-11 12:32 ` [PATCHv2 2/5] i2c: i801: Remove i801_driver forward declaration Jarkko Nikula
@ 2015-02-11 12:32 ` Jarkko Nikula
[not found] ` <1423657928-25534-4-git-send-email-jarkko.nikula-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
2015-02-11 12:32 ` [PATCHv2 4/5] i2c: i801: Remove pci_enable_device() call from i801_resume() Jarkko Nikula
2015-02-11 12:32 ` [PATCHv2 5/5] i2c: i801: Use managed pcim_* PCI device initialization and reservation Jarkko Nikula
4 siblings, 1 reply; 14+ messages in thread
From: Jarkko Nikula @ 2015-02-11 12:32 UTC (permalink / raw)
To: linux-i2c-u79uwXL29TY76Z2rM5mHXA
Cc: Jean Delvare, Wolfram Sang, Jarkko Nikula
This simplifies the error and remove paths.
Signed-off-by: Jarkko Nikula <jarkko.nikula-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
---
drivers/i2c/busses/i2c-i801.c | 17 ++++++-----------
1 file changed, 6 insertions(+), 11 deletions(-)
diff --git a/drivers/i2c/busses/i2c-i801.c b/drivers/i2c/busses/i2c-i801.c
index 5f827dfc671a..b1d725d758bb 100644
--- a/drivers/i2c/busses/i2c-i801.c
+++ b/drivers/i2c/busses/i2c-i801.c
@@ -1138,7 +1138,7 @@ static int i801_probe(struct pci_dev *dev, const struct pci_device_id *id)
int err, i;
struct i801_priv *priv;
- priv = kzalloc(sizeof(*priv), GFP_KERNEL);
+ priv = devm_kzalloc(&dev->dev, sizeof(*priv), GFP_KERNEL);
if (!priv)
return -ENOMEM;
@@ -1253,8 +1253,9 @@ static int i801_probe(struct pci_dev *dev, const struct pci_device_id *id)
if (priv->features & FEATURE_IRQ) {
init_waitqueue_head(&priv->waitq);
- err = request_irq(dev->irq, i801_isr, IRQF_SHARED,
- dev_driver_string(&dev->dev), priv);
+ err = devm_request_irq(&dev->dev, dev->irq, i801_isr,
+ IRQF_SHARED,
+ dev_driver_string(&dev->dev), priv);
if (err) {
dev_err(&dev->dev, "Failed to allocate irq %d: %d\n",
dev->irq, err);
@@ -1275,7 +1276,7 @@ static int i801_probe(struct pci_dev *dev, const struct pci_device_id *id)
err = i2c_add_adapter(&priv->adapter);
if (err) {
dev_err(&dev->dev, "Failed to add SMBus adapter\n");
- goto exit_free_irq;
+ goto exit_release;
}
i801_probe_optional_slaves(priv);
@@ -1286,12 +1287,9 @@ static int i801_probe(struct pci_dev *dev, const struct pci_device_id *id)
return 0;
-exit_free_irq:
- if (priv->features & FEATURE_IRQ)
- free_irq(dev->irq, priv);
+exit_release:
pci_release_region(dev, SMBBAR);
exit:
- kfree(priv);
return err;
}
@@ -1303,11 +1301,8 @@ static void i801_remove(struct pci_dev *dev)
i2c_del_adapter(&priv->adapter);
pci_write_config_byte(dev, SMBHSTCFG, priv->original_hstcfg);
- if (priv->features & FEATURE_IRQ)
- free_irq(dev->irq, priv);
pci_release_region(dev, SMBBAR);
- kfree(priv);
/*
* do not call pci_disable_device(dev) since it can cause hard hangs on
* some systems during power-off (eg. Fujitsu-Siemens Lifebook E8010)
--
2.1.4
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCHv2 4/5] i2c: i801: Remove pci_enable_device() call from i801_resume()
[not found] ` <1423657928-25534-1-git-send-email-jarkko.nikula-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
` (2 preceding siblings ...)
2015-02-11 12:32 ` [PATCHv2 3/5] i2c: i801: Use managed devm_* memory and irq allocation Jarkko Nikula
@ 2015-02-11 12:32 ` Jarkko Nikula
[not found] ` <1423657928-25534-5-git-send-email-jarkko.nikula-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
2015-02-11 12:32 ` [PATCHv2 5/5] i2c: i801: Use managed pcim_* PCI device initialization and reservation Jarkko Nikula
4 siblings, 1 reply; 14+ messages in thread
From: Jarkko Nikula @ 2015-02-11 12:32 UTC (permalink / raw)
To: linux-i2c-u79uwXL29TY76Z2rM5mHXA
Cc: Jean Delvare, Wolfram Sang, Jarkko Nikula
Since pci_disable_device() is not called from i801_suspend() and power
state is set already it means that subsequent pci_enable_device() calls do
practically nothing but monotonically increase struct pci_dev enable_cnt.
Signed-off-by: Jarkko Nikula <jarkko.nikula-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
---
drivers/i2c/busses/i2c-i801.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/i2c/busses/i2c-i801.c b/drivers/i2c/busses/i2c-i801.c
index b1d725d758bb..5fb35464f693 100644
--- a/drivers/i2c/busses/i2c-i801.c
+++ b/drivers/i2c/busses/i2c-i801.c
@@ -1324,7 +1324,7 @@ static int i801_resume(struct pci_dev *dev)
{
pci_set_power_state(dev, PCI_D0);
pci_restore_state(dev);
- return pci_enable_device(dev);
+ return 0;
}
#else
#define i801_suspend NULL
--
2.1.4
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCHv2 5/5] i2c: i801: Use managed pcim_* PCI device initialization and reservation
[not found] ` <1423657928-25534-1-git-send-email-jarkko.nikula-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
` (3 preceding siblings ...)
2015-02-11 12:32 ` [PATCHv2 4/5] i2c: i801: Remove pci_enable_device() call from i801_resume() Jarkko Nikula
@ 2015-02-11 12:32 ` Jarkko Nikula
[not found] ` <1423657928-25534-6-git-send-email-jarkko.nikula-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
4 siblings, 1 reply; 14+ messages in thread
From: Jarkko Nikula @ 2015-02-11 12:32 UTC (permalink / raw)
To: linux-i2c-u79uwXL29TY76Z2rM5mHXA
Cc: Jean Delvare, Wolfram Sang, Jarkko Nikula
Simplifies the code a bit and makes easier to disable PCI device on driver
detach by removing the pcim_pin_device() call in the future if needed.
Reason why i2c-i801.c doesn't ever call pci_disable_device() was because it
made some systems to hang during power-off. See commit d6fcb3b9cf77
("[PATCH] i2c-i801.c: don't pci_disable_device() after it was just enabled")
and
http://marc.info/?l=linux-kernel&m=115160053309535&w=2
Signed-off-by: Jarkko Nikula <jarkko.nikula-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
---
drivers/i2c/busses/i2c-i801.c | 11 ++++-------
1 file changed, 4 insertions(+), 7 deletions(-)
diff --git a/drivers/i2c/busses/i2c-i801.c b/drivers/i2c/busses/i2c-i801.c
index 5fb35464f693..9f7b69743233 100644
--- a/drivers/i2c/busses/i2c-i801.c
+++ b/drivers/i2c/busses/i2c-i801.c
@@ -1180,12 +1180,13 @@ static int i801_probe(struct pci_dev *dev, const struct pci_device_id *id)
}
priv->features &= ~disable_features;
- err = pci_enable_device(dev);
+ err = pcim_enable_device(dev);
if (err) {
dev_err(&dev->dev, "Failed to enable SMBus PCI device (%d)\n",
err);
goto exit;
}
+ pcim_pin_device(dev);
/* Determine the address of the SMBus area */
priv->smba = pci_resource_start(dev, SMBBAR);
@@ -1202,7 +1203,7 @@ static int i801_probe(struct pci_dev *dev, const struct pci_device_id *id)
goto exit;
}
- err = pci_request_region(dev, SMBBAR, dev_driver_string(&dev->dev));
+ err = pcim_iomap_regions(dev, 1 << SMBBAR, dev_driver_string(&dev->dev));
if (err) {
dev_err(&dev->dev,
"Failed to request SMBus region 0x%lx-0x%Lx\n",
@@ -1276,7 +1277,7 @@ static int i801_probe(struct pci_dev *dev, const struct pci_device_id *id)
err = i2c_add_adapter(&priv->adapter);
if (err) {
dev_err(&dev->dev, "Failed to add SMBus adapter\n");
- goto exit_release;
+ goto exit;
}
i801_probe_optional_slaves(priv);
@@ -1287,8 +1288,6 @@ static int i801_probe(struct pci_dev *dev, const struct pci_device_id *id)
return 0;
-exit_release:
- pci_release_region(dev, SMBBAR);
exit:
return err;
}
@@ -1301,8 +1300,6 @@ static void i801_remove(struct pci_dev *dev)
i2c_del_adapter(&priv->adapter);
pci_write_config_byte(dev, SMBHSTCFG, priv->original_hstcfg);
- pci_release_region(dev, SMBBAR);
-
/*
* do not call pci_disable_device(dev) since it can cause hard hangs on
* some systems during power-off (eg. Fujitsu-Siemens Lifebook E8010)
--
2.1.4
^ permalink raw reply related [flat|nested] 14+ messages in thread
* Re: [PATCHv2 1/5] i2c: i801: Don't break user-visible strings
[not found] ` <1423657928-25534-2-git-send-email-jarkko.nikula-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
@ 2015-02-13 10:00 ` Jean Delvare
0 siblings, 0 replies; 14+ messages in thread
From: Jean Delvare @ 2015-02-13 10:00 UTC (permalink / raw)
To: Jarkko Nikula; +Cc: linux-i2c-u79uwXL29TY76Z2rM5mHXA, Wolfram Sang
On Wed, 11 Feb 2015 14:32:04 +0200, Jarkko Nikula wrote:
> It makes more difficult to grep these error prints from sources if they are
> split to multiple source lines.
>
> Signed-off-by: Jarkko Nikula <jarkko.nikula-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
> ---
> drivers/i2c/busses/i2c-i801.c | 9 +++++----
> 1 file changed, 5 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/i2c/busses/i2c-i801.c b/drivers/i2c/busses/i2c-i801.c
> index 8fafb254e42a..7d1f4a478c54 100644
> --- a/drivers/i2c/busses/i2c-i801.c
> +++ b/drivers/i2c/busses/i2c-i801.c
> @@ -1192,8 +1192,8 @@ static int i801_probe(struct pci_dev *dev, const struct pci_device_id *id)
> /* Determine the address of the SMBus area */
> priv->smba = pci_resource_start(dev, SMBBAR);
> if (!priv->smba) {
> - dev_err(&dev->dev, "SMBus base address uninitialized, "
> - "upgrade BIOS\n");
> + dev_err(&dev->dev,
> + "SMBus base address uninitialized, upgrade BIOS\n");
> err = -ENODEV;
> goto exit;
> }
> @@ -1206,8 +1206,9 @@ static int i801_probe(struct pci_dev *dev, const struct pci_device_id *id)
>
> err = pci_request_region(dev, SMBBAR, i801_driver.name);
> if (err) {
> - dev_err(&dev->dev, "Failed to request SMBus region "
> - "0x%lx-0x%Lx\n", priv->smba,
> + dev_err(&dev->dev,
> + "Failed to request SMBus region 0x%lx-0x%Lx\n",
> + priv->smba,
> (unsigned long long)pci_resource_end(dev, SMBBAR));
> goto exit;
> }
Looks good.
Reviewed-by: Jean Delvare <jdelvare-l3A5Bk7waGM@public.gmane.org>
--
Jean Delvare
SUSE L3 Support
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCHv2 3/5] i2c: i801: Use managed devm_* memory and irq allocation
[not found] ` <1423657928-25534-4-git-send-email-jarkko.nikula-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
@ 2015-02-13 10:30 ` Jean Delvare
0 siblings, 0 replies; 14+ messages in thread
From: Jean Delvare @ 2015-02-13 10:30 UTC (permalink / raw)
To: Jarkko Nikula; +Cc: linux-i2c-u79uwXL29TY76Z2rM5mHXA, Wolfram Sang
On Wed, 11 Feb 2015 14:32:06 +0200, Jarkko Nikula wrote:
> This simplifies the error and remove paths.
>
> Signed-off-by: Jarkko Nikula <jarkko.nikula-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
> ---
> drivers/i2c/busses/i2c-i801.c | 17 ++++++-----------
> 1 file changed, 6 insertions(+), 11 deletions(-)
>
> diff --git a/drivers/i2c/busses/i2c-i801.c b/drivers/i2c/busses/i2c-i801.c
> index 5f827dfc671a..b1d725d758bb 100644
> --- a/drivers/i2c/busses/i2c-i801.c
> +++ b/drivers/i2c/busses/i2c-i801.c
> @@ -1138,7 +1138,7 @@ static int i801_probe(struct pci_dev *dev, const struct pci_device_id *id)
> int err, i;
> struct i801_priv *priv;
>
> - priv = kzalloc(sizeof(*priv), GFP_KERNEL);
> + priv = devm_kzalloc(&dev->dev, sizeof(*priv), GFP_KERNEL);
> if (!priv)
> return -ENOMEM;
>
> @@ -1253,8 +1253,9 @@ static int i801_probe(struct pci_dev *dev, const struct pci_device_id *id)
> if (priv->features & FEATURE_IRQ) {
> init_waitqueue_head(&priv->waitq);
>
> - err = request_irq(dev->irq, i801_isr, IRQF_SHARED,
> - dev_driver_string(&dev->dev), priv);
> + err = devm_request_irq(&dev->dev, dev->irq, i801_isr,
> + IRQF_SHARED,
> + dev_driver_string(&dev->dev), priv);
> if (err) {
> dev_err(&dev->dev, "Failed to allocate irq %d: %d\n",
> dev->irq, err);
> @@ -1275,7 +1276,7 @@ static int i801_probe(struct pci_dev *dev, const struct pci_device_id *id)
> err = i2c_add_adapter(&priv->adapter);
> if (err) {
> dev_err(&dev->dev, "Failed to add SMBus adapter\n");
> - goto exit_free_irq;
> + goto exit_release;
> }
>
> i801_probe_optional_slaves(priv);
> @@ -1286,12 +1287,9 @@ static int i801_probe(struct pci_dev *dev, const struct pci_device_id *id)
>
> return 0;
>
> -exit_free_irq:
> - if (priv->features & FEATURE_IRQ)
> - free_irq(dev->irq, priv);
> +exit_release:
> pci_release_region(dev, SMBBAR);
> exit:
> - kfree(priv);
> return err;
> }
>
> @@ -1303,11 +1301,8 @@ static void i801_remove(struct pci_dev *dev)
> i2c_del_adapter(&priv->adapter);
> pci_write_config_byte(dev, SMBHSTCFG, priv->original_hstcfg);
>
> - if (priv->features & FEATURE_IRQ)
> - free_irq(dev->irq, priv);
> pci_release_region(dev, SMBBAR);
>
> - kfree(priv);
> /*
> * do not call pci_disable_device(dev) since it can cause hard hangs on
> * some systems during power-off (eg. Fujitsu-Siemens Lifebook E8010)
Reviewed-by: Jean Delvare <jdelvare-l3A5Bk7waGM@public.gmane.org>
--
Jean Delvare
SUSE L3 Support
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCHv2 4/5] i2c: i801: Remove pci_enable_device() call from i801_resume()
[not found] ` <1423657928-25534-5-git-send-email-jarkko.nikula-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
@ 2015-02-13 10:33 ` Jean Delvare
[not found] ` <20150213113302.0e20b8da-R0o5gVi9kd7kN2dkZ6Wm7A@public.gmane.org>
0 siblings, 1 reply; 14+ messages in thread
From: Jean Delvare @ 2015-02-13 10:33 UTC (permalink / raw)
To: Jarkko Nikula; +Cc: linux-i2c-u79uwXL29TY76Z2rM5mHXA, Wolfram Sang
Hi Jarkko,
On Wed, 11 Feb 2015 14:32:07 +0200, Jarkko Nikula wrote:
> Since pci_disable_device() is not called from i801_suspend() and power
> state is set already it means that subsequent pci_enable_device() calls do
> practically nothing but monotonically increase struct pci_dev enable_cnt.
>
> Signed-off-by: Jarkko Nikula <jarkko.nikula-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
> ---
> drivers/i2c/busses/i2c-i801.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/drivers/i2c/busses/i2c-i801.c b/drivers/i2c/busses/i2c-i801.c
> index b1d725d758bb..5fb35464f693 100644
> --- a/drivers/i2c/busses/i2c-i801.c
> +++ b/drivers/i2c/busses/i2c-i801.c
> @@ -1324,7 +1324,7 @@ static int i801_resume(struct pci_dev *dev)
> {
> pci_set_power_state(dev, PCI_D0);
> pci_restore_state(dev);
> - return pci_enable_device(dev);
> + return 0;
> }
> #else
> #define i801_suspend NULL
This looks reasonable but have you tested this change on a range of
actual laptops to make sure it has no unexpected side effect?
--
Jean Delvare
SUSE L3 Support
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCHv2 5/5] i2c: i801: Use managed pcim_* PCI device initialization and reservation
[not found] ` <1423657928-25534-6-git-send-email-jarkko.nikula-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
@ 2015-02-13 10:47 ` Jean Delvare
[not found] ` <20150213114756.2f0b0df9-R0o5gVi9kd7kN2dkZ6Wm7A@public.gmane.org>
0 siblings, 1 reply; 14+ messages in thread
From: Jean Delvare @ 2015-02-13 10:47 UTC (permalink / raw)
To: Jarkko Nikula; +Cc: linux-i2c-u79uwXL29TY76Z2rM5mHXA, Wolfram Sang
Hi Jarkko,
On Wed, 11 Feb 2015 14:32:08 +0200, Jarkko Nikula wrote:
> Simplifies the code a bit and makes easier to disable PCI device on driver
> detach by removing the pcim_pin_device() call in the future if needed.
>
> Reason why i2c-i801.c doesn't ever call pci_disable_device() was because it
> made some systems to hang during power-off. See commit d6fcb3b9cf77
> ("[PATCH] i2c-i801.c: don't pci_disable_device() after it was just enabled")
> and
> http://marc.info/?l=linux-kernel&m=115160053309535&w=2
>
> Signed-off-by: Jarkko Nikula <jarkko.nikula-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
> ---
> drivers/i2c/busses/i2c-i801.c | 11 ++++-------
> 1 file changed, 4 insertions(+), 7 deletions(-)
The checkpatch script complains:
WARNING: line over 80 characters
#90: FILE: drivers/i2c/busses/i2c-i801.c:1206:
+ err = pcim_iomap_regions(dev, 1 << SMBBAR, dev_driver_string(&dev->dev));
> diff --git a/drivers/i2c/busses/i2c-i801.c b/drivers/i2c/busses/i2c-i801.c
> index 5fb35464f693..9f7b69743233 100644
> --- a/drivers/i2c/busses/i2c-i801.c
> +++ b/drivers/i2c/busses/i2c-i801.c
> @@ -1180,12 +1180,13 @@ static int i801_probe(struct pci_dev *dev, const struct pci_device_id *id)
> }
> priv->features &= ~disable_features;
>
> - err = pci_enable_device(dev);
> + err = pcim_enable_device(dev);
> if (err) {
> dev_err(&dev->dev, "Failed to enable SMBus PCI device (%d)\n",
> err);
> goto exit;
> }
> + pcim_pin_device(dev);
>
> /* Determine the address of the SMBus area */
> priv->smba = pci_resource_start(dev, SMBBAR);
What is the benefit of this change, compared to just leaving the call
to pci_enable_device() in place?
> @@ -1202,7 +1203,7 @@ static int i801_probe(struct pci_dev *dev, const struct pci_device_id *id)
> goto exit;
> }
>
> - err = pci_request_region(dev, SMBBAR, dev_driver_string(&dev->dev));
> + err = pcim_iomap_regions(dev, 1 << SMBBAR, dev_driver_string(&dev->dev));
> if (err) {
> dev_err(&dev->dev,
> "Failed to request SMBus region 0x%lx-0x%Lx\n",
> @@ -1276,7 +1277,7 @@ static int i801_probe(struct pci_dev *dev, const struct pci_device_id *id)
> err = i2c_add_adapter(&priv->adapter);
> if (err) {
> dev_err(&dev->dev, "Failed to add SMBus adapter\n");
> - goto exit_release;
> + goto exit;
> }
>
> i801_probe_optional_slaves(priv);
> @@ -1287,8 +1288,6 @@ static int i801_probe(struct pci_dev *dev, const struct pci_device_id *id)
>
> return 0;
>
> -exit_release:
> - pci_release_region(dev, SMBBAR);
> exit:
> return err;
> }
Now that the exit path is empty, wouldn't it make sense to return
directly on error? My understanding is that this is one of the benefits
of managed device resources.
> @@ -1301,8 +1300,6 @@ static void i801_remove(struct pci_dev *dev)
> i2c_del_adapter(&priv->adapter);
> pci_write_config_byte(dev, SMBHSTCFG, priv->original_hstcfg);
>
> - pci_release_region(dev, SMBBAR);
> -
> /*
> * do not call pci_disable_device(dev) since it can cause hard hangs on
> * some systems during power-off (eg. Fujitsu-Siemens Lifebook E8010)
--
Jean Delvare
SUSE L3 Support
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCHv2 4/5] i2c: i801: Remove pci_enable_device() call from i801_resume()
[not found] ` <20150213113302.0e20b8da-R0o5gVi9kd7kN2dkZ6Wm7A@public.gmane.org>
@ 2015-02-13 11:13 ` Jarkko Nikula
[not found] ` <54DDDC4E.5010602-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
0 siblings, 1 reply; 14+ messages in thread
From: Jarkko Nikula @ 2015-02-13 11:13 UTC (permalink / raw)
To: Jean Delvare; +Cc: linux-i2c-u79uwXL29TY76Z2rM5mHXA, Wolfram Sang
Hi
On 02/13/2015 12:33 PM, Jean Delvare wrote:
> Hi Jarkko,
>
> On Wed, 11 Feb 2015 14:32:07 +0200, Jarkko Nikula wrote:
>> Since pci_disable_device() is not called from i801_suspend() and power
>> state is set already it means that subsequent pci_enable_device() calls do
>> practically nothing but monotonically increase struct pci_dev enable_cnt.
>>
>> Signed-off-by: Jarkko Nikula <jarkko.nikula-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
>> ---
>> drivers/i2c/busses/i2c-i801.c | 2 +-
>> 1 file changed, 1 insertion(+), 1 deletion(-)
>>
>> diff --git a/drivers/i2c/busses/i2c-i801.c b/drivers/i2c/busses/i2c-i801.c
>> index b1d725d758bb..5fb35464f693 100644
>> --- a/drivers/i2c/busses/i2c-i801.c
>> +++ b/drivers/i2c/busses/i2c-i801.c
>> @@ -1324,7 +1324,7 @@ static int i801_resume(struct pci_dev *dev)
>> {
>> pci_set_power_state(dev, PCI_D0);
>> pci_restore_state(dev);
>> - return pci_enable_device(dev);
>> + return 0;
>> }
>> #else
>> #define i801_suspend NULL
>
> This looks reasonable but have you tested this change on a range of
> actual laptops to make sure it has no unexpected side effect?
>
Unfortunately I have only limited amount of test hw which are working
fine even if PCI device is disabled so I cannot hit those issues that
were seen in the past.
I suppose this patch unlikely cause regression since if you look at the
call chain pci_enable_device() -> pci_enable_device_flags() it doesn't
go beyond taking the current power state since enable_cnt is always
greater than 1.
drivers/pci/pci.c: pci_enable_device_flags():
if (dev->pm_cap) {
u16 pmcsr;
pci_read_config_word(dev, dev->pm_cap + PCI_PM_CTRL, &pmcsr);
dev->current_state = (pmcsr & PCI_PM_CTRL_STATE_MASK);
}
if (atomic_inc_return(&dev->enable_cnt) > 1)
return 0; /* already enabled */
To me it seems current power state taking is practically no-op when
device is enabled since pci_set_power_state() calls in i801_suspend()
and i801_resume() have already cached it.
--
Jarkko
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCHv2 5/5] i2c: i801: Use managed pcim_* PCI device initialization and reservation
[not found] ` <20150213114756.2f0b0df9-R0o5gVi9kd7kN2dkZ6Wm7A@public.gmane.org>
@ 2015-02-13 11:47 ` Jarkko Nikula
[not found] ` <54DDE43B.70902-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
0 siblings, 1 reply; 14+ messages in thread
From: Jarkko Nikula @ 2015-02-13 11:47 UTC (permalink / raw)
To: Jean Delvare; +Cc: linux-i2c-u79uwXL29TY76Z2rM5mHXA, Wolfram Sang
Hi
On 02/13/2015 12:47 PM, Jean Delvare wrote:
> Hi Jarkko,
>
> On Wed, 11 Feb 2015 14:32:08 +0200, Jarkko Nikula wrote:
>> Simplifies the code a bit and makes easier to disable PCI device on driver
>> detach by removing the pcim_pin_device() call in the future if needed.
>>
>> Reason why i2c-i801.c doesn't ever call pci_disable_device() was because it
>> made some systems to hang during power-off. See commit d6fcb3b9cf77
>> ("[PATCH] i2c-i801.c: don't pci_disable_device() after it was just enabled")
>> and
>> http://marc.info/?l=linux-kernel&m=115160053309535&w=2
>>
>> Signed-off-by: Jarkko Nikula <jarkko.nikula-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
>> ---
>> drivers/i2c/busses/i2c-i801.c | 11 ++++-------
>> 1 file changed, 4 insertions(+), 7 deletions(-)
>
> The checkpatch script complains:
>
> WARNING: line over 80 characters
> #90: FILE: drivers/i2c/busses/i2c-i801.c:1206:
> + err = pcim_iomap_regions(dev, 1 << SMBBAR, dev_driver_string(&dev->dev));
>
Ah, I was blind to see this. Will fix.
>> diff --git a/drivers/i2c/busses/i2c-i801.c b/drivers/i2c/busses/i2c-i801.c
>> index 5fb35464f693..9f7b69743233 100644
>> --- a/drivers/i2c/busses/i2c-i801.c
>> +++ b/drivers/i2c/busses/i2c-i801.c
>> @@ -1180,12 +1180,13 @@ static int i801_probe(struct pci_dev *dev, const struct pci_device_id *id)
>> }
>> priv->features &= ~disable_features;
>>
>> - err = pci_enable_device(dev);
>> + err = pcim_enable_device(dev);
>> if (err) {
>> dev_err(&dev->dev, "Failed to enable SMBus PCI device (%d)\n",
>> err);
>> goto exit;
>> }
>> + pcim_pin_device(dev);
>>
>> /* Determine the address of the SMBus area */
>> priv->smba = pci_resource_start(dev, SMBBAR);
>
> What is the benefit of this change, compared to just leaving the call
> to pci_enable_device() in place?
>
If you mean the patch itself I think easy pcim_pin_device() removal is
the biggest benefit if we ever want to experiment does hang during
power-off problem still exist in some machines. All PCI, ACPI and
power-off code have evolved in 9 years so original problem may not exist
anymore. Who knows.
Without this patch pcm_disable_device() needs to be added to error paths
and i801_remove(). (of course trivial but it's always more nice to get
regression from one-liner).
If you mean plain pcim_enable_device() it is required for other pcim_
functions since it allocates pcim_release which takes care of cleanup
bunch of things including pci_release_region().
E.g. pcim_iomap_regions() without pcim_enable_device() causes an oops
when doing "cat /proc/ioports" after module removal since
pcim_iomap_release() only unmaps but does not release regions.
>> @@ -1202,7 +1203,7 @@ static int i801_probe(struct pci_dev *dev, const struct pci_device_id *id)
>> goto exit;
>> }
>>
>> - err = pci_request_region(dev, SMBBAR, dev_driver_string(&dev->dev));
>> + err = pcim_iomap_regions(dev, 1 << SMBBAR, dev_driver_string(&dev->dev));
>> if (err) {
>> dev_err(&dev->dev,
>> "Failed to request SMBus region 0x%lx-0x%Lx\n",
>> @@ -1276,7 +1277,7 @@ static int i801_probe(struct pci_dev *dev, const struct pci_device_id *id)
>> err = i2c_add_adapter(&priv->adapter);
>> if (err) {
>> dev_err(&dev->dev, "Failed to add SMBus adapter\n");
>> - goto exit_release;
>> + goto exit;
>> }
>>
>> i801_probe_optional_slaves(priv);
>> @@ -1287,8 +1288,6 @@ static int i801_probe(struct pci_dev *dev, const struct pci_device_id *id)
>>
>> return 0;
>>
>> -exit_release:
>> - pci_release_region(dev, SMBBAR);
>> exit:
>> return err;
>> }
>
> Now that the exit path is empty, wouldn't it make sense to return
> directly on error? My understanding is that this is one of the benefits
> of managed device resources.
>
Yes it does. Will fix too.
--
Jarkko
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCHv2 5/5] i2c: i801: Use managed pcim_* PCI device initialization and reservation
[not found] ` <54DDE43B.70902-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
@ 2015-02-13 15:20 ` Jean Delvare
0 siblings, 0 replies; 14+ messages in thread
From: Jean Delvare @ 2015-02-13 15:20 UTC (permalink / raw)
To: Jarkko Nikula; +Cc: linux-i2c-u79uwXL29TY76Z2rM5mHXA, Wolfram Sang
On Fri, 13 Feb 2015 13:47:07 +0200, Jarkko Nikula wrote:
> On 02/13/2015 12:47 PM, Jean Delvare wrote:
> > On Wed, 11 Feb 2015 14:32:08 +0200, Jarkko Nikula wrote:
> >> diff --git a/drivers/i2c/busses/i2c-i801.c b/drivers/i2c/busses/i2c-i801.c
> >> index 5fb35464f693..9f7b69743233 100644
> >> --- a/drivers/i2c/busses/i2c-i801.c
> >> +++ b/drivers/i2c/busses/i2c-i801.c
> >> @@ -1180,12 +1180,13 @@ static int i801_probe(struct pci_dev *dev, const struct pci_device_id *id)
> >> }
> >> priv->features &= ~disable_features;
> >>
> >> - err = pci_enable_device(dev);
> >> + err = pcim_enable_device(dev);
> >> if (err) {
> >> dev_err(&dev->dev, "Failed to enable SMBus PCI device (%d)\n",
> >> err);
> >> goto exit;
> >> }
> >> + pcim_pin_device(dev);
> >>
> >> /* Determine the address of the SMBus area */
> >> priv->smba = pci_resource_start(dev, SMBBAR);
> >
> > What is the benefit of this change, compared to just leaving the call
> > to pci_enable_device() in place?
>
> If you mean the patch itself I think easy pcim_pin_device() removal is
> the biggest benefit if we ever want to experiment does hang during
> power-off problem still exist in some machines. All PCI, ACPI and
> power-off code have evolved in 9 years so original problem may not exist
> anymore. Who knows.
>
> Without this patch pcm_disable_device() needs to be added to error paths
> and i801_remove(). (of course trivial but it's always more nice to get
> regression from one-liner).
>
> If you mean plain pcim_enable_device() it is required for other pcim_
> functions since it allocates pcim_release which takes care of cleanup
> bunch of things including pci_release_region().
>
> E.g. pcim_iomap_regions() without pcim_enable_device() causes an oops
> when doing "cat /proc/ioports" after module removal since
> pcim_iomap_release() only unmaps but does not release regions.
I meant the latter. If there's a good reason for calling
pcim_enable_device then alright.
--
Jean Delvare
SUSE L3 Support
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCHv2 4/5] i2c: i801: Remove pci_enable_device() call from i801_resume()
[not found] ` <54DDDC4E.5010602-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
@ 2015-02-16 7:41 ` Jean Delvare
0 siblings, 0 replies; 14+ messages in thread
From: Jean Delvare @ 2015-02-16 7:41 UTC (permalink / raw)
To: Jarkko Nikula; +Cc: linux-i2c-u79uwXL29TY76Z2rM5mHXA, Wolfram Sang
Hi Jarkko,
On Fri, 13 Feb 2015 13:13:18 +0200, Jarkko Nikula wrote:
> On 02/13/2015 12:33 PM, Jean Delvare wrote:
> > This looks reasonable but have you tested this change on a range of
> > actual laptops to make sure it has no unexpected side effect?
>
> Unfortunately I have only limited amount of test hw which are working
> fine even if PCI device is disabled so I cannot hit those issues that
> were seen in the past.
>
> I suppose this patch unlikely cause regression since if you look at the
> call chain pci_enable_device() -> pci_enable_device_flags() it doesn't
> go beyond taking the current power state since enable_cnt is always
> greater than 1.
>
> drivers/pci/pci.c: pci_enable_device_flags():
>
> if (dev->pm_cap) {
> u16 pmcsr;
> pci_read_config_word(dev, dev->pm_cap + PCI_PM_CTRL, &pmcsr);
> dev->current_state = (pmcsr & PCI_PM_CTRL_STATE_MASK);
> }
>
> if (atomic_inc_return(&dev->enable_cnt) > 1)
> return 0; /* already enabled */
>
> To me it seems current power state taking is practically no-op when
> device is enabled since pci_set_power_state() calls in i801_suspend()
> and i801_resume() have already cached it.
OK, you convinced me. I'll still test the updated driver on my two
IBM/Lenovo Thinkpad laptops (T60p and X230) to make sure we didn't miss
anything.
Thanks,
--
Jean Delvare
SUSE L3 Support
^ permalink raw reply [flat|nested] 14+ messages in thread
end of thread, other threads:[~2015-02-16 7:41 UTC | newest]
Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-02-11 12:32 [PATCHv2 0/5] i2c: i801: Few cleanups Jarkko Nikula
[not found] ` <1423657928-25534-1-git-send-email-jarkko.nikula-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
2015-02-11 12:32 ` [PATCHv2 1/5] i2c: i801: Don't break user-visible strings Jarkko Nikula
[not found] ` <1423657928-25534-2-git-send-email-jarkko.nikula-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
2015-02-13 10:00 ` Jean Delvare
2015-02-11 12:32 ` [PATCHv2 2/5] i2c: i801: Remove i801_driver forward declaration Jarkko Nikula
2015-02-11 12:32 ` [PATCHv2 3/5] i2c: i801: Use managed devm_* memory and irq allocation Jarkko Nikula
[not found] ` <1423657928-25534-4-git-send-email-jarkko.nikula-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
2015-02-13 10:30 ` Jean Delvare
2015-02-11 12:32 ` [PATCHv2 4/5] i2c: i801: Remove pci_enable_device() call from i801_resume() Jarkko Nikula
[not found] ` <1423657928-25534-5-git-send-email-jarkko.nikula-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
2015-02-13 10:33 ` Jean Delvare
[not found] ` <20150213113302.0e20b8da-R0o5gVi9kd7kN2dkZ6Wm7A@public.gmane.org>
2015-02-13 11:13 ` Jarkko Nikula
[not found] ` <54DDDC4E.5010602-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
2015-02-16 7:41 ` Jean Delvare
2015-02-11 12:32 ` [PATCHv2 5/5] i2c: i801: Use managed pcim_* PCI device initialization and reservation Jarkko Nikula
[not found] ` <1423657928-25534-6-git-send-email-jarkko.nikula-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
2015-02-13 10:47 ` Jean Delvare
[not found] ` <20150213114756.2f0b0df9-R0o5gVi9kd7kN2dkZ6Wm7A@public.gmane.org>
2015-02-13 11:47 ` Jarkko Nikula
[not found] ` <54DDE43B.70902-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
2015-02-13 15:20 ` Jean Delvare
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).