1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * Samsung LSI S5C73M3 8M pixel camera driver 4 * 5 * Copyright (C) 2012, Samsung Electronics, Co., Ltd. 6 * Sylwester Nawrocki <s.nawrocki@samsung.com> 7 * Andrzej Hajda <a.hajda@samsung.com> 8 */ 9 10 #include <linux/clk.h> 11 #include <linux/delay.h> 12 #include <linux/firmware.h> 13 #include <linux/gpio/consumer.h> 14 #include <linux/i2c.h> 15 #include <linux/init.h> 16 #include <linux/media.h> 17 #include <linux/module.h> 18 #include <linux/of_graph.h> 19 #include <linux/regulator/consumer.h> 20 #include <linux/sizes.h> 21 #include <linux/slab.h> 22 #include <linux/spi/spi.h> 23 #include <linux/videodev2.h> 24 #include <media/media-entity.h> 25 #include <media/v4l2-ctrls.h> 26 #include <media/v4l2-device.h> 27 #include <media/v4l2-subdev.h> 28 #include <media/v4l2-mediabus.h> 29 #include <media/v4l2-fwnode.h> 30 31 #include "s5c73m3.h" 32 33 int s5c73m3_dbg; 34 module_param_named(debug, s5c73m3_dbg, int, 0644); 35 36 static int boot_from_rom = 1; 37 module_param(boot_from_rom, int, 0644); 38 39 static int update_fw; 40 module_param(update_fw, int, 0644); 41 42 #define S5C73M3_EMBEDDED_DATA_MAXLEN SZ_4K 43 #define S5C73M3_MIPI_DATA_LANES 4 44 #define S5C73M3_CLK_NAME "cis_extclk" 45 46 static const char * const s5c73m3_supply_names[S5C73M3_MAX_SUPPLIES] = { 47 "vdd-int", /* Digital Core supply (1.2V), CAM_ISP_CORE_1.2V */ 48 "vdda", /* Analog Core supply (1.2V), CAM_SENSOR_CORE_1.2V */ 49 "vdd-reg", /* Regulator input supply (2.8V), CAM_SENSOR_A2.8V */ 50 "vddio-host", /* Digital Host I/O power supply (1.8V...2.8V), 51 CAM_ISP_SENSOR_1.8V */ 52 "vddio-cis", /* Digital CIS I/O power (1.2V...1.8V), 53 CAM_ISP_MIPI_1.2V */ 54 "vdd-af", /* Lens, CAM_AF_2.8V */ 55 }; 56 57 static const struct s5c73m3_frame_size s5c73m3_isp_resolutions[] = { 58 { 320, 240, COMM_CHG_MODE_YUV_320_240 }, 59 { 352, 288, COMM_CHG_MODE_YUV_352_288 }, 60 { 640, 480, COMM_CHG_MODE_YUV_640_480 }, 61 { 880, 720, COMM_CHG_MODE_YUV_880_720 }, 62 { 960, 720, COMM_CHG_MODE_YUV_960_720 }, 63 { 1008, 672, COMM_CHG_MODE_YUV_1008_672 }, 64 { 1184, 666, COMM_CHG_MODE_YUV_1184_666 }, 65 { 1280, 720, COMM_CHG_MODE_YUV_1280_720 }, 66 { 1536, 864, COMM_CHG_MODE_YUV_1536_864 }, 67 { 1600, 1200, COMM_CHG_MODE_YUV_1600_1200 }, 68 { 1632, 1224, COMM_CHG_MODE_YUV_1632_1224 }, 69 { 1920, 1080, COMM_CHG_MODE_YUV_1920_1080 }, 70 { 1920, 1440, COMM_CHG_MODE_YUV_1920_1440 }, 71 { 2304, 1296, COMM_CHG_MODE_YUV_2304_1296 }, 72 { 3264, 2448, COMM_CHG_MODE_YUV_3264_2448 }, 73 }; 74 75 static const struct s5c73m3_frame_size s5c73m3_jpeg_resolutions[] = { 76 { 640, 480, COMM_CHG_MODE_JPEG_640_480 }, 77 { 800, 450, COMM_CHG_MODE_JPEG_800_450 }, 78 { 800, 600, COMM_CHG_MODE_JPEG_800_600 }, 79 { 1024, 768, COMM_CHG_MODE_JPEG_1024_768 }, 80 { 1280, 720, COMM_CHG_MODE_JPEG_1280_720 }, 81 { 1280, 960, COMM_CHG_MODE_JPEG_1280_960 }, 82 { 1600, 900, COMM_CHG_MODE_JPEG_1600_900 }, 83 { 1600, 1200, COMM_CHG_MODE_JPEG_1600_1200 }, 84 { 2048, 1152, COMM_CHG_MODE_JPEG_2048_1152 }, 85 { 2048, 1536, COMM_CHG_MODE_JPEG_2048_1536 }, 86 { 2560, 1440, COMM_CHG_MODE_JPEG_2560_1440 }, 87 { 2560, 1920, COMM_CHG_MODE_JPEG_2560_1920 }, 88 { 3264, 1836, COMM_CHG_MODE_JPEG_3264_1836 }, 89 { 3264, 2176, COMM_CHG_MODE_JPEG_3264_2176 }, 90 { 3264, 2448, COMM_CHG_MODE_JPEG_3264_2448 }, 91 }; 92 93 static const struct s5c73m3_frame_size * const s5c73m3_resolutions[] = { 94 [RES_ISP] = s5c73m3_isp_resolutions, 95 [RES_JPEG] = s5c73m3_jpeg_resolutions 96 }; 97 98 static const int s5c73m3_resolutions_len[] = { 99 [RES_ISP] = ARRAY_SIZE(s5c73m3_isp_resolutions), 100 [RES_JPEG] = ARRAY_SIZE(s5c73m3_jpeg_resolutions) 101 }; 102 103 static const struct s5c73m3_interval s5c73m3_intervals[] = { 104 { COMM_FRAME_RATE_FIXED_7FPS, {142857, 1000000}, {3264, 2448} }, 105 { COMM_FRAME_RATE_FIXED_15FPS, {66667, 1000000}, {3264, 2448} }, 106 { COMM_FRAME_RATE_FIXED_20FPS, {50000, 1000000}, {2304, 1296} }, 107 { COMM_FRAME_RATE_FIXED_30FPS, {33333, 1000000}, {2304, 1296} }, 108 }; 109 110 #define S5C73M3_DEFAULT_FRAME_INTERVAL 3 /* 30 fps */ 111 112 static void s5c73m3_fill_mbus_fmt(struct v4l2_mbus_framefmt *mf, 113 const struct s5c73m3_frame_size *fs, 114 u32 code) 115 { 116 mf->width = fs->width; 117 mf->height = fs->height; 118 mf->code = code; 119 mf->colorspace = V4L2_COLORSPACE_JPEG; 120 mf->field = V4L2_FIELD_NONE; 121 } 122 123 static int s5c73m3_i2c_write(struct i2c_client *client, u16 addr, u16 data) 124 { 125 u8 buf[4] = { addr >> 8, addr & 0xff, data >> 8, data & 0xff }; 126 127 int ret = i2c_master_send(client, buf, sizeof(buf)); 128 129 v4l_dbg(4, s5c73m3_dbg, client, "%s: addr 0x%04x, data 0x%04x\n", 130 __func__, addr, data); 131 132 if (ret == 4) 133 return 0; 134 135 return ret < 0 ? ret : -EREMOTEIO; 136 } 137 138 static int s5c73m3_i2c_read(struct i2c_client *client, u16 addr, u16 *data) 139 { 140 int ret; 141 u8 rbuf[2], wbuf[2] = { addr >> 8, addr & 0xff }; 142 struct i2c_msg msg[2] = { 143 { 144 .addr = client->addr, 145 .flags = 0, 146 .len = sizeof(wbuf), 147 .buf = wbuf 148 }, { 149 .addr = client->addr, 150 .flags = I2C_M_RD, 151 .len = sizeof(rbuf), 152 .buf = rbuf 153 } 154 }; 155 /* 156 * Issue repeated START after writing 2 address bytes and 157 * just one STOP only after reading the data bytes. 158 */ 159 ret = i2c_transfer(client->adapter, msg, 2); 160 if (ret == 2) { 161 *data = be16_to_cpup((__be16 *)rbuf); 162 v4l2_dbg(4, s5c73m3_dbg, client, 163 "%s: addr: 0x%04x, data: 0x%04x\n", 164 __func__, addr, *data); 165 return 0; 166 } 167 168 v4l2_err(client, "I2C read failed: addr: %04x, (%d)\n", addr, ret); 169 170 return ret >= 0 ? -EREMOTEIO : ret; 171 } 172 173 int s5c73m3_write(struct s5c73m3 *state, u32 addr, u16 data) 174 { 175 struct i2c_client *client = state->i2c_client; 176 int ret; 177 178 if ((addr ^ state->i2c_write_address) & 0xffff0000) { 179 ret = s5c73m3_i2c_write(client, REG_CMDWR_ADDRH, addr >> 16); 180 if (ret < 0) { 181 state->i2c_write_address = 0; 182 return ret; 183 } 184 } 185 186 if ((addr ^ state->i2c_write_address) & 0xffff) { 187 ret = s5c73m3_i2c_write(client, REG_CMDWR_ADDRL, addr & 0xffff); 188 if (ret < 0) { 189 state->i2c_write_address = 0; 190 return ret; 191 } 192 } 193 194 state->i2c_write_address = addr; 195 196 ret = s5c73m3_i2c_write(client, REG_CMDBUF_ADDR, data); 197 if (ret < 0) 198 return ret; 199 200 state->i2c_write_address += 2; 201 202 return ret; 203 } 204 205 int s5c73m3_read(struct s5c73m3 *state, u32 addr, u16 *data) 206 { 207 struct i2c_client *client = state->i2c_client; 208 int ret; 209 210 if ((addr ^ state->i2c_read_address) & 0xffff0000) { 211 ret = s5c73m3_i2c_write(client, REG_CMDRD_ADDRH, addr >> 16); 212 if (ret < 0) { 213 state->i2c_read_address = 0; 214 return ret; 215 } 216 } 217 218 if ((addr ^ state->i2c_read_address) & 0xffff) { 219 ret = s5c73m3_i2c_write(client, REG_CMDRD_ADDRL, addr & 0xffff); 220 if (ret < 0) { 221 state->i2c_read_address = 0; 222 return ret; 223 } 224 } 225 226 state->i2c_read_address = addr; 227 228 ret = s5c73m3_i2c_read(client, REG_CMDBUF_ADDR, data); 229 if (ret < 0) 230 return ret; 231 232 state->i2c_read_address += 2; 233 234 return ret; 235 } 236 237 static int s5c73m3_check_status(struct s5c73m3 *state, unsigned int value) 238 { 239 unsigned long start = jiffies; 240 unsigned long end = start + msecs_to_jiffies(2000); 241 int ret; 242 u16 status; 243 int count = 0; 244 245 do { 246 ret = s5c73m3_read(state, REG_STATUS, &status); 247 if (ret < 0 || status == value) 248 break; 249 usleep_range(500, 1000); 250 ++count; 251 } while (time_is_after_jiffies(end)); 252 253 if (count > 0) 254 v4l2_dbg(1, s5c73m3_dbg, &state->sensor_sd, 255 "status check took %dms\n", 256 jiffies_to_msecs(jiffies - start)); 257 258 if (ret == 0 && status != value) { 259 u16 i2c_status = 0; 260 u16 i2c_seq_status = 0; 261 262 s5c73m3_read(state, REG_I2C_STATUS, &i2c_status); 263 s5c73m3_read(state, REG_I2C_SEQ_STATUS, &i2c_seq_status); 264 265 v4l2_err(&state->sensor_sd, 266 "wrong status %#x, expected: %#x, i2c_status: %#x/%#x\n", 267 status, value, i2c_status, i2c_seq_status); 268 269 return -ETIMEDOUT; 270 } 271 272 return ret; 273 } 274 275 int s5c73m3_isp_command(struct s5c73m3 *state, u16 command, u16 data) 276 { 277 int ret; 278 279 ret = s5c73m3_check_status(state, REG_STATUS_ISP_COMMAND_COMPLETED); 280 if (ret < 0) 281 return ret; 282 283 ret = s5c73m3_write(state, 0x00095000, command); 284 if (ret < 0) 285 return ret; 286 287 ret = s5c73m3_write(state, 0x00095002, data); 288 if (ret < 0) 289 return ret; 290 291 return s5c73m3_write(state, REG_STATUS, 0x0001); 292 } 293 294 static int s5c73m3_isp_comm_result(struct s5c73m3 *state, u16 command, 295 u16 *data) 296 { 297 return s5c73m3_read(state, COMM_RESULT_OFFSET + command, data); 298 } 299 300 static int s5c73m3_set_af_softlanding(struct s5c73m3 *state) 301 { 302 unsigned long start = jiffies; 303 u16 af_softlanding; 304 int count = 0; 305 int ret; 306 const char *msg; 307 308 ret = s5c73m3_isp_command(state, COMM_AF_SOFTLANDING, 309 COMM_AF_SOFTLANDING_ON); 310 if (ret < 0) { 311 v4l2_info(&state->sensor_sd, "AF soft-landing failed\n"); 312 return ret; 313 } 314 315 for (;;) { 316 ret = s5c73m3_isp_comm_result(state, COMM_AF_SOFTLANDING, 317 &af_softlanding); 318 if (ret < 0) { 319 msg = "failed"; 320 break; 321 } 322 if (af_softlanding == COMM_AF_SOFTLANDING_RES_COMPLETE) { 323 msg = "succeeded"; 324 break; 325 } 326 if (++count > 100) { 327 ret = -ETIME; 328 msg = "timed out"; 329 break; 330 } 331 msleep(25); 332 } 333 334 v4l2_info(&state->sensor_sd, "AF soft-landing %s after %dms\n", 335 msg, jiffies_to_msecs(jiffies - start)); 336 337 return ret; 338 } 339 340 static int s5c73m3_load_fw(struct v4l2_subdev *sd) 341 { 342 struct s5c73m3 *state = sensor_sd_to_s5c73m3(sd); 343 struct i2c_client *client = state->i2c_client; 344 const struct firmware *fw; 345 int ret; 346 char fw_name[20]; 347 348 snprintf(fw_name, sizeof(fw_name), "SlimISP_%.2s.bin", 349 state->fw_file_version); 350 ret = request_firmware(&fw, fw_name, &client->dev); 351 if (ret < 0) { 352 v4l2_err(sd, "Firmware request failed (%s)\n", fw_name); 353 return -EINVAL; 354 } 355 356 v4l2_info(sd, "Loading firmware (%s, %zu B)\n", fw_name, fw->size); 357 358 ret = s5c73m3_spi_write(state, fw->data, fw->size, 64); 359 360 if (ret >= 0) 361 state->isp_ready = 1; 362 else 363 v4l2_err(sd, "SPI write failed\n"); 364 365 release_firmware(fw); 366 367 return ret; 368 } 369 370 static int s5c73m3_set_frame_size(struct s5c73m3 *state) 371 { 372 const struct s5c73m3_frame_size *prev_size = 373 state->sensor_pix_size[RES_ISP]; 374 const struct s5c73m3_frame_size *cap_size = 375 state->sensor_pix_size[RES_JPEG]; 376 unsigned int chg_mode; 377 378 v4l2_dbg(1, s5c73m3_dbg, &state->sensor_sd, 379 "Preview size: %dx%d, reg_val: 0x%x\n", 380 prev_size->width, prev_size->height, prev_size->reg_val); 381 382 chg_mode = prev_size->reg_val | COMM_CHG_MODE_NEW; 383 384 if (state->mbus_code == S5C73M3_JPEG_FMT) { 385 v4l2_dbg(1, s5c73m3_dbg, &state->sensor_sd, 386 "Capture size: %dx%d, reg_val: 0x%x\n", 387 cap_size->width, cap_size->height, cap_size->reg_val); 388 chg_mode |= cap_size->reg_val; 389 } 390 391 return s5c73m3_isp_command(state, COMM_CHG_MODE, chg_mode); 392 } 393 394 static int s5c73m3_set_frame_rate(struct s5c73m3 *state) 395 { 396 int ret; 397 398 if (state->ctrls.stabilization->val) 399 return 0; 400 401 if (WARN_ON(state->fiv == NULL)) 402 return -EINVAL; 403 404 ret = s5c73m3_isp_command(state, COMM_FRAME_RATE, state->fiv->fps_reg); 405 if (!ret) 406 state->apply_fiv = 0; 407 408 return ret; 409 } 410 411 static int __s5c73m3_s_stream(struct s5c73m3 *state, struct v4l2_subdev *sd, 412 int on) 413 { 414 u16 mode; 415 int ret; 416 417 if (on && state->apply_fmt) { 418 if (state->mbus_code == S5C73M3_JPEG_FMT) 419 mode = COMM_IMG_OUTPUT_INTERLEAVED; 420 else 421 mode = COMM_IMG_OUTPUT_YUV; 422 423 ret = s5c73m3_isp_command(state, COMM_IMG_OUTPUT, mode); 424 if (!ret) 425 ret = s5c73m3_set_frame_size(state); 426 if (ret) 427 return ret; 428 state->apply_fmt = 0; 429 } 430 431 ret = s5c73m3_isp_command(state, COMM_SENSOR_STREAMING, !!on); 432 if (ret) 433 return ret; 434 435 state->streaming = !!on; 436 437 if (!on) 438 return 0; 439 440 if (state->apply_fiv) { 441 ret = s5c73m3_set_frame_rate(state); 442 if (ret < 0) 443 v4l2_err(sd, "Error setting frame rate(%d)\n", ret); 444 } 445 446 return s5c73m3_check_status(state, REG_STATUS_ISP_COMMAND_COMPLETED); 447 } 448 449 static int s5c73m3_oif_s_stream(struct v4l2_subdev *sd, int on) 450 { 451 struct s5c73m3 *state = oif_sd_to_s5c73m3(sd); 452 int ret; 453 454 mutex_lock(&state->lock); 455 ret = __s5c73m3_s_stream(state, sd, on); 456 mutex_unlock(&state->lock); 457 458 return ret; 459 } 460 461 static int s5c73m3_system_status_wait(struct s5c73m3 *state, u32 value, 462 unsigned int delay, unsigned int steps) 463 { 464 u16 reg = 0; 465 466 while (steps-- > 0) { 467 int ret = s5c73m3_read(state, 0x30100010, ®); 468 if (ret < 0) 469 return ret; 470 if (reg == value) 471 return 0; 472 usleep_range(delay, delay + 25); 473 } 474 return -ETIMEDOUT; 475 } 476 477 static int s5c73m3_read_fw_version(struct s5c73m3 *state) 478 { 479 struct v4l2_subdev *sd = &state->sensor_sd; 480 int i, ret; 481 u16 data[2]; 482 int offset; 483 484 offset = state->isp_ready ? 0x60 : 0; 485 486 for (i = 0; i < S5C73M3_SENSOR_FW_LEN / 2; i++) { 487 ret = s5c73m3_read(state, offset + i * 2, data); 488 if (ret < 0) 489 return ret; 490 state->sensor_fw[i * 2] = (char)(*data & 0xff); 491 state->sensor_fw[i * 2 + 1] = (char)(*data >> 8); 492 } 493 state->sensor_fw[S5C73M3_SENSOR_FW_LEN] = '\0'; 494 495 496 for (i = 0; i < S5C73M3_SENSOR_TYPE_LEN / 2; i++) { 497 ret = s5c73m3_read(state, offset + 6 + i * 2, data); 498 if (ret < 0) 499 return ret; 500 state->sensor_type[i * 2] = (char)(*data & 0xff); 501 state->sensor_type[i * 2 + 1] = (char)(*data >> 8); 502 } 503 state->sensor_type[S5C73M3_SENSOR_TYPE_LEN] = '\0'; 504 505 ret = s5c73m3_read(state, offset + 0x14, data); 506 if (ret >= 0) { 507 ret = s5c73m3_read(state, offset + 0x16, data + 1); 508 if (ret >= 0) 509 state->fw_size = data[0] + (data[1] << 16); 510 } 511 512 v4l2_info(sd, "Sensor type: %s, FW version: %s\n", 513 state->sensor_type, state->sensor_fw); 514 return ret; 515 } 516 517 static int s5c73m3_fw_update_from(struct s5c73m3 *state) 518 { 519 struct v4l2_subdev *sd = &state->sensor_sd; 520 u16 status = COMM_FW_UPDATE_NOT_READY; 521 int ret; 522 int count = 0; 523 524 v4l2_warn(sd, "Updating F-ROM firmware.\n"); 525 do { 526 if (status == COMM_FW_UPDATE_NOT_READY) { 527 ret = s5c73m3_isp_command(state, COMM_FW_UPDATE, 0); 528 if (ret < 0) 529 return ret; 530 } 531 532 ret = s5c73m3_read(state, 0x00095906, &status); 533 if (ret < 0) 534 return ret; 535 switch (status) { 536 case COMM_FW_UPDATE_FAIL: 537 v4l2_warn(sd, "Updating F-ROM firmware failed.\n"); 538 return -EIO; 539 case COMM_FW_UPDATE_SUCCESS: 540 v4l2_warn(sd, "Updating F-ROM firmware finished.\n"); 541 return 0; 542 } 543 ++count; 544 msleep(20); 545 } while (count < 500); 546 547 v4l2_warn(sd, "Updating F-ROM firmware timed-out.\n"); 548 return -ETIMEDOUT; 549 } 550 551 static int s5c73m3_spi_boot(struct s5c73m3 *state, bool load_fw) 552 { 553 struct v4l2_subdev *sd = &state->sensor_sd; 554 int ret; 555 556 /* Run ARM MCU */ 557 ret = s5c73m3_write(state, 0x30000004, 0xffff); 558 if (ret < 0) 559 return ret; 560 561 usleep_range(400, 500); 562 563 /* Check booting status */ 564 ret = s5c73m3_system_status_wait(state, 0x0c, 100, 3); 565 if (ret < 0) { 566 v4l2_err(sd, "booting failed: %d\n", ret); 567 return ret; 568 } 569 570 /* P,M,S and Boot Mode */ 571 ret = s5c73m3_write(state, 0x30100014, 0x2146); 572 if (ret < 0) 573 return ret; 574 575 ret = s5c73m3_write(state, 0x30100010, 0x210c); 576 if (ret < 0) 577 return ret; 578 579 usleep_range(200, 250); 580 581 /* Check SPI status */ 582 ret = s5c73m3_system_status_wait(state, 0x210d, 100, 300); 583 if (ret < 0) 584 v4l2_err(sd, "SPI not ready: %d\n", ret); 585 586 /* Firmware download over SPI */ 587 if (load_fw) 588 s5c73m3_load_fw(sd); 589 590 /* MCU reset */ 591 ret = s5c73m3_write(state, 0x30000004, 0xfffd); 592 if (ret < 0) 593 return ret; 594 595 /* Remap */ 596 ret = s5c73m3_write(state, 0x301000a4, 0x0183); 597 if (ret < 0) 598 return ret; 599 600 /* MCU restart */ 601 ret = s5c73m3_write(state, 0x30000004, 0xffff); 602 if (ret < 0 || !load_fw) 603 return ret; 604 605 ret = s5c73m3_read_fw_version(state); 606 if (ret < 0) 607 return ret; 608 609 if (load_fw && update_fw) { 610 ret = s5c73m3_fw_update_from(state); 611 update_fw = 0; 612 } 613 614 return ret; 615 } 616 617 static int s5c73m3_set_timing_register_for_vdd(struct s5c73m3 *state) 618 { 619 static const u32 regs[][2] = { 620 { 0x30100018, 0x0618 }, 621 { 0x3010001c, 0x10c1 }, 622 { 0x30100020, 0x249e } 623 }; 624 int ret; 625 int i; 626 627 for (i = 0; i < ARRAY_SIZE(regs); i++) { 628 ret = s5c73m3_write(state, regs[i][0], regs[i][1]); 629 if (ret < 0) 630 return ret; 631 } 632 633 return 0; 634 } 635 636 static void s5c73m3_set_fw_file_version(struct s5c73m3 *state) 637 { 638 switch (state->sensor_fw[0]) { 639 case 'G': 640 case 'O': 641 state->fw_file_version[0] = 'G'; 642 break; 643 case 'S': 644 case 'Z': 645 state->fw_file_version[0] = 'Z'; 646 break; 647 } 648 649 switch (state->sensor_fw[1]) { 650 case 'C'...'F': 651 state->fw_file_version[1] = state->sensor_fw[1]; 652 break; 653 } 654 } 655 656 static int s5c73m3_get_fw_version(struct s5c73m3 *state) 657 { 658 struct v4l2_subdev *sd = &state->sensor_sd; 659 int ret; 660 661 /* Run ARM MCU */ 662 ret = s5c73m3_write(state, 0x30000004, 0xffff); 663 if (ret < 0) 664 return ret; 665 usleep_range(400, 500); 666 667 /* Check booting status */ 668 ret = s5c73m3_system_status_wait(state, 0x0c, 100, 3); 669 if (ret < 0) { 670 671 v4l2_err(sd, "%s: booting failed: %d\n", __func__, ret); 672 return ret; 673 } 674 675 /* Change I/O Driver Current in order to read from F-ROM */ 676 ret = s5c73m3_write(state, 0x30100120, 0x0820); 677 ret = s5c73m3_write(state, 0x30100124, 0x0820); 678 679 /* Offset Setting */ 680 ret = s5c73m3_write(state, 0x00010418, 0x0008); 681 682 /* P,M,S and Boot Mode */ 683 ret = s5c73m3_write(state, 0x30100014, 0x2146); 684 if (ret < 0) 685 return ret; 686 ret = s5c73m3_write(state, 0x30100010, 0x230c); 687 if (ret < 0) 688 return ret; 689 690 usleep_range(200, 250); 691 692 /* Check SPI status */ 693 ret = s5c73m3_system_status_wait(state, 0x230e, 100, 300); 694 if (ret < 0) 695 v4l2_err(sd, "SPI not ready: %d\n", ret); 696 697 /* ARM reset */ 698 ret = s5c73m3_write(state, 0x30000004, 0xfffd); 699 if (ret < 0) 700 return ret; 701 702 /* Remap */ 703 ret = s5c73m3_write(state, 0x301000a4, 0x0183); 704 if (ret < 0) 705 return ret; 706 707 s5c73m3_set_timing_register_for_vdd(state); 708 709 ret = s5c73m3_read_fw_version(state); 710 711 s5c73m3_set_fw_file_version(state); 712 713 return ret; 714 } 715 716 static int s5c73m3_rom_boot(struct s5c73m3 *state, bool load_fw) 717 { 718 static const u32 boot_regs[][2] = { 719 { 0x3100010c, 0x0044 }, 720 { 0x31000108, 0x000d }, 721 { 0x31000304, 0x0001 }, 722 { 0x00010000, 0x5800 }, 723 { 0x00010002, 0x0002 }, 724 { 0x31000000, 0x0001 }, 725 { 0x30100014, 0x1b85 }, 726 { 0x30100010, 0x230c } 727 }; 728 struct v4l2_subdev *sd = &state->sensor_sd; 729 int i, ret; 730 731 /* Run ARM MCU */ 732 ret = s5c73m3_write(state, 0x30000004, 0xffff); 733 if (ret < 0) 734 return ret; 735 usleep_range(400, 450); 736 737 /* Check booting status */ 738 ret = s5c73m3_system_status_wait(state, 0x0c, 100, 4); 739 if (ret < 0) { 740 v4l2_err(sd, "Booting failed: %d\n", ret); 741 return ret; 742 } 743 744 for (i = 0; i < ARRAY_SIZE(boot_regs); i++) { 745 ret = s5c73m3_write(state, boot_regs[i][0], boot_regs[i][1]); 746 if (ret < 0) 747 return ret; 748 } 749 msleep(200); 750 751 /* Check the binary read status */ 752 ret = s5c73m3_system_status_wait(state, 0x230e, 1000, 150); 753 if (ret < 0) { 754 v4l2_err(sd, "Binary read failed: %d\n", ret); 755 return ret; 756 } 757 758 /* ARM reset */ 759 ret = s5c73m3_write(state, 0x30000004, 0xfffd); 760 if (ret < 0) 761 return ret; 762 /* Remap */ 763 ret = s5c73m3_write(state, 0x301000a4, 0x0183); 764 if (ret < 0) 765 return ret; 766 /* MCU re-start */ 767 ret = s5c73m3_write(state, 0x30000004, 0xffff); 768 if (ret < 0) 769 return ret; 770 771 state->isp_ready = 1; 772 773 return s5c73m3_read_fw_version(state); 774 } 775 776 static int s5c73m3_isp_init(struct s5c73m3 *state) 777 { 778 int ret; 779 780 state->i2c_read_address = 0; 781 state->i2c_write_address = 0; 782 783 ret = s5c73m3_i2c_write(state->i2c_client, AHB_MSB_ADDR_PTR, 0x3310); 784 if (ret < 0) 785 return ret; 786 787 if (boot_from_rom) 788 return s5c73m3_rom_boot(state, true); 789 else 790 return s5c73m3_spi_boot(state, true); 791 } 792 793 static const struct s5c73m3_frame_size *s5c73m3_find_frame_size( 794 struct v4l2_mbus_framefmt *fmt, 795 enum s5c73m3_resolution_types idx) 796 { 797 const struct s5c73m3_frame_size *fs; 798 const struct s5c73m3_frame_size *best_fs; 799 int best_dist = INT_MAX; 800 int i; 801 802 fs = s5c73m3_resolutions[idx]; 803 best_fs = NULL; 804 for (i = 0; i < s5c73m3_resolutions_len[idx]; ++i) { 805 int dist = abs(fs->width - fmt->width) + 806 abs(fs->height - fmt->height); 807 if (dist < best_dist) { 808 best_dist = dist; 809 best_fs = fs; 810 } 811 ++fs; 812 } 813 814 return best_fs; 815 } 816 817 static void s5c73m3_oif_try_format(struct s5c73m3 *state, 818 struct v4l2_subdev_state *sd_state, 819 struct v4l2_subdev_format *fmt, 820 const struct s5c73m3_frame_size **fs) 821 { 822 struct v4l2_subdev *sd = &state->sensor_sd; 823 u32 code; 824 825 switch (fmt->pad) { 826 case OIF_ISP_PAD: 827 *fs = s5c73m3_find_frame_size(&fmt->format, RES_ISP); 828 code = S5C73M3_ISP_FMT; 829 break; 830 case OIF_JPEG_PAD: 831 *fs = s5c73m3_find_frame_size(&fmt->format, RES_JPEG); 832 code = S5C73M3_JPEG_FMT; 833 break; 834 case OIF_SOURCE_PAD: 835 default: 836 if (fmt->format.code == S5C73M3_JPEG_FMT) 837 code = S5C73M3_JPEG_FMT; 838 else 839 code = S5C73M3_ISP_FMT; 840 841 if (fmt->which == V4L2_SUBDEV_FORMAT_ACTIVE) 842 *fs = state->oif_pix_size[RES_ISP]; 843 else 844 *fs = s5c73m3_find_frame_size( 845 v4l2_subdev_get_try_format(sd, sd_state, 846 OIF_ISP_PAD), 847 RES_ISP); 848 break; 849 } 850 851 s5c73m3_fill_mbus_fmt(&fmt->format, *fs, code); 852 } 853 854 static void s5c73m3_try_format(struct s5c73m3 *state, 855 struct v4l2_subdev_state *sd_state, 856 struct v4l2_subdev_format *fmt, 857 const struct s5c73m3_frame_size **fs) 858 { 859 u32 code; 860 861 if (fmt->pad == S5C73M3_ISP_PAD) { 862 *fs = s5c73m3_find_frame_size(&fmt->format, RES_ISP); 863 code = S5C73M3_ISP_FMT; 864 } else { 865 *fs = s5c73m3_find_frame_size(&fmt->format, RES_JPEG); 866 code = S5C73M3_JPEG_FMT; 867 } 868 869 s5c73m3_fill_mbus_fmt(&fmt->format, *fs, code); 870 } 871 872 static int s5c73m3_oif_g_frame_interval(struct v4l2_subdev *sd, 873 struct v4l2_subdev_frame_interval *fi) 874 { 875 struct s5c73m3 *state = oif_sd_to_s5c73m3(sd); 876 877 if (fi->pad != OIF_SOURCE_PAD) 878 return -EINVAL; 879 880 mutex_lock(&state->lock); 881 fi->interval = state->fiv->interval; 882 mutex_unlock(&state->lock); 883 884 return 0; 885 } 886 887 static int __s5c73m3_set_frame_interval(struct s5c73m3 *state, 888 struct v4l2_subdev_frame_interval *fi) 889 { 890 const struct s5c73m3_frame_size *prev_size = 891 state->sensor_pix_size[RES_ISP]; 892 const struct s5c73m3_interval *fiv = &s5c73m3_intervals[0]; 893 unsigned int ret, min_err = UINT_MAX; 894 unsigned int i, fr_time; 895 896 if (fi->interval.denominator == 0) 897 return -EINVAL; 898 899 fr_time = fi->interval.numerator * 1000 / fi->interval.denominator; 900 901 for (i = 0; i < ARRAY_SIZE(s5c73m3_intervals); i++) { 902 const struct s5c73m3_interval *iv = &s5c73m3_intervals[i]; 903 904 if (prev_size->width > iv->size.width || 905 prev_size->height > iv->size.height) 906 continue; 907 908 ret = abs(iv->interval.numerator / 1000 - fr_time); 909 if (ret < min_err) { 910 fiv = iv; 911 min_err = ret; 912 } 913 } 914 state->fiv = fiv; 915 916 v4l2_dbg(1, s5c73m3_dbg, &state->sensor_sd, 917 "Changed frame interval to %u us\n", fiv->interval.numerator); 918 return 0; 919 } 920 921 static int s5c73m3_oif_s_frame_interval(struct v4l2_subdev *sd, 922 struct v4l2_subdev_frame_interval *fi) 923 { 924 struct s5c73m3 *state = oif_sd_to_s5c73m3(sd); 925 int ret; 926 927 if (fi->pad != OIF_SOURCE_PAD) 928 return -EINVAL; 929 930 v4l2_dbg(1, s5c73m3_dbg, sd, "Setting %d/%d frame interval\n", 931 fi->interval.numerator, fi->interval.denominator); 932 933 mutex_lock(&state->lock); 934 935 ret = __s5c73m3_set_frame_interval(state, fi); 936 if (!ret) { 937 if (state->streaming) 938 ret = s5c73m3_set_frame_rate(state); 939 else 940 state->apply_fiv = 1; 941 } 942 mutex_unlock(&state->lock); 943 return ret; 944 } 945 946 static int s5c73m3_oif_enum_frame_interval(struct v4l2_subdev *sd, 947 struct v4l2_subdev_state *sd_state, 948 struct v4l2_subdev_frame_interval_enum *fie) 949 { 950 struct s5c73m3 *state = oif_sd_to_s5c73m3(sd); 951 const struct s5c73m3_interval *fi; 952 int ret = 0; 953 954 if (fie->pad != OIF_SOURCE_PAD) 955 return -EINVAL; 956 if (fie->index >= ARRAY_SIZE(s5c73m3_intervals)) 957 return -EINVAL; 958 959 mutex_lock(&state->lock); 960 fi = &s5c73m3_intervals[fie->index]; 961 if (fie->width > fi->size.width || fie->height > fi->size.height) 962 ret = -EINVAL; 963 else 964 fie->interval = fi->interval; 965 mutex_unlock(&state->lock); 966 967 return ret; 968 } 969 970 static int s5c73m3_oif_get_pad_code(int pad, int index) 971 { 972 if (pad == OIF_SOURCE_PAD) { 973 if (index > 1) 974 return -EINVAL; 975 return (index == 0) ? S5C73M3_ISP_FMT : S5C73M3_JPEG_FMT; 976 } 977 978 if (index > 0) 979 return -EINVAL; 980 981 return (pad == OIF_ISP_PAD) ? S5C73M3_ISP_FMT : S5C73M3_JPEG_FMT; 982 } 983 984 static int s5c73m3_get_fmt(struct v4l2_subdev *sd, 985 struct v4l2_subdev_state *sd_state, 986 struct v4l2_subdev_format *fmt) 987 { 988 struct s5c73m3 *state = sensor_sd_to_s5c73m3(sd); 989 const struct s5c73m3_frame_size *fs; 990 u32 code; 991 992 if (fmt->which == V4L2_SUBDEV_FORMAT_TRY) { 993 fmt->format = *v4l2_subdev_get_try_format(sd, sd_state, 994 fmt->pad); 995 return 0; 996 } 997 998 mutex_lock(&state->lock); 999 1000 switch (fmt->pad) { 1001 case S5C73M3_ISP_PAD: 1002 code = S5C73M3_ISP_FMT; 1003 fs = state->sensor_pix_size[RES_ISP]; 1004 break; 1005 case S5C73M3_JPEG_PAD: 1006 code = S5C73M3_JPEG_FMT; 1007 fs = state->sensor_pix_size[RES_JPEG]; 1008 break; 1009 default: 1010 mutex_unlock(&state->lock); 1011 return -EINVAL; 1012 } 1013 s5c73m3_fill_mbus_fmt(&fmt->format, fs, code); 1014 1015 mutex_unlock(&state->lock); 1016 return 0; 1017 } 1018 1019 static int s5c73m3_oif_get_fmt(struct v4l2_subdev *sd, 1020 struct v4l2_subdev_state *sd_state, 1021 struct v4l2_subdev_format *fmt) 1022 { 1023 struct s5c73m3 *state = oif_sd_to_s5c73m3(sd); 1024 const struct s5c73m3_frame_size *fs; 1025 u32 code; 1026 1027 if (fmt->which == V4L2_SUBDEV_FORMAT_TRY) { 1028 fmt->format = *v4l2_subdev_get_try_format(sd, sd_state, 1029 fmt->pad); 1030 return 0; 1031 } 1032 1033 mutex_lock(&state->lock); 1034 1035 switch (fmt->pad) { 1036 case OIF_ISP_PAD: 1037 code = S5C73M3_ISP_FMT; 1038 fs = state->oif_pix_size[RES_ISP]; 1039 break; 1040 case OIF_JPEG_PAD: 1041 code = S5C73M3_JPEG_FMT; 1042 fs = state->oif_pix_size[RES_JPEG]; 1043 break; 1044 case OIF_SOURCE_PAD: 1045 code = state->mbus_code; 1046 fs = state->oif_pix_size[RES_ISP]; 1047 break; 1048 default: 1049 mutex_unlock(&state->lock); 1050 return -EINVAL; 1051 } 1052 s5c73m3_fill_mbus_fmt(&fmt->format, fs, code); 1053 1054 mutex_unlock(&state->lock); 1055 return 0; 1056 } 1057 1058 static int s5c73m3_set_fmt(struct v4l2_subdev *sd, 1059 struct v4l2_subdev_state *sd_state, 1060 struct v4l2_subdev_format *fmt) 1061 { 1062 const struct s5c73m3_frame_size *frame_size = NULL; 1063 struct s5c73m3 *state = sensor_sd_to_s5c73m3(sd); 1064 struct v4l2_mbus_framefmt *mf; 1065 int ret = 0; 1066 1067 mutex_lock(&state->lock); 1068 1069 s5c73m3_try_format(state, sd_state, fmt, &frame_size); 1070 1071 if (fmt->which == V4L2_SUBDEV_FORMAT_TRY) { 1072 mf = v4l2_subdev_get_try_format(sd, sd_state, fmt->pad); 1073 *mf = fmt->format; 1074 } else { 1075 switch (fmt->pad) { 1076 case S5C73M3_ISP_PAD: 1077 state->sensor_pix_size[RES_ISP] = frame_size; 1078 break; 1079 case S5C73M3_JPEG_PAD: 1080 state->sensor_pix_size[RES_JPEG] = frame_size; 1081 break; 1082 default: 1083 ret = -EBUSY; 1084 } 1085 1086 if (state->streaming) 1087 ret = -EBUSY; 1088 else 1089 state->apply_fmt = 1; 1090 } 1091 1092 mutex_unlock(&state->lock); 1093 1094 return ret; 1095 } 1096 1097 static int s5c73m3_oif_set_fmt(struct v4l2_subdev *sd, 1098 struct v4l2_subdev_state *sd_state, 1099 struct v4l2_subdev_format *fmt) 1100 { 1101 const struct s5c73m3_frame_size *frame_size = NULL; 1102 struct s5c73m3 *state = oif_sd_to_s5c73m3(sd); 1103 struct v4l2_mbus_framefmt *mf; 1104 int ret = 0; 1105 1106 mutex_lock(&state->lock); 1107 1108 s5c73m3_oif_try_format(state, sd_state, fmt, &frame_size); 1109 1110 if (fmt->which == V4L2_SUBDEV_FORMAT_TRY) { 1111 mf = v4l2_subdev_get_try_format(sd, sd_state, fmt->pad); 1112 *mf = fmt->format; 1113 if (fmt->pad == OIF_ISP_PAD) { 1114 mf = v4l2_subdev_get_try_format(sd, sd_state, 1115 OIF_SOURCE_PAD); 1116 mf->width = fmt->format.width; 1117 mf->height = fmt->format.height; 1118 } 1119 } else { 1120 switch (fmt->pad) { 1121 case OIF_ISP_PAD: 1122 state->oif_pix_size[RES_ISP] = frame_size; 1123 break; 1124 case OIF_JPEG_PAD: 1125 state->oif_pix_size[RES_JPEG] = frame_size; 1126 break; 1127 case OIF_SOURCE_PAD: 1128 state->mbus_code = fmt->format.code; 1129 break; 1130 default: 1131 ret = -EBUSY; 1132 } 1133 1134 if (state->streaming) 1135 ret = -EBUSY; 1136 else 1137 state->apply_fmt = 1; 1138 } 1139 1140 mutex_unlock(&state->lock); 1141 1142 return ret; 1143 } 1144 1145 static int s5c73m3_oif_get_frame_desc(struct v4l2_subdev *sd, unsigned int pad, 1146 struct v4l2_mbus_frame_desc *fd) 1147 { 1148 struct s5c73m3 *state = oif_sd_to_s5c73m3(sd); 1149 int i; 1150 1151 if (pad != OIF_SOURCE_PAD || fd == NULL) 1152 return -EINVAL; 1153 1154 mutex_lock(&state->lock); 1155 fd->num_entries = 2; 1156 for (i = 0; i < fd->num_entries; i++) 1157 fd->entry[i] = state->frame_desc.entry[i]; 1158 mutex_unlock(&state->lock); 1159 1160 return 0; 1161 } 1162 1163 static int s5c73m3_oif_set_frame_desc(struct v4l2_subdev *sd, unsigned int pad, 1164 struct v4l2_mbus_frame_desc *fd) 1165 { 1166 struct s5c73m3 *state = oif_sd_to_s5c73m3(sd); 1167 struct v4l2_mbus_frame_desc *frame_desc = &state->frame_desc; 1168 int i; 1169 1170 if (pad != OIF_SOURCE_PAD || fd == NULL) 1171 return -EINVAL; 1172 1173 fd->entry[0].length = 10 * SZ_1M; 1174 fd->entry[1].length = max_t(u32, fd->entry[1].length, 1175 S5C73M3_EMBEDDED_DATA_MAXLEN); 1176 fd->num_entries = 2; 1177 1178 mutex_lock(&state->lock); 1179 for (i = 0; i < fd->num_entries; i++) 1180 frame_desc->entry[i] = fd->entry[i]; 1181 mutex_unlock(&state->lock); 1182 1183 return 0; 1184 } 1185 1186 static int s5c73m3_enum_mbus_code(struct v4l2_subdev *sd, 1187 struct v4l2_subdev_state *sd_state, 1188 struct v4l2_subdev_mbus_code_enum *code) 1189 { 1190 static const int codes[] = { 1191 [S5C73M3_ISP_PAD] = S5C73M3_ISP_FMT, 1192 [S5C73M3_JPEG_PAD] = S5C73M3_JPEG_FMT}; 1193 1194 if (code->index > 0 || code->pad >= S5C73M3_NUM_PADS) 1195 return -EINVAL; 1196 1197 code->code = codes[code->pad]; 1198 1199 return 0; 1200 } 1201 1202 static int s5c73m3_oif_enum_mbus_code(struct v4l2_subdev *sd, 1203 struct v4l2_subdev_state *sd_state, 1204 struct v4l2_subdev_mbus_code_enum *code) 1205 { 1206 int ret; 1207 1208 ret = s5c73m3_oif_get_pad_code(code->pad, code->index); 1209 if (ret < 0) 1210 return ret; 1211 1212 code->code = ret; 1213 1214 return 0; 1215 } 1216 1217 static int s5c73m3_enum_frame_size(struct v4l2_subdev *sd, 1218 struct v4l2_subdev_state *sd_state, 1219 struct v4l2_subdev_frame_size_enum *fse) 1220 { 1221 int idx; 1222 1223 if (fse->pad == S5C73M3_ISP_PAD) { 1224 if (fse->code != S5C73M3_ISP_FMT) 1225 return -EINVAL; 1226 idx = RES_ISP; 1227 } else{ 1228 if (fse->code != S5C73M3_JPEG_FMT) 1229 return -EINVAL; 1230 idx = RES_JPEG; 1231 } 1232 1233 if (fse->index >= s5c73m3_resolutions_len[idx]) 1234 return -EINVAL; 1235 1236 fse->min_width = s5c73m3_resolutions[idx][fse->index].width; 1237 fse->max_width = fse->min_width; 1238 fse->max_height = s5c73m3_resolutions[idx][fse->index].height; 1239 fse->min_height = fse->max_height; 1240 1241 return 0; 1242 } 1243 1244 static int s5c73m3_oif_enum_frame_size(struct v4l2_subdev *sd, 1245 struct v4l2_subdev_state *sd_state, 1246 struct v4l2_subdev_frame_size_enum *fse) 1247 { 1248 struct s5c73m3 *state = oif_sd_to_s5c73m3(sd); 1249 int idx; 1250 1251 if (fse->pad == OIF_SOURCE_PAD) { 1252 if (fse->index > 0) 1253 return -EINVAL; 1254 1255 switch (fse->code) { 1256 case S5C73M3_JPEG_FMT: 1257 case S5C73M3_ISP_FMT: { 1258 unsigned w, h; 1259 1260 if (fse->which == V4L2_SUBDEV_FORMAT_TRY) { 1261 struct v4l2_mbus_framefmt *mf; 1262 1263 mf = v4l2_subdev_get_try_format(sd, sd_state, 1264 OIF_ISP_PAD); 1265 1266 w = mf->width; 1267 h = mf->height; 1268 } else { 1269 const struct s5c73m3_frame_size *fs; 1270 1271 fs = state->oif_pix_size[RES_ISP]; 1272 w = fs->width; 1273 h = fs->height; 1274 } 1275 fse->max_width = fse->min_width = w; 1276 fse->max_height = fse->min_height = h; 1277 return 0; 1278 } 1279 default: 1280 return -EINVAL; 1281 } 1282 } 1283 1284 if (fse->code != s5c73m3_oif_get_pad_code(fse->pad, 0)) 1285 return -EINVAL; 1286 1287 if (fse->pad == OIF_JPEG_PAD) 1288 idx = RES_JPEG; 1289 else 1290 idx = RES_ISP; 1291 1292 if (fse->index >= s5c73m3_resolutions_len[idx]) 1293 return -EINVAL; 1294 1295 fse->min_width = s5c73m3_resolutions[idx][fse->index].width; 1296 fse->max_width = fse->min_width; 1297 fse->max_height = s5c73m3_resolutions[idx][fse->index].height; 1298 fse->min_height = fse->max_height; 1299 1300 return 0; 1301 } 1302 1303 static int s5c73m3_oif_log_status(struct v4l2_subdev *sd) 1304 { 1305 struct s5c73m3 *state = oif_sd_to_s5c73m3(sd); 1306 1307 v4l2_ctrl_handler_log_status(sd->ctrl_handler, sd->name); 1308 1309 v4l2_info(sd, "power: %d, apply_fmt: %d\n", state->power, 1310 state->apply_fmt); 1311 1312 return 0; 1313 } 1314 1315 static int s5c73m3_open(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh) 1316 { 1317 struct v4l2_mbus_framefmt *mf; 1318 1319 mf = v4l2_subdev_get_try_format(sd, fh->state, S5C73M3_ISP_PAD); 1320 s5c73m3_fill_mbus_fmt(mf, &s5c73m3_isp_resolutions[1], 1321 S5C73M3_ISP_FMT); 1322 1323 mf = v4l2_subdev_get_try_format(sd, fh->state, S5C73M3_JPEG_PAD); 1324 s5c73m3_fill_mbus_fmt(mf, &s5c73m3_jpeg_resolutions[1], 1325 S5C73M3_JPEG_FMT); 1326 1327 return 0; 1328 } 1329 1330 static int s5c73m3_oif_open(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh) 1331 { 1332 struct v4l2_mbus_framefmt *mf; 1333 1334 mf = v4l2_subdev_get_try_format(sd, fh->state, OIF_ISP_PAD); 1335 s5c73m3_fill_mbus_fmt(mf, &s5c73m3_isp_resolutions[1], 1336 S5C73M3_ISP_FMT); 1337 1338 mf = v4l2_subdev_get_try_format(sd, fh->state, OIF_JPEG_PAD); 1339 s5c73m3_fill_mbus_fmt(mf, &s5c73m3_jpeg_resolutions[1], 1340 S5C73M3_JPEG_FMT); 1341 1342 mf = v4l2_subdev_get_try_format(sd, fh->state, OIF_SOURCE_PAD); 1343 s5c73m3_fill_mbus_fmt(mf, &s5c73m3_isp_resolutions[1], 1344 S5C73M3_ISP_FMT); 1345 return 0; 1346 } 1347 1348 static int __s5c73m3_power_on(struct s5c73m3 *state) 1349 { 1350 int i, ret; 1351 1352 for (i = 0; i < S5C73M3_MAX_SUPPLIES; i++) { 1353 ret = regulator_enable(state->supplies[i].consumer); 1354 if (ret) 1355 goto err_reg_dis; 1356 } 1357 1358 ret = clk_set_rate(state->clock, state->mclk_frequency); 1359 if (ret < 0) 1360 goto err_reg_dis; 1361 1362 ret = clk_prepare_enable(state->clock); 1363 if (ret < 0) 1364 goto err_reg_dis; 1365 1366 v4l2_dbg(1, s5c73m3_dbg, &state->oif_sd, "clock frequency: %ld\n", 1367 clk_get_rate(state->clock)); 1368 1369 gpiod_set_value(state->stby, 0); 1370 usleep_range(100, 200); 1371 gpiod_set_value(state->reset, 0); 1372 usleep_range(50, 100); 1373 1374 return 0; 1375 1376 err_reg_dis: 1377 for (--i; i >= 0; i--) 1378 regulator_disable(state->supplies[i].consumer); 1379 return ret; 1380 } 1381 1382 static int __s5c73m3_power_off(struct s5c73m3 *state) 1383 { 1384 int i, ret; 1385 1386 gpiod_set_value(state->reset, 1); 1387 usleep_range(10, 50); 1388 gpiod_set_value(state->stby, 1); 1389 usleep_range(100, 200); 1390 1391 clk_disable_unprepare(state->clock); 1392 1393 state->streaming = 0; 1394 state->isp_ready = 0; 1395 1396 for (i = S5C73M3_MAX_SUPPLIES - 1; i >= 0; i--) { 1397 ret = regulator_disable(state->supplies[i].consumer); 1398 if (ret) 1399 goto err; 1400 } 1401 1402 return 0; 1403 err: 1404 for (++i; i < S5C73M3_MAX_SUPPLIES; i++) { 1405 int r = regulator_enable(state->supplies[i].consumer); 1406 if (r < 0) 1407 v4l2_err(&state->oif_sd, "Failed to re-enable %s: %d\n", 1408 state->supplies[i].supply, r); 1409 } 1410 1411 clk_prepare_enable(state->clock); 1412 return ret; 1413 } 1414 1415 static int s5c73m3_oif_set_power(struct v4l2_subdev *sd, int on) 1416 { 1417 struct s5c73m3 *state = oif_sd_to_s5c73m3(sd); 1418 int ret = 0; 1419 1420 mutex_lock(&state->lock); 1421 1422 if (on && !state->power) { 1423 ret = __s5c73m3_power_on(state); 1424 if (!ret) 1425 ret = s5c73m3_isp_init(state); 1426 if (!ret) { 1427 state->apply_fiv = 1; 1428 state->apply_fmt = 1; 1429 } 1430 } else if (state->power == !on) { 1431 ret = s5c73m3_set_af_softlanding(state); 1432 if (!ret) 1433 ret = __s5c73m3_power_off(state); 1434 else 1435 v4l2_err(sd, "Soft landing lens failed\n"); 1436 } 1437 if (!ret) 1438 state->power += on ? 1 : -1; 1439 1440 v4l2_dbg(1, s5c73m3_dbg, sd, "%s: power: %d\n", 1441 __func__, state->power); 1442 1443 mutex_unlock(&state->lock); 1444 return ret; 1445 } 1446 1447 static int s5c73m3_oif_registered(struct v4l2_subdev *sd) 1448 { 1449 struct s5c73m3 *state = oif_sd_to_s5c73m3(sd); 1450 int ret; 1451 1452 ret = v4l2_device_register_subdev(sd->v4l2_dev, &state->sensor_sd); 1453 if (ret) { 1454 v4l2_err(sd->v4l2_dev, "Failed to register %s\n", 1455 state->oif_sd.name); 1456 return ret; 1457 } 1458 1459 ret = media_create_pad_link(&state->sensor_sd.entity, 1460 S5C73M3_ISP_PAD, &state->oif_sd.entity, OIF_ISP_PAD, 1461 MEDIA_LNK_FL_IMMUTABLE | MEDIA_LNK_FL_ENABLED); 1462 1463 ret = media_create_pad_link(&state->sensor_sd.entity, 1464 S5C73M3_JPEG_PAD, &state->oif_sd.entity, OIF_JPEG_PAD, 1465 MEDIA_LNK_FL_IMMUTABLE | MEDIA_LNK_FL_ENABLED); 1466 1467 return ret; 1468 } 1469 1470 static void s5c73m3_oif_unregistered(struct v4l2_subdev *sd) 1471 { 1472 struct s5c73m3 *state = oif_sd_to_s5c73m3(sd); 1473 v4l2_device_unregister_subdev(&state->sensor_sd); 1474 } 1475 1476 static const struct v4l2_subdev_internal_ops s5c73m3_internal_ops = { 1477 .open = s5c73m3_open, 1478 }; 1479 1480 static const struct v4l2_subdev_pad_ops s5c73m3_pad_ops = { 1481 .enum_mbus_code = s5c73m3_enum_mbus_code, 1482 .enum_frame_size = s5c73m3_enum_frame_size, 1483 .get_fmt = s5c73m3_get_fmt, 1484 .set_fmt = s5c73m3_set_fmt, 1485 }; 1486 1487 static const struct v4l2_subdev_ops s5c73m3_subdev_ops = { 1488 .pad = &s5c73m3_pad_ops, 1489 }; 1490 1491 static const struct v4l2_subdev_internal_ops oif_internal_ops = { 1492 .registered = s5c73m3_oif_registered, 1493 .unregistered = s5c73m3_oif_unregistered, 1494 .open = s5c73m3_oif_open, 1495 }; 1496 1497 static const struct v4l2_subdev_pad_ops s5c73m3_oif_pad_ops = { 1498 .enum_mbus_code = s5c73m3_oif_enum_mbus_code, 1499 .enum_frame_size = s5c73m3_oif_enum_frame_size, 1500 .enum_frame_interval = s5c73m3_oif_enum_frame_interval, 1501 .get_fmt = s5c73m3_oif_get_fmt, 1502 .set_fmt = s5c73m3_oif_set_fmt, 1503 .get_frame_desc = s5c73m3_oif_get_frame_desc, 1504 .set_frame_desc = s5c73m3_oif_set_frame_desc, 1505 }; 1506 1507 static const struct v4l2_subdev_core_ops s5c73m3_oif_core_ops = { 1508 .s_power = s5c73m3_oif_set_power, 1509 .log_status = s5c73m3_oif_log_status, 1510 }; 1511 1512 static const struct v4l2_subdev_video_ops s5c73m3_oif_video_ops = { 1513 .s_stream = s5c73m3_oif_s_stream, 1514 .g_frame_interval = s5c73m3_oif_g_frame_interval, 1515 .s_frame_interval = s5c73m3_oif_s_frame_interval, 1516 }; 1517 1518 static const struct v4l2_subdev_ops oif_subdev_ops = { 1519 .core = &s5c73m3_oif_core_ops, 1520 .pad = &s5c73m3_oif_pad_ops, 1521 .video = &s5c73m3_oif_video_ops, 1522 }; 1523 1524 static int s5c73m3_get_dt_data(struct s5c73m3 *state) 1525 { 1526 struct device *dev = &state->i2c_client->dev; 1527 struct device_node *node = dev->of_node; 1528 struct device_node *node_ep; 1529 struct v4l2_fwnode_endpoint ep = { .bus_type = 0 }; 1530 int ret; 1531 1532 if (!node) 1533 return -EINVAL; 1534 1535 state->clock = devm_clk_get(dev, S5C73M3_CLK_NAME); 1536 if (IS_ERR(state->clock)) 1537 return PTR_ERR(state->clock); 1538 1539 if (of_property_read_u32(node, "clock-frequency", 1540 &state->mclk_frequency)) { 1541 state->mclk_frequency = S5C73M3_DEFAULT_MCLK_FREQ; 1542 dev_info(dev, "using default %u Hz clock frequency\n", 1543 state->mclk_frequency); 1544 } 1545 1546 /* Request GPIO lines asserted */ 1547 state->stby = devm_gpiod_get(dev, "standby", GPIOD_OUT_HIGH); 1548 if (IS_ERR(state->stby)) 1549 return dev_err_probe(dev, PTR_ERR(state->stby), 1550 "failed to request gpio S5C73M3_STBY\n"); 1551 gpiod_set_consumer_name(state->stby, "S5C73M3_STBY"); 1552 state->reset = devm_gpiod_get(dev, "xshutdown", GPIOD_OUT_HIGH); 1553 if (IS_ERR(state->reset)) 1554 return dev_err_probe(dev, PTR_ERR(state->reset), 1555 "failed to request gpio S5C73M3_RST\n"); 1556 gpiod_set_consumer_name(state->reset, "S5C73M3_RST"); 1557 1558 node_ep = of_graph_get_next_endpoint(node, NULL); 1559 if (!node_ep) { 1560 dev_warn(dev, "no endpoint defined for node: %pOF\n", node); 1561 return 0; 1562 } 1563 1564 ret = v4l2_fwnode_endpoint_parse(of_fwnode_handle(node_ep), &ep); 1565 of_node_put(node_ep); 1566 if (ret) 1567 return ret; 1568 1569 if (ep.bus_type != V4L2_MBUS_CSI2_DPHY) { 1570 dev_err(dev, "unsupported bus type\n"); 1571 return -EINVAL; 1572 } 1573 /* 1574 * Number of MIPI CSI-2 data lanes is currently not configurable, 1575 * always a default value of 4 lanes is used. 1576 */ 1577 if (ep.bus.mipi_csi2.num_data_lanes != S5C73M3_MIPI_DATA_LANES) 1578 dev_info(dev, "falling back to 4 MIPI CSI-2 data lanes\n"); 1579 1580 return 0; 1581 } 1582 1583 static int s5c73m3_probe(struct i2c_client *client) 1584 { 1585 struct device *dev = &client->dev; 1586 struct v4l2_subdev *sd; 1587 struct v4l2_subdev *oif_sd; 1588 struct s5c73m3 *state; 1589 int ret, i; 1590 1591 state = devm_kzalloc(dev, sizeof(*state), GFP_KERNEL); 1592 if (!state) 1593 return -ENOMEM; 1594 1595 state->i2c_client = client; 1596 ret = s5c73m3_get_dt_data(state); 1597 if (ret < 0) 1598 return ret; 1599 1600 mutex_init(&state->lock); 1601 sd = &state->sensor_sd; 1602 oif_sd = &state->oif_sd; 1603 1604 v4l2_subdev_init(sd, &s5c73m3_subdev_ops); 1605 sd->owner = client->dev.driver->owner; 1606 v4l2_set_subdevdata(sd, state); 1607 strscpy(sd->name, "S5C73M3", sizeof(sd->name)); 1608 1609 sd->internal_ops = &s5c73m3_internal_ops; 1610 sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE; 1611 1612 state->sensor_pads[S5C73M3_JPEG_PAD].flags = MEDIA_PAD_FL_SOURCE; 1613 state->sensor_pads[S5C73M3_ISP_PAD].flags = MEDIA_PAD_FL_SOURCE; 1614 sd->entity.function = MEDIA_ENT_F_CAM_SENSOR; 1615 1616 ret = media_entity_pads_init(&sd->entity, S5C73M3_NUM_PADS, 1617 state->sensor_pads); 1618 if (ret < 0) 1619 return ret; 1620 1621 v4l2_i2c_subdev_init(oif_sd, client, &oif_subdev_ops); 1622 /* Static name; NEVER use in new drivers! */ 1623 strscpy(oif_sd->name, "S5C73M3-OIF", sizeof(oif_sd->name)); 1624 1625 oif_sd->internal_ops = &oif_internal_ops; 1626 oif_sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE; 1627 1628 state->oif_pads[OIF_ISP_PAD].flags = MEDIA_PAD_FL_SINK; 1629 state->oif_pads[OIF_JPEG_PAD].flags = MEDIA_PAD_FL_SINK; 1630 state->oif_pads[OIF_SOURCE_PAD].flags = MEDIA_PAD_FL_SOURCE; 1631 oif_sd->entity.function = MEDIA_ENT_F_PROC_VIDEO_SCALER; 1632 1633 ret = media_entity_pads_init(&oif_sd->entity, OIF_NUM_PADS, 1634 state->oif_pads); 1635 if (ret < 0) 1636 return ret; 1637 1638 for (i = 0; i < S5C73M3_MAX_SUPPLIES; i++) 1639 state->supplies[i].supply = s5c73m3_supply_names[i]; 1640 1641 ret = devm_regulator_bulk_get(dev, S5C73M3_MAX_SUPPLIES, 1642 state->supplies); 1643 if (ret) { 1644 dev_err(dev, "failed to get regulators\n"); 1645 goto out_err; 1646 } 1647 1648 ret = s5c73m3_init_controls(state); 1649 if (ret) 1650 goto out_err; 1651 1652 state->sensor_pix_size[RES_ISP] = &s5c73m3_isp_resolutions[1]; 1653 state->sensor_pix_size[RES_JPEG] = &s5c73m3_jpeg_resolutions[1]; 1654 state->oif_pix_size[RES_ISP] = state->sensor_pix_size[RES_ISP]; 1655 state->oif_pix_size[RES_JPEG] = state->sensor_pix_size[RES_JPEG]; 1656 1657 state->mbus_code = S5C73M3_ISP_FMT; 1658 1659 state->fiv = &s5c73m3_intervals[S5C73M3_DEFAULT_FRAME_INTERVAL]; 1660 1661 state->fw_file_version[0] = 'G'; 1662 state->fw_file_version[1] = 'C'; 1663 1664 ret = s5c73m3_register_spi_driver(state); 1665 if (ret < 0) 1666 goto out_err; 1667 1668 oif_sd->dev = dev; 1669 1670 ret = __s5c73m3_power_on(state); 1671 if (ret < 0) 1672 goto out_err1; 1673 1674 ret = s5c73m3_get_fw_version(state); 1675 __s5c73m3_power_off(state); 1676 1677 if (ret < 0) { 1678 dev_err(dev, "Device detection failed: %d\n", ret); 1679 goto out_err1; 1680 } 1681 1682 ret = v4l2_async_register_subdev(oif_sd); 1683 if (ret < 0) 1684 goto out_err1; 1685 1686 v4l2_info(sd, "%s: completed successfully\n", __func__); 1687 return 0; 1688 1689 out_err1: 1690 s5c73m3_unregister_spi_driver(state); 1691 out_err: 1692 media_entity_cleanup(&sd->entity); 1693 return ret; 1694 } 1695 1696 static void s5c73m3_remove(struct i2c_client *client) 1697 { 1698 struct v4l2_subdev *oif_sd = i2c_get_clientdata(client); 1699 struct s5c73m3 *state = oif_sd_to_s5c73m3(oif_sd); 1700 struct v4l2_subdev *sensor_sd = &state->sensor_sd; 1701 1702 v4l2_async_unregister_subdev(oif_sd); 1703 1704 v4l2_ctrl_handler_free(oif_sd->ctrl_handler); 1705 media_entity_cleanup(&oif_sd->entity); 1706 1707 v4l2_device_unregister_subdev(sensor_sd); 1708 media_entity_cleanup(&sensor_sd->entity); 1709 1710 s5c73m3_unregister_spi_driver(state); 1711 } 1712 1713 static const struct i2c_device_id s5c73m3_id[] = { 1714 { DRIVER_NAME, 0 }, 1715 { } 1716 }; 1717 MODULE_DEVICE_TABLE(i2c, s5c73m3_id); 1718 1719 #ifdef CONFIG_OF 1720 static const struct of_device_id s5c73m3_of_match[] = { 1721 { .compatible = "samsung,s5c73m3" }, 1722 { } 1723 }; 1724 MODULE_DEVICE_TABLE(of, s5c73m3_of_match); 1725 #endif 1726 1727 static struct i2c_driver s5c73m3_i2c_driver = { 1728 .driver = { 1729 .of_match_table = of_match_ptr(s5c73m3_of_match), 1730 .name = DRIVER_NAME, 1731 }, 1732 .probe = s5c73m3_probe, 1733 .remove = s5c73m3_remove, 1734 .id_table = s5c73m3_id, 1735 }; 1736 1737 module_i2c_driver(s5c73m3_i2c_driver); 1738 1739 MODULE_DESCRIPTION("Samsung S5C73M3 camera driver"); 1740 MODULE_AUTHOR("Sylwester Nawrocki <s.nawrocki@samsung.com>"); 1741 MODULE_LICENSE("GPL"); 1742