22 #include <linux/module.h>
23 #include <linux/kernel.h>
26 #include <linux/device.h>
31 #include <linux/wait.h>
36 #include <linux/slab.h>
40 #include <asm/div64.h>
42 #define DRIVER_NAME "da8xx_lcdc"
44 #define LCD_VERSION_1 1
45 #define LCD_VERSION_2 2
48 #define LCD_END_OF_FRAME1 BIT(9)
49 #define LCD_END_OF_FRAME0 BIT(8)
50 #define LCD_PL_LOAD_DONE BIT(6)
51 #define LCD_FIFO_UNDERFLOW BIT(5)
52 #define LCD_SYNC_LOST BIT(2)
53 #define LCD_FRAME_DONE BIT(0)
56 #define LCD_DMA_BURST_SIZE(x) ((x) << 4)
57 #define LCD_DMA_BURST_1 0x0
58 #define LCD_DMA_BURST_2 0x1
59 #define LCD_DMA_BURST_4 0x2
60 #define LCD_DMA_BURST_8 0x3
61 #define LCD_DMA_BURST_16 0x4
62 #define LCD_V1_END_OF_FRAME_INT_ENA BIT(2)
63 #define LCD_V2_END_OF_FRAME0_INT_ENA BIT(8)
64 #define LCD_V2_END_OF_FRAME1_INT_ENA BIT(9)
65 #define LCD_DUAL_FRAME_BUFFER_ENABLE BIT(0)
68 #define LCD_CLK_DIVISOR(x) ((x) << 8)
69 #define LCD_RASTER_MODE 0x01
72 #define LCD_PALETTE_LOAD_MODE(x) ((x) << 20)
73 #define PALETTE_AND_DATA 0x00
74 #define PALETTE_ONLY 0x01
75 #define DATA_ONLY 0x02
77 #define LCD_MONO_8BIT_MODE BIT(9)
78 #define LCD_RASTER_ORDER BIT(8)
79 #define LCD_TFT_MODE BIT(7)
80 #define LCD_V1_UNDERFLOW_INT_ENA BIT(6)
81 #define LCD_V2_UNDERFLOW_INT_ENA BIT(5)
82 #define LCD_V1_PL_INT_ENA BIT(4)
83 #define LCD_V2_PL_INT_ENA BIT(6)
84 #define LCD_MONOCHROME_MODE BIT(1)
85 #define LCD_RASTER_ENABLE BIT(0)
86 #define LCD_TFT_ALT_ENABLE BIT(23)
87 #define LCD_STN_565_ENABLE BIT(24)
88 #define LCD_V2_DMA_CLK_EN BIT(2)
89 #define LCD_V2_LIDD_CLK_EN BIT(1)
90 #define LCD_V2_CORE_CLK_EN BIT(0)
91 #define LCD_V2_LPP_B10 26
92 #define LCD_V2_TFT_24BPP_MODE BIT(25)
93 #define LCD_V2_TFT_24BPP_UNPACK BIT(26)
96 #define LCD_AC_BIAS_TRANSITIONS_PER_INT(x) ((x) << 16)
97 #define LCD_AC_BIAS_FREQUENCY(x) ((x) << 8)
98 #define LCD_SYNC_CTRL BIT(25)
99 #define LCD_SYNC_EDGE BIT(24)
100 #define LCD_INVERT_PIXEL_CLOCK BIT(22)
101 #define LCD_INVERT_LINE_CLOCK BIT(21)
102 #define LCD_INVERT_FRAME_CLOCK BIT(20)
105 #define LCD_PID_REG 0x0
106 #define LCD_CTRL_REG 0x4
107 #define LCD_STAT_REG 0x8
108 #define LCD_RASTER_CTRL_REG 0x28
109 #define LCD_RASTER_TIMING_0_REG 0x2C
110 #define LCD_RASTER_TIMING_1_REG 0x30
111 #define LCD_RASTER_TIMING_2_REG 0x34
112 #define LCD_DMA_CTRL_REG 0x40
113 #define LCD_DMA_FRM_BUF_BASE_ADDR_0_REG 0x44
114 #define LCD_DMA_FRM_BUF_CEILING_ADDR_0_REG 0x48
115 #define LCD_DMA_FRM_BUF_BASE_ADDR_1_REG 0x4C
116 #define LCD_DMA_FRM_BUF_CEILING_ADDR_1_REG 0x50
119 #define LCD_RAW_STAT_REG 0x58
120 #define LCD_MASKED_STAT_REG 0x5c
121 #define LCD_INT_ENABLE_SET_REG 0x60
122 #define LCD_INT_ENABLE_CLR_REG 0x64
123 #define LCD_END_OF_INT_IND_REG 0x68
126 #define LCD_CLK_ENABLE_REG 0x6c
127 #define LCD_CLK_RESET_REG 0x70
128 #define LCD_CLK_MAIN_RESET BIT(3)
130 #define LCD_NUM_BUFFERS 2
132 #define WSI_TIMEOUT 50
133 #define PALETTE_SIZE 256
134 #define LEFT_MARGIN 64
135 #define RIGHT_MARGIN 64
136 #define UPPER_MARGIN 32
137 #define LOWER_MARGIN 32
139 static void __iomem *da8xx_fb_reg_base;
141 static unsigned int lcd_revision;
144 static int frame_done_flag;
146 static inline unsigned int lcdc_read(
unsigned int addr)
148 return (
unsigned int)
__raw_readl(da8xx_fb_reg_base + (addr));
151 static inline void lcdc_write(
unsigned int val,
unsigned int addr)
179 #ifdef CONFIG_CPU_FREQ
181 unsigned int lcd_fck_rate;
206 .id =
"DA8xx FB Drv",
233 .name =
"Sharp_LCD035Q3DG01",
247 .name =
"Sharp_LK043T1DG01",
276 static inline void lcd_enable_raster(
void)
298 static inline void lcd_disable_raster(
bool wait_for_frame_done)
310 if ((wait_for_frame_done ==
true) && (lcd_revision ==
LCD_VERSION_2)) {
313 frame_done_flag != 0,
316 pr_err(
"LCD Controller timed out\n");
320 static void lcd_blit(
int load_mode,
struct da8xx_fb_par *par)
330 reg_ras &= ~(3 << 20);
383 static int lcd_cfg_dma(
int burst_size,
int fifo_th)
388 switch (burst_size) {
408 reg |= (fifo_th << 8);
415 static void lcd_cfg_ac_bias(
int period,
int transitions_per_int)
426 static void lcd_cfg_horizontal_sync(
int back_porch,
int pulse_width,
432 reg |= ((back_porch & 0xff) << 24)
433 | ((front_porch & 0xff) << 16)
434 | ((pulse_width & 0x3f) << 10);
438 static void lcd_cfg_vertical_sync(
int back_porch,
int pulse_width,
444 reg |= ((back_porch & 0xff) << 24)
445 | ((front_porch & 0xff) << 16)
446 | ((pulse_width & 0x3f) << 10);
545 reg |= ((width >> 4) - 1) << 4;
547 width = (width >> 4) - 1;
548 reg |= ((width & 0x3f) << 4) | ((width & 0x40) >> 3);
555 reg = ((height - 1) & 0x3ff) | (reg & 0xfffffc00);
561 reg |= ((height - 1) & 0x400) << 16;
597 #define CNVT_TOHW(val, width) ((((val) << (width)) + 0x7FFF - (val)) >> 16)
598 static int fb_setcolreg(
unsigned regno,
unsigned red,
unsigned green,
616 switch (info->
fix.visual) {
623 switch (info->
var.bits_per_pixel) {
628 if (info->
var.grayscale) {
636 pal |= green & 0x00f0;
637 pal |= blue & 0x000f;
641 palette[regno] =
pal;
649 pal = (red & 0x0f00);
650 pal |= (green & 0x00f0);
651 pal |= (blue & 0x000f);
653 if (palette[regno] !=
pal) {
655 palette[regno] =
pal;
669 v = (red << info->
var.red.offset) |
670 (green << info->
var.green.offset) |
671 (blue << info->
var.blue.offset);
673 switch (info->
var.bits_per_pixel) {
682 if (palette[0] != 0x4000) {
699 lcd_disable_raster(
false);
713 static void lcd_calc_clk_divider(
struct da8xx_fb_par *par)
715 unsigned int lcd_clk,
div;
739 lcd_calc_clk_divider(par);
757 lcd_cfg_vertical_sync(panel->
vbp, panel->
vsw, panel->
vfp);
758 lcd_cfg_horizontal_sync(panel->
hbp, panel->
hsw, panel->
hfp);
761 ret = lcd_cfg_display(cfg);
775 ret = lcd_cfg_frame_buffer(par, (
unsigned int)panel->
width,
776 (
unsigned int)panel->
height, bpp,
795 lcd_disable_raster(
false);
805 lcd_disable_raster(
false);
851 static irqreturn_t lcdc_irq_handler_rev01(
int irq,
void *arg)
857 if ((stat & LCD_SYNC_LOST) && (stat & LCD_FIFO_UNDERFLOW)) {
858 lcd_disable_raster(
false);
861 }
else if (stat & LCD_PL_LOAD_DONE) {
868 lcd_disable_raster(
false);
882 if (stat & LCD_END_OF_FRAME0) {
892 if (stat & LCD_END_OF_FRAME1) {
919 var->
green.offset = 0;
920 var->
green.length = 8;
921 var->
blue.offset = 0;
922 var->
blue.length = 8;
930 var->
green.offset = 0;
931 var->
green.length = 4;
932 var->
blue.offset = 0;
933 var->
blue.length = 4;
939 var->
red.offset = 11;
941 var->
green.offset = 5;
942 var->
green.length = 6;
943 var->
blue.offset = 0;
944 var->
blue.length = 5;
950 var->
red.offset = 16;
952 var->
green.offset = 8;
953 var->
green.length = 8;
954 var->
blue.offset = 0;
955 var->
blue.length = 8;
961 var->
red.offset = 16;
963 var->
green.offset = 8;
964 var->
green.length = 8;
965 var->
blue.offset = 0;
966 var->
blue.length = 8;
973 var->
red.msb_right = 0;
974 var->
green.msb_right = 0;
975 var->
blue.msb_right = 0;
976 var->
transp.msb_right = 0;
980 #ifdef CONFIG_CPU_FREQ
981 static int lcd_da8xx_cpufreq_transition(
struct notifier_block *nb,
982 unsigned long val,
void *
data)
990 lcd_disable_raster(
true);
991 lcd_calc_clk_divider(par);
1000 static inline int lcd_da8xx_cpufreq_register(
struct da8xx_fb_par *par)
1002 par->freq_transition.notifier_call = lcd_da8xx_cpufreq_transition;
1008 static inline void lcd_da8xx_cpufreq_deregister(
struct da8xx_fb_par *par)
1022 #ifdef CONFIG_CPU_FREQ
1023 lcd_da8xx_cpufreq_deregister(par);
1028 lcd_disable_raster(
true);
1041 pm_runtime_put_sync(&dev->
dev);
1042 pm_runtime_disable(&dev->
dev);
1055 static int fb_wait_for_vsync(
struct fb_info *info)
1084 static int fb_ioctl(
struct fb_info *info,
unsigned int cmd,
1101 lcd_cfg_horizontal_sync(sync_arg.back_porch,
1102 sync_arg.pulse_width,
1103 sync_arg.front_porch);
1109 lcd_cfg_vertical_sync(sync_arg.back_porch,
1110 sync_arg.pulse_width,
1111 sync_arg.front_porch);
1114 return fb_wait_for_vsync(info);
1121 static int cfb_blank(
int blank,
struct fb_info *info)
1126 if (par->
blank == blank)
1132 lcd_enable_raster();
1144 lcd_disable_raster(
true);
1166 unsigned long irq_flags;
1170 memcpy(&new_var, &fbi->
var,
sizeof(new_var));
1171 new_var.xoffset = var->
xoffset;
1172 new_var.yoffset = var->
yoffset;
1173 if (fb_check_var(&new_var, fbi))
1176 memcpy(&fbi->
var, &new_var,
sizeof(new_var));
1180 new_var.xoffset * fbi->
var.bits_per_pixel / 8;
1205 static struct fb_ops da8xx_fb_ops = {
1209 .fb_pan_display = da8xx_pan_display,
1214 .fb_blank = cfb_blank,
1218 static unsigned int da8xxfb_pixel_clk_period(
struct da8xx_fb_par *par)
1220 unsigned int lcd_clk,
div;
1221 unsigned int configured_pix_clk;
1222 unsigned long long pix_clk_period_picosec = 1000000000000ULL;
1226 configured_pix_clk = (lcd_clk /
div);
1228 do_div(pix_clk_period_picosec, configured_pix_clk);
1230 return pix_clk_period_picosec;
1236 device->
dev.platform_data;
1239 struct fb_info *da8xx_fb_info;
1246 if (fb_pdata ==
NULL) {
1247 dev_err(&device->
dev,
"Can not get platform data\n");
1254 "Can not get memory resource for LCD controller\n");
1258 len = resource_size(lcdc_regs);
1265 if (!da8xx_fb_reg_base) {
1267 goto err_request_mem;
1271 if (IS_ERR(fb_clk)) {
1272 dev_err(&device->
dev,
"Can not get device clock\n");
1278 pm_runtime_get_sync(&device->
dev);
1289 dev_warn(&device->
dev,
"Unknown PID Reg value 0x%x, "
1290 "defaulting to LCD revision 1\n",
1296 for (i = 0, lcdc_info = known_lcd_panels;
1304 dev_err(&device->
dev,
"GLCD: No valid panel found\n");
1306 goto err_pm_runtime_disable;
1315 if (!da8xx_fb_info) {
1316 dev_dbg(&device->
dev,
"Memory allocation failed for fb_info\n");
1318 goto err_pm_runtime_disable;
1321 par = da8xx_fb_info->
par;
1323 #ifdef CONFIG_CPU_FREQ
1332 if (
lcd_init(par, lcd_cfg, lcdc_info) < 0) {
1335 goto err_release_fb;
1350 "GLCD: kmalloc for frame buffer failed\n");
1352 goto err_release_fb;
1356 da8xx_fb_fix.smem_start = par->
vram_phys;
1358 da8xx_fb_fix.line_length = (lcdc_info->
width * lcd_cfg->
bpp) / 8;
1362 da8xx_fb_fix.line_length - 1;
1372 "GLCD: kmalloc for palette buffer failed\n");
1374 goto err_release_fb_mem;
1381 goto err_release_pl_mem;
1385 da8xx_fb_info->
var.bits_per_pixel = lcd_cfg->
bpp;
1387 da8xx_fb_var.xres = lcdc_info->
width;
1388 da8xx_fb_var.xres_virtual = lcdc_info->
width;
1390 da8xx_fb_var.yres = lcdc_info->
height;
1393 da8xx_fb_var.grayscale =
1395 da8xx_fb_var.bits_per_pixel = lcd_cfg->
bpp;
1397 da8xx_fb_var.hsync_len = lcdc_info->
hsw;
1398 da8xx_fb_var.vsync_len = lcdc_info->
vsw;
1399 da8xx_fb_var.right_margin = lcdc_info->
hfp;
1400 da8xx_fb_var.left_margin = lcdc_info->
hbp;
1401 da8xx_fb_var.lower_margin = lcdc_info->
vfp;
1402 da8xx_fb_var.upper_margin = lcdc_info->
vbp;
1403 da8xx_fb_var.pixclock = da8xxfb_pixel_clk_period(par);
1407 da8xx_fb_info->
fix = da8xx_fb_fix;
1408 da8xx_fb_info->
var = da8xx_fb_var;
1409 da8xx_fb_info->
fbops = &da8xx_fb_ops;
1411 da8xx_fb_info->
fix.visual = (da8xx_fb_info->
var.bits_per_pixel <= 8) ?
1416 goto err_release_pl_mem;
1434 "GLCD: Frame Buffer Registration Failed!\n");
1436 goto err_dealloc_cmap;
1439 #ifdef CONFIG_CPU_FREQ
1440 ret = lcd_da8xx_cpufreq_register(par);
1442 dev_err(&device->
dev,
"failed to register cpufreq\n");
1448 lcdc_irq_handler = lcdc_irq_handler_rev01;
1451 lcdc_irq_handler = lcdc_irq_handler_rev02;
1461 #ifdef CONFIG_CPU_FREQ
1462 lcd_da8xx_cpufreq_deregister(par);
1480 err_pm_runtime_disable:
1481 pm_runtime_put_sync(&device->
dev);
1482 pm_runtime_disable(&device->
dev);
1494 struct lcdc_context {
1498 u32 raster_timing_0;
1499 u32 raster_timing_1;
1500 u32 raster_timing_2;
1502 u32 dma_frm_buf_base_addr_0;
1503 u32 dma_frm_buf_ceiling_addr_0;
1504 u32 dma_frm_buf_base_addr_1;
1505 u32 dma_frm_buf_ceiling_addr_1;
1509 static void lcd_context_save(
void)
1521 reg_context.dma_frm_buf_base_addr_0 =
1523 reg_context.dma_frm_buf_ceiling_addr_0 =
1525 reg_context.dma_frm_buf_base_addr_1 =
1527 reg_context.dma_frm_buf_ceiling_addr_1 =
1533 static void lcd_context_restore(
void)
1545 lcdc_write(reg_context.dma_frm_buf_base_addr_0,
1547 lcdc_write(reg_context.dma_frm_buf_ceiling_addr_0,
1549 lcdc_write(reg_context.dma_frm_buf_base_addr_1,
1551 lcdc_write(reg_context.dma_frm_buf_ceiling_addr_1,
1559 struct fb_info *info = platform_get_drvdata(dev);
1567 lcd_disable_raster(
true);
1569 pm_runtime_put_sync(&dev->
dev);
1576 struct fb_info *info = platform_get_drvdata(dev);
1580 pm_runtime_get_sync(&dev->
dev);
1581 lcd_context_restore();
1583 lcd_enable_raster();
1595 #define fb_suspend NULL
1596 #define fb_resume NULL
1610 static int __init da8xx_fb_init(
void)
1615 static void __exit da8xx_fb_cleanup(
void)