ov13b10.c (33864B)
1// SPDX-License-Identifier: GPL-2.0 2// Copyright (c) 2021 Intel Corporation. 3 4#include <linux/acpi.h> 5#include <linux/i2c.h> 6#include <linux/module.h> 7#include <linux/pm_runtime.h> 8#include <media/v4l2-ctrls.h> 9#include <media/v4l2-device.h> 10#include <media/v4l2-fwnode.h> 11 12#define OV13B10_REG_VALUE_08BIT 1 13#define OV13B10_REG_VALUE_16BIT 2 14#define OV13B10_REG_VALUE_24BIT 3 15 16#define OV13B10_REG_MODE_SELECT 0x0100 17#define OV13B10_MODE_STANDBY 0x00 18#define OV13B10_MODE_STREAMING 0x01 19 20#define OV13B10_REG_SOFTWARE_RST 0x0103 21#define OV13B10_SOFTWARE_RST 0x01 22 23/* Chip ID */ 24#define OV13B10_REG_CHIP_ID 0x300a 25#define OV13B10_CHIP_ID 0x560d42 26 27/* V_TIMING internal */ 28#define OV13B10_REG_VTS 0x380e 29#define OV13B10_VTS_30FPS 0x0c7c 30#define OV13B10_VTS_60FPS 0x063e 31#define OV13B10_VTS_MAX 0x7fff 32 33/* HBLANK control - read only */ 34#define OV13B10_PPL_560MHZ 4704 35 36/* Exposure control */ 37#define OV13B10_REG_EXPOSURE 0x3500 38#define OV13B10_EXPOSURE_MIN 4 39#define OV13B10_EXPOSURE_STEP 1 40#define OV13B10_EXPOSURE_DEFAULT 0x40 41 42/* Analog gain control */ 43#define OV13B10_REG_ANALOG_GAIN 0x3508 44#define OV13B10_ANA_GAIN_MIN 0x80 45#define OV13B10_ANA_GAIN_MAX 0x07c0 46#define OV13B10_ANA_GAIN_STEP 1 47#define OV13B10_ANA_GAIN_DEFAULT 0x80 48 49/* Digital gain control */ 50#define OV13B10_REG_DGTL_GAIN_H 0x350a 51#define OV13B10_REG_DGTL_GAIN_M 0x350b 52#define OV13B10_REG_DGTL_GAIN_L 0x350c 53 54#define OV13B10_DGTL_GAIN_MIN 1024 /* Min = 1 X */ 55#define OV13B10_DGTL_GAIN_MAX (4096 - 1) /* Max = 4 X */ 56#define OV13B10_DGTL_GAIN_DEFAULT 2560 /* Default gain = 2.5 X */ 57#define OV13B10_DGTL_GAIN_STEP 1 /* Each step = 1/1024 */ 58 59#define OV13B10_DGTL_GAIN_L_SHIFT 6 60#define OV13B10_DGTL_GAIN_L_MASK 0x3 61#define OV13B10_DGTL_GAIN_M_SHIFT 2 62#define OV13B10_DGTL_GAIN_M_MASK 0xff 63#define OV13B10_DGTL_GAIN_H_SHIFT 10 64#define OV13B10_DGTL_GAIN_H_MASK 0x3 65 66/* Test Pattern Control */ 67#define OV13B10_REG_TEST_PATTERN 0x5080 68#define OV13B10_TEST_PATTERN_ENABLE BIT(7) 69#define OV13B10_TEST_PATTERN_MASK 0xf3 70#define OV13B10_TEST_PATTERN_BAR_SHIFT 2 71 72/* Flip Control */ 73#define OV13B10_REG_FORMAT1 0x3820 74#define OV13B10_REG_FORMAT2 0x3821 75 76/* Horizontal Window Offset */ 77#define OV13B10_REG_H_WIN_OFFSET 0x3811 78 79/* Vertical Window Offset */ 80#define OV13B10_REG_V_WIN_OFFSET 0x3813 81 82struct ov13b10_reg { 83 u16 address; 84 u8 val; 85}; 86 87struct ov13b10_reg_list { 88 u32 num_of_regs; 89 const struct ov13b10_reg *regs; 90}; 91 92/* Link frequency config */ 93struct ov13b10_link_freq_config { 94 u32 pixels_per_line; 95 96 /* registers for this link frequency */ 97 struct ov13b10_reg_list reg_list; 98}; 99 100/* Mode : resolution and related config&values */ 101struct ov13b10_mode { 102 /* Frame width */ 103 u32 width; 104 /* Frame height */ 105 u32 height; 106 107 /* V-timing */ 108 u32 vts_def; 109 u32 vts_min; 110 111 /* Index of Link frequency config to be used */ 112 u32 link_freq_index; 113 /* Default register values */ 114 struct ov13b10_reg_list reg_list; 115}; 116 117/* 4208x3120 needs 1120Mbps/lane, 4 lanes */ 118static const struct ov13b10_reg mipi_data_rate_1120mbps[] = { 119 {0x0103, 0x01}, 120 {0x0303, 0x04}, 121 {0x0305, 0xaf}, 122 {0x0321, 0x00}, 123 {0x0323, 0x04}, 124 {0x0324, 0x01}, 125 {0x0325, 0xa4}, 126 {0x0326, 0x81}, 127 {0x0327, 0x04}, 128 {0x3012, 0x07}, 129 {0x3013, 0x32}, 130 {0x3107, 0x23}, 131 {0x3501, 0x0c}, 132 {0x3502, 0x10}, 133 {0x3504, 0x08}, 134 {0x3508, 0x07}, 135 {0x3509, 0xc0}, 136 {0x3600, 0x16}, 137 {0x3601, 0x54}, 138 {0x3612, 0x4e}, 139 {0x3620, 0x00}, 140 {0x3621, 0x68}, 141 {0x3622, 0x66}, 142 {0x3623, 0x03}, 143 {0x3662, 0x92}, 144 {0x3666, 0xbb}, 145 {0x3667, 0x44}, 146 {0x366e, 0xff}, 147 {0x366f, 0xf3}, 148 {0x3675, 0x44}, 149 {0x3676, 0x00}, 150 {0x367f, 0xe9}, 151 {0x3681, 0x32}, 152 {0x3682, 0x1f}, 153 {0x3683, 0x0b}, 154 {0x3684, 0x0b}, 155 {0x3704, 0x0f}, 156 {0x3706, 0x40}, 157 {0x3708, 0x3b}, 158 {0x3709, 0x72}, 159 {0x370b, 0xa2}, 160 {0x3714, 0x24}, 161 {0x371a, 0x3e}, 162 {0x3725, 0x42}, 163 {0x3739, 0x12}, 164 {0x3767, 0x00}, 165 {0x377a, 0x0d}, 166 {0x3789, 0x18}, 167 {0x3790, 0x40}, 168 {0x3791, 0xa2}, 169 {0x37c2, 0x04}, 170 {0x37c3, 0xf1}, 171 {0x37d9, 0x0c}, 172 {0x37da, 0x02}, 173 {0x37dc, 0x02}, 174 {0x37e1, 0x04}, 175 {0x37e2, 0x0a}, 176 {0x3800, 0x00}, 177 {0x3801, 0x00}, 178 {0x3802, 0x00}, 179 {0x3803, 0x08}, 180 {0x3804, 0x10}, 181 {0x3805, 0x8f}, 182 {0x3806, 0x0c}, 183 {0x3807, 0x47}, 184 {0x3808, 0x10}, 185 {0x3809, 0x70}, 186 {0x380a, 0x0c}, 187 {0x380b, 0x30}, 188 {0x380c, 0x04}, 189 {0x380d, 0x98}, 190 {0x380e, 0x0c}, 191 {0x380f, 0x7c}, 192 {0x3811, 0x0f}, 193 {0x3813, 0x09}, 194 {0x3814, 0x01}, 195 {0x3815, 0x01}, 196 {0x3816, 0x01}, 197 {0x3817, 0x01}, 198 {0x381f, 0x08}, 199 {0x3820, 0x88}, 200 {0x3821, 0x00}, 201 {0x3822, 0x14}, 202 {0x382e, 0xe6}, 203 {0x3c80, 0x00}, 204 {0x3c87, 0x01}, 205 {0x3c8c, 0x19}, 206 {0x3c8d, 0x1c}, 207 {0x3ca0, 0x00}, 208 {0x3ca1, 0x00}, 209 {0x3ca2, 0x00}, 210 {0x3ca3, 0x00}, 211 {0x3ca4, 0x50}, 212 {0x3ca5, 0x11}, 213 {0x3ca6, 0x01}, 214 {0x3ca7, 0x00}, 215 {0x3ca8, 0x00}, 216 {0x4008, 0x02}, 217 {0x4009, 0x0f}, 218 {0x400a, 0x01}, 219 {0x400b, 0x19}, 220 {0x4011, 0x21}, 221 {0x4017, 0x08}, 222 {0x4019, 0x04}, 223 {0x401a, 0x58}, 224 {0x4032, 0x1e}, 225 {0x4050, 0x02}, 226 {0x4051, 0x09}, 227 {0x405e, 0x00}, 228 {0x4066, 0x02}, 229 {0x4501, 0x00}, 230 {0x4502, 0x10}, 231 {0x4505, 0x00}, 232 {0x4800, 0x64}, 233 {0x481b, 0x3e}, 234 {0x481f, 0x30}, 235 {0x4825, 0x34}, 236 {0x4837, 0x0e}, 237 {0x484b, 0x01}, 238 {0x4883, 0x02}, 239 {0x5000, 0xff}, 240 {0x5001, 0x0f}, 241 {0x5045, 0x20}, 242 {0x5046, 0x20}, 243 {0x5047, 0xa4}, 244 {0x5048, 0x20}, 245 {0x5049, 0xa4}, 246 {0x0100, 0x01}, 247}; 248 249static const struct ov13b10_reg mode_4208x3120_regs[] = { 250 {0x0305, 0xaf}, 251 {0x3501, 0x0c}, 252 {0x3662, 0x92}, 253 {0x3714, 0x24}, 254 {0x3739, 0x12}, 255 {0x37c2, 0x04}, 256 {0x37d9, 0x0c}, 257 {0x37e2, 0x0a}, 258 {0x3800, 0x00}, 259 {0x3801, 0x00}, 260 {0x3802, 0x00}, 261 {0x3803, 0x08}, 262 {0x3804, 0x10}, 263 {0x3805, 0x8f}, 264 {0x3806, 0x0c}, 265 {0x3807, 0x47}, 266 {0x3808, 0x10}, 267 {0x3809, 0x70}, 268 {0x380a, 0x0c}, 269 {0x380b, 0x30}, 270 {0x380c, 0x04}, 271 {0x380d, 0x98}, 272 {0x380e, 0x0c}, 273 {0x380f, 0x7c}, 274 {0x3810, 0x00}, 275 {0x3811, 0x0f}, 276 {0x3812, 0x00}, 277 {0x3813, 0x09}, 278 {0x3814, 0x01}, 279 {0x3816, 0x01}, 280 {0x3820, 0x88}, 281 {0x3c8c, 0x19}, 282 {0x4008, 0x02}, 283 {0x4009, 0x0f}, 284 {0x4050, 0x02}, 285 {0x4051, 0x09}, 286 {0x4501, 0x00}, 287 {0x4505, 0x00}, 288 {0x4837, 0x0e}, 289 {0x5000, 0xff}, 290 {0x5001, 0x0f}, 291}; 292 293static const struct ov13b10_reg mode_4160x3120_regs[] = { 294 {0x0305, 0xaf}, 295 {0x3501, 0x0c}, 296 {0x3662, 0x92}, 297 {0x3714, 0x24}, 298 {0x3739, 0x12}, 299 {0x37c2, 0x04}, 300 {0x37d9, 0x0c}, 301 {0x37e2, 0x0a}, 302 {0x3800, 0x00}, 303 {0x3801, 0x00}, 304 {0x3802, 0x00}, 305 {0x3803, 0x08}, 306 {0x3804, 0x10}, 307 {0x3805, 0x8f}, 308 {0x3806, 0x0c}, 309 {0x3807, 0x47}, 310 {0x3808, 0x10}, 311 {0x3809, 0x40}, 312 {0x380a, 0x0c}, 313 {0x380b, 0x30}, 314 {0x380c, 0x04}, 315 {0x380d, 0x98}, 316 {0x380e, 0x0c}, 317 {0x380f, 0x7c}, 318 {0x3810, 0x00}, 319 {0x3811, 0x27}, 320 {0x3812, 0x00}, 321 {0x3813, 0x09}, 322 {0x3814, 0x01}, 323 {0x3816, 0x01}, 324 {0x3820, 0x88}, 325 {0x3c8c, 0x19}, 326 {0x4008, 0x02}, 327 {0x4009, 0x0f}, 328 {0x4050, 0x02}, 329 {0x4051, 0x09}, 330 {0x4501, 0x00}, 331 {0x4505, 0x00}, 332 {0x4837, 0x0e}, 333 {0x5000, 0xff}, 334 {0x5001, 0x0f}, 335}; 336 337static const struct ov13b10_reg mode_4160x2340_regs[] = { 338 {0x0305, 0xaf}, 339 {0x3501, 0x0c}, 340 {0x3662, 0x92}, 341 {0x3714, 0x24}, 342 {0x3739, 0x12}, 343 {0x37c2, 0x04}, 344 {0x37d9, 0x0c}, 345 {0x37e2, 0x0a}, 346 {0x3800, 0x00}, 347 {0x3801, 0x00}, 348 {0x3802, 0x00}, 349 {0x3803, 0x08}, 350 {0x3804, 0x10}, 351 {0x3805, 0x8f}, 352 {0x3806, 0x0c}, 353 {0x3807, 0x47}, 354 {0x3808, 0x10}, 355 {0x3809, 0x40}, 356 {0x380a, 0x09}, 357 {0x380b, 0x24}, 358 {0x380c, 0x04}, 359 {0x380d, 0x98}, 360 {0x380e, 0x0c}, 361 {0x380f, 0x7c}, 362 {0x3810, 0x00}, 363 {0x3811, 0x27}, 364 {0x3812, 0x01}, 365 {0x3813, 0x8f}, 366 {0x3814, 0x01}, 367 {0x3816, 0x01}, 368 {0x3820, 0x88}, 369 {0x3c8c, 0x19}, 370 {0x4008, 0x02}, 371 {0x4009, 0x0f}, 372 {0x4050, 0x02}, 373 {0x4051, 0x09}, 374 {0x4501, 0x00}, 375 {0x4505, 0x00}, 376 {0x4837, 0x0e}, 377 {0x5000, 0xff}, 378 {0x5001, 0x0f}, 379}; 380 381static const struct ov13b10_reg mode_2104x1560_regs[] = { 382 {0x0305, 0xaf}, 383 {0x3501, 0x06}, 384 {0x3662, 0x88}, 385 {0x3714, 0x28}, 386 {0x3739, 0x10}, 387 {0x37c2, 0x14}, 388 {0x37d9, 0x06}, 389 {0x37e2, 0x0c}, 390 {0x3800, 0x00}, 391 {0x3801, 0x00}, 392 {0x3802, 0x00}, 393 {0x3803, 0x08}, 394 {0x3804, 0x10}, 395 {0x3805, 0x8f}, 396 {0x3806, 0x0c}, 397 {0x3807, 0x47}, 398 {0x3808, 0x08}, 399 {0x3809, 0x38}, 400 {0x380a, 0x06}, 401 {0x380b, 0x18}, 402 {0x380c, 0x04}, 403 {0x380d, 0x98}, 404 {0x380e, 0x06}, 405 {0x380f, 0x3e}, 406 {0x3810, 0x00}, 407 {0x3811, 0x07}, 408 {0x3812, 0x00}, 409 {0x3813, 0x05}, 410 {0x3814, 0x03}, 411 {0x3816, 0x03}, 412 {0x3820, 0x8b}, 413 {0x3c8c, 0x18}, 414 {0x4008, 0x00}, 415 {0x4009, 0x05}, 416 {0x4050, 0x00}, 417 {0x4051, 0x05}, 418 {0x4501, 0x08}, 419 {0x4505, 0x00}, 420 {0x4837, 0x0e}, 421 {0x5000, 0xfd}, 422 {0x5001, 0x0d}, 423}; 424 425static const struct ov13b10_reg mode_2080x1170_regs[] = { 426 {0x0305, 0xaf}, 427 {0x3501, 0x06}, 428 {0x3662, 0x88}, 429 {0x3714, 0x28}, 430 {0x3739, 0x10}, 431 {0x37c2, 0x14}, 432 {0x37d9, 0x06}, 433 {0x37e2, 0x0c}, 434 {0x3800, 0x00}, 435 {0x3801, 0x00}, 436 {0x3802, 0x00}, 437 {0x3803, 0x08}, 438 {0x3804, 0x10}, 439 {0x3805, 0x8f}, 440 {0x3806, 0x0c}, 441 {0x3807, 0x47}, 442 {0x3808, 0x08}, 443 {0x3809, 0x20}, 444 {0x380a, 0x04}, 445 {0x380b, 0x92}, 446 {0x380c, 0x04}, 447 {0x380d, 0x98}, 448 {0x380e, 0x06}, 449 {0x380f, 0x3e}, 450 {0x3810, 0x00}, 451 {0x3811, 0x13}, 452 {0x3812, 0x00}, 453 {0x3813, 0xc9}, 454 {0x3814, 0x03}, 455 {0x3816, 0x03}, 456 {0x3820, 0x8b}, 457 {0x3c8c, 0x18}, 458 {0x4008, 0x00}, 459 {0x4009, 0x05}, 460 {0x4050, 0x00}, 461 {0x4051, 0x05}, 462 {0x4501, 0x08}, 463 {0x4505, 0x00}, 464 {0x4837, 0x0e}, 465 {0x5000, 0xfd}, 466 {0x5001, 0x0d}, 467}; 468 469static const char * const ov13b10_test_pattern_menu[] = { 470 "Disabled", 471 "Vertical Color Bar Type 1", 472 "Vertical Color Bar Type 2", 473 "Vertical Color Bar Type 3", 474 "Vertical Color Bar Type 4" 475}; 476 477/* Configurations for supported link frequencies */ 478#define OV13B10_LINK_FREQ_560MHZ 560000000ULL 479#define OV13B10_LINK_FREQ_INDEX_0 0 480 481#define OV13B10_EXT_CLK 19200000 482#define OV13B10_DATA_LANES 4 483 484/* 485 * pixel_rate = link_freq * data-rate * nr_of_lanes / bits_per_sample 486 * data rate => double data rate; number of lanes => 4; bits per pixel => 10 487 */ 488static u64 link_freq_to_pixel_rate(u64 f) 489{ 490 f *= 2 * OV13B10_DATA_LANES; 491 do_div(f, 10); 492 493 return f; 494} 495 496/* Menu items for LINK_FREQ V4L2 control */ 497static const s64 link_freq_menu_items[] = { 498 OV13B10_LINK_FREQ_560MHZ 499}; 500 501/* Link frequency configs */ 502static const struct ov13b10_link_freq_config 503 link_freq_configs[] = { 504 { 505 .pixels_per_line = OV13B10_PPL_560MHZ, 506 .reg_list = { 507 .num_of_regs = ARRAY_SIZE(mipi_data_rate_1120mbps), 508 .regs = mipi_data_rate_1120mbps, 509 } 510 } 511}; 512 513/* Mode configs */ 514static const struct ov13b10_mode supported_modes[] = { 515 { 516 .width = 4208, 517 .height = 3120, 518 .vts_def = OV13B10_VTS_30FPS, 519 .vts_min = OV13B10_VTS_30FPS, 520 .reg_list = { 521 .num_of_regs = ARRAY_SIZE(mode_4208x3120_regs), 522 .regs = mode_4208x3120_regs, 523 }, 524 .link_freq_index = OV13B10_LINK_FREQ_INDEX_0, 525 }, 526 { 527 .width = 4160, 528 .height = 3120, 529 .vts_def = OV13B10_VTS_30FPS, 530 .vts_min = OV13B10_VTS_30FPS, 531 .reg_list = { 532 .num_of_regs = ARRAY_SIZE(mode_4160x3120_regs), 533 .regs = mode_4160x3120_regs, 534 }, 535 .link_freq_index = OV13B10_LINK_FREQ_INDEX_0, 536 }, 537 { 538 .width = 4160, 539 .height = 2340, 540 .vts_def = OV13B10_VTS_30FPS, 541 .vts_min = OV13B10_VTS_30FPS, 542 .reg_list = { 543 .num_of_regs = ARRAY_SIZE(mode_4160x2340_regs), 544 .regs = mode_4160x2340_regs, 545 }, 546 .link_freq_index = OV13B10_LINK_FREQ_INDEX_0, 547 }, 548 { 549 .width = 2104, 550 .height = 1560, 551 .vts_def = OV13B10_VTS_60FPS, 552 .vts_min = OV13B10_VTS_60FPS, 553 .reg_list = { 554 .num_of_regs = ARRAY_SIZE(mode_2104x1560_regs), 555 .regs = mode_2104x1560_regs, 556 }, 557 .link_freq_index = OV13B10_LINK_FREQ_INDEX_0, 558 }, 559 { 560 .width = 2080, 561 .height = 1170, 562 .vts_def = OV13B10_VTS_60FPS, 563 .vts_min = OV13B10_VTS_60FPS, 564 .reg_list = { 565 .num_of_regs = ARRAY_SIZE(mode_2080x1170_regs), 566 .regs = mode_2080x1170_regs, 567 }, 568 .link_freq_index = OV13B10_LINK_FREQ_INDEX_0, 569 } 570}; 571 572struct ov13b10 { 573 struct v4l2_subdev sd; 574 struct media_pad pad; 575 576 struct v4l2_ctrl_handler ctrl_handler; 577 /* V4L2 Controls */ 578 struct v4l2_ctrl *link_freq; 579 struct v4l2_ctrl *pixel_rate; 580 struct v4l2_ctrl *vblank; 581 struct v4l2_ctrl *hblank; 582 struct v4l2_ctrl *exposure; 583 584 /* Current mode */ 585 const struct ov13b10_mode *cur_mode; 586 587 /* Mutex for serialized access */ 588 struct mutex mutex; 589 590 /* Streaming on/off */ 591 bool streaming; 592}; 593 594#define to_ov13b10(_sd) container_of(_sd, struct ov13b10, sd) 595 596/* Read registers up to 4 at a time */ 597static int ov13b10_read_reg(struct ov13b10 *ov13b, 598 u16 reg, u32 len, u32 *val) 599{ 600 struct i2c_client *client = v4l2_get_subdevdata(&ov13b->sd); 601 struct i2c_msg msgs[2]; 602 u8 *data_be_p; 603 int ret; 604 __be32 data_be = 0; 605 __be16 reg_addr_be = cpu_to_be16(reg); 606 607 if (len > 4) 608 return -EINVAL; 609 610 data_be_p = (u8 *)&data_be; 611 /* Write register address */ 612 msgs[0].addr = client->addr; 613 msgs[0].flags = 0; 614 msgs[0].len = 2; 615 msgs[0].buf = (u8 *)®_addr_be; 616 617 /* Read data from register */ 618 msgs[1].addr = client->addr; 619 msgs[1].flags = I2C_M_RD; 620 msgs[1].len = len; 621 msgs[1].buf = &data_be_p[4 - len]; 622 623 ret = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs)); 624 if (ret != ARRAY_SIZE(msgs)) 625 return -EIO; 626 627 *val = be32_to_cpu(data_be); 628 629 return 0; 630} 631 632/* Write registers up to 4 at a time */ 633static int ov13b10_write_reg(struct ov13b10 *ov13b, 634 u16 reg, u32 len, u32 __val) 635{ 636 struct i2c_client *client = v4l2_get_subdevdata(&ov13b->sd); 637 int buf_i, val_i; 638 u8 buf[6], *val_p; 639 __be32 val; 640 641 if (len > 4) 642 return -EINVAL; 643 644 buf[0] = reg >> 8; 645 buf[1] = reg & 0xff; 646 647 val = cpu_to_be32(__val); 648 val_p = (u8 *)&val; 649 buf_i = 2; 650 val_i = 4 - len; 651 652 while (val_i < 4) 653 buf[buf_i++] = val_p[val_i++]; 654 655 if (i2c_master_send(client, buf, len + 2) != len + 2) 656 return -EIO; 657 658 return 0; 659} 660 661/* Write a list of registers */ 662static int ov13b10_write_regs(struct ov13b10 *ov13b, 663 const struct ov13b10_reg *regs, u32 len) 664{ 665 struct i2c_client *client = v4l2_get_subdevdata(&ov13b->sd); 666 int ret; 667 u32 i; 668 669 for (i = 0; i < len; i++) { 670 ret = ov13b10_write_reg(ov13b, regs[i].address, 1, 671 regs[i].val); 672 if (ret) { 673 dev_err_ratelimited(&client->dev, 674 "Failed to write reg 0x%4.4x. error = %d\n", 675 regs[i].address, ret); 676 677 return ret; 678 } 679 } 680 681 return 0; 682} 683 684static int ov13b10_write_reg_list(struct ov13b10 *ov13b, 685 const struct ov13b10_reg_list *r_list) 686{ 687 return ov13b10_write_regs(ov13b, r_list->regs, r_list->num_of_regs); 688} 689 690/* Open sub-device */ 691static int ov13b10_open(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh) 692{ 693 const struct ov13b10_mode *default_mode = &supported_modes[0]; 694 struct ov13b10 *ov13b = to_ov13b10(sd); 695 struct v4l2_mbus_framefmt *try_fmt = v4l2_subdev_get_try_format(sd, 696 fh->state, 697 0); 698 699 mutex_lock(&ov13b->mutex); 700 701 /* Initialize try_fmt */ 702 try_fmt->width = default_mode->width; 703 try_fmt->height = default_mode->height; 704 try_fmt->code = MEDIA_BUS_FMT_SGRBG10_1X10; 705 try_fmt->field = V4L2_FIELD_NONE; 706 707 /* No crop or compose */ 708 mutex_unlock(&ov13b->mutex); 709 710 return 0; 711} 712 713static int ov13b10_update_digital_gain(struct ov13b10 *ov13b, u32 d_gain) 714{ 715 int ret; 716 u32 val; 717 718 /* 719 * 0x350C[7:6], 0x350B[7:0], 0x350A[1:0] 720 */ 721 722 val = (d_gain & OV13B10_DGTL_GAIN_L_MASK) << OV13B10_DGTL_GAIN_L_SHIFT; 723 ret = ov13b10_write_reg(ov13b, OV13B10_REG_DGTL_GAIN_L, 724 OV13B10_REG_VALUE_08BIT, val); 725 if (ret) 726 return ret; 727 728 val = (d_gain >> OV13B10_DGTL_GAIN_M_SHIFT) & OV13B10_DGTL_GAIN_M_MASK; 729 ret = ov13b10_write_reg(ov13b, OV13B10_REG_DGTL_GAIN_M, 730 OV13B10_REG_VALUE_08BIT, val); 731 if (ret) 732 return ret; 733 734 val = (d_gain >> OV13B10_DGTL_GAIN_H_SHIFT) & OV13B10_DGTL_GAIN_H_MASK; 735 ret = ov13b10_write_reg(ov13b, OV13B10_REG_DGTL_GAIN_H, 736 OV13B10_REG_VALUE_08BIT, val); 737 738 return ret; 739} 740 741static int ov13b10_enable_test_pattern(struct ov13b10 *ov13b, u32 pattern) 742{ 743 int ret; 744 u32 val; 745 746 ret = ov13b10_read_reg(ov13b, OV13B10_REG_TEST_PATTERN, 747 OV13B10_REG_VALUE_08BIT, &val); 748 if (ret) 749 return ret; 750 751 if (pattern) { 752 val &= OV13B10_TEST_PATTERN_MASK; 753 val |= ((pattern - 1) << OV13B10_TEST_PATTERN_BAR_SHIFT) | 754 OV13B10_TEST_PATTERN_ENABLE; 755 } else { 756 val &= ~OV13B10_TEST_PATTERN_ENABLE; 757 } 758 759 return ov13b10_write_reg(ov13b, OV13B10_REG_TEST_PATTERN, 760 OV13B10_REG_VALUE_08BIT, val); 761} 762 763static int ov13b10_set_ctrl_hflip(struct ov13b10 *ov13b, u32 ctrl_val) 764{ 765 int ret; 766 u32 val; 767 768 ret = ov13b10_read_reg(ov13b, OV13B10_REG_FORMAT1, 769 OV13B10_REG_VALUE_08BIT, &val); 770 if (ret) 771 return ret; 772 773 ret = ov13b10_write_reg(ov13b, OV13B10_REG_FORMAT1, 774 OV13B10_REG_VALUE_08BIT, 775 ctrl_val ? val & ~BIT(3) : val); 776 777 if (ret) 778 return ret; 779 780 ret = ov13b10_read_reg(ov13b, OV13B10_REG_H_WIN_OFFSET, 781 OV13B10_REG_VALUE_08BIT, &val); 782 if (ret) 783 return ret; 784 785 /* 786 * Applying cropping offset to reverse the change of Bayer order 787 * after mirroring image 788 */ 789 return ov13b10_write_reg(ov13b, OV13B10_REG_H_WIN_OFFSET, 790 OV13B10_REG_VALUE_08BIT, 791 ctrl_val ? ++val : val); 792} 793 794static int ov13b10_set_ctrl_vflip(struct ov13b10 *ov13b, u32 ctrl_val) 795{ 796 int ret; 797 u32 val; 798 799 ret = ov13b10_read_reg(ov13b, OV13B10_REG_FORMAT1, 800 OV13B10_REG_VALUE_08BIT, &val); 801 if (ret) 802 return ret; 803 804 ret = ov13b10_write_reg(ov13b, OV13B10_REG_FORMAT1, 805 OV13B10_REG_VALUE_08BIT, 806 ctrl_val ? val | BIT(4) | BIT(5) : val); 807 808 if (ret) 809 return ret; 810 811 ret = ov13b10_read_reg(ov13b, OV13B10_REG_V_WIN_OFFSET, 812 OV13B10_REG_VALUE_08BIT, &val); 813 if (ret) 814 return ret; 815 816 /* 817 * Applying cropping offset to reverse the change of Bayer order 818 * after flipping image 819 */ 820 return ov13b10_write_reg(ov13b, OV13B10_REG_V_WIN_OFFSET, 821 OV13B10_REG_VALUE_08BIT, 822 ctrl_val ? --val : val); 823} 824 825static int ov13b10_set_ctrl(struct v4l2_ctrl *ctrl) 826{ 827 struct ov13b10 *ov13b = container_of(ctrl->handler, 828 struct ov13b10, ctrl_handler); 829 struct i2c_client *client = v4l2_get_subdevdata(&ov13b->sd); 830 s64 max; 831 int ret; 832 833 /* Propagate change of current control to all related controls */ 834 switch (ctrl->id) { 835 case V4L2_CID_VBLANK: 836 /* Update max exposure while meeting expected vblanking */ 837 max = ov13b->cur_mode->height + ctrl->val - 8; 838 __v4l2_ctrl_modify_range(ov13b->exposure, 839 ov13b->exposure->minimum, 840 max, ov13b->exposure->step, max); 841 break; 842 } 843 844 /* 845 * Applying V4L2 control value only happens 846 * when power is up for streaming 847 */ 848 if (!pm_runtime_get_if_in_use(&client->dev)) 849 return 0; 850 851 ret = 0; 852 switch (ctrl->id) { 853 case V4L2_CID_ANALOGUE_GAIN: 854 ret = ov13b10_write_reg(ov13b, OV13B10_REG_ANALOG_GAIN, 855 OV13B10_REG_VALUE_16BIT, 856 ctrl->val << 1); 857 break; 858 case V4L2_CID_DIGITAL_GAIN: 859 ret = ov13b10_update_digital_gain(ov13b, ctrl->val); 860 break; 861 case V4L2_CID_EXPOSURE: 862 ret = ov13b10_write_reg(ov13b, OV13B10_REG_EXPOSURE, 863 OV13B10_REG_VALUE_24BIT, 864 ctrl->val); 865 break; 866 case V4L2_CID_VBLANK: 867 ret = ov13b10_write_reg(ov13b, OV13B10_REG_VTS, 868 OV13B10_REG_VALUE_16BIT, 869 ov13b->cur_mode->height 870 + ctrl->val); 871 break; 872 case V4L2_CID_TEST_PATTERN: 873 ret = ov13b10_enable_test_pattern(ov13b, ctrl->val); 874 break; 875 case V4L2_CID_HFLIP: 876 ov13b10_set_ctrl_hflip(ov13b, ctrl->val); 877 break; 878 case V4L2_CID_VFLIP: 879 ov13b10_set_ctrl_vflip(ov13b, ctrl->val); 880 break; 881 default: 882 dev_info(&client->dev, 883 "ctrl(id:0x%x,val:0x%x) is not handled\n", 884 ctrl->id, ctrl->val); 885 break; 886 } 887 888 pm_runtime_put(&client->dev); 889 890 return ret; 891} 892 893static const struct v4l2_ctrl_ops ov13b10_ctrl_ops = { 894 .s_ctrl = ov13b10_set_ctrl, 895}; 896 897static int ov13b10_enum_mbus_code(struct v4l2_subdev *sd, 898 struct v4l2_subdev_state *sd_state, 899 struct v4l2_subdev_mbus_code_enum *code) 900{ 901 /* Only one bayer order(GRBG) is supported */ 902 if (code->index > 0) 903 return -EINVAL; 904 905 code->code = MEDIA_BUS_FMT_SGRBG10_1X10; 906 907 return 0; 908} 909 910static int ov13b10_enum_frame_size(struct v4l2_subdev *sd, 911 struct v4l2_subdev_state *sd_state, 912 struct v4l2_subdev_frame_size_enum *fse) 913{ 914 if (fse->index >= ARRAY_SIZE(supported_modes)) 915 return -EINVAL; 916 917 if (fse->code != MEDIA_BUS_FMT_SGRBG10_1X10) 918 return -EINVAL; 919 920 fse->min_width = supported_modes[fse->index].width; 921 fse->max_width = fse->min_width; 922 fse->min_height = supported_modes[fse->index].height; 923 fse->max_height = fse->min_height; 924 925 return 0; 926} 927 928static void ov13b10_update_pad_format(const struct ov13b10_mode *mode, 929 struct v4l2_subdev_format *fmt) 930{ 931 fmt->format.width = mode->width; 932 fmt->format.height = mode->height; 933 fmt->format.code = MEDIA_BUS_FMT_SGRBG10_1X10; 934 fmt->format.field = V4L2_FIELD_NONE; 935} 936 937static int ov13b10_do_get_pad_format(struct ov13b10 *ov13b, 938 struct v4l2_subdev_state *sd_state, 939 struct v4l2_subdev_format *fmt) 940{ 941 struct v4l2_mbus_framefmt *framefmt; 942 struct v4l2_subdev *sd = &ov13b->sd; 943 944 if (fmt->which == V4L2_SUBDEV_FORMAT_TRY) { 945 framefmt = v4l2_subdev_get_try_format(sd, sd_state, fmt->pad); 946 fmt->format = *framefmt; 947 } else { 948 ov13b10_update_pad_format(ov13b->cur_mode, fmt); 949 } 950 951 return 0; 952} 953 954static int ov13b10_get_pad_format(struct v4l2_subdev *sd, 955 struct v4l2_subdev_state *sd_state, 956 struct v4l2_subdev_format *fmt) 957{ 958 struct ov13b10 *ov13b = to_ov13b10(sd); 959 int ret; 960 961 mutex_lock(&ov13b->mutex); 962 ret = ov13b10_do_get_pad_format(ov13b, sd_state, fmt); 963 mutex_unlock(&ov13b->mutex); 964 965 return ret; 966} 967 968static int 969ov13b10_set_pad_format(struct v4l2_subdev *sd, 970 struct v4l2_subdev_state *sd_state, 971 struct v4l2_subdev_format *fmt) 972{ 973 struct ov13b10 *ov13b = to_ov13b10(sd); 974 const struct ov13b10_mode *mode; 975 struct v4l2_mbus_framefmt *framefmt; 976 s32 vblank_def; 977 s32 vblank_min; 978 s64 h_blank; 979 s64 pixel_rate; 980 s64 link_freq; 981 982 mutex_lock(&ov13b->mutex); 983 984 /* Only one raw bayer(GRBG) order is supported */ 985 if (fmt->format.code != MEDIA_BUS_FMT_SGRBG10_1X10) 986 fmt->format.code = MEDIA_BUS_FMT_SGRBG10_1X10; 987 988 mode = v4l2_find_nearest_size(supported_modes, 989 ARRAY_SIZE(supported_modes), 990 width, height, 991 fmt->format.width, fmt->format.height); 992 ov13b10_update_pad_format(mode, fmt); 993 if (fmt->which == V4L2_SUBDEV_FORMAT_TRY) { 994 framefmt = v4l2_subdev_get_try_format(sd, sd_state, fmt->pad); 995 *framefmt = fmt->format; 996 } else { 997 ov13b->cur_mode = mode; 998 __v4l2_ctrl_s_ctrl(ov13b->link_freq, mode->link_freq_index); 999 link_freq = link_freq_menu_items[mode->link_freq_index]; 1000 pixel_rate = link_freq_to_pixel_rate(link_freq); 1001 __v4l2_ctrl_s_ctrl_int64(ov13b->pixel_rate, pixel_rate); 1002 1003 /* Update limits and set FPS to default */ 1004 vblank_def = ov13b->cur_mode->vts_def - 1005 ov13b->cur_mode->height; 1006 vblank_min = ov13b->cur_mode->vts_min - 1007 ov13b->cur_mode->height; 1008 __v4l2_ctrl_modify_range(ov13b->vblank, vblank_min, 1009 OV13B10_VTS_MAX 1010 - ov13b->cur_mode->height, 1011 1, 1012 vblank_def); 1013 __v4l2_ctrl_s_ctrl(ov13b->vblank, vblank_def); 1014 h_blank = 1015 link_freq_configs[mode->link_freq_index].pixels_per_line 1016 - ov13b->cur_mode->width; 1017 __v4l2_ctrl_modify_range(ov13b->hblank, h_blank, 1018 h_blank, 1, h_blank); 1019 } 1020 1021 mutex_unlock(&ov13b->mutex); 1022 1023 return 0; 1024} 1025 1026static int ov13b10_start_streaming(struct ov13b10 *ov13b) 1027{ 1028 struct i2c_client *client = v4l2_get_subdevdata(&ov13b->sd); 1029 const struct ov13b10_reg_list *reg_list; 1030 int ret, link_freq_index; 1031 1032 /* Get out of from software reset */ 1033 ret = ov13b10_write_reg(ov13b, OV13B10_REG_SOFTWARE_RST, 1034 OV13B10_REG_VALUE_08BIT, OV13B10_SOFTWARE_RST); 1035 if (ret) { 1036 dev_err(&client->dev, "%s failed to set powerup registers\n", 1037 __func__); 1038 return ret; 1039 } 1040 1041 link_freq_index = ov13b->cur_mode->link_freq_index; 1042 reg_list = &link_freq_configs[link_freq_index].reg_list; 1043 ret = ov13b10_write_reg_list(ov13b, reg_list); 1044 if (ret) { 1045 dev_err(&client->dev, "%s failed to set plls\n", __func__); 1046 return ret; 1047 } 1048 1049 /* Apply default values of current mode */ 1050 reg_list = &ov13b->cur_mode->reg_list; 1051 ret = ov13b10_write_reg_list(ov13b, reg_list); 1052 if (ret) { 1053 dev_err(&client->dev, "%s failed to set mode\n", __func__); 1054 return ret; 1055 } 1056 1057 /* Apply customized values from user */ 1058 ret = __v4l2_ctrl_handler_setup(ov13b->sd.ctrl_handler); 1059 if (ret) 1060 return ret; 1061 1062 return ov13b10_write_reg(ov13b, OV13B10_REG_MODE_SELECT, 1063 OV13B10_REG_VALUE_08BIT, 1064 OV13B10_MODE_STREAMING); 1065} 1066 1067/* Stop streaming */ 1068static int ov13b10_stop_streaming(struct ov13b10 *ov13b) 1069{ 1070 return ov13b10_write_reg(ov13b, OV13B10_REG_MODE_SELECT, 1071 OV13B10_REG_VALUE_08BIT, OV13B10_MODE_STANDBY); 1072} 1073 1074static int ov13b10_set_stream(struct v4l2_subdev *sd, int enable) 1075{ 1076 struct ov13b10 *ov13b = to_ov13b10(sd); 1077 struct i2c_client *client = v4l2_get_subdevdata(sd); 1078 int ret = 0; 1079 1080 mutex_lock(&ov13b->mutex); 1081 if (ov13b->streaming == enable) { 1082 mutex_unlock(&ov13b->mutex); 1083 return 0; 1084 } 1085 1086 if (enable) { 1087 ret = pm_runtime_resume_and_get(&client->dev); 1088 if (ret < 0) 1089 goto err_unlock; 1090 1091 /* 1092 * Apply default & customized values 1093 * and then start streaming. 1094 */ 1095 ret = ov13b10_start_streaming(ov13b); 1096 if (ret) 1097 goto err_rpm_put; 1098 } else { 1099 ov13b10_stop_streaming(ov13b); 1100 pm_runtime_put(&client->dev); 1101 } 1102 1103 ov13b->streaming = enable; 1104 mutex_unlock(&ov13b->mutex); 1105 1106 return ret; 1107 1108err_rpm_put: 1109 pm_runtime_put(&client->dev); 1110err_unlock: 1111 mutex_unlock(&ov13b->mutex); 1112 1113 return ret; 1114} 1115 1116static int __maybe_unused ov13b10_suspend(struct device *dev) 1117{ 1118 struct v4l2_subdev *sd = dev_get_drvdata(dev); 1119 struct ov13b10 *ov13b = to_ov13b10(sd); 1120 1121 if (ov13b->streaming) 1122 ov13b10_stop_streaming(ov13b); 1123 1124 return 0; 1125} 1126 1127static int __maybe_unused ov13b10_resume(struct device *dev) 1128{ 1129 struct v4l2_subdev *sd = dev_get_drvdata(dev); 1130 struct ov13b10 *ov13b = to_ov13b10(sd); 1131 int ret; 1132 1133 if (ov13b->streaming) { 1134 ret = ov13b10_start_streaming(ov13b); 1135 if (ret) 1136 goto error; 1137 } 1138 1139 return 0; 1140 1141error: 1142 ov13b10_stop_streaming(ov13b); 1143 ov13b->streaming = false; 1144 return ret; 1145} 1146 1147/* Verify chip ID */ 1148static int ov13b10_identify_module(struct ov13b10 *ov13b) 1149{ 1150 struct i2c_client *client = v4l2_get_subdevdata(&ov13b->sd); 1151 int ret; 1152 u32 val; 1153 1154 ret = ov13b10_read_reg(ov13b, OV13B10_REG_CHIP_ID, 1155 OV13B10_REG_VALUE_24BIT, &val); 1156 if (ret) 1157 return ret; 1158 1159 if (val != OV13B10_CHIP_ID) { 1160 dev_err(&client->dev, "chip id mismatch: %x!=%x\n", 1161 OV13B10_CHIP_ID, val); 1162 return -EIO; 1163 } 1164 1165 return 0; 1166} 1167 1168static const struct v4l2_subdev_video_ops ov13b10_video_ops = { 1169 .s_stream = ov13b10_set_stream, 1170}; 1171 1172static const struct v4l2_subdev_pad_ops ov13b10_pad_ops = { 1173 .enum_mbus_code = ov13b10_enum_mbus_code, 1174 .get_fmt = ov13b10_get_pad_format, 1175 .set_fmt = ov13b10_set_pad_format, 1176 .enum_frame_size = ov13b10_enum_frame_size, 1177}; 1178 1179static const struct v4l2_subdev_ops ov13b10_subdev_ops = { 1180 .video = &ov13b10_video_ops, 1181 .pad = &ov13b10_pad_ops, 1182}; 1183 1184static const struct media_entity_operations ov13b10_subdev_entity_ops = { 1185 .link_validate = v4l2_subdev_link_validate, 1186}; 1187 1188static const struct v4l2_subdev_internal_ops ov13b10_internal_ops = { 1189 .open = ov13b10_open, 1190}; 1191 1192/* Initialize control handlers */ 1193static int ov13b10_init_controls(struct ov13b10 *ov13b) 1194{ 1195 struct i2c_client *client = v4l2_get_subdevdata(&ov13b->sd); 1196 struct v4l2_fwnode_device_properties props; 1197 struct v4l2_ctrl_handler *ctrl_hdlr; 1198 s64 exposure_max; 1199 s64 vblank_def; 1200 s64 vblank_min; 1201 s64 hblank; 1202 s64 pixel_rate_min; 1203 s64 pixel_rate_max; 1204 const struct ov13b10_mode *mode; 1205 u32 max; 1206 int ret; 1207 1208 ctrl_hdlr = &ov13b->ctrl_handler; 1209 ret = v4l2_ctrl_handler_init(ctrl_hdlr, 10); 1210 if (ret) 1211 return ret; 1212 1213 mutex_init(&ov13b->mutex); 1214 ctrl_hdlr->lock = &ov13b->mutex; 1215 max = ARRAY_SIZE(link_freq_menu_items) - 1; 1216 ov13b->link_freq = v4l2_ctrl_new_int_menu(ctrl_hdlr, 1217 &ov13b10_ctrl_ops, 1218 V4L2_CID_LINK_FREQ, 1219 max, 1220 0, 1221 link_freq_menu_items); 1222 if (ov13b->link_freq) 1223 ov13b->link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY; 1224 1225 pixel_rate_max = link_freq_to_pixel_rate(link_freq_menu_items[0]); 1226 pixel_rate_min = 0; 1227 /* By default, PIXEL_RATE is read only */ 1228 ov13b->pixel_rate = v4l2_ctrl_new_std(ctrl_hdlr, &ov13b10_ctrl_ops, 1229 V4L2_CID_PIXEL_RATE, 1230 pixel_rate_min, pixel_rate_max, 1231 1, pixel_rate_max); 1232 1233 mode = ov13b->cur_mode; 1234 vblank_def = mode->vts_def - mode->height; 1235 vblank_min = mode->vts_min - mode->height; 1236 ov13b->vblank = v4l2_ctrl_new_std(ctrl_hdlr, &ov13b10_ctrl_ops, 1237 V4L2_CID_VBLANK, 1238 vblank_min, 1239 OV13B10_VTS_MAX - mode->height, 1, 1240 vblank_def); 1241 1242 hblank = link_freq_configs[mode->link_freq_index].pixels_per_line - 1243 mode->width; 1244 ov13b->hblank = v4l2_ctrl_new_std(ctrl_hdlr, &ov13b10_ctrl_ops, 1245 V4L2_CID_HBLANK, 1246 hblank, hblank, 1, hblank); 1247 if (ov13b->hblank) 1248 ov13b->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY; 1249 1250 exposure_max = mode->vts_def - 8; 1251 ov13b->exposure = v4l2_ctrl_new_std(ctrl_hdlr, &ov13b10_ctrl_ops, 1252 V4L2_CID_EXPOSURE, 1253 OV13B10_EXPOSURE_MIN, 1254 exposure_max, OV13B10_EXPOSURE_STEP, 1255 exposure_max); 1256 1257 v4l2_ctrl_new_std(ctrl_hdlr, &ov13b10_ctrl_ops, V4L2_CID_ANALOGUE_GAIN, 1258 OV13B10_ANA_GAIN_MIN, OV13B10_ANA_GAIN_MAX, 1259 OV13B10_ANA_GAIN_STEP, OV13B10_ANA_GAIN_DEFAULT); 1260 1261 /* Digital gain */ 1262 v4l2_ctrl_new_std(ctrl_hdlr, &ov13b10_ctrl_ops, V4L2_CID_DIGITAL_GAIN, 1263 OV13B10_DGTL_GAIN_MIN, OV13B10_DGTL_GAIN_MAX, 1264 OV13B10_DGTL_GAIN_STEP, OV13B10_DGTL_GAIN_DEFAULT); 1265 1266 v4l2_ctrl_new_std_menu_items(ctrl_hdlr, &ov13b10_ctrl_ops, 1267 V4L2_CID_TEST_PATTERN, 1268 ARRAY_SIZE(ov13b10_test_pattern_menu) - 1, 1269 0, 0, ov13b10_test_pattern_menu); 1270 1271 v4l2_ctrl_new_std(ctrl_hdlr, &ov13b10_ctrl_ops, 1272 V4L2_CID_HFLIP, 0, 1, 1, 0); 1273 v4l2_ctrl_new_std(ctrl_hdlr, &ov13b10_ctrl_ops, 1274 V4L2_CID_VFLIP, 0, 1, 1, 0); 1275 1276 if (ctrl_hdlr->error) { 1277 ret = ctrl_hdlr->error; 1278 dev_err(&client->dev, "%s control init failed (%d)\n", 1279 __func__, ret); 1280 goto error; 1281 } 1282 1283 ret = v4l2_fwnode_device_parse(&client->dev, &props); 1284 if (ret) 1285 goto error; 1286 1287 ret = v4l2_ctrl_new_fwnode_properties(ctrl_hdlr, &ov13b10_ctrl_ops, 1288 &props); 1289 if (ret) 1290 goto error; 1291 1292 ov13b->sd.ctrl_handler = ctrl_hdlr; 1293 1294 return 0; 1295 1296error: 1297 v4l2_ctrl_handler_free(ctrl_hdlr); 1298 mutex_destroy(&ov13b->mutex); 1299 1300 return ret; 1301} 1302 1303static void ov13b10_free_controls(struct ov13b10 *ov13b) 1304{ 1305 v4l2_ctrl_handler_free(ov13b->sd.ctrl_handler); 1306 mutex_destroy(&ov13b->mutex); 1307} 1308 1309static int ov13b10_check_hwcfg(struct device *dev) 1310{ 1311 struct v4l2_fwnode_endpoint bus_cfg = { 1312 .bus_type = V4L2_MBUS_CSI2_DPHY 1313 }; 1314 struct fwnode_handle *ep; 1315 struct fwnode_handle *fwnode = dev_fwnode(dev); 1316 unsigned int i, j; 1317 int ret; 1318 u32 ext_clk; 1319 1320 if (!fwnode) 1321 return -ENXIO; 1322 1323 ret = fwnode_property_read_u32(dev_fwnode(dev), "clock-frequency", 1324 &ext_clk); 1325 if (ret) { 1326 dev_err(dev, "can't get clock frequency"); 1327 return ret; 1328 } 1329 1330 if (ext_clk != OV13B10_EXT_CLK) { 1331 dev_err(dev, "external clock %d is not supported", 1332 ext_clk); 1333 return -EINVAL; 1334 } 1335 1336 ep = fwnode_graph_get_next_endpoint(fwnode, NULL); 1337 if (!ep) 1338 return -ENXIO; 1339 1340 ret = v4l2_fwnode_endpoint_alloc_parse(ep, &bus_cfg); 1341 fwnode_handle_put(ep); 1342 if (ret) 1343 return ret; 1344 1345 if (bus_cfg.bus.mipi_csi2.num_data_lanes != OV13B10_DATA_LANES) { 1346 dev_err(dev, "number of CSI2 data lanes %d is not supported", 1347 bus_cfg.bus.mipi_csi2.num_data_lanes); 1348 ret = -EINVAL; 1349 goto out_err; 1350 } 1351 1352 if (!bus_cfg.nr_of_link_frequencies) { 1353 dev_err(dev, "no link frequencies defined"); 1354 ret = -EINVAL; 1355 goto out_err; 1356 } 1357 1358 for (i = 0; i < ARRAY_SIZE(link_freq_menu_items); i++) { 1359 for (j = 0; j < bus_cfg.nr_of_link_frequencies; j++) { 1360 if (link_freq_menu_items[i] == 1361 bus_cfg.link_frequencies[j]) 1362 break; 1363 } 1364 1365 if (j == bus_cfg.nr_of_link_frequencies) { 1366 dev_err(dev, "no link frequency %lld supported", 1367 link_freq_menu_items[i]); 1368 ret = -EINVAL; 1369 goto out_err; 1370 } 1371 } 1372 1373out_err: 1374 v4l2_fwnode_endpoint_free(&bus_cfg); 1375 1376 return ret; 1377} 1378 1379static int ov13b10_probe(struct i2c_client *client) 1380{ 1381 struct ov13b10 *ov13b; 1382 int ret; 1383 1384 /* Check HW config */ 1385 ret = ov13b10_check_hwcfg(&client->dev); 1386 if (ret) { 1387 dev_err(&client->dev, "failed to check hwcfg: %d", ret); 1388 return ret; 1389 } 1390 1391 ov13b = devm_kzalloc(&client->dev, sizeof(*ov13b), GFP_KERNEL); 1392 if (!ov13b) 1393 return -ENOMEM; 1394 1395 /* Initialize subdev */ 1396 v4l2_i2c_subdev_init(&ov13b->sd, client, &ov13b10_subdev_ops); 1397 1398 /* Check module identity */ 1399 ret = ov13b10_identify_module(ov13b); 1400 if (ret) { 1401 dev_err(&client->dev, "failed to find sensor: %d\n", ret); 1402 return ret; 1403 } 1404 1405 /* Set default mode to max resolution */ 1406 ov13b->cur_mode = &supported_modes[0]; 1407 1408 ret = ov13b10_init_controls(ov13b); 1409 if (ret) 1410 return ret; 1411 1412 /* Initialize subdev */ 1413 ov13b->sd.internal_ops = &ov13b10_internal_ops; 1414 ov13b->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE; 1415 ov13b->sd.entity.ops = &ov13b10_subdev_entity_ops; 1416 ov13b->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR; 1417 1418 /* Initialize source pad */ 1419 ov13b->pad.flags = MEDIA_PAD_FL_SOURCE; 1420 ret = media_entity_pads_init(&ov13b->sd.entity, 1, &ov13b->pad); 1421 if (ret) { 1422 dev_err(&client->dev, "%s failed:%d\n", __func__, ret); 1423 goto error_handler_free; 1424 } 1425 1426 ret = v4l2_async_register_subdev_sensor(&ov13b->sd); 1427 if (ret < 0) 1428 goto error_media_entity; 1429 1430 /* 1431 * Device is already turned on by i2c-core with ACPI domain PM. 1432 * Enable runtime PM and turn off the device. 1433 */ 1434 pm_runtime_set_active(&client->dev); 1435 pm_runtime_enable(&client->dev); 1436 pm_runtime_idle(&client->dev); 1437 1438 return 0; 1439 1440error_media_entity: 1441 media_entity_cleanup(&ov13b->sd.entity); 1442 1443error_handler_free: 1444 ov13b10_free_controls(ov13b); 1445 dev_err(&client->dev, "%s failed:%d\n", __func__, ret); 1446 1447 return ret; 1448} 1449 1450static int ov13b10_remove(struct i2c_client *client) 1451{ 1452 struct v4l2_subdev *sd = i2c_get_clientdata(client); 1453 struct ov13b10 *ov13b = to_ov13b10(sd); 1454 1455 v4l2_async_unregister_subdev(sd); 1456 media_entity_cleanup(&sd->entity); 1457 ov13b10_free_controls(ov13b); 1458 1459 pm_runtime_disable(&client->dev); 1460 1461 return 0; 1462} 1463 1464static const struct dev_pm_ops ov13b10_pm_ops = { 1465 SET_SYSTEM_SLEEP_PM_OPS(ov13b10_suspend, ov13b10_resume) 1466}; 1467 1468#ifdef CONFIG_ACPI 1469static const struct acpi_device_id ov13b10_acpi_ids[] = { 1470 {"OVTIDB10"}, 1471 { /* sentinel */ } 1472}; 1473 1474MODULE_DEVICE_TABLE(acpi, ov13b10_acpi_ids); 1475#endif 1476 1477static struct i2c_driver ov13b10_i2c_driver = { 1478 .driver = { 1479 .name = "ov13b10", 1480 .pm = &ov13b10_pm_ops, 1481 .acpi_match_table = ACPI_PTR(ov13b10_acpi_ids), 1482 }, 1483 .probe_new = ov13b10_probe, 1484 .remove = ov13b10_remove, 1485}; 1486 1487module_i2c_driver(ov13b10_i2c_driver); 1488 1489MODULE_AUTHOR("Kao, Arec <arec.kao@intel.com>"); 1490MODULE_DESCRIPTION("Omnivision ov13b10 sensor driver"); 1491MODULE_LICENSE("GPL v2");