* [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
[parent not found: <1423657928-25534-1-git-send-email-jarkko.nikula-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>]
* [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
[parent not found: <1423657928-25534-2-git-send-email-jarkko.nikula-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>]
* 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
* [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
[parent not found: <1423657928-25534-4-git-send-email-jarkko.nikula-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>]
* 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
* [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
[parent not found: <1423657928-25534-5-git-send-email-jarkko.nikula-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>]
* 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
[parent not found: <20150213113302.0e20b8da-R0o5gVi9kd7kN2dkZ6Wm7A@public.gmane.org>]
* 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
[parent not found: <54DDDC4E.5010602-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>]
* 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
* [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
[parent not found: <1423657928-25534-6-git-send-email-jarkko.nikula-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>]
* 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
[parent not found: <20150213114756.2f0b0df9-R0o5gVi9kd7kN2dkZ6Wm7A@public.gmane.org>]
* 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
[parent not found: <54DDE43B.70902-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>]
* 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
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).