summaryrefslogtreecommitdiff
path: root/drivers/hwmon/adt7461.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/hwmon/adt7461.c')
-rw-r--r--drivers/hwmon/adt7461.c24
1 files changed, 19 insertions, 5 deletions
diff --git a/drivers/hwmon/adt7461.c b/drivers/hwmon/adt7461.c
index bf71f993cd2c..10ea2eb80668 100644
--- a/drivers/hwmon/adt7461.c
+++ b/drivers/hwmon/adt7461.c
@@ -120,6 +120,7 @@ struct adt7461_data {
u8 temp_hyst;
u8 alarms; /* bitvector */
void (*alarm_fn)(bool raised);
+ int irq_gpio;
};
/*
@@ -498,11 +499,10 @@ static void adt7461_work_func(struct work_struct *work)
{
struct adt7461_data *data =
container_of(work, struct adt7461_data, work);
- int irq = data->client->irq;
if (data->alarm_fn) {
/* Therm2 line is active low */
- data->alarm_fn(!gpio_get_value(irq_to_gpio(irq)));
+ data->alarm_fn(!gpio_get_value(data->irq_gpio));
}
}
@@ -572,9 +572,19 @@ static int adt7461_init_client(struct i2c_client *client)
if (!pdata || !pdata->supported_hwrev)
return -ENODEV;
- if (pdata->therm2)
+ data->irq_gpio = -1;
+
+ if (pdata->therm2) {
data->flags |= ADT7461_FLAG_THERM2;
+ if (gpio_is_valid(pdata->irq_gpio)) {
+ if (!IS_ERR(gpio_request(pdata->irq_gpio, "adt7461"))) {
+ gpio_direction_input(pdata->irq_gpio);
+ data->irq_gpio = pdata->irq_gpio;
+ }
+ }
+ }
+
if (pdata->ext_range)
data->flags |= ADT7461_FLAG_ADT7461_EXT;
@@ -708,8 +718,12 @@ static int adt7461_remove(struct i2c_client *client)
{
struct adt7461_data *data = i2c_get_clientdata(client);
- free_irq(client->irq, data);
- cancel_work_sync(&data->work);
+ if (data->flags & ADT7461_FLAG_THERM2) {
+ free_irq(client->irq, data);
+ cancel_work_sync(&data->work);
+ }
+ if (gpio_is_valid(data->irq_gpio))
+ gpio_free(data->irq_gpio);
hwmon_device_unregister(data->hwmon_dev);
sysfs_remove_group(&client->dev.kobj, &adt7461_group);
device_remove_file(&client->dev,