misc: bmp085: Clean up and enable use of interrupt for completion.
- pass IRQ to driver and have it initialize - finish waiting early if interrupt fires Signed-off-by: NeilBrown <neilb@suse.de> Signed-off-by: H. Nikolaus Schaller <hns@goldelico.com> Signed-off-by: Marek Belisko <marek@goldelico.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Родитель
612340b155
Коммит
c07f85c5d7
|
@ -49,7 +49,7 @@ static int bmp085_i2c_probe(struct i2c_client *client,
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
return bmp085_probe(&client->dev, regmap);
|
return bmp085_probe(&client->dev, regmap, client->irq);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int bmp085_i2c_remove(struct i2c_client *client)
|
static int bmp085_i2c_remove(struct i2c_client *client)
|
||||||
|
|
|
@ -41,7 +41,7 @@ static int bmp085_spi_probe(struct spi_device *client)
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
return bmp085_probe(&client->dev, regmap);
|
return bmp085_probe(&client->dev, regmap, client->irq);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int bmp085_spi_remove(struct spi_device *client)
|
static int bmp085_spi_remove(struct spi_device *client)
|
||||||
|
|
|
@ -49,9 +49,11 @@
|
||||||
#include <linux/device.h>
|
#include <linux/device.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/delay.h>
|
|
||||||
#include <linux/of.h>
|
#include <linux/of.h>
|
||||||
#include "bmp085.h"
|
#include "bmp085.h"
|
||||||
|
#include <linux/interrupt.h>
|
||||||
|
#include <linux/completion.h>
|
||||||
|
#include <linux/gpio.h>
|
||||||
|
|
||||||
#define BMP085_CHIP_ID 0x55
|
#define BMP085_CHIP_ID 0x55
|
||||||
#define BMP085_CALIBRATION_DATA_START 0xAA
|
#define BMP085_CALIBRATION_DATA_START 0xAA
|
||||||
|
@ -84,8 +86,19 @@ struct bmp085_data {
|
||||||
unsigned long last_temp_measurement;
|
unsigned long last_temp_measurement;
|
||||||
u8 chip_id;
|
u8 chip_id;
|
||||||
s32 b6; /* calculated temperature correction coefficient */
|
s32 b6; /* calculated temperature correction coefficient */
|
||||||
|
int irq;
|
||||||
|
struct completion done;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static irqreturn_t bmp085_eoc_isr(int irq, void *devid)
|
||||||
|
{
|
||||||
|
struct bmp085_data *data = devid;
|
||||||
|
|
||||||
|
complete(&data->done);
|
||||||
|
|
||||||
|
return IRQ_HANDLED;
|
||||||
|
}
|
||||||
|
|
||||||
static s32 bmp085_read_calibration_data(struct bmp085_data *data)
|
static s32 bmp085_read_calibration_data(struct bmp085_data *data)
|
||||||
{
|
{
|
||||||
u16 tmp[BMP085_CALIBRATION_DATA_LENGTH];
|
u16 tmp[BMP085_CALIBRATION_DATA_LENGTH];
|
||||||
|
@ -116,6 +129,9 @@ static s32 bmp085_update_raw_temperature(struct bmp085_data *data)
|
||||||
s32 status;
|
s32 status;
|
||||||
|
|
||||||
mutex_lock(&data->lock);
|
mutex_lock(&data->lock);
|
||||||
|
|
||||||
|
init_completion(&data->done);
|
||||||
|
|
||||||
status = regmap_write(data->regmap, BMP085_CTRL_REG,
|
status = regmap_write(data->regmap, BMP085_CTRL_REG,
|
||||||
BMP085_TEMP_MEASUREMENT);
|
BMP085_TEMP_MEASUREMENT);
|
||||||
if (status < 0) {
|
if (status < 0) {
|
||||||
|
@ -123,7 +139,8 @@ static s32 bmp085_update_raw_temperature(struct bmp085_data *data)
|
||||||
"Error while requesting temperature measurement.\n");
|
"Error while requesting temperature measurement.\n");
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
msleep(BMP085_TEMP_CONVERSION_TIME);
|
wait_for_completion_timeout(&data->done, 1 + msecs_to_jiffies(
|
||||||
|
BMP085_TEMP_CONVERSION_TIME));
|
||||||
|
|
||||||
status = regmap_bulk_read(data->regmap, BMP085_CONVERSION_REGISTER_MSB,
|
status = regmap_bulk_read(data->regmap, BMP085_CONVERSION_REGISTER_MSB,
|
||||||
&tmp, sizeof(tmp));
|
&tmp, sizeof(tmp));
|
||||||
|
@ -147,6 +164,9 @@ static s32 bmp085_update_raw_pressure(struct bmp085_data *data)
|
||||||
s32 status;
|
s32 status;
|
||||||
|
|
||||||
mutex_lock(&data->lock);
|
mutex_lock(&data->lock);
|
||||||
|
|
||||||
|
init_completion(&data->done);
|
||||||
|
|
||||||
status = regmap_write(data->regmap, BMP085_CTRL_REG,
|
status = regmap_write(data->regmap, BMP085_CTRL_REG,
|
||||||
BMP085_PRESSURE_MEASUREMENT +
|
BMP085_PRESSURE_MEASUREMENT +
|
||||||
(data->oversampling_setting << 6));
|
(data->oversampling_setting << 6));
|
||||||
|
@ -157,8 +177,8 @@ static s32 bmp085_update_raw_pressure(struct bmp085_data *data)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* wait for the end of conversion */
|
/* wait for the end of conversion */
|
||||||
msleep(2+(3 << data->oversampling_setting));
|
wait_for_completion_timeout(&data->done, 1 + msecs_to_jiffies(
|
||||||
|
2+(3 << data->oversampling_setting)));
|
||||||
/* copy data into a u32 (4 bytes), but skip the first byte. */
|
/* copy data into a u32 (4 bytes), but skip the first byte. */
|
||||||
status = regmap_bulk_read(data->regmap, BMP085_CONVERSION_REGISTER_MSB,
|
status = regmap_bulk_read(data->regmap, BMP085_CONVERSION_REGISTER_MSB,
|
||||||
((u8 *)&tmp)+1, 3);
|
((u8 *)&tmp)+1, 3);
|
||||||
|
@ -420,7 +440,7 @@ struct regmap_config bmp085_regmap_config = {
|
||||||
};
|
};
|
||||||
EXPORT_SYMBOL_GPL(bmp085_regmap_config);
|
EXPORT_SYMBOL_GPL(bmp085_regmap_config);
|
||||||
|
|
||||||
int bmp085_probe(struct device *dev, struct regmap *regmap)
|
int bmp085_probe(struct device *dev, struct regmap *regmap, int irq)
|
||||||
{
|
{
|
||||||
struct bmp085_data *data;
|
struct bmp085_data *data;
|
||||||
int err = 0;
|
int err = 0;
|
||||||
|
@ -434,6 +454,15 @@ int bmp085_probe(struct device *dev, struct regmap *regmap)
|
||||||
dev_set_drvdata(dev, data);
|
dev_set_drvdata(dev, data);
|
||||||
data->dev = dev;
|
data->dev = dev;
|
||||||
data->regmap = regmap;
|
data->regmap = regmap;
|
||||||
|
data->irq = irq;
|
||||||
|
|
||||||
|
if (data->irq > 0) {
|
||||||
|
err = devm_request_irq(dev, data->irq, bmp085_eoc_isr,
|
||||||
|
IRQF_TRIGGER_RISING, "bmp085",
|
||||||
|
data);
|
||||||
|
if (err < 0)
|
||||||
|
goto exit_free;
|
||||||
|
}
|
||||||
|
|
||||||
/* Initialize the BMP085 chip */
|
/* Initialize the BMP085 chip */
|
||||||
err = bmp085_init_client(data);
|
err = bmp085_init_client(data);
|
||||||
|
|
|
@ -26,7 +26,7 @@
|
||||||
|
|
||||||
extern struct regmap_config bmp085_regmap_config;
|
extern struct regmap_config bmp085_regmap_config;
|
||||||
|
|
||||||
int bmp085_probe(struct device *dev, struct regmap *regmap);
|
int bmp085_probe(struct device *dev, struct regmap *regmap, int irq);
|
||||||
int bmp085_remove(struct device *dev);
|
int bmp085_remove(struct device *dev);
|
||||||
int bmp085_detect(struct device *dev);
|
int bmp085_detect(struct device *dev);
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче