Loading...
/* SPDX-License-Identifier: GPL-2.0 */ /* * Copyright (C) 2021 MediaTek Inc. * * Author: Chunfeng Yun <chunfeng.yun@mediatek.com> */ #ifndef __PHY_MTK_H__ #define __PHY_MTK_H__ #include <linux/bitfield.h> #include <linux/io.h> static inline void mtk_phy_clear_bits(void __iomem *reg, u32 bits) { u32 tmp = readl(reg); tmp &= ~bits; writel(tmp, reg); } static inline void mtk_phy_set_bits(void __iomem *reg, u32 bits) { u32 tmp = readl(reg); tmp |= bits; writel(tmp, reg); } static inline void mtk_phy_update_bits(void __iomem *reg, u32 mask, u32 val) { u32 tmp = readl(reg); tmp &= ~mask; tmp |= val & mask; writel(tmp, reg); } /* field @mask shall be constant and continuous */ #define mtk_phy_update_field(reg, mask, val) \ ({ \ BUILD_BUG_ON_MSG(!__builtin_constant_p(mask), "mask is not constant"); \ mtk_phy_update_bits(reg, mask, FIELD_PREP(mask, val)); \ }) #endif |