Merge tag 'clk' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc
Linus Torvalds [Mon, 9 Jan 2012 22:44:15 +0000 (14:44 -0800)]
clock management changes for i.MX

Another simple series related to clock management, this time only for
imx.

* tag 'clk' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc:
  ARM: mxs: select HAVE_CLK_PREPARE for clock
  clk: add config option HAVE_CLK_PREPARE into Kconfig
  ASoC: mxs-saif: convert to clk_prepare/clk_unprepare
  video: mxsfb: convert to clk_prepare/clk_unprepare
  serial: mxs-auart: convert to clk_prepare/clk_unprepare
  net: flexcan: convert to clk_prepare/clk_unprepare
  mtd: gpmi-lib: convert to clk_prepare/clk_unprepare
  mmc: mxs-mmc: convert to clk_prepare/clk_unprepare
  dma: mxs-dma: convert to clk_prepare/clk_unprepare
  net: fec: add clk_prepare/clk_unprepare
  ARM: mxs: convert platform code to clk_prepare/clk_unprepare
  clk: add helper functions clk_prepare_enable and clk_disable_unprepare

Fix up trivial conflicts in drivers/net/ethernet/freescale/fec.c due to
commit 0ebafefcaa7a ("net: fec: add clk_prepare/clk_unprepare") clashing
trivially with commit e163cc97f9ac ("net/fec: fix the .remove code").

1  2 
arch/arm/Kconfig
arch/arm/mach-mxs/clock-mx28.c
arch/arm/mach-mxs/mach-mx28evk.c
arch/arm/mach-mxs/system.c
drivers/net/can/flexcan.c
drivers/net/ethernet/freescale/fec.c
drivers/tty/serial/mxs-auart.c
sound/soc/mxs/mxs-saif.c

diff --combined arch/arm/Kconfig
@@@ -258,7 -258,6 +258,7 @@@ config ARCH_INTEGRATO
        select ARCH_HAS_CPUFREQ
        select CLKDEV_LOOKUP
        select HAVE_MACH_CLKDEV
 +      select HAVE_TCM
        select ICST
        select GENERIC_CLOCKEVENTS
        select PLAT_VERSATILE
@@@ -342,12 -341,10 +342,12 @@@ config ARCH_HIGHBAN
        select ARM_AMBA
        select ARM_GIC
        select ARM_TIMER_SP804
 +      select CACHE_L2X0
        select CLKDEV_LOOKUP
        select CPU_V7
        select GENERIC_CLOCKEVENTS
        select HAVE_ARM_SCU
 +      select HAVE_SMP
        select USE_OF
        help
          Support for the Calxeda Highbank SoC based boards.
@@@ -365,7 -362,6 +365,7 @@@ config ARCH_CNS3XX
        select CPU_V6K
        select GENERIC_CLOCKEVENTS
        select ARM_GIC
 +      select MIGHT_HAVE_CACHE_L2X0
        select MIGHT_HAVE_PCI
        select PCI_DOMAINS if PCI
        help
@@@ -386,7 -382,6 +386,7 @@@ config ARCH_PRIMA
        select GENERIC_CLOCKEVENTS
        select CLKDEV_LOOKUP
        select GENERIC_IRQ_CHIP
 +      select MIGHT_HAVE_CACHE_L2X0
        select USE_OF
        select ZONE_DMA
        help
@@@ -447,6 -442,7 +447,7 @@@ config ARCH_MX
        select ARCH_REQUIRE_GPIOLIB
        select CLKDEV_LOOKUP
        select CLKSRC_MMIO
+       select HAVE_CLK_PREPARE
        help
          Support for Freescale MXS-based family of processors
  
@@@ -597,7 -593,6 +598,7 @@@ config ARCH_MM
        select ARCH_REQUIRE_GPIOLIB
        select CLKDEV_LOOKUP
        select GENERIC_CLOCKEVENTS
 +      select GPIO_PXA
        select HAVE_SCHED_CLOCK
        select TICK_ONESHOT
        select PLAT_PXA
