power: supply: smb347-charger: Fix interrupt usage if interrupt is unavailable
PATCH 1/1 power: supply: smb347-charger: Fix interrupt usage if interrupt is unavailable
The IRQ=0 could be a valid interrupt number in kernel because interrupt numbers are virtual in a modern kernel. Hence fix the interrupt usage in a case if interrupt is unavailable by not overriding the interrupt number which is used by the driver.
Note that currently Nexus 7 is the only know device which uses SMB347 kernel diver and it has a properly working interrupt, hence this patch doesn't fix any real problems, it's a minor cleanup/improvement.
--- drivers/power/supply/smb347-charger.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-)
drivers/power/supply/smb347-charger.c +8 -4
@@ -137,6 +137,7 @@* @mains_online: is AC/DC input connected * @usb_online: is USB input connected * @charging_enabled: is charging enabled +* @irq_unsupported: is interrupt unsupported by SMB hardware * @max_charge_current: maximum current (in uA) the battery can be charged * @max_charge_voltage: maximum voltage (in uV) the battery can be charged * @pre_charge_current: current (in uA) to use in pre-charging phase
@@ -193,6 +194,7 @@ struct smb347_charger {bool mains_online;bool usb_online;bool charging_enabled; +bool irq_unsupported;unsigned int max_charge_current;unsigned int max_charge_voltage;
@@ -862,6 +864,9 @@ static int smb347_irq_set(struct smb347_charger *smb, bool enable) {int ret; +if (smb->irq_unsupported) +return 0 ; + ret =smb347_set_writable (smb, true);if (ret <0 )return ret;
@@ -923,8 +928,6 @@ static int smb347_irq_init(struct smb347_charger *smb, ret =regmap_update_bits (smb->regmap,CFG_STAT ,CFG_STAT_ACTIVE_HIGH |CFG_STAT_DISABLED ,CFG_STAT_DISABLED ); -if (ret <0 ) - client->irq =0 ;smb347_set_writable (smb, false);
@@ -1345,6 +1348,7 @@ static int smb347_probe(struct i2c_client *client,if (ret <0 ) {dev_warn (dev,"failed to initialize IRQ: %d\n" , ret);dev_warn (dev,"disabling IRQ support\n" ); + smb->irq_unsupported = true; }else {smb347_irq_enable (smb); }
@@ -1357,8 +1361,8 @@ static int smb347_remove(struct i2c_client *client) {struct smb347_charger *smb =i2c_get_clientdata (client); -if (client->irq) -smb347_irq_disable (smb); +smb347_irq_disable (smb); +return 0 ; }
Signature · 1 line
2.29.2
Hi,
Quoted 5 lines · Dmitry Osipenko
The IRQ=0 could be a valid interrupt number in kernel because interrupt numbers are virtual in a modern kernel. Hence fix the interrupt usage in a case if interrupt is unavailable by not overriding the interrupt number which is used by the driver.
Quoted 7 lines
Note that currently Nexus 7 is the only know device which uses SMB347 kernel diver and it has a properly working interrupt, hence this patch doesn't fix any real problems, it's a minor cleanup/improvement.
Fixes 99298de5df92 ("power: supply: smb347-charger: Replace mutex with IRQ disable/enable")Signed-off-by Dmitry Osipenko <[email protected]>---
Thanks, queued.
-- Sebastian
Quoted 64 lines
drivers/power/supply/smb347-charger.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-)drivers/power/supply/smb347-charger.c +8
-4@@ -137,6 +137,7 @@* @mains_online: is AC/DC input connected * @usb_online: is USB input connected * @charging_enabled: is charging enabled +* @irq_unsupported: is interrupt unsupported by SMB hardware * @max_charge_current: maximum current (in uA) the battery can be charged * @max_charge_voltage: maximum voltage (in uV) the battery can be charged * @pre_charge_current: current (in uA) to use in pre-charging phase @@ -193,6 +194,7 @@ struct smb347_charger {bool mains_online;bool usb_online;bool charging_enabled; +bool irq_unsupported;unsigned int max_charge_current;unsigned int max_charge_voltage;@@ -862,6 +864,9 @@ static int smb347_irq_set(struct smb347_charger *smb, bool enable) {int ret; +if (smb->irq_unsupported) +return 0 ; + ret =smb347_set_writable (smb, true);if (ret <0 )return ret;@@ -923,8 +928,6 @@ static int smb347_irq_init(struct smb347_charger *smb, ret =regmap_update_bits (smb->regmap,CFG_STAT ,CFG_STAT_ACTIVE_HIGH |CFG_STAT_DISABLED ,CFG_STAT_DISABLED ); -if (ret <0 ) - client->irq =0 ;smb347_set_writable (smb, false);@@ -1345,6 +1348,7 @@ static int smb347_probe(struct i2c_client *client,if (ret <0 ) {dev_warn (dev,"failed to initialize IRQ: %d\n" , ret);dev_warn (dev,"disabling IRQ support\n" ); + smb->irq_unsupported = true; }else {smb347_irq_enable (smb); }@@ -1357,8 +1361,8 @@ static int smb347_remove(struct i2c_client *client) {struct smb347_charger *smb =i2c_get_clientdata (client); -if (client->irq) -smb347_irq_disable (smb); +smb347_irq_disable (smb); +return 0 ; }Signature · 1 line
2.29.2