0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012 #include <linux/firmware/imx/svc/misc.h>
0013
0014 struct imx_sc_msg_req_misc_set_ctrl {
0015 struct imx_sc_rpc_msg hdr;
0016 u32 ctrl;
0017 u32 val;
0018 u16 resource;
0019 } __packed __aligned(4);
0020
0021 struct imx_sc_msg_req_cpu_start {
0022 struct imx_sc_rpc_msg hdr;
0023 u32 address_hi;
0024 u32 address_lo;
0025 u16 resource;
0026 u8 enable;
0027 } __packed __aligned(4);
0028
0029 struct imx_sc_msg_req_misc_get_ctrl {
0030 struct imx_sc_rpc_msg hdr;
0031 u32 ctrl;
0032 u16 resource;
0033 } __packed __aligned(4);
0034
0035 struct imx_sc_msg_resp_misc_get_ctrl {
0036 struct imx_sc_rpc_msg hdr;
0037 u32 val;
0038 } __packed __aligned(4);
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051 int imx_sc_misc_set_control(struct imx_sc_ipc *ipc, u32 resource,
0052 u8 ctrl, u32 val)
0053 {
0054 struct imx_sc_msg_req_misc_set_ctrl msg;
0055 struct imx_sc_rpc_msg *hdr = &msg.hdr;
0056
0057 hdr->ver = IMX_SC_RPC_VERSION;
0058 hdr->svc = (uint8_t)IMX_SC_RPC_SVC_MISC;
0059 hdr->func = (uint8_t)IMX_SC_MISC_FUNC_SET_CONTROL;
0060 hdr->size = 4;
0061
0062 msg.ctrl = ctrl;
0063 msg.val = val;
0064 msg.resource = resource;
0065
0066 return imx_scu_call_rpc(ipc, &msg, true);
0067 }
0068 EXPORT_SYMBOL(imx_sc_misc_set_control);
0069
0070
0071
0072
0073
0074
0075
0076
0077
0078
0079
0080
0081 int imx_sc_misc_get_control(struct imx_sc_ipc *ipc, u32 resource,
0082 u8 ctrl, u32 *val)
0083 {
0084 struct imx_sc_msg_req_misc_get_ctrl msg;
0085 struct imx_sc_msg_resp_misc_get_ctrl *resp;
0086 struct imx_sc_rpc_msg *hdr = &msg.hdr;
0087 int ret;
0088
0089 hdr->ver = IMX_SC_RPC_VERSION;
0090 hdr->svc = (uint8_t)IMX_SC_RPC_SVC_MISC;
0091 hdr->func = (uint8_t)IMX_SC_MISC_FUNC_GET_CONTROL;
0092 hdr->size = 3;
0093
0094 msg.ctrl = ctrl;
0095 msg.resource = resource;
0096
0097 ret = imx_scu_call_rpc(ipc, &msg, true);
0098 if (ret)
0099 return ret;
0100
0101 resp = (struct imx_sc_msg_resp_misc_get_ctrl *)&msg;
0102 if (val != NULL)
0103 *val = resp->val;
0104
0105 return 0;
0106 }
0107 EXPORT_SYMBOL(imx_sc_misc_get_control);
0108
0109
0110
0111
0112
0113
0114
0115
0116
0117
0118
0119 int imx_sc_pm_cpu_start(struct imx_sc_ipc *ipc, u32 resource,
0120 bool enable, u64 phys_addr)
0121 {
0122 struct imx_sc_msg_req_cpu_start msg;
0123 struct imx_sc_rpc_msg *hdr = &msg.hdr;
0124
0125 hdr->ver = IMX_SC_RPC_VERSION;
0126 hdr->svc = IMX_SC_RPC_SVC_PM;
0127 hdr->func = IMX_SC_PM_FUNC_CPU_START;
0128 hdr->size = 4;
0129
0130 msg.address_hi = phys_addr >> 32;
0131 msg.address_lo = phys_addr;
0132 msg.resource = resource;
0133 msg.enable = enable;
0134
0135 return imx_scu_call_rpc(ipc, &msg, true);
0136 }
0137 EXPORT_SYMBOL(imx_sc_pm_cpu_start);