Merge "net: stmmac: cleanup and free the nodes and gpios setup in probe"

This commit is contained in:
qctecmdr 2021-05-05 01:22:07 -07:00 • committed by Gerrit - the friendly Code Review server
commit becb6bbf79
3 changed files with 42 additions and 0 deletions

View file

@ -1522,6 +1522,20 @@ fail:
return -ENOMEM;
}
static int ethqos_cleanup_debugfs(struct qcom_ethqos *ethqos)
{
if (!ethqos) {
ETHQOSERR("Null Param");
return -ENODEV;
}
debugfs_remove_recursive(ethqos->debugfs_dir);
ethqos->debugfs_dir = NULL;
ETHQOSDBG("debugfs Deleted Successfully");
return 0;
}
static int qcom_ethqos_probe(struct platform_device *pdev)
{
struct device_node *np = pdev->dev.of_node;
@ -1704,6 +1718,11 @@ static int qcom_ethqos_remove(struct platform_device *pdev)
struct qcom_ethqos *ethqos;
int ret;
if (of_device_is_compatible(pdev->dev.of_node, "qcom,emac-smmu-embedded")) {
of_platform_depopulate(&pdev->dev);
return 0;
}
ethqos = get_stmmac_bsp_priv(&pdev->dev);
if (!ethqos)
return -ENODEV;
@ -1717,9 +1736,17 @@ static int qcom_ethqos_remove(struct platform_device *pdev)
if (phy_intr_en)
cancel_work_sync(&ethqos->emac_phy_work);
if (ethqos->emac_ver == EMAC_HW_v2_3_2_RG)
ethqos_remove_pps_dev(ethqos);
ethqos_cleanup_debugfs(ethqos);
ethqos_free_gpios(ethqos);
emac_emb_smmu_exit();
ethqos_disable_regulators(ethqos);
platform_set_drvdata(pdev, NULL);
of_platform_depopulate(&pdev->dev);
return ret;
}

View file

@ -247,6 +247,7 @@ int create_pps_interrupt_device_node(dev_t *pps_dev_t,
struct cdev **pps_cdev,
struct class **pps_class,
char *pps_dev_node_name);
int ethqos_remove_pps_dev(struct qcom_ethqos *ethqos);
bool qcom_ethqos_is_phy_link_up(struct qcom_ethqos *ethqos);
void *qcom_ethqos_get_priv(struct qcom_ethqos *ethqos);

View file

@ -453,3 +453,17 @@ fail_alloc_cdev:
alloc_chrdev1_region_fail:
return ret;
}
int ethqos_remove_pps_dev(struct qcom_ethqos *ethqos)
{
device_destroy(ethqos->avb_class_a_class, ethqos->avb_class_a_dev_t);
class_destroy(ethqos->avb_class_a_class);
cdev_del(ethqos->avb_class_a_cdev);
unregister_chrdev_region(ethqos->avb_class_a_dev_t, 1);
device_destroy(ethqos->avb_class_b_class, ethqos->avb_class_b_dev_t);
class_destroy(ethqos->avb_class_b_class);
cdev_del(ethqos->avb_class_b_cdev);
unregister_chrdev_region(ethqos->avb_class_b_dev_t, 1);
return 0;
}