aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/iio/proximity
diff options
context:
space:
mode:
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>2015-12-01 12:13:29 -0500
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2015-12-01 12:13:29 -0500
commitf3cf3fb7ec854c2b2429e5bb23186746e6511dae (patch)
treeb4e71d2a6422ca33a95f9a1e0458ab90c3b89846 /drivers/iio/proximity
parentf84a187019ccfce97fbf38fa9f3a8261fef91d8e (diff)
parent4ac4e086fd8c59e6b69089e6f7605500b63a6d17 (diff)
Merge tag 'iio-for-4.5a' of git://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio into staging-next
Jonathan writes: First set of new device support, features and cleanups for IIO in the 4.5 cycle Usual mixed bag, but the big item perhaps in this series is the DMA buffer support added by Lars-Peter Clausen. It's been in the works for a long time and it will be interesting to see what hardware support shows up now that this is available. New core features + associate cleanup. * Add generic DMA buffer infrastructure * Add a DMAengine framework based buffer Also associated minor changes. - Set the device buffer watermark based on the minimum watermark for all attached buffers rather than just the 'primary' one. - iio_buffer_init - only set the watermark default if one hasn't already been provided. This allows simple support for devices with a fixed watermark. - read only attribute for watermark on fixed watermark devices. - add explicit buffer enable/disable callbacks to allow the buffer to do more than trivial actions when it is being turned on and off. * IIO_VAL_INT support in write_raw_get_fmt function. New device support * Freescale MMA7455/7456L accelerometers * Memsic MXC6255XC accelerometer * ST lis2dh12 accelerometer * TI ADS8688 ADC * TI Palamas (twl6035/7) gpadc New driver features * mma8452 - support either of the available interrupt pins to cope with the case where board layout has lead to a particular one being connected. Staging graduation * Dummy driver - this driver acts as both an example and a test device for those with out hardware to develop userspace code against. Cleanups and minor bits and bobs. * treewide - Sort out the ordering of iio_device_register/unregister vs runtime pm function calls so that it's all nice and consistent and not race prone. - Check sscanf return values. None of the cases will actually happen as the strings are supplied internally, but best to be consistent on this. * ad7780 - switch over to the gpio descriptor interface and remove the now unused platform data which gets rid of a header entirely. * ad7793 - drop a pointless else statement. * at91_adc - Swap kmalloc_array in for a kmalloc doing the same job. * dummy - get rid of some commented out lines that snuck in during the move of the driver. * lm3533-als - Print an error message on provision of an invalid resistance. * mcp320x - Add compatible strings with vendor prefix and deprecate those with no vendor prefix. * mxs-lradc - Use BIT macro in various places rather than shifted ones. * pa12203001 - Power off the chip if the registration fails. * pulsedlight-lidar-lite - add runtime PM support. * xilinx XADC - constify an iio_buffer_setup_ops structure.
Diffstat (limited to 'drivers/iio/proximity')
-rw-r--r--drivers/iio/proximity/pulsedlight-lidar-lite-v2.c56
1 files changed, 55 insertions, 1 deletions
diff --git a/drivers/iio/proximity/pulsedlight-lidar-lite-v2.c b/drivers/iio/proximity/pulsedlight-lidar-lite-v2.c
index 961f9f990faf..be8ccef735f8 100644
--- a/drivers/iio/proximity/pulsedlight-lidar-lite-v2.c
+++ b/drivers/iio/proximity/pulsedlight-lidar-lite-v2.c
@@ -13,7 +13,7 @@
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details. 14 * GNU General Public License for more details.
15 * 15 *
16 * TODO: runtime pm, interrupt mode, and signal strength reporting 16 * TODO: interrupt mode, and signal strength reporting
17 */ 17 */
18 18
19#include <linux/err.h> 19#include <linux/err.h>
@@ -21,6 +21,7 @@
21#include <linux/i2c.h> 21#include <linux/i2c.h>
22#include <linux/delay.h> 22#include <linux/delay.h>
23#include <linux/module.h> 23#include <linux/module.h>
24#include <linux/pm_runtime.h>
24#include <linux/iio/iio.h> 25#include <linux/iio/iio.h>
25#include <linux/iio/sysfs.h> 26#include <linux/iio/sysfs.h>
26#include <linux/iio/buffer.h> 27#include <linux/iio/buffer.h>
@@ -37,6 +38,7 @@
37 38
38#define LIDAR_REG_DATA_HBYTE 0x0f 39#define LIDAR_REG_DATA_HBYTE 0x0f
39#define LIDAR_REG_DATA_LBYTE 0x10 40#define LIDAR_REG_DATA_LBYTE 0x10
41#define LIDAR_REG_PWR_CONTROL 0x65
40 42
41#define LIDAR_DRV_NAME "lidar" 43#define LIDAR_DRV_NAME "lidar"
42 44
@@ -90,6 +92,12 @@ static inline int lidar_write_control(struct lidar_data *data, int val)
90 return i2c_smbus_write_byte_data(data->client, LIDAR_REG_CONTROL, val); 92 return i2c_smbus_write_byte_data(data->client, LIDAR_REG_CONTROL, val);
91} 93}
92 94
95static inline int lidar_write_power(struct lidar_data *data, int val)
96{
97 return i2c_smbus_write_byte_data(data->client,
98 LIDAR_REG_PWR_CONTROL, val);
99}
100
93static int lidar_read_measurement(struct lidar_data *data, u16 *reg) 101static int lidar_read_measurement(struct lidar_data *data, u16 *reg)
94{ 102{
95 int ret; 103 int ret;
@@ -116,6 +124,8 @@ static int lidar_get_measurement(struct lidar_data *data, u16 *reg)
116 int tries = 10; 124 int tries = 10;
117 int ret; 125 int ret;
118 126
127 pm_runtime_get_sync(&client->dev);
128
119 /* start sample */ 129 /* start sample */
120 ret = lidar_write_control(data, LIDAR_REG_CONTROL_ACQUIRE); 130 ret = lidar_write_control(data, LIDAR_REG_CONTROL_ACQUIRE);
121 if (ret < 0) { 131 if (ret < 0) {
@@ -144,6 +154,8 @@ static int lidar_get_measurement(struct lidar_data *data, u16 *reg)
144 } 154 }
145 ret = -EIO; 155 ret = -EIO;
146 } 156 }
157 pm_runtime_mark_last_busy(&client->dev);
158 pm_runtime_put_autosuspend(&client->dev);
147 159
148 return ret; 160 return ret;
149} 161}
@@ -243,6 +255,17 @@ static int lidar_probe(struct i2c_client *client,
243 if (ret) 255 if (ret)
244 goto error_unreg_buffer; 256 goto error_unreg_buffer;
245 257
258 pm_runtime_set_autosuspend_delay(&client->dev, 1000);
259 pm_runtime_use_autosuspend(&client->dev);
260
261 ret = pm_runtime_set_active(&client->dev);
262 if (ret)
263 goto error_unreg_buffer;
264 pm_runtime_enable(&client->dev);
265
266 pm_runtime_mark_last_busy(&client->dev);
267 pm_runtime_idle(&client->dev);
268
246 return 0; 269 return 0;
247 270
248error_unreg_buffer: 271error_unreg_buffer:
@@ -258,6 +281,9 @@ static int lidar_remove(struct i2c_client *client)
258 iio_device_unregister(indio_dev); 281 iio_device_unregister(indio_dev);
259 iio_triggered_buffer_cleanup(indio_dev); 282 iio_triggered_buffer_cleanup(indio_dev);
260 283
284 pm_runtime_disable(&client->dev);
285 pm_runtime_set_suspended(&client->dev);
286
261 return 0; 287 return 0;
262} 288}
263 289
@@ -273,10 +299,38 @@ static const struct of_device_id lidar_dt_ids[] = {
273}; 299};
274MODULE_DEVICE_TABLE(of, lidar_dt_ids); 300MODULE_DEVICE_TABLE(of, lidar_dt_ids);
275 301
302#ifdef CONFIG_PM
303static int lidar_pm_runtime_suspend(struct device *dev)
304{
305 struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev));
306 struct lidar_data *data = iio_priv(indio_dev);
307
308 return lidar_write_power(data, 0x0f);
309}
310
311static int lidar_pm_runtime_resume(struct device *dev)
312{
313 struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev));
314 struct lidar_data *data = iio_priv(indio_dev);
315 int ret = lidar_write_power(data, 0);
316
317 /* regulator and FPGA needs settling time */
318 usleep_range(15000, 20000);
319
320 return ret;
321}
322#endif
323
324static const struct dev_pm_ops lidar_pm_ops = {
325 SET_RUNTIME_PM_OPS(lidar_pm_runtime_suspend,
326 lidar_pm_runtime_resume, NULL)
327};
328
276static struct i2c_driver lidar_driver = { 329static struct i2c_driver lidar_driver = {
277 .driver = { 330 .driver = {
278 .name = LIDAR_DRV_NAME, 331 .name = LIDAR_DRV_NAME,
279 .of_match_table = of_match_ptr(lidar_dt_ids), 332 .of_match_table = of_match_ptr(lidar_dt_ids),
333 .pm = &lidar_pm_ops,
280 }, 334 },
281 .probe = lidar_probe, 335 .probe = lidar_probe,
282 .remove = lidar_remove, 336 .remove = lidar_remove,