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

gbefb: switch to managed version of the DMA allocator

gbefb uses managed resources, so it should do the same for DMA
allocations.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Acked-by: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>

+8 -16
+8 -16
drivers/video/fbdev/gbefb.c
··· 1162 1162 } 1163 1163 gbe_revision = gbe->ctrlstat & 15; 1164 1164 1165 - gbe_tiles.cpu = 1166 - dma_alloc_coherent(NULL, GBE_TLB_SIZE * sizeof(uint16_t), 1167 - &gbe_tiles.dma, GFP_KERNEL); 1165 + gbe_tiles.cpu = dmam_alloc_coherent(&p_dev->dev, 1166 + GBE_TLB_SIZE * sizeof(uint16_t), 1167 + &gbe_tiles.dma, GFP_KERNEL); 1168 1168 if (!gbe_tiles.cpu) { 1169 1169 printk(KERN_ERR "gbefb: couldn't allocate tiles table\n"); 1170 1170 ret = -ENOMEM; ··· 1178 1178 if (!gbe_mem) { 1179 1179 printk(KERN_ERR "gbefb: couldn't map framebuffer\n"); 1180 1180 ret = -ENOMEM; 1181 - goto out_tiles_free; 1181 + goto out_release_mem_region; 1182 1182 } 1183 1183 1184 1184 gbe_dma_addr = 0; 1185 1185 } else { 1186 1186 /* try to allocate memory with the classical allocator 1187 1187 * 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); 1188 + gbe_mem = dmam_alloc_attrs(&p_dev->dev, gbe_mem_size, 1189 + &gbe_dma_addr, GFP_KERNEL, 1190 + DMA_ATTR_WRITE_COMBINE); 1190 1191 if (!gbe_mem) { 1191 1192 printk(KERN_ERR "gbefb: couldn't allocate framebuffer memory\n"); 1192 1193 ret = -ENOMEM; 1193 - goto out_tiles_free; 1194 + goto out_release_mem_region; 1194 1195 } 1195 1196 1196 1197 gbe_mem_phys = (unsigned long) gbe_dma_addr; ··· 1238 1237 1239 1238 out_gbe_unmap: 1240 1239 arch_phys_wc_del(par->wc_cookie); 1241 - if (gbe_dma_addr) 1242 - dma_free_wc(NULL, gbe_mem_size, gbe_mem, gbe_mem_phys); 1243 - out_tiles_free: 1244 - dma_free_coherent(NULL, GBE_TLB_SIZE * sizeof(uint16_t), 1245 - (void *)gbe_tiles.cpu, gbe_tiles.dma); 1246 1240 out_release_mem_region: 1247 1241 release_mem_region(GBE_BASE, sizeof(struct sgi_gbe)); 1248 1242 out_release_framebuffer: ··· 1254 1258 unregister_framebuffer(info); 1255 1259 gbe_turn_off(); 1256 1260 arch_phys_wc_del(par->wc_cookie); 1257 - if (gbe_dma_addr) 1258 - dma_free_wc(NULL, gbe_mem_size, gbe_mem, gbe_mem_phys); 1259 - dma_free_coherent(NULL, GBE_TLB_SIZE * sizeof(uint16_t), 1260 - (void *)gbe_tiles.cpu, gbe_tiles.dma); 1261 1261 release_mem_region(GBE_BASE, sizeof(struct sgi_gbe)); 1262 1262 gbefb_remove_sysfs(&p_dev->dev); 1263 1263 framebuffer_release(info);