Commit 1c7be4c2 authored by Cristina Moraru's avatar Cristina Moraru Committed by Jonathan Cameron

iio: hmc5843: Add attributes for measurement config of bias current

Change static attribute meas_conf for bias current configuration
to channel attribute in_magn_meas_conf and also add
in_magn_meas_conf_available attribute to view available configurations.

This patch solves functionality bug: driver was using same function
hmc5843_set_measurement_configuration for setting bias current config
for all device types but the function was returning -EINVAL for any
setting >= 0x03 although, for sensor HMC5983, value 3 is valid.

API for setting bias measurement configuration:

normal - 	Normal measurement configuration (default):
		In normal measurement configuration the device
		follows normal measurement flow. Pins BP and BN
		are left floating and high impedance.

positivebias - 	Positive bias configuration: In positive bias
		configuration, a positive current is forced across
		the resistive load on pins BP and BN.

negativebias - 	Negative bias configuration. In negative bias
		configuration, a negative current is forced across
		the resistive load on pins BP and BN.

disabled     - 	Only available on HMC5983. Magnetic sensor is disabled.
		Temperature sensor is enabled.
Signed-off-by: default avatarCristina Moraru <cristina.moraru09@gmail.com>
Cc: Daniel Baluta <daniel.baluta@intel.com>
Signed-off-by: default avatarJonathan Cameron <jic23@kernel.org>
parent 0d43b346
...@@ -66,6 +66,33 @@ ...@@ -66,6 +66,33 @@
#define HMC5843_MEAS_CONF_NEGATIVE_BIAS 0x02 #define HMC5843_MEAS_CONF_NEGATIVE_BIAS 0x02
#define HMC5843_MEAS_CONF_MASK 0x03 #define HMC5843_MEAS_CONF_MASK 0x03
/*
* API for setting the measurement configuration to
* Normal, Positive bias and Negative bias
*
* From the datasheet:
* 0 - Normal measurement configuration (default): In normal measurement
* configuration the device follows normal measurement flow. Pins BP
* and BN are left floating and high impedance.
*
* 1 - Positive bias configuration: In positive bias configuration, a
* positive current is forced across the resistive load on pins BP
* and BN.
*
* 2 - Negative bias configuration. In negative bias configuration, a
* negative current is forced across the resistive load on pins BP
* and BN.
*
* 3 - Only available on HMC5983. Magnetic sensor is disabled.
* Temperature sensor is enabled.
*/
static const char *const hmc5843_meas_conf_modes[] = {"normal", "positivebias",
"negativebias"};
static const char *const hmc5983_meas_conf_modes[] = {"normal", "positivebias",
"negativebias",
"disabled"};
/* Scaling factors: 10000000/Gain */ /* Scaling factors: 10000000/Gain */
static const int hmc5843_regval_to_nanoscale[] = { static const int hmc5843_regval_to_nanoscale[] = {
6173, 7692, 10309, 12821, 18868, 21739, 25641, 35714 6173, 7692, 10309, 12821, 18868, 21739, 25641, 35714
...@@ -174,24 +201,6 @@ static int hmc5843_read_measurement(struct hmc5843_data *data, ...@@ -174,24 +201,6 @@ static int hmc5843_read_measurement(struct hmc5843_data *data,
return IIO_VAL_INT; return IIO_VAL_INT;
} }
/*
* API for setting the measurement configuration to
* Normal, Positive bias and Negative bias
*
* From the datasheet:
* 0 - Normal measurement configuration (default): In normal measurement
* configuration the device follows normal measurement flow. Pins BP
* and BN are left floating and high impedance.
*
* 1 - Positive bias configuration: In positive bias configuration, a
* positive current is forced across the resistive load on pins BP
* and BN.
*
* 2 - Negative bias configuration. In negative bias configuration, a
* negative current is forced across the resistive load on pins BP
* and BN.
*
*/
static int hmc5843_set_meas_conf(struct hmc5843_data *data, u8 meas_conf) static int hmc5843_set_meas_conf(struct hmc5843_data *data, u8 meas_conf)
{ {
int ret; int ret;
...@@ -205,48 +214,55 @@ static int hmc5843_set_meas_conf(struct hmc5843_data *data, u8 meas_conf) ...@@ -205,48 +214,55 @@ static int hmc5843_set_meas_conf(struct hmc5843_data *data, u8 meas_conf)
} }
static static
ssize_t hmc5843_show_measurement_configuration(struct device *dev, int hmc5843_show_measurement_configuration(struct iio_dev *indio_dev,
struct device_attribute *attr, const struct iio_chan_spec *chan)
char *buf)
{ {
struct hmc5843_data *data = iio_priv(dev_to_iio_dev(dev)); struct hmc5843_data *data = iio_priv(indio_dev);
unsigned int val; unsigned int val;
int ret; int ret;
ret = regmap_read(data->regmap, HMC5843_CONFIG_REG_A, &val); ret = regmap_read(data->regmap, HMC5843_CONFIG_REG_A, &val);
if (ret) if (ret)
return ret; return ret;
val &= HMC5843_MEAS_CONF_MASK;
return sprintf(buf, "%d\n", val); return val & HMC5843_MEAS_CONF_MASK;
} }
static static
ssize_t hmc5843_set_measurement_configuration(struct device *dev, int hmc5843_set_measurement_configuration(struct iio_dev *indio_dev,
struct device_attribute *attr, const struct iio_chan_spec *chan,
const char *buf, unsigned int meas_conf)
size_t count)
{ {
struct hmc5843_data *data = iio_priv(dev_to_iio_dev(dev)); struct hmc5843_data *data = iio_priv(indio_dev);
unsigned long meas_conf = 0;
int ret;
ret = kstrtoul(buf, 10, &meas_conf); return hmc5843_set_meas_conf(data, meas_conf);
if (ret) }
return ret;
if (meas_conf >= HMC5843_MEAS_CONF_MASK)
return -EINVAL;
ret = hmc5843_set_meas_conf(data, meas_conf); static const struct iio_enum hmc5843_meas_conf_enum = {
.items = hmc5843_meas_conf_modes,
.num_items = ARRAY_SIZE(hmc5843_meas_conf_modes),
.get = hmc5843_show_measurement_configuration,
.set = hmc5843_set_measurement_configuration,
};
return (ret < 0) ? ret : count; static const struct iio_chan_spec_ext_info hmc5843_ext_info[] = {
} IIO_ENUM("meas_conf", true, &hmc5843_meas_conf_enum),
IIO_ENUM_AVAILABLE("meas_conf", &hmc5843_meas_conf_enum),
{ },
};
static IIO_DEVICE_ATTR(meas_conf, static const struct iio_enum hmc5983_meas_conf_enum = {
S_IWUSR | S_IRUGO, .items = hmc5983_meas_conf_modes,
hmc5843_show_measurement_configuration, .num_items = ARRAY_SIZE(hmc5983_meas_conf_modes),
hmc5843_set_measurement_configuration, .get = hmc5843_show_measurement_configuration,
0); .set = hmc5843_set_measurement_configuration,
};
static const struct iio_chan_spec_ext_info hmc5983_ext_info[] = {
IIO_ENUM("meas_conf", true, &hmc5983_meas_conf_enum),
IIO_ENUM_AVAILABLE("meas_conf", &hmc5983_meas_conf_enum),
{ },
};
static static
ssize_t hmc5843_show_samp_freq_avail(struct device *dev, ssize_t hmc5843_show_samp_freq_avail(struct device *dev,
...@@ -459,6 +475,25 @@ static irqreturn_t hmc5843_trigger_handler(int irq, void *p) ...@@ -459,6 +475,25 @@ static irqreturn_t hmc5843_trigger_handler(int irq, void *p)
.storagebits = 16, \ .storagebits = 16, \
.endianness = IIO_BE, \ .endianness = IIO_BE, \
}, \ }, \
.ext_info = hmc5843_ext_info, \
}
#define HMC5983_CHANNEL(axis, idx) \
{ \
.type = IIO_MAGN, \
.modified = 1, \
.channel2 = IIO_MOD_##axis, \
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) | \
BIT(IIO_CHAN_INFO_SAMP_FREQ), \
.scan_index = idx, \
.scan_type = { \
.sign = 's', \
.realbits = 16, \
.storagebits = 16, \
.endianness = IIO_BE, \
}, \
.ext_info = hmc5983_ext_info, \
} }
static const struct iio_chan_spec hmc5843_channels[] = { static const struct iio_chan_spec hmc5843_channels[] = {
...@@ -476,8 +511,14 @@ static const struct iio_chan_spec hmc5883_channels[] = { ...@@ -476,8 +511,14 @@ static const struct iio_chan_spec hmc5883_channels[] = {
IIO_CHAN_SOFT_TIMESTAMP(3), IIO_CHAN_SOFT_TIMESTAMP(3),
}; };
static const struct iio_chan_spec hmc5983_channels[] = {
HMC5983_CHANNEL(X, 0),
HMC5983_CHANNEL(Z, 1),
HMC5983_CHANNEL(Y, 2),
IIO_CHAN_SOFT_TIMESTAMP(3),
};
static struct attribute *hmc5843_attributes[] = { static struct attribute *hmc5843_attributes[] = {
&iio_dev_attr_meas_conf.dev_attr.attr,
&iio_dev_attr_scale_available.dev_attr.attr, &iio_dev_attr_scale_available.dev_attr.attr,
&iio_dev_attr_sampling_frequency_available.dev_attr.attr, &iio_dev_attr_sampling_frequency_available.dev_attr.attr,
NULL NULL
...@@ -516,7 +557,7 @@ static const struct hmc5843_chip_info hmc5843_chip_info_tbl[] = { ...@@ -516,7 +557,7 @@ static const struct hmc5843_chip_info hmc5843_chip_info_tbl[] = {
ARRAY_SIZE(hmc5883l_regval_to_nanoscale), ARRAY_SIZE(hmc5883l_regval_to_nanoscale),
}, },
[HMC5983_ID] = { [HMC5983_ID] = {
.channels = hmc5883_channels, .channels = hmc5983_channels,
.regval_to_samp_freq = hmc5983_regval_to_samp_freq, .regval_to_samp_freq = hmc5983_regval_to_samp_freq,
.n_regval_to_samp_freq = .n_regval_to_samp_freq =
ARRAY_SIZE(hmc5983_regval_to_samp_freq), ARRAY_SIZE(hmc5983_regval_to_samp_freq),
......
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