Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 | /* SPDX-License-Identifier: GPL-2.0 */ /* * Copyright (c) 2018 MediaTek Inc. * */ #ifndef __MTK_CMDQ_H__ #define __MTK_CMDQ_H__ #include <linux/mailbox_client.h> #include <linux/mailbox/mtk-cmdq-mailbox.h> #include <linux/timer.h> #define CMDQ_NO_TIMEOUT 0xffffffffu /** cmdq event maximum */ #define CMDQ_MAX_EVENT 0x3ff struct cmdq_pkt; struct cmdq_client { spinlock_t lock; u32 pkt_cnt; struct mbox_client client; struct mbox_chan *chan; struct timer_list timer; u32 timeout_ms; /* in unit of microsecond */ }; /** * cmdq_mbox_create() - create CMDQ mailbox client and channel * @dev: device of CMDQ mailbox client * @index: index of CMDQ mailbox channel * @timeout: timeout of a pkt execution by GCE, in unit of microsecond, set * CMDQ_NO_TIMEOUT if a timer is not used. * * Return: CMDQ mailbox client pointer */ struct cmdq_client *cmdq_mbox_create(struct device *dev, int index, u32 timeout); /** * cmdq_mbox_destroy() - destroy CMDQ mailbox client and channel * @client: the CMDQ mailbox client */ void cmdq_mbox_destroy(struct cmdq_client *client); /** * cmdq_pkt_create() - create a CMDQ packet * @client: the CMDQ mailbox client * @size: required CMDQ buffer size * * Return: CMDQ packet pointer */ struct cmdq_pkt *cmdq_pkt_create(struct cmdq_client *client, size_t size); /** * cmdq_pkt_destroy() - destroy the CMDQ packet * @pkt: the CMDQ packet */ void cmdq_pkt_destroy(struct cmdq_pkt *pkt); /** * cmdq_pkt_write() - append write command to the CMDQ packet * @pkt: the CMDQ packet * @value: the specified target register value * @subsys: the CMDQ sub system code * @offset: register offset from CMDQ sub system * * Return: 0 for success; else the error code is returned */ int cmdq_pkt_write(struct cmdq_pkt *pkt, u32 value, u32 subsys, u32 offset); /** * cmdq_pkt_write_mask() - append write command with mask to the CMDQ packet * @pkt: the CMDQ packet * @value: the specified target register value * @subsys: the CMDQ sub system code * @offset: register offset from CMDQ sub system * @mask: the specified target register mask * * Return: 0 for success; else the error code is returned */ int cmdq_pkt_write_mask(struct cmdq_pkt *pkt, u32 value, u32 subsys, u32 offset, u32 mask); /** * cmdq_pkt_wfe() - append wait for event command to the CMDQ packet * @pkt: the CMDQ packet * @event: the desired event type to "wait and CLEAR" * * Return: 0 for success; else the error code is returned */ int cmdq_pkt_wfe(struct cmdq_pkt *pkt, u32 event); /** * cmdq_pkt_clear_event() - append clear event command to the CMDQ packet * @pkt: the CMDQ packet * @event: the desired event to be cleared * * Return: 0 for success; else the error code is returned */ int cmdq_pkt_clear_event(struct cmdq_pkt *pkt, u32 event); /** * cmdq_pkt_flush_async() - trigger CMDQ to asynchronously execute the CMDQ * packet and call back at the end of done packet * @pkt: the CMDQ packet * @cb: called at the end of done packet * @data: this data will pass back to cb * * Return: 0 for success; else the error code is returned * * Trigger CMDQ to asynchronously execute the CMDQ packet and call back * at the end of done packet. Note that this is an ASYNC function. When the * function returned, it may or may not be finished. */ int cmdq_pkt_flush_async(struct cmdq_pkt *pkt, cmdq_async_flush_cb cb, void *data); /** * cmdq_pkt_flush() - trigger CMDQ to execute the CMDQ packet * @pkt: the CMDQ packet * * Return: 0 for success; else the error code is returned * * Trigger CMDQ to execute the CMDQ packet. Note that this is a * synchronous flush function. When the function returned, the recorded * commands have been done. */ int cmdq_pkt_flush(struct cmdq_pkt *pkt); #endif /* __MTK_CMDQ_H__ */ |