linux/drivers/input/rmi4/rmi_f01.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * Copyright (c) 2011-2016 Synaptics Incorporated
   4 * Copyright (c) 2011 Unixphere
   5 */
   6
   7#include <linux/kernel.h>
   8#include <linux/rmi.h>
   9#include <linux/slab.h>
  10#include <linux/uaccess.h>
  11#include <linux/of.h>
  12#include <asm/unaligned.h>
  13#include "rmi_driver.h"
  14
  15#define RMI_PRODUCT_ID_LENGTH    10
  16#define RMI_PRODUCT_INFO_LENGTH   2
  17
  18#define RMI_DATE_CODE_LENGTH      3
  19
  20#define PRODUCT_ID_OFFSET 0x10
  21#define PRODUCT_INFO_OFFSET 0x1E
  22
  23
  24/* Force a firmware reset of the sensor */
  25#define RMI_F01_CMD_DEVICE_RESET        1
  26
  27/* Various F01_RMI_QueryX bits */
  28
  29#define RMI_F01_QRY1_CUSTOM_MAP         BIT(0)
  30#define RMI_F01_QRY1_NON_COMPLIANT      BIT(1)
  31#define RMI_F01_QRY1_HAS_LTS            BIT(2)
  32#define RMI_F01_QRY1_HAS_SENSOR_ID      BIT(3)
  33#define RMI_F01_QRY1_HAS_CHARGER_INP    BIT(4)
  34#define RMI_F01_QRY1_HAS_ADJ_DOZE       BIT(5)
  35#define RMI_F01_QRY1_HAS_ADJ_DOZE_HOFF  BIT(6)
  36#define RMI_F01_QRY1_HAS_QUERY42        BIT(7)
  37
  38#define RMI_F01_QRY5_YEAR_MASK          0x1f
  39#define RMI_F01_QRY6_MONTH_MASK         0x0f
  40#define RMI_F01_QRY7_DAY_MASK           0x1f
  41
  42#define RMI_F01_QRY2_PRODINFO_MASK      0x7f
  43
  44#define RMI_F01_BASIC_QUERY_LEN         21 /* From Query 00 through 20 */
  45
  46struct f01_basic_properties {
  47        u8 manufacturer_id;
  48        bool has_lts;
  49        bool has_adjustable_doze;
  50        bool has_adjustable_doze_holdoff;
  51        char dom[11]; /* YYYY/MM/DD + '\0' */
  52        u8 product_id[RMI_PRODUCT_ID_LENGTH + 1];
  53        u16 productinfo;
  54        u32 firmware_id;
  55        u32 package_id;
  56};
  57
  58/* F01 device status bits */
  59
  60/* Most recent device status event */
  61#define RMI_F01_STATUS_CODE(status)             ((status) & 0x0f)
  62/* The device has lost its configuration for some reason. */
  63#define RMI_F01_STATUS_UNCONFIGURED(status)     (!!((status) & 0x80))
  64/* The device is in bootloader mode */
  65#define RMI_F01_STATUS_BOOTLOADER(status)       ((status) & 0x40)
  66
  67/* Control register bits */
  68
  69/*
  70 * Sleep mode controls power management on the device and affects all
  71 * functions of the device.
  72 */
  73#define RMI_F01_CTRL0_SLEEP_MODE_MASK   0x03
  74
  75#define RMI_SLEEP_MODE_NORMAL           0x00
  76#define RMI_SLEEP_MODE_SENSOR_SLEEP     0x01
  77#define RMI_SLEEP_MODE_RESERVED0        0x02
  78#define RMI_SLEEP_MODE_RESERVED1        0x03
  79
  80/*
  81 * This bit disables whatever sleep mode may be selected by the sleep_mode
  82 * field and forces the device to run at full power without sleeping.
  83 */
  84#define RMI_F01_CTRL0_NOSLEEP_BIT       BIT(2)
  85
  86/*
  87 * When this bit is set, the touch controller employs a noise-filtering
  88 * algorithm designed for use with a connected battery charger.
  89 */
  90#define RMI_F01_CTRL0_CHARGER_BIT       BIT(5)
  91
  92/*
  93 * Sets the report rate for the device. The effect of this setting is
  94 * highly product dependent. Check the spec sheet for your particular
  95 * touch sensor.
  96 */
  97#define RMI_F01_CTRL0_REPORTRATE_BIT    BIT(6)
  98
  99/*
 100 * Written by the host as an indicator that the device has been
 101 * successfully configured.
 102 */
 103#define RMI_F01_CTRL0_CONFIGURED_BIT    BIT(7)
 104
 105/**
 106 * @ctrl0 - see the bit definitions above.
 107 * @doze_interval - controls the interval between checks for finger presence
 108 * when the touch sensor is in doze mode, in units of 10ms.
 109 * @wakeup_threshold - controls the capacitance threshold at which the touch
 110 * sensor will decide to wake up from that low power state.
 111 * @doze_holdoff - controls how long the touch sensor waits after the last
 112 * finger lifts before entering the doze state, in units of 100ms.
 113 */
 114struct f01_device_control {
 115        u8 ctrl0;
 116        u8 doze_interval;
 117        u8 wakeup_threshold;
 118        u8 doze_holdoff;
 119};
 120
 121struct f01_data {
 122        struct f01_basic_properties properties;
 123        struct f01_device_control device_control;
 124
 125        u16 doze_interval_addr;
 126        u16 wakeup_threshold_addr;
 127        u16 doze_holdoff_addr;
 128
 129        bool suspended;
 130        bool old_nosleep;
 131
 132        unsigned int num_of_irq_regs;
 133};
 134
 135static int rmi_f01_read_properties(struct rmi_device *rmi_dev,
 136                                   u16 query_base_addr,
 137                                   struct f01_basic_properties *props)
 138{
 139        u8 queries[RMI_F01_BASIC_QUERY_LEN];
 140        int ret;
 141        int query_offset = query_base_addr;
 142        bool has_ds4_queries = false;
 143        bool has_query42 = false;
 144        bool has_sensor_id = false;
 145        bool has_package_id_query = false;
 146        bool has_build_id_query = false;
 147        u16 prod_info_addr;
 148        u8 ds4_query_len;
 149
 150        ret = rmi_read_block(rmi_dev, query_offset,
 151                               queries, RMI_F01_BASIC_QUERY_LEN);
 152        if (ret) {
 153                dev_err(&rmi_dev->dev,
 154                        "Failed to read device query registers: %d\n", ret);
 155                return ret;
 156        }
 157
 158        prod_info_addr = query_offset + 17;
 159        query_offset += RMI_F01_BASIC_QUERY_LEN;
 160
 161        /* Now parse what we got */
 162        props->manufacturer_id = queries[0];
 163
 164        props->has_lts = queries[1] & RMI_F01_QRY1_HAS_LTS;
 165        props->has_adjustable_doze =
 166                        queries[1] & RMI_F01_QRY1_HAS_ADJ_DOZE;
 167        props->has_adjustable_doze_holdoff =
 168                        queries[1] & RMI_F01_QRY1_HAS_ADJ_DOZE_HOFF;
 169        has_query42 = queries[1] & RMI_F01_QRY1_HAS_QUERY42;
 170        has_sensor_id = queries[1] & RMI_F01_QRY1_HAS_SENSOR_ID;
 171
 172        snprintf(props->dom, sizeof(props->dom), "20%02d/%02d/%02d",
 173                 queries[5] & RMI_F01_QRY5_YEAR_MASK,
 174                 queries[6] & RMI_F01_QRY6_MONTH_MASK,
 175                 queries[7] & RMI_F01_QRY7_DAY_MASK);
 176
 177        memcpy(props->product_id, &queries[11],
 178                RMI_PRODUCT_ID_LENGTH);
 179        props->product_id[RMI_PRODUCT_ID_LENGTH] = '\0';
 180
 181        props->productinfo =
 182                        ((queries[2] & RMI_F01_QRY2_PRODINFO_MASK) << 7) |
 183                        (queries[3] & RMI_F01_QRY2_PRODINFO_MASK);
 184
 185        if (has_sensor_id)
 186                query_offset++;
 187
 188        if (has_query42) {
 189                ret = rmi_read(rmi_dev, query_offset, queries);
 190                if (ret) {
 191                        dev_err(&rmi_dev->dev,
 192                                "Failed to read query 42 register: %d\n", ret);
 193                        return ret;
 194                }
 195
 196                has_ds4_queries = !!(queries[0] & BIT(0));
 197                query_offset++;
 198        }
 199
 200        if (has_ds4_queries) {
 201                ret = rmi_read(rmi_dev, query_offset, &ds4_query_len);
 202                if (ret) {
 203                        dev_err(&rmi_dev->dev,
 204                                "Failed to read DS4 queries length: %d\n", ret);
 205                        return ret;
 206                }
 207                query_offset++;
 208
 209                if (ds4_query_len > 0) {
 210                        ret = rmi_read(rmi_dev, query_offset, queries);
 211                        if (ret) {
 212                                dev_err(&rmi_dev->dev,
 213                                        "Failed to read DS4 queries: %d\n",
 214                                        ret);
 215                                return ret;
 216                        }
 217
 218                        has_package_id_query = !!(queries[0] & BIT(0));
 219                        has_build_id_query = !!(queries[0] & BIT(1));
 220                }
 221
 222                if (has_package_id_query) {
 223                        ret = rmi_read_block(rmi_dev, prod_info_addr,
 224                                             queries, sizeof(__le64));
 225                        if (ret) {
 226                                dev_err(&rmi_dev->dev,
 227                                        "Failed to read package info: %d\n",
 228                                        ret);
 229                                return ret;
 230                        }
 231
 232                        props->package_id = get_unaligned_le64(queries);
 233                        prod_info_addr++;
 234                }
 235
 236                if (has_build_id_query) {
 237                        ret = rmi_read_block(rmi_dev, prod_info_addr, queries,
 238                                            3);
 239                        if (ret) {
 240                                dev_err(&rmi_dev->dev,
 241                                        "Failed to read product info: %d\n",
 242                                        ret);
 243                                return ret;
 244                        }
 245
 246                        props->firmware_id = queries[1] << 8 | queries[0];
 247                        props->firmware_id += queries[2] * 65536;
 248                }
 249        }
 250
 251        return 0;
 252}
 253
 254const char *rmi_f01_get_product_ID(struct rmi_function *fn)
 255{
 256        struct f01_data *f01 = dev_get_drvdata(&fn->dev);
 257
 258        return f01->properties.product_id;
 259}
 260
 261static ssize_t rmi_driver_manufacturer_id_show(struct device *dev,
 262                                               struct device_attribute *dattr,
 263                                               char *buf)
 264{
 265        struct rmi_driver_data *data = dev_get_drvdata(dev);
 266        struct f01_data *f01 = dev_get_drvdata(&data->f01_container->dev);
 267
 268        return scnprintf(buf, PAGE_SIZE, "%d\n",
 269                         f01->properties.manufacturer_id);
 270}
 271
 272static DEVICE_ATTR(manufacturer_id, 0444,
 273                   rmi_driver_manufacturer_id_show, NULL);
 274
 275static ssize_t rmi_driver_dom_show(struct device *dev,
 276                                   struct device_attribute *dattr, char *buf)
 277{
 278        struct rmi_driver_data *data = dev_get_drvdata(dev);
 279        struct f01_data *f01 = dev_get_drvdata(&data->f01_container->dev);
 280
 281        return scnprintf(buf, PAGE_SIZE, "%s\n", f01->properties.dom);
 282}
 283
 284static DEVICE_ATTR(date_of_manufacture, 0444, rmi_driver_dom_show, NULL);
 285
 286static ssize_t rmi_driver_product_id_show(struct device *dev,
 287                                          struct device_attribute *dattr,
 288                                          char *buf)
 289{
 290        struct rmi_driver_data *data = dev_get_drvdata(dev);
 291        struct f01_data *f01 = dev_get_drvdata(&data->f01_container->dev);
 292
 293        return scnprintf(buf, PAGE_SIZE, "%s\n", f01->properties.product_id);
 294}
 295
 296static DEVICE_ATTR(product_id, 0444, rmi_driver_product_id_show, NULL);
 297
 298static ssize_t rmi_driver_firmware_id_show(struct device *dev,
 299                                           struct device_attribute *dattr,
 300                                           char *buf)
 301{
 302        struct rmi_driver_data *data = dev_get_drvdata(dev);
 303        struct f01_data *f01 = dev_get_drvdata(&data->f01_container->dev);
 304
 305        return scnprintf(buf, PAGE_SIZE, "%d\n", f01->properties.firmware_id);
 306}
 307
 308static DEVICE_ATTR(firmware_id, 0444, rmi_driver_firmware_id_show, NULL);
 309
 310static ssize_t rmi_driver_package_id_show(struct device *dev,
 311                                          struct device_attribute *dattr,
 312                                          char *buf)
 313{
 314        struct rmi_driver_data *data = dev_get_drvdata(dev);
 315        struct f01_data *f01 = dev_get_drvdata(&data->f01_container->dev);
 316
 317        u32 package_id = f01->properties.package_id;
 318
 319        return scnprintf(buf, PAGE_SIZE, "%04x.%04x\n",
 320                         package_id & 0xffff, (package_id >> 16) & 0xffff);
 321}
 322
 323static DEVICE_ATTR(package_id, 0444, rmi_driver_package_id_show, NULL);
 324
 325static struct attribute *rmi_f01_attrs[] = {
 326        &dev_attr_manufacturer_id.attr,
 327        &dev_attr_date_of_manufacture.attr,
 328        &dev_attr_product_id.attr,
 329        &dev_attr_firmware_id.attr,
 330        &dev_attr_package_id.attr,
 331        NULL
 332};
 333
 334static const struct attribute_group rmi_f01_attr_group = {
 335        .attrs = rmi_f01_attrs,
 336};
 337
 338#ifdef CONFIG_OF
 339static int rmi_f01_of_probe(struct device *dev,
 340                                struct rmi_device_platform_data *pdata)
 341{
 342        int retval;
 343        u32 val;
 344
 345        retval = rmi_of_property_read_u32(dev,
 346                        (u32 *)&pdata->power_management.nosleep,
 347                        "syna,nosleep-mode", 1);
 348        if (retval)
 349                return retval;
 350
 351        retval = rmi_of_property_read_u32(dev, &val,
 352                        "syna,wakeup-threshold", 1);
 353        if (retval)
 354                return retval;
 355
 356        pdata->power_management.wakeup_threshold = val;
 357
 358        retval = rmi_of_property_read_u32(dev, &val,
 359                        "syna,doze-holdoff-ms", 1);
 360        if (retval)
 361                return retval;
 362
 363        pdata->power_management.doze_holdoff = val * 100;
 364
 365        retval = rmi_of_property_read_u32(dev, &val,
 366                        "syna,doze-interval-ms", 1);
 367        if (retval)
 368                return retval;
 369
 370        pdata->power_management.doze_interval = val / 10;
 371
 372        return 0;
 373}
 374#else
 375static inline int rmi_f01_of_probe(struct device *dev,
 376                                        struct rmi_device_platform_data *pdata)
 377{
 378        return -ENODEV;
 379}
 380#endif
 381
 382static int rmi_f01_probe(struct rmi_function *fn)
 383{
 384        struct rmi_device *rmi_dev = fn->rmi_dev;
 385        struct rmi_driver_data *driver_data = dev_get_drvdata(&rmi_dev->dev);
 386        struct rmi_device_platform_data *pdata = rmi_get_platform_data(rmi_dev);
 387        struct f01_data *f01;
 388        int error;
 389        u16 ctrl_base_addr = fn->fd.control_base_addr;
 390        u8 device_status;
 391        u8 temp;
 392
 393        if (fn->dev.of_node) {
 394                error = rmi_f01_of_probe(&fn->dev, pdata);
 395                if (error)
 396                        return error;
 397        }
 398
 399        f01 = devm_kzalloc(&fn->dev, sizeof(struct f01_data), GFP_KERNEL);
 400        if (!f01)
 401                return -ENOMEM;
 402
 403        f01->num_of_irq_regs = driver_data->num_of_irq_regs;
 404
 405        /*
 406         * Set the configured bit and (optionally) other important stuff
 407         * in the device control register.
 408         */
 409
 410        error = rmi_read(rmi_dev, fn->fd.control_base_addr,
 411                         &f01->device_control.ctrl0);
 412        if (error) {
 413                dev_err(&fn->dev, "Failed to read F01 control: %d\n", error);
 414                return error;
 415        }
 416
 417        switch (pdata->power_management.nosleep) {
 418        case RMI_REG_STATE_DEFAULT:
 419                break;
 420        case RMI_REG_STATE_OFF:
 421                f01->device_control.ctrl0 &= ~RMI_F01_CTRL0_NOSLEEP_BIT;
 422                break;
 423        case RMI_REG_STATE_ON:
 424                f01->device_control.ctrl0 |= RMI_F01_CTRL0_NOSLEEP_BIT;
 425                break;
 426        }
 427
 428        /*
 429         * Sleep mode might be set as a hangover from a system crash or
 430         * reboot without power cycle.  If so, clear it so the sensor
 431         * is certain to function.
 432         */
 433        if ((f01->device_control.ctrl0 & RMI_F01_CTRL0_SLEEP_MODE_MASK) !=
 434                        RMI_SLEEP_MODE_NORMAL) {
 435                dev_warn(&fn->dev,
 436                         "WARNING: Non-zero sleep mode found. Clearing...\n");
 437                f01->device_control.ctrl0 &= ~RMI_F01_CTRL0_SLEEP_MODE_MASK;
 438        }
 439
 440        f01->device_control.ctrl0 |= RMI_F01_CTRL0_CONFIGURED_BIT;
 441
 442        error = rmi_write(rmi_dev, fn->fd.control_base_addr,
 443                          f01->device_control.ctrl0);
 444        if (error) {
 445                dev_err(&fn->dev, "Failed to write F01 control: %d\n", error);
 446                return error;
 447        }
 448
 449        /* Dummy read in order to clear irqs */
 450        error = rmi_read(rmi_dev, fn->fd.data_base_addr + 1, &temp);
 451        if (error < 0) {
 452                dev_err(&fn->dev, "Failed to read Interrupt Status.\n");
 453                return error;
 454        }
 455
 456        error = rmi_f01_read_properties(rmi_dev, fn->fd.query_base_addr,
 457                                        &f01->properties);
 458        if (error < 0) {
 459                dev_err(&fn->dev, "Failed to read F01 properties.\n");
 460                return error;
 461        }
 462
 463        dev_info(&fn->dev, "found RMI device, manufacturer: %s, product: %s, fw id: %d\n",
 464                 f01->properties.manufacturer_id == 1 ? "Synaptics" : "unknown",
 465                 f01->properties.product_id, f01->properties.firmware_id);
 466
 467        /* Advance to interrupt control registers, then skip over them. */
 468        ctrl_base_addr++;
 469        ctrl_base_addr += f01->num_of_irq_regs;
 470
 471        /* read control register */
 472        if (f01->properties.has_adjustable_doze) {
 473                f01->doze_interval_addr = ctrl_base_addr;
 474                ctrl_base_addr++;
 475
 476                if (pdata->power_management.doze_interval) {
 477                        f01->device_control.doze_interval =
 478                                pdata->power_management.doze_interval;
 479                        error = rmi_write(rmi_dev, f01->doze_interval_addr,
 480                                          f01->device_control.doze_interval);
 481                        if (error) {
 482                                dev_err(&fn->dev,
 483                                        "Failed to configure F01 doze interval register: %d\n",
 484                                        error);
 485                                return error;
 486                        }
 487                } else {
 488                        error = rmi_read(rmi_dev, f01->doze_interval_addr,
 489                                         &f01->device_control.doze_interval);
 490                        if (error) {
 491                                dev_err(&fn->dev,
 492                                        "Failed to read F01 doze interval register: %d\n",
 493                                        error);
 494                                return error;
 495                        }
 496                }
 497
 498                f01->wakeup_threshold_addr = ctrl_base_addr;
 499                ctrl_base_addr++;
 500
 501                if (pdata->power_management.wakeup_threshold) {
 502                        f01->device_control.wakeup_threshold =
 503                                pdata->power_management.wakeup_threshold;
 504                        error = rmi_write(rmi_dev, f01->wakeup_threshold_addr,
 505                                          f01->device_control.wakeup_threshold);
 506                        if (error) {
 507                                dev_err(&fn->dev,
 508                                        "Failed to configure F01 wakeup threshold register: %d\n",
 509                                        error);
 510                                return error;
 511                        }
 512                } else {
 513                        error = rmi_read(rmi_dev, f01->wakeup_threshold_addr,
 514                                         &f01->device_control.wakeup_threshold);
 515                        if (error < 0) {
 516                                dev_err(&fn->dev,
 517                                        "Failed to read F01 wakeup threshold register: %d\n",
 518                                        error);
 519                                return error;
 520                        }
 521                }
 522        }
 523
 524        if (f01->properties.has_lts)
 525                ctrl_base_addr++;
 526
 527        if (f01->properties.has_adjustable_doze_holdoff) {
 528                f01->doze_holdoff_addr = ctrl_base_addr;
 529                ctrl_base_addr++;
 530
 531                if (pdata->power_management.doze_holdoff) {
 532                        f01->device_control.doze_holdoff =
 533                                pdata->power_management.doze_holdoff;
 534                        error = rmi_write(rmi_dev, f01->doze_holdoff_addr,
 535                                          f01->device_control.doze_holdoff);
 536                        if (error) {
 537                                dev_err(&fn->dev,
 538                                        "Failed to configure F01 doze holdoff register: %d\n",
 539                                        error);
 540                                return error;
 541                        }
 542                } else {
 543                        error = rmi_read(rmi_dev, f01->doze_holdoff_addr,
 544                                         &f01->device_control.doze_holdoff);
 545                        if (error) {
 546                                dev_err(&fn->dev,
 547                                        "Failed to read F01 doze holdoff register: %d\n",
 548                                        error);
 549                                return error;
 550                        }
 551                }
 552        }
 553
 554        error = rmi_read(rmi_dev, fn->fd.data_base_addr, &device_status);
 555        if (error < 0) {
 556                dev_err(&fn->dev,
 557                        "Failed to read device status: %d\n", error);
 558                return error;
 559        }
 560
 561        if (RMI_F01_STATUS_UNCONFIGURED(device_status)) {
 562                dev_err(&fn->dev,
 563                        "Device was reset during configuration process, status: %#02x!\n",
 564                        RMI_F01_STATUS_CODE(device_status));
 565                return -EINVAL;
 566        }
 567
 568        dev_set_drvdata(&fn->dev, f01);
 569
 570        error = sysfs_create_group(&fn->rmi_dev->dev.kobj, &rmi_f01_attr_group);
 571        if (error)
 572                dev_warn(&fn->dev, "Failed to create sysfs group: %d\n", error);
 573
 574        return 0;
 575}
 576
 577static void rmi_f01_remove(struct rmi_function *fn)
 578{
 579        /* Note that the bus device is used, not the F01 device */
 580        sysfs_remove_group(&fn->rmi_dev->dev.kobj, &rmi_f01_attr_group);
 581}
 582
 583static int rmi_f01_config(struct rmi_function *fn)
 584{
 585        struct f01_data *f01 = dev_get_drvdata(&fn->dev);
 586        int error;
 587
 588        error = rmi_write(fn->rmi_dev, fn->fd.control_base_addr,
 589                          f01->device_control.ctrl0);
 590        if (error) {
 591                dev_err(&fn->dev,
 592                        "Failed to write device_control register: %d\n", error);
 593                return error;
 594        }
 595
 596        if (f01->properties.has_adjustable_doze) {
 597                error = rmi_write(fn->rmi_dev, f01->doze_interval_addr,
 598                                  f01->device_control.doze_interval);
 599                if (error) {
 600                        dev_err(&fn->dev,
 601                                "Failed to write doze interval: %d\n", error);
 602                        return error;
 603                }
 604
 605                error = rmi_write_block(fn->rmi_dev,
 606                                         f01->wakeup_threshold_addr,
 607                                         &f01->device_control.wakeup_threshold,
 608                                         sizeof(u8));
 609                if (error) {
 610                        dev_err(&fn->dev,
 611                                "Failed to write wakeup threshold: %d\n",
 612                                error);
 613                        return error;
 614                }
 615        }
 616
 617        if (f01->properties.has_adjustable_doze_holdoff) {
 618                error = rmi_write(fn->rmi_dev, f01->doze_holdoff_addr,
 619                                  f01->device_control.doze_holdoff);
 620                if (error) {
 621                        dev_err(&fn->dev,
 622                                "Failed to write doze holdoff: %d\n", error);
 623                        return error;
 624                }
 625        }
 626
 627        return 0;
 628}
 629
 630static int rmi_f01_suspend(struct rmi_function *fn)
 631{
 632        struct f01_data *f01 = dev_get_drvdata(&fn->dev);
 633        int error;
 634
 635        f01->old_nosleep =
 636                f01->device_control.ctrl0 & RMI_F01_CTRL0_NOSLEEP_BIT;
 637        f01->device_control.ctrl0 &= ~RMI_F01_CTRL0_NOSLEEP_BIT;
 638
 639        f01->device_control.ctrl0 &= ~RMI_F01_CTRL0_SLEEP_MODE_MASK;
 640        if (device_may_wakeup(fn->rmi_dev->xport->dev))
 641                f01->device_control.ctrl0 |= RMI_SLEEP_MODE_RESERVED1;
 642        else
 643                f01->device_control.ctrl0 |= RMI_SLEEP_MODE_SENSOR_SLEEP;
 644
 645        error = rmi_write(fn->rmi_dev, fn->fd.control_base_addr,
 646                          f01->device_control.ctrl0);
 647        if (error) {
 648                dev_err(&fn->dev, "Failed to write sleep mode: %d.\n", error);
 649                if (f01->old_nosleep)
 650                        f01->device_control.ctrl0 |= RMI_F01_CTRL0_NOSLEEP_BIT;
 651                f01->device_control.ctrl0 &= ~RMI_F01_CTRL0_SLEEP_MODE_MASK;
 652                f01->device_control.ctrl0 |= RMI_SLEEP_MODE_NORMAL;
 653                return error;
 654        }
 655
 656        return 0;
 657}
 658
 659static int rmi_f01_resume(struct rmi_function *fn)
 660{
 661        struct f01_data *f01 = dev_get_drvdata(&fn->dev);
 662        int error;
 663
 664        if (f01->old_nosleep)
 665                f01->device_control.ctrl0 |= RMI_F01_CTRL0_NOSLEEP_BIT;
 666
 667        f01->device_control.ctrl0 &= ~RMI_F01_CTRL0_SLEEP_MODE_MASK;
 668        f01->device_control.ctrl0 |= RMI_SLEEP_MODE_NORMAL;
 669
 670        error = rmi_write(fn->rmi_dev, fn->fd.control_base_addr,
 671                          f01->device_control.ctrl0);
 672        if (error) {
 673                dev_err(&fn->dev,
 674                        "Failed to restore normal operation: %d.\n", error);
 675                return error;
 676        }
 677
 678        return 0;
 679}
 680
 681static irqreturn_t rmi_f01_attention(int irq, void *ctx)
 682{
 683        struct rmi_function *fn = ctx;
 684        struct rmi_device *rmi_dev = fn->rmi_dev;
 685        int error;
 686        u8 device_status;
 687
 688        error = rmi_read(rmi_dev, fn->fd.data_base_addr, &device_status);
 689        if (error) {
 690                dev_err(&fn->dev,
 691                        "Failed to read device status: %d.\n", error);
 692                return IRQ_RETVAL(error);
 693        }
 694
 695        if (RMI_F01_STATUS_BOOTLOADER(device_status))
 696                dev_warn(&fn->dev,
 697                         "Device in bootloader mode, please update firmware\n");
 698
 699        if (RMI_F01_STATUS_UNCONFIGURED(device_status)) {
 700                dev_warn(&fn->dev, "Device reset detected.\n");
 701                error = rmi_dev->driver->reset_handler(rmi_dev);
 702                if (error) {
 703                        dev_err(&fn->dev, "Device reset failed: %d\n", error);
 704                        return IRQ_RETVAL(error);
 705                }
 706        }
 707
 708        return IRQ_HANDLED;
 709}
 710
 711struct rmi_function_handler rmi_f01_handler = {
 712        .driver = {
 713                .name   = "rmi4_f01",
 714                /*
 715                 * Do not allow user unbinding F01 as it is critical
 716                 * function.
 717                 */
 718                .suppress_bind_attrs = true,
 719        },
 720        .func           = 0x01,
 721        .probe          = rmi_f01_probe,
 722        .remove         = rmi_f01_remove,
 723        .config         = rmi_f01_config,
 724        .attention      = rmi_f01_attention,
 725        .suspend        = rmi_f01_suspend,
 726        .resume         = rmi_f01_resume,
 727};
 728