天天看點

clk_get函數實作,Linux核心時鐘架構

clk_get函數實作,Linux核心時鐘架構

s3c2410_baseclk_add()

{

  ..........

clkp = init_clocks_disable;

    for (ptr = 0; ptr < ARRAY_SIZE(init_clocks_disable); ptr++, clkp++) {

        ret = s3c24xx_register_clock(clkp);

        if (ret < 0) {

            printk(KERN_ERR "Failed to register clock %s (%d)\n",

                   clkp->name, ret);

        }

        s3c2410_clkcon_enable(clkp, 0);

    }

    ........

}

s3c2410_baseclk_add()添加其他外設的clk結構

clk.enable(),最後調用的

static struct clk init_clocks_disable[] = {

......

{

        .name        = "adc",

        .id        = -1,

        .parent        = &clk_p,

        .enable        = s3c2410_clkcon_enable,

        .ctrlbit    = S3C2410_CLKCON_ADC,

}

......

}中的

int s3c2410_clkcon_enable(struct clk *clk, int enable)

{

    unsigned int clocks = clk->ctrlbit;

    unsigned long clkcon;

    clkcon = __raw_readl(S3C2410_CLKCON);

    if (enable)

        clkcon |= clocks;

    else

        clkcon &= ~clocks;

    clkcon &= ~(S3C2410_CLKCON_IDLE|S3C2410_CLKCON_POWER);

    __raw_writel(clkcon, S3C2410_CLKCON);

    return 0;

}其根據.ctrlbit    = S3C2410_CLKCON_ADC,來使能對應ADC時鐘。

至此完畢。

繼續閱讀