]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
fb_defio: add first_io callback
authorHeiko Stübner <heiko@sntech.de>
Sat, 28 Apr 2012 10:19:10 +0000 (12:19 +0200)
committerFlorian Tobias Schandinat <FlorianSchandinat@gmx.de>
Sun, 29 Apr 2012 19:35:31 +0000 (19:35 +0000)
With this optional callback the driver is notified when the first page
is entered into the pagelist and a new deferred_io call is scheduled.

A possible use-case for this is runtime-pm. In the first_io call
pm_runtime_get()
could be called, which starts an asynchronous runtime_resume of the
device. In the deferred_io callback a call to
pm_runtime_barrier()
makes the sure, the device is resumed by then and a
pm_runtime_put()
may put the device back to sleep.

Also, some SoCs may use the runtime-pm system to determine if they
are able to enter deeper idle states. Therefore it is necessary to
keep the use-count from the first written page until the conclusion
of the screen update, to prevent the system from going to sleep before
completing the pending update.

Two users of defio were using kmalloc to allocate the structure.
These allocations are changed to kzalloc, to prevent uninitialised
.first_io members in those drivers.

Signed-off-by: Heiko Stübner <heiko@sntech.de>
Signed-off-by: Florian Tobias Schandinat <FlorianSchandinat@gmx.de>
drivers/video/fb_defio.c
drivers/video/smscufx.c
drivers/video/udlfb.c
include/linux/fb.h

index c27e153d8882053e2d28ab72cfc784875752f337..070f26f0bf99905f13ecfc7cdf8e361bc697dbbe 100644 (file)
@@ -107,6 +107,10 @@ static int fb_deferred_io_mkwrite(struct vm_area_struct *vma,
        /* protect against the workqueue changing the page list */
        mutex_lock(&fbdefio->lock);
 
+       /* first write in this cycle, notify the driver */
+       if (fbdefio->first_io && list_empty(&fbdefio->pagelist))
+               fbdefio->first_io(info);
+
        /*
         * We want the page to remain locked from ->page_mkwrite until
         * the PTE is marked dirty to avoid page_mkclean() being called
index ccbfef5e828f3d19815dc7f91c27164c737f4250..99857857f6fa95098e3fc822d48d23f44dbb0451 100644 (file)
@@ -1083,7 +1083,7 @@ static int ufx_ops_open(struct fb_info *info, int user)
 
                struct fb_deferred_io *fbdefio;
 
-               fbdefio = kmalloc(sizeof(struct fb_deferred_io), GFP_KERNEL);
+               fbdefio = kzalloc(sizeof(struct fb_deferred_io), GFP_KERNEL);
 
                if (fbdefio) {
                        fbdefio->delay = UFX_DEFIO_WRITE_DELAY;
index a159b63e18b9d3c14a3a989fa979ce21c425a66b..e9d43b403432b1568245358ce662e082caa7ca85 100644 (file)
@@ -893,7 +893,7 @@ static int dlfb_ops_open(struct fb_info *info, int user)
 
                struct fb_deferred_io *fbdefio;
 
-               fbdefio = kmalloc(sizeof(struct fb_deferred_io), GFP_KERNEL);
+               fbdefio = kzalloc(sizeof(struct fb_deferred_io), GFP_KERNEL);
 
                if (fbdefio) {
                        fbdefio->delay = DL_DEFIO_WRITE_DELAY;
index d31cb682e17371e0271947d59f2311818316152d..c10e71efb8f55bfb9ab9cc4c6541ee9d89f2b714 100644 (file)
@@ -607,6 +607,7 @@ struct fb_deferred_io {
        struct mutex lock; /* mutex that protects the page list */
        struct list_head pagelist; /* list of touched pages */
        /* callback */
+       void (*first_io)(struct fb_info *info);
        void (*deferred_io)(struct fb_info *info, struct list_head *pagelist);
 };
 #endif