[PATCH resend 5/5] video: fbdev: ssd1307fb: Cache address ranges
From: Geert Uytterhoeven <geert@linux-m68k.org>
Date: 2021-07-14 14:58:18
Also in:
dri-devel, lkml
Subsystem:
framebuffer layer, the rest · Maintainers:
Helge Deller, Linus Torvalds
Cache the column and page ranges, to avoid doing unneeded I2C transfers when the values haven't changed. Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org> --- drivers/video/fbdev/ssd1307fb.c | 52 +++++++++++++++++++++++---------- 1 file changed, 36 insertions(+), 16 deletions(-)
diff --git a/drivers/video/fbdev/ssd1307fb.c b/drivers/video/fbdev/ssd1307fb.c
index 8e3d4be74723b9bf..23b43ce479898813 100644
--- a/drivers/video/fbdev/ssd1307fb.c
+++ b/drivers/video/fbdev/ssd1307fb.c@@ -82,6 +82,11 @@ struct ssd1307fb_par { struct regulator *vbat_reg; u32 vcomh; u32 width; + /* Cached address ranges */ + u8 col_start; + u8 col_end; + u8 page_start; + u8 page_end; }; struct ssd1307fb_array {
@@ -160,28 +165,43 @@ static int ssd1307fb_set_address_range(struct ssd1307fb_par *par, u8 col_start, int ret; /* Set column range */ - ret = ssd1307fb_write_cmd(par->client, SSD1307FB_SET_COL_RANGE); - if (ret < 0) - return ret; + if (col_start != par->col_start || col_end != par->col_end) { + ret = ssd1307fb_write_cmd(par->client, SSD1307FB_SET_COL_RANGE); + if (ret < 0) + return ret; - ret = ssd1307fb_write_cmd(par->client, col_start); - if (ret < 0) - return ret; + ret = ssd1307fb_write_cmd(par->client, col_start); + if (ret < 0) + return ret; - ret = ssd1307fb_write_cmd(par->client, col_end); - if (ret < 0) - return ret; + ret = ssd1307fb_write_cmd(par->client, col_end); + if (ret < 0) + return ret; + + par->col_start = col_start; + par->col_end = col_end; + } /* Set page range */ - ret = ssd1307fb_write_cmd(par->client, SSD1307FB_SET_PAGE_RANGE); - if (ret < 0) - return ret; + if (page_start != par->page_start || page_end != par->page_end) { + ret = ssd1307fb_write_cmd(par->client, + SSD1307FB_SET_PAGE_RANGE); + if (ret < 0) + return ret; - ret = ssd1307fb_write_cmd(par->client, page_start); - if (ret < 0) - return ret; + ret = ssd1307fb_write_cmd(par->client, page_start); + if (ret < 0) + return ret; + + ret = ssd1307fb_write_cmd(par->client, page_end); + if (ret < 0) + return ret; - return ssd1307fb_write_cmd(par->client, page_end); + par->page_start = page_start; + par->page_end = page_end; + } + + return 0; } static int ssd1307fb_update_rect(struct ssd1307fb_par *par, unsigned int x,
--
2.25.1