2 * Greybus Camera protocol driver.
4 * Copyright 2015 Google Inc.
5 * Copyright 2015 Linaro Ltd.
7 * Released under the GPLv2 only.
10 #include <linux/debugfs.h>
12 #include <linux/kernel.h>
13 #include <linux/module.h>
14 #include <linux/slab.h>
15 #include <linux/string.h>
16 #include <linux/uaccess.h>
17 #include <linux/vmalloc.h>
19 #include "gb-camera.h"
21 #include "greybus_protocols.h"
23 enum gb_camera_debugs_buffer_id
{
24 GB_CAMERA_DEBUGFS_BUFFER_CAPABILITIES
,
25 GB_CAMERA_DEBUGFS_BUFFER_STREAMS
,
26 GB_CAMERA_DEBUGFS_BUFFER_CAPTURE
,
27 GB_CAMERA_DEBUGFS_BUFFER_FLUSH
,
28 GB_CAMERA_DEBUGFS_BUFFER_MAX
,
31 struct gb_camera_debugfs_buffer
{
37 * struct gb_camera - A Greybus Camera Device
38 * @connection: the greybus connection for camera control
39 * @data_connected: whether the data connection has been established
40 * @debugfs: debugfs entries for camera protocol operations testing
43 struct gb_connection
*connection
;
48 struct gb_camera_debugfs_buffer
*buffers
;
52 struct gb_camera_stream_config
{
58 unsigned int max_size
;
61 struct gb_camera_fmt_map
{
62 enum v4l2_mbus_pixelcode mbus_code
;
63 unsigned int gb_format
;
66 /* GB format to media code map */
67 static const struct gb_camera_fmt_map mbus_to_gbus_format
[] = {
69 .mbus_code
= V4L2_MBUS_FMT_UYVY8_1X16
,
73 .mbus_code
= V4L2_MBUS_FMT_NV12_1x8
,
77 .mbus_code
= V4L2_MBUS_FMT_NV21_1x8
,
81 .mbus_code
= V4L2_MBUS_FMT_YU12_1x8
,
85 .mbus_code
= V4L2_MBUS_FMT_YV12_1x8
,
89 .mbus_code
= V4L2_MBUS_FMT_JPEG_1X8
,
94 #define ES2_APB_CDSI0_CPORT 16
95 #define ES2_APB_CDSI1_CPORT 17
97 #define GB_CAMERA_MAX_SETTINGS_SIZE 8192
99 #define gcam_dbg(gcam, format...) \
100 dev_dbg(&gcam->connection->bundle->dev, format)
101 #define gcam_info(gcam, format...) \
102 dev_info(&gcam->connection->bundle->dev, format)
103 #define gcam_err(gcam, format...) \
104 dev_err(&gcam->connection->bundle->dev, format)
106 /* -----------------------------------------------------------------------------
107 * Camera Protocol Operations
110 struct ap_csi_config_request
{
118 static int gb_camera_configure_streams(struct gb_camera
*gcam
,
119 unsigned int *num_streams
,
121 struct gb_camera_stream_config
*streams
)
123 struct gb_interface
*intf
= gcam
->connection
->intf
;
124 struct gb_svc
*svc
= gcam
->connection
->hd
->svc
;
125 struct gb_camera_configure_streams_request
*req
;
126 struct gb_camera_configure_streams_response
*resp
;
127 struct ap_csi_config_request csi_cfg
;
129 unsigned int nstreams
= *num_streams
;
135 if (nstreams
> GB_CAMERA_MAX_STREAMS
)
138 req_size
= sizeof(*req
) + nstreams
* sizeof(req
->config
[0]);
139 resp_size
= sizeof(*resp
) + nstreams
* sizeof(resp
->config
[0]);
141 req
= kmalloc(req_size
, GFP_KERNEL
);
142 resp
= kmalloc(resp_size
, GFP_KERNEL
);
149 * Setup unipro link speed before actually issuing configuration
150 * to the camera module, to assure unipro network speed is set
151 * before CSI interfaces gets configured
153 if (nstreams
&& !(*flags
& GB_CAMERA_CONFIGURE_STREAMS_TEST_ONLY
)) {
154 ret
= gb_svc_intf_set_power_mode(svc
, intf
->interface_id
,
155 GB_SVC_UNIPRO_HS_SERIES_A
,
156 GB_SVC_UNIPRO_FAST_MODE
, 2, 2,
157 GB_SVC_UNIPRO_FAST_MODE
, 2, 2,
158 GB_SVC_PWRM_RXTERMINATION
|
159 GB_SVC_PWRM_TXTERMINATION
, 0);
163 ret
= gb_svc_intf_set_power_mode(svc
, svc
->ap_intf_id
,
164 GB_SVC_UNIPRO_HS_SERIES_A
,
165 GB_SVC_UNIPRO_FAST_MODE
, 2, 2,
166 GB_SVC_UNIPRO_FAST_MODE
, 2, 2,
167 GB_SVC_PWRM_RXTERMINATION
|
168 GB_SVC_PWRM_TXTERMINATION
, 0);
171 } else if (nstreams
== 0) {
172 ret
= gb_svc_intf_set_power_mode(svc
, intf
->interface_id
,
173 GB_SVC_UNIPRO_HS_SERIES_A
,
174 GB_SVC_UNIPRO_SLOW_AUTO_MODE
,
176 GB_SVC_UNIPRO_SLOW_AUTO_MODE
,
180 gcam_err(gcam
, "can't take camera link to PWM-G1 auto: %d\n",
185 ret
= gb_svc_intf_set_power_mode(svc
, svc
->ap_intf_id
,
186 GB_SVC_UNIPRO_HS_SERIES_A
,
187 GB_SVC_UNIPRO_SLOW_AUTO_MODE
,
189 GB_SVC_UNIPRO_SLOW_AUTO_MODE
,
193 gcam_err(gcam
, "can't take AP link to PWM-G1 auto: %d\n",
199 req
->num_streams
= nstreams
;
203 for (i
= 0; i
< nstreams
; ++i
) {
204 struct gb_camera_stream_config_request
*cfg
= &req
->config
[i
];
206 cfg
->width
= cpu_to_le16(streams
[i
].width
);
207 cfg
->height
= cpu_to_le16(streams
[i
].height
);
208 cfg
->format
= cpu_to_le16(streams
[i
].format
);
212 ret
= gb_operation_sync(gcam
->connection
,
213 GB_CAMERA_TYPE_CONFIGURE_STREAMS
,
214 req
, req_size
, resp
, resp_size
);
216 goto set_unipro_slow_mode
;
218 if (resp
->num_streams
> nstreams
) {
219 gcam_dbg(gcam
, "got #streams %u > request %u\n",
220 resp
->num_streams
, nstreams
);
222 goto set_unipro_slow_mode
;
225 if (resp
->padding
!= 0) {
226 gcam_dbg(gcam
, "response padding != 0");
228 goto set_unipro_slow_mode
;
231 for (i
= 0; i
< nstreams
; ++i
) {
232 struct gb_camera_stream_config_response
*cfg
= &resp
->config
[i
];
234 streams
[i
].width
= le16_to_cpu(cfg
->width
);
235 streams
[i
].height
= le16_to_cpu(cfg
->height
);
236 streams
[i
].format
= le16_to_cpu(cfg
->format
);
237 streams
[i
].vc
= cfg
->virtual_channel
;
238 streams
[i
].dt
[0] = cfg
->data_type
[0];
239 streams
[i
].dt
[1] = cfg
->data_type
[1];
240 streams
[i
].max_size
= le32_to_cpu(cfg
->max_size
);
242 if (cfg
->padding
[0] || cfg
->padding
[1] || cfg
->padding
[2]) {
243 gcam_dbg(gcam
, "stream #%u padding != 0", i
);
245 goto set_unipro_slow_mode
;
249 if (nstreams
&& resp
->flags
& GB_CAMERA_CONFIGURE_STREAMS_ADJUSTED
) {
250 *flags
= resp
->flags
;
251 *num_streams
= resp
->num_streams
;
252 goto set_unipro_slow_mode
;
255 memset(&csi_cfg
, 0, sizeof(csi_cfg
));
257 /* Configure the CSI transmitter. Hardcode the parameters for now. */
260 csi_cfg
.clock_mode
= 0;
261 csi_cfg
.num_lanes
= 4;
262 csi_cfg
.bus_freq
= cpu_to_le32(960000000);
263 ret
= gb_hd_output(gcam
->connection
->hd
, &csi_cfg
,
265 GB_APB_REQUEST_CSI_TX_CONTROL
, false);
268 ret
= gb_hd_output(gcam
->connection
->hd
, &csi_cfg
,
270 GB_APB_REQUEST_CSI_TX_CONTROL
, false);
274 gcam_err(gcam
, "failed to %s the CSI transmitter\n",
275 nstreams
? "start" : "stop");
277 *flags
= resp
->flags
;
278 *num_streams
= resp
->num_streams
;
285 set_unipro_slow_mode
:
286 ret
= gb_svc_intf_set_power_mode(svc
, intf
->interface_id
,
287 GB_SVC_UNIPRO_HS_SERIES_A
,
288 GB_SVC_UNIPRO_SLOW_AUTO_MODE
,
290 GB_SVC_UNIPRO_SLOW_AUTO_MODE
,
294 gcam_err(gcam
, "can't take camera link to PWM-G1 auto: %d\n",
299 gb_svc_intf_set_power_mode(svc
, svc
->ap_intf_id
,
300 GB_SVC_UNIPRO_HS_SERIES_A
,
301 GB_SVC_UNIPRO_SLOW_AUTO_MODE
,
303 GB_SVC_UNIPRO_SLOW_AUTO_MODE
,
307 gcam_err(gcam
, "can't take AP link to PWM-G1 auto: %d\n",
317 static int gb_camera_capture(struct gb_camera
*gcam
, u32 request_id
,
318 unsigned int streams
, unsigned int num_frames
,
319 size_t settings_size
, const void *settings
)
321 struct gb_camera_capture_request
*req
;
325 if (settings_size
> GB_CAMERA_MAX_SETTINGS_SIZE
)
328 req_size
= sizeof(*req
) + settings_size
;
329 req
= kmalloc(req_size
, GFP_KERNEL
);
333 req
->request_id
= cpu_to_le32(request_id
);
334 req
->streams
= streams
;
336 req
->num_frames
= cpu_to_le16(num_frames
);
337 memcpy(req
->settings
, settings
, settings_size
);
339 ret
= gb_operation_sync(gcam
->connection
, GB_CAMERA_TYPE_CAPTURE
,
340 req
, req_size
, NULL
, 0);
347 static int gb_camera_flush(struct gb_camera
*gcam
, u32
*request_id
)
349 struct gb_camera_flush_response resp
;
352 ret
= gb_operation_sync(gcam
->connection
, GB_CAMERA_TYPE_FLUSH
, NULL
, 0,
353 &resp
, sizeof(resp
));
358 *request_id
= le32_to_cpu(resp
.request_id
);
363 static int gb_camera_event_recv(u8 type
, struct gb_operation
*op
)
365 struct gb_camera
*gcam
= op
->connection
->private;
366 struct gb_camera_metadata_request
*payload
;
367 struct gb_message
*request
;
369 if (type
!= GB_CAMERA_TYPE_METADATA
) {
370 gcam_err(gcam
, "Unsupported unsolicited event: %u\n", type
);
374 request
= op
->request
;
376 if (request
->payload_size
< sizeof(*payload
)) {
377 gcam_err(gcam
, "Wrong event size received (%zu < %zu)\n",
378 request
->payload_size
, sizeof(*payload
));
382 payload
= request
->payload
;
384 gcam_dbg(gcam
, "received metadata for request %u, frame %u, stream %u\n",
385 payload
->request_id
, payload
->frame_number
, payload
->stream
);
390 /* -----------------------------------------------------------------------------
391 * Interface with HOST ara camera.
393 static unsigned int gb_camera_mbus_to_gb(enum v4l2_mbus_pixelcode mbus_code
)
397 for (i
= 0; i
< ARRAY_SIZE(mbus_to_gbus_format
); i
++) {
398 if (mbus_to_gbus_format
[i
].mbus_code
== mbus_code
)
399 return mbus_to_gbus_format
[i
].gb_format
;
401 return mbus_to_gbus_format
[0].gb_format
;
404 static enum v4l2_mbus_pixelcode
gb_camera_gb_to_mbus(u16 gb_fmt
)
408 for (i
= 0; i
< ARRAY_SIZE(mbus_to_gbus_format
); i
++) {
409 if (mbus_to_gbus_format
[i
].gb_format
== gb_fmt
)
410 return mbus_to_gbus_format
[i
].mbus_code
;
412 return mbus_to_gbus_format
[0].mbus_code
;
415 static int gb_camera_op_configure_streams(void *priv
, unsigned int *nstreams
,
416 unsigned int *flags
, struct gb_camera_stream
*streams
)
418 struct gb_camera
*gcam
= priv
;
419 struct gb_camera_stream_config
*gb_streams
;
420 unsigned int gb_flags
= 0;
421 unsigned int gb_nstreams
= *nstreams
;
425 if (gb_nstreams
> GB_CAMERA_MAX_STREAMS
)
428 gb_streams
= kzalloc(gb_nstreams
* sizeof(*gb_streams
), GFP_KERNEL
);
432 for (i
= 0; i
< gb_nstreams
; i
++) {
433 gb_streams
[i
].width
= streams
[i
].width
;
434 gb_streams
[i
].height
= streams
[i
].height
;
435 gb_streams
[i
].format
=
436 gb_camera_mbus_to_gb(streams
[i
].pixel_code
);
439 if (*flags
& GB_CAMERA_IN_FLAG_TEST
)
440 gb_flags
|= GB_CAMERA_CONFIGURE_STREAMS_TEST_ONLY
;
442 ret
= gb_camera_configure_streams(gcam
, &gb_nstreams
,
443 &gb_flags
, gb_streams
);
446 if (gb_nstreams
> *nstreams
) {
452 if (gb_flags
& GB_CAMERA_CONFIGURE_STREAMS_ADJUSTED
)
453 *flags
|= GB_CAMERA_OUT_FLAG_ADJUSTED
;
455 for (i
= 0; i
< gb_nstreams
; i
++) {
456 streams
[i
].width
= gb_streams
[i
].width
;
457 streams
[i
].height
= gb_streams
[i
].height
;
458 streams
[i
].vc
= gb_streams
[i
].vc
;
459 streams
[i
].dt
[0] = gb_streams
[i
].dt
[0];
460 streams
[i
].dt
[1] = gb_streams
[i
].dt
[1];
461 streams
[i
].max_size
= gb_streams
[i
].max_size
;
462 streams
[i
].pixel_code
=
463 gb_camera_gb_to_mbus(gb_streams
[i
].format
);
465 *nstreams
= gb_nstreams
;
472 static int gb_camera_op_capture(void *priv
, u32 request_id
,
473 unsigned int streams
, unsigned int num_frames
,
474 size_t settings_size
, const void *settings
)
476 return gb_camera_capture(priv
, request_id
, streams
, num_frames
,
477 settings_size
, settings
);
480 static int gb_camera_op_flush(void *priv
, u32
*request_id
)
482 return gb_camera_flush(priv
, request_id
);
485 struct gb_camera_ops gb_cam_ops
= {
486 .configure_streams
= gb_camera_op_configure_streams
,
487 .capture
= gb_camera_op_capture
,
488 .flush
= gb_camera_op_flush
,
491 static int gb_camera_register_intf_ops(struct gb_camera
*gcam
)
493 return gb_camera_register(&gb_cam_ops
, gcam
);
496 /* -----------------------------------------------------------------------------
499 static ssize_t
gb_camera_debugfs_capabilities(struct gb_camera
*gcam
,
500 char *buf
, size_t len
)
505 static ssize_t
gb_camera_debugfs_configure_streams(struct gb_camera
*gcam
,
506 char *buf
, size_t len
)
508 struct gb_camera_debugfs_buffer
*buffer
=
509 &gcam
->debugfs
.buffers
[GB_CAMERA_DEBUGFS_BUFFER_STREAMS
];
510 struct gb_camera_stream_config
*streams
;
511 unsigned int nstreams
;
517 /* Retrieve number of streams to configure */
518 token
= strsep(&buf
, ";");
522 ret
= kstrtouint(token
, 10, &nstreams
);
526 if (nstreams
> GB_CAMERA_MAX_STREAMS
)
529 token
= strsep(&buf
, ";");
533 ret
= kstrtouint(token
, 10, &flags
);
537 /* For each stream to configure parse width, height and format */
538 streams
= kzalloc(nstreams
* sizeof(*streams
), GFP_KERNEL
);
542 for (i
= 0; i
< nstreams
; ++i
) {
543 struct gb_camera_stream_config
*stream
= &streams
[i
];
546 token
= strsep(&buf
, ";");
551 ret
= kstrtouint(token
, 10, &stream
->width
);
556 token
= strsep(&buf
, ";");
560 ret
= kstrtouint(token
, 10, &stream
->height
);
564 /* Image format code */
565 token
= strsep(&buf
, ";");
569 ret
= kstrtouint(token
, 16, &stream
->format
);
574 ret
= gb_camera_configure_streams(gcam
, &nstreams
, &flags
, streams
);
578 buffer
->length
= sprintf(buffer
->data
, "%u;%u;", nstreams
, flags
);
580 for (i
= 0; i
< nstreams
; ++i
) {
581 struct gb_camera_stream_config
*stream
= &streams
[i
];
583 buffer
->length
+= sprintf(buffer
->data
+ buffer
->length
,
584 "%u;%u;%u;%u;%u;%u;%u;",
585 stream
->width
, stream
->height
,
586 stream
->format
, stream
->vc
,
587 stream
->dt
[0], stream
->dt
[1],
598 static ssize_t
gb_camera_debugfs_capture(struct gb_camera
*gcam
,
599 char *buf
, size_t len
)
601 unsigned int request_id
;
602 unsigned int streams_mask
;
603 unsigned int num_frames
;
608 token
= strsep(&buf
, ";");
611 ret
= kstrtouint(token
, 10, &request_id
);
616 token
= strsep(&buf
, ";");
619 ret
= kstrtouint(token
, 16, &streams_mask
);
623 /* number of frames */
624 token
= strsep(&buf
, ";");
627 ret
= kstrtouint(token
, 10, &num_frames
);
631 ret
= gb_camera_capture(gcam
, request_id
, streams_mask
, num_frames
, 0,
639 static ssize_t
gb_camera_debugfs_flush(struct gb_camera
*gcam
,
640 char *buf
, size_t len
)
642 struct gb_camera_debugfs_buffer
*buffer
=
643 &gcam
->debugfs
.buffers
[GB_CAMERA_DEBUGFS_BUFFER_FLUSH
];
647 ret
= gb_camera_flush(gcam
, &req_id
);
651 buffer
->length
= sprintf(buffer
->data
, "%u", req_id
);
656 struct gb_camera_debugfs_entry
{
660 ssize_t (*execute
)(struct gb_camera
*gcam
, char *buf
, size_t len
);
663 static const struct gb_camera_debugfs_entry gb_camera_debugfs_entries
[] = {
665 .name
= "capabilities",
666 .mask
= S_IFREG
| S_IRUGO
,
667 .buffer
= GB_CAMERA_DEBUGFS_BUFFER_CAPABILITIES
,
668 .execute
= gb_camera_debugfs_capabilities
,
670 .name
= "configure_streams",
671 .mask
= S_IFREG
| S_IRUGO
| S_IWUGO
,
672 .buffer
= GB_CAMERA_DEBUGFS_BUFFER_STREAMS
,
673 .execute
= gb_camera_debugfs_configure_streams
,
676 .mask
= S_IFREG
| S_IRUGO
| S_IWUGO
,
677 .buffer
= GB_CAMERA_DEBUGFS_BUFFER_CAPTURE
,
678 .execute
= gb_camera_debugfs_capture
,
681 .mask
= S_IFREG
| S_IRUGO
| S_IWUGO
,
682 .buffer
= GB_CAMERA_DEBUGFS_BUFFER_FLUSH
,
683 .execute
= gb_camera_debugfs_flush
,
687 static ssize_t
gb_camera_debugfs_read(struct file
*file
, char __user
*buf
,
688 size_t len
, loff_t
*offset
)
690 const struct gb_camera_debugfs_entry
*op
= file
->private_data
;
691 struct gb_camera
*gcam
= file
->f_inode
->i_private
;
692 struct gb_camera_debugfs_buffer
*buffer
;
695 /* For read-only entries the operation is triggered by a read. */
696 if (!(op
->mask
& S_IWUGO
)) {
697 ret
= op
->execute(gcam
, NULL
, 0);
702 buffer
= &gcam
->debugfs
.buffers
[op
->buffer
];
704 return simple_read_from_buffer(buf
, len
, offset
, buffer
->data
,
708 static ssize_t
gb_camera_debugfs_write(struct file
*file
,
709 const char __user
*buf
, size_t len
,
712 const struct gb_camera_debugfs_entry
*op
= file
->private_data
;
713 struct gb_camera
*gcam
= file
->f_inode
->i_private
;
720 kbuf
= kmalloc(len
+ 1, GFP_KERNEL
);
724 if (copy_from_user(kbuf
, buf
, len
)) {
731 ret
= op
->execute(gcam
, kbuf
, len
);
738 static int gb_camera_debugfs_open(struct inode
*inode
, struct file
*file
)
742 for (i
= 0; i
< ARRAY_SIZE(gb_camera_debugfs_entries
); ++i
) {
743 const struct gb_camera_debugfs_entry
*entry
=
744 &gb_camera_debugfs_entries
[i
];
746 if (!strcmp(file
->f_path
.dentry
->d_iname
, entry
->name
)) {
747 file
->private_data
= (void *)entry
;
755 static const struct file_operations gb_camera_debugfs_ops
= {
756 .open
= gb_camera_debugfs_open
,
757 .read
= gb_camera_debugfs_read
,
758 .write
= gb_camera_debugfs_write
,
761 static int gb_camera_debugfs_init(struct gb_camera
*gcam
)
763 struct gb_connection
*connection
= gcam
->connection
;
768 * Create root debugfs entry and a file entry for each camera operation.
770 snprintf(dirname
, 27, "camera-%u.%u", connection
->intf
->interface_id
,
771 connection
->bundle
->id
);
773 gcam
->debugfs
.root
= debugfs_create_dir(dirname
, gb_debugfs_get());
774 if (IS_ERR(gcam
->debugfs
.root
)) {
775 gcam_err(gcam
, "debugfs root create failed (%ld)\n",
776 PTR_ERR(gcam
->debugfs
.root
));
777 return PTR_ERR(gcam
->debugfs
.root
);
780 gcam
->debugfs
.buffers
= vmalloc(sizeof(*gcam
->debugfs
.buffers
) *
781 GB_CAMERA_DEBUGFS_BUFFER_MAX
);
782 if (!gcam
->debugfs
.buffers
)
785 for (i
= 0; i
< ARRAY_SIZE(gb_camera_debugfs_entries
); ++i
) {
786 const struct gb_camera_debugfs_entry
*entry
=
787 &gb_camera_debugfs_entries
[i
];
788 struct dentry
*dentry
;
790 gcam
->debugfs
.buffers
[i
].length
= 0;
792 dentry
= debugfs_create_file(entry
->name
, entry
->mask
,
793 gcam
->debugfs
.root
, gcam
,
794 &gb_camera_debugfs_ops
);
795 if (IS_ERR(dentry
)) {
797 "debugfs operation %s create failed (%ld)\n",
798 entry
->name
, PTR_ERR(gcam
->debugfs
.root
));
799 return PTR_ERR(dentry
);
806 static void gb_camera_debugfs_cleanup(struct gb_camera
*gcam
)
808 if (gcam
->debugfs
.root
)
809 debugfs_remove_recursive(gcam
->debugfs
.root
);
811 vfree(gcam
->debugfs
.buffers
);
814 /* -----------------------------------------------------------------------------
818 static void gb_camera_cleanup(struct gb_camera
*gcam
)
820 gb_camera_debugfs_cleanup(gcam
);
822 if (gcam
->data_connected
) {
823 struct gb_interface
*intf
= gcam
->connection
->intf
;
824 struct gb_svc
*svc
= gcam
->connection
->hd
->svc
;
826 gb_svc_connection_destroy(svc
, intf
->interface_id
,
827 ES2_APB_CDSI0_CPORT
, svc
->ap_intf_id
,
828 ES2_APB_CDSI1_CPORT
);
834 static int gb_camera_connection_init(struct gb_connection
*connection
)
836 struct gb_svc
*svc
= connection
->hd
->svc
;
837 struct gb_camera
*gcam
;
840 gcam
= kzalloc(sizeof(*gcam
), GFP_KERNEL
);
844 gcam
->connection
= connection
;
845 connection
->private = gcam
;
848 * Create the data connection between camera module CDSI0 and APB CDS1.
849 * The CPort IDs are hardcoded by the ES2 bridges.
851 ret
= gb_svc_connection_create(svc
, connection
->intf
->interface_id
,
852 ES2_APB_CDSI0_CPORT
, svc
->ap_intf_id
,
853 ES2_APB_CDSI1_CPORT
, false);
857 gcam
->data_connected
= true;
859 ret
= gb_camera_debugfs_init(gcam
);
863 ret
= gb_camera_register_intf_ops(gcam
);
870 gb_camera_cleanup(gcam
);
874 static void gb_camera_connection_exit(struct gb_connection
*connection
)
876 struct gb_camera
*gcam
= connection
->private;
878 gb_camera_cleanup(gcam
);
881 static struct gb_protocol camera_protocol
= {
883 .id
= GREYBUS_PROTOCOL_CAMERA_MGMT
,
884 .major
= GB_CAMERA_VERSION_MAJOR
,
885 .minor
= GB_CAMERA_VERSION_MINOR
,
886 .connection_init
= gb_camera_connection_init
,
887 .connection_exit
= gb_camera_connection_exit
,
888 .request_recv
= gb_camera_event_recv
,
891 gb_protocol_driver(&camera_protocol
);
893 MODULE_LICENSE("GPL v2");