Messages in this thread Patch in this message | | | From | Geert Uytterhoeven <> | Subject | [PATCH v2 5/5] video: fbdev: ssd1307fb: Cache address ranges | Date | Tue, 27 Jul 2021 15:47:30 +0200 |
| |
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> Acked-by: Sam Ravnborg <sam@ravnborg.org> --- v2: - Add Acked-by, - Rebase. --- drivers/video/fbdev/ssd1307fb.c | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-)
diff --git a/drivers/video/fbdev/ssd1307fb.c b/drivers/video/fbdev/ssd1307fb.c index 9aed5ee0094f2d95..1e2f71c2f8a8bc78 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 { @@ -158,6 +163,9 @@ static int ssd1307fb_set_col_range(struct ssd1307fb_par *par, u8 col_start, u8 col_end = col_start + cols - 1; int ret; + if (col_start == par->col_start && col_end == par->col_end) + return 0; + ret = ssd1307fb_write_cmd(par->client, SSD1307FB_SET_COL_RANGE); if (ret < 0) return ret; @@ -166,7 +174,13 @@ static int ssd1307fb_set_col_range(struct ssd1307fb_par *par, u8 col_start, if (ret < 0) return ret; - return ssd1307fb_write_cmd(par->client, col_end); + ret = ssd1307fb_write_cmd(par->client, col_end); + if (ret < 0) + return ret; + + par->col_start = col_start; + par->col_end = col_end; + return 0; } static int ssd1307fb_set_page_range(struct ssd1307fb_par *par, u8 page_start, @@ -175,6 +189,9 @@ static int ssd1307fb_set_page_range(struct ssd1307fb_par *par, u8 page_start, u8 page_end = page_start + pages - 1; int ret; + if (page_start == par->page_start && page_end == par->page_end) + return 0; + ret = ssd1307fb_write_cmd(par->client, SSD1307FB_SET_PAGE_RANGE); if (ret < 0) return ret; @@ -183,7 +200,13 @@ static int ssd1307fb_set_page_range(struct ssd1307fb_par *par, u8 page_start, if (ret < 0) return ret; - return ssd1307fb_write_cmd(par->client, page_end); + ret = ssd1307fb_write_cmd(par->client, page_end); + if (ret < 0) + return ret; + + 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
| |