M7350/kernel/drivers/video/msm/vidc/common/vcd/vcd_util.c

107 lines
2.4 KiB
C
Raw Normal View History

2024-09-09 08:52:07 +00:00
/* 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;
}