linux-pm.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v4 0/1] iio: pulsedlight-lidar-lite: add runtime PM
@ 2015-11-08 20:26 Matt Ranostay
       [not found] ` <1447014418-27849-1-git-send-email-mranostay-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
  0 siblings, 1 reply; 6+ messages in thread
From: Matt Ranostay @ 2015-11-08 20:26 UTC (permalink / raw)
  To: jic23-DgEjT+Ai2ygdnm+yROfE0A
  Cc: linux-iio-u79uwXL29TY76Z2rM5mHXA, linux-pm-u79uwXL29TY76Z2rM5mHXA,
	k.kozlowski-Sze3O3UU22JBDgjK7y7TUQ, Matt Ranostay

Changes from v3:
* readd pm_runtime_mark_last_busy() that got dropped accidently

Matt Ranostay (1):
  iio: pulsedlight-lidar-lite: add runtime PM

 drivers/iio/proximity/pulsedlight-lidar-lite-v2.c | 54 ++++++++++++++++++++++-
 1 file changed, 53 insertions(+), 1 deletion(-)

-- 
1.9.1

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH v4 1/1] iio: pulsedlight-lidar-lite: add runtime PM
       [not found] ` <1447014418-27849-1-git-send-email-mranostay-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
@ 2015-11-08 20:26   ` Matt Ranostay
       [not found]     ` <1447014418-27849-2-git-send-email-mranostay-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
  0 siblings, 1 reply; 6+ messages in thread
From: Matt Ranostay @ 2015-11-08 20:26 UTC (permalink / raw)
  To: jic23-DgEjT+Ai2ygdnm+yROfE0A
  Cc: linux-iio-u79uwXL29TY76Z2rM5mHXA, linux-pm-u79uwXL29TY76Z2rM5mHXA,
	k.kozlowski-Sze3O3UU22JBDgjK7y7TUQ, Matt Ranostay

Add runtime PM support for the lidar-lite module to enable low power
mode when last device requested reading is over a second.

Signed-off-by: Matt Ranostay <mranostay-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
 drivers/iio/proximity/pulsedlight-lidar-lite-v2.c | 54 ++++++++++++++++++++++-
 1 file changed, 53 insertions(+), 1 deletion(-)

diff --git a/drivers/iio/proximity/pulsedlight-lidar-lite-v2.c b/drivers/iio/proximity/pulsedlight-lidar-lite-v2.c
index 961f9f99..1a5481f 100644
--- a/drivers/iio/proximity/pulsedlight-lidar-lite-v2.c
+++ b/drivers/iio/proximity/pulsedlight-lidar-lite-v2.c
@@ -13,7 +13,7 @@
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  * GNU General Public License for more details.
  *
- * TODO: runtime pm, interrupt mode, and signal strength reporting
+ * TODO: interrupt mode, and signal strength reporting
  */
 
 #include <linux/err.h>
@@ -21,6 +21,7 @@
 #include <linux/i2c.h>
 #include <linux/delay.h>
 #include <linux/module.h>
+#include <linux/pm_runtime.h>
 #include <linux/iio/iio.h>
 #include <linux/iio/sysfs.h>
 #include <linux/iio/buffer.h>
@@ -37,6 +38,7 @@
 
 #define LIDAR_REG_DATA_HBYTE	0x0f
 #define LIDAR_REG_DATA_LBYTE	0x10
+#define LIDAR_REG_PWR_CONTROL	0x65
 
 #define LIDAR_DRV_NAME "lidar"
 
@@ -90,6 +92,12 @@ static inline int lidar_write_control(struct lidar_data *data, int val)
 	return i2c_smbus_write_byte_data(data->client, LIDAR_REG_CONTROL, val);
 }
 
+static inline int lidar_write_power(struct lidar_data *data, int val)
+{
+	return i2c_smbus_write_byte_data(data->client,
+					 LIDAR_REG_PWR_CONTROL, val);
+}
+
 static int lidar_read_measurement(struct lidar_data *data, u16 *reg)
 {
 	int ret;
@@ -116,6 +124,8 @@ static int lidar_get_measurement(struct lidar_data *data, u16 *reg)
 	int tries = 10;
 	int ret;
 
+	pm_runtime_get_sync(&client->dev);
+
 	/* start sample */
 	ret = lidar_write_control(data, LIDAR_REG_CONTROL_ACQUIRE);
 	if (ret < 0) {
@@ -144,6 +154,8 @@ static int lidar_get_measurement(struct lidar_data *data, u16 *reg)
 		}
 		ret = -EIO;
 	}
