1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * Support for GalaxyCore GC0310 VGA camera sensor. 4 * 5 * Copyright (c) 2013 Intel Corporation. All Rights Reserved. 6 * 7 * This program is free software; you can redistribute it and/or 8 * modify it under the terms of the GNU General Public License version 9 * 2 as published by the Free Software Foundation. 10 * 11 * This program is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 * GNU General Public License for more details. 15 * 16 */ 17 18 #include <linux/module.h> 19 #include <linux/types.h> 20 #include <linux/kernel.h> 21 #include <linux/mm.h> 22 #include <linux/string.h> 23 #include <linux/errno.h> 24 #include <linux/init.h> 25 #include <linux/kmod.h> 26 #include <linux/device.h> 27 #include <linux/delay.h> 28 #include <linux/slab.h> 29 #include <linux/i2c.h> 30 #include <linux/moduleparam.h> 31 #include <media/v4l2-device.h> 32 #include <linux/io.h> 33 #include "../include/linux/atomisp_gmin_platform.h" 34 35 #include "gc0310.h" 36 37 /* i2c read/write stuff */ 38 static int gc0310_read_reg(struct i2c_client *client, 39 u16 data_length, u8 reg, u8 *val) 40 { 41 int err; 42 struct i2c_msg msg[2]; 43 unsigned char data[1]; 44 45 if (!client->adapter) { 46 dev_err(&client->dev, "%s error, no client->adapter\n", 47 __func__); 48 return -ENODEV; 49 } 50 51 if (data_length != GC0310_8BIT) { 52 dev_err(&client->dev, "%s error, invalid data length\n", 53 __func__); 54 return -EINVAL; 55 } 56 57 memset(msg, 0, sizeof(msg)); 58 59 msg[0].addr = client->addr; 60 msg[0].flags = 0; 61 msg[0].len = I2C_MSG_LENGTH; 62 msg[0].buf = data; 63 64 /* high byte goes out first */ 65 data[0] = (u8)(reg & 0xff); 66 67 msg[1].addr = client->addr; 68 msg[1].len = data_length; 69 msg[1].flags = I2C_M_RD; 70 msg[1].buf = data; 71 72 err = i2c_transfer(client->adapter, msg, 2); 73 if (err != 2) { 74 if (err >= 0) 75 err = -EIO; 76 dev_err(&client->dev, 77 "read from offset 0x%x error %d", reg, err); 78 return err; 79 } 80 81 *val = 0; 82 /* high byte comes first */ 83 if (data_length == GC0310_8BIT) 84 *val = (u8)data[0]; 85 86 return 0; 87 } 88 89 static int gc0310_i2c_write(struct i2c_client *client, u16 len, u8 *data) 90 { 91 struct i2c_msg msg; 92 const int num_msg = 1; 93 int ret; 94 95 msg.addr = client->addr; 96 msg.flags = 0; 97 msg.len = len; 98 msg.buf = data; 99 ret = i2c_transfer(client->adapter, &msg, 1); 100 101 return ret == num_msg ? 0 : -EIO; 102 } 103 104 static int gc0310_write_reg(struct i2c_client *client, u16 data_length, 105 u8 reg, u8 val) 106 { 107 int ret; 108 unsigned char data[2] = {0}; 109 u8 *wreg = (u8 *)data; 110 const u16 len = data_length + sizeof(u8); /* 8-bit address + data */ 111 112 if (data_length != GC0310_8BIT) { 113 dev_err(&client->dev, 114 "%s error, invalid data_length\n", __func__); 115 return -EINVAL; 116 } 117 118 /* high byte goes out first */ 119 *wreg = (u8)(reg & 0xff); 120 121 if (data_length == GC0310_8BIT) 122 data[1] = (u8)(val); 123 124 ret = gc0310_i2c_write(client, len, data); 125 if (ret) 126 dev_err(&client->dev, 127 "write error: wrote 0x%x to offset 0x%x error %d", 128 val, reg, ret); 129 130 return ret; 131 } 132 133 /* 134 * gc0310_write_reg_array - Initializes a list of GC0310 registers 135 * @client: i2c driver client structure 136 * @reglist: list of registers to be written 137 * 138 * This function initializes a list of registers. When consecutive addresses 139 * are found in a row on the list, this function creates a buffer and sends 140 * consecutive data in a single i2c_transfer(). 141 * 142 * __gc0310_flush_reg_array, __gc0310_buf_reg_array() and 143 * __gc0310_write_reg_is_consecutive() are internal functions to 144 * gc0310_write_reg_array_fast() and should be not used anywhere else. 145 * 146 */ 147 148 static int __gc0310_flush_reg_array(struct i2c_client *client, 149 struct gc0310_write_ctrl *ctrl) 150 { 151 u16 size; 152 153 if (ctrl->index == 0) 154 return 0; 155 156 size = sizeof(u8) + ctrl->index; /* 8-bit address + data */ 157 ctrl->buffer.addr = (u8)(ctrl->buffer.addr); 158 ctrl->index = 0; 159 160 return gc0310_i2c_write(client, size, (u8 *)&ctrl->buffer); 161 } 162 163 static int __gc0310_buf_reg_array(struct i2c_client *client, 164 struct gc0310_write_ctrl *ctrl, 165 const struct gc0310_reg *next) 166 { 167 int size; 168 169 switch (next->type) { 170 case GC0310_8BIT: 171 size = 1; 172 ctrl->buffer.data[ctrl->index] = (u8)next->val; 173 break; 174 default: 175 return -EINVAL; 176 } 177 178 /* When first item is added, we need to store its starting address */ 179 if (ctrl->index == 0) 180 ctrl->buffer.addr = next->reg; 181 182 ctrl->index += size; 183 184 /* 185 * Buffer cannot guarantee free space for u32? Better flush it to avoid 186 * possible lack of memory for next item. 187 */ 188 if (ctrl->index + sizeof(u8) >= GC0310_MAX_WRITE_BUF_SIZE) 189 return __gc0310_flush_reg_array(client, ctrl); 190 191 return 0; 192 } 193 194 static int __gc0310_write_reg_is_consecutive(struct i2c_client *client, 195 struct gc0310_write_ctrl *ctrl, 196 const struct gc0310_reg *next) 197 { 198 if (ctrl->index == 0) 199 return 1; 200 201 return ctrl->buffer.addr + ctrl->index == next->reg; 202 } 203 204 static int gc0310_write_reg_array(struct i2c_client *client, 205 const struct gc0310_reg *reglist) 206 { 207 const struct gc0310_reg *next = reglist; 208 struct gc0310_write_ctrl ctrl; 209 int err; 210 211 ctrl.index = 0; 212 for (; next->type != GC0310_TOK_TERM; next++) { 213 switch (next->type & GC0310_TOK_MASK) { 214 case GC0310_TOK_DELAY: 215 err = __gc0310_flush_reg_array(client, &ctrl); 216 if (err) 217 return err; 218 msleep(next->val); 219 break; 220 default: 221 /* 222 * If next address is not consecutive, data needs to be 223 * flushed before proceed. 224 */ 225 if (!__gc0310_write_reg_is_consecutive(client, &ctrl, 226 next)) { 227 err = __gc0310_flush_reg_array(client, &ctrl); 228 if (err) 229 return err; 230 } 231 err = __gc0310_buf_reg_array(client, &ctrl, next); 232 if (err) { 233 dev_err(&client->dev, "%s: write error, aborted\n", 234 __func__); 235 return err; 236 } 237 break; 238 } 239 } 240 241 return __gc0310_flush_reg_array(client, &ctrl); 242 } 243 244 static int gc0310_g_focal(struct v4l2_subdev *sd, s32 *val) 245 { 246 *val = (GC0310_FOCAL_LENGTH_NUM << 16) | GC0310_FOCAL_LENGTH_DEM; 247 return 0; 248 } 249 250 static int gc0310_g_fnumber(struct v4l2_subdev *sd, s32 *val) 251 { 252 /*const f number for imx*/ 253 *val = (GC0310_F_NUMBER_DEFAULT_NUM << 16) | GC0310_F_NUMBER_DEM; 254 return 0; 255 } 256 257 static int gc0310_g_fnumber_range(struct v4l2_subdev *sd, s32 *val) 258 { 259 *val = (GC0310_F_NUMBER_DEFAULT_NUM << 24) | 260 (GC0310_F_NUMBER_DEM << 16) | 261 (GC0310_F_NUMBER_DEFAULT_NUM << 8) | GC0310_F_NUMBER_DEM; 262 return 0; 263 } 264 265 static int gc0310_g_bin_factor_x(struct v4l2_subdev *sd, s32 *val) 266 { 267 struct gc0310_device *dev = to_gc0310_sensor(sd); 268 269 *val = dev->res->bin_factor_x; 270 271 return 0; 272 } 273 274 static int gc0310_g_bin_factor_y(struct v4l2_subdev *sd, s32 *val) 275 { 276 struct gc0310_device *dev = to_gc0310_sensor(sd); 277 278 *val = dev->res->bin_factor_y; 279 280 return 0; 281 } 282 283 static int gc0310_get_intg_factor(struct i2c_client *client, 284 struct camera_mipi_info *info, 285 const struct gc0310_resolution *res) 286 { 287 struct v4l2_subdev *sd = i2c_get_clientdata(client); 288 struct gc0310_device *dev = to_gc0310_sensor(sd); 289 struct atomisp_sensor_mode_data *buf = &info->data; 290 u16 val; 291 u8 reg_val; 292 int ret; 293 unsigned int hori_blanking; 294 unsigned int vert_blanking; 295 unsigned int sh_delay; 296 297 if (!info) 298 return -EINVAL; 299 300 /* pixel clock calculattion */ 301 dev->vt_pix_clk_freq_mhz = 14400000; // 16.8MHz 302 buf->vt_pix_clk_freq_mhz = dev->vt_pix_clk_freq_mhz; 303 dev_dbg(&client->dev, "vt_pix_clk_freq_mhz=%d\n", buf->vt_pix_clk_freq_mhz); 304 305 /* get integration time */ 306 buf->coarse_integration_time_min = GC0310_COARSE_INTG_TIME_MIN; 307 buf->coarse_integration_time_max_margin = 308 GC0310_COARSE_INTG_TIME_MAX_MARGIN; 309 310 buf->fine_integration_time_min = GC0310_FINE_INTG_TIME_MIN; 311 buf->fine_integration_time_max_margin = 312 GC0310_FINE_INTG_TIME_MAX_MARGIN; 313 314 buf->fine_integration_time_def = GC0310_FINE_INTG_TIME_MIN; 315 buf->read_mode = res->bin_mode; 316 317 /* get the cropping and output resolution to ISP for this mode. */ 318 /* Getting crop_horizontal_start */ 319 ret = gc0310_read_reg(client, GC0310_8BIT, 320 GC0310_H_CROP_START_H, ®_val); 321 if (ret) 322 return ret; 323 val = (reg_val & 0xFF) << 8; 324 ret = gc0310_read_reg(client, GC0310_8BIT, 325 GC0310_H_CROP_START_L, ®_val); 326 if (ret) 327 return ret; 328 buf->crop_horizontal_start = val | (reg_val & 0xFF); 329 dev_dbg(&client->dev, "crop_horizontal_start=%d\n", buf->crop_horizontal_start); 330 331 /* Getting crop_vertical_start */ 332 ret = gc0310_read_reg(client, GC0310_8BIT, 333 GC0310_V_CROP_START_H, ®_val); 334 if (ret) 335 return ret; 336 val = (reg_val & 0xFF) << 8; 337 ret = gc0310_read_reg(client, GC0310_8BIT, 338 GC0310_V_CROP_START_L, ®_val); 339 if (ret) 340 return ret; 341 buf->crop_vertical_start = val | (reg_val & 0xFF); 342 dev_dbg(&client->dev, "crop_vertical_start=%d\n", buf->crop_vertical_start); 343 344 /* Getting output_width */ 345 ret = gc0310_read_reg(client, GC0310_8BIT, 346 GC0310_H_OUTSIZE_H, ®_val); 347 if (ret) 348 return ret; 349 val = (reg_val & 0xFF) << 8; 350 ret = gc0310_read_reg(client, GC0310_8BIT, 351 GC0310_H_OUTSIZE_L, ®_val); 352 if (ret) 353 return ret; 354 buf->output_width = val | (reg_val & 0xFF); 355 dev_dbg(&client->dev, "output_width=%d\n", buf->output_width); 356 357 /* Getting output_height */ 358 ret = gc0310_read_reg(client, GC0310_8BIT, 359 GC0310_V_OUTSIZE_H, ®_val); 360 if (ret) 361 return ret; 362 val = (reg_val & 0xFF) << 8; 363 ret = gc0310_read_reg(client, GC0310_8BIT, 364 GC0310_V_OUTSIZE_L, ®_val); 365 if (ret) 366 return ret; 367 buf->output_height = val | (reg_val & 0xFF); 368 dev_dbg(&client->dev, "output_height=%d\n", buf->output_height); 369 370 buf->crop_horizontal_end = buf->crop_horizontal_start + buf->output_width - 1; 371 buf->crop_vertical_end = buf->crop_vertical_start + buf->output_height - 1; 372 dev_dbg(&client->dev, "crop_horizontal_end=%d\n", buf->crop_horizontal_end); 373 dev_dbg(&client->dev, "crop_vertical_end=%d\n", buf->crop_vertical_end); 374 375 /* Getting line_length_pck */ 376 ret = gc0310_read_reg(client, GC0310_8BIT, 377 GC0310_H_BLANKING_H, ®_val); 378 if (ret) 379 return ret; 380 val = (reg_val & 0xFF) << 8; 381 ret = gc0310_read_reg(client, GC0310_8BIT, 382 GC0310_H_BLANKING_L, ®_val); 383 if (ret) 384 return ret; 385 hori_blanking = val | (reg_val & 0xFF); 386 ret = gc0310_read_reg(client, GC0310_8BIT, 387 GC0310_SH_DELAY, ®_val); 388 if (ret) 389 return ret; 390 sh_delay = reg_val; 391 buf->line_length_pck = buf->output_width + hori_blanking + sh_delay + 4; 392 dev_dbg(&client->dev, "hori_blanking=%d sh_delay=%d line_length_pck=%d\n", hori_blanking, 393 sh_delay, buf->line_length_pck); 394 395 /* Getting frame_length_lines */ 396 ret = gc0310_read_reg(client, GC0310_8BIT, 397 GC0310_V_BLANKING_H, ®_val); 398 if (ret) 399 return ret; 400 val = (reg_val & 0xFF) << 8; 401 ret = gc0310_read_reg(client, GC0310_8BIT, 402 GC0310_V_BLANKING_L, ®_val); 403 if (ret) 404 return ret; 405 vert_blanking = val | (reg_val & 0xFF); 406 buf->frame_length_lines = buf->output_height + vert_blanking; 407 dev_dbg(&client->dev, "vert_blanking=%d frame_length_lines=%d\n", vert_blanking, 408 buf->frame_length_lines); 409 410 buf->binning_factor_x = res->bin_factor_x ? 411 res->bin_factor_x : 1; 412 buf->binning_factor_y = res->bin_factor_y ? 413 res->bin_factor_y : 1; 414 return 0; 415 } 416 417 static int gc0310_set_gain(struct v4l2_subdev *sd, int gain) 418 419 { 420 struct i2c_client *client = v4l2_get_subdevdata(sd); 421 int ret; 422 u8 again, dgain; 423 424 if (gain < 0x20) 425 gain = 0x20; 426 if (gain > 0x80) 427 gain = 0x80; 428 429 if (gain >= 0x20 && gain < 0x40) { 430 again = 0x0; /* sqrt(2) */ 431 dgain = gain; 432 } else { 433 again = 0x2; /* 2 * sqrt(2) */ 434 dgain = gain / 2; 435 } 436 437 dev_dbg(&client->dev, "gain=0x%x again=0x%x dgain=0x%x\n", gain, again, dgain); 438 439 /* set analog gain */ 440 ret = gc0310_write_reg(client, GC0310_8BIT, 441 GC0310_AGC_ADJ, again); 442 if (ret) 443 return ret; 444 445 /* set digital gain */ 446 ret = gc0310_write_reg(client, GC0310_8BIT, 447 GC0310_DGC_ADJ, dgain); 448 if (ret) 449 return ret; 450 451 return 0; 452 } 453 454 static int __gc0310_set_exposure(struct v4l2_subdev *sd, int coarse_itg, 455 int gain, int digitgain) 456 457 { 458 struct i2c_client *client = v4l2_get_subdevdata(sd); 459 int ret; 460 461 dev_dbg(&client->dev, "coarse_itg=%d gain=%d digitgain=%d\n", coarse_itg, gain, digitgain); 462 463 /* set exposure */ 464 ret = gc0310_write_reg(client, GC0310_8BIT, 465 GC0310_AEC_PK_EXPO_L, 466 coarse_itg & 0xff); 467 if (ret) 468 return ret; 469 470 ret = gc0310_write_reg(client, GC0310_8BIT, 471 GC0310_AEC_PK_EXPO_H, 472 (coarse_itg >> 8) & 0x0f); 473 if (ret) 474 return ret; 475 476 ret = gc0310_set_gain(sd, gain); 477 if (ret) 478 return ret; 479 480 return ret; 481 } 482 483 static int gc0310_set_exposure(struct v4l2_subdev *sd, int exposure, 484 int gain, int digitgain) 485 { 486 struct gc0310_device *dev = to_gc0310_sensor(sd); 487 int ret; 488 489 mutex_lock(&dev->input_lock); 490 ret = __gc0310_set_exposure(sd, exposure, gain, digitgain); 491 mutex_unlock(&dev->input_lock); 492 493 return ret; 494 } 495 496 static long gc0310_s_exposure(struct v4l2_subdev *sd, 497 struct atomisp_exposure *exposure) 498 { 499 int exp = exposure->integration_time[0]; 500 int gain = exposure->gain[0]; 501 int digitgain = exposure->gain[1]; 502 503 /* we should not accept the invalid value below. */ 504 if (gain == 0) { 505 struct i2c_client *client = v4l2_get_subdevdata(sd); 506 507 v4l2_err(client, "%s: invalid value\n", __func__); 508 return -EINVAL; 509 } 510 511 return gc0310_set_exposure(sd, exp, gain, digitgain); 512 } 513 514 /* TO DO */ 515 static int gc0310_v_flip(struct v4l2_subdev *sd, s32 value) 516 { 517 return 0; 518 } 519 520 /* TO DO */ 521 static int gc0310_h_flip(struct v4l2_subdev *sd, s32 value) 522 { 523 return 0; 524 } 525 526 static long gc0310_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg) 527 { 528 switch (cmd) { 529 case ATOMISP_IOC_S_EXPOSURE: 530 return gc0310_s_exposure(sd, arg); 531 default: 532 return -EINVAL; 533 } 534 return 0; 535 } 536 537 /* This returns the exposure time being used. This should only be used 538 * for filling in EXIF data, not for actual image processing. 539 */ 540 static int gc0310_q_exposure(struct v4l2_subdev *sd, s32 *value) 541 { 542 struct i2c_client *client = v4l2_get_subdevdata(sd); 543 u8 reg_v; 544 int ret; 545 546 /* get exposure */ 547 ret = gc0310_read_reg(client, GC0310_8BIT, 548 GC0310_AEC_PK_EXPO_L, 549 ®_v); 550 if (ret) 551 goto err; 552 553 *value = reg_v; 554 ret = gc0310_read_reg(client, GC0310_8BIT, 555 GC0310_AEC_PK_EXPO_H, 556 ®_v); 557 if (ret) 558 goto err; 559 560 *value = *value + (reg_v << 8); 561 err: 562 return ret; 563 } 564 565 static int gc0310_s_ctrl(struct v4l2_ctrl *ctrl) 566 { 567 struct gc0310_device *dev = 568 container_of(ctrl->handler, struct gc0310_device, ctrl_handler); 569 struct i2c_client *client = v4l2_get_subdevdata(&dev->sd); 570 int ret = 0; 571 572 switch (ctrl->id) { 573 case V4L2_CID_VFLIP: 574 dev_dbg(&client->dev, "%s: CID_VFLIP:%d.\n", 575 __func__, ctrl->val); 576 ret = gc0310_v_flip(&dev->sd, ctrl->val); 577 break; 578 case V4L2_CID_HFLIP: 579 dev_dbg(&client->dev, "%s: CID_HFLIP:%d.\n", 580 __func__, ctrl->val); 581 ret = gc0310_h_flip(&dev->sd, ctrl->val); 582 break; 583 default: 584 ret = -EINVAL; 585 } 586 return ret; 587 } 588 589 static int gc0310_g_volatile_ctrl(struct v4l2_ctrl *ctrl) 590 { 591 struct gc0310_device *dev = 592 container_of(ctrl->handler, struct gc0310_device, ctrl_handler); 593 int ret = 0; 594 595 switch (ctrl->id) { 596 case V4L2_CID_EXPOSURE_ABSOLUTE: 597 ret = gc0310_q_exposure(&dev->sd, &ctrl->val); 598 break; 599 case V4L2_CID_FOCAL_ABSOLUTE: 600 ret = gc0310_g_focal(&dev->sd, &ctrl->val); 601 break; 602 case V4L2_CID_FNUMBER_ABSOLUTE: 603 ret = gc0310_g_fnumber(&dev->sd, &ctrl->val); 604 break; 605 case V4L2_CID_FNUMBER_RANGE: 606 ret = gc0310_g_fnumber_range(&dev->sd, &ctrl->val); 607 break; 608 case V4L2_CID_BIN_FACTOR_HORZ: 609 ret = gc0310_g_bin_factor_x(&dev->sd, &ctrl->val); 610 break; 611 case V4L2_CID_BIN_FACTOR_VERT: 612 ret = gc0310_g_bin_factor_y(&dev->sd, &ctrl->val); 613 break; 614 default: 615 ret = -EINVAL; 616 } 617 618 return ret; 619 } 620 621 static const struct v4l2_ctrl_ops ctrl_ops = { 622 .s_ctrl = gc0310_s_ctrl, 623 .g_volatile_ctrl = gc0310_g_volatile_ctrl 624 }; 625 626 static const struct v4l2_ctrl_config gc0310_controls[] = { 627 { 628 .ops = &ctrl_ops, 629 .id = V4L2_CID_EXPOSURE_ABSOLUTE, 630 .type = V4L2_CTRL_TYPE_INTEGER, 631 .name = "exposure", 632 .min = 0x0, 633 .max = 0xffff, 634 .step = 0x01, 635 .def = 0x00, 636 .flags = 0, 637 }, 638 { 639 .ops = &ctrl_ops, 640 .id = V4L2_CID_VFLIP, 641 .type = V4L2_CTRL_TYPE_BOOLEAN, 642 .name = "Flip", 643 .min = 0, 644 .max = 1, 645 .step = 1, 646 .def = 0, 647 }, 648 { 649 .ops = &ctrl_ops, 650 .id = V4L2_CID_HFLIP, 651 .type = V4L2_CTRL_TYPE_BOOLEAN, 652 .name = "Mirror", 653 .min = 0, 654 .max = 1, 655 .step = 1, 656 .def = 0, 657 }, 658 { 659 .ops = &ctrl_ops, 660 .id = V4L2_CID_FOCAL_ABSOLUTE, 661 .type = V4L2_CTRL_TYPE_INTEGER, 662 .name = "focal length", 663 .min = GC0310_FOCAL_LENGTH_DEFAULT, 664 .max = GC0310_FOCAL_LENGTH_DEFAULT, 665 .step = 0x01, 666 .def = GC0310_FOCAL_LENGTH_DEFAULT, 667 .flags = 0, 668 }, 669 { 670 .ops = &ctrl_ops, 671 .id = V4L2_CID_FNUMBER_ABSOLUTE, 672 .type = V4L2_CTRL_TYPE_INTEGER, 673 .name = "f-number", 674 .min = GC0310_F_NUMBER_DEFAULT, 675 .max = GC0310_F_NUMBER_DEFAULT, 676 .step = 0x01, 677 .def = GC0310_F_NUMBER_DEFAULT, 678 .flags = 0, 679 }, 680 { 681 .ops = &ctrl_ops, 682 .id = V4L2_CID_FNUMBER_RANGE, 683 .type = V4L2_CTRL_TYPE_INTEGER, 684 .name = "f-number range", 685 .min = GC0310_F_NUMBER_RANGE, 686 .max = GC0310_F_NUMBER_RANGE, 687 .step = 0x01, 688 .def = GC0310_F_NUMBER_RANGE, 689 .flags = 0, 690 }, 691 { 692 .ops = &ctrl_ops, 693 .id = V4L2_CID_BIN_FACTOR_HORZ, 694 .type = V4L2_CTRL_TYPE_INTEGER, 695 .name = "horizontal binning factor", 696 .min = 0, 697 .max = GC0310_BIN_FACTOR_MAX, 698 .step = 1, 699 .def = 0, 700 .flags = 0, 701 }, 702 { 703 .ops = &ctrl_ops, 704 .id = V4L2_CID_BIN_FACTOR_VERT, 705 .type = V4L2_CTRL_TYPE_INTEGER, 706 .name = "vertical binning factor", 707 .min = 0, 708 .max = GC0310_BIN_FACTOR_MAX, 709 .step = 1, 710 .def = 0, 711 .flags = 0, 712 }, 713 }; 714 715 static int gc0310_init(struct v4l2_subdev *sd) 716 { 717 int ret; 718 struct i2c_client *client = v4l2_get_subdevdata(sd); 719 struct gc0310_device *dev = to_gc0310_sensor(sd); 720 721 mutex_lock(&dev->input_lock); 722 723 /* set initial registers */ 724 ret = gc0310_write_reg_array(client, gc0310_reset_register); 725 726 /* restore settings */ 727 gc0310_res = gc0310_res_preview; 728 N_RES = N_RES_PREVIEW; 729 730 mutex_unlock(&dev->input_lock); 731 732 return ret; 733 } 734 735 static int power_ctrl(struct v4l2_subdev *sd, bool flag) 736 { 737 int ret = 0; 738 struct gc0310_device *dev = to_gc0310_sensor(sd); 739 740 if (!dev || !dev->platform_data) 741 return -ENODEV; 742 743 if (flag) { 744 /* The upstream module driver (written to Crystal 745 * Cove) had this logic to pulse the rails low first. 746 * This appears to break things on the MRD7 with the 747 * X-Powers PMIC... 748 * 749 * ret = dev->platform_data->v1p8_ctrl(sd, 0); 750 * ret |= dev->platform_data->v2p8_ctrl(sd, 0); 751 * mdelay(50); 752 */ 753 ret |= dev->platform_data->v1p8_ctrl(sd, 1); 754 ret |= dev->platform_data->v2p8_ctrl(sd, 1); 755 usleep_range(10000, 15000); 756 } 757 758 if (!flag || ret) { 759 ret |= dev->platform_data->v1p8_ctrl(sd, 0); 760 ret |= dev->platform_data->v2p8_ctrl(sd, 0); 761 } 762 return ret; 763 } 764 765 static int gpio_ctrl(struct v4l2_subdev *sd, bool flag) 766 { 767 int ret; 768 struct gc0310_device *dev = to_gc0310_sensor(sd); 769 770 if (!dev || !dev->platform_data) 771 return -ENODEV; 772 773 /* GPIO0 == "reset" (active low), GPIO1 == "power down" */ 774 if (flag) { 775 /* Pulse reset, then release power down */ 776 ret = dev->platform_data->gpio0_ctrl(sd, 0); 777 usleep_range(5000, 10000); 778 ret |= dev->platform_data->gpio0_ctrl(sd, 1); 779 usleep_range(10000, 15000); 780 ret |= dev->platform_data->gpio1_ctrl(sd, 0); 781 usleep_range(10000, 15000); 782 } else { 783 ret = dev->platform_data->gpio1_ctrl(sd, 1); 784 ret |= dev->platform_data->gpio0_ctrl(sd, 0); 785 } 786 return ret; 787 } 788 789 static int power_up(struct v4l2_subdev *sd) 790 { 791 struct gc0310_device *dev = to_gc0310_sensor(sd); 792 struct i2c_client *client = v4l2_get_subdevdata(sd); 793 int ret; 794 795 if (!dev->platform_data) { 796 dev_err(&client->dev, 797 "no camera_sensor_platform_data"); 798 return -ENODEV; 799 } 800 801 if (dev->power_on) 802 return 0; /* Already on */ 803 804 /* power control */ 805 ret = power_ctrl(sd, 1); 806 if (ret) 807 goto fail_power; 808 809 /* flis clock control */ 810 ret = dev->platform_data->flisclk_ctrl(sd, 1); 811 if (ret) 812 goto fail_clk; 813 814 /* gpio ctrl */ 815 ret = gpio_ctrl(sd, 1); 816 if (ret) { 817 ret = gpio_ctrl(sd, 1); 818 if (ret) 819 goto fail_gpio; 820 } 821 822 msleep(100); 823 824 dev->power_on = true; 825 return 0; 826 827 fail_gpio: 828 dev->platform_data->flisclk_ctrl(sd, 0); 829 fail_clk: 830 power_ctrl(sd, 0); 831 fail_power: 832 dev_err(&client->dev, "sensor power-up failed\n"); 833 834 return ret; 835 } 836 837 static int power_down(struct v4l2_subdev *sd) 838 { 839 struct gc0310_device *dev = to_gc0310_sensor(sd); 840 struct i2c_client *client = v4l2_get_subdevdata(sd); 841 int ret = 0; 842 843 if (!dev->platform_data) { 844 dev_err(&client->dev, 845 "no camera_sensor_platform_data"); 846 return -ENODEV; 847 } 848 849 if (!dev->power_on) 850 return 0; /* Already off */ 851 852 /* gpio ctrl */ 853 ret = gpio_ctrl(sd, 0); 854 if (ret) { 855 ret = gpio_ctrl(sd, 0); 856 if (ret) 857 dev_err(&client->dev, "gpio failed 2\n"); 858 } 859 860 ret = dev->platform_data->flisclk_ctrl(sd, 0); 861 if (ret) 862 dev_err(&client->dev, "flisclk failed\n"); 863 864 /* power control */ 865 ret = power_ctrl(sd, 0); 866 if (ret) 867 dev_err(&client->dev, "vprog failed.\n"); 868 869 dev->power_on = false; 870 return ret; 871 } 872 873 static int gc0310_s_power(struct v4l2_subdev *sd, int on) 874 { 875 int ret; 876 877 if (on == 0) 878 return power_down(sd); 879 880 ret = power_up(sd); 881 if (ret) 882 return ret; 883 884 return gc0310_init(sd); 885 } 886 887 /* TODO: remove it. */ 888 static int startup(struct v4l2_subdev *sd) 889 { 890 struct gc0310_device *dev = to_gc0310_sensor(sd); 891 struct i2c_client *client = v4l2_get_subdevdata(sd); 892 int ret = 0; 893 894 ret = gc0310_write_reg_array(client, dev->res->regs); 895 if (ret) { 896 dev_err(&client->dev, "gc0310 write register err.\n"); 897 return ret; 898 } 899 900 return ret; 901 } 902 903 static int gc0310_set_fmt(struct v4l2_subdev *sd, 904 struct v4l2_subdev_state *sd_state, 905 struct v4l2_subdev_format *format) 906 { 907 struct v4l2_mbus_framefmt *fmt = &format->format; 908 struct gc0310_device *dev = to_gc0310_sensor(sd); 909 struct i2c_client *client = v4l2_get_subdevdata(sd); 910 struct camera_mipi_info *gc0310_info = NULL; 911 struct gc0310_resolution *res; 912 int ret = 0; 913 914 if (format->pad) 915 return -EINVAL; 916 917 if (!fmt) 918 return -EINVAL; 919 920 gc0310_info = v4l2_get_subdev_hostdata(sd); 921 if (!gc0310_info) 922 return -EINVAL; 923 924 mutex_lock(&dev->input_lock); 925 926 res = v4l2_find_nearest_size(gc0310_res_preview, 927 ARRAY_SIZE(gc0310_res_preview), width, 928 height, fmt->width, fmt->height); 929 if (!res) 930 res = &gc0310_res_preview[N_RES - 1]; 931 932 fmt->width = res->width; 933 fmt->height = res->height; 934 dev->res = res; 935 936 fmt->code = MEDIA_BUS_FMT_SGRBG8_1X8; 937 938 if (format->which == V4L2_SUBDEV_FORMAT_TRY) { 939 sd_state->pads->try_fmt = *fmt; 940 mutex_unlock(&dev->input_lock); 941 return 0; 942 } 943 944 /* s_power has not been called yet for std v4l2 clients (camorama) */ 945 power_up(sd); 946 947 dev_dbg(&client->dev, "%s: before gc0310_write_reg_array %s\n", 948 __func__, dev->res->desc); 949 ret = startup(sd); 950 if (ret) { 951 dev_err(&client->dev, "gc0310 startup err\n"); 952 goto err; 953 } 954 955 ret = gc0310_get_intg_factor(client, gc0310_info, dev->res); 956 if (ret) { 957 dev_err(&client->dev, "failed to get integration_factor\n"); 958 goto err; 959 } 960 961 err: 962 mutex_unlock(&dev->input_lock); 963 return ret; 964 } 965 966 static int gc0310_get_fmt(struct v4l2_subdev *sd, 967 struct v4l2_subdev_state *sd_state, 968 struct v4l2_subdev_format *format) 969 { 970 struct v4l2_mbus_framefmt *fmt = &format->format; 971 struct gc0310_device *dev = to_gc0310_sensor(sd); 972 973 if (format->pad) 974 return -EINVAL; 975 976 if (!fmt) 977 return -EINVAL; 978 979 fmt->width = dev->res->width; 980 fmt->height = dev->res->height; 981 fmt->code = MEDIA_BUS_FMT_SGRBG8_1X8; 982 983 return 0; 984 } 985 986 static int gc0310_detect(struct i2c_client *client) 987 { 988 struct i2c_adapter *adapter = client->adapter; 989 u8 high, low; 990 int ret; 991 u16 id; 992 993 if (!i2c_check_functionality(adapter, I2C_FUNC_I2C)) 994 return -ENODEV; 995 996 ret = gc0310_read_reg(client, GC0310_8BIT, 997 GC0310_SC_CMMN_CHIP_ID_H, &high); 998 if (ret) { 999 dev_err(&client->dev, "read sensor_id_high failed\n"); 1000 return -ENODEV; 1001 } 1002 ret = gc0310_read_reg(client, GC0310_8BIT, 1003 GC0310_SC_CMMN_CHIP_ID_L, &low); 1004 if (ret) { 1005 dev_err(&client->dev, "read sensor_id_low failed\n"); 1006 return -ENODEV; 1007 } 1008 id = ((((u16)high) << 8) | (u16)low); 1009 dev_dbg(&client->dev, "sensor ID = 0x%x\n", id); 1010 1011 if (id != GC0310_ID) { 1012 dev_err(&client->dev, "sensor ID error, read id = 0x%x, target id = 0x%x\n", id, 1013 GC0310_ID); 1014 return -ENODEV; 1015 } 1016 1017 dev_dbg(&client->dev, "detect gc0310 success\n"); 1018 1019 return 0; 1020 } 1021 1022 static int gc0310_s_stream(struct v4l2_subdev *sd, int enable) 1023 { 1024 struct gc0310_device *dev = to_gc0310_sensor(sd); 1025 struct i2c_client *client = v4l2_get_subdevdata(sd); 1026 int ret; 1027 1028 dev_dbg(&client->dev, "%s S enable=%d\n", __func__, enable); 1029 mutex_lock(&dev->input_lock); 1030 1031 if (enable) { 1032 /* enable per frame MIPI and sensor ctrl reset */ 1033 ret = gc0310_write_reg(client, GC0310_8BIT, 1034 0xFE, 0x30); 1035 if (ret) { 1036 mutex_unlock(&dev->input_lock); 1037 return ret; 1038 } 1039 } 1040 1041 ret = gc0310_write_reg(client, GC0310_8BIT, 1042 GC0310_RESET_RELATED, GC0310_REGISTER_PAGE_3); 1043 if (ret) { 1044 mutex_unlock(&dev->input_lock); 1045 return ret; 1046 } 1047 1048 ret = gc0310_write_reg(client, GC0310_8BIT, GC0310_SW_STREAM, 1049 enable ? GC0310_START_STREAMING : 1050 GC0310_STOP_STREAMING); 1051 if (ret) { 1052 mutex_unlock(&dev->input_lock); 1053 return ret; 1054 } 1055 1056 ret = gc0310_write_reg(client, GC0310_8BIT, 1057 GC0310_RESET_RELATED, GC0310_REGISTER_PAGE_0); 1058 if (ret) { 1059 mutex_unlock(&dev->input_lock); 1060 return ret; 1061 } 1062 1063 mutex_unlock(&dev->input_lock); 1064 return ret; 1065 } 1066 1067 static int gc0310_s_config(struct v4l2_subdev *sd, 1068 int irq, void *platform_data) 1069 { 1070 struct gc0310_device *dev = to_gc0310_sensor(sd); 1071 struct i2c_client *client = v4l2_get_subdevdata(sd); 1072 int ret = 0; 1073 1074 if (!platform_data) 1075 return -ENODEV; 1076 1077 dev->platform_data = 1078 (struct camera_sensor_platform_data *)platform_data; 1079 1080 mutex_lock(&dev->input_lock); 1081 /* power off the module, then power on it in future 1082 * as first power on by board may not fulfill the 1083 * power on sequqence needed by the module 1084 */ 1085 dev->power_on = true; /* force power_down() to run */ 1086 ret = power_down(sd); 1087 if (ret) { 1088 dev_err(&client->dev, "gc0310 power-off err.\n"); 1089 goto fail_power_off; 1090 } 1091 1092 ret = power_up(sd); 1093 if (ret) { 1094 dev_err(&client->dev, "gc0310 power-up err.\n"); 1095 goto fail_power_on; 1096 } 1097 1098 ret = dev->platform_data->csi_cfg(sd, 1); 1099 if (ret) 1100 goto fail_csi_cfg; 1101 1102 /* config & detect sensor */ 1103 ret = gc0310_detect(client); 1104 if (ret) { 1105 dev_err(&client->dev, "gc0310_detect err s_config.\n"); 1106 goto fail_csi_cfg; 1107 } 1108 1109 /* turn off sensor, after probed */ 1110 ret = power_down(sd); 1111 if (ret) { 1112 dev_err(&client->dev, "gc0310 power-off err.\n"); 1113 goto fail_csi_cfg; 1114 } 1115 mutex_unlock(&dev->input_lock); 1116 1117 return 0; 1118 1119 fail_csi_cfg: 1120 dev->platform_data->csi_cfg(sd, 0); 1121 fail_power_on: 1122 power_down(sd); 1123 dev_err(&client->dev, "sensor power-gating failed\n"); 1124 fail_power_off: 1125 mutex_unlock(&dev->input_lock); 1126 return ret; 1127 } 1128 1129 static int gc0310_g_frame_interval(struct v4l2_subdev *sd, 1130 struct v4l2_subdev_frame_interval *interval) 1131 { 1132 struct gc0310_device *dev = to_gc0310_sensor(sd); 1133 1134 interval->interval.numerator = 1; 1135 interval->interval.denominator = dev->res->fps; 1136 1137 return 0; 1138 } 1139 1140 static int gc0310_enum_mbus_code(struct v4l2_subdev *sd, 1141 struct v4l2_subdev_state *sd_state, 1142 struct v4l2_subdev_mbus_code_enum *code) 1143 { 1144 if (code->index >= MAX_FMTS) 1145 return -EINVAL; 1146 1147 code->code = MEDIA_BUS_FMT_SGRBG8_1X8; 1148 return 0; 1149 } 1150 1151 static int gc0310_enum_frame_size(struct v4l2_subdev *sd, 1152 struct v4l2_subdev_state *sd_state, 1153 struct v4l2_subdev_frame_size_enum *fse) 1154 { 1155 int index = fse->index; 1156 1157 if (index >= N_RES) 1158 return -EINVAL; 1159 1160 fse->min_width = gc0310_res[index].width; 1161 fse->min_height = gc0310_res[index].height; 1162 fse->max_width = gc0310_res[index].width; 1163 fse->max_height = gc0310_res[index].height; 1164 1165 return 0; 1166 } 1167 1168 static int gc0310_g_skip_frames(struct v4l2_subdev *sd, u32 *frames) 1169 { 1170 struct gc0310_device *dev = to_gc0310_sensor(sd); 1171 1172 mutex_lock(&dev->input_lock); 1173 *frames = dev->res->skip_frames; 1174 mutex_unlock(&dev->input_lock); 1175 1176 return 0; 1177 } 1178 1179 static const struct v4l2_subdev_sensor_ops gc0310_sensor_ops = { 1180 .g_skip_frames = gc0310_g_skip_frames, 1181 }; 1182 1183 static const struct v4l2_subdev_video_ops gc0310_video_ops = { 1184 .s_stream = gc0310_s_stream, 1185 .g_frame_interval = gc0310_g_frame_interval, 1186 }; 1187 1188 static const struct v4l2_subdev_core_ops gc0310_core_ops = { 1189 .s_power = gc0310_s_power, 1190 .ioctl = gc0310_ioctl, 1191 }; 1192 1193 static const struct v4l2_subdev_pad_ops gc0310_pad_ops = { 1194 .enum_mbus_code = gc0310_enum_mbus_code, 1195 .enum_frame_size = gc0310_enum_frame_size, 1196 .get_fmt = gc0310_get_fmt, 1197 .set_fmt = gc0310_set_fmt, 1198 }; 1199 1200 static const struct v4l2_subdev_ops gc0310_ops = { 1201 .core = &gc0310_core_ops, 1202 .video = &gc0310_video_ops, 1203 .pad = &gc0310_pad_ops, 1204 .sensor = &gc0310_sensor_ops, 1205 }; 1206 1207 static void gc0310_remove(struct i2c_client *client) 1208 { 1209 struct v4l2_subdev *sd = i2c_get_clientdata(client); 1210 struct gc0310_device *dev = to_gc0310_sensor(sd); 1211 1212 dev_dbg(&client->dev, "gc0310_remove...\n"); 1213 1214 dev->platform_data->csi_cfg(sd, 0); 1215 1216 v4l2_device_unregister_subdev(sd); 1217 media_entity_cleanup(&dev->sd.entity); 1218 v4l2_ctrl_handler_free(&dev->ctrl_handler); 1219 kfree(dev); 1220 } 1221 1222 static int gc0310_probe(struct i2c_client *client) 1223 { 1224 struct gc0310_device *dev; 1225 int ret; 1226 void *pdata; 1227 unsigned int i; 1228 1229 dev = kzalloc(sizeof(*dev), GFP_KERNEL); 1230 if (!dev) 1231 return -ENOMEM; 1232 1233 mutex_init(&dev->input_lock); 1234 1235 dev->res = &gc0310_res_preview[0]; 1236 v4l2_i2c_subdev_init(&dev->sd, client, &gc0310_ops); 1237 1238 pdata = gmin_camera_platform_data(&dev->sd, 1239 ATOMISP_INPUT_FORMAT_RAW_8, 1240 atomisp_bayer_order_grbg); 1241 if (!pdata) { 1242 ret = -EINVAL; 1243 goto out_free; 1244 } 1245 1246 ret = gc0310_s_config(&dev->sd, client->irq, pdata); 1247 if (ret) 1248 goto out_free; 1249 1250 ret = atomisp_register_i2c_module(&dev->sd, pdata, RAW_CAMERA); 1251 if (ret) 1252 goto out_free; 1253 1254 dev->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE; 1255 dev->pad.flags = MEDIA_PAD_FL_SOURCE; 1256 dev->format.code = MEDIA_BUS_FMT_SGRBG8_1X8; 1257 dev->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR; 1258 ret = 1259 v4l2_ctrl_handler_init(&dev->ctrl_handler, 1260 ARRAY_SIZE(gc0310_controls)); 1261 if (ret) { 1262 gc0310_remove(client); 1263 return ret; 1264 } 1265 1266 for (i = 0; i < ARRAY_SIZE(gc0310_controls); i++) 1267 v4l2_ctrl_new_custom(&dev->ctrl_handler, &gc0310_controls[i], 1268 NULL); 1269 1270 if (dev->ctrl_handler.error) { 1271 gc0310_remove(client); 1272 return dev->ctrl_handler.error; 1273 } 1274 1275 /* Use same lock for controls as for everything else. */ 1276 dev->ctrl_handler.lock = &dev->input_lock; 1277 dev->sd.ctrl_handler = &dev->ctrl_handler; 1278 1279 ret = media_entity_pads_init(&dev->sd.entity, 1, &dev->pad); 1280 if (ret) 1281 gc0310_remove(client); 1282 1283 return ret; 1284 out_free: 1285 v4l2_device_unregister_subdev(&dev->sd); 1286 kfree(dev); 1287 return ret; 1288 } 1289 1290 static const struct acpi_device_id gc0310_acpi_match[] = { 1291 {"XXGC0310"}, 1292 {"INT0310"}, 1293 {}, 1294 }; 1295 MODULE_DEVICE_TABLE(acpi, gc0310_acpi_match); 1296 1297 static struct i2c_driver gc0310_driver = { 1298 .driver = { 1299 .name = "gc0310", 1300 .acpi_match_table = gc0310_acpi_match, 1301 }, 1302 .probe_new = gc0310_probe, 1303 .remove = gc0310_remove, 1304 }; 1305 module_i2c_driver(gc0310_driver); 1306 1307 MODULE_AUTHOR("Lai, Angie <angie.lai@intel.com>"); 1308 MODULE_DESCRIPTION("A low-level driver for GalaxyCore GC0310 sensors"); 1309 MODULE_LICENSE("GPL"); 1310