OSDN Git Service

ARM: mach-shmobile: optimize PLLC2 frequency for HDMI
authorGuennadi Liakhovetski <g.liakhovetski@gmx.de>
Tue, 2 Nov 2010 11:27:34 +0000 (11:27 +0000)
committerPaul Mundt <lethal@linux-sh.org>
Wed, 10 Nov 2010 08:59:43 +0000 (17:59 +0900)
On ap4evb PLLC2 is only used as a parent of the HDMI clock, therefore it can
be reconfigured freely to improve HDMI clock precision.

Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de>
Signed-off-by: Paul Mundt <lethal@linux-sh.org>
arch/arm/mach-shmobile/board-ap4evb.c

index 32d9e28..732baed 100644 (file)
@@ -669,10 +669,15 @@ static struct platform_device lcdc1_device = {
        },
 };
 
+static long ap4evb_clk_optimize(unsigned long target, unsigned long *best_freq,
+                               unsigned long *parent_freq);
+
+
 static struct sh_mobile_hdmi_info hdmi_info = {
        .lcd_chan = &sh_mobile_lcdc1_info.ch[0],
        .lcd_dev = &lcdc1_device.dev,
        .flags = HDMI_SND_SRC_SPDIF,
+       .clk_optimize_parent = ap4evb_clk_optimize,
 };
 
 static struct resource hdmi_resources[] = {
@@ -699,6 +704,25 @@ static struct platform_device hdmi_device = {
        },
 };
 
+static long ap4evb_clk_optimize(unsigned long target, unsigned long *best_freq,
+                               unsigned long *parent_freq)
+{
+       struct clk *hdmi_ick = clk_get(&hdmi_device.dev, "ick");
+       long error;
+
+       if (IS_ERR(hdmi_ick)) {
+               int ret = PTR_ERR(hdmi_ick);
+               pr_err("Cannot get HDMI ICK: %d\n", ret);
+               return ret;
+       }
+
+       error = clk_round_parent(hdmi_ick, target, best_freq, parent_freq, 1, 64);
+
+       clk_put(hdmi_ick);
+
+       return error;
+}
+
 static struct gpio_led ap4evb_leds[] = {
        {
                .name                   = "led4",