Linux Audio

Check our new training course

Loading...
v6.8
  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
 14struct 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 __aligned(4);
 20
 21struct imx_sc_msg_req_cpu_start {
 22	struct imx_sc_rpc_msg hdr;
 23	u32 address_hi;
 24	u32 address_lo;
 25	u16 resource;
 26	u8 enable;
 27} __packed __aligned(4);
 28
 29struct imx_sc_msg_req_misc_get_ctrl {
 30	struct imx_sc_rpc_msg hdr;
 31	u32 ctrl;
 32	u16 resource;
 33} __packed __aligned(4);
 34
 35struct imx_sc_msg_resp_misc_get_ctrl {
 36	struct imx_sc_rpc_msg hdr;
 37	u32 val;
 38} __packed __aligned(4);
 39
 40/*
 41 * This function sets a miscellaneous control value.
 42 *
 43 * @param[in]     ipc         IPC handle
 44 * @param[in]     resource    resource the control is associated with
 45 * @param[in]     ctrl        control to change
 46 * @param[in]     val         value to apply to the control
 47 *
 48 * @return Returns 0 for success and < 0 for errors.
 49 */
 50
 51int imx_sc_misc_set_control(struct imx_sc_ipc *ipc, u32 resource,
 52			    u8 ctrl, u32 val)
 53{
 54	struct imx_sc_msg_req_misc_set_ctrl msg;
 55	struct imx_sc_rpc_msg *hdr = &msg.hdr;
 56
 57	hdr->ver = IMX_SC_RPC_VERSION;
 58	hdr->svc = (uint8_t)IMX_SC_RPC_SVC_MISC;
 59	hdr->func = (uint8_t)IMX_SC_MISC_FUNC_SET_CONTROL;
 60	hdr->size = 4;
 61
 62	msg.ctrl = ctrl;
 63	msg.val = val;
 64	msg.resource = resource;
 65
 66	return imx_scu_call_rpc(ipc, &msg, true);
 67}
 68EXPORT_SYMBOL(imx_sc_misc_set_control);
 69
 70/*
 71 * This function gets a miscellaneous control value.
 72 *
 73 * @param[in]     ipc         IPC handle
 74 * @param[in]     resource    resource the control is associated with
 75 * @param[in]     ctrl        control to get
 76 * @param[out]    val         pointer to return the control value
 77 *
 78 * @return Returns 0 for success and < 0 for errors.
 79 */
 80
 81int imx_sc_misc_get_control(struct imx_sc_ipc *ipc, u32 resource,
 82			    u8 ctrl, u32 *val)
 83{
 84	struct imx_sc_msg_req_misc_get_ctrl msg;
 85	struct imx_sc_msg_resp_misc_get_ctrl *resp;
 86	struct imx_sc_rpc_msg *hdr = &msg.hdr;
 87	int ret;
 88
 89	hdr->ver = IMX_SC_RPC_VERSION;
 90	hdr->svc = (uint8_t)IMX_SC_RPC_SVC_MISC;
 91	hdr->func = (uint8_t)IMX_SC_MISC_FUNC_GET_CONTROL;
 92	hdr->size = 3;
 93
 94	msg.ctrl = ctrl;
 95	msg.resource = resource;
 96
 97	ret = imx_scu_call_rpc(ipc, &msg, true);
 98	if (ret)
 99		return ret;
100
101	resp = (struct imx_sc_msg_resp_misc_get_ctrl *)&msg;
102	if (val != NULL)
103		*val = resp->val;
104
105	return 0;
106}
107EXPORT_SYMBOL(imx_sc_misc_get_control);
108
109/*
110 * This function starts/stops a CPU identified by @resource
111 *
112 * @param[in]     ipc         IPC handle
113 * @param[in]     resource    resource the control is associated with
114 * @param[in]     enable      true for start, false for stop
115 * @param[in]     phys_addr   initial instruction address to be executed
116 *
117 * @return Returns 0 for success and < 0 for errors.
118 */
119int imx_sc_pm_cpu_start(struct imx_sc_ipc *ipc, u32 resource,
120			bool enable, u64 phys_addr)
121{
122	struct imx_sc_msg_req_cpu_start msg;
123	struct imx_sc_rpc_msg *hdr = &msg.hdr;
124
125	hdr->ver = IMX_SC_RPC_VERSION;
126	hdr->svc = IMX_SC_RPC_SVC_PM;
127	hdr->func = IMX_SC_PM_FUNC_CPU_START;
128	hdr->size = 4;
129
130	msg.address_hi = phys_addr >> 32;
131	msg.address_lo = phys_addr;
132	msg.resource = resource;
133	msg.enable = enable;
134
135	return imx_scu_call_rpc(ipc, &msg, true);
136}
137EXPORT_SYMBOL(imx_sc_pm_cpu_start);
v5.4
  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
 14struct 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
 21struct imx_sc_msg_req_cpu_start {
 22	struct imx_sc_rpc_msg hdr;
 23	u32 address_hi;
 24	u32 address_lo;
 25	u16 resource;
 26	u8 enable;
 27} __packed;
 28
 29struct imx_sc_msg_req_misc_get_ctrl {
 30	struct imx_sc_rpc_msg hdr;
 31	u32 ctrl;
 32	u16 resource;
 33} __packed;
 34
 35struct imx_sc_msg_resp_misc_get_ctrl {
 36	struct imx_sc_rpc_msg hdr;
 37	u32 val;
 38} __packed;
 39
 40/*
 41 * This function sets a miscellaneous control value.
 42 *
 43 * @param[in]     ipc         IPC handle
 44 * @param[in]     resource    resource the control is associated with
 45 * @param[in]     ctrl        control to change
 46 * @param[in]     val         value to apply to the control
 47 *
 48 * @return Returns 0 for success and < 0 for errors.
 49 */
 50
 51int imx_sc_misc_set_control(struct imx_sc_ipc *ipc, u32 resource,
 52			    u8 ctrl, u32 val)
 53{
 54	struct imx_sc_msg_req_misc_set_ctrl msg;
 55	struct imx_sc_rpc_msg *hdr = &msg.hdr;
 56
 57	hdr->ver = IMX_SC_RPC_VERSION;
 58	hdr->svc = (uint8_t)IMX_SC_RPC_SVC_MISC;
 59	hdr->func = (uint8_t)IMX_SC_MISC_FUNC_SET_CONTROL;
 60	hdr->size = 4;
 61
 62	msg.ctrl = ctrl;
 63	msg.val = val;
 64	msg.resource = resource;
 65
 66	return imx_scu_call_rpc(ipc, &msg, true);
 67}
 68EXPORT_SYMBOL(imx_sc_misc_set_control);
 69
 70/*
 71 * This function gets a miscellaneous control value.
 72 *
 73 * @param[in]     ipc         IPC handle
 74 * @param[in]     resource    resource the control is associated with
 75 * @param[in]     ctrl        control to get
 76 * @param[out]    val         pointer to return the control value
 77 *
 78 * @return Returns 0 for success and < 0 for errors.
 79 */
 80
 81int imx_sc_misc_get_control(struct imx_sc_ipc *ipc, u32 resource,
 82			    u8 ctrl, u32 *val)
 83{
 84	struct imx_sc_msg_req_misc_get_ctrl msg;
 85	struct imx_sc_msg_resp_misc_get_ctrl *resp;
 86	struct imx_sc_rpc_msg *hdr = &msg.hdr;
 87	int ret;
 88
 89	hdr->ver = IMX_SC_RPC_VERSION;
 90	hdr->svc = (uint8_t)IMX_SC_RPC_SVC_MISC;
 91	hdr->func = (uint8_t)IMX_SC_MISC_FUNC_GET_CONTROL;
 92	hdr->size = 3;
 93
 94	msg.ctrl = ctrl;
 95	msg.resource = resource;
 96
 97	ret = imx_scu_call_rpc(ipc, &msg, true);
 98	if (ret)
 99		return ret;
100
101	resp = (struct imx_sc_msg_resp_misc_get_ctrl *)&msg;
102	if (val != NULL)
103		*val = resp->val;
104
105	return 0;
106}
107EXPORT_SYMBOL(imx_sc_misc_get_control);
108
109/*
110 * This function starts/stops a CPU identified by @resource
111 *
112 * @param[in]     ipc         IPC handle
113 * @param[in]     resource    resource the control is associated with
114 * @param[in]     enable      true for start, false for stop
115 * @param[in]     phys_addr   initial instruction address to be executed
116 *
117 * @return Returns 0 for success and < 0 for errors.
118 */
119int imx_sc_pm_cpu_start(struct imx_sc_ipc *ipc, u32 resource,
120			bool enable, u64 phys_addr)
121{
122	struct imx_sc_msg_req_cpu_start msg;
123	struct imx_sc_rpc_msg *hdr = &msg.hdr;
124
125	hdr->ver = IMX_SC_RPC_VERSION;
126	hdr->svc = IMX_SC_RPC_SVC_PM;
127	hdr->func = IMX_SC_PM_FUNC_CPU_START;
128	hdr->size = 4;
129
130	msg.address_hi = phys_addr >> 32;
131	msg.address_lo = phys_addr;
132	msg.resource = resource;
133	msg.enable = enable;
134
135	return imx_scu_call_rpc(ipc, &msg, true);
136}
137EXPORT_SYMBOL(imx_sc_pm_cpu_start);