Browse Source

greybus: i2c: add runtime pm support

Add runtime pm support to camera i2c bridged phy device class driver

Testing Done:
 - Passed #gb_test.sh -v -t i2c

Signed-off-by: David Lin <dtwlin@google.com>
Signed-off-by: Axel Haslam <haslam_axel@projectara.com>
Reviewed-by: Johan Hovold <johan@hovoldconsulting.com>
Signed-off-by: Alex Elder <elder@linaro.org>
David Lin 9 years ago
parent
commit
c0e72f6af7
1 changed files with 13 additions and 0 deletions
  1. 13 0
      drivers/staging/greybus/i2c.c

+ 13 - 0
drivers/staging/greybus/i2c.c

@@ -176,6 +176,10 @@ static int gb_i2c_transfer_operation(struct gb_i2c_device *gb_i2c_dev,
 	if (!operation)
 	if (!operation)
 		return -ENOMEM;
 		return -ENOMEM;
 
 
+	ret = gbphy_runtime_get_sync(gb_i2c_dev->gbphy_dev);
+	if (ret)
+		goto exit_operation_put;
+
 	ret = gb_operation_request_send_sync(operation);
 	ret = gb_operation_request_send_sync(operation);
 	if (!ret) {
 	if (!ret) {
 		struct gb_i2c_transfer_response *response;
 		struct gb_i2c_transfer_response *response;
@@ -187,6 +191,9 @@ static int gb_i2c_transfer_operation(struct gb_i2c_device *gb_i2c_dev,
 		dev_err(dev, "transfer operation failed (%d)\n", ret);
 		dev_err(dev, "transfer operation failed (%d)\n", ret);
 	}
 	}
 
 
+	gbphy_runtime_put_autosuspend(gb_i2c_dev->gbphy_dev);
+
+exit_operation_put:
 	gb_operation_put(operation);
 	gb_operation_put(operation);
 
 
 	return ret;
 	return ret;
@@ -290,6 +297,7 @@ static int gb_i2c_probe(struct gbphy_device *gbphy_dev,
 	if (ret)
 	if (ret)
 		goto exit_connection_disable;
 		goto exit_connection_disable;
 
 
+	gbphy_runtime_put_autosuspend(gbphy_dev);
 	return 0;
 	return 0;
 
 
 exit_connection_disable:
 exit_connection_disable:
@@ -306,6 +314,11 @@ static void gb_i2c_remove(struct gbphy_device *gbphy_dev)
 {
 {
 	struct gb_i2c_device *gb_i2c_dev = gb_gbphy_get_data(gbphy_dev);
 	struct gb_i2c_device *gb_i2c_dev = gb_gbphy_get_data(gbphy_dev);
 	struct gb_connection *connection = gb_i2c_dev->connection;
 	struct gb_connection *connection = gb_i2c_dev->connection;
+	int ret;
+
+	ret = gbphy_runtime_get_sync(gbphy_dev);
+	if (ret)
+		gbphy_runtime_get_noresume(gbphy_dev);
 
 
 	i2c_del_adapter(&gb_i2c_dev->adapter);
 	i2c_del_adapter(&gb_i2c_dev->adapter);
 	gb_connection_disable(connection);
 	gb_connection_disable(connection);