Commit 63b93e70 authored by Greg Kroah-Hartman's avatar Greg Kroah-Hartman

Merge tag 'iio-fixes-for-6.5a' of...

Merge tag 'iio-fixes-for-6.5a' of https://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio into char-misc-linus

Jonathan writes:

1st set of IIO fixes for 6.5

Usual mixed bag of fixes for recently introduced issues and ones from way
back that have recently been noticed.

* core
  - Avoid a device with no parent issues seen on the dummy example device.
* adi,ad71145
  - Drop ref now that dt-schema supports -nanoamp.
* adi,ad7192
  - Fix wrong bit set for enabling AC excitation and exposure of control
    on devices without the feature.
* adi,admv1013
  - Don't ignore errors from regulator_get_voltage().
* amlogic,meson-adc
  - Make sure clocks enabled early enough.
* google,cros_ec
  - Fix undersized cros_ec_command allocation that resulted in a buffer
    overrun.
* rohm,bu27008
  - Fix truncation issue with scale format that prevents smallest value
    being set
  - Report intensity as unsigned. Previously large values would be
    interpretted as negative intensities (and odd concept).
* rohm,bu27034
  - Fix truncation issue with scale format that prevents smallest value
    being set.
* st,lsm6dsx
  - Return an error code, not false (which is 0 and hence success)
    to indicate ACPI mount matrix retrieval failed due to no ACPI
    support.
* ti,ina2xx
  - Avoid a NULL pointer dereference if fall back compatible is used.

* tag 'iio-fixes-for-6.5a' of https://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio:
  iio: cros_ec: Fix the allocation size for cros_ec_command
  iio: imu: lsm6dsx: Fix mount matrix retrieval
  iio: adc: meson: fix core clock enable/disable moment
  iio: core: Prevent invalid memory access when there is no parent
  iio: frequency: admv1013: propagate errors from regulator_get_voltage()
  dt-bindings: iio: adi,ad74115: remove ref from -nanoamp
  iio: adc: ina2xx: avoid NULL pointer dereference on OF device match
  iio: light: bu27008: Fix intensity data type
  iio: light: bu27008: Fix scale format
  iio: light: bu27034: Fix scale format
  iio: adc: ad7192: Fix ac excitation feature
