brintos

brintos / linux-shallow public Read only

0
0
Text · 3.4 KiB · d073cb3 Raw
138 lines · c
1// SPDX-License-Identifier: GPL-2.0+2/*3 * Copyright (C) 2016 Freescale Semiconductor, Inc.4 * Copyright 2017~2018 NXP5 *  Author: Dong Aisheng <aisheng.dong@nxp.com>6 *7 * File containing client-side RPC functions for the MISC service. These8 * 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 handle44 * @param[in]     resource    resource the control is associated with45 * @param[in]     ctrl        control to change46 * @param[in]     val         value to apply to the control47 *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 handle74 * @param[in]     resource    resource the control is associated with75 * @param[in]     ctrl        control to get76 * @param[out]    val         pointer to return the control value77 *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 @resource111 *112 * @param[in]     ipc         IPC handle113 * @param[in]     resource    resource the control is associated with114 * @param[in]     enable      true for start, false for stop115 * @param[in]     phys_addr   initial instruction address to be executed116 *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);138