static int adf_device_init(struct adf_pdata *pdata, struct adf_device *dev) { adf_id_t intf_id; int intf_fd; int err; err = adf_find_simple_post_configuration(dev, &pdata->format, 1, &intf_id, &pdata->eng_id); if (err < 0) return err; err = adf_device_attach(dev, pdata->eng_id, intf_id); if (err < 0 && err != -EALREADY) return err; pdata->intf_fd = adf_interface_open(dev, intf_id, O_RDWR); if (pdata->intf_fd < 0) return pdata->intf_fd; err = adf_interface_init(pdata); if (err < 0) { close(pdata->intf_fd); pdata->intf_fd = -1; } return err; }
TEST_F(AdfTest, attach) { ASSERT_NO_FATAL_FAILURE(attach()); int err = adf_device_attach(&dev, eng_id, intf_id); EXPECT_EQ(-EALREADY, err) << "attaching overlay engine " << eng_id << " to interface " << intf_id << " twice should have failed"; ASSERT_NO_FATAL_FAILURE(detach()); err = adf_device_detach(&dev, eng_id, intf_id); EXPECT_EQ(-EINVAL, err) << "detaching overlay engine " << eng_id << " from interface " << intf_id << " twice should have failed"; err = adf_device_attach(&dev, eng_id, ADF_MAX_INTERFACES); EXPECT_EQ(-EINVAL, err) << "attaching overlay engine " << eng_id << " to bogus interface should have failed"; err = adf_device_detach(&dev, eng_id, ADF_MAX_INTERFACES); EXPECT_EQ(-EINVAL, err) << "detaching overlay engine " << eng_id << " from bogus interface should have failed"; }
/** * adf_fbdev_open - default implementation of fbdev open op */ int adf_fbdev_open(struct fb_info *info, int user) { struct adf_fbdev *fbdev = info->par; int ret; mutex_lock(&fbdev->refcount_lock); if (unlikely(fbdev->refcount == UINT_MAX)) { ret = -EMFILE; goto done; } if (!fbdev->refcount) { struct drm_mode_modeinfo mode; struct fb_videomode fbmode; struct adf_device *dev = adf_interface_parent(fbdev->intf); ret = adf_device_attach(dev, fbdev->eng, fbdev->intf); if (ret < 0 && ret != -EALREADY) goto done; ret = adf_fb_alloc(fbdev); if (ret < 0) goto done; adf_interface_current_mode(fbdev->intf, &mode); adf_modeinfo_to_fb_videomode(&mode, &fbmode); fb_videomode_to_var(&fbdev->info->var, &fbmode); adf_fbdev_set_format(fbdev, fbdev->default_format); adf_fbdev_fill_modelist(fbdev); } if (!fbdev_opened_once) { fbdev_opened_once = true; } else { ret = adf_fbdev_post(fbdev); if (ret < 0) { if (!fbdev->refcount) adf_fb_destroy(fbdev); goto done; } } fbdev->refcount++; done: mutex_unlock(&fbdev->refcount_lock); return ret; }
int MinuiBackendAdf::DeviceInit(adf_device* dev) { adf_id_t intf_id; int err = adf_find_simple_post_configuration(dev, &format, 1, &intf_id, &eng_id); if (err < 0) return err; err = adf_device_attach(dev, eng_id, intf_id); if (err < 0 && err != -EALREADY) return err; intf_fd = adf_interface_open(dev, intf_id, O_RDWR); if (intf_fd < 0) return intf_fd; err = InterfaceInit(); if (err < 0) { close(intf_fd); intf_fd = -1; } return err; }
/** * adf_fbdev_open - default implementation of fbdev open op */ int adf_fbdev_open(struct fb_info *info, int user) { struct adf_fbdev *fbdev = info->par; int ret; if (!fbdev->open) { struct drm_mode_modeinfo mode; struct fb_videomode fbmode; struct adf_device *dev = adf_interface_parent(fbdev->intf); ret = adf_device_attach(dev, fbdev->eng, fbdev->intf); if (ret < 0 && ret != -EALREADY) return ret; ret = adf_fb_alloc(fbdev); if (ret < 0) return ret; adf_interface_current_mode(fbdev->intf, &mode); adf_modeinfo_to_fb_videomode(&mode, &fbmode); fb_videomode_to_var(&fbdev->info->var, &fbmode); adf_fbdev_set_format(fbdev, fbdev->default_format); adf_fbdev_fill_modelist(fbdev); } ret = adf_fbdev_post(fbdev); if (ret < 0) { if (!fbdev->open) adf_fb_destroy(fbdev); return ret; } fbdev->open = true; return 0; }
void attach() { int err = adf_device_attach(&dev, eng_id, intf_id); ASSERT_FALSE(err < 0 && err != -EALREADY) << "attaching overlay engine " << eng_id << " to interface " << intf_id << " failed: " << strerror(-err); }