Lines Matching refs:drvdata
69 struct ps2_gpio_data *drvdata = serio->port_data; in ps2_gpio_open() local
71 enable_irq(drvdata->irq); in ps2_gpio_open()
77 struct ps2_gpio_data *drvdata = serio->port_data; in ps2_gpio_close() local
79 disable_irq(drvdata->irq); in ps2_gpio_close()
84 struct ps2_gpio_data *drvdata = serio->port_data; in __ps2_gpio_write() local
86 disable_irq_nosync(drvdata->irq); in __ps2_gpio_write()
87 gpiod_direction_output(drvdata->gpio_clk, 0); in __ps2_gpio_write()
89 drvdata->mode = PS2_MODE_TX; in __ps2_gpio_write()
90 drvdata->tx_byte = val; in __ps2_gpio_write()
92 schedule_delayed_work(&drvdata->tx_work, usecs_to_jiffies(200)); in __ps2_gpio_write()
99 struct ps2_gpio_data *drvdata = serio->port_data; in ps2_gpio_write() local
103 mutex_lock(&drvdata->tx_mutex); in ps2_gpio_write()
105 if (!wait_for_completion_timeout(&drvdata->tx_done, in ps2_gpio_write()
108 mutex_unlock(&drvdata->tx_mutex); in ps2_gpio_write()
119 struct ps2_gpio_data *drvdata = container_of(dwork, in ps2_gpio_tx_work_fn() local
123 enable_irq(drvdata->irq); in ps2_gpio_tx_work_fn()
124 gpiod_direction_output(drvdata->gpio_data, 0); in ps2_gpio_tx_work_fn()
125 gpiod_direction_input(drvdata->gpio_clk); in ps2_gpio_tx_work_fn()
128 static irqreturn_t ps2_gpio_irq_rx(struct ps2_gpio_data *drvdata) in ps2_gpio_irq_rx() argument
135 byte = drvdata->rx_byte; in ps2_gpio_irq_rx()
136 cnt = drvdata->rx_cnt; in ps2_gpio_irq_rx()
142 dev_err(drvdata->dev, in ps2_gpio_irq_rx()
148 data = gpiod_get_value(drvdata->gpio_data); in ps2_gpio_irq_rx()
150 dev_err(drvdata->dev, "RX: failed to get data gpio val: %d\n", in ps2_gpio_irq_rx()
159 dev_err(drvdata->dev, "RX: start bit should be low\n"); in ps2_gpio_irq_rx()
179 dev_warn(drvdata->dev, "RX: parity error\n"); in ps2_gpio_irq_rx()
180 if (!drvdata->write_enable) in ps2_gpio_irq_rx()
187 if (!drvdata->write_enable) { in ps2_gpio_irq_rx()
200 serio_interrupt(drvdata->serio, byte, rxflags); in ps2_gpio_irq_rx()
201 dev_dbg(drvdata->dev, "RX: sending byte 0x%x\n", byte); in ps2_gpio_irq_rx()
206 dev_err(drvdata->dev, "RX: stop bit should be high\n"); in ps2_gpio_irq_rx()
213 dev_err(drvdata->dev, "RX: got out of sync with the device\n"); in ps2_gpio_irq_rx()
223 __ps2_gpio_write(drvdata->serio, PS2_CMD_RESEND); in ps2_gpio_irq_rx()
225 drvdata->rx_cnt = cnt; in ps2_gpio_irq_rx()
226 drvdata->rx_byte = byte; in ps2_gpio_irq_rx()
230 static irqreturn_t ps2_gpio_irq_tx(struct ps2_gpio_data *drvdata) in ps2_gpio_irq_tx() argument
236 cnt = drvdata->tx_cnt; in ps2_gpio_irq_tx()
237 byte = drvdata->tx_byte; in ps2_gpio_irq_tx()
243 dev_err(drvdata->dev, in ps2_gpio_irq_tx()
252 dev_err(drvdata->dev, in ps2_gpio_irq_tx()
264 gpiod_set_value(drvdata->gpio_data, data); in ps2_gpio_irq_tx()
269 gpiod_set_value(drvdata->gpio_data, data); in ps2_gpio_irq_tx()
273 gpiod_direction_input(drvdata->gpio_data); in ps2_gpio_irq_tx()
281 gpiod_direction_input(drvdata->gpio_data); in ps2_gpio_irq_tx()
282 data = gpiod_get_value(drvdata->gpio_data); in ps2_gpio_irq_tx()
284 dev_warn(drvdata->dev, "TX: received NACK, retry\n"); in ps2_gpio_irq_tx()
288 drvdata->mode = PS2_MODE_RX; in ps2_gpio_irq_tx()
289 complete(&drvdata->tx_done); in ps2_gpio_irq_tx()
298 gpiod_direction_input(drvdata->gpio_data); in ps2_gpio_irq_tx()
299 dev_err(drvdata->dev, "TX: got out of sync with the device\n"); in ps2_gpio_irq_tx()
309 gpiod_direction_input(drvdata->gpio_data); in ps2_gpio_irq_tx()
310 __ps2_gpio_write(drvdata->serio, drvdata->tx_byte); in ps2_gpio_irq_tx()
312 drvdata->tx_cnt = cnt; in ps2_gpio_irq_tx()
318 struct ps2_gpio_data *drvdata = dev_id; in ps2_gpio_irq() local
320 return drvdata->mode ? ps2_gpio_irq_tx(drvdata) : in ps2_gpio_irq()
321 ps2_gpio_irq_rx(drvdata); in ps2_gpio_irq()
325 struct ps2_gpio_data *drvdata) in ps2_gpio_get_props() argument
327 drvdata->gpio_data = devm_gpiod_get(dev, "data", GPIOD_IN); in ps2_gpio_get_props()
328 if (IS_ERR(drvdata->gpio_data)) { in ps2_gpio_get_props()
330 PTR_ERR(drvdata->gpio_data)); in ps2_gpio_get_props()
331 return PTR_ERR(drvdata->gpio_data); in ps2_gpio_get_props()
334 drvdata->gpio_clk = devm_gpiod_get(dev, "clk", GPIOD_IN); in ps2_gpio_get_props()
335 if (IS_ERR(drvdata->gpio_clk)) { in ps2_gpio_get_props()
337 PTR_ERR(drvdata->gpio_clk)); in ps2_gpio_get_props()
338 return PTR_ERR(drvdata->gpio_clk); in ps2_gpio_get_props()
341 drvdata->write_enable = device_property_read_bool(dev, in ps2_gpio_get_props()
349 struct ps2_gpio_data *drvdata; in ps2_gpio_probe() local
354 drvdata = devm_kzalloc(dev, sizeof(struct ps2_gpio_data), GFP_KERNEL); in ps2_gpio_probe()
356 if (!drvdata || !serio) { in ps2_gpio_probe()
361 error = ps2_gpio_get_props(dev, drvdata); in ps2_gpio_probe()
365 if (gpiod_cansleep(drvdata->gpio_data) || in ps2_gpio_probe()
366 gpiod_cansleep(drvdata->gpio_clk)) { in ps2_gpio_probe()
372 drvdata->irq = platform_get_irq(pdev, 0); in ps2_gpio_probe()
373 if (drvdata->irq < 0) { in ps2_gpio_probe()
375 drvdata->irq); in ps2_gpio_probe()
376 error = drvdata->irq; in ps2_gpio_probe()
380 error = devm_request_irq(dev, drvdata->irq, ps2_gpio_irq, in ps2_gpio_probe()
381 IRQF_NO_THREAD, DRIVER_NAME, drvdata); in ps2_gpio_probe()
384 drvdata->irq, error); in ps2_gpio_probe()
389 disable_irq(drvdata->irq); in ps2_gpio_probe()
397 serio->write = drvdata->write_enable ? ps2_gpio_write : NULL; in ps2_gpio_probe()
398 serio->port_data = drvdata; in ps2_gpio_probe()
403 drvdata->serio = serio; in ps2_gpio_probe()
404 drvdata->dev = dev; in ps2_gpio_probe()
405 drvdata->mode = PS2_MODE_RX; in ps2_gpio_probe()
410 drvdata->tx_cnt = 1; in ps2_gpio_probe()
412 INIT_DELAYED_WORK(&drvdata->tx_work, ps2_gpio_tx_work_fn); in ps2_gpio_probe()
413 init_completion(&drvdata->tx_done); in ps2_gpio_probe()
414 mutex_init(&drvdata->tx_mutex); in ps2_gpio_probe()
417 platform_set_drvdata(pdev, drvdata); in ps2_gpio_probe()
428 struct ps2_gpio_data *drvdata = platform_get_drvdata(pdev); in ps2_gpio_remove() local
430 serio_unregister_port(drvdata->serio); in ps2_gpio_remove()