1// SPDX-License-Identifier: GPL-2.0-only
2/******************************************************************************
3
4    AudioScience HPI driver
5    Copyright (C) 1997-2012  AudioScience Inc. <support@audioscience.com>
6
7
8HPI Operating System function implementation for Linux
9
10(C) Copyright AudioScience Inc. 1997-2003
11******************************************************************************/
12#define SOURCEFILE_NAME "hpios.c"
13#include "hpi_internal.h"
14#include "hpidebug.h"
15#include <linux/delay.h>
16#include <linux/sched.h>
17
18void hpios_delay_micro_seconds(u32 num_micro_sec)
19{
20	if ((usecs_to_jiffies(num_micro_sec) > 1) && !in_interrupt()) {
21		/* MUST NOT SCHEDULE IN INTERRUPT CONTEXT! */
22		schedule_timeout_uninterruptible(usecs_to_jiffies
23			(num_micro_sec));
24	} else if (num_micro_sec <= 2000)
25		udelay(num_micro_sec);
26	else
27		mdelay(num_micro_sec / 1000);
28
29}
30
31/** Allocate an area of locked memory for bus master DMA operations.
32
33If allocation fails, return 1, and *pMemArea.size = 0
34*/
35u16 hpios_locked_mem_alloc(struct consistent_dma_area *p_mem_area, u32 size,
36	struct pci_dev *pdev)
37{
38	/*?? any benefit in using managed dmam_alloc_coherent? */
39	p_mem_area->vaddr =
40		dma_alloc_coherent(&pdev->dev, size, &p_mem_area->dma_handle,
41		GFP_KERNEL);
42
43	if (p_mem_area->vaddr) {
44		HPI_DEBUG_LOG(DEBUG, "allocated %d bytes, dma 0x%x vma %p\n",
45			size, (unsigned int)p_mem_area->dma_handle,
46			p_mem_area->vaddr);
47		p_mem_area->pdev = &pdev->dev;
48		p_mem_area->size = size;
49		return 0;
50	} else {
51		HPI_DEBUG_LOG(WARNING,
52			"failed to allocate %d bytes locked memory\n", size);
53		p_mem_area->size = 0;
54		return 1;
55	}
56}
57
58u16 hpios_locked_mem_free(struct consistent_dma_area *p_mem_area)
59{
60	if (p_mem_area->size) {
61		dma_free_coherent(p_mem_area->pdev, p_mem_area->size,
62			p_mem_area->vaddr, p_mem_area->dma_handle);
63		HPI_DEBUG_LOG(DEBUG, "freed %lu bytes, dma 0x%x vma %p\n",
64			(unsigned long)p_mem_area->size,
65			(unsigned int)p_mem_area->dma_handle,
66			p_mem_area->vaddr);
67		p_mem_area->size = 0;
68		return 0;
69	} else {
70		return 1;
71	}
72}
73