Skip to content

Commit 6fcb22e

Browse files
committed
Merge tag 'phy-fixes-6.13' of git://git.kernel.org/pub/scm/linux/kernel/git/phy/linux-phy
Pull phy fixes from Vinod Koul: "A few core API fixes for devm calls and bunch of driver fixes as usual: - devm_phy_xxx fixes for few APIs in the phy core - qmp driver register name config - init sequence fix for usb driver - rockchip driver setting drvdata correctly in samsung hdptx and reset fix for naneng combophy - regulator dependency fix for mediatek hdmi driver - overflow assertion fix for stm32 driver" * tag 'phy-fixes-6.13' of git://git.kernel.org/pub/scm/linux/kernel/git/phy/linux-phy: phy: mediatek: phy-mtk-hdmi: add regulator dependency phy: freescale: fsl-samsung-hdmi: Fix 64-by-32 division cocci warnings phy: core: Fix an OF node refcount leakage in of_phy_provider_lookup() phy: core: Fix an OF node refcount leakage in _of_phy_get() phy: core: Fix that API devm_phy_destroy() fails to destroy the phy phy: core: Fix that API devm_of_phy_provider_unregister() fails to unregister the phy provider phy: core: Fix that API devm_phy_put() fails to release the phy phy: rockchip: samsung-hdptx: Set drvdata before enabling runtime PM phy: stm32: work around constant-value overflow assertion phy: qcom-qmp: Fix register name in RX Lane config of SC8280XP phy: rockchip: naneng-combphy: fix phy reset phy: usb: Toggle the PHY power during init
2 parents ab8beb2 + 17194c2 commit 6fcb22e

File tree

8 files changed

+40
-19
lines changed

8 files changed

+40
-19
lines changed

drivers/phy/broadcom/phy-brcm-usb-init-synopsys.c

+6
Original file line numberDiff line numberDiff line change
@@ -325,6 +325,12 @@ static void usb_init_common_7216(struct brcm_usb_init_params *params)
325325
void __iomem *ctrl = params->regs[BRCM_REGS_CTRL];
326326

327327
USB_CTRL_UNSET(ctrl, USB_PM, XHC_S2_CLK_SWITCH_EN);
328+
329+
/*
330+
* The PHY might be in a bad state if it is already powered
331+
* up. Toggle the power just in case.
332+
*/
333+
USB_CTRL_SET(ctrl, USB_PM, USB_PWRDN);
328334
USB_CTRL_UNSET(ctrl, USB_PM, USB_PWRDN);
329335

330336
/* 1 millisecond - for USB clocks to settle down */

drivers/phy/freescale/phy-fsl-samsung-hdmi.c

+1-2
Original file line numberDiff line numberDiff line change
@@ -424,8 +424,7 @@ static unsigned long fsl_samsung_hdmi_phy_find_pms(unsigned long fout, u8 *p, u1
424424
* Fvco = (M * f_ref) / P,
425425
* where f_ref is 24MHz.
426426
*/
427-
tmp = (u64)_m * 24 * MHZ;
428-
do_div(tmp, _p);
427+
tmp = div64_ul((u64)_m * 24 * MHZ, _p);
429428
if (tmp < 750 * MHZ ||
430429
tmp > 3000 * MHZ)
431430
continue;

drivers/phy/mediatek/Kconfig

+1
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ config PHY_MTK_HDMI
6565
depends on ARCH_MEDIATEK || COMPILE_TEST
6666
depends on COMMON_CLK
6767
depends on OF
68+
depends on REGULATOR
6869
select GENERIC_PHY
6970
help
7071
Support HDMI PHY for Mediatek SoCs.

drivers/phy/phy-core.c

+13-8
Original file line numberDiff line numberDiff line change
@@ -145,8 +145,10 @@ static struct phy_provider *of_phy_provider_lookup(struct device_node *node)
145145
return phy_provider;
146146

147147
for_each_child_of_node(phy_provider->children, child)
148-
if (child == node)
148+
if (child == node) {
149+
of_node_put(child);
149150
return phy_provider;
151+
}
150152
}
151153

