diff options
Diffstat (limited to 'drivers/iio/accel/bmc150-accel.c')
| -rw-r--r-- | drivers/iio/accel/bmc150-accel.c | 57 |
1 files changed, 36 insertions, 21 deletions
diff --git a/drivers/iio/accel/bmc150-accel.c b/drivers/iio/accel/bmc150-accel.c index 73e87739d219..cc5a35750b50 100644 --- a/drivers/iio/accel/bmc150-accel.c +++ b/drivers/iio/accel/bmc150-accel.c | |||
| @@ -196,7 +196,7 @@ struct bmc150_accel_data { | |||
| 196 | u32 slope_thres; | 196 | u32 slope_thres; |
| 197 | u32 range; | 197 | u32 range; |
| 198 | int ev_enable_state; | 198 | int ev_enable_state; |
| 199 | int64_t timestamp, old_timestamp; | 199 | int64_t timestamp, old_timestamp; /* Only used in hw fifo mode. */ |
| 200 | const struct bmc150_accel_chip_info *chip_info; | 200 | const struct bmc150_accel_chip_info *chip_info; |
| 201 | }; | 201 | }; |
| 202 | 202 | ||
| @@ -1183,7 +1183,6 @@ static const struct iio_info bmc150_accel_info = { | |||
| 1183 | .write_event_value = bmc150_accel_write_event, | 1183 | .write_event_value = bmc150_accel_write_event, |
| 1184 | .write_event_config = bmc150_accel_write_event_config, | 1184 | .write_event_config = bmc150_accel_write_event_config, |
| 1185 | .read_event_config = bmc150_accel_read_event_config, | 1185 | .read_event_config = bmc150_accel_read_event_config, |
| 1186 | .validate_trigger = bmc150_accel_validate_trigger, | ||
| 1187 | .driver_module = THIS_MODULE, | 1186 | .driver_module = THIS_MODULE, |
| 1188 | }; | 1187 | }; |
| 1189 | 1188 | ||
| @@ -1222,7 +1221,7 @@ static irqreturn_t bmc150_accel_trigger_handler(int irq, void *p) | |||
| 1222 | mutex_unlock(&data->mutex); | 1221 | mutex_unlock(&data->mutex); |
| 1223 | 1222 | ||
| 1224 | iio_push_to_buffers_with_timestamp(indio_dev, data->buffer, | 1223 | iio_push_to_buffers_with_timestamp(indio_dev, data->buffer, |
| 1225 | data->timestamp); | 1224 | pf->timestamp); |
| 1226 | err_read: | 1225 | err_read: |
| 1227 | iio_trigger_notify_done(indio_dev->trig); | 1226 | iio_trigger_notify_done(indio_dev->trig); |
| 1228 | 1227 | ||
| @@ -1465,7 +1464,7 @@ static void bmc150_accel_unregister_triggers(struct bmc150_accel_data *data, | |||
| 1465 | { | 1464 | { |
| 1466 | int i; | 1465 | int i; |
| 1467 | 1466 | ||
| 1468 | for (i = from; i >= 0; i++) { | 1467 | for (i = from; i >= 0; i--) { |
| 1469 | if (data->triggers[i].indio_trig) { | 1468 | if (data->triggers[i].indio_trig) { |
| 1470 | iio_trigger_unregister(data->triggers[i].indio_trig); | 1469 | iio_trigger_unregister(data->triggers[i].indio_trig); |
| 1471 | data->triggers[i].indio_trig = NULL; | 1470 | data->triggers[i].indio_trig = NULL; |
| @@ -1535,6 +1534,13 @@ static int bmc150_accel_fifo_set_mode(struct bmc150_accel_data *data) | |||
| 1535 | return ret; | 1534 | return ret; |
| 1536 | } | 1535 | } |
| 1537 | 1536 | ||
| 1537 | static int bmc150_accel_buffer_preenable(struct iio_dev *indio_dev) | ||
| 1538 | { | ||
| 1539 | struct bmc150_accel_data *data = iio_priv(indio_dev); | ||
| 1540 | |||
| 1541 | return bmc150_accel_set_power_state(data, true); | ||
| 1542 | } | ||
| 1543 | |||
| 1538 | static int bmc150_accel_buffer_postenable(struct iio_dev *indio_dev) | 1544 | static int bmc150_accel_buffer_postenable(struct iio_dev *indio_dev) |
| 1539 | { | 1545 | { |
| 1540 | struct bmc150_accel_data *data = iio_priv(indio_dev); | 1546 | struct bmc150_accel_data *data = iio_priv(indio_dev); |
| @@ -1591,9 +1597,18 @@ out: | |||
| 1591 | return 0; | 1597 | return 0; |
| 1592 | } | 1598 | } |
| 1593 | 1599 | ||
| 1600 | static int bmc150_accel_buffer_postdisable(struct iio_dev *indio_dev) | ||
| 1601 | { | ||
| 1602 | struct bmc150_accel_data *data = iio_priv(indio_dev); | ||
| 1603 | |||
| 1604 | return bmc150_accel_set_power_state(data, false); | ||
| 1605 | } | ||
| 1606 | |||
| 1594 | static const struct iio_buffer_setup_ops bmc150_accel_buffer_ops = { | 1607 | static const struct iio_buffer_setup_ops bmc150_accel_buffer_ops = { |
| 1608 | .preenable = bmc150_accel_buffer_preenable, | ||
| 1595 | .postenable = bmc150_accel_buffer_postenable, | 1609 | .postenable = bmc150_accel_buffer_postenable, |
| 1596 | .predisable = bmc150_accel_buffer_predisable, | 1610 | .predisable = bmc150_accel_buffer_predisable, |
| 1611 | .postdisable = bmc150_accel_buffer_postdisable, | ||
| 1597 | }; | 1612 | }; |
| 1598 | 1613 | ||
| 1599 | static int bmc150_accel_probe(struct i2c_client *client, | 1614 | static int bmc150_accel_probe(struct i2c_client *client, |
| @@ -1636,6 +1651,15 @@ static int bmc150_accel_probe(struct i2c_client *client, | |||
| 1636 | indio_dev->modes = INDIO_DIRECT_MODE; | 1651 | indio_dev->modes = INDIO_DIRECT_MODE; |
| 1637 | indio_dev->info = &bmc150_accel_info; | 1652 | indio_dev->info = &bmc150_accel_info; |
| 1638 | 1653 | ||
| 1654 | ret = iio_triggered_buffer_setup(indio_dev, | ||
| 1655 | &iio_pollfunc_store_time, | ||
| 1656 | bmc150_accel_trigger_handler, | ||
| 1657 | &bmc150_accel_buffer_ops); | ||
| 1658 | if (ret < 0) { | ||
| 1659 | dev_err(&client->dev, "Failed: iio triggered buffer setup\n"); | ||
| 1660 | return ret; | ||
| 1661 | } | ||
| 1662 | |||
| 1639 | if (client->irq < 0) | 1663 | if (client->irq < 0) |
| 1640 | client->irq = bmc150_accel_gpio_probe(client, data); | 1664 | client->irq = bmc150_accel_gpio_probe(client, data); |
| 1641 | 1665 | ||
| @@ -1648,7 +1672,7 @@ static int bmc150_accel_probe(struct i2c_client *client, | |||
| 1648 | BMC150_ACCEL_IRQ_NAME, | 1672 | BMC150_ACCEL_IRQ_NAME, |
| 1649 | indio_dev); | 1673 | indio_dev); |
| 1650 | if (ret) | 1674 | if (ret) |
| 1651 | return ret; | 1675 | goto err_buffer_cleanup; |
| 1652 | 1676 | ||
| 1653 | /* | 1677 | /* |
| 1654 | * Set latched mode interrupt. While certain interrupts are | 1678 | * Set latched mode interrupt. While certain interrupts are |
| @@ -1661,24 +1685,14 @@ static int bmc150_accel_probe(struct i2c_client *client, | |||
| 1661 | BMC150_ACCEL_INT_MODE_LATCH_RESET); | 1685 | BMC150_ACCEL_INT_MODE_LATCH_RESET); |
| 1662 | if (ret < 0) { | 1686 | if (ret < 0) { |
| 1663 | dev_err(&data->client->dev, "Error writing reg_int_rst_latch\n"); | 1687 | dev_err(&data->client->dev, "Error writing reg_int_rst_latch\n"); |
| 1664 | return ret; | 1688 | goto err_buffer_cleanup; |
| 1665 | } | 1689 | } |
| 1666 | 1690 | ||
| 1667 | bmc150_accel_interrupts_setup(indio_dev, data); | 1691 | bmc150_accel_interrupts_setup(indio_dev, data); |
| 1668 | 1692 | ||
| 1669 | ret = bmc150_accel_triggers_setup(indio_dev, data); | 1693 | ret = bmc150_accel_triggers_setup(indio_dev, data); |
| 1670 | if (ret) | 1694 | if (ret) |
| 1671 | return ret; | 1695 | goto err_buffer_cleanup; |
| 1672 | |||
| 1673 | ret = iio_triggered_buffer_setup(indio_dev, | ||
| 1674 | &iio_pollfunc_store_time, | ||
| 1675 | bmc150_accel_trigger_handler, | ||
| 1676 | &bmc150_accel_buffer_ops); | ||
| 1677 | if (ret < 0) { | ||
| 1678 | dev_err(&client->dev, | ||
| 1679 | "Failed: iio triggered buffer setup\n"); | ||
| 1680 | goto err_trigger_unregister; | ||
| 1681 | } | ||
| 1682 | 1696 | ||
| 1683 | if (i2c_check_functionality(client->adapter, I2C_FUNC_I2C) || | 1697 | if (i2c_check_functionality(client->adapter, I2C_FUNC_I2C) || |
| 1684 | i2c_check_functionality(client->adapter, | 1698 | i2c_check_functionality(client->adapter, |
| @@ -1692,7 +1706,7 @@ static int bmc150_accel_probe(struct i2c_client *client, | |||
| 1692 | ret = iio_device_register(indio_dev); | 1706 | ret = iio_device_register(indio_dev); |
| 1693 | if (ret < 0) { | 1707 | if (ret < 0) { |
| 1694 | dev_err(&client->dev, "Unable to register iio device\n"); | 1708 | dev_err(&client->dev, "Unable to register iio device\n"); |
| 1695 | goto err_buffer_cleanup; | 1709 | goto err_trigger_unregister; |
| 1696 | } | 1710 | } |
| 1697 | 1711 | ||
| 1698 | ret = pm_runtime_set_active(&client->dev); | 1712 | ret = pm_runtime_set_active(&client->dev); |
| @@ -1708,11 +1722,10 @@ static int bmc150_accel_probe(struct i2c_client *client, | |||
| 1708 | 1722 | ||
| 1709 | err_iio_unregister: | 1723 | err_iio_unregister: |
| 1710 | iio_device_unregister(indio_dev); | 1724 | iio_device_unregister(indio_dev); |
| 1711 | err_buffer_cleanup: | ||
| 1712 | if (indio_dev->pollfunc) | ||
| 1713 | iio_triggered_buffer_cleanup(indio_dev); | ||
| 1714 | err_trigger_unregister: | 1725 | err_trigger_unregister: |
| 1715 | bmc150_accel_unregister_triggers(data, BMC150_ACCEL_TRIGGERS - 1); | 1726 | bmc150_accel_unregister_triggers(data, BMC150_ACCEL_TRIGGERS - 1); |
| 1727 | err_buffer_cleanup: | ||
| 1728 | iio_triggered_buffer_cleanup(indio_dev); | ||
| 1716 | 1729 | ||
| 1717 | return ret; | 1730 | return ret; |
| 1718 | } | 1731 | } |
| @@ -1730,6 +1743,8 @@ static int bmc150_accel_remove(struct i2c_client *client) | |||
| 1730 | 1743 | ||
| 1731 | bmc150_accel_unregister_triggers(data, BMC150_ACCEL_TRIGGERS - 1); | 1744 | bmc150_accel_unregister_triggers(data, BMC150_ACCEL_TRIGGERS - 1); |
| 1732 | 1745 | ||
| 1746 | iio_triggered_buffer_cleanup(indio_dev); | ||
| 1747 | |||
| 1733 | mutex_lock(&data->mutex); | 1748 | mutex_lock(&data->mutex); |
| 1734 | bmc150_accel_set_mode(data, BMC150_ACCEL_SLEEP_MODE_DEEP_SUSPEND, 0); | 1749 | bmc150_accel_set_mode(data, BMC150_ACCEL_SLEEP_MODE_DEEP_SUSPEND, 0); |
| 1735 | mutex_unlock(&data->mutex); | 1750 | mutex_unlock(&data->mutex); |
