greybus: camera: fix data-connection handling

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>
This commit is contained in:
Johan Hovold 2016-05-11 10:18:06 +02:00 committed by Greg Kroah-Hartman
parent 3b05d8508f
commit 3ba9fa5c92
1 changed files with 19 additions and 17 deletions

View 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)
goto error;
data_flags = GB_CONNECTION_FLAG_NO_FLOWCTRL | GB_CONNECTION_FLAG_CDSI1;
gcam->data_connected = true;
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;
ret = gb_connection_enable(data);
if (ret)
goto error;
ret = gb_camera_debugfs_init(gcam);
if (ret < 0)