@@@ -640,8 -635,6 +641,8 @@@ config ARCH_TEGR
        select GENERIC_GPIO
        select HAVE_CLK
        select HAVE_SCHED_CLOCK
 +      select HAVE_SMP
 +      select MIGHT_HAVE_CACHE_L2X0
        select ARCH_HAS_CPUFREQ
        help
          This enables support for NVIDIA Tegra based systems (Tegra APX,
@@@ -659,7 -652,6 +660,7 @@@ config ARCH_PICOXCEL
        select HAVE_SCHED_CLOCK
        select HAVE_TCM
        select NO_IOPORT
 +      select SPARSE_IRQ
        select USE_OF
        help
          This enables support for systems based on the Picochip picoXcell
@@@ -683,7 -675,6 +684,7 @@@ config ARCH_PX
        select CLKSRC_MMIO
        select ARCH_REQUIRE_GPIOLIB
        select GENERIC_CLOCKEVENTS
 +      select GPIO_PXA
        select HAVE_SCHED_CLOCK
        select TICK_ONESHOT
        select PLAT_PXA
@@@ -713,9 -704,7 +714,9 @@@ config ARCH_SHMOBIL
        select HAVE_CLK
        select CLKDEV_LOOKUP
        select HAVE_MACH_CLKDEV
 +      select HAVE_SMP
        select GENERIC_CLOCKEVENTS
 +      select MIGHT_HAVE_CACHE_L2X0
        select NO_IOPORT
        select SPARSE_IRQ
        select MULTI_IRQ_HANDLER
@@@ -751,7 -740,7 +752,7 @@@ config ARCH_SA110
        select ARCH_HAS_CPUFREQ
        select CPU_FREQ
        select GENERIC_CLOCKEVENTS
 -      select HAVE_CLK
 +      select CLKDEV_LOOKUP
        select HAVE_SCHED_CLOCK
        select TICK_ONESHOT
        select ARCH_REQUIRE_GPIOLIB
@@@ -880,6 -869,16 +881,6 @@@ config ARCH_SHAR
          Support for the StrongARM based Digital DNARD machine, also known
          as "Shark" (<http://www.shark-linux.de/shark.html>).
  
 -config ARCH_TCC_926
 -      bool "Telechips TCC ARM926-based systems"
 -      select CLKSRC_MMIO
 -      select CPU_ARM926T
 -      select HAVE_CLK
 -      select CLKDEV_LOOKUP
 -      select GENERIC_CLOCKEVENTS
 -      help
 -        Support for Telechips TCC ARM926-based systems.
 -
  config ARCH_U300
        bool "ST-Ericsson U300 Series"
        depends on MMU
        select HAVE_MACH_CLKDEV
        select GENERIC_GPIO
        select ARCH_REQUIRE_GPIOLIB
 -      select NEED_MACH_MEMORY_H
        help
          Support for ST-Ericsson U300 series mobile platforms.
  
@@@ -906,8 -906,6 +907,8 @@@ config ARCH_U850
        select CLKDEV_LOOKUP
        select ARCH_REQUIRE_GPIOLIB
        select ARCH_HAS_CPUFREQ
 +      select HAVE_SMP
 +      select MIGHT_HAVE_CACHE_L2X0
        help
          Support for ST-Ericsson's Ux500 architecture
  
@@@ -918,7 -916,6 +919,7 @@@ config ARCH_NOMADI
        select CPU_ARM926T
        select CLKDEV_LOOKUP
        select GENERIC_CLOCKEVENTS
 +      select MIGHT_HAVE_CACHE_L2X0
        select ARCH_REQUIRE_GPIOLIB
        help
          Support for the Nomadik platform by ST-Ericsson
@@@ -978,7 -975,6 +979,7 @@@ config ARCH_ZYN
        select ARM_GIC
        select ARM_AMBA
        select ICST
 +      select MIGHT_HAVE_CACHE_L2X0
        select USE_OF
        help
          Support for Xilinx Zynq ARM Cortex A9 Platform
@@@ -1065,6 -1061,8 +1066,6 @@@ source "arch/arm/plat-s5p/Kconfig
  
  source "arch/arm/plat-spear/Kconfig"
  
 -source "arch/arm/plat-tcc/Kconfig"
 -
  if ARCH_S3C2410
  source "arch/arm/mach-s3c2410/Kconfig"
  source "arch/arm/mach-s3c2412/Kconfig"
@@@ -1129,11 -1127,6 +1130,11 @@@ config ARM_TIMER_SP80
  
  source arch/arm/mm/Kconfig
  
 +config ARM_NR_BANKS
 +      int
 +      default 16 if ARCH_EP93XX
 +      default 8
 +
  config IWMMXT
        bool "Enable iWMMXt support"
        depends on CPU_XSCALE || CPU_XSC3 || CPU_MOHAWK || CPU_PJ4
          Enable support for iWMMXt context switching at run time if
          running on a CPU that supports it.
  
 -#  bool 'Use XScale PMU as timer source' CONFIG_XSCALE_PMU_TIMER
  config XSCALE_PMU
        bool
 -      depends on CPU_XSCALE && !XSCALE_PMU_TIMER
 +      depends on CPU_XSCALE
        default y
  
  config CPU_HAS_PMU
@@@ -1253,7 -1247,7 +1254,7 @@@ config PL310_ERRATA_58836
  
  config ARM_ERRATA_720789
        bool "ARM errata: TLBIASIDIS and TLBIMVAIS operations can broadcast a faulty ASID"
 -      depends on CPU_V7 && SMP
 +      depends on CPU_V7
        help
          This option enables the workaround for the 720789 Cortex-A9 (prior to
          r2p0) erratum. A faulty ASID can be sent to the other CPUs for the
@@@ -1289,7 -1283,7 +1290,7 @@@ config ARM_ERRATA_74362
  
  config ARM_ERRATA_751472
        bool "ARM errata: Interrupted ICIALLUIS may prevent completion of broadcasted operation"
 -      depends on CPU_V7 && SMP
 +      depends on CPU_V7
        help
          This option enables the workaround for the 751472 Cortex-A9 (prior
          to r3p0) erratum. An interrupted ICIALLUIS operation may prevent the
@@@ -1442,20 -1436,14 +1443,20 @@@ menu "Kernel Features
  
  source "kernel/time/Kconfig"
  
 +config HAVE_SMP
 +      bool
 +      help
 +        This option should be selected by machines which have an SMP-
 +        capable CPU.
 +
 +        The only effect of this option is to make the SMP-related
 +        options available to the user for configuration.
 +
  config SMP
        bool "Symmetric Multi-Processing"
        depends on CPU_V6K || CPU_V7
        depends on GENERIC_CLOCKEVENTS
 -      depends on REALVIEW_EB_ARM11MP || REALVIEW_EB_A9MP || \
 -               MACH_REALVIEW_PB11MP || MACH_REALVIEW_PBX || ARCH_OMAP4 || \
 -               ARCH_EXYNOS4 || ARCH_TEGRA || ARCH_U8500 || ARCH_VEXPRESS_CA9X4 || \
 -               ARCH_MSM_SCORPIONMP || ARCH_SHMOBILE || ARCH_HIGHBANK || SOC_IMX6Q
 +      depends on HAVE_SMP
        depends on MMU
        select USE_GENERIC_SMP_HELPERS
        select HAVE_ARM_SCU if !ARCH_MSM_SCORPIONMP
@@@ -1573,16 -1561,6 +1574,16 @@@ config LOCAL_TIMER
          accounting to be spread across the timer interval, preventing a
          "thundering herd" at every timer tick.
  
 +config ARCH_NR_GPIO
 +      int
 +      default 1024 if ARCH_SHMOBILE || ARCH_TEGRA
 +      default 350 if ARCH_U8500
 +      default 0
 +      help
 +        Maximum number of GPIOs in the system.
 +
 +        If unsure, leave the default value.
 +
  source kernel/Kconfig.preempt
  
  config HZ
@@@ -1995,7 -1973,7 +1996,7 @@@ endchoic
  
  config XIP_KERNEL
        bool "Kernel Execute-In-Place from ROM"
 -      depends on !ZBOOT_ROM
 +      depends on !ZBOOT_ROM && !ARM_LPAE
        help
          Execute-In-Place allows the kernel to run from non-volatile storage
          directly addressable by the CPU, such as NOR flash. This saves RAM
@@@ -2025,7 -2003,7 +2026,7 @@@ config XIP_PHYS_ADD
  
  config KEXEC
        bool "Kexec system call (EXPERIMENTAL)"
 -      depends on EXPERIMENTAL
 +      depends on EXPERIMENTAL && (!SMP || HOTPLUG_CPU)
        help
          kexec is a system call that implements the ability to shutdown your
          current kernel, and to start another kernel.  It is like a reboot
@@@ -22,7 -22,6 +22,7 @@@
  #include <linux/io.h>
  #include <linux/jiffies.h>
  #include <linux/clkdev.h>
 +#include <linux/spinlock.h>
  
  #include <asm/clkdev.h>
  #include <asm/div64.h>
@@@ -30,7 -29,6 +30,7 @@@
  #include <mach/mx28.h>
  #include <mach/common.h>
  #include <mach/clock.h>
 +#include <mach/digctl.h>
  
  #include "regs-clkctrl-mx28.h"
  
@@@ -45,33 -43,6 +45,33 @@@ static struct clk emi_clk
  static struct clk saif0_clk;
  static struct clk saif1_clk;
  static struct clk clk32k_clk;
 +static DEFINE_SPINLOCK(clkmux_lock);
 +
 +/*
 + * HW_SAIF_CLKMUX_SEL:
 + *  DIRECT(0x0): SAIF0 clock pins selected for SAIF0 input clocks, and SAIF1
 + *            clock pins selected for SAIF1 input clocks.
 + *  CROSSINPUT(0x1): SAIF1 clock inputs selected for SAIF0 input clocks, and
 + *            SAIF0 clock inputs selected for SAIF1 input clocks.
 + *  EXTMSTR0(0x2): SAIF0 clock pin selected for both SAIF0 and SAIF1 input
 + *            clocks.
 + *  EXTMSTR1(0x3): SAIF1 clock pin selected for both SAIF0 and SAIF1 input
 + *            clocks.
 + */
 +int mxs_saif_clkmux_select(unsigned int clkmux)
 +{
 +      if (clkmux > 0x3)
 +              return -EINVAL;
 +
 +      spin_lock(&clkmux_lock);
 +      __raw_writel(BM_DIGCTL_CTRL_SAIF_CLKMUX,
 +                      DIGCTRL_BASE_ADDR + HW_DIGCTL_CTRL + MXS_CLR_ADDR);
 +      __raw_writel(clkmux << BP_DIGCTL_CTRL_SAIF_CLKMUX,
 +                      DIGCTRL_BASE_ADDR + HW_DIGCTL_CTRL + MXS_SET_ADDR);
 +      spin_unlock(&clkmux_lock);
 +
 +      return 0;
 +}
  
  static int _raw_clk_enable(struct clk *clk)
  {
@@@ -804,25 -775,16 +804,25 @@@ int __init mx28_clocks_init(void
        clk_set_parent(&ssp0_clk, &ref_io0_clk);
        clk_set_parent(&ssp1_clk, &ref_io0_clk);
  
-       clk_enable(&cpu_clk);
-       clk_enable(&hbus_clk);
-       clk_enable(&xbus_clk);
-       clk_enable(&emi_clk);
-       clk_enable(&uart_clk);
+       clk_prepare_enable(&cpu_clk);
+       clk_prepare_enable(&hbus_clk);
+       clk_prepare_enable(&xbus_clk);
+       clk_prepare_enable(&emi_clk);
+       clk_prepare_enable(&uart_clk);
  
        clk_set_parent(&lcdif_clk, &ref_pix_clk);
        clk_set_parent(&saif0_clk, &pll0_clk);
        clk_set_parent(&saif1_clk, &pll0_clk);
  
 +      /*
 +       * Set an initial clock rate for the saif internal logic to work
 +       * properly. This is important when working in EXTMASTER mode that
 +       * uses the other saif's BITCLK&LRCLK but it still needs a basic
 +       * clock which should be fast enough for the internal logic.
 +       */
 +      clk_set_rate(&saif0_clk, 24000000);
 +      clk_set_rate(&saif1_clk, 24000000);
 +
        clkdev_add_table(lookups, ARRAY_SIZE(lookups));
  
        mxs_timer_init(&clk32k_clk, MX28_INT_TIMER0);
@@@ -27,7 -27,6 +27,7 @@@
  
  #include <mach/common.h>
  #include <mach/iomux-mx28.h>
 +#include <mach/digctl.h>
  
  #include "devices-mx28.h"
  
@@@ -229,7 -228,7 +229,7 @@@ static void __init mx28evk_fec_reset(vo
        /* Enable fec phy clock */
        clk = clk_get_sys("pll2", NULL);
        if (!IS_ERR(clk))
-               clk_enable(clk);
+               clk_prepare_enable(clk);
  
        /* Power up fec phy */
        ret = gpio_request(MX28EVK_FEC_PHY_POWER, "fec-phy-power");
@@@ -422,18 -421,6 +422,18 @@@ static struct gpio mx28evk_lcd_gpios[] 
        { MX28EVK_BL_ENABLE, GPIOF_OUT_INIT_HIGH, "bl-enable" },
  };
  
 +static const struct mxs_saif_platform_data
 +                      mx28evk_mxs_saif_pdata[] __initconst = {
 +      /* working on EXTMSTR0 mode (saif0 master, saif1 slave) */
 +      {
 +              .master_mode = 1,
 +              .master_id = 0,
 +      }, {
 +              .master_mode = 0,
 +              .master_id = 0,
 +      },
 +};
 +
  static void __init mx28evk_init(void)
  {
        int ret;
        else
                mx28_add_mxsfb(&mx28evk_mxsfb_pdata);
  
 -      mx28_add_saif(0);
 -      mx28_add_saif(1);
 +      mxs_saif_clkmux_select(MXS_DIGCTL_SAIF_CLKMUX_EXTMSTR0);
 +      mx28_add_saif(0, &mx28evk_mxs_saif_pdata[0]);
 +      mx28_add_saif(1, &mx28evk_mxs_saif_pdata[1]);
  
        mx28_add_mxs_i2c(0);
        i2c_register_board_info(0, mxs_i2c0_board_info,
@@@ -515,5 -501,4 +515,5 @@@ MACHINE_START(MX28EVK, "Freescale MX28 
        .init_irq       = mx28_init_irq,
        .timer          = &mx28evk_timer,
        .init_machine   = mx28evk_init,
 +      .restart        = mxs_restart,
  MACHINE_END
@@@ -42,7 -42,7 +42,7 @@@ static void __iomem *mxs_clkctrl_reset_
  /*
   * Reset the system. It is called by machine_restart().
   */
 -void arch_reset(char mode, const char *cmd)
 +void mxs_restart(char mode, const char *cmd)
  {
        /* reset the chip */
        __mxs_setl(MXS_CLKCTRL_RESET_CHIP, mxs_clkctrl_reset_addr);
@@@ -53,7 -53,7 +53,7 @@@
        mdelay(50);
  
        /* We'll take a jump through zero as a poor second */
 -      cpu_reset(0);
 +      soft_restart(0);
  }
  
  static int __init mxs_arch_reset_init(void)
@@@ -66,7 -66,7 +66,7 @@@
  
        clk = clk_get_sys("rtc", NULL);
        if (!IS_ERR(clk))
-               clk_enable(clk);
+               clk_prepare_enable(clk);
  
        return 0;
  }
@@@ -802,7 -802,7 +802,7 @@@ static int flexcan_open(struct net_devi
        struct flexcan_priv *priv = netdev_priv(dev);
        int err;
  
-       clk_enable(priv->clk);
+       clk_prepare_enable(priv->clk);
  
        err = open_candev(dev);
        if (err)
   out_close:
        close_candev(dev);
   out:
-       clk_disable(priv->clk);
+       clk_disable_unprepare(priv->clk);
  
        return err;
  }
@@@ -838,7 -838,7 +838,7 @@@ static int flexcan_close(struct net_dev
        flexcan_chip_stop(dev);
  
        free_irq(dev->irq, dev);
-       clk_disable(priv->clk);
+       clk_disable_unprepare(priv->clk);
  
        close_candev(dev);
  
@@@ -877,7 -877,7 +877,7 @@@ static int __devinit register_flexcande
        struct flexcan_regs __iomem *regs = priv->base;
        u32 reg, err;
  
-       clk_enable(priv->clk);
+       clk_prepare_enable(priv->clk);
  
        /* select "bus clock", chip must be disabled */
        flexcan_chip_disable(priv);
   out:
        /* disable core and turn off clocks */
        flexcan_chip_disable(priv);
-       clk_disable(priv->clk);
+       clk_disable_unprepare(priv->clk);
  
        return err;
  }
@@@ -1060,7 -1060,20 +1060,7 @@@ static struct platform_driver flexcan_d
        .remove = __devexit_p(flexcan_remove),
  };
  
 -static int __init flexcan_init(void)
 -{
 -      pr_info("%s netdevice driver\n", DRV_NAME);
 -      return platform_driver_register(&flexcan_driver);
 -}
 -
 -static void __exit flexcan_exit(void)
 -{
 -      platform_driver_unregister(&flexcan_driver);
 -      pr_info("%s: driver removed\n", DRV_NAME);
 -}
 -
 -module_init(flexcan_init);
 -module_exit(flexcan_exit);
 +module_platform_driver(flexcan_driver);
  
  MODULE_AUTHOR("Sascha Hauer <kernel@pengutronix.de>, "
              "Marc Kleine-Budde <kernel@pengutronix.de>");
@@@ -99,7 -99,7 +99,7 @@@ static struct platform_device_id fec_de
  MODULE_DEVICE_TABLE(platform, fec_devtype);
  
  enum imx_fec_type {
 -      IMX25_FEC = 1,  /* runs on i.mx25/50/53 */
 +      IMX25_FEC = 1,  /* runs on i.mx25/50/53 */
        IMX27_FEC,      /* runs on i.mx27/35/51 */
        IMX28_FEC,
        IMX6Q_FEC,
@@@ -132,7 -132,7 +132,7 @@@ MODULE_PARM_DESC(macaddr, "FEC Etherne
  #elif defined (CONFIG_M5272C3)
  #define       FEC_FLASHMAC    (0xffe04000 + 4)
  #elif defined(CONFIG_MOD5272)
 -#define FEC_FLASHMAC  0xffc0406b
 +#define FEC_FLASHMAC  0xffc0406b
  #else
  #define       FEC_FLASHMAC    0
  #endif
@@@ -255,13 -255,11 +255,13 @@@ struct fec_enet_private 
  #define FEC_MMFR_TA           (2 << 16)
  #define FEC_MMFR_DATA(v)      (v & 0xffff)
  
 -#define FEC_MII_TIMEOUT               1000 /* us */
 +#define FEC_MII_TIMEOUT               30000 /* us */
  
  /* Transmitter timeout */
  #define TX_TIMEOUT (2 * HZ)
  
 +static int mii_cnt;
 +
  static void *swap_buffer(void *bufaddr, int len)
  {
        int i;
@@@ -518,7 -516,6 +518,7 @@@ fec_stop(struct net_device *ndev
        struct fec_enet_private *fep = netdev_priv(ndev);
        const struct platform_device_id *id_entry =
                                platform_get_device_id(fep->pdev);
 +      u32 rmii_mode = readl(fep->hwp + FEC_R_CNTRL) & (1 << 8);
  
        /* We cannot expect a graceful transmit stop without link !!! */
        if (fep->link) {
        writel(FEC_DEFAULT_IMASK, fep->hwp + FEC_IMASK);
  
        /* We have to keep ENET enabled to have MII interrupt stay working */
 -      if (id_entry->driver_data & FEC_QUIRK_ENET_MAC)
 +      if (id_entry->driver_data & FEC_QUIRK_ENET_MAC) {
                writel(2, fep->hwp + FEC_ECNTRL);
 +              writel(rmii_mode, fep->hwp + FEC_R_CNTRL);
 +      }
  }
  
  
@@@ -824,7 -819,7 +824,7 @@@ static void __inline__ fec_get_mac(stru
                        iap = (unsigned char *)FEC_FLASHMAC;
  #else
                if (pdata)
 -                      memcpy(iap, pdata->mac, ETH_ALEN);
 +                      iap = (unsigned char *)&pdata->mac;
  #endif
        }
  
@@@ -871,8 -866,6 +871,8 @@@ static void fec_enet_adjust_link(struc
        if (phy_dev->link) {
                if (fep->full_duplex != phy_dev->duplex) {
                        fec_restart(ndev, phy_dev->duplex);
 +                      /* prevent unnecessary second fec_restart() below */
 +                      fep->link = phy_dev->link;
                        status_change = 1;
                }
        }
@@@ -980,9 -973,8 +980,9 @@@ static int fec_enet_mii_probe(struct ne
        }
  
        if (phy_id >= PHY_MAX_ADDR) {
 -              printk(KERN_INFO "%s: no PHY, assuming direct connection "
 -                      "to switch\n", ndev->name);
 +              printk(KERN_INFO
 +                      "%s: no PHY, assuming direct connection to switch\n",
 +                      ndev->name);
                strncpy(mdio_bus_id, "0", MII_BUS_ID_SIZE);
                phy_id = 0;
        }
        fep->link = 0;
        fep->full_duplex = 0;
  
 -      printk(KERN_INFO "%s: Freescale FEC PHY driver [%s] "
 -              "(mii_bus:phy_addr=%s, irq=%d)\n", ndev->name,
 +      printk(KERN_INFO
 +              "%s: Freescale FEC PHY driver [%s] (mii_bus:phy_addr=%s, irq=%d)\n",
 +              ndev->name,
                fep->phy_dev->drv->name, dev_name(&fep->phy_dev->dev),
                fep->phy_dev->irq);
  
@@@ -1043,12 -1034,8 +1043,12 @@@ static int fec_enet_mii_init(struct pla
         */
        if ((id_entry->driver_data & FEC_QUIRK_ENET_MAC) && fep->dev_id > 0) {
                /* fec1 uses fec0 mii_bus */
 -              fep->mii_bus = fec0_mii_bus;
 -              return 0;
 +              if (mii_cnt && fec0_mii_bus) {
 +                      fep->mii_bus = fec0_mii_bus;
 +                      mii_cnt++;
 +                      return 0;
 +              }
 +              return -ENOENT;
        }
  
        fep->mii_timeout = 0;
        if (mdiobus_register(fep->mii_bus))
                goto err_out_free_mdio_irq;
  
 +      mii_cnt++;
 +
        /* save fec0 mii_bus */
        if (id_entry->driver_data & FEC_QUIRK_ENET_MAC)
                fec0_mii_bus = fep->mii_bus;
@@@ -1111,11 -1096,11 +1111,11 @@@ err_out
  
  static void fec_enet_mii_remove(struct fec_enet_private *fep)
  {
 -      if (fep->phy_dev)
 -              phy_disconnect(fep->phy_dev);
 -      mdiobus_unregister(fep->mii_bus);
 -      kfree(fep->mii_bus->irq);
 -      mdiobus_free(fep->mii_bus);
 +      if (--mii_cnt == 0) {
 +              mdiobus_unregister(fep->mii_bus);
 +              kfree(fep->mii_bus->irq);
 +              mdiobus_free(fep->mii_bus);
 +      }
  }
  
  static int fec_enet_get_settings(struct net_device *ndev,
@@@ -1152,7 -1137,7 +1152,7 @@@ static void fec_enet_get_drvinfo(struc
        strcpy(info->bus_info, dev_name(&ndev->dev));
  }
  
 -static struct ethtool_ops fec_enet_ethtool_ops = {
 +static const struct ethtool_ops fec_enet_ethtool_ops = {
        .get_settings           = fec_enet_get_settings,
        .set_settings           = fec_enet_set_settings,
        .get_drvinfo            = fec_enet_get_drvinfo,
@@@ -1589,12 -1574,8 +1589,12 @@@ fec_probe(struct platform_device *pdev
  
        for (i = 0; i < FEC_IRQ_NUM; i++) {
                irq = platform_get_irq(pdev, i);
 -              if (i && irq < 0)
 -                      break;
 +              if (irq < 0) {
 +                      if (i)
 +                              break;
 +                      ret = irq;
 +                      goto failed_irq;
 +              }
                ret = request_irq(irq, fec_enet_interrupt, IRQF_DISABLED, pdev->name, ndev);
                if (ret) {
                        while (--i >= 0) {
                }
        }
  
 -      fep->clk = clk_get(&pdev->dev, "fec_clk");
 +      fep->clk = clk_get(&pdev->dev, NULL);
        if (IS_ERR(fep->clk)) {
                ret = PTR_ERR(fep->clk);
                goto failed_clk;
        }
-       clk_enable(fep->clk);
+       clk_prepare_enable(fep->clk);
  
        ret = fec_enet_init(ndev);
        if (ret)
@@@ -1633,7 -1614,7 +1633,7 @@@ failed_register
        fec_enet_mii_remove(fep);
  failed_mii_init:
  failed_init:
-       clk_disable(fep->clk);
+       clk_disable_unprepare(fep->clk);
        clk_put(fep->clk);
  failed_clk:
        for (i = 0; i < FEC_IRQ_NUM; i++) {
@@@ -1657,18 -1638,13 +1657,18 @@@ fec_drv_remove(struct platform_device *
        struct net_device *ndev = platform_get_drvdata(pdev);
        struct fec_enet_private *fep = netdev_priv(ndev);
        struct resource *r;
 +      int i;
  
 -      fec_stop(ndev);
 +      unregister_netdev(ndev);
        fec_enet_mii_remove(fep);
 +      for (i = 0; i < FEC_IRQ_NUM; i++) {
 +              int irq = platform_get_irq(pdev, i);
 +              if (irq > 0)
 +                      free_irq(irq, ndev);
 +      }
-       clk_disable(fep->clk);
+       clk_disable_unprepare(fep->clk);
        clk_put(fep->clk);
        iounmap(fep->hwp);
 -      unregister_netdev(ndev);
        free_netdev(ndev);
  
        r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
@@@ -1691,7 -1667,7 +1691,7 @@@ fec_suspend(struct device *dev
                fec_stop(ndev);
                netif_device_detach(ndev);
        }
-       clk_disable(fep->clk);
+       clk_disable_unprepare(fep->clk);
  
        return 0;
  }
@@@ -1702,7 -1678,7 +1702,7 @@@ fec_resume(struct device *dev
        struct net_device *ndev = dev_get_drvdata(dev);
        struct fec_enet_private *fep = netdev_priv(ndev);
  
-       clk_enable(fep->clk);
+       clk_prepare_enable(fep->clk);
        if (netif_running(ndev)) {
                fec_restart(ndev, fep->full_duplex);
                netif_device_attach(ndev);
@@@ -145,12 -145,11 +145,12 @@@ static inline void mxs_auart_tx_chars(s
                        writel(xmit->buf[xmit->tail],
                                     s->port.membase + AUART_DATA);
                        xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
                } else
                        break;
        }
 +      if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
 +              uart_write_wakeup(&s->port);
 +
        if (uart_circ_empty(&(s->port.state->xmit)))
                writel(AUART_INTR_TXIEN,
                             s->port.membase + AUART_INTR_CLR);
@@@ -425,7 -424,7 +425,7 @@@ static int mxs_auart_startup(struct uar
  {
        struct mxs_auart_port *s = to_auart_port(u);
  
-       clk_enable(s->clk);
+       clk_prepare_enable(s->clk);
  
        writel(AUART_CTRL0_CLKGATE, u->membase + AUART_CTRL0_CLR);
  
@@@ -454,7 -453,7 +454,7 @@@ static void mxs_auart_shutdown(struct u
        writel(AUART_INTR_RXIEN | AUART_INTR_RTIEN | AUART_INTR_CTSMIEN,
                        u->membase + AUART_INTR_CLR);
  
-       clk_disable(s->clk);
+       clk_disable_unprepare(s->clk);
  }
  
  static unsigned int mxs_auart_tx_empty(struct uart_port *u)
@@@ -635,7 -634,7 +635,7 @@@ auart_console_setup(struct console *co
        if (!s)
                return -ENODEV;
  
-       clk_enable(s->clk);
+       clk_prepare_enable(s->clk);
  
        if (options)
                uart_parse_options(options, &baud, &parity, &bits, &flow);
  
        ret = uart_set_options(&s->port, co, baud, parity, bits, flow);
  
-       clk_disable(s->clk);
+       clk_disable_unprepare(s->clk);
  
        return ret;
  }
diff --combined sound/soc/mxs/mxs-saif.c
@@@ -210,7 -210,7 +210,7 @@@ int mxs_saif_put_mclk(unsigned int saif
                return -EBUSY;
        }
  
-       clk_disable(saif->clk);
+       clk_disable_unprepare(saif->clk);
  
        /* disable MCLK output */
        __raw_writel(BM_SAIF_CTRL_CLKGATE,
@@@ -264,7 -264,7 +264,7 @@@ int mxs_saif_get_mclk(unsigned int saif
        if (ret)
                return ret;
  
-       ret = clk_enable(saif->clk);
+       ret = clk_prepare_enable(saif->clk);
        if (ret)
                return ret;
  
@@@ -625,6 -625,13 +625,6 @@@ static int mxs_saif_probe(struct platfo
        if (pdev->id >= ARRAY_SIZE(mxs_saif))
                return -EINVAL;
  
 -      pdata = pdev->dev.platform_data;
 -      if (pdata && pdata->init) {
 -              ret = pdata->init();
 -              if (ret)
 -                      return ret;
 -      }
 -
        saif = kzalloc(sizeof(*saif), GFP_KERNEL);
        if (!saif)
                return -ENOMEM;
        mxs_saif[pdev->id] = saif;
        saif->id = pdev->id;
  
 -      saif->master_id = saif->id;
 -      if (pdata && pdata->get_master_id) {
 -              saif->master_id = pdata->get_master_id(saif->id);
 +      pdata = pdev->dev.platform_data;
 +      if (pdata && !pdata->master_mode) {
 +              saif->master_id = pdata->master_id;
                if (saif->master_id < 0 ||
 -                      saif->master_id >= ARRAY_SIZE(mxs_saif))
 +                      saif->master_id >= ARRAY_SIZE(mxs_saif) ||
 +                      saif->master_id == saif->id) {
 +                      dev_err(&pdev->dev, "get wrong master id\n");
                        return -EINVAL;
 +              }
 +      } else {
 +              saif->master_id = saif->id;
        }
  
        saif->clk = clk_get(&pdev->dev, NULL);