Lines Matching +full:zynqmp +full:- +full:mailbox
1 // SPDX-License-Identifier: GPL-2.0
5 * Copyright (C) 2014-2019 Xilinx, Inc.
19 #include <linux/firmware/xlnx-zynqmp.h>
20 #include <linux/firmware/xlnx-event-manager.h>
21 #include <linux/mailbox/zynqmp-ipi-message.h>
24 * struct zynqmp_pm_work_struct - Wrapper for struct work_struct
47 [PM_SUSPEND_MODE_POWER_OFF] = "power-off",
60 if (work_pending(&zynqmp_pm_init_suspend_work->callback_work)) in suspend_event_callback()
64 memcpy(zynqmp_pm_init_suspend_work->args, &payload[1], in suspend_event_callback()
65 sizeof(zynqmp_pm_init_suspend_work->args)); in suspend_event_callback()
67 queue_work(system_unbound_wq, &zynqmp_pm_init_suspend_work->callback_work); in suspend_event_callback()
100 memcpy(payload, msg->data, sizeof(msg->len)); in ipi_receive_callback()
103 if (work_pending(&zynqmp_pm_init_suspend_work->callback_work)) in ipi_receive_callback()
107 memcpy(zynqmp_pm_init_suspend_work->args, &payload[1], in ipi_receive_callback()
108 sizeof(zynqmp_pm_init_suspend_work->args)); in ipi_receive_callback()
111 &zynqmp_pm_init_suspend_work->callback_work); in ipi_receive_callback()
121 * zynqmp_pm_init_suspend_work_fn - Initialize suspend
124 * Bottom-half of PM callback IRQ handler.
131 if (pm_work->args[0] == SUSPEND_SYSTEM_SHUTDOWN) { in zynqmp_pm_init_suspend_work_fn()
133 } else if (pm_work->args[0] == SUSPEND_POWER_REQUEST) { in zynqmp_pm_init_suspend_work_fn()
137 __func__, pm_work->args[0]); in zynqmp_pm_init_suspend_work_fn()
157 *(s - 1) = '\n'; in suspend_mode_show()
158 return (s - buf); in suspend_mode_show()
165 int md, ret = -EINVAL; in suspend_mode_store()
197 return -ENODEV; in zynqmp_pm_probe()
202 * If xlnx_register_event() returns -EACCES (Xilinx Event Manager in zynqmp_pm_probe()
203 * is not available to use) or -ENODEV(Xilinx Event Manager not compiled), in zynqmp_pm_probe()
204 * then use ipi-mailbox or interrupt method. in zynqmp_pm_probe()
209 zynqmp_pm_init_suspend_work = devm_kzalloc(&pdev->dev, in zynqmp_pm_probe()
215 return -ENOMEM; in zynqmp_pm_probe()
219 INIT_WORK(&zynqmp_pm_init_suspend_work->callback_work, in zynqmp_pm_probe()
221 } else if (ret != -EACCES && ret != -ENODEV) { in zynqmp_pm_probe()
222 dev_err(&pdev->dev, "Failed to Register with Xilinx Event manager %d\n", ret); in zynqmp_pm_probe()
224 } else if (of_property_present(pdev->dev.of_node, "mboxes")) { in zynqmp_pm_probe()
226 devm_kzalloc(&pdev->dev, in zynqmp_pm_probe()
230 return -ENOMEM; in zynqmp_pm_probe()
232 INIT_WORK(&zynqmp_pm_init_suspend_work->callback_work, in zynqmp_pm_probe()
234 client = devm_kzalloc(&pdev->dev, sizeof(*client), GFP_KERNEL); in zynqmp_pm_probe()
236 return -ENOMEM; in zynqmp_pm_probe()
238 client->dev = &pdev->dev; in zynqmp_pm_probe()
239 client->rx_callback = ipi_receive_callback; in zynqmp_pm_probe()
243 dev_err(&pdev->dev, "Failed to request rx channel\n"); in zynqmp_pm_probe()
246 } else if (of_property_present(pdev->dev.of_node, "interrupts")) { in zynqmp_pm_probe()
251 ret = devm_request_threaded_irq(&pdev->dev, irq, NULL, in zynqmp_pm_probe()
254 dev_name(&pdev->dev), in zynqmp_pm_probe()
255 &pdev->dev); in zynqmp_pm_probe()
257 dev_err(&pdev->dev, "devm_request_threaded_irq '%d' " in zynqmp_pm_probe()
262 dev_err(&pdev->dev, "Required property not found in DT node\n"); in zynqmp_pm_probe()
263 return -ENOENT; in zynqmp_pm_probe()
266 ret = sysfs_create_file(&pdev->dev.kobj, &dev_attr_suspend_mode.attr); in zynqmp_pm_probe()
273 dev_err(&pdev->dev, "unable to create sysfs interface\n"); in zynqmp_pm_probe()
282 sysfs_remove_file(&pdev->dev.kobj, &dev_attr_suspend_mode.attr); in zynqmp_pm_remove()
293 { .compatible = "xlnx,zynqmp-power", },