Commit d33b3f7e authored by Dmitry Osipenko's avatar Dmitry Osipenko Committed by Sebastian Reichel

power: supply: smb347-charger: Improve interrupt initialization

A previous commit attempted to fix IRQ usage in a case where interrupt
is failed to initialize, but it missed couple more cases that could be
improved. The interrupt could be undefined and then everything related
to interrupt shouldn't be touched by driver. Secondly, we shouldn't ignore
errors that aren't directly related to enabling interrupt in hardware,
like enabling h/w write-access or requesting interrupt. Improve interrupt
initialization in the driver in order to handle the missing cases.
Signed-off-by: default avatarDmitry Osipenko <digetx@gmail.com>
Signed-off-by: default avatarSebastian Reichel <sebastian.reichel@collabora.com>
parent c8bbab8f
...@@ -911,11 +911,14 @@ static int smb347_irq_init(struct smb347_charger *smb, ...@@ -911,11 +911,14 @@ static int smb347_irq_init(struct smb347_charger *smb,
{ {
int ret; int ret;
ret = devm_request_threaded_irq(smb->dev, client->irq, NULL, smb->irq_unsupported = true;
smb347_interrupt, IRQF_ONESHOT,
client->name, smb); /*
if (ret < 0) * Interrupt pin is optional. If it is connected, we setup the
return ret; * interrupt support here.
*/
if (!client->irq)
return 0;
ret = smb347_set_writable(smb, true); ret = smb347_set_writable(smb, true);
if (ret < 0) if (ret < 0)
...@@ -931,7 +934,25 @@ static int smb347_irq_init(struct smb347_charger *smb, ...@@ -931,7 +934,25 @@ static int smb347_irq_init(struct smb347_charger *smb,
smb347_set_writable(smb, false); smb347_set_writable(smb, false);
return ret; if (ret < 0) {
dev_warn(smb->dev, "failed to initialize IRQ: %d\n", ret);
dev_warn(smb->dev, "disabling IRQ support\n");
return 0;
}
ret = devm_request_threaded_irq(smb->dev, client->irq, NULL,
smb347_interrupt, IRQF_ONESHOT,
client->name, smb);
if (ret)
return ret;
smb->irq_unsupported = false;
ret = smb347_irq_enable(smb);
if (ret < 0)
return ret;
return 0;
} }
/* /*
...@@ -1120,9 +1141,13 @@ static int smb347_get_property(struct power_supply *psy, ...@@ -1120,9 +1141,13 @@ static int smb347_get_property(struct power_supply *psy,
struct i2c_client *client = to_i2c_client(smb->dev); struct i2c_client *client = to_i2c_client(smb->dev);
int ret; int ret;
disable_irq(client->irq); if (!smb->irq_unsupported)
disable_irq(client->irq);
ret = smb347_get_property_locked(psy, prop, val); ret = smb347_get_property_locked(psy, prop, val);
enable_irq(client->irq);
if (!smb->irq_unsupported)
enable_irq(client->irq);
return ret; return ret;
} }
...@@ -1339,20 +1364,9 @@ static int smb347_probe(struct i2c_client *client, ...@@ -1339,20 +1364,9 @@ static int smb347_probe(struct i2c_client *client,
if (ret < 0) if (ret < 0)
return ret; return ret;
/* ret = smb347_irq_init(smb, client);
* Interrupt pin is optional. If it is connected, we setup the if (ret)
* interrupt support here. return ret;
*/
if (client->irq) {
ret = smb347_irq_init(smb, 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);
}
}
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment