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_gdfs.h>
10 
11 typedef struct {
12 	nrfs_gdfs_evt_handler_t handler;
13 	bool is_initialized;
14 } nrfs_gdfs_cb_t;
15 static nrfs_gdfs_cb_t m_cb;
16 
nrfs_gdfs_service_notify(void * p_notification,size_t size)17 void nrfs_gdfs_service_notify(void *p_notification, size_t size)
18 {
19 	if (!m_cb.handler || !m_cb.is_initialized) {
20 		return;
21 	}
22 
23 	nrfs_gdfs_evt_t evt;
24 	nrfs_generic_t *p_data = (nrfs_generic_t *)p_notification;
25 	if (NRFS_HDR_FILTER_ERR_GET(&p_data->hdr)) {
26 		evt.type = NRFS_GDFS_EVT_REJECT;
27 		m_cb.handler(&evt, (void *)p_data->ctx.ctx);
28 		return;
29 	}
30 
31 	nrfs_gdfs_rsp_t *p_rsp = (nrfs_gdfs_rsp_t *)p_notification;
32 	switch (p_data->hdr.req) {
33 	case NRFS_GDFS_REQ_FREQ:
34 		evt.type = NRFS_GDFS_EVT_FREQ_CONFIRMED;
35 		m_cb.handler(&evt, (void *)p_rsp->ctx.ctx);
36 		break;
37 
38 	default:
39 		break;
40 	}
41 }
42 
nrfs_gdfs_init(nrfs_gdfs_evt_handler_t handler)43 nrfs_err_t nrfs_gdfs_init(nrfs_gdfs_evt_handler_t handler)
44 {
45 	if (m_cb.is_initialized) {
46 		return NRFS_ERR_INVALID_STATE;
47 	}
48 
49 	m_cb.handler	    = handler;
50 	m_cb.is_initialized = true;
51 	return NRFS_SUCCESS;
52 }
53 
nrfs_gdfs_uninit(void)54 void nrfs_gdfs_uninit(void)
55 {
56 	m_cb.is_initialized = false;
57 }
58 
nrfs_gdfs_request_freq(enum gdfs_frequency_setting target_freq,void * p_context)59 nrfs_err_t nrfs_gdfs_request_freq(enum gdfs_frequency_setting target_freq, void *p_context)
60 {
61 	if (!m_cb.is_initialized) {
62 		return NRFS_ERR_INVALID_STATE;
63 	}
64 
65 	nrfs_gdfs_req_t req;
66 
67 	NRFS_SERVICE_HDR_FILL(&req, NRFS_GDFS_REQ_FREQ);
68 	req.ctx.ctx	     = (uint32_t)p_context;
69 	req.data.target_freq = target_freq;
70 
71 	return nrfs_backend_send(&req, sizeof(req));
72 }
73 
nrfs_gdfs_request_freq_no_rsp(enum gdfs_frequency_setting target_freq,void * p_context)74 nrfs_err_t nrfs_gdfs_request_freq_no_rsp(enum gdfs_frequency_setting target_freq,
75 					    void *p_context)
76 {
77 	if (!m_cb.is_initialized) {
78 		return NRFS_ERR_INVALID_STATE;
79 	}
80 
81 	nrfs_gdfs_req_t req;
82 
83 	NRFS_SERVICE_HDR_FILL(&req, NRFS_GDFS_REQ_FREQ);
84 	NRFS_HDR_NO_RSP_SET(&req.hdr);
85 	req.ctx.ctx	     = (uint32_t)p_context;
86 	req.data.target_freq = target_freq;
87 
88 	return nrfs_backend_send(&req, sizeof(req));
89 }
90