#include <linux/fb.h>\r
#include <linux/wakelock.h>\r
\r
+#if defined(CONFIG_ION_ROCKCHIP)\r
+#include <linux/rockchip_ion.h>\r
+#endif\r
+\r
+\r
#include "rga2.h"\r
#include "rga2_reg_info.h"\r
#include "rga2_mmu_info.h"\r
struct clk *hclk_rga2;\r
struct clk *pd_rga2;\r
struct clk *rga2;\r
+\r
+ #if defined(CONFIG_ION_ROCKCHIP)\r
+ struct ion_client * ion_client;\r
+ #endif\r
};\r
\r
struct rga2_drvdata_t *rga2_drvdata;\r
struct rga2_service_info rga2_service;\r
struct rga2_mmu_buf_t rga2_mmu_buf;\r
\r
+#if defined(CONFIG_ION_ROCKCHIP)\r
+extern struct ion_client *rockchip_ion_client_create(const char * name);\r
+#endif\r
+\r
static int rga2_blit_async(rga2_session *session, struct rga2_req *req);\r
static void rga2_del_running_list(void);\r
static void rga2_del_running_list_timeout(void);\r
if (rga2_service.enable)\r
return;\r
\r
- //clk_enable(rga2_drvdata->rga2);\r
- //clk_prepare_enable(rga2_drvdata->aclk_rga2);\r
- //clk_prepare_enable(rga2_drvdata->hclk_rga2);\r
+ clk_prepare_enable(rga2_drvdata->rga2);\r
+ clk_prepare_enable(rga2_drvdata->aclk_rga2);\r
+ clk_prepare_enable(rga2_drvdata->hclk_rga2);\r
//clk_enable(rga2_drvdata->pd_rga2);\r
wake_lock(&rga2_drvdata->wake_lock);\r
rga2_service.enable = true;\r
}\r
\r
//clk_disable(rga2_drvdata->pd_rga2);\r
- //clk_disable(rga2_drvdata->rga2);\r
- //clk_disable_unprepare(rga2_drvdata->aclk_rga2);\r
- //clk_disable_unprepare(rga2_drvdata->hclk_rga2);\r
+ clk_disable_unprepare(rga2_drvdata->rga2);\r
+ clk_disable_unprepare(rga2_drvdata->aclk_rga2);\r
+ clk_disable_unprepare(rga2_drvdata->hclk_rga2);\r
wake_unlock(&rga2_drvdata->wake_lock);\r
rga2_service.enable = false;\r
}\r
}\r
}\r
\r
+\r
+static int rga2_convert_dma_buf(struct rga2_req *req)\r
+{\r
+ struct ion_handle *hdl;\r
+ ion_phys_addr_t phy_addr;\r
+ size_t len;\r
+ int ret;\r
+\r
+ if(req->src.yrgb_addr) {\r
+ hdl = ion_import_dma_buf(rga2_drvdata->ion_client, req->src.yrgb_addr);\r
+ if (IS_ERR(hdl)) {\r
+ ret = PTR_ERR(hdl);\r
+ printk("RGA2 ERROR ion buf handle\n");\r
+ return ret;\r
+ }\r
+ ion_phys(rga2_drvdata->ion_client, hdl, &phy_addr, &len);\r
+ req->src.yrgb_addr = phy_addr;\r
+ req->src.uv_addr = req->src.yrgb_addr + (req->src.vir_w * req->src.vir_h);\r
+ ion_free(rga2_drvdata->ion_client, hdl);\r
+ }\r
+ else {\r
+ req->src.yrgb_addr = req->src.uv_addr;\r
+ req->src.uv_addr = req->src.yrgb_addr + (req->src.vir_w * req->src.vir_h);\r
+ }\r
+\r
+ if(req->dst.yrgb_addr) {\r
+ hdl = ion_import_dma_buf(rga2_drvdata->ion_client, req->dst.yrgb_addr);\r
+ if (IS_ERR(hdl)) {\r
+ ret = PTR_ERR(hdl);\r
+ printk("RGA2 ERROR ion buf handle\n");\r
+ return ret;\r
+ }\r
+ ion_phys(rga2_drvdata->ion_client, hdl, &phy_addr, &len);\r
+ req->dst.yrgb_addr = phy_addr;\r
+ req->dst.uv_addr = req->dst.yrgb_addr + (req->dst.vir_w * req->dst.vir_h);\r
+ ion_free(rga2_drvdata->ion_client, hdl);\r
+ }\r
+ else {\r
+ req->dst.yrgb_addr = req->dst.uv_addr;\r
+ req->dst.uv_addr = req->dst.yrgb_addr + (req->src.vir_w * req->src.vir_h);\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+\r
static int rga2_blit(rga2_session *session, struct rga2_req *req)\r
{\r
int ret = -1;\r
int num = 0;\r
struct rga2_reg *reg;\r
\r
+ if(rga2_convert_dma_buf(req)) {\r
+ printk("RGA2 : DMA buf copy error\n");\r
+ return -EFAULT;\r
+ }\r
+\r
do {\r
/* check value if legal */\r
ret = rga2_check_param(req);\r
wake_lock_init(&data->wake_lock, WAKE_LOCK_SUSPEND, "rga");\r
\r
//data->pd_rga2 = clk_get(NULL, "pd_rga");\r
- //data->rga2 = clk_get(NULL, "rga");\r
- //data->aclk_rga2 = devm_clk_get(&pdev->dev, "aclk_rga");\r
- //data->hclk_rga2 = devm_clk_get(&pdev->dev, "hclk_rga");\r
+ data->rga2 = devm_clk_get(&pdev->dev, "clk_rga");\r
+ data->aclk_rga2 = devm_clk_get(&pdev->dev, "aclk_rga");\r
+ data->hclk_rga2 = devm_clk_get(&pdev->dev, "hclk_rga");\r
\r
/* map the registers */\r
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);\r
platform_set_drvdata(pdev, data);\r
rga2_drvdata = data;\r
\r
+ #if defined(CONFIG_ION_ROCKCHIP)\r
+ data->ion_client = rockchip_ion_client_create("rga");\r
+ if (IS_ERR(data->ion_client)) {\r
+ dev_err(&pdev->dev, "failed to create ion client for rga");\r
+ return PTR_ERR(data->ion_client);\r
+ } else {\r
+ dev_info(&pdev->dev, "rga ion client create success!\n");\r
+ }\r
+ #endif\r
+\r
ret = misc_register(&rga2_dev);\r
if(ret)\r
{\r
iounmap((void __iomem *)(data->rga_base));\r
\r
//clk_put(data->pd_rga2);\r
- //clk_put(data->rga2);\r
- //devm_clk_put(&pdev->dev, data->aclk_rga2);\r
- //devm_clk_put(&pdev->dev, data->hclk_rga2);\r
+ devm_clk_put(&pdev->dev, data->rga2);\r
+ devm_clk_put(&pdev->dev, data->aclk_rga2);\r
+ devm_clk_put(&pdev->dev, data->hclk_rga2);\r
\r
kfree(data);\r
return 0;\r