152154
return ERR_PTR(-EPROBE_DEFER);
@@ -629,8 +631,10 @@ static struct phy *_of_phy_get(struct device_node *np, int index)
629631
return ERR_PTR(-ENODEV);
630632

631633
/* This phy type handled by the usb-phy subsystem for now */
632-
if (of_device_is_compatible(args.np, "usb-nop-xceiv"))
633-
return ERR_PTR(-ENODEV);
634+
if (of_device_is_compatible(args.np, "usb-nop-xceiv")) {
635+
phy = ERR_PTR(-ENODEV);
636+
goto out_put_node;
637+
}
634638

635639
mutex_lock(&phy_provider_mutex);
636640
phy_provider = of_phy_provider_lookup(args.np);
@@ -652,6 +656,7 @@ static struct phy *_of_phy_get(struct device_node *np, int index)
652656

653657
out_unlock:
654658
mutex_unlock(&phy_provider_mutex);
659+
out_put_node:
655660
of_node_put(args.np);
656661

657662
return phy;
@@ -737,7 +742,7 @@ void devm_phy_put(struct device *dev, struct phy *phy)
737742
if (!phy)
738743
return;
739744

740-
r = devres_destroy(dev, devm_phy_release, devm_phy_match, phy);
745+
r = devres_release(dev, devm_phy_release, devm_phy_match, phy);
741746
dev_WARN_ONCE(dev, r, "couldn't find PHY resource\n");
742747
}
743748
EXPORT_SYMBOL_GPL(devm_phy_put);
@@ -1121,7 +1126,7 @@ void devm_phy_destroy(struct device *dev, struct phy *phy)
11211126
{
11221127
int r;
11231128

1124-
r = devres_destroy(dev, devm_phy_consume, devm_phy_match, phy);
1129+
r = devres_release(dev, devm_phy_consume, devm_phy_match, phy);
11251130
dev_WARN_ONCE(dev, r, "couldn't find PHY resource\n");
11261131
}
11271132
EXPORT_SYMBOL_GPL(devm_phy_destroy);
@@ -1259,12 +1264,12 @@ EXPORT_SYMBOL_GPL(of_phy_provider_unregister);
12591264
* of_phy_provider_unregister to unregister the phy provider.
12601265
*/
12611266
void devm_of_phy_provider_unregister(struct device *dev,
1262-
struct phy_provider *phy_provider)
1267+
struct phy_provider *phy_provider)
12631268
{
12641269
int r;
12651270

1266-
r = devres_destroy(dev, devm_phy_provider_release, devm_phy_match,
1267-
phy_provider);
1271+
r = devres_release(dev, devm_phy_provider_release, devm_phy_match,
1272+
phy_provider);
12681273
dev_WARN_ONCE(dev, r, "couldn't find PHY provider device resource\n");
12691274
}
12701275
EXPORT_SYMBOL_GPL(devm_of_phy_provider_unregister);

drivers/phy/qualcomm/phy-qcom-qmp-usb.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -1052,7 +1052,7 @@ static const struct qmp_phy_init_tbl sc8280xp_usb3_uniphy_rx_tbl[] = {
10521052
QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_FASTLOCK_FO_GAIN, 0x2f),
10531053
QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_FASTLOCK_COUNT_LOW, 0xff),
10541054
QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_FASTLOCK_COUNT_HIGH, 0x0f),
1055-
QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_SO_GAIN, 0x0a),
1055+
QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_FO_GAIN, 0x0a),
10561056
QMP_PHY_INIT_CFG(QSERDES_V5_RX_VGA_CAL_CNTRL1, 0x54),
10571057
QMP_PHY_INIT_CFG(QSERDES_V5_RX_VGA_CAL_CNTRL2, 0x0f),
10581058
QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_EQU_ADAPTOR_CNTRL2, 0x0f),

