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