+	pm_runtime_mark_last_busy(&client->dev);
+	pm_runtime_put_autosuspend(&client->dev);
 
 	return ret;
 }
@@ -243,6 +255,15 @@ static int lidar_probe(struct i2c_client *client,
 	if (ret)
 		goto error_unreg_buffer;
 
+	pm_runtime_set_autosuspend_delay(&client->dev, 1000);
+	pm_runtime_use_autosuspend(&client->dev);
+
+	pm_runtime_set_active(&client->dev);
+	pm_runtime_enable(&client->dev);
+
+	pm_runtime_mark_last_busy(&client->dev);
+	pm_runtime_idle(&client->dev);
+
 	return 0;
 
 error_unreg_buffer:
@@ -258,6 +279,9 @@ static int lidar_remove(struct i2c_client *client)
 	iio_device_unregister(indio_dev);
 	iio_triggered_buffer_cleanup(indio_dev);
 
+	pm_runtime_disable(&client->dev);
+	pm_runtime_set_suspended(&client->dev);
+
 	return 0;
 }
 
@@ -273,10 +297,38 @@ static const struct of_device_id lidar_dt_ids[] = {
 };
 MODULE_DEVICE_TABLE(of, lidar_dt_ids);
 
+#ifdef CONFIG_PM
+static int lidar_pm_runtime_suspend(struct device *dev)
+{
+	struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev));
+	struct lidar_data *data = iio_priv(indio_dev);
+
+	return lidar_write_power(data, 0x0f);
+}
+
+static int lidar_pm_runtime_resume(struct device *dev)
+{
+	struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev));
+	struct lidar_data *data = iio_priv(indio_dev);
+	int ret = lidar_write_power(data, 0);
+
+	/* regulator and FPGA needs settling time */
+	usleep_range(15000, 20000);
+
+	return ret;
+}
+#endif
+
+static const struct dev_pm_ops lidar_pm_ops = {
+	SET_RUNTIME_PM_OPS(lidar_pm_runtime_suspend,
+			   lidar_pm_runtime_resume, NULL)
+};
+
 static struct i2c_driver lidar_driver = {
 	.driver = {
 		.name	= LIDAR_DRV_NAME,
 		.of_match_table	= of_match_ptr(lidar_dt_ids),
+		.pm	= &lidar_pm_ops,
 	},
 	.probe		= lidar_probe,
 	.remove		= lidar_remove,
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH v4 1/1] iio: pulsedlight-lidar-lite: add runtime PM
       [not found]     ` <1447014418-27849-2-git-send-email-mranostay-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
@ 2015-11-08 23:58       ` Krzysztof Kozlowski
  2015-11-10 12:26       ` Adriana Reus
  1 sibling, 0 replies; 6+ messages in thread
From: Krzysztof Kozlowski @ 2015-11-08 23:58 UTC (permalink / raw)
  To: Matt Ranostay, jic23-DgEjT+Ai2ygdnm+yROfE0A
  Cc: linux-iio-u79uwXL29TY76Z2rM5mHXA, linux-pm-u79uwXL29TY76Z2rM5mHXA

On 09.11.2015 05:26, Matt Ranostay wrote:
> Add runtime PM support for the lidar-lite module to enable low power
> mode when last device requested reading is over a second.
> 
> Signed-off-by: Matt Ranostay <mranostay-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
> ---
>  drivers/iio/proximity/pulsedlight-lidar-lite-v2.c | 54 ++++++++++++++++++++++-
>  1 file changed, 53 insertions(+), 1 deletion(-)
> 

Reviewed-by: Krzysztof Kozlowski <k.kozlowski-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>

Best regards,
Krzysztof

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v4 1/1] iio: pulsedlight-lidar-lite: add runtime PM
       [not found]     ` <1447014418-27849-2-git-send-email-mranostay-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
  2015-11-08 23:58       ` Krzysztof Kozlowski
@ 2015-11-10 12:26       ` Adriana Reus
  2015-11-11  8:51         ` Matt Ranostay
  1 sibling, 1 reply; 6+ messages in thread
From: Adriana Reus @ 2015-11-10 12:26 UTC (permalink / raw)
  To: Matt Ranostay, jic23-DgEjT+Ai2ygdnm+yROfE0A
  Cc: linux-iio-u79uwXL29TY76Z2rM5mHXA, linux-pm-u79uwXL29TY76Z2rM5mHXA,
	k.kozlowski-Sze3O3UU22JBDgjK7y7TUQ



On 08.11.2015 22:26, Matt Ranostay wrote:
> Add runtime PM support for the lidar-lite module to enable low power
> mode when last device requested reading is over a second.
>
> Signed-off-by: Matt Ranostay <mranostay-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
> ---
>   drivers/iio/proximity/pulsedlight-lidar-lite-v2.c | 54 ++++++++++++++++++++++-
>   1 file changed, 53 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/iio/proximity/pulsedlight-lidar-lite-v2.c b/drivers/iio/proximity/pulsedlight-lidar-lite-v2.c
> index 961f9f99..1a5481f 100644
> --- a/drivers/iio/proximity/pulsedlight-lidar-lite-v2.c
> +++ b/drivers/iio/proximity/pulsedlight-lidar-lite-v2.c
> @@ -13,7 +13,7 @@
>    * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
>    * GNU General Public License for more details.
>    *
> - * TODO: runtime pm, interrupt mode, and signal strength reporting
> + * TODO: interrupt mode, and signal strength reporting
>    */
>
>   #include <linux/err.h>
> @@ -21,6 +21,7 @@
>   #include <linux/i2c.h>
>   #include <linux/delay.h>
>   #include <linux/module.h>
> +#include <linux/pm_runtime.h>
>   #include <linux/iio/iio.h>
>   #include <linux/iio/sysfs.h>
>   #include <linux/iio/buffer.h>
> @@ -37,6 +38,7 @@
>
>   #define LIDAR_REG_DATA_HBYTE	0x0f
>   #define LIDAR_REG_DATA_LBYTE	0x10
> +#define LIDAR_REG_PWR_CONTROL	0x65
>
>   #define LIDAR_DRV_NAME "lidar"
>
> @@ -90,6 +92,12 @@ static inline int lidar_write_control(struct lidar_data *data, int val)
>   	return i2c_smbus_write_byte_data(data->client, LIDAR_REG_CONTROL, val);
>   }
>
> +static inline int lidar_write_power(struct lidar_data *data, int val)
> +{
> +	return i2c_smbus_write_byte_data(data->client,
> +					 LIDAR_REG_PWR_CONTROL, val);
> +}
> +
>   static int lidar_read_measurement(struct lidar_data *data, u16 *reg)
>   {
>   	int ret;
> @@ -116,6 +124,8 @@ static int lidar_get_measurement(struct lidar_data *data, u16 *reg)
>   	int tries = 10;
>   	int ret;
>
> +	pm_runtime_get_sync(&client->dev);
> +
>   	/* start sample */
>   	ret = lidar_write_control(data, LIDAR_REG_CONTROL_ACQUIRE);
>   	if (ret < 0) {
> @@ -144,6 +154,8 @@ static int lidar_get_measurement(struct lidar_data *data, u16 *reg)
>   		}
>   		ret = -EIO;
>   	}
> +	pm_runtime_mark_last_busy(&client->dev);
> +	pm_runtime_put_autosuspend(&client->dev);
>
>   	return ret;
>   }
> @@ -243,6 +255,15 @@ static int lidar_probe(struct i2c_client *client,
>   	if (ret)
>   		goto error_unreg_buffer;
>
> +	pm_runtime_set_autosuspend_delay(&client->dev, 1000);
> +	pm_runtime_use_autosuspend(&client->dev);
> +
> +	pm_runtime_set_active(&client->dev);
pm_runtime_set_active ^ may return an error code.
> +	pm_runtime_enable(&client->dev);
> +
> +	pm_runtime_mark_last_busy(&client->dev);
> +	pm_runtime_idle(&client->dev);
> +
>   	return 0;
>
>   error_unreg_buffer:
> @@ -258,6 +279,9 @@ static int lidar_remove(struct i2c_client *client)
>   	iio_device_unregister(indio_dev);
>   	iio_triggered_buffer_cleanup(indio_dev);
>
> +	pm_runtime_disable(&client->dev);
> +	pm_runtime_set_suspended(&client->dev);
> +
>   	return 0;
>   }
>
> @@ -273,10 +297,38 @@ static const struct of_device_id lidar_dt_ids[] = {
>   };
>   MODULE_DEVICE_TABLE(of, lidar_dt_ids);
>
> +#ifdef CONFIG_PM
> +static int lidar_pm_runtime_suspend(struct device *dev)
> +{
> +	struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev));
> +	struct lidar_data *data = iio_priv(indio_dev);
> +
> +	return lidar_write_power(data, 0x0f);
> +}
> +
> +static int lidar_pm_runtime_resume(struct device *dev)
> +{
> +	struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev));
> +	struct lidar_data *data = iio_priv(indio_dev);
> +	int ret = lidar_write_power(data, 0);
> +
> +	/* regulator and FPGA needs settling time */
> +	usleep_range(15000, 20000);
> +
> +	return ret;
> +}
> +#endif
> +
> +static const struct dev_pm_ops lidar_pm_ops = {
> +	SET_RUNTIME_PM_OPS(lidar_pm_runtime_suspend,
> +			   lidar_pm_runtime_resume, NULL)
> +};
> +
>   static struct i2c_driver lidar_driver = {
>   	.driver = {
>   		.name	= LIDAR_DRV_NAME,
>   		.of_match_table	= of_match_ptr(lidar_dt_ids),
> +		.pm	= &lidar_pm_ops,
>   	},
>   	.probe		= lidar_probe,
>   	.remove		= lidar_remove,
>

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v4 1/1] iio: pulsedlight-lidar-lite: add runtime PM
  2015-11-10 12:26       ` Adriana Reus
