1 | // SPDX-License-Identifier: GPL-2.0 |
2 | /* ICSSG Buffer queue helpers |
3 | * |
4 | * Copyright (C) 2021 Texas Instruments Incorporated - https://www.ti.com |
5 | */ |
6 | |
7 | #include <linux/regmap.h> |
8 | #include "icssg_prueth.h" |
9 | |
10 | #define ICSSG_QUEUES_MAX 64 |
11 | #define ICSSG_QUEUE_OFFSET 0xd00 |
12 | #define ICSSG_QUEUE_PEEK_OFFSET 0xe00 |
13 | #define ICSSG_QUEUE_CNT_OFFSET 0xe40 |
14 | #define ICSSG_QUEUE_RESET_OFFSET 0xf40 |
15 | |
16 | int icssg_queue_pop(struct prueth *prueth, u8 queue) |
17 | { |
18 | u32 val, cnt; |
19 | |
20 | if (queue >= ICSSG_QUEUES_MAX) |
21 | return -EINVAL; |
22 | |
23 | regmap_read(map: prueth->miig_rt, ICSSG_QUEUE_CNT_OFFSET + 4 * queue, val: &cnt); |
24 | if (!cnt) |
25 | return -EINVAL; |
26 | |
27 | regmap_read(map: prueth->miig_rt, ICSSG_QUEUE_OFFSET + 4 * queue, val: &val); |
28 | |
29 | return val; |
30 | } |
31 | |
32 | void icssg_queue_push(struct prueth *prueth, int queue, u16 addr) |
33 | { |
34 | if (queue >= ICSSG_QUEUES_MAX) |
35 | return; |
36 | |
37 | regmap_write(map: prueth->miig_rt, ICSSG_QUEUE_OFFSET + 4 * queue, val: addr); |
38 | } |
39 | |
40 | u32 icssg_queue_level(struct prueth *prueth, int queue) |
41 | { |
42 | u32 reg; |
43 | |
44 | if (queue >= ICSSG_QUEUES_MAX) |
45 | return 0; |
46 | |
47 | regmap_read(map: prueth->miig_rt, ICSSG_QUEUE_CNT_OFFSET + 4 * queue, val: ®); |
48 | |
49 | return reg; |
50 | } |
51 | |