Lines Matching +full:wake +full:- +full:on +full:- +full:motion

2  * Silicon Motion SM7XX frame buffer device
4 * Copyright (C) 2006 Silicon Motion Technology Corp.
18 * Framebuffer driver for Silicon Motion SM710, SM712, SM721 and SM722 chips
75 .height = -1,
76 .width = -1,
889 chan >>= 16 - bf->length; in chan_to_field()
890 return chan << bf->offset; in chan_to_field()
895 struct smtcfb_info *sfb = info->par; in smtc_blank()
900 /* Screen On: HSync: On, VSync : On */ in smtc_blank()
902 switch (sfb->chip_id) { in smtc_blank()
922 /* Screen Off: HSync: On, VSync : On Soft blank */ in smtc_blank()
932 /* Screen On: HSync: On, VSync : Off */ in smtc_blank()
945 /* Screen On: HSync: Off, VSync : On */ in smtc_blank()
958 /* Screen On: HSync: Off, VSync : Off */ in smtc_blank()
971 return -EINVAL; in smtc_blank()
984 sfb = info->par; in smtc_setcolreg()
989 switch (sfb->fb->fix.visual) { in smtc_setcolreg()
993 * 16/32 bit true-colour, use pseudo-palette for 16 base color in smtc_setcolreg()
997 if (sfb->fb->var.bits_per_pixel == 16) { in smtc_setcolreg()
998 u32 *pal = sfb->fb->pseudo_palette; in smtc_setcolreg()
1000 val = chan_to_field(red, &sfb->fb->var.red); in smtc_setcolreg()
1001 val |= chan_to_field(green, &sfb->fb->var.green); in smtc_setcolreg()
1002 val |= chan_to_field(blue, &sfb->fb->var.blue); in smtc_setcolreg()
1005 u32 *pal = sfb->fb->pseudo_palette; in smtc_setcolreg()
1007 val = chan_to_field(red, &sfb->fb->var.red); in smtc_setcolreg()
1008 val |= chan_to_field(green, &sfb->fb->var.green); in smtc_setcolreg()
1009 val |= chan_to_field(blue, &sfb->fb->var.blue); in smtc_setcolreg()
1036 if (!info->screen_base) in smtcfb_read()
1037 return -ENODEV; in smtcfb_read()
1039 total_size = info->screen_size; in smtcfb_read()
1042 total_size = info->fix.smem_len; in smtcfb_read()
1051 count = total_size - p; in smtcfb_read()
1055 return -ENOMEM; in smtcfb_read()
1057 src = (u32 __iomem *)(info->screen_base + p); in smtcfb_read()
1059 if (info->fbops->fb_sync) in smtcfb_read()
1060 info->fbops->fb_sync(info); in smtcfb_read()
1065 for (i = (c + 3) >> 2; i--;) { in smtcfb_read()
1075 err = -EFAULT; in smtcfb_read()
1081 count -= c; in smtcfb_read()
1099 if (!info->screen_base) in smtcfb_write()
1100 return -ENODEV; in smtcfb_write()
1102 total_size = info->screen_size; in smtcfb_write()
1105 total_size = info->fix.smem_len; in smtcfb_write()
1108 return -EFBIG; in smtcfb_write()
1111 err = -EFBIG; in smtcfb_write()
1117 err = -ENOSPC; in smtcfb_write()
1119 count = total_size - p; in smtcfb_write()
1124 return -ENOMEM; in smtcfb_write()
1126 dst = (u32 __iomem *)(info->screen_base + p); in smtcfb_write()
1128 if (info->fbops->fb_sync) in smtcfb_write()
1129 info->fbops->fb_sync(info); in smtcfb_write()
1136 err = -EFAULT; in smtcfb_write()
1140 for (i = (c + 3) >> 2; i--;) { in smtcfb_write()
1149 count -= c; in smtcfb_write()
1162 dev_dbg(&sfb->pdev->dev, in sm7xx_set_timing()
1163 "sfb->width=%d sfb->height=%d sfb->fb->var.bits_per_pixel=%d sfb->hz=%d\n", in sm7xx_set_timing()
1164 sfb->width, sfb->height, sfb->fb->var.bits_per_pixel, sfb->hz); in sm7xx_set_timing()
1167 if (vgamode[j].mmsizex != sfb->width || in sm7xx_set_timing()
1168 vgamode[j].mmsizey != sfb->height || in sm7xx_set_timing()
1169 vgamode[j].bpp != sfb->fb->var.bits_per_pixel || in sm7xx_set_timing()
1170 vgamode[j].hz != sfb->hz) in sm7xx_set_timing()
1173 dev_dbg(&sfb->pdev->dev, in sm7xx_set_timing()
1178 dev_dbg(&sfb->pdev->dev, "vgamode index=%d\n", j); in sm7xx_set_timing()
1186 /* init SEQ register SR00 - SR04 */ in sm7xx_set_timing()
1190 /* init SEQ register SR10 - SR24 */ in sm7xx_set_timing()
1194 /* init SEQ register SR30 - SR75 */ in sm7xx_set_timing()
1203 /* init SEQ register SR80 - SR93 */ in sm7xx_set_timing()
1207 /* init SEQ register SRA0 - SRAF */ in sm7xx_set_timing()
1211 /* init Graphic register GR00 - GR08 */ in sm7xx_set_timing()
1215 /* init Attribute register AR00 - AR14 */ in sm7xx_set_timing()
1219 /* init CRTC register CR00 - CR18 */ in sm7xx_set_timing()
1223 /* init CRTC register CR30 - CR4D */ in sm7xx_set_timing()
1226 /* side-effect, don't write to CR3B-CR3F */ in sm7xx_set_timing()
1231 /* init CRTC register CR90 - CRA7 */ in sm7xx_set_timing()
1238 writel(0x0, sfb->vp_regs + 0x0C); in sm7xx_set_timing()
1239 writel(0x0, sfb->vp_regs + 0x40); in sm7xx_set_timing()
1242 m_nscreenstride = (sfb->width * sfb->fb->var.bits_per_pixel) / 64; in sm7xx_set_timing()
1243 switch (sfb->fb->var.bits_per_pixel) { in sm7xx_set_timing()
1245 writel(0x0, sfb->vp_regs + 0x0); in sm7xx_set_timing()
1248 writel(0x00020000, sfb->vp_regs + 0x0); in sm7xx_set_timing()
1251 writel(0x00040000, sfb->vp_regs + 0x0); in sm7xx_set_timing()
1254 writel(0x00030000, sfb->vp_regs + 0x0); in sm7xx_set_timing()
1258 sfb->vp_regs + 0x10); in sm7xx_set_timing()
1263 switch (sfb->chip_id) { in smtc_set_timing()
1274 switch (sfb->fb->var.bits_per_pixel) { in smtcfb_setmode()
1276 sfb->fb->fix.visual = FB_VISUAL_TRUECOLOR; in smtcfb_setmode()
1277 sfb->fb->fix.line_length = sfb->fb->var.xres * 4; in smtcfb_setmode()
1278 sfb->fb->var.red.length = 8; in smtcfb_setmode()
1279 sfb->fb->var.green.length = 8; in smtcfb_setmode()
1280 sfb->fb->var.blue.length = 8; in smtcfb_setmode()
1281 sfb->fb->var.red.offset = 16; in smtcfb_setmode()
1282 sfb->fb->var.green.offset = 8; in smtcfb_setmode()
1283 sfb->fb->var.blue.offset = 0; in smtcfb_setmode()
1286 sfb->fb->fix.visual = FB_VISUAL_TRUECOLOR; in smtcfb_setmode()
1287 sfb->fb->fix.line_length = sfb->fb->var.xres * 3; in smtcfb_setmode()
1288 sfb->fb->var.red.length = 8; in smtcfb_setmode()
1289 sfb->fb->var.green.length = 8; in smtcfb_setmode()
1290 sfb->fb->var.blue.length = 8; in smtcfb_setmode()
1291 sfb->fb->var.red.offset = 16; in smtcfb_setmode()
1292 sfb->fb->var.green.offset = 8; in smtcfb_setmode()
1293 sfb->fb->var.blue.offset = 0; in smtcfb_setmode()
1296 sfb->fb->fix.visual = FB_VISUAL_PSEUDOCOLOR; in smtcfb_setmode()
1297 sfb->fb->fix.line_length = sfb->fb->var.xres; in smtcfb_setmode()
1298 sfb->fb->var.red.length = 3; in smtcfb_setmode()
1299 sfb->fb->var.green.length = 3; in smtcfb_setmode()
1300 sfb->fb->var.blue.length = 2; in smtcfb_setmode()
1301 sfb->fb->var.red.offset = 5; in smtcfb_setmode()
1302 sfb->fb->var.green.offset = 2; in smtcfb_setmode()
1303 sfb->fb->var.blue.offset = 0; in smtcfb_setmode()
1307 sfb->fb->fix.visual = FB_VISUAL_TRUECOLOR; in smtcfb_setmode()
1308 sfb->fb->fix.line_length = sfb->fb->var.xres * 2; in smtcfb_setmode()
1309 sfb->fb->var.red.length = 5; in smtcfb_setmode()
1310 sfb->fb->var.green.length = 6; in smtcfb_setmode()
1311 sfb->fb->var.blue.length = 5; in smtcfb_setmode()
1312 sfb->fb->var.red.offset = 11; in smtcfb_setmode()
1313 sfb->fb->var.green.offset = 5; in smtcfb_setmode()
1314 sfb->fb->var.blue.offset = 0; in smtcfb_setmode()
1318 sfb->width = sfb->fb->var.xres; in smtcfb_setmode()
1319 sfb->height = sfb->fb->var.yres; in smtcfb_setmode()
1320 sfb->hz = 60; in smtcfb_setmode()
1327 if (var->xres_virtual < var->xres) in smtc_check_var()
1328 var->xres_virtual = var->xres; in smtc_check_var()
1330 if (var->yres_virtual < var->yres) in smtc_check_var()
1331 var->yres_virtual = var->yres; in smtc_check_var()
1334 if ((var->bits_per_pixel != 8) && (var->bits_per_pixel != 16) && in smtc_check_var()
1335 (var->bits_per_pixel != 24) && (var->bits_per_pixel != 32)) in smtc_check_var()
1336 var->bits_per_pixel = 16; in smtc_check_var()
1343 smtcfb_setmode(info->par); in smtc_set_par()
1377 sfb->fb->fix.smem_start = pci_resource_start(pdev, 0); in smtc_map_smem()
1379 if (sfb->chip_id == 0x720) in smtc_map_smem()
1380 /* on SM720, the framebuffer starts at the 1 MB offset */ in smtc_map_smem()
1381 sfb->fb->fix.smem_start += 0x00200000; in smtc_map_smem()
1383 /* XXX: is it safe for SM720 on Big-Endian? */ in smtc_map_smem()
1384 if (sfb->fb->var.bits_per_pixel == 32) in smtc_map_smem()
1385 sfb->fb->fix.smem_start += big_addr; in smtc_map_smem()
1387 sfb->fb->fix.smem_len = smem_len; in smtc_map_smem()
1389 sfb->fb->screen_base = sfb->lfb; in smtc_map_smem()
1391 if (!sfb->fb->screen_base) { in smtc_map_smem()
1392 dev_err(&pdev->dev, in smtc_map_smem()
1393 "%s: unable to map screen memory\n", sfb->fb->fix.id); in smtc_map_smem()
1394 return -ENOMEM; in smtc_map_smem()
1406 if (sfb && sfb->fb->screen_base) { in smtc_unmap_smem()
1407 if (sfb->chip_id == 0x720) in smtc_unmap_smem()
1408 sfb->fb->screen_base -= 0x00200000; in smtc_unmap_smem()
1409 iounmap(sfb->fb->screen_base); in smtc_unmap_smem()
1410 sfb->fb->screen_base = NULL; in smtc_unmap_smem()
1415 * We need to wake up the device and make sure its in linear memory mode.
1427 switch (sfb->chip_id) { in sm7xx_vram_probe()
1433 * FIXME: SM712 can have 2MB VRAM, which is used on earlier in sm7xx_vram_probe()
1435 * probably crash on those machines. If anyone gets one of in sm7xx_vram_probe()
1437 * an E-mail. in sm7xx_vram_probe()
1460 sfb->fb->var.xres = smtc_scr_info.lfb_width; in sm7xx_resolution_probe()
1461 sfb->fb->var.yres = smtc_scr_info.lfb_height; in sm7xx_resolution_probe()
1462 sfb->fb->var.bits_per_pixel = smtc_scr_info.lfb_depth; in sm7xx_resolution_probe()
1467 * No parameter, default resolution is 1024x768-16. in sm7xx_resolution_probe()
1472 sfb->fb->var.xres = SCREEN_X_RES; in sm7xx_resolution_probe()
1473 sfb->fb->var.yres = SCREEN_Y_RES_PC; in sm7xx_resolution_probe()
1474 sfb->fb->var.bits_per_pixel = SCREEN_BPP; in sm7xx_resolution_probe()
1484 * So we change the default to 768, but keep 600 as-is on MIPS. in sm7xx_resolution_probe()
1486 sfb->fb->var.yres = SCREEN_Y_RES_NETBOOK; in sm7xx_resolution_probe()
1490 big_pixel_depth(sfb->fb->var.bits_per_pixel, smtc_scr_info.lfb_depth); in sm7xx_resolution_probe()
1502 dev_info(&pdev->dev, "Silicon Motion display driver.\n"); in smtcfb_pci_probe()
1514 dev_err(&pdev->dev, "cannot reserve framebuffer region\n"); in smtcfb_pci_probe()
1518 sprintf(smtcfb_fix.id, "sm%Xfb", ent->device); in smtcfb_pci_probe()
1520 info = framebuffer_alloc(sizeof(*sfb), &pdev->dev); in smtcfb_pci_probe()
1522 err = -ENOMEM; in smtcfb_pci_probe()
1526 sfb = info->par; in smtcfb_pci_probe()
1527 sfb->fb = info; in smtcfb_pci_probe()
1528 sfb->chip_id = ent->device; in smtcfb_pci_probe()
1529 sfb->pdev = pdev; in smtcfb_pci_probe()
1530 info->fbops = &smtcfb_ops; in smtcfb_pci_probe()
1531 info->fix = smtcfb_fix; in smtcfb_pci_probe()
1532 info->var = smtcfb_var; in smtcfb_pci_probe()
1533 info->pseudo_palette = sfb->colreg; in smtcfb_pci_probe()
1534 info->par = sfb; in smtcfb_pci_probe()
1542 pci_read_config_byte(pdev, PCI_REVISION_ID, &sfb->chip_rev_id); in smtcfb_pci_probe()
1545 dev_info(&pdev->dev, "%lu MiB of VRAM detected.\n", in smtcfb_pci_probe()
1548 switch (sfb->chip_id) { in smtcfb_pci_probe()
1551 sfb->fb->fix.mmio_start = mmio_base + 0x00400000; in smtcfb_pci_probe()
1552 sfb->fb->fix.mmio_len = 0x00400000; in smtcfb_pci_probe()
1553 sfb->lfb = ioremap(mmio_base, mmio_addr); in smtcfb_pci_probe()
1554 if (!sfb->lfb) { in smtcfb_pci_probe()
1555 dev_err(&pdev->dev, in smtcfb_pci_probe()
1557 sfb->fb->fix.id); in smtcfb_pci_probe()
1558 err = -ENOMEM; in smtcfb_pci_probe()
1562 sfb->mmio = (smtc_regbaseaddress = in smtcfb_pci_probe()
1563 sfb->lfb + 0x00700000); in smtcfb_pci_probe()
1564 sfb->dp_regs = sfb->lfb + 0x00408000; in smtcfb_pci_probe()
1565 sfb->vp_regs = sfb->lfb + 0x0040c000; in smtcfb_pci_probe()
1566 if (sfb->fb->var.bits_per_pixel == 32) { in smtcfb_pci_probe()
1567 sfb->lfb += big_addr; in smtcfb_pci_probe()
1568 dev_info(&pdev->dev, "sfb->lfb=%p\n", sfb->lfb); in smtcfb_pci_probe()
1578 if (sfb->fb->var.bits_per_pixel == 32) in smtcfb_pci_probe()
1582 sfb->fb->fix.mmio_start = mmio_base; in smtcfb_pci_probe()
1583 sfb->fb->fix.mmio_len = 0x00200000; in smtcfb_pci_probe()
1584 sfb->dp_regs = ioremap(mmio_base, 0x00200000 + smem_size); in smtcfb_pci_probe()
1585 if (!sfb->dp_regs) { in smtcfb_pci_probe()
1586 dev_err(&pdev->dev, in smtcfb_pci_probe()
1588 sfb->fb->fix.id); in smtcfb_pci_probe()
1589 err = -ENOMEM; in smtcfb_pci_probe()
1593 sfb->lfb = sfb->dp_regs + 0x00200000; in smtcfb_pci_probe()
1594 sfb->mmio = (smtc_regbaseaddress = in smtcfb_pci_probe()
1595 sfb->dp_regs + 0x000c0000); in smtcfb_pci_probe()
1596 sfb->vp_regs = sfb->dp_regs + 0x800; in smtcfb_pci_probe()
1603 dev_err(&pdev->dev, in smtcfb_pci_probe()
1604 "No valid Silicon Motion display chip was detected!\n"); in smtcfb_pci_probe()
1605 err = -ENODEV; in smtcfb_pci_probe()
1613 if (sfb->fb->var.bits_per_pixel == 15) in smtcfb_pci_probe()
1614 sfb->fb->var.bits_per_pixel = 16; in smtcfb_pci_probe()
1616 sfb->fb->var.xres_virtual = sfb->fb->var.xres; in smtcfb_pci_probe()
1617 sfb->fb->var.yres_virtual = sfb->fb->var.yres; in smtcfb_pci_probe()
1626 memset_io(sfb->lfb, 0, sfb->fb->fix.smem_len); in smtcfb_pci_probe()
1632 dev_info(&pdev->dev, in smtcfb_pci_probe()
1633 "Silicon Motion SM%X Rev%X primary display mode %dx%d-%d Init Complete.\n", in smtcfb_pci_probe()
1634 sfb->chip_id, sfb->chip_rev_id, sfb->fb->var.xres, in smtcfb_pci_probe()
1635 sfb->fb->var.yres, sfb->fb->var.bits_per_pixel); in smtcfb_pci_probe()
1640 dev_err(&pdev->dev, "Silicon Motion, Inc. primary display init fail.\n"); in smtcfb_pci_probe()
1677 unregister_framebuffer(sfb->fb); in smtcfb_pci_remove()
1678 framebuffer_release(sfb->fb); in smtcfb_pci_remove()
1689 * so that we can turn off internal PLLs later on in smtcfb_pci_suspend()
1695 fb_set_suspend(sfb->fb, 1); in smtcfb_pci_suspend()
1711 switch (sfb->chip_id) { in smtcfb_pci_resume()
1720 if (sfb->fb->var.bits_per_pixel == 32) in smtcfb_pci_resume()
1736 fb_set_suspend(sfb->fb, 0); in smtcfb_pci_resume()
1757 return -ENODEV; in sm712fb_init()
1760 return -ENODEV; in sm712fb_init()