1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * camss.c 4 * 5 * Qualcomm MSM Camera Subsystem - Core 6 * 7 * Copyright (c) 2015, The Linux Foundation. All rights reserved. 8 * Copyright (C) 2015-2018 Linaro Ltd. 9 */ 10 #include <linux/clk.h> 11 #include <linux/interconnect.h> 12 #include <linux/media-bus-format.h> 13 #include <linux/media.h> 14 #include <linux/module.h> 15 #include <linux/platform_device.h> 16 #include <linux/of.h> 17 #include <linux/of_device.h> 18 #include <linux/of_graph.h> 19 #include <linux/pm_runtime.h> 20 #include <linux/pm_domain.h> 21 #include <linux/slab.h> 22 #include <linux/videodev2.h> 23 24 #include <media/media-device.h> 25 #include <media/v4l2-async.h> 26 #include <media/v4l2-device.h> 27 #include <media/v4l2-mc.h> 28 #include <media/v4l2-fwnode.h> 29 30 #include "camss.h" 31 32 #define CAMSS_CLOCK_MARGIN_NUMERATOR 105 33 #define CAMSS_CLOCK_MARGIN_DENOMINATOR 100 34 35 static const struct parent_dev_ops vfe_parent_dev_ops; 36 37 static const struct camss_subdev_resources csiphy_res_8x16[] = { 38 /* CSIPHY0 */ 39 { 40 .regulators = {}, 41 .clock = { "top_ahb", "ispif_ahb", "ahb", "csiphy0_timer" }, 42 .clock_rate = { { 0 }, 43 { 0 }, 44 { 0 }, 45 { 100000000, 200000000 } }, 46 .reg = { "csiphy0", "csiphy0_clk_mux" }, 47 .interrupt = { "csiphy0" }, 48 .csiphy = { 49 .id = 0, 50 .hw_ops = &csiphy_ops_2ph_1_0, 51 .formats = &csiphy_formats_8x16 52 } 53 }, 54 55 /* CSIPHY1 */ 56 { 57 .regulators = {}, 58 .clock = { "top_ahb", "ispif_ahb", "ahb", "csiphy1_timer" }, 59 .clock_rate = { { 0 }, 60 { 0 }, 61 { 0 }, 62 { 100000000, 200000000 } }, 63 .reg = { "csiphy1", "csiphy1_clk_mux" }, 64 .interrupt = { "csiphy1" }, 65 .csiphy = { 66 .id = 1, 67 .hw_ops = &csiphy_ops_2ph_1_0, 68 .formats = &csiphy_formats_8x16 69 } 70 } 71 }; 72 73 static const struct camss_subdev_resources csid_res_8x16[] = { 74 /* CSID0 */ 75 { 76 .regulators = { "vdda" }, 77 .clock = { "top_ahb", "ispif_ahb", "csi0_ahb", "ahb", 78 "csi0", "csi0_phy", "csi0_pix", "csi0_rdi" }, 79 .clock_rate = { { 0 }, 80 { 0 }, 81 { 0 }, 82 { 0 }, 83 { 100000000, 200000000 }, 84 { 0 }, 85 { 0 }, 86 { 0 } }, 87 .reg = { "csid0" }, 88 .interrupt = { "csid0" }, 89 .csid = { 90 .hw_ops = &csid_ops_4_1, 91 .parent_dev_ops = &vfe_parent_dev_ops, 92 .formats = &csid_formats_4_1 93 } 94 }, 95 96 /* CSID1 */ 97 { 98 .regulators = { "vdda" }, 99 .clock = { "top_ahb", "ispif_ahb", "csi1_ahb", "ahb", 100 "csi1", "csi1_phy", "csi1_pix", "csi1_rdi" }, 101 .clock_rate = { { 0 }, 102 { 0 }, 103 { 0 }, 104 { 0 }, 105 { 100000000, 200000000 }, 106 { 0 }, 107 { 0 }, 108 { 0 } }, 109 .reg = { "csid1" }, 110 .interrupt = { "csid1" }, 111 .csid = { 112 .hw_ops = &csid_ops_4_1, 113 .parent_dev_ops = &vfe_parent_dev_ops, 114 .formats = &csid_formats_4_1 115 } 116 }, 117 }; 118 119 static const struct camss_subdev_resources ispif_res_8x16 = { 120 /* ISPIF */ 121 .clock = { "top_ahb", "ahb", "ispif_ahb", 122 "csi0", "csi0_pix", "csi0_rdi", 123 "csi1", "csi1_pix", "csi1_rdi" }, 124 .clock_for_reset = { "vfe0", "csi_vfe0" }, 125 .reg = { "ispif", "csi_clk_mux" }, 126 .interrupt = { "ispif" }, 127 }; 128 129 static const struct camss_subdev_resources vfe_res_8x16[] = { 130 /* VFE0 */ 131 { 132 .regulators = {}, 133 .clock = { "top_ahb", "vfe0", "csi_vfe0", 134 "vfe_ahb", "vfe_axi", "ahb" }, 135 .clock_rate = { { 0 }, 136 { 50000000, 80000000, 100000000, 160000000, 137 177780000, 200000000, 266670000, 320000000, 138 400000000, 465000000 }, 139 { 0 }, 140 { 0 }, 141 { 0 }, 142 { 0 }, 143 { 0 }, 144 { 0 }, 145 { 0 } }, 146 .reg = { "vfe0" }, 147 .interrupt = { "vfe0" }, 148 .vfe = { 149 .line_num = 3, 150 .hw_ops = &vfe_ops_4_1, 151 .formats_rdi = &vfe_formats_rdi_8x16, 152 .formats_pix = &vfe_formats_pix_8x16 153 } 154 } 155 }; 156 157 static const struct camss_subdev_resources csid_res_8x53[] = { 158 /* CSID0 */ 159 { 160 .regulators = { "vdda" }, 161 .clock = { "top_ahb", "ispif_ahb", "csi0_ahb", "ahb", 162 "csi0", "csi0_phy", "csi0_pix", "csi0_rdi" }, 163 .clock_rate = { { 0 }, 164 { 0 }, 165 { 0 }, 166 { 0 }, 167 { 100000000, 200000000, 310000000, 168 400000000, 465000000 }, 169 { 0 }, 170 { 0 }, 171 { 0 } }, 172 .reg = { "csid0" }, 173 .interrupt = { "csid0" }, 174 .csid = { 175 .hw_ops = &csid_ops_4_7, 176 .parent_dev_ops = &vfe_parent_dev_ops, 177 .formats = &csid_formats_4_7 178 } 179 }, 180 181 /* CSID1 */ 182 { 183 .regulators = { "vdda" }, 184 .clock = { "top_ahb", "ispif_ahb", "csi1_ahb", "ahb", 185 "csi1", "csi1_phy", "csi1_pix", "csi1_rdi" }, 186 .clock_rate = { { 0 }, 187 { 0 }, 188 { 0 }, 189 { 0 }, 190 { 100000000, 200000000, 310000000, 191 400000000, 465000000 }, 192 { 0 }, 193 { 0 }, 194 { 0 } }, 195 .reg = { "csid1" }, 196 .interrupt = { "csid1" }, 197 .csid = { 198 .hw_ops = &csid_ops_4_7, 199 .parent_dev_ops = &vfe_parent_dev_ops, 200 .formats = &csid_formats_4_7 201 } 202 }, 203 204 /* CSID2 */ 205 { 206 .regulators = { "vdda" }, 207 .clock = { "top_ahb", "ispif_ahb", "csi2_ahb", "ahb", 208 "csi2", "csi2_phy", "csi2_pix", "csi2_rdi" }, 209 .clock_rate = { { 0 }, 210 { 0 }, 211 { 0 }, 212 { 0 }, 213 { 100000000, 200000000, 310000000, 214 400000000, 465000000 }, 215 { 0 }, 216 { 0 }, 217 { 0 } }, 218 .reg = { "csid2" }, 219 .interrupt = { "csid2" }, 220 .csid = { 221 .hw_ops = &csid_ops_4_7, 222 .parent_dev_ops = &vfe_parent_dev_ops, 223 .formats = &csid_formats_4_7 224 } 225 }, 226 }; 227 228 static const struct camss_subdev_resources ispif_res_8x53 = { 229 /* ISPIF */ 230 .clock = { "top_ahb", "ahb", "ispif_ahb", 231 "csi0", "csi0_pix", "csi0_rdi", 232 "csi1", "csi1_pix", "csi1_rdi", 233 "csi2", "csi2_pix", "csi2_rdi" }, 234 .clock_for_reset = { "vfe0", "csi_vfe0", "vfe1", "csi_vfe1" }, 235 .reg = { "ispif", "csi_clk_mux" }, 236 .interrupt = { "ispif" }, 237 }; 238 239 static const struct camss_subdev_resources vfe_res_8x53[] = { 240 /* VFE0 */ 241 { 242 .regulators = {}, 243 .clock = { "top_ahb", "ahb", "ispif_ahb", 244 "vfe0", "csi_vfe0", "vfe0_ahb", "vfe0_axi" }, 245 .clock_rate = { { 0 }, 246 { 0 }, 247 { 0 }, 248 { 50000000, 100000000, 133330000, 249 160000000, 200000000, 266670000, 250 310000000, 400000000, 465000000 }, 251 { 0 }, 252 { 0 }, 253 { 0 } }, 254 .reg = { "vfe0" }, 255 .interrupt = { "vfe0" }, 256 .vfe = { 257 .line_num = 3, 258 .has_pd = true, 259 .pd_name = "vfe0", 260 .hw_ops = &vfe_ops_4_1, 261 .formats_rdi = &vfe_formats_rdi_8x16, 262 .formats_pix = &vfe_formats_pix_8x16 263 } 264 }, 265 266 /* VFE1 */ 267 { 268 .regulators = {}, 269 .clock = { "top_ahb", "ahb", "ispif_ahb", 270 "vfe1", "csi_vfe1", "vfe1_ahb", "vfe1_axi" }, 271 .clock_rate = { { 0 }, 272 { 0 }, 273 { 0 }, 274 { 50000000, 100000000, 133330000, 275 160000000, 200000000, 266670000, 276 310000000, 400000000, 465000000 }, 277 { 0 }, 278 { 0 }, 279 { 0 } }, 280 .reg = { "vfe1" }, 281 .interrupt = { "vfe1" }, 282 .vfe = { 283 .line_num = 3, 284 .has_pd = true, 285 .pd_name = "vfe1", 286 .hw_ops = &vfe_ops_4_1, 287 .formats_rdi = &vfe_formats_rdi_8x16, 288 .formats_pix = &vfe_formats_pix_8x16 289 } 290 } 291 }; 292 293 static const struct resources_icc icc_res_8x53[] = { 294 { 295 .name = "cam_ahb", 296 .icc_bw_tbl.avg = 38400, 297 .icc_bw_tbl.peak = 76800, 298 }, 299 { 300 .name = "cam_vfe0_mem", 301 .icc_bw_tbl.avg = 939524, 302 .icc_bw_tbl.peak = 1342177, 303 }, 304 { 305 .name = "cam_vfe1_mem", 306 .icc_bw_tbl.avg = 939524, 307 .icc_bw_tbl.peak = 1342177, 308 }, 309 }; 310 311 static const struct camss_subdev_resources csiphy_res_8x96[] = { 312 /* CSIPHY0 */ 313 { 314 .regulators = {}, 315 .clock = { "top_ahb", "ispif_ahb", "ahb", "csiphy0_timer" }, 316 .clock_rate = { { 0 }, 317 { 0 }, 318 { 0 }, 319 { 100000000, 200000000, 266666667 } }, 320 .reg = { "csiphy0", "csiphy0_clk_mux" }, 321 .interrupt = { "csiphy0" }, 322 .csiphy = { 323 .id = 0, 324 .hw_ops = &csiphy_ops_3ph_1_0, 325 .formats = &csiphy_formats_8x96 326 } 327 }, 328 329 /* CSIPHY1 */ 330 { 331 .regulators = {}, 332 .clock = { "top_ahb", "ispif_ahb", "ahb", "csiphy1_timer" }, 333 .clock_rate = { { 0 }, 334 { 0 }, 335 { 0 }, 336 { 100000000, 200000000, 266666667 } }, 337 .reg = { "csiphy1", "csiphy1_clk_mux" }, 338 .interrupt = { "csiphy1" }, 339 .csiphy = { 340 .id = 1, 341 .hw_ops = &csiphy_ops_3ph_1_0, 342 .formats = &csiphy_formats_8x96 343 } 344 }, 345 346 /* CSIPHY2 */ 347 { 348 .regulators = {}, 349 .clock = { "top_ahb", "ispif_ahb", "ahb", "csiphy2_timer" }, 350 .clock_rate = { { 0 }, 351 { 0 }, 352 { 0 }, 353 { 100000000, 200000000, 266666667 } }, 354 .reg = { "csiphy2", "csiphy2_clk_mux" }, 355 .interrupt = { "csiphy2" }, 356 .csiphy = { 357 .id = 2, 358 .hw_ops = &csiphy_ops_3ph_1_0, 359 .formats = &csiphy_formats_8x96 360 } 361 } 362 }; 363 364 static const struct camss_subdev_resources csid_res_8x96[] = { 365 /* CSID0 */ 366 { 367 .regulators = { "vdda" }, 368 .clock = { "top_ahb", "ispif_ahb", "csi0_ahb", "ahb", 369 "csi0", "csi0_phy", "csi0_pix", "csi0_rdi" }, 370 .clock_rate = { { 0 }, 371 { 0 }, 372 { 0 }, 373 { 0 }, 374 { 100000000, 200000000, 266666667 }, 375 { 0 }, 376 { 0 }, 377 { 0 } }, 378 .reg = { "csid0" }, 379 .interrupt = { "csid0" }, 380 .csid = { 381 .hw_ops = &csid_ops_4_7, 382 .parent_dev_ops = &vfe_parent_dev_ops, 383 .formats = &csid_formats_4_7 384 } 385 }, 386 387 /* CSID1 */ 388 { 389 .regulators = { "vdda" }, 390 .clock = { "top_ahb", "ispif_ahb", "csi1_ahb", "ahb", 391 "csi1", "csi1_phy", "csi1_pix", "csi1_rdi" }, 392 .clock_rate = { { 0 }, 393 { 0 }, 394 { 0 }, 395 { 0 }, 396 { 100000000, 200000000, 266666667 }, 397 { 0 }, 398 { 0 }, 399 { 0 } }, 400 .reg = { "csid1" }, 401 .interrupt = { "csid1" }, 402 .csid = { 403 .hw_ops = &csid_ops_4_7, 404 .parent_dev_ops = &vfe_parent_dev_ops, 405 .formats = &csid_formats_4_7 406 } 407 }, 408 409 /* CSID2 */ 410 { 411 .regulators = { "vdda" }, 412 .clock = { "top_ahb", "ispif_ahb", "csi2_ahb", "ahb", 413 "csi2", "csi2_phy", "csi2_pix", "csi2_rdi" }, 414 .clock_rate = { { 0 }, 415 { 0 }, 416 { 0 }, 417 { 0 }, 418 { 100000000, 200000000, 266666667 }, 419 { 0 }, 420 { 0 }, 421 { 0 } }, 422 .reg = { "csid2" }, 423 .interrupt = { "csid2" }, 424 .csid = { 425 .hw_ops = &csid_ops_4_7, 426 .parent_dev_ops = &vfe_parent_dev_ops, 427 .formats = &csid_formats_4_7 428 } 429 }, 430 431 /* CSID3 */ 432 { 433 .regulators = { "vdda" }, 434 .clock = { "top_ahb", "ispif_ahb", "csi3_ahb", "ahb", 435 "csi3", "csi3_phy", "csi3_pix", "csi3_rdi" }, 436 .clock_rate = { { 0 }, 437 { 0 }, 438 { 0 }, 439 { 0 }, 440 { 100000000, 200000000, 266666667 }, 441 { 0 }, 442 { 0 }, 443 { 0 } }, 444 .reg = { "csid3" }, 445 .interrupt = { "csid3" }, 446 .csid = { 447 .hw_ops = &csid_ops_4_7, 448 .parent_dev_ops = &vfe_parent_dev_ops, 449 .formats = &csid_formats_4_7 450 } 451 } 452 }; 453 454 static const struct camss_subdev_resources ispif_res_8x96 = { 455 /* ISPIF */ 456 .clock = { "top_ahb", "ahb", "ispif_ahb", 457 "csi0", "csi0_pix", "csi0_rdi", 458 "csi1", "csi1_pix", "csi1_rdi", 459 "csi2", "csi2_pix", "csi2_rdi", 460 "csi3", "csi3_pix", "csi3_rdi" }, 461 .clock_for_reset = { "vfe0", "csi_vfe0", "vfe1", "csi_vfe1" }, 462 .reg = { "ispif", "csi_clk_mux" }, 463 .interrupt = { "ispif" }, 464 }; 465 466 static const struct camss_subdev_resources vfe_res_8x96[] = { 467 /* VFE0 */ 468 { 469 .regulators = {}, 470 .clock = { "top_ahb", "ahb", "vfe0", "csi_vfe0", "vfe_ahb", 471 "vfe0_ahb", "vfe_axi", "vfe0_stream"}, 472 .clock_rate = { { 0 }, 473 { 0 }, 474 { 75000000, 100000000, 300000000, 475 320000000, 480000000, 600000000 }, 476 { 0 }, 477 { 0 }, 478 { 0 }, 479 { 0 }, 480 { 0 } }, 481 .reg = { "vfe0" }, 482 .interrupt = { "vfe0" }, 483 .vfe = { 484 .line_num = 3, 485 .has_pd = true, 486 .hw_ops = &vfe_ops_4_7, 487 .formats_rdi = &vfe_formats_rdi_8x96, 488 .formats_pix = &vfe_formats_pix_8x96 489 } 490 }, 491 492 /* VFE1 */ 493 { 494 .regulators = {}, 495 .clock = { "top_ahb", "ahb", "vfe1", "csi_vfe1", "vfe_ahb", 496 "vfe1_ahb", "vfe_axi", "vfe1_stream"}, 497 .clock_rate = { { 0 }, 498 { 0 }, 499 { 75000000, 100000000, 300000000, 500 320000000, 480000000, 600000000 }, 501 { 0 }, 502 { 0 }, 503 { 0 }, 504 { 0 }, 505 { 0 } }, 506 .reg = { "vfe1" }, 507 .interrupt = { "vfe1" }, 508 .vfe = { 509 .line_num = 3, 510 .has_pd = true, 511 .hw_ops = &vfe_ops_4_7, 512 .formats_rdi = &vfe_formats_rdi_8x96, 513 .formats_pix = &vfe_formats_pix_8x96 514 } 515 } 516 }; 517 518 static const struct camss_subdev_resources csiphy_res_660[] = { 519 /* CSIPHY0 */ 520 { 521 .regulators = {}, 522 .clock = { "top_ahb", "ispif_ahb", "ahb", "csiphy0_timer", 523 "csi0_phy", "csiphy_ahb2crif" }, 524 .clock_rate = { { 0 }, 525 { 0 }, 526 { 0 }, 527 { 100000000, 200000000, 269333333 }, 528 { 0 } }, 529 .reg = { "csiphy0", "csiphy0_clk_mux" }, 530 .interrupt = { "csiphy0" }, 531 .csiphy = { 532 .id = 0, 533 .hw_ops = &csiphy_ops_3ph_1_0, 534 .formats = &csiphy_formats_8x96 535 } 536 }, 537 538 /* CSIPHY1 */ 539 { 540 .regulators = {}, 541 .clock = { "top_ahb", "ispif_ahb", "ahb", "csiphy1_timer", 542 "csi1_phy", "csiphy_ahb2crif" }, 543 .clock_rate = { { 0 }, 544 { 0 }, 545 { 0 }, 546 { 100000000, 200000000, 269333333 }, 547 { 0 } }, 548 .reg = { "csiphy1", "csiphy1_clk_mux" }, 549 .interrupt = { "csiphy1" }, 550 .csiphy = { 551 .id = 1, 552 .hw_ops = &csiphy_ops_3ph_1_0, 553 .formats = &csiphy_formats_8x96 554 } 555 }, 556 557 /* CSIPHY2 */ 558 { 559 .regulators = {}, 560 .clock = { "top_ahb", "ispif_ahb", "ahb", "csiphy2_timer", 561 "csi2_phy", "csiphy_ahb2crif" }, 562 .clock_rate = { { 0 }, 563 { 0 }, 564 { 0 }, 565 { 100000000, 200000000, 269333333 }, 566 { 0 } }, 567 .reg = { "csiphy2", "csiphy2_clk_mux" }, 568 .interrupt = { "csiphy2" }, 569 .csiphy = { 570 .id = 2, 571 .hw_ops = &csiphy_ops_3ph_1_0, 572 .formats = &csiphy_formats_8x96 573 } 574 } 575 }; 576 577 static const struct camss_subdev_resources csid_res_660[] = { 578 /* CSID0 */ 579 { 580 .regulators = { "vdda", "vdd_sec" }, 581 .clock = { "top_ahb", "ispif_ahb", "csi0_ahb", "ahb", 582 "csi0", "csi0_phy", "csi0_pix", "csi0_rdi", 583 "cphy_csid0" }, 584 .clock_rate = { { 0 }, 585 { 0 }, 586 { 0 }, 587 { 0 }, 588 { 100000000, 200000000, 310000000, 589 404000000, 465000000 }, 590 { 0 }, 591 { 0 }, 592 { 0 }, 593 { 0 } }, 594 .reg = { "csid0" }, 595 .interrupt = { "csid0" }, 596 .csid = { 597 .hw_ops = &csid_ops_4_7, 598 .parent_dev_ops = &vfe_parent_dev_ops, 599 .formats = &csid_formats_4_7 600 } 601 }, 602 603 /* CSID1 */ 604 { 605 .regulators = { "vdda", "vdd_sec" }, 606 .clock = { "top_ahb", "ispif_ahb", "csi1_ahb", "ahb", 607 "csi1", "csi1_phy", "csi1_pix", "csi1_rdi", 608 "cphy_csid1" }, 609 .clock_rate = { { 0 }, 610 { 0 }, 611 { 0 }, 612 { 0 }, 613 { 100000000, 200000000, 310000000, 614 404000000, 465000000 }, 615 { 0 }, 616 { 0 }, 617 { 0 }, 618 { 0 } }, 619 .reg = { "csid1" }, 620 .interrupt = { "csid1" }, 621 .csid = { 622 .hw_ops = &csid_ops_4_7, 623 .parent_dev_ops = &vfe_parent_dev_ops, 624 .formats = &csid_formats_4_7 625 } 626 }, 627 628 /* CSID2 */ 629 { 630 .regulators = { "vdda", "vdd_sec" }, 631 .clock = { "top_ahb", "ispif_ahb", "csi2_ahb", "ahb", 632 "csi2", "csi2_phy", "csi2_pix", "csi2_rdi", 633 "cphy_csid2" }, 634 .clock_rate = { { 0 }, 635 { 0 }, 636 { 0 }, 637 { 0 }, 638 { 100000000, 200000000, 310000000, 639 404000000, 465000000 }, 640 { 0 }, 641 { 0 }, 642 { 0 }, 643 { 0 } }, 644 .reg = { "csid2" }, 645 .interrupt = { "csid2" }, 646 .csid = { 647 .hw_ops = &csid_ops_4_7, 648 .parent_dev_ops = &vfe_parent_dev_ops, 649 .formats = &csid_formats_4_7 650 } 651 }, 652 653 /* CSID3 */ 654 { 655 .regulators = { "vdda", "vdd_sec" }, 656 .clock = { "top_ahb", "ispif_ahb", "csi3_ahb", "ahb", 657 "csi3", "csi3_phy", "csi3_pix", "csi3_rdi", 658 "cphy_csid3" }, 659 .clock_rate = { { 0 }, 660 { 0 }, 661 { 0 }, 662 { 0 }, 663 { 100000000, 200000000, 310000000, 664 404000000, 465000000 }, 665 { 0 }, 666 { 0 }, 667 { 0 }, 668 { 0 } }, 669 .reg = { "csid3" }, 670 .interrupt = { "csid3" }, 671 .csid = { 672 .hw_ops = &csid_ops_4_7, 673 .parent_dev_ops = &vfe_parent_dev_ops, 674 .formats = &csid_formats_4_7 675 } 676 } 677 }; 678 679 static const struct camss_subdev_resources ispif_res_660 = { 680 /* ISPIF */ 681 .clock = { "top_ahb", "ahb", "ispif_ahb", 682 "csi0", "csi0_pix", "csi0_rdi", 683 "csi1", "csi1_pix", "csi1_rdi", 684 "csi2", "csi2_pix", "csi2_rdi", 685 "csi3", "csi3_pix", "csi3_rdi" }, 686 .clock_for_reset = { "vfe0", "csi_vfe0", "vfe1", "csi_vfe1" }, 687 .reg = { "ispif", "csi_clk_mux" }, 688 .interrupt = { "ispif" }, 689 }; 690 691 static const struct camss_subdev_resources vfe_res_660[] = { 692 /* VFE0 */ 693 { 694 .regulators = {}, 695 .clock = { "throttle_axi", "top_ahb", "ahb", "vfe0", 696 "csi_vfe0", "vfe_ahb", "vfe0_ahb", "vfe_axi", 697 "vfe0_stream"}, 698 .clock_rate = { { 0 }, 699 { 0 }, 700 { 0 }, 701 { 120000000, 200000000, 256000000, 702 300000000, 404000000, 480000000, 703 540000000, 576000000 }, 704 { 0 }, 705 { 0 }, 706 { 0 }, 707 { 0 }, 708 { 0 } }, 709 .reg = { "vfe0" }, 710 .interrupt = { "vfe0" }, 711 .vfe = { 712 .line_num = 3, 713 .has_pd = true, 714 .hw_ops = &vfe_ops_4_8, 715 .formats_rdi = &vfe_formats_rdi_8x96, 716 .formats_pix = &vfe_formats_pix_8x96 717 } 718 }, 719 720 /* VFE1 */ 721 { 722 .regulators = {}, 723 .clock = { "throttle_axi", "top_ahb", "ahb", "vfe1", 724 "csi_vfe1", "vfe_ahb", "vfe1_ahb", "vfe_axi", 725 "vfe1_stream"}, 726 .clock_rate = { { 0 }, 727 { 0 }, 728 { 0 }, 729 { 120000000, 200000000, 256000000, 730 300000000, 404000000, 480000000, 731 540000000, 576000000 }, 732 { 0 }, 733 { 0 }, 734 { 0 }, 735 { 0 }, 736 { 0 } }, 737 .reg = { "vfe1" }, 738 .interrupt = { "vfe1" }, 739 .vfe = { 740 .line_num = 3, 741 .has_pd = true, 742 .hw_ops = &vfe_ops_4_8, 743 .formats_rdi = &vfe_formats_rdi_8x96, 744 .formats_pix = &vfe_formats_pix_8x96 745 } 746 } 747 }; 748 749 static const struct camss_subdev_resources csiphy_res_670[] = { 750 /* CSIPHY0 */ 751 { 752 .regulators = { "vdda-phy", "vdda-pll" }, 753 .clock = { "soc_ahb", "cpas_ahb", 754 "csiphy0", "csiphy0_timer" }, 755 .clock_rate = { { 0 }, 756 { 0 }, 757 { 0 }, 758 { 19200000, 240000000, 269333333 } }, 759 .reg = { "csiphy0" }, 760 .interrupt = { "csiphy0" }, 761 .csiphy = { 762 .id = 0, 763 .hw_ops = &csiphy_ops_3ph_1_0, 764 .formats = &csiphy_formats_sdm845 765 } 766 }, 767 768 /* CSIPHY1 */ 769 { 770 .regulators = { "vdda-phy", "vdda-pll" }, 771 .clock = { "soc_ahb", "cpas_ahb", 772 "csiphy1", "csiphy1_timer" }, 773 .clock_rate = { { 0 }, 774 { 0 }, 775 { 0 }, 776 { 19200000, 240000000, 269333333 } }, 777 .reg = { "csiphy1" }, 778 .interrupt = { "csiphy1" }, 779 .csiphy = { 780 .id = 1, 781 .hw_ops = &csiphy_ops_3ph_1_0, 782 .formats = &csiphy_formats_sdm845 783 } 784 }, 785 786 /* CSIPHY2 */ 787 { 788 .regulators = { "vdda-phy", "vdda-pll" }, 789 .clock = { "soc_ahb", "cpas_ahb", 790 "csiphy2", "csiphy2_timer" }, 791 .clock_rate = { { 0 }, 792 { 0 }, 793 { 0 }, 794 { 19200000, 240000000, 269333333 } }, 795 .reg = { "csiphy2" }, 796 .interrupt = { "csiphy2" }, 797 .csiphy = { 798 .id = 2, 799 .hw_ops = &csiphy_ops_3ph_1_0, 800 .formats = &csiphy_formats_sdm845 801 } 802 } 803 }; 804 805 static const struct camss_subdev_resources csid_res_670[] = { 806 /* CSID0 */ 807 { 808 .regulators = {}, 809 .clock = { "cpas_ahb", "soc_ahb", "vfe0", 810 "vfe0_cphy_rx", "csi0" }, 811 .clock_rate = { { 0 }, 812 { 0 }, 813 { 100000000, 320000000, 404000000, 480000000, 600000000 }, 814 { 384000000 }, 815 { 19200000, 75000000, 384000000, 538666667 } }, 816 .reg = { "csid0" }, 817 .interrupt = { "csid0" }, 818 .csid = { 819 .hw_ops = &csid_ops_gen2, 820 .parent_dev_ops = &vfe_parent_dev_ops, 821 .formats = &csid_formats_gen2 822 } 823 }, 824 825 /* CSID1 */ 826 { 827 .regulators = {}, 828 .clock = { "cpas_ahb", "soc_ahb", "vfe1", 829 "vfe1_cphy_rx", "csi1" }, 830 .clock_rate = { { 0 }, 831 { 0 }, 832 { 100000000, 320000000, 404000000, 480000000, 600000000 }, 833 { 384000000 }, 834 { 19200000, 75000000, 384000000, 538666667 } }, 835 .reg = { "csid1" }, 836 .interrupt = { "csid1" }, 837 .csid = { 838 .hw_ops = &csid_ops_gen2, 839 .parent_dev_ops = &vfe_parent_dev_ops, 840 .formats = &csid_formats_gen2 841 } 842 }, 843 844 /* CSID2 */ 845 { 846 .regulators = {}, 847 .clock = { "cpas_ahb", "soc_ahb", "vfe_lite", 848 "vfe_lite_cphy_rx", "csi2" }, 849 .clock_rate = { { 0 }, 850 { 0 }, 851 { 100000000, 320000000, 404000000, 480000000, 600000000 }, 852 { 384000000 }, 853 { 19200000, 75000000, 384000000, 538666667 } }, 854 .reg = { "csid2" }, 855 .interrupt = { "csid2" }, 856 .csid = { 857 .is_lite = true, 858 .hw_ops = &csid_ops_gen2, 859 .parent_dev_ops = &vfe_parent_dev_ops, 860 .formats = &csid_formats_gen2 861 } 862 } 863 }; 864 865 static const struct camss_subdev_resources vfe_res_670[] = { 866 /* VFE0 */ 867 { 868 .regulators = {}, 869 .clock = { "camnoc_axi", "cpas_ahb", "soc_ahb", 870 "vfe0", "vfe0_axi" }, 871 .clock_rate = { { 0 }, 872 { 0 }, 873 { 0 }, 874 { 100000000, 320000000, 404000000, 480000000, 600000000 }, 875 { 0 } }, 876 .reg = { "vfe0" }, 877 .interrupt = { "vfe0" }, 878 .vfe = { 879 .line_num = 4, 880 .has_pd = true, 881 .pd_name = "ife0", 882 .hw_ops = &vfe_ops_170, 883 .formats_rdi = &vfe_formats_rdi_845, 884 .formats_pix = &vfe_formats_pix_845 885 } 886 }, 887 888 /* VFE1 */ 889 { 890 .regulators = {}, 891 .clock = { "camnoc_axi", "cpas_ahb", "soc_ahb", 892 "vfe1", "vfe1_axi" }, 893 .clock_rate = { { 0 }, 894 { 0 }, 895 { 0 }, 896 { 100000000, 320000000, 404000000, 480000000, 600000000 }, 897 { 0 } }, 898 .reg = { "vfe1" }, 899 .interrupt = { "vfe1" }, 900 .vfe = { 901 .line_num = 4, 902 .has_pd = true, 903 .pd_name = "ife1", 904 .hw_ops = &vfe_ops_170, 905 .formats_rdi = &vfe_formats_rdi_845, 906 .formats_pix = &vfe_formats_pix_845 907 } 908 }, 909 910 /* VFE-lite */ 911 { 912 .regulators = {}, 913 .clock = { "camnoc_axi", "cpas_ahb", "soc_ahb", 914 "vfe_lite" }, 915 .clock_rate = { { 0 }, 916 { 0 }, 917 { 0 }, 918 { 100000000, 320000000, 404000000, 480000000, 600000000 } }, 919 .reg = { "vfe_lite" }, 920 .interrupt = { "vfe_lite" }, 921 .vfe = { 922 .is_lite = true, 923 .line_num = 4, 924 .hw_ops = &vfe_ops_170, 925 .formats_rdi = &vfe_formats_rdi_845, 926 .formats_pix = &vfe_formats_pix_845 927 } 928 } 929 }; 930 931 static const struct camss_subdev_resources csiphy_res_845[] = { 932 /* CSIPHY0 */ 933 { 934 .regulators = {}, 935 .clock = { "camnoc_axi", "soc_ahb", "slow_ahb_src", 936 "cpas_ahb", "cphy_rx_src", "csiphy0", 937 "csiphy0_timer_src", "csiphy0_timer" }, 938 .clock_rate = { { 0 }, 939 { 0 }, 940 { 0 }, 941 { 0 }, 942 { 0 }, 943 { 0 }, 944 { 0 }, 945 { 19200000, 240000000, 269333333 } }, 946 .reg = { "csiphy0" }, 947 .interrupt = { "csiphy0" }, 948 .csiphy = { 949 .id = 0, 950 .hw_ops = &csiphy_ops_3ph_1_0, 951 .formats = &csiphy_formats_sdm845 952 } 953 }, 954 955 /* CSIPHY1 */ 956 { 957 .regulators = {}, 958 .clock = { "camnoc_axi", "soc_ahb", "slow_ahb_src", 959 "cpas_ahb", "cphy_rx_src", "csiphy1", 960 "csiphy1_timer_src", "csiphy1_timer" }, 961 .clock_rate = { { 0 }, 962 { 0 }, 963 { 0 }, 964 { 0 }, 965 { 0 }, 966 { 0 }, 967 { 0 }, 968 { 19200000, 240000000, 269333333 } }, 969 .reg = { "csiphy1" }, 970 .interrupt = { "csiphy1" }, 971 .csiphy = { 972 .id = 1, 973 .hw_ops = &csiphy_ops_3ph_1_0, 974 .formats = &csiphy_formats_sdm845 975 } 976 }, 977 978 /* CSIPHY2 */ 979 { 980 .regulators = {}, 981 .clock = { "camnoc_axi", "soc_ahb", "slow_ahb_src", 982 "cpas_ahb", "cphy_rx_src", "csiphy2", 983 "csiphy2_timer_src", "csiphy2_timer" }, 984 .clock_rate = { { 0 }, 985 { 0 }, 986 { 0 }, 987 { 0 }, 988 { 0 }, 989 { 0 }, 990 { 0 }, 991 { 19200000, 240000000, 269333333 } }, 992 .reg = { "csiphy2" }, 993 .interrupt = { "csiphy2" }, 994 .csiphy = { 995 .id = 2, 996 .hw_ops = &csiphy_ops_3ph_1_0, 997 .formats = &csiphy_formats_sdm845 998 } 999 }, 1000 1001 /* CSIPHY3 */ 1002 { 1003 .regulators = {}, 1004 .clock = { "camnoc_axi", "soc_ahb", "slow_ahb_src", 1005 "cpas_ahb", "cphy_rx_src", "csiphy3", 1006 "csiphy3_timer_src", "csiphy3_timer" }, 1007 .clock_rate = { { 0 }, 1008 { 0 }, 1009 { 0 }, 1010 { 0 }, 1011 { 0 }, 1012 { 0 }, 1013 { 0 }, 1014 { 19200000, 240000000, 269333333 } }, 1015 .reg = { "csiphy3" }, 1016 .interrupt = { "csiphy3" }, 1017 .csiphy = { 1018 .id = 3, 1019 .hw_ops = &csiphy_ops_3ph_1_0, 1020 .formats = &csiphy_formats_sdm845 1021 } 1022 } 1023 }; 1024 1025 static const struct camss_subdev_resources csid_res_845[] = { 1026 /* CSID0 */ 1027 { 1028 .regulators = { "vdda-phy", "vdda-pll" }, 1029 .clock = { "cpas_ahb", "cphy_rx_src", "slow_ahb_src", 1030 "soc_ahb", "vfe0", "vfe0_src", 1031 "vfe0_cphy_rx", "csi0", 1032 "csi0_src" }, 1033 .clock_rate = { { 0 }, 1034 { 384000000 }, 1035 { 80000000 }, 1036 { 0 }, 1037 { 19200000, 100000000, 320000000, 404000000, 480000000, 600000000 }, 1038 { 320000000 }, 1039 { 0 }, 1040 { 19200000, 75000000, 384000000, 538666667 }, 1041 { 384000000 } }, 1042 .reg = { "csid0" }, 1043 .interrupt = { "csid0" }, 1044 .csid = { 1045 .hw_ops = &csid_ops_gen2, 1046 .parent_dev_ops = &vfe_parent_dev_ops, 1047 .formats = &csid_formats_gen2 1048 } 1049 }, 1050 1051 /* CSID1 */ 1052 { 1053 .regulators = { "vdda-phy", "vdda-pll" }, 1054 .clock = { "cpas_ahb", "cphy_rx_src", "slow_ahb_src", 1055 "soc_ahb", "vfe1", "vfe1_src", 1056 "vfe1_cphy_rx", "csi1", 1057 "csi1_src" }, 1058 .clock_rate = { { 0 }, 1059 { 384000000 }, 1060 { 80000000 }, 1061 { 0 }, 1062 { 19200000, 100000000, 320000000, 404000000, 480000000, 600000000 }, 1063 { 320000000 }, 1064 { 0 }, 1065 { 19200000, 75000000, 384000000, 538666667 }, 1066 { 384000000 } }, 1067 .reg = { "csid1" }, 1068 .interrupt = { "csid1" }, 1069 .csid = { 1070 .hw_ops = &csid_ops_gen2, 1071 .parent_dev_ops = &vfe_parent_dev_ops, 1072 .formats = &csid_formats_gen2 1073 } 1074 }, 1075 1076 /* CSID2 */ 1077 { 1078 .regulators = { "vdda-phy", "vdda-pll" }, 1079 .clock = { "cpas_ahb", "cphy_rx_src", "slow_ahb_src", 1080 "soc_ahb", "vfe_lite", "vfe_lite_src", 1081 "vfe_lite_cphy_rx", "csi2", 1082 "csi2_src" }, 1083 .clock_rate = { { 0 }, 1084 { 384000000 }, 1085 { 80000000 }, 1086 { 0 }, 1087 { 19200000, 100000000, 320000000, 404000000, 480000000, 600000000 }, 1088 { 320000000 }, 1089 { 0 }, 1090 { 19200000, 75000000, 384000000, 538666667 }, 1091 { 384000000 } }, 1092 .reg = { "csid2" }, 1093 .interrupt = { "csid2" }, 1094 .csid = { 1095 .is_lite = true, 1096 .hw_ops = &csid_ops_gen2, 1097 .parent_dev_ops = &vfe_parent_dev_ops, 1098 .formats = &csid_formats_gen2 1099 } 1100 } 1101 }; 1102 1103 static const struct camss_subdev_resources vfe_res_845[] = { 1104 /* VFE0 */ 1105 { 1106 .regulators = {}, 1107 .clock = { "camnoc_axi", "cpas_ahb", "slow_ahb_src", 1108 "soc_ahb", "vfe0", "vfe0_axi", 1109 "vfe0_src", "csi0", 1110 "csi0_src"}, 1111 .clock_rate = { { 0 }, 1112 { 0 }, 1113 { 80000000 }, 1114 { 0 }, 1115 { 19200000, 100000000, 320000000, 404000000, 480000000, 600000000 }, 1116 { 0 }, 1117 { 320000000 }, 1118 { 19200000, 75000000, 384000000, 538666667 }, 1119 { 384000000 } }, 1120 .reg = { "vfe0" }, 1121 .interrupt = { "vfe0" }, 1122 .vfe = { 1123 .line_num = 4, 1124 .pd_name = "ife0", 1125 .has_pd = true, 1126 .hw_ops = &vfe_ops_170, 1127 .formats_rdi = &vfe_formats_rdi_845, 1128 .formats_pix = &vfe_formats_pix_845 1129 } 1130 }, 1131 1132 /* VFE1 */ 1133 { 1134 .regulators = {}, 1135 .clock = { "camnoc_axi", "cpas_ahb", "slow_ahb_src", 1136 "soc_ahb", "vfe1", "vfe1_axi", 1137 "vfe1_src", "csi1", 1138 "csi1_src"}, 1139 .clock_rate = { { 0 }, 1140 { 0 }, 1141 { 80000000 }, 1142 { 0 }, 1143 { 19200000, 100000000, 320000000, 404000000, 480000000, 600000000 }, 1144 { 0 }, 1145 { 320000000 }, 1146 { 19200000, 75000000, 384000000, 538666667 }, 1147 { 384000000 } }, 1148 .reg = { "vfe1" }, 1149 .interrupt = { "vfe1" }, 1150 .vfe = { 1151 .line_num = 4, 1152 .pd_name = "ife1", 1153 .has_pd = true, 1154 .hw_ops = &vfe_ops_170, 1155 .formats_rdi = &vfe_formats_rdi_845, 1156 .formats_pix = &vfe_formats_pix_845 1157 } 1158 }, 1159 1160 /* VFE-lite */ 1161 { 1162 .regulators = {}, 1163 .clock = { "camnoc_axi", "cpas_ahb", "slow_ahb_src", 1164 "soc_ahb", "vfe_lite", 1165 "vfe_lite_src", "csi2", 1166 "csi2_src"}, 1167 .clock_rate = { { 0 }, 1168 { 0 }, 1169 { 80000000 }, 1170 { 0 }, 1171 { 19200000, 100000000, 320000000, 404000000, 480000000, 600000000 }, 1172 { 320000000 }, 1173 { 19200000, 75000000, 384000000, 538666667 }, 1174 { 384000000 } }, 1175 .reg = { "vfe_lite" }, 1176 .interrupt = { "vfe_lite" }, 1177 .vfe = { 1178 .is_lite = true, 1179 .line_num = 4, 1180 .hw_ops = &vfe_ops_170, 1181 .formats_rdi = &vfe_formats_rdi_845, 1182 .formats_pix = &vfe_formats_pix_845 1183 } 1184 } 1185 }; 1186 1187 static const struct camss_subdev_resources csiphy_res_8250[] = { 1188 /* CSIPHY0 */ 1189 { 1190 .regulators = { "vdda-phy", "vdda-pll" }, 1191 .clock = { "csiphy0", "csiphy0_timer" }, 1192 .clock_rate = { { 400000000 }, 1193 { 300000000 } }, 1194 .reg = { "csiphy0" }, 1195 .interrupt = { "csiphy0" }, 1196 .csiphy = { 1197 .id = 0, 1198 .hw_ops = &csiphy_ops_3ph_1_0, 1199 .formats = &csiphy_formats_sdm845 1200 } 1201 }, 1202 /* CSIPHY1 */ 1203 { 1204 .regulators = { "vdda-phy", "vdda-pll" }, 1205 .clock = { "csiphy1", "csiphy1_timer" }, 1206 .clock_rate = { { 400000000 }, 1207 { 300000000 } }, 1208 .reg = { "csiphy1" }, 1209 .interrupt = { "csiphy1" }, 1210 .csiphy = { 1211 .id = 1, 1212 .hw_ops = &csiphy_ops_3ph_1_0, 1213 .formats = &csiphy_formats_sdm845 1214 } 1215 }, 1216 /* CSIPHY2 */ 1217 { 1218 .regulators = { "vdda-phy", "vdda-pll" }, 1219 .clock = { "csiphy2", "csiphy2_timer" }, 1220 .clock_rate = { { 400000000 }, 1221 { 300000000 } }, 1222 .reg = { "csiphy2" }, 1223 .interrupt = { "csiphy2" }, 1224 .csiphy = { 1225 .id = 2, 1226 .hw_ops = &csiphy_ops_3ph_1_0, 1227 .formats = &csiphy_formats_sdm845 1228 } 1229 }, 1230 /* CSIPHY3 */ 1231 { 1232 .regulators = { "vdda-phy", "vdda-pll" }, 1233 .clock = { "csiphy3", "csiphy3_timer" }, 1234 .clock_rate = { { 400000000 }, 1235 { 300000000 } }, 1236 .reg = { "csiphy3" }, 1237 .interrupt = { "csiphy3" }, 1238 .csiphy = { 1239 .id = 3, 1240 .hw_ops = &csiphy_ops_3ph_1_0, 1241 .formats = &csiphy_formats_sdm845 1242 } 1243 }, 1244 /* CSIPHY4 */ 1245 { 1246 .regulators = { "vdda-phy", "vdda-pll" }, 1247 .clock = { "csiphy4", "csiphy4_timer" }, 1248 .clock_rate = { { 400000000 }, 1249 { 300000000 } }, 1250 .reg = { "csiphy4" }, 1251 .interrupt = { "csiphy4" }, 1252 .csiphy = { 1253 .id = 4, 1254 .hw_ops = &csiphy_ops_3ph_1_0, 1255 .formats = &csiphy_formats_sdm845 1256 } 1257 }, 1258 /* CSIPHY5 */ 1259 { 1260 .regulators = { "vdda-phy", "vdda-pll" }, 1261 .clock = { "csiphy5", "csiphy5_timer" }, 1262 .clock_rate = { { 400000000 }, 1263 { 300000000 } }, 1264 .reg = { "csiphy5" }, 1265 .interrupt = { "csiphy5" }, 1266 .csiphy = { 1267 .id = 5, 1268 .hw_ops = &csiphy_ops_3ph_1_0, 1269 .formats = &csiphy_formats_sdm845 1270 } 1271 } 1272 }; 1273 1274 static const struct camss_subdev_resources csid_res_8250[] = { 1275 /* CSID0 */ 1276 { 1277 .regulators = {}, 1278 .clock = { "vfe0_csid", "vfe0_cphy_rx", "vfe0", "vfe0_areg", "vfe0_ahb" }, 1279 .clock_rate = { { 400000000 }, 1280 { 400000000 }, 1281 { 350000000, 475000000, 576000000, 720000000 }, 1282 { 100000000, 200000000, 300000000, 400000000 }, 1283 { 0 } }, 1284 .reg = { "csid0" }, 1285 .interrupt = { "csid0" }, 1286 .csid = { 1287 .hw_ops = &csid_ops_gen2, 1288 .parent_dev_ops = &vfe_parent_dev_ops, 1289 .formats = &csid_formats_gen2 1290 } 1291 }, 1292 /* CSID1 */ 1293 { 1294 .regulators = {}, 1295 .clock = { "vfe1_csid", "vfe1_cphy_rx", "vfe1", "vfe1_areg", "vfe1_ahb" }, 1296 .clock_rate = { { 400000000 }, 1297 { 400000000 }, 1298 { 350000000, 475000000, 576000000, 720000000 }, 1299 { 100000000, 200000000, 300000000, 400000000 }, 1300 { 0 } }, 1301 .reg = { "csid1" }, 1302 .interrupt = { "csid1" }, 1303 .csid = { 1304 .hw_ops = &csid_ops_gen2, 1305 .parent_dev_ops = &vfe_parent_dev_ops, 1306 .formats = &csid_formats_gen2 1307 } 1308 }, 1309 /* CSID2 */ 1310 { 1311 .regulators = {}, 1312 .clock = { "vfe_lite_csid", "vfe_lite_cphy_rx", "vfe_lite", "vfe_lite_ahb" }, 1313 .clock_rate = { { 400000000 }, 1314 { 400000000 }, 1315 { 400000000, 480000000 }, 1316 { 0 } }, 1317 .reg = { "csid2" }, 1318 .interrupt = { "csid2" }, 1319 .csid = { 1320 .is_lite = true, 1321 .hw_ops = &csid_ops_gen2, 1322 .parent_dev_ops = &vfe_parent_dev_ops, 1323 .formats = &csid_formats_gen2 1324 } 1325 }, 1326 /* CSID3 */ 1327 { 1328 .regulators = {}, 1329 .clock = { "vfe_lite_csid", "vfe_lite_cphy_rx", "vfe_lite", "vfe_lite_ahb" }, 1330 .clock_rate = { { 400000000 }, 1331 { 400000000 }, 1332 { 400000000, 480000000 }, 1333 { 0 } }, 1334 .reg = { "csid3" }, 1335 .interrupt = { "csid3" }, 1336 .csid = { 1337 .is_lite = true, 1338 .hw_ops = &csid_ops_gen2, 1339 .parent_dev_ops = &vfe_parent_dev_ops, 1340 .formats = &csid_formats_gen2 1341 } 1342 } 1343 }; 1344 1345 static const struct camss_subdev_resources vfe_res_8250[] = { 1346 /* VFE0 */ 1347 { 1348 .regulators = {}, 1349 .clock = { "camnoc_axi_src", "slow_ahb_src", "cpas_ahb", 1350 "camnoc_axi", "vfe0_ahb", "vfe0_areg", "vfe0", 1351 "vfe0_axi", "cam_hf_axi" }, 1352 .clock_rate = { { 19200000, 300000000, 400000000, 480000000 }, 1353 { 19200000, 80000000 }, 1354 { 19200000 }, 1355 { 0 }, 1356 { 0 }, 1357 { 100000000, 200000000, 300000000, 400000000 }, 1358 { 350000000, 475000000, 576000000, 720000000 }, 1359 { 0 }, 1360 { 0 } }, 1361 .reg = { "vfe0" }, 1362 .interrupt = { "vfe0" }, 1363 .vfe = { 1364 .line_num = 3, 1365 .has_pd = true, 1366 .pd_name = "ife0", 1367 .hw_ops = &vfe_ops_480, 1368 .formats_rdi = &vfe_formats_rdi_845, 1369 .formats_pix = &vfe_formats_pix_845 1370 } 1371 }, 1372 /* VFE1 */ 1373 { 1374 .regulators = {}, 1375 .clock = { "camnoc_axi_src", "slow_ahb_src", "cpas_ahb", 1376 "camnoc_axi", "vfe1_ahb", "vfe1_areg", "vfe1", 1377 "vfe1_axi", "cam_hf_axi" }, 1378 .clock_rate = { { 19200000, 300000000, 400000000, 480000000 }, 1379 { 19200000, 80000000 }, 1380 { 19200000 }, 1381 { 0 }, 1382 { 0 }, 1383 { 100000000, 200000000, 300000000, 400000000 }, 1384 { 350000000, 475000000, 576000000, 720000000 }, 1385 { 0 }, 1386 { 0 } }, 1387 .reg = { "vfe1" }, 1388 .interrupt = { "vfe1" }, 1389 .vfe = { 1390 .line_num = 3, 1391 .has_pd = true, 1392 .pd_name = "ife1", 1393 .hw_ops = &vfe_ops_480, 1394 .formats_rdi = &vfe_formats_rdi_845, 1395 .formats_pix = &vfe_formats_pix_845 1396 } 1397 }, 1398 /* VFE2 (lite) */ 1399 { 1400 .regulators = {}, 1401 .clock = { "camnoc_axi_src", "slow_ahb_src", "cpas_ahb", 1402 "camnoc_axi", "vfe_lite_ahb", "vfe_lite_axi", 1403 "vfe_lite", "cam_hf_axi" }, 1404 .clock_rate = { { 19200000, 300000000, 400000000, 480000000 }, 1405 { 19200000, 80000000 }, 1406 { 19200000 }, 1407 { 0 }, 1408 { 0 }, 1409 { 0 }, 1410 { 400000000, 480000000 }, 1411 { 0 } }, 1412 .reg = { "vfe_lite0" }, 1413 .interrupt = { "vfe_lite0" }, 1414 .vfe = { 1415 .is_lite = true, 1416 .line_num = 4, 1417 .hw_ops = &vfe_ops_480, 1418 .formats_rdi = &vfe_formats_rdi_845, 1419 .formats_pix = &vfe_formats_pix_845 1420 } 1421 }, 1422 /* VFE3 (lite) */ 1423 { 1424 .regulators = {}, 1425 .clock = { "camnoc_axi_src", "slow_ahb_src", "cpas_ahb", 1426 "camnoc_axi", "vfe_lite_ahb", "vfe_lite_axi", 1427 "vfe_lite", "cam_hf_axi" }, 1428 .clock_rate = { { 19200000, 300000000, 400000000, 480000000 }, 1429 { 19200000, 80000000 }, 1430 { 19200000 }, 1431 { 0 }, 1432 { 0 }, 1433 { 0 }, 1434 { 400000000, 480000000 }, 1435 { 0 } }, 1436 .reg = { "vfe_lite1" }, 1437 .interrupt = { "vfe_lite1" }, 1438 .vfe = { 1439 .is_lite = true, 1440 .line_num = 4, 1441 .hw_ops = &vfe_ops_480, 1442 .formats_rdi = &vfe_formats_rdi_845, 1443 .formats_pix = &vfe_formats_pix_845 1444 } 1445 }, 1446 }; 1447 1448 static const struct resources_icc icc_res_sm8250[] = { 1449 { 1450 .name = "cam_ahb", 1451 .icc_bw_tbl.avg = 38400, 1452 .icc_bw_tbl.peak = 76800, 1453 }, 1454 { 1455 .name = "cam_hf_0_mnoc", 1456 .icc_bw_tbl.avg = 2097152, 1457 .icc_bw_tbl.peak = 2097152, 1458 }, 1459 { 1460 .name = "cam_sf_0_mnoc", 1461 .icc_bw_tbl.avg = 0, 1462 .icc_bw_tbl.peak = 2097152, 1463 }, 1464 { 1465 .name = "cam_sf_icp_mnoc", 1466 .icc_bw_tbl.avg = 2097152, 1467 .icc_bw_tbl.peak = 2097152, 1468 }, 1469 }; 1470 1471 static const struct camss_subdev_resources csiphy_res_7280[] = { 1472 /* CSIPHY0 */ 1473 { 1474 .regulators = { "vdda-phy", "vdda-pll" }, 1475 1476 .clock = { "csiphy0", "csiphy0_timer" }, 1477 .clock_rate = { { 300000000, 400000000 }, 1478 { 300000000 } }, 1479 .reg = { "csiphy0" }, 1480 .interrupt = { "csiphy0" }, 1481 .csiphy = { 1482 .id = 0, 1483 .hw_ops = &csiphy_ops_3ph_1_0, 1484 .formats = &csiphy_formats_sdm845, 1485 } 1486 }, 1487 /* CSIPHY1 */ 1488 { 1489 .regulators = { "vdda-phy", "vdda-pll" }, 1490 1491 .clock = { "csiphy1", "csiphy1_timer" }, 1492 .clock_rate = { { 300000000, 400000000 }, 1493 { 300000000 } }, 1494 .reg = { "csiphy1" }, 1495 .interrupt = { "csiphy1" }, 1496 .csiphy = { 1497 .id = 1, 1498 .hw_ops = &csiphy_ops_3ph_1_0, 1499 .formats = &csiphy_formats_sdm845, 1500 } 1501 }, 1502 /* CSIPHY2 */ 1503 { 1504 .regulators = { "vdda-phy", "vdda-pll" }, 1505 1506 .clock = { "csiphy2", "csiphy2_timer" }, 1507 .clock_rate = { { 300000000, 400000000 }, 1508 { 300000000 } }, 1509 .reg = { "csiphy2" }, 1510 .interrupt = { "csiphy2" }, 1511 .csiphy = { 1512 .id = 2, 1513 .hw_ops = &csiphy_ops_3ph_1_0, 1514 .formats = &csiphy_formats_sdm845, 1515 } 1516 }, 1517 /* CSIPHY3 */ 1518 { 1519 .regulators = { "vdda-phy", "vdda-pll" }, 1520 1521 .clock = { "csiphy3", "csiphy3_timer" }, 1522 .clock_rate = { { 300000000, 400000000 }, 1523 { 300000000 } }, 1524 .reg = { "csiphy3" }, 1525 .interrupt = { "csiphy3" }, 1526 .csiphy = { 1527 .id = 3, 1528 .hw_ops = &csiphy_ops_3ph_1_0, 1529 .formats = &csiphy_formats_sdm845, 1530 } 1531 }, 1532 /* CSIPHY4 */ 1533 { 1534 .regulators = { "vdda-phy", "vdda-pll" }, 1535 1536 .clock = { "csiphy4", "csiphy4_timer" }, 1537 .clock_rate = { { 300000000, 400000000 }, 1538 { 300000000 } }, 1539 .reg = { "csiphy4" }, 1540 .interrupt = { "csiphy4" }, 1541 .csiphy = { 1542 .id = 4, 1543 .hw_ops = &csiphy_ops_3ph_1_0, 1544 .formats = &csiphy_formats_sdm845, 1545 } 1546 }, 1547 }; 1548 1549 static const struct camss_subdev_resources csid_res_7280[] = { 1550 /* CSID0 */ 1551 { 1552 .regulators = {}, 1553 1554 .clock = { "vfe0_csid", "vfe0_cphy_rx", "vfe0" }, 1555 .clock_rate = { { 300000000, 400000000 }, 1556 { 0 }, 1557 { 380000000, 510000000, 637000000, 760000000 } 1558 }, 1559 1560 .reg = { "csid0" }, 1561 .interrupt = { "csid0" }, 1562 .csid = { 1563 .is_lite = false, 1564 .hw_ops = &csid_ops_gen2, 1565 .parent_dev_ops = &vfe_parent_dev_ops, 1566 .formats = &csid_formats_gen2 1567 } 1568 }, 1569 /* CSID1 */ 1570 { 1571 .regulators = {}, 1572 1573 .clock = { "vfe1_csid", "vfe1_cphy_rx", "vfe1" }, 1574 .clock_rate = { { 300000000, 400000000 }, 1575 { 0 }, 1576 { 380000000, 510000000, 637000000, 760000000 } 1577 }, 1578 1579 .reg = { "csid1" }, 1580 .interrupt = { "csid1" }, 1581 .csid = { 1582 .is_lite = false, 1583 .hw_ops = &csid_ops_gen2, 1584 .parent_dev_ops = &vfe_parent_dev_ops, 1585 .formats = &csid_formats_gen2 1586 } 1587 }, 1588 /* CSID2 */ 1589 { 1590 .regulators = {}, 1591 1592 .clock = { "vfe2_csid", "vfe2_cphy_rx", "vfe2" }, 1593 .clock_rate = { { 300000000, 400000000 }, 1594 { 0 }, 1595 { 380000000, 510000000, 637000000, 760000000 } 1596 }, 1597 1598 .reg = { "csid2" }, 1599 .interrupt = { "csid2" }, 1600 .csid = { 1601 .is_lite = false, 1602 .hw_ops = &csid_ops_gen2, 1603 .parent_dev_ops = &vfe_parent_dev_ops, 1604 .formats = &csid_formats_gen2 1605 } 1606 }, 1607 /* CSID3 */ 1608 { 1609 .regulators = {}, 1610 1611 .clock = { "vfe_lite0_csid", "vfe_lite0_cphy_rx", "vfe_lite0" }, 1612 .clock_rate = { { 300000000, 400000000 }, 1613 { 0 }, 1614 { 320000000, 400000000, 480000000, 600000000 } 1615 }, 1616 1617 .reg = { "csid_lite0" }, 1618 .interrupt = { "csid_lite0" }, 1619 .csid = { 1620 .is_lite = true, 1621 .hw_ops = &csid_ops_gen2, 1622 .parent_dev_ops = &vfe_parent_dev_ops, 1623 .formats = &csid_formats_gen2 1624 } 1625 }, 1626 /* CSID4 */ 1627 { 1628 .regulators = {}, 1629 1630 .clock = { "vfe_lite1_csid", "vfe_lite1_cphy_rx", "vfe_lite1" }, 1631 .clock_rate = { { 300000000, 400000000 }, 1632 { 0 }, 1633 { 320000000, 400000000, 480000000, 600000000 } 1634 }, 1635 1636 .reg = { "csid_lite1" }, 1637 .interrupt = { "csid_lite1" }, 1638 .csid = { 1639 .is_lite = true, 1640 .hw_ops = &csid_ops_gen2, 1641 .parent_dev_ops = &vfe_parent_dev_ops, 1642 .formats = &csid_formats_gen2 1643 } 1644 }, 1645 }; 1646 1647 static const struct camss_subdev_resources vfe_res_7280[] = { 1648 /* VFE0 */ 1649 { 1650 .regulators = {}, 1651 1652 .clock = { "camnoc_axi", "cpas_ahb", "icp_ahb", "vfe0", 1653 "vfe0_axi", "gcc_axi_hf", "gcc_axi_sf" }, 1654 .clock_rate = { { 150000000, 240000000, 320000000, 400000000, 480000000 }, 1655 { 80000000 }, 1656 { 0 }, 1657 { 380000000, 510000000, 637000000, 760000000 }, 1658 { 0 }, 1659 { 0 }, 1660 { 0 } }, 1661 1662 .reg = { "vfe0" }, 1663 .interrupt = { "vfe0" }, 1664 .vfe = { 1665 .line_num = 3, 1666 .is_lite = false, 1667 .has_pd = true, 1668 .pd_name = "ife0", 1669 .hw_ops = &vfe_ops_170, 1670 .formats_rdi = &vfe_formats_rdi_845, 1671 .formats_pix = &vfe_formats_pix_845 1672 } 1673 }, 1674 /* VFE1 */ 1675 { 1676 .regulators = {}, 1677 1678 .clock = { "camnoc_axi", "cpas_ahb", "icp_ahb", "vfe1", 1679 "vfe1_axi", "gcc_axi_hf", "gcc_axi_sf" }, 1680 .clock_rate = { { 150000000, 240000000, 320000000, 400000000, 480000000 }, 1681 { 80000000 }, 1682 { 0 }, 1683 { 380000000, 510000000, 637000000, 760000000 }, 1684 { 0 }, 1685 { 0 }, 1686 { 0 } }, 1687 1688 .reg = { "vfe1" }, 1689 .interrupt = { "vfe1" }, 1690 .vfe = { 1691 .line_num = 3, 1692 .is_lite = false, 1693 .has_pd = true, 1694 .pd_name = "ife1", 1695 .hw_ops = &vfe_ops_170, 1696 .formats_rdi = &vfe_formats_rdi_845, 1697 .formats_pix = &vfe_formats_pix_845 1698 } 1699 }, 1700 /* VFE2 */ 1701 { 1702 .regulators = {}, 1703 1704 .clock = { "camnoc_axi", "cpas_ahb", "icp_ahb", "vfe2", 1705 "vfe2_axi", "gcc_axi_hf", "gcc_axi_sf" }, 1706 .clock_rate = { { 150000000, 240000000, 320000000, 400000000, 480000000 }, 1707 { 80000000 }, 1708 { 0 }, 1709 { 380000000, 510000000, 637000000, 760000000 }, 1710 { 0 }, 1711 { 0 }, 1712 { 0 } }, 1713 1714 .reg = { "vfe2" }, 1715 .interrupt = { "vfe2" }, 1716 .vfe = { 1717 .line_num = 3, 1718 .is_lite = false, 1719 .hw_ops = &vfe_ops_170, 1720 .has_pd = true, 1721 .pd_name = "ife2", 1722 .formats_rdi = &vfe_formats_rdi_845, 1723 .formats_pix = &vfe_formats_pix_845 1724 } 1725 }, 1726 /* VFE3 (lite) */ 1727 { 1728 .clock = { "camnoc_axi", "cpas_ahb", "icp_ahb", 1729 "vfe_lite0", "gcc_axi_hf", "gcc_axi_sf" }, 1730 .clock_rate = { { 150000000, 240000000, 320000000, 400000000, 480000000 }, 1731 { 80000000 }, 1732 { 0 }, 1733 { 320000000, 400000000, 480000000, 600000000 }, 1734 { 0 }, 1735 { 0 } }, 1736 1737 .regulators = {}, 1738 .reg = { "vfe_lite0" }, 1739 .interrupt = { "vfe_lite0" }, 1740 .vfe = { 1741 .line_num = 4, 1742 .is_lite = true, 1743 .hw_ops = &vfe_ops_170, 1744 .formats_rdi = &vfe_formats_rdi_845, 1745 .formats_pix = &vfe_formats_pix_845 1746 } 1747 }, 1748 /* VFE4 (lite) */ 1749 { 1750 .clock = { "camnoc_axi", "cpas_ahb", "icp_ahb", 1751 "vfe_lite1", "gcc_axi_hf", "gcc_axi_sf" }, 1752 .clock_rate = { { 150000000, 240000000, 320000000, 400000000, 480000000 }, 1753 { 80000000 }, 1754 { 0 }, 1755 { 320000000, 400000000, 480000000, 600000000 }, 1756 { 0 }, 1757 { 0 } }, 1758 1759 .regulators = {}, 1760 .reg = { "vfe_lite1" }, 1761 .interrupt = { "vfe_lite1" }, 1762 .vfe = { 1763 .line_num = 4, 1764 .is_lite = true, 1765 .hw_ops = &vfe_ops_170, 1766 .formats_rdi = &vfe_formats_rdi_845, 1767 .formats_pix = &vfe_formats_pix_845 1768 } 1769 }, 1770 }; 1771 1772 static const struct resources_icc icc_res_sc7280[] = { 1773 { 1774 .name = "ahb", 1775 .icc_bw_tbl.avg = 38400, 1776 .icc_bw_tbl.peak = 76800, 1777 }, 1778 { 1779 .name = "hf_0", 1780 .icc_bw_tbl.avg = 2097152, 1781 .icc_bw_tbl.peak = 2097152, 1782 }, 1783 }; 1784 1785 static const struct camss_subdev_resources csiphy_res_sc8280xp[] = { 1786 /* CSIPHY0 */ 1787 { 1788 .regulators = {}, 1789 .clock = { "csiphy0", "csiphy0_timer" }, 1790 .clock_rate = { { 400000000 }, 1791 { 300000000 } }, 1792 .reg = { "csiphy0" }, 1793 .interrupt = { "csiphy0" }, 1794 .csiphy = { 1795 .id = 0, 1796 .hw_ops = &csiphy_ops_3ph_1_0, 1797 .formats = &csiphy_formats_sdm845 1798 } 1799 }, 1800 /* CSIPHY1 */ 1801 { 1802 .regulators = {}, 1803 .clock = { "csiphy1", "csiphy1_timer" }, 1804 .clock_rate = { { 400000000 }, 1805 { 300000000 } }, 1806 .reg = { "csiphy1" }, 1807 .interrupt = { "csiphy1" }, 1808 .csiphy = { 1809 .id = 1, 1810 .hw_ops = &csiphy_ops_3ph_1_0, 1811 .formats = &csiphy_formats_sdm845 1812 } 1813 }, 1814 /* CSIPHY2 */ 1815 { 1816 .regulators = {}, 1817 .clock = { "csiphy2", "csiphy2_timer" }, 1818 .clock_rate = { { 400000000 }, 1819 { 300000000 } }, 1820 .reg = { "csiphy2" }, 1821 .interrupt = { "csiphy2" }, 1822 .csiphy = { 1823 .id = 2, 1824 .hw_ops = &csiphy_ops_3ph_1_0, 1825 .formats = &csiphy_formats_sdm845 1826 } 1827 }, 1828 /* CSIPHY3 */ 1829 { 1830 .regulators = {}, 1831 .clock = { "csiphy3", "csiphy3_timer" }, 1832 .clock_rate = { { 400000000 }, 1833 { 300000000 } }, 1834 .reg = { "csiphy3" }, 1835 .interrupt = { "csiphy3" }, 1836 .csiphy = { 1837 .id = 3, 1838 .hw_ops = &csiphy_ops_3ph_1_0, 1839 .formats = &csiphy_formats_sdm845 1840 } 1841 }, 1842 }; 1843 1844 static const struct camss_subdev_resources csid_res_sc8280xp[] = { 1845 /* CSID0 */ 1846 { 1847 .regulators = { "vdda-phy", "vdda-pll" }, 1848 .clock = { "vfe0_csid", "vfe0_cphy_rx", "vfe0", "vfe0_axi" }, 1849 .clock_rate = { { 400000000, 480000000, 600000000 }, 1850 { 0 }, 1851 { 0 }, 1852 { 0 } }, 1853 .reg = { "csid0" }, 1854 .interrupt = { "csid0" }, 1855 .csid = { 1856 .hw_ops = &csid_ops_gen2, 1857 .parent_dev_ops = &vfe_parent_dev_ops, 1858 .formats = &csid_formats_gen2 1859 } 1860 }, 1861 /* CSID1 */ 1862 { 1863 .regulators = { "vdda-phy", "vdda-pll" }, 1864 .clock = { "vfe1_csid", "vfe1_cphy_rx", "vfe1", "vfe1_axi" }, 1865 .clock_rate = { { 400000000, 480000000, 600000000 }, 1866 { 0 }, 1867 { 0 }, 1868 { 0 } }, 1869 .reg = { "csid1" }, 1870 .interrupt = { "csid1" }, 1871 .csid = { 1872 .hw_ops = &csid_ops_gen2, 1873 .parent_dev_ops = &vfe_parent_dev_ops, 1874 .formats = &csid_formats_gen2 1875 } 1876 }, 1877 /* CSID2 */ 1878 { 1879 .regulators = { "vdda-phy", "vdda-pll" }, 1880 .clock = { "vfe2_csid", "vfe2_cphy_rx", "vfe2", "vfe2_axi" }, 1881 .clock_rate = { { 400000000, 480000000, 600000000 }, 1882 { 0 }, 1883 { 0 }, 1884 { 0 } }, 1885 .reg = { "csid2" }, 1886 .interrupt = { "csid2" }, 1887 .csid = { 1888 .hw_ops = &csid_ops_gen2, 1889 .parent_dev_ops = &vfe_parent_dev_ops, 1890 .formats = &csid_formats_gen2 1891 } 1892 }, 1893 /* CSID3 */ 1894 { 1895 .regulators = { "vdda-phy", "vdda-pll" }, 1896 .clock = { "vfe3_csid", "vfe3_cphy_rx", "vfe3", "vfe3_axi" }, 1897 .clock_rate = { { 400000000, 480000000, 600000000 }, 1898 { 0 }, 1899 { 0 }, 1900 { 0 } }, 1901 .reg = { "csid3" }, 1902 .interrupt = { "csid3" }, 1903 .csid = { 1904 .hw_ops = &csid_ops_gen2, 1905 .parent_dev_ops = &vfe_parent_dev_ops, 1906 .formats = &csid_formats_gen2 1907 } 1908 }, 1909 /* CSID_LITE0 */ 1910 { 1911 .regulators = { "vdda-phy", "vdda-pll" }, 1912 .clock = { "vfe_lite0_csid", "vfe_lite0_cphy_rx", "vfe_lite0" }, 1913 .clock_rate = { { 400000000, 480000000, 600000000 }, 1914 { 0 }, 1915 { 0 }, }, 1916 .reg = { "csid0_lite" }, 1917 .interrupt = { "csid0_lite" }, 1918 .csid = { 1919 .is_lite = true, 1920 .hw_ops = &csid_ops_gen2, 1921 .parent_dev_ops = &vfe_parent_dev_ops, 1922 .formats = &csid_formats_gen2 1923 } 1924 }, 1925 /* CSID_LITE1 */ 1926 { 1927 .regulators = { "vdda-phy", "vdda-pll" }, 1928 .clock = { "vfe_lite1_csid", "vfe_lite1_cphy_rx", "vfe_lite1" }, 1929 .clock_rate = { { 400000000, 480000000, 600000000 }, 1930 { 0 }, 1931 { 0 }, }, 1932 .reg = { "csid1_lite" }, 1933 .interrupt = { "csid1_lite" }, 1934 .csid = { 1935 .is_lite = true, 1936 .hw_ops = &csid_ops_gen2, 1937 .parent_dev_ops = &vfe_parent_dev_ops, 1938 .formats = &csid_formats_gen2 1939 } 1940 }, 1941 /* CSID_LITE2 */ 1942 { 1943 .regulators = { "vdda-phy", "vdda-pll" }, 1944 .clock = { "vfe_lite2_csid", "vfe_lite2_cphy_rx", "vfe_lite2" }, 1945 .clock_rate = { { 400000000, 480000000, 600000000 }, 1946 { 0 }, 1947 { 0 }, }, 1948 .reg = { "csid2_lite" }, 1949 .interrupt = { "csid2_lite" }, 1950 .csid = { 1951 .is_lite = true, 1952 .hw_ops = &csid_ops_gen2, 1953 .parent_dev_ops = &vfe_parent_dev_ops, 1954 .formats = &csid_formats_gen2 1955 } 1956 }, 1957 /* CSID_LITE3 */ 1958 { 1959 .regulators = { "vdda-phy", "vdda-pll" }, 1960 .clock = { "vfe_lite3_csid", "vfe_lite3_cphy_rx", "vfe_lite3" }, 1961 .clock_rate = { { 400000000, 480000000, 600000000 }, 1962 { 0 }, 1963 { 0 }, }, 1964 .reg = { "csid3_lite" }, 1965 .interrupt = { "csid3_lite" }, 1966 .csid = { 1967 .is_lite = true, 1968 .hw_ops = &csid_ops_gen2, 1969 .parent_dev_ops = &vfe_parent_dev_ops, 1970 .formats = &csid_formats_gen2 1971 } 1972 } 1973 }; 1974 1975 static const struct camss_subdev_resources vfe_res_sc8280xp[] = { 1976 /* VFE0 */ 1977 { 1978 .regulators = {}, 1979 .clock = { "gcc_axi_hf", "gcc_axi_sf", "cpas_ahb", "camnoc_axi", "vfe0", "vfe0_axi" }, 1980 .clock_rate = { { 0 }, 1981 { 0 }, 1982 { 19200000, 80000000}, 1983 { 19200000, 150000000, 266666667, 320000000, 400000000, 480000000 }, 1984 { 400000000, 558000000, 637000000, 760000000 }, 1985 { 0 }, }, 1986 .reg = { "vfe0" }, 1987 .interrupt = { "vfe0" }, 1988 .vfe = { 1989 .line_num = 4, 1990 .pd_name = "ife0", 1991 .hw_ops = &vfe_ops_170, 1992 .formats_rdi = &vfe_formats_rdi_845, 1993 .formats_pix = &vfe_formats_pix_845 1994 } 1995 }, 1996 /* VFE1 */ 1997 { 1998 .regulators = {}, 1999 .clock = { "gcc_axi_hf", "gcc_axi_sf", "cpas_ahb", "camnoc_axi", "vfe1", "vfe1_axi" }, 2000 .clock_rate = { { 0 }, 2001 { 0 }, 2002 { 19200000, 80000000}, 2003 { 19200000, 150000000, 266666667, 320000000, 400000000, 480000000 }, 2004 { 400000000, 558000000, 637000000, 760000000 }, 2005 { 0 }, }, 2006 .reg = { "vfe1" }, 2007 .interrupt = { "vfe1" }, 2008 .vfe = { 2009 .line_num = 4, 2010 .pd_name = "ife1", 2011 .hw_ops = &vfe_ops_170, 2012 .formats_rdi = &vfe_formats_rdi_845, 2013 .formats_pix = &vfe_formats_pix_845 2014 } 2015 }, 2016 /* VFE2 */ 2017 { 2018 .regulators = {}, 2019 .clock = { "gcc_axi_hf", "gcc_axi_sf", "cpas_ahb", "camnoc_axi", "vfe2", "vfe2_axi" }, 2020 .clock_rate = { { 0 }, 2021 { 0 }, 2022 { 19200000, 80000000}, 2023 { 19200000, 150000000, 266666667, 320000000, 400000000, 480000000 }, 2024 { 400000000, 558000000, 637000000, 760000000 }, 2025 { 0 }, }, 2026 .reg = { "vfe2" }, 2027 .interrupt = { "vfe2" }, 2028 .vfe = { 2029 .line_num = 4, 2030 .pd_name = "ife2", 2031 .hw_ops = &vfe_ops_170, 2032 .formats_rdi = &vfe_formats_rdi_845, 2033 .formats_pix = &vfe_formats_pix_845 2034 } 2035 }, 2036 /* VFE3 */ 2037 { 2038 .regulators = {}, 2039 .clock = { "gcc_axi_hf", "gcc_axi_sf", "cpas_ahb", "camnoc_axi", "vfe3", "vfe3_axi" }, 2040 .clock_rate = { { 0 }, 2041 { 0 }, 2042 { 19200000, 80000000}, 2043 { 19200000, 150000000, 266666667, 320000000, 400000000, 480000000 }, 2044 { 400000000, 558000000, 637000000, 760000000 }, 2045 { 0 }, }, 2046 .reg = { "vfe3" }, 2047 .interrupt = { "vfe3" }, 2048 .vfe = { 2049 .line_num = 4, 2050 .pd_name = "ife3", 2051 .hw_ops = &vfe_ops_170, 2052 .formats_rdi = &vfe_formats_rdi_845, 2053 .formats_pix = &vfe_formats_pix_845 2054 } 2055 }, 2056 /* VFE_LITE_0 */ 2057 { 2058 .regulators = {}, 2059 .clock = { "gcc_axi_hf", "gcc_axi_sf", "cpas_ahb", "camnoc_axi", "vfe_lite0" }, 2060 .clock_rate = { { 0 }, 2061 { 0 }, 2062 { 19200000, 80000000}, 2063 { 19200000, 150000000, 266666667, 320000000, 400000000, 480000000 }, 2064 { 320000000, 400000000, 480000000, 600000000 }, }, 2065 .reg = { "vfe_lite0" }, 2066 .interrupt = { "vfe_lite0" }, 2067 .vfe = { 2068 .is_lite = true, 2069 .line_num = 4, 2070 .hw_ops = &vfe_ops_170, 2071 .formats_rdi = &vfe_formats_rdi_845, 2072 .formats_pix = &vfe_formats_pix_845 2073 } 2074 }, 2075 /* VFE_LITE_1 */ 2076 { 2077 .regulators = {}, 2078 .clock = { "gcc_axi_hf", "gcc_axi_sf", "cpas_ahb", "camnoc_axi", "vfe_lite1" }, 2079 .clock_rate = { { 0 }, 2080 { 0 }, 2081 { 19200000, 80000000}, 2082 { 19200000, 150000000, 266666667, 320000000, 400000000, 480000000 }, 2083 { 320000000, 400000000, 480000000, 600000000 }, }, 2084 .reg = { "vfe_lite1" }, 2085 .interrupt = { "vfe_lite1" }, 2086 .vfe = { 2087 .is_lite = true, 2088 .line_num = 4, 2089 .hw_ops = &vfe_ops_170, 2090 .formats_rdi = &vfe_formats_rdi_845, 2091 .formats_pix = &vfe_formats_pix_845 2092 } 2093 }, 2094 /* VFE_LITE_2 */ 2095 { 2096 .regulators = {}, 2097 .clock = { "gcc_axi_hf", "gcc_axi_sf", "cpas_ahb", "camnoc_axi", "vfe_lite2" }, 2098 .clock_rate = { { 0 }, 2099 { 0 }, 2100 { 19200000, 80000000}, 2101 { 19200000, 150000000, 266666667, 320000000, 400000000, 480000000 }, 2102 { 320000000, 400000000, 480000000, 600000000, }, }, 2103 .reg = { "vfe_lite2" }, 2104 .interrupt = { "vfe_lite2" }, 2105 .vfe = { 2106 .is_lite = true, 2107 .line_num = 4, 2108 .hw_ops = &vfe_ops_170, 2109 .formats_rdi = &vfe_formats_rdi_845, 2110 .formats_pix = &vfe_formats_pix_845 2111 } 2112 }, 2113 /* VFE_LITE_3 */ 2114 { 2115 .regulators = {}, 2116 .clock = { "gcc_axi_hf", "gcc_axi_sf", "cpas_ahb", "camnoc_axi", "vfe_lite3" }, 2117 .clock_rate = { { 0 }, 2118 { 0 }, 2119 { 19200000, 80000000}, 2120 { 19200000, 150000000, 266666667, 320000000, 400000000, 480000000 }, 2121 { 320000000, 400000000, 480000000, 600000000 }, }, 2122 .reg = { "vfe_lite3" }, 2123 .interrupt = { "vfe_lite3" }, 2124 .vfe = { 2125 .is_lite = true, 2126 .line_num = 4, 2127 .hw_ops = &vfe_ops_170, 2128 .formats_rdi = &vfe_formats_rdi_845, 2129 .formats_pix = &vfe_formats_pix_845 2130 } 2131 }, 2132 }; 2133 2134 static const struct resources_icc icc_res_sc8280xp[] = { 2135 { 2136 .name = "cam_ahb", 2137 .icc_bw_tbl.avg = 150000, 2138 .icc_bw_tbl.peak = 300000, 2139 }, 2140 { 2141 .name = "cam_hf_mnoc", 2142 .icc_bw_tbl.avg = 2097152, 2143 .icc_bw_tbl.peak = 2097152, 2144 }, 2145 { 2146 .name = "cam_sf_mnoc", 2147 .icc_bw_tbl.avg = 2097152, 2148 .icc_bw_tbl.peak = 2097152, 2149 }, 2150 { 2151 .name = "cam_sf_icp_mnoc", 2152 .icc_bw_tbl.avg = 2097152, 2153 .icc_bw_tbl.peak = 2097152, 2154 }, 2155 }; 2156 2157 static const struct camss_subdev_resources csiphy_res_8550[] = { 2158 /* CSIPHY0 */ 2159 { 2160 .regulators = { "vdda-phy", "vdda-pll" }, 2161 .clock = { "csiphy0", "csiphy0_timer" }, 2162 .clock_rate = { { 400000000, 480000000 }, 2163 { 400000000 } }, 2164 .reg = { "csiphy0" }, 2165 .interrupt = { "csiphy0" }, 2166 .csiphy = { 2167 .id = 0, 2168 .hw_ops = &csiphy_ops_3ph_1_0, 2169 .formats = &csiphy_formats_sdm845 2170 } 2171 }, 2172 /* CSIPHY1 */ 2173 { 2174 .regulators = { "vdda-phy", "vdda-pll" }, 2175 .clock = { "csiphy1", "csiphy1_timer" }, 2176 .clock_rate = { { 400000000, 480000000 }, 2177 { 400000000 } }, 2178 .reg = { "csiphy1" }, 2179 .interrupt = { "csiphy1" }, 2180 .csiphy = { 2181 .id = 1, 2182 .hw_ops = &csiphy_ops_3ph_1_0, 2183 .formats = &csiphy_formats_sdm845 2184 } 2185 }, 2186 /* CSIPHY2 */ 2187 { 2188 .regulators = { "vdda-phy", "vdda-pll" }, 2189 .clock = { "csiphy2", "csiphy2_timer" }, 2190 .clock_rate = { { 400000000, 480000000 }, 2191 { 400000000 } }, 2192 .reg = { "csiphy2" }, 2193 .interrupt = { "csiphy2" }, 2194 .csiphy = { 2195 .id = 2, 2196 .hw_ops = &csiphy_ops_3ph_1_0, 2197 .formats = &csiphy_formats_sdm845 2198 } 2199 }, 2200 /* CSIPHY3 */ 2201 { 2202 .regulators = { "vdda-phy", "vdda-pll" }, 2203 .clock = { "csiphy3", "csiphy3_timer" }, 2204 .clock_rate = { { 400000000, 480000000 }, 2205 { 400000000 } }, 2206 .reg = { "csiphy3" }, 2207 .interrupt = { "csiphy3" }, 2208 .csiphy = { 2209 .id = 3, 2210 .hw_ops = &csiphy_ops_3ph_1_0, 2211 .formats = &csiphy_formats_sdm845 2212 } 2213 }, 2214 /* CSIPHY4 */ 2215 { 2216 .regulators = { "vdda-phy", "vdda-pll" }, 2217 .clock = { "csiphy4", "csiphy4_timer" }, 2218 .clock_rate = { { 400000000, 480000000 }, 2219 { 400000000 } }, 2220 .reg = { "csiphy4" }, 2221 .interrupt = { "csiphy4" }, 2222 .csiphy = { 2223 .id = 4, 2224 .hw_ops = &csiphy_ops_3ph_1_0, 2225 .formats = &csiphy_formats_sdm845 2226 } 2227 }, 2228 /* CSIPHY5 */ 2229 { 2230 .regulators = { "vdda-phy", "vdda-pll" }, 2231 .clock = { "csiphy5", "csiphy5_timer" }, 2232 .clock_rate = { { 400000000, 480000000 }, 2233 { 400000000 } }, 2234 .reg = { "csiphy5" }, 2235 .interrupt = { "csiphy5" }, 2236 .csiphy = { 2237 .id = 5, 2238 .hw_ops = &csiphy_ops_3ph_1_0, 2239 .formats = &csiphy_formats_sdm845 2240 } 2241 }, 2242 /* CSIPHY6 */ 2243 { 2244 .regulators = { "vdda-phy", "vdda-pll" }, 2245 .clock = { "csiphy6", "csiphy6_timer" }, 2246 .clock_rate = { { 400000000, 480000000 }, 2247 { 400000000 } }, 2248 .reg = { "csiphy6" }, 2249 .interrupt = { "csiphy6" }, 2250 .csiphy = { 2251 .id = 6, 2252 .hw_ops = &csiphy_ops_3ph_1_0, 2253 .formats = &csiphy_formats_sdm845 2254 } 2255 }, 2256 /* CSIPHY7 */ 2257 { 2258 .regulators = { "vdda-phy", "vdda-pll" }, 2259 .clock = { "csiphy7", "csiphy7_timer" }, 2260 .clock_rate = { { 400000000, 480000000 }, 2261 { 400000000 } }, 2262 .reg = { "csiphy7" }, 2263 .interrupt = { "csiphy7" }, 2264 .csiphy = { 2265 .id = 7, 2266 .hw_ops = &csiphy_ops_3ph_1_0, 2267 .formats = &csiphy_formats_sdm845 2268 } 2269 } 2270 }; 2271 2272 static const struct resources_wrapper csid_wrapper_res_sm8550 = { 2273 .reg = "csid_wrapper", 2274 }; 2275 2276 static const struct camss_subdev_resources csid_res_8550[] = { 2277 /* CSID0 */ 2278 { 2279 .regulators = {}, 2280 .clock = { "csid", "csiphy_rx" }, 2281 .clock_rate = { { 400000000, 480000000 }, 2282 { 400000000, 480000000 } }, 2283 .reg = { "csid0" }, 2284 .interrupt = { "csid0" }, 2285 .csid = { 2286 .is_lite = false, 2287 .parent_dev_ops = &vfe_parent_dev_ops, 2288 .hw_ops = &csid_ops_780, 2289 .formats = &csid_formats_gen2 2290 } 2291 }, 2292 /* CSID1 */ 2293 { 2294 .regulators = {}, 2295 .clock = { "csid", "csiphy_rx" }, 2296 .clock_rate = { { 400000000, 480000000 }, 2297 { 400000000, 480000000 } }, 2298 .reg = { "csid1" }, 2299 .interrupt = { "csid1" }, 2300 .csid = { 2301 .is_lite = false, 2302 .parent_dev_ops = &vfe_parent_dev_ops, 2303 .hw_ops = &csid_ops_780, 2304 .formats = &csid_formats_gen2 2305 } 2306 }, 2307 /* CSID2 */ 2308 { 2309 .regulators = {}, 2310 .clock = { "csid", "csiphy_rx" }, 2311 .clock_rate = { { 400000000, 480000000 }, 2312 { 400000000, 480000000 } }, 2313 .reg = { "csid2" }, 2314 .interrupt = { "csid2" }, 2315 .csid = { 2316 .is_lite = false, 2317 .parent_dev_ops = &vfe_parent_dev_ops, 2318 .hw_ops = &csid_ops_780, 2319 .formats = &csid_formats_gen2 2320 } 2321 }, 2322 /* CSID3 */ 2323 { 2324 .regulators = {}, 2325 .clock = { "vfe_lite_csid", "vfe_lite_cphy_rx" }, 2326 .clock_rate = { { 400000000, 480000000 }, 2327 { 400000000, 480000000 } }, 2328 .reg = { "csid_lite0" }, 2329 .interrupt = { "csid_lite0" }, 2330 .csid = { 2331 .is_lite = true, 2332 .parent_dev_ops = &vfe_parent_dev_ops, 2333 .hw_ops = &csid_ops_780, 2334 .formats = &csid_formats_gen2 2335 } 2336 }, 2337 /* CSID4 */ 2338 { 2339 .regulators = {}, 2340 .clock = { "vfe_lite_csid", "vfe_lite_cphy_rx" }, 2341 .clock_rate = { { 400000000, 480000000 }, 2342 { 400000000, 480000000 } }, 2343 .reg = { "csid_lite1" }, 2344 .interrupt = { "csid_lite1" }, 2345 .csid = { 2346 .is_lite = true, 2347 .parent_dev_ops = &vfe_parent_dev_ops, 2348 .hw_ops = &csid_ops_780, 2349 .formats = &csid_formats_gen2 2350 } 2351 } 2352 }; 2353 2354 static const struct camss_subdev_resources vfe_res_8550[] = { 2355 /* VFE0 */ 2356 { 2357 .regulators = {}, 2358 .clock = { "gcc_axi_hf", "cpas_ahb", "cpas_fast_ahb_clk", "vfe0_fast_ahb", 2359 "vfe0", "cpas_vfe0", "camnoc_axi" }, 2360 .clock_rate = { { 0 }, 2361 { 80000000 }, 2362 { 300000000, 400000000 }, 2363 { 300000000, 400000000 }, 2364 { 466000000, 594000000, 675000000, 785000000 }, 2365 { 300000000, 400000000 }, 2366 { 300000000, 400000000 } }, 2367 .reg = { "vfe0" }, 2368 .interrupt = { "vfe0" }, 2369 .vfe = { 2370 .line_num = 3, 2371 .is_lite = false, 2372 .has_pd = true, 2373 .pd_name = "ife0", 2374 .hw_ops = &vfe_ops_780, 2375 .formats_rdi = &vfe_formats_rdi_845, 2376 .formats_pix = &vfe_formats_pix_845 2377 } 2378 }, 2379 /* VFE1 */ 2380 { 2381 .regulators = {}, 2382 .clock = { "gcc_axi_hf", "cpas_ahb", "cpas_fast_ahb_clk", "vfe1_fast_ahb", 2383 "vfe1", "cpas_vfe1", "camnoc_axi" }, 2384 .clock_rate = { { 0 }, 2385 { 80000000 }, 2386 { 300000000, 400000000 }, 2387 { 300000000, 400000000 }, 2388 { 466000000, 594000000, 675000000, 785000000 }, 2389 { 300000000, 400000000 }, 2390 { 300000000, 400000000 } }, 2391 .reg = { "vfe1" }, 2392 .interrupt = { "vfe1" }, 2393 .vfe = { 2394 .line_num = 3, 2395 .is_lite = false, 2396 .has_pd = true, 2397 .pd_name = "ife1", 2398 .hw_ops = &vfe_ops_780, 2399 .formats_rdi = &vfe_formats_rdi_845, 2400 .formats_pix = &vfe_formats_pix_845 2401 } 2402 }, 2403 /* VFE2 */ 2404 { 2405 .regulators = {}, 2406 .clock = { "gcc_axi_hf", "cpas_ahb", "cpas_fast_ahb_clk", "vfe2_fast_ahb", 2407 "vfe2", "cpas_vfe2", "camnoc_axi" }, 2408 .clock_rate = { { 0 }, 2409 { 80000000 }, 2410 { 300000000, 400000000 }, 2411 { 300000000, 400000000 }, 2412 { 466000000, 594000000, 675000000, 785000000 }, 2413 { 300000000, 400000000 }, 2414 { 300000000, 400000000 } }, 2415 .reg = { "vfe2" }, 2416 .interrupt = { "vfe2" }, 2417 .vfe = { 2418 .line_num = 3, 2419 .is_lite = false, 2420 .has_pd = true, 2421 .pd_name = "ife2", 2422 .hw_ops = &vfe_ops_780, 2423 .formats_rdi = &vfe_formats_rdi_845, 2424 .formats_pix = &vfe_formats_pix_845 2425 } 2426 }, 2427 /* VFE3 lite */ 2428 { 2429 .regulators = {}, 2430 .clock = { "gcc_axi_hf", "cpas_ahb", "cpas_fast_ahb_clk", "vfe_lite_ahb", 2431 "vfe_lite", "cpas_ife_lite", "camnoc_axi" }, 2432 .clock_rate = { { 0 }, 2433 { 80000000 }, 2434 { 300000000, 400000000 }, 2435 { 300000000, 400000000 }, 2436 { 400000000, 480000000 }, 2437 { 300000000, 400000000 }, 2438 { 300000000, 400000000 } }, 2439 .reg = { "vfe_lite0" }, 2440 .interrupt = { "vfe_lite0" }, 2441 .vfe = { 2442 .line_num = 4, 2443 .is_lite = true, 2444 .hw_ops = &vfe_ops_780, 2445 .formats_rdi = &vfe_formats_rdi_845, 2446 .formats_pix = &vfe_formats_pix_845 2447 } 2448 }, 2449 /* VFE4 lite */ 2450 { 2451 .regulators = {}, 2452 .clock = { "gcc_axi_hf", "cpas_ahb", "cpas_fast_ahb_clk", "vfe_lite_ahb", 2453 "vfe_lite", "cpas_ife_lite", "camnoc_axi" }, 2454 .clock_rate = { { 0 }, 2455 { 80000000 }, 2456 { 300000000, 400000000 }, 2457 { 300000000, 400000000 }, 2458 { 400000000, 480000000 }, 2459 { 300000000, 400000000 }, 2460 { 300000000, 400000000 } }, 2461 .reg = { "vfe_lite1" }, 2462 .interrupt = { "vfe_lite1" }, 2463 .vfe = { 2464 .line_num = 4, 2465 .is_lite = true, 2466 .hw_ops = &vfe_ops_780, 2467 .formats_rdi = &vfe_formats_rdi_845, 2468 .formats_pix = &vfe_formats_pix_845 2469 } 2470 }, 2471 }; 2472 2473 static const struct resources_icc icc_res_sm8550[] = { 2474 { 2475 .name = "ahb", 2476 .icc_bw_tbl.avg = 2097152, 2477 .icc_bw_tbl.peak = 2097152, 2478 }, 2479 { 2480 .name = "hf_0_mnoc", 2481 .icc_bw_tbl.avg = 2097152, 2482 .icc_bw_tbl.peak = 2097152, 2483 }, 2484 }; 2485 2486 static const struct camss_subdev_resources csiphy_res_x1e80100[] = { 2487 /* CSIPHY0 */ 2488 { 2489 .regulators = { "vdd-csiphy-0p8", 2490 "vdd-csiphy-1p2" }, 2491 .clock = { "csiphy0", "csiphy0_timer" }, 2492 .clock_rate = { { 300000000, 400000000, 480000000 }, 2493 { 266666667, 400000000 } }, 2494 .reg = { "csiphy0" }, 2495 .interrupt = { "csiphy0" }, 2496 .csiphy = { 2497 .id = 0, 2498 .hw_ops = &csiphy_ops_3ph_1_0, 2499 .formats = &csiphy_formats_sdm845 2500 }, 2501 }, 2502 /* CSIPHY1 */ 2503 { 2504 .regulators = { "vdd-csiphy-0p8", 2505 "vdd-csiphy-1p2" }, 2506 .clock = { "csiphy1", "csiphy1_timer" }, 2507 .clock_rate = { { 300000000, 400000000, 480000000 }, 2508 { 266666667, 400000000 } }, 2509 .reg = { "csiphy1" }, 2510 .interrupt = { "csiphy1" }, 2511 .csiphy = { 2512 .id = 1, 2513 .hw_ops = &csiphy_ops_3ph_1_0, 2514 .formats = &csiphy_formats_sdm845 2515 }, 2516 }, 2517 /* CSIPHY2 */ 2518 { 2519 .regulators = { "vdd-csiphy-0p8", 2520 "vdd-csiphy-1p2" }, 2521 .clock = { "csiphy2", "csiphy2_timer" }, 2522 .clock_rate = { { 300000000, 400000000, 480000000 }, 2523 { 266666667, 400000000 } }, 2524 .reg = { "csiphy2" }, 2525 .interrupt = { "csiphy2" }, 2526 .csiphy = { 2527 .id = 2, 2528 .hw_ops = &csiphy_ops_3ph_1_0, 2529 .formats = &csiphy_formats_sdm845 2530 }, 2531 }, 2532 /* CSIPHY4 */ 2533 { 2534 .regulators = { "vdd-csiphy-0p8", 2535 "vdd-csiphy-1p2" }, 2536 .clock = { "csiphy4", "csiphy4_timer" }, 2537 .clock_rate = { { 300000000, 400000000, 480000000 }, 2538 { 266666667, 400000000 } }, 2539 .reg = { "csiphy4" }, 2540 .interrupt = { "csiphy4" }, 2541 .csiphy = { 2542 .id = 4, 2543 .hw_ops = &csiphy_ops_3ph_1_0, 2544 .formats = &csiphy_formats_sdm845 2545 }, 2546 }, 2547 }; 2548 2549 static const struct camss_subdev_resources csid_res_x1e80100[] = { 2550 /* CSID0 */ 2551 { 2552 .regulators = {}, 2553 .clock = { "gcc_axi_hf", "gcc_axi_sf", "cpas_ahb", 2554 "cpas_fast_ahb", "csid", "csid_csiphy_rx" }, 2555 .clock_rate = { { 0 }, 2556 { 0 }, 2557 { 64000000, 80000000 }, 2558 { 80000000, 100000000, 200000000, 2559 300000000, 400000000 }, 2560 { 300000000, 400000000, 480000000 }, 2561 { 300000000, 400000000, 480000000 }, }, 2562 .reg = { "csid0" }, 2563 .interrupt = { "csid0" }, 2564 .csid = { 2565 .hw_ops = &csid_ops_680, 2566 .parent_dev_ops = &vfe_parent_dev_ops, 2567 .formats = &csid_formats_gen2 2568 }, 2569 }, 2570 /* CSID1 */ 2571 { 2572 .regulators = {}, 2573 .clock = { "gcc_axi_hf", "gcc_axi_sf", "cpas_ahb", 2574 "cpas_fast_ahb", "csid", "csid_csiphy_rx" }, 2575 .clock_rate = { { 0 }, 2576 { 0 }, 2577 { 64000000, 80000000 }, 2578 { 80000000, 100000000, 200000000, 2579 300000000, 400000000 }, 2580 { 300000000, 400000000, 480000000 }, 2581 { 300000000, 400000000, 480000000 }, }, 2582 .reg = { "csid1" }, 2583 .interrupt = { "csid1" }, 2584 .csid = { 2585 .hw_ops = &csid_ops_680, 2586 .parent_dev_ops = &vfe_parent_dev_ops, 2587 .formats = &csid_formats_gen2 2588 }, 2589 }, 2590 /* CSID2 */ 2591 { 2592 .regulators = {}, 2593 .clock = { "gcc_axi_hf", "gcc_axi_sf", "cpas_ahb", 2594 "cpas_fast_ahb", "csid", "csid_csiphy_rx" }, 2595 .clock_rate = { { 0 }, 2596 { 0 }, 2597 { 64000000, 80000000 }, 2598 { 80000000, 100000000, 200000000, 2599 300000000, 400000000 }, 2600 { 300000000, 400000000, 480000000 }, 2601 { 300000000, 400000000, 480000000 }, }, 2602 .reg = { "csid2" }, 2603 .interrupt = { "csid2" }, 2604 .csid = { 2605 .hw_ops = &csid_ops_680, 2606 .parent_dev_ops = &vfe_parent_dev_ops, 2607 .formats = &csid_formats_gen2 2608 }, 2609 }, 2610 /* CSID_LITE0 */ 2611 { 2612 .regulators = {}, 2613 .clock = { "gcc_axi_hf", "gcc_axi_sf", "cpas_ahb", 2614 "cpas_fast_ahb", "csid", "csid_csiphy_rx" }, 2615 .clock_rate = { { 0 }, 2616 { 0 }, 2617 { 64000000, 80000000 }, 2618 { 80000000, 100000000, 200000000, 2619 300000000, 400000000 }, 2620 { 300000000, 400000000, 480000000 }, 2621 { 300000000, 400000000, 480000000 }, }, 2622 .reg = { "csid_lite0" }, 2623 .interrupt = { "csid_lite0" }, 2624 .csid = { 2625 .is_lite = true, 2626 .hw_ops = &csid_ops_680, 2627 .parent_dev_ops = &vfe_parent_dev_ops, 2628 .formats = &csid_formats_gen2 2629 } 2630 }, 2631 /* CSID_LITE1 */ 2632 { 2633 .regulators = {}, 2634 .clock = { "gcc_axi_hf", "gcc_axi_sf", "cpas_ahb", 2635 "cpas_fast_ahb", "csid", "csid_csiphy_rx" }, 2636 .clock_rate = { { 0 }, 2637 { 0 }, 2638 { 64000000, 80000000 }, 2639 { 80000000, 100000000, 200000000, 2640 300000000, 400000000 }, 2641 { 300000000, 400000000, 480000000 }, 2642 { 300000000, 400000000, 480000000 }, }, 2643 2644 .reg = { "csid_lite1" }, 2645 .interrupt = { "csid_lite1" }, 2646 .csid = { 2647 .is_lite = true, 2648 .hw_ops = &csid_ops_680, 2649 .parent_dev_ops = &vfe_parent_dev_ops, 2650 .formats = &csid_formats_gen2 2651 } 2652 }, 2653 }; 2654 2655 static const struct camss_subdev_resources vfe_res_x1e80100[] = { 2656 /* IFE0 */ 2657 { 2658 .regulators = {}, 2659 .clock = {"camnoc_rt_axi", "camnoc_nrt_axi", "cpas_ahb", 2660 "cpas_fast_ahb", "cpas_vfe0", "vfe0_fast_ahb", 2661 "vfe0" }, 2662 .clock_rate = { { 0 }, 2663 { 0 }, 2664 { 0 }, 2665 { 0 }, 2666 { 0 }, 2667 { 0 }, 2668 { 345600000, 432000000, 594000000, 675000000, 2669 727000000 }, }, 2670 .reg = { "vfe0" }, 2671 .interrupt = { "vfe0" }, 2672 .vfe = { 2673 .line_num = 4, 2674 .pd_name = "ife0", 2675 .hw_ops = &vfe_ops_680, 2676 .formats_rdi = &vfe_formats_rdi_845, 2677 .formats_pix = &vfe_formats_pix_845 2678 }, 2679 }, 2680 /* IFE1 */ 2681 { 2682 .regulators = {}, 2683 .clock = { "camnoc_rt_axi", "camnoc_nrt_axi", "cpas_ahb", 2684 "cpas_fast_ahb", "cpas_vfe1", "vfe1_fast_ahb", 2685 "vfe1" }, 2686 .clock_rate = { { 0 }, 2687 { 0 }, 2688 { 0 }, 2689 { 0 }, 2690 { 0 }, 2691 { 0 }, 2692 { 345600000, 432000000, 594000000, 675000000, 2693 727000000 }, }, 2694 .reg = { "vfe1" }, 2695 .interrupt = { "vfe1" }, 2696 .vfe = { 2697 .line_num = 4, 2698 .pd_name = "ife1", 2699 .hw_ops = &vfe_ops_680, 2700 .formats_rdi = &vfe_formats_rdi_845, 2701 .formats_pix = &vfe_formats_pix_845 2702 }, 2703 }, 2704 /* IFE_LITE_0 */ 2705 { 2706 .regulators = {}, 2707 .clock = { "camnoc_rt_axi", "camnoc_nrt_axi", "cpas_ahb", 2708 "vfe_lite_ahb", "cpas_vfe_lite", "vfe_lite", 2709 "vfe_lite_csid" }, 2710 .clock_rate = { { 0 }, 2711 { 0 }, 2712 { 0 }, 2713 { 0 }, 2714 { 0 }, 2715 { 266666667, 400000000, 480000000 }, 2716 { 266666667, 400000000, 480000000 }, }, 2717 .reg = { "vfe_lite0" }, 2718 .interrupt = { "vfe_lite0" }, 2719 .vfe = { 2720 .is_lite = true, 2721 .line_num = 4, 2722 .hw_ops = &vfe_ops_680, 2723 .formats_rdi = &vfe_formats_rdi_845, 2724 .formats_pix = &vfe_formats_pix_845 2725 }, 2726 }, 2727 /* IFE_LITE_1 */ 2728 { 2729 .regulators = {}, 2730 .clock = { "camnoc_rt_axi", "camnoc_nrt_axi", "cpas_ahb", 2731 "vfe_lite_ahb", "cpas_vfe_lite", "vfe_lite", 2732 "vfe_lite_csid" }, 2733 .clock_rate = { { 0 }, 2734 { 0 }, 2735 { 0 }, 2736 { 0 }, 2737 { 0 }, 2738 { 266666667, 400000000, 480000000 }, 2739 { 266666667, 400000000, 480000000 }, }, 2740 .reg = { "vfe_lite1" }, 2741 .interrupt = { "vfe_lite1" }, 2742 .vfe = { 2743 .is_lite = true, 2744 .line_num = 4, 2745 .hw_ops = &vfe_ops_680, 2746 .formats_rdi = &vfe_formats_rdi_845, 2747 .formats_pix = &vfe_formats_pix_845 2748 }, 2749 }, 2750 }; 2751 2752 static const struct resources_icc icc_res_x1e80100[] = { 2753 { 2754 .name = "ahb", 2755 .icc_bw_tbl.avg = 150000, 2756 .icc_bw_tbl.peak = 300000, 2757 }, 2758 { 2759 .name = "hf_mnoc", 2760 .icc_bw_tbl.avg = 2097152, 2761 .icc_bw_tbl.peak = 2097152, 2762 }, 2763 { 2764 .name = "sf_mnoc", 2765 .icc_bw_tbl.avg = 2097152, 2766 .icc_bw_tbl.peak = 2097152, 2767 }, 2768 { 2769 .name = "sf_icp_mnoc", 2770 .icc_bw_tbl.avg = 2097152, 2771 .icc_bw_tbl.peak = 2097152, 2772 }, 2773 }; 2774 2775 static const struct resources_wrapper csid_wrapper_res_x1e80100 = { 2776 .reg = "csid_wrapper", 2777 }; 2778 2779 /* 2780 * camss_add_clock_margin - Add margin to clock frequency rate 2781 * @rate: Clock frequency rate 2782 * 2783 * When making calculations with physical clock frequency values 2784 * some safety margin must be added. Add it. 2785 */ 2786 inline void camss_add_clock_margin(u64 *rate) 2787 { 2788 *rate *= CAMSS_CLOCK_MARGIN_NUMERATOR; 2789 *rate = div_u64(*rate, CAMSS_CLOCK_MARGIN_DENOMINATOR); 2790 } 2791 2792 /* 2793 * camss_enable_clocks - Enable multiple clocks 2794 * @nclocks: Number of clocks in clock array 2795 * @clock: Clock array 2796 * @dev: Device 2797 * 2798 * Return 0 on success or a negative error code otherwise 2799 */ 2800 int camss_enable_clocks(int nclocks, struct camss_clock *clock, 2801 struct device *dev) 2802 { 2803 int ret; 2804 int i; 2805 2806 for (i = 0; i < nclocks; i++) { 2807 ret = clk_prepare_enable(clock[i].clk); 2808 if (ret) { 2809 dev_err(dev, "clock enable failed: %d\n", ret); 2810 goto error; 2811 } 2812 } 2813 2814 return 0; 2815 2816 error: 2817 for (i--; i >= 0; i--) 2818 clk_disable_unprepare(clock[i].clk); 2819 2820 return ret; 2821 } 2822 2823 /* 2824 * camss_disable_clocks - Disable multiple clocks 2825 * @nclocks: Number of clocks in clock array 2826 * @clock: Clock array 2827 */ 2828 void camss_disable_clocks(int nclocks, struct camss_clock *clock) 2829 { 2830 int i; 2831 2832 for (i = nclocks - 1; i >= 0; i--) 2833 clk_disable_unprepare(clock[i].clk); 2834 } 2835 2836 /* 2837 * camss_find_sensor_pad - Find the media pad via which the sensor is linked 2838 * @entity: Media entity to start searching from 2839 * 2840 * Return a pointer to sensor media pad or NULL if not found 2841 */ 2842 struct media_pad *camss_find_sensor_pad(struct media_entity *entity) 2843 { 2844 struct media_pad *pad; 2845 2846 while (1) { 2847 pad = &entity->pads[0]; 2848 if (!(pad->flags & MEDIA_PAD_FL_SINK)) 2849 return NULL; 2850 2851 pad = media_pad_remote_pad_first(pad); 2852 if (!pad || !is_media_entity_v4l2_subdev(pad->entity)) 2853 return NULL; 2854 2855 entity = pad->entity; 2856 2857 if (entity->function == MEDIA_ENT_F_CAM_SENSOR) 2858 return pad; 2859 } 2860 } 2861 2862 /** 2863 * camss_get_link_freq - Get link frequency from sensor 2864 * @entity: Media entity in the current pipeline 2865 * @bpp: Number of bits per pixel for the current format 2866 * @lanes: Number of lanes in the link to the sensor 2867 * 2868 * Return link frequency on success or a negative error code otherwise 2869 */ 2870 s64 camss_get_link_freq(struct media_entity *entity, unsigned int bpp, 2871 unsigned int lanes) 2872 { 2873 struct media_pad *sensor_pad; 2874 2875 sensor_pad = camss_find_sensor_pad(entity); 2876 if (!sensor_pad) 2877 return -ENODEV; 2878 2879 return v4l2_get_link_freq(sensor_pad, bpp, 2 * lanes); 2880 } 2881 2882 /* 2883 * camss_get_pixel_clock - Get pixel clock rate from sensor 2884 * @entity: Media entity in the current pipeline 2885 * @pixel_clock: Received pixel clock value 2886 * 2887 * Return 0 on success or a negative error code otherwise 2888 */ 2889 int camss_get_pixel_clock(struct media_entity *entity, u64 *pixel_clock) 2890 { 2891 struct media_pad *sensor_pad; 2892 struct v4l2_subdev *subdev; 2893 struct v4l2_ctrl *ctrl; 2894 2895 sensor_pad = camss_find_sensor_pad(entity); 2896 if (!sensor_pad) 2897 return -ENODEV; 2898 2899 subdev = media_entity_to_v4l2_subdev(sensor_pad->entity); 2900 2901 ctrl = v4l2_ctrl_find(subdev->ctrl_handler, V4L2_CID_PIXEL_RATE); 2902 2903 if (!ctrl) 2904 return -EINVAL; 2905 2906 *pixel_clock = v4l2_ctrl_g_ctrl_int64(ctrl); 2907 2908 return 0; 2909 } 2910 2911 int camss_pm_domain_on(struct camss *camss, int id) 2912 { 2913 int ret = 0; 2914 2915 if (id < camss->res->vfe_num) { 2916 struct vfe_device *vfe = &camss->vfe[id]; 2917 2918 ret = vfe->res->hw_ops->pm_domain_on(vfe); 2919 } 2920 2921 return ret; 2922 } 2923 2924 void camss_pm_domain_off(struct camss *camss, int id) 2925 { 2926 if (id < camss->res->vfe_num) { 2927 struct vfe_device *vfe = &camss->vfe[id]; 2928 2929 vfe->res->hw_ops->pm_domain_off(vfe); 2930 } 2931 } 2932 2933 static int vfe_parent_dev_ops_get(struct camss *camss, int id) 2934 { 2935 int ret = -EINVAL; 2936 2937 if (id < camss->res->vfe_num) { 2938 struct vfe_device *vfe = &camss->vfe[id]; 2939 2940 ret = vfe_get(vfe); 2941 } 2942 2943 return ret; 2944 } 2945 2946 static int vfe_parent_dev_ops_put(struct camss *camss, int id) 2947 { 2948 if (id < camss->res->vfe_num) { 2949 struct vfe_device *vfe = &camss->vfe[id]; 2950 2951 vfe_put(vfe); 2952 } 2953 2954 return 0; 2955 } 2956 2957 static void __iomem 2958 *vfe_parent_dev_ops_get_base_address(struct camss *camss, int id) 2959 { 2960 if (id < camss->res->vfe_num) { 2961 struct vfe_device *vfe = &camss->vfe[id]; 2962 2963 return vfe->base; 2964 } 2965 2966 return NULL; 2967 } 2968 2969 static const struct parent_dev_ops vfe_parent_dev_ops = { 2970 .get = vfe_parent_dev_ops_get, 2971 .put = vfe_parent_dev_ops_put, 2972 .get_base_address = vfe_parent_dev_ops_get_base_address 2973 }; 2974 2975 /* 2976 * camss_of_parse_endpoint_node - Parse port endpoint node 2977 * @dev: Device 2978 * @node: Device node to be parsed 2979 * @csd: Parsed data from port endpoint node 2980 * 2981 * Return 0 on success or a negative error code on failure 2982 */ 2983 static int camss_of_parse_endpoint_node(struct device *dev, 2984 struct device_node *node, 2985 struct camss_async_subdev *csd) 2986 { 2987 struct csiphy_lanes_cfg *lncfg = &csd->interface.csi2.lane_cfg; 2988 struct v4l2_mbus_config_mipi_csi2 *mipi_csi2; 2989 struct v4l2_fwnode_endpoint vep = { { 0 } }; 2990 unsigned int i; 2991 int ret; 2992 2993 ret = v4l2_fwnode_endpoint_parse(of_fwnode_handle(node), &vep); 2994 if (ret) 2995 return ret; 2996 2997 /* 2998 * Most SoCs support both D-PHY and C-PHY standards, but currently only 2999 * D-PHY is supported in the driver. 3000 */ 3001 if (vep.bus_type != V4L2_MBUS_CSI2_DPHY) { 3002 dev_err(dev, "Unsupported bus type %d\n", vep.bus_type); 3003 return -EINVAL; 3004 } 3005 3006 csd->interface.csiphy_id = vep.base.port; 3007 3008 mipi_csi2 = &vep.bus.mipi_csi2; 3009 lncfg->clk.pos = mipi_csi2->clock_lane; 3010 lncfg->clk.pol = mipi_csi2->lane_polarities[0]; 3011 lncfg->num_data = mipi_csi2->num_data_lanes; 3012 3013 lncfg->data = devm_kcalloc(dev, 3014 lncfg->num_data, sizeof(*lncfg->data), 3015 GFP_KERNEL); 3016 if (!lncfg->data) 3017 return -ENOMEM; 3018 3019 for (i = 0; i < lncfg->num_data; i++) { 3020 lncfg->data[i].pos = mipi_csi2->data_lanes[i]; 3021 lncfg->data[i].pol = mipi_csi2->lane_polarities[i + 1]; 3022 } 3023 3024 return 0; 3025 } 3026 3027 /* 3028 * camss_of_parse_ports - Parse ports node 3029 * @dev: Device 3030 * @notifier: v4l2_device notifier data 3031 * 3032 * Return number of "port" nodes found in "ports" node 3033 */ 3034 static int camss_of_parse_ports(struct camss *camss) 3035 { 3036 struct device *dev = camss->dev; 3037 struct device_node *node = NULL; 3038 struct device_node *remote = NULL; 3039 int ret, num_subdevs = 0; 3040 3041 for_each_endpoint_of_node(dev->of_node, node) { 3042 struct camss_async_subdev *csd; 3043 3044 if (!of_device_is_available(node)) 3045 continue; 3046 3047 remote = of_graph_get_remote_port_parent(node); 3048 if (!remote) { 3049 dev_err(dev, "Cannot get remote parent\n"); 3050 ret = -EINVAL; 3051 goto err_cleanup; 3052 } 3053 3054 csd = v4l2_async_nf_add_fwnode(&camss->notifier, 3055 of_fwnode_handle(remote), 3056 struct camss_async_subdev); 3057 of_node_put(remote); 3058 if (IS_ERR(csd)) { 3059 ret = PTR_ERR(csd); 3060 goto err_cleanup; 3061 } 3062 3063 ret = camss_of_parse_endpoint_node(dev, node, csd); 3064 if (ret < 0) 3065 goto err_cleanup; 3066 3067 num_subdevs++; 3068 } 3069 3070 return num_subdevs; 3071 3072 err_cleanup: 3073 of_node_put(node); 3074 return ret; 3075 } 3076 3077 /* 3078 * camss_init_subdevices - Initialize subdev structures and resources 3079 * @camss: CAMSS device 3080 * 3081 * Return 0 on success or a negative error code on failure 3082 */ 3083 static int camss_init_subdevices(struct camss *camss) 3084 { 3085 struct platform_device *pdev = to_platform_device(camss->dev); 3086 const struct camss_resources *res = camss->res; 3087 unsigned int i; 3088 int ret; 3089 3090 for (i = 0; i < camss->res->csiphy_num; i++) { 3091 ret = msm_csiphy_subdev_init(camss, &camss->csiphy[i], 3092 &res->csiphy_res[i], 3093 res->csiphy_res[i].csiphy.id); 3094 if (ret < 0) { 3095 dev_err(camss->dev, 3096 "Failed to init csiphy%d sub-device: %d\n", 3097 i, ret); 3098 return ret; 3099 } 3100 } 3101 3102 /* note: SM8250 requires VFE to be initialized before CSID */ 3103 for (i = 0; i < camss->res->vfe_num; i++) { 3104 ret = msm_vfe_subdev_init(camss, &camss->vfe[i], 3105 &res->vfe_res[i], i); 3106 if (ret < 0) { 3107 dev_err(camss->dev, 3108 "Fail to init vfe%d sub-device: %d\n", i, ret); 3109 return ret; 3110 } 3111 } 3112 3113 /* Get optional CSID wrapper regs shared between CSID devices */ 3114 if (res->csid_wrapper_res) { 3115 char *reg = res->csid_wrapper_res->reg; 3116 void __iomem *base; 3117 3118 base = devm_platform_ioremap_resource_byname(pdev, reg); 3119 if (IS_ERR(base)) 3120 return PTR_ERR(base); 3121 camss->csid_wrapper_base = base; 3122 } 3123 3124 for (i = 0; i < camss->res->csid_num; i++) { 3125 ret = msm_csid_subdev_init(camss, &camss->csid[i], 3126 &res->csid_res[i], i); 3127 if (ret < 0) { 3128 dev_err(camss->dev, 3129 "Failed to init csid%d sub-device: %d\n", 3130 i, ret); 3131 return ret; 3132 } 3133 } 3134 3135 ret = msm_ispif_subdev_init(camss, res->ispif_res); 3136 if (ret < 0) { 3137 dev_err(camss->dev, "Failed to init ispif sub-device: %d\n", 3138 ret); 3139 return ret; 3140 } 3141 3142 return 0; 3143 } 3144 3145 /* 3146 * camss_link_entities - Register subdev nodes and create links 3147 * camss_link_err - print error in case link creation fails 3148 * @src_name: name for source of the link 3149 * @sink_name: name for sink of the link 3150 */ 3151 inline void camss_link_err(struct camss *camss, 3152 const char *src_name, 3153 const char *sink_name, 3154 int ret) 3155 { 3156 dev_err(camss->dev, 3157 "Failed to link %s->%s entities: %d\n", 3158 src_name, 3159 sink_name, 3160 ret); 3161 } 3162 3163 /* 3164 * camss_link_entities - Register subdev nodes and create links 3165 * @camss: CAMSS device 3166 * 3167 * Return 0 on success or a negative error code on failure 3168 */ 3169 static int camss_link_entities(struct camss *camss) 3170 { 3171 int i, j, k; 3172 int ret; 3173 3174 for (i = 0; i < camss->res->csiphy_num; i++) { 3175 for (j = 0; j < camss->res->csid_num; j++) { 3176 ret = media_create_pad_link(&camss->csiphy[i].subdev.entity, 3177 MSM_CSIPHY_PAD_SRC, 3178 &camss->csid[j].subdev.entity, 3179 MSM_CSID_PAD_SINK, 3180 0); 3181 if (ret < 0) { 3182 camss_link_err(camss, 3183 camss->csiphy[i].subdev.entity.name, 3184 camss->csid[j].subdev.entity.name, 3185 ret); 3186 return ret; 3187 } 3188 } 3189 } 3190 3191 if (camss->ispif) { 3192 for (i = 0; i < camss->res->csid_num; i++) { 3193 for (j = 0; j < camss->ispif->line_num; j++) { 3194 ret = media_create_pad_link(&camss->csid[i].subdev.entity, 3195 MSM_CSID_PAD_SRC, 3196 &camss->ispif->line[j].subdev.entity, 3197 MSM_ISPIF_PAD_SINK, 3198 0); 3199 if (ret < 0) { 3200 camss_link_err(camss, 3201 camss->csid[i].subdev.entity.name, 3202 camss->ispif->line[j].subdev.entity.name, 3203 ret); 3204 return ret; 3205 } 3206 } 3207 } 3208 3209 for (i = 0; i < camss->ispif->line_num; i++) 3210 for (k = 0; k < camss->res->vfe_num; k++) 3211 for (j = 0; j < camss->vfe[k].res->line_num; j++) { 3212 struct v4l2_subdev *ispif = &camss->ispif->line[i].subdev; 3213 struct v4l2_subdev *vfe = &camss->vfe[k].line[j].subdev; 3214 3215 ret = media_create_pad_link(&ispif->entity, 3216 MSM_ISPIF_PAD_SRC, 3217 &vfe->entity, 3218 MSM_VFE_PAD_SINK, 3219 0); 3220 if (ret < 0) { 3221 camss_link_err(camss, ispif->entity.name, 3222 vfe->entity.name, 3223 ret); 3224 return ret; 3225 } 3226 } 3227 } else { 3228 for (i = 0; i < camss->res->csid_num; i++) 3229 for (k = 0; k < camss->res->vfe_num; k++) 3230 for (j = 0; j < camss->vfe[k].res->line_num; j++) { 3231 struct v4l2_subdev *csid = &camss->csid[i].subdev; 3232 struct v4l2_subdev *vfe = &camss->vfe[k].line[j].subdev; 3233 3234 ret = media_create_pad_link(&csid->entity, 3235 MSM_CSID_PAD_FIRST_SRC + j, 3236 &vfe->entity, 3237 MSM_VFE_PAD_SINK, 3238 0); 3239 if (ret < 0) { 3240 camss_link_err(camss, csid->entity.name, 3241 vfe->entity.name, 3242 ret); 3243 return ret; 3244 } 3245 } 3246 } 3247 3248 return 0; 3249 } 3250 3251 void camss_reg_update(struct camss *camss, int hw_id, int port_id, bool is_clear) 3252 { 3253 struct csid_device *csid; 3254 3255 if (hw_id < camss->res->csid_num) { 3256 csid = &camss->csid[hw_id]; 3257 3258 csid->res->hw_ops->reg_update(csid, port_id, is_clear); 3259 } 3260 } 3261 3262 void camss_buf_done(struct camss *camss, int hw_id, int port_id) 3263 { 3264 struct vfe_device *vfe; 3265 3266 if (hw_id < camss->res->vfe_num) { 3267 vfe = &camss->vfe[hw_id]; 3268 3269 vfe->res->hw_ops->vfe_buf_done(vfe, port_id); 3270 } 3271 } 3272 3273 /* 3274 * camss_register_entities - Register subdev nodes and create links 3275 * @camss: CAMSS device 3276 * 3277 * Return 0 on success or a negative error code on failure 3278 */ 3279 static int camss_register_entities(struct camss *camss) 3280 { 3281 int i; 3282 int ret; 3283 3284 for (i = 0; i < camss->res->csiphy_num; i++) { 3285 ret = msm_csiphy_register_entity(&camss->csiphy[i], 3286 &camss->v4l2_dev); 3287 if (ret < 0) { 3288 dev_err(camss->dev, 3289 "Failed to register csiphy%d entity: %d\n", 3290 i, ret); 3291 goto err_reg_csiphy; 3292 } 3293 } 3294 3295 for (i = 0; i < camss->res->csid_num; i++) { 3296 ret = msm_csid_register_entity(&camss->csid[i], 3297 &camss->v4l2_dev); 3298 if (ret < 0) { 3299 dev_err(camss->dev, 3300 "Failed to register csid%d entity: %d\n", 3301 i, ret); 3302 goto err_reg_csid; 3303 } 3304 } 3305 3306 ret = msm_ispif_register_entities(camss->ispif, 3307 &camss->v4l2_dev); 3308 if (ret < 0) { 3309 dev_err(camss->dev, "Failed to register ispif entities: %d\n", ret); 3310 goto err_reg_ispif; 3311 } 3312 3313 for (i = 0; i < camss->res->vfe_num; i++) { 3314 ret = msm_vfe_register_entities(&camss->vfe[i], 3315 &camss->v4l2_dev); 3316 if (ret < 0) { 3317 dev_err(camss->dev, 3318 "Failed to register vfe%d entities: %d\n", 3319 i, ret); 3320 goto err_reg_vfe; 3321 } 3322 } 3323 3324 return 0; 3325 3326 err_reg_vfe: 3327 for (i--; i >= 0; i--) 3328 msm_vfe_unregister_entities(&camss->vfe[i]); 3329 3330 err_reg_ispif: 3331 msm_ispif_unregister_entities(camss->ispif); 3332 3333 i = camss->res->csid_num; 3334 err_reg_csid: 3335 for (i--; i >= 0; i--) 3336 msm_csid_unregister_entity(&camss->csid[i]); 3337 3338 i = camss->res->csiphy_num; 3339 err_reg_csiphy: 3340 for (i--; i >= 0; i--) 3341 msm_csiphy_unregister_entity(&camss->csiphy[i]); 3342 3343 return ret; 3344 } 3345 3346 /* 3347 * camss_unregister_entities - Unregister subdev nodes 3348 * @camss: CAMSS device 3349 * 3350 * Return 0 on success or a negative error code on failure 3351 */ 3352 static void camss_unregister_entities(struct camss *camss) 3353 { 3354 unsigned int i; 3355 3356 for (i = 0; i < camss->res->csiphy_num; i++) 3357 msm_csiphy_unregister_entity(&camss->csiphy[i]); 3358 3359 for (i = 0; i < camss->res->csid_num; i++) 3360 msm_csid_unregister_entity(&camss->csid[i]); 3361 3362 msm_ispif_unregister_entities(camss->ispif); 3363 3364 for (i = 0; i < camss->res->vfe_num; i++) 3365 msm_vfe_unregister_entities(&camss->vfe[i]); 3366 } 3367 3368 static int camss_subdev_notifier_bound(struct v4l2_async_notifier *async, 3369 struct v4l2_subdev *subdev, 3370 struct v4l2_async_connection *asd) 3371 { 3372 struct camss *camss = container_of(async, struct camss, notifier); 3373 struct camss_async_subdev *csd = 3374 container_of(asd, struct camss_async_subdev, asd); 3375 u8 id = csd->interface.csiphy_id; 3376 struct csiphy_device *csiphy = &camss->csiphy[id]; 3377 3378 csiphy->cfg.csi2 = &csd->interface.csi2; 3379 subdev->host_priv = csiphy; 3380 3381 return 0; 3382 } 3383 3384 static int camss_subdev_notifier_complete(struct v4l2_async_notifier *async) 3385 { 3386 struct camss *camss = container_of(async, struct camss, notifier); 3387 struct v4l2_device *v4l2_dev = &camss->v4l2_dev; 3388 struct v4l2_subdev *sd; 3389 3390 list_for_each_entry(sd, &v4l2_dev->subdevs, list) { 3391 struct csiphy_device *csiphy = sd->host_priv; 3392 struct media_entity *input, *sensor; 3393 unsigned int i; 3394 int ret; 3395 3396 if (!csiphy) 3397 continue; 3398 3399 input = &csiphy->subdev.entity; 3400 sensor = &sd->entity; 3401 3402 for (i = 0; i < sensor->num_pads; i++) { 3403 if (sensor->pads[i].flags & MEDIA_PAD_FL_SOURCE) 3404 break; 3405 } 3406 if (i == sensor->num_pads) { 3407 dev_err(camss->dev, 3408 "No source pad in external entity\n"); 3409 return -EINVAL; 3410 } 3411 3412 ret = media_create_pad_link(sensor, i, input, 3413 MSM_CSIPHY_PAD_SINK, 3414 MEDIA_LNK_FL_IMMUTABLE | MEDIA_LNK_FL_ENABLED); 3415 if (ret < 0) { 3416 camss_link_err(camss, sensor->name, input->name, ret); 3417 return ret; 3418 } 3419 } 3420 3421 return v4l2_device_register_subdev_nodes(&camss->v4l2_dev); 3422 } 3423 3424 static const struct v4l2_async_notifier_operations camss_subdev_notifier_ops = { 3425 .bound = camss_subdev_notifier_bound, 3426 .complete = camss_subdev_notifier_complete, 3427 }; 3428 3429 static const struct media_device_ops camss_media_ops = { 3430 .link_notify = v4l2_pipeline_link_notify, 3431 }; 3432 3433 static int camss_configure_pd(struct camss *camss) 3434 { 3435 const struct camss_resources *res = camss->res; 3436 struct device *dev = camss->dev; 3437 int vfepd_num; 3438 int i; 3439 int ret; 3440 3441 camss->genpd_num = of_count_phandle_with_args(dev->of_node, 3442 "power-domains", 3443 "#power-domain-cells"); 3444 if (camss->genpd_num < 0) { 3445 dev_err(dev, "Power domains are not defined for camss\n"); 3446 return camss->genpd_num; 3447 } 3448 3449 /* 3450 * If a platform device has just one power domain, then it is attached 3451 * at platform_probe() level, thus there shall be no need and even no 3452 * option to attach it again, this is the case for CAMSS on MSM8916. 3453 */ 3454 if (camss->genpd_num == 1) 3455 return 0; 3456 3457 /* count the # of VFEs which have flagged power-domain */ 3458 for (vfepd_num = i = 0; i < camss->res->vfe_num; i++) { 3459 if (res->vfe_res[i].vfe.has_pd) 3460 vfepd_num++; 3461 } 3462 3463 /* 3464 * If the number of power-domains is greater than the number of VFEs 3465 * then the additional power-domain is for the entire CAMSS block. 3466 */ 3467 if (!(camss->genpd_num > vfepd_num)) 3468 return 0; 3469 3470 /* 3471 * If a power-domain name is defined try to use it. 3472 * It is possible we are running a new kernel with an old dtb so 3473 * fallback to indexes even if a pd_name is defined but not found. 3474 */ 3475 if (camss->res->pd_name) { 3476 camss->genpd = dev_pm_domain_attach_by_name(camss->dev, 3477 camss->res->pd_name); 3478 if (IS_ERR(camss->genpd)) 3479 return PTR_ERR(camss->genpd); 3480 } 3481 3482 if (!camss->genpd) { 3483 /* 3484 * Legacy magic index. TITAN_TOP GDSC must be the last 3485 * item in the power-domain list. 3486 */ 3487 camss->genpd = dev_pm_domain_attach_by_id(camss->dev, 3488 camss->genpd_num - 1); 3489 if (IS_ERR(camss->genpd)) 3490 return PTR_ERR(camss->genpd); 3491 } 3492 3493 if (!camss->genpd) 3494 return -ENODEV; 3495 3496 camss->genpd_link = device_link_add(camss->dev, camss->genpd, 3497 DL_FLAG_STATELESS | DL_FLAG_PM_RUNTIME | 3498 DL_FLAG_RPM_ACTIVE); 3499 if (!camss->genpd_link) { 3500 ret = -EINVAL; 3501 goto fail_pm; 3502 } 3503 3504 return 0; 3505 3506 fail_pm: 3507 dev_pm_domain_detach(camss->genpd, true); 3508 3509 return ret; 3510 } 3511 3512 static int camss_icc_get(struct camss *camss) 3513 { 3514 const struct resources_icc *icc_res; 3515 int i; 3516 3517 icc_res = camss->res->icc_res; 3518 3519 for (i = 0; i < camss->res->icc_path_num; i++) { 3520 camss->icc_path[i] = devm_of_icc_get(camss->dev, 3521 icc_res[i].name); 3522 if (IS_ERR(camss->icc_path[i])) 3523 return PTR_ERR(camss->icc_path[i]); 3524 } 3525 3526 return 0; 3527 } 3528 3529 static void camss_genpd_subdevice_cleanup(struct camss *camss) 3530 { 3531 int i; 3532 3533 for (i = 0; i < camss->res->vfe_num; i++) 3534 msm_vfe_genpd_cleanup(&camss->vfe[i]); 3535 } 3536 3537 static void camss_genpd_cleanup(struct camss *camss) 3538 { 3539 if (camss->genpd_num == 1) 3540 return; 3541 3542 camss_genpd_subdevice_cleanup(camss); 3543 3544 if (camss->genpd_link) 3545 device_link_del(camss->genpd_link); 3546 3547 dev_pm_domain_detach(camss->genpd, true); 3548 } 3549 3550 /* 3551 * camss_probe - Probe CAMSS platform device 3552 * @pdev: Pointer to CAMSS platform device 3553 * 3554 * Return 0 on success or a negative error code on failure 3555 */ 3556 static int camss_probe(struct platform_device *pdev) 3557 { 3558 struct device *dev = &pdev->dev; 3559 struct camss *camss; 3560 int num_subdevs; 3561 int ret; 3562 3563 camss = devm_kzalloc(dev, sizeof(*camss), GFP_KERNEL); 3564 if (!camss) 3565 return -ENOMEM; 3566 3567 camss->res = of_device_get_match_data(dev); 3568 3569 atomic_set(&camss->ref_count, 0); 3570 camss->dev = dev; 3571 platform_set_drvdata(pdev, camss); 3572 3573 camss->csiphy = devm_kcalloc(dev, camss->res->csiphy_num, 3574 sizeof(*camss->csiphy), GFP_KERNEL); 3575 if (!camss->csiphy) 3576 return -ENOMEM; 3577 3578 camss->csid = devm_kcalloc(dev, camss->res->csid_num, sizeof(*camss->csid), 3579 GFP_KERNEL); 3580 if (!camss->csid) 3581 return -ENOMEM; 3582 3583 if (camss->res->version == CAMSS_8x16 || 3584 camss->res->version == CAMSS_8x53 || 3585 camss->res->version == CAMSS_8x96) { 3586 camss->ispif = devm_kcalloc(dev, 1, sizeof(*camss->ispif), GFP_KERNEL); 3587 if (!camss->ispif) 3588 return -ENOMEM; 3589 } 3590 3591 camss->vfe = devm_kcalloc(dev, camss->res->vfe_num, 3592 sizeof(*camss->vfe), GFP_KERNEL); 3593 if (!camss->vfe) 3594 return -ENOMEM; 3595 3596 ret = camss_icc_get(camss); 3597 if (ret < 0) 3598 return ret; 3599 3600 ret = camss_configure_pd(camss); 3601 if (ret < 0) { 3602 dev_err(dev, "Failed to configure power domains: %d\n", ret); 3603 return ret; 3604 } 3605 3606 ret = camss_init_subdevices(camss); 3607 if (ret < 0) 3608 goto err_genpd_cleanup; 3609 3610 ret = dma_set_mask_and_coherent(dev, 0xffffffff); 3611 if (ret) 3612 goto err_genpd_cleanup; 3613 3614 camss->media_dev.dev = camss->dev; 3615 strscpy(camss->media_dev.model, "Qualcomm Camera Subsystem", 3616 sizeof(camss->media_dev.model)); 3617 camss->media_dev.ops = &camss_media_ops; 3618 media_device_init(&camss->media_dev); 3619 3620 camss->v4l2_dev.mdev = &camss->media_dev; 3621 ret = v4l2_device_register(camss->dev, &camss->v4l2_dev); 3622 if (ret < 0) { 3623 dev_err(dev, "Failed to register V4L2 device: %d\n", ret); 3624 goto err_media_device_cleanup; 3625 } 3626 3627 v4l2_async_nf_init(&camss->notifier, &camss->v4l2_dev); 3628 3629 pm_runtime_enable(dev); 3630 3631 num_subdevs = camss_of_parse_ports(camss); 3632 if (num_subdevs < 0) { 3633 ret = num_subdevs; 3634 goto err_v4l2_device_unregister; 3635 } 3636 3637 ret = camss_register_entities(camss); 3638 if (ret < 0) 3639 goto err_v4l2_device_unregister; 3640 3641 ret = camss->res->link_entities(camss); 3642 if (ret < 0) 3643 goto err_register_subdevs; 3644 3645 ret = media_device_register(&camss->media_dev); 3646 if (ret < 0) { 3647 dev_err(dev, "Failed to register media device: %d\n", ret); 3648 goto err_register_subdevs; 3649 } 3650 3651 if (num_subdevs) { 3652 camss->notifier.ops = &camss_subdev_notifier_ops; 3653 3654 ret = v4l2_async_nf_register(&camss->notifier); 3655 if (ret) { 3656 dev_err(dev, 3657 "Failed to register async subdev nodes: %d\n", 3658 ret); 3659 goto err_media_device_unregister; 3660 } 3661 } else { 3662 ret = v4l2_device_register_subdev_nodes(&camss->v4l2_dev); 3663 if (ret < 0) { 3664 dev_err(dev, "Failed to register subdev nodes: %d\n", 3665 ret); 3666 goto err_media_device_unregister; 3667 } 3668 } 3669 3670 return 0; 3671 3672 err_media_device_unregister: 3673 media_device_unregister(&camss->media_dev); 3674 err_register_subdevs: 3675 camss_unregister_entities(camss); 3676 err_v4l2_device_unregister: 3677 v4l2_device_unregister(&camss->v4l2_dev); 3678 v4l2_async_nf_cleanup(&camss->notifier); 3679 pm_runtime_disable(dev); 3680 err_media_device_cleanup: 3681 media_device_cleanup(&camss->media_dev); 3682 err_genpd_cleanup: 3683 camss_genpd_cleanup(camss); 3684 3685 return ret; 3686 } 3687 3688 void camss_delete(struct camss *camss) 3689 { 3690 v4l2_device_unregister(&camss->v4l2_dev); 3691 media_device_unregister(&camss->media_dev); 3692 media_device_cleanup(&camss->media_dev); 3693 3694 pm_runtime_disable(camss->dev); 3695 } 3696 3697 /* 3698 * camss_remove - Remove CAMSS platform device 3699 * @pdev: Pointer to CAMSS platform device 3700 * 3701 * Always returns 0. 3702 */ 3703 static void camss_remove(struct platform_device *pdev) 3704 { 3705 struct camss *camss = platform_get_drvdata(pdev); 3706 3707 v4l2_async_nf_unregister(&camss->notifier); 3708 v4l2_async_nf_cleanup(&camss->notifier); 3709 camss_unregister_entities(camss); 3710 3711 if (atomic_read(&camss->ref_count) == 0) 3712 camss_delete(camss); 3713 3714 camss_genpd_cleanup(camss); 3715 } 3716 3717 static const struct camss_resources msm8916_resources = { 3718 .version = CAMSS_8x16, 3719 .csiphy_res = csiphy_res_8x16, 3720 .csid_res = csid_res_8x16, 3721 .ispif_res = &ispif_res_8x16, 3722 .vfe_res = vfe_res_8x16, 3723 .csiphy_num = ARRAY_SIZE(csiphy_res_8x16), 3724 .csid_num = ARRAY_SIZE(csid_res_8x16), 3725 .vfe_num = ARRAY_SIZE(vfe_res_8x16), 3726 .link_entities = camss_link_entities 3727 }; 3728 3729 static const struct camss_resources msm8953_resources = { 3730 .version = CAMSS_8x53, 3731 .icc_res = icc_res_8x53, 3732 .icc_path_num = ARRAY_SIZE(icc_res_8x53), 3733 .csiphy_res = csiphy_res_8x96, 3734 .csid_res = csid_res_8x53, 3735 .ispif_res = &ispif_res_8x53, 3736 .vfe_res = vfe_res_8x53, 3737 .csiphy_num = ARRAY_SIZE(csiphy_res_8x96), 3738 .csid_num = ARRAY_SIZE(csid_res_8x53), 3739 .vfe_num = ARRAY_SIZE(vfe_res_8x53), 3740 .link_entities = camss_link_entities 3741 }; 3742 3743 static const struct camss_resources msm8996_resources = { 3744 .version = CAMSS_8x96, 3745 .csiphy_res = csiphy_res_8x96, 3746 .csid_res = csid_res_8x96, 3747 .ispif_res = &ispif_res_8x96, 3748 .vfe_res = vfe_res_8x96, 3749 .csiphy_num = ARRAY_SIZE(csiphy_res_8x96), 3750 .csid_num = ARRAY_SIZE(csid_res_8x96), 3751 .vfe_num = ARRAY_SIZE(vfe_res_8x96), 3752 .link_entities = camss_link_entities 3753 }; 3754 3755 static const struct camss_resources sdm660_resources = { 3756 .version = CAMSS_660, 3757 .csiphy_res = csiphy_res_660, 3758 .csid_res = csid_res_660, 3759 .ispif_res = &ispif_res_660, 3760 .vfe_res = vfe_res_660, 3761 .csiphy_num = ARRAY_SIZE(csiphy_res_660), 3762 .csid_num = ARRAY_SIZE(csid_res_660), 3763 .vfe_num = ARRAY_SIZE(vfe_res_660), 3764 .link_entities = camss_link_entities 3765 }; 3766 3767 static const struct camss_resources sdm670_resources = { 3768 .version = CAMSS_845, 3769 .csiphy_res = csiphy_res_670, 3770 .csid_res = csid_res_670, 3771 .vfe_res = vfe_res_670, 3772 .csiphy_num = ARRAY_SIZE(csiphy_res_670), 3773 .csid_num = ARRAY_SIZE(csid_res_670), 3774 .vfe_num = ARRAY_SIZE(vfe_res_670), 3775 .link_entities = camss_link_entities 3776 }; 3777 3778 static const struct camss_resources sdm845_resources = { 3779 .version = CAMSS_845, 3780 .pd_name = "top", 3781 .csiphy_res = csiphy_res_845, 3782 .csid_res = csid_res_845, 3783 .vfe_res = vfe_res_845, 3784 .csiphy_num = ARRAY_SIZE(csiphy_res_845), 3785 .csid_num = ARRAY_SIZE(csid_res_845), 3786 .vfe_num = ARRAY_SIZE(vfe_res_845), 3787 .link_entities = camss_link_entities 3788 }; 3789 3790 static const struct camss_resources sm8250_resources = { 3791 .version = CAMSS_8250, 3792 .pd_name = "top", 3793 .csiphy_res = csiphy_res_8250, 3794 .csid_res = csid_res_8250, 3795 .vfe_res = vfe_res_8250, 3796 .icc_res = icc_res_sm8250, 3797 .icc_path_num = ARRAY_SIZE(icc_res_sm8250), 3798 .csiphy_num = ARRAY_SIZE(csiphy_res_8250), 3799 .csid_num = ARRAY_SIZE(csid_res_8250), 3800 .vfe_num = ARRAY_SIZE(vfe_res_8250), 3801 .link_entities = camss_link_entities 3802 }; 3803 3804 static const struct camss_resources sc8280xp_resources = { 3805 .version = CAMSS_8280XP, 3806 .pd_name = "top", 3807 .csiphy_res = csiphy_res_sc8280xp, 3808 .csid_res = csid_res_sc8280xp, 3809 .ispif_res = NULL, 3810 .vfe_res = vfe_res_sc8280xp, 3811 .icc_res = icc_res_sc8280xp, 3812 .icc_path_num = ARRAY_SIZE(icc_res_sc8280xp), 3813 .csiphy_num = ARRAY_SIZE(csiphy_res_sc8280xp), 3814 .csid_num = ARRAY_SIZE(csid_res_sc8280xp), 3815 .vfe_num = ARRAY_SIZE(vfe_res_sc8280xp), 3816 .link_entities = camss_link_entities 3817 }; 3818 3819 static const struct camss_resources sc7280_resources = { 3820 .version = CAMSS_7280, 3821 .pd_name = "top", 3822 .csiphy_res = csiphy_res_7280, 3823 .csid_res = csid_res_7280, 3824 .vfe_res = vfe_res_7280, 3825 .icc_res = icc_res_sc7280, 3826 .icc_path_num = ARRAY_SIZE(icc_res_sc7280), 3827 .csiphy_num = ARRAY_SIZE(csiphy_res_7280), 3828 .csid_num = ARRAY_SIZE(csid_res_7280), 3829 .vfe_num = ARRAY_SIZE(vfe_res_7280), 3830 .link_entities = camss_link_entities 3831 }; 3832 3833 static const struct camss_resources sm8550_resources = { 3834 .version = CAMSS_8550, 3835 .pd_name = "top", 3836 .csiphy_res = csiphy_res_8550, 3837 .csid_res = csid_res_8550, 3838 .vfe_res = vfe_res_8550, 3839 .csid_wrapper_res = &csid_wrapper_res_sm8550, 3840 .icc_res = icc_res_sm8550, 3841 .icc_path_num = ARRAY_SIZE(icc_res_sm8550), 3842 .csiphy_num = ARRAY_SIZE(csiphy_res_8550), 3843 .csid_num = ARRAY_SIZE(csid_res_8550), 3844 .vfe_num = ARRAY_SIZE(vfe_res_8550), 3845 .link_entities = camss_link_entities 3846 }; 3847 3848 static const struct camss_resources x1e80100_resources = { 3849 .version = CAMSS_X1E80100, 3850 .pd_name = "top", 3851 .csiphy_res = csiphy_res_x1e80100, 3852 .csid_res = csid_res_x1e80100, 3853 .vfe_res = vfe_res_x1e80100, 3854 .csid_wrapper_res = &csid_wrapper_res_x1e80100, 3855 .icc_res = icc_res_x1e80100, 3856 .icc_path_num = ARRAY_SIZE(icc_res_x1e80100), 3857 .csiphy_num = ARRAY_SIZE(csiphy_res_x1e80100), 3858 .csid_num = ARRAY_SIZE(csid_res_x1e80100), 3859 .vfe_num = ARRAY_SIZE(vfe_res_x1e80100), 3860 .link_entities = camss_link_entities 3861 }; 3862 3863 static const struct of_device_id camss_dt_match[] = { 3864 { .compatible = "qcom,msm8916-camss", .data = &msm8916_resources }, 3865 { .compatible = "qcom,msm8953-camss", .data = &msm8953_resources }, 3866 { .compatible = "qcom,msm8996-camss", .data = &msm8996_resources }, 3867 { .compatible = "qcom,sc7280-camss", .data = &sc7280_resources }, 3868 { .compatible = "qcom,sc8280xp-camss", .data = &sc8280xp_resources }, 3869 { .compatible = "qcom,sdm660-camss", .data = &sdm660_resources }, 3870 { .compatible = "qcom,sdm670-camss", .data = &sdm670_resources }, 3871 { .compatible = "qcom,sdm845-camss", .data = &sdm845_resources }, 3872 { .compatible = "qcom,sm8250-camss", .data = &sm8250_resources }, 3873 { .compatible = "qcom,sm8550-camss", .data = &sm8550_resources }, 3874 { .compatible = "qcom,x1e80100-camss", .data = &x1e80100_resources }, 3875 { } 3876 }; 3877 3878 MODULE_DEVICE_TABLE(of, camss_dt_match); 3879 3880 static int __maybe_unused camss_runtime_suspend(struct device *dev) 3881 { 3882 struct camss *camss = dev_get_drvdata(dev); 3883 int i; 3884 int ret; 3885 3886 for (i = 0; i < camss->res->icc_path_num; i++) { 3887 ret = icc_set_bw(camss->icc_path[i], 0, 0); 3888 if (ret) 3889 return ret; 3890 } 3891 3892 return 0; 3893 } 3894 3895 static int __maybe_unused camss_runtime_resume(struct device *dev) 3896 { 3897 struct camss *camss = dev_get_drvdata(dev); 3898 const struct resources_icc *icc_res = camss->res->icc_res; 3899 int i; 3900 int ret; 3901 3902 for (i = 0; i < camss->res->icc_path_num; i++) { 3903 ret = icc_set_bw(camss->icc_path[i], 3904 icc_res[i].icc_bw_tbl.avg, 3905 icc_res[i].icc_bw_tbl.peak); 3906 if (ret) 3907 return ret; 3908 } 3909 3910 return 0; 3911 } 3912 3913 static const struct dev_pm_ops camss_pm_ops = { 3914 SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend, 3915 pm_runtime_force_resume) 3916 SET_RUNTIME_PM_OPS(camss_runtime_suspend, camss_runtime_resume, NULL) 3917 }; 3918 3919 static struct platform_driver qcom_camss_driver = { 3920 .probe = camss_probe, 3921 .remove = camss_remove, 3922 .driver = { 3923 .name = "qcom-camss", 3924 .of_match_table = camss_dt_match, 3925 .pm = &camss_pm_ops, 3926 }, 3927 }; 3928 3929 module_platform_driver(qcom_camss_driver); 3930 3931 MODULE_ALIAS("platform:qcom-camss"); 3932 MODULE_DESCRIPTION("Qualcomm Camera Subsystem driver"); 3933 MODULE_AUTHOR("Todor Tomov <todor.tomov@linaro.org>"); 3934 MODULE_LICENSE("GPL v2"); 3935