Lines Matching +full:mpfs +full:- +full:sys +full:- +full:controller
1 // SPDX-License-Identifier: GPL-2.0
3 * Microchip PolarFire SoC (MPFS) system controller driver
5 * Copyright (c) 2020-2021 Microchip Corporation. All rights reserved.
19 #include <soc/microchip/mpfs.h>
45 reinit_completion(&sys_controller->c); in mpfs_blocking_transaction()
47 ret = mbox_send_message(sys_controller->chan, msg); in mpfs_blocking_transaction()
49 dev_warn(sys_controller->client.dev, "MPFS sys controller service timeout\n"); in mpfs_blocking_transaction()
54 * Unfortunately, the system controller will only deliver an interrupt in mpfs_blocking_transaction()
64 if (!wait_for_completion_timeout(&sys_controller->c, timeout)) { in mpfs_blocking_transaction()
65 ret = -EBADMSG; in mpfs_blocking_transaction()
66 dev_warn(sys_controller->client.dev, "MPFS sys controller service failed\n"); in mpfs_blocking_transaction()
83 complete(&sys_controller->c); in mpfs_sys_controller_rx_callback()
91 mbox_free_channel(sys_controller->chan); in mpfs_sys_controller_delete()
99 kref_put(&sys_controller->consumers, mpfs_sys_controller_delete); in mpfs_sys_controller_put()
104 .name = "mpfs-rng",
105 .id = -1,
108 .name = "mpfs-generic-service",
109 .id = -1,
115 struct device *dev = &pdev->dev; in mpfs_sys_controller_probe()
121 return -ENOMEM; in mpfs_sys_controller_probe()
123 sys_controller->client.dev = dev; in mpfs_sys_controller_probe()
124 sys_controller->client.rx_callback = mpfs_sys_controller_rx_callback; in mpfs_sys_controller_probe()
125 sys_controller->client.tx_block = 1U; in mpfs_sys_controller_probe()
126 sys_controller->client.tx_tout = msecs_to_jiffies(MPFS_SYS_CTRL_TIMEOUT_MS); in mpfs_sys_controller_probe()
128 sys_controller->chan = mbox_request_channel(&sys_controller->client, 0); in mpfs_sys_controller_probe()
129 if (IS_ERR(sys_controller->chan)) { in mpfs_sys_controller_probe()
130 ret = dev_err_probe(dev, PTR_ERR(sys_controller->chan), in mpfs_sys_controller_probe()
136 init_completion(&sys_controller->c); in mpfs_sys_controller_probe()
137 kref_init(&sys_controller->consumers); in mpfs_sys_controller_probe()
141 dev_info(&pdev->dev, "Registered MPFS system controller\n"); in mpfs_sys_controller_probe()
162 {.compatible = "microchip,mpfs-sys-controller", },
173 if (!dev->parent) in mpfs_sys_controller_get()
176 match = of_match_node(mpfs_sys_controller_of_match, dev->parent->of_node); in mpfs_sys_controller_get()
177 of_node_put(dev->parent->of_node); in mpfs_sys_controller_get()
181 sys_controller = dev_get_drvdata(dev->parent); in mpfs_sys_controller_get()
185 if (!kref_get_unless_zero(&sys_controller->consumers)) in mpfs_sys_controller_get()
195 dev_dbg(dev, "Parent device was not an MPFS system controller\n"); in mpfs_sys_controller_get()
196 return ERR_PTR(-ENODEV); in mpfs_sys_controller_get()
199 dev_dbg(dev, "MPFS system controller found but could not register as a sub device\n"); in mpfs_sys_controller_get()
200 return ERR_PTR(-EPROBE_DEFER); in mpfs_sys_controller_get()
206 .name = "mpfs-sys-controller",
216 MODULE_DESCRIPTION("MPFS system controller driver");