mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 19:21:31 -04:00
Linux 4.2-rc4
-----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQEcBAABAgAGBQJVtTRqAAoJEHm+PkMAQRiGN+wH/1mPJBCvt7DqvV90+/QKPEA6 KXWtiy+oDavOv1vPcwL4gdYmMqXd2fSv82Zv5+E5ABFHXSyZvG5eCZvQLPz0V73f ldrSgTYVfbYb0W+TnaC1gr8aMS38i4F/eXCoPZMtO8WyUn7xhJZS9Y3U8Ff4/gp3 to+4TaHhsnv2R79UyoR4elObo2n6aMkBSertjndbYoEQ4Zgr5iIoxbMDi4raeghP BLB6Mh50tqNMxE5OL/ERj1oHmJK9TIy2sNmOhP/1xp7XGK/KZm8Z+CIglaf1gOcM IM8pEgwDIlxp78MERn/PB/+xDkgUw0W9OqKPcUxiIt+M7TNRQ9UTb4Tn1SR2/cE= =fHSS -----END PGP SIGNATURE----- Merge tag 'v4.2-rc4' into devel Linux 4.2-rc4
This commit is contained in:
commit
5f6f02cd49
775 changed files with 6183 additions and 4407 deletions
|
|
@ -1464,7 +1464,7 @@ static void bmc150_accel_unregister_triggers(struct bmc150_accel_data *data,
|
|||
{
|
||||
int i;
|
||||
|
||||
for (i = from; i >= 0; i++) {
|
||||
for (i = from; i >= 0; i--) {
|
||||
if (data->triggers[i].indio_trig) {
|
||||
iio_trigger_unregister(data->triggers[i].indio_trig);
|
||||
data->triggers[i].indio_trig = NULL;
|
||||
|
|
|
|||
|
|
@ -557,21 +557,21 @@ static void mma8452_transient_interrupt(struct iio_dev *indio_dev)
|
|||
if (src & MMA8452_TRANSIENT_SRC_XTRANSE)
|
||||
iio_push_event(indio_dev,
|
||||
IIO_MOD_EVENT_CODE(IIO_ACCEL, 0, IIO_MOD_X,
|
||||
IIO_EV_TYPE_THRESH,
|
||||
IIO_EV_TYPE_MAG,
|
||||
IIO_EV_DIR_RISING),
|
||||
ts);
|
||||
|
||||
if (src & MMA8452_TRANSIENT_SRC_YTRANSE)
|
||||
iio_push_event(indio_dev,
|
||||
IIO_MOD_EVENT_CODE(IIO_ACCEL, 0, IIO_MOD_Y,
|
||||
IIO_EV_TYPE_THRESH,
|
||||
IIO_EV_TYPE_MAG,
|
||||
IIO_EV_DIR_RISING),
|
||||
ts);
|
||||
|
||||
if (src & MMA8452_TRANSIENT_SRC_ZTRANSE)
|
||||
iio_push_event(indio_dev,
|
||||
IIO_MOD_EVENT_CODE(IIO_ACCEL, 0, IIO_MOD_Z,
|
||||
IIO_EV_TYPE_THRESH,
|
||||
IIO_EV_TYPE_MAG,
|
||||
IIO_EV_DIR_RISING),
|
||||
ts);
|
||||
}
|
||||
|
|
@ -644,7 +644,7 @@ static int mma8452_reg_access_dbg(struct iio_dev *indio_dev,
|
|||
|
||||
static const struct iio_event_spec mma8452_transient_event[] = {
|
||||
{
|
||||
.type = IIO_EV_TYPE_THRESH,
|
||||
.type = IIO_EV_TYPE_MAG,
|
||||
.dir = IIO_EV_DIR_RISING,
|
||||
.mask_separate = BIT(IIO_EV_INFO_ENABLE),
|
||||
.mask_shared_by_type = BIT(IIO_EV_INFO_VALUE) |
|
||||
|
|
|
|||
|
|
@ -153,8 +153,7 @@ config DA9150_GPADC
|
|||
|
||||
config CC10001_ADC
|
||||
tristate "Cosmic Circuits 10001 ADC driver"
|
||||
depends on HAVE_CLK || REGULATOR
|
||||
depends on HAS_IOMEM
|
||||
depends on HAS_IOMEM && HAVE_CLK && REGULATOR
|
||||
select IIO_BUFFER
|
||||
select IIO_TRIGGERED_BUFFER
|
||||
help
|
||||
|
|
|
|||
|
|
@ -182,7 +182,7 @@ struct at91_adc_caps {
|
|||
u8 ts_pen_detect_sensitivity;
|
||||
|
||||
/* startup time calculate function */
|
||||
u32 (*calc_startup_ticks)(u8 startup_time, u32 adc_clk_khz);
|
||||
u32 (*calc_startup_ticks)(u32 startup_time, u32 adc_clk_khz);
|
||||
|
||||
u8 num_channels;
|
||||
struct at91_adc_reg_desc registers;
|
||||
|
|
@ -201,7 +201,7 @@ struct at91_adc_state {
|
|||
u8 num_channels;
|
||||
void __iomem *reg_base;
|
||||
struct at91_adc_reg_desc *registers;
|
||||
u8 startup_time;
|
||||
u32 startup_time;
|
||||
u8 sample_hold_time;
|
||||
bool sleep_mode;
|
||||
struct iio_trigger **trig;
|
||||
|
|
@ -779,7 +779,7 @@ ret:
|
|||
return ret;
|
||||
}
|
||||
|
||||
static u32 calc_startup_ticks_9260(u8 startup_time, u32 adc_clk_khz)
|
||||
static u32 calc_startup_ticks_9260(u32 startup_time, u32 adc_clk_khz)
|
||||
{
|
||||
/*
|
||||
* Number of ticks needed to cover the startup time of the ADC
|
||||
|
|
@ -790,7 +790,7 @@ static u32 calc_startup_ticks_9260(u8 startup_time, u32 adc_clk_khz)
|
|||
return round_up((startup_time * adc_clk_khz / 1000) - 1, 8) / 8;
|
||||
}
|
||||
|
||||
static u32 calc_startup_ticks_9x5(u8 startup_time, u32 adc_clk_khz)
|
||||
static u32 calc_startup_ticks_9x5(u32 startup_time, u32 adc_clk_khz)
|
||||
{
|
||||
/*
|
||||
* For sama5d3x and at91sam9x5, the formula changes to:
|
||||
|
|
|
|||
|
|
@ -299,6 +299,8 @@ static int mcp320x_probe(struct spi_device *spi)
|
|||
indio_dev->channels = chip_info->channels;
|
||||
indio_dev->num_channels = chip_info->num_channels;
|
||||
|
||||
adc->chip_info = chip_info;
|
||||
|
||||
adc->transfer[0].tx_buf = &adc->tx_buf;
|
||||
adc->transfer[0].len = sizeof(adc->tx_buf);
|
||||
adc->transfer[1].rx_buf = adc->rx_buf;
|
||||
|
|
|
|||
|
|
@ -349,3 +349,7 @@ static struct platform_driver rockchip_saradc_driver = {
|
|||
};
|
||||
|
||||
module_platform_driver(rockchip_saradc_driver);
|
||||
|
||||
MODULE_AUTHOR("Heiko Stuebner <[email protected]>");
|
||||
MODULE_DESCRIPTION("Rockchip SARADC driver");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
|
|
|||
|
|
@ -833,7 +833,8 @@ static int twl4030_madc_probe(struct platform_device *pdev)
|
|||
irq = platform_get_irq(pdev, 0);
|
||||
ret = devm_request_threaded_irq(&pdev->dev, irq, NULL,
|
||||
twl4030_madc_threaded_irq_handler,
|
||||
IRQF_TRIGGER_RISING, "twl4030_madc", madc);
|
||||
IRQF_TRIGGER_RISING | IRQF_ONESHOT,
|
||||
"twl4030_madc", madc);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "could not request irq\n");
|
||||
goto err_i2c;
|
||||
|
|
|
|||
|
|
@ -635,7 +635,7 @@ static int vf610_adc_reg_access(struct iio_dev *indio_dev,
|
|||
struct vf610_adc *info = iio_priv(indio_dev);
|
||||
|
||||
if ((readval == NULL) ||
|
||||
(!(reg % 4) || (reg > VF610_REG_ADC_PCTL)))
|
||||
((reg % 4) || (reg > VF610_REG_ADC_PCTL)))
|
||||
return -EINVAL;
|
||||
|
||||
*readval = readl(info->regs + reg);
|
||||
|
|
|
|||
|
|
@ -36,6 +36,8 @@ static int _hid_sensor_power_state(struct hid_sensor_common *st, bool state)
|
|||
s32 poll_value = 0;
|
||||
|
||||
if (state) {
|
||||
if (!atomic_read(&st->user_requested_state))
|
||||
return 0;
|
||||
if (sensor_hub_device_open(st->hsdev))
|
||||
return -EIO;
|
||||
|
||||
|
|
@ -52,8 +54,12 @@ static int _hid_sensor_power_state(struct hid_sensor_common *st, bool state)
|
|||
|
||||
poll_value = hid_sensor_read_poll_value(st);
|
||||
} else {
|
||||
if (!atomic_dec_and_test(&st->data_ready))
|
||||
int val;
|
||||
|
||||
val = atomic_dec_if_positive(&st->data_ready);
|
||||
if (val < 0)
|
||||
return 0;
|
||||
|
||||
sensor_hub_device_close(st->hsdev);
|
||||
state_val = hid_sensor_get_usage_index(st->hsdev,
|
||||
st->power_state.report_id,
|
||||
|
|
@ -92,9 +98,11 @@ EXPORT_SYMBOL(hid_sensor_power_state);
|
|||
|
||||
int hid_sensor_power_state(struct hid_sensor_common *st, bool state)
|
||||
{
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
int ret;
|
||||
|
||||
atomic_set(&st->user_requested_state, state);
|
||||
if (state)
|
||||
ret = pm_runtime_get_sync(&st->pdev->dev);
|
||||
else {
|
||||
|
|
@ -109,6 +117,7 @@ int hid_sensor_power_state(struct hid_sensor_common *st, bool state)
|
|||
|
||||
return 0;
|
||||
#else
|
||||
atomic_set(&st->user_requested_state, state);
|
||||
return _hid_sensor_power_state(st, state);
|
||||
#endif
|
||||
}
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@
|
|||
#include "ad5624r.h"
|
||||
|
||||
static int ad5624r_spi_write(struct spi_device *spi,
|
||||
u8 cmd, u8 addr, u16 val, u8 len)
|
||||
u8 cmd, u8 addr, u16 val, u8 shift)
|
||||
{
|
||||
u32 data;
|
||||
u8 msg[3];
|
||||
|
|
@ -35,7 +35,7 @@ static int ad5624r_spi_write(struct spi_device *spi,
|
|||
* 14-, 12-bit input code followed by 0, 2, or 4 don't care bits,
|
||||
* for the AD5664R, AD5644R, and AD5624R, respectively.
|
||||
*/
|
||||
data = (0 << 22) | (cmd << 19) | (addr << 16) | (val << (16 - len));
|
||||
data = (0 << 22) | (cmd << 19) | (addr << 16) | (val << shift);
|
||||
msg[0] = data >> 16;
|
||||
msg[1] = data >> 8;
|
||||
msg[2] = data;
|
||||
|
|
|
|||
|
|
@ -431,6 +431,23 @@ static int inv_mpu6050_write_gyro_scale(struct inv_mpu6050_state *st, int val)
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
static int inv_write_raw_get_fmt(struct iio_dev *indio_dev,
|
||||
struct iio_chan_spec const *chan, long mask)
|
||||
{
|
||||
switch (mask) {
|
||||
case IIO_CHAN_INFO_SCALE:
|
||||
switch (chan->type) {
|
||||
case IIO_ANGL_VEL:
|
||||
return IIO_VAL_INT_PLUS_NANO;
|
||||
default:
|
||||
return IIO_VAL_INT_PLUS_MICRO;
|
||||
}
|
||||
default:
|
||||
return IIO_VAL_INT_PLUS_MICRO;
|
||||
}
|
||||
|
||||
return -EINVAL;
|
||||
}
|
||||
static int inv_mpu6050_write_accel_scale(struct inv_mpu6050_state *st, int val)
|
||||
{
|
||||
int result, i;
|
||||
|
|
@ -696,6 +713,7 @@ static const struct iio_info mpu_info = {
|
|||
.driver_module = THIS_MODULE,
|
||||
.read_raw = &inv_mpu6050_read_raw,
|
||||
.write_raw = &inv_mpu6050_write_raw,
|
||||
.write_raw_get_fmt = &inv_write_raw_get_fmt,
|
||||
.attrs = &inv_attribute_group,
|
||||
.validate_trigger = inv_mpu6050_validate_trigger,
|
||||
};
|
||||
|
|
|
|||
|
|
@ -188,6 +188,7 @@ config SENSORS_LM3533
|
|||
config LTR501
|
||||
tristate "LTR-501ALS-01 light sensor"
|
||||
depends on I2C
|
||||
select REGMAP_I2C
|
||||
select IIO_BUFFER
|
||||
select IIO_TRIGGERED_BUFFER
|
||||
help
|
||||
|
|
@ -201,6 +202,7 @@ config LTR501
|
|||
config STK3310
|
||||
tristate "STK3310 ALS and proximity sensor"
|
||||
depends on I2C
|
||||
select REGMAP_I2C
|
||||
help
|
||||
Say yes here to get support for the Sensortek STK3310 ambient light
|
||||
and proximity sensor. The STK3311 model is also supported by this
|
||||
|
|
|
|||
|
|
@ -123,7 +123,7 @@ static int cm3323_set_it_bits(struct cm3323_data *data, int val, int val2)
|
|||
for (i = 0; i < ARRAY_SIZE(cm3323_int_time); i++) {
|
||||
if (val == cm3323_int_time[i].val &&
|
||||
val2 == cm3323_int_time[i].val2) {
|
||||
reg_conf = data->reg_conf;
|
||||
reg_conf = data->reg_conf & ~CM3323_CONF_IT_MASK;
|
||||
reg_conf |= i << CM3323_CONF_IT_SHIFT;
|
||||
|
||||
ret = i2c_smbus_write_word_data(data->client,
|
||||
|
|
|
|||
|
|
@ -1302,7 +1302,7 @@ static int ltr501_init(struct ltr501_data *data)
|
|||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
data->als_contr = ret | data->chip_info->als_mode_active;
|
||||
data->als_contr = status | data->chip_info->als_mode_active;
|
||||
|
||||
ret = regmap_read(data->regmap, LTR501_PS_CONTR, &status);
|
||||
if (ret < 0)
|
||||
|
|
|
|||
|
|
@ -43,7 +43,6 @@
|
|||
#define STK3311_CHIP_ID_VAL 0x1D
|
||||
#define STK3310_PSINT_EN 0x01
|
||||
#define STK3310_PS_MAX_VAL 0xFFFF
|
||||
#define STK3310_THRESH_MAX 0xFFFF
|
||||
|
||||
#define STK3310_DRIVER_NAME "stk3310"
|
||||
#define STK3310_REGMAP_NAME "stk3310_regmap"
|
||||
|
|
@ -84,15 +83,13 @@ static const struct reg_field stk3310_reg_field_flag_psint =
|
|||
REG_FIELD(STK3310_REG_FLAG, 4, 4);
|
||||
static const struct reg_field stk3310_reg_field_flag_nf =
|
||||
REG_FIELD(STK3310_REG_FLAG, 0, 0);
|
||||
/*
|
||||
* Maximum PS values with regard to scale. Used to export the 'inverse'
|
||||
* PS value (high values for far objects, low values for near objects).
|
||||
*/
|
||||
|
||||
/* Estimate maximum proximity values with regard to measurement scale. */
|
||||
static const int stk3310_ps_max[4] = {
|
||||
STK3310_PS_MAX_VAL / 64,
|
||||
STK3310_PS_MAX_VAL / 16,
|
||||
STK3310_PS_MAX_VAL / 4,
|
||||
STK3310_PS_MAX_VAL,
|
||||
STK3310_PS_MAX_VAL / 640,
|
||||
STK3310_PS_MAX_VAL / 160,
|
||||
STK3310_PS_MAX_VAL / 40,
|
||||
STK3310_PS_MAX_VAL / 10
|
||||
};
|
||||
|
||||
static const int stk3310_scale_table[][2] = {
|
||||
|
|
@ -128,14 +125,14 @@ static const struct iio_event_spec stk3310_events[] = {
|
|||
/* Proximity event */
|
||||
{
|
||||
.type = IIO_EV_TYPE_THRESH,
|
||||
.dir = IIO_EV_DIR_FALLING,
|
||||
.dir = IIO_EV_DIR_RISING,
|
||||
.mask_separate = BIT(IIO_EV_INFO_VALUE) |
|
||||
BIT(IIO_EV_INFO_ENABLE),
|
||||
},
|
||||
/* Out-of-proximity event */
|
||||
{
|
||||
.type = IIO_EV_TYPE_THRESH,
|
||||
.dir = IIO_EV_DIR_RISING,
|
||||
.dir = IIO_EV_DIR_FALLING,
|
||||
.mask_separate = BIT(IIO_EV_INFO_VALUE) |
|
||||
BIT(IIO_EV_INFO_ENABLE),
|
||||
},
|
||||
|
|
@ -203,25 +200,18 @@ static int stk3310_read_event(struct iio_dev *indio_dev,
|
|||
int *val, int *val2)
|
||||
{
|
||||
u8 reg;
|
||||
u16 buf;
|
||||
__be16 buf;
|
||||
int ret;
|
||||
unsigned int index;
|
||||
struct stk3310_data *data = iio_priv(indio_dev);
|
||||
|
||||
if (info != IIO_EV_INFO_VALUE)
|
||||
return -EINVAL;
|
||||
|
||||
/*
|
||||
* Only proximity interrupts are implemented at the moment.
|
||||
* Since we're inverting proximity values, the sensor's 'high'
|
||||
* threshold will become our 'low' threshold, associated with
|
||||
* 'near' events. Similarly, the sensor's 'low' threshold will
|
||||
* be our 'high' threshold, associated with 'far' events.
|
||||
*/
|
||||
/* Only proximity interrupts are implemented at the moment. */
|
||||
if (dir == IIO_EV_DIR_RISING)
|
||||
reg = STK3310_REG_THDL_PS;
|
||||
else if (dir == IIO_EV_DIR_FALLING)
|
||||
reg = STK3310_REG_THDH_PS;
|
||||
else if (dir == IIO_EV_DIR_FALLING)
|
||||
reg = STK3310_REG_THDL_PS;
|
||||
else
|
||||
return -EINVAL;
|
||||
|
||||
|
|
@ -232,8 +222,7 @@ static int stk3310_read_event(struct iio_dev *indio_dev,
|
|||
dev_err(&data->client->dev, "register read failed\n");
|
||||
return ret;
|
||||
}
|
||||
regmap_field_read(data->reg_ps_gain, &index);
|
||||
*val = swab16(stk3310_ps_max[index] - buf);
|
||||
*val = be16_to_cpu(buf);
|
||||
|
||||
return IIO_VAL_INT;
|
||||
}
|
||||
|
|
@ -246,7 +235,7 @@ static int stk3310_write_event(struct iio_dev *indio_dev,
|
|||
int val, int val2)
|
||||
{
|
||||
u8 reg;
|
||||
u16 buf;
|
||||
__be16 buf;
|
||||
int ret;
|
||||
unsigned int index;
|
||||
struct stk3310_data *data = iio_priv(indio_dev);
|
||||
|
|
@ -257,13 +246,13 @@ static int stk3310_write_event(struct iio_dev *indio_dev,
|
|||
return -EINVAL;
|
||||
|
||||
if (dir == IIO_EV_DIR_RISING)
|
||||
reg = STK3310_REG_THDL_PS;
|
||||
else if (dir == IIO_EV_DIR_FALLING)
|
||||
reg = STK3310_REG_THDH_PS;
|
||||
else if (dir == IIO_EV_DIR_FALLING)
|
||||
reg = STK3310_REG_THDL_PS;
|
||||
else
|
||||
return -EINVAL;
|
||||
|
||||
buf = swab16(stk3310_ps_max[index] - val);
|
||||
buf = cpu_to_be16(val);
|
||||
ret = regmap_bulk_write(data->regmap, reg, &buf, 2);
|
||||
if (ret < 0)
|
||||
dev_err(&client->dev, "failed to set PS threshold!\n");
|
||||
|
|
@ -312,7 +301,7 @@ static int stk3310_read_raw(struct iio_dev *indio_dev,
|
|||
int *val, int *val2, long mask)
|
||||
{
|
||||
u8 reg;
|
||||
u16 buf;
|
||||
__be16 buf;
|
||||
int ret;
|
||||
unsigned int index;
|
||||
struct stk3310_data *data = iio_priv(indio_dev);
|
||||
|
|
@ -333,15 +322,7 @@ static int stk3310_read_raw(struct iio_dev *indio_dev,
|
|||
mutex_unlock(&data->lock);
|
||||
return ret;
|
||||
}
|
||||
*val = swab16(buf);
|
||||
if (chan->type == IIO_PROXIMITY) {
|
||||
/*
|
||||
* Invert the proximity data so we return low values
|
||||
* for close objects and high values for far ones.
|
||||
*/
|
||||
regmap_field_read(data->reg_ps_gain, &index);
|
||||
*val = stk3310_ps_max[index] - *val;
|
||||
}
|
||||
*val = be16_to_cpu(buf);
|
||||
mutex_unlock(&data->lock);
|
||||
return IIO_VAL_INT;
|
||||
case IIO_CHAN_INFO_INT_TIME:
|
||||
|
|
@ -577,8 +558,8 @@ static irqreturn_t stk3310_irq_event_handler(int irq, void *private)
|
|||
}
|
||||
event = IIO_UNMOD_EVENT_CODE(IIO_PROXIMITY, 1,
|
||||
IIO_EV_TYPE_THRESH,
|
||||
(dir ? IIO_EV_DIR_RISING :
|
||||
IIO_EV_DIR_FALLING));
|
||||
(dir ? IIO_EV_DIR_FALLING :
|
||||
IIO_EV_DIR_RISING));
|
||||
iio_push_event(indio_dev, event, data->timestamp);
|
||||
|
||||
/* Reset the interrupt flag */
|
||||
|
|
@ -623,13 +604,7 @@ static int stk3310_probe(struct i2c_client *client,
|
|||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ret = iio_device_register(indio_dev);
|
||||
if (ret < 0) {
|
||||
dev_err(&client->dev, "device_register failed\n");
|
||||
stk3310_set_state(data, STK3310_STATE_STANDBY);
|
||||
}
|
||||
|
||||
if (client->irq <= 0)
|
||||
if (client->irq < 0)
|
||||
client->irq = stk3310_gpio_probe(client);
|
||||
|
||||
if (client->irq >= 0) {
|
||||
|
|
@ -644,6 +619,12 @@ static int stk3310_probe(struct i2c_client *client,
|
|||
client->irq);
|
||||
}
|
||||
|
||||
ret = iio_device_register(indio_dev);
|
||||
if (ret < 0) {
|
||||
dev_err(&client->dev, "device_register failed\n");
|
||||
stk3310_set_state(data, STK3310_STATE_STANDBY);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -185,7 +185,7 @@ static int tcs3414_write_raw(struct iio_dev *indio_dev,
|
|||
if (val != 0)
|
||||
return -EINVAL;
|
||||
for (i = 0; i < ARRAY_SIZE(tcs3414_times); i++) {
|
||||
if (val == tcs3414_times[i] * 1000) {
|
||||
if (val2 == tcs3414_times[i] * 1000) {
|
||||
data->timing &= ~TCS3414_INTEG_MASK;
|
||||
data->timing |= i;
|
||||
return i2c_smbus_write_byte_data(
|
||||
|
|
|
|||
|
|
@ -90,6 +90,7 @@ config IIO_ST_MAGN_SPI_3AXIS
|
|||
config BMC150_MAGN
|
||||
tristate "Bosch BMC150 Magnetometer Driver"
|
||||
depends on I2C
|
||||
select REGMAP_I2C
|
||||
select IIO_BUFFER
|
||||
select IIO_TRIGGERED_BUFFER
|
||||
help
|
||||
|
|
|
|||
|
|
@ -706,11 +706,11 @@ static int bmc150_magn_init(struct bmc150_magn_data *data)
|
|||
goto err_poweroff;
|
||||
}
|
||||
if (chip_id != BMC150_MAGN_CHIP_ID_VAL) {
|
||||
dev_err(&data->client->dev, "Invalid chip id 0x%x\n", ret);
|
||||
dev_err(&data->client->dev, "Invalid chip id 0x%x\n", chip_id);
|
||||
ret = -ENODEV;
|
||||
goto err_poweroff;
|
||||
}
|
||||
dev_dbg(&data->client->dev, "Chip id %x\n", ret);
|
||||
dev_dbg(&data->client->dev, "Chip id %x\n", chip_id);
|
||||
|
||||
preset = bmc150_magn_presets_table[BMC150_MAGN_DEFAULT_PRESET];
|
||||
ret = bmc150_magn_set_odr(data, preset.odr);
|
||||
|
|
|
|||
|
|
@ -84,10 +84,10 @@
|
|||
#define MMC35240_OTP_START_ADDR 0x1B
|
||||
|
||||
enum mmc35240_resolution {
|
||||
MMC35240_16_BITS_SLOW = 0, /* 100 Hz */
|
||||
MMC35240_16_BITS_FAST, /* 200 Hz */
|
||||
MMC35240_14_BITS, /* 333 Hz */
|
||||
MMC35240_12_BITS, /* 666 Hz */
|
||||
MMC35240_16_BITS_SLOW = 0, /* 7.92 ms */
|
||||
MMC35240_16_BITS_FAST, /* 4.08 ms */
|
||||
MMC35240_14_BITS, /* 2.16 ms */
|
||||
MMC35240_12_BITS, /* 1.20 ms */
|
||||
};
|
||||
|
||||
enum mmc35240_axis {
|
||||
|
|
@ -100,22 +100,22 @@ static const struct {
|
|||
int sens[3]; /* sensitivity per X, Y, Z axis */
|
||||
int nfo; /* null field output */
|
||||
} mmc35240_props_table[] = {
|
||||
/* 16 bits, 100Hz ODR */
|
||||
/* 16 bits, 125Hz ODR */
|
||||
{
|
||||
{1024, 1024, 1024},
|
||||
32768,
|
||||
},
|
||||
/* 16 bits, 200Hz ODR */
|
||||
/* 16 bits, 250Hz ODR */
|
||||
{
|
||||
{1024, 1024, 770},
|
||||
32768,
|
||||
},
|
||||
/* 14 bits, 333Hz ODR */
|
||||
/* 14 bits, 450Hz ODR */
|
||||
{
|
||||
{256, 256, 193},
|
||||
8192,
|
||||
},
|
||||
/* 12 bits, 666Hz ODR */
|
||||
/* 12 bits, 800Hz ODR */
|
||||
{
|
||||
{64, 64, 48},
|
||||
2048,
|
||||
|
|
@ -133,9 +133,15 @@ struct mmc35240_data {
|
|||
int axis_scale[3];
|
||||
};
|
||||
|
||||
static const int mmc35240_samp_freq[] = {100, 200, 333, 666};
|
||||
static const struct {
|
||||
int val;
|
||||
int val2;
|
||||
} mmc35240_samp_freq[] = { {1, 500000},
|
||||
{13, 0},
|
||||
{25, 0},
|
||||
{50, 0} };
|
||||
|
||||
static IIO_CONST_ATTR_SAMP_FREQ_AVAIL("100 200 333 666");
|
||||
static IIO_CONST_ATTR_SAMP_FREQ_AVAIL("1.5 13 25 50");
|
||||
|
||||
#define MMC35240_CHANNEL(_axis) { \
|
||||
.type = IIO_MAGN, \
|
||||
|
|
@ -168,7 +174,8 @@ static int mmc35240_get_samp_freq_index(struct mmc35240_data *data,
|
|||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(mmc35240_samp_freq); i++)
|
||||
if (mmc35240_samp_freq[i] == val)
|
||||
if (mmc35240_samp_freq[i].val == val &&
|
||||
mmc35240_samp_freq[i].val2 == val2)
|
||||
return i;
|
||||
return -EINVAL;
|
||||
}
|
||||
|
|
@ -195,8 +202,8 @@ static int mmc35240_hw_set(struct mmc35240_data *data, bool set)
|
|||
coil_bit = MMC35240_CTRL0_RESET_BIT;
|
||||
|
||||
return regmap_update_bits(data->regmap, MMC35240_REG_CTRL0,
|
||||
MMC35240_CTRL0_REFILL_BIT,
|
||||
coil_bit);
|
||||
coil_bit, coil_bit);
|
||||
|
||||
}
|
||||
|
||||
static int mmc35240_init(struct mmc35240_data *data)
|
||||
|
|
@ -215,14 +222,15 @@ static int mmc35240_init(struct mmc35240_data *data)
|
|||
|
||||
/*
|
||||
* make sure we restore sensor characteristics, by doing
|
||||
* a RESET/SET sequence
|
||||
* a SET/RESET sequence, the axis polarity being naturally
|
||||
* aligned after RESET
|
||||
*/
|
||||
ret = mmc35240_hw_set(data, false);
|
||||
ret = mmc35240_hw_set(data, true);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
usleep_range(MMC53240_WAIT_SET_RESET, MMC53240_WAIT_SET_RESET + 1);
|
||||
|
||||
ret = mmc35240_hw_set(data, true);
|
||||
ret = mmc35240_hw_set(data, false);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
|
|
@ -378,9 +386,9 @@ static int mmc35240_read_raw(struct iio_dev *indio_dev,
|
|||
if (i < 0 || i >= ARRAY_SIZE(mmc35240_samp_freq))
|
||||
return -EINVAL;
|
||||
|
||||
*val = mmc35240_samp_freq[i];
|
||||
*val2 = 0;
|
||||
return IIO_VAL_INT;
|
||||
*val = mmc35240_samp_freq[i].val;
|
||||
*val2 = mmc35240_samp_freq[i].val2;
|
||||
return IIO_VAL_INT_PLUS_MICRO;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
|
@ -496,6 +504,7 @@ static int mmc35240_probe(struct i2c_client *client,
|
|||
}
|
||||
|
||||
data = iio_priv(indio_dev);
|
||||
i2c_set_clientdata(client, indio_dev);
|
||||
data->client = client;
|
||||
data->regmap = regmap;
|
||||
data->res = MMC35240_16_BITS_SLOW;
|
||||
|
|
|
|||
|
|
@ -80,6 +80,7 @@
|
|||
#define SX9500_COMPSTAT_MASK GENMASK(3, 0)
|
||||
|
||||
#define SX9500_NUM_CHANNELS 4
|
||||
#define SX9500_CHAN_MASK GENMASK(SX9500_NUM_CHANNELS - 1, 0)
|
||||
|
||||
struct sx9500_data {
|
||||
struct mutex mutex;
|
||||
|
|
@ -281,7 +282,7 @@ static int sx9500_read_prox_data(struct sx9500_data *data,
|
|||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
*val = 32767 - (s16)be16_to_cpu(regval);
|
||||
*val = be16_to_cpu(regval);
|
||||
|
||||
return IIO_VAL_INT;
|
||||
}
|
||||
|
|
@ -329,20 +330,20 @@ static int sx9500_read_proximity(struct sx9500_data *data,
|
|||
else
|
||||
ret = sx9500_wait_for_sample(data);
|
||||
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
mutex_lock(&data->mutex);
|
||||
|
||||
if (ret < 0)
|
||||
goto out_dec_data_rdy;
|
||||
|
||||
ret = sx9500_read_prox_data(data, chan, val);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
|
||||
ret = sx9500_dec_chan_users(data, chan->channel);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
goto out_dec_data_rdy;
|
||||
|
||||
ret = sx9500_dec_data_rdy_users(data);
|
||||
if (ret < 0)
|
||||
goto out_dec_chan;
|
||||
|
||||
ret = sx9500_dec_chan_users(data, chan->channel);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
|
||||
|
|
@ -350,6 +351,8 @@ static int sx9500_read_proximity(struct sx9500_data *data,
|
|||
|
||||
goto out;
|
||||
|
||||
out_dec_data_rdy:
|
||||
sx9500_dec_data_rdy_users(data);
|
||||
out_dec_chan:
|
||||
sx9500_dec_chan_users(data, chan->channel);
|
||||
out:
|
||||
|
|
@ -679,7 +682,7 @@ out:
|
|||
static int sx9500_buffer_preenable(struct iio_dev *indio_dev)
|
||||
{
|
||||
struct sx9500_data *data = iio_priv(indio_dev);
|
||||
int ret, i;
|
||||
int ret = 0, i;
|
||||
|
||||
mutex_lock(&data->mutex);
|
||||
|
||||
|
|
@ -703,7 +706,7 @@ static int sx9500_buffer_preenable(struct iio_dev *indio_dev)
|
|||
static int sx9500_buffer_predisable(struct iio_dev *indio_dev)
|
||||
{
|
||||
struct sx9500_data *data = iio_priv(indio_dev);
|
||||
int ret, i;
|
||||
int ret = 0, i;
|
||||
|
||||
iio_triggered_buffer_predisable(indio_dev);
|
||||
|
||||
|
|
@ -800,8 +803,7 @@ static int sx9500_init_compensation(struct iio_dev *indio_dev)
|
|||
unsigned int val;
|
||||
|
||||
ret = regmap_update_bits(data->regmap, SX9500_REG_PROX_CTRL0,
|
||||
GENMASK(SX9500_NUM_CHANNELS, 0),
|
||||
GENMASK(SX9500_NUM_CHANNELS, 0));
|
||||
SX9500_CHAN_MASK, SX9500_CHAN_MASK);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
|
|
@ -821,7 +823,7 @@ static int sx9500_init_compensation(struct iio_dev *indio_dev)
|
|||
|
||||
out:
|
||||
regmap_update_bits(data->regmap, SX9500_REG_PROX_CTRL0,
|
||||
GENMASK(SX9500_NUM_CHANNELS, 0), 0);
|
||||
SX9500_CHAN_MASK, 0);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -204,7 +204,7 @@ static int mlx90614_read_raw(struct iio_dev *indio_dev,
|
|||
*val = ret;
|
||||
return IIO_VAL_INT;
|
||||
case IIO_CHAN_INFO_OFFSET:
|
||||
*val = 13657;
|
||||
*val = -13657;
|
||||
*val2 = 500000;
|
||||
return IIO_VAL_INT_PLUS_MICRO;
|
||||
case IIO_CHAN_INFO_SCALE:
|
||||
|
|
|
|||
|
|
@ -132,6 +132,9 @@ static int tmp006_write_raw(struct iio_dev *indio_dev,
|
|||
struct tmp006_data *data = iio_priv(indio_dev);
|
||||
int i;
|
||||
|
||||
if (mask != IIO_CHAN_INFO_SAMP_FREQ)
|
||||
return -EINVAL;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(tmp006_freqs); i++)
|
||||
if ((val == tmp006_freqs[i][0]) &&
|
||||
(val2 == tmp006_freqs[i][1])) {
|
||||
|
|
|
|||
Loading…
Reference in a new issue