Commit 82e2d43f authored by Heiner Kallweit's avatar Heiner Kallweit Committed by Alexandre Belloni

rtc: ds1307: improve irq setup

Change the usage of variable want_irq to reflect its name. Don't set
it to true in case wakeup is enabled but no interrupt number is given.
In addition set variable ds1307_can_wakeup_device if chip->alarm
is set only.
This allows to simplify the code and make it better understandable.
Signed-off-by: default avatarHeiner Kallweit <hkallweit1@gmail.com>
Signed-off-by: default avatarAlexandre Belloni <alexandre.belloni@free-electrons.com>
parent 7624df48
...@@ -1312,7 +1312,7 @@ static int ds1307_probe(struct i2c_client *client, ...@@ -1312,7 +1312,7 @@ static int ds1307_probe(struct i2c_client *client,
int err = -ENODEV; int err = -ENODEV;
int tmp, wday; int tmp, wday;
const struct chip_desc *chip; const struct chip_desc *chip;
bool want_irq = false; bool want_irq;
bool ds1307_can_wakeup_device = false; bool ds1307_can_wakeup_device = false;
unsigned char *buf; unsigned char *buf;
struct ds1307_platform_data *pdata = dev_get_platdata(&client->dev); struct ds1307_platform_data *pdata = dev_get_platdata(&client->dev);
...@@ -1358,6 +1358,8 @@ static int ds1307_probe(struct i2c_client *client, ...@@ -1358,6 +1358,8 @@ static int ds1307_probe(struct i2c_client *client,
ds1307->type = acpi_id->driver_data; ds1307->type = acpi_id->driver_data;
} }
want_irq = client->irq > 0 && chip->alarm;
if (!pdata) if (!pdata)
trickle_charger_setup = ds1307_trickle_init(ds1307, chip); trickle_charger_setup = ds1307_trickle_init(ds1307, chip);
else if (pdata->trickle_charger_setup) else if (pdata->trickle_charger_setup)
...@@ -1383,7 +1385,8 @@ static int ds1307_probe(struct i2c_client *client, ...@@ -1383,7 +1385,8 @@ static int ds1307_probe(struct i2c_client *client,
* This will guarantee the 'wakealarm' sysfs entry is available on the device, * This will guarantee the 'wakealarm' sysfs entry is available on the device,
* if supported by the RTC. * if supported by the RTC.
*/ */
if (of_property_read_bool(client->dev.of_node, "wakeup-source")) if (chip->alarm && of_property_read_bool(client->dev.of_node,
"wakeup-source"))
ds1307_can_wakeup_device = true; ds1307_can_wakeup_device = true;
#endif #endif
...@@ -1409,12 +1412,9 @@ static int ds1307_probe(struct i2c_client *client, ...@@ -1409,12 +1412,9 @@ static int ds1307_probe(struct i2c_client *client,
* For some variants, be sure alarms can trigger when we're * For some variants, be sure alarms can trigger when we're
* running on Vbackup (BBSQI/BBSQW) * running on Vbackup (BBSQI/BBSQW)
*/ */
if (chip->alarm && (client->irq > 0 || if (want_irq || ds1307_can_wakeup_device) {
ds1307_can_wakeup_device)) {
ds1307->regs[0] |= DS1337_BIT_INTCN | chip->bbsqi_bit; ds1307->regs[0] |= DS1337_BIT_INTCN | chip->bbsqi_bit;
ds1307->regs[0] &= ~(DS1337_BIT_A2IE | DS1337_BIT_A1IE); ds1307->regs[0] &= ~(DS1337_BIT_A2IE | DS1337_BIT_A1IE);
want_irq = true;
} }
regmap_write(ds1307->regmap, DS1337_REG_CONTROL, regmap_write(ds1307->regmap, DS1337_REG_CONTROL,
...@@ -1493,21 +1493,16 @@ static int ds1307_probe(struct i2c_client *client, ...@@ -1493,21 +1493,16 @@ static int ds1307_probe(struct i2c_client *client,
case rx_8130: case rx_8130:
ds1307->offset = 0x10; /* Seconds starts at 0x10 */ ds1307->offset = 0x10; /* Seconds starts at 0x10 */
rtc_ops = &rx8130_rtc_ops; rtc_ops = &rx8130_rtc_ops;
if (chip->alarm && client->irq > 0) { if (want_irq)
irq_handler = rx8130_irq; irq_handler = rx8130_irq;
want_irq = true;
}
break; break;
case ds_1388: case ds_1388:
ds1307->offset = 1; /* Seconds starts at 1 */ ds1307->offset = 1; /* Seconds starts at 1 */
break; break;
case mcp794xx: case mcp794xx:
rtc_ops = &mcp794xx_rtc_ops; rtc_ops = &mcp794xx_rtc_ops;
if (chip->alarm && (client->irq > 0 || if (want_irq || ds1307_can_wakeup_device)
ds1307_can_wakeup_device)) {
irq_handler = mcp794xx_irq; irq_handler = mcp794xx_irq;
want_irq = true;
}
break; break;
default: default:
break; break;
...@@ -1639,7 +1634,7 @@ static int ds1307_probe(struct i2c_client *client, ...@@ -1639,7 +1634,7 @@ static int ds1307_probe(struct i2c_client *client,
MCP794XX_REG_WEEKDAY_WDAY_MASK, MCP794XX_REG_WEEKDAY_WDAY_MASK,
tm.tm_wday + 1); tm.tm_wday + 1);
if (want_irq) { if (want_irq || ds1307_can_wakeup_device) {
device_set_wakeup_capable(ds1307->dev, true); device_set_wakeup_capable(ds1307->dev, true);
set_bit(HAS_ALARM, &ds1307->flags); set_bit(HAS_ALARM, &ds1307->flags);
} }
...@@ -1649,9 +1644,7 @@ static int ds1307_probe(struct i2c_client *client, ...@@ -1649,9 +1644,7 @@ static int ds1307_probe(struct i2c_client *client,
return PTR_ERR(ds1307->rtc); return PTR_ERR(ds1307->rtc);
} }
if (ds1307_can_wakeup_device && client->irq <= 0) { if (ds1307_can_wakeup_device && !want_irq) {
/* Disable request for an IRQ */
want_irq = false;
dev_info(ds1307->dev, dev_info(ds1307->dev,
"'wakeup-source' is set, request for an IRQ is disabled!\n"); "'wakeup-source' is set, request for an IRQ is disabled!\n");
/* We cannot support UIE mode if we do not have an IRQ line */ /* We cannot support UIE mode if we do not have an IRQ line */
......
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