greybus: camera: fix data-connection handling
authorJohan Hovold <johan@hovoldconsulting.com>
Wed, 11 May 2016 08:18:06 +0000 (10:18 +0200)
committerGreg Kroah-Hartman <gregkh@google.com>
Fri, 13 May 2016 13:32:48 +0000 (15:32 +0200)
Now that core supports offloaded connections, we can remove the hack
that was used to setup the data connection.

Note that offloaded-resource management may need to be refined later,
but the current minimal implementation is enough to allow core to manage
the connections (e.g. needed for proper connection tear down and power
management).

This will also allow the camera driver to be converted to a bundle
driver.

Signed-off-by: Johan Hovold <johan@hovoldconsulting.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@linaro.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
drivers/staging/greybus/camera.c

index ba76f56..4831ad6 100644 (file)
@@ -42,7 +42,7 @@ struct gb_camera_debugfs_buffer {
  */
 struct gb_camera {
        struct gb_connection *connection;
-       bool data_connected;
+       struct gb_connection *data_connection;
 
        struct {
                struct dentry *root;
@@ -900,13 +900,9 @@ static void gb_camera_cleanup(struct gb_camera *gcam)
 {
        gb_camera_debugfs_cleanup(gcam);
 
-       if (gcam->data_connected) {
-               struct gb_interface *intf = gcam->connection->intf;
-               struct gb_svc *svc = gcam->connection->hd->svc;
-
-               gb_svc_connection_destroy(svc, intf->interface_id,
-                                         ES2_APB_CDSI0_CPORT, svc->ap_intf_id,
-                                         ES2_APB_CDSI1_CPORT);
+       if (gcam->data_connection) {
+               gb_connection_disable(gcam->data_connection);
+               gb_connection_destroy(gcam->data_connection);
        }
 
        kfree(gcam);
@@ -914,9 +910,9 @@ static void gb_camera_cleanup(struct gb_camera *gcam)
 
 static int gb_camera_connection_init(struct gb_connection *connection)
 {
-       struct gb_svc *svc = connection->hd->svc;
+       struct gb_connection *data;
        struct gb_camera *gcam;
-       u8 cport_flags;
+       unsigned long data_flags;
        int ret;
 
        gcam = kzalloc(sizeof(*gcam), GFP_KERNEL);
@@ -930,14 +926,20 @@ static int gb_camera_connection_init(struct gb_connection *connection)
         * Create the data connection between camera module CDSI0 and APB CDS1.
         * The CPort IDs are hardcoded by the ES2 bridges.
         */
-       cport_flags = GB_SVC_CPORT_FLAG_CSD_N | GB_SVC_CPORT_FLAG_CSV_N;
-       ret = gb_svc_connection_create(svc, connection->intf->interface_id,
-                                      ES2_APB_CDSI0_CPORT, svc->ap_intf_id,
-                                      ES2_APB_CDSI1_CPORT, cport_flags);
-       if (ret < 0)
+       data_flags = GB_CONNECTION_FLAG_NO_FLOWCTRL | GB_CONNECTION_FLAG_CDSI1;
+
+       data = gb_connection_create_offloaded(connection->bundle,
+                                             ES2_APB_CDSI0_CPORT,
+                                             data_flags);
+       if (IS_ERR(data)) {
+               ret = PTR_ERR(data);
                goto error;
+       }
+       gcam->data_connection = data;
 
-       gcam->data_connected = true;
+       ret = gb_connection_enable(data);
+       if (ret)
+               goto error;
 
        ret = gb_camera_debugfs_init(gcam);
        if (ret < 0)