SCT_ENTRY(LLCC_AUDHW,    22, 1024, 1, 1, 0xffc, 0x2,   0, 0, 1, 1, 0),
 };
 
+static int sdm845_qcom_llcc_remove(struct platform_device *pdev)
+{
+       return qcom_llcc_remove(pdev);
+}
+
 static int sdm845_qcom_llcc_probe(struct platform_device *pdev)
 {
        return qcom_llcc_probe(pdev, sdm845_data, ARRAY_SIZE(sdm845_data));
                .of_match_table = sdm845_qcom_llcc_of_match,
        },
        .probe = sdm845_qcom_llcc_probe,
+       .remove = sdm845_qcom_llcc_remove,
 };
 module_platform_driver(sdm845_qcom_llcc_driver);
 
 
 
 #define BANK_OFFSET_STRIDE           0x80000
 
-static struct llcc_drv_data *drv_data;
+static struct llcc_drv_data *drv_data = (void *) -EPROBE_DEFER;
 
 static const struct regmap_config llcc_regmap_config = {
        .reg_bits = 32,
        struct llcc_slice_desc *desc;
        u32 sz, count;
 
+       if (IS_ERR(drv_data))
+               return ERR_CAST(drv_data);
+
        cfg = drv_data->cfg;
        sz = drv_data->cfg_size;
 
        u32 slice_status;
        int ret;
 
+       if (IS_ERR(drv_data))
+               return PTR_ERR(drv_data);
+
        act_ctrl_reg = LLCC_TRP_ACT_CTRLn(sid);
        status_reg = LLCC_TRP_STATUSn(sid);
 
        int ret;
        u32 act_ctrl_val;
 
+       If (IS_ERR(drv_data))
+               return PTR_ERR(drv_data);
+
        if (IS_ERR_OR_NULL(desc))
                return -EINVAL;
 
        u32 act_ctrl_val;
        int ret;
 
+       If (IS_ERR(drv_data))
+               return PTR_ERR(drv_data);
+
        if (IS_ERR_OR_NULL(desc))
                return -EINVAL;
 
        return ret;
 }
 
+int qcom_llcc_remove(struct platform_device *pdev)
+{
+       /* Set the global pointer to a error code to avoid referencing it */
+       drv_data = ERR_PTR(-ENODEV);
+       return 0;
+}
+EXPORT_SYMBOL_GPL(qcom_llcc_remove);
+
 int qcom_llcc_probe(struct platform_device *pdev,
                      const struct llcc_slice_config *llcc_cfg, u32 sz)
 {
        struct platform_device *llcc_edac;
 
        drv_data = devm_kzalloc(dev, sizeof(*drv_data), GFP_KERNEL);
-       if (!drv_data)
-               return -ENOMEM;
+       if (!drv_data) {
+               ret = -ENOMEM;
+               goto err;
+       }
 
        llcc_banks_res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
                                                        "llcc_base");
        llcc_banks_base = devm_ioremap_resource(&pdev->dev, llcc_banks_res);
-       if (IS_ERR(llcc_banks_base))
-               return PTR_ERR(llcc_banks_base);
+       if (IS_ERR(llcc_banks_base)) {
+               ret = PTR_ERR(llcc_banks_base);
+               goto err;
+       }
 
        drv_data->regmap = devm_regmap_init_mmio(dev, llcc_banks_base,
                                                &llcc_regmap_config);
-       if (IS_ERR(drv_data->regmap))
-               return PTR_ERR(drv_data->regmap);
+       if (IS_ERR(drv_data->regmap)) {
+               ret = PTR_ERR(drv_data->regmap);
+               goto err;
+       }
 
        llcc_bcast_res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
                                                        "llcc_broadcast_base");
        llcc_bcast_base = devm_ioremap_resource(&pdev->dev, llcc_bcast_res);
-       if (IS_ERR(llcc_bcast_base))
-               return PTR_ERR(llcc_bcast_base);
+       if (IS_ERR(llcc_bcast_base)) {
+               ret = PTR_ERR(llcc_bcast_base);
+               goto err;
+       }
 
        drv_data->bcast_regmap = devm_regmap_init_mmio(dev, llcc_bcast_base,
                                                        &llcc_regmap_config);
-       if (IS_ERR(drv_data->bcast_regmap))
-               return PTR_ERR(drv_data->bcast_regmap);
+       if (IS_ERR(drv_data->bcast_regmap)) {
+               ret = PTR_ERR(drv_data->bcast_regmap);
+               goto err;
+       }
 
        ret = regmap_read(drv_data->regmap, LLCC_COMMON_STATUS0,
                                                &num_banks);
        if (ret)
-               return ret;
+               goto err;
 
        num_banks &= LLCC_LB_CNT_MASK;
        num_banks >>= LLCC_LB_CNT_SHIFT;
 
        drv_data->offsets = devm_kcalloc(dev, num_banks, sizeof(u32),
                                                        GFP_KERNEL);
-       if (!drv_data->offsets)
-               return -ENOMEM;
+       if (!drv_data->offsets) {
+               ret = -ENOMEM;
+               goto err;
+       }
 
        for (i = 0; i < num_banks; i++)
                drv_data->offsets[i] = i * BANK_OFFSET_STRIDE;
        drv_data->bitmap = devm_kcalloc(dev,
        BITS_TO_LONGS(drv_data->max_slices), sizeof(unsigned long),
                                                GFP_KERNEL);
-       if (!drv_data->bitmap)
-               return -ENOMEM;
+       if (!drv_data->bitmap) {
+               ret = -ENOMEM;
+               goto err;
+       }
 
        drv_data->cfg = llcc_cfg;
        drv_data->cfg_size = sz;
 
        ret = qcom_llcc_cfg_program(pdev);
        if (ret)
-               return ret;
+               goto err;
 
        drv_data->ecc_irq = platform_get_irq(pdev, 0);
        if (drv_data->ecc_irq >= 0) {
                        dev_err(dev, "Failed to register llcc edac driver\n");
        }
 
+       return 0;
+err:
+       drv_data = ERR_PTR(-ENODEV);
        return ret;
 }
 EXPORT_SYMBOL_GPL(qcom_llcc_probe);