Merge branch 'lpc32xx/drivers' of git://git.kernel.org/pub/scm/linux/kernel/git/arm...
authorRoland Stigge <stigge@antcom.de>
Tue, 13 Mar 2012 20:15:40 +0000 (21:15 +0100)
committerRoland Stigge <stigge@antcom.de>
Tue, 13 Mar 2012 20:15:40 +0000 (21:15 +0100)
Conflicts:
arch/arm/mach-lpc32xx/clock.c

arch/arm/mach-lpc32xx/clock.c
arch/arm/mach-lpc32xx/common.c
arch/arm/mach-lpc32xx/common.h
arch/arm/mach-lpc32xx/phy3250.c

index 0e01bf44479c27a4f45ba037848354845e0aa8d3..ab8c21647422a1b33dd45b087dc006efb7151bb6 100644 (file)
@@ -721,6 +721,41 @@ static struct clk clk_tsc = {
        .get_rate       = local_return_parent_rate,
 };
 
+static int adc_onoff_enable(struct clk *clk, int enable)
+{
+       u32 tmp;
+       u32 divider;
+
+       /* Use PERIPH_CLOCK */
+       tmp = __raw_readl(LPC32XX_CLKPWR_ADC_CLK_CTRL_1);
+       tmp |= LPC32XX_CLKPWR_ADCCTRL1_PCLK_SEL;
+       /*
+        * Set clock divider so that we have equal to or less than
+        * 4.5MHz clock at ADC
+        */
+       divider = clk->get_rate(clk) / 4500000 + 1;
+       tmp |= divider;
+       __raw_writel(tmp, LPC32XX_CLKPWR_ADC_CLK_CTRL_1);
+
+       /* synchronize rate of this clock w/ actual HW setting */
+       clk->rate = clk->get_rate(clk->parent) / divider;
+
+       if (enable == 0)
+               __raw_writel(0, clk->enable_reg);
+       else
+               __raw_writel(clk->enable_mask, clk->enable_reg);
+
+       return 0;
+}
+
+static struct clk clk_adc = {
+       .parent         = &clk_pclk,
+       .enable         = adc_onoff_enable,
+       .enable_reg     = LPC32XX_CLKPWR_ADC_CLK_CTRL,
+       .enable_mask    = LPC32XX_CLKPWR_ADC32CLKCTRL_CLK_EN,
+       .get_rate       = local_return_parent_rate,
+};
+
 static int mmc_onoff_enable(struct clk *clk, int enable)
 {
        u32 tmp;
@@ -1057,6 +1092,7 @@ static struct clk_lookup lookups[] = {
        _REGISTER_CLOCK("lpc32xx-nand.0", "nand_ck", clk_nand)
        _REGISTER_CLOCK(NULL, "i2s0_ck", clk_i2s0)
        _REGISTER_CLOCK(NULL, "i2s1_ck", clk_i2s1)
+       _REGISTER_CLOCK("lpc32xx-adc", NULL, clk_adc)
        _REGISTER_CLOCK("ts-lpc32xx", NULL, clk_tsc)
        _REGISTER_CLOCK("dev:mmc0", NULL, clk_mmc)
        _REGISTER_CLOCK("lpc-net.0", NULL, clk_net)
index 369b152896cd7d7c4311a5766ded9428b2e74c87..6c76bb36559ba0ea32356b6e34cb4a6d735a1ad7 100644 (file)
@@ -137,6 +137,28 @@ struct platform_device lpc32xx_rtc_device = {
        .resource = lpc32xx_rtc_resources,
 };
 
+/*
+ * ADC support
+ */
+static struct resource adc_resources[] = {
+       {
+               .start = LPC32XX_ADC_BASE,
+               .end = LPC32XX_ADC_BASE + SZ_4K - 1,
+               .flags = IORESOURCE_MEM,
+       }, {
+               .start = IRQ_LPC32XX_TS_IRQ,
+               .end = IRQ_LPC32XX_TS_IRQ,
+               .flags = IORESOURCE_IRQ,
+       },
+};
+
+struct platform_device lpc32xx_adc_device = {
+       .name =  "lpc32xx-adc",
+       .id = -1,
+       .num_resources = ARRAY_SIZE(adc_resources),
+       .resource = adc_resources,
+};
+
 /*
  * Returns the unique ID for the device
  */
index 75640bfb097fab64de85e38a39a2a50b35db088c..68f2e46d98ad3ba0b159895c72707598490d7538 100644 (file)
@@ -29,6 +29,7 @@ extern struct platform_device lpc32xx_i2c0_device;
 extern struct platform_device lpc32xx_i2c1_device;
 extern struct platform_device lpc32xx_i2c2_device;
 extern struct platform_device lpc32xx_tsc_device;
+extern struct platform_device lpc32xx_adc_device;
 extern struct platform_device lpc32xx_rtc_device;
 
 /*
index 945a2f24d5e901dbbbec5f07a4380ead6e4bf23e..4590a8b52e72fc20e8c665c50a0303262ae7a8e4 100644 (file)
@@ -278,6 +278,7 @@ static struct platform_device *phy3250_devs[] __initdata = {
        &lpc32xx_i2c2_device,
        &lpc32xx_watchdog_device,
        &lpc32xx_gpio_led_device,
+       &lpc32xx_adc_device,
 };
 
 static struct amba_device *amba_devs[] __initdata = {
This page took 0.028814 seconds and 5 git commands to generate.