Skip to content

Commit 603c914

Browse files
topdjgodjamess-huang
authored andcommitted
[Camera] update RK ISP for disable 3A
Change-Id: I9751605ff9a948978121960134e132ae0a20ac27 Reviewed-on: https://tp-biosrd-v02/gerrit/85324 Reviewed-by: Jamess Huang(黃以民) <Jamess_Huang@asus.com> Tested-by: Jamess Huang(黃以民) <Jamess_Huang@asus.com>
1 parent e600153 commit 603c914

File tree

11 files changed

+560
-288
lines changed

11 files changed

+560
-288
lines changed

drivers/media/platform/rockchip/isp1/capture.c

100644100755
Lines changed: 103 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
#include <media/v4l2-ioctl.h>
4141
#include <media/v4l2-subdev.h>
4242
#include <media/videobuf2-dma-contig.h>
43+
#include <linux/dma-iommu.h>
4344
#include "dev.h"
4445
#include "regs.h"
4546

@@ -759,7 +760,7 @@ static int mp_config_mi(struct rkisp1_stream *stream)
759760
mi_set_cb_size(stream, stream->out_fmt.plane_fmt[1].sizeimage);
760761
mi_set_cr_size(stream, stream->out_fmt.plane_fmt[2].sizeimage);
761762

762-
mp_frame_end_int_enable(base);
763+
mi_frame_end_int_enable(stream);
763764
if (stream->out_isp_fmt.uv_swap)
764765
mp_set_uv_swap(base);
765766

@@ -800,7 +801,7 @@ static int sp_config_mi(struct rkisp1_stream *stream)
800801
sp_set_y_height(base, stream->out_fmt.height);
801802
sp_set_y_line_length(base, stream->u.sp.y_stride);
802803

803-
sp_frame_end_int_enable(base);
804+
mi_frame_end_int_enable(stream);
804805
if (output_isp_fmt->uv_swap)
805806
sp_set_uv_swap(base);
806807

@@ -876,21 +877,17 @@ static void update_mi(struct rkisp1_stream *stream)
876877

877878
static void mp_stop_mi(struct rkisp1_stream *stream)
878879
{
879-
void __iomem *base = stream->ispdev->base_addr;
880-
881-
if (stream->state != RKISP1_STATE_STREAMING)
880+
if (!stream->streaming)
882881
return;
883-
stream->ops->clr_frame_end_int(base);
882+
mi_frame_end_int_clear(stream);
884883
stream->ops->disable_mi(stream);
885884
}
886885

887886
static void sp_stop_mi(struct rkisp1_stream *stream)
888887
{
889-
void __iomem *base = stream->ispdev->base_addr;
890-
891-
if (stream->state != RKISP1_STATE_STREAMING)
888+
if (!stream->streaming)
892889
return;
893-
stream->ops->clr_frame_end_int(base);
890+
mi_frame_end_int_clear(stream);
894891
stream->ops->disable_mi(stream);
895892
}
896893

@@ -900,8 +897,6 @@ static struct streams_ops rkisp1_mp_streams_ops = {
900897
.disable_mi = mp_disable_mi,
901898
.stop_mi = mp_stop_mi,
902899
.set_data_path = mp_set_data_path,
903-
.clr_frame_end_int = mp_clr_frame_end_int,
904-
.is_frame_end_int_masked = mp_is_frame_end_int_masked,
905900
.is_stream_stopped = mp_is_stream_stopped,
906901
};
907902

@@ -911,8 +906,6 @@ static struct streams_ops rkisp1_sp_streams_ops = {
911906
.disable_mi = sp_disable_mi,
912907
.stop_mi = sp_stop_mi,
913908
.set_data_path = sp_set_data_path,
914-
.clr_frame_end_int = sp_clr_frame_end_int,
915-
.is_frame_end_int_masked = sp_is_frame_end_int_masked,
916909
.is_stream_stopped = sp_is_stream_stopped,
917910
};
918911

@@ -980,13 +973,13 @@ static void rkisp1_stream_stop(struct rkisp1_stream *stream)
980973

