浏览代码

[media] omap3isp: DT support for clocks

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
Laurent Pinchart 10 年之前
父节点
当前提交
64904b574e
共有 1 个文件被更改,包括 25 次插入0 次删除
  1. 25 0
      drivers/media/platform/omap3isp/isp.c

+ 25 - 0
drivers/media/platform/omap3isp/isp.c

@@ -279,9 +279,21 @@ static const struct clk_init_data isp_xclk_init_data = {
 	.num_parents = 1,
 	.num_parents = 1,
 };
 };
 
 
+static struct clk *isp_xclk_src_get(struct of_phandle_args *clkspec, void *data)
+{
+	unsigned int idx = clkspec->args[0];
+	struct isp_device *isp = data;
+
+	if (idx >= ARRAY_SIZE(isp->xclks))
+		return ERR_PTR(-ENOENT);
+
+	return isp->xclks[idx].clk;
+}
+
 static int isp_xclk_init(struct isp_device *isp)
 static int isp_xclk_init(struct isp_device *isp)
 {
 {
 	struct isp_platform_data *pdata = isp->pdata;
 	struct isp_platform_data *pdata = isp->pdata;
+	struct device_node *np = isp->dev->of_node;
 	struct clk_init_data init;
 	struct clk_init_data init;
 	unsigned int i;
 	unsigned int i;
 
 
@@ -312,6 +324,12 @@ static int isp_xclk_init(struct isp_device *isp)
 		if (IS_ERR(xclk->clk))
 		if (IS_ERR(xclk->clk))
 			return PTR_ERR(xclk->clk);
 			return PTR_ERR(xclk->clk);
 
 
+		/* When instantiated from DT we don't need to register clock
+		 * aliases.
+		 */
+		if (np)
+			continue;
+
 		if (pdata->xclks[i].con_id == NULL &&
 		if (pdata->xclks[i].con_id == NULL &&
 		    pdata->xclks[i].dev_id == NULL)
 		    pdata->xclks[i].dev_id == NULL)
 			continue;
 			continue;
@@ -327,13 +345,20 @@ static int isp_xclk_init(struct isp_device *isp)
 		clkdev_add(xclk->lookup);
 		clkdev_add(xclk->lookup);
 	}
 	}
 
 
+	if (np)
+		of_clk_add_provider(np, isp_xclk_src_get, isp);
+
 	return 0;
 	return 0;
 }
 }
 
 
 static void isp_xclk_cleanup(struct isp_device *isp)
 static void isp_xclk_cleanup(struct isp_device *isp)
 {
 {
+	struct device_node *np = isp->dev->of_node;
 	unsigned int i;
 	unsigned int i;
 
 
+	if (np)
+		of_clk_del_provider(np);
+
 	for (i = 0; i < ARRAY_SIZE(isp->xclks); ++i) {
 	for (i = 0; i < ARRAY_SIZE(isp->xclks); ++i) {
 		struct isp_xclk *xclk = &isp->xclks[i];
 		struct isp_xclk *xclk = &isp->xclks[i];