forked from luck/tmp_suning_uos_patched
Third set of IIO fixes for the 3.18 cycle.
Most of these are fairly standard little fixes, a bmc150 and bmg160 patch is to make an ABI change to indicated a specific axis in an event rather than the generic option in the original drivers. As both of these drivers are new in this cycle it would be ideal to push this minor change through even though it isn't strictly a fix. A couple of other 'fixes' change defaults for some settings on these new drivers to more intuitive calues. Looks like some useful feedback has been coming in for this driver since it was applied. * IIO_EVENT_CODE_EXTRACT_DIR bit mask was wrong and has been for a while 0xCF clearly doesn't give a contiguous bitmask. * kxcjk-1013 range setting was failing to mask out the previous value in the register and hence was 'enable only'. * men_z188 device id table wasn't null terminated. * bmg160 and bmc150 both failed to correctly handling an error in mode setting. * bmg160 and bmc150 both had a bug in setting the event direction in the event spec (leads to an attribute name being incorrect) * bmg160 defaulted to an open drain output for the interrupt - as a default this obviously only works with some interrupt chips - hence change the default to push-pull (note this is a new driver so we aren't going to cause any regressions with this change). * bmc150 had an unintuitive default for the rate of change (motion detector) so change it to 0 (new driver so change of default won't cause any regressions). -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iQIcBAABAgAGBQJUaRGrAAoJEFSFNJnE9BaIrWgP/jdxYsA7l7gAamjkK6Dm+jmR FIDaD1eJ0ZMRS43guIwaGJ90OC2Mxc7xIAgbE3xurI0r/73YagTwWtUwzUOGRnE1 kqRKyo8NEu3+BZtasoigEZfm9pHmsmkdD+lQLAnLlDeVFhYpTbsr/j9qeMD7L8CN b+hTwQBsObnpJ/tN61KLSjlx57D8c47ghCgqEaGqXrfR4r/wMItMN6cB1xbM4yU4 tHJQBBbOv03vZI5oaxJ3+Q4aBGf4TdrL3z/P/vrmMUyyQrmbS6jCBjUlmjcylVSn Yz2mr5oPyRgRRzH/KcMT/S+i8BELxBuC5nURBAkO35YqHhXvZENgg29edEWX4s4c KOTC+FgbEEPEu5wcUl5NuFPP3D8NNuOxDl677bLz9I6ufhwFLCNtyN6vGsqAMPA+ s/eviz/W8u2L90/+ryiEV+UESXjqLszWU7xpfdheo4Z6jokpWi9ZT65m11Z+aJ79 QldzeniUxR9ycH6O6z9GxkdhXV79OACjkvoNZgh33MfmuX7jLMIodWfrI/Xn2+Pb N0hpWzcADcd2KfXoXRvuN8t3Wgz09T7CuodOSBsAOjhvkUiufj+iOhwU96rNnNzl ZWtYAbRr+DmKks+bzoobyCypaH/0hPuC/YUSBUALlg80P8ozGiIs+E1phiZze+rB fHyT8lUFg4a0syWOfx8s =IPMl -----END PGP SIGNATURE----- Merge tag 'iio-fixes-for-3.18c' of git://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio into staging-linus Jonathan writes: Third set of IIO fixes for the 3.18 cycle. Most of these are fairly standard little fixes, a bmc150 and bmg160 patch is to make an ABI change to indicated a specific axis in an event rather than the generic option in the original drivers. As both of these drivers are new in this cycle it would be ideal to push this minor change through even though it isn't strictly a fix. A couple of other 'fixes' change defaults for some settings on these new drivers to more intuitive calues. Looks like some useful feedback has been coming in for this driver since it was applied. * IIO_EVENT_CODE_EXTRACT_DIR bit mask was wrong and has been for a while 0xCF clearly doesn't give a contiguous bitmask. * kxcjk-1013 range setting was failing to mask out the previous value in the register and hence was 'enable only'. * men_z188 device id table wasn't null terminated. * bmg160 and bmc150 both failed to correctly handling an error in mode setting. * bmg160 and bmc150 both had a bug in setting the event direction in the event spec (leads to an attribute name being incorrect) * bmg160 defaulted to an open drain output for the interrupt - as a default this obviously only works with some interrupt chips - hence change the default to push-pull (note this is a new driver so we aren't going to cause any regressions with this change). * bmc150 had an unintuitive default for the rate of change (motion detector) so change it to 0 (new driver so change of default won't cause any regressions).
This commit is contained in:
commit
8bb9b9a006
|
@ -44,6 +44,9 @@
|
|||
|
||||
#define BMC150_ACCEL_REG_INT_STATUS_2 0x0B
|
||||
#define BMC150_ACCEL_ANY_MOTION_MASK 0x07
|
||||
#define BMC150_ACCEL_ANY_MOTION_BIT_X BIT(0)
|
||||
#define BMC150_ACCEL_ANY_MOTION_BIT_Y BIT(1)
|
||||
#define BMC150_ACCEL_ANY_MOTION_BIT_Z BIT(2)
|
||||
#define BMC150_ACCEL_ANY_MOTION_BIT_SIGN BIT(3)
|
||||
|
||||
#define BMC150_ACCEL_REG_PMU_LPW 0x11
|
||||
|
@ -92,9 +95,9 @@
|
|||
#define BMC150_ACCEL_SLOPE_THRES_MASK 0xFF
|
||||
|
||||
/* Slope duration in terms of number of samples */
|
||||
#define BMC150_ACCEL_DEF_SLOPE_DURATION 2
|
||||
#define BMC150_ACCEL_DEF_SLOPE_DURATION 1
|
||||
/* in terms of multiples of g's/LSB, based on range */
|
||||
#define BMC150_ACCEL_DEF_SLOPE_THRESHOLD 5
|
||||
#define BMC150_ACCEL_DEF_SLOPE_THRESHOLD 1
|
||||
|
||||
#define BMC150_ACCEL_REG_XOUT_L 0x02
|
||||
|
||||
|
@ -536,6 +539,9 @@ static int bmc150_accel_set_power_state(struct bmc150_accel_data *data, bool on)
|
|||
if (ret < 0) {
|
||||
dev_err(&data->client->dev,
|
||||
"Failed: bmc150_accel_set_power_state for %d\n", on);
|
||||
if (on)
|
||||
pm_runtime_put_noidle(&data->client->dev);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -811,6 +817,7 @@ static int bmc150_accel_write_event_config(struct iio_dev *indio_dev,
|
|||
|
||||
ret = bmc150_accel_setup_any_motion_interrupt(data, state);
|
||||
if (ret < 0) {
|
||||
bmc150_accel_set_power_state(data, false);
|
||||
mutex_unlock(&data->mutex);
|
||||
return ret;
|
||||
}
|
||||
|
@ -846,7 +853,7 @@ static const struct attribute_group bmc150_accel_attrs_group = {
|
|||
|
||||
static const struct iio_event_spec bmc150_accel_event = {
|
||||
.type = IIO_EV_TYPE_ROC,
|
||||
.dir = IIO_EV_DIR_RISING | IIO_EV_DIR_FALLING,
|
||||
.dir = IIO_EV_DIR_EITHER,
|
||||
.mask_separate = BIT(IIO_EV_INFO_VALUE) |
|
||||
BIT(IIO_EV_INFO_ENABLE) |
|
||||
BIT(IIO_EV_INFO_PERIOD)
|
||||
|
@ -1054,6 +1061,7 @@ static int bmc150_accel_data_rdy_trigger_set_state(struct iio_trigger *trig,
|
|||
else
|
||||
ret = bmc150_accel_setup_new_data_interrupt(data, state);
|
||||
if (ret < 0) {
|
||||
bmc150_accel_set_power_state(data, false);
|
||||
mutex_unlock(&data->mutex);
|
||||
return ret;
|
||||
}
|
||||
|
@ -1092,12 +1100,26 @@ static irqreturn_t bmc150_accel_event_handler(int irq, void *private)
|
|||
else
|
||||
dir = IIO_EV_DIR_RISING;
|
||||
|
||||
if (ret & BMC150_ACCEL_ANY_MOTION_MASK)
|
||||
if (ret & BMC150_ACCEL_ANY_MOTION_BIT_X)
|
||||
iio_push_event(indio_dev, IIO_MOD_EVENT_CODE(IIO_ACCEL,
|
||||
0,
|
||||
IIO_MOD_X_OR_Y_OR_Z,
|
||||
IIO_MOD_X,
|
||||
IIO_EV_TYPE_ROC,
|
||||
IIO_EV_DIR_EITHER),
|
||||
dir),
|
||||
data->timestamp);
|
||||
if (ret & BMC150_ACCEL_ANY_MOTION_BIT_Y)
|
||||
iio_push_event(indio_dev, IIO_MOD_EVENT_CODE(IIO_ACCEL,
|
||||
0,
|
||||
IIO_MOD_Y,
|
||||
IIO_EV_TYPE_ROC,
|
||||
dir),
|
||||
data->timestamp);
|
||||
if (ret & BMC150_ACCEL_ANY_MOTION_BIT_Z)
|
||||
iio_push_event(indio_dev, IIO_MOD_EVENT_CODE(IIO_ACCEL,
|
||||
0,
|
||||
IIO_MOD_Z,
|
||||
IIO_EV_TYPE_ROC,
|
||||
dir),
|
||||
data->timestamp);
|
||||
ack_intr_status:
|
||||
if (!data->dready_trigger_on)
|
||||
|
@ -1354,10 +1376,14 @@ static int bmc150_accel_runtime_suspend(struct device *dev)
|
|||
{
|
||||
struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev));
|
||||
struct bmc150_accel_data *data = iio_priv(indio_dev);
|
||||
int ret;
|
||||
|
||||
dev_dbg(&data->client->dev, __func__);
|
||||
ret = bmc150_accel_set_mode(data, BMC150_ACCEL_SLEEP_MODE_SUSPEND, 0);
|
||||
if (ret < 0)
|
||||
return -EAGAIN;
|
||||
|
||||
return bmc150_accel_set_mode(data, BMC150_ACCEL_SLEEP_MODE_SUSPEND, 0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int bmc150_accel_runtime_resume(struct device *dev)
|
||||
|
|
|
@ -269,6 +269,8 @@ static int kxcjk1013_set_range(struct kxcjk1013_data *data, int range_index)
|
|||
return ret;
|
||||
}
|
||||
|
||||
ret &= ~(KXCJK1013_REG_CTRL1_BIT_GSEL0 |
|
||||
KXCJK1013_REG_CTRL1_BIT_GSEL1);
|
||||
ret |= (KXCJK1013_scale_table[range_index].gsel_0 << 3);
|
||||
ret |= (KXCJK1013_scale_table[range_index].gsel_1 << 4);
|
||||
|
||||
|
|
|
@ -152,6 +152,7 @@ static void men_z188_remove(struct mcb_device *dev)
|
|||
|
||||
static const struct mcb_device_id men_z188_ids[] = {
|
||||
{ .device = 0xbc },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(mcb, men_z188_ids);
|
||||
|
||||
|
|
|
@ -67,6 +67,9 @@
|
|||
#define BMG160_REG_INT_EN_0 0x15
|
||||
#define BMG160_DATA_ENABLE_INT BIT(7)
|
||||
|
||||
#define BMG160_REG_INT_EN_1 0x16
|
||||
#define BMG160_INT1_BIT_OD BIT(1)
|
||||
|
||||
#define BMG160_REG_XOUT_L 0x02
|
||||
#define BMG160_AXIS_TO_REG(axis) (BMG160_REG_XOUT_L + (axis * 2))
|
||||
|
||||
|
@ -82,6 +85,9 @@
|
|||
|
||||
#define BMG160_REG_INT_STATUS_2 0x0B
|
||||
#define BMG160_ANY_MOTION_MASK 0x07
|
||||
#define BMG160_ANY_MOTION_BIT_X BIT(0)
|
||||
#define BMG160_ANY_MOTION_BIT_Y BIT(1)
|
||||
#define BMG160_ANY_MOTION_BIT_Z BIT(2)
|
||||
|
||||
#define BMG160_REG_TEMP 0x08
|
||||
#define BMG160_TEMP_CENTER_VAL 23
|
||||
|
@ -222,6 +228,19 @@ static int bmg160_chip_init(struct bmg160_data *data)
|
|||
data->slope_thres = ret;
|
||||
|
||||
/* Set default interrupt mode */
|
||||
ret = i2c_smbus_read_byte_data(data->client, BMG160_REG_INT_EN_1);
|
||||
if (ret < 0) {
|
||||
dev_err(&data->client->dev, "Error reading reg_int_en_1\n");
|
||||
return ret;
|
||||
}
|
||||
ret &= ~BMG160_INT1_BIT_OD;
|
||||
ret = i2c_smbus_write_byte_data(data->client,
|
||||
BMG160_REG_INT_EN_1, ret);
|
||||
if (ret < 0) {
|
||||
dev_err(&data->client->dev, "Error writing reg_int_en_1\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = i2c_smbus_write_byte_data(data->client,
|
||||
BMG160_REG_INT_RST_LATCH,
|
||||
BMG160_INT_MODE_LATCH_INT |
|
||||
|
@ -250,6 +269,9 @@ static int bmg160_set_power_state(struct bmg160_data *data, bool on)
|
|||
if (ret < 0) {
|
||||
dev_err(&data->client->dev,
|
||||
"Failed: bmg160_set_power_state for %d\n", on);
|
||||
if (on)
|
||||
pm_runtime_put_noidle(&data->client->dev);
|
||||
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
@ -705,6 +727,7 @@ static int bmg160_write_event_config(struct iio_dev *indio_dev,
|
|||
|
||||
ret = bmg160_setup_any_motion_interrupt(data, state);
|
||||
if (ret < 0) {
|
||||
bmg160_set_power_state(data, false);
|
||||
mutex_unlock(&data->mutex);
|
||||
return ret;
|
||||
}
|
||||
|
@ -743,7 +766,7 @@ static const struct attribute_group bmg160_attrs_group = {
|
|||
|
||||
static const struct iio_event_spec bmg160_event = {
|
||||
.type = IIO_EV_TYPE_ROC,
|
||||
.dir = IIO_EV_DIR_RISING | IIO_EV_DIR_FALLING,
|
||||
.dir = IIO_EV_DIR_EITHER,
|
||||
.mask_shared_by_type = BIT(IIO_EV_INFO_VALUE) |
|
||||
BIT(IIO_EV_INFO_ENABLE)
|
||||
};
|
||||
|
@ -871,6 +894,7 @@ static int bmg160_data_rdy_trigger_set_state(struct iio_trigger *trig,
|
|||
else
|
||||
ret = bmg160_setup_new_data_interrupt(data, state);
|
||||
if (ret < 0) {
|
||||
bmg160_set_power_state(data, false);
|
||||
mutex_unlock(&data->mutex);
|
||||
return ret;
|
||||
}
|
||||
|
@ -908,10 +932,24 @@ static irqreturn_t bmg160_event_handler(int irq, void *private)
|
|||
else
|
||||
dir = IIO_EV_DIR_FALLING;
|
||||
|
||||
if (ret & BMG160_ANY_MOTION_MASK)
|
||||
if (ret & BMG160_ANY_MOTION_BIT_X)
|
||||
iio_push_event(indio_dev, IIO_MOD_EVENT_CODE(IIO_ANGL_VEL,
|
||||
0,
|
||||
IIO_MOD_X_OR_Y_OR_Z,
|
||||
IIO_MOD_X,
|
||||
IIO_EV_TYPE_ROC,
|
||||
dir),
|
||||
data->timestamp);
|
||||
if (ret & BMG160_ANY_MOTION_BIT_Y)
|
||||
iio_push_event(indio_dev, IIO_MOD_EVENT_CODE(IIO_ANGL_VEL,
|
||||
0,
|
||||
IIO_MOD_Y,
|
||||
IIO_EV_TYPE_ROC,
|
||||
dir),
|
||||
data->timestamp);
|
||||
if (ret & BMG160_ANY_MOTION_BIT_Z)
|
||||
iio_push_event(indio_dev, IIO_MOD_EVENT_CODE(IIO_ANGL_VEL,
|
||||
0,
|
||||
IIO_MOD_Z,
|
||||
IIO_EV_TYPE_ROC,
|
||||
dir),
|
||||
data->timestamp);
|
||||
|
@ -1169,8 +1207,15 @@ static int bmg160_runtime_suspend(struct device *dev)
|
|||
{
|
||||
struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev));
|
||||
struct bmg160_data *data = iio_priv(indio_dev);
|
||||
int ret;
|
||||
|
||||
return bmg160_set_mode(data, BMG160_MODE_SUSPEND);
|
||||
ret = bmg160_set_mode(data, BMG160_MODE_SUSPEND);
|
||||
if (ret < 0) {
|
||||
dev_err(&data->client->dev, "set mode failed\n");
|
||||
return -EAGAIN;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int bmg160_runtime_resume(struct device *dev)
|
||||
|
|
|
@ -72,7 +72,7 @@ struct iio_event_data {
|
|||
|
||||
#define IIO_EVENT_CODE_EXTRACT_TYPE(mask) ((mask >> 56) & 0xFF)
|
||||
|
||||
#define IIO_EVENT_CODE_EXTRACT_DIR(mask) ((mask >> 48) & 0xCF)
|
||||
#define IIO_EVENT_CODE_EXTRACT_DIR(mask) ((mask >> 48) & 0x7F)
|
||||
|
||||
#define IIO_EVENT_CODE_EXTRACT_CHAN_TYPE(mask) ((mask >> 32) & 0xFF)
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user