Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge branch 'fbdev-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/lethal/fbdev-2.6

* 'fbdev-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/lethal/fbdev-2.6:
efifb: Add override for 11" Macbook Air 3,1
efifb: Support overriding fields FW tells us with the DMI data.
fb: Reduce priority of resource conflict message
savagefb: Remove obsolete else clause in savage_setup_i2c_bus
savagefb: Set up I2C based on chip family instead of card id
savagefb: Replace magic register address with define
drivers/video/bfin-lq035q1-fb.c: introduce missing kfree
video: s3c-fb: fix checkpatch errors and warning
efifb: support AMD Radeon HD 6490
s3fb: fix Virge/GX2
fbcon: Remove unused 'display *p' variable from fb_flashcursor()
fbdev: sh_mobile_lcdcfb: fix module lock acquisition
fbdev: sh_mobile_lcdcfb: add blanking support
viafb: initialize margins correct
viafb: refresh rate bug collection
sh: mach-ap325rxa: move backlight control code
sh: mach-ecovec24: support for main lcd backlight

+278 -148
+24 -8
arch/sh/boards/mach-ap325rxa/setup.c
··· 156 156 #define PORT_DRVCRA 0xA405018A 157 157 #define PORT_DRVCRB 0xA405018C 158 158 159 + static int ap320_wvga_set_brightness(void *board_data, int brightness) 160 + { 161 + if (brightness) { 162 + gpio_set_value(GPIO_PTS3, 0); 163 + __raw_writew(0x100, FPGA_BKLREG); 164 + } else { 165 + __raw_writew(0, FPGA_BKLREG); 166 + gpio_set_value(GPIO_PTS3, 1); 167 + } 168 + 169 + return 0; 170 + } 171 + 172 + static int ap320_wvga_get_brightness(void *board_data) 173 + { 174 + return gpio_get_value(GPIO_PTS3); 175 + } 176 + 159 177 static void ap320_wvga_power_on(void *board_data, struct fb_info *info) 160 178 { 161 179 msleep(100); 162 180 163 181 /* ASD AP-320/325 LCD ON */ 164 182 __raw_writew(FPGA_LCDREG_VAL, FPGA_LCDREG); 165 - 166 - /* backlight */ 167 - gpio_set_value(GPIO_PTS3, 0); 168 - __raw_writew(0x100, FPGA_BKLREG); 169 183 } 170 184 171 185 static void ap320_wvga_power_off(void *board_data) 172 186 { 173 - /* backlight */ 174 - __raw_writew(0, FPGA_BKLREG); 175 - gpio_set_value(GPIO_PTS3, 1); 176 - 177 187 /* ASD AP-320/325 LCD OFF */ 178 188 __raw_writew(0, FPGA_LCDREG); 179 189 } ··· 219 209 .board_cfg = { 220 210 .display_on = ap320_wvga_power_on, 221 211 .display_off = ap320_wvga_power_off, 212 + .set_brightness = ap320_wvga_set_brightness, 213 + .get_brightness = ap320_wvga_get_brightness, 214 + }, 215 + .bl_info = { 216 + .name = "sh_mobile_lcdc_bl", 217 + .max_brightness = 1, 222 218 }, 223 219 } 224 220 };
+18
arch/sh/boards/mach-ecovec24/setup.c
··· 263 263 }, 264 264 }; 265 265 266 + static int ecovec24_set_brightness(void *board_data, int brightness) 267 + { 268 + gpio_set_value(GPIO_PTR1, brightness); 269 + 270 + return 0; 271 + } 272 + 273 + static int ecovec24_get_brightness(void *board_data) 274 + { 275 + return gpio_get_value(GPIO_PTR1); 276 + } 277 + 266 278 static struct sh_mobile_lcdc_info lcdc_info = { 267 279 .ch[0] = { 268 280 .interface_type = RGB18, ··· 285 273 .height = 91, 286 274 }, 287 275 .board_cfg = { 276 + .set_brightness = ecovec24_set_brightness, 277 + .get_brightness = ecovec24_get_brightness, 278 + }, 279 + .bl_info = { 280 + .name = "sh_mobile_lcdc_bl", 281 + .max_brightness = 1, 288 282 }, 289 283 } 290 284 };
+3 -1
drivers/video/bfin-lq035q1-fb.c
··· 154 154 155 155 ret = lq035q1_control(spi, LQ035_SHUT_CTL, LQ035_ON); 156 156 ret |= lq035q1_control(spi, LQ035_DRIVER_OUTPUT_CTL, ctl->mode); 157 - if (ret) 157 + if (ret) { 158 + kfree(ctl); 158 159 return ret; 160 + } 159 161 160 162 spi_set_drvdata(spi, ctl); 161 163
-2
drivers/video/console/fbcon.c
··· 370 370 { 371 371 struct fb_info *info = container_of(work, struct fb_info, queue); 372 372 struct fbcon_ops *ops = info->fbcon_par; 373 - struct display *p; 374 373 struct vc_data *vc = NULL; 375 374 int c; 376 375 int mode; ··· 385 386 return; 386 387 } 387 388 388 - p = &fb_display[vc->vc_num]; 389 389 c = scr_readw((u16 *) vc->vc_pos); 390 390 mode = (!ops->cursor_flash || ops->cursor_state.enable) ? 391 391 CM_ERASE : CM_DRAW;
+92 -58
drivers/video/efifb.c
··· 53 53 M_MB_7_1, /* MacBook, 7th rev. */ 54 54 M_MB_SR, /* MacBook, 2nd gen, (Santa Rosa) */ 55 55 M_MBA, /* MacBook Air */ 56 + M_MBA_3, /* Macbook Air, 3rd rev */ 56 57 M_MBP, /* MacBook Pro */ 57 58 M_MBP_2, /* MacBook Pro 2nd gen */ 58 59 M_MBP_2_2, /* MacBook Pro 2,2nd gen */ ··· 65 64 M_MBP_6_1, /* MacBook Pro, 6,1th gen */ 66 65 M_MBP_6_2, /* MacBook Pro, 6,2th gen */ 67 66 M_MBP_7_1, /* MacBook Pro, 7,1th gen */ 67 + M_MBP_8_2, /* MacBook Pro, 8,2nd gen */ 68 68 M_UNKNOWN /* placeholder */ 69 69 }; 70 + 71 + #define OVERRIDE_NONE 0x0 72 + #define OVERRIDE_BASE 0x1 73 + #define OVERRIDE_STRIDE 0x2 74 + #define OVERRIDE_HEIGHT 0x4 75 + #define OVERRIDE_WIDTH 0x8 70 76 71 77 static struct efifb_dmi_info { 72 78 char *optname; ··· 81 73 int stride; 82 74 int width; 83 75 int height; 76 + int flags; 84 77 } dmi_list[] __initdata = { 85 - [M_I17] = { "i17", 0x80010000, 1472 * 4, 1440, 900 }, 86 - [M_I20] = { "i20", 0x80010000, 1728 * 4, 1680, 1050 }, /* guess */ 87 - [M_I20_SR] = { "imac7", 0x40010000, 1728 * 4, 1680, 1050 }, 88 - [M_I24] = { "i24", 0x80010000, 2048 * 4, 1920, 1200 }, /* guess */ 89 - [M_I24_8_1] = { "imac8", 0xc0060000, 2048 * 4, 1920, 1200 }, 90 - [M_I24_10_1] = { "imac10", 0xc0010000, 2048 * 4, 1920, 1080 }, 91 - [M_I27_11_1] = { "imac11", 0xc0010000, 2560 * 4, 2560, 1440 }, 92 - [M_MINI]= { "mini", 0x80000000, 2048 * 4, 1024, 768 }, 93 - [M_MINI_3_1] = { "mini31", 0x40010000, 1024 * 4, 1024, 768 }, 94 - [M_MINI_4_1] = { "mini41", 0xc0010000, 2048 * 4, 1920, 1200 }, 95 - [M_MB] = { "macbook", 0x80000000, 2048 * 4, 1280, 800 }, 96 - [M_MB_5_1] = { "macbook51", 0x80010000, 2048 * 4, 1280, 800 }, 97 - [M_MB_6_1] = { "macbook61", 0x80010000, 2048 * 4, 1280, 800 }, 98 - [M_MB_7_1] = { "macbook71", 0x80010000, 2048 * 4, 1280, 800 }, 99 - [M_MBA] = { "mba", 0x80000000, 2048 * 4, 1280, 800 }, 100 - [M_MBP] = { "mbp", 0x80010000, 1472 * 4, 1440, 900 }, 101 - [M_MBP_2] = { "mbp2", 0, 0, 0, 0 }, /* placeholder */ 102 - [M_MBP_2_2] = { "mbp22", 0x80010000, 1472 * 4, 1440, 900 }, 103 - [M_MBP_SR] = { "mbp3", 0x80030000, 2048 * 4, 1440, 900 }, 104 - [M_MBP_4] = { "mbp4", 0xc0060000, 2048 * 4, 1920, 1200 }, 105 - [M_MBP_5_1] = { "mbp51", 0xc0010000, 2048 * 4, 1440, 900 }, 106 - [M_MBP_5_2] = { "mbp52", 0xc0010000, 2048 * 4, 1920, 1200 }, 107 - [M_MBP_5_3] = { "mbp53", 0xd0010000, 2048 * 4, 1440, 900 }, 108 - [M_MBP_6_1] = { "mbp61", 0x90030000, 2048 * 4, 1920, 1200 }, 109 - [M_MBP_6_2] = { "mbp62", 0x90030000, 2048 * 4, 1680, 1050 }, 110 - [M_MBP_7_1] = { "mbp71", 0xc0010000, 2048 * 4, 1280, 800 }, 111 - [M_UNKNOWN] = { NULL, 0, 0, 0, 0 } 78 + [M_I17] = { "i17", 0x80010000, 1472 * 4, 1440, 900, OVERRIDE_NONE }, 79 + [M_I20] = { "i20", 0x80010000, 1728 * 4, 1680, 1050, OVERRIDE_NONE }, /* guess */ 80 + [M_I20_SR] = { "imac7", 0x40010000, 1728 * 4, 1680, 1050, OVERRIDE_NONE }, 81 + [M_I24] = { "i24", 0x80010000, 2048 * 4, 1920, 1200, OVERRIDE_NONE }, /* guess */ 82 + [M_I24_8_1] = { "imac8", 0xc0060000, 2048 * 4, 1920, 1200, OVERRIDE_NONE }, 83 + [M_I24_10_1] = { "imac10", 0xc0010000, 2048 * 4, 1920, 1080, OVERRIDE_NONE }, 84 + [M_I27_11_1] = { "imac11", 0xc0010000, 2560 * 4, 2560, 1440, OVERRIDE_NONE }, 85 + [M_MINI]= { "mini", 0x80000000, 2048 * 4, 1024, 768, OVERRIDE_NONE }, 86 + [M_MINI_3_1] = { "mini31", 0x40010000, 1024 * 4, 1024, 768, OVERRIDE_NONE }, 87 + [M_MINI_4_1] = { "mini41", 0xc0010000, 2048 * 4, 1920, 1200, OVERRIDE_NONE }, 88 + [M_MB] = { "macbook", 0x80000000, 2048 * 4, 1280, 800, OVERRIDE_NONE }, 89 + [M_MB_5_1] = { "macbook51", 0x80010000, 2048 * 4, 1280, 800, OVERRIDE_NONE }, 90 + [M_MB_6_1] = { "macbook61", 0x80010000, 2048 * 4, 1280, 800, OVERRIDE_NONE }, 91 + [M_MB_7_1] = { "macbook71", 0x80010000, 2048 * 4, 1280, 800, OVERRIDE_NONE }, 92 + [M_MBA] = { "mba", 0x80000000, 2048 * 4, 1280, 800, OVERRIDE_NONE }, 93 + /* 11" Macbook Air 3,1 passes the wrong stride */ 94 + [M_MBA_3] = { "mba3", 0, 2048 * 4, 0, 0, OVERRIDE_STRIDE }, 95 + [M_MBP] = { "mbp", 0x80010000, 1472 * 4, 1440, 900, OVERRIDE_NONE }, 96 + [M_MBP_2] = { "mbp2", 0, 0, 0, 0, OVERRIDE_NONE }, /* placeholder */ 97 + [M_MBP_2_2] = { "mbp22", 0x80010000, 1472 * 4, 1440, 900, OVERRIDE_NONE }, 98 + [M_MBP_SR] = { "mbp3", 0x80030000, 2048 * 4, 1440, 900, OVERRIDE_NONE }, 99 + [M_MBP_4] = { "mbp4", 0xc0060000, 2048 * 4, 1920, 1200, OVERRIDE_NONE }, 100 + [M_MBP_5_1] = { "mbp51", 0xc0010000, 2048 * 4, 1440, 900, OVERRIDE_NONE }, 101 + [M_MBP_5_2] = { "mbp52", 0xc0010000, 2048 * 4, 1920, 1200, OVERRIDE_NONE }, 102 + [M_MBP_5_3] = { "mbp53", 0xd0010000, 2048 * 4, 1440, 900, OVERRIDE_NONE }, 103 + [M_MBP_6_1] = { "mbp61", 0x90030000, 2048 * 4, 1920, 1200, OVERRIDE_NONE }, 104 + [M_MBP_6_2] = { "mbp62", 0x90030000, 2048 * 4, 1680, 1050, OVERRIDE_NONE }, 105 + [M_MBP_7_1] = { "mbp71", 0xc0010000, 2048 * 4, 1280, 800, OVERRIDE_NONE }, 106 + [M_MBP_8_2] = { "mbp82", 0x90010000, 1472 * 4, 1440, 900, OVERRIDE_NONE }, 107 + [M_UNKNOWN] = { NULL, 0, 0, 0, 0, OVERRIDE_NONE } 112 108 }; 113 109 114 110 static int set_system(const struct dmi_system_id *id); ··· 150 138 EFIFB_DMI_SYSTEM_ID("Apple Inc.", "MacBook6,1", M_MB_6_1), 151 139 EFIFB_DMI_SYSTEM_ID("Apple Inc.", "MacBook7,1", M_MB_7_1), 152 140 EFIFB_DMI_SYSTEM_ID("Apple Inc.", "MacBookAir1,1", M_MBA), 141 + EFIFB_DMI_SYSTEM_ID("Apple Inc.", "MacBookAir3,1", M_MBA_3), 153 142 EFIFB_DMI_SYSTEM_ID("Apple Computer, Inc.", "MacBookPro1,1", M_MBP), 154 143 EFIFB_DMI_SYSTEM_ID("Apple Computer, Inc.", "MacBookPro2,1", M_MBP_2), 155 144 EFIFB_DMI_SYSTEM_ID("Apple Computer, Inc.", "MacBookPro2,2", M_MBP_2_2), ··· 164 151 EFIFB_DMI_SYSTEM_ID("Apple Inc.", "MacBookPro6,1", M_MBP_6_1), 165 152 EFIFB_DMI_SYSTEM_ID("Apple Inc.", "MacBookPro6,2", M_MBP_6_2), 166 153 EFIFB_DMI_SYSTEM_ID("Apple Inc.", "MacBookPro7,1", M_MBP_7_1), 154 + EFIFB_DMI_SYSTEM_ID("Apple Inc.", "MacBookPro8,2", M_MBP_8_2), 167 155 {}, 168 156 }; 157 + 158 + #define choose_value(dmivalue, fwvalue, field, flags) ({ \ 159 + typeof(fwvalue) _ret_ = fwvalue; \ 160 + if ((flags) & (field)) \ 161 + _ret_ = dmivalue; \ 162 + else if ((fwvalue) == 0) \ 163 + _ret_ = dmivalue; \ 164 + _ret_; \ 165 + }) 169 166 170 167 static int set_system(const struct dmi_system_id *id) 171 168 { 172 169 struct efifb_dmi_info *info = id->driver_data; 173 - if (info->base == 0) 174 - return 0; 175 170 176 - printk(KERN_INFO "efifb: dmi detected %s - framebuffer at %p " 177 - "(%dx%d, stride %d)\n", id->ident, 178 - (void *)info->base, info->width, info->height, 179 - info->stride); 171 + if (info->base == 0 && info->height == 0 && info->width == 0 172 + && info->stride == 0) 173 + return 0; 180 174 181 175 /* Trust the bootloader over the DMI tables */ 182 176 if (screen_info.lfb_base == 0) { ··· 191 171 struct pci_dev *dev = NULL; 192 172 int found_bar = 0; 193 173 #endif 194 - screen_info.lfb_base = info->base; 174 + if (info->base) { 175 + screen_info.lfb_base = choose_value(info->base, 176 + screen_info.lfb_base, OVERRIDE_BASE, 177 + info->flags); 195 178 196 179 #if defined(CONFIG_PCI) 197 - /* make sure that the address in the table is actually on a 198 - * VGA device's PCI BAR */ 180 + /* make sure that the address in the table is actually 181 + * on a VGA device's PCI BAR */ 199 182 200 - for_each_pci_dev(dev) { 201 - int i; 202 - if ((dev->class >> 8) != PCI_CLASS_DISPLAY_VGA) 203 - continue; 204 - for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) { 205 - resource_size_t start, end; 183 + for_each_pci_dev(dev) { 184 + int i; 185 + if ((dev->class >> 8) != PCI_CLASS_DISPLAY_VGA) 186 + continue; 187 + for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) { 188 + resource_size_t start, end; 206 189 207 - start = pci_resource_start(dev, i); 208 - if (start == 0) 209 - break; 210 - end = pci_resource_end(dev, i); 211 - if (screen_info.lfb_base >= start && 212 - screen_info.lfb_base < end) { 213 - found_bar = 1; 190 + start = pci_resource_start(dev, i); 191 + if (start == 0) 192 + break; 193 + end = pci_resource_end(dev, i); 194 + if (screen_info.lfb_base >= start && 195 + screen_info.lfb_base < end) { 196 + found_bar = 1; 197 + } 214 198 } 215 199 } 216 - } 217 - if (!found_bar) 218 - screen_info.lfb_base = 0; 200 + if (!found_bar) 201 + screen_info.lfb_base = 0; 219 202 #endif 203 + } 220 204 } 221 205 if (screen_info.lfb_base) { 222 - if (screen_info.lfb_linelength == 0) 223 - screen_info.lfb_linelength = info->stride; 224 - if (screen_info.lfb_width == 0) 225 - screen_info.lfb_width = info->width; 226 - if (screen_info.lfb_height == 0) 227 - screen_info.lfb_height = info->height; 206 + screen_info.lfb_linelength = choose_value(info->stride, 207 + screen_info.lfb_linelength, OVERRIDE_STRIDE, 208 + info->flags); 209 + screen_info.lfb_width = choose_value(info->width, 210 + screen_info.lfb_width, OVERRIDE_WIDTH, 211 + info->flags); 212 + screen_info.lfb_height = choose_value(info->height, 213 + screen_info.lfb_height, OVERRIDE_HEIGHT, 214 + info->flags); 228 215 if (screen_info.orig_video_isVGA == 0) 229 216 screen_info.orig_video_isVGA = VIDEO_TYPE_EFI; 230 217 } else { ··· 241 214 screen_info.orig_video_isVGA = 0; 242 215 return 0; 243 216 } 217 + 218 + printk(KERN_INFO "efifb: dmi detected %s - framebuffer at %p " 219 + "(%dx%d, stride %d)\n", id->ident, 220 + (void *)screen_info.lfb_base, screen_info.lfb_width, 221 + screen_info.lfb_height, screen_info.lfb_linelength); 222 + 223 + 244 224 return 1; 245 225 } 246 226
+1 -1
drivers/video/fbmem.c
··· 1507 1507 (primary && gen_aper && gen_aper->count && 1508 1508 gen_aper->ranges[0].base == VGA_FB_PHYS)) { 1509 1509 1510 - printk(KERN_ERR "fb: conflicting fb hw usage " 1510 + printk(KERN_INFO "fb: conflicting fb hw usage " 1511 1511 "%s vs %s - removing generic driver\n", 1512 1512 name, registered_fb[i]->fix.id); 1513 1513 unregister_framebuffer(registered_fb[i]);
+5 -3
drivers/video/s3c-fb.c
··· 48 48 #undef writel 49 49 #define writel(v, r) do { \ 50 50 printk(KERN_DEBUG "%s: %08x => %p\n", __func__, (unsigned int)v, r); \ 51 - __raw_writel(v, r); } while(0) 51 + __raw_writel(v, r); } while (0) 52 52 #endif /* FB_S3C_DEBUG_REGWRITE */ 53 53 54 54 /* irq_flags bits */ ··· 518 518 519 519 data = VIDTCON2_LINEVAL(var->yres - 1) | 520 520 VIDTCON2_HOZVAL(var->xres - 1); 521 - writel(data, regs +sfb->variant.vidtcon + 8 ); 521 + writel(data, regs + sfb->variant.vidtcon + 8); 522 522 } 523 523 524 524 /* write the buffer address */ ··· 1304 1304 1305 1305 static int __devinit s3c_fb_probe(struct platform_device *pdev) 1306 1306 { 1307 + const struct platform_device_id *platid; 1307 1308 struct s3c_fb_driverdata *fbdrv; 1308 1309 struct device *dev = &pdev->dev; 1309 1310 struct s3c_fb_platdata *pd; ··· 1313 1312 int win; 1314 1313 int ret = 0; 1315 1314 1316 - fbdrv = (struct s3c_fb_driverdata *)platform_get_device_id(pdev)->driver_data; 1315 + platid = platform_get_device_id(pdev); 1316 + fbdrv = (struct s3c_fb_driverdata *)platid->driver_data; 1317 1317 1318 1318 if (fbdrv->variant.nr_windows > S3C_FB_MAX_WIN) { 1319 1319 dev_err(dev, "too many windows, cannot attach\n");
+34 -14
drivers/video/s3fb.c
··· 71 71 72 72 static const char * const s3_names[] = {"S3 Unknown", "S3 Trio32", "S3 Trio64", "S3 Trio64V+", 73 73 "S3 Trio64UV+", "S3 Trio64V2/DX", "S3 Trio64V2/GX", 74 - "S3 Plato/PX", "S3 Aurora64VP", "S3 Virge", 74 + "S3 Plato/PX", "S3 Aurora64V+", "S3 Virge", 75 75 "S3 Virge/VX", "S3 Virge/DX", "S3 Virge/GX", 76 - "S3 Virge/GX2", "S3 Virge/GX2P", "S3 Virge/GX2P", 76 + "S3 Virge/GX2", "S3 Virge/GX2+", "", 77 77 "S3 Trio3D/1X", "S3 Trio3D/2X", "S3 Trio3D/2X", 78 78 "S3 Trio3D"}; 79 79 ··· 90 90 #define CHIP_988_VIRGE_VX 0x0A 91 91 #define CHIP_375_VIRGE_DX 0x0B 92 92 #define CHIP_385_VIRGE_GX 0x0C 93 - #define CHIP_356_VIRGE_GX2 0x0D 94 - #define CHIP_357_VIRGE_GX2P 0x0E 95 - #define CHIP_359_VIRGE_GX2P 0x0F 93 + #define CHIP_357_VIRGE_GX2 0x0D 94 + #define CHIP_359_VIRGE_GX2P 0x0E 96 95 #define CHIP_360_TRIO3D_1X 0x10 97 96 #define CHIP_362_TRIO3D_2X 0x11 98 97 #define CHIP_368_TRIO3D_2X 0x12 ··· 358 359 vga_w(par->state.vgabase, VGA_MIS_W, regval | VGA_MIS_ENB_PLL_LOAD); 359 360 360 361 /* Set S3 clock registers */ 361 - if (par->chip == CHIP_360_TRIO3D_1X || 362 + if (par->chip == CHIP_357_VIRGE_GX2 || 363 + par->chip == CHIP_359_VIRGE_GX2P || 364 + par->chip == CHIP_360_TRIO3D_1X || 362 365 par->chip == CHIP_362_TRIO3D_2X || 363 366 par->chip == CHIP_368_TRIO3D_2X) { 364 367 vga_wseq(par->state.vgabase, 0x12, (n - 2) | ((r & 3) << 6)); /* n and two bits of r */ ··· 561 560 pr_debug("fb%d: offset register : %d\n", info->node, offset_value); 562 561 svga_wcrt_multi(par->state.vgabase, s3_offset_regs, offset_value); 563 562 564 - if (par->chip != CHIP_360_TRIO3D_1X && 563 + if (par->chip != CHIP_357_VIRGE_GX2 && 564 + par->chip != CHIP_359_VIRGE_GX2P && 565 + par->chip != CHIP_360_TRIO3D_1X && 565 566 par->chip != CHIP_362_TRIO3D_2X && 566 567 par->chip != CHIP_368_TRIO3D_2X) { 567 568 vga_wcrt(par->state.vgabase, 0x54, 0x18); /* M parameter */ ··· 607 604 vga_wcrt(par->state.vgabase, 0x66, 0x90); 608 605 } 609 606 610 - if (par->chip == CHIP_360_TRIO3D_1X || 607 + if (par->chip == CHIP_357_VIRGE_GX2 || 608 + par->chip == CHIP_359_VIRGE_GX2P || 609 + par->chip == CHIP_360_TRIO3D_1X || 611 610 par->chip == CHIP_362_TRIO3D_2X || 612 611 par->chip == CHIP_368_TRIO3D_2X || 613 612 par->chip == CHIP_365_TRIO3D || ··· 622 617 vga_wcrt(par->state.vgabase, 0x66, 0x81); 623 618 } 624 619 625 - if (par->chip == CHIP_356_VIRGE_GX2 || 626 - par->chip == CHIP_357_VIRGE_GX2P || 620 + if (par->chip == CHIP_357_VIRGE_GX2 || 627 621 par->chip == CHIP_359_VIRGE_GX2P || 628 622 par->chip == CHIP_360_TRIO3D_1X || 629 623 par->chip == CHIP_362_TRIO3D_2X || ··· 678 674 pr_debug("fb%d: 8 bit pseudocolor\n", info->node); 679 675 svga_wcrt_mask(par->state.vgabase, 0x50, 0x00, 0x30); 680 676 if (info->var.pixclock > 20000 || 677 + par->chip == CHIP_357_VIRGE_GX2 || 678 + par->chip == CHIP_359_VIRGE_GX2P || 681 679 par->chip == CHIP_360_TRIO3D_1X || 682 680 par->chip == CHIP_362_TRIO3D_2X || 683 681 par->chip == CHIP_368_TRIO3D_2X) ··· 708 702 } else { 709 703 svga_wcrt_mask(par->state.vgabase, 0x50, 0x10, 0x30); 710 704 svga_wcrt_mask(par->state.vgabase, 0x67, 0x30, 0xF0); 711 - if (par->chip != CHIP_360_TRIO3D_1X && 705 + if (par->chip != CHIP_357_VIRGE_GX2 && 706 + par->chip != CHIP_359_VIRGE_GX2P && 707 + par->chip != CHIP_360_TRIO3D_1X && 712 708 par->chip != CHIP_362_TRIO3D_2X && 713 709 par->chip != CHIP_368_TRIO3D_2X) 714 710 hmul = 2; ··· 735 727 } else { 736 728 svga_wcrt_mask(par->state.vgabase, 0x50, 0x10, 0x30); 737 729 svga_wcrt_mask(par->state.vgabase, 0x67, 0x50, 0xF0); 738 - if (par->chip != CHIP_360_TRIO3D_1X && 730 + if (par->chip != CHIP_357_VIRGE_GX2 && 731 + par->chip != CHIP_359_VIRGE_GX2P && 732 + par->chip != CHIP_360_TRIO3D_1X && 739 733 par->chip != CHIP_362_TRIO3D_2X && 740 734 par->chip != CHIP_368_TRIO3D_2X) 741 735 hmul = 2; ··· 1079 1069 info->screen_size = 2 << 20; 1080 1070 break; 1081 1071 } 1072 + } else if (par->chip == CHIP_357_VIRGE_GX2 || 1073 + par->chip == CHIP_359_VIRGE_GX2P) { 1074 + switch ((regval & 0xC0) >> 6) { 1075 + case 1: /* 4MB */ 1076 + info->screen_size = 4 << 20; 1077 + break; 1078 + case 3: /* 2MB */ 1079 + info->screen_size = 2 << 20; 1080 + break; 1081 + } 1082 1082 } else 1083 1083 info->screen_size = s3_memsizes[regval >> 5] << 10; 1084 1084 info->fix.smem_len = info->screen_size; ··· 1288 1268 {PCI_DEVICE(PCI_VENDOR_ID_S3, 0x5631), .driver_data = CHIP_325_VIRGE}, 1289 1269 {PCI_DEVICE(PCI_VENDOR_ID_S3, 0x883D), .driver_data = CHIP_988_VIRGE_VX}, 1290 1270 {PCI_DEVICE(PCI_VENDOR_ID_S3, 0x8A01), .driver_data = CHIP_XXX_VIRGE_DXGX}, 1291 - {PCI_DEVICE(PCI_VENDOR_ID_S3, 0x8A10), .driver_data = CHIP_356_VIRGE_GX2}, 1292 - {PCI_DEVICE(PCI_VENDOR_ID_S3, 0x8A11), .driver_data = CHIP_357_VIRGE_GX2P}, 1271 + {PCI_DEVICE(PCI_VENDOR_ID_S3, 0x8A10), .driver_data = CHIP_357_VIRGE_GX2}, 1272 + {PCI_DEVICE(PCI_VENDOR_ID_S3, 0x8A11), .driver_data = CHIP_359_VIRGE_GX2P}, 1293 1273 {PCI_DEVICE(PCI_VENDOR_ID_S3, 0x8A12), .driver_data = CHIP_359_VIRGE_GX2P}, 1294 1274 {PCI_DEVICE(PCI_VENDOR_ID_S3, 0x8A13), .driver_data = CHIP_36X_TRIO3D_1X_2X}, 1295 1275 {PCI_DEVICE(PCI_VENDOR_ID_S3, 0x8904), .driver_data = CHIP_365_TRIO3D},
+6 -8
drivers/video/savage/savagefb-i2c.c
··· 159 159 else 160 160 dev_warn(&chan->par->pcidev->dev, 161 161 "Failed to register I2C bus %s.\n", name); 162 - } else 163 - chan->par = NULL; 162 + } 164 163 165 164 return rc; 166 165 } ··· 169 170 struct savagefb_par *par = info->par; 170 171 par->chan.par = par; 171 172 172 - switch(info->fix.accel) { 173 - case FB_ACCEL_PROSAVAGE_DDRK: 174 - case FB_ACCEL_PROSAVAGE_PM: 173 + switch (par->chip) { 174 + case S3_PROSAVAGE: 175 175 par->chan.reg = CR_SERIAL2; 176 176 par->chan.ioaddr = par->mmio.vbase; 177 177 par->chan.algo.setsda = prosavage_gpio_setsda; ··· 178 180 par->chan.algo.getsda = prosavage_gpio_getsda; 179 181 par->chan.algo.getscl = prosavage_gpio_getscl; 180 182 break; 181 - case FB_ACCEL_SAVAGE4: 183 + case S3_SAVAGE4: 182 184 par->chan.reg = CR_SERIAL1; 183 185 if (par->pcidev->revision > 1 && !(VGArCR(0xa6, par) & 0x40)) 184 186 par->chan.reg = CR_SERIAL2; ··· 188 190 par->chan.algo.getsda = prosavage_gpio_getsda; 189 191 par->chan.algo.getscl = prosavage_gpio_getscl; 190 192 break; 191 - case FB_ACCEL_SAVAGE2000: 192 - par->chan.reg = 0xff20; 193 + case S3_SAVAGE2000: 194 + par->chan.reg = MM_SERIAL1; 193 195 par->chan.ioaddr = par->mmio.vbase; 194 196 par->chan.algo.setsda = savage4_gpio_setsda; 195 197 par->chan.algo.setscl = savage4_gpio_setscl;
+48 -4
drivers/video/sh_mobile_lcdcfb.c
··· 643 643 continue; 644 644 645 645 board_cfg = &ch->cfg.board_cfg; 646 - if (try_module_get(board_cfg->owner) && board_cfg->display_on) { 646 + if (board_cfg->display_on && try_module_get(board_cfg->owner)) { 647 647 board_cfg->display_on(board_cfg->board_data, ch->info); 648 648 module_put(board_cfg->owner); 649 649 } ··· 688 688 } 689 689 690 690 board_cfg = &ch->cfg.board_cfg; 691 - if (try_module_get(board_cfg->owner) && board_cfg->display_off) { 691 + if (board_cfg->display_off && try_module_get(board_cfg->owner)) { 692 692 board_cfg->display_off(board_cfg->board_data); 693 693 module_put(board_cfg->owner); 694 694 } ··· 1032 1032 return 0; 1033 1033 } 1034 1034 1035 + /* 1036 + * Screen blanking. Behavior is as follows: 1037 + * FB_BLANK_UNBLANK: screen unblanked, clocks enabled 1038 + * FB_BLANK_NORMAL: screen blanked, clocks enabled 1039 + * FB_BLANK_VSYNC, 1040 + * FB_BLANK_HSYNC, 1041 + * FB_BLANK_POWEROFF: screen blanked, clocks disabled 1042 + */ 1043 + static int sh_mobile_lcdc_blank(int blank, struct fb_info *info) 1044 + { 1045 + struct sh_mobile_lcdc_chan *ch = info->par; 1046 + struct sh_mobile_lcdc_priv *p = ch->lcdc; 1047 + 1048 + /* blank the screen? */ 1049 + if (blank > FB_BLANK_UNBLANK && ch->blank_status == FB_BLANK_UNBLANK) { 1050 + struct fb_fillrect rect = { 1051 + .width = info->var.xres, 1052 + .height = info->var.yres, 1053 + }; 1054 + sh_mobile_lcdc_fillrect(info, &rect); 1055 + } 1056 + /* turn clocks on? */ 1057 + if (blank <= FB_BLANK_NORMAL && ch->blank_status > FB_BLANK_NORMAL) { 1058 + sh_mobile_lcdc_clk_on(p); 1059 + } 1060 + /* turn clocks off? */ 1061 + if (blank > FB_BLANK_NORMAL && ch->blank_status <= FB_BLANK_NORMAL) { 1062 + /* make sure the screen is updated with the black fill before 1063 + * switching the clocks off. one vsync is not enough since 1064 + * blanking may occur in the middle of a refresh. deferred io 1065 + * mode will reenable the clocks and update the screen in time, 1066 + * so it does not need this. */ 1067 + if (!info->fbdefio) { 1068 + sh_mobile_wait_for_vsync(info); 1069 + sh_mobile_wait_for_vsync(info); 1070 + } 1071 + sh_mobile_lcdc_clk_off(p); 1072 + } 1073 + 1074 + ch->blank_status = blank; 1075 + return 0; 1076 + } 1077 + 1035 1078 static struct fb_ops sh_mobile_lcdc_ops = { 1036 1079 .owner = THIS_MODULE, 1037 1080 .fb_setcolreg = sh_mobile_lcdc_setcolreg, ··· 1083 1040 .fb_fillrect = sh_mobile_lcdc_fillrect, 1084 1041 .fb_copyarea = sh_mobile_lcdc_copyarea, 1085 1042 .fb_imageblit = sh_mobile_lcdc_imageblit, 1043 + .fb_blank = sh_mobile_lcdc_blank, 1086 1044 .fb_pan_display = sh_mobile_fb_pan_display, 1087 1045 .fb_ioctl = sh_mobile_ioctl, 1088 1046 .fb_open = sh_mobile_open, ··· 1298 1254 1299 1255 switch(action) { 1300 1256 case FB_EVENT_SUSPEND: 1301 - if (try_module_get(board_cfg->owner) && board_cfg->display_off) { 1257 + if (board_cfg->display_off && try_module_get(board_cfg->owner)) { 1302 1258 board_cfg->display_off(board_cfg->board_data); 1303 1259 module_put(board_cfg->owner); 1304 1260 } ··· 1311 1267 mutex_unlock(&ch->open_lock); 1312 1268 1313 1269 /* HDMI must be enabled before LCDC configuration */ 1314 - if (try_module_get(board_cfg->owner) && board_cfg->display_on) { 1270 + if (board_cfg->display_on && try_module_get(board_cfg->owner)) { 1315 1271 board_cfg->display_on(board_cfg->board_data, info); 1316 1272 module_put(board_cfg->owner); 1317 1273 }
+1
drivers/video/sh_mobile_lcdcfb.h
··· 37 37 struct completion vsync_completion; 38 38 struct fb_var_screeninfo display_var; 39 39 int use_count; 40 + int blank_status; 40 41 struct mutex open_lock; /* protects the use counter */ 41 42 }; 42 43
-1
drivers/video/via/chip.h
··· 139 139 140 140 struct crt_setting_information { 141 141 int iga_path; 142 - int refresh_rate; 143 142 }; 144 143 145 144 struct tmds_setting_information {
+7 -10
drivers/video/via/hw.c
··· 2002 2002 int i; 2003 2003 int index = 0; 2004 2004 int h_addr, v_addr; 2005 - u32 pll_D_N, clock; 2005 + u32 pll_D_N, clock, refresh = viafb_refresh; 2006 + 2007 + if (viafb_SAMM_ON && set_iga == IGA2) 2008 + refresh = viafb_refresh1; 2006 2009 2007 2010 for (i = 0; i < video_mode->mode_array; i++) { 2008 2011 index = i; 2009 2012 2010 - if (crt_table[i].refresh_rate == viaparinfo-> 2011 - crt_setting_info->refresh_rate) 2013 + if (crt_table[i].refresh_rate == refresh) 2012 2014 break; 2013 2015 } 2014 2016 ··· 2021 2019 if ((viafb_LCD_ON | viafb_DVI_ON) 2022 2020 && video_mode->crtc[0].crtc.hor_addr == 640 2023 2021 && video_mode->crtc[0].crtc.ver_addr == 480 2024 - && viaparinfo->crt_setting_info->refresh_rate == 60) { 2022 + && refresh == 60) { 2025 2023 /* The border is 8 pixels. */ 2026 2024 crt_reg.hor_blank_start = crt_reg.hor_blank_start - 8; 2027 2025 ··· 2072 2070 init_lvds_chip_info(); 2073 2071 2074 2072 viaparinfo->crt_setting_info->iga_path = IGA1; 2075 - viaparinfo->crt_setting_info->refresh_rate = viafb_refresh; 2076 2073 2077 2074 /*Set IGA path for each device */ 2078 2075 viafb_set_iga_path(); ··· 2084 2083 viaparinfo->lvds_setting_info->lcd_mode; 2085 2084 } 2086 2085 2087 - void viafb_update_device_setting(int hres, int vres, 2088 - int bpp, int vmode_refresh, int flag) 2086 + void viafb_update_device_setting(int hres, int vres, int bpp, int flag) 2089 2087 { 2090 2088 if (flag == 0) { 2091 - viaparinfo->crt_setting_info->refresh_rate = 2092 - vmode_refresh; 2093 - 2094 2089 viaparinfo->tmds_setting_info->h_active = hres; 2095 2090 viaparinfo->tmds_setting_info->v_active = vres; 2096 2091
+1 -2
drivers/video/via/hw.h
··· 949 949 void __devinit viafb_init_dac(int set_iga); 950 950 int viafb_get_pixclock(int hres, int vres, int vmode_refresh); 951 951 int viafb_get_refresh(int hres, int vres, u32 float_refresh); 952 - void viafb_update_device_setting(int hres, int vres, int bpp, 953 - int vmode_refresh, int flag); 952 + void viafb_update_device_setting(int hres, int vres, int bpp, int flag); 954 953 955 954 void viafb_set_iga_path(void); 956 955 void viafb_set_primary_color_register(u8 index, u8 red, u8 green, u8 blue);
+38 -36
drivers/video/via/viafbdev.c
··· 182 182 return 0; 183 183 } 184 184 185 + static inline int get_var_refresh(struct fb_var_screeninfo *var) 186 + { 187 + u32 htotal, vtotal; 188 + 189 + htotal = var->left_margin + var->xres + var->right_margin 190 + + var->hsync_len; 191 + vtotal = var->upper_margin + var->yres + var->lower_margin 192 + + var->vsync_len; 193 + return PICOS2KHZ(var->pixclock) * 1000 / (htotal * vtotal); 194 + } 195 + 185 196 static int viafb_check_var(struct fb_var_screeninfo *var, 186 197 struct fb_info *info) 187 198 { 188 - int htotal, vtotal, depth; 199 + int depth, refresh; 189 200 struct VideoModeTable *vmode_entry; 190 201 struct viafb_par *ppar = info->par; 191 - u32 long_refresh, line; 202 + u32 line; 192 203 193 204 DEBUG_MSG(KERN_INFO "viafb_check_var!\n"); 194 205 /* Sanity check */ ··· 242 231 /* Based on var passed in to calculate the refresh, 243 232 * because our driver use some modes special. 244 233 */ 245 - htotal = var->xres + var->left_margin + 246 - var->right_margin + var->hsync_len; 247 - vtotal = var->yres + var->upper_margin + 248 - var->lower_margin + var->vsync_len; 249 - long_refresh = 1000000000UL / var->pixclock * 1000; 250 - long_refresh /= (htotal * vtotal); 251 - 252 - viafb_refresh = viafb_get_refresh(var->xres, var->yres, long_refresh); 234 + refresh = viafb_get_refresh(var->xres, var->yres, 235 + get_var_refresh(var)); 253 236 254 237 /* Adjust var according to our driver's own table */ 255 - viafb_fill_var_timing_info(var, viafb_refresh, vmode_entry); 238 + viafb_fill_var_timing_info(var, refresh, vmode_entry); 256 239 if (var->accel_flags & FB_ACCELF_TEXT && 257 240 !ppar->shared->vdev->engine_mmio) 258 241 var->accel_flags = 0; ··· 258 253 { 259 254 struct viafb_par *viapar = info->par; 260 255 struct VideoModeTable *vmode_entry, *vmode_entry1 = NULL; 256 + int refresh; 261 257 DEBUG_MSG(KERN_INFO "viafb_set_par!\n"); 262 258 263 259 viafb_update_fix(info); 264 260 viapar->depth = fb_get_color_depth(&info->var, &info->fix); 265 261 viafb_update_device_setting(viafbinfo->var.xres, viafbinfo->var.yres, 266 - viafbinfo->var.bits_per_pixel, viafb_refresh, 0); 262 + viafbinfo->var.bits_per_pixel, 0); 267 263 268 264 vmode_entry = viafb_get_mode(viafbinfo->var.xres, viafbinfo->var.yres); 269 265 if (viafb_dual_fb) { ··· 272 266 viafbinfo1->var.yres); 273 267 viafb_update_device_setting(viafbinfo1->var.xres, 274 268 viafbinfo1->var.yres, viafbinfo1->var.bits_per_pixel, 275 - viafb_refresh1, 1); 269 + 1); 276 270 } else if (viafb_SAMM_ON == 1) { 277 271 DEBUG_MSG(KERN_INFO 278 272 "viafb_second_xres = %d, viafb_second_yres = %d, bpp = %d\n", ··· 281 275 viafb_second_yres); 282 276 283 277 viafb_update_device_setting(viafb_second_xres, 284 - viafb_second_yres, viafb_bpp1, viafb_refresh1, 1); 278 + viafb_second_yres, viafb_bpp1, 1); 285 279 } 286 280 281 + refresh = viafb_get_refresh(info->var.xres, info->var.yres, 282 + get_var_refresh(&info->var)); 287 283 if (vmode_entry) { 288 - if (viafb_dual_fb && viapar->iga_path == IGA2) 284 + if (viafb_dual_fb && viapar->iga_path == IGA2) { 289 285 viafb_bpp1 = info->var.bits_per_pixel; 290 - else 286 + viafb_refresh1 = refresh; 287 + } else { 291 288 viafb_bpp = info->var.bits_per_pixel; 289 + viafb_refresh = refresh; 290 + } 292 291 293 292 if (info->var.accel_flags & FB_ACCELF_TEXT) 294 293 info->flags &= ~FBINFO_HWACCEL_DISABLED; ··· 1806 1795 default_var.xres_virtual = default_xres; 1807 1796 default_var.yres_virtual = default_yres; 1808 1797 default_var.bits_per_pixel = viafb_bpp; 1809 - default_var.pixclock = 1810 - viafb_get_pixclock(default_xres, default_yres, viafb_refresh); 1811 - default_var.left_margin = (default_xres >> 3) & 0xf8; 1812 - default_var.right_margin = 32; 1813 - default_var.upper_margin = 16; 1814 - default_var.lower_margin = 4; 1815 - default_var.hsync_len = default_var.left_margin; 1816 - default_var.vsync_len = 4; 1798 + viafb_fill_var_timing_info(&default_var, viafb_get_refresh( 1799 + default_var.xres, default_var.yres, viafb_refresh), 1800 + viafb_get_mode(default_var.xres, default_var.yres)); 1817 1801 viafb_setup_fixinfo(&viafbinfo->fix, viaparinfo); 1818 1802 viafbinfo->var = default_var; 1819 1803 ··· 1847 1841 default_var.xres_virtual = viafb_second_virtual_xres; 1848 1842 default_var.yres_virtual = viafb_second_virtual_yres; 1849 1843 default_var.bits_per_pixel = viafb_bpp1; 1850 - default_var.pixclock = 1851 - viafb_get_pixclock(viafb_second_xres, viafb_second_yres, 1852 - viafb_refresh); 1853 - default_var.left_margin = (viafb_second_xres >> 3) & 0xf8; 1854 - default_var.right_margin = 32; 1855 - default_var.upper_margin = 16; 1856 - default_var.lower_margin = 4; 1857 - default_var.hsync_len = default_var.left_margin; 1858 - default_var.vsync_len = 4; 1844 + viafb_fill_var_timing_info(&default_var, viafb_get_refresh( 1845 + default_var.xres, default_var.yres, viafb_refresh1), 1846 + viafb_get_mode(default_var.xres, default_var.yres)); 1859 1847 1860 1848 viafb_setup_fixinfo(&viafbinfo1->fix, viaparinfo1); 1861 1849 viafb_check_var(&default_var, viafbinfo1); ··· 2004 2004 */ 2005 2005 int __init viafb_init(void) 2006 2006 { 2007 - u32 dummy; 2007 + u32 dummy_x, dummy_y; 2008 2008 #ifndef MODULE 2009 2009 char *option = NULL; 2010 2010 if (fb_get_options("viafb", &option)) 2011 2011 return -ENODEV; 2012 2012 viafb_setup(option); 2013 2013 #endif 2014 - if (parse_mode(viafb_mode, &dummy, &dummy) 2015 - || parse_mode(viafb_mode1, &dummy, &dummy) 2014 + if (parse_mode(viafb_mode, &dummy_x, &dummy_y) 2015 + || !viafb_get_mode(dummy_x, dummy_y) 2016 + || parse_mode(viafb_mode1, &dummy_x, &dummy_y) 2017 + || !viafb_get_mode(dummy_x, dummy_y) 2016 2018 || viafb_bpp < 0 || viafb_bpp > 32 2017 2019 || viafb_bpp1 < 0 || viafb_bpp1 > 32 2018 2020 || parse_active_dev())