media: rockchip: isp: add other iq config function

Change-Id: I79d6aab382eb79489f0aee19812233b34f012b72
Signed-off-by: Hu Kejun <william.hu@rock-chips.com>
This commit is contained in:
Hu Kejun
2020-01-05 22:29:08 +08:00
committed by Tao Huang
parent 0a44ac7e92
commit 47984bb964
14 changed files with 2690 additions and 771 deletions

View File

@@ -1514,29 +1514,6 @@ static int mi_frame_end(struct rkisp_stream *stream)
/***************************** vb2 operations*******************************/
static int rkisp_allow_buffer(struct rkisp_device *dev,
struct rkisp_dummy_buffer *buf)
{
int ret = 0;
buf->vaddr = dma_alloc_coherent(dev->dev, buf->size,
&buf->dma_addr, GFP_KERNEL);
if (!buf->vaddr)
ret = -ENOMEM;
return ret;
}
static void rkisp_free_buffer(struct rkisp_device *dev,
struct rkisp_dummy_buffer *buf)
{
if (buf && buf->vaddr && buf->size) {
dma_free_coherent(dev->dev, buf->size,
buf->vaddr, buf->dma_addr);
buf->size = 0;
buf->vaddr = NULL;
}
}
static int rkisp_create_hdr_buf(struct rkisp_device *dev)
{
int i, j, max_dma, max_buf = 1;
@@ -1557,7 +1534,7 @@ static int rkisp_create_hdr_buf(struct rkisp_device *dev)
for (j = 0; j < max_buf; j++) {
buf = &dev->hdr.dummy_buf[i][j];
buf->size = size;
if (rkisp_allow_buffer(dev, buf) < 0) {
if (rkisp_alloc_buffer(dev->dev, buf) < 0) {
v4l2_err(&dev->v4l2_dev,
"Failed to allocate the memory for hdr buffer\n");
return -ENOMEM;
@@ -1619,17 +1596,17 @@ void hdr_destroy_buf(struct rkisp_device *dev)
for (i = 0; i < max_dma; i++) {
buf = dev->hdr.rx_cur_buf[i];
if (buf) {
rkisp_free_buffer(dev, buf);
rkisp_free_buffer(dev->dev, buf);
dev->hdr.rx_cur_buf[i] = NULL;
}
for (j = 0; j < max_buf; j++) {
buf = hdr_dqbuf(&dev->hdr.q_tx[i]);
if (buf)
rkisp_free_buffer(dev, buf);
rkisp_free_buffer(dev->dev, buf);
buf = hdr_dqbuf(&dev->hdr.q_rx[i]);
if (buf)
rkisp_free_buffer(dev, buf);
rkisp_free_buffer(dev->dev, buf);
}
}
}
@@ -2015,7 +1992,7 @@ static int rkisp_create_dummy_buf(struct rkisp_stream *stream)
dummy_buf->size = max(dummy_buf->size, in_size);
}
if (rkisp_allow_buffer(dev, dummy_buf) < 0) {
if (rkisp_alloc_buffer(dev->dev, dummy_buf) < 0) {
v4l2_err(&dev->v4l2_dev,
"Failed to allocate the memory for dummy buffer\n");
return -ENOMEM;
@@ -2032,7 +2009,7 @@ static void rkisp_destroy_dummy_buf(struct rkisp_stream *stream)
struct rkisp_dummy_buffer *dummy_buf = &stream->dummy_buf;
struct rkisp_device *dev = stream->ispdev;
rkisp_free_buffer(dev, dummy_buf);
rkisp_free_buffer(dev->dev, dummy_buf);
if (dev->isp_ver == ISP_V20)
hdr_destroy_buf(dev);
}

View File

@@ -133,4 +133,27 @@ static inline struct vb2_queue *to_vb2_queue(struct file *file)
return &vnode->buf_queue;
}
static inline int rkisp_alloc_buffer(struct device *dev,
struct rkisp_dummy_buffer *buf)
{
int ret = 0;
buf->vaddr = dma_alloc_coherent(dev, buf->size,
&buf->dma_addr, GFP_KERNEL);
if (!buf->vaddr)
ret = -ENOMEM;
return ret;
}
static inline void rkisp_free_buffer(struct device *dev,
struct rkisp_dummy_buffer *buf)
{
if (buf && buf->vaddr && buf->size) {
dma_free_coherent(dev, buf->size,
buf->vaddr, buf->dma_addr);
buf->size = 0;
buf->vaddr = NULL;
}
}
#endif /* _RKISP_COMMON_H */

View File

@@ -110,11 +110,7 @@ static int rkisp_params_vb2_queue_setup(struct vb2_queue *vq,
RKISP_ISP_PARAMS_REQ_BUFS_MAX);
*num_planes = 1;
if (params_vdev->dev->isp_ver <= ISP_V13)
sizes[0] = sizeof(struct rkisp1_isp_params_cfg);
else
sizes[0] = sizeof(struct isp2x_isp_params_cfg);
params_vdev->ops->get_param_size(params_vdev, sizes);
INIT_LIST_HEAD(&params_vdev->params);
params_vdev->first_params = true;
@@ -192,6 +188,7 @@ rkisp_params_vb2_start_streaming(struct vb2_queue *queue, unsigned int count)
struct rkisp_isp_params_vdev *params_vdev = queue->drv_priv;
unsigned long flags;
params_vdev->hdrtmo_en = false;
spin_lock_irqsave(&params_vdev->config_lock, flags);
params_vdev->streamon = true;
spin_unlock_irqrestore(&params_vdev->config_lock, flags);
@@ -247,6 +244,14 @@ static void rkisp_init_params_vdev(struct rkisp_isp_params_vdev *params_vdev)
rkisp_init_params_vdev_v2x(params_vdev);
}
static void rkisp_uninit_params_vdev(struct rkisp_isp_params_vdev *params_vdev)
{
if (params_vdev->dev->isp_ver <= ISP_V13)
rkisp_uninit_params_vdev_v1x(params_vdev);
else
rkisp_uninit_params_vdev_v2x(params_vdev);
}
void rkisp_params_isr(struct rkisp_isp_params_vdev *params_vdev,
u32 isp_mis)
{
@@ -317,13 +322,17 @@ int rkisp_register_params_vdev(struct rkisp_isp_params_vdev *params_vdev,
ret = media_create_pad_link(source, 0, sink,
RKISP_ISP_PAD_SINK_PARAMS, MEDIA_LNK_FL_ENABLED);
if (ret < 0)
goto err_cleanup_media_entity;
goto err_unregister_video;
return 0;
err_unregister_video:
video_unregister_device(vdev);
err_cleanup_media_entity:
media_entity_cleanup(&vdev->entity);
err_release_queue:
vb2_queue_release(vdev->queue);
rkisp_uninit_params_vdev(params_vdev);
return ret;
}
@@ -335,4 +344,6 @@ void rkisp_unregister_params_vdev(struct rkisp_isp_params_vdev *params_vdev)
video_unregister_device(vdev);
media_entity_cleanup(&vdev->entity);
vb2_queue_release(vdev->queue);
rkisp_uninit_params_vdev(params_vdev);
}

View File

@@ -12,6 +12,7 @@ struct rkisp_isp_params_vdev;
struct rkisp_isp_params_ops {
void (*save_first_param)(struct rkisp_isp_params_vdev *params_vdev, void *param);
void (*clear_first_param)(struct rkisp_isp_params_vdev *params_vdev);
void (*get_param_size)(struct rkisp_isp_params_vdev *params_vdev, unsigned int sizes[]);
void (*config_isp)(struct rkisp_isp_params_vdev *params_vdev);
void (*disable_isp)(struct rkisp_isp_params_vdev *params_vdev);
void (*isr_hdl)(struct rkisp_isp_params_vdev *params_vdev,
@@ -37,6 +38,7 @@ struct rkisp_isp_params_vdev {
struct v4l2_format vdev_fmt;
bool streamon;
bool first_params;
bool hdrtmo_en;
enum v4l2_quantization quantization;
enum rkisp_fmt_raw_pat_type raw_type;
@@ -47,6 +49,7 @@ struct rkisp_isp_params_vdev {
struct rkisp_isp_params_ops *ops;
void *priv_ops;
void *priv_cfg;
void *priv_val;
};
/* config params before ISP streaming */

View File

@@ -2265,6 +2265,12 @@ static void rkisp1_clear_first_param_v1x(struct rkisp_isp_params_vdev *params_vd
params_vdev->isp1x_params.module_en_update = 0;
}
static void
rkisp1_get_param_size_v1x(struct rkisp_isp_params_vdev *params_vdev, unsigned int sizes[])
{
sizes[0] = sizeof(struct rkisp1_isp_params_cfg);
}
/* Not called when the camera active, thus not isr protection. */
static void rkisp1_params_disable_isp_v1x(struct rkisp_isp_params_vdev *params_vdev)
{
@@ -2342,6 +2348,7 @@ unlock:
static struct rkisp_isp_params_ops rkisp_isp_params_ops_tbl = {
.save_first_param = rkisp1_save_first_param_v1x,
.clear_first_param = rkisp1_clear_first_param_v1x,
.get_param_size = rkisp1_get_param_size_v1x,
.config_isp = rkisp1_params_configure_isp_v1x,
.disable_isp = rkisp1_params_disable_isp_v1x,
.isr_hdl = rkisp1_params_isr_v1x,
@@ -2360,3 +2367,8 @@ void rkisp_init_params_vdev_v1x(struct rkisp_isp_params_vdev *params_vdev)
params_vdev->priv_cfg = &rkisp1_v10_isp_params_config;
}
}
void rkisp_uninit_params_vdev_v1x(struct rkisp_isp_params_vdev *params_vdev)
{
}

View File

@@ -77,5 +77,6 @@ struct rkisp_isp_params_v1x_config {
};
void rkisp_init_params_vdev_v1x(struct rkisp_isp_params_vdev *params_vdev);
void rkisp_uninit_params_vdev_v1x(struct rkisp_isp_params_vdev *params_vdev);
#endif /* _RKISP_ISP_PARAM_V1X_H */

File diff suppressed because it is too large Load Diff

View File

@@ -169,6 +169,15 @@
#define ISP2X_ISPPATH_RAWAWB_SEL_SET(x) (((x) & 0x03) << 20)
#define ISP2X_ISPPATH_RAWAE_SWAP_SET(x) (((x) & 0x03) << 22)
#define RKISP_PARAM_3DLUT_BUF_NUM 2
#define RKISP_PARAM_3DLUT_BUF_SIZE (9 * 9 * 9 * 4)
#define RKISP_PARAM_LDCH_BUF_NUM 2
#define RKISP_PARAM_LSC_LUT_BUF_NUM 2
#define RKISP_PARAM_LSC_LUT_TBL_SIZE (9 * 17)
#define RKISP_PARAM_LSC_LUT_BUF_SIZE (RKISP_PARAM_LSC_LUT_TBL_SIZE * 4)
struct rkisp_isp_params_vdev;
struct rkisp_isp_params_v2x_ops {
void (*dpcc_config)(struct rkisp_isp_params_vdev *params_vdev,
@@ -195,13 +204,13 @@ struct rkisp_isp_params_v2x_ops {
const struct isp2x_awb_gain_cfg *arg);
void (*awbgain_enable)(struct rkisp_isp_params_vdev *params_vdev,
bool en);
void (*bdm_config)(struct rkisp_isp_params_vdev *params_vdev,
const struct isp2x_bdm_config *arg);
void (*bdm_enable)(struct rkisp_isp_params_vdev *params_vdev,
bool en);
void (*ctk_config)(struct rkisp_isp_params_vdev *params_vdev,
const struct isp2x_ctk_cfg *arg);
void (*ctk_enable)(struct rkisp_isp_params_vdev *params_vdev,
void (*debayer_config)(struct rkisp_isp_params_vdev *params_vdev,
const struct isp2x_debayer_cfg *arg);
void (*debayer_enable)(struct rkisp_isp_params_vdev *params_vdev,
bool en);
void (*ccm_config)(struct rkisp_isp_params_vdev *params_vdev,
const struct isp2x_ccm_cfg *arg);
void (*ccm_enable)(struct rkisp_isp_params_vdev *params_vdev,
bool en);
void (*goc_config)(struct rkisp_isp_params_vdev *params_vdev,
const struct isp2x_gammaout_cfg *arg);
@@ -295,12 +304,34 @@ struct rkisp_isp_params_v2x_ops {
const struct isp2x_dhaz_cfg *arg);
void (*dhaz_enable)(struct rkisp_isp_params_vdev *params_vdev,
bool en);
void (*gain_config)(struct rkisp_isp_params_vdev *params_vdev,
const struct isp2x_gain_cfg *arg);
void (*gain_enable)(struct rkisp_isp_params_vdev *params_vdev,
bool en);
void (*isp3dlut_config)(struct rkisp_isp_params_vdev *params_vdev,
const struct isp2x_3dlut_cfg *arg);
void (*isp3dlut_enable)(struct rkisp_isp_params_vdev *params_vdev,
bool en);
void (*ldch_config)(struct rkisp_isp_params_vdev *params_vdev,
const struct isp2x_ldch_cfg *arg);
void (*ldch_enable)(struct rkisp_isp_params_vdev *params_vdev,
bool en);
void (*csm_config)(struct rkisp_isp_params_vdev *params_vdev,
bool full_range);
};
struct rkisp_isp_params_val_v2x {
struct rkisp_dummy_buffer buf_3dlut[RKISP_PARAM_3DLUT_BUF_NUM];
u32 buf_3dlut_idx;
struct rkisp_dummy_buffer buf_ldch[RKISP_PARAM_LDCH_BUF_NUM];
u32 buf_ldch_idx;
struct rkisp_dummy_buffer buf_lsclut[RKISP_PARAM_LSC_LUT_BUF_NUM];
u32 buf_lsclut_idx;
};
void rkisp_init_params_vdev_v2x(struct rkisp_isp_params_vdev *params_vdev);
void rkisp_uninit_params_vdev_v2x(struct rkisp_isp_params_vdev *params_vdev);
#endif /* _RKISP_ISP_PARAM_V2X_H */

View File

@@ -289,7 +289,7 @@ int rkisp_register_stats_vdev(struct rkisp_isp_stats_vdev *stats_vdev,
ret = media_create_pad_link(source, RKISP_ISP_PAD_SOURCE_STATS,
sink, 0, MEDIA_LNK_FL_ENABLED);
if (ret < 0)
goto err_cleanup_media_entity;
goto err_unregister_video;
ret = kfifo_alloc(&stats_vdev->rd_kfifo,
RKISP_READOUT_WORK_SIZE,
@@ -298,7 +298,7 @@ int rkisp_register_stats_vdev(struct rkisp_isp_stats_vdev *stats_vdev,
dev_err(&vdev->dev,
"kfifo_alloc failed with error %d\n",
ret);
goto err_cleanup_media_entity;
goto err_unregister_video;
}
tasklet_init(&stats_vdev->rd_tasklet,
@@ -308,10 +308,13 @@ int rkisp_register_stats_vdev(struct rkisp_isp_stats_vdev *stats_vdev,
return 0;
err_unregister_video:
video_unregister_device(vdev);
err_cleanup_media_entity:
media_entity_cleanup(&vdev->entity);
err_release_queue:
vb2_queue_release(vdev->queue);
rkisp_uninit_stats_vdev(stats_vdev);
return ret;
}
@@ -320,10 +323,11 @@ void rkisp_unregister_stats_vdev(struct rkisp_isp_stats_vdev *stats_vdev)
struct rkisp_vdev_node *node = &stats_vdev->vnode;
struct video_device *vdev = &node->vdev;
rkisp_uninit_stats_vdev(stats_vdev);
kfifo_free(&stats_vdev->rd_kfifo);
tasklet_kill(&stats_vdev->rd_tasklet);
video_unregister_device(vdev);
media_entity_cleanup(&vdev->entity);
vb2_queue_release(vdev->queue);
rkisp_uninit_stats_vdev(stats_vdev);
}

View File

@@ -29,7 +29,7 @@ struct rkisp_isp_readout_work {
};
struct rkisp_isp_stats_ops {
void (*isr_hdl)(struct rkisp_isp_stats_vdev *params_vdev,
void (*isr_hdl)(struct rkisp_isp_stats_vdev *stats_vdev,
u32 isp_mis, u32 isp3a_ris);
void (*send_meas)(struct rkisp_isp_stats_vdev *stats_vdev,
struct rkisp_isp_readout_work *meas_work);

View File

@@ -268,9 +268,9 @@ rkisp_stats_get_sihst_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
pbuf->meas_type |= ISP2X_STAT_SIHST;
addr = stats_vdev->dev->base_addr + ISP_HIST_HIST_BIN;
for (i = 0; i < ISP2X_HIST_WIN_NUM; i++) {
for (i = 0; i < ISP2X_SIHIST_WIN_NUM; i++) {
addr += i * 0x40;
for (j = 0; j < ISP2X_HIST_BIN_N_MAX / 2; j++) {
for (j = 0; j < ISP2X_SIHIST_BIN_N_MAX / 2; j++) {
value = readl(addr + (j * 4));
pbuf->params.sihst.win_stat[i].hist_bins[2 * j] =
ISP2X_HIST_GET_BIN0(value);
@@ -479,6 +479,145 @@ out:
writel(value, addr + ISP_RAWHIST_LITE_CTRL);
}
static void
rkisp_stats_get_bls_stats(struct rkisp_isp_stats_vdev *stats_vdev,
struct rkisp_isp2x_stat_buffer *pbuf)
{
void __iomem *addr = stats_vdev->dev->base_addr;
struct ispsd_in_fmt in_fmt = stats_vdev->dev->isp_sdev.in_fmt;
enum rkisp_fmt_raw_pat_type raw_type = in_fmt.bayer_pat;
struct isp2x_bls_stat *bls;
u32 value;
if (!pbuf)
return;
bls = &pbuf->params.bls;
value = readl(addr + ISP_BLS_CTRL);
if (value & (ISP_BLS_ENA | ISP_BLS_MODE_MEASURED)) {
pbuf->meas_type |= ISP2X_STAT_BLS;
switch (raw_type) {
case RAW_BGGR:
bls->meas_r = readl(addr + ISP_BLS_D_MEASURED);
bls->meas_gr = readl(addr + ISP_BLS_C_MEASURED);
bls->meas_gb = readl(addr + ISP_BLS_B_MEASURED);
bls->meas_b = readl(addr + ISP_BLS_A_MEASURED);
break;
case RAW_GBRG:
bls->meas_r = readl(addr + ISP_BLS_C_MEASURED);
bls->meas_gr = readl(addr + ISP_BLS_D_MEASURED);
bls->meas_gb = readl(addr + ISP_BLS_A_MEASURED);
bls->meas_b = readl(addr + ISP_BLS_B_MEASURED);
break;
case RAW_GRBG:
bls->meas_r = readl(addr + ISP_BLS_B_MEASURED);
bls->meas_gr = readl(addr + ISP_BLS_A_MEASURED);
bls->meas_gb = readl(addr + ISP_BLS_D_MEASURED);
bls->meas_b = readl(addr + ISP_BLS_C_MEASURED);
break;
case RAW_RGGB:
bls->meas_r = readl(addr + ISP_BLS_A_MEASURED);
bls->meas_gr = readl(addr + ISP_BLS_B_MEASURED);
bls->meas_gb = readl(addr + ISP_BLS_C_MEASURED);
bls->meas_b = readl(addr + ISP_BLS_D_MEASURED);
break;
default:
break;
}
}
}
static void
rkisp_stats_get_tmo_stats(struct rkisp_isp_stats_vdev *stats_vdev,
struct rkisp_isp2x_stat_buffer *pbuf)
{
struct rkisp_device *dev = stats_vdev->dev;
struct rkisp_isp_params_vdev *params_vdev = &dev->params_vdev;
void __iomem *addr = dev->base_addr;
struct isp2x_hdrtmo_stat *tmo;
u32 value, i;
if (!pbuf || !params_vdev->hdrtmo_en)
return;
tmo = &pbuf->params.hdrtmo;
value = readl(addr + ISP_HDRTMO_CTRL);
if (value & ISP_HDRTMO_EN) {
pbuf->meas_type |= ISP2X_STAT_HDRTMO;
value = readl(addr + ISP_HDRTMO_LG_RO0);
tmo->lglow = value >> 16;
tmo->lgmin = value & 0xFFFF;
value = readl(addr + ISP_HDRTMO_LG_RO1);
tmo->lghigh = value >> 16;
tmo->lgmax = value & 0xFFFF;
value = readl(addr + ISP_HDRTMO_LG_RO2);
tmo->weightkey = (value >> 16) & 0xFF;
tmo->lgmean = value & 0xFFFF;
value = readl(addr + ISP_HDRTMO_LG_RO3);
tmo->lgrange1 = value >> 16;
tmo->lgrange0 = value & 0xFFFF;
value = readl(addr + ISP_HDRTMO_LG_RO4);
tmo->palpha = (value >> 16) & 0x3FF;
tmo->lgavgmax = value & 0xFFFF;
value = readl(addr + ISP_HDRTMO_LG_RO5);
tmo->linecnt = value & 0x1FFF;
for (i = 0; i < ISP2X_HDRTMO_MINMAX_NUM; i++)
tmo->min_max[i] = readl(addr + ISP_HDRTMO_HIST_RO0 + 4 * i);
}
}
static void
rkisp_stats_get_dhaz_stats(struct rkisp_isp_stats_vdev *stats_vdev,
struct rkisp_isp2x_stat_buffer *pbuf)
{
void __iomem *addr = stats_vdev->dev->base_addr;
struct isp2x_dhaz_stat *dhaz;
u32 value, i;
if (!pbuf)
return;
dhaz = &pbuf->params.dhaz;
value = readl(addr + ISP_DHAZ_CTRL);
if (value & ISP_DHAZ_ENMUX) {
pbuf->meas_type |= ISP2X_STAT_DHAZ;
value = readl(addr + ISP_DHAZ_ADP_RD0);
dhaz->dhaz_adp_air_base = value >> 16;
dhaz->dhaz_adp_wt = value & 0xFFFF;
value = readl(addr + ISP_DHAZ_ADP_RD1);
dhaz->dhaz_adp_gratio = value >> 16;
dhaz->dhaz_adp_tmax = value & 0xFFFF;
for (i = 0; i < ISP2X_DHAZ_HIST_IIR_NUM / 2; i++) {
value = readl(addr + ISP_DHAZ_HIST_REG0 + 4 * i);
dhaz->h_r_iir[2 * i] = value & 0xFFFF;
dhaz->h_r_iir[2 * i + 1] = value >> 16;
}
for (i = 0; i < ISP2X_DHAZ_HIST_IIR_NUM / 2; i++) {
value = readl(addr + ISP_DHAZ_HIST_REG32 + 4 * i);
dhaz->h_g_iir[2 * i] = value & 0xFFFF;
dhaz->h_g_iir[2 * i + 1] = value >> 16;
}
for (i = 0; i < ISP2X_DHAZ_HIST_IIR_NUM / 2; i++) {
value = readl(addr + ISP_DHAZ_HIST_REG64 + 4 * i);
dhaz->h_b_iir[2 * i] = value & 0xFFFF;
dhaz->h_b_iir[2 * i + 1] = value >> 16;
}
}
}
static struct rkisp_stats_v2x_ops __maybe_unused rkisp_stats_reg_ops_v2x = {
.get_siawb_meas = rkisp_stats_get_siawb_meas_reg,
.get_rawawb_meas = rkisp_stats_get_rawawb_meas_reg,
@@ -494,6 +633,9 @@ static struct rkisp_stats_v2x_ops __maybe_unused rkisp_stats_reg_ops_v2x = {
.get_rawhstbig3_meas = rkisp_stats_get_rawhstbig3_meas_reg,
.get_rawaelite_meas = rkisp_stats_get_rawaelite_meas_reg,
.get_rawhstlite_meas = rkisp_stats_get_rawhstlite_meas_reg,
.get_bls_stats = rkisp_stats_get_bls_stats,
.get_tmo_stats = rkisp_stats_get_tmo_stats,
.get_dhaz_stats = rkisp_stats_get_dhaz_stats,
};
static void
@@ -735,10 +877,10 @@ rkisp_stats_get_sihst_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
rd_buf_idx = stats_vdev->rd_buf_idx;
ddr_addr = stats_vdev->stats_buf[rd_buf_idx].vaddr + 0x2C00;
for (i = 0; i < 1; i++) {
for (i = 0; i < ISP2X_SIHIST_WIN_NUM; i++) {
ddr_addr += i * 0x40;
for (j = 0; j < ISP2X_HIST_BIN_N_MAX / 2; j++) {
value = ddr_addr[j * 4];
for (j = 0; j < ISP2X_SIHIST_BIN_N_MAX / 2; j++) {
value = ddr_addr[j];
pbuf->params.sihst.win_stat[i].hist_bins[2 * j] =
ISP2X_HIST_GET_BIN0(value);
pbuf->params.sihst.win_stat[i].hist_bins[2 * j + 1] =
@@ -975,6 +1117,9 @@ static struct rkisp_stats_v2x_ops __maybe_unused rkisp_stats_ddr_ops_v2x = {
.get_rawhstbig3_meas = rkisp_stats_get_rawhstbig3_meas_ddr,
.get_rawaelite_meas = rkisp_stats_get_rawaelite_meas_ddr,
.get_rawhstlite_meas = rkisp_stats_get_rawhstlite_meas_ddr,
.get_bls_stats = rkisp_stats_get_bls_stats,
.get_tmo_stats = rkisp_stats_get_tmo_stats,
.get_dhaz_stats = rkisp_stats_get_dhaz_stats,
};
static void
@@ -1111,6 +1256,10 @@ rkisp_stats_send_meas_v2x(struct rkisp_isp_stats_vdev *stats_vdev,
cur_stat_buf->meas_type |= ISP2X_STAT_RAWHSTCH2;
}
ops->get_bls_stats(stats_vdev, cur_stat_buf);
ops->get_tmo_stats(stats_vdev, cur_stat_buf);
ops->get_dhaz_stats(stats_vdev, cur_stat_buf);
if (cur_buf) {
vb2_set_plane_payload(&cur_buf->vb.vb2_buf, 0,
sizeof(struct rkisp_isp2x_stat_buffer));
@@ -1212,29 +1361,6 @@ unlock:
spin_unlock(&stats_vdev->irq_lock);
}
static int __maybe_unused rkisp_alloc_buffer(struct rkisp_device *dev,
struct rkisp_dummy_buffer *buf)
{
int ret = 0;
buf->vaddr = dma_alloc_coherent(dev->dev, buf->size,
&buf->dma_addr, GFP_KERNEL);
if (!buf->vaddr)
ret = -ENOMEM;
return ret;
}
static void __maybe_unused rkisp_free_buffer(struct rkisp_device *dev,
struct rkisp_dummy_buffer *buf)
{
if (buf && buf->vaddr && buf->size) {
dma_free_coherent(dev->dev, buf->size,
buf->vaddr, buf->dma_addr);
buf->size = 0;
buf->vaddr = NULL;
}
}
static struct rkisp_isp_stats_ops rkisp_isp_stats_ops_tbl = {
.isr_hdl = rkisp_stats_isr_v2x,
.send_meas = rkisp_stats_send_meas_v2x,
@@ -1275,7 +1401,7 @@ void rkisp_init_stats_vdev_v2x(struct rkisp_isp_stats_vdev *stats_vdev)
stats_vdev->wr_buf_idx = 0;
for (i = 0; i < RKISP_STATS_DDR_BUF_NUM; i++) {
stats_vdev->stats_buf[i].size = RKISP_RD_STATS_BUF_SIZE;
rkisp_alloc_buffer(stats_vdev->dev, &stats_vdev->stats_buf[i]);
rkisp_alloc_buffer(stats_vdev->dev->dev, &stats_vdev->stats_buf[i]);
}
}
#endif
@@ -1286,6 +1412,6 @@ void rkisp_uninit_stats_vdev_v2x(struct rkisp_isp_stats_vdev *stats_vdev)
int i;
for (i = 0; i < RKISP_STATS_DDR_BUF_NUM; i++)
rkisp_free_buffer(stats_vdev->dev, &stats_vdev->stats_buf[i]);
rkisp_free_buffer(stats_vdev->dev->dev, &stats_vdev->stats_buf[i]);
}

View File

@@ -15,39 +15,46 @@
struct rkisp_isp_stats_vdev;
struct rkisp_stats_v2x_ops {
void (*get_siawb_meas)(struct rkisp_isp_stats_vdev *stats_vdev,
struct rkisp_isp2x_stat_buffer *pbuf);
struct rkisp_isp2x_stat_buffer *pbuf);
void (*get_rawawb_meas)(struct rkisp_isp_stats_vdev *stats_vdev,
struct rkisp_isp2x_stat_buffer *pbuf);
struct rkisp_isp2x_stat_buffer *pbuf);
void (*get_siaf_meas)(struct rkisp_isp_stats_vdev *stats_vdev,
struct rkisp_isp2x_stat_buffer *pbuf);
struct rkisp_isp2x_stat_buffer *pbuf);
void (*get_rawaf_meas)(struct rkisp_isp_stats_vdev *stats_vdev,
struct rkisp_isp2x_stat_buffer *pbuf);
struct rkisp_isp2x_stat_buffer *pbuf);
void (*get_yuvae_meas)(struct rkisp_isp_stats_vdev *stats_vdev,
struct rkisp_isp2x_stat_buffer *pbuf);
struct rkisp_isp2x_stat_buffer *pbuf);
void (*get_sihst_meas)(struct rkisp_isp_stats_vdev *stats_vdev,
struct rkisp_isp2x_stat_buffer *pbuf);
struct rkisp_isp2x_stat_buffer *pbuf);
void (*get_rawaebig1_meas)(struct rkisp_isp_stats_vdev *stats_vdev,
struct rkisp_isp2x_stat_buffer *pbuf);
struct rkisp_isp2x_stat_buffer *pbuf);
void (*get_rawhstbig1_meas)(struct rkisp_isp_stats_vdev *stats_vdev,
struct rkisp_isp2x_stat_buffer *pbuf);
struct rkisp_isp2x_stat_buffer *pbuf);
void (*get_rawaebig2_meas)(struct rkisp_isp_stats_vdev *stats_vdev,
struct rkisp_isp2x_stat_buffer *pbuf);
struct rkisp_isp2x_stat_buffer *pbuf);
void (*get_rawhstbig2_meas)(struct rkisp_isp_stats_vdev *stats_vdev,
struct rkisp_isp2x_stat_buffer *pbuf);
struct rkisp_isp2x_stat_buffer *pbuf);
void (*get_rawaebig3_meas)(struct rkisp_isp_stats_vdev *stats_vdev,
struct rkisp_isp2x_stat_buffer *pbuf);
struct rkisp_isp2x_stat_buffer *pbuf);
void (*get_rawhstbig3_meas)(struct rkisp_isp_stats_vdev *stats_vdev,
struct rkisp_isp2x_stat_buffer *pbuf);
struct rkisp_isp2x_stat_buffer *pbuf);
void (*get_rawaelite_meas)(struct rkisp_isp_stats_vdev *stats_vdev,
struct rkisp_isp2x_stat_buffer *pbuf);
struct rkisp_isp2x_stat_buffer *pbuf);
void (*get_rawhstlite_meas)(struct rkisp_isp_stats_vdev *stats_vdev,
struct rkisp_isp2x_stat_buffer *pbuf);
struct rkisp_isp2x_stat_buffer *pbuf);
void (*get_bls_stats)(struct rkisp_isp_stats_vdev *stats_vdev,
struct rkisp_isp2x_stat_buffer *pbuf);
void (*get_tmo_stats)(struct rkisp_isp_stats_vdev *stats_vdev,
struct rkisp_isp2x_stat_buffer *pbuf);
void (*get_dhaz_stats)(struct rkisp_isp_stats_vdev *stats_vdev,
struct rkisp_isp2x_stat_buffer *pbuf);
};
void rkisp_stats_first_ddr_config_v2x(struct rkisp_isp_stats_vdev *stats_vdev);

View File

@@ -584,6 +584,7 @@
#define ISP_DEBAYER_C_FILTER (ISP_DEBAYER_BASE + 0x00014)
#define ISP_WDR_BASE 0x00002A00
#define ISP_WDR_CTRL (ISP_WDR_BASE + 0x00000)
#define ISP_WDR_WDR_TONECURVE_DYN1 (ISP_WDR_BASE + 0x00004)
#define ISP_WDR_WDR_TONECURVE_DYN2 (ISP_WDR_BASE + 0x00008)
#define ISP_WDR_WDR_TONECURVE_DYN3 (ISP_WDR_BASE + 0x0000c)
@@ -661,14 +662,16 @@
#define ISP_GIC_NOISE_PARA1 (ISP_GIC_BASE + 0x00014)
#define ISP_GIC_NOISE_PARA2 (ISP_GIC_BASE + 0x00018)
#define ISP_GIC_NOISE_PARA3 (ISP_GIC_BASE + 0x0001c)
#define ISP_GIC_SIGMA_VALUE0 (ISP_GIC_BASE + 0x00044)
#define ISP_GIC_SIGMA_VALUE1 (ISP_GIC_BASE + 0x00048)
#define ISP_GIC_SIGMA_VALUE2 (ISP_GIC_BASE + 0x0004c)
#define ISP_GIC_SIGMA_VALUE3 (ISP_GIC_BASE + 0x00050)
#define ISP_GIC_SIGMA_VALUE4 (ISP_GIC_BASE + 0x00054)
#define ISP_GIC_SIGMA_VALUE5 (ISP_GIC_BASE + 0x00058)
#define ISP_GIC_SIGMA_VALUE6 (ISP_GIC_BASE + 0x0005c)
#define ISP_GIC_SIGMA_VALUE7 (ISP_GIC_BASE + 0x00060)
#define ISP_GIC_SIGMA_VALUE0 (ISP_GIC_BASE + 0x00020)
#define ISP_GIC_SIGMA_VALUE1 (ISP_GIC_BASE + 0x00024)
#define ISP_GIC_SIGMA_VALUE2 (ISP_GIC_BASE + 0x00028)
#define ISP_GIC_SIGMA_VALUE3 (ISP_GIC_BASE + 0x0002c)
#define ISP_GIC_SIGMA_VALUE4 (ISP_GIC_BASE + 0x00030)
#define ISP_GIC_SIGMA_VALUE5 (ISP_GIC_BASE + 0x00034)
#define ISP_GIC_SIGMA_VALUE6 (ISP_GIC_BASE + 0x00038)
#define ISP_GIC_SIGMA_VALUE7 (ISP_GIC_BASE + 0x0003c)
#define ISP_GIC_NOISE_CTRL0 (ISP_GIC_BASE + 0x00040)
#define ISP_GIC_NOISE_CTRL1 (ISP_GIC_BASE + 0x00044)
#define ISP_BLS_BASE 0x00003000
#define ISP_BLS_CTRL (ISP_BLS_BASE + 0x00000)
@@ -830,7 +833,7 @@
#define ISP_HDRTMO_HIST_RO31 (ISP_HDRTMO_BASE + 0x000dc)
#define ISP_RAWNR_BASE 0x00003A00
#define ISP_RAWNR_STS (ISP_RAWNR_BASE + 0x00004)
#define ISP_RAWNR_CTRL (ISP_RAWNR_BASE + 0x00004)
#define ISP_RAWNR_FILTPAR0 (ISP_RAWNR_BASE + 0x00008)
#define ISP_RAWNR_FILTPAR1 (ISP_RAWNR_BASE + 0x0000c)
#define ISP_RAWNR_FILTPAR2 (ISP_RAWNR_BASE + 0x00010)
@@ -983,7 +986,7 @@
#define ISP_DHAZ_HIST_REG94 (ISP_DHAZ_BASE + 0x001e8)
#define ISP_DHAZ_HIST_REG95 (ISP_DHAZ_BASE + 0x001ec)
#define ISP_3DLUT_BASE 0x00003D00
#define ISP_3DLUT_BASE 0x00003E00
#define ISP_3DLUT_CTRL (ISP_3DLUT_BASE + 0x00000)
#define ISP_3DLUT_UPDATE (ISP_3DLUT_BASE + 0x00004)
@@ -1835,6 +1838,59 @@
#define SW_HDRMGE_MODE_FRAMEX2 BIT(2)
#define SW_HDRMGE_MODE_FRAMEX3 (2 << 2)
/* BLS */
/* ISP_BLS_CTRL */
#define ISP_BLS_ENA BIT(0)
#define ISP_BLS_MODE_MEASURED BIT(1)
#define ISP_BLS_MODE_FIXED 0
#define ISP_BLS_WINDOW_1 (1 << 2)
#define ISP_BLS_WINDOW_2 (2 << 2)
/* GIC */
/* ISP_GIC_CTRL */
#define ISP_GIC_ENA BIT(0)
#define ISP_GIC_EDGE_OPEN BIT(1)
/* DHAZ */
/* ISP_DHAZ_CTRL */
#define ISP_DHAZ_ENMUX BIT(0)
#define ISP_DHAZ_NOBIGEN BIT(2)
#define ISP_DHAZ_BIGEN BIT(3)
#define ISP_DHAZ_DCEN BIT(4)
#define ISP_DHAZ_HSTEN BIT(8)
#define ISP_DHAZ_HPARAEN BIT(12)
#define ISP_DHAZ_HSTCHN BIT(16)
#define ISP_DHAZ_ENHANCE BIT(20)
/* HDRTMO */
/* ISP_HDRTMO_CTRL */
#define ISP_HDRTMO_EN BIT(0)
/* HDRMGE */
/* ISP_HDRMGE_CTRL */
#define ISP_HDRMGE_EN BIT(0)
/* RAWNR */
/* ISP_RAWNR_CTRL */
#define ISP_RAWNR_EN BIT(0)
/* DPCC */
/* ISP_DPCC_CTRL */
#define ISP_DPCC_EN BIT(0)
/* CCM */
/* ISP_CCM_CTRL */
#define ISP_CCM_EN BIT(0)
/* 3DLUT */
/* ISP_3DLUT_CTRL */
#define ISP_3DLUT_EN BIT(0)
#define ISP_3DLUT_BYPASS BIT(1)
/* DEBAYER */
/* ISP_DEBAYER_CONTROL */
#define ISP_DEBAYER_EN BIT(0)
static inline bool dmatx_is_stream_stopped(void __iomem *base)
{
return true;

View File

@@ -20,7 +20,7 @@
#define ISP2X_MODULE_LSC BIT_ULL(4)
#define ISP2X_MODULE_AWB_GAIN BIT_ULL(5)
#define ISP2X_MODULE_BDM BIT_ULL(7)
#define ISP2X_MODULE_CTK BIT_ULL(8)
#define ISP2X_MODULE_CCM BIT_ULL(8)
#define ISP2X_MODULE_GOC BIT_ULL(9)
#define ISP2X_MODULE_CPROC BIT_ULL(10)
#define ISP2X_MODULE_SIAF BIT_ULL(11)
@@ -45,6 +45,9 @@
#define ISP2X_MODULE_GIC BIT_ULL(30)
#define ISP2X_MODULE_DHAZ BIT_ULL(31)
#define ISP2X_MODULE_3DLUT BIT_ULL(32)
#define ISP2X_MODULE_LDCH BIT_ULL(33)
#define ISP2X_MODULE_GAIN BIT_ULL(34)
#define ISP2X_MODULE_DEBAYER BIT_ULL(35)
/*
* Measurement types
@@ -64,6 +67,9 @@
#define ISP2X_STAT_RAWHSTCH0 BIT(12)
#define ISP2X_STAT_RAWHSTCH1 BIT(13)
#define ISP2X_STAT_RAWHSTCH2 BIT(14)
#define ISP2X_STAT_BLS BIT(15)
#define ISP2X_STAT_HDRTMO BIT(16)
#define ISP2X_STAT_DHAZ BIT(17)
#define ISP2X_LSC_GRAD_TBL_SIZE 8
#define ISP2X_LSC_SIZE_TBL_SIZE 8
@@ -71,6 +77,10 @@
#define ISP2X_DEGAMMA_CURVE_SIZE 17
#define ISP2X_GAIN_HDRMGE_GAIN_NUM 3
#define ISP2X_GAIN_IDX_NUM 15
#define ISP2X_GAIN_LUT_NUM 17
#define ISP2X_AWB_MAX_GRID 1
#define ISP2X_RAWAWB_SUM_NUM 7
#define ISP2X_RAWAWB_MULWD_NUM 8
@@ -84,9 +94,10 @@
#define ISP2X_RAWHISTBIG_SUBWIN_NUM 225
#define ISP2X_RAWHISTLITE_SUBWIN_NUM 25
#define ISP2X_HIST_WIN_NUM 4
#define ISP2X_SIHIST_WIN_NUM 1
#define ISP2X_HIST_WEIGHT_NUM 225
#define ISP2X_HIST_BIN_N_MAX 256
#define ISP2X_SIHIST_BIN_N_MAX 32
#define ISP2X_RAWAF_WIN_NUM 2
#define ISP2X_RAWAF_LINE_NUM 5
@@ -101,22 +112,21 @@
#define ISP2X_HDRMGE_L_CURVE_NUM 17
#define ISP2X_HDRMGE_E_CURVE_NUM 17
#define ISP2X_RAWNR_LUMA_RATION_NUM 17
#define ISP2X_RAWNR_LUMA_RATION_NUM 8
#define ISP2X_HDRTMO_MINMAX_NUM 32
#define ISP2X_GIC_SIGMA_Y_NUM 15
#define ISP2X_CCM_CURVE_NUM 17
#define ISP2X_WDR_DY_NUM 32
#define ISP2X_WDR_TONE_YN_NUM 16
#define ISP2X_WDR_TONE_YM_NUM 32
#define ISP2X_WDR_BLKMEAN_ROW_NUM 10
#define ISP2X_WDR_BLKMEAN_DATA_NUM 8
/* WDR */
#define ISP2X_WDR_SIZE 48
#define ISP2X_DHAZ_CONV_COEFF_NUM 6
#define ISP2X_DHAZ_HIST_IIR_NUM 64
#define ISP2X_GAMMA_OUT_MAX_SAMPLES 17
#define ISP2X_GAMMA_OUT_MAX_SAMPLES 45
#define ISP2X_MIPI_LUMA_MEAN_MAX 16
#define ISP2X_MIPI_RAW_MAX 3
@@ -124,6 +134,8 @@
#define ISP2X_RAW1_Y_STATE (1 << 1)
#define ISP2X_RAW2_Y_STATE (1 << 2)
#define ISP2X_3DLUT_DATA_NUM 729
struct isp2x_window {
u16 h_offs;
u16 v_offs;
@@ -359,22 +371,27 @@ struct isp2x_dpcc_cfg {
} __attribute__ ((packed));
struct isp2x_hdrmge_curve {
u16 curve_1;
u16 curve_0;
u16 curve_1[ISP2X_HDRMGE_L_CURVE_NUM];
u16 curve_0[ISP2X_HDRMGE_L_CURVE_NUM];
} __attribute__ ((packed));
struct isp2x_hdrmge_cfg {
u8 mode;
u16 gain0_inv;
u16 gain0;
u16 gain1_inv;
u16 gain1;
u8 gain2;
u8 lm_dif_0p15;
u8 lm_dif_0p9;
u8 ms_diff_0p15;
u8 ms_dif_0p8;
struct isp2x_hdrmge_curve curve[ISP2X_HDRMGE_L_CURVE_NUM];
struct isp2x_hdrmge_curve curve;
u16 e_y[ISP2X_HDRMGE_E_CURVE_NUM];
} __attribute__ ((packed));
@@ -391,11 +408,18 @@ struct isp2x_rawnr_cfg {
u32 dgain2;
u16 luration[ISP2X_RAWNR_LUMA_RATION_NUM];
u16 lulevel[ISP2X_RAWNR_LUMA_RATION_NUM];
u32 gauss;
u16 sigma;
u16 pix_diff;
u32 thld_diff;
u8 gas_weig_scl2;
u8 gas_weig_scl1;
u16 thld_chanelw;
u16 lamda;
u16 fixw0;
@@ -412,18 +436,16 @@ struct isp2x_rawnr_cfg {
} __attribute__ ((packed));
struct isp2x_lsc_cfg {
u32 r_data_tbl[ISP2X_LSC_DATA_TBL_SIZE];
u32 gr_data_tbl[ISP2X_LSC_DATA_TBL_SIZE];
u32 gb_data_tbl[ISP2X_LSC_DATA_TBL_SIZE];
u32 b_data_tbl[ISP2X_LSC_DATA_TBL_SIZE];
u16 r_data_tbl[ISP2X_LSC_DATA_TBL_SIZE];
u16 gr_data_tbl[ISP2X_LSC_DATA_TBL_SIZE];
u16 gb_data_tbl[ISP2X_LSC_DATA_TBL_SIZE];
u16 b_data_tbl[ISP2X_LSC_DATA_TBL_SIZE];
u32 x_grad_tbl[ISP2X_LSC_GRAD_TBL_SIZE];
u32 y_grad_tbl[ISP2X_LSC_GRAD_TBL_SIZE];
u16 x_grad_tbl[ISP2X_LSC_GRAD_TBL_SIZE];
u16 y_grad_tbl[ISP2X_LSC_GRAD_TBL_SIZE];
u32 x_size_tbl[ISP2X_LSC_SIZE_TBL_SIZE];
u32 y_size_tbl[ISP2X_LSC_SIZE_TBL_SIZE];
u16 cfg_width;
u16 cfg_height;
u16 x_size_tbl[ISP2X_LSC_SIZE_TBL_SIZE];
u16 y_size_tbl[ISP2X_LSC_SIZE_TBL_SIZE];
} __attribute__ ((packed));
enum isp2x_goc_mode {
@@ -433,35 +455,58 @@ enum isp2x_goc_mode {
struct isp2x_goc_cfg {
enum isp2x_goc_mode mode;
u8 gamma_y[ISP2X_GAMMA_OUT_MAX_SAMPLES];
u8 gamma_y[17];
} __attribute__ ((packed));
struct isp2x_hdrtmo_cfg {
u16 cnt_vsize;
u8 gain_ld_off2;
u8 gain_ld_off1;
u8 big_en;
u8 nobig_en;
u8 newhst_en;
u8 cnt_mode;
u16 expl_lgratio;
u8 lgscl_ratio;
u8 cfg_alpha;
u16 set_gainoff;
u16 set_palpha;
u16 set_lgmax;
u16 set_lgmin;
u8 set_weightkey;
u16 set_lgmean;
u16 set_lgrange1;
u16 set_lgrange0;
u16 set_lgavgmax;
u8 clipgap1_i;
u8 clipgap0_i;
u8 clipratio1;
u8 clipratio0;
u8 ratiol;
u16 lgscl_inv;
u16 lgscl;
u16 lgmax;
u16 hist_low;
u16 hist_min;
u8 hist_shift;
u16 hist_0p3;
u16 hist_high;
u16 palpha_0p5;
u16 palpha_lwscl;
u16 palpha_lw0p5;
u16 palpha_0p18;
u16 maxgain;
u16 maxpalpha;
} __attribute__ ((packed));
@@ -504,42 +549,50 @@ struct isp2x_gic_cfg {
u16 regmingradthr2;
u16 regmingradthr1;
u8 gr_ratio;
u16 dnloscale;
u16 dnhiscale;
u8 reglumapointsstep;
u16 gvaluelimitlo;
u16 gvaluelimithi;
u8 fusionratiohilimt1;
u8 regstrength_fix;
u16 sigma_y1;
u16 sigma_y[ISP2X_GIC_SIGMA_Y_NUM];
u8 noise_cut_en;
u16 noise_coe_a;
u16 noise_coe_b;
u16 diff_clip;
} __attribute__ ((packed));
struct isp2x_debayer_cfg {
u8 filter_c_en;
u8 filter_g_en;
u8 gain_offset;
u16 hf_offset;
u8 thed1;
u8 thed0;
u8 dist_scale;
u8 max_ratio;
u8 clip_en;
u8 filter1_coe5;
u8 filter1_coe4;
u8 filter1_coe3;
u8 filter1_coe2;
u8 filter1_coe1;
s8 filter1_coe5;
s8 filter1_coe4;
s8 filter1_coe3;
s8 filter1_coe2;
s8 filter1_coe1;
u8 filter2_coe5;
u8 filter2_coe4;
u8 filter2_coe3;
u8 filter2_coe2;
u8 filter2_coe1;
s8 filter2_coe5;
s8 filter2_coe4;
s8 filter2_coe3;
s8 filter2_coe2;
s8 filter2_coe1;
u16 hf_offset;
u8 gain_offset;
u8 offset;
u8 shift_num;
@@ -548,20 +601,20 @@ struct isp2x_debayer_cfg {
} __attribute__ ((packed));
struct isp2x_ccm_cfg {
u16 coeff0_r;
u16 coeff1_r;
u16 coeff2_r;
u16 offset_r;
s16 coeff0_r;
s16 coeff1_r;
s16 coeff2_r;
s16 offset_r;
u16 coeff0_g;
u16 coeff1_g;
u16 coeff2_g;
u16 offset_g;
s16 coeff0_g;
s16 coeff1_g;
s16 coeff2_g;
s16 offset_g;
u16 coeff0_b;
u16 coeff1_b;
u16 coeff2_b;
u16 offset_b;
s16 coeff0_b;
s16 coeff1_b;
s16 coeff2_b;
s16 offset_b;
u16 coeff0_y;
u16 coeff1_y;
@@ -575,57 +628,27 @@ struct isp2x_ccm_cfg {
struct isp2x_gammaout_cfg {
u8 equ_segm;
u16 offset;
u16 y[ISP2X_GAMMA_OUT_MAX_SAMPLES];
u16 gamma_y[ISP2X_GAMMA_OUT_MAX_SAMPLES];
} __attribute__ ((packed));
enum isp2x_wdr_mode {
ISP2X_WDR_MODE_BLOCK,
ISP2X_WDR_MODE_GLOBAL
};
struct isp2x_wdr_cfg {
u8 wdr_dy[ISP2X_WDR_DY_NUM];
u16 tonecurve_yn[ISP2X_WDR_TONE_YN_NUM];
u16 tonecurve_ym[ISP2X_WDR_TONE_YM_NUM];
u16 lum_offset;
u16 rgb_offset;
u8 pym_cc;
u8 epsilon;
u8 lvl_en;
u8 blkgain_gam;
u8 csc_sel;
u8 h_size_sel;
u8 gain_max_en;
u8 gain_max;
u8 bavg_clip;
u8 nonl_segm;
u8 nonl_open;
u8 nonl_mode1;
u8 flt_sel;
u8 blk_sel;
u8 gain_off1;
u8 gain_off2;
u8 bestlight;
u8 noiseratio;
u16 coe_0;
u16 coe_1;
u16 coe_2;
u32 coe_off;
u8 gain_off3;
} __attribute__ ((packed));
struct isp2x_wdr_stat {
u32 blkmean[ISP2X_WDR_BLKMEAN_ROW_NUM][ISP2X_WDR_BLKMEAN_DATA_NUM];
enum isp2x_wdr_mode mode;
unsigned int c_wdr[ISP2X_WDR_SIZE];
} __attribute__ ((packed));
struct isp2x_dhaz_cfg {
u8 gain_en;
u8 enhance_en;
u8 hist_chn;
u8 hpara_en;
u8 hist_en;
u8 dc_en;
u8 big_en;
u8 nobig_en;
u8 yblk_th;
u8 yhist_th;
@@ -779,26 +802,33 @@ struct isp2x_sdg_cfg {
} __attribute__ ((packed));
struct isp2x_bdm_config {
u8 demosaic_th;
unsigned char demosaic_th;
} __attribute__ ((packed));
struct isp2x_gain_cfg {
u8 dhaz_en;
u8 wdr_en;
u8 tmo_en;
u8 lsc_en;
u8 mge_en;
u32 mge_gain[ISP2X_GAIN_HDRMGE_GAIN_NUM];
u16 idx[ISP2X_GAIN_IDX_NUM];
u16 lut[ISP2X_GAIN_LUT_NUM];
} __attribute__ ((packed));
struct isp2x_3dlut_cfg {
u8 dummy;
u8 bypass_en;
u32 actual_size; // word unit
u16 lut_r[ISP2X_3DLUT_DATA_NUM];
u16 lut_g[ISP2X_3DLUT_DATA_NUM];
u16 lut_b[ISP2X_3DLUT_DATA_NUM];
} __attribute__ ((packed));
struct isp2x_ctk_cfg {
u16 coeff0;
u16 coeff1;
u16 coeff2;
u16 coeff3;
u16 coeff4;
u16 coeff5;
u16 coeff6;
u16 coeff7;
u16 coeff8;
u16 ct_offset_r;
u16 ct_offset_g;
u16 ct_offset_b;
struct isp2x_ldch_cfg {
u32 hsize;
u32 vsize;
u32 data[1];
} __attribute__ ((packed));
struct isp2x_awb_gain_cfg {
@@ -823,8 +853,6 @@ struct isp2x_siawb_meas_cfg {
struct isp2x_rawawb_meas_cfg {
u8 rawawb_sel;
u8 sw_rawawb_meas_done; //CTRL
u8 ro_rawawb_working; //CTRL
u8 sw_rawawb_light_num; //CTRL
u8 sw_rawawb_wind_size; //CTRL
u8 sw_rawawb_c_range; //CTRL
@@ -835,7 +863,6 @@ struct isp2x_rawawb_meas_cfg {
u8 sw_rawawb_3dyuv_ls_idx0; //CTRL
u8 sw_rawawb_xy_en; //CTRL
u8 sw_rawawb_uv_en; //CTRL
u8 sw_rawawb_en; //CTRL
u8 sw_rawawb_blk_measure_mode; //BLK_CTRL
u8 sw_rawawb_store_wp_flag_ls_idx2; //BLK_CTRL
u8 sw_rawawb_store_wp_flag_ls_idx1; //BLK_CTRL
@@ -1206,10 +1233,6 @@ struct isp2x_rawaebig_meas_cfg {
struct isp2x_rawaelite_meas_cfg {
u8 rawae_sel;
u8 wnd_num;
u8 off;
u8 bcc;
u8 gcc;
u8 rcc;
struct isp2x_window win;
} __attribute__ ((packed));
@@ -1288,7 +1311,7 @@ struct isp2x_sihst_win_cfg {
struct isp2x_sihst_cfg {
u8 wnd_num;
struct isp2x_sihst_win_cfg win_cfg[ISP2X_HIST_WIN_NUM];
struct isp2x_sihst_win_cfg win_cfg[ISP2X_SIHIST_WIN_NUM];
u8 hist_weight[ISP2X_HIST_WEIGHT_NUM];
} __attribute__ ((packed));
@@ -1299,7 +1322,7 @@ struct isp2x_isp_other_cfg {
struct isp2x_rawnr_cfg rawnr_cfg;
struct isp2x_lsc_cfg lsc_cfg;
struct isp2x_awb_gain_cfg awb_gain_cfg;
struct isp2x_goc_cfg goc_cfg;
//struct isp2x_goc_cfg goc_cfg;
struct isp2x_gic_cfg gic_cfg;
struct isp2x_debayer_cfg debayer_cfg;
struct isp2x_ccm_cfg ccm_cfg;
@@ -1310,11 +1333,12 @@ struct isp2x_isp_other_cfg {
struct isp2x_rkiesharp_cfg rkiesharp_cfg;
struct isp2x_superimp_cfg superimp_cfg;
struct isp2x_sdg_cfg sdg_cfg;
struct isp2x_ctk_cfg ctk_cfg;
struct isp2x_bdm_config bdm_cfg;
struct isp2x_hdrtmo_cfg hdrtmo_cfg;
struct isp2x_dhaz_cfg dhaz_cfg;
struct isp2x_gain_cfg gain_cfg;
struct isp2x_3dlut_cfg isp3dlut_cfg;
struct isp2x_ldch_cfg ldch_cfg; // must be last item
} __attribute__ ((packed));
struct isp2x_isp_meas_cfg {
@@ -1340,7 +1364,7 @@ struct isp2x_isp_params_cfg {
u64 module_cfg_update;
struct isp2x_isp_meas_cfg meas;
struct isp2x_isp_other_cfg others;
struct isp2x_isp_other_cfg others; // must be last item
} __attribute__ ((packed));
struct isp2x_siawb_meas {
@@ -1440,11 +1464,11 @@ struct isp2x_rawhistlite_stat {
} __attribute__ ((packed));
struct isp2x_sihst_win_stat {
u32 hist_bins[ISP2X_HIST_BIN_N_MAX];
u32 hist_bins[ISP2X_SIHIST_BIN_N_MAX];
} __attribute__ ((packed));
struct isp2x_sihst_stat {
struct isp2x_sihst_win_stat win_stat[ISP2X_HIST_WIN_NUM];
struct isp2x_sihst_win_stat win_stat[ISP2X_SIHIST_WIN_NUM];
} __attribute__ ((packed));
struct isp2x_stat {
@@ -1465,7 +1489,6 @@ struct isp2x_stat {
struct isp2x_bls_stat bls;
struct isp2x_hdrtmo_stat hdrtmo;
struct isp2x_wdr_stat wdr;
struct isp2x_dhaz_stat dhaz;
} __attribute__ ((packed));