Lines Matching refs:ethqos
97 static int rgmii_readl(struct qcom_ethqos *ethqos, unsigned int offset) in rgmii_readl() argument
99 return readl(ethqos->rgmii_base + offset); in rgmii_readl()
102 static void rgmii_writel(struct qcom_ethqos *ethqos, in rgmii_writel() argument
105 writel(value, ethqos->rgmii_base + offset); in rgmii_writel()
108 static void rgmii_updatel(struct qcom_ethqos *ethqos, in rgmii_updatel() argument
113 temp = rgmii_readl(ethqos, offset); in rgmii_updatel()
115 rgmii_writel(ethqos, temp, offset); in rgmii_updatel()
120 struct qcom_ethqos *ethqos = priv; in rgmii_dump() local
122 dev_dbg(ðqos->pdev->dev, "Rgmii register dump\n"); in rgmii_dump()
123 dev_dbg(ðqos->pdev->dev, "RGMII_IO_MACRO_CONFIG: %x\n", in rgmii_dump()
124 rgmii_readl(ethqos, RGMII_IO_MACRO_CONFIG)); in rgmii_dump()
125 dev_dbg(ðqos->pdev->dev, "SDCC_HC_REG_DLL_CONFIG: %x\n", in rgmii_dump()
126 rgmii_readl(ethqos, SDCC_HC_REG_DLL_CONFIG)); in rgmii_dump()
127 dev_dbg(ðqos->pdev->dev, "SDCC_HC_REG_DDR_CONFIG: %x\n", in rgmii_dump()
128 rgmii_readl(ethqos, SDCC_HC_REG_DDR_CONFIG)); in rgmii_dump()
129 dev_dbg(ðqos->pdev->dev, "SDCC_HC_REG_DLL_CONFIG2: %x\n", in rgmii_dump()
130 rgmii_readl(ethqos, SDCC_HC_REG_DLL_CONFIG2)); in rgmii_dump()
131 dev_dbg(ðqos->pdev->dev, "SDC4_STATUS: %x\n", in rgmii_dump()
132 rgmii_readl(ethqos, SDC4_STATUS)); in rgmii_dump()
133 dev_dbg(ðqos->pdev->dev, "SDCC_USR_CTL: %x\n", in rgmii_dump()
134 rgmii_readl(ethqos, SDCC_USR_CTL)); in rgmii_dump()
135 dev_dbg(ðqos->pdev->dev, "RGMII_IO_MACRO_CONFIG2: %x\n", in rgmii_dump()
136 rgmii_readl(ethqos, RGMII_IO_MACRO_CONFIG2)); in rgmii_dump()
137 dev_dbg(ðqos->pdev->dev, "RGMII_IO_MACRO_DEBUG1: %x\n", in rgmii_dump()
138 rgmii_readl(ethqos, RGMII_IO_MACRO_DEBUG1)); in rgmii_dump()
139 dev_dbg(ðqos->pdev->dev, "EMAC_SYSTEM_LOW_POWER_DEBUG: %x\n", in rgmii_dump()
140 rgmii_readl(ethqos, EMAC_SYSTEM_LOW_POWER_DEBUG)); in rgmii_dump()
149 ethqos_update_rgmii_clk(struct qcom_ethqos *ethqos, unsigned int speed) in ethqos_update_rgmii_clk() argument
153 ethqos->rgmii_clk_rate = RGMII_1000_NOM_CLK_FREQ; in ethqos_update_rgmii_clk()
157 ethqos->rgmii_clk_rate = RGMII_ID_MODE_100_LOW_SVS_CLK_FREQ; in ethqos_update_rgmii_clk()
161 ethqos->rgmii_clk_rate = RGMII_ID_MODE_10_LOW_SVS_CLK_FREQ; in ethqos_update_rgmii_clk()
165 clk_set_rate(ethqos->rgmii_clk, ethqos->rgmii_clk_rate); in ethqos_update_rgmii_clk()
168 static void ethqos_set_func_clk_en(struct qcom_ethqos *ethqos) in ethqos_set_func_clk_en() argument
170 rgmii_updatel(ethqos, RGMII_CONFIG_FUNC_CLK_EN, in ethqos_set_func_clk_en()
204 static int ethqos_dll_configure(struct qcom_ethqos *ethqos) in ethqos_dll_configure() argument
210 rgmii_updatel(ethqos, SDCC_DLL_CONFIG_CDR_EN, in ethqos_dll_configure()
214 rgmii_updatel(ethqos, SDCC_DLL_CONFIG_CDR_EXT_EN, in ethqos_dll_configure()
218 rgmii_updatel(ethqos, SDCC_DLL_CONFIG_CK_OUT_EN, in ethqos_dll_configure()
222 rgmii_updatel(ethqos, SDCC_DLL_CONFIG_DLL_EN, in ethqos_dll_configure()
225 rgmii_updatel(ethqos, SDCC_DLL_MCLK_GATING_EN, in ethqos_dll_configure()
228 rgmii_updatel(ethqos, SDCC_DLL_CDR_FINE_PHASE, in ethqos_dll_configure()
233 val = rgmii_readl(ethqos, SDCC_HC_REG_DLL_CONFIG); in ethqos_dll_configure()
241 dev_err(ðqos->pdev->dev, "Clear CK_OUT_EN timedout\n"); in ethqos_dll_configure()
244 rgmii_updatel(ethqos, SDCC_DLL_CONFIG_CK_OUT_EN, in ethqos_dll_configure()
250 val = rgmii_readl(ethqos, SDCC_HC_REG_DLL_CONFIG); in ethqos_dll_configure()
258 dev_err(ðqos->pdev->dev, "Set CK_OUT_EN timedout\n"); in ethqos_dll_configure()
261 rgmii_updatel(ethqos, SDCC_DLL_CONFIG2_DDR_CAL_EN, in ethqos_dll_configure()
264 rgmii_updatel(ethqos, SDCC_DLL_CONFIG2_DLL_CLOCK_DIS, in ethqos_dll_configure()
267 rgmii_updatel(ethqos, SDCC_DLL_CONFIG2_MCLK_FREQ_CALC, in ethqos_dll_configure()
270 rgmii_updatel(ethqos, SDCC_DLL_CONFIG2_DDR_TRAFFIC_INIT_SEL, in ethqos_dll_configure()
273 rgmii_updatel(ethqos, SDCC_DLL_CONFIG2_DDR_TRAFFIC_INIT_SW, in ethqos_dll_configure()
280 static int ethqos_rgmii_macro_init(struct qcom_ethqos *ethqos) in ethqos_rgmii_macro_init() argument
283 rgmii_updatel(ethqos, RGMII_CONFIG2_TX_TO_RX_LOOPBACK_EN, in ethqos_rgmii_macro_init()
287 rgmii_updatel(ethqos, RGMII_CONFIG_INTF_SEL, in ethqos_rgmii_macro_init()
290 switch (ethqos->speed) { in ethqos_rgmii_macro_init()
292 rgmii_updatel(ethqos, RGMII_CONFIG_DDR_MODE, in ethqos_rgmii_macro_init()
294 rgmii_updatel(ethqos, RGMII_CONFIG_BYPASS_TX_ID_EN, in ethqos_rgmii_macro_init()
296 rgmii_updatel(ethqos, RGMII_CONFIG_POS_NEG_DATA_SEL, in ethqos_rgmii_macro_init()
299 rgmii_updatel(ethqos, RGMII_CONFIG_PROG_SWAP, in ethqos_rgmii_macro_init()
301 rgmii_updatel(ethqos, RGMII_CONFIG2_DATA_DIVIDE_CLK_SEL, in ethqos_rgmii_macro_init()
303 rgmii_updatel(ethqos, RGMII_CONFIG2_TX_CLK_PHASE_SHIFT_EN, in ethqos_rgmii_macro_init()
306 rgmii_updatel(ethqos, RGMII_CONFIG2_RSVD_CONFIG15, in ethqos_rgmii_macro_init()
308 rgmii_updatel(ethqos, RGMII_CONFIG2_RX_PROG_SWAP, in ethqos_rgmii_macro_init()
313 rgmii_updatel(ethqos, SDCC_DDR_CONFIG_PRG_RCLK_DLY, in ethqos_rgmii_macro_init()
315 rgmii_updatel(ethqos, SDCC_DDR_CONFIG_PRG_DLY_EN, in ethqos_rgmii_macro_init()
318 if (ethqos->rgmii_config_looback_en) in ethqos_rgmii_macro_init()
319 rgmii_updatel(ethqos, RGMII_CONFIG_LOOPBACK_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()
341 rgmii_updatel(ethqos, RGMII_CONFIG_MAX_SPD_PRG_2, 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 if (ethqos->rgmii_config_looback_en) in ethqos_rgmii_macro_init()
357 rgmii_updatel(ethqos, RGMII_CONFIG_LOOPBACK_EN, in ethqos_rgmii_macro_init()
360 rgmii_updatel(ethqos, RGMII_CONFIG_LOOPBACK_EN, in ethqos_rgmii_macro_init()
366 rgmii_updatel(ethqos, RGMII_CONFIG_DDR_MODE, in ethqos_rgmii_macro_init()
368 rgmii_updatel(ethqos, RGMII_CONFIG_BYPASS_TX_ID_EN, in ethqos_rgmii_macro_init()
371 rgmii_updatel(ethqos, RGMII_CONFIG_POS_NEG_DATA_SEL, in ethqos_rgmii_macro_init()
373 rgmii_updatel(ethqos, RGMII_CONFIG_PROG_SWAP, in ethqos_rgmii_macro_init()
375 rgmii_updatel(ethqos, RGMII_CONFIG2_DATA_DIVIDE_CLK_SEL, in ethqos_rgmii_macro_init()
377 rgmii_updatel(ethqos, RGMII_CONFIG2_TX_CLK_PHASE_SHIFT_EN, in ethqos_rgmii_macro_init()
379 rgmii_updatel(ethqos, RGMII_CONFIG_MAX_SPD_PRG_9, in ethqos_rgmii_macro_init()
382 rgmii_updatel(ethqos, RGMII_CONFIG2_RSVD_CONFIG15, in ethqos_rgmii_macro_init()
384 rgmii_updatel(ethqos, RGMII_CONFIG2_RX_PROG_SWAP, in ethqos_rgmii_macro_init()
387 rgmii_updatel(ethqos, SDCC_DDR_CONFIG_EXT_PRG_RCLK_DLY_CODE, in ethqos_rgmii_macro_init()
389 rgmii_updatel(ethqos, SDCC_DDR_CONFIG_EXT_PRG_RCLK_DLY, in ethqos_rgmii_macro_init()
392 rgmii_updatel(ethqos, SDCC_DDR_CONFIG_EXT_PRG_RCLK_DLY_EN, in ethqos_rgmii_macro_init()
395 rgmii_updatel(ethqos, RGMII_CONFIG_LOOPBACK_EN, in ethqos_rgmii_macro_init()
399 dev_err(ðqos->pdev->dev, in ethqos_rgmii_macro_init()
400 "Invalid speed %d\n", ethqos->speed); in ethqos_rgmii_macro_init()
407 static int ethqos_configure(struct qcom_ethqos *ethqos) in ethqos_configure() argument
413 for (i = 0; i < ethqos->num_por; i++) in ethqos_configure()
414 rgmii_writel(ethqos, ethqos->por[i].value, in ethqos_configure()
415 ethqos->por[i].offset); in ethqos_configure()
416 ethqos_set_func_clk_en(ethqos); in ethqos_configure()
421 rgmii_updatel(ethqos, SDCC_DLL_CONFIG_DLL_RST, in ethqos_configure()
425 rgmii_updatel(ethqos, SDCC_DLL_CONFIG_PDN, in ethqos_configure()
429 rgmii_updatel(ethqos, SDCC_DLL_CONFIG_DLL_RST, 0, in ethqos_configure()
433 rgmii_updatel(ethqos, SDCC_DLL_CONFIG_PDN, 0, in ethqos_configure()
436 if (ethqos->speed != SPEED_100 && ethqos->speed != SPEED_10) { in ethqos_configure()
438 rgmii_updatel(ethqos, SDCC_DLL_CONFIG_DLL_EN, in ethqos_configure()
442 rgmii_updatel(ethqos, SDCC_DLL_CONFIG_CK_OUT_EN, in ethqos_configure()
447 rgmii_updatel(ethqos, GENMASK(26, 24), BIT(26), SDCC_USR_CTL); in ethqos_configure()
452 dll_lock = rgmii_readl(ethqos, SDC4_STATUS); in ethqos_configure()
458 dev_err(ðqos->pdev->dev, in ethqos_configure()
462 if (ethqos->speed == SPEED_1000) in ethqos_configure()
463 ethqos_dll_configure(ethqos); in ethqos_configure()
465 ethqos_rgmii_macro_init(ethqos); in ethqos_configure()
472 struct qcom_ethqos *ethqos = priv; in ethqos_fix_mac_speed() local
474 ethqos->speed = speed; in ethqos_fix_mac_speed()
475 ethqos_update_rgmii_clk(ethqos, speed); in ethqos_fix_mac_speed()
476 ethqos_configure(ethqos); in ethqos_fix_mac_speed()
481 struct qcom_ethqos *ethqos = priv; in ethqos_clks_config() local
485 ret = clk_prepare_enable(ethqos->rgmii_clk); in ethqos_clks_config()
487 dev_err(ðqos->pdev->dev, "rgmii_clk enable failed\n"); in ethqos_clks_config()
496 ethqos_set_func_clk_en(ethqos); in ethqos_clks_config()
498 clk_disable_unprepare(ethqos->rgmii_clk); in ethqos_clks_config()
510 struct qcom_ethqos *ethqos; in qcom_ethqos_probe() local
525 ethqos = devm_kzalloc(&pdev->dev, sizeof(*ethqos), GFP_KERNEL); in qcom_ethqos_probe()
526 if (!ethqos) { in qcom_ethqos_probe()
531 ethqos->pdev = pdev; in qcom_ethqos_probe()
532 ethqos->rgmii_base = devm_platform_ioremap_resource_byname(pdev, "rgmii"); in qcom_ethqos_probe()
533 if (IS_ERR(ethqos->rgmii_base)) { in qcom_ethqos_probe()
534 ret = PTR_ERR(ethqos->rgmii_base); in qcom_ethqos_probe()
539 ethqos->por = data->por; in qcom_ethqos_probe()
540 ethqos->num_por = data->num_por; in qcom_ethqos_probe()
541 ethqos->rgmii_config_looback_en = data->rgmii_config_looback_en; in qcom_ethqos_probe()
543 ethqos->rgmii_clk = devm_clk_get(&pdev->dev, "rgmii"); in qcom_ethqos_probe()
544 if (IS_ERR(ethqos->rgmii_clk)) { in qcom_ethqos_probe()
545 ret = PTR_ERR(ethqos->rgmii_clk); in qcom_ethqos_probe()
549 ret = ethqos_clks_config(ethqos, true); in qcom_ethqos_probe()
553 ethqos->speed = SPEED_1000; in qcom_ethqos_probe()
554 ethqos_update_rgmii_clk(ethqos, SPEED_1000); in qcom_ethqos_probe()
555 ethqos_set_func_clk_en(ethqos); in qcom_ethqos_probe()
557 plat_dat->bsp_priv = ethqos; in qcom_ethqos_probe()
571 ethqos_clks_config(ethqos, false); in qcom_ethqos_probe()
581 struct qcom_ethqos *ethqos; in qcom_ethqos_remove() local
584 ethqos = get_stmmac_bsp_priv(&pdev->dev); in qcom_ethqos_remove()
585 if (!ethqos) in qcom_ethqos_remove()
589 ethqos_clks_config(ethqos, false); in qcom_ethqos_remove()