107 lines
2.4 KiB
C
107 lines
2.4 KiB
C
/* Copyright (c) 2010, The Linux Foundation. All rights reserved.
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 and
|
|
* only version 2 as published by the Free Software Foundation.
|
|
*
|
|
* 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.
|
|
*
|
|
*/
|
|
|
|
#include "vidc_type.h"
|
|
#include "vcd_util.h"
|
|
|
|
u32 vcd_critical_section_create(u32 **p_cs)
|
|
{
|
|
struct mutex *lock;
|
|
if (!p_cs) {
|
|
VCD_MSG_ERROR("Bad critical section ptr");
|
|
return VCD_ERR_BAD_POINTER;
|
|
} else {
|
|
lock = kmalloc(sizeof(struct mutex), GFP_KERNEL);
|
|
if (!lock) {
|
|
VCD_MSG_ERROR("Failed: vcd_critical_section_create");
|
|
return VCD_ERR_ALLOC_FAIL;
|
|
}
|
|
mutex_init(lock);
|
|
*p_cs = (u32 *) lock;
|
|
return VCD_S_SUCCESS;
|
|
}
|
|
}
|
|
|
|
u32 vcd_critical_section_release(u32 *cs)
|
|
{
|
|
struct mutex *lock = (struct mutex *)cs;
|
|
if (!lock) {
|
|
VCD_MSG_ERROR("Bad critical section object");
|
|
return VCD_ERR_BAD_POINTER;
|
|
}
|
|
|
|
mutex_destroy(lock);
|
|
kfree(cs);
|
|
return VCD_S_SUCCESS;
|
|
}
|
|
|
|
u32 vcd_critical_section_enter(u32 *cs)
|
|
{
|
|
struct mutex *lock = (struct mutex *)cs;
|
|
if (!lock) {
|
|
VCD_MSG_ERROR("Bad critical section object");
|
|
return VCD_ERR_BAD_POINTER;
|
|
} else
|
|
mutex_lock(lock);
|
|
|
|
return VCD_S_SUCCESS;
|
|
}
|
|
|
|
u32 vcd_critical_section_leave(u32 *cs)
|
|
{
|
|
struct mutex *lock = (struct mutex *)cs;
|
|
|
|
if (!lock) {
|
|
VCD_MSG_ERROR("Bad critical section object");
|
|
|
|
return VCD_ERR_BAD_POINTER;
|
|
} else
|
|
mutex_unlock(lock);
|
|
|
|
return VCD_S_SUCCESS;
|
|
}
|
|
|
|
int vcd_pmem_alloc(u32 size, u8 **kernel_vaddr, u8 **phy_addr)
|
|
{
|
|
*phy_addr =
|
|
(u8 *) pmem_kalloc(size, PMEM_MEMTYPE | PMEM_ALIGNMENT_4K);
|
|
|
|
if (!IS_ERR((void *)*phy_addr)) {
|
|
|
|
*kernel_vaddr = ioremap((unsigned long)*phy_addr, size);
|
|
|
|
if (!*kernel_vaddr) {
|
|
pr_err("%s: could not ioremap in kernel pmem buffers\n",
|
|
__func__);
|
|
pmem_kfree((s32) *phy_addr);
|
|
return -ENOMEM;
|
|
}
|
|
pr_debug("write buf: phy addr 0x%08x kernel addr 0x%08x\n",
|
|
(u32) *phy_addr, (u32) *kernel_vaddr);
|
|
return 0;
|
|
} else {
|
|
pr_err("%s: could not allocte in kernel pmem buffers\n",
|
|
__func__);
|
|
return -ENOMEM;
|
|
}
|
|
|
|
}
|
|
|
|
int vcd_pmem_free(u8 *kernel_vaddr, u8 *phy_addr)
|
|
{
|
|
iounmap((void *)kernel_vaddr);
|
|
pmem_kfree((s32) phy_addr);
|
|
|
|
return 0;
|
|
}
|