/* * Platform driver: */ static int etnaviv_bind(struct device *dev) { struct etnaviv_drm_private *priv; struct drm_device *drm; int ret; drm = drm_dev_alloc(&etnaviv_drm_driver, dev); if (!drm) return -ENOMEM; drm->platformdev = to_platform_device(dev); priv = kzalloc(sizeof(*priv), GFP_KERNEL); if (!priv) { dev_err(dev, "failed to allocate private data\n"); ret = -ENOMEM; goto out_unref; } drm->dev_private = priv; priv->wq = alloc_ordered_workqueue("etnaviv", 0); if (!priv->wq) { ret = -ENOMEM; goto out_wq; } mutex_init(&priv->gem_lock); INIT_LIST_HEAD(&priv->gem_list); priv->num_gpus = 0; dev_set_drvdata(dev, drm); ret = component_bind_all(dev, drm); if (ret < 0) goto out_bind; load_gpu(drm); ret = drm_dev_register(drm, 0); if (ret) goto out_register; return 0; out_register: component_unbind_all(dev, drm); out_bind: flush_workqueue(priv->wq); destroy_workqueue(priv->wq); out_wq: kfree(priv); out_unref: drm_dev_unref(drm); return ret; }
/* * Platform driver: */ static int etnaviv_bind(struct device *dev) { struct etnaviv_drm_private *priv; struct drm_device *drm; int ret; drm = drm_dev_alloc(&etnaviv_drm_driver, dev); if (IS_ERR(drm)) return PTR_ERR(drm); priv = kzalloc(sizeof(*priv), GFP_KERNEL); if (!priv) { dev_err(dev, "failed to allocate private data\n"); ret = -ENOMEM; goto out_unref; } drm->dev_private = priv; mutex_init(&priv->gem_lock); INIT_LIST_HEAD(&priv->gem_list); priv->num_gpus = 0; dev_set_drvdata(dev, drm); ret = component_bind_all(dev, drm); if (ret < 0) goto out_bind; load_gpu(drm); ret = drm_dev_register(drm, 0); if (ret) goto out_register; return 0; out_register: component_unbind_all(dev, drm); out_bind: kfree(priv); out_unref: drm_dev_unref(drm); return ret; }