diff options
174 files changed, 1607 insertions, 1392 deletions
@@ -1,7 +1,7 @@  VERSION = 3  PATCHLEVEL = 3  SUBLEVEL = 0 -EXTRAVERSION = -rc3 +EXTRAVERSION = -rc4  NAME = Saber-toothed Squirrel  # *DOCUMENTATION* diff --git a/arch/arm/boot/dts/exynos4210.dtsi b/arch/arm/boot/dts/exynos4210.dtsi index 63d7578856c..a1dd2ee8375 100644 --- a/arch/arm/boot/dts/exynos4210.dtsi +++ b/arch/arm/boot/dts/exynos4210.dtsi @@ -29,6 +29,7 @@  		compatible = "arm,cortex-a9-gic";  		#interrupt-cells = <3>;  		interrupt-controller; +		cpu-offset = <0x8000>;  		reg = <0x10490000 0x1000>, <0x10480000 0x100>;  	}; diff --git a/arch/arm/boot/dts/omap3-beagle.dts b/arch/arm/boot/dts/omap3-beagle.dts index 9486be62bcd..9f72cd4cf30 100644 --- a/arch/arm/boot/dts/omap3-beagle.dts +++ b/arch/arm/boot/dts/omap3-beagle.dts @@ -13,15 +13,6 @@  	model = "TI OMAP3 BeagleBoard";  	compatible = "ti,omap3-beagle", "ti,omap3"; -	/* -	 * Since the initial device tree board file does not create any -	 * devices (MMC, network...), the only way to boot is to provide a -	 * ramdisk. -	 */ -	chosen { -		bootargs = "root=/dev/ram0 rw console=ttyO2,115200n8 initrd=0x81600000,20M ramdisk_size=20480 no_console_suspend debug earlyprintk"; -	}; -  	memory {  		device_type = "memory";  		reg = <0x80000000 0x20000000>; /* 512 MB */ diff --git a/arch/arm/boot/dts/omap3-evm.dts b/arch/arm/boot/dts/omap3-evm.dts new file mode 100644 index 00000000000..2eee16ec59b --- /dev/null +++ b/arch/arm/boot/dts/omap3-evm.dts @@ -0,0 +1,20 @@ +/* + * Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +/dts-v1/; + +/include/ "omap3.dtsi" + +/ { +	model = "TI OMAP3 EVM (OMAP3530, AM/DM37x)"; +	compatible = "ti,omap3-evm", "ti,omap3"; + +	memory { +		device_type = "memory"; +		reg = <0x80000000 0x10000000>; /* 256 MB */ +	}; +}; diff --git a/arch/arm/boot/dts/omap3.dtsi b/arch/arm/boot/dts/omap3.dtsi index 216c3317461..e6980643287 100644 --- a/arch/arm/boot/dts/omap3.dtsi +++ b/arch/arm/boot/dts/omap3.dtsi @@ -67,28 +67,49 @@  			#interrupt-cells = <1>;  		}; -		uart1: serial@0x4806a000 { +		uart1: serial@4806a000 {  			compatible = "ti,omap3-uart";  			ti,hwmods = "uart1";  			clock-frequency = <48000000>;  		}; -		uart2: serial@0x4806c000 { +		uart2: serial@4806c000 {  			compatible = "ti,omap3-uart";  			ti,hwmods = "uart2";  			clock-frequency = <48000000>;  		}; -		uart3: serial@0x49020000 { +		uart3: serial@49020000 {  			compatible = "ti,omap3-uart";  			ti,hwmods = "uart3";  			clock-frequency = <48000000>;  		}; -		uart4: serial@0x49042000 { +		uart4: serial@49042000 {  			compatible = "ti,omap3-uart";  			ti,hwmods = "uart4";  			clock-frequency = <48000000>;  		}; + +		i2c1: i2c@48070000 { +			compatible = "ti,omap3-i2c"; +			#address-cells = <1>; +			#size-cells = <0>; +			ti,hwmods = "i2c1"; +		}; + +		i2c2: i2c@48072000 { +			compatible = "ti,omap3-i2c"; +			#address-cells = <1>; +			#size-cells = <0>; +			ti,hwmods = "i2c2"; +		}; + +		i2c3: i2c@48060000 { +			compatible = "ti,omap3-i2c"; +			#address-cells = <1>; +			#size-cells = <0>; +			ti,hwmods = "i2c3"; +		};  	};  }; diff --git a/arch/arm/boot/dts/omap4-panda.dts b/arch/arm/boot/dts/omap4-panda.dts index c7026578ce7..9755ad5917f 100644 --- a/arch/arm/boot/dts/omap4-panda.dts +++ b/arch/arm/boot/dts/omap4-panda.dts @@ -13,15 +13,6 @@  	model = "TI OMAP4 PandaBoard";  	compatible = "ti,omap4-panda", "ti,omap4430", "ti,omap4"; -	/* -	 * Since the initial device tree board file does not create any -	 * devices (MMC, network...), the only way to boot is to provide a -	 * ramdisk. -	 */ -	chosen { -		bootargs = "root=/dev/ram0 rw console=ttyO2,115200n8 initrd=0x81600000,20M ramdisk_size=20480 no_console_suspend debug"; -	}; -  	memory {  		device_type = "memory";  		reg = <0x80000000 0x40000000>; /* 1 GB */ diff --git a/arch/arm/boot/dts/omap4-sdp.dts b/arch/arm/boot/dts/omap4-sdp.dts index 066e28c9032..63c6b2b2bf4 100644 --- a/arch/arm/boot/dts/omap4-sdp.dts +++ b/arch/arm/boot/dts/omap4-sdp.dts @@ -13,15 +13,6 @@  	model = "TI OMAP4 SDP board";  	compatible = "ti,omap4-sdp", "ti,omap4430", "ti,omap4"; -	/* -	 * Since the initial device tree board file does not create any -	 * devices (MMC, network...), the only way to boot is to provide a -	 * ramdisk. -	 */ -	chosen { -		bootargs = "root=/dev/ram0 rw console=ttyO2,115200n8 initrd=0x81600000,20M ramdisk_size=20480 no_console_suspend debug"; -	}; -  	memory {  		device_type = "memory";  		reg = <0x80000000 0x40000000>; /* 1 GB */ diff --git a/arch/arm/boot/dts/omap4.dtsi b/arch/arm/boot/dts/omap4.dtsi index e8fe75fac7c..3d35559e77b 100644 --- a/arch/arm/boot/dts/omap4.dtsi +++ b/arch/arm/boot/dts/omap4.dtsi @@ -99,33 +99,61 @@  		gic: interrupt-controller@48241000 {  			compatible = "arm,cortex-a9-gic";  			interrupt-controller; -			#interrupt-cells = <1>; +			#interrupt-cells = <3>;  			reg = <0x48241000 0x1000>,  			      <0x48240100 0x0100>;  		}; -		uart1: serial@0x4806a000 { +		uart1: serial@4806a000 {  			compatible = "ti,omap4-uart";  			ti,hwmods = "uart1";  			clock-frequency = <48000000>;  		}; -		uart2: serial@0x4806c000 { +		uart2: serial@4806c000 {  			compatible = "ti,omap4-uart";  			ti,hwmods = "uart2";  			clock-frequency = <48000000>;  		}; -		uart3: serial@0x48020000 { +		uart3: serial@48020000 {  			compatible = "ti,omap4-uart";  			ti,hwmods = "uart3";  			clock-frequency = <48000000>;  		}; -		uart4: serial@0x4806e000 { +		uart4: serial@4806e000 {  			compatible = "ti,omap4-uart";  			ti,hwmods = "uart4";  			clock-frequency = <48000000>;  		}; + +		i2c1: i2c@48070000 { +			compatible = "ti,omap4-i2c"; +			#address-cells = <1>; +			#size-cells = <0>; +			ti,hwmods = "i2c1"; +		}; + +		i2c2: i2c@48072000 { +			compatible = "ti,omap4-i2c"; +			#address-cells = <1>; +			#size-cells = <0>; +			ti,hwmods = "i2c2"; +		}; + +		i2c3: i2c@48060000 { +			compatible = "ti,omap4-i2c"; +			#address-cells = <1>; +			#size-cells = <0>; +			ti,hwmods = "i2c3"; +		}; + +		i2c4: i2c@48350000 { +			compatible = "ti,omap4-i2c"; +			#address-cells = <1>; +			#size-cells = <0>; +			ti,hwmods = "i2c4"; +		};  	};  }; diff --git a/arch/arm/boot/dts/tegra-paz00.dts b/arch/arm/boot/dts/tegra-paz00.dts index 1a1d7023b69..825d2957da0 100644 --- a/arch/arm/boot/dts/tegra-paz00.dts +++ b/arch/arm/boot/dts/tegra-paz00.dts @@ -46,11 +46,11 @@  	};  	serial@70006200 { -		status = "disable"; +		clock-frequency = <216000000>;  	};  	serial@70006300 { -		clock-frequency = <216000000>; +		status = "disable";  	};  	serial@70006400 { @@ -60,7 +60,7 @@  	sdhci@c8000000 {  		cd-gpios = <&gpio 173 0>; /* gpio PV5 */  		wp-gpios = <&gpio 57 0>;  /* gpio PH1 */ -		power-gpios = <&gpio 155 0>; /* gpio PT3 */ +		power-gpios = <&gpio 169 0>; /* gpio PV1 */  	};  	sdhci@c8000200 { diff --git a/arch/arm/mach-at91/at91rm9200_devices.c b/arch/arm/mach-at91/at91rm9200_devices.c index 18bacec2b09..97676bdae99 100644 --- a/arch/arm/mach-at91/at91rm9200_devices.c +++ b/arch/arm/mach-at91/at91rm9200_devices.c @@ -83,7 +83,7 @@ void __init at91_add_device_usbh(struct at91_usbh_data *data) {}   *  USB Device (Gadget)   * -------------------------------------------------------------------- */ -#ifdef CONFIG_USB_AT91 +#if defined(CONFIG_USB_AT91) || defined(CONFIG_USB_AT91_MODULE)  static struct at91_udc_data udc_data;  static struct resource udc_resources[] = { diff --git a/arch/arm/mach-at91/at91sam9260_devices.c b/arch/arm/mach-at91/at91sam9260_devices.c index 642ccb6d26b..5a24f0b4554 100644 --- a/arch/arm/mach-at91/at91sam9260_devices.c +++ b/arch/arm/mach-at91/at91sam9260_devices.c @@ -84,7 +84,7 @@ void __init at91_add_device_usbh(struct at91_usbh_data *data) {}   *  USB Device (Gadget)   * -------------------------------------------------------------------- */ -#ifdef CONFIG_USB_AT91 +#if defined(CONFIG_USB_AT91) || defined(CONFIG_USB_AT91_MODULE)  static struct at91_udc_data udc_data;  static struct resource udc_resources[] = { @@ -1215,8 +1215,7 @@ void __init at91_add_device_serial(void) {}   *  CF/IDE   * -------------------------------------------------------------------- */ -#if defined(CONFIG_BLK_DEV_IDE_AT91) || defined(CONFIG_BLK_DEV_IDE_AT91_MODULE) || \ -	defined(CONFIG_PATA_AT91) || defined(CONFIG_PATA_AT91_MODULE) || \ +#if defined(CONFIG_PATA_AT91) || defined(CONFIG_PATA_AT91_MODULE) || \  	defined(CONFIG_AT91_CF) || defined(CONFIG_AT91_CF_MODULE)  static struct at91_cf_data cf0_data; @@ -1313,10 +1312,8 @@ void __init at91_add_device_cf(struct at91_cf_data *data)  	if (data->flags & AT91_CF_TRUE_IDE)  #if defined(CONFIG_PATA_AT91) || defined(CONFIG_PATA_AT91_MODULE)  		pdev->name = "pata_at91"; -#elif defined(CONFIG_BLK_DEV_IDE_AT91) || defined(CONFIG_BLK_DEV_IDE_AT91_MODULE) -		pdev->name = "at91_ide";  #else -#warning "board requires AT91_CF_TRUE_IDE: enable either at91_ide or pata_at91" +#warning "board requires AT91_CF_TRUE_IDE: enable pata_at91"  #endif  	else  		pdev->name = "at91_cf"; diff --git a/arch/arm/mach-at91/at91sam9261_devices.c b/arch/arm/mach-at91/at91sam9261_devices.c index fc59cbdb0e3..1e28bed8f42 100644 --- a/arch/arm/mach-at91/at91sam9261_devices.c +++ b/arch/arm/mach-at91/at91sam9261_devices.c @@ -87,7 +87,7 @@ void __init at91_add_device_usbh(struct at91_usbh_data *data) {}   *  USB Device (Gadget)   * -------------------------------------------------------------------- */ -#ifdef CONFIG_USB_AT91 +#if defined(CONFIG_USB_AT91) || defined(CONFIG_USB_AT91_MODULE)  static struct at91_udc_data udc_data;  static struct resource udc_resources[] = { diff --git a/arch/arm/mach-at91/at91sam9263_devices.c b/arch/arm/mach-at91/at91sam9263_devices.c index 7b46b278702..366a7765635 100644 --- a/arch/arm/mach-at91/at91sam9263_devices.c +++ b/arch/arm/mach-at91/at91sam9263_devices.c @@ -92,7 +92,7 @@ void __init at91_add_device_usbh(struct at91_usbh_data *data) {}   *  USB Device (Gadget)   * -------------------------------------------------------------------- */ -#ifdef CONFIG_USB_AT91 +#if defined(CONFIG_USB_AT91) || defined(CONFIG_USB_AT91_MODULE)  static struct at91_udc_data udc_data;  static struct resource udc_resources[] = { @@ -355,8 +355,8 @@ void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data) {}   *  Compact Flash (PCMCIA or IDE)   * -------------------------------------------------------------------- */ -#if defined(CONFIG_AT91_CF) || defined(CONFIG_AT91_CF_MODULE) || \ -    defined(CONFIG_BLK_DEV_IDE_AT91) || defined(CONFIG_BLK_DEV_IDE_AT91_MODULE) +#if defined(CONFIG_PATA_AT91) || defined(CONFIG_PATA_AT91_MODULE) || \ +	defined(CONFIG_AT91_CF) || defined(CONFIG_AT91_CF_MODULE)  static struct at91_cf_data cf0_data; @@ -450,7 +450,7 @@ void __init at91_add_device_cf(struct at91_cf_data *data)  	at91_set_A_periph(AT91_PIN_PD9, 0);  /* CFCE2 */  	at91_set_A_periph(AT91_PIN_PD14, 0); /* CFNRW */ -	pdev->name = (data->flags & AT91_CF_TRUE_IDE) ? "at91_ide" : "at91_cf"; +	pdev->name = (data->flags & AT91_CF_TRUE_IDE) ? "pata_at91" : "at91_cf";  	platform_device_register(pdev);  }  #else diff --git a/arch/arm/mach-at91/include/mach/at91sam9_smc.h b/arch/arm/mach-at91/include/mach/at91sam9_smc.h index eb18a70fa64..175e1fdd9fe 100644 --- a/arch/arm/mach-at91/include/mach/at91sam9_smc.h +++ b/arch/arm/mach-at91/include/mach/at91sam9_smc.h @@ -18,6 +18,35 @@  #include <mach/cpu.h> +#ifndef __ASSEMBLY__ +struct sam9_smc_config { +	/* Setup register */ +	u8 ncs_read_setup; +	u8 nrd_setup; +	u8 ncs_write_setup; +	u8 nwe_setup; + +	/* Pulse register */ +	u8 ncs_read_pulse; +	u8 nrd_pulse; +	u8 ncs_write_pulse; +	u8 nwe_pulse; + +	/* Cycle register */ +	u16 read_cycle; +	u16 write_cycle; + +	/* Mode register */ +	u32 mode; +	u8 tdf_cycles:4; +}; + +extern void sam9_smc_configure(int id, int cs, struct sam9_smc_config *config); +extern void sam9_smc_read(int id, int cs, struct sam9_smc_config *config); +extern void sam9_smc_read_mode(int id, int cs, struct sam9_smc_config *config); +extern void sam9_smc_write_mode(int id, int cs, struct sam9_smc_config *config); +#endif +  #define AT91_SMC_SETUP		0x00				/* Setup Register for CS n */  #define		AT91_SMC_NWESETUP	(0x3f << 0)			/* NWE Setup Length */  #define			AT91_SMC_NWESETUP_(x)	((x) << 0) diff --git a/arch/arm/mach-at91/sam9_smc.c b/arch/arm/mach-at91/sam9_smc.c index 8294783b679..99a0a1d2b7d 100644 --- a/arch/arm/mach-at91/sam9_smc.c +++ b/arch/arm/mach-at91/sam9_smc.c @@ -2,6 +2,7 @@   * linux/arch/arm/mach-at91/sam9_smc.c   *   * Copyright (C) 2008 Andrew Victor + * Copyright (C) 2011 Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>   *   * This program is free software; you can redistribute it and/or modify   * it under the terms of the GNU General Public License version 2 as @@ -22,7 +23,22 @@  static void __iomem *smc_base_addr[2]; -static void __init sam9_smc_cs_configure(void __iomem *base, struct sam9_smc_config* config) +static void sam9_smc_cs_write_mode(void __iomem *base, +					struct sam9_smc_config *config) +{ +	__raw_writel(config->mode +		   | AT91_SMC_TDF_(config->tdf_cycles), +		   base + AT91_SMC_MODE); +} + +void sam9_smc_write_mode(int id, int cs, +					struct sam9_smc_config *config) +{ +	sam9_smc_cs_write_mode(AT91_SMC_CS(id, cs), config); +} + +static void sam9_smc_cs_configure(void __iomem *base, +					struct sam9_smc_config *config)  {  	/* Setup register */ @@ -45,16 +61,66 @@ static void __init sam9_smc_cs_configure(void __iomem *base, struct sam9_smc_con  		   base + AT91_SMC_CYCLE);  	/* Mode register */ -	__raw_writel(config->mode -		   | AT91_SMC_TDF_(config->tdf_cycles), -		   base + AT91_SMC_MODE); +	sam9_smc_cs_write_mode(base, config);  } -void __init sam9_smc_configure(int id, int cs, struct sam9_smc_config* config) +void sam9_smc_configure(int id, int cs, +					struct sam9_smc_config *config)  {  	sam9_smc_cs_configure(AT91_SMC_CS(id, cs), config);  } +static void sam9_smc_cs_read_mode(void __iomem *base, +					struct sam9_smc_config *config) +{ +	u32 val = __raw_readl(base + AT91_SMC_MODE); + +	config->mode = (val & ~AT91_SMC_NWECYCLE); +	config->tdf_cycles = (val & AT91_SMC_NWECYCLE) >> 16 ; +} + +void sam9_smc_read_mode(int id, int cs, +					struct sam9_smc_config *config) +{ +	sam9_smc_cs_read_mode(AT91_SMC_CS(id, cs), config); +} + +static void sam9_smc_cs_read(void __iomem *base, +					struct sam9_smc_config *config) +{ +	u32 val; + +	/* Setup register */ +	val = __raw_readl(base + AT91_SMC_SETUP); + +	config->nwe_setup = val & AT91_SMC_NWESETUP; +	config->ncs_write_setup = (val & AT91_SMC_NCS_WRSETUP) >> 8; +	config->nrd_setup = (val & AT91_SMC_NRDSETUP) >> 16; +	config->ncs_read_setup = (val & AT91_SMC_NCS_RDSETUP) >> 24; + +	/* Pulse register */ +	val = __raw_readl(base + AT91_SMC_PULSE); + +	config->nwe_setup = val & AT91_SMC_NWEPULSE; +	config->ncs_write_pulse = (val & AT91_SMC_NCS_WRPULSE) >> 8; +	config->nrd_pulse = (val & AT91_SMC_NRDPULSE) >> 16; +	config->ncs_read_pulse = (val & AT91_SMC_NCS_RDPULSE) >> 24; + +	/* Cycle register */ +	val = __raw_readl(base + AT91_SMC_CYCLE); + +	config->write_cycle = val & AT91_SMC_NWECYCLE; +	config->read_cycle = (val & AT91_SMC_NRDCYCLE) >> 16; + +	/* Mode register */ +	sam9_smc_cs_read_mode(base, config); +} + +void sam9_smc_read(int id, int cs, struct sam9_smc_config *config) +{ +	sam9_smc_cs_read(AT91_SMC_CS(id, cs), config); +} +  void __init at91sam9_ioremap_smc(int id, u32 addr)  {  	if (id > 1) { diff --git a/arch/arm/mach-at91/sam9_smc.h b/arch/arm/mach-at91/sam9_smc.h index 039c5ce17ae..3e52dcd4a59 100644 --- a/arch/arm/mach-at91/sam9_smc.h +++ b/arch/arm/mach-at91/sam9_smc.h @@ -8,27 +8,4 @@   * published by the Free Software Foundation.   */ -struct sam9_smc_config { -	/* Setup register */ -	u8 ncs_read_setup; -	u8 nrd_setup; -	u8 ncs_write_setup; -	u8 nwe_setup; - -	/* Pulse register */ -	u8 ncs_read_pulse; -	u8 nrd_pulse; -	u8 ncs_write_pulse; -	u8 nwe_pulse; - -	/* Cycle register */ -	u16 read_cycle; -	u16 write_cycle; - -	/* Mode register */ -	u32 mode; -	u8 tdf_cycles:4; -}; - -extern void __init sam9_smc_configure(int id, int cs, struct sam9_smc_config* config);  extern void __init at91sam9_ioremap_smc(int id, u32 addr); diff --git a/arch/arm/mach-dove/common.c b/arch/arm/mach-dove/common.c index dd1429ae640..bda7aca04ca 100644 --- a/arch/arm/mach-dove/common.c +++ b/arch/arm/mach-dove/common.c @@ -28,6 +28,7 @@  #include <asm/mach/arch.h>  #include <linux/irq.h>  #include <plat/time.h> +#include <plat/ehci-orion.h>  #include <plat/common.h>  #include <plat/addr-map.h>  #include "common.h" @@ -71,7 +72,7 @@ void __init dove_map_io(void)   ****************************************************************************/  void __init dove_ehci0_init(void)  { -	orion_ehci_init(DOVE_USB0_PHYS_BASE, IRQ_DOVE_USB0); +	orion_ehci_init(DOVE_USB0_PHYS_BASE, IRQ_DOVE_USB0, EHCI_PHY_NA);  }  /***************************************************************************** diff --git a/arch/arm/mach-ep93xx/vision_ep9307.c b/arch/arm/mach-ep93xx/vision_ep9307.c index 03dd4012043..d5fb44f16d3 100644 --- a/arch/arm/mach-ep93xx/vision_ep9307.c +++ b/arch/arm/mach-ep93xx/vision_ep9307.c @@ -32,6 +32,7 @@  #include <mach/hardware.h>  #include <mach/fb.h>  #include <mach/ep93xx_spi.h> +#include <mach/gpio-ep93xx.h>  #include <asm/mach-types.h>  #include <asm/mach/map.h> @@ -153,7 +154,6 @@ static struct i2c_board_info vision_i2c_info[] __initdata = {  	}, {  		I2C_BOARD_INFO("pca9539", 0x74),  		.platform_data	= &pca953x_74_gpio_data, -		.irq		= gpio_to_irq(EP93XX_GPIO_LINE_F(7)),  	}, {  		I2C_BOARD_INFO("pca9539", 0x75),  		.platform_data	= &pca953x_75_gpio_data, @@ -348,6 +348,8 @@ static void __init vision_init_machine(void)  				"pca9539:74"))  		pr_warn("cannot request interrupt gpio for pca9539:74\n"); +	vision_i2c_info[1].irq = gpio_to_irq(EP93XX_GPIO_LINE_F(7)); +  	ep93xx_register_i2c(&vision_i2c_gpio_data, vision_i2c_info,  				ARRAY_SIZE(vision_i2c_info));  	ep93xx_register_spi(&vision_spi_master, vision_spi_board_info, diff --git a/arch/arm/mach-exynos/clock-exynos4210.c b/arch/arm/mach-exynos/clock-exynos4210.c index a5823a7f249..13312ccb2d9 100644 --- a/arch/arm/mach-exynos/clock-exynos4210.c +++ b/arch/arm/mach-exynos/clock-exynos4210.c @@ -32,6 +32,7 @@  #include "common.h" +#ifdef CONFIG_PM_SLEEP  static struct sleep_save exynos4210_clock_save[] = {  	SAVE_ITEM(S5P_CLKSRC_IMAGE),  	SAVE_ITEM(S5P_CLKSRC_LCD1), @@ -42,6 +43,7 @@ static struct sleep_save exynos4210_clock_save[] = {  	SAVE_ITEM(S5P_CLKGATE_IP_LCD1),  	SAVE_ITEM(S5P_CLKGATE_IP_PERIR_4210),  }; +#endif  static struct clksrc_clk *sysclks[] = {  	/* nothing here yet */ diff --git a/arch/arm/mach-exynos/clock-exynos4212.c b/arch/arm/mach-exynos/clock-exynos4212.c index 26a668b0d10..48af28566fa 100644 --- a/arch/arm/mach-exynos/clock-exynos4212.c +++ b/arch/arm/mach-exynos/clock-exynos4212.c @@ -32,12 +32,14 @@  #include "common.h" +#ifdef CONFIG_PM_SLEEP  static struct sleep_save exynos4212_clock_save[] = {  	SAVE_ITEM(S5P_CLKSRC_IMAGE),  	SAVE_ITEM(S5P_CLKDIV_IMAGE),  	SAVE_ITEM(S5P_CLKGATE_IP_IMAGE_4212),  	SAVE_ITEM(S5P_CLKGATE_IP_PERIR_4212),  }; +#endif  static struct clk *clk_src_mpll_user_list[] = {  	[0] = &clk_fin_mpll, diff --git a/arch/arm/mach-exynos/clock.c b/arch/arm/mach-exynos/clock.c index 5a8c42e9000..187287aa57a 100644 --- a/arch/arm/mach-exynos/clock.c +++ b/arch/arm/mach-exynos/clock.c @@ -30,6 +30,7 @@  #include "common.h" +#ifdef CONFIG_PM_SLEEP  static struct sleep_save exynos4_clock_save[] = {  	SAVE_ITEM(S5P_CLKDIV_LEFTBUS),  	SAVE_ITEM(S5P_CLKGATE_IP_LEFTBUS), @@ -93,6 +94,7 @@ static struct sleep_save exynos4_clock_save[] = {  	SAVE_ITEM(S5P_CLKGATE_SCLKCPU),  	SAVE_ITEM(S5P_CLKGATE_IP_CPU),  }; +#endif  struct clk clk_sclk_hdmi27m = {  	.name		= "sclk_hdmi27m", diff --git a/arch/arm/mach-exynos/mach-exynos4-dt.c b/arch/arm/mach-exynos/mach-exynos4-dt.c index 85fa02767d6..e6b02fdf1b0 100644 --- a/arch/arm/mach-exynos/mach-exynos4-dt.c +++ b/arch/arm/mach-exynos/mach-exynos4-dt.c @@ -15,11 +15,13 @@  #include <linux/serial_core.h>  #include <asm/mach/arch.h> +#include <asm/hardware/gic.h>  #include <mach/map.h>  #include <plat/cpu.h>  #include <plat/regs-serial.h> -#include <plat/exynos4.h> + +#include "common.h"  /*   * The following lookup table is used to override device names when devices @@ -60,7 +62,7 @@ static const struct of_dev_auxdata exynos4210_auxdata_lookup[] __initconst = {  static void __init exynos4210_dt_map_io(void)  { -	s5p_init_io(NULL, 0, S5P_VA_CHIPID); +	exynos_init_io(NULL, 0);  	s3c24xx_init_clocks(24000000);  } @@ -79,7 +81,9 @@ DT_MACHINE_START(EXYNOS4210_DT, "Samsung Exynos4 (Flattened Device Tree)")  	/* Maintainer: Thomas Abraham <thomas.abraham@linaro.org> */  	.init_irq	= exynos4_init_irq,  	.map_io		= exynos4210_dt_map_io, +	.handle_irq	= gic_handle_irq,  	.init_machine	= exynos4210_dt_machine_init,  	.timer		= &exynos4_timer,  	.dt_compat	= exynos4210_dt_compat, +	.restart        = exynos4_restart,  MACHINE_END diff --git a/arch/arm/mach-exynos/mach-nuri.c b/arch/arm/mach-exynos/mach-nuri.c index b895ec03110..435261f83f4 100644 --- a/arch/arm/mach-exynos/mach-nuri.c +++ b/arch/arm/mach-exynos/mach-nuri.c @@ -220,14 +220,14 @@ static struct s3c_fb_pd_win nuri_fb_win0 = {  		.lower_margin	= 1,  		.hsync_len	= 48,  		.vsync_len	= 3, -		.xres		= 1280, -		.yres		= 800, +		.xres		= 1024, +		.yres		= 600,  		.refresh	= 60,  	},  	.max_bpp	= 24,  	.default_bpp	= 16, -	.virtual_x	= 1280, -	.virtual_y	= 800, +	.virtual_x	= 1024, +	.virtual_y	= 2 * 600,  };  static struct s3c_fb_platdata nuri_fb_pdata __initdata = { diff --git a/arch/arm/mach-exynos/mach-universal_c210.c b/arch/arm/mach-exynos/mach-universal_c210.c index 37ac93e8d6d..0fc65ffde8f 100644 --- a/arch/arm/mach-exynos/mach-universal_c210.c +++ b/arch/arm/mach-exynos/mach-universal_c210.c @@ -910,7 +910,7 @@ static struct s5p_fimc_isp_info universal_camera_sensors[] = {  		.bus_type	= FIMC_MIPI_CSI2,  		.board_info	= &m5mols_board_info,  		.i2c_bus_num	= 0, -		.clk_frequency	= 21600000UL, +		.clk_frequency	= 24000000UL,  		.csi_data_align	= 32,  	},  }; diff --git a/arch/arm/mach-exynos/pm.c b/arch/arm/mach-exynos/pm.c index a4f61a43c7b..e1901305177 100644 --- a/arch/arm/mach-exynos/pm.c +++ b/arch/arm/mach-exynos/pm.c @@ -206,7 +206,7 @@ static void exynos4_pm_prepare(void)  } -static int exynos4_pm_add(struct device *dev) +static int exynos4_pm_add(struct device *dev, struct subsys_interface *sif)  {  	pm_cpu_prep = exynos4_pm_prepare;  	pm_cpu_sleep = exynos4_cpu_suspend; @@ -384,7 +384,9 @@ static void exynos4_pm_resume(void)  	exynos4_restore_pll(); +#ifdef CONFIG_SMP  	scu_enable(S5P_VA_SCU); +#endif  #ifdef CONFIG_CACHE_L2X0  	s3c_pm_do_restore_core(exynos4_l2cc_save, ARRAY_SIZE(exynos4_l2cc_save)); diff --git a/arch/arm/mach-kirkwood/common.c b/arch/arm/mach-kirkwood/common.c index cc15426787b..77d4852e19f 100644 --- a/arch/arm/mach-kirkwood/common.c +++ b/arch/arm/mach-kirkwood/common.c @@ -27,6 +27,7 @@  #include <plat/cache-feroceon-l2.h>  #include <plat/mvsdio.h>  #include <plat/orion_nand.h> +#include <plat/ehci-orion.h>  #include <plat/common.h>  #include <plat/time.h>  #include <plat/addr-map.h> @@ -73,7 +74,7 @@ unsigned int kirkwood_clk_ctrl = CGC_DUNIT | CGC_RESERVED;  void __init kirkwood_ehci_init(void)  {  	kirkwood_clk_ctrl |= CGC_USB0; -	orion_ehci_init(USB_PHYS_BASE, IRQ_KIRKWOOD_USB); +	orion_ehci_init(USB_PHYS_BASE, IRQ_KIRKWOOD_USB, EHCI_PHY_NA);  } diff --git a/arch/arm/mach-kirkwood/mpp.h b/arch/arm/mach-kirkwood/mpp.h index e8fda45c073..d5a0d1da2e0 100644 --- a/arch/arm/mach-kirkwood/mpp.h +++ b/arch/arm/mach-kirkwood/mpp.h @@ -31,314 +31,314 @@  #define MPP_F6282_MASK		MPP(  0, 0x0, 0, 0, 0,   0,   0,   0,   1 )  #define MPP0_GPIO		MPP(  0, 0x0, 1, 1, 1,   1,   1,   1,   1 ) -#define MPP0_NF_IO2		MPP(  0, 0x1, 1, 1, 1,   1,   1,   1,   1 ) -#define MPP0_SPI_SCn		MPP(  0, 0x2, 0, 1, 1,   1,   1,   1,   1 ) +#define MPP0_NF_IO2		MPP(  0, 0x1, 0, 0, 1,   1,   1,   1,   1 ) +#define MPP0_SPI_SCn		MPP(  0, 0x2, 0, 0, 1,   1,   1,   1,   1 )  #define MPP1_GPO		MPP(  1, 0x0, 0, 1, 1,   1,   1,   1,   1 ) -#define MPP1_NF_IO3		MPP(  1, 0x1, 1, 1, 1,   1,   1,   1,   1 ) -#define MPP1_SPI_MOSI		MPP(  1, 0x2, 0, 1, 1,   1,   1,   1,   1 ) +#define MPP1_NF_IO3		MPP(  1, 0x1, 0, 0, 1,   1,   1,   1,   1 ) +#define MPP1_SPI_MOSI		MPP(  1, 0x2, 0, 0, 1,   1,   1,   1,   1 )  #define MPP2_GPO		MPP(  2, 0x0, 0, 1, 1,   1,   1,   1,   1 ) -#define MPP2_NF_IO4		MPP(  2, 0x1, 1, 1, 1,   1,   1,   1,   1 ) -#define MPP2_SPI_SCK		MPP(  2, 0x2, 0, 1, 1,   1,   1,   1,   1 ) +#define MPP2_NF_IO4		MPP(  2, 0x1, 0, 0, 1,   1,   1,   1,   1 ) +#define MPP2_SPI_SCK		MPP(  2, 0x2, 0, 0, 1,   1,   1,   1,   1 )  #define MPP3_GPO		MPP(  3, 0x0, 0, 1, 1,   1,   1,   1,   1 ) -#define MPP3_NF_IO5		MPP(  3, 0x1, 1, 1, 1,   1,   1,   1,   1 ) -#define MPP3_SPI_MISO		MPP(  3, 0x2, 1, 0, 1,   1,   1,   1,   1 ) +#define MPP3_NF_IO5		MPP(  3, 0x1, 0, 0, 1,   1,   1,   1,   1 ) +#define MPP3_SPI_MISO		MPP(  3, 0x2, 0, 0, 1,   1,   1,   1,   1 )  #define MPP4_GPIO		MPP(  4, 0x0, 1, 1, 1,   1,   1,   1,   1 ) -#define MPP4_NF_IO6		MPP(  4, 0x1, 1, 1, 1,   1,   1,   1,   1 ) -#define MPP4_UART0_RXD		MPP(  4, 0x2, 1, 0, 1,   1,   1,   1,   1 ) -#define MPP4_SATA1_ACTn		MPP(  4, 0x5, 0, 1, 0,   0,   1,   1,   1 ) +#define MPP4_NF_IO6		MPP(  4, 0x1, 0, 0, 1,   1,   1,   1,   1 ) +#define MPP4_UART0_RXD		MPP(  4, 0x2, 0, 0, 1,   1,   1,   1,   1 ) +#define MPP4_SATA1_ACTn		MPP(  4, 0x5, 0, 0, 0,   0,   1,   1,   1 )  #define MPP4_LCD_VGA_HSYNC	MPP(  4, 0xb, 0, 0, 0,   0,   0,   0,   1 ) -#define MPP4_PTP_CLK		MPP(  4, 0xd, 1, 0, 1,   1,   1,   1,   0 ) +#define MPP4_PTP_CLK		MPP(  4, 0xd, 0, 0, 1,   1,   1,   1,   0 )  #define MPP5_GPO		MPP(  5, 0x0, 0, 1, 1,   1,   1,   1,   1 ) -#define MPP5_NF_IO7		MPP(  5, 0x1, 1, 1, 1,   1,   1,   1,   1 ) -#define MPP5_UART0_TXD		MPP(  5, 0x2, 0, 1, 1,   1,   1,   1,   1 ) -#define MPP5_PTP_TRIG_GEN	MPP(  5, 0x4, 0, 1, 1,   1,   1,   1,   0 ) -#define MPP5_SATA0_ACTn		MPP(  5, 0x5, 0, 1, 0,   1,   1,   1,   1 ) +#define MPP5_NF_IO7		MPP(  5, 0x1, 0, 0, 1,   1,   1,   1,   1 ) +#define MPP5_UART0_TXD		MPP(  5, 0x2, 0, 0, 1,   1,   1,   1,   1 ) +#define MPP5_PTP_TRIG_GEN	MPP(  5, 0x4, 0, 0, 1,   1,   1,   1,   0 ) +#define MPP5_SATA0_ACTn		MPP(  5, 0x5, 0, 0, 0,   1,   1,   1,   1 )  #define MPP5_LCD_VGA_VSYNC	MPP(  5, 0xb, 0, 0, 0,   0,   0,   0,   1 ) -#define MPP6_SYSRST_OUTn	MPP(  6, 0x1, 0, 1, 1,   1,   1,   1,   1 ) -#define MPP6_SPI_MOSI		MPP(  6, 0x2, 0, 1, 1,   1,   1,   1,   1 ) -#define MPP6_PTP_TRIG_GEN	MPP(  6, 0x3, 0, 1, 1,   1,   1,   1,   0 ) +#define MPP6_SYSRST_OUTn	MPP(  6, 0x1, 0, 0, 1,   1,   1,   1,   1 ) +#define MPP6_SPI_MOSI		MPP(  6, 0x2, 0, 0, 1,   1,   1,   1,   1 ) +#define MPP6_PTP_TRIG_GEN	MPP(  6, 0x3, 0, 0, 1,   1,   1,   1,   0 )  #define MPP7_GPO		MPP(  7, 0x0, 0, 1, 1,   1,   1,   1,   1 ) -#define MPP7_PEX_RST_OUTn	MPP(  7, 0x1, 0, 1, 1,   1,   1,   1,   0 ) -#define MPP7_SPI_SCn		MPP(  7, 0x2, 0, 1, 1,   1,   1,   1,   1 ) -#define MPP7_PTP_TRIG_GEN	MPP(  7, 0x3, 0, 1, 1,   1,   1,   1,   0 ) -#define MPP7_LCD_PWM		MPP(  7, 0xb, 0, 1, 0,   0,   0,   0,   1 ) +#define MPP7_PEX_RST_OUTn	MPP(  7, 0x1, 0, 0, 1,   1,   1,   1,   0 ) +#define MPP7_SPI_SCn		MPP(  7, 0x2, 0, 0, 1,   1,   1,   1,   1 ) +#define MPP7_PTP_TRIG_GEN	MPP(  7, 0x3, 0, 0, 1,   1,   1,   1,   0 ) +#define MPP7_LCD_PWM		MPP(  7, 0xb, 0, 0, 0,   0,   0,   0,   1 )  #define MPP8_GPIO		MPP(  8, 0x0, 1, 1, 1,   1,   1,   1,   1 ) -#define MPP8_TW0_SDA		MPP(  8, 0x1, 1, 1, 1,   1,   1,   1,   1 ) -#define MPP8_UART0_RTS		MPP(  8, 0x2, 0, 1, 1,   1,   1,   1,   1 ) -#define MPP8_UART1_RTS		MPP(  8, 0x3, 0, 1, 1,   1,   1,   1,   1 ) -#define MPP8_MII0_RXERR		MPP(  8, 0x4, 1, 0, 0,   1,   1,   1,   1 ) -#define MPP8_SATA1_PRESENTn	MPP(  8, 0x5, 0, 1, 0,   0,   1,   1,   1 ) -#define MPP8_PTP_CLK		MPP(  8, 0xc, 1, 0, 1,   1,   1,   1,   0 ) -#define MPP8_MII0_COL		MPP(  8, 0xd, 1, 0, 1,   1,   1,   1,   1 ) +#define MPP8_TW0_SDA		MPP(  8, 0x1, 0, 0, 1,   1,   1,   1,   1 ) +#define MPP8_UART0_RTS		MPP(  8, 0x2, 0, 0, 1,   1,   1,   1,   1 ) +#define MPP8_UART1_RTS		MPP(  8, 0x3, 0, 0, 1,   1,   1,   1,   1 ) +#define MPP8_MII0_RXERR		MPP(  8, 0x4, 0, 0, 0,   1,   1,   1,   1 ) +#define MPP8_SATA1_PRESENTn	MPP(  8, 0x5, 0, 0, 0,   0,   1,   1,   1 ) +#define MPP8_PTP_CLK		MPP(  8, 0xc, 0, 0, 1,   1,   1,   1,   0 ) +#define MPP8_MII0_COL		MPP(  8, 0xd, 0, 0, 1,   1,   1,   1,   1 )  #define MPP9_GPIO		MPP(  9, 0x0, 1, 1, 1,   1,   1,   1,   1 ) -#define MPP9_TW0_SCK		MPP(  9, 0x1, 1, 1, 1,   1,   1,   1,   1 ) -#define MPP9_UART0_CTS		MPP(  9, 0x2, 1, 0, 1,   1,   1,   1,   1 ) -#define MPP9_UART1_CTS		MPP(  9, 0x3, 1, 0, 1,   1,   1,   1,   1 ) -#define MPP9_SATA0_PRESENTn	MPP(  9, 0x5, 0, 1, 0,   1,   1,   1,   1 ) -#define MPP9_PTP_EVENT_REQ	MPP(  9, 0xc, 1, 0, 1,   1,   1,   1,   0 ) -#define MPP9_MII0_CRS		MPP(  9, 0xd, 1, 0, 1,   1,   1,   1,   1 ) +#define MPP9_TW0_SCK		MPP(  9, 0x1, 0, 0, 1,   1,   1,   1,   1 ) +#define MPP9_UART0_CTS		MPP(  9, 0x2, 0, 0, 1,   1,   1,   1,   1 ) +#define MPP9_UART1_CTS		MPP(  9, 0x3, 0, 0, 1,   1,   1,   1,   1 ) +#define MPP9_SATA0_PRESENTn	MPP(  9, 0x5, 0, 0, 0,   1,   1,   1,   1 ) +#define MPP9_PTP_EVENT_REQ	MPP(  9, 0xc, 0, 0, 1,   1,   1,   1,   0 ) +#define MPP9_MII0_CRS		MPP(  9, 0xd, 0, 0, 1,   1,   1,   1,   1 )  #define MPP10_GPO		MPP( 10, 0x0, 0, 1, 1,   1,   1,   1,   1 ) -#define MPP10_SPI_SCK		MPP( 10, 0x2, 0, 1, 1,   1,   1,   1,   1 ) -#define MPP10_UART0_TXD		MPP( 10, 0X3, 0, 1, 1,   1,   1,   1,   1 ) -#define MPP10_SATA1_ACTn	MPP( 10, 0x5, 0, 1, 0,   0,   1,   1,   1 ) -#define MPP10_PTP_TRIG_GEN	MPP( 10, 0xc, 0, 1, 1,   1,   1,   1,   0 ) +#define MPP10_SPI_SCK		MPP( 10, 0x2, 0, 0, 1,   1,   1,   1,   1 ) +#define MPP10_UART0_TXD		MPP( 10, 0X3, 0, 0, 1,   1,   1,   1,   1 ) +#define MPP10_SATA1_ACTn	MPP( 10, 0x5, 0, 0, 0,   0,   1,   1,   1 ) +#define MPP10_PTP_TRIG_GEN	MPP( 10, 0xc, 0, 0, 1,   1,   1,   1,   0 )  #define MPP11_GPIO		MPP( 11, 0x0, 1, 1, 1,   1,   1,   1,   1 ) -#define MPP11_SPI_MISO		MPP( 11, 0x2, 1, 0, 1,   1,   1,   1,   1 ) -#define MPP11_UART0_RXD		MPP( 11, 0x3, 1, 0, 1,   1,   1,   1,   1 ) -#define MPP11_PTP_EVENT_REQ	MPP( 11, 0x4, 1, 0, 1,   1,   1,   1,   0 ) -#define MPP11_PTP_TRIG_GEN	MPP( 11, 0xc, 0, 1, 1,   1,   1,   1,   0 ) -#define MPP11_PTP_CLK		MPP( 11, 0xd, 1, 0, 1,   1,   1,   1,   0 ) -#define MPP11_SATA0_ACTn	MPP( 11, 0x5, 0, 1, 0,   1,   1,   1,   1 ) +#define MPP11_SPI_MISO		MPP( 11, 0x2, 0, 0, 1,   1,   1,   1,   1 ) +#define MPP11_UART0_RXD		MPP( 11, 0x3, 0, 0, 1,   1,   1,   1,   1 ) +#define MPP11_PTP_EVENT_REQ	MPP( 11, 0x4, 0, 0, 1,   1,   1,   1,   0 ) +#define MPP11_PTP_TRIG_GEN	MPP( 11, 0xc, 0, 0, 1,   1,   1,   1,   0 ) +#define MPP11_PTP_CLK		MPP( 11, 0xd, 0, 0, 1,   1,   1,   1,   0 ) +#define MPP11_SATA0_ACTn	MPP( 11, 0x5, 0, 0, 0,   1,   1,   1,   1 )  #define MPP12_GPO		MPP( 12, 0x0, 0, 1, 1,   1,   1,   1,   1 )  #define MPP12_GPIO		MPP( 12, 0x0, 1, 1, 0,   0,   0,   1,   0 ) -#define MPP12_SD_CLK		MPP( 12, 0x1, 0, 1, 1,   1,   1,   1,   1 ) -#define MPP12_AU_SPDIF0		MPP( 12, 0xa, 0, 1, 0,   0,   0,   0,   1 ) -#define MPP12_SPI_MOSI		MPP( 12, 0xb, 0, 1, 0,   0,   0,   0,   1 ) -#define MPP12_TW1_SDA		MPP( 12, 0xd, 1, 0, 0,   0,   0,   0,   1 ) +#define MPP12_SD_CLK		MPP( 12, 0x1, 0, 0, 1,   1,   1,   1,   1 ) +#define MPP12_AU_SPDIF0		MPP( 12, 0xa, 0, 0, 0,   0,   0,   0,   1 ) +#define MPP12_SPI_MOSI		MPP( 12, 0xb, 0, 0, 0,   0,   0,   0,   1 ) +#define MPP12_TW1_SDA		MPP( 12, 0xd, 0, 0, 0,   0,   0,   0,   1 )  #define MPP13_GPIO		MPP( 13, 0x0, 1, 1, 1,   1,   1,   1,   1 ) -#define MPP13_SD_CMD		MPP( 13, 0x1, 1, 1, 1,   1,   1,   1,   1 ) -#define MPP13_UART1_TXD		MPP( 13, 0x3, 0, 1, 1,   1,   1,   1,   1 ) -#define MPP13_AU_SPDIFRMCLK	MPP( 13, 0xa, 0, 1, 0,   0,   0,   0,   1 ) -#define MPP13_LCDPWM		MPP( 13, 0xb, 0, 1, 0,   0,   0,   0,   1 ) +#define MPP13_SD_CMD		MPP( 13, 0x1, 0, 0, 1,   1,   1,   1,   1 ) +#define MPP13_UART1_TXD		MPP( 13, 0x3, 0, 0, 1,   1,   1,   1,   1 ) +#define MPP13_AU_SPDIFRMCLK	MPP( 13, 0xa, 0, 0, 0,   0,   0,   0,   1 ) +#define MPP13_LCDPWM		MPP( 13, 0xb, 0, 0, 0,   0,   0,   0,   1 )  #define MPP14_GPIO		MPP( 14, 0x0, 1, 1, 1,   1,   1,   1,   1 ) -#define MPP14_SD_D0		MPP( 14, 0x1, 1, 1, 1,   1,   1,   1,   1 ) -#define MPP14_UART1_RXD		MPP( 14, 0x3, 1, 0, 1,   1,   1,   1,   1 ) -#define MPP14_SATA1_PRESENTn	MPP( 14, 0x4, 0, 1, 0,   0,   1,   1,   1 ) -#define MPP14_AU_SPDIFI		MPP( 14, 0xa, 1, 0, 0,   0,   0,   0,   1 ) -#define MPP14_AU_I2SDI		MPP( 14, 0xb, 1, 0, 0,   0,   0,   0,   1 ) -#define MPP14_MII0_COL		MPP( 14, 0xd, 1, 0, 1,   1,   1,   1,   1 ) +#define MPP14_SD_D0		MPP( 14, 0x1, 0, 0, 1,   1,   1,   1,   1 ) +#define MPP14_UART1_RXD		MPP( 14, 0x3, 0, 0, 1,   1,   1,   1,   1 ) +#define MPP14_SATA1_PRESENTn	MPP( 14, 0x4, 0, 0, 0,   0,   1,   1,   1 ) +#define MPP14_AU_SPDIFI		MPP( 14, 0xa, 0, 0, 0,   0,   0,   0,   1 ) +#define MPP14_AU_I2SDI		MPP( 14, 0xb, 0, 0, 0,   0,   0,   0,   1 ) +#define MPP14_MII0_COL		MPP( 14, 0xd, 0, 0, 1,   1,   1,   1,   1 )  #define MPP15_GPIO		MPP( 15, 0x0, 1, 1, 1,   1,   1,   1,   1 ) -#define MPP15_SD_D1		MPP( 15, 0x1, 1, 1, 1,   1,   1,   1,   1 ) -#define MPP15_UART0_RTS		MPP( 15, 0x2, 0, 1, 1,   1,   1,   1,   1 ) -#define MPP15_UART1_TXD		MPP( 15, 0x3, 0, 1, 1,   1,   1,   1,   1 ) -#define MPP15_SATA0_ACTn	MPP( 15, 0x4, 0, 1, 0,   1,   1,   1,   1 ) -#define MPP15_SPI_CSn		MPP( 15, 0xb, 0, 1, 0,   0,   0,   0,   1 ) +#define MPP15_SD_D1		MPP( 15, 0x1, 0, 0, 1,   1,   1,   1,   1 ) +#define MPP15_UART0_RTS		MPP( 15, 0x2, 0, 0, 1,   1,   1,   1,   1 ) +#define MPP15_UART1_TXD		MPP( 15, 0x3, 0, 0, 1,   1,   1,   1,   1 ) +#define MPP15_SATA0_ACTn	MPP( 15, 0x4, 0, 0, 0,   1,   1,   1,   1 ) +#define MPP15_SPI_CSn		MPP( 15, 0xb, 0, 0, 0,   0,   0,   0,   1 )  #define MPP16_GPIO		MPP( 16, 0x0, 1, 1, 1,   1,   1,   1,   1 ) -#define MPP16_SD_D2		MPP( 16, 0x1, 1, 1, 1,   1,   1,   1,   1 ) -#define MPP16_UART0_CTS		MPP( 16, 0x2, 1, 0, 1,   1,   1,   1,   1 ) -#define MPP16_UART1_RXD		MPP( 16, 0x3, 1, 0, 1,   1,   1,   1,   1 ) -#define MPP16_SATA1_ACTn	MPP( 16, 0x4, 0, 1, 0,   0,   1,   1,   1 ) -#define MPP16_LCD_EXT_REF_CLK	MPP( 16, 0xb, 1, 0, 0,   0,   0,   0,   1 ) -#define MPP16_MII0_CRS		MPP( 16, 0xd, 1, 0, 1,   1,   1,   1,   1 ) +#define MPP16_SD_D2		MPP( 16, 0x1, 0, 0, 1,   1,   1,   1,   1 ) +#define MPP16_UART0_CTS		MPP( 16, 0x2, 0, 0, 1,   1,   1,   1,   1 ) +#define MPP16_UART1_RXD		MPP( 16, 0x3, 0, 0, 1,   1,   1,   1,   1 ) +#define MPP16_SATA1_ACTn	MPP( 16, 0x4, 0, 0, 0,   0,   1,   1,   1 ) +#define MPP16_LCD_EXT_REF_CLK	MPP( 16, 0xb, 0, 0, 0,   0,   0,   0,   1 ) +#define MPP16_MII0_CRS		MPP( 16, 0xd, 0, 0, 1,   1,   1,   1,   1 )  #define MPP17_GPIO		MPP( 17, 0x0, 1, 1, 1,   1,   1,   1,   1 ) -#define MPP17_SD_D3		MPP( 17, 0x1, 1, 1, 1,   1,   1,   1,   1 ) -#define MPP17_SATA0_PRESENTn	MPP( 17, 0x4, 0, 1, 0,   1,   1,   1,   1 ) -#define MPP17_SATA1_ACTn	MPP( 17, 0xa, 0, 1, 0,   0,   0,   0,   1 ) -#define MPP17_TW1_SCK		MPP( 17, 0xd, 1, 1, 0,   0,   0,   0,   1 ) +#define MPP17_SD_D3		MPP( 17, 0x1, 0, 0, 1,   1,   1,   1,   1 ) +#define MPP17_SATA0_PRESENTn	MPP( 17, 0x4, 0, 0, 0,   1,   1,   1,   1 ) +#define MPP17_SATA1_ACTn	MPP( 17, 0xa, 0, 0, 0,   0,   0,   0,   1 ) +#define MPP17_TW1_SCK		MPP( 17, 0xd, 0, 0, 0,   0,   0,   0,   1 )  #define MPP18_GPO		MPP( 18, 0x0, 0, 1, 1,   1,   1,   1,   1 ) -#define MPP18_NF_IO0		MPP( 18, 0x1, 1, 1, 1,   1,   1,   1,   1 ) -#define MPP18_PEX0_CLKREQ	MPP( 18, 0x2, 0, 1, 0,   0,   0,   0,   1 ) +#define MPP18_NF_IO0		MPP( 18, 0x1, 0, 0, 1,   1,   1,   1,   1 ) +#define MPP18_PEX0_CLKREQ	MPP( 18, 0x2, 0, 0, 0,   0,   0,   0,   1 )  #define MPP19_GPO		MPP( 19, 0x0, 0, 1, 1,   1,   1,   1,   1 ) -#define MPP19_NF_IO1		MPP( 19, 0x1, 1, 1, 1,   1,   1,   1,   1 ) +#define MPP19_NF_IO1		MPP( 19, 0x1, 0, 0, 1,   1,   1,   1,   1 )  #define MPP20_GPIO		MPP( 20, 0x0, 1, 1, 0,   1,   1,   1,   1 ) -#define MPP20_TSMP0		MPP( 20, 0x1, 1, 1, 0,   0,   1,   1,   1 ) -#define MPP20_TDM_CH0_TX_QL	MPP( 20, 0x2, 0, 1, 0,   0,   1,   1,   1 ) +#define MPP20_TSMP0		MPP( 20, 0x1, 0, 0, 0,   0,   1,   1,   1 ) +#define MPP20_TDM_CH0_TX_QL	MPP( 20, 0x2, 0, 0, 0,   0,   1,   1,   1 )  #define MPP20_GE1_TXD0		MPP( 20, 0x3, 0, 0, 0,   1,   1,   1,   1 ) -#define MPP20_AU_SPDIFI		MPP( 20, 0x4, 1, 0, 0,   0,   1,   1,   1 ) -#define MPP20_SATA1_ACTn	MPP( 20, 0x5, 0, 1, 0,   0,   1,   1,   1 ) +#define MPP20_AU_SPDIFI		MPP( 20, 0x4, 0, 0, 0,   0,   1,   1,   1 ) +#define MPP20_SATA1_ACTn	MPP( 20, 0x5, 0, 0, 0,   0,   1,   1,   1 )  #define MPP20_LCD_D0		MPP( 20, 0xb, 0, 0, 0,   0,   0,   0,   1 )  #define MPP21_GPIO		MPP( 21, 0x0, 1, 1, 0,   1,   1,   1,   1 ) -#define MPP21_TSMP1		MPP( 21, 0x1, 1, 1, 0,   0,   1,   1,   1 ) -#define MPP21_TDM_CH0_RX_QL	MPP( 21, 0x2, 0, 1, 0,   0,   1,   1,   1 ) +#define MPP21_TSMP1		MPP( 21, 0x1, 0, 0, 0,   0,   1,   1,   1 ) +#define MPP21_TDM_CH0_RX_QL	MPP( 21, 0x2, 0, 0, 0,   0,   1,   1,   1 )  #define MPP21_GE1_TXD1		MPP( 21, 0x3, 0, 0, 0,   1,   1,   1,   1 ) -#define MPP21_AU_SPDIFO		MPP( 21, 0x4, 0, 1, 0,   0,   1,   1,   1 ) -#define MPP21_SATA0_ACTn	MPP( 21, 0x5, 0, 1, 0,   1,   1,   1,   1 ) +#define MPP21_AU_SPDIFO		MPP( 21, 0x4, 0, 0, 0,   0,   1,   1,   1 ) +#define MPP21_SATA0_ACTn	MPP( 21, 0x5, 0, 0, 0,   1,   1,   1,   1 )  #define MPP21_LCD_D1		MPP( 21, 0xb, 0, 0, 0,   0,   0,   0,   1 )  #define MPP22_GPIO		MPP( 22, 0x0, 1, 1, 0,   1,   1,   1,   1 ) -#define MPP22_TSMP2		MPP( 22, 0x1, 1, 1, 0,   0,   1,   1,   1 ) -#define MPP22_TDM_CH2_TX_QL	MPP( 22, 0x2, 0, 1, 0,   0,   1,   1,   1 ) +#define MPP22_TSMP2		MPP( 22, 0x1, 0, 0, 0,   0,   1,   1,   1 ) +#define MPP22_TDM_CH2_TX_QL	MPP( 22, 0x2, 0, 0, 0,   0,   1,   1,   1 )  #define MPP22_GE1_TXD2		MPP( 22, 0x3, 0, 0, 0,   1,   1,   1,   1 ) -#define MPP22_AU_SPDIFRMKCLK	MPP( 22, 0x4, 0, 1, 0,   0,   1,   1,   1 ) -#define MPP22_SATA1_PRESENTn	MPP( 22, 0x5, 0, 1, 0,   0,   1,   1,   1 ) +#define MPP22_AU_SPDIFRMKCLK	MPP( 22, 0x4, 0, 0, 0,   0,   1,   1,   1 ) +#define MPP22_SATA1_PRESENTn	MPP( 22, 0x5, 0, 0, 0,   0,   1,   1,   1 )  #define MPP22_LCD_D2		MPP( 22, 0xb, 0, 0, 0,   0,   0,   0,   1 )  #define MPP23_GPIO		MPP( 23, 0x0, 1, 1, 0,   1,   1,   1,   1 ) -#define MPP23_TSMP3		MPP( 23, 0x1, 1, 1, 0,   0,   1,   1,   1 ) -#define MPP23_TDM_CH2_RX_QL	MPP( 23, 0x2, 1, 0, 0,   0,   1,   1,   1 ) +#define MPP23_TSMP3		MPP( 23, 0x1, 0, 0, 0,   0,   1,   1,   1 ) +#define MPP23_TDM_CH2_RX_QL	MPP( 23, 0x2, 0, 0, 0,   0,   1,   1,   1 )  #define MPP23_GE1_TXD3		MPP( 23, 0x3, 0, 0, 0,   1,   1,   1,   1 ) -#define MPP23_AU_I2SBCLK	MPP( 23, 0x4, 0, 1, 0,   0,   1,   1,   1 ) -#define MPP23_SATA0_PRESENTn	MPP( 23, 0x5, 0, 1, 0,   1,   1,   1,   1 ) +#define MPP23_AU_I2SBCLK	MPP( 23, 0x4, 0, 0, 0,   0,   1,   1,   1 ) +#define MPP23_SATA0_PRESENTn	MPP( 23, 0x5, 0, 0, 0,   1,   1,   1,   1 )  #define MPP23_LCD_D3		MPP( 23, 0xb, 0, 0, 0,   0,   0,   0,   1 )  #define MPP24_GPIO		MPP( 24, 0x0, 1, 1, 0,   1,   1,   1,   1 ) -#define MPP24_TSMP4		MPP( 24, 0x1, 1, 1, 0,   0,   1,   1,   1 ) -#define MPP24_TDM_SPI_CS0	MPP( 24, 0x2, 0, 1, 0,   0,   1,   1,   1 ) +#define MPP24_TSMP4		MPP( 24, 0x1, 0, 0, 0,   0,   1,   1,   1 ) +#define MPP24_TDM_SPI_CS0	MPP( 24, 0x2, 0, 0, 0,   0,   1,   1,   1 )  #define MPP24_GE1_RXD0		MPP( 24, 0x3, 0, 0, 0,   1,   1,   1,   1 ) -#define MPP24_AU_I2SDO		MPP( 24, 0x4, 0, 1, 0,   0,   1,   1,   1 ) +#define MPP24_AU_I2SDO		MPP( 24, 0x4, 0, 0, 0,   0,   1,   1,   1 )  #define MPP24_LCD_D4		MPP( 24, 0xb, 0, 0, 0,   0,   0,   0,   1 )  #define MPP25_GPIO		MPP( 25, 0x0, 1, 1, 0,   1,   1,   1,   1 ) -#define MPP25_TSMP5		MPP( 25, 0x1, 1, 1, 0,   0,   1,   1,   1 ) -#define MPP25_TDM_SPI_SCK	MPP( 25, 0x2, 0, 1, 0,   0,   1,   1,   1 ) +#define MPP25_TSMP5		MPP( 25, 0x1, 0, 0, 0,   0,   1,   1,   1 ) +#define MPP25_TDM_SPI_SCK	MPP( 25, 0x2, 0, 0, 0,   0,   1,   1,   1 )  #define MPP25_GE1_RXD1		MPP( 25, 0x3, 0, 0, 0,   1,   1,   1,   1 ) -#define MPP25_AU_I2SLRCLK	MPP( 25, 0x4, 0, 1, 0,   0,   1,   1,   1 ) +#define MPP25_AU_I2SLRCLK	MPP( 25, 0x4, 0, 0, 0,   0,   1,   1,   1 )  #define MPP25_LCD_D5		MPP( 25, 0xb, 0, 0, 0,   0,   0,   0,   1 )  #define MPP26_GPIO		MPP( 26, 0x0, 1, 1, 0,   1,   1,   1,   1 ) -#define MPP26_TSMP6		MPP( 26, 0x1, 1, 1, 0,   0,   1,   1,   1 ) -#define MPP26_TDM_SPI_MISO	MPP( 26, 0x2, 1, 0, 0,   0,   1,   1,   1 ) +#define MPP26_TSMP6		MPP( 26, 0x1, 0, 0, 0,   0,   1,   1,   1 ) +#define MPP26_TDM_SPI_MISO	MPP( 26, 0x2, 0, 0, 0,   0,   1,   1,   1 )  #define MPP26_GE1_RXD2		MPP( 26, 0x3, 0, 0, 0,   1,   1,   1,   1 ) -#define MPP26_AU_I2SMCLK	MPP( 26, 0x4, 0, 1, 0,   0,   1,   1,   1 ) +#define MPP26_AU_I2SMCLK	MPP( 26, 0x4, 0, 0, 0,   0,   1,   1,   1 )  #define MPP26_LCD_D6		MPP( 26, 0xb, 0, 0, 0,   0,   0,   0,   1 )  #define MPP27_GPIO		MPP( 27, 0x0, 1, 1, 0,   1,   1,   1,   1 ) -#define MPP27_TSMP7		MPP( 27, 0x1, 1, 1, 0,   0,   1,   1,   1 ) -#define MPP27_TDM_SPI_MOSI	MPP( 27, 0x2, 0, 1, 0,   0,   1,   1,   1 ) +#define MPP27_TSMP7		MPP( 27, 0x1, 0, 0, 0,   0,   1,   1,   1 ) +#define MPP27_TDM_SPI_MOSI	MPP( 27, 0x2, 0, 0, 0,   0,   1,   1,   1 )  #define MPP27_GE1_RXD3		MPP( 27, 0x3, 0, 0, 0,   1,   1,   1,   1 ) -#define MPP27_AU_I2SDI		MPP( 27, 0x4, 1, 0, 0,   0,   1,   1,   1 ) +#define MPP27_AU_I2SDI		MPP( 27, 0x4, 0, 0, 0,   0,   1,   1,   1 )  #define MPP27_LCD_D7		MPP( 27, 0xb, 0, 0, 0,   0,   0,   0,   1 )  #define MPP28_GPIO		MPP( 28, 0x0, 1, 1, 0,   1,   1,   1,   1 ) -#define MPP28_TSMP8		MPP( 28, 0x1, 1, 1, 0,   0,   1,   1,   1 ) +#define MPP28_TSMP8		MPP( 28, 0x1, 0, 0, 0,   0,   1,   1,   1 )  #define MPP28_TDM_CODEC_INTn	MPP( 28, 0x2, 0, 0, 0,   0,   1,   1,   1 )  #define MPP28_GE1_COL		MPP( 28, 0x3, 0, 0, 0,   1,   1,   1,   1 ) -#define MPP28_AU_EXTCLK		MPP( 28, 0x4, 1, 0, 0,   0,   1,   1,   1 ) +#define MPP28_AU_EXTCLK		MPP( 28, 0x4, 0, 0, 0,   0,   1,   1,   1 )  #define MPP28_LCD_D8		MPP( 28, 0xb, 0, 0, 0,   0,   0,   0,   1 )  #define MPP29_GPIO		MPP( 29, 0x0, 1, 1, 0,   1,   1,   1,   1 ) -#define MPP29_TSMP9		MPP( 29, 0x1, 1, 1, 0,   0,   1,   1,   1 ) +#define MPP29_TSMP9		MPP( 29, 0x1, 0, 0, 0,   0,   1,   1,   1 )  #define MPP29_TDM_CODEC_RSTn	MPP( 29, 0x2, 0, 0, 0,   0,   1,   1,   1 )  #define MPP29_GE1_TCLK		MPP( 29, 0x3, 0, 0, 0,   1,   1,   1,   1 )  #define MPP29_LCD_D9		MPP( 29, 0xb, 0, 0, 0,   0,   0,   0,   1 )  #define MPP30_GPIO		MPP( 30, 0x0, 1, 1, 0,   1,   1,   1,   1 ) -#define MPP30_TSMP10		MPP( 30, 0x1, 1, 1, 0,   0,   1,   1,   1 ) -#define MPP30_TDM_PCLK		MPP( 30, 0x2, 1, 1, 0,   0,   1,   1,   1 ) +#define MPP30_TSMP10		MPP( 30, 0x1, 0, 0, 0,   0,   1,   1,   1 ) +#define MPP30_TDM_PCLK		MPP( 30, 0x2, 0, 0, 0,   0,   1,   1,   1 )  #define MPP30_GE1_RXCTL		MPP( 30, 0x3, 0, 0, 0,   1,   1,   1,   1 )  #define MPP30_LCD_D10		MPP( 30, 0xb, 0, 0, 0,   0,   0,   0,   1 )  #define MPP31_GPIO		MPP( 31, 0x0, 1, 1, 0,   1,   1,   1,   1 ) -#define MPP31_TSMP11		MPP( 31, 0x1, 1, 1, 0,   0,   1,   1,   1 ) -#define MPP31_TDM_FS		MPP( 31, 0x2, 1, 1, 0,   0,   1,   1,   1 ) +#define MPP31_TSMP11		MPP( 31, 0x1, 0, 0, 0,   0,   1,   1,   1 ) +#define MPP31_TDM_FS		MPP( 31, 0x2, 0, 0, 0,   0,   1,   1,   1 )  #define MPP31_GE1_RXCLK		MPP( 31, 0x3, 0, 0, 0,   1,   1,   1,   1 )  #define MPP31_LCD_D11		MPP( 31, 0xb, 0, 0, 0,   0,   0,   0,   1 )  #define MPP32_GPIO		MPP( 32, 0x0, 1, 1, 0,   1,   1,   1,   1 ) -#define MPP32_TSMP12		MPP( 32, 0x1, 1, 1, 0,   0,   1,   1,   1 ) -#define MPP32_TDM_DRX		MPP( 32, 0x2, 1, 0, 0,   0,   1,   1,   1 ) +#define MPP32_TSMP12		MPP( 32, 0x1, 0, 0, 0,   0,   1,   1,   1 ) +#define MPP32_TDM_DRX		MPP( 32, 0x2, 0, 0, 0,   0,   1,   1,   1 )  #define MPP32_GE1_TCLKOUT	MPP( 32, 0x3, 0, 0, 0,   1,   1,   1,   1 )  #define MPP32_LCD_D12		MPP( 32, 0xb, 0, 0, 0,   0,   0,   0,   1 )  #define MPP33_GPO		MPP( 33, 0x0, 0, 1, 0,   1,   1,   1,   1 ) -#define MPP33_TDM_DTX		MPP( 33, 0x2, 0, 1, 0,   0,   1,   1,   1 ) +#define MPP33_TDM_DTX		MPP( 33, 0x2, 0, 0, 0,   0,   1,   1,   1 )  #define MPP33_GE1_TXCTL		MPP( 33, 0x3, 0, 0, 0,   1,   1,   1,   1 )  #define MPP33_LCD_D13		MPP( 33, 0xb, 0, 0, 0,   0,   0,   0,   1 )  #define MPP34_GPIO		MPP( 34, 0x0, 1, 1, 0,   1,   1,   1,   1 ) -#define MPP34_TDM_SPI_CS1	MPP( 34, 0x2, 0, 1, 0,   0,   1,   1,   1 ) +#define MPP34_TDM_SPI_CS1	MPP( 34, 0x2, 0, 0, 0,   0,   1,   1,   1 )  #define MPP34_GE1_TXEN		MPP( 34, 0x3, 0, 0, 0,   1,   1,   1,   1 ) -#define MPP34_SATA1_ACTn	MPP( 34, 0x5, 0, 1, 0,   0,   0,   1,   1 ) +#define MPP34_SATA1_ACTn	MPP( 34, 0x5, 0, 0, 0,   0,   0,   1,   1 )  #define MPP34_LCD_D14		MPP( 34, 0xb, 0, 0, 0,   0,   0,   0,   1 )  #define MPP35_GPIO		MPP( 35, 0x0, 1, 1, 1,   1,   1,   1,   1 ) -#define MPP35_TDM_CH0_TX_QL	MPP( 35, 0x2, 0, 1, 0,   0,   1,   1,   1 ) +#define MPP35_TDM_CH0_TX_QL	MPP( 35, 0x2, 0, 0, 0,   0,   1,   1,   1 )  #define MPP35_GE1_RXERR		MPP( 35, 0x3, 0, 0, 0,   1,   1,   1,   1 ) -#define MPP35_SATA0_ACTn	MPP( 35, 0x5, 0, 1, 0,   1,   1,   1,   1 ) +#define MPP35_SATA0_ACTn	MPP( 35, 0x5, 0, 0, 0,   1,   1,   1,   1 )  #define MPP35_LCD_D15		MPP( 22, 0xb, 0, 0, 0,   0,   0,   0,   1 ) -#define MPP35_MII0_RXERR	MPP( 35, 0xc, 1, 0, 1,   1,   1,   1,   1 ) +#define MPP35_MII0_RXERR	MPP( 35, 0xc, 0, 0, 1,   1,   1,   1,   1 )  #define MPP36_GPIO		MPP( 36, 0x0, 1, 1, 1,   0,   0,   1,   1 ) -#define MPP36_TSMP0		MPP( 36, 0x1, 1, 1, 0,   0,   0,   1,   1 ) -#define MPP36_TDM_SPI_CS1	MPP( 36, 0x2, 0, 1, 0,   0,   0,   1,   1 ) -#define MPP36_AU_SPDIFI		MPP( 36, 0x4, 1, 0, 1,   0,   0,   1,   1 ) -#define MPP36_TW1_SDA		MPP( 36, 0xb, 1, 1, 0,   0,   0,   0,   1 ) +#define MPP36_TSMP0		MPP( 36, 0x1, 0, 0, 0,   0,   0,   1,   1 ) +#define MPP36_TDM_SPI_CS1	MPP( 36, 0x2, 0, 0, 0,   0,   0,   1,   1 ) +#define MPP36_AU_SPDIFI		MPP( 36, 0x4, 0, 0, 1,   0,   0,   1,   1 ) +#define MPP36_TW1_SDA		MPP( 36, 0xb, 0, 0, 0,   0,   0,   0,   1 )  #define MPP37_GPIO		MPP( 37, 0x0, 1, 1, 1,   0,   0,   1,   1 ) -#define MPP37_TSMP1		MPP( 37, 0x1, 1, 1, 0,   0,   0,   1,   1 ) -#define MPP37_TDM_CH2_TX_QL	MPP( 37, 0x2, 0, 1, 0,   0,   0,   1,   1 ) -#define MPP37_AU_SPDIFO		MPP( 37, 0x4, 0, 1, 1,   0,   0,   1,   1 ) -#define MPP37_TW1_SCK		MPP( 37, 0xb, 1, 1, 0,   0,   0,   0,   1 ) +#define MPP37_TSMP1		MPP( 37, 0x1, 0, 0, 0,   0,   0,   1,   1 ) +#define MPP37_TDM_CH2_TX_QL	MPP( 37, 0x2, 0, 0, 0,   0,   0,   1,   1 ) +#define MPP37_AU_SPDIFO		MPP( 37, 0x4, 0, 0, 1,   0,   0,   1,   1 ) +#define MPP37_TW1_SCK		MPP( 37, 0xb, 0, 0, 0,   0,   0,   0,   1 )  #define MPP38_GPIO		MPP( 38, 0x0, 1, 1, 1,   0,   0,   1,   1 ) -#define MPP38_TSMP2		MPP( 38, 0x1, 1, 1, 0,   0,   0,   1,   1 ) -#define MPP38_TDM_CH2_RX_QL	MPP( 38, 0x2, 0, 1, 0,   0,   0,   1,   1 ) -#define MPP38_AU_SPDIFRMLCLK	MPP( 38, 0x4, 0, 1, 1,   0,   0,   1,   1 ) +#define MPP38_TSMP2		MPP( 38, 0x1, 0, 0, 0,   0,   0,   1,   1 ) +#define MPP38_TDM_CH2_RX_QL	MPP( 38, 0x2, 0, 0, 0,   0,   0,   1,   1 ) +#define MPP38_AU_SPDIFRMLCLK	MPP( 38, 0x4, 0, 0, 1,   0,   0,   1,   1 )  #define MPP38_LCD_D18		MPP( 38, 0xb, 0, 0, 0,   0,   0,   0,   1 )  #define MPP39_GPIO		MPP( 39, 0x0, 1, 1, 1,   0,   0,   1,   1 ) -#define MPP39_TSMP3		MPP( 39, 0x1, 1, 1, 0,   0,   0,   1,   1 ) -#define MPP39_TDM_SPI_CS0	MPP( 39, 0x2, 0, 1, 0,   0,   0,   1,   1 ) -#define MPP39_AU_I2SBCLK	MPP( 39, 0x4, 0, 1, 1,   0,   0,   1,   1 ) +#define MPP39_TSMP3		MPP( 39, 0x1, 0, 0, 0,   0,   0,   1,   1 ) +#define MPP39_TDM_SPI_CS0	MPP( 39, 0x2, 0, 0, 0,   0,   0,   1,   1 ) +#define MPP39_AU_I2SBCLK	MPP( 39, 0x4, 0, 0, 1,   0,   0,   1,   1 )  #define MPP39_LCD_D19		MPP( 39, 0xb, 0, 0, 0,   0,   0,   0,   1 )  #define MPP40_GPIO		MPP( 40, 0x0, 1, 1, 1,   0,   0,   1,   1 ) -#define MPP40_TSMP4		MPP( 40, 0x1, 1, 1, 0,   0,   0,   1,   1 ) -#define MPP40_TDM_SPI_SCK	MPP( 40, 0x2, 0, 1, 0,   0,   0,   1,   1 ) -#define MPP40_AU_I2SDO		MPP( 40, 0x4, 0, 1, 1,   0,   0,   1,   1 ) +#define MPP40_TSMP4		MPP( 40, 0x1, 0, 0, 0,   0,   0,   1,   1 ) +#define MPP40_TDM_SPI_SCK	MPP( 40, 0x2, 0, 0, 0,   0,   0,   1,   1 ) +#define MPP40_AU_I2SDO		MPP( 40, 0x4, 0, 0, 1,   0,   0,   1,   1 )  #define MPP40_LCD_D20		MPP( 40, 0xb, 0, 0, 0,   0,   0,   0,   1 )  #define MPP41_GPIO		MPP( 41, 0x0, 1, 1, 1,   0,   0,   1,   1 ) -#define MPP41_TSMP5		MPP( 41, 0x1, 1, 1, 0,   0,   0,   1,   1 ) -#define MPP41_TDM_SPI_MISO	MPP( 41, 0x2, 1, 0, 0,   0,   0,   1,   1 ) -#define MPP41_AU_I2SLRCLK	MPP( 41, 0x4, 0, 1, 1,   0,   0,   1,   1 ) +#define MPP41_TSMP5		MPP( 41, 0x1, 0, 0, 0,   0,   0,   1,   1 ) +#define MPP41_TDM_SPI_MISO	MPP( 41, 0x2, 0, 0, 0,   0,   0,   1,   1 ) +#define MPP41_AU_I2SLRCLK	MPP( 41, 0x4, 0, 0, 1,   0,   0,   1,   1 )  #define MPP41_LCD_D21		MPP( 41, 0xb, 0, 0, 0,   0,   0,   0,   1 )  #define MPP42_GPIO		MPP( 42, 0x0, 1, 1, 1,   0,   0,   1,   1 ) -#define MPP42_TSMP6		MPP( 42, 0x1, 1, 1, 0,   0,   0,   1,   1 ) -#define MPP42_TDM_SPI_MOSI	MPP( 42, 0x2, 0, 1, 0,   0,   0,   1,   1 ) -#define MPP42_AU_I2SMCLK	MPP( 42, 0x4, 0, 1, 1,   0,   0,   1,   1 ) +#define MPP42_TSMP6		MPP( 42, 0x1, 0, 0, 0,   0,   0,   1,   1 ) +#define MPP42_TDM_SPI_MOSI	MPP( 42, 0x2, 0, 0, 0,   0,   0,   1,   1 ) +#define MPP42_AU_I2SMCLK	MPP( 42, 0x4, 0, 0, 1,   0,   0,   1,   1 )  #define MPP42_LCD_D22		MPP( 42, 0xb, 0, 0, 0,   0,   0,   0,   1 )  #define MPP43_GPIO		MPP( 43, 0x0, 1, 1, 1,   0,   0,   1,   1 ) -#define MPP43_TSMP7		MPP( 43, 0x1, 1, 1, 0,   0,   0,   1,   1 ) +#define MPP43_TSMP7		MPP( 43, 0x1, 0, 0, 0,   0,   0,   1,   1 )  #define MPP43_TDM_CODEC_INTn	MPP( 43, 0x2, 0, 0, 0,   0,   0,   1,   1 ) -#define MPP43_AU_I2SDI		MPP( 43, 0x4, 1, 0, 1,   0,   0,   1,   1 ) +#define MPP43_AU_I2SDI		MPP( 43, 0x4, 0, 0, 1,   0,   0,   1,   1 )  #define MPP43_LCD_D23		MPP( 22, 0xb, 0, 0, 0,   0,   0,   0,   1 )  #define MPP44_GPIO		MPP( 44, 0x0, 1, 1, 1,   0,   0,   1,   1 ) -#define MPP44_TSMP8		MPP( 44, 0x1, 1, 1, 0,   0,   0,   1,   1 ) +#define MPP44_TSMP8		MPP( 44, 0x1, 0, 0, 0,   0,   0,   1,   1 )  #define MPP44_TDM_CODEC_RSTn	MPP( 44, 0x2, 0, 0, 0,   0,   0,   1,   1 ) -#define MPP44_AU_EXTCLK		MPP( 44, 0x4, 1, 0, 1,   0,   0,   1,   1 ) +#define MPP44_AU_EXTCLK		MPP( 44, 0x4, 0, 0, 1,   0,   0,   1,   1 )  #define MPP44_LCD_CLK		MPP( 44, 0xb, 0, 0, 0,   0,   0,   0,   1 )  #define MPP45_GPIO		MPP( 45, 0x0, 1, 1, 0,   0,   0,   1,   1 ) -#define MPP45_TSMP9		MPP( 45, 0x1, 1, 1, 0,   0,   0,   1,   1 ) -#define MPP45_TDM_PCLK		MPP( 45, 0x2, 1, 1, 0,   0,   0,   1,   1 ) +#define MPP45_TSMP9		MPP( 45, 0x1, 0, 0, 0,   0,   0,   1,   1 ) +#define MPP45_TDM_PCLK		MPP( 45, 0x2, 0, 0, 0,   0,   0,   1,   1 )  #define MPP245_LCD_E		MPP( 45, 0xb, 0, 0, 0,   0,   0,   0,   1 )  #define MPP46_GPIO		MPP( 46, 0x0, 1, 1, 0,   0,   0,   1,   1 ) -#define MPP46_TSMP10		MPP( 46, 0x1, 1, 1, 0,   0,   0,   1,   1 ) -#define MPP46_TDM_FS		MPP( 46, 0x2, 1, 1, 0,   0,   0,   1,   1 ) +#define MPP46_TSMP10		MPP( 46, 0x1, 0, 0, 0,   0,   0,   1,   1 ) +#define MPP46_TDM_FS		MPP( 46, 0x2, 0, 0, 0,   0,   0,   1,   1 )  #define MPP46_LCD_HSYNC		MPP( 46, 0xb, 0, 0, 0,   0,   0,   0,   1 )  #define MPP47_GPIO		MPP( 47, 0x0, 1, 1, 0,   0,   0,   1,   1 ) -#define MPP47_TSMP11		MPP( 47, 0x1, 1, 1, 0,   0,   0,   1,   1 ) -#define MPP47_TDM_DRX		MPP( 47, 0x2, 1, 0, 0,   0,   0,   1,   1 ) +#define MPP47_TSMP11		MPP( 47, 0x1, 0, 0, 0,   0,   0,   1,   1 ) +#define MPP47_TDM_DRX		MPP( 47, 0x2, 0, 0, 0,   0,   0,   1,   1 )  #define MPP47_LCD_VSYNC		MPP( 47, 0xb, 0, 0, 0,   0,   0,   0,   1 )  #define MPP48_GPIO		MPP( 48, 0x0, 1, 1, 0,   0,   0,   1,   1 ) -#define MPP48_TSMP12		MPP( 48, 0x1, 1, 1, 0,   0,   0,   1,   1 ) -#define MPP48_TDM_DTX		MPP( 48, 0x2, 0, 1, 0,   0,   0,   1,   1 ) +#define MPP48_TSMP12		MPP( 48, 0x1, 0, 0, 0,   0,   0,   1,   1 ) +#define MPP48_TDM_DTX		MPP( 48, 0x2, 0, 0, 0,   0,   0,   1,   1 )  #define MPP48_LCD_D16		MPP( 22, 0xb, 0, 0, 0,   0,   0,   0,   1 )  #define MPP49_GPIO		MPP( 49, 0x0, 1, 1, 0,   0,   0,   1,   0 )  #define MPP49_GPO		MPP( 49, 0x0, 0, 1, 0,   0,   0,   0,   1 ) -#define MPP49_TSMP9		MPP( 49, 0x1, 1, 1, 0,   0,   0,   1,   0 ) -#define MPP49_TDM_CH0_RX_QL	MPP( 49, 0x2, 0, 1, 0,   0,   0,   1,   1 ) -#define MPP49_PTP_CLK		MPP( 49, 0x5, 1, 0, 0,   0,   0,   1,   0 ) -#define MPP49_PEX0_CLKREQ	MPP( 49, 0xa, 0, 1, 0,   0,   0,   0,   1 ) +#define MPP49_TSMP9		MPP( 49, 0x1, 0, 0, 0,   0,   0,   1,   0 ) +#define MPP49_TDM_CH0_RX_QL	MPP( 49, 0x2, 0, 0, 0,   0,   0,   1,   1 ) +#define MPP49_PTP_CLK		MPP( 49, 0x5, 0, 0, 0,   0,   0,   1,   0 ) +#define MPP49_PEX0_CLKREQ	MPP( 49, 0xa, 0, 0, 0,   0,   0,   0,   1 )  #define MPP49_LCD_D17		MPP( 49, 0xb, 0, 0, 0,   0,   0,   0,   1 )  #define MPP_MAX			49 diff --git a/arch/arm/mach-mv78xx0/common.c b/arch/arm/mach-mv78xx0/common.c index 0cdd41004ad..a5dcf766a3f 100644 --- a/arch/arm/mach-mv78xx0/common.c +++ b/arch/arm/mach-mv78xx0/common.c @@ -19,6 +19,7 @@  #include <mach/mv78xx0.h>  #include <mach/bridge-regs.h>  #include <plat/cache-feroceon-l2.h> +#include <plat/ehci-orion.h>  #include <plat/orion_nand.h>  #include <plat/time.h>  #include <plat/common.h> @@ -169,7 +170,7 @@ void __init mv78xx0_map_io(void)   ****************************************************************************/  void __init mv78xx0_ehci0_init(void)  { -	orion_ehci_init(USB0_PHYS_BASE, IRQ_MV78XX0_USB_0); +	orion_ehci_init(USB0_PHYS_BASE, IRQ_MV78XX0_USB_0, EHCI_PHY_NA);  } diff --git a/arch/arm/mach-mv78xx0/mpp.h b/arch/arm/mach-mv78xx0/mpp.h index b61b5092712..3752302ae2e 100644 --- a/arch/arm/mach-mv78xx0/mpp.h +++ b/arch/arm/mach-mv78xx0/mpp.h @@ -24,296 +24,296 @@  #define MPP_78100_A0_MASK    MPP(0, 0x0, 0, 0, 1)  #define MPP0_GPIO        MPP(0, 0x0, 1, 1, 1) -#define MPP0_GE0_COL        MPP(0, 0x1, 1, 0, 1) -#define MPP0_GE1_TXCLK        MPP(0, 0x2, 0, 1, 1) +#define MPP0_GE0_COL        MPP(0, 0x1, 0, 0, 1) +#define MPP0_GE1_TXCLK        MPP(0, 0x2, 0, 0, 1)  #define MPP0_UNUSED        MPP(0, 0x3, 0, 0, 1)  #define MPP1_GPIO        MPP(1, 0x0, 1, 1, 1) -#define MPP1_GE0_RXERR        MPP(1, 0x1, 1, 0, 1) -#define MPP1_GE1_TXCTL        MPP(1, 0x2, 0, 1, 1) +#define MPP1_GE0_RXERR        MPP(1, 0x1, 0, 0, 1) +#define MPP1_GE1_TXCTL        MPP(1, 0x2, 0, 0, 1)  #define MPP1_UNUSED        MPP(1, 0x3, 0, 0, 1)  #define MPP2_GPIO        MPP(2, 0x0, 1, 1, 1) -#define MPP2_GE0_CRS        MPP(2, 0x1, 1, 0, 1) -#define MPP2_GE1_RXCTL        MPP(2, 0x2, 1, 0, 1) +#define MPP2_GE0_CRS        MPP(2, 0x1, 0, 0, 1) +#define MPP2_GE1_RXCTL        MPP(2, 0x2, 0, 0, 1)  #define MPP2_UNUSED        MPP(2, 0x3, 0, 0, 1)  #define MPP3_GPIO        MPP(3, 0x0, 1, 1, 1) -#define MPP3_GE0_TXERR        MPP(3, 0x1, 0, 1, 1) -#define MPP3_GE1_RXCLK        MPP(3, 0x2, 1, 0, 1) +#define MPP3_GE0_TXERR        MPP(3, 0x1, 0, 0, 1) +#define MPP3_GE1_RXCLK        MPP(3, 0x2, 0, 0, 1)  #define MPP3_UNUSED        MPP(3, 0x3, 0, 0, 1)  #define MPP4_GPIO        MPP(4, 0x0, 1, 1, 1) -#define MPP4_GE0_TXD4        MPP(4, 0x1, 0, 1, 1) -#define MPP4_GE1_TXD0        MPP(4, 0x2, 0, 1, 1) +#define MPP4_GE0_TXD4        MPP(4, 0x1, 0, 0, 1) +#define MPP4_GE1_TXD0        MPP(4, 0x2, 0, 0, 1)  #define MPP4_UNUSED        MPP(4, 0x3, 0, 0, 1)  #define MPP5_GPIO        MPP(5, 0x0, 1, 1, 1) -#define MPP5_GE0_TXD5        MPP(5, 0x1, 0, 1, 1) -#define MPP5_GE1_TXD1        MPP(5, 0x2, 0, 1, 1) +#define MPP5_GE0_TXD5        MPP(5, 0x1, 0, 0, 1) +#define MPP5_GE1_TXD1        MPP(5, 0x2, 0, 0, 1)  #define MPP5_UNUSED        MPP(5, 0x3, 0, 0, 1)  #define MPP6_GPIO        MPP(6, 0x0, 1, 1, 1) -#define MPP6_GE0_TXD6        MPP(6, 0x1, 0, 1, 1) -#define MPP6_GE1_TXD2        MPP(6, 0x2, 0, 1, 1) +#define MPP6_GE0_TXD6        MPP(6, 0x1, 0, 0, 1) +#define MPP6_GE1_TXD2        MPP(6, 0x2, 0, 0, 1)  #define MPP6_UNUSED        MPP(6, 0x3, 0, 0, 1)  #define MPP7_GPIO        MPP(7, 0x0, 1, 1, 1) -#define MPP7_GE0_TXD7        MPP(7, 0x1, 0, 1, 1) -#define MPP7_GE1_TXD3        MPP(7, 0x2, 0, 1, 1) +#define MPP7_GE0_TXD7        MPP(7, 0x1, 0, 0, 1) +#define MPP7_GE1_TXD3        MPP(7, 0x2, 0, 0, 1)  #define MPP7_UNUSED        MPP(7, 0x3, 0, 0, 1)  #define MPP8_GPIO        MPP(8, 0x0, 1, 1, 1) -#define MPP8_GE0_RXD4        MPP(8, 0x1, 1, 0, 1) -#define MPP8_GE1_RXD0        MPP(8, 0x2, 1, 0, 1) +#define MPP8_GE0_RXD4        MPP(8, 0x1, 0, 0, 1) +#define MPP8_GE1_RXD0        MPP(8, 0x2, 0, 0, 1)  #define MPP8_UNUSED        MPP(8, 0x3, 0, 0, 1)  #define MPP9_GPIO        MPP(9, 0x0, 1, 1, 1) -#define MPP9_GE0_RXD5        MPP(9, 0x1, 1, 0, 1) -#define MPP9_GE1_RXD1        MPP(9, 0x2, 1, 0, 1) +#define MPP9_GE0_RXD5        MPP(9, 0x1, 0, 0, 1) +#define MPP9_GE1_RXD1        MPP(9, 0x2, 0, 0, 1)  #define MPP9_UNUSED        MPP(9, 0x3, 0, 0, 1)  #define MPP10_GPIO        MPP(10, 0x0, 1, 1, 1) -#define MPP10_GE0_RXD6        MPP(10, 0x1, 1, 0, 1) -#define MPP10_GE1_RXD2        MPP(10, 0x2, 1, 0, 1) +#define MPP10_GE0_RXD6        MPP(10, 0x1, 0, 0, 1) +#define MPP10_GE1_RXD2        MPP(10, 0x2, 0, 0, 1)  #define MPP10_UNUSED        MPP(10, 0x3, 0, 0, 1)  #define MPP11_GPIO        MPP(11, 0x0, 1, 1, 1) -#define MPP11_GE0_RXD7        MPP(11, 0x1, 1, 0, 1) -#define MPP11_GE1_RXD3        MPP(11, 0x2, 1, 0, 1) +#define MPP11_GE0_RXD7        MPP(11, 0x1, 0, 0, 1) +#define MPP11_GE1_RXD3        MPP(11, 0x2, 0, 0, 1)  #define MPP11_UNUSED        MPP(11, 0x3, 0, 0, 1)  #define MPP12_GPIO        MPP(12, 0x0, 1, 1, 1) -#define MPP12_M_BB        MPP(12, 0x3, 1, 0, 1) -#define MPP12_UA0_CTSn        MPP(12, 0x4, 1, 0, 1) -#define MPP12_NAND_FLASH_REn0    MPP(12, 0x5, 0, 1, 1) -#define MPP12_TDM0_SCSn        MPP(12, 0X6, 0, 1, 1) +#define MPP12_M_BB        MPP(12, 0x3, 0, 0, 1) +#define MPP12_UA0_CTSn        MPP(12, 0x4, 0, 0, 1) +#define MPP12_NAND_FLASH_REn0    MPP(12, 0x5, 0, 0, 1) +#define MPP12_TDM0_SCSn        MPP(12, 0X6, 0, 0, 1)  #define MPP12_UNUSED        MPP(12, 0x1, 0, 0, 1)  #define MPP13_GPIO        MPP(13, 0x0, 1, 1, 1) -#define MPP13_SYSRST_OUTn    MPP(13, 0x3, 0, 1, 1) -#define MPP13_UA0_RTSn        MPP(13, 0x4, 0, 1, 1) -#define MPP13_NAN_FLASH_WEn0    MPP(13, 0x5, 0, 1, 1) -#define MPP13_TDM_SCLK        MPP(13, 0x6, 0, 1, 1) +#define MPP13_SYSRST_OUTn    MPP(13, 0x3, 0, 0, 1) +#define MPP13_UA0_RTSn        MPP(13, 0x4, 0, 0, 1) +#define MPP13_NAN_FLASH_WEn0    MPP(13, 0x5, 0, 0, 1) +#define MPP13_TDM_SCLK        MPP(13, 0x6, 0, 0, 1)  #define MPP13_UNUSED        MPP(13, 0x1, 0, 0, 1)  #define MPP14_GPIO        MPP(14, 0x0, 1, 1, 1) -#define MPP14_SATA1_ACTn    MPP(14, 0x3, 0, 1, 1) -#define MPP14_UA1_CTSn        MPP(14, 0x4, 1, 0, 1) -#define MPP14_NAND_FLASH_REn1    MPP(14, 0x5, 0, 1, 1) -#define MPP14_TDM_SMOSI        MPP(14, 0x6, 0, 1, 1) +#define MPP14_SATA1_ACTn    MPP(14, 0x3, 0, 0, 1) +#define MPP14_UA1_CTSn        MPP(14, 0x4, 0, 0, 1) +#define MPP14_NAND_FLASH_REn1    MPP(14, 0x5, 0, 0, 1) +#define MPP14_TDM_SMOSI        MPP(14, 0x6, 0, 0, 1)  #define MPP14_UNUSED        MPP(14, 0x1, 0, 0, 1)  #define MPP15_GPIO        MPP(15, 0x0, 1, 1, 1) -#define MPP15_SATA0_ACTn    MPP(15, 0x3, 0, 1, 1) -#define MPP15_UA1_RTSn        MPP(15, 0x4, 0, 1, 1) -#define MPP15_NAND_FLASH_WEn1    MPP(15, 0x5, 0, 1, 1) -#define MPP15_TDM_SMISO        MPP(15, 0x6, 1, 0, 1) +#define MPP15_SATA0_ACTn    MPP(15, 0x3, 0, 0, 1) +#define MPP15_UA1_RTSn        MPP(15, 0x4, 0, 0, 1) +#define MPP15_NAND_FLASH_WEn1    MPP(15, 0x5, 0, 0, 1) +#define MPP15_TDM_SMISO        MPP(15, 0x6, 0, 0, 1)  #define MPP15_UNUSED        MPP(15, 0x1, 0, 0, 1)  #define MPP16_GPIO        MPP(16, 0x0, 1, 1, 1) -#define MPP16_SATA1_PRESENTn    MPP(16, 0x3, 0, 1, 1) -#define MPP16_UA2_TXD        MPP(16, 0x4, 0, 1, 1) -#define MPP16_NAND_FLASH_REn3    MPP(16, 0x5, 0, 1, 1) -#define MPP16_TDM_INTn        MPP(16, 0x6, 1, 0, 1) +#define MPP16_SATA1_PRESENTn    MPP(16, 0x3, 0, 0, 1) +#define MPP16_UA2_TXD        MPP(16, 0x4, 0, 0, 1) +#define MPP16_NAND_FLASH_REn3    MPP(16, 0x5, 0, 0, 1) +#define MPP16_TDM_INTn        MPP(16, 0x6, 0, 0, 1)  #define MPP16_UNUSED        MPP(16, 0x1, 0, 0, 1)  #define MPP17_GPIO        MPP(17, 0x0, 1, 1, 1) -#define MPP17_SATA0_PRESENTn    MPP(17, 0x3, 0, 1, 1) -#define MPP17_UA2_RXD        MPP(17, 0x4, 1, 0, 1) -#define MPP17_NAND_FLASH_WEn3    MPP(17, 0x5, 0, 1, 1) -#define MPP17_TDM_RSTn        MPP(17, 0x6, 0, 1, 1) +#define MPP17_SATA0_PRESENTn    MPP(17, 0x3, 0, 0, 1) +#define MPP17_UA2_RXD        MPP(17, 0x4, 0, 0, 1) +#define MPP17_NAND_FLASH_WEn3    MPP(17, 0x5, 0, 0, 1) +#define MPP17_TDM_RSTn        MPP(17, 0x6, 0, 0, 1)  #define MPP17_UNUSED        MPP(17, 0x1, 0, 0, 1)  #define MPP18_GPIO        MPP(18, 0x0, 1, 1, 1) -#define MPP18_UA0_CTSn        MPP(18, 0x4, 1, 0, 1) -#define MPP18_BOOT_FLASH_REn    MPP(18, 0x5, 0, 1, 1) +#define MPP18_UA0_CTSn        MPP(18, 0x4, 0, 0, 1) +#define MPP18_BOOT_FLASH_REn    MPP(18, 0x5, 0, 0, 1)  #define MPP18_UNUSED        MPP(18, 0x1, 0, 0, 1)  #define MPP19_GPIO        MPP(19, 0x0, 1, 1, 1) -#define MPP19_UA0_CTSn        MPP(19, 0x4, 0, 1, 1) -#define MPP19_BOOT_FLASH_WEn    MPP(19, 0x5, 0, 1, 1) +#define MPP19_UA0_CTSn        MPP(19, 0x4, 0, 0, 1) +#define MPP19_BOOT_FLASH_WEn    MPP(19, 0x5, 0, 0, 1)  #define MPP19_UNUSED        MPP(19, 0x1, 0, 0, 1)  #define MPP20_GPIO        MPP(20, 0x0, 1, 1, 1) -#define MPP20_UA1_CTSs        MPP(20, 0x4, 1, 0, 1) -#define MPP20_TDM_PCLK        MPP(20, 0x6, 1, 1, 0) +#define MPP20_UA1_CTSs        MPP(20, 0x4, 0, 0, 1) +#define MPP20_TDM_PCLK        MPP(20, 0x6, 0, 0, 0)  #define MPP20_UNUSED        MPP(20, 0x1, 0, 0, 1)  #define MPP21_GPIO        MPP(21, 0x0, 1, 1, 1) -#define MPP21_UA1_CTSs        MPP(21, 0x4, 0, 1, 1) -#define MPP21_TDM_FSYNC        MPP(21, 0x6, 1, 1, 0) +#define MPP21_UA1_CTSs        MPP(21, 0x4, 0, 0, 1) +#define MPP21_TDM_FSYNC        MPP(21, 0x6, 0, 0, 0)  #define MPP21_UNUSED        MPP(21, 0x1, 0, 0, 1)  #define MPP22_GPIO        MPP(22, 0x0, 1, 1, 1) -#define MPP22_UA3_TDX        MPP(22, 0x4, 0, 1, 1) -#define MPP22_NAND_FLASH_REn2    MPP(22, 0x5, 0, 1, 1) -#define MPP22_TDM_DRX        MPP(22, 0x6, 1, 0, 1) +#define MPP22_UA3_TDX        MPP(22, 0x4, 0, 0, 1) +#define MPP22_NAND_FLASH_REn2    MPP(22, 0x5, 0, 0, 1) +#define MPP22_TDM_DRX        MPP(22, 0x6, 0, 0, 1)  #define MPP22_UNUSED        MPP(22, 0x1, 0, 0, 1)  #define MPP23_GPIO        MPP(23, 0x0, 1, 1, 1) -#define MPP23_UA3_RDX        MPP(23, 0x4, 1, 0, 1) -#define MPP23_NAND_FLASH_WEn2    MPP(23, 0x5, 0, 1, 1) -#define MPP23_TDM_DTX        MPP(23, 0x6, 0, 1, 1) +#define MPP23_UA3_RDX        MPP(23, 0x4, 0, 0, 1) +#define MPP23_NAND_FLASH_WEn2    MPP(23, 0x5, 0, 0, 1) +#define MPP23_TDM_DTX        MPP(23, 0x6, 0, 0, 1)  #define MPP23_UNUSED        MPP(23, 0x1, 0, 0, 1)  #define MPP24_GPIO        MPP(24, 0x0, 1, 1, 1) -#define MPP24_UA2_TXD        MPP(24, 0x4, 0, 1, 1) -#define MPP24_TDM_INTn        MPP(24, 0x6, 1, 0, 1) +#define MPP24_UA2_TXD        MPP(24, 0x4, 0, 0, 1) +#define MPP24_TDM_INTn        MPP(24, 0x6, 0, 0, 1)  #define MPP24_UNUSED        MPP(24, 0x1, 0, 0, 1)  #define MPP25_GPIO        MPP(25, 0x0, 1, 1, 1) -#define MPP25_UA2_RXD        MPP(25, 0x4, 1, 0, 1) -#define MPP25_TDM_RSTn        MPP(25, 0x6, 0, 1, 1) +#define MPP25_UA2_RXD        MPP(25, 0x4, 0, 0, 1) +#define MPP25_TDM_RSTn        MPP(25, 0x6, 0, 0, 1)  #define MPP25_UNUSED        MPP(25, 0x1, 0, 0, 1)  #define MPP26_GPIO        MPP(26, 0x0, 1, 1, 1) -#define MPP26_UA2_CTSn        MPP(26, 0x4, 1, 0, 1) -#define MPP26_TDM_PCLK        MPP(26, 0x6, 1, 1, 1) +#define MPP26_UA2_CTSn        MPP(26, 0x4, 0, 0, 1) +#define MPP26_TDM_PCLK        MPP(26, 0x6, 0, 0, 1)  #define MPP26_UNUSED        MPP(26, 0x1, 0, 0, 1)  #define MPP27_GPIO        MPP(27, 0x0, 1, 1, 1) -#define MPP27_UA2_RTSn        MPP(27, 0x4, 0, 1, 1) -#define MPP27_TDM_FSYNC        MPP(27, 0x6, 1, 1, 1) +#define MPP27_UA2_RTSn        MPP(27, 0x4, 0, 0, 1) +#define MPP27_TDM_FSYNC        MPP(27, 0x6, 0, 0, 1)  #define MPP27_UNUSED        MPP(27, 0x1, 0, 0, 1)  #define MPP28_GPIO        MPP(28, 0x0, 1, 1, 1) -#define MPP28_UA3_TXD        MPP(28, 0x4, 0, 1, 1) -#define MPP28_TDM_DRX        MPP(28, 0x6, 1, 0, 1) +#define MPP28_UA3_TXD        MPP(28, 0x4, 0, 0, 1) +#define MPP28_TDM_DRX        MPP(28, 0x6, 0, 0, 1)  #define MPP28_UNUSED        MPP(28, 0x1, 0, 0, 1)  #define MPP29_GPIO        MPP(29, 0x0, 1, 1, 1) -#define MPP29_UA3_RXD        MPP(29, 0x4, 1, 0, 1) -#define MPP29_SYSRST_OUTn    MPP(29, 0x5, 0, 1, 1) -#define MPP29_TDM_DTX        MPP(29, 0x6, 0, 1, 1) +#define MPP29_UA3_RXD        MPP(29, 0x4, 0, 0, 1) +#define MPP29_SYSRST_OUTn    MPP(29, 0x5, 0, 0, 1) +#define MPP29_TDM_DTX        MPP(29, 0x6, 0, 0, 1)  #define MPP29_UNUSED        MPP(29, 0x1, 0, 0, 1)  #define MPP30_GPIO        MPP(30, 0x0, 1, 1, 1) -#define MPP30_UA3_CTSn        MPP(30, 0x4, 1, 0, 1) +#define MPP30_UA3_CTSn        MPP(30, 0x4, 0, 0, 1)  #define MPP30_UNUSED        MPP(30, 0x1, 0, 0, 1)  #define MPP31_GPIO        MPP(31, 0x0, 1, 1, 1) -#define MPP31_UA3_RTSn        MPP(31, 0x4, 0, 1, 1) -#define MPP31_TDM1_SCSn        MPP(31, 0x6, 0, 1, 1) +#define MPP31_UA3_RTSn        MPP(31, 0x4, 0, 0, 1) +#define MPP31_TDM1_SCSn        MPP(31, 0x6, 0, 0, 1)  #define MPP31_UNUSED        MPP(31, 0x1, 0, 0, 1)  #define MPP32_GPIO        MPP(32, 0x1, 1, 1, 1) -#define MPP32_UA3_TDX        MPP(32, 0x4, 0, 1, 1) -#define MPP32_SYSRST_OUTn    MPP(32, 0x5, 0, 1, 1) -#define MPP32_TDM0_RXQ        MPP(32, 0x6, 0, 1, 1) +#define MPP32_UA3_TDX        MPP(32, 0x4, 0, 0, 1) +#define MPP32_SYSRST_OUTn    MPP(32, 0x5, 0, 0, 1) +#define MPP32_TDM0_RXQ        MPP(32, 0x6, 0, 0, 1)  #define MPP32_UNUSED        MPP(32, 0x3, 0, 0, 1)  #define MPP33_GPIO        MPP(33, 0x1, 1, 1, 1) -#define MPP33_UA3_RDX        MPP(33, 0x4, 1, 0, 1) -#define MPP33_TDM0_TXQ        MPP(33, 0x6, 0, 1, 1) +#define MPP33_UA3_RDX        MPP(33, 0x4, 0, 0, 1) +#define MPP33_TDM0_TXQ        MPP(33, 0x6, 0, 0, 1)  #define MPP33_UNUSED        MPP(33, 0x3, 0, 0, 1)  #define MPP34_GPIO        MPP(34, 0x1, 1, 1, 1) -#define MPP34_UA2_TDX        MPP(34, 0x4, 0, 1, 1) -#define MPP34_TDM1_RXQ        MPP(34, 0x6, 0, 1, 1) +#define MPP34_UA2_TDX        MPP(34, 0x4, 0, 0, 1) +#define MPP34_TDM1_RXQ        MPP(34, 0x6, 0, 0, 1)  #define MPP34_UNUSED        MPP(34, 0x3, 0, 0, 1)  #define MPP35_GPIO        MPP(35, 0x1, 1, 1, 1) -#define MPP35_UA2_RDX        MPP(35, 0x4, 1, 0, 1) -#define MPP35_TDM1_TXQ        MPP(35, 0x6, 0, 1, 1) +#define MPP35_UA2_RDX        MPP(35, 0x4, 0, 0, 1) +#define MPP35_TDM1_TXQ        MPP(35, 0x6, 0, 0, 1)  #define MPP35_UNUSED        MPP(35, 0x3, 0, 0, 1)  #define MPP36_GPIO        MPP(36, 0x1, 1, 1, 1) -#define MPP36_UA0_CTSn        MPP(36, 0x2, 1, 0, 1) -#define MPP36_UA2_TDX        MPP(36, 0x4, 0, 1, 1) -#define MPP36_TDM0_SCSn        MPP(36, 0x6, 0, 1, 1) +#define MPP36_UA0_CTSn        MPP(36, 0x2, 0, 0, 1) +#define MPP36_UA2_TDX        MPP(36, 0x4, 0, 0, 1) +#define MPP36_TDM0_SCSn        MPP(36, 0x6, 0, 0, 1)  #define MPP36_UNUSED        MPP(36, 0x3, 0, 0, 1)  #define MPP37_GPIO        MPP(37, 0x1, 1, 1, 1) -#define MPP37_UA0_RTSn        MPP(37, 0x2, 0, 1, 1) -#define MPP37_UA2_RXD        MPP(37, 0x4, 1, 0, 1) -#define MPP37_SYSRST_OUTn    MPP(37, 0x5, 0, 1, 1) -#define MPP37_TDM_SCLK        MPP(37, 0x6, 0, 1, 1) +#define MPP37_UA0_RTSn        MPP(37, 0x2, 0, 0, 1) +#define MPP37_UA2_RXD        MPP(37, 0x4, 0, 0, 1) +#define MPP37_SYSRST_OUTn    MPP(37, 0x5, 0, 0, 1) +#define MPP37_TDM_SCLK        MPP(37, 0x6, 0, 0, 1)  #define MPP37_UNUSED        MPP(37, 0x3, 0, 0, 1)  #define MPP38_GPIO        MPP(38, 0x1, 1, 1, 1) -#define MPP38_UA1_CTSn        MPP(38, 0x2, 1, 0, 1) -#define MPP38_UA3_TXD        MPP(38, 0x4, 0, 1, 1) -#define MPP38_SYSRST_OUTn    MPP(38, 0x5, 0, 1, 1) -#define MPP38_TDM_SMOSI        MPP(38, 0x6, 0, 1, 1) +#define MPP38_UA1_CTSn        MPP(38, 0x2, 0, 0, 1) +#define MPP38_UA3_TXD        MPP(38, 0x4, 0, 0, 1) +#define MPP38_SYSRST_OUTn    MPP(38, 0x5, 0, 0, 1) +#define MPP38_TDM_SMOSI        MPP(38, 0x6, 0, 0, 1)  #define MPP38_UNUSED        MPP(38, 0x3, 0, 0, 1)  #define MPP39_GPIO        MPP(39, 0x1, 1, 1, 1) -#define MPP39_UA1_RTSn        MPP(39, 0x2, 0, 1, 1) -#define MPP39_UA3_RXD        MPP(39, 0x4, 1, 0, 1) -#define MPP39_SYSRST_OUTn    MPP(39, 0x5, 0, 1, 1) -#define MPP39_TDM_SMISO        MPP(39, 0x6, 1, 0, 1) +#define MPP39_UA1_RTSn        MPP(39, 0x2, 0, 0, 1) +#define MPP39_UA3_RXD        MPP(39, 0x4, 0, 0, 1) +#define MPP39_SYSRST_OUTn    MPP(39, 0x5, 0, 0, 1) +#define MPP39_TDM_SMISO        MPP(39, 0x6, 0, 0, 1)  #define MPP39_UNUSED        MPP(39, 0x3, 0, 0, 1)  #define MPP40_GPIO        MPP(40, 0x1, 1, 1, 1) -#define MPP40_TDM_INTn        MPP(40, 0x6, 1, 0, 1) +#define MPP40_TDM_INTn        MPP(40, 0x6, 0, 0, 1)  #define MPP40_UNUSED        MPP(40, 0x0, 0, 0, 1)  #define MPP41_GPIO        MPP(41, 0x1, 1, 1, 1) -#define MPP41_TDM_RSTn        MPP(41, 0x6, 0, 1, 1) +#define MPP41_TDM_RSTn        MPP(41, 0x6, 0, 0, 1)  #define MPP41_UNUSED        MPP(41, 0x0, 0, 0, 1)  #define MPP42_GPIO        MPP(42, 0x1, 1, 1, 1) -#define MPP42_TDM_PCLK        MPP(42, 0x6, 1, 1, 1) +#define MPP42_TDM_PCLK        MPP(42, 0x6, 0, 0, 1)  #define MPP42_UNUSED        MPP(42, 0x0, 0, 0, 1)  #define MPP43_GPIO        MPP(43, 0x1, 1, 1, 1) -#define MPP43_TDM_FSYNC        MPP(43, 0x6, 1, 1, 1) +#define MPP43_TDM_FSYNC        MPP(43, 0x6, 0, 0, 1)  #define MPP43_UNUSED        MPP(43, 0x0, 0, 0, 1)  #define MPP44_GPIO        MPP(44, 0x1, 1, 1, 1) -#define MPP44_TDM_DRX        MPP(44, 0x6, 1, 0, 1) +#define MPP44_TDM_DRX        MPP(44, 0x6, 0, 0, 1)  #define MPP44_UNUSED        MPP(44, 0x0, 0, 0, 1)  #define MPP45_GPIO        MPP(45, 0x1, 1, 1, 1) -#define MPP45_SATA0_ACTn    MPP(45, 0x3, 0, 1, 1) -#define MPP45_TDM_DRX        MPP(45, 0x6, 0, 1, 1) +#define MPP45_SATA0_ACTn    MPP(45, 0x3, 0, 0, 1) +#define MPP45_TDM_DRX        MPP(45, 0x6, 0, 0, 1)  #define MPP45_UNUSED        MPP(45, 0x0, 0, 0, 1)  #define MPP46_GPIO        MPP(46, 0x1, 1, 1, 1) -#define MPP46_TDM_SCSn        MPP(46, 0x6, 0, 1, 1) +#define MPP46_TDM_SCSn        MPP(46, 0x6, 0, 0, 1)  #define MPP46_UNUSED        MPP(46, 0x0, 0, 0, 1) @@ -323,14 +323,14 @@  #define MPP48_GPIO        MPP(48, 0x1, 1, 1, 1) -#define MPP48_SATA1_ACTn    MPP(48, 0x3, 0, 1, 1) +#define MPP48_SATA1_ACTn    MPP(48, 0x3, 0, 0, 1)  #define MPP48_UNUSED        MPP(48, 0x2, 0, 0, 1)  #define MPP49_GPIO        MPP(49, 0x1, 1, 1, 1) -#define MPP49_SATA0_ACTn    MPP(49, 0x3, 0, 1, 1) -#define MPP49_M_BB        MPP(49, 0x4, 1, 0, 1) +#define MPP49_SATA0_ACTn    MPP(49, 0x3, 0, 0, 1) +#define MPP49_M_BB        MPP(49, 0x4, 0, 0, 1)  #define MPP49_UNUSED        MPP(49, 0x2, 0, 0, 1) diff --git a/arch/arm/mach-omap2/Kconfig b/arch/arm/mach-omap2/Kconfig index d965da45160..72ce50ecf32 100644 --- a/arch/arm/mach-omap2/Kconfig +++ b/arch/arm/mach-omap2/Kconfig @@ -117,7 +117,6 @@ comment "OMAP Board Type"  config MACH_OMAP_GENERIC  	bool "Generic OMAP2+ board"  	depends on ARCH_OMAP2PLUS -	select USE_OF  	default y  	help  	  Support for generic TI OMAP2+ boards using Flattened Device Tree. diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile index fc9b238cbc1..bd76394ccaf 100644 --- a/arch/arm/mach-omap2/Makefile +++ b/arch/arm/mach-omap2/Makefile @@ -11,9 +11,9 @@ hwmod-common				= omap_hwmod.o \  					  omap_hwmod_common_data.o  clock-common				= clock.o clock_common_data.o \  					  clkt_dpll.o clkt_clksel.o -secure-common                          = omap-smc.o omap-secure.o +secure-common				= omap-smc.o omap-secure.o -obj-$(CONFIG_ARCH_OMAP2) += $(omap-2-3-common) $(hwmod-common) $(secure-common) +obj-$(CONFIG_ARCH_OMAP2) += $(omap-2-3-common) $(hwmod-common)  obj-$(CONFIG_ARCH_OMAP3) += $(omap-2-3-common) $(hwmod-common) $(secure-common)  obj-$(CONFIG_ARCH_OMAP4) += prm44xx.o $(hwmod-common) $(secure-common) diff --git a/arch/arm/mach-omap2/board-cm-t35.c b/arch/arm/mach-omap2/board-cm-t35.c index e921e3be24a..d73316ed420 100644 --- a/arch/arm/mach-omap2/board-cm-t35.c +++ b/arch/arm/mach-omap2/board-cm-t35.c @@ -437,7 +437,7 @@ static struct usbhs_omap_board_data usbhs_bdata __initdata = {  	.reset_gpio_port[2]  = -EINVAL  }; -static void cm_t35_init_usbh(void) +static void  __init cm_t35_init_usbh(void)  {  	int err; diff --git a/arch/arm/mach-omap2/board-generic.c b/arch/arm/mach-omap2/board-generic.c index 00b1d024fa8..02d7e828a14 100644 --- a/arch/arm/mach-omap2/board-generic.c +++ b/arch/arm/mach-omap2/board-generic.c @@ -17,6 +17,7 @@  #include <linux/i2c/twl.h>  #include <mach/hardware.h> +#include <asm/hardware/gic.h>  #include <asm/mach/arch.h>  #include <plat/board.h> @@ -90,18 +91,18 @@ static void __init omap3_init(void)  }  #endif -#if defined(CONFIG_SOC_OMAP2420) +#ifdef CONFIG_SOC_OMAP2420  static const char *omap242x_boards_compat[] __initdata = {  	"ti,omap2420",  	NULL,  };  DT_MACHINE_START(OMAP242X_DT, "Generic OMAP2420 (Flattened Device Tree)") -	.atag_offset	= 0x100,  	.reserve	= omap_reserve,  	.map_io		= omap242x_map_io,  	.init_early	= omap2420_init_early,  	.init_irq	= omap2_init_irq, +	.handle_irq	= omap2_intc_handle_irq,  	.init_machine	= omap_generic_init,  	.timer		= &omap2_timer,  	.dt_compat	= omap242x_boards_compat, @@ -109,14 +110,13 @@ DT_MACHINE_START(OMAP242X_DT, "Generic OMAP2420 (Flattened Device Tree)")  MACHINE_END  #endif -#if defined(CONFIG_SOC_OMAP2430) +#ifdef CONFIG_SOC_OMAP2430  static const char *omap243x_boards_compat[] __initdata = {  	"ti,omap2430",  	NULL,  };  DT_MACHINE_START(OMAP243X_DT, "Generic OMAP2430 (Flattened Device Tree)") -	.atag_offset	= 0x100,  	.reserve	= omap_reserve,  	.map_io		= omap243x_map_io,  	.init_early	= omap2430_init_early, @@ -129,18 +129,18 @@ DT_MACHINE_START(OMAP243X_DT, "Generic OMAP2430 (Flattened Device Tree)")  MACHINE_END  #endif -#if defined(CONFIG_ARCH_OMAP3) +#ifdef CONFIG_ARCH_OMAP3  static const char *omap3_boards_compat[] __initdata = {  	"ti,omap3",  	NULL,  };  DT_MACHINE_START(OMAP3_DT, "Generic OMAP3 (Flattened Device Tree)") -	.atag_offset	= 0x100,  	.reserve	= omap_reserve,  	.map_io		= omap3_map_io,  	.init_early	= omap3430_init_early,  	.init_irq	= omap3_init_irq, +	.handle_irq	= omap3_intc_handle_irq,  	.init_machine	= omap3_init,  	.timer		= &omap3_timer,  	.dt_compat	= omap3_boards_compat, @@ -148,18 +148,18 @@ DT_MACHINE_START(OMAP3_DT, "Generic OMAP3 (Flattened Device Tree)")  MACHINE_END  #endif -#if defined(CONFIG_ARCH_OMAP4) +#ifdef CONFIG_ARCH_OMAP4  static const char *omap4_boards_compat[] __initdata = {  	"ti,omap4",  	NULL,  };  DT_MACHINE_START(OMAP4_DT, "Generic OMAP4 (Flattened Device Tree)") -	.atag_offset	= 0x100,  	.reserve	= omap_reserve,  	.map_io		= omap4_map_io,  	.init_early	= omap4430_init_early,  	.init_irq	= gic_init_irq, +	.handle_irq	= gic_handle_irq,  	.init_machine	= omap4_init,  	.timer		= &omap4_timer,  	.dt_compat	= omap4_boards_compat, diff --git a/arch/arm/mach-omap2/pm.c b/arch/arm/mach-omap2/pm.c index 1881fe91514..ad4f6939416 100644 --- a/arch/arm/mach-omap2/pm.c +++ b/arch/arm/mach-omap2/pm.c @@ -227,6 +227,14 @@ postcore_initcall(omap2_common_pm_init);  static int __init omap2_common_pm_late_init(void)  { +	/* +	 * In the case of DT, the PMIC and SR initialization will be done using +	 * a completely different mechanism. +	 * Disable this part if a DT blob is available. +	 */ +	if (of_have_populated_dt()) +		return 0; +  	/* Init the voltage layer */  	omap_pmic_late_init();  	omap_voltage_late_init(); diff --git a/arch/arm/mach-omap2/pm24xx.c b/arch/arm/mach-omap2/pm24xx.c index b8822f8b289..23de98d0384 100644 --- a/arch/arm/mach-omap2/pm24xx.c +++ b/arch/arm/mach-omap2/pm24xx.c @@ -82,13 +82,7 @@ static int omap2_fclks_active(void)  	f1 = omap2_cm_read_mod_reg(CORE_MOD, CM_FCLKEN1);  	f2 = omap2_cm_read_mod_reg(CORE_MOD, OMAP24XX_CM_FCLKEN2); -	/* Ignore UART clocks.  These are handled by UART core (serial.c) */ -	f1 &= ~(OMAP24XX_EN_UART1_MASK | OMAP24XX_EN_UART2_MASK); -	f2 &= ~OMAP24XX_EN_UART3_MASK; - -	if (f1 | f2) -		return 1; -	return 0; +	return (f1 | f2) ? 1 : 0;  }  static void omap2_enter_full_retention(void) diff --git a/arch/arm/mach-orion5x/common.c b/arch/arm/mach-orion5x/common.c index 0e28bae20bd..5dad38ec00e 100644 --- a/arch/arm/mach-orion5x/common.c +++ b/arch/arm/mach-orion5x/common.c @@ -29,6 +29,7 @@  #include <mach/hardware.h>  #include <mach/orion5x.h>  #include <plat/orion_nand.h> +#include <plat/ehci-orion.h>  #include <plat/time.h>  #include <plat/common.h>  #include <plat/addr-map.h> @@ -72,7 +73,8 @@ void __init orion5x_map_io(void)   ****************************************************************************/  void __init orion5x_ehci0_init(void)  { -	orion_ehci_init(ORION5X_USB0_PHYS_BASE, IRQ_ORION5X_USB0_CTRL); +	orion_ehci_init(ORION5X_USB0_PHYS_BASE, IRQ_ORION5X_USB0_CTRL, +			EHCI_PHY_ORION);  } diff --git a/arch/arm/mach-s3c2410/cpu-freq.c b/arch/arm/mach-s3c2410/cpu-freq.c index 7dc6c46b5e2..5404535da1a 100644 --- a/arch/arm/mach-s3c2410/cpu-freq.c +++ b/arch/arm/mach-s3c2410/cpu-freq.c @@ -115,7 +115,8 @@ static struct s3c_cpufreq_info s3c2410_cpufreq_info = {  	.debug_io_show	= s3c_cpufreq_debugfs_call(s3c2410_iotiming_debugfs),  }; -static int s3c2410_cpufreq_add(struct device *dev) +static int s3c2410_cpufreq_add(struct device *dev, +			       struct subsys_interface *sif)  {  	return s3c_cpufreq_register(&s3c2410_cpufreq_info);  } @@ -133,7 +134,8 @@ static int __init s3c2410_cpufreq_init(void)  arch_initcall(s3c2410_cpufreq_init); -static int s3c2410a_cpufreq_add(struct device *dev) +static int s3c2410a_cpufreq_add(struct device *dev, +				struct subsys_interface *sif)  {  	/* alter the maximum freq settings for S3C2410A. If a board knows  	 * it only has a maximum of 200, then it should register its own @@ -144,7 +146,7 @@ static int s3c2410a_cpufreq_add(struct device *dev)  	s3c2410_cpufreq_info.max.pclk =  66500000;  	s3c2410_cpufreq_info.name = "s3c2410a"; -	return s3c2410_cpufreq_add(dev); +	return s3c2410_cpufreq_add(dev, sif);  }  static struct subsys_interface s3c2410a_cpufreq_interface = { diff --git a/arch/arm/mach-s3c2410/dma.c b/arch/arm/mach-s3c2410/dma.c index 2afd00014a7..4803338cf56 100644 --- a/arch/arm/mach-s3c2410/dma.c +++ b/arch/arm/mach-s3c2410/dma.c @@ -132,7 +132,8 @@ static struct s3c24xx_dma_order __initdata s3c2410_dma_order = {  	},  }; -static int __init s3c2410_dma_add(struct device *dev) +static int __init s3c2410_dma_add(struct device *dev, +				  struct subsys_interface *sif)  {  	s3c2410_dma_init();  	s3c24xx_dma_order_set(&s3c2410_dma_order); @@ -148,7 +149,7 @@ static struct subsys_interface s3c2410_dma_interface = {  static int __init s3c2410_dma_drvinit(void)  { -	return subsys_interface_register(&s3c2410_interface); +	return subsys_interface_register(&s3c2410_dma_interface);  }  arch_initcall(s3c2410_dma_drvinit); diff --git a/arch/arm/mach-s3c2410/pll.c b/arch/arm/mach-s3c2410/pll.c index c07438bfc99..e0b3b347da8 100644 --- a/arch/arm/mach-s3c2410/pll.c +++ b/arch/arm/mach-s3c2410/pll.c @@ -66,7 +66,7 @@ static struct cpufreq_frequency_table pll_vals_12MHz[] = {      { .frequency = 270000000, .index = PLLVAL(127, 1, 1),  },  }; -static int s3c2410_plls_add(struct device *dev) +static int s3c2410_plls_add(struct device *dev, struct subsys_interface *sif)  {  	return s3c_plltab_register(pll_vals_12MHz, ARRAY_SIZE(pll_vals_12MHz));  } diff --git a/arch/arm/mach-s3c2410/pm.c b/arch/arm/mach-s3c2410/pm.c index fda5385deff..03f706dd600 100644 --- a/arch/arm/mach-s3c2410/pm.c +++ b/arch/arm/mach-s3c2410/pm.c @@ -111,7 +111,7 @@ struct syscore_ops s3c2410_pm_syscore_ops = {  	.resume		= s3c2410_pm_resume,  }; -static int s3c2410_pm_add(struct device *dev) +static int s3c2410_pm_add(struct device *dev, struct subsys_interface *sif)  {  	pm_cpu_prep = s3c2410_pm_prepare;  	pm_cpu_sleep = s3c2410_cpu_suspend; diff --git a/arch/arm/mach-s3c2412/cpu-freq.c b/arch/arm/mach-s3c2412/cpu-freq.c index d8664b7652c..125be7d5fa6 100644 --- a/arch/arm/mach-s3c2412/cpu-freq.c +++ b/arch/arm/mach-s3c2412/cpu-freq.c @@ -194,7 +194,8 @@ static struct s3c_cpufreq_info s3c2412_cpufreq_info = {  	.debug_io_show  = s3c_cpufreq_debugfs_call(s3c2412_iotiming_debugfs),  }; -static int s3c2412_cpufreq_add(struct device *dev) +static int s3c2412_cpufreq_add(struct device *dev, +			       struct subsys_interface *sif)  {  	unsigned long fclk_rate; diff --git a/arch/arm/mach-s3c2412/dma.c b/arch/arm/mach-s3c2412/dma.c index 142acd3b5e1..38472ac920f 100644 --- a/arch/arm/mach-s3c2412/dma.c +++ b/arch/arm/mach-s3c2412/dma.c @@ -159,7 +159,8 @@ static struct s3c24xx_dma_selection __initdata s3c2412_dma_sel = {  	.map_size	= ARRAY_SIZE(s3c2412_dma_mappings),  }; -static int __init s3c2412_dma_add(struct device *dev) +static int __init s3c2412_dma_add(struct device *dev, +				  struct subsys_interface *sif)  {  	s3c2410_dma_init();  	return s3c24xx_dma_init_map(&s3c2412_dma_sel); diff --git a/arch/arm/mach-s3c2412/irq.c b/arch/arm/mach-s3c2412/irq.c index a8a46c1644f..e65619ddbcc 100644 --- a/arch/arm/mach-s3c2412/irq.c +++ b/arch/arm/mach-s3c2412/irq.c @@ -170,7 +170,7 @@ static int s3c2412_irq_rtc_wake(struct irq_data *data, unsigned int state)  static struct irq_chip s3c2412_irq_rtc_chip; -static int s3c2412_irq_add(struct device *dev) +static int s3c2412_irq_add(struct device *dev, struct subsys_interface *sif)  {  	unsigned int irqno; diff --git a/arch/arm/mach-s3c2412/pm.c b/arch/arm/mach-s3c2412/pm.c index d1adfa65f66..d04588506ec 100644 --- a/arch/arm/mach-s3c2412/pm.c +++ b/arch/arm/mach-s3c2412/pm.c @@ -56,7 +56,7 @@ static void s3c2412_pm_prepare(void)  {  } -static int s3c2412_pm_add(struct device *dev) +static int s3c2412_pm_add(struct device *dev, struct subsys_interface *sif)  {  	pm_cpu_prep = s3c2412_pm_prepare;  	pm_cpu_sleep = s3c2412_cpu_suspend; diff --git a/arch/arm/mach-s3c2416/irq.c b/arch/arm/mach-s3c2416/irq.c index 36df761061d..fd49f35e448 100644 --- a/arch/arm/mach-s3c2416/irq.c +++ b/arch/arm/mach-s3c2416/irq.c @@ -213,7 +213,8 @@ static int __init s3c2416_add_sub(unsigned int base,  	return 0;  } -static int __init s3c2416_irq_add(struct device *dev) +static int __init s3c2416_irq_add(struct device *dev, +				  struct subsys_interface *sif)  {  	printk(KERN_INFO "S3C2416: IRQ Support\n"); diff --git a/arch/arm/mach-s3c2416/pm.c b/arch/arm/mach-s3c2416/pm.c index 3bdb15a0d41..1bd4817b8eb 100644 --- a/arch/arm/mach-s3c2416/pm.c +++ b/arch/arm/mach-s3c2416/pm.c @@ -48,7 +48,7 @@ static void s3c2416_pm_prepare(void)  	__raw_writel(virt_to_phys(s3c_cpu_resume), S3C2412_INFORM1);  } -static int s3c2416_pm_add(struct device *dev) +static int s3c2416_pm_add(struct device *dev, struct subsys_interface *sif)  {  	pm_cpu_prep = s3c2416_pm_prepare;  	pm_cpu_sleep = s3c2416_cpu_suspend; diff --git a/arch/arm/mach-s3c2440/clock.c b/arch/arm/mach-s3c2440/clock.c index bedbc87a342..414364eb426 100644 --- a/arch/arm/mach-s3c2440/clock.c +++ b/arch/arm/mach-s3c2440/clock.c @@ -149,7 +149,7 @@ static struct clk_lookup s3c2440_clk_lookup[] = {  	CLKDEV_INIT(NULL, "clk_uart_baud3", &s3c2440_clk_fclk_n),  }; -static int s3c2440_clk_add(struct device *dev) +static int s3c2440_clk_add(struct device *dev, struct subsys_interface *sif)  {  	struct clk *clock_upll;  	struct clk *clock_h; diff --git a/arch/arm/mach-s3c2440/dma.c b/arch/arm/mach-s3c2440/dma.c index 15b1ddf8f62..5f0a0c8ef84 100644 --- a/arch/arm/mach-s3c2440/dma.c +++ b/arch/arm/mach-s3c2440/dma.c @@ -174,7 +174,8 @@ static struct s3c24xx_dma_order __initdata s3c2440_dma_order = {  	},  }; -static int __init s3c2440_dma_add(struct device *dev) +static int __init s3c2440_dma_add(struct device *dev, +				  struct subsys_interface *sif)  {  	s3c2410_dma_init();  	s3c24xx_dma_order_set(&s3c2440_dma_order); diff --git a/arch/arm/mach-s3c2440/irq.c b/arch/arm/mach-s3c2440/irq.c index 4fee9bc6bcb..4a18cde439c 100644 --- a/arch/arm/mach-s3c2440/irq.c +++ b/arch/arm/mach-s3c2440/irq.c @@ -92,7 +92,7 @@ static struct irq_chip s3c_irq_wdtac97 = {  	.irq_ack	= s3c_irq_wdtac97_ack,  }; -static int s3c2440_irq_add(struct device *dev) +static int s3c2440_irq_add(struct device *dev, struct subsys_interface *sif)  {  	unsigned int irqno; diff --git a/arch/arm/mach-s3c2440/s3c2440-cpufreq.c b/arch/arm/mach-s3c2440/s3c2440-cpufreq.c index cf7596694ef..61776764d9f 100644 --- a/arch/arm/mach-s3c2440/s3c2440-cpufreq.c +++ b/arch/arm/mach-s3c2440/s3c2440-cpufreq.c @@ -270,7 +270,8 @@ struct s3c_cpufreq_info s3c2440_cpufreq_info = {  	.debug_io_show  = s3c_cpufreq_debugfs_call(s3c2410_iotiming_debugfs),  }; -static int s3c2440_cpufreq_add(struct device *dev) +static int s3c2440_cpufreq_add(struct device *dev, +			       struct subsys_interface *sif)  {  	xtal = s3c_cpufreq_clk_get(NULL, "xtal");  	hclk = s3c_cpufreq_clk_get(NULL, "hclk"); diff --git a/arch/arm/mach-s3c2440/s3c2440-pll-12000000.c b/arch/arm/mach-s3c2440/s3c2440-pll-12000000.c index b5368ae8d7f..551fb433be8 100644 --- a/arch/arm/mach-s3c2440/s3c2440-pll-12000000.c +++ b/arch/arm/mach-s3c2440/s3c2440-pll-12000000.c @@ -51,7 +51,7 @@ static struct cpufreq_frequency_table s3c2440_plls_12[] __initdata = {  	{ .frequency = 400000000,	.index = PLLVAL(0x5c, 1, 1),  }, 	/* FVco 800.000000 */  }; -static int s3c2440_plls12_add(struct device *dev) +static int s3c2440_plls12_add(struct device *dev, struct subsys_interface *sif)  {  	struct clk *xtal_clk;  	unsigned long xtal; diff --git a/arch/arm/mach-s3c2440/s3c2440-pll-16934400.c b/arch/arm/mach-s3c2440/s3c2440-pll-16934400.c index 42f2b5cd239..3f15bcf6429 100644 --- a/arch/arm/mach-s3c2440/s3c2440-pll-16934400.c +++ b/arch/arm/mach-s3c2440/s3c2440-pll-16934400.c @@ -79,7 +79,8 @@ static struct cpufreq_frequency_table s3c2440_plls_169344[] __initdata = {  	{ .frequency = 402192000,	.index = PLLVAL(87, 2, 1), 	}, 	/* FVco 804.384000 */  }; -static int s3c2440_plls169344_add(struct device *dev) +static int s3c2440_plls169344_add(struct device *dev, +				  struct subsys_interface *sif)  {  	struct clk *xtal_clk;  	unsigned long xtal; diff --git a/arch/arm/mach-s3c2440/s3c2442.c b/arch/arm/mach-s3c2440/s3c2442.c index 8004e0497bf..22cb7c94a8c 100644 --- a/arch/arm/mach-s3c2440/s3c2442.c +++ b/arch/arm/mach-s3c2440/s3c2442.c @@ -122,7 +122,7 @@ static struct clk s3c2442_clk_cam_upll = {  	},  }; -static int s3c2442_clk_add(struct device *dev) +static int s3c2442_clk_add(struct device *dev, struct subsys_interface *sif)  {  	struct clk *clock_upll;  	struct clk *clock_h; diff --git a/arch/arm/mach-s3c2440/s3c244x-clock.c b/arch/arm/mach-s3c2440/s3c244x-clock.c index b3fdbdda3d5..6d9b688c442 100644 --- a/arch/arm/mach-s3c2440/s3c244x-clock.c +++ b/arch/arm/mach-s3c2440/s3c244x-clock.c @@ -72,7 +72,7 @@ static struct clk clk_arm = {  	},  }; -static int s3c244x_clk_add(struct device *dev) +static int s3c244x_clk_add(struct device *dev, struct subsys_interface *sif)  {  	unsigned long camdivn = __raw_readl(S3C2440_CAMDIVN);  	unsigned long clkdivn; diff --git a/arch/arm/mach-s3c2440/s3c244x-irq.c b/arch/arm/mach-s3c2440/s3c244x-irq.c index 74d3dcf46a4..5fe8e58d3af 100644 --- a/arch/arm/mach-s3c2440/s3c244x-irq.c +++ b/arch/arm/mach-s3c2440/s3c244x-irq.c @@ -91,7 +91,7 @@ static struct irq_chip s3c_irq_cam = {  	.irq_ack	= s3c_irq_cam_ack,  }; -static int s3c244x_irq_add(struct device *dev) +static int s3c244x_irq_add(struct device *dev, struct subsys_interface *sif)  {  	unsigned int irqno; diff --git a/arch/arm/mach-s3c2443/dma.c b/arch/arm/mach-s3c2443/dma.c index de6b4a23c9e..14224517e62 100644 --- a/arch/arm/mach-s3c2443/dma.c +++ b/arch/arm/mach-s3c2443/dma.c @@ -135,7 +135,8 @@ static struct s3c24xx_dma_selection __initdata s3c2443_dma_sel = {  	.map_size	= ARRAY_SIZE(s3c2443_dma_mappings),  }; -static int __init s3c2443_dma_add(struct device *dev) +static int __init s3c2443_dma_add(struct device *dev, +				  struct subsys_interface *sif)  {  	s3c24xx_dma_init(6, IRQ_S3C2443_DMA0, 0x100);  	return s3c24xx_dma_init_map(&s3c2443_dma_sel); diff --git a/arch/arm/mach-s3c2443/irq.c b/arch/arm/mach-s3c2443/irq.c index 35e4ff24fb4..ac2829f56d1 100644 --- a/arch/arm/mach-s3c2443/irq.c +++ b/arch/arm/mach-s3c2443/irq.c @@ -241,7 +241,8 @@ static int __init s3c2443_add_sub(unsigned int base,  	return 0;  } -static int __init s3c2443_irq_add(struct device *dev) +static int __init s3c2443_irq_add(struct device *dev, +				  struct subsys_interface *sif)  {  	printk("S3C2443: IRQ Support\n"); diff --git a/arch/arm/mach-s3c64xx/clock.c b/arch/arm/mach-s3c64xx/clock.c index 31bb27dc4ae..aebbcc291b4 100644 --- a/arch/arm/mach-s3c64xx/clock.c +++ b/arch/arm/mach-s3c64xx/clock.c @@ -138,6 +138,11 @@ static struct clk init_clocks_off[] = {  		.ctrlbit	= S3C_CLKCON_PCLK_TSADC,  	}, {  		.name		= "i2c", +#ifdef CONFIG_S3C_DEV_I2C1 +		.devname        = "s3c2440-i2c.0", +#else +		.devname	= "s3c2440-i2c", +#endif  		.parent		= &clk_p,  		.enable		= s3c64xx_pclk_ctrl,  		.ctrlbit	= S3C_CLKCON_PCLK_IIC, diff --git a/arch/arm/mach-s3c64xx/common.c b/arch/arm/mach-s3c64xx/common.c index 4a7394d4bd9..bee7dcd4df7 100644 --- a/arch/arm/mach-s3c64xx/common.c +++ b/arch/arm/mach-s3c64xx/common.c @@ -49,7 +49,7 @@  /* uart registration process */ -void __init s3c64xx_init_uarts(struct s3c2410_uartcfg *cfg, int no) +static void __init s3c64xx_init_uarts(struct s3c2410_uartcfg *cfg, int no)  {  	s3c24xx_init_uartdevs("s3c6400-uart", s3c64xx_uart_resources, cfg, no);  } diff --git a/arch/arm/mach-s5p64x0/pm.c b/arch/arm/mach-s5p64x0/pm.c index 23f9b22439c..9cba18bfe47 100644 --- a/arch/arm/mach-s5p64x0/pm.c +++ b/arch/arm/mach-s5p64x0/pm.c @@ -160,7 +160,7 @@ static void s5p64x0_pm_prepare(void)  } -static int s5p64x0_pm_add(struct device *dev) +static int s5p64x0_pm_add(struct device *dev, struct subsys_interface *sif)  {  	pm_cpu_prep = s5p64x0_pm_prepare;  	pm_cpu_sleep = s5p64x0_cpu_suspend; diff --git a/arch/arm/mach-s5pv210/clock.c b/arch/arm/mach-s5pv210/clock.c index c78dfddd77f..b9ec0c35379 100644 --- a/arch/arm/mach-s5pv210/clock.c +++ b/arch/arm/mach-s5pv210/clock.c @@ -175,7 +175,7 @@ static int s5pv210_clk_mask1_ctrl(struct clk *clk, int enable)  	return s5p_gatectrl(S5P_CLK_SRC_MASK1, clk, enable);  } -static int exynos4_clk_hdmiphy_ctrl(struct clk *clk, int enable) +static int s5pv210_clk_hdmiphy_ctrl(struct clk *clk, int enable)  {  	return s5p_gatectrl(S5P_HDMI_PHY_CONTROL, clk, enable);  } @@ -372,7 +372,7 @@ static struct clk init_clocks_off[] = {  	}, {  		.name		= "hdmiphy",  		.devname	= "s5pv210-hdmi", -		.enable		= exynos4_clk_hdmiphy_ctrl, +		.enable		= s5pv210_clk_hdmiphy_ctrl,  		.ctrlbit	= (1 << 0),  	}, {  		.name		= "dacphy", diff --git a/arch/arm/mach-s5pv210/pm.c b/arch/arm/mach-s5pv210/pm.c index 677c71c41e5..736bfb103cb 100644 --- a/arch/arm/mach-s5pv210/pm.c +++ b/arch/arm/mach-s5pv210/pm.c @@ -133,7 +133,7 @@ static void s5pv210_pm_prepare(void)  	s3c_pm_do_save(s5pv210_core_save, ARRAY_SIZE(s5pv210_core_save));  } -static int s5pv210_pm_add(struct device *dev) +static int s5pv210_pm_add(struct device *dev, struct subsys_interface *sif)  {  	pm_cpu_prep = s5pv210_pm_prepare;  	pm_cpu_sleep = s5pv210_cpu_suspend; diff --git a/arch/arm/mach-tegra/board-paz00.c b/arch/arm/mach-tegra/board-paz00.c index fcf4f377b1d..330afdfa247 100644 --- a/arch/arm/mach-tegra/board-paz00.c +++ b/arch/arm/mach-tegra/board-paz00.c @@ -60,9 +60,9 @@ static struct plat_serial8250_port debug_uart_platform_data[] = {  		.uartclk	= 216000000,  	}, {  		/* serial port on mini-pcie */ -		.membase	= IO_ADDRESS(TEGRA_UARTD_BASE), -		.mapbase	= TEGRA_UARTD_BASE, -		.irq		= INT_UARTD, +		.membase	= IO_ADDRESS(TEGRA_UARTC_BASE), +		.mapbase	= TEGRA_UARTC_BASE, +		.irq		= INT_UARTC,  		.flags		= UPF_BOOT_AUTOCONF | UPF_FIXED_TYPE,  		.type		= PORT_TEGRA,  		.iotype		= UPIO_MEM, @@ -174,7 +174,7 @@ static void __init tegra_paz00_fixup(struct tag *tags, char **cmdline,  static __initdata struct tegra_clk_init_table paz00_clk_init_table[] = {  	/* name		parent		rate		enabled */  	{ "uarta",	"pll_p",	216000000,	true }, -	{ "uartd",	"pll_p",	216000000,	true }, +	{ "uartc",	"pll_p",	216000000,	true },  	{ "pll_p_out4",	"pll_p",	24000000,	true },  	{ "usbd",	"clk_m",	12000000,	false }, diff --git a/arch/arm/mach-tegra/board-paz00.h b/arch/arm/mach-tegra/board-paz00.h index ffa83f580db..3c9f8da37ea 100644 --- a/arch/arm/mach-tegra/board-paz00.h +++ b/arch/arm/mach-tegra/board-paz00.h @@ -22,7 +22,7 @@  /* SDCARD */  #define TEGRA_GPIO_SD1_CD		TEGRA_GPIO_PV5  #define TEGRA_GPIO_SD1_WP		TEGRA_GPIO_PH1 -#define TEGRA_GPIO_SD1_POWER		TEGRA_GPIO_PT3 +#define TEGRA_GPIO_SD1_POWER		TEGRA_GPIO_PV1  /* ULPI */  #define TEGRA_ULPI_RST			TEGRA_GPIO_PV0 diff --git a/arch/arm/mach-tegra/include/mach/dma.h b/arch/arm/mach-tegra/include/mach/dma.h index d0132e8031a..3c9339058be 100644 --- a/arch/arm/mach-tegra/include/mach/dma.h +++ b/arch/arm/mach-tegra/include/mach/dma.h @@ -23,11 +23,6 @@  #include <linux/list.h> -#if defined(CONFIG_TEGRA_SYSTEM_DMA) - -struct tegra_dma_req; -struct tegra_dma_channel; -  #define TEGRA_DMA_REQ_SEL_CNTR			0  #define TEGRA_DMA_REQ_SEL_I2S_2			1  #define TEGRA_DMA_REQ_SEL_I2S_1			2 @@ -56,6 +51,11 @@ struct tegra_dma_channel;  #define TEGRA_DMA_REQ_SEL_OWR			25  #define TEGRA_DMA_REQ_SEL_INVALID		31 +#if defined(CONFIG_TEGRA_SYSTEM_DMA) + +struct tegra_dma_req; +struct tegra_dma_channel; +  enum tegra_dma_mode {  	TEGRA_DMA_SHARED = 1,  	TEGRA_DMA_MODE_CONTINOUS = 2, diff --git a/arch/arm/plat-omap/Kconfig b/arch/arm/plat-omap/Kconfig index aa59f4247dc..f419a082b04 100644 --- a/arch/arm/plat-omap/Kconfig +++ b/arch/arm/plat-omap/Kconfig @@ -14,6 +14,7 @@ config ARCH_OMAP1  	select CLKDEV_LOOKUP  	select CLKSRC_MMIO  	select GENERIC_IRQ_CHIP +	select IRQ_DOMAIN  	select HAVE_IDE  	select NEED_MACH_MEMORY_H  	help @@ -24,6 +25,8 @@ config ARCH_OMAP2PLUS  	select CLKDEV_LOOKUP  	select GENERIC_IRQ_CHIP  	select OMAP_DM_TIMER +	select USE_OF +	select PROC_DEVICETREE if PROC_FS  	help  	  "Systems based on OMAP2, OMAP3 or OMAP4" diff --git a/arch/arm/plat-omap/include/plat/omap-secure.h b/arch/arm/plat-omap/include/plat/omap-secure.h index 64f9d1c7f1b..3047ff923a6 100644 --- a/arch/arm/plat-omap/include/plat/omap-secure.h +++ b/arch/arm/plat-omap/include/plat/omap-secure.h @@ -3,7 +3,7 @@  #include <linux/types.h> -#ifdef CONFIG_ARCH_OMAP2PLUS +#if defined(CONFIG_ARCH_OMAP3) || defined(CONFIG_ARCH_OMAP4)  extern int omap_secure_ram_reserve_memblock(void);  #else  static inline void omap_secure_ram_reserve_memblock(void) diff --git a/arch/arm/plat-omap/omap_device.c b/arch/arm/plat-omap/omap_device.c index e8d98693d2d..69fde03729c 100644 --- a/arch/arm/plat-omap/omap_device.c +++ b/arch/arm/plat-omap/omap_device.c @@ -348,7 +348,7 @@ static int omap_device_build_from_dt(struct platform_device *pdev)  	oh_cnt = of_property_count_strings(node, "ti,hwmods");  	if (!oh_cnt || IS_ERR_VALUE(oh_cnt)) { -		dev_warn(&pdev->dev, "No 'hwmods' to build omap_device\n"); +		dev_dbg(&pdev->dev, "No 'hwmods' to build omap_device\n");  		return -ENODEV;  	} diff --git a/arch/arm/plat-orion/common.c b/arch/arm/plat-orion/common.c index e5a2fde29b1..089899a7db7 100644 --- a/arch/arm/plat-orion/common.c +++ b/arch/arm/plat-orion/common.c @@ -789,10 +789,7 @@ void __init orion_xor1_init(unsigned long mapbase_low,  /*****************************************************************************   * EHCI   ****************************************************************************/ -static struct orion_ehci_data orion_ehci_data = { -	.phy_version	= EHCI_PHY_NA, -}; - +static struct orion_ehci_data orion_ehci_data;  static u64 ehci_dmamask = DMA_BIT_MASK(32); @@ -812,8 +809,10 @@ static struct platform_device orion_ehci = {  };  void __init orion_ehci_init(unsigned long mapbase, -			    unsigned long irq) +			    unsigned long irq, +			    enum orion_ehci_phy_ver phy_version)  { +	orion_ehci_data.phy_version = phy_version;  	fill_resources(&orion_ehci, orion_ehci_resources, mapbase, SZ_4K - 1,  		       irq); diff --git a/arch/arm/plat-orion/include/plat/common.h b/arch/arm/plat-orion/include/plat/common.h index 0fe08d77e83..a7fa005a5a0 100644 --- a/arch/arm/plat-orion/include/plat/common.h +++ b/arch/arm/plat-orion/include/plat/common.h @@ -89,7 +89,8 @@ void __init orion_xor1_init(unsigned long mapbase_low,  			    unsigned long irq_1);  void __init orion_ehci_init(unsigned long mapbase, -			    unsigned long irq); +			    unsigned long irq, +			    enum orion_ehci_phy_ver phy_version);  void __init orion_ehci_1_init(unsigned long mapbase,  			      unsigned long irq); diff --git a/arch/arm/plat-orion/mpp.c b/arch/arm/plat-orion/mpp.c index 91553432711..3b1e17bd3d1 100644 --- a/arch/arm/plat-orion/mpp.c +++ b/arch/arm/plat-orion/mpp.c @@ -64,8 +64,7 @@ void __init orion_mpp_conf(unsigned int *mpp_list, unsigned int variant_mask,  			gpio_mode |= GPIO_INPUT_OK;  		if (*mpp_list & MPP_OUTPUT_MASK)  			gpio_mode |= GPIO_OUTPUT_OK; -		if (sel != 0) -			gpio_mode = 0; +  		orion_gpio_set_valid(num, gpio_mode);  	} diff --git a/arch/arm/plat-samsung/devs.c b/arch/arm/plat-samsung/devs.c index 32a6e394db2..f10768e988d 100644 --- a/arch/arm/plat-samsung/devs.c +++ b/arch/arm/plat-samsung/devs.c @@ -468,8 +468,10 @@ void __init s3c_i2c0_set_platdata(struct s3c2410_platform_i2c *pd)  {  	struct s3c2410_platform_i2c *npd; -	if (!pd) +	if (!pd) {  		pd = &default_i2c_data; +		pd->bus_num = 0; +	}  	npd = s3c_set_platdata(pd, sizeof(struct s3c2410_platform_i2c),  			       &s3c_device_i2c0); diff --git a/arch/powerpc/configs/ppc64_defconfig b/arch/powerpc/configs/ppc64_defconfig index 2156e077859..1acf6502677 100644 --- a/arch/powerpc/configs/ppc64_defconfig +++ b/arch/powerpc/configs/ppc64_defconfig @@ -24,10 +24,6 @@ CONFIG_PPC_SPLPAR=y  CONFIG_SCANLOG=m  CONFIG_PPC_SMLPAR=y  CONFIG_DTL=y -CONFIG_PPC_ISERIES=y -CONFIG_VIODASD=y -CONFIG_VIOCD=m -CONFIG_VIOTAPE=m  CONFIG_PPC_MAPLE=y  CONFIG_PPC_PASEMI=y  CONFIG_PPC_PASEMI_IOMMU=y @@ -259,7 +255,6 @@ CONFIG_PASEMI_MAC=y  CONFIG_MLX4_EN=m  CONFIG_QLGE=m  CONFIG_BE2NET=m -CONFIG_ISERIES_VETH=m  CONFIG_PPP=m  CONFIG_PPP_ASYNC=m  CONFIG_PPP_SYNC_TTY=m diff --git a/arch/powerpc/include/asm/ppc-pci.h b/arch/powerpc/include/asm/ppc-pci.h index 43268f15004..6d422979eba 100644 --- a/arch/powerpc/include/asm/ppc-pci.h +++ b/arch/powerpc/include/asm/ppc-pci.h @@ -142,6 +142,11 @@ static inline const char *eeh_pci_name(struct pci_dev *pdev)  	return pdev ? pci_name(pdev) : "<null>";  }  +static inline const char *eeh_driver_name(struct pci_dev *pdev) +{ +	return (pdev && pdev->driver) ? pdev->driver->name : "<null>"; +} +  #endif /* CONFIG_EEH */  #else /* CONFIG_PCI */ diff --git a/arch/powerpc/include/asm/ptrace.h b/arch/powerpc/include/asm/ptrace.h index 78a205162fd..84cc7840cd1 100644 --- a/arch/powerpc/include/asm/ptrace.h +++ b/arch/powerpc/include/asm/ptrace.h @@ -83,8 +83,18 @@ struct pt_regs {  #ifndef __ASSEMBLY__ -#define instruction_pointer(regs) ((regs)->nip) -#define user_stack_pointer(regs) ((regs)->gpr[1]) +#define GET_IP(regs)		((regs)->nip) +#define GET_USP(regs)		((regs)->gpr[1]) +#define GET_FP(regs)		(0) +#define SET_FP(regs, val) + +#ifdef CONFIG_SMP +extern unsigned long profile_pc(struct pt_regs *regs); +#define profile_pc profile_pc +#endif + +#include <asm-generic/ptrace.h> +  #define kernel_stack_pointer(regs) ((regs)->gpr[1])  static inline int is_syscall_success(struct pt_regs *regs)  { @@ -99,12 +109,6 @@ static inline long regs_return_value(struct pt_regs *regs)  		return -regs->gpr[3];  } -#ifdef CONFIG_SMP -extern unsigned long profile_pc(struct pt_regs *regs); -#else -#define profile_pc(regs) instruction_pointer(regs) -#endif -  #ifdef __powerpc64__  #define user_mode(regs) ((((regs)->msr) >> MSR_PR_LG) & 0x1)  #else diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S index d4be7bb3dbd..3844ca7c509 100644 --- a/arch/powerpc/kernel/exceptions-64s.S +++ b/arch/powerpc/kernel/exceptions-64s.S @@ -775,7 +775,7 @@ program_check_common:  	EXCEPTION_PROLOG_COMMON(0x700, PACA_EXGEN)  	bl	.save_nvgprs  	addi	r3,r1,STACK_FRAME_OVERHEAD -	ENABLE_INTS +	DISABLE_INTS  	bl	.program_check_exception  	b	.ret_from_except diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c index e3673ff6b7a..bdfb3eee3e6 100644 --- a/arch/powerpc/kernel/irq.c +++ b/arch/powerpc/kernel/irq.c @@ -118,10 +118,14 @@ static inline notrace void set_soft_enabled(unsigned long enable)  static inline notrace void decrementer_check_overflow(void)  {  	u64 now = get_tb_or_rtc(); -	u64 *next_tb = &__get_cpu_var(decrementers_next_tb); +	u64 *next_tb; + +	preempt_disable(); +	next_tb = &__get_cpu_var(decrementers_next_tb);  	if (now >= *next_tb)  		set_dec(1); +	preempt_enable();  }  notrace void arch_local_irq_restore(unsigned long en) diff --git a/arch/powerpc/kernel/perf_event.c b/arch/powerpc/kernel/perf_event.c index 10a140f82cb..64483fde95c 100644 --- a/arch/powerpc/kernel/perf_event.c +++ b/arch/powerpc/kernel/perf_event.c @@ -865,6 +865,7 @@ static void power_pmu_start(struct perf_event *event, int ef_flags)  {  	unsigned long flags;  	s64 left; +	unsigned long val;  	if (!event->hw.idx || !event->hw.sample_period)  		return; @@ -880,7 +881,12 @@ static void power_pmu_start(struct perf_event *event, int ef_flags)  	event->hw.state = 0;  	left = local64_read(&event->hw.period_left); -	write_pmc(event->hw.idx, left); + +	val = 0; +	if (left < 0x80000000L) +		val = 0x80000000L - left; + +	write_pmc(event->hw.idx, val);  	perf_event_update_userpage(event);  	perf_pmu_enable(event->pmu); diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c index ebe5766781a..d817ab01848 100644 --- a/arch/powerpc/kernel/process.c +++ b/arch/powerpc/kernel/process.c @@ -566,12 +566,12 @@ static void show_instructions(struct pt_regs *regs)  		 */  		if (!__kernel_text_address(pc) ||  		     __get_user(instr, (unsigned int __user *)pc)) { -			printk("XXXXXXXX "); +			printk(KERN_CONT "XXXXXXXX ");  		} else {  			if (regs->nip == pc) -				printk("<%08x> ", instr); +				printk(KERN_CONT "<%08x> ", instr);  			else -				printk("%08x ", instr); +				printk(KERN_CONT "%08x ", instr);  		}  		pc += sizeof(int); diff --git a/arch/powerpc/kernel/rtas.c b/arch/powerpc/kernel/rtas.c index 517b1d8f455..9f843cdfee9 100644 --- a/arch/powerpc/kernel/rtas.c +++ b/arch/powerpc/kernel/rtas.c @@ -716,7 +716,6 @@ static int __rtas_suspend_last_cpu(struct rtas_suspend_me_data *data, int wake_w  	int cpu;  	slb_set_size(SLB_MIN_SIZE); -	stop_topology_update();  	printk(KERN_DEBUG "calling ibm,suspend-me on cpu %i\n", smp_processor_id());  	while (rc == H_MULTI_THREADS_ACTIVE && !atomic_read(&data->done) && @@ -732,7 +731,6 @@ static int __rtas_suspend_last_cpu(struct rtas_suspend_me_data *data, int wake_w  		rc = atomic_read(&data->error);  	atomic_set(&data->error, rc); -	start_topology_update();  	pSeries_coalesce_init();  	if (wake_when_done) { @@ -846,6 +844,7 @@ int rtas_ibm_suspend_me(struct rtas_args *args)  	atomic_set(&data.error, 0);  	data.token = rtas_token("ibm,suspend-me");  	data.complete = &done; +	stop_topology_update();  	/* Call function on all CPUs.  One of us will make the  	 * rtas call @@ -858,6 +857,8 @@ int rtas_ibm_suspend_me(struct rtas_args *args)  	if (atomic_read(&data.error) != 0)  		printk(KERN_ERR "Error doing global join\n"); +	start_topology_update(); +  	return atomic_read(&data.error);  }  #else /* CONFIG_PPC_PSERIES */ diff --git a/arch/powerpc/platforms/powernv/pci.c b/arch/powerpc/platforms/powernv/pci.c index a70bc1e385e..f92b9ef7340 100644 --- a/arch/powerpc/platforms/powernv/pci.c +++ b/arch/powerpc/platforms/powernv/pci.c @@ -52,32 +52,38 @@ static int pnv_msi_check_device(struct pci_dev* pdev, int nvec, int type)  static unsigned int pnv_get_one_msi(struct pnv_phb *phb)  { -	unsigned int id; +	unsigned long flags; +	unsigned int id, rc; + +	spin_lock_irqsave(&phb->lock, flags); -	spin_lock(&phb->lock);  	id = find_next_zero_bit(phb->msi_map, phb->msi_count, phb->msi_next);  	if (id >= phb->msi_count && phb->msi_next)  		id = find_next_zero_bit(phb->msi_map, phb->msi_count, 0);  	if (id >= phb->msi_count) { -		spin_unlock(&phb->lock); -		return 0; +		rc = 0; +		goto out;  	}  	__set_bit(id, phb->msi_map); -	spin_unlock(&phb->lock); -	return id + phb->msi_base; +	rc = id + phb->msi_base; +out: +	spin_unlock_irqrestore(&phb->lock, flags); +	return rc;  }  static void pnv_put_msi(struct pnv_phb *phb, unsigned int hwirq)  { +	unsigned long flags;  	unsigned int id;  	if (WARN_ON(hwirq < phb->msi_base ||  		    hwirq >= (phb->msi_base + phb->msi_count)))  		return;  	id = hwirq - phb->msi_base; -	spin_lock(&phb->lock); + +	spin_lock_irqsave(&phb->lock, flags);  	__clear_bit(id, phb->msi_map); -	spin_unlock(&phb->lock); +	spin_unlock_irqrestore(&phb->lock, flags);  }  static int pnv_setup_msi_irqs(struct pci_dev *pdev, int nvec, int type) diff --git a/arch/powerpc/platforms/pseries/eeh.c b/arch/powerpc/platforms/pseries/eeh.c index 565869022e3..c0b40af4ce4 100644 --- a/arch/powerpc/platforms/pseries/eeh.c +++ b/arch/powerpc/platforms/pseries/eeh.c @@ -551,9 +551,9 @@ int eeh_dn_check_failure(struct device_node *dn, struct pci_dev *dev)  			printk (KERN_ERR "EEH: %d reads ignored for recovering device at "  				"location=%s driver=%s pci addr=%s\n",  				pdn->eeh_check_count, location, -				dev->driver->name, eeh_pci_name(dev)); +				eeh_driver_name(dev), eeh_pci_name(dev));  			printk (KERN_ERR "EEH: Might be infinite loop in %s driver\n", -				dev->driver->name); +				eeh_driver_name(dev));  			dump_stack();  		}  		goto dn_unlock; diff --git a/arch/powerpc/platforms/pseries/suspend.c b/arch/powerpc/platforms/pseries/suspend.c index b84a8b2238d..47226e04126 100644 --- a/arch/powerpc/platforms/pseries/suspend.c +++ b/arch/powerpc/platforms/pseries/suspend.c @@ -24,6 +24,7 @@  #include <asm/machdep.h>  #include <asm/mmu.h>  #include <asm/rtas.h> +#include <asm/topology.h>  static u64 stream_id;  static struct device suspend_dev; @@ -138,8 +139,11 @@ static ssize_t store_hibernate(struct device *dev,  			ssleep(1);  	} while (rc == -EAGAIN); -	if (!rc) +	if (!rc) { +		stop_topology_update();  		rc = pm_suspend(PM_SUSPEND_MEM); +		start_topology_update(); +	}  	stream_id = 0; diff --git a/arch/powerpc/platforms/wsp/ics.c b/arch/powerpc/platforms/wsp/ics.c index 57687439254..97fe82ee863 100644 --- a/arch/powerpc/platforms/wsp/ics.c +++ b/arch/powerpc/platforms/wsp/ics.c @@ -346,7 +346,7 @@ static int wsp_chip_set_affinity(struct irq_data *d,  	 * For the moment only implement delivery to all cpus or one cpu.  	 * Get current irq_server for the given irq  	 */ -	ret = cache_hwirq_map(ics, d->irq, cpumask); +	ret = cache_hwirq_map(ics, hw_irq, cpumask);  	if (ret == -1) {  		char cpulist[128];  		cpumask_scnprintf(cpulist, sizeof(cpulist), cpumask); diff --git a/arch/powerpc/platforms/wsp/wsp_pci.c b/arch/powerpc/platforms/wsp/wsp_pci.c index e0262cd0e2d..d24b3acf858 100644 --- a/arch/powerpc/platforms/wsp/wsp_pci.c +++ b/arch/powerpc/platforms/wsp/wsp_pci.c @@ -468,15 +468,15 @@ static void __init wsp_pcie_configure_hw(struct pci_controller *hose)  #define DUMP_REG(x) \  	pr_debug("%-30s : 0x%016llx\n", #x, in_be64(hose->cfg_data + x)) -#ifdef CONFIG_WSP_DD1_WORKAROUND_BAD_PCIE_CLASS -	/* WSP DD1 has a bogus class code by default in the PCI-E -	 * root complex's built-in P2P bridge */ +	/* +	 * Some WSP variants  has a bogus class code by default in the PCI-E +	 * root complex's built-in P2P bridge +	 */  	val = in_be64(hose->cfg_data + PCIE_REG_SYS_CFG1);  	pr_debug("PCI-E SYS_CFG1 : 0x%llx\n", val);  	out_be64(hose->cfg_data + PCIE_REG_SYS_CFG1,  		 (val & ~PCIE_REG_SYS_CFG1_CLASS_CODE) | (PCI_CLASS_BRIDGE_PCI << 8));  	pr_debug("PCI-E SYS_CFG1 : 0x%llx\n", in_be64(hose->cfg_data + PCIE_REG_SYS_CFG1)); -#endif /* CONFIG_WSP_DD1_WORKAROUND_BAD_PCIE_CLASS */  #ifdef CONFIG_WSP_DD1_WORKAROUND_DD1_TCE_BUGS  	/* XXX Disable TCE caching, it doesn't work on DD1 */ diff --git a/arch/powerpc/sysdev/fsl_pci.c b/arch/powerpc/sysdev/fsl_pci.c index 30eb17ecad4..6073288fed2 100644 --- a/arch/powerpc/sysdev/fsl_pci.c +++ b/arch/powerpc/sysdev/fsl_pci.c @@ -385,26 +385,36 @@ static void __init setup_pci_cmd(struct pci_controller *hose)  void fsl_pcibios_fixup_bus(struct pci_bus *bus)  {  	struct pci_controller *hose = pci_bus_to_host(bus); -	int i; +	int i, is_pcie = 0, no_link; -	if ((bus->parent == hose->bus) && -	    ((fsl_pcie_bus_fixup && -	      early_find_capability(hose, 0, 0, PCI_CAP_ID_EXP)) || -	     (hose->indirect_type & PPC_INDIRECT_TYPE_NO_PCIE_LINK))) -	{ -		for (i = 0; i < 4; ++i) { +	/* The root complex bridge comes up with bogus resources, +	 * we copy the PHB ones in. +	 * +	 * With the current generic PCI code, the PHB bus no longer +	 * has bus->resource[0..4] set, so things are a bit more +	 * tricky. +	 */ + +	if (fsl_pcie_bus_fixup) +		is_pcie = early_find_capability(hose, 0, 0, PCI_CAP_ID_EXP); +	no_link = !!(hose->indirect_type & PPC_INDIRECT_TYPE_NO_PCIE_LINK); + +	if (bus->parent == hose->bus && (is_pcie || no_link)) { +		for (i = 0; i < PCI_BRIDGE_RESOURCE_NUM; ++i) {  			struct resource *res = bus->resource[i]; -			struct resource *par = bus->parent->resource[i]; -			if (res) { -				res->start = 0; -				res->end   = 0; -				res->flags = 0; -			} -			if (res && par) { -				res->start = par->start; -				res->end   = par->end; -				res->flags = par->flags; -			} +			struct resource *par; + +			if (!res) +				continue; +			if (i == 0) +				par = &hose->io_resource; +			else if (i < 4) +				par = &hose->mem_resources[i-1]; +			else par = NULL; + +			res->start = par ? par->start : 0; +			res->end   = par ? par->end   : 0; +			res->flags = par ? par->flags : 0;  		}  	}  } diff --git a/arch/x86/include/asm/i387.h b/arch/x86/include/asm/i387.h index a29571821b9..a850b4d8d14 100644 --- a/arch/x86/include/asm/i387.h +++ b/arch/x86/include/asm/i387.h @@ -29,8 +29,8 @@ extern unsigned int sig_xstate_size;  extern void fpu_init(void);  extern void mxcsr_feature_mask_init(void);  extern int init_fpu(struct task_struct *child); +extern void __math_state_restore(struct task_struct *);  extern void math_state_restore(void); -extern void __math_state_restore(void);  extern int dump_fpu(struct pt_regs *, struct user_i387_struct *);  extern user_regset_active_fn fpregs_active, xfpregs_active; @@ -212,19 +212,11 @@ static inline void fpu_fxsave(struct fpu *fpu)  #endif	/* CONFIG_X86_64 */ -/* We need a safe address that is cheap to find and that is already -   in L1 during context switch. The best choices are unfortunately -   different for UP and SMP */ -#ifdef CONFIG_SMP -#define safe_address (__per_cpu_offset[0]) -#else -#define safe_address (__get_cpu_var(kernel_cpustat).cpustat[CPUTIME_USER]) -#endif -  /* - * These must be called with preempt disabled + * These must be called with preempt disabled. Returns + * 'true' if the FPU state is still intact.   */ -static inline void fpu_save_init(struct fpu *fpu) +static inline int fpu_save_init(struct fpu *fpu)  {  	if (use_xsave()) {  		fpu_xsave(fpu); @@ -233,33 +225,33 @@ static inline void fpu_save_init(struct fpu *fpu)  		 * xsave header may indicate the init state of the FP.  		 */  		if (!(fpu->state->xsave.xsave_hdr.xstate_bv & XSTATE_FP)) -			return; +			return 1;  	} else if (use_fxsr()) {  		fpu_fxsave(fpu);  	} else {  		asm volatile("fnsave %[fx]; fwait"  			     : [fx] "=m" (fpu->state->fsave)); -		return; +		return 0;  	} -	if (unlikely(fpu->state->fxsave.swd & X87_FSW_ES)) +	/* +	 * If exceptions are pending, we need to clear them so +	 * that we don't randomly get exceptions later. +	 * +	 * FIXME! Is this perhaps only true for the old-style +	 * irq13 case? Maybe we could leave the x87 state +	 * intact otherwise? +	 */ +	if (unlikely(fpu->state->fxsave.swd & X87_FSW_ES)) {  		asm volatile("fnclex"); - -	/* AMD K7/K8 CPUs don't save/restore FDP/FIP/FOP unless an exception -	   is pending.  Clear the x87 state here by setting it to fixed -	   values. safe_address is a random variable that should be in L1 */ -	alternative_input( -		ASM_NOP8 ASM_NOP2, -		"emms\n\t"	  	/* clear stack tags */ -		"fildl %P[addr]",	/* set F?P to defined value */ -		X86_FEATURE_FXSAVE_LEAK, -		[addr] "m" (safe_address)); +		return 0; +	} +	return 1;  } -static inline void __save_init_fpu(struct task_struct *tsk) +static inline int __save_init_fpu(struct task_struct *tsk)  { -	fpu_save_init(&tsk->thread.fpu); -	task_thread_info(tsk)->status &= ~TS_USEDFPU; +	return fpu_save_init(&tsk->thread.fpu);  }  static inline int fpu_fxrstor_checking(struct fpu *fpu) @@ -281,29 +273,128 @@ static inline int restore_fpu_checking(struct task_struct *tsk)  }  /* - * Signal frame handlers... + * Software FPU state helpers. Careful: these need to + * be preemption protection *and* they need to be + * properly paired with the CR0.TS changes!   */ -extern int save_i387_xstate(void __user *buf); -extern int restore_i387_xstate(void __user *buf); +static inline int __thread_has_fpu(struct task_struct *tsk) +{ +	return tsk->thread.has_fpu; +} -static inline void __unlazy_fpu(struct task_struct *tsk) +/* Must be paired with an 'stts' after! */ +static inline void __thread_clear_has_fpu(struct task_struct *tsk)  { -	if (task_thread_info(tsk)->status & TS_USEDFPU) { -		__save_init_fpu(tsk); -		stts(); -	} else -		tsk->fpu_counter = 0; +	tsk->thread.has_fpu = 0; +} + +/* Must be paired with a 'clts' before! */ +static inline void __thread_set_has_fpu(struct task_struct *tsk) +{ +	tsk->thread.has_fpu = 1; +} + +/* + * Encapsulate the CR0.TS handling together with the + * software flag. + * + * These generally need preemption protection to work, + * do try to avoid using these on their own. + */ +static inline void __thread_fpu_end(struct task_struct *tsk) +{ +	__thread_clear_has_fpu(tsk); +	stts(); +} + +static inline void __thread_fpu_begin(struct task_struct *tsk) +{ +	clts(); +	__thread_set_has_fpu(tsk); +} + +/* + * FPU state switching for scheduling. + * + * This is a two-stage process: + * + *  - switch_fpu_prepare() saves the old state and + *    sets the new state of the CR0.TS bit. This is + *    done within the context of the old process. + * + *  - switch_fpu_finish() restores the new state as + *    necessary. + */ +typedef struct { int preload; } fpu_switch_t; + +/* + * FIXME! We could do a totally lazy restore, but we need to + * add a per-cpu "this was the task that last touched the FPU + * on this CPU" variable, and the task needs to have a "I last + * touched the FPU on this CPU" and check them. + * + * We don't do that yet, so "fpu_lazy_restore()" always returns + * false, but some day.. + */ +#define fpu_lazy_restore(tsk) (0) +#define fpu_lazy_state_intact(tsk) do { } while (0) + +static inline fpu_switch_t switch_fpu_prepare(struct task_struct *old, struct task_struct *new) +{ +	fpu_switch_t fpu; + +	fpu.preload = tsk_used_math(new) && new->fpu_counter > 5; +	if (__thread_has_fpu(old)) { +		if (__save_init_fpu(old)) +			fpu_lazy_state_intact(old); +		__thread_clear_has_fpu(old); +		old->fpu_counter++; + +		/* Don't change CR0.TS if we just switch! */ +		if (fpu.preload) { +			__thread_set_has_fpu(new); +			prefetch(new->thread.fpu.state); +		} else +			stts(); +	} else { +		old->fpu_counter = 0; +		if (fpu.preload) { +			if (fpu_lazy_restore(new)) +				fpu.preload = 0; +			else +				prefetch(new->thread.fpu.state); +			__thread_fpu_begin(new); +		} +	} +	return fpu; +} + +/* + * By the time this gets called, we've already cleared CR0.TS and + * given the process the FPU if we are going to preload the FPU + * state - all we need to do is to conditionally restore the register + * state itself. + */ +static inline void switch_fpu_finish(struct task_struct *new, fpu_switch_t fpu) +{ +	if (fpu.preload) +		__math_state_restore(new);  } +/* + * Signal frame handlers... + */ +extern int save_i387_xstate(void __user *buf); +extern int restore_i387_xstate(void __user *buf); +  static inline void __clear_fpu(struct task_struct *tsk)  { -	if (task_thread_info(tsk)->status & TS_USEDFPU) { +	if (__thread_has_fpu(tsk)) {  		/* Ignore delayed exceptions from user space */  		asm volatile("1: fwait\n"  			     "2:\n"  			     _ASM_EXTABLE(1b, 2b)); -		task_thread_info(tsk)->status &= ~TS_USEDFPU; -		stts(); +		__thread_fpu_end(tsk);  	}  } @@ -311,14 +402,14 @@ static inline void __clear_fpu(struct task_struct *tsk)   * Were we in an interrupt that interrupted kernel mode?   *   * We can do a kernel_fpu_begin/end() pair *ONLY* if that - * pair does nothing at all: TS_USEDFPU must be clear (so + * pair does nothing at all: the thread must not have fpu (so   * that we don't try to save the FPU state), and TS must   * be set (so that the clts/stts pair does nothing that is   * visible in the interrupted kernel thread).   */  static inline bool interrupted_kernel_fpu_idle(void)  { -	return !(current_thread_info()->status & TS_USEDFPU) && +	return !__thread_has_fpu(current) &&  		(read_cr0() & X86_CR0_TS);  } @@ -352,13 +443,15 @@ static inline bool irq_fpu_usable(void)  static inline void kernel_fpu_begin(void)  { -	struct thread_info *me = current_thread_info(); +	struct task_struct *me = current;  	WARN_ON_ONCE(!irq_fpu_usable());  	preempt_disable(); -	if (me->status & TS_USEDFPU) -		__save_init_fpu(me->task); -	else +	if (__thread_has_fpu(me)) { +		__save_init_fpu(me); +		__thread_clear_has_fpu(me); +		/* We do 'stts()' in kernel_fpu_end() */ +	} else  		clts();  } @@ -400,21 +493,64 @@ static inline void irq_ts_restore(int TS_state)  }  /* + * The question "does this thread have fpu access?" + * is slightly racy, since preemption could come in + * and revoke it immediately after the test. + * + * However, even in that very unlikely scenario, + * we can just assume we have FPU access - typically + * to save the FP state - we'll just take a #NM + * fault and get the FPU access back. + * + * The actual user_fpu_begin/end() functions + * need to be preemption-safe, though. + * + * NOTE! user_fpu_end() must be used only after you + * have saved the FP state, and user_fpu_begin() must + * be used only immediately before restoring it. + * These functions do not do any save/restore on + * their own. + */ +static inline int user_has_fpu(void) +{ +	return __thread_has_fpu(current); +} + +static inline void user_fpu_end(void) +{ +	preempt_disable(); +	__thread_fpu_end(current); +	preempt_enable(); +} + +static inline void user_fpu_begin(void) +{ +	preempt_disable(); +	if (!user_has_fpu()) +		__thread_fpu_begin(current); +	preempt_enable(); +} + +/*   * These disable preemption on their own and are safe   */  static inline void save_init_fpu(struct task_struct *tsk)  { -	WARN_ON_ONCE(task_thread_info(tsk)->status & TS_USEDFPU); +	WARN_ON_ONCE(!__thread_has_fpu(tsk));  	preempt_disable();  	__save_init_fpu(tsk); -	stts(); +	__thread_fpu_end(tsk);  	preempt_enable();  }  static inline void unlazy_fpu(struct task_struct *tsk)  {  	preempt_disable(); -	__unlazy_fpu(tsk); +	if (__thread_has_fpu(tsk)) { +		__save_init_fpu(tsk); +		__thread_fpu_end(tsk); +	} else +		tsk->fpu_counter = 0;  	preempt_enable();  } diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h index aa9088c2693..f7c89e231c6 100644 --- a/arch/x86/include/asm/processor.h +++ b/arch/x86/include/asm/processor.h @@ -454,6 +454,7 @@ struct thread_struct {  	unsigned long		trap_no;  	unsigned long		error_code;  	/* floating point and extended processor state */ +	unsigned long		has_fpu;  	struct fpu		fpu;  #ifdef CONFIG_X86_32  	/* Virtual 86 mode info */ diff --git a/arch/x86/include/asm/thread_info.h b/arch/x86/include/asm/thread_info.h index bc817cd8b44..cfd8144d552 100644 --- a/arch/x86/include/asm/thread_info.h +++ b/arch/x86/include/asm/thread_info.h @@ -247,8 +247,6 @@ static inline struct thread_info *current_thread_info(void)   * ever touches our thread-synchronous status, so we don't   * have to worry about atomic accesses.   */ -#define TS_USEDFPU		0x0001	/* FPU was used by this task -					   this quantum (SMP) */  #define TS_COMPAT		0x0002	/* 32bit syscall active (64BIT)*/  #define TS_POLLING		0x0004	/* idle task polling need_resched,  					   skip sending interrupt */ diff --git a/arch/x86/kernel/process_32.c b/arch/x86/kernel/process_32.c index 485204f58cd..80bfe1ab003 100644 --- a/arch/x86/kernel/process_32.c +++ b/arch/x86/kernel/process_32.c @@ -299,22 +299,11 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p)  				 *next = &next_p->thread;  	int cpu = smp_processor_id();  	struct tss_struct *tss = &per_cpu(init_tss, cpu); -	bool preload_fpu; +	fpu_switch_t fpu;  	/* never put a printk in __switch_to... printk() calls wake_up*() indirectly */ -	/* -	 * If the task has used fpu the last 5 timeslices, just do a full -	 * restore of the math state immediately to avoid the trap; the -	 * chances of needing FPU soon are obviously high now -	 */ -	preload_fpu = tsk_used_math(next_p) && next_p->fpu_counter > 5; - -	__unlazy_fpu(prev_p); - -	/* we're going to use this soon, after a few expensive things */ -	if (preload_fpu) -		prefetch(next->fpu.state); +	fpu = switch_fpu_prepare(prev_p, next_p);  	/*  	 * Reload esp0. @@ -354,11 +343,6 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p)  		     task_thread_info(next_p)->flags & _TIF_WORK_CTXSW_NEXT))  		__switch_to_xtra(prev_p, next_p, tss); -	/* If we're going to preload the fpu context, make sure clts -	   is run while we're batching the cpu state updates. */ -	if (preload_fpu) -		clts(); -  	/*  	 * Leave lazy mode, flushing any hypercalls made here.  	 * This must be done before restoring TLS segments so @@ -368,15 +352,14 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p)  	 */  	arch_end_context_switch(next_p); -	if (preload_fpu) -		__math_state_restore(); -  	/*  	 * Restore %gs if needed (which is common)  	 */  	if (prev->gs | next->gs)  		lazy_load_gs(next->gs); +	switch_fpu_finish(next_p, fpu); +  	percpu_write(current_task, next_p);  	return prev_p; diff --git a/arch/x86/kernel/process_64.c b/arch/x86/kernel/process_64.c index 9b9fe4a85c8..1fd94bc4279 100644 --- a/arch/x86/kernel/process_64.c +++ b/arch/x86/kernel/process_64.c @@ -386,18 +386,9 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p)  	int cpu = smp_processor_id();  	struct tss_struct *tss = &per_cpu(init_tss, cpu);  	unsigned fsindex, gsindex; -	bool preload_fpu; +	fpu_switch_t fpu; -	/* -	 * If the task has used fpu the last 5 timeslices, just do a full -	 * restore of the math state immediately to avoid the trap; the -	 * chances of needing FPU soon are obviously high now -	 */ -	preload_fpu = tsk_used_math(next_p) && next_p->fpu_counter > 5; - -	/* we're going to use this soon, after a few expensive things */ -	if (preload_fpu) -		prefetch(next->fpu.state); +	fpu = switch_fpu_prepare(prev_p, next_p);  	/*  	 * Reload esp0, LDT and the page table pointer: @@ -427,13 +418,6 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p)  	load_TLS(next, cpu); -	/* Must be after DS reload */ -	__unlazy_fpu(prev_p); - -	/* Make sure cpu is ready for new context */ -	if (preload_fpu) -		clts(); -  	/*  	 * Leave lazy mode, flushing any hypercalls made here.  	 * This must be done before restoring TLS segments so @@ -474,6 +458,8 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p)  		wrmsrl(MSR_KERNEL_GS_BASE, next->gs);  	prev->gsindex = gsindex; +	switch_fpu_finish(next_p, fpu); +  	/*  	 * Switch the PDA and FPU contexts.  	 */ @@ -492,13 +478,6 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p)  		     task_thread_info(prev_p)->flags & _TIF_WORK_CTXSW_PREV))  		__switch_to_xtra(prev_p, next_p, tss); -	/* -	 * Preload the FPU context, now that we've determined that the -	 * task is likely to be using it.  -	 */ -	if (preload_fpu) -		__math_state_restore(); -  	return prev_p;  } diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c index 8ba27dbc107..77da5b475ad 100644 --- a/arch/x86/kernel/traps.c +++ b/arch/x86/kernel/traps.c @@ -571,25 +571,34 @@ asmlinkage void __attribute__((weak)) smp_threshold_interrupt(void)  }  /* - * __math_state_restore assumes that cr0.TS is already clear and the - * fpu state is all ready for use.  Used during context switch. + * This gets called with the process already owning the + * FPU state, and with CR0.TS cleared. It just needs to + * restore the FPU register state.   */ -void __math_state_restore(void) +void __math_state_restore(struct task_struct *tsk)  { -	struct thread_info *thread = current_thread_info(); -	struct task_struct *tsk = thread->task; +	/* We need a safe address that is cheap to find and that is already +	   in L1. We've just brought in "tsk->thread.has_fpu", so use that */ +#define safe_address (tsk->thread.has_fpu) + +	/* AMD K7/K8 CPUs don't save/restore FDP/FIP/FOP unless an exception +	   is pending.  Clear the x87 state here by setting it to fixed +	   values. safe_address is a random variable that should be in L1 */ +	alternative_input( +		ASM_NOP8 ASM_NOP2, +		"emms\n\t"	  	/* clear stack tags */ +		"fildl %P[addr]",	/* set F?P to defined value */ +		X86_FEATURE_FXSAVE_LEAK, +		[addr] "m" (safe_address));  	/*  	 * Paranoid restore. send a SIGSEGV if we fail to restore the state.  	 */  	if (unlikely(restore_fpu_checking(tsk))) { -		stts(); +		__thread_fpu_end(tsk);  		force_sig(SIGSEGV, tsk);  		return;  	} - -	thread->status |= TS_USEDFPU;	/* So we fnsave on switch_to() */ -	tsk->fpu_counter++;  }  /* @@ -604,8 +613,7 @@ void __math_state_restore(void)   */  void math_state_restore(void)  { -	struct thread_info *thread = current_thread_info(); -	struct task_struct *tsk = thread->task; +	struct task_struct *tsk = current;  	if (!tsk_used_math(tsk)) {  		local_irq_enable(); @@ -622,16 +630,16 @@ void math_state_restore(void)  		local_irq_disable();  	} -	clts();				/* Allow maths ops (or we recurse) */ +	__thread_fpu_begin(tsk); +	__math_state_restore(tsk); -	__math_state_restore(); +	tsk->fpu_counter++;  }  EXPORT_SYMBOL_GPL(math_state_restore);  dotraplinkage void __kprobes  do_device_not_available(struct pt_regs *regs, long error_code)  { -	WARN_ON_ONCE(!user_mode_vm(regs));  #ifdef CONFIG_MATH_EMULATION  	if (read_cr0() & X86_CR0_EM) {  		struct math_emu_info info = { }; diff --git a/arch/x86/kernel/xsave.c b/arch/x86/kernel/xsave.c index a3911343976..71109111411 100644 --- a/arch/x86/kernel/xsave.c +++ b/arch/x86/kernel/xsave.c @@ -47,7 +47,7 @@ void __sanitize_i387_state(struct task_struct *tsk)  	if (!fx)  		return; -	BUG_ON(task_thread_info(tsk)->status & TS_USEDFPU); +	BUG_ON(__thread_has_fpu(tsk));  	xstate_bv = tsk->thread.fpu.state->xsave.xsave_hdr.xstate_bv; @@ -168,7 +168,7 @@ int save_i387_xstate(void __user *buf)  	if (!used_math())  		return 0; -	if (task_thread_info(tsk)->status & TS_USEDFPU) { +	if (user_has_fpu()) {  		if (use_xsave())  			err = xsave_user(buf);  		else @@ -176,8 +176,7 @@ int save_i387_xstate(void __user *buf)  		if (err)  			return err; -		task_thread_info(tsk)->status &= ~TS_USEDFPU; -		stts(); +		user_fpu_end();  	} else {  		sanitize_i387_state(tsk);  		if (__copy_to_user(buf, &tsk->thread.fpu.state->fxsave, @@ -292,10 +291,7 @@ int restore_i387_xstate(void __user *buf)  			return err;  	} -	if (!(task_thread_info(current)->status & TS_USEDFPU)) { -		clts(); -		task_thread_info(current)->status |= TS_USEDFPU; -	} +	user_fpu_begin();  	if (use_xsave())  		err = restore_user_xstate(buf);  	else diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c index d29216c462b..3b4c8d8ad90 100644 --- a/arch/x86/kvm/vmx.c +++ b/arch/x86/kvm/vmx.c @@ -1457,7 +1457,7 @@ static void __vmx_load_host_state(struct vcpu_vmx *vmx)  #ifdef CONFIG_X86_64  	wrmsrl(MSR_KERNEL_GS_BASE, vmx->msr_host_kernel_gs_base);  #endif -	if (current_thread_info()->status & TS_USEDFPU) +	if (__thread_has_fpu(current))  		clts();  	load_gdt(&__get_cpu_var(host_gdt));  } diff --git a/arch/x86/pci/xen.c b/arch/x86/pci/xen.c index 492ade8c978..d99346ea8fd 100644 --- a/arch/x86/pci/xen.c +++ b/arch/x86/pci/xen.c @@ -374,7 +374,7 @@ int __init pci_xen_init(void)  int __init pci_xen_hvm_init(void)  { -	if (!xen_feature(XENFEAT_hvm_pirqs)) +	if (!xen_have_vector_callback || !xen_feature(XENFEAT_hvm_pirqs))  		return 0;  #ifdef CONFIG_ACPI diff --git a/arch/x86/xen/smp.c b/arch/x86/xen/smp.c index 041d4fe9dfe..501d4e0244b 100644 --- a/arch/x86/xen/smp.c +++ b/arch/x86/xen/smp.c @@ -409,6 +409,13 @@ static void __cpuinit xen_play_dead(void) /* used only with HOTPLUG_CPU */  	play_dead_common();  	HYPERVISOR_vcpu_op(VCPUOP_down, smp_processor_id(), NULL);  	cpu_bringup(); +	/* +	 * Balance out the preempt calls - as we are running in cpu_idle +	 * loop which has been called at bootup from cpu_bringup_and_idle. +	 * The cpucpu_bringup_and_idle called cpu_bringup which made a +	 * preempt_disable() So this preempt_enable will balance it out. +	 */ +	preempt_enable();  }  #else /* !CONFIG_HOTPLUG_CPU */ diff --git a/crypto/sha512_generic.c b/crypto/sha512_generic.c index f04af931a68..107f6f7be5e 100644 --- a/crypto/sha512_generic.c +++ b/crypto/sha512_generic.c @@ -31,11 +31,6 @@ static inline u64 Maj(u64 x, u64 y, u64 z)          return (x & y) | (z & (x | y));  } -static inline u64 RORu64(u64 x, u64 y) -{ -        return (x >> y) | (x << (64 - y)); -} -  static const u64 sha512_K[80] = {          0x428a2f98d728ae22ULL, 0x7137449123ef65cdULL, 0xb5c0fbcfec4d3b2fULL,          0xe9b5dba58189dbbcULL, 0x3956c25bf348b538ULL, 0x59f111f1b605d019ULL, @@ -66,10 +61,10 @@ static const u64 sha512_K[80] = {          0x5fcb6fab3ad6faecULL, 0x6c44198c4a475817ULL,  }; -#define e0(x)       (RORu64(x,28) ^ RORu64(x,34) ^ RORu64(x,39)) -#define e1(x)       (RORu64(x,14) ^ RORu64(x,18) ^ RORu64(x,41)) -#define s0(x)       (RORu64(x, 1) ^ RORu64(x, 8) ^ (x >> 7)) -#define s1(x)       (RORu64(x,19) ^ RORu64(x,61) ^ (x >> 6)) +#define e0(x)       (ror64(x,28) ^ ror64(x,34) ^ ror64(x,39)) +#define e1(x)       (ror64(x,14) ^ ror64(x,18) ^ ror64(x,41)) +#define s0(x)       (ror64(x, 1) ^ ror64(x, 8) ^ (x >> 7)) +#define s1(x)       (ror64(x,19) ^ ror64(x,61) ^ (x >> 6))  static inline void LOAD_OP(int I, u64 *W, const u8 *input)  { diff --git a/drivers/ata/pata_at91.c b/drivers/ata/pata_at91.c index a7d91a72ee3..53d3770a0b1 100644 --- a/drivers/ata/pata_at91.c +++ b/drivers/ata/pata_at91.c @@ -207,11 +207,11 @@ static void set_smc_timing(struct device *dev, struct ata_device *adev,  {  	int ret = 0;  	int use_iordy; +	struct sam9_smc_config smc;  	unsigned int t6z;         /* data tristate time in ns */  	unsigned int cycle;       /* SMC Cycle width in MCK ticks */  	unsigned int setup;       /* SMC Setup width in MCK ticks */  	unsigned int pulse;       /* CFIOR and CFIOW pulse width in MCK ticks */ -	unsigned int cs_setup = 0;/* CS4 or CS5 setup width in MCK ticks */  	unsigned int cs_pulse;    /* CS4 or CS5 pulse width in MCK ticks*/  	unsigned int tdf_cycles;  /* SMC TDF MCK ticks */  	unsigned long mck_hz;     /* MCK frequency in Hz */ @@ -244,26 +244,20 @@ static void set_smc_timing(struct device *dev, struct ata_device *adev,  	}  	dev_dbg(dev, "Use IORDY=%u, TDF Cycles=%u\n", use_iordy, tdf_cycles); -	info->mode |= AT91_SMC_TDF_(tdf_cycles); -	/* write SMC Setup Register */ -	at91_sys_write(AT91_SMC_SETUP(info->cs), -			AT91_SMC_NWESETUP_(setup) | -			AT91_SMC_NRDSETUP_(setup) | -			AT91_SMC_NCS_WRSETUP_(cs_setup) | -			AT91_SMC_NCS_RDSETUP_(cs_setup)); -	/* write SMC Pulse Register */ -	at91_sys_write(AT91_SMC_PULSE(info->cs), -			AT91_SMC_NWEPULSE_(pulse) | -			AT91_SMC_NRDPULSE_(pulse) | -			AT91_SMC_NCS_WRPULSE_(cs_pulse) | -			AT91_SMC_NCS_RDPULSE_(cs_pulse)); -	/* write SMC Cycle Register */ -	at91_sys_write(AT91_SMC_CYCLE(info->cs), -			AT91_SMC_NWECYCLE_(cycle) | -			AT91_SMC_NRDCYCLE_(cycle)); -	/* write SMC Mode Register*/ -	at91_sys_write(AT91_SMC_MODE(info->cs), info->mode); +	/* SMC Setup Register */ +	smc.nwe_setup = smc.nrd_setup = setup; +	smc.ncs_write_setup = smc.ncs_read_setup = 0; +	/* SMC Pulse Register */ +	smc.nwe_pulse = smc.nrd_pulse = pulse; +	smc.ncs_write_pulse = smc.ncs_read_pulse = cs_pulse; +	/* SMC Cycle Register */ +	smc.write_cycle = smc.read_cycle = cycle; +	/* SMC Mode Register*/ +	smc.tdf_cycles = tdf_cycles; +	smc.mode = info->mode; + +	sam9_smc_configure(0, info->cs, &smc);  }  static void pata_at91_set_piomode(struct ata_port *ap, struct ata_device *adev) @@ -288,20 +282,20 @@ static unsigned int pata_at91_data_xfer_noirq(struct ata_device *dev,  	struct at91_ide_info *info = dev->link->ap->host->private_data;  	unsigned int consumed;  	unsigned long flags; -	unsigned int mode; +	struct sam9_smc_config smc;  	local_irq_save(flags); -	mode = at91_sys_read(AT91_SMC_MODE(info->cs)); +	sam9_smc_read_mode(0, info->cs, &smc);  	/* set 16bit mode before writing data */ -	at91_sys_write(AT91_SMC_MODE(info->cs), -			(mode & ~AT91_SMC_DBW) | AT91_SMC_DBW_16); +	smc.mode = (smc.mode & ~AT91_SMC_DBW) | AT91_SMC_DBW_16; +	sam9_smc_write_mode(0, info->cs, &smc);  	consumed = ata_sff_data_xfer(dev, buf, buflen, rw);  	/* restore 8bit mode after data is written */ -	at91_sys_write(AT91_SMC_MODE(info->cs), -			(mode & ~AT91_SMC_DBW) | AT91_SMC_DBW_8); +	smc.mode = (smc.mode & ~AT91_SMC_DBW) | AT91_SMC_DBW_8; +	sam9_smc_write_mode(0, info->cs, &smc);  	local_irq_restore(flags);  	return consumed; diff --git a/drivers/base/regmap/regcache.c b/drivers/base/regmap/regcache.c index 1ead66186b7..d1daa5e9fad 100644 --- a/drivers/base/regmap/regcache.c +++ b/drivers/base/regmap/regcache.c @@ -53,7 +53,7 @@ static int regcache_hw_init(struct regmap *map)  	for (count = 0, i = 0; i < map->num_reg_defaults_raw; i++) {  		val = regcache_get_val(map->reg_defaults_raw,  				       i, map->cache_word_size); -		if (!val) +		if (regmap_volatile(map, i))  			continue;  		count++;  	} @@ -70,7 +70,7 @@ static int regcache_hw_init(struct regmap *map)  	for (i = 0, j = 0; i < map->num_reg_defaults_raw; i++) {  		val = regcache_get_val(map->reg_defaults_raw,  				       i, map->cache_word_size); -		if (!val) +		if (regmap_volatile(map, i))  			continue;  		map->reg_defaults[j].reg = i;  		map->reg_defaults[j].def = val; diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c index bfd36ab643a..18cd84fae99 100644 --- a/drivers/gpu/drm/radeon/r100.c +++ b/drivers/gpu/drm/radeon/r100.c @@ -789,9 +789,7 @@ int r100_irq_process(struct radeon_device *rdev)  			WREG32(RADEON_AIC_CNTL, msi_rearm | RS400_MSI_REARM);  			break;  		default: -			msi_rearm = RREG32(RADEON_MSI_REARM_EN) & ~RV370_MSI_REARM_EN; -			WREG32(RADEON_MSI_REARM_EN, msi_rearm); -			WREG32(RADEON_MSI_REARM_EN, msi_rearm | RV370_MSI_REARM_EN); +			WREG32(RADEON_MSI_REARM_EN, RV370_MSI_REARM_EN);  			break;  		}  	} diff --git a/drivers/gpu/drm/radeon/radeon_atombios.c b/drivers/gpu/drm/radeon/radeon_atombios.c index 5082d17d14d..9e72daeeddc 100644 --- a/drivers/gpu/drm/radeon/radeon_atombios.c +++ b/drivers/gpu/drm/radeon/radeon_atombios.c @@ -2931,6 +2931,20 @@ radeon_atombios_connected_scratch_regs(struct drm_connector *connector,  			bios_6_scratch &= ~ATOM_S6_ACC_REQ_DFP5;  		}  	} +	if ((radeon_encoder->devices & ATOM_DEVICE_DFP6_SUPPORT) && +	    (radeon_connector->devices & ATOM_DEVICE_DFP6_SUPPORT)) { +		if (connected) { +			DRM_DEBUG_KMS("DFP6 connected\n"); +			bios_0_scratch |= ATOM_S0_DFP6; +			bios_3_scratch |= ATOM_S3_DFP6_ACTIVE; +			bios_6_scratch |= ATOM_S6_ACC_REQ_DFP6; +		} else { +			DRM_DEBUG_KMS("DFP6 disconnected\n"); +			bios_0_scratch &= ~ATOM_S0_DFP6; +			bios_3_scratch &= ~ATOM_S3_DFP6_ACTIVE; +			bios_6_scratch &= ~ATOM_S6_ACC_REQ_DFP6; +		} +	}  	if (rdev->family >= CHIP_R600) {  		WREG32(R600_BIOS_0_SCRATCH, bios_0_scratch); @@ -2951,6 +2965,9 @@ radeon_atombios_encoder_crtc_scratch_regs(struct drm_encoder *encoder, int crtc)  	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);  	uint32_t bios_3_scratch; +	if (ASIC_IS_DCE4(rdev)) +		return; +  	if (rdev->family >= CHIP_R600)  		bios_3_scratch = RREG32(R600_BIOS_3_SCRATCH);  	else diff --git a/drivers/gpu/drm/radeon/radeon_fence.c b/drivers/gpu/drm/radeon/radeon_fence.c index 64ea3dd9e6f..4bd36a354fb 100644 --- a/drivers/gpu/drm/radeon/radeon_fence.c +++ b/drivers/gpu/drm/radeon/radeon_fence.c @@ -364,8 +364,10 @@ int radeon_fence_count_emitted(struct radeon_device *rdev, int ring)  	int not_processed = 0;  	read_lock_irqsave(&rdev->fence_lock, irq_flags); -	if (!rdev->fence_drv[ring].initialized) +	if (!rdev->fence_drv[ring].initialized) { +		read_unlock_irqrestore(&rdev->fence_lock, irq_flags);  		return 0; +	}  	if (!list_empty(&rdev->fence_drv[ring].emitted)) {  		struct list_head *ptr; diff --git a/drivers/gpu/drm/radeon/rs600.c b/drivers/gpu/drm/radeon/rs600.c index ec46eb45e34..c05865e5521 100644 --- a/drivers/gpu/drm/radeon/rs600.c +++ b/drivers/gpu/drm/radeon/rs600.c @@ -684,9 +684,7 @@ int rs600_irq_process(struct radeon_device *rdev)  			WREG32(RADEON_BUS_CNTL, msi_rearm | RS600_MSI_REARM);  			break;  		default: -			msi_rearm = RREG32(RADEON_MSI_REARM_EN) & ~RV370_MSI_REARM_EN; -			WREG32(RADEON_MSI_REARM_EN, msi_rearm); -			WREG32(RADEON_MSI_REARM_EN, msi_rearm | RV370_MSI_REARM_EN); +			WREG32(RADEON_MSI_REARM_EN, RV370_MSI_REARM_EN);  			break;  		}  	} diff --git a/drivers/i2c/busses/i2c-tegra.c b/drivers/i2c/busses/i2c-tegra.c index 6381604696d..0ab4a954874 100644 --- a/drivers/i2c/busses/i2c-tegra.c +++ b/drivers/i2c/busses/i2c-tegra.c @@ -755,7 +755,7 @@ MODULE_DEVICE_TABLE(of, tegra_i2c_of_match);  static struct platform_driver tegra_i2c_driver = {  	.probe   = tegra_i2c_probe, -	.remove  = tegra_i2c_remove, +	.remove  = __devexit_p(tegra_i2c_remove),  #ifdef CONFIG_PM  	.suspend = tegra_i2c_suspend,  	.resume  = tegra_i2c_resume, diff --git a/drivers/ide/Makefile b/drivers/ide/Makefile index 7f879b2397b..af8d016c37e 100644 --- a/drivers/ide/Makefile +++ b/drivers/ide/Makefile @@ -116,4 +116,3 @@ obj-$(CONFIG_BLK_DEV_IDE_AU1XXX)	+= au1xxx-ide.o  obj-$(CONFIG_BLK_DEV_IDE_TX4938)	+= tx4938ide.o  obj-$(CONFIG_BLK_DEV_IDE_TX4939)	+= tx4939ide.o -obj-$(CONFIG_BLK_DEV_IDE_AT91)		+= at91_ide.o diff --git a/drivers/ide/at91_ide.c b/drivers/ide/at91_ide.c deleted file mode 100644 index 41d41552947..00000000000 --- a/drivers/ide/at91_ide.c +++ /dev/null @@ -1,366 +0,0 @@ -/* - * IDE host driver for AT91 (SAM9, CAP9, AT572D940HF) Static Memory Controller - * with Compact Flash True IDE logic - * - * Copyright (c) 2008, 2009 Kelvatek Ltd. - * - *  This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -#include <linux/kernel.h> -#include <linux/module.h> -#include <linux/clk.h> -#include <linux/err.h> -#include <linux/ide.h> -#include <linux/platform_device.h> - -#include <mach/board.h> -#include <asm/gpio.h> -#include <mach/at91sam9_smc.h> - -#define DRV_NAME "at91_ide" - -#define perr(fmt, args...) pr_err(DRV_NAME ": " fmt, ##args) -#define pdbg(fmt, args...) pr_debug("%s " fmt, __func__, ##args) - -/* - * Access to IDE device is possible through EBI Static Memory Controller - * with Compact Flash logic. For details see EBI and SMC datasheet sections - * of any microcontroller from AT91SAM9 family. - * - * Within SMC chip select address space, lines A[23:21] distinguish Compact - * Flash modes (I/O, common memory, attribute memory, True IDE). IDE modes are: - *   0x00c0000 - True IDE - *   0x00e0000 - Alternate True IDE (Alt Status Register) - * - * On True IDE mode Task File and Data Register are mapped at the same address. - * To distinguish access between these two different bus data width is used: - * 8Bit for Task File, 16Bit for Data I/O. - * - * After initialization we do 8/16 bit flipping (changes in SMC MODE register) - * only inside IDE callback routines which are serialized by IDE layer, - * so no additional locking needed. - */ - -#define TASK_FILE	0x00c00000 -#define ALT_MODE	0x00e00000 -#define REGS_SIZE	8 - -#define enter_16bit(cs, mode) do {					\ -	mode = at91_sys_read(AT91_SMC_MODE(cs));			\ -	at91_sys_write(AT91_SMC_MODE(cs), mode | AT91_SMC_DBW_16);	\ -} while (0) - -#define leave_16bit(cs, mode) at91_sys_write(AT91_SMC_MODE(cs), mode); - -static void set_smc_timings(const u8 chipselect, const u16 cycle, -			    const u16 setup, const u16 pulse, -			    const u16 data_float, int use_iordy) -{ -	unsigned long mode = AT91_SMC_READMODE | AT91_SMC_WRITEMODE | -			     AT91_SMC_BAT_SELECT; - -	/* disable or enable waiting for IORDY signal */ -	if (use_iordy) -		mode |= AT91_SMC_EXNWMODE_READY; - -	/* add data float cycles if needed */ -	if (data_float) -		mode |= AT91_SMC_TDF_(data_float); - -	at91_sys_write(AT91_SMC_MODE(chipselect), mode); - -	/* setup timings in SMC */ -	at91_sys_write(AT91_SMC_SETUP(chipselect), AT91_SMC_NWESETUP_(setup) | -						   AT91_SMC_NCS_WRSETUP_(0) | -						   AT91_SMC_NRDSETUP_(setup) | -						   AT91_SMC_NCS_RDSETUP_(0)); -	at91_sys_write(AT91_SMC_PULSE(chipselect), AT91_SMC_NWEPULSE_(pulse) | -						   AT91_SMC_NCS_WRPULSE_(cycle) | -						   AT91_SMC_NRDPULSE_(pulse) | -						   AT91_SMC_NCS_RDPULSE_(cycle)); -	at91_sys_write(AT91_SMC_CYCLE(chipselect), AT91_SMC_NWECYCLE_(cycle) | -						   AT91_SMC_NRDCYCLE_(cycle)); -} - -static unsigned int calc_mck_cycles(unsigned int ns, unsigned int mck_hz) -{ -	u64 tmp = ns; - -	tmp *= mck_hz; -	tmp += 1000*1000*1000 - 1; /* round up */ -	do_div(tmp, 1000*1000*1000); -	return (unsigned int) tmp; -} - -static void apply_timings(const u8 chipselect, const u8 pio, -			  const struct ide_timing *timing, int use_iordy) -{ -	unsigned int t0, t1, t2, t6z; -	unsigned int cycle, setup, pulse, data_float; -	unsigned int mck_hz; -	struct clk *mck; - -	/* see table 22 of Compact Flash standard 4.1 for the meaning, -	 * we do not stretch active (t2) time, so setup (t1) + hold time (th) -	 * assure at least minimal recovery (t2i) time */ -	t0 = timing->cyc8b; -	t1 = timing->setup; -	t2 = timing->act8b; -	t6z = (pio < 5) ? 30 : 20; - -	pdbg("t0=%u t1=%u t2=%u t6z=%u\n", t0, t1, t2, t6z); - -	mck = clk_get(NULL, "mck"); -	BUG_ON(IS_ERR(mck)); -	mck_hz = clk_get_rate(mck); -	pdbg("mck_hz=%u\n", mck_hz); - -	cycle = calc_mck_cycles(t0, mck_hz); -	setup = calc_mck_cycles(t1, mck_hz); -	pulse = calc_mck_cycles(t2, mck_hz); -	data_float = calc_mck_cycles(t6z, mck_hz); - -	pdbg("cycle=%u setup=%u pulse=%u data_float=%u\n", -	     cycle, setup, pulse, data_float); - -	set_smc_timings(chipselect, cycle, setup, pulse, data_float, use_iordy); -} - -static void at91_ide_input_data(ide_drive_t *drive, struct ide_cmd *cmd, -				void *buf, unsigned int len) -{ -	ide_hwif_t *hwif = drive->hwif; -	struct ide_io_ports *io_ports = &hwif->io_ports; -	u8 chipselect = hwif->select_data; -	unsigned long mode; - -	pdbg("cs %u buf %p len %d\n", chipselect, buf, len); - -	len++; - -	enter_16bit(chipselect, mode); -	readsw((void __iomem *)io_ports->data_addr, buf, len / 2); -	leave_16bit(chipselect, mode); -} - -static void at91_ide_output_data(ide_drive_t *drive, struct ide_cmd *cmd, -				 void *buf, unsigned int len) -{ -	ide_hwif_t *hwif = drive->hwif; -	struct ide_io_ports *io_ports = &hwif->io_ports; -	u8 chipselect = hwif->select_data; -	unsigned long mode; - -	pdbg("cs %u buf %p len %d\n", chipselect,  buf, len); - -	enter_16bit(chipselect, mode); -	writesw((void __iomem *)io_ports->data_addr, buf, len / 2); -	leave_16bit(chipselect, mode); -} - -static void at91_ide_set_pio_mode(ide_hwif_t *hwif, ide_drive_t *drive) -{ -	struct ide_timing *timing; -	u8 chipselect = hwif->select_data; -	int use_iordy = 0; -	const u8 pio = drive->pio_mode - XFER_PIO_0; - -	pdbg("chipselect %u pio %u\n", chipselect, pio); - -	timing = ide_timing_find_mode(XFER_PIO_0 + pio); -	BUG_ON(!timing); - -	if (ide_pio_need_iordy(drive, pio)) -		use_iordy = 1; - -	apply_timings(chipselect, pio, timing, use_iordy); -} - -static const struct ide_tp_ops at91_ide_tp_ops = { -	.exec_command	= ide_exec_command, -	.read_status	= ide_read_status, -	.read_altstatus	= ide_read_altstatus, -	.write_devctl	= ide_write_devctl, - -	.dev_select	= ide_dev_select, -	.tf_load	= ide_tf_load, -	.tf_read	= ide_tf_read, - -	.input_data	= at91_ide_input_data, -	.output_data	= at91_ide_output_data, -}; - -static const struct ide_port_ops at91_ide_port_ops = { -	.set_pio_mode	= at91_ide_set_pio_mode, -}; - -static const struct ide_port_info at91_ide_port_info __initdata = { -	.port_ops	= &at91_ide_port_ops, -	.tp_ops		= &at91_ide_tp_ops, -	.host_flags 	= IDE_HFLAG_MMIO | IDE_HFLAG_NO_DMA | IDE_HFLAG_SINGLE | -			  IDE_HFLAG_NO_IO_32BIT | IDE_HFLAG_UNMASK_IRQS, -	.pio_mask 	= ATA_PIO6, -	.chipset	= ide_generic, -}; - -/* - * If interrupt is delivered through GPIO, IRQ are triggered on falling - * and rising edge of signal. Whereas IDE device request interrupt on high - * level (rising edge in our case). This mean we have fake interrupts, so - * we need to check interrupt pin and exit instantly from ISR when line - * is on low level. - */ - -irqreturn_t at91_irq_handler(int irq, void *dev_id) -{ -	int ntries = 8; -	int pin_val1, pin_val2; - -	/* additional deglitch, line can be noisy in badly designed PCB */ -	do { -		pin_val1 = at91_get_gpio_value(irq); -		pin_val2 = at91_get_gpio_value(irq); -	} while (pin_val1 != pin_val2 && --ntries > 0); - -	if (pin_val1 == 0 || ntries <= 0) -		return IRQ_HANDLED; - -	return ide_intr(irq, dev_id); -} - -static int __init at91_ide_probe(struct platform_device *pdev) -{ -	int ret; -	struct ide_hw hw, *hws[] = { &hw }; -	struct ide_host *host; -	struct resource *res; -	unsigned long tf_base = 0, ctl_base = 0; -	struct at91_cf_data *board = pdev->dev.platform_data; - -	if (!board) -		return -ENODEV; - -	if (board->det_pin && at91_get_gpio_value(board->det_pin) != 0) { -		perr("no device detected\n"); -		return -ENODEV; -	} - -	res = platform_get_resource(pdev, IORESOURCE_MEM, 0); -	if (!res) { -		perr("can't get memory resource\n"); -		return -ENODEV; -	} - -	if (!devm_request_mem_region(&pdev->dev, res->start + TASK_FILE, -				     REGS_SIZE, "ide") || -	    !devm_request_mem_region(&pdev->dev, res->start + ALT_MODE, -				     REGS_SIZE, "alt")) { -		perr("memory resources in use\n"); -		return -EBUSY; -	} - -	pdbg("chipselect %u irq %u res %08lx\n", board->chipselect, -	     board->irq_pin, (unsigned long) res->start); - -	tf_base = (unsigned long) devm_ioremap(&pdev->dev, res->start + TASK_FILE, -					       REGS_SIZE); -	ctl_base = (unsigned long) devm_ioremap(&pdev->dev, res->start + ALT_MODE, -						REGS_SIZE); -	if (!tf_base || !ctl_base) { -		perr("can't map memory regions\n"); -		return -EBUSY; -	} - -	memset(&hw, 0, sizeof(hw)); - -	if (board->flags & AT91_IDE_SWAP_A0_A2) { -		/* workaround for stupid hardware bug */ -		hw.io_ports.data_addr	= tf_base + 0; -		hw.io_ports.error_addr	= tf_base + 4; -		hw.io_ports.nsect_addr	= tf_base + 2; -		hw.io_ports.lbal_addr	= tf_base + 6; -		hw.io_ports.lbam_addr	= tf_base + 1; -		hw.io_ports.lbah_addr	= tf_base + 5; -		hw.io_ports.device_addr = tf_base + 3; -		hw.io_ports.command_addr = tf_base + 7; -		hw.io_ports.ctl_addr	= ctl_base + 3; -	} else -		ide_std_init_ports(&hw, tf_base, ctl_base + 6); - -	hw.irq = board->irq_pin; -	hw.dev = &pdev->dev; - -	host = ide_host_alloc(&at91_ide_port_info, hws, 1); -	if (!host) { -		perr("failed to allocate ide host\n"); -		return -ENOMEM; -	} - -	/* setup Static Memory Controller - PIO 0 as default */ -	apply_timings(board->chipselect, 0, ide_timing_find_mode(XFER_PIO_0), 0); - -	/* with GPIO interrupt we have to do quirks in handler */ -	if (gpio_is_valid(board->irq_pin)) -		host->irq_handler = at91_irq_handler; - -	host->ports[0]->select_data = board->chipselect; - -	ret = ide_host_register(host, &at91_ide_port_info, hws); -	if (ret) { -		perr("failed to register ide host\n"); -		goto err_free_host; -	} -	platform_set_drvdata(pdev, host); -	return 0; - -err_free_host: -	ide_host_free(host); -	return ret; -} - -static int __exit at91_ide_remove(struct platform_device *pdev) -{ -	struct ide_host *host = platform_get_drvdata(pdev); - -	ide_host_remove(host); -	return 0; -} - -static struct platform_driver at91_ide_driver = { -	.driver	= { -		.name = DRV_NAME, -		.owner = THIS_MODULE, -	}, -	.remove	= __exit_p(at91_ide_remove), -}; - -static int __init at91_ide_init(void) -{ -	return platform_driver_probe(&at91_ide_driver, at91_ide_probe); -} - -static void __exit at91_ide_exit(void) -{ -	platform_driver_unregister(&at91_ide_driver); -} - -module_init(at91_ide_init); -module_exit(at91_ide_exit); - -MODULE_LICENSE("GPL"); -MODULE_AUTHOR("Stanislaw Gruszka <stf_xl@wp.pl>"); - diff --git a/drivers/macintosh/adb.c b/drivers/macintosh/adb.c index 75049e76519..b026896206c 100644 --- a/drivers/macintosh/adb.c +++ b/drivers/macintosh/adb.c @@ -710,7 +710,7 @@ static ssize_t adb_read(struct file *file, char __user *buf,  	req = NULL;  	spin_lock_irqsave(&state->lock, flags);  	add_wait_queue(&state->wait_queue, &wait); -	current->state = TASK_INTERRUPTIBLE; +	set_current_state(TASK_INTERRUPTIBLE);  	for (;;) {  		req = state->completed; @@ -734,7 +734,7 @@ static ssize_t adb_read(struct file *file, char __user *buf,  		spin_lock_irqsave(&state->lock, flags);  	} -	current->state = TASK_RUNNING; +	set_current_state(TASK_RUNNING);  	remove_wait_queue(&state->wait_queue, &wait);  	spin_unlock_irqrestore(&state->lock, flags); diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c index 0cad48a284a..c6a383d0244 100644 --- a/drivers/mmc/card/block.c +++ b/drivers/mmc/card/block.c @@ -1694,6 +1694,7 @@ static int mmc_add_disk(struct mmc_blk_data *md)  		md->power_ro_lock.show = power_ro_lock_show;  		md->power_ro_lock.store = power_ro_lock_store; +		sysfs_attr_init(&md->power_ro_lock.attr);  		md->power_ro_lock.attr.mode = mode;  		md->power_ro_lock.attr.name =  					"ro_lock_until_next_power_on"; diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c index f545a3e6eb8..690255c7d4d 100644 --- a/drivers/mmc/core/core.c +++ b/drivers/mmc/core/core.c @@ -290,8 +290,11 @@ static void mmc_wait_for_req_done(struct mmc_host *host,  static void mmc_pre_req(struct mmc_host *host, struct mmc_request *mrq,  		 bool is_first_req)  { -	if (host->ops->pre_req) +	if (host->ops->pre_req) { +		mmc_host_clk_hold(host);  		host->ops->pre_req(host, mrq, is_first_req); +		mmc_host_clk_release(host); +	}  }  /** @@ -306,8 +309,11 @@ static void mmc_pre_req(struct mmc_host *host, struct mmc_request *mrq,  static void mmc_post_req(struct mmc_host *host, struct mmc_request *mrq,  			 int err)  { -	if (host->ops->post_req) +	if (host->ops->post_req) { +		mmc_host_clk_hold(host);  		host->ops->post_req(host, mrq, err); +		mmc_host_clk_release(host); +	}  }  /** @@ -620,7 +626,9 @@ int mmc_host_enable(struct mmc_host *host)  		int err;  		host->en_dis_recurs = 1; +		mmc_host_clk_hold(host);  		err = host->ops->enable(host); +		mmc_host_clk_release(host);  		host->en_dis_recurs = 0;  		if (err) { @@ -640,7 +648,9 @@ static int mmc_host_do_disable(struct mmc_host *host, int lazy)  		int err;  		host->en_dis_recurs = 1; +		mmc_host_clk_hold(host);  		err = host->ops->disable(host, lazy); +		mmc_host_clk_release(host);  		host->en_dis_recurs = 0;  		if (err < 0) { @@ -1121,6 +1131,10 @@ int mmc_regulator_set_ocr(struct mmc_host *mmc,  		 * might not allow this operation  		 */  		voltage = regulator_get_voltage(supply); + +		if (mmc->caps2 & MMC_CAP2_BROKEN_VOLTAGE) +			min_uV = max_uV = voltage; +  		if (voltage < 0)  			result = voltage;  		else if (voltage < min_uV || voltage > max_uV) @@ -1203,8 +1217,11 @@ int mmc_set_signal_voltage(struct mmc_host *host, int signal_voltage, bool cmd11  	host->ios.signal_voltage = signal_voltage; -	if (host->ops->start_signal_voltage_switch) +	if (host->ops->start_signal_voltage_switch) { +		mmc_host_clk_hold(host);  		err = host->ops->start_signal_voltage_switch(host, &host->ios); +		mmc_host_clk_release(host); +	}  	return err;  } @@ -1239,6 +1256,7 @@ static void mmc_poweroff_notify(struct mmc_host *host)  	int err = 0;  	card = host->card; +	mmc_claim_host(host);  	/*  	 * Send power notify command only if card @@ -1269,6 +1287,7 @@ static void mmc_poweroff_notify(struct mmc_host *host)  		/* Set the card state to no notification after the poweroff */  		card->poweroff_notify_state = MMC_NO_POWER_NOTIFICATION;  	} +	mmc_release_host(host);  }  /* @@ -1327,12 +1346,28 @@ static void mmc_power_up(struct mmc_host *host)  void mmc_power_off(struct mmc_host *host)  { +	int err = 0;  	mmc_host_clk_hold(host);  	host->ios.clock = 0;  	host->ios.vdd = 0; -	mmc_poweroff_notify(host); +	/* +	 * For eMMC 4.5 device send AWAKE command before +	 * POWER_OFF_NOTIFY command, because in sleep state +	 * eMMC 4.5 devices respond to only RESET and AWAKE cmd +	 */ +	if (host->card && mmc_card_is_sleep(host->card) && +	    host->bus_ops->resume) { +		err = host->bus_ops->resume(host); + +		if (!err) +			mmc_poweroff_notify(host); +		else +			pr_warning("%s: error %d during resume " +				   "(continue with poweroff sequence)\n", +				   mmc_hostname(host), err); +	}  	/*  	 * Reset ocr mask to be the highest possible voltage supported for @@ -2386,12 +2421,6 @@ int mmc_suspend_host(struct mmc_host *host)  		 */  		if (mmc_try_claim_host(host)) {  			if (host->bus_ops->suspend) { -				/* -				 * For eMMC 4.5 device send notify command -				 * before sleep, because in sleep state eMMC 4.5 -				 * devices respond to only RESET and AWAKE cmd -				 */ -				mmc_poweroff_notify(host);  				err = host->bus_ops->suspend(host);  			}  			mmc_do_release_host(host); diff --git a/drivers/mmc/core/host.h b/drivers/mmc/core/host.h index fb8a5cd2e4a..08a7852ade4 100644 --- a/drivers/mmc/core/host.h +++ b/drivers/mmc/core/host.h @@ -14,27 +14,6 @@  int mmc_register_host_class(void);  void mmc_unregister_host_class(void); - -#ifdef CONFIG_MMC_CLKGATE -void mmc_host_clk_hold(struct mmc_host *host); -void mmc_host_clk_release(struct mmc_host *host); -unsigned int mmc_host_clk_rate(struct mmc_host *host); - -#else -static inline void mmc_host_clk_hold(struct mmc_host *host) -{ -} - -static inline void mmc_host_clk_release(struct mmc_host *host) -{ -} - -static inline unsigned int mmc_host_clk_rate(struct mmc_host *host) -{ -	return host->ios.clock; -} -#endif -  void mmc_host_deeper_disable(struct work_struct *work);  #endif diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c index 59b9ba52e66..a48066344fa 100644 --- a/drivers/mmc/core/mmc.c +++ b/drivers/mmc/core/mmc.c @@ -376,7 +376,7 @@ static int mmc_read_ext_csd(struct mmc_card *card, u8 *ext_csd)  	}  	card->ext_csd.raw_hc_erase_gap_size = -		ext_csd[EXT_CSD_PARTITION_ATTRIBUTE]; +		ext_csd[EXT_CSD_HC_WP_GRP_SIZE];  	card->ext_csd.raw_sec_trim_mult =  		ext_csd[EXT_CSD_SEC_TRIM_MULT];  	card->ext_csd.raw_sec_erase_mult = @@ -551,7 +551,7 @@ static int mmc_compare_ext_csds(struct mmc_card *card, unsigned bus_width)  		goto out;  	/* only compare read only fields */ -	err = (!(card->ext_csd.raw_partition_support == +	err = !((card->ext_csd.raw_partition_support ==  			bw_ext_csd[EXT_CSD_PARTITION_SUPPORT]) &&  		(card->ext_csd.raw_erased_mem_count ==  			bw_ext_csd[EXT_CSD_ERASED_MEM_CONT]) && @@ -1006,7 +1006,8 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr,  			err = mmc_select_hs200(card);  		else if	(host->caps & MMC_CAP_MMC_HIGHSPEED)  			err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, -					 EXT_CSD_HS_TIMING, 1, 0); +					 EXT_CSD_HS_TIMING, 1, +					 card->ext_csd.generic_cmd6_time);  		if (err && err != -EBADMSG)  			goto free_card; @@ -1116,7 +1117,7 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr,  	 * Activate wide bus and DDR (if supported).  	 */  	if (!mmc_card_hs200(card) && -	    (card->csd.mmca_vsn >= CSD_SPEC_VER_3) && +	    (card->csd.mmca_vsn >= CSD_SPEC_VER_4) &&  	    (host->caps & (MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA))) {  		static unsigned ext_csd_bits[][2] = {  			{ EXT_CSD_BUS_WIDTH_8, EXT_CSD_DDR_BUS_WIDTH_8 }, @@ -1315,11 +1316,13 @@ static int mmc_suspend(struct mmc_host *host)  	BUG_ON(!host->card);  	mmc_claim_host(host); -	if (mmc_card_can_sleep(host)) +	if (mmc_card_can_sleep(host)) {  		err = mmc_card_sleep(host); -	else if (!mmc_host_is_spi(host)) +		if (!err) +			mmc_card_set_sleep(host->card); +	} else if (!mmc_host_is_spi(host))  		mmc_deselect_cards(host); -	host->card->state &= ~MMC_STATE_HIGHSPEED; +	host->card->state &= ~(MMC_STATE_HIGHSPEED | MMC_STATE_HIGHSPEED_200);  	mmc_release_host(host);  	return err; @@ -1339,7 +1342,11 @@ static int mmc_resume(struct mmc_host *host)  	BUG_ON(!host->card);  	mmc_claim_host(host); -	err = mmc_init_card(host, host->ocr, host->card); +	if (mmc_card_is_sleep(host->card)) { +		err = mmc_card_awake(host); +		mmc_card_clr_sleep(host->card); +	} else +		err = mmc_init_card(host, host->ocr, host->card);  	mmc_release_host(host);  	return err; @@ -1349,7 +1356,8 @@ static int mmc_power_restore(struct mmc_host *host)  {  	int ret; -	host->card->state &= ~MMC_STATE_HIGHSPEED; +	host->card->state &= ~(MMC_STATE_HIGHSPEED | MMC_STATE_HIGHSPEED_200); +	mmc_card_clr_sleep(host->card);  	mmc_claim_host(host);  	ret = mmc_init_card(host, host->ocr, host->card);  	mmc_release_host(host); diff --git a/drivers/mmc/core/sd.c b/drivers/mmc/core/sd.c index c63ad03c29c..5017f9354ce 100644 --- a/drivers/mmc/core/sd.c +++ b/drivers/mmc/core/sd.c @@ -451,9 +451,11 @@ static int sd_select_driver_type(struct mmc_card *card, u8 *status)  	 * information and let the hardware specific code  	 * return what is possible given the options  	 */ +	mmc_host_clk_hold(card->host);  	drive_strength = card->host->ops->select_drive_strength(  		card->sw_caps.uhs_max_dtr,  		host_drv_type, card_drv_type); +	mmc_host_clk_release(card->host);  	err = mmc_sd_switch(card, 1, 2, drive_strength, status);  	if (err) @@ -660,9 +662,12 @@ static int mmc_sd_init_uhs_card(struct mmc_card *card)  		goto out;  	/* SPI mode doesn't define CMD19 */ -	if (!mmc_host_is_spi(card->host) && card->host->ops->execute_tuning) +	if (!mmc_host_is_spi(card->host) && card->host->ops->execute_tuning) { +		mmc_host_clk_hold(card->host);  		err = card->host->ops->execute_tuning(card->host,  						      MMC_SEND_TUNING_BLOCK); +		mmc_host_clk_release(card->host); +	}  out:  	kfree(status); @@ -850,8 +855,11 @@ int mmc_sd_setup_card(struct mmc_host *host, struct mmc_card *card,  	if (!reinit) {  		int ro = -1; -		if (host->ops->get_ro) +		if (host->ops->get_ro) { +			mmc_host_clk_hold(card->host);  			ro = host->ops->get_ro(host); +			mmc_host_clk_release(card->host); +		}  		if (ro < 0) {  			pr_warning("%s: host does not " @@ -967,8 +975,11 @@ static int mmc_sd_init_card(struct mmc_host *host, u32 ocr,  		 * Since initialization is now complete, enable preset  		 * value registers for UHS-I cards.  		 */ -		if (host->ops->enable_preset_value) +		if (host->ops->enable_preset_value) { +			mmc_host_clk_hold(card->host);  			host->ops->enable_preset_value(host, true); +			mmc_host_clk_release(card->host); +		}  	} else {  		/*  		 * Attempt to change to high-speed (if supported) @@ -1151,8 +1162,11 @@ int mmc_attach_sd(struct mmc_host *host)  		return err;  	/* Disable preset value enable if already set since last time */ -	if (host->ops->enable_preset_value) +	if (host->ops->enable_preset_value) { +		mmc_host_clk_hold(host);  		host->ops->enable_preset_value(host, false); +		mmc_host_clk_release(host); +	}  	err = mmc_send_app_op_cond(host, 0, &ocr);  	if (err) diff --git a/drivers/mmc/core/sdio.c b/drivers/mmc/core/sdio.c index bd7bacc950d..12cde6ee17f 100644 --- a/drivers/mmc/core/sdio.c +++ b/drivers/mmc/core/sdio.c @@ -98,10 +98,11 @@ fail:  	return ret;  } -static int sdio_read_cccr(struct mmc_card *card) +static int sdio_read_cccr(struct mmc_card *card, u32 ocr)  {  	int ret;  	int cccr_vsn; +	int uhs = ocr & R4_18V_PRESENT;  	unsigned char data;  	unsigned char speed; @@ -149,7 +150,7 @@ static int sdio_read_cccr(struct mmc_card *card)  		card->scr.sda_spec3 = 0;  		card->sw_caps.sd3_bus_mode = 0;  		card->sw_caps.sd3_drv_type = 0; -		if (cccr_vsn >= SDIO_CCCR_REV_3_00) { +		if (cccr_vsn >= SDIO_CCCR_REV_3_00 && uhs) {  			card->scr.sda_spec3 = 1;  			ret = mmc_io_rw_direct(card, 0, 0,  				SDIO_CCCR_UHS, 0, &data); @@ -712,7 +713,7 @@ static int mmc_sdio_init_card(struct mmc_host *host, u32 ocr,  	/*  	 * Read the common registers.  	 */ -	err = sdio_read_cccr(card); +	err = sdio_read_cccr(card, ocr);  	if (err)  		goto remove; diff --git a/drivers/mmc/core/sdio_irq.c b/drivers/mmc/core/sdio_irq.c index 68f81b9ee0f..f573e7f9f74 100644 --- a/drivers/mmc/core/sdio_irq.c +++ b/drivers/mmc/core/sdio_irq.c @@ -146,15 +146,21 @@ static int sdio_irq_thread(void *_host)  		}  		set_current_state(TASK_INTERRUPTIBLE); -		if (host->caps & MMC_CAP_SDIO_IRQ) +		if (host->caps & MMC_CAP_SDIO_IRQ) { +			mmc_host_clk_hold(host);  			host->ops->enable_sdio_irq(host, 1); +			mmc_host_clk_release(host); +		}  		if (!kthread_should_stop())  			schedule_timeout(period);  		set_current_state(TASK_RUNNING);  	} while (!kthread_should_stop()); -	if (host->caps & MMC_CAP_SDIO_IRQ) +	if (host->caps & MMC_CAP_SDIO_IRQ) { +		mmc_host_clk_hold(host);  		host->ops->enable_sdio_irq(host, 0); +		mmc_host_clk_release(host); +	}  	pr_debug("%s: IRQ thread exiting with code %d\n",  		 mmc_hostname(host), ret); diff --git a/drivers/mmc/host/atmel-mci.c b/drivers/mmc/host/atmel-mci.c index fcfe1eb5acc..6985cdb0bb2 100644 --- a/drivers/mmc/host/atmel-mci.c +++ b/drivers/mmc/host/atmel-mci.c @@ -969,11 +969,14 @@ static void atmci_start_request(struct atmel_mci *host,  	host->data_status = 0;  	if (host->need_reset) { +		iflags = atmci_readl(host, ATMCI_IMR); +		iflags &= (ATMCI_SDIOIRQA | ATMCI_SDIOIRQB);  		atmci_writel(host, ATMCI_CR, ATMCI_CR_SWRST);  		atmci_writel(host, ATMCI_CR, ATMCI_CR_MCIEN);  		atmci_writel(host, ATMCI_MR, host->mode_reg);  		if (host->caps.has_cfg_reg)  			atmci_writel(host, ATMCI_CFG, host->cfg_reg); +		atmci_writel(host, ATMCI_IER, iflags);  		host->need_reset = false;  	}  	atmci_writel(host, ATMCI_SDCR, slot->sdc_reg); diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c index 0e342793ff1..8bec1c36b15 100644 --- a/drivers/mmc/host/dw_mmc.c +++ b/drivers/mmc/host/dw_mmc.c @@ -22,7 +22,6 @@  #include <linux/ioport.h>  #include <linux/module.h>  #include <linux/platform_device.h> -#include <linux/scatterlist.h>  #include <linux/seq_file.h>  #include <linux/slab.h>  #include <linux/stat.h> @@ -502,8 +501,14 @@ static void dw_mci_submit_data(struct dw_mci *host, struct mmc_data *data)  		host->dir_status = DW_MCI_SEND_STATUS;  	if (dw_mci_submit_data_dma(host, data)) { +		int flags = SG_MITER_ATOMIC; +		if (host->data->flags & MMC_DATA_READ) +			flags |= SG_MITER_TO_SG; +		else +			flags |= SG_MITER_FROM_SG; + +		sg_miter_start(&host->sg_miter, data->sg, data->sg_len, flags);  		host->sg = data->sg; -		host->pio_offset = 0;  		host->part_buf_start = 0;  		host->part_buf_count = 0; @@ -972,6 +977,7 @@ static void dw_mci_tasklet_func(unsigned long priv)  				 * generates a block interrupt, hence setting  				 * the scatter-gather pointer to NULL.  				 */ +				sg_miter_stop(&host->sg_miter);  				host->sg = NULL;  				ctrl = mci_readl(host, CTRL);  				ctrl |= SDMMC_CTRL_FIFO_RESET; @@ -1311,54 +1317,44 @@ static void dw_mci_pull_data(struct dw_mci *host, void *buf, int cnt)  static void dw_mci_read_data_pio(struct dw_mci *host)  { -	struct scatterlist *sg = host->sg; -	void *buf = sg_virt(sg); -	unsigned int offset = host->pio_offset; +	struct sg_mapping_iter *sg_miter = &host->sg_miter; +	void *buf; +	unsigned int offset;  	struct mmc_data	*data = host->data;  	int shift = host->data_shift;  	u32 status;  	unsigned int nbytes = 0, len; +	unsigned int remain, fcnt;  	do { -		len = host->part_buf_count + -			(SDMMC_GET_FCNT(mci_readl(host, STATUS)) << shift); -		if (offset + len <= sg->length) { -			dw_mci_pull_data(host, (void *)(buf + offset), len); +		if (!sg_miter_next(sg_miter)) +			goto done; + +		host->sg = sg_miter->__sg; +		buf = sg_miter->addr; +		remain = sg_miter->length; +		offset = 0; +		do { +			fcnt = (SDMMC_GET_FCNT(mci_readl(host, STATUS)) +					<< shift) + host->part_buf_count; +			len = min(remain, fcnt); +			if (!len) +				break; +			dw_mci_pull_data(host, (void *)(buf + offset), len);  			offset += len;  			nbytes += len; - -			if (offset == sg->length) { -				flush_dcache_page(sg_page(sg)); -				host->sg = sg = sg_next(sg); -				if (!sg) -					goto done; - -				offset = 0; -				buf = sg_virt(sg); -			} -		} else { -			unsigned int remaining = sg->length - offset; -			dw_mci_pull_data(host, (void *)(buf + offset), -					 remaining); -			nbytes += remaining; - -			flush_dcache_page(sg_page(sg)); -			host->sg = sg = sg_next(sg); -			if (!sg) -				goto done; - -			offset = len - remaining; -			buf = sg_virt(sg); -			dw_mci_pull_data(host, buf, offset); -			nbytes += offset; -		} +			remain -= len; +		} while (remain); +		sg_miter->consumed = offset;  		status = mci_readl(host, MINTSTS);  		mci_writel(host, RINTSTS, SDMMC_INT_RXDR);  		if (status & DW_MCI_DATA_ERROR_FLAGS) {  			host->data_status = status;  			data->bytes_xfered += nbytes; +			sg_miter_stop(sg_miter); +			host->sg = NULL;  			smp_wmb();  			set_bit(EVENT_DATA_ERROR, &host->pending_events); @@ -1367,65 +1363,66 @@ static void dw_mci_read_data_pio(struct dw_mci *host)  			return;  		}  	} while (status & SDMMC_INT_RXDR); /*if the RXDR is ready read again*/ -	host->pio_offset = offset;  	data->bytes_xfered += nbytes; + +	if (!remain) { +		if (!sg_miter_next(sg_miter)) +			goto done; +		sg_miter->consumed = 0; +	} +	sg_miter_stop(sg_miter);  	return;  done:  	data->bytes_xfered += nbytes; +	sg_miter_stop(sg_miter); +	host->sg = NULL;  	smp_wmb();  	set_bit(EVENT_XFER_COMPLETE, &host->pending_events);  }  static void dw_mci_write_data_pio(struct dw_mci *host)  { -	struct scatterlist *sg = host->sg; -	void *buf = sg_virt(sg); -	unsigned int offset = host->pio_offset; +	struct sg_mapping_iter *sg_miter = &host->sg_miter; +	void *buf; +	unsigned int offset;  	struct mmc_data	*data = host->data;  	int shift = host->data_shift;  	u32 status;  	unsigned int nbytes = 0, len; +	unsigned int fifo_depth = host->fifo_depth; +	unsigned int remain, fcnt;  	do { -		len = ((host->fifo_depth - -			SDMMC_GET_FCNT(mci_readl(host, STATUS))) << shift) -			- host->part_buf_count; -		if (offset + len <= sg->length) { -			host->push_data(host, (void *)(buf + offset), len); +		if (!sg_miter_next(sg_miter)) +			goto done; +		host->sg = sg_miter->__sg; +		buf = sg_miter->addr; +		remain = sg_miter->length; +		offset = 0; + +		do { +			fcnt = ((fifo_depth - +				 SDMMC_GET_FCNT(mci_readl(host, STATUS))) +					<< shift) - host->part_buf_count; +			len = min(remain, fcnt); +			if (!len) +				break; +			host->push_data(host, (void *)(buf + offset), len);  			offset += len;  			nbytes += len; -			if (offset == sg->length) { -				host->sg = sg = sg_next(sg); -				if (!sg) -					goto done; - -				offset = 0; -				buf = sg_virt(sg); -			} -		} else { -			unsigned int remaining = sg->length - offset; - -			host->push_data(host, (void *)(buf + offset), -					remaining); -			nbytes += remaining; - -			host->sg = sg = sg_next(sg); -			if (!sg) -				goto done; - -			offset = len - remaining; -			buf = sg_virt(sg); -			host->push_data(host, (void *)buf, offset); -			nbytes += offset; -		} +			remain -= len; +		} while (remain); +		sg_miter->consumed = offset;  		status = mci_readl(host, MINTSTS);  		mci_writel(host, RINTSTS, SDMMC_INT_TXDR);  		if (status & DW_MCI_DATA_ERROR_FLAGS) {  			host->data_status = status;  			data->bytes_xfered += nbytes; +			sg_miter_stop(sg_miter); +			host->sg = NULL;  			smp_wmb(); @@ -1435,12 +1432,20 @@ static void dw_mci_write_data_pio(struct dw_mci *host)  			return;  		}  	} while (status & SDMMC_INT_TXDR); /* if TXDR write again */ -	host->pio_offset = offset;  	data->bytes_xfered += nbytes; + +	if (!remain) { +		if (!sg_miter_next(sg_miter)) +			goto done; +		sg_miter->consumed = 0; +	} +	sg_miter_stop(sg_miter);  	return;  done:  	data->bytes_xfered += nbytes; +	sg_miter_stop(sg_miter); +	host->sg = NULL;  	smp_wmb();  	set_bit(EVENT_XFER_COMPLETE, &host->pending_events);  } @@ -1643,6 +1648,7 @@ static void dw_mci_work_routine_card(struct work_struct *work)  				 * block interrupt, hence setting the  				 * scatter-gather pointer to NULL.  				 */ +				sg_miter_stop(&host->sg_miter);  				host->sg = NULL;  				ctrl = mci_readl(host, CTRL); diff --git a/drivers/mmc/host/of_mmc_spi.c b/drivers/mmc/host/of_mmc_spi.c index ab66f2454dc..1534b582c41 100644 --- a/drivers/mmc/host/of_mmc_spi.c +++ b/drivers/mmc/host/of_mmc_spi.c @@ -113,8 +113,8 @@ struct mmc_spi_platform_data *mmc_spi_get_pdata(struct spi_device *spi)  		const int j = i * 2;  		u32 mask; -		mask = mmc_vddrange_to_ocrmask(voltage_ranges[j], -					       voltage_ranges[j + 1]); +		mask = mmc_vddrange_to_ocrmask(be32_to_cpu(voltage_ranges[j]), +					       be32_to_cpu(voltage_ranges[j + 1]));  		if (!mask) {  			ret = -EINVAL;  			dev_err(dev, "OF: voltage-range #%d is invalid\n", i); diff --git a/drivers/mmc/host/sdhci-of-esdhc.c b/drivers/mmc/host/sdhci-of-esdhc.c index ff4adc01804..5d876ff86f3 100644 --- a/drivers/mmc/host/sdhci-of-esdhc.c +++ b/drivers/mmc/host/sdhci-of-esdhc.c @@ -38,6 +38,23 @@ static u8 esdhc_readb(struct sdhci_host *host, int reg)  	int base = reg & ~0x3;  	int shift = (reg & 0x3) * 8;  	u8 ret = (in_be32(host->ioaddr + base) >> shift) & 0xff; + +	/* +	 * "DMA select" locates at offset 0x28 in SD specification, but on +	 * P5020 or P3041, it locates at 0x29. +	 */ +	if (reg == SDHCI_HOST_CONTROL) { +		u32 dma_bits; + +		dma_bits = in_be32(host->ioaddr + reg); +		/* DMA select is 22,23 bits in Protocol Control Register */ +		dma_bits = (dma_bits >> 5) & SDHCI_CTRL_DMA_MASK; + +		/* fixup the result */ +		ret &= ~SDHCI_CTRL_DMA_MASK; +		ret |= dma_bits; +	} +  	return ret;  } @@ -56,6 +73,21 @@ static void esdhc_writew(struct sdhci_host *host, u16 val, int reg)  static void esdhc_writeb(struct sdhci_host *host, u8 val, int reg)  { +	/* +	 * "DMA select" location is offset 0x28 in SD specification, but on +	 * P5020 or P3041, it's located at 0x29. +	 */ +	if (reg == SDHCI_HOST_CONTROL) { +		u32 dma_bits; + +		/* DMA select is 22,23 bits in Protocol Control Register */ +		dma_bits = (val & SDHCI_CTRL_DMA_MASK) << 5; +		clrsetbits_be32(host->ioaddr + reg , SDHCI_CTRL_DMA_MASK << 5, +			dma_bits); +		val &= ~SDHCI_CTRL_DMA_MASK; +		val |= in_be32(host->ioaddr + reg) & SDHCI_CTRL_DMA_MASK; +	} +  	/* Prevent SDHCI core from writing reserved bits (e.g. HISPD). */  	if (reg == SDHCI_HOST_CONTROL)  		val &= ~ESDHC_HOST_CONTROL_RES; diff --git a/drivers/mmc/host/sdhci-pci.c b/drivers/mmc/host/sdhci-pci.c index 7165e6a0927..6ebdc4010e7 100644 --- a/drivers/mmc/host/sdhci-pci.c +++ b/drivers/mmc/host/sdhci-pci.c @@ -250,7 +250,7 @@ static int mfd_emmc_probe_slot(struct sdhci_pci_slot *slot)  static int mfd_sdio_probe_slot(struct sdhci_pci_slot *slot)  { -	slot->host->mmc->caps |= MMC_CAP_POWER_OFF_CARD; +	slot->host->mmc->caps |= MMC_CAP_POWER_OFF_CARD | MMC_CAP_NONREMOVABLE;  	return 0;  } diff --git a/drivers/mmc/host/sdhci-pltfm.c b/drivers/mmc/host/sdhci-pltfm.c index 03970bcb349..c5c2a48bdd9 100644 --- a/drivers/mmc/host/sdhci-pltfm.c +++ b/drivers/mmc/host/sdhci-pltfm.c @@ -2,7 +2,7 @@   * sdhci-pltfm.c Support for SDHCI platform devices   * Copyright (c) 2009 Intel Corporation   * - * Copyright (c) 2007 Freescale Semiconductor, Inc. + * Copyright (c) 2007, 2011 Freescale Semiconductor, Inc.   * Copyright (c) 2009 MontaVista Software, Inc.   *   * Authors: Xiaobo Xie <X.Xie@freescale.com> @@ -71,6 +71,14 @@ void sdhci_get_of_property(struct platform_device *pdev)  		if (sdhci_of_wp_inverted(np))  			host->quirks |= SDHCI_QUIRK_INVERTED_WRITE_PROTECT; +		if (of_device_is_compatible(np, "fsl,p2020-rev1-esdhc")) +			host->quirks |= SDHCI_QUIRK_BROKEN_DMA; + +		if (of_device_is_compatible(np, "fsl,p2020-esdhc") || +		    of_device_is_compatible(np, "fsl,p1010-esdhc") || +		    of_device_is_compatible(np, "fsl,mpc8536-esdhc")) +			host->quirks |= SDHCI_QUIRK_BROKEN_TIMEOUT_VAL; +  		clk = of_get_property(np, "clock-frequency", &size);  		if (clk && size == sizeof(*clk) && *clk)  			pltfm_host->clock = be32_to_cpup(clk); diff --git a/drivers/mmc/host/sh_mmcif.c b/drivers/mmc/host/sh_mmcif.c index f5d8b53be33..352d4797865 100644 --- a/drivers/mmc/host/sh_mmcif.c +++ b/drivers/mmc/host/sh_mmcif.c @@ -1327,7 +1327,7 @@ static int __devinit sh_mmcif_probe(struct platform_device *pdev)  	if (ret < 0)  		goto clean_up2; -	mmc_add_host(mmc); +	INIT_DELAYED_WORK(&host->timeout_work, mmcif_timeout_work);  	sh_mmcif_writel(host->addr, MMCIF_CE_INT_MASK, MASK_ALL); @@ -1338,22 +1338,24 @@ static int __devinit sh_mmcif_probe(struct platform_device *pdev)  	}  	ret = request_threaded_irq(irq[1], sh_mmcif_intr, sh_mmcif_irqt, 0, "sh_mmc:int", host);  	if (ret) { -		free_irq(irq[0], host);  		dev_err(&pdev->dev, "request_irq error (sh_mmc:int)\n"); -		goto clean_up3; +		goto clean_up4;  	} -	INIT_DELAYED_WORK(&host->timeout_work, mmcif_timeout_work); - -	mmc_detect_change(host->mmc, 0); +	ret = mmc_add_host(mmc); +	if (ret < 0) +		goto clean_up5;  	dev_info(&pdev->dev, "driver version %s\n", DRIVER_VERSION);  	dev_dbg(&pdev->dev, "chip ver H'%04x\n",  		sh_mmcif_readl(host->addr, MMCIF_CE_VERSION) & 0x0000ffff);  	return ret; +clean_up5: +	free_irq(irq[1], host); +clean_up4: +	free_irq(irq[0], host);  clean_up3: -	mmc_remove_host(mmc);  	pm_runtime_suspend(&pdev->dev);  clean_up2:  	pm_runtime_disable(&pdev->dev); diff --git a/drivers/mmc/host/tmio_mmc.h b/drivers/mmc/host/tmio_mmc.h index a95e6d90172..f96c536d130 100644 --- a/drivers/mmc/host/tmio_mmc.h +++ b/drivers/mmc/host/tmio_mmc.h @@ -20,8 +20,8 @@  #include <linux/mmc/tmio.h>  #include <linux/mutex.h>  #include <linux/pagemap.h> -#include <linux/spinlock.h>  #include <linux/scatterlist.h> +#include <linux/spinlock.h>  /* Definitions for values the CTRL_SDIO_STATUS register can take. */  #define TMIO_SDIO_STAT_IOIRQ	0x0001 @@ -120,6 +120,7 @@ void tmio_mmc_start_dma(struct tmio_mmc_host *host, struct mmc_data *data);  void tmio_mmc_enable_dma(struct tmio_mmc_host *host, bool enable);  void tmio_mmc_request_dma(struct tmio_mmc_host *host, struct tmio_mmc_data *pdata);  void tmio_mmc_release_dma(struct tmio_mmc_host *host); +void tmio_mmc_abort_dma(struct tmio_mmc_host *host);  #else  static inline void tmio_mmc_start_dma(struct tmio_mmc_host *host,  			       struct mmc_data *data) @@ -140,6 +141,10 @@ static inline void tmio_mmc_request_dma(struct tmio_mmc_host *host,  static inline void tmio_mmc_release_dma(struct tmio_mmc_host *host)  {  } + +static inline void tmio_mmc_abort_dma(struct tmio_mmc_host *host) +{ +}  #endif  #ifdef CONFIG_PM diff --git a/drivers/mmc/host/tmio_mmc_dma.c b/drivers/mmc/host/tmio_mmc_dma.c index 7a6e6cc8f8b..8253ec12003 100644 --- a/drivers/mmc/host/tmio_mmc_dma.c +++ b/drivers/mmc/host/tmio_mmc_dma.c @@ -34,6 +34,18 @@ void tmio_mmc_enable_dma(struct tmio_mmc_host *host, bool enable)  #endif  } +void tmio_mmc_abort_dma(struct tmio_mmc_host *host) +{ +	tmio_mmc_enable_dma(host, false); + +	if (host->chan_rx) +		dmaengine_terminate_all(host->chan_rx); +	if (host->chan_tx) +		dmaengine_terminate_all(host->chan_tx); + +	tmio_mmc_enable_dma(host, true); +} +  static void tmio_mmc_start_dma_rx(struct tmio_mmc_host *host)  {  	struct scatterlist *sg = host->sg_ptr, *sg_tmp; diff --git a/drivers/mmc/host/tmio_mmc_pio.c b/drivers/mmc/host/tmio_mmc_pio.c index abad01b37cf..5f9ad74fbf8 100644 --- a/drivers/mmc/host/tmio_mmc_pio.c +++ b/drivers/mmc/host/tmio_mmc_pio.c @@ -41,8 +41,8 @@  #include <linux/platform_device.h>  #include <linux/pm_runtime.h>  #include <linux/scatterlist.h> -#include <linux/workqueue.h>  #include <linux/spinlock.h> +#include <linux/workqueue.h>  #include "tmio_mmc.h" @@ -246,6 +246,7 @@ static void tmio_mmc_reset_work(struct work_struct *work)  	/* Ready for new calls */  	host->mrq = NULL; +	tmio_mmc_abort_dma(host);  	mmc_request_done(host->mmc, mrq);  } @@ -272,6 +273,9 @@ static void tmio_mmc_finish_request(struct tmio_mmc_host *host)  	host->mrq = NULL;  	spin_unlock_irqrestore(&host->lock, flags); +	if (mrq->cmd->error || (mrq->data && mrq->data->error)) +		tmio_mmc_abort_dma(host); +  	mmc_request_done(host->mmc, mrq);  } diff --git a/drivers/net/ethernet/3com/3c59x.c b/drivers/net/ethernet/3com/3c59x.c index 8153a3e0a1a..f9b74c0a849 100644 --- a/drivers/net/ethernet/3com/3c59x.c +++ b/drivers/net/ethernet/3com/3c59x.c @@ -1842,7 +1842,7 @@ vortex_timer(unsigned long data)  		ok = 1;  	} -	if (!netif_carrier_ok(dev)) +	if (dev->flags & IFF_SLAVE || !netif_carrier_ok(dev))  		next_tick = 5*HZ;  	if (vp->medialock) diff --git a/drivers/net/ethernet/broadcom/bcm63xx_enet.c b/drivers/net/ethernet/broadcom/bcm63xx_enet.c index 986019b2c84..c7ca7ec065e 100644 --- a/drivers/net/ethernet/broadcom/bcm63xx_enet.c +++ b/drivers/net/ethernet/broadcom/bcm63xx_enet.c @@ -797,7 +797,7 @@ static int bcm_enet_open(struct net_device *dev)  	if (priv->has_phy) {  		/* connect to PHY */  		snprintf(phy_id, sizeof(phy_id), PHY_ID_FMT, -			 priv->mac_id ? "1" : "0", priv->phy_id); +			 priv->mii_bus->id, priv->phy_id);  		phydev = phy_connect(dev, phy_id, bcm_enet_adjust_phy_link, 0,  				     PHY_INTERFACE_MODE_MII); diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c index 1e3f978ee6d..25452131915 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c @@ -117,10 +117,6 @@ static int dropless_fc;  module_param(dropless_fc, int, 0);  MODULE_PARM_DESC(dropless_fc, " Pause on exhausted host ring"); -static int poll; -module_param(poll, int, 0); -MODULE_PARM_DESC(poll, " Use polling (for debug)"); -  static int mrrs = -1;  module_param(mrrs, int, 0);  MODULE_PARM_DESC(mrrs, " Force Max Read Req Size (0..3) (for debug)"); @@ -4834,20 +4830,11 @@ void bnx2x_drv_pulse(struct bnx2x *bp)  static void bnx2x_timer(unsigned long data)  { -	u8 cos;  	struct bnx2x *bp = (struct bnx2x *) data;  	if (!netif_running(bp->dev))  		return; -	if (poll) { -		struct bnx2x_fastpath *fp = &bp->fp[0]; - -		for_each_cos_in_tx_queue(fp, cos) -			bnx2x_tx_int(bp, &fp->txdata[cos]); -		bnx2x_rx_int(fp, 1000); -	} -  	if (!BP_NOMCP(bp)) {  		int mb_idx = BP_FW_MB_IDX(bp);  		u32 drv_pulse; @@ -10063,7 +10050,6 @@ static void __devinit bnx2x_set_modes_bitmap(struct bnx2x *bp)  static int __devinit bnx2x_init_bp(struct bnx2x *bp)  {  	int func; -	int timer_interval;  	int rc;  	mutex_init(&bp->port.phy_mutex); @@ -10139,8 +10125,7 @@ static int __devinit bnx2x_init_bp(struct bnx2x *bp)  	bp->tx_ticks = (50 / BNX2X_BTR) * BNX2X_BTR;  	bp->rx_ticks = (25 / BNX2X_BTR) * BNX2X_BTR; -	timer_interval = (CHIP_REV_IS_SLOW(bp) ? 5*HZ : HZ); -	bp->current_interval = (poll ? poll : timer_interval); +	bp->current_interval = CHIP_REV_IS_SLOW(bp) ? 5*HZ : HZ;  	init_timer(&bp->timer);  	bp->timer.expires = jiffies + bp->current_interval; diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_stats.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_stats.c index bc0121ac291..1adef266fcd 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_stats.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_stats.c @@ -1081,17 +1081,17 @@ static int bnx2x_storm_stats_update(struct bnx2x *bp)  	       estats->rx_stat_ifhcinbadoctets_lo);  	ADD_64(fstats->total_bytes_received_hi, -	       tfunc->rcv_error_bytes.hi, +	       le32_to_cpu(tfunc->rcv_error_bytes.hi),  	       fstats->total_bytes_received_lo, -	       tfunc->rcv_error_bytes.lo); +	       le32_to_cpu(tfunc->rcv_error_bytes.lo));  	memcpy(estats, &(fstats->total_bytes_received_hi),  	       sizeof(struct host_func_stats) - 2*sizeof(u32));  	ADD_64(estats->error_bytes_received_hi, -	       tfunc->rcv_error_bytes.hi, +	       le32_to_cpu(tfunc->rcv_error_bytes.hi),  	       estats->error_bytes_received_lo, -	       tfunc->rcv_error_bytes.lo); +	       le32_to_cpu(tfunc->rcv_error_bytes.lo));  	ADD_64(estats->etherstatsoverrsizepkts_hi,  	       estats->rx_stat_dot3statsframestoolong_hi, diff --git a/drivers/net/ethernet/freescale/fec.c b/drivers/net/ethernet/freescale/fec.c index 1c7aad8fa19..e92ef1bd732 100644 --- a/drivers/net/ethernet/freescale/fec.c +++ b/drivers/net/ethernet/freescale/fec.c @@ -986,7 +986,7 @@ static int fec_enet_mii_probe(struct net_device *ndev)  		printk(KERN_INFO  			"%s: no PHY, assuming direct connection to switch\n",  			ndev->name); -		strncpy(mdio_bus_id, "0", MII_BUS_ID_SIZE); +		strncpy(mdio_bus_id, "fixed-0", MII_BUS_ID_SIZE);  		phy_id = 0;  	} diff --git a/drivers/net/ethernet/mellanox/mlx4/eq.c b/drivers/net/ethernet/mellanox/mlx4/eq.c index 55d7bd4e210..8fa41f3082c 100644 --- a/drivers/net/ethernet/mellanox/mlx4/eq.c +++ b/drivers/net/ethernet/mellanox/mlx4/eq.c @@ -815,8 +815,9 @@ int mlx4_init_eq_table(struct mlx4_dev *dev)  	int err;  	int i; -	priv->eq_table.uar_map = kcalloc(sizeof *priv->eq_table.uar_map, -					 mlx4_num_eq_uar(dev), GFP_KERNEL); +	priv->eq_table.uar_map = kcalloc(mlx4_num_eq_uar(dev), +					 sizeof *priv->eq_table.uar_map, +					 GFP_KERNEL);  	if (!priv->eq_table.uar_map) {  		err = -ENOMEM;  		goto err_out_free; diff --git a/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c b/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c index dcd819bfb2f..bfdb7af19e4 100644 --- a/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c +++ b/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c @@ -73,6 +73,7 @@ struct res_gid {  	struct list_head	list;  	u8			gid[16];  	enum mlx4_protocol	prot; +	enum mlx4_steer_type	steer;  };  enum res_qp_states { @@ -374,6 +375,7 @@ static struct res_common *alloc_qp_tr(int id)  	ret->com.res_id = id;  	ret->com.state = RES_QP_RESERVED; +	ret->local_qpn = id;  	INIT_LIST_HEAD(&ret->mcg_list);  	spin_lock_init(&ret->mcg_spl); @@ -2479,7 +2481,8 @@ static struct res_gid *find_gid(struct mlx4_dev *dev, int slave,  }  static int add_mcg_res(struct mlx4_dev *dev, int slave, struct res_qp *rqp, -		       u8 *gid, enum mlx4_protocol prot) +		       u8 *gid, enum mlx4_protocol prot, +		       enum mlx4_steer_type steer)  {  	struct res_gid *res;  	int err; @@ -2495,6 +2498,7 @@ static int add_mcg_res(struct mlx4_dev *dev, int slave, struct res_qp *rqp,  	} else {  		memcpy(res->gid, gid, 16);  		res->prot = prot; +		res->steer = steer;  		list_add_tail(&res->list, &rqp->mcg_list);  		err = 0;  	} @@ -2504,14 +2508,15 @@ static int add_mcg_res(struct mlx4_dev *dev, int slave, struct res_qp *rqp,  }  static int rem_mcg_res(struct mlx4_dev *dev, int slave, struct res_qp *rqp, -		       u8 *gid, enum mlx4_protocol prot) +		       u8 *gid, enum mlx4_protocol prot, +		       enum mlx4_steer_type steer)  {  	struct res_gid *res;  	int err;  	spin_lock_irq(&rqp->mcg_spl);  	res = find_gid(dev, slave, rqp, gid); -	if (!res || res->prot != prot) +	if (!res || res->prot != prot || res->steer != steer)  		err = -EINVAL;  	else {  		list_del(&res->list); @@ -2538,7 +2543,7 @@ int mlx4_QP_ATTACH_wrapper(struct mlx4_dev *dev, int slave,  	int attach = vhcr->op_modifier;  	int block_loopback = vhcr->in_modifier >> 31;  	u8 steer_type_mask = 2; -	enum mlx4_steer_type type = gid[7] & steer_type_mask; +	enum mlx4_steer_type type = (gid[7] & steer_type_mask) >> 1;  	qpn = vhcr->in_modifier & 0xffffff;  	err = get_res(dev, slave, qpn, RES_QP, &rqp); @@ -2547,7 +2552,7 @@ int mlx4_QP_ATTACH_wrapper(struct mlx4_dev *dev, int slave,  	qp.qpn = qpn;  	if (attach) { -		err = add_mcg_res(dev, slave, rqp, gid, prot); +		err = add_mcg_res(dev, slave, rqp, gid, prot, type);  		if (err)  			goto ex_put; @@ -2556,7 +2561,7 @@ int mlx4_QP_ATTACH_wrapper(struct mlx4_dev *dev, int slave,  		if (err)  			goto ex_rem;  	} else { -		err = rem_mcg_res(dev, slave, rqp, gid, prot); +		err = rem_mcg_res(dev, slave, rqp, gid, prot, type);  		if (err)  			goto ex_put;  		err = mlx4_qp_detach_common(dev, &qp, gid, prot, type); @@ -2567,7 +2572,7 @@ int mlx4_QP_ATTACH_wrapper(struct mlx4_dev *dev, int slave,  ex_rem:  	/* ignore error return below, already in error */ -	err1 = rem_mcg_res(dev, slave, rqp, gid, prot); +	err1 = rem_mcg_res(dev, slave, rqp, gid, prot, type);  ex_put:  	put_res(dev, slave, qpn, RES_QP); @@ -2606,7 +2611,7 @@ static void detach_qp(struct mlx4_dev *dev, int slave, struct res_qp *rqp)  	list_for_each_entry_safe(rgid, tmp, &rqp->mcg_list, list) {  		qp.qpn = rqp->local_qpn;  		err = mlx4_qp_detach_common(dev, &qp, rgid->gid, rgid->prot, -					    MLX4_MC_STEER); +					    rgid->steer);  		list_del(&rgid->list);  		kfree(rgid);  	} diff --git a/drivers/net/ethernet/micrel/ks8851.c b/drivers/net/ethernet/micrel/ks8851.c index 6b35e7da9a9..0c3e4005224 100644 --- a/drivers/net/ethernet/micrel/ks8851.c +++ b/drivers/net/ethernet/micrel/ks8851.c @@ -583,7 +583,7 @@ static void ks8851_rx_pkts(struct ks8851_net *ks)  					ks8851_dbg_dumpkkt(ks, rxpkt);  				skb->protocol = eth_type_trans(skb, ks->netdev); -				netif_rx(skb); +				netif_rx_ni(skb);  				ks->netdev->stats.rx_packets++;  				ks->netdev->stats.rx_bytes += rxlen; diff --git a/drivers/net/ethernet/micrel/ks8851_mll.c b/drivers/net/ethernet/micrel/ks8851_mll.c index e58e78e5c93..231176fcd2b 100644 --- a/drivers/net/ethernet/micrel/ks8851_mll.c +++ b/drivers/net/ethernet/micrel/ks8851_mll.c @@ -394,7 +394,6 @@ union ks_tx_hdr {   * @msg_enable	: The message flags controlling driver output (see ethtool).   * @frame_cnt  	: number of frames received.   * @bus_width  	: i/o bus width. - * @irq    	: irq number assigned to this device.   * @rc_rxqcr	: Cached copy of KS_RXQCR.   * @rc_txcr	: Cached copy of KS_TXCR.   * @rc_ier	: Cached copy of KS_IER. @@ -441,7 +440,6 @@ struct ks_net {  	u32			msg_enable;  	u32			frame_cnt;  	int			bus_width; -	int             	irq;  	u16			rc_rxqcr;  	u16			rc_txcr; @@ -907,10 +905,10 @@ static int ks_net_open(struct net_device *netdev)  	netif_dbg(ks, ifup, ks->netdev, "%s - entry\n", __func__);  	/* reset the HW */ -	err = request_irq(ks->irq, ks_irq, KS_INT_FLAGS, DRV_NAME, netdev); +	err = request_irq(netdev->irq, ks_irq, KS_INT_FLAGS, DRV_NAME, netdev);  	if (err) { -		pr_err("Failed to request IRQ: %d: %d\n", ks->irq, err); +		pr_err("Failed to request IRQ: %d: %d\n", netdev->irq, err);  		return err;  	} @@ -955,7 +953,7 @@ static int ks_net_stop(struct net_device *netdev)  	/* set powermode to soft power down to save power */  	ks_set_powermode(ks, PMECR_PM_SOFTDOWN); -	free_irq(ks->irq, netdev); +	free_irq(netdev->irq, netdev);  	mutex_unlock(&ks->lock);  	return 0;  } @@ -1545,10 +1543,10 @@ static int __devinit ks8851_probe(struct platform_device *pdev)  	if (!ks->hw_addr_cmd)  		goto err_ioremap1; -	ks->irq = platform_get_irq(pdev, 0); +	netdev->irq = platform_get_irq(pdev, 0); -	if (ks->irq < 0) { -		err = ks->irq; +	if (netdev->irq < 0) { +		err = netdev->irq;  		goto err_get_irq;  	} diff --git a/drivers/net/ethernet/octeon/octeon_mgmt.c b/drivers/net/ethernet/octeon/octeon_mgmt.c index 212f43b308a..cd827ff4a02 100644 --- a/drivers/net/ethernet/octeon/octeon_mgmt.c +++ b/drivers/net/ethernet/octeon/octeon_mgmt.c @@ -670,7 +670,7 @@ static void octeon_mgmt_adjust_link(struct net_device *netdev)  static int octeon_mgmt_init_phy(struct net_device *netdev)  {  	struct octeon_mgmt *p = netdev_priv(netdev); -	char phy_id[20]; +	char phy_id[MII_BUS_ID_SIZE + 3];  	if (octeon_is_simulation()) {  		/* No PHYs in the simulator. */ @@ -678,7 +678,7 @@ static int octeon_mgmt_init_phy(struct net_device *netdev)  		return 0;  	} -	snprintf(phy_id, sizeof(phy_id), PHY_ID_FMT, "0", p->port); +	snprintf(phy_id, sizeof(phy_id), PHY_ID_FMT, "mdio-octeon-0", p->port);  	p->phydev = phy_connect(netdev, phy_id, octeon_mgmt_adjust_link, 0,  				PHY_INTERFACE_MODE_MII); diff --git a/drivers/net/ethernet/stmicro/stmmac/common.h b/drivers/net/ethernet/stmicro/stmmac/common.h index d0b814ef067..0319d640f72 100644 --- a/drivers/net/ethernet/stmicro/stmmac/common.h +++ b/drivers/net/ethernet/stmicro/stmmac/common.h @@ -67,6 +67,7 @@ struct stmmac_extra_stats {  	unsigned long ipc_csum_error;  	unsigned long rx_collision;  	unsigned long rx_crc; +	unsigned long dribbling_bit;  	unsigned long rx_length;  	unsigned long rx_mii;  	unsigned long rx_multicast; diff --git a/drivers/net/ethernet/stmicro/stmmac/enh_desc.c b/drivers/net/ethernet/stmicro/stmmac/enh_desc.c index d87976364ec..ad1b627f8ec 100644 --- a/drivers/net/ethernet/stmicro/stmmac/enh_desc.c +++ b/drivers/net/ethernet/stmicro/stmmac/enh_desc.c @@ -201,7 +201,7 @@ static int enh_desc_get_rx_status(void *data, struct stmmac_extra_stats *x,  	if (unlikely(p->des01.erx.dribbling)) {  		CHIP_DBG(KERN_ERR "GMAC RX: dribbling error\n"); -		ret = discard_frame; +		x->dribbling_bit++;  	}  	if (unlikely(p->des01.erx.sa_filter_fail)) {  		CHIP_DBG(KERN_ERR "GMAC RX : Source Address filter fail\n"); diff --git a/drivers/net/ethernet/stmicro/stmmac/norm_desc.c b/drivers/net/ethernet/stmicro/stmmac/norm_desc.c index fda5d2b31d3..25953bb45a7 100644 --- a/drivers/net/ethernet/stmicro/stmmac/norm_desc.c +++ b/drivers/net/ethernet/stmicro/stmmac/norm_desc.c @@ -104,7 +104,7 @@ static int ndesc_get_rx_status(void *data, struct stmmac_extra_stats *x,  		ret = discard_frame;  	}  	if (unlikely(p->des01.rx.dribbling)) -		ret = discard_frame; +		x->dribbling_bit++;  	if (unlikely(p->des01.rx.length_error)) {  		x->rx_length++; diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac.h b/drivers/net/ethernet/stmicro/stmmac/stmmac.h index 120740020e2..b4b095fdcf2 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac.h +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac.h @@ -21,7 +21,7 @@  *******************************************************************************/  #define STMMAC_RESOURCE_NAME   "stmmaceth" -#define DRV_MODULE_VERSION	"Dec_2011" +#define DRV_MODULE_VERSION	"Feb_2012"  #include <linux/stmmac.h>  #include <linux/phy.h>  #include "common.h" @@ -97,4 +97,5 @@ int stmmac_resume(struct net_device *ndev);  int stmmac_suspend(struct net_device *ndev);  int stmmac_dvr_remove(struct net_device *ndev);  struct stmmac_priv *stmmac_dvr_probe(struct device *device, -				struct plat_stmmacenet_data *plat_dat); +				     struct plat_stmmacenet_data *plat_dat, +				     void __iomem *addr); diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c index 9573303a706..f98e1511660 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c @@ -47,23 +47,25 @@ struct stmmac_stats {  	offsetof(struct stmmac_priv, xstats.m)}  static const struct stmmac_stats stmmac_gstrings_stats[] = { +	/* Transmit errors */  	STMMAC_STAT(tx_underflow),  	STMMAC_STAT(tx_carrier),  	STMMAC_STAT(tx_losscarrier),  	STMMAC_STAT(vlan_tag),  	STMMAC_STAT(tx_deferred),  	STMMAC_STAT(tx_vlan), -	STMMAC_STAT(rx_vlan),  	STMMAC_STAT(tx_jabber),  	STMMAC_STAT(tx_frame_flushed),  	STMMAC_STAT(tx_payload_error),  	STMMAC_STAT(tx_ip_header_error), +	/* Receive errors */  	STMMAC_STAT(rx_desc),  	STMMAC_STAT(sa_filter_fail),  	STMMAC_STAT(overflow_error),  	STMMAC_STAT(ipc_csum_error),  	STMMAC_STAT(rx_collision),  	STMMAC_STAT(rx_crc), +	STMMAC_STAT(dribbling_bit),  	STMMAC_STAT(rx_length),  	STMMAC_STAT(rx_mii),  	STMMAC_STAT(rx_multicast), @@ -73,6 +75,8 @@ static const struct stmmac_stats stmmac_gstrings_stats[] = {  	STMMAC_STAT(sa_rx_filter_fail),  	STMMAC_STAT(rx_missed_cntr),  	STMMAC_STAT(rx_overflow_cntr), +	STMMAC_STAT(rx_vlan), +	/* Tx/Rx IRQ errors */  	STMMAC_STAT(tx_undeflow_irq),  	STMMAC_STAT(tx_process_stopped_irq),  	STMMAC_STAT(tx_jabber_irq), @@ -82,6 +86,7 @@ static const struct stmmac_stats stmmac_gstrings_stats[] = {  	STMMAC_STAT(rx_watchdog_irq),  	STMMAC_STAT(tx_early_irq),  	STMMAC_STAT(fatal_bus_error_irq), +	/* Extra info */  	STMMAC_STAT(threshold),  	STMMAC_STAT(tx_pkt_n),  	STMMAC_STAT(rx_pkt_n), diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c index 96fa2da3076..6ee593a55a6 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c @@ -241,7 +241,7 @@ static void stmmac_adjust_link(struct net_device *dev)  			case 1000:  				if (likely(priv->plat->has_gmac))  					ctrl &= ~priv->hw->link.port; -				stmmac_hw_fix_mac_speed(priv); +					stmmac_hw_fix_mac_speed(priv);  				break;  			case 100:  			case 10: @@ -785,7 +785,7 @@ static u32 stmmac_get_synopsys_id(struct stmmac_priv *priv)  		u32 uid = ((hwid & 0x0000ff00) >> 8);  		u32 synid = (hwid & 0x000000ff); -		pr_info("STMMAC - user ID: 0x%x, Synopsys ID: 0x%x\n", +		pr_info("stmmac - user ID: 0x%x, Synopsys ID: 0x%x\n",  			uid, synid);  		return synid; @@ -869,38 +869,6 @@ static int stmmac_get_hw_features(struct stmmac_priv *priv)  	return hw_cap;  } -/** - * stmmac_mac_device_setup - * @dev : device pointer - * Description: this is to attach the GMAC or MAC 10/100 - * main core structures that will be completed during the - * open step. - */ -static int stmmac_mac_device_setup(struct net_device *dev) -{ -	struct stmmac_priv *priv = netdev_priv(dev); - -	struct mac_device_info *device; - -	if (priv->plat->has_gmac) -		device = dwmac1000_setup(priv->ioaddr); -	else -		device = dwmac100_setup(priv->ioaddr); - -	if (!device) -		return -ENOMEM; - -	priv->hw = device; -	priv->hw->ring = &ring_mode_ops; - -	if (device_can_wakeup(priv->device)) { -		priv->wolopts = WAKE_MAGIC; /* Magic Frame as default */ -		enable_irq_wake(priv->wol_irq); -	} - -	return 0; -} -  static void stmmac_check_ether_addr(struct stmmac_priv *priv)  {  	/* verify if the MAC address is valid, in case of failures it @@ -930,20 +898,8 @@ static int stmmac_open(struct net_device *dev)  	struct stmmac_priv *priv = netdev_priv(dev);  	int ret; -	/* MAC HW device setup */ -	ret = stmmac_mac_device_setup(dev); -	if (ret < 0) -		return ret; -  	stmmac_check_ether_addr(priv); -	stmmac_verify_args(); - -	/* Override with kernel parameters if supplied XXX CRS XXX -	 * this needs to have multiple instances */ -	if ((phyaddr >= 0) && (phyaddr <= 31)) -		priv->plat->phy_addr = phyaddr; -  	/* MDIO bus Registration */  	ret = stmmac_mdio_register(dev);  	if (ret < 0) { @@ -976,44 +932,6 @@ static int stmmac_open(struct net_device *dev)  		goto open_error;  	} -	stmmac_get_synopsys_id(priv); - -	priv->hw_cap_support = stmmac_get_hw_features(priv); - -	if (priv->hw_cap_support) { -		pr_info(" Support DMA HW capability register"); - -		/* We can override some gmac/dma configuration fields: e.g. -		 * enh_desc, tx_coe (e.g. that are passed through the -		 * platform) with the values from the HW capability -		 * register (if supported). -		 */ -		priv->plat->enh_desc = priv->dma_cap.enh_desc; -		priv->plat->tx_coe = priv->dma_cap.tx_coe; -		priv->plat->pmt = priv->dma_cap.pmt_remote_wake_up; - -		/* By default disable wol on magic frame if not supported */ -		if (!priv->dma_cap.pmt_magic_frame) -			priv->wolopts &= ~WAKE_MAGIC; - -	} else -		pr_info(" No HW DMA feature register supported"); - -	/* Select the enhnaced/normal descriptor structures */ -	stmmac_selec_desc_mode(priv); - -	/* PMT module is not integrated in all the MAC devices. */ -	if (priv->plat->pmt) { -		pr_info(" Remote wake-up capable\n"); -		device_set_wakeup_capable(priv->device, 1); -	} - -	priv->rx_coe = priv->hw->mac->rx_coe(priv->ioaddr); -	if (priv->rx_coe) -		pr_info(" Checksum Offload Engine supported\n"); -	if (priv->plat->tx_coe) -		pr_info(" Checksum insertion supported\n"); -  	/* Create and initialize the TX/RX descriptors chains. */  	priv->dma_tx_size = STMMAC_ALIGN(dma_txsize);  	priv->dma_rx_size = STMMAC_ALIGN(dma_rxsize); @@ -1030,14 +948,14 @@ static int stmmac_open(struct net_device *dev)  	/* Copy the MAC addr into the HW  */  	priv->hw->mac->set_umac_addr(priv->ioaddr, dev->dev_addr, 0); +  	/* If required, perform hw setup of the bus. */  	if (priv->plat->bus_setup)  		priv->plat->bus_setup(priv->ioaddr); +  	/* Initialize the MAC Core */  	priv->hw->mac->core_init(priv->ioaddr); -	netdev_update_features(dev); -  	/* Request the IRQ lines */  	ret = request_irq(dev->irq, stmmac_interrupt,  			 IRQF_SHARED, dev->name, dev); @@ -1047,6 +965,17 @@ static int stmmac_open(struct net_device *dev)  		goto open_error;  	} +	/* Request the Wake IRQ in case of another line is used for WoL */ +	if (priv->wol_irq != dev->irq) { +		ret = request_irq(priv->wol_irq, stmmac_interrupt, +				  IRQF_SHARED, dev->name, dev); +		if (unlikely(ret < 0)) { +			pr_err("%s: ERROR: allocating the ext WoL IRQ %d " +			       "(error: %d)\n",	__func__, priv->wol_irq, ret); +			goto open_error_wolirq; +		} +	} +  	/* Enable the MAC Rx/Tx */  	stmmac_set_mac(priv->ioaddr, true); @@ -1062,7 +991,7 @@ static int stmmac_open(struct net_device *dev)  #ifdef CONFIG_STMMAC_DEBUG_FS  	ret = stmmac_init_fs(dev);  	if (ret < 0) -		pr_warning("\tFailed debugFS registration"); +		pr_warning("%s: failed debugFS registration\n", __func__);  #endif  	/* Start the ball rolling... */  	DBG(probe, DEBUG, "%s: DMA RX/TX processes started...\n", dev->name); @@ -1072,6 +1001,7 @@ static int stmmac_open(struct net_device *dev)  #ifdef CONFIG_STMMAC_TIMER  	priv->tm->timer_start(tmrate);  #endif +  	/* Dump DMA/MAC registers */  	if (netif_msg_hw(priv)) {  		priv->hw->mac->dump_regs(priv->ioaddr); @@ -1087,6 +1017,9 @@ static int stmmac_open(struct net_device *dev)  	return 0; +open_error_wolirq: +	free_irq(dev->irq, dev); +  open_error:  #ifdef CONFIG_STMMAC_TIMER  	kfree(priv->tm); @@ -1127,6 +1060,8 @@ static int stmmac_release(struct net_device *dev)  	/* Free the IRQ lines */  	free_irq(dev->irq, dev); +	if (priv->wol_irq != dev->irq) +		free_irq(priv->wol_irq, dev);  	/* Stop TX/RX DMA and clear the descriptors */  	priv->hw->dma->stop_tx(priv->ioaddr); @@ -1789,13 +1724,77 @@ static const struct net_device_ops stmmac_netdev_ops = {  };  /** + *  stmmac_hw_init - Init the MAC device + *  @priv : pointer to the private device structure. + *  Description: this function detects which MAC device + *  (GMAC/MAC10-100) has to attached, checks the HW capability + *  (if supported) and sets the driver's features (for example + *  to use the ring or chaine mode or support the normal/enh + *  descriptor structure). + */ +static int stmmac_hw_init(struct stmmac_priv *priv) +{ +	int ret = 0; +	struct mac_device_info *mac; + +	/* Identify the MAC HW device */ +	if (priv->plat->has_gmac) +		mac = dwmac1000_setup(priv->ioaddr); +	else +		mac = dwmac100_setup(priv->ioaddr); +	if (!mac) +		return -ENOMEM; + +	priv->hw = mac; + +	/* To use the chained or ring mode */ +	priv->hw->ring = &ring_mode_ops; + +	/* Get and dump the chip ID */ +	stmmac_get_synopsys_id(priv); + +	/* Get the HW capability (new GMAC newer than 3.50a) */ +	priv->hw_cap_support = stmmac_get_hw_features(priv); +	if (priv->hw_cap_support) { +		pr_info(" DMA HW capability register supported"); + +		/* We can override some gmac/dma configuration fields: e.g. +		 * enh_desc, tx_coe (e.g. that are passed through the +		 * platform) with the values from the HW capability +		 * register (if supported). +		 */ +		priv->plat->enh_desc = priv->dma_cap.enh_desc; +		priv->plat->tx_coe = priv->dma_cap.tx_coe; +		priv->plat->pmt = priv->dma_cap.pmt_remote_wake_up; +	} else +		pr_info(" No HW DMA feature register supported"); + +	/* Select the enhnaced/normal descriptor structures */ +	stmmac_selec_desc_mode(priv); + +	priv->rx_coe = priv->hw->mac->rx_coe(priv->ioaddr); +	if (priv->rx_coe) +		pr_info(" RX Checksum Offload Engine supported\n"); +	if (priv->plat->tx_coe) +		pr_info(" TX Checksum insertion supported\n"); + +	if (priv->plat->pmt) { +		pr_info(" Wake-Up On Lan supported\n"); +		device_set_wakeup_capable(priv->device, 1); +	} + +	return ret; +} + +/**   * stmmac_dvr_probe   * @device: device pointer   * Description: this is the main probe function used to   * call the alloc_etherdev, allocate the priv structure.   */  struct stmmac_priv *stmmac_dvr_probe(struct device *device, -					struct plat_stmmacenet_data *plat_dat) +				     struct plat_stmmacenet_data *plat_dat, +				     void __iomem *addr)  {  	int ret = 0;  	struct net_device *ndev = NULL; @@ -1815,10 +1814,27 @@ struct stmmac_priv *stmmac_dvr_probe(struct device *device,  	ether_setup(ndev); -	ndev->netdev_ops = &stmmac_netdev_ops;  	stmmac_set_ethtool_ops(ndev); +	priv->pause = pause; +	priv->plat = plat_dat; +	priv->ioaddr = addr; +	priv->dev->base_addr = (unsigned long)addr; + +	/* Verify driver arguments */ +	stmmac_verify_args(); + +	/* Override with kernel parameters if supplied XXX CRS XXX +	 * this needs to have multiple instances */ +	if ((phyaddr >= 0) && (phyaddr <= 31)) +		priv->plat->phy_addr = phyaddr; + +	/* Init MAC and get the capabilities */ +	stmmac_hw_init(priv); + +	ndev->netdev_ops = &stmmac_netdev_ops; -	ndev->hw_features = NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM; +	ndev->hw_features = NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM | +			    NETIF_F_RXCSUM;  	ndev->features |= ndev->hw_features | NETIF_F_HIGHDMA;  	ndev->watchdog_timeo = msecs_to_jiffies(watchdog);  #ifdef STMMAC_VLAN_TAG_USED @@ -1830,8 +1846,6 @@ struct stmmac_priv *stmmac_dvr_probe(struct device *device,  	if (flow_ctrl)  		priv->flow_ctrl = FLOW_AUTO;	/* RX/TX pause on */ -	priv->pause = pause; -	priv->plat = plat_dat;  	netif_napi_add(ndev, &priv->napi, stmmac_poll, 64);  	spin_lock_init(&priv->lock); @@ -1839,15 +1853,10 @@ struct stmmac_priv *stmmac_dvr_probe(struct device *device,  	ret = register_netdev(ndev);  	if (ret) { -		pr_err("%s: ERROR %i registering the device\n", -		       __func__, ret); +		pr_err("%s: ERROR %i registering the device\n", __func__, ret);  		goto error;  	} -	DBG(probe, DEBUG, "%s: Scatter/Gather: %s - HW checksums: %s\n", -	    ndev->name, (ndev->features & NETIF_F_SG) ? "on" : "off", -	    (ndev->features & NETIF_F_IP_CSUM) ? "on" : "off"); -  	return priv;  error: diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_pci.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_pci.c index c796de9eed7..50ad5b80cfa 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_pci.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_pci.c @@ -96,13 +96,11 @@ static int __devinit stmmac_pci_probe(struct pci_dev *pdev,  	stmmac_default_data(); -	priv = stmmac_dvr_probe(&(pdev->dev), &plat_dat); +	priv = stmmac_dvr_probe(&(pdev->dev), &plat_dat, addr);  	if (!priv) { -		pr_err("%s: main drivr probe failed", __func__); +		pr_err("%s: main driver probe failed", __func__);  		goto err_out;  	} -	priv->ioaddr = addr; -	priv->dev->base_addr = (unsigned long)addr;  	priv->dev->irq = pdev->irq;  	priv->wol_irq = pdev->irq; diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c index 1ac83243649..3aad9810237 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c @@ -59,16 +59,20 @@ static int stmmac_pltfr_probe(struct platform_device *pdev)  		goto out_release_region;  	}  	plat_dat = pdev->dev.platform_data; -	priv = stmmac_dvr_probe(&(pdev->dev), plat_dat); + +	/* Custom initialisation (if needed)*/ +	if (plat_dat->init) { +		ret = plat_dat->init(pdev); +		if (unlikely(ret)) +			goto out_unmap; +	} + +	priv = stmmac_dvr_probe(&(pdev->dev), plat_dat, addr);  	if (!priv) { -		pr_err("%s: main drivr probe failed", __func__); +		pr_err("%s: main driver probe failed", __func__);  		goto out_unmap;  	} -	priv->ioaddr = addr; -	/* Set the I/O base addr */ -	priv->dev->base_addr = (unsigned long)addr; -  	/* Get the MAC information */  	priv->dev->irq = platform_get_irq_byname(pdev, "macirq");  	if (priv->dev->irq == -ENXIO) { @@ -92,13 +96,6 @@ static int stmmac_pltfr_probe(struct platform_device *pdev)  	platform_set_drvdata(pdev, priv->dev); -	/* Custom initialisation */ -	if (priv->plat->init) { -		ret = priv->plat->init(pdev); -		if (unlikely(ret)) -			goto out_unmap; -	} -  	pr_debug("STMMAC platform driver registration completed");  	return 0; diff --git a/drivers/net/ethernet/ti/cpmac.c b/drivers/net/ethernet/ti/cpmac.c index 4d9a28ffd3c..cbc8df78d84 100644 --- a/drivers/net/ethernet/ti/cpmac.c +++ b/drivers/net/ethernet/ti/cpmac.c @@ -1122,7 +1122,7 @@ static int __devinit cpmac_probe(struct platform_device *pdev)  	pdata = pdev->dev.platform_data;  	if (external_switch || dumb_switch) { -		strncpy(mdio_bus_id, "0", MII_BUS_ID_SIZE); /* fixed phys bus */ +		strncpy(mdio_bus_id, "fixed-0", MII_BUS_ID_SIZE); /* fixed phys bus */  		phy_id = pdev->id;  	} else {  		for (phy_id = 0; phy_id < PHY_MAX_ADDR; phy_id++) { @@ -1138,7 +1138,7 @@ static int __devinit cpmac_probe(struct platform_device *pdev)  	if (phy_id == PHY_MAX_ADDR) {  		dev_err(&pdev->dev, "no PHY present, falling back "  					"to switch on MDIO bus 0\n"); -		strncpy(mdio_bus_id, "0", MII_BUS_ID_SIZE); /* fixed phys bus */ +		strncpy(mdio_bus_id, "fixed-0", MII_BUS_ID_SIZE); /* fixed phys bus */  		phy_id = pdev->id;  	} diff --git a/drivers/net/ethernet/xscale/ixp4xx_eth.c b/drivers/net/ethernet/xscale/ixp4xx_eth.c index 72a854f05bb..41a8b5a9849 100644 --- a/drivers/net/ethernet/xscale/ixp4xx_eth.c +++ b/drivers/net/ethernet/xscale/ixp4xx_eth.c @@ -1416,7 +1416,8 @@ static int __devinit eth_init_one(struct platform_device *pdev)  	__raw_writel(DEFAULT_CORE_CNTRL, &port->regs->core_control);  	udelay(50); -	snprintf(phy_id, MII_BUS_ID_SIZE + 3, PHY_ID_FMT, "0", plat->phy); +	snprintf(phy_id, MII_BUS_ID_SIZE + 3, PHY_ID_FMT, +		mdio_bus->id, plat->phy);  	port->phydev = phy_connect(dev, phy_id, &ixp4xx_adjust_link, 0,  				   PHY_INTERFACE_MODE_MII);  	if (IS_ERR(port->phydev)) { diff --git a/drivers/net/usb/ipheth.c b/drivers/net/usb/ipheth.c index e84662db51c..dd78c4cbd45 100644 --- a/drivers/net/usb/ipheth.c +++ b/drivers/net/usb/ipheth.c @@ -60,6 +60,7 @@  #define USB_PRODUCT_IPHONE_3GS  0x1294  #define USB_PRODUCT_IPHONE_4	0x1297  #define USB_PRODUCT_IPHONE_4_VZW 0x129c +#define USB_PRODUCT_IPHONE_4S	0x12a0  #define IPHETH_USBINTF_CLASS    255  #define IPHETH_USBINTF_SUBCLASS 253 @@ -103,6 +104,10 @@ static struct usb_device_id ipheth_table[] = {  		USB_VENDOR_APPLE, USB_PRODUCT_IPHONE_4_VZW,  		IPHETH_USBINTF_CLASS, IPHETH_USBINTF_SUBCLASS,  		IPHETH_USBINTF_PROTO) }, +	{ USB_DEVICE_AND_INTERFACE_INFO( +		USB_VENDOR_APPLE, USB_PRODUCT_IPHONE_4S, +		IPHETH_USBINTF_CLASS, IPHETH_USBINTF_SUBCLASS, +		IPHETH_USBINTF_PROTO) },  	{ }  };  MODULE_DEVICE_TABLE(usb, ipheth_table); diff --git a/drivers/net/veth.c b/drivers/net/veth.c index 49f4667e1fa..4a3402898f2 100644 --- a/drivers/net/veth.c +++ b/drivers/net/veth.c @@ -422,7 +422,9 @@ static void veth_dellink(struct net_device *dev, struct list_head *head)  	unregister_netdevice_queue(peer, head);  } -static const struct nla_policy veth_policy[VETH_INFO_MAX + 1]; +static const struct nla_policy veth_policy[VETH_INFO_MAX + 1] = { +	[VETH_INFO_PEER]	= { .len = sizeof(struct ifinfomsg) }, +};  static struct rtnl_link_ops veth_link_ops = {  	.kind		= DRV_NAME, diff --git a/drivers/net/wireless/rtlwifi/pci.c b/drivers/net/wireless/rtlwifi/pci.c index 39e0907a3c4..9245d882c06 100644 --- a/drivers/net/wireless/rtlwifi/pci.c +++ b/drivers/net/wireless/rtlwifi/pci.c @@ -1501,7 +1501,7 @@ static int rtl_pci_init(struct ieee80211_hw *hw, struct pci_dev *pdev)  		return err;  	} -	return 1; +	return 0;  }  static int rtl_pci_start(struct ieee80211_hw *hw) @@ -1870,7 +1870,7 @@ int __devinit rtl_pci_probe(struct pci_dev *pdev,  	}  	/* Init PCI sw */ -	err = !rtl_pci_init(hw, pdev); +	err = rtl_pci_init(hw, pdev);  	if (err) {  		RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,  			 ("Failed to init PCI.\n")); diff --git a/drivers/pci/iov.c b/drivers/pci/iov.c index 0321fa3b422..0dab5ecf61b 100644 --- a/drivers/pci/iov.c +++ b/drivers/pci/iov.c @@ -347,8 +347,6 @@ static int sriov_enable(struct pci_dev *dev, int nr_virtfn)  			return rc;  	} -	pci_write_config_dword(dev, iov->pos + PCI_SRIOV_SYS_PGSIZE, iov->pgsz); -  	iov->ctrl |= PCI_SRIOV_CTRL_VFE | PCI_SRIOV_CTRL_MSE;  	pci_cfg_access_lock(dev);  	pci_write_config_word(dev, iov->pos + PCI_SRIOV_CTRL, iov->ctrl); @@ -466,6 +464,7 @@ found:  		return -EIO;  	pgsz &= ~(pgsz - 1); +	pci_write_config_dword(dev, pos + PCI_SRIOV_SYS_PGSIZE, pgsz);  	nres = 0;  	for (i = 0; i < PCI_SRIOV_NUM_BARS; i++) { diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c index 7cc9e2f0f47..71eac9cd724 100644 --- a/drivers/pci/probe.c +++ b/drivers/pci/probe.c @@ -651,6 +651,11 @@ int __devinit pci_scan_bridge(struct pci_bus *bus, struct pci_dev *dev, int max,  	dev_dbg(&dev->dev, "scanning [bus %02x-%02x] behind bridge, pass %d\n",  		secondary, subordinate, pass); +	if (!primary && (primary != bus->number) && secondary && subordinate) { +		dev_warn(&dev->dev, "Primary bus is hard wired to 0\n"); +		primary = bus->number; +	} +  	/* Check if setup is sensible at all */  	if (!pass &&  	    (primary != bus->number || secondary <= bus->number)) { diff --git a/drivers/pci/remove.c b/drivers/pci/remove.c index 6def3624c68..ef8b18c48f2 100644 --- a/drivers/pci/remove.c +++ b/drivers/pci/remove.c @@ -77,6 +77,7 @@ void pci_remove_bus(struct pci_bus *pci_bus)  }  EXPORT_SYMBOL(pci_remove_bus); +static void __pci_remove_behind_bridge(struct pci_dev *dev);  /**   * pci_remove_bus_device - remove a PCI device and any children   * @dev: the device to remove @@ -94,7 +95,7 @@ static void __pci_remove_bus_device(struct pci_dev *dev)  	if (dev->subordinate) {  		struct pci_bus *b = dev->subordinate; -		pci_remove_behind_bridge(dev); +		__pci_remove_behind_bridge(dev);  		pci_remove_bus(b);  		dev->subordinate = NULL;  	} @@ -107,6 +108,24 @@ void pci_remove_bus_device(struct pci_dev *dev)  	__pci_remove_bus_device(dev);  } +static void __pci_remove_behind_bridge(struct pci_dev *dev) +{ +	struct list_head *l, *n; + +	if (dev->subordinate) +		list_for_each_safe(l, n, &dev->subordinate->devices) +			__pci_remove_bus_device(pci_dev_b(l)); +} + +static void pci_stop_behind_bridge(struct pci_dev *dev) +{ +	struct list_head *l, *n; + +	if (dev->subordinate) +		list_for_each_safe(l, n, &dev->subordinate->devices) +			pci_stop_bus_device(pci_dev_b(l)); +} +  /**   * pci_remove_behind_bridge - remove all devices behind a PCI bridge   * @dev: PCI bridge device @@ -117,11 +136,8 @@ void pci_remove_bus_device(struct pci_dev *dev)   */  void pci_remove_behind_bridge(struct pci_dev *dev)  { -	struct list_head *l, *n; - -	if (dev->subordinate) -		list_for_each_safe(l, n, &dev->subordinate->devices) -			__pci_remove_bus_device(pci_dev_b(l)); +	pci_stop_behind_bridge(dev); +	__pci_remove_behind_bridge(dev);  }  static void pci_stop_bus_devices(struct pci_bus *bus) diff --git a/drivers/pci/xen-pcifront.c b/drivers/pci/xen-pcifront.c index 7cf3d2fcf56..1620088a0e7 100644 --- a/drivers/pci/xen-pcifront.c +++ b/drivers/pci/xen-pcifront.c @@ -189,7 +189,7 @@ static int pcifront_bus_read(struct pci_bus *bus, unsigned int devfn,  	if (verbose_request)  		dev_info(&pdev->xdev->dev, -			 "read dev=%04x:%02x:%02x.%01x - offset %x size %d\n", +			 "read dev=%04x:%02x:%02x.%d - offset %x size %d\n",  			 pci_domain_nr(bus), bus->number, PCI_SLOT(devfn),  			 PCI_FUNC(devfn), where, size); @@ -228,7 +228,7 @@ static int pcifront_bus_write(struct pci_bus *bus, unsigned int devfn,  	if (verbose_request)  		dev_info(&pdev->xdev->dev, -			 "write dev=%04x:%02x:%02x.%01x - " +			 "write dev=%04x:%02x:%02x.%d - "  			 "offset %x size %d val %x\n",  			 pci_domain_nr(bus), bus->number,  			 PCI_SLOT(devfn), PCI_FUNC(devfn), where, size, val); @@ -432,7 +432,7 @@ static int __devinit pcifront_scan_bus(struct pcifront_device *pdev,  		d = pci_scan_single_device(b, devfn);  		if (d)  			dev_info(&pdev->xdev->dev, "New device on " -				 "%04x:%02x:%02x.%02x found.\n", domain, bus, +				 "%04x:%02x:%02x.%d found.\n", domain, bus,  				 PCI_SLOT(devfn), PCI_FUNC(devfn));  	} @@ -1041,7 +1041,7 @@ static int pcifront_detach_devices(struct pcifront_device *pdev)  		pci_dev = pci_get_slot(pci_bus, PCI_DEVFN(slot, func));  		if (!pci_dev) {  			dev_dbg(&pdev->xdev->dev, -				"Cannot get PCI device %04x:%02x:%02x.%02x\n", +				"Cannot get PCI device %04x:%02x:%02x.%d\n",  				domain, bus, slot, func);  			continue;  		} @@ -1049,7 +1049,7 @@ static int pcifront_detach_devices(struct pcifront_device *pdev)  		pci_dev_put(pci_dev);  		dev_dbg(&pdev->xdev->dev, -			"PCI device %04x:%02x:%02x.%02x removed.\n", +			"PCI device %04x:%02x:%02x.%d removed.\n",  			domain, bus, slot, func);  	} diff --git a/drivers/pinctrl/core.c b/drivers/pinctrl/core.c index 8fe15cf15ac..894cd5e103d 100644 --- a/drivers/pinctrl/core.c +++ b/drivers/pinctrl/core.c @@ -189,7 +189,7 @@ static int pinctrl_register_one_pin(struct pinctrl_dev *pctldev,  	pindesc->pctldev = pctldev;  	/* Copy basic pin info */ -	if (pindesc->name) { +	if (name) {  		pindesc->name = name;  	} else {  		pindesc->name = kasprintf(GFP_KERNEL, "PIN%u", number); diff --git a/drivers/regulator/max8649.c b/drivers/regulator/max8649.c index b06a2399587..d0e1180ad96 100644 --- a/drivers/regulator/max8649.c +++ b/drivers/regulator/max8649.c @@ -150,7 +150,7 @@ static int max8649_enable_time(struct regulator_dev *rdev)  	if (ret != 0)  		return ret;  	val &= MAX8649_VOL_MASK; -	voltage = max8649_list_voltage(rdev, (unsigned char)ret); /* uV */ +	voltage = max8649_list_voltage(rdev, (unsigned char)val); /* uV */  	/* get rate */  	ret = regmap_read(info->regmap, MAX8649_RAMP, &val); diff --git a/drivers/regulator/mc13xxx-regulator-core.c b/drivers/regulator/mc13xxx-regulator-core.c index 80ecafef1bc..62dcd0a432b 100644 --- a/drivers/regulator/mc13xxx-regulator-core.c +++ b/drivers/regulator/mc13xxx-regulator-core.c @@ -254,6 +254,7 @@ int __devinit mc13xxx_get_num_regulators_dt(struct platform_device *pdev)  	return num;  } +EXPORT_SYMBOL_GPL(mc13xxx_get_num_regulators_dt);  struct mc13xxx_regulator_init_data * __devinit mc13xxx_parse_regulators_dt(  	struct platform_device *pdev, struct mc13xxx_regulator *regulators, @@ -291,6 +292,7 @@ struct mc13xxx_regulator_init_data * __devinit mc13xxx_parse_regulators_dt(  	return data;  } +EXPORT_SYMBOL_GPL(mc13xxx_parse_regulators_dt);  #endif  MODULE_LICENSE("GPL v2"); diff --git a/drivers/rtc/rtc-at91sam9.c b/drivers/rtc/rtc-at91sam9.c index a3ad957507d..ee3c122c059 100644 --- a/drivers/rtc/rtc-at91sam9.c +++ b/drivers/rtc/rtc-at91sam9.c @@ -307,8 +307,12 @@ static int __init at91_rtc_probe(struct platform_device *pdev)  		device_init_wakeup(&pdev->dev, 1);  	platform_set_drvdata(pdev, rtc); -	rtc->rtt = (void __force __iomem *) (AT91_VA_BASE_SYS - AT91_BASE_SYS); -	rtc->rtt += r->start; +	rtc->rtt = ioremap(r->start, resource_size(r)); +	if (!rtc->rtt) { +		dev_err(&pdev->dev, "failed to map registers, aborting.\n"); +		ret = -ENOMEM; +		goto fail; +	}  	mr = rtt_readl(rtc, MR); @@ -326,7 +330,7 @@ static int __init at91_rtc_probe(struct platform_device *pdev)  				&at91_rtc_ops, THIS_MODULE);  	if (IS_ERR(rtc->rtcdev)) {  		ret = PTR_ERR(rtc->rtcdev); -		goto fail; +		goto fail_register;  	}  	/* register irq handler after we know what name we'll use */ @@ -351,6 +355,8 @@ static int __init at91_rtc_probe(struct platform_device *pdev)  	return 0; +fail_register: +	iounmap(rtc->rtt);  fail:  	platform_set_drvdata(pdev, NULL);  	kfree(rtc); @@ -371,6 +377,7 @@ static int __exit at91_rtc_remove(struct platform_device *pdev)  	rtc_device_unregister(rtc->rtcdev); +	iounmap(rtc->rtt);  	platform_set_drvdata(pdev, NULL);  	kfree(rtc);  	return 0; diff --git a/drivers/xen/cpu_hotplug.c b/drivers/xen/cpu_hotplug.c index 14e2d995e95..4dcfced107f 100644 --- a/drivers/xen/cpu_hotplug.c +++ b/drivers/xen/cpu_hotplug.c @@ -30,7 +30,8 @@ static int vcpu_online(unsigned int cpu)  	sprintf(dir, "cpu/%u", cpu);  	err = xenbus_scanf(XBT_NIL, dir, "availability", "%s", state);  	if (err != 1) { -		printk(KERN_ERR "XENBUS: Unable to read cpu state\n"); +		if (!xen_initial_domain()) +			printk(KERN_ERR "XENBUS: Unable to read cpu state\n");  		return err;  	} diff --git a/drivers/xen/xen-pciback/pci_stub.c b/drivers/xen/xen-pciback/pci_stub.c index 7944a17f5cb..19834d1c7c3 100644 --- a/drivers/xen/xen-pciback/pci_stub.c +++ b/drivers/xen/xen-pciback/pci_stub.c @@ -884,7 +884,7 @@ static inline int str_to_quirk(const char *buf, int *domain, int *bus, int  	int err;  	err = -	    sscanf(buf, " %04x:%02x:%02x.%1x-%08x:%1x:%08x", domain, bus, slot, +	    sscanf(buf, " %04x:%02x:%02x.%d-%08x:%1x:%08x", domain, bus, slot,  		   func, reg, size, mask);  	if (err == 7)  		return 0; @@ -904,7 +904,7 @@ static int pcistub_device_id_add(int domain, int bus, int slot, int func)  	pci_dev_id->bus = bus;  	pci_dev_id->devfn = PCI_DEVFN(slot, func); -	pr_debug(DRV_NAME ": wants to seize %04x:%02x:%02x.%01x\n", +	pr_debug(DRV_NAME ": wants to seize %04x:%02x:%02x.%d\n",  		 domain, bus, slot, func);  	spin_lock_irqsave(&device_ids_lock, flags); @@ -934,7 +934,7 @@ static int pcistub_device_id_remove(int domain, int bus, int slot, int func)  			err = 0; -			pr_debug(DRV_NAME ": removed %04x:%02x:%02x.%01x from " +			pr_debug(DRV_NAME ": removed %04x:%02x:%02x.%d from "  				 "seize list\n", domain, bus, slot, func);  		}  	} @@ -1029,7 +1029,7 @@ static ssize_t pcistub_slot_show(struct device_driver *drv, char *buf)  			break;  		count += scnprintf(buf + count, PAGE_SIZE - count, -				   "%04x:%02x:%02x.%01x\n", +				   "%04x:%02x:%02x.%d\n",  				   pci_dev_id->domain, pci_dev_id->bus,  				   PCI_SLOT(pci_dev_id->devfn),  				   PCI_FUNC(pci_dev_id->devfn)); diff --git a/drivers/xen/xen-pciback/xenbus.c b/drivers/xen/xen-pciback/xenbus.c index d5dcf8d5d3d..64b11f99eac 100644 --- a/drivers/xen/xen-pciback/xenbus.c +++ b/drivers/xen/xen-pciback/xenbus.c @@ -206,6 +206,7 @@ static int xen_pcibk_publish_pci_dev(struct xen_pcibk_device *pdev,  		goto out;  	} +	/* Note: The PV protocol uses %02x, don't change it */  	err = xenbus_printf(XBT_NIL, pdev->xdev->nodename, str,  			    "%04x:%02x:%02x.%02x", domain, bus,  			    PCI_SLOT(devfn), PCI_FUNC(devfn)); @@ -229,7 +230,7 @@ static int xen_pcibk_export_device(struct xen_pcibk_device *pdev,  		err = -EINVAL;  		xenbus_dev_fatal(pdev->xdev, err,  				 "Couldn't locate PCI device " -				 "(%04x:%02x:%02x.%01x)! " +				 "(%04x:%02x:%02x.%d)! "  				 "perhaps already in-use?",  				 domain, bus, slot, func);  		goto out; @@ -274,7 +275,7 @@ static int xen_pcibk_remove_device(struct xen_pcibk_device *pdev,  	if (!dev) {  		err = -EINVAL;  		dev_dbg(&pdev->xdev->dev, "Couldn't locate PCI device " -			"(%04x:%02x:%02x.%01x)! not owned by this domain\n", +			"(%04x:%02x:%02x.%d)! not owned by this domain\n",  			domain, bus, slot, func);  		goto out;  	} diff --git a/drivers/xen/xenbus/xenbus_dev_frontend.c b/drivers/xen/xenbus/xenbus_dev_frontend.c index 527dc2a3b89..89f76252a16 100644 --- a/drivers/xen/xenbus/xenbus_dev_frontend.c +++ b/drivers/xen/xenbus/xenbus_dev_frontend.c @@ -369,6 +369,10 @@ static int xenbus_write_watch(unsigned msg_type, struct xenbus_file_priv *u)  		goto out;  	}  	token++; +	if (memchr(token, 0, u->u.msg.len - (token - path)) == NULL) { +		rc = -EILSEQ; +		goto out; +	}  	if (msg_type == XS_WATCH) {  		watch = alloc_watch_adapter(path, token); diff --git a/fs/ecryptfs/crypto.c b/fs/ecryptfs/crypto.c index 63ab2451064..ea993128155 100644 --- a/fs/ecryptfs/crypto.c +++ b/fs/ecryptfs/crypto.c @@ -1990,6 +1990,17 @@ out:  	return;  } +static size_t ecryptfs_max_decoded_size(size_t encoded_size) +{ +	/* Not exact; conservatively long. Every block of 4 +	 * encoded characters decodes into a block of 3 +	 * decoded characters. This segment of code provides +	 * the caller with the maximum amount of allocated +	 * space that @dst will need to point to in a +	 * subsequent call. */ +	return ((encoded_size + 1) * 3) / 4; +} +  /**   * ecryptfs_decode_from_filename   * @dst: If NULL, this function only sets @dst_size and returns. If @@ -2008,13 +2019,7 @@ ecryptfs_decode_from_filename(unsigned char *dst, size_t *dst_size,  	size_t dst_byte_offset = 0;  	if (dst == NULL) { -		/* Not exact; conservatively long. Every block of 4 -		 * encoded characters decodes into a block of 3 -		 * decoded characters. This segment of code provides -		 * the caller with the maximum amount of allocated -		 * space that @dst will need to point to in a -		 * subsequent call. */ -		(*dst_size) = (((src_size + 1) * 3) / 4); +		(*dst_size) = ecryptfs_max_decoded_size(src_size);  		goto out;  	}  	while (src_byte_offset < src_size) { @@ -2239,3 +2244,52 @@ out_free:  out:  	return rc;  } + +#define ENC_NAME_MAX_BLOCKLEN_8_OR_16	143 + +int ecryptfs_set_f_namelen(long *namelen, long lower_namelen, +			   struct ecryptfs_mount_crypt_stat *mount_crypt_stat) +{ +	struct blkcipher_desc desc; +	struct mutex *tfm_mutex; +	size_t cipher_blocksize; +	int rc; + +	if (!(mount_crypt_stat->flags & ECRYPTFS_GLOBAL_ENCRYPT_FILENAMES)) { +		(*namelen) = lower_namelen; +		return 0; +	} + +	rc = ecryptfs_get_tfm_and_mutex_for_cipher_name(&desc.tfm, &tfm_mutex, +			mount_crypt_stat->global_default_fn_cipher_name); +	if (unlikely(rc)) { +		(*namelen) = 0; +		return rc; +	} + +	mutex_lock(tfm_mutex); +	cipher_blocksize = crypto_blkcipher_blocksize(desc.tfm); +	mutex_unlock(tfm_mutex); + +	/* Return an exact amount for the common cases */ +	if (lower_namelen == NAME_MAX +	    && (cipher_blocksize == 8 || cipher_blocksize == 16)) { +		(*namelen) = ENC_NAME_MAX_BLOCKLEN_8_OR_16; +		return 0; +	} + +	/* Return a safe estimate for the uncommon cases */ +	(*namelen) = lower_namelen; +	(*namelen) -= ECRYPTFS_FNEK_ENCRYPTED_FILENAME_PREFIX_SIZE; +	/* Since this is the max decoded size, subtract 1 "decoded block" len */ +	(*namelen) = ecryptfs_max_decoded_size(*namelen) - 3; +	(*namelen) -= ECRYPTFS_TAG_70_MAX_METADATA_SIZE; +	(*namelen) -= ECRYPTFS_FILENAME_MIN_RANDOM_PREPEND_BYTES; +	/* Worst case is that the filename is padded nearly a full block size */ +	(*namelen) -= cipher_blocksize - 1; + +	if ((*namelen) < 0) +		(*namelen) = 0; + +	return 0; +} diff --git a/fs/ecryptfs/ecryptfs_kernel.h b/fs/ecryptfs/ecryptfs_kernel.h index a2362df58ae..867b64c5d84 100644 --- a/fs/ecryptfs/ecryptfs_kernel.h +++ b/fs/ecryptfs/ecryptfs_kernel.h @@ -162,6 +162,10 @@ ecryptfs_get_key_payload_data(struct key *key)  #define ECRYPTFS_NON_NULL 0x42 /* A reasonable substitute for NULL */  #define MD5_DIGEST_SIZE 16  #define ECRYPTFS_TAG_70_DIGEST_SIZE MD5_DIGEST_SIZE +#define ECRYPTFS_TAG_70_MIN_METADATA_SIZE (1 + ECRYPTFS_MIN_PKT_LEN_SIZE \ +					   + ECRYPTFS_SIG_SIZE + 1 + 1) +#define ECRYPTFS_TAG_70_MAX_METADATA_SIZE (1 + ECRYPTFS_MAX_PKT_LEN_SIZE \ +					   + ECRYPTFS_SIG_SIZE + 1 + 1)  #define ECRYPTFS_FEK_ENCRYPTED_FILENAME_PREFIX "ECRYPTFS_FEK_ENCRYPTED."  #define ECRYPTFS_FEK_ENCRYPTED_FILENAME_PREFIX_SIZE 23  #define ECRYPTFS_FNEK_ENCRYPTED_FILENAME_PREFIX "ECRYPTFS_FNEK_ENCRYPTED." @@ -701,6 +705,8 @@ ecryptfs_parse_tag_70_packet(char **filename, size_t *filename_size,  			     size_t *packet_size,  			     struct ecryptfs_mount_crypt_stat *mount_crypt_stat,  			     char *data, size_t max_packet_size); +int ecryptfs_set_f_namelen(long *namelen, long lower_namelen, +			   struct ecryptfs_mount_crypt_stat *mount_crypt_stat);  int ecryptfs_derive_iv(char *iv, struct ecryptfs_crypt_stat *crypt_stat,  		       loff_t offset); diff --git a/fs/ecryptfs/inode.c b/fs/ecryptfs/inode.c index 19892d7d2ed..ab35b113003 100644 --- a/fs/ecryptfs/inode.c +++ b/fs/ecryptfs/inode.c @@ -1085,6 +1085,8 @@ ecryptfs_setxattr(struct dentry *dentry, const char *name, const void *value,  	}  	rc = vfs_setxattr(lower_dentry, name, value, size, flags); +	if (!rc) +		fsstack_copy_attr_all(dentry->d_inode, lower_dentry->d_inode);  out:  	return rc;  } diff --git a/fs/ecryptfs/keystore.c b/fs/ecryptfs/keystore.c index 8e3b943e330..2333203a120 100644 --- a/fs/ecryptfs/keystore.c +++ b/fs/ecryptfs/keystore.c @@ -679,10 +679,7 @@ ecryptfs_write_tag_70_packet(char *dest, size_t *remaining_bytes,  	 * Octets N3-N4: Block-aligned encrypted filename  	 *  - Consists of a minimum number of random characters, a \0  	 *    separator, and then the filename */ -	s->max_packet_size = (1                   /* Tag 70 identifier */ -			      + 3                 /* Max Tag 70 packet size */ -			      + ECRYPTFS_SIG_SIZE /* FNEK sig */ -			      + 1                 /* Cipher identifier */ +	s->max_packet_size = (ECRYPTFS_TAG_70_MAX_METADATA_SIZE  			      + s->block_aligned_filename_size);  	if (dest == NULL) {  		(*packet_size) = s->max_packet_size; @@ -934,10 +931,10 @@ ecryptfs_parse_tag_70_packet(char **filename, size_t *filename_size,  		goto out;  	}  	s->desc.flags = CRYPTO_TFM_REQ_MAY_SLEEP; -	if (max_packet_size < (1 + 1 + ECRYPTFS_SIG_SIZE + 1 + 1)) { +	if (max_packet_size < ECRYPTFS_TAG_70_MIN_METADATA_SIZE) {  		printk(KERN_WARNING "%s: max_packet_size is [%zd]; it must be "  		       "at least [%d]\n", __func__, max_packet_size, -			(1 + 1 + ECRYPTFS_SIG_SIZE + 1 + 1)); +		       ECRYPTFS_TAG_70_MIN_METADATA_SIZE);  		rc = -EINVAL;  		goto out;  	} diff --git a/fs/ecryptfs/mmap.c b/fs/ecryptfs/mmap.c index 10ec695ccd6..a46b3a8fee1 100644 --- a/fs/ecryptfs/mmap.c +++ b/fs/ecryptfs/mmap.c @@ -150,7 +150,7 @@ ecryptfs_copy_up_encrypted_with_header(struct page *page,  			/* This is a header extent */  			char *page_virt; -			page_virt = kmap_atomic(page, KM_USER0); +			page_virt = kmap_atomic(page);  			memset(page_virt, 0, PAGE_CACHE_SIZE);  			/* TODO: Support more than one header extent */  			if (view_extent_num == 0) { @@ -163,7 +163,7 @@ ecryptfs_copy_up_encrypted_with_header(struct page *page,  							       crypt_stat,  							       &written);  			} -			kunmap_atomic(page_virt, KM_USER0); +			kunmap_atomic(page_virt);  			flush_dcache_page(page);  			if (rc) {  				printk(KERN_ERR "%s: Error reading xattr " diff --git a/fs/ecryptfs/read_write.c b/fs/ecryptfs/read_write.c index 5c0106f7577..b2a34a192f4 100644 --- a/fs/ecryptfs/read_write.c +++ b/fs/ecryptfs/read_write.c @@ -156,7 +156,7 @@ int ecryptfs_write(struct inode *ecryptfs_inode, char *data, loff_t offset,  			       ecryptfs_page_idx, rc);  			goto out;  		} -		ecryptfs_page_virt = kmap_atomic(ecryptfs_page, KM_USER0); +		ecryptfs_page_virt = kmap_atomic(ecryptfs_page);  		/*  		 * pos: where we're now writing, offset: where the request was @@ -179,7 +179,7 @@ int ecryptfs_write(struct inode *ecryptfs_inode, char *data, loff_t offset,  			       (data + data_offset), num_bytes);  			data_offset += num_bytes;  		} -		kunmap_atomic(ecryptfs_page_virt, KM_USER0); +		kunmap_atomic(ecryptfs_page_virt);  		flush_dcache_page(ecryptfs_page);  		SetPageUptodate(ecryptfs_page);  		unlock_page(ecryptfs_page); diff --git a/fs/ecryptfs/super.c b/fs/ecryptfs/super.c index 9df7fd6e0c3..cf152823bbf 100644 --- a/fs/ecryptfs/super.c +++ b/fs/ecryptfs/super.c @@ -30,6 +30,8 @@  #include <linux/seq_file.h>  #include <linux/file.h>  #include <linux/crypto.h> +#include <linux/statfs.h> +#include <linux/magic.h>  #include "ecryptfs_kernel.h"  struct kmem_cache *ecryptfs_inode_info_cache; @@ -102,10 +104,20 @@ static void ecryptfs_destroy_inode(struct inode *inode)  static int ecryptfs_statfs(struct dentry *dentry, struct kstatfs *buf)  {  	struct dentry *lower_dentry = ecryptfs_dentry_to_lower(dentry); +	int rc;  	if (!lower_dentry->d_sb->s_op->statfs)  		return -ENOSYS; -	return lower_dentry->d_sb->s_op->statfs(lower_dentry, buf); + +	rc = lower_dentry->d_sb->s_op->statfs(lower_dentry, buf); +	if (rc) +		return rc; + +	buf->f_type = ECRYPTFS_SUPER_MAGIC; +	rc = ecryptfs_set_f_namelen(&buf->f_namelen, buf->f_namelen, +	       &ecryptfs_superblock_to_private(dentry->d_sb)->mount_crypt_stat); + +	return rc;  }  /** diff --git a/include/linux/bitops.h b/include/linux/bitops.h index 3c1063acb2a..94300fe46cc 100644 --- a/include/linux/bitops.h +++ b/include/linux/bitops.h @@ -56,6 +56,26 @@ static inline unsigned long hweight_long(unsigned long w)  }  /** + * rol64 - rotate a 64-bit value left + * @word: value to rotate + * @shift: bits to roll + */ +static inline __u64 rol64(__u64 word, unsigned int shift) +{ +	return (word << shift) | (word >> (64 - shift)); +} + +/** + * ror64 - rotate a 64-bit value right + * @word: value to rotate + * @shift: bits to roll + */ +static inline __u64 ror64(__u64 word, unsigned int shift) +{ +	return (word >> shift) | (word << (64 - shift)); +} + +/**   * rol32 - rotate a 32-bit value left   * @word: value to rotate   * @shift: bits to roll diff --git a/include/linux/mmc/card.h b/include/linux/mmc/card.h index 9f22ba572de..19a41d1737a 100644 --- a/include/linux/mmc/card.h +++ b/include/linux/mmc/card.h @@ -217,6 +217,7 @@ struct mmc_card {  #define MMC_CARD_SDXC		(1<<6)		/* card is SDXC */  #define MMC_CARD_REMOVED	(1<<7)		/* card has been removed */  #define MMC_STATE_HIGHSPEED_200	(1<<8)		/* card is in HS200 mode */ +#define MMC_STATE_SLEEP		(1<<9)		/* card is in sleep state */  	unsigned int		quirks; 	/* card quirks */  #define MMC_QUIRK_LENIENT_FN0	(1<<0)		/* allow SDIO FN0 writes outside of the VS CCCR range */  #define MMC_QUIRK_BLKSZ_FOR_BYTE_MODE (1<<1)	/* use func->cur_blksize */ @@ -382,6 +383,7 @@ static inline void __maybe_unused remove_quirk(struct mmc_card *card, int data)  #define mmc_sd_card_uhs(c)	((c)->state & MMC_STATE_ULTRAHIGHSPEED)  #define mmc_card_ext_capacity(c) ((c)->state & MMC_CARD_SDXC)  #define mmc_card_removed(c)	((c) && ((c)->state & MMC_CARD_REMOVED)) +#define mmc_card_is_sleep(c)	((c)->state & MMC_STATE_SLEEP)  #define mmc_card_set_present(c)	((c)->state |= MMC_STATE_PRESENT)  #define mmc_card_set_readonly(c) ((c)->state |= MMC_STATE_READONLY) @@ -393,7 +395,9 @@ static inline void __maybe_unused remove_quirk(struct mmc_card *card, int data)  #define mmc_sd_card_set_uhs(c) ((c)->state |= MMC_STATE_ULTRAHIGHSPEED)  #define mmc_card_set_ext_capacity(c) ((c)->state |= MMC_CARD_SDXC)  #define mmc_card_set_removed(c) ((c)->state |= MMC_CARD_REMOVED) +#define mmc_card_set_sleep(c)	((c)->state |= MMC_STATE_SLEEP) +#define mmc_card_clr_sleep(c)	((c)->state &= ~MMC_STATE_SLEEP)  /*   * Quirk add/remove for MMC products.   */ diff --git a/include/linux/mmc/dw_mmc.h b/include/linux/mmc/dw_mmc.h index e8779c6d175..aae5d1f1bb3 100644 --- a/include/linux/mmc/dw_mmc.h +++ b/include/linux/mmc/dw_mmc.h @@ -14,6 +14,8 @@  #ifndef LINUX_MMC_DW_MMC_H  #define LINUX_MMC_DW_MMC_H +#include <linux/scatterlist.h> +  #define MAX_MCI_SLOTS	2  enum dw_mci_state { @@ -40,7 +42,7 @@ struct mmc_data;   * @lock: Spinlock protecting the queue and associated data.   * @regs: Pointer to MMIO registers.   * @sg: Scatterlist entry currently being processed by PIO code, if any. - * @pio_offset: Offset into the current scatterlist entry. + * @sg_miter: PIO mapping scatterlist iterator.   * @cur_slot: The slot which is currently using the controller.   * @mrq: The request currently being processed on @cur_slot,   *	or NULL if the controller is idle. @@ -115,7 +117,7 @@ struct dw_mci {  	void __iomem		*regs;  	struct scatterlist	*sg; -	unsigned int		pio_offset; +	struct sg_mapping_iter	sg_miter;  	struct dw_mci_slot	*cur_slot;  	struct mmc_request	*mrq; diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h index 0beba1e5e1e..ee2b0363c04 100644 --- a/include/linux/mmc/host.h +++ b/include/linux/mmc/host.h @@ -257,6 +257,7 @@ struct mmc_host {  #define MMC_CAP2_HS200_1_2V_SDR	(1 << 6)        /* can support */  #define MMC_CAP2_HS200		(MMC_CAP2_HS200_1_8V_SDR | \  				 MMC_CAP2_HS200_1_2V_SDR) +#define MMC_CAP2_BROKEN_VOLTAGE	(1 << 7)	/* Use the broken voltage */  	mmc_pm_flag_t		pm_caps;	/* supported pm features */  	unsigned int        power_notify_type; @@ -444,4 +445,23 @@ static inline int mmc_boot_partition_access(struct mmc_host *host)  	return !(host->caps2 & MMC_CAP2_BOOTPART_NOACC);  } +#ifdef CONFIG_MMC_CLKGATE +void mmc_host_clk_hold(struct mmc_host *host); +void mmc_host_clk_release(struct mmc_host *host); +unsigned int mmc_host_clk_rate(struct mmc_host *host); + +#else +static inline void mmc_host_clk_hold(struct mmc_host *host) +{ +} + +static inline void mmc_host_clk_release(struct mmc_host *host) +{ +} + +static inline unsigned int mmc_host_clk_rate(struct mmc_host *host) +{ +	return host->ios.clock; +} +#endif  #endif /* LINUX_MMC_HOST_H */ diff --git a/net/core/netpoll.c b/net/core/netpoll.c index 556b0829866..ddefc513b44 100644 --- a/net/core/netpoll.c +++ b/net/core/netpoll.c @@ -194,7 +194,7 @@ static void netpoll_poll_dev(struct net_device *dev)  	poll_napi(dev); -	if (dev->priv_flags & IFF_SLAVE) { +	if (dev->flags & IFF_SLAVE) {  		if (dev->npinfo) {  			struct net_device *bond_dev = dev->master;  			struct sk_buff *skb; diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 976034f8232..53c8ce4046b 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c @@ -1307,25 +1307,26 @@ static int tcp_match_skb_to_sack(struct sock *sk, struct sk_buff *skb,  	return in_sack;  } -static u8 tcp_sacktag_one(const struct sk_buff *skb, struct sock *sk, -			  struct tcp_sacktag_state *state, +/* Mark the given newly-SACKed range as such, adjusting counters and hints. */ +static u8 tcp_sacktag_one(struct sock *sk, +			  struct tcp_sacktag_state *state, u8 sacked, +			  u32 start_seq, u32 end_seq,  			  int dup_sack, int pcount)  {  	struct tcp_sock *tp = tcp_sk(sk); -	u8 sacked = TCP_SKB_CB(skb)->sacked;  	int fack_count = state->fack_count;  	/* Account D-SACK for retransmitted packet. */  	if (dup_sack && (sacked & TCPCB_RETRANS)) {  		if (tp->undo_marker && tp->undo_retrans && -		    after(TCP_SKB_CB(skb)->end_seq, tp->undo_marker)) +		    after(end_seq, tp->undo_marker))  			tp->undo_retrans--;  		if (sacked & TCPCB_SACKED_ACKED)  			state->reord = min(fack_count, state->reord);  	}  	/* Nothing to do; acked frame is about to be dropped (was ACKed). */ -	if (!after(TCP_SKB_CB(skb)->end_seq, tp->snd_una)) +	if (!after(end_seq, tp->snd_una))  		return sacked;  	if (!(sacked & TCPCB_SACKED_ACKED)) { @@ -1344,13 +1345,13 @@ static u8 tcp_sacktag_one(const struct sk_buff *skb, struct sock *sk,  				/* New sack for not retransmitted frame,  				 * which was in hole. It is reordering.  				 */ -				if (before(TCP_SKB_CB(skb)->seq, +				if (before(start_seq,  					   tcp_highest_sack_seq(tp)))  					state->reord = min(fack_count,  							   state->reord);  				/* SACK enhanced F-RTO (RFC4138; Appendix B) */ -				if (!after(TCP_SKB_CB(skb)->end_seq, tp->frto_highmark)) +				if (!after(end_seq, tp->frto_highmark))  					state->flag |= FLAG_ONLY_ORIG_SACKED;  			} @@ -1368,8 +1369,7 @@ static u8 tcp_sacktag_one(const struct sk_buff *skb, struct sock *sk,  		/* Lost marker hint past SACKed? Tweak RFC3517 cnt */  		if (!tcp_is_fack(tp) && (tp->lost_skb_hint != NULL) && -		    before(TCP_SKB_CB(skb)->seq, -			   TCP_SKB_CB(tp->lost_skb_hint)->seq)) +		    before(start_seq, TCP_SKB_CB(tp->lost_skb_hint)->seq))  			tp->lost_cnt_hint += pcount;  		if (fack_count > tp->fackets_out) @@ -1388,6 +1388,9 @@ static u8 tcp_sacktag_one(const struct sk_buff *skb, struct sock *sk,  	return sacked;  } +/* Shift newly-SACKed bytes from this skb to the immediately previous + * already-SACKed sk_buff. Mark the newly-SACKed bytes as such. + */  static int tcp_shifted_skb(struct sock *sk, struct sk_buff *skb,  			   struct tcp_sacktag_state *state,  			   unsigned int pcount, int shifted, int mss, @@ -1395,10 +1398,13 @@ static int tcp_shifted_skb(struct sock *sk, struct sk_buff *skb,  {  	struct tcp_sock *tp = tcp_sk(sk);  	struct sk_buff *prev = tcp_write_queue_prev(sk, skb); +	u32 start_seq = TCP_SKB_CB(skb)->seq;	/* start of newly-SACKed */ +	u32 end_seq = start_seq + shifted;	/* end of newly-SACKed */  	BUG_ON(!pcount); -	if (skb == tp->lost_skb_hint) +	/* Adjust hint for FACK. Non-FACK is handled in tcp_sacktag_one(). */ +	if (tcp_is_fack(tp) && (skb == tp->lost_skb_hint))  		tp->lost_cnt_hint += pcount;  	TCP_SKB_CB(prev)->end_seq += shifted; @@ -1424,8 +1430,11 @@ static int tcp_shifted_skb(struct sock *sk, struct sk_buff *skb,  		skb_shinfo(skb)->gso_type = 0;  	} -	/* We discard results */ -	tcp_sacktag_one(skb, sk, state, dup_sack, pcount); +	/* Adjust counters and hints for the newly sacked sequence range but +	 * discard the return value since prev is already marked. +	 */ +	tcp_sacktag_one(sk, state, TCP_SKB_CB(skb)->sacked, +			start_seq, end_seq, dup_sack, pcount);  	/* Difference in this won't matter, both ACKed by the same cumul. ACK */  	TCP_SKB_CB(prev)->sacked |= (TCP_SKB_CB(skb)->sacked & TCPCB_EVER_RETRANS); @@ -1664,10 +1673,14 @@ static struct sk_buff *tcp_sacktag_walk(struct sk_buff *skb, struct sock *sk,  			break;  		if (in_sack) { -			TCP_SKB_CB(skb)->sacked = tcp_sacktag_one(skb, sk, -								  state, -								  dup_sack, -								  tcp_skb_pcount(skb)); +			TCP_SKB_CB(skb)->sacked = +				tcp_sacktag_one(sk, +						state, +						TCP_SKB_CB(skb)->sacked, +						TCP_SKB_CB(skb)->seq, +						TCP_SKB_CB(skb)->end_seq, +						dup_sack, +						tcp_skb_pcount(skb));  			if (!before(TCP_SKB_CB(skb)->seq,  				    tcp_highest_sack_seq(tp))) diff --git a/net/mac80211/main.c b/net/mac80211/main.c index 0a0d94ad9b0..b142bd4c239 100644 --- a/net/mac80211/main.c +++ b/net/mac80211/main.c @@ -910,6 +910,8 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)  		wiphy_debug(local->hw.wiphy, "Failed to initialize wep: %d\n",  			    result); +	ieee80211_led_init(local); +  	rtnl_lock();  	result = ieee80211_init_rate_ctrl_alg(local, @@ -931,8 +933,6 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)  	rtnl_unlock(); -	ieee80211_led_init(local); -  	local->network_latency_notifier.notifier_call =  		ieee80211_max_network_latency;  	result = pm_qos_add_notifier(PM_QOS_NETWORK_LATENCY, diff --git a/net/rxrpc/ar-key.c b/net/rxrpc/ar-key.c index 4cba13e46ff..ae3a035f539 100644 --- a/net/rxrpc/ar-key.c +++ b/net/rxrpc/ar-key.c @@ -232,7 +232,7 @@ static int rxrpc_krb5_decode_principal(struct krb5_principal *princ,  	if (toklen <= (n_parts + 1) * 4)  		return -EINVAL; -	princ->name_parts = kcalloc(sizeof(char *), n_parts, GFP_KERNEL); +	princ->name_parts = kcalloc(n_parts, sizeof(char *), GFP_KERNEL);  	if (!princ->name_parts)  		return -ENOMEM; @@ -355,7 +355,7 @@ static int rxrpc_krb5_decode_tagged_array(struct krb5_tagged_data **_td,  		_debug("n_elem %d", n_elem); -		td = kcalloc(sizeof(struct krb5_tagged_data), n_elem, +		td = kcalloc(n_elem, sizeof(struct krb5_tagged_data),  			     GFP_KERNEL);  		if (!td)  			return -ENOMEM;  |