0001
0002
0003
0004
0005
0006
0007
0008
0009 #include <linux/debugfs.h>
0010 #include <linux/fs.h>
0011 #include <linux/kernel.h>
0012 #include <linux/module.h>
0013 #include <linux/slab.h>
0014 #include <linux/string.h>
0015 #include <linux/uaccess.h>
0016 #include <linux/vmalloc.h>
0017 #include <linux/greybus.h>
0018
0019 #include "gb-camera.h"
0020 #include "greybus_protocols.h"
0021
0022 enum gb_camera_debugs_buffer_id {
0023 GB_CAMERA_DEBUGFS_BUFFER_CAPABILITIES,
0024 GB_CAMERA_DEBUGFS_BUFFER_STREAMS,
0025 GB_CAMERA_DEBUGFS_BUFFER_CAPTURE,
0026 GB_CAMERA_DEBUGFS_BUFFER_FLUSH,
0027 GB_CAMERA_DEBUGFS_BUFFER_MAX,
0028 };
0029
0030 struct gb_camera_debugfs_buffer {
0031 char data[PAGE_SIZE];
0032 size_t length;
0033 };
0034
0035 enum gb_camera_state {
0036 GB_CAMERA_STATE_UNCONFIGURED,
0037 GB_CAMERA_STATE_CONFIGURED,
0038 };
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050 struct gb_camera {
0051 struct gb_bundle *bundle;
0052 struct gb_connection *connection;
0053 struct gb_connection *data_connection;
0054 u16 data_cport_id;
0055
0056 struct mutex mutex;
0057 enum gb_camera_state state;
0058
0059 struct {
0060 struct dentry *root;
0061 struct gb_camera_debugfs_buffer *buffers;
0062 } debugfs;
0063
0064 struct gb_camera_module module;
0065 };
0066
0067 struct gb_camera_stream_config {
0068 unsigned int width;
0069 unsigned int height;
0070 unsigned int format;
0071 unsigned int vc;
0072 unsigned int dt[2];
0073 unsigned int max_size;
0074 };
0075
0076 struct gb_camera_fmt_info {
0077 enum v4l2_mbus_pixelcode mbus_code;
0078 unsigned int gb_format;
0079 unsigned int bpp;
0080 };
0081
0082
0083 static const struct gb_camera_fmt_info gb_fmt_info[] = {
0084 {
0085 .mbus_code = V4L2_MBUS_FMT_UYVY8_1X16,
0086 .gb_format = 0x01,
0087 .bpp = 16,
0088 },
0089 {
0090 .mbus_code = V4L2_MBUS_FMT_NV12_1x8,
0091 .gb_format = 0x12,
0092 .bpp = 12,
0093 },
0094 {
0095 .mbus_code = V4L2_MBUS_FMT_NV21_1x8,
0096 .gb_format = 0x13,
0097 .bpp = 12,
0098 },
0099 {
0100 .mbus_code = V4L2_MBUS_FMT_YU12_1x8,
0101 .gb_format = 0x16,
0102 .bpp = 12,
0103 },
0104 {
0105 .mbus_code = V4L2_MBUS_FMT_YV12_1x8,
0106 .gb_format = 0x17,
0107 .bpp = 12,
0108 },
0109 {
0110 .mbus_code = V4L2_MBUS_FMT_JPEG_1X8,
0111 .gb_format = 0x40,
0112 .bpp = 0,
0113 },
0114 {
0115 .mbus_code = V4L2_MBUS_FMT_GB_CAM_METADATA_1X8,
0116 .gb_format = 0x41,
0117 .bpp = 0,
0118 },
0119 {
0120 .mbus_code = V4L2_MBUS_FMT_GB_CAM_DEBUG_DATA_1X8,
0121 .gb_format = 0x42,
0122 .bpp = 0,
0123 },
0124 {
0125 .mbus_code = V4L2_MBUS_FMT_SBGGR10_1X10,
0126 .gb_format = 0x80,
0127 .bpp = 10,
0128 },
0129 {
0130 .mbus_code = V4L2_MBUS_FMT_SGBRG10_1X10,
0131 .gb_format = 0x81,
0132 .bpp = 10,
0133 },
0134 {
0135 .mbus_code = V4L2_MBUS_FMT_SGRBG10_1X10,
0136 .gb_format = 0x82,
0137 .bpp = 10,
0138 },
0139 {
0140 .mbus_code = V4L2_MBUS_FMT_SRGGB10_1X10,
0141 .gb_format = 0x83,
0142 .bpp = 10,
0143 },
0144 {
0145 .mbus_code = V4L2_MBUS_FMT_SBGGR12_1X12,
0146 .gb_format = 0x84,
0147 .bpp = 12,
0148 },
0149 {
0150 .mbus_code = V4L2_MBUS_FMT_SGBRG12_1X12,
0151 .gb_format = 0x85,
0152 .bpp = 12,
0153 },
0154 {
0155 .mbus_code = V4L2_MBUS_FMT_SGRBG12_1X12,
0156 .gb_format = 0x86,
0157 .bpp = 12,
0158 },
0159 {
0160 .mbus_code = V4L2_MBUS_FMT_SRGGB12_1X12,
0161 .gb_format = 0x87,
0162 .bpp = 12,
0163 },
0164 };
0165
0166 static const struct gb_camera_fmt_info *gb_camera_get_format_info(u16 gb_fmt)
0167 {
0168 unsigned int i;
0169
0170 for (i = 0; i < ARRAY_SIZE(gb_fmt_info); i++) {
0171 if (gb_fmt_info[i].gb_format == gb_fmt)
0172 return &gb_fmt_info[i];
0173 }
0174
0175 return NULL;
0176 }
0177
0178 #define ES2_APB_CDSI0_CPORT 16
0179 #define ES2_APB_CDSI1_CPORT 17
0180
0181 #define GB_CAMERA_MAX_SETTINGS_SIZE 8192
0182
0183 #define gcam_dbg(gcam, format...) dev_dbg(&gcam->bundle->dev, format)
0184 #define gcam_info(gcam, format...) dev_info(&gcam->bundle->dev, format)
0185 #define gcam_err(gcam, format...) dev_err(&gcam->bundle->dev, format)
0186
0187 static int gb_camera_operation_sync_flags(struct gb_connection *connection,
0188 int type, unsigned int flags,
0189 void *request, size_t request_size,
0190 void *response, size_t *response_size)
0191 {
0192 struct gb_operation *operation;
0193 int ret;
0194
0195 operation = gb_operation_create_flags(connection, type, request_size,
0196 *response_size, flags,
0197 GFP_KERNEL);
0198 if (!operation)
0199 return -ENOMEM;
0200
0201 if (request_size)
0202 memcpy(operation->request->payload, request, request_size);
0203
0204 ret = gb_operation_request_send_sync(operation);
0205 if (ret) {
0206 dev_err(&connection->hd->dev,
0207 "%s: synchronous operation of type 0x%02x failed: %d\n",
0208 connection->name, type, ret);
0209 } else {
0210 *response_size = operation->response->payload_size;
0211
0212 if (operation->response->payload_size)
0213 memcpy(response, operation->response->payload,
0214 operation->response->payload_size);
0215 }
0216
0217 gb_operation_put(operation);
0218
0219 return ret;
0220 }
0221
0222 static int gb_camera_get_max_pkt_size(struct gb_camera *gcam,
0223 struct gb_camera_configure_streams_response *resp)
0224 {
0225 unsigned int max_pkt_size = 0;
0226 unsigned int i;
0227
0228 for (i = 0; i < resp->num_streams; i++) {
0229 struct gb_camera_stream_config_response *cfg = &resp->config[i];
0230 const struct gb_camera_fmt_info *fmt_info;
0231 unsigned int pkt_size;
0232
0233 fmt_info = gb_camera_get_format_info(cfg->format);
0234 if (!fmt_info) {
0235 gcam_err(gcam, "unsupported greybus image format: %d\n",
0236 cfg->format);
0237 return -EIO;
0238 }
0239
0240 if (fmt_info->bpp == 0) {
0241 pkt_size = le32_to_cpu(cfg->max_pkt_size);
0242
0243 if (pkt_size == 0) {
0244 gcam_err(gcam,
0245 "Stream %u: invalid zero maximum packet size\n",
0246 i);
0247 return -EIO;
0248 }
0249 } else {
0250 pkt_size = le16_to_cpu(cfg->width) * fmt_info->bpp / 8;
0251
0252 if (pkt_size != le32_to_cpu(cfg->max_pkt_size)) {
0253 gcam_err(gcam,
0254 "Stream %u: maximum packet size mismatch (%u/%u)\n",
0255 i, pkt_size, cfg->max_pkt_size);
0256 return -EIO;
0257 }
0258 }
0259
0260 max_pkt_size = max(pkt_size, max_pkt_size);
0261 }
0262
0263 return max_pkt_size;
0264 }
0265
0266
0267
0268
0269
0270 static const int gb_camera_configure_streams_validate_response(
0271 struct gb_camera *gcam,
0272 struct gb_camera_configure_streams_response *resp,
0273 unsigned int nstreams)
0274 {
0275 unsigned int i;
0276
0277
0278 if (resp->padding[0] || resp->padding[1]) {
0279 gcam_err(gcam, "response padding != 0\n");
0280 return -EIO;
0281 }
0282
0283 if (resp->num_streams > nstreams) {
0284 gcam_err(gcam, "got #streams %u > request %u\n",
0285 resp->num_streams, nstreams);
0286 return -EIO;
0287 }
0288
0289 for (i = 0; i < resp->num_streams; i++) {
0290 struct gb_camera_stream_config_response *cfg = &resp->config[i];
0291
0292 if (cfg->padding) {
0293 gcam_err(gcam, "stream #%u padding != 0\n", i);
0294 return -EIO;
0295 }
0296 }
0297
0298 return 0;
0299 }
0300
0301
0302
0303
0304
0305 static int gb_camera_set_intf_power_mode(struct gb_camera *gcam, u8 intf_id,
0306 bool hs)
0307 {
0308 struct gb_svc *svc = gcam->connection->hd->svc;
0309 int ret;
0310
0311 if (hs)
0312 ret = gb_svc_intf_set_power_mode(svc, intf_id,
0313 GB_SVC_UNIPRO_HS_SERIES_A,
0314 GB_SVC_UNIPRO_FAST_MODE, 2, 2,
0315 GB_SVC_SMALL_AMPLITUDE,
0316 GB_SVC_NO_DE_EMPHASIS,
0317 GB_SVC_UNIPRO_FAST_MODE, 2, 2,
0318 GB_SVC_PWRM_RXTERMINATION |
0319 GB_SVC_PWRM_TXTERMINATION, 0,
0320 NULL, NULL);
0321 else
0322 ret = gb_svc_intf_set_power_mode(svc, intf_id,
0323 GB_SVC_UNIPRO_HS_SERIES_A,
0324 GB_SVC_UNIPRO_SLOW_AUTO_MODE,
0325 2, 1,
0326 GB_SVC_SMALL_AMPLITUDE,
0327 GB_SVC_NO_DE_EMPHASIS,
0328 GB_SVC_UNIPRO_SLOW_AUTO_MODE,
0329 2, 1,
0330 0, 0,
0331 NULL, NULL);
0332
0333 return ret;
0334 }
0335
0336 static int gb_camera_set_power_mode(struct gb_camera *gcam, bool hs)
0337 {
0338 struct gb_interface *intf = gcam->connection->intf;
0339 struct gb_svc *svc = gcam->connection->hd->svc;
0340 int ret;
0341
0342 ret = gb_camera_set_intf_power_mode(gcam, intf->interface_id, hs);
0343 if (ret < 0) {
0344 gcam_err(gcam, "failed to set module interface to %s (%d)\n",
0345 hs ? "HS" : "PWM", ret);
0346 return ret;
0347 }
0348
0349 ret = gb_camera_set_intf_power_mode(gcam, svc->ap_intf_id, hs);
0350 if (ret < 0) {
0351 gb_camera_set_intf_power_mode(gcam, intf->interface_id, !hs);
0352 gcam_err(gcam, "failed to set AP interface to %s (%d)\n",
0353 hs ? "HS" : "PWM", ret);
0354 return ret;
0355 }
0356
0357 return 0;
0358 }
0359
0360 struct ap_csi_config_request {
0361 __u8 csi_id;
0362 __u8 flags;
0363 #define GB_CAMERA_CSI_FLAG_CLOCK_CONTINUOUS 0x01
0364 __u8 num_lanes;
0365 __u8 padding;
0366 __le32 csi_clk_freq;
0367 __le32 max_pkt_size;
0368 } __packed;
0369
0370
0371
0372
0373
0374 #define GB_CAMERA_CSI_NUM_DATA_LANES 4
0375
0376 #define GB_CAMERA_CSI_CLK_FREQ_MAX 999000000U
0377 #define GB_CAMERA_CSI_CLK_FREQ_MIN 100000000U
0378 #define GB_CAMERA_CSI_CLK_FREQ_MARGIN 150000000U
0379
0380 static int gb_camera_setup_data_connection(struct gb_camera *gcam,
0381 struct gb_camera_configure_streams_response *resp,
0382 struct gb_camera_csi_params *csi_params)
0383 {
0384 struct ap_csi_config_request csi_cfg;
0385 struct gb_connection *conn;
0386 unsigned int clk_freq;
0387 int ret;
0388
0389
0390
0391
0392
0393 conn = gb_connection_create_offloaded(gcam->bundle, gcam->data_cport_id,
0394 GB_CONNECTION_FLAG_NO_FLOWCTRL |
0395 GB_CONNECTION_FLAG_CDSI1);
0396 if (IS_ERR(conn))
0397 return PTR_ERR(conn);
0398
0399 gcam->data_connection = conn;
0400 gb_connection_set_data(conn, gcam);
0401
0402 ret = gb_connection_enable(conn);
0403 if (ret)
0404 goto error_conn_destroy;
0405
0406
0407 ret = gb_camera_set_power_mode(gcam, true);
0408 if (ret < 0)
0409 goto error_conn_disable;
0410
0411
0412
0413
0414
0415
0416
0417 memset(&csi_cfg, 0, sizeof(csi_cfg));
0418 csi_cfg.csi_id = 1;
0419 csi_cfg.flags = 0;
0420 csi_cfg.num_lanes = GB_CAMERA_CSI_NUM_DATA_LANES;
0421
0422 clk_freq = resp->data_rate / 2 / GB_CAMERA_CSI_NUM_DATA_LANES;
0423 clk_freq = clamp(clk_freq + GB_CAMERA_CSI_CLK_FREQ_MARGIN,
0424 GB_CAMERA_CSI_CLK_FREQ_MIN,
0425 GB_CAMERA_CSI_CLK_FREQ_MAX);
0426 csi_cfg.csi_clk_freq = clk_freq;
0427
0428 ret = gb_camera_get_max_pkt_size(gcam, resp);
0429 if (ret < 0) {
0430 ret = -EIO;
0431 goto error_power;
0432 }
0433 csi_cfg.max_pkt_size = ret;
0434
0435 ret = gb_hd_output(gcam->connection->hd, &csi_cfg,
0436 sizeof(csi_cfg),
0437 GB_APB_REQUEST_CSI_TX_CONTROL, false);
0438 if (ret < 0) {
0439 gcam_err(gcam, "failed to start the CSI transmitter\n");
0440 goto error_power;
0441 }
0442
0443 if (csi_params) {
0444 csi_params->clk_freq = csi_cfg.csi_clk_freq;
0445 csi_params->num_lanes = csi_cfg.num_lanes;
0446 }
0447
0448 return 0;
0449
0450 error_power:
0451 gb_camera_set_power_mode(gcam, false);
0452 error_conn_disable:
0453 gb_connection_disable(gcam->data_connection);
0454 error_conn_destroy:
0455 gb_connection_destroy(gcam->data_connection);
0456 gcam->data_connection = NULL;
0457 return ret;
0458 }
0459
0460 static void gb_camera_teardown_data_connection(struct gb_camera *gcam)
0461 {
0462 struct ap_csi_config_request csi_cfg;
0463 int ret;
0464
0465
0466 memset(&csi_cfg, 0, sizeof(csi_cfg));
0467 csi_cfg.csi_id = 1;
0468
0469 ret = gb_hd_output(gcam->connection->hd, &csi_cfg,
0470 sizeof(csi_cfg),
0471 GB_APB_REQUEST_CSI_TX_CONTROL, false);
0472
0473 if (ret < 0)
0474 gcam_err(gcam, "failed to stop the CSI transmitter\n");
0475
0476
0477 gb_camera_set_power_mode(gcam, false);
0478
0479
0480 gb_connection_disable(gcam->data_connection);
0481 gb_connection_destroy(gcam->data_connection);
0482 gcam->data_connection = NULL;
0483 }
0484
0485
0486
0487
0488
0489 static int gb_camera_capabilities(struct gb_camera *gcam,
0490 u8 *capabilities, size_t *size)
0491 {
0492 int ret;
0493
0494 ret = gb_pm_runtime_get_sync(gcam->bundle);
0495 if (ret)
0496 return ret;
0497
0498 mutex_lock(&gcam->mutex);
0499
0500 if (!gcam->connection) {
0501 ret = -EINVAL;
0502 goto done;
0503 }
0504
0505 ret = gb_camera_operation_sync_flags(gcam->connection,
0506 GB_CAMERA_TYPE_CAPABILITIES,
0507 GB_OPERATION_FLAG_SHORT_RESPONSE,
0508 NULL, 0,
0509 (void *)capabilities, size);
0510 if (ret)
0511 gcam_err(gcam, "failed to retrieve capabilities: %d\n", ret);
0512
0513 done:
0514 mutex_unlock(&gcam->mutex);
0515
0516 gb_pm_runtime_put_autosuspend(gcam->bundle);
0517
0518 return ret;
0519 }
0520
0521 static int gb_camera_configure_streams(struct gb_camera *gcam,
0522 unsigned int *num_streams,
0523 unsigned int *flags,
0524 struct gb_camera_stream_config *streams,
0525 struct gb_camera_csi_params *csi_params)
0526 {
0527 struct gb_camera_configure_streams_request *req;
0528 struct gb_camera_configure_streams_response *resp;
0529 unsigned int nstreams = *num_streams;
0530 unsigned int i;
0531 size_t req_size;
0532 size_t resp_size;
0533 int ret;
0534
0535 if (nstreams > GB_CAMERA_MAX_STREAMS)
0536 return -EINVAL;
0537
0538 req_size = sizeof(*req) + nstreams * sizeof(req->config[0]);
0539 resp_size = sizeof(*resp) + nstreams * sizeof(resp->config[0]);
0540
0541 req = kmalloc(req_size, GFP_KERNEL);
0542 resp = kmalloc(resp_size, GFP_KERNEL);
0543 if (!req || !resp) {
0544 kfree(req);
0545 kfree(resp);
0546 return -ENOMEM;
0547 }
0548
0549 req->num_streams = nstreams;
0550 req->flags = *flags;
0551 req->padding = 0;
0552
0553 for (i = 0; i < nstreams; ++i) {
0554 struct gb_camera_stream_config_request *cfg = &req->config[i];
0555
0556 cfg->width = cpu_to_le16(streams[i].width);
0557 cfg->height = cpu_to_le16(streams[i].height);
0558 cfg->format = cpu_to_le16(streams[i].format);
0559 cfg->padding = 0;
0560 }
0561
0562 mutex_lock(&gcam->mutex);
0563
0564 ret = gb_pm_runtime_get_sync(gcam->bundle);
0565 if (ret)
0566 goto done_skip_pm_put;
0567
0568 if (!gcam->connection) {
0569 ret = -EINVAL;
0570 goto done;
0571 }
0572
0573 ret = gb_camera_operation_sync_flags(gcam->connection,
0574 GB_CAMERA_TYPE_CONFIGURE_STREAMS,
0575 GB_OPERATION_FLAG_SHORT_RESPONSE,
0576 req, req_size,
0577 resp, &resp_size);
0578 if (ret < 0)
0579 goto done;
0580
0581 ret = gb_camera_configure_streams_validate_response(gcam, resp,
0582 nstreams);
0583 if (ret < 0)
0584 goto done;
0585
0586 *flags = resp->flags;
0587 *num_streams = resp->num_streams;
0588
0589 for (i = 0; i < resp->num_streams; ++i) {
0590 struct gb_camera_stream_config_response *cfg = &resp->config[i];
0591
0592 streams[i].width = le16_to_cpu(cfg->width);
0593 streams[i].height = le16_to_cpu(cfg->height);
0594 streams[i].format = le16_to_cpu(cfg->format);
0595 streams[i].vc = cfg->virtual_channel;
0596 streams[i].dt[0] = cfg->data_type[0];
0597 streams[i].dt[1] = cfg->data_type[1];
0598 streams[i].max_size = le32_to_cpu(cfg->max_size);
0599 }
0600
0601 if ((resp->flags & GB_CAMERA_CONFIGURE_STREAMS_ADJUSTED) ||
0602 (req->flags & GB_CAMERA_CONFIGURE_STREAMS_TEST_ONLY))
0603 goto done;
0604
0605 if (gcam->state == GB_CAMERA_STATE_CONFIGURED) {
0606 gb_camera_teardown_data_connection(gcam);
0607 gcam->state = GB_CAMERA_STATE_UNCONFIGURED;
0608
0609
0610
0611
0612
0613
0614
0615
0616 gb_pm_runtime_put_noidle(gcam->bundle);
0617 }
0618
0619 if (resp->num_streams == 0)
0620 goto done;
0621
0622
0623
0624
0625
0626 gb_pm_runtime_get_noresume(gcam->bundle);
0627
0628
0629 ret = gb_camera_setup_data_connection(gcam, resp, csi_params);
0630 if (ret < 0) {
0631 memset(req, 0, sizeof(*req));
0632 gb_operation_sync(gcam->connection,
0633 GB_CAMERA_TYPE_CONFIGURE_STREAMS,
0634 req, sizeof(*req),
0635 resp, sizeof(*resp));
0636 *flags = 0;
0637 *num_streams = 0;
0638 gb_pm_runtime_put_noidle(gcam->bundle);
0639 goto done;
0640 }
0641
0642 gcam->state = GB_CAMERA_STATE_CONFIGURED;
0643
0644 done:
0645 gb_pm_runtime_put_autosuspend(gcam->bundle);
0646
0647 done_skip_pm_put:
0648 mutex_unlock(&gcam->mutex);
0649 kfree(req);
0650 kfree(resp);
0651 return ret;
0652 }
0653
0654 static int gb_camera_capture(struct gb_camera *gcam, u32 request_id,
0655 unsigned int streams, unsigned int num_frames,
0656 size_t settings_size, const void *settings)
0657 {
0658 struct gb_camera_capture_request *req;
0659 size_t req_size;
0660 int ret;
0661
0662 if (settings_size > GB_CAMERA_MAX_SETTINGS_SIZE)
0663 return -EINVAL;
0664
0665 req_size = sizeof(*req) + settings_size;
0666 req = kmalloc(req_size, GFP_KERNEL);
0667 if (!req)
0668 return -ENOMEM;
0669
0670 req->request_id = cpu_to_le32(request_id);
0671 req->streams = streams;
0672 req->padding = 0;
0673 req->num_frames = cpu_to_le16(num_frames);
0674 memcpy(req->settings, settings, settings_size);
0675
0676 mutex_lock(&gcam->mutex);
0677
0678 if (!gcam->connection) {
0679 ret = -EINVAL;
0680 goto done;
0681 }
0682
0683 ret = gb_operation_sync(gcam->connection, GB_CAMERA_TYPE_CAPTURE,
0684 req, req_size, NULL, 0);
0685 done:
0686 mutex_unlock(&gcam->mutex);
0687
0688 kfree(req);
0689
0690 return ret;
0691 }
0692
0693 static int gb_camera_flush(struct gb_camera *gcam, u32 *request_id)
0694 {
0695 struct gb_camera_flush_response resp;
0696 int ret;
0697
0698 mutex_lock(&gcam->mutex);
0699
0700 if (!gcam->connection) {
0701 ret = -EINVAL;
0702 goto done;
0703 }
0704
0705 ret = gb_operation_sync(gcam->connection, GB_CAMERA_TYPE_FLUSH, NULL, 0,
0706 &resp, sizeof(resp));
0707
0708 if (ret < 0)
0709 goto done;
0710
0711 if (request_id)
0712 *request_id = le32_to_cpu(resp.request_id);
0713
0714 done:
0715 mutex_unlock(&gcam->mutex);
0716
0717 return ret;
0718 }
0719
0720 static int gb_camera_request_handler(struct gb_operation *op)
0721 {
0722 struct gb_camera *gcam = gb_connection_get_data(op->connection);
0723 struct gb_camera_metadata_request *payload;
0724 struct gb_message *request;
0725
0726 if (op->type != GB_CAMERA_TYPE_METADATA) {
0727 gcam_err(gcam, "Unsupported unsolicited event: %u\n", op->type);
0728 return -EINVAL;
0729 }
0730
0731 request = op->request;
0732
0733 if (request->payload_size < sizeof(*payload)) {
0734 gcam_err(gcam, "Wrong event size received (%zu < %zu)\n",
0735 request->payload_size, sizeof(*payload));
0736 return -EINVAL;
0737 }
0738
0739 payload = request->payload;
0740
0741 gcam_dbg(gcam, "received metadata for request %u, frame %u, stream %u\n",
0742 payload->request_id, payload->frame_number, payload->stream);
0743
0744 return 0;
0745 }
0746
0747
0748
0749
0750 static unsigned int gb_camera_mbus_to_gb(enum v4l2_mbus_pixelcode mbus_code)
0751 {
0752 unsigned int i;
0753
0754 for (i = 0; i < ARRAY_SIZE(gb_fmt_info); i++) {
0755 if (gb_fmt_info[i].mbus_code == mbus_code)
0756 return gb_fmt_info[i].gb_format;
0757 }
0758 return gb_fmt_info[0].gb_format;
0759 }
0760
0761 static enum v4l2_mbus_pixelcode gb_camera_gb_to_mbus(u16 gb_fmt)
0762 {
0763 unsigned int i;
0764
0765 for (i = 0; i < ARRAY_SIZE(gb_fmt_info); i++) {
0766 if (gb_fmt_info[i].gb_format == gb_fmt)
0767 return gb_fmt_info[i].mbus_code;
0768 }
0769 return gb_fmt_info[0].mbus_code;
0770 }
0771
0772 static ssize_t gb_camera_op_capabilities(void *priv, char *data, size_t len)
0773 {
0774 struct gb_camera *gcam = priv;
0775 size_t capabilities_len = len;
0776 int ret;
0777
0778 ret = gb_camera_capabilities(gcam, data, &capabilities_len);
0779 if (ret)
0780 return ret;
0781
0782 return capabilities_len;
0783 }
0784
0785 static int gb_camera_op_configure_streams(void *priv, unsigned int *nstreams,
0786 unsigned int *flags, struct gb_camera_stream *streams,
0787 struct gb_camera_csi_params *csi_params)
0788 {
0789 struct gb_camera *gcam = priv;
0790 struct gb_camera_stream_config *gb_streams;
0791 unsigned int gb_flags = 0;
0792 unsigned int gb_nstreams = *nstreams;
0793 unsigned int i;
0794 int ret;
0795
0796 if (gb_nstreams > GB_CAMERA_MAX_STREAMS)
0797 return -EINVAL;
0798
0799 gb_streams = kcalloc(gb_nstreams, sizeof(*gb_streams), GFP_KERNEL);
0800 if (!gb_streams)
0801 return -ENOMEM;
0802
0803 for (i = 0; i < gb_nstreams; i++) {
0804 gb_streams[i].width = streams[i].width;
0805 gb_streams[i].height = streams[i].height;
0806 gb_streams[i].format =
0807 gb_camera_mbus_to_gb(streams[i].pixel_code);
0808 }
0809
0810 if (*flags & GB_CAMERA_IN_FLAG_TEST)
0811 gb_flags |= GB_CAMERA_CONFIGURE_STREAMS_TEST_ONLY;
0812
0813 ret = gb_camera_configure_streams(gcam, &gb_nstreams,
0814 &gb_flags, gb_streams, csi_params);
0815 if (ret < 0)
0816 goto done;
0817 if (gb_nstreams > *nstreams) {
0818 ret = -EINVAL;
0819 goto done;
0820 }
0821
0822 *flags = 0;
0823 if (gb_flags & GB_CAMERA_CONFIGURE_STREAMS_ADJUSTED)
0824 *flags |= GB_CAMERA_OUT_FLAG_ADJUSTED;
0825
0826 for (i = 0; i < gb_nstreams; i++) {
0827 streams[i].width = gb_streams[i].width;
0828 streams[i].height = gb_streams[i].height;
0829 streams[i].vc = gb_streams[i].vc;
0830 streams[i].dt[0] = gb_streams[i].dt[0];
0831 streams[i].dt[1] = gb_streams[i].dt[1];
0832 streams[i].max_size = gb_streams[i].max_size;
0833 streams[i].pixel_code =
0834 gb_camera_gb_to_mbus(gb_streams[i].format);
0835 }
0836 *nstreams = gb_nstreams;
0837
0838 done:
0839 kfree(gb_streams);
0840 return ret;
0841 }
0842
0843 static int gb_camera_op_capture(void *priv, u32 request_id,
0844 unsigned int streams, unsigned int num_frames,
0845 size_t settings_size, const void *settings)
0846 {
0847 struct gb_camera *gcam = priv;
0848
0849 return gb_camera_capture(gcam, request_id, streams, num_frames,
0850 settings_size, settings);
0851 }
0852
0853 static int gb_camera_op_flush(void *priv, u32 *request_id)
0854 {
0855 struct gb_camera *gcam = priv;
0856
0857 return gb_camera_flush(gcam, request_id);
0858 }
0859
0860 static const struct gb_camera_ops gb_cam_ops = {
0861 .capabilities = gb_camera_op_capabilities,
0862 .configure_streams = gb_camera_op_configure_streams,
0863 .capture = gb_camera_op_capture,
0864 .flush = gb_camera_op_flush,
0865 };
0866
0867
0868
0869
0870
0871 static ssize_t gb_camera_debugfs_capabilities(struct gb_camera *gcam,
0872 char *buf, size_t len)
0873 {
0874 struct gb_camera_debugfs_buffer *buffer =
0875 &gcam->debugfs.buffers[GB_CAMERA_DEBUGFS_BUFFER_CAPABILITIES];
0876 size_t size = 1024;
0877 unsigned int i;
0878 u8 *caps;
0879 int ret;
0880
0881 caps = kmalloc(size, GFP_KERNEL);
0882 if (!caps)
0883 return -ENOMEM;
0884
0885 ret = gb_camera_capabilities(gcam, caps, &size);
0886 if (ret < 0)
0887 goto done;
0888
0889
0890
0891
0892
0893 buffer->length = 0;
0894
0895 for (i = 0; i < size; i += 16) {
0896 unsigned int nbytes = min_t(unsigned int, size - i, 16);
0897
0898 buffer->length += sprintf(buffer->data + buffer->length,
0899 "%*ph\n", nbytes, caps + i);
0900 }
0901
0902 done:
0903 kfree(caps);
0904 return ret;
0905 }
0906
0907 static ssize_t gb_camera_debugfs_configure_streams(struct gb_camera *gcam,
0908 char *buf, size_t len)
0909 {
0910 struct gb_camera_debugfs_buffer *buffer =
0911 &gcam->debugfs.buffers[GB_CAMERA_DEBUGFS_BUFFER_STREAMS];
0912 struct gb_camera_stream_config *streams;
0913 unsigned int nstreams;
0914 unsigned int flags;
0915 unsigned int i;
0916 char *token;
0917 int ret;
0918
0919
0920 token = strsep(&buf, ";");
0921 if (!token)
0922 return -EINVAL;
0923
0924 ret = kstrtouint(token, 10, &nstreams);
0925 if (ret < 0)
0926 return ret;
0927
0928 if (nstreams > GB_CAMERA_MAX_STREAMS)
0929 return -EINVAL;
0930
0931 token = strsep(&buf, ";");
0932 if (!token)
0933 return -EINVAL;
0934
0935 ret = kstrtouint(token, 10, &flags);
0936 if (ret < 0)
0937 return ret;
0938
0939
0940 streams = kcalloc(nstreams, sizeof(*streams), GFP_KERNEL);
0941 if (!streams)
0942 return -ENOMEM;
0943
0944 for (i = 0; i < nstreams; ++i) {
0945 struct gb_camera_stream_config *stream = &streams[i];
0946
0947
0948 token = strsep(&buf, ";");
0949 if (!token) {
0950 ret = -EINVAL;
0951 goto done;
0952 }
0953 ret = kstrtouint(token, 10, &stream->width);
0954 if (ret < 0)
0955 goto done;
0956
0957
0958 token = strsep(&buf, ";");
0959 if (!token)
0960 goto done;
0961
0962 ret = kstrtouint(token, 10, &stream->height);
0963 if (ret < 0)
0964 goto done;
0965
0966
0967 token = strsep(&buf, ";");
0968 if (!token)
0969 goto done;
0970
0971 ret = kstrtouint(token, 16, &stream->format);
0972 if (ret < 0)
0973 goto done;
0974 }
0975
0976 ret = gb_camera_configure_streams(gcam, &nstreams, &flags, streams,
0977 NULL);
0978 if (ret < 0)
0979 goto done;
0980
0981 buffer->length = sprintf(buffer->data, "%u;%u;", nstreams, flags);
0982
0983 for (i = 0; i < nstreams; ++i) {
0984 struct gb_camera_stream_config *stream = &streams[i];
0985
0986 buffer->length += sprintf(buffer->data + buffer->length,
0987 "%u;%u;%u;%u;%u;%u;%u;",
0988 stream->width, stream->height,
0989 stream->format, stream->vc,
0990 stream->dt[0], stream->dt[1],
0991 stream->max_size);
0992 }
0993
0994 ret = len;
0995
0996 done:
0997 kfree(streams);
0998 return ret;
0999 };
1000
1001 static ssize_t gb_camera_debugfs_capture(struct gb_camera *gcam,
1002 char *buf, size_t len)
1003 {
1004 unsigned int request_id;
1005 unsigned int streams_mask;
1006 unsigned int num_frames;
1007 char *token;
1008 int ret;
1009
1010
1011 token = strsep(&buf, ";");
1012 if (!token)
1013 return -EINVAL;
1014 ret = kstrtouint(token, 10, &request_id);
1015 if (ret < 0)
1016 return ret;
1017
1018
1019 token = strsep(&buf, ";");
1020 if (!token)
1021 return -EINVAL;
1022 ret = kstrtouint(token, 16, &streams_mask);
1023 if (ret < 0)
1024 return ret;
1025
1026
1027 token = strsep(&buf, ";");
1028 if (!token)
1029 return -EINVAL;
1030 ret = kstrtouint(token, 10, &num_frames);
1031 if (ret < 0)
1032 return ret;
1033
1034 ret = gb_camera_capture(gcam, request_id, streams_mask, num_frames, 0,
1035 NULL);
1036 if (ret < 0)
1037 return ret;
1038
1039 return len;
1040 }
1041
1042 static ssize_t gb_camera_debugfs_flush(struct gb_camera *gcam,
1043 char *buf, size_t len)
1044 {
1045 struct gb_camera_debugfs_buffer *buffer =
1046 &gcam->debugfs.buffers[GB_CAMERA_DEBUGFS_BUFFER_FLUSH];
1047 unsigned int req_id;
1048 int ret;
1049
1050 ret = gb_camera_flush(gcam, &req_id);
1051 if (ret < 0)
1052 return ret;
1053
1054 buffer->length = sprintf(buffer->data, "%u", req_id);
1055
1056 return len;
1057 }
1058
1059 struct gb_camera_debugfs_entry {
1060 const char *name;
1061 unsigned int mask;
1062 unsigned int buffer;
1063 ssize_t (*execute)(struct gb_camera *gcam, char *buf, size_t len);
1064 };
1065
1066 static const struct gb_camera_debugfs_entry gb_camera_debugfs_entries[] = {
1067 {
1068 .name = "capabilities",
1069 .mask = S_IFREG | 0444,
1070 .buffer = GB_CAMERA_DEBUGFS_BUFFER_CAPABILITIES,
1071 .execute = gb_camera_debugfs_capabilities,
1072 }, {
1073 .name = "configure_streams",
1074 .mask = S_IFREG | 0666,
1075 .buffer = GB_CAMERA_DEBUGFS_BUFFER_STREAMS,
1076 .execute = gb_camera_debugfs_configure_streams,
1077 }, {
1078 .name = "capture",
1079 .mask = S_IFREG | 0666,
1080 .buffer = GB_CAMERA_DEBUGFS_BUFFER_CAPTURE,
1081 .execute = gb_camera_debugfs_capture,
1082 }, {
1083 .name = "flush",
1084 .mask = S_IFREG | 0666,
1085 .buffer = GB_CAMERA_DEBUGFS_BUFFER_FLUSH,
1086 .execute = gb_camera_debugfs_flush,
1087 },
1088 };
1089
1090 static ssize_t gb_camera_debugfs_read(struct file *file, char __user *buf,
1091 size_t len, loff_t *offset)
1092 {
1093 const struct gb_camera_debugfs_entry *op = file->private_data;
1094 struct gb_camera *gcam = file_inode(file)->i_private;
1095 struct gb_camera_debugfs_buffer *buffer;
1096 ssize_t ret;
1097
1098
1099 if (!(op->mask & 0222)) {
1100 ret = op->execute(gcam, NULL, 0);
1101 if (ret < 0)
1102 return ret;
1103 }
1104
1105 buffer = &gcam->debugfs.buffers[op->buffer];
1106
1107 return simple_read_from_buffer(buf, len, offset, buffer->data,
1108 buffer->length);
1109 }
1110
1111 static ssize_t gb_camera_debugfs_write(struct file *file,
1112 const char __user *buf, size_t len,
1113 loff_t *offset)
1114 {
1115 const struct gb_camera_debugfs_entry *op = file->private_data;
1116 struct gb_camera *gcam = file_inode(file)->i_private;
1117 ssize_t ret;
1118 char *kbuf;
1119
1120 if (len > 1024)
1121 return -EINVAL;
1122
1123 kbuf = memdup_user_nul(buf, len);
1124 if (IS_ERR(kbuf))
1125 return PTR_ERR(kbuf);
1126
1127 ret = op->execute(gcam, kbuf, len);
1128
1129 done:
1130 kfree(kbuf);
1131 return ret;
1132 }
1133
1134 static int gb_camera_debugfs_open(struct inode *inode, struct file *file)
1135 {
1136 unsigned int i;
1137
1138 for (i = 0; i < ARRAY_SIZE(gb_camera_debugfs_entries); ++i) {
1139 const struct gb_camera_debugfs_entry *entry =
1140 &gb_camera_debugfs_entries[i];
1141
1142 if (!strcmp(file->f_path.dentry->d_iname, entry->name)) {
1143 file->private_data = (void *)entry;
1144 break;
1145 }
1146 }
1147
1148 return 0;
1149 }
1150
1151 static const struct file_operations gb_camera_debugfs_ops = {
1152 .open = gb_camera_debugfs_open,
1153 .read = gb_camera_debugfs_read,
1154 .write = gb_camera_debugfs_write,
1155 };
1156
1157 static int gb_camera_debugfs_init(struct gb_camera *gcam)
1158 {
1159 struct gb_connection *connection = gcam->connection;
1160 char dirname[27];
1161 unsigned int i;
1162
1163
1164
1165
1166 snprintf(dirname, 27, "camera-%u.%u", connection->intf->interface_id,
1167 gcam->bundle->id);
1168
1169 gcam->debugfs.root = debugfs_create_dir(dirname, gb_debugfs_get());
1170
1171 gcam->debugfs.buffers =
1172 vmalloc(array_size(GB_CAMERA_DEBUGFS_BUFFER_MAX,
1173 sizeof(*gcam->debugfs.buffers)));
1174 if (!gcam->debugfs.buffers)
1175 return -ENOMEM;
1176
1177 for (i = 0; i < ARRAY_SIZE(gb_camera_debugfs_entries); ++i) {
1178 const struct gb_camera_debugfs_entry *entry =
1179 &gb_camera_debugfs_entries[i];
1180
1181 gcam->debugfs.buffers[i].length = 0;
1182
1183 debugfs_create_file(entry->name, entry->mask,
1184 gcam->debugfs.root, gcam,
1185 &gb_camera_debugfs_ops);
1186 }
1187
1188 return 0;
1189 }
1190
1191 static void gb_camera_debugfs_cleanup(struct gb_camera *gcam)
1192 {
1193 debugfs_remove_recursive(gcam->debugfs.root);
1194
1195 vfree(gcam->debugfs.buffers);
1196 }
1197
1198
1199
1200
1201
1202 static void gb_camera_cleanup(struct gb_camera *gcam)
1203 {
1204 gb_camera_debugfs_cleanup(gcam);
1205
1206 mutex_lock(&gcam->mutex);
1207 if (gcam->data_connection) {
1208 gb_connection_disable(gcam->data_connection);
1209 gb_connection_destroy(gcam->data_connection);
1210 gcam->data_connection = NULL;
1211 }
1212
1213 if (gcam->connection) {
1214 gb_connection_disable(gcam->connection);
1215 gb_connection_destroy(gcam->connection);
1216 gcam->connection = NULL;
1217 }
1218 mutex_unlock(&gcam->mutex);
1219 }
1220
1221 static void gb_camera_release_module(struct kref *ref)
1222 {
1223 struct gb_camera_module *cam_mod =
1224 container_of(ref, struct gb_camera_module, refcount);
1225 kfree(cam_mod->priv);
1226 }
1227
1228 static int gb_camera_probe(struct gb_bundle *bundle,
1229 const struct greybus_bundle_id *id)
1230 {
1231 struct gb_connection *conn;
1232 struct gb_camera *gcam;
1233 u16 mgmt_cport_id = 0;
1234 u16 data_cport_id = 0;
1235 unsigned int i;
1236 int ret;
1237
1238
1239
1240
1241
1242 if (bundle->num_cports != 2)
1243 return -ENODEV;
1244
1245 for (i = 0; i < bundle->num_cports; ++i) {
1246 struct greybus_descriptor_cport *desc = &bundle->cport_desc[i];
1247
1248 switch (desc->protocol_id) {
1249 case GREYBUS_PROTOCOL_CAMERA_MGMT:
1250 mgmt_cport_id = le16_to_cpu(desc->id);
1251 break;
1252 case GREYBUS_PROTOCOL_CAMERA_DATA:
1253 data_cport_id = le16_to_cpu(desc->id);
1254 break;
1255 default:
1256 return -ENODEV;
1257 }
1258 }
1259
1260 if (!mgmt_cport_id || !data_cport_id)
1261 return -ENODEV;
1262
1263 gcam = kzalloc(sizeof(*gcam), GFP_KERNEL);
1264 if (!gcam)
1265 return -ENOMEM;
1266
1267 mutex_init(&gcam->mutex);
1268
1269 gcam->bundle = bundle;
1270 gcam->state = GB_CAMERA_STATE_UNCONFIGURED;
1271 gcam->data_cport_id = data_cport_id;
1272
1273 conn = gb_connection_create(bundle, mgmt_cport_id,
1274 gb_camera_request_handler);
1275 if (IS_ERR(conn)) {
1276 ret = PTR_ERR(conn);
1277 goto error;
1278 }
1279
1280 gcam->connection = conn;
1281 gb_connection_set_data(conn, gcam);
1282
1283 ret = gb_connection_enable(conn);
1284 if (ret)
1285 goto error;
1286
1287 ret = gb_camera_debugfs_init(gcam);
1288 if (ret < 0)
1289 goto error;
1290
1291 gcam->module.priv = gcam;
1292 gcam->module.ops = &gb_cam_ops;
1293 gcam->module.interface_id = gcam->connection->intf->interface_id;
1294 gcam->module.release = gb_camera_release_module;
1295 ret = gb_camera_register(&gcam->module);
1296 if (ret < 0)
1297 goto error;
1298
1299 greybus_set_drvdata(bundle, gcam);
1300
1301 gb_pm_runtime_put_autosuspend(gcam->bundle);
1302
1303 return 0;
1304
1305 error:
1306 gb_camera_cleanup(gcam);
1307 kfree(gcam);
1308 return ret;
1309 }
1310
1311 static void gb_camera_disconnect(struct gb_bundle *bundle)
1312 {
1313 struct gb_camera *gcam = greybus_get_drvdata(bundle);
1314 int ret;
1315
1316 ret = gb_pm_runtime_get_sync(bundle);
1317 if (ret)
1318 gb_pm_runtime_get_noresume(bundle);
1319
1320 gb_camera_cleanup(gcam);
1321 gb_camera_unregister(&gcam->module);
1322 }
1323
1324 static const struct greybus_bundle_id gb_camera_id_table[] = {
1325 { GREYBUS_DEVICE_CLASS(GREYBUS_CLASS_CAMERA) },
1326 { },
1327 };
1328
1329 #ifdef CONFIG_PM
1330 static int gb_camera_suspend(struct device *dev)
1331 {
1332 struct gb_bundle *bundle = to_gb_bundle(dev);
1333 struct gb_camera *gcam = greybus_get_drvdata(bundle);
1334
1335 if (gcam->data_connection)
1336 gb_connection_disable(gcam->data_connection);
1337
1338 gb_connection_disable(gcam->connection);
1339
1340 return 0;
1341 }
1342
1343 static int gb_camera_resume(struct device *dev)
1344 {
1345 struct gb_bundle *bundle = to_gb_bundle(dev);
1346 struct gb_camera *gcam = greybus_get_drvdata(bundle);
1347 int ret;
1348
1349 ret = gb_connection_enable(gcam->connection);
1350 if (ret) {
1351 gcam_err(gcam, "failed to enable connection: %d\n", ret);
1352 return ret;
1353 }
1354
1355 if (gcam->data_connection) {
1356 ret = gb_connection_enable(gcam->data_connection);
1357 if (ret) {
1358 gcam_err(gcam,
1359 "failed to enable data connection: %d\n", ret);
1360 return ret;
1361 }
1362 }
1363
1364 return 0;
1365 }
1366 #endif
1367
1368 static const struct dev_pm_ops gb_camera_pm_ops = {
1369 SET_RUNTIME_PM_OPS(gb_camera_suspend, gb_camera_resume, NULL)
1370 };
1371
1372 static struct greybus_driver gb_camera_driver = {
1373 .name = "camera",
1374 .probe = gb_camera_probe,
1375 .disconnect = gb_camera_disconnect,
1376 .id_table = gb_camera_id_table,
1377 .driver.pm = &gb_camera_pm_ops,
1378 };
1379
1380 module_greybus_driver(gb_camera_driver);
1381
1382 MODULE_LICENSE("GPL v2");