parents bb6578ba 8a462905
...@@ -216,7 +216,6 @@ properties: ...@@ -216,7 +216,6 @@ properties:
description: Whether to enable burnout current for EXT1. description: Whether to enable burnout current for EXT1.
adi,ext1-burnout-current-nanoamp: adi,ext1-burnout-current-nanoamp:
$ref: /schemas/types.yaml#/definitions/uint32
description: description:
Burnout current in nanoamps to be applied to EXT1. Burnout current in nanoamps to be applied to EXT1.
enum: [0, 50, 500, 1000, 10000] enum: [0, 50, 500, 1000, 10000]
...@@ -233,7 +232,6 @@ properties: ...@@ -233,7 +232,6 @@ properties:
description: Whether to enable burnout current for EXT2. description: Whether to enable burnout current for EXT2.
adi,ext2-burnout-current-nanoamp: adi,ext2-burnout-current-nanoamp:
$ref: /schemas/types.yaml#/definitions/uint32
description: Burnout current in nanoamps to be applied to EXT2. description: Burnout current in nanoamps to be applied to EXT2.
enum: [0, 50, 500, 1000, 10000] enum: [0, 50, 500, 1000, 10000]
default: 0 default: 0
...@@ -249,7 +247,6 @@ properties: ...@@ -249,7 +247,6 @@ properties:
description: Whether to enable burnout current for VIOUT. description: Whether to enable burnout current for VIOUT.
adi,viout-burnout-current-nanoamp: adi,viout-burnout-current-nanoamp:
$ref: /schemas/types.yaml#/definitions/uint32
description: Burnout current in nanoamps to be applied to VIOUT. description: Burnout current in nanoamps to be applied to VIOUT.
enum: [0, 1000, 10000] enum: [0, 1000, 10000]
default: 0 default: 0
......
...@@ -62,7 +62,6 @@ ...@@ -62,7 +62,6 @@
#define AD7192_MODE_STA_MASK BIT(20) /* Status Register transmission Mask */ #define AD7192_MODE_STA_MASK BIT(20) /* Status Register transmission Mask */
#define AD7192_MODE_CLKSRC(x) (((x) & 0x3) << 18) /* Clock Source Select */ #define AD7192_MODE_CLKSRC(x) (((x) & 0x3) << 18) /* Clock Source Select */
#define AD7192_MODE_SINC3 BIT(15) /* SINC3 Filter Select */ #define AD7192_MODE_SINC3 BIT(15) /* SINC3 Filter Select */
#define AD7192_MODE_ACX BIT(14) /* AC excitation enable(AD7195 only)*/
#define AD7192_MODE_ENPAR BIT(13) /* Parity Enable */ #define AD7192_MODE_ENPAR BIT(13) /* Parity Enable */
#define AD7192_MODE_CLKDIV BIT(12) /* Clock divide by 2 (AD7190/2 only)*/ #define AD7192_MODE_CLKDIV BIT(12) /* Clock divide by 2 (AD7190/2 only)*/
#define AD7192_MODE_SCYCLE BIT(11) /* Single cycle conversion */ #define AD7192_MODE_SCYCLE BIT(11) /* Single cycle conversion */
...@@ -91,6 +90,7 @@ ...@@ -91,6 +90,7 @@
/* Configuration Register Bit Designations (AD7192_REG_CONF) */ /* Configuration Register Bit Designations (AD7192_REG_CONF) */
#define AD7192_CONF_CHOP BIT(23) /* CHOP enable */ #define AD7192_CONF_CHOP BIT(23) /* CHOP enable */
#define AD7192_CONF_ACX BIT(22) /* AC excitation enable(AD7195 only) */
#define AD7192_CONF_REFSEL BIT(20) /* REFIN1/REFIN2 Reference Select */ #define AD7192_CONF_REFSEL BIT(20) /* REFIN1/REFIN2 Reference Select */
#define AD7192_CONF_CHAN(x) ((x) << 8) /* Channel select */ #define AD7192_CONF_CHAN(x) ((x) << 8) /* Channel select */
#define AD7192_CONF_CHAN_MASK (0x7FF << 8) /* Channel select mask */ #define AD7192_CONF_CHAN_MASK (0x7FF << 8) /* Channel select mask */
...@@ -472,7 +472,7 @@ static ssize_t ad7192_show_ac_excitation(struct device *dev, ...@@ -472,7 +472,7 @@ static ssize_t ad7192_show_ac_excitation(struct device *dev,
struct iio_dev *indio_dev = dev_to_iio_dev(dev); struct iio_dev *indio_dev = dev_to_iio_dev(dev);
struct ad7192_state *st = iio_priv(indio_dev); struct ad7192_state *st = iio_priv(indio_dev);
return sysfs_emit(buf, "%d\n", !!(st->mode & AD7192_MODE_ACX)); return sysfs_emit(buf, "%d\n", !!(st->conf & AD7192_CONF_ACX));
} }
static ssize_t ad7192_show_bridge_switch(struct device *dev, static ssize_t ad7192_show_bridge_switch(struct device *dev,
...@@ -513,13 +513,13 @@ static ssize_t ad7192_set(struct device *dev, ...@@ -513,13 +513,13 @@ static ssize_t ad7192_set(struct device *dev,
ad_sd_write_reg(&st->sd, AD7192_REG_GPOCON, 1, st->gpocon); ad_sd_write_reg(&st->sd, AD7192_REG_GPOCON, 1, st->gpocon);
break; break;
case AD7192_REG_MODE: case AD7192_REG_CONF:
if (val) if (val)
st->mode |= AD7192_MODE_ACX; st->conf |= AD7192_CONF_ACX;
else else
st->mode &= ~AD7192_MODE_ACX; st->conf &= ~AD7192_CONF_ACX;
ad_sd_write_reg(&st->sd, AD7192_REG_MODE, 3, st->mode); ad_sd_write_reg(&st->sd, AD7192_REG_CONF, 3, st->conf);
break; break;
default: default:
ret = -EINVAL; ret = -EINVAL;
...@@ -579,12 +579,11 @@ static IIO_DEVICE_ATTR(bridge_switch_en, 0644, ...@@ -579,12 +579,11 @@ static IIO_DEVICE_ATTR(bridge_switch_en, 0644,
static IIO_DEVICE_ATTR(ac_excitation_en, 0644, static IIO_DEVICE_ATTR(ac_excitation_en, 0644,
ad7192_show_ac_excitation, ad7192_set, ad7192_show_ac_excitation, ad7192_set,
AD7192_REG_MODE); AD7192_REG_CONF);
static struct attribute *ad7192_attributes[] = { static struct attribute *ad7192_attributes[] = {
&iio_dev_attr_filter_low_pass_3db_frequency_available.dev_attr.attr, &iio_dev_attr_filter_low_pass_3db_frequency_available.dev_attr.attr,
&iio_dev_attr_bridge_switch_en.dev_attr.attr, &iio_dev_attr_bridge_switch_en.dev_attr.attr,
&iio_dev_attr_ac_excitation_en.dev_attr.attr,
NULL NULL
}; };
...@@ -595,6 +594,7 @@ static const struct attribute_group ad7192_attribute_group = { ...@@ -595,6 +594,7 @@ static const struct attribute_group ad7192_attribute_group = {
static struct attribute *ad7195_attributes[] = { static struct attribute *ad7195_attributes[] = {
&iio_dev_attr_filter_low_pass_3db_frequency_available.dev_attr.attr, &iio_dev_attr_filter_low_pass_3db_frequency_available.dev_attr.attr,
&iio_dev_attr_bridge_switch_en.dev_attr.attr, &iio_dev_attr_bridge_switch_en.dev_attr.attr,
&iio_dev_attr_ac_excitation_en.dev_attr.attr,
NULL NULL
}; };
......
...@@ -124,6 +124,7 @@ static const struct regmap_config ina2xx_regmap_config = { ...@@ -124,6 +124,7 @@ static const struct regmap_config ina2xx_regmap_config = {
enum ina2xx_ids { ina219, ina226 }; enum ina2xx_ids { ina219, ina226 };
struct ina2xx_config { struct ina2xx_config {
const char *name;
u16 config_default; u16 config_default;
int calibration_value; int calibration_value;
int shunt_voltage_lsb; /* nV */ int shunt_voltage_lsb; /* nV */
...@@ -155,6 +156,7 @@ struct ina2xx_chip_info { ...@@ -155,6 +156,7 @@ struct ina2xx_chip_info {
static const struct ina2xx_config ina2xx_config[] = { static const struct ina2xx_config ina2xx_config[] = {
[ina219] = { [ina219] = {
.name = "ina219",
.config_default = INA219_CONFIG_DEFAULT, .config_default = INA219_CONFIG_DEFAULT,
.calibration_value = 4096, .calibration_value = 4096,
.shunt_voltage_lsb = 10000, .shunt_voltage_lsb = 10000,
...@@ -164,6 +166,7 @@ static const struct ina2xx_config ina2xx_config[] = { ...@@ -164,6 +166,7 @@ static const struct ina2xx_config ina2xx_config[] = {
.chip_id = ina219, .chip_id = ina219,
}, },
[ina226] = { [ina226] = {
.name = "ina226",
.config_default = INA226_CONFIG_DEFAULT, .config_default = INA226_CONFIG_DEFAULT,
.calibration_value = 2048, .calibration_value = 2048,
.shunt_voltage_lsb = 2500, .shunt_voltage_lsb = 2500,
...@@ -996,7 +999,7 @@ static int ina2xx_probe(struct i2c_client *client) ...@@ -996,7 +999,7 @@ static int ina2xx_probe(struct i2c_client *client)
/* Patch the current config register with default. */ /* Patch the current config register with default. */
val = chip->config->config_default; val = chip->config->config_default;
if (id->driver_data == ina226) { if (type == ina226) {
ina226_set_average(chip, INA226_DEFAULT_AVG, &val); ina226_set_average(chip, INA226_DEFAULT_AVG, &val);
ina226_set_int_time_vbus(chip, INA226_DEFAULT_IT, &val); ina226_set_int_time_vbus(chip, INA226_DEFAULT_IT, &val);
ina226_set_int_time_vshunt(chip, INA226_DEFAULT_IT, &val); ina226_set_int_time_vshunt(chip, INA226_DEFAULT_IT, &val);
...@@ -1015,7 +1018,7 @@ static int ina2xx_probe(struct i2c_client *client) ...@@ -1015,7 +1018,7 @@ static int ina2xx_probe(struct i2c_client *client)
} }
indio_dev->modes = INDIO_DIRECT_MODE; indio_dev->modes = INDIO_DIRECT_MODE;
if (id->driver_data == ina226) { if (type == ina226) {
indio_dev->channels = ina226_channels; indio_dev->channels = ina226_channels;
indio_dev->num_channels = ARRAY_SIZE(ina226_channels); indio_dev->num_channels = ARRAY_SIZE(ina226_channels);
indio_dev->info = &ina226_info; indio_dev->info = &ina226_info;
...@@ -1024,7 +1027,7 @@ static int ina2xx_probe(struct i2c_client *client) ...@@ -1024,7 +1027,7 @@ static int ina2xx_probe(struct i2c_client *client)
indio_dev->num_channels = ARRAY_SIZE(ina219_channels); indio_dev->num_channels = ARRAY_SIZE(ina219_channels);
indio_dev->info = &ina219_info; indio_dev->info = &ina219_info;
} }
indio_dev->name = id->name; indio_dev->name = id ? id->name : chip->config->name;
ret = devm_iio_kfifo_buffer_setup(&client->dev, indio_dev, ret = devm_iio_kfifo_buffer_setup(&client->dev, indio_dev,
&ina2xx_setup_ops); &ina2xx_setup_ops);
......
...@@ -916,12 +916,6 @@ static int meson_sar_adc_hw_enable(struct iio_dev *indio_dev) ...@@ -916,12 +916,6 @@ static int meson_sar_adc_hw_enable(struct iio_dev *indio_dev)
goto err_vref; goto err_vref;
} }
ret = clk_prepare_enable(priv->core_clk);
if (ret) {
dev_err(dev, "failed to enable core clk\n");
goto err_core_clk;
}
regval = FIELD_PREP(MESON_SAR_ADC_REG0_FIFO_CNT_IRQ_MASK, 1); regval = FIELD_PREP(MESON_SAR_ADC_REG0_FIFO_CNT_IRQ_MASK, 1);
regmap_update_bits(priv->regmap, MESON_SAR_ADC_REG0, regmap_update_bits(priv->regmap, MESON_SAR_ADC_REG0,
MESON_SAR_ADC_REG0_FIFO_CNT_IRQ_MASK, regval); MESON_SAR_ADC_REG0_FIFO_CNT_IRQ_MASK, regval);
...@@ -948,8 +942,6 @@ static int meson_sar_adc_hw_enable(struct iio_dev *indio_dev) ...@@ -948,8 +942,6 @@ static int meson_sar_adc_hw_enable(struct iio_dev *indio_dev)
regmap_update_bits(priv->regmap, MESON_SAR_ADC_REG3, regmap_update_bits(priv->regmap, MESON_SAR_ADC_REG3,
MESON_SAR_ADC_REG3_ADC_EN, 0); MESON_SAR_ADC_REG3_ADC_EN, 0);
meson_sar_adc_set_bandgap(indio_dev, false); meson_sar_adc_set_bandgap(indio_dev, false);
clk_disable_unprepare(priv->core_clk);
err_core_clk:
regulator_disable(priv->vref); regulator_disable(priv->vref);
err_vref: err_vref:
meson_sar_adc_unlock(indio_dev); meson_sar_adc_unlock(indio_dev);
...@@ -977,8 +969,6 @@ static void meson_sar_adc_hw_disable(struct iio_dev *indio_dev) ...@@ -977,8 +969,6 @@ static void meson_sar_adc_hw_disable(struct iio_dev *indio_dev)
meson_sar_adc_set_bandgap(indio_dev, false); meson_sar_adc_set_bandgap(indio_dev, false);
clk_disable_unprepare(priv->core_clk);
regulator_disable(priv->vref); regulator_disable(priv->vref);
if (!ret) if (!ret)
...@@ -1211,7 +1201,7 @@ static int meson_sar_adc_probe(struct platform_device *pdev) ...@@ -1211,7 +1201,7 @@ static int meson_sar_adc_probe(struct platform_device *pdev)
if (IS_ERR(priv->clkin)) if (IS_ERR(priv->clkin))
return dev_err_probe(dev, PTR_ERR(priv->clkin), "failed to get clkin\n"); return dev_err_probe(dev, PTR_ERR(priv->clkin), "failed to get clkin\n");
priv->core_clk = devm_clk_get(dev, "core"); priv->core_clk = devm_clk_get_enabled(dev, "core");
if (IS_ERR(priv->core_clk)) if (IS_ERR(priv->core_clk))
return dev_err_probe(dev, PTR_ERR(priv->core_clk), "failed to get core clk\n"); return dev_err_probe(dev, PTR_ERR(priv->core_clk), "failed to get core clk\n");
...@@ -1294,15 +1284,26 @@ static int meson_sar_adc_remove(struct platform_device *pdev) ...@@ -1294,15 +1284,26 @@ static int meson_sar_adc_remove(struct platform_device *pdev)
static int meson_sar_adc_suspend(struct device *dev) static int meson_sar_adc_suspend(struct device *dev)
{ {
struct iio_dev *indio_dev = dev_get_drvdata(dev); struct iio_dev *indio_dev = dev_get_drvdata(dev);
struct meson_sar_adc_priv *priv = iio_priv(indio_dev);
meson_sar_adc_hw_disable(indio_dev); meson_sar_adc_hw_disable(indio_dev);
clk_disable_unprepare(priv->core_clk);
return 0; return 0;
} }
static int meson_sar_adc_resume(struct device *dev) static int meson_sar_adc_resume(struct device *dev)
{ {
struct iio_dev *indio_dev = dev_get_drvdata(dev); struct iio_dev *indio_dev = dev_get_drvdata(dev);
struct meson_sar_adc_priv *priv = iio_priv(indio_dev);
int ret;
ret = clk_prepare_enable(priv->core_clk);
if (ret) {
dev_err(dev, "failed to enable core clk\n");
return ret;
}
return meson_sar_adc_hw_enable(indio_dev); return meson_sar_adc_hw_enable(indio_dev);
} }
......
...@@ -253,7 +253,7 @@ int cros_ec_sensors_core_init(struct platform_device *pdev, ...@@ -253,7 +253,7 @@ int cros_ec_sensors_core_init(struct platform_device *pdev,
platform_set_drvdata(pdev, indio_dev); platform_set_drvdata(pdev, indio_dev);
state->ec = ec->ec_dev; state->ec = ec->ec_dev;
state->msg = devm_kzalloc(&pdev->dev, state->msg = devm_kzalloc(&pdev->dev, sizeof(*state->msg) +
max((u16)sizeof(struct ec_params_motion_sense), max((u16)sizeof(struct ec_params_motion_sense),
state->ec->max_response), GFP_KERNEL); state->ec->max_response), GFP_KERNEL);
if (!state->msg) if (!state->msg)
......
...@@ -344,9 +344,12 @@ static int admv1013_update_quad_filters(struct admv1013_state *st) ...@@ -344,9 +344,12 @@ static int admv1013_update_quad_filters(struct admv1013_state *st)
static int admv1013_update_mixer_vgate(struct admv1013_state *st) static int admv1013_update_mixer_vgate(struct admv1013_state *st)
{ {
unsigned int vcm, mixer_vgate; unsigned int mixer_vgate;
int vcm;
vcm = regulator_get_voltage(st->reg); vcm = regulator_get_voltage(st->reg);
if (vcm < 0)
return vcm;
if (vcm < 1800000) if (vcm < 1800000)
mixer_vgate = (2389 * vcm / 1000000 + 8100) / 100; mixer_vgate = (2389 * vcm / 1000000 + 8100) / 100;
......
...@@ -2687,7 +2687,7 @@ static int lsm6dsx_get_acpi_mount_matrix(struct device *dev, ...@@ -2687,7 +2687,7 @@ static int lsm6dsx_get_acpi_mount_matrix(struct device *dev,
static int lsm6dsx_get_acpi_mount_matrix(struct device *dev, static int lsm6dsx_get_acpi_mount_matrix(struct device *dev,
struct iio_mount_matrix *orientation) struct iio_mount_matrix *orientation)
{ {
return false; return -EOPNOTSUPP;
} }
#endif #endif
......
...@@ -1888,7 +1888,7 @@ static const struct iio_buffer_setup_ops noop_ring_setup_ops; ...@@ -1888,7 +1888,7 @@ static const struct iio_buffer_setup_ops noop_ring_setup_ops;
int __iio_device_register(struct iio_dev *indio_dev, struct module *this_mod) int __iio_device_register(struct iio_dev *indio_dev, struct module *this_mod)
{ {
struct iio_dev_opaque *iio_dev_opaque = to_iio_dev_opaque(indio_dev); struct iio_dev_opaque *iio_dev_opaque = to_iio_dev_opaque(indio_dev);
struct fwnode_handle *fwnode; struct fwnode_handle *fwnode = NULL;
int ret; int ret;
if (!indio_dev->info) if (!indio_dev->info)
...@@ -1899,7 +1899,8 @@ int __iio_device_register(struct iio_dev *indio_dev, struct module *this_mod) ...@@ -1899,7 +1899,8 @@ int __iio_device_register(struct iio_dev *indio_dev, struct module *this_mod)
/* If the calling driver did not initialize firmware node, do it here */ /* If the calling driver did not initialize firmware node, do it here */
if (dev_fwnode(&indio_dev->dev)) if (dev_fwnode(&indio_dev->dev))
fwnode = dev_fwnode(&indio_dev->dev); fwnode = dev_fwnode(&indio_dev->dev);
else /* The default dummy IIO device has no parent */
else if (indio_dev->dev.parent)
fwnode = dev_fwnode(indio_dev->dev.parent); fwnode = dev_fwnode(indio_dev->dev.parent);
device_set_node(&indio_dev->dev, fwnode); device_set_node(&indio_dev->dev, fwnode);
......
...@@ -190,7 +190,7 @@ static const struct iio_itime_sel_mul bu27008_itimes[] = { ...@@ -190,7 +190,7 @@ static const struct iio_itime_sel_mul bu27008_itimes[] = {
.address = BU27008_REG_##data##_LO, \ .address = BU27008_REG_##data##_LO, \
.scan_index = BU27008_##color, \ .scan_index = BU27008_##color, \
.scan_type = { \ .scan_type = { \
.sign = 's', \ .sign = 'u', \
.realbits = 16, \ .realbits = 16, \
.storagebits = 16, \ .storagebits = 16, \
.endianness = IIO_LE, \ .endianness = IIO_LE, \
...@@ -633,7 +633,7 @@ static int bu27008_try_find_new_time_gain(struct bu27008_data *data, int val, ...@@ -633,7 +633,7 @@ static int bu27008_try_find_new_time_gain(struct bu27008_data *data, int val,
for (i = 0; i < data->gts.num_itime; i++) { for (i = 0; i < data->gts.num_itime; i++) {
new_time_sel = data->gts.itime_table[i].sel; new_time_sel = data->gts.itime_table[i].sel;
ret = iio_gts_find_gain_sel_for_scale_using_time(&data->gts, ret = iio_gts_find_gain_sel_for_scale_using_time(&data->gts,
new_time_sel, val, val2 * 1000, gain_sel); new_time_sel, val, val2, gain_sel);
if (!ret) if (!ret)
break; break;
} }
...@@ -662,7 +662,7 @@ static int bu27008_set_scale(struct bu27008_data *data, ...@@ -662,7 +662,7 @@ static int bu27008_set_scale(struct bu27008_data *data,
goto unlock_out; goto unlock_out;
ret = iio_gts_find_gain_sel_for_scale_using_time(&data->gts, time_sel, ret = iio_gts_find_gain_sel_for_scale_using_time(&data->gts, time_sel,
val, val2 * 1000, &gain_sel); val, val2, &gain_sel);
if (ret) { if (ret) {
ret = bu27008_try_find_new_time_gain(data, val, val2, &gain_sel); ret = bu27008_try_find_new_time_gain(data, val, val2, &gain_sel);
if (ret) if (ret)
...@@ -677,6 +677,21 @@ static int bu27008_set_scale(struct bu27008_data *data, ...@@ -677,6 +677,21 @@ static int bu27008_set_scale(struct bu27008_data *data,
return ret; return ret;
} }
static int bu27008_write_raw_get_fmt(struct iio_dev *indio_dev,
struct iio_chan_spec const *chan,
long mask)
{
switch (mask) {
case IIO_CHAN_INFO_SCALE:
return IIO_VAL_INT_PLUS_NANO;
case IIO_CHAN_INFO_INT_TIME:
return IIO_VAL_INT_PLUS_MICRO;
default:
return -EINVAL;
}
}
static int bu27008_write_raw(struct iio_dev *idev, static int bu27008_write_raw(struct iio_dev *idev,
struct iio_chan_spec const *chan, struct iio_chan_spec const *chan,
int val, int val2, long mask) int val, int val2, long mask)
...@@ -756,6 +771,7 @@ static int bu27008_update_scan_mode(struct iio_dev *idev, ...@@ -756,6 +771,7 @@ static int bu27008_update_scan_mode(struct iio_dev *idev,
static const struct iio_info bu27008_info = { static const struct iio_info bu27008_info = {
.read_raw = &bu27008_read_raw, .read_raw = &bu27008_read_raw,
.write_raw = &bu27008_write_raw, .write_raw = &bu27008_write_raw,
.write_raw_get_fmt = &bu27008_write_raw_get_fmt,
.read_avail = &bu27008_read_avail, .read_avail = &bu27008_read_avail,
.update_scan_mode = bu27008_update_scan_mode, .update_scan_mode = bu27008_update_scan_mode,
.validate_trigger = iio_validate_own_trigger, .validate_trigger = iio_validate_own_trigger,
......
...@@ -575,7 +575,7 @@ static int bu27034_set_scale(struct bu27034_data *data, int chan, ...@@ -575,7 +575,7 @@ static int bu27034_set_scale(struct bu27034_data *data, int chan,
return -EINVAL; return -EINVAL;
if (chan == BU27034_CHAN_ALS) { if (chan == BU27034_CHAN_ALS) {
if (val == 0 && val2 == 1000) if (val == 0 && val2 == 1000000)
return 0; return 0;
return -EINVAL; return -EINVAL;
...@@ -587,7 +587,7 @@ static int bu27034_set_scale(struct bu27034_data *data, int chan, ...@@ -587,7 +587,7 @@ static int bu27034_set_scale(struct bu27034_data *data, int chan,
goto unlock_out; goto unlock_out;
ret = iio_gts_find_gain_sel_for_scale_using_time(&data->gts, time_sel, ret = iio_gts_find_gain_sel_for_scale_using_time(&data->gts, time_sel,
val, val2 * 1000, &gain_sel); val, val2, &gain_sel);
if (ret) { if (ret) {
/* /*
* Could not support scale with given time. Need to change time. * Could not support scale with given time. Need to change time.
...@@ -624,7 +624,7 @@ static int bu27034_set_scale(struct bu27034_data *data, int chan, ...@@ -624,7 +624,7 @@ static int bu27034_set_scale(struct bu27034_data *data, int chan,
/* Can we provide requested scale with this time? */ /* Can we provide requested scale with this time? */
ret = iio_gts_find_gain_sel_for_scale_using_time( ret = iio_gts_find_gain_sel_for_scale_using_time(
&data->gts, new_time_sel, val, val2 * 1000, &data->gts, new_time_sel, val, val2,
&gain_sel); &gain_sel);
if (ret) if (ret)
continue; continue;
...@@ -1217,6 +1217,21 @@ static int bu27034_read_raw(struct iio_dev *idev, ...@@ -1217,6 +1217,21 @@ static int bu27034_read_raw(struct iio_dev *idev,
} }
} }
static int bu27034_write_raw_get_fmt(struct iio_dev *indio_dev,
struct iio_chan_spec const *chan,
long mask)
{
switch (mask) {
case IIO_CHAN_INFO_SCALE:
return IIO_VAL_INT_PLUS_NANO;
case IIO_CHAN_INFO_INT_TIME:
return IIO_VAL_INT_PLUS_MICRO;
default:
return -EINVAL;
}
}
static int bu27034_write_raw(struct iio_dev *idev, static int bu27034_write_raw(struct iio_dev *idev,
struct iio_chan_spec const *chan, struct iio_chan_spec const *chan,
int val, int val2, long mask) int val, int val2, long mask)
...@@ -1267,6 +1282,7 @@ static int bu27034_read_avail(struct iio_dev *idev, ...@@ -1267,6 +1282,7 @@ static int bu27034_read_avail(struct iio_dev *idev,
static const struct iio_info bu27034_info = { static const struct iio_info bu27034_info = {
.read_raw = &bu27034_read_raw, .read_raw = &bu27034_read_raw,
.write_raw = &bu27034_write_raw, .write_raw = &bu27034_write_raw,
.write_raw_get_fmt = &bu27034_write_raw_get_fmt,
.read_avail = &bu27034_read_avail, .read_avail = &bu27034_read_avail,
}; };
......
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