981974
stream->stopping = true;
982975
ret = wait_event_timeout(stream->done,
983-
stream->state != RKISP1_STATE_STREAMING,
976+
!stream->streaming,
984977
msecs_to_jiffies(1000));
985978
if (!ret) {
986979
v4l2_warn(v4l2_dev, "waiting on event return error %d\n", ret);
987980
stream->ops->stop_mi(stream);
988981
stream->stopping = false;
989-
stream->state = RKISP1_STATE_READY;
982+
stream->streaming = false;
990983
}
991984
disable_dcrop(stream, true);
992985
disable_rsz(stream, true);
@@ -1022,11 +1015,11 @@ static int rkisp1_start(struct rkisp1_stream *stream)
10221015
* also required because the sencond FE maybe corrupt especially
10231016
* when run at 120fps.
10241017
*/
1025-
if (other->state != RKISP1_STATE_STREAMING) {
1018+
if (!other->streaming) {
10261019
force_cfg_update(base);
10271020
mi_frame_end(stream);
10281021
}
1029-
stream->state = RKISP1_STATE_STREAMING;
1022+
stream->streaming = true;
10301023

10311024
return 0;
10321025
}
@@ -1100,7 +1093,7 @@ static void rkisp1_buf_queue(struct vb2_buffer *vb)
11001093
spin_lock_irqsave(&stream->vbq_lock, lock_flags);
11011094

