1 /*
2  * Copyright (c) 2025 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_swext.h>
10 
11 typedef struct {
12 	nrfs_swext_evt_handler_t handler;
13 	bool is_initialized;
14 } nrfs_swext_cb_t;
15 static nrfs_swext_cb_t m_cb;
16 
nrfs_swext_init(nrfs_swext_evt_handler_t handler)17 nrfs_err_t nrfs_swext_init(nrfs_swext_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_swext_uninit(void)28 void nrfs_swext_uninit(void)
29 {
30 	m_cb.is_initialized = false;
31 }
32 
nrfs_swext_service_notify(void * p_notification,size_t size)33 void nrfs_swext_service_notify(void *p_notification, size_t size)
34 {
35 	if (!m_cb.handler || !m_cb.is_initialized) {
36 		return;
37 	}
38 
39 	nrfs_swext_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_SWEXT_EVT_REJECTED;
44 		m_cb.handler(&evt, (void *)p_data->ctx.ctx);
45 		return;
46 	}
47 
48 	nrfs_swext_rsp_t *p_rsp = (nrfs_swext_rsp_t *)p_notification;
49 
50 	switch(p_rsp->status){
51 	case SWEXT_OUTPUT_ENABLED:
52 		evt.type = NRFS_SWEXT_EVT_ENABLED;
53 		break;
54 	case SWEXT_OVERCURRENT:
55 		evt.type = NRFS_SWEXT_EVT_OVERCURRENT;
56 		break;
57 	}
58 	m_cb.handler(&evt, (void *)p_data->ctx.ctx);
59 }
60 
nrfs_swext_power_up(uint8_t load_current,void * p_context)61 nrfs_err_t nrfs_swext_power_up(uint8_t load_current, void *p_context)
62 {
63 	if (!m_cb.is_initialized) {
64 		return NRFS_ERR_INVALID_STATE;
65 	}
66 
67 	nrfs_swext_req_t req;
68 
69 	NRFS_SERVICE_HDR_FILL(&req, NRFS_SWEXT_REQ_POWER_UP);
70 	req.ctx.ctx = (uint32_t)p_context;
71 	req.data.load_current = load_current;
72 	return nrfs_backend_send(&req, sizeof(req));
73 }
74 
nrfs_swext_power_down(swext_pd_clamp_t pd_clamp,void * p_context)75 nrfs_err_t nrfs_swext_power_down(swext_pd_clamp_t pd_clamp, void *p_context)
76 {
77 	if (!m_cb.is_initialized) {
78 		return NRFS_ERR_INVALID_STATE;
79 	}
80 
81 	nrfs_swext_req_t req;
82 
83 	NRFS_SERVICE_HDR_FILL(&req, NRFS_SWEXT_REQ_POWER_DOWN);
84 	req.ctx.ctx = (uint32_t)p_context;
85 	req.data.pd_clamp_control = pd_clamp;
86 	return nrfs_backend_send(&req, sizeof(req));
87 }
88