1*9ee0a055SDanilo Krummrich /* 2*9ee0a055SDanilo Krummrich * GPIO based serio bus driver for bit banging the PS/2 protocol 3*9ee0a055SDanilo Krummrich * 4*9ee0a055SDanilo Krummrich * Author: Danilo Krummrich <danilokrummrich@dk-develop.de> 5*9ee0a055SDanilo Krummrich * 6*9ee0a055SDanilo Krummrich * This program is free software; you can redistribute it and/or modify 7*9ee0a055SDanilo Krummrich * it under the terms of the GNU General Public License version 2 as 8*9ee0a055SDanilo Krummrich * published by the Free Software Foundation. 9*9ee0a055SDanilo Krummrich */ 10*9ee0a055SDanilo Krummrich 11*9ee0a055SDanilo Krummrich #include <linux/gpio/consumer.h> 12*9ee0a055SDanilo Krummrich #include <linux/interrupt.h> 13*9ee0a055SDanilo Krummrich #include <linux/module.h> 14*9ee0a055SDanilo Krummrich #include <linux/serio.h> 15*9ee0a055SDanilo Krummrich #include <linux/slab.h> 16*9ee0a055SDanilo Krummrich #include <linux/platform_device.h> 17*9ee0a055SDanilo Krummrich #include <linux/workqueue.h> 18*9ee0a055SDanilo Krummrich #include <linux/completion.h> 19*9ee0a055SDanilo Krummrich #include <linux/mutex.h> 20*9ee0a055SDanilo Krummrich #include <linux/preempt.h> 21*9ee0a055SDanilo Krummrich #include <linux/property.h> 22*9ee0a055SDanilo Krummrich #include <linux/of.h> 23*9ee0a055SDanilo Krummrich #include <linux/jiffies.h> 24*9ee0a055SDanilo Krummrich #include <linux/delay.h> 25*9ee0a055SDanilo Krummrich 26*9ee0a055SDanilo Krummrich #define DRIVER_NAME "ps2-gpio" 27*9ee0a055SDanilo Krummrich 28*9ee0a055SDanilo Krummrich #define PS2_MODE_RX 0 29*9ee0a055SDanilo Krummrich #define PS2_MODE_TX 1 30*9ee0a055SDanilo Krummrich 31*9ee0a055SDanilo Krummrich #define PS2_START_BIT 0 32*9ee0a055SDanilo Krummrich #define PS2_DATA_BIT0 1 33*9ee0a055SDanilo Krummrich #define PS2_DATA_BIT1 2 34*9ee0a055SDanilo Krummrich #define PS2_DATA_BIT2 3 35*9ee0a055SDanilo Krummrich #define PS2_DATA_BIT3 4 36*9ee0a055SDanilo Krummrich #define PS2_DATA_BIT4 5 37*9ee0a055SDanilo Krummrich #define PS2_DATA_BIT5 6 38*9ee0a055SDanilo Krummrich #define PS2_DATA_BIT6 7 39*9ee0a055SDanilo Krummrich #define PS2_DATA_BIT7 8 40*9ee0a055SDanilo Krummrich #define PS2_PARITY_BIT 9 41*9ee0a055SDanilo Krummrich #define PS2_STOP_BIT 10 42*9ee0a055SDanilo Krummrich #define PS2_TX_TIMEOUT 11 43*9ee0a055SDanilo Krummrich #define PS2_ACK_BIT 12 44*9ee0a055SDanilo Krummrich 45*9ee0a055SDanilo Krummrich #define PS2_DEV_RET_ACK 0xfa 46*9ee0a055SDanilo Krummrich #define PS2_DEV_RET_NACK 0xfe 47*9ee0a055SDanilo Krummrich 48*9ee0a055SDanilo Krummrich #define PS2_CMD_RESEND 0xfe 49*9ee0a055SDanilo Krummrich 50*9ee0a055SDanilo Krummrich struct ps2_gpio_data { 51*9ee0a055SDanilo Krummrich struct device *dev; 52*9ee0a055SDanilo Krummrich struct serio *serio; 53*9ee0a055SDanilo Krummrich unsigned char mode; 54*9ee0a055SDanilo Krummrich struct gpio_desc *gpio_clk; 55*9ee0a055SDanilo Krummrich struct gpio_desc *gpio_data; 56*9ee0a055SDanilo Krummrich bool write_enable; 57*9ee0a055SDanilo Krummrich int irq; 58*9ee0a055SDanilo Krummrich unsigned char rx_cnt; 59*9ee0a055SDanilo Krummrich unsigned char rx_byte; 60*9ee0a055SDanilo Krummrich unsigned char tx_cnt; 61*9ee0a055SDanilo Krummrich unsigned char tx_byte; 62*9ee0a055SDanilo Krummrich struct completion tx_done; 63*9ee0a055SDanilo Krummrich struct mutex tx_mutex; 64*9ee0a055SDanilo Krummrich struct delayed_work tx_work; 65*9ee0a055SDanilo Krummrich }; 66*9ee0a055SDanilo Krummrich 67*9ee0a055SDanilo Krummrich static int ps2_gpio_open(struct serio *serio) 68*9ee0a055SDanilo Krummrich { 69*9ee0a055SDanilo Krummrich struct ps2_gpio_data *drvdata = serio->port_data; 70*9ee0a055SDanilo Krummrich 71*9ee0a055SDanilo Krummrich enable_irq(drvdata->irq); 72*9ee0a055SDanilo Krummrich return 0; 73*9ee0a055SDanilo Krummrich } 74*9ee0a055SDanilo Krummrich 75*9ee0a055SDanilo Krummrich static void ps2_gpio_close(struct serio *serio) 76*9ee0a055SDanilo Krummrich { 77*9ee0a055SDanilo Krummrich struct ps2_gpio_data *drvdata = serio->port_data; 78*9ee0a055SDanilo Krummrich 79*9ee0a055SDanilo Krummrich disable_irq(drvdata->irq); 80*9ee0a055SDanilo Krummrich } 81*9ee0a055SDanilo Krummrich 82*9ee0a055SDanilo Krummrich static int __ps2_gpio_write(struct serio *serio, unsigned char val) 83*9ee0a055SDanilo Krummrich { 84*9ee0a055SDanilo Krummrich struct ps2_gpio_data *drvdata = serio->port_data; 85*9ee0a055SDanilo Krummrich 86*9ee0a055SDanilo Krummrich disable_irq_nosync(drvdata->irq); 87*9ee0a055SDanilo Krummrich gpiod_direction_output(drvdata->gpio_clk, 0); 88*9ee0a055SDanilo Krummrich 89*9ee0a055SDanilo Krummrich drvdata->mode = PS2_MODE_TX; 90*9ee0a055SDanilo Krummrich drvdata->tx_byte = val; 91*9ee0a055SDanilo Krummrich 92*9ee0a055SDanilo Krummrich schedule_delayed_work(&drvdata->tx_work, usecs_to_jiffies(200)); 93*9ee0a055SDanilo Krummrich 94*9ee0a055SDanilo Krummrich return 0; 95*9ee0a055SDanilo Krummrich } 96*9ee0a055SDanilo Krummrich 97*9ee0a055SDanilo Krummrich static int ps2_gpio_write(struct serio *serio, unsigned char val) 98*9ee0a055SDanilo Krummrich { 99*9ee0a055SDanilo Krummrich struct ps2_gpio_data *drvdata = serio->port_data; 100*9ee0a055SDanilo Krummrich int ret = 0; 101*9ee0a055SDanilo Krummrich 102*9ee0a055SDanilo Krummrich if (in_task()) { 103*9ee0a055SDanilo Krummrich mutex_lock(&drvdata->tx_mutex); 104*9ee0a055SDanilo Krummrich __ps2_gpio_write(serio, val); 105*9ee0a055SDanilo Krummrich if (!wait_for_completion_timeout(&drvdata->tx_done, 106*9ee0a055SDanilo Krummrich msecs_to_jiffies(10000))) 107*9ee0a055SDanilo Krummrich ret = SERIO_TIMEOUT; 108*9ee0a055SDanilo Krummrich mutex_unlock(&drvdata->tx_mutex); 109*9ee0a055SDanilo Krummrich } else { 110*9ee0a055SDanilo Krummrich __ps2_gpio_write(serio, val); 111*9ee0a055SDanilo Krummrich } 112*9ee0a055SDanilo Krummrich 113*9ee0a055SDanilo Krummrich return ret; 114*9ee0a055SDanilo Krummrich } 115*9ee0a055SDanilo Krummrich 116*9ee0a055SDanilo Krummrich static void ps2_gpio_tx_work_fn(struct work_struct *work) 117*9ee0a055SDanilo Krummrich { 118*9ee0a055SDanilo Krummrich struct delayed_work *dwork = to_delayed_work(work); 119*9ee0a055SDanilo Krummrich struct ps2_gpio_data *drvdata = container_of(dwork, 120*9ee0a055SDanilo Krummrich struct ps2_gpio_data, 121*9ee0a055SDanilo Krummrich tx_work); 122*9ee0a055SDanilo Krummrich 123*9ee0a055SDanilo Krummrich enable_irq(drvdata->irq); 124*9ee0a055SDanilo Krummrich gpiod_direction_output(drvdata->gpio_data, 0); 125*9ee0a055SDanilo Krummrich gpiod_direction_input(drvdata->gpio_clk); 126*9ee0a055SDanilo Krummrich } 127*9ee0a055SDanilo Krummrich 128*9ee0a055SDanilo Krummrich static irqreturn_t ps2_gpio_irq_rx(struct ps2_gpio_data *drvdata) 129*9ee0a055SDanilo Krummrich { 130*9ee0a055SDanilo Krummrich unsigned char byte, cnt; 131*9ee0a055SDanilo Krummrich int data; 132*9ee0a055SDanilo Krummrich int rxflags = 0; 133*9ee0a055SDanilo Krummrich static unsigned long old_jiffies; 134*9ee0a055SDanilo Krummrich 135*9ee0a055SDanilo Krummrich byte = drvdata->rx_byte; 136*9ee0a055SDanilo Krummrich cnt = drvdata->rx_cnt; 137*9ee0a055SDanilo Krummrich 138*9ee0a055SDanilo Krummrich if (old_jiffies == 0) 139*9ee0a055SDanilo Krummrich old_jiffies = jiffies; 140*9ee0a055SDanilo Krummrich 141*9ee0a055SDanilo Krummrich if ((jiffies - old_jiffies) > usecs_to_jiffies(100)) { 142*9ee0a055SDanilo Krummrich dev_err(drvdata->dev, 143*9ee0a055SDanilo Krummrich "RX: timeout, probably we missed an interrupt\n"); 144*9ee0a055SDanilo Krummrich goto err; 145*9ee0a055SDanilo Krummrich } 146*9ee0a055SDanilo Krummrich old_jiffies = jiffies; 147*9ee0a055SDanilo Krummrich 148*9ee0a055SDanilo Krummrich data = gpiod_get_value(drvdata->gpio_data); 149*9ee0a055SDanilo Krummrich if (unlikely(data < 0)) { 150*9ee0a055SDanilo Krummrich dev_err(drvdata->dev, "RX: failed to get data gpio val: %d\n", 151*9ee0a055SDanilo Krummrich data); 152*9ee0a055SDanilo Krummrich goto err; 153*9ee0a055SDanilo Krummrich } 154*9ee0a055SDanilo Krummrich 155*9ee0a055SDanilo Krummrich switch (cnt) { 156*9ee0a055SDanilo Krummrich case PS2_START_BIT: 157*9ee0a055SDanilo Krummrich /* start bit should be low */ 158*9ee0a055SDanilo Krummrich if (unlikely(data)) { 159*9ee0a055SDanilo Krummrich dev_err(drvdata->dev, "RX: start bit should be low\n"); 160*9ee0a055SDanilo Krummrich goto err; 161*9ee0a055SDanilo Krummrich } 162*9ee0a055SDanilo Krummrich break; 163*9ee0a055SDanilo Krummrich case PS2_DATA_BIT0: 164*9ee0a055SDanilo Krummrich case PS2_DATA_BIT1: 165*9ee0a055SDanilo Krummrich case PS2_DATA_BIT2: 166*9ee0a055SDanilo Krummrich case PS2_DATA_BIT3: 167*9ee0a055SDanilo Krummrich case PS2_DATA_BIT4: 168*9ee0a055SDanilo Krummrich case PS2_DATA_BIT5: 169*9ee0a055SDanilo Krummrich case PS2_DATA_BIT6: 170*9ee0a055SDanilo Krummrich case PS2_DATA_BIT7: 171*9ee0a055SDanilo Krummrich /* processing data bits */ 172*9ee0a055SDanilo Krummrich if (data) 173*9ee0a055SDanilo Krummrich byte |= (data << (cnt - 1)); 174*9ee0a055SDanilo Krummrich break; 175*9ee0a055SDanilo Krummrich case PS2_PARITY_BIT: 176*9ee0a055SDanilo Krummrich /* check odd parity */ 177*9ee0a055SDanilo Krummrich if (!((hweight8(byte) & 1) ^ data)) { 178*9ee0a055SDanilo Krummrich rxflags |= SERIO_PARITY; 179*9ee0a055SDanilo Krummrich dev_warn(drvdata->dev, "RX: parity error\n"); 180*9ee0a055SDanilo Krummrich if (!drvdata->write_enable) 181*9ee0a055SDanilo Krummrich goto err; 182*9ee0a055SDanilo Krummrich } 183*9ee0a055SDanilo Krummrich 184*9ee0a055SDanilo Krummrich /* Do not send spurious ACK's and NACK's when write fn is 185*9ee0a055SDanilo Krummrich * not provided. 186*9ee0a055SDanilo Krummrich */ 187*9ee0a055SDanilo Krummrich if (!drvdata->write_enable) { 188*9ee0a055SDanilo Krummrich if (byte == PS2_DEV_RET_NACK) 189*9ee0a055SDanilo Krummrich goto err; 190*9ee0a055SDanilo Krummrich else if (byte == PS2_DEV_RET_ACK) 191*9ee0a055SDanilo Krummrich break; 192*9ee0a055SDanilo Krummrich } 193*9ee0a055SDanilo Krummrich 194*9ee0a055SDanilo Krummrich /* Let's send the data without waiting for the stop bit to be 195*9ee0a055SDanilo Krummrich * sent. It may happen that we miss the stop bit. When this 196*9ee0a055SDanilo Krummrich * happens we have no way to recover from this, certainly 197*9ee0a055SDanilo Krummrich * missing the parity bit would be recognized when processing 198*9ee0a055SDanilo Krummrich * the stop bit. When missing both, data is lost. 199*9ee0a055SDanilo Krummrich */ 200*9ee0a055SDanilo Krummrich serio_interrupt(drvdata->serio, byte, rxflags); 201*9ee0a055SDanilo Krummrich dev_dbg(drvdata->dev, "RX: sending byte 0x%x\n", byte); 202*9ee0a055SDanilo Krummrich break; 203*9ee0a055SDanilo Krummrich case PS2_STOP_BIT: 204*9ee0a055SDanilo Krummrich /* stop bit should be high */ 205*9ee0a055SDanilo Krummrich if (unlikely(!data)) { 206*9ee0a055SDanilo Krummrich dev_err(drvdata->dev, "RX: stop bit should be high\n"); 207*9ee0a055SDanilo Krummrich goto err; 208*9ee0a055SDanilo Krummrich } 209*9ee0a055SDanilo Krummrich cnt = byte = 0; 210*9ee0a055SDanilo Krummrich old_jiffies = 0; 211*9ee0a055SDanilo Krummrich goto end; /* success */ 212*9ee0a055SDanilo Krummrich default: 213*9ee0a055SDanilo Krummrich dev_err(drvdata->dev, "RX: got out of sync with the device\n"); 214*9ee0a055SDanilo Krummrich goto err; 215*9ee0a055SDanilo Krummrich } 216*9ee0a055SDanilo Krummrich 217*9ee0a055SDanilo Krummrich cnt++; 218*9ee0a055SDanilo Krummrich goto end; /* success */ 219*9ee0a055SDanilo Krummrich 220*9ee0a055SDanilo Krummrich err: 221*9ee0a055SDanilo Krummrich cnt = byte = 0; 222*9ee0a055SDanilo Krummrich old_jiffies = 0; 223*9ee0a055SDanilo Krummrich __ps2_gpio_write(drvdata->serio, PS2_CMD_RESEND); 224*9ee0a055SDanilo Krummrich end: 225*9ee0a055SDanilo Krummrich drvdata->rx_cnt = cnt; 226*9ee0a055SDanilo Krummrich drvdata->rx_byte = byte; 227*9ee0a055SDanilo Krummrich return IRQ_HANDLED; 228*9ee0a055SDanilo Krummrich } 229*9ee0a055SDanilo Krummrich 230*9ee0a055SDanilo Krummrich static irqreturn_t ps2_gpio_irq_tx(struct ps2_gpio_data *drvdata) 231*9ee0a055SDanilo Krummrich { 232*9ee0a055SDanilo Krummrich unsigned char byte, cnt; 233*9ee0a055SDanilo Krummrich int data; 234*9ee0a055SDanilo Krummrich static unsigned long old_jiffies; 235*9ee0a055SDanilo Krummrich 236*9ee0a055SDanilo Krummrich cnt = drvdata->tx_cnt; 237*9ee0a055SDanilo Krummrich byte = drvdata->tx_byte; 238*9ee0a055SDanilo Krummrich 239*9ee0a055SDanilo Krummrich if (old_jiffies == 0) 240*9ee0a055SDanilo Krummrich old_jiffies = jiffies; 241*9ee0a055SDanilo Krummrich 242*9ee0a055SDanilo Krummrich if ((jiffies - old_jiffies) > usecs_to_jiffies(100)) { 243*9ee0a055SDanilo Krummrich dev_err(drvdata->dev, 244*9ee0a055SDanilo Krummrich "TX: timeout, probably we missed an interrupt\n"); 245*9ee0a055SDanilo Krummrich goto err; 246*9ee0a055SDanilo Krummrich } 247*9ee0a055SDanilo Krummrich old_jiffies = jiffies; 248*9ee0a055SDanilo Krummrich 249*9ee0a055SDanilo Krummrich switch (cnt) { 250*9ee0a055SDanilo Krummrich case PS2_START_BIT: 251*9ee0a055SDanilo Krummrich /* should never happen */ 252*9ee0a055SDanilo Krummrich dev_err(drvdata->dev, 253*9ee0a055SDanilo Krummrich "TX: start bit should have been sent already\n"); 254*9ee0a055SDanilo Krummrich goto err; 255*9ee0a055SDanilo Krummrich case PS2_DATA_BIT0: 256*9ee0a055SDanilo Krummrich case PS2_DATA_BIT1: 257*9ee0a055SDanilo Krummrich case PS2_DATA_BIT2: 258*9ee0a055SDanilo Krummrich case PS2_DATA_BIT3: 259*9ee0a055SDanilo Krummrich case PS2_DATA_BIT4: 260*9ee0a055SDanilo Krummrich case PS2_DATA_BIT5: 261*9ee0a055SDanilo Krummrich case PS2_DATA_BIT6: 262*9ee0a055SDanilo Krummrich case PS2_DATA_BIT7: 263*9ee0a055SDanilo Krummrich data = byte & BIT(cnt - 1); 264*9ee0a055SDanilo Krummrich gpiod_set_value(drvdata->gpio_data, data); 265*9ee0a055SDanilo Krummrich break; 266*9ee0a055SDanilo Krummrich case PS2_PARITY_BIT: 267*9ee0a055SDanilo Krummrich /* do odd parity */ 268*9ee0a055SDanilo Krummrich data = !(hweight8(byte) & 1); 269*9ee0a055SDanilo Krummrich gpiod_set_value(drvdata->gpio_data, data); 270*9ee0a055SDanilo Krummrich break; 271*9ee0a055SDanilo Krummrich case PS2_STOP_BIT: 272*9ee0a055SDanilo Krummrich /* release data line to generate stop bit */ 273*9ee0a055SDanilo Krummrich gpiod_direction_input(drvdata->gpio_data); 274*9ee0a055SDanilo Krummrich break; 275*9ee0a055SDanilo Krummrich case PS2_TX_TIMEOUT: 276*9ee0a055SDanilo Krummrich /* Devices generate one extra clock pulse before sending the 277*9ee0a055SDanilo Krummrich * acknowledgment. 278*9ee0a055SDanilo Krummrich */ 279*9ee0a055SDanilo Krummrich break; 280*9ee0a055SDanilo Krummrich case PS2_ACK_BIT: 281*9ee0a055SDanilo Krummrich gpiod_direction_input(drvdata->gpio_data); 282*9ee0a055SDanilo Krummrich data = gpiod_get_value(drvdata->gpio_data); 283*9ee0a055SDanilo Krummrich if (data) { 284*9ee0a055SDanilo Krummrich dev_warn(drvdata->dev, "TX: received NACK, retry\n"); 285*9ee0a055SDanilo Krummrich goto err; 286*9ee0a055SDanilo Krummrich } 287*9ee0a055SDanilo Krummrich 288*9ee0a055SDanilo Krummrich drvdata->mode = PS2_MODE_RX; 289*9ee0a055SDanilo Krummrich complete(&drvdata->tx_done); 290*9ee0a055SDanilo Krummrich 291*9ee0a055SDanilo Krummrich cnt = 1; 292*9ee0a055SDanilo Krummrich old_jiffies = 0; 293*9ee0a055SDanilo Krummrich goto end; /* success */ 294*9ee0a055SDanilo Krummrich default: 295*9ee0a055SDanilo Krummrich /* Probably we missed the stop bit. Therefore we release data 296*9ee0a055SDanilo Krummrich * line and try again. 297*9ee0a055SDanilo Krummrich */ 298*9ee0a055SDanilo Krummrich gpiod_direction_input(drvdata->gpio_data); 299*9ee0a055SDanilo Krummrich dev_err(drvdata->dev, "TX: got out of sync with the device\n"); 300*9ee0a055SDanilo Krummrich goto err; 301*9ee0a055SDanilo Krummrich } 302*9ee0a055SDanilo Krummrich 303*9ee0a055SDanilo Krummrich cnt++; 304*9ee0a055SDanilo Krummrich goto end; /* success */ 305*9ee0a055SDanilo Krummrich 306*9ee0a055SDanilo Krummrich err: 307*9ee0a055SDanilo Krummrich cnt = 1; 308*9ee0a055SDanilo Krummrich old_jiffies = 0; 309*9ee0a055SDanilo Krummrich gpiod_direction_input(drvdata->gpio_data); 310*9ee0a055SDanilo Krummrich __ps2_gpio_write(drvdata->serio, drvdata->tx_byte); 311*9ee0a055SDanilo Krummrich end: 312*9ee0a055SDanilo Krummrich drvdata->tx_cnt = cnt; 313*9ee0a055SDanilo Krummrich return IRQ_HANDLED; 314*9ee0a055SDanilo Krummrich } 315*9ee0a055SDanilo Krummrich 316*9ee0a055SDanilo Krummrich static irqreturn_t ps2_gpio_irq(int irq, void *dev_id) 317*9ee0a055SDanilo Krummrich { 318*9ee0a055SDanilo Krummrich struct ps2_gpio_data *drvdata = dev_id; 319*9ee0a055SDanilo Krummrich 320*9ee0a055SDanilo Krummrich return drvdata->mode ? ps2_gpio_irq_tx(drvdata) : 321*9ee0a055SDanilo Krummrich ps2_gpio_irq_rx(drvdata); 322*9ee0a055SDanilo Krummrich } 323*9ee0a055SDanilo Krummrich 324*9ee0a055SDanilo Krummrich static int ps2_gpio_get_props(struct device *dev, 325*9ee0a055SDanilo Krummrich struct ps2_gpio_data *drvdata) 326*9ee0a055SDanilo Krummrich { 327*9ee0a055SDanilo Krummrich drvdata->gpio_data = devm_gpiod_get(dev, "data", GPIOD_IN); 328*9ee0a055SDanilo Krummrich if (IS_ERR(drvdata->gpio_data)) { 329*9ee0a055SDanilo Krummrich dev_err(dev, "failed to request data gpio: %ld", 330*9ee0a055SDanilo Krummrich PTR_ERR(drvdata->gpio_data)); 331*9ee0a055SDanilo Krummrich return PTR_ERR(drvdata->gpio_data); 332*9ee0a055SDanilo Krummrich } 333*9ee0a055SDanilo Krummrich 334*9ee0a055SDanilo Krummrich drvdata->gpio_clk = devm_gpiod_get(dev, "clk", GPIOD_IN); 335*9ee0a055SDanilo Krummrich if (IS_ERR(drvdata->gpio_clk)) { 336*9ee0a055SDanilo Krummrich dev_err(dev, "failed to request clock gpio: %ld", 337*9ee0a055SDanilo Krummrich PTR_ERR(drvdata->gpio_clk)); 338*9ee0a055SDanilo Krummrich return PTR_ERR(drvdata->gpio_clk); 339*9ee0a055SDanilo Krummrich } 340*9ee0a055SDanilo Krummrich 341*9ee0a055SDanilo Krummrich drvdata->write_enable = device_property_read_bool(dev, 342*9ee0a055SDanilo Krummrich "write-enable"); 343*9ee0a055SDanilo Krummrich 344*9ee0a055SDanilo Krummrich return 0; 345*9ee0a055SDanilo Krummrich } 346*9ee0a055SDanilo Krummrich 347*9ee0a055SDanilo Krummrich static int ps2_gpio_probe(struct platform_device *pdev) 348*9ee0a055SDanilo Krummrich { 349*9ee0a055SDanilo Krummrich struct ps2_gpio_data *drvdata; 350*9ee0a055SDanilo Krummrich struct serio *serio; 351*9ee0a055SDanilo Krummrich struct device *dev = &pdev->dev; 352*9ee0a055SDanilo Krummrich int error; 353*9ee0a055SDanilo Krummrich 354*9ee0a055SDanilo Krummrich drvdata = devm_kzalloc(dev, sizeof(struct ps2_gpio_data), GFP_KERNEL); 355*9ee0a055SDanilo Krummrich serio = kzalloc(sizeof(struct serio), GFP_KERNEL); 356*9ee0a055SDanilo Krummrich if (!drvdata || !serio) { 357*9ee0a055SDanilo Krummrich error = -ENOMEM; 358*9ee0a055SDanilo Krummrich goto err_free_serio; 359*9ee0a055SDanilo Krummrich } 360*9ee0a055SDanilo Krummrich 361*9ee0a055SDanilo Krummrich error = ps2_gpio_get_props(dev, drvdata); 362*9ee0a055SDanilo Krummrich if (error) 363*9ee0a055SDanilo Krummrich goto err_free_serio; 364*9ee0a055SDanilo Krummrich 365*9ee0a055SDanilo Krummrich if (gpiod_cansleep(drvdata->gpio_data) || 366*9ee0a055SDanilo Krummrich gpiod_cansleep(drvdata->gpio_clk)) { 367*9ee0a055SDanilo Krummrich dev_err(dev, "GPIO data or clk are connected via slow bus\n"); 368*9ee0a055SDanilo Krummrich error = -EINVAL; 369*9ee0a055SDanilo Krummrich } 370*9ee0a055SDanilo Krummrich 371*9ee0a055SDanilo Krummrich drvdata->irq = platform_get_irq(pdev, 0); 372*9ee0a055SDanilo Krummrich if (drvdata->irq < 0) { 373*9ee0a055SDanilo Krummrich dev_err(dev, "failed to get irq from platform resource: %d\n", 374*9ee0a055SDanilo Krummrich drvdata->irq); 375*9ee0a055SDanilo Krummrich error = drvdata->irq; 376*9ee0a055SDanilo Krummrich goto err_free_serio; 377*9ee0a055SDanilo Krummrich } 378*9ee0a055SDanilo Krummrich 379*9ee0a055SDanilo Krummrich error = devm_request_irq(dev, drvdata->irq, ps2_gpio_irq, 380*9ee0a055SDanilo Krummrich IRQF_NO_THREAD, DRIVER_NAME, drvdata); 381*9ee0a055SDanilo Krummrich if (error) { 382*9ee0a055SDanilo Krummrich dev_err(dev, "failed to request irq %d: %d\n", 383*9ee0a055SDanilo Krummrich drvdata->irq, error); 384*9ee0a055SDanilo Krummrich goto err_free_serio; 385*9ee0a055SDanilo Krummrich } 386*9ee0a055SDanilo Krummrich 387*9ee0a055SDanilo Krummrich /* Keep irq disabled until serio->open is called. */ 388*9ee0a055SDanilo Krummrich disable_irq(drvdata->irq); 389*9ee0a055SDanilo Krummrich 390*9ee0a055SDanilo Krummrich serio->id.type = SERIO_8042; 391*9ee0a055SDanilo Krummrich serio->open = ps2_gpio_open; 392*9ee0a055SDanilo Krummrich serio->close = ps2_gpio_close; 393*9ee0a055SDanilo Krummrich /* Write can be enabled in platform/dt data, but possibly it will not 394*9ee0a055SDanilo Krummrich * work because of the tough timings. 395*9ee0a055SDanilo Krummrich */ 396*9ee0a055SDanilo Krummrich serio->write = drvdata->write_enable ? ps2_gpio_write : NULL; 397*9ee0a055SDanilo Krummrich serio->port_data = drvdata; 398*9ee0a055SDanilo Krummrich serio->dev.parent = dev; 399*9ee0a055SDanilo Krummrich strlcpy(serio->name, dev_name(dev), sizeof(serio->name)); 400*9ee0a055SDanilo Krummrich strlcpy(serio->phys, dev_name(dev), sizeof(serio->phys)); 401*9ee0a055SDanilo Krummrich 402*9ee0a055SDanilo Krummrich drvdata->serio = serio; 403*9ee0a055SDanilo Krummrich drvdata->dev = dev; 404*9ee0a055SDanilo Krummrich drvdata->mode = PS2_MODE_RX; 405*9ee0a055SDanilo Krummrich 406*9ee0a055SDanilo Krummrich /* Tx count always starts at 1, as the start bit is sent implicitly by 407*9ee0a055SDanilo Krummrich * host-to-device communication initialization. 408*9ee0a055SDanilo Krummrich */ 409*9ee0a055SDanilo Krummrich drvdata->tx_cnt = 1; 410*9ee0a055SDanilo Krummrich 411*9ee0a055SDanilo Krummrich INIT_DELAYED_WORK(&drvdata->tx_work, ps2_gpio_tx_work_fn); 412*9ee0a055SDanilo Krummrich init_completion(&drvdata->tx_done); 413*9ee0a055SDanilo Krummrich mutex_init(&drvdata->tx_mutex); 414*9ee0a055SDanilo Krummrich 415*9ee0a055SDanilo Krummrich serio_register_port(serio); 416*9ee0a055SDanilo Krummrich platform_set_drvdata(pdev, drvdata); 417*9ee0a055SDanilo Krummrich 418*9ee0a055SDanilo Krummrich return 0; /* success */ 419*9ee0a055SDanilo Krummrich 420*9ee0a055SDanilo Krummrich err_free_serio: 421*9ee0a055SDanilo Krummrich kfree(serio); 422*9ee0a055SDanilo Krummrich return error; 423*9ee0a055SDanilo Krummrich } 424*9ee0a055SDanilo Krummrich 425*9ee0a055SDanilo Krummrich static int ps2_gpio_remove(struct platform_device *pdev) 426*9ee0a055SDanilo Krummrich { 427*9ee0a055SDanilo Krummrich struct ps2_gpio_data *drvdata = platform_get_drvdata(pdev); 428*9ee0a055SDanilo Krummrich 429*9ee0a055SDanilo Krummrich serio_unregister_port(drvdata->serio); 430*9ee0a055SDanilo Krummrich return 0; 431*9ee0a055SDanilo Krummrich } 432*9ee0a055SDanilo Krummrich 433*9ee0a055SDanilo Krummrich #if defined(CONFIG_OF) 434*9ee0a055SDanilo Krummrich static const struct of_device_id ps2_gpio_match[] = { 435*9ee0a055SDanilo Krummrich { .compatible = "ps2-gpio", }, 436*9ee0a055SDanilo Krummrich { }, 437*9ee0a055SDanilo Krummrich }; 438*9ee0a055SDanilo Krummrich MODULE_DEVICE_TABLE(of, ps2_gpio_match); 439*9ee0a055SDanilo Krummrich #endif 440*9ee0a055SDanilo Krummrich 441*9ee0a055SDanilo Krummrich static struct platform_driver ps2_gpio_driver = { 442*9ee0a055SDanilo Krummrich .probe = ps2_gpio_probe, 443*9ee0a055SDanilo Krummrich .remove = ps2_gpio_remove, 444*9ee0a055SDanilo Krummrich .driver = { 445*9ee0a055SDanilo Krummrich .name = DRIVER_NAME, 446*9ee0a055SDanilo Krummrich .of_match_table = of_match_ptr(ps2_gpio_match), 447*9ee0a055SDanilo Krummrich }, 448*9ee0a055SDanilo Krummrich }; 449*9ee0a055SDanilo Krummrich module_platform_driver(ps2_gpio_driver); 450*9ee0a055SDanilo Krummrich 451*9ee0a055SDanilo Krummrich MODULE_AUTHOR("Danilo Krummrich <danilokrummrich@dk-develop.de>"); 452*9ee0a055SDanilo Krummrich MODULE_DESCRIPTION("GPIO PS2 driver"); 453*9ee0a055SDanilo Krummrich MODULE_LICENSE("GPL v2"); 454