| .. | .. |
|---|
| 1047 | 1047 | if (count + p > total_size) |
|---|
| 1048 | 1048 | count = total_size - p; |
|---|
| 1049 | 1049 | |
|---|
| 1050 | | - buffer = kmalloc((count > PAGE_SIZE) ? PAGE_SIZE : count, GFP_KERNEL); |
|---|
| 1050 | + buffer = kmalloc(PAGE_SIZE, GFP_KERNEL); |
|---|
| 1051 | 1051 | if (!buffer) |
|---|
| 1052 | 1052 | return -ENOMEM; |
|---|
| 1053 | 1053 | |
|---|
| .. | .. |
|---|
| 1059 | 1059 | while (count) { |
|---|
| 1060 | 1060 | c = (count > PAGE_SIZE) ? PAGE_SIZE : count; |
|---|
| 1061 | 1061 | dst = buffer; |
|---|
| 1062 | | - for (i = c >> 2; i--;) { |
|---|
| 1063 | | - *dst = fb_readl(src++); |
|---|
| 1064 | | - *dst = big_swap(*dst); |
|---|
| 1065 | | - dst++; |
|---|
| 1066 | | - } |
|---|
| 1067 | | - if (c & 3) { |
|---|
| 1068 | | - u8 *dst8 = (u8 *)dst; |
|---|
| 1069 | | - u8 __iomem *src8 = (u8 __iomem *)src; |
|---|
| 1062 | + for (i = (c + 3) >> 2; i--;) { |
|---|
| 1063 | + u32 val; |
|---|
| 1070 | 1064 | |
|---|
| 1071 | | - for (i = c & 3; i--;) { |
|---|
| 1072 | | - if (i & 1) { |
|---|
| 1073 | | - *dst8++ = fb_readb(++src8); |
|---|
| 1074 | | - } else { |
|---|
| 1075 | | - *dst8++ = fb_readb(--src8); |
|---|
| 1076 | | - src8 += 2; |
|---|
| 1077 | | - } |
|---|
| 1078 | | - } |
|---|
| 1079 | | - src = (u32 __iomem *)src8; |
|---|
| 1065 | + val = fb_readl(src); |
|---|
| 1066 | + *dst = big_swap(val); |
|---|
| 1067 | + src++; |
|---|
| 1068 | + dst++; |
|---|
| 1080 | 1069 | } |
|---|
| 1081 | 1070 | |
|---|
| 1082 | 1071 | if (copy_to_user(buf, buffer, c)) { |
|---|
| .. | .. |
|---|
| 1130 | 1119 | count = total_size - p; |
|---|
| 1131 | 1120 | } |
|---|
| 1132 | 1121 | |
|---|
| 1133 | | - buffer = kmalloc((count > PAGE_SIZE) ? PAGE_SIZE : count, GFP_KERNEL); |
|---|
| 1122 | + buffer = kmalloc(PAGE_SIZE, GFP_KERNEL); |
|---|
| 1134 | 1123 | if (!buffer) |
|---|
| 1135 | 1124 | return -ENOMEM; |
|---|
| 1136 | 1125 | |
|---|
| .. | .. |
|---|
| 1148 | 1137 | break; |
|---|
| 1149 | 1138 | } |
|---|
| 1150 | 1139 | |
|---|
| 1151 | | - for (i = c >> 2; i--;) { |
|---|
| 1152 | | - fb_writel(big_swap(*src), dst++); |
|---|
| 1140 | + for (i = (c + 3) >> 2; i--;) { |
|---|
| 1141 | + fb_writel(big_swap(*src), dst); |
|---|
| 1142 | + dst++; |
|---|
| 1153 | 1143 | src++; |
|---|
| 1154 | | - } |
|---|
| 1155 | | - if (c & 3) { |
|---|
| 1156 | | - u8 *src8 = (u8 *)src; |
|---|
| 1157 | | - u8 __iomem *dst8 = (u8 __iomem *)dst; |
|---|
| 1158 | | - |
|---|
| 1159 | | - for (i = c & 3; i--;) { |
|---|
| 1160 | | - if (i & 1) { |
|---|
| 1161 | | - fb_writeb(*src8++, ++dst8); |
|---|
| 1162 | | - } else { |
|---|
| 1163 | | - fb_writeb(*src8++, --dst8); |
|---|
| 1164 | | - dst8 += 2; |
|---|
| 1165 | | - } |
|---|
| 1166 | | - } |
|---|
| 1167 | | - dst = (u32 __iomem *)dst8; |
|---|
| 1168 | 1144 | } |
|---|
| 1169 | 1145 | |
|---|
| 1170 | 1146 | *ppos += c; |
|---|
| .. | .. |
|---|
| 1369 | 1345 | return 0; |
|---|
| 1370 | 1346 | } |
|---|
| 1371 | 1347 | |
|---|
| 1372 | | -static struct fb_ops smtcfb_ops = { |
|---|
| 1348 | +static const struct fb_ops smtcfb_ops = { |
|---|
| 1373 | 1349 | .owner = THIS_MODULE, |
|---|
| 1374 | 1350 | .fb_check_var = smtc_check_var, |
|---|
| 1375 | 1351 | .fb_set_par = smtc_set_par, |
|---|
| .. | .. |
|---|
| 1540 | 1516 | |
|---|
| 1541 | 1517 | info = framebuffer_alloc(sizeof(*sfb), &pdev->dev); |
|---|
| 1542 | 1518 | if (!info) { |
|---|
| 1543 | | - dev_err(&pdev->dev, "framebuffer_alloc failed\n"); |
|---|
| 1544 | 1519 | err = -ENOMEM; |
|---|
| 1545 | 1520 | goto failed_free; |
|---|
| 1546 | 1521 | } |
|---|
| .. | .. |
|---|
| 1605 | 1580 | sfb->fb->fix.mmio_start = mmio_base; |
|---|
| 1606 | 1581 | sfb->fb->fix.mmio_len = 0x00200000; |
|---|
| 1607 | 1582 | sfb->dp_regs = ioremap(mmio_base, 0x00200000 + smem_size); |
|---|
| 1583 | + if (!sfb->dp_regs) { |
|---|
| 1584 | + dev_err(&pdev->dev, |
|---|
| 1585 | + "%s: unable to map memory mapped IO!\n", |
|---|
| 1586 | + sfb->fb->fix.id); |
|---|
| 1587 | + err = -ENOMEM; |
|---|
| 1588 | + goto failed_fb; |
|---|
| 1589 | + } |
|---|
| 1590 | + |
|---|
| 1608 | 1591 | sfb->lfb = sfb->dp_regs + 0x00200000; |
|---|
| 1609 | 1592 | sfb->mmio = (smtc_regbaseaddress = |
|---|
| 1610 | 1593 | sfb->dp_regs + 0x000c0000); |
|---|
| .. | .. |
|---|
| 1617 | 1600 | default: |
|---|
| 1618 | 1601 | dev_err(&pdev->dev, |
|---|
| 1619 | 1602 | "No valid Silicon Motion display chip was detected!\n"); |
|---|
| 1620 | | - |
|---|
| 1603 | + err = -ENODEV; |
|---|
| 1621 | 1604 | goto failed_fb; |
|---|
| 1622 | 1605 | } |
|---|
| 1623 | 1606 | |
|---|
| .. | .. |
|---|
| 1697 | 1680 | |
|---|
| 1698 | 1681 | static int __maybe_unused smtcfb_pci_suspend(struct device *device) |
|---|
| 1699 | 1682 | { |
|---|
| 1700 | | - struct pci_dev *pdev = to_pci_dev(device); |
|---|
| 1701 | | - struct smtcfb_info *sfb; |
|---|
| 1683 | + struct smtcfb_info *sfb = dev_get_drvdata(device); |
|---|
| 1702 | 1684 | |
|---|
| 1703 | | - sfb = pci_get_drvdata(pdev); |
|---|
| 1704 | 1685 | |
|---|
| 1705 | 1686 | /* set the hw in sleep mode use external clock and self memory refresh |
|---|
| 1706 | 1687 | * so that we can turn off internal PLLs later on |
|---|
| .. | .. |
|---|
| 1720 | 1701 | |
|---|
| 1721 | 1702 | static int __maybe_unused smtcfb_pci_resume(struct device *device) |
|---|
| 1722 | 1703 | { |
|---|
| 1723 | | - struct pci_dev *pdev = to_pci_dev(device); |
|---|
| 1724 | | - struct smtcfb_info *sfb; |
|---|
| 1704 | + struct smtcfb_info *sfb = dev_get_drvdata(device); |
|---|
| 1725 | 1705 | |
|---|
| 1726 | | - sfb = pci_get_drvdata(pdev); |
|---|
| 1727 | 1706 | |
|---|
| 1728 | 1707 | /* reinit hardware */ |
|---|
| 1729 | 1708 | sm7xx_init_hw(); |
|---|