staging:iio:hmc5843: Reorganize _set_meas_conf()
move locking inside _set() function Signed-off-by: Peter Meerwald <pmeerw@pmeerw.net> Signed-off-by: Jonathan Cameron <jic23@kernel.org>
This commit is contained in:
Родитель
62248758a7
Коммит
4f1ca4158d
|
@ -73,7 +73,6 @@ enum hmc5843_ids {
|
||||||
#define HMC5843_MEAS_CONF_NORMAL 0x00
|
#define HMC5843_MEAS_CONF_NORMAL 0x00
|
||||||
#define HMC5843_MEAS_CONF_POSITIVE_BIAS 0x01
|
#define HMC5843_MEAS_CONF_POSITIVE_BIAS 0x01
|
||||||
#define HMC5843_MEAS_CONF_NEGATIVE_BIAS 0x02
|
#define HMC5843_MEAS_CONF_NEGATIVE_BIAS 0x02
|
||||||
#define HMC5843_MEAS_CONF_NOT_USED 0x03
|
|
||||||
#define HMC5843_MEAS_CONF_MASK 0x03
|
#define HMC5843_MEAS_CONF_MASK 0x03
|
||||||
|
|
||||||
/* Scaling factors: 10000000/Gain */
|
/* Scaling factors: 10000000/Gain */
|
||||||
|
@ -211,19 +210,24 @@ static int hmc5843_read_measurement(struct hmc5843_data *data,
|
||||||
*/
|
*/
|
||||||
static s32 hmc5843_set_meas_conf(struct hmc5843_data *data, u8 meas_conf)
|
static s32 hmc5843_set_meas_conf(struct hmc5843_data *data, u8 meas_conf)
|
||||||
{
|
{
|
||||||
u8 reg_val;
|
int ret;
|
||||||
reg_val = (meas_conf & HMC5843_MEAS_CONF_MASK) |
|
|
||||||
(data->rate << HMC5843_RATE_OFFSET);
|
mutex_lock(&data->lock);
|
||||||
return i2c_smbus_write_byte_data(data->client, HMC5843_CONFIG_REG_A,
|
ret = i2c_smbus_write_byte_data(data->client, HMC5843_CONFIG_REG_A,
|
||||||
reg_val);
|
(meas_conf & HMC5843_MEAS_CONF_MASK) |
|
||||||
|
(data->rate << HMC5843_RATE_OFFSET));
|
||||||
|
if (ret >= 0)
|
||||||
|
data->meas_conf = meas_conf;
|
||||||
|
mutex_unlock(&data->lock);
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t hmc5843_show_measurement_configuration(struct device *dev,
|
static ssize_t hmc5843_show_measurement_configuration(struct device *dev,
|
||||||
struct device_attribute *attr,
|
struct device_attribute *attr,
|
||||||
char *buf)
|
char *buf)
|
||||||
{
|
{
|
||||||
struct iio_dev *indio_dev = dev_to_iio_dev(dev);
|
struct hmc5843_data *data = iio_priv(dev_to_iio_dev(dev));
|
||||||
struct hmc5843_data *data = iio_priv(indio_dev);
|
|
||||||
return sprintf(buf, "%d\n", data->meas_conf);
|
return sprintf(buf, "%d\n", data->meas_conf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -232,28 +236,19 @@ static ssize_t hmc5843_set_measurement_configuration(struct device *dev,
|
||||||
const char *buf,
|
const char *buf,
|
||||||
size_t count)
|
size_t count)
|
||||||
{
|
{
|
||||||
struct iio_dev *indio_dev = dev_to_iio_dev(dev);
|
struct hmc5843_data *data = iio_priv(dev_to_iio_dev(dev));
|
||||||
struct hmc5843_data *data = iio_priv(indio_dev);
|
|
||||||
unsigned long meas_conf = 0;
|
unsigned long meas_conf = 0;
|
||||||
int error;
|
int ret;
|
||||||
|
|
||||||
error = kstrtoul(buf, 10, &meas_conf);
|
ret = kstrtoul(buf, 10, &meas_conf);
|
||||||
if (error)
|
if (ret)
|
||||||
return error;
|
return ret;
|
||||||
if (meas_conf >= HMC5843_MEAS_CONF_NOT_USED)
|
if (meas_conf >= HMC5843_MEAS_CONF_MASK)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
mutex_lock(&data->lock);
|
ret = hmc5843_set_meas_conf(data, meas_conf);
|
||||||
dev_dbg(dev, "set measurement configuration to %lu\n", meas_conf);
|
|
||||||
if (hmc5843_set_meas_conf(data, meas_conf)) {
|
|
||||||
count = -EINVAL;
|
|
||||||
goto exit;
|
|
||||||
}
|
|
||||||
data->meas_conf = meas_conf;
|
|
||||||
|
|
||||||
exit:
|
return (ret < 0) ? ret : count;
|
||||||
mutex_unlock(&data->lock);
|
|
||||||
return count;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static IIO_DEVICE_ATTR(meas_conf,
|
static IIO_DEVICE_ATTR(meas_conf,
|
||||||
|
|
Загрузка…
Ссылка в новой задаче