David Brownell <[email protected]> writes:
> On Thursday 29 January 2009, Kevin Hilman wrote:
>> Also, rename a few of the not-yet-used clocks to lowercase.
>>
>> Signed-off-by: Kevin Hilman <[email protected]>
>> ---
>> Depends on previous clock/pll patches now in Davinci git.
>
> OK, but see the appended... I'm not sure what else is
> grabbing the aemif clock on dm6446 (other than NAND),
> but its usecount is two not one.
Probably because it has an ALWAYS_ENABLED flag, triggering an early
clk_enable(). This should go away on dm644x as you've done on dm355.
> Feel free to split this up a bit if you like...
>
OK thanks, it all looks good. I'll pull it in.
I also have to rework things slightly on top of RMKs new clkdev layer
which is in 2.6.29-rc kernels.
Not sure I'm gonna have things soon enough for the merge window... but
working on it.
I want to get the clock framework right before anything else since so
many other things depend on it.
Kevin
> - Dave
>
>
> ====== CUT HERE
> More clock tweaks:
>
> - NAND
> * use updated clock name
> - dm355
> * don't force AEMIF clock on
> * rename aux_clk as pll1_aux_clk
> * better vpss clock handling
> * /proc/davinci_clocks better matches sprs463f.pdf fig 3-2
> - dm355evm
> * enable AEMIF for dm9000
> - dm644x
> * link pll2_sysclkbp to list
> * show and use pll1_aux_clk
> * include vicp, vpss, and pwm clocks
> - dm644xevm
> * on boot, announce as "DM644x" EVM
> - dm646x
> * doesn't use aux_clk like dm355 or dm644x; pll1_sysclk3 instead
> * include pwm clocks
>
> So now dm355 and dm644x both expect video FE and BE to explicitly
> manage the VPSS clocks they'll be using.
>
> NOTE: on dm355, sysclkbp values (for both PLLs) are incorrect.
>
> ---
> arch/arm/mach-davinci/board-dm355-evm.c | 7 +++
> arch/arm/mach-davinci/board-dm644x-evm.c | 2
> arch/arm/mach-davinci/dm355.c | 54 +++++++++++++-----------
> arch/arm/mach-davinci/dm644x.c | 65 +++++++++++++++++++++++++----
> arch/arm/mach-davinci/dm646x.c | 20 +++++++-
> arch/arm/mach-davinci/psc.c | 4 -
> drivers/mtd/nand/davinci_nand.c | 6 +-
> 7 files changed, 116 insertions(+), 42 deletions(-)
>
> --- a/arch/arm/mach-davinci/board-dm355-evm.c
> +++ b/arch/arm/mach-davinci/board-dm355-evm.c
> @@ -16,6 +16,7 @@
> #include <linux/mtd/mtd.h>
> #include <linux/mtd/partitions.h>
> #include <linux/mtd/nand.h>
> +#include <linux/clk.h>
> #include <linux/i2c.h>
> #include <linux/io.h>
> #include <linux/gpio.h>
> @@ -231,10 +232,16 @@ static struct spi_board_info dm355_evm_s
>
> static __init void dm355_evm_init(void)
> {
> + struct clk *aemif;
> +
> gpio_request(1, "dm9000");
> gpio_direction_input(1);
> dm355evm_dm9000_rsrc[2].start = gpio_to_irq(1);
>
> + aemif = clk_get(&dm355evm_dm9000.dev, "aemif");
> + clk_enable(aemif);
> + clk_put(aemif);
> +
> platform_add_devices(davinci_evm_devices,
> ARRAY_SIZE(davinci_evm_devices));
> evm_init_i2c();
> --- a/arch/arm/mach-davinci/board-dm644x-evm.c
> +++ b/arch/arm/mach-davinci/board-dm644x-evm.c
> @@ -668,7 +668,7 @@ static __init void davinci_evm_irq_init(
> davinci_irq_init();
> }
>
> -MACHINE_START(DAVINCI_EVM, "DaVinci EVM")
> +MACHINE_START(DAVINCI_EVM, "DaVinci DM644x EVM")
> /* Maintainer: MontaVista Software <[email protected]> */
> .phys_io = IO_PHYS,
> .io_pg_offst = (__IO_ADDRESS(IO_PHYS) >> 18) & 0xfffc,
> --- a/arch/arm/mach-davinci/dm355.c
> +++ b/arch/arm/mach-davinci/dm355.c
> @@ -51,10 +51,11 @@ static struct clk pll1_clk = {
> .pll_data = &pll1_data,
> };
>
> -static struct clk aux_clk = {
> - .name = "aux_clk",
> +static struct clk pll1_aux_clk = {
> + .name = "pll1_aux_clk",
> .parent = &ref_clk,
> .flags = CLK_PLL,
> + /* gated by PLL1 CKEN.AUXEN */
> };
>
> static struct clk pll1_sysclk1 = {
> @@ -98,15 +99,22 @@ static struct clk vpbe_clk = {
> .flags = CLK_PLL,
> };
>
> -static struct clk vpss_clk = {
> - .name = "vpss",
> +static struct clk vpss_master_clk = {
> + .name = "vpss_master",
> .parent = &pll1_sysclk4,
> - .flags = CLK_PLL,
> + .lpsc = DAVINCI_LPSC_VPSSMSTR,
> };
>
> +static struct clk vpss_slave_clk = {
> + .name = "vpss_slave",
> + .parent = &pll1_sysclk4,
> + .lpsc = DAVINCI_LPSC_VPSSSLV,
> +};
> +
> +
> static struct clk clkout1_clk = {
> .name = "clkout1",
> - .parent = &aux_clk,
> + .parent = &pll1_aux_clk,
> .flags = CLK_PLL,
> /* NOTE: clkout1 can be externally gated by muxing GPIO-18 */
> };
> @@ -155,8 +163,6 @@ static struct clk arm_clk = {
> /*
> * NOT LISTED below, but turned on by PSC init:
> * - in SyncReset state by default
> - * .lpsc = DAVINCI_LPSC_VPSSMSTR, .parent = &vpss_clk,
> - * .lpsc = DAVINCI_LPSC_VPSSSLV, .parent = &vpss_clk,
> * .lpsc = DAVINCI_LPSC_TPCC,
> * .lpsc = DAVINCI_LPSC_TPTC0,
> * .lpsc = DAVINCI_LPSC_TPTC1,
> @@ -164,7 +170,7 @@ static struct clk arm_clk = {
> * NOT LISTED below, and not touched by Linux
> * - in SyncReset state by default
> * .lpsc = DAVINCI_LPSC_DDR_EMIF, .parent = &sysclk2_clk,
> - * .lpsc = DM355_LPSC_RT0, .parent = &aux_clk,
> + * .lpsc = DM355_LPSC_RT0, .parent = &pll1_aux_clk,
> * .lpsc = DAVINCI_LPSC_MEMSTICK,
> * .lpsc = 41, .parent = &vpss_clk, // VPSS DAC
> * - in Enabled state by default
> @@ -186,13 +192,13 @@ static struct clk mjcp_clk = {
>
> static struct clk uart0_clk = {
> .name = "uart0",
> - .parent = &aux_clk,
> + .parent = &pll1_aux_clk,
> .lpsc = DAVINCI_LPSC_UART0,
> };
>
> static struct clk uart1_clk = {
> .name = "uart1",
> - .parent = &aux_clk,
> + .parent = &pll1_aux_clk,
> .lpsc = DAVINCI_LPSC_UART1,
> };
>
> @@ -204,7 +210,7 @@ static struct clk uart2_clk = {
>
> static struct clk i2c_clk = {
> .name = "I2CCLK",
> - .parent = &aux_clk,
> + .parent = &pll1_aux_clk,
> .lpsc = DAVINCI_LPSC_I2C,
> };
>
> @@ -259,54 +265,53 @@ static struct clk aemif_clk = {
> .name = "aemif",
> .parent = &pll1_sysclk2,
> .lpsc = DAVINCI_LPSC_AEMIF,
> - .usecount = 1,
> };
>
> static struct clk pwm0_clk = {
> .name = "pwm0",
> - .parent = &aux_clk,
> + .parent = &pll1_aux_clk,
> .lpsc = DAVINCI_LPSC_PWM0,
> };
>
> static struct clk pwm1_clk = {
> .name = "pwm1",
> - .parent = &aux_clk,
> + .parent = &pll1_aux_clk,
> .lpsc = DAVINCI_LPSC_PWM1,
> };
>
> static struct clk pwm2_clk = {
> .name = "pwm2",
> - .parent = &aux_clk,
> + .parent = &pll1_aux_clk,
> .lpsc = DAVINCI_LPSC_PWM2,
> };
>
> static struct clk pwm3_clk = {
> .name = "pwm3",
> - .parent = &aux_clk,
> + .parent = &pll1_aux_clk,
> .lpsc = DM355_LPSC_PWM3,
> };
>
> static struct clk timer0_clk = {
> .name = "timer0",
> - .parent = &aux_clk,
> + .parent = &pll1_aux_clk,
> .lpsc = DAVINCI_LPSC_TIMER0,
> };
>
> static struct clk timer1_clk = {
> .name = "timer1",
> - .parent = &aux_clk,
> + .parent = &pll1_aux_clk,
> .lpsc = DAVINCI_LPSC_TIMER1,
> };
>
> static struct clk timer2_clk = {
> .name = "timer2",
> - .parent = &aux_clk,
> + .parent = &pll1_aux_clk,
> .lpsc = DAVINCI_LPSC_TIMER2,
> };
>
> static struct clk timer3_clk = {
> .name = "timer3",
> - .parent = &aux_clk,
> + .parent = &pll1_aux_clk,
> .lpsc = DM355_LPSC_TIMER3,
> };
>
> @@ -318,15 +323,16 @@ static struct clk usb_clk = {
>
> static struct clk *dm355_clks[] __initdata = {
> &ref_clk,
> + &pll1_aux_clk,
> &pll1_clk,
> - &aux_clk,
> + &pll1_sysclkbp,
> &pll1_sysclk1,
> &pll1_sysclk2,
> &pll1_sysclk3,
> &pll1_sysclk4,
> - &pll1_sysclkbp,
> &vpbe_clk,
> - &vpss_clk,
> + &vpss_master_clk,
> + &vpss_slave_clk,
> &clkout1_clk,
> &clkout2_clk,
> &pll2_clk,
> --- a/arch/arm/mach-davinci/dm644x.c
> +++ b/arch/arm/mach-davinci/dm644x.c
> @@ -37,6 +37,13 @@ static struct clk ref_clk = {
> .flags = CLK_PLL,
> };
>
> +static struct clk pll1_aux_clk = {
> + .name = "pll1_aux_clk",
> + .parent = &ref_clk,
> + .flags = CLK_PLL,
> + /* gated by PLL1 CKEN.AUXEN */
> +};
> +
> static struct clk pll1_clk = {
> .name = "pll1",
> .parent = &ref_clk,
> @@ -107,21 +114,39 @@ static struct clk arm_clk = {
> .flags = ALWAYS_ENABLED,
> };
>
> +static struct clk vicp_clk = {
> + .name = "vicp",
> + .parent = &pll1_sysclk2,
> + .lpsc = DAVINCI_LPSC_IMCOP,
> +};
> +
> +static struct clk vpss_master_clk = {
> + .name = "vpss_master",
> + .parent = &pll1_sysclk3,
> + .lpsc = DAVINCI_LPSC_VPSSMSTR,
> +};
> +
> +static struct clk vpss_slave_clk = {
> + .name = "vpss_slave",
> + .parent = &pll1_sysclk3,
> + .lpsc = DAVINCI_LPSC_VPSSSLV,
> +};
> +
> static struct clk uart0_clk = {
> .name = "uart0",
> - .parent = &ref_clk,
> + .parent = &pll1_aux_clk,
> .lpsc = DAVINCI_LPSC_UART0,
> };
>
> static struct clk uart1_clk = {
> .name = "uart1",
> - .parent = &ref_clk,
> + .parent = &pll1_aux_clk,
> .lpsc = DAVINCI_LPSC_UART1,
> };
>
> static struct clk uart2_clk = {
> .name = "uart2",
> - .parent = &ref_clk,
> + .parent = &pll1_aux_clk,
> .lpsc = DAVINCI_LPSC_UART2,
> };
>
> @@ -133,7 +158,7 @@ static struct clk emac_clk = {
>
> static struct clk i2c_clk = {
> .name = "I2CCLK",
> - .parent = &ref_clk,
> + .parent = &pll1_aux_clk,
> .lpsc = DAVINCI_LPSC_I2C,
> };
>
> @@ -186,26 +211,45 @@ static struct clk aemif_clk = {
> .flags = ALWAYS_ENABLED,
> };
>
> +static struct clk pwm0_clk = {
> + .name = "pwm0",
> + .parent = &pll1_aux_clk,
> + .lpsc = DAVINCI_LPSC_PWM0,
> +};
> +
> +static struct clk pwm1_clk = {
> + .name = "pwm1",
> + .parent = &pll1_aux_clk,
> + .lpsc = DAVINCI_LPSC_PWM1,
> +};
> +
> +static struct clk pwm2_clk = {
> + .name = "pwm2",
> + .parent = &pll1_aux_clk,
> + .lpsc = DAVINCI_LPSC_PWM2,
> +};
> +
> static struct clk timer0_clk = {
> .name = "timer0",
> - .parent = &ref_clk,
> + .parent = &pll1_aux_clk,
> .lpsc = DAVINCI_LPSC_TIMER0,
> };
>
> static struct clk timer1_clk = {
> .name = "timer1",
> - .parent = &ref_clk,
> + .parent = &pll1_aux_clk,
> .lpsc = DAVINCI_LPSC_TIMER1,
> };
>
> static struct clk timer2_clk = {
> .name = "timer2",
> - .parent = &ref_clk,
> + .parent = &pll1_aux_clk,
> .lpsc = DAVINCI_LPSC_TIMER2,
> };
>
> static struct clk *dm644x_clks[] __initdata = {
> &ref_clk,
> + &pll1_aux_clk,
> &pll1_clk,
> &pll1_sysclk1,
> &pll1_sysclk2,
> @@ -214,7 +258,11 @@ static struct clk *dm644x_clks[] __initd
> &pll2_clk,
> &pll2_sysclk1,
> &pll2_sysclk2,
> + &pll2_sysclkbp,
> &arm_clk,
> + &vicp_clk,
> + &vpss_master_clk,
> + &vpss_slave_clk,
> &uart0_clk,
> &uart1_clk,
> &uart2_clk,
> @@ -228,6 +276,9 @@ static struct clk *dm644x_clks[] __initd
> &usb_clk,
> &vlynq_clk,
> &aemif_clk,
> + &pwm0_clk,
> + &pwm1_clk,
> + &pwm2_clk,
> &timer0_clk,
> &timer1_clk,
> &timer2_clk,
> --- a/arch/arm/mach-davinci/dm646x.c
> +++ b/arch/arm/mach-davinci/dm646x.c
> @@ -138,19 +138,19 @@ static struct clk arm_clk = {
>
> static struct clk uart0_clk = {
> .name = "uart0",
> - .parent = &aux_clk,
> + .parent = &pll1_sysclk3,
> .lpsc = DM646X_LPSC_UART0,
> };
>
> static struct clk uart1_clk = {
> .name = "uart1",
> - .parent = &aux_clk,
> + .parent = &pll1_sysclk3,
> .lpsc = DM646X_LPSC_UART1,
> };
>
> static struct clk uart2_clk = {
> .name = "uart2",
> - .parent = &aux_clk,
> + .parent = &pll1_sysclk3,
> .lpsc = DM646X_LPSC_UART2,
> };
>
> @@ -179,6 +179,18 @@ static struct clk emac_clk = {
> .lpsc = DM646X_LPSC_EMAC,
> };
>
> +static struct clk pwm0_clk = {
> + .name = "pwm0",
> + .parent = &pll1_sysclk3,
> + .lpsc = DM646X_LPSC_PWM0,
> +};
> +
> +static struct clk pwm1_clk = {
> + .name = "pwm1",
> + .parent = &pll1_sysclk3,
> + .lpsc = DM646X_LPSC_PWM1,
> +};
> +
> static struct clk timer0_clk = {
> .name = "timer0",
> .parent = &pll1_sysclk3,
> @@ -213,6 +225,8 @@ static struct clk *dm646x_clks[] __initd
> &gpio_clk,
> &aemif_clk,
> &emac_clk,
> + &pwm0_clk,
> + &pwm1_clk,
> &timer0_clk,
> &timer1_clk,
> NULL,
> --- a/arch/arm/mach-davinci/psc.c
> +++ b/arch/arm/mach-davinci/psc.c
> @@ -182,10 +182,6 @@ void __init davinci_psc_init(void)
>
> if (cpu_is_davinci_dm644x() || cpu_is_davinci_dm355()) {
> davinci_psc_config(DAVINCI_GPSC_ARMDOMAIN,
> - DAVINCI_LPSC_VPSSMSTR, 1);
> - davinci_psc_config(DAVINCI_GPSC_ARMDOMAIN,
> - DAVINCI_LPSC_VPSSSLV, 1);
> - davinci_psc_config(DAVINCI_GPSC_ARMDOMAIN,
> DAVINCI_LPSC_TPCC, 1);
> davinci_psc_config(DAVINCI_GPSC_ARMDOMAIN,
> DAVINCI_LPSC_TPTC0, 1);
> --- a/drivers/mtd/nand/davinci_nand.c
> +++ b/drivers/mtd/nand/davinci_nand.c
> @@ -469,16 +469,16 @@ static int __init nand_davinci_probe(str
> info->chip.ecc.mode = NAND_ECC_SOFT;
> }
>
> - info->clk = clk_get(&pdev->dev, "AEMIFCLK");
> + info->clk = clk_get(&pdev->dev, "aemif");
> if (IS_ERR(info->clk)) {
> ret = PTR_ERR(info->clk);
> - dev_dbg(&pdev->dev, "unable to get AEMIFCLK, err %d\n", ret);
> + dev_dbg(&pdev->dev, "unable to get AEMIF clock, err %d\n", ret);
> goto err_clk;
> }
>
> ret = clk_enable(info->clk);
> if (ret < 0) {
> - dev_dbg(&pdev->dev, "unable to enable AEMIFCLK, err %d\n", ret);
> + dev_dbg(&pdev->dev, "unable to enable AEMIF clock, err %d\n",
> ret);
> goto err_clk_enable;
> }
>
_______________________________________________
Davinci-linux-open-source mailing list
[email protected]
http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source