| /* 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 |