patch-2.3.99-pre6 linux/drivers/sound/emu10k1/osutils.c

Next file: linux/drivers/sound/emu10k1/recmgr.c
Previous file: linux/drivers/sound/emu10k1/mixer.c
Back to the patch index
Back to the overall index

diff -u --recursive --new-file v2.3.99-pre5/linux/drivers/sound/emu10k1/osutils.c linux/drivers/sound/emu10k1/osutils.c
@@ -0,0 +1,91 @@
+
+/*
+ **********************************************************************
+ *     osutils.c - OS Services layer for emu10k1 driver
+ *     Copyright 1999, 2000 Creative Labs, Inc.
+ *
+ **********************************************************************
+ *
+ *     Date                 Author          Summary of changes
+ *     ----                 ------          ------------------
+ *     October 20, 1999     Bertrand Lee    base code release
+ *     November 2, 1999     Alan Cox        cleaned up
+ *
+ **********************************************************************
+ *
+ *     This program is free software; you can redistribute it and/or
+ *     modify it under the terms of the GNU General Public License as
+ *     published by the Free Software Foundation; either version 2 of
+ *     the License, or (at your option) any later version.
+ *
+ *     This program is distributed in the hope that it will be useful,
+ *     but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *     GNU General Public License for more details.
+ *
+ *     You should have received a copy of the GNU General Public
+ *     License along with this program; if not, write to the Free
+ *     Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139,
+ *     USA.
+ *
+ **********************************************************************
+ */
+
+#include "hwaccess.h"
+
+struct memhandle *emu10k1_alloc_memphysical(u32 size)
+{
+	struct memhandle *handle;
+	u32 reqpage, order;
+
+	if ((handle = (struct memhandle *) kmalloc(sizeof(struct memhandle), GFP_KERNEL)) == NULL)
+		return handle;
+
+	DPD(3, "kmalloc: [%p]\n", handle);
+
+	order = 0;
+	reqpage = size / PAGE_SIZE;
+
+	if (size % PAGE_SIZE)
+		reqpage++;
+
+	if (reqpage != 0) {
+		reqpage--;
+		while (reqpage > 0) {
+			reqpage >>= 1;
+			order++;
+		}
+	}
+
+	if ((handle->virtaddx = (void *) __get_free_pages(GFP_KERNEL, order)) == NULL) {
+		kfree(handle);
+
+		DPD(3, "kfree: [%p]\n", handle);
+		return (void *) NULL;
+	}
+
+	/* in linux, we can directly access physical address, don't need to do
+	 * phys_to_virt.
+	 * In linux kernel 2.0.36, virt_to_bus does nothing, get_free_pages
+	 * returns physical address. But in kernel 2.2.1 upwards,
+	 * get_free_pages returns virtual address, we need to convert it
+	 * to physical address. Then this physical address can be used to
+	 * program hardware registers. */
+	handle->busaddx = virt_to_bus(handle->virtaddx);
+	handle->order = order;
+
+	DPD(3, "__get_free_pages: [%p] %lx\n", handle->virtaddx, handle->busaddx);
+
+	return handle;
+}
+
+void emu10k1_free_memphysical(struct memhandle *handle)
+{
+	free_pages((unsigned long) handle->virtaddx, handle->order);
+	kfree(handle);
+
+	DPD(3, "free_pages: [%p]\n", handle->virtaddx);
+	DPD(3, "kfree: [%p]\n", handle);
+
+	return;
+}

FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)