diff options
Diffstat (limited to 'drivers/staging/fbtft')
-rw-r--r-- | drivers/staging/fbtft/Kconfig | 6 | ||||
-rw-r--r-- | drivers/staging/fbtft/Makefile | 1 | ||||
-rw-r--r-- | drivers/staging/fbtft/fb_agm1264k-fl.c | 2 | ||||
-rw-r--r-- | drivers/staging/fbtft/fb_ili9163.c | 2 | ||||
-rw-r--r-- | drivers/staging/fbtft/fb_ili9325.c | 2 | ||||
-rw-r--r-- | drivers/staging/fbtft/fb_ili9481.c | 2 | ||||
-rw-r--r-- | drivers/staging/fbtft/fb_ili9486.c | 2 | ||||
-rw-r--r-- | drivers/staging/fbtft/fb_ra8875.c | 2 | ||||
-rw-r--r-- | drivers/staging/fbtft/fb_s6d02a1.c | 2 | ||||
-rw-r--r-- | drivers/staging/fbtft/fb_sh1106.c | 195 | ||||
-rw-r--r-- | drivers/staging/fbtft/fb_ssd1289.c | 2 | ||||
-rw-r--r-- | drivers/staging/fbtft/fb_ssd1331.c | 8 | ||||
-rw-r--r-- | drivers/staging/fbtft/fb_st7735r.c | 2 | ||||
-rw-r--r-- | drivers/staging/fbtft/fb_watterott.c | 6 | ||||
-rw-r--r-- | drivers/staging/fbtft/fbtft-bus.c | 33 | ||||
-rw-r--r-- | drivers/staging/fbtft/fbtft-core.c | 74 | ||||
-rw-r--r-- | drivers/staging/fbtft/fbtft-sysfs.c | 16 | ||||
-rw-r--r-- | drivers/staging/fbtft/fbtft.h | 5 | ||||
-rw-r--r-- | drivers/staging/fbtft/fbtft_device.c | 23 | ||||
-rw-r--r-- | drivers/staging/fbtft/flexfb.c | 20 |
20 files changed, 306 insertions, 99 deletions
diff --git a/drivers/staging/fbtft/Kconfig b/drivers/staging/fbtft/Kconfig index 6f5e824..dba6767 100644 --- a/drivers/staging/fbtft/Kconfig +++ b/drivers/staging/fbtft/Kconfig @@ -111,6 +111,12 @@ config FB_TFT_S6D1121 help Generic Framebuffer support for S6D1121 +config FB_TFT_SH1106 + tristate "FB driver for the SH1106 OLED Controller" + depends on FB_TFT + help + Framebuffer support for SH1106 + config FB_TFT_SSD1289 tristate "FB driver for the SSD1289 LCD Controller" depends on FB_TFT diff --git a/drivers/staging/fbtft/Makefile b/drivers/staging/fbtft/Makefile index 2725ea9..05ae9fb 100644 --- a/drivers/staging/fbtft/Makefile +++ b/drivers/staging/fbtft/Makefile @@ -20,6 +20,7 @@ obj-$(CONFIG_FB_TFT_PCD8544) += fb_pcd8544.o obj-$(CONFIG_FB_TFT_RA8875) += fb_ra8875.o obj-$(CONFIG_FB_TFT_S6D02A1) += fb_s6d02a1.o obj-$(CONFIG_FB_TFT_S6D1121) += fb_s6d1121.o +obj-$(CONFIG_FB_TFT_SH1106) += fb_sh1106.o obj-$(CONFIG_FB_TFT_SSD1289) += fb_ssd1289.o obj-$(CONFIG_FB_TFT_SSD1305) += fb_ssd1305.o obj-$(CONFIG_FB_TFT_SSD1306) += fb_ssd1306.o diff --git a/drivers/staging/fbtft/fb_agm1264k-fl.c b/drivers/staging/fbtft/fb_agm1264k-fl.c index 4ee76db..489151a 100644 --- a/drivers/staging/fbtft/fb_agm1264k-fl.c +++ b/drivers/staging/fbtft/fb_agm1264k-fl.c @@ -369,7 +369,7 @@ static int write_vmem(struct fbtft_par *par, size_t offset, size_t len) /* select left side (sc0) * set addr */ - write_reg(par, 0x00, (1 << 6) | (u8)addr_win.xs); + write_reg(par, 0x00, BIT(6) | (u8)addr_win.xs); write_reg(par, 0x00, (0x17 << 3) | (u8)y); /* write bitmap */ diff --git a/drivers/staging/fbtft/fb_ili9163.c b/drivers/staging/fbtft/fb_ili9163.c index 579e177..045cadc 100644 --- a/drivers/staging/fbtft/fb_ili9163.c +++ b/drivers/staging/fbtft/fb_ili9163.c @@ -194,7 +194,7 @@ static int set_var(struct fbtft_par *par) /* Colorspcae */ if (par->bgr) - mactrl_data |= (1 << 2); + mactrl_data |= BIT(2); write_reg(par, MIPI_DCS_SET_ADDRESS_MODE, mactrl_data); write_reg(par, MIPI_DCS_WRITE_MEMORY_START); return 0; diff --git a/drivers/staging/fbtft/fb_ili9325.c b/drivers/staging/fbtft/fb_ili9325.c index 7189de5..7f9e9b2 100644 --- a/drivers/staging/fbtft/fb_ili9325.c +++ b/drivers/staging/fbtft/fb_ili9325.c @@ -126,7 +126,7 @@ static int init_display(struct fbtft_par *par) write_reg(par, 0x0013, 0x0000); /* VDV[4:0] for VCOM amplitude */ mdelay(200); /* Dis-charge capacitor power voltage */ write_reg(par, 0x0010, /* SAP, BT[3:0], AP, DSTB, SLP, STB */ - (1 << 12) | (bt << 8) | (1 << 7) | (0x01 << 4)); + BIT(12) | (bt << 8) | BIT(7) | BIT(4)); write_reg(par, 0x0011, 0x220 | vc); /* DC1[2:0], DC0[2:0], VC[2:0] */ mdelay(50); /* Delay 50ms */ write_reg(par, 0x0012, vrh); /* Internal reference voltage= Vci; */ diff --git a/drivers/staging/fbtft/fb_ili9481.c b/drivers/staging/fbtft/fb_ili9481.c index 4e75f5a..7f182a1 100644 --- a/drivers/staging/fbtft/fb_ili9481.c +++ b/drivers/staging/fbtft/fb_ili9481.c @@ -27,7 +27,7 @@ #define WIDTH 320 #define HEIGHT 480 -static s16 default_init_sequence[] = { +static const s16 default_init_sequence[] = { /* SLP_OUT - Sleep out */ -1, MIPI_DCS_EXIT_SLEEP_MODE, -2, 50, diff --git a/drivers/staging/fbtft/fb_ili9486.c b/drivers/staging/fbtft/fb_ili9486.c index f4b3142..ddd07a6 100644 --- a/drivers/staging/fbtft/fb_ili9486.c +++ b/drivers/staging/fbtft/fb_ili9486.c @@ -26,7 +26,7 @@ #define HEIGHT 480 /* this init sequence matches PiScreen */ -static s16 default_init_sequence[] = { +static const s16 default_init_sequence[] = { /* Interface Mode Control */ -1, 0xb0, 0x0, -1, MIPI_DCS_EXIT_SLEEP_MODE, diff --git a/drivers/staging/fbtft/fb_ra8875.c b/drivers/staging/fbtft/fb_ra8875.c index 89d36d6..a899614 100644 --- a/drivers/staging/fbtft/fb_ra8875.c +++ b/drivers/staging/fbtft/fb_ra8875.c @@ -253,7 +253,7 @@ static void write_reg8_bus8(struct fbtft_par *par, int len, ...) static int write_vmem16_bus8(struct fbtft_par *par, size_t offset, size_t len) { u16 *vmem16; - u16 *txbuf16 = par->txbuf.buf; + __be16 *txbuf16 = par->txbuf.buf; size_t remain; size_t to_copy; size_t tx_array_size; diff --git a/drivers/staging/fbtft/fb_s6d02a1.c b/drivers/staging/fbtft/fb_s6d02a1.c index eb712aa..c12855b 100644 --- a/drivers/staging/fbtft/fb_s6d02a1.c +++ b/drivers/staging/fbtft/fb_s6d02a1.c @@ -24,7 +24,7 @@ #define DRVNAME "fb_s6d02a1" -static s16 default_init_sequence[] = { +static const s16 default_init_sequence[] = { -1, 0xf0, 0x5a, 0x5a, diff --git a/drivers/staging/fbtft/fb_sh1106.c b/drivers/staging/fbtft/fb_sh1106.c new file mode 100644 index 0000000..89c27a4 --- /dev/null +++ b/drivers/staging/fbtft/fb_sh1106.c @@ -0,0 +1,195 @@ +/* + * FB driver for the SH1106 OLED Controller + * Based on the SSD1306 driver by Noralf Tronnes + * + * Copyright (C) 2017 Heiner Kallweit + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include <linux/module.h> +#include <linux/kernel.h> +#include <linux/init.h> +#include <linux/gpio.h> +#include <linux/delay.h> + +#include "fbtft.h" + +#define DRVNAME "fb_sh1106" +#define WIDTH 128 +#define HEIGHT 64 + +/* Init sequence based on the Adafruit SSD1306 Arduino library */ +static int init_display(struct fbtft_par *par) +{ + if (!par->info->var.xres || par->info->var.xres > WIDTH || + !par->info->var.yres || par->info->var.yres > HEIGHT || + par->info->var.yres % 8) { + dev_err(par->info->device, "Invalid screen size\n"); + return -EINVAL; + } + + if (par->info->var.rotate) { + dev_err(par->info->device, "Display rotation not supported\n"); + return -EINVAL; + } + + par->fbtftops.reset(par); + + /* Set Display OFF */ + write_reg(par, 0xAE); + + /* Set Display Clock Divide Ratio/ Oscillator Frequency */ + write_reg(par, 0xD5, 0x80); + + /* Set Multiplex Ratio */ + write_reg(par, 0xA8, par->info->var.yres - 1); + + /* Set Display Offset */ + write_reg(par, 0xD3, 0x00); + + /* Set Display Start Line */ + write_reg(par, 0x40 | 0x0); + + /* Set Segment Re-map */ + /* column address 127 is mapped to SEG0 */ + write_reg(par, 0xA0 | 0x1); + + /* Set COM Output Scan Direction */ + /* remapped mode. Scan from COM[N-1] to COM0 */ + write_reg(par, 0xC8); + + /* Set COM Pins Hardware Configuration */ + if (par->info->var.yres == 64) + /* A[4]=1b, Alternative COM pin configuration */ + write_reg(par, 0xDA, 0x12); + else if (par->info->var.yres == 48) + /* A[4]=1b, Alternative COM pin configuration */ + write_reg(par, 0xDA, 0x12); + else + /* A[4]=0b, Sequential COM pin configuration */ + write_reg(par, 0xDA, 0x02); + + /* Set Pre-charge Period */ + write_reg(par, 0xD9, 0xF1); + + /* Set VCOMH Deselect Level */ + write_reg(par, 0xDB, 0x40); + + /* Set Display ON */ + write_reg(par, 0xAF); + + msleep(150); + + return 0; +} + +static void set_addr_win(struct fbtft_par *par, int xs, int ys, int xe, int ye) +{ +} + +static int blank(struct fbtft_par *par, bool on) +{ + fbtft_par_dbg(DEBUG_BLANK, par, "%s(blank=%s)\n", + __func__, on ? "true" : "false"); + + write_reg(par, on ? 0xAE : 0xAF); + + return 0; +} + +/* Gamma is used to control Contrast */ +static int set_gamma(struct fbtft_par *par, u32 *curves) +{ + /* apply mask */ + curves[0] &= 0xFF; + + /* Set Contrast Control for BANK0 */ + write_reg(par, 0x81, curves[0]); + + return 0; +} + +static int write_vmem(struct fbtft_par *par, size_t offset, size_t len) +{ + u16 *vmem16 = (u16 *)par->info->screen_buffer; + u32 xres = par->info->var.xres; + int page, page_start, page_end, x, i, ret; + u8 *buf = par->txbuf.buf; + + /* offset refers to vmem with 2 bytes element size */ + page_start = offset / (8 * 2 * xres); + page_end = DIV_ROUND_UP(offset + len, 8 * 2 * xres); + + for (page = page_start; page < page_end; page++) { + /* set page and set column to 2 because of vidmem width 132 */ + write_reg(par, 0xb0 | page, 0x00 | 2, 0x10 | 0); + + memset(buf, 0, xres); + for (x = 0; x < xres; x++) + for (i = 0; i < 8; i++) + if (vmem16[(page * 8 + i) * xres + x]) + buf[x] |= BIT(i); + + /* Write data */ + ret = fbtft_write_buf_dc(par, buf, xres, 1); + if (ret < 0) + return ret; + } + + return 0; +} + +static void write_register(struct fbtft_par *par, int len, ...) +{ + va_list args; + int i; + + va_start(args, len); + + for (i = 0; i < len; i++) + par->buf[i] = va_arg(args, unsigned int); + + /* keep DC low for all command bytes to transfer */ + fbtft_write_buf_dc(par, par->buf, len, 0); + + va_end(args); +} + +static struct fbtft_display display = { + .regwidth = 8, + .width = WIDTH, + .height = HEIGHT, + .txbuflen = WIDTH, + .gamma_num = 1, + .gamma_len = 1, + /* set default contrast to 0xcd = 80% */ + .gamma = "cd", + .fbtftops = { + .write_vmem = write_vmem, + .write_register = write_register, + .init_display = init_display, + .set_addr_win = set_addr_win, + .blank = blank, + .set_gamma = set_gamma, + }, +}; + +FBTFT_REGISTER_DRIVER(DRVNAME, "sinowealth,sh1106", &display); + +MODULE_ALIAS("spi:" DRVNAME); +MODULE_ALIAS("platform:" DRVNAME); +MODULE_ALIAS("spi:sh1106"); +MODULE_ALIAS("platform:sh1106"); + +MODULE_DESCRIPTION("SH1106 OLED Driver"); +MODULE_AUTHOR("Heiner Kallweit"); +MODULE_LICENSE("GPL"); diff --git a/drivers/staging/fbtft/fb_ssd1289.c b/drivers/staging/fbtft/fb_ssd1289.c index c603e15..129e175 100644 --- a/drivers/staging/fbtft/fb_ssd1289.c +++ b/drivers/staging/fbtft/fb_ssd1289.c @@ -47,7 +47,7 @@ static int init_display(struct fbtft_par *par) write_reg(par, 0x0E, 0x2B00); write_reg(par, 0x1E, 0x00B7); write_reg(par, 0x01, - (1 << 13) | (par->bgr << 11) | (1 << 9) | (HEIGHT - 1)); + BIT(13) | (par->bgr << 11) | BIT(9) | (HEIGHT - 1)); write_reg(par, 0x02, 0x0600); write_reg(par, 0x10, 0x0000); write_reg(par, 0x05, 0x0000); diff --git a/drivers/staging/fbtft/fb_ssd1331.c b/drivers/staging/fbtft/fb_ssd1331.c index 26f24e3..9aa9864 100644 --- a/drivers/staging/fbtft/fb_ssd1331.c +++ b/drivers/staging/fbtft/fb_ssd1331.c @@ -130,16 +130,16 @@ static int set_gamma(struct fbtft_par *par, u32 *curves) for (i = 0; i < 63; i++) { if (i > 0 && curves[i] < 2) { dev_err(par->info->device, - "Illegal value in Grayscale Lookup Table at index %d. " \ - "Must be greater than 1\n", i); + "Illegal value in Grayscale Lookup Table at index %d. Must be greater than 1\n", + i); return -EINVAL; } acc += curves[i]; tmp[i] = acc; if (acc > 180) { dev_err(par->info->device, - "Illegal value(s) in Grayscale Lookup Table. " \ - "At index=%d, the accumulated value has exceeded 180\n", i); + "Illegal value(s) in Grayscale Lookup Table. At index=%d, the accumulated value has exceeded 180\n", + i); return -EINVAL; } } diff --git a/drivers/staging/fbtft/fb_st7735r.c b/drivers/staging/fbtft/fb_st7735r.c index 24d17cd..d98522a 100644 --- a/drivers/staging/fbtft/fb_st7735r.c +++ b/drivers/staging/fbtft/fb_st7735r.c @@ -25,7 +25,7 @@ #define DEFAULT_GAMMA "0F 1A 0F 18 2F 28 20 22 1F 1B 23 37 00 07 02 10\n" \ "0F 1B 0F 17 33 2C 29 2E 30 30 39 3F 00 07 03 10" -static s16 default_init_sequence[] = { +static const s16 default_init_sequence[] = { -1, MIPI_DCS_SOFT_RESET, -2, 150, /* delay */ diff --git a/drivers/staging/fbtft/fb_watterott.c b/drivers/staging/fbtft/fb_watterott.c index 4293045..180e5be 100644 --- a/drivers/staging/fbtft/fb_watterott.c +++ b/drivers/staging/fbtft/fb_watterott.c @@ -69,8 +69,8 @@ static int write_vmem(struct fbtft_par *par, size_t offset, size_t len) { unsigned int start_line, end_line; u16 *vmem16 = (u16 *)(par->info->screen_buffer + offset); - u16 *pos = par->txbuf.buf + 1; - u16 *buf16 = par->txbuf.buf + 10; + __be16 *pos = par->txbuf.buf + 1; + __be16 *buf16 = par->txbuf.buf + 10; int i, j; int ret = 0; @@ -106,7 +106,7 @@ static int write_vmem_8bit(struct fbtft_par *par, size_t offset, size_t len) { unsigned int start_line, end_line; u16 *vmem16 = (u16 *)(par->info->screen_buffer + offset); - u16 *pos = par->txbuf.buf + 1; + __be16 *pos = par->txbuf.buf + 1; u8 *buf8 = par->txbuf.buf + 10; int i, j; int ret = 0; diff --git a/drivers/staging/fbtft/fbtft-bus.c b/drivers/staging/fbtft/fbtft-bus.c index ec45043..a80b5d1 100644 --- a/drivers/staging/fbtft/fbtft-bus.c +++ b/drivers/staging/fbtft/fbtft-bus.c @@ -36,14 +36,9 @@ void func(struct fbtft_par *par, int len, ...) \ } \ \ *buf = modifier((type)va_arg(args, unsigned int)); \ - if (par->gpio.dc != -1) \ - gpio_set_value(par->gpio.dc, 0); \ - ret = par->fbtftops.write(par, par->buf, sizeof(type) + offset); \ - if (ret < 0) { \ - va_end(args); \ - dev_err(par->info->device, "%s: write() failed and returned %d\n", __func__, ret); \ - return; \ - } \ + ret = fbtft_write_buf_dc(par, par->buf, sizeof(type) + offset, 0); \ + if (ret < 0) \ + goto out; \ len--; \ \ if (par->startbyte) \ @@ -51,19 +46,12 @@ void func(struct fbtft_par *par, int len, ...) \ \ if (len) { \ i = len; \ - while (i--) { \ + while (i--) \ *buf++ = modifier((type)va_arg(args, unsigned int)); \ - } \ - if (par->gpio.dc != -1) \ - gpio_set_value(par->gpio.dc, 1); \ - ret = par->fbtftops.write(par, par->buf, \ - len * (sizeof(type) + offset)); \ - if (ret < 0) { \ - va_end(args); \ - dev_err(par->info->device, "%s: write() failed and returned %d\n", __func__, ret); \ - return; \ - } \ + fbtft_write_buf_dc(par, par->buf, \ + len * (sizeof(type) + offset), 1); \ } \ +out: \ va_end(args); \ } \ EXPORT_SYMBOL(func); @@ -126,7 +114,7 @@ EXPORT_SYMBOL(fbtft_write_reg8_bus9); int fbtft_write_vmem16_bus8(struct fbtft_par *par, size_t offset, size_t len) { u16 *vmem16; - u16 *txbuf16 = par->txbuf.buf; + __be16 *txbuf16 = par->txbuf.buf; size_t remain; size_t to_copy; size_t tx_array_size; @@ -243,10 +231,7 @@ int fbtft_write_vmem16_bus16(struct fbtft_par *par, size_t offset, size_t len) vmem16 = (u16 *)(par->info->screen_buffer + offset); - if (par->gpio.dc != -1) - gpio_set_value(par->gpio.dc, 1); - /* no need for buffered write with 16-bit bus */ - return par->fbtftops.write(par, vmem16, len); + return fbtft_write_buf_dc(par, vmem16, len, 1); } EXPORT_SYMBOL(fbtft_write_vmem16_bus16); diff --git a/drivers/staging/fbtft/fbtft-core.c b/drivers/staging/fbtft/fbtft-core.c index 7c8af29..b742ee7 100644 --- a/drivers/staging/fbtft/fbtft-core.c +++ b/drivers/staging/fbtft/fbtft-core.c @@ -43,8 +43,23 @@ static unsigned long debug; module_param(debug, ulong, 0000); MODULE_PARM_DESC(debug, "override device debug level"); +int fbtft_write_buf_dc(struct fbtft_par *par, void *buf, size_t len, int dc) +{ + int ret; + + if (gpio_is_valid(par->gpio.dc)) + gpio_set_value(par->gpio.dc, dc); + + ret = par->fbtftops.write(par, buf, len); + if (ret < 0) + dev_err(par->info->device, + "write() failed and returned %d\n", ret); + return ret; +} +EXPORT_SYMBOL(fbtft_write_buf_dc); + void fbtft_dbg_hex(const struct device *dev, int groupsize, - void *buf, size_t len, const char *fmt, ...) + void *buf, size_t len, const char *fmt, ...) { va_list args; static char textbuf[512]; @@ -56,7 +71,7 @@ void fbtft_dbg_hex(const struct device *dev, int groupsize, va_end(args); hex_dump_to_buffer(buf, len, 32, groupsize, text + text_len, - 512 - text_len, false); + 512 - text_len, false); if (len > 32) dev_info(dev, "%s ...\n", text); @@ -66,13 +81,13 @@ void fbtft_dbg_hex(const struct device *dev, int groupsize, EXPORT_SYMBOL(fbtft_dbg_hex); static unsigned long fbtft_request_gpios_match(struct fbtft_par *par, - const struct fbtft_gpio *gpio) + const struct fbtft_gpio *gpio) { int ret; long val; fbtft_par_dbg(DEBUG_REQUEST_GPIOS_MATCH, par, "%s('%s')\n", - __func__, gpio->name); + __func__, gpio->name); if (strcasecmp(gpio->name, "reset") == 0) { par->gpio.reset = gpio->gpio; @@ -141,8 +156,8 @@ static int fbtft_request_gpios(struct fbtft_par *par) return ret; } fbtft_par_dbg(DEBUG_REQUEST_GPIOS, par, - "%s: '%s' = GPIO%d\n", - __func__, gpio->name, gpio->gpio); + "%s: '%s' = GPIO%d\n", + __func__, gpio->name, gpio->gpio); } gpio++; } @@ -175,7 +190,7 @@ static int fbtft_request_one_gpio(struct fbtft_par *par, flags = (of_flags & OF_GPIO_ACTIVE_LOW) ? GPIOF_OUT_INIT_LOW : GPIOF_OUT_INIT_HIGH; ret = devm_gpio_request_one(dev, gpio, flags, - dev->driver->name); + dev->driver->name); if (ret) { dev_err(dev, "gpio_request_one('%s'=%d) failed with %d\n", @@ -185,7 +200,7 @@ static int fbtft_request_one_gpio(struct fbtft_par *par, if (gpiop) *gpiop = gpio; fbtft_par_dbg(DEBUG_REQUEST_GPIOS, par, "%s: '%s' = GPIO%d\n", - __func__, name, gpio); + __func__, name, gpio); } return ret; @@ -219,15 +234,15 @@ static int fbtft_request_gpios_dt(struct fbtft_par *par) return ret; for (i = 0; i < 16; i++) { ret = fbtft_request_one_gpio(par, "db-gpios", i, - &par->gpio.db[i]); + &par->gpio.db[i]); if (ret) return ret; ret = fbtft_request_one_gpio(par, "led-gpios", i, - &par->gpio.led[i]); + &par->gpio.led[i]); if (ret) return ret; ret = fbtft_request_one_gpio(par, "aux-gpios", i, - &par->gpio.aux[i]); + &par->gpio.aux[i]); if (ret) return ret; } @@ -282,7 +297,7 @@ void fbtft_register_backlight(struct fbtft_par *par) if (par->gpio.led[0] == -1) { fbtft_par_dbg(DEBUG_BACKLIGHT, par, - "%s(): led pin not set, exiting.\n", __func__); + "%s(): led pin not set, exiting.\n", __func__); return; } @@ -348,8 +363,8 @@ static void fbtft_update_display(struct fbtft_par *par, unsigned int start_line, if (unlikely(par->debug & (DEBUG_TIME_FIRST_UPDATE | DEBUG_TIME_EACH_UPDATE))) { if ((par->debug & DEBUG_TIME_EACH_UPDATE) || - ((par->debug & DEBUG_TIME_FIRST_UPDATE) && - !par->first_update_done)) { + ((par->debug & DEBUG_TIME_FIRST_UPDATE) && + !par->first_update_done)) { ts_start = ktime_get(); timeit = true; } @@ -374,7 +389,7 @@ static void fbtft_update_display(struct fbtft_par *par, unsigned int start_line, } fbtft_par_dbg(DEBUG_UPDATE_DISPLAY, par, "%s(start_line=%u, end_line=%u)\n", - __func__, start_line, end_line); + __func__, start_line, end_line); if (par->fbtftops.set_addr_win) par->fbtftops.set_addr_win(par, 0, start_line, @@ -402,8 +417,8 @@ static void fbtft_update_display(struct fbtft_par *par, unsigned int start_line, throughput = throughput * 1000 / 1024; dev_info(par->info->device, - "Display update: %ld kB/s, fps=%ld\n", - throughput, fps); + "Display update: %ld kB/s, fps=%ld\n", + throughput, fps); par->first_update_done = true; } } @@ -556,7 +571,6 @@ static int fbtft_fb_setcolreg(unsigned int regno, unsigned int red, unsigned int ret = 0; } break; - } return ret; } @@ -659,7 +673,7 @@ struct fb_info *fbtft_framebuffer_alloc(struct fbtft_display *display, unsigned int bpp = display->bpp; unsigned int fps = display->fps; int vmem_size, i; - s16 *init_sequence = display->init_sequence; + const s16 *init_sequence = display->init_sequence; char *gamma = display->gamma; u32 *gamma_curves = NULL; @@ -957,16 +971,16 @@ int fbtft_register_framebuffer(struct fb_info *fb_info) fbtft_sysfs_init(par); - if (par->txbuf.buf) + if (par->txbuf.buf && par->txbuf.len >= 1024) sprintf(text1, ", %zu KiB buffer memory", par->txbuf.len >> 10); if (spi) sprintf(text2, ", spi%d.%d at %d MHz", spi->master->bus_num, spi->chip_select, spi->max_speed_hz / 1000000); dev_info(fb_info->dev, - "%s frame buffer, %dx%d, %d KiB video memory%s, fps=%lu%s\n", - fb_info->fix.id, fb_info->var.xres, fb_info->var.yres, - fb_info->fix.smem_len >> 10, text1, - HZ / fb_info->fbdefio->delay, text2); + "%s frame buffer, %dx%d, %d KiB video memory%s, fps=%lu%s\n", + fb_info->fix.id, fb_info->var.xres, fb_info->var.yres, + fb_info->fix.smem_len >> 10, text1, + HZ / fb_info->fbdefio->delay, text2); #ifdef CONFIG_FB_BACKLIGHT /* Turn on backlight if available */ @@ -1049,7 +1063,7 @@ static int fbtft_init_display_dt(struct fbtft_par *par) } /* make debug message */ fbtft_par_dbg(DEBUG_INIT_DISPLAY, par, - "init: write_register:\n"); + "init: write_register:\n"); for (j = 0; j < i; j++) fbtft_par_dbg(DEBUG_INIT_DISPLAY, par, "buf[%d] = %02X\n", j, buf[j]); @@ -1073,12 +1087,12 @@ static int fbtft_init_display_dt(struct fbtft_par *par) buf[60], buf[61], buf[62], buf[63]); } else if (val & FBTFT_OF_INIT_DELAY) { fbtft_par_dbg(DEBUG_INIT_DISPLAY, par, - "init: msleep(%u)\n", val & 0xFFFF); + "init: msleep(%u)\n", val & 0xFFFF); msleep(val & 0xFFFF); p = of_prop_next_u32(prop, p, &val); } else { dev_err(par->info->device, "illegal init value 0x%X\n", - val); + val); return -EINVAL; } } @@ -1153,8 +1167,8 @@ int fbtft_init_display(struct fbtft_par *par) j++; } fbtft_par_dbg(DEBUG_INIT_DISPLAY, par, - "init: write(0x%02X) %s\n", - par->init_sequence[i], msg); + "init: write(0x%02X) %s\n", + par->init_sequence[i], msg); /* Write */ j = 0; @@ -1447,7 +1461,7 @@ int fbtft_remove_common(struct device *dev, struct fb_info *info) par = info->par; if (par) fbtft_par_dbg(DEBUG_DRIVER_INIT_FUNCTIONS, par, - "%s()\n", __func__); + "%s()\n", __func__); fbtft_unregister_framebuffer(info); fbtft_framebuffer_release(info); diff --git a/drivers/staging/fbtft/fbtft-sysfs.c b/drivers/staging/fbtft/fbtft-sysfs.c index 6b6fbaa..5bfd67b 100644 --- a/drivers/staging/fbtft/fbtft-sysfs.c +++ b/drivers/staging/fbtft/fbtft-sysfs.c @@ -17,7 +17,7 @@ static int get_next_ulong(char **str_p, unsigned long *val, char *sep, int base) } int fbtft_gamma_parse_str(struct fbtft_par *par, u32 *curves, - const char *str, int size) + const char *str, int size) { char *str_p, *curve_p = NULL; char *tmp; @@ -107,8 +107,8 @@ sprintf_gamma(struct fbtft_par *par, u32 *curves, char *buf) } static ssize_t store_gamma_curve(struct device *device, - struct device_attribute *attr, - const char *buf, size_t count) + struct device_attribute *attr, + const char *buf, size_t count) { struct fb_info *fb_info = dev_get_drvdata(device); struct fbtft_par *par = fb_info->par; @@ -125,7 +125,7 @@ static ssize_t store_gamma_curve(struct device *device, mutex_lock(&par->gamma.lock); memcpy(par->gamma.curves, tmp_curves, - par->gamma.num_curves * par->gamma.num_values * sizeof(tmp_curves[0])); + par->gamma.num_curves * par->gamma.num_values * sizeof(tmp_curves[0])); mutex_unlock(&par->gamma.lock); return count; @@ -172,8 +172,8 @@ void fbtft_expand_debug_value(unsigned long *debug) } static ssize_t store_debug(struct device *device, - struct device_attribute *attr, - const char *buf, size_t count) + struct device_attribute *attr, + const char *buf, size_t count) { struct fb_info *fb_info = dev_get_drvdata(device); struct fbtft_par *par = fb_info->par; @@ -188,7 +188,7 @@ static ssize_t store_debug(struct device *device, } static ssize_t show_debug(struct device *device, - struct device_attribute *attr, char *buf) + struct device_attribute *attr, char *buf) { struct fb_info *fb_info = dev_get_drvdata(device); struct fbtft_par *par = fb_info->par; @@ -196,7 +196,7 @@ static ssize_t show_debug(struct device *device, return snprintf(buf, PAGE_SIZE, "%lu\n", par->debug); } -static struct device_attribute debug_device_attr = \ +static struct device_attribute debug_device_attr = __ATTR(debug, 0660, show_debug, store_debug); void fbtft_sysfs_init(struct fbtft_par *par) diff --git a/drivers/staging/fbtft/fbtft.h b/drivers/staging/fbtft/fbtft.h index 44cf94d..488ab78 100644 --- a/drivers/staging/fbtft/fbtft.h +++ b/drivers/staging/fbtft/fbtft.h @@ -124,7 +124,7 @@ struct fbtft_display { unsigned int bpp; unsigned int fps; int txbuflen; - s16 *init_sequence; + const s16 *init_sequence; char *gamma; int gamma_num; int gamma_len; @@ -228,7 +228,7 @@ struct fbtft_par { int led[16]; int aux[16]; } gpio; - s16 *init_sequence; + const s16 *init_sequence; struct { struct mutex lock; u32 *curves; @@ -248,6 +248,7 @@ struct fbtft_par { par->fbtftops.write_register(par, NUMARGS(__VA_ARGS__), __VA_ARGS__) /* fbtft-core.c */ +int fbtft_write_buf_dc(struct fbtft_par *par, void *buf, size_t len, int dc); void fbtft_dbg_hex(const struct device *dev, int groupsize, void *buf, size_t len, const char *fmt, ...); struct fb_info *fbtft_framebuffer_alloc(struct fbtft_display *display, diff --git a/drivers/staging/fbtft/fbtft_device.c b/drivers/staging/fbtft/fbtft_device.c index 9ffb9ce..0d97473 100644 --- a/drivers/staging/fbtft/fbtft_device.c +++ b/drivers/staging/fbtft/fbtft_device.c @@ -131,7 +131,7 @@ static void adafruit18_green_tab_set_addr_win(struct fbtft_par *par, "D0 00 14 15 13 2C 42 43 4E 09 16 14 18 21\n" \ "D0 00 14 15 13 0B 43 55 53 0C 17 14 23 20" -static s16 cberry28_init_sequence[] = { +static const s16 cberry28_init_sequence[] = { /* turn off sleep mode */ -1, MIPI_DCS_EXIT_SLEEP_MODE, -2, 120, @@ -180,7 +180,7 @@ static s16 cberry28_init_sequence[] = { -3, }; -static s16 hy28b_init_sequence[] = { +static const s16 hy28b_init_sequence[] = { -1, 0x00e7, 0x0010, -1, 0x0000, 0x0001, -1, 0x0001, 0x0100, -1, 0x0002, 0x0700, -1, 0x0003, 0x1030, -1, 0x0004, 0x0000, @@ -211,7 +211,7 @@ static s16 hy28b_init_sequence[] = { "04 1F 4 7 7 0 7 7 6 0\n" \ "0F 00 1 7 4 0 0 0 6 7" -static s16 pitft_init_sequence[] = { +static const s16 pitft_init_sequence[] = { -1, MIPI_DCS_SOFT_RESET, -2, 5, -1, MIPI_DCS_SET_DISPLAY_OFF, @@ -242,7 +242,7 @@ static s16 pitft_init_sequence[] = { -3 }; -static s16 waveshare32b_init_sequence[] = { +static const s16 waveshare32b_init_sequence[] = { -1, 0xCB, 0x39, 0x2C, 0x00, 0x34, 0x02, -1, 0xCF, 0x00, 0xC1, 0x30, -1, 0xE8, 0x85, 0x00, 0x78, @@ -1448,11 +1448,10 @@ static int __init fbtft_device_init(void) if (fbtft_device_param_gpios[0].name[0]) gpio = fbtft_device_param_gpios; - if (verbose > 2) + if (verbose > 2) { pr_spi_devices(); /* print list of registered SPI devices */ - - if (verbose > 2) pr_p_devices(); /* print list of 'fb' platform devices */ + } pr_debug("name='%s', busnum=%d, cs=%d\n", name, busnum, cs); @@ -1483,13 +1482,19 @@ static int __init fbtft_device_init(void) displays[i].pdev->name = name; displays[i].spi = NULL; } else { - strncpy(displays[i].spi->modalias, name, SPI_NAME_SIZE); + size_t len; + + len = strlcpy(displays[i].spi->modalias, name, + SPI_NAME_SIZE); + if (len >= SPI_NAME_SIZE) + pr_warn("modalias (name) truncated to: %s\n", + displays[i].spi->modalias); displays[i].pdev = NULL; } } for (i = 0; i < ARRAY_SIZE(displays); i++) { - if (strncmp(name, displays[i].name, 32) == 0) { + if (strncmp(name, displays[i].name, SPI_NAME_SIZE) == 0) { if (displays[i].spi) { spi = displays[i].spi; spi->chip_select = cs; diff --git a/drivers/staging/fbtft/flexfb.c b/drivers/staging/fbtft/flexfb.c index af8422e..7134624 100644 --- a/drivers/staging/fbtft/flexfb.c +++ b/drivers/staging/fbtft/flexfb.c @@ -63,11 +63,11 @@ static bool latched; module_param(latched, bool, 0000); MODULE_PARM_DESC(latched, "Use with latched 16-bit databus"); -static s16 *initp; +static const s16 *initp; static int initp_num; /* default init sequences */ -static s16 st7735r_init[] = { +static const s16 st7735r_init[] = { -1, 0x01, -2, 150, -1, 0x11, @@ -96,7 +96,7 @@ static s16 st7735r_init[] = { -3 }; -static s16 ssd1289_init[] = { +static const s16 ssd1289_init[] = { -1, 0x00, 0x0001, -1, 0x03, 0xA8A4, -1, 0x0C, 0x0000, @@ -142,7 +142,7 @@ static s16 ssd1289_init[] = { -3 }; -static s16 hx8340bn_init[] = { +static const s16 hx8340bn_init[] = { -1, 0xC1, 0xFF, 0x83, 0x40, -1, 0x11, -2, 150, @@ -162,7 +162,7 @@ static s16 hx8340bn_init[] = { -3 }; -static s16 ili9225_init[] = { +static const s16 ili9225_init[] = { -1, 0x0001, 0x011C, -1, 0x0002, 0x0100, -1, 0x0003, 0x1030, @@ -204,7 +204,7 @@ static s16 ili9225_init[] = { -3 }; -static s16 ili9320_init[] = { +static const s16 ili9320_init[] = { -1, 0x00E5, 0x8000, -1, 0x0000, 0x0001, -1, 0x0001, 0x0100, @@ -265,7 +265,7 @@ static s16 ili9320_init[] = { -3 }; -static s16 ili9325_init[] = { +static const s16 ili9325_init[] = { -1, 0x00E3, 0x3008, -1, 0x00E7, 0x0012, -1, 0x00EF, 0x1231, @@ -324,7 +324,7 @@ static s16 ili9325_init[] = { -3 }; -static s16 ili9341_init[] = { +static const s16 ili9341_init[] = { -1, 0x28, -2, 20, -1, 0xCF, 0x00, 0x83, 0x30, @@ -349,7 +349,7 @@ static s16 ili9341_init[] = { -3 }; -static s16 ssd1351_init[] = { +static const s16 ssd1351_init[] = { -1, 0xfd, 0x12, -1, 0xfd, 0xb1, -1, 0xae, @@ -390,7 +390,7 @@ struct flexfb_lcd_controller { unsigned int height; unsigned int setaddrwin; unsigned int regwidth; - s16 *init_seq; + const s16 *init_seq; int init_seq_sz; }; |