Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 40d8838f authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "msm: ais: fix 8x camera work simultaneously issue"

parents 6e00bd80 e89766ad
Loading
Loading
Loading
Loading
+16 −15
Original line number Diff line number Diff line
@@ -24,7 +24,6 @@
#include "cam_req_mgr_dev.h"

static struct cam_req_mgr_core_device *g_crm_core_dev;
static struct cam_req_mgr_core_link g_links[MAXIMUM_LINKS_PER_SESSION];

void cam_req_mgr_core_link_reset(struct cam_req_mgr_core_link *link)
{
@@ -1527,8 +1526,8 @@ static struct cam_req_mgr_core_link *__cam_req_mgr_reserve_link(
		return NULL;
	}
	for (i = 0; i < MAXIMUM_LINKS_PER_SESSION; i++) {
		if (!atomic_cmpxchg(&g_links[i].is_used, 0, 1)) {
			link = &g_links[i];
		if (!atomic_cmpxchg(&session->links_init[i].is_used, 0, 1)) {
			link = &session->links_init[i];
			CAM_DBG(CAM_CRM, "alloc link index %d", i);
			cam_req_mgr_core_link_reset(link);
			break;
@@ -1595,12 +1594,8 @@ static struct cam_req_mgr_core_link *__cam_req_mgr_reserve_link(
 */
static void __cam_req_mgr_free_link(struct cam_req_mgr_core_link *link)
{
	ptrdiff_t i;
	kfree(link->req.in_q);
	link->req.in_q = NULL;
	i = link - g_links;
	CAM_DBG(CAM_CRM, "free link index %d", i);
	atomic_set(&g_links[i].is_used, 0);
}

/**
@@ -1632,8 +1627,10 @@ static void __cam_req_mgr_unreserve_link(
	}

	for (i = 0; i < MAXIMUM_LINKS_PER_SESSION; i++) {
		if (session->links[i] == link)
		if (session->links[i] == link) {
			atomic_set(&session->links_init[i].is_used, 0);
			session->links[i] = NULL;
		}

		if (link->sync_link) {
			if (link->sync_link == session->links[i])
@@ -2493,6 +2490,7 @@ int cam_req_mgr_create_session(
	struct cam_req_mgr_session_info *ses_info)
{
	int                              rc = 0;
	int                              i = 0;
	int32_t                          session_hdl;
	struct cam_req_mgr_core_session *cam_session = NULL;

@@ -2526,6 +2524,15 @@ int cam_req_mgr_create_session(
	cam_session->num_links = 0;
	cam_session->sync_mode = CAM_REQ_MGR_SYNC_MODE_NO_SYNC;
	list_add(&cam_session->entry, &g_crm_core_dev->session_head);

	for (i = 0; i < MAXIMUM_LINKS_PER_SESSION; i++) {
		mutex_init(&cam_session->links_init[i].lock);
		spin_lock_init(
			&cam_session->links_init[i].link_state_spin_lock);
		atomic_set(&cam_session->links_init[i].is_used, 0);
		cam_req_mgr_core_link_reset(&cam_session->links_init[i]);
	}

	mutex_unlock(&cam_session->lock);
end:
	mutex_unlock(&g_crm_core_dev->crm_lock);
@@ -3122,7 +3129,7 @@ int cam_req_mgr_link_control(struct cam_req_mgr_link_control *control)

int cam_req_mgr_core_device_init(void)
{
	int i;

	CAM_DBG(CAM_CRM, "Enter g_crm_core_dev %pK", g_crm_core_dev);

	if (g_crm_core_dev) {
@@ -3139,12 +3146,6 @@ int cam_req_mgr_core_device_init(void)
	mutex_init(&g_crm_core_dev->crm_lock);
	cam_req_mgr_debug_register(g_crm_core_dev);

	for (i = 0; i < MAXIMUM_LINKS_PER_SESSION; i++) {
		mutex_init(&g_links[i].lock);
		spin_lock_init(&g_links[i].link_state_spin_lock);
		atomic_set(&g_links[i].is_used, 0);
		cam_req_mgr_core_link_reset(&g_links[i]);
	}
	return 0;
}

+1 −0
Original line number Diff line number Diff line
@@ -365,6 +365,7 @@ struct cam_req_mgr_core_session {
	int32_t                       session_hdl;
	uint32_t                      num_links;
	struct cam_req_mgr_core_link *links[MAXIMUM_LINKS_PER_SESSION];
	struct cam_req_mgr_core_link  links_init[MAXIMUM_LINKS_PER_SESSION];
	struct list_head              entry;
	struct mutex                  lock;
	int32_t                       force_err_recovery;