Lines Matching refs:spidev

53 static inline void spidev_mst_slave_ready_status(struct spidev_rkmst_data *spidev, bool status)  in spidev_mst_slave_ready_status()  argument
55 spidev->ready_status = status; in spidev_mst_slave_ready_status()
60 struct spidev_rkmst_data *spidev = (struct spidev_rkmst_data *)arg; in spidev_mst_slave_ready_interrupt() local
62 spidev_mst_slave_ready_status(spidev, true); in spidev_mst_slave_ready_interrupt()
67 static bool spidev_mst_check_slave_ready(struct spidev_rkmst_data *spidev) in spidev_mst_check_slave_ready() argument
69 return spidev->ready_status; in spidev_mst_check_slave_ready()
72 static int spidev_mst_wait_for_slave_ready(struct spidev_rkmst_data *spidev, in spidev_mst_wait_for_slave_ready() argument
79 ready, 100, timeout_us + 100, false, spidev); in spidev_mst_wait_for_slave_ready()
81 dev_err(&spidev->spi->dev, "timeout and reset slave\n"); in spidev_mst_wait_for_slave_ready()
89 static int spidev_mst_write(struct spidev_rkmst_data *spidev, const void *txbuf, size_t n) in spidev_mst_write() argument
91 struct spi_device *spi = spidev->spi; in spidev_mst_write()
103 ret = spidev_mst_wait_for_slave_ready(spidev, SPI_OBJ_DEFAULT_TIMEOUT_US); in spidev_mst_write()
107 spidev_mst_slave_ready_status(spidev, false); in spidev_mst_write()
113 static int spidev_mst_write_bypass(struct spidev_rkmst_data *spidev, const void *txbuf, size_t n) in spidev_mst_write_bypass() argument
115 struct spi_device *spi = spidev->spi; in spidev_mst_write_bypass()
132 static int spidev_mst_read(struct spidev_rkmst_data *spidev, void *rxbuf, size_t n) in spidev_mst_read() argument
134 struct spi_device *spi = spidev->spi; in spidev_mst_read()
146 ret = spidev_mst_wait_for_slave_ready(spidev, SPI_OBJ_MAX_XFER_SIZE); in spidev_mst_read()
150 spidev_mst_slave_ready_status(spidev, false); in spidev_mst_read()
156 static int spidev_slv_write_and_read(struct spidev_rkmst_data *spidev, in spidev_slv_write_and_read() argument
160 struct spi_device *spi = spidev->spi; in spidev_slv_write_and_read()
172 ret = spidev_mst_wait_for_slave_ready(spidev, SPI_OBJ_MAX_XFER_SIZE); in spidev_slv_write_and_read()
176 spidev_mst_slave_ready_status(spidev, false); in spidev_slv_write_and_read()
182 static void spidev_rkmst_reset_slave(struct spidev_rkmst_data *spidev) in spidev_rkmst_reset_slave() argument
184 struct spi_obj_ctrl *ctrl = (struct spi_obj_ctrl *)spidev->ctrlbuf; in spidev_rkmst_reset_slave()
188 spidev_mst_write_bypass(spidev, ctrl, SPI_OBJ_MAX_XFER_SIZE); in spidev_rkmst_reset_slave()
190 spidev_mst_write_bypass(spidev, ctrl, SPI_OBJ_MAX_XFER_SIZE); in spidev_rkmst_reset_slave()
194 static int spidev_rkmst_ctrl(struct spidev_rkmst_data *spidev, u32 cmd, u16 addr, u32 data) in spidev_rkmst_ctrl() argument
196 struct spi_obj_ctrl *ctrl = (struct spi_obj_ctrl *)spidev->ctrlbuf; in spidev_rkmst_ctrl()
197 struct spi_device *spi = spidev->spi; in spidev_rkmst_ctrl()
200 if (spidev->verbose) in spidev_rkmst_ctrl()
207 ret = spidev_mst_write(spidev, ctrl, SPI_OBJ_CTRL_MSG_SIZE); in spidev_rkmst_ctrl()
216 static int spidev_rkmst_xfer(struct spidev_rkmst_data *spidev, void *tx, in spidev_rkmst_xfer() argument
219 struct spi_device *spi = spidev->spi; in spidev_rkmst_xfer()
233 ret = spidev_rkmst_ctrl(spidev, cmd, addr, len); in spidev_rkmst_xfer()
235 spidev_rkmst_reset_slave(spidev); in spidev_rkmst_xfer()
239 if (spidev->verbose) in spidev_rkmst_xfer()
244 ret = spidev_mst_read(spidev, rx, len); in spidev_rkmst_xfer()
249 ret = spidev_mst_write(spidev, tx, len); in spidev_rkmst_xfer()
254 ret = spidev_slv_write_and_read(spidev, tx, rx, len); in spidev_rkmst_xfer()
273 struct spidev_rkmst_data *spidev; in spidev_rkmst_misc_write() local
283 spidev = filp->private_data; in spidev_rkmst_misc_write()
285 if (!spidev) in spidev_rkmst_misc_write()
288 spi = spidev->spi; in spidev_rkmst_misc_write()
318 spidev->verbose = true; in spidev_rkmst_misc_write()
320 spidev->verbose = false; in spidev_rkmst_misc_write()
322 spidev_rkmst_ctrl(spidev, SPI_OBJ_CTRL_CMD_INIT, 0x55AA, 0x1234567); in spidev_rkmst_misc_write()
344 spidev_rkmst_xfer(spidev, NULL, spidev->rxbuf, addr, len); in spidev_rkmst_misc_write()
350 spidev->rxbuf, in spidev_rkmst_misc_write()
375 spidev->txbuf[i] = i & 0xFF; in spidev_rkmst_misc_write()
376 ((u32 *)spidev->txbuf)[0] = addr; in spidev_rkmst_misc_write()
378 spidev_rkmst_xfer(spidev, spidev->txbuf, NULL, addr, len); in spidev_rkmst_misc_write()
401 spidev->txbuf[i] = i & 0xFF; in spidev_rkmst_misc_write()
402 ((u32 *)spidev->txbuf)[0] = addr; in spidev_rkmst_misc_write()
404 spidev_rkmst_xfer(spidev, spidev->txbuf, spidev->rxbuf, addr, len); in spidev_rkmst_misc_write()
410 spidev->rxbuf, in spidev_rkmst_misc_write()
446 spidev_rkmst_xfer(spidev, tempbuf, NULL, addr, len); in spidev_rkmst_misc_write()
449 prandom_bytes(spidev->txbuf, len); in spidev_rkmst_misc_write()
450 spidev_rkmst_xfer(spidev, spidev->txbuf, spidev->rxbuf, addr, len); in spidev_rkmst_misc_write()
451 if (memcmp(spidev->rxbuf, tempbuf, len)) { in spidev_rkmst_misc_write()
457 spidev->txbuf, in spidev_rkmst_misc_write()
464 spidev->rxbuf, in spidev_rkmst_misc_write()
476 memcpy(tempbuf, spidev->txbuf, len); in spidev_rkmst_misc_write()
490 prandom_bytes(spidev->txbuf, len); in spidev_rkmst_misc_write()
491 spidev_rkmst_xfer(spidev, spidev->txbuf, NULL, addr, len); in spidev_rkmst_misc_write()
492 spidev_rkmst_xfer(spidev, NULL, spidev->rxbuf, addr, len); in spidev_rkmst_misc_write()
493 if (memcmp(spidev->rxbuf, spidev->txbuf, len)) { in spidev_rkmst_misc_write()
499 spidev->txbuf, in spidev_rkmst_misc_write()
506 spidev->rxbuf, in spidev_rkmst_misc_write()
532 struct spidev_rkmst_data *spidev; in spidev_rkmst_misc_open() local
534 spidev = container_of(miscdev, struct spidev_rkmst_data, misc_dev); in spidev_rkmst_misc_open()
535 filp->private_data = spidev; in spidev_rkmst_misc_open()
547 struct spidev_rkmst_data *spidev = NULL; in spidev_rkmst_probe() local
553 spidev = devm_kzalloc(&spi->dev, sizeof(struct spidev_rkmst_data), GFP_KERNEL); in spidev_rkmst_probe()
554 if (!spidev) in spidev_rkmst_probe()
557 spidev->ctrlbuf = devm_kzalloc(&spi->dev, SPI_OBJ_MAX_XFER_SIZE, GFP_KERNEL); in spidev_rkmst_probe()
558 if (!spidev->ctrlbuf) in spidev_rkmst_probe()
561 spidev->rxbuf = devm_kzalloc(&spi->dev, SPI_OBJ_APP_RAM_SIZE, GFP_KERNEL | GFP_DMA); in spidev_rkmst_probe()
562 if (!spidev->rxbuf) in spidev_rkmst_probe()
565 spidev->txbuf = devm_kzalloc(&spi->dev, SPI_OBJ_MAX_XFER_SIZE, GFP_KERNEL); in spidev_rkmst_probe()
566 if (!spidev->txbuf) in spidev_rkmst_probe()
569 spidev->spi = spi; in spidev_rkmst_probe()
570 spidev->dev = &spi->dev; in spidev_rkmst_probe()
572 spidev_mst_slave_ready_status(spidev, false); in spidev_rkmst_probe()
573 spidev->ready = devm_gpiod_get_optional(&spi->dev, "ready", GPIOD_IN); in spidev_rkmst_probe()
574 if (IS_ERR(spidev->ready)) in spidev_rkmst_probe()
575 return dev_err_probe(&spi->dev, PTR_ERR(spidev->ready), in spidev_rkmst_probe()
578 spidev->ready_irqnum = gpiod_to_irq(spidev->ready); in spidev_rkmst_probe()
579 ret = devm_request_irq(&spi->dev, spidev->ready_irqnum, spidev_mst_slave_ready_interrupt, in spidev_rkmst_probe()
580 IRQF_TRIGGER_FALLING, "spidev-mst-ready-in", spidev); in spidev_rkmst_probe()
585 dev_set_drvdata(&spi->dev, spidev); in spidev_rkmst_probe()
589 spidev->misc_dev.minor = MISC_DYNAMIC_MINOR; in spidev_rkmst_probe()
590 spidev->misc_dev.name = "spidev_rkmst_misc"; in spidev_rkmst_probe()
591 spidev->misc_dev.fops = &spidev_rkmst_misc_fops; in spidev_rkmst_probe()
592 spidev->misc_dev.parent = &spi->dev; in spidev_rkmst_probe()
593 ret = misc_register(&spidev->misc_dev); in spidev_rkmst_probe()
599 spidev_rkmst_reset_slave(spidev); in spidev_rkmst_probe()
606 struct spidev_rkmst_data *spidev = dev_get_drvdata(&spi->dev); in spidev_rkmst_remove() local
608 misc_deregister(&spidev->misc_dev); in spidev_rkmst_remove()