Lines Matching refs:dwmac

84 	int (*set_phy_mode)(struct meson8b_dwmac *dwmac);
107 static void meson8b_dwmac_mask_bits(struct meson8b_dwmac *dwmac, u32 reg,
112 data = readl(dwmac->regs + reg);
116 writel(data, dwmac->regs + reg);
119 static struct clk *meson8b_dwmac_register_clk(struct meson8b_dwmac *dwmac,
129 snprintf(clk_name, sizeof(clk_name), "%s#%s", dev_name(dwmac->dev),
140 return devm_clk_register(dwmac->dev, hw);
143 static int meson8b_init_rgmii_tx_clk(struct meson8b_dwmac *dwmac)
146 struct device *dev = dwmac->dev;
167 clk_configs->m250_mux.reg = dwmac->regs + PRG_ETH0;
171 clk = meson8b_dwmac_register_clk(dwmac, "m250_sel", mux_parents,
178 clk_configs->m250_div.reg = dwmac->regs + PRG_ETH0;
184 clk = meson8b_dwmac_register_clk(dwmac, "m250_div", &parent_data, 1,
193 clk = meson8b_dwmac_register_clk(dwmac, "fixed_div2", &parent_data, 1,
200 clk_configs->rgmii_tx_en.reg = dwmac->regs + PRG_ETH0;
202 clk = meson8b_dwmac_register_clk(dwmac, "rgmii_tx_en", &parent_data, 1,
208 dwmac->rgmii_tx_clk = clk;
213 static int meson8b_set_phy_mode(struct meson8b_dwmac *dwmac)
215 switch (dwmac->phy_mode) {
221 meson8b_dwmac_mask_bits(dwmac, PRG_ETH0,
227 meson8b_dwmac_mask_bits(dwmac, PRG_ETH0,
231 dev_err(dwmac->dev, "fail to set phy-mode %s\n",
232 phy_modes(dwmac->phy_mode));
239 static int meson_axg_set_phy_mode(struct meson8b_dwmac *dwmac)
241 switch (dwmac->phy_mode) {
247 meson8b_dwmac_mask_bits(dwmac, PRG_ETH0,
253 meson8b_dwmac_mask_bits(dwmac, PRG_ETH0,
258 dev_err(dwmac->dev, "fail to set phy-mode %s\n",
259 phy_modes(dwmac->phy_mode));
271 static int meson8b_devm_clk_prepare_enable(struct meson8b_dwmac *dwmac,
280 return devm_add_action_or_reset(dwmac->dev,
284 static int meson8b_init_rgmii_delays(struct meson8b_dwmac *dwmac)
292 dwmac->tx_delay_ns >> 1);
294 if (dwmac->data->has_prg_eth1_rgmii_rx_delay)
296 dwmac->rx_delay_ps / 200);
297 else if (dwmac->rx_delay_ps == 2000)
300 switch (dwmac->phy_mode) {
317 dev_err(dwmac->dev, "unsupported phy-mode %s\n",
318 phy_modes(dwmac->phy_mode));
323 if (!dwmac->timing_adj_clk) {
324 dev_err(dwmac->dev,
330 ret = meson8b_devm_clk_prepare_enable(dwmac,
331 dwmac->timing_adj_clk);
333 dev_err(dwmac->dev,
339 meson8b_dwmac_mask_bits(dwmac, PRG_ETH0, PRG_ETH0_TXDLY_MASK |
344 meson8b_dwmac_mask_bits(dwmac, PRG_ETH1, PRG_ETH1_CFG_RXCLK_DLY,
350 static int meson8b_init_prg_eth(struct meson8b_dwmac *dwmac)
354 if (phy_interface_mode_is_rgmii(dwmac->phy_mode)) {
356 meson8b_dwmac_mask_bits(dwmac, PRG_ETH0,
364 ret = clk_set_rate(dwmac->rgmii_tx_clk, 125 * 1000 * 1000);
366 dev_err(dwmac->dev,
371 ret = meson8b_devm_clk_prepare_enable(dwmac,
372 dwmac->rgmii_tx_clk);
374 dev_err(dwmac->dev,
380 meson8b_dwmac_mask_bits(dwmac, PRG_ETH0,
386 meson8b_dwmac_mask_bits(dwmac, PRG_ETH0, PRG_ETH0_TX_AND_PHY_REF_CLK,
396 struct meson8b_dwmac *dwmac;
407 dwmac = devm_kzalloc(&pdev->dev, sizeof(*dwmac), GFP_KERNEL);
408 if (!dwmac)
411 dwmac->data = (const struct meson8b_dwmac_data *)
413 if (!dwmac->data)
415 dwmac->regs = devm_platform_ioremap_resource(pdev, 1);
416 if (IS_ERR(dwmac->regs))
417 return PTR_ERR(dwmac->regs);
419 dwmac->dev = &pdev->dev;
420 ret = of_get_phy_mode(pdev->dev.of_node, &dwmac->phy_mode);
428 &dwmac->tx_delay_ns))
429 dwmac->tx_delay_ns = 2;
433 &dwmac->rx_delay_ps)) {
436 &dwmac->rx_delay_ps))
438 dwmac->rx_delay_ps *= 1000;
441 if (dwmac->data->has_prg_eth1_rgmii_rx_delay) {
442 if (dwmac->rx_delay_ps > 3000 || dwmac->rx_delay_ps % 200) {
443 dev_err(dwmac->dev,
448 if (dwmac->rx_delay_ps != 0 && dwmac->rx_delay_ps != 2000) {
449 dev_err(dwmac->dev,
455 dwmac->timing_adj_clk = devm_clk_get_optional(dwmac->dev,
457 if (IS_ERR(dwmac->timing_adj_clk))
458 return PTR_ERR(dwmac->timing_adj_clk);
460 ret = meson8b_init_rgmii_delays(dwmac);
464 ret = meson8b_init_rgmii_tx_clk(dwmac);
468 ret = dwmac->data->set_phy_mode(dwmac);
472 ret = meson8b_init_prg_eth(dwmac);
476 plat_dat->bsp_priv = dwmac;
498 .compatible = "amlogic,meson8b-dwmac",
502 .compatible = "amlogic,meson8m2-dwmac",
506 .compatible = "amlogic,meson-gxbb-dwmac",
510 .compatible = "amlogic,meson-axg-dwmac",
514 .compatible = "amlogic,meson-g12a-dwmac",
525 .name = "meson8b-dwmac",