Commit f280e89a authored by Mugunthan V N's avatar Mugunthan V N Committed by David S. Miller

drivers: net: cpsw: fix for cpsw crash when build as modules

When CPSW and Davinci MDIO are build as modules, CPSW crashes when
accessing CPSW registers in CPSW probe. The same is working in built-in
as the CPSW clocks are enabled in Davindi MDIO probe, SO Enabling the
clocks before accessing the version register and moving out the other
register access to cpsw device open.
Signed-off-by: default avatarMugunthan V N <mugunthanvnm@ti.com>
Signed-off-by: default avatarFelipe Balbi <balbi@ti.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent d9601a36
...@@ -1151,6 +1151,12 @@ static int cpsw_ndo_open(struct net_device *ndev) ...@@ -1151,6 +1151,12 @@ static int cpsw_ndo_open(struct net_device *ndev)
* receive descs * receive descs
*/ */
cpsw_info(priv, ifup, "submitted %d rx descriptors\n", i); cpsw_info(priv, ifup, "submitted %d rx descriptors\n", i);
if (cpts_register(&priv->pdev->dev, priv->cpts,
priv->data.cpts_clock_mult,
priv->data.cpts_clock_shift))
dev_err(priv->dev, "error registering cpts device\n");
} }
/* Enable Interrupt pacing if configured */ /* Enable Interrupt pacing if configured */
...@@ -1197,6 +1203,7 @@ static int cpsw_ndo_stop(struct net_device *ndev) ...@@ -1197,6 +1203,7 @@ static int cpsw_ndo_stop(struct net_device *ndev)
netif_carrier_off(priv->ndev); netif_carrier_off(priv->ndev);
if (cpsw_common_res_usage_state(priv) <= 1) { if (cpsw_common_res_usage_state(priv) <= 1) {
cpts_unregister(priv->cpts);
cpsw_intr_disable(priv); cpsw_intr_disable(priv);
cpdma_ctlr_int_ctrl(priv->dma, false); cpdma_ctlr_int_ctrl(priv->dma, false);
cpdma_ctlr_stop(priv->dma); cpdma_ctlr_stop(priv->dma);
...@@ -1985,9 +1992,15 @@ static int cpsw_probe(struct platform_device *pdev) ...@@ -1985,9 +1992,15 @@ static int cpsw_probe(struct platform_device *pdev)
goto clean_runtime_disable_ret; goto clean_runtime_disable_ret;
} }
priv->regs = ss_regs; priv->regs = ss_regs;
priv->version = __raw_readl(&priv->regs->id_ver);
priv->host_port = HOST_PORT_NUM; priv->host_port = HOST_PORT_NUM;
/* Need to enable clocks with runtime PM api to access module
* registers
*/
pm_runtime_get_sync(&pdev->dev);
priv->version = readl(&priv->regs->id_ver);
pm_runtime_put_sync(&pdev->dev);
res = platform_get_resource(pdev, IORESOURCE_MEM, 1); res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
priv->wr_regs = devm_ioremap_resource(&pdev->dev, res); priv->wr_regs = devm_ioremap_resource(&pdev->dev, res);
if (IS_ERR(priv->wr_regs)) { if (IS_ERR(priv->wr_regs)) {
...@@ -2157,8 +2170,6 @@ static int cpsw_remove(struct platform_device *pdev) ...@@ -2157,8 +2170,6 @@ static int cpsw_remove(struct platform_device *pdev)
unregister_netdev(cpsw_get_slave_ndev(priv, 1)); unregister_netdev(cpsw_get_slave_ndev(priv, 1));
unregister_netdev(ndev); unregister_netdev(ndev);
cpts_unregister(priv->cpts);
cpsw_ale_destroy(priv->ale); cpsw_ale_destroy(priv->ale);
cpdma_chan_destroy(priv->txch); cpdma_chan_destroy(priv->txch);
cpdma_chan_destroy(priv->rxch); cpdma_chan_destroy(priv->rxch);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment