void a6xx_gmu_remove(struct a6xx_gpu *a6xx_gpu) { struct a6xx_gmu *gmu = &a6xx_gpu->gmu; if (!gmu->initialized) return; a6xx_gmu_stop(a6xx_gpu); pm_runtime_disable(gmu->dev); if (!IS_ERR_OR_NULL(gmu->gxpd)) { pm_runtime_disable(gmu->gxpd); dev_pm_domain_detach(gmu->gxpd, false); } iounmap(gmu->mmio); gmu->mmio = NULL; a6xx_gmu_memory_free(gmu, gmu->hfi); iommu_detach_device(gmu->domain, gmu->dev); iommu_domain_free(gmu->domain); free_irq(gmu->gmu_irq, gmu); free_irq(gmu->hfi_irq, gmu); /* Drop reference taken in of_find_device_by_node */ put_device(gmu->dev); gmu->initialized = false; }
void a6xx_gmu_remove(struct a6xx_gpu *a6xx_gpu) { struct a6xx_gmu *gmu = &a6xx_gpu->gmu; if (IS_ERR_OR_NULL(gmu->mmio)) return; pm_runtime_disable(gmu->dev); a6xx_gmu_stop(a6xx_gpu); a6xx_gmu_irq_disable(gmu); a6xx_gmu_memory_free(gmu, gmu->hfi); iommu_detach_device(gmu->domain, gmu->dev); iommu_domain_free(gmu->domain); }