Signed-off-by: Kevin Hilman <khil...@deeprootsystems.com> --- arch/arm/Kconfig | 1 + arch/arm/mach-davinci/clock.c | 39 ++++++----- arch/arm/mach-davinci/clock.h | 15 +++++ arch/arm/mach-davinci/devices.c | 4 - arch/arm/mach-davinci/dm355.c | 90 +++++++++++++------------- arch/arm/mach-davinci/dm644x.c | 87 +++++++++++++------------ arch/arm/mach-davinci/dm646x.c | 67 +++++++++++--------- arch/arm/mach-davinci/include/mach/clkdev.h | 13 ++++ arch/arm/mach-davinci/include/mach/clock.h | 1 - arch/arm/mach-davinci/time.c | 17 +++-- drivers/i2c/busses/i2c-davinci.c | 2 +- drivers/mmc/host/davinci_mmc.c | 2 +- drivers/net/davinci_emac.c | 2 +- drivers/watchdog/davinci_wdt.c | 2 +- sound/soc/davinci/davinci-i2s.c | 6 +-- 15 files changed, 192 insertions(+), 156 deletions(-) create mode 100644 arch/arm/mach-davinci/include/mach/clkdev.h
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 9bf3cb0..56094ed 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig @@ -560,6 +560,7 @@ config ARCH_DAVINCI select HAVE_CLK select ZONE_DMA select HAVE_IDE + select COMMON_CLKDEV help Support for TI's DaVinci platform. diff --git a/arch/arm/mach-davinci/clock.c b/arch/arm/mach-davinci/clock.c index ff8b253..4cae71c 100644 --- a/arch/arm/mach-davinci/clock.c +++ b/arch/arm/mach-davinci/clock.c @@ -30,6 +30,7 @@ static LIST_HEAD(clocks); static DEFINE_MUTEX(clocks_mutex); static DEFINE_SPINLOCK(clockfw_lock); +#ifndef CONFIG_COMMON_CLKDEV extern void davinci_psc_config(unsigned int domain, unsigned int id, char enable); /* @@ -137,6 +138,7 @@ void clk_put(struct clk *clk) module_put(clk->owner); } EXPORT_SYMBOL(clk_put); +#endif /* CONFIG_COMMON_CLKDEV */ static unsigned psc_domain(struct clk *clk) { @@ -372,31 +374,32 @@ static void __init clk_pll_init(struct clk *clk) pr_debug("] --> %lu MHz output.\n", clk->rate / 1000000); } -int __init davinci_clk_init(struct clk *clocks[]) -{ - struct clk *clkp; - int i = 0; +int __init davinci_clk_init(struct davinci_clk *clocks) + { + struct davinci_clk *c; + struct clk *clk; + + printk("%s\n", __func__); + for ( c = clocks; c->lk.clk; c++ ) { + clk = c->lk.clk; - while ((clkp = clocks[i++])) { - if (clkp->pll_data) - clk_pll_init(clkp); + printk("%s: %s\n", __func__, c->lk.con_id); + if (clk->pll_data) + clk_pll_init(clk); /* Calculate rates for PLL-derived clocks */ - else if (clkp->flags & CLK_PLL) - clk_sysclk_recalc(clkp); - - if (clkp->lpsc) - clkp->flags |= CLK_PSC; + else if (clk->flags & CLK_PLL) + clk_sysclk_recalc(clk); - clk_register(clkp); + if (clk->lpsc) + clk->flags |= CLK_PSC; - /* FIXME: remove equivalent special-cased code from - * davinci_psc_init() once cpus list *all* clocks. - */ + clkdev_add(&c->lk); + clk_register(clk); /* Turn on clocks that Linux doesn't otherwise manage */ - if (clkp->flags & ALWAYS_ENABLED) - clk_enable(clkp); + if (clk->flags & ALWAYS_ENABLED) + clk_enable(clk); } return 0; diff --git a/arch/arm/mach-davinci/clock.h b/arch/arm/mach-davinci/clock.h index c1191df..24cfed4 100644 --- a/arch/arm/mach-davinci/clock.h +++ b/arch/arm/mach-davinci/clock.h @@ -12,6 +12,7 @@ #define __ARCH_ARM_DAVINCI_CLOCK_H #include <linux/list.h> +#include <asm/clkdev.h> #define DAVINCI_PLL1_BASE 0x01c40800 #define DAVINCI_PLL2_BASE 0x01c40c00 @@ -76,7 +77,21 @@ struct clk { #define CLK_PLL BIT(4) /* PLL-derived clock */ #define PRE_PLL BIT(5) /* source is before PLL mult/div */ +struct davinci_clk { + struct clk_lookup lk; +}; + +#define CLK(dev, con, ck) \ + { \ + .lk = { \ + .dev_id = dev, \ + .con_id = con, \ + .clk = ck, \ + }, \ + } + int davinci_clk_associate(struct device *dev, const char *logical_clockname, const char *physical_clockname); +int davinci_clk_init(struct davinci_clk *clocks); #endif diff --git a/arch/arm/mach-davinci/devices.c b/arch/arm/mach-davinci/devices.c index a0f5a60..ffc6d7f 100644 --- a/arch/arm/mach-davinci/devices.c +++ b/arch/arm/mach-davinci/devices.c @@ -152,7 +152,6 @@ static struct platform_device davinci_mmcsd1_device = { void __init davinci_setup_mmc(int module, struct davinci_mmc_config *config) { struct platform_device *pdev = NULL; - const char *clockname; if (WARN_ON(cpu_is_davinci_dm646x())) return; @@ -179,7 +178,6 @@ void __init davinci_setup_mmc(int module, struct davinci_mmc_config *config) davinci_cfg_reg(DM355_SD1_DATA3); pdev = &davinci_mmcsd1_device; - clockname = "mmcsd1"; break; case 0: if (cpu_is_davinci_dm355()) { @@ -206,7 +204,6 @@ void __init davinci_setup_mmc(int module, struct davinci_mmc_config *config) } pdev = &davinci_mmcsd0_device; - clockname = cpu_is_davinci_dm355() ? "mmcsd0" : "mmcsd"; break; } @@ -214,7 +211,6 @@ void __init davinci_setup_mmc(int module, struct davinci_mmc_config *config) return; pdev->dev.platform_data = config; - davinci_clk_associate(&pdev->dev, "mmc", clockname); platform_device_register(pdev); } diff --git a/arch/arm/mach-davinci/dm355.c b/arch/arm/mach-davinci/dm355.c index 0a9cd98..15bf9f2 100644 --- a/arch/arm/mach-davinci/dm355.c +++ b/arch/arm/mach-davinci/dm355.c @@ -304,6 +304,7 @@ static struct clk timer2_clk = { .name = "timer2", .parent = &pll1_aux_clk, .lpsc = DAVINCI_LPSC_TIMER2, + .usecount = 1, /* REVISIT: why cant' this be disabled? */ }; static struct clk timer3_clk = { @@ -324,50 +325,50 @@ static struct clk usb_clk = { .lpsc = DAVINCI_LPSC_USB, }; -static struct clk *dm355_clks[] __initdata = { - &ref_clk, - &pll1_clk, - &pll1_sysclk1, - &pll1_sysclk2, - &pll1_sysclk3, - &pll1_sysclk4, - &pll1_aux_clk, - &pll1_sysclkbp, - &vpss_dac_clk, - &vpss_master_clk, - &vpss_slave_clk, - &clkout1_clk, - &clkout2_clk, - &pll2_clk, - &pll2_sysclk1, - &pll2_sysclkbp, - &clkout3_clk, - &arm_clk, - &mjcp_clk, - &uart0_clk, - &uart1_clk, - &uart2_clk, - &i2c_clk, - &asp0_clk, - &asp1_clk, - &mmcsd0_clk, - &mmcsd1_clk, - &spi0_clk, - &spi1_clk, - &spi2_clk, - &gpio_clk, - &aemif_clk, - &pwm0_clk, - &pwm1_clk, - &pwm2_clk, - &pwm3_clk, - &timer0_clk, - &timer1_clk, - &timer2_clk, - &timer3_clk, - &rto_clk, - &usb_clk, - NULL, +static struct davinci_clk dm355_clks[] = { + CLK(NULL, "ref", &ref_clk), + CLK(NULL, "pll1", &pll1_clk), + CLK(NULL, "pll1_sysclk1", &pll1_sysclk1), + CLK(NULL, "pll1_sysclk2", &pll1_sysclk2), + CLK(NULL, "pll1_sysclk3", &pll1_sysclk3), + CLK(NULL, "pll1_sysclk4", &pll1_sysclk4), + CLK(NULL, "pll1_aux", &pll1_aux_clk), + CLK(NULL, "pll1_sysclkbp", &pll1_sysclkbp), + CLK(NULL, "vpss_dac", &vpss_dac_clk), + CLK(NULL, "vpss_master", &vpss_master_clk), + CLK(NULL, "vpss_slave", &vpss_slave_clk), + CLK(NULL, "clkout1", &clkout1_clk), + CLK(NULL, "clkout2", &clkout2_clk), + CLK(NULL, "pll2", &pll2_clk), + CLK(NULL, "pll2_sysclk1", &pll2_sysclk1), + CLK(NULL, "pll2_sysclkbp", &pll2_sysclkbp), + CLK(NULL, "clkout3", &clkout3_clk), + CLK(NULL, "arm", &arm_clk), + CLK(NULL, "mjcp", &mjcp_clk), + CLK(NULL, "uart0", &uart0_clk), + CLK(NULL, "uart1", &uart1_clk), + CLK(NULL, "uart2", &uart2_clk), + CLK("i2c_davinci.1", "i2c", &i2c_clk), + CLK("soc-audio.0", "asp", &asp0_clk), + CLK("soc-audio.1", "asp", &asp1_clk), + CLK("davinci_mmc.0", "mmcsd", &mmcsd0_clk), + CLK("davinci_mmc.1", "mmcsd", &mmcsd1_clk), + CLK(NULL, "spi0", &spi0_clk), + CLK(NULL, "spi1", &spi1_clk), + CLK(NULL, "spi2", &spi2_clk), + CLK(NULL, "gpio", &gpio_clk), + CLK(NULL, "aemif", &aemif_clk), + CLK(NULL, "pwm0", &pwm0_clk), + CLK(NULL, "pwm1", &pwm1_clk), + CLK(NULL, "pwm2", &pwm2_clk), + CLK(NULL, "pwm3", &pwm3_clk), + CLK(NULL, "timer0", &timer0_clk), + CLK(NULL, "timer1", &timer1_clk), + CLK("watchdog", "timer2", &timer2_clk), + CLK(NULL, "timer3", &timer3_clk), + CLK(NULL, "rto", &rto_clk), + CLK(NULL, "usb", &usb_clk), + CLK(NULL, NULL, NULL), }; /*----------------------------------------------------------------------*/ @@ -418,7 +419,6 @@ void __init dm355_init_spi0(unsigned chipselect_mask, spi_register_board_info(info, len); - davinci_clk_associate(&dm355_spi0_device.dev, "spi", "spi0"); platform_device_register(&dm355_spi0_device); } diff --git a/arch/arm/mach-davinci/dm644x.c b/arch/arm/mach-davinci/dm644x.c index 7251b82..008966e 100644 --- a/arch/arm/mach-davinci/dm644x.c +++ b/arch/arm/mach-davinci/dm644x.c @@ -177,7 +177,7 @@ static struct clk emac_clk = { }; static struct clk i2c_clk = { - .name = "I2CCLK", + .name = "i2c", .parent = &pll1_aux_clk, .lpsc = DAVINCI_LPSC_I2C, }; @@ -264,47 +264,50 @@ static struct clk timer2_clk = { .name = "timer2", .parent = &pll1_aux_clk, .lpsc = DAVINCI_LPSC_TIMER2, -}; - -static struct clk *dm644x_clks[] __initdata = { - &ref_clk, - &pll1_clk, - &pll1_sysclk1, - &pll1_sysclk2, - &pll1_sysclk3, - &pll1_sysclk5, - &pll1_aux_clk, - &pll1_sysclkbp, - &pll2_clk, - &pll2_sysclk1, - &pll2_sysclk2, - &pll2_sysclkbp, - &dsp_clk, - &arm_clk, - &vicp_clk, - &vpss_master_clk, - &vpss_slave_clk, - &uart0_clk, - &uart1_clk, - &uart2_clk, - &emac_clk, - &i2c_clk, - &ide_clk, - &asp_clk, - &mmcsd_clk, - &spi_clk, - &gpio_clk, - &usb_clk, - &vlynq_clk, - &aemif_clk, - &pwm0_clk, - &pwm1_clk, - &pwm2_clk, - &timer0_clk, - &timer1_clk, - &timer2_clk, - NULL, -}; + .usecount = 1, /* REVISIT: why cant' this be disabled? */ +}; + +struct davinci_clk dm644x_clks[] = { + CLK(NULL, "ref", &ref_clk), + CLK(NULL, "pll1", &pll1_clk), + CLK(NULL, "pll1_sysclk1", &pll1_sysclk1), + CLK(NULL, "pll1_sysclk2", &pll1_sysclk2), + CLK(NULL, "pll1_sysclk3", &pll1_sysclk3), + CLK(NULL, "pll1_sysclk5", &pll1_sysclk5), + CLK(NULL, "pll1_aux", &pll1_aux_clk), + CLK(NULL, "pll1_sysclkbp", &pll1_sysclkbp), + CLK(NULL, "pll2", &pll2_clk), + CLK(NULL, "pll2_sysclk1", &pll2_sysclk1), + CLK(NULL, "pll2_sysclk2", &pll2_sysclk2), + CLK(NULL, "pll2_sysclkbp", &pll2_sysclkbp), + CLK(NULL, "dsp", &dsp_clk), + CLK(NULL, "arm", &arm_clk), + CLK(NULL, "vicp", &vicp_clk), + CLK(NULL, "vpss_master", &vpss_master_clk), + CLK(NULL, "vpss_slave", &vpss_slave_clk), + CLK(NULL, "arm", &arm_clk), + CLK(NULL, "uart0", &uart0_clk), + CLK(NULL, "uart1", &uart1_clk), + CLK(NULL, "uart2", &uart2_clk), + CLK("davinci_emac.1", "emac", &emac_clk), + CLK("i2c_davinci.1", "i2c", &i2c_clk), + CLK(NULL, "IDECLK", &ide_clk), + CLK("soc-audio.0", "asp", &asp_clk), + CLK("davinci_mmc.0", "mmcsd", &mmcsd_clk), + CLK(NULL, "spi", &spi_clk), + CLK(NULL, "gpio", &gpio_clk), + CLK(NULL, "usb", &usb_clk), + CLK(NULL, "vlynq", &vlynq_clk), + CLK(NULL, "aemif", &aemif_clk), + CLK(NULL, "pwm0", &pwm0_clk), + CLK(NULL, "pwm1", &pwm1_clk), + CLK(NULL, "pwm2", &pwm2_clk), + CLK(NULL, "timer0", &timer0_clk), + CLK(NULL, "timer1", &timer1_clk), + CLK("watchdog", "timer2", &timer2_clk), + CLK(NULL, NULL, NULL), +}; + /* * Device specific mux setup diff --git a/arch/arm/mach-davinci/dm646x.c b/arch/arm/mach-davinci/dm646x.c index 6b13bcc..3de83fe 100644 --- a/arch/arm/mach-davinci/dm646x.c +++ b/arch/arm/mach-davinci/dm646x.c @@ -220,36 +220,43 @@ static struct clk timer1_clk = { .lpsc = DM646X_LPSC_TIMER1, }; -static struct clk *dm646x_clks[] __initdata = { - &ref_clk, - &aux_clkin, - &pll1_clk, - &pll1_sysclk1, - &pll1_sysclk2, - &pll1_sysclk3, - &pll1_sysclk4, - &pll1_sysclk5, - &pll1_sysclk6, - &pll1_sysclk8, - &pll1_sysclk9, - &pll1_sysclkbp, - &pll1_aux_clk, - &pll2_clk, - &pll2_sysclk1, - &dsp_clk, - &arm_clk, - &uart0_clk, - &uart1_clk, - &uart2_clk, - &i2c_clk, - &gpio_clk, - &aemif_clk, - &emac_clk, - &pwm0_clk, - &pwm1_clk, - &timer0_clk, - &timer1_clk, - NULL, +static struct clk timer2_clk = { + .name = "timer2", + .parent = &pll1_sysclk3, + .flags = ALWAYS_ENABLED, /* no LPSC, always enabled; c.f. spruep9a */ +}; + +struct davinci_clk dm646x_clks[] = { + CLK(NULL, "ref", &ref_clk), + CLK(NULL, "aux", &aux_clkin), + CLK(NULL, "pll1", &pll1_clk), + CLK(NULL, "pll1_sysclk", &pll1_sysclk1), + CLK(NULL, "pll1_sysclk", &pll1_sysclk2), + CLK(NULL, "pll1_sysclk", &pll1_sysclk3), + CLK(NULL, "pll1_sysclk", &pll1_sysclk4), + CLK(NULL, "pll1_sysclk", &pll1_sysclk5), + CLK(NULL, "pll1_sysclk", &pll1_sysclk6), + CLK(NULL, "pll1_sysclk", &pll1_sysclk8), + CLK(NULL, "pll1_sysclk", &pll1_sysclk9), + CLK(NULL, "pll1_sysclk", &pll1_sysclkbp), + CLK(NULL, "pll1_aux", &pll1_aux_clk), + CLK(NULL, "pll2", &pll2_clk), + CLK(NULL, "pll2_sysclk1", &pll2_sysclk1), + CLK(NULL, "dsp", &dsp_clk), + CLK(NULL, "arm", &arm_clk), + CLK(NULL, "uart0", &uart0_clk), + CLK(NULL, "uart1", &uart1_clk), + CLK(NULL, "uart2", &uart2_clk), + CLK("i2c_davinci.1", "i2c", &i2c_clk), + CLK(NULL, "gpio", &gpio_clk), + CLK(NULL, "aemif", &aemif_clk), + CLK("davinci_emac.1", "emac", &emac_clk), + CLK(NULL, "pwm0", &pwm0_clk), + CLK(NULL, "pwm1", &pwm1_clk), + CLK(NULL, "timer0", &timer0_clk), + CLK(NULL, "timer1", &timer1_clk), + CLK("watchdog", "timer2", &timer2_clk), + CLK(NULL, NULL, NULL), }; /* diff --git a/arch/arm/mach-davinci/include/mach/clkdev.h b/arch/arm/mach-davinci/include/mach/clkdev.h new file mode 100644 index 0000000..730c49d --- /dev/null +++ b/arch/arm/mach-davinci/include/mach/clkdev.h @@ -0,0 +1,13 @@ +#ifndef __MACH_CLKDEV_H +#define __MACH_CLKDEV_H + +static inline int __clk_get(struct clk *clk) +{ + return 1; +} + +static inline void __clk_put(struct clk *clk) +{ +} + +#endif diff --git a/arch/arm/mach-davinci/include/mach/clock.h b/arch/arm/mach-davinci/include/mach/clock.h index 78cfb35..a3b0402 100644 --- a/arch/arm/mach-davinci/include/mach/clock.h +++ b/arch/arm/mach-davinci/include/mach/clock.h @@ -17,6 +17,5 @@ struct clk; extern int clk_register(struct clk *clk); extern void clk_unregister(struct clk *clk); -extern int davinci_clk_init(struct clk *clocks[]); #endif diff --git a/arch/arm/mach-davinci/time.c b/arch/arm/mach-davinci/time.c index 3a27a2b..a9992d6 100644 --- a/arch/arm/mach-davinci/time.c +++ b/arch/arm/mach-davinci/time.c @@ -18,6 +18,7 @@ #include <linux/io.h> #include <linux/clk.h> #include <linux/err.h> +#include <linux/device.h> #include <mach/hardware.h> #include <asm/system.h> @@ -309,7 +310,7 @@ static struct clock_event_device clockevent_davinci = { static void __init davinci_timer_init(void) { - struct clk *timer_clk, *wd_clk; + struct clk *timer_clk; static char err[] __initdata = KERN_ERR "%s: can't register clocksource!\n"; @@ -321,12 +322,6 @@ static void __init davinci_timer_init(void) BUG_ON(IS_ERR(timer_clk)); clk_enable(timer_clk); - if (cpu_is_davinci_dm644x() || cpu_is_davinci_dm355()) { - wd_clk = clk_get(NULL, "timer2"); - BUG_ON(IS_ERR(wd_clk)); - clk_enable(wd_clk); - } - davinci_clock_tick_rate = clk_get_rate(timer_clk); clk_put(timer_clk); @@ -358,6 +353,14 @@ struct sys_timer davinci_timer = { void davinci_watchdog_reset(void) { u32 tgcr, wdtcr; void __iomem *base = IO_ADDRESS(DAVINCI_WDOG_BASE); + struct device dev; + struct clk *wd_clk; + + dev_set_name(&dev, "watchdog"); + wd_clk = clk_get(&dev, NULL); + if (WARN_ON(IS_ERR(wd_clk))) + return; + clk_enable(wd_clk); /* disable, internal clock source */ __raw_writel(0, base + TCR); diff --git a/drivers/i2c/busses/i2c-davinci.c b/drivers/i2c/busses/i2c-davinci.c index 0916871..b3d3a18 100755 --- a/drivers/i2c/busses/i2c-davinci.c +++ b/drivers/i2c/busses/i2c-davinci.c @@ -554,7 +554,7 @@ static int davinci_i2c_probe(struct platform_device *pdev) dev->irq = irq->start; platform_set_drvdata(pdev, dev); - dev->clk = clk_get(&pdev->dev, "I2CCLK"); + dev->clk = clk_get(&pdev->dev, NULL); if (IS_ERR(dev->clk)) { r = -ENODEV; goto err_free_mem; diff --git a/drivers/mmc/host/davinci_mmc.c b/drivers/mmc/host/davinci_mmc.c index b034af6..28f61ac 100644 --- a/drivers/mmc/host/davinci_mmc.c +++ b/drivers/mmc/host/davinci_mmc.c @@ -1133,7 +1133,7 @@ static int __init davinci_mmcsd_probe(struct platform_device *pdev) goto out; ret = -ENXIO; - host->clk = clk_get(&pdev->dev, "mmc"); + host->clk = clk_get(&pdev->dev, NULL); if (IS_ERR(host->clk)) { ret = PTR_ERR(host->clk); goto out; diff --git a/drivers/net/davinci_emac.c b/drivers/net/davinci_emac.c index 4f25fb6..b1e6c7f 100644 --- a/drivers/net/davinci_emac.c +++ b/drivers/net/davinci_emac.c @@ -2605,7 +2605,7 @@ static int __devinit davinci_emac_probe(struct platform_device *pdev) unsigned long size; /* obtain emac clock from kernel */ - emac_clk = clk_get(&pdev->dev, "emac"); + emac_clk = clk_get(&pdev->dev, NULL); if (IS_ERR(emac_clk)) { printk(KERN_ERR "DaVinci EMAC: Failed to get EMAC clock\n"); return -EBUSY; diff --git a/drivers/watchdog/davinci_wdt.c b/drivers/watchdog/davinci_wdt.c index 1eca9a0..3298db0 100644 --- a/drivers/watchdog/davinci_wdt.c +++ b/drivers/watchdog/davinci_wdt.c @@ -205,7 +205,7 @@ static int davinci_wdt_probe(struct platform_device *pdev) struct resource *res; struct device *dev = &pdev->dev; - wdt_clk = clk_get(dev, "timer2"); + wdt_clk = clk_get(dev, NULL); if (WARN_ON(!wdt_clk)) return -ENODEV; clk_enable(wdt_clk); diff --git a/sound/soc/davinci/davinci-i2s.c b/sound/soc/davinci/davinci-i2s.c index d9c3c3b..7b482c5 100644 --- a/sound/soc/davinci/davinci-i2s.c +++ b/sound/soc/davinci/davinci-i2s.c @@ -446,10 +446,6 @@ static int davinci_i2s_probe(struct platform_device *pdev, struct resource *mem, *ioarea; struct evm_snd_platform_data *pdata; int ret; - static const char *clocks[] = { "asp0", "asp1", }; - - if (pdev->id < 0 || pdev->id > ARRAY_SIZE(clocks)) - return -EINVAL; mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (!mem) { @@ -472,7 +468,7 @@ static int davinci_i2s_probe(struct platform_device *pdev, cpu_dai->private_data = dev; - dev->clk = clk_get(&pdev->dev, clocks[pdev->id]); + dev->clk = clk_get(&pdev->dev, NULL); if (IS_ERR(dev->clk)) { ret = -ENODEV; goto err_free_mem; -- 1.6.1.2 _______________________________________________ Davinci-linux-open-source mailing list Davinci-linux-open-source@linux.davincidsp.com http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source