1 // SPDX-License-Identifier: GPL-2.0+ 2 /* 3 * Copyright (C) 2016 Freescale Semiconductor, Inc. 4 * Copyright 2017~2018 NXP 5 * Author: Dong Aisheng <aisheng.dong@nxp.com> 6 * 7 * File containing client-side RPC functions for the MISC service. These 8 * function are ported to clients that communicate to the SC. 9 * 10 */ 11 12 #include <linux/firmware/imx/svc/misc.h> 13 14 struct imx_sc_msg_req_misc_set_ctrl { 15 struct imx_sc_rpc_msg hdr; 16 u32 ctrl; 17 u32 val; 18 u16 resource; 19 } __packed; 20 21 struct imx_sc_msg_req_misc_get_ctrl { 22 struct imx_sc_rpc_msg hdr; 23 u32 ctrl; 24 u16 resource; 25 } __packed; 26 27 struct imx_sc_msg_resp_misc_get_ctrl { 28 struct imx_sc_rpc_msg hdr; 29 u32 val; 30 } __packed; 31 32 /* 33 * This function sets a miscellaneous control value. 34 * 35 * @param[in] ipc IPC handle 36 * @param[in] resource resource the control is associated with 37 * @param[in] ctrl control to change 38 * @param[in] val value to apply to the control 39 * 40 * @return Returns 0 for success and < 0 for errors. 41 */ 42 43 int imx_sc_misc_set_control(struct imx_sc_ipc *ipc, u32 resource, 44 u8 ctrl, u32 val) 45 { 46 struct imx_sc_msg_req_misc_set_ctrl msg; 47 struct imx_sc_rpc_msg *hdr = &msg.hdr; 48 49 hdr->ver = IMX_SC_RPC_VERSION; 50 hdr->svc = (uint8_t)IMX_SC_RPC_SVC_MISC; 51 hdr->func = (uint8_t)IMX_SC_MISC_FUNC_SET_CONTROL; 52 hdr->size = 4; 53 54 msg.ctrl = ctrl; 55 msg.val = val; 56 msg.resource = resource; 57 58 return imx_scu_call_rpc(ipc, &msg, true); 59 } 60 EXPORT_SYMBOL(imx_sc_misc_set_control); 61 62 /* 63 * This function gets a miscellaneous control value. 64 * 65 * @param[in] ipc IPC handle 66 * @param[in] resource resource the control is associated with 67 * @param[in] ctrl control to get 68 * @param[out] val pointer to return the control value 69 * 70 * @return Returns 0 for success and < 0 for errors. 71 */ 72 73 int imx_sc_misc_get_control(struct imx_sc_ipc *ipc, u32 resource, 74 u8 ctrl, u32 *val) 75 { 76 struct imx_sc_msg_req_misc_get_ctrl msg; 77 struct imx_sc_msg_resp_misc_get_ctrl *resp; 78 struct imx_sc_rpc_msg *hdr = &msg.hdr; 79 int ret; 80 81 hdr->ver = IMX_SC_RPC_VERSION; 82 hdr->svc = (uint8_t)IMX_SC_RPC_SVC_MISC; 83 hdr->func = (uint8_t)IMX_SC_MISC_FUNC_GET_CONTROL; 84 hdr->size = 3; 85 86 msg.ctrl = ctrl; 87 msg.resource = resource; 88 89 ret = imx_scu_call_rpc(ipc, &msg, true); 90 if (ret) 91 return ret; 92 93 resp = (struct imx_sc_msg_resp_misc_get_ctrl *)&msg; 94 if (val != NULL) 95 *val = resp->val; 96 97 return 0; 98 } 99 EXPORT_SYMBOL(imx_sc_misc_get_control); 100