linux/drivers/hid/hid-cp2112.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * hid-cp2112.c - Silicon Labs HID USB to SMBus master bridge
   4 * Copyright (c) 2013,2014 Uplogix, Inc.
   5 * David Barksdale <dbarksdale@uplogix.com>
   6 */
   7
   8/*
   9 * The Silicon Labs CP2112 chip is a USB HID device which provides an
  10 * SMBus controller for talking to slave devices and 8 GPIO pins. The
  11 * host communicates with the CP2112 via raw HID reports.
  12 *
  13 * Data Sheet:
  14 *   https://www.silabs.com/Support%20Documents/TechnicalDocs/CP2112.pdf
  15 * Programming Interface Specification:
  16 *   https://www.silabs.com/documents/public/application-notes/an495-cp2112-interface-specification.pdf
  17 */
  18
  19#include <linux/gpio/consumer.h>
  20#include <linux/gpio/machine.h>
  21#include <linux/gpio/driver.h>
  22#include <linux/hid.h>
  23#include <linux/hidraw.h>
  24#include <linux/i2c.h>
  25#include <linux/module.h>
  26#include <linux/nls.h>
  27#include <linux/usb/ch9.h>
  28#include "hid-ids.h"
  29
  30#define CP2112_REPORT_MAX_LENGTH                64
  31#define CP2112_GPIO_CONFIG_LENGTH               5
  32#define CP2112_GPIO_GET_LENGTH                  2
  33#define CP2112_GPIO_SET_LENGTH                  3
  34
  35enum {
  36        CP2112_GPIO_CONFIG              = 0x02,
  37        CP2112_GPIO_GET                 = 0x03,
  38        CP2112_GPIO_SET                 = 0x04,
  39        CP2112_GET_VERSION_INFO         = 0x05,
  40        CP2112_SMBUS_CONFIG             = 0x06,
  41        CP2112_DATA_READ_REQUEST        = 0x10,
  42        CP2112_DATA_WRITE_READ_REQUEST  = 0x11,
  43        CP2112_DATA_READ_FORCE_SEND     = 0x12,
  44        CP2112_DATA_READ_RESPONSE       = 0x13,
  45        CP2112_DATA_WRITE_REQUEST       = 0x14,
  46        CP2112_TRANSFER_STATUS_REQUEST  = 0x15,
  47        CP2112_TRANSFER_STATUS_RESPONSE = 0x16,
  48        CP2112_CANCEL_TRANSFER          = 0x17,
  49        CP2112_LOCK_BYTE                = 0x20,
  50        CP2112_USB_CONFIG               = 0x21,
  51        CP2112_MANUFACTURER_STRING      = 0x22,
  52        CP2112_PRODUCT_STRING           = 0x23,
  53        CP2112_SERIAL_STRING            = 0x24,
  54};
  55
  56enum {
  57        STATUS0_IDLE            = 0x00,
  58        STATUS0_BUSY            = 0x01,
  59        STATUS0_COMPLETE        = 0x02,
  60        STATUS0_ERROR           = 0x03,
  61};
  62
  63enum {
  64        STATUS1_TIMEOUT_NACK            = 0x00,
  65        STATUS1_TIMEOUT_BUS             = 0x01,
  66        STATUS1_ARBITRATION_LOST        = 0x02,
  67        STATUS1_READ_INCOMPLETE         = 0x03,
  68        STATUS1_WRITE_INCOMPLETE        = 0x04,
  69        STATUS1_SUCCESS                 = 0x05,
  70};
  71
  72struct cp2112_smbus_config_report {
  73        u8 report;              /* CP2112_SMBUS_CONFIG */
  74        __be32 clock_speed;     /* Hz */
  75        u8 device_address;      /* Stored in the upper 7 bits */
  76        u8 auto_send_read;      /* 1 = enabled, 0 = disabled */
  77        __be16 write_timeout;   /* ms, 0 = no timeout */
  78        __be16 read_timeout;    /* ms, 0 = no timeout */
  79        u8 scl_low_timeout;     /* 1 = enabled, 0 = disabled */
  80        __be16 retry_time;      /* # of retries, 0 = no limit */
  81} __packed;
  82
  83struct cp2112_usb_config_report {
  84        u8 report;      /* CP2112_USB_CONFIG */
  85        __le16 vid;     /* Vendor ID */
  86        __le16 pid;     /* Product ID */
  87        u8 max_power;   /* Power requested in 2mA units */
  88        u8 power_mode;  /* 0x00 = bus powered
  89                           0x01 = self powered & regulator off
  90                           0x02 = self powered & regulator on */
  91        u8 release_major;
  92        u8 release_minor;
  93        u8 mask;        /* What fields to program */
  94} __packed;
  95
  96struct cp2112_read_req_report {
  97        u8 report;      /* CP2112_DATA_READ_REQUEST */
  98        u8 slave_address;
  99        __be16 length;
 100} __packed;
 101
 102struct cp2112_write_read_req_report {
 103        u8 report;      /* CP2112_DATA_WRITE_READ_REQUEST */
 104        u8 slave_address;
 105        __be16 length;
 106        u8 target_address_length;
 107        u8 target_address[16];
 108} __packed;
 109
 110struct cp2112_write_req_report {
 111        u8 report;      /* CP2112_DATA_WRITE_REQUEST */
 112        u8 slave_address;
 113        u8 length;
 114        u8 data[61];
 115} __packed;
 116
 117struct cp2112_force_read_report {
 118        u8 report;      /* CP2112_DATA_READ_FORCE_SEND */
 119        __be16 length;
 120} __packed;
 121
 122struct cp2112_xfer_status_report {
 123        u8 report;      /* CP2112_TRANSFER_STATUS_RESPONSE */
 124        u8 status0;     /* STATUS0_* */
 125        u8 status1;     /* STATUS1_* */
 126        __be16 retries;
 127        __be16 length;
 128} __packed;
 129
 130struct cp2112_string_report {
 131        u8 dummy;               /* force .string to be aligned */
 132        u8 report;              /* CP2112_*_STRING */
 133        u8 length;              /* length in bytes of everyting after .report */
 134        u8 type;                /* USB_DT_STRING */
 135        wchar_t string[30];     /* UTF16_LITTLE_ENDIAN string */
 136} __packed;
 137
 138/* Number of times to request transfer status before giving up waiting for a
 139   transfer to complete. This may need to be changed if SMBUS clock, retries,
 140   or read/write/scl_low timeout settings are changed. */
 141static const int XFER_STATUS_RETRIES = 10;
 142
 143/* Time in ms to wait for a CP2112_DATA_READ_RESPONSE or
 144   CP2112_TRANSFER_STATUS_RESPONSE. */
 145static const int RESPONSE_TIMEOUT = 50;
 146
 147static const struct hid_device_id cp2112_devices[] = {
 148        { HID_USB_DEVICE(USB_VENDOR_ID_CYGNAL, USB_DEVICE_ID_CYGNAL_CP2112) },
 149        { }
 150};
 151MODULE_DEVICE_TABLE(hid, cp2112_devices);
 152
 153struct cp2112_device {
 154        struct i2c_adapter adap;
 155        struct hid_device *hdev;
 156        wait_queue_head_t wait;
 157        u8 read_data[61];
 158        u8 read_length;
 159        u8 hwversion;
 160        int xfer_status;
 161        atomic_t read_avail;
 162        atomic_t xfer_avail;
 163        struct gpio_chip gc;
 164        struct irq_chip irq;
 165        u8 *in_out_buffer;
 166        struct mutex lock;
 167
 168        struct gpio_desc *desc[8];
 169        bool gpio_poll;
 170        struct delayed_work gpio_poll_worker;
 171        unsigned long irq_mask;
 172        u8 gpio_prev_state;
 173};
 174
 175static int gpio_push_pull = 0xFF;
 176module_param(gpio_push_pull, int, S_IRUGO | S_IWUSR);
 177MODULE_PARM_DESC(gpio_push_pull, "GPIO push-pull configuration bitmask");
 178
 179static int cp2112_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
 180{
 181        struct cp2112_device *dev = gpiochip_get_data(chip);
 182        struct hid_device *hdev = dev->hdev;
 183        u8 *buf = dev->in_out_buffer;
 184        int ret;
 185
 186        mutex_lock(&dev->lock);
 187
 188        ret = hid_hw_raw_request(hdev, CP2112_GPIO_CONFIG, buf,
 189                                 CP2112_GPIO_CONFIG_LENGTH, HID_FEATURE_REPORT,
 190                                 HID_REQ_GET_REPORT);
 191        if (ret != CP2112_GPIO_CONFIG_LENGTH) {
 192                hid_err(hdev, "error requesting GPIO config: %d\n", ret);
 193                if (ret >= 0)
 194                        ret = -EIO;
 195                goto exit;
 196        }
 197
 198        buf[1] &= ~(1 << offset);
 199        buf[2] = gpio_push_pull;
 200
 201        ret = hid_hw_raw_request(hdev, CP2112_GPIO_CONFIG, buf,
 202                                 CP2112_GPIO_CONFIG_LENGTH, HID_FEATURE_REPORT,
 203                                 HID_REQ_SET_REPORT);
 204        if (ret != CP2112_GPIO_CONFIG_LENGTH) {
 205                hid_err(hdev, "error setting GPIO config: %d\n", ret);
 206                if (ret >= 0)
 207                        ret = -EIO;
 208                goto exit;
 209        }
 210
 211        ret = 0;
 212
 213exit:
 214        mutex_unlock(&dev->lock);
 215        return ret;
 216}
 217
 218static void cp2112_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
 219{
 220        struct cp2112_device *dev = gpiochip_get_data(chip);
 221        struct hid_device *hdev = dev->hdev;
 222        u8 *buf = dev->in_out_buffer;
 223        int ret;
 224
 225        mutex_lock(&dev->lock);
 226
 227        buf[0] = CP2112_GPIO_SET;
 228        buf[1] = value ? 0xff : 0;
 229        buf[2] = 1 << offset;
 230
 231        ret = hid_hw_raw_request(hdev, CP2112_GPIO_SET, buf,
 232                                 CP2112_GPIO_SET_LENGTH, HID_FEATURE_REPORT,
 233                                 HID_REQ_SET_REPORT);
 234        if (ret < 0)
 235                hid_err(hdev, "error setting GPIO values: %d\n", ret);
 236
 237        mutex_unlock(&dev->lock);
 238}
 239
 240static int cp2112_gpio_get_all(struct gpio_chip *chip)
 241{
 242        struct cp2112_device *dev = gpiochip_get_data(chip);
 243        struct hid_device *hdev = dev->hdev;
 244        u8 *buf = dev->in_out_buffer;
 245        int ret;
 246
 247        mutex_lock(&dev->lock);
 248
 249        ret = hid_hw_raw_request(hdev, CP2112_GPIO_GET, buf,
 250                                 CP2112_GPIO_GET_LENGTH, HID_FEATURE_REPORT,
 251                                 HID_REQ_GET_REPORT);
 252        if (ret != CP2112_GPIO_GET_LENGTH) {
 253                hid_err(hdev, "error requesting GPIO values: %d\n", ret);
 254                ret = ret < 0 ? ret : -EIO;
 255                goto exit;
 256        }
 257
 258        ret = buf[1];
 259
 260exit:
 261        mutex_unlock(&dev->lock);
 262
 263        return ret;
 264}
 265
 266static int cp2112_gpio_get(struct gpio_chip *chip, unsigned int offset)
 267{
 268        int ret;
 269
 270        ret = cp2112_gpio_get_all(chip);
 271        if (ret < 0)
 272                return ret;
 273
 274        return (ret >> offset) & 1;
 275}
 276
 277static int cp2112_gpio_direction_output(struct gpio_chip *chip,
 278                                        unsigned offset, int value)
 279{
 280        struct cp2112_device *dev = gpiochip_get_data(chip);
 281        struct hid_device *hdev = dev->hdev;
 282        u8 *buf = dev->in_out_buffer;
 283        int ret;
 284
 285        mutex_lock(&dev->lock);
 286
 287        ret = hid_hw_raw_request(hdev, CP2112_GPIO_CONFIG, buf,
 288                                 CP2112_GPIO_CONFIG_LENGTH, HID_FEATURE_REPORT,
 289                                 HID_REQ_GET_REPORT);
 290        if (ret != CP2112_GPIO_CONFIG_LENGTH) {
 291                hid_err(hdev, "error requesting GPIO config: %d\n", ret);
 292                goto fail;
 293        }
 294
 295        buf[1] |= 1 << offset;
 296        buf[2] = gpio_push_pull;
 297
 298        ret = hid_hw_raw_request(hdev, CP2112_GPIO_CONFIG, buf,
 299                                 CP2112_GPIO_CONFIG_LENGTH, HID_FEATURE_REPORT,
 300                                 HID_REQ_SET_REPORT);
 301        if (ret < 0) {
 302                hid_err(hdev, "error setting GPIO config: %d\n", ret);
 303                goto fail;
 304        }
 305
 306        mutex_unlock(&dev->lock);
 307
 308        /*
 309         * Set gpio value when output direction is already set,
 310         * as specified in AN495, Rev. 0.2, cpt. 4.4
 311         */
 312        cp2112_gpio_set(chip, offset, value);
 313
 314        return 0;
 315
 316fail:
 317        mutex_unlock(&dev->lock);
 318        return ret < 0 ? ret : -EIO;
 319}
 320
 321static int cp2112_hid_get(struct hid_device *hdev, unsigned char report_number,
 322                          u8 *data, size_t count, unsigned char report_type)
 323{
 324        u8 *buf;
 325        int ret;
 326
 327        buf = kmalloc(count, GFP_KERNEL);
 328        if (!buf)
 329                return -ENOMEM;
 330
 331        ret = hid_hw_raw_request(hdev, report_number, buf, count,
 332                                       report_type, HID_REQ_GET_REPORT);
 333        memcpy(data, buf, count);
 334        kfree(buf);
 335        return ret;
 336}
 337
 338static int cp2112_hid_output(struct hid_device *hdev, u8 *data, size_t count,
 339                             unsigned char report_type)
 340{
 341        u8 *buf;
 342        int ret;
 343
 344        buf = kmemdup(data, count, GFP_KERNEL);
 345        if (!buf)
 346                return -ENOMEM;
 347
 348        if (report_type == HID_OUTPUT_REPORT)
 349                ret = hid_hw_output_report(hdev, buf, count);
 350        else
 351                ret = hid_hw_raw_request(hdev, buf[0], buf, count, report_type,
 352                                HID_REQ_SET_REPORT);
 353
 354        kfree(buf);
 355        return ret;
 356}
 357
 358static int cp2112_wait(struct cp2112_device *dev, atomic_t *avail)
 359{
 360        int ret = 0;
 361
 362        /* We have sent either a CP2112_TRANSFER_STATUS_REQUEST or a
 363         * CP2112_DATA_READ_FORCE_SEND and we are waiting for the response to
 364         * come in cp2112_raw_event or timeout. There will only be one of these
 365         * in flight at any one time. The timeout is extremely large and is a
 366         * last resort if the CP2112 has died. If we do timeout we don't expect
 367         * to receive the response which would cause data races, it's not like
 368         * we can do anything about it anyway.
 369         */
 370        ret = wait_event_interruptible_timeout(dev->wait,
 371                atomic_read(avail), msecs_to_jiffies(RESPONSE_TIMEOUT));
 372        if (-ERESTARTSYS == ret)
 373                return ret;
 374        if (!ret)
 375                return -ETIMEDOUT;
 376
 377        atomic_set(avail, 0);
 378        return 0;
 379}
 380
 381static int cp2112_xfer_status(struct cp2112_device *dev)
 382{
 383        struct hid_device *hdev = dev->hdev;
 384        u8 buf[2];
 385        int ret;
 386
 387        buf[0] = CP2112_TRANSFER_STATUS_REQUEST;
 388        buf[1] = 0x01;
 389        atomic_set(&dev->xfer_avail, 0);
 390
 391        ret = cp2112_hid_output(hdev, buf, 2, HID_OUTPUT_REPORT);
 392        if (ret < 0) {
 393                hid_warn(hdev, "Error requesting status: %d\n", ret);
 394                return ret;
 395        }
 396
 397        ret = cp2112_wait(dev, &dev->xfer_avail);
 398        if (ret)
 399                return ret;
 400
 401        return dev->xfer_status;
 402}
 403
 404static int cp2112_read(struct cp2112_device *dev, u8 *data, size_t size)
 405{
 406        struct hid_device *hdev = dev->hdev;
 407        struct cp2112_force_read_report report;
 408        int ret;
 409
 410        if (size > sizeof(dev->read_data))
 411                size = sizeof(dev->read_data);
 412        report.report = CP2112_DATA_READ_FORCE_SEND;
 413        report.length = cpu_to_be16(size);
 414
 415        atomic_set(&dev->read_avail, 0);
 416
 417        ret = cp2112_hid_output(hdev, &report.report, sizeof(report),
 418                                HID_OUTPUT_REPORT);
 419        if (ret < 0) {
 420                hid_warn(hdev, "Error requesting data: %d\n", ret);
 421                return ret;
 422        }
 423
 424        ret = cp2112_wait(dev, &dev->read_avail);
 425        if (ret)
 426                return ret;
 427
 428        hid_dbg(hdev, "read %d of %zd bytes requested\n",
 429                dev->read_length, size);
 430
 431        if (size > dev->read_length)
 432                size = dev->read_length;
 433
 434        memcpy(data, dev->read_data, size);
 435        return dev->read_length;
 436}
 437
 438static int cp2112_read_req(void *buf, u8 slave_address, u16 length)
 439{
 440        struct cp2112_read_req_report *report = buf;
 441
 442        if (length < 1 || length > 512)
 443                return -EINVAL;
 444
 445        report->report = CP2112_DATA_READ_REQUEST;
 446        report->slave_address = slave_address << 1;
 447        report->length = cpu_to_be16(length);
 448        return sizeof(*report);
 449}
 450
 451static int cp2112_write_read_req(void *buf, u8 slave_address, u16 length,
 452                                 u8 command, u8 *data, u8 data_length)
 453{
 454        struct cp2112_write_read_req_report *report = buf;
 455
 456        if (length < 1 || length > 512
 457            || data_length > sizeof(report->target_address) - 1)
 458                return -EINVAL;
 459
 460        report->report = CP2112_DATA_WRITE_READ_REQUEST;
 461        report->slave_address = slave_address << 1;
 462        report->length = cpu_to_be16(length);
 463        report->target_address_length = data_length + 1;
 464        report->target_address[0] = command;
 465        memcpy(&report->target_address[1], data, data_length);
 466        return data_length + 6;
 467}
 468
 469static int cp2112_write_req(void *buf, u8 slave_address, u8 command, u8 *data,
 470                            u8 data_length)
 471{
 472        struct cp2112_write_req_report *report = buf;
 473
 474        if (data_length > sizeof(report->data) - 1)
 475                return -EINVAL;
 476
 477        report->report = CP2112_DATA_WRITE_REQUEST;
 478        report->slave_address = slave_address << 1;
 479        report->length = data_length + 1;
 480        report->data[0] = command;
 481        memcpy(&report->data[1], data, data_length);
 482        return data_length + 4;
 483}
 484
 485static int cp2112_i2c_write_req(void *buf, u8 slave_address, u8 *data,
 486                                u8 data_length)
 487{
 488        struct cp2112_write_req_report *report = buf;
 489
 490        if (data_length > sizeof(report->data))
 491                return -EINVAL;
 492
 493        report->report = CP2112_DATA_WRITE_REQUEST;
 494        report->slave_address = slave_address << 1;
 495        report->length = data_length;
 496        memcpy(report->data, data, data_length);
 497        return data_length + 3;
 498}
 499
 500static int cp2112_i2c_write_read_req(void *buf, u8 slave_address,
 501                                     u8 *addr, int addr_length,
 502                                     int read_length)
 503{
 504        struct cp2112_write_read_req_report *report = buf;
 505
 506        if (read_length < 1 || read_length > 512 ||
 507            addr_length > sizeof(report->target_address))
 508                return -EINVAL;
 509
 510        report->report = CP2112_DATA_WRITE_READ_REQUEST;
 511        report->slave_address = slave_address << 1;
 512        report->length = cpu_to_be16(read_length);
 513        report->target_address_length = addr_length;
 514        memcpy(report->target_address, addr, addr_length);
 515        return addr_length + 5;
 516}
 517
 518static int cp2112_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs,
 519                           int num)
 520{
 521        struct cp2112_device *dev = (struct cp2112_device *)adap->algo_data;
 522        struct hid_device *hdev = dev->hdev;
 523        u8 buf[64];
 524        ssize_t count;
 525        ssize_t read_length = 0;
 526        u8 *read_buf = NULL;
 527        unsigned int retries;
 528        int ret;
 529
 530        hid_dbg(hdev, "I2C %d messages\n", num);
 531
 532        if (num == 1) {
 533                if (msgs->flags & I2C_M_RD) {
 534                        hid_dbg(hdev, "I2C read %#04x len %d\n",
 535                                msgs->addr, msgs->len);
 536                        read_length = msgs->len;
 537                        read_buf = msgs->buf;
 538                        count = cp2112_read_req(buf, msgs->addr, msgs->len);
 539                } else {
 540                        hid_dbg(hdev, "I2C write %#04x len %d\n",
 541                                msgs->addr, msgs->len);
 542                        count = cp2112_i2c_write_req(buf, msgs->addr,
 543                                                     msgs->buf, msgs->len);
 544                }
 545                if (count < 0)
 546                        return count;
 547        } else if (dev->hwversion > 1 &&  /* no repeated start in rev 1 */
 548                   num == 2 &&
 549                   msgs[0].addr == msgs[1].addr &&
 550                   !(msgs[0].flags & I2C_M_RD) && (msgs[1].flags & I2C_M_RD)) {
 551                hid_dbg(hdev, "I2C write-read %#04x wlen %d rlen %d\n",
 552                        msgs[0].addr, msgs[0].len, msgs[1].len);
 553                read_length = msgs[1].len;
 554                read_buf = msgs[1].buf;
 555                count = cp2112_i2c_write_read_req(buf, msgs[0].addr,
 556                                msgs[0].buf, msgs[0].len, msgs[1].len);
 557                if (count < 0)
 558                        return count;
 559        } else {
 560                hid_err(hdev,
 561                        "Multi-message I2C transactions not supported\n");
 562                return -EOPNOTSUPP;
 563        }
 564
 565        ret = hid_hw_power(hdev, PM_HINT_FULLON);
 566        if (ret < 0) {
 567                hid_err(hdev, "power management error: %d\n", ret);
 568                return ret;
 569        }
 570
 571        ret = cp2112_hid_output(hdev, buf, count, HID_OUTPUT_REPORT);
 572        if (ret < 0) {
 573                hid_warn(hdev, "Error starting transaction: %d\n", ret);
 574                goto power_normal;
 575        }
 576
 577        for (retries = 0; retries < XFER_STATUS_RETRIES; ++retries) {
 578                ret = cp2112_xfer_status(dev);
 579                if (-EBUSY == ret)
 580                        continue;
 581                if (ret < 0)
 582                        goto power_normal;
 583                break;
 584        }
 585
 586        if (XFER_STATUS_RETRIES <= retries) {
 587                hid_warn(hdev, "Transfer timed out, cancelling.\n");
 588                buf[0] = CP2112_CANCEL_TRANSFER;
 589                buf[1] = 0x01;
 590
 591                ret = cp2112_hid_output(hdev, buf, 2, HID_OUTPUT_REPORT);
 592                if (ret < 0)
 593                        hid_warn(hdev, "Error cancelling transaction: %d\n",
 594                                 ret);
 595
 596                ret = -ETIMEDOUT;
 597                goto power_normal;
 598        }
 599
 600        for (count = 0; count < read_length;) {
 601                ret = cp2112_read(dev, read_buf + count, read_length - count);
 602                if (ret < 0)
 603                        goto power_normal;
 604                if (ret == 0) {
 605                        hid_err(hdev, "read returned 0\n");
 606                        ret = -EIO;
 607                        goto power_normal;
 608                }
 609                count += ret;
 610                if (count > read_length) {
 611                        /*
 612                         * The hardware returned too much data.
 613                         * This is mostly harmless because cp2112_read()
 614                         * has a limit check so didn't overrun our
 615                         * buffer.  Nevertheless, we return an error
 616                         * because something is seriously wrong and
 617                         * it shouldn't go unnoticed.
 618                         */
 619                        hid_err(hdev, "long read: %d > %zd\n",
 620                                ret, read_length - count + ret);
 621                        ret = -EIO;
 622                        goto power_normal;
 623                }
 624        }
 625
 626        /* return the number of transferred messages */
 627        ret = num;
 628
 629power_normal:
 630        hid_hw_power(hdev, PM_HINT_NORMAL);
 631        hid_dbg(hdev, "I2C transfer finished: %d\n", ret);
 632        return ret;
 633}
 634
 635static int cp2112_xfer(struct i2c_adapter *adap, u16 addr,
 636                       unsigned short flags, char read_write, u8 command,
 637                       int size, union i2c_smbus_data *data)
 638{
 639        struct cp2112_device *dev = (struct cp2112_device *)adap->algo_data;
 640        struct hid_device *hdev = dev->hdev;
 641        u8 buf[64];
 642        __le16 word;
 643        ssize_t count;
 644        size_t read_length = 0;
 645        unsigned int retries;
 646        int ret;
 647
 648        hid_dbg(hdev, "%s addr 0x%x flags 0x%x cmd 0x%x size %d\n",
 649                read_write == I2C_SMBUS_WRITE ? "write" : "read",
 650                addr, flags, command, size);
 651
 652        switch (size) {
 653        case I2C_SMBUS_BYTE:
 654                read_length = 1;
 655
 656                if (I2C_SMBUS_READ == read_write)
 657                        count = cp2112_read_req(buf, addr, read_length);
 658                else
 659                        count = cp2112_write_req(buf, addr, command, NULL,
 660                                                 0);
 661                break;
 662        case I2C_SMBUS_BYTE_DATA:
 663                read_length = 1;
 664
 665                if (I2C_SMBUS_READ == read_write)
 666                        count = cp2112_write_read_req(buf, addr, read_length,
 667                                                      command, NULL, 0);
 668                else
 669                        count = cp2112_write_req(buf, addr, command,
 670                                                 &data->byte, 1);
 671                break;
 672        case I2C_SMBUS_WORD_DATA:
 673                read_length = 2;
 674                word = cpu_to_le16(data->word);
 675
 676                if (I2C_SMBUS_READ == read_write)
 677                        count = cp2112_write_read_req(buf, addr, read_length,
 678                                                      command, NULL, 0);
 679                else
 680                        count = cp2112_write_req(buf, addr, command,
 681                                                 (u8 *)&word, 2);
 682                break;
 683        case I2C_SMBUS_PROC_CALL:
 684                size = I2C_SMBUS_WORD_DATA;
 685                read_write = I2C_SMBUS_READ;
 686                read_length = 2;
 687                word = cpu_to_le16(data->word);
 688
 689                count = cp2112_write_read_req(buf, addr, read_length, command,
 690                                              (u8 *)&word, 2);
 691                break;
 692        case I2C_SMBUS_I2C_BLOCK_DATA:
 693                if (read_write == I2C_SMBUS_READ) {
 694                        read_length = data->block[0];
 695                        count = cp2112_write_read_req(buf, addr, read_length,
 696                                                      command, NULL, 0);
 697                } else {
 698                        count = cp2112_write_req(buf, addr, command,
 699                                                 data->block + 1,
 700                                                 data->block[0]);
 701                }
 702                break;
 703        case I2C_SMBUS_BLOCK_DATA:
 704                if (I2C_SMBUS_READ == read_write) {
 705                        count = cp2112_write_read_req(buf, addr,
 706                                                      I2C_SMBUS_BLOCK_MAX,
 707                                                      command, NULL, 0);
 708                } else {
 709                        count = cp2112_write_req(buf, addr, command,
 710                                                 data->block,
 711                                                 data->block[0] + 1);
 712                }
 713                break;
 714        case I2C_SMBUS_BLOCK_PROC_CALL:
 715                size = I2C_SMBUS_BLOCK_DATA;
 716                read_write = I2C_SMBUS_READ;
 717
 718                count = cp2112_write_read_req(buf, addr, I2C_SMBUS_BLOCK_MAX,
 719                                              command, data->block,
 720                                              data->block[0] + 1);
 721                break;
 722        default:
 723                hid_warn(hdev, "Unsupported transaction %d\n", size);
 724                return -EOPNOTSUPP;
 725        }
 726
 727        if (count < 0)
 728                return count;
 729
 730        ret = hid_hw_power(hdev, PM_HINT_FULLON);
 731        if (ret < 0) {
 732                hid_err(hdev, "power management error: %d\n", ret);
 733                return ret;
 734        }
 735
 736        ret = cp2112_hid_output(hdev, buf, count, HID_OUTPUT_REPORT);
 737        if (ret < 0) {
 738                hid_warn(hdev, "Error starting transaction: %d\n", ret);
 739                goto power_normal;
 740        }
 741
 742        for (retries = 0; retries < XFER_STATUS_RETRIES; ++retries) {
 743                ret = cp2112_xfer_status(dev);
 744                if (-EBUSY == ret)
 745                        continue;
 746                if (ret < 0)
 747                        goto power_normal;
 748                break;
 749        }
 750
 751        if (XFER_STATUS_RETRIES <= retries) {
 752                hid_warn(hdev, "Transfer timed out, cancelling.\n");
 753                buf[0] = CP2112_CANCEL_TRANSFER;
 754                buf[1] = 0x01;
 755
 756                ret = cp2112_hid_output(hdev, buf, 2, HID_OUTPUT_REPORT);
 757                if (ret < 0)
 758                        hid_warn(hdev, "Error cancelling transaction: %d\n",
 759                                 ret);
 760
 761                ret = -ETIMEDOUT;
 762                goto power_normal;
 763        }
 764
 765        if (I2C_SMBUS_WRITE == read_write) {
 766                ret = 0;
 767                goto power_normal;
 768        }
 769
 770        if (I2C_SMBUS_BLOCK_DATA == size)
 771                read_length = ret;
 772
 773        ret = cp2112_read(dev, buf, read_length);
 774        if (ret < 0)
 775                goto power_normal;
 776        if (ret != read_length) {
 777                hid_warn(hdev, "short read: %d < %zd\n", ret, read_length);
 778                ret = -EIO;
 779                goto power_normal;
 780        }
 781
 782        switch (size) {
 783        case I2C_SMBUS_BYTE:
 784        case I2C_SMBUS_BYTE_DATA:
 785                data->byte = buf[0];
 786                break;
 787        case I2C_SMBUS_WORD_DATA:
 788                data->word = le16_to_cpup((__le16 *)buf);
 789                break;
 790        case I2C_SMBUS_I2C_BLOCK_DATA:
 791                memcpy(data->block + 1, buf, read_length);
 792                break;
 793        case I2C_SMBUS_BLOCK_DATA:
 794                if (read_length > I2C_SMBUS_BLOCK_MAX) {
 795                        ret = -EPROTO;
 796                        goto power_normal;
 797                }
 798
 799                memcpy(data->block, buf, read_length);
 800                break;
 801        }
 802
 803        ret = 0;
 804power_normal:
 805        hid_hw_power(hdev, PM_HINT_NORMAL);
 806        hid_dbg(hdev, "transfer finished: %d\n", ret);
 807        return ret;
 808}
 809
 810static u32 cp2112_functionality(struct i2c_adapter *adap)
 811{
 812        return I2C_FUNC_I2C |
 813                I2C_FUNC_SMBUS_BYTE |
 814                I2C_FUNC_SMBUS_BYTE_DATA |
 815                I2C_FUNC_SMBUS_WORD_DATA |
 816                I2C_FUNC_SMBUS_BLOCK_DATA |
 817                I2C_FUNC_SMBUS_I2C_BLOCK |
 818                I2C_FUNC_SMBUS_PROC_CALL |
 819                I2C_FUNC_SMBUS_BLOCK_PROC_CALL;
 820}
 821
 822static const struct i2c_algorithm smbus_algorithm = {
 823        .master_xfer    = cp2112_i2c_xfer,
 824        .smbus_xfer     = cp2112_xfer,
 825        .functionality  = cp2112_functionality,
 826};
 827
 828static int cp2112_get_usb_config(struct hid_device *hdev,
 829                                 struct cp2112_usb_config_report *cfg)
 830{
 831        int ret;
 832
 833        ret = cp2112_hid_get(hdev, CP2112_USB_CONFIG, (u8 *)cfg, sizeof(*cfg),
 834                             HID_FEATURE_REPORT);
 835        if (ret != sizeof(*cfg)) {
 836                hid_err(hdev, "error reading usb config: %d\n", ret);
 837                if (ret < 0)
 838                        return ret;
 839                return -EIO;
 840        }
 841
 842        return 0;
 843}
 844
 845static int cp2112_set_usb_config(struct hid_device *hdev,
 846                                 struct cp2112_usb_config_report *cfg)
 847{
 848        int ret;
 849
 850        BUG_ON(cfg->report != CP2112_USB_CONFIG);
 851
 852        ret = cp2112_hid_output(hdev, (u8 *)cfg, sizeof(*cfg),
 853                                HID_FEATURE_REPORT);
 854        if (ret != sizeof(*cfg)) {
 855                hid_err(hdev, "error writing usb config: %d\n", ret);
 856                if (ret < 0)
 857                        return ret;
 858                return -EIO;
 859        }
 860
 861        return 0;
 862}
 863
 864static void chmod_sysfs_attrs(struct hid_device *hdev);
 865
 866#define CP2112_CONFIG_ATTR(name, store, format, ...) \
 867static ssize_t name##_store(struct device *kdev, \
 868                            struct device_attribute *attr, const char *buf, \
 869                            size_t count) \
 870{ \
 871        struct hid_device *hdev = to_hid_device(kdev); \
 872        struct cp2112_usb_config_report cfg; \
 873        int ret = cp2112_get_usb_config(hdev, &cfg); \
 874        if (ret) \
 875                return ret; \
 876        store; \
 877        ret = cp2112_set_usb_config(hdev, &cfg); \
 878        if (ret) \
 879                return ret; \
 880        chmod_sysfs_attrs(hdev); \
 881        return count; \
 882} \
 883static ssize_t name##_show(struct device *kdev, \
 884                           struct device_attribute *attr, char *buf) \
 885{ \
 886        struct hid_device *hdev = to_hid_device(kdev); \
 887        struct cp2112_usb_config_report cfg; \
 888        int ret = cp2112_get_usb_config(hdev, &cfg); \
 889        if (ret) \
 890                return ret; \
 891        return scnprintf(buf, PAGE_SIZE, format, ##__VA_ARGS__); \
 892} \
 893static DEVICE_ATTR_RW(name);
 894
 895CP2112_CONFIG_ATTR(vendor_id, ({
 896        u16 vid;
 897
 898        if (sscanf(buf, "%hi", &vid) != 1)
 899                return -EINVAL;
 900
 901        cfg.vid = cpu_to_le16(vid);
 902        cfg.mask = 0x01;
 903}), "0x%04x\n", le16_to_cpu(cfg.vid));
 904
 905CP2112_CONFIG_ATTR(product_id, ({
 906        u16 pid;
 907
 908        if (sscanf(buf, "%hi", &pid) != 1)
 909                return -EINVAL;
 910
 911        cfg.pid = cpu_to_le16(pid);
 912        cfg.mask = 0x02;
 913}), "0x%04x\n", le16_to_cpu(cfg.pid));
 914
 915CP2112_CONFIG_ATTR(max_power, ({
 916        int mA;
 917
 918        if (sscanf(buf, "%i", &mA) != 1)
 919                return -EINVAL;
 920
 921        cfg.max_power = (mA + 1) / 2;
 922        cfg.mask = 0x04;
 923}), "%u mA\n", cfg.max_power * 2);
 924
 925CP2112_CONFIG_ATTR(power_mode, ({
 926        if (sscanf(buf, "%hhi", &cfg.power_mode) != 1)
 927                return -EINVAL;
 928
 929        cfg.mask = 0x08;
 930}), "%u\n", cfg.power_mode);
 931
 932CP2112_CONFIG_ATTR(release_version, ({
 933        if (sscanf(buf, "%hhi.%hhi", &cfg.release_major, &cfg.release_minor)
 934            != 2)
 935                return -EINVAL;
 936
 937        cfg.mask = 0x10;
 938}), "%u.%u\n", cfg.release_major, cfg.release_minor);
 939
 940#undef CP2112_CONFIG_ATTR
 941
 942struct cp2112_pstring_attribute {
 943        struct device_attribute attr;
 944        unsigned char report;
 945};
 946
 947static ssize_t pstr_store(struct device *kdev,
 948                          struct device_attribute *kattr, const char *buf,
 949                          size_t count)
 950{
 951        struct hid_device *hdev = to_hid_device(kdev);
 952        struct cp2112_pstring_attribute *attr =
 953                container_of(kattr, struct cp2112_pstring_attribute, attr);
 954        struct cp2112_string_report report;
 955        int ret;
 956
 957        memset(&report, 0, sizeof(report));
 958
 959        ret = utf8s_to_utf16s(buf, count, UTF16_LITTLE_ENDIAN,
 960                              report.string, ARRAY_SIZE(report.string));
 961        report.report = attr->report;
 962        report.length = ret * sizeof(report.string[0]) + 2;
 963        report.type = USB_DT_STRING;
 964
 965        ret = cp2112_hid_output(hdev, &report.report, report.length + 1,
 966                                HID_FEATURE_REPORT);
 967        if (ret != report.length + 1) {
 968                hid_err(hdev, "error writing %s string: %d\n", kattr->attr.name,
 969                        ret);
 970                if (ret < 0)
 971                        return ret;
 972                return -EIO;
 973        }
 974
 975        chmod_sysfs_attrs(hdev);
 976        return count;
 977}
 978
 979static ssize_t pstr_show(struct device *kdev,
 980                         struct device_attribute *kattr, char *buf)
 981{
 982        struct hid_device *hdev = to_hid_device(kdev);
 983        struct cp2112_pstring_attribute *attr =
 984                container_of(kattr, struct cp2112_pstring_attribute, attr);
 985        struct cp2112_string_report report;
 986        u8 length;
 987        int ret;
 988
 989        ret = cp2112_hid_get(hdev, attr->report, &report.report,
 990                             sizeof(report) - 1, HID_FEATURE_REPORT);
 991        if (ret < 3) {
 992                hid_err(hdev, "error reading %s string: %d\n", kattr->attr.name,
 993                        ret);
 994                if (ret < 0)
 995                        return ret;
 996                return -EIO;
 997        }
 998
 999        if (report.length < 2) {
1000                hid_err(hdev, "invalid %s string length: %d\n",
1001                        kattr->attr.name, report.length);
1002                return -EIO;
1003        }
1004
1005        length = report.length > ret - 1 ? ret - 1 : report.length;
1006        length = (length - 2) / sizeof(report.string[0]);
1007        ret = utf16s_to_utf8s(report.string, length, UTF16_LITTLE_ENDIAN, buf,
1008                              PAGE_SIZE - 1);
1009        buf[ret++] = '\n';
1010        return ret;
1011}
1012
1013#define CP2112_PSTR_ATTR(name, _report) \
1014static struct cp2112_pstring_attribute dev_attr_##name = { \
1015        .attr = __ATTR(name, (S_IWUSR | S_IRUGO), pstr_show, pstr_store), \
1016        .report = _report, \
1017};
1018
1019CP2112_PSTR_ATTR(manufacturer,  CP2112_MANUFACTURER_STRING);
1020CP2112_PSTR_ATTR(product,       CP2112_PRODUCT_STRING);
1021CP2112_PSTR_ATTR(serial,        CP2112_SERIAL_STRING);
1022
1023#undef CP2112_PSTR_ATTR
1024
1025static const struct attribute_group cp2112_attr_group = {
1026        .attrs = (struct attribute *[]){
1027                &dev_attr_vendor_id.attr,
1028                &dev_attr_product_id.attr,
1029                &dev_attr_max_power.attr,
1030                &dev_attr_power_mode.attr,
1031                &dev_attr_release_version.attr,
1032                &dev_attr_manufacturer.attr.attr,
1033                &dev_attr_product.attr.attr,
1034                &dev_attr_serial.attr.attr,
1035                NULL
1036        }
1037};
1038
1039/* Chmoding our sysfs attributes is simply a way to expose which fields in the
1040 * PROM have already been programmed. We do not depend on this preventing
1041 * writing to these attributes since the CP2112 will simply ignore writes to
1042 * already-programmed fields. This is why there is no sense in fixing this
1043 * racy behaviour.
1044 */
1045static void chmod_sysfs_attrs(struct hid_device *hdev)
1046{
1047        struct attribute **attr;
1048        u8 buf[2];
1049        int ret;
1050
1051        ret = cp2112_hid_get(hdev, CP2112_LOCK_BYTE, buf, sizeof(buf),
1052                             HID_FEATURE_REPORT);
1053        if (ret != sizeof(buf)) {
1054                hid_err(hdev, "error reading lock byte: %d\n", ret);
1055                return;
1056        }
1057
1058        for (attr = cp2112_attr_group.attrs; *attr; ++attr) {
1059                umode_t mode = (buf[1] & 1) ? S_IWUSR | S_IRUGO : S_IRUGO;
1060                ret = sysfs_chmod_file(&hdev->dev.kobj, *attr, mode);
1061                if (ret < 0)
1062                        hid_err(hdev, "error chmoding sysfs file %s\n",
1063                                (*attr)->name);
1064                buf[1] >>= 1;
1065        }
1066}
1067
1068static void cp2112_gpio_irq_ack(struct irq_data *d)
1069{
1070}
1071
1072static void cp2112_gpio_irq_mask(struct irq_data *d)
1073{
1074        struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
1075        struct cp2112_device *dev = gpiochip_get_data(gc);
1076
1077        __clear_bit(d->hwirq, &dev->irq_mask);
1078}
1079
1080static void cp2112_gpio_irq_unmask(struct irq_data *d)
1081{
1082        struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
1083        struct cp2112_device *dev = gpiochip_get_data(gc);
1084
1085        __set_bit(d->hwirq, &dev->irq_mask);
1086}
1087
1088static void cp2112_gpio_poll_callback(struct work_struct *work)
1089{
1090        struct cp2112_device *dev = container_of(work, struct cp2112_device,
1091                                                 gpio_poll_worker.work);
1092        struct irq_data *d;
1093        u8 gpio_mask;
1094        u8 virqs = (u8)dev->irq_mask;
1095        u32 irq_type;
1096        int irq, virq, ret;
1097
1098        ret = cp2112_gpio_get_all(&dev->gc);
1099        if (ret == -ENODEV) /* the hardware has been disconnected */
1100                return;
1101        if (ret < 0)
1102                goto exit;
1103
1104        gpio_mask = ret;
1105
1106        while (virqs) {
1107                virq = ffs(virqs) - 1;
1108                virqs &= ~BIT(virq);
1109
1110                if (!dev->gc.to_irq)
1111                        break;
1112
1113                irq = dev->gc.to_irq(&dev->gc, virq);
1114
1115                d = irq_get_irq_data(irq);
1116                if (!d)
1117                        continue;
1118
1119                irq_type = irqd_get_trigger_type(d);
1120
1121                if (gpio_mask & BIT(virq)) {
1122                        /* Level High */
1123
1124                        if (irq_type & IRQ_TYPE_LEVEL_HIGH)
1125                                handle_nested_irq(irq);
1126
1127                        if ((irq_type & IRQ_TYPE_EDGE_RISING) &&
1128                            !(dev->gpio_prev_state & BIT(virq)))
1129                                handle_nested_irq(irq);
1130                } else {
1131                        /* Level Low */
1132
1133                        if (irq_type & IRQ_TYPE_LEVEL_LOW)
1134                                handle_nested_irq(irq);
1135
1136                        if ((irq_type & IRQ_TYPE_EDGE_FALLING) &&
1137                            (dev->gpio_prev_state & BIT(virq)))
1138                                handle_nested_irq(irq);
1139                }
1140        }
1141
1142        dev->gpio_prev_state = gpio_mask;
1143
1144exit:
1145        if (dev->gpio_poll)
1146                schedule_delayed_work(&dev->gpio_poll_worker, 10);
1147}
1148
1149
1150static unsigned int cp2112_gpio_irq_startup(struct irq_data *d)
1151{
1152        struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
1153        struct cp2112_device *dev = gpiochip_get_data(gc);
1154
1155        INIT_DELAYED_WORK(&dev->gpio_poll_worker, cp2112_gpio_poll_callback);
1156
1157        if (!dev->gpio_poll) {
1158                dev->gpio_poll = true;
1159                schedule_delayed_work(&dev->gpio_poll_worker, 0);
1160        }
1161
1162        cp2112_gpio_irq_unmask(d);
1163        return 0;
1164}
1165
1166static void cp2112_gpio_irq_shutdown(struct irq_data *d)
1167{
1168        struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
1169        struct cp2112_device *dev = gpiochip_get_data(gc);
1170
1171        cancel_delayed_work_sync(&dev->gpio_poll_worker);
1172}
1173
1174static int cp2112_gpio_irq_type(struct irq_data *d, unsigned int type)
1175{
1176        return 0;
1177}
1178
1179static int __maybe_unused cp2112_allocate_irq(struct cp2112_device *dev,
1180                                              int pin)
1181{
1182        int ret;
1183
1184        if (dev->desc[pin])
1185                return -EINVAL;
1186
1187        dev->desc[pin] = gpiochip_request_own_desc(&dev->gc, pin,
1188                                                   "HID/I2C:Event",
1189                                                   GPIO_ACTIVE_HIGH,
1190                                                   GPIOD_IN);
1191        if (IS_ERR(dev->desc[pin])) {
1192                dev_err(dev->gc.parent, "Failed to request GPIO\n");
1193                return PTR_ERR(dev->desc[pin]);
1194        }
1195
1196        ret = cp2112_gpio_direction_input(&dev->gc, pin);
1197        if (ret < 0) {
1198                dev_err(dev->gc.parent, "Failed to set GPIO to input dir\n");
1199                goto err_desc;
1200        }
1201
1202        ret = gpiochip_lock_as_irq(&dev->gc, pin);
1203        if (ret) {
1204                dev_err(dev->gc.parent, "Failed to lock GPIO as interrupt\n");
1205                goto err_desc;
1206        }
1207
1208        ret = gpiod_to_irq(dev->desc[pin]);
1209        if (ret < 0) {
1210                dev_err(dev->gc.parent, "Failed to translate GPIO to IRQ\n");
1211                goto err_lock;
1212        }
1213
1214        return ret;
1215
1216err_lock:
1217        gpiochip_unlock_as_irq(&dev->gc, pin);
1218err_desc:
1219        gpiochip_free_own_desc(dev->desc[pin]);
1220        dev->desc[pin] = NULL;
1221        return ret;
1222}
1223
1224static int cp2112_probe(struct hid_device *hdev, const struct hid_device_id *id)
1225{
1226        struct cp2112_device *dev;
1227        u8 buf[3];
1228        struct cp2112_smbus_config_report config;
1229        struct gpio_irq_chip *girq;
1230        int ret;
1231
1232        dev = devm_kzalloc(&hdev->dev, sizeof(*dev), GFP_KERNEL);
1233        if (!dev)
1234                return -ENOMEM;
1235
1236        dev->in_out_buffer = devm_kzalloc(&hdev->dev, CP2112_REPORT_MAX_LENGTH,
1237                                          GFP_KERNEL);
1238        if (!dev->in_out_buffer)
1239                return -ENOMEM;
1240
1241        mutex_init(&dev->lock);
1242
1243        ret = hid_parse(hdev);
1244        if (ret) {
1245                hid_err(hdev, "parse failed\n");
1246                return ret;
1247        }
1248
1249        ret = hid_hw_start(hdev, HID_CONNECT_HIDRAW);
1250        if (ret) {
1251                hid_err(hdev, "hw start failed\n");
1252                return ret;
1253        }
1254
1255        ret = hid_hw_open(hdev);
1256        if (ret) {
1257                hid_err(hdev, "hw open failed\n");
1258                goto err_hid_stop;
1259        }
1260
1261        ret = hid_hw_power(hdev, PM_HINT_FULLON);
1262        if (ret < 0) {
1263                hid_err(hdev, "power management error: %d\n", ret);
1264                goto err_hid_close;
1265        }
1266
1267        ret = cp2112_hid_get(hdev, CP2112_GET_VERSION_INFO, buf, sizeof(buf),
1268                             HID_FEATURE_REPORT);
1269        if (ret != sizeof(buf)) {
1270                hid_err(hdev, "error requesting version\n");
1271                if (ret >= 0)
1272                        ret = -EIO;
1273                goto err_power_normal;
1274        }
1275
1276        hid_info(hdev, "Part Number: 0x%02X Device Version: 0x%02X\n",
1277                 buf[1], buf[2]);
1278
1279        ret = cp2112_hid_get(hdev, CP2112_SMBUS_CONFIG, (u8 *)&config,
1280                             sizeof(config), HID_FEATURE_REPORT);
1281        if (ret != sizeof(config)) {
1282                hid_err(hdev, "error requesting SMBus config\n");
1283                if (ret >= 0)
1284                        ret = -EIO;
1285                goto err_power_normal;
1286        }
1287
1288        config.retry_time = cpu_to_be16(1);
1289
1290        ret = cp2112_hid_output(hdev, (u8 *)&config, sizeof(config),
1291                                HID_FEATURE_REPORT);
1292        if (ret != sizeof(config)) {
1293                hid_err(hdev, "error setting SMBus config\n");
1294                if (ret >= 0)
1295                        ret = -EIO;
1296                goto err_power_normal;
1297        }
1298
1299        hid_set_drvdata(hdev, (void *)dev);
1300        dev->hdev               = hdev;
1301        dev->adap.owner         = THIS_MODULE;
1302        dev->adap.class         = I2C_CLASS_HWMON;
1303        dev->adap.algo          = &smbus_algorithm;
1304        dev->adap.algo_data     = dev;
1305        dev->adap.dev.parent    = &hdev->dev;
1306        snprintf(dev->adap.name, sizeof(dev->adap.name),
1307                 "CP2112 SMBus Bridge on hidraw%d",
1308                 ((struct hidraw *)hdev->hidraw)->minor);
1309        dev->hwversion = buf[2];
1310        init_waitqueue_head(&dev->wait);
1311
1312        hid_device_io_start(hdev);
1313        ret = i2c_add_adapter(&dev->adap);
1314        hid_device_io_stop(hdev);
1315
1316        if (ret) {
1317                hid_err(hdev, "error registering i2c adapter\n");
1318                goto err_power_normal;
1319        }
1320
1321        hid_dbg(hdev, "adapter registered\n");
1322
1323        dev->gc.label                   = "cp2112_gpio";
1324        dev->gc.direction_input         = cp2112_gpio_direction_input;
1325        dev->gc.direction_output        = cp2112_gpio_direction_output;
1326        dev->gc.set                     = cp2112_gpio_set;
1327        dev->gc.get                     = cp2112_gpio_get;
1328        dev->gc.base                    = -1;
1329        dev->gc.ngpio                   = 8;
1330        dev->gc.can_sleep               = 1;
1331        dev->gc.parent                  = &hdev->dev;
1332
1333        dev->irq.name = "cp2112-gpio";
1334        dev->irq.irq_startup = cp2112_gpio_irq_startup;
1335        dev->irq.irq_shutdown = cp2112_gpio_irq_shutdown;
1336        dev->irq.irq_ack = cp2112_gpio_irq_ack;
1337        dev->irq.irq_mask = cp2112_gpio_irq_mask;
1338        dev->irq.irq_unmask = cp2112_gpio_irq_unmask;
1339        dev->irq.irq_set_type = cp2112_gpio_irq_type;
1340        dev->irq.flags = IRQCHIP_MASK_ON_SUSPEND;
1341
1342        girq = &dev->gc.irq;
1343        girq->chip = &dev->irq;
1344        /* The event comes from the outside so no parent handler */
1345        girq->parent_handler = NULL;
1346        girq->num_parents = 0;
1347        girq->parents = NULL;
1348        girq->default_type = IRQ_TYPE_NONE;
1349        girq->handler = handle_simple_irq;
1350
1351        ret = gpiochip_add_data(&dev->gc, dev);
1352        if (ret < 0) {
1353                hid_err(hdev, "error registering gpio chip\n");
1354                goto err_free_i2c;
1355        }
1356
1357        ret = sysfs_create_group(&hdev->dev.kobj, &cp2112_attr_group);
1358        if (ret < 0) {
1359                hid_err(hdev, "error creating sysfs attrs\n");
1360                goto err_gpiochip_remove;
1361        }
1362
1363        chmod_sysfs_attrs(hdev);
1364        hid_hw_power(hdev, PM_HINT_NORMAL);
1365
1366        return ret;
1367
1368err_gpiochip_remove:
1369        gpiochip_remove(&dev->gc);
1370err_free_i2c:
1371        i2c_del_adapter(&dev->adap);
1372err_power_normal:
1373        hid_hw_power(hdev, PM_HINT_NORMAL);
1374err_hid_close:
1375        hid_hw_close(hdev);
1376err_hid_stop:
1377        hid_hw_stop(hdev);
1378        return ret;
1379}
1380
1381static void cp2112_remove(struct hid_device *hdev)
1382{
1383        struct cp2112_device *dev = hid_get_drvdata(hdev);
1384        int i;
1385
1386        sysfs_remove_group(&hdev->dev.kobj, &cp2112_attr_group);
1387        i2c_del_adapter(&dev->adap);
1388
1389        if (dev->gpio_poll) {
1390                dev->gpio_poll = false;
1391                cancel_delayed_work_sync(&dev->gpio_poll_worker);
1392        }
1393
1394        for (i = 0; i < ARRAY_SIZE(dev->desc); i++) {
1395                gpiochip_unlock_as_irq(&dev->gc, i);
1396                gpiochip_free_own_desc(dev->desc[i]);
1397        }
1398
1399        gpiochip_remove(&dev->gc);
1400        /* i2c_del_adapter has finished removing all i2c devices from our
1401         * adapter. Well behaved devices should no longer call our cp2112_xfer
1402         * and should have waited for any pending calls to finish. It has also
1403         * waited for device_unregister(&adap->dev) to complete. Therefore we
1404         * can safely free our struct cp2112_device.
1405         */
1406        hid_hw_close(hdev);
1407        hid_hw_stop(hdev);
1408}
1409
1410static int cp2112_raw_event(struct hid_device *hdev, struct hid_report *report,
1411                            u8 *data, int size)
1412{
1413        struct cp2112_device *dev = hid_get_drvdata(hdev);
1414        struct cp2112_xfer_status_report *xfer = (void *)data;
1415
1416        switch (data[0]) {
1417        case CP2112_TRANSFER_STATUS_RESPONSE:
1418                hid_dbg(hdev, "xfer status: %02x %02x %04x %04x\n",
1419                        xfer->status0, xfer->status1,
1420                        be16_to_cpu(xfer->retries), be16_to_cpu(xfer->length));
1421
1422                switch (xfer->status0) {
1423                case STATUS0_IDLE:
1424                        dev->xfer_status = -EAGAIN;
1425                        break;
1426                case STATUS0_BUSY:
1427                        dev->xfer_status = -EBUSY;
1428                        break;
1429                case STATUS0_COMPLETE:
1430                        dev->xfer_status = be16_to_cpu(xfer->length);
1431                        break;
1432                case STATUS0_ERROR:
1433                        switch (xfer->status1) {
1434                        case STATUS1_TIMEOUT_NACK:
1435                        case STATUS1_TIMEOUT_BUS:
1436                                dev->xfer_status = -ETIMEDOUT;
1437                                break;
1438                        default:
1439                                dev->xfer_status = -EIO;
1440                                break;
1441                        }
1442                        break;
1443                default:
1444                        dev->xfer_status = -EINVAL;
1445                        break;
1446                }
1447
1448                atomic_set(&dev->xfer_avail, 1);
1449                break;
1450        case CP2112_DATA_READ_RESPONSE:
1451                hid_dbg(hdev, "read response: %02x %02x\n", data[1], data[2]);
1452
1453                dev->read_length = data[2];
1454                if (dev->read_length > sizeof(dev->read_data))
1455                        dev->read_length = sizeof(dev->read_data);
1456
1457                memcpy(dev->read_data, &data[3], dev->read_length);
1458                atomic_set(&dev->read_avail, 1);
1459                break;
1460        default:
1461                hid_err(hdev, "unknown report\n");
1462
1463                return 0;
1464        }
1465
1466        wake_up_interruptible(&dev->wait);
1467        return 1;
1468}
1469
1470static struct hid_driver cp2112_driver = {
1471        .name           = "cp2112",
1472        .id_table       = cp2112_devices,
1473        .probe          = cp2112_probe,
1474        .remove         = cp2112_remove,
1475        .raw_event      = cp2112_raw_event,
1476};
1477
1478module_hid_driver(cp2112_driver);
1479MODULE_DESCRIPTION("Silicon Labs HID USB to SMBus master bridge");
1480MODULE_AUTHOR("David Barksdale <dbarksdale@uplogix.com>");
1481MODULE_LICENSE("GPL");
1482
1483