Lines Matching refs:phydev
135 static int kszphy_extended_write(struct phy_device *phydev, in kszphy_extended_write() argument
138 phy_write(phydev, MII_KSZPHY_EXTREG, KSZPHY_EXTREG_WRITE | regnum); in kszphy_extended_write()
139 return phy_write(phydev, MII_KSZPHY_EXTREG_WRITE, val); in kszphy_extended_write()
142 static int kszphy_extended_read(struct phy_device *phydev, in kszphy_extended_read() argument
145 phy_write(phydev, MII_KSZPHY_EXTREG, regnum); in kszphy_extended_read()
146 return phy_read(phydev, MII_KSZPHY_EXTREG_READ); in kszphy_extended_read()
149 static int kszphy_ack_interrupt(struct phy_device *phydev) in kszphy_ack_interrupt() argument
154 rc = phy_read(phydev, MII_KSZPHY_INTCS); in kszphy_ack_interrupt()
159 static int kszphy_config_intr(struct phy_device *phydev) in kszphy_config_intr() argument
161 const struct kszphy_type *type = phydev->drv->driver_data; in kszphy_config_intr()
171 temp = phy_read(phydev, MII_KSZPHY_CTRL); in kszphy_config_intr()
175 phy_write(phydev, MII_KSZPHY_CTRL, temp); in kszphy_config_intr()
178 if (phydev->interrupts == PHY_INTERRUPT_ENABLED) in kszphy_config_intr()
183 return phy_write(phydev, MII_KSZPHY_INTCS, temp); in kszphy_config_intr()
186 static int kszphy_rmii_clk_sel(struct phy_device *phydev, bool val) in kszphy_rmii_clk_sel() argument
190 ctrl = phy_read(phydev, MII_KSZPHY_CTRL); in kszphy_rmii_clk_sel()
199 return phy_write(phydev, MII_KSZPHY_CTRL, ctrl); in kszphy_rmii_clk_sel()
202 static int kszphy_setup_led(struct phy_device *phydev, u32 reg, int val) in kszphy_setup_led() argument
217 temp = phy_read(phydev, reg); in kszphy_setup_led()
225 rc = phy_write(phydev, reg, temp); in kszphy_setup_led()
228 phydev_err(phydev, "failed to set led mode\n"); in kszphy_setup_led()
236 static int kszphy_broadcast_disable(struct phy_device *phydev) in kszphy_broadcast_disable() argument
240 ret = phy_read(phydev, MII_KSZPHY_OMSO); in kszphy_broadcast_disable()
244 ret = phy_write(phydev, MII_KSZPHY_OMSO, ret | KSZPHY_OMSO_B_CAST_OFF); in kszphy_broadcast_disable()
247 phydev_err(phydev, "failed to disable broadcast address\n"); in kszphy_broadcast_disable()
252 static int kszphy_nand_tree_disable(struct phy_device *phydev) in kszphy_nand_tree_disable() argument
256 ret = phy_read(phydev, MII_KSZPHY_OMSO); in kszphy_nand_tree_disable()
263 ret = phy_write(phydev, MII_KSZPHY_OMSO, in kszphy_nand_tree_disable()
267 phydev_err(phydev, "failed to disable NAND tree mode\n"); in kszphy_nand_tree_disable()
273 static int kszphy_config_reset(struct phy_device *phydev) in kszphy_config_reset() argument
275 struct kszphy_priv *priv = phydev->priv; in kszphy_config_reset()
279 ret = kszphy_rmii_clk_sel(phydev, priv->rmii_ref_clk_sel_val); in kszphy_config_reset()
281 phydev_err(phydev, in kszphy_config_reset()
288 kszphy_setup_led(phydev, priv->type->led_mode_reg, priv->led_mode); in kszphy_config_reset()
293 static int kszphy_config_init(struct phy_device *phydev) in kszphy_config_init() argument
295 struct kszphy_priv *priv = phydev->priv; in kszphy_config_init()
304 kszphy_broadcast_disable(phydev); in kszphy_config_init()
307 kszphy_nand_tree_disable(phydev); in kszphy_config_init()
309 return kszphy_config_reset(phydev); in kszphy_config_init()
312 static int ksz8041_config_init(struct phy_device *phydev) in ksz8041_config_init() argument
314 struct device_node *of_node = phydev->mdio.dev.of_node; in ksz8041_config_init()
318 phydev->dev_flags |= MICREL_PHY_FXEN; in ksz8041_config_init()
319 phydev->supported &= SUPPORTED_100baseT_Full | in ksz8041_config_init()
321 phydev->supported |= SUPPORTED_FIBRE; in ksz8041_config_init()
322 phydev->advertising &= ADVERTISED_100baseT_Full | in ksz8041_config_init()
324 phydev->advertising |= ADVERTISED_FIBRE; in ksz8041_config_init()
325 phydev->autoneg = AUTONEG_DISABLE; in ksz8041_config_init()
328 return kszphy_config_init(phydev); in ksz8041_config_init()
331 static int ksz8041_config_aneg(struct phy_device *phydev) in ksz8041_config_aneg() argument
334 if (phydev->dev_flags & MICREL_PHY_FXEN) { in ksz8041_config_aneg()
335 phydev->speed = SPEED_100; in ksz8041_config_aneg()
339 return genphy_config_aneg(phydev); in ksz8041_config_aneg()
342 static int ksz9021_load_values_from_of(struct phy_device *phydev, in ksz9021_load_values_from_of() argument
371 newval = kszphy_extended_read(phydev, reg); in ksz9021_load_values_from_of()
387 return kszphy_extended_write(phydev, reg, newval); in ksz9021_load_values_from_of()
390 static int ksz9021_config_init(struct phy_device *phydev) in ksz9021_config_init() argument
392 const struct device *dev = &phydev->mdio.dev; in ksz9021_config_init()
400 dev_walker = &phydev->mdio.dev; in ksz9021_config_init()
408 ksz9021_load_values_from_of(phydev, of_node, in ksz9021_config_init()
412 ksz9021_load_values_from_of(phydev, of_node, in ksz9021_config_init()
416 ksz9021_load_values_from_of(phydev, of_node, in ksz9021_config_init()
444 static int ksz9031_extended_write(struct phy_device *phydev, in ksz9031_extended_write() argument
447 phy_write(phydev, MII_KSZ9031RN_MMD_CTRL_REG, dev_addr); in ksz9031_extended_write()
448 phy_write(phydev, MII_KSZ9031RN_MMD_REGDATA_REG, regnum); in ksz9031_extended_write()
449 phy_write(phydev, MII_KSZ9031RN_MMD_CTRL_REG, (mode << 14) | dev_addr); in ksz9031_extended_write()
450 return phy_write(phydev, MII_KSZ9031RN_MMD_REGDATA_REG, val); in ksz9031_extended_write()
453 static int ksz9031_extended_read(struct phy_device *phydev, in ksz9031_extended_read() argument
456 phy_write(phydev, MII_KSZ9031RN_MMD_CTRL_REG, dev_addr); in ksz9031_extended_read()
457 phy_write(phydev, MII_KSZ9031RN_MMD_REGDATA_REG, regnum); in ksz9031_extended_read()
458 phy_write(phydev, MII_KSZ9031RN_MMD_CTRL_REG, (mode << 14) | dev_addr); in ksz9031_extended_read()
459 return phy_read(phydev, MII_KSZ9031RN_MMD_REGDATA_REG); in ksz9031_extended_read()
462 static int ksz9031_of_load_skew_values(struct phy_device *phydev, in ksz9031_of_load_skew_values() argument
482 newval = ksz9031_extended_read(phydev, OP_DATA, 2, reg); in ksz9031_of_load_skew_values()
496 return ksz9031_extended_write(phydev, OP_DATA, 2, reg, newval); in ksz9031_of_load_skew_values()
500 static int ksz9031_center_flp_timing(struct phy_device *phydev) in ksz9031_center_flp_timing() argument
504 result = ksz9031_extended_write(phydev, OP_DATA, 0, in ksz9031_center_flp_timing()
509 result = ksz9031_extended_write(phydev, OP_DATA, 0, in ksz9031_center_flp_timing()
514 return genphy_restart_aneg(phydev); in ksz9031_center_flp_timing()
518 static int ksz9031_enable_edpd(struct phy_device *phydev) in ksz9031_enable_edpd() argument
522 reg = ksz9031_extended_read(phydev, OP_DATA, 0x1C, MII_KSZ9031RN_EDPD); in ksz9031_enable_edpd()
525 return ksz9031_extended_write(phydev, OP_DATA, 0x1C, MII_KSZ9031RN_EDPD, in ksz9031_enable_edpd()
529 static int ksz9031_config_init(struct phy_device *phydev) in ksz9031_config_init() argument
531 const struct device *dev = &phydev->mdio.dev; in ksz9031_config_init()
546 result = ksz9031_enable_edpd(phydev); in ksz9031_config_init()
554 dev_walker = &phydev->mdio.dev; in ksz9031_config_init()
561 ksz9031_of_load_skew_values(phydev, of_node, in ksz9031_config_init()
565 ksz9031_of_load_skew_values(phydev, of_node, in ksz9031_config_init()
569 ksz9031_of_load_skew_values(phydev, of_node, in ksz9031_config_init()
573 ksz9031_of_load_skew_values(phydev, of_node, in ksz9031_config_init()
593 result = phy_read(phydev, MII_CTRL1000); in ksz9031_config_init()
599 result = phy_write(phydev, MII_CTRL1000, result); in ksz9031_config_init()
605 return ksz9031_center_flp_timing(phydev); in ksz9031_config_init()
608 phydev_err(phydev, "failed to force the phy to master mode\n"); in ksz9031_config_init()
615 static int ksz8873mll_read_status(struct phy_device *phydev) in ksz8873mll_read_status() argument
620 regval = phy_read(phydev, KSZ8873MLL_GLOBAL_CONTROL_4); in ksz8873mll_read_status()
622 regval = phy_read(phydev, KSZ8873MLL_GLOBAL_CONTROL_4); in ksz8873mll_read_status()
625 phydev->duplex = DUPLEX_HALF; in ksz8873mll_read_status()
627 phydev->duplex = DUPLEX_FULL; in ksz8873mll_read_status()
630 phydev->speed = SPEED_10; in ksz8873mll_read_status()
632 phydev->speed = SPEED_100; in ksz8873mll_read_status()
634 phydev->link = 1; in ksz8873mll_read_status()
635 phydev->pause = phydev->asym_pause = 0; in ksz8873mll_read_status()
640 static int ksz9031_read_status(struct phy_device *phydev) in ksz9031_read_status() argument
645 err = genphy_read_status(phydev); in ksz9031_read_status()
652 regval = phy_read(phydev, MII_STAT1000); in ksz9031_read_status()
654 phy_init_hw(phydev); in ksz9031_read_status()
655 phydev->link = 0; in ksz9031_read_status()
656 if (phydev->drv->config_intr && phy_interrupt_is_valid(phydev)) in ksz9031_read_status()
657 phydev->drv->config_intr(phydev); in ksz9031_read_status()
658 return genphy_config_aneg(phydev); in ksz9031_read_status()
664 static int ksz8873mll_config_aneg(struct phy_device *phydev) in ksz8873mll_config_aneg() argument
669 static int kszphy_get_sset_count(struct phy_device *phydev) in kszphy_get_sset_count() argument
674 static void kszphy_get_strings(struct phy_device *phydev, u8 *data) in kszphy_get_strings() argument
684 static u64 kszphy_get_stat(struct phy_device *phydev, int i) in kszphy_get_stat() argument
687 struct kszphy_priv *priv = phydev->priv; in kszphy_get_stat()
691 val = phy_read(phydev, stat.reg); in kszphy_get_stat()
703 static void kszphy_get_stats(struct phy_device *phydev, in kszphy_get_stats() argument
709 data[i] = kszphy_get_stat(phydev, i); in kszphy_get_stats()
712 static int kszphy_suspend(struct phy_device *phydev) in kszphy_suspend() argument
715 if (phy_interrupt_is_valid(phydev)) { in kszphy_suspend()
716 phydev->interrupts = PHY_INTERRUPT_DISABLED; in kszphy_suspend()
717 if (phydev->drv->config_intr) in kszphy_suspend()
718 phydev->drv->config_intr(phydev); in kszphy_suspend()
721 return genphy_suspend(phydev); in kszphy_suspend()
724 static int kszphy_resume(struct phy_device *phydev) in kszphy_resume() argument
728 genphy_resume(phydev); in kszphy_resume()
730 ret = kszphy_config_reset(phydev); in kszphy_resume()
735 if (phy_interrupt_is_valid(phydev)) { in kszphy_resume()
736 phydev->interrupts = PHY_INTERRUPT_ENABLED; in kszphy_resume()
737 if (phydev->drv->config_intr) in kszphy_resume()
738 phydev->drv->config_intr(phydev); in kszphy_resume()
744 static int kszphy_probe(struct phy_device *phydev) in kszphy_probe() argument
746 const struct kszphy_type *type = phydev->drv->driver_data; in kszphy_probe()
747 const struct device_node *np = phydev->mdio.dev.of_node; in kszphy_probe()
752 priv = devm_kzalloc(&phydev->mdio.dev, sizeof(*priv), GFP_KERNEL); in kszphy_probe()
756 phydev->priv = priv; in kszphy_probe()
767 phydev_err(phydev, "invalid led mode: 0x%02x\n", in kszphy_probe()
775 clk = devm_clk_get(&phydev->mdio.dev, "rmii-ref"); in kszphy_probe()
790 phydev_err(phydev, "Clock rate out of range: %ld\n", in kszphy_probe()
797 if (phydev->dev_flags & MICREL_PHY_50MHZ_CLK) { in kszphy_probe()