diff options
Diffstat (limited to 'drivers/staging')
-rw-r--r-- | drivers/staging/greybus/camera.c | 25 | ||||
-rw-r--r-- | drivers/staging/greybus/gb-camera.h | 15 |
2 files changed, 29 insertions, 11 deletions
diff --git a/drivers/staging/greybus/camera.c b/drivers/staging/greybus/camera.c index e862659a5ccc..722f2b4fe54d 100644 --- a/drivers/staging/greybus/camera.c +++ b/drivers/staging/greybus/camera.c @@ -38,6 +38,7 @@ struct gb_camera_debugfs_buffer { * @connection: the greybus connection for camera control * @data_connected: whether the data connection has been established * @debugfs: debugfs entries for camera protocol operations testing + * @module: Greybus camera module registered to HOST processor. */ struct gb_camera { struct gb_connection *connection; @@ -47,6 +48,8 @@ struct gb_camera { struct dentry *root; struct gb_camera_debugfs_buffer *buffers; } debugfs; + + struct gb_camera_module module; }; struct gb_camera_stream_config { @@ -504,16 +507,20 @@ static int gb_camera_op_flush(void *priv, u32 *request_id) return gb_camera_flush(priv, request_id); } -struct gb_camera_ops gb_cam_ops = { - .capabilities = gb_camera_op_capabilities, - .configure_streams = gb_camera_op_configure_streams, - .capture = gb_camera_op_capture, - .flush = gb_camera_op_flush, -}; - static int gb_camera_register_intf_ops(struct gb_camera *gcam) { - return gb_camera_register(&gb_cam_ops, gcam); + gcam->module.priv = gcam; + gcam->module.ops.capabilities = gb_camera_op_capabilities; + gcam->module.ops.configure_streams = gb_camera_op_configure_streams; + gcam->module.ops.capture = gb_camera_op_capture; + gcam->module.ops.flush = gb_camera_op_flush; + + return gb_camera_register(&gcam->module); +} + +static int gb_camera_unregister_intf_ops(struct gb_camera *gcam) +{ + return gb_camera_unregister(&gcam->module); } /* ----------------------------------------------------------------------------- @@ -931,6 +938,8 @@ static void gb_camera_connection_exit(struct gb_connection *connection) { struct gb_camera *gcam = connection->private; + gb_camera_unregister_intf_ops(gcam); + gb_camera_cleanup(gcam); } diff --git a/drivers/staging/greybus/gb-camera.h b/drivers/staging/greybus/gb-camera.h index 50af0573737b..0a48a16b675e 100644 --- a/drivers/staging/greybus/gb-camera.h +++ b/drivers/staging/greybus/gb-camera.h @@ -34,9 +34,18 @@ struct gb_camera_ops { int (*flush)(void *priv, u32 *request_id); }; -#define gb_camera_call(f, p, op, args...) \ - (((f)->op) ? (f)->op(p, ##args) : -ENOIOCTLCMD) +struct gb_camera_module { + void *priv; + struct gb_camera_ops ops; -int gb_camera_register(struct gb_camera_ops *ops, void *priv); + struct list_head list; /* Global list */ +}; + +#define gb_camera_call(f, op, args...) \ + ((!(f) ? -ENODEV : ((f)->ops.op) ? \ + (f)->ops.op((f)->priv, ##args) : -ENOIOCTLCMD)) + +int gb_camera_register(struct gb_camera_module *module); +int gb_camera_unregister(struct gb_camera_module *module); #endif /* __GB_CAMERA_H */ |