Lines Matching +full:tx +full:- +full:mailbox +full:- +full:count
1 // SPDX-License-Identifier: GPL-2.0-or-later
50 size_t count, loff_t *ppos) in mbox_test_signal_write() argument
52 struct mbox_test_device *tdev = filp->private_data; in mbox_test_signal_write()
54 if (!tdev->tx_channel) { in mbox_test_signal_write()
55 dev_err(tdev->dev, "Channel cannot do Tx\n"); in mbox_test_signal_write()
56 return -EINVAL; in mbox_test_signal_write()
59 if (count > MBOX_MAX_SIG_LEN) { in mbox_test_signal_write()
60 dev_err(tdev->dev, in mbox_test_signal_write()
62 count, MBOX_MAX_SIG_LEN); in mbox_test_signal_write()
63 return -EINVAL; in mbox_test_signal_write()
67 if (!tdev->signal) { in mbox_test_signal_write()
68 tdev->signal = kzalloc(MBOX_MAX_SIG_LEN, GFP_KERNEL); in mbox_test_signal_write()
69 if (!tdev->signal) in mbox_test_signal_write()
70 return -ENOMEM; in mbox_test_signal_write()
73 if (copy_from_user(tdev->signal, userbuf, count)) { in mbox_test_signal_write()
74 kfree(tdev->signal); in mbox_test_signal_write()
75 tdev->signal = NULL; in mbox_test_signal_write()
76 return -EFAULT; in mbox_test_signal_write()
79 return count; in mbox_test_signal_write()
90 struct mbox_test_device *tdev = filp->private_data; in mbox_test_message_fasync()
92 return fasync_helper(fd, filp, on, &tdev->async_queue); in mbox_test_message_fasync()
97 size_t count, loff_t *ppos) in mbox_test_message_write() argument
99 struct mbox_test_device *tdev = filp->private_data; in mbox_test_message_write()
104 if (!tdev->tx_channel) { in mbox_test_message_write()
105 dev_err(tdev->dev, "Channel cannot do Tx\n"); in mbox_test_message_write()
106 return -EINVAL; in mbox_test_message_write()
109 if (count > MBOX_MAX_MSG_LEN) { in mbox_test_message_write()
110 dev_err(tdev->dev, in mbox_test_message_write()
112 count, MBOX_MAX_MSG_LEN); in mbox_test_message_write()
113 return -EINVAL; in mbox_test_message_write()
118 return -ENOMEM; in mbox_test_message_write()
120 mutex_lock(&tdev->mutex); in mbox_test_message_write()
122 tdev->message = message; in mbox_test_message_write()
123 ret = copy_from_user(tdev->message, userbuf, count); in mbox_test_message_write()
125 ret = -EFAULT; in mbox_test_message_write()
133 if (tdev->tx_mmio && tdev->signal) { in mbox_test_message_write()
135 tdev->signal, MBOX_MAX_SIG_LEN); in mbox_test_message_write()
137 data = tdev->signal; in mbox_test_message_write()
139 data = tdev->message; in mbox_test_message_write()
142 tdev->message, MBOX_MAX_MSG_LEN); in mbox_test_message_write()
144 ret = mbox_send_message(tdev->tx_channel, data); in mbox_test_message_write()
146 dev_err(tdev->dev, "Failed to send message via mailbox\n"); in mbox_test_message_write()
149 kfree(tdev->signal); in mbox_test_message_write()
150 kfree(tdev->message); in mbox_test_message_write()
151 tdev->signal = NULL; in mbox_test_message_write()
153 mutex_unlock(&tdev->mutex); in mbox_test_message_write()
155 return ret < 0 ? ret : count; in mbox_test_message_write()
163 spin_lock_irqsave(&tdev->lock, flags); in mbox_test_message_data_ready()
165 spin_unlock_irqrestore(&tdev->lock, flags); in mbox_test_message_data_ready()
171 size_t count, loff_t *ppos) in mbox_test_message_read() argument
173 struct mbox_test_device *tdev = filp->private_data; in mbox_test_message_read()
183 return -ENOMEM; in mbox_test_message_read()
185 if (!tdev->rx_channel) { in mbox_test_message_read()
187 ret = simple_read_from_buffer(userbuf, count, ppos, in mbox_test_message_read()
192 add_wait_queue(&tdev->waitq, &wait); in mbox_test_message_read()
200 if (filp->f_flags & O_NONBLOCK) { in mbox_test_message_read()
201 ret = -EAGAIN; in mbox_test_message_read()
206 ret = -ERESTARTSYS; in mbox_test_message_read()
213 spin_lock_irqsave(&tdev->lock, flags); in mbox_test_message_read()
215 ptr = tdev->rx_buffer; in mbox_test_message_read()
224 *(touser + (l - 1)) = '\n'; in mbox_test_message_read()
228 memset(tdev->rx_buffer, 0, MBOX_MAX_MSG_LEN); in mbox_test_message_read()
231 spin_unlock_irqrestore(&tdev->lock, flags); in mbox_test_message_read()
233 ret = simple_read_from_buffer(userbuf, count, ppos, touser, MBOX_HEXDUMP_MAX_LEN); in mbox_test_message_read()
236 remove_wait_queue(&tdev->waitq, &wait); in mbox_test_message_read()
245 struct mbox_test_device *tdev = filp->private_data; in mbox_test_message_poll()
247 poll_wait(filp, &tdev->waitq, wait); in mbox_test_message_poll()
269 tdev->root_debugfs_dir = debugfs_create_dir(dev_name(&pdev->dev), NULL); in mbox_test_add_debugfs()
270 if (!tdev->root_debugfs_dir) { in mbox_test_add_debugfs()
271 dev_err(&pdev->dev, "Failed to create Mailbox debugfs\n"); in mbox_test_add_debugfs()
272 return -EINVAL; in mbox_test_add_debugfs()
275 debugfs_create_file("message", 0600, tdev->root_debugfs_dir, in mbox_test_add_debugfs()
278 debugfs_create_file("signal", 0200, tdev->root_debugfs_dir, in mbox_test_add_debugfs()
286 struct mbox_test_device *tdev = dev_get_drvdata(client->dev); in mbox_test_receive_message()
289 spin_lock_irqsave(&tdev->lock, flags); in mbox_test_receive_message()
290 if (tdev->rx_mmio) { in mbox_test_receive_message()
291 memcpy_fromio(tdev->rx_buffer, tdev->rx_mmio, MBOX_MAX_MSG_LEN); in mbox_test_receive_message()
293 tdev->rx_buffer, MBOX_MAX_MSG_LEN); in mbox_test_receive_message()
297 memcpy(tdev->rx_buffer, message, MBOX_MAX_MSG_LEN); in mbox_test_receive_message()
300 spin_unlock_irqrestore(&tdev->lock, flags); in mbox_test_receive_message()
302 wake_up_interruptible(&tdev->waitq); in mbox_test_receive_message()
304 kill_fasync(&tdev->async_queue, SIGIO, POLL_IN); in mbox_test_receive_message()
309 struct mbox_test_device *tdev = dev_get_drvdata(client->dev); in mbox_test_prepare_message()
311 if (tdev->tx_mmio) { in mbox_test_prepare_message()
312 if (tdev->signal) in mbox_test_prepare_message()
313 memcpy_toio(tdev->tx_mmio, tdev->message, MBOX_MAX_MSG_LEN); in mbox_test_prepare_message()
315 memcpy_toio(tdev->tx_mmio, message, MBOX_MAX_MSG_LEN); in mbox_test_prepare_message()
323 dev_warn(client->dev, in mbox_test_message_sent()
326 dev_info(client->dev, in mbox_test_message_sent()
336 client = devm_kzalloc(&pdev->dev, sizeof(*client), GFP_KERNEL); in mbox_test_request_channel()
338 return ERR_PTR(-ENOMEM); in mbox_test_request_channel()
340 client->dev = &pdev->dev; in mbox_test_request_channel()
341 client->rx_callback = mbox_test_receive_message; in mbox_test_request_channel()
342 client->tx_prepare = mbox_test_prepare_message; in mbox_test_request_channel()
343 client->tx_done = mbox_test_message_sent; in mbox_test_request_channel()
344 client->tx_block = true; in mbox_test_request_channel()
345 client->knows_txdone = false; in mbox_test_request_channel()
346 client->tx_tout = 500; in mbox_test_request_channel()
350 dev_warn(&pdev->dev, "Failed to request %s channel\n", name); in mbox_test_request_channel()
364 tdev = devm_kzalloc(&pdev->dev, sizeof(*tdev), GFP_KERNEL); in mbox_test_probe()
366 return -ENOMEM; in mbox_test_probe()
370 tdev->tx_mmio = devm_ioremap_resource(&pdev->dev, res); in mbox_test_probe()
371 if (PTR_ERR(tdev->tx_mmio) == -EBUSY) { in mbox_test_probe()
374 tdev->tx_mmio = devm_ioremap(&pdev->dev, res->start, size); in mbox_test_probe()
375 } else if (IS_ERR(tdev->tx_mmio)) { in mbox_test_probe()
376 tdev->tx_mmio = NULL; in mbox_test_probe()
381 tdev->rx_mmio = devm_ioremap_resource(&pdev->dev, res); in mbox_test_probe()
382 if (PTR_ERR(tdev->rx_mmio) == -EBUSY) { in mbox_test_probe()
384 tdev->rx_mmio = devm_ioremap(&pdev->dev, res->start, size); in mbox_test_probe()
385 } else if (IS_ERR(tdev->rx_mmio)) { in mbox_test_probe()
386 tdev->rx_mmio = tdev->tx_mmio; in mbox_test_probe()
389 tdev->tx_channel = mbox_test_request_channel(pdev, "tx"); in mbox_test_probe()
390 tdev->rx_channel = mbox_test_request_channel(pdev, "rx"); in mbox_test_probe()
392 if (!tdev->tx_channel && !tdev->rx_channel) in mbox_test_probe()
393 return -EPROBE_DEFER; in mbox_test_probe()
395 /* If Rx is not specified but has Rx MMIO, then Rx = Tx */ in mbox_test_probe()
396 if (!tdev->rx_channel && (tdev->rx_mmio != tdev->tx_mmio)) in mbox_test_probe()
397 tdev->rx_channel = tdev->tx_channel; in mbox_test_probe()
399 tdev->dev = &pdev->dev; in mbox_test_probe()
402 spin_lock_init(&tdev->lock); in mbox_test_probe()
403 mutex_init(&tdev->mutex); in mbox_test_probe()
405 if (tdev->rx_channel) { in mbox_test_probe()
406 tdev->rx_buffer = devm_kzalloc(&pdev->dev, in mbox_test_probe()
408 if (!tdev->rx_buffer) in mbox_test_probe()
409 return -ENOMEM; in mbox_test_probe()
416 init_waitqueue_head(&tdev->waitq); in mbox_test_probe()
417 dev_info(&pdev->dev, "Successfully registered\n"); in mbox_test_probe()
426 debugfs_remove_recursive(tdev->root_debugfs_dir); in mbox_test_remove()
428 if (tdev->tx_channel) in mbox_test_remove()
429 mbox_free_channel(tdev->tx_channel); in mbox_test_remove()
430 if (tdev->rx_channel) in mbox_test_remove()
431 mbox_free_channel(tdev->rx_channel); in mbox_test_remove()
437 { .compatible = "mailbox-test" },
452 MODULE_DESCRIPTION("Generic Mailbox Testing Facility");