1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * Copyright (C) 2020 NVIDIA CORPORATION. All rights reserved. 4 */ 5 6 #include <linux/clk.h> 7 #include <linux/clk/tegra.h> 8 #include <linux/device.h> 9 #include <linux/host1x.h> 10 #include <linux/module.h> 11 #include <linux/of.h> 12 #include <linux/of_graph.h> 13 #include <linux/platform_device.h> 14 #include <linux/pm_runtime.h> 15 16 #include <media/v4l2-fwnode.h> 17 18 #include "csi.h" 19 #include "video.h" 20 21 #define MHZ 1000000 22 23 static inline struct tegra_csi * 24 host1x_client_to_csi(struct host1x_client *client) 25 { 26 return container_of(client, struct tegra_csi, client); 27 } 28 29 static inline struct tegra_csi_channel *to_csi_chan(struct v4l2_subdev *subdev) 30 { 31 return container_of(subdev, struct tegra_csi_channel, subdev); 32 } 33 34 /* 35 * CSI is a separate subdevice which has 6 source pads to generate 36 * test pattern. CSI subdevice pad ops are used only for TPG and 37 * allows below TPG formats. 38 */ 39 static const struct v4l2_mbus_framefmt tegra_csi_tpg_fmts[] = { 40 { 41 TEGRA_DEF_WIDTH, 42 TEGRA_DEF_HEIGHT, 43 MEDIA_BUS_FMT_SRGGB10_1X10, 44 V4L2_FIELD_NONE, 45 V4L2_COLORSPACE_SRGB 46 }, 47 { 48 TEGRA_DEF_WIDTH, 49 TEGRA_DEF_HEIGHT, 50 MEDIA_BUS_FMT_RGB888_1X32_PADHI, 51 V4L2_FIELD_NONE, 52 V4L2_COLORSPACE_SRGB 53 }, 54 }; 55 56 static const struct v4l2_frmsize_discrete tegra_csi_tpg_sizes[] = { 57 { 1280, 720 }, 58 { 1920, 1080 }, 59 { 3840, 2160 }, 60 }; 61 62 /* 63 * V4L2 Subdevice Pad Operations 64 */ 65 static int csi_enum_bus_code(struct v4l2_subdev *subdev, 66 struct v4l2_subdev_state *sd_state, 67 struct v4l2_subdev_mbus_code_enum *code) 68 { 69 if (!IS_ENABLED(CONFIG_VIDEO_TEGRA_TPG)) 70 return -ENOIOCTLCMD; 71 72 if (code->index >= ARRAY_SIZE(tegra_csi_tpg_fmts)) 73 return -EINVAL; 74 75 code->code = tegra_csi_tpg_fmts[code->index].code; 76 77 return 0; 78 } 79 80 static int csi_get_format(struct v4l2_subdev *subdev, 81 struct v4l2_subdev_state *sd_state, 82 struct v4l2_subdev_format *fmt) 83 { 84 struct tegra_csi_channel *csi_chan = to_csi_chan(subdev); 85 86 if (!IS_ENABLED(CONFIG_VIDEO_TEGRA_TPG)) 87 return -ENOIOCTLCMD; 88 89 fmt->format = csi_chan->format; 90 91 return 0; 92 } 93 94 static int csi_get_frmrate_table_index(struct tegra_csi *csi, u32 code, 95 u32 width, u32 height) 96 { 97 const struct tpg_framerate *frmrate; 98 unsigned int i; 99 100 frmrate = csi->soc->tpg_frmrate_table; 101 for (i = 0; i < csi->soc->tpg_frmrate_table_size; i++) { 102 if (frmrate[i].code == code && 103 frmrate[i].frmsize.width == width && 104 frmrate[i].frmsize.height == height) { 105 return i; 106 } 107 } 108 109 return -EINVAL; 110 } 111 112 static void csi_chan_update_blank_intervals(struct tegra_csi_channel *csi_chan, 113 u32 code, u32 width, u32 height) 114 { 115 struct tegra_csi *csi = csi_chan->csi; 116 const struct tpg_framerate *frmrate = csi->soc->tpg_frmrate_table; 117 int index; 118 119 index = csi_get_frmrate_table_index(csi_chan->csi, code, 120 width, height); 121 if (index >= 0) { 122 csi_chan->h_blank = frmrate[index].h_blank; 123 csi_chan->v_blank = frmrate[index].v_blank; 124 csi_chan->framerate = frmrate[index].framerate; 125 } 126 } 127 128 static int csi_enum_framesizes(struct v4l2_subdev *subdev, 129 struct v4l2_subdev_state *sd_state, 130 struct v4l2_subdev_frame_size_enum *fse) 131 { 132 unsigned int i; 133 134 if (!IS_ENABLED(CONFIG_VIDEO_TEGRA_TPG)) 135 return -ENOIOCTLCMD; 136 137 if (fse->index >= ARRAY_SIZE(tegra_csi_tpg_sizes)) 138 return -EINVAL; 139 140 for (i = 0; i < ARRAY_SIZE(tegra_csi_tpg_fmts); i++) 141 if (fse->code == tegra_csi_tpg_fmts[i].code) 142 break; 143 144 if (i == ARRAY_SIZE(tegra_csi_tpg_fmts)) 145 return -EINVAL; 146 147 fse->min_width = tegra_csi_tpg_sizes[fse->index].width; 148 fse->max_width = tegra_csi_tpg_sizes[fse->index].width; 149 fse->min_height = tegra_csi_tpg_sizes[fse->index].height; 150 fse->max_height = tegra_csi_tpg_sizes[fse->index].height; 151 152 return 0; 153 } 154 155 static int csi_enum_frameintervals(struct v4l2_subdev *subdev, 156 struct v4l2_subdev_state *sd_state, 157 struct v4l2_subdev_frame_interval_enum *fie) 158 { 159 struct tegra_csi_channel *csi_chan = to_csi_chan(subdev); 160 struct tegra_csi *csi = csi_chan->csi; 161 const struct tpg_framerate *frmrate = csi->soc->tpg_frmrate_table; 162 int index; 163 164 if (!IS_ENABLED(CONFIG_VIDEO_TEGRA_TPG)) 165 return -ENOIOCTLCMD; 166 167 /* one framerate per format and resolution */ 168 if (fie->index > 0) 169 return -EINVAL; 170 171 index = csi_get_frmrate_table_index(csi_chan->csi, fie->code, 172 fie->width, fie->height); 173 if (index < 0) 174 return -EINVAL; 175 176 fie->interval.numerator = 1; 177 fie->interval.denominator = frmrate[index].framerate; 178 179 return 0; 180 } 181 182 static int csi_set_format(struct v4l2_subdev *subdev, 183 struct v4l2_subdev_state *sd_state, 184 struct v4l2_subdev_format *fmt) 185 { 186 struct tegra_csi_channel *csi_chan = to_csi_chan(subdev); 187 struct v4l2_mbus_framefmt *format = &fmt->format; 188 const struct v4l2_frmsize_discrete *sizes; 189 unsigned int i; 190 191 if (!IS_ENABLED(CONFIG_VIDEO_TEGRA_TPG)) 192 return -ENOIOCTLCMD; 193 194 sizes = v4l2_find_nearest_size(tegra_csi_tpg_sizes, 195 ARRAY_SIZE(tegra_csi_tpg_sizes), 196 width, height, 197 format->width, format->width); 198 format->width = sizes->width; 199 format->height = sizes->height; 200 201 for (i = 0; i < ARRAY_SIZE(tegra_csi_tpg_fmts); i++) 202 if (format->code == tegra_csi_tpg_fmts[i].code) 203 break; 204 205 if (i == ARRAY_SIZE(tegra_csi_tpg_fmts)) 206 i = 0; 207 208 format->code = tegra_csi_tpg_fmts[i].code; 209 format->field = V4L2_FIELD_NONE; 210 211 if (fmt->which == V4L2_SUBDEV_FORMAT_TRY) 212 return 0; 213 214 /* update blanking intervals from frame rate table and format */ 215 csi_chan_update_blank_intervals(csi_chan, format->code, 216 format->width, format->height); 217 csi_chan->format = *format; 218 219 return 0; 220 } 221 222 /* 223 * V4L2 Subdevice Video Operations 224 */ 225 static int tegra_csi_get_frame_interval(struct v4l2_subdev *subdev, 226 struct v4l2_subdev_state *sd_state, 227 struct v4l2_subdev_frame_interval *vfi) 228 { 229 struct tegra_csi_channel *csi_chan = to_csi_chan(subdev); 230 231 if (!IS_ENABLED(CONFIG_VIDEO_TEGRA_TPG)) 232 return -ENOIOCTLCMD; 233 234 /* 235 * FIXME: Implement support for V4L2_SUBDEV_FORMAT_TRY, using the V4L2 236 * subdev active state API. 237 */ 238 if (vfi->which != V4L2_SUBDEV_FORMAT_ACTIVE) 239 return -EINVAL; 240 241 vfi->interval.numerator = 1; 242 vfi->interval.denominator = csi_chan->framerate; 243 244 return 0; 245 } 246 247 static unsigned int csi_get_pixel_rate(struct tegra_csi_channel *csi_chan) 248 { 249 struct tegra_vi_channel *chan; 250 struct v4l2_subdev *src_subdev; 251 struct v4l2_ctrl *ctrl; 252 253 chan = v4l2_get_subdev_hostdata(&csi_chan->subdev); 254 src_subdev = tegra_channel_get_remote_source_subdev(chan); 255 ctrl = v4l2_ctrl_find(src_subdev->ctrl_handler, V4L2_CID_PIXEL_RATE); 256 if (ctrl) 257 return v4l2_ctrl_g_ctrl_int64(ctrl); 258 259 return 0; 260 } 261 262 void tegra_csi_calc_settle_time(struct tegra_csi_channel *csi_chan, 263 u8 csi_port_num, 264 u8 *clk_settle_time, 265 u8 *ths_settle_time) 266 { 267 struct tegra_csi *csi = csi_chan->csi; 268 unsigned int cil_clk_mhz; 269 unsigned int pix_clk_mhz; 270 int clk_idx = (csi_port_num >> 1) + 1; 271 272 cil_clk_mhz = clk_get_rate(csi->clks[clk_idx].clk) / MHZ; 273 pix_clk_mhz = csi_get_pixel_rate(csi_chan) / MHZ; 274 275 /* 276 * CLK Settle time is the interval during which HS receiver should 277 * ignore any clock lane HS transitions, starting from the beginning 278 * of T-CLK-PREPARE. 279 * Per DPHY specification, T-CLK-SETTLE should be between 95ns ~ 300ns 280 * 281 * 95ns < (clk-settle-programmed + 7) * lp clk period < 300ns 282 * midpoint = 197.5 ns 283 */ 284 *clk_settle_time = ((95 + 300) * cil_clk_mhz - 14000) / 2000; 285 286 /* 287 * THS Settle time is the interval during which HS receiver should 288 * ignore any data lane HS transitions, starting from the beginning 289 * of THS-PREPARE. 290 * 291 * Per DPHY specification, T-HS-SETTLE should be between 85ns + 6UI 292 * and 145ns+10UI. 293 * 85ns + 6UI < (Ths-settle-prog + 5) * lp_clk_period < 145ns + 10UI 294 * midpoint = 115ns + 8UI 295 */ 296 if (pix_clk_mhz) 297 *ths_settle_time = (115 * cil_clk_mhz + 8000 * cil_clk_mhz 298 / (2 * pix_clk_mhz) - 5000) / 1000; 299 } 300 301 static int tegra_csi_enable_stream(struct v4l2_subdev *subdev) 302 { 303 struct tegra_vi_channel *chan = v4l2_get_subdev_hostdata(subdev); 304 struct tegra_csi_channel *csi_chan = to_csi_chan(subdev); 305 struct tegra_csi *csi = csi_chan->csi; 306 int ret, err; 307 308 ret = pm_runtime_resume_and_get(csi->dev); 309 if (ret < 0) { 310 dev_err(csi->dev, "failed to get runtime PM: %d\n", ret); 311 return ret; 312 } 313 314 if (csi_chan->mipi) { 315 ret = tegra_mipi_enable(csi_chan->mipi); 316 if (ret < 0) { 317 dev_err(csi->dev, 318 "failed to enable MIPI pads: %d\n", ret); 319 goto rpm_put; 320 } 321 322 /* 323 * CSI MIPI pads PULLUP, PULLDN and TERM impedances need to 324 * be calibrated after power on. 325 * So, trigger the calibration start here and results will 326 * be latched and applied to the pads when link is in LP11 327 * state during start of sensor streaming. 328 */ 329 ret = tegra_mipi_start_calibration(csi_chan->mipi); 330 if (ret < 0) { 331 dev_err(csi->dev, 332 "failed to start MIPI calibration: %d\n", ret); 333 goto disable_mipi; 334 } 335 } 336 337 csi_chan->pg_mode = chan->pg_mode; 338 339 /* 340 * Tegra CSI receiver can detect the first LP to HS transition. 341 * So, start the CSI stream-on prior to sensor stream-on and 342 * vice-versa for stream-off. 343 */ 344 ret = csi->ops->csi_start_streaming(csi_chan); 345 if (ret < 0) 346 goto finish_calibration; 347 348 if (csi_chan->mipi) { 349 struct v4l2_subdev *src_subdev; 350 /* 351 * TRM has incorrectly documented to wait for done status from 352 * calibration logic after CSI interface power on. 353 * As per the design, calibration results are latched and applied 354 * to the pads only when the link is in LP11 state which will happen 355 * during the sensor stream-on. 356 * CSI subdev stream-on triggers start of MIPI pads calibration. 357 * Wait for calibration to finish here after sensor subdev stream-on. 358 */ 359 src_subdev = tegra_channel_get_remote_source_subdev(chan); 360 ret = v4l2_subdev_call(src_subdev, video, s_stream, true); 361 362 if (ret < 0 && ret != -ENOIOCTLCMD) 363 goto disable_csi_stream; 364 365 err = tegra_mipi_finish_calibration(csi_chan->mipi); 366 if (err < 0) 367 dev_warn(csi->dev, "MIPI calibration failed: %d\n", err); 368 } 369 370 return 0; 371 372 disable_csi_stream: 373 csi->ops->csi_stop_streaming(csi_chan); 374 finish_calibration: 375 if (csi_chan->mipi) 376 tegra_mipi_finish_calibration(csi_chan->mipi); 377 disable_mipi: 378 if (csi_chan->mipi) { 379 err = tegra_mipi_disable(csi_chan->mipi); 380 if (err < 0) 381 dev_err(csi->dev, 382 "failed to disable MIPI pads: %d\n", err); 383 } 384 385 rpm_put: 386 pm_runtime_put(csi->dev); 387 return ret; 388 } 389 390 static int tegra_csi_disable_stream(struct v4l2_subdev *subdev) 391 { 392 struct tegra_vi_channel *chan = v4l2_get_subdev_hostdata(subdev); 393 struct tegra_csi_channel *csi_chan = to_csi_chan(subdev); 394 struct tegra_csi *csi = csi_chan->csi; 395 int err; 396 397 /* 398 * Stream-off subdevices in reverse order to stream-on. 399 * Remote source subdev in TPG mode is same as CSI subdev. 400 */ 401 if (csi_chan->mipi) { 402 struct v4l2_subdev *src_subdev; 403 404 src_subdev = tegra_channel_get_remote_source_subdev(chan); 405 err = v4l2_subdev_call(src_subdev, video, s_stream, false); 406 if (err < 0 && err != -ENOIOCTLCMD) 407 dev_err_probe(csi->dev, err, "source subdev stream off failed\n"); 408 } 409 410 csi->ops->csi_stop_streaming(csi_chan); 411 412 if (csi_chan->mipi) { 413 err = tegra_mipi_disable(csi_chan->mipi); 414 if (err < 0) 415 dev_err(csi->dev, 416 "failed to disable MIPI pads: %d\n", err); 417 } 418 419 pm_runtime_put(csi->dev); 420 421 return 0; 422 } 423 424 static int tegra_csi_s_stream(struct v4l2_subdev *subdev, int enable) 425 { 426 int ret; 427 428 if (enable) 429 ret = tegra_csi_enable_stream(subdev); 430 else 431 ret = tegra_csi_disable_stream(subdev); 432 433 return ret; 434 } 435 436 /* 437 * V4L2 Subdevice Operations 438 */ 439 static const struct v4l2_subdev_video_ops tegra_csi_video_ops = { 440 .s_stream = tegra_csi_s_stream, 441 }; 442 443 static const struct v4l2_subdev_pad_ops tegra_csi_pad_ops = { 444 .enum_mbus_code = csi_enum_bus_code, 445 .enum_frame_size = csi_enum_framesizes, 446 .enum_frame_interval = csi_enum_frameintervals, 447 .get_fmt = csi_get_format, 448 .set_fmt = csi_set_format, 449 .get_frame_interval = tegra_csi_get_frame_interval, 450 .set_frame_interval = tegra_csi_get_frame_interval, 451 }; 452 453 static const struct v4l2_subdev_ops tegra_csi_ops = { 454 .video = &tegra_csi_video_ops, 455 .pad = &tegra_csi_pad_ops, 456 }; 457 458 static int tegra_csi_channel_alloc(struct tegra_csi *csi, 459 struct device_node *node, 460 unsigned int port_num, unsigned int lanes, 461 unsigned int num_pads) 462 { 463 struct tegra_csi_channel *chan; 464 int ret = 0, i; 465 466 chan = kzalloc(sizeof(*chan), GFP_KERNEL); 467 if (!chan) 468 return -ENOMEM; 469 470 list_add_tail(&chan->list, &csi->csi_chans); 471 chan->csi = csi; 472 /* 473 * Each CSI brick has maximum of 4 lanes. 474 * For lanes more than 4, use multiple of immediate CSI bricks as gang. 475 */ 476 if (lanes <= CSI_LANES_PER_BRICK) { 477 chan->numlanes = lanes; 478 chan->numgangports = 1; 479 } else { 480 chan->numlanes = CSI_LANES_PER_BRICK; 481 chan->numgangports = lanes / CSI_LANES_PER_BRICK; 482 } 483 484 for (i = 0; i < chan->numgangports; i++) 485 chan->csi_port_nums[i] = port_num + i * CSI_PORTS_PER_BRICK; 486 487 chan->of_node = of_node_get(node); 488 chan->numpads = num_pads; 489 if (num_pads & 0x2) { 490 chan->pads[0].flags = MEDIA_PAD_FL_SINK; 491 chan->pads[1].flags = MEDIA_PAD_FL_SOURCE; 492 } else { 493 chan->pads[0].flags = MEDIA_PAD_FL_SOURCE; 494 } 495 496 if (IS_ENABLED(CONFIG_VIDEO_TEGRA_TPG)) 497 return 0; 498 499 chan->mipi = tegra_mipi_request(csi->dev, node); 500 if (IS_ERR(chan->mipi)) { 501 ret = PTR_ERR(chan->mipi); 502 chan->mipi = NULL; 503 dev_err(csi->dev, "failed to get mipi device: %d\n", ret); 504 } 505 506 return ret; 507 } 508 509 static int tegra_csi_tpg_channels_alloc(struct tegra_csi *csi) 510 { 511 struct device_node *node = csi->dev->of_node; 512 unsigned int port_num; 513 unsigned int tpg_channels = csi->soc->csi_max_channels; 514 int ret; 515 516 /* allocate CSI channel for each CSI x2 ports */ 517 for (port_num = 0; port_num < tpg_channels; port_num++) { 518 ret = tegra_csi_channel_alloc(csi, node, port_num, 2, 1); 519 if (ret < 0) 520 return ret; 521 } 522 523 return 0; 524 } 525 526 static int tegra_csi_channels_alloc(struct tegra_csi *csi) 527 { 528 struct device_node *node = csi->dev->of_node; 529 struct v4l2_fwnode_endpoint v4l2_ep = { 530 .bus_type = V4L2_MBUS_CSI2_DPHY 531 }; 532 struct fwnode_handle *fwh; 533 struct device_node *channel; 534 struct device_node *ep; 535 unsigned int lanes, portno, num_pads; 536 int ret; 537 538 for_each_child_of_node(node, channel) { 539 if (!of_node_name_eq(channel, "channel")) 540 continue; 541 542 ret = of_property_read_u32(channel, "reg", &portno); 543 if (ret < 0) 544 continue; 545 546 if (portno >= csi->soc->csi_max_channels) { 547 dev_err(csi->dev, "invalid port num %d for %pOF\n", 548 portno, channel); 549 ret = -EINVAL; 550 goto err_node_put; 551 } 552 553 ep = of_graph_get_endpoint_by_regs(channel, 0, 0); 554 if (!ep) 555 continue; 556 557 fwh = of_fwnode_handle(ep); 558 ret = v4l2_fwnode_endpoint_parse(fwh, &v4l2_ep); 559 of_node_put(ep); 560 if (ret) { 561 dev_err(csi->dev, 562 "failed to parse v4l2 endpoint for %pOF: %d\n", 563 channel, ret); 564 goto err_node_put; 565 } 566 567 lanes = v4l2_ep.bus.mipi_csi2.num_data_lanes; 568 /* 569 * Each CSI brick has maximum 4 data lanes. 570 * For lanes more than 4, validate lanes to be multiple of 4 571 * so multiple of consecutive CSI bricks can be ganged up for 572 * streaming. 573 */ 574 if (!lanes || ((lanes & (lanes - 1)) != 0) || 575 (lanes > CSI_LANES_PER_BRICK && ((portno & 1) != 0))) { 576 dev_err(csi->dev, "invalid data-lanes %d for %pOF\n", 577 lanes, channel); 578 ret = -EINVAL; 579 goto err_node_put; 580 } 581 582 num_pads = of_graph_get_endpoint_count(channel); 583 if (num_pads == TEGRA_CSI_PADS_NUM) { 584 ret = tegra_csi_channel_alloc(csi, channel, portno, 585 lanes, num_pads); 586 if (ret < 0) 587 goto err_node_put; 588 } 589 } 590 591 return 0; 592 593 err_node_put: 594 of_node_put(channel); 595 return ret; 596 } 597 598 static int tegra_csi_channel_init(struct tegra_csi_channel *chan) 599 { 600 struct tegra_csi *csi = chan->csi; 601 struct v4l2_subdev *subdev; 602 int ret; 603 604 /* initialize the default format */ 605 chan->format.code = MEDIA_BUS_FMT_SRGGB10_1X10; 606 chan->format.field = V4L2_FIELD_NONE; 607 chan->format.colorspace = V4L2_COLORSPACE_SRGB; 608 chan->format.width = TEGRA_DEF_WIDTH; 609 chan->format.height = TEGRA_DEF_HEIGHT; 610 csi_chan_update_blank_intervals(chan, chan->format.code, 611 chan->format.width, 612 chan->format.height); 613 /* initialize V4L2 subdevice and media entity */ 614 subdev = &chan->subdev; 615 v4l2_subdev_init(subdev, &tegra_csi_ops); 616 subdev->dev = csi->dev; 617 if (IS_ENABLED(CONFIG_VIDEO_TEGRA_TPG)) 618 snprintf(subdev->name, sizeof(subdev->name), "%s-%d", "tpg", 619 chan->csi_port_nums[0]); 620 else 621 snprintf(subdev->name, sizeof(subdev->name), "%s", 622 kbasename(chan->of_node->full_name)); 623 624 v4l2_set_subdevdata(subdev, chan); 625 subdev->fwnode = of_fwnode_handle(chan->of_node); 626 subdev->entity.function = MEDIA_ENT_F_VID_IF_BRIDGE; 627 628 /* initialize media entity pads */ 629 ret = media_entity_pads_init(&subdev->entity, chan->numpads, 630 chan->pads); 631 if (ret < 0) { 632 dev_err(csi->dev, 633 "failed to initialize media entity: %d\n", ret); 634 subdev->dev = NULL; 635 return ret; 636 } 637 638 if (!IS_ENABLED(CONFIG_VIDEO_TEGRA_TPG)) { 639 ret = v4l2_async_register_subdev(subdev); 640 if (ret < 0) { 641 dev_err(csi->dev, 642 "failed to register subdev: %d\n", ret); 643 return ret; 644 } 645 } 646 647 return 0; 648 } 649 650 void tegra_csi_error_recover(struct v4l2_subdev *sd) 651 { 652 struct tegra_csi_channel *csi_chan = to_csi_chan(sd); 653 struct tegra_csi *csi = csi_chan->csi; 654 655 /* stop streaming during error recovery */ 656 csi->ops->csi_stop_streaming(csi_chan); 657 csi->ops->csi_err_recover(csi_chan); 658 csi->ops->csi_start_streaming(csi_chan); 659 } 660 661 static int tegra_csi_channels_init(struct tegra_csi *csi) 662 { 663 struct tegra_csi_channel *chan; 664 int ret; 665 666 list_for_each_entry(chan, &csi->csi_chans, list) { 667 ret = tegra_csi_channel_init(chan); 668 if (ret) { 669 dev_err(csi->dev, 670 "failed to initialize channel-%d: %d\n", 671 chan->csi_port_nums[0], ret); 672 return ret; 673 } 674 } 675 676 return 0; 677 } 678 679 static void tegra_csi_channels_cleanup(struct tegra_csi *csi) 680 { 681 struct v4l2_subdev *subdev; 682 struct tegra_csi_channel *chan, *tmp; 683 684 list_for_each_entry_safe(chan, tmp, &csi->csi_chans, list) { 685 if (chan->mipi) 686 tegra_mipi_free(chan->mipi); 687 688 subdev = &chan->subdev; 689 if (subdev->dev) { 690 if (!IS_ENABLED(CONFIG_VIDEO_TEGRA_TPG)) 691 v4l2_async_unregister_subdev(subdev); 692 media_entity_cleanup(&subdev->entity); 693 } 694 695 of_node_put(chan->of_node); 696 list_del(&chan->list); 697 kfree(chan); 698 } 699 } 700 701 static int __maybe_unused csi_runtime_suspend(struct device *dev) 702 { 703 struct tegra_csi *csi = dev_get_drvdata(dev); 704 705 clk_bulk_disable_unprepare(csi->soc->num_clks, csi->clks); 706 707 return 0; 708 } 709 710 static int __maybe_unused csi_runtime_resume(struct device *dev) 711 { 712 struct tegra_csi *csi = dev_get_drvdata(dev); 713 int ret; 714 715 ret = clk_bulk_prepare_enable(csi->soc->num_clks, csi->clks); 716 if (ret < 0) { 717 dev_err(csi->dev, "failed to enable clocks: %d\n", ret); 718 return ret; 719 } 720 721 return 0; 722 } 723 724 static int tegra_csi_init(struct host1x_client *client) 725 { 726 struct tegra_csi *csi = host1x_client_to_csi(client); 727 struct tegra_video_device *vid = dev_get_drvdata(client->host); 728 int ret; 729 730 INIT_LIST_HEAD(&csi->csi_chans); 731 732 if (IS_ENABLED(CONFIG_VIDEO_TEGRA_TPG)) 733 ret = tegra_csi_tpg_channels_alloc(csi); 734 else 735 ret = tegra_csi_channels_alloc(csi); 736 if (ret < 0) { 737 dev_err(csi->dev, 738 "failed to allocate channels: %d\n", ret); 739 goto cleanup; 740 } 741 742 ret = tegra_csi_channels_init(csi); 743 if (ret < 0) 744 goto cleanup; 745 746 vid->csi = csi; 747 748 return 0; 749 750 cleanup: 751 tegra_csi_channels_cleanup(csi); 752 return ret; 753 } 754 755 static int tegra_csi_exit(struct host1x_client *client) 756 { 757 struct tegra_csi *csi = host1x_client_to_csi(client); 758 759 tegra_csi_channels_cleanup(csi); 760 761 return 0; 762 } 763 764 static const struct host1x_client_ops csi_client_ops = { 765 .init = tegra_csi_init, 766 .exit = tegra_csi_exit, 767 }; 768 769 static int tegra_csi_probe(struct platform_device *pdev) 770 { 771 struct tegra_csi *csi; 772 unsigned int i; 773 int ret; 774 775 csi = devm_kzalloc(&pdev->dev, sizeof(*csi), GFP_KERNEL); 776 if (!csi) 777 return -ENOMEM; 778 779 csi->iomem = devm_platform_ioremap_resource(pdev, 0); 780 if (IS_ERR(csi->iomem)) 781 return PTR_ERR(csi->iomem); 782 783 csi->soc = of_device_get_match_data(&pdev->dev); 784 785 csi->clks = devm_kcalloc(&pdev->dev, csi->soc->num_clks, 786 sizeof(*csi->clks), GFP_KERNEL); 787 if (!csi->clks) 788 return -ENOMEM; 789 790 for (i = 0; i < csi->soc->num_clks; i++) 791 csi->clks[i].id = csi->soc->clk_names[i]; 792 793 ret = devm_clk_bulk_get(&pdev->dev, csi->soc->num_clks, csi->clks); 794 if (ret) { 795 dev_err(&pdev->dev, "failed to get the clocks: %d\n", ret); 796 return ret; 797 } 798 799 if (!pdev->dev.pm_domain) { 800 ret = -ENOENT; 801 dev_warn(&pdev->dev, "PM domain is not attached: %d\n", ret); 802 return ret; 803 } 804 805 csi->dev = &pdev->dev; 806 csi->ops = csi->soc->ops; 807 platform_set_drvdata(pdev, csi); 808 pm_runtime_enable(&pdev->dev); 809 810 /* initialize host1x interface */ 811 INIT_LIST_HEAD(&csi->client.list); 812 csi->client.ops = &csi_client_ops; 813 csi->client.dev = &pdev->dev; 814 815 ret = host1x_client_register(&csi->client); 816 if (ret < 0) { 817 dev_err(&pdev->dev, 818 "failed to register host1x client: %d\n", ret); 819 goto rpm_disable; 820 } 821 822 return 0; 823 824 rpm_disable: 825 pm_runtime_disable(&pdev->dev); 826 return ret; 827 } 828 829 static void tegra_csi_remove(struct platform_device *pdev) 830 { 831 struct tegra_csi *csi = platform_get_drvdata(pdev); 832 833 host1x_client_unregister(&csi->client); 834 835 pm_runtime_disable(&pdev->dev); 836 } 837 838 #if defined(CONFIG_ARCH_TEGRA_210_SOC) 839 extern const struct tegra_csi_soc tegra210_csi_soc; 840 #endif 841 842 static const struct of_device_id tegra_csi_of_id_table[] = { 843 #if defined(CONFIG_ARCH_TEGRA_210_SOC) 844 { .compatible = "nvidia,tegra210-csi", .data = &tegra210_csi_soc }, 845 #endif 846 { } 847 }; 848 MODULE_DEVICE_TABLE(of, tegra_csi_of_id_table); 849 850 static const struct dev_pm_ops tegra_csi_pm_ops = { 851 SET_RUNTIME_PM_OPS(csi_runtime_suspend, csi_runtime_resume, NULL) 852 }; 853 854 struct platform_driver tegra_csi_driver = { 855 .driver = { 856 .name = "tegra-csi", 857 .of_match_table = tegra_csi_of_id_table, 858 .pm = &tegra_csi_pm_ops, 859 }, 860 .probe = tegra_csi_probe, 861 .remove_new = tegra_csi_remove, 862 }; 863