Lines Matching full:gmac
2 * Qualcomm Atheros IPQ806x GMAC glue layer
115 static int get_clk_div_sgmii(struct ipq806x_gmac *gmac, int speed) in get_clk_div_sgmii() argument
117 struct device *dev = &gmac->pdev->dev; in get_clk_div_sgmii()
141 static int get_clk_div_rgmii(struct ipq806x_gmac *gmac, int speed) in get_clk_div_rgmii() argument
143 struct device *dev = &gmac->pdev->dev; in get_clk_div_rgmii()
167 static int ipq806x_gmac_set_speed(struct ipq806x_gmac *gmac, int speed) in ipq806x_gmac_set_speed() argument
172 switch (gmac->phy_mode) { in ipq806x_gmac_set_speed()
177 div = get_clk_div_rgmii(gmac, speed); in ipq806x_gmac_set_speed()
178 clk_bits = NSS_COMMON_CLK_GATE_RGMII_RX_EN(gmac->id) | in ipq806x_gmac_set_speed()
179 NSS_COMMON_CLK_GATE_RGMII_TX_EN(gmac->id); in ipq806x_gmac_set_speed()
183 div = get_clk_div_sgmii(gmac, speed); in ipq806x_gmac_set_speed()
184 clk_bits = NSS_COMMON_CLK_GATE_GMII_RX_EN(gmac->id) | in ipq806x_gmac_set_speed()
185 NSS_COMMON_CLK_GATE_GMII_TX_EN(gmac->id); in ipq806x_gmac_set_speed()
189 dev_err(&gmac->pdev->dev, "Unsupported PHY mode: \"%s\"\n", in ipq806x_gmac_set_speed()
190 phy_modes(gmac->phy_mode)); in ipq806x_gmac_set_speed()
195 regmap_read(gmac->nss_common, NSS_COMMON_CLK_GATE, &val); in ipq806x_gmac_set_speed()
197 regmap_write(gmac->nss_common, NSS_COMMON_CLK_GATE, val); in ipq806x_gmac_set_speed()
200 regmap_read(gmac->nss_common, NSS_COMMON_CLK_DIV0, &val); in ipq806x_gmac_set_speed()
202 << NSS_COMMON_CLK_DIV_OFFSET(gmac->id)); in ipq806x_gmac_set_speed()
203 val |= div << NSS_COMMON_CLK_DIV_OFFSET(gmac->id); in ipq806x_gmac_set_speed()
204 regmap_write(gmac->nss_common, NSS_COMMON_CLK_DIV0, val); in ipq806x_gmac_set_speed()
207 regmap_read(gmac->nss_common, NSS_COMMON_CLK_GATE, &val); in ipq806x_gmac_set_speed()
209 regmap_write(gmac->nss_common, NSS_COMMON_CLK_GATE, val); in ipq806x_gmac_set_speed()
214 static int ipq806x_gmac_of_parse(struct ipq806x_gmac *gmac, in ipq806x_gmac_of_parse() argument
217 struct device *dev = &gmac->pdev->dev; in ipq806x_gmac_of_parse()
219 gmac->phy_mode = plat_dat->phy_interface; in ipq806x_gmac_of_parse()
221 if (of_property_read_u32(dev->of_node, "qcom,id", &gmac->id) < 0) { in ipq806x_gmac_of_parse()
230 if (gmac->id > 3) { in ipq806x_gmac_of_parse()
231 dev_err(dev, "invalid gmac id\n"); in ipq806x_gmac_of_parse()
235 gmac->core_clk = devm_clk_get(dev, "stmmaceth"); in ipq806x_gmac_of_parse()
236 if (IS_ERR(gmac->core_clk)) { in ipq806x_gmac_of_parse()
238 return PTR_ERR(gmac->core_clk); in ipq806x_gmac_of_parse()
240 clk_set_rate(gmac->core_clk, 266000000); in ipq806x_gmac_of_parse()
243 gmac->nss_common = syscon_regmap_lookup_by_phandle(dev->of_node, in ipq806x_gmac_of_parse()
245 if (IS_ERR(gmac->nss_common)) { in ipq806x_gmac_of_parse()
247 return PTR_ERR(gmac->nss_common); in ipq806x_gmac_of_parse()
251 gmac->qsgmii_csr = syscon_regmap_lookup_by_phandle(dev->of_node, in ipq806x_gmac_of_parse()
253 if (IS_ERR(gmac->qsgmii_csr)) in ipq806x_gmac_of_parse()
256 return PTR_ERR_OR_ZERO(gmac->qsgmii_csr); in ipq806x_gmac_of_parse()
262 struct ipq806x_gmac *gmac = bsp_priv; in ipq806x_gmac_set_clk_tx_rate() local
264 return ipq806x_gmac_set_speed(gmac, speed); in ipq806x_gmac_set_clk_tx_rate()
268 ipq806x_gmac_configure_qsgmii_pcs_speed(struct ipq806x_gmac *gmac) in ipq806x_gmac_configure_qsgmii_pcs_speed() argument
270 struct platform_device *pdev = gmac->pdev; in ipq806x_gmac_configure_qsgmii_pcs_speed()
307 regmap_update_bits(gmac->qsgmii_csr, QSGMII_PCS_ALL_CH_CTL, in ipq806x_gmac_configure_qsgmii_pcs_speed()
309 QSGMII_PCS_CH_SPEED_SHIFT(gmac->id), in ipq806x_gmac_configure_qsgmii_pcs_speed()
311 QSGMII_PCS_CH_SPEED_SHIFT(gmac->id)); in ipq806x_gmac_configure_qsgmii_pcs_speed()
326 ipq806x_gmac_configure_qsgmii_params(struct ipq806x_gmac *gmac) in ipq806x_gmac_configure_qsgmii_params() argument
328 struct platform_device *pdev = gmac->pdev; in ipq806x_gmac_configure_qsgmii_params()
333 switch (gmac->id) { in ipq806x_gmac_configure_qsgmii_params()
353 default: /* gmac 0 can't be set in SGMII mode */ in ipq806x_gmac_configure_qsgmii_params()
354 dev_err(dev, "gmac id %d can't be in SGMII mode", gmac->id); in ipq806x_gmac_configure_qsgmii_params()
358 /* Common params across all gmac id */ in ipq806x_gmac_configure_qsgmii_params()
368 regmap_write(gmac->qsgmii_csr, QSGMII_PHY_SGMII_CTL(gmac->id), in ipq806x_gmac_configure_qsgmii_params()
379 struct ipq806x_gmac *gmac; in ipq806x_gmac_probe() local
391 gmac = devm_kzalloc(dev, sizeof(*gmac), GFP_KERNEL); in ipq806x_gmac_probe()
392 if (!gmac) in ipq806x_gmac_probe()
395 gmac->pdev = pdev; in ipq806x_gmac_probe()
397 err = ipq806x_gmac_of_parse(gmac, plat_dat); in ipq806x_gmac_probe()
403 regmap_write(gmac->qsgmii_csr, QSGMII_PCS_CAL_LCKDT_CTL, in ipq806x_gmac_probe()
411 switch (gmac->phy_mode) { in ipq806x_gmac_probe()
424 regmap_write(gmac->nss_common, NSS_COMMON_GMAC_CTL(gmac->id), val); in ipq806x_gmac_probe()
427 regmap_read(gmac->nss_common, NSS_COMMON_CLK_SRC_CTRL, &val); in ipq806x_gmac_probe()
428 val &= ~(1 << NSS_COMMON_CLK_SRC_CTRL_OFFSET(gmac->id)); in ipq806x_gmac_probe()
429 switch (gmac->phy_mode) { in ipq806x_gmac_probe()
434 val |= NSS_COMMON_CLK_SRC_CTRL_RGMII(gmac->id) << in ipq806x_gmac_probe()
435 NSS_COMMON_CLK_SRC_CTRL_OFFSET(gmac->id); in ipq806x_gmac_probe()
438 val |= NSS_COMMON_CLK_SRC_CTRL_SGMII(gmac->id) << in ipq806x_gmac_probe()
439 NSS_COMMON_CLK_SRC_CTRL_OFFSET(gmac->id); in ipq806x_gmac_probe()
444 regmap_write(gmac->nss_common, NSS_COMMON_CLK_SRC_CTRL, val); in ipq806x_gmac_probe()
447 regmap_read(gmac->nss_common, NSS_COMMON_CLK_GATE, &val); in ipq806x_gmac_probe()
448 val |= NSS_COMMON_CLK_GATE_PTP_EN(gmac->id); in ipq806x_gmac_probe()
449 switch (gmac->phy_mode) { in ipq806x_gmac_probe()
454 val |= NSS_COMMON_CLK_GATE_RGMII_RX_EN(gmac->id) | in ipq806x_gmac_probe()
455 NSS_COMMON_CLK_GATE_RGMII_TX_EN(gmac->id); in ipq806x_gmac_probe()
458 val |= NSS_COMMON_CLK_GATE_GMII_RX_EN(gmac->id) | in ipq806x_gmac_probe()
459 NSS_COMMON_CLK_GATE_GMII_TX_EN(gmac->id); in ipq806x_gmac_probe()
464 regmap_write(gmac->nss_common, NSS_COMMON_CLK_GATE, val); in ipq806x_gmac_probe()
466 if (gmac->phy_mode == PHY_INTERFACE_MODE_SGMII) { in ipq806x_gmac_probe()
467 err = ipq806x_gmac_configure_qsgmii_params(gmac); in ipq806x_gmac_probe()
471 err = ipq806x_gmac_configure_qsgmii_pcs_speed(gmac); in ipq806x_gmac_probe()
477 plat_dat->bsp_priv = gmac; in ipq806x_gmac_probe()
487 phy_modes(gmac->phy_mode)); in ipq806x_gmac_probe()
492 { .compatible = "qcom,ipq806x-gmac" },
501 .name = "ipq806x-gmac-dwmac",