Merge ce9b4b3f12 on remote branch

Change-Id: Iac93b676c0af9002e5e02402043e823ce92b3fc6
This commit is contained in:
Linux Build Service Account 2021-12-14 05:52:43 -08:00
commit f1afeb29d6
11 changed files with 89 additions and 44 deletions

View file

@ -38,6 +38,10 @@ ifeq ($(CONFIG_ARCH_YUPIK), y)
include $(srctree)/techpack/camera/config/yupikcamera.conf
endif
ifeq ($(CONFIG_ARCH_SM6150), y)
include $(srctree)/techpack/camera/config/sm6150camera.conf
endif
ifeq ($(CONFIG_ARCH_KONA), y)
LINUXINCLUDE += \
-include $(srctree)/techpack/camera/config/konacameraconf.h
@ -83,6 +87,11 @@ LINUXINCLUDE += \
-include $(srctree)/techpack/camera/config/yupikcameraconf.h
endif
ifeq ($(CONFIG_ARCH_SM6150), y)
LINUXINCLUDE += \
-include $(srctree)/techpack/camera/config/sm6150cameraconf.h
endif
endif
ifneq (,$(filter $(CONFIG_SPECTRA_CAMERA), y m))

18
config/sm6150camera.conf Normal file
View file

@ -0,0 +1,18 @@
# SPDX-License-Identifier: GPL-2.0-only
# Copyright (c) 2021, The Linux Foundation. All rights reserved.
ifeq ($(CONFIG_QGKI),y)
export CONFIG_SPECTRA_CAMERA=m
$(info "QGKI Spectra Camera Building as DLKM")
else
export CONFIG_SPECTRA_CAMERA=m
$(info "GKI Spectra Camera Building as DLKM")
endif
ifneq (,$(filter $(CONFIG_SPECTRA_CAMERA), y m))
export CONFIG_SPECTRA_ISP=y
export CONFIG_SPECTRA_SENSOR=y
export CONFIG_SPECTRA_ICP=y
export CONFIG_SPECTRA_JPEG=y
export CONFIG_SPECTRA_CUSTOM=y
endif

12
config/sm6150cameraconf.h Normal file
View file

@ -0,0 +1,12 @@
/* SPDX-License-Identifier: GPL-2.0-only */
/*
* Copyright (c) 2021, The Linux Foundation. All rights reserved.
*/
#define CONFIG_SPECTRA_CAMERA 1
#define CONFIG_SPECTRA_ISP 1
#define CONFIG_SPECTRA_SENSOR 1
#define CONFIG_SPECTRA_ICP 1
#define CONFIG_SPECTRA_JPEG 1
#define CONFIG_SPECTRA_CUSTOM 1

View file

