unmap_single(struct device *dev, dma_addr_t dma_addr, size_t size,		enum dma_data_direction dir){	struct dmabounce_device_info *device_info = find_dmabounce_dev(dev);	struct safe_buffer *buf = NULL;	/*	 * Trying to unmap an invalid mapping	 */	if (dma_addr == ~0) {		dev_err(dev, "Trying to unmap invalid mapping\n");		return;	}	if (device_info)		buf = find_safe_buffer(device_info, dma_addr);	if (buf) {		BUG_ON(buf->size != size);		dev_dbg(dev,			"%s: unsafe buffer %p (phy=%p) mapped to %p (phy=%p)\n",			__func__, buf->ptr, (void *) virt_to_dma(dev, buf->ptr),			buf->safe, (void *) buf->safe_dma_addr);		DO_STATS ( device_info->bounce_count++ );		if (dir == DMA_FROM_DEVICE || dir == DMA_BIDIRECTIONAL) {			unsigned long ptr;			dev_dbg(dev,				"%s: copy back safe %p to unsafe %p size %d\n",				__func__, buf->safe, buf->ptr, size);			memcpy(buf->ptr, buf->safe, size);			/*			 * DMA buffers must have the same cache properties			 * as if they were really used for DMA - which means			 * data must be written back to RAM.  Note that			 * we don't use dmac_flush_range() here for the			 * bidirectional case because we know the cache			 * lines will be coherent with the data written.			 */			ptr = (unsigned long)buf->ptr;			dmac_clean_range(ptr, ptr + size);		}		free_safe_buffer(device_info, buf);	}}
10457	/local/tlutelli/issta_data/temp/c/2005_temp/2005/10457/b46a58fd4e3cdd107ffccedaa5e233deeb94c5c0/dmabounce.c/buggy/arch/arm/common/dmabounce.c