| /* SPDX-License-Identifier: GPL-2.0 */ |
| /* |
| * Copyright (c) 2021 MediaTek Inc. |
| */ |
| |
| |
| #ifndef __RPOC_MTK_CCU_H |
| #define __RPOC_MTK_CCU_H |
| |
| #include <linux/remoteproc.h> |
| #include <linux/platform_device.h> |
| |
| typedef void (*mtk_ccu_ipc_handle_t) (uint32_t data, uint32_t len, void *priv); |
| |
| enum CCU_SMC_REQ { |
| CCU_SMC_REQ_NONE = 0, |
| CCU_SMC_REQ_INIT, |
| CCU_SMC_REQ_LOAD, |
| CCU_SMC_REQ_RUN, |
| CCU_SMC_REQ_CLEAR_INT, |
| CCU_SMC_REQ_STOP, |
| CCU_SMC_REQ_MAX, |
| }; |
| |
| /** |
| * enum mtk_ccu_to_ap_msg_id - the id of inter-processor interrupt from CCU |
| * |
| * @MTK_CCU_MSG_TO_APMCU_FLUSH_LOG: CCU Request APMCU to print out CCU logs |
| * @MTK_CCU_MSG_TO_APMCU_CCU_ASSERT: CCU inform APMCU that CCU ASSERT occurs |
| * @MTK_CCU_MSG_TO_APMCU_CCU_WARNING: CCU inform APMCU that CCU WARNING occurs |
| * @MTK_CCU_MSG_TO_APMCU_MAX: The maximum ipc number |
| */ |
| enum mtk_ccu_to_ap_msg_id { |
| MTK_CCU_MSG_TO_APMCU_AAO_TEST_DONE, |
| MTK_CCU_MSG_TO_APMCU_FLUSH_LOG, |
| MTK_CCU_MSG_TO_APMCU_CCU_ASSERT, |
| MTK_CCU_MSG_TO_APMCU_CCU_WARNING, |
| MTK_CCU_MSG_TO_APMCU_DVFS_STATUS, |
| MTK_CCU_MSG_TO_APMCU_MAX, |
| }; |
| |
| /** |
| * enum mtk_ccu_feature_type - the id of feature in CCU |
| * |
| * @MTK_CCU_FEATURE_MAX: The maximum feature number |
| */ |
| enum mtk_ccu_feature_type { |
| MTK_CCU_FEATURE_UNDEF = 0x0, |
| MTK_CCU_FEATURE_MIN = 0x1, |
| MTK_CCU_FEATURE_SYSCTRL = MTK_CCU_FEATURE_MIN, |
| MTK_CCU_FEATURE_3ACTRL, |
| MTK_CCU_FEATURE_AF, |
| MTK_CCU_FEATURE_AE, |
| MTK_CCU_FEATURE_FMCTRL, |
| MTK_CCU_FEATURE_CAMSYS, |
| MTK_CCU_FEATURE_ISPDVFS, |
| MTK_CCU_FEATURE_MAX, |
| }; |
| |
| /** |
| * mtk_ccu_get_pdev - get CCU's platform device |
| * |
| * @pdev: the platform device of the module requesting CCU platform |
| * device for using CCU API. |
| * |
| * Return: Return NULL if it is failed, otherwise it is CCU's platform device. |
| **/ |
| struct platform_device *mtk_ccu_get_pdev(struct platform_device *pdev); |
| |
| /** |
| * mtk_ccu_rproc_ipc_send - send data from AP to ccu. |
| * |
| * @pdev: CCU platform device |
| * @feature: feature id in CCU to receive this data |
| * @msg_id: ipc ID |
| * @buf: the data buffer |
| * @len: the data buffer length |
| * |
| * This function is thread-safe. When this function returns, |
| * CCU has received the data and finsh the processing. |
| * |
| * Return: Return 0 if sending data successfully, otherwise it is failed. |
| **/ |
| int mtk_ccu_rproc_ipc_send(struct platform_device *pdev, |
| enum mtk_ccu_feature_type feature, |
| uint32_t msg_id, void *buf, uint32_t len); |
| |
| /** |
| * mtk_ccu_ipc_register - register an ipc function from CCU |
| * |
| * @pdev: CCU platform device |
| * @msg_id: ipc ID |
| * @handler: ipc handler |
| * @priv: private data for ipc handler |
| * |
| * Register an ipc function to receive ipc interrupt from CCU. |
| * |
| * Return: Return 0 if ipc registers successfully, otherwise it is failed. |
| */ |
| int mtk_ccu_ipc_register(struct platform_device *pdev, |
| enum mtk_ccu_to_ap_msg_id msg_id, |
| mtk_ccu_ipc_handle_t handle, void *priv); |
| |
| /** |
| * mtk_ccu_ipc_unregister - unregister an ipc function from CCU |
| * |
| * @pdev: CCU platform device |
| * @msg_id: ipc ID |
| * |
| * Unregister an ipc function to receive ipc interrupt from CCU. |
| */ |
| void mtk_ccu_ipc_unregister(struct platform_device *pdev, |
| enum mtk_ccu_to_ap_msg_id msg_id); |
| |
| /** |
| * mtk_ccu_da_to_va - perform address translations |
| * |
| * @rproc: CCU remote processor |
| * @da: device address of buffer in CCU domain |
| * @len: the buffer length |
| * |
| * Return: Return NULL if it is failed, otherwise it is va in kernel. |
| */ |
| void *mtk_ccu_da_to_va(struct rproc *rproc, u64 da, size_t lens, bool *is_iomem); |
| |
| /** |
| * mtk_ccu_rproc_get_inforeg - Query spare register value |
| * |
| * @pdev: CCU platform device |
| * @regno: register number |
| * @data: register value |
| * |
| * Return: Return 0 if succed, otherwise it has been failed. |
| */ |
| int mtk_ccu_rproc_get_inforeg(struct platform_device *pdev, |
| uint32_t regno, uint32_t *data); |
| #endif /*__RPOC_MTK_CCU_H */ |