| .. | .. |
|---|
| 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 | |
|---|