aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/iio/accel/bmc150-accel.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/iio/accel/bmc150-accel.c')
-rw-r--r--drivers/iio/accel/bmc150-accel.c57
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);
1226err_read: 1225err_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
1537static 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
1538static int bmc150_accel_buffer_postenable(struct iio_dev *indio_dev) 1544static 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
1600static 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
1594static const struct iio_buffer_setup_ops bmc150_accel_buffer_ops = { 1607static 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
1599static int bmc150_accel_probe(struct i2c_client *client, 1614static 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
1709err_iio_unregister: 1723err_iio_unregister:
1710 iio_device_unregister(indio_dev); 1724 iio_device_unregister(indio_dev);
1711err_buffer_cleanup:
1712 if (indio_dev->pollfunc)
1713 iio_triggered_buffer_cleanup(indio_dev);
1714err_trigger_unregister: 1725err_trigger_unregister:
1715 bmc150_accel_unregister_triggers(data, BMC150_ACCEL_TRIGGERS - 1); 1726 bmc150_accel_unregister_triggers(data, BMC150_ACCEL_TRIGGERS - 1);
1727err_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);