/* SPDX-License-Identifier: GPL-2.0 */ /* * Copyright (c) 2017, The Linux Foundation. All rights reserved. */ #ifndef QCOM_PHY_QMP_COMMON_H_ #define QCOM_PHY_QMP_COMMON_H_ struct qmp_phy_init_tbl { unsigned int offset; unsigned int val; char *name; /* * mask of lanes for which this register is written * for cases when second lane needs different values */ u8 lane_mask; }; #define QMP_PHY_INIT_CFG(o, v) \ { \ .offset = o, \ .val = v, \ .name = #o, \ .lane_mask = 0xff, \ } #define QMP_PHY_INIT_CFG_LANE(o, v, l) \ { \ .offset = o, \ .val = v, \ .name = #o, \ .lane_mask = l, \ } static inline void qmp_configure_lane(struct device *dev, void __iomem *base, const struct qmp_phy_init_tbl tbl[], int num, u8 lane_mask) { int i; const struct qmp_phy_init_tbl *t = tbl; if (!t) return; for (i = 0; i < num; i++, t++) { if (!(t->lane_mask & lane_mask)) continue; dev_dbg(dev, "Writing Reg: %s Offset: 0x%04x Val: 0x%02x\n", t->name, t->offset, t->val); writel(t->val, base + t->offset); } } static inline void qmp_configure(struct device *dev, void __iomem *base, const struct qmp_phy_init_tbl tbl[], int num) { qmp_configure_lane(dev, base, tbl, num, 0xff); } #endif