diff options
author | Dong Aisheng <aisheng.dong@nxp.com> | 2018-10-07 09:04:43 -0400 |
---|---|---|
committer | Shawn Guo <shawnguo@kernel.org> | 2018-10-08 10:09:09 -0400 |
commit | 15e1f2bc8b3b2d238b9e06b128d4a09d28f11733 (patch) | |
tree | 3538b7884dcc6889f1618fae7ede9c99926cedc8 | |
parent | edbee095fafb4b727b51032bdc41e345f95bbc20 (diff) |
firmware: imx: add misc svc support
Add SCU MISC SVC support which provides misc control get/set functions.
Cc: Shawn Guo <shawnguo@kernel.org>
Reviewed-by: Sascha Hauer <s.hauer@pengutronix.de>
Signed-off-by: Dong Aisheng <aisheng.dong@nxp.com>
Signed-off-by: Shawn Guo <shawnguo@kernel.org>
-rw-r--r-- | drivers/firmware/imx/Makefile | 2 | ||||
-rw-r--r-- | drivers/firmware/imx/misc.c | 99 | ||||
-rw-r--r-- | include/linux/firmware/imx/sci.h | 1 | ||||
-rw-r--r-- | include/linux/firmware/imx/svc/misc.h | 55 |
4 files changed, 156 insertions, 1 deletions
diff --git a/drivers/firmware/imx/Makefile b/drivers/firmware/imx/Makefile index 9b1e2febb1aa..0ac04dfda8d4 100644 --- a/drivers/firmware/imx/Makefile +++ b/drivers/firmware/imx/Makefile | |||
@@ -1,2 +1,2 @@ | |||
1 | # SPDX-License-Identifier: GPL-2.0 | 1 | # SPDX-License-Identifier: GPL-2.0 |
2 | obj-$(CONFIG_IMX_SCU) += imx-scu.o | 2 | obj-$(CONFIG_IMX_SCU) += imx-scu.o misc.o |
diff --git a/drivers/firmware/imx/misc.c b/drivers/firmware/imx/misc.c new file mode 100644 index 000000000000..97f5424dbac9 --- /dev/null +++ b/drivers/firmware/imx/misc.c | |||
@@ -0,0 +1,99 @@ | |||
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); | ||
diff --git a/include/linux/firmware/imx/sci.h b/include/linux/firmware/imx/sci.h index ff3227ad8d7c..29ada609de03 100644 --- a/include/linux/firmware/imx/sci.h +++ b/include/linux/firmware/imx/sci.h | |||
@@ -13,4 +13,5 @@ | |||
13 | #include <linux/firmware/imx/ipc.h> | 13 | #include <linux/firmware/imx/ipc.h> |
14 | #include <linux/firmware/imx/types.h> | 14 | #include <linux/firmware/imx/types.h> |
15 | 15 | ||
16 | #include <linux/firmware/imx/svc/misc.h> | ||
16 | #endif /* _SC_SCI_H */ | 17 | #endif /* _SC_SCI_H */ |
diff --git a/include/linux/firmware/imx/svc/misc.h b/include/linux/firmware/imx/svc/misc.h new file mode 100644 index 000000000000..e21c49aba92f --- /dev/null +++ b/include/linux/firmware/imx/svc/misc.h | |||
@@ -0,0 +1,55 @@ | |||
1 | /* SPDX-License-Identifier: GPL-2.0+ */ | ||
2 | /* | ||
3 | * Copyright (C) 2016 Freescale Semiconductor, Inc. | ||
4 | * Copyright 2017~2018 NXP | ||
5 | * | ||
6 | * Header file containing the public API for the System Controller (SC) | ||
7 | * Miscellaneous (MISC) function. | ||
8 | * | ||
9 | * MISC_SVC (SVC) Miscellaneous Service | ||
10 | * | ||
11 | * Module for the Miscellaneous (MISC) service. | ||
12 | */ | ||
13 | |||
14 | #ifndef _SC_MISC_API_H | ||
15 | #define _SC_MISC_API_H | ||
16 | |||
17 | #include <linux/firmware/imx/sci.h> | ||
18 | |||
19 | /* | ||
20 | * This type is used to indicate RPC MISC function calls. | ||
21 | */ | ||
22 | enum imx_misc_func { | ||
23 | IMX_SC_MISC_FUNC_UNKNOWN = 0, | ||
24 | IMX_SC_MISC_FUNC_SET_CONTROL = 1, | ||
25 | IMX_SC_MISC_FUNC_GET_CONTROL = 2, | ||
26 | IMX_SC_MISC_FUNC_SET_MAX_DMA_GROUP = 4, | ||
27 | IMX_SC_MISC_FUNC_SET_DMA_GROUP = 5, | ||
28 | IMX_SC_MISC_FUNC_SECO_IMAGE_LOAD = 8, | ||
29 | IMX_SC_MISC_FUNC_SECO_AUTHENTICATE = 9, | ||
30 | IMX_SC_MISC_FUNC_DEBUG_OUT = 10, | ||
31 | IMX_SC_MISC_FUNC_WAVEFORM_CAPTURE = 6, | ||
32 | IMX_SC_MISC_FUNC_BUILD_INFO = 15, | ||
33 | IMX_SC_MISC_FUNC_UNIQUE_ID = 19, | ||
34 | IMX_SC_MISC_FUNC_SET_ARI = 3, | ||
35 | IMX_SC_MISC_FUNC_BOOT_STATUS = 7, | ||
36 | IMX_SC_MISC_FUNC_BOOT_DONE = 14, | ||
37 | IMX_SC_MISC_FUNC_OTP_FUSE_READ = 11, | ||
38 | IMX_SC_MISC_FUNC_OTP_FUSE_WRITE = 17, | ||
39 | IMX_SC_MISC_FUNC_SET_TEMP = 12, | ||
40 | IMX_SC_MISC_FUNC_GET_TEMP = 13, | ||
41 | IMX_SC_MISC_FUNC_GET_BOOT_DEV = 16, | ||
42 | IMX_SC_MISC_FUNC_GET_BUTTON_STATUS = 18, | ||
43 | }; | ||
44 | |||
45 | /* | ||
46 | * Control Functions | ||
47 | */ | ||
48 | |||
49 | int imx_sc_misc_set_control(struct imx_sc_ipc *ipc, u32 resource, | ||
50 | u8 ctrl, u32 val); | ||
51 | |||
52 | int imx_sc_misc_get_control(struct imx_sc_ipc *ipc, u32 resource, | ||
53 | u8 ctrl, u32 *val); | ||
54 | |||
55 | #endif /* _SC_MISC_API_H */ | ||