• Home
  • Raw
  • Download

Lines Matching +full:layers +full:- +full:configurable

13 #include <linux/dma-mapping.h>
70 #define lcdc_readl(sinfo, reg) __raw_readl((sinfo)->mmio+(reg))
71 #define lcdc_writel(sinfo, reg, val) __raw_writel((val), (sinfo)->mmio+(reg))
73 /* configurable parameters */
108 /* some bl->props field just changed */
112 int power = sinfo->bl_power; in atmel_bl_update_status()
113 int brightness = bl->props.brightness; in atmel_bl_update_status()
119 if (bl->props.fb_blank != sinfo->bl_power) in atmel_bl_update_status()
120 power = bl->props.fb_blank; in atmel_bl_update_status()
121 else if (bl->props.power != sinfo->bl_power) in atmel_bl_update_status()
122 power = bl->props.power; in atmel_bl_update_status()
136 bl->props.fb_blank = bl->props.power = sinfo->bl_power = power; in atmel_bl_update_status()
158 sinfo->bl_power = FB_BLANK_UNBLANK; in init_backlight()
160 if (sinfo->backlight) in init_backlight()
166 bl = backlight_device_register("backlight", &sinfo->pdev->dev, sinfo, in init_backlight()
169 dev_err(&sinfo->pdev->dev, "error %ld on backlight register\n", in init_backlight()
173 sinfo->backlight = bl; in init_backlight()
175 bl->props.power = FB_BLANK_UNBLANK; in init_backlight()
176 bl->props.fb_blank = FB_BLANK_UNBLANK; in init_backlight()
177 bl->props.brightness = atmel_bl_get_brightness(bl); in init_backlight()
182 if (!sinfo->backlight) in exit_backlight()
185 if (sinfo->backlight->ops) { in exit_backlight()
186 sinfo->backlight->props.power = FB_BLANK_POWERDOWN; in exit_backlight()
187 sinfo->backlight->ops->update_status(sinfo->backlight); in exit_backlight()
189 backlight_device_unregister(sinfo->backlight); in exit_backlight()
196 dev_warn(&sinfo->pdev->dev, "backlight control is not available\n"); in init_backlight()
207 struct atmel_lcdfb_pdata *pdata = &sinfo->pdata; in init_contrast()
210 if (pdata->lcdcon_pol_negative) in init_contrast()
217 if (pdata->lcdcon_is_backlight) in init_contrast()
224 struct atmel_lcdfb_pdata *pdata = &sinfo->pdata; in atmel_lcdfb_power_control()
226 if (pdata->atmel_lcdfb_power_control) in atmel_lcdfb_power_control()
227 pdata->atmel_lcdfb_power_control(pdata, on); in atmel_lcdfb_power_control()
228 else if (sinfo->reg_lcd) { in atmel_lcdfb_power_control()
230 ret = regulator_enable(sinfo->reg_lcd); in atmel_lcdfb_power_control()
232 dev_err(&sinfo->pdev->dev, in atmel_lcdfb_power_control()
235 ret = regulator_disable(sinfo->reg_lcd); in atmel_lcdfb_power_control()
237 dev_err(&sinfo->pdev->dev, in atmel_lcdfb_power_control()
258 if (!sinfo->config->have_hozval) in compute_hozval()
281 struct atmel_lcdfb_pdata *pdata = &sinfo->pdata; in atmel_lcdfb_stop_nowait()
285 pdata->guard_time << ATMEL_LCDC_GUARDT_OFFSET); in atmel_lcdfb_stop_nowait()
305 struct atmel_lcdfb_pdata *pdata = &sinfo->pdata; in atmel_lcdfb_start()
307 lcdc_writel(sinfo, ATMEL_LCDC_DMACON, pdata->default_dmacon); in atmel_lcdfb_start()
309 (pdata->guard_time << ATMEL_LCDC_GUARDT_OFFSET) in atmel_lcdfb_start()
316 struct atmel_lcdfb_info *sinfo = info->par; in atmel_lcdfb_update_dma()
317 struct fb_fix_screeninfo *fix = &info->fix; in atmel_lcdfb_update_dma()
320 dma_addr = (fix->smem_start + var->yoffset * fix->line_length in atmel_lcdfb_update_dma()
321 + var->xoffset * info->var.bits_per_pixel / 8); in atmel_lcdfb_update_dma()
331 struct fb_info *info = sinfo->info; in atmel_lcdfb_free_video_memory()
333 dma_free_wc(info->device, info->fix.smem_len, info->screen_base, in atmel_lcdfb_free_video_memory()
334 info->fix.smem_start); in atmel_lcdfb_free_video_memory()
338 * atmel_lcdfb_alloc_video_memory - Allocate framebuffer memory
342 * so no locking by fb_info->mm_lock around smem_len setting is needed.
346 struct fb_info *info = sinfo->info; in atmel_lcdfb_alloc_video_memory()
347 struct fb_var_screeninfo *var = &info->var; in atmel_lcdfb_alloc_video_memory()
350 smem_len = (var->xres_virtual * var->yres_virtual in atmel_lcdfb_alloc_video_memory()
351 * ((var->bits_per_pixel + 7) / 8)); in atmel_lcdfb_alloc_video_memory()
352 info->fix.smem_len = max(smem_len, sinfo->smem_len); in atmel_lcdfb_alloc_video_memory()
354 info->screen_base = dma_alloc_wc(info->device, info->fix.smem_len, in atmel_lcdfb_alloc_video_memory()
355 (dma_addr_t *)&info->fix.smem_start, in atmel_lcdfb_alloc_video_memory()
358 if (!info->screen_base) { in atmel_lcdfb_alloc_video_memory()
359 return -ENOMEM; in atmel_lcdfb_alloc_video_memory()
362 memset(info->screen_base, 0, info->fix.smem_len); in atmel_lcdfb_alloc_video_memory()
374 fbmode = fb_find_nearest_mode(&varfbmode, &info->modelist); in atmel_lcdfb_choose_mode()
382 * atmel_lcdfb_check_var - Validates a var passed in.
396 * -EINVAL will be returned by the upper layers. You don't need
407 struct device *dev = info->device; in atmel_lcdfb_check_var()
408 struct atmel_lcdfb_info *sinfo = info->par; in atmel_lcdfb_check_var()
409 struct atmel_lcdfb_pdata *pdata = &sinfo->pdata; in atmel_lcdfb_check_var()
412 clk_value_khz = clk_get_rate(sinfo->lcdc_clk) / 1000; in atmel_lcdfb_check_var()
416 if (!(var->pixclock && var->bits_per_pixel)) { in atmel_lcdfb_check_var()
420 return -EINVAL; in atmel_lcdfb_check_var()
424 dev_dbg(dev, " resolution: %ux%u\n", var->xres, var->yres); in atmel_lcdfb_check_var()
425 dev_dbg(dev, " pixclk: %lu KHz\n", PICOS2KHZ(var->pixclock)); in atmel_lcdfb_check_var()
426 dev_dbg(dev, " bpp: %u\n", var->bits_per_pixel); in atmel_lcdfb_check_var()
429 if (PICOS2KHZ(var->pixclock) > clk_value_khz) { in atmel_lcdfb_check_var()
430 dev_err(dev, "%lu KHz pixel clock is too fast\n", PICOS2KHZ(var->pixclock)); in atmel_lcdfb_check_var()
431 return -EINVAL; in atmel_lcdfb_check_var()
435 if (var->xres > var->xres_virtual) in atmel_lcdfb_check_var()
436 var->xres_virtual = var->xres; in atmel_lcdfb_check_var()
438 if (var->yres > var->yres_virtual) in atmel_lcdfb_check_var()
439 var->yres_virtual = var->yres; in atmel_lcdfb_check_var()
442 var->xres = (var->xres + 3) & ~3UL; in atmel_lcdfb_check_var()
443 var->xres_virtual = (var->xres_virtual + 3) & ~3UL; in atmel_lcdfb_check_var()
445 var->red.msb_right = var->green.msb_right = var->blue.msb_right = 0; in atmel_lcdfb_check_var()
446 var->transp.msb_right = 0; in atmel_lcdfb_check_var()
447 var->transp.offset = var->transp.length = 0; in atmel_lcdfb_check_var()
448 var->xoffset = var->yoffset = 0; in atmel_lcdfb_check_var()
450 if (info->fix.smem_len) { in atmel_lcdfb_check_var()
451 unsigned int smem_len = (var->xres_virtual * var->yres_virtual in atmel_lcdfb_check_var()
452 * ((var->bits_per_pixel + 7) / 8)); in atmel_lcdfb_check_var()
453 if (smem_len > info->fix.smem_len) { in atmel_lcdfb_check_var()
455 info->fix.smem_len, smem_len); in atmel_lcdfb_check_var()
456 return -EINVAL; in atmel_lcdfb_check_var()
461 var->vsync_len = min_t(u32, var->vsync_len, in atmel_lcdfb_check_var()
463 var->upper_margin = min_t(u32, var->upper_margin, in atmel_lcdfb_check_var()
465 var->lower_margin = min_t(u32, var->lower_margin, in atmel_lcdfb_check_var()
467 var->right_margin = min_t(u32, var->right_margin, in atmel_lcdfb_check_var()
469 var->hsync_len = min_t(u32, var->hsync_len, in atmel_lcdfb_check_var()
471 var->left_margin = min_t(u32, var->left_margin, in atmel_lcdfb_check_var()
475 var->vsync_len = max_t(u32, var->vsync_len, 1); in atmel_lcdfb_check_var()
476 var->right_margin = max_t(u32, var->right_margin, 1); in atmel_lcdfb_check_var()
477 var->hsync_len = max_t(u32, var->hsync_len, 1); in atmel_lcdfb_check_var()
478 var->left_margin = max_t(u32, var->left_margin, 1); in atmel_lcdfb_check_var()
480 switch (var->bits_per_pixel) { in atmel_lcdfb_check_var()
485 var->red.offset = var->green.offset = var->blue.offset = 0; in atmel_lcdfb_check_var()
486 var->red.length = var->green.length = var->blue.length in atmel_lcdfb_check_var()
487 = var->bits_per_pixel; in atmel_lcdfb_check_var()
491 if (sinfo->config->have_intensity_bit) in atmel_lcdfb_check_var()
492 var->green.length = 5; in atmel_lcdfb_check_var()
494 var->green.length = 6; in atmel_lcdfb_check_var()
496 if (pdata->lcd_wiring_mode == ATMEL_LCDC_WIRING_RGB) { in atmel_lcdfb_check_var()
498 var->red.offset = var->green.length + 5; in atmel_lcdfb_check_var()
499 var->blue.offset = 0; in atmel_lcdfb_check_var()
502 var->red.offset = 0; in atmel_lcdfb_check_var()
503 var->blue.offset = var->green.length + 5; in atmel_lcdfb_check_var()
505 var->green.offset = 5; in atmel_lcdfb_check_var()
506 var->red.length = var->blue.length = 5; in atmel_lcdfb_check_var()
509 var->transp.offset = 24; in atmel_lcdfb_check_var()
510 var->transp.length = 8; in atmel_lcdfb_check_var()
513 if (pdata->lcd_wiring_mode == ATMEL_LCDC_WIRING_RGB) { in atmel_lcdfb_check_var()
515 var->red.offset = 16; in atmel_lcdfb_check_var()
516 var->blue.offset = 0; in atmel_lcdfb_check_var()
519 var->red.offset = 0; in atmel_lcdfb_check_var()
520 var->blue.offset = 16; in atmel_lcdfb_check_var()
522 var->green.offset = 8; in atmel_lcdfb_check_var()
523 var->red.length = var->green.length = var->blue.length = 8; in atmel_lcdfb_check_var()
527 var->bits_per_pixel); in atmel_lcdfb_check_var()
528 return -EINVAL; in atmel_lcdfb_check_var()
546 * atmel_lcdfb_set_par - Alters the hardware state.
561 struct atmel_lcdfb_info *sinfo = info->par; in atmel_lcdfb_set_par()
562 struct atmel_lcdfb_pdata *pdata = &sinfo->pdata; in atmel_lcdfb_set_par()
571 dev_dbg(info->device, "%s:\n", __func__); in atmel_lcdfb_set_par()
572 dev_dbg(info->device, " * resolution: %ux%u (%ux%u virtual)\n", in atmel_lcdfb_set_par()
573 info->var.xres, info->var.yres, in atmel_lcdfb_set_par()
574 info->var.xres_virtual, info->var.yres_virtual); in atmel_lcdfb_set_par()
578 if (info->var.bits_per_pixel == 1) in atmel_lcdfb_set_par()
579 info->fix.visual = FB_VISUAL_MONO01; in atmel_lcdfb_set_par()
580 else if (info->var.bits_per_pixel <= 8) in atmel_lcdfb_set_par()
581 info->fix.visual = FB_VISUAL_PSEUDOCOLOR; in atmel_lcdfb_set_par()
583 info->fix.visual = FB_VISUAL_TRUECOLOR; in atmel_lcdfb_set_par()
585 bits_per_line = info->var.xres_virtual * info->var.bits_per_pixel; in atmel_lcdfb_set_par()
586 info->fix.line_length = DIV_ROUND_UP(bits_per_line, 8); in atmel_lcdfb_set_par()
588 /* Re-initialize the DMA engine... */ in atmel_lcdfb_set_par()
589 dev_dbg(info->device, " * update DMA engine\n"); in atmel_lcdfb_set_par()
590 atmel_lcdfb_update_dma(info, &info->var); in atmel_lcdfb_set_par()
593 value = (info->var.yres * info->var.xres * info->var.bits_per_pixel) / 32; in atmel_lcdfb_set_par()
594 value |= ((ATMEL_LCDC_DMA_BURST_LEN - 1) << ATMEL_LCDC_BLENGTH_OFFSET); in atmel_lcdfb_set_par()
600 if (sinfo->config->have_alt_pixclock) in atmel_lcdfb_set_par()
603 clk_value_khz = clk_get_rate(sinfo->lcdc_clk) / 1000; in atmel_lcdfb_set_par()
605 value = DIV_ROUND_UP(clk_value_khz, PICOS2KHZ(info->var.pixclock)); in atmel_lcdfb_set_par()
608 dev_notice(info->device, "Bypassing pixel clock divider\n"); in atmel_lcdfb_set_par()
611 value = (value / pix_factor) - 1; in atmel_lcdfb_set_par()
612 dev_dbg(info->device, " * programming CLKVAL = 0x%08lx\n", in atmel_lcdfb_set_par()
616 info->var.pixclock = in atmel_lcdfb_set_par()
618 dev_dbg(info->device, " updated pixclk: %lu KHz\n", in atmel_lcdfb_set_par()
619 PICOS2KHZ(info->var.pixclock)); in atmel_lcdfb_set_par()
624 value = pdata->default_lcdcon2; in atmel_lcdfb_set_par()
626 if (!(info->var.sync & FB_SYNC_HOR_HIGH_ACT)) in atmel_lcdfb_set_par()
628 if (!(info->var.sync & FB_SYNC_VERT_HIGH_ACT)) in atmel_lcdfb_set_par()
631 switch (info->var.bits_per_pixel) { in atmel_lcdfb_set_par()
642 dev_dbg(info->device, " * LCDCON2 = %08lx\n", value); in atmel_lcdfb_set_par()
646 value = (info->var.vsync_len - 1) << ATMEL_LCDC_VPW_OFFSET; in atmel_lcdfb_set_par()
647 value |= info->var.upper_margin << ATMEL_LCDC_VBP_OFFSET; in atmel_lcdfb_set_par()
648 value |= info->var.lower_margin; in atmel_lcdfb_set_par()
649 dev_dbg(info->device, " * LCDTIM1 = %08lx\n", value); in atmel_lcdfb_set_par()
653 value = (info->var.right_margin - 1) << ATMEL_LCDC_HFP_OFFSET; in atmel_lcdfb_set_par()
654 value |= (info->var.hsync_len - 1) << ATMEL_LCDC_HPW_OFFSET; in atmel_lcdfb_set_par()
655 value |= (info->var.left_margin - 1); in atmel_lcdfb_set_par()
656 dev_dbg(info->device, " * LCDTIM2 = %08lx\n", value); in atmel_lcdfb_set_par()
660 hozval_linesz = compute_hozval(sinfo, info->var.xres); in atmel_lcdfb_set_par()
663 value = (hozval_linesz - 1) << ATMEL_LCDC_HOZVAL_OFFSET; in atmel_lcdfb_set_par()
664 value |= info->var.yres - 1; in atmel_lcdfb_set_par()
665 dev_dbg(info->device, " * LCDFRMCFG = %08lx\n", value); in atmel_lcdfb_set_par()
669 value = ATMEL_LCDC_FIFO_SIZE - (2 * ATMEL_LCDC_DMA_BURST_LEN + 3); in atmel_lcdfb_set_par()
686 dev_dbg(info->device, " * DONE\n"); in atmel_lcdfb_set_par()
694 chan >>= 16 - bf->length; in chan_to_field()
695 return chan << bf->offset; in chan_to_field()
699 * atmel_lcdfb_setcolreg - Optional function. Sets a color register.
727 struct atmel_lcdfb_info *sinfo = info->par; in atmel_lcdfb_setcolreg()
728 struct atmel_lcdfb_pdata *pdata = &sinfo->pdata; in atmel_lcdfb_setcolreg()
733 if (info->var.grayscale) in atmel_lcdfb_setcolreg()
737 switch (info->fix.visual) { in atmel_lcdfb_setcolreg()
740 pal = info->pseudo_palette; in atmel_lcdfb_setcolreg()
742 val = chan_to_field(red, &info->var.red); in atmel_lcdfb_setcolreg()
743 val |= chan_to_field(green, &info->var.green); in atmel_lcdfb_setcolreg()
744 val |= chan_to_field(blue, &info->var.blue); in atmel_lcdfb_setcolreg()
753 if (sinfo->config->have_intensity_bit) { in atmel_lcdfb_setcolreg()
765 if (pdata->lcd_wiring_mode == ATMEL_LCDC_WIRING_RGB) { in atmel_lcdfb_setcolreg()
797 dev_dbg(info->device, "%s\n", __func__); in atmel_lcdfb_pan_display()
806 struct atmel_lcdfb_info *sinfo = info->par; in atmel_lcdfb_blank()
820 return -EINVAL; in atmel_lcdfb_blank()
842 struct atmel_lcdfb_info *sinfo = info->par; in atmel_lcdfb_interrupt()
847 dev_warn(info->device, "FIFO underflow %#x\n", status); in atmel_lcdfb_interrupt()
849 schedule_work(&sinfo->task); in atmel_lcdfb_interrupt()
868 struct fb_info *info = sinfo->info; in atmel_lcdfb_init_fbinfo()
871 info->var.activate |= FB_ACTIVATE_FORCE | FB_ACTIVATE_NOW; in atmel_lcdfb_init_fbinfo()
873 dev_info(info->device, in atmel_lcdfb_init_fbinfo()
875 (unsigned long)info->fix.smem_len / 1024, in atmel_lcdfb_init_fbinfo()
876 (unsigned long)info->fix.smem_start, in atmel_lcdfb_init_fbinfo()
877 info->screen_base); in atmel_lcdfb_init_fbinfo()
880 ret = fb_alloc_cmap(&info->cmap, 256, 0); in atmel_lcdfb_init_fbinfo()
882 dev_err(info->device, "Alloc color map failed\n"); in atmel_lcdfb_init_fbinfo()
889 clk_prepare_enable(sinfo->bus_clk); in atmel_lcdfb_start_clock()
890 clk_prepare_enable(sinfo->lcdc_clk); in atmel_lcdfb_start_clock()
895 clk_disable_unprepare(sinfo->bus_clk); in atmel_lcdfb_stop_clock()
896 clk_disable_unprepare(sinfo->lcdc_clk); in atmel_lcdfb_stop_clock()
900 { .compatible = "atmel,at91sam9261-lcdc" , .data = &at91sam9261_config, },
901 { .compatible = "atmel,at91sam9263-lcdc" , .data = &at91sam9263_config, },
902 { .compatible = "atmel,at91sam9g10-lcdc" , .data = &at91sam9g10_config, },
903 { .compatible = "atmel,at91sam9g45-lcdc" , .data = &at91sam9g45_config, },
904 { .compatible = "atmel,at91sam9g45es-lcdc" , .data = &at91sam9g45es_config, },
905 { .compatible = "atmel,at91sam9rl-lcdc" , .data = &at91sam9rl_config, },
921 err = of_property_read_string(np, "atmel,lcd-wiring-mode", &mode); in atmel_lcdfb_get_of_wiring_modes()
929 return -ENODEV; in atmel_lcdfb_get_of_wiring_modes()
936 list_for_each_entry(og, &pdata->pwr_gpios, list) in atmel_lcdfb_power_control_gpio()
937 gpiod_set_value(og->gpiod, on); in atmel_lcdfb_power_control_gpio()
942 struct fb_info *info = sinfo->info; in atmel_lcdfb_of_init()
943 struct atmel_lcdfb_pdata *pdata = &sinfo->pdata; in atmel_lcdfb_of_init()
944 struct fb_var_screeninfo *var = &info->var; in atmel_lcdfb_of_init()
945 struct device *dev = &sinfo->pdev->dev; in atmel_lcdfb_of_init()
946 struct device_node *np =dev->of_node; in atmel_lcdfb_of_init()
956 sinfo->config = (struct atmel_lcdfb_config*) in atmel_lcdfb_of_init()
957 of_match_device(atmel_lcdfb_dt_ids, dev)->data; in atmel_lcdfb_of_init()
962 return -ENOENT; in atmel_lcdfb_of_init()
965 ret = of_property_read_u32(display_np, "bits-per-pixel", &var->bits_per_pixel); in atmel_lcdfb_of_init()
967 dev_err(dev, "failed to get property bits-per-pixel\n"); in atmel_lcdfb_of_init()
971 ret = of_property_read_u32(display_np, "atmel,guard-time", &pdata->guard_time); in atmel_lcdfb_of_init()
973 dev_err(dev, "failed to get property atmel,guard-time\n"); in atmel_lcdfb_of_init()
977 ret = of_property_read_u32(display_np, "atmel,lcdcon2", &pdata->default_lcdcon2); in atmel_lcdfb_of_init()
983 ret = of_property_read_u32(display_np, "atmel,dmacon", &pdata->default_dmacon); in atmel_lcdfb_of_init()
985 dev_err(dev, "failed to get property bits-per-pixel\n"); in atmel_lcdfb_of_init()
989 INIT_LIST_HEAD(&pdata->pwr_gpios); in atmel_lcdfb_of_init()
990 for (i = 0; i < gpiod_count(dev, "atmel,power-control"); i++) { in atmel_lcdfb_of_init()
991 ret = -ENOMEM; in atmel_lcdfb_of_init()
992 gpiod = devm_gpiod_get_index(dev, "atmel,power-control", in atmel_lcdfb_of_init()
1001 og->gpiod = gpiod; in atmel_lcdfb_of_init()
1006 dev_err(dev, "set direction output gpio atmel,power-control[%d] failed\n", i); in atmel_lcdfb_of_init()
1009 list_add(&og->list, &pdata->pwr_gpios); in atmel_lcdfb_of_init()
1013 pdata->atmel_lcdfb_power_control = atmel_lcdfb_power_control_gpio; in atmel_lcdfb_of_init()
1017 dev_err(dev, "invalid atmel,lcd-wiring-mode\n"); in atmel_lcdfb_of_init()
1020 pdata->lcd_wiring_mode = ret; in atmel_lcdfb_of_init()
1022 pdata->lcdcon_is_backlight = of_property_read_bool(display_np, "atmel,lcdcon-backlight"); in atmel_lcdfb_of_init()
1023 pdata->lcdcon_pol_negative = of_property_read_bool(display_np, "atmel,lcdcon-backlight-inverted"); in atmel_lcdfb_of_init()
1035 fb_add_videomode(&fb_vm, &info->modelist); in atmel_lcdfb_of_init()
1044 struct device *dev = &pdev->dev; in atmel_lcdfb_probe()
1054 ret = -ENOMEM; in atmel_lcdfb_probe()
1059 sinfo = info->par; in atmel_lcdfb_probe()
1060 sinfo->pdev = pdev; in atmel_lcdfb_probe()
1061 sinfo->info = info; in atmel_lcdfb_probe()
1063 INIT_LIST_HEAD(&info->modelist); in atmel_lcdfb_probe()
1065 if (!pdev->dev.of_node) { in atmel_lcdfb_probe()
1074 ret = -ENODEV; in atmel_lcdfb_probe()
1075 if (!sinfo->config) in atmel_lcdfb_probe()
1078 sinfo->reg_lcd = devm_regulator_get(&pdev->dev, "lcd"); in atmel_lcdfb_probe()
1079 if (IS_ERR(sinfo->reg_lcd)) in atmel_lcdfb_probe()
1080 sinfo->reg_lcd = NULL; in atmel_lcdfb_probe()
1082 info->flags = FBINFO_DEFAULT | FBINFO_PARTIAL_PAN_OK | in atmel_lcdfb_probe()
1084 info->pseudo_palette = sinfo->pseudo_palette; in atmel_lcdfb_probe()
1085 info->fbops = &atmel_lcdfb_ops; in atmel_lcdfb_probe()
1087 info->fix = atmel_lcdfb_fix; in atmel_lcdfb_probe()
1088 strcpy(info->fix.id, sinfo->pdev->name); in atmel_lcdfb_probe()
1091 sinfo->bus_clk = clk_get(dev, "hclk"); in atmel_lcdfb_probe()
1092 if (IS_ERR(sinfo->bus_clk)) { in atmel_lcdfb_probe()
1093 ret = PTR_ERR(sinfo->bus_clk); in atmel_lcdfb_probe()
1096 sinfo->lcdc_clk = clk_get(dev, "lcdc_clk"); in atmel_lcdfb_probe()
1097 if (IS_ERR(sinfo->lcdc_clk)) { in atmel_lcdfb_probe()
1098 ret = PTR_ERR(sinfo->lcdc_clk); in atmel_lcdfb_probe()
1103 modelist = list_first_entry(&info->modelist, in atmel_lcdfb_probe()
1105 fb_videomode_to_var(&info->var, &modelist->mode); in atmel_lcdfb_probe()
1107 atmel_lcdfb_check_var(&info->var, info); in atmel_lcdfb_probe()
1112 ret = -ENXIO; in atmel_lcdfb_probe()
1116 sinfo->irq_base = platform_get_irq(pdev, 0); in atmel_lcdfb_probe()
1117 if (sinfo->irq_base < 0) { in atmel_lcdfb_probe()
1118 ret = sinfo->irq_base; in atmel_lcdfb_probe()
1125 /* use a pre-allocated memory buffer */ in atmel_lcdfb_probe()
1126 info->fix.smem_start = map->start; in atmel_lcdfb_probe()
1127 info->fix.smem_len = resource_size(map); in atmel_lcdfb_probe()
1128 if (!request_mem_region(info->fix.smem_start, in atmel_lcdfb_probe()
1129 info->fix.smem_len, pdev->name)) { in atmel_lcdfb_probe()
1130 ret = -EBUSY; in atmel_lcdfb_probe()
1134 info->screen_base = ioremap_wc(info->fix.smem_start, in atmel_lcdfb_probe()
1135 info->fix.smem_len); in atmel_lcdfb_probe()
1136 if (!info->screen_base) { in atmel_lcdfb_probe()
1137 ret = -ENOMEM; in atmel_lcdfb_probe()
1142 * Don't clear the framebuffer -- someone may have set in atmel_lcdfb_probe()
1155 info->fix.mmio_start = regs->start; in atmel_lcdfb_probe()
1156 info->fix.mmio_len = resource_size(regs); in atmel_lcdfb_probe()
1158 if (!request_mem_region(info->fix.mmio_start, in atmel_lcdfb_probe()
1159 info->fix.mmio_len, pdev->name)) { in atmel_lcdfb_probe()
1160 ret = -EBUSY; in atmel_lcdfb_probe()
1164 sinfo->mmio = ioremap(info->fix.mmio_start, info->fix.mmio_len); in atmel_lcdfb_probe()
1165 if (!sinfo->mmio) { in atmel_lcdfb_probe()
1167 ret = -ENOMEM; in atmel_lcdfb_probe()
1175 ret = request_irq(sinfo->irq_base, atmel_lcdfb_interrupt, 0, pdev->name, info); in atmel_lcdfb_probe()
1183 INIT_WORK(&sinfo->task, atmel_lcdfb_task); in atmel_lcdfb_probe()
1212 info->node, info->fix.mmio_start, sinfo->mmio, sinfo->irq_base); in atmel_lcdfb_probe()
1218 fb_dealloc_cmap(&info->cmap); in atmel_lcdfb_probe()
1220 cancel_work_sync(&sinfo->task); in atmel_lcdfb_probe()
1221 free_irq(sinfo->irq_base, info); in atmel_lcdfb_probe()
1224 iounmap(sinfo->mmio); in atmel_lcdfb_probe()
1226 release_mem_region(info->fix.mmio_start, info->fix.mmio_len); in atmel_lcdfb_probe()
1229 iounmap(info->screen_base); in atmel_lcdfb_probe()
1235 release_mem_region(info->fix.smem_start, info->fix.smem_len); in atmel_lcdfb_probe()
1238 clk_put(sinfo->lcdc_clk); in atmel_lcdfb_probe()
1240 clk_put(sinfo->bus_clk); in atmel_lcdfb_probe()
1250 struct device *dev = &pdev->dev; in atmel_lcdfb_remove()
1254 if (!info || !info->par) in atmel_lcdfb_remove()
1256 sinfo = info->par; in atmel_lcdfb_remove()
1258 cancel_work_sync(&sinfo->task); in atmel_lcdfb_remove()
1263 clk_put(sinfo->lcdc_clk); in atmel_lcdfb_remove()
1264 clk_put(sinfo->bus_clk); in atmel_lcdfb_remove()
1265 fb_dealloc_cmap(&info->cmap); in atmel_lcdfb_remove()
1266 free_irq(sinfo->irq_base, info); in atmel_lcdfb_remove()
1267 iounmap(sinfo->mmio); in atmel_lcdfb_remove()
1268 release_mem_region(info->fix.mmio_start, info->fix.mmio_len); in atmel_lcdfb_remove()
1270 iounmap(info->screen_base); in atmel_lcdfb_remove()
1271 release_mem_region(info->fix.smem_start, info->fix.smem_len); in atmel_lcdfb_remove()
1286 struct atmel_lcdfb_info *sinfo = info->par; in atmel_lcdfb_suspend()
1294 sinfo->saved_lcdcon = lcdc_readl(sinfo, ATMEL_LCDC_CONTRAST_CTR); in atmel_lcdfb_suspend()
1306 struct atmel_lcdfb_info *sinfo = info->par; in atmel_lcdfb_resume()
1311 lcdc_writel(sinfo, ATMEL_LCDC_CONTRAST_CTR, sinfo->saved_lcdcon); in atmel_lcdfb_resume()