On Sat, Mar 25, 2017 at 02:56:20PM +0100, Noralf Trønnes wrote: > drm_driver.fops can't be shared since the owner then becomes tinydrm.ko. > Move the fops declaration to the driver. > > Reported-by: Daniel Vetter <daniel.vetter@xxxxxxxxx> > Signed-off-by: Noralf Trønnes <noralf@xxxxxxxxxxx> Since it only "breaks" unloading (and only if you force-unload without knowing what you're doing, which is explicitly a developer feature with a big warning) I think perfectly ok to push this in only for 4.12. > --- > drivers/gpu/drm/tinydrm/core/tinydrm-core.c | 15 --------------- > drivers/gpu/drm/tinydrm/mi0283qt.c | 13 +++++++++++++ > include/drm/tinydrm/tinydrm.h | 4 +--- > 3 files changed, 14 insertions(+), 18 deletions(-) > > diff --git a/drivers/gpu/drm/tinydrm/core/tinydrm-core.c b/drivers/gpu/drm/tinydrm/core/tinydrm-core.c > index 6a257dd..fd25c7e5 100644 > --- a/drivers/gpu/drm/tinydrm/core/tinydrm-core.c > +++ b/drivers/gpu/drm/tinydrm/core/tinydrm-core.c > @@ -122,21 +122,6 @@ void tinydrm_gem_cma_free_object(struct drm_gem_object *gem_obj) > } > EXPORT_SYMBOL_GPL(tinydrm_gem_cma_free_object); > > -const struct file_operations tinydrm_fops = { > - .owner = THIS_MODULE, > - .open = drm_open, > - .release = drm_release, > - .unlocked_ioctl = drm_ioctl, > -#ifdef CONFIG_COMPAT > - .compat_ioctl = drm_compat_ioctl, > -#endif > - .poll = drm_poll, > - .read = drm_read, > - .llseek = no_llseek, > - .mmap = drm_gem_cma_mmap, > -}; > -EXPORT_SYMBOL(tinydrm_fops); > - > static struct drm_framebuffer * > tinydrm_fb_create(struct drm_device *drm, struct drm_file *file_priv, > const struct drm_mode_fb_cmd2 *mode_cmd) > diff --git a/drivers/gpu/drm/tinydrm/mi0283qt.c b/drivers/gpu/drm/tinydrm/mi0283qt.c > index b29fe86..fdca37a 100644 > --- a/drivers/gpu/drm/tinydrm/mi0283qt.c > +++ b/drivers/gpu/drm/tinydrm/mi0283qt.c > @@ -132,9 +132,22 @@ static const struct drm_display_mode mi0283qt_mode = { > TINYDRM_MODE(320, 240, 58, 43), > }; > > +static const struct file_operations mi0283qt_fops = { > + .owner = THIS_MODULE, > + .open = drm_open, > + .release = drm_release, > + .unlocked_ioctl = drm_ioctl, > + .compat_ioctl = drm_compat_ioctl, > + .poll = drm_poll, > + .read = drm_read, > + .llseek = no_llseek, > + .mmap = drm_gem_cma_mmap, > +}; And then you could use the shiny new DECLARE_DRM_GEM_CMA_FOPS here! Can you pls respin on top of drm-misc-next? Thanks, Daniel > + > static struct drm_driver mi0283qt_driver = { > .driver_features = DRIVER_GEM | DRIVER_MODESET | DRIVER_PRIME | > DRIVER_ATOMIC, > + .fops = &mi0283qt_fops, > TINYDRM_GEM_DRIVER_OPS, > .lastclose = tinydrm_lastclose, > .debugfs_init = mipi_dbi_debugfs_init, > diff --git a/include/drm/tinydrm/tinydrm.h b/include/drm/tinydrm/tinydrm.h > index cf9ca20..00b800d 100644 > --- a/include/drm/tinydrm/tinydrm.h > +++ b/include/drm/tinydrm/tinydrm.h > @@ -58,8 +58,7 @@ pipe_to_tinydrm(struct drm_simple_display_pipe *pipe) > .gem_prime_mmap = drm_gem_cma_prime_mmap, \ > .dumb_create = drm_gem_cma_dumb_create, \ > .dumb_map_offset = drm_gem_cma_dumb_map_offset, \ > - .dumb_destroy = drm_gem_dumb_destroy, \ > - .fops = &tinydrm_fops > + .dumb_destroy = drm_gem_dumb_destroy > > /** > * TINYDRM_MODE - tinydrm display mode > @@ -84,7 +83,6 @@ pipe_to_tinydrm(struct drm_simple_display_pipe *pipe) > .type = DRM_MODE_TYPE_DRIVER, \ > .clock = 1 /* pass validation */ > > -extern const struct file_operations tinydrm_fops; > void tinydrm_lastclose(struct drm_device *drm); > void tinydrm_gem_cma_free_object(struct drm_gem_object *gem_obj); > struct drm_gem_object * > -- > 2.10.2 > > _______________________________________________ > dri-devel mailing list > dri-devel@xxxxxxxxxxxxxxxxxxxxx > https://lists.freedesktop.org/mailman/listinfo/dri-devel -- Daniel Vetter Software Engineer, Intel Corporation http://blog.ffwll.ch _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel