linux/drivers/staging/media/atomisp/i2c/atomisp-gc0310.c
<<
>>
Prefs
   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 */
  38static 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
  89static 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
 104static 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
 148static 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
 163static 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
 194static 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
 204static 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
 244static 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
 250static 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
 257static 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
 265static 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 = gc0310_res[dev->fmt_idx].bin_factor_x;
 270
 271        return 0;
 272}
 273
 274static 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 = gc0310_res[dev->fmt_idx].bin_factor_y;
 279
 280        return 0;
 281}
 282
 283static 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, &reg_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, &reg_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, &reg_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, &reg_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, &reg_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, &reg_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, &reg_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, &reg_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, &reg_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, &reg_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, &reg_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, &reg_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, &reg_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
 417static 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
 454static 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
 483static 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
 496static 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 */
 515static int gc0310_v_flip(struct v4l2_subdev *sd, s32 value)
 516{
 517        return 0;
 518}
 519
 520/* TO DO */
 521static int gc0310_h_flip(struct v4l2_subdev *sd, s32 value)
 522{
 523        return 0;
 524}
 525
 526static 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 */
 540static 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                              &reg_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                              &reg_v);
 557        if (ret)
 558                goto err;
 559
 560        *value = *value + (reg_v << 8);
 561err:
 562        return ret;
 563}
 564
 565static 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
 589static 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
 621static const struct v4l2_ctrl_ops ctrl_ops = {
 622        .s_ctrl = gc0310_s_ctrl,
 623        .g_volatile_ctrl = gc0310_g_volatile_ctrl
 624};
 625
 626static 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
 715static 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
 735static 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
 765static 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
 789static int power_down(struct v4l2_subdev *sd);
 790
 791static int power_up(struct v4l2_subdev *sd)
 792{
 793        struct gc0310_device *dev = to_gc0310_sensor(sd);
 794        struct i2c_client *client = v4l2_get_subdevdata(sd);
 795        int ret;
 796
 797        if (!dev->platform_data) {
 798                dev_err(&client->dev,
 799                        "no camera_sensor_platform_data");
 800                return -ENODEV;
 801        }
 802
 803        /* power control */
 804        ret = power_ctrl(sd, 1);
 805        if (ret)
 806                goto fail_power;
 807
 808        /* flis clock control */
 809        ret = dev->platform_data->flisclk_ctrl(sd, 1);
 810        if (ret)
 811                goto fail_clk;
 812
 813        /* gpio ctrl */
 814        ret = gpio_ctrl(sd, 1);
 815        if (ret) {
 816                ret = gpio_ctrl(sd, 1);
 817                if (ret)
 818                        goto fail_gpio;
 819        }
 820
 821        msleep(100);
 822
 823        return 0;
 824
 825fail_gpio:
 826        dev->platform_data->flisclk_ctrl(sd, 0);
 827fail_clk:
 828        power_ctrl(sd, 0);
 829fail_power:
 830        dev_err(&client->dev, "sensor power-up failed\n");
 831
 832        return ret;
 833}
 834
 835static int power_down(struct v4l2_subdev *sd)
 836{
 837        struct gc0310_device *dev = to_gc0310_sensor(sd);
 838        struct i2c_client *client = v4l2_get_subdevdata(sd);
 839        int ret = 0;
 840
 841        if (!dev->platform_data) {
 842                dev_err(&client->dev,
 843                        "no camera_sensor_platform_data");
 844                return -ENODEV;
 845        }
 846
 847        /* gpio ctrl */
 848        ret = gpio_ctrl(sd, 0);
 849        if (ret) {
 850                ret = gpio_ctrl(sd, 0);
 851                if (ret)
 852                        dev_err(&client->dev, "gpio failed 2\n");
 853        }
 854
 855        ret = dev->platform_data->flisclk_ctrl(sd, 0);
 856        if (ret)
 857                dev_err(&client->dev, "flisclk failed\n");
 858
 859        /* power control */
 860        ret = power_ctrl(sd, 0);
 861        if (ret)
 862                dev_err(&client->dev, "vprog failed.\n");
 863
 864        return ret;
 865}
 866
 867static int gc0310_s_power(struct v4l2_subdev *sd, int on)
 868{
 869        int ret;
 870
 871        if (on == 0)
 872                return power_down(sd);
 873
 874        ret = power_up(sd);
 875        if (ret)
 876                return ret;
 877
 878        return gc0310_init(sd);
 879}
 880
 881/*
 882 * distance - calculate the distance
 883 * @res: resolution
 884 * @w: width
 885 * @h: height
 886 *
 887 * Get the gap between resolution and w/h.
 888 * res->width/height smaller than w/h wouldn't be considered.
 889 * Returns the value of gap or -1 if fail.
 890 */
 891#define LARGEST_ALLOWED_RATIO_MISMATCH 800
 892static int distance(struct gc0310_resolution *res, u32 w, u32 h)
 893{
 894        unsigned int w_ratio = (res->width << 13) / w;
 895        unsigned int h_ratio;
 896        int match;
 897
 898        if (h == 0)
 899                return -1;
 900        h_ratio = (res->height << 13) / h;
 901        if (h_ratio == 0)
 902                return -1;
 903        match   = abs(((w_ratio << 13) / h_ratio) - 8192);
 904
 905        if ((w_ratio < 8192) || (h_ratio < 8192)  ||
 906            (match > LARGEST_ALLOWED_RATIO_MISMATCH))
 907                return -1;
 908
 909        return w_ratio + h_ratio;
 910}
 911
 912/* Return the nearest higher resolution index */
 913static int nearest_resolution_index(int w, int h)
 914{
 915        int i;
 916        int idx = -1;
 917        int dist;
 918        int min_dist = INT_MAX;
 919        struct gc0310_resolution *tmp_res = NULL;
 920
 921        for (i = 0; i < N_RES; i++) {
 922                tmp_res = &gc0310_res[i];
 923                dist = distance(tmp_res, w, h);
 924                if (dist == -1)
 925                        continue;
 926                if (dist < min_dist) {
 927                        min_dist = dist;
 928                        idx = i;
 929                }
 930        }
 931
 932        return idx;
 933}
 934
 935static int get_resolution_index(int w, int h)
 936{
 937        int i;
 938
 939        for (i = 0; i < N_RES; i++) {
 940                if (w != gc0310_res[i].width)
 941                        continue;
 942                if (h != gc0310_res[i].height)
 943                        continue;
 944
 945                return i;
 946        }
 947
 948        return -1;
 949}
 950
 951/* TODO: remove it. */
 952static int startup(struct v4l2_subdev *sd)
 953{
 954        struct gc0310_device *dev = to_gc0310_sensor(sd);
 955        struct i2c_client *client = v4l2_get_subdevdata(sd);
 956        int ret = 0;
 957
 958        ret = gc0310_write_reg_array(client, gc0310_res[dev->fmt_idx].regs);
 959        if (ret) {
 960                dev_err(&client->dev, "gc0310 write register err.\n");
 961                return ret;
 962        }
 963
 964        return ret;
 965}
 966
 967static int gc0310_set_fmt(struct v4l2_subdev *sd,
 968                          struct v4l2_subdev_state *sd_state,
 969                          struct v4l2_subdev_format *format)
 970{
 971        struct v4l2_mbus_framefmt *fmt = &format->format;
 972        struct gc0310_device *dev = to_gc0310_sensor(sd);
 973        struct i2c_client *client = v4l2_get_subdevdata(sd);
 974        struct camera_mipi_info *gc0310_info = NULL;
 975        int ret = 0;
 976        int idx = 0;
 977
 978        if (format->pad)
 979                return -EINVAL;
 980
 981        if (!fmt)
 982                return -EINVAL;
 983
 984        gc0310_info = v4l2_get_subdev_hostdata(sd);
 985        if (!gc0310_info)
 986                return -EINVAL;
 987
 988        mutex_lock(&dev->input_lock);
 989
 990        idx = nearest_resolution_index(fmt->width, fmt->height);
 991        if (idx == -1) {
 992                /* return the largest resolution */
 993                fmt->width = gc0310_res[N_RES - 1].width;
 994                fmt->height = gc0310_res[N_RES - 1].height;
 995        } else {
 996                fmt->width = gc0310_res[idx].width;
 997                fmt->height = gc0310_res[idx].height;
 998        }
 999        fmt->code = MEDIA_BUS_FMT_SGRBG8_1X8;
1000
1001        if (format->which == V4L2_SUBDEV_FORMAT_TRY) {
1002                sd_state->pads->try_fmt = *fmt;
1003                mutex_unlock(&dev->input_lock);
1004                return 0;
1005        }
1006
1007        dev->fmt_idx = get_resolution_index(fmt->width, fmt->height);
1008        if (dev->fmt_idx == -1) {
1009                dev_err(&client->dev, "get resolution fail\n");
1010                mutex_unlock(&dev->input_lock);
1011                return -EINVAL;
1012        }
1013
1014        dev_dbg(&client->dev, "%s: before gc0310_write_reg_array %s\n",
1015                __func__, gc0310_res[dev->fmt_idx].desc);
1016        ret = startup(sd);
1017        if (ret) {
1018                dev_err(&client->dev, "gc0310 startup err\n");
1019                goto err;
1020        }
1021
1022        ret = gc0310_get_intg_factor(client, gc0310_info,
1023                                     &gc0310_res[dev->fmt_idx]);
1024        if (ret) {
1025                dev_err(&client->dev, "failed to get integration_factor\n");
1026                goto err;
1027        }
1028
1029err:
1030        mutex_unlock(&dev->input_lock);
1031        return ret;
1032}
1033
1034static int gc0310_get_fmt(struct v4l2_subdev *sd,
1035                          struct v4l2_subdev_state *sd_state,
1036                          struct v4l2_subdev_format *format)
1037{
1038        struct v4l2_mbus_framefmt *fmt = &format->format;
1039        struct gc0310_device *dev = to_gc0310_sensor(sd);
1040
1041        if (format->pad)
1042                return -EINVAL;
1043
1044        if (!fmt)
1045                return -EINVAL;
1046
1047        fmt->width = gc0310_res[dev->fmt_idx].width;
1048        fmt->height = gc0310_res[dev->fmt_idx].height;
1049        fmt->code = MEDIA_BUS_FMT_SGRBG8_1X8;
1050
1051        return 0;
1052}
1053
1054static int gc0310_detect(struct i2c_client *client)
1055{
1056        struct i2c_adapter *adapter = client->adapter;
1057        u8 high, low;
1058        int ret;
1059        u16 id;
1060
1061        if (!i2c_check_functionality(adapter, I2C_FUNC_I2C))
1062                return -ENODEV;
1063
1064        ret = gc0310_read_reg(client, GC0310_8BIT,
1065                              GC0310_SC_CMMN_CHIP_ID_H, &high);
1066        if (ret) {
1067                dev_err(&client->dev, "read sensor_id_high failed\n");
1068                return -ENODEV;
1069        }
1070        ret = gc0310_read_reg(client, GC0310_8BIT,
1071                              GC0310_SC_CMMN_CHIP_ID_L, &low);
1072        if (ret) {
1073                dev_err(&client->dev, "read sensor_id_low failed\n");
1074                return -ENODEV;
1075        }
1076        id = ((((u16)high) << 8) | (u16)low);
1077        dev_dbg(&client->dev, "sensor ID = 0x%x\n", id);
1078
1079        if (id != GC0310_ID) {
1080                dev_err(&client->dev, "sensor ID error, read id = 0x%x, target id = 0x%x\n", id,
1081                        GC0310_ID);
1082                return -ENODEV;
1083        }
1084
1085        dev_dbg(&client->dev, "detect gc0310 success\n");
1086
1087        return 0;
1088}
1089
1090static int gc0310_s_stream(struct v4l2_subdev *sd, int enable)
1091{
1092        struct gc0310_device *dev = to_gc0310_sensor(sd);
1093        struct i2c_client *client = v4l2_get_subdevdata(sd);
1094        int ret;
1095
1096        dev_dbg(&client->dev, "%s S enable=%d\n", __func__, enable);
1097        mutex_lock(&dev->input_lock);
1098
1099        if (enable) {
1100                /* enable per frame MIPI and sensor ctrl reset  */
1101                ret = gc0310_write_reg(client, GC0310_8BIT,
1102                                       0xFE, 0x30);
1103                if (ret) {
1104                        mutex_unlock(&dev->input_lock);
1105                        return ret;
1106                }
1107        }
1108
1109        ret = gc0310_write_reg(client, GC0310_8BIT,
1110                               GC0310_RESET_RELATED, GC0310_REGISTER_PAGE_3);
1111        if (ret) {
1112                mutex_unlock(&dev->input_lock);
1113                return ret;
1114        }
1115
1116        ret = gc0310_write_reg(client, GC0310_8BIT, GC0310_SW_STREAM,
1117                               enable ? GC0310_START_STREAMING :
1118                               GC0310_STOP_STREAMING);
1119        if (ret) {
1120                mutex_unlock(&dev->input_lock);
1121                return ret;
1122        }
1123
1124        ret = gc0310_write_reg(client, GC0310_8BIT,
1125                               GC0310_RESET_RELATED, GC0310_REGISTER_PAGE_0);
1126        if (ret) {
1127                mutex_unlock(&dev->input_lock);
1128                return ret;
1129        }
1130
1131        mutex_unlock(&dev->input_lock);
1132        return ret;
1133}
1134
1135static int gc0310_s_config(struct v4l2_subdev *sd,
1136                           int irq, void *platform_data)
1137{
1138        struct gc0310_device *dev = to_gc0310_sensor(sd);
1139        struct i2c_client *client = v4l2_get_subdevdata(sd);
1140        int ret = 0;
1141
1142        if (!platform_data)
1143                return -ENODEV;
1144
1145        dev->platform_data =
1146            (struct camera_sensor_platform_data *)platform_data;
1147
1148        mutex_lock(&dev->input_lock);
1149        /* power off the module, then power on it in future
1150         * as first power on by board may not fulfill the
1151         * power on sequqence needed by the module
1152         */
1153        ret = power_down(sd);
1154        if (ret) {
1155                dev_err(&client->dev, "gc0310 power-off err.\n");
1156                goto fail_power_off;
1157        }
1158
1159        ret = power_up(sd);
1160        if (ret) {
1161                dev_err(&client->dev, "gc0310 power-up err.\n");
1162                goto fail_power_on;
1163        }
1164
1165        ret = dev->platform_data->csi_cfg(sd, 1);
1166        if (ret)
1167                goto fail_csi_cfg;
1168
1169        /* config & detect sensor */
1170        ret = gc0310_detect(client);
1171        if (ret) {
1172                dev_err(&client->dev, "gc0310_detect err s_config.\n");
1173                goto fail_csi_cfg;
1174        }
1175
1176        /* turn off sensor, after probed */
1177        ret = power_down(sd);
1178        if (ret) {
1179                dev_err(&client->dev, "gc0310 power-off err.\n");
1180                goto fail_csi_cfg;
1181        }
1182        mutex_unlock(&dev->input_lock);
1183
1184        return 0;
1185
1186fail_csi_cfg:
1187        dev->platform_data->csi_cfg(sd, 0);
1188fail_power_on:
1189        power_down(sd);
1190        dev_err(&client->dev, "sensor power-gating failed\n");
1191fail_power_off:
1192        mutex_unlock(&dev->input_lock);
1193        return ret;
1194}
1195
1196static int gc0310_g_frame_interval(struct v4l2_subdev *sd,
1197                                   struct v4l2_subdev_frame_interval *interval)
1198{
1199        struct gc0310_device *dev = to_gc0310_sensor(sd);
1200
1201        interval->interval.numerator = 1;
1202        interval->interval.denominator = gc0310_res[dev->fmt_idx].fps;
1203
1204        return 0;
1205}
1206
1207static int gc0310_enum_mbus_code(struct v4l2_subdev *sd,
1208                                 struct v4l2_subdev_state *sd_state,
1209                                 struct v4l2_subdev_mbus_code_enum *code)
1210{
1211        if (code->index >= MAX_FMTS)
1212                return -EINVAL;
1213
1214        code->code = MEDIA_BUS_FMT_SGRBG8_1X8;
1215        return 0;
1216}
1217
1218static int gc0310_enum_frame_size(struct v4l2_subdev *sd,
1219                                  struct v4l2_subdev_state *sd_state,
1220                                  struct v4l2_subdev_frame_size_enum *fse)
1221{
1222        int index = fse->index;
1223
1224        if (index >= N_RES)
1225                return -EINVAL;
1226
1227        fse->min_width = gc0310_res[index].width;
1228        fse->min_height = gc0310_res[index].height;
1229        fse->max_width = gc0310_res[index].width;
1230        fse->max_height = gc0310_res[index].height;
1231
1232        return 0;
1233}
1234
1235static int gc0310_g_skip_frames(struct v4l2_subdev *sd, u32 *frames)
1236{
1237        struct gc0310_device *dev = to_gc0310_sensor(sd);
1238
1239        mutex_lock(&dev->input_lock);
1240        *frames = gc0310_res[dev->fmt_idx].skip_frames;
1241        mutex_unlock(&dev->input_lock);
1242
1243        return 0;
1244}
1245
1246static const struct v4l2_subdev_sensor_ops gc0310_sensor_ops = {
1247        .g_skip_frames  = gc0310_g_skip_frames,
1248};
1249
1250static const struct v4l2_subdev_video_ops gc0310_video_ops = {
1251        .s_stream = gc0310_s_stream,
1252        .g_frame_interval = gc0310_g_frame_interval,
1253};
1254
1255static const struct v4l2_subdev_core_ops gc0310_core_ops = {
1256        .s_power = gc0310_s_power,
1257        .ioctl = gc0310_ioctl,
1258};
1259
1260static const struct v4l2_subdev_pad_ops gc0310_pad_ops = {
1261        .enum_mbus_code = gc0310_enum_mbus_code,
1262        .enum_frame_size = gc0310_enum_frame_size,
1263        .get_fmt = gc0310_get_fmt,
1264        .set_fmt = gc0310_set_fmt,
1265};
1266
1267static const struct v4l2_subdev_ops gc0310_ops = {
1268        .core = &gc0310_core_ops,
1269        .video = &gc0310_video_ops,
1270        .pad = &gc0310_pad_ops,
1271        .sensor = &gc0310_sensor_ops,
1272};
1273
1274static int gc0310_remove(struct i2c_client *client)
1275{
1276        struct v4l2_subdev *sd = i2c_get_clientdata(client);
1277        struct gc0310_device *dev = to_gc0310_sensor(sd);
1278
1279        dev_dbg(&client->dev, "gc0310_remove...\n");
1280
1281        dev->platform_data->csi_cfg(sd, 0);
1282
1283        v4l2_device_unregister_subdev(sd);
1284        media_entity_cleanup(&dev->sd.entity);
1285        v4l2_ctrl_handler_free(&dev->ctrl_handler);
1286        kfree(dev);
1287
1288        return 0;
1289}
1290
1291static int gc0310_probe(struct i2c_client *client)
1292{
1293        struct gc0310_device *dev;
1294        int ret;
1295        void *pdata;
1296        unsigned int i;
1297
1298        dev = kzalloc(sizeof(*dev), GFP_KERNEL);
1299        if (!dev)
1300                return -ENOMEM;
1301
1302        mutex_init(&dev->input_lock);
1303
1304        dev->fmt_idx = 0;
1305        v4l2_i2c_subdev_init(&dev->sd, client, &gc0310_ops);
1306
1307        pdata = gmin_camera_platform_data(&dev->sd,
1308                                          ATOMISP_INPUT_FORMAT_RAW_8,
1309                                          atomisp_bayer_order_grbg);
1310        if (!pdata) {
1311                ret = -EINVAL;
1312                goto out_free;
1313        }
1314
1315        ret = gc0310_s_config(&dev->sd, client->irq, pdata);
1316        if (ret)
1317                goto out_free;
1318
1319        ret = atomisp_register_i2c_module(&dev->sd, pdata, RAW_CAMERA);
1320        if (ret)
1321                goto out_free;
1322
1323        dev->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
1324        dev->pad.flags = MEDIA_PAD_FL_SOURCE;
1325        dev->format.code = MEDIA_BUS_FMT_SGRBG8_1X8;
1326        dev->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;
1327        ret =
1328            v4l2_ctrl_handler_init(&dev->ctrl_handler,
1329                                   ARRAY_SIZE(gc0310_controls));
1330        if (ret) {
1331                gc0310_remove(client);
1332                return ret;
1333        }
1334
1335        for (i = 0; i < ARRAY_SIZE(gc0310_controls); i++)
1336                v4l2_ctrl_new_custom(&dev->ctrl_handler, &gc0310_controls[i],
1337                                     NULL);
1338
1339        if (dev->ctrl_handler.error) {
1340                gc0310_remove(client);
1341                return dev->ctrl_handler.error;
1342        }
1343
1344        /* Use same lock for controls as for everything else. */
1345        dev->ctrl_handler.lock = &dev->input_lock;
1346        dev->sd.ctrl_handler = &dev->ctrl_handler;
1347
1348        ret = media_entity_pads_init(&dev->sd.entity, 1, &dev->pad);
1349        if (ret)
1350                gc0310_remove(client);
1351
1352        return ret;
1353out_free:
1354        v4l2_device_unregister_subdev(&dev->sd);
1355        kfree(dev);
1356        return ret;
1357}
1358
1359static const struct acpi_device_id gc0310_acpi_match[] = {
1360        {"XXGC0310"},
1361        {"INT0310"},
1362        {},
1363};
1364MODULE_DEVICE_TABLE(acpi, gc0310_acpi_match);
1365
1366static struct i2c_driver gc0310_driver = {
1367        .driver = {
1368                .name = "gc0310",
1369                .acpi_match_table = gc0310_acpi_match,
1370        },
1371        .probe_new = gc0310_probe,
1372        .remove = gc0310_remove,
1373};
1374module_i2c_driver(gc0310_driver);
1375
1376MODULE_AUTHOR("Lai, Angie <angie.lai@intel.com>");
1377MODULE_DESCRIPTION("A low-level driver for GalaxyCore GC0310 sensors");
1378MODULE_LICENSE("GPL");
1379