@ 2015-11-11  8:51         ` Matt Ranostay
       [not found]           ` <CAKzfze_Zozt4N13jJdAi2C03T57BqNRox3+tANK_hz4d1oiuyw-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
  0 siblings, 1 reply; 6+ messages in thread
From: Matt Ranostay @ 2015-11-11  8:51 UTC (permalink / raw)
  To: Adriana Reus
  Cc: Jonathan Cameron, linux-iio@vger.kernel.org, linux-pm,
	Krzysztof Kozłowski

On Tue, Nov 10, 2015 at 4:26 AM, Adriana Reus <adriana.reus@intel.com> wrote:
>
>
> On 08.11.2015 22:26, Matt Ranostay wrote:
>>
>> Add runtime PM support for the lidar-lite module to enable low power
>> mode when last device requested reading is over a second.
>>
>> Signed-off-by: Matt Ranostay <mranostay@gmail.com>
>> ---
>>   drivers/iio/proximity/pulsedlight-lidar-lite-v2.c | 54
>> ++++++++++++++++++++++-
>>   1 file changed, 53 insertions(+), 1 deletion(-)
>>
>> diff --git a/drivers/iio/proximity/pulsedlight-lidar-lite-v2.c
>> b/drivers/iio/proximity/pulsedlight-lidar-lite-v2.c
>> index 961f9f99..1a5481f 100644
>> --- a/drivers/iio/proximity/pulsedlight-lidar-lite-v2.c
>> +++ b/drivers/iio/proximity/pulsedlight-lidar-lite-v2.c
>> @@ -13,7 +13,7 @@
>>    * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
>>    * GNU General Public License for more details.
>>    *
>> - * TODO: runtime pm, interrupt mode, and signal strength reporting
>> + * TODO: interrupt mode, and signal strength reporting
>>    */
>>
>>   #include <linux/err.h>
>> @@ -21,6 +21,7 @@
>>   #include <linux/i2c.h>
>>   #include <linux/delay.h>
>>   #include <linux/module.h>
>> +#include <linux/pm_runtime.h>
>>   #include <linux/iio/iio.h>
>>   #include <linux/iio/sysfs.h>
>>   #include <linux/iio/buffer.h>
>> @@ -37,6 +38,7 @@
>>
>>   #define LIDAR_REG_DATA_HBYTE  0x0f
>>   #define LIDAR_REG_DATA_LBYTE  0x10
>> +#define LIDAR_REG_PWR_CONTROL  0x65
>>
>>   #define LIDAR_DRV_NAME "lidar"
>>
>> @@ -90,6 +92,12 @@ static inline int lidar_write_control(struct lidar_data
>> *data, int val)
>>         return i2c_smbus_write_byte_data(data->client, LIDAR_REG_CONTROL,
>> val);
>>   }
>>
>> +static inline int lidar_write_power(struct lidar_data *data, int val)
>> +{
>> +       return i2c_smbus_write_byte_data(data->client,
>> +                                        LIDAR_REG_PWR_CONTROL, val);
>> +}
>> +
>>   static int lidar_read_measurement(struct lidar_data *data, u16 *reg)
>>   {
>>         int ret;
>> @@ -116,6 +124,8 @@ static int lidar_get_measurement(struct lidar_data
>> *data, u16 *reg)
>>         int tries = 10;
>>         int ret;
>>
>> +       pm_runtime_get_sync(&client->dev);
>> +
>>         /* start sample */
>>         ret = lidar_write_control(data, LIDAR_REG_CONTROL_ACQUIRE);
>>         if (ret < 0) {
>> @@ -144,6 +154,8 @@ static int lidar_get_measurement(struct lidar_data
>> *data, u16 *reg)
>>                 }
>>                 ret = -EIO;
>>         }
>> +       pm_runtime_mark_last_busy(&client->dev);
>> +       pm_runtime_put_autosuspend(&client->dev);
>>
>>         return ret;
>>   }
>> @@ -243,6 +255,15 @@ static int lidar_probe(struct i2c_client *client,
>>         if (ret)
>>                 goto error_unreg_buffer;
>>
>> +       pm_runtime_set_autosuspend_delay(&client->dev, 1000);
>> +       pm_runtime_use_autosuspend(&client->dev);
>> +
>> +       pm_runtime_set_active(&client->dev);
>
> pm_runtime_set_active ^ may return an error code.

Ah true. But is the return value really needed in this case?

>
>> +       pm_runtime_enable(&client->dev);
>> +
>> +       pm_runtime_mark_last_busy(&client->dev);
>> +       pm_runtime_idle(&client->dev);
>> +
>>         return 0;
>>
>>   error_unreg_buffer:
>> @@ -258,6 +279,9 @@ static int lidar_remove(struct i2c_client *client)
>>         iio_device_unregister(indio_dev);
>>         iio_triggered_buffer_cleanup(indio_dev);
>>
>> +       pm_runtime_disable(&client->dev);
>> +       pm_runtime_set_suspended(&client->dev);
>> +
>>         return 0;
>>   }
>>
>> @@ -273,10 +297,38 @@ static const struct of_device_id lidar_dt_ids[] = {
>>   };
>>   MODULE_DEVICE_TABLE(of, lidar_dt_ids);
>>
>> +#ifdef CONFIG_PM
>> +static int lidar_pm_runtime_suspend(struct device *dev)
>> +{
>> +       struct iio_dev *indio_dev =
>> i2c_get_clientdata(to_i2c_client(dev));
>> +       struct lidar_data *data = iio_priv(indio_dev);
>> +
>> +       return lidar_write_power(data, 0x0f);
>> +}
>> +
>> +static int lidar_pm_runtime_resume(struct device *dev)
>> +{
>> +       struct iio_dev *indio_dev =
>> i2c_get_clientdata(to_i2c_client(dev));
>> +       struct lidar_data *data = iio_priv(indio_dev);
>> +       int ret = lidar_write_power(data, 0);
>> +
>> +       /* regulator and FPGA needs settling time */
>> +       usleep_range(15000, 20000);
>> +
>> +       return ret;
>> +}
>> +#endif
>> +
>> +static const struct dev_pm_ops lidar_pm_ops = {
>> +       SET_RUNTIME_PM_OPS(lidar_pm_runtime_suspend,
>> +                          lidar_pm_runtime_resume, NULL)
>> +};
>> +
>>   static struct i2c_driver lidar_driver = {
>>         .driver = {
>>                 .name   = LIDAR_DRV_NAME,
>>                 .of_match_table = of_match_ptr(lidar_dt_ids),
>> +               .pm     = &lidar_pm_ops,
>>         },
>>         .probe          = lidar_probe,
>>         .remove         = lidar_remove,
>>
>

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v4 1/1] iio: pulsedlight-lidar-lite: add runtime PM
       [not found]           ` <CAKzfze_Zozt4N13jJdAi2C03T57BqNRox3+tANK_hz4d1oiuyw-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
@ 2015-11-15 10:46             ` Jonathan Cameron
  0 siblings, 0 replies; 6+ messages in thread
