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_YUYV8_1_5X8,
77 .mbus_code = V4L2_MBUS_FMT_YVYU8_1_5X8,
81 .mbus_code = V4L2_MBUS_FMT_JPEG_1X8,
86 #define ES2_APB_CDSI0_CPORT 16
87 #define ES2_APB_CDSI1_CPORT 17
89 #define GB_CAMERA_MAX_SETTINGS_SIZE 8192
91 #define gcam_dbg(gcam, format...) \
92 dev_dbg(&gcam->connection->bundle->dev, format)
93 #define gcam_info(gcam, format...) \
94 dev_info(&gcam->connection->bundle->dev, format)
95 #define gcam_err(gcam, format...) \
96 dev_err(&gcam->connection->bundle->dev, format)
98 /* -----------------------------------------------------------------------------
99 * Camera Protocol Operations
102 struct ap_csi_config_request {
110 static int gb_camera_configure_streams(struct gb_camera *gcam,
111 unsigned int *num_streams,
113 struct gb_camera_stream_config *streams)
115 struct gb_camera_configure_streams_request *req;
116 struct gb_camera_configure_streams_response *resp;
117 struct ap_csi_config_request csi_cfg;
118 unsigned int nstreams = *num_streams;
124 if (nstreams > GB_CAMERA_MAX_STREAMS)
127 req_size = sizeof(*req) + nstreams * sizeof(req->config[0]);
128 resp_size = sizeof(*resp) + nstreams * sizeof(resp->config[0]);
130 req = kmalloc(req_size, GFP_KERNEL);
131 resp = kmalloc(resp_size, GFP_KERNEL);
137 req->num_streams = nstreams;
141 for (i = 0; i < nstreams; ++i) {
142 struct gb_camera_stream_config_request *cfg = &req->config[i];
144 cfg->width = cpu_to_le16(streams[i].width);
145 cfg->height = cpu_to_le16(streams[i].height);
146 cfg->format = cpu_to_le16(streams[i].format);
150 ret = gb_operation_sync(gcam->connection,
151 GB_CAMERA_TYPE_CONFIGURE_STREAMS,
152 req, req_size, resp, resp_size);
156 if (resp->num_streams > nstreams) {
157 gcam_dbg(gcam, "got #streams %u > request %u\n",
158 resp->num_streams, nstreams);
163 if (resp->padding != 0) {
164 gcam_dbg(gcam, "response padding != 0");
169 *flags = resp->flags;
171 for (i = 0; i < nstreams; ++i) {
172 struct gb_camera_stream_config_response *cfg = &resp->config[i];
174 streams[i].width = le16_to_cpu(cfg->width);
175 streams[i].height = le16_to_cpu(cfg->height);
176 streams[i].format = le16_to_cpu(cfg->format);
177 streams[i].vc = cfg->virtual_channel;
178 streams[i].dt[0] = cfg->data_type[0];
179 streams[i].dt[1] = cfg->data_type[1];
180 streams[i].max_size = le32_to_cpu(cfg->max_size);
182 if (cfg->padding[0] || cfg->padding[1] || cfg->padding[2]) {
183 gcam_dbg(gcam, "stream #%u padding != 0", i);
189 memset(&csi_cfg, 0, sizeof(csi_cfg));
191 /* Configure the CSI transmitter. Hardcode the parameters for now. */
192 if (nstreams && !(resp->flags & GB_CAMERA_CONFIGURE_STREAMS_ADJUSTED)) {
194 csi_cfg.clock_mode = 0;
195 csi_cfg.num_lanes = 4;
196 csi_cfg.bus_freq = cpu_to_le32(960000000);
197 ret = gb_hd_output(gcam->connection->hd, &csi_cfg,
199 GB_APB_REQUEST_CSI_TX_CONTROL, false);
200 } else if (nstreams == 0) {
202 ret = gb_hd_output(gcam->connection->hd, &csi_cfg,
204 GB_APB_REQUEST_CSI_TX_CONTROL, false);
208 gcam_err(gcam, "failed to %s the CSI transmitter\n",
209 nstreams ? "start" : "stop");
211 *num_streams = resp->num_streams;
220 static int gb_camera_capture(struct gb_camera *gcam, u32 request_id,
221 unsigned int streams, unsigned int num_frames,
222 size_t settings_size, const void *settings)
224 struct gb_camera_capture_request *req;
228 if (settings_size > GB_CAMERA_MAX_SETTINGS_SIZE)
231 req_size = sizeof(*req) + settings_size;
232 req = kmalloc(req_size, GFP_KERNEL);
236 req->request_id = cpu_to_le32(request_id);
237 req->streams = streams;
239 req->num_frames = cpu_to_le16(num_frames);
240 memcpy(req->settings, settings, settings_size);
242 ret = gb_operation_sync(gcam->connection, GB_CAMERA_TYPE_CAPTURE,
243 req, req_size, NULL, 0);
250 static int gb_camera_flush(struct gb_camera *gcam, u32 *request_id)
252 struct gb_camera_flush_response resp;
255 ret = gb_operation_sync(gcam->connection, GB_CAMERA_TYPE_FLUSH, NULL, 0,
256 &resp, sizeof(resp));
261 *request_id = le32_to_cpu(resp.request_id);
266 static int gb_camera_event_recv(u8 type, struct gb_operation *op)
268 struct gb_camera *gcam = op->connection->private;
269 struct gb_camera_metadata_request *payload;
270 struct gb_message *request;
272 if (type != GB_CAMERA_TYPE_METADATA) {
273 gcam_err(gcam, "Unsupported unsolicited event: %u\n", type);
277 request = op->request;
279 if (request->payload_size < sizeof(*payload)) {
280 gcam_err(gcam, "Wrong event size received (%zu < %zu)\n",
281 request->payload_size, sizeof(*payload));
285 payload = request->payload;
287 gcam_dbg(gcam, "received metadata for request %u, frame %u, stream %u\n",
288 payload->request_id, payload->frame_number, payload->stream);
293 /* -----------------------------------------------------------------------------
294 * Interface with HOST ara camera.
296 static unsigned int gb_camera_mbus_to_gb(enum v4l2_mbus_pixelcode mbus_code)
300 for (i = 0; i < ARRAY_SIZE(mbus_to_gbus_format); i++) {
301 if (mbus_to_gbus_format[i].mbus_code == mbus_code)
302 return mbus_to_gbus_format[i].gb_format;
304 return mbus_to_gbus_format[0].gb_format;
307 static enum v4l2_mbus_pixelcode gb_camera_gb_to_mbus(u16 gb_fmt)
311 for (i = 0; i < ARRAY_SIZE(mbus_to_gbus_format); i++) {
312 if (mbus_to_gbus_format[i].gb_format == gb_fmt)
313 return mbus_to_gbus_format[i].mbus_code;
315 return mbus_to_gbus_format[0].mbus_code;
318 static int gb_camera_op_configure_streams(void *priv, unsigned int *nstreams,
319 unsigned int *flags, struct gb_camera_stream *streams)
321 struct gb_camera *gcam = priv;
322 struct gb_camera_stream_config *gb_streams;
323 unsigned int gb_flags = 0;
324 unsigned int gb_nstreams = *nstreams;
328 if (gb_nstreams > GB_CAMERA_MAX_STREAMS)
331 gb_streams = kzalloc(gb_nstreams * sizeof(*gb_streams), GFP_KERNEL);
335 for (i = 0; i < gb_nstreams; i++) {
336 gb_streams[i].width = streams[i].width;
337 gb_streams[i].height = streams[i].height;
338 gb_streams[i].format =
339 gb_camera_mbus_to_gb(streams[i].pixel_code);
342 if (*flags & GB_CAMERA_IN_FLAG_TEST)
343 gb_flags |= GB_CAMERA_CONFIGURE_STREAMS_TEST_ONLY;
345 ret = gb_camera_configure_streams(gcam, &gb_nstreams,
346 &gb_flags, gb_streams);
349 if (gb_nstreams > *nstreams) {
355 if (gb_flags & GB_CAMERA_CONFIGURE_STREAMS_ADJUSTED)
356 *flags |= GB_CAMERA_OUT_FLAG_ADJUSTED;
358 for (i = 0; i < gb_nstreams; i++) {
359 streams[i].width = gb_streams[i].width;
360 streams[i].height = gb_streams[i].height;
361 streams[i].vc = gb_streams[i].vc;
362 streams[i].dt[0] = gb_streams[i].dt[0];
363 streams[i].dt[1] = gb_streams[i].dt[1];
364 streams[i].max_size = gb_streams[i].max_size;
365 streams[i].pixel_code =
366 gb_camera_gb_to_mbus(gb_streams[i].format);
368 *nstreams = gb_nstreams;
375 static int gb_camera_op_capture(void *priv, u32 request_id,
376 unsigned int streams, unsigned int num_frames,
377 size_t settings_size, const void *settings)
379 return gb_camera_capture(priv, request_id, streams, num_frames,
380 settings_size, settings);
383 static int gb_camera_op_flush(void *priv, u32 *request_id)
385 return gb_camera_flush(priv, request_id);
388 struct gb_camera_ops gb_cam_ops = {
389 .configure_streams = gb_camera_op_configure_streams,
390 .capture = gb_camera_op_capture,
391 .flush = gb_camera_op_flush,
394 static int gb_camera_register_intf_ops(struct gb_camera *gcam)
396 return gb_camera_register(&gb_cam_ops, gcam);
399 /* -----------------------------------------------------------------------------
402 static ssize_t gb_camera_debugfs_capabilities(struct gb_camera *gcam,
403 char *buf, size_t len)
408 static ssize_t gb_camera_debugfs_configure_streams(struct gb_camera *gcam,
409 char *buf, size_t len)
411 struct gb_camera_debugfs_buffer *buffer =
412 &gcam->debugfs.buffers[GB_CAMERA_DEBUGFS_BUFFER_STREAMS];
413 struct gb_camera_stream_config *streams;
414 unsigned int nstreams;
420 /* Retrieve number of streams to configure */
421 token = strsep(&buf, ";");
425 ret = kstrtouint(token, 10, &nstreams);
429 if (nstreams > GB_CAMERA_MAX_STREAMS)
432 token = strsep(&buf, ";");
436 ret = kstrtouint(token, 10, &flags);
440 /* For each stream to configure parse width, height and format */
441 streams = kzalloc(nstreams * sizeof(*streams), GFP_KERNEL);
445 for (i = 0; i < nstreams; ++i) {
446 struct gb_camera_stream_config *stream = &streams[i];
449 token = strsep(&buf, ";");
454 ret = kstrtouint(token, 10, &stream->width);
459 token = strsep(&buf, ";");
463 ret = kstrtouint(token, 10, &stream->height);
467 /* Image format code */
468 token = strsep(&buf, ";");
472 ret = kstrtouint(token, 16, &stream->format);
477 ret = gb_camera_configure_streams(gcam, &nstreams, &flags, streams);
481 buffer->length = sprintf(buffer->data, "%u;%u;", nstreams, flags);
483 for (i = 0; i < nstreams; ++i) {
484 struct gb_camera_stream_config *stream = &streams[i];
486 buffer->length += sprintf(buffer->data + buffer->length,
487 "%u;%u;%u;%u;%u;%u;%u;",
488 stream->width, stream->height,
489 stream->format, stream->vc,
490 stream->dt[0], stream->dt[1],
501 static ssize_t gb_camera_debugfs_capture(struct gb_camera *gcam,
502 char *buf, size_t len)
504 unsigned int request_id;
505 unsigned int streams_mask;
506 unsigned int num_frames;
511 token = strsep(&buf, ";");
514 ret = kstrtouint(token, 10, &request_id);
519 token = strsep(&buf, ";");
522 ret = kstrtouint(token, 16, &streams_mask);
526 /* number of frames */
527 token = strsep(&buf, ";");
530 ret = kstrtouint(token, 10, &num_frames);
534 ret = gb_camera_capture(gcam, request_id, streams_mask, num_frames, 0,
542 static ssize_t gb_camera_debugfs_flush(struct gb_camera *gcam,
543 char *buf, size_t len)
545 struct gb_camera_debugfs_buffer *buffer =
546 &gcam->debugfs.buffers[GB_CAMERA_DEBUGFS_BUFFER_FLUSH];
550 ret = gb_camera_flush(gcam, &req_id);
554 buffer->length = sprintf(buffer->data, "%u", req_id);
559 struct gb_camera_debugfs_entry {
563 ssize_t (*execute)(struct gb_camera *gcam, char *buf, size_t len);
566 static const struct gb_camera_debugfs_entry gb_camera_debugfs_entries[] = {
568 .name = "capabilities",
569 .mask = S_IFREG | S_IRUGO,
570 .buffer = GB_CAMERA_DEBUGFS_BUFFER_CAPABILITIES,
571 .execute = gb_camera_debugfs_capabilities,
573 .name = "configure_streams",
574 .mask = S_IFREG | S_IRUGO | S_IWUGO,
575 .buffer = GB_CAMERA_DEBUGFS_BUFFER_STREAMS,
576 .execute = gb_camera_debugfs_configure_streams,
579 .mask = S_IFREG | S_IRUGO | S_IWUGO,
580 .buffer = GB_CAMERA_DEBUGFS_BUFFER_CAPTURE,
581 .execute = gb_camera_debugfs_capture,
584 .mask = S_IFREG | S_IRUGO | S_IWUGO,
585 .buffer = GB_CAMERA_DEBUGFS_BUFFER_FLUSH,
586 .execute = gb_camera_debugfs_flush,
590 static ssize_t gb_camera_debugfs_read(struct file *file, char __user *buf,
591 size_t len, loff_t *offset)
593 const struct gb_camera_debugfs_entry *op = file->private_data;
594 struct gb_camera *gcam = file->f_inode->i_private;
595 struct gb_camera_debugfs_buffer *buffer;
598 /* For read-only entries the operation is triggered by a read. */
599 if (!(op->mask & S_IWUGO)) {
600 ret = op->execute(gcam, NULL, 0);
605 buffer = &gcam->debugfs.buffers[op->buffer];
607 return simple_read_from_buffer(buf, len, offset, buffer->data,
611 static ssize_t gb_camera_debugfs_write(struct file *file,
612 const char __user *buf, size_t len,
615 const struct gb_camera_debugfs_entry *op = file->private_data;
616 struct gb_camera *gcam = file->f_inode->i_private;
623 kbuf = kmalloc(len + 1, GFP_KERNEL);
627 if (copy_from_user(kbuf, buf, len)) {
634 ret = op->execute(gcam, kbuf, len);
641 static int gb_camera_debugfs_open(struct inode *inode, struct file *file)
645 for (i = 0; i < ARRAY_SIZE(gb_camera_debugfs_entries); ++i) {
646 const struct gb_camera_debugfs_entry *entry =
647 &gb_camera_debugfs_entries[i];
649 if (!strcmp(file->f_path.dentry->d_iname, entry->name)) {
650 file->private_data = (void *)entry;
658 static const struct file_operations gb_camera_debugfs_ops = {
659 .open = gb_camera_debugfs_open,
660 .read = gb_camera_debugfs_read,
661 .write = gb_camera_debugfs_write,
664 static int gb_camera_debugfs_init(struct gb_camera *gcam)
666 struct gb_connection *connection = gcam->connection;
671 * Create root debugfs entry and a file entry for each camera operation.
673 snprintf(dirname, 27, "camera-%u.%u", connection->intf->interface_id,
674 connection->bundle->id);
676 gcam->debugfs.root = debugfs_create_dir(dirname, gb_debugfs_get());
677 if (IS_ERR(gcam->debugfs.root)) {
678 gcam_err(gcam, "debugfs root create failed (%ld)\n",
679 PTR_ERR(gcam->debugfs.root));
680 return PTR_ERR(gcam->debugfs.root);
683 gcam->debugfs.buffers = vmalloc(sizeof(*gcam->debugfs.buffers) *
684 GB_CAMERA_DEBUGFS_BUFFER_MAX);
685 if (!gcam->debugfs.buffers)
688 for (i = 0; i < ARRAY_SIZE(gb_camera_debugfs_entries); ++i) {
689 const struct gb_camera_debugfs_entry *entry =
690 &gb_camera_debugfs_entries[i];
691 struct dentry *dentry;
693 gcam->debugfs.buffers[i].length = 0;
695 dentry = debugfs_create_file(entry->name, entry->mask,
696 gcam->debugfs.root, gcam,
697 &gb_camera_debugfs_ops);
698 if (IS_ERR(dentry)) {
700 "debugfs operation %s create failed (%ld)\n",
701 entry->name, PTR_ERR(gcam->debugfs.root));
702 return PTR_ERR(dentry);
709 static void gb_camera_debugfs_cleanup(struct gb_camera *gcam)
711 if (gcam->debugfs.root)
712 debugfs_remove_recursive(gcam->debugfs.root);
714 vfree(gcam->debugfs.buffers);
717 /* -----------------------------------------------------------------------------
721 static void gb_camera_cleanup(struct gb_camera *gcam)
723 gb_camera_debugfs_cleanup(gcam);
725 if (gcam->data_connected) {
726 struct gb_interface *intf = gcam->connection->intf;
727 struct gb_svc *svc = gcam->connection->hd->svc;
729 gb_svc_connection_destroy(svc, intf->interface_id,
730 ES2_APB_CDSI0_CPORT, svc->ap_intf_id,
731 ES2_APB_CDSI1_CPORT);
737 static int gb_camera_connection_init(struct gb_connection *connection)
739 struct gb_svc *svc = connection->hd->svc;
740 struct gb_camera *gcam;
743 gcam = kzalloc(sizeof(*gcam), GFP_KERNEL);
747 gcam->connection = connection;
748 connection->private = gcam;
751 * Create the data connection between camera module CDSI0 and APB CDS1.
752 * The CPort IDs are hardcoded by the ES2 bridges.
754 ret = gb_svc_connection_create(svc, connection->intf->interface_id,
755 ES2_APB_CDSI0_CPORT, svc->ap_intf_id,
756 ES2_APB_CDSI1_CPORT, false);
760 gcam->data_connected = true;
762 ret = gb_svc_intf_set_power_mode(svc, connection->intf->interface_id,
763 GB_SVC_UNIPRO_HS_SERIES_A,
764 GB_SVC_UNIPRO_FAST_MODE, 2, 2,
765 GB_SVC_UNIPRO_FAST_MODE, 2, 2,
766 GB_SVC_PWRM_RXTERMINATION |
767 GB_SVC_PWRM_TXTERMINATION, 0);
771 ret = gb_svc_intf_set_power_mode(svc, svc->ap_intf_id,
772 GB_SVC_UNIPRO_HS_SERIES_A,
773 GB_SVC_UNIPRO_FAST_MODE, 2, 2,
774 GB_SVC_UNIPRO_FAST_MODE, 2, 2,
775 GB_SVC_PWRM_RXTERMINATION |
776 GB_SVC_PWRM_TXTERMINATION, 0);
780 ret = gb_camera_debugfs_init(gcam);
784 ret = gb_camera_register_intf_ops(gcam);
791 gb_camera_cleanup(gcam);
795 static void gb_camera_connection_exit(struct gb_connection *connection)
797 struct gb_camera *gcam = connection->private;
799 gb_camera_cleanup(gcam);
802 static struct gb_protocol camera_protocol = {
804 .id = GREYBUS_PROTOCOL_CAMERA_MGMT,
805 .major = GB_CAMERA_VERSION_MAJOR,
806 .minor = GB_CAMERA_VERSION_MINOR,
807 .connection_init = gb_camera_connection_init,
808 .connection_exit = gb_camera_connection_exit,
809 .request_recv = gb_camera_event_recv,
812 gb_protocol_driver(&camera_protocol);
814 MODULE_LICENSE("GPL v2");