Skip to content

Commit fd75f37

Browse files
Christian Bruelvinodkoul
authored andcommitted
phy: stm32: Fix constant-value overflow assertion
Rework the workaround as the lookup tables always fits into the bitfield, and the default values are defined by the hardware and cannot be 0: Guard against false positive with a WARN_ON check to make the compiler happy: The offset range is pre-checked against the sorted imp_lookup_table values and overflow should not happen and would be caught by a warning and return in error. Also guard against a true positive found during the max_vswing lookup, as a max vswing value can be 802000 or 803000 microvolt depending on the current impedance. Therefore set the default impedence index. Fixes: 2de679e ("phy: stm32: work around constant-value overflow assertion") Signed-off-by: Christian Bruel <christian.bruel@foss.st.com> Link: https://lore.kernel.org/r/20250210103515.2598377-1-christian.bruel@foss.st.com Signed-off-by: Vinod Koul <vkoul@kernel.org>
1 parent 3126ea9 commit fd75f37

File tree

1 file changed

+18
-20
lines changed

1 file changed

+18
-20
lines changed

drivers/phy/st/phy-stm32-combophy.c

Lines changed: 18 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ static const struct clk_impedance imp_lookup[] = {
111111
{ 4204000, { 511000, 609000, 706000, 802000 } },
112112
{ 3999000, { 571000, 648000, 726000, 803000 } }
113113
};
114+
#define DEFAULT_IMP_INDEX 3 /* Default impedance is 50 Ohm */
114115

115116
static int stm32_impedance_tune(struct stm32_combophy *combophy)
116117
{
@@ -119,56 +120,53 @@ static int stm32_impedance_tune(struct stm32_combophy *combophy)
119120
u8 imp_of, vswing_of;
120121
u32 max_imp = imp_lookup[0].microohm;
121122
u32 min_imp = imp_lookup[imp_size - 1].microohm;
122-
u32 max_vswing = imp_lookup[imp_size - 1].vswing[vswing_size - 1];
123+
u32 max_vswing;
123124
u32 min_vswing = imp_lookup[0].vswing[0];
124125
u32 val;
125-
u32 regval;
126126

127127
if (!of_property_read_u32(combophy->dev->of_node, "st,output-micro-ohms", &val)) {
128128
if (val < min_imp || val > max_imp) {
129129
dev_err(combophy->dev, "Invalid value %u for output ohm\n", val);
130130
return -EINVAL;
131131
}
132132

133-
regval = 0;
134-
for (imp_of = 0; imp_of < ARRAY_SIZE(imp_lookup); imp_of++) {
135-
if (imp_lookup[imp_of].microohm <= val) {
136-
regval = FIELD_PREP(STM32MP25_PCIEPRG_IMPCTRL_OHM, imp_of);
133+
for (imp_of = 0; imp_of < ARRAY_SIZE(imp_lookup); imp_of++)
134+
if (imp_lookup[imp_of].microohm <= val)
137135
break;
138-
}
139-
}
136+
137+
if (WARN_ON(imp_of == ARRAY_SIZE(imp_lookup)))
138+
return -EINVAL;
140139

141140
dev_dbg(combophy->dev, "Set %u micro-ohms output impedance\n",
142141
imp_lookup[imp_of].microohm);
143142

144143
regmap_update_bits(combophy->regmap, SYSCFG_PCIEPRGCR,
145144
STM32MP25_PCIEPRG_IMPCTRL_OHM,
146-
regval);
147-
} else {
148-
regmap_read(combophy->regmap, SYSCFG_PCIEPRGCR, &val);
149-
imp_of = FIELD_GET(STM32MP25_PCIEPRG_IMPCTRL_OHM, val);
150-
}
145+
FIELD_PREP(STM32MP25_PCIEPRG_IMPCTRL_OHM, imp_of));
146+
} else
147+
imp_of = DEFAULT_IMP_INDEX;
151148

152149
if (!of_property_read_u32(combophy->dev->of_node, "st,output-vswing-microvolt", &val)) {
150+
max_vswing = imp_lookup[imp_of].vswing[vswing_size - 1];
151+
153152
if (val < min_vswing || val > max_vswing) {
154153
dev_err(combophy->dev, "Invalid value %u for output vswing\n", val);
155154
return -EINVAL;
156155
}
157156

158-
regval = 0;
159-
for (vswing_of = 0; vswing_of < ARRAY_SIZE(imp_lookup[imp_of].vswing); vswing_of++) {
160-
if (imp_lookup[imp_of].vswing[vswing_of] >= val) {
161-
regval = FIELD_PREP(STM32MP25_PCIEPRG_IMPCTRL_VSWING, vswing_of);
157+
for (vswing_of = 0; vswing_of < ARRAY_SIZE(imp_lookup[imp_of].vswing); vswing_of++)
158+
if (imp_lookup[imp_of].vswing[vswing_of] >= val)
162159
break;
163-
}
164-
}
160+
161+
if (WARN_ON(vswing_of == ARRAY_SIZE(imp_lookup[imp_of].vswing)))
162+
return -EINVAL;
165163

166164
dev_dbg(combophy->dev, "Set %u microvolt swing\n",
167165
imp_lookup[imp_of].vswing[vswing_of]);
168166

169167
regmap_update_bits(combophy->regmap, SYSCFG_PCIEPRGCR,
170168
STM32MP25_PCIEPRG_IMPCTRL_VSWING,
171-
regval);
169+
FIELD_PREP(STM32MP25_PCIEPRG_IMPCTRL_VSWING, vswing_of));
172170
}
173171

174172
return 0;

0 commit comments

Comments
 (0)