Lines Matching defs:gmac
93 static int get_clk_div_sgmii(struct ipq806x_gmac *gmac, unsigned int speed)
95 struct device *dev = &gmac->pdev->dev;
119 static int get_clk_div_rgmii(struct ipq806x_gmac *gmac, unsigned int speed)
121 struct device *dev = &gmac->pdev->dev;
145 static int ipq806x_gmac_set_speed(struct ipq806x_gmac *gmac, unsigned int speed)
150 switch (gmac->phy_mode) {
152 div = get_clk_div_rgmii(gmac, speed);
153 clk_bits = NSS_COMMON_CLK_GATE_RGMII_RX_EN(gmac->id) |
154 NSS_COMMON_CLK_GATE_RGMII_TX_EN(gmac->id);
158 div = get_clk_div_sgmii(gmac, speed);
159 clk_bits = NSS_COMMON_CLK_GATE_GMII_RX_EN(gmac->id) |
160 NSS_COMMON_CLK_GATE_GMII_TX_EN(gmac->id);
164 dev_err(&gmac->pdev->dev, "Unsupported PHY mode: \"%s\"\n",
165 phy_modes(gmac->phy_mode));
170 regmap_read(gmac->nss_common, NSS_COMMON_CLK_GATE, &val);
172 regmap_write(gmac->nss_common, NSS_COMMON_CLK_GATE, val);
175 regmap_read(gmac->nss_common, NSS_COMMON_CLK_DIV0, &val);
177 << NSS_COMMON_CLK_DIV_OFFSET(gmac->id));
178 val |= div << NSS_COMMON_CLK_DIV_OFFSET(gmac->id);
179 regmap_write(gmac->nss_common, NSS_COMMON_CLK_DIV0, val);
182 regmap_read(gmac->nss_common, NSS_COMMON_CLK_GATE, &val);
184 regmap_write(gmac->nss_common, NSS_COMMON_CLK_GATE, val);
189 static int ipq806x_gmac_of_parse(struct ipq806x_gmac *gmac)
191 struct device *dev = &gmac->pdev->dev;
194 ret = of_get_phy_mode(dev->of_node, &gmac->phy_mode);
200 if (of_property_read_u32(dev->of_node, "qcom,id", &gmac->id) < 0) {
209 if (gmac->id > 3) {
210 dev_err(dev, "invalid gmac id\n");
214 gmac->core_clk = devm_clk_get(dev, "stmmaceth");
215 if (IS_ERR(gmac->core_clk)) {
217 return PTR_ERR(gmac->core_clk);
219 clk_set_rate(gmac->core_clk, 266000000);
222 gmac->nss_common = syscon_regmap_lookup_by_phandle(dev->of_node,
224 if (IS_ERR(gmac->nss_common)) {
226 return PTR_ERR(gmac->nss_common);
230 gmac->qsgmii_csr = syscon_regmap_lookup_by_phandle(dev->of_node,
232 if (IS_ERR(gmac->qsgmii_csr))
235 return PTR_ERR_OR_ZERO(gmac->qsgmii_csr);
240 struct ipq806x_gmac *gmac = priv;
242 ipq806x_gmac_set_speed(gmac, speed);
250 struct ipq806x_gmac *gmac;
262 gmac = devm_kzalloc(dev, sizeof(*gmac), GFP_KERNEL);
263 if (!gmac) {
268 gmac->pdev = pdev;
270 err = ipq806x_gmac_of_parse(gmac);
276 regmap_write(gmac->qsgmii_csr, QSGMII_PCS_CAL_LCKDT_CTL,
284 switch (gmac->phy_mode) {
294 regmap_write(gmac->nss_common, NSS_COMMON_GMAC_CTL(gmac->id), val);
297 regmap_read(gmac->nss_common, NSS_COMMON_CLK_SRC_CTRL, &val);
298 val &= ~(1 << NSS_COMMON_CLK_SRC_CTRL_OFFSET(gmac->id));
299 switch (gmac->phy_mode) {
301 val |= NSS_COMMON_CLK_SRC_CTRL_RGMII(gmac->id) <<
302 NSS_COMMON_CLK_SRC_CTRL_OFFSET(gmac->id);
305 val |= NSS_COMMON_CLK_SRC_CTRL_SGMII(gmac->id) <<
306 NSS_COMMON_CLK_SRC_CTRL_OFFSET(gmac->id);
311 regmap_write(gmac->nss_common, NSS_COMMON_CLK_SRC_CTRL, val);
314 regmap_read(gmac->nss_common, NSS_COMMON_CLK_GATE, &val);
315 val |= NSS_COMMON_CLK_GATE_PTP_EN(gmac->id);
316 switch (gmac->phy_mode) {
318 val |= NSS_COMMON_CLK_GATE_RGMII_RX_EN(gmac->id) |
319 NSS_COMMON_CLK_GATE_RGMII_TX_EN(gmac->id);
322 val |= NSS_COMMON_CLK_GATE_GMII_RX_EN(gmac->id) |
323 NSS_COMMON_CLK_GATE_GMII_TX_EN(gmac->id);
328 regmap_write(gmac->nss_common, NSS_COMMON_CLK_GATE, val);
330 if (gmac->phy_mode == PHY_INTERFACE_MODE_SGMII) {
331 regmap_write(gmac->qsgmii_csr, QSGMII_PHY_SGMII_CTL(gmac->id),
345 plat_dat->bsp_priv = gmac;
359 phy_modes(gmac->phy_mode));
369 { .compatible = "qcom,ipq806x-gmac" },
378 .name = "ipq806x-gmac-dwmac",