11021095
/* XXX: replace dummy to speed up */
1103-
if (stream->state == RKISP1_STATE_STREAMING &&
1096+
if (stream->streaming &&
11041097
stream->next_buf == NULL &&
11051098
atomic_read(&stream->ispdev->isp_sdev.frm_sync_seq) == 0) {
11061099
stream->next_buf = ispbuf;
@@ -1193,7 +1186,7 @@ static int rkisp1_stream_start(struct rkisp1_stream *stream)
11931186
bool async = false;
11941187
int ret;
11951188

1196-
if (other->state == RKISP1_STATE_STREAMING)
1189+
if (other->streaming)
11971190
async = true;
11981191

11991192
ret = rkisp1_config_rsz(stream, async);
@@ -1224,7 +1217,7 @@ rkisp1_start_streaming(struct vb2_queue *queue, unsigned int count)
12241217
struct v4l2_device *v4l2_dev = &dev->v4l2_dev;
12251218
int ret;
12261219

1227-
if (WARN_ON(stream->state != RKISP1_STATE_READY))
1220+
if (WARN_ON(stream->streaming))
12281221
return -EBUSY;
12291222

12301223
ret = rkisp1_create_dummy_buf(stream);
@@ -1331,7 +1324,7 @@ static void rkisp1_set_fmt(struct rkisp1_stream *stream,
13311324
if (!pixm->quantization)
13321325
pixm->quantization = V4L2_QUANTIZATION_FULL_RANGE;
13331326
/* can not change quantization when stream-on */
1334-
if (other_stream->state == RKISP1_STATE_STREAMING)
1327+
if (other_stream->streaming)
13351328
pixm->quantization = other_stream->out_fmt.quantization;
13361329

13371330
/* calculate size */
@@ -1387,6 +1380,64 @@ static void rkisp1_set_fmt(struct rkisp1_stream *stream,
13871380
}
13881381
}
13891382

1383+
static int rkisp1_dma_attach_device(struct rkisp1_device *rkisp1_dev)
1384+
{
1385+
struct iommu_domain *domain = rkisp1_dev->domain;
1386+
struct device *dev = rkisp1_dev->dev;
1387+
int ret;
1388+
1389+
ret = iommu_attach_device(domain, dev);
1390+
if (ret) {
1391+
dev_err(dev, "Failed to attach iommu device\n");
1392+
return ret;
1393+
}
1394+
1395+
if (!common_iommu_setup_dma_ops(dev, 0x10000000, SZ_2G, domain->ops)) {
1396+
dev_err(dev, "Failed to set dma_ops\n");
1397+
iommu_detach_device(domain, dev);
1398+
ret = -ENODEV;
1399+
}
1400+
1401+
return ret;
1402+
}
1403+
1404+
static void rkisp1_dma_detach_device(struct rkisp1_device *rkisp1_dev)
1405+
{
1406+
struct iommu_domain *domain = rkisp1_dev->domain;
1407+
struct device *dev = rkisp1_dev->dev;
1408+
1409+
iommu_detach_device(domain, dev);
1410+
}
1411+
1412+
static int rkisp1_fh_open(struct file *filp)
1413+
{
1414+
struct rkisp1_stream *stream = video_drvdata(filp);
1415+
struct rkisp1_device *dev = stream->ispdev;
1416+
int ret;
1417+
1418+
ret = v4l2_fh_open(filp);
1419+
if (!ret) {
1420+
if (atomic_inc_return(&dev->open_cnt) == 1)
1421+
rkisp1_dma_attach_device(dev);
1422+
}
1423+
1424+
return ret;
1425+
}
1426+
1427+
static int rkisp1_fop_release(struct file *file)
1428+
{
1429+
struct rkisp1_stream *stream = video_drvdata(file);
1430+
struct rkisp1_device *dev = stream->ispdev;
1431+
int ret;
1432+
1433+
ret = vb2_fop_release(file);
1434+
1435+
if (atomic_dec_return(&dev->open_cnt) == 0)
1436+
rkisp1_dma_detach_device(dev);
1437+
1438+
return ret;
1439+
}
1440+
13901441
/************************* v4l2_file_operations***************************/
13911442
void rkisp1_stream_init(struct rkisp1_device *dev, u32 id)
13921443
{
@@ -1408,7 +1459,7 @@ void rkisp1_stream_init(struct rkisp1_device *dev, u32 id)
14081459
stream->config = &rkisp1_mp_stream_config;
14091460
}
14101461

1411-
stream->state = RKISP1_STATE_READY;
1462+
stream->streaming = false;
14121463

14131464
memset(&pixm, 0, sizeof(pixm));
14141465
pixm.pixelformat = V4L2_PIX_FMT_YUYV;
@@ -1423,8 +1474,8 @@ void rkisp1_stream_init(struct rkisp1_device *dev, u32 id)
14231474
}
14241475

14251476
static const struct v4l2_file_operations rkisp1_fops = {
1426-
.open = v4l2_fh_open,
1427-
.release = vb2_fop_release,
1477+
.open = rkisp1_fh_open,
1478+
.release = rkisp1_fop_release,
14281479
.unlocked_ioctl = video_ioctl2,
14291480
.poll = vb2_fop_poll,
14301481
.mmap = vb2_fop_mmap,
@@ -1705,33 +1756,36 @@ int rkisp1_register_stream_vdevs(struct rkisp1_device *dev)
17051756

17061757
/**************** Interrupter Handler ****************/
17071758

1708-
void rkisp1_mi_isr(struct rkisp1_stream *stream)
1759+
void rkisp1_mi_isr(u32 mis_val, struct rkisp1_device *dev)
17091760
{
1710-
struct rkisp1_device *dev = stream->ispdev;
1711-
void __iomem *base = stream->ispdev->base_addr;
1712-
u32 val;
1713-
1714-
stream->ops->clr_frame_end_int(base);
1715-
if (stream->ops->is_frame_end_int_masked(base)) {
1716-
val = mi_get_masked_int_status(base);
1717-
v4l2_err(&dev->v4l2_dev, "icr err: 0x%x\n", val);
1718-
}
1761+
int i;
17191762

1720-
if (stream->stopping) {
1721-
/* Make sure stream is actually stopped, whose state
1722-
* can be read from the shadow register, before wake_up()
1723-
* thread which would immediately free all frame buffers.
1724-
* stop_mi() takes effect at the next frame end
1725-
* that sync the configurations to shadow regs.
1726-
*/
1727-
if (stream->ops->is_stream_stopped(dev->base_addr)) {
1728-
stream->stopping = false;
1729-
stream->state = RKISP1_STATE_READY;
1730-
wake_up(&stream->done);
1763+
for (i = 0; i < ARRAY_SIZE(dev->stream); ++i) {
1764+
struct rkisp1_stream *stream = &dev->stream[i];
1765+
1766+
if (!(mis_val & CIF_MI_FRAME(stream)))
1767+
continue;
1768+
1769+
mi_frame_end_int_clear(stream);
1770+
1771+
if (stream->stopping) {
1772+
/*
1773+
* Make sure stream is actually stopped, whose state
1774+
* can be read from the shadow register, before
1775+
* wake_up() thread which would immediately free all
1776+
* frame buffers. stop_mi() takes effect at the next
1777+
* frame end that sync the configurations to shadow
1778+
* regs.
1779+
*/
1780+
if (stream->ops->is_stream_stopped(dev->base_addr)) {
1781+
stream->stopping = false;
1782+
stream->streaming = false;
1783+
wake_up(&stream->done);
1784+
} else {
1785+
stream->ops->stop_mi(stream);
1786+
}
17311787
} else {
1732-
stream->ops->stop_mi(stream);
1788+
mi_frame_end(stream);
17331789
}
1734-
} else {
1735-
mi_frame_end(stream);
17361790
}
17371791
}

drivers/media/platform/rockchip/isp1/capture.h

100644100755
Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -142,8 +142,6 @@ struct streams_ops {
142142
void (*enable_mi)(struct rkisp1_stream *stream);
143143
void (*disable_mi)(struct rkisp1_stream *stream);
144144
void (*set_data_path)(void __iomem *base);
145-
void (*clr_frame_end_int)(void __iomem *base);
146-
bool (*is_frame_end_int_masked)(void __iomem *base);
147145
bool (*is_stream_stopped)(void __iomem *base);
148146
};
149147

@@ -163,11 +161,9 @@ struct streams_ops {
163161
* @next_buf: the buffer used for next frame
164162
*/
165163
struct rkisp1_stream {
166-
u32 id;
164+
unsigned id:1;
167165
struct rkisp1_device *ispdev;
168166
struct rkisp1_vdev_node vnode;
169-
enum rkisp1_state state;
170-
enum rkisp1_state saved_state;
171167
struct capture_fmt out_isp_fmt;
172168
struct v4l2_pix_format_mplane out_fmt;
173169
struct v4l2_rect dcrop;
@@ -178,6 +174,7 @@ struct rkisp1_stream {
178174
struct rkisp1_dummy_buffer dummy_buf;
179175
struct rkisp1_buffer *curr_buf;
180176
struct rkisp1_buffer *next_buf;
177+
bool streaming;
181178
bool stopping;
182179
wait_queue_head_t done;
183180
union {
@@ -188,7 +185,7 @@ struct rkisp1_stream {
188185

189186
void rkisp1_unregister_stream_vdevs(struct rkisp1_device *dev);
190187
int rkisp1_register_stream_vdevs(struct rkisp1_device *dev);
191-
void rkisp1_mi_isr(struct rkisp1_stream *stream);
188+
void rkisp1_mi_isr(u32 mis_val, struct rkisp1_device *dev);
192189
void rkisp1_stream_init(struct rkisp1_device *dev, u32 id);
193190

194191
#endif /* _RKISP1_PATH_VIDEO_H */

drivers/media/platform/rockchip/isp1/common.h

100644100755
Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,8 @@
4646
#define RKISP1_DEFAULT_HEIGHT 600
4747

4848
#define RKISP1_MAX_STREAM 2
49-
#define RKISP1_STREAM_SP 0
50-
#define RKISP1_STREAM_MP 1
49+
#define RKISP1_STREAM_MP 0
50+
#define RKISP1_STREAM_SP 1
5151

5252
#define RKISP1_PLANE_Y 0
5353
#define RKISP1_PLANE_CB 1
@@ -85,15 +85,6 @@ enum rkisp1_fmt_raw_pat_type {
8585
RAW_BGGR,
8686
};
8787

88-
enum rkisp1_state {
89-
/* path not yet opened: */
90-
RKISP1_STATE_DISABLED,
91-
/* path opened and configured, ready for streaming: */
92-
RKISP1_STATE_READY,
93-
/* path is streaming: */
94-
RKISP1_STATE_STREAMING
95-
};
96-
9788
struct rkisp1_buffer {
9889
struct vb2_v4l2_buffer vb;
9990
struct list_head queue;

0 commit comments

Comments
 (0)