| .. | .. |
|---|
| 39 | 39 | int valid; |
|---|
| 40 | 40 | }; |
|---|
| 41 | 41 | |
|---|
| 42 | | -#ifdef CONFIG_SGI_IP32 |
|---|
| 43 | 42 | #define GBE_BASE 0x16000000 /* SGI O2 */ |
|---|
| 44 | | -#endif |
|---|
| 45 | 43 | |
|---|
| 46 | 44 | /* macro for fastest write-though access to the framebuffer */ |
|---|
| 47 | 45 | #ifdef CONFIG_MIPS |
|---|
| .. | .. |
|---|
| 50 | 48 | #else |
|---|
| 51 | 49 | #define pgprot_fb(_prot) (((_prot) & (~_CACHE_MASK)) | _CACHE_CACHABLE_NO_WA) |
|---|
| 52 | 50 | #endif |
|---|
| 53 | | -#endif |
|---|
| 54 | | -#ifdef CONFIG_X86 |
|---|
| 55 | | -#define pgprot_fb(_prot) (((_prot) & ~_PAGE_CACHE_MASK) | \ |
|---|
| 56 | | - cachemode2protval(_PAGE_CACHE_MODE_UC_MINUS)) |
|---|
| 57 | 51 | #endif |
|---|
| 58 | 52 | |
|---|
| 59 | 53 | /* |
|---|
| .. | .. |
|---|
| 279 | 273 | val = 0; |
|---|
| 280 | 274 | SET_GBE_FIELD(VT_XY, FREEZE, val, 1); |
|---|
| 281 | 275 | gbe->vt_xy = val; |
|---|
| 282 | | - udelay(10000); |
|---|
| 276 | + mdelay(10); |
|---|
| 283 | 277 | for (i = 0; i < 10000; i++) { |
|---|
| 284 | 278 | val = gbe->vt_xy; |
|---|
| 285 | 279 | if (GET_GBE_FIELD(VT_XY, FREEZE, val) != 1) |
|---|
| .. | .. |
|---|
| 294 | 288 | val = gbe->dotclock; |
|---|
| 295 | 289 | SET_GBE_FIELD(DOTCLK, RUN, val, 0); |
|---|
| 296 | 290 | gbe->dotclock = val; |
|---|
| 297 | | - udelay(10000); |
|---|
| 291 | + mdelay(10); |
|---|
| 298 | 292 | for (i = 0; i < 10000; i++) { |
|---|
| 299 | 293 | val = gbe->dotclock; |
|---|
| 300 | 294 | if (GET_GBE_FIELD(DOTCLK, RUN, val)) |
|---|
| .. | .. |
|---|
| 331 | 325 | val = gbe->dotclock; |
|---|
| 332 | 326 | SET_GBE_FIELD(DOTCLK, RUN, val, 1); |
|---|
| 333 | 327 | gbe->dotclock = val; |
|---|
| 334 | | - udelay(10000); |
|---|
| 328 | + mdelay(10); |
|---|
| 335 | 329 | for (i = 0; i < 10000; i++) { |
|---|
| 336 | 330 | val = gbe->dotclock; |
|---|
| 337 | 331 | if (GET_GBE_FIELD(DOTCLK, RUN, val) != 1) |
|---|
| .. | .. |
|---|
| 346 | 340 | val = 0; |
|---|
| 347 | 341 | SET_GBE_FIELD(VT_XY, FREEZE, val, 0); |
|---|
| 348 | 342 | gbe->vt_xy = val; |
|---|
| 349 | | - udelay(10000); |
|---|
| 343 | + mdelay(10); |
|---|
| 350 | 344 | for (i = 0; i < 10000; i++) { |
|---|
| 351 | 345 | val = gbe->vt_xy; |
|---|
| 352 | 346 | if (GET_GBE_FIELD(VT_XY, FREEZE, val)) |
|---|
| .. | .. |
|---|
| 547 | 541 | SET_GBE_FIELD(DOTCLK, P, val, timing->pll_p); |
|---|
| 548 | 542 | SET_GBE_FIELD(DOTCLK, RUN, val, 0); /* do not start yet */ |
|---|
| 549 | 543 | gbe->dotclock = val; |
|---|
| 550 | | - udelay(10000); |
|---|
| 544 | + mdelay(10); |
|---|
| 551 | 545 | |
|---|
| 552 | 546 | /* setup pixel counter */ |
|---|
| 553 | 547 | val = 0; |
|---|
| .. | .. |
|---|
| 1018 | 1012 | |
|---|
| 1019 | 1013 | /* remap using the fastest write-through mode on architecture */ |
|---|
| 1020 | 1014 | /* try not polluting the cache when possible */ |
|---|
| 1015 | +#ifdef CONFIG_MIPS |
|---|
| 1021 | 1016 | pgprot_val(vma->vm_page_prot) = |
|---|
| 1022 | 1017 | pgprot_fb(pgprot_val(vma->vm_page_prot)); |
|---|
| 1023 | | - |
|---|
| 1018 | +#endif |
|---|
| 1024 | 1019 | /* VM_IO | VM_DONTEXPAND | VM_DONTDUMP are set by remap_pfn_range() */ |
|---|
| 1025 | 1020 | |
|---|
| 1026 | 1021 | /* look for the starting tile */ |
|---|
| .. | .. |
|---|
| 1049 | 1044 | return 0; |
|---|
| 1050 | 1045 | } |
|---|
| 1051 | 1046 | |
|---|
| 1052 | | -static struct fb_ops gbefb_ops = { |
|---|
| 1047 | +static const struct fb_ops gbefb_ops = { |
|---|
| 1053 | 1048 | .owner = THIS_MODULE, |
|---|
| 1054 | 1049 | .fb_check_var = gbefb_check_var, |
|---|
| 1055 | 1050 | .fb_set_par = gbefb_set_par, |
|---|
| .. | .. |
|---|
| 1162 | 1157 | } |
|---|
| 1163 | 1158 | gbe_revision = gbe->ctrlstat & 15; |
|---|
| 1164 | 1159 | |
|---|
| 1165 | | - gbe_tiles.cpu = |
|---|
| 1166 | | - dma_alloc_coherent(NULL, GBE_TLB_SIZE * sizeof(uint16_t), |
|---|
| 1167 | | - &gbe_tiles.dma, GFP_KERNEL); |
|---|
| 1160 | + gbe_tiles.cpu = dmam_alloc_coherent(&p_dev->dev, |
|---|
| 1161 | + GBE_TLB_SIZE * sizeof(uint16_t), |
|---|
| 1162 | + &gbe_tiles.dma, GFP_KERNEL); |
|---|
| 1168 | 1163 | if (!gbe_tiles.cpu) { |
|---|
| 1169 | 1164 | printk(KERN_ERR "gbefb: couldn't allocate tiles table\n"); |
|---|
| 1170 | 1165 | ret = -ENOMEM; |
|---|
| .. | .. |
|---|
| 1178 | 1173 | if (!gbe_mem) { |
|---|
| 1179 | 1174 | printk(KERN_ERR "gbefb: couldn't map framebuffer\n"); |
|---|
| 1180 | 1175 | ret = -ENOMEM; |
|---|
| 1181 | | - goto out_tiles_free; |
|---|
| 1176 | + goto out_release_mem_region; |
|---|
| 1182 | 1177 | } |
|---|
| 1183 | 1178 | |
|---|
| 1184 | 1179 | gbe_dma_addr = 0; |
|---|
| 1185 | 1180 | } else { |
|---|
| 1186 | 1181 | /* try to allocate memory with the classical allocator |
|---|
| 1187 | 1182 | * this has high chance to fail on low memory machines */ |
|---|
| 1188 | | - gbe_mem = dma_alloc_wc(NULL, gbe_mem_size, &gbe_dma_addr, |
|---|
| 1189 | | - GFP_KERNEL); |
|---|
| 1183 | + gbe_mem = dmam_alloc_attrs(&p_dev->dev, gbe_mem_size, |
|---|
| 1184 | + &gbe_dma_addr, GFP_KERNEL, |
|---|
| 1185 | + DMA_ATTR_WRITE_COMBINE); |
|---|
| 1190 | 1186 | if (!gbe_mem) { |
|---|
| 1191 | 1187 | printk(KERN_ERR "gbefb: couldn't allocate framebuffer memory\n"); |
|---|
| 1192 | 1188 | ret = -ENOMEM; |
|---|
| 1193 | | - goto out_tiles_free; |
|---|
| 1189 | + goto out_release_mem_region; |
|---|
| 1194 | 1190 | } |
|---|
| 1195 | 1191 | |
|---|
| 1196 | 1192 | gbe_mem_phys = (unsigned long) gbe_dma_addr; |
|---|
| .. | .. |
|---|
| 1237 | 1233 | |
|---|
| 1238 | 1234 | out_gbe_unmap: |
|---|
| 1239 | 1235 | arch_phys_wc_del(par->wc_cookie); |
|---|
| 1240 | | - if (gbe_dma_addr) |
|---|
| 1241 | | - dma_free_wc(NULL, gbe_mem_size, gbe_mem, gbe_mem_phys); |
|---|
| 1242 | | -out_tiles_free: |
|---|
| 1243 | | - dma_free_coherent(NULL, GBE_TLB_SIZE * sizeof(uint16_t), |
|---|
| 1244 | | - (void *)gbe_tiles.cpu, gbe_tiles.dma); |
|---|
| 1245 | 1236 | out_release_mem_region: |
|---|
| 1246 | 1237 | release_mem_region(GBE_BASE, sizeof(struct sgi_gbe)); |
|---|
| 1247 | 1238 | out_release_framebuffer: |
|---|
| .. | .. |
|---|
| 1258 | 1249 | unregister_framebuffer(info); |
|---|
| 1259 | 1250 | gbe_turn_off(); |
|---|
| 1260 | 1251 | arch_phys_wc_del(par->wc_cookie); |
|---|
| 1261 | | - if (gbe_dma_addr) |
|---|
| 1262 | | - dma_free_wc(NULL, gbe_mem_size, gbe_mem, gbe_mem_phys); |
|---|
| 1263 | | - dma_free_coherent(NULL, GBE_TLB_SIZE * sizeof(uint16_t), |
|---|
| 1264 | | - (void *)gbe_tiles.cpu, gbe_tiles.dma); |
|---|
| 1265 | 1252 | release_mem_region(GBE_BASE, sizeof(struct sgi_gbe)); |
|---|
| 1266 | 1253 | gbefb_remove_sysfs(&p_dev->dev); |
|---|
| 1267 | 1254 | framebuffer_release(info); |
|---|
| .. | .. |
|---|
| 1282 | 1269 | static int __init gbefb_init(void) |
|---|
| 1283 | 1270 | { |
|---|
| 1284 | 1271 | int ret = platform_driver_register(&gbefb_driver); |
|---|
| 1285 | | - if (!ret) { |
|---|
| 1272 | + if (IS_ENABLED(CONFIG_SGI_IP32) && !ret) { |
|---|
| 1286 | 1273 | gbefb_device = platform_device_alloc("gbefb", 0); |
|---|
| 1287 | 1274 | if (gbefb_device) { |
|---|
| 1288 | 1275 | ret = platform_device_add(gbefb_device); |
|---|