struct device dev;\r
void *rga_base;\r
int irq0;\r
-\r
- struct clk *aclk_rga;\r
- struct clk *hclk_rga;\r
\r
struct delayed_work power_off_work;\r
- bool enable; //clk enable or disable\r
void (*rga_irq_callback)(int rga_retval); //callback function used by aync call\r
};\r
\r
static struct rga_drvdata *drvdata = NULL;\r
rga_service_info rga_service;\r
\r
+static struct clk *aclk_rga;\r
+static struct clk *hclk_rga;\r
+\r
+\r
static int rga_blit_async(rga_session *session, struct rga_req *req);\r
static void rga_del_running_list(void);\r
\r
{\r
//printk("rga_power_on\n");\r
//cancel_delayed_work_sync(&drvdata->power_off_work);\r
- if (drvdata->enable)\r
+ if (rga_service.enable)\r
return;\r
- \r
- clk_enable(drvdata->aclk_rga);\r
- clk_enable(drvdata->hclk_rga);\r
\r
- drvdata->enable = true;\r
+ spin_lock_bh(&rga_service.lock);\r
+ clk_enable(aclk_rga);\r
+ clk_enable(hclk_rga);\r
+ rga_service.enable = true;\r
+ spin_unlock_bh(&rga_service.lock);\r
}\r
\r
\r
int total_running;\r
\r
printk("rga_power_off\n");\r
- if(!drvdata->enable)\r
+ if(!rga_service.enable)\r
return;\r
\r
total_running = atomic_read(&rga_service.total_running);\r
rga_dump();\r
}\r
\r
- clk_disable(drvdata->aclk_rga);\r
- clk_disable(drvdata->hclk_rga);\r
+ clk_disable(aclk_rga);\r
+ clk_disable(hclk_rga);\r
\r
- drvdata->enable = false;\r
+ rga_service.enable = false;\r
}\r
\r
-\r
-\r
-\r
static int rga_flush(rga_session *session, unsigned long arg)\r
{ \r
int ret = 0;\r
int ret_timeout;\r
-\r
\r
#if RGA_TEST_FLUSH_TIME\r
ktime_t start;\r
start = ktime_get();\r
#endif\r
\r
- ret_timeout = wait_event_interruptible_timeout(session->wait, atomic_read(&session->done), RGA_TIMEOUT_DELAY);\r
-\r
- \r
+ ret_timeout = wait_event_interruptible_timeout(session->wait, atomic_read(&session->done), RGA_TIMEOUT_DELAY); \r
\r
if (unlikely(ret_timeout < 0)) {\r
pr_err("flush pid %d wait task ret %d\n", session->pid, ret); \r
{\r
/*RGA can support up to 8192*8192 resolution in RGB format,but we limit the image size to 8191*8191 here*/\r
//check src width and height\r
- if (unlikely((req->src.act_w <= 0) || (req->src.act_w > 8191) || (req->src.act_h <= 0) || (req->src.act_h > 8191))) {\r
+ if (unlikely((req->src.act_w <= 0) || (req->src.act_w > 8191) || (req->src.act_h <= 0) || (req->src.act_h > 8191))) \r
+ {\r
ERR("invalid source resolution act_w = %d, act_h = %d\n", req->src.act_w, req->src.act_h);\r
return -EINVAL;\r
}\r
\r
//check dst width and height\r
- if (unlikely((req->dst.act_w <= 0) || (req->dst.act_w > 2048) || (req->dst.act_h <= 0) || (req->dst.act_h > 2048))) {\r
+ if (unlikely((req->dst.act_w <= 0) || (req->dst.act_w > 2048) || (req->dst.act_h <= 0) || (req->dst.act_h > 2048))) \r
+ {\r
ERR("invalid destination resolution act_w = %d, act_h = %d\n", req->dst.act_w, req->dst.act_h);\r
return -EINVAL;\r
}\r
}\r
\r
\r
-#if RGA_TEST \r
+#if 1//RGA_TEST \r
static void print_info(struct rga_req *req)\r
{ \r
printk("src.yrgb_addr = %.8x, src.uv_addr = %.8x, src.v_addr = %.8x\n", \r
if(NULL == req2) {\r
return -EFAULT; \r
}\r
-\r
+ \r
ret = RGA_gen_two_pro(req, req2); \r
if(ret == -EINVAL) {\r
break;\r
- } \r
+ }\r
\r
ret = rga_check_param(req);\r
if(ret == -EINVAL) {\r
printk("req 1 argument is inval\n");\r
break;\r
}\r
- \r
+ \r
ret = rga_check_param(req2);\r
if(ret == -EINVAL) {\r
printk("req 2 argument is inval\n");\r
{\r
uint32_t enable;\r
\r
- enable = drvdata->enable; \r
- //rga_power_off(NULL); \r
- drvdata->enable = enable;\r
+ enable = rga_service.enable; \r
+ rga_power_off(); \r
+ rga_service.enable = enable;\r
\r
return 0;\r
}\r
\r
static int rga_resume(struct platform_device *pdev)\r
{ \r
- //rga_power_on(); \r
+ rga_power_on(); \r
return 0;\r
}\r
\r
static void rga_shutdown(struct platform_device *pdev)\r
{\r
pr_cont("shutdown..."); \r
- //rga_power_off(); \r
+ rga_power_off(); \r
pr_cont("done\n");\r
}\r
\r
atomic_set(&rga_service.total_running, 0);\r
atomic_set(&rga_service.src_format_swt, 0);\r
rga_service.last_prc_src_format = 1; /* default is yuv first*/\r
- data->enable = 0;\r
+ rga_service.enable = false;\r
\r
if(NULL == data)\r
{\r
return -ENOMEM;\r
}\r
\r
- data->aclk_rga = clk_get(NULL, "aclk_rga"); \r
- if (IS_ERR(data->aclk_rga))\r
+ aclk_rga = clk_get(NULL, "aclk_rga"); \r
+ if (IS_ERR(aclk_rga))\r
{\r
ERR("failed to find rga axi clock source.\n");\r
ret = -ENOENT;\r
goto err_clock;\r
}\r
\r
- data->hclk_rga = clk_get(NULL, "hclk_rga");\r
- if (IS_ERR(data->hclk_rga))\r
+ hclk_rga = clk_get(NULL, "hclk_rga");\r
+ if (IS_ERR(hclk_rga))\r
{\r
ERR("failed to find rga ahb clock source.\n");\r
ret = -ENOENT;\r
goto err_clock;\r
}\r
\r
- //rga_power_on();\r
+ rga_power_on();\r
\r
/* map the memory */\r
if (!request_mem_region(RK30_RGA_PHYS, RK30_RGA_SIZE, "rga_io")) \r
}\r
\r
mutex_init(&rga_service.mutex);\r
- data->enable = false;\r
+ rga_service.enable = false;\r
INIT_DELAYED_WORK(&data->power_off_work, rga_power_off);\r
data->rga_irq_callback = NULL;\r
\r
goto err_misc_register;\r
}\r
\r
- //rga_power_off();\r
+ rga_power_off();\r
\r
DBG("RGA Driver loaded succesfully\n");\r
\r
free_irq(data->irq0, &data->miscdev);\r
iounmap((void __iomem *)(data->rga_base)); \r
\r
- if(data->aclk_rga) {\r
- clk_put(data->aclk_rga);\r
+ if(aclk_rga) {\r
+ clk_put(aclk_rga);\r
}\r
\r
- if(data->hclk_rga) {\r
- clk_put(data->hclk_rga);\r
+ if(hclk_rga) {\r
+ clk_put(hclk_rga);\r
}\r
\r
kfree(data);\r