sch_tbf: fix two null pointer dereferences on init failure
[linux-2.6/btrfs-unstable.git] / drivers / staging / greybus / camera.c
bloba64517eabff4cd146cb89d139aa3988e3a7409ef
1 /*
2 * Greybus Camera protocol driver.
4 * Copyright 2015 Google Inc.
5 * Copyright 2015 Linaro Ltd.
7 * Released under the GPLv2 only.
8 */
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>
19 #include "gb-camera.h"
20 #include "greybus.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 {
32 char data[PAGE_SIZE];
33 size_t length;
36 enum gb_camera_state {
37 GB_CAMERA_STATE_UNCONFIGURED,
38 GB_CAMERA_STATE_CONFIGURED,
41 /**
42 * struct gb_camera - A Greybus Camera Device
43 * @connection: the greybus connection for camera management
44 * @data_connection: the greybus connection for camera data
45 * @data_cport_id: the data CPort ID on the module side
46 * @mutex: protects the connection and state fields
47 * @state: the current module state
48 * @debugfs: debugfs entries for camera protocol operations testing
49 * @module: Greybus camera module registered to HOST processor.
51 struct gb_camera {
52 struct gb_bundle *bundle;
53 struct gb_connection *connection;
54 struct gb_connection *data_connection;
55 u16 data_cport_id;
57 struct mutex mutex;
58 enum gb_camera_state state;
60 struct {
61 struct dentry *root;
62 struct gb_camera_debugfs_buffer *buffers;
63 } debugfs;
65 struct gb_camera_module module;
68 struct gb_camera_stream_config {
69 unsigned int width;
70 unsigned int height;
71 unsigned int format;
72 unsigned int vc;
73 unsigned int dt[2];
74 unsigned int max_size;
77 struct gb_camera_fmt_info {
78 enum v4l2_mbus_pixelcode mbus_code;
79 unsigned int gb_format;
80 unsigned int bpp;
83 /* GB format to media code map */
84 static const struct gb_camera_fmt_info gb_fmt_info[] = {
86 .mbus_code = V4L2_MBUS_FMT_UYVY8_1X16,
87 .gb_format = 0x01,
88 .bpp = 16,
91 .mbus_code = V4L2_MBUS_FMT_NV12_1x8,
92 .gb_format = 0x12,
93 .bpp = 12,
96 .mbus_code = V4L2_MBUS_FMT_NV21_1x8,
97 .gb_format = 0x13,
98 .bpp = 12,
101 .mbus_code = V4L2_MBUS_FMT_YU12_1x8,
102 .gb_format = 0x16,
103 .bpp = 12,
106 .mbus_code = V4L2_MBUS_FMT_YV12_1x8,
107 .gb_format = 0x17,
108 .bpp = 12,
111 .mbus_code = V4L2_MBUS_FMT_JPEG_1X8,
112 .gb_format = 0x40,
113 .bpp = 0,
116 .mbus_code = V4L2_MBUS_FMT_GB_CAM_METADATA_1X8,
117 .gb_format = 0x41,
118 .bpp = 0,
121 .mbus_code = V4L2_MBUS_FMT_GB_CAM_DEBUG_DATA_1X8,
122 .gb_format = 0x42,
123 .bpp = 0,
126 .mbus_code = V4L2_MBUS_FMT_SBGGR10_1X10,
127 .gb_format = 0x80,
128 .bpp = 10,
131 .mbus_code = V4L2_MBUS_FMT_SGBRG10_1X10,
132 .gb_format = 0x81,
133 .bpp = 10,
136 .mbus_code = V4L2_MBUS_FMT_SGRBG10_1X10,
137 .gb_format = 0x82,
138 .bpp = 10,
141 .mbus_code = V4L2_MBUS_FMT_SRGGB10_1X10,
142 .gb_format = 0x83,
143 .bpp = 10,
146 .mbus_code = V4L2_MBUS_FMT_SBGGR12_1X12,
147 .gb_format = 0x84,
148 .bpp = 12,
151 .mbus_code = V4L2_MBUS_FMT_SGBRG12_1X12,
152 .gb_format = 0x85,
153 .bpp = 12,
156 .mbus_code = V4L2_MBUS_FMT_SGRBG12_1X12,
157 .gb_format = 0x86,
158 .bpp = 12,
161 .mbus_code = V4L2_MBUS_FMT_SRGGB12_1X12,
162 .gb_format = 0x87,
163 .bpp = 12,
167 static const struct gb_camera_fmt_info *gb_camera_get_format_info(u16 gb_fmt)
169 unsigned int i;
171 for (i = 0; i < ARRAY_SIZE(gb_fmt_info); i++) {
172 if (gb_fmt_info[i].gb_format == gb_fmt)
173 return &gb_fmt_info[i];
176 return NULL;
179 #define ES2_APB_CDSI0_CPORT 16
180 #define ES2_APB_CDSI1_CPORT 17
182 #define GB_CAMERA_MAX_SETTINGS_SIZE 8192
184 #define gcam_dbg(gcam, format...) dev_dbg(&gcam->bundle->dev, format)
185 #define gcam_info(gcam, format...) dev_info(&gcam->bundle->dev, format)
186 #define gcam_err(gcam, format...) dev_err(&gcam->bundle->dev, format)
188 static int gb_camera_operation_sync_flags(struct gb_connection *connection,
189 int type, unsigned int flags,
190 void *request, size_t request_size,
191 void *response, size_t *response_size)
193 struct gb_operation *operation;
194 int ret;
196 operation = gb_operation_create_flags(connection, type, request_size,
197 *response_size, flags,
198 GFP_KERNEL);
199 if (!operation)
200 return -ENOMEM;
202 if (request_size)
203 memcpy(operation->request->payload, request, request_size);
205 ret = gb_operation_request_send_sync(operation);
206 if (ret) {
207 dev_err(&connection->hd->dev,
208 "%s: synchronous operation of type 0x%02x failed: %d\n",
209 connection->name, type, ret);
210 } else {
211 *response_size = operation->response->payload_size;
213 if (operation->response->payload_size)
214 memcpy(response, operation->response->payload,
215 operation->response->payload_size);
218 gb_operation_put(operation);
220 return ret;
223 static int gb_camera_get_max_pkt_size(struct gb_camera *gcam,
224 struct gb_camera_configure_streams_response *resp)
226 unsigned int max_pkt_size = 0;
227 unsigned int i;
229 for (i = 0; i < resp->num_streams; i++) {
230 struct gb_camera_stream_config_response *cfg = &resp->config[i];
231 const struct gb_camera_fmt_info *fmt_info;
232 unsigned int pkt_size;
234 fmt_info = gb_camera_get_format_info(cfg->format);
235 if (!fmt_info) {
236 gcam_err(gcam, "unsupported greybus image format: %d\n",
237 cfg->format);
238 return -EIO;
241 if (fmt_info->bpp == 0) {
242 pkt_size = le32_to_cpu(cfg->max_pkt_size);
244 if (pkt_size == 0) {
245 gcam_err(gcam,
246 "Stream %u: invalid zero maximum packet size\n",
248 return -EIO;
250 } else {
251 pkt_size = le16_to_cpu(cfg->width) * fmt_info->bpp / 8;
253 if (pkt_size != le32_to_cpu(cfg->max_pkt_size)) {
254 gcam_err(gcam,
255 "Stream %u: maximum packet size mismatch (%u/%u)\n",
256 i, pkt_size, cfg->max_pkt_size);
257 return -EIO;
261 max_pkt_size = max(pkt_size, max_pkt_size);
264 return max_pkt_size;
268 * Validate the stream configuration response verifying padding is correctly
269 * set and the returned number of streams is supported
271 static const int gb_camera_configure_streams_validate_response(
272 struct gb_camera *gcam,
273 struct gb_camera_configure_streams_response *resp,
274 unsigned int nstreams)
276 unsigned int i;
278 /* Validate the returned response structure */
279 if (resp->padding[0] || resp->padding[1]) {
280 gcam_err(gcam, "response padding != 0\n");
281 return -EIO;
284 if (resp->num_streams > nstreams) {
285 gcam_err(gcam, "got #streams %u > request %u\n",
286 resp->num_streams, nstreams);
287 return -EIO;
290 for (i = 0; i < resp->num_streams; i++) {
291 struct gb_camera_stream_config_response *cfg = &resp->config[i];
293 if (cfg->padding) {
294 gcam_err(gcam, "stream #%u padding != 0\n", i);
295 return -EIO;
299 return 0;
302 /* -----------------------------------------------------------------------------
303 * Hardware Configuration
306 static int gb_camera_set_intf_power_mode(struct gb_camera *gcam, u8 intf_id,
307 bool hs)
309 struct gb_svc *svc = gcam->connection->hd->svc;
310 int ret;
312 if (hs)
313 ret = gb_svc_intf_set_power_mode(svc, intf_id,
314 GB_SVC_UNIPRO_HS_SERIES_A,
315 GB_SVC_UNIPRO_FAST_MODE, 2, 2,
316 GB_SVC_SMALL_AMPLITUDE,
317 GB_SVC_NO_DE_EMPHASIS,
318 GB_SVC_UNIPRO_FAST_MODE, 2, 2,
319 GB_SVC_PWRM_RXTERMINATION |
320 GB_SVC_PWRM_TXTERMINATION, 0,
321 NULL, NULL);
322 else
323 ret = gb_svc_intf_set_power_mode(svc, intf_id,
324 GB_SVC_UNIPRO_HS_SERIES_A,
325 GB_SVC_UNIPRO_SLOW_AUTO_MODE,
326 2, 1,
327 GB_SVC_SMALL_AMPLITUDE,
328 GB_SVC_NO_DE_EMPHASIS,
329 GB_SVC_UNIPRO_SLOW_AUTO_MODE,
330 2, 1,
331 0, 0,
332 NULL, NULL);
334 return ret;
337 static int gb_camera_set_power_mode(struct gb_camera *gcam, bool hs)
339 struct gb_interface *intf = gcam->connection->intf;
340 struct gb_svc *svc = gcam->connection->hd->svc;
341 int ret;
343 ret = gb_camera_set_intf_power_mode(gcam, intf->interface_id, hs);
344 if (ret < 0) {
345 gcam_err(gcam, "failed to set module interface to %s (%d)\n",
346 hs ? "HS" : "PWM", ret);
347 return ret;
350 ret = gb_camera_set_intf_power_mode(gcam, svc->ap_intf_id, hs);
351 if (ret < 0) {
352 gb_camera_set_intf_power_mode(gcam, intf->interface_id, !hs);
353 gcam_err(gcam, "failed to set AP interface to %s (%d)\n",
354 hs ? "HS" : "PWM", ret);
355 return ret;
358 return 0;
361 struct ap_csi_config_request {
362 __u8 csi_id;
363 __u8 flags;
364 #define GB_CAMERA_CSI_FLAG_CLOCK_CONTINUOUS 0x01
365 __u8 num_lanes;
366 __u8 padding;
367 __le32 csi_clk_freq;
368 __le32 max_pkt_size;
369 } __packed;
372 * TODO: Compute the number of lanes dynamically based on bandwidth
373 * requirements.
375 #define GB_CAMERA_CSI_NUM_DATA_LANES 4
377 #define GB_CAMERA_CSI_CLK_FREQ_MAX 999000000U
378 #define GB_CAMERA_CSI_CLK_FREQ_MIN 100000000U
379 #define GB_CAMERA_CSI_CLK_FREQ_MARGIN 150000000U
381 static int gb_camera_setup_data_connection(struct gb_camera *gcam,
382 struct gb_camera_configure_streams_response *resp,
383 struct gb_camera_csi_params *csi_params)
385 struct ap_csi_config_request csi_cfg;
386 struct gb_connection *conn;
387 unsigned int clk_freq;
388 int ret;
391 * Create the data connection between the camera module data CPort and
392 * APB CDSI1. The CDSI1 CPort ID is hardcoded by the ES2 bridge.
394 conn = gb_connection_create_offloaded(gcam->bundle, gcam->data_cport_id,
395 GB_CONNECTION_FLAG_NO_FLOWCTRL |
396 GB_CONNECTION_FLAG_CDSI1);
397 if (IS_ERR(conn))
398 return PTR_ERR(conn);
400 gcam->data_connection = conn;
401 gb_connection_set_data(conn, gcam);
403 ret = gb_connection_enable(conn);
404 if (ret)
405 goto error_conn_destroy;
407 /* Set the UniPro link to high speed mode. */
408 ret = gb_camera_set_power_mode(gcam, true);
409 if (ret < 0)
410 goto error_conn_disable;
413 * Configure the APB-A CSI-2 transmitter.
415 * Hardcode the number of lanes to 4 and compute the bus clock frequency
416 * based on the module bandwidth requirements with a safety margin.
418 memset(&csi_cfg, 0, sizeof(csi_cfg));
419 csi_cfg.csi_id = 1;
420 csi_cfg.flags = 0;
421 csi_cfg.num_lanes = GB_CAMERA_CSI_NUM_DATA_LANES;
423 clk_freq = resp->data_rate / 2 / GB_CAMERA_CSI_NUM_DATA_LANES;
424 clk_freq = clamp(clk_freq + GB_CAMERA_CSI_CLK_FREQ_MARGIN,
425 GB_CAMERA_CSI_CLK_FREQ_MIN,
426 GB_CAMERA_CSI_CLK_FREQ_MAX);
427 csi_cfg.csi_clk_freq = clk_freq;
429 ret = gb_camera_get_max_pkt_size(gcam, resp);
430 if (ret < 0) {
431 ret = -EIO;
432 goto error_power;
434 csi_cfg.max_pkt_size = ret;
436 ret = gb_hd_output(gcam->connection->hd, &csi_cfg,
437 sizeof(csi_cfg),
438 GB_APB_REQUEST_CSI_TX_CONTROL, false);
439 if (ret < 0) {
440 gcam_err(gcam, "failed to start the CSI transmitter\n");
441 goto error_power;
444 if (csi_params) {
445 csi_params->clk_freq = csi_cfg.csi_clk_freq;
446 csi_params->num_lanes = csi_cfg.num_lanes;
449 return 0;
451 error_power:
452 gb_camera_set_power_mode(gcam, false);
453 error_conn_disable:
454 gb_connection_disable(gcam->data_connection);
455 error_conn_destroy:
456 gb_connection_destroy(gcam->data_connection);
457 gcam->data_connection = NULL;
458 return ret;
461 static void gb_camera_teardown_data_connection(struct gb_camera *gcam)
463 struct ap_csi_config_request csi_cfg;
464 int ret;
466 /* Stop the APB1 CSI transmitter. */
467 memset(&csi_cfg, 0, sizeof(csi_cfg));
468 csi_cfg.csi_id = 1;
470 ret = gb_hd_output(gcam->connection->hd, &csi_cfg,
471 sizeof(csi_cfg),
472 GB_APB_REQUEST_CSI_TX_CONTROL, false);
474 if (ret < 0)
475 gcam_err(gcam, "failed to stop the CSI transmitter\n");
477 /* Set the UniPro link to low speed mode. */
478 gb_camera_set_power_mode(gcam, false);
480 /* Destroy the data connection. */
481 gb_connection_disable(gcam->data_connection);
482 gb_connection_destroy(gcam->data_connection);
483 gcam->data_connection = NULL;
486 /* -----------------------------------------------------------------------------
487 * Camera Protocol Operations
490 static int gb_camera_capabilities(struct gb_camera *gcam,
491 u8 *capabilities, size_t *size)
493 int ret;
495 ret = gb_pm_runtime_get_sync(gcam->bundle);
496 if (ret)
497 return ret;
499 mutex_lock(&gcam->mutex);
501 if (!gcam->connection) {
502 ret = -EINVAL;
503 goto done;
506 ret = gb_camera_operation_sync_flags(gcam->connection,
507 GB_CAMERA_TYPE_CAPABILITIES,
508 GB_OPERATION_FLAG_SHORT_RESPONSE,
509 NULL, 0,
510 (void *)capabilities, size);
511 if (ret)
512 gcam_err(gcam, "failed to retrieve capabilities: %d\n", ret);
514 done:
515 mutex_unlock(&gcam->mutex);
517 gb_pm_runtime_put_autosuspend(gcam->bundle);
519 return ret;
522 static int gb_camera_configure_streams(struct gb_camera *gcam,
523 unsigned int *num_streams,
524 unsigned int *flags,
525 struct gb_camera_stream_config *streams,
526 struct gb_camera_csi_params *csi_params)
528 struct gb_camera_configure_streams_request *req;
529 struct gb_camera_configure_streams_response *resp;
530 unsigned int nstreams = *num_streams;
531 unsigned int i;
532 size_t req_size;
533 size_t resp_size;
534 int ret;
536 if (nstreams > GB_CAMERA_MAX_STREAMS)
537 return -EINVAL;
539 req_size = sizeof(*req) + nstreams * sizeof(req->config[0]);
540 resp_size = sizeof(*resp) + nstreams * sizeof(resp->config[0]);
542 req = kmalloc(req_size, GFP_KERNEL);
543 resp = kmalloc(resp_size, GFP_KERNEL);
544 if (!req || !resp) {
545 kfree(req);
546 kfree(resp);
547 return -ENOMEM;
550 req->num_streams = nstreams;
551 req->flags = *flags;
552 req->padding = 0;
554 for (i = 0; i < nstreams; ++i) {
555 struct gb_camera_stream_config_request *cfg = &req->config[i];
557 cfg->width = cpu_to_le16(streams[i].width);
558 cfg->height = cpu_to_le16(streams[i].height);
559 cfg->format = cpu_to_le16(streams[i].format);
560 cfg->padding = 0;
563 mutex_lock(&gcam->mutex);
565 ret = gb_pm_runtime_get_sync(gcam->bundle);
566 if (ret)
567 goto done_skip_pm_put;
569 if (!gcam->connection) {
570 ret = -EINVAL;
571 goto done;
574 ret = gb_camera_operation_sync_flags(gcam->connection,
575 GB_CAMERA_TYPE_CONFIGURE_STREAMS,
576 GB_OPERATION_FLAG_SHORT_RESPONSE,
577 req, req_size,
578 resp, &resp_size);
579 if (ret < 0)
580 goto done;
582 ret = gb_camera_configure_streams_validate_response(gcam, resp,
583 nstreams);
584 if (ret < 0)
585 goto done;
587 *flags = resp->flags;
588 *num_streams = resp->num_streams;
590 for (i = 0; i < resp->num_streams; ++i) {
591 struct gb_camera_stream_config_response *cfg = &resp->config[i];
593 streams[i].width = le16_to_cpu(cfg->width);
594 streams[i].height = le16_to_cpu(cfg->height);
595 streams[i].format = le16_to_cpu(cfg->format);
596 streams[i].vc = cfg->virtual_channel;
597 streams[i].dt[0] = cfg->data_type[0];
598 streams[i].dt[1] = cfg->data_type[1];
599 streams[i].max_size = le32_to_cpu(cfg->max_size);
602 if ((resp->flags & GB_CAMERA_CONFIGURE_STREAMS_ADJUSTED) ||
603 (req->flags & GB_CAMERA_CONFIGURE_STREAMS_TEST_ONLY))
604 goto done;
606 if (gcam->state == GB_CAMERA_STATE_CONFIGURED) {
607 gb_camera_teardown_data_connection(gcam);
608 gcam->state = GB_CAMERA_STATE_UNCONFIGURED;
611 * When unconfiguring streams release the PM runtime reference
612 * that was acquired when streams were configured. The bundle
613 * won't be suspended until the PM runtime reference acquired at
614 * the beginning of this function gets released right before
615 * returning.
617 gb_pm_runtime_put_noidle(gcam->bundle);
620 if (resp->num_streams == 0)
621 goto done;
624 * Make sure the bundle won't be suspended until streams get
625 * unconfigured after the stream is configured successfully
627 gb_pm_runtime_get_noresume(gcam->bundle);
629 /* Setup CSI-2 connection from APB-A to AP */
630 ret = gb_camera_setup_data_connection(gcam, resp, csi_params);
631 if (ret < 0) {
632 memset(req, 0, sizeof(*req));
633 gb_operation_sync(gcam->connection,
634 GB_CAMERA_TYPE_CONFIGURE_STREAMS,
635 req, sizeof(*req),
636 resp, sizeof(*resp));
637 *flags = 0;
638 *num_streams = 0;
639 gb_pm_runtime_put_noidle(gcam->bundle);
640 goto done;
643 gcam->state = GB_CAMERA_STATE_CONFIGURED;
645 done:
646 gb_pm_runtime_put_autosuspend(gcam->bundle);
648 done_skip_pm_put:
649 mutex_unlock(&gcam->mutex);
650 kfree(req);
651 kfree(resp);
652 return ret;
655 static int gb_camera_capture(struct gb_camera *gcam, u32 request_id,
656 unsigned int streams, unsigned int num_frames,
657 size_t settings_size, const void *settings)
659 struct gb_camera_capture_request *req;
660 size_t req_size;
661 int ret;
663 if (settings_size > GB_CAMERA_MAX_SETTINGS_SIZE)
664 return -EINVAL;
666 req_size = sizeof(*req) + settings_size;
667 req = kmalloc(req_size, GFP_KERNEL);
668 if (!req)
669 return -ENOMEM;
671 req->request_id = cpu_to_le32(request_id);
672 req->streams = streams;
673 req->padding = 0;
674 req->num_frames = cpu_to_le16(num_frames);
675 memcpy(req->settings, settings, settings_size);
677 mutex_lock(&gcam->mutex);
679 if (!gcam->connection) {
680 ret = -EINVAL;
681 goto done;
684 ret = gb_operation_sync(gcam->connection, GB_CAMERA_TYPE_CAPTURE,
685 req, req_size, NULL, 0);
686 done:
687 mutex_unlock(&gcam->mutex);
689 kfree(req);
691 return ret;
694 static int gb_camera_flush(struct gb_camera *gcam, u32 *request_id)
696 struct gb_camera_flush_response resp;
697 int ret;
699 mutex_lock(&gcam->mutex);
701 if (!gcam->connection) {
702 ret = -EINVAL;
703 goto done;
706 ret = gb_operation_sync(gcam->connection, GB_CAMERA_TYPE_FLUSH, NULL, 0,
707 &resp, sizeof(resp));
709 if (ret < 0)
710 goto done;
712 if (request_id)
713 *request_id = le32_to_cpu(resp.request_id);
715 done:
716 mutex_unlock(&gcam->mutex);
718 return ret;
721 static int gb_camera_request_handler(struct gb_operation *op)
723 struct gb_camera *gcam = gb_connection_get_data(op->connection);
724 struct gb_camera_metadata_request *payload;
725 struct gb_message *request;
727 if (op->type != GB_CAMERA_TYPE_METADATA) {
728 gcam_err(gcam, "Unsupported unsolicited event: %u\n", op->type);
729 return -EINVAL;
732 request = op->request;
734 if (request->payload_size < sizeof(*payload)) {
735 gcam_err(gcam, "Wrong event size received (%zu < %zu)\n",
736 request->payload_size, sizeof(*payload));
737 return -EINVAL;
740 payload = request->payload;
742 gcam_dbg(gcam, "received metadata for request %u, frame %u, stream %u\n",
743 payload->request_id, payload->frame_number, payload->stream);
745 return 0;
748 /* -----------------------------------------------------------------------------
749 * Interface with HOST gmp camera.
751 static unsigned int gb_camera_mbus_to_gb(enum v4l2_mbus_pixelcode mbus_code)
753 unsigned int i;
755 for (i = 0; i < ARRAY_SIZE(gb_fmt_info); i++) {
756 if (gb_fmt_info[i].mbus_code == mbus_code)
757 return gb_fmt_info[i].gb_format;
759 return gb_fmt_info[0].gb_format;
762 static enum v4l2_mbus_pixelcode gb_camera_gb_to_mbus(u16 gb_fmt)
764 unsigned int i;
766 for (i = 0; i < ARRAY_SIZE(gb_fmt_info); i++) {
767 if (gb_fmt_info[i].gb_format == gb_fmt)
768 return gb_fmt_info[i].mbus_code;
770 return gb_fmt_info[0].mbus_code;
773 static ssize_t gb_camera_op_capabilities(void *priv, char *data, size_t len)
775 struct gb_camera *gcam = priv;
776 size_t capabilities_len = len;
777 int ret;
779 ret = gb_camera_capabilities(gcam, data, &capabilities_len);
780 if (ret)
781 return ret;
783 return capabilities_len;
786 static int gb_camera_op_configure_streams(void *priv, unsigned int *nstreams,
787 unsigned int *flags, struct gb_camera_stream *streams,
788 struct gb_camera_csi_params *csi_params)
790 struct gb_camera *gcam = priv;
791 struct gb_camera_stream_config *gb_streams;
792 unsigned int gb_flags = 0;
793 unsigned int gb_nstreams = *nstreams;
794 unsigned int i;
795 int ret;
797 if (gb_nstreams > GB_CAMERA_MAX_STREAMS)
798 return -EINVAL;
800 gb_streams = kcalloc(gb_nstreams, sizeof(*gb_streams), GFP_KERNEL);
801 if (!gb_streams)
802 return -ENOMEM;
804 for (i = 0; i < gb_nstreams; i++) {
805 gb_streams[i].width = streams[i].width;
806 gb_streams[i].height = streams[i].height;
807 gb_streams[i].format =
808 gb_camera_mbus_to_gb(streams[i].pixel_code);
811 if (*flags & GB_CAMERA_IN_FLAG_TEST)
812 gb_flags |= GB_CAMERA_CONFIGURE_STREAMS_TEST_ONLY;
814 ret = gb_camera_configure_streams(gcam, &gb_nstreams,
815 &gb_flags, gb_streams, csi_params);
816 if (ret < 0)
817 goto done;
818 if (gb_nstreams > *nstreams) {
819 ret = -EINVAL;
820 goto done;
823 *flags = 0;
824 if (gb_flags & GB_CAMERA_CONFIGURE_STREAMS_ADJUSTED)
825 *flags |= GB_CAMERA_OUT_FLAG_ADJUSTED;
827 for (i = 0; i < gb_nstreams; i++) {
828 streams[i].width = gb_streams[i].width;
829 streams[i].height = gb_streams[i].height;
830 streams[i].vc = gb_streams[i].vc;
831 streams[i].dt[0] = gb_streams[i].dt[0];
832 streams[i].dt[1] = gb_streams[i].dt[1];
833 streams[i].max_size = gb_streams[i].max_size;
834 streams[i].pixel_code =
835 gb_camera_gb_to_mbus(gb_streams[i].format);
837 *nstreams = gb_nstreams;
839 done:
840 kfree(gb_streams);
841 return ret;
844 static int gb_camera_op_capture(void *priv, u32 request_id,
845 unsigned int streams, unsigned int num_frames,
846 size_t settings_size, const void *settings)
848 struct gb_camera *gcam = priv;
850 return gb_camera_capture(gcam, request_id, streams, num_frames,
851 settings_size, settings);
854 static int gb_camera_op_flush(void *priv, u32 *request_id)
856 struct gb_camera *gcam = priv;
858 return gb_camera_flush(gcam, request_id);
861 static const struct gb_camera_ops gb_cam_ops = {
862 .capabilities = gb_camera_op_capabilities,
863 .configure_streams = gb_camera_op_configure_streams,
864 .capture = gb_camera_op_capture,
865 .flush = gb_camera_op_flush,
868 /* -----------------------------------------------------------------------------
869 * DebugFS
872 static ssize_t gb_camera_debugfs_capabilities(struct gb_camera *gcam,
873 char *buf, size_t len)
875 struct gb_camera_debugfs_buffer *buffer =
876 &gcam->debugfs.buffers[GB_CAMERA_DEBUGFS_BUFFER_CAPABILITIES];
877 size_t size = 1024;
878 unsigned int i;
879 u8 *caps;
880 int ret;
882 caps = kmalloc(size, GFP_KERNEL);
883 if (!caps)
884 return -ENOMEM;
886 ret = gb_camera_capabilities(gcam, caps, &size);
887 if (ret < 0)
888 goto done;
891 * hex_dump_to_buffer() doesn't return the number of bytes dumped prior
892 * to v4.0, we need our own implementation :-(
894 buffer->length = 0;
896 for (i = 0; i < size; i += 16) {
897 unsigned int nbytes = min_t(unsigned int, size - i, 16);
899 buffer->length += sprintf(buffer->data + buffer->length,
900 "%*ph\n", nbytes, caps + i);
903 done:
904 kfree(caps);
905 return ret;
908 static ssize_t gb_camera_debugfs_configure_streams(struct gb_camera *gcam,
909 char *buf, size_t len)
911 struct gb_camera_debugfs_buffer *buffer =
912 &gcam->debugfs.buffers[GB_CAMERA_DEBUGFS_BUFFER_STREAMS];
913 struct gb_camera_stream_config *streams;
914 unsigned int nstreams;
915 unsigned int flags;
916 unsigned int i;
917 char *token;
918 int ret;
920 /* Retrieve number of streams to configure */
921 token = strsep(&buf, ";");
922 if (token == NULL)
923 return -EINVAL;
925 ret = kstrtouint(token, 10, &nstreams);
926 if (ret < 0)
927 return ret;
929 if (nstreams > GB_CAMERA_MAX_STREAMS)
930 return -EINVAL;
932 token = strsep(&buf, ";");
933 if (token == NULL)
934 return -EINVAL;
936 ret = kstrtouint(token, 10, &flags);
937 if (ret < 0)
938 return ret;
940 /* For each stream to configure parse width, height and format */
941 streams = kcalloc(nstreams, sizeof(*streams), GFP_KERNEL);
942 if (!streams)
943 return -ENOMEM;
945 for (i = 0; i < nstreams; ++i) {
946 struct gb_camera_stream_config *stream = &streams[i];
948 /* width */
949 token = strsep(&buf, ";");
950 if (token == NULL) {
951 ret = -EINVAL;
952 goto done;
954 ret = kstrtouint(token, 10, &stream->width);
955 if (ret < 0)
956 goto done;
958 /* height */
959 token = strsep(&buf, ";");
960 if (token == NULL)
961 goto done;
963 ret = kstrtouint(token, 10, &stream->height);
964 if (ret < 0)
965 goto done;
967 /* Image format code */
968 token = strsep(&buf, ";");
969 if (token == NULL)
970 goto done;
972 ret = kstrtouint(token, 16, &stream->format);
973 if (ret < 0)
974 goto done;
977 ret = gb_camera_configure_streams(gcam, &nstreams, &flags, streams,
978 NULL);
979 if (ret < 0)
980 goto done;
982 buffer->length = sprintf(buffer->data, "%u;%u;", nstreams, flags);
984 for (i = 0; i < nstreams; ++i) {
985 struct gb_camera_stream_config *stream = &streams[i];
987 buffer->length += sprintf(buffer->data + buffer->length,
988 "%u;%u;%u;%u;%u;%u;%u;",
989 stream->width, stream->height,
990 stream->format, stream->vc,
991 stream->dt[0], stream->dt[1],
992 stream->max_size);
995 ret = len;
997 done:
998 kfree(streams);
999 return ret;
1002 static ssize_t gb_camera_debugfs_capture(struct gb_camera *gcam,
1003 char *buf, size_t len)
1005 unsigned int request_id;
1006 unsigned int streams_mask;
1007 unsigned int num_frames;
1008 char *token;
1009 int ret;
1011 /* Request id */
1012 token = strsep(&buf, ";");
1013 if (token == NULL)
1014 return -EINVAL;
1015 ret = kstrtouint(token, 10, &request_id);
1016 if (ret < 0)
1017 return ret;
1019 /* Stream mask */
1020 token = strsep(&buf, ";");
1021 if (token == NULL)
1022 return -EINVAL;
1023 ret = kstrtouint(token, 16, &streams_mask);
1024 if (ret < 0)
1025 return ret;
1027 /* number of frames */
1028 token = strsep(&buf, ";");
1029 if (token == NULL)
1030 return -EINVAL;
1031 ret = kstrtouint(token, 10, &num_frames);
1032 if (ret < 0)
1033 return ret;
1035 ret = gb_camera_capture(gcam, request_id, streams_mask, num_frames, 0,
1036 NULL);
1037 if (ret < 0)
1038 return ret;
1040 return len;
1043 static ssize_t gb_camera_debugfs_flush(struct gb_camera *gcam,
1044 char *buf, size_t len)
1046 struct gb_camera_debugfs_buffer *buffer =
1047 &gcam->debugfs.buffers[GB_CAMERA_DEBUGFS_BUFFER_FLUSH];
1048 unsigned int req_id;
1049 int ret;
1051 ret = gb_camera_flush(gcam, &req_id);
1052 if (ret < 0)
1053 return ret;
1055 buffer->length = sprintf(buffer->data, "%u", req_id);
1057 return len;
1060 struct gb_camera_debugfs_entry {
1061 const char *name;
1062 unsigned int mask;
1063 unsigned int buffer;
1064 ssize_t (*execute)(struct gb_camera *gcam, char *buf, size_t len);
1067 static const struct gb_camera_debugfs_entry gb_camera_debugfs_entries[] = {
1069 .name = "capabilities",
1070 .mask = S_IFREG | 0444,
1071 .buffer = GB_CAMERA_DEBUGFS_BUFFER_CAPABILITIES,
1072 .execute = gb_camera_debugfs_capabilities,
1073 }, {
1074 .name = "configure_streams",
1075 .mask = S_IFREG | 0666,
1076 .buffer = GB_CAMERA_DEBUGFS_BUFFER_STREAMS,
1077 .execute = gb_camera_debugfs_configure_streams,
1078 }, {
1079 .name = "capture",
1080 .mask = S_IFREG | 0666,
1081 .buffer = GB_CAMERA_DEBUGFS_BUFFER_CAPTURE,
1082 .execute = gb_camera_debugfs_capture,
1083 }, {
1084 .name = "flush",
1085 .mask = S_IFREG | 0666,
1086 .buffer = GB_CAMERA_DEBUGFS_BUFFER_FLUSH,
1087 .execute = gb_camera_debugfs_flush,
1091 static ssize_t gb_camera_debugfs_read(struct file *file, char __user *buf,
1092 size_t len, loff_t *offset)
1094 const struct gb_camera_debugfs_entry *op = file->private_data;
1095 struct gb_camera *gcam = file_inode(file)->i_private;
1096 struct gb_camera_debugfs_buffer *buffer;
1097 ssize_t ret;
1099 /* For read-only entries the operation is triggered by a read. */
1100 if (!(op->mask & 0222)) {
1101 ret = op->execute(gcam, NULL, 0);
1102 if (ret < 0)
1103 return ret;
1106 buffer = &gcam->debugfs.buffers[op->buffer];
1108 return simple_read_from_buffer(buf, len, offset, buffer->data,
1109 buffer->length);
1112 static ssize_t gb_camera_debugfs_write(struct file *file,
1113 const char __user *buf, size_t len,
1114 loff_t *offset)
1116 const struct gb_camera_debugfs_entry *op = file->private_data;
1117 struct gb_camera *gcam = file_inode(file)->i_private;
1118 ssize_t ret;
1119 char *kbuf;
1121 if (len > 1024)
1122 return -EINVAL;
1124 kbuf = kmalloc(len + 1, GFP_KERNEL);
1125 if (!kbuf)
1126 return -ENOMEM;
1128 if (copy_from_user(kbuf, buf, len)) {
1129 ret = -EFAULT;
1130 goto done;
1133 kbuf[len] = '\0';
1135 ret = op->execute(gcam, kbuf, len);
1137 done:
1138 kfree(kbuf);
1139 return ret;
1142 static int gb_camera_debugfs_open(struct inode *inode, struct file *file)
1144 unsigned int i;
1146 for (i = 0; i < ARRAY_SIZE(gb_camera_debugfs_entries); ++i) {
1147 const struct gb_camera_debugfs_entry *entry =
1148 &gb_camera_debugfs_entries[i];
1150 if (!strcmp(file->f_path.dentry->d_iname, entry->name)) {
1151 file->private_data = (void *)entry;
1152 break;
1156 return 0;
1159 static const struct file_operations gb_camera_debugfs_ops = {
1160 .open = gb_camera_debugfs_open,
1161 .read = gb_camera_debugfs_read,
1162 .write = gb_camera_debugfs_write,
1165 static int gb_camera_debugfs_init(struct gb_camera *gcam)
1167 struct gb_connection *connection = gcam->connection;
1168 char dirname[27];
1169 unsigned int i;
1172 * Create root debugfs entry and a file entry for each camera operation.
1174 snprintf(dirname, 27, "camera-%u.%u", connection->intf->interface_id,
1175 gcam->bundle->id);
1177 gcam->debugfs.root = debugfs_create_dir(dirname, gb_debugfs_get());
1178 if (IS_ERR(gcam->debugfs.root)) {
1179 gcam_err(gcam, "debugfs root create failed (%ld)\n",
1180 PTR_ERR(gcam->debugfs.root));
1181 return PTR_ERR(gcam->debugfs.root);
1184 gcam->debugfs.buffers = vmalloc(sizeof(*gcam->debugfs.buffers) *
1185 GB_CAMERA_DEBUGFS_BUFFER_MAX);
1186 if (!gcam->debugfs.buffers)
1187 return -ENOMEM;
1189 for (i = 0; i < ARRAY_SIZE(gb_camera_debugfs_entries); ++i) {
1190 const struct gb_camera_debugfs_entry *entry =
1191 &gb_camera_debugfs_entries[i];
1192 struct dentry *dentry;
1194 gcam->debugfs.buffers[i].length = 0;
1196 dentry = debugfs_create_file(entry->name, entry->mask,
1197 gcam->debugfs.root, gcam,
1198 &gb_camera_debugfs_ops);
1199 if (IS_ERR(dentry)) {
1200 gcam_err(gcam,
1201 "debugfs operation %s create failed (%ld)\n",
1202 entry->name, PTR_ERR(dentry));
1203 return PTR_ERR(dentry);
1207 return 0;
1210 static void gb_camera_debugfs_cleanup(struct gb_camera *gcam)
1212 debugfs_remove_recursive(gcam->debugfs.root);
1214 vfree(gcam->debugfs.buffers);
1217 /* -----------------------------------------------------------------------------
1218 * Init & Cleanup
1221 static void gb_camera_cleanup(struct gb_camera *gcam)
1223 gb_camera_debugfs_cleanup(gcam);
1225 mutex_lock(&gcam->mutex);
1226 if (gcam->data_connection) {
1227 gb_connection_disable(gcam->data_connection);
1228 gb_connection_destroy(gcam->data_connection);
1229 gcam->data_connection = NULL;
1232 if (gcam->connection) {
1233 gb_connection_disable(gcam->connection);
1234 gb_connection_destroy(gcam->connection);
1235 gcam->connection = NULL;
1237 mutex_unlock(&gcam->mutex);
1240 static void gb_camera_release_module(struct kref *ref)
1242 struct gb_camera_module *cam_mod =
1243 container_of(ref, struct gb_camera_module, refcount);
1244 kfree(cam_mod->priv);
1247 static int gb_camera_probe(struct gb_bundle *bundle,
1248 const struct greybus_bundle_id *id)
1250 struct gb_connection *conn;
1251 struct gb_camera *gcam;
1252 u16 mgmt_cport_id = 0;
1253 u16 data_cport_id = 0;
1254 unsigned int i;
1255 int ret;
1258 * The camera bundle must contain exactly two CPorts, one for the
1259 * camera management protocol and one for the camera data protocol.
1261 if (bundle->num_cports != 2)
1262 return -ENODEV;
1264 for (i = 0; i < bundle->num_cports; ++i) {
1265 struct greybus_descriptor_cport *desc = &bundle->cport_desc[i];
1267 switch (desc->protocol_id) {
1268 case GREYBUS_PROTOCOL_CAMERA_MGMT:
1269 mgmt_cport_id = le16_to_cpu(desc->id);
1270 break;
1271 case GREYBUS_PROTOCOL_CAMERA_DATA:
1272 data_cport_id = le16_to_cpu(desc->id);
1273 break;
1274 default:
1275 return -ENODEV;
1279 if (!mgmt_cport_id || !data_cport_id)
1280 return -ENODEV;
1282 gcam = kzalloc(sizeof(*gcam), GFP_KERNEL);
1283 if (!gcam)
1284 return -ENOMEM;
1286 mutex_init(&gcam->mutex);
1288 gcam->bundle = bundle;
1289 gcam->state = GB_CAMERA_STATE_UNCONFIGURED;
1290 gcam->data_cport_id = data_cport_id;
1292 conn = gb_connection_create(bundle, mgmt_cport_id,
1293 gb_camera_request_handler);
1294 if (IS_ERR(conn)) {
1295 ret = PTR_ERR(conn);
1296 goto error;
1299 gcam->connection = conn;
1300 gb_connection_set_data(conn, gcam);
1302 ret = gb_connection_enable(conn);
1303 if (ret)
1304 goto error;
1306 ret = gb_camera_debugfs_init(gcam);
1307 if (ret < 0)
1308 goto error;
1310 gcam->module.priv = gcam;
1311 gcam->module.ops = &gb_cam_ops;
1312 gcam->module.interface_id = gcam->connection->intf->interface_id;
1313 gcam->module.release = gb_camera_release_module;
1314 ret = gb_camera_register(&gcam->module);
1315 if (ret < 0)
1316 goto error;
1318 greybus_set_drvdata(bundle, gcam);
1320 gb_pm_runtime_put_autosuspend(gcam->bundle);
1322 return 0;
1324 error:
1325 gb_camera_cleanup(gcam);
1326 kfree(gcam);
1327 return ret;
1330 static void gb_camera_disconnect(struct gb_bundle *bundle)
1332 struct gb_camera *gcam = greybus_get_drvdata(bundle);
1333 int ret;
1335 ret = gb_pm_runtime_get_sync(bundle);
1336 if (ret)
1337 gb_pm_runtime_get_noresume(bundle);
1339 gb_camera_cleanup(gcam);
1340 gb_camera_unregister(&gcam->module);
1343 static const struct greybus_bundle_id gb_camera_id_table[] = {
1344 { GREYBUS_DEVICE_CLASS(GREYBUS_CLASS_CAMERA) },
1345 { },
1348 #ifdef CONFIG_PM
1349 static int gb_camera_suspend(struct device *dev)
1351 struct gb_bundle *bundle = to_gb_bundle(dev);
1352 struct gb_camera *gcam = greybus_get_drvdata(bundle);
1354 if (gcam->data_connection)
1355 gb_connection_disable(gcam->data_connection);
1357 gb_connection_disable(gcam->connection);
1359 return 0;
1362 static int gb_camera_resume(struct device *dev)
1364 struct gb_bundle *bundle = to_gb_bundle(dev);
1365 struct gb_camera *gcam = greybus_get_drvdata(bundle);
1366 int ret;
1368 ret = gb_connection_enable(gcam->connection);
1369 if (ret) {
1370 gcam_err(gcam, "failed to enable connection: %d\n", ret);
1371 return ret;
1374 if (gcam->data_connection) {
1375 ret = gb_connection_enable(gcam->data_connection);
1376 if (ret) {
1377 gcam_err(gcam,
1378 "failed to enable data connection: %d\n", ret);
1379 return ret;
1383 return 0;
1385 #endif
1387 static const struct dev_pm_ops gb_camera_pm_ops = {
1388 SET_RUNTIME_PM_OPS(gb_camera_suspend, gb_camera_resume, NULL)
1391 static struct greybus_driver gb_camera_driver = {
1392 .name = "camera",
1393 .probe = gb_camera_probe,
1394 .disconnect = gb_camera_disconnect,
1395 .id_table = gb_camera_id_table,
1396 .driver.pm = &gb_camera_pm_ops,
1399 module_greybus_driver(gb_camera_driver);
1401 MODULE_LICENSE("GPL v2");