mirror of
https://github.com/Fred78290/nct6687d.git
synced 2025-07-23 07:03:04 +02:00
add mutex io
must be atomic, otherwise unintended consequences
This commit is contained in:
10
nct6687.c
10
nct6687.c
@@ -319,6 +319,7 @@ struct nct6687_data
|
||||
const struct attribute_group *groups[6];
|
||||
|
||||
struct mutex update_lock; /* used to protect sensor updates */
|
||||
struct mutex EC_io_lock; /* used to protect EC io */
|
||||
bool valid; /* true if following fields are valid */
|
||||
unsigned long last_updated; /* In jiffies */
|
||||
|
||||
@@ -502,11 +503,11 @@ static u16 nct6687_read(struct nct6687_data *data, u16 address)
|
||||
u8 page = (u8)(address >> 8);
|
||||
u8 index = (u8)(address & 0xFF);
|
||||
int res;
|
||||
|
||||
mutex_lock(&data->EC_io_lock);
|
||||
outb_p(EC_SPACE_PAGE_SELECT, data->addr + EC_SPACE_PAGE_REGISTER_OFFSET);
|
||||
outb_p(page, data->addr + EC_SPACE_PAGE_REGISTER_OFFSET);
|
||||
outb_p(index, data->addr + EC_SPACE_INDEX_REGISTER_OFFSET);
|
||||
|
||||
mutex_unlock(&data->EC_io_lock);
|
||||
res = inb_p(data->addr + EC_SPACE_DATA_REGISTER_OFFSET);
|
||||
|
||||
return res;
|
||||
@@ -521,11 +522,12 @@ static void nct6687_write(struct nct6687_data *data, u16 address, u16 value)
|
||||
{
|
||||
u8 page = (u8)(address >> 8);
|
||||
u8 index = (u8)(address & 0xFF);
|
||||
|
||||
mutex_lock(&data->EC_io_lock);
|
||||
outb_p(EC_SPACE_PAGE_SELECT, data->addr + EC_SPACE_PAGE_REGISTER_OFFSET);
|
||||
outb_p(page, data->addr + EC_SPACE_PAGE_REGISTER_OFFSET);
|
||||
outb_p(index, data->addr + EC_SPACE_INDEX_REGISTER_OFFSET);
|
||||
outb_p(value, data->addr + EC_SPACE_DATA_REGISTER_OFFSET);
|
||||
mutex_unlock(&data->EC_io_lock);
|
||||
}
|
||||
|
||||
static void nct6687_update_temperatures(struct nct6687_data *data)
|
||||
@@ -991,7 +993,7 @@ static int nct6687_probe(struct platform_device *pdev)
|
||||
pr_debug("nct6687_probe addr=0x%04X, sioreg=0x%04X\n", data->addr, data->sioreg);
|
||||
|
||||
mutex_init(&data->update_lock);
|
||||
|
||||
mutex_init(&data->EC_io_lock);
|
||||
platform_set_drvdata(pdev, data);
|
||||
|
||||
nct6687_init_device(data);
|
||||
|
Reference in New Issue
Block a user