Lines Matching defs:gmac

115 static int get_clk_div_sgmii(struct ipq806x_gmac *gmac, unsigned int speed)
117 struct device *dev = &gmac->pdev->dev;
141 static int get_clk_div_rgmii(struct ipq806x_gmac *gmac, unsigned int speed)
143 struct device *dev = &gmac->pdev->dev;
167 static int ipq806x_gmac_set_speed(struct ipq806x_gmac *gmac, unsigned int speed)
172 switch (gmac->phy_mode) {
174 div = get_clk_div_rgmii(gmac, speed);
175 clk_bits = NSS_COMMON_CLK_GATE_RGMII_RX_EN(gmac->id) |
176 NSS_COMMON_CLK_GATE_RGMII_TX_EN(gmac->id);
180 div = get_clk_div_sgmii(gmac, speed);
181 clk_bits = NSS_COMMON_CLK_GATE_GMII_RX_EN(gmac->id) |
182 NSS_COMMON_CLK_GATE_GMII_TX_EN(gmac->id);
186 dev_err(&gmac->pdev->dev, "Unsupported PHY mode: \"%s\"\n",
187 phy_modes(gmac->phy_mode));
192 regmap_read(gmac->nss_common, NSS_COMMON_CLK_GATE, &val);
194 regmap_write(gmac->nss_common, NSS_COMMON_CLK_GATE, val);
197 regmap_read(gmac->nss_common, NSS_COMMON_CLK_DIV0, &val);
199 << NSS_COMMON_CLK_DIV_OFFSET(gmac->id));
200 val |= div << NSS_COMMON_CLK_DIV_OFFSET(gmac->id);
201 regmap_write(gmac->nss_common, NSS_COMMON_CLK_DIV0, val);
204 regmap_read(gmac->nss_common, NSS_COMMON_CLK_GATE, &val);
206 regmap_write(gmac->nss_common, NSS_COMMON_CLK_GATE, val);
211 static int ipq806x_gmac_of_parse(struct ipq806x_gmac *gmac)
213 struct device *dev = &gmac->pdev->dev;
216 ret = of_get_phy_mode(dev->of_node, &gmac->phy_mode);
222 if (of_property_read_u32(dev->of_node, "qcom,id", &gmac->id) < 0) {
231 if (gmac->id > 3) {
232 dev_err(dev, "invalid gmac id\n");
236 gmac->core_clk = devm_clk_get(dev, "stmmaceth");
237 if (IS_ERR(gmac->core_clk)) {
239 return PTR_ERR(gmac->core_clk);
241 clk_set_rate(gmac->core_clk, 266000000);
244 gmac->nss_common = syscon_regmap_lookup_by_phandle(dev->of_node,
246 if (IS_ERR(gmac->nss_common)) {
248 return PTR_ERR(gmac->nss_common);
252 gmac->qsgmii_csr = syscon_regmap_lookup_by_phandle(dev->of_node,
254 if (IS_ERR(gmac->qsgmii_csr))
257 return PTR_ERR_OR_ZERO(gmac->qsgmii_csr);
262 struct ipq806x_gmac *gmac = priv;
264 ipq806x_gmac_set_speed(gmac, speed);
268 ipq806x_gmac_configure_qsgmii_pcs_speed(struct ipq806x_gmac *gmac)
270 struct platform_device *pdev = gmac->pdev;
307 regmap_update_bits(gmac->qsgmii_csr, QSGMII_PCS_ALL_CH_CTL,
309 QSGMII_PCS_CH_SPEED_SHIFT(gmac->id),
311 QSGMII_PCS_CH_SPEED_SHIFT(gmac->id));
326 ipq806x_gmac_configure_qsgmii_params(struct ipq806x_gmac *gmac)
328 struct platform_device *pdev = gmac->pdev;
333 switch (gmac->id) {
353 default: /* gmac 0 can't be set in SGMII mode */
354 dev_err(dev, "gmac id %d can't be in SGMII mode", gmac->id);
358 /* Common params across all gmac id */
368 regmap_write(gmac->qsgmii_csr, QSGMII_PHY_SGMII_CTL(gmac->id),
379 struct ipq806x_gmac *gmac;
391 gmac = devm_kzalloc(dev, sizeof(*gmac), GFP_KERNEL);
392 if (!gmac) {
397 gmac->pdev = pdev;
399 err = ipq806x_gmac_of_parse(gmac);
405 regmap_write(gmac->qsgmii_csr, QSGMII_PCS_CAL_LCKDT_CTL,
413 switch (gmac->phy_mode) {
423 regmap_write(gmac->nss_common, NSS_COMMON_GMAC_CTL(gmac->id), val);
426 regmap_read(gmac->nss_common, NSS_COMMON_CLK_SRC_CTRL, &val);
427 val &= ~(1 << NSS_COMMON_CLK_SRC_CTRL_OFFSET(gmac->id));
428 switch (gmac->phy_mode) {
430 val |= NSS_COMMON_CLK_SRC_CTRL_RGMII(gmac->id) <<
431 NSS_COMMON_CLK_SRC_CTRL_OFFSET(gmac->id);
434 val |= NSS_COMMON_CLK_SRC_CTRL_SGMII(gmac->id) <<
435 NSS_COMMON_CLK_SRC_CTRL_OFFSET(gmac->id);
440 regmap_write(gmac->nss_common, NSS_COMMON_CLK_SRC_CTRL, val);
443 regmap_read(gmac->nss_common, NSS_COMMON_CLK_GATE, &val);
444 val |= NSS_COMMON_CLK_GATE_PTP_EN(gmac->id);
445 switch (gmac->phy_mode) {
447 val |= NSS_COMMON_CLK_GATE_RGMII_RX_EN(gmac->id) |
448 NSS_COMMON_CLK_GATE_RGMII_TX_EN(gmac->id);
451 val |= NSS_COMMON_CLK_GATE_GMII_RX_EN(gmac->id) |
452 NSS_COMMON_CLK_GATE_GMII_TX_EN(gmac->id);
457 regmap_write(gmac->nss_common, NSS_COMMON_CLK_GATE, val);
459 if (gmac->phy_mode == PHY_INTERFACE_MODE_SGMII) {
460 err = ipq806x_gmac_configure_qsgmii_params(gmac);
464 err = ipq806x_gmac_configure_qsgmii_pcs_speed(gmac);
470 plat_dat->bsp_priv = gmac;
484 phy_modes(gmac->phy_mode));
494 { .compatible = "qcom,ipq806x-gmac" },
503 .name = "ipq806x-gmac-dwmac",