1 // SPDX-License-Identifier: (GPL-2.0+ OR MIT) 2 /* 3 * Rockchip ISP1 Driver - Base driver 4 * 5 * Copyright (C) 2019 Collabora, Ltd. 6 * 7 * Based on Rockchip ISP1 driver by Rockchip Electronics Co., Ltd. 8 * Copyright (C) 2017 Rockchip Electronics Co., Ltd. 9 */ 10 11 #include <linux/clk.h> 12 #include <linux/debugfs.h> 13 #include <linux/interrupt.h> 14 #include <linux/module.h> 15 #include <linux/of.h> 16 #include <linux/of_graph.h> 17 #include <linux/of_platform.h> 18 #include <linux/pinctrl/consumer.h> 19 #include <linux/phy/phy.h> 20 #include <linux/phy/phy-mipi-dphy.h> 21 #include <media/v4l2-fwnode.h> 22 23 #include "rkisp1-common.h" 24 25 /* 26 * ISP Details 27 * ----------- 28 * 29 * ISP Comprises with: 30 * MIPI serial camera interface 31 * Image Signal Processing 32 * Many Image Enhancement Blocks 33 * Crop 34 * Resizer 35 * RBG display ready image 36 * Image Rotation 37 * 38 * ISP Block Diagram 39 * ----------------- 40 * rkisp1-resizer.c rkisp1-capture.c 41 * |====================| |=======================| 42 * rkisp1-isp.c Main Picture Path 43 * |==========================| |===============================================| 44 * +-----------+ +--+--+--+--+ +--------+ +--------+ +-----------+ 45 * | | | | | | | | | | | | | 46 * +--------+ |\ | | | | | | | -->| Crop |->| RSZ |------------->| | 47 * | MIPI |--->| \ | | | | | | | | | | | | | | 48 * +--------+ | | | | |IE|IE|IE|IE| | +--------+ +--------+ | Memory | 49 * |MUX|--->| ISP |->|0 |1 |2 |3 |---+ | Interface | 50 * +--------+ | | | | | | | | | | +--------+ +--------+ +--------+ | | 51 * |Parallel|--->| / | | | | | | | | | | | | | | | | 52 * +--------+ |/ | | | | | | | -->| Crop |->| RSZ |->| RGB |->| | 53 * | | | | | | | | | | | | Rotate | | | 54 * +-----------+ +--+--+--+--+ +--------+ +--------+ +--------+ +-----------+ 55 * ^ 56 * +--------+ | |===============================================| 57 * | DMA |------------------------------------+ Self Picture Path 58 * +--------+ 59 * 60 * rkisp1-stats.c rkisp1-params.c 61 * |===============| |===============| 62 * +---------------+ +---------------+ 63 * | | | | 64 * | ISP | | ISP | 65 * | | | | 66 * +---------------+ +---------------+ 67 * 68 * 69 * Media Topology 70 * -------------- 71 * +----------+ +----------+ 72 * | Sensor 2 | | Sensor X | 73 * ------------ ... ------------ 74 * | 0 | | 0 | 75 * +----------+ +----------+ +-----------+ 76 * \ | | params | 77 * \ | | (output) | 78 * +----------+ \ | +-----------+ 79 * | Sensor 1 | v v | 80 * ------------ +------+------+ | 81 * | 0 |----->| 0 | 1 |<---------+ 82 * +----------+ |------+------| 83 * | ISP | 84 * |------+------| 85 * +-------------| 2 | 3 |----------+ 86 * | +------+------+ | 87 * | | | 88 * v v v 89 * +- ---------+ +-----------+ +-----------+ 90 * | 0 | | 0 | | stats | 91 * ------------- ------------- | (capture) | 92 * | Resizer | | Resizer | +-----------+ 93 * ------------| ------------| 94 * | 1 | | 1 | 95 * +-----------+ +-----------+ 96 * | | 97 * v v 98 * +-----------+ +-----------+ 99 * | selfpath | | mainpath | 100 * | (capture) | | (capture) | 101 * +-----------+ +-----------+ 102 */ 103 104 struct rkisp1_match_data { 105 const char * const *clks; 106 unsigned int size; 107 enum rkisp1_cif_isp_version isp_ver; 108 }; 109 110 /* ---------------------------------------------------------------------------- 111 * Sensor DT bindings 112 */ 113 114 static int rkisp1_create_links(struct rkisp1_device *rkisp1) 115 { 116 struct media_entity *source, *sink; 117 unsigned int flags, source_pad; 118 struct v4l2_subdev *sd; 119 unsigned int i; 120 int ret; 121 122 /* sensor links */ 123 flags = MEDIA_LNK_FL_ENABLED; 124 list_for_each_entry(sd, &rkisp1->v4l2_dev.subdevs, list) { 125 if (sd == &rkisp1->isp.sd || 126 sd == &rkisp1->resizer_devs[RKISP1_MAINPATH].sd || 127 sd == &rkisp1->resizer_devs[RKISP1_SELFPATH].sd) 128 continue; 129 130 ret = media_entity_get_fwnode_pad(&sd->entity, sd->fwnode, 131 MEDIA_PAD_FL_SOURCE); 132 if (ret < 0) { 133 dev_err(rkisp1->dev, "failed to find src pad for %s\n", 134 sd->name); 135 return ret; 136 } 137 source_pad = ret; 138 139 ret = media_create_pad_link(&sd->entity, source_pad, 140 &rkisp1->isp.sd.entity, 141 RKISP1_ISP_PAD_SINK_VIDEO, 142 flags); 143 if (ret) 144 return ret; 145 146 flags = 0; 147 } 148 149 flags = MEDIA_LNK_FL_ENABLED | MEDIA_LNK_FL_IMMUTABLE; 150 151 /* create ISP->RSZ->CAP links */ 152 for (i = 0; i < 2; i++) { 153 source = &rkisp1->isp.sd.entity; 154 sink = &rkisp1->resizer_devs[i].sd.entity; 155 ret = media_create_pad_link(source, RKISP1_ISP_PAD_SOURCE_VIDEO, 156 sink, RKISP1_RSZ_PAD_SINK, 157 MEDIA_LNK_FL_ENABLED); 158 if (ret) 159 return ret; 160 161 source = sink; 162 sink = &rkisp1->capture_devs[i].vnode.vdev.entity; 163 ret = media_create_pad_link(source, RKISP1_RSZ_PAD_SRC, 164 sink, 0, flags); 165 if (ret) 166 return ret; 167 } 168 169 /* params links */ 170 source = &rkisp1->params.vnode.vdev.entity; 171 sink = &rkisp1->isp.sd.entity; 172 ret = media_create_pad_link(source, 0, sink, 173 RKISP1_ISP_PAD_SINK_PARAMS, flags); 174 if (ret) 175 return ret; 176 177 /* 3A stats links */ 178 source = &rkisp1->isp.sd.entity; 179 sink = &rkisp1->stats.vnode.vdev.entity; 180 return media_create_pad_link(source, RKISP1_ISP_PAD_SOURCE_STATS, 181 sink, 0, flags); 182 } 183 184 static int rkisp1_subdev_notifier_bound(struct v4l2_async_notifier *notifier, 185 struct v4l2_subdev *sd, 186 struct v4l2_async_subdev *asd) 187 { 188 struct rkisp1_device *rkisp1 = 189 container_of(notifier, struct rkisp1_device, notifier); 190 struct rkisp1_sensor_async *s_asd = 191 container_of(asd, struct rkisp1_sensor_async, asd); 192 193 s_asd->pixel_rate_ctrl = v4l2_ctrl_find(sd->ctrl_handler, 194 V4L2_CID_PIXEL_RATE); 195 s_asd->sd = sd; 196 s_asd->dphy = devm_phy_get(rkisp1->dev, "dphy"); 197 if (IS_ERR(s_asd->dphy)) { 198 if (PTR_ERR(s_asd->dphy) != -EPROBE_DEFER) 199 dev_err(rkisp1->dev, "Couldn't get the MIPI D-PHY\n"); 200 return PTR_ERR(s_asd->dphy); 201 } 202 203 phy_init(s_asd->dphy); 204 205 return 0; 206 } 207 208 static void rkisp1_subdev_notifier_unbind(struct v4l2_async_notifier *notifier, 209 struct v4l2_subdev *sd, 210 struct v4l2_async_subdev *asd) 211 { 212 struct rkisp1_sensor_async *s_asd = 213 container_of(asd, struct rkisp1_sensor_async, asd); 214 215 phy_exit(s_asd->dphy); 216 } 217 218 static int rkisp1_subdev_notifier_complete(struct v4l2_async_notifier *notifier) 219 { 220 struct rkisp1_device *rkisp1 = 221 container_of(notifier, struct rkisp1_device, notifier); 222 int ret; 223 224 ret = rkisp1_create_links(rkisp1); 225 if (ret) 226 return ret; 227 228 ret = v4l2_device_register_subdev_nodes(&rkisp1->v4l2_dev); 229 if (ret) 230 return ret; 231 232 dev_dbg(rkisp1->dev, "Async subdev notifier completed\n"); 233 234 return 0; 235 } 236 237 static const struct v4l2_async_notifier_operations rkisp1_subdev_notifier_ops = { 238 .bound = rkisp1_subdev_notifier_bound, 239 .unbind = rkisp1_subdev_notifier_unbind, 240 .complete = rkisp1_subdev_notifier_complete, 241 }; 242 243 static int rkisp1_subdev_notifier(struct rkisp1_device *rkisp1) 244 { 245 struct v4l2_async_notifier *ntf = &rkisp1->notifier; 246 unsigned int next_id = 0; 247 int ret; 248 249 v4l2_async_notifier_init(ntf); 250 251 while (1) { 252 struct v4l2_fwnode_endpoint vep = { 253 .bus_type = V4L2_MBUS_CSI2_DPHY 254 }; 255 struct rkisp1_sensor_async *rk_asd = NULL; 256 struct fwnode_handle *ep; 257 258 ep = fwnode_graph_get_endpoint_by_id(dev_fwnode(rkisp1->dev), 259 0, next_id, 260 FWNODE_GRAPH_ENDPOINT_NEXT); 261 if (!ep) 262 break; 263 264 ret = v4l2_fwnode_endpoint_parse(ep, &vep); 265 if (ret) 266 goto err_parse; 267 268 rk_asd = kzalloc(sizeof(*rk_asd), GFP_KERNEL); 269 if (!rk_asd) { 270 ret = -ENOMEM; 271 goto err_parse; 272 } 273 274 rk_asd->mbus_type = vep.bus_type; 275 rk_asd->mbus_flags = vep.bus.mipi_csi2.flags; 276 rk_asd->lanes = vep.bus.mipi_csi2.num_data_lanes; 277 278 ret = v4l2_async_notifier_add_fwnode_remote_subdev(ntf, ep, 279 &rk_asd->asd); 280 if (ret) 281 goto err_parse; 282 283 dev_dbg(rkisp1->dev, "registered ep id %d with %d lanes\n", 284 vep.base.id, rk_asd->lanes); 285 286 next_id = vep.base.id + 1; 287 288 fwnode_handle_put(ep); 289 290 continue; 291 err_parse: 292 fwnode_handle_put(ep); 293 kfree(rk_asd); 294 v4l2_async_notifier_cleanup(ntf); 295 return ret; 296 } 297 298 if (next_id == 0) 299 dev_dbg(rkisp1->dev, "no remote subdevice found\n"); 300 ntf->ops = &rkisp1_subdev_notifier_ops; 301 ret = v4l2_async_notifier_register(&rkisp1->v4l2_dev, ntf); 302 if (ret) { 303 v4l2_async_notifier_cleanup(ntf); 304 return ret; 305 } 306 return 0; 307 } 308 309 /* ---------------------------------------------------------------------------- 310 * Power 311 */ 312 313 static int __maybe_unused rkisp1_runtime_suspend(struct device *dev) 314 { 315 struct rkisp1_device *rkisp1 = dev_get_drvdata(dev); 316 317 clk_bulk_disable_unprepare(rkisp1->clk_size, rkisp1->clks); 318 return pinctrl_pm_select_sleep_state(dev); 319 } 320 321 static int __maybe_unused rkisp1_runtime_resume(struct device *dev) 322 { 323 struct rkisp1_device *rkisp1 = dev_get_drvdata(dev); 324 int ret; 325 326 ret = pinctrl_pm_select_default_state(dev); 327 if (ret) 328 return ret; 329 ret = clk_bulk_prepare_enable(rkisp1->clk_size, rkisp1->clks); 330 if (ret) 331 return ret; 332 333 return 0; 334 } 335 336 static const struct dev_pm_ops rkisp1_pm_ops = { 337 SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend, 338 pm_runtime_force_resume) 339 SET_RUNTIME_PM_OPS(rkisp1_runtime_suspend, rkisp1_runtime_resume, NULL) 340 }; 341 342 /* ---------------------------------------------------------------------------- 343 * Core 344 */ 345 346 static int rkisp1_entities_register(struct rkisp1_device *rkisp1) 347 { 348 int ret; 349 350 ret = rkisp1_isp_register(rkisp1); 351 if (ret) 352 return ret; 353 354 ret = rkisp1_resizer_devs_register(rkisp1); 355 if (ret) 356 goto err_unreg_isp_subdev; 357 358 ret = rkisp1_capture_devs_register(rkisp1); 359 if (ret) 360 goto err_unreg_resizer_devs; 361 362 ret = rkisp1_stats_register(rkisp1); 363 if (ret) 364 goto err_unreg_capture_devs; 365 366 ret = rkisp1_params_register(rkisp1); 367 if (ret) 368 goto err_unreg_stats; 369 370 ret = rkisp1_subdev_notifier(rkisp1); 371 if (ret) { 372 dev_err(rkisp1->dev, 373 "Failed to register subdev notifier(%d)\n", ret); 374 goto err_unreg_params; 375 } 376 377 return 0; 378 err_unreg_params: 379 rkisp1_params_unregister(rkisp1); 380 err_unreg_stats: 381 rkisp1_stats_unregister(rkisp1); 382 err_unreg_capture_devs: 383 rkisp1_capture_devs_unregister(rkisp1); 384 err_unreg_resizer_devs: 385 rkisp1_resizer_devs_unregister(rkisp1); 386 err_unreg_isp_subdev: 387 rkisp1_isp_unregister(rkisp1); 388 return ret; 389 } 390 391 static irqreturn_t rkisp1_isr(int irq, void *ctx) 392 { 393 struct device *dev = ctx; 394 struct rkisp1_device *rkisp1 = dev_get_drvdata(dev); 395 396 /* 397 * Call rkisp1_capture_isr() first to handle the frame that 398 * potentially completed using the current frame_sequence number before 399 * it is potentially incremented by rkisp1_isp_isr() in the vertical 400 * sync. 401 */ 402 rkisp1_capture_isr(rkisp1); 403 rkisp1_isp_isr(rkisp1); 404 rkisp1_mipi_isr(rkisp1); 405 406 return IRQ_HANDLED; 407 } 408 409 static const char * const rk3399_isp_clks[] = { 410 "isp", 411 "aclk", 412 "hclk", 413 }; 414 415 static const struct rkisp1_match_data rk3399_isp_match_data = { 416 .clks = rk3399_isp_clks, 417 .size = ARRAY_SIZE(rk3399_isp_clks), 418 .isp_ver = RKISP1_V10, 419 }; 420 421 static const struct of_device_id rkisp1_of_match[] = { 422 { 423 .compatible = "rockchip,rk3399-cif-isp", 424 .data = &rk3399_isp_match_data, 425 }, 426 {}, 427 }; 428 MODULE_DEVICE_TABLE(of, rkisp1_of_match); 429 430 static void rkisp1_debug_init(struct rkisp1_device *rkisp1) 431 { 432 struct rkisp1_debug *debug = &rkisp1->debug; 433 434 debug->debugfs_dir = debugfs_create_dir(RKISP1_DRIVER_NAME, NULL); 435 debugfs_create_ulong("data_loss", 0444, debug->debugfs_dir, 436 &debug->data_loss); 437 debugfs_create_ulong("outform_size_err", 0444, debug->debugfs_dir, 438 &debug->outform_size_error); 439 debugfs_create_ulong("img_stabilization_size_error", 0444, 440 debug->debugfs_dir, 441 &debug->img_stabilization_size_error); 442 debugfs_create_ulong("inform_size_error", 0444, debug->debugfs_dir, 443 &debug->inform_size_error); 444 debugfs_create_ulong("irq_delay", 0444, debug->debugfs_dir, 445 &debug->irq_delay); 446 debugfs_create_ulong("mipi_error", 0444, debug->debugfs_dir, 447 &debug->mipi_error); 448 debugfs_create_ulong("stats_error", 0444, debug->debugfs_dir, 449 &debug->stats_error); 450 debugfs_create_ulong("mp_stop_timeout", 0444, debug->debugfs_dir, 451 &debug->stop_timeout[RKISP1_MAINPATH]); 452 debugfs_create_ulong("sp_stop_timeout", 0444, debug->debugfs_dir, 453 &debug->stop_timeout[RKISP1_SELFPATH]); 454 debugfs_create_ulong("mp_frame_drop", 0444, debug->debugfs_dir, 455 &debug->frame_drop[RKISP1_MAINPATH]); 456 debugfs_create_ulong("sp_frame_drop", 0444, debug->debugfs_dir, 457 &debug->frame_drop[RKISP1_SELFPATH]); 458 } 459 460 static int rkisp1_probe(struct platform_device *pdev) 461 { 462 const struct rkisp1_match_data *match_data; 463 struct device *dev = &pdev->dev; 464 struct rkisp1_device *rkisp1; 465 struct v4l2_device *v4l2_dev; 466 unsigned int i; 467 int ret, irq; 468 469 match_data = of_device_get_match_data(&pdev->dev); 470 if (!match_data) 471 return -ENODEV; 472 473 rkisp1 = devm_kzalloc(dev, sizeof(*rkisp1), GFP_KERNEL); 474 if (!rkisp1) 475 return -ENOMEM; 476 477 dev_set_drvdata(dev, rkisp1); 478 rkisp1->dev = dev; 479 480 mutex_init(&rkisp1->stream_lock); 481 482 rkisp1->base_addr = devm_platform_ioremap_resource(pdev, 0); 483 if (IS_ERR(rkisp1->base_addr)) 484 return PTR_ERR(rkisp1->base_addr); 485 486 irq = platform_get_irq(pdev, 0); 487 if (irq < 0) 488 return irq; 489 490 ret = devm_request_irq(dev, irq, rkisp1_isr, IRQF_SHARED, 491 dev_driver_string(dev), dev); 492 if (ret) { 493 dev_err(dev, "request irq failed: %d\n", ret); 494 return ret; 495 } 496 497 rkisp1->irq = irq; 498 499 for (i = 0; i < match_data->size; i++) 500 rkisp1->clks[i].id = match_data->clks[i]; 501 ret = devm_clk_bulk_get(dev, match_data->size, rkisp1->clks); 502 if (ret) 503 return ret; 504 rkisp1->clk_size = match_data->size; 505 506 pm_runtime_enable(&pdev->dev); 507 508 rkisp1->media_dev.hw_revision = match_data->isp_ver; 509 strscpy(rkisp1->media_dev.model, RKISP1_DRIVER_NAME, 510 sizeof(rkisp1->media_dev.model)); 511 rkisp1->media_dev.dev = &pdev->dev; 512 strscpy(rkisp1->media_dev.bus_info, RKISP1_BUS_INFO, 513 sizeof(rkisp1->media_dev.bus_info)); 514 media_device_init(&rkisp1->media_dev); 515 516 v4l2_dev = &rkisp1->v4l2_dev; 517 v4l2_dev->mdev = &rkisp1->media_dev; 518 strscpy(v4l2_dev->name, RKISP1_DRIVER_NAME, sizeof(v4l2_dev->name)); 519 520 ret = v4l2_device_register(rkisp1->dev, &rkisp1->v4l2_dev); 521 if (ret) 522 return ret; 523 524 ret = media_device_register(&rkisp1->media_dev); 525 if (ret) { 526 dev_err(dev, "Failed to register media device: %d\n", ret); 527 goto err_unreg_v4l2_dev; 528 } 529 530 ret = rkisp1_entities_register(rkisp1); 531 if (ret) 532 goto err_unreg_media_dev; 533 534 rkisp1_debug_init(rkisp1); 535 536 return 0; 537 538 err_unreg_media_dev: 539 media_device_unregister(&rkisp1->media_dev); 540 err_unreg_v4l2_dev: 541 v4l2_device_unregister(&rkisp1->v4l2_dev); 542 pm_runtime_disable(&pdev->dev); 543 return ret; 544 } 545 546 static int rkisp1_remove(struct platform_device *pdev) 547 { 548 struct rkisp1_device *rkisp1 = platform_get_drvdata(pdev); 549 550 v4l2_async_notifier_unregister(&rkisp1->notifier); 551 v4l2_async_notifier_cleanup(&rkisp1->notifier); 552 553 rkisp1_params_unregister(rkisp1); 554 rkisp1_stats_unregister(rkisp1); 555 rkisp1_capture_devs_unregister(rkisp1); 556 rkisp1_resizer_devs_unregister(rkisp1); 557 rkisp1_isp_unregister(rkisp1); 558 559 media_device_unregister(&rkisp1->media_dev); 560 v4l2_device_unregister(&rkisp1->v4l2_dev); 561 562 pm_runtime_disable(&pdev->dev); 563 564 debugfs_remove_recursive(rkisp1->debug.debugfs_dir); 565 return 0; 566 } 567 568 static struct platform_driver rkisp1_drv = { 569 .driver = { 570 .name = RKISP1_DRIVER_NAME, 571 .of_match_table = of_match_ptr(rkisp1_of_match), 572 .pm = &rkisp1_pm_ops, 573 }, 574 .probe = rkisp1_probe, 575 .remove = rkisp1_remove, 576 }; 577 578 module_platform_driver(rkisp1_drv); 579 MODULE_DESCRIPTION("Rockchip ISP1 platform driver"); 580 MODULE_LICENSE("Dual MIT/GPL"); 581