]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blob - drivers/staging/greybus/camera.c
greybus: camera: Add missing return value
[mirror_ubuntu-bionic-kernel.git] / drivers / staging / greybus / camera.c
1 /*
2 * Greybus Camera protocol driver.
3 *
4 * Copyright 2015 Google Inc.
5 * Copyright 2015 Linaro Ltd.
6 *
7 * Released under the GPLv2 only.
8 */
9
10 #include <linux/debugfs.h>
11 #include <linux/fs.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>
18
19 #include "gb-camera.h"
20 #include "greybus.h"
21 #include "greybus_protocols.h"
22
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,
29 };
30
31 struct gb_camera_debugfs_buffer {
32 char data[PAGE_SIZE];
33 size_t length;
34 };
35
36 /**
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
41 */
42 struct gb_camera {
43 struct gb_connection *connection;
44 bool data_connected;
45
46 struct {
47 struct dentry *root;
48 struct gb_camera_debugfs_buffer *buffers;
49 } debugfs;
50 };
51
52 struct gb_camera_stream_config {
53 unsigned int width;
54 unsigned int height;
55 unsigned int format;
56 unsigned int vc;
57 unsigned int dt[2];
58 unsigned int max_size;
59 };
60
61 struct gb_camera_fmt_map {
62 enum v4l2_mbus_pixelcode mbus_code;
63 unsigned int gb_format;
64 };
65
66 /* GB format to media code map */
67 static const struct gb_camera_fmt_map mbus_to_gbus_format[] = {
68 {
69 .mbus_code = V4L2_MBUS_FMT_UYVY8_1X16,
70 .gb_format = 0x01,
71 },
72 {
73 .mbus_code = V4L2_MBUS_FMT_NV12_1x8,
74 .gb_format = 0x12,
75 },
76 {
77 .mbus_code = V4L2_MBUS_FMT_NV21_1x8,
78 .gb_format = 0x13,
79 },
80 {
81 .mbus_code = V4L2_MBUS_FMT_YU12_1x8,
82 .gb_format = 0x16,
83 },
84 {
85 .mbus_code = V4L2_MBUS_FMT_YV12_1x8,
86 .gb_format = 0x17,
87 },
88 {
89 .mbus_code = V4L2_MBUS_FMT_JPEG_1X8,
90 .gb_format = 0x40,
91 }
92 };
93
94 #define ES2_APB_CDSI0_CPORT 16
95 #define ES2_APB_CDSI1_CPORT 17
96
97 #define GB_CAMERA_MAX_SETTINGS_SIZE 8192
98
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)
105
106 /* -----------------------------------------------------------------------------
107 * Camera Protocol Operations
108 */
109
110 struct ap_csi_config_request {
111 __u8 csi_id;
112 __u8 clock_mode;
113 __u8 num_lanes;
114 __u8 padding;
115 __le32 bus_freq;
116 } __packed;
117
118 static int gb_camera_configure_streams(struct gb_camera *gcam,
119 unsigned int *num_streams,
120 unsigned int *flags,
121 struct gb_camera_stream_config *streams)
122 {
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;
128
129 unsigned int nstreams = *num_streams;
130 unsigned int i;
131 size_t req_size;
132 size_t resp_size;
133 int ret;
134
135 if (nstreams > GB_CAMERA_MAX_STREAMS)
136 return -EINVAL;
137
138 req_size = sizeof(*req) + nstreams * sizeof(req->config[0]);
139 resp_size = sizeof(*resp) + nstreams * sizeof(resp->config[0]);
140
141 req = kmalloc(req_size, GFP_KERNEL);
142 resp = kmalloc(resp_size, GFP_KERNEL);
143 if (!req || !resp) {
144 ret = -ENOMEM;
145 goto done;
146 }
147
148 /*
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
152 */
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);
160 if (ret < 0)
161 goto done;
162
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);
169 if (ret < 0)
170 goto done;
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,
175 1, 2,
176 GB_SVC_UNIPRO_SLOW_AUTO_MODE,
177 1, 2,
178 0, 0);
179 if (ret < 0) {
180 gcam_err(gcam, "can't take camera link to PWM-G1 auto: %d\n",
181 ret);
182 goto done;
183 }
184
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,
188 1, 2,
189 GB_SVC_UNIPRO_SLOW_AUTO_MODE,
190 1, 2,
191 0, 0);
192 if (ret < 0) {
193 gcam_err(gcam, "can't take AP link to PWM-G1 auto: %d\n",
194 ret);
195 goto done;
196 }
197 }
198
199 req->num_streams = nstreams;
200 req->flags = *flags;
201 req->padding = 0;
202
203 for (i = 0; i < nstreams; ++i) {
204 struct gb_camera_stream_config_request *cfg = &req->config[i];
205
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);
209 cfg->padding = 0;
210 }
211
212 ret = gb_operation_sync(gcam->connection,
213 GB_CAMERA_TYPE_CONFIGURE_STREAMS,
214 req, req_size, resp, resp_size);
215 if (ret < 0)
216 goto set_unipro_slow_mode;
217
218 if (resp->num_streams > nstreams) {
219 gcam_dbg(gcam, "got #streams %u > request %u\n",
220 resp->num_streams, nstreams);
221 ret = -EIO;
222 goto set_unipro_slow_mode;
223 }
224
225 if (resp->padding != 0) {
226 gcam_dbg(gcam, "response padding != 0");
227 ret = -EIO;
228 goto set_unipro_slow_mode;
229 }
230
231 for (i = 0; i < nstreams; ++i) {
232 struct gb_camera_stream_config_response *cfg = &resp->config[i];
233
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);
241
242 if (cfg->padding[0] || cfg->padding[1] || cfg->padding[2]) {
243 gcam_dbg(gcam, "stream #%u padding != 0", i);
244 ret = -EIO;
245 goto set_unipro_slow_mode;
246 }
247 }
248
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;
253 }
254
255 memset(&csi_cfg, 0, sizeof(csi_cfg));
256
257 /* Configure the CSI transmitter. Hardcode the parameters for now. */
258 if (nstreams) {
259 csi_cfg.csi_id = 1;
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,
264 sizeof(csi_cfg),
265 GB_APB_REQUEST_CSI_TX_CONTROL, false);
266 } else {
267 csi_cfg.csi_id = 1;
268 ret = gb_hd_output(gcam->connection->hd, &csi_cfg,
269 sizeof(csi_cfg),
270 GB_APB_REQUEST_CSI_TX_CONTROL, false);
271 }
272
273 if (ret < 0)
274 gcam_err(gcam, "failed to %s the CSI transmitter\n",
275 nstreams ? "start" : "stop");
276
277 *flags = resp->flags;
278 *num_streams = resp->num_streams;
279 ret = 0;
280
281 kfree(req);
282 kfree(resp);
283 return ret;
284
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,
289 1, 2,
290 GB_SVC_UNIPRO_SLOW_AUTO_MODE,
291 1, 2,
292 0, 0);
293 if (ret < 0) {
294 gcam_err(gcam, "can't take camera link to PWM-G1 auto: %d\n",
295 ret);
296 goto done;
297 }
298
299 ret = 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,
302 1, 2,
303 GB_SVC_UNIPRO_SLOW_AUTO_MODE,
304 1, 2,
305 0, 0);
306 if (ret < 0)
307 gcam_err(gcam, "can't take AP link to PWM-G1 auto: %d\n",
308 ret);
309
310 done:
311 kfree(req);
312 kfree(resp);
313 return ret;
314 }
315
316 static int gb_camera_capture(struct gb_camera *gcam, u32 request_id,
317 unsigned int streams, unsigned int num_frames,
318 size_t settings_size, const void *settings)
319 {
320 struct gb_camera_capture_request *req;
321 size_t req_size;
322 int ret;
323
324 if (settings_size > GB_CAMERA_MAX_SETTINGS_SIZE)
325 return -EINVAL;
326
327 req_size = sizeof(*req) + settings_size;
328 req = kmalloc(req_size, GFP_KERNEL);
329 if (!req)
330 return -ENOMEM;
331
332 req->request_id = cpu_to_le32(request_id);
333 req->streams = streams;
334 req->padding = 0;
335 req->num_frames = cpu_to_le16(num_frames);
336 memcpy(req->settings, settings, settings_size);
337
338 ret = gb_operation_sync(gcam->connection, GB_CAMERA_TYPE_CAPTURE,
339 req, req_size, NULL, 0);
340
341 kfree(req);
342
343 return ret;
344 }
345
346 static int gb_camera_flush(struct gb_camera *gcam, u32 *request_id)
347 {
348 struct gb_camera_flush_response resp;
349 int ret;
350
351 ret = gb_operation_sync(gcam->connection, GB_CAMERA_TYPE_FLUSH, NULL, 0,
352 &resp, sizeof(resp));
353 if (ret < 0)
354 return ret;
355
356 if (request_id)
357 *request_id = le32_to_cpu(resp.request_id);
358
359 return 0;
360 }
361
362 static int gb_camera_event_recv(u8 type, struct gb_operation *op)
363 {
364 struct gb_camera *gcam = op->connection->private;
365 struct gb_camera_metadata_request *payload;
366 struct gb_message *request;
367
368 if (type != GB_CAMERA_TYPE_METADATA) {
369 gcam_err(gcam, "Unsupported unsolicited event: %u\n", type);
370 return -EINVAL;
371 }
372
373 request = op->request;
374
375 if (request->payload_size < sizeof(*payload)) {
376 gcam_err(gcam, "Wrong event size received (%zu < %zu)\n",
377 request->payload_size, sizeof(*payload));
378 return -EINVAL;
379 }
380
381 payload = request->payload;
382
383 gcam_dbg(gcam, "received metadata for request %u, frame %u, stream %u\n",
384 payload->request_id, payload->frame_number, payload->stream);
385
386 return 0;
387 }
388
389 /* -----------------------------------------------------------------------------
390 * Interface with HOST ara camera.
391 */
392 static unsigned int gb_camera_mbus_to_gb(enum v4l2_mbus_pixelcode mbus_code)
393 {
394 unsigned int i;
395
396 for (i = 0; i < ARRAY_SIZE(mbus_to_gbus_format); i++) {
397 if (mbus_to_gbus_format[i].mbus_code == mbus_code)
398 return mbus_to_gbus_format[i].gb_format;
399 }
400 return mbus_to_gbus_format[0].gb_format;
401 }
402
403 static enum v4l2_mbus_pixelcode gb_camera_gb_to_mbus(u16 gb_fmt)
404 {
405 unsigned int i;
406
407 for (i = 0; i < ARRAY_SIZE(mbus_to_gbus_format); i++) {
408 if (mbus_to_gbus_format[i].gb_format == gb_fmt)
409 return mbus_to_gbus_format[i].mbus_code;
410 }
411 return mbus_to_gbus_format[0].mbus_code;
412 }
413
414 static int gb_camera_op_configure_streams(void *priv, unsigned int *nstreams,
415 unsigned int *flags, struct gb_camera_stream *streams)
416 {
417 struct gb_camera *gcam = priv;
418 struct gb_camera_stream_config *gb_streams;
419 unsigned int gb_flags = 0;
420 unsigned int gb_nstreams = *nstreams;
421 unsigned int i;
422 int ret;
423
424 if (gb_nstreams > GB_CAMERA_MAX_STREAMS)
425 return -EINVAL;
426
427 gb_streams = kzalloc(gb_nstreams * sizeof(*gb_streams), GFP_KERNEL);
428 if (!gb_streams)
429 return -ENOMEM;
430
431 for (i = 0; i < gb_nstreams; i++) {
432 gb_streams[i].width = streams[i].width;
433 gb_streams[i].height = streams[i].height;
434 gb_streams[i].format =
435 gb_camera_mbus_to_gb(streams[i].pixel_code);
436 }
437
438 if (*flags & GB_CAMERA_IN_FLAG_TEST)
439 gb_flags |= GB_CAMERA_CONFIGURE_STREAMS_TEST_ONLY;
440
441 ret = gb_camera_configure_streams(gcam, &gb_nstreams,
442 &gb_flags, gb_streams);
443 if (ret < 0)
444 goto done;
445 if (gb_nstreams > *nstreams) {
446 ret = -EINVAL;
447 goto done;
448 }
449
450 *flags = 0;
451 if (gb_flags & GB_CAMERA_CONFIGURE_STREAMS_ADJUSTED)
452 *flags |= GB_CAMERA_OUT_FLAG_ADJUSTED;
453
454 for (i = 0; i < gb_nstreams; i++) {
455 streams[i].width = gb_streams[i].width;
456 streams[i].height = gb_streams[i].height;
457 streams[i].vc = gb_streams[i].vc;
458 streams[i].dt[0] = gb_streams[i].dt[0];
459 streams[i].dt[1] = gb_streams[i].dt[1];
460 streams[i].max_size = gb_streams[i].max_size;
461 streams[i].pixel_code =
462 gb_camera_gb_to_mbus(gb_streams[i].format);
463 }
464 *nstreams = gb_nstreams;
465
466 done:
467 kfree(gb_streams);
468 return ret;
469 }
470
471 static int gb_camera_op_capture(void *priv, u32 request_id,
472 unsigned int streams, unsigned int num_frames,
473 size_t settings_size, const void *settings)
474 {
475 return gb_camera_capture(priv, request_id, streams, num_frames,
476 settings_size, settings);
477 }
478
479 static int gb_camera_op_flush(void *priv, u32 *request_id)
480 {
481 return gb_camera_flush(priv, request_id);
482 }
483
484 struct gb_camera_ops gb_cam_ops = {
485 .configure_streams = gb_camera_op_configure_streams,
486 .capture = gb_camera_op_capture,
487 .flush = gb_camera_op_flush,
488 };
489
490 static int gb_camera_register_intf_ops(struct gb_camera *gcam)
491 {
492 return gb_camera_register(&gb_cam_ops, gcam);
493 }
494
495 /* -----------------------------------------------------------------------------
496 * DebugFS
497 */
498 static ssize_t gb_camera_debugfs_capabilities(struct gb_camera *gcam,
499 char *buf, size_t len)
500 {
501 return len;
502 }
503
504 static ssize_t gb_camera_debugfs_configure_streams(struct gb_camera *gcam,
505 char *buf, size_t len)
506 {
507 struct gb_camera_debugfs_buffer *buffer =
508 &gcam->debugfs.buffers[GB_CAMERA_DEBUGFS_BUFFER_STREAMS];
509 struct gb_camera_stream_config *streams;
510 unsigned int nstreams;
511 unsigned int flags;
512 unsigned int i;
513 char *token;
514 int ret;
515
516 /* Retrieve number of streams to configure */
517 token = strsep(&buf, ";");
518 if (token == NULL)
519 return -EINVAL;
520
521 ret = kstrtouint(token, 10, &nstreams);
522 if (ret < 0)
523 return ret;
524
525 if (nstreams > GB_CAMERA_MAX_STREAMS)
526 return -EINVAL;
527
528 token = strsep(&buf, ";");
529 if (token == NULL)
530 return -EINVAL;
531
532 ret = kstrtouint(token, 10, &flags);
533 if (ret < 0)
534 return ret;
535
536 /* For each stream to configure parse width, height and format */
537 streams = kzalloc(nstreams * sizeof(*streams), GFP_KERNEL);
538 if (!streams)
539 return -ENOMEM;
540
541 for (i = 0; i < nstreams; ++i) {
542 struct gb_camera_stream_config *stream = &streams[i];
543
544 /* width */
545 token = strsep(&buf, ";");
546 if (token == NULL) {
547 ret = -EINVAL;
548 goto done;
549 }
550 ret = kstrtouint(token, 10, &stream->width);
551 if (ret < 0)
552 goto done;
553
554 /* height */
555 token = strsep(&buf, ";");
556 if (token == NULL)
557 goto done;
558
559 ret = kstrtouint(token, 10, &stream->height);
560 if (ret < 0)
561 goto done;
562
563 /* Image format code */
564 token = strsep(&buf, ";");
565 if (token == NULL)
566 goto done;
567
568 ret = kstrtouint(token, 16, &stream->format);
569 if (ret < 0)
570 goto done;
571 }
572
573 ret = gb_camera_configure_streams(gcam, &nstreams, &flags, streams);
574 if (ret < 0)
575 goto done;
576
577 buffer->length = sprintf(buffer->data, "%u;%u;", nstreams, flags);
578
579 for (i = 0; i < nstreams; ++i) {
580 struct gb_camera_stream_config *stream = &streams[i];
581
582 buffer->length += sprintf(buffer->data + buffer->length,
583 "%u;%u;%u;%u;%u;%u;%u;",
584 stream->width, stream->height,
585 stream->format, stream->vc,
586 stream->dt[0], stream->dt[1],
587 stream->max_size);
588 }
589
590 ret = len;
591
592 done:
593 kfree(streams);
594 return ret;
595 };
596
597 static ssize_t gb_camera_debugfs_capture(struct gb_camera *gcam,
598 char *buf, size_t len)
599 {
600 unsigned int request_id;
601 unsigned int streams_mask;
602 unsigned int num_frames;
603 char *token;
604 int ret;
605
606 /* Request id */
607 token = strsep(&buf, ";");
608 if (token == NULL)
609 return -EINVAL;
610 ret = kstrtouint(token, 10, &request_id);
611 if (ret < 0)
612 return ret;
613
614 /* Stream mask */
615 token = strsep(&buf, ";");
616 if (token == NULL)
617 return -EINVAL;
618 ret = kstrtouint(token, 16, &streams_mask);
619 if (ret < 0)
620 return ret;
621
622 /* number of frames */
623 token = strsep(&buf, ";");
624 if (token == NULL)
625 return -EINVAL;
626 ret = kstrtouint(token, 10, &num_frames);
627 if (ret < 0)
628 return ret;
629
630 ret = gb_camera_capture(gcam, request_id, streams_mask, num_frames, 0,
631 NULL);
632 if (ret < 0)
633 return ret;
634
635 return len;
636 }
637
638 static ssize_t gb_camera_debugfs_flush(struct gb_camera *gcam,
639 char *buf, size_t len)
640 {
641 struct gb_camera_debugfs_buffer *buffer =
642 &gcam->debugfs.buffers[GB_CAMERA_DEBUGFS_BUFFER_FLUSH];
643 unsigned int req_id;
644 int ret;
645
646 ret = gb_camera_flush(gcam, &req_id);
647 if (ret < 0)
648 return ret;
649
650 buffer->length = sprintf(buffer->data, "%u", req_id);
651
652 return len;
653 }
654
655 struct gb_camera_debugfs_entry {
656 const char *name;
657 unsigned int mask;
658 unsigned int buffer;
659 ssize_t (*execute)(struct gb_camera *gcam, char *buf, size_t len);
660 };
661
662 static const struct gb_camera_debugfs_entry gb_camera_debugfs_entries[] = {
663 {
664 .name = "capabilities",
665 .mask = S_IFREG | S_IRUGO,
666 .buffer = GB_CAMERA_DEBUGFS_BUFFER_CAPABILITIES,
667 .execute = gb_camera_debugfs_capabilities,
668 }, {
669 .name = "configure_streams",
670 .mask = S_IFREG | S_IRUGO | S_IWUGO,
671 .buffer = GB_CAMERA_DEBUGFS_BUFFER_STREAMS,
672 .execute = gb_camera_debugfs_configure_streams,
673 }, {
674 .name = "capture",
675 .mask = S_IFREG | S_IRUGO | S_IWUGO,
676 .buffer = GB_CAMERA_DEBUGFS_BUFFER_CAPTURE,
677 .execute = gb_camera_debugfs_capture,
678 }, {
679 .name = "flush",
680 .mask = S_IFREG | S_IRUGO | S_IWUGO,
681 .buffer = GB_CAMERA_DEBUGFS_BUFFER_FLUSH,
682 .execute = gb_camera_debugfs_flush,
683 },
684 };
685
686 static ssize_t gb_camera_debugfs_read(struct file *file, char __user *buf,
687 size_t len, loff_t *offset)
688 {
689 const struct gb_camera_debugfs_entry *op = file->private_data;
690 struct gb_camera *gcam = file->f_inode->i_private;
691 struct gb_camera_debugfs_buffer *buffer;
692 ssize_t ret;
693
694 /* For read-only entries the operation is triggered by a read. */
695 if (!(op->mask & S_IWUGO)) {
696 ret = op->execute(gcam, NULL, 0);
697 if (ret < 0)
698 return ret;
699 }
700
701 buffer = &gcam->debugfs.buffers[op->buffer];
702
703 return simple_read_from_buffer(buf, len, offset, buffer->data,
704 buffer->length);
705 }
706
707 static ssize_t gb_camera_debugfs_write(struct file *file,
708 const char __user *buf, size_t len,
709 loff_t *offset)
710 {
711 const struct gb_camera_debugfs_entry *op = file->private_data;
712 struct gb_camera *gcam = file->f_inode->i_private;
713 ssize_t ret;
714 char *kbuf;
715
716 if (len > 1024)
717 return -EINVAL;
718
719 kbuf = kmalloc(len + 1, GFP_KERNEL);
720 if (kbuf == NULL)
721 return -ENOMEM;
722
723 if (copy_from_user(kbuf, buf, len)) {
724 ret = -EFAULT;
725 goto done;
726 }
727
728 kbuf[len] = '\0';
729
730 ret = op->execute(gcam, kbuf, len);
731
732 done:
733 kfree(kbuf);
734 return ret;
735 }
736
737 static int gb_camera_debugfs_open(struct inode *inode, struct file *file)
738 {
739 unsigned int i;
740
741 for (i = 0; i < ARRAY_SIZE(gb_camera_debugfs_entries); ++i) {
742 const struct gb_camera_debugfs_entry *entry =
743 &gb_camera_debugfs_entries[i];
744
745 if (!strcmp(file->f_path.dentry->d_iname, entry->name)) {
746 file->private_data = (void *)entry;
747 break;
748 }
749 }
750
751 return 0;
752 }
753
754 static const struct file_operations gb_camera_debugfs_ops = {
755 .open = gb_camera_debugfs_open,
756 .read = gb_camera_debugfs_read,
757 .write = gb_camera_debugfs_write,
758 };
759
760 static int gb_camera_debugfs_init(struct gb_camera *gcam)
761 {
762 struct gb_connection *connection = gcam->connection;
763 char dirname[27];
764 unsigned int i;
765
766 /*
767 * Create root debugfs entry and a file entry for each camera operation.
768 */
769 snprintf(dirname, 27, "camera-%u.%u", connection->intf->interface_id,
770 connection->bundle->id);
771
772 gcam->debugfs.root = debugfs_create_dir(dirname, gb_debugfs_get());
773 if (IS_ERR(gcam->debugfs.root)) {
774 gcam_err(gcam, "debugfs root create failed (%ld)\n",
775 PTR_ERR(gcam->debugfs.root));
776 return PTR_ERR(gcam->debugfs.root);
777 }
778
779 gcam->debugfs.buffers = vmalloc(sizeof(*gcam->debugfs.buffers) *
780 GB_CAMERA_DEBUGFS_BUFFER_MAX);
781 if (!gcam->debugfs.buffers)
782 return -ENOMEM;
783
784 for (i = 0; i < ARRAY_SIZE(gb_camera_debugfs_entries); ++i) {
785 const struct gb_camera_debugfs_entry *entry =
786 &gb_camera_debugfs_entries[i];
787 struct dentry *dentry;
788
789 gcam->debugfs.buffers[i].length = 0;
790
791 dentry = debugfs_create_file(entry->name, entry->mask,
792 gcam->debugfs.root, gcam,
793 &gb_camera_debugfs_ops);
794 if (IS_ERR(dentry)) {
795 gcam_err(gcam,
796 "debugfs operation %s create failed (%ld)\n",
797 entry->name, PTR_ERR(gcam->debugfs.root));
798 return PTR_ERR(dentry);
799 }
800 }
801
802 return 0;
803 }
804
805 static void gb_camera_debugfs_cleanup(struct gb_camera *gcam)
806 {
807 if (gcam->debugfs.root)
808 debugfs_remove_recursive(gcam->debugfs.root);
809
810 vfree(gcam->debugfs.buffers);
811 }
812
813 /* -----------------------------------------------------------------------------
814 * Init & Cleanup
815 */
816
817 static void gb_camera_cleanup(struct gb_camera *gcam)
818 {
819 gb_camera_debugfs_cleanup(gcam);
820
821 if (gcam->data_connected) {
822 struct gb_interface *intf = gcam->connection->intf;
823 struct gb_svc *svc = gcam->connection->hd->svc;
824
825 gb_svc_connection_destroy(svc, intf->interface_id,
826 ES2_APB_CDSI0_CPORT, svc->ap_intf_id,
827 ES2_APB_CDSI1_CPORT);
828 }
829
830 kfree(gcam);
831 }
832
833 static int gb_camera_connection_init(struct gb_connection *connection)
834 {
835 struct gb_svc *svc = connection->hd->svc;
836 struct gb_camera *gcam;
837 int ret;
838
839 gcam = kzalloc(sizeof(*gcam), GFP_KERNEL);
840 if (!gcam)
841 return -ENOMEM;
842
843 gcam->connection = connection;
844 connection->private = gcam;
845
846 /*
847 * Create the data connection between camera module CDSI0 and APB CDS1.
848 * The CPort IDs are hardcoded by the ES2 bridges.
849 */
850 ret = gb_svc_connection_create(svc, connection->intf->interface_id,
851 ES2_APB_CDSI0_CPORT, svc->ap_intf_id,
852 ES2_APB_CDSI1_CPORT, false);
853 if (ret < 0)
854 goto error;
855
856 gcam->data_connected = true;
857
858 ret = gb_camera_debugfs_init(gcam);
859 if (ret < 0)
860 goto error;
861
862 ret = gb_camera_register_intf_ops(gcam);
863 if (ret < 0)
864 goto error;
865
866 return 0;
867
868 error:
869 gb_camera_cleanup(gcam);
870 return ret;
871 }
872
873 static void gb_camera_connection_exit(struct gb_connection *connection)
874 {
875 struct gb_camera *gcam = connection->private;
876
877 gb_camera_cleanup(gcam);
878 }
879
880 static struct gb_protocol camera_protocol = {
881 .name = "camera",
882 .id = GREYBUS_PROTOCOL_CAMERA_MGMT,
883 .major = GB_CAMERA_VERSION_MAJOR,
884 .minor = GB_CAMERA_VERSION_MINOR,
885 .connection_init = gb_camera_connection_init,
886 .connection_exit = gb_camera_connection_exit,
887 .request_recv = gb_camera_event_recv,
888 };
889
890 gb_protocol_driver(&camera_protocol);
891
892 MODULE_LICENSE("GPL v2");