Lines Matching refs:fbi
87 static void set_ctrlr_state(struct pxafb_info *fbi, u_int state);
88 static void setup_base_frame(struct pxafb_info *fbi,
90 static int setup_frame_dma(struct pxafb_info *fbi, int dma, int pal,
96 lcd_readl(struct pxafb_info *fbi, unsigned int off) in lcd_readl() argument
98 return __raw_readl(fbi->mmio_base + off); in lcd_readl()
102 lcd_writel(struct pxafb_info *fbi, unsigned int off, unsigned long val) in lcd_writel() argument
104 __raw_writel(val, fbi->mmio_base + off); in lcd_writel()
107 static inline void pxafb_schedule_work(struct pxafb_info *fbi, u_int state) in pxafb_schedule_work() argument
122 if (fbi->task_state == C_ENABLE && state == C_REENABLE) in pxafb_schedule_work()
124 if (fbi->task_state == C_DISABLE && state == C_ENABLE) in pxafb_schedule_work()
128 fbi->task_state = state; in pxafb_schedule_work()
129 schedule_work(&fbi->task); in pxafb_schedule_work()
145 struct pxafb_info *fbi = container_of(info, struct pxafb_info, fb); in pxafb_setpalettereg() local
148 if (regno >= fbi->palette_size) in pxafb_setpalettereg()
151 if (fbi->fb.var.grayscale) { in pxafb_setpalettereg()
152 fbi->palette_cpu[regno] = ((blue >> 8) & 0x00ff); in pxafb_setpalettereg()
156 switch (fbi->lccr4 & LCCR4_PAL_FOR_MASK) { in pxafb_setpalettereg()
161 fbi->palette_cpu[regno] = val; in pxafb_setpalettereg()
167 ((u32 *)(fbi->palette_cpu))[regno] = val; in pxafb_setpalettereg()
173 ((u32 *)(fbi->palette_cpu))[regno] = val; in pxafb_setpalettereg()
179 ((u32 *)(fbi->palette_cpu))[regno] = val; in pxafb_setpalettereg()
190 struct pxafb_info *fbi = container_of(info, struct pxafb_info, fb); in pxafb_setcolreg() local
200 if (fbi->cmap_inverse) { in pxafb_setcolreg()
210 if (fbi->fb.var.grayscale) in pxafb_setcolreg()
214 switch (fbi->fb.fix.visual) { in pxafb_setcolreg()
221 u32 *pal = fbi->fb.pseudo_palette; in pxafb_setcolreg()
223 val = chan_to_field(red, &fbi->fb.var.red); in pxafb_setcolreg()
224 val |= chan_to_field(green, &fbi->fb.var.green); in pxafb_setcolreg()
225 val |= chan_to_field(blue, &fbi->fb.var.blue); in pxafb_setcolreg()
412 static int pxafb_adjust_timing(struct pxafb_info *fbi, in pxafb_adjust_timing() argument
420 if (!(fbi->lccr0 & LCCR0_LCDT)) { in pxafb_adjust_timing()
438 var->yres_virtual = fbi->fb.fix.smem_len / line_length; in pxafb_adjust_timing()
463 struct pxafb_info *fbi = container_of(info, struct pxafb_info, fb); in pxafb_check_var() local
464 struct pxafb_mach_info *inf = fbi->inf; in pxafb_check_var()
483 err = pxafb_adjust_timing(fbi, var); in pxafb_check_var()
501 struct pxafb_info *fbi = container_of(info, struct pxafb_info, fb); in pxafb_set_par() local
505 fbi->fb.fix.visual = FB_VISUAL_TRUECOLOR; in pxafb_set_par()
506 else if (!fbi->cmap_static) in pxafb_set_par()
507 fbi->fb.fix.visual = FB_VISUAL_PSEUDOCOLOR; in pxafb_set_par()
514 fbi->fb.fix.visual = FB_VISUAL_STATIC_PSEUDOCOLOR; in pxafb_set_par()
517 fbi->fb.fix.line_length = var->xres_virtual * in pxafb_set_par()
520 fbi->palette_size = 0; in pxafb_set_par()
522 fbi->palette_size = var->bits_per_pixel == 1 ? in pxafb_set_par()
525 fbi->palette_cpu = (u16 *)&fbi->dma_buff->palette[0]; in pxafb_set_par()
527 if (fbi->fb.var.bits_per_pixel >= 16) in pxafb_set_par()
528 fb_dealloc_cmap(&fbi->fb.cmap); in pxafb_set_par()
530 fb_alloc_cmap(&fbi->fb.cmap, 1<<fbi->fb.var.bits_per_pixel, 0); in pxafb_set_par()
532 pxafb_activate_var(var, fbi); in pxafb_set_par()
540 struct pxafb_info *fbi = container_of(info, struct pxafb_info, fb); in pxafb_pan_display() local
544 if (fbi->state != C_ENABLE) in pxafb_pan_display()
550 memcpy(&newvar, &fbi->fb.var, sizeof(newvar)); in pxafb_pan_display()
556 setup_base_frame(fbi, &newvar, 1); in pxafb_pan_display()
558 if (fbi->lccr0 & LCCR0_SDS) in pxafb_pan_display()
559 lcd_writel(fbi, FBR1, fbi->fdadr[dma + 1] | 0x1); in pxafb_pan_display()
561 lcd_writel(fbi, FBR0, fbi->fdadr[dma] | 0x1); in pxafb_pan_display()
573 struct pxafb_info *fbi = container_of(info, struct pxafb_info, fb); in pxafb_blank() local
581 if (fbi->fb.fix.visual == FB_VISUAL_PSEUDOCOLOR || in pxafb_blank()
582 fbi->fb.fix.visual == FB_VISUAL_STATIC_PSEUDOCOLOR) in pxafb_blank()
583 for (i = 0; i < fbi->palette_size; i++) in pxafb_blank()
586 pxafb_schedule_work(fbi, C_DISABLE); in pxafb_blank()
592 if (fbi->fb.fix.visual == FB_VISUAL_PSEUDOCOLOR || in pxafb_blank()
593 fbi->fb.fix.visual == FB_VISUAL_STATIC_PSEUDOCOLOR) in pxafb_blank()
594 fb_set_cmap(&fbi->fb.cmap, info); in pxafb_blank()
595 pxafb_schedule_work(fbi, C_ENABLE); in pxafb_blank()
617 setup_frame_dma(ofb->fbi, DMA_OV1, PAL_NONE, start, size); in overlay1fb_setup()
625 int enabled = lcd_readl(ofb->fbi, OVL1C1) & OVLxC1_OEN; in overlay1fb_enable()
626 uint32_t fdadr1 = ofb->fbi->fdadr[DMA_OV1] | (enabled ? 0x1 : 0); in overlay1fb_enable()
628 lcd_writel(ofb->fbi, enabled ? FBR1 : FDADR1, fdadr1); in overlay1fb_enable()
629 lcd_writel(ofb->fbi, OVL1C2, ofb->control[1]); in overlay1fb_enable()
630 lcd_writel(ofb->fbi, OVL1C1, ofb->control[0] | OVLxC1_OEN); in overlay1fb_enable()
637 if (!(lcd_readl(ofb->fbi, OVL1C1) & OVLxC1_OEN)) in overlay1fb_disable()
640 lccr5 = lcd_readl(ofb->fbi, LCCR5); in overlay1fb_disable()
642 lcd_writel(ofb->fbi, OVL1C1, ofb->control[0] & ~OVLxC1_OEN); in overlay1fb_disable()
644 lcd_writel(ofb->fbi, LCSR1, LCSR1_BS(1)); in overlay1fb_disable()
645 lcd_writel(ofb->fbi, LCCR5, lccr5 & ~LCSR1_BS(1)); in overlay1fb_disable()
646 lcd_writel(ofb->fbi, FBR1, ofb->fbi->fdadr[DMA_OV1] | 0x3); in overlay1fb_disable()
651 lcd_writel(ofb->fbi, LCCR5, lccr5); in overlay1fb_disable()
661 setup_frame_dma(ofb->fbi, DMA_OV2_Y, -1, start[0], size); in overlay2fb_setup()
671 setup_frame_dma(ofb->fbi, DMA_OV2_Y, -1, start[0], size); in overlay2fb_setup()
672 setup_frame_dma(ofb->fbi, DMA_OV2_Cb, -1, start[1], size / div); in overlay2fb_setup()
673 setup_frame_dma(ofb->fbi, DMA_OV2_Cr, -1, start[2], size / div); in overlay2fb_setup()
680 int enabled = lcd_readl(ofb->fbi, OVL2C1) & OVLxC1_OEN; in overlay2fb_enable()
681 uint32_t fdadr2 = ofb->fbi->fdadr[DMA_OV2_Y] | (enabled ? 0x1 : 0); in overlay2fb_enable()
682 uint32_t fdadr3 = ofb->fbi->fdadr[DMA_OV2_Cb] | (enabled ? 0x1 : 0); in overlay2fb_enable()
683 uint32_t fdadr4 = ofb->fbi->fdadr[DMA_OV2_Cr] | (enabled ? 0x1 : 0); in overlay2fb_enable()
686 lcd_writel(ofb->fbi, enabled ? FBR2 : FDADR2, fdadr2); in overlay2fb_enable()
688 lcd_writel(ofb->fbi, enabled ? FBR2 : FDADR2, fdadr2); in overlay2fb_enable()
689 lcd_writel(ofb->fbi, enabled ? FBR3 : FDADR3, fdadr3); in overlay2fb_enable()
690 lcd_writel(ofb->fbi, enabled ? FBR4 : FDADR4, fdadr4); in overlay2fb_enable()
692 lcd_writel(ofb->fbi, OVL2C2, ofb->control[1]); in overlay2fb_enable()
693 lcd_writel(ofb->fbi, OVL2C1, ofb->control[0] | OVLxC1_OEN); in overlay2fb_enable()
700 if (!(lcd_readl(ofb->fbi, OVL2C1) & OVLxC1_OEN)) in overlay2fb_disable()
703 lccr5 = lcd_readl(ofb->fbi, LCCR5); in overlay2fb_disable()
705 lcd_writel(ofb->fbi, OVL2C1, ofb->control[0] & ~OVLxC1_OEN); in overlay2fb_disable()
707 lcd_writel(ofb->fbi, LCSR1, LCSR1_BS(2)); in overlay2fb_disable()
708 lcd_writel(ofb->fbi, LCCR5, lccr5 & ~LCSR1_BS(2)); in overlay2fb_disable()
709 lcd_writel(ofb->fbi, FBR2, ofb->fbi->fdadr[DMA_OV2_Y] | 0x3); in overlay2fb_disable()
710 lcd_writel(ofb->fbi, FBR3, ofb->fbi->fdadr[DMA_OV2_Cb] | 0x3); in overlay2fb_disable()
711 lcd_writel(ofb->fbi, FBR4, ofb->fbi->fdadr[DMA_OV2_Cr] | 0x3); in overlay2fb_disable()
741 fb_blank(&ofb->fbi->fb, FB_BLANK_UNBLANK); in overlayfb_open()
768 struct fb_var_screeninfo *base_var = &ofb->fbi->fb.var; in overlayfb_check_var()
876 static void init_pxafb_overlay(struct pxafb_info *fbi, struct pxafb_layer *ofb, in init_pxafb_overlay() argument
898 ofb->fbi = fbi; in init_pxafb_overlay()
934 static void pxafb_overlay_init(struct pxafb_info *fbi) in pxafb_overlay_init() argument
942 struct pxafb_layer *ofb = &fbi->overlay[i]; in pxafb_overlay_init()
943 init_pxafb_overlay(fbi, ofb, i); in pxafb_overlay_init()
946 dev_err(fbi->dev, "failed to register overlay %d\n", i); in pxafb_overlay_init()
949 ret = pxafb_overlay_map_video_memory(fbi, ofb); in pxafb_overlay_init()
951 dev_err(fbi->dev, in pxafb_overlay_init()
961 lcd_writel(fbi, LCCR5, ~0); in pxafb_overlay_init()
966 static void pxafb_overlay_exit(struct pxafb_info *fbi) in pxafb_overlay_exit() argument
974 struct pxafb_layer *ofb = &fbi->overlay[i]; in pxafb_overlay_exit()
984 static inline void pxafb_overlay_init(struct pxafb_info *fbi) {} in pxafb_overlay_init() argument
985 static inline void pxafb_overlay_exit(struct pxafb_info *fbi) {} in pxafb_overlay_exit() argument
1018 static inline unsigned int get_pcd(struct pxafb_info *fbi, in get_pcd() argument
1026 pcd = (unsigned long long)(clk_get_rate(fbi->clk) / 10000); in get_pcd()
1040 static inline void set_hsync_time(struct pxafb_info *fbi, unsigned int pcd) in set_hsync_time() argument
1044 if ((pcd == 0) || (fbi->fb.var.hsync_len == 0)) { in set_hsync_time()
1045 fbi->hsync_time = 0; in set_hsync_time()
1049 htime = clk_get_rate(fbi->clk) / (pcd * fbi->fb.var.hsync_len); in set_hsync_time()
1051 fbi->hsync_time = htime; in set_hsync_time()
1056 struct pxafb_info *fbi = dev_get_drvdata(dev); in pxafb_get_hsync_time() local
1059 if (!fbi || (fbi->state != C_ENABLE)) in pxafb_get_hsync_time()
1062 return fbi->hsync_time; in pxafb_get_hsync_time()
1066 static int setup_frame_dma(struct pxafb_info *fbi, int dma, int pal, in setup_frame_dma() argument
1075 dma_desc = &fbi->dma_buff->dma_desc[dma]; in setup_frame_dma()
1083 dma_desc->fdadr = fbi->dma_buff_phys + dma_desc_off; in setup_frame_dma()
1084 fbi->fdadr[dma] = fbi->dma_buff_phys + dma_desc_off; in setup_frame_dma()
1086 pal_desc = &fbi->dma_buff->pal_desc[pal]; in setup_frame_dma()
1089 pal_desc->fsadr = fbi->dma_buff_phys + pal * PALETTE_SIZE; in setup_frame_dma()
1092 if ((fbi->lccr4 & LCCR4_PAL_FOR_MASK) == LCCR4_PAL_FOR_0) in setup_frame_dma()
1093 pal_desc->ldcmd = fbi->palette_size * sizeof(u16); in setup_frame_dma()
1095 pal_desc->ldcmd = fbi->palette_size * sizeof(u32); in setup_frame_dma()
1100 pal_desc->fdadr = fbi->dma_buff_phys + dma_desc_off; in setup_frame_dma()
1101 dma_desc->fdadr = fbi->dma_buff_phys + pal_desc_off; in setup_frame_dma()
1102 fbi->fdadr[dma] = fbi->dma_buff_phys + dma_desc_off; in setup_frame_dma()
1108 static void setup_base_frame(struct pxafb_info *fbi, in setup_base_frame() argument
1112 struct fb_fix_screeninfo *fix = &fbi->fb.fix; in setup_base_frame()
1120 offset = fix->line_length * var->yoffset + fbi->video_mem_phys; in setup_base_frame()
1122 if (fbi->lccr0 & LCCR0_SDS) { in setup_base_frame()
1124 setup_frame_dma(fbi, dma + 1, PAL_NONE, offset + nbytes, nbytes); in setup_base_frame()
1127 setup_frame_dma(fbi, dma, pal, offset, nbytes); in setup_base_frame()
1131 static int setup_smart_dma(struct pxafb_info *fbi) in setup_smart_dma() argument
1136 dma_desc = &fbi->dma_buff->dma_desc[DMA_CMD]; in setup_smart_dma()
1140 dma_desc->fdadr = fbi->dma_buff_phys + dma_desc_off; in setup_smart_dma()
1141 dma_desc->fsadr = fbi->dma_buff_phys + cmd_buff_off; in setup_smart_dma()
1143 dma_desc->ldcmd = fbi->n_smart_cmds * sizeof(uint16_t); in setup_smart_dma()
1145 fbi->fdadr[DMA_CMD] = dma_desc->fdadr; in setup_smart_dma()
1151 struct pxafb_info *fbi = container_of(info, struct pxafb_info, fb); in pxafb_smart_flush() local
1156 lcd_writel(fbi, LCCR0, fbi->reg_lccr0 & ~LCCR0_ENB); in pxafb_smart_flush()
1163 while (fbi->n_smart_cmds & 1) in pxafb_smart_flush()
1164 fbi->smart_cmds[fbi->n_smart_cmds++] = SMART_CMD_NOOP; in pxafb_smart_flush()
1166 fbi->smart_cmds[fbi->n_smart_cmds++] = SMART_CMD_INTERRUPT; in pxafb_smart_flush()
1167 fbi->smart_cmds[fbi->n_smart_cmds++] = SMART_CMD_WAIT_FOR_VSYNC; in pxafb_smart_flush()
1168 setup_smart_dma(fbi); in pxafb_smart_flush()
1171 prsr = lcd_readl(fbi, PRSR) | PRSR_ST_OK | PRSR_CON_NT; in pxafb_smart_flush()
1172 lcd_writel(fbi, PRSR, prsr); in pxafb_smart_flush()
1175 lcd_writel(fbi, CMDCR, 0x0001); in pxafb_smart_flush()
1178 lcd_writel(fbi, LCCR5, LCCR5_IUM(6)); in pxafb_smart_flush()
1180 lcd_writel(fbi, LCCR1, fbi->reg_lccr1); in pxafb_smart_flush()
1181 lcd_writel(fbi, LCCR2, fbi->reg_lccr2); in pxafb_smart_flush()
1182 lcd_writel(fbi, LCCR3, fbi->reg_lccr3); in pxafb_smart_flush()
1183 lcd_writel(fbi, LCCR4, fbi->reg_lccr4); in pxafb_smart_flush()
1184 lcd_writel(fbi, FDADR0, fbi->fdadr[0]); in pxafb_smart_flush()
1185 lcd_writel(fbi, FDADR6, fbi->fdadr[6]); in pxafb_smart_flush()
1188 lcd_writel(fbi, LCCR0, fbi->reg_lccr0 | LCCR0_ENB); in pxafb_smart_flush()
1190 if (wait_for_completion_timeout(&fbi->command_done, HZ/2) == 0) { in pxafb_smart_flush()
1196 prsr = lcd_readl(fbi, PRSR) & ~(PRSR_ST_OK | PRSR_CON_NT); in pxafb_smart_flush()
1197 lcd_writel(fbi, PRSR, prsr); in pxafb_smart_flush()
1198 lcd_writel(fbi, LCCR0, fbi->reg_lccr0 & ~LCCR0_ENB); in pxafb_smart_flush()
1199 lcd_writel(fbi, FDADR6, 0); in pxafb_smart_flush()
1200 fbi->n_smart_cmds = 0; in pxafb_smart_flush()
1207 struct pxafb_info *fbi = container_of(info, struct pxafb_info, fb); in pxafb_smart_queue() local
1218 if (fbi->n_smart_cmds == CMD_BUFF_SIZE - 8) in pxafb_smart_queue()
1221 fbi->smart_cmds[fbi->n_smart_cmds++] = *cmds; in pxafb_smart_queue()
1233 static void setup_smart_timing(struct pxafb_info *fbi, in setup_smart_timing() argument
1236 struct pxafb_mach_info *inf = fbi->inf; in setup_smart_timing()
1238 unsigned long lclk = clk_get_rate(fbi->clk); in setup_smart_timing()
1246 fbi->reg_lccr1 = in setup_smart_timing()
1252 fbi->reg_lccr2 = LCCR2_DisHght(var->yres); in setup_smart_timing()
1253 fbi->reg_lccr3 = fbi->lccr3 | LCCR3_PixClkDiv(__smart_timing(t4, lclk)); in setup_smart_timing()
1254 fbi->reg_lccr3 |= (var->sync & FB_SYNC_HOR_HIGH_ACT) ? LCCR3_HSP : 0; in setup_smart_timing()
1255 fbi->reg_lccr3 |= (var->sync & FB_SYNC_VERT_HIGH_ACT) ? LCCR3_VSP : 0; in setup_smart_timing()
1258 fbi->reg_cmdcr = 1; in setup_smart_timing()
1263 struct pxafb_info *fbi = arg; in pxafb_smart_thread() local
1264 struct pxafb_mach_info *inf = fbi->inf; in pxafb_smart_thread()
1280 mutex_lock(&fbi->ctrlr_lock); in pxafb_smart_thread()
1282 if (fbi->state == C_ENABLE) { in pxafb_smart_thread()
1283 inf->smart_update(&fbi->fb); in pxafb_smart_thread()
1284 complete(&fbi->refresh_done); in pxafb_smart_thread()
1287 mutex_unlock(&fbi->ctrlr_lock); in pxafb_smart_thread()
1297 static int pxafb_smart_init(struct pxafb_info *fbi) in pxafb_smart_init() argument
1299 if (!(fbi->lccr0 & LCCR0_LCDT)) in pxafb_smart_init()
1302 fbi->smart_cmds = (uint16_t *) fbi->dma_buff->cmd_buff; in pxafb_smart_init()
1303 fbi->n_smart_cmds = 0; in pxafb_smart_init()
1305 init_completion(&fbi->command_done); in pxafb_smart_init()
1306 init_completion(&fbi->refresh_done); in pxafb_smart_init()
1308 fbi->smart_thread = kthread_run(pxafb_smart_thread, fbi, in pxafb_smart_init()
1310 if (IS_ERR(fbi->smart_thread)) { in pxafb_smart_init()
1312 return PTR_ERR(fbi->smart_thread); in pxafb_smart_init()
1318 static inline int pxafb_smart_init(struct pxafb_info *fbi) { return 0; } in pxafb_smart_init() argument
1321 static void setup_parallel_timing(struct pxafb_info *fbi, in setup_parallel_timing() argument
1324 unsigned int lines_per_panel, pcd = get_pcd(fbi, var->pixclock); in setup_parallel_timing()
1326 fbi->reg_lccr1 = in setup_parallel_timing()
1337 if ((fbi->lccr0 & LCCR0_SDS) == LCCR0_Dual) in setup_parallel_timing()
1340 fbi->reg_lccr2 = in setup_parallel_timing()
1346 fbi->reg_lccr3 = fbi->lccr3 | in setup_parallel_timing()
1353 fbi->reg_lccr3 |= LCCR3_PixClkDiv(pcd); in setup_parallel_timing()
1354 set_hsync_time(fbi, pcd); in setup_parallel_timing()
1364 struct pxafb_info *fbi) in pxafb_activate_var() argument
1372 if (fbi->lccr0 & LCCR0_LCDT) in pxafb_activate_var()
1373 setup_smart_timing(fbi, var); in pxafb_activate_var()
1376 setup_parallel_timing(fbi, var); in pxafb_activate_var()
1378 setup_base_frame(fbi, var, 0); in pxafb_activate_var()
1380 fbi->reg_lccr0 = fbi->lccr0 | in pxafb_activate_var()
1384 fbi->reg_lccr3 |= pxafb_var_to_lccr3(var); in pxafb_activate_var()
1386 fbi->reg_lccr4 = lcd_readl(fbi, LCCR4) & ~LCCR4_PAL_FOR_MASK; in pxafb_activate_var()
1387 fbi->reg_lccr4 |= (fbi->lccr4 & LCCR4_PAL_FOR_MASK); in pxafb_activate_var()
1394 if ((lcd_readl(fbi, LCCR0) != fbi->reg_lccr0) || in pxafb_activate_var()
1395 (lcd_readl(fbi, LCCR1) != fbi->reg_lccr1) || in pxafb_activate_var()
1396 (lcd_readl(fbi, LCCR2) != fbi->reg_lccr2) || in pxafb_activate_var()
1397 (lcd_readl(fbi, LCCR3) != fbi->reg_lccr3) || in pxafb_activate_var()
1398 (lcd_readl(fbi, LCCR4) != fbi->reg_lccr4) || in pxafb_activate_var()
1399 (lcd_readl(fbi, FDADR0) != fbi->fdadr[0]) || in pxafb_activate_var()
1400 ((fbi->lccr0 & LCCR0_SDS) && in pxafb_activate_var()
1401 (lcd_readl(fbi, FDADR1) != fbi->fdadr[1]))) in pxafb_activate_var()
1402 pxafb_schedule_work(fbi, C_REENABLE); in pxafb_activate_var()
1413 static inline void __pxafb_backlight_power(struct pxafb_info *fbi, int on) in __pxafb_backlight_power() argument
1417 if (fbi->backlight_power) in __pxafb_backlight_power()
1418 fbi->backlight_power(on); in __pxafb_backlight_power()
1421 static inline void __pxafb_lcd_power(struct pxafb_info *fbi, int on) in __pxafb_lcd_power() argument
1425 if (fbi->lcd_power) in __pxafb_lcd_power()
1426 fbi->lcd_power(on, &fbi->fb.var); in __pxafb_lcd_power()
1428 if (fbi->lcd_supply && fbi->lcd_supply_enabled != on) { in __pxafb_lcd_power()
1432 ret = regulator_enable(fbi->lcd_supply); in __pxafb_lcd_power()
1434 ret = regulator_disable(fbi->lcd_supply); in __pxafb_lcd_power()
1440 fbi->lcd_supply_enabled = on; in __pxafb_lcd_power()
1444 static void pxafb_enable_controller(struct pxafb_info *fbi) in pxafb_enable_controller() argument
1447 pr_debug("fdadr0 0x%08x\n", (unsigned int) fbi->fdadr[0]); in pxafb_enable_controller()
1448 pr_debug("fdadr1 0x%08x\n", (unsigned int) fbi->fdadr[1]); in pxafb_enable_controller()
1449 pr_debug("reg_lccr0 0x%08x\n", (unsigned int) fbi->reg_lccr0); in pxafb_enable_controller()
1450 pr_debug("reg_lccr1 0x%08x\n", (unsigned int) fbi->reg_lccr1); in pxafb_enable_controller()
1451 pr_debug("reg_lccr2 0x%08x\n", (unsigned int) fbi->reg_lccr2); in pxafb_enable_controller()
1452 pr_debug("reg_lccr3 0x%08x\n", (unsigned int) fbi->reg_lccr3); in pxafb_enable_controller()
1455 if (clk_prepare_enable(fbi->clk)) { in pxafb_enable_controller()
1460 if (fbi->lccr0 & LCCR0_LCDT) in pxafb_enable_controller()
1464 lcd_writel(fbi, LCCR4, fbi->reg_lccr4); in pxafb_enable_controller()
1465 lcd_writel(fbi, LCCR3, fbi->reg_lccr3); in pxafb_enable_controller()
1466 lcd_writel(fbi, LCCR2, fbi->reg_lccr2); in pxafb_enable_controller()
1467 lcd_writel(fbi, LCCR1, fbi->reg_lccr1); in pxafb_enable_controller()
1468 lcd_writel(fbi, LCCR0, fbi->reg_lccr0 & ~LCCR0_ENB); in pxafb_enable_controller()
1470 lcd_writel(fbi, FDADR0, fbi->fdadr[0]); in pxafb_enable_controller()
1471 if (fbi->lccr0 & LCCR0_SDS) in pxafb_enable_controller()
1472 lcd_writel(fbi, FDADR1, fbi->fdadr[1]); in pxafb_enable_controller()
1473 lcd_writel(fbi, LCCR0, fbi->reg_lccr0 | LCCR0_ENB); in pxafb_enable_controller()
1476 static void pxafb_disable_controller(struct pxafb_info *fbi) in pxafb_disable_controller() argument
1481 if (fbi->lccr0 & LCCR0_LCDT) { in pxafb_disable_controller()
1482 wait_for_completion_timeout(&fbi->refresh_done, in pxafb_disable_controller()
1489 lcd_writel(fbi, LCSR, 0xffffffff); in pxafb_disable_controller()
1491 lccr0 = lcd_readl(fbi, LCCR0) & ~LCCR0_LDM; in pxafb_disable_controller()
1492 lcd_writel(fbi, LCCR0, lccr0); in pxafb_disable_controller()
1493 lcd_writel(fbi, LCCR0, lccr0 | LCCR0_DIS); in pxafb_disable_controller()
1495 wait_for_completion_timeout(&fbi->disable_done, msecs_to_jiffies(200)); in pxafb_disable_controller()
1498 clk_disable_unprepare(fbi->clk); in pxafb_disable_controller()
1506 struct pxafb_info *fbi = dev_id; in pxafb_handle_irq() local
1509 lcsr = lcd_readl(fbi, LCSR); in pxafb_handle_irq()
1511 lccr0 = lcd_readl(fbi, LCCR0); in pxafb_handle_irq()
1512 lcd_writel(fbi, LCCR0, lccr0 | LCCR0_LDM); in pxafb_handle_irq()
1513 complete(&fbi->disable_done); in pxafb_handle_irq()
1518 complete(&fbi->command_done); in pxafb_handle_irq()
1520 lcd_writel(fbi, LCSR, lcsr); in pxafb_handle_irq()
1524 unsigned int lcsr1 = lcd_readl(fbi, LCSR1); in pxafb_handle_irq()
1526 complete(&fbi->overlay[0].branch_done); in pxafb_handle_irq()
1529 complete(&fbi->overlay[1].branch_done); in pxafb_handle_irq()
1531 lcd_writel(fbi, LCSR1, lcsr1); in pxafb_handle_irq()
1542 static void set_ctrlr_state(struct pxafb_info *fbi, u_int state) in set_ctrlr_state() argument
1546 mutex_lock(&fbi->ctrlr_lock); in set_ctrlr_state()
1548 old_state = fbi->state; in set_ctrlr_state()
1563 fbi->state = state; in set_ctrlr_state()
1565 pxafb_disable_controller(fbi); in set_ctrlr_state()
1575 fbi->state = state; in set_ctrlr_state()
1576 __pxafb_backlight_power(fbi, 0); in set_ctrlr_state()
1577 __pxafb_lcd_power(fbi, 0); in set_ctrlr_state()
1579 pxafb_disable_controller(fbi); in set_ctrlr_state()
1589 fbi->state = C_ENABLE; in set_ctrlr_state()
1590 pxafb_enable_controller(fbi); in set_ctrlr_state()
1602 __pxafb_lcd_power(fbi, 0); in set_ctrlr_state()
1603 pxafb_disable_controller(fbi); in set_ctrlr_state()
1604 pxafb_enable_controller(fbi); in set_ctrlr_state()
1605 __pxafb_lcd_power(fbi, 1); in set_ctrlr_state()
1625 fbi->state = C_ENABLE; in set_ctrlr_state()
1626 pxafb_enable_controller(fbi); in set_ctrlr_state()
1627 __pxafb_lcd_power(fbi, 1); in set_ctrlr_state()
1628 __pxafb_backlight_power(fbi, 1); in set_ctrlr_state()
1632 mutex_unlock(&fbi->ctrlr_lock); in set_ctrlr_state()
1641 struct pxafb_info *fbi = in pxafb_task() local
1643 u_int state = xchg(&fbi->task_state, -1); in pxafb_task()
1645 set_ctrlr_state(fbi, state); in pxafb_task()
1659 struct pxafb_info *fbi = TO_INF(nb, freq_transition); in pxafb_freq_transition() local
1666 if (!(fbi->overlay[0].usage || fbi->overlay[1].usage)) in pxafb_freq_transition()
1668 set_ctrlr_state(fbi, C_DISABLE_CLKCHANGE); in pxafb_freq_transition()
1672 pcd = get_pcd(fbi, fbi->fb.var.pixclock); in pxafb_freq_transition()
1673 set_hsync_time(fbi, pcd); in pxafb_freq_transition()
1674 fbi->reg_lccr3 = (fbi->reg_lccr3 & ~0xff) | in pxafb_freq_transition()
1676 set_ctrlr_state(fbi, C_ENABLE_CLKCHANGE); in pxafb_freq_transition()
1690 struct pxafb_info *fbi = dev_get_drvdata(dev); in pxafb_suspend() local
1692 set_ctrlr_state(fbi, C_DISABLE_PM); in pxafb_suspend()
1698 struct pxafb_info *fbi = dev_get_drvdata(dev); in pxafb_resume() local
1700 set_ctrlr_state(fbi, C_ENABLE_PM); in pxafb_resume()
1710 static int pxafb_init_video_memory(struct pxafb_info *fbi) in pxafb_init_video_memory() argument
1712 int size = PAGE_ALIGN(fbi->video_mem_size); in pxafb_init_video_memory()
1714 fbi->video_mem = alloc_pages_exact(size, GFP_KERNEL | __GFP_ZERO); in pxafb_init_video_memory()
1715 if (fbi->video_mem == NULL) in pxafb_init_video_memory()
1718 fbi->video_mem_phys = virt_to_phys(fbi->video_mem); in pxafb_init_video_memory()
1719 fbi->video_mem_size = size; in pxafb_init_video_memory()
1721 fbi->fb.fix.smem_start = fbi->video_mem_phys; in pxafb_init_video_memory()
1722 fbi->fb.fix.smem_len = fbi->video_mem_size; in pxafb_init_video_memory()
1723 fbi->fb.screen_base = fbi->video_mem; in pxafb_init_video_memory()
1725 return fbi->video_mem ? 0 : -ENOMEM; in pxafb_init_video_memory()
1728 static void pxafb_decode_mach_info(struct pxafb_info *fbi, in pxafb_decode_mach_info() argument
1735 fbi->cmap_inverse = inf->cmap_inverse; in pxafb_decode_mach_info()
1736 fbi->cmap_static = inf->cmap_static; in pxafb_decode_mach_info()
1737 fbi->lccr4 = inf->lccr4; in pxafb_decode_mach_info()
1741 fbi->lccr0 = LCCR0_CMS; in pxafb_decode_mach_info()
1744 fbi->lccr0 = LCCR0_CMS | LCCR0_SDS; in pxafb_decode_mach_info()
1747 fbi->lccr0 = 0; in pxafb_decode_mach_info()
1750 fbi->lccr0 = LCCR0_SDS; in pxafb_decode_mach_info()
1753 fbi->lccr0 = LCCR0_PAS; in pxafb_decode_mach_info()
1756 fbi->lccr0 = LCCR0_LCDT | LCCR0_PAS; in pxafb_decode_mach_info()
1760 fbi->lccr0 = inf->lccr0; in pxafb_decode_mach_info()
1761 fbi->lccr3 = inf->lccr3; in pxafb_decode_mach_info()
1766 fbi->lccr0 |= LCCR0_DPD; in pxafb_decode_mach_info()
1768 fbi->lccr0 |= (lcd_conn & LCD_ALTERNATE_MAPPING) ? LCCR0_LDDALT : 0; in pxafb_decode_mach_info()
1770 fbi->lccr3 = LCCR3_Acb((inf->lcd_conn >> 10) & 0xff); in pxafb_decode_mach_info()
1771 fbi->lccr3 |= (lcd_conn & LCD_BIAS_ACTIVE_LOW) ? LCCR3_OEP : 0; in pxafb_decode_mach_info()
1772 fbi->lccr3 |= (lcd_conn & LCD_PCLK_EDGE_FALL) ? LCCR3_PCP : 0; in pxafb_decode_mach_info()
1775 pxafb_setmode(&fbi->fb.var, &inf->modes[0]); in pxafb_decode_mach_info()
1783 fbi->video_mem_size = max_t(size_t, fbi->video_mem_size, in pxafb_decode_mach_info()
1786 if (inf->video_mem_size > fbi->video_mem_size) in pxafb_decode_mach_info()
1787 fbi->video_mem_size = inf->video_mem_size; in pxafb_decode_mach_info()
1789 if (video_mem_size > fbi->video_mem_size) in pxafb_decode_mach_info()
1790 fbi->video_mem_size = video_mem_size; in pxafb_decode_mach_info()
1796 struct pxafb_info *fbi; in pxafb_init_fbinfo() local
1800 fbi = devm_kzalloc(dev, sizeof(struct pxafb_info) + sizeof(u32) * 16, in pxafb_init_fbinfo()
1802 if (!fbi) in pxafb_init_fbinfo()
1805 fbi->dev = dev; in pxafb_init_fbinfo()
1806 fbi->inf = inf; in pxafb_init_fbinfo()
1808 fbi->clk = devm_clk_get(dev, NULL); in pxafb_init_fbinfo()
1809 if (IS_ERR(fbi->clk)) in pxafb_init_fbinfo()
1810 return ERR_CAST(fbi->clk); 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()
2238 struct pxafb_info *fbi; in pxafb_probe() local
2284 fbi = pxafb_init_fbinfo(&dev->dev, inf); in pxafb_probe()
2285 if (IS_ERR(fbi)) { in pxafb_probe()
2287 ret = PTR_ERR(fbi); in pxafb_probe()
2292 fbi->fb.fix.accel = FB_ACCEL_PXA3XX; in pxafb_probe()
2294 fbi->backlight_power = inf->pxafb_backlight_power; in pxafb_probe()
2295 fbi->lcd_power = inf->pxafb_lcd_power; in pxafb_probe()
2297 fbi->lcd_supply = devm_regulator_get_optional(&dev->dev, "lcd"); in pxafb_probe()
2298 if (IS_ERR(fbi->lcd_supply)) { in pxafb_probe()
2299 if (PTR_ERR(fbi->lcd_supply) == -EPROBE_DEFER) in pxafb_probe()
2302 fbi->lcd_supply = NULL; in pxafb_probe()
2305 fbi->mmio_base = devm_platform_ioremap_resource(dev, 0); in pxafb_probe()
2306 if (IS_ERR(fbi->mmio_base)) { in pxafb_probe()
2308 ret = PTR_ERR(fbi->mmio_base); in pxafb_probe()
2312 fbi->dma_buff_size = PAGE_ALIGN(sizeof(struct pxafb_dma_buff)); in pxafb_probe()
2313 fbi->dma_buff = dma_alloc_coherent(fbi->dev, fbi->dma_buff_size, in pxafb_probe()
2314 &fbi->dma_buff_phys, GFP_KERNEL); in pxafb_probe()
2315 if (fbi->dma_buff == NULL) { in pxafb_probe()
2321 ret = pxafb_init_video_memory(fbi); in pxafb_probe()
2335 ret = devm_request_irq(&dev->dev, irq, pxafb_handle_irq, 0, "LCD", fbi); in pxafb_probe()
2342 ret = pxafb_smart_init(fbi); in pxafb_probe()
2352 ret = pxafb_check_var(&fbi->fb.var, &fbi->fb); in pxafb_probe()
2358 ret = pxafb_set_par(&fbi->fb); in pxafb_probe()
2364 platform_set_drvdata(dev, fbi); in pxafb_probe()
2366 ret = register_framebuffer(&fbi->fb); in pxafb_probe()
2373 pxafb_overlay_init(fbi); in pxafb_probe()
2376 fbi->freq_transition.notifier_call = pxafb_freq_transition; in pxafb_probe()
2377 cpufreq_register_notifier(&fbi->freq_transition, in pxafb_probe()
2384 set_ctrlr_state(fbi, C_ENABLE); in pxafb_probe()
2389 if (fbi->fb.cmap.len) in pxafb_probe()
2390 fb_dealloc_cmap(&fbi->fb.cmap); in pxafb_probe()
2392 free_pages_exact(fbi->video_mem, fbi->video_mem_size); in pxafb_probe()
2394 dma_free_coherent(&dev->dev, fbi->dma_buff_size, in pxafb_probe()
2395 fbi->dma_buff, fbi->dma_buff_phys); in pxafb_probe()
2402 struct pxafb_info *fbi = platform_get_drvdata(dev); in pxafb_remove() local
2405 if (!fbi) in pxafb_remove()
2408 info = &fbi->fb; in pxafb_remove()
2410 pxafb_overlay_exit(fbi); in pxafb_remove()
2413 pxafb_disable_controller(fbi); in pxafb_remove()
2415 if (fbi->fb.cmap.len) in pxafb_remove()
2416 fb_dealloc_cmap(&fbi->fb.cmap); in pxafb_remove()
2418 free_pages_exact(fbi->video_mem, fbi->video_mem_size); in pxafb_remove()
2420 dma_free_coherent(&dev->dev, fbi->dma_buff_size, fbi->dma_buff, in pxafb_remove()
2421 fbi->dma_buff_phys); in pxafb_remove()