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

13 #include <linux/dma-mapping.h>
69 #define lcdc_readl(sinfo, reg) __raw_readl((sinfo)->mmio+(reg))
70 #define lcdc_writel(sinfo, reg, val) __raw_writel((val), (sinfo)->mmio+(reg))
72 /* configurable parameters */
107 /* some bl->props field just changed */
140 if (sinfo->backlight) in init_backlight()
146 bl = backlight_device_register("backlight", &sinfo->pdev->dev, sinfo, in init_backlight()
149 dev_err(&sinfo->pdev->dev, "error %ld on backlight register\n", in init_backlight()
153 sinfo->backlight = bl; in init_backlight()
155 bl->props.power = FB_BLANK_UNBLANK; in init_backlight()
156 bl->props.fb_blank = FB_BLANK_UNBLANK; in init_backlight()
157 bl->props.brightness = atmel_bl_get_brightness(bl); in init_backlight()
162 if (!sinfo->backlight) in exit_backlight()
165 if (sinfo->backlight->ops) { in exit_backlight()
166 sinfo->backlight->props.power = FB_BLANK_POWERDOWN; in exit_backlight()
167 sinfo->backlight->ops->update_status(sinfo->backlight); in exit_backlight()
169 backlight_device_unregister(sinfo->backlight); in exit_backlight()
176 dev_warn(&sinfo->pdev->dev, "backlight control is not available\n"); in init_backlight()
187 struct atmel_lcdfb_pdata *pdata = &sinfo->pdata; in init_contrast()
190 if (pdata->lcdcon_pol_negative) in init_contrast()
197 if (pdata->lcdcon_is_backlight) in init_contrast()
204 struct atmel_lcdfb_pdata *pdata = &sinfo->pdata; in atmel_lcdfb_power_control()
206 if (pdata->atmel_lcdfb_power_control) in atmel_lcdfb_power_control()
207 pdata->atmel_lcdfb_power_control(pdata, on); in atmel_lcdfb_power_control()
208 else if (sinfo->reg_lcd) { in atmel_lcdfb_power_control()
210 ret = regulator_enable(sinfo->reg_lcd); in atmel_lcdfb_power_control()
212 dev_err(&sinfo->pdev->dev, in atmel_lcdfb_power_control()
215 ret = regulator_disable(sinfo->reg_lcd); in atmel_lcdfb_power_control()
217 dev_err(&sinfo->pdev->dev, in atmel_lcdfb_power_control()
238 if (!sinfo->config->have_hozval) in compute_hozval()
261 struct atmel_lcdfb_pdata *pdata = &sinfo->pdata; in atmel_lcdfb_stop_nowait()
265 pdata->guard_time << ATMEL_LCDC_GUARDT_OFFSET); in atmel_lcdfb_stop_nowait()
285 struct atmel_lcdfb_pdata *pdata = &sinfo->pdata; in atmel_lcdfb_start()
287 lcdc_writel(sinfo, ATMEL_LCDC_DMACON, pdata->default_dmacon); in atmel_lcdfb_start()
289 (pdata->guard_time << ATMEL_LCDC_GUARDT_OFFSET) in atmel_lcdfb_start()
296 struct atmel_lcdfb_info *sinfo = info->par; in atmel_lcdfb_update_dma()
297 struct fb_fix_screeninfo *fix = &info->fix; in atmel_lcdfb_update_dma()
300 dma_addr = (fix->smem_start + var->yoffset * fix->line_length in atmel_lcdfb_update_dma()
301 + var->xoffset * info->var.bits_per_pixel / 8); in atmel_lcdfb_update_dma()
311 struct fb_info *info = sinfo->info; in atmel_lcdfb_free_video_memory()
313 dma_free_wc(info->device, info->fix.smem_len, info->screen_base, in atmel_lcdfb_free_video_memory()
314 info->fix.smem_start); in atmel_lcdfb_free_video_memory()
318 * atmel_lcdfb_alloc_video_memory - Allocate framebuffer memory
322 * so no locking by fb_info->mm_lock around smem_len setting is needed.
326 struct fb_info *info = sinfo->info; in atmel_lcdfb_alloc_video_memory()
327 struct fb_var_screeninfo *var = &info->var; in atmel_lcdfb_alloc_video_memory()
330 smem_len = (var->xres_virtual * var->yres_virtual in atmel_lcdfb_alloc_video_memory()
331 * ((var->bits_per_pixel + 7) / 8)); in atmel_lcdfb_alloc_video_memory()
332 info->fix.smem_len = max(smem_len, sinfo->smem_len); in atmel_lcdfb_alloc_video_memory()
334 info->screen_base = dma_alloc_wc(info->device, info->fix.smem_len, in atmel_lcdfb_alloc_video_memory()
335 (dma_addr_t *)&info->fix.smem_start, in atmel_lcdfb_alloc_video_memory()
338 if (!info->screen_base) { in atmel_lcdfb_alloc_video_memory()
339 return -ENOMEM; in atmel_lcdfb_alloc_video_memory()
342 memset(info->screen_base, 0, info->fix.smem_len); in atmel_lcdfb_alloc_video_memory()
354 fbmode = fb_find_nearest_mode(&varfbmode, &info->modelist); in atmel_lcdfb_choose_mode()
362 * atmel_lcdfb_check_var - Validates a var passed in.
376 * -EINVAL will be returned by the upper layers. You don't need
387 struct device *dev = info->device; in atmel_lcdfb_check_var()
388 struct atmel_lcdfb_info *sinfo = info->par; in atmel_lcdfb_check_var()
389 struct atmel_lcdfb_pdata *pdata = &sinfo->pdata; in atmel_lcdfb_check_var()
392 clk_value_khz = clk_get_rate(sinfo->lcdc_clk) / 1000; in atmel_lcdfb_check_var()
396 if (!(var->pixclock && var->bits_per_pixel)) { in atmel_lcdfb_check_var()
400 return -EINVAL; in atmel_lcdfb_check_var()
404 dev_dbg(dev, " resolution: %ux%u\n", var->xres, var->yres); in atmel_lcdfb_check_var()
405 dev_dbg(dev, " pixclk: %lu KHz\n", PICOS2KHZ(var->pixclock)); in atmel_lcdfb_check_var()
406 dev_dbg(dev, " bpp: %u\n", var->bits_per_pixel); in atmel_lcdfb_check_var()
409 if (PICOS2KHZ(var->pixclock) > clk_value_khz) { in atmel_lcdfb_check_var()
410 dev_err(dev, "%lu KHz pixel clock is too fast\n", PICOS2KHZ(var->pixclock)); in atmel_lcdfb_check_var()
411 return -EINVAL; in atmel_lcdfb_check_var()
415 if (var->xres > var->xres_virtual) in atmel_lcdfb_check_var()
416 var->xres_virtual = var->xres; in atmel_lcdfb_check_var()
418 if (var->yres > var->yres_virtual) in atmel_lcdfb_check_var()
419 var->yres_virtual = var->yres; in atmel_lcdfb_check_var()
422 var->xres = (var->xres + 3) & ~3UL; in atmel_lcdfb_check_var()
423 var->xres_virtual = (var->xres_virtual + 3) & ~3UL; in atmel_lcdfb_check_var()
425 var->red.msb_right = var->green.msb_right = var->blue.msb_right = 0; in atmel_lcdfb_check_var()
426 var->transp.msb_right = 0; in atmel_lcdfb_check_var()
427 var->transp.offset = var->transp.length = 0; in atmel_lcdfb_check_var()
428 var->xoffset = var->yoffset = 0; in atmel_lcdfb_check_var()
430 if (info->fix.smem_len) { in atmel_lcdfb_check_var()
431 unsigned int smem_len = (var->xres_virtual * var->yres_virtual in atmel_lcdfb_check_var()
432 * ((var->bits_per_pixel + 7) / 8)); in atmel_lcdfb_check_var()
433 if (smem_len > info->fix.smem_len) { in atmel_lcdfb_check_var()
435 info->fix.smem_len, smem_len); in atmel_lcdfb_check_var()
436 return -EINVAL; in atmel_lcdfb_check_var()
441 var->vsync_len = min_t(u32, var->vsync_len, in atmel_lcdfb_check_var()
443 var->upper_margin = min_t(u32, var->upper_margin, in atmel_lcdfb_check_var()
445 var->lower_margin = min_t(u32, var->lower_margin, in atmel_lcdfb_check_var()
447 var->right_margin = min_t(u32, var->right_margin, in atmel_lcdfb_check_var()
449 var->hsync_len = min_t(u32, var->hsync_len, in atmel_lcdfb_check_var()
451 var->left_margin = min_t(u32, var->left_margin, in atmel_lcdfb_check_var()
455 var->vsync_len = max_t(u32, var->vsync_len, 1); in atmel_lcdfb_check_var()
456 var->right_margin = max_t(u32, var->right_margin, 1); in atmel_lcdfb_check_var()
457 var->hsync_len = max_t(u32, var->hsync_len, 1); in atmel_lcdfb_check_var()
458 var->left_margin = max_t(u32, var->left_margin, 1); in atmel_lcdfb_check_var()
460 switch (var->bits_per_pixel) { in atmel_lcdfb_check_var()
465 var->red.offset = var->green.offset = var->blue.offset = 0; in atmel_lcdfb_check_var()
466 var->red.length = var->green.length = var->blue.length in atmel_lcdfb_check_var()
467 = var->bits_per_pixel; in atmel_lcdfb_check_var()
471 if (sinfo->config->have_intensity_bit) in atmel_lcdfb_check_var()
472 var->green.length = 5; in atmel_lcdfb_check_var()
474 var->green.length = 6; in atmel_lcdfb_check_var()
476 if (pdata->lcd_wiring_mode == ATMEL_LCDC_WIRING_RGB) { in atmel_lcdfb_check_var()
478 var->red.offset = var->green.length + 5; in atmel_lcdfb_check_var()
479 var->blue.offset = 0; in atmel_lcdfb_check_var()
482 var->red.offset = 0; in atmel_lcdfb_check_var()
483 var->blue.offset = var->green.length + 5; in atmel_lcdfb_check_var()
485 var->green.offset = 5; in atmel_lcdfb_check_var()
486 var->red.length = var->blue.length = 5; in atmel_lcdfb_check_var()
489 var->transp.offset = 24; in atmel_lcdfb_check_var()
490 var->transp.length = 8; in atmel_lcdfb_check_var()
493 if (pdata->lcd_wiring_mode == ATMEL_LCDC_WIRING_RGB) { in atmel_lcdfb_check_var()
495 var->red.offset = 16; in atmel_lcdfb_check_var()
496 var->blue.offset = 0; in atmel_lcdfb_check_var()
499 var->red.offset = 0; in atmel_lcdfb_check_var()
500 var->blue.offset = 16; in atmel_lcdfb_check_var()
502 var->green.offset = 8; in atmel_lcdfb_check_var()
503 var->red.length = var->green.length = var->blue.length = 8; in atmel_lcdfb_check_var()
507 var->bits_per_pixel); in atmel_lcdfb_check_var()
508 return -EINVAL; in atmel_lcdfb_check_var()
526 * atmel_lcdfb_set_par - Alters the hardware state.
541 struct atmel_lcdfb_info *sinfo = info->par; in atmel_lcdfb_set_par()
542 struct atmel_lcdfb_pdata *pdata = &sinfo->pdata; in atmel_lcdfb_set_par()
551 dev_dbg(info->device, "%s:\n", __func__); in atmel_lcdfb_set_par()
552 dev_dbg(info->device, " * resolution: %ux%u (%ux%u virtual)\n", in atmel_lcdfb_set_par()
553 info->var.xres, info->var.yres, in atmel_lcdfb_set_par()
554 info->var.xres_virtual, info->var.yres_virtual); in atmel_lcdfb_set_par()
558 if (info->var.bits_per_pixel == 1) in atmel_lcdfb_set_par()
559 info->fix.visual = FB_VISUAL_MONO01; in atmel_lcdfb_set_par()
560 else if (info->var.bits_per_pixel <= 8) in atmel_lcdfb_set_par()
561 info->fix.visual = FB_VISUAL_PSEUDOCOLOR; in atmel_lcdfb_set_par()
563 info->fix.visual = FB_VISUAL_TRUECOLOR; in atmel_lcdfb_set_par()
565 bits_per_line = info->var.xres_virtual * info->var.bits_per_pixel; in atmel_lcdfb_set_par()
566 info->fix.line_length = DIV_ROUND_UP(bits_per_line, 8); in atmel_lcdfb_set_par()
568 /* Re-initialize the DMA engine... */ in atmel_lcdfb_set_par()
569 dev_dbg(info->device, " * update DMA engine\n"); in atmel_lcdfb_set_par()
570 atmel_lcdfb_update_dma(info, &info->var); in atmel_lcdfb_set_par()
573 value = (info->var.yres * info->var.xres * info->var.bits_per_pixel) / 32; in atmel_lcdfb_set_par()
574 value |= ((ATMEL_LCDC_DMA_BURST_LEN - 1) << ATMEL_LCDC_BLENGTH_OFFSET); in atmel_lcdfb_set_par()
580 if (sinfo->config->have_alt_pixclock) in atmel_lcdfb_set_par()
583 clk_value_khz = clk_get_rate(sinfo->lcdc_clk) / 1000; in atmel_lcdfb_set_par()
585 value = DIV_ROUND_UP(clk_value_khz, PICOS2KHZ(info->var.pixclock)); in atmel_lcdfb_set_par()
588 dev_notice(info->device, "Bypassing pixel clock divider\n"); in atmel_lcdfb_set_par()
591 value = (value / pix_factor) - 1; in atmel_lcdfb_set_par()
592 dev_dbg(info->device, " * programming CLKVAL = 0x%08lx\n", in atmel_lcdfb_set_par()
596 info->var.pixclock = in atmel_lcdfb_set_par()
598 dev_dbg(info->device, " updated pixclk: %lu KHz\n", in atmel_lcdfb_set_par()
599 PICOS2KHZ(info->var.pixclock)); in atmel_lcdfb_set_par()
604 value = pdata->default_lcdcon2; in atmel_lcdfb_set_par()
606 if (!(info->var.sync & FB_SYNC_HOR_HIGH_ACT)) in atmel_lcdfb_set_par()
608 if (!(info->var.sync & FB_SYNC_VERT_HIGH_ACT)) in atmel_lcdfb_set_par()
611 switch (info->var.bits_per_pixel) { in atmel_lcdfb_set_par()
622 dev_dbg(info->device, " * LCDCON2 = %08lx\n", value); in atmel_lcdfb_set_par()
626 value = (info->var.vsync_len - 1) << ATMEL_LCDC_VPW_OFFSET; in atmel_lcdfb_set_par()
627 value |= info->var.upper_margin << ATMEL_LCDC_VBP_OFFSET; in atmel_lcdfb_set_par()
628 value |= info->var.lower_margin; in atmel_lcdfb_set_par()
629 dev_dbg(info->device, " * LCDTIM1 = %08lx\n", value); in atmel_lcdfb_set_par()
633 value = (info->var.right_margin - 1) << ATMEL_LCDC_HFP_OFFSET; in atmel_lcdfb_set_par()
634 value |= (info->var.hsync_len - 1) << ATMEL_LCDC_HPW_OFFSET; in atmel_lcdfb_set_par()
635 value |= (info->var.left_margin - 1); in atmel_lcdfb_set_par()
636 dev_dbg(info->device, " * LCDTIM2 = %08lx\n", value); in atmel_lcdfb_set_par()
640 hozval_linesz = compute_hozval(sinfo, info->var.xres); in atmel_lcdfb_set_par()
643 value = (hozval_linesz - 1) << ATMEL_LCDC_HOZVAL_OFFSET; in atmel_lcdfb_set_par()
644 value |= info->var.yres - 1; in atmel_lcdfb_set_par()
645 dev_dbg(info->device, " * LCDFRMCFG = %08lx\n", value); in atmel_lcdfb_set_par()
649 value = ATMEL_LCDC_FIFO_SIZE - (2 * ATMEL_LCDC_DMA_BURST_LEN + 3); in atmel_lcdfb_set_par()
666 dev_dbg(info->device, " * DONE\n"); in atmel_lcdfb_set_par()
674 chan >>= 16 - bf->length; in chan_to_field()
675 return chan << bf->offset; in chan_to_field()
679 * atmel_lcdfb_setcolreg - Optional function. Sets a color register.
707 struct atmel_lcdfb_info *sinfo = info->par; in atmel_lcdfb_setcolreg()
708 struct atmel_lcdfb_pdata *pdata = &sinfo->pdata; in atmel_lcdfb_setcolreg()
713 if (info->var.grayscale) in atmel_lcdfb_setcolreg()
717 switch (info->fix.visual) { in atmel_lcdfb_setcolreg()
720 pal = info->pseudo_palette; in atmel_lcdfb_setcolreg()
722 val = chan_to_field(red, &info->var.red); in atmel_lcdfb_setcolreg()
723 val |= chan_to_field(green, &info->var.green); in atmel_lcdfb_setcolreg()
724 val |= chan_to_field(blue, &info->var.blue); in atmel_lcdfb_setcolreg()
733 if (sinfo->config->have_intensity_bit) { in atmel_lcdfb_setcolreg()
745 if (pdata->lcd_wiring_mode == ATMEL_LCDC_WIRING_RGB) { in atmel_lcdfb_setcolreg()
777 dev_dbg(info->device, "%s\n", __func__); in atmel_lcdfb_pan_display()
786 struct atmel_lcdfb_info *sinfo = info->par; in atmel_lcdfb_blank()
800 return -EINVAL; in atmel_lcdfb_blank()
820 struct atmel_lcdfb_info *sinfo = info->par; in atmel_lcdfb_interrupt()
825 dev_warn(info->device, "FIFO underflow %#x\n", status); in atmel_lcdfb_interrupt()
827 schedule_work(&sinfo->task); in atmel_lcdfb_interrupt()
846 struct fb_info *info = sinfo->info; in atmel_lcdfb_init_fbinfo()
849 info->var.activate |= FB_ACTIVATE_FORCE | FB_ACTIVATE_NOW; in atmel_lcdfb_init_fbinfo()
851 dev_info(info->device, in atmel_lcdfb_init_fbinfo()
853 (unsigned long)info->fix.smem_len / 1024, in atmel_lcdfb_init_fbinfo()
854 (unsigned long)info->fix.smem_start, in atmel_lcdfb_init_fbinfo()
855 info->screen_base); in atmel_lcdfb_init_fbinfo()
858 ret = fb_alloc_cmap(&info->cmap, 256, 0); in atmel_lcdfb_init_fbinfo()
860 dev_err(info->device, "Alloc color map failed\n"); in atmel_lcdfb_init_fbinfo()
867 clk_prepare_enable(sinfo->bus_clk); in atmel_lcdfb_start_clock()
868 clk_prepare_enable(sinfo->lcdc_clk); in atmel_lcdfb_start_clock()
873 clk_disable_unprepare(sinfo->bus_clk); in atmel_lcdfb_stop_clock()
874 clk_disable_unprepare(sinfo->lcdc_clk); in atmel_lcdfb_stop_clock()
878 { .compatible = "atmel,at91sam9261-lcdc" , .data = &at91sam9261_config, },
879 { .compatible = "atmel,at91sam9263-lcdc" , .data = &at91sam9263_config, },
880 { .compatible = "atmel,at91sam9g10-lcdc" , .data = &at91sam9g10_config, },
881 { .compatible = "atmel,at91sam9g45-lcdc" , .data = &at91sam9g45_config, },
882 { .compatible = "atmel,at91sam9g45es-lcdc" , .data = &at91sam9g45es_config, },
883 { .compatible = "atmel,at91sam9rl-lcdc" , .data = &at91sam9rl_config, },
899 err = of_property_read_string(np, "atmel,lcd-wiring-mode", &mode); in atmel_lcdfb_get_of_wiring_modes()
907 return -ENODEV; in atmel_lcdfb_get_of_wiring_modes()
914 list_for_each_entry(og, &pdata->pwr_gpios, list) in atmel_lcdfb_power_control_gpio()
915 gpiod_set_value(og->gpiod, on); in atmel_lcdfb_power_control_gpio()
920 struct fb_info *info = sinfo->info; in atmel_lcdfb_of_init()
921 struct atmel_lcdfb_pdata *pdata = &sinfo->pdata; in atmel_lcdfb_of_init()
922 struct fb_var_screeninfo *var = &info->var; in atmel_lcdfb_of_init()
923 struct device *dev = &sinfo->pdev->dev; in atmel_lcdfb_of_init()
924 struct device_node *np =dev->of_node; in atmel_lcdfb_of_init()
934 sinfo->config = (struct atmel_lcdfb_config*) in atmel_lcdfb_of_init()
935 of_match_device(atmel_lcdfb_dt_ids, dev)->data; in atmel_lcdfb_of_init()
940 return -ENOENT; in atmel_lcdfb_of_init()
943 ret = of_property_read_u32(display_np, "bits-per-pixel", &var->bits_per_pixel); in atmel_lcdfb_of_init()
945 dev_err(dev, "failed to get property bits-per-pixel\n"); in atmel_lcdfb_of_init()
949 ret = of_property_read_u32(display_np, "atmel,guard-time", &pdata->guard_time); in atmel_lcdfb_of_init()
951 dev_err(dev, "failed to get property atmel,guard-time\n"); in atmel_lcdfb_of_init()
955 ret = of_property_read_u32(display_np, "atmel,lcdcon2", &pdata->default_lcdcon2); in atmel_lcdfb_of_init()
961 ret = of_property_read_u32(display_np, "atmel,dmacon", &pdata->default_dmacon); in atmel_lcdfb_of_init()
963 dev_err(dev, "failed to get property bits-per-pixel\n"); in atmel_lcdfb_of_init()
967 INIT_LIST_HEAD(&pdata->pwr_gpios); in atmel_lcdfb_of_init()
968 for (i = 0; i < gpiod_count(dev, "atmel,power-control"); i++) { in atmel_lcdfb_of_init()
969 ret = -ENOMEM; in atmel_lcdfb_of_init()
970 gpiod = devm_gpiod_get_index(dev, "atmel,power-control", in atmel_lcdfb_of_init()
979 og->gpiod = gpiod; in atmel_lcdfb_of_init()
984 dev_err(dev, "set direction output gpio atmel,power-control[%d] failed\n", i); in atmel_lcdfb_of_init()
987 list_add(&og->list, &pdata->pwr_gpios); in atmel_lcdfb_of_init()
991 pdata->atmel_lcdfb_power_control = atmel_lcdfb_power_control_gpio; in atmel_lcdfb_of_init()
995 dev_err(dev, "invalid atmel,lcd-wiring-mode\n"); in atmel_lcdfb_of_init()
998 pdata->lcd_wiring_mode = ret; in atmel_lcdfb_of_init()
1000 pdata->lcdcon_is_backlight = of_property_read_bool(display_np, "atmel,lcdcon-backlight"); in atmel_lcdfb_of_init()
1001 pdata->lcdcon_pol_negative = of_property_read_bool(display_np, "atmel,lcdcon-backlight-inverted"); in atmel_lcdfb_of_init()
1013 fb_add_videomode(&fb_vm, &info->modelist); in atmel_lcdfb_of_init()
1022 struct device *dev = &pdev->dev; in atmel_lcdfb_probe()
1032 ret = -ENOMEM; in atmel_lcdfb_probe()
1037 sinfo = info->par; in atmel_lcdfb_probe()
1038 sinfo->pdev = pdev; in atmel_lcdfb_probe()
1039 sinfo->info = info; in atmel_lcdfb_probe()
1041 INIT_LIST_HEAD(&info->modelist); in atmel_lcdfb_probe()
1043 if (!pdev->dev.of_node) { in atmel_lcdfb_probe()
1052 ret = -ENODEV; in atmel_lcdfb_probe()
1053 if (!sinfo->config) in atmel_lcdfb_probe()
1056 sinfo->reg_lcd = devm_regulator_get(&pdev->dev, "lcd"); in atmel_lcdfb_probe()
1057 if (IS_ERR(sinfo->reg_lcd)) in atmel_lcdfb_probe()
1058 sinfo->reg_lcd = NULL; in atmel_lcdfb_probe()
1060 info->flags = FBINFO_PARTIAL_PAN_OK | in atmel_lcdfb_probe()
1062 info->pseudo_palette = sinfo->pseudo_palette; in atmel_lcdfb_probe()
1063 info->fbops = &atmel_lcdfb_ops; in atmel_lcdfb_probe()
1065 info->fix = atmel_lcdfb_fix; in atmel_lcdfb_probe()
1066 strcpy(info->fix.id, sinfo->pdev->name); in atmel_lcdfb_probe()
1069 sinfo->bus_clk = clk_get(dev, "hclk"); in atmel_lcdfb_probe()
1070 if (IS_ERR(sinfo->bus_clk)) { in atmel_lcdfb_probe()
1071 ret = PTR_ERR(sinfo->bus_clk); in atmel_lcdfb_probe()
1074 sinfo->lcdc_clk = clk_get(dev, "lcdc_clk"); in atmel_lcdfb_probe()
1075 if (IS_ERR(sinfo->lcdc_clk)) { in atmel_lcdfb_probe()
1076 ret = PTR_ERR(sinfo->lcdc_clk); in atmel_lcdfb_probe()
1081 modelist = list_first_entry(&info->modelist, in atmel_lcdfb_probe()
1083 fb_videomode_to_var(&info->var, &modelist->mode); in atmel_lcdfb_probe()
1085 atmel_lcdfb_check_var(&info->var, info); in atmel_lcdfb_probe()
1090 ret = -ENXIO; in atmel_lcdfb_probe()
1094 sinfo->irq_base = platform_get_irq(pdev, 0); in atmel_lcdfb_probe()
1095 if (sinfo->irq_base < 0) { in atmel_lcdfb_probe()
1096 ret = sinfo->irq_base; in atmel_lcdfb_probe()
1103 /* use a pre-allocated memory buffer */ in atmel_lcdfb_probe()
1104 info->fix.smem_start = map->start; in atmel_lcdfb_probe()
1105 info->fix.smem_len = resource_size(map); in atmel_lcdfb_probe()
1106 if (!request_mem_region(info->fix.smem_start, in atmel_lcdfb_probe()
1107 info->fix.smem_len, pdev->name)) { in atmel_lcdfb_probe()
1108 ret = -EBUSY; in atmel_lcdfb_probe()
1112 info->screen_base = ioremap_wc(info->fix.smem_start, in atmel_lcdfb_probe()
1113 info->fix.smem_len); in atmel_lcdfb_probe()
1114 if (!info->screen_base) { in atmel_lcdfb_probe()
1115 ret = -ENOMEM; in atmel_lcdfb_probe()
1120 * Don't clear the framebuffer -- someone may have set in atmel_lcdfb_probe()
1133 info->fix.mmio_start = regs->start; in atmel_lcdfb_probe()
1134 info->fix.mmio_len = resource_size(regs); in atmel_lcdfb_probe()
1136 if (!request_mem_region(info->fix.mmio_start, in atmel_lcdfb_probe()
1137 info->fix.mmio_len, pdev->name)) { in atmel_lcdfb_probe()
1138 ret = -EBUSY; in atmel_lcdfb_probe()
1142 sinfo->mmio = ioremap(info->fix.mmio_start, info->fix.mmio_len); in atmel_lcdfb_probe()
1143 if (!sinfo->mmio) { in atmel_lcdfb_probe()
1145 ret = -ENOMEM; in atmel_lcdfb_probe()
1153 ret = request_irq(sinfo->irq_base, atmel_lcdfb_interrupt, 0, pdev->name, info); in atmel_lcdfb_probe()
1161 INIT_WORK(&sinfo->task, atmel_lcdfb_task); in atmel_lcdfb_probe()
1190 info->node, info->fix.mmio_start, sinfo->mmio, sinfo->irq_base); in atmel_lcdfb_probe()
1196 fb_dealloc_cmap(&info->cmap); in atmel_lcdfb_probe()
1198 cancel_work_sync(&sinfo->task); in atmel_lcdfb_probe()
1199 free_irq(sinfo->irq_base, info); in atmel_lcdfb_probe()
1202 iounmap(sinfo->mmio); in atmel_lcdfb_probe()
1204 release_mem_region(info->fix.mmio_start, info->fix.mmio_len); in atmel_lcdfb_probe()
1207 iounmap(info->screen_base); in atmel_lcdfb_probe()
1213 release_mem_region(info->fix.smem_start, info->fix.smem_len); in atmel_lcdfb_probe()
1216 clk_put(sinfo->lcdc_clk); in atmel_lcdfb_probe()
1218 clk_put(sinfo->bus_clk); in atmel_lcdfb_probe()
1228 struct device *dev = &pdev->dev; in atmel_lcdfb_remove()
1232 if (!info || !info->par) in atmel_lcdfb_remove()
1234 sinfo = info->par; in atmel_lcdfb_remove()
1236 cancel_work_sync(&sinfo->task); in atmel_lcdfb_remove()
1241 clk_put(sinfo->lcdc_clk); in atmel_lcdfb_remove()
1242 clk_put(sinfo->bus_clk); in atmel_lcdfb_remove()
1243 fb_dealloc_cmap(&info->cmap); in atmel_lcdfb_remove()
1244 free_irq(sinfo->irq_base, info); in atmel_lcdfb_remove()
1245 iounmap(sinfo->mmio); in atmel_lcdfb_remove()
1246 release_mem_region(info->fix.mmio_start, info->fix.mmio_len); in atmel_lcdfb_remove()
1248 iounmap(info->screen_base); in atmel_lcdfb_remove()
1249 release_mem_region(info->fix.smem_start, info->fix.smem_len); in atmel_lcdfb_remove()
1262 struct atmel_lcdfb_info *sinfo = info->par; in atmel_lcdfb_suspend()
1270 sinfo->saved_lcdcon = lcdc_readl(sinfo, ATMEL_LCDC_CONTRAST_CTR); in atmel_lcdfb_suspend()
1282 struct atmel_lcdfb_info *sinfo = info->par; in atmel_lcdfb_resume()
1287 lcdc_writel(sinfo, ATMEL_LCDC_CONTRAST_CTR, sinfo->saved_lcdcon); in atmel_lcdfb_resume()