og01a1b.c (26116B)
1// SPDX-License-Identifier: GPL-2.0 2// Copyright (c) 2022 Intel Corporation. 3 4#include <asm/unaligned.h> 5#include <linux/acpi.h> 6#include <linux/delay.h> 7#include <linux/i2c.h> 8#include <linux/module.h> 9#include <linux/pm_runtime.h> 10#include <media/v4l2-ctrls.h> 11#include <media/v4l2-device.h> 12#include <media/v4l2-fwnode.h> 13 14#define OG01A1B_REG_VALUE_08BIT 1 15#define OG01A1B_REG_VALUE_16BIT 2 16#define OG01A1B_REG_VALUE_24BIT 3 17 18#define OG01A1B_LINK_FREQ_500MHZ 500000000ULL 19#define OG01A1B_SCLK 120000000LL 20#define OG01A1B_MCLK 19200000 21#define OG01A1B_DATA_LANES 2 22#define OG01A1B_RGB_DEPTH 10 23 24#define OG01A1B_REG_CHIP_ID 0x300a 25#define OG01A1B_CHIP_ID 0x470141 26 27#define OG01A1B_REG_MODE_SELECT 0x0100 28#define OG01A1B_MODE_STANDBY 0x00 29#define OG01A1B_MODE_STREAMING 0x01 30 31/* vertical-timings from sensor */ 32#define OG01A1B_REG_VTS 0x380e 33#define OG01A1B_VTS_120FPS 0x0498 34#define OG01A1B_VTS_120FPS_MIN 0x0498 35#define OG01A1B_VTS_MAX 0x7fff 36 37/* horizontal-timings from sensor */ 38#define OG01A1B_REG_HTS 0x380c 39 40/* Exposure controls from sensor */ 41#define OG01A1B_REG_EXPOSURE 0x3501 42#define OG01A1B_EXPOSURE_MIN 1 43#define OG01A1B_EXPOSURE_MAX_MARGIN 14 44#define OG01A1B_EXPOSURE_STEP 1 45 46/* Analog gain controls from sensor */ 47#define OG01A1B_REG_ANALOG_GAIN 0x3508 48#define OG01A1B_ANAL_GAIN_MIN 16 49#define OG01A1B_ANAL_GAIN_MAX 248 /* Max = 15.5x */ 50#define OG01A1B_ANAL_GAIN_STEP 1 51 52/* Digital gain controls from sensor */ 53#define OG01A1B_REG_DIG_GAIN 0x350a 54#define OG01A1B_DGTL_GAIN_MIN 1024 55#define OG01A1B_DGTL_GAIN_MAX 16384 /* Max = 16x */ 56#define OG01A1B_DGTL_GAIN_STEP 1 57#define OG01A1B_DGTL_GAIN_DEFAULT 1024 58 59/* Group Access */ 60#define OG01A1B_REG_GROUP_ACCESS 0x3208 61#define OG01A1B_GROUP_HOLD_START 0x0 62#define OG01A1B_GROUP_HOLD_END 0x10 63#define OG01A1B_GROUP_HOLD_LAUNCH 0xa0 64 65/* Test Pattern Control */ 66#define OG01A1B_REG_TEST_PATTERN 0x5100 67#define OG01A1B_TEST_PATTERN_ENABLE BIT(7) 68#define OG01A1B_TEST_PATTERN_BAR_SHIFT 2 69 70#define to_og01a1b(_sd) container_of(_sd, struct og01a1b, sd) 71 72enum { 73 OG01A1B_LINK_FREQ_1000MBPS, 74}; 75 76struct og01a1b_reg { 77 u16 address; 78 u8 val; 79}; 80 81struct og01a1b_reg_list { 82 u32 num_of_regs; 83 const struct og01a1b_reg *regs; 84}; 85 86struct og01a1b_link_freq_config { 87 const struct og01a1b_reg_list reg_list; 88}; 89 90struct og01a1b_mode { 91 /* Frame width in pixels */ 92 u32 width; 93 94 /* Frame height in pixels */ 95 u32 height; 96 97 /* Horizontal timining size */ 98 u32 hts; 99 100 /* Default vertical timining size */ 101 u32 vts_def; 102 103 /* Min vertical timining size */ 104 u32 vts_min; 105 106 /* Link frequency needed for this resolution */ 107 u32 link_freq_index; 108 109 /* Sensor register settings for this resolution */ 110 const struct og01a1b_reg_list reg_list; 111}; 112 113static const struct og01a1b_reg mipi_data_rate_1000mbps[] = { 114 {0x0103, 0x01}, 115 {0x0303, 0x02}, 116 {0x0304, 0x00}, 117 {0x0305, 0xd2}, 118 {0x0323, 0x02}, 119 {0x0324, 0x01}, 120 {0x0325, 0x77}, 121}; 122 123static const struct og01a1b_reg mode_1280x1024_regs[] = { 124 {0x0300, 0x0a}, 125 {0x0301, 0x29}, 126 {0x0302, 0x31}, 127 {0x0303, 0x02}, 128 {0x0304, 0x00}, 129 {0x0305, 0xd2}, 130 {0x0306, 0x00}, 131 {0x0307, 0x01}, 132 {0x0308, 0x02}, 133 {0x0309, 0x00}, 134 {0x0310, 0x00}, 135 {0x0311, 0x00}, 136 {0x0312, 0x07}, 137 {0x0313, 0x00}, 138 {0x0314, 0x00}, 139 {0x0315, 0x00}, 140 {0x0320, 0x02}, 141 {0x0321, 0x01}, 142 {0x0322, 0x01}, 143 {0x0323, 0x02}, 144 {0x0324, 0x01}, 145 {0x0325, 0x77}, 146 {0x0326, 0xce}, 147 {0x0327, 0x04}, 148 {0x0329, 0x02}, 149 {0x032a, 0x04}, 150 {0x032b, 0x04}, 151 {0x032c, 0x02}, 152 {0x032d, 0x01}, 153 {0x032e, 0x00}, 154 {0x300d, 0x02}, 155 {0x300e, 0x04}, 156 {0x3021, 0x08}, 157 {0x301e, 0x03}, 158 {0x3103, 0x00}, 159 {0x3106, 0x08}, 160 {0x3107, 0x40}, 161 {0x3216, 0x01}, 162 {0x3217, 0x00}, 163 {0x3218, 0xc0}, 164 {0x3219, 0x55}, 165 {0x3500, 0x00}, 166 {0x3501, 0x04}, 167 {0x3502, 0x8a}, 168 {0x3506, 0x01}, 169 {0x3507, 0x72}, 170 {0x3508, 0x01}, 171 {0x3509, 0x00}, 172 {0x350a, 0x01}, 173 {0x350b, 0x00}, 174 {0x350c, 0x00}, 175 {0x3541, 0x00}, 176 {0x3542, 0x40}, 177 {0x3605, 0xe0}, 178 {0x3606, 0x41}, 179 {0x3614, 0x20}, 180 {0x3620, 0x0b}, 181 {0x3630, 0x07}, 182 {0x3636, 0xa0}, 183 {0x3637, 0xf9}, 184 {0x3638, 0x09}, 185 {0x3639, 0x38}, 186 {0x363f, 0x09}, 187 {0x3640, 0x17}, 188 {0x3662, 0x04}, 189 {0x3665, 0x80}, 190 {0x3670, 0x68}, 191 {0x3674, 0x00}, 192 {0x3677, 0x3f}, 193 {0x3679, 0x00}, 194 {0x369f, 0x19}, 195 {0x36a0, 0x03}, 196 {0x36a2, 0x19}, 197 {0x36a3, 0x03}, 198 {0x370d, 0x66}, 199 {0x370f, 0x00}, 200 {0x3710, 0x03}, 201 {0x3715, 0x03}, 202 {0x3716, 0x03}, 203 {0x3717, 0x06}, 204 {0x3733, 0x00}, 205 {0x3778, 0x00}, 206 {0x37a8, 0x0f}, 207 {0x37a9, 0x01}, 208 {0x37aa, 0x07}, 209 {0x37bd, 0x1c}, 210 {0x37c1, 0x2f}, 211 {0x37c3, 0x09}, 212 {0x37c8, 0x1d}, 213 {0x37ca, 0x30}, 214 {0x37df, 0x00}, 215 {0x3800, 0x00}, 216 {0x3801, 0x00}, 217 {0x3802, 0x00}, 218 {0x3803, 0x00}, 219 {0x3804, 0x05}, 220 {0x3805, 0x0f}, 221 {0x3806, 0x04}, 222 {0x3807, 0x0f}, 223 {0x3808, 0x05}, 224 {0x3809, 0x00}, 225 {0x380a, 0x04}, 226 {0x380b, 0x00}, 227 {0x380c, 0x03}, 228 {0x380d, 0x50}, 229 {0x380e, 0x04}, 230 {0x380f, 0x98}, 231 {0x3810, 0x00}, 232 {0x3811, 0x08}, 233 {0x3812, 0x00}, 234 {0x3813, 0x08}, 235 {0x3814, 0x11}, 236 {0x3815, 0x11}, 237 {0x3820, 0x40}, 238 {0x3821, 0x04}, 239 {0x3826, 0x00}, 240 {0x3827, 0x00}, 241 {0x382a, 0x08}, 242 {0x382b, 0x52}, 243 {0x382d, 0xba}, 244 {0x383d, 0x14}, 245 {0x384a, 0xa2}, 246 {0x3866, 0x0e}, 247 {0x3867, 0x07}, 248 {0x3884, 0x00}, 249 {0x3885, 0x08}, 250 {0x3893, 0x68}, 251 {0x3894, 0x2a}, 252 {0x3898, 0x00}, 253 {0x3899, 0x31}, 254 {0x389a, 0x04}, 255 {0x389b, 0x00}, 256 {0x389c, 0x0b}, 257 {0x389d, 0xad}, 258 {0x389f, 0x08}, 259 {0x38a0, 0x00}, 260 {0x38a1, 0x00}, 261 {0x38a8, 0x70}, 262 {0x38ac, 0xea}, 263 {0x38b2, 0x00}, 264 {0x38b3, 0x08}, 265 {0x38bc, 0x20}, 266 {0x38c4, 0x0c}, 267 {0x38c5, 0x3a}, 268 {0x38c7, 0x3a}, 269 {0x38e1, 0xc0}, 270 {0x38ec, 0x3c}, 271 {0x38f0, 0x09}, 272 {0x38f1, 0x6f}, 273 {0x38fe, 0x3c}, 274 {0x391e, 0x00}, 275 {0x391f, 0x00}, 276 {0x3920, 0xa5}, 277 {0x3921, 0x00}, 278 {0x3922, 0x00}, 279 {0x3923, 0x00}, 280 {0x3924, 0x05}, 281 {0x3925, 0x00}, 282 {0x3926, 0x00}, 283 {0x3927, 0x00}, 284 {0x3928, 0x1a}, 285 {0x3929, 0x01}, 286 {0x392a, 0xb4}, 287 {0x392b, 0x00}, 288 {0x392c, 0x10}, 289 {0x392f, 0x40}, 290 {0x4000, 0xcf}, 291 {0x4003, 0x40}, 292 {0x4008, 0x00}, 293 {0x4009, 0x07}, 294 {0x400a, 0x02}, 295 {0x400b, 0x54}, 296 {0x400c, 0x00}, 297 {0x400d, 0x07}, 298 {0x4010, 0xc0}, 299 {0x4012, 0x02}, 300 {0x4014, 0x04}, 301 {0x4015, 0x04}, 302 {0x4017, 0x02}, 303 {0x4042, 0x01}, 304 {0x4306, 0x04}, 305 {0x4307, 0x12}, 306 {0x4509, 0x00}, 307 {0x450b, 0x83}, 308 {0x4604, 0x68}, 309 {0x4608, 0x0a}, 310 {0x4700, 0x06}, 311 {0x4800, 0x64}, 312 {0x481b, 0x3c}, 313 {0x4825, 0x32}, 314 {0x4833, 0x18}, 315 {0x4837, 0x0f}, 316 {0x4850, 0x40}, 317 {0x4860, 0x00}, 318 {0x4861, 0xec}, 319 {0x4864, 0x00}, 320 {0x4883, 0x00}, 321 {0x4888, 0x90}, 322 {0x4889, 0x05}, 323 {0x488b, 0x04}, 324 {0x4f00, 0x04}, 325 {0x4f10, 0x04}, 326 {0x4f21, 0x01}, 327 {0x4f22, 0x40}, 328 {0x4f23, 0x44}, 329 {0x4f24, 0x51}, 330 {0x4f25, 0x41}, 331 {0x5000, 0x1f}, 332 {0x500a, 0x00}, 333 {0x5100, 0x00}, 334 {0x5111, 0x20}, 335 {0x3020, 0x20}, 336 {0x3613, 0x03}, 337 {0x38c9, 0x02}, 338 {0x5304, 0x01}, 339 {0x3620, 0x08}, 340 {0x3639, 0x58}, 341 {0x363a, 0x10}, 342 {0x3674, 0x04}, 343 {0x3780, 0xff}, 344 {0x3781, 0xff}, 345 {0x3782, 0x00}, 346 {0x3783, 0x01}, 347 {0x3798, 0xa3}, 348 {0x37aa, 0x10}, 349 {0x38a8, 0xf0}, 350 {0x38c4, 0x09}, 351 {0x38c5, 0xb0}, 352 {0x38df, 0x80}, 353 {0x38ff, 0x05}, 354 {0x4010, 0xf1}, 355 {0x4011, 0x70}, 356 {0x3667, 0x80}, 357 {0x4d00, 0x4a}, 358 {0x4d01, 0x18}, 359 {0x4d02, 0xbb}, 360 {0x4d03, 0xde}, 361 {0x4d04, 0x93}, 362 {0x4d05, 0xff}, 363 {0x4d09, 0x0a}, 364 {0x37aa, 0x16}, 365 {0x3606, 0x42}, 366 {0x3605, 0x00}, 367 {0x36a2, 0x17}, 368 {0x300d, 0x0a}, 369 {0x4d00, 0x4d}, 370 {0x4d01, 0x95}, 371 {0x3d8C, 0x70}, 372 {0x3d8d, 0xE9}, 373 {0x5300, 0x00}, 374 {0x5301, 0x10}, 375 {0x5302, 0x00}, 376 {0x5303, 0xE3}, 377 {0x3d88, 0x00}, 378 {0x3d89, 0x10}, 379 {0x3d8a, 0x00}, 380 {0x3d8b, 0xE3}, 381 {0x4f22, 0x00}, 382}; 383 384static const char * const og01a1b_test_pattern_menu[] = { 385 "Disabled", 386 "Standard Color Bar", 387 "Top-Bottom Darker Color Bar", 388 "Right-Left Darker Color Bar", 389 "Bottom-Top Darker Color Bar" 390}; 391 392static const s64 link_freq_menu_items[] = { 393 OG01A1B_LINK_FREQ_500MHZ, 394}; 395 396static const struct og01a1b_link_freq_config link_freq_configs[] = { 397 [OG01A1B_LINK_FREQ_1000MBPS] = { 398 .reg_list = { 399 .num_of_regs = ARRAY_SIZE(mipi_data_rate_1000mbps), 400 .regs = mipi_data_rate_1000mbps, 401 } 402 } 403}; 404 405static const struct og01a1b_mode supported_modes[] = { 406 { 407 .width = 1280, 408 .height = 1024, 409 .hts = 848, 410 .vts_def = OG01A1B_VTS_120FPS, 411 .vts_min = OG01A1B_VTS_120FPS_MIN, 412 .reg_list = { 413 .num_of_regs = ARRAY_SIZE(mode_1280x1024_regs), 414 .regs = mode_1280x1024_regs, 415 }, 416 .link_freq_index = OG01A1B_LINK_FREQ_1000MBPS, 417 }, 418}; 419 420struct og01a1b { 421 struct v4l2_subdev sd; 422 struct media_pad pad; 423 struct v4l2_ctrl_handler ctrl_handler; 424 425 /* V4L2 Controls */ 426 struct v4l2_ctrl *link_freq; 427 struct v4l2_ctrl *pixel_rate; 428 struct v4l2_ctrl *vblank; 429 struct v4l2_ctrl *hblank; 430 struct v4l2_ctrl *exposure; 431 432 /* Current mode */ 433 const struct og01a1b_mode *cur_mode; 434 435 /* To serialize asynchronus callbacks */ 436 struct mutex mutex; 437 438 /* Streaming on/off */ 439 bool streaming; 440}; 441 442static u64 to_pixel_rate(u32 f_index) 443{ 444 u64 pixel_rate = link_freq_menu_items[f_index] * 2 * OG01A1B_DATA_LANES; 445 446 do_div(pixel_rate, OG01A1B_RGB_DEPTH); 447 448 return pixel_rate; 449} 450 451static u64 to_pixels_per_line(u32 hts, u32 f_index) 452{ 453 u64 ppl = hts * to_pixel_rate(f_index); 454 455 do_div(ppl, OG01A1B_SCLK); 456 457 return ppl; 458} 459 460static int og01a1b_read_reg(struct og01a1b *og01a1b, u16 reg, u16 len, u32 *val) 461{ 462 struct i2c_client *client = v4l2_get_subdevdata(&og01a1b->sd); 463 struct i2c_msg msgs[2]; 464 u8 addr_buf[2]; 465 u8 data_buf[4] = {0}; 466 int ret; 467 468 if (len > 4) 469 return -EINVAL; 470 471 put_unaligned_be16(reg, addr_buf); 472 msgs[0].addr = client->addr; 473 msgs[0].flags = 0; 474 msgs[0].len = sizeof(addr_buf); 475 msgs[0].buf = addr_buf; 476 msgs[1].addr = client->addr; 477 msgs[1].flags = I2C_M_RD; 478 msgs[1].len = len; 479 msgs[1].buf = &data_buf[4 - len]; 480 481 ret = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs)); 482 if (ret != ARRAY_SIZE(msgs)) 483 return -EIO; 484 485 *val = get_unaligned_be32(data_buf); 486 487 return 0; 488} 489 490static int og01a1b_write_reg(struct og01a1b *og01a1b, u16 reg, u16 len, u32 val) 491{ 492 struct i2c_client *client = v4l2_get_subdevdata(&og01a1b->sd); 493 u8 buf[6]; 494 495 if (len > 4) 496 return -EINVAL; 497 498 put_unaligned_be16(reg, buf); 499 put_unaligned_be32(val << 8 * (4 - len), buf + 2); 500 if (i2c_master_send(client, buf, len + 2) != len + 2) 501 return -EIO; 502 503 return 0; 504} 505 506static int og01a1b_write_reg_list(struct og01a1b *og01a1b, 507 const struct og01a1b_reg_list *r_list) 508{ 509 struct i2c_client *client = v4l2_get_subdevdata(&og01a1b->sd); 510 unsigned int i; 511 int ret; 512 513 for (i = 0; i < r_list->num_of_regs; i++) { 514 ret = og01a1b_write_reg(og01a1b, r_list->regs[i].address, 1, 515 r_list->regs[i].val); 516 if (ret) { 517 dev_err_ratelimited(&client->dev, 518 "failed to write reg 0x%4.4x. error = %d", 519 r_list->regs[i].address, ret); 520 return ret; 521 } 522 } 523 524 return 0; 525} 526 527static int og01a1b_test_pattern(struct og01a1b *og01a1b, u32 pattern) 528{ 529 if (pattern) 530 pattern = (pattern - 1) << OG01A1B_TEST_PATTERN_BAR_SHIFT | 531 OG01A1B_TEST_PATTERN_ENABLE; 532 533 return og01a1b_write_reg(og01a1b, OG01A1B_REG_TEST_PATTERN, 534 OG01A1B_REG_VALUE_08BIT, pattern); 535} 536 537static int og01a1b_set_ctrl(struct v4l2_ctrl *ctrl) 538{ 539 struct og01a1b *og01a1b = container_of(ctrl->handler, 540 struct og01a1b, ctrl_handler); 541 struct i2c_client *client = v4l2_get_subdevdata(&og01a1b->sd); 542 s64 exposure_max; 543 int ret = 0; 544 545 /* Propagate change of current control to all related controls */ 546 if (ctrl->id == V4L2_CID_VBLANK) { 547 /* Update max exposure while meeting expected vblanking */ 548 exposure_max = og01a1b->cur_mode->height + ctrl->val - 549 OG01A1B_EXPOSURE_MAX_MARGIN; 550 __v4l2_ctrl_modify_range(og01a1b->exposure, 551 og01a1b->exposure->minimum, 552 exposure_max, og01a1b->exposure->step, 553 exposure_max); 554 } 555 556 /* V4L2 controls values will be applied only when power is already up */ 557 if (!pm_runtime_get_if_in_use(&client->dev)) 558 return 0; 559 560 switch (ctrl->id) { 561 case V4L2_CID_ANALOGUE_GAIN: 562 ret = og01a1b_write_reg(og01a1b, OG01A1B_REG_ANALOG_GAIN, 563 OG01A1B_REG_VALUE_16BIT, 564 ctrl->val << 4); 565 break; 566 567 case V4L2_CID_DIGITAL_GAIN: 568 ret = og01a1b_write_reg(og01a1b, OG01A1B_REG_DIG_GAIN, 569 OG01A1B_REG_VALUE_24BIT, 570 ctrl->val << 6); 571 break; 572 573 case V4L2_CID_EXPOSURE: 574 ret = og01a1b_write_reg(og01a1b, OG01A1B_REG_EXPOSURE, 575 OG01A1B_REG_VALUE_16BIT, ctrl->val); 576 break; 577 578 case V4L2_CID_VBLANK: 579 ret = og01a1b_write_reg(og01a1b, OG01A1B_REG_VTS, 580 OG01A1B_REG_VALUE_16BIT, 581 og01a1b->cur_mode->height + ctrl->val); 582 break; 583 584 case V4L2_CID_TEST_PATTERN: 585 ret = og01a1b_test_pattern(og01a1b, ctrl->val); 586 break; 587 588 default: 589 ret = -EINVAL; 590 break; 591 } 592 593 pm_runtime_put(&client->dev); 594 595 return ret; 596} 597 598static const struct v4l2_ctrl_ops og01a1b_ctrl_ops = { 599 .s_ctrl = og01a1b_set_ctrl, 600}; 601 602static int og01a1b_init_controls(struct og01a1b *og01a1b) 603{ 604 struct v4l2_ctrl_handler *ctrl_hdlr; 605 s64 exposure_max, h_blank; 606 int ret; 607 608 ctrl_hdlr = &og01a1b->ctrl_handler; 609 ret = v4l2_ctrl_handler_init(ctrl_hdlr, 8); 610 if (ret) 611 return ret; 612 613 ctrl_hdlr->lock = &og01a1b->mutex; 614 og01a1b->link_freq = v4l2_ctrl_new_int_menu(ctrl_hdlr, 615 &og01a1b_ctrl_ops, 616 V4L2_CID_LINK_FREQ, 617 ARRAY_SIZE 618 (link_freq_menu_items) - 1, 619 0, link_freq_menu_items); 620 if (og01a1b->link_freq) 621 og01a1b->link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY; 622 623 og01a1b->pixel_rate = v4l2_ctrl_new_std(ctrl_hdlr, &og01a1b_ctrl_ops, 624 V4L2_CID_PIXEL_RATE, 0, 625 to_pixel_rate 626 (OG01A1B_LINK_FREQ_1000MBPS), 627 1, 628 to_pixel_rate 629 (OG01A1B_LINK_FREQ_1000MBPS)); 630 og01a1b->vblank = v4l2_ctrl_new_std(ctrl_hdlr, &og01a1b_ctrl_ops, 631 V4L2_CID_VBLANK, 632 og01a1b->cur_mode->vts_min - 633 og01a1b->cur_mode->height, 634 OG01A1B_VTS_MAX - 635 og01a1b->cur_mode->height, 1, 636 og01a1b->cur_mode->vts_def - 637 og01a1b->cur_mode->height); 638 h_blank = to_pixels_per_line(og01a1b->cur_mode->hts, 639 og01a1b->cur_mode->link_freq_index) - 640 og01a1b->cur_mode->width; 641 og01a1b->hblank = v4l2_ctrl_new_std(ctrl_hdlr, &og01a1b_ctrl_ops, 642 V4L2_CID_HBLANK, h_blank, h_blank, 643 1, h_blank); 644 if (og01a1b->hblank) 645 og01a1b->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY; 646 647 v4l2_ctrl_new_std(ctrl_hdlr, &og01a1b_ctrl_ops, V4L2_CID_ANALOGUE_GAIN, 648 OG01A1B_ANAL_GAIN_MIN, OG01A1B_ANAL_GAIN_MAX, 649 OG01A1B_ANAL_GAIN_STEP, OG01A1B_ANAL_GAIN_MIN); 650 v4l2_ctrl_new_std(ctrl_hdlr, &og01a1b_ctrl_ops, V4L2_CID_DIGITAL_GAIN, 651 OG01A1B_DGTL_GAIN_MIN, OG01A1B_DGTL_GAIN_MAX, 652 OG01A1B_DGTL_GAIN_STEP, OG01A1B_DGTL_GAIN_DEFAULT); 653 exposure_max = (og01a1b->cur_mode->vts_def - 654 OG01A1B_EXPOSURE_MAX_MARGIN); 655 og01a1b->exposure = v4l2_ctrl_new_std(ctrl_hdlr, &og01a1b_ctrl_ops, 656 V4L2_CID_EXPOSURE, 657 OG01A1B_EXPOSURE_MIN, 658 exposure_max, 659 OG01A1B_EXPOSURE_STEP, 660 exposure_max); 661 v4l2_ctrl_new_std_menu_items(ctrl_hdlr, &og01a1b_ctrl_ops, 662 V4L2_CID_TEST_PATTERN, 663 ARRAY_SIZE(og01a1b_test_pattern_menu) - 1, 664 0, 0, og01a1b_test_pattern_menu); 665 666 if (ctrl_hdlr->error) 667 return ctrl_hdlr->error; 668 669 og01a1b->sd.ctrl_handler = ctrl_hdlr; 670 671 return 0; 672} 673 674static void og01a1b_update_pad_format(const struct og01a1b_mode *mode, 675 struct v4l2_mbus_framefmt *fmt) 676{ 677 fmt->width = mode->width; 678 fmt->height = mode->height; 679 fmt->code = MEDIA_BUS_FMT_SGRBG10_1X10; 680 fmt->field = V4L2_FIELD_NONE; 681} 682 683static int og01a1b_start_streaming(struct og01a1b *og01a1b) 684{ 685 struct i2c_client *client = v4l2_get_subdevdata(&og01a1b->sd); 686 const struct og01a1b_reg_list *reg_list; 687 int link_freq_index, ret; 688 689 link_freq_index = og01a1b->cur_mode->link_freq_index; 690 reg_list = &link_freq_configs[link_freq_index].reg_list; 691 692 ret = og01a1b_write_reg_list(og01a1b, reg_list); 693 if (ret) { 694 dev_err(&client->dev, "failed to set plls"); 695 return ret; 696 } 697 698 reg_list = &og01a1b->cur_mode->reg_list; 699 ret = og01a1b_write_reg_list(og01a1b, reg_list); 700 if (ret) { 701 dev_err(&client->dev, "failed to set mode"); 702 return ret; 703 } 704 705 ret = __v4l2_ctrl_handler_setup(og01a1b->sd.ctrl_handler); 706 if (ret) 707 return ret; 708 709 ret = og01a1b_write_reg(og01a1b, OG01A1B_REG_MODE_SELECT, 710 OG01A1B_REG_VALUE_08BIT, 711 OG01A1B_MODE_STREAMING); 712 if (ret) { 713 dev_err(&client->dev, "failed to set stream"); 714 return ret; 715 } 716 717 return 0; 718} 719 720static void og01a1b_stop_streaming(struct og01a1b *og01a1b) 721{ 722 struct i2c_client *client = v4l2_get_subdevdata(&og01a1b->sd); 723 724 if (og01a1b_write_reg(og01a1b, OG01A1B_REG_MODE_SELECT, 725 OG01A1B_REG_VALUE_08BIT, OG01A1B_MODE_STANDBY)) 726 dev_err(&client->dev, "failed to set stream"); 727} 728 729static int og01a1b_set_stream(struct v4l2_subdev *sd, int enable) 730{ 731 struct og01a1b *og01a1b = to_og01a1b(sd); 732 struct i2c_client *client = v4l2_get_subdevdata(sd); 733 int ret = 0; 734 735 if (og01a1b->streaming == enable) 736 return 0; 737 738 mutex_lock(&og01a1b->mutex); 739 if (enable) { 740 ret = pm_runtime_get_sync(&client->dev); 741 if (ret < 0) { 742 pm_runtime_put_noidle(&client->dev); 743 mutex_unlock(&og01a1b->mutex); 744 return ret; 745 } 746 747 ret = og01a1b_start_streaming(og01a1b); 748 if (ret) { 749 enable = 0; 750 og01a1b_stop_streaming(og01a1b); 751 pm_runtime_put(&client->dev); 752 } 753 } else { 754 og01a1b_stop_streaming(og01a1b); 755 pm_runtime_put(&client->dev); 756 } 757 758 og01a1b->streaming = enable; 759 mutex_unlock(&og01a1b->mutex); 760 761 return ret; 762} 763 764static int __maybe_unused og01a1b_suspend(struct device *dev) 765{ 766 struct i2c_client *client = to_i2c_client(dev); 767 struct v4l2_subdev *sd = i2c_get_clientdata(client); 768 struct og01a1b *og01a1b = to_og01a1b(sd); 769 770 mutex_lock(&og01a1b->mutex); 771 if (og01a1b->streaming) 772 og01a1b_stop_streaming(og01a1b); 773 774 mutex_unlock(&og01a1b->mutex); 775 776 return 0; 777} 778 779static int __maybe_unused og01a1b_resume(struct device *dev) 780{ 781 struct i2c_client *client = to_i2c_client(dev); 782 struct v4l2_subdev *sd = i2c_get_clientdata(client); 783 struct og01a1b *og01a1b = to_og01a1b(sd); 784 int ret; 785 786 mutex_lock(&og01a1b->mutex); 787 if (og01a1b->streaming) { 788 ret = og01a1b_start_streaming(og01a1b); 789 if (ret) { 790 og01a1b->streaming = false; 791 og01a1b_stop_streaming(og01a1b); 792 mutex_unlock(&og01a1b->mutex); 793 return ret; 794 } 795 } 796 797 mutex_unlock(&og01a1b->mutex); 798 799 return 0; 800} 801 802static int og01a1b_set_format(struct v4l2_subdev *sd, 803 struct v4l2_subdev_state *sd_state, 804 struct v4l2_subdev_format *fmt) 805{ 806 struct og01a1b *og01a1b = to_og01a1b(sd); 807 const struct og01a1b_mode *mode; 808 s32 vblank_def, h_blank; 809 810 mode = v4l2_find_nearest_size(supported_modes, 811 ARRAY_SIZE(supported_modes), width, 812 height, fmt->format.width, 813 fmt->format.height); 814 815 mutex_lock(&og01a1b->mutex); 816 og01a1b_update_pad_format(mode, &fmt->format); 817 if (fmt->which == V4L2_SUBDEV_FORMAT_TRY) { 818 *v4l2_subdev_get_try_format(sd, sd_state, 819 fmt->pad) = fmt->format; 820 } else { 821 og01a1b->cur_mode = mode; 822 __v4l2_ctrl_s_ctrl(og01a1b->link_freq, mode->link_freq_index); 823 __v4l2_ctrl_s_ctrl_int64(og01a1b->pixel_rate, 824 to_pixel_rate(mode->link_freq_index)); 825 826 /* Update limits and set FPS to default */ 827 vblank_def = mode->vts_def - mode->height; 828 __v4l2_ctrl_modify_range(og01a1b->vblank, 829 mode->vts_min - mode->height, 830 OG01A1B_VTS_MAX - mode->height, 1, 831 vblank_def); 832 __v4l2_ctrl_s_ctrl(og01a1b->vblank, vblank_def); 833 h_blank = to_pixels_per_line(mode->hts, mode->link_freq_index) - 834 mode->width; 835 __v4l2_ctrl_modify_range(og01a1b->hblank, h_blank, h_blank, 1, 836 h_blank); 837 } 838 839 mutex_unlock(&og01a1b->mutex); 840 841 return 0; 842} 843 844static int og01a1b_get_format(struct v4l2_subdev *sd, 845 struct v4l2_subdev_state *sd_state, 846 struct v4l2_subdev_format *fmt) 847{ 848 struct og01a1b *og01a1b = to_og01a1b(sd); 849 850 mutex_lock(&og01a1b->mutex); 851 if (fmt->which == V4L2_SUBDEV_FORMAT_TRY) 852 fmt->format = *v4l2_subdev_get_try_format(&og01a1b->sd, 853 sd_state, 854 fmt->pad); 855 else 856 og01a1b_update_pad_format(og01a1b->cur_mode, &fmt->format); 857 858 mutex_unlock(&og01a1b->mutex); 859 860 return 0; 861} 862 863static int og01a1b_enum_mbus_code(struct v4l2_subdev *sd, 864 struct v4l2_subdev_state *sd_state, 865 struct v4l2_subdev_mbus_code_enum *code) 866{ 867 if (code->index > 0) 868 return -EINVAL; 869 870 code->code = MEDIA_BUS_FMT_SGRBG10_1X10; 871 872 return 0; 873} 874 875static int og01a1b_enum_frame_size(struct v4l2_subdev *sd, 876 struct v4l2_subdev_state *sd_state, 877 struct v4l2_subdev_frame_size_enum *fse) 878{ 879 if (fse->index >= ARRAY_SIZE(supported_modes)) 880 return -EINVAL; 881 882 if (fse->code != MEDIA_BUS_FMT_SGRBG10_1X10) 883 return -EINVAL; 884 885 fse->min_width = supported_modes[fse->index].width; 886 fse->max_width = fse->min_width; 887 fse->min_height = supported_modes[fse->index].height; 888 fse->max_height = fse->min_height; 889 890 return 0; 891} 892 893static int og01a1b_open(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh) 894{ 895 struct og01a1b *og01a1b = to_og01a1b(sd); 896 897 mutex_lock(&og01a1b->mutex); 898 og01a1b_update_pad_format(&supported_modes[0], 899 v4l2_subdev_get_try_format(sd, fh->state, 0)); 900 mutex_unlock(&og01a1b->mutex); 901 902 return 0; 903} 904 905static const struct v4l2_subdev_video_ops og01a1b_video_ops = { 906 .s_stream = og01a1b_set_stream, 907}; 908 909static const struct v4l2_subdev_pad_ops og01a1b_pad_ops = { 910 .set_fmt = og01a1b_set_format, 911 .get_fmt = og01a1b_get_format, 912 .enum_mbus_code = og01a1b_enum_mbus_code, 913 .enum_frame_size = og01a1b_enum_frame_size, 914}; 915 916static const struct v4l2_subdev_ops og01a1b_subdev_ops = { 917 .video = &og01a1b_video_ops, 918 .pad = &og01a1b_pad_ops, 919}; 920 921static const struct media_entity_operations og01a1b_subdev_entity_ops = { 922 .link_validate = v4l2_subdev_link_validate, 923}; 924 925static const struct v4l2_subdev_internal_ops og01a1b_internal_ops = { 926 .open = og01a1b_open, 927}; 928 929static int og01a1b_identify_module(struct og01a1b *og01a1b) 930{ 931 struct i2c_client *client = v4l2_get_subdevdata(&og01a1b->sd); 932 int ret; 933 u32 val; 934 935 ret = og01a1b_read_reg(og01a1b, OG01A1B_REG_CHIP_ID, 936 OG01A1B_REG_VALUE_24BIT, &val); 937 if (ret) 938 return ret; 939 940 if (val != OG01A1B_CHIP_ID) { 941 dev_err(&client->dev, "chip id mismatch: %x!=%x", 942 OG01A1B_CHIP_ID, val); 943 return -ENXIO; 944 } 945 946 return 0; 947} 948 949static int og01a1b_check_hwcfg(struct device *dev) 950{ 951 struct fwnode_handle *ep; 952 struct fwnode_handle *fwnode = dev_fwnode(dev); 953 struct v4l2_fwnode_endpoint bus_cfg = { 954 .bus_type = V4L2_MBUS_CSI2_DPHY 955 }; 956 u32 mclk; 957 int ret; 958 unsigned int i, j; 959 960 if (!fwnode) 961 return -ENXIO; 962 963 ret = fwnode_property_read_u32(fwnode, "clock-frequency", &mclk); 964 965 if (ret) { 966 dev_err(dev, "can't get clock frequency"); 967 return ret; 968 } 969 970 if (mclk != OG01A1B_MCLK) { 971 dev_err(dev, "external clock %d is not supported", mclk); 972 return -EINVAL; 973 } 974 975 ep = fwnode_graph_get_next_endpoint(fwnode, NULL); 976 if (!ep) 977 return -ENXIO; 978 979 ret = v4l2_fwnode_endpoint_alloc_parse(ep, &bus_cfg); 980 fwnode_handle_put(ep); 981 if (ret) 982 return ret; 983 984 if (bus_cfg.bus.mipi_csi2.num_data_lanes != OG01A1B_DATA_LANES) { 985 dev_err(dev, "number of CSI2 data lanes %d is not supported", 986 bus_cfg.bus.mipi_csi2.num_data_lanes); 987 ret = -EINVAL; 988 goto check_hwcfg_error; 989 } 990 991 if (!bus_cfg.nr_of_link_frequencies) { 992 dev_err(dev, "no link frequencies defined"); 993 ret = -EINVAL; 994 goto check_hwcfg_error; 995 } 996 997 for (i = 0; i < ARRAY_SIZE(link_freq_menu_items); i++) { 998 for (j = 0; j < bus_cfg.nr_of_link_frequencies; j++) { 999 if (link_freq_menu_items[i] == 1000 bus_cfg.link_frequencies[j]) 1001 break; 1002 } 1003 1004 if (j == bus_cfg.nr_of_link_frequencies) { 1005 dev_err(dev, "no link frequency %lld supported", 1006 link_freq_menu_items[i]); 1007 ret = -EINVAL; 1008 goto check_hwcfg_error; 1009 } 1010 } 1011 1012check_hwcfg_error: 1013 v4l2_fwnode_endpoint_free(&bus_cfg); 1014 1015 return ret; 1016} 1017 1018static int og01a1b_remove(struct i2c_client *client) 1019{ 1020 struct v4l2_subdev *sd = i2c_get_clientdata(client); 1021 struct og01a1b *og01a1b = to_og01a1b(sd); 1022 1023 v4l2_async_unregister_subdev(sd); 1024 media_entity_cleanup(&sd->entity); 1025 v4l2_ctrl_handler_free(sd->ctrl_handler); 1026 pm_runtime_disable(&client->dev); 1027 mutex_destroy(&og01a1b->mutex); 1028 1029 return 0; 1030} 1031 1032static int og01a1b_probe(struct i2c_client *client) 1033{ 1034 struct og01a1b *og01a1b; 1035 int ret; 1036 1037 ret = og01a1b_check_hwcfg(&client->dev); 1038 if (ret) { 1039 dev_err(&client->dev, "failed to check HW configuration: %d", 1040 ret); 1041 return ret; 1042 } 1043 1044 og01a1b = devm_kzalloc(&client->dev, sizeof(*og01a1b), GFP_KERNEL); 1045 if (!og01a1b) 1046 return -ENOMEM; 1047 1048 v4l2_i2c_subdev_init(&og01a1b->sd, client, &og01a1b_subdev_ops); 1049 ret = og01a1b_identify_module(og01a1b); 1050 if (ret) { 1051 dev_err(&client->dev, "failed to find sensor: %d", ret); 1052 return ret; 1053 } 1054 1055 mutex_init(&og01a1b->mutex); 1056 og01a1b->cur_mode = &supported_modes[0]; 1057 ret = og01a1b_init_controls(og01a1b); 1058 if (ret) { 1059 dev_err(&client->dev, "failed to init controls: %d", ret); 1060 goto probe_error_v4l2_ctrl_handler_free; 1061 } 1062 1063 og01a1b->sd.internal_ops = &og01a1b_internal_ops; 1064 og01a1b->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE; 1065 og01a1b->sd.entity.ops = &og01a1b_subdev_entity_ops; 1066 og01a1b->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR; 1067 og01a1b->pad.flags = MEDIA_PAD_FL_SOURCE; 1068 ret = media_entity_pads_init(&og01a1b->sd.entity, 1, &og01a1b->pad); 1069 if (ret) { 1070 dev_err(&client->dev, "failed to init entity pads: %d", ret); 1071 goto probe_error_v4l2_ctrl_handler_free; 1072 } 1073 1074 ret = v4l2_async_register_subdev_sensor(&og01a1b->sd); 1075 if (ret < 0) { 1076 dev_err(&client->dev, "failed to register V4L2 subdev: %d", 1077 ret); 1078 goto probe_error_media_entity_cleanup; 1079 } 1080 1081 /* 1082 * Device is already turned on by i2c-core with ACPI domain PM. 1083 * Enable runtime PM and turn off the device. 1084 */ 1085 pm_runtime_set_active(&client->dev); 1086 pm_runtime_enable(&client->dev); 1087 pm_runtime_idle(&client->dev); 1088 1089 return 0; 1090 1091probe_error_media_entity_cleanup: 1092 media_entity_cleanup(&og01a1b->sd.entity); 1093 1094probe_error_v4l2_ctrl_handler_free: 1095 v4l2_ctrl_handler_free(og01a1b->sd.ctrl_handler); 1096 mutex_destroy(&og01a1b->mutex); 1097 1098 return ret; 1099} 1100 1101static const struct dev_pm_ops og01a1b_pm_ops = { 1102 SET_SYSTEM_SLEEP_PM_OPS(og01a1b_suspend, og01a1b_resume) 1103}; 1104 1105#ifdef CONFIG_ACPI 1106static const struct acpi_device_id og01a1b_acpi_ids[] = { 1107 {"OVTI01AC"}, 1108 {} 1109}; 1110 1111MODULE_DEVICE_TABLE(acpi, og01a1b_acpi_ids); 1112#endif 1113 1114static struct i2c_driver og01a1b_i2c_driver = { 1115 .driver = { 1116 .name = "og01a1b", 1117 .pm = &og01a1b_pm_ops, 1118 .acpi_match_table = ACPI_PTR(og01a1b_acpi_ids), 1119 }, 1120 .probe_new = og01a1b_probe, 1121 .remove = og01a1b_remove, 1122}; 1123 1124module_i2c_driver(og01a1b_i2c_driver); 1125 1126MODULE_AUTHOR("Shawn Tu <shawnx.tu@intel.com>"); 1127MODULE_DESCRIPTION("OmniVision OG01A1B sensor driver"); 1128MODULE_LICENSE("GPL v2");