1 // SPDX-License-Identifier: GPL-2.0+ 2 /* 3 * FB driver for the ILI9481 LCD Controller 4 * 5 * Copyright (c) 2014 Petr Olivka 6 * Copyright (c) 2013 Noralf Tronnes 7 */ 8 9 #include <linux/module.h> 10 #include <linux/kernel.h> 11 #include <linux/init.h> 12 #include <linux/delay.h> 13 #include <video/mipi_display.h> 14 15 #include "fbtft.h" 16 17 #define DRVNAME "fb_ili9481" 18 #define WIDTH 320 19 #define HEIGHT 480 20 21 static const s16 default_init_sequence[] = { 22 /* SLP_OUT - Sleep out */ 23 -1, MIPI_DCS_EXIT_SLEEP_MODE, 24 -2, 50, 25 /* Power setting */ 26 -1, 0xD0, 0x07, 0x42, 0x18, 27 /* VCOM */ 28 -1, 0xD1, 0x00, 0x07, 0x10, 29 /* Power setting for norm. mode */ 30 -1, 0xD2, 0x01, 0x02, 31 /* Panel driving setting */ 32 -1, 0xC0, 0x10, 0x3B, 0x00, 0x02, 0x11, 33 /* Frame rate & inv. */ 34 -1, 0xC5, 0x03, 35 /* Pixel format */ 36 -1, MIPI_DCS_SET_PIXEL_FORMAT, 0x55, 37 /* Gamma */ 38 -1, 0xC8, 0x00, 0x32, 0x36, 0x45, 0x06, 0x16, 39 0x37, 0x75, 0x77, 0x54, 0x0C, 0x00, 40 /* DISP_ON */ 41 -1, MIPI_DCS_SET_DISPLAY_ON, 42 -3 43 }; 44 45 static void set_addr_win(struct fbtft_par *par, int xs, int ys, int xe, int ye) 46 { 47 write_reg(par, MIPI_DCS_SET_COLUMN_ADDRESS, 48 xs >> 8, xs & 0xff, xe >> 8, xe & 0xff); 49 50 write_reg(par, MIPI_DCS_SET_PAGE_ADDRESS, 51 ys >> 8, ys & 0xff, ye >> 8, ye & 0xff); 52 53 write_reg(par, MIPI_DCS_WRITE_MEMORY_START); 54 } 55 56 #define HFLIP 0x01 57 #define VFLIP 0x02 58 #define ROW_X_COL 0x20 59 static int set_var(struct fbtft_par *par) 60 { 61 switch (par->info->var.rotate) { 62 case 270: 63 write_reg(par, MIPI_DCS_SET_ADDRESS_MODE, 64 ROW_X_COL | HFLIP | VFLIP | (par->bgr << 3)); 65 break; 66 case 180: 67 write_reg(par, MIPI_DCS_SET_ADDRESS_MODE, 68 VFLIP | (par->bgr << 3)); 69 break; 70 case 90: 71 write_reg(par, MIPI_DCS_SET_ADDRESS_MODE, 72 ROW_X_COL | (par->bgr << 3)); 73 break; 74 default: 75 write_reg(par, MIPI_DCS_SET_ADDRESS_MODE, 76 HFLIP | (par->bgr << 3)); 77 break; 78 } 79 80 return 0; 81 } 82 83 static struct fbtft_display display = { 84 .regwidth = 8, 85 .width = WIDTH, 86 .height = HEIGHT, 87 .init_sequence = default_init_sequence, 88 .fbtftops = { 89 .set_addr_win = set_addr_win, 90 .set_var = set_var, 91 }, 92 }; 93 94 FBTFT_REGISTER_DRIVER(DRVNAME, "ilitek,ili9481", &display); 95 96 MODULE_ALIAS("spi:" DRVNAME); 97 MODULE_ALIAS("platform:" DRVNAME); 98 MODULE_ALIAS("spi:ili9481"); 99 MODULE_ALIAS("platform:ili9481"); 100 101 MODULE_DESCRIPTION("FB driver for the ILI9481 LCD Controller"); 102 MODULE_AUTHOR("Petr Olivka"); 103 MODULE_LICENSE("GPL"); 104