2019-05-29 07:12:47 -07:00
// SPDX-License-Identifier: GPL-2.0-only
2010-04-21 18:17:39 +02:00
/******************************************************************************
AudioScience HPI driver
2012-03-30 09:52:25 +13:00
Copyright ( C ) 1997 - 2012 AudioScience Inc . < support @ audioscience . com >
2010-04-21 18:17:39 +02:00
HPI Operating System function implementation for Linux
( C ) Copyright AudioScience Inc . 1997 - 2003
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# define SOURCEFILE_NAME "hpios.c"
# include "hpi_internal.h"
# include "hpidebug.h"
# include <linux/delay.h>
# include <linux/sched.h>
void hpios_delay_micro_seconds ( u32 num_micro_sec )
{
if ( ( usecs_to_jiffies ( num_micro_sec ) > 1 ) & & ! in_interrupt ( ) ) {
/* MUST NOT SCHEDULE IN INTERRUPT CONTEXT! */
schedule_timeout_uninterruptible ( usecs_to_jiffies
( num_micro_sec ) ) ;
} else if ( num_micro_sec < = 2000 )
udelay ( num_micro_sec ) ;
else
mdelay ( num_micro_sec / 1000 ) ;
}
2012-03-30 09:52:25 +13:00
/** Allocate an area of locked memory for bus master DMA operations.
2010-04-21 18:17:39 +02:00
2012-03-30 09:52:25 +13:00
If allocation fails , return 1 , and * pMemArea . size = 0
2010-04-21 18:17:39 +02:00
*/
2012-03-30 09:52:25 +13:00
u16 hpios_locked_mem_alloc ( struct consistent_dma_area * p_mem_area , u32 size ,
2010-04-21 18:17:39 +02:00
struct pci_dev * pdev )
{
/*?? any benefit in using managed dmam_alloc_coherent? */
p_mem_area - > vaddr =
dma_alloc_coherent ( & pdev - > dev , size , & p_mem_area - > dma_handle ,
2018-10-13 17:17:03 +02:00
GFP_KERNEL ) ;
2010-04-21 18:17:39 +02:00
if ( p_mem_area - > vaddr ) {
HPI_DEBUG_LOG ( DEBUG , " allocated %d bytes, dma 0x%x vma %p \n " ,
size , ( unsigned int ) p_mem_area - > dma_handle ,
p_mem_area - > vaddr ) ;
p_mem_area - > pdev = & pdev - > dev ;
p_mem_area - > size = size ;
return 0 ;
} else {
HPI_DEBUG_LOG ( WARNING ,
" failed to allocate %d bytes locked memory \n " , size ) ;
p_mem_area - > size = 0 ;
2012-03-30 09:52:25 +13:00
return 1 ;
2010-04-21 18:17:39 +02:00
}
}
u16 hpios_locked_mem_free ( struct consistent_dma_area * p_mem_area )
{
if ( p_mem_area - > size ) {
dma_free_coherent ( p_mem_area - > pdev , p_mem_area - > size ,
p_mem_area - > vaddr , p_mem_area - > dma_handle ) ;
HPI_DEBUG_LOG ( DEBUG , " freed %lu bytes, dma 0x%x vma %p \n " ,
( unsigned long ) p_mem_area - > size ,
( unsigned int ) p_mem_area - > dma_handle ,
p_mem_area - > vaddr ) ;
p_mem_area - > size = 0 ;
return 0 ;
} else {
return 1 ;
}
}