Path: blob/main/sys/contrib/dev/mediatek/mt76/mmio.c
48378 views
// SPDX-License-Identifier: ISC1/*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{43#if defined(__linux__)44__iowrite32_copy(dev->mmio.regs + offset, data, DIV_ROUND_UP(len, 4));45#elif defined(__FreeBSD__)46__iowrite32_copy((u8 *)dev->mmio.regs + offset, data, DIV_ROUND_UP(len, 4));47#endif48}4950static void mt76_mmio_read_copy(struct mt76_dev *dev, u32 offset,51void *data, int len)52{53#if defined(__linux__)54__ioread32_copy(data, dev->mmio.regs + offset, DIV_ROUND_UP(len, 4));55#elif defined(__FreeBSD__)56__ioread32_copy(data, (u8 *)dev->mmio.regs + offset, DIV_ROUND_UP(len, 4));57#endif58}5960static int mt76_mmio_wr_rp(struct mt76_dev *dev, u32 base,61const struct mt76_reg_pair *data, int len)62{63while (len > 0) {64mt76_mmio_wr(dev, data->reg, data->value);65data++;66len--;67}6869return 0;70}7172static int mt76_mmio_rd_rp(struct mt76_dev *dev, u32 base,73struct mt76_reg_pair *data, int len)74{75while (len > 0) {76data->value = mt76_mmio_rr(dev, data->reg);77data++;78len--;79}8081return 0;82}8384void mt76_set_irq_mask(struct mt76_dev *dev, u32 addr,85u32 clear, u32 set)86{87unsigned long flags;8889spin_lock_irqsave(&dev->mmio.irq_lock, flags);90dev->mmio.irqmask &= ~clear;91dev->mmio.irqmask |= set;92if (addr) {93if (mtk_wed_device_active(&dev->mmio.wed))94mtk_wed_device_irq_set_mask(&dev->mmio.wed,95dev->mmio.irqmask);96else97mt76_mmio_wr(dev, addr, dev->mmio.irqmask);98}99spin_unlock_irqrestore(&dev->mmio.irq_lock, flags);100}101EXPORT_SYMBOL_GPL(mt76_set_irq_mask);102103void mt76_mmio_init(struct mt76_dev *dev, void __iomem *regs)104{105static const struct mt76_bus_ops mt76_mmio_ops = {106.rr = mt76_mmio_rr,107.rmw = mt76_mmio_rmw,108.wr = mt76_mmio_wr,109.write_copy = mt76_mmio_write_copy,110.read_copy = mt76_mmio_read_copy,111.wr_rp = mt76_mmio_wr_rp,112.rd_rp = mt76_mmio_rd_rp,113.type = MT76_BUS_MMIO,114};115116dev->bus = &mt76_mmio_ops;117dev->mmio.regs = regs;118119spin_lock_init(&dev->mmio.irq_lock);120}121EXPORT_SYMBOL_GPL(mt76_mmio_init);122123124