Re: Problem with USB on S3C2412

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]


I've made progresses on this issue.

It seems that this was caused by a conflict between the PWM module and the timer that is used to generate the system clock on S3C24XX (Timer 4). I've noticed that because, when I was able to boot successfully my system clock was 8 times slower that it should be. The following patch fixed that (and fixed other minor issues on the clock generator system):


diff -Naurp linux-2.6.27.39.original/arch/arm/mach-s3c2410/include/mach/regs-clock.h linux-2.6.27.39/arch/arm/mach-s3c2410/include/mach/regs-clock.h --- linux-2.6.27.39.original/arch/arm/mach-s3c2410/include/mach/regs-clock.h 2009-11-10 00:59:38.000000000 +0000 +++ linux-2.6.27.39/arch/arm/mach-s3c2410/include/mach/regs-clock.h 2009-11-11 19:16:37.761165411 +0000
@@ -46,7 +46,7 @@
#define S3C2410_PLLCON_PDIVSHIFT     4
#define S3C2410_PLLCON_SDIVSHIFT     0
#define S3C2410_PLLCON_MDIVMASK         ((1<<(1+(19-12)))-1)
-#define S3C2410_PLLCON_PDIVMASK         ((1<<5)-1)
+#define S3C2410_PLLCON_PDIVMASK         ((1<<(1+(9-4)))-1)
#define S3C2410_PLLCON_SDIVMASK         3

/* DCLKCON register addresses in gpio.h */
diff -Naurp linux-2.6.27.39.original/arch/arm/mach-s3c2412/clock.c linux-2.6.27.39/arch/arm/mach-s3c2412/clock.c --- linux-2.6.27.39.original/arch/arm/mach-s3c2412/clock.c 2009-11-10 00:59:38.000000000 +0000 +++ linux-2.6.27.39/arch/arm/mach-s3c2412/clock.c 2009-11-11 19:16:37.761165411 +0000
@@ -129,7 +129,7 @@ static int s3c2412_setparent_usysclk(str
static struct clk clk_usysclk = {
    .name        = "usysclk",
    .id        = -1,
-    .parent        = &clk_xtal,
+    .parent        = &clk_urefclk,
    .set_parent    = s3c2412_setparent_usysclk,
};

@@ -141,7 +141,7 @@ static struct clk clk_mrefclk = {

static struct clk clk_mdivclk = {
    .name        = "mdivclk",
-    .parent        = &clk_xtal,
+    .parent        = &clk_mrefclk,
    .id        = -1,
};

@@ -400,6 +400,8 @@ static struct clk clk_i2s = {
    .round_rate    = s3c2412_roundrate_clksrc,
};

+#ifndef CONFIG_CPU_S3C2412_ONLY
+
static int s3c2412_setparent_cam(struct clk *clk, struct clk *parent)
{
    unsigned long clksrc = __raw_readl(S3C2412_CLKSRC);
@@ -450,6 +452,8 @@ static struct clk clk_cam = {
    .round_rate    = s3c2412_roundrate_clksrc,
};

+#endif
+
/* standard clock definitions */

static struct clk init_clocks_disable[] = {
@@ -603,7 +607,7 @@ struct clk_init {
static struct clk_init clks_src[] __initdata = {
    {
        .clk    = &clk_usysclk,
-        .bit    = S3C2412_CLKSRC_USBCLK_HCLK,
+        .bit    = S3C2412_CLKSRC_USYSCLK_UPLL,
        .src_0    = &clk_urefclk,
        .src_1    = &clk_upll,
    }, {
@@ -611,11 +615,13 @@ static struct clk_init clks_src[] __init
        .bit    = S3C2412_CLKSRC_I2SCLK_MPLL,
        .src_0    = &clk_erefclk,
        .src_1    = &clk_mpll,
+#ifndef CONFIG_CPU_S3C2412_ONLY
    }, {
        .clk    = &clk_cam,
        .bit    = S3C2412_CLKSRC_CAMCLK_HCLK,
        .src_0    = &clk_usysclk,
        .src_1    = &clk_h,
+#endif
    }, {
        .clk    = &clk_msysclk,
        .bit    = S3C2412_CLKSRC_MSYSCLK_MPLL,
diff -Naurp linux-2.6.27.39.original/arch/arm/plat-s3c24xx/clock.c linux-2.6.27.39/arch/arm/plat-s3c24xx/clock.c --- linux-2.6.27.39.original/arch/arm/plat-s3c24xx/clock.c 2009-11-10 00:59:38.000000000 +0000 +++ linux-2.6.27.39/arch/arm/plat-s3c24xx/clock.c 2009-11-11 19:16:37.761165411 +0000
@@ -392,7 +392,7 @@ static int s3c24xx_clkout_setparent(stru

    /* calculate the MISCCR setting for the clock */

-    if (parent == &clk_xtal)
+    if (parent == &clk_mpll)
        source = S3C2410_MISCCR_CLK0_MPLL;
    else if (parent == &clk_upll)
        source = S3C2410_MISCCR_CLK0_UPLL;
diff -Naurp linux-2.6.27.39.original/arch/arm/plat-s3c24xx/pwm-clock.c linux-2.6.27.39/arch/arm/plat-s3c24xx/pwm-clock.c --- linux-2.6.27.39.original/arch/arm/plat-s3c24xx/pwm-clock.c 2009-11-10 00:59:38.000000000 +0000 +++ linux-2.6.27.39/arch/arm/plat-s3c24xx/pwm-clock.c 2009-11-11 19:20:37.229916682 +0000
@@ -274,7 +274,6 @@ static struct pwm_tdiv_clk clk_timer_tdi
            .name        = "pwm-tdiv",
            .parent        = &clk_timer_scaler[1],
            .get_rate    = clk_pwm_tdiv_get_rate,
-            .set_rate    = clk_pwm_tdiv_set_rate,
            .round_rate    = clk_pwm_tdiv_round_rate,
        },
    },
@@ -356,7 +355,6 @@ static struct clk clk_tin[] = {
    [4]    = {
        .name        = "pwm-tin",
        .id        = 4,
-        .set_parent    = clk_pwm_tin_set_parent,
    },
};


_______________________________________________
linux-arm mailing list
linux-arm@xxxxxxxxxxxxxxxxxxx
http://lists.infradead.org/mailman/listinfo/linux-arm

[Linux ARM]     [Linux ARM MSM]     [Linux ARM Kernel]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux]     [Linux OMAP]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]

Add to Google Follow linuxarm on Twitter