1 // SPDX-License-Identifier: GPL-2.0
3 * Greybus Camera protocol driver.
5 * Copyright 2015 Google Inc.
6 * Copyright 2015 Linaro Ltd.
9 #include <linux/debugfs.h>
11 #include <linux/kernel.h>
12 #include <linux/module.h>
13 #include <linux/slab.h>
14 #include <linux/string.h>
15 #include <linux/uaccess.h>
16 #include <linux/vmalloc.h>
17 #include <linux/greybus.h>
19 #include "gb-camera.h"
20 #include "greybus_protocols.h"
22 enum gb_camera_debugs_buffer_id {
23 GB_CAMERA_DEBUGFS_BUFFER_CAPABILITIES,
24 GB_CAMERA_DEBUGFS_BUFFER_STREAMS,
25 GB_CAMERA_DEBUGFS_BUFFER_CAPTURE,
26 GB_CAMERA_DEBUGFS_BUFFER_FLUSH,
27 GB_CAMERA_DEBUGFS_BUFFER_MAX,
30 struct gb_camera_debugfs_buffer {
35 enum gb_camera_state {
36 GB_CAMERA_STATE_UNCONFIGURED,
37 GB_CAMERA_STATE_CONFIGURED,
41 * struct gb_camera - A Greybus Camera Device
42 * @connection: the greybus connection for camera management
43 * @data_connection: the greybus connection for camera data
44 * @data_cport_id: the data CPort ID on the module side
45 * @mutex: protects the connection and state fields
46 * @state: the current module state
47 * @debugfs: debugfs entries for camera protocol operations testing
48 * @module: Greybus camera module registered to HOST processor.
51 struct gb_bundle *bundle;
52 struct gb_connection *connection;
53 struct gb_connection *data_connection;
57 enum gb_camera_state state;
61 struct gb_camera_debugfs_buffer *buffers;
64 struct gb_camera_module module;
67 struct gb_camera_stream_config {
73 unsigned int max_size;
76 struct gb_camera_fmt_info {
77 enum v4l2_mbus_pixelcode mbus_code;
78 unsigned int gb_format;
82 /* GB format to media code map */
83 static const struct gb_camera_fmt_info gb_fmt_info[] = {
85 .mbus_code = V4L2_MBUS_FMT_UYVY8_1X16,
90 .mbus_code = V4L2_MBUS_FMT_NV12_1x8,
95 .mbus_code = V4L2_MBUS_FMT_NV21_1x8,
100 .mbus_code = V4L2_MBUS_FMT_YU12_1x8,
105 .mbus_code = V4L2_MBUS_FMT_YV12_1x8,
110 .mbus_code = V4L2_MBUS_FMT_JPEG_1X8,
115 .mbus_code = V4L2_MBUS_FMT_GB_CAM_METADATA_1X8,
120 .mbus_code = V4L2_MBUS_FMT_GB_CAM_DEBUG_DATA_1X8,
125 .mbus_code = V4L2_MBUS_FMT_SBGGR10_1X10,
130 .mbus_code = V4L2_MBUS_FMT_SGBRG10_1X10,
135 .mbus_code = V4L2_MBUS_FMT_SGRBG10_1X10,
140 .mbus_code = V4L2_MBUS_FMT_SRGGB10_1X10,
145 .mbus_code = V4L2_MBUS_FMT_SBGGR12_1X12,
150 .mbus_code = V4L2_MBUS_FMT_SGBRG12_1X12,
155 .mbus_code = V4L2_MBUS_FMT_SGRBG12_1X12,
160 .mbus_code = V4L2_MBUS_FMT_SRGGB12_1X12,
166 static const struct gb_camera_fmt_info *gb_camera_get_format_info(u16 gb_fmt)
170 for (i = 0; i < ARRAY_SIZE(gb_fmt_info); i++) {
171 if (gb_fmt_info[i].gb_format == gb_fmt)
172 return &gb_fmt_info[i];
178 #define ES2_APB_CDSI0_CPORT 16
179 #define ES2_APB_CDSI1_CPORT 17
181 #define GB_CAMERA_MAX_SETTINGS_SIZE 8192
183 #define gcam_dbg(gcam, format...) dev_dbg(&gcam->bundle->dev, format)
184 #define gcam_info(gcam, format...) dev_info(&gcam->bundle->dev, format)
185 #define gcam_err(gcam, format...) dev_err(&gcam->bundle->dev, format)
187 static int gb_camera_operation_sync_flags(struct gb_connection *connection,
188 int type, unsigned int flags,
189 void *request, size_t request_size,
190 void *response, size_t *response_size)
192 struct gb_operation *operation;
195 operation = gb_operation_create_flags(connection, type, request_size,
196 *response_size, flags,
202 memcpy(operation->request->payload, request, request_size);
204 ret = gb_operation_request_send_sync(operation);
206 dev_err(&connection->hd->dev,
207 "%s: synchronous operation of type 0x%02x failed: %d\n",
208 connection->name, type, ret);
210 *response_size = operation->response->payload_size;
212 if (operation->response->payload_size)
213 memcpy(response, operation->response->payload,
214 operation->response->payload_size);
217 gb_operation_put(operation);
222 static int gb_camera_get_max_pkt_size(struct gb_camera *gcam,
223 struct gb_camera_configure_streams_response *resp)
225 unsigned int max_pkt_size = 0;
228 for (i = 0; i < resp->num_streams; i++) {
229 struct gb_camera_stream_config_response *cfg = &resp->config[i];
230 const struct gb_camera_fmt_info *fmt_info;
231 unsigned int pkt_size;
233 fmt_info = gb_camera_get_format_info(cfg->format);
235 gcam_err(gcam, "unsupported greybus image format: %d\n",
240 if (fmt_info->bpp == 0) {
241 pkt_size = le32_to_cpu(cfg->max_pkt_size);
245 "Stream %u: invalid zero maximum packet size\n",
250 pkt_size = le16_to_cpu(cfg->width) * fmt_info->bpp / 8;
252 if (pkt_size != le32_to_cpu(cfg->max_pkt_size)) {
254 "Stream %u: maximum packet size mismatch (%u/%u)\n",
255 i, pkt_size, cfg->max_pkt_size);
260 max_pkt_size = max(pkt_size, max_pkt_size);
267 * Validate the stream configuration response verifying padding is correctly
268 * set and the returned number of streams is supported
270 static const int gb_camera_configure_streams_validate_response(struct gb_camera *gcam,
271 struct gb_camera_configure_streams_response *resp,
272 unsigned int nstreams)
276 /* Validate the returned response structure */
277 if (resp->padding[0] || resp->padding[1]) {
278 gcam_err(gcam, "response padding != 0\n");
282 if (resp->num_streams > nstreams) {
283 gcam_err(gcam, "got #streams %u > request %u\n",
284 resp->num_streams, nstreams);
288 for (i = 0; i < resp->num_streams; i++) {
289 struct gb_camera_stream_config_response *cfg = &resp->config[i];
292 gcam_err(gcam, "stream #%u padding != 0\n", i);
300 /* -----------------------------------------------------------------------------
301 * Hardware Configuration
304 static int gb_camera_set_intf_power_mode(struct gb_camera *gcam, u8 intf_id,
307 struct gb_svc *svc = gcam->connection->hd->svc;
311 ret = gb_svc_intf_set_power_mode(svc, intf_id,
312 GB_SVC_UNIPRO_HS_SERIES_A,
313 GB_SVC_UNIPRO_FAST_MODE, 2, 2,
314 GB_SVC_SMALL_AMPLITUDE,
315 GB_SVC_NO_DE_EMPHASIS,
316 GB_SVC_UNIPRO_FAST_MODE, 2, 2,
317 GB_SVC_PWRM_RXTERMINATION |
318 GB_SVC_PWRM_TXTERMINATION, 0,
321 ret = gb_svc_intf_set_power_mode(svc, intf_id,
322 GB_SVC_UNIPRO_HS_SERIES_A,
323 GB_SVC_UNIPRO_SLOW_AUTO_MODE,
325 GB_SVC_SMALL_AMPLITUDE,
326 GB_SVC_NO_DE_EMPHASIS,
327 GB_SVC_UNIPRO_SLOW_AUTO_MODE,
335 static int gb_camera_set_power_mode(struct gb_camera *gcam, bool hs)
337 struct gb_interface *intf = gcam->connection->intf;
338 struct gb_svc *svc = gcam->connection->hd->svc;
341 ret = gb_camera_set_intf_power_mode(gcam, intf->interface_id, hs);
343 gcam_err(gcam, "failed to set module interface to %s (%d)\n",
344 hs ? "HS" : "PWM", ret);
348 ret = gb_camera_set_intf_power_mode(gcam, svc->ap_intf_id, hs);
350 gb_camera_set_intf_power_mode(gcam, intf->interface_id, !hs);
351 gcam_err(gcam, "failed to set AP interface to %s (%d)\n",
352 hs ? "HS" : "PWM", ret);
359 struct ap_csi_config_request {
362 #define GB_CAMERA_CSI_FLAG_CLOCK_CONTINUOUS 0x01
370 * TODO: Compute the number of lanes dynamically based on bandwidth
373 #define GB_CAMERA_CSI_NUM_DATA_LANES 4
375 #define GB_CAMERA_CSI_CLK_FREQ_MAX 999000000U
376 #define GB_CAMERA_CSI_CLK_FREQ_MIN 100000000U
377 #define GB_CAMERA_CSI_CLK_FREQ_MARGIN 150000000U
379 static int gb_camera_setup_data_connection(struct gb_camera *gcam,
380 struct gb_camera_configure_streams_response *resp,
381 struct gb_camera_csi_params *csi_params)
383 struct ap_csi_config_request csi_cfg;
384 struct gb_connection *conn;
385 unsigned int clk_freq;
389 * Create the data connection between the camera module data CPort and
390 * APB CDSI1. The CDSI1 CPort ID is hardcoded by the ES2 bridge.
392 conn = gb_connection_create_offloaded(gcam->bundle, gcam->data_cport_id,
393 GB_CONNECTION_FLAG_NO_FLOWCTRL |
394 GB_CONNECTION_FLAG_CDSI1);
396 return PTR_ERR(conn);
398 gcam->data_connection = conn;
399 gb_connection_set_data(conn, gcam);
401 ret = gb_connection_enable(conn);
403 goto error_conn_destroy;
405 /* Set the UniPro link to high speed mode. */
406 ret = gb_camera_set_power_mode(gcam, true);
408 goto error_conn_disable;
411 * Configure the APB-A CSI-2 transmitter.
413 * Hardcode the number of lanes to 4 and compute the bus clock frequency
414 * based on the module bandwidth requirements with a safety margin.
416 memset(&csi_cfg, 0, sizeof(csi_cfg));
419 csi_cfg.num_lanes = GB_CAMERA_CSI_NUM_DATA_LANES;
421 clk_freq = resp->data_rate / 2 / GB_CAMERA_CSI_NUM_DATA_LANES;
422 clk_freq = clamp(clk_freq + GB_CAMERA_CSI_CLK_FREQ_MARGIN,
423 GB_CAMERA_CSI_CLK_FREQ_MIN,
424 GB_CAMERA_CSI_CLK_FREQ_MAX);
425 csi_cfg.csi_clk_freq = clk_freq;
427 ret = gb_camera_get_max_pkt_size(gcam, resp);
432 csi_cfg.max_pkt_size = ret;
434 ret = gb_hd_output(gcam->connection->hd, &csi_cfg,
436 GB_APB_REQUEST_CSI_TX_CONTROL, false);
438 gcam_err(gcam, "failed to start the CSI transmitter\n");
443 csi_params->clk_freq = csi_cfg.csi_clk_freq;
444 csi_params->num_lanes = csi_cfg.num_lanes;
450 gb_camera_set_power_mode(gcam, false);
452 gb_connection_disable(gcam->data_connection);
454 gb_connection_destroy(gcam->data_connection);
455 gcam->data_connection = NULL;
459 static void gb_camera_teardown_data_connection(struct gb_camera *gcam)
461 struct ap_csi_config_request csi_cfg;
464 /* Stop the APB1 CSI transmitter. */
465 memset(&csi_cfg, 0, sizeof(csi_cfg));
468 ret = gb_hd_output(gcam->connection->hd, &csi_cfg,
470 GB_APB_REQUEST_CSI_TX_CONTROL, false);
473 gcam_err(gcam, "failed to stop the CSI transmitter\n");
475 /* Set the UniPro link to low speed mode. */
476 gb_camera_set_power_mode(gcam, false);
478 /* Destroy the data connection. */
479 gb_connection_disable(gcam->data_connection);
480 gb_connection_destroy(gcam->data_connection);
481 gcam->data_connection = NULL;
484 /* -----------------------------------------------------------------------------
485 * Camera Protocol Operations
488 static int gb_camera_capabilities(struct gb_camera *gcam,
489 u8 *capabilities, size_t *size)
493 ret = gb_pm_runtime_get_sync(gcam->bundle);
497 mutex_lock(&gcam->mutex);
499 if (!gcam->connection) {
504 ret = gb_camera_operation_sync_flags(gcam->connection,
505 GB_CAMERA_TYPE_CAPABILITIES,
506 GB_OPERATION_FLAG_SHORT_RESPONSE,
508 (void *)capabilities, size);
510 gcam_err(gcam, "failed to retrieve capabilities: %d\n", ret);
513 mutex_unlock(&gcam->mutex);
515 gb_pm_runtime_put_autosuspend(gcam->bundle);
520 static int gb_camera_configure_streams(struct gb_camera *gcam,
521 unsigned int *num_streams,
523 struct gb_camera_stream_config *streams,
524 struct gb_camera_csi_params *csi_params)
526 struct gb_camera_configure_streams_request *req;
527 struct gb_camera_configure_streams_response *resp;
528 unsigned int nstreams = *num_streams;
534 if (nstreams > GB_CAMERA_MAX_STREAMS)
537 req_size = sizeof(*req) + nstreams * sizeof(req->config[0]);
538 resp_size = sizeof(*resp) + nstreams * sizeof(resp->config[0]);
540 req = kmalloc(req_size, GFP_KERNEL);
541 resp = kmalloc(resp_size, GFP_KERNEL);
548 req->num_streams = nstreams;
552 for (i = 0; i < nstreams; ++i) {
553 struct gb_camera_stream_config_request *cfg = &req->config[i];
555 cfg->width = cpu_to_le16(streams[i].width);
556 cfg->height = cpu_to_le16(streams[i].height);
557 cfg->format = cpu_to_le16(streams[i].format);
561 mutex_lock(&gcam->mutex);
563 ret = gb_pm_runtime_get_sync(gcam->bundle);
565 goto done_skip_pm_put;
567 if (!gcam->connection) {
572 ret = gb_camera_operation_sync_flags(gcam->connection,
573 GB_CAMERA_TYPE_CONFIGURE_STREAMS,
574 GB_OPERATION_FLAG_SHORT_RESPONSE,
580 ret = gb_camera_configure_streams_validate_response(gcam, resp,
585 *flags = resp->flags;
586 *num_streams = resp->num_streams;
588 for (i = 0; i < resp->num_streams; ++i) {
589 struct gb_camera_stream_config_response *cfg = &resp->config[i];
591 streams[i].width = le16_to_cpu(cfg->width);
592 streams[i].height = le16_to_cpu(cfg->height);
593 streams[i].format = le16_to_cpu(cfg->format);
594 streams[i].vc = cfg->virtual_channel;
595 streams[i].dt[0] = cfg->data_type[0];
596 streams[i].dt[1] = cfg->data_type[1];
597 streams[i].max_size = le32_to_cpu(cfg->max_size);
600 if ((resp->flags & GB_CAMERA_CONFIGURE_STREAMS_ADJUSTED) ||
601 (req->flags & GB_CAMERA_CONFIGURE_STREAMS_TEST_ONLY))
604 if (gcam->state == GB_CAMERA_STATE_CONFIGURED) {
605 gb_camera_teardown_data_connection(gcam);
606 gcam->state = GB_CAMERA_STATE_UNCONFIGURED;
609 * When unconfiguring streams release the PM runtime reference
610 * that was acquired when streams were configured. The bundle
611 * won't be suspended until the PM runtime reference acquired at
612 * the beginning of this function gets released right before
615 gb_pm_runtime_put_noidle(gcam->bundle);
618 if (resp->num_streams == 0)
622 * Make sure the bundle won't be suspended until streams get
623 * unconfigured after the stream is configured successfully
625 gb_pm_runtime_get_noresume(gcam->bundle);
627 /* Setup CSI-2 connection from APB-A to AP */
628 ret = gb_camera_setup_data_connection(gcam, resp, csi_params);
630 memset(req, 0, sizeof(*req));
631 gb_operation_sync(gcam->connection,
632 GB_CAMERA_TYPE_CONFIGURE_STREAMS,
634 resp, sizeof(*resp));
637 gb_pm_runtime_put_noidle(gcam->bundle);
641 gcam->state = GB_CAMERA_STATE_CONFIGURED;
644 gb_pm_runtime_put_autosuspend(gcam->bundle);
647 mutex_unlock(&gcam->mutex);
653 static int gb_camera_capture(struct gb_camera *gcam, u32 request_id,
654 unsigned int streams, unsigned int num_frames,
655 size_t settings_size, const void *settings)
657 struct gb_camera_capture_request *req;
661 if (settings_size > GB_CAMERA_MAX_SETTINGS_SIZE)
664 req_size = sizeof(*req) + settings_size;
665 req = kmalloc(req_size, GFP_KERNEL);
669 req->request_id = cpu_to_le32(request_id);
670 req->streams = streams;
672 req->num_frames = cpu_to_le16(num_frames);
673 memcpy(req->settings, settings, settings_size);
675 mutex_lock(&gcam->mutex);
677 if (!gcam->connection) {
682 ret = gb_operation_sync(gcam->connection, GB_CAMERA_TYPE_CAPTURE,
683 req, req_size, NULL, 0);
685 mutex_unlock(&gcam->mutex);
692 static int gb_camera_flush(struct gb_camera *gcam, u32 *request_id)
694 struct gb_camera_flush_response resp;
697 mutex_lock(&gcam->mutex);
699 if (!gcam->connection) {
704 ret = gb_operation_sync(gcam->connection, GB_CAMERA_TYPE_FLUSH, NULL, 0,
705 &resp, sizeof(resp));
711 *request_id = le32_to_cpu(resp.request_id);
714 mutex_unlock(&gcam->mutex);
719 static int gb_camera_request_handler(struct gb_operation *op)
721 struct gb_camera *gcam = gb_connection_get_data(op->connection);
722 struct gb_camera_metadata_request *payload;
723 struct gb_message *request;
725 if (op->type != GB_CAMERA_TYPE_METADATA) {
726 gcam_err(gcam, "Unsupported unsolicited event: %u\n", op->type);
730 request = op->request;
732 if (request->payload_size < sizeof(*payload)) {
733 gcam_err(gcam, "Wrong event size received (%zu < %zu)\n",
734 request->payload_size, sizeof(*payload));
738 payload = request->payload;
740 gcam_dbg(gcam, "received metadata for request %u, frame %u, stream %u\n",
741 payload->request_id, payload->frame_number, payload->stream);
746 /* -----------------------------------------------------------------------------
747 * Interface with HOST gmp camera.
749 static unsigned int gb_camera_mbus_to_gb(enum v4l2_mbus_pixelcode mbus_code)
753 for (i = 0; i < ARRAY_SIZE(gb_fmt_info); i++) {
754 if (gb_fmt_info[i].mbus_code == mbus_code)
755 return gb_fmt_info[i].gb_format;
757 return gb_fmt_info[0].gb_format;
760 static enum v4l2_mbus_pixelcode gb_camera_gb_to_mbus(u16 gb_fmt)
764 for (i = 0; i < ARRAY_SIZE(gb_fmt_info); i++) {
765 if (gb_fmt_info[i].gb_format == gb_fmt)
766 return gb_fmt_info[i].mbus_code;
768 return gb_fmt_info[0].mbus_code;
771 static ssize_t gb_camera_op_capabilities(void *priv, char *data, size_t len)
773 struct gb_camera *gcam = priv;
774 size_t capabilities_len = len;
777 ret = gb_camera_capabilities(gcam, data, &capabilities_len);
781 return capabilities_len;
784 static int gb_camera_op_configure_streams(void *priv, unsigned int *nstreams,
785 unsigned int *flags, struct gb_camera_stream *streams,
786 struct gb_camera_csi_params *csi_params)
788 struct gb_camera *gcam = priv;
789 struct gb_camera_stream_config *gb_streams;
790 unsigned int gb_flags = 0;
791 unsigned int gb_nstreams = *nstreams;
795 if (gb_nstreams > GB_CAMERA_MAX_STREAMS)
798 gb_streams = kcalloc(gb_nstreams, sizeof(*gb_streams), GFP_KERNEL);
802 for (i = 0; i < gb_nstreams; i++) {
803 gb_streams[i].width = streams[i].width;
804 gb_streams[i].height = streams[i].height;
805 gb_streams[i].format =
806 gb_camera_mbus_to_gb(streams[i].pixel_code);
809 if (*flags & GB_CAMERA_IN_FLAG_TEST)
810 gb_flags |= GB_CAMERA_CONFIGURE_STREAMS_TEST_ONLY;
812 ret = gb_camera_configure_streams(gcam, &gb_nstreams,
813 &gb_flags, gb_streams, csi_params);
816 if (gb_nstreams > *nstreams) {
822 if (gb_flags & GB_CAMERA_CONFIGURE_STREAMS_ADJUSTED)
823 *flags |= GB_CAMERA_OUT_FLAG_ADJUSTED;
825 for (i = 0; i < gb_nstreams; i++) {
826 streams[i].width = gb_streams[i].width;
827 streams[i].height = gb_streams[i].height;
828 streams[i].vc = gb_streams[i].vc;
829 streams[i].dt[0] = gb_streams[i].dt[0];
830 streams[i].dt[1] = gb_streams[i].dt[1];
831 streams[i].max_size = gb_streams[i].max_size;
832 streams[i].pixel_code =
833 gb_camera_gb_to_mbus(gb_streams[i].format);
835 *nstreams = gb_nstreams;
842 static int gb_camera_op_capture(void *priv, u32 request_id,
843 unsigned int streams, unsigned int num_frames,
844 size_t settings_size, const void *settings)
846 struct gb_camera *gcam = priv;
848 return gb_camera_capture(gcam, request_id, streams, num_frames,
849 settings_size, settings);
852 static int gb_camera_op_flush(void *priv, u32 *request_id)
854 struct gb_camera *gcam = priv;
856 return gb_camera_flush(gcam, request_id);
859 static const struct gb_camera_ops gb_cam_ops = {
860 .capabilities = gb_camera_op_capabilities,
861 .configure_streams = gb_camera_op_configure_streams,
862 .capture = gb_camera_op_capture,
863 .flush = gb_camera_op_flush,
866 /* -----------------------------------------------------------------------------
870 static ssize_t gb_camera_debugfs_capabilities(struct gb_camera *gcam,
871 char *buf, size_t len)
873 struct gb_camera_debugfs_buffer *buffer =
874 &gcam->debugfs.buffers[GB_CAMERA_DEBUGFS_BUFFER_CAPABILITIES];
880 caps = kmalloc(size, GFP_KERNEL);
884 ret = gb_camera_capabilities(gcam, caps, &size);
889 * hex_dump_to_buffer() doesn't return the number of bytes dumped prior
890 * to v4.0, we need our own implementation :-(
894 for (i = 0; i < size; i += 16) {
895 unsigned int nbytes = min_t(unsigned int, size - i, 16);
897 buffer->length += sprintf(buffer->data + buffer->length,
898 "%*ph\n", nbytes, caps + i);
906 static ssize_t gb_camera_debugfs_configure_streams(struct gb_camera *gcam,
907 char *buf, size_t len)
909 struct gb_camera_debugfs_buffer *buffer =
910 &gcam->debugfs.buffers[GB_CAMERA_DEBUGFS_BUFFER_STREAMS];
911 struct gb_camera_stream_config *streams;
912 unsigned int nstreams;
918 /* Retrieve number of streams to configure */
919 token = strsep(&buf, ";");
923 ret = kstrtouint(token, 10, &nstreams);
927 if (nstreams > GB_CAMERA_MAX_STREAMS)
930 token = strsep(&buf, ";");
934 ret = kstrtouint(token, 10, &flags);
938 /* For each stream to configure parse width, height and format */
939 streams = kcalloc(nstreams, sizeof(*streams), GFP_KERNEL);
943 for (i = 0; i < nstreams; ++i) {
944 struct gb_camera_stream_config *stream = &streams[i];
947 token = strsep(&buf, ";");
952 ret = kstrtouint(token, 10, &stream->width);
957 token = strsep(&buf, ";");
961 ret = kstrtouint(token, 10, &stream->height);
965 /* Image format code */
966 token = strsep(&buf, ";");
970 ret = kstrtouint(token, 16, &stream->format);
975 ret = gb_camera_configure_streams(gcam, &nstreams, &flags, streams,
980 buffer->length = sprintf(buffer->data, "%u;%u;", nstreams, flags);
982 for (i = 0; i < nstreams; ++i) {
983 struct gb_camera_stream_config *stream = &streams[i];
985 buffer->length += sprintf(buffer->data + buffer->length,
986 "%u;%u;%u;%u;%u;%u;%u;",
987 stream->width, stream->height,
988 stream->format, stream->vc,
989 stream->dt[0], stream->dt[1],
1000 static ssize_t gb_camera_debugfs_capture(struct gb_camera *gcam,
1001 char *buf, size_t len)
1003 unsigned int request_id;
1004 unsigned int streams_mask;
1005 unsigned int num_frames;
1010 token = strsep(&buf, ";");
1013 ret = kstrtouint(token, 10, &request_id);
1018 token = strsep(&buf, ";");
1021 ret = kstrtouint(token, 16, &streams_mask);
1025 /* number of frames */
1026 token = strsep(&buf, ";");
1029 ret = kstrtouint(token, 10, &num_frames);
1033 ret = gb_camera_capture(gcam, request_id, streams_mask, num_frames, 0,
1041 static ssize_t gb_camera_debugfs_flush(struct gb_camera *gcam,
1042 char *buf, size_t len)
1044 struct gb_camera_debugfs_buffer *buffer =
1045 &gcam->debugfs.buffers[GB_CAMERA_DEBUGFS_BUFFER_FLUSH];
1046 unsigned int req_id;
1049 ret = gb_camera_flush(gcam, &req_id);
1053 buffer->length = sprintf(buffer->data, "%u", req_id);
1058 struct gb_camera_debugfs_entry {
1061 unsigned int buffer;
1062 ssize_t (*execute)(struct gb_camera *gcam, char *buf, size_t len);
1065 static const struct gb_camera_debugfs_entry gb_camera_debugfs_entries[] = {
1067 .name = "capabilities",
1068 .mask = S_IFREG | 0444,
1069 .buffer = GB_CAMERA_DEBUGFS_BUFFER_CAPABILITIES,
1070 .execute = gb_camera_debugfs_capabilities,
1072 .name = "configure_streams",
1073 .mask = S_IFREG | 0666,
1074 .buffer = GB_CAMERA_DEBUGFS_BUFFER_STREAMS,
1075 .execute = gb_camera_debugfs_configure_streams,
1078 .mask = S_IFREG | 0666,
1079 .buffer = GB_CAMERA_DEBUGFS_BUFFER_CAPTURE,
1080 .execute = gb_camera_debugfs_capture,
1083 .mask = S_IFREG | 0666,
1084 .buffer = GB_CAMERA_DEBUGFS_BUFFER_FLUSH,
1085 .execute = gb_camera_debugfs_flush,
1089 static ssize_t gb_camera_debugfs_read(struct file *file, char __user *buf,
1090 size_t len, loff_t *offset)
1092 const struct gb_camera_debugfs_entry *op = file->private_data;
1093 struct gb_camera *gcam = file_inode(file)->i_private;
1094 struct gb_camera_debugfs_buffer *buffer;
1097 /* For read-only entries the operation is triggered by a read. */
1098 if (!(op->mask & 0222)) {
1099 ret = op->execute(gcam, NULL, 0);
1104 buffer = &gcam->debugfs.buffers[op->buffer];
1106 return simple_read_from_buffer(buf, len, offset, buffer->data,
1110 static ssize_t gb_camera_debugfs_write(struct file *file,
1111 const char __user *buf, size_t len,
1114 const struct gb_camera_debugfs_entry *op = file->private_data;
1115 struct gb_camera *gcam = file_inode(file)->i_private;
1122 kbuf = memdup_user_nul(buf, len);
1124 return PTR_ERR(kbuf);
1126 ret = op->execute(gcam, kbuf, len);
1133 static int gb_camera_debugfs_open(struct inode *inode, struct file *file)
1137 for (i = 0; i < ARRAY_SIZE(gb_camera_debugfs_entries); ++i) {
1138 const struct gb_camera_debugfs_entry *entry =
1139 &gb_camera_debugfs_entries[i];
1141 if (!strcmp(file->f_path.dentry->d_iname, entry->name)) {
1142 file->private_data = (void *)entry;
1150 static const struct file_operations gb_camera_debugfs_ops = {
1151 .open = gb_camera_debugfs_open,
1152 .read = gb_camera_debugfs_read,
1153 .write = gb_camera_debugfs_write,
1156 static int gb_camera_debugfs_init(struct gb_camera *gcam)
1158 struct gb_connection *connection = gcam->connection;
1163 * Create root debugfs entry and a file entry for each camera operation.
1165 snprintf(dirname, 27, "camera-%u.%u", connection->intf->interface_id,
1168 gcam->debugfs.root = debugfs_create_dir(dirname, gb_debugfs_get());
1170 gcam->debugfs.buffers =
1171 vmalloc(array_size(GB_CAMERA_DEBUGFS_BUFFER_MAX,
1172 sizeof(*gcam->debugfs.buffers)));
1173 if (!gcam->debugfs.buffers)
1176 for (i = 0; i < ARRAY_SIZE(gb_camera_debugfs_entries); ++i) {
1177 const struct gb_camera_debugfs_entry *entry =
1178 &gb_camera_debugfs_entries[i];
1180 gcam->debugfs.buffers[i].length = 0;
1182 debugfs_create_file(entry->name, entry->mask,
1183 gcam->debugfs.root, gcam,
1184 &gb_camera_debugfs_ops);
1190 static void gb_camera_debugfs_cleanup(struct gb_camera *gcam)
1192 debugfs_remove_recursive(gcam->debugfs.root);
1194 vfree(gcam->debugfs.buffers);
1197 /* -----------------------------------------------------------------------------
1201 static void gb_camera_cleanup(struct gb_camera *gcam)
1203 gb_camera_debugfs_cleanup(gcam);
1205 mutex_lock(&gcam->mutex);
1206 if (gcam->data_connection) {
1207 gb_connection_disable(gcam->data_connection);
1208 gb_connection_destroy(gcam->data_connection);
1209 gcam->data_connection = NULL;
1212 if (gcam->connection) {
1213 gb_connection_disable(gcam->connection);
1214 gb_connection_destroy(gcam->connection);
1215 gcam->connection = NULL;
1217 mutex_unlock(&gcam->mutex);
1220 static void gb_camera_release_module(struct kref *ref)
1222 struct gb_camera_module *cam_mod =
1223 container_of(ref, struct gb_camera_module, refcount);
1224 kfree(cam_mod->priv);
1227 static int gb_camera_probe(struct gb_bundle *bundle,
1228 const struct greybus_bundle_id *id)
1230 struct gb_connection *conn;
1231 struct gb_camera *gcam;
1232 u16 mgmt_cport_id = 0;
1233 u16 data_cport_id = 0;
1238 * The camera bundle must contain exactly two CPorts, one for the
1239 * camera management protocol and one for the camera data protocol.
1241 if (bundle->num_cports != 2)
1244 for (i = 0; i < bundle->num_cports; ++i) {
1245 struct greybus_descriptor_cport *desc = &bundle->cport_desc[i];
1247 switch (desc->protocol_id) {
1248 case GREYBUS_PROTOCOL_CAMERA_MGMT:
1249 mgmt_cport_id = le16_to_cpu(desc->id);
1251 case GREYBUS_PROTOCOL_CAMERA_DATA:
1252 data_cport_id = le16_to_cpu(desc->id);
1259 if (!mgmt_cport_id || !data_cport_id)
1262 gcam = kzalloc(sizeof(*gcam), GFP_KERNEL);
1266 mutex_init(&gcam->mutex);
1268 gcam->bundle = bundle;
1269 gcam->state = GB_CAMERA_STATE_UNCONFIGURED;
1270 gcam->data_cport_id = data_cport_id;
1272 conn = gb_connection_create(bundle, mgmt_cport_id,
1273 gb_camera_request_handler);
1275 ret = PTR_ERR(conn);
1279 gcam->connection = conn;
1280 gb_connection_set_data(conn, gcam);
1282 ret = gb_connection_enable(conn);
1286 ret = gb_camera_debugfs_init(gcam);
1290 gcam->module.priv = gcam;
1291 gcam->module.ops = &gb_cam_ops;
1292 gcam->module.interface_id = gcam->connection->intf->interface_id;
1293 gcam->module.release = gb_camera_release_module;
1294 ret = gb_camera_register(&gcam->module);
1298 greybus_set_drvdata(bundle, gcam);
1300 gb_pm_runtime_put_autosuspend(gcam->bundle);
1305 gb_camera_cleanup(gcam);
1310 static void gb_camera_disconnect(struct gb_bundle *bundle)
1312 struct gb_camera *gcam = greybus_get_drvdata(bundle);
1315 ret = gb_pm_runtime_get_sync(bundle);
1317 gb_pm_runtime_get_noresume(bundle);
1319 gb_camera_cleanup(gcam);
1320 gb_camera_unregister(&gcam->module);
1323 static const struct greybus_bundle_id gb_camera_id_table[] = {
1324 { GREYBUS_DEVICE_CLASS(GREYBUS_CLASS_CAMERA) },
1329 static int gb_camera_suspend(struct device *dev)
1331 struct gb_bundle *bundle = to_gb_bundle(dev);
1332 struct gb_camera *gcam = greybus_get_drvdata(bundle);
1334 if (gcam->data_connection)
1335 gb_connection_disable(gcam->data_connection);
1337 gb_connection_disable(gcam->connection);
1342 static int gb_camera_resume(struct device *dev)
1344 struct gb_bundle *bundle = to_gb_bundle(dev);
1345 struct gb_camera *gcam = greybus_get_drvdata(bundle);
1348 ret = gb_connection_enable(gcam->connection);
1350 gcam_err(gcam, "failed to enable connection: %d\n", ret);
1354 if (gcam->data_connection) {
1355 ret = gb_connection_enable(gcam->data_connection);
1358 "failed to enable data connection: %d\n", ret);
1367 static const struct dev_pm_ops gb_camera_pm_ops = {
1368 SET_RUNTIME_PM_OPS(gb_camera_suspend, gb_camera_resume, NULL)
1371 static struct greybus_driver gb_camera_driver = {
1373 .probe = gb_camera_probe,
1374 .disconnect = gb_camera_disconnect,
1375 .id_table = gb_camera_id_table,
1376 .driver.pm = &gb_camera_pm_ops,
1379 module_greybus_driver(gb_camera_driver);
1381 MODULE_LICENSE("GPL v2");