drivers/phy/rockchip/phy-rockchip-naneng-combphy.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -309,7 +309,7 @@ static int rockchip_combphy_parse_dt(struct device *dev, struct rockchip_combphy
309309

310310
priv->ext_refclk = device_property_present(dev, "rockchip,ext-refclk");
311311

312-
priv->phy_rst = devm_reset_control_array_get_exclusive(dev);
312+
priv->phy_rst = devm_reset_control_get(dev, "phy");
313313
if (IS_ERR(priv->phy_rst))
314314
return dev_err_probe(dev, PTR_ERR(priv->phy_rst), "failed to get phy reset\n");
315315

drivers/phy/rockchip/phy-rockchip-samsung-hdptx.c

+2-1
Original file line numberDiff line numberDiff line change
@@ -1101,6 +1101,8 @@ static int rk_hdptx_phy_probe(struct platform_device *pdev)
11011101
return dev_err_probe(dev, PTR_ERR(hdptx->grf),
11021102
"Could not get GRF syscon\n");
11031103

1104+
platform_set_drvdata(pdev, hdptx);
1105+
11041106
ret = devm_pm_runtime_enable(dev);
11051107
if (ret)
11061108
return dev_err_probe(dev, ret, "Failed to enable runtime PM\n");
@@ -1110,7 +1112,6 @@ static int rk_hdptx_phy_probe(struct platform_device *pdev)
11101112
return dev_err_probe(dev, PTR_ERR(hdptx->phy),
11111113
"Failed to create HDMI PHY\n");
11121114

1113-
platform_set_drvdata(pdev, hdptx);
11141115
phy_set_drvdata(hdptx->phy, hdptx);
11151116
phy_set_bus_width(hdptx->phy, 8);
11161117

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

+15-6
Original file line numberDiff line numberDiff line change
@@ -122,23 +122,28 @@ static int stm32_impedance_tune(struct stm32_combophy *combophy)
122122
u32 max_vswing = imp_lookup[imp_size - 1].vswing[vswing_size - 1];
123123
u32 min_vswing = imp_lookup[0].vswing[0];
124124
u32 val;
125+
u32 regval;
125126

126127
if (!of_property_read_u32(combophy->dev->of_node, "st,output-micro-ohms", &val)) {
127128
if (val < min_imp || val > max_imp) {
128129
dev_err(combophy->dev, "Invalid value %u for output ohm\n", val);
129130
return -EINVAL;
130131
}
131132

132-
for (imp_of = 0; imp_of < ARRAY_SIZE(imp_lookup); imp_of++)
133-
if (imp_lookup[imp_of].microohm <= val)
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);
134137
break;
138+
}
139+
}
135140

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

139144
regmap_update_bits(combophy->regmap, SYSCFG_PCIEPRGCR,
140145
STM32MP25_PCIEPRG_IMPCTRL_OHM,
141-
FIELD_PREP(STM32MP25_PCIEPRG_IMPCTRL_OHM, imp_of));
146+
regval);
142147
} else {
143148
regmap_read(combophy->regmap, SYSCFG_PCIEPRGCR, &val);
144149
imp_of = FIELD_GET(STM32MP25_PCIEPRG_IMPCTRL_OHM, val);
@@ -150,16 +155,20 @@ static int stm32_impedance_tune(struct stm32_combophy *combophy)
150155
return -EINVAL;
151156
}
152157

153-
for (vswing_of = 0; vswing_of < ARRAY_SIZE(imp_lookup[imp_of].vswing); vswing_of++)
154-
if (imp_lookup[imp_of].vswing[vswing_of] >= val)
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);
155162
break;
163+
}
164+
}
156165

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

160169
regmap_update_bits(combophy->regmap, SYSCFG_PCIEPRGCR,
161170
STM32MP25_PCIEPRG_IMPCTRL_VSWING,
162-
FIELD_PREP(STM32MP25_PCIEPRG_IMPCTRL_VSWING, vswing_of));
171+
regval);
163172
}
164173

165174
return 0;

0 commit comments

Comments
 (0)