linux/drivers/input/misc/drv2667.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * DRV2667 haptics driver family
   4 *
   5 * Author: Dan Murphy <dmurphy@ti.com>
   6 *
   7 * Copyright: (C) 2014 Texas Instruments, Inc.
   8 */
   9
  10#include <linux/i2c.h>
  11#include <linux/input.h>
  12#include <linux/module.h>
  13#include <linux/platform_device.h>
  14#include <linux/regmap.h>
  15#include <linux/slab.h>
  16#include <linux/delay.h>
  17#include <linux/regulator/consumer.h>
  18
  19/* Contol registers */
  20#define DRV2667_STATUS  0x00
  21#define DRV2667_CTRL_1  0x01
  22#define DRV2667_CTRL_2  0x02
  23/* Waveform sequencer */
  24#define DRV2667_WV_SEQ_0        0x03
  25#define DRV2667_WV_SEQ_1        0x04
  26#define DRV2667_WV_SEQ_2        0x05
  27#define DRV2667_WV_SEQ_3        0x06
  28#define DRV2667_WV_SEQ_4        0x07
  29#define DRV2667_WV_SEQ_5        0x08
  30#define DRV2667_WV_SEQ_6        0x09
  31#define DRV2667_WV_SEQ_7        0x0A
  32#define DRV2667_FIFO            0x0B
  33#define DRV2667_PAGE            0xFF
  34#define DRV2667_MAX_REG         DRV2667_PAGE
  35
  36#define DRV2667_PAGE_0          0x00
  37#define DRV2667_PAGE_1          0x01
  38#define DRV2667_PAGE_2          0x02
  39#define DRV2667_PAGE_3          0x03
  40#define DRV2667_PAGE_4          0x04
  41#define DRV2667_PAGE_5          0x05
  42#define DRV2667_PAGE_6          0x06
  43#define DRV2667_PAGE_7          0x07
  44#define DRV2667_PAGE_8          0x08
  45
  46/* RAM fields */
  47#define DRV2667_RAM_HDR_SZ      0x0
  48/* RAM Header addresses */
  49#define DRV2667_RAM_START_HI    0x01
  50#define DRV2667_RAM_START_LO    0x02
  51#define DRV2667_RAM_STOP_HI             0x03
  52#define DRV2667_RAM_STOP_LO             0x04
  53#define DRV2667_RAM_REPEAT_CT   0x05
  54/* RAM data addresses */
  55#define DRV2667_RAM_AMP         0x06
  56#define DRV2667_RAM_FREQ        0x07
  57#define DRV2667_RAM_DURATION    0x08
  58#define DRV2667_RAM_ENVELOPE    0x09
  59
  60/* Control 1 Register */
  61#define DRV2667_25_VPP_GAIN             0x00
  62#define DRV2667_50_VPP_GAIN             0x01
  63#define DRV2667_75_VPP_GAIN             0x02
  64#define DRV2667_100_VPP_GAIN    0x03
  65#define DRV2667_DIGITAL_IN              0xfc
  66#define DRV2667_ANALOG_IN               (1 << 2)
  67
  68/* Control 2 Register */
  69#define DRV2667_GO                      (1 << 0)
  70#define DRV2667_STANDBY         (1 << 6)
  71#define DRV2667_DEV_RST         (1 << 7)
  72
  73/* RAM Envelope settings */
  74#define DRV2667_NO_ENV                  0x00
  75#define DRV2667_32_MS_ENV               0x01
  76#define DRV2667_64_MS_ENV               0x02
  77#define DRV2667_96_MS_ENV               0x03
  78#define DRV2667_128_MS_ENV              0x04
  79#define DRV2667_160_MS_ENV              0x05
  80#define DRV2667_192_MS_ENV              0x06
  81#define DRV2667_224_MS_ENV              0x07
  82#define DRV2667_256_MS_ENV              0x08
  83#define DRV2667_512_MS_ENV              0x09
  84#define DRV2667_768_MS_ENV              0x0a
  85#define DRV2667_1024_MS_ENV             0x0b
  86#define DRV2667_1280_MS_ENV             0x0c
  87#define DRV2667_1536_MS_ENV             0x0d
  88#define DRV2667_1792_MS_ENV             0x0e
  89#define DRV2667_2048_MS_ENV             0x0f
  90
  91/**
  92 * struct drv2667_data -
  93 * @input_dev - Pointer to the input device
  94 * @client - Pointer to the I2C client
  95 * @regmap - Register map of the device
  96 * @work - Work item used to off load the enable/disable of the vibration
  97 * @regulator - Pointer to the regulator for the IC
  98 * @magnitude - Magnitude of the vibration event
  99**/
 100struct drv2667_data {
 101        struct input_dev *input_dev;
 102        struct i2c_client *client;
 103        struct regmap *regmap;
 104        struct work_struct work;
 105        struct regulator *regulator;
 106        u32 page;
 107        u32 magnitude;
 108        u32 frequency;
 109};
 110
 111static const struct reg_default drv2667_reg_defs[] = {
 112        { DRV2667_STATUS, 0x02 },
 113        { DRV2667_CTRL_1, 0x28 },
 114        { DRV2667_CTRL_2, 0x40 },
 115        { DRV2667_WV_SEQ_0, 0x00 },
 116        { DRV2667_WV_SEQ_1, 0x00 },
 117        { DRV2667_WV_SEQ_2, 0x00 },
 118        { DRV2667_WV_SEQ_3, 0x00 },
 119        { DRV2667_WV_SEQ_4, 0x00 },
 120        { DRV2667_WV_SEQ_5, 0x00 },
 121        { DRV2667_WV_SEQ_6, 0x00 },
 122        { DRV2667_WV_SEQ_7, 0x00 },
 123        { DRV2667_FIFO, 0x00 },
 124        { DRV2667_PAGE, 0x00 },
 125};
 126
 127static int drv2667_set_waveform_freq(struct drv2667_data *haptics)
 128{
 129        unsigned int read_buf;
 130        int freq;
 131        int error;
 132
 133        /* Per the data sheet:
 134         * Sinusoid Frequency (Hz) = 7.8125 x Frequency
 135         */
 136        freq = (haptics->frequency * 1000) / 78125;
 137        if (freq <= 0) {
 138                dev_err(&haptics->client->dev,
 139                        "ERROR: Frequency calculated to %i\n", freq);
 140                return -EINVAL;
 141        }
 142
 143        error = regmap_read(haptics->regmap, DRV2667_PAGE, &read_buf);
 144        if (error) {
 145                dev_err(&haptics->client->dev,
 146                        "Failed to read the page number: %d\n", error);
 147                return -EIO;
 148        }
 149
 150        if (read_buf == DRV2667_PAGE_0 ||
 151                haptics->page != read_buf) {
 152                error = regmap_write(haptics->regmap,
 153                                DRV2667_PAGE, haptics->page);
 154                if (error) {
 155                        dev_err(&haptics->client->dev,
 156                                "Failed to set the page: %d\n", error);
 157                        return -EIO;
 158                }
 159        }
 160
 161        error = regmap_write(haptics->regmap, DRV2667_RAM_FREQ, freq);
 162        if (error)
 163                dev_err(&haptics->client->dev,
 164                                "Failed to set the frequency: %d\n", error);
 165
 166        /* Reset back to original page */
 167        if (read_buf == DRV2667_PAGE_0 ||
 168                haptics->page != read_buf) {
 169                error = regmap_write(haptics->regmap, DRV2667_PAGE, read_buf);
 170                if (error) {
 171                        dev_err(&haptics->client->dev,
 172                                "Failed to set the page: %d\n", error);
 173                        return -EIO;
 174                }
 175        }
 176
 177        return error;
 178}
 179
 180static void drv2667_worker(struct work_struct *work)
 181{
 182        struct drv2667_data *haptics = container_of(work, struct drv2667_data, work);
 183        int error;
 184
 185        if (haptics->magnitude) {
 186                error = regmap_write(haptics->regmap,
 187                                DRV2667_PAGE, haptics->page);
 188                if (error) {
 189                        dev_err(&haptics->client->dev,
 190                                "Failed to set the page: %d\n", error);
 191                        return;
 192                }
 193
 194                error = regmap_write(haptics->regmap, DRV2667_RAM_AMP,
 195                                haptics->magnitude);
 196                if (error) {
 197                        dev_err(&haptics->client->dev,
 198                                "Failed to set the amplitude: %d\n", error);
 199                        return;
 200                }
 201
 202                error = regmap_write(haptics->regmap,
 203                                DRV2667_PAGE, DRV2667_PAGE_0);
 204                if (error) {
 205                        dev_err(&haptics->client->dev,
 206                                "Failed to set the page: %d\n", error);
 207                        return;
 208                }
 209
 210                error = regmap_write(haptics->regmap,
 211                                DRV2667_CTRL_2, DRV2667_GO);
 212                if (error) {
 213                        dev_err(&haptics->client->dev,
 214                                "Failed to set the GO bit: %d\n", error);
 215                }
 216        } else {
 217                error = regmap_update_bits(haptics->regmap, DRV2667_CTRL_2,
 218                                DRV2667_GO, 0);
 219                if (error) {
 220                        dev_err(&haptics->client->dev,
 221                                "Failed to unset the GO bit: %d\n", error);
 222                }
 223        }
 224}
 225
 226static int drv2667_haptics_play(struct input_dev *input, void *data,
 227                                struct ff_effect *effect)
 228{
 229        struct drv2667_data *haptics = input_get_drvdata(input);
 230
 231        if (effect->u.rumble.strong_magnitude > 0)
 232                haptics->magnitude = effect->u.rumble.strong_magnitude;
 233        else if (effect->u.rumble.weak_magnitude > 0)
 234                haptics->magnitude = effect->u.rumble.weak_magnitude;
 235        else
 236                haptics->magnitude = 0;
 237
 238        schedule_work(&haptics->work);
 239
 240        return 0;
 241}
 242
 243static void drv2667_close(struct input_dev *input)
 244{
 245        struct drv2667_data *haptics = input_get_drvdata(input);
 246        int error;
 247
 248        cancel_work_sync(&haptics->work);
 249
 250        error = regmap_update_bits(haptics->regmap, DRV2667_CTRL_2,
 251                                   DRV2667_STANDBY, DRV2667_STANDBY);
 252        if (error)
 253                dev_err(&haptics->client->dev,
 254                        "Failed to enter standby mode: %d\n", error);
 255}
 256
 257static const struct reg_sequence drv2667_init_regs[] = {
 258        { DRV2667_CTRL_2, 0 },
 259        { DRV2667_CTRL_1, DRV2667_25_VPP_GAIN },
 260        { DRV2667_WV_SEQ_0, 1 },
 261        { DRV2667_WV_SEQ_1, 0 }
 262};
 263
 264static const struct reg_sequence drv2667_page1_init[] = {
 265        { DRV2667_RAM_HDR_SZ, 0x05 },
 266        { DRV2667_RAM_START_HI, 0x80 },
 267        { DRV2667_RAM_START_LO, 0x06 },
 268        { DRV2667_RAM_STOP_HI, 0x00 },
 269        { DRV2667_RAM_STOP_LO, 0x09 },
 270        { DRV2667_RAM_REPEAT_CT, 0 },
 271        { DRV2667_RAM_DURATION, 0x05 },
 272        { DRV2667_RAM_ENVELOPE, DRV2667_NO_ENV },
 273        { DRV2667_RAM_AMP, 0x60 },
 274};
 275
 276static int drv2667_init(struct drv2667_data *haptics)
 277{
 278        int error;
 279
 280        /* Set default haptic frequency to 195Hz on Page 1*/
 281        haptics->frequency = 195;
 282        haptics->page = DRV2667_PAGE_1;
 283
 284        error = regmap_register_patch(haptics->regmap,
 285                                      drv2667_init_regs,
 286                                      ARRAY_SIZE(drv2667_init_regs));
 287        if (error) {
 288                dev_err(&haptics->client->dev,
 289                        "Failed to write init registers: %d\n",
 290                        error);
 291                return error;
 292        }
 293
 294        error = regmap_write(haptics->regmap, DRV2667_PAGE, haptics->page);
 295        if (error) {
 296                dev_err(&haptics->client->dev, "Failed to set page: %d\n",
 297                        error);
 298                goto error_out;
 299        }
 300
 301        error = drv2667_set_waveform_freq(haptics);
 302        if (error)
 303                goto error_page;
 304
 305        error = regmap_register_patch(haptics->regmap,
 306                                      drv2667_page1_init,
 307                                      ARRAY_SIZE(drv2667_page1_init));
 308        if (error) {
 309                dev_err(&haptics->client->dev,
 310                        "Failed to write page registers: %d\n",
 311                        error);
 312                return error;
 313        }
 314
 315        error = regmap_write(haptics->regmap, DRV2667_PAGE, DRV2667_PAGE_0);
 316        return error;
 317
 318error_page:
 319        regmap_write(haptics->regmap, DRV2667_PAGE, DRV2667_PAGE_0);
 320error_out:
 321        return error;
 322}
 323
 324static const struct regmap_config drv2667_regmap_config = {
 325        .reg_bits = 8,
 326        .val_bits = 8,
 327
 328        .max_register = DRV2667_MAX_REG,
 329        .reg_defaults = drv2667_reg_defs,
 330        .num_reg_defaults = ARRAY_SIZE(drv2667_reg_defs),
 331        .cache_type = REGCACHE_NONE,
 332};
 333
 334static int drv2667_probe(struct i2c_client *client,
 335                         const struct i2c_device_id *id)
 336{
 337        struct drv2667_data *haptics;
 338        int error;
 339
 340        haptics = devm_kzalloc(&client->dev, sizeof(*haptics), GFP_KERNEL);
 341        if (!haptics)
 342                return -ENOMEM;
 343
 344        haptics->regulator = devm_regulator_get(&client->dev, "vbat");
 345        if (IS_ERR(haptics->regulator)) {
 346                error = PTR_ERR(haptics->regulator);
 347                dev_err(&client->dev,
 348                        "unable to get regulator, error: %d\n", error);
 349                return error;
 350        }
 351
 352        haptics->input_dev = devm_input_allocate_device(&client->dev);
 353        if (!haptics->input_dev) {
 354                dev_err(&client->dev, "Failed to allocate input device\n");
 355                return -ENOMEM;
 356        }
 357
 358        haptics->input_dev->name = "drv2667:haptics";
 359        haptics->input_dev->dev.parent = client->dev.parent;
 360        haptics->input_dev->close = drv2667_close;
 361        input_set_drvdata(haptics->input_dev, haptics);
 362        input_set_capability(haptics->input_dev, EV_FF, FF_RUMBLE);
 363
 364        error = input_ff_create_memless(haptics->input_dev, NULL,
 365                                        drv2667_haptics_play);
 366        if (error) {
 367                dev_err(&client->dev, "input_ff_create() failed: %d\n",
 368                        error);
 369                return error;
 370        }
 371
 372        INIT_WORK(&haptics->work, drv2667_worker);
 373
 374        haptics->client = client;
 375        i2c_set_clientdata(client, haptics);
 376
 377        haptics->regmap = devm_regmap_init_i2c(client, &drv2667_regmap_config);
 378        if (IS_ERR(haptics->regmap)) {
 379                error = PTR_ERR(haptics->regmap);
 380                dev_err(&client->dev, "Failed to allocate register map: %d\n",
 381                        error);
 382                return error;
 383        }
 384
 385        error = drv2667_init(haptics);
 386        if (error) {
 387                dev_err(&client->dev, "Device init failed: %d\n", error);
 388                return error;
 389        }
 390
 391        error = input_register_device(haptics->input_dev);
 392        if (error) {
 393                dev_err(&client->dev, "couldn't register input device: %d\n",
 394                        error);
 395                return error;
 396        }
 397
 398        return 0;
 399}
 400
 401static int __maybe_unused drv2667_suspend(struct device *dev)
 402{
 403        struct drv2667_data *haptics = dev_get_drvdata(dev);
 404        int ret = 0;
 405
 406        mutex_lock(&haptics->input_dev->mutex);
 407
 408        if (haptics->input_dev->users) {
 409                ret = regmap_update_bits(haptics->regmap, DRV2667_CTRL_2,
 410                                         DRV2667_STANDBY, DRV2667_STANDBY);
 411                if (ret) {
 412                        dev_err(dev, "Failed to set standby mode\n");
 413                        regulator_disable(haptics->regulator);
 414                        goto out;
 415                }
 416
 417                ret = regulator_disable(haptics->regulator);
 418                if (ret) {
 419                        dev_err(dev, "Failed to disable regulator\n");
 420                        regmap_update_bits(haptics->regmap,
 421                                           DRV2667_CTRL_2,
 422                                           DRV2667_STANDBY, 0);
 423                }
 424        }
 425out:
 426        mutex_unlock(&haptics->input_dev->mutex);
 427        return ret;
 428}
 429
 430static int __maybe_unused drv2667_resume(struct device *dev)
 431{
 432        struct drv2667_data *haptics = dev_get_drvdata(dev);
 433        int ret = 0;
 434
 435        mutex_lock(&haptics->input_dev->mutex);
 436
 437        if (haptics->input_dev->users) {
 438                ret = regulator_enable(haptics->regulator);
 439                if (ret) {
 440                        dev_err(dev, "Failed to enable regulator\n");
 441                        goto out;
 442                }
 443
 444                ret = regmap_update_bits(haptics->regmap, DRV2667_CTRL_2,
 445                                         DRV2667_STANDBY, 0);
 446                if (ret) {
 447                        dev_err(dev, "Failed to unset standby mode\n");
 448                        regulator_disable(haptics->regulator);
 449                        goto out;
 450                }
 451
 452        }
 453
 454out:
 455        mutex_unlock(&haptics->input_dev->mutex);
 456        return ret;
 457}
 458
 459static SIMPLE_DEV_PM_OPS(drv2667_pm_ops, drv2667_suspend, drv2667_resume);
 460
 461static const struct i2c_device_id drv2667_id[] = {
 462        { "drv2667", 0 },
 463        { }
 464};
 465MODULE_DEVICE_TABLE(i2c, drv2667_id);
 466
 467#ifdef CONFIG_OF
 468static const struct of_device_id drv2667_of_match[] = {
 469        { .compatible = "ti,drv2667", },
 470        { }
 471};
 472MODULE_DEVICE_TABLE(of, drv2667_of_match);
 473#endif
 474
 475static struct i2c_driver drv2667_driver = {
 476        .probe          = drv2667_probe,
 477        .driver         = {
 478                .name   = "drv2667-haptics",
 479                .of_match_table = of_match_ptr(drv2667_of_match),
 480                .pm     = &drv2667_pm_ops,
 481        },
 482        .id_table = drv2667_id,
 483};
 484module_i2c_driver(drv2667_driver);
 485
 486MODULE_DESCRIPTION("TI DRV2667 haptics driver");
 487MODULE_LICENSE("GPL");
 488MODULE_AUTHOR("Dan Murphy <dmurphy@ti.com>");
 489