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

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

index 0e01bf44479c27a4f45ba037848354845e0aa8d3,473015ac07bd04f670cd69a92757505734653748..ab8c21647422a1b33dd45b087dc006efb7151bb6
@@@ -82,7 -82,6 +82,7 @@@
   *   will also impact the individual peripheral rates.
   */
  
 +#include <linux/export.h>
  #include <linux/kernel.h>
  #include <linux/list.h>
  #include <linux/errno.h>
  #include "clock.h"
  #include "common.h"
  
 +static DEFINE_SPINLOCK(global_clkregs_lock);
 +
  static struct clk clk_armpll;
  static struct clk clk_usbpll;
 -static DEFINE_MUTEX(clkm_lock);
  
  /*
   * Post divider values for PLLs based on selected register value
@@@ -129,7 -127,7 +129,7 @@@ static struct clk osc_32KHz = 
  static int local_pll397_enable(struct clk *clk, int enable)
  {
        u32 reg;
 -      unsigned long timeout = 1 + msecs_to_jiffies(10);
 +      unsigned long timeout = jiffies + msecs_to_jiffies(10);
  
        reg = __raw_readl(LPC32XX_CLKPWR_PLL397_CTRL);
  
                /* Wait for PLL397 lock */
                while (((__raw_readl(LPC32XX_CLKPWR_PLL397_CTRL) &
                        LPC32XX_CLKPWR_SYSCTRL_PLL397_STS) == 0) &&
 -                      (timeout > jiffies))
 +                      time_before(jiffies, timeout))
                        cpu_relax();
  
                if ((__raw_readl(LPC32XX_CLKPWR_PLL397_CTRL) &
  static int local_oscmain_enable(struct clk *clk, int enable)
  {
        u32 reg;
 -      unsigned long timeout = 1 + msecs_to_jiffies(10);
 +      unsigned long timeout = jiffies + msecs_to_jiffies(10);
  
        reg = __raw_readl(LPC32XX_CLKPWR_MAIN_OSC_CTRL);
  
                /* Wait for main oscillator to start */
                while (((__raw_readl(LPC32XX_CLKPWR_MAIN_OSC_CTRL) &
                        LPC32XX_CLKPWR_MOSC_DISABLE) != 0) &&
 -                      (timeout > jiffies))
 +                      time_before(jiffies, timeout))
                        cpu_relax();
  
                if ((__raw_readl(LPC32XX_CLKPWR_MAIN_OSC_CTRL) &
@@@ -385,7 -383,7 +385,7 @@@ static int local_usbpll_enable(struct c
  {
        u32 reg;
        int ret = -ENODEV;
 -      unsigned long timeout = 1 + msecs_to_jiffies(10);
 +      unsigned long timeout = jiffies + msecs_to_jiffies(10);
  
        reg = __raw_readl(LPC32XX_CLKPWR_USB_CTRL);
  
                __raw_writel(reg, LPC32XX_CLKPWR_USB_CTRL);
  
                /* Wait for PLL lock */
 -              while ((timeout > jiffies) & (ret == -ENODEV)) {
 +              while (time_before(jiffies, timeout) && (ret == -ENODEV)) {
                        reg = __raw_readl(LPC32XX_CLKPWR_USB_CTRL);
                        if (reg & LPC32XX_CLKPWR_USBCTRL_PLL_STS)
                                ret = 0;
@@@ -721,6 -719,41 +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;
@@@ -893,8 -926,20 +928,8 @@@ static struct clk clk_lcd = 
        .enable_mask    = LPC32XX_CLKPWR_LCDCTRL_CLK_EN,
  };
  
 -static inline void clk_lock(void)
 -{
 -      mutex_lock(&clkm_lock);
 -}
 -
 -static inline void clk_unlock(void)
 -{
 -      mutex_unlock(&clkm_lock);
 -}
 -
  static void local_clk_disable(struct clk *clk)
  {
 -      WARN_ON(clk->usecount == 0);
 -
        /* Don't attempt to disable clock if it has no users */
        if (clk->usecount > 0) {
                clk->usecount--;
@@@ -937,11 -982,10 +972,11 @@@ static int local_clk_enable(struct clk 
  int clk_enable(struct clk *clk)
  {
        int ret;
 +      unsigned long flags;
  
 -      clk_lock();
 +      spin_lock_irqsave(&global_clkregs_lock, flags);
        ret = local_clk_enable(clk);
 -      clk_unlock();
 +      spin_unlock_irqrestore(&global_clkregs_lock, flags);
  
        return ret;
  }
@@@ -952,11 -996,9 +987,11 @@@ EXPORT_SYMBOL(clk_enable)
   */
  void clk_disable(struct clk *clk)
  {
 -      clk_lock();
 +      unsigned long flags;
 +
 +      spin_lock_irqsave(&global_clkregs_lock, flags);
        local_clk_disable(clk);
 -      clk_unlock();
 +      spin_unlock_irqrestore(&global_clkregs_lock, flags);
  }
  EXPORT_SYMBOL(clk_disable);
  
   */
  unsigned long clk_get_rate(struct clk *clk)
  {
 -      unsigned long rate;
 -
 -      clk_lock();
 -      rate = clk->get_rate(clk);
 -      clk_unlock();
 -
 -      return rate;
 +      return clk->get_rate(clk);
  }
  EXPORT_SYMBOL(clk_get_rate);
  
@@@ -981,8 -1029,11 +1016,8 @@@ int clk_set_rate(struct clk *clk, unsig
         * the actual rate set as part of the peripheral dividers
         * instead of high level clock control
         */
 -      if (clk->set_rate) {
 -              clk_lock();
 +      if (clk->set_rate)
                ret = clk->set_rate(clk, rate);
 -              clk_unlock();
 -      }
  
        return ret;
  }
@@@ -993,11 -1044,15 +1028,11 @@@ EXPORT_SYMBOL(clk_set_rate)
   */
  long clk_round_rate(struct clk *clk, unsigned long rate)
  {
 -      clk_lock();
 -
        if (clk->round_rate)
                rate = clk->round_rate(clk, rate);
        else
                rate = clk->get_rate(clk);
  
 -      clk_unlock();
 -
        return rate;
  }
  EXPORT_SYMBOL(clk_round_rate);
@@@ -1055,10 -1110,11 +1090,11 @@@ static struct clk_lookup lookups[] = 
        _REGISTER_CLOCK("dev:ssp1", NULL, clk_ssp1)
        _REGISTER_CLOCK("lpc32xx_keys.0", NULL, clk_kscan)
        _REGISTER_CLOCK("lpc32xx-nand.0", "nand_ck", clk_nand)
 -      _REGISTER_CLOCK("tbd", "i2s0_ck", clk_i2s0)
 -      _REGISTER_CLOCK("tbd", "i2s1_ck", clk_i2s1)
 +      _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", "MCLK", clk_mmc)
 +      _REGISTER_CLOCK("dev:mmc0", NULL, clk_mmc)
        _REGISTER_CLOCK("lpc-net.0", NULL, clk_net)
        _REGISTER_CLOCK("dev:clcd", NULL, clk_lcd)
        _REGISTER_CLOCK("lpc32xx_udc", "ck_usbd", clk_usbd)
index 75640bfb097fab64de85e38a39a2a50b35db088c,04b72739eb9c3510d615ffddec3bfce8aac9b390..68f2e46d98ad3ba0b159895c72707598490d7538
@@@ -29,6 -29,7 +29,7 @@@ extern struct platform_device lpc32xx_i
  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;
  
  /*
@@@ -65,6 -66,7 +66,6 @@@ extern u32 clk_get_pclk_div(void)
   */
  extern void lpc32xx_get_uid(u32 devid[4]);
  
 -extern void lpc32xx_watchdog_reset(void);
  extern u32 lpc32xx_return_iram_size(void);
  
  /*
index 945a2f24d5e901dbbbec5f07a4380ead6e4bf23e,a2f0d4e3f7731e919534968e1b705ec667f9f5b5..4590a8b52e72fc20e8c665c50a0303262ae7a8e4
@@@ -271,13 -271,12 +271,14 @@@ static struct platform_device lpc32xx_g
  };
  
  static struct platform_device *phy3250_devs[] __initdata = {
 +      &lpc32xx_rtc_device,
 +      &lpc32xx_tsc_device,
        &lpc32xx_i2c0_device,
        &lpc32xx_i2c1_device,
        &lpc32xx_i2c2_device,
        &lpc32xx_watchdog_device,
        &lpc32xx_gpio_led_device,
+       &lpc32xx_adc_device,
  };
  
  static struct amba_device *amba_devs[] __initdata = {
This page took 0.03061 seconds and 5 git commands to generate.