forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-05-13 9d77db3c730780c8ef5ccd4b66403ff5675cfe4e
kernel/drivers/net/wireless/mediatek/mt76/mmio.c
....@@ -1,17 +1,6 @@
1
+// SPDX-License-Identifier: ISC
12 /*
23 * Copyright (C) 2016 Felix Fietkau <nbd@nbd.name>
3
- *
4
- * Permission to use, copy, modify, and/or distribute this software for any
5
- * purpose with or without fee is hereby granted, provided that the above
6
- * copyright notice and this permission notice appear in all copies.
7
- *
8
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
154 */
165
176 #include "mt76.h"
....@@ -21,7 +10,7 @@
2110 {
2211 u32 val;
2312
24
- val = ioread32(dev->regs + offset);
13
+ val = readl(dev->mmio.regs + offset);
2514 trace_reg_rr(dev, offset, val);
2615
2716 return val;
....@@ -30,7 +19,7 @@
3019 static void mt76_mmio_wr(struct mt76_dev *dev, u32 offset, u32 val)
3120 {
3221 trace_reg_wr(dev, offset, val);
33
- iowrite32(val, dev->regs + offset);
22
+ writel(val, dev->mmio.regs + offset);
3423 }
3524
3625 static u32 mt76_mmio_rmw(struct mt76_dev *dev, u32 offset, u32 mask, u32 val)
....@@ -40,11 +29,55 @@
4029 return val;
4130 }
4231
43
-static void mt76_mmio_copy(struct mt76_dev *dev, u32 offset, const void *data,
44
- int len)
32
+static void mt76_mmio_write_copy(struct mt76_dev *dev, u32 offset,
33
+ const void *data, int len)
4534 {
46
- __iowrite32_copy(dev->regs + offset, data, len >> 2);
35
+ __iowrite32_copy(dev->mmio.regs + offset, data, DIV_ROUND_UP(len, 4));
4736 }
37
+
38
+static void mt76_mmio_read_copy(struct mt76_dev *dev, u32 offset,
39
+ void *data, int len)
40
+{
41
+ __ioread32_copy(data, dev->mmio.regs + offset, DIV_ROUND_UP(len, 4));
42
+}
43
+
44
+static int mt76_mmio_wr_rp(struct mt76_dev *dev, u32 base,
45
+ const struct mt76_reg_pair *data, int len)
46
+{
47
+ while (len > 0) {
48
+ mt76_mmio_wr(dev, data->reg, data->value);
49
+ data++;
50
+ len--;
51
+ }
52
+
53
+ return 0;
54
+}
55
+
56
+static int mt76_mmio_rd_rp(struct mt76_dev *dev, u32 base,
57
+ struct mt76_reg_pair *data, int len)
58
+{
59
+ while (len > 0) {
60
+ data->value = mt76_mmio_rr(dev, data->reg);
61
+ data++;
62
+ len--;
63
+ }
64
+
65
+ return 0;
66
+}
67
+
68
+void mt76_set_irq_mask(struct mt76_dev *dev, u32 addr,
69
+ u32 clear, u32 set)
70
+{
71
+ unsigned long flags;
72
+
73
+ spin_lock_irqsave(&dev->mmio.irq_lock, flags);
74
+ dev->mmio.irqmask &= ~clear;
75
+ dev->mmio.irqmask |= set;
76
+ if (addr)
77
+ mt76_mmio_wr(dev, addr, dev->mmio.irqmask);
78
+ spin_unlock_irqrestore(&dev->mmio.irq_lock, flags);
79
+}
80
+EXPORT_SYMBOL_GPL(mt76_set_irq_mask);
4881
4982 void mt76_mmio_init(struct mt76_dev *dev, void __iomem *regs)
5083 {
....@@ -52,10 +85,16 @@
5285 .rr = mt76_mmio_rr,
5386 .rmw = mt76_mmio_rmw,
5487 .wr = mt76_mmio_wr,
55
- .copy = mt76_mmio_copy,
88
+ .write_copy = mt76_mmio_write_copy,
89
+ .read_copy = mt76_mmio_read_copy,
90
+ .wr_rp = mt76_mmio_wr_rp,
91
+ .rd_rp = mt76_mmio_rd_rp,
92
+ .type = MT76_BUS_MMIO,
5693 };
5794
5895 dev->bus = &mt76_mmio_ops;
59
- dev->regs = regs;
96
+ dev->mmio.regs = regs;
97
+
98
+ spin_lock_init(&dev->mmio.irq_lock);
6099 }
61100 EXPORT_SYMBOL_GPL(mt76_mmio_init);