• Home
  • Raw
  • Download

Lines Matching +full:pm +full:- +full:api

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",
59 /* First element is callback API ID, others are callback arguments */ in suspend_event_callback()
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()
76 /* First element is callback API ID, others are callback arguments */ in zynqmp_pm_isr()
100 memcpy(payload, msg->data, sizeof(msg->len)); in ipi_receive_callback()
101 /* First element is callback API ID, others are callback arguments */ 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()
193 /* Check PM API version number */ in zynqmp_pm_probe()
195 return -ENODEV; in zynqmp_pm_probe()
200 * If xlnx_register_event() returns -EACCES (Xilinx Event Manager in zynqmp_pm_probe()
201 * is not available to use) or -ENODEV(Xilinx Event Manager not compiled), in zynqmp_pm_probe()
202 * then use ipi-mailbox or interrupt method. in zynqmp_pm_probe()
207 zynqmp_pm_init_suspend_work = devm_kzalloc(&pdev->dev, in zynqmp_pm_probe()
213 return -ENOMEM; in zynqmp_pm_probe()
217 INIT_WORK(&zynqmp_pm_init_suspend_work->callback_work, in zynqmp_pm_probe()
219 } else if (ret != -EACCES && ret != -ENODEV) { in zynqmp_pm_probe()
220 dev_err(&pdev->dev, "Failed to Register with Xilinx Event manager %d\n", ret); in zynqmp_pm_probe()
222 } else if (of_property_present(pdev->dev.of_node, "mboxes")) { in zynqmp_pm_probe()
224 devm_kzalloc(&pdev->dev, in zynqmp_pm_probe()
228 return -ENOMEM; in zynqmp_pm_probe()
230 INIT_WORK(&zynqmp_pm_init_suspend_work->callback_work, in zynqmp_pm_probe()
232 client = devm_kzalloc(&pdev->dev, sizeof(*client), GFP_KERNEL); in zynqmp_pm_probe()
234 return -ENOMEM; in zynqmp_pm_probe()
236 client->dev = &pdev->dev; in zynqmp_pm_probe()
237 client->rx_callback = ipi_receive_callback; in zynqmp_pm_probe()
241 dev_err(&pdev->dev, "Failed to request rx channel\n"); in zynqmp_pm_probe()
244 } else if (of_property_present(pdev->dev.of_node, "interrupts")) { in zynqmp_pm_probe()
249 ret = devm_request_threaded_irq(&pdev->dev, irq, NULL, in zynqmp_pm_probe()
252 dev_name(&pdev->dev), in zynqmp_pm_probe()
253 &pdev->dev); in zynqmp_pm_probe()
255 dev_err(&pdev->dev, "devm_request_threaded_irq '%d' " in zynqmp_pm_probe()
260 dev_err(&pdev->dev, "Required property not found in DT node\n"); in zynqmp_pm_probe()
261 return -ENOENT; in zynqmp_pm_probe()
264 ret = sysfs_create_file(&pdev->dev.kobj, &dev_attr_suspend_mode.attr); in zynqmp_pm_probe()
271 dev_err(&pdev->dev, "unable to create sysfs interface\n"); in zynqmp_pm_probe()
280 sysfs_remove_file(&pdev->dev.kobj, &dev_attr_suspend_mode.attr); in zynqmp_pm_remove()
291 { .compatible = "xlnx,zynqmp-power", },