Path: blob/main/sys/contrib/dev/mediatek/mt76/mmio.c
105952 views
// SPDX-License-Identifier: BSD-3-Clause-Clear1/*2* Copyright (C) 2016 Felix Fietkau <[email protected]>3*/45#include "mt76.h"6#include "dma.h"7#include "trace.h"89static u32 mt76_mmio_rr(struct mt76_dev *dev, u32 offset)10{11u32 val;1213#if defined(__linux__)14val = readl(dev->mmio.regs + offset);15#elif defined(__FreeBSD__)16val = readl((u8 *)dev->mmio.regs + offset);17#endif18trace_reg_rr(dev, offset, val);1920return val;21}2223static void mt76_mmio_wr(struct mt76_dev *dev, u32 offset, u32 val)24{25trace_reg_wr(dev, offset, val);26#if defined(__linux__)27writel(val, dev->mmio.regs + offset);28#elif defined(__FreeBSD__)29writel(val, (u8 *)dev->mmio.regs + offset);30#endif31}3233static u32 mt76_mmio_rmw(struct mt76_dev *dev, u32 offset, u32 mask, u32 val)34{35val |= mt76_mmio_rr(dev, offset) & ~mask;36mt76_mmio_wr(dev, offset, val);37return val;38}3940static void mt76_mmio_write_copy(struct mt76_dev *dev, u32 offset,41const void *data, int len)42{43int i;4445for (i = 0; i < ALIGN(len, 4); i += 4)46#if defined(__linux__)47writel(get_unaligned_le32(data + i),48dev->mmio.regs + offset + i);49#elif defined(__FreeBSD__)50writel(get_unaligned_le32((const u8 *)data + i),51(u8 *)dev->mmio.regs + offset + i);52#endif53}5455static void mt76_mmio_read_copy(struct mt76_dev *dev, u32 offset,56void *data, int len)57{58int i;5960for (i = 0; i < ALIGN(len, 4); i += 4)61#if defined(__linux__)62put_unaligned_le32(readl(dev->mmio.regs + offset + i),63data + i);64#elif defined(__FreeBSD__)65put_unaligned_le32(readl((u8 *)dev->mmio.regs + offset + i),66(u8 *)data + i);67#endif68}6970static int mt76_mmio_wr_rp(struct mt76_dev *dev, u32 base,71const struct mt76_reg_pair *data, int len)72{73while (len > 0) {74mt76_mmio_wr(dev, data->reg, data->value);75data++;76len--;77}7879return 0;80}8182static int mt76_mmio_rd_rp(struct mt76_dev *dev, u32 base,83struct mt76_reg_pair *data, int len)84{85while (len > 0) {86data->value = mt76_mmio_rr(dev, data->reg);87data++;88len--;89}9091return 0;92}9394void mt76_set_irq_mask(struct mt76_dev *dev, u32 addr,95u32 clear, u32 set)96{97unsigned long flags;9899spin_lock_irqsave(&dev->mmio.irq_lock, flags);100dev->mmio.irqmask &= ~clear;101dev->mmio.irqmask |= set;102if (addr) {103if (mtk_wed_device_active(&dev->mmio.wed))104mtk_wed_device_irq_set_mask(&dev->mmio.wed,105dev->mmio.irqmask);106else107mt76_mmio_wr(dev, addr, dev->mmio.irqmask);108}109spin_unlock_irqrestore(&dev->mmio.irq_lock, flags);110}111EXPORT_SYMBOL_GPL(mt76_set_irq_mask);112113void mt76_mmio_init(struct mt76_dev *dev, void __iomem *regs)114{115static const struct mt76_bus_ops mt76_mmio_ops = {116.rr = mt76_mmio_rr,117.rmw = mt76_mmio_rmw,118.wr = mt76_mmio_wr,119.write_copy = mt76_mmio_write_copy,120.read_copy = mt76_mmio_read_copy,121.wr_rp = mt76_mmio_wr_rp,122.rd_rp = mt76_mmio_rd_rp,123.type = MT76_BUS_MMIO,124};125126dev->bus = &mt76_mmio_ops;127dev->mmio.regs = regs;128129spin_lock_init(&dev->mmio.irq_lock);130}131EXPORT_SYMBOL_GPL(mt76_mmio_init);132133134