@ -1809,11 +1809,9 @@ int cam_hw_cdm_handle_error_info(
if (node != NULL) {
if (node->request_type == CAM_HW_CDM_BL_CB_CLIENT) {
mutex_lock(&cdm_hw->hw_mutex);
cam_cdm_notify_clients(cdm_hw,
CAM_CDM_CB_STATUS_HW_ERROR,
(void *)node);
mutex_unlock(&cdm_hw->hw_mutex);
} else if (node->request_type == CAM_HW_CDM_BL_CB_INTERNAL) {
CAM_ERR(CAM_CDM, "Invalid node=%pK %d", node,
node->request_type);

View file

@ -4119,6 +4119,16 @@ static int __cam_isp_ctx_rdi_only_sof_in_bubble_state(
CAM_DBG(CAM_ISP,
"CDM callback detected for req: %lld, possible buf_done delay, waiting for buf_done",
req->request_id);
if (req_isp->num_fence_map_out ==
req_isp->num_deferred_acks) {
__cam_isp_handle_deferred_buf_done(ctx_isp, req,
true,
CAM_SYNC_STATE_SIGNALED_ERROR,
CAM_SYNC_ISP_EVENT_BUBBLE);
__cam_isp_ctx_handle_buf_done_for_req_list(
ctx_isp, req);
}
goto end;
} else {
CAM_WARN(CAM_ISP,

View file

@ -163,9 +163,7 @@ static int cam_csid_ppi_init_hw(void *hw_priv, void *init_args,
{
int i, rc = 0;
uint32_t num_lanes;
uint32_t lanes[CAM_CSID_PPI_HW_MAX] = {0, 0, 0, 0};
uint32_t cphy;
bool dl0, dl1;
uint32_t ppi_cfg_val = 0;
struct cam_csid_ppi_hw *ppi_hw;
struct cam_hw_info *ppi_hw_info;
@ -180,7 +178,6 @@ static int cam_csid_ppi_init_hw(void *hw_priv, void *init_args,
goto end;
}
dl0 = dl1 = false;
ppi_hw_info = (struct cam_hw_info *)hw_priv;
ppi_hw = (struct cam_csid_ppi_hw *)ppi_hw_info->core_info;
ppi_reg = ppi_hw->ppi_info->ppi_reg;
@ -195,30 +192,15 @@ static int cam_csid_ppi_init_hw(void *hw_priv, void *init_args,
CAM_DBG(CAM_ISP, "lane_cfg 0x%x | num_lanes 0x%x | lane_type 0x%x",
ppi_cfg.lane_cfg, num_lanes, cphy);
for (i = 0; i < num_lanes; i++) {
lanes[i] = ppi_cfg.lane_cfg & (0x3 << (4 * i));
(lanes[i] < 2) ? (dl0 = true) : (dl1 = true);
CAM_DBG(CAM_ISP, "lanes[%d] %d", i, lanes[i]);
if (cphy) {
ppi_cfg_val |= PPI_CFG_CPHY_DLX_SEL(0);
ppi_cfg_val |= PPI_CFG_CPHY_DLX_SEL(1);
} else {
ppi_cfg_val = 0;
}
if (num_lanes) {
if (cphy) {
for (i = 0; i < num_lanes; i++) {
ppi_cfg_val |= PPI_CFG_CPHY_DLX_SEL(lanes[i]);
ppi_cfg_val |= PPI_CFG_CPHY_DLX_EN(lanes[i]);
}
} else {
if (dl0)
ppi_cfg_val |= PPI_CFG_CPHY_DLX_EN(0);
if (dl1)
ppi_cfg_val |= PPI_CFG_CPHY_DLX_EN(1);
}
} else {
CAM_ERR(CAM_ISP,
"Number of lanes to enable is cannot be zero");
rc = -1;
goto end;
}
for (i = 0; i < CAM_CSID_PPI_LANES_MAX; i++)
ppi_cfg_val |= PPI_CFG_CPHY_DLX_EN(i);
CAM_DBG(CAM_ISP, "ppi_cfg_val 0x%x", ppi_cfg_val);
soc_info = &ppi_hw->hw_info->soc_info;

View file

@ -25,7 +25,7 @@
/*
* Select the PHY (CPHY set '1' or DPHY set '0')
*/
#define PPI_CFG_CPHY_DLX_SEL(X) ((X < 2) ? BIT(X) : 0)
#define PPI_CFG_CPHY_DLX_SEL(X) BIT(X)
#define PPI_CFG_CPHY_DLX_EN(X) BIT(4+X)

View file

@ -1,6 +1,6 @@
/* SPDX-License-Identifier: GPL-2.0-only */
/*
* Copyright (c) 2019-2020, The Linux Foundation. All rights reserved.
* Copyright (c) 2019-2021, The Linux Foundation. All rights reserved.
*/
#ifndef _CAM_TFE_CSID_530_H_
@ -134,6 +134,7 @@ static struct cam_tfe_csid_csi2_rx_reg_offset
.csid_csi2_rx_irq_set_addr = 0x2c,
/*CSI2 rx control */
.phy_sel_base = 1,
.csid_csi2_rx_cfg0_addr = 0x100,
.csid_csi2_rx_cfg1_addr = 0x104,
.csid_csi2_rx_capture_ctrl_addr = 0x108,

View file

@ -960,8 +960,14 @@ static int cam_tfe_csid_enable_csi2(
cam_io_w_mb(val, soc_info->reg_map[0].mem_base +
csid_reg->csi2_reg->csid_csi2_rx_irq_mask_addr);
/*
* There is one to one mapping for ppi index with phy index
* we do not always update phy sel equal to phy number,for some
* targets "phy_sel = phy_num + 1", and for some targets it is
* "phy_sel = phy_num", ppi_index should be updated accordingly
*/
ppi_index = csid_hw->csi2_rx_cfg.phy_sel - csid_reg->csi2_reg->phy_sel_base;
ppi_index = csid_hw->csi2_rx_cfg.phy_sel;
if (csid_hw->ppi_hw_intf[ppi_index] && csid_hw->ppi_enable) {
ppi_lane_cfg.lane_type = csid_hw->csi2_rx_cfg.lane_type;
ppi_lane_cfg.lane_num = csid_hw->csi2_rx_cfg.lane_num;
@ -1005,7 +1011,7 @@ static int cam_tfe_csid_disable_csi2(
cam_io_w_mb(0, soc_info->reg_map[0].mem_base +
csid_reg->csi2_reg->csid_csi2_rx_cfg1_addr);
ppi_index = csid_hw->csi2_rx_cfg.phy_sel;
ppi_index = csid_hw->csi2_rx_cfg.phy_sel - csid_reg->csi2_reg->phy_sel_base;
if (csid_hw->ppi_hw_intf[ppi_index] && csid_hw->ppi_enable) {
/* De-Initialize the PPI bridge */
CAM_DBG(CAM_ISP, "ppi_index to de-init %d\n", ppi_index);

View file

@ -185,6 +185,7 @@ struct cam_tfe_csid_csi2_rx_reg_offset {
uint32_t csid_csi2_rx_total_crc_err_addr;
/*configurations */
uint32_t phy_sel_base;
uint32_t csi2_rst_srb_all;
uint32_t csi2_rst_done_shift_val;
uint32_t csi2_irq_mask_all;

View file

@ -1714,20 +1714,20 @@ static int __cam_req_mgr_process_req(struct cam_req_mgr_core_link *link,
return -EINVAL;
}
mutex_lock(&session->lock);
/*
* In case if the wq is scheduled while destroying session
* the session mutex is already taken and will cause a
* dead lock. To avoid further processing check link state
* and exit.
* During session destroy/unlink the link state is updated and session
* mutex is released when flushing the workq. In case the wq is scheduled
* thereafter this API will then check the updated link state and exit
*/
spin_lock_bh(&link->link_state_spin_lock);
if (link->state == CAM_CRM_LINK_STATE_IDLE) {
spin_unlock_bh(&link->link_state_spin_lock);
mutex_unlock(&session->lock);
return -EPERM;
}
spin_unlock_bh(&link->link_state_spin_lock);
mutex_lock(&session->lock);
in_q = link->req.in_q;
/*
* Check if new read index,
@ -3786,13 +3786,17 @@ end:
/**
* __cam_req_mgr_unlink()
*
* @brief : Unlink devices on a link structure from the session
* @link : Pointer to the link structure
* @brief : Unlink devices on a link structure from the session
* This API is to be invoked with session mutex held
* @session: session of the link
* @link : Pointer to the link structure
*
* @return: 0 for success, negative for failure
*
*/
static int __cam_req_mgr_unlink(struct cam_req_mgr_core_link *link)
static int __cam_req_mgr_unlink(
struct cam_req_mgr_core_session *session,
struct cam_req_mgr_core_link *link)
{
int rc;
@ -3808,14 +3812,16 @@ static int __cam_req_mgr_unlink(struct cam_req_mgr_core_link *link)
}
mutex_lock(&link->lock);
spin_lock_bh(&link->link_state_spin_lock);
/* Destroy timer of link */
crm_timer_exit(&link->watchdog);
spin_unlock_bh(&link->link_state_spin_lock);
/* Release session mutex for workq processing */
mutex_unlock(&session->lock);
/* Destroy workq of link */
cam_req_mgr_workq_destroy(&link->workq);
/* Acquire session mutex after workq flush */
mutex_lock(&session->lock);
/* Cleanup request tables and unlink devices */
__cam_req_mgr_destroy_link_info(link);
/* Free memory holding data of linked devs */
@ -3857,6 +3863,7 @@ int cam_req_mgr_destroy_session(
goto end;
}
mutex_lock(&cam_session->lock);
if (cam_session->num_links) {
CAM_DBG(CAM_CRM, "destroy session %x num_active_links %d",
@ -3872,7 +3879,7 @@ int cam_req_mgr_destroy_session(
link->link_hdl);
/* Ignore return value since session is going away */
link->is_shutdown = is_shutdown;
__cam_req_mgr_unlink(link);
__cam_req_mgr_unlink(cam_session, link);
__cam_req_mgr_free_link(link);
}
}
@ -4153,8 +4160,9 @@ int cam_req_mgr_unlink(struct cam_req_mgr_unlink_info *unlink_info)
rc = -EINVAL;
goto done;
}
rc = __cam_req_mgr_unlink(link);
mutex_lock(&cam_session->lock);
rc = __cam_req_mgr_unlink(cam_session, link);
mutex_unlock(&cam_session->lock);
/* Free curent link and put back into session's free pool of links */
__cam_req_mgr_unreserve_link(cam_session, link);