Merge 975d708f86 on remote branch
Change-Id: If701250dca5a0cdc3138b952ed415e9aa351563a
This commit is contained in:
commit
d43346f693
32 changed files with 286 additions and 38 deletions
|
|
@ -1,4 +1,4 @@
|
||||||
/* Copyright (c) 2012-2021, The Linux Foundation. All rights reserved.
|
/* Copyright (c) 2012-2022, The Linux Foundation. All rights reserved.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License version 2 and
|
||||||
|
|
@ -1619,7 +1619,6 @@ static int diag_send_dci_pkt(struct diag_cmd_reg_t *entry,
|
||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
|
|
||||||
mutex_lock(&driver->dci_mutex);
|
|
||||||
/* prepare DCI packet */
|
/* prepare DCI packet */
|
||||||
header.start = CONTROL_CHAR;
|
header.start = CONTROL_CHAR;
|
||||||
header.version = 1;
|
header.version = 1;
|
||||||
|
|
@ -1638,7 +1637,6 @@ static int diag_send_dci_pkt(struct diag_cmd_reg_t *entry,
|
||||||
diag_update_pkt_buffer(driver->apps_dci_buf, write_len,
|
diag_update_pkt_buffer(driver->apps_dci_buf, write_len,
|
||||||
DCI_PKT_TYPE);
|
DCI_PKT_TYPE);
|
||||||
diag_update_sleeping_process(entry->pid, DCI_PKT_TYPE);
|
diag_update_sleeping_process(entry->pid, DCI_PKT_TYPE);
|
||||||
mutex_unlock(&driver->dci_mutex);
|
|
||||||
return DIAG_DCI_NO_ERROR;
|
return DIAG_DCI_NO_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1658,7 +1656,6 @@ static int diag_send_dci_pkt(struct diag_cmd_reg_t *entry,
|
||||||
entry->proc);
|
entry->proc);
|
||||||
status = DIAG_DCI_SEND_DATA_FAIL;
|
status = DIAG_DCI_SEND_DATA_FAIL;
|
||||||
}
|
}
|
||||||
mutex_unlock(&driver->dci_mutex);
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1984,12 +1981,13 @@ static int diag_process_dci_pkt_rsp(unsigned char *buf, int len)
|
||||||
{
|
{
|
||||||
int ret = DIAG_DCI_TABLE_ERR;
|
int ret = DIAG_DCI_TABLE_ERR;
|
||||||
int common_cmd = 0, header_len = 0;
|
int common_cmd = 0, header_len = 0;
|
||||||
|
int req_tag = 0;
|
||||||
struct diag_pkt_header_t *header = NULL;
|
struct diag_pkt_header_t *header = NULL;
|
||||||
unsigned char *temp = buf;
|
unsigned char *temp = buf;
|
||||||
unsigned char *req_buf = NULL;
|
unsigned char *req_buf = NULL;
|
||||||
uint8_t retry_count = 0, max_retries = 3;
|
uint8_t retry_count = 0, max_retries = 3;
|
||||||
uint32_t read_len = 0, req_len = len;
|
uint32_t read_len = 0, req_len = len;
|
||||||
struct dci_pkt_req_entry_t *req_entry = NULL;
|
struct dci_pkt_req_entry_t *req_entry = NULL, *test_entry = NULL;
|
||||||
struct diag_dci_client_tbl *dci_entry = NULL;
|
struct diag_dci_client_tbl *dci_entry = NULL;
|
||||||
struct dci_pkt_req_t req_hdr;
|
struct dci_pkt_req_t req_hdr;
|
||||||
struct diag_cmd_reg_t *reg_item;
|
struct diag_cmd_reg_t *reg_item;
|
||||||
|
|
@ -2093,6 +2091,7 @@ static int diag_process_dci_pkt_rsp(unsigned char *buf, int len)
|
||||||
mutex_unlock(&driver->dci_mutex);
|
mutex_unlock(&driver->dci_mutex);
|
||||||
return DIAG_DCI_NO_REG;
|
return DIAG_DCI_NO_REG;
|
||||||
}
|
}
|
||||||
|
req_tag = req_entry->tag;
|
||||||
mutex_unlock(&driver->dci_mutex);
|
mutex_unlock(&driver->dci_mutex);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -2100,14 +2099,14 @@ static int diag_process_dci_pkt_rsp(unsigned char *buf, int len)
|
||||||
* remote processor
|
* remote processor
|
||||||
*/
|
*/
|
||||||
if (dci_entry->client_info.token > 0) {
|
if (dci_entry->client_info.token > 0) {
|
||||||
ret = diag_send_dci_pkt_remote(req_buf, req_len, req_entry->tag,
|
ret = diag_send_dci_pkt_remote(req_buf, req_len, req_tag,
|
||||||
dci_entry->client_info.token);
|
dci_entry->client_info.token);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check if it is a dedicated Apps command */
|
/* Check if it is a dedicated Apps command */
|
||||||
ret = diag_dci_process_apps_pkt(header, req_buf, req_len,
|
ret = diag_dci_process_apps_pkt(header, req_buf, req_len,
|
||||||
req_entry->tag, header_len);
|
req_tag, header_len);
|
||||||
if ((ret == DIAG_DCI_NO_ERROR && !common_cmd) || ret < 0)
|
if ((ret == DIAG_DCI_NO_ERROR && !common_cmd) || ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
|
@ -2130,8 +2129,14 @@ static int diag_process_dci_pkt_rsp(unsigned char *buf, int len)
|
||||||
if (temp_entry) {
|
if (temp_entry) {
|
||||||
reg_item = container_of(temp_entry, struct diag_cmd_reg_t,
|
reg_item = container_of(temp_entry, struct diag_cmd_reg_t,
|
||||||
entry);
|
entry);
|
||||||
ret = diag_send_dci_pkt(reg_item, req_buf, req_len,
|
mutex_lock(&driver->dci_mutex);
|
||||||
req_entry->tag);
|
test_entry = diag_dci_get_request_entry(req_tag);
|
||||||
|
if (test_entry)
|
||||||
|
ret = diag_send_dci_pkt(reg_item, req_buf, req_len,
|
||||||
|
test_entry->tag);
|
||||||
|
else
|
||||||
|
ret = -EIO;
|
||||||
|
mutex_unlock(&driver->dci_mutex);
|
||||||
} else {
|
} else {
|
||||||
DIAG_LOG(DIAG_DEBUG_DCI, "Command not found: %02x %02x %02x\n",
|
DIAG_LOG(DIAG_DEBUG_DCI, "Command not found: %02x %02x %02x\n",
|
||||||
reg_entry.cmd_code, reg_entry.subsys_id,
|
reg_entry.cmd_code, reg_entry.subsys_id,
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
/* Copyright (c) 2017, The Linux Foundation. All rights reserved.
|
/* Copyright (c) 2017-2018, 2021 The Linux Foundation. All rights reserved.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License version 2 and
|
||||||
|
|
@ -60,8 +60,10 @@ static long cam_subdev_ioctl(struct v4l2_subdev *sd, unsigned int cmd,
|
||||||
|
|
||||||
switch (cmd) {
|
switch (cmd) {
|
||||||
case VIDIOC_CAM_CONTROL:
|
case VIDIOC_CAM_CONTROL:
|
||||||
|
cam_req_mgr_rwsem_read_op(CAM_SUBDEV_LOCK);
|
||||||
rc = cam_node_handle_ioctl(node,
|
rc = cam_node_handle_ioctl(node,
|
||||||
(struct cam_control *) arg);
|
(struct cam_control *) arg);
|
||||||
|
cam_req_mgr_rwsem_read_op(CAM_SUBDEV_UNLOCK);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
CAM_ERR(CAM_CORE, "Invalid command %d for %s", cmd,
|
CAM_ERR(CAM_CORE, "Invalid command %d for %s", cmd,
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
/* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
|
/* Copyright (c) 2017-2018, 2021 The Linux Foundation. All rights reserved.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License version 2 and
|
||||||
|
|
@ -50,8 +50,11 @@ static int cam_fd_dev_open(struct v4l2_subdev *sd,
|
||||||
{
|
{
|
||||||
struct cam_fd_dev *fd_dev = &g_fd_dev;
|
struct cam_fd_dev *fd_dev = &g_fd_dev;
|
||||||
|
|
||||||
|
cam_req_mgr_rwsem_read_op(CAM_SUBDEV_LOCK);
|
||||||
|
|
||||||
if (!fd_dev->probe_done) {
|
if (!fd_dev->probe_done) {
|
||||||
CAM_ERR(CAM_FD, "FD Dev not initialized, fd_dev=%pK", fd_dev);
|
CAM_ERR(CAM_FD, "FD Dev not initialized, fd_dev=%pK", fd_dev);
|
||||||
|
cam_req_mgr_rwsem_read_op(CAM_SUBDEV_UNLOCK);
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -60,6 +63,8 @@ static int cam_fd_dev_open(struct v4l2_subdev *sd,
|
||||||
CAM_DBG(CAM_FD, "FD Subdev open count %d", fd_dev->open_cnt);
|
CAM_DBG(CAM_FD, "FD Subdev open count %d", fd_dev->open_cnt);
|
||||||
mutex_unlock(&fd_dev->lock);
|
mutex_unlock(&fd_dev->lock);
|
||||||
|
|
||||||
|
cam_req_mgr_rwsem_read_op(CAM_SUBDEV_UNLOCK);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
/* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
|
/* Copyright (c) 2017-2018, 2021The Linux Foundation. All rights reserved.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License version 2 and
|
||||||
|
|
@ -82,6 +82,8 @@ static int cam_icp_subdev_open(struct v4l2_subdev *sd,
|
||||||
struct cam_node *node = v4l2_get_subdevdata(sd);
|
struct cam_node *node = v4l2_get_subdevdata(sd);
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
|
|
||||||
|
cam_req_mgr_rwsem_read_op(CAM_SUBDEV_LOCK);
|
||||||
|
|
||||||
mutex_lock(&g_icp_dev.icp_lock);
|
mutex_lock(&g_icp_dev.icp_lock);
|
||||||
if (g_icp_dev.open_cnt >= 1) {
|
if (g_icp_dev.open_cnt >= 1) {
|
||||||
CAM_ERR(CAM_ICP, "ICP subdev is already opened");
|
CAM_ERR(CAM_ICP, "ICP subdev is already opened");
|
||||||
|
|
@ -104,6 +106,7 @@ static int cam_icp_subdev_open(struct v4l2_subdev *sd,
|
||||||
g_icp_dev.open_cnt++;
|
g_icp_dev.open_cnt++;
|
||||||
end:
|
end:
|
||||||
mutex_unlock(&g_icp_dev.icp_lock);
|
mutex_unlock(&g_icp_dev.icp_lock);
|
||||||
|
cam_req_mgr_rwsem_read_op(CAM_SUBDEV_UNLOCK);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
/* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
|
/* Copyright (c) 2017-2018, 2021 The Linux Foundation. All rights reserved.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License version 2 and
|
||||||
|
|
@ -59,10 +59,14 @@ static const struct of_device_id cam_isp_dt_match[] = {
|
||||||
static int cam_isp_subdev_open(struct v4l2_subdev *sd,
|
static int cam_isp_subdev_open(struct v4l2_subdev *sd,
|
||||||
struct v4l2_subdev_fh *fh)
|
struct v4l2_subdev_fh *fh)
|
||||||
{
|
{
|
||||||
|
cam_req_mgr_rwsem_read_op(CAM_SUBDEV_LOCK);
|
||||||
|
|
||||||
mutex_lock(&g_isp_dev.isp_mutex);
|
mutex_lock(&g_isp_dev.isp_mutex);
|
||||||
g_isp_dev.open_cnt++;
|
g_isp_dev.open_cnt++;
|
||||||
mutex_unlock(&g_isp_dev.isp_mutex);
|
mutex_unlock(&g_isp_dev.isp_mutex);
|
||||||
|
|
||||||
|
cam_req_mgr_rwsem_read_op(CAM_SUBDEV_UNLOCK);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
/* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
|
/* Copyright (c) 2017-2018, 2021 The Linux Foundation. All rights reserved.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License version 2 and
|
||||||
|
|
@ -57,11 +57,14 @@ static const struct of_device_id cam_jpeg_dt_match[] = {
|
||||||
static int cam_jpeg_subdev_open(struct v4l2_subdev *sd,
|
static int cam_jpeg_subdev_open(struct v4l2_subdev *sd,
|
||||||
struct v4l2_subdev_fh *fh)
|
struct v4l2_subdev_fh *fh)
|
||||||
{
|
{
|
||||||
|
cam_req_mgr_rwsem_read_op(CAM_SUBDEV_LOCK);
|
||||||
|
|
||||||
mutex_lock(&g_jpeg_dev.jpeg_mutex);
|
mutex_lock(&g_jpeg_dev.jpeg_mutex);
|
||||||
g_jpeg_dev.open_cnt++;
|
g_jpeg_dev.open_cnt++;
|
||||||
mutex_unlock(&g_jpeg_dev.jpeg_mutex);
|
mutex_unlock(&g_jpeg_dev.jpeg_mutex);
|
||||||
|
|
||||||
|
cam_req_mgr_rwsem_read_op(CAM_SUBDEV_UNLOCK);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
/* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
|
/* Copyright (c) 2017-2018, 2021 The Linux Foundation. All rights reserved.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License version 2 and
|
||||||
|
|
@ -65,9 +65,12 @@ static int cam_lrme_dev_open(struct v4l2_subdev *sd,
|
||||||
{
|
{
|
||||||
struct cam_lrme_dev *lrme_dev = g_lrme_dev;
|
struct cam_lrme_dev *lrme_dev = g_lrme_dev;
|
||||||
|
|
||||||
|
cam_req_mgr_rwsem_read_op(CAM_SUBDEV_LOCK);
|
||||||
|
|
||||||
if (!lrme_dev) {
|
if (!lrme_dev) {
|
||||||
CAM_ERR(CAM_LRME,
|
CAM_ERR(CAM_LRME,
|
||||||
"LRME Dev not initialized, dev=%pK", lrme_dev);
|
"LRME Dev not initialized, dev=%pK", lrme_dev);
|
||||||
|
cam_req_mgr_rwsem_read_op(CAM_SUBDEV_UNLOCK);
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -75,6 +78,8 @@ static int cam_lrme_dev_open(struct v4l2_subdev *sd,
|
||||||
lrme_dev->open_cnt++;
|
lrme_dev->open_cnt++;
|
||||||
mutex_unlock(&lrme_dev->lock);
|
mutex_unlock(&lrme_dev->lock);
|
||||||
|
|
||||||
|
cam_req_mgr_rwsem_read_op(CAM_SUBDEV_UNLOCK);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
|
#include <linux/rwsem.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <media/v4l2-fh.h>
|
#include <media/v4l2-fh.h>
|
||||||
|
|
@ -33,6 +34,8 @@
|
||||||
static struct cam_req_mgr_device g_dev;
|
static struct cam_req_mgr_device g_dev;
|
||||||
struct kmem_cache *g_cam_req_mgr_timer_cachep;
|
struct kmem_cache *g_cam_req_mgr_timer_cachep;
|
||||||
|
|
||||||
|
DECLARE_RWSEM(rwsem_lock);
|
||||||
|
|
||||||
static int cam_media_device_setup(struct device *dev)
|
static int cam_media_device_setup(struct device *dev)
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
|
|
@ -98,10 +101,28 @@ static void cam_v4l2_device_cleanup(void)
|
||||||
g_dev.v4l2_dev = NULL;
|
g_dev.v4l2_dev = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void cam_req_mgr_rwsem_read_op(enum cam_subdev_rwsem lock)
|
||||||
|
{
|
||||||
|
if (lock == CAM_SUBDEV_LOCK)
|
||||||
|
down_read(&rwsem_lock);
|
||||||
|
else if (lock == CAM_SUBDEV_UNLOCK)
|
||||||
|
up_read(&rwsem_lock);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void cam_req_mgr_rwsem_write_op(enum cam_subdev_rwsem lock)
|
||||||
|
{
|
||||||
|
if (lock == CAM_SUBDEV_LOCK)
|
||||||
|
down_write(&rwsem_lock);
|
||||||
|
else if (lock == CAM_SUBDEV_UNLOCK)
|
||||||
|
up_write(&rwsem_lock);
|
||||||
|
}
|
||||||
|
|
||||||
static int cam_req_mgr_open(struct file *filep)
|
static int cam_req_mgr_open(struct file *filep)
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
|
cam_req_mgr_rwsem_write_op(CAM_SUBDEV_LOCK);
|
||||||
|
|
||||||
mutex_lock(&g_dev.cam_lock);
|
mutex_lock(&g_dev.cam_lock);
|
||||||
if (g_dev.open_cnt >= 1) {
|
if (g_dev.open_cnt >= 1) {
|
||||||
rc = -EALREADY;
|
rc = -EALREADY;
|
||||||
|
|
@ -127,12 +148,14 @@ static int cam_req_mgr_open(struct file *filep)
|
||||||
}
|
}
|
||||||
|
|
||||||
mutex_unlock(&g_dev.cam_lock);
|
mutex_unlock(&g_dev.cam_lock);
|
||||||
|
cam_req_mgr_rwsem_write_op(CAM_SUBDEV_UNLOCK);
|
||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
mem_mgr_init_fail:
|
mem_mgr_init_fail:
|
||||||
v4l2_fh_release(filep);
|
v4l2_fh_release(filep);
|
||||||
end:
|
end:
|
||||||
mutex_unlock(&g_dev.cam_lock);
|
mutex_unlock(&g_dev.cam_lock);
|
||||||
|
cam_req_mgr_rwsem_write_op(CAM_SUBDEV_UNLOCK);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -158,10 +181,13 @@ static int cam_req_mgr_close(struct file *filep)
|
||||||
struct v4l2_fh *vfh = filep->private_data;
|
struct v4l2_fh *vfh = filep->private_data;
|
||||||
struct v4l2_subdev_fh *subdev_fh = to_v4l2_subdev_fh(vfh);
|
struct v4l2_subdev_fh *subdev_fh = to_v4l2_subdev_fh(vfh);
|
||||||
|
|
||||||
|
cam_req_mgr_rwsem_write_op(CAM_SUBDEV_LOCK);
|
||||||
|
|
||||||
mutex_lock(&g_dev.cam_lock);
|
mutex_lock(&g_dev.cam_lock);
|
||||||
|
|
||||||
if (g_dev.open_cnt <= 0) {
|
if (g_dev.open_cnt <= 0) {
|
||||||
mutex_unlock(&g_dev.cam_lock);
|
mutex_unlock(&g_dev.cam_lock);
|
||||||
|
cam_req_mgr_rwsem_write_op(CAM_SUBDEV_UNLOCK);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -188,6 +214,8 @@ static int cam_req_mgr_close(struct file *filep)
|
||||||
cam_mem_mgr_deinit();
|
cam_mem_mgr_deinit();
|
||||||
mutex_unlock(&g_dev.cam_lock);
|
mutex_unlock(&g_dev.cam_lock);
|
||||||
|
|
||||||
|
cam_req_mgr_rwsem_write_op(CAM_SUBDEV_UNLOCK);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -536,6 +564,18 @@ void cam_register_subdev_fops(struct v4l2_file_operations *fops)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(cam_register_subdev_fops);
|
EXPORT_SYMBOL(cam_register_subdev_fops);
|
||||||
|
|
||||||
|
bool cam_req_mgr_is_open(void)
|
||||||
|
{
|
||||||
|
bool crm_status;
|
||||||
|
|
||||||
|
mutex_lock(&g_dev.cam_lock);
|
||||||
|
crm_status = g_dev.open_cnt ? true : false;
|
||||||
|
mutex_unlock(&g_dev.cam_lock);
|
||||||
|
|
||||||
|
return crm_status;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(cam_req_mgr_is_open);
|
||||||
|
|
||||||
int cam_register_subdev(struct cam_subdev *csd)
|
int cam_register_subdev(struct cam_subdev *csd)
|
||||||
{
|
{
|
||||||
struct v4l2_subdev *sd;
|
struct v4l2_subdev *sd;
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,7 @@
|
||||||
#include <media/cam_req_mgr.h>
|
#include <media/cam_req_mgr.h>
|
||||||
#include "cam_req_mgr_util.h"
|
#include "cam_req_mgr_util.h"
|
||||||
#include "cam_debug_util.h"
|
#include "cam_debug_util.h"
|
||||||
|
#include "cam_subdev.h"
|
||||||
|
|
||||||
static struct cam_req_mgr_util_hdl_tbl *hdl_tbl;
|
static struct cam_req_mgr_util_hdl_tbl *hdl_tbl;
|
||||||
static DEFINE_SPINLOCK(hdl_tbl_lock);
|
static DEFINE_SPINLOCK(hdl_tbl_lock);
|
||||||
|
|
@ -166,6 +167,14 @@ int32_t cam_create_device_hdl(struct cam_create_dev_hdl *hdl_data)
|
||||||
int idx;
|
int idx;
|
||||||
int rand = 0;
|
int rand = 0;
|
||||||
int32_t handle;
|
int32_t handle;
|
||||||
|
bool crm_active;
|
||||||
|
|
||||||
|
crm_active = cam_req_mgr_is_open();
|
||||||
|
if (!crm_active) {
|
||||||
|
CAM_ERR(CAM_ICP, "CRM is not ACTIVE");
|
||||||
|
spin_unlock_bh(&hdl_tbl_lock);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
spin_lock_bh(&hdl_tbl_lock);
|
spin_lock_bh(&hdl_tbl_lock);
|
||||||
if (!hdl_tbl) {
|
if (!hdl_tbl) {
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
/* Copyright (c) 2017, The Linux Foundation. All rights reserved.
|
/* Copyright (c) 2017-2018, 2021 The Linux Foundation. All rights reserved.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License version 2 and
|
||||||
|
|
@ -23,6 +23,11 @@
|
||||||
|
|
||||||
#define CAM_SUBDEVICE_EVENT_MAX 30
|
#define CAM_SUBDEVICE_EVENT_MAX 30
|
||||||
|
|
||||||
|
enum cam_subdev_rwsem {
|
||||||
|
CAM_SUBDEV_LOCK = 1,
|
||||||
|
CAM_SUBDEV_UNLOCK,
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* struct cam_subdev - describes a camera sub-device
|
* struct cam_subdev - describes a camera sub-device
|
||||||
*
|
*
|
||||||
|
|
@ -112,4 +117,21 @@ int cam_register_subdev(struct cam_subdev *sd);
|
||||||
*/
|
*/
|
||||||
int cam_unregister_subdev(struct cam_subdev *sd);
|
int cam_unregister_subdev(struct cam_subdev *sd);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* cam_req_mgr_rwsem_read_op()
|
||||||
|
*
|
||||||
|
* @brief : API to acquire read semaphore lock to platform framework.
|
||||||
|
*
|
||||||
|
* @lock : value indicates to lock or unlock the read lock
|
||||||
|
*/
|
||||||
|
void cam_req_mgr_rwsem_read_op(enum cam_subdev_rwsem lock);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* cam_req_mgr_is_open()
|
||||||
|
*
|
||||||
|
* @brief: This common utility function returns the crm active status
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
bool cam_req_mgr_is_open(void);
|
||||||
|
|
||||||
#endif /* _CAM_SUBDEV_H_ */
|
#endif /* _CAM_SUBDEV_H_ */
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
/* Copyright (c) 2017-2019, The Linux Foundation. All rights reserved.
|
/* Copyright (c) 2017-2019, 2021 The Linux Foundation. All rights reserved.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License version 2 and
|
||||||
|
|
@ -748,6 +748,11 @@ int32_t cam_actuator_driver_cmd(struct cam_actuator_ctrl_t *a_ctrl,
|
||||||
|
|
||||||
actuator_acq_dev.device_handle =
|
actuator_acq_dev.device_handle =
|
||||||
cam_create_device_hdl(&bridge_params);
|
cam_create_device_hdl(&bridge_params);
|
||||||
|
if (actuator_acq_dev.device_handle <= 0) {
|
||||||
|
rc = -EFAULT;
|
||||||
|
CAM_ERR(CAM_ACTUATOR, "Can not create device handle");
|
||||||
|
goto release_mutex;
|
||||||
|
}
|
||||||
a_ctrl->bridge_intf.device_hdl = actuator_acq_dev.device_handle;
|
a_ctrl->bridge_intf.device_hdl = actuator_acq_dev.device_handle;
|
||||||
a_ctrl->bridge_intf.session_hdl =
|
a_ctrl->bridge_intf.session_hdl =
|
||||||
actuator_acq_dev.session_handle;
|
actuator_acq_dev.session_handle;
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
/* Copyright (c) 2017-2019, The Linux Foundation. All rights reserved.
|
/* Copyright (c) 2017-2020, 2021 The Linux Foundation. All rights reserved.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License version 2 and
|
||||||
|
|
@ -629,6 +629,12 @@ int32_t cam_csiphy_core_cfg(void *phy_dev,
|
||||||
|
|
||||||
csiphy_acq_dev.device_handle =
|
csiphy_acq_dev.device_handle =
|
||||||
cam_create_device_hdl(&bridge_params);
|
cam_create_device_hdl(&bridge_params);
|
||||||
|
if (csiphy_acq_dev.device_handle <= 0) {
|
||||||
|
rc = -EFAULT;
|
||||||
|
CAM_ERR(CAM_CSIPHY, "Can not create device handle");
|
||||||
|
goto release_mutex;
|
||||||
|
}
|
||||||
|
|
||||||
bridge_intf = &csiphy_dev->bridge_intf;
|
bridge_intf = &csiphy_dev->bridge_intf;
|
||||||
bridge_intf->device_hdl[csiphy_acq_params.combo_mode]
|
bridge_intf->device_hdl[csiphy_acq_params.combo_mode]
|
||||||
= csiphy_acq_dev.device_handle;
|
= csiphy_acq_dev.device_handle;
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
/* Copyright (c) 2017-2019, The Linux Foundation. All rights reserved.
|
/* Copyright (c) 2017-2020, 2021 The Linux Foundation. All rights reserved.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License version 2 and
|
||||||
|
|
@ -360,6 +360,10 @@ static int32_t cam_eeprom_get_dev_handle(struct cam_eeprom_ctrl_t *e_ctrl,
|
||||||
|
|
||||||
eeprom_acq_dev.device_handle =
|
eeprom_acq_dev.device_handle =
|
||||||
cam_create_device_hdl(&bridge_params);
|
cam_create_device_hdl(&bridge_params);
|
||||||
|
if (eeprom_acq_dev.device_handle <= 0) {
|
||||||
|
CAM_ERR(CAM_EEPROM, "Can not create device handle");
|
||||||
|
return -EFAULT;
|
||||||
|
}
|
||||||
e_ctrl->bridge_intf.device_hdl = eeprom_acq_dev.device_handle;
|
e_ctrl->bridge_intf.device_hdl = eeprom_acq_dev.device_handle;
|
||||||
e_ctrl->bridge_intf.session_hdl = eeprom_acq_dev.session_handle;
|
e_ctrl->bridge_intf.session_hdl = eeprom_acq_dev.session_handle;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
/* Copyright (c) 2017-2019, The Linux Foundation. All rights reserved.
|
/* Copyright (c) 2017-2019, 2021 The Linux Foundation. All rights reserved.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License version 2 and
|
||||||
|
|
@ -74,6 +74,11 @@ static int32_t cam_flash_driver_cmd(struct cam_flash_ctrl *fctrl,
|
||||||
|
|
||||||
flash_acq_dev.device_handle =
|
flash_acq_dev.device_handle =
|
||||||
cam_create_device_hdl(&bridge_params);
|
cam_create_device_hdl(&bridge_params);
|
||||||
|
if (flash_acq_dev.device_handle <= 0) {
|
||||||
|
rc = -EFAULT;
|
||||||
|
CAM_ERR(CAM_FLASH, "Can not create device handle");
|
||||||
|
goto release_mutex;
|
||||||
|
}
|
||||||
fctrl->bridge_intf.device_hdl =
|
fctrl->bridge_intf.device_hdl =
|
||||||
flash_acq_dev.device_handle;
|
flash_acq_dev.device_handle;
|
||||||
fctrl->bridge_intf.session_hdl =
|
fctrl->bridge_intf.session_hdl =
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
/* Copyright (c) 2017-2019, The Linux Foundation. All rights reserved.
|
/* Copyright (c) 2017-2019, 2021 The Linux Foundation. All rights reserved.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License version 2 and
|
||||||
|
|
@ -93,6 +93,10 @@ static int cam_ois_get_dev_handle(struct cam_ois_ctrl_t *o_ctrl,
|
||||||
|
|
||||||
ois_acq_dev.device_handle =
|
ois_acq_dev.device_handle =
|
||||||
cam_create_device_hdl(&bridge_params);
|
cam_create_device_hdl(&bridge_params);
|
||||||
|
if (ois_acq_dev.device_handle <= 0) {
|
||||||
|
CAM_ERR(CAM_OIS, "Can not create device handle");
|
||||||
|
return -EFAULT;
|
||||||
|
}
|
||||||
o_ctrl->bridge_intf.device_hdl = ois_acq_dev.device_handle;
|
o_ctrl->bridge_intf.device_hdl = ois_acq_dev.device_handle;
|
||||||
o_ctrl->bridge_intf.session_hdl = ois_acq_dev.session_handle;
|
o_ctrl->bridge_intf.session_hdl = ois_acq_dev.session_handle;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -723,6 +723,11 @@ int32_t cam_sensor_driver_cmd(struct cam_sensor_ctrl_t *s_ctrl,
|
||||||
|
|
||||||
sensor_acq_dev.device_handle =
|
sensor_acq_dev.device_handle =
|
||||||
cam_create_device_hdl(&bridge_params);
|
cam_create_device_hdl(&bridge_params);
|
||||||
|
if (sensor_acq_dev.device_handle <= 0) {
|
||||||
|
rc = -EFAULT;
|
||||||
|
CAM_ERR(CAM_SENSOR, "Can not create device handle");
|
||||||
|
goto release_mutex;
|
||||||
|
}
|
||||||
s_ctrl->bridge_intf.device_hdl = sensor_acq_dev.device_handle;
|
s_ctrl->bridge_intf.device_hdl = sensor_acq_dev.device_handle;
|
||||||
s_ctrl->bridge_intf.session_hdl = sensor_acq_dev.session_handle;
|
s_ctrl->bridge_intf.session_hdl = sensor_acq_dev.session_handle;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -243,35 +243,34 @@ int cam_cdm_stream_ops_internal(void *hw_priv,
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
core = (struct cam_cdm *)cdm_hw->core_info;
|
core = (struct cam_cdm *)cdm_hw->core_info;
|
||||||
|
mutex_lock(&cdm_hw->hw_mutex);
|
||||||
client_idx = CAM_CDM_GET_CLIENT_IDX(*handle);
|
client_idx = CAM_CDM_GET_CLIENT_IDX(*handle);
|
||||||
client = core->clients[client_idx];
|
client = core->clients[client_idx];
|
||||||
if (!client) {
|
if (!client) {
|
||||||
CAM_ERR(CAM_CDM, "Invalid client %pK hdl=%x", client, *handle);
|
CAM_ERR(CAM_CDM, "Invalid client %pK hdl=%x", client, *handle);
|
||||||
|
mutex_unlock(&cdm_hw->hw_mutex);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
cam_cdm_get_client_refcount(client);
|
cam_cdm_get_client_refcount(client);
|
||||||
if (*handle != client->handle) {
|
if (*handle != client->handle) {
|
||||||
CAM_ERR(CAM_CDM, "client id given handle=%x invalid", *handle);
|
CAM_ERR(CAM_CDM, "client id given handle=%x invalid", *handle);
|
||||||
cam_cdm_put_client_refcount(client);
|
rc = -EINVAL;
|
||||||
return -EINVAL;
|
goto end;
|
||||||
}
|
}
|
||||||
if (operation == true) {
|
if (operation == true) {
|
||||||
if (true == client->stream_on) {
|
if (true == client->stream_on) {
|
||||||
CAM_ERR(CAM_CDM,
|
CAM_ERR(CAM_CDM,
|
||||||
"Invalid CDM client is already streamed ON");
|
"Invalid CDM client is already streamed ON");
|
||||||
cam_cdm_put_client_refcount(client);
|
goto end;
|
||||||
return rc;
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (client->stream_on == false) {
|
if (client->stream_on == false) {
|
||||||
CAM_ERR(CAM_CDM,
|
CAM_ERR(CAM_CDM,
|
||||||
"Invalid CDM client is already streamed Off");
|
"Invalid CDM client is already streamed Off");
|
||||||
cam_cdm_put_client_refcount(client);
|
goto end;
|
||||||
return rc;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mutex_lock(&cdm_hw->hw_mutex);
|
|
||||||
if (operation == true) {
|
if (operation == true) {
|
||||||
if (!cdm_hw->open_count) {
|
if (!cdm_hw->open_count) {
|
||||||
struct cam_ahb_vote ahb_vote;
|
struct cam_ahb_vote ahb_vote;
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
/* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
|
/* Copyright (c) 2017-2018, 2021 The Linux Foundation. All rights reserved.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License version 2 and
|
||||||
|
|
@ -60,8 +60,10 @@ static long cam_subdev_ioctl(struct v4l2_subdev *sd, unsigned int cmd,
|
||||||
|
|
||||||
switch (cmd) {
|
switch (cmd) {
|
||||||
case VIDIOC_CAM_CONTROL:
|
case VIDIOC_CAM_CONTROL:
|
||||||
|
cam_req_mgr_rwsem_read_op(CAM_SUBDEV_LOCK);
|
||||||
rc = cam_node_handle_ioctl(node,
|
rc = cam_node_handle_ioctl(node,
|
||||||
(struct cam_control *) arg);
|
(struct cam_control *) arg);
|
||||||
|
cam_req_mgr_rwsem_read_op(CAM_SUBDEV_UNLOCK);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
CAM_ERR(CAM_CORE, "Invalid command %d for %s", cmd,
|
CAM_ERR(CAM_CORE, "Invalid command %d for %s", cmd,
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
/* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
|
/* Copyright (c) 2017-2018, 2021 The Linux Foundation. All rights reserved.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License version 2 and
|
||||||
|
|
@ -50,8 +50,11 @@ static int cam_fd_dev_open(struct v4l2_subdev *sd,
|
||||||
{
|
{
|
||||||
struct cam_fd_dev *fd_dev = &g_fd_dev;
|
struct cam_fd_dev *fd_dev = &g_fd_dev;
|
||||||
|
|
||||||
|
cam_req_mgr_rwsem_read_op(CAM_SUBDEV_LOCK);
|
||||||
|
|
||||||
if (!fd_dev->probe_done) {
|
if (!fd_dev->probe_done) {
|
||||||
CAM_ERR(CAM_FD, "FD Dev not initialized, fd_dev=%pK", fd_dev);
|
CAM_ERR(CAM_FD, "FD Dev not initialized, fd_dev=%pK", fd_dev);
|
||||||
|
cam_req_mgr_rwsem_read_op(CAM_SUBDEV_UNLOCK);
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -60,6 +63,8 @@ static int cam_fd_dev_open(struct v4l2_subdev *sd,
|
||||||
CAM_DBG(CAM_FD, "FD Subdev open count %d", fd_dev->open_cnt);
|
CAM_DBG(CAM_FD, "FD Subdev open count %d", fd_dev->open_cnt);
|
||||||
mutex_unlock(&fd_dev->lock);
|
mutex_unlock(&fd_dev->lock);
|
||||||
|
|
||||||
|
cam_req_mgr_rwsem_read_op(CAM_SUBDEV_UNLOCK);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
/* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
|
/* Copyright (c) 2017-2018, 2021The Linux Foundation. All rights reserved.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License version 2 and
|
||||||
|
|
@ -82,6 +82,8 @@ static int cam_icp_subdev_open(struct v4l2_subdev *sd,
|
||||||
struct cam_node *node = v4l2_get_subdevdata(sd);
|
struct cam_node *node = v4l2_get_subdevdata(sd);
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
|
|
||||||
|
cam_req_mgr_rwsem_read_op(CAM_SUBDEV_LOCK);
|
||||||
|
|
||||||
mutex_lock(&g_icp_dev.icp_lock);
|
mutex_lock(&g_icp_dev.icp_lock);
|
||||||
if (g_icp_dev.open_cnt >= 1) {
|
if (g_icp_dev.open_cnt >= 1) {
|
||||||
CAM_ERR(CAM_ICP, "ICP subdev is already opened");
|
CAM_ERR(CAM_ICP, "ICP subdev is already opened");
|
||||||
|
|
@ -104,6 +106,7 @@ static int cam_icp_subdev_open(struct v4l2_subdev *sd,
|
||||||
g_icp_dev.open_cnt++;
|
g_icp_dev.open_cnt++;
|
||||||
end:
|
end:
|
||||||
mutex_unlock(&g_icp_dev.icp_lock);
|
mutex_unlock(&g_icp_dev.icp_lock);
|
||||||
|
cam_req_mgr_rwsem_read_op(CAM_SUBDEV_UNLOCK);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue