diff options
Diffstat (limited to 'drivers/video')
| -rw-r--r-- | drivers/video/Kconfig | 2 | ||||
| -rw-r--r-- | drivers/video/aty/aty128fb.c | 8 | ||||
| -rw-r--r-- | drivers/video/aty/atyfb_base.c | 22 | ||||
| -rw-r--r-- | drivers/video/aty/mach64_ct.c | 11 | ||||
| -rw-r--r-- | drivers/video/aty/radeon_base.c | 10 | ||||
| -rw-r--r-- | drivers/video/aty/radeon_pm.c | 18 | ||||
| -rw-r--r-- | drivers/video/backlight/Makefile | 2 | ||||
| -rw-r--r-- | drivers/video/backlight/da903x_bl.c (renamed from drivers/video/backlight/da903x.c) | 0 | ||||
| -rw-r--r-- | drivers/video/fbcmap.c | 20 | ||||
| -rw-r--r-- | drivers/video/fbmem.c | 135 |
10 files changed, 125 insertions, 103 deletions
diff --git a/drivers/video/Kconfig b/drivers/video/Kconfig index c94f71980c1b..f0267706cb45 100644 --- a/drivers/video/Kconfig +++ b/drivers/video/Kconfig | |||
| @@ -41,7 +41,7 @@ menuconfig FB | |||
| 41 | You need an utility program called fbset to make full use of frame | 41 | You need an utility program called fbset to make full use of frame |
| 42 | buffer devices. Please read <file:Documentation/fb/framebuffer.txt> | 42 | buffer devices. Please read <file:Documentation/fb/framebuffer.txt> |
| 43 | and the Framebuffer-HOWTO at | 43 | and the Framebuffer-HOWTO at |
| 44 | <http://www.tahallah.demon.co.uk/programming/prog.html> for more | 44 | <http://www.munted.org.uk/programming/Framebuffer-HOWTO-1.2.html> for more |
| 45 | information. | 45 | information. |
| 46 | 46 | ||
| 47 | Say Y here and to the driver for your graphics board below if you | 47 | Say Y here and to the driver for your graphics board below if you |
diff --git a/drivers/video/aty/aty128fb.c b/drivers/video/aty/aty128fb.c index db16112cf197..fb2b0f5b23bd 100644 --- a/drivers/video/aty/aty128fb.c +++ b/drivers/video/aty/aty128fb.c | |||
| @@ -1475,7 +1475,7 @@ static int aty128fb_set_par(struct fb_info *info) | |||
| 1475 | aty128_set_pll(&par->pll, par); | 1475 | aty128_set_pll(&par->pll, par); |
| 1476 | aty128_set_fifo(&par->fifo_reg, par); | 1476 | aty128_set_fifo(&par->fifo_reg, par); |
| 1477 | 1477 | ||
| 1478 | config = aty_ld_le32(CONFIG_CNTL) & ~3; | 1478 | config = aty_ld_le32(CNFG_CNTL) & ~3; |
| 1479 | 1479 | ||
| 1480 | #if defined(__BIG_ENDIAN) | 1480 | #if defined(__BIG_ENDIAN) |
| 1481 | if (par->crtc.bpp == 32) | 1481 | if (par->crtc.bpp == 32) |
| @@ -1484,7 +1484,7 @@ static int aty128fb_set_par(struct fb_info *info) | |||
| 1484 | config |= 1; /* make aperture do 16 bit swapping */ | 1484 | config |= 1; /* make aperture do 16 bit swapping */ |
| 1485 | #endif | 1485 | #endif |
| 1486 | 1486 | ||
| 1487 | aty_st_le32(CONFIG_CNTL, config); | 1487 | aty_st_le32(CNFG_CNTL, config); |
| 1488 | aty_st_8(CRTC_EXT_CNTL + 1, 0); /* turn the video back on */ | 1488 | aty_st_8(CRTC_EXT_CNTL + 1, 0); /* turn the video back on */ |
| 1489 | 1489 | ||
| 1490 | info->fix.line_length = (par->crtc.vxres * par->crtc.bpp) >> 3; | 1490 | info->fix.line_length = (par->crtc.vxres * par->crtc.bpp) >> 3; |
| @@ -1875,7 +1875,7 @@ static int __devinit aty128_init(struct pci_dev *pdev, const struct pci_device_i | |||
| 1875 | u32 dac; | 1875 | u32 dac; |
| 1876 | 1876 | ||
| 1877 | /* Get the chip revision */ | 1877 | /* Get the chip revision */ |
| 1878 | chip_rev = (aty_ld_le32(CONFIG_CNTL) >> 16) & 0x1F; | 1878 | chip_rev = (aty_ld_le32(CNFG_CNTL) >> 16) & 0x1F; |
| 1879 | 1879 | ||
| 1880 | strcpy(video_card, "Rage128 XX "); | 1880 | strcpy(video_card, "Rage128 XX "); |
| 1881 | video_card[8] = ent->device >> 8; | 1881 | video_card[8] = ent->device >> 8; |
| @@ -2057,7 +2057,7 @@ static int __devinit aty128_probe(struct pci_dev *pdev, const struct pci_device_ | |||
| 2057 | 2057 | ||
| 2058 | /* Grab memory size from the card */ | 2058 | /* Grab memory size from the card */ |
| 2059 | // How does this relate to the resource length from the PCI hardware? | 2059 | // How does this relate to the resource length from the PCI hardware? |
| 2060 | par->vram_size = aty_ld_le32(CONFIG_MEMSIZE) & 0x03FFFFFF; | 2060 | par->vram_size = aty_ld_le32(CNFG_MEMSIZE) & 0x03FFFFFF; |
| 2061 | 2061 | ||
| 2062 | /* Virtualize the framebuffer */ | 2062 | /* Virtualize the framebuffer */ |
| 2063 | info->screen_base = ioremap(fb_addr, par->vram_size); | 2063 | info->screen_base = ioremap(fb_addr, par->vram_size); |
diff --git a/drivers/video/aty/atyfb_base.c b/drivers/video/aty/atyfb_base.c index cc6b470073da..1d6e16d346a5 100644 --- a/drivers/video/aty/atyfb_base.c +++ b/drivers/video/aty/atyfb_base.c | |||
| @@ -135,7 +135,7 @@ | |||
| 135 | #if defined(CONFIG_PM) || defined(CONFIG_PMAC_BACKLIGHT) || \ | 135 | #if defined(CONFIG_PM) || defined(CONFIG_PMAC_BACKLIGHT) || \ |
| 136 | defined (CONFIG_FB_ATY_GENERIC_LCD) || defined(CONFIG_FB_ATY_BACKLIGHT) | 136 | defined (CONFIG_FB_ATY_GENERIC_LCD) || defined(CONFIG_FB_ATY_BACKLIGHT) |
| 137 | static const u32 lt_lcd_regs[] = { | 137 | static const u32 lt_lcd_regs[] = { |
| 138 | CONFIG_PANEL_LG, | 138 | CNFG_PANEL_LG, |
| 139 | LCD_GEN_CNTL_LG, | 139 | LCD_GEN_CNTL_LG, |
| 140 | DSTN_CONTROL_LG, | 140 | DSTN_CONTROL_LG, |
| 141 | HFB_PITCH_ADDR_LG, | 141 | HFB_PITCH_ADDR_LG, |
| @@ -446,7 +446,7 @@ static int __devinit correct_chipset(struct atyfb_par *par) | |||
| 446 | par->pll_limits.ecp_max = aty_chips[i].ecp_max; | 446 | par->pll_limits.ecp_max = aty_chips[i].ecp_max; |
| 447 | par->features = aty_chips[i].features; | 447 | par->features = aty_chips[i].features; |
| 448 | 448 | ||
| 449 | chip_id = aty_ld_le32(CONFIG_CHIP_ID, par); | 449 | chip_id = aty_ld_le32(CNFG_CHIP_ID, par); |
| 450 | type = chip_id & CFG_CHIP_TYPE; | 450 | type = chip_id & CFG_CHIP_TYPE; |
| 451 | rev = (chip_id & CFG_CHIP_REV) >> 24; | 451 | rev = (chip_id & CFG_CHIP_REV) >> 24; |
| 452 | 452 | ||
| @@ -629,7 +629,7 @@ static void aty_get_crtc(const struct atyfb_par *par, struct crtc *crtc) | |||
| 629 | crtc->lcd_index = aty_ld_le32(LCD_INDEX, par); | 629 | crtc->lcd_index = aty_ld_le32(LCD_INDEX, par); |
| 630 | aty_st_le32(LCD_INDEX, crtc->lcd_index, par); | 630 | aty_st_le32(LCD_INDEX, crtc->lcd_index, par); |
| 631 | } | 631 | } |
| 632 | crtc->lcd_config_panel = aty_ld_lcd(CONFIG_PANEL, par); | 632 | crtc->lcd_config_panel = aty_ld_lcd(CNFG_PANEL, par); |
| 633 | crtc->lcd_gen_cntl = aty_ld_lcd(LCD_GEN_CNTL, par); | 633 | crtc->lcd_gen_cntl = aty_ld_lcd(LCD_GEN_CNTL, par); |
| 634 | 634 | ||
| 635 | 635 | ||
| @@ -676,7 +676,7 @@ static void aty_set_crtc(const struct atyfb_par *par, const struct crtc *crtc) | |||
| 676 | aty_st_le32(CRTC_GEN_CNTL, crtc->gen_cntl & ~(CRTC_EXT_DISP_EN | CRTC_EN), par); | 676 | aty_st_le32(CRTC_GEN_CNTL, crtc->gen_cntl & ~(CRTC_EXT_DISP_EN | CRTC_EN), par); |
| 677 | 677 | ||
| 678 | /* update non-shadow registers first */ | 678 | /* update non-shadow registers first */ |
| 679 | aty_st_lcd(CONFIG_PANEL, crtc->lcd_config_panel, par); | 679 | aty_st_lcd(CNFG_PANEL, crtc->lcd_config_panel, par); |
| 680 | aty_st_lcd(LCD_GEN_CNTL, crtc->lcd_gen_cntl & | 680 | aty_st_lcd(LCD_GEN_CNTL, crtc->lcd_gen_cntl & |
| 681 | ~(CRTC_RW_SELECT | SHADOW_EN | SHADOW_RW_EN), par); | 681 | ~(CRTC_RW_SELECT | SHADOW_EN | SHADOW_RW_EN), par); |
| 682 | 682 | ||
| @@ -858,7 +858,7 @@ static int aty_var_to_crtc(const struct fb_info *info, | |||
| 858 | if (!M64_HAS(MOBIL_BUS)) | 858 | if (!M64_HAS(MOBIL_BUS)) |
| 859 | crtc->lcd_index |= CRTC2_DISPLAY_DIS; | 859 | crtc->lcd_index |= CRTC2_DISPLAY_DIS; |
| 860 | 860 | ||
| 861 | crtc->lcd_config_panel = aty_ld_lcd(CONFIG_PANEL, par) | 0x4000; | 861 | crtc->lcd_config_panel = aty_ld_lcd(CNFG_PANEL, par) | 0x4000; |
| 862 | crtc->lcd_gen_cntl = aty_ld_lcd(LCD_GEN_CNTL, par) & ~CRTC_RW_SELECT; | 862 | crtc->lcd_gen_cntl = aty_ld_lcd(LCD_GEN_CNTL, par) & ~CRTC_RW_SELECT; |
| 863 | 863 | ||
| 864 | crtc->lcd_gen_cntl &= | 864 | crtc->lcd_gen_cntl &= |
| @@ -2254,7 +2254,7 @@ static int __devinit aty_init(struct fb_info *info) | |||
| 2254 | if (!M64_HAS(INTEGRATED)) { | 2254 | if (!M64_HAS(INTEGRATED)) { |
| 2255 | u32 stat0; | 2255 | u32 stat0; |
| 2256 | u8 dac_type, dac_subtype, clk_type; | 2256 | u8 dac_type, dac_subtype, clk_type; |
| 2257 | stat0 = aty_ld_le32(CONFIG_STAT0, par); | 2257 | stat0 = aty_ld_le32(CNFG_STAT0, par); |
| 2258 | par->bus_type = (stat0 >> 0) & 0x07; | 2258 | par->bus_type = (stat0 >> 0) & 0x07; |
| 2259 | par->ram_type = (stat0 >> 3) & 0x07; | 2259 | par->ram_type = (stat0 >> 3) & 0x07; |
| 2260 | ramname = aty_gx_ram[par->ram_type]; | 2260 | ramname = aty_gx_ram[par->ram_type]; |
| @@ -2324,7 +2324,7 @@ static int __devinit aty_init(struct fb_info *info) | |||
| 2324 | par->dac_ops = &aty_dac_ct; | 2324 | par->dac_ops = &aty_dac_ct; |
| 2325 | par->pll_ops = &aty_pll_ct; | 2325 | par->pll_ops = &aty_pll_ct; |
| 2326 | par->bus_type = PCI; | 2326 | par->bus_type = PCI; |
| 2327 | par->ram_type = (aty_ld_le32(CONFIG_STAT0, par) & 0x07); | 2327 | par->ram_type = (aty_ld_le32(CNFG_STAT0, par) & 0x07); |
| 2328 | ramname = aty_ct_ram[par->ram_type]; | 2328 | ramname = aty_ct_ram[par->ram_type]; |
| 2329 | /* for many chips, the mclk is 67 MHz for SDRAM, 63 MHz otherwise */ | 2329 | /* for many chips, the mclk is 67 MHz for SDRAM, 63 MHz otherwise */ |
| 2330 | if (par->pll_limits.mclk == 67 && par->ram_type < SDRAM) | 2330 | if (par->pll_limits.mclk == 67 && par->ram_type < SDRAM) |
| @@ -2433,7 +2433,7 @@ static int __devinit aty_init(struct fb_info *info) | |||
| 2433 | } | 2433 | } |
| 2434 | 2434 | ||
| 2435 | if (M64_HAS(MAGIC_VRAM_SIZE)) { | 2435 | if (M64_HAS(MAGIC_VRAM_SIZE)) { |
| 2436 | if (aty_ld_le32(CONFIG_STAT1, par) & 0x40000000) | 2436 | if (aty_ld_le32(CNFG_STAT1, par) & 0x40000000) |
| 2437 | info->fix.smem_len += 0x400000; | 2437 | info->fix.smem_len += 0x400000; |
| 2438 | } | 2438 | } |
| 2439 | 2439 | ||
| @@ -2946,7 +2946,7 @@ static int __devinit atyfb_setup_sparc(struct pci_dev *pdev, | |||
| 2946 | * Fix PROMs idea of MEM_CNTL settings... | 2946 | * Fix PROMs idea of MEM_CNTL settings... |
| 2947 | */ | 2947 | */ |
| 2948 | mem = aty_ld_le32(MEM_CNTL, par); | 2948 | mem = aty_ld_le32(MEM_CNTL, par); |
| 2949 | chip_id = aty_ld_le32(CONFIG_CHIP_ID, par); | 2949 | chip_id = aty_ld_le32(CNFG_CHIP_ID, par); |
| 2950 | if (((chip_id & CFG_CHIP_TYPE) == VT_CHIP_ID) && !((chip_id >> 24) & 1)) { | 2950 | if (((chip_id & CFG_CHIP_TYPE) == VT_CHIP_ID) && !((chip_id >> 24) & 1)) { |
| 2951 | switch (mem & 0x0f) { | 2951 | switch (mem & 0x0f) { |
| 2952 | case 3: | 2952 | case 3: |
| @@ -2964,7 +2964,7 @@ static int __devinit atyfb_setup_sparc(struct pci_dev *pdev, | |||
| 2964 | default: | 2964 | default: |
| 2965 | break; | 2965 | break; |
| 2966 | } | 2966 | } |
| 2967 | if ((aty_ld_le32(CONFIG_STAT0, par) & 7) >= SDRAM) | 2967 | if ((aty_ld_le32(CNFG_STAT0, par) & 7) >= SDRAM) |
| 2968 | mem &= ~(0x00700000); | 2968 | mem &= ~(0x00700000); |
| 2969 | } | 2969 | } |
| 2970 | mem &= ~(0xcf80e000); /* Turn off all undocumented bits. */ | 2970 | mem &= ~(0xcf80e000); /* Turn off all undocumented bits. */ |
| @@ -3572,7 +3572,7 @@ static int __init atyfb_atari_probe(void) | |||
| 3572 | } | 3572 | } |
| 3573 | 3573 | ||
| 3574 | /* Fake pci_id for correct_chipset() */ | 3574 | /* Fake pci_id for correct_chipset() */ |
| 3575 | switch (aty_ld_le32(CONFIG_CHIP_ID, par) & CFG_CHIP_TYPE) { | 3575 | switch (aty_ld_le32(CNFG_CHIP_ID, par) & CFG_CHIP_TYPE) { |
| 3576 | case 0x00d7: | 3576 | case 0x00d7: |
| 3577 | par->pci_id = PCI_CHIP_MACH64GX; | 3577 | par->pci_id = PCI_CHIP_MACH64GX; |
| 3578 | break; | 3578 | break; |
diff --git a/drivers/video/aty/mach64_ct.c b/drivers/video/aty/mach64_ct.c index c50c7cf26fe9..2745b8539485 100644 --- a/drivers/video/aty/mach64_ct.c +++ b/drivers/video/aty/mach64_ct.c | |||
| @@ -8,6 +8,9 @@ | |||
| 8 | #include <asm/io.h> | 8 | #include <asm/io.h> |
| 9 | #include <video/mach64.h> | 9 | #include <video/mach64.h> |
| 10 | #include "atyfb.h" | 10 | #include "atyfb.h" |
| 11 | #ifdef CONFIG_PPC | ||
| 12 | #include <asm/machdep.h> | ||
| 13 | #endif | ||
| 11 | 14 | ||
| 12 | #undef DEBUG | 15 | #undef DEBUG |
| 13 | 16 | ||
| @@ -536,6 +539,14 @@ static int __devinit aty_init_pll_ct(const struct fb_info *info, | |||
| 536 | pll->ct.xclk_post_div_real = postdividers[xpost_div]; | 539 | pll->ct.xclk_post_div_real = postdividers[xpost_div]; |
| 537 | pll->ct.mclk_fb_div = q * pll->ct.xclk_post_div_real / 8; | 540 | pll->ct.mclk_fb_div = q * pll->ct.xclk_post_div_real / 8; |
| 538 | 541 | ||
| 542 | #ifdef CONFIG_PPC | ||
| 543 | if (machine_is(powermac)) { | ||
| 544 | /* Override PLL_EXT_CNTL & 0x07. */ | ||
| 545 | pll->ct.xclk_post_div = xpost_div; | ||
| 546 | pll->ct.xclk_ref_div = 1; | ||
| 547 | } | ||
| 548 | #endif | ||
| 549 | |||
| 539 | #ifdef DEBUG | 550 | #ifdef DEBUG |
| 540 | pllmclk = (1000000 * pll->ct.mclk_fb_mult * pll->ct.mclk_fb_div) / | 551 | pllmclk = (1000000 * pll->ct.mclk_fb_mult * pll->ct.mclk_fb_div) / |
| 541 | (par->ref_clk_per * pll->ct.pll_ref_div); | 552 | (par->ref_clk_per * pll->ct.pll_ref_div); |
diff --git a/drivers/video/aty/radeon_base.c b/drivers/video/aty/radeon_base.c index d0f1a7fc2c9d..16bb7e3c0310 100644 --- a/drivers/video/aty/radeon_base.c +++ b/drivers/video/aty/radeon_base.c | |||
| @@ -1936,8 +1936,8 @@ static void fixup_memory_mappings(struct radeonfb_info *rinfo) | |||
| 1936 | OUTREG(CRTC_GEN_CNTL, save_crtc_gen_cntl | CRTC_DISP_REQ_EN_B); | 1936 | OUTREG(CRTC_GEN_CNTL, save_crtc_gen_cntl | CRTC_DISP_REQ_EN_B); |
| 1937 | mdelay(100); | 1937 | mdelay(100); |
| 1938 | 1938 | ||
| 1939 | aper_base = INREG(CONFIG_APER_0_BASE); | 1939 | aper_base = INREG(CNFG_APER_0_BASE); |
| 1940 | aper_size = INREG(CONFIG_APER_SIZE); | 1940 | aper_size = INREG(CNFG_APER_SIZE); |
| 1941 | 1941 | ||
| 1942 | #ifdef SET_MC_FB_FROM_APERTURE | 1942 | #ifdef SET_MC_FB_FROM_APERTURE |
| 1943 | /* Set framebuffer to be at the same address as set in PCI BAR */ | 1943 | /* Set framebuffer to be at the same address as set in PCI BAR */ |
| @@ -2024,11 +2024,11 @@ static void radeon_identify_vram(struct radeonfb_info *rinfo) | |||
| 2024 | ~CRTC_H_CUTOFF_ACTIVE_EN); | 2024 | ~CRTC_H_CUTOFF_ACTIVE_EN); |
| 2025 | } | 2025 | } |
| 2026 | } else { | 2026 | } else { |
| 2027 | tmp = INREG(CONFIG_MEMSIZE); | 2027 | tmp = INREG(CNFG_MEMSIZE); |
| 2028 | } | 2028 | } |
| 2029 | 2029 | ||
| 2030 | /* mem size is bits [28:0], mask off the rest */ | 2030 | /* mem size is bits [28:0], mask off the rest */ |
| 2031 | rinfo->video_ram = tmp & CONFIG_MEMSIZE_MASK; | 2031 | rinfo->video_ram = tmp & CNFG_MEMSIZE_MASK; |
| 2032 | 2032 | ||
| 2033 | /* | 2033 | /* |
| 2034 | * Hack to get around some busted production M6's | 2034 | * Hack to get around some busted production M6's |
| @@ -2228,7 +2228,7 @@ static int __devinit radeonfb_pci_register (struct pci_dev *pdev, | |||
| 2228 | */ | 2228 | */ |
| 2229 | rinfo->errata = 0; | 2229 | rinfo->errata = 0; |
| 2230 | if (rinfo->family == CHIP_FAMILY_R300 && | 2230 | if (rinfo->family == CHIP_FAMILY_R300 && |
| 2231 | (INREG(CONFIG_CNTL) & CFG_ATI_REV_ID_MASK) | 2231 | (INREG(CNFG_CNTL) & CFG_ATI_REV_ID_MASK) |
| 2232 | == CFG_ATI_REV_A11) | 2232 | == CFG_ATI_REV_A11) |
| 2233 | rinfo->errata |= CHIP_ERRATA_R300_CG; | 2233 | rinfo->errata |= CHIP_ERRATA_R300_CG; |
| 2234 | 2234 | ||
diff --git a/drivers/video/aty/radeon_pm.c b/drivers/video/aty/radeon_pm.c index 675abdafc2d8..c4ac2a032fcb 100644 --- a/drivers/video/aty/radeon_pm.c +++ b/drivers/video/aty/radeon_pm.c | |||
| @@ -333,7 +333,7 @@ static void radeon_pm_enable_dynamic_mode(struct radeonfb_info *rinfo) | |||
| 333 | if (!rinfo->has_CRTC2) { | 333 | if (!rinfo->has_CRTC2) { |
| 334 | tmp = INPLL(pllSCLK_CNTL); | 334 | tmp = INPLL(pllSCLK_CNTL); |
| 335 | 335 | ||
| 336 | if ((INREG(CONFIG_CNTL) & CFG_ATI_REV_ID_MASK) > CFG_ATI_REV_A13) | 336 | if ((INREG(CNFG_CNTL) & CFG_ATI_REV_ID_MASK) > CFG_ATI_REV_A13) |
| 337 | tmp &= ~(SCLK_CNTL__FORCE_CP | SCLK_CNTL__FORCE_RB); | 337 | tmp &= ~(SCLK_CNTL__FORCE_CP | SCLK_CNTL__FORCE_RB); |
| 338 | tmp &= ~(SCLK_CNTL__FORCE_HDP | SCLK_CNTL__FORCE_DISP1 | | 338 | tmp &= ~(SCLK_CNTL__FORCE_HDP | SCLK_CNTL__FORCE_DISP1 | |
| 339 | SCLK_CNTL__FORCE_TOP | SCLK_CNTL__FORCE_SE | | 339 | SCLK_CNTL__FORCE_TOP | SCLK_CNTL__FORCE_SE | |
| @@ -468,9 +468,9 @@ static void radeon_pm_enable_dynamic_mode(struct radeonfb_info *rinfo) | |||
| 468 | 468 | ||
| 469 | /*RAGE_6::A11 A12 A12N1 A13, RV250::A11 A12, R300*/ | 469 | /*RAGE_6::A11 A12 A12N1 A13, RV250::A11 A12, R300*/ |
| 470 | if ((rinfo->family == CHIP_FAMILY_RV250 && | 470 | if ((rinfo->family == CHIP_FAMILY_RV250 && |
| 471 | ((INREG(CONFIG_CNTL) & CFG_ATI_REV_ID_MASK) < CFG_ATI_REV_A13)) || | 471 | ((INREG(CNFG_CNTL) & CFG_ATI_REV_ID_MASK) < CFG_ATI_REV_A13)) || |
| 472 | ((rinfo->family == CHIP_FAMILY_RV100) && | 472 | ((rinfo->family == CHIP_FAMILY_RV100) && |
| 473 | ((INREG(CONFIG_CNTL) & CFG_ATI_REV_ID_MASK) <= CFG_ATI_REV_A13))) { | 473 | ((INREG(CNFG_CNTL) & CFG_ATI_REV_ID_MASK) <= CFG_ATI_REV_A13))) { |
| 474 | tmp |= SCLK_CNTL__FORCE_CP; | 474 | tmp |= SCLK_CNTL__FORCE_CP; |
| 475 | tmp |= SCLK_CNTL__FORCE_VIP; | 475 | tmp |= SCLK_CNTL__FORCE_VIP; |
| 476 | } | 476 | } |
| @@ -486,7 +486,7 @@ static void radeon_pm_enable_dynamic_mode(struct radeonfb_info *rinfo) | |||
| 486 | /* RV200::A11 A12 RV250::A11 A12 */ | 486 | /* RV200::A11 A12 RV250::A11 A12 */ |
| 487 | if (((rinfo->family == CHIP_FAMILY_RV200) || | 487 | if (((rinfo->family == CHIP_FAMILY_RV200) || |
| 488 | (rinfo->family == CHIP_FAMILY_RV250)) && | 488 | (rinfo->family == CHIP_FAMILY_RV250)) && |
| 489 | ((INREG(CONFIG_CNTL) & CFG_ATI_REV_ID_MASK) < CFG_ATI_REV_A13)) | 489 | ((INREG(CNFG_CNTL) & CFG_ATI_REV_ID_MASK) < CFG_ATI_REV_A13)) |
| 490 | tmp |= SCLK_MORE_CNTL__FORCEON; | 490 | tmp |= SCLK_MORE_CNTL__FORCEON; |
| 491 | 491 | ||
| 492 | OUTPLL(pllSCLK_MORE_CNTL, tmp); | 492 | OUTPLL(pllSCLK_MORE_CNTL, tmp); |
| @@ -497,7 +497,7 @@ static void radeon_pm_enable_dynamic_mode(struct radeonfb_info *rinfo) | |||
| 497 | /* RV200::A11 A12, RV250::A11 A12 */ | 497 | /* RV200::A11 A12, RV250::A11 A12 */ |
| 498 | if (((rinfo->family == CHIP_FAMILY_RV200) || | 498 | if (((rinfo->family == CHIP_FAMILY_RV200) || |
| 499 | (rinfo->family == CHIP_FAMILY_RV250)) && | 499 | (rinfo->family == CHIP_FAMILY_RV250)) && |
| 500 | ((INREG(CONFIG_CNTL) & CFG_ATI_REV_ID_MASK) < CFG_ATI_REV_A13)) { | 500 | ((INREG(CNFG_CNTL) & CFG_ATI_REV_ID_MASK) < CFG_ATI_REV_A13)) { |
| 501 | tmp = INPLL(pllPLL_PWRMGT_CNTL); | 501 | tmp = INPLL(pllPLL_PWRMGT_CNTL); |
| 502 | tmp |= PLL_PWRMGT_CNTL__TCL_BYPASS_DISABLE; | 502 | tmp |= PLL_PWRMGT_CNTL__TCL_BYPASS_DISABLE; |
| 503 | OUTPLL(pllPLL_PWRMGT_CNTL, tmp); | 503 | OUTPLL(pllPLL_PWRMGT_CNTL, tmp); |
| @@ -702,7 +702,7 @@ static void radeon_pm_restore_regs(struct radeonfb_info *rinfo) | |||
| 702 | OUTREG(DISPLAY_BASE_ADDR, rinfo->save_regs[31]); | 702 | OUTREG(DISPLAY_BASE_ADDR, rinfo->save_regs[31]); |
| 703 | OUTREG(MC_AGP_LOCATION, rinfo->save_regs[32]); | 703 | OUTREG(MC_AGP_LOCATION, rinfo->save_regs[32]); |
| 704 | OUTREG(CRTC2_DISPLAY_BASE_ADDR, rinfo->save_regs[33]); | 704 | OUTREG(CRTC2_DISPLAY_BASE_ADDR, rinfo->save_regs[33]); |
| 705 | OUTREG(CONFIG_MEMSIZE, rinfo->video_ram); | 705 | OUTREG(CNFG_MEMSIZE, rinfo->video_ram); |
| 706 | 706 | ||
| 707 | OUTREG(DISP_MISC_CNTL, rinfo->save_regs[9]); | 707 | OUTREG(DISP_MISC_CNTL, rinfo->save_regs[9]); |
| 708 | OUTREG(DISP_PWR_MAN, rinfo->save_regs[10]); | 708 | OUTREG(DISP_PWR_MAN, rinfo->save_regs[10]); |
| @@ -1723,7 +1723,7 @@ static void radeon_reinitialize_M10(struct radeonfb_info *rinfo) | |||
| 1723 | OUTREG(CRTC2_DISPLAY_BASE_ADDR, rinfo->save_regs[33]); | 1723 | OUTREG(CRTC2_DISPLAY_BASE_ADDR, rinfo->save_regs[33]); |
| 1724 | OUTREG(MC_FB_LOCATION, rinfo->save_regs[30]); | 1724 | OUTREG(MC_FB_LOCATION, rinfo->save_regs[30]); |
| 1725 | OUTREG(OV0_BASE_ADDR, rinfo->save_regs[80]); | 1725 | OUTREG(OV0_BASE_ADDR, rinfo->save_regs[80]); |
| 1726 | OUTREG(CONFIG_MEMSIZE, rinfo->video_ram); | 1726 | OUTREG(CNFG_MEMSIZE, rinfo->video_ram); |
| 1727 | OUTREG(BUS_CNTL, rinfo->save_regs[36]); | 1727 | OUTREG(BUS_CNTL, rinfo->save_regs[36]); |
| 1728 | OUTREG(BUS_CNTL1, rinfo->save_regs[14]); | 1728 | OUTREG(BUS_CNTL1, rinfo->save_regs[14]); |
| 1729 | OUTREG(MPP_TB_CONFIG, rinfo->save_regs[37]); | 1729 | OUTREG(MPP_TB_CONFIG, rinfo->save_regs[37]); |
| @@ -1961,7 +1961,7 @@ static void radeon_pm_m9p_reconfigure_mc(struct radeonfb_info *rinfo) | |||
| 1961 | OUTMC(rinfo, ixMC_CHP_IO_CNTL_B1, rinfo->save_regs[68] /*0x141555ff*/); | 1961 | OUTMC(rinfo, ixMC_CHP_IO_CNTL_B1, rinfo->save_regs[68] /*0x141555ff*/); |
| 1962 | OUTMC(rinfo, ixMC_IMP_CNTL_0, rinfo->save_regs[71] /*0x00009249*/); | 1962 | OUTMC(rinfo, ixMC_IMP_CNTL_0, rinfo->save_regs[71] /*0x00009249*/); |
| 1963 | OUTREG(MC_IND_INDEX, 0); | 1963 | OUTREG(MC_IND_INDEX, 0); |
| 1964 | OUTREG(CONFIG_MEMSIZE, rinfo->video_ram); | 1964 | OUTREG(CNFG_MEMSIZE, rinfo->video_ram); |
| 1965 | 1965 | ||
| 1966 | mdelay(20); | 1966 | mdelay(20); |
| 1967 | } | 1967 | } |
| @@ -2361,7 +2361,7 @@ static void radeon_reinitialize_QW(struct radeonfb_info *rinfo) | |||
| 2361 | OUTMC(rinfo, ixMC_IMP_CNTL_0, 0x00009249); | 2361 | OUTMC(rinfo, ixMC_IMP_CNTL_0, 0x00009249); |
| 2362 | OUTREG(MC_IND_INDEX, 0); | 2362 | OUTREG(MC_IND_INDEX, 0); |
| 2363 | 2363 | ||
| 2364 | OUTREG(CONFIG_MEMSIZE, rinfo->video_ram); | 2364 | OUTREG(CNFG_MEMSIZE, rinfo->video_ram); |
| 2365 | 2365 | ||
| 2366 | radeon_pm_full_reset_sdram(rinfo); | 2366 | radeon_pm_full_reset_sdram(rinfo); |
| 2367 | 2367 | ||
diff --git a/drivers/video/backlight/Makefile b/drivers/video/backlight/Makefile index 363b3cb2f01b..63d759498165 100644 --- a/drivers/video/backlight/Makefile +++ b/drivers/video/backlight/Makefile | |||
| @@ -18,7 +18,7 @@ obj-$(CONFIG_BACKLIGHT_OMAP1) += omap1_bl.o | |||
| 18 | obj-$(CONFIG_BACKLIGHT_PROGEAR) += progear_bl.o | 18 | obj-$(CONFIG_BACKLIGHT_PROGEAR) += progear_bl.o |
| 19 | obj-$(CONFIG_BACKLIGHT_CARILLO_RANCH) += cr_bllcd.o | 19 | obj-$(CONFIG_BACKLIGHT_CARILLO_RANCH) += cr_bllcd.o |
| 20 | obj-$(CONFIG_BACKLIGHT_PWM) += pwm_bl.o | 20 | obj-$(CONFIG_BACKLIGHT_PWM) += pwm_bl.o |
| 21 | obj-$(CONFIG_BACKLIGHT_DA903X) += da903x.o | 21 | obj-$(CONFIG_BACKLIGHT_DA903X) += da903x_bl.o |
| 22 | obj-$(CONFIG_BACKLIGHT_MBP_NVIDIA) += mbp_nvidia_bl.o | 22 | obj-$(CONFIG_BACKLIGHT_MBP_NVIDIA) += mbp_nvidia_bl.o |
| 23 | obj-$(CONFIG_BACKLIGHT_TOSA) += tosa_bl.o | 23 | obj-$(CONFIG_BACKLIGHT_TOSA) += tosa_bl.o |
| 24 | obj-$(CONFIG_BACKLIGHT_SAHARA) += kb3886_bl.o | 24 | obj-$(CONFIG_BACKLIGHT_SAHARA) += kb3886_bl.o |
diff --git a/drivers/video/backlight/da903x.c b/drivers/video/backlight/da903x_bl.c index 93bb4340cc64..93bb4340cc64 100644 --- a/drivers/video/backlight/da903x.c +++ b/drivers/video/backlight/da903x_bl.c | |||
diff --git a/drivers/video/fbcmap.c b/drivers/video/fbcmap.c index 91b78e691505..f53b9f1d6aba 100644 --- a/drivers/video/fbcmap.c +++ b/drivers/video/fbcmap.c | |||
| @@ -250,10 +250,6 @@ int fb_set_user_cmap(struct fb_cmap_user *cmap, struct fb_info *info) | |||
| 250 | int rc, size = cmap->len * sizeof(u16); | 250 | int rc, size = cmap->len * sizeof(u16); |
| 251 | struct fb_cmap umap; | 251 | struct fb_cmap umap; |
| 252 | 252 | ||
| 253 | if (cmap->start < 0 || (!info->fbops->fb_setcolreg && | ||
| 254 | !info->fbops->fb_setcmap)) | ||
| 255 | return -EINVAL; | ||
| 256 | |||
| 257 | memset(&umap, 0, sizeof(struct fb_cmap)); | 253 | memset(&umap, 0, sizeof(struct fb_cmap)); |
| 258 | rc = fb_alloc_cmap(&umap, cmap->len, cmap->transp != NULL); | 254 | rc = fb_alloc_cmap(&umap, cmap->len, cmap->transp != NULL); |
| 259 | if (rc) | 255 | if (rc) |
| @@ -262,11 +258,23 @@ int fb_set_user_cmap(struct fb_cmap_user *cmap, struct fb_info *info) | |||
| 262 | copy_from_user(umap.green, cmap->green, size) || | 258 | copy_from_user(umap.green, cmap->green, size) || |
| 263 | copy_from_user(umap.blue, cmap->blue, size) || | 259 | copy_from_user(umap.blue, cmap->blue, size) || |
| 264 | (cmap->transp && copy_from_user(umap.transp, cmap->transp, size))) { | 260 | (cmap->transp && copy_from_user(umap.transp, cmap->transp, size))) { |
| 265 | fb_dealloc_cmap(&umap); | 261 | rc = -EFAULT; |
| 266 | return -EFAULT; | 262 | goto out; |
| 267 | } | 263 | } |
| 268 | umap.start = cmap->start; | 264 | umap.start = cmap->start; |
| 265 | if (!lock_fb_info(info)) { | ||
| 266 | rc = -ENODEV; | ||
| 267 | goto out; | ||
| 268 | } | ||
| 269 | if (cmap->start < 0 || (!info->fbops->fb_setcolreg && | ||
| 270 | !info->fbops->fb_setcmap)) { | ||
| 271 | rc = -EINVAL; | ||
| 272 | goto out1; | ||
| 273 | } | ||
| 269 | rc = fb_set_cmap(&umap, info); | 274 | rc = fb_set_cmap(&umap, info); |
| 275 | out1: | ||
| 276 | unlock_fb_info(info); | ||
| 277 | out: | ||
| 270 | fb_dealloc_cmap(&umap); | 278 | fb_dealloc_cmap(&umap); |
| 271 | return rc; | 279 | return rc; |
| 272 | } | 280 | } |
diff --git a/drivers/video/fbmem.c b/drivers/video/fbmem.c index 756efeb91abc..cfd9dce1ce0b 100644 --- a/drivers/video/fbmem.c +++ b/drivers/video/fbmem.c | |||
| @@ -1013,132 +1013,139 @@ static long do_fb_ioctl(struct fb_info *info, unsigned int cmd, | |||
| 1013 | struct fb_var_screeninfo var; | 1013 | struct fb_var_screeninfo var; |
| 1014 | struct fb_fix_screeninfo fix; | 1014 | struct fb_fix_screeninfo fix; |
| 1015 | struct fb_con2fbmap con2fb; | 1015 | struct fb_con2fbmap con2fb; |
| 1016 | struct fb_cmap cmap_from; | ||
| 1016 | struct fb_cmap_user cmap; | 1017 | struct fb_cmap_user cmap; |
| 1017 | struct fb_event event; | 1018 | struct fb_event event; |
| 1018 | void __user *argp = (void __user *)arg; | 1019 | void __user *argp = (void __user *)arg; |
| 1019 | long ret = 0; | 1020 | long ret = 0; |
| 1020 | 1021 | ||
| 1021 | fb = info->fbops; | ||
| 1022 | if (!fb) | ||
| 1023 | return -ENODEV; | ||
| 1024 | |||
| 1025 | switch (cmd) { | 1022 | switch (cmd) { |
| 1026 | case FBIOGET_VSCREENINFO: | 1023 | case FBIOGET_VSCREENINFO: |
| 1027 | ret = copy_to_user(argp, &info->var, | 1024 | if (!lock_fb_info(info)) |
| 1028 | sizeof(var)) ? -EFAULT : 0; | 1025 | return -ENODEV; |
| 1026 | var = info->var; | ||
| 1027 | unlock_fb_info(info); | ||
| 1028 | |||
| 1029 | ret = copy_to_user(argp, &var, sizeof(var)) ? -EFAULT : 0; | ||
| 1029 | break; | 1030 | break; |
| 1030 | case FBIOPUT_VSCREENINFO: | 1031 | case FBIOPUT_VSCREENINFO: |
| 1031 | if (copy_from_user(&var, argp, sizeof(var))) { | 1032 | if (copy_from_user(&var, argp, sizeof(var))) |
| 1032 | ret = -EFAULT; | 1033 | return -EFAULT; |
| 1033 | break; | 1034 | if (!lock_fb_info(info)) |
| 1034 | } | 1035 | return -ENODEV; |
| 1035 | acquire_console_sem(); | 1036 | acquire_console_sem(); |
| 1036 | info->flags |= FBINFO_MISC_USEREVENT; | 1037 | info->flags |= FBINFO_MISC_USEREVENT; |
| 1037 | ret = fb_set_var(info, &var); | 1038 | ret = fb_set_var(info, &var); |
| 1038 | info->flags &= ~FBINFO_MISC_USEREVENT; | 1039 | info->flags &= ~FBINFO_MISC_USEREVENT; |
| 1039 | release_console_sem(); | 1040 | release_console_sem(); |
| 1040 | if (ret == 0 && copy_to_user(argp, &var, sizeof(var))) | 1041 | unlock_fb_info(info); |
| 1042 | if (!ret && copy_to_user(argp, &var, sizeof(var))) | ||
| 1041 | ret = -EFAULT; | 1043 | ret = -EFAULT; |
| 1042 | break; | 1044 | break; |
| 1043 | case FBIOGET_FSCREENINFO: | 1045 | case FBIOGET_FSCREENINFO: |
| 1044 | ret = copy_to_user(argp, &info->fix, | 1046 | if (!lock_fb_info(info)) |
| 1045 | sizeof(fix)) ? -EFAULT : 0; | 1047 | return -ENODEV; |
| 1048 | fix = info->fix; | ||
| 1049 | unlock_fb_info(info); | ||
| 1050 | |||
| 1051 | ret = copy_to_user(argp, &fix, sizeof(fix)) ? -EFAULT : 0; | ||
| 1046 | break; | 1052 | break; |
| 1047 | case FBIOPUTCMAP: | 1053 | case FBIOPUTCMAP: |
| 1048 | if (copy_from_user(&cmap, argp, sizeof(cmap))) | 1054 | if (copy_from_user(&cmap, argp, sizeof(cmap))) |
| 1049 | ret = -EFAULT; | 1055 | return -EFAULT; |
| 1050 | else | 1056 | ret = fb_set_user_cmap(&cmap, info); |
| 1051 | ret = fb_set_user_cmap(&cmap, info); | ||
| 1052 | break; | 1057 | break; |
| 1053 | case FBIOGETCMAP: | 1058 | case FBIOGETCMAP: |
| 1054 | if (copy_from_user(&cmap, argp, sizeof(cmap))) | 1059 | if (copy_from_user(&cmap, argp, sizeof(cmap))) |
| 1055 | ret = -EFAULT; | 1060 | return -EFAULT; |
| 1056 | else | 1061 | if (!lock_fb_info(info)) |
| 1057 | ret = fb_cmap_to_user(&info->cmap, &cmap); | 1062 | return -ENODEV; |
| 1063 | cmap_from = info->cmap; | ||
| 1064 | unlock_fb_info(info); | ||
| 1065 | ret = fb_cmap_to_user(&cmap_from, &cmap); | ||
| 1058 | break; | 1066 | break; |
| 1059 | case FBIOPAN_DISPLAY: | 1067 | case FBIOPAN_DISPLAY: |
| 1060 | if (copy_from_user(&var, argp, sizeof(var))) { | 1068 | if (copy_from_user(&var, argp, sizeof(var))) |
| 1061 | ret = -EFAULT; | 1069 | return -EFAULT; |
| 1062 | break; | 1070 | if (!lock_fb_info(info)) |
| 1063 | } | 1071 | return -ENODEV; |
| 1064 | acquire_console_sem(); | 1072 | acquire_console_sem(); |
| 1065 | ret = fb_pan_display(info, &var); | 1073 | ret = fb_pan_display(info, &var); |
| 1066 | release_console_sem(); | 1074 | release_console_sem(); |
| 1075 | unlock_fb_info(info); | ||
| 1067 | if (ret == 0 && copy_to_user(argp, &var, sizeof(var))) | 1076 | if (ret == 0 && copy_to_user(argp, &var, sizeof(var))) |
| 1068 | ret = -EFAULT; | 1077 | return -EFAULT; |
| 1069 | break; | 1078 | break; |
| 1070 | case FBIO_CURSOR: | 1079 | case FBIO_CURSOR: |
| 1071 | ret = -EINVAL; | 1080 | ret = -EINVAL; |
| 1072 | break; | 1081 | break; |
| 1073 | case FBIOGET_CON2FBMAP: | 1082 | case FBIOGET_CON2FBMAP: |
| 1074 | if (copy_from_user(&con2fb, argp, sizeof(con2fb))) | 1083 | if (copy_from_user(&con2fb, argp, sizeof(con2fb))) |
| 1075 | ret = -EFAULT; | 1084 | return -EFAULT; |
| 1076 | else if (con2fb.console < 1 || con2fb.console > MAX_NR_CONSOLES) | 1085 | if (con2fb.console < 1 || con2fb.console > MAX_NR_CONSOLES) |
| 1077 | ret = -EINVAL; | 1086 | return -EINVAL; |
| 1078 | else { | 1087 | con2fb.framebuffer = -1; |
| 1079 | con2fb.framebuffer = -1; | 1088 | event.data = &con2fb; |
| 1080 | event.info = info; | 1089 | |
| 1081 | event.data = &con2fb; | 1090 | if (!lock_fb_info(info)) |
| 1082 | fb_notifier_call_chain(FB_EVENT_GET_CONSOLE_MAP, | 1091 | return -ENODEV; |
| 1083 | &event); | 1092 | event.info = info; |
| 1084 | ret = copy_to_user(argp, &con2fb, | 1093 | fb_notifier_call_chain(FB_EVENT_GET_CONSOLE_MAP, &event); |
| 1085 | sizeof(con2fb)) ? -EFAULT : 0; | 1094 | unlock_fb_info(info); |
| 1086 | } | 1095 | |
| 1096 | ret = copy_to_user(argp, &con2fb, sizeof(con2fb)) ? -EFAULT : 0; | ||
| 1087 | break; | 1097 | break; |
| 1088 | case FBIOPUT_CON2FBMAP: | 1098 | case FBIOPUT_CON2FBMAP: |
| 1089 | if (copy_from_user(&con2fb, argp, sizeof(con2fb))) { | 1099 | if (copy_from_user(&con2fb, argp, sizeof(con2fb))) |
| 1090 | ret = -EFAULT; | 1100 | return -EFAULT; |
| 1091 | break; | 1101 | if (con2fb.console < 1 || con2fb.console > MAX_NR_CONSOLES) |
| 1092 | } | 1102 | return -EINVAL; |
| 1093 | if (con2fb.console < 1 || con2fb.console > MAX_NR_CONSOLES) { | 1103 | if (con2fb.framebuffer < 0 || con2fb.framebuffer >= FB_MAX) |
| 1094 | ret = -EINVAL; | 1104 | return -EINVAL; |
| 1095 | break; | ||
| 1096 | } | ||
| 1097 | if (con2fb.framebuffer < 0 || con2fb.framebuffer >= FB_MAX) { | ||
| 1098 | ret = -EINVAL; | ||
| 1099 | break; | ||
| 1100 | } | ||
| 1101 | if (!registered_fb[con2fb.framebuffer]) | 1105 | if (!registered_fb[con2fb.framebuffer]) |
| 1102 | request_module("fb%d", con2fb.framebuffer); | 1106 | request_module("fb%d", con2fb.framebuffer); |
| 1103 | if (!registered_fb[con2fb.framebuffer]) { | 1107 | if (!registered_fb[con2fb.framebuffer]) { |
| 1104 | ret = -EINVAL; | 1108 | ret = -EINVAL; |
| 1105 | break; | 1109 | break; |
| 1106 | } | 1110 | } |
| 1107 | event.info = info; | ||
| 1108 | event.data = &con2fb; | 1111 | event.data = &con2fb; |
| 1112 | if (!lock_fb_info(info)) | ||
| 1113 | return -ENODEV; | ||
| 1114 | event.info = info; | ||
| 1109 | ret = fb_notifier_call_chain(FB_EVENT_SET_CONSOLE_MAP, | 1115 | ret = fb_notifier_call_chain(FB_EVENT_SET_CONSOLE_MAP, |
| 1110 | &event); | 1116 | &event); |
| 1117 | unlock_fb_info(info); | ||
| 1111 | break; | 1118 | break; |
| 1112 | case FBIOBLANK: | 1119 | case FBIOBLANK: |
| 1120 | if (!lock_fb_info(info)) | ||
| 1121 | return -ENODEV; | ||
| 1113 | acquire_console_sem(); | 1122 | acquire_console_sem(); |
| 1114 | info->flags |= FBINFO_MISC_USEREVENT; | 1123 | info->flags |= FBINFO_MISC_USEREVENT; |
| 1115 | ret = fb_blank(info, arg); | 1124 | ret = fb_blank(info, arg); |
| 1116 | info->flags &= ~FBINFO_MISC_USEREVENT; | 1125 | info->flags &= ~FBINFO_MISC_USEREVENT; |
| 1117 | release_console_sem(); | 1126 | release_console_sem(); |
| 1118 | break;; | 1127 | unlock_fb_info(info); |
| 1128 | break; | ||
| 1119 | default: | 1129 | default: |
| 1120 | if (fb->fb_ioctl == NULL) | 1130 | if (!lock_fb_info(info)) |
| 1121 | ret = -ENOTTY; | 1131 | return -ENODEV; |
| 1122 | else | 1132 | fb = info->fbops; |
| 1133 | if (fb->fb_ioctl) | ||
| 1123 | ret = fb->fb_ioctl(info, cmd, arg); | 1134 | ret = fb->fb_ioctl(info, cmd, arg); |
| 1135 | else | ||
| 1136 | ret = -ENOTTY; | ||
| 1137 | unlock_fb_info(info); | ||
| 1124 | } | 1138 | } |
| 1125 | return ret; | 1139 | return ret; |
| 1126 | } | 1140 | } |
| 1127 | 1141 | ||
| 1128 | static long fb_ioctl(struct file *file, unsigned int cmd, unsigned long arg) | 1142 | static long fb_ioctl(struct file *file, unsigned int cmd, unsigned long arg) |
| 1129 | __acquires(&info->lock) | ||
| 1130 | __releases(&info->lock) | ||
| 1131 | { | 1143 | { |
| 1132 | struct inode *inode = file->f_path.dentry->d_inode; | 1144 | struct inode *inode = file->f_path.dentry->d_inode; |
| 1133 | int fbidx = iminor(inode); | 1145 | int fbidx = iminor(inode); |
| 1134 | struct fb_info *info; | 1146 | struct fb_info *info = registered_fb[fbidx]; |
| 1135 | long ret; | ||
| 1136 | 1147 | ||
| 1137 | info = registered_fb[fbidx]; | 1148 | return do_fb_ioctl(info, cmd, arg); |
| 1138 | mutex_lock(&info->lock); | ||
| 1139 | ret = do_fb_ioctl(info, cmd, arg); | ||
| 1140 | mutex_unlock(&info->lock); | ||
| 1141 | return ret; | ||
| 1142 | } | 1149 | } |
| 1143 | 1150 | ||
| 1144 | #ifdef CONFIG_COMPAT | 1151 | #ifdef CONFIG_COMPAT |
| @@ -1257,8 +1264,6 @@ static int fb_get_fscreeninfo(struct fb_info *info, unsigned int cmd, | |||
| 1257 | 1264 | ||
| 1258 | static long fb_compat_ioctl(struct file *file, unsigned int cmd, | 1265 | static long fb_compat_ioctl(struct file *file, unsigned int cmd, |
| 1259 | unsigned long arg) | 1266 | unsigned long arg) |
| 1260 | __acquires(&info->lock) | ||
| 1261 | __releases(&info->lock) | ||
| 1262 | { | 1267 | { |
| 1263 | struct inode *inode = file->f_path.dentry->d_inode; | 1268 | struct inode *inode = file->f_path.dentry->d_inode; |
| 1264 | int fbidx = iminor(inode); | 1269 | int fbidx = iminor(inode); |
| @@ -1266,7 +1271,6 @@ __releases(&info->lock) | |||
| 1266 | struct fb_ops *fb = info->fbops; | 1271 | struct fb_ops *fb = info->fbops; |
| 1267 | long ret = -ENOIOCTLCMD; | 1272 | long ret = -ENOIOCTLCMD; |
| 1268 | 1273 | ||
| 1269 | mutex_lock(&info->lock); | ||
| 1270 | switch(cmd) { | 1274 | switch(cmd) { |
| 1271 | case FBIOGET_VSCREENINFO: | 1275 | case FBIOGET_VSCREENINFO: |
| 1272 | case FBIOPUT_VSCREENINFO: | 1276 | case FBIOPUT_VSCREENINFO: |
| @@ -1292,7 +1296,6 @@ __releases(&info->lock) | |||
| 1292 | ret = fb->fb_compat_ioctl(info, cmd, arg); | 1296 | ret = fb->fb_compat_ioctl(info, cmd, arg); |
| 1293 | break; | 1297 | break; |
| 1294 | } | 1298 | } |
| 1295 | mutex_unlock(&info->lock); | ||
| 1296 | return ret; | 1299 | return ret; |
| 1297 | } | 1300 | } |
| 1298 | #endif | 1301 | #endif |
