Lines Matching refs:ethqos

90 static int rgmii_readl(struct qcom_ethqos *ethqos, unsigned int offset)  in rgmii_readl()  argument
92 return readl(ethqos->rgmii_base + offset); in rgmii_readl()
95 static void rgmii_writel(struct qcom_ethqos *ethqos, in rgmii_writel() argument
98 writel(value, ethqos->rgmii_base + offset); in rgmii_writel()
101 static void rgmii_updatel(struct qcom_ethqos *ethqos, in rgmii_updatel() argument
106 temp = rgmii_readl(ethqos, offset); in rgmii_updatel()
108 rgmii_writel(ethqos, temp, offset); in rgmii_updatel()
111 static void rgmii_dump(struct qcom_ethqos *ethqos) in rgmii_dump() argument
113 dev_dbg(&ethqos->pdev->dev, "Rgmii register dump\n"); in rgmii_dump()
114 dev_dbg(&ethqos->pdev->dev, "RGMII_IO_MACRO_CONFIG: %x\n", in rgmii_dump()
115 rgmii_readl(ethqos, RGMII_IO_MACRO_CONFIG)); in rgmii_dump()
116 dev_dbg(&ethqos->pdev->dev, "SDCC_HC_REG_DLL_CONFIG: %x\n", in rgmii_dump()
117 rgmii_readl(ethqos, SDCC_HC_REG_DLL_CONFIG)); in rgmii_dump()
118 dev_dbg(&ethqos->pdev->dev, "SDCC_HC_REG_DDR_CONFIG: %x\n", in rgmii_dump()
119 rgmii_readl(ethqos, SDCC_HC_REG_DDR_CONFIG)); in rgmii_dump()
120 dev_dbg(&ethqos->pdev->dev, "SDCC_HC_REG_DLL_CONFIG2: %x\n", in rgmii_dump()
121 rgmii_readl(ethqos, SDCC_HC_REG_DLL_CONFIG2)); in rgmii_dump()
122 dev_dbg(&ethqos->pdev->dev, "SDC4_STATUS: %x\n", in rgmii_dump()
123 rgmii_readl(ethqos, SDC4_STATUS)); in rgmii_dump()
124 dev_dbg(&ethqos->pdev->dev, "SDCC_USR_CTL: %x\n", in rgmii_dump()
125 rgmii_readl(ethqos, SDCC_USR_CTL)); in rgmii_dump()
126 dev_dbg(&ethqos->pdev->dev, "RGMII_IO_MACRO_CONFIG2: %x\n", in rgmii_dump()
127 rgmii_readl(ethqos, RGMII_IO_MACRO_CONFIG2)); in rgmii_dump()
128 dev_dbg(&ethqos->pdev->dev, "RGMII_IO_MACRO_DEBUG1: %x\n", in rgmii_dump()
129 rgmii_readl(ethqos, RGMII_IO_MACRO_DEBUG1)); in rgmii_dump()
130 dev_dbg(&ethqos->pdev->dev, "EMAC_SYSTEM_LOW_POWER_DEBUG: %x\n", in rgmii_dump()
131 rgmii_readl(ethqos, EMAC_SYSTEM_LOW_POWER_DEBUG)); in rgmii_dump()
140 ethqos_update_rgmii_clk(struct qcom_ethqos *ethqos, unsigned int speed) in ethqos_update_rgmii_clk() argument
144 ethqos->rgmii_clk_rate = RGMII_1000_NOM_CLK_FREQ; in ethqos_update_rgmii_clk()
148 ethqos->rgmii_clk_rate = RGMII_ID_MODE_100_LOW_SVS_CLK_FREQ; in ethqos_update_rgmii_clk()
152 ethqos->rgmii_clk_rate = RGMII_ID_MODE_10_LOW_SVS_CLK_FREQ; in ethqos_update_rgmii_clk()
156 clk_set_rate(ethqos->rgmii_clk, ethqos->rgmii_clk_rate); in ethqos_update_rgmii_clk()
159 static void ethqos_set_func_clk_en(struct qcom_ethqos *ethqos) in ethqos_set_func_clk_en() argument
161 rgmii_updatel(ethqos, RGMII_CONFIG_FUNC_CLK_EN, in ethqos_set_func_clk_en()
174 static int ethqos_dll_configure(struct qcom_ethqos *ethqos) in ethqos_dll_configure() argument
180 rgmii_updatel(ethqos, SDCC_DLL_CONFIG_CDR_EN, in ethqos_dll_configure()
184 rgmii_updatel(ethqos, SDCC_DLL_CONFIG_CDR_EXT_EN, in ethqos_dll_configure()
188 rgmii_updatel(ethqos, SDCC_DLL_CONFIG_CK_OUT_EN, in ethqos_dll_configure()
192 rgmii_updatel(ethqos, SDCC_DLL_CONFIG_DLL_EN, in ethqos_dll_configure()
195 rgmii_updatel(ethqos, SDCC_DLL_MCLK_GATING_EN, in ethqos_dll_configure()
198 rgmii_updatel(ethqos, SDCC_DLL_CDR_FINE_PHASE, in ethqos_dll_configure()
203 val = rgmii_readl(ethqos, SDCC_HC_REG_DLL_CONFIG); in ethqos_dll_configure()
211 dev_err(&ethqos->pdev->dev, "Clear CK_OUT_EN timedout\n"); in ethqos_dll_configure()
214 rgmii_updatel(ethqos, SDCC_DLL_CONFIG_CK_OUT_EN, in ethqos_dll_configure()
220 val = rgmii_readl(ethqos, SDCC_HC_REG_DLL_CONFIG); in ethqos_dll_configure()
228 dev_err(&ethqos->pdev->dev, "Set CK_OUT_EN timedout\n"); in ethqos_dll_configure()
231 rgmii_updatel(ethqos, SDCC_DLL_CONFIG2_DDR_CAL_EN, in ethqos_dll_configure()
234 rgmii_updatel(ethqos, SDCC_DLL_CONFIG2_DLL_CLOCK_DIS, in ethqos_dll_configure()
237 rgmii_updatel(ethqos, SDCC_DLL_CONFIG2_MCLK_FREQ_CALC, in ethqos_dll_configure()
240 rgmii_updatel(ethqos, SDCC_DLL_CONFIG2_DDR_TRAFFIC_INIT_SEL, in ethqos_dll_configure()
243 rgmii_updatel(ethqos, SDCC_DLL_CONFIG2_DDR_TRAFFIC_INIT_SW, in ethqos_dll_configure()
250 static int ethqos_rgmii_macro_init(struct qcom_ethqos *ethqos) in ethqos_rgmii_macro_init() argument
253 rgmii_updatel(ethqos, RGMII_CONFIG2_TX_TO_RX_LOOPBACK_EN, in ethqos_rgmii_macro_init()
257 rgmii_updatel(ethqos, RGMII_CONFIG_INTF_SEL, in ethqos_rgmii_macro_init()
260 switch (ethqos->speed) { in ethqos_rgmii_macro_init()
262 rgmii_updatel(ethqos, RGMII_CONFIG_DDR_MODE, in ethqos_rgmii_macro_init()
264 rgmii_updatel(ethqos, RGMII_CONFIG_BYPASS_TX_ID_EN, in ethqos_rgmii_macro_init()
266 rgmii_updatel(ethqos, RGMII_CONFIG_POS_NEG_DATA_SEL, in ethqos_rgmii_macro_init()
269 rgmii_updatel(ethqos, RGMII_CONFIG_PROG_SWAP, in ethqos_rgmii_macro_init()
271 rgmii_updatel(ethqos, RGMII_CONFIG2_DATA_DIVIDE_CLK_SEL, in ethqos_rgmii_macro_init()
273 rgmii_updatel(ethqos, RGMII_CONFIG2_TX_CLK_PHASE_SHIFT_EN, in ethqos_rgmii_macro_init()
276 rgmii_updatel(ethqos, RGMII_CONFIG2_RSVD_CONFIG15, in ethqos_rgmii_macro_init()
278 rgmii_updatel(ethqos, RGMII_CONFIG2_RX_PROG_SWAP, in ethqos_rgmii_macro_init()
283 rgmii_updatel(ethqos, SDCC_DDR_CONFIG_PRG_RCLK_DLY, in ethqos_rgmii_macro_init()
285 rgmii_updatel(ethqos, SDCC_DDR_CONFIG_PRG_DLY_EN, in ethqos_rgmii_macro_init()
288 rgmii_updatel(ethqos, RGMII_CONFIG_LOOPBACK_EN, in ethqos_rgmii_macro_init()
293 rgmii_updatel(ethqos, RGMII_CONFIG_DDR_MODE, in ethqos_rgmii_macro_init()
295 rgmii_updatel(ethqos, RGMII_CONFIG_BYPASS_TX_ID_EN, in ethqos_rgmii_macro_init()
298 rgmii_updatel(ethqos, RGMII_CONFIG_POS_NEG_DATA_SEL, in ethqos_rgmii_macro_init()
300 rgmii_updatel(ethqos, RGMII_CONFIG_PROG_SWAP, in ethqos_rgmii_macro_init()
302 rgmii_updatel(ethqos, RGMII_CONFIG2_DATA_DIVIDE_CLK_SEL, in ethqos_rgmii_macro_init()
304 rgmii_updatel(ethqos, RGMII_CONFIG2_TX_CLK_PHASE_SHIFT_EN, in ethqos_rgmii_macro_init()
307 rgmii_updatel(ethqos, RGMII_CONFIG_MAX_SPD_PRG_2, in ethqos_rgmii_macro_init()
309 rgmii_updatel(ethqos, RGMII_CONFIG2_RSVD_CONFIG15, in ethqos_rgmii_macro_init()
311 rgmii_updatel(ethqos, RGMII_CONFIG2_RX_PROG_SWAP, in ethqos_rgmii_macro_init()
314 rgmii_updatel(ethqos, SDCC_DDR_CONFIG_EXT_PRG_RCLK_DLY_CODE, in ethqos_rgmii_macro_init()
316 rgmii_updatel(ethqos, SDCC_DDR_CONFIG_EXT_PRG_RCLK_DLY, in ethqos_rgmii_macro_init()
319 rgmii_updatel(ethqos, SDCC_DDR_CONFIG_EXT_PRG_RCLK_DLY_EN, in ethqos_rgmii_macro_init()
322 rgmii_updatel(ethqos, RGMII_CONFIG_LOOPBACK_EN, in ethqos_rgmii_macro_init()
327 rgmii_updatel(ethqos, RGMII_CONFIG_DDR_MODE, in ethqos_rgmii_macro_init()
329 rgmii_updatel(ethqos, RGMII_CONFIG_BYPASS_TX_ID_EN, in ethqos_rgmii_macro_init()
332 rgmii_updatel(ethqos, RGMII_CONFIG_POS_NEG_DATA_SEL, in ethqos_rgmii_macro_init()
334 rgmii_updatel(ethqos, RGMII_CONFIG_PROG_SWAP, in ethqos_rgmii_macro_init()
336 rgmii_updatel(ethqos, RGMII_CONFIG2_DATA_DIVIDE_CLK_SEL, in ethqos_rgmii_macro_init()
338 rgmii_updatel(ethqos, RGMII_CONFIG2_TX_CLK_PHASE_SHIFT_EN, in ethqos_rgmii_macro_init()
340 rgmii_updatel(ethqos, RGMII_CONFIG_MAX_SPD_PRG_9, in ethqos_rgmii_macro_init()
343 rgmii_updatel(ethqos, RGMII_CONFIG2_RSVD_CONFIG15, in ethqos_rgmii_macro_init()
345 rgmii_updatel(ethqos, RGMII_CONFIG2_RX_PROG_SWAP, in ethqos_rgmii_macro_init()
348 rgmii_updatel(ethqos, SDCC_DDR_CONFIG_EXT_PRG_RCLK_DLY_CODE, in ethqos_rgmii_macro_init()
350 rgmii_updatel(ethqos, SDCC_DDR_CONFIG_EXT_PRG_RCLK_DLY, in ethqos_rgmii_macro_init()
353 rgmii_updatel(ethqos, SDCC_DDR_CONFIG_EXT_PRG_RCLK_DLY_EN, in ethqos_rgmii_macro_init()
356 rgmii_updatel(ethqos, RGMII_CONFIG_LOOPBACK_EN, in ethqos_rgmii_macro_init()
360 dev_err(&ethqos->pdev->dev, in ethqos_rgmii_macro_init()
361 "Invalid speed %d\n", ethqos->speed); in ethqos_rgmii_macro_init()
368 static int ethqos_configure(struct qcom_ethqos *ethqos) in ethqos_configure() argument
374 for (i = 0; i < ethqos->num_por; i++) in ethqos_configure()
375 rgmii_writel(ethqos, ethqos->por[i].value, in ethqos_configure()
376 ethqos->por[i].offset); in ethqos_configure()
377 ethqos_set_func_clk_en(ethqos); in ethqos_configure()
382 rgmii_updatel(ethqos, SDCC_DLL_CONFIG_DLL_RST, in ethqos_configure()
386 rgmii_updatel(ethqos, SDCC_DLL_CONFIG_PDN, in ethqos_configure()
390 rgmii_updatel(ethqos, SDCC_DLL_CONFIG_DLL_RST, 0, in ethqos_configure()
394 rgmii_updatel(ethqos, SDCC_DLL_CONFIG_PDN, 0, in ethqos_configure()
397 if (ethqos->speed != SPEED_100 && ethqos->speed != SPEED_10) { in ethqos_configure()
399 rgmii_updatel(ethqos, SDCC_DLL_CONFIG_DLL_EN, in ethqos_configure()
403 rgmii_updatel(ethqos, SDCC_DLL_CONFIG_CK_OUT_EN, in ethqos_configure()
408 rgmii_updatel(ethqos, GENMASK(26, 24), BIT(26), SDCC_USR_CTL); in ethqos_configure()
413 dll_lock = rgmii_readl(ethqos, SDC4_STATUS); in ethqos_configure()
418 dev_err(&ethqos->pdev->dev, in ethqos_configure()
422 if (ethqos->speed == SPEED_1000) in ethqos_configure()
423 ethqos_dll_configure(ethqos); in ethqos_configure()
425 ethqos_rgmii_macro_init(ethqos); in ethqos_configure()
432 struct qcom_ethqos *ethqos = priv; in ethqos_fix_mac_speed() local
434 ethqos->speed = speed; in ethqos_fix_mac_speed()
435 ethqos_update_rgmii_clk(ethqos, speed); in ethqos_fix_mac_speed()
436 ethqos_configure(ethqos); in ethqos_fix_mac_speed()
444 struct qcom_ethqos *ethqos; in qcom_ethqos_probe() local
458 ethqos = devm_kzalloc(&pdev->dev, sizeof(*ethqos), GFP_KERNEL); in qcom_ethqos_probe()
459 if (!ethqos) { in qcom_ethqos_probe()
464 ethqos->pdev = pdev; in qcom_ethqos_probe()
466 ethqos->rgmii_base = devm_ioremap_resource(&pdev->dev, res); in qcom_ethqos_probe()
467 if (IS_ERR(ethqos->rgmii_base)) { in qcom_ethqos_probe()
469 ret = PTR_ERR(ethqos->rgmii_base); in qcom_ethqos_probe()
473 ethqos->por = of_device_get_match_data(&pdev->dev); in qcom_ethqos_probe()
475 ethqos->rgmii_clk = devm_clk_get(&pdev->dev, "rgmii"); in qcom_ethqos_probe()
476 if (IS_ERR(ethqos->rgmii_clk)) { in qcom_ethqos_probe()
477 ret = PTR_ERR(ethqos->rgmii_clk); in qcom_ethqos_probe()
481 ret = clk_prepare_enable(ethqos->rgmii_clk); in qcom_ethqos_probe()
485 ethqos->speed = SPEED_1000; in qcom_ethqos_probe()
486 ethqos_update_rgmii_clk(ethqos, SPEED_1000); in qcom_ethqos_probe()
487 ethqos_set_func_clk_en(ethqos); in qcom_ethqos_probe()
489 plat_dat->bsp_priv = ethqos; in qcom_ethqos_probe()
499 rgmii_dump(ethqos); in qcom_ethqos_probe()
504 clk_disable_unprepare(ethqos->rgmii_clk); in qcom_ethqos_probe()
514 struct qcom_ethqos *ethqos; in qcom_ethqos_remove() local
517 ethqos = get_stmmac_bsp_priv(&pdev->dev); in qcom_ethqos_remove()
518 if (!ethqos) in qcom_ethqos_remove()
522 clk_disable_unprepare(ethqos->rgmii_clk); in qcom_ethqos_remove()