.. | .. |
---|
287 | 287 | return 0; |
---|
288 | 288 | } |
---|
289 | 289 | |
---|
| 290 | +static const char *rockchip_combphy_mode2str(enum phy_mode mode) |
---|
| 291 | +{ |
---|
| 292 | + switch (mode) { |
---|
| 293 | + case PHY_TYPE_SATA: |
---|
| 294 | + return "SATA"; |
---|
| 295 | + case PHY_TYPE_PCIE: |
---|
| 296 | + return "PCIe"; |
---|
| 297 | + case PHY_TYPE_USB3: |
---|
| 298 | + return "USB3"; |
---|
| 299 | + case PHY_TYPE_SGMII: |
---|
| 300 | + case PHY_TYPE_QSGMII: |
---|
| 301 | + return "GMII"; |
---|
| 302 | + default: |
---|
| 303 | + return "Unknown"; |
---|
| 304 | + } |
---|
| 305 | +} |
---|
| 306 | + |
---|
| 307 | +static int rockchip_combphy_validate(struct phy *phy, enum phy_mode mode, int submode, |
---|
| 308 | + union phy_configure_opts *opts) |
---|
| 309 | +{ |
---|
| 310 | + struct rockchip_combphy_priv *priv = phy_get_drvdata(phy); |
---|
| 311 | + |
---|
| 312 | + if (mode != priv->mode) { |
---|
| 313 | + dev_err(priv->dev, "expected mode is %s, but current mode is %s\n", |
---|
| 314 | + rockchip_combphy_mode2str(mode), |
---|
| 315 | + rockchip_combphy_mode2str(priv->mode)); |
---|
| 316 | + return -EINVAL; |
---|
| 317 | + } |
---|
| 318 | + |
---|
| 319 | + return 0; |
---|
| 320 | +} |
---|
| 321 | + |
---|
290 | 322 | static const struct phy_ops rochchip_combphy_ops = { |
---|
291 | 323 | .init = rockchip_combphy_init, |
---|
292 | 324 | .exit = rockchip_combphy_exit, |
---|
| 325 | + .validate = rockchip_combphy_validate, |
---|
293 | 326 | .owner = THIS_MODULE, |
---|
294 | 327 | }; |
---|
295 | 328 | |
---|