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