diff options
author | Paul Mundt <lethal@linux-sh.org> | 2009-09-16 00:48:32 -0400 |
---|---|---|
committer | Paul Mundt <lethal@linux-sh.org> | 2009-09-16 00:48:32 -0400 |
commit | ea88023b3491a384575ebcd5e8a449e841a28a24 (patch) | |
tree | f46e3d8302e44dc55ce31823501e100472d29683 /drivers/video | |
parent | a6f15ade97989d414e9bf33874c9d5d1f39808ec (diff) | |
parent | 0cb583fd2862f19ea88b02eb307d11c09e51e2f8 (diff) |
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6
Conflicts:
arch/sh/kernel/vmlinux.lds.S
Diffstat (limited to 'drivers/video')
-rw-r--r-- | drivers/video/Kconfig | 4 | ||||
-rw-r--r-- | drivers/video/atmel_lcdfb.c | 6 | ||||
-rw-r--r-- | drivers/video/backlight/Kconfig | 2 | ||||
-rw-r--r-- | drivers/video/imxfb.c | 184 | ||||
-rw-r--r-- | drivers/video/ps3fb.c | 2 | ||||
-rw-r--r-- | drivers/video/sa1100fb.c | 2 | ||||
-rw-r--r-- | drivers/video/uvesafb.c | 3 |
7 files changed, 135 insertions, 68 deletions
diff --git a/drivers/video/Kconfig b/drivers/video/Kconfig index 7e2c9774f08f..49f2c4bdf904 100644 --- a/drivers/video/Kconfig +++ b/drivers/video/Kconfig | |||
@@ -935,7 +935,7 @@ config FB_S1D13XXX | |||
935 | 935 | ||
936 | config FB_ATMEL | 936 | config FB_ATMEL |
937 | tristate "AT91/AT32 LCD Controller support" | 937 | tristate "AT91/AT32 LCD Controller support" |
938 | depends on FB && (ARCH_AT91SAM9261 || ARCH_AT91SAM9263 || ARCH_AT91SAM9RL || ARCH_AT91CAP9 || AVR32) | 938 | depends on FB && (ARCH_AT91SAM9261 || ARCH_AT91SAM9G10 || ARCH_AT91SAM9263 || ARCH_AT91SAM9RL || ARCH_AT91SAM9G45 || ARCH_AT91CAP9 || AVR32) |
939 | select FB_CFB_FILLRECT | 939 | select FB_CFB_FILLRECT |
940 | select FB_CFB_COPYAREA | 940 | select FB_CFB_COPYAREA |
941 | select FB_CFB_IMAGEBLIT | 941 | select FB_CFB_IMAGEBLIT |
@@ -951,7 +951,7 @@ config FB_INTSRAM | |||
951 | 951 | ||
952 | config FB_ATMEL_STN | 952 | config FB_ATMEL_STN |
953 | bool "Use a STN display with AT91/AT32 LCD Controller" | 953 | bool "Use a STN display with AT91/AT32 LCD Controller" |
954 | depends on FB_ATMEL && MACH_AT91SAM9261EK | 954 | depends on FB_ATMEL && (MACH_AT91SAM9261EK || MACH_AT91SAM9G10EK) |
955 | default n | 955 | default n |
956 | help | 956 | help |
957 | Say Y if you want to connect a STN LCD display to the AT91/AT32 LCD | 957 | Say Y if you want to connect a STN LCD display to the AT91/AT32 LCD |
diff --git a/drivers/video/atmel_lcdfb.c b/drivers/video/atmel_lcdfb.c index da05f0801bb7..2830ffd72976 100644 --- a/drivers/video/atmel_lcdfb.c +++ b/drivers/video/atmel_lcdfb.c | |||
@@ -182,7 +182,8 @@ static unsigned long compute_hozval(unsigned long xres, unsigned long lcdcon2) | |||
182 | { | 182 | { |
183 | unsigned long value; | 183 | unsigned long value; |
184 | 184 | ||
185 | if (!(cpu_is_at91sam9261() || cpu_is_at32ap7000())) | 185 | if (!(cpu_is_at91sam9261() || cpu_is_at91sam9g10() |
186 | || cpu_is_at32ap7000())) | ||
186 | return xres; | 187 | return xres; |
187 | 188 | ||
188 | value = xres; | 189 | value = xres; |
@@ -824,7 +825,8 @@ static int __init atmel_lcdfb_probe(struct platform_device *pdev) | |||
824 | info->fix = atmel_lcdfb_fix; | 825 | info->fix = atmel_lcdfb_fix; |
825 | 826 | ||
826 | /* Enable LCDC Clocks */ | 827 | /* Enable LCDC Clocks */ |
827 | if (cpu_is_at91sam9261() || cpu_is_at32ap7000()) { | 828 | if (cpu_is_at91sam9261() || cpu_is_at91sam9g10() |
829 | || cpu_is_at32ap7000()) { | ||
828 | sinfo->bus_clk = clk_get(dev, "hck1"); | 830 | sinfo->bus_clk = clk_get(dev, "hck1"); |
829 | if (IS_ERR(sinfo->bus_clk)) { | 831 | if (IS_ERR(sinfo->bus_clk)) { |
830 | ret = PTR_ERR(sinfo->bus_clk); | 832 | ret = PTR_ERR(sinfo->bus_clk); |
diff --git a/drivers/video/backlight/Kconfig b/drivers/video/backlight/Kconfig index f9d19be05540..90861cd93165 100644 --- a/drivers/video/backlight/Kconfig +++ b/drivers/video/backlight/Kconfig | |||
@@ -110,7 +110,7 @@ config BACKLIGHT_CLASS_DEVICE | |||
110 | config BACKLIGHT_ATMEL_LCDC | 110 | config BACKLIGHT_ATMEL_LCDC |
111 | bool "Atmel LCDC Contrast-as-Backlight control" | 111 | bool "Atmel LCDC Contrast-as-Backlight control" |
112 | depends on BACKLIGHT_CLASS_DEVICE && FB_ATMEL | 112 | depends on BACKLIGHT_CLASS_DEVICE && FB_ATMEL |
113 | default y if MACH_SAM9261EK || MACH_SAM9263EK | 113 | default y if MACH_SAM9261EK || MACH_SAM9G10EK || MACH_SAM9263EK |
114 | help | 114 | help |
115 | This provides a backlight control internal to the Atmel LCDC | 115 | This provides a backlight control internal to the Atmel LCDC |
116 | driver. If the LCD "contrast control" on your board is wired | 116 | driver. If the LCD "contrast control" on your board is wired |
diff --git a/drivers/video/imxfb.c b/drivers/video/imxfb.c index 15a0ee6d8e23..30ae3022f633 100644 --- a/drivers/video/imxfb.c +++ b/drivers/video/imxfb.c | |||
@@ -33,6 +33,7 @@ | |||
33 | #include <linux/math64.h> | 33 | #include <linux/math64.h> |
34 | 34 | ||
35 | #include <mach/imxfb.h> | 35 | #include <mach/imxfb.h> |
36 | #include <mach/hardware.h> | ||
36 | 37 | ||
37 | /* | 38 | /* |
38 | * Complain if VAR is out of range. | 39 | * Complain if VAR is out of range. |
@@ -129,6 +130,10 @@ | |||
129 | #define LCDISR_EOF (1<<1) | 130 | #define LCDISR_EOF (1<<1) |
130 | #define LCDISR_BOF (1<<0) | 131 | #define LCDISR_BOF (1<<0) |
131 | 132 | ||
133 | /* Used fb-mode. Can be set on kernel command line, therefore file-static. */ | ||
134 | static const char *fb_mode; | ||
135 | |||
136 | |||
132 | /* | 137 | /* |
133 | * These are the bitfields for each | 138 | * These are the bitfields for each |
134 | * display depth that we support. | 139 | * display depth that we support. |
@@ -145,10 +150,6 @@ struct imxfb_info { | |||
145 | void __iomem *regs; | 150 | void __iomem *regs; |
146 | struct clk *clk; | 151 | struct clk *clk; |
147 | 152 | ||
148 | u_int max_bpp; | ||
149 | u_int max_xres; | ||
150 | u_int max_yres; | ||
151 | |||
152 | /* | 153 | /* |
153 | * These are the addresses we mapped | 154 | * These are the addresses we mapped |
154 | * the framebuffer memory region to. | 155 | * the framebuffer memory region to. |
@@ -172,6 +173,9 @@ struct imxfb_info { | |||
172 | cmap_static:1, | 173 | cmap_static:1, |
173 | unused:30; | 174 | unused:30; |
174 | 175 | ||
176 | struct imx_fb_videomode *mode; | ||
177 | int num_modes; | ||
178 | |||
175 | void (*lcd_power)(int); | 179 | void (*lcd_power)(int); |
176 | void (*backlight_power)(int); | 180 | void (*backlight_power)(int); |
177 | }; | 181 | }; |
@@ -298,6 +302,18 @@ static int imxfb_setcolreg(u_int regno, u_int red, u_int green, u_int blue, | |||
298 | return ret; | 302 | return ret; |
299 | } | 303 | } |
300 | 304 | ||
305 | static const struct imx_fb_videomode *imxfb_find_mode(struct imxfb_info *fbi) | ||
306 | { | ||
307 | struct imx_fb_videomode *m; | ||
308 | int i; | ||
309 | |||
310 | for (i = 0, m = &fbi->mode[0]; i < fbi->num_modes; i++, m++) { | ||
311 | if (!strcmp(m->mode.name, fb_mode)) | ||
312 | return m; | ||
313 | } | ||
314 | return NULL; | ||
315 | } | ||
316 | |||
301 | /* | 317 | /* |
302 | * imxfb_check_var(): | 318 | * imxfb_check_var(): |
303 | * Round up in the following order: bits_per_pixel, xres, | 319 | * Round up in the following order: bits_per_pixel, xres, |
@@ -308,35 +324,81 @@ static int imxfb_check_var(struct fb_var_screeninfo *var, struct fb_info *info) | |||
308 | { | 324 | { |
309 | struct imxfb_info *fbi = info->par; | 325 | struct imxfb_info *fbi = info->par; |
310 | struct imxfb_rgb *rgb; | 326 | struct imxfb_rgb *rgb; |
327 | const struct imx_fb_videomode *imxfb_mode; | ||
328 | unsigned long lcd_clk; | ||
329 | unsigned long long tmp; | ||
330 | u32 pcr = 0; | ||
311 | 331 | ||
312 | if (var->xres < MIN_XRES) | 332 | if (var->xres < MIN_XRES) |
313 | var->xres = MIN_XRES; | 333 | var->xres = MIN_XRES; |
314 | if (var->yres < MIN_YRES) | 334 | if (var->yres < MIN_YRES) |
315 | var->yres = MIN_YRES; | 335 | var->yres = MIN_YRES; |
316 | if (var->xres > fbi->max_xres) | 336 | |
317 | var->xres = fbi->max_xres; | 337 | imxfb_mode = imxfb_find_mode(fbi); |
318 | if (var->yres > fbi->max_yres) | 338 | if (!imxfb_mode) |
319 | var->yres = fbi->max_yres; | 339 | return -EINVAL; |
320 | var->xres_virtual = max(var->xres_virtual, var->xres); | 340 | |
321 | var->yres_virtual = max(var->yres_virtual, var->yres); | 341 | var->xres = imxfb_mode->mode.xres; |
342 | var->yres = imxfb_mode->mode.yres; | ||
343 | var->bits_per_pixel = imxfb_mode->bpp; | ||
344 | var->pixclock = imxfb_mode->mode.pixclock; | ||
345 | var->hsync_len = imxfb_mode->mode.hsync_len; | ||
346 | var->left_margin = imxfb_mode->mode.left_margin; | ||
347 | var->right_margin = imxfb_mode->mode.right_margin; | ||
348 | var->vsync_len = imxfb_mode->mode.vsync_len; | ||
349 | var->upper_margin = imxfb_mode->mode.upper_margin; | ||
350 | var->lower_margin = imxfb_mode->mode.lower_margin; | ||
351 | var->sync = imxfb_mode->mode.sync; | ||
352 | var->xres_virtual = max(var->xres_virtual, var->xres); | ||
353 | var->yres_virtual = max(var->yres_virtual, var->yres); | ||
322 | 354 | ||
323 | pr_debug("var->bits_per_pixel=%d\n", var->bits_per_pixel); | 355 | pr_debug("var->bits_per_pixel=%d\n", var->bits_per_pixel); |
356 | |||
357 | lcd_clk = clk_get_rate(fbi->clk); | ||
358 | |||
359 | tmp = var->pixclock * (unsigned long long)lcd_clk; | ||
360 | |||
361 | do_div(tmp, 1000000); | ||
362 | |||
363 | if (do_div(tmp, 1000000) > 500000) | ||
364 | tmp++; | ||
365 | |||
366 | pcr = (unsigned int)tmp; | ||
367 | |||
368 | if (--pcr > 0x3F) { | ||
369 | pcr = 0x3F; | ||
370 | printk(KERN_WARNING "Must limit pixel clock to %luHz\n", | ||
371 | lcd_clk / pcr); | ||
372 | } | ||
373 | |||
324 | switch (var->bits_per_pixel) { | 374 | switch (var->bits_per_pixel) { |
325 | case 32: | 375 | case 32: |
376 | pcr |= PCR_BPIX_18; | ||
326 | rgb = &def_rgb_18; | 377 | rgb = &def_rgb_18; |
327 | break; | 378 | break; |
328 | case 16: | 379 | case 16: |
329 | default: | 380 | default: |
330 | if (fbi->pcr & PCR_TFT) | 381 | if (cpu_is_mx1()) |
382 | pcr |= PCR_BPIX_12; | ||
383 | else | ||
384 | pcr |= PCR_BPIX_16; | ||
385 | |||
386 | if (imxfb_mode->pcr & PCR_TFT) | ||
331 | rgb = &def_rgb_16_tft; | 387 | rgb = &def_rgb_16_tft; |
332 | else | 388 | else |
333 | rgb = &def_rgb_16_stn; | 389 | rgb = &def_rgb_16_stn; |
334 | break; | 390 | break; |
335 | case 8: | 391 | case 8: |
392 | pcr |= PCR_BPIX_8; | ||
336 | rgb = &def_rgb_8; | 393 | rgb = &def_rgb_8; |
337 | break; | 394 | break; |
338 | } | 395 | } |
339 | 396 | ||
397 | /* add sync polarities */ | ||
398 | pcr |= imxfb_mode->pcr & ~(0x3f | (7 << 25)); | ||
399 | |||
400 | fbi->pcr = pcr; | ||
401 | |||
340 | /* | 402 | /* |
341 | * Copy the RGB parameters for this display | 403 | * Copy the RGB parameters for this display |
342 | * from the machine specific parameters. | 404 | * from the machine specific parameters. |
@@ -393,10 +455,6 @@ static void imxfb_enable_controller(struct imxfb_info *fbi) | |||
393 | 455 | ||
394 | writel(fbi->screen_dma, fbi->regs + LCDC_SSA); | 456 | writel(fbi->screen_dma, fbi->regs + LCDC_SSA); |
395 | 457 | ||
396 | /* physical screen start address */ | ||
397 | writel(VPW_VPW(fbi->max_xres * fbi->max_bpp / 8 / 4), | ||
398 | fbi->regs + LCDC_VPW); | ||
399 | |||
400 | /* panning offset 0 (0 pixel offset) */ | 458 | /* panning offset 0 (0 pixel offset) */ |
401 | writel(0x00000000, fbi->regs + LCDC_POS); | 459 | writel(0x00000000, fbi->regs + LCDC_POS); |
402 | 460 | ||
@@ -468,8 +526,6 @@ static struct fb_ops imxfb_ops = { | |||
468 | static int imxfb_activate_var(struct fb_var_screeninfo *var, struct fb_info *info) | 526 | static int imxfb_activate_var(struct fb_var_screeninfo *var, struct fb_info *info) |
469 | { | 527 | { |
470 | struct imxfb_info *fbi = info->par; | 528 | struct imxfb_info *fbi = info->par; |
471 | unsigned int pcr, lcd_clk; | ||
472 | unsigned long long tmp; | ||
473 | 529 | ||
474 | pr_debug("var: xres=%d hslen=%d lm=%d rm=%d\n", | 530 | pr_debug("var: xres=%d hslen=%d lm=%d rm=%d\n", |
475 | var->xres, var->hsync_len, | 531 | var->xres, var->hsync_len, |
@@ -505,6 +561,10 @@ static int imxfb_activate_var(struct fb_var_screeninfo *var, struct fb_info *inf | |||
505 | info->fix.id, var->lower_margin); | 561 | info->fix.id, var->lower_margin); |
506 | #endif | 562 | #endif |
507 | 563 | ||
564 | /* physical screen start address */ | ||
565 | writel(VPW_VPW(var->xres * var->bits_per_pixel / 8 / 4), | ||
566 | fbi->regs + LCDC_VPW); | ||
567 | |||
508 | writel(HCR_H_WIDTH(var->hsync_len - 1) | | 568 | writel(HCR_H_WIDTH(var->hsync_len - 1) | |
509 | HCR_H_WAIT_1(var->right_margin - 1) | | 569 | HCR_H_WAIT_1(var->right_margin - 1) | |
510 | HCR_H_WAIT_2(var->left_margin - 3), | 570 | HCR_H_WAIT_2(var->left_margin - 3), |
@@ -518,22 +578,7 @@ static int imxfb_activate_var(struct fb_var_screeninfo *var, struct fb_info *inf | |||
518 | writel(SIZE_XMAX(var->xres) | SIZE_YMAX(var->yres), | 578 | writel(SIZE_XMAX(var->xres) | SIZE_YMAX(var->yres), |
519 | fbi->regs + LCDC_SIZE); | 579 | fbi->regs + LCDC_SIZE); |
520 | 580 | ||
521 | lcd_clk = clk_get_rate(fbi->clk); | 581 | writel(fbi->pcr, fbi->regs + LCDC_PCR); |
522 | tmp = var->pixclock * (unsigned long long)lcd_clk; | ||
523 | do_div(tmp, 1000000); | ||
524 | if (do_div(tmp, 1000000) > 500000) | ||
525 | tmp++; | ||
526 | pcr = (unsigned int)tmp; | ||
527 | if (--pcr > 0x3F) { | ||
528 | pcr = 0x3F; | ||
529 | printk(KERN_WARNING "Must limit pixel clock to %uHz\n", | ||
530 | lcd_clk / pcr); | ||
531 | } | ||
532 | |||
533 | /* add sync polarities */ | ||
534 | pcr |= fbi->pcr & ~0x3F; | ||
535 | |||
536 | writel(pcr, fbi->regs + LCDC_PCR); | ||
537 | writel(fbi->pwmr, fbi->regs + LCDC_PWMR); | 582 | writel(fbi->pwmr, fbi->regs + LCDC_PWMR); |
538 | writel(fbi->lscr1, fbi->regs + LCDC_LSCR1); | 583 | writel(fbi->lscr1, fbi->regs + LCDC_LSCR1); |
539 | writel(fbi->dmacr, fbi->regs + LCDC_DMACR); | 584 | writel(fbi->dmacr, fbi->regs + LCDC_DMACR); |
@@ -575,6 +620,8 @@ static int __init imxfb_init_fbinfo(struct platform_device *pdev) | |||
575 | struct imx_fb_platform_data *pdata = pdev->dev.platform_data; | 620 | struct imx_fb_platform_data *pdata = pdev->dev.platform_data; |
576 | struct fb_info *info = dev_get_drvdata(&pdev->dev); | 621 | struct fb_info *info = dev_get_drvdata(&pdev->dev); |
577 | struct imxfb_info *fbi = info->par; | 622 | struct imxfb_info *fbi = info->par; |
623 | struct imx_fb_videomode *m; | ||
624 | int i; | ||
578 | 625 | ||
579 | pr_debug("%s\n",__func__); | 626 | pr_debug("%s\n",__func__); |
580 | 627 | ||
@@ -603,35 +650,18 @@ static int __init imxfb_init_fbinfo(struct platform_device *pdev) | |||
603 | info->fbops = &imxfb_ops; | 650 | info->fbops = &imxfb_ops; |
604 | info->flags = FBINFO_FLAG_DEFAULT | | 651 | info->flags = FBINFO_FLAG_DEFAULT | |
605 | FBINFO_READS_FAST; | 652 | FBINFO_READS_FAST; |
606 | |||
607 | fbi->max_xres = pdata->xres; | ||
608 | info->var.xres = pdata->xres; | ||
609 | info->var.xres_virtual = pdata->xres; | ||
610 | fbi->max_yres = pdata->yres; | ||
611 | info->var.yres = pdata->yres; | ||
612 | info->var.yres_virtual = pdata->yres; | ||
613 | fbi->max_bpp = pdata->bpp; | ||
614 | info->var.bits_per_pixel = pdata->bpp; | ||
615 | info->var.nonstd = pdata->nonstd; | ||
616 | info->var.pixclock = pdata->pixclock; | ||
617 | info->var.hsync_len = pdata->hsync_len; | ||
618 | info->var.left_margin = pdata->left_margin; | ||
619 | info->var.right_margin = pdata->right_margin; | ||
620 | info->var.vsync_len = pdata->vsync_len; | ||
621 | info->var.upper_margin = pdata->upper_margin; | ||
622 | info->var.lower_margin = pdata->lower_margin; | ||
623 | info->var.sync = pdata->sync; | ||
624 | info->var.grayscale = pdata->cmap_greyscale; | 653 | info->var.grayscale = pdata->cmap_greyscale; |
625 | fbi->cmap_inverse = pdata->cmap_inverse; | 654 | fbi->cmap_inverse = pdata->cmap_inverse; |
626 | fbi->cmap_static = pdata->cmap_static; | 655 | fbi->cmap_static = pdata->cmap_static; |
627 | fbi->pcr = pdata->pcr; | ||
628 | fbi->lscr1 = pdata->lscr1; | 656 | fbi->lscr1 = pdata->lscr1; |
629 | fbi->dmacr = pdata->dmacr; | 657 | fbi->dmacr = pdata->dmacr; |
630 | fbi->pwmr = pdata->pwmr; | 658 | fbi->pwmr = pdata->pwmr; |
631 | fbi->lcd_power = pdata->lcd_power; | 659 | fbi->lcd_power = pdata->lcd_power; |
632 | fbi->backlight_power = pdata->backlight_power; | 660 | fbi->backlight_power = pdata->backlight_power; |
633 | info->fix.smem_len = fbi->max_xres * fbi->max_yres * | 661 | |
634 | fbi->max_bpp / 8; | 662 | for (i = 0, m = &pdata->mode[0]; i < pdata->num_modes; i++, m++) |
663 | info->fix.smem_len = max_t(size_t, info->fix.smem_len, | ||
664 | m->mode.xres * m->mode.yres * m->bpp / 8); | ||
635 | 665 | ||
636 | return 0; | 666 | return 0; |
637 | } | 667 | } |
@@ -642,9 +672,9 @@ static int __init imxfb_probe(struct platform_device *pdev) | |||
642 | struct fb_info *info; | 672 | struct fb_info *info; |
643 | struct imx_fb_platform_data *pdata; | 673 | struct imx_fb_platform_data *pdata; |
644 | struct resource *res; | 674 | struct resource *res; |
645 | int ret; | 675 | int ret, i; |
646 | 676 | ||
647 | printk("i.MX Framebuffer driver\n"); | 677 | dev_info(&pdev->dev, "i.MX Framebuffer driver\n"); |
648 | 678 | ||
649 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 679 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
650 | if (!res) | 680 | if (!res) |
@@ -662,6 +692,9 @@ static int __init imxfb_probe(struct platform_device *pdev) | |||
662 | 692 | ||
663 | fbi = info->par; | 693 | fbi = info->par; |
664 | 694 | ||
695 | if (!fb_mode) | ||
696 | fb_mode = pdata->mode[0].mode.name; | ||
697 | |||
665 | platform_set_drvdata(pdev, info); | 698 | platform_set_drvdata(pdev, info); |
666 | 699 | ||
667 | ret = imxfb_init_fbinfo(pdev); | 700 | ret = imxfb_init_fbinfo(pdev); |
@@ -684,7 +717,7 @@ static int __init imxfb_probe(struct platform_device *pdev) | |||
684 | 717 | ||
685 | fbi->regs = ioremap(res->start, resource_size(res)); | 718 | fbi->regs = ioremap(res->start, resource_size(res)); |
686 | if (fbi->regs == NULL) { | 719 | if (fbi->regs == NULL) { |
687 | printk(KERN_ERR"Cannot map frame buffer registers\n"); | 720 | dev_err(&pdev->dev, "Cannot map frame buffer registers\n"); |
688 | goto failed_ioremap; | 721 | goto failed_ioremap; |
689 | } | 722 | } |
690 | 723 | ||
@@ -719,6 +752,13 @@ static int __init imxfb_probe(struct platform_device *pdev) | |||
719 | goto failed_platform_init; | 752 | goto failed_platform_init; |
720 | } | 753 | } |
721 | 754 | ||
755 | fbi->mode = pdata->mode; | ||
756 | fbi->num_modes = pdata->num_modes; | ||
757 | |||
758 | INIT_LIST_HEAD(&info->modelist); | ||
759 | for (i = 0; i < pdata->num_modes; i++) | ||
760 | fb_add_videomode(&pdata->mode[i].mode, &info->modelist); | ||
761 | |||
722 | /* | 762 | /* |
723 | * This makes sure that our colour bitfield | 763 | * This makes sure that our colour bitfield |
724 | * descriptors are correctly initialised. | 764 | * descriptors are correctly initialised. |
@@ -754,7 +794,7 @@ failed_map: | |||
754 | failed_getclock: | 794 | failed_getclock: |
755 | iounmap(fbi->regs); | 795 | iounmap(fbi->regs); |
756 | failed_ioremap: | 796 | failed_ioremap: |
757 | release_mem_region(res->start, res->end - res->start); | 797 | release_mem_region(res->start, resource_size(res)); |
758 | failed_req: | 798 | failed_req: |
759 | kfree(info->pseudo_palette); | 799 | kfree(info->pseudo_palette); |
760 | failed_init: | 800 | failed_init: |
@@ -785,7 +825,7 @@ static int __devexit imxfb_remove(struct platform_device *pdev) | |||
785 | framebuffer_release(info); | 825 | framebuffer_release(info); |
786 | 826 | ||
787 | iounmap(fbi->regs); | 827 | iounmap(fbi->regs); |
788 | release_mem_region(res->start, res->end - res->start + 1); | 828 | release_mem_region(res->start, resource_size(res)); |
789 | clk_disable(fbi->clk); | 829 | clk_disable(fbi->clk); |
790 | clk_put(fbi->clk); | 830 | clk_put(fbi->clk); |
791 | 831 | ||
@@ -811,8 +851,34 @@ static struct platform_driver imxfb_driver = { | |||
811 | }, | 851 | }, |
812 | }; | 852 | }; |
813 | 853 | ||
854 | static int imxfb_setup(void) | ||
855 | { | ||
856 | #ifndef MODULE | ||
857 | char *opt, *options = NULL; | ||
858 | |||
859 | if (fb_get_options("imxfb", &options)) | ||
860 | return -ENODEV; | ||
861 | |||
862 | if (!options || !*options) | ||
863 | return 0; | ||
864 | |||
865 | while ((opt = strsep(&options, ",")) != NULL) { | ||
866 | if (!*opt) | ||
867 | continue; | ||
868 | else | ||
869 | fb_mode = opt; | ||
870 | } | ||
871 | #endif | ||
872 | return 0; | ||
873 | } | ||
874 | |||
814 | int __init imxfb_init(void) | 875 | int __init imxfb_init(void) |
815 | { | 876 | { |
877 | int ret = imxfb_setup(); | ||
878 | |||
879 | if (ret < 0) | ||
880 | return ret; | ||
881 | |||
816 | return platform_driver_probe(&imxfb_driver, imxfb_probe); | 882 | return platform_driver_probe(&imxfb_driver, imxfb_probe); |
817 | } | 883 | } |
818 | 884 | ||
diff --git a/drivers/video/ps3fb.c b/drivers/video/ps3fb.c index c0af638fe702..9c0144ee7ae5 100644 --- a/drivers/video/ps3fb.c +++ b/drivers/video/ps3fb.c | |||
@@ -32,7 +32,7 @@ | |||
32 | #include <linux/init.h> | 32 | #include <linux/init.h> |
33 | 33 | ||
34 | #include <asm/abs_addr.h> | 34 | #include <asm/abs_addr.h> |
35 | #include <asm/iommu.h> | 35 | #include <asm/cell-regs.h> |
36 | #include <asm/lv1call.h> | 36 | #include <asm/lv1call.h> |
37 | #include <asm/ps3av.h> | 37 | #include <asm/ps3av.h> |
38 | #include <asm/ps3fb.h> | 38 | #include <asm/ps3fb.h> |
diff --git a/drivers/video/sa1100fb.c b/drivers/video/sa1100fb.c index 10ddad8e17d6..cdaa873a6054 100644 --- a/drivers/video/sa1100fb.c +++ b/drivers/video/sa1100fb.c | |||
@@ -66,7 +66,7 @@ | |||
66 | * - FrameBuffer memory is now allocated at run-time when the | 66 | * - FrameBuffer memory is now allocated at run-time when the |
67 | * driver is initialized. | 67 | * driver is initialized. |
68 | * | 68 | * |
69 | * 2000/04/10: Nicolas Pitre <nico@cam.org> | 69 | * 2000/04/10: Nicolas Pitre <nico@fluxnic.net> |
70 | * - Big cleanup for dynamic selection of machine type at run time. | 70 | * - Big cleanup for dynamic selection of machine type at run time. |
71 | * | 71 | * |
72 | * 2000/07/19: Jamey Hicks <jamey@crl.dec.com> | 72 | * 2000/07/19: Jamey Hicks <jamey@crl.dec.com> |
diff --git a/drivers/video/uvesafb.c b/drivers/video/uvesafb.c index ca5b4643a401..e98baf6916b8 100644 --- a/drivers/video/uvesafb.c +++ b/drivers/video/uvesafb.c | |||
@@ -67,9 +67,8 @@ static DEFINE_MUTEX(uvfb_lock); | |||
67 | * find the kernel part of the task struct, copy the registers and | 67 | * find the kernel part of the task struct, copy the registers and |
68 | * the buffer contents and then complete the task. | 68 | * the buffer contents and then complete the task. |
69 | */ | 69 | */ |
70 | static void uvesafb_cn_callback(void *data) | 70 | static void uvesafb_cn_callback(struct cn_msg *msg) |
71 | { | 71 | { |
72 | struct cn_msg *msg = data; | ||
73 | struct uvesafb_task *utask; | 72 | struct uvesafb_task *utask; |
74 | struct uvesafb_ktask *task; | 73 | struct uvesafb_ktask *task; |
75 | 74 | ||