Lines Matching full:phydev
75 struct phy_device *phydev; member
83 static void rk630_phy_t22_get_tx_level_from_efuse(struct phy_device *phydev) in rk630_phy_t22_get_tx_level_from_efuse() argument
85 struct rk630_phy_priv *priv = phydev->priv; in rk630_phy_t22_get_tx_level_from_efuse()
92 cell = nvmem_cell_get(&phydev->mdio.dev, "txlevel"); in rk630_phy_t22_get_tx_level_from_efuse()
94 phydev_err(phydev, "failed to get txlevel cell: %ld, use default\n", in rk630_phy_t22_get_tx_level_from_efuse()
106 phydev_err(phydev, "failed to get efuse buf, use default\n"); in rk630_phy_t22_get_tx_level_from_efuse()
114 static void rk630_phy_wol_enable(struct phy_device *phydev) in rk630_phy_wol_enable() argument
116 struct net_device *ndev = phydev->attached_dev; in rk630_phy_wol_enable()
120 phy_write(phydev, REG_PAGE_SEL, 0x0000); in rk630_phy_wol_enable()
121 phy_write(phydev, REG_MAC_ADDRESS0, ((u16)ndev->dev_addr[0] << 8) + ndev->dev_addr[1]); in rk630_phy_wol_enable()
122 phy_write(phydev, REG_MAC_ADDRESS1, ((u16)ndev->dev_addr[2] << 8) + ndev->dev_addr[3]); in rk630_phy_wol_enable()
123 phy_write(phydev, REG_MAC_ADDRESS2, ((u16)ndev->dev_addr[4] << 8) + ndev->dev_addr[5]); in rk630_phy_wol_enable()
125 value = phy_read(phydev, REG_GLOBAL_CONFIGURATION); in rk630_phy_wol_enable()
129 phy_write(phydev, REG_GLOBAL_CONFIGURATION, value); in rk630_phy_wol_enable()
131 value = phy_read(phydev, REG_INTERRUPT_MASK); in rk630_phy_wol_enable()
133 phy_write(phydev, REG_INTERRUPT_MASK, value); in rk630_phy_wol_enable()
136 static void rk630_phy_wol_disable(struct phy_device *phydev) in rk630_phy_wol_disable() argument
141 phy_write(phydev, REG_PAGE_SEL, 0x0000); in rk630_phy_wol_disable()
142 value = phy_read(phydev, REG_GLOBAL_CONFIGURATION); in rk630_phy_wol_disable()
144 phy_write(phydev, REG_GLOBAL_CONFIGURATION, value); in rk630_phy_wol_disable()
147 static void rk630_phy_ieee_set(struct phy_device *phydev, bool enable) in rk630_phy_ieee_set() argument
152 phy_write(phydev, REG_PAGE_SEL, 0x0100); in rk630_phy_ieee_set()
153 value = phy_read(phydev, REG_PAGE1_EEE_CONFIGURE); in rk630_phy_ieee_set()
158 phy_write(phydev, REG_PAGE1_EEE_CONFIGURE, value); in rk630_phy_ieee_set()
160 phy_write(phydev, REG_PAGE_SEL, 0x0000); in rk630_phy_ieee_set()
163 static void rk630_phy_set_aps(struct phy_device *phydev, bool enable) in rk630_phy_set_aps() argument
168 phy_write(phydev, REG_PAGE_SEL, 0x0100); in rk630_phy_set_aps()
169 value = phy_read(phydev, REG_PAGE1_APS_CTRL); in rk630_phy_set_aps()
174 phy_write(phydev, REG_PAGE1_APS_CTRL, value); in rk630_phy_set_aps()
176 phy_write(phydev, REG_PAGE_SEL, 0x0000); in rk630_phy_set_aps()
179 static void rk630_phy_set_uaps(struct phy_device *phydev, bool enable) in rk630_phy_set_uaps() argument
184 phy_write(phydev, REG_PAGE_SEL, 0x0100); in rk630_phy_set_uaps()
185 value = phy_read(phydev, REG_PAGE1_UAPS_CONFIGURE); in rk630_phy_set_uaps()
190 phy_write(phydev, REG_PAGE1_UAPS_CONFIGURE, value); in rk630_phy_set_uaps()
192 phy_write(phydev, REG_PAGE_SEL, 0x0000); in rk630_phy_set_uaps()
195 static void rk630_phy_s40_config_init(struct phy_device *phydev) in rk630_phy_s40_config_init() argument
197 phy_write(phydev, 0, phy_read(phydev, 0) & ~BIT(13)); in rk630_phy_s40_config_init()
200 phy_write(phydev, REG_PAGE_SEL, 0x0100); in rk630_phy_s40_config_init()
202 phy_write(phydev, REG_PAGE1_APS_CTRL, 0x4824); in rk630_phy_s40_config_init()
204 phy_write(phydev, REG_PAGE_SEL, 0x0200); in rk630_phy_s40_config_init()
206 phy_write(phydev, REG_PAGE2_AFE_CTRL, 0x0000); in rk630_phy_s40_config_init()
208 phy_write(phydev, REG_PAGE_SEL, 0x0600); in rk630_phy_s40_config_init()
210 phy_write(phydev, REG_PAGE6_AFE_TX_CTRL, 0x708f); in rk630_phy_s40_config_init()
212 phy_write(phydev, REG_PAGE6_AFE_RX_CTRL, 0xf000); in rk630_phy_s40_config_init()
213 phy_write(phydev, REG_PAGE6_AFE_DRIVER2, 0x1530); in rk630_phy_s40_config_init()
216 phy_write(phydev, REG_PAGE_SEL, 0x0800); in rk630_phy_s40_config_init()
218 phy_write(phydev, REG_PAGE8_AFE_CTRL, 0x00bc); in rk630_phy_s40_config_init()
221 phy_write(phydev, REG_PAGE_SEL, 0x0000); in rk630_phy_s40_config_init()
224 static void rk630_phy_t22_config_init(struct phy_device *phydev) in rk630_phy_t22_config_init() argument
226 struct rk630_phy_priv *priv = phydev->priv; in rk630_phy_t22_config_init()
229 phy_write(phydev, REG_PAGE_SEL, 0x0100); in rk630_phy_t22_config_init()
231 phy_write(phydev, 0x10, 0xfbfe); in rk630_phy_t22_config_init()
233 phy_write(phydev, REG_PAGE1_APS_CTRL, 0x4824); in rk630_phy_t22_config_init()
235 phy_write(phydev, REG_PAGE_SEL, 0x0200); in rk630_phy_t22_config_init()
237 phy_write(phydev, REG_PAGE2_AFE_CTRL, 0x0000); in rk630_phy_t22_config_init()
239 phy_write(phydev, REG_PAGE_SEL, 0x0600); in rk630_phy_t22_config_init()
241 phy_write(phydev, REG_PAGE6_ADC_ANONTROL, 0x555e); in rk630_phy_t22_config_init()
243 phy_write(phydev, REG_PAGE6_GAIN_ANONTROL, 0x0400); in rk630_phy_t22_config_init()
245 phy_write(phydev, REG_PAGE6_AFE_TX_CTRL, 0x1088); in rk630_phy_t22_config_init()
248 rk630_phy_t22_get_tx_level_from_efuse(phydev); in rk630_phy_t22_config_init()
251 phy_write(phydev, REG_PAGE6_AFE_DRIVER2, in rk630_phy_t22_config_init()
254 phy_write(phydev, REG_PAGE6_CP_CURRENT, 0x0575); in rk630_phy_t22_config_init()
256 phy_write(phydev, REG_PAGE6_ADC_OP_BIAS, 0x0000); in rk630_phy_t22_config_init()
258 phy_write(phydev, REG_PAGE6_RX_DECTOR, 0x0408); in rk630_phy_t22_config_init()
260 phy_write(phydev, REG_PAGE6_AFE_PDCW, 0x8880); in rk630_phy_t22_config_init()
262 phy_write(phydev, REG_PAGE6_TX_MOS_DRV, 0x888e); in rk630_phy_t22_config_init()
265 phy_write(phydev, REG_PAGE_SEL, 0x0800); in rk630_phy_t22_config_init()
267 phy_write(phydev, REG_PAGE8_AUTO_CAL, 0x0844); in rk630_phy_t22_config_init()
269 phy_write(phydev, 0x13, 0xc096); in rk630_phy_t22_config_init()
272 phy_write(phydev, REG_PAGE_SEL, 0x0000); in rk630_phy_t22_config_init()
275 phy_write(phydev, REG_MMD_ACCESS_CONTROL, 0x0007); in rk630_phy_t22_config_init()
276 phy_write(phydev, REG_MMD_ACCESS_DATA_ADDRESS, 0x003c); in rk630_phy_t22_config_init()
277 phy_write(phydev, REG_MMD_ACCESS_CONTROL, 0x4007); in rk630_phy_t22_config_init()
278 phy_write(phydev, REG_MMD_ACCESS_DATA_ADDRESS, 0x0000); in rk630_phy_t22_config_init()
281 static int rk630_phy_config_init(struct phy_device *phydev) in rk630_phy_config_init() argument
283 switch (phydev->mdio.addr) { in rk630_phy_config_init()
285 rk630_phy_s40_config_init(phydev); in rk630_phy_config_init()
290 rk630_phy_set_uaps(phydev, true); in rk630_phy_config_init()
293 rk630_phy_t22_config_init(phydev); in rk630_phy_config_init()
294 rk630_phy_set_aps(phydev, true); in rk630_phy_config_init()
295 rk630_phy_set_uaps(phydev, true); in rk630_phy_config_init()
298 phydev_err(phydev, "Unsupported address for current phy: %d\n", in rk630_phy_config_init()
299 phydev->mdio.addr); in rk630_phy_config_init()
303 rk630_phy_ieee_set(phydev, true); in rk630_phy_config_init()
308 static void rk630_link_change_notify(struct phy_device *phydev) in rk630_link_change_notify() argument
312 if (phydev->state == PHY_RUNNING || phydev->state == PHY_NOLINK) { in rk630_link_change_notify()
314 phy_write(phydev, REG_PAGE_SEL, 0x0600); in rk630_link_change_notify()
315 val = phy_read(phydev, REG_PAGE6_AFE_TX_CTRL); in rk630_link_change_notify()
317 if (phydev->speed == SPEED_10 && phydev->link) in rk630_link_change_notify()
319 phy_write(phydev, REG_PAGE6_AFE_TX_CTRL, val); in rk630_link_change_notify()
321 phy_write(phydev, REG_PAGE_SEL, 0x0000); in rk630_link_change_notify()
329 phy_write(priv->phydev, REG_INTERRUPT_STATUS, BIT(14)); in rk630_wol_irq_thread()
334 static int rk630_phy_probe(struct phy_device *phydev) in rk630_phy_probe() argument
339 priv = devm_kzalloc(&phydev->mdio.dev, sizeof(*priv), GFP_KERNEL); in rk630_phy_probe()
343 phydev->priv = priv; in rk630_phy_probe()
345 priv->wol_irq = of_irq_get_byname(phydev->mdio.dev.of_node, "wol_irq"); in rk630_phy_probe()
352 ret = devm_request_threaded_irq(&phydev->mdio.dev, priv->wol_irq, in rk630_phy_probe()
358 phydev_err(phydev, "request wol_irq failed: %d\n", ret); in rk630_phy_probe()
365 priv->phydev = phydev; in rk630_phy_probe()
370 static void rk630_phy_remove(struct phy_device *phydev) in rk630_phy_remove() argument
372 struct rk630_phy_priv *priv = phydev->priv; in rk630_phy_remove()
378 static int rk630_phy_suspend(struct phy_device *phydev) in rk630_phy_suspend() argument
380 struct rk630_phy_priv *priv = phydev->priv; in rk630_phy_suspend()
383 rk630_phy_wol_enable(phydev); in rk630_phy_suspend()
384 phy_write(phydev, REG_INTERRUPT_MASK, BIT(14)); in rk630_phy_suspend()
387 return genphy_suspend(phydev); in rk630_phy_suspend()
390 static int rk630_phy_resume(struct phy_device *phydev) in rk630_phy_resume() argument
392 struct rk630_phy_priv *priv = phydev->priv; in rk630_phy_resume()
395 rk630_phy_wol_disable(phydev); in rk630_phy_resume()
396 phy_write(phydev, REG_INTERRUPT_MASK, 0); in rk630_phy_resume()
400 return genphy_resume(phydev); in rk630_phy_resume()