static int mailbox_nios_probe(struct platform_device *pdev) { pr_info("Start: Mailbox to NIOS Init\n"); /* Send message to NIOS II */ client_sender.dev = &pdev->dev; /* Receive message from NIOS II */ client_receiver.dev = &pdev->dev; client_receiver.rx_callback = receiver; chan_sender = mbox_request_channel_byname(&client_sender, "mbox-tx"); if (chan_sender == ERR_PTR(-ENODEV) || !chan_sender) { pr_info("%s Unable to register TX nios channel", __func__); return -ENODEV; } chan_receiver = mbox_request_channel_byname(&client_receiver, "mbox-rx"); if (chan_sender == ERR_PTR(-ENODEV) || !chan_sender) { pr_info("%s Unable to register RX nios channel", __func__); return -ENODEV; } pr_info("End: Mailbox to NIOS Init\n"); return 0; }
static struct mbox_chan * mbox_test_request_channel(struct platform_device *pdev, const char *name) { struct mbox_client *client; struct mbox_chan *channel; client = devm_kzalloc(&pdev->dev, sizeof(*client), GFP_KERNEL); if (!client) return ERR_PTR(-ENOMEM); client->dev = &pdev->dev; client->rx_callback = mbox_test_receive_message; client->tx_prepare = mbox_test_prepare_message; client->tx_done = mbox_test_message_sent; client->tx_block = true; client->knows_txdone = false; client->tx_tout = 500; channel = mbox_request_channel_byname(client, name); if (IS_ERR(channel)) { dev_warn(&pdev->dev, "Failed to request %s channel\n", name); return NULL; } return channel; }
static int tegra_tcu_probe(struct platform_device *pdev) { struct uart_port *port; struct tegra_tcu *tcu; int err; tcu = devm_kzalloc(&pdev->dev, sizeof(*tcu), GFP_KERNEL); if (!tcu) return -ENOMEM; tcu->tx_client.dev = &pdev->dev; tcu->rx_client.dev = &pdev->dev; tcu->rx_client.rx_callback = tegra_tcu_receive; tcu->tx = mbox_request_channel_byname(&tcu->tx_client, "tx"); if (IS_ERR(tcu->tx)) { err = PTR_ERR(tcu->tx); dev_err(&pdev->dev, "failed to get tx mailbox: %d\n", err); return err; } tcu->rx = mbox_request_channel_byname(&tcu->rx_client, "rx"); if (IS_ERR(tcu->rx)) { err = PTR_ERR(tcu->rx); dev_err(&pdev->dev, "failed to get rx mailbox: %d\n", err); goto free_tx; } #if IS_ENABLED(CONFIG_SERIAL_TEGRA_TCU_CONSOLE) /* setup the console */ strcpy(tcu->console.name, "ttyTCU"); tcu->console.device = uart_console_device; tcu->console.flags = CON_PRINTBUFFER | CON_ANYTIME; tcu->console.index = -1; tcu->console.write = tegra_tcu_console_write; tcu->console.setup = tegra_tcu_console_setup; tcu->console.data = &tcu->driver; #endif /* setup the driver */ tcu->driver.owner = THIS_MODULE; tcu->driver.driver_name = "tegra-tcu"; tcu->driver.dev_name = "ttyTCU"; #if IS_ENABLED(CONFIG_SERIAL_TEGRA_TCU_CONSOLE) tcu->driver.cons = &tcu->console; #endif tcu->driver.nr = 1; err = uart_register_driver(&tcu->driver); if (err) { dev_err(&pdev->dev, "failed to register UART driver: %d\n", err); goto free_rx; } /* setup the port */ port = &tcu->port; spin_lock_init(&port->lock); port->dev = &pdev->dev; port->type = PORT_TEGRA_TCU; port->ops = &tegra_tcu_uart_ops; port->fifosize = 1; port->iotype = UPIO_MEM; port->flags = UPF_BOOT_AUTOCONF; port->private_data = tcu; err = uart_add_one_port(&tcu->driver, port); if (err) { dev_err(&pdev->dev, "failed to add UART port: %d\n", err); goto unregister_uart; } platform_set_drvdata(pdev, tcu); #if IS_ENABLED(CONFIG_SERIAL_TEGRA_TCU_CONSOLE) register_console(&tcu->console); #endif return 0; unregister_uart: uart_unregister_driver(&tcu->driver); free_rx: mbox_free_channel(tcu->rx); free_tx: mbox_free_channel(tcu->tx); return err; }