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.
21 #include <soc/microchip/mpfs.h>
48 reinit_completion(&sys_controller->c); in mpfs_blocking_transaction()
50 ret = mbox_send_message(sys_controller->chan, msg); in mpfs_blocking_transaction()
52 dev_warn(sys_controller->client.dev, "MPFS sys controller service timeout\n"); in mpfs_blocking_transaction()
57 * Unfortunately, the system controller will only deliver an interrupt in mpfs_blocking_transaction()
67 if (!wait_for_completion_timeout(&sys_controller->c, timeout)) { in mpfs_blocking_transaction()
68 ret = -EBADMSG; in mpfs_blocking_transaction()
69 dev_warn(sys_controller->client.dev, in mpfs_blocking_transaction()
70 "MPFS sys controller service failed with status: %d\n", in mpfs_blocking_transaction()
71 msg->response->resp_status); in mpfs_blocking_transaction()
88 complete(&sys_controller->c); in mpfs_sys_controller_rx_callback()
96 mbox_free_channel(sys_controller->chan); in mpfs_sys_controller_delete()
104 kref_put(&sys_controller->consumers, mpfs_sys_controller_delete); in mpfs_sys_controller_put()
109 return mpfs_client->flash; in mpfs_sys_controller_get_flash()
115 .name = "mpfs-rng",
116 .id = -1,
119 .name = "mpfs-generic-service",
120 .id = -1,
123 .name = "mpfs-auto-update",
124 .id = -1,
130 struct device *dev = &pdev->dev; in mpfs_sys_controller_probe()
137 return -ENOMEM; in mpfs_sys_controller_probe()
139 np = of_parse_phandle(dev->of_node, "microchip,bitstream-flash", 0); in mpfs_sys_controller_probe()
143 sys_controller->flash = of_get_mtd_device_by_node(np); in mpfs_sys_controller_probe()
145 if (IS_ERR(sys_controller->flash)) in mpfs_sys_controller_probe()
146 return dev_err_probe(dev, PTR_ERR(sys_controller->flash), "Failed to get flash\n"); in mpfs_sys_controller_probe()
149 sys_controller->client.dev = dev; in mpfs_sys_controller_probe()
150 sys_controller->client.rx_callback = mpfs_sys_controller_rx_callback; in mpfs_sys_controller_probe()
151 sys_controller->client.tx_block = 1U; in mpfs_sys_controller_probe()
152 sys_controller->client.tx_tout = msecs_to_jiffies(MPFS_SYS_CTRL_TIMEOUT_MS); in mpfs_sys_controller_probe()
154 sys_controller->chan = mbox_request_channel(&sys_controller->client, 0); in mpfs_sys_controller_probe()
155 if (IS_ERR(sys_controller->chan)) { in mpfs_sys_controller_probe()
156 ret = dev_err_probe(dev, PTR_ERR(sys_controller->chan), in mpfs_sys_controller_probe()
162 init_completion(&sys_controller->c); in mpfs_sys_controller_probe()
163 kref_init(&sys_controller->consumers); in mpfs_sys_controller_probe()
174 dev_info(&pdev->dev, "Registered MPFS system controller\n"); in mpfs_sys_controller_probe()
187 {.compatible = "microchip,mpfs-sys-controller", },
198 if (!dev->parent) in mpfs_sys_controller_get()
201 match = of_match_node(mpfs_sys_controller_of_match, dev->parent->of_node); in mpfs_sys_controller_get()
202 of_node_put(dev->parent->of_node); in mpfs_sys_controller_get()
206 sys_controller = dev_get_drvdata(dev->parent); in mpfs_sys_controller_get()
210 if (!kref_get_unless_zero(&sys_controller->consumers)) in mpfs_sys_controller_get()
220 dev_dbg(dev, "Parent device was not an MPFS system controller\n"); in mpfs_sys_controller_get()
221 return ERR_PTR(-ENODEV); in mpfs_sys_controller_get()
224 dev_dbg(dev, "MPFS system controller found but could not register as a sub device\n"); in mpfs_sys_controller_get()
225 return ERR_PTR(-EPROBE_DEFER); in mpfs_sys_controller_get()
231 .name = "mpfs-sys-controller",
241 MODULE_DESCRIPTION("MPFS system controller driver");