1 /*
2 * Copyright (c) 2024 Nordic Semiconductor ASA
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7 #include <internal/nrfs_backend.h>
8 #include <internal/nrfs_callbacks.h>
9 #include <nrfs_gdpwr.h>
10
11 typedef struct {
12 nrfs_gdpwr_evt_handler_t handler;
13 bool is_initialized;
14 } nrfs_gdpwr_cb_t;
15 static nrfs_gdpwr_cb_t m_cb;
16
nrfs_gdpwr_init(nrfs_gdpwr_evt_handler_t handler)17 nrfs_err_t nrfs_gdpwr_init(nrfs_gdpwr_evt_handler_t handler)
18 {
19 if (m_cb.is_initialized) {
20 return NRFS_ERR_INVALID_STATE;
21 }
22
23 m_cb.handler = handler;
24 m_cb.is_initialized = true;
25 return NRFS_SUCCESS;
26 }
27
nrfs_gdpwr_uninit(void)28 void nrfs_gdpwr_uninit(void)
29 {
30 m_cb.is_initialized = false;
31 }
32
nrfs_gdpwr_service_notify(void * p_notification,size_t size)33 void nrfs_gdpwr_service_notify(void *p_notification, size_t size)
34 {
35 if (!m_cb.handler || !m_cb.is_initialized) {
36 return;
37 }
38
39 nrfs_gdpwr_evt_t evt;
40 nrfs_generic_t *p_data = (nrfs_generic_t *)p_notification;
41
42 if (NRFS_HDR_FILTER_ERR_GET(&p_data->hdr)) {
43 evt.type = NRFS_GDPWR_REQ_REJECTED;
44 m_cb.handler(&evt, (void *)p_data->ctx.ctx);
45 return;
46 }
47
48 evt.type = NRFS_GDPWR_REQ_APPLIED;
49 m_cb.handler(&evt, (void *)p_data->ctx.ctx);
50 }
51
nrfs_gdpwr_power_request(gdpwr_power_domain_t power_domain,gdpwr_request_type_t req_type,void * p_context)52 nrfs_err_t nrfs_gdpwr_power_request(gdpwr_power_domain_t power_domain,
53 gdpwr_request_type_t req_type,
54 void *p_context)
55 {
56 if (!m_cb.is_initialized) {
57 return NRFS_ERR_INVALID_STATE;
58 }
59
60 nrfs_gdpwr_req_t req;
61
62 NRFS_SERVICE_HDR_FILL(&req, NRFS_GDPWR_REQ_SET_POWER_REQUEST);
63 req.ctx.ctx = (uint32_t)p_context;
64 req.data.power_domain = power_domain;
65 req.data.request_type = req_type;
66 return nrfs_backend_send(&req, sizeof(req));
67 }
68