From: Jonathan Cameron @ 2015-11-15 10:46 UTC (permalink / raw)
  To: Matt Ranostay, Adriana Reus
  Cc: linux-iio-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	linux-pm-u79uwXL29TY76Z2rM5mHXA, Krzysztof Kozłowski

On 11/11/15 08:51, Matt Ranostay wrote:
> On Tue, Nov 10, 2015 at 4:26 AM, Adriana Reus <adriana.reus-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org> wrote:
>>
>>
>> On 08.11.2015 22:26, Matt Ranostay wrote:
>>>
>>> Add runtime PM support for the lidar-lite module to enable low power
>>> mode when last device requested reading is over a second.
>>>
>>> Signed-off-by: Matt Ranostay <mranostay-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
>>> ---
>>>   drivers/iio/proximity/pulsedlight-lidar-lite-v2.c | 54
>>> ++++++++++++++++++++++-
>>>   1 file changed, 53 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/drivers/iio/proximity/pulsedlight-lidar-lite-v2.c
>>> b/drivers/iio/proximity/pulsedlight-lidar-lite-v2.c
>>> index 961f9f99..1a5481f 100644
>>> --- a/drivers/iio/proximity/pulsedlight-lidar-lite-v2.c
>>> +++ b/drivers/iio/proximity/pulsedlight-lidar-lite-v2.c
>>> @@ -13,7 +13,7 @@
>>>    * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
>>>    * GNU General Public License for more details.
>>>    *
>>> - * TODO: runtime pm, interrupt mode, and signal strength reporting
>>> + * TODO: interrupt mode, and signal strength reporting
>>>    */
>>>
>>>   #include <linux/err.h>
>>> @@ -21,6 +21,7 @@
>>>   #include <linux/i2c.h>
>>>   #include <linux/delay.h>
>>>   #include <linux/module.h>
>>> +#include <linux/pm_runtime.h>
>>>   #include <linux/iio/iio.h>
>>>   #include <linux/iio/sysfs.h>
>>>   #include <linux/iio/buffer.h>
>>> @@ -37,6 +38,7 @@
>>>
>>>   #define LIDAR_REG_DATA_HBYTE  0x0f
>>>   #define LIDAR_REG_DATA_LBYTE  0x10
>>> +#define LIDAR_REG_PWR_CONTROL  0x65
>>>
>>>   #define LIDAR_DRV_NAME "lidar"
>>>
>>> @@ -90,6 +92,12 @@ static inline int lidar_write_control(struct lidar_data
>>> *data, int val)
>>>         return i2c_smbus_write_byte_data(data->client, LIDAR_REG_CONTROL,
>>> val);
>>>   }
>>>
>>> +static inline int lidar_write_power(struct lidar_data *data, int val)
>>> +{
>>> +       return i2c_smbus_write_byte_data(data->client,
>>> +                                        LIDAR_REG_PWR_CONTROL, val);
>>> +}
>>> +
>>>   static int lidar_read_measurement(struct lidar_data *data, u16 *reg)
>>>   {
>>>         int ret;
>>> @@ -116,6 +124,8 @@ static int lidar_get_measurement(struct lidar_data
>>> *data, u16 *reg)
>>>         int tries = 10;
>>>         int ret;
>>>
>>> +       pm_runtime_get_sync(&client->dev);
>>> +
>>>         /* start sample */
>>>         ret = lidar_write_control(data, LIDAR_REG_CONTROL_ACQUIRE);
>>>         if (ret < 0) {
>>> @@ -144,6 +154,8 @@ static int lidar_get_measurement(struct lidar_data
>>> *data, u16 *reg)
>>>                 }
>>>                 ret = -EIO;
>>>         }
>>> +       pm_runtime_mark_last_busy(&client->dev);
>>> +       pm_runtime_put_autosuspend(&client->dev);
>>>
>>>         return ret;
>>>   }
>>> @@ -243,6 +255,15 @@ static int lidar_probe(struct i2c_client *client,
>>>         if (ret)
>>>                 goto error_unreg_buffer;
>>>
>>> +       pm_runtime_set_autosuspend_delay(&client->dev, 1000);
>>> +       pm_runtime_use_autosuspend(&client->dev);
>>> +
>>> +       pm_runtime_set_active(&client->dev);
>>
>> pm_runtime_set_active ^ may return an error code.
> 
> Ah true. But is the return value really needed in this case?
Why would it not be?  Something in the probe routine failed,
the driver should fail to probe...

If it is possible to muddle through, then you want to explicitly make
that clear by handling the error and perhaps outputting a warning...

J
> 
>>
>>> +       pm_runtime_enable(&client->dev);
>>> +
>>> +       pm_runtime_mark_last_busy(&client->dev);
>>> +       pm_runtime_idle(&client->dev);
>>> +
>>>         return 0;
>>>
>>>   error_unreg_buffer:
>>> @@ -258,6 +279,9 @@ static int lidar_remove(struct i2c_client *client)
>>>         iio_device_unregister(indio_dev);
>>>         iio_triggered_buffer_cleanup(indio_dev);
>>>
>>> +       pm_runtime_disable(&client->dev);
>>> +       pm_runtime_set_suspended(&client->dev);
>>> +
>>>         return 0;
>>>   }
>>>
>>> @@ -273,10 +297,38 @@ static const struct of_device_id lidar_dt_ids[] = {
>>>   };
>>>   MODULE_DEVICE_TABLE(of, lidar_dt_ids);
>>>
>>> +#ifdef CONFIG_PM
>>> +static int lidar_pm_runtime_suspend(struct device *dev)
>>> +{
>>> +       struct iio_dev *indio_dev =
>>> i2c_get_clientdata(to_i2c_client(dev));
>>> +       struct lidar_data *data = iio_priv(indio_dev);
>>> +
>>> +       return lidar_write_power(data, 0x0f);
>>> +}
>>> +
>>> +static int lidar_pm_runtime_resume(struct device *dev)
>>> +{
>>> +       struct iio_dev *indio_dev =
>>> i2c_get_clientdata(to_i2c_client(dev));
>>> +       struct lidar_data *data = iio_priv(indio_dev);
>>> +       int ret = lidar_write_power(data, 0);
>>> +
>>> +       /* regulator and FPGA needs settling time */
>>> +       usleep_range(15000, 20000);
>>> +
>>> +       return ret;
>>> +}
>>> +#endif
>>> +
>>> +static const struct dev_pm_ops lidar_pm_ops = {
>>> +       SET_RUNTIME_PM_OPS(lidar_pm_runtime_suspend,
>>> +                          lidar_pm_runtime_resume, NULL)
>>> +};
>>> +
>>>   static struct i2c_driver lidar_driver = {
>>>         .driver = {
>>>                 .name   = LIDAR_DRV_NAME,
>>>                 .of_match_table = of_match_ptr(lidar_dt_ids),
>>> +               .pm     = &lidar_pm_ops,
>>>         },
>>>         .probe          = lidar_probe,
>>>         .remove         = lidar_remove,
>>>
>>

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2015-11-15 10:46 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-11-08 20:26 [PATCH v4 0/1] iio: pulsedlight-lidar-lite: add runtime PM Matt Ranostay
     [not found] ` <1447014418-27849-1-git-send-email-mranostay-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2015-11-08 20:26   ` [PATCH v4 1/1] " Matt Ranostay
     [not found]     ` <1447014418-27849-2-git-send-email-mranostay-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2015-11-08 23:58       ` Krzysztof Kozlowski
2015-11-10 12:26       ` Adriana Reus
2015-11-11  8:51         ` Matt Ranostay
     [not found]           ` <CAKzfze_Zozt4N13jJdAi2C03T57BqNRox3+tANK_hz4d1oiuyw-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2015-11-15 10:46             ` Jonathan Cameron

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).