Skip to content

Commit 417218a

Browse files
committed
fbdev/ssd1307fb: Generate deferred I/O ops
Use the existing generator macros to create deferred-I/O helpers for ssd1307fb and set them in the fb_ops structure. Functions for damage handling on memory ranges and areas are provided by the driver. Ssd1307fb's implementation of fb_write writes to system memory, so the generated code can use the respective helper internally. This also fixes a long-standing bug where fb_write returned an errno code instead of the number of written bytes. See the commit message of commit 921b738 ("fbdev: Return number of bytes read or written") for more details. Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de> Reviewed-by: Sam Ravnborg <sam@ravnborg.org> Acked-by: Helge Deller <deller@gmx.de> Link: https://patchwork.freedesktop.org/patch/msgid/20230706151432.20674-9-tzimmermann@suse.de
1 parent 4705f37 commit 417218a

1 file changed

Lines changed: 11 additions & 58 deletions

File tree

drivers/video/fbdev/ssd1307fb.c

Lines changed: 11 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -292,43 +292,6 @@ static int ssd1307fb_update_display(struct ssd1307fb_par *par)
292292
return ssd1307fb_update_rect(par, 0, 0, par->width, par->height);
293293
}
294294

295-
static ssize_t ssd1307fb_write(struct fb_info *info, const char __user *buf,
296-
size_t count, loff_t *ppos)
297-
{
298-
struct ssd1307fb_par *par = info->par;
299-
unsigned long total_size;
300-
unsigned long p = *ppos;
301-
void *dst;
302-
int ret;
303-
304-
if (!info->screen_buffer)
305-
return -ENODEV;
306-
307-
total_size = info->fix.smem_len;
308-
309-
if (p > total_size)
310-
return -EINVAL;
311-
312-
if (count + p > total_size)
313-
count = total_size - p;
314-
315-
if (!count)
316-
return -EINVAL;
317-
318-
dst = info->screen_buffer + p;
319-
320-
if (copy_from_user(dst, buf, count))
321-
return -EFAULT;
322-
323-
ret = ssd1307fb_update_display(par);
324-
if (ret < 0)
325-
return ret;
326-
327-
*ppos += count;
328-
329-
return count;
330-
}
331-
332295
static int ssd1307fb_blank(int blank_mode, struct fb_info *info)
333296
{
334297
struct ssd1307fb_par *par = info->par;
@@ -339,39 +302,29 @@ static int ssd1307fb_blank(int blank_mode, struct fb_info *info)
339302
return ssd1307fb_write_cmd(par->client, SSD1307FB_DISPLAY_ON);
340303
}
341304

342-
static void ssd1307fb_fillrect(struct fb_info *info, const struct fb_fillrect *rect)
305+
static void ssd1307fb_defio_damage_range(struct fb_info *info, off_t off, size_t len)
343306
{
344307
struct ssd1307fb_par *par = info->par;
345-
sys_fillrect(info, rect);
346-
ssd1307fb_update_rect(par, rect->dx, rect->dy, rect->width,
347-
rect->height);
348-
}
349308

350-
static void ssd1307fb_copyarea(struct fb_info *info, const struct fb_copyarea *area)
351-
{
352-
struct ssd1307fb_par *par = info->par;
353-
sys_copyarea(info, area);
354-
ssd1307fb_update_rect(par, area->dx, area->dy, area->width,
355-
area->height);
309+
ssd1307fb_update_display(par);
356310
}
357311

358-
static void ssd1307fb_imageblit(struct fb_info *info, const struct fb_image *image)
312+
static void ssd1307fb_defio_damage_area(struct fb_info *info, u32 x, u32 y,
313+
u32 width, u32 height)
359314
{
360315
struct ssd1307fb_par *par = info->par;
361-
sys_imageblit(info, image);
362-
ssd1307fb_update_rect(par, image->dx, image->dy, image->width,
363-
image->height);
316+
317+
ssd1307fb_update_rect(par, x, y, width, height);
364318
}
365319

320+
FB_GEN_DEFAULT_DEFERRED_SYS_OPS(ssd1307fb,
321+
ssd1307fb_defio_damage_range,
322+
ssd1307fb_defio_damage_area)
323+
366324
static const struct fb_ops ssd1307fb_ops = {
367325
.owner = THIS_MODULE,
368-
.fb_read = fb_sys_read,
369-
.fb_write = ssd1307fb_write,
326+
FB_DEFAULT_DEFERRED_OPS(ssd1307fb),
370327
.fb_blank = ssd1307fb_blank,
371-
.fb_fillrect = ssd1307fb_fillrect,
372-
.fb_copyarea = ssd1307fb_copyarea,
373-
.fb_imageblit = ssd1307fb_imageblit,
374-
.fb_mmap = fb_deferred_io_mmap,
375328
};
376329

377330
static void ssd1307fb_deferred_io(struct fb_info *info, struct list_head *pagereflist)

0 commit comments

Comments
 (0)