linux/drivers/input/rmi4/rmi_f03.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * Copyright (C) 2015-2016 Red Hat
   4 * Copyright (C) 2015 Lyude Paul <thatslyude@gmail.com>
   5 */
   6
   7#include <linux/kernel.h>
   8#include <linux/slab.h>
   9#include <linux/serio.h>
  10#include <linux/notifier.h>
  11#include "rmi_driver.h"
  12
  13#define RMI_F03_RX_DATA_OFB             0x01
  14#define RMI_F03_OB_SIZE                 2
  15
  16#define RMI_F03_OB_OFFSET               2
  17#define RMI_F03_OB_DATA_OFFSET          1
  18#define RMI_F03_OB_FLAG_TIMEOUT         BIT(6)
  19#define RMI_F03_OB_FLAG_PARITY          BIT(7)
  20
  21#define RMI_F03_DEVICE_COUNT            0x07
  22#define RMI_F03_BYTES_PER_DEVICE        0x07
  23#define RMI_F03_BYTES_PER_DEVICE_SHIFT  4
  24#define RMI_F03_QUEUE_LENGTH            0x0F
  25
  26#define PSMOUSE_OOB_EXTRA_BTNS          0x01
  27
  28struct f03_data {
  29        struct rmi_function *fn;
  30
  31        struct serio *serio;
  32        bool serio_registered;
  33
  34        unsigned int overwrite_buttons;
  35
  36        u8 device_count;
  37        u8 rx_queue_length;
  38};
  39
  40int rmi_f03_overwrite_button(struct rmi_function *fn, unsigned int button,
  41                             int value)
  42{
  43        struct f03_data *f03 = dev_get_drvdata(&fn->dev);
  44        unsigned int bit;
  45
  46        if (button < BTN_LEFT || button > BTN_MIDDLE)
  47                return -EINVAL;
  48
  49        bit = BIT(button - BTN_LEFT);
  50
  51        if (value)
  52                f03->overwrite_buttons |= bit;
  53        else
  54                f03->overwrite_buttons &= ~bit;
  55
  56        return 0;
  57}
  58
  59void rmi_f03_commit_buttons(struct rmi_function *fn)
  60{
  61        struct f03_data *f03 = dev_get_drvdata(&fn->dev);
  62        struct serio *serio = f03->serio;
  63
  64        serio_pause_rx(serio);
  65        if (serio->drv) {
  66                serio->drv->interrupt(serio, PSMOUSE_OOB_EXTRA_BTNS,
  67                                      SERIO_OOB_DATA);
  68                serio->drv->interrupt(serio, f03->overwrite_buttons,
  69                                      SERIO_OOB_DATA);
  70        }
  71        serio_continue_rx(serio);
  72}
  73
  74static int rmi_f03_pt_write(struct serio *id, unsigned char val)
  75{
  76        struct f03_data *f03 = id->port_data;
  77        int error;
  78
  79        rmi_dbg(RMI_DEBUG_FN, &f03->fn->dev,
  80                "%s: Wrote %.2hhx to PS/2 passthrough address",
  81                __func__, val);
  82
  83        error = rmi_write(f03->fn->rmi_dev, f03->fn->fd.data_base_addr, val);
  84        if (error) {
  85                dev_err(&f03->fn->dev,
  86                        "%s: Failed to write to F03 TX register (%d).\n",
  87                        __func__, error);
  88                return error;
  89        }
  90
  91        return 0;
  92}
  93
  94static int rmi_f03_initialize(struct f03_data *f03)
  95{
  96        struct rmi_function *fn = f03->fn;
  97        struct device *dev = &fn->dev;
  98        int error;
  99        u8 bytes_per_device;
 100        u8 query1;
 101        u8 query2[RMI_F03_DEVICE_COUNT * RMI_F03_BYTES_PER_DEVICE];
 102        size_t query2_len;
 103
 104        error = rmi_read(fn->rmi_dev, fn->fd.query_base_addr, &query1);
 105        if (error) {
 106                dev_err(dev, "Failed to read query register (%d).\n", error);
 107                return error;
 108        }
 109
 110        f03->device_count = query1 & RMI_F03_DEVICE_COUNT;
 111        bytes_per_device = (query1 >> RMI_F03_BYTES_PER_DEVICE_SHIFT) &
 112                                RMI_F03_BYTES_PER_DEVICE;
 113
 114        query2_len = f03->device_count * bytes_per_device;
 115
 116        /*
 117         * The first generation of image sensors don't have a second part to
 118         * their f03 query, as such we have to set some of these values manually
 119         */
 120        if (query2_len < 1) {
 121                f03->device_count = 1;
 122                f03->rx_queue_length = 7;
 123        } else {
 124                error = rmi_read_block(fn->rmi_dev, fn->fd.query_base_addr + 1,
 125                                       query2, query2_len);
 126                if (error) {
 127                        dev_err(dev,
 128                                "Failed to read second set of query registers (%d).\n",
 129                                error);
 130                        return error;
 131                }
 132
 133                f03->rx_queue_length = query2[0] & RMI_F03_QUEUE_LENGTH;
 134        }
 135
 136        return 0;
 137}
 138
 139static int rmi_f03_pt_open(struct serio *serio)
 140{
 141        struct f03_data *f03 = serio->port_data;
 142        struct rmi_function *fn = f03->fn;
 143        const u8 ob_len = f03->rx_queue_length * RMI_F03_OB_SIZE;
 144        const u16 data_addr = fn->fd.data_base_addr + RMI_F03_OB_OFFSET;
 145        u8 obs[RMI_F03_QUEUE_LENGTH * RMI_F03_OB_SIZE];
 146        int error;
 147
 148        /*
 149         * Consume any pending data. Some devices like to spam with
 150         * 0xaa 0x00 announcements which may confuse us as we try to
 151         * probe the device.
 152         */
 153        error = rmi_read_block(fn->rmi_dev, data_addr, &obs, ob_len);
 154        if (!error)
 155                rmi_dbg(RMI_DEBUG_FN, &fn->dev,
 156                        "%s: Consumed %*ph (%d) from PS2 guest\n",
 157                        __func__, ob_len, obs, ob_len);
 158
 159        return fn->rmi_dev->driver->set_irq_bits(fn->rmi_dev, fn->irq_mask);
 160}
 161
 162static void rmi_f03_pt_close(struct serio *serio)
 163{
 164        struct f03_data *f03 = serio->port_data;
 165        struct rmi_function *fn = f03->fn;
 166
 167        fn->rmi_dev->driver->clear_irq_bits(fn->rmi_dev, fn->irq_mask);
 168}
 169
 170static int rmi_f03_register_pt(struct f03_data *f03)
 171{
 172        struct serio *serio;
 173
 174        serio = kzalloc(sizeof(struct serio), GFP_KERNEL);
 175        if (!serio)
 176                return -ENOMEM;
 177
 178        serio->id.type = SERIO_PS_PSTHRU;
 179        serio->write = rmi_f03_pt_write;
 180        serio->open = rmi_f03_pt_open;
 181        serio->close = rmi_f03_pt_close;
 182        serio->port_data = f03;
 183
 184        strlcpy(serio->name, "RMI4 PS/2 pass-through", sizeof(serio->name));
 185        snprintf(serio->phys, sizeof(serio->phys), "%s/serio0",
 186                 dev_name(&f03->fn->dev));
 187        serio->dev.parent = &f03->fn->dev;
 188
 189        f03->serio = serio;
 190
 191        printk(KERN_INFO "serio: %s port at %s\n",
 192                serio->name, dev_name(&f03->fn->dev));
 193        serio_register_port(serio);
 194
 195        return 0;
 196}
 197
 198static int rmi_f03_probe(struct rmi_function *fn)
 199{
 200        struct device *dev = &fn->dev;
 201        struct f03_data *f03;
 202        int error;
 203
 204        f03 = devm_kzalloc(dev, sizeof(struct f03_data), GFP_KERNEL);
 205        if (!f03)
 206                return -ENOMEM;
 207
 208        f03->fn = fn;
 209
 210        error = rmi_f03_initialize(f03);
 211        if (error < 0)
 212                return error;
 213
 214        if (f03->device_count != 1)
 215                dev_warn(dev, "found %d devices on PS/2 passthrough",
 216                         f03->device_count);
 217
 218        dev_set_drvdata(dev, f03);
 219        return 0;
 220}
 221
 222static int rmi_f03_config(struct rmi_function *fn)
 223{
 224        struct f03_data *f03 = dev_get_drvdata(&fn->dev);
 225        int error;
 226
 227        if (!f03->serio_registered) {
 228                error = rmi_f03_register_pt(f03);
 229                if (error)
 230                        return error;
 231
 232                f03->serio_registered = true;
 233        } else {
 234                /*
 235                 * We must be re-configuring the sensor, just enable
 236                 * interrupts for this function.
 237                 */
 238                fn->rmi_dev->driver->set_irq_bits(fn->rmi_dev, fn->irq_mask);
 239        }
 240
 241        return 0;
 242}
 243
 244static irqreturn_t rmi_f03_attention(int irq, void *ctx)
 245{
 246        struct rmi_function *fn = ctx;
 247        struct rmi_device *rmi_dev = fn->rmi_dev;
 248        struct rmi_driver_data *drvdata = dev_get_drvdata(&rmi_dev->dev);
 249        struct f03_data *f03 = dev_get_drvdata(&fn->dev);
 250        const u16 data_addr = fn->fd.data_base_addr + RMI_F03_OB_OFFSET;
 251        const u8 ob_len = f03->rx_queue_length * RMI_F03_OB_SIZE;
 252        u8 obs[RMI_F03_QUEUE_LENGTH * RMI_F03_OB_SIZE];
 253        u8 ob_status;
 254        u8 ob_data;
 255        unsigned int serio_flags;
 256        int i;
 257        int error;
 258
 259        if (drvdata->attn_data.data) {
 260                /* First grab the data passed by the transport device */
 261                if (drvdata->attn_data.size < ob_len) {
 262                        dev_warn(&fn->dev, "F03 interrupted, but data is missing!\n");
 263                        return IRQ_HANDLED;
 264                }
 265
 266                memcpy(obs, drvdata->attn_data.data, ob_len);
 267
 268                drvdata->attn_data.data += ob_len;
 269                drvdata->attn_data.size -= ob_len;
 270        } else {
 271                /* Grab all of the data registers, and check them for data */
 272                error = rmi_read_block(fn->rmi_dev, data_addr, &obs, ob_len);
 273                if (error) {
 274                        dev_err(&fn->dev,
 275                                "%s: Failed to read F03 output buffers: %d\n",
 276                                __func__, error);
 277                        serio_interrupt(f03->serio, 0, SERIO_TIMEOUT);
 278                        return IRQ_RETVAL(error);
 279                }
 280        }
 281
 282        for (i = 0; i < ob_len; i += RMI_F03_OB_SIZE) {
 283                ob_status = obs[i];
 284                ob_data = obs[i + RMI_F03_OB_DATA_OFFSET];
 285                serio_flags = 0;
 286
 287                if (!(ob_status & RMI_F03_RX_DATA_OFB))
 288                        continue;
 289
 290                if (ob_status & RMI_F03_OB_FLAG_TIMEOUT)
 291                        serio_flags |= SERIO_TIMEOUT;
 292                if (ob_status & RMI_F03_OB_FLAG_PARITY)
 293                        serio_flags |= SERIO_PARITY;
 294
 295                rmi_dbg(RMI_DEBUG_FN, &fn->dev,
 296                        "%s: Received %.2hhx from PS2 guest T: %c P: %c\n",
 297                        __func__, ob_data,
 298                        serio_flags & SERIO_TIMEOUT ?  'Y' : 'N',
 299                        serio_flags & SERIO_PARITY ? 'Y' : 'N');
 300
 301                serio_interrupt(f03->serio, ob_data, serio_flags);
 302        }
 303
 304        return IRQ_HANDLED;
 305}
 306
 307static void rmi_f03_remove(struct rmi_function *fn)
 308{
 309        struct f03_data *f03 = dev_get_drvdata(&fn->dev);
 310
 311        if (f03->serio_registered)
 312                serio_unregister_port(f03->serio);
 313}
 314
 315struct rmi_function_handler rmi_f03_handler = {
 316        .driver = {
 317                .name = "rmi4_f03",
 318        },
 319        .func = 0x03,
 320        .probe = rmi_f03_probe,
 321        .config = rmi_f03_config,
 322        .attention = rmi_f03_attention,
 323        .remove = rmi_f03_remove,
 324};
 325
 326MODULE_AUTHOR("Lyude Paul <thatslyude@gmail.com>");
 327MODULE_DESCRIPTION("RMI F03 module");
 328MODULE_LICENSE("GPL");
 329