Lines Matching +full:ctrl +full:- +full:len
1 // SPDX-License-Identifier: (GPL-2.0+ OR MIT)
47 int ret = -1; in spidev_slv_write()
48 struct spi_device *spi = spidev->spi; in spidev_slv_write()
51 .len = n, in spidev_slv_write()
65 int ret = -1; in spidev_slv_read()
66 struct spi_device *spi = spidev->spi; in spidev_slv_read()
69 .len = n, in spidev_slv_read()
82 void *rx_buf, size_t len) in spidev_slv_write_and_read() argument
84 struct spi_device *spi = spidev->spi; in spidev_slv_write_and_read()
88 .len = len, in spidev_slv_write_and_read()
108 return -EINVAL; in spidev_rkslv_misc_write()
110 spidev = filp->private_data; in spidev_rkslv_misc_write()
113 return -ESHUTDOWN; in spidev_rkslv_misc_write()
115 spi = spidev->spi; in spidev_rkslv_misc_write()
118 return -EFAULT; in spidev_rkslv_misc_write()
133 tmp[n - 1] = 0; in spidev_rkslv_misc_write()
139 return -EINVAL; in spidev_rkslv_misc_write()
142 return -EINVAL; in spidev_rkslv_misc_write()
145 spidev->verbose = true; in spidev_rkslv_misc_write()
147 spidev->verbose = false; in spidev_rkslv_misc_write()
149 int addr, len; in spidev_rkslv_misc_write() local
152 return -EINVAL; in spidev_rkslv_misc_write()
155 return -EINVAL; in spidev_rkslv_misc_write()
156 if (kstrtoint(argv[1], 0, &len)) in spidev_rkslv_misc_write()
157 return -EINVAL; in spidev_rkslv_misc_write()
159 if (!len) { in spidev_rkslv_misc_write()
160 dev_err(&spi->dev, "param invalid,%s %s\n", argv[0], argv[1]); in spidev_rkslv_misc_write()
161 return -EINVAL; in spidev_rkslv_misc_write()
164 if (addr + len > SPI_OBJ_APP_RAM_SIZE) { in spidev_rkslv_misc_write()
165 dev_err(&spi->dev, "appmem print out of size\n"); in spidev_rkslv_misc_write()
166 return -EINVAL; in spidev_rkslv_misc_write()
173 spidev->appmem + addr, in spidev_rkslv_misc_write()
174 len, in spidev_rkslv_misc_write()
177 dev_err(&spi->dev, "unknown command\n"); in spidev_rkslv_misc_write()
185 struct miscdevice *miscdev = filp->private_data; in spidev_rkslv_misc_open()
189 filp->private_data = spidev; in spidev_rkslv_misc_open()
201 char *ctrlbuf = spidev->ctrlbuf, *appmem = spidev->appmem, *tempbuf = spidev->tempbuf; in spidev_rkslv_xfer()
202 struct spi_obj_ctrl *ctrl; in spidev_rkslv_xfer() local
203 struct spi_device *spi = spidev->spi; in spidev_rkslv_xfer()
204 u32 len; in spidev_rkslv_xfer() local
207 memset(spidev->ctrlbuf, 0, SPI_OBJ_CTRL_MSG_SIZE); in spidev_rkslv_xfer()
208 ret = spidev_slv_read(spidev, spidev->ctrlbuf, SPI_OBJ_CTRL_MSG_SIZE); in spidev_rkslv_xfer()
210 dev_err(&spi->dev, "%s ctrl\n", __func__); in spidev_rkslv_xfer()
211 return -EIO; in spidev_rkslv_xfer()
214 ctrl = (struct spi_obj_ctrl *)ctrlbuf; in spidev_rkslv_xfer()
215 if (spidev->verbose) in spidev_rkslv_xfer()
216 dev_err(&spi->dev, "ctrl cmd=%x addr=0x%x data=0x%x\n", in spidev_rkslv_xfer()
217 ctrl->cmd, ctrl->addr, ctrl->data); in spidev_rkslv_xfer()
219 switch (ctrl->cmd) { in spidev_rkslv_xfer()
223 len = ctrl->data; in spidev_rkslv_xfer()
224 ret = spidev_slv_write(spidev, appmem + ctrl->addr, len); in spidev_rkslv_xfer()
226 dev_err(&spi->dev, "%s cmd=%x addr=0x%x data=0x%x\n", in spidev_rkslv_xfer()
227 __func__, ctrl->cmd, ctrl->addr, ctrl->data); in spidev_rkslv_xfer()
228 return -EIO; in spidev_rkslv_xfer()
232 len = ctrl->data; in spidev_rkslv_xfer()
233 ret = spidev_slv_read(spidev, appmem + ctrl->addr, len); in spidev_rkslv_xfer()
235 dev_err(&spi->dev, "%s cmd=%x addr=0x%x data=0x%x\n", in spidev_rkslv_xfer()
236 __func__, ctrl->cmd, ctrl->addr, ctrl->data); in spidev_rkslv_xfer()
237 return -EIO; in spidev_rkslv_xfer()
239 if (spidev->verbose) { in spidev_rkslv_xfer()
240 print_hex_dump(KERN_ERR, "s-r: ", in spidev_rkslv_xfer()
244 appmem + ctrl->addr, in spidev_rkslv_xfer()
245 len, in spidev_rkslv_xfer()
250 len = ctrl->data; in spidev_rkslv_xfer()
251 ret = spidev_slv_write_and_read(spidev, appmem + ctrl->addr, tempbuf, len); in spidev_rkslv_xfer()
253 dev_err(&spi->dev, "%s cmd=%x addr=0x%x data=0x%x\n", in spidev_rkslv_xfer()
254 __func__, ctrl->cmd, ctrl->addr, ctrl->data); in spidev_rkslv_xfer()
255 return -EIO; in spidev_rkslv_xfer()
257 if (spidev->verbose) { in spidev_rkslv_xfer()
258 print_hex_dump(KERN_ERR, "s-d-t: ", in spidev_rkslv_xfer()
262 appmem + ctrl->addr, in spidev_rkslv_xfer()
263 len, in spidev_rkslv_xfer()
265 print_hex_dump(KERN_ERR, "s-d-r: ", in spidev_rkslv_xfer()
270 len, in spidev_rkslv_xfer()
273 memcpy(appmem + ctrl->addr, tempbuf, len); in spidev_rkslv_xfer()
276 if (spidev->verbose) in spidev_rkslv_xfer()
277 dev_err(&spi->dev, "%s unknown\n", __func__); in spidev_rkslv_xfer()
281 if (spidev->verbose) in spidev_rkslv_xfer()
282 dev_err(&spi->dev, "xfer len=0x%x\n", ctrl->data); in spidev_rkslv_xfer()
291 while (spidev->tsk_run) in spidev_rkslv_ctrl_receiver_thread()
303 return -ENOMEM; in spidev_rkslv_probe()
305 spidev = devm_kzalloc(&spi->dev, sizeof(struct spidev_rkslv_data), GFP_KERNEL); in spidev_rkslv_probe()
307 return -ENOMEM; in spidev_rkslv_probe()
309 spidev->ctrlbuf = devm_kzalloc(&spi->dev, SPI_OBJ_MAX_XFER_SIZE, GFP_KERNEL); in spidev_rkslv_probe()
310 if (!spidev->ctrlbuf) in spidev_rkslv_probe()
311 return -ENOMEM; in spidev_rkslv_probe()
313 spidev->appmem = devm_kzalloc(&spi->dev, SPI_OBJ_APP_RAM_SIZE, GFP_KERNEL | GFP_DMA); in spidev_rkslv_probe()
314 if (!spidev->appmem) in spidev_rkslv_probe()
315 return -ENOMEM; in spidev_rkslv_probe()
317 spidev->tempbuf = devm_kzalloc(&spi->dev, SPI_OBJ_MAX_XFER_SIZE, GFP_KERNEL); in spidev_rkslv_probe()
318 if (!spidev->tempbuf) in spidev_rkslv_probe()
319 return -ENOMEM; in spidev_rkslv_probe()
321 spidev->spi = spi; in spidev_rkslv_probe()
322 spidev->dev = &spi->dev; in spidev_rkslv_probe()
323 dev_set_drvdata(&spi->dev, spidev); in spidev_rkslv_probe()
325 dev_err(&spi->dev, "mode=%d, max_speed_hz=%d\n", spi->mode, spi->max_speed_hz); in spidev_rkslv_probe()
327 spidev->misc_dev.minor = MISC_DYNAMIC_MINOR; in spidev_rkslv_probe()
328 spidev->misc_dev.name = "spidev_rkslv_misc"; in spidev_rkslv_probe()
329 spidev->misc_dev.fops = &spidev_rkslv_misc_fops; in spidev_rkslv_probe()
330 spidev->misc_dev.parent = &spi->dev; in spidev_rkslv_probe()
331 ret = misc_register(&spidev->misc_dev); in spidev_rkslv_probe()
333 dev_err(&spi->dev, "fail to register misc device\n"); in spidev_rkslv_probe()
337 spidev->tsk_run = true; in spidev_rkslv_probe()
338 spidev->tsk = kthread_run(spidev_rkslv_ctrl_receiver_thread, spidev, "spidev-rkslv"); in spidev_rkslv_probe()
339 if (IS_ERR(spidev->tsk)) { in spidev_rkslv_probe()
340 dev_err(&spi->dev, "start spidev-rkslv thread failed\n"); in spidev_rkslv_probe()
341 return PTR_ERR(spidev->tsk); in spidev_rkslv_probe()
349 struct spidev_rkslv_data *spidev = dev_get_drvdata(&spi->dev); in spidev_rkslv_remove()
351 spidev->tsk_run = false; in spidev_rkslv_remove()
353 kthread_stop(spidev->tsk); in spidev_rkslv_remove()
354 misc_deregister(&spidev->misc_dev); in spidev_rkslv_remove()
361 { .compatible = "rockchip,spi-obj-slave", },
379 MODULE_AUTHOR("Jon Lin <jon.lin@rock-chips.com>");