linux/drivers/media/i2c/dw9768.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2// Copyright (c) 2020 MediaTek Inc.
   3
   4#include <linux/delay.h>
   5#include <linux/i2c.h>
   6#include <linux/module.h>
   7#include <linux/pm_runtime.h>
   8#include <linux/regulator/consumer.h>
   9#include <media/v4l2-async.h>
  10#include <media/v4l2-ctrls.h>
  11#include <media/v4l2-device.h>
  12#include <media/v4l2-fwnode.h>
  13#include <media/v4l2-subdev.h>
  14
  15#define DW9768_NAME                             "dw9768"
  16#define DW9768_MAX_FOCUS_POS                    (1024 - 1)
  17/*
  18 * This sets the minimum granularity for the focus positions.
  19 * A value of 1 gives maximum accuracy for a desired focus position
  20 */
  21#define DW9768_FOCUS_STEPS                      1
  22
  23/*
  24 * Ring control and Power control register
  25 * Bit[1] RING_EN
  26 * 0: Direct mode
  27 * 1: AAC mode (ringing control mode)
  28 * Bit[0] PD
  29 * 0: Normal operation mode
  30 * 1: Power down mode
  31 * DW9768 requires waiting time of Topr after PD reset takes place.
  32 */
  33#define DW9768_RING_PD_CONTROL_REG              0x02
  34#define DW9768_PD_MODE_OFF                      0x00
  35#define DW9768_PD_MODE_EN                       BIT(0)
  36#define DW9768_AAC_MODE_EN                      BIT(1)
  37
  38/*
  39 * DW9768 separates two registers to control the VCM position.
  40 * One for MSB value, another is LSB value.
  41 * DAC_MSB: D[9:8] (ADD: 0x03)
  42 * DAC_LSB: D[7:0] (ADD: 0x04)
  43 * D[9:0] DAC data input: positive output current = D[9:0] / 1023 * 100[mA]
  44 */
  45#define DW9768_MSB_ADDR                         0x03
  46#define DW9768_LSB_ADDR                         0x04
  47#define DW9768_STATUS_ADDR                      0x05
  48
  49/*
  50 * AAC mode control & prescale register
  51 * Bit[7:5] Namely AC[2:0], decide the VCM mode and operation time.
  52 * 001 AAC2 0.48 x Tvib
  53 * 010 AAC3 0.70 x Tvib
  54 * 011 AAC4 0.75 x Tvib
  55 * 101 AAC8 1.13 x Tvib
  56 * Bit[2:0] Namely PRESC[2:0], set the internal clock dividing rate as follow.
  57 * 000 2
  58 * 001 1
  59 * 010 1/2
  60 * 011 1/4
  61 * 100 8
  62 * 101 4
  63 */
  64#define DW9768_AAC_PRESC_REG                    0x06
  65#define DW9768_AAC_MODE_SEL_MASK                GENMASK(7, 5)
  66#define DW9768_CLOCK_PRE_SCALE_SEL_MASK         GENMASK(2, 0)
  67
  68/*
  69 * VCM period of vibration register
  70 * Bit[5:0] Defined as VCM rising periodic time (Tvib) together with PRESC[2:0]
  71 * Tvib = (6.3ms + AACT[5:0] * 0.1ms) * Dividing Rate
  72 * Dividing Rate is the internal clock dividing rate that is defined at
  73 * PRESCALE register (ADD: 0x06)
  74 */
  75#define DW9768_AAC_TIME_REG                     0x07
  76
  77/*
  78 * DW9768 requires waiting time (delay time) of t_OPR after power-up,
  79 * or in the case of PD reset taking place.
  80 */
  81#define DW9768_T_OPR_US                         1000
  82#define DW9768_TVIB_MS_BASE10                   (64 - 1)
  83#define DW9768_AAC_MODE_DEFAULT                 2
  84#define DW9768_AAC_TIME_DEFAULT                 0x20
  85#define DW9768_CLOCK_PRE_SCALE_DEFAULT          1
  86
  87/*
  88 * This acts as the minimum granularity of lens movement.
  89 * Keep this value power of 2, so the control steps can be
  90 * uniformly adjusted for gradual lens movement, with desired
  91 * number of control steps.
  92 */
  93#define DW9768_MOVE_STEPS                       16
  94
  95static const char * const dw9768_supply_names[] = {
  96        "vin",  /* Digital I/O power */
  97        "vdd",  /* Digital core power */
  98};
  99
 100/* dw9768 device structure */
 101struct dw9768 {
 102        struct regulator_bulk_data supplies[ARRAY_SIZE(dw9768_supply_names)];
 103        struct v4l2_ctrl_handler ctrls;
 104        struct v4l2_ctrl *focus;
 105        struct v4l2_subdev sd;
 106
 107        u32 aac_mode;
 108        u32 aac_timing;
 109        u32 clock_presc;
 110        u32 move_delay_us;
 111};
 112
 113static inline struct dw9768 *sd_to_dw9768(struct v4l2_subdev *subdev)
 114{
 115        return container_of(subdev, struct dw9768, sd);
 116}
 117
 118struct regval_list {
 119        u8 reg_num;
 120        u8 value;
 121};
 122
 123struct dw9768_aac_mode_ot_multi {
 124        u32 aac_mode_enum;
 125        u32 ot_multi_base100;
 126};
 127
 128struct dw9768_clk_presc_dividing_rate {
 129        u32 clk_presc_enum;
 130        u32 dividing_rate_base100;
 131};
 132
 133static const struct dw9768_aac_mode_ot_multi aac_mode_ot_multi[] = {
 134        {1,  48},
 135        {2,  70},
 136        {3,  75},
 137        {5, 113},
 138};
 139
 140static const struct dw9768_clk_presc_dividing_rate presc_dividing_rate[] = {
 141        {0, 200},
 142        {1, 100},
 143        {2,  50},
 144        {3,  25},
 145        {4, 800},
 146        {5, 400},
 147};
 148
 149static u32 dw9768_find_ot_multi(u32 aac_mode_param)
 150{
 151        u32 cur_ot_multi_base100 = 70;
 152        unsigned int i;
 153
 154        for (i = 0; i < ARRAY_SIZE(aac_mode_ot_multi); i++) {
 155                if (aac_mode_ot_multi[i].aac_mode_enum == aac_mode_param) {
 156                        cur_ot_multi_base100 =
 157                                aac_mode_ot_multi[i].ot_multi_base100;
 158                }
 159        }
 160
 161        return cur_ot_multi_base100;
 162}
 163
 164static u32 dw9768_find_dividing_rate(u32 presc_param)
 165{
 166        u32 cur_clk_dividing_rate_base100 = 100;
 167        unsigned int i;
 168
 169        for (i = 0; i < ARRAY_SIZE(presc_dividing_rate); i++) {
 170                if (presc_dividing_rate[i].clk_presc_enum == presc_param) {
 171                        cur_clk_dividing_rate_base100 =
 172                                presc_dividing_rate[i].dividing_rate_base100;
 173                }
 174        }
 175
 176        return cur_clk_dividing_rate_base100;
 177}
 178
 179/*
 180 * DW9768_AAC_PRESC_REG & DW9768_AAC_TIME_REG determine VCM operation time.
 181 * For current VCM mode: AAC3, Operation Time would be 0.70 x Tvib.
 182 * Tvib = (6.3ms + AACT[5:0] * 0.1MS) * Dividing Rate.
 183 * Below is calculation of the operation delay for each step.
 184 */
 185static inline u32 dw9768_cal_move_delay(u32 aac_mode_param, u32 presc_param,
 186                                        u32 aac_timing_param)
 187{
 188        u32 Tvib_us;
 189        u32 ot_multi_base100;
 190        u32 clk_dividing_rate_base100;
 191
 192        ot_multi_base100 = dw9768_find_ot_multi(aac_mode_param);
 193
 194        clk_dividing_rate_base100 = dw9768_find_dividing_rate(presc_param);
 195
 196        Tvib_us = (DW9768_TVIB_MS_BASE10 + aac_timing_param) *
 197                  clk_dividing_rate_base100;
 198
 199        return Tvib_us * ot_multi_base100 / 100;
 200}
 201
 202static int dw9768_mod_reg(struct dw9768 *dw9768, u8 reg, u8 mask, u8 val)
 203{
 204        struct i2c_client *client = v4l2_get_subdevdata(&dw9768->sd);
 205        int ret;
 206
 207        ret = i2c_smbus_read_byte_data(client, reg);
 208        if (ret < 0)
 209                return ret;
 210
 211        val = ((unsigned char)ret & ~mask) | (val & mask);
 212
 213        return i2c_smbus_write_byte_data(client, reg, val);
 214}
 215
 216static int dw9768_set_dac(struct dw9768 *dw9768, u16 val)
 217{
 218        struct i2c_client *client = v4l2_get_subdevdata(&dw9768->sd);
 219
 220        /* Write VCM position to registers */
 221        return i2c_smbus_write_word_swapped(client, DW9768_MSB_ADDR, val);
 222}
 223
 224static int dw9768_init(struct dw9768 *dw9768)
 225{
 226        struct i2c_client *client = v4l2_get_subdevdata(&dw9768->sd);
 227        int ret, val;
 228
 229        /* Reset DW9768_RING_PD_CONTROL_REG to default status 0x00 */
 230        ret = i2c_smbus_write_byte_data(client, DW9768_RING_PD_CONTROL_REG,
 231                                        DW9768_PD_MODE_OFF);
 232        if (ret < 0)
 233                return ret;
 234
 235        /*
 236         * DW9769 requires waiting delay time of t_OPR
 237         * after PD reset takes place.
 238         */
 239        usleep_range(DW9768_T_OPR_US, DW9768_T_OPR_US + 100);
 240
 241        /* Set DW9768_RING_PD_CONTROL_REG to DW9768_AAC_MODE_EN(0x01) */
 242        ret = i2c_smbus_write_byte_data(client, DW9768_RING_PD_CONTROL_REG,
 243                                        DW9768_AAC_MODE_EN);
 244        if (ret < 0)
 245                return ret;
 246
 247        /* Set AAC mode */
 248        ret = dw9768_mod_reg(dw9768, DW9768_AAC_PRESC_REG,
 249                             DW9768_AAC_MODE_SEL_MASK,
 250                             dw9768->aac_mode << 5);
 251        if (ret < 0)
 252                return ret;
 253
 254        /* Set clock presc */
 255        if (dw9768->clock_presc != DW9768_CLOCK_PRE_SCALE_DEFAULT) {
 256                ret = dw9768_mod_reg(dw9768, DW9768_AAC_PRESC_REG,
 257                                     DW9768_CLOCK_PRE_SCALE_SEL_MASK,
 258                                     dw9768->clock_presc);
 259                if (ret < 0)
 260                        return ret;
 261        }
 262
 263        /* Set AAC Timing */
 264        if (dw9768->aac_timing != DW9768_AAC_TIME_DEFAULT) {
 265                ret = i2c_smbus_write_byte_data(client, DW9768_AAC_TIME_REG,
 266                                                dw9768->aac_timing);
 267                if (ret < 0)
 268                        return ret;
 269        }
 270
 271        for (val = dw9768->focus->val % DW9768_MOVE_STEPS;
 272             val <= dw9768->focus->val;
 273             val += DW9768_MOVE_STEPS) {
 274                ret = dw9768_set_dac(dw9768, val);
 275                if (ret) {
 276                        dev_err(&client->dev, "I2C failure: %d", ret);
 277                        return ret;
 278                }
 279                usleep_range(dw9768->move_delay_us,
 280                             dw9768->move_delay_us + 1000);
 281        }
 282
 283        return 0;
 284}
 285
 286static int dw9768_release(struct dw9768 *dw9768)
 287{
 288        struct i2c_client *client = v4l2_get_subdevdata(&dw9768->sd);
 289        int ret, val;
 290
 291        val = round_down(dw9768->focus->val, DW9768_MOVE_STEPS);
 292        for ( ; val >= 0; val -= DW9768_MOVE_STEPS) {
 293                ret = dw9768_set_dac(dw9768, val);
 294                if (ret) {
 295                        dev_err(&client->dev, "I2C write fail: %d", ret);
 296                        return ret;
 297                }
 298                usleep_range(dw9768->move_delay_us,
 299                             dw9768->move_delay_us + 1000);
 300        }
 301
 302        ret = i2c_smbus_write_byte_data(client, DW9768_RING_PD_CONTROL_REG,
 303                                        DW9768_PD_MODE_EN);
 304        if (ret < 0)
 305                return ret;
 306
 307        /*
 308         * DW9769 requires waiting delay time of t_OPR
 309         * after PD reset takes place.
 310         */
 311        usleep_range(DW9768_T_OPR_US, DW9768_T_OPR_US + 100);
 312
 313        return 0;
 314}
 315
 316static int dw9768_runtime_suspend(struct device *dev)
 317{
 318        struct v4l2_subdev *sd = dev_get_drvdata(dev);
 319        struct dw9768 *dw9768 = sd_to_dw9768(sd);
 320
 321        dw9768_release(dw9768);
 322        regulator_bulk_disable(ARRAY_SIZE(dw9768_supply_names),
 323                               dw9768->supplies);
 324
 325        return 0;
 326}
 327
 328static int dw9768_runtime_resume(struct device *dev)
 329{
 330        struct v4l2_subdev *sd = dev_get_drvdata(dev);
 331        struct dw9768 *dw9768 = sd_to_dw9768(sd);
 332        int ret;
 333
 334        ret = regulator_bulk_enable(ARRAY_SIZE(dw9768_supply_names),
 335                                    dw9768->supplies);
 336        if (ret < 0) {
 337                dev_err(dev, "failed to enable regulators\n");
 338                return ret;
 339        }
 340
 341        /*
 342         * The datasheet refers to t_OPR that needs to be waited before sending
 343         * I2C commands after power-up.
 344         */
 345        usleep_range(DW9768_T_OPR_US, DW9768_T_OPR_US + 100);
 346
 347        ret = dw9768_init(dw9768);
 348        if (ret < 0)
 349                goto disable_regulator;
 350
 351        return 0;
 352
 353disable_regulator:
 354        regulator_bulk_disable(ARRAY_SIZE(dw9768_supply_names),
 355                               dw9768->supplies);
 356
 357        return ret;
 358}
 359
 360static int dw9768_set_ctrl(struct v4l2_ctrl *ctrl)
 361{
 362        struct dw9768 *dw9768 = container_of(ctrl->handler,
 363                                             struct dw9768, ctrls);
 364
 365        if (ctrl->id == V4L2_CID_FOCUS_ABSOLUTE)
 366                return dw9768_set_dac(dw9768, ctrl->val);
 367
 368        return 0;
 369}
 370
 371static const struct v4l2_ctrl_ops dw9768_ctrl_ops = {
 372        .s_ctrl = dw9768_set_ctrl,
 373};
 374
 375static int dw9768_open(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh)
 376{
 377        return pm_runtime_resume_and_get(sd->dev);
 378}
 379
 380static int dw9768_close(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh)
 381{
 382        pm_runtime_put(sd->dev);
 383
 384        return 0;
 385}
 386
 387static const struct v4l2_subdev_internal_ops dw9768_int_ops = {
 388        .open = dw9768_open,
 389        .close = dw9768_close,
 390};
 391
 392static const struct v4l2_subdev_ops dw9768_ops = { };
 393
 394static int dw9768_init_controls(struct dw9768 *dw9768)
 395{
 396        struct v4l2_ctrl_handler *hdl = &dw9768->ctrls;
 397        const struct v4l2_ctrl_ops *ops = &dw9768_ctrl_ops;
 398
 399        v4l2_ctrl_handler_init(hdl, 1);
 400
 401        dw9768->focus = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_FOCUS_ABSOLUTE, 0,
 402                                          DW9768_MAX_FOCUS_POS,
 403                                          DW9768_FOCUS_STEPS, 0);
 404
 405        if (hdl->error)
 406                return hdl->error;
 407
 408        dw9768->sd.ctrl_handler = hdl;
 409
 410        return 0;
 411}
 412
 413static int dw9768_probe(struct i2c_client *client)
 414{
 415        struct device *dev = &client->dev;
 416        struct dw9768 *dw9768;
 417        unsigned int i;
 418        int ret;
 419
 420        dw9768 = devm_kzalloc(dev, sizeof(*dw9768), GFP_KERNEL);
 421        if (!dw9768)
 422                return -ENOMEM;
 423
 424        /* Initialize subdev */
 425        v4l2_i2c_subdev_init(&dw9768->sd, client, &dw9768_ops);
 426
 427        dw9768->aac_mode = DW9768_AAC_MODE_DEFAULT;
 428        dw9768->aac_timing = DW9768_AAC_TIME_DEFAULT;
 429        dw9768->clock_presc = DW9768_CLOCK_PRE_SCALE_DEFAULT;
 430
 431        /* Optional indication of AAC mode select */
 432        fwnode_property_read_u32(dev_fwnode(dev), "dongwoon,aac-mode",
 433                                 &dw9768->aac_mode);
 434
 435        /* Optional indication of clock pre-scale select */
 436        fwnode_property_read_u32(dev_fwnode(dev), "dongwoon,clock-presc",
 437                                 &dw9768->clock_presc);
 438
 439        /* Optional indication of AAC Timing */
 440        fwnode_property_read_u32(dev_fwnode(dev), "dongwoon,aac-timing",
 441                                 &dw9768->aac_timing);
 442
 443        dw9768->move_delay_us = dw9768_cal_move_delay(dw9768->aac_mode,
 444                                                      dw9768->clock_presc,
 445                                                      dw9768->aac_timing);
 446
 447        for (i = 0; i < ARRAY_SIZE(dw9768_supply_names); i++)
 448                dw9768->supplies[i].supply = dw9768_supply_names[i];
 449
 450        ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(dw9768_supply_names),
 451                                      dw9768->supplies);
 452        if (ret) {
 453                dev_err(dev, "failed to get regulators\n");
 454                return ret;
 455        }
 456
 457        /* Initialize controls */
 458        ret = dw9768_init_controls(dw9768);
 459        if (ret)
 460                goto err_free_handler;
 461
 462        /* Initialize subdev */
 463        dw9768->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
 464        dw9768->sd.internal_ops = &dw9768_int_ops;
 465
 466        ret = media_entity_pads_init(&dw9768->sd.entity, 0, NULL);
 467        if (ret < 0)
 468                goto err_free_handler;
 469
 470        dw9768->sd.entity.function = MEDIA_ENT_F_LENS;
 471
 472        pm_runtime_enable(dev);
 473        if (!pm_runtime_enabled(dev)) {
 474                ret = dw9768_runtime_resume(dev);
 475                if (ret < 0) {
 476                        dev_err(dev, "failed to power on: %d\n", ret);
 477                        goto err_clean_entity;
 478                }
 479        }
 480
 481        ret = v4l2_async_register_subdev(&dw9768->sd);
 482        if (ret < 0) {
 483                dev_err(dev, "failed to register V4L2 subdev: %d", ret);
 484                goto err_power_off;
 485        }
 486
 487        return 0;
 488
 489err_power_off:
 490        if (pm_runtime_enabled(dev))
 491                pm_runtime_disable(dev);
 492        else
 493                dw9768_runtime_suspend(dev);
 494err_clean_entity:
 495        media_entity_cleanup(&dw9768->sd.entity);
 496err_free_handler:
 497        v4l2_ctrl_handler_free(&dw9768->ctrls);
 498
 499        return ret;
 500}
 501
 502static int dw9768_remove(struct i2c_client *client)
 503{
 504        struct v4l2_subdev *sd = i2c_get_clientdata(client);
 505        struct dw9768 *dw9768 = sd_to_dw9768(sd);
 506
 507        v4l2_async_unregister_subdev(&dw9768->sd);
 508        v4l2_ctrl_handler_free(&dw9768->ctrls);
 509        media_entity_cleanup(&dw9768->sd.entity);
 510        pm_runtime_disable(&client->dev);
 511        if (!pm_runtime_status_suspended(&client->dev))
 512                dw9768_runtime_suspend(&client->dev);
 513        pm_runtime_set_suspended(&client->dev);
 514
 515        return 0;
 516}
 517
 518static const struct of_device_id dw9768_of_table[] = {
 519        { .compatible = "dongwoon,dw9768" },
 520        { .compatible = "giantec,gt9769" },
 521        {}
 522};
 523MODULE_DEVICE_TABLE(of, dw9768_of_table);
 524
 525static const struct dev_pm_ops dw9768_pm_ops = {
 526        SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend,
 527                                pm_runtime_force_resume)
 528        SET_RUNTIME_PM_OPS(dw9768_runtime_suspend, dw9768_runtime_resume, NULL)
 529};
 530
 531static struct i2c_driver dw9768_i2c_driver = {
 532        .driver = {
 533                .name = DW9768_NAME,
 534                .pm = &dw9768_pm_ops,
 535                .of_match_table = dw9768_of_table,
 536        },
 537        .probe_new  = dw9768_probe,
 538        .remove = dw9768_remove,
 539};
 540module_i2c_driver(dw9768_i2c_driver);
 541
 542MODULE_AUTHOR("Dongchun Zhu <dongchun.zhu@mediatek.com>");
 543MODULE_DESCRIPTION("DW9768 VCM driver");
 544MODULE_LICENSE("GPL v2");
 545