projects
/
firefly-linux-kernel-4.4.55.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
video/rockchip: rga2: force rga version if hardware not support
[firefly-linux-kernel-4.4.55.git]
/
drivers
/
video
/
rockchip
/
rga2
/
rga2_drv.c
diff --git
a/drivers/video/rockchip/rga2/rga2_drv.c
b/drivers/video/rockchip/rga2/rga2_drv.c
index 7030a55c01532ef1e2ce3a32a88f8e36e3b62f04..850d20f33f348b8208387f9b479cea4e5e175e2a 100644
(file)
--- a/
drivers/video/rockchip/rga2/rga2_drv.c
+++ b/
drivers/video/rockchip/rga2/rga2_drv.c
@@
-59,7
+59,7
@@
#define RGA2_TEST_FLUSH_TIME 0
#define RGA2_INFO_BUS_ERROR 1
#define RGA2_POWER_OFF_DELAY 4*HZ /* 4s */
#define RGA2_TEST_FLUSH_TIME 0
#define RGA2_INFO_BUS_ERROR 1
#define RGA2_POWER_OFF_DELAY 4*HZ /* 4s */
-#define RGA2_TIMEOUT_DELAY
2*HZ /* 2
s */
+#define RGA2_TIMEOUT_DELAY
(HZ / 10) /* 100m
s */
#define RGA2_MAJOR 255
#define RGA2_RESET_TIMEOUT 1000
#define RGA2_MAJOR 255
#define RGA2_RESET_TIMEOUT 1000
@@
-159,11
+159,30
@@
static inline int rga2_init_version(void)
pr_err("rga2_drvdata is null\n");
return -EINVAL;
}
pr_err("rga2_drvdata is null\n");
return -EINVAL;
}
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 0))
+ pm_runtime_get_sync(rga2_drvdata->dev);
+#endif
+
+ clk_prepare_enable(rga2_drvdata->aclk_rga2);
+ clk_prepare_enable(rga2_drvdata->hclk_rga2);
reg_version = rga2_read(0x028);
reg_version = rga2_read(0x028);
+
+ clk_disable_unprepare(rga2_drvdata->aclk_rga2);
+ clk_disable_unprepare(rga2_drvdata->hclk_rga2);
+
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 0))
+ pm_runtime_put(rga2_drvdata->dev);
+#endif
+
major_version = (reg_version & RGA2_MAJOR_VERSION_MASK) >> 24;
minor_version = (reg_version & RGA2_MINOR_VERSION_MASK) >> 20;
major_version = (reg_version & RGA2_MAJOR_VERSION_MASK) >> 24;
minor_version = (reg_version & RGA2_MINOR_VERSION_MASK) >> 20;
+ /*
+ * some old rga ip has no rga version register, so force set to 2.00
+ */
+ if (!major_version && !minor_version)
+ major_version = 2;
sprintf(rga->version, "%d.%02d", major_version, minor_version);
return 0;
sprintf(rga->version, "%d.%02d", major_version, minor_version);
return 0;
@@
-174,7
+193,7
@@
static void rga2_soft_reset(void)
u32 i;
u32 reg;
u32 i;
u32 reg;
- rga2_write((1 << 3) | (1 << 4)
, RGA2_SYS_CTRL); //RGA_SYS_CTRL
+ rga2_write((1 << 3) | (1 << 4)
| (1 << 6), RGA2_SYS_CTRL);
for(i = 0; i < RGA2_RESET_TIMEOUT; i++)
{
for(i = 0; i < RGA2_RESET_TIMEOUT; i++)
{
@@
-899,9
+918,14
@@
static int rga2_blit_async(rga2_session *session, struct rga2_req *req)
static int rga2_blit_sync(rga2_session *session, struct rga2_req *req)
{
static int rga2_blit_sync(rga2_session *session, struct rga2_req *req)
{
+ struct rga2_req req_bak;
+ int try = 10;
int ret = -1;
int ret_timeout = 0;
int ret = -1;
int ret_timeout = 0;
+ memcpy(&req_bak, req, sizeof(req_bak));
+retry:
+
#if RGA2_TEST_MSG
if (1) {//req->bitblt_mode == 0x2) {
print_info(req);
#if RGA2_TEST_MSG
if (1) {//req->bitblt_mode == 0x2) {
print_info(req);
@@
-943,6
+967,10
@@
static int rga2_blit_sync(rga2_session *session, struct rga2_req *req)
rga2_end = ktime_sub(rga2_end, rga2_start);
printk("sync one cmd end time %d\n", (int)ktime_to_us(rga2_end));
#endif
rga2_end = ktime_sub(rga2_end, rga2_start);
printk("sync one cmd end time %d\n", (int)ktime_to_us(rga2_end));
#endif
+ if (ret == -ETIMEDOUT && try--) {
+ memcpy(req, &req_bak, sizeof(req_bak));
+ goto retry;
+ }
return ret;
}
return ret;
}