Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

video: fbdev: ssd1307fb: Cache address ranges

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>
Signed-off-by: Sam Ravnborg <sam@ravnborg.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20210727134730.3765898-6-geert@linux-m68k.org

authored by

Geert Uytterhoeven and committed by
Sam Ravnborg
833d14a4 251e48a1

+25 -2
+25 -2
drivers/video/fbdev/ssd1307fb.c
··· 82 82 struct regulator *vbat_reg; 83 83 u32 vcomh; 84 84 u32 width; 85 + /* Cached address ranges */ 86 + u8 col_start; 87 + u8 col_end; 88 + u8 page_start; 89 + u8 page_end; 85 90 }; 86 91 87 92 struct ssd1307fb_array { ··· 163 158 u8 col_end = col_start + cols - 1; 164 159 int ret; 165 160 161 + if (col_start == par->col_start && col_end == par->col_end) 162 + return 0; 163 + 166 164 ret = ssd1307fb_write_cmd(par->client, SSD1307FB_SET_COL_RANGE); 167 165 if (ret < 0) 168 166 return ret; ··· 174 166 if (ret < 0) 175 167 return ret; 176 168 177 - return ssd1307fb_write_cmd(par->client, col_end); 169 + ret = ssd1307fb_write_cmd(par->client, col_end); 170 + if (ret < 0) 171 + return ret; 172 + 173 + par->col_start = col_start; 174 + par->col_end = col_end; 175 + return 0; 178 176 } 179 177 180 178 static int ssd1307fb_set_page_range(struct ssd1307fb_par *par, u8 page_start, ··· 188 174 { 189 175 u8 page_end = page_start + pages - 1; 190 176 int ret; 177 + 178 + if (page_start == par->page_start && page_end == par->page_end) 179 + return 0; 191 180 192 181 ret = ssd1307fb_write_cmd(par->client, SSD1307FB_SET_PAGE_RANGE); 193 182 if (ret < 0) ··· 200 183 if (ret < 0) 201 184 return ret; 202 185 203 - return ssd1307fb_write_cmd(par->client, page_end); 186 + ret = ssd1307fb_write_cmd(par->client, page_end); 187 + if (ret < 0) 188 + return ret; 189 + 190 + par->page_start = page_start; 191 + par->page_end = page_end; 192 + return 0; 204 193 } 205 194 206 195 static int ssd1307fb_update_rect(struct ssd1307fb_par *par, unsigned int x,