return 0;
 }
 
-static int adreno_get_pwrlevels(struct device *dev,
+static void adreno_get_pwrlevels(struct device *dev,
                struct msm_gpu *gpu)
 {
        unsigned long freq = ULONG_MAX;
        }
 
        DBG("fast_rate=%u, slow_rate=27000000", gpu->fast_rate);
-
-       /* Check for an interconnect path for the bus */
-       gpu->icc_path = of_icc_get(dev, "gfx-mem");
-       if (!gpu->icc_path) {
-               /*
-                * Keep compatbility with device trees that don't have an
-                * interconnect-names property.
-                */
-               gpu->icc_path = of_icc_get(dev, NULL);
-       }
-       if (IS_ERR(gpu->icc_path))
-               gpu->icc_path = NULL;
-
-       gpu->ocmem_icc_path = of_icc_get(dev, "ocmem");
-       if (IS_ERR(gpu->ocmem_icc_path))
-               gpu->ocmem_icc_path = NULL;
-
-       return 0;
 }
 
 int adreno_gpu_ocmem_init(struct device *dev, struct adreno_gpu *adreno_gpu,
                struct adreno_gpu *adreno_gpu,
                const struct adreno_gpu_funcs *funcs, int nr_rings)
 {
-       struct adreno_platform_config *config = pdev->dev.platform_data;
+       struct device *dev = &pdev->dev;
+       struct adreno_platform_config *config = dev->platform_data;
        struct msm_gpu_config adreno_gpu_config  = { 0 };
        struct msm_gpu *gpu = &adreno_gpu->base;
+       int ret;
 
        adreno_gpu->funcs = funcs;
        adreno_gpu->info = adreno_info(config->rev);
 
        adreno_gpu_config.nr_rings = nr_rings;
 
-       adreno_get_pwrlevels(&pdev->dev, gpu);
+       adreno_get_pwrlevels(dev, gpu);
 
-       pm_runtime_set_autosuspend_delay(&pdev->dev,
+       pm_runtime_set_autosuspend_delay(dev,
                adreno_gpu->info->inactive_period);
-       pm_runtime_use_autosuspend(&pdev->dev);
-       pm_runtime_enable(&pdev->dev);
+       pm_runtime_use_autosuspend(dev);
+       pm_runtime_enable(dev);
 
-       return msm_gpu_init(drm, pdev, &adreno_gpu->base, &funcs->base,
+       ret = msm_gpu_init(drm, pdev, &adreno_gpu->base, &funcs->base,
                        adreno_gpu->info->name, &adreno_gpu_config);
+       if (ret)
+               return ret;
+
+       /* Check for an interconnect path for the bus */
+       gpu->icc_path = of_icc_get(dev, "gfx-mem");
+       if (!gpu->icc_path) {
+               /*
+                * Keep compatbility with device trees that don't have an
+                * interconnect-names property.
+                */
+               gpu->icc_path = of_icc_get(dev, NULL);
+       }
+       if (IS_ERR(gpu->icc_path)) {
+               ret = PTR_ERR(gpu->icc_path);
+               gpu->icc_path = NULL;
+               return ret;
+       }
+
+       gpu->ocmem_icc_path = of_icc_get(dev, "ocmem");
+       if (IS_ERR(gpu->ocmem_icc_path)) {
+               ret = PTR_ERR(gpu->ocmem_icc_path);
+               gpu->ocmem_icc_path = NULL;
+               /* allow -ENODATA, ocmem icc is optional */
+               if (ret != -ENODATA)
+                       return ret;
+       }
+       return 0;
 }
 
 void adreno_gpu_cleanup(struct adreno_gpu *adreno_gpu)
 
        pm_runtime_disable(&priv->gpu_pdev->dev);
 
+       msm_gpu_cleanup(&adreno_gpu->base);
+
        icc_put(gpu->icc_path);
        icc_put(gpu->ocmem_icc_path);
-
-       msm_gpu_cleanup(&adreno_gpu->base);
 }