Lines Matching refs:fbi
83 static void set_ctrlr_state(struct pxafb_info *fbi, u_int state);
84 static void setup_base_frame(struct pxafb_info *fbi,
86 static int setup_frame_dma(struct pxafb_info *fbi, int dma, int pal,
92 lcd_readl(struct pxafb_info *fbi, unsigned int off) in lcd_readl() argument
94 return __raw_readl(fbi->mmio_base + off); in lcd_readl()
98 lcd_writel(struct pxafb_info *fbi, unsigned int off, unsigned long val) in lcd_writel() argument
100 __raw_writel(val, fbi->mmio_base + off); in lcd_writel()
103 static inline void pxafb_schedule_work(struct pxafb_info *fbi, u_int state) in pxafb_schedule_work() argument
118 if (fbi->task_state == C_ENABLE && state == C_REENABLE) in pxafb_schedule_work()
120 if (fbi->task_state == C_DISABLE && state == C_ENABLE) in pxafb_schedule_work()
124 fbi->task_state = state; in pxafb_schedule_work()
125 schedule_work(&fbi->task); in pxafb_schedule_work()
141 struct pxafb_info *fbi = container_of(info, struct pxafb_info, fb); in pxafb_setpalettereg() local
144 if (regno >= fbi->palette_size) in pxafb_setpalettereg()
147 if (fbi->fb.var.grayscale) { in pxafb_setpalettereg()
148 fbi->palette_cpu[regno] = ((blue >> 8) & 0x00ff); in pxafb_setpalettereg()
152 switch (fbi->lccr4 & LCCR4_PAL_FOR_MASK) { in pxafb_setpalettereg()
157 fbi->palette_cpu[regno] = val; in pxafb_setpalettereg()
163 ((u32 *)(fbi->palette_cpu))[regno] = val; in pxafb_setpalettereg()
169 ((u32 *)(fbi->palette_cpu))[regno] = val; in pxafb_setpalettereg()
175 ((u32 *)(fbi->palette_cpu))[regno] = val; in pxafb_setpalettereg()
186 struct pxafb_info *fbi = container_of(info, struct pxafb_info, fb); in pxafb_setcolreg() local
196 if (fbi->cmap_inverse) { in pxafb_setcolreg()
206 if (fbi->fb.var.grayscale) in pxafb_setcolreg()
210 switch (fbi->fb.fix.visual) { in pxafb_setcolreg()
217 u32 *pal = fbi->fb.pseudo_palette; in pxafb_setcolreg()
219 val = chan_to_field(red, &fbi->fb.var.red); in pxafb_setcolreg()
220 val |= chan_to_field(green, &fbi->fb.var.green); in pxafb_setcolreg()
221 val |= chan_to_field(blue, &fbi->fb.var.blue); in pxafb_setcolreg()
408 static int pxafb_adjust_timing(struct pxafb_info *fbi, in pxafb_adjust_timing() argument
416 if (!(fbi->lccr0 & LCCR0_LCDT)) { in pxafb_adjust_timing()
434 var->yres_virtual = fbi->fb.fix.smem_len / line_length; in pxafb_adjust_timing()
459 struct pxafb_info *fbi = container_of(info, struct pxafb_info, fb); in pxafb_check_var() local
460 struct pxafb_mach_info *inf = dev_get_platdata(fbi->dev); in pxafb_check_var()
479 err = pxafb_adjust_timing(fbi, var); in pxafb_check_var()
497 struct pxafb_info *fbi = container_of(info, struct pxafb_info, fb); in pxafb_set_par() local
501 fbi->fb.fix.visual = FB_VISUAL_TRUECOLOR; in pxafb_set_par()
502 else if (!fbi->cmap_static) in pxafb_set_par()
503 fbi->fb.fix.visual = FB_VISUAL_PSEUDOCOLOR; in pxafb_set_par()
510 fbi->fb.fix.visual = FB_VISUAL_STATIC_PSEUDOCOLOR; in pxafb_set_par()
513 fbi->fb.fix.line_length = var->xres_virtual * in pxafb_set_par()
516 fbi->palette_size = 0; in pxafb_set_par()
518 fbi->palette_size = var->bits_per_pixel == 1 ? in pxafb_set_par()
521 fbi->palette_cpu = (u16 *)&fbi->dma_buff->palette[0]; in pxafb_set_par()
523 if (fbi->fb.var.bits_per_pixel >= 16) in pxafb_set_par()
524 fb_dealloc_cmap(&fbi->fb.cmap); in pxafb_set_par()
526 fb_alloc_cmap(&fbi->fb.cmap, 1<<fbi->fb.var.bits_per_pixel, 0); in pxafb_set_par()
528 pxafb_activate_var(var, fbi); in pxafb_set_par()
536 struct pxafb_info *fbi = container_of(info, struct pxafb_info, fb); in pxafb_pan_display() local
540 if (fbi->state != C_ENABLE) in pxafb_pan_display()
546 memcpy(&newvar, &fbi->fb.var, sizeof(newvar)); in pxafb_pan_display()
552 setup_base_frame(fbi, &newvar, 1); in pxafb_pan_display()
554 if (fbi->lccr0 & LCCR0_SDS) in pxafb_pan_display()
555 lcd_writel(fbi, FBR1, fbi->fdadr[dma + 1] | 0x1); in pxafb_pan_display()
557 lcd_writel(fbi, FBR0, fbi->fdadr[dma] | 0x1); in pxafb_pan_display()
569 struct pxafb_info *fbi = container_of(info, struct pxafb_info, fb); in pxafb_blank() local
577 if (fbi->fb.fix.visual == FB_VISUAL_PSEUDOCOLOR || in pxafb_blank()
578 fbi->fb.fix.visual == FB_VISUAL_STATIC_PSEUDOCOLOR) in pxafb_blank()
579 for (i = 0; i < fbi->palette_size; i++) in pxafb_blank()
582 pxafb_schedule_work(fbi, C_DISABLE); in pxafb_blank()
588 if (fbi->fb.fix.visual == FB_VISUAL_PSEUDOCOLOR || in pxafb_blank()
589 fbi->fb.fix.visual == FB_VISUAL_STATIC_PSEUDOCOLOR) in pxafb_blank()
590 fb_set_cmap(&fbi->fb.cmap, info); in pxafb_blank()
591 pxafb_schedule_work(fbi, C_ENABLE); in pxafb_blank()
613 setup_frame_dma(ofb->fbi, DMA_OV1, PAL_NONE, start, size); in overlay1fb_setup()
621 int enabled = lcd_readl(ofb->fbi, OVL1C1) & OVLxC1_OEN; in overlay1fb_enable()
622 uint32_t fdadr1 = ofb->fbi->fdadr[DMA_OV1] | (enabled ? 0x1 : 0); in overlay1fb_enable()
624 lcd_writel(ofb->fbi, enabled ? FBR1 : FDADR1, fdadr1); in overlay1fb_enable()
625 lcd_writel(ofb->fbi, OVL1C2, ofb->control[1]); in overlay1fb_enable()
626 lcd_writel(ofb->fbi, OVL1C1, ofb->control[0] | OVLxC1_OEN); in overlay1fb_enable()
633 if (!(lcd_readl(ofb->fbi, OVL1C1) & OVLxC1_OEN)) in overlay1fb_disable()
636 lccr5 = lcd_readl(ofb->fbi, LCCR5); in overlay1fb_disable()
638 lcd_writel(ofb->fbi, OVL1C1, ofb->control[0] & ~OVLxC1_OEN); in overlay1fb_disable()
640 lcd_writel(ofb->fbi, LCSR1, LCSR1_BS(1)); in overlay1fb_disable()
641 lcd_writel(ofb->fbi, LCCR5, lccr5 & ~LCSR1_BS(1)); in overlay1fb_disable()
642 lcd_writel(ofb->fbi, FBR1, ofb->fbi->fdadr[DMA_OV1] | 0x3); in overlay1fb_disable()
647 lcd_writel(ofb->fbi, LCCR5, lccr5); in overlay1fb_disable()
657 setup_frame_dma(ofb->fbi, DMA_OV2_Y, -1, start[0], size); in overlay2fb_setup()
667 setup_frame_dma(ofb->fbi, DMA_OV2_Y, -1, start[0], size); in overlay2fb_setup()
668 setup_frame_dma(ofb->fbi, DMA_OV2_Cb, -1, start[1], size / div); in overlay2fb_setup()
669 setup_frame_dma(ofb->fbi, DMA_OV2_Cr, -1, start[2], size / div); in overlay2fb_setup()
676 int enabled = lcd_readl(ofb->fbi, OVL2C1) & OVLxC1_OEN; in overlay2fb_enable()
677 uint32_t fdadr2 = ofb->fbi->fdadr[DMA_OV2_Y] | (enabled ? 0x1 : 0); in overlay2fb_enable()
678 uint32_t fdadr3 = ofb->fbi->fdadr[DMA_OV2_Cb] | (enabled ? 0x1 : 0); in overlay2fb_enable()
679 uint32_t fdadr4 = ofb->fbi->fdadr[DMA_OV2_Cr] | (enabled ? 0x1 : 0); in overlay2fb_enable()
682 lcd_writel(ofb->fbi, enabled ? FBR2 : FDADR2, fdadr2); in overlay2fb_enable()
684 lcd_writel(ofb->fbi, enabled ? FBR2 : FDADR2, fdadr2); in overlay2fb_enable()
685 lcd_writel(ofb->fbi, enabled ? FBR3 : FDADR3, fdadr3); in overlay2fb_enable()
686 lcd_writel(ofb->fbi, enabled ? FBR4 : FDADR4, fdadr4); in overlay2fb_enable()
688 lcd_writel(ofb->fbi, OVL2C2, ofb->control[1]); in overlay2fb_enable()
689 lcd_writel(ofb->fbi, OVL2C1, ofb->control[0] | OVLxC1_OEN); in overlay2fb_enable()
696 if (!(lcd_readl(ofb->fbi, OVL2C1) & OVLxC1_OEN)) in overlay2fb_disable()
699 lccr5 = lcd_readl(ofb->fbi, LCCR5); in overlay2fb_disable()
701 lcd_writel(ofb->fbi, OVL2C1, ofb->control[0] & ~OVLxC1_OEN); in overlay2fb_disable()
703 lcd_writel(ofb->fbi, LCSR1, LCSR1_BS(2)); in overlay2fb_disable()
704 lcd_writel(ofb->fbi, LCCR5, lccr5 & ~LCSR1_BS(2)); in overlay2fb_disable()
705 lcd_writel(ofb->fbi, FBR2, ofb->fbi->fdadr[DMA_OV2_Y] | 0x3); in overlay2fb_disable()
706 lcd_writel(ofb->fbi, FBR3, ofb->fbi->fdadr[DMA_OV2_Cb] | 0x3); in overlay2fb_disable()
707 lcd_writel(ofb->fbi, FBR4, ofb->fbi->fdadr[DMA_OV2_Cr] | 0x3); in overlay2fb_disable()
737 fb_blank(&ofb->fbi->fb, FB_BLANK_UNBLANK); in overlayfb_open()
764 struct fb_var_screeninfo *base_var = &ofb->fbi->fb.var; in overlayfb_check_var()
872 static void init_pxafb_overlay(struct pxafb_info *fbi, struct pxafb_layer *ofb, in init_pxafb_overlay() argument
894 ofb->fbi = fbi; in init_pxafb_overlay()
930 static void pxafb_overlay_init(struct pxafb_info *fbi) in pxafb_overlay_init() argument
938 struct pxafb_layer *ofb = &fbi->overlay[i]; in pxafb_overlay_init()
939 init_pxafb_overlay(fbi, ofb, i); in pxafb_overlay_init()
942 dev_err(fbi->dev, "failed to register overlay %d\n", i); in pxafb_overlay_init()
945 ret = pxafb_overlay_map_video_memory(fbi, ofb); in pxafb_overlay_init()
947 dev_err(fbi->dev, in pxafb_overlay_init()
957 lcd_writel(fbi, LCCR5, ~0); in pxafb_overlay_init()
962 static void pxafb_overlay_exit(struct pxafb_info *fbi) in pxafb_overlay_exit() argument
970 struct pxafb_layer *ofb = &fbi->overlay[i]; in pxafb_overlay_exit()
980 static inline void pxafb_overlay_init(struct pxafb_info *fbi) {} in pxafb_overlay_init() argument
981 static inline void pxafb_overlay_exit(struct pxafb_info *fbi) {} in pxafb_overlay_exit() argument
1014 static inline unsigned int get_pcd(struct pxafb_info *fbi, in get_pcd() argument
1022 pcd = (unsigned long long)(clk_get_rate(fbi->clk) / 10000); in get_pcd()
1036 static inline void set_hsync_time(struct pxafb_info *fbi, unsigned int pcd) in set_hsync_time() argument
1040 if ((pcd == 0) || (fbi->fb.var.hsync_len == 0)) { in set_hsync_time()
1041 fbi->hsync_time = 0; in set_hsync_time()
1045 htime = clk_get_rate(fbi->clk) / (pcd * fbi->fb.var.hsync_len); in set_hsync_time()
1047 fbi->hsync_time = htime; in set_hsync_time()
1052 struct pxafb_info *fbi = dev_get_drvdata(dev); in pxafb_get_hsync_time() local
1055 if (!fbi || (fbi->state != C_ENABLE)) in pxafb_get_hsync_time()
1058 return fbi->hsync_time; in pxafb_get_hsync_time()
1062 static int setup_frame_dma(struct pxafb_info *fbi, int dma, int pal, in setup_frame_dma() argument
1071 dma_desc = &fbi->dma_buff->dma_desc[dma]; in setup_frame_dma()
1079 dma_desc->fdadr = fbi->dma_buff_phys + dma_desc_off; in setup_frame_dma()
1080 fbi->fdadr[dma] = fbi->dma_buff_phys + dma_desc_off; in setup_frame_dma()
1082 pal_desc = &fbi->dma_buff->pal_desc[pal]; in setup_frame_dma()
1085 pal_desc->fsadr = fbi->dma_buff_phys + pal * PALETTE_SIZE; in setup_frame_dma()
1088 if ((fbi->lccr4 & LCCR4_PAL_FOR_MASK) == LCCR4_PAL_FOR_0) in setup_frame_dma()
1089 pal_desc->ldcmd = fbi->palette_size * sizeof(u16); in setup_frame_dma()
1091 pal_desc->ldcmd = fbi->palette_size * sizeof(u32); in setup_frame_dma()
1096 pal_desc->fdadr = fbi->dma_buff_phys + dma_desc_off; in setup_frame_dma()
1097 dma_desc->fdadr = fbi->dma_buff_phys + pal_desc_off; in setup_frame_dma()
1098 fbi->fdadr[dma] = fbi->dma_buff_phys + dma_desc_off; in setup_frame_dma()
1104 static void setup_base_frame(struct pxafb_info *fbi, in setup_base_frame() argument
1108 struct fb_fix_screeninfo *fix = &fbi->fb.fix; in setup_base_frame()
1116 offset = fix->line_length * var->yoffset + fbi->video_mem_phys; in setup_base_frame()
1118 if (fbi->lccr0 & LCCR0_SDS) { in setup_base_frame()
1120 setup_frame_dma(fbi, dma + 1, PAL_NONE, offset + nbytes, nbytes); in setup_base_frame()
1123 setup_frame_dma(fbi, dma, pal, offset, nbytes); in setup_base_frame()
1127 static int setup_smart_dma(struct pxafb_info *fbi) in setup_smart_dma() argument
1132 dma_desc = &fbi->dma_buff->dma_desc[DMA_CMD]; in setup_smart_dma()
1136 dma_desc->fdadr = fbi->dma_buff_phys + dma_desc_off; in setup_smart_dma()
1137 dma_desc->fsadr = fbi->dma_buff_phys + cmd_buff_off; in setup_smart_dma()
1139 dma_desc->ldcmd = fbi->n_smart_cmds * sizeof(uint16_t); in setup_smart_dma()
1141 fbi->fdadr[DMA_CMD] = dma_desc->fdadr; in setup_smart_dma()
1147 struct pxafb_info *fbi = container_of(info, struct pxafb_info, fb); in pxafb_smart_flush() local
1152 lcd_writel(fbi, LCCR0, fbi->reg_lccr0 & ~LCCR0_ENB); in pxafb_smart_flush()
1159 while (fbi->n_smart_cmds & 1) in pxafb_smart_flush()
1160 fbi->smart_cmds[fbi->n_smart_cmds++] = SMART_CMD_NOOP; in pxafb_smart_flush()
1162 fbi->smart_cmds[fbi->n_smart_cmds++] = SMART_CMD_INTERRUPT; in pxafb_smart_flush()
1163 fbi->smart_cmds[fbi->n_smart_cmds++] = SMART_CMD_WAIT_FOR_VSYNC; in pxafb_smart_flush()
1164 setup_smart_dma(fbi); in pxafb_smart_flush()
1167 prsr = lcd_readl(fbi, PRSR) | PRSR_ST_OK | PRSR_CON_NT; in pxafb_smart_flush()
1168 lcd_writel(fbi, PRSR, prsr); in pxafb_smart_flush()
1171 lcd_writel(fbi, CMDCR, 0x0001); in pxafb_smart_flush()
1174 lcd_writel(fbi, LCCR5, LCCR5_IUM(6)); in pxafb_smart_flush()
1176 lcd_writel(fbi, LCCR1, fbi->reg_lccr1); in pxafb_smart_flush()
1177 lcd_writel(fbi, LCCR2, fbi->reg_lccr2); in pxafb_smart_flush()
1178 lcd_writel(fbi, LCCR3, fbi->reg_lccr3); in pxafb_smart_flush()
1179 lcd_writel(fbi, LCCR4, fbi->reg_lccr4); in pxafb_smart_flush()
1180 lcd_writel(fbi, FDADR0, fbi->fdadr[0]); in pxafb_smart_flush()
1181 lcd_writel(fbi, FDADR6, fbi->fdadr[6]); in pxafb_smart_flush()
1184 lcd_writel(fbi, LCCR0, fbi->reg_lccr0 | LCCR0_ENB); in pxafb_smart_flush()
1186 if (wait_for_completion_timeout(&fbi->command_done, HZ/2) == 0) { in pxafb_smart_flush()
1193 prsr = lcd_readl(fbi, PRSR) & ~(PRSR_ST_OK | PRSR_CON_NT); in pxafb_smart_flush()
1194 lcd_writel(fbi, PRSR, prsr); in pxafb_smart_flush()
1195 lcd_writel(fbi, LCCR0, fbi->reg_lccr0 & ~LCCR0_ENB); in pxafb_smart_flush()
1196 lcd_writel(fbi, FDADR6, 0); in pxafb_smart_flush()
1197 fbi->n_smart_cmds = 0; in pxafb_smart_flush()
1204 struct pxafb_info *fbi = container_of(info, struct pxafb_info, fb); in pxafb_smart_queue() local
1215 if (fbi->n_smart_cmds == CMD_BUFF_SIZE - 8) in pxafb_smart_queue()
1218 fbi->smart_cmds[fbi->n_smart_cmds++] = *cmds; in pxafb_smart_queue()
1230 static void setup_smart_timing(struct pxafb_info *fbi, in setup_smart_timing() argument
1233 struct pxafb_mach_info *inf = dev_get_platdata(fbi->dev); in setup_smart_timing()
1235 unsigned long lclk = clk_get_rate(fbi->clk); in setup_smart_timing()
1243 fbi->reg_lccr1 = in setup_smart_timing()
1249 fbi->reg_lccr2 = LCCR2_DisHght(var->yres); in setup_smart_timing()
1250 fbi->reg_lccr3 = fbi->lccr3 | LCCR3_PixClkDiv(__smart_timing(t4, lclk)); in setup_smart_timing()
1251 fbi->reg_lccr3 |= (var->sync & FB_SYNC_HOR_HIGH_ACT) ? LCCR3_HSP : 0; in setup_smart_timing()
1252 fbi->reg_lccr3 |= (var->sync & FB_SYNC_VERT_HIGH_ACT) ? LCCR3_VSP : 0; in setup_smart_timing()
1255 fbi->reg_cmdcr = 1; in setup_smart_timing()
1260 struct pxafb_info *fbi = arg; in pxafb_smart_thread() local
1261 struct pxafb_mach_info *inf = dev_get_platdata(fbi->dev); in pxafb_smart_thread()
1268 inf = dev_get_platdata(fbi->dev); in pxafb_smart_thread()
1278 mutex_lock(&fbi->ctrlr_lock); in pxafb_smart_thread()
1280 if (fbi->state == C_ENABLE) { in pxafb_smart_thread()
1281 inf->smart_update(&fbi->fb); in pxafb_smart_thread()
1282 complete(&fbi->refresh_done); in pxafb_smart_thread()
1285 mutex_unlock(&fbi->ctrlr_lock); in pxafb_smart_thread()
1295 static int pxafb_smart_init(struct pxafb_info *fbi) in pxafb_smart_init() argument
1297 if (!(fbi->lccr0 & LCCR0_LCDT)) in pxafb_smart_init()
1300 fbi->smart_cmds = (uint16_t *) fbi->dma_buff->cmd_buff; in pxafb_smart_init()
1301 fbi->n_smart_cmds = 0; in pxafb_smart_init()
1303 init_completion(&fbi->command_done); in pxafb_smart_init()
1304 init_completion(&fbi->refresh_done); in pxafb_smart_init()
1306 fbi->smart_thread = kthread_run(pxafb_smart_thread, fbi, in pxafb_smart_init()
1308 if (IS_ERR(fbi->smart_thread)) { in pxafb_smart_init()
1310 return PTR_ERR(fbi->smart_thread); in pxafb_smart_init()
1316 static inline int pxafb_smart_init(struct pxafb_info *fbi) { return 0; } in pxafb_smart_init() argument
1319 static void setup_parallel_timing(struct pxafb_info *fbi, in setup_parallel_timing() argument
1322 unsigned int lines_per_panel, pcd = get_pcd(fbi, var->pixclock); in setup_parallel_timing()
1324 fbi->reg_lccr1 = in setup_parallel_timing()
1335 if ((fbi->lccr0 & LCCR0_SDS) == LCCR0_Dual) in setup_parallel_timing()
1338 fbi->reg_lccr2 = in setup_parallel_timing()
1344 fbi->reg_lccr3 = fbi->lccr3 | in setup_parallel_timing()
1351 fbi->reg_lccr3 |= LCCR3_PixClkDiv(pcd); in setup_parallel_timing()
1352 set_hsync_time(fbi, pcd); in setup_parallel_timing()
1362 struct pxafb_info *fbi) in pxafb_activate_var() argument
1370 if (fbi->lccr0 & LCCR0_LCDT) in pxafb_activate_var()
1371 setup_smart_timing(fbi, var); in pxafb_activate_var()
1374 setup_parallel_timing(fbi, var); in pxafb_activate_var()
1376 setup_base_frame(fbi, var, 0); in pxafb_activate_var()
1378 fbi->reg_lccr0 = fbi->lccr0 | in pxafb_activate_var()
1382 fbi->reg_lccr3 |= pxafb_var_to_lccr3(var); in pxafb_activate_var()
1384 fbi->reg_lccr4 = lcd_readl(fbi, LCCR4) & ~LCCR4_PAL_FOR_MASK; in pxafb_activate_var()
1385 fbi->reg_lccr4 |= (fbi->lccr4 & LCCR4_PAL_FOR_MASK); in pxafb_activate_var()
1392 if ((lcd_readl(fbi, LCCR0) != fbi->reg_lccr0) || in pxafb_activate_var()
1393 (lcd_readl(fbi, LCCR1) != fbi->reg_lccr1) || in pxafb_activate_var()
1394 (lcd_readl(fbi, LCCR2) != fbi->reg_lccr2) || in pxafb_activate_var()
1395 (lcd_readl(fbi, LCCR3) != fbi->reg_lccr3) || in pxafb_activate_var()
1396 (lcd_readl(fbi, LCCR4) != fbi->reg_lccr4) || in pxafb_activate_var()
1397 (lcd_readl(fbi, FDADR0) != fbi->fdadr[0]) || in pxafb_activate_var()
1398 ((fbi->lccr0 & LCCR0_SDS) && in pxafb_activate_var()
1399 (lcd_readl(fbi, FDADR1) != fbi->fdadr[1]))) in pxafb_activate_var()
1400 pxafb_schedule_work(fbi, C_REENABLE); in pxafb_activate_var()
1411 static inline void __pxafb_backlight_power(struct pxafb_info *fbi, int on) in __pxafb_backlight_power() argument
1415 if (fbi->backlight_power) in __pxafb_backlight_power()
1416 fbi->backlight_power(on); in __pxafb_backlight_power()
1419 static inline void __pxafb_lcd_power(struct pxafb_info *fbi, int on) in __pxafb_lcd_power() argument
1423 if (fbi->lcd_power) in __pxafb_lcd_power()
1424 fbi->lcd_power(on, &fbi->fb.var); in __pxafb_lcd_power()
1427 static void pxafb_enable_controller(struct pxafb_info *fbi) in pxafb_enable_controller() argument
1430 pr_debug("fdadr0 0x%08x\n", (unsigned int) fbi->fdadr[0]); in pxafb_enable_controller()
1431 pr_debug("fdadr1 0x%08x\n", (unsigned int) fbi->fdadr[1]); in pxafb_enable_controller()
1432 pr_debug("reg_lccr0 0x%08x\n", (unsigned int) fbi->reg_lccr0); in pxafb_enable_controller()
1433 pr_debug("reg_lccr1 0x%08x\n", (unsigned int) fbi->reg_lccr1); in pxafb_enable_controller()
1434 pr_debug("reg_lccr2 0x%08x\n", (unsigned int) fbi->reg_lccr2); in pxafb_enable_controller()
1435 pr_debug("reg_lccr3 0x%08x\n", (unsigned int) fbi->reg_lccr3); in pxafb_enable_controller()
1438 clk_prepare_enable(fbi->clk); in pxafb_enable_controller()
1440 if (fbi->lccr0 & LCCR0_LCDT) in pxafb_enable_controller()
1444 lcd_writel(fbi, LCCR4, fbi->reg_lccr4); in pxafb_enable_controller()
1445 lcd_writel(fbi, LCCR3, fbi->reg_lccr3); in pxafb_enable_controller()
1446 lcd_writel(fbi, LCCR2, fbi->reg_lccr2); in pxafb_enable_controller()
1447 lcd_writel(fbi, LCCR1, fbi->reg_lccr1); in pxafb_enable_controller()
1448 lcd_writel(fbi, LCCR0, fbi->reg_lccr0 & ~LCCR0_ENB); in pxafb_enable_controller()
1450 lcd_writel(fbi, FDADR0, fbi->fdadr[0]); in pxafb_enable_controller()
1451 if (fbi->lccr0 & LCCR0_SDS) in pxafb_enable_controller()
1452 lcd_writel(fbi, FDADR1, fbi->fdadr[1]); in pxafb_enable_controller()
1453 lcd_writel(fbi, LCCR0, fbi->reg_lccr0 | LCCR0_ENB); in pxafb_enable_controller()
1456 static void pxafb_disable_controller(struct pxafb_info *fbi) in pxafb_disable_controller() argument
1461 if (fbi->lccr0 & LCCR0_LCDT) { in pxafb_disable_controller()
1462 wait_for_completion_timeout(&fbi->refresh_done, in pxafb_disable_controller()
1469 lcd_writel(fbi, LCSR, 0xffffffff); in pxafb_disable_controller()
1471 lccr0 = lcd_readl(fbi, LCCR0) & ~LCCR0_LDM; in pxafb_disable_controller()
1472 lcd_writel(fbi, LCCR0, lccr0); in pxafb_disable_controller()
1473 lcd_writel(fbi, LCCR0, lccr0 | LCCR0_DIS); in pxafb_disable_controller()
1475 wait_for_completion_timeout(&fbi->disable_done, msecs_to_jiffies(200)); in pxafb_disable_controller()
1478 clk_disable_unprepare(fbi->clk); in pxafb_disable_controller()
1486 struct pxafb_info *fbi = dev_id; in pxafb_handle_irq() local
1489 lcsr = lcd_readl(fbi, LCSR); in pxafb_handle_irq()
1491 lccr0 = lcd_readl(fbi, LCCR0); in pxafb_handle_irq()
1492 lcd_writel(fbi, LCCR0, lccr0 | LCCR0_LDM); in pxafb_handle_irq()
1493 complete(&fbi->disable_done); in pxafb_handle_irq()
1498 complete(&fbi->command_done); in pxafb_handle_irq()
1500 lcd_writel(fbi, LCSR, lcsr); in pxafb_handle_irq()
1504 unsigned int lcsr1 = lcd_readl(fbi, LCSR1); in pxafb_handle_irq()
1506 complete(&fbi->overlay[0].branch_done); in pxafb_handle_irq()
1509 complete(&fbi->overlay[1].branch_done); in pxafb_handle_irq()
1511 lcd_writel(fbi, LCSR1, lcsr1); in pxafb_handle_irq()
1522 static void set_ctrlr_state(struct pxafb_info *fbi, u_int state) in set_ctrlr_state() argument
1526 mutex_lock(&fbi->ctrlr_lock); in set_ctrlr_state()
1528 old_state = fbi->state; in set_ctrlr_state()
1543 fbi->state = state; in set_ctrlr_state()
1545 pxafb_disable_controller(fbi); in set_ctrlr_state()
1555 fbi->state = state; in set_ctrlr_state()
1556 __pxafb_backlight_power(fbi, 0); in set_ctrlr_state()
1557 __pxafb_lcd_power(fbi, 0); in set_ctrlr_state()
1559 pxafb_disable_controller(fbi); in set_ctrlr_state()
1569 fbi->state = C_ENABLE; in set_ctrlr_state()
1570 pxafb_enable_controller(fbi); in set_ctrlr_state()
1582 __pxafb_lcd_power(fbi, 0); in set_ctrlr_state()
1583 pxafb_disable_controller(fbi); in set_ctrlr_state()
1584 pxafb_enable_controller(fbi); in set_ctrlr_state()
1585 __pxafb_lcd_power(fbi, 1); in set_ctrlr_state()
1605 fbi->state = C_ENABLE; in set_ctrlr_state()
1606 pxafb_enable_controller(fbi); in set_ctrlr_state()
1607 __pxafb_lcd_power(fbi, 1); in set_ctrlr_state()
1608 __pxafb_backlight_power(fbi, 1); in set_ctrlr_state()
1612 mutex_unlock(&fbi->ctrlr_lock); in set_ctrlr_state()
1621 struct pxafb_info *fbi = in pxafb_task() local
1623 u_int state = xchg(&fbi->task_state, -1); in pxafb_task()
1625 set_ctrlr_state(fbi, state); in pxafb_task()
1639 struct pxafb_info *fbi = TO_INF(nb, freq_transition); in pxafb_freq_transition() local
1646 if (!(fbi->overlay[0].usage || fbi->overlay[1].usage)) in pxafb_freq_transition()
1648 set_ctrlr_state(fbi, C_DISABLE_CLKCHANGE); in pxafb_freq_transition()
1652 pcd = get_pcd(fbi, fbi->fb.var.pixclock); in pxafb_freq_transition()
1653 set_hsync_time(fbi, pcd); in pxafb_freq_transition()
1654 fbi->reg_lccr3 = (fbi->reg_lccr3 & ~0xff) | in pxafb_freq_transition()
1656 set_ctrlr_state(fbi, C_ENABLE_CLKCHANGE); in pxafb_freq_transition()
1665 struct pxafb_info *fbi = TO_INF(nb, freq_policy); in pxafb_freq_policy() local
1666 struct fb_var_screeninfo *var = &fbi->fb.var; in pxafb_freq_policy()
1689 struct pxafb_info *fbi = dev_get_drvdata(dev); in pxafb_suspend() local
1691 set_ctrlr_state(fbi, C_DISABLE_PM); in pxafb_suspend()
1697 struct pxafb_info *fbi = dev_get_drvdata(dev); in pxafb_resume() local
1699 set_ctrlr_state(fbi, C_ENABLE_PM); in pxafb_resume()
1709 static int pxafb_init_video_memory(struct pxafb_info *fbi) in pxafb_init_video_memory() argument
1711 int size = PAGE_ALIGN(fbi->video_mem_size); in pxafb_init_video_memory()
1713 fbi->video_mem = alloc_pages_exact(size, GFP_KERNEL | __GFP_ZERO); in pxafb_init_video_memory()
1714 if (fbi->video_mem == NULL) in pxafb_init_video_memory()
1717 fbi->video_mem_phys = virt_to_phys(fbi->video_mem); in pxafb_init_video_memory()
1718 fbi->video_mem_size = size; in pxafb_init_video_memory()
1720 fbi->fb.fix.smem_start = fbi->video_mem_phys; in pxafb_init_video_memory()
1721 fbi->fb.fix.smem_len = fbi->video_mem_size; in pxafb_init_video_memory()
1722 fbi->fb.screen_base = fbi->video_mem; in pxafb_init_video_memory()
1724 return fbi->video_mem ? 0 : -ENOMEM; in pxafb_init_video_memory()
1727 static void pxafb_decode_mach_info(struct pxafb_info *fbi, in pxafb_decode_mach_info() argument
1734 fbi->cmap_inverse = inf->cmap_inverse; in pxafb_decode_mach_info()
1735 fbi->cmap_static = inf->cmap_static; in pxafb_decode_mach_info()
1736 fbi->lccr4 = inf->lccr4; in pxafb_decode_mach_info()
1740 fbi->lccr0 = LCCR0_CMS; in pxafb_decode_mach_info()
1743 fbi->lccr0 = LCCR0_CMS | LCCR0_SDS; in pxafb_decode_mach_info()
1746 fbi->lccr0 = 0; in pxafb_decode_mach_info()
1749 fbi->lccr0 = LCCR0_SDS; in pxafb_decode_mach_info()
1752 fbi->lccr0 = LCCR0_PAS; in pxafb_decode_mach_info()
1755 fbi->lccr0 = LCCR0_LCDT | LCCR0_PAS; in pxafb_decode_mach_info()
1759 fbi->lccr0 = inf->lccr0; in pxafb_decode_mach_info()
1760 fbi->lccr3 = inf->lccr3; in pxafb_decode_mach_info()
1765 fbi->lccr0 |= LCCR0_DPD; in pxafb_decode_mach_info()
1767 fbi->lccr0 |= (lcd_conn & LCD_ALTERNATE_MAPPING) ? LCCR0_LDDALT : 0; in pxafb_decode_mach_info()
1769 fbi->lccr3 = LCCR3_Acb((inf->lcd_conn >> 10) & 0xff); in pxafb_decode_mach_info()
1770 fbi->lccr3 |= (lcd_conn & LCD_BIAS_ACTIVE_LOW) ? LCCR3_OEP : 0; in pxafb_decode_mach_info()
1771 fbi->lccr3 |= (lcd_conn & LCD_PCLK_EDGE_FALL) ? LCCR3_PCP : 0; in pxafb_decode_mach_info()
1774 pxafb_setmode(&fbi->fb.var, &inf->modes[0]); in pxafb_decode_mach_info()
1782 fbi->video_mem_size = max_t(size_t, fbi->video_mem_size, in pxafb_decode_mach_info()
1785 if (inf->video_mem_size > fbi->video_mem_size) in pxafb_decode_mach_info()
1786 fbi->video_mem_size = inf->video_mem_size; in pxafb_decode_mach_info()
1788 if (video_mem_size > fbi->video_mem_size) in pxafb_decode_mach_info()
1789 fbi->video_mem_size = video_mem_size; in pxafb_decode_mach_info()
1794 struct pxafb_info *fbi; in pxafb_init_fbinfo() local
1799 fbi = kmalloc(sizeof(struct pxafb_info) + sizeof(u32) * 16, GFP_KERNEL); in pxafb_init_fbinfo()
1800 if (!fbi) in pxafb_init_fbinfo()
1803 memset(fbi, 0, sizeof(struct pxafb_info)); in pxafb_init_fbinfo()
1804 fbi->dev = dev; in pxafb_init_fbinfo()
1806 fbi->clk = clk_get(dev, NULL); in pxafb_init_fbinfo()
1807 if (IS_ERR(fbi->clk)) { in pxafb_init_fbinfo()
1808 kfree(fbi); in pxafb_init_fbinfo()
1812 strcpy(fbi->fb.fix.id, PXA_NAME); in pxafb_init_fbinfo()
1814 fbi->fb.fix.type = FB_TYPE_PACKED_PIXELS; in pxafb_init_fbinfo()
1815 fbi->fb.fix.type_aux = 0; in pxafb_init_fbinfo()
1816 fbi->fb.fix.xpanstep = 0; in pxafb_init_fbinfo()
1817 fbi->fb.fix.ypanstep = 1; in pxafb_init_fbinfo()
1818 fbi->fb.fix.ywrapstep = 0; in pxafb_init_fbinfo()
1819 fbi->fb.fix.accel = FB_ACCEL_NONE; in pxafb_init_fbinfo()
1821 fbi->fb.var.nonstd = 0; in pxafb_init_fbinfo()
1822 fbi->fb.var.activate = FB_ACTIVATE_NOW; in pxafb_init_fbinfo()
1823 fbi->fb.var.height = -1; in pxafb_init_fbinfo()
1824 fbi->fb.var.width = -1; in pxafb_init_fbinfo()
1825 fbi->fb.var.accel_flags = FB_ACCELF_TEXT; in pxafb_init_fbinfo()
1826 fbi->fb.var.vmode = FB_VMODE_NONINTERLACED; in pxafb_init_fbinfo()
1828 fbi->fb.fbops = &pxafb_ops; in pxafb_init_fbinfo()
1829 fbi->fb.flags = FBINFO_DEFAULT; in pxafb_init_fbinfo()
1830 fbi->fb.node = -1; in pxafb_init_fbinfo()
1832 addr = fbi; in pxafb_init_fbinfo()
1834 fbi->fb.pseudo_palette = addr; in pxafb_init_fbinfo()
1836 fbi->state = C_STARTUP; in pxafb_init_fbinfo()
1837 fbi->task_state = (u_char)-1; in pxafb_init_fbinfo()
1839 pxafb_decode_mach_info(fbi, inf); in pxafb_init_fbinfo()
1844 fbi->lccr0 |= LCCR0_OUC; in pxafb_init_fbinfo()
1847 init_waitqueue_head(&fbi->ctrlr_wait); in pxafb_init_fbinfo()
1848 INIT_WORK(&fbi->task, pxafb_task); in pxafb_init_fbinfo()
1849 mutex_init(&fbi->ctrlr_lock); in pxafb_init_fbinfo()
1850 init_completion(&fbi->disable_done); in pxafb_init_fbinfo()
1852 return fbi; in pxafb_init_fbinfo()
2098 struct pxafb_info *fbi; in pxafb_probe() local
2107 fbi = NULL; in pxafb_probe()
2129 fbi = pxafb_init_fbinfo(&dev->dev); in pxafb_probe()
2130 if (!fbi) { in pxafb_probe()
2138 fbi->fb.fix.accel = FB_ACCEL_PXA3XX; in pxafb_probe()
2140 fbi->backlight_power = inf->pxafb_backlight_power; in pxafb_probe()
2141 fbi->lcd_power = inf->pxafb_lcd_power; in pxafb_probe()
2157 fbi->mmio_base = ioremap(r->start, resource_size(r)); in pxafb_probe()
2158 if (fbi->mmio_base == NULL) { in pxafb_probe()
2164 fbi->dma_buff_size = PAGE_ALIGN(sizeof(struct pxafb_dma_buff)); in pxafb_probe()
2165 fbi->dma_buff = dma_alloc_coherent(fbi->dev, fbi->dma_buff_size, in pxafb_probe()
2166 &fbi->dma_buff_phys, GFP_KERNEL); in pxafb_probe()
2167 if (fbi->dma_buff == NULL) { in pxafb_probe()
2173 ret = pxafb_init_video_memory(fbi); in pxafb_probe()
2187 ret = request_irq(irq, pxafb_handle_irq, 0, "LCD", fbi); in pxafb_probe()
2194 ret = pxafb_smart_init(fbi); in pxafb_probe()
2204 ret = pxafb_check_var(&fbi->fb.var, &fbi->fb); in pxafb_probe()
2210 ret = pxafb_set_par(&fbi->fb); in pxafb_probe()
2216 platform_set_drvdata(dev, fbi); in pxafb_probe()
2218 ret = register_framebuffer(&fbi->fb); in pxafb_probe()
2225 pxafb_overlay_init(fbi); in pxafb_probe()
2228 fbi->freq_transition.notifier_call = pxafb_freq_transition; in pxafb_probe()
2229 fbi->freq_policy.notifier_call = pxafb_freq_policy; in pxafb_probe()
2230 cpufreq_register_notifier(&fbi->freq_transition, in pxafb_probe()
2232 cpufreq_register_notifier(&fbi->freq_policy, in pxafb_probe()
2239 set_ctrlr_state(fbi, C_ENABLE); in pxafb_probe()
2244 if (fbi->fb.cmap.len) in pxafb_probe()
2245 fb_dealloc_cmap(&fbi->fb.cmap); in pxafb_probe()
2247 free_irq(irq, fbi); in pxafb_probe()
2249 free_pages_exact(fbi->video_mem, fbi->video_mem_size); in pxafb_probe()
2251 dma_free_coherent(&dev->dev, fbi->dma_buff_size, in pxafb_probe()
2252 fbi->dma_buff, fbi->dma_buff_phys); in pxafb_probe()
2254 iounmap(fbi->mmio_base); in pxafb_probe()
2258 clk_put(fbi->clk); in pxafb_probe()
2259 kfree(fbi); in pxafb_probe()
2266 struct pxafb_info *fbi = platform_get_drvdata(dev); in pxafb_remove() local
2271 if (!fbi) in pxafb_remove()
2274 info = &fbi->fb; in pxafb_remove()
2276 pxafb_overlay_exit(fbi); in pxafb_remove()
2279 pxafb_disable_controller(fbi); in pxafb_remove()
2281 if (fbi->fb.cmap.len) in pxafb_remove()
2282 fb_dealloc_cmap(&fbi->fb.cmap); in pxafb_remove()
2285 free_irq(irq, fbi); in pxafb_remove()
2287 free_pages_exact(fbi->video_mem, fbi->video_mem_size); in pxafb_remove()
2289 dma_free_writecombine(&dev->dev, fbi->dma_buff_size, in pxafb_remove()
2290 fbi->dma_buff, fbi->dma_buff_phys); in pxafb_remove()
2292 iounmap(fbi->mmio_base); in pxafb_remove()
2297 clk_put(fbi->clk); in pxafb_remove()
2298 kfree(fbi); in pxafb_remove()