summaryrefslogtreecommitdiffstats
path: root/drivers/staging/greybus
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/staging/greybus')
-rw-r--r--drivers/staging/greybus/camera.c25
-rw-r--r--drivers/staging/greybus/gb-camera.h15
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 */