Signed-off-by: Manuel Stahl <manuel.stahl@xxxxxxxxxxxxxxxxx> --- drivers/staging/iio/accel/sca3000_core.c | 125 ++++++++++++++---------------- 1 files changed, 58 insertions(+), 67 deletions(-) diff --git a/drivers/staging/iio/accel/sca3000_core.c b/drivers/staging/iio/accel/sca3000_core.c index 0eb2c4c..e86c1ca 100644 --- a/drivers/staging/iio/accel/sca3000_core.c +++ b/drivers/staging/iio/accel/sca3000_core.c @@ -364,39 +364,14 @@ error_ret: return ret ? ret : len; } -/** - * sca3000_show_available_measurement_modes() display available modes - * - * This is all read from chip specific data in the driver. Not all - * of the sca3000 series support modes other than normal. - **/ -static ssize_t -sca3000_show_available_measurement_modes(struct device *dev, - struct device_attribute *attr, - char *buf) -{ - struct iio_dev *dev_info = dev_get_drvdata(dev); - struct sca3000_state *st = dev_info->dev_data; - int len = 0; - - len += sprintf(buf + len, "0 - normal mode"); - switch (st->info->option_mode_1) { - case SCA3000_OP_MODE_NARROW: - len += sprintf(buf + len, ", 1 - narrow mode"); - break; - case SCA3000_OP_MODE_BYPASS: - len += sprintf(buf + len, ", 1 - bypass mode"); - break; - } - switch (st->info->option_mode_2) { - case SCA3000_OP_MODE_WIDE: - len += sprintf(buf + len, ", 2 - wide mode"); - break; - } - /* always supported */ - len += sprintf(buf + len, " 3 - motion detection\n"); - return len; +static inline +ssize_t sca3000_add_item(char *buf, char *name, int enabled) +{ + if (enabled) + return sprintf(buf, "[%s] ", name); + else + return sprintf(buf, "%s ", name); } /** @@ -418,31 +393,24 @@ sca3000_show_measurement_mode(struct device *dev, goto error_ret; /* mask bottom 2 bits - only ones that are relevant */ rx[1] &= 0x03; - switch (rx[1]) { - case SCA3000_MEAS_MODE_NORMAL: - len += sprintf(buf + len, "0 - normal mode\n"); - break; - case SCA3000_MEAS_MODE_MOT_DET: - len += sprintf(buf + len, "3 - motion detection\n"); + + len += sca3000_add_item(buf+len, "normal", rx[1] == SCA3000_MEAS_MODE_NORMAL); + switch (st->info->option_mode_1) { + case SCA3000_OP_MODE_NARROW: + len += sca3000_add_item(buf+len, "narrow", rx[1] == SCA3000_MEAS_MODE_OP_1); break; - case SCA3000_MEAS_MODE_OP_1: - switch (st->info->option_mode_1) { - case SCA3000_OP_MODE_NARROW: - len += sprintf(buf + len, "1 - narrow mode\n"); - break; - case SCA3000_OP_MODE_BYPASS: - len += sprintf(buf + len, "1 - bypass mode\n"); - break; - } + case SCA3000_OP_MODE_BYPASS: + len += sca3000_add_item(buf+len, "bypass", rx[1] == SCA3000_MEAS_MODE_OP_1); break; - case SCA3000_MEAS_MODE_OP_2: - switch (st->info->option_mode_2) { - case SCA3000_OP_MODE_WIDE: - len += sprintf(buf + len, "2 - wide mode\n"); - break; - } + } + switch (st->info->option_mode_2) { + case SCA3000_OP_MODE_WIDE: + len += sca3000_add_item(buf+len, "wide", rx[1] == SCA3000_MEAS_MODE_OP_2); break; } + /* always supported */ + len += sca3000_add_item(buf+len, "motion", rx[1] == SCA3000_MEAS_MODE_MOT_DET); + len += sprintf(buf+len, "\n"); error_ret: mutex_unlock(&st->lock); @@ -461,15 +429,47 @@ sca3000_store_measurement_mode(struct device *dev, { struct iio_dev *dev_info = dev_get_drvdata(dev); struct sca3000_state *st = dev_info->dev_data; + const char *mode; int ret; u8 *rx; - int mask = 0x03; - long val; + int mask = 0x03, val = 0; mutex_lock(&st->lock); - ret = strict_strtol(buf, 10, &val); - if (ret) - goto error_ret; + + if (!strncmp(buf, "normal", len)) { + val = SCA3000_MEAS_MODE_NORMAL; + goto proceed; + } + switch (st->info->option_mode_1) { + case SCA3000_OP_MODE_NARROW: + mode = "narrow"; + break; + case SCA3000_OP_MODE_BYPASS: + mode = "bypass"; + break; + } + if (!strncmp(buf, mode, len)) { + val = SCA3000_MEAS_MODE_OP_1; + goto proceed; + } + + switch (st->info->option_mode_2) { + case SCA3000_OP_MODE_WIDE: + if (!strncmp(buf, "wide", len)) { + val = SCA3000_MEAS_MODE_OP_1; + goto proceed; + } + } + /* always supported */ + if (!strncmp(buf, "motion", len)) { + val = SCA3000_MEAS_MODE_MOT_DET; + goto proceed; + } + + ret = -EINVAL; + goto error_ret; + +proceed: ret = sca3000_read_data(st, SCA3000_REG_ADDR_MODE, &rx, 1); if (ret) goto error_ret; @@ -491,13 +491,6 @@ error_ret: } -/* Not even vaguely standard attributes so defined here rather than - * in the relevant IIO core headers - */ -static IIO_DEVICE_ATTR(measurement_mode_available, S_IRUGO, - sca3000_show_available_measurement_modes, - NULL, 0); - static IIO_DEVICE_ATTR(measurement_mode, S_IRUGO | S_IWUSR, sca3000_show_measurement_mode, sca3000_store_measurement_mode, @@ -799,7 +792,6 @@ static struct attribute *sca3000_attributes[] = { &iio_dev_attr_accel_x_raw.dev_attr.attr, &iio_dev_attr_accel_y_raw.dev_attr.attr, &iio_dev_attr_accel_z_raw.dev_attr.attr, - &iio_dev_attr_measurement_mode_available.dev_attr.attr, &iio_dev_attr_measurement_mode.dev_attr.attr, &iio_dev_attr_sampling_frequency_available.dev_attr.attr, &iio_dev_attr_sampling_frequency.dev_attr.attr, @@ -813,7 +805,6 @@ static struct attribute *sca3000_attributes_with_temp[] = { &iio_dev_attr_accel_x_raw.dev_attr.attr, &iio_dev_attr_accel_y_raw.dev_attr.attr, &iio_dev_attr_accel_z_raw.dev_attr.attr, - &iio_dev_attr_measurement_mode_available.dev_attr.attr, &iio_dev_attr_measurement_mode.dev_attr.attr, &iio_dev_attr_sampling_frequency_available.dev_attr.attr, &iio_dev_attr_sampling_frequency.dev_attr.attr, -- 1.7.0.6 -- To unsubscribe from this list: send the line "unsubscribe linux-iio" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html