diff options
| author | Tony Lindgren <tony@atomide.com> | 2011-03-10 18:54:14 -0800 | 
|---|---|---|
| committer | Tony Lindgren <tony@atomide.com> | 2011-03-10 18:54:14 -0800 | 
| commit | 94a06b74e724caabcf0464c81527cfbcae0c8aff (patch) | |
| tree | 3570b6a627382a5eb5c8328b4959f615544d8e62 | |
| parent | 0dde52a9f5330eec240660191a94b51bd911ffcd (diff) | |
| parent | 9062511097683b4422f023d181b4a8b2db1a7a72 (diff) | |
| download | olio-linux-3.10-94a06b74e724caabcf0464c81527cfbcae0c8aff.tar.xz olio-linux-3.10-94a06b74e724caabcf0464c81527cfbcae0c8aff.zip  | |
Merge branch 'for_2.6.39/pm-misc' of ssh://master.kernel.org/pub/scm/linux/kernel/git/khilman/linux-omap-pm into omap-for-linus
212 files changed, 1759 insertions, 1117 deletions
diff --git a/Documentation/networking/00-INDEX b/Documentation/networking/00-INDEX index fe5c099b8fc..4edd78dfb36 100644 --- a/Documentation/networking/00-INDEX +++ b/Documentation/networking/00-INDEX @@ -40,8 +40,6 @@ decnet.txt  	- info on using the DECnet networking layer in Linux.  depca.txt  	- the Digital DEPCA/EtherWORKS DE1?? and DE2?? LANCE Ethernet driver -dgrs.txt -	- the Digi International RightSwitch SE-X Ethernet driver  dmfe.txt  	- info on the Davicom DM9102(A)/DM9132/DM9801 fast ethernet driver.  e100.txt @@ -50,8 +48,6 @@ e1000.txt  	- info on Intel's E1000 line of gigabit ethernet boards  eql.txt  	- serial IP load balancing -ethertap.txt -	- the Ethertap user space packet reception and transmission driver  ewrk3.txt  	- the Digital EtherWORKS 3 DE203/4/5 Ethernet driver  filter.txt @@ -104,8 +100,6 @@ tuntap.txt  	- TUN/TAP device driver, allowing user space Rx/Tx of packets.  vortex.txt  	- info on using 3Com Vortex (3c590, 3c592, 3c595, 3c597) Ethernet cards. -wavelan.txt -	- AT&T GIS (nee NCR) WaveLAN card: An Ethernet-like radio transceiver  x25.txt  	- general info on X.25 development.  x25-iface.txt diff --git a/Documentation/networking/dns_resolver.txt b/Documentation/networking/dns_resolver.txt index aefd1e68180..04ca06325b0 100644 --- a/Documentation/networking/dns_resolver.txt +++ b/Documentation/networking/dns_resolver.txt @@ -61,7 +61,6 @@ before the more general line given above as the first match is the one taken.  	create	dns_resolver  	foo:*	*	/usr/sbin/dns.foo %k -  =====  USAGE  ===== @@ -104,6 +103,14 @@ implemented in the module can be called after doing:       returned also. +=============================== +READING DNS KEYS FROM USERSPACE +=============================== + +Keys of dns_resolver type can be read from userspace using keyctl_read() or +"keyctl read/print/pipe". + +  =========  MECHANISM  ========= diff --git a/MAINTAINERS b/MAINTAINERS index 8afba6321e2..939e852ef74 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -1010,6 +1010,15 @@ L:	linux-samsung-soc@vger.kernel.org (moderated for non-subscribers)  S:	Maintained  F:	arch/arm/mach-s5p*/ +ARM/SAMSUNG MOBILE MACHINE SUPPORT +M:	Kyungmin Park <kyungmin.park@samsung.com> +L:	linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) +S:	Maintained +F:	arch/arm/mach-s5pv210/mach-aquila.c +F:	arch/arm/mach-s5pv210/mach-goni.c +F:	arch/arm/mach-exynos4/mach-universal_c210.c +F:	arch/arm/mach-exynos4/mach-nuri.c +  ARM/SAMSUNG S5P SERIES FIMC SUPPORT  M:	Kyungmin Park <kyungmin.park@samsung.com>  M:	Sylwester Nawrocki <s.nawrocki@samsung.com> @@ -1467,6 +1476,7 @@ F:	include/net/bluetooth/  BONDING DRIVER  M:	Jay Vosburgh <fubar@us.ibm.com> +M:	Andy Gospodarek <andy@greyhouse.net>  L:	netdev@vger.kernel.org  W:	http://sourceforge.net/projects/bonding/  S:	Supported @@ -2033,7 +2043,7 @@ F:	Documentation/scsi/dc395x.txt  F:	drivers/scsi/dc395x.*  DCCP PROTOCOL -M:	Arnaldo Carvalho de Melo <acme@ghostprotocols.net> +M:	Gerrit Renker <gerrit@erg.abdn.ac.uk>  L:	dccp@vger.kernel.org  W:	http://www.linuxfoundation.org/collaborate/workgroups/networking/dccp  S:	Maintained @@ -3519,7 +3529,7 @@ F:	drivers/hwmon/jc42.c  F:	Documentation/hwmon/jc42  JFS FILESYSTEM -M:	Dave Kleikamp <shaggy@linux.vnet.ibm.com> +M:	Dave Kleikamp <shaggy@kernel.org>  L:	jfs-discussion@lists.sourceforge.net  W:	http://jfs.sourceforge.net/  T:	git git://git.kernel.org/pub/scm/linux/kernel/git/shaggy/jfs-2.6.git @@ -4491,7 +4501,7 @@ S:	Maintained  F:	arch/arm/*omap*/*clock*  OMAP POWER MANAGEMENT SUPPORT -M:	Kevin Hilman <khilman@deeprootsystems.com> +M:	Kevin Hilman <khilman@ti.com>  L:	linux-omap@vger.kernel.org  S:	Maintained  F:	arch/arm/*omap*/*pm* @@ -5171,6 +5181,7 @@ F:	drivers/char/random.c  RAPIDIO SUBSYSTEM  M:	Matt Porter <mporter@kernel.crashing.org> +M:	Alexandre Bounine <alexandre.bounine@idt.com>  S:	Maintained  F:	drivers/rapidio/ @@ -1,7 +1,7 @@  VERSION = 2  PATCHLEVEL = 6  SUBLEVEL = 38 -EXTRAVERSION = -rc7 +EXTRAVERSION = -rc8  NAME = Flesh-Eating Bats with Fangs  # *DOCUMENTATION* diff --git a/arch/alpha/Kconfig b/arch/alpha/Kconfig index 47f63d48014..cc31bec2e31 100644 --- a/arch/alpha/Kconfig +++ b/arch/alpha/Kconfig @@ -11,6 +11,7 @@ config ALPHA  	select HAVE_GENERIC_HARDIRQS  	select GENERIC_IRQ_PROBE  	select AUTO_IRQ_AFFINITY if SMP +	select GENERIC_HARDIRQS_NO_DEPRECATED  	help  	  The Alpha is a 64-bit general-purpose processor designed and  	  marketed by the Digital Equipment Corporation of blessed memory, diff --git a/arch/alpha/kernel/irq.c b/arch/alpha/kernel/irq.c index 9ab234f48dd..a19d6008229 100644 --- a/arch/alpha/kernel/irq.c +++ b/arch/alpha/kernel/irq.c @@ -44,11 +44,16 @@ static char irq_user_affinity[NR_IRQS];  int irq_select_affinity(unsigned int irq)  { -	struct irq_desc *desc = irq_to_desc[irq]; +	struct irq_data *data = irq_get_irq_data(irq); +	struct irq_chip *chip;  	static int last_cpu;  	int cpu = last_cpu + 1; -	if (!desc || !get_irq_desc_chip(desc)->set_affinity || irq_user_affinity[irq]) +	if (!data) +		return 1; +	chip = irq_data_get_irq_chip(data); + +	if (!chip->irq_set_affinity || irq_user_affinity[irq])  		return 1;  	while (!cpu_possible(cpu) || @@ -56,8 +61,8 @@ int irq_select_affinity(unsigned int irq)  		cpu = (cpu < (NR_CPUS-1) ? cpu + 1 : 0);  	last_cpu = cpu; -	cpumask_copy(desc->affinity, cpumask_of(cpu)); -	get_irq_desc_chip(desc)->set_affinity(irq, cpumask_of(cpu)); +	cpumask_copy(data->affinity, cpumask_of(cpu)); +	chip->irq_set_affinity(data, cpumask_of(cpu), false);  	return 0;  }  #endif /* CONFIG_SMP */ diff --git a/arch/alpha/kernel/irq_alpha.c b/arch/alpha/kernel/irq_alpha.c index 2d0679b6093..411ca11d0a1 100644 --- a/arch/alpha/kernel/irq_alpha.c +++ b/arch/alpha/kernel/irq_alpha.c @@ -228,14 +228,9 @@ struct irqaction timer_irqaction = {  void __init  init_rtc_irq(void)  { -	struct irq_desc *desc = irq_to_desc(RTC_IRQ); - -	if (desc) { -		desc->status |= IRQ_DISABLED; -		set_irq_chip_and_handler_name(RTC_IRQ, &no_irq_chip, -			handle_simple_irq, "RTC"); -		setup_irq(RTC_IRQ, &timer_irqaction); -	} +	set_irq_chip_and_handler_name(RTC_IRQ, &no_irq_chip, +				      handle_simple_irq, "RTC"); +	setup_irq(RTC_IRQ, &timer_irqaction);  }  /* Dummy irqactions.  */ diff --git a/arch/alpha/kernel/irq_i8259.c b/arch/alpha/kernel/irq_i8259.c index 956ea0ed169..c7cc9813e45 100644 --- a/arch/alpha/kernel/irq_i8259.c +++ b/arch/alpha/kernel/irq_i8259.c @@ -33,10 +33,10 @@ i8259_update_irq_hw(unsigned int irq, unsigned long mask)  }  inline void -i8259a_enable_irq(unsigned int irq) +i8259a_enable_irq(struct irq_data *d)  {  	spin_lock(&i8259_irq_lock); -	i8259_update_irq_hw(irq, cached_irq_mask &= ~(1 << irq)); +	i8259_update_irq_hw(d->irq, cached_irq_mask &= ~(1 << d->irq));  	spin_unlock(&i8259_irq_lock);  } @@ -47,16 +47,18 @@ __i8259a_disable_irq(unsigned int irq)  }  void -i8259a_disable_irq(unsigned int irq) +i8259a_disable_irq(struct irq_data *d)  {  	spin_lock(&i8259_irq_lock); -	__i8259a_disable_irq(irq); +	__i8259a_disable_irq(d->irq);  	spin_unlock(&i8259_irq_lock);  }  void -i8259a_mask_and_ack_irq(unsigned int irq) +i8259a_mask_and_ack_irq(struct irq_data *d)  { +	unsigned int irq = d->irq; +  	spin_lock(&i8259_irq_lock);  	__i8259a_disable_irq(irq); @@ -71,9 +73,9 @@ i8259a_mask_and_ack_irq(unsigned int irq)  struct irq_chip i8259a_irq_type = {  	.name		= "XT-PIC", -	.unmask		= i8259a_enable_irq, -	.mask		= i8259a_disable_irq, -	.mask_ack	= i8259a_mask_and_ack_irq, +	.irq_unmask	= i8259a_enable_irq, +	.irq_mask	= i8259a_disable_irq, +	.irq_mask_ack	= i8259a_mask_and_ack_irq,  };  void __init diff --git a/arch/alpha/kernel/irq_impl.h b/arch/alpha/kernel/irq_impl.h index b63ccd7386f..d507a234b05 100644 --- a/arch/alpha/kernel/irq_impl.h +++ b/arch/alpha/kernel/irq_impl.h @@ -31,11 +31,9 @@ extern void init_rtc_irq(void);  extern void common_init_isa_dma(void); -extern void i8259a_enable_irq(unsigned int); -extern void i8259a_disable_irq(unsigned int); -extern void i8259a_mask_and_ack_irq(unsigned int); -extern unsigned int i8259a_startup_irq(unsigned int); -extern void i8259a_end_irq(unsigned int); +extern void i8259a_enable_irq(struct irq_data *d); +extern void i8259a_disable_irq(struct irq_data *d); +extern void i8259a_mask_and_ack_irq(struct irq_data *d);  extern struct irq_chip i8259a_irq_type;  extern void init_i8259a_irqs(void); diff --git a/arch/alpha/kernel/irq_pyxis.c b/arch/alpha/kernel/irq_pyxis.c index 2863458c853..b30227fa7f5 100644 --- a/arch/alpha/kernel/irq_pyxis.c +++ b/arch/alpha/kernel/irq_pyxis.c @@ -29,21 +29,21 @@ pyxis_update_irq_hw(unsigned long mask)  }  static inline void -pyxis_enable_irq(unsigned int irq) +pyxis_enable_irq(struct irq_data *d)  { -	pyxis_update_irq_hw(cached_irq_mask |= 1UL << (irq - 16)); +	pyxis_update_irq_hw(cached_irq_mask |= 1UL << (d->irq - 16));  }  static void -pyxis_disable_irq(unsigned int irq) +pyxis_disable_irq(struct irq_data *d)  { -	pyxis_update_irq_hw(cached_irq_mask &= ~(1UL << (irq - 16))); +	pyxis_update_irq_hw(cached_irq_mask &= ~(1UL << (d->irq - 16)));  }  static void -pyxis_mask_and_ack_irq(unsigned int irq) +pyxis_mask_and_ack_irq(struct irq_data *d)  { -	unsigned long bit = 1UL << (irq - 16); +	unsigned long bit = 1UL << (d->irq - 16);  	unsigned long mask = cached_irq_mask &= ~bit;  	/* Disable the interrupt.  */ @@ -58,9 +58,9 @@ pyxis_mask_and_ack_irq(unsigned int irq)  static struct irq_chip pyxis_irq_type = {  	.name		= "PYXIS", -	.mask_ack	= pyxis_mask_and_ack_irq, -	.mask		= pyxis_disable_irq, -	.unmask		= pyxis_enable_irq, +	.irq_mask_ack	= pyxis_mask_and_ack_irq, +	.irq_mask	= pyxis_disable_irq, +	.irq_unmask	= pyxis_enable_irq,  };  void  @@ -103,7 +103,7 @@ init_pyxis_irqs(unsigned long ignore_mask)  		if ((ignore_mask >> i) & 1)  			continue;  		set_irq_chip_and_handler(i, &pyxis_irq_type, handle_level_irq); -		irq_to_desc(i)->status |= IRQ_LEVEL; +		irq_set_status_flags(i, IRQ_LEVEL);  	}  	setup_irq(16+7, &isa_cascade_irqaction); diff --git a/arch/alpha/kernel/irq_srm.c b/arch/alpha/kernel/irq_srm.c index 0e57e828b41..82a47bba41c 100644 --- a/arch/alpha/kernel/irq_srm.c +++ b/arch/alpha/kernel/irq_srm.c @@ -18,27 +18,27 @@  DEFINE_SPINLOCK(srm_irq_lock);  static inline void -srm_enable_irq(unsigned int irq) +srm_enable_irq(struct irq_data *d)  {  	spin_lock(&srm_irq_lock); -	cserve_ena(irq - 16); +	cserve_ena(d->irq - 16);  	spin_unlock(&srm_irq_lock);  }  static void -srm_disable_irq(unsigned int irq) +srm_disable_irq(struct irq_data *d)  {  	spin_lock(&srm_irq_lock); -	cserve_dis(irq - 16); +	cserve_dis(d->irq - 16);  	spin_unlock(&srm_irq_lock);  }  /* Handle interrupts from the SRM, assuming no additional weirdness.  */  static struct irq_chip srm_irq_type = {  	.name		= "SRM", -	.unmask		= srm_enable_irq, -	.mask		= srm_disable_irq, -	.mask_ack	= srm_disable_irq, +	.irq_unmask	= srm_enable_irq, +	.irq_mask	= srm_disable_irq, +	.irq_mask_ack	= srm_disable_irq,  };  void __init @@ -52,7 +52,7 @@ init_srm_irqs(long max, unsigned long ignore_mask)  		if (i < 64 && ((ignore_mask >> i) & 1))  			continue;  		set_irq_chip_and_handler(i, &srm_irq_type, handle_level_irq); -		irq_to_desc(i)->status |= IRQ_LEVEL; +		irq_set_status_flags(i, IRQ_LEVEL);  	}  } diff --git a/arch/alpha/kernel/sys_alcor.c b/arch/alpha/kernel/sys_alcor.c index 7bef6176823..88d95e872f5 100644 --- a/arch/alpha/kernel/sys_alcor.c +++ b/arch/alpha/kernel/sys_alcor.c @@ -44,31 +44,31 @@ alcor_update_irq_hw(unsigned long mask)  }  static inline void -alcor_enable_irq(unsigned int irq) +alcor_enable_irq(struct irq_data *d)  { -	alcor_update_irq_hw(cached_irq_mask |= 1UL << (irq - 16)); +	alcor_update_irq_hw(cached_irq_mask |= 1UL << (d->irq - 16));  }  static void -alcor_disable_irq(unsigned int irq) +alcor_disable_irq(struct irq_data *d)  { -	alcor_update_irq_hw(cached_irq_mask &= ~(1UL << (irq - 16))); +	alcor_update_irq_hw(cached_irq_mask &= ~(1UL << (d->irq - 16)));  }  static void -alcor_mask_and_ack_irq(unsigned int irq) +alcor_mask_and_ack_irq(struct irq_data *d)  { -	alcor_disable_irq(irq); +	alcor_disable_irq(d);  	/* On ALCOR/XLT, need to dismiss interrupt via GRU. */ -	*(vuip)GRU_INT_CLEAR = 1 << (irq - 16); mb(); +	*(vuip)GRU_INT_CLEAR = 1 << (d->irq - 16); mb();  	*(vuip)GRU_INT_CLEAR = 0; mb();  }  static void -alcor_isa_mask_and_ack_irq(unsigned int irq) +alcor_isa_mask_and_ack_irq(struct irq_data *d)  { -	i8259a_mask_and_ack_irq(irq); +	i8259a_mask_and_ack_irq(d);  	/* On ALCOR/XLT, need to dismiss interrupt via GRU. */  	*(vuip)GRU_INT_CLEAR = 0x80000000; mb(); @@ -77,9 +77,9 @@ alcor_isa_mask_and_ack_irq(unsigned int irq)  static struct irq_chip alcor_irq_type = {  	.name		= "ALCOR", -	.unmask		= alcor_enable_irq, -	.mask		= alcor_disable_irq, -	.mask_ack	= alcor_mask_and_ack_irq, +	.irq_unmask	= alcor_enable_irq, +	.irq_mask	= alcor_disable_irq, +	.irq_mask_ack	= alcor_mask_and_ack_irq,  };  static void @@ -126,9 +126,9 @@ alcor_init_irq(void)  		if (i >= 16+20 && i <= 16+30)  			continue;  		set_irq_chip_and_handler(i, &alcor_irq_type, handle_level_irq); -		irq_to_desc(i)->status |= IRQ_LEVEL; +		irq_set_status_flags(i, IRQ_LEVEL);  	} -	i8259a_irq_type.ack = alcor_isa_mask_and_ack_irq; +	i8259a_irq_type.irq_ack = alcor_isa_mask_and_ack_irq;  	init_i8259a_irqs();  	common_init_isa_dma(); diff --git a/arch/alpha/kernel/sys_cabriolet.c b/arch/alpha/kernel/sys_cabriolet.c index b0c916493ae..57eb6307bc2 100644 --- a/arch/alpha/kernel/sys_cabriolet.c +++ b/arch/alpha/kernel/sys_cabriolet.c @@ -46,22 +46,22 @@ cabriolet_update_irq_hw(unsigned int irq, unsigned long mask)  }  static inline void -cabriolet_enable_irq(unsigned int irq) +cabriolet_enable_irq(struct irq_data *d)  { -	cabriolet_update_irq_hw(irq, cached_irq_mask &= ~(1UL << irq)); +	cabriolet_update_irq_hw(d->irq, cached_irq_mask &= ~(1UL << d->irq));  }  static void -cabriolet_disable_irq(unsigned int irq) +cabriolet_disable_irq(struct irq_data *d)  { -	cabriolet_update_irq_hw(irq, cached_irq_mask |= 1UL << irq); +	cabriolet_update_irq_hw(d->irq, cached_irq_mask |= 1UL << d->irq);  }  static struct irq_chip cabriolet_irq_type = {  	.name		= "CABRIOLET", -	.unmask		= cabriolet_enable_irq, -	.mask		= cabriolet_disable_irq, -	.mask_ack	= cabriolet_disable_irq, +	.irq_unmask	= cabriolet_enable_irq, +	.irq_mask	= cabriolet_disable_irq, +	.irq_mask_ack	= cabriolet_disable_irq,  };  static void  @@ -107,7 +107,7 @@ common_init_irq(void (*srm_dev_int)(unsigned long v))  		for (i = 16; i < 35; ++i) {  			set_irq_chip_and_handler(i, &cabriolet_irq_type,  				handle_level_irq); -			irq_to_desc(i)->status |= IRQ_LEVEL; +			irq_set_status_flags(i, IRQ_LEVEL);  		}  	} diff --git a/arch/alpha/kernel/sys_dp264.c b/arch/alpha/kernel/sys_dp264.c index edad5f759cc..481df4ecb65 100644 --- a/arch/alpha/kernel/sys_dp264.c +++ b/arch/alpha/kernel/sys_dp264.c @@ -98,37 +98,37 @@ tsunami_update_irq_hw(unsigned long mask)  }  static void -dp264_enable_irq(unsigned int irq) +dp264_enable_irq(struct irq_data *d)  {  	spin_lock(&dp264_irq_lock); -	cached_irq_mask |= 1UL << irq; +	cached_irq_mask |= 1UL << d->irq;  	tsunami_update_irq_hw(cached_irq_mask);  	spin_unlock(&dp264_irq_lock);  }  static void -dp264_disable_irq(unsigned int irq) +dp264_disable_irq(struct irq_data *d)  {  	spin_lock(&dp264_irq_lock); -	cached_irq_mask &= ~(1UL << irq); +	cached_irq_mask &= ~(1UL << d->irq);  	tsunami_update_irq_hw(cached_irq_mask);  	spin_unlock(&dp264_irq_lock);  }  static void -clipper_enable_irq(unsigned int irq) +clipper_enable_irq(struct irq_data *d)  {  	spin_lock(&dp264_irq_lock); -	cached_irq_mask |= 1UL << (irq - 16); +	cached_irq_mask |= 1UL << (d->irq - 16);  	tsunami_update_irq_hw(cached_irq_mask);  	spin_unlock(&dp264_irq_lock);  }  static void -clipper_disable_irq(unsigned int irq) +clipper_disable_irq(struct irq_data *d)  {  	spin_lock(&dp264_irq_lock); -	cached_irq_mask &= ~(1UL << (irq - 16)); +	cached_irq_mask &= ~(1UL << (d->irq - 16));  	tsunami_update_irq_hw(cached_irq_mask);  	spin_unlock(&dp264_irq_lock);  } @@ -149,10 +149,11 @@ cpu_set_irq_affinity(unsigned int irq, cpumask_t affinity)  }  static int -dp264_set_affinity(unsigned int irq, const struct cpumask *affinity) -{  +dp264_set_affinity(struct irq_data *d, const struct cpumask *affinity, +		   bool force) +{  	spin_lock(&dp264_irq_lock); -	cpu_set_irq_affinity(irq, *affinity); +	cpu_set_irq_affinity(d->irq, *affinity);  	tsunami_update_irq_hw(cached_irq_mask);  	spin_unlock(&dp264_irq_lock); @@ -160,10 +161,11 @@ dp264_set_affinity(unsigned int irq, const struct cpumask *affinity)  }  static int -clipper_set_affinity(unsigned int irq, const struct cpumask *affinity) -{  +clipper_set_affinity(struct irq_data *d, const struct cpumask *affinity, +		     bool force) +{  	spin_lock(&dp264_irq_lock); -	cpu_set_irq_affinity(irq - 16, *affinity); +	cpu_set_irq_affinity(d->irq - 16, *affinity);  	tsunami_update_irq_hw(cached_irq_mask);  	spin_unlock(&dp264_irq_lock); @@ -171,19 +173,19 @@ clipper_set_affinity(unsigned int irq, const struct cpumask *affinity)  }  static struct irq_chip dp264_irq_type = { -	.name		= "DP264", -	.unmask		= dp264_enable_irq, -	.mask		= dp264_disable_irq, -	.mask_ack	= dp264_disable_irq, -	.set_affinity	= dp264_set_affinity, +	.name			= "DP264", +	.irq_unmask		= dp264_enable_irq, +	.irq_mask		= dp264_disable_irq, +	.irq_mask_ack		= dp264_disable_irq, +	.irq_set_affinity	= dp264_set_affinity,  };  static struct irq_chip clipper_irq_type = { -	.name		= "CLIPPER", -	.unmask		= clipper_enable_irq, -	.mask		= clipper_disable_irq, -	.mask_ack	= clipper_disable_irq, -	.set_affinity	= clipper_set_affinity, +	.name			= "CLIPPER", +	.irq_unmask		= clipper_enable_irq, +	.irq_mask		= clipper_disable_irq, +	.irq_mask_ack		= clipper_disable_irq, +	.irq_set_affinity	= clipper_set_affinity,  };  static void @@ -268,8 +270,8 @@ init_tsunami_irqs(struct irq_chip * ops, int imin, int imax)  {  	long i;  	for (i = imin; i <= imax; ++i) { -		irq_to_desc(i)->status |= IRQ_LEVEL;  		set_irq_chip_and_handler(i, ops, handle_level_irq); +		irq_set_status_flags(i, IRQ_LEVEL);  	}  } diff --git a/arch/alpha/kernel/sys_eb64p.c b/arch/alpha/kernel/sys_eb64p.c index ae5f29d127b..402e908ffb3 100644 --- a/arch/alpha/kernel/sys_eb64p.c +++ b/arch/alpha/kernel/sys_eb64p.c @@ -44,22 +44,22 @@ eb64p_update_irq_hw(unsigned int irq, unsigned long mask)  }  static inline void -eb64p_enable_irq(unsigned int irq) +eb64p_enable_irq(struct irq_data *d)  { -	eb64p_update_irq_hw(irq, cached_irq_mask &= ~(1 << irq)); +	eb64p_update_irq_hw(d->irq, cached_irq_mask &= ~(1 << d->irq));  }  static void -eb64p_disable_irq(unsigned int irq) +eb64p_disable_irq(struct irq_data *d)  { -	eb64p_update_irq_hw(irq, cached_irq_mask |= 1 << irq); +	eb64p_update_irq_hw(d->irq, cached_irq_mask |= 1 << d->irq);  }  static struct irq_chip eb64p_irq_type = {  	.name		= "EB64P", -	.unmask		= eb64p_enable_irq, -	.mask		= eb64p_disable_irq, -	.mask_ack	= eb64p_disable_irq, +	.irq_unmask	= eb64p_enable_irq, +	.irq_mask	= eb64p_disable_irq, +	.irq_mask_ack	= eb64p_disable_irq,  };  static void  @@ -118,9 +118,9 @@ eb64p_init_irq(void)  	init_i8259a_irqs();  	for (i = 16; i < 32; ++i) { -		irq_to_desc(i)->status |= IRQ_LEVEL;  		set_irq_chip_and_handler(i, &eb64p_irq_type, handle_level_irq); -	}		 +		irq_set_status_flags(i, IRQ_LEVEL); +	}  	common_init_isa_dma();  	setup_irq(16+5, &isa_cascade_irqaction); diff --git a/arch/alpha/kernel/sys_eiger.c b/arch/alpha/kernel/sys_eiger.c index 1121bc5c6c6..0b44a54c152 100644 --- a/arch/alpha/kernel/sys_eiger.c +++ b/arch/alpha/kernel/sys_eiger.c @@ -51,16 +51,18 @@ eiger_update_irq_hw(unsigned long irq, unsigned long mask)  }  static inline void -eiger_enable_irq(unsigned int irq) +eiger_enable_irq(struct irq_data *d)  { +	unsigned int irq = d->irq;  	unsigned long mask;  	mask = (cached_irq_mask[irq >= 64] &= ~(1UL << (irq & 63)));  	eiger_update_irq_hw(irq, mask);  }  static void -eiger_disable_irq(unsigned int irq) +eiger_disable_irq(struct irq_data *d)  { +	unsigned int irq = d->irq;  	unsigned long mask;  	mask = (cached_irq_mask[irq >= 64] |= 1UL << (irq & 63));  	eiger_update_irq_hw(irq, mask); @@ -68,9 +70,9 @@ eiger_disable_irq(unsigned int irq)  static struct irq_chip eiger_irq_type = {  	.name		= "EIGER", -	.unmask		= eiger_enable_irq, -	.mask		= eiger_disable_irq, -	.mask_ack	= eiger_disable_irq, +	.irq_unmask	= eiger_enable_irq, +	.irq_mask	= eiger_disable_irq, +	.irq_mask_ack	= eiger_disable_irq,  };  static void @@ -136,8 +138,8 @@ eiger_init_irq(void)  	init_i8259a_irqs();  	for (i = 16; i < 128; ++i) { -		irq_to_desc(i)->status |= IRQ_LEVEL;  		set_irq_chip_and_handler(i, &eiger_irq_type, handle_level_irq); +		irq_set_status_flags(i, IRQ_LEVEL);  	}  } diff --git a/arch/alpha/kernel/sys_jensen.c b/arch/alpha/kernel/sys_jensen.c index 34f55e03d33..00341b75c8b 100644 --- a/arch/alpha/kernel/sys_jensen.c +++ b/arch/alpha/kernel/sys_jensen.c @@ -63,34 +63,34 @@   */  static void -jensen_local_enable(unsigned int irq) +jensen_local_enable(struct irq_data *d)  {  	/* the parport is really hw IRQ 1, silly Jensen.  */ -	if (irq == 7) -		i8259a_enable_irq(1); +	if (d->irq == 7) +		i8259a_enable_irq(d);  }  static void -jensen_local_disable(unsigned int irq) +jensen_local_disable(struct irq_data *d)  {  	/* the parport is really hw IRQ 1, silly Jensen.  */ -	if (irq == 7) -		i8259a_disable_irq(1); +	if (d->irq == 7) +		i8259a_disable_irq(d);  }  static void -jensen_local_mask_ack(unsigned int irq) +jensen_local_mask_ack(struct irq_data *d)  {  	/* the parport is really hw IRQ 1, silly Jensen.  */ -	if (irq == 7) -		i8259a_mask_and_ack_irq(1); +	if (d->irq == 7) +		i8259a_mask_and_ack_irq(d);  }  static struct irq_chip jensen_local_irq_type = {  	.name		= "LOCAL", -	.unmask		= jensen_local_enable, -	.mask		= jensen_local_disable, -	.mask_ack	= jensen_local_mask_ack, +	.irq_unmask	= jensen_local_enable, +	.irq_mask	= jensen_local_disable, +	.irq_mask_ack	= jensen_local_mask_ack,  };  static void  diff --git a/arch/alpha/kernel/sys_marvel.c b/arch/alpha/kernel/sys_marvel.c index 2bfc9f1b1dd..e61910734e4 100644 --- a/arch/alpha/kernel/sys_marvel.c +++ b/arch/alpha/kernel/sys_marvel.c @@ -104,9 +104,10 @@ io7_get_irq_ctl(unsigned int irq, struct io7 **pio7)  }  static void -io7_enable_irq(unsigned int irq) +io7_enable_irq(struct irq_data *d)  {  	volatile unsigned long *ctl; +	unsigned int irq = d->irq;  	struct io7 *io7;  	ctl = io7_get_irq_ctl(irq, &io7); @@ -115,7 +116,7 @@ io7_enable_irq(unsigned int irq)  		       __func__, irq);  		return;  	} -		 +  	spin_lock(&io7->irq_lock);  	*ctl |= 1UL << 24;  	mb(); @@ -124,9 +125,10 @@ io7_enable_irq(unsigned int irq)  }  static void -io7_disable_irq(unsigned int irq) +io7_disable_irq(struct irq_data *d)  {  	volatile unsigned long *ctl; +	unsigned int irq = d->irq;  	struct io7 *io7;  	ctl = io7_get_irq_ctl(irq, &io7); @@ -135,7 +137,7 @@ io7_disable_irq(unsigned int irq)  		       __func__, irq);  		return;  	} -		 +  	spin_lock(&io7->irq_lock);  	*ctl &= ~(1UL << 24);  	mb(); @@ -144,35 +146,29 @@ io7_disable_irq(unsigned int irq)  }  static void -marvel_irq_noop(unsigned int irq)  -{  -	return;  -} - -static unsigned int -marvel_irq_noop_return(unsigned int irq)  -{  -	return 0;  +marvel_irq_noop(struct irq_data *d) +{ +	return;  }  static struct irq_chip marvel_legacy_irq_type = {  	.name		= "LEGACY", -	.mask		= marvel_irq_noop, -	.unmask		= marvel_irq_noop, +	.irq_mask	= marvel_irq_noop, +	.irq_unmask	= marvel_irq_noop,  };  static struct irq_chip io7_lsi_irq_type = {  	.name		= "LSI", -	.unmask		= io7_enable_irq, -	.mask		= io7_disable_irq, -	.mask_ack	= io7_disable_irq, +	.irq_unmask	= io7_enable_irq, +	.irq_mask	= io7_disable_irq, +	.irq_mask_ack	= io7_disable_irq,  };  static struct irq_chip io7_msi_irq_type = {  	.name		= "MSI", -	.unmask		= io7_enable_irq, -	.mask		= io7_disable_irq, -	.ack		= marvel_irq_noop, +	.irq_unmask	= io7_enable_irq, +	.irq_mask	= io7_disable_irq, +	.irq_ack	= marvel_irq_noop,  };  static void @@ -280,8 +276,8 @@ init_io7_irqs(struct io7 *io7,  	/* Set up the lsi irqs.  */  	for (i = 0; i < 128; ++i) { -		irq_to_desc(base + i)->status |= IRQ_LEVEL;  		set_irq_chip_and_handler(base + i, lsi_ops, handle_level_irq); +		irq_set_status_flags(i, IRQ_LEVEL);  	}  	/* Disable the implemented irqs in hardware.  */ @@ -294,8 +290,8 @@ init_io7_irqs(struct io7 *io7,  	/* Set up the msi irqs.  */  	for (i = 128; i < (128 + 512); ++i) { -		irq_to_desc(base + i)->status |= IRQ_LEVEL;  		set_irq_chip_and_handler(base + i, msi_ops, handle_level_irq); +		irq_set_status_flags(i, IRQ_LEVEL);  	}  	for (i = 0; i < 16; ++i) diff --git a/arch/alpha/kernel/sys_mikasa.c b/arch/alpha/kernel/sys_mikasa.c index bcc1639e8ef..cf7f43dd314 100644 --- a/arch/alpha/kernel/sys_mikasa.c +++ b/arch/alpha/kernel/sys_mikasa.c @@ -43,22 +43,22 @@ mikasa_update_irq_hw(int mask)  }  static inline void -mikasa_enable_irq(unsigned int irq) +mikasa_enable_irq(struct irq_data *d)  { -	mikasa_update_irq_hw(cached_irq_mask |= 1 << (irq - 16)); +	mikasa_update_irq_hw(cached_irq_mask |= 1 << (d->irq - 16));  }  static void -mikasa_disable_irq(unsigned int irq) +mikasa_disable_irq(struct irq_data *d)  { -	mikasa_update_irq_hw(cached_irq_mask &= ~(1 << (irq - 16))); +	mikasa_update_irq_hw(cached_irq_mask &= ~(1 << (d->irq - 16)));  }  static struct irq_chip mikasa_irq_type = {  	.name		= "MIKASA", -	.unmask		= mikasa_enable_irq, -	.mask		= mikasa_disable_irq, -	.mask_ack	= mikasa_disable_irq, +	.irq_unmask	= mikasa_enable_irq, +	.irq_mask	= mikasa_disable_irq, +	.irq_mask_ack	= mikasa_disable_irq,  };  static void  @@ -98,8 +98,8 @@ mikasa_init_irq(void)  	mikasa_update_irq_hw(0);  	for (i = 16; i < 32; ++i) { -		irq_to_desc(i)->status |= IRQ_LEVEL;  		set_irq_chip_and_handler(i, &mikasa_irq_type, handle_level_irq); +		irq_set_status_flags(i, IRQ_LEVEL);  	}  	init_i8259a_irqs(); diff --git a/arch/alpha/kernel/sys_noritake.c b/arch/alpha/kernel/sys_noritake.c index e88f4ae1260..92bc188e94a 100644 --- a/arch/alpha/kernel/sys_noritake.c +++ b/arch/alpha/kernel/sys_noritake.c @@ -48,22 +48,22 @@ noritake_update_irq_hw(int irq, int mask)  }  static void -noritake_enable_irq(unsigned int irq) +noritake_enable_irq(struct irq_data *d)  { -	noritake_update_irq_hw(irq, cached_irq_mask |= 1 << (irq - 16)); +	noritake_update_irq_hw(d->irq, cached_irq_mask |= 1 << (d->irq - 16));  }  static void -noritake_disable_irq(unsigned int irq) +noritake_disable_irq(struct irq_data *d)  { -	noritake_update_irq_hw(irq, cached_irq_mask &= ~(1 << (irq - 16))); +	noritake_update_irq_hw(d->irq, cached_irq_mask &= ~(1 << (d->irq - 16)));  }  static struct irq_chip noritake_irq_type = {  	.name		= "NORITAKE", -	.unmask		= noritake_enable_irq, -	.mask		= noritake_disable_irq, -	.mask_ack	= noritake_disable_irq, +	.irq_unmask	= noritake_enable_irq, +	.irq_mask	= noritake_disable_irq, +	.irq_mask_ack	= noritake_disable_irq,  };  static void  @@ -127,8 +127,8 @@ noritake_init_irq(void)  	outw(0, 0x54c);  	for (i = 16; i < 48; ++i) { -		irq_to_desc(i)->status |= IRQ_LEVEL;  		set_irq_chip_and_handler(i, &noritake_irq_type, handle_level_irq); +		irq_set_status_flags(i, IRQ_LEVEL);  	}  	init_i8259a_irqs(); diff --git a/arch/alpha/kernel/sys_rawhide.c b/arch/alpha/kernel/sys_rawhide.c index 6a51364dd1c..936d4140ed5 100644 --- a/arch/alpha/kernel/sys_rawhide.c +++ b/arch/alpha/kernel/sys_rawhide.c @@ -56,9 +56,10 @@ rawhide_update_irq_hw(int hose, int mask)    (((h) < MCPCIA_MAX_HOSES) && (cached_irq_masks[(h)] != 0))  static inline void  -rawhide_enable_irq(unsigned int irq) +rawhide_enable_irq(struct irq_data *d)  {  	unsigned int mask, hose; +	unsigned int irq = d->irq;  	irq -= 16;  	hose = irq / 24; @@ -76,9 +77,10 @@ rawhide_enable_irq(unsigned int irq)  }  static void  -rawhide_disable_irq(unsigned int irq) +rawhide_disable_irq(struct irq_data *d)  {  	unsigned int mask, hose; +	unsigned int irq = d->irq;  	irq -= 16;  	hose = irq / 24; @@ -96,9 +98,10 @@ rawhide_disable_irq(unsigned int irq)  }  static void -rawhide_mask_and_ack_irq(unsigned int irq) +rawhide_mask_and_ack_irq(struct irq_data *d)  {  	unsigned int mask, mask1, hose; +	unsigned int irq = d->irq;  	irq -= 16;  	hose = irq / 24; @@ -123,9 +126,9 @@ rawhide_mask_and_ack_irq(unsigned int irq)  static struct irq_chip rawhide_irq_type = {  	.name		= "RAWHIDE", -	.unmask		= rawhide_enable_irq, -	.mask		= rawhide_disable_irq, -	.mask_ack	= rawhide_mask_and_ack_irq, +	.irq_unmask	= rawhide_enable_irq, +	.irq_mask	= rawhide_disable_irq, +	.irq_mask_ack	= rawhide_mask_and_ack_irq,  };  static void  @@ -177,8 +180,8 @@ rawhide_init_irq(void)  	}  	for (i = 16; i < 128; ++i) { -		irq_to_desc(i)->status |= IRQ_LEVEL;  		set_irq_chip_and_handler(i, &rawhide_irq_type, handle_level_irq); +		irq_set_status_flags(i, IRQ_LEVEL);  	}  	init_i8259a_irqs(); diff --git a/arch/alpha/kernel/sys_rx164.c b/arch/alpha/kernel/sys_rx164.c index 89e7e37ec84..cea22a62913 100644 --- a/arch/alpha/kernel/sys_rx164.c +++ b/arch/alpha/kernel/sys_rx164.c @@ -47,22 +47,22 @@ rx164_update_irq_hw(unsigned long mask)  }  static inline void -rx164_enable_irq(unsigned int irq) +rx164_enable_irq(struct irq_data *d)  { -	rx164_update_irq_hw(cached_irq_mask |= 1UL << (irq - 16)); +	rx164_update_irq_hw(cached_irq_mask |= 1UL << (d->irq - 16));  }  static void -rx164_disable_irq(unsigned int irq) +rx164_disable_irq(struct irq_data *d)  { -	rx164_update_irq_hw(cached_irq_mask &= ~(1UL << (irq - 16))); +	rx164_update_irq_hw(cached_irq_mask &= ~(1UL << (d->irq - 16)));  }  static struct irq_chip rx164_irq_type = {  	.name		= "RX164", -	.unmask		= rx164_enable_irq, -	.mask		= rx164_disable_irq, -	.mask_ack	= rx164_disable_irq, +	.irq_unmask	= rx164_enable_irq, +	.irq_mask	= rx164_disable_irq, +	.irq_mask_ack	= rx164_disable_irq,  };  static void  @@ -99,8 +99,8 @@ rx164_init_irq(void)  	rx164_update_irq_hw(0);  	for (i = 16; i < 40; ++i) { -		irq_to_desc(i)->status |= IRQ_LEVEL;  		set_irq_chip_and_handler(i, &rx164_irq_type, handle_level_irq); +		irq_set_status_flags(i, IRQ_LEVEL);  	}  	init_i8259a_irqs(); diff --git a/arch/alpha/kernel/sys_sable.c b/arch/alpha/kernel/sys_sable.c index 5c4423d1b06..a349538aabc 100644 --- a/arch/alpha/kernel/sys_sable.c +++ b/arch/alpha/kernel/sys_sable.c @@ -443,11 +443,11 @@ lynx_swizzle(struct pci_dev *dev, u8 *pinp)  /* GENERIC irq routines */  static inline void -sable_lynx_enable_irq(unsigned int irq) +sable_lynx_enable_irq(struct irq_data *d)  {  	unsigned long bit, mask; -	bit = sable_lynx_irq_swizzle->irq_to_mask[irq]; +	bit = sable_lynx_irq_swizzle->irq_to_mask[d->irq];  	spin_lock(&sable_lynx_irq_lock);  	mask = sable_lynx_irq_swizzle->shadow_mask &= ~(1UL << bit);  	sable_lynx_irq_swizzle->update_irq_hw(bit, mask); @@ -459,11 +459,11 @@ sable_lynx_enable_irq(unsigned int irq)  }  static void -sable_lynx_disable_irq(unsigned int irq) +sable_lynx_disable_irq(struct irq_data *d)  {  	unsigned long bit, mask; -	bit = sable_lynx_irq_swizzle->irq_to_mask[irq]; +	bit = sable_lynx_irq_swizzle->irq_to_mask[d->irq];  	spin_lock(&sable_lynx_irq_lock);  	mask = sable_lynx_irq_swizzle->shadow_mask |= 1UL << bit;  	sable_lynx_irq_swizzle->update_irq_hw(bit, mask); @@ -475,11 +475,11 @@ sable_lynx_disable_irq(unsigned int irq)  }  static void -sable_lynx_mask_and_ack_irq(unsigned int irq) +sable_lynx_mask_and_ack_irq(struct irq_data *d)  {  	unsigned long bit, mask; -	bit = sable_lynx_irq_swizzle->irq_to_mask[irq]; +	bit = sable_lynx_irq_swizzle->irq_to_mask[d->irq];  	spin_lock(&sable_lynx_irq_lock);  	mask = sable_lynx_irq_swizzle->shadow_mask |= 1UL << bit;  	sable_lynx_irq_swizzle->update_irq_hw(bit, mask); @@ -489,9 +489,9 @@ sable_lynx_mask_and_ack_irq(unsigned int irq)  static struct irq_chip sable_lynx_irq_type = {  	.name		= "SABLE/LYNX", -	.unmask		= sable_lynx_enable_irq, -	.mask		= sable_lynx_disable_irq, -	.mask_ack	= sable_lynx_mask_and_ack_irq, +	.irq_unmask	= sable_lynx_enable_irq, +	.irq_mask	= sable_lynx_disable_irq, +	.irq_mask_ack	= sable_lynx_mask_and_ack_irq,  };  static void  @@ -518,9 +518,9 @@ sable_lynx_init_irq(int nr_of_irqs)  	long i;  	for (i = 0; i < nr_of_irqs; ++i) { -		irq_to_desc(i)->status |= IRQ_LEVEL;  		set_irq_chip_and_handler(i, &sable_lynx_irq_type,  			handle_level_irq); +		irq_set_status_flags(i, IRQ_LEVEL);  	}  	common_init_isa_dma(); diff --git a/arch/alpha/kernel/sys_takara.c b/arch/alpha/kernel/sys_takara.c index f8a1e8a862f..42a5331f13c 100644 --- a/arch/alpha/kernel/sys_takara.c +++ b/arch/alpha/kernel/sys_takara.c @@ -45,16 +45,18 @@ takara_update_irq_hw(unsigned long irq, unsigned long mask)  }  static inline void -takara_enable_irq(unsigned int irq) +takara_enable_irq(struct irq_data *d)  { +	unsigned int irq = d->irq;  	unsigned long mask;  	mask = (cached_irq_mask[irq >= 64] &= ~(1UL << (irq & 63)));  	takara_update_irq_hw(irq, mask);  }  static void -takara_disable_irq(unsigned int irq) +takara_disable_irq(struct irq_data *d)  { +	unsigned int irq = d->irq;  	unsigned long mask;  	mask = (cached_irq_mask[irq >= 64] |= 1UL << (irq & 63));  	takara_update_irq_hw(irq, mask); @@ -62,9 +64,9 @@ takara_disable_irq(unsigned int irq)  static struct irq_chip takara_irq_type = {  	.name		= "TAKARA", -	.unmask		= takara_enable_irq, -	.mask		= takara_disable_irq, -	.mask_ack	= takara_disable_irq, +	.irq_unmask	= takara_enable_irq, +	.irq_mask	= takara_disable_irq, +	.irq_mask_ack	= takara_disable_irq,  };  static void @@ -136,8 +138,8 @@ takara_init_irq(void)  		takara_update_irq_hw(i, -1);  	for (i = 16; i < 128; ++i) { -		irq_to_desc(i)->status |= IRQ_LEVEL;  		set_irq_chip_and_handler(i, &takara_irq_type, handle_level_irq); +		irq_set_status_flags(i, IRQ_LEVEL);  	}  	common_init_isa_dma(); diff --git a/arch/alpha/kernel/sys_titan.c b/arch/alpha/kernel/sys_titan.c index e02494bf5ef..f6c108a3d67 100644 --- a/arch/alpha/kernel/sys_titan.c +++ b/arch/alpha/kernel/sys_titan.c @@ -112,8 +112,9 @@ titan_update_irq_hw(unsigned long mask)  }  static inline void -titan_enable_irq(unsigned int irq) +titan_enable_irq(struct irq_data *d)  { +	unsigned int irq = d->irq;  	spin_lock(&titan_irq_lock);  	titan_cached_irq_mask |= 1UL << (irq - 16);  	titan_update_irq_hw(titan_cached_irq_mask); @@ -121,8 +122,9 @@ titan_enable_irq(unsigned int irq)  }  static inline void -titan_disable_irq(unsigned int irq) +titan_disable_irq(struct irq_data *d)  { +	unsigned int irq = d->irq;  	spin_lock(&titan_irq_lock);  	titan_cached_irq_mask &= ~(1UL << (irq - 16));  	titan_update_irq_hw(titan_cached_irq_mask); @@ -144,7 +146,8 @@ titan_cpu_set_irq_affinity(unsigned int irq, cpumask_t affinity)  }  static int -titan_set_irq_affinity(unsigned int irq, const struct cpumask *affinity) +titan_set_irq_affinity(struct irq_data *d, const struct cpumask *affinity, +		       bool force)  {   	spin_lock(&titan_irq_lock);  	titan_cpu_set_irq_affinity(irq - 16, *affinity); @@ -175,17 +178,17 @@ init_titan_irqs(struct irq_chip * ops, int imin, int imax)  {  	long i;  	for (i = imin; i <= imax; ++i) { -		irq_to_desc(i)->status |= IRQ_LEVEL;  		set_irq_chip_and_handler(i, ops, handle_level_irq); +		irq_set_status_flags(i, IRQ_LEVEL);  	}  }  static struct irq_chip titan_irq_type = { -       .name		= "TITAN", -       .unmask		= titan_enable_irq, -       .mask		= titan_disable_irq, -       .mask_ack	= titan_disable_irq, -       .set_affinity	= titan_set_irq_affinity, +       .name			= "TITAN", +       .irq_unmask		= titan_enable_irq, +       .irq_mask		= titan_disable_irq, +       .irq_mask_ack		= titan_disable_irq, +       .irq_set_affinity	= titan_set_irq_affinity,  };  static irqreturn_t diff --git a/arch/alpha/kernel/sys_wildfire.c b/arch/alpha/kernel/sys_wildfire.c index eec52594d41..ca60a387ef0 100644 --- a/arch/alpha/kernel/sys_wildfire.c +++ b/arch/alpha/kernel/sys_wildfire.c @@ -104,10 +104,12 @@ wildfire_init_irq_hw(void)  }  static void -wildfire_enable_irq(unsigned int irq) +wildfire_enable_irq(struct irq_data *d)  { +	unsigned int irq = d->irq; +  	if (irq < 16) -		i8259a_enable_irq(irq); +		i8259a_enable_irq(d);  	spin_lock(&wildfire_irq_lock);  	set_bit(irq, &cached_irq_mask); @@ -116,10 +118,12 @@ wildfire_enable_irq(unsigned int irq)  }  static void -wildfire_disable_irq(unsigned int irq) +wildfire_disable_irq(struct irq_data *d)  { +	unsigned int irq = d->irq; +  	if (irq < 16) -		i8259a_disable_irq(irq); +		i8259a_disable_irq(d);  	spin_lock(&wildfire_irq_lock);  	clear_bit(irq, &cached_irq_mask); @@ -128,10 +132,12 @@ wildfire_disable_irq(unsigned int irq)  }  static void -wildfire_mask_and_ack_irq(unsigned int irq) +wildfire_mask_and_ack_irq(struct irq_data *d)  { +	unsigned int irq = d->irq; +  	if (irq < 16) -		i8259a_mask_and_ack_irq(irq); +		i8259a_mask_and_ack_irq(d);  	spin_lock(&wildfire_irq_lock);  	clear_bit(irq, &cached_irq_mask); @@ -141,9 +147,9 @@ wildfire_mask_and_ack_irq(unsigned int irq)  static struct irq_chip wildfire_irq_type = {  	.name		= "WILDFIRE", -	.unmask		= wildfire_enable_irq, -	.mask		= wildfire_disable_irq, -	.mask_ack	= wildfire_mask_and_ack_irq, +	.irq_unmask	= wildfire_enable_irq, +	.irq_mask	= wildfire_disable_irq, +	.irq_mask_ack	= wildfire_mask_and_ack_irq,  };  static void __init @@ -177,21 +183,21 @@ wildfire_init_irq_per_pca(int qbbno, int pcano)  	for (i = 0; i < 16; ++i) {  		if (i == 2)  			continue; -		irq_to_desc(i+irq_bias)->status |= IRQ_LEVEL;  		set_irq_chip_and_handler(i+irq_bias, &wildfire_irq_type,  			handle_level_irq); +		irq_set_status_flags(i + irq_bias, IRQ_LEVEL);  	} -	irq_to_desc(36+irq_bias)->status |= IRQ_LEVEL;  	set_irq_chip_and_handler(36+irq_bias, &wildfire_irq_type,  		handle_level_irq); +	irq_set_status_flags(36 + irq_bias, IRQ_LEVEL);  	for (i = 40; i < 64; ++i) { -		irq_to_desc(i+irq_bias)->status |= IRQ_LEVEL;  		set_irq_chip_and_handler(i+irq_bias, &wildfire_irq_type,  			handle_level_irq); +		irq_set_status_flags(i + irq_bias, IRQ_LEVEL);  	} -	setup_irq(32+irq_bias, &isa_enable);	 +	setup_irq(32+irq_bias, &isa_enable);  }  static void __init diff --git a/arch/arm/common/Kconfig b/arch/arm/common/Kconfig index 778655f0257..ea5ee4d067f 100644 --- a/arch/arm/common/Kconfig +++ b/arch/arm/common/Kconfig @@ -6,6 +6,8 @@ config ARM_VIC  config ARM_VIC_NR  	int +	default 4 if ARCH_S5PV210 +	default 3 if ARCH_S5P6442 || ARCH_S5PC100  	default 2  	depends on ARM_VIC  	help diff --git a/arch/arm/include/asm/mach/arch.h b/arch/arm/include/asm/mach/arch.h index 3a0893a76a3..bf13b814c1b 100644 --- a/arch/arm/include/asm/mach/arch.h +++ b/arch/arm/include/asm/mach/arch.h @@ -15,10 +15,6 @@ struct meminfo;  struct sys_timer;  struct machine_desc { -	/* -	 * Note! The first two elements are used -	 * by assembler code in head.S, head-common.S -	 */  	unsigned int		nr;		/* architecture number	*/  	const char		*name;		/* architecture name	*/  	unsigned long		boot_params;	/* tagged list		*/ diff --git a/arch/arm/include/asm/pgalloc.h b/arch/arm/include/asm/pgalloc.h index 9763be04f77..22de005f159 100644 --- a/arch/arm/include/asm/pgalloc.h +++ b/arch/arm/include/asm/pgalloc.h @@ -10,6 +10,8 @@  #ifndef _ASMARM_PGALLOC_H  #define _ASMARM_PGALLOC_H +#include <linux/pagemap.h> +  #include <asm/domain.h>  #include <asm/pgtable-hwdef.h>  #include <asm/processor.h> diff --git a/arch/arm/kernel/hw_breakpoint.c b/arch/arm/kernel/hw_breakpoint.c index d600bd35070..44b84fe6e1b 100644 --- a/arch/arm/kernel/hw_breakpoint.c +++ b/arch/arm/kernel/hw_breakpoint.c @@ -836,9 +836,11 @@ static int hw_breakpoint_pending(unsigned long addr, unsigned int fsr,  /*   * One-time initialisation.   */ -static void reset_ctrl_regs(void *unused) +static void reset_ctrl_regs(void *info)  { -	int i; +	int i, cpu = smp_processor_id(); +	u32 dbg_power; +	cpumask_t *cpumask = info;  	/*  	 * v7 debug contains save and restore registers so that debug state @@ -850,6 +852,17 @@ static void reset_ctrl_regs(void *unused)  	 */  	if (debug_arch >= ARM_DEBUG_ARCH_V7_ECP14) {  		/* +		 * Ensure sticky power-down is clear (i.e. debug logic is +		 * powered up). +		 */ +		asm volatile("mrc p14, 0, %0, c1, c5, 4" : "=r" (dbg_power)); +		if ((dbg_power & 0x1) == 0) { +			pr_warning("CPU %d debug is powered down!\n", cpu); +			cpumask_or(cpumask, cpumask, cpumask_of(cpu)); +			return; +		} + +		/*  		 * Unconditionally clear the lock by writing a value  		 * other than 0xC5ACCE55 to the access register.  		 */ @@ -887,6 +900,7 @@ static struct notifier_block __cpuinitdata dbg_reset_nb = {  static int __init arch_hw_breakpoint_init(void)  {  	u32 dscr; +	cpumask_t cpumask = { CPU_BITS_NONE };  	debug_arch = get_debug_arch(); @@ -911,7 +925,13 @@ static int __init arch_hw_breakpoint_init(void)  	 * Reset the breakpoint resources. We assume that a halting  	 * debugger will leave the world in a nice state for us.  	 */ -	on_each_cpu(reset_ctrl_regs, NULL, 1); +	on_each_cpu(reset_ctrl_regs, &cpumask, 1); +	if (!cpumask_empty(&cpumask)) { +		core_num_brps = 0; +		core_num_reserved_brps = 0; +		core_num_wrps = 0; +		return 0; +	}  	ARM_DBG_READ(c1, 0, dscr);  	if (dscr & ARM_DSCR_HDBGEN) { diff --git a/arch/arm/kernel/ptrace.c b/arch/arm/kernel/ptrace.c index 19c6816db61..b13e70f63d7 100644 --- a/arch/arm/kernel/ptrace.c +++ b/arch/arm/kernel/ptrace.c @@ -996,10 +996,10 @@ static int ptrace_gethbpregs(struct task_struct *tsk, long num,  		while (!(arch_ctrl.len & 0x1))  			arch_ctrl.len >>= 1; -		if (idx & 0x1) -			reg = encode_ctrl_reg(arch_ctrl); -		else +		if (num & 0x1)  			reg = bp->attr.bp_addr; +		else +			reg = encode_ctrl_reg(arch_ctrl);  	}  put: diff --git a/arch/arm/mach-davinci/cpufreq.c b/arch/arm/mach-davinci/cpufreq.c index 343de73161f..4a68c2b1ec1 100644 --- a/arch/arm/mach-davinci/cpufreq.c +++ b/arch/arm/mach-davinci/cpufreq.c @@ -132,7 +132,7 @@ out:  	return ret;  } -static int __init davinci_cpu_init(struct cpufreq_policy *policy) +static int davinci_cpu_init(struct cpufreq_policy *policy)  {  	int result = 0;  	struct davinci_cpufreq_config *pdata = cpufreq.dev->platform_data; diff --git a/arch/arm/mach-davinci/devices-da8xx.c b/arch/arm/mach-davinci/devices-da8xx.c index 9eec63070e0..beda8a4133a 100644 --- a/arch/arm/mach-davinci/devices-da8xx.c +++ b/arch/arm/mach-davinci/devices-da8xx.c @@ -480,8 +480,15 @@ static struct platform_device da850_mcasp_device = {  	.resource	= da850_mcasp_resources,  }; +struct platform_device davinci_pcm_device = { +	.name	= "davinci-pcm-audio", +	.id	= -1, +}; +  void __init da8xx_register_mcasp(int id, struct snd_platform_data *pdata)  { +	platform_device_register(&davinci_pcm_device); +  	/* DA830/OMAP-L137 has 3 instances of McASP */  	if (cpu_is_davinci_da830() && id == 1) {  		da830_mcasp1_device.dev.platform_data = pdata; diff --git a/arch/arm/mach-davinci/gpio-tnetv107x.c b/arch/arm/mach-davinci/gpio-tnetv107x.c index d10298620e2..3fa3e2867e1 100644 --- a/arch/arm/mach-davinci/gpio-tnetv107x.c +++ b/arch/arm/mach-davinci/gpio-tnetv107x.c @@ -58,7 +58,7 @@ static int tnetv107x_gpio_request(struct gpio_chip *chip, unsigned offset)  	spin_lock_irqsave(&ctlr->lock, flags); -	gpio_reg_set_bit(®s->enable, gpio); +	gpio_reg_set_bit(regs->enable, gpio);  	spin_unlock_irqrestore(&ctlr->lock, flags); @@ -74,7 +74,7 @@ static void tnetv107x_gpio_free(struct gpio_chip *chip, unsigned offset)  	spin_lock_irqsave(&ctlr->lock, flags); -	gpio_reg_clear_bit(®s->enable, gpio); +	gpio_reg_clear_bit(regs->enable, gpio);  	spin_unlock_irqrestore(&ctlr->lock, flags);  } @@ -88,7 +88,7 @@ static int tnetv107x_gpio_dir_in(struct gpio_chip *chip, unsigned offset)  	spin_lock_irqsave(&ctlr->lock, flags); -	gpio_reg_set_bit(®s->direction, gpio); +	gpio_reg_set_bit(regs->direction, gpio);  	spin_unlock_irqrestore(&ctlr->lock, flags); @@ -106,11 +106,11 @@ static int tnetv107x_gpio_dir_out(struct gpio_chip *chip,  	spin_lock_irqsave(&ctlr->lock, flags);  	if (value) -		gpio_reg_set_bit(®s->data_out, gpio); +		gpio_reg_set_bit(regs->data_out, gpio);  	else -		gpio_reg_clear_bit(®s->data_out, gpio); +		gpio_reg_clear_bit(regs->data_out, gpio); -	gpio_reg_clear_bit(®s->direction, gpio); +	gpio_reg_clear_bit(regs->direction, gpio);  	spin_unlock_irqrestore(&ctlr->lock, flags); @@ -124,7 +124,7 @@ static int tnetv107x_gpio_get(struct gpio_chip *chip, unsigned offset)  	unsigned gpio = chip->base + offset;  	int ret; -	ret = gpio_reg_get_bit(®s->data_in, gpio); +	ret = gpio_reg_get_bit(regs->data_in, gpio);  	return ret ? 1 : 0;  } @@ -140,9 +140,9 @@ static void tnetv107x_gpio_set(struct gpio_chip *chip,  	spin_lock_irqsave(&ctlr->lock, flags);  	if (value) -		gpio_reg_set_bit(®s->data_out, gpio); +		gpio_reg_set_bit(regs->data_out, gpio);  	else -		gpio_reg_clear_bit(®s->data_out, gpio); +		gpio_reg_clear_bit(regs->data_out, gpio);  	spin_unlock_irqrestore(&ctlr->lock, flags);  } diff --git a/arch/arm/mach-davinci/include/mach/clkdev.h b/arch/arm/mach-davinci/include/mach/clkdev.h index 730c49d1ebd..14a50488718 100644 --- a/arch/arm/mach-davinci/include/mach/clkdev.h +++ b/arch/arm/mach-davinci/include/mach/clkdev.h @@ -1,6 +1,8 @@  #ifndef __MACH_CLKDEV_H  #define __MACH_CLKDEV_H +struct clk; +  static inline int __clk_get(struct clk *clk)  {  	return 1; diff --git a/arch/arm/mach-omap2/board-omap3beagle.c b/arch/arm/mach-omap2/board-omap3beagle.c index b6752ac5b97..20c5dbea895 100644 --- a/arch/arm/mach-omap2/board-omap3beagle.c +++ b/arch/arm/mach-omap2/board-omap3beagle.c @@ -23,6 +23,7 @@  #include <linux/gpio.h>  #include <linux/input.h>  #include <linux/gpio_keys.h> +#include <linux/opp.h>  #include <linux/mtd/mtd.h>  #include <linux/mtd/partitions.h> @@ -45,10 +46,12 @@  #include <plat/gpmc.h>  #include <plat/nand.h>  #include <plat/usb.h> +#include <plat/omap_device.h>  #include "mux.h"  #include "hsmmc.h"  #include "timer-gp.h" +#include "pm.h"  #define NAND_BLOCK_SIZE		SZ_128K @@ -603,6 +606,52 @@ static struct omap_musb_board_data musb_board_data = {  	.power			= 100,  }; +static void __init beagle_opp_init(void) +{ +	int r = 0; + +	/* Initialize the omap3 opp table */ +	if (omap3_opp_init()) { +		pr_err("%s: opp default init failed\n", __func__); +		return; +	} + +	/* Custom OPP enabled for XM */ +	if (omap3_beagle_get_rev() == OMAP3BEAGLE_BOARD_XM) { +		struct omap_hwmod *mh = omap_hwmod_lookup("mpu"); +		struct omap_hwmod *dh = omap_hwmod_lookup("iva"); +		struct device *dev; + +		if (!mh || !dh) { +			pr_err("%s: Aiee.. no mpu/dsp devices? %p %p\n", +				__func__, mh, dh); +			return; +		} +		/* Enable MPU 1GHz and lower opps */ +		dev = &mh->od->pdev.dev; +		r = opp_enable(dev, 800000000); +		/* TODO: MPU 1GHz needs SR and ABB */ + +		/* Enable IVA 800MHz and lower opps */ +		dev = &dh->od->pdev.dev; +		r |= opp_enable(dev, 660000000); +		/* TODO: DSP 800MHz needs SR and ABB */ +		if (r) { +			pr_err("%s: failed to enable higher opp %d\n", +				__func__, r); +			/* +			 * Cleanup - disable the higher freqs - we dont care +			 * about the results +			 */ +			dev = &mh->od->pdev.dev; +			opp_disable(dev, 800000000); +			dev = &dh->od->pdev.dev; +			opp_disable(dev, 660000000); +		} +	} +	return; +} +  static void __init omap3_beagle_init(void)  {  	omap3_mux_init(board_mux, OMAP_PACKAGE_CBB); @@ -627,6 +676,7 @@ static void __init omap3_beagle_init(void)  	omap_mux_init_signal("sdrc_cke1", OMAP_PIN_OUTPUT);  	beagle_display_init(); +	beagle_opp_init();  }  MACHINE_START(OMAP3_BEAGLE, "OMAP3 Beagle Board") diff --git a/arch/arm/mach-omap2/common.c b/arch/arm/mach-omap2/common.c index 48de4513de4..3f20cbb9967 100644 --- a/arch/arm/mach-omap2/common.c +++ b/arch/arm/mach-omap2/common.c @@ -50,9 +50,6 @@ static struct omap_globals omap242x_globals = {  	.ctrl	= OMAP242X_CTRL_BASE,  	.prm	= OMAP2420_PRM_BASE,  	.cm	= OMAP2420_CM_BASE, -	.uart1_phys	= OMAP2_UART1_BASE, -	.uart2_phys	= OMAP2_UART2_BASE, -	.uart3_phys	= OMAP2_UART3_BASE,  };  void __init omap2_set_globals_242x(void) @@ -71,9 +68,6 @@ static struct omap_globals omap243x_globals = {  	.ctrl	= OMAP243X_CTRL_BASE,  	.prm	= OMAP2430_PRM_BASE,  	.cm	= OMAP2430_CM_BASE, -	.uart1_phys	= OMAP2_UART1_BASE, -	.uart2_phys	= OMAP2_UART2_BASE, -	.uart3_phys	= OMAP2_UART3_BASE,  };  void __init omap2_set_globals_243x(void) @@ -92,10 +86,6 @@ static struct omap_globals omap3_globals = {  	.ctrl	= OMAP343X_CTRL_BASE,  	.prm	= OMAP3430_PRM_BASE,  	.cm	= OMAP3430_CM_BASE, -	.uart1_phys	= OMAP3_UART1_BASE, -	.uart2_phys	= OMAP3_UART2_BASE, -	.uart3_phys	= OMAP3_UART3_BASE, -	.uart4_phys	= OMAP3_UART4_BASE,	/* Only on 3630 */  };  void __init omap2_set_globals_3xxx(void) @@ -140,10 +130,6 @@ static struct omap_globals omap4_globals = {  	.prm	= OMAP4430_PRM_BASE,  	.cm	= OMAP4430_CM_BASE,  	.cm2	= OMAP4430_CM2_BASE, -	.uart1_phys	= OMAP4_UART1_BASE, -	.uart2_phys	= OMAP4_UART2_BASE, -	.uart3_phys	= OMAP4_UART3_BASE, -	.uart4_phys	= OMAP4_UART4_BASE,  };  void __init omap2_set_globals_443x(void) diff --git a/arch/arm/mach-omap2/cpuidle34xx.c b/arch/arm/mach-omap2/cpuidle34xx.c index f7b22a16f38..cba437dd002 100644 --- a/arch/arm/mach-omap2/cpuidle34xx.c +++ b/arch/arm/mach-omap2/cpuidle34xx.c @@ -58,6 +58,7 @@ struct omap3_processor_cx {  	u32 core_state;  	u32 threshold;  	u32 flags; +	const char *desc;  };  struct omap3_processor_cx omap3_power_states[OMAP3_MAX_STATES]; @@ -365,6 +366,7 @@ void omap_init_power_states(void)  	omap3_power_states[OMAP3_STATE_C1].mpu_state = PWRDM_POWER_ON;  	omap3_power_states[OMAP3_STATE_C1].core_state = PWRDM_POWER_ON;  	omap3_power_states[OMAP3_STATE_C1].flags = CPUIDLE_FLAG_TIME_VALID; +	omap3_power_states[OMAP3_STATE_C1].desc = "MPU ON + CORE ON";  	/* C2 . MPU WFI + Core inactive */  	omap3_power_states[OMAP3_STATE_C2].valid = @@ -380,6 +382,7 @@ void omap_init_power_states(void)  	omap3_power_states[OMAP3_STATE_C2].core_state = PWRDM_POWER_ON;  	omap3_power_states[OMAP3_STATE_C2].flags = CPUIDLE_FLAG_TIME_VALID |  				CPUIDLE_FLAG_CHECK_BM; +	omap3_power_states[OMAP3_STATE_C2].desc = "MPU ON + CORE ON";  	/* C3 . MPU CSWR + Core inactive */  	omap3_power_states[OMAP3_STATE_C3].valid = @@ -395,6 +398,7 @@ void omap_init_power_states(void)  	omap3_power_states[OMAP3_STATE_C3].core_state = PWRDM_POWER_ON;  	omap3_power_states[OMAP3_STATE_C3].flags = CPUIDLE_FLAG_TIME_VALID |  				CPUIDLE_FLAG_CHECK_BM; +	omap3_power_states[OMAP3_STATE_C3].desc = "MPU RET + CORE ON";  	/* C4 . MPU OFF + Core inactive */  	omap3_power_states[OMAP3_STATE_C4].valid = @@ -410,6 +414,7 @@ void omap_init_power_states(void)  	omap3_power_states[OMAP3_STATE_C4].core_state = PWRDM_POWER_ON;  	omap3_power_states[OMAP3_STATE_C4].flags = CPUIDLE_FLAG_TIME_VALID |  				CPUIDLE_FLAG_CHECK_BM; +	omap3_power_states[OMAP3_STATE_C4].desc = "MPU OFF + CORE ON";  	/* C5 . MPU CSWR + Core CSWR*/  	omap3_power_states[OMAP3_STATE_C5].valid = @@ -425,6 +430,7 @@ void omap_init_power_states(void)  	omap3_power_states[OMAP3_STATE_C5].core_state = PWRDM_POWER_RET;  	omap3_power_states[OMAP3_STATE_C5].flags = CPUIDLE_FLAG_TIME_VALID |  				CPUIDLE_FLAG_CHECK_BM; +	omap3_power_states[OMAP3_STATE_C5].desc = "MPU RET + CORE RET";  	/* C6 . MPU OFF + Core CSWR */  	omap3_power_states[OMAP3_STATE_C6].valid = @@ -440,6 +446,7 @@ void omap_init_power_states(void)  	omap3_power_states[OMAP3_STATE_C6].core_state = PWRDM_POWER_RET;  	omap3_power_states[OMAP3_STATE_C6].flags = CPUIDLE_FLAG_TIME_VALID |  				CPUIDLE_FLAG_CHECK_BM; +	omap3_power_states[OMAP3_STATE_C6].desc = "MPU OFF + CORE RET";  	/* C7 . MPU OFF + Core OFF */  	omap3_power_states[OMAP3_STATE_C7].valid = @@ -455,6 +462,7 @@ void omap_init_power_states(void)  	omap3_power_states[OMAP3_STATE_C7].core_state = PWRDM_POWER_OFF;  	omap3_power_states[OMAP3_STATE_C7].flags = CPUIDLE_FLAG_TIME_VALID |  				CPUIDLE_FLAG_CHECK_BM; +	omap3_power_states[OMAP3_STATE_C7].desc = "MPU OFF + CORE OFF";  	/*  	 * Erratum i583: implementation for ES rev < Es1.2 on 3630. We cannot @@ -464,7 +472,7 @@ void omap_init_power_states(void)  	if (IS_PM34XX_ERRATUM(PM_SDRC_WAKEUP_ERRATUM_i583)) {  		omap3_power_states[OMAP3_STATE_C7].valid = 0;  		cpuidle_params_table[OMAP3_STATE_C7].valid = 0; -		WARN_ONCE(1, "%s: core off state C7 disabled due to i583\n", +		pr_warn("%s: core off state C7 disabled due to i583\n",  				__func__);  	}  } @@ -512,6 +520,7 @@ int __init omap3_idle_init(void)  		if (cx->type == OMAP3_STATE_C1)  			dev->safe_state = state;  		sprintf(state->name, "C%d", count+1); +		strncpy(state->desc, cx->desc, CPUIDLE_DESC_LEN);  		count++;  	} diff --git a/arch/arm/mach-omap2/include/mach/omap4-common.h b/arch/arm/mach-omap2/include/mach/omap4-common.h index 5b0270b2893..de441c05a6a 100644 --- a/arch/arm/mach-omap2/include/mach/omap4-common.h +++ b/arch/arm/mach-omap2/include/mach/omap4-common.h @@ -17,8 +17,12 @@   * wfi used in low power code. Directly opcode is used instead   * of instruction to avoid mulit-omap build break   */ +#ifdef CONFIG_THUMB2_KERNEL +#define do_wfi() __asm__ __volatile__ ("wfi" : : : "memory") +#else  #define do_wfi()			\  		__asm__ __volatile__ (".word	0xe320f003" : : : "memory") +#endif  #ifdef CONFIG_CACHE_L2X0  extern void __iomem *l2cache_base; diff --git a/arch/arm/mach-omap2/mailbox.c b/arch/arm/mach-omap2/mailbox.c index 6e15e3d7c65..86d564a640b 100644 --- a/arch/arm/mach-omap2/mailbox.c +++ b/arch/arm/mach-omap2/mailbox.c @@ -138,10 +138,12 @@ static void omap2_mbox_disable_irq(struct omap_mbox *mbox,  		omap_mbox_type_t irq)  {  	struct omap_mbox2_priv *p = mbox->priv; -	u32 l, bit = (irq == IRQ_TX) ? p->notfull_bit : p->newmsg_bit; -	l = mbox_read_reg(p->irqdisable); -	l &= ~bit; -	mbox_write_reg(l, p->irqdisable); +	u32 bit = (irq == IRQ_TX) ? p->notfull_bit : p->newmsg_bit; + +	if (!cpu_is_omap44xx()) +		bit = mbox_read_reg(p->irqdisable) & ~bit; + +	mbox_write_reg(bit, p->irqdisable);  }  static void omap2_mbox_ack_irq(struct omap_mbox *mbox, diff --git a/arch/arm/mach-omap2/omap-headsmp.S b/arch/arm/mach-omap2/omap-headsmp.S index 6ae937a06cc..4ee6aeca885 100644 --- a/arch/arm/mach-omap2/omap-headsmp.S +++ b/arch/arm/mach-omap2/omap-headsmp.S @@ -45,5 +45,5 @@ hold:	ldr	r12,=0x103  	 * should now contain the SVC stack for this core  	 */  	b	secondary_startup -END(omap_secondary_startup) +ENDPROC(omap_secondary_startup) diff --git a/arch/arm/mach-omap2/omap44xx-smc.S b/arch/arm/mach-omap2/omap44xx-smc.S index 1980dc31a1a..e69d37d9520 100644 --- a/arch/arm/mach-omap2/omap44xx-smc.S +++ b/arch/arm/mach-omap2/omap44xx-smc.S @@ -29,7 +29,7 @@ ENTRY(omap_smc1)  	dsb  	smc	#0  	ldmfd   sp!, {r2-r12, pc} -END(omap_smc1) +ENDPROC(omap_smc1)  ENTRY(omap_modify_auxcoreboot0)  	stmfd   sp!, {r1-r12, lr} @@ -37,7 +37,7 @@ ENTRY(omap_modify_auxcoreboot0)  	dsb  	smc	#0  	ldmfd   sp!, {r1-r12, pc} -END(omap_modify_auxcoreboot0) +ENDPROC(omap_modify_auxcoreboot0)  ENTRY(omap_auxcoreboot_addr)  	stmfd   sp!, {r2-r12, lr} @@ -45,7 +45,7 @@ ENTRY(omap_auxcoreboot_addr)  	dsb  	smc	#0  	ldmfd   sp!, {r2-r12, pc} -END(omap_auxcoreboot_addr) +ENDPROC(omap_auxcoreboot_addr)  ENTRY(omap_read_auxcoreboot0)  	stmfd   sp!, {r2-r12, lr} @@ -54,4 +54,4 @@ ENTRY(omap_read_auxcoreboot0)  	smc	#0  	mov	r0, r0, lsr #9  	ldmfd   sp!, {r2-r12, pc} -END(omap_read_auxcoreboot0) +ENDPROC(omap_read_auxcoreboot0) diff --git a/arch/arm/mach-omap2/omap_twl.c b/arch/arm/mach-omap2/omap_twl.c index 00e1d2b5368..b341c36a93f 100644 --- a/arch/arm/mach-omap2/omap_twl.c +++ b/arch/arm/mach-omap2/omap_twl.c @@ -59,8 +59,15 @@  static bool is_offset_valid;  static u8 smps_offset; +/* + * Flag to ensure Smartreflex bit in TWL + * being cleared in board file is not overwritten. + */ +static bool __initdata twl_sr_enable_autoinit; +#define TWL4030_DCDC_GLOBAL_CFG        0x06  #define REG_SMPS_OFFSET         0xE0 +#define SMARTREFLEX_ENABLE     BIT(3)  static unsigned long twl4030_vsel_to_uv(const u8 vsel)  { @@ -269,6 +276,18 @@ int __init omap3_twl_init(void)  		omap3_core_volt_info.vp_vddmax = OMAP3630_VP2_VLIMITTO_VDDMAX;  	} +	/* +	 * The smartreflex bit on twl4030 specifies if the setting of voltage +	 * is done over the I2C_SR path. Since this setting is independent of +	 * the actual usage of smartreflex AVS module, we enable TWL SR bit +	 * by default irrespective of whether smartreflex AVS module is enabled +	 * on the OMAP side or not. This is because without this bit enabled, +	 * the voltage scaling through vp forceupdate/bypass mechanism of +	 * voltage scaling will not function on TWL over I2C_SR. +	 */ +	if (!twl_sr_enable_autoinit) +		omap3_twl_set_sr_bit(true); +  	voltdm = omap_voltage_domain_lookup("mpu");  	omap_voltage_register_pmic(voltdm, &omap3_mpu_volt_info); @@ -277,3 +296,44 @@ int __init omap3_twl_init(void)  	return 0;  } + +/** + * omap3_twl_set_sr_bit() - Set/Clear SR bit on TWL + * @enable: enable SR mode in twl or not + * + * If 'enable' is true, enables Smartreflex bit on TWL 4030 to make sure + * voltage scaling through OMAP SR works. Else, the smartreflex bit + * on twl4030 is cleared as there are platforms which use OMAP3 and T2 but + * use Synchronized Scaling Hardware Strategy (ENABLE_VMODE=1) and Direct + * Strategy Software Scaling Mode (ENABLE_VMODE=0), for setting the voltages, + * in those scenarios this bit is to be cleared (enable = false). + * + * Returns 0 on sucess, error is returned if I2C read/write fails. + */ +int __init omap3_twl_set_sr_bit(bool enable) +{ +	u8 temp; +	int ret; +	if (twl_sr_enable_autoinit) +		pr_warning("%s: unexpected multiple calls\n", __func__); + +	ret = twl_i2c_read_u8(TWL4030_MODULE_PM_RECEIVER, &temp, +					TWL4030_DCDC_GLOBAL_CFG); +	if (ret) +		goto err; + +	if (enable) +		temp |= SMARTREFLEX_ENABLE; +	else +		temp &= ~SMARTREFLEX_ENABLE; + +	ret = twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, temp, +				TWL4030_DCDC_GLOBAL_CFG); +	if (!ret) { +		twl_sr_enable_autoinit = true; +		return 0; +	} +err: +	pr_err("%s: Error access to TWL4030 (%d)\n", __func__, ret); +	return ret; +} diff --git a/arch/arm/mach-omap2/opp3xxx_data.c b/arch/arm/mach-omap2/opp3xxx_data.c index 0486fce8a92..fd3a1af8d51 100644 --- a/arch/arm/mach-omap2/opp3xxx_data.c +++ b/arch/arm/mach-omap2/opp3xxx_data.c @@ -21,6 +21,7 @@  #include <plat/cpu.h>  #include "omap_opp_data.h" +#include "pm.h"  static struct omap_opp_def __initdata omap34xx_opp_def_list[] = {  	/* MPU OPP1 */ @@ -88,7 +89,7 @@ static struct omap_opp_def __initdata omap36xx_opp_def_list[] = {  /**   * omap3_opp_init() - initialize omap3 opp table   */ -static int __init omap3_opp_init(void) +int __init omap3_opp_init(void)  {  	int r = -ENODEV; diff --git a/arch/arm/mach-omap2/opp4xxx_data.c b/arch/arm/mach-omap2/opp4xxx_data.c index a11fa566d8e..f0e9939a721 100644 --- a/arch/arm/mach-omap2/opp4xxx_data.c +++ b/arch/arm/mach-omap2/opp4xxx_data.c @@ -22,6 +22,7 @@  #include <plat/cpu.h>  #include "omap_opp_data.h" +#include "pm.h"  static struct omap_opp_def __initdata omap44xx_opp_def_list[] = {  	/* MPU OPP1 - OPP50 */ @@ -42,7 +43,7 @@ static struct omap_opp_def __initdata omap44xx_opp_def_list[] = {  /**   * omap4_opp_init() - initialize omap4 opp table   */ -static int __init omap4_opp_init(void) +int __init omap4_opp_init(void)  {  	int r = -ENODEV; diff --git a/arch/arm/mach-omap2/pm.c b/arch/arm/mach-omap2/pm.c index d5a102c7198..6e4eb7ff95a 100644 --- a/arch/arm/mach-omap2/pm.c +++ b/arch/arm/mach-omap2/pm.c @@ -83,7 +83,9 @@ static int _init_omap_device(char *name, struct device **new_dev)  static void omap2_init_processor_devices(void)  {  	_init_omap_device("mpu", &mpu_dev); -	_init_omap_device("iva", &iva_dev); +	if (omap3_has_iva()) +		_init_omap_device("iva", &iva_dev); +  	if (cpu_is_omap44xx()) {  		_init_omap_device("l3_main_1", &l3_dev);  		_init_omap_device("dsp", &dsp_dev); diff --git a/arch/arm/mach-omap2/pm.h b/arch/arm/mach-omap2/pm.h index 1c1b0ab5b97..f4a5f716422 100644 --- a/arch/arm/mach-omap2/pm.h +++ b/arch/arm/mach-omap2/pm.h @@ -127,6 +127,7 @@ static inline void omap_enable_smartreflex_on_init(void) {}  #ifdef CONFIG_TWL4030_CORE  extern int omap3_twl_init(void);  extern int omap4_twl_init(void); +extern int omap3_twl_set_sr_bit(bool enable);  #else  static inline int omap3_twl_init(void)  { diff --git a/arch/arm/mach-omap2/pm24xx.c b/arch/arm/mach-omap2/pm24xx.c index 97feb3ab6a6..10f8747ba57 100644 --- a/arch/arm/mach-omap2/pm24xx.c +++ b/arch/arm/mach-omap2/pm24xx.c @@ -363,9 +363,6 @@ static const struct platform_suspend_ops __initdata omap_pm_ops;  /* XXX This function should be shareable between OMAP2xxx and OMAP3 */  static int __init clkdms_setup(struct clockdomain *clkdm, void *unused)  { -	clkdm_clear_all_wkdeps(clkdm); -	clkdm_clear_all_sleepdeps(clkdm); -  	if (clkdm->flags & CLKDM_CAN_ENABLE_AUTO)  		omap2_clkdm_allow_idle(clkdm);  	else if (clkdm->flags & CLKDM_CAN_FORCE_SLEEP && @@ -411,10 +408,7 @@ static void __init prcm_setup_regs(void)  	pwrdm_set_next_pwrst(pwrdm, PWRDM_POWER_OFF);  	omap2_clkdm_sleep(gfx_clkdm); -	/* -	 * Clear clockdomain wakeup dependencies and enable -	 * hardware-supervised idle for all clkdms -	 */ +	/* Enable hardware-supervised idle for all clkdms */  	clkdm_for_each(clkdms_setup, NULL);  	clkdm_add_wkdep(mpu_clkdm, wkup_clkdm); diff --git a/arch/arm/mach-omap2/pm34xx.c b/arch/arm/mach-omap2/pm34xx.c index 2f864e4b085..1883a464aac 100644 --- a/arch/arm/mach-omap2/pm34xx.c +++ b/arch/arm/mach-omap2/pm34xx.c @@ -311,11 +311,6 @@ static irqreturn_t prcm_interrupt_handler (int irq, void *dev_id)  	return IRQ_HANDLED;  } -static void restore_control_register(u32 val) -{ -	__asm__ __volatile__ ("mcr p15, 0, %0, c1, c0, 0" : : "r" (val)); -} -  /* Function to restore the table entry that was modified for enabling MMU */  static void restore_table_entry(void)  { @@ -337,7 +332,7 @@ static void restore_table_entry(void)  	control_reg_value = __raw_readl(scratchpad_address  					+ OMAP343X_CONTROL_REG_VALUE_OFFSET);  	/* This will enable caches and prediction */ -	restore_control_register(control_reg_value); +	set_cr(control_reg_value);  }  void omap_sram_idle(void) @@ -695,21 +690,6 @@ static void __init prcm_setup_regs(void)  	u32 omap3630_grpsel_uart4_mask = cpu_is_omap3630() ?  					OMAP3630_GRPSEL_UART4_MASK : 0; - -	/* XXX Reset all wkdeps. This should be done when initializing -	 * powerdomains */ -	omap2_prm_write_mod_reg(0, OMAP3430_IVA2_MOD, PM_WKDEP); -	omap2_prm_write_mod_reg(0, MPU_MOD, PM_WKDEP); -	omap2_prm_write_mod_reg(0, OMAP3430_DSS_MOD, PM_WKDEP); -	omap2_prm_write_mod_reg(0, OMAP3430_NEON_MOD, PM_WKDEP); -	omap2_prm_write_mod_reg(0, OMAP3430_CAM_MOD, PM_WKDEP); -	omap2_prm_write_mod_reg(0, OMAP3430_PER_MOD, PM_WKDEP); -	if (omap_rev() > OMAP3430_REV_ES1_0) { -		omap2_prm_write_mod_reg(0, OMAP3430ES2_SGX_MOD, PM_WKDEP); -		omap2_prm_write_mod_reg(0, OMAP3430ES2_USBHOST_MOD, PM_WKDEP); -	} else -		omap2_prm_write_mod_reg(0, GFX_MOD, PM_WKDEP); -  	/*  	 * Enable interface clock autoidle for all modules.  	 * Note that in the long run this should be done by clockfw @@ -928,8 +908,7 @@ void omap3_pm_off_mode_enable(int enable)  				pwrst->pwrdm == core_pwrdm &&  				state == PWRDM_POWER_OFF) {  			pwrst->next_state = PWRDM_POWER_RET; -			WARN_ONCE(1, -				"%s: Core OFF disabled due to errata i583\n", +			pr_warn("%s: Core OFF disabled due to errata i583\n",  				__func__);  		} else {  			pwrst->next_state = state; diff --git a/arch/arm/mach-omap2/sleep34xx.S b/arch/arm/mach-omap2/sleep34xx.S index 98d8232808b..e60ac1f71bd 100644 --- a/arch/arm/mach-omap2/sleep34xx.S +++ b/arch/arm/mach-omap2/sleep34xx.S @@ -64,6 +64,11 @@  #define SDRC_DLLA_STATUS_V	OMAP34XX_SDRC_REGADDR(SDRC_DLLA_STATUS)  #define SDRC_DLLA_CTRL_V	OMAP34XX_SDRC_REGADDR(SDRC_DLLA_CTRL) +/* + * This file needs be built unconditionally as ARM to interoperate correctly + * with non-Thumb-2-capable firmware. + */ +	.arm  /*   * API functions @@ -82,6 +87,8 @@ ENTRY(get_restore_pointer)  	stmfd	sp!, {lr}	@ save registers on stack  	adr	r0, restore  	ldmfd	sp!, {pc}	@ restore regs and return +ENDPROC(get_restore_pointer) +	.align  ENTRY(get_restore_pointer_sz)  	.word	. - get_restore_pointer @@ -91,6 +98,8 @@ ENTRY(get_omap3630_restore_pointer)  	stmfd	sp!, {lr}	@ save registers on stack  	adr	r0, restore_3630  	ldmfd	sp!, {pc}	@ restore regs and return +ENDPROC(get_omap3630_restore_pointer) +	.align  ENTRY(get_omap3630_restore_pointer_sz)  	.word	. - get_omap3630_restore_pointer @@ -100,6 +109,8 @@ ENTRY(get_es3_restore_pointer)  	stmfd	sp!, {lr}	@ save registers on stack  	adr	r0, restore_es3  	ldmfd	sp!, {pc}	@ restore regs and return +ENDPROC(get_es3_restore_pointer) +	.align  ENTRY(get_es3_restore_pointer_sz)  	.word	. - get_es3_restore_pointer @@ -113,8 +124,10 @@ ENTRY(enable_omap3630_toggle_l2_on_restore)  	stmfd	sp!, {lr}	@ save registers on stack  	/* Setup so that we will disable and enable l2 */  	mov	r1, #0x1 -	str	r1, l2dis_3630 +	adrl	r2, l2dis_3630	@ may be too distant for plain adr +	str	r1, [r2]  	ldmfd	sp!, {pc}	@ restore regs and return +ENDPROC(enable_omap3630_toggle_l2_on_restore)  	.text  /* Function to call rom code to save secure ram context */ @@ -131,20 +144,22 @@ ENTRY(save_secure_ram_context)  	mov	r1, #0			@ set task id for ROM code in r1  	mov	r2, #4			@ set some flags in r2, r6  	mov	r6, #0xff -	mcr	p15, 0, r0, c7, c10, 4	@ data write barrier -	mcr	p15, 0, r0, c7, c10, 5	@ data memory barrier -	.word	0xE1600071		@ call SMI monitor (smi #1) +	dsb				@ data write barrier +	dmb				@ data memory barrier +	smc	#1			@ call SMI monitor (smi #1)  	nop  	nop  	nop  	nop  	ldmfd	sp!, {r1-r12, pc} +	.align  sram_phy_addr_mask:  	.word	SRAM_BASE_P  high_mask:  	.word	0xffff  api_params:  	.word	0x4, 0x0, 0x0, 0x1, 0x1 +ENDPROC(save_secure_ram_context)  ENTRY(save_secure_ram_context_sz)  	.word	. - save_secure_ram_context @@ -173,12 +188,12 @@ ENTRY(omap34xx_cpu_suspend)  	stmfd	sp!, {r0-r12, lr}	@ save registers on stack  	/* -	 * r0 contains restore pointer in sdram +	 * r0 contains CPU context save/restore pointer in sdram  	 * r1 contains information about saving context:  	 *   0 - No context lost  	 *   1 - Only L1 and logic lost -	 *   2 - Only L2 lost -	 *   3 - Both L1 and L2 lost +	 *   2 - Only L2 lost (Even L1 is retained we clean it along with L2) +	 *   3 - Both L1 and L2 lost and logic lost  	 */  	/* Directly jump to WFI is the context save is not required */ @@ -199,89 +214,74 @@ save_context_wfi:  	beq	clean_caches  l1_logic_lost: -	/* Store sp and spsr to SDRAM */ -	mov	r4, sp -	mrs	r5, spsr -	mov	r6, lr +	mov	r4, sp			@ Store sp +	mrs	r5, spsr		@ Store spsr +	mov	r6, lr			@ Store lr  	stmia	r8!, {r4-r6} -	/* Save all ARM registers */ -	/* Coprocessor access control register */ -	mrc	p15, 0, r6, c1, c0, 2 -	stmia	r8!, {r6} -	/* TTBR0, TTBR1 and Translation table base control */ -	mrc	p15, 0, r4, c2, c0, 0 -	mrc	p15, 0, r5, c2, c0, 1 -	mrc	p15, 0, r6, c2, c0, 2 -	stmia	r8!, {r4-r6} -	/* -	 * Domain access control register, data fault status register, -	 * and instruction fault status register -	 */ -	mrc	p15, 0, r4, c3, c0, 0 -	mrc	p15, 0, r5, c5, c0, 0 -	mrc	p15, 0, r6, c5, c0, 1 -	stmia	r8!, {r4-r6} -	/* -	 * Data aux fault status register, instruction aux fault status, -	 * data fault address register and instruction fault address register -	 */ -	mrc	p15, 0, r4, c5, c1, 0 -	mrc	p15, 0, r5, c5, c1, 1 -	mrc	p15, 0, r6, c6, c0, 0 -	mrc	p15, 0, r7, c6, c0, 2 -	stmia	r8!, {r4-r7} -	/* -	 * user r/w thread and process ID, user r/o thread and process ID, -	 * priv only thread and process ID, cache size selection -	 */ -	mrc	p15, 0, r4, c13, c0, 2 -	mrc	p15, 0, r5, c13, c0, 3 -	mrc	p15, 0, r6, c13, c0, 4 -	mrc	p15, 2, r7, c0, c0, 0 + +	mrc	p15, 0, r4, c1, c0, 2	@ Coprocessor access control register +	mrc	p15, 0, r5, c2, c0, 0	@ TTBR0 +	mrc	p15, 0, r6, c2, c0, 1	@ TTBR1 +	mrc	p15, 0, r7, c2, c0, 2	@ TTBCR  	stmia	r8!, {r4-r7} -	/* Data TLB lockdown, instruction TLB lockdown registers */ -	mrc	p15, 0, r5, c10, c0, 0 -	mrc	p15, 0, r6, c10, c0, 1 -	stmia	r8!, {r5-r6} -	/* Secure or non secure vector base address, FCSE PID, Context PID*/ -	mrc	p15, 0, r4, c12, c0, 0 -	mrc	p15, 0, r5, c13, c0, 0 -	mrc	p15, 0, r6, c13, c0, 1 -	stmia	r8!, {r4-r6} -	/* Primary remap, normal remap registers */ -	mrc	p15, 0, r4, c10, c2, 0 -	mrc	p15, 0, r5, c10, c2, 1 -	stmia	r8!,{r4-r5} -	/* Store current cpsr*/ -	mrs	r2, cpsr -	stmia	r8!, {r2} +	mrc	p15, 0, r4, c3, c0, 0	@ Domain access Control Register +	mrc	p15, 0, r5, c10, c2, 0	@ PRRR +	mrc	p15, 0, r6, c10, c2, 1	@ NMRR +	stmia	r8!,{r4-r6} + +	mrc	p15, 0, r4, c13, c0, 1	@ Context ID +	mrc	p15, 0, r5, c13, c0, 2	@ User r/w thread and process ID +	mrc	p15, 0, r6, c12, c0, 0	@ Secure or NS vector base address +	mrs	r7, cpsr		@ Store current cpsr +	stmia	r8!, {r4-r7} -	mrc	p15, 0, r4, c1, c0, 0 -	/* save control register */ +	mrc	p15, 0, r4, c1, c0, 0	@ save control register  	stmia	r8!, {r4}  clean_caches:  	/* -	 * Clean Data or unified cache to POU -	 * How to invalidate only L1 cache???? - #FIX_ME# -	 * mcr	p15, 0, r11, c7, c11, 1 -	 */ -	cmp	r1, #0x1 		@ Check whether L2 inval is required -	beq	omap3_do_wfi - -clean_l2: -	/*  	 * jump out to kernel flush routine  	 *  - reuse that code is better  	 *  - it executes in a cached space so is faster than refetch per-block  	 *  - should be faster and will change with kernel  	 *  - 'might' have to copy address, load and jump to it +	 * Flush all data from the L1 data cache before disabling +	 * SCTLR.C bit.  	 */  	ldr	r1, kernel_flush  	mov	lr, pc  	bx	r1 +	/* +	 * Clear the SCTLR.C bit to prevent further data cache +	 * allocation. Clearing SCTLR.C would make all the data accesses +	 * strongly ordered and would not hit the cache. +	 */ +	mrc	p15, 0, r0, c1, c0, 0 +	bic	r0, r0, #(1 << 2)	@ Disable the C bit +	mcr	p15, 0, r0, c1, c0, 0 +	isb + +	/* +	 * Invalidate L1 data cache. Even though only invalidate is +	 * necessary exported flush API is used here. Doing clean +	 * on already clean cache would be almost NOP. +	 */ +	ldr	r1, kernel_flush +	blx	r1 +	/* +	 * The kernel doesn't interwork: v7_flush_dcache_all in particluar will +	 * always return in Thumb state when CONFIG_THUMB2_KERNEL is enabled. +	 * This sequence switches back to ARM.  Note that .align may insert a +	 * nop: bx pc needs to be word-aligned in order to work. +	 */ + THUMB(	.thumb		) + THUMB(	.align		) + THUMB(	bx	pc	) + THUMB(	nop		) +	.arm +  omap3_do_wfi:  	ldr	r4, sdrc_power		@ read the SDRC_POWER register  	ldr	r5, [r4]		@ read the contents of SDRC_POWER @@ -289,9 +289,8 @@ omap3_do_wfi:  	str	r5, [r4]		@ write back to SDRC_POWER register  	/* Data memory barrier and Data sync barrier */ -	mov	r1, #0 -	mcr	p15, 0, r1, c7, c10, 4 -	mcr	p15, 0, r1, c7, c10, 5 +	dsb +	dmb  /*   * =================================== @@ -317,6 +316,12 @@ omap3_do_wfi:  	nop  	bl wait_sdrc_ok +	mrc	p15, 0, r0, c1, c0, 0 +	tst	r0, #(1 << 2)		@ Check C bit enabled? +	orreq	r0, r0, #(1 << 2)	@ Enable the C bit if cleared +	mcreq	p15, 0, r0, c1, c0, 0 +	isb +  /*   * ===================================   * == Exit point from non-OFF modes == @@ -406,9 +411,9 @@ skipl2dis:  	mov	r2, #4			@ set some flags in r2, r6  	mov	r6, #0xff  	adr	r3, l2_inv_api_params	@ r3 points to dummy parameters -	mcr	p15, 0, r0, c7, c10, 4	@ data write barrier -	mcr	p15, 0, r0, c7, c10, 5	@ data memory barrier -	.word	0xE1600071		@ call SMI monitor (smi #1) +	dsb				@ data write barrier +	dmb				@ data memory barrier +	smc	#1			@ call SMI monitor (smi #1)  	/* Write to Aux control register to set some bits */  	mov	r0, #42			@ set service ID for PPA  	mov	r12, r0			@ copy secure Service ID in r12 @@ -417,9 +422,9 @@ skipl2dis:  	mov	r6, #0xff  	ldr	r4, scratchpad_base  	ldr	r3, [r4, #0xBC]		@ r3 points to parameters -	mcr	p15, 0, r0, c7, c10, 4	@ data write barrier -	mcr	p15, 0, r0, c7, c10, 5	@ data memory barrier -	.word	0xE1600071		@ call SMI monitor (smi #1) +	dsb				@ data write barrier +	dmb				@ data memory barrier +	smc	#1			@ call SMI monitor (smi #1)  #ifdef CONFIG_OMAP3_L2_AUX_SECURE_SAVE_RESTORE  	/* Restore L2 aux control register */ @@ -432,29 +437,30 @@ skipl2dis:  	ldr	r4, scratchpad_base  	ldr	r3, [r4, #0xBC]  	adds	r3, r3, #8		@ r3 points to parameters -	mcr	p15, 0, r0, c7, c10, 4	@ data write barrier -	mcr	p15, 0, r0, c7, c10, 5	@ data memory barrier -	.word	0xE1600071		@ call SMI monitor (smi #1) +	dsb				@ data write barrier +	dmb				@ data memory barrier +	smc	#1			@ call SMI monitor (smi #1)  #endif  	b	logic_l1_restore +	.align  l2_inv_api_params:  	.word	0x1, 0x00  l2_inv_gp:  	/* Execute smi to invalidate L2 cache */  	mov r12, #0x1			@ set up to invalidate L2 -	.word 0xE1600070		@ Call SMI monitor (smieq) +	smc	#0			@ Call SMI monitor (smieq)  	/* Write to Aux control register to set some bits */  	ldr	r4, scratchpad_base  	ldr	r3, [r4,#0xBC]  	ldr	r0, [r3,#4]  	mov	r12, #0x3 -	.word	0xE1600070		@ Call SMI monitor (smieq) +	smc	#0			@ Call SMI monitor (smieq)  	ldr	r4, scratchpad_base  	ldr	r3, [r4,#0xBC]  	ldr	r0, [r3,#12]  	mov	r12, #0x2 -	.word	0xE1600070		@ Call SMI monitor (smieq) +	smc	#0			@ Call SMI monitor (smieq)  logic_l1_restore:  	ldr	r1, l2dis_3630  	cmp	r1, #0x1		@ Test if L2 re-enable needed on 3630 @@ -473,68 +479,29 @@ skipl2reen:  	ldr	r4, scratchpad_base  	ldr	r3, [r4,#0xBC]  	adds	r3, r3, #16 -	ldmia	r3!, {r4-r6} -	mov	sp, r4 -	msr	spsr_cxsf, r5 -	mov	lr, r6 - -	ldmia	r3!, {r4-r9} -	/* Coprocessor access Control Register */ -	mcr p15, 0, r4, c1, c0, 2 -	/* TTBR0 */ -	MCR p15, 0, r5, c2, c0, 0 -	/* TTBR1 */ -	MCR p15, 0, r6, c2, c0, 1 -	/* Translation table base control register */ -	MCR p15, 0, r7, c2, c0, 2 -	/* Domain access Control Register */ -	MCR p15, 0, r8, c3, c0, 0 -	/* Data fault status Register */ -	MCR p15, 0, r9, c5, c0, 0 +	ldmia	r3!, {r4-r6} +	mov	sp, r4			@ Restore sp +	msr	spsr_cxsf, r5		@ Restore spsr +	mov	lr, r6			@ Restore lr -	ldmia	r3!,{r4-r8} -	/* Instruction fault status Register */ -	MCR p15, 0, r4, c5, c0, 1 -	/* Data Auxiliary Fault Status Register */ -	MCR p15, 0, r5, c5, c1, 0 -	/* Instruction Auxiliary Fault Status Register*/ -	MCR p15, 0, r6, c5, c1, 1 -	/* Data Fault Address Register */ -	MCR p15, 0, r7, c6, c0, 0 -	/* Instruction Fault Address Register*/ -	MCR p15, 0, r8, c6, c0, 2 -	ldmia	r3!,{r4-r7} +	ldmia	r3!, {r4-r7} +	mcr	p15, 0, r4, c1, c0, 2	@ Coprocessor access Control Register +	mcr	p15, 0, r5, c2, c0, 0	@ TTBR0 +	mcr	p15, 0, r6, c2, c0, 1	@ TTBR1 +	mcr	p15, 0, r7, c2, c0, 2	@ TTBCR -	/* User r/w thread and process ID */ -	MCR p15, 0, r4, c13, c0, 2 -	/* User ro thread and process ID */ -	MCR p15, 0, r5, c13, c0, 3 -	/* Privileged only thread and process ID */ -	MCR p15, 0, r6, c13, c0, 4 -	/* Cache size selection */ -	MCR p15, 2, r7, c0, c0, 0 -	ldmia	r3!,{r4-r8} -	/* Data TLB lockdown registers */ -	MCR p15, 0, r4, c10, c0, 0 -	/* Instruction TLB lockdown registers */ -	MCR p15, 0, r5, c10, c0, 1 -	/* Secure or Nonsecure Vector Base Address */ -	MCR p15, 0, r6, c12, c0, 0 -	/* FCSE PID */ -	MCR p15, 0, r7, c13, c0, 0 -	/* Context PID */ -	MCR p15, 0, r8, c13, c0, 1 +	ldmia	r3!,{r4-r6} +	mcr	p15, 0, r4, c3, c0, 0	@ Domain access Control Register +	mcr	p15, 0, r5, c10, c2, 0	@ PRRR +	mcr	p15, 0, r6, c10, c2, 1	@ NMRR -	ldmia	r3!,{r4-r5} -	/* Primary memory remap register */ -	MCR p15, 0, r4, c10, c2, 0 -	/* Normal memory remap register */ -	MCR p15, 0, r5, c10, c2, 1 -	/* Restore cpsr */ -	ldmia	r3!,{r4}		@ load CPSR from SDRAM -	msr	cpsr, r4		@ store cpsr +	ldmia	r3!,{r4-r7} +	mcr	p15, 0, r4, c13, c0, 1	@ Context ID +	mcr	p15, 0, r5, c13, c0, 2	@ User r/w thread and process ID +	mrc	p15, 0, r6, c12, c0, 0	@ Secure or NS vector base address +	msr	cpsr, r7		@ store cpsr  	/* Enabling MMU here */  	mrc	p15, 0, r7, c2, c0, 2 	@ Read TTBRControl @@ -592,12 +559,17 @@ usettbr0:  	ldr	r2, cache_pred_disable_mask  	and	r4, r2  	mcr	p15, 0, r4, c1, c0, 0 +	dsb +	isb +	ldr     r0, =restoremmu_on +	bx      r0  /*   * ==============================   * == Exit point from OFF mode ==   * ==============================   */ +restoremmu_on:  	ldmfd	sp!, {r0-r12, pc}	@ restore regs and return @@ -607,6 +579,7 @@ usettbr0:  /* This function implements the erratum ID i443 WA, applies to 34xx >= ES3.0 */  	.text +	.align	3  ENTRY(es3_sdrc_fix)  	ldr	r4, sdrc_syscfg		@ get config addr  	ldr	r5, [r4]		@ get value @@ -634,6 +607,7 @@ ENTRY(es3_sdrc_fix)  	str	r5, [r4]		@ kick off refreshes  	bx	lr +	.align  sdrc_syscfg:  	.word	SDRC_SYSCONFIG_P  sdrc_mr_0: @@ -648,6 +622,7 @@ sdrc_emr2_1:  	.word	SDRC_EMR2_1_P  sdrc_manual_1:  	.word	SDRC_MANUAL_1_P +ENDPROC(es3_sdrc_fix)  ENTRY(es3_sdrc_fix_sz)  	.word	. - es3_sdrc_fix @@ -682,6 +657,12 @@ wait_sdrc_ready:  	bic	r5, r5, #0x40  	str	r5, [r4] +/* + * PC-relative stores lead to undefined behaviour in Thumb-2: use a r7 as a + * base instead. + * Be careful not to clobber r7 when maintaing this code. + */ +  is_dll_in_lock_mode:  	/* Is dll in lock mode? */  	ldr	r4, sdrc_dlla_ctrl @@ -689,10 +670,11 @@ is_dll_in_lock_mode:  	tst	r5, #0x4  	bxne	lr			@ Return if locked  	/* wait till dll locks */ +	adr	r7, kick_counter  wait_dll_lock_timed:  	ldr	r4, wait_dll_lock_counter  	add	r4, r4, #1 -	str	r4, wait_dll_lock_counter +	str	r4, [r7, #wait_dll_lock_counter - kick_counter]  	ldr	r4, sdrc_dlla_status  	/* Wait 20uS for lock */  	mov	r6, #8 @@ -718,9 +700,10 @@ kick_dll:  	dsb  	ldr	r4, kick_counter  	add	r4, r4, #1 -	str	r4, kick_counter +	str	r4, [r7]		@ kick_counter  	b	wait_dll_lock_timed +	.align  cm_idlest1_core:  	.word	CM_IDLEST1_CORE_V  cm_idlest_ckgen: @@ -763,6 +746,7 @@ kick_counter:  	.word	0  wait_dll_lock_counter:  	.word	0 +ENDPROC(omap34xx_cpu_suspend)  ENTRY(omap34xx_cpu_suspend_sz)  	.word	. - omap34xx_cpu_suspend diff --git a/arch/arm/mach-omap2/smartreflex.c b/arch/arm/mach-omap2/smartreflex.c index 95ac336fe3f..0ab4dd5081e 100644 --- a/arch/arm/mach-omap2/smartreflex.c +++ b/arch/arm/mach-omap2/smartreflex.c @@ -54,6 +54,7 @@ struct omap_sr {  	struct list_head		node;  	struct omap_sr_nvalue_table	*nvalue_table;  	struct voltagedomain		*voltdm; +	struct dentry			*dbg_dir;  };  /* sr_list contains all the instances of smartreflex module */ @@ -260,9 +261,11 @@ static int sr_late_init(struct omap_sr *sr_info)  	if (sr_class->class_type == SR_CLASS2 &&  		sr_class->notify_flags && sr_info->irq) { -		name = kzalloc(SMARTREFLEX_NAME_LEN + 1, GFP_KERNEL); -		strcpy(name, "sr_"); -		strcat(name, sr_info->voltdm->name); +		name = kasprintf(GFP_KERNEL, "sr_%s", sr_info->voltdm->name); +		if (name == NULL) { +			ret = -ENOMEM; +			goto error; +		}  		ret = request_irq(sr_info->irq, sr_interrupt,  				0, name, (void *)sr_info);  		if (ret) @@ -282,6 +285,7 @@ error:  		dev_err(&sr_info->pdev->dev, "%s: ERROR in registering"  			"interrupt handler. Smartreflex will"  			"not function as desired\n", __func__); +		kfree(name);  		kfree(sr_info);  		return ret;  } @@ -820,7 +824,7 @@ static int __init omap_sr_probe(struct platform_device *pdev)  	struct omap_sr *sr_info = kzalloc(sizeof(struct omap_sr), GFP_KERNEL);  	struct omap_sr_data *pdata = pdev->dev.platform_data;  	struct resource *mem, *irq; -	struct dentry *vdd_dbg_dir, *dbg_dir, *nvalue_dir; +	struct dentry *vdd_dbg_dir, *nvalue_dir;  	struct omap_volt_data *volt_data;  	int i, ret = 0; @@ -879,7 +883,7 @@ static int __init omap_sr_probe(struct platform_device *pdev)  		ret = sr_late_init(sr_info);  		if (ret) {  			pr_warning("%s: Error in SR late init\n", __func__); -			return ret; +			goto err_release_region;  		}  	} @@ -890,30 +894,34 @@ static int __init omap_sr_probe(struct platform_device *pdev)  	 * not try to create rest of the debugfs entries.  	 */  	vdd_dbg_dir = omap_voltage_get_dbgdir(sr_info->voltdm); -	if (!vdd_dbg_dir) -		return -EINVAL; +	if (!vdd_dbg_dir) { +		ret = -EINVAL; +		goto err_release_region; +	} -	dbg_dir = debugfs_create_dir("smartreflex", vdd_dbg_dir); -	if (IS_ERR(dbg_dir)) { +	sr_info->dbg_dir = debugfs_create_dir("smartreflex", vdd_dbg_dir); +	if (IS_ERR(sr_info->dbg_dir)) {  		dev_err(&pdev->dev, "%s: Unable to create debugfs directory\n",  			__func__); -		return PTR_ERR(dbg_dir); +		ret = PTR_ERR(sr_info->dbg_dir); +		goto err_release_region;  	} -	(void) debugfs_create_file("autocomp", S_IRUGO | S_IWUSR, dbg_dir, -				(void *)sr_info, &pm_sr_fops); -	(void) debugfs_create_x32("errweight", S_IRUGO, dbg_dir, +	(void) debugfs_create_file("autocomp", S_IRUGO | S_IWUSR, +			sr_info->dbg_dir, (void *)sr_info, &pm_sr_fops); +	(void) debugfs_create_x32("errweight", S_IRUGO, sr_info->dbg_dir,  			&sr_info->err_weight); -	(void) debugfs_create_x32("errmaxlimit", S_IRUGO, dbg_dir, +	(void) debugfs_create_x32("errmaxlimit", S_IRUGO, sr_info->dbg_dir,  			&sr_info->err_maxlimit); -	(void) debugfs_create_x32("errminlimit", S_IRUGO, dbg_dir, +	(void) debugfs_create_x32("errminlimit", S_IRUGO, sr_info->dbg_dir,  			&sr_info->err_minlimit); -	nvalue_dir = debugfs_create_dir("nvalue", dbg_dir); +	nvalue_dir = debugfs_create_dir("nvalue", sr_info->dbg_dir);  	if (IS_ERR(nvalue_dir)) {  		dev_err(&pdev->dev, "%s: Unable to create debugfs directory"  			"for n-values\n", __func__); -		return PTR_ERR(nvalue_dir); +		ret = PTR_ERR(nvalue_dir); +		goto err_release_region;  	}  	omap_voltage_get_volttable(sr_info->voltdm, &volt_data); @@ -922,23 +930,15 @@ static int __init omap_sr_probe(struct platform_device *pdev)  			" corresponding vdd vdd_%s. Cannot create debugfs"  			"entries for n-values\n",  			__func__, sr_info->voltdm->name); -		return -ENODATA; +		ret = -ENODATA; +		goto err_release_region;  	}  	for (i = 0; i < sr_info->nvalue_count; i++) { -		char *name; -		char volt_name[32]; - -		name = kzalloc(NVALUE_NAME_LEN + 1, GFP_KERNEL); -		if (!name) { -			dev_err(&pdev->dev, "%s: Unable to allocate memory" -				" for n-value directory name\n",  __func__); -			return -ENOMEM; -		} +		char name[NVALUE_NAME_LEN + 1]; -		strcpy(name, "volt_"); -		sprintf(volt_name, "%d", volt_data[i].volt_nominal); -		strcat(name, volt_name); +		snprintf(name, sizeof(name), "volt_%d", +			 volt_data[i].volt_nominal);  		(void) debugfs_create_x32(name, S_IRUGO | S_IWUSR, nvalue_dir,  				&(sr_info->nvalue_table[i].nvalue));  	} @@ -973,6 +973,8 @@ static int __devexit omap_sr_remove(struct platform_device *pdev)  	if (sr_info->autocomp_active)  		sr_stop_vddautocomp(sr_info); +	if (sr_info->dbg_dir) +		debugfs_remove_recursive(sr_info->dbg_dir);  	list_del(&sr_info->node);  	iounmap(sr_info->base); diff --git a/arch/arm/mach-omap2/sram34xx.S b/arch/arm/mach-omap2/sram34xx.S index 7f893a29d50..1078bfbc25c 100644 --- a/arch/arm/mach-omap2/sram34xx.S +++ b/arch/arm/mach-omap2/sram34xx.S @@ -34,6 +34,12 @@  #include "sdrc.h"  #include "cm2xxx_3xxx.h" +/* + * This file needs be built unconditionally as ARM to interoperate correctly + * with non-Thumb-2-capable firmware. + */ +	.arm +  	.text  /* r1 parameters */ @@ -116,24 +122,36 @@ ENTRY(omap3_sram_configure_core_dpll)  					@ pull the extra args off the stack  					@  and store them in SRAM + +/* + * PC-relative stores are deprecated in ARMv7 and lead to undefined behaviour + * in Thumb-2: use a r7 as a base instead. + * Be careful not to clobber r7 when maintaing this file. + */ + THUMB(	adr	r7, omap3_sram_configure_core_dpll			) +	.macro strtext Rt:req, label:req + ARM(	str	\Rt, \label						) + THUMB(	str	\Rt, [r7, \label - omap3_sram_configure_core_dpll]	) +	.endm +  	ldr	r4, [sp, #52] -	str     r4, omap_sdrc_rfr_ctrl_0_val +	strtext	r4, omap_sdrc_rfr_ctrl_0_val  	ldr	r4, [sp, #56] -	str     r4, omap_sdrc_actim_ctrl_a_0_val +	strtext	r4, omap_sdrc_actim_ctrl_a_0_val  	ldr	r4, [sp, #60] -	str     r4, omap_sdrc_actim_ctrl_b_0_val +	strtext	r4, omap_sdrc_actim_ctrl_b_0_val  	ldr	r4, [sp, #64] -	str     r4, omap_sdrc_mr_0_val +	strtext	r4, omap_sdrc_mr_0_val  	ldr	r4, [sp, #68] -	str     r4, omap_sdrc_rfr_ctrl_1_val +	strtext	r4, omap_sdrc_rfr_ctrl_1_val  	cmp	r4, #0			@ if SDRC_RFR_CTRL_1 is 0,  	beq	skip_cs1_params		@  do not use cs1 params  	ldr	r4, [sp, #72] -	str     r4, omap_sdrc_actim_ctrl_a_1_val +	strtext	r4, omap_sdrc_actim_ctrl_a_1_val  	ldr	r4, [sp, #76] -	str     r4, omap_sdrc_actim_ctrl_b_1_val +	strtext	r4, omap_sdrc_actim_ctrl_b_1_val  	ldr	r4, [sp, #80] -	str     r4, omap_sdrc_mr_1_val +	strtext	r4, omap_sdrc_mr_1_val  skip_cs1_params:  	mrc	p15, 0, r8, c1, c0, 0	@ read ctrl register  	bic	r10, r8, #0x800		@ clear Z-bit, disable branch prediction @@ -271,6 +289,7 @@ skip_cs1_prog:  	ldr	r12, [r11]		@ posted-write barrier for SDRC  	bx	lr +	.align  omap3_sdrc_power:  	.word OMAP34XX_SDRC_REGADDR(SDRC_POWER)  omap3_cm_clksel1_pll: @@ -319,6 +338,7 @@ omap3_sdrc_dlla_ctrl:  	.word OMAP34XX_SDRC_REGADDR(SDRC_DLLA_CTRL)  core_m2_mask_val:  	.word 0x07FFFFFF +ENDPROC(omap3_sram_configure_core_dpll)  ENTRY(omap3_sram_configure_core_dpll_sz)  	.word	. - omap3_sram_configure_core_dpll diff --git a/arch/arm/mach-pxa/pxa25x.c b/arch/arm/mach-pxa/pxa25x.c index fbc5b775f89..b166b1d845d 100644 --- a/arch/arm/mach-pxa/pxa25x.c +++ b/arch/arm/mach-pxa/pxa25x.c @@ -347,6 +347,7 @@ static struct platform_device *pxa25x_devices[] __initdata = {  	&pxa25x_device_assp,  	&pxa25x_device_pwm0,  	&pxa25x_device_pwm1, +	&pxa_device_asoc_platform,  };  static struct sys_device pxa25x_sysdev[] = { diff --git a/arch/arm/mach-pxa/tosa-bt.c b/arch/arm/mach-pxa/tosa-bt.c index c31e601eb49..b9b1e5c2b29 100644 --- a/arch/arm/mach-pxa/tosa-bt.c +++ b/arch/arm/mach-pxa/tosa-bt.c @@ -81,8 +81,6 @@ static int tosa_bt_probe(struct platform_device *dev)  		goto err_rfk_alloc;  	} -	rfkill_set_led_trigger_name(rfk, "tosa-bt"); -  	rc = rfkill_register(rfk);  	if (rc)  		goto err_rfkill; diff --git a/arch/arm/mach-pxa/tosa.c b/arch/arm/mach-pxa/tosa.c index af152e70cfc..f2582ec300d 100644 --- a/arch/arm/mach-pxa/tosa.c +++ b/arch/arm/mach-pxa/tosa.c @@ -875,6 +875,11 @@ static struct platform_device sharpsl_rom_device = {  	.dev.platform_data = &sharpsl_rom_data,  }; +static struct platform_device wm9712_device = { +	.name	= "wm9712-codec", +	.id	= -1, +}; +  static struct platform_device *devices[] __initdata = {  	&tosascoop_device,  	&tosascoop_jc_device, @@ -885,6 +890,7 @@ static struct platform_device *devices[] __initdata = {  	&tosaled_device,  	&tosa_bt_device,  	&sharpsl_rom_device, +	&wm9712_device,  };  static void tosa_poweroff(void) diff --git a/arch/arm/mach-s3c2440/Kconfig b/arch/arm/mach-s3c2440/Kconfig index a0cb2581894..50825a3f91c 100644 --- a/arch/arm/mach-s3c2440/Kconfig +++ b/arch/arm/mach-s3c2440/Kconfig @@ -99,6 +99,7 @@ config MACH_NEO1973_GTA02  	select POWER_SUPPLY  	select MACH_NEO1973  	select S3C2410_PWM +	select S3C_DEV_USB_HOST  	help  	   Say Y here if you are using the Openmoko GTA02 / Freerunner GSM Phone diff --git a/arch/arm/mach-s3c2440/include/mach/gta02.h b/arch/arm/mach-s3c2440/include/mach/gta02.h index 953331d8d56..3a56a229cac 100644 --- a/arch/arm/mach-s3c2440/include/mach/gta02.h +++ b/arch/arm/mach-s3c2440/include/mach/gta02.h @@ -44,19 +44,19 @@  #define GTA02v3_GPIO_nUSB_FLT	S3C2410_GPG(10)	/* v3 + v4 only */  #define GTA02v3_GPIO_nGSM_OC	S3C2410_GPG(11)	/* v3 + v4 only */ -#define GTA02_GPIO_AMP_SHUT	S3C2440_GPJ1	/* v2 + v3 + v4 only */ -#define GTA02v1_GPIO_WLAN_GPIO10	S3C2440_GPJ2 -#define GTA02_GPIO_HP_IN	S3C2440_GPJ2	/* v2 + v3 + v4 only */ -#define GTA02_GPIO_INT0		S3C2440_GPJ3	/* v2 + v3 + v4 only */ -#define GTA02_GPIO_nGSM_EN	S3C2440_GPJ4 -#define GTA02_GPIO_3D_RESET	S3C2440_GPJ5 -#define GTA02_GPIO_nDL_GSM	S3C2440_GPJ6	/* v4 + v5 only */ -#define GTA02_GPIO_WLAN_GPIO0	S3C2440_GPJ7 -#define GTA02v1_GPIO_BAT_ID	S3C2440_GPJ8 -#define GTA02_GPIO_KEEPACT	S3C2440_GPJ8 -#define GTA02v1_GPIO_HP_IN	S3C2440_GPJ10 -#define GTA02_CHIP_PWD		S3C2440_GPJ11	/* v2 + v3 + v4 only */ -#define GTA02_GPIO_nWLAN_RESET	S3C2440_GPJ12	/* v2 + v3 + v4 only */ +#define GTA02_GPIO_AMP_SHUT	S3C2410_GPJ(1)	/* v2 + v3 + v4 only */ +#define GTA02v1_GPIO_WLAN_GPIO10	S3C2410_GPJ(2) +#define GTA02_GPIO_HP_IN	S3C2410_GPJ(2)	/* v2 + v3 + v4 only */ +#define GTA02_GPIO_INT0		S3C2410_GPJ(3)	/* v2 + v3 + v4 only */ +#define GTA02_GPIO_nGSM_EN	S3C2410_GPJ(4) +#define GTA02_GPIO_3D_RESET	S3C2410_GPJ(5) +#define GTA02_GPIO_nDL_GSM	S3C2410_GPJ(6)	/* v4 + v5 only */ +#define GTA02_GPIO_WLAN_GPIO0	S3C2410_GPJ(7) +#define GTA02v1_GPIO_BAT_ID	S3C2410_GPJ(8) +#define GTA02_GPIO_KEEPACT	S3C2410_GPJ(8) +#define GTA02v1_GPIO_HP_IN	S3C2410_GPJ(10) +#define GTA02_CHIP_PWD		S3C2410_GPJ(11)	/* v2 + v3 + v4 only */ +#define GTA02_GPIO_nWLAN_RESET	S3C2410_GPJ(12)	/* v2 + v3 + v4 only */  #define GTA02_IRQ_GSENSOR_1	IRQ_EINT0  #define GTA02_IRQ_MODEM		IRQ_EINT1 diff --git a/arch/arm/mach-s3c64xx/clock.c b/arch/arm/mach-s3c64xx/clock.c index dd378206450..fdfc4d5e37a 100644 --- a/arch/arm/mach-s3c64xx/clock.c +++ b/arch/arm/mach-s3c64xx/clock.c @@ -151,6 +151,12 @@ static struct clk init_clocks_off[] = {  		.enable		= s3c64xx_pclk_ctrl,  		.ctrlbit	= S3C_CLKCON_PCLK_IIC,  	}, { +		.name		= "i2c", +		.id		= 1, +		.parent		= &clk_p, +		.enable		= s3c64xx_pclk_ctrl, +		.ctrlbit	= S3C6410_CLKCON_PCLK_I2C1, +	}, {  		.name		= "iis",  		.id		= 0,  		.parent		= &clk_p, diff --git a/arch/arm/mach-s3c64xx/dma.c b/arch/arm/mach-s3c64xx/dma.c index 135db1b4125..c35585cf8c4 100644 --- a/arch/arm/mach-s3c64xx/dma.c +++ b/arch/arm/mach-s3c64xx/dma.c @@ -690,12 +690,12 @@ static int s3c64xx_dma_init1(int chno, enum dma_ch chbase,  	regptr = regs + PL080_Cx_BASE(0); -	for (ch = 0; ch < 8; ch++, chno++, chptr++) { -		printk(KERN_INFO "%s: registering DMA %d (%p)\n", -		       __func__, chno, regptr); +	for (ch = 0; ch < 8; ch++, chptr++) { +		pr_debug("%s: registering DMA %d (%p)\n", +			 __func__, chno + ch, regptr);  		chptr->bit = 1 << ch; -		chptr->number = chno; +		chptr->number = chno + ch;  		chptr->dmac = dmac;  		chptr->regs = regptr;  		regptr += PL080_Cx_STRIDE; @@ -704,7 +704,8 @@ static int s3c64xx_dma_init1(int chno, enum dma_ch chbase,  	/* for the moment, permanently enable the controller */  	writel(PL080_CONFIG_ENABLE, regs + PL080_CONFIG); -	printk(KERN_INFO "PL080: IRQ %d, at %p\n", irq, regs); +	printk(KERN_INFO "PL080: IRQ %d, at %p, channels %d..%d\n", +	       irq, regs, chno, chno+8);  	return 0; diff --git a/arch/arm/mach-s3c64xx/gpiolib.c b/arch/arm/mach-s3c64xx/gpiolib.c index fd99a82e82c..92b09085caa 100644 --- a/arch/arm/mach-s3c64xx/gpiolib.c +++ b/arch/arm/mach-s3c64xx/gpiolib.c @@ -72,7 +72,7 @@ static struct s3c_gpio_cfg gpio_4bit_cfg_eint0011 = {  	.get_pull	= s3c_gpio_getpull_updown,  }; -int s3c64xx_gpio2int_gpm(struct gpio_chip *chip, unsigned pin) +static int s3c64xx_gpio2int_gpm(struct gpio_chip *chip, unsigned pin)  {  	return pin < 5 ? IRQ_EINT(23) + pin : -ENXIO;  } @@ -138,7 +138,7 @@ static struct s3c_gpio_chip gpio_4bit[] = {  	},  }; -int s3c64xx_gpio2int_gpl(struct gpio_chip *chip, unsigned pin) +static int s3c64xx_gpio2int_gpl(struct gpio_chip *chip, unsigned pin)  {  	return pin >= 8 ? IRQ_EINT(16) + pin - 8 : -ENXIO;  } diff --git a/arch/arm/mach-s3c64xx/mach-smdk6410.c b/arch/arm/mach-s3c64xx/mach-smdk6410.c index e85192a86fb..a80a3163dd3 100644 --- a/arch/arm/mach-s3c64xx/mach-smdk6410.c +++ b/arch/arm/mach-s3c64xx/mach-smdk6410.c @@ -28,6 +28,7 @@  #include <linux/delay.h>  #include <linux/smsc911x.h>  #include <linux/regulator/fixed.h> +#include <linux/regulator/machine.h>  #ifdef CONFIG_SMDK6410_WM1190_EV1  #include <linux/mfd/wm8350/core.h> @@ -351,7 +352,7 @@ static struct regulator_init_data smdk6410_vddpll = {  /* VDD_UH_MMC, LDO5 on J5 */  static struct regulator_init_data smdk6410_vdduh_mmc = {  	.constraints = { -		.name = "PVDD_UH/PVDD_MMC", +		.name = "PVDD_UH+PVDD_MMC",  		.always_on = 1,  	},  }; @@ -417,7 +418,7 @@ static struct regulator_init_data smdk6410_vddaudio = {  /* S3C64xx internal logic & PLL */  static struct regulator_init_data wm8350_dcdc1_data = {  	.constraints = { -		.name = "PVDD_INT/PVDD_PLL", +		.name = "PVDD_INT+PVDD_PLL",  		.min_uV = 1200000,  		.max_uV = 1200000,  		.always_on = 1, @@ -452,7 +453,7 @@ static struct regulator_consumer_supply wm8350_dcdc4_consumers[] = {  static struct regulator_init_data wm8350_dcdc4_data = {  	.constraints = { -		.name = "PVDD_HI/PVDD_EXT/PVDD_SYS/PVCCM2MTV", +		.name = "PVDD_HI+PVDD_EXT+PVDD_SYS+PVCCM2MTV",  		.min_uV = 3000000,  		.max_uV = 3000000,  		.always_on = 1, @@ -464,7 +465,7 @@ static struct regulator_init_data wm8350_dcdc4_data = {  /* OTGi/1190-EV1 HPVDD & AVDD */  static struct regulator_init_data wm8350_ldo4_data = {  	.constraints = { -		.name = "PVDD_OTGI/HPVDD/AVDD", +		.name = "PVDD_OTGI+HPVDD+AVDD",  		.min_uV = 1200000,  		.max_uV = 1200000,  		.apply_uV = 1, @@ -552,7 +553,7 @@ static struct wm831x_backlight_pdata wm1192_backlight_pdata = {  static struct regulator_init_data wm1192_dcdc3 = {  	.constraints = { -		.name = "PVDD_MEM/PVDD_GPS", +		.name = "PVDD_MEM+PVDD_GPS",  		.always_on = 1,  	},  }; @@ -563,7 +564,7 @@ static struct regulator_consumer_supply wm1192_ldo1_consumers[] = {  static struct regulator_init_data wm1192_ldo1 = {  	.constraints = { -		.name = "PVDD_LCD/PVDD_EXT", +		.name = "PVDD_LCD+PVDD_EXT",  		.always_on = 1,  	},  	.consumer_supplies = wm1192_ldo1_consumers, diff --git a/arch/arm/mach-s3c64xx/setup-keypad.c b/arch/arm/mach-s3c64xx/setup-keypad.c index f8ed0d22db7..1d4d0ee9e87 100644 --- a/arch/arm/mach-s3c64xx/setup-keypad.c +++ b/arch/arm/mach-s3c64xx/setup-keypad.c @@ -17,7 +17,7 @@  void samsung_keypad_cfg_gpio(unsigned int rows, unsigned int cols)  {  	/* Set all the necessary GPK pins to special-function 3: KP_ROW[x] */ -	s3c_gpio_cfgrange_nopull(S3C64XX_GPK(8), 8 + rows, S3C_GPIO_SFN(3)); +	s3c_gpio_cfgrange_nopull(S3C64XX_GPK(8), rows, S3C_GPIO_SFN(3));  	/* Set all the necessary GPL pins to special-function 3: KP_COL[x] */  	s3c_gpio_cfgrange_nopull(S3C64XX_GPL(0), cols, S3C_GPIO_SFN(3)); diff --git a/arch/arm/mach-s3c64xx/setup-sdhci.c b/arch/arm/mach-s3c64xx/setup-sdhci.c index 1a942037c4e..f344a222bc8 100644 --- a/arch/arm/mach-s3c64xx/setup-sdhci.c +++ b/arch/arm/mach-s3c64xx/setup-sdhci.c @@ -56,7 +56,7 @@ void s3c6400_setup_sdhci_cfg_card(struct platform_device *dev,  	else  		ctrl3 = (S3C_SDHCI_CTRL3_FCSEL1 | S3C_SDHCI_CTRL3_FCSEL0); -	printk(KERN_INFO "%s: CTRL 2=%08x, 3=%08x\n", __func__, ctrl2, ctrl3); +	pr_debug("%s: CTRL 2=%08x, 3=%08x\n", __func__, ctrl2, ctrl3);  	writel(ctrl2, r + S3C_SDHCI_CONTROL2);  	writel(ctrl3, r + S3C_SDHCI_CONTROL3);  } diff --git a/arch/arm/mach-s5p64x0/include/mach/gpio.h b/arch/arm/mach-s5p64x0/include/mach/gpio.h index 5486c8f01f1..adb5f298ead 100644 --- a/arch/arm/mach-s5p64x0/include/mach/gpio.h +++ b/arch/arm/mach-s5p64x0/include/mach/gpio.h @@ -23,7 +23,7 @@  #define S5P6440_GPIO_A_NR	(6)  #define S5P6440_GPIO_B_NR	(7)  #define S5P6440_GPIO_C_NR	(8) -#define S5P6440_GPIO_F_NR	(2) +#define S5P6440_GPIO_F_NR	(16)  #define S5P6440_GPIO_G_NR	(7)  #define S5P6440_GPIO_H_NR	(10)  #define S5P6440_GPIO_I_NR	(16) @@ -36,7 +36,7 @@  #define S5P6450_GPIO_B_NR	(7)  #define S5P6450_GPIO_C_NR	(8)  #define S5P6450_GPIO_D_NR	(8) -#define S5P6450_GPIO_F_NR	(2) +#define S5P6450_GPIO_F_NR	(16)  #define S5P6450_GPIO_G_NR	(14)  #define S5P6450_GPIO_H_NR	(10)  #define S5P6450_GPIO_I_NR	(16) diff --git a/arch/arm/mach-shmobile/board-ag5evm.c b/arch/arm/mach-shmobile/board-ag5evm.c index 2123b96b563..4303a86e6e3 100644 --- a/arch/arm/mach-shmobile/board-ag5evm.c +++ b/arch/arm/mach-shmobile/board-ag5evm.c @@ -454,6 +454,7 @@ static void __init ag5evm_init(void)  	gpio_direction_output(GPIO_PORT217, 0);  	mdelay(1);  	gpio_set_value(GPIO_PORT217, 1); +	mdelay(100);  	/* LCD backlight controller */  	gpio_request(GPIO_PORT235, NULL); /* RESET */ diff --git a/arch/arm/mach-shmobile/board-ap4evb.c b/arch/arm/mach-shmobile/board-ap4evb.c index 3cf0951caa2..81d6536552a 100644 --- a/arch/arm/mach-shmobile/board-ap4evb.c +++ b/arch/arm/mach-shmobile/board-ap4evb.c @@ -1303,7 +1303,7 @@ static void __init ap4evb_init(void)  	lcdc_info.clock_source			= LCDC_CLK_BUS;  	lcdc_info.ch[0].interface_type		= RGB18; -	lcdc_info.ch[0].clock_divider		= 2; +	lcdc_info.ch[0].clock_divider		= 3;  	lcdc_info.ch[0].flags			= 0;  	lcdc_info.ch[0].lcd_size_cfg.width	= 152;  	lcdc_info.ch[0].lcd_size_cfg.height	= 91; diff --git a/arch/arm/mach-shmobile/board-mackerel.c b/arch/arm/mach-shmobile/board-mackerel.c index fb4213a4e15..1657eac5dde 100644 --- a/arch/arm/mach-shmobile/board-mackerel.c +++ b/arch/arm/mach-shmobile/board-mackerel.c @@ -303,7 +303,7 @@ static struct sh_mobile_lcdc_info lcdc_info = {  		.lcd_cfg = mackerel_lcdc_modes,  		.num_cfg = ARRAY_SIZE(mackerel_lcdc_modes),  		.interface_type		= RGB24, -		.clock_divider		= 2, +		.clock_divider		= 3,  		.flags			= 0,  		.lcd_size_cfg.width	= 152,  		.lcd_size_cfg.height	= 91, diff --git a/arch/arm/mach-shmobile/clock-sh73a0.c b/arch/arm/mach-shmobile/clock-sh73a0.c index ddd4a1b775f..7e58904c1c8 100644 --- a/arch/arm/mach-shmobile/clock-sh73a0.c +++ b/arch/arm/mach-shmobile/clock-sh73a0.c @@ -263,7 +263,7 @@ static struct clk div6_clks[DIV6_NR] = {  };  enum { MSTP001, -	MSTP125, MSTP118, MSTP116, MSTP100, +	MSTP129, MSTP128, MSTP127, MSTP126, MSTP125, MSTP118, MSTP116, MSTP100,  	MSTP219,  	MSTP207, MSTP206, MSTP204, MSTP203, MSTP202, MSTP201, MSTP200,  	MSTP331, MSTP329, MSTP325, MSTP323, MSTP312, @@ -275,6 +275,10 @@ enum { MSTP001,  static struct clk mstp_clks[MSTP_NR] = {  	[MSTP001] = MSTP(&div4_clks[DIV4_HP], SMSTPCR0, 1, 0), /* IIC2 */ +	[MSTP129] = MSTP(&div4_clks[DIV4_B], SMSTPCR1, 29, 0), /* CEU1 */ +	[MSTP128] = MSTP(&div4_clks[DIV4_B], SMSTPCR1, 28, 0), /* CSI2-RX1 */ +	[MSTP127] = MSTP(&div4_clks[DIV4_B], SMSTPCR1, 27, 0), /* CEU0 */ +	[MSTP126] = MSTP(&div4_clks[DIV4_B], SMSTPCR1, 26, 0), /* CSI2-RX0 */  	[MSTP125] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR1, 25, 0), /* TMU0 */  	[MSTP118] = MSTP(&div4_clks[DIV4_B], SMSTPCR1, 18, 0), /* DSITX0 */  	[MSTP116] = MSTP(&div4_clks[DIV4_HP], SMSTPCR1, 16, 0), /* IIC0 */ @@ -306,6 +310,9 @@ static struct clk_lookup lookups[] = {  	CLKDEV_CON_ID("r_clk", &r_clk),  	/* DIV6 clocks */ +	CLKDEV_CON_ID("vck1_clk", &div6_clks[DIV6_VCK1]), +	CLKDEV_CON_ID("vck2_clk", &div6_clks[DIV6_VCK2]), +	CLKDEV_CON_ID("vck3_clk", &div6_clks[DIV6_VCK3]),  	CLKDEV_ICK_ID("dsit_clk", "sh-mipi-dsi.0", &div6_clks[DIV6_DSIT]),  	CLKDEV_ICK_ID("dsit_clk", "sh-mipi-dsi.1", &div6_clks[DIV6_DSIT]),  	CLKDEV_ICK_ID("dsi0p_clk", "sh-mipi-dsi.0", &div6_clks[DIV6_DSI0P]), @@ -313,11 +320,15 @@ static struct clk_lookup lookups[] = {  	/* MSTP32 clocks */  	CLKDEV_DEV_ID("i2c-sh_mobile.2", &mstp_clks[MSTP001]), /* I2C2 */ -	CLKDEV_DEV_ID("sh_mobile_lcdc_fb.0", &mstp_clks[MSTP100]), /* LCDC0 */ +	CLKDEV_DEV_ID("sh_mobile_ceu.1", &mstp_clks[MSTP129]), /* CEU1 */ +	CLKDEV_DEV_ID("sh-mobile-csi2.1", &mstp_clks[MSTP128]), /* CSI2-RX1 */ +	CLKDEV_DEV_ID("sh_mobile_ceu.0", &mstp_clks[MSTP127]), /* CEU0 */ +	CLKDEV_DEV_ID("sh-mobile-csi2.0", &mstp_clks[MSTP126]), /* CSI2-RX0 */  	CLKDEV_DEV_ID("sh_tmu.0", &mstp_clks[MSTP125]), /* TMU00 */  	CLKDEV_DEV_ID("sh_tmu.1", &mstp_clks[MSTP125]), /* TMU01 */ -	CLKDEV_DEV_ID("i2c-sh_mobile.0", &mstp_clks[MSTP116]), /* I2C0 */  	CLKDEV_DEV_ID("sh-mipi-dsi.0", &mstp_clks[MSTP118]), /* DSITX */ +	CLKDEV_DEV_ID("i2c-sh_mobile.0", &mstp_clks[MSTP116]), /* I2C0 */ +	CLKDEV_DEV_ID("sh_mobile_lcdc_fb.0", &mstp_clks[MSTP100]), /* LCDC0 */  	CLKDEV_DEV_ID("sh-sci.7", &mstp_clks[MSTP219]), /* SCIFA7 */  	CLKDEV_DEV_ID("sh-sci.5", &mstp_clks[MSTP207]), /* SCIFA5 */  	CLKDEV_DEV_ID("sh-sci.8", &mstp_clks[MSTP206]), /* SCIFB */ diff --git a/arch/arm/mach-shmobile/include/mach/head-ap4evb.txt b/arch/arm/mach-shmobile/include/mach/head-ap4evb.txt index efd3687ba19..3029aba3868 100644 --- a/arch/arm/mach-shmobile/include/mach/head-ap4evb.txt +++ b/arch/arm/mach-shmobile/include/mach/head-ap4evb.txt @@ -6,13 +6,10 @@ LIST "RWT Setting"  EW 0xE6020004, 0xA500  EW 0xE6030004, 0xA500 -DD 0x01001000, 0x01001000 -  LIST "GPIO Setting"  EB 0xE6051013, 0xA2  LIST "CPG" -ED 0xE6150080, 0x00000180  ED 0xE61500C0, 0x00000002  WAIT 1, 0xFE40009C @@ -37,6 +34,9 @@ ED 0xE615002C, 0x93000040  WAIT 1, 0xFE40009C +LIST "SUB/USBClk" +ED 0xE6150080, 0x00000180 +  LIST "BSC"  ED 0xFEC10000, 0x00E0001B @@ -53,7 +53,7 @@ ED 0xFE400048, 0x20C18505  ED 0xFE40004C, 0x00110209  ED 0xFE400010, 0x00000087 -WAIT 10, 0xFE40009C +WAIT 30, 0xFE40009C  ED 0xFE400084, 0x0000003F  EB 0xFE500000, 0x00 @@ -84,7 +84,7 @@ ED 0xE6150004, 0x80331050  WAIT 1, 0xFE40009C -ED 0xE6150354, 0x00000002 +ED 0xFE400354, 0x01AD8002  LIST "SCIF0 - Serial port for earlyprintk"  EB 0xE6053098, 0x11 diff --git a/arch/arm/mach-shmobile/include/mach/head-mackerel.txt b/arch/arm/mach-shmobile/include/mach/head-mackerel.txt index efd3687ba19..3029aba3868 100644 --- a/arch/arm/mach-shmobile/include/mach/head-mackerel.txt +++ b/arch/arm/mach-shmobile/include/mach/head-mackerel.txt @@ -6,13 +6,10 @@ LIST "RWT Setting"  EW 0xE6020004, 0xA500  EW 0xE6030004, 0xA500 -DD 0x01001000, 0x01001000 -  LIST "GPIO Setting"  EB 0xE6051013, 0xA2  LIST "CPG" -ED 0xE6150080, 0x00000180  ED 0xE61500C0, 0x00000002  WAIT 1, 0xFE40009C @@ -37,6 +34,9 @@ ED 0xE615002C, 0x93000040  WAIT 1, 0xFE40009C +LIST "SUB/USBClk" +ED 0xE6150080, 0x00000180 +  LIST "BSC"  ED 0xFEC10000, 0x00E0001B @@ -53,7 +53,7 @@ ED 0xFE400048, 0x20C18505  ED 0xFE40004C, 0x00110209  ED 0xFE400010, 0x00000087 -WAIT 10, 0xFE40009C +WAIT 30, 0xFE40009C  ED 0xFE400084, 0x0000003F  EB 0xFE500000, 0x00 @@ -84,7 +84,7 @@ ED 0xE6150004, 0x80331050  WAIT 1, 0xFE40009C -ED 0xE6150354, 0x00000002 +ED 0xFE400354, 0x01AD8002  LIST "SCIF0 - Serial port for earlyprintk"  EB 0xE6053098, 0x11 diff --git a/arch/arm/plat-omap/include/plat/common.h b/arch/arm/plat-omap/include/plat/common.h index 1dd97e7461c..5288130be96 100644 --- a/arch/arm/plat-omap/include/plat/common.h +++ b/arch/arm/plat-omap/include/plat/common.h @@ -56,10 +56,6 @@ struct omap_globals {  	unsigned long   prm;            /* Power and Reset Management */  	unsigned long   cm;             /* Clock Management */  	unsigned long   cm2; -	unsigned long	uart1_phys; -	unsigned long	uart2_phys; -	unsigned long	uart3_phys; -	unsigned long	uart4_phys;  };  void omap2_set_globals_242x(void); diff --git a/arch/arm/plat-samsung/dev-uart.c b/arch/arm/plat-samsung/dev-uart.c index 3776cd95245..5928105490f 100644 --- a/arch/arm/plat-samsung/dev-uart.c +++ b/arch/arm/plat-samsung/dev-uart.c @@ -15,6 +15,8 @@  #include <linux/kernel.h>  #include <linux/platform_device.h> +#include <plat/devs.h> +  /* uart devices */  static struct platform_device s3c24xx_uart_device0 = { diff --git a/arch/blackfin/lib/outs.S b/arch/blackfin/lib/outs.S index 250f4d4b943..06a5e674401 100644 --- a/arch/blackfin/lib/outs.S +++ b/arch/blackfin/lib/outs.S @@ -13,6 +13,8 @@  .align 2  ENTRY(_outsl) +	CC = R2 == 0; +	IF CC JUMP 1f;  	P0 = R0;	/* P0 = port */  	P1 = R1;	/* P1 = address */  	P2 = R2;	/* P2 = count */ @@ -20,10 +22,12 @@ ENTRY(_outsl)  	LSETUP( .Llong_loop_s, .Llong_loop_e) LC0 = P2;  .Llong_loop_s: R0 = [P1++];  .Llong_loop_e: [P0] = R0; -	RTS; +1:	RTS;  ENDPROC(_outsl)  ENTRY(_outsw) +	CC = R2 == 0; +	IF CC JUMP 1f;  	P0 = R0;	/* P0 = port */  	P1 = R1;	/* P1 = address */  	P2 = R2;	/* P2 = count */ @@ -31,10 +35,12 @@ ENTRY(_outsw)  	LSETUP( .Lword_loop_s, .Lword_loop_e) LC0 = P2;  .Lword_loop_s: R0 = W[P1++];  .Lword_loop_e: W[P0] = R0; -	RTS; +1:	RTS;  ENDPROC(_outsw)  ENTRY(_outsb) +	CC = R2 == 0; +	IF CC JUMP 1f;  	P0 = R0;	/* P0 = port */  	P1 = R1;	/* P1 = address */  	P2 = R2;	/* P2 = count */ @@ -42,10 +48,12 @@ ENTRY(_outsb)  	LSETUP( .Lbyte_loop_s, .Lbyte_loop_e) LC0 = P2;  .Lbyte_loop_s: R0 = B[P1++];  .Lbyte_loop_e: B[P0] = R0; -	RTS; +1:	RTS;  ENDPROC(_outsb)  ENTRY(_outsw_8) +	CC = R2 == 0; +	IF CC JUMP 1f;  	P0 = R0;	/* P0 = port */  	P1 = R1;	/* P1 = address */  	P2 = R2;	/* P2 = count */ @@ -56,5 +64,5 @@ ENTRY(_outsw_8)  		R0 = R0 << 8;  		R0 = R0 + R1;  .Lword8_loop_e: W[P0] = R0; -	RTS; +1:	RTS;  ENDPROC(_outsw_8) diff --git a/arch/blackfin/mach-common/cache.S b/arch/blackfin/mach-common/cache.S index 790c767ca95..ab4a925a443 100644 --- a/arch/blackfin/mach-common/cache.S +++ b/arch/blackfin/mach-common/cache.S @@ -58,6 +58,8 @@  1:  .ifeqs "\flushins", BROK_FLUSH_INST  	\flushins [P0++]; +	nop; +	nop;  2:	nop;  .else  2:	\flushins [P0++]; diff --git a/arch/powerpc/include/asm/machdep.h b/arch/powerpc/include/asm/machdep.h index 991d5998d6b..fe56a23e1ff 100644 --- a/arch/powerpc/include/asm/machdep.h +++ b/arch/powerpc/include/asm/machdep.h @@ -240,6 +240,12 @@ struct machdep_calls {  	 * claims to support kexec.  	 */  	int (*machine_kexec_prepare)(struct kimage *image); + +	/* Called to perform the _real_ kexec. +	 * Do NOT allocate memory or fail here. We are past the point of +	 * no return. +	 */ +	void (*machine_kexec)(struct kimage *image);  #endif /* CONFIG_KEXEC */  #ifdef CONFIG_SUSPEND diff --git a/arch/powerpc/kernel/machine_kexec.c b/arch/powerpc/kernel/machine_kexec.c index 49a170af814..a5f8672eeff 100644 --- a/arch/powerpc/kernel/machine_kexec.c +++ b/arch/powerpc/kernel/machine_kexec.c @@ -87,7 +87,10 @@ void machine_kexec(struct kimage *image)  	save_ftrace_enabled = __ftrace_enabled_save(); -	default_machine_kexec(image); +	if (ppc_md.machine_kexec) +		ppc_md.machine_kexec(image); +	else +		default_machine_kexec(image);  	__ftrace_enabled_restore(save_ftrace_enabled); diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c index 7a1d5cb7693..8303a6c65ef 100644 --- a/arch/powerpc/kernel/process.c +++ b/arch/powerpc/kernel/process.c @@ -353,6 +353,7 @@ static void switch_booke_debug_regs(struct thread_struct *new_thread)  			prime_debug_regs(new_thread);  }  #else	/* !CONFIG_PPC_ADV_DEBUG_REGS */ +#ifndef CONFIG_HAVE_HW_BREAKPOINT  static void set_debug_reg_defaults(struct thread_struct *thread)  {  	if (thread->dabr) { @@ -360,6 +361,7 @@ static void set_debug_reg_defaults(struct thread_struct *thread)  		set_dabr(0);  	}  } +#endif /* !CONFIG_HAVE_HW_BREAKPOINT */  #endif	/* CONFIG_PPC_ADV_DEBUG_REGS */  int set_dabr(unsigned long dabr) @@ -670,11 +672,11 @@ void flush_thread(void)  {  	discard_lazy_cpu_state(); -#ifdef CONFIG_HAVE_HW_BREAKPOINTS +#ifdef CONFIG_HAVE_HW_BREAKPOINT  	flush_ptrace_hw_breakpoint(current); -#else /* CONFIG_HAVE_HW_BREAKPOINTS */ +#else /* CONFIG_HAVE_HW_BREAKPOINT */  	set_debug_reg_defaults(¤t->thread); -#endif /* CONFIG_HAVE_HW_BREAKPOINTS */ +#endif /* CONFIG_HAVE_HW_BREAKPOINT */  }  void diff --git a/arch/powerpc/mm/tlb_hash64.c b/arch/powerpc/mm/tlb_hash64.c index 1ec06576f61..c14d09f614f 100644 --- a/arch/powerpc/mm/tlb_hash64.c +++ b/arch/powerpc/mm/tlb_hash64.c @@ -38,13 +38,11 @@ DEFINE_PER_CPU(struct ppc64_tlb_batch, ppc64_tlb_batch);   * neesd to be flushed. This function will either perform the flush   * immediately or will batch it up if the current CPU has an active   * batch on it. - * - * Must be called from within some kind of spinlock/non-preempt region...   */  void hpte_need_flush(struct mm_struct *mm, unsigned long addr,  		     pte_t *ptep, unsigned long pte, int huge)  { -	struct ppc64_tlb_batch *batch = &__get_cpu_var(ppc64_tlb_batch); +	struct ppc64_tlb_batch *batch = &get_cpu_var(ppc64_tlb_batch);  	unsigned long vsid, vaddr;  	unsigned int psize;  	int ssize; @@ -99,6 +97,7 @@ void hpte_need_flush(struct mm_struct *mm, unsigned long addr,  	 */  	if (!batch->active) {  		flush_hash_page(vaddr, rpte, psize, ssize, 0); +		put_cpu_var(ppc64_tlb_batch);  		return;  	} @@ -127,6 +126,7 @@ void hpte_need_flush(struct mm_struct *mm, unsigned long addr,  	batch->index = ++i;  	if (i >= PPC64_TLB_BATCH_NR)  		__flush_tlb_pending(batch); +	put_cpu_var(ppc64_tlb_batch);  }  /* diff --git a/arch/sh/include/asm/sections.h b/arch/sh/include/asm/sections.h index a78701da775..4a5350037c8 100644 --- a/arch/sh/include/asm/sections.h +++ b/arch/sh/include/asm/sections.h @@ -3,7 +3,7 @@  #include <asm-generic/sections.h> -extern void __nosave_begin, __nosave_end; +extern long __nosave_begin, __nosave_end;  extern long __machvec_start, __machvec_end;  extern char __uncached_start, __uncached_end;  extern char _ebss[]; diff --git a/arch/sh/kernel/cpu/sh4/setup-sh7750.c b/arch/sh/kernel/cpu/sh4/setup-sh7750.c index 672944f5b19..e53b4b38bd1 100644 --- a/arch/sh/kernel/cpu/sh4/setup-sh7750.c +++ b/arch/sh/kernel/cpu/sh4/setup-sh7750.c @@ -14,7 +14,7 @@  #include <linux/io.h>  #include <linux/sh_timer.h>  #include <linux/serial_sci.h> -#include <asm/machtypes.h> +#include <generated/machtypes.h>  static struct resource rtc_resources[] = {  	[0] = { @@ -255,12 +255,17 @@ static struct platform_device *sh7750_early_devices[] __initdata = {  void __init plat_early_device_setup(void)  { +	struct platform_device *dev[1]; +  	if (mach_is_rts7751r2d()) {  		scif_platform_data.scscr |= SCSCR_CKE1; -		early_platform_add_devices(&scif_device, 1); +		dev[0] = &scif_device; +		early_platform_add_devices(dev, 1);  	} else { -		early_platform_add_devices(&sci_device, 1); -		early_platform_add_devices(&scif_device, 1); +		dev[0] = &sci_device; +		early_platform_add_devices(dev, 1); +		dev[0] = &scif_device; +		early_platform_add_devices(dev, 1);  	}  	early_platform_add_devices(sh7750_early_devices, diff --git a/arch/sh/lib/delay.c b/arch/sh/lib/delay.c index faa8f86c0db..0901b2f14e1 100644 --- a/arch/sh/lib/delay.c +++ b/arch/sh/lib/delay.c @@ -10,6 +10,16 @@  void __delay(unsigned long loops)  {  	__asm__ __volatile__( +		/* +		 * ST40-300 appears to have an issue with this code, +		 * normally taking two cycles each loop, as with all +		 * other SH variants. If however the branch and the +		 * delay slot straddle an 8 byte boundary, this increases +		 * to 3 cycles. +		 * This align directive ensures this doesn't occur. +		 */ +		".balign 8\n\t" +  		"tst	%0, %0\n\t"  		"1:\t"  		"bf/s	1b\n\t" diff --git a/arch/sh/mm/cache.c b/arch/sh/mm/cache.c index 88d3dc3d30d..5a580ea0442 100644 --- a/arch/sh/mm/cache.c +++ b/arch/sh/mm/cache.c @@ -108,7 +108,8 @@ void copy_user_highpage(struct page *to, struct page *from,  		kunmap_atomic(vfrom, KM_USER0);  	} -	if (pages_do_alias((unsigned long)vto, vaddr & PAGE_MASK)) +	if (pages_do_alias((unsigned long)vto, vaddr & PAGE_MASK) || +	    (vma->vm_flags & VM_EXEC))  		__flush_purge_region(vto, PAGE_SIZE);  	kunmap_atomic(vto, KM_USER1); diff --git a/arch/x86/include/asm/msr-index.h b/arch/x86/include/asm/msr-index.h index 4d0dfa0d998..43a18c77676 100644 --- a/arch/x86/include/asm/msr-index.h +++ b/arch/x86/include/asm/msr-index.h @@ -36,6 +36,11 @@  #define MSR_IA32_PERFCTR1		0x000000c2  #define MSR_FSB_FREQ			0x000000cd +#define MSR_NHM_SNB_PKG_CST_CFG_CTL	0x000000e2 +#define NHM_C3_AUTO_DEMOTE		(1UL << 25) +#define NHM_C1_AUTO_DEMOTE		(1UL << 26) +#define ATM_LNC_C6_AUTO_DEMOTE		(1UL << 25) +  #define MSR_MTRRcap			0x000000fe  #define MSR_IA32_BBL_CR_CTL		0x00000119 diff --git a/arch/x86/kernel/cpu/cpufreq/p4-clockmod.c b/arch/x86/kernel/cpu/cpufreq/p4-clockmod.c index bd1cac747f6..52c93648e49 100644 --- a/arch/x86/kernel/cpu/cpufreq/p4-clockmod.c +++ b/arch/x86/kernel/cpu/cpufreq/p4-clockmod.c @@ -158,9 +158,9 @@ static unsigned int cpufreq_p4_get_frequency(struct cpuinfo_x86 *c)  {  	if (c->x86 == 0x06) {  		if (cpu_has(c, X86_FEATURE_EST)) -			printk(KERN_WARNING PFX "Warning: EST-capable CPU " -			       "detected. The acpi-cpufreq module offers " -			       "voltage scaling in addition of frequency " +			printk_once(KERN_WARNING PFX "Warning: EST-capable " +			       "CPU detected. The acpi-cpufreq module offers " +			       "voltage scaling in addition to frequency "  			       "scaling. You should use that instead of "  			       "p4-clockmod, if possible.\n");  		switch (c->x86_model) { diff --git a/arch/x86/kernel/cpu/cpufreq/powernow-k8.c b/arch/x86/kernel/cpu/cpufreq/powernow-k8.c index 35c7e65e59b..c567dec854f 100644 --- a/arch/x86/kernel/cpu/cpufreq/powernow-k8.c +++ b/arch/x86/kernel/cpu/cpufreq/powernow-k8.c @@ -1537,6 +1537,7 @@ static struct notifier_block cpb_nb = {  static int __cpuinit powernowk8_init(void)  {  	unsigned int i, supported_cpus = 0, cpu; +	int rv;  	for_each_online_cpu(i) {  		int rc; @@ -1555,14 +1556,14 @@ static int __cpuinit powernowk8_init(void)  		cpb_capable = true; -		register_cpu_notifier(&cpb_nb); -  		msrs = msrs_alloc();  		if (!msrs) {  			printk(KERN_ERR "%s: Error allocating msrs!\n", __func__);  			return -ENOMEM;  		} +		register_cpu_notifier(&cpb_nb); +  		rdmsr_on_cpus(cpu_online_mask, MSR_K7_HWCR, msrs);  		for_each_cpu(cpu, cpu_online_mask) { @@ -1574,7 +1575,13 @@ static int __cpuinit powernowk8_init(void)  			(cpb_enabled ? "on" : "off"));  	} -	return cpufreq_register_driver(&cpufreq_amd64_driver); +	rv = cpufreq_register_driver(&cpufreq_amd64_driver); +	if (rv < 0 && boot_cpu_has(X86_FEATURE_CPB)) { +		unregister_cpu_notifier(&cpb_nb); +		msrs_free(msrs); +		msrs = NULL; +	} +	return rv;  }  /* driver entry point for term */ diff --git a/arch/x86/platform/olpc/olpc_dt.c b/arch/x86/platform/olpc/olpc_dt.c index dab87464753..044bda5b317 100644 --- a/arch/x86/platform/olpc/olpc_dt.c +++ b/arch/x86/platform/olpc/olpc_dt.c @@ -140,8 +140,7 @@ void * __init prom_early_alloc(unsigned long size)  		 * wasted bootmem) and hand off chunks of it to callers.  		 */  		res = alloc_bootmem(chunk_size); -		if (!res) -			return NULL; +		BUG_ON(!res);  		prom_early_allocated += chunk_size;  		memset(res, 0, chunk_size);  		free_mem = chunk_size; diff --git a/block/blk-core.c b/block/blk-core.c index 2f4002f79a2..518dd423a5f 100644 --- a/block/blk-core.c +++ b/block/blk-core.c @@ -352,7 +352,7 @@ void blk_start_queue(struct request_queue *q)  	WARN_ON(!irqs_disabled());  	queue_flag_clear(QUEUE_FLAG_STOPPED, q); -	__blk_run_queue(q); +	__blk_run_queue(q, false);  }  EXPORT_SYMBOL(blk_start_queue); @@ -403,13 +403,14 @@ EXPORT_SYMBOL(blk_sync_queue);  /**   * __blk_run_queue - run a single device queue   * @q:	The queue to run + * @force_kblockd: Don't run @q->request_fn directly.  Use kblockd.   *   * Description:   *    See @blk_run_queue. This variant must be called with the queue lock   *    held and interrupts disabled.   *   */ -void __blk_run_queue(struct request_queue *q) +void __blk_run_queue(struct request_queue *q, bool force_kblockd)  {  	blk_remove_plug(q); @@ -423,7 +424,7 @@ void __blk_run_queue(struct request_queue *q)  	 * Only recurse once to avoid overrunning the stack, let the unplug  	 * handling reinvoke the handler shortly if we already got there.  	 */ -	if (!queue_flag_test_and_set(QUEUE_FLAG_REENTER, q)) { +	if (!force_kblockd && !queue_flag_test_and_set(QUEUE_FLAG_REENTER, q)) {  		q->request_fn(q);  		queue_flag_clear(QUEUE_FLAG_REENTER, q);  	} else { @@ -446,7 +447,7 @@ void blk_run_queue(struct request_queue *q)  	unsigned long flags;  	spin_lock_irqsave(q->queue_lock, flags); -	__blk_run_queue(q); +	__blk_run_queue(q, false);  	spin_unlock_irqrestore(q->queue_lock, flags);  }  EXPORT_SYMBOL(blk_run_queue); @@ -1053,7 +1054,7 @@ void blk_insert_request(struct request_queue *q, struct request *rq,  	drive_stat_acct(rq, 1);  	__elv_add_request(q, rq, where, 0); -	__blk_run_queue(q); +	__blk_run_queue(q, false);  	spin_unlock_irqrestore(q->queue_lock, flags);  }  EXPORT_SYMBOL(blk_insert_request); @@ -2610,13 +2611,6 @@ int kblockd_schedule_work(struct request_queue *q, struct work_struct *work)  }  EXPORT_SYMBOL(kblockd_schedule_work); -int kblockd_schedule_delayed_work(struct request_queue *q, -			struct delayed_work *dwork, unsigned long delay) -{ -	return queue_delayed_work(kblockd_workqueue, dwork, delay); -} -EXPORT_SYMBOL(kblockd_schedule_delayed_work); -  int __init blk_dev_init(void)  {  	BUILD_BUG_ON(__REQ_NR_BITS > 8 * diff --git a/block/blk-flush.c b/block/blk-flush.c index 54b123d6563..b27d0208611 100644 --- a/block/blk-flush.c +++ b/block/blk-flush.c @@ -66,10 +66,12 @@ static void blk_flush_complete_seq_end_io(struct request_queue *q,  	/*  	 * Moving a request silently to empty queue_head may stall the -	 * queue.  Kick the queue in those cases. +	 * queue.  Kick the queue in those cases.  This function is called +	 * from request completion path and calling directly into +	 * request_fn may confuse the driver.  Always use kblockd.  	 */  	if (was_empty && next_rq) -		__blk_run_queue(q); +		__blk_run_queue(q, true);  }  static void pre_flush_end_io(struct request *rq, int error) @@ -130,7 +132,7 @@ static struct request *queue_next_fseq(struct request_queue *q)  		BUG();  	} -	elv_insert(q, rq, ELEVATOR_INSERT_FRONT); +	elv_insert(q, rq, ELEVATOR_INSERT_REQUEUE);  	return rq;  } diff --git a/block/blk-lib.c b/block/blk-lib.c index 1a320d2406b..eec78becb35 100644 --- a/block/blk-lib.c +++ b/block/blk-lib.c @@ -132,7 +132,7 @@ static void bio_batch_end_io(struct bio *bio, int err)  }  /** - * blkdev_issue_zeroout generate number of zero filed write bios + * blkdev_issue_zeroout - generate number of zero filed write bios   * @bdev:	blockdev to issue   * @sector:	start sector   * @nr_sects:	number of sectors to write diff --git a/block/blk-throttle.c b/block/blk-throttle.c index a89043a3caa..e36cc10a346 100644 --- a/block/blk-throttle.c +++ b/block/blk-throttle.c @@ -20,6 +20,11 @@ static int throtl_quantum = 32;  /* Throttling is performed over 100ms slice and after that slice is renewed */  static unsigned long throtl_slice = HZ/10;	/* 100 ms */ +/* A workqueue to queue throttle related work */ +static struct workqueue_struct *kthrotld_workqueue; +static void throtl_schedule_delayed_work(struct throtl_data *td, +				unsigned long delay); +  struct throtl_rb_root {  	struct rb_root rb;  	struct rb_node *left; @@ -345,10 +350,9 @@ static void throtl_schedule_next_dispatch(struct throtl_data *td)  	update_min_dispatch_time(st);  	if (time_before_eq(st->min_disptime, jiffies)) -		throtl_schedule_delayed_work(td->queue, 0); +		throtl_schedule_delayed_work(td, 0);  	else -		throtl_schedule_delayed_work(td->queue, -				(st->min_disptime - jiffies)); +		throtl_schedule_delayed_work(td, (st->min_disptime - jiffies));  }  static inline void @@ -815,10 +819,10 @@ void blk_throtl_work(struct work_struct *work)  }  /* Call with queue lock held */ -void throtl_schedule_delayed_work(struct request_queue *q, unsigned long delay) +static void +throtl_schedule_delayed_work(struct throtl_data *td, unsigned long delay)  { -	struct throtl_data *td = q->td;  	struct delayed_work *dwork = &td->throtl_work;  	if (total_nr_queued(td) > 0) { @@ -827,12 +831,11 @@ void throtl_schedule_delayed_work(struct request_queue *q, unsigned long delay)  		 * Cancel that and schedule a new one.  		 */  		__cancel_delayed_work(dwork); -		kblockd_schedule_delayed_work(q, dwork, delay); +		queue_delayed_work(kthrotld_workqueue, dwork, delay);  		throtl_log(td, "schedule work. delay=%lu jiffies=%lu",  				delay, jiffies);  	}  } -EXPORT_SYMBOL(throtl_schedule_delayed_work);  static void  throtl_destroy_tg(struct throtl_data *td, struct throtl_grp *tg) @@ -920,7 +923,7 @@ static void throtl_update_blkio_group_read_bps(void *key,  	smp_mb__after_atomic_inc();  	/* Schedule a work now to process the limit change */ -	throtl_schedule_delayed_work(td->queue, 0); +	throtl_schedule_delayed_work(td, 0);  }  static void throtl_update_blkio_group_write_bps(void *key, @@ -934,7 +937,7 @@ static void throtl_update_blkio_group_write_bps(void *key,  	smp_mb__before_atomic_inc();  	atomic_inc(&td->limits_changed);  	smp_mb__after_atomic_inc(); -	throtl_schedule_delayed_work(td->queue, 0); +	throtl_schedule_delayed_work(td, 0);  }  static void throtl_update_blkio_group_read_iops(void *key, @@ -948,7 +951,7 @@ static void throtl_update_blkio_group_read_iops(void *key,  	smp_mb__before_atomic_inc();  	atomic_inc(&td->limits_changed);  	smp_mb__after_atomic_inc(); -	throtl_schedule_delayed_work(td->queue, 0); +	throtl_schedule_delayed_work(td, 0);  }  static void throtl_update_blkio_group_write_iops(void *key, @@ -962,7 +965,7 @@ static void throtl_update_blkio_group_write_iops(void *key,  	smp_mb__before_atomic_inc();  	atomic_inc(&td->limits_changed);  	smp_mb__after_atomic_inc(); -	throtl_schedule_delayed_work(td->queue, 0); +	throtl_schedule_delayed_work(td, 0);  }  void throtl_shutdown_timer_wq(struct request_queue *q) @@ -1135,6 +1138,10 @@ void blk_throtl_exit(struct request_queue *q)  static int __init throtl_init(void)  { +	kthrotld_workqueue = alloc_workqueue("kthrotld", WQ_MEM_RECLAIM, 0); +	if (!kthrotld_workqueue) +		panic("Failed to create kthrotld\n"); +  	blkio_policy_register(&blkio_policy_throtl);  	return 0;  } diff --git a/block/cfq-iosched.c b/block/cfq-iosched.c index 7be4c795962..ea83a4f0c27 100644 --- a/block/cfq-iosched.c +++ b/block/cfq-iosched.c @@ -3355,7 +3355,7 @@ cfq_rq_enqueued(struct cfq_data *cfqd, struct cfq_queue *cfqq,  			    cfqd->busy_queues > 1) {  				cfq_del_timer(cfqd, cfqq);  				cfq_clear_cfqq_wait_request(cfqq); -				__blk_run_queue(cfqd->queue); +				__blk_run_queue(cfqd->queue, false);  			} else {  				cfq_blkiocg_update_idle_time_stats(  						&cfqq->cfqg->blkg); @@ -3370,7 +3370,7 @@ cfq_rq_enqueued(struct cfq_data *cfqd, struct cfq_queue *cfqq,  		 * this new queue is RT and the current one is BE  		 */  		cfq_preempt_queue(cfqd, cfqq); -		__blk_run_queue(cfqd->queue); +		__blk_run_queue(cfqd->queue, false);  	}  } @@ -3731,7 +3731,7 @@ static void cfq_kick_queue(struct work_struct *work)  	struct request_queue *q = cfqd->queue;  	spin_lock_irq(q->queue_lock); -	__blk_run_queue(cfqd->queue); +	__blk_run_queue(cfqd->queue, false);  	spin_unlock_irq(q->queue_lock);  } diff --git a/block/elevator.c b/block/elevator.c index 2569512830d..236e93c1f46 100644 --- a/block/elevator.c +++ b/block/elevator.c @@ -602,7 +602,7 @@ void elv_quiesce_start(struct request_queue *q)  	 */  	elv_drain_elevator(q);  	while (q->rq.elvpriv) { -		__blk_run_queue(q); +		__blk_run_queue(q, false);  		spin_unlock_irq(q->queue_lock);  		msleep(10);  		spin_lock_irq(q->queue_lock); @@ -651,7 +651,7 @@ void elv_insert(struct request_queue *q, struct request *rq, int where)  		 *   with anything.  There's no point in delaying queue  		 *   processing.  		 */ -		__blk_run_queue(q); +		__blk_run_queue(q, false);  		break;  	case ELEVATOR_INSERT_SORT: diff --git a/drivers/acpi/acpica/aclocal.h b/drivers/acpi/acpica/aclocal.h index 54784bb42ce..edc25867ad9 100644 --- a/drivers/acpi/acpica/aclocal.h +++ b/drivers/acpi/acpica/aclocal.h @@ -416,10 +416,15 @@ struct acpi_gpe_handler_info {  	u8 originally_enabled;  /* True if GPE was originally enabled */  }; +struct acpi_gpe_notify_object { +	struct acpi_namespace_node *node; +	struct acpi_gpe_notify_object *next; +}; +  union acpi_gpe_dispatch_info {  	struct acpi_namespace_node *method_node;	/* Method node for this GPE level */  	struct acpi_gpe_handler_info *handler;  /* Installed GPE handler */ -	struct acpi_namespace_node *device_node;        /* Parent _PRW device for implicit notify */ +	struct acpi_gpe_notify_object device;   /* List of _PRW devices for implicit notify */  };  /* diff --git a/drivers/acpi/acpica/evgpe.c b/drivers/acpi/acpica/evgpe.c index 14988a86066..f4725212eb4 100644 --- a/drivers/acpi/acpica/evgpe.c +++ b/drivers/acpi/acpica/evgpe.c @@ -457,6 +457,7 @@ static void ACPI_SYSTEM_XFACE acpi_ev_asynch_execute_gpe_method(void *context)  	acpi_status status;  	struct acpi_gpe_event_info *local_gpe_event_info;  	struct acpi_evaluate_info *info; +	struct acpi_gpe_notify_object *notify_object;  	ACPI_FUNCTION_TRACE(ev_asynch_execute_gpe_method); @@ -508,10 +509,18 @@ static void ACPI_SYSTEM_XFACE acpi_ev_asynch_execute_gpe_method(void *context)  		 * from this thread -- because handlers may in turn run other  		 * control methods.  		 */ -		status = -		    acpi_ev_queue_notify_request(local_gpe_event_info->dispatch. -						 device_node, -						 ACPI_NOTIFY_DEVICE_WAKE); +		status = acpi_ev_queue_notify_request( +				local_gpe_event_info->dispatch.device.node, +				ACPI_NOTIFY_DEVICE_WAKE); + +		notify_object = local_gpe_event_info->dispatch.device.next; +		while (ACPI_SUCCESS(status) && notify_object) { +			status = acpi_ev_queue_notify_request( +					notify_object->node, +					ACPI_NOTIFY_DEVICE_WAKE); +			notify_object = notify_object->next; +		} +  		break;  	case ACPI_GPE_DISPATCH_METHOD: diff --git a/drivers/acpi/acpica/evxfgpe.c b/drivers/acpi/acpica/evxfgpe.c index 3b20a3401b6..52aaff3df56 100644 --- a/drivers/acpi/acpica/evxfgpe.c +++ b/drivers/acpi/acpica/evxfgpe.c @@ -198,7 +198,9 @@ acpi_setup_gpe_for_wake(acpi_handle wake_device,  	acpi_status status = AE_BAD_PARAMETER;  	struct acpi_gpe_event_info *gpe_event_info;  	struct acpi_namespace_node *device_node; +	struct acpi_gpe_notify_object *notify_object;  	acpi_cpu_flags flags; +	u8 gpe_dispatch_mask;  	ACPI_FUNCTION_TRACE(acpi_setup_gpe_for_wake); @@ -221,27 +223,49 @@ acpi_setup_gpe_for_wake(acpi_handle wake_device,  		goto unlock_and_exit;  	} +	if (wake_device == ACPI_ROOT_OBJECT) { +		goto out; +	} +  	/*  	 * If there is no method or handler for this GPE, then the  	 * wake_device will be notified whenever this GPE fires (aka  	 * "implicit notify") Note: The GPE is assumed to be  	 * level-triggered (for windows compatibility).  	 */ -	if (((gpe_event_info->flags & ACPI_GPE_DISPATCH_MASK) == -	      ACPI_GPE_DISPATCH_NONE) && (wake_device != ACPI_ROOT_OBJECT)) { +	gpe_dispatch_mask = gpe_event_info->flags & ACPI_GPE_DISPATCH_MASK; +	if (gpe_dispatch_mask != ACPI_GPE_DISPATCH_NONE +	    && gpe_dispatch_mask != ACPI_GPE_DISPATCH_NOTIFY) { +		goto out; +	} -		/* Validate wake_device is of type Device */ +	/* Validate wake_device is of type Device */ -		device_node = ACPI_CAST_PTR(struct acpi_namespace_node, -					    wake_device); -		if (device_node->type != ACPI_TYPE_DEVICE) { -			goto unlock_and_exit; -		} +	device_node = ACPI_CAST_PTR(struct acpi_namespace_node, wake_device); +	if (device_node->type != ACPI_TYPE_DEVICE) { +		goto unlock_and_exit; +	} + +	if (gpe_dispatch_mask == ACPI_GPE_DISPATCH_NONE) {  		gpe_event_info->flags = (ACPI_GPE_DISPATCH_NOTIFY |  					 ACPI_GPE_LEVEL_TRIGGERED); -		gpe_event_info->dispatch.device_node = device_node; +		gpe_event_info->dispatch.device.node = device_node; +		gpe_event_info->dispatch.device.next = NULL; +	} else { +		/* There are multiple devices to notify implicitly. */ + +		notify_object = ACPI_ALLOCATE_ZEROED(sizeof(*notify_object)); +		if (!notify_object) { +			status = AE_NO_MEMORY; +			goto unlock_and_exit; +		} + +		notify_object->node = device_node; +		notify_object->next = gpe_event_info->dispatch.device.next; +		gpe_event_info->dispatch.device.next = notify_object;  	} + out:  	gpe_event_info->flags |= ACPI_GPE_CAN_WAKE;  	status = AE_OK; diff --git a/drivers/acpi/debugfs.c b/drivers/acpi/debugfs.c index 5df67f1d6c6..384f7abcff7 100644 --- a/drivers/acpi/debugfs.c +++ b/drivers/acpi/debugfs.c @@ -26,7 +26,9 @@ static ssize_t cm_write(struct file *file, const char __user * user_buf,  			size_t count, loff_t *ppos)  {  	static char *buf; -	static int uncopied_bytes; +	static u32 max_size; +	static u32 uncopied_bytes; +  	struct acpi_table_header table;  	acpi_status status; @@ -37,19 +39,24 @@ static ssize_t cm_write(struct file *file, const char __user * user_buf,  		if (copy_from_user(&table, user_buf,  				   sizeof(struct acpi_table_header)))  			return -EFAULT; -		uncopied_bytes = table.length; -		buf = kzalloc(uncopied_bytes, GFP_KERNEL); +		uncopied_bytes = max_size = table.length; +		buf = kzalloc(max_size, GFP_KERNEL);  		if (!buf)  			return -ENOMEM;  	} -	if (uncopied_bytes < count) { -		kfree(buf); +	if (buf == NULL) +		return -EINVAL; + +	if ((*ppos > max_size) || +	    (*ppos + count > max_size) || +	    (*ppos + count < count) || +	    (count > uncopied_bytes))  		return -EINVAL; -	}  	if (copy_from_user(buf + (*ppos), user_buf, count)) {  		kfree(buf); +		buf = NULL;  		return -EFAULT;  	} @@ -59,6 +66,7 @@ static ssize_t cm_write(struct file *file, const char __user * user_buf,  	if (!uncopied_bytes) {  		status = acpi_install_method(buf);  		kfree(buf); +		buf = NULL;  		if (ACPI_FAILURE(status))  			return -EINVAL;  		add_taint(TAINT_OVERRIDDEN_ACPI_TABLE); diff --git a/drivers/block/loop.c b/drivers/block/loop.c index 49e6a545eb6..dbf31ec9114 100644 --- a/drivers/block/loop.c +++ b/drivers/block/loop.c @@ -78,7 +78,6 @@  #include <asm/uaccess.h> -static DEFINE_MUTEX(loop_mutex);  static LIST_HEAD(loop_devices);  static DEFINE_MUTEX(loop_devices_mutex); @@ -1501,11 +1500,9 @@ static int lo_open(struct block_device *bdev, fmode_t mode)  {  	struct loop_device *lo = bdev->bd_disk->private_data; -	mutex_lock(&loop_mutex);  	mutex_lock(&lo->lo_ctl_mutex);  	lo->lo_refcnt++;  	mutex_unlock(&lo->lo_ctl_mutex); -	mutex_unlock(&loop_mutex);  	return 0;  } @@ -1515,7 +1512,6 @@ static int lo_release(struct gendisk *disk, fmode_t mode)  	struct loop_device *lo = disk->private_data;  	int err; -	mutex_lock(&loop_mutex);  	mutex_lock(&lo->lo_ctl_mutex);  	if (--lo->lo_refcnt) @@ -1540,7 +1536,6 @@ static int lo_release(struct gendisk *disk, fmode_t mode)  out:  	mutex_unlock(&lo->lo_ctl_mutex);  out_unlocked: -	mutex_unlock(&loop_mutex);  	return 0;  } diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c index 49039318633..84b164d1eb2 100644 --- a/drivers/char/virtio_console.c +++ b/drivers/char/virtio_console.c @@ -388,6 +388,10 @@ static void discard_port_data(struct port *port)  	unsigned int len;  	int ret; +	if (!port->portdev) { +		/* Device has been unplugged.  vqs are already gone. */ +		return; +	}  	vq = port->in_vq;  	if (port->inbuf)  		buf = port->inbuf; @@ -470,6 +474,10 @@ static void reclaim_consumed_buffers(struct port *port)  	void *buf;  	unsigned int len; +	if (!port->portdev) { +		/* Device has been unplugged.  vqs are already gone. */ +		return; +	}  	while ((buf = virtqueue_get_buf(port->out_vq, &len))) {  		kfree(buf);  		port->outvq_full = false; diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c index 1109f6848a4..5cb4d09919d 100644 --- a/drivers/cpufreq/cpufreq.c +++ b/drivers/cpufreq/cpufreq.c @@ -1919,8 +1919,10 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data)  	ret = sysdev_driver_register(&cpu_sysdev_class,  					&cpufreq_sysdev_driver); +	if (ret) +		goto err_null_driver; -	if ((!ret) && !(cpufreq_driver->flags & CPUFREQ_STICKY)) { +	if (!(cpufreq_driver->flags & CPUFREQ_STICKY)) {  		int i;  		ret = -ENODEV; @@ -1935,21 +1937,22 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data)  		if (ret) {  			dprintk("no CPU initialized for driver %s\n",  							driver_data->name); -			sysdev_driver_unregister(&cpu_sysdev_class, -						&cpufreq_sysdev_driver); - -			spin_lock_irqsave(&cpufreq_driver_lock, flags); -			cpufreq_driver = NULL; -			spin_unlock_irqrestore(&cpufreq_driver_lock, flags); +			goto err_sysdev_unreg;  		}  	} -	if (!ret) { -		register_hotcpu_notifier(&cpufreq_cpu_notifier); -		dprintk("driver %s up and running\n", driver_data->name); -		cpufreq_debug_enable_ratelimit(); -	} +	register_hotcpu_notifier(&cpufreq_cpu_notifier); +	dprintk("driver %s up and running\n", driver_data->name); +	cpufreq_debug_enable_ratelimit(); +	return 0; +err_sysdev_unreg: +	sysdev_driver_unregister(&cpu_sysdev_class, +			&cpufreq_sysdev_driver); +err_null_driver: +	spin_lock_irqsave(&cpufreq_driver_lock, flags); +	cpufreq_driver = NULL; +	spin_unlock_irqrestore(&cpufreq_driver_lock, flags);  	return ret;  }  EXPORT_SYMBOL_GPL(cpufreq_register_driver); diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c index 6977a1ce9d9..f73ef4390db 100644 --- a/drivers/gpu/drm/drm_fb_helper.c +++ b/drivers/gpu/drm/drm_fb_helper.c @@ -672,7 +672,7 @@ int drm_fb_helper_setcmap(struct fb_cmap *cmap, struct fb_info *info)  	struct drm_crtc_helper_funcs *crtc_funcs;  	u16 *red, *green, *blue, *transp;  	struct drm_crtc *crtc; -	int i, rc = 0; +	int i, j, rc = 0;  	int start;  	for (i = 0; i < fb_helper->crtc_count; i++) { @@ -685,7 +685,7 @@ int drm_fb_helper_setcmap(struct fb_cmap *cmap, struct fb_info *info)  		transp = cmap->transp;  		start = cmap->start; -		for (i = 0; i < cmap->len; i++) { +		for (j = 0; j < cmap->len; j++) {  			u16 hred, hgreen, hblue, htransp = 0xffff;  			hred = *red++; diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c index 3601466c550..4ff9b6cc973 100644 --- a/drivers/gpu/drm/i915/i915_debugfs.c +++ b/drivers/gpu/drm/i915/i915_debugfs.c @@ -865,7 +865,7 @@ static int i915_cur_delayinfo(struct seq_file *m, void *unused)  		int max_freq;  		/* RPSTAT1 is in the GT power well */ -		__gen6_force_wake_get(dev_priv); +		__gen6_gt_force_wake_get(dev_priv);  		seq_printf(m, "GT_PERF_STATUS: 0x%08x\n", gt_perf_status);  		seq_printf(m, "RPSTAT1: 0x%08x\n", I915_READ(GEN6_RPSTAT1)); @@ -888,7 +888,7 @@ static int i915_cur_delayinfo(struct seq_file *m, void *unused)  		seq_printf(m, "Max non-overclocked (RP0) frequency: %dMHz\n",  			   max_freq * 100); -		__gen6_force_wake_put(dev_priv); +		__gen6_gt_force_wake_put(dev_priv);  	} else {  		seq_printf(m, "no P-state info available\n");  	} diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c index 17bd766f208..e33d9be7df3 100644 --- a/drivers/gpu/drm/i915/i915_dma.c +++ b/drivers/gpu/drm/i915/i915_dma.c @@ -1895,6 +1895,17 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags)  	if (IS_GEN2(dev))  		dma_set_coherent_mask(&dev->pdev->dev, DMA_BIT_MASK(30)); +	/* 965GM sometimes incorrectly writes to hardware status page (HWS) +	 * using 32bit addressing, overwriting memory if HWS is located +	 * above 4GB. +	 * +	 * The documentation also mentions an issue with undefined +	 * behaviour if any general state is accessed within a page above 4GB, +	 * which also needs to be handled carefully. +	 */ +	if (IS_BROADWATER(dev) || IS_CRESTLINE(dev)) +		dma_set_coherent_mask(&dev->pdev->dev, DMA_BIT_MASK(32)); +  	mmio_bar = IS_GEN2(dev) ? 1 : 0;  	dev_priv->regs = pci_iomap(dev->pdev, mmio_bar, 0);  	if (!dev_priv->regs) { diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c index 0ad533f06af..22ec066adae 100644 --- a/drivers/gpu/drm/i915/i915_drv.c +++ b/drivers/gpu/drm/i915/i915_drv.c @@ -46,6 +46,9 @@ module_param_named(fbpercrtc, i915_fbpercrtc, int, 0400);  unsigned int i915_powersave = 1;  module_param_named(powersave, i915_powersave, int, 0600); +unsigned int i915_semaphores = 0; +module_param_named(semaphores, i915_semaphores, int, 0600); +  unsigned int i915_enable_rc6 = 0;  module_param_named(i915_enable_rc6, i915_enable_rc6, int, 0600); @@ -254,7 +257,7 @@ void intel_detect_pch (struct drm_device *dev)  	}  } -void __gen6_force_wake_get(struct drm_i915_private *dev_priv) +void __gen6_gt_force_wake_get(struct drm_i915_private *dev_priv)  {  	int count; @@ -270,12 +273,22 @@ void __gen6_force_wake_get(struct drm_i915_private *dev_priv)  		udelay(10);  } -void __gen6_force_wake_put(struct drm_i915_private *dev_priv) +void __gen6_gt_force_wake_put(struct drm_i915_private *dev_priv)  {  	I915_WRITE_NOTRACE(FORCEWAKE, 0);  	POSTING_READ(FORCEWAKE);  } +void __gen6_gt_wait_for_fifo(struct drm_i915_private *dev_priv) +{ +	int loop = 500; +	u32 fifo = I915_READ_NOTRACE(GT_FIFO_FREE_ENTRIES); +	while (fifo < 20 && loop--) { +		udelay(10); +		fifo = I915_READ_NOTRACE(GT_FIFO_FREE_ENTRIES); +	} +} +  static int i915_drm_freeze(struct drm_device *dev)  {  	struct drm_i915_private *dev_priv = dev->dev_private; diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 65dfe81d003..456f4048483 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h @@ -956,6 +956,7 @@ extern struct drm_ioctl_desc i915_ioctls[];  extern int i915_max_ioctl;  extern unsigned int i915_fbpercrtc;  extern unsigned int i915_powersave; +extern unsigned int i915_semaphores;  extern unsigned int i915_lvds_downclock;  extern unsigned int i915_panel_use_ssc;  extern unsigned int i915_enable_rc6; @@ -1177,6 +1178,9 @@ void i915_gem_detach_phys_object(struct drm_device *dev,  void i915_gem_free_all_phys_object(struct drm_device *dev);  void i915_gem_release(struct drm_device *dev, struct drm_file *file); +uint32_t +i915_gem_get_unfenced_gtt_alignment(struct drm_i915_gem_object *obj); +  /* i915_gem_gtt.c */  void i915_gem_restore_gtt_mappings(struct drm_device *dev);  int __must_check i915_gem_gtt_bind_object(struct drm_i915_gem_object *obj); @@ -1353,22 +1357,32 @@ __i915_write(64, q)   * must be set to prevent GT core from power down and stale values being   * returned.   */ -void __gen6_force_wake_get(struct drm_i915_private *dev_priv); -void __gen6_force_wake_put (struct drm_i915_private *dev_priv); -static inline u32 i915_safe_read(struct drm_i915_private *dev_priv, u32 reg) +void __gen6_gt_force_wake_get(struct drm_i915_private *dev_priv); +void __gen6_gt_force_wake_put(struct drm_i915_private *dev_priv); +void __gen6_gt_wait_for_fifo(struct drm_i915_private *dev_priv); + +static inline u32 i915_gt_read(struct drm_i915_private *dev_priv, u32 reg)  {  	u32 val;  	if (dev_priv->info->gen >= 6) { -		__gen6_force_wake_get(dev_priv); +		__gen6_gt_force_wake_get(dev_priv);  		val = I915_READ(reg); -		__gen6_force_wake_put(dev_priv); +		__gen6_gt_force_wake_put(dev_priv);  	} else  		val = I915_READ(reg);  	return val;  } +static inline void i915_gt_write(struct drm_i915_private *dev_priv, +				u32 reg, u32 val) +{ +	if (dev_priv->info->gen >= 6) +		__gen6_gt_wait_for_fifo(dev_priv); +	I915_WRITE(reg, val); +} +  static inline void  i915_write(struct drm_i915_private *dev_priv, u32 reg, u64 val, int len)  { diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index cf4f74c7c6f..36e66cc5225 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c @@ -1398,7 +1398,7 @@ i915_gem_get_gtt_alignment(struct drm_i915_gem_object *obj)   * Return the required GTT alignment for an object, only taking into account   * unfenced tiled surface requirements.   */ -static uint32_t +uint32_t  i915_gem_get_unfenced_gtt_alignment(struct drm_i915_gem_object *obj)  {  	struct drm_device *dev = obj->base.dev; diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c index d2f445e825f..50ab1614571 100644 --- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c +++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c @@ -772,8 +772,8 @@ i915_gem_execbuffer_sync_rings(struct drm_i915_gem_object *obj,  	if (from == NULL || to == from)  		return 0; -	/* XXX gpu semaphores are currently causing hard hangs on SNB mobile */ -	if (INTEL_INFO(obj->base.dev)->gen < 6 || IS_MOBILE(obj->base.dev)) +	/* XXX gpu semaphores are implicated in various hard hangs on SNB */ +	if (INTEL_INFO(obj->base.dev)->gen < 6 || !i915_semaphores)  		return i915_gem_object_wait_rendering(obj, true);  	idx = intel_ring_sync_index(from, to); diff --git a/drivers/gpu/drm/i915/i915_gem_tiling.c b/drivers/gpu/drm/i915/i915_gem_tiling.c index 79a04fde69b..d64843e18df 100644 --- a/drivers/gpu/drm/i915/i915_gem_tiling.c +++ b/drivers/gpu/drm/i915/i915_gem_tiling.c @@ -184,7 +184,7 @@ i915_gem_detect_bit_6_swizzle(struct drm_device *dev)  static bool  i915_tiling_ok(struct drm_device *dev, int stride, int size, int tiling_mode)  { -	int tile_width, tile_height; +	int tile_width;  	/* Linear is always fine */  	if (tiling_mode == I915_TILING_NONE) @@ -215,20 +215,6 @@ i915_tiling_ok(struct drm_device *dev, int stride, int size, int tiling_mode)  		}  	} -	if (IS_GEN2(dev) || -	    (tiling_mode == I915_TILING_Y && HAS_128_BYTE_Y_TILING(dev))) -		tile_height = 32; -	else -		tile_height = 8; -	/* i8xx is strange: It has 2 interleaved rows of tiles, so needs an even -	 * number of tile rows. */ -	if (IS_GEN2(dev)) -		tile_height *= 2; - -	/* Size needs to be aligned to a full tile row */ -	if (size & (tile_height * stride - 1)) -		return false; -  	/* 965+ just needs multiples of tile width */  	if (INTEL_INFO(dev)->gen >= 4) {  		if (stride & (tile_width - 1)) @@ -363,14 +349,27 @@ i915_gem_set_tiling(struct drm_device *dev, void *data,  			(obj->gtt_offset + obj->base.size <= dev_priv->mm.gtt_mappable_end &&  			 i915_gem_object_fence_ok(obj, args->tiling_mode)); -		obj->tiling_changed = true; -		obj->tiling_mode = args->tiling_mode; -		obj->stride = args->stride; +		/* Rebind if we need a change of alignment */ +		if (!obj->map_and_fenceable) { +			u32 unfenced_alignment = +				i915_gem_get_unfenced_gtt_alignment(obj); +			if (obj->gtt_offset & (unfenced_alignment - 1)) +				ret = i915_gem_object_unbind(obj); +		} + +		if (ret == 0) { +			obj->tiling_changed = true; +			obj->tiling_mode = args->tiling_mode; +			obj->stride = args->stride; +		}  	} +	/* we have to maintain this existing ABI... */ +	args->stride = obj->stride; +	args->tiling_mode = obj->tiling_mode;  	drm_gem_object_unreference(&obj->base);  	mutex_unlock(&dev->struct_mutex); -	return 0; +	return ret;  }  /** diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h index 729d4233b76..3e6f486f460 100644 --- a/drivers/gpu/drm/i915/i915_reg.h +++ b/drivers/gpu/drm/i915/i915_reg.h @@ -3261,6 +3261,8 @@  #define  FORCEWAKE				0xA18C  #define  FORCEWAKE_ACK				0x130090 +#define  GT_FIFO_FREE_ENTRIES			0x120008 +  #define GEN6_RPNSWREQ				0xA008  #define   GEN6_TURBO_DISABLE			(1<<31)  #define   GEN6_FREQUENCY(x)			((x)<<25) diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index e79b25bbee6..49fb54fd9a1 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c @@ -1219,7 +1219,7 @@ static void sandybridge_blit_fbc_update(struct drm_device *dev)  	u32 blt_ecoskpd;  	/* Make sure blitter notifies FBC of writes */ -	__gen6_force_wake_get(dev_priv); +	__gen6_gt_force_wake_get(dev_priv);  	blt_ecoskpd = I915_READ(GEN6_BLITTER_ECOSKPD);  	blt_ecoskpd |= GEN6_BLITTER_FBC_NOTIFY <<  		GEN6_BLITTER_LOCK_SHIFT; @@ -1230,7 +1230,7 @@ static void sandybridge_blit_fbc_update(struct drm_device *dev)  			 GEN6_BLITTER_LOCK_SHIFT);  	I915_WRITE(GEN6_BLITTER_ECOSKPD, blt_ecoskpd);  	POSTING_READ(GEN6_BLITTER_ECOSKPD); -	__gen6_force_wake_put(dev_priv); +	__gen6_gt_force_wake_put(dev_priv);  }  static void ironlake_enable_fbc(struct drm_crtc *crtc, unsigned long interval) @@ -6282,7 +6282,7 @@ void gen6_enable_rps(struct drm_i915_private *dev_priv)  	 * userspace...  	 */  	I915_WRITE(GEN6_RC_STATE, 0); -	__gen6_force_wake_get(dev_priv); +	__gen6_gt_force_wake_get(dev_priv);  	/* disable the counters and set deterministic thresholds */  	I915_WRITE(GEN6_RC_CONTROL, 0); @@ -6380,7 +6380,7 @@ void gen6_enable_rps(struct drm_i915_private *dev_priv)  	/* enable all PM interrupts */  	I915_WRITE(GEN6_PMINTRMSK, 0); -	__gen6_force_wake_put(dev_priv); +	__gen6_gt_force_wake_put(dev_priv);  }  void intel_enable_clock_gating(struct drm_device *dev) diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.h b/drivers/gpu/drm/i915/intel_ringbuffer.h index 6d6fde85a63..34306865a5d 100644 --- a/drivers/gpu/drm/i915/intel_ringbuffer.h +++ b/drivers/gpu/drm/i915/intel_ringbuffer.h @@ -14,22 +14,23 @@ struct  intel_hw_status_page {  	struct		drm_i915_gem_object *obj;  }; -#define I915_RING_READ(reg) i915_safe_read(dev_priv, reg) +#define I915_RING_READ(reg) i915_gt_read(dev_priv, reg) +#define I915_RING_WRITE(reg, val) i915_gt_write(dev_priv, reg, val)  #define I915_READ_TAIL(ring) I915_RING_READ(RING_TAIL((ring)->mmio_base)) -#define I915_WRITE_TAIL(ring, val) I915_WRITE(RING_TAIL((ring)->mmio_base), val) +#define I915_WRITE_TAIL(ring, val) I915_RING_WRITE(RING_TAIL((ring)->mmio_base), val)  #define I915_READ_START(ring) I915_RING_READ(RING_START((ring)->mmio_base)) -#define I915_WRITE_START(ring, val) I915_WRITE(RING_START((ring)->mmio_base), val) +#define I915_WRITE_START(ring, val) I915_RING_WRITE(RING_START((ring)->mmio_base), val)  #define I915_READ_HEAD(ring)  I915_RING_READ(RING_HEAD((ring)->mmio_base)) -#define I915_WRITE_HEAD(ring, val) I915_WRITE(RING_HEAD((ring)->mmio_base), val) +#define I915_WRITE_HEAD(ring, val) I915_RING_WRITE(RING_HEAD((ring)->mmio_base), val)  #define I915_READ_CTL(ring) I915_RING_READ(RING_CTL((ring)->mmio_base)) -#define I915_WRITE_CTL(ring, val) I915_WRITE(RING_CTL((ring)->mmio_base), val) +#define I915_WRITE_CTL(ring, val) I915_RING_WRITE(RING_CTL((ring)->mmio_base), val) -#define I915_WRITE_IMR(ring, val) I915_WRITE(RING_IMR((ring)->mmio_base), val)  #define I915_READ_IMR(ring) I915_RING_READ(RING_IMR((ring)->mmio_base)) +#define I915_WRITE_IMR(ring, val) I915_RING_WRITE(RING_IMR((ring)->mmio_base), val)  #define I915_READ_NOPID(ring) I915_RING_READ(RING_NOPID((ring)->mmio_base))  #define I915_READ_SYNC_0(ring) I915_RING_READ(RING_SYNC_0((ring)->mmio_base)) diff --git a/drivers/gpu/drm/nouveau/nouveau_dma.c b/drivers/gpu/drm/nouveau/nouveau_dma.c index 65699bfaaae..b368ed74aad 100644 --- a/drivers/gpu/drm/nouveau/nouveau_dma.c +++ b/drivers/gpu/drm/nouveau/nouveau_dma.c @@ -83,7 +83,8 @@ nouveau_dma_init(struct nouveau_channel *chan)  		return ret;  	/* NV_MEMORY_TO_MEMORY_FORMAT requires a notifier object */ -	ret = nouveau_notifier_alloc(chan, NvNotify0, 32, &chan->m2mf_ntfy); +	ret = nouveau_notifier_alloc(chan, NvNotify0, 32, 0xfd0, 0x1000, +				     &chan->m2mf_ntfy);  	if (ret)  		return ret; diff --git a/drivers/gpu/drm/nouveau/nouveau_drv.h b/drivers/gpu/drm/nouveau/nouveau_drv.h index 9821fcacc3d..982d70b1272 100644 --- a/drivers/gpu/drm/nouveau/nouveau_drv.h +++ b/drivers/gpu/drm/nouveau/nouveau_drv.h @@ -852,7 +852,8 @@ extern const struct ttm_mem_type_manager_func nouveau_vram_manager;  extern int  nouveau_notifier_init_channel(struct nouveau_channel *);  extern void nouveau_notifier_takedown_channel(struct nouveau_channel *);  extern int  nouveau_notifier_alloc(struct nouveau_channel *, uint32_t handle, -				   int cout, uint32_t *offset); +				   int cout, uint32_t start, uint32_t end, +				   uint32_t *offset);  extern int  nouveau_notifier_offset(struct nouveau_gpuobj *, uint32_t *);  extern int  nouveau_ioctl_notifier_alloc(struct drm_device *, void *data,  					 struct drm_file *); diff --git a/drivers/gpu/drm/nouveau/nouveau_mem.c b/drivers/gpu/drm/nouveau/nouveau_mem.c index 26347b7cd87..b0fb9bdcddb 100644 --- a/drivers/gpu/drm/nouveau/nouveau_mem.c +++ b/drivers/gpu/drm/nouveau/nouveau_mem.c @@ -725,8 +725,10 @@ nouveau_vram_manager_new(struct ttm_mem_type_manager *man,  	ret = vram->get(dev, mem->num_pages << PAGE_SHIFT,  			mem->page_alignment << PAGE_SHIFT, size_nc,  			(nvbo->tile_flags >> 8) & 0xff, &node); -	if (ret) -		return ret; +	if (ret) { +		mem->mm_node = NULL; +		return (ret == -ENOSPC) ? 0 : ret; +	}  	node->page_shift = 12;  	if (nvbo->vma.node) diff --git a/drivers/gpu/drm/nouveau/nouveau_mm.c b/drivers/gpu/drm/nouveau/nouveau_mm.c index 8844b50c3e5..7609756b6fa 100644 --- a/drivers/gpu/drm/nouveau/nouveau_mm.c +++ b/drivers/gpu/drm/nouveau/nouveau_mm.c @@ -123,7 +123,7 @@ nouveau_mm_get(struct nouveau_mm *rmm, int type, u32 size, u32 size_nc,  		return 0;  	} -	return -ENOMEM; +	return -ENOSPC;  }  int diff --git a/drivers/gpu/drm/nouveau/nouveau_notifier.c b/drivers/gpu/drm/nouveau/nouveau_notifier.c index fe29d604b82..5ea167623a8 100644 --- a/drivers/gpu/drm/nouveau/nouveau_notifier.c +++ b/drivers/gpu/drm/nouveau/nouveau_notifier.c @@ -96,7 +96,8 @@ nouveau_notifier_gpuobj_dtor(struct drm_device *dev,  int  nouveau_notifier_alloc(struct nouveau_channel *chan, uint32_t handle, -		       int size, uint32_t *b_offset) +		       int size, uint32_t start, uint32_t end, +		       uint32_t *b_offset)  {  	struct drm_device *dev = chan->dev;  	struct nouveau_gpuobj *nobj = NULL; @@ -104,9 +105,10 @@ nouveau_notifier_alloc(struct nouveau_channel *chan, uint32_t handle,  	uint32_t offset;  	int target, ret; -	mem = drm_mm_search_free(&chan->notifier_heap, size, 0, 0); +	mem = drm_mm_search_free_in_range(&chan->notifier_heap, size, 0, +					  start, end, 0);  	if (mem) -		mem = drm_mm_get_block(mem, size, 0); +		mem = drm_mm_get_block_range(mem, size, 0, start, end);  	if (!mem) {  		NV_ERROR(dev, "Channel %d notifier block full\n", chan->id);  		return -ENOMEM; @@ -177,7 +179,8 @@ nouveau_ioctl_notifier_alloc(struct drm_device *dev, void *data,  	if (IS_ERR(chan))  		return PTR_ERR(chan); -	ret = nouveau_notifier_alloc(chan, na->handle, na->size, &na->offset); +	ret = nouveau_notifier_alloc(chan, na->handle, na->size, 0, 0x1000, +				     &na->offset);  	nouveau_channel_put(&chan);  	return ret;  } diff --git a/drivers/gpu/drm/nouveau/nv50_instmem.c b/drivers/gpu/drm/nouveau/nv50_instmem.c index ea0041810ae..e57caa2a00e 100644 --- a/drivers/gpu/drm/nouveau/nv50_instmem.c +++ b/drivers/gpu/drm/nouveau/nv50_instmem.c @@ -403,16 +403,24 @@ nv50_instmem_unmap(struct nouveau_gpuobj *gpuobj)  void  nv50_instmem_flush(struct drm_device *dev)  { +	struct drm_nouveau_private *dev_priv = dev->dev_private; + +	spin_lock(&dev_priv->ramin_lock);  	nv_wr32(dev, 0x00330c, 0x00000001);  	if (!nv_wait(dev, 0x00330c, 0x00000002, 0x00000000))  		NV_ERROR(dev, "PRAMIN flush timeout\n"); +	spin_unlock(&dev_priv->ramin_lock);  }  void  nv84_instmem_flush(struct drm_device *dev)  { +	struct drm_nouveau_private *dev_priv = dev->dev_private; + +	spin_lock(&dev_priv->ramin_lock);  	nv_wr32(dev, 0x070000, 0x00000001);  	if (!nv_wait(dev, 0x070000, 0x00000002, 0x00000000))  		NV_ERROR(dev, "PRAMIN flush timeout\n"); +	spin_unlock(&dev_priv->ramin_lock);  } diff --git a/drivers/gpu/drm/nouveau/nv50_vm.c b/drivers/gpu/drm/nouveau/nv50_vm.c index 459ff08241e..6144156f255 100644 --- a/drivers/gpu/drm/nouveau/nv50_vm.c +++ b/drivers/gpu/drm/nouveau/nv50_vm.c @@ -169,7 +169,11 @@ nv50_vm_flush(struct nouveau_vm *vm)  void  nv50_vm_flush_engine(struct drm_device *dev, int engine)  { +	struct drm_nouveau_private *dev_priv = dev->dev_private; + +	spin_lock(&dev_priv->ramin_lock);  	nv_wr32(dev, 0x100c80, (engine << 16) | 1);  	if (!nv_wait(dev, 0x100c80, 0x00000001, 0x00000000))  		NV_ERROR(dev, "vm flush timeout: engine %d\n", engine); +	spin_unlock(&dev_priv->ramin_lock);  } diff --git a/drivers/idle/intel_idle.c b/drivers/idle/intel_idle.c index 1fa091e0569..4a5c4a44ffb 100644 --- a/drivers/idle/intel_idle.c +++ b/drivers/idle/intel_idle.c @@ -62,6 +62,7 @@  #include <linux/notifier.h>  #include <linux/cpu.h>  #include <asm/mwait.h> +#include <asm/msr.h>  #define INTEL_IDLE_VERSION "0.4"  #define PREFIX "intel_idle: " @@ -85,6 +86,12 @@ static int intel_idle(struct cpuidle_device *dev, struct cpuidle_state *state);  static struct cpuidle_state *cpuidle_state_table;  /* + * Hardware C-state auto-demotion may not always be optimal. + * Indicate which enable bits to clear here. + */ +static unsigned long long auto_demotion_disable_flags; + +/*   * Set this flag for states where the HW flushes the TLB for us   * and so we don't need cross-calls to keep it consistent.   * If this flag is set, SW flushes the TLB, so even if the @@ -281,6 +288,15 @@ static struct notifier_block setup_broadcast_notifier = {  	.notifier_call = setup_broadcast_cpuhp_notify,  }; +static void auto_demotion_disable(void *dummy) +{ +	unsigned long long msr_bits; + +	rdmsrl(MSR_NHM_SNB_PKG_CST_CFG_CTL, msr_bits); +	msr_bits &= ~auto_demotion_disable_flags; +	wrmsrl(MSR_NHM_SNB_PKG_CST_CFG_CTL, msr_bits); +} +  /*   * intel_idle_probe()   */ @@ -324,11 +340,17 @@ static int intel_idle_probe(void)  	case 0x25:	/* Westmere */  	case 0x2C:	/* Westmere */  		cpuidle_state_table = nehalem_cstates; +		auto_demotion_disable_flags = +			(NHM_C1_AUTO_DEMOTE | NHM_C3_AUTO_DEMOTE);  		break;  	case 0x1C:	/* 28 - Atom Processor */ +		cpuidle_state_table = atom_cstates; +		break; +  	case 0x26:	/* 38 - Lincroft Atom Processor */  		cpuidle_state_table = atom_cstates; +		auto_demotion_disable_flags = ATM_LNC_C6_AUTO_DEMOTE;  		break;  	case 0x2A:	/* SNB */ @@ -436,6 +458,8 @@ static int intel_idle_cpuidle_devices_init(void)  			return -EIO;  		}  	} +	if (auto_demotion_disable_flags) +		smp_call_function(auto_demotion_disable, NULL, 1);  	return 0;  } diff --git a/drivers/isdn/hardware/eicon/istream.c b/drivers/isdn/hardware/eicon/istream.c index 18f8798442f..7bd5baa547b 100644 --- a/drivers/isdn/hardware/eicon/istream.c +++ b/drivers/isdn/hardware/eicon/istream.c @@ -62,7 +62,7 @@ void diva_xdi_provide_istream_info (ADAPTER* a,    stream interface.    If synchronous service was requested, then function    does return amount of data written to stream. -  'final' does indicate that pice of data to be written is +  'final' does indicate that piece of data to be written is    final part of frame (necessary only by structured datatransfer)    return  0 if zero lengh packet was written    return -1 if stream is full diff --git a/drivers/mfd/asic3.c b/drivers/mfd/asic3.c index 6a1f9404261..c45e6305b26 100644 --- a/drivers/mfd/asic3.c +++ b/drivers/mfd/asic3.c @@ -143,9 +143,9 @@ static void asic3_irq_demux(unsigned int irq, struct irq_desc *desc)  	unsigned long flags;  	struct asic3 *asic; -	desc->chip->ack(irq); +	desc->irq_data.chip->irq_ack(&desc->irq_data); -	asic = desc->handler_data; +	asic = get_irq_data(irq);  	for (iter = 0 ; iter < MAX_ASIC_ISR_LOOPS; iter++) {  		u32 status; diff --git a/drivers/mfd/davinci_voicecodec.c b/drivers/mfd/davinci_voicecodec.c index 33c923d215c..fdd8a1b8bc6 100644 --- a/drivers/mfd/davinci_voicecodec.c +++ b/drivers/mfd/davinci_voicecodec.c @@ -118,12 +118,12 @@ static int __init davinci_vc_probe(struct platform_device *pdev)  	/* Voice codec interface client */  	cell = &davinci_vc->cells[DAVINCI_VC_VCIF_CELL]; -	cell->name = "davinci_vcif"; +	cell->name = "davinci-vcif";  	cell->driver_data = davinci_vc;  	/* Voice codec CQ93VC client */  	cell = &davinci_vc->cells[DAVINCI_VC_CQ93VC_CELL]; -	cell->name = "cq93vc"; +	cell->name = "cq93vc-codec";  	cell->driver_data = davinci_vc;  	ret = mfd_add_devices(&pdev->dev, pdev->id, davinci_vc->cells, diff --git a/drivers/mfd/tps6586x.c b/drivers/mfd/tps6586x.c index 627cf577b16..e9018d1394e 100644 --- a/drivers/mfd/tps6586x.c +++ b/drivers/mfd/tps6586x.c @@ -150,12 +150,12 @@ static inline int __tps6586x_write(struct i2c_client *client,  static inline int __tps6586x_writes(struct i2c_client *client, int reg,  				  int len, uint8_t *val)  { -	int ret; +	int ret, i; -	ret = i2c_smbus_write_i2c_block_data(client, reg, len, val); -	if (ret < 0) { -		dev_err(&client->dev, "failed writings to 0x%02x\n", reg); -		return ret; +	for (i = 0; i < len; i++) { +		ret = __tps6586x_write(client, reg + i, *(val + i)); +		if (ret < 0) +			return ret;  	}  	return 0; diff --git a/drivers/mfd/ucb1x00-ts.c b/drivers/mfd/ucb1x00-ts.c index 000cb414a78..92b85e28a15 100644 --- a/drivers/mfd/ucb1x00-ts.c +++ b/drivers/mfd/ucb1x00-ts.c @@ -385,12 +385,18 @@ static int ucb1x00_ts_add(struct ucb1x00_dev *dev)  	idev->close      = ucb1x00_ts_close;  	__set_bit(EV_ABS, idev->evbit); -	__set_bit(ABS_X, idev->absbit); -	__set_bit(ABS_Y, idev->absbit); -	__set_bit(ABS_PRESSURE, idev->absbit);  	input_set_drvdata(idev, ts); +	ucb1x00_adc_enable(ts->ucb); +	ts->x_res = ucb1x00_ts_read_xres(ts); +	ts->y_res = ucb1x00_ts_read_yres(ts); +	ucb1x00_adc_disable(ts->ucb); + +	input_set_abs_params(idev, ABS_X, 0, ts->x_res, 0, 0); +	input_set_abs_params(idev, ABS_Y, 0, ts->y_res, 0, 0); +	input_set_abs_params(idev, ABS_PRESSURE, 0, 0, 0, 0); +  	err = input_register_device(idev);  	if (err)  		goto fail; diff --git a/drivers/mfd/wm8994-core.c b/drivers/mfd/wm8994-core.c index 41233c7fa58..f4016a075fd 100644 --- a/drivers/mfd/wm8994-core.c +++ b/drivers/mfd/wm8994-core.c @@ -246,6 +246,16 @@ static int wm8994_suspend(struct device *dev)  	struct wm8994 *wm8994 = dev_get_drvdata(dev);  	int ret; +	/* Don't actually go through with the suspend if the CODEC is +	 * still active (eg, for audio passthrough from CP. */ +	ret = wm8994_reg_read(wm8994, WM8994_POWER_MANAGEMENT_1); +	if (ret < 0) { +		dev_err(dev, "Failed to read power status: %d\n", ret); +	} else if (ret & WM8994_VMID_SEL_MASK) { +		dev_dbg(dev, "CODEC still active, ignoring suspend\n"); +		return 0; +	} +  	/* GPIO configuration state is saved here since we may be configuring  	 * the GPIO alternate functions even if we're not using the gpiolib  	 * driver for them. @@ -261,6 +271,8 @@ static int wm8994_suspend(struct device *dev)  	if (ret < 0)  		dev_err(dev, "Failed to save LDO registers: %d\n", ret); +	wm8994->suspended = true; +  	ret = regulator_bulk_disable(wm8994->num_supplies,  				     wm8994->supplies);  	if (ret != 0) { @@ -276,6 +288,10 @@ static int wm8994_resume(struct device *dev)  	struct wm8994 *wm8994 = dev_get_drvdata(dev);  	int ret; +	/* We may have lied to the PM core about suspending */ +	if (!wm8994->suspended) +		return 0; +  	ret = regulator_bulk_enable(wm8994->num_supplies,  				    wm8994->supplies);  	if (ret != 0) { @@ -298,6 +314,8 @@ static int wm8994_resume(struct device *dev)  	if (ret < 0)  		dev_err(dev, "Failed to restore GPIO registers: %d\n", ret); +	wm8994->suspended = false; +  	return 0;  }  #endif diff --git a/drivers/misc/bmp085.c b/drivers/misc/bmp085.c index 63ee4c1a531..b6e1c9a6679 100644 --- a/drivers/misc/bmp085.c +++ b/drivers/misc/bmp085.c @@ -449,6 +449,7 @@ static const struct i2c_device_id bmp085_id[] = {  	{ "bmp085", 0 },  	{ }  }; +MODULE_DEVICE_TABLE(i2c, bmp085_id);  static struct i2c_driver bmp085_driver = {  	.driver = { diff --git a/drivers/mmc/core/sdio.c b/drivers/mmc/core/sdio.c index 5c4a54d9b6a..ebc62ad4cc5 100644 --- a/drivers/mmc/core/sdio.c +++ b/drivers/mmc/core/sdio.c @@ -792,7 +792,6 @@ int mmc_attach_sdio(struct mmc_host *host)  	 */  	mmc_release_host(host);  	err = mmc_add_card(host->card); -	mmc_claim_host(host);  	if (err)  		goto remove_added; @@ -805,12 +804,12 @@ int mmc_attach_sdio(struct mmc_host *host)  			goto remove_added;  	} +	mmc_claim_host(host);  	return 0;  remove_added:  	/* Remove without lock if the device has been added. */ -	mmc_release_host(host);  	mmc_sdio_remove(host);  	mmc_claim_host(host);  remove: diff --git a/drivers/net/bnx2x/bnx2x.h b/drivers/net/bnx2x/bnx2x.h index 653c62475cb..7897d114b29 100644 --- a/drivers/net/bnx2x/bnx2x.h +++ b/drivers/net/bnx2x/bnx2x.h @@ -22,7 +22,7 @@   * (you will need to reboot afterwards) */  /* #define BNX2X_STOP_ON_ERROR */ -#define DRV_MODULE_VERSION      "1.62.00-5" +#define DRV_MODULE_VERSION      "1.62.00-6"  #define DRV_MODULE_RELDATE      "2011/01/30"  #define BNX2X_BC_VER            0x040200 @@ -1613,19 +1613,23 @@ static inline u32 reg_poll(struct bnx2x *bp, u32 reg, u32 expected, int ms,  #define BNX2X_BTR			4  #define MAX_SPQ_PENDING			8 - -/* CMNG constants -   derived from lab experiments, and not from system spec calculations !!! */ -#define DEF_MIN_RATE			100 +/* CMNG constants, as derived from system spec calculations */ +/* default MIN rate in case VNIC min rate is configured to zero - 100Mbps */ +#define DEF_MIN_RATE					100  /* resolution of the rate shaping timer - 100 usec */ -#define RS_PERIODIC_TIMEOUT_USEC	100 -/* resolution of fairness algorithm in usecs - -   coefficient for calculating the actual t fair */ -#define T_FAIR_COEF			10000000 +#define RS_PERIODIC_TIMEOUT_USEC			100  /* number of bytes in single QM arbitration cycle - -   coefficient for calculating the fairness timer */ -#define QM_ARB_BYTES			40000 -#define FAIR_MEM			2 + * coefficient for calculating the fairness timer */ +#define QM_ARB_BYTES					160000 +/* resolution of Min algorithm 1:100 */ +#define MIN_RES						100 +/* how many bytes above threshold for the minimal credit of Min algorithm*/ +#define MIN_ABOVE_THRESH				32768 +/* Fairness algorithm integration time coefficient - + * for calculating the actual Tfair */ +#define T_FAIR_COEF	((MIN_ABOVE_THRESH +  QM_ARB_BYTES) * 8 * MIN_RES) +/* Memory of fairness algorithm . 2 cycles */ +#define FAIR_MEM					2  #define ATTN_NIG_FOR_FUNC		(1L << 8) diff --git a/drivers/net/bnx2x/bnx2x_cmn.c b/drivers/net/bnx2x/bnx2x_cmn.c index 710ce5d04c5..93798129061 100644 --- a/drivers/net/bnx2x/bnx2x_cmn.c +++ b/drivers/net/bnx2x/bnx2x_cmn.c @@ -259,10 +259,44 @@ static void bnx2x_tpa_start(struct bnx2x_fastpath *fp, u16 queue,  #endif  } +/* Timestamp option length allowed for TPA aggregation: + * + *		nop nop kind length echo val + */ +#define TPA_TSTAMP_OPT_LEN	12 +/** + * Calculate the approximate value of the MSS for this + * aggregation using the first packet of it. + * + * @param bp + * @param parsing_flags Parsing flags from the START CQE + * @param len_on_bd Total length of the first packet for the + *		     aggregation. + */ +static inline u16 bnx2x_set_lro_mss(struct bnx2x *bp, u16 parsing_flags, +				    u16 len_on_bd) +{ +	/* TPA arrgregation won't have an IP options and TCP options +	 * other than timestamp. +	 */ +	u16 hdrs_len = ETH_HLEN + sizeof(struct iphdr) + sizeof(struct tcphdr); + + +	/* Check if there was a TCP timestamp, if there is it's will +	 * always be 12 bytes length: nop nop kind length echo val. +	 * +	 * Otherwise FW would close the aggregation. +	 */ +	if (parsing_flags & PARSING_FLAGS_TIME_STAMP_EXIST_FLAG) +		hdrs_len += TPA_TSTAMP_OPT_LEN; + +	return len_on_bd - hdrs_len; +} +  static int bnx2x_fill_frag_skb(struct bnx2x *bp, struct bnx2x_fastpath *fp,  			       struct sk_buff *skb,  			       struct eth_fast_path_rx_cqe *fp_cqe, -			       u16 cqe_idx) +			       u16 cqe_idx, u16 parsing_flags)  {  	struct sw_rx_page *rx_pg, old_rx_pg;  	u16 len_on_bd = le16_to_cpu(fp_cqe->len_on_bd); @@ -275,8 +309,8 @@ static int bnx2x_fill_frag_skb(struct bnx2x *bp, struct bnx2x_fastpath *fp,  	/* This is needed in order to enable forwarding support */  	if (frag_size) -		skb_shinfo(skb)->gso_size = min((u32)SGE_PAGE_SIZE, -					       max(frag_size, (u32)len_on_bd)); +		skb_shinfo(skb)->gso_size = bnx2x_set_lro_mss(bp, parsing_flags, +							      len_on_bd);  #ifdef BNX2X_STOP_ON_ERROR  	if (pages > min_t(u32, 8, MAX_SKB_FRAGS)*SGE_PAGE_SIZE*PAGES_PER_SGE) { @@ -344,6 +378,8 @@ static void bnx2x_tpa_stop(struct bnx2x *bp, struct bnx2x_fastpath *fp,  	if (likely(new_skb)) {  		/* fix ip xsum and give it to the stack */  		/* (no need to map the new skb) */ +		u16 parsing_flags = +			le16_to_cpu(cqe->fast_path_cqe.pars_flags.flags);  		prefetch(skb);  		prefetch(((char *)(skb)) + L1_CACHE_BYTES); @@ -373,9 +409,9 @@ static void bnx2x_tpa_stop(struct bnx2x *bp, struct bnx2x_fastpath *fp,  		}  		if (!bnx2x_fill_frag_skb(bp, fp, skb, -					 &cqe->fast_path_cqe, cqe_idx)) { -			if ((le16_to_cpu(cqe->fast_path_cqe. -			    pars_flags.flags) & PARSING_FLAGS_VLAN)) +					 &cqe->fast_path_cqe, cqe_idx, +					 parsing_flags)) { +			if (parsing_flags & PARSING_FLAGS_VLAN)  				__vlan_hwaccel_put_tag(skb,  						 le16_to_cpu(cqe->fast_path_cqe.  							     vlan_tag)); @@ -703,19 +739,20 @@ u16 bnx2x_get_mf_speed(struct bnx2x *bp)  {  	u16 line_speed = bp->link_vars.line_speed;  	if (IS_MF(bp)) { -		u16 maxCfg = (bp->mf_config[BP_VN(bp)] & -						FUNC_MF_CFG_MAX_BW_MASK) >> -						FUNC_MF_CFG_MAX_BW_SHIFT; -		/* Calculate the current MAX line speed limit for the DCC -		 * capable devices +		u16 maxCfg = bnx2x_extract_max_cfg(bp, +						   bp->mf_config[BP_VN(bp)]); + +		/* Calculate the current MAX line speed limit for the MF +		 * devices  		 */ -		if (IS_MF_SD(bp)) { +		if (IS_MF_SI(bp)) +			line_speed = (line_speed * maxCfg) / 100; +		else { /* SD mode */  			u16 vn_max_rate = maxCfg * 100;  			if (vn_max_rate < line_speed)  				line_speed = vn_max_rate; -		} else /* IS_MF_SI(bp)) */ -			line_speed = (line_speed * maxCfg) / 100; +		}  	}  	return line_speed; diff --git a/drivers/net/bnx2x/bnx2x_cmn.h b/drivers/net/bnx2x/bnx2x_cmn.h index 03eb4d68e6b..326ba44b3de 100644 --- a/drivers/net/bnx2x/bnx2x_cmn.h +++ b/drivers/net/bnx2x/bnx2x_cmn.h @@ -1044,4 +1044,24 @@ static inline void storm_memset_cmng(struct bnx2x *bp,  void bnx2x_acquire_phy_lock(struct bnx2x *bp);  void bnx2x_release_phy_lock(struct bnx2x *bp); +/** + * Extracts MAX BW part from MF configuration. + * + * @param bp + * @param mf_cfg + * + * @return u16 + */ +static inline u16 bnx2x_extract_max_cfg(struct bnx2x *bp, u32 mf_cfg) +{ +	u16 max_cfg = (mf_cfg & FUNC_MF_CFG_MAX_BW_MASK) >> +			      FUNC_MF_CFG_MAX_BW_SHIFT; +	if (!max_cfg) { +		BNX2X_ERR("Illegal configuration detected for Max BW - " +			  "using 100 instead\n"); +		max_cfg = 100; +	} +	return max_cfg; +} +  #endif /* BNX2X_CMN_H */ diff --git a/drivers/net/bnx2x/bnx2x_ethtool.c b/drivers/net/bnx2x/bnx2x_ethtool.c index 5b44a8b4850..ef2919987a1 100644 --- a/drivers/net/bnx2x/bnx2x_ethtool.c +++ b/drivers/net/bnx2x/bnx2x_ethtool.c @@ -238,7 +238,7 @@ static int bnx2x_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)  	speed |= (cmd->speed_hi << 16);  	if (IS_MF_SI(bp)) { -		u32 param = 0; +		u32 param = 0, part;  		u32 line_speed = bp->link_vars.line_speed;  		/* use 10G if no link detected */ @@ -251,9 +251,11 @@ static int bnx2x_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)  				       REQ_BC_VER_4_SET_MF_BW);  			return -EINVAL;  		} -		if (line_speed < speed) { -			BNX2X_DEV_INFO("New speed should be less or equal " -				       "to actual line speed\n"); +		part = (speed * 100) / line_speed; +		if (line_speed < speed || !part) { +			BNX2X_DEV_INFO("Speed setting should be in a range " +				       "from 1%% to 100%% " +				       "of actual line speed\n");  			return -EINVAL;  		}  		/* load old values */ @@ -263,8 +265,7 @@ static int bnx2x_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)  		param &= FUNC_MF_CFG_MIN_BW_MASK;  		/* set new MAX value */ -		param |= (((speed * 100) / line_speed) -				 << FUNC_MF_CFG_MAX_BW_SHIFT) +		param |= (part << FUNC_MF_CFG_MAX_BW_SHIFT)  				  & FUNC_MF_CFG_MAX_BW_MASK;  		bnx2x_fw_command(bp, DRV_MSG_CODE_SET_MF_BW, param); @@ -1781,9 +1782,7 @@ static int bnx2x_test_nvram(struct bnx2x *bp)  		{ 0x100, 0x350 }, /* manuf_info */  		{ 0x450,  0xf0 }, /* feature_info */  		{ 0x640,  0x64 }, /* upgrade_key_info */ -		{ 0x6a4,  0x64 },  		{ 0x708,  0x70 }, /* manuf_key_info */ -		{ 0x778,  0x70 },  		{     0,     0 }  	};  	__be32 buf[0x350 / 4]; @@ -1933,11 +1932,11 @@ static void bnx2x_self_test(struct net_device *dev,  		buf[4] = 1;  		etest->flags |= ETH_TEST_FL_FAILED;  	} -	if (bp->port.pmf) -		if (bnx2x_link_test(bp, is_serdes) != 0) { -			buf[5] = 1; -			etest->flags |= ETH_TEST_FL_FAILED; -		} + +	if (bnx2x_link_test(bp, is_serdes) != 0) { +		buf[5] = 1; +		etest->flags |= ETH_TEST_FL_FAILED; +	}  #ifdef BNX2X_EXTRA_DEBUG  	bnx2x_panic_dump(bp); diff --git a/drivers/net/bnx2x/bnx2x_init.h b/drivers/net/bnx2x/bnx2x_init.h index 5a268e9a089..fa6dbe3f205 100644 --- a/drivers/net/bnx2x/bnx2x_init.h +++ b/drivers/net/bnx2x/bnx2x_init.h @@ -241,7 +241,7 @@ static const struct {  	/* Block IGU, MISC, PXP and PXP2 parity errors as long as we don't  	 * want to handle "system kill" flow at the moment.  	 */ -	BLOCK_PRTY_INFO(PXP, 0x3ffffff, 0x3ffffff, 0x3ffffff, 0x3ffffff), +	BLOCK_PRTY_INFO(PXP, 0x7ffffff, 0x3ffffff, 0x3ffffff, 0x7ffffff),  	BLOCK_PRTY_INFO_0(PXP2,	0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff),  	BLOCK_PRTY_INFO_1(PXP2,	0x7ff, 0x7f, 0x7f, 0x7ff),  	BLOCK_PRTY_INFO(HC, 0x7, 0x7, 0x7, 0), diff --git a/drivers/net/bnx2x/bnx2x_main.c b/drivers/net/bnx2x/bnx2x_main.c index d584d32c747..032ae184b60 100644 --- a/drivers/net/bnx2x/bnx2x_main.c +++ b/drivers/net/bnx2x/bnx2x_main.c @@ -1974,13 +1974,22 @@ static void bnx2x_init_vn_minmax(struct bnx2x *bp, int vn)  		vn_max_rate = 0;  	} else { +		u32 maxCfg = bnx2x_extract_max_cfg(bp, vn_cfg); +  		vn_min_rate = ((vn_cfg & FUNC_MF_CFG_MIN_BW_MASK) >>  				FUNC_MF_CFG_MIN_BW_SHIFT) * 100; -		/* If min rate is zero - set it to 1 */ +		/* If fairness is enabled (not all min rates are zeroes) and +		   if current min rate is zero - set it to 1. +		   This is a requirement of the algorithm. */  		if (bp->vn_weight_sum && (vn_min_rate == 0))  			vn_min_rate = DEF_MIN_RATE; -		vn_max_rate = ((vn_cfg & FUNC_MF_CFG_MAX_BW_MASK) >> -				FUNC_MF_CFG_MAX_BW_SHIFT) * 100; + +		if (IS_MF_SI(bp)) +			/* maxCfg in percents of linkspeed */ +			vn_max_rate = (bp->link_vars.line_speed * maxCfg) / 100; +		else +			/* maxCfg is absolute in 100Mb units */ +			vn_max_rate = maxCfg * 100;  	}  	DP(NETIF_MSG_IFUP, @@ -2006,7 +2015,8 @@ static void bnx2x_init_vn_minmax(struct bnx2x *bp, int vn)  		m_fair_vn.vn_credit_delta =  			max_t(u32, (vn_min_rate * (T_FAIR_COEF /  						   (8 * bp->vn_weight_sum))), -			      (bp->cmng.fair_vars.fair_threshold * 2)); +			      (bp->cmng.fair_vars.fair_threshold + +							MIN_ABOVE_THRESH));  		DP(NETIF_MSG_IFUP, "m_fair_vn.vn_credit_delta %d\n",  		   m_fair_vn.vn_credit_delta);  	} diff --git a/drivers/net/bnx2x/bnx2x_stats.c b/drivers/net/bnx2x/bnx2x_stats.c index bda60d590fa..3445ded6674 100644 --- a/drivers/net/bnx2x/bnx2x_stats.c +++ b/drivers/net/bnx2x/bnx2x_stats.c @@ -1239,14 +1239,14 @@ void bnx2x_stats_handle(struct bnx2x *bp, enum bnx2x_stats_event event)  	if (unlikely(bp->panic))  		return; +	bnx2x_stats_stm[bp->stats_state][event].action(bp); +  	/* Protect a state change flow */  	spin_lock_bh(&bp->stats_lock);  	state = bp->stats_state;  	bp->stats_state = bnx2x_stats_stm[state][event].next_state;  	spin_unlock_bh(&bp->stats_lock); -	bnx2x_stats_stm[state][event].action(bp); -  	if ((event != STATS_EVENT_UPDATE) || netif_msg_timer(bp))  		DP(BNX2X_MSG_STATS, "state %d -> event %d -> state %d\n",  		   state, event, bp->stats_state); diff --git a/drivers/net/can/softing/softing_main.c b/drivers/net/can/softing/softing_main.c index 5157e15e96e..aeea9f9ff6e 100644 --- a/drivers/net/can/softing/softing_main.c +++ b/drivers/net/can/softing/softing_main.c @@ -633,6 +633,7 @@ static const struct net_device_ops softing_netdev_ops = {  };  static const struct can_bittiming_const softing_btr_const = { +	.name = "softing",  	.tseg1_min = 1,  	.tseg1_max = 16,  	.tseg2_min = 1, diff --git a/drivers/net/cnic.c b/drivers/net/cnic.c index 7ff170cbc7d..302be4aa69d 100644 --- a/drivers/net/cnic.c +++ b/drivers/net/cnic.c @@ -2760,6 +2760,8 @@ static u32 cnic_service_bnx2_queues(struct cnic_dev *dev)  	u32 status_idx = (u16) *cp->kcq1.status_idx_ptr;  	int kcqe_cnt; +	/* status block index must be read before reading other fields */ +	rmb();  	cp->kwq_con_idx = *cp->kwq_con_idx_ptr;  	while ((kcqe_cnt = cnic_get_kcqes(dev, &cp->kcq1))) { @@ -2770,6 +2772,8 @@ static u32 cnic_service_bnx2_queues(struct cnic_dev *dev)  		barrier();  		if (status_idx != *cp->kcq1.status_idx_ptr) {  			status_idx = (u16) *cp->kcq1.status_idx_ptr; +			/* status block index must be read first */ +			rmb();  			cp->kwq_con_idx = *cp->kwq_con_idx_ptr;  		} else  			break; @@ -2888,6 +2892,8 @@ static u32 cnic_service_bnx2x_kcq(struct cnic_dev *dev, struct kcq_info *info)  	u32 last_status = *info->status_idx_ptr;  	int kcqe_cnt; +	/* status block index must be read before reading the KCQ */ +	rmb();  	while ((kcqe_cnt = cnic_get_kcqes(dev, info))) {  		service_kcqes(dev, kcqe_cnt); @@ -2898,6 +2904,8 @@ static u32 cnic_service_bnx2x_kcq(struct cnic_dev *dev, struct kcq_info *info)  			break;  		last_status = *info->status_idx_ptr; +		/* status block index must be read before reading the KCQ */ +		rmb();  	}  	return last_status;  } @@ -2906,26 +2914,35 @@ static void cnic_service_bnx2x_bh(unsigned long data)  {  	struct cnic_dev *dev = (struct cnic_dev *) data;  	struct cnic_local *cp = dev->cnic_priv; -	u32 status_idx; +	u32 status_idx, new_status_idx;  	if (unlikely(!test_bit(CNIC_F_CNIC_UP, &dev->flags)))  		return; -	status_idx = cnic_service_bnx2x_kcq(dev, &cp->kcq1); +	while (1) { +		status_idx = cnic_service_bnx2x_kcq(dev, &cp->kcq1); -	CNIC_WR16(dev, cp->kcq1.io_addr, cp->kcq1.sw_prod_idx + MAX_KCQ_IDX); +		CNIC_WR16(dev, cp->kcq1.io_addr, +			  cp->kcq1.sw_prod_idx + MAX_KCQ_IDX); -	if (BNX2X_CHIP_IS_E2(cp->chip_id)) { -		status_idx = cnic_service_bnx2x_kcq(dev, &cp->kcq2); +		if (!BNX2X_CHIP_IS_E2(cp->chip_id)) { +			cnic_ack_bnx2x_int(dev, cp->bnx2x_igu_sb_id, USTORM_ID, +					   status_idx, IGU_INT_ENABLE, 1); +			break; +		} + +		new_status_idx = cnic_service_bnx2x_kcq(dev, &cp->kcq2); + +		if (new_status_idx != status_idx) +			continue;  		CNIC_WR16(dev, cp->kcq2.io_addr, cp->kcq2.sw_prod_idx +  			  MAX_KCQ_IDX);  		cnic_ack_igu_sb(dev, cp->bnx2x_igu_sb_id, IGU_SEG_ACCESS_DEF,  				status_idx, IGU_INT_ENABLE, 1); -	} else { -		cnic_ack_bnx2x_int(dev, cp->bnx2x_igu_sb_id, USTORM_ID, -				   status_idx, IGU_INT_ENABLE, 1); + +		break;  	}  } diff --git a/drivers/net/davinci_emac.c b/drivers/net/davinci_emac.c index 2a628d17d17..7018bfe408a 100644 --- a/drivers/net/davinci_emac.c +++ b/drivers/net/davinci_emac.c @@ -1008,7 +1008,7 @@ static void emac_rx_handler(void *token, int len, int status)  	int			ret;  	/* free and bail if we are shutting down */ -	if (unlikely(!netif_running(ndev))) { +	if (unlikely(!netif_running(ndev) || !netif_carrier_ok(ndev))) {  		dev_kfree_skb_any(skb);  		return;  	} diff --git a/drivers/net/dnet.c b/drivers/net/dnet.c index 9d8a20b72fa..8318ea06cb6 100644 --- a/drivers/net/dnet.c +++ b/drivers/net/dnet.c @@ -337,8 +337,6 @@ static int dnet_mii_init(struct dnet *bp)  	for (i = 0; i < PHY_MAX_ADDR; i++)  		bp->mii_bus->irq[i] = PHY_POLL; -	platform_set_drvdata(bp->dev, bp->mii_bus); -  	if (mdiobus_register(bp->mii_bus)) {  		err = -ENXIO;  		goto err_out_free_mdio_irq; @@ -863,6 +861,7 @@ static int __devinit dnet_probe(struct platform_device *pdev)  	bp = netdev_priv(dev);  	bp->dev = dev; +	platform_set_drvdata(pdev, dev);  	SET_NETDEV_DEV(dev, &pdev->dev);  	spin_lock_init(&bp->lock); diff --git a/drivers/net/e1000/e1000_osdep.h b/drivers/net/e1000/e1000_osdep.h index 55c1711f168..33e7c45a4fe 100644 --- a/drivers/net/e1000/e1000_osdep.h +++ b/drivers/net/e1000/e1000_osdep.h @@ -42,7 +42,8 @@  #define GBE_CONFIG_RAM_BASE \  	((unsigned int)(CONFIG_RAM_BASE + GBE_CONFIG_OFFSET)) -#define GBE_CONFIG_BASE_VIRT    phys_to_virt(GBE_CONFIG_RAM_BASE) +#define GBE_CONFIG_BASE_VIRT \ +	((void __iomem *)phys_to_virt(GBE_CONFIG_RAM_BASE))  #define GBE_CONFIG_FLASH_WRITE(base, offset, count, data) \  	(iowrite16_rep(base + offset, data, count)) diff --git a/drivers/net/e1000e/netdev.c b/drivers/net/e1000e/netdev.c index 3fa110ddb04..2e5022849f1 100644 --- a/drivers/net/e1000e/netdev.c +++ b/drivers/net/e1000e/netdev.c @@ -5967,7 +5967,8 @@ static int __devinit e1000_probe(struct pci_dev *pdev,  		/* APME bit in EEPROM is mapped to WUC.APME */  		eeprom_data = er32(WUC);  		eeprom_apme_mask = E1000_WUC_APME; -		if (eeprom_data & E1000_WUC_PHY_WAKE) +		if ((hw->mac.type > e1000_ich10lan) && +		    (eeprom_data & E1000_WUC_PHY_WAKE))  			adapter->flags2 |= FLAG2_HAS_PHY_WAKEUP;  	} else if (adapter->flags & FLAG_APME_IN_CTRL3) {  		if (adapter->flags & FLAG_APME_CHECK_PORT_B && diff --git a/drivers/net/fec.c b/drivers/net/fec.c index 2a71373719a..cd0282d5d40 100644 --- a/drivers/net/fec.c +++ b/drivers/net/fec.c @@ -74,7 +74,8 @@ static struct platform_device_id fec_devtype[] = {  	}, {  		.name = "imx28-fec",  		.driver_data = FEC_QUIRK_ENET_MAC | FEC_QUIRK_SWAP_FRAME, -	} +	}, +	{ }  };  static unsigned char macaddr[ETH_ALEN]; diff --git a/drivers/net/igbvf/vf.c b/drivers/net/igbvf/vf.c index 74486a8b009..af3822f9ea9 100644 --- a/drivers/net/igbvf/vf.c +++ b/drivers/net/igbvf/vf.c @@ -220,7 +220,7 @@ static u32 e1000_hash_mc_addr_vf(struct e1000_hw *hw, u8 *mc_addr)   *  The parameter rar_count will usually be hw->mac.rar_entry_count   *  unless there are workarounds that change this.   **/ -void e1000_update_mc_addr_list_vf(struct e1000_hw *hw, +static void e1000_update_mc_addr_list_vf(struct e1000_hw *hw,                                    u8 *mc_addr_list, u32 mc_addr_count,                                    u32 rar_used_count, u32 rar_count)  { diff --git a/drivers/net/macb.c b/drivers/net/macb.c index f69e73e2191..79ccb54ab00 100644 --- a/drivers/net/macb.c +++ b/drivers/net/macb.c @@ -260,7 +260,7 @@ static int macb_mii_init(struct macb *bp)  	for (i = 0; i < PHY_MAX_ADDR; i++)  		bp->mii_bus->irq[i] = PHY_POLL; -	platform_set_drvdata(bp->dev, bp->mii_bus); +	dev_set_drvdata(&bp->dev->dev, bp->mii_bus);  	if (mdiobus_register(bp->mii_bus))  		goto err_out_free_mdio_irq; diff --git a/drivers/net/pcmcia/fmvj18x_cs.c b/drivers/net/pcmcia/fmvj18x_cs.c index 9226cda4d05..530ab5a10bd 100644 --- a/drivers/net/pcmcia/fmvj18x_cs.c +++ b/drivers/net/pcmcia/fmvj18x_cs.c @@ -691,6 +691,7 @@ static struct pcmcia_device_id fmvj18x_ids[] = {  	PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0105, 0x0e0a),  	PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0032, 0x0e01),  	PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0032, 0x0a05), +	PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0032, 0x0b05),  	PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0032, 0x1101),  	PCMCIA_DEVICE_NULL,  }; diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c index ef2133b16f8..7ffdb80adf4 100644 --- a/drivers/net/r8169.c +++ b/drivers/net/r8169.c @@ -25,6 +25,7 @@  #include <linux/dma-mapping.h>  #include <linux/pm_runtime.h>  #include <linux/firmware.h> +#include <linux/pci-aspm.h>  #include <asm/system.h>  #include <asm/io.h> @@ -3020,6 +3021,11 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)  	mii->reg_num_mask = 0x1f;  	mii->supports_gmii = !!(cfg->features & RTL_FEATURE_GMII); +	/* disable ASPM completely as that cause random device stop working +	 * problems as well as full system hangs for some PCIe devices users */ +	pci_disable_link_state(pdev, PCIE_LINK_STATE_L0S | PCIE_LINK_STATE_L1 | +				     PCIE_LINK_STATE_CLKPM); +  	/* enable device (incl. PCI PM wakeup and hotplug setup) */  	rc = pci_enable_device(pdev);  	if (rc < 0) { diff --git a/drivers/net/skge.c b/drivers/net/skge.c index 42daf98ba73..35b28f42d20 100644 --- a/drivers/net/skge.c +++ b/drivers/net/skge.c @@ -3856,9 +3856,6 @@ static struct net_device *skge_devinit(struct skge_hw *hw, int port,  	memcpy_fromio(dev->dev_addr, hw->regs + B2_MAC_1 + port*8, ETH_ALEN);  	memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len); -	/* device is off until link detection */ -	netif_carrier_off(dev); -  	return dev;  } diff --git a/drivers/net/wireless/ath/ath9k/hif_usb.c b/drivers/net/wireless/ath/ath9k/hif_usb.c index 5ab3084eb9c..07b1633b7f3 100644 --- a/drivers/net/wireless/ath/ath9k/hif_usb.c +++ b/drivers/net/wireless/ath/ath9k/hif_usb.c @@ -219,8 +219,9 @@ static int __hif_usb_tx(struct hif_device_usb *hif_dev)  	struct tx_buf *tx_buf = NULL;  	struct sk_buff *nskb = NULL;  	int ret = 0, i; -	u16 *hdr, tx_skb_cnt = 0; +	u16 tx_skb_cnt = 0;  	u8 *buf; +	__le16 *hdr;  	if (hif_dev->tx.tx_skb_cnt == 0)  		return 0; @@ -245,9 +246,9 @@ static int __hif_usb_tx(struct hif_device_usb *hif_dev)  		buf = tx_buf->buf;  		buf += tx_buf->offset; -		hdr = (u16 *)buf; -		*hdr++ = nskb->len; -		*hdr++ = ATH_USB_TX_STREAM_MODE_TAG; +		hdr = (__le16 *)buf; +		*hdr++ = cpu_to_le16(nskb->len); +		*hdr++ = cpu_to_le16(ATH_USB_TX_STREAM_MODE_TAG);  		buf += 4;  		memcpy(buf, nskb->data, nskb->len);  		tx_buf->len = nskb->len + 4; diff --git a/drivers/net/wireless/ath/ath9k/mac.c b/drivers/net/wireless/ath/ath9k/mac.c index 180170d3ce2..2915b11edef 100644 --- a/drivers/net/wireless/ath/ath9k/mac.c +++ b/drivers/net/wireless/ath/ath9k/mac.c @@ -885,7 +885,7 @@ void ath9k_hw_set_interrupts(struct ath_hw *ah, enum ath9k_int ints)  	struct ath_common *common = ath9k_hw_common(ah);  	if (!(ints & ATH9K_INT_GLOBAL)) -		ath9k_hw_enable_interrupts(ah); +		ath9k_hw_disable_interrupts(ah);  	ath_dbg(common, ATH_DBG_INTERRUPT, "0x%x => 0x%x\n", omask, ints); @@ -963,7 +963,8 @@ void ath9k_hw_set_interrupts(struct ath_hw *ah, enum ath9k_int ints)  			REG_CLR_BIT(ah, AR_IMR_S5, AR_IMR_S5_TIM_TIMER);  	} -	ath9k_hw_enable_interrupts(ah); +	if (ints & ATH9K_INT_GLOBAL) +		ath9k_hw_enable_interrupts(ah);  	return;  } diff --git a/drivers/net/wireless/ath/carl9170/usb.c b/drivers/net/wireless/ath/carl9170/usb.c index 537732e5964..f82c400be28 100644 --- a/drivers/net/wireless/ath/carl9170/usb.c +++ b/drivers/net/wireless/ath/carl9170/usb.c @@ -118,6 +118,8 @@ static struct usb_device_id carl9170_usb_ids[] = {  	{ USB_DEVICE(0x057c, 0x8402) },  	/* Qwest/Actiontec 802AIN Wireless N USB Network Adapter */  	{ USB_DEVICE(0x1668, 0x1200) }, +	/* Airlive X.USB a/b/g/n */ +	{ USB_DEVICE(0x1b75, 0x9170) },  	/* terminate */  	{} diff --git a/drivers/net/wireless/iwlwifi/iwl-5000.c b/drivers/net/wireless/iwlwifi/iwl-5000.c index 79ab0a6b138..537fb8c84e3 100644 --- a/drivers/net/wireless/iwlwifi/iwl-5000.c +++ b/drivers/net/wireless/iwlwifi/iwl-5000.c @@ -51,7 +51,7 @@  #include "iwl-agn-debugfs.h"  /* Highest firmware API version supported */ -#define IWL5000_UCODE_API_MAX 2 +#define IWL5000_UCODE_API_MAX 5  #define IWL5150_UCODE_API_MAX 2  /* Lowest firmware API version supported */ diff --git a/drivers/net/wireless/p54/p54usb.c b/drivers/net/wireless/p54/p54usb.c index 21713a7638c..9b344a921e7 100644 --- a/drivers/net/wireless/p54/p54usb.c +++ b/drivers/net/wireless/p54/p54usb.c @@ -98,6 +98,7 @@ static struct usb_device_id p54u_table[] __devinitdata = {  	{USB_DEVICE(0x1413, 0x5400)},   /* Telsey 802.11g USB2.0 Adapter */  	{USB_DEVICE(0x1435, 0x0427)},	/* Inventel UR054G */  	{USB_DEVICE(0x1668, 0x1050)},	/* Actiontec 802UIG-1 */ +	{USB_DEVICE(0x1740, 0x1000)},	/* Senao NUB-350 */  	{USB_DEVICE(0x2001, 0x3704)},	/* DLink DWL-G122 rev A2 */  	{USB_DEVICE(0x2001, 0x3705)},	/* D-Link DWL-G120 rev C1 */  	{USB_DEVICE(0x413c, 0x5513)},	/* Dell WLA3310 USB Wireless Adapter */ diff --git a/drivers/net/wireless/rndis_wlan.c b/drivers/net/wireless/rndis_wlan.c index 848cc2cce24..518542b4bf9 100644 --- a/drivers/net/wireless/rndis_wlan.c +++ b/drivers/net/wireless/rndis_wlan.c @@ -2597,6 +2597,9 @@ static int rndis_set_power_mgmt(struct wiphy *wiphy, struct net_device *dev,  	__le32 mode;  	int ret; +	if (priv->device_type != RNDIS_BCM4320B) +		return -ENOTSUPP; +  	netdev_dbg(usbdev->net, "%s(): %s, %d\n", __func__,  				enabled ? "enabled" : "disabled",  				timeout); diff --git a/drivers/of/pdt.c b/drivers/of/pdt.c index 28295d0a50f..4d87b5dc928 100644 --- a/drivers/of/pdt.c +++ b/drivers/of/pdt.c @@ -36,19 +36,55 @@ unsigned int of_pdt_unique_id __initdata;  	(p)->unique_id = of_pdt_unique_id++; \  } while (0) -static inline const char *of_pdt_node_name(struct device_node *dp) +static char * __init of_pdt_build_full_name(struct device_node *dp)  { -	return dp->path_component_name; +	int len, ourlen, plen; +	char *n; + +	dp->path_component_name = build_path_component(dp); + +	plen = strlen(dp->parent->full_name); +	ourlen = strlen(dp->path_component_name); +	len = ourlen + plen + 2; + +	n = prom_early_alloc(len); +	strcpy(n, dp->parent->full_name); +	if (!of_node_is_root(dp->parent)) { +		strcpy(n + plen, "/"); +		plen++; +	} +	strcpy(n + plen, dp->path_component_name); + +	return n;  } -#else +#else /* CONFIG_SPARC */  static inline void of_pdt_incr_unique_id(void *p) { }  static inline void irq_trans_init(struct device_node *dp) { } -static inline const char *of_pdt_node_name(struct device_node *dp) +static char * __init of_pdt_build_full_name(struct device_node *dp)  { -	return dp->name; +	static int failsafe_id = 0; /* for generating unique names on failure */ +	char *buf; +	int len; + +	if (of_pdt_prom_ops->pkg2path(dp->phandle, NULL, 0, &len)) +		goto failsafe; + +	buf = prom_early_alloc(len + 1); +	if (of_pdt_prom_ops->pkg2path(dp->phandle, buf, len, &len)) +		goto failsafe; +	return buf; + + failsafe: +	buf = prom_early_alloc(strlen(dp->parent->full_name) + +			       strlen(dp->name) + 16); +	sprintf(buf, "%s/%s@unknown%i", +		of_node_is_root(dp->parent) ? "" : dp->parent->full_name, +		dp->name, failsafe_id++); +	pr_err("%s: pkg2path failed; assigning %s\n", __func__, buf); +	return buf;  }  #endif /* !CONFIG_SPARC */ @@ -132,47 +168,6 @@ static char * __init of_pdt_get_one_property(phandle node, const char *name)  	return buf;  } -static char * __init of_pdt_try_pkg2path(phandle node) -{ -	char *res, *buf = NULL; -	int len; - -	if (!of_pdt_prom_ops->pkg2path) -		return NULL; - -	if (of_pdt_prom_ops->pkg2path(node, buf, 0, &len)) -		return NULL; -	buf = prom_early_alloc(len + 1); -	if (of_pdt_prom_ops->pkg2path(node, buf, len, &len)) { -		pr_err("%s: package-to-path failed\n", __func__); -		return NULL; -	} - -	res = strrchr(buf, '/'); -	if (!res) { -		pr_err("%s: couldn't find / in %s\n", __func__, buf); -		return NULL; -	} -	return res+1; -} - -/* - * When fetching the node's name, first try using package-to-path; if - * that fails (either because the arch hasn't supplied a PROM callback, - * or some other random failure), fall back to just looking at the node's - * 'name' property. - */ -static char * __init of_pdt_build_name(phandle node) -{ -	char *buf; - -	buf = of_pdt_try_pkg2path(node); -	if (!buf) -		buf = of_pdt_get_one_property(node, "name"); - -	return buf; -} -  static struct device_node * __init of_pdt_create_node(phandle node,  						    struct device_node *parent)  { @@ -187,7 +182,7 @@ static struct device_node * __init of_pdt_create_node(phandle node,  	kref_init(&dp->kref); -	dp->name = of_pdt_build_name(node); +	dp->name = of_pdt_get_one_property(node, "name");  	dp->type = of_pdt_get_one_property(node, "device_type");  	dp->phandle = node; @@ -198,26 +193,6 @@ static struct device_node * __init of_pdt_create_node(phandle node,  	return dp;  } -static char * __init of_pdt_build_full_name(struct device_node *dp) -{ -	int len, ourlen, plen; -	char *n; - -	plen = strlen(dp->parent->full_name); -	ourlen = strlen(of_pdt_node_name(dp)); -	len = ourlen + plen + 2; - -	n = prom_early_alloc(len); -	strcpy(n, dp->parent->full_name); -	if (!of_node_is_root(dp->parent)) { -		strcpy(n + plen, "/"); -		plen++; -	} -	strcpy(n + plen, of_pdt_node_name(dp)); - -	return n; -} -  static struct device_node * __init of_pdt_build_tree(struct device_node *parent,  						   phandle node,  						   struct device_node ***nextp) @@ -240,9 +215,6 @@ static struct device_node * __init of_pdt_build_tree(struct device_node *parent,  		*(*nextp) = dp;  		*nextp = &dp->allnext; -#if defined(CONFIG_SPARC) -		dp->path_component_name = build_path_component(dp); -#endif  		dp->full_name = of_pdt_build_full_name(dp);  		dp->child = of_pdt_build_tree(dp, diff --git a/drivers/pcmcia/pxa2xx_colibri.c b/drivers/pcmcia/pxa2xx_colibri.c index c3f72192af6..a52039564e7 100644 --- a/drivers/pcmcia/pxa2xx_colibri.c +++ b/drivers/pcmcia/pxa2xx_colibri.c @@ -181,6 +181,9 @@ static int __init colibri_pcmcia_init(void)  {  	int ret; +	if (!machine_is_colibri() && !machine_is_colibri320()) +		return -ENODEV; +  	colibri_pcmcia_device = platform_device_alloc("pxa2xx-pcmcia", -1);  	if (!colibri_pcmcia_device)  		return -ENOMEM; diff --git a/drivers/pps/generators/Kconfig b/drivers/pps/generators/Kconfig index f3a73dd7766..e4c4f3dc072 100644 --- a/drivers/pps/generators/Kconfig +++ b/drivers/pps/generators/Kconfig @@ -6,7 +6,7 @@ comment "PPS generators support"  config PPS_GENERATOR_PARPORT  	tristate "Parallel port PPS signal generator" -	depends on PARPORT +	depends on PARPORT && BROKEN  	help  	  If you say yes here you get support for a PPS signal generator which  	  utilizes STROBE pin of a parallel port to send PPS signals. It uses diff --git a/drivers/rtc/rtc-s3c.c b/drivers/rtc/rtc-s3c.c index cf953ecbfca..b80fa288240 100644 --- a/drivers/rtc/rtc-s3c.c +++ b/drivers/rtc/rtc-s3c.c @@ -77,18 +77,20 @@ static irqreturn_t s3c_rtc_tickirq(int irq, void *id)  }  /* Update control registers */ -static void s3c_rtc_setaie(int to) +static int s3c_rtc_setaie(struct device *dev, unsigned int enabled)  {  	unsigned int tmp; -	pr_debug("%s: aie=%d\n", __func__, to); +	pr_debug("%s: aie=%d\n", __func__, enabled);  	tmp = readb(s3c_rtc_base + S3C2410_RTCALM) & ~S3C2410_RTCALM_ALMEN; -	if (to) +	if (enabled)  		tmp |= S3C2410_RTCALM_ALMEN;  	writeb(tmp, s3c_rtc_base + S3C2410_RTCALM); + +	return 0;  }  static int s3c_rtc_setpie(struct device *dev, int enabled) @@ -308,7 +310,7 @@ static int s3c_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm)  	writeb(alrm_en, base + S3C2410_RTCALM); -	s3c_rtc_setaie(alrm->enabled); +	s3c_rtc_setaie(dev, alrm->enabled);  	return 0;  } @@ -440,7 +442,7 @@ static int __devexit s3c_rtc_remove(struct platform_device *dev)  	rtc_device_unregister(rtc);  	s3c_rtc_setpie(&dev->dev, 0); -	s3c_rtc_setaie(0); +	s3c_rtc_setaie(&dev->dev, 0);  	clk_disable(rtc_clk);  	clk_put(rtc_clk); diff --git a/drivers/s390/block/xpram.c b/drivers/s390/block/xpram.c index c881a14fa5d..1f6a4d894e7 100644 --- a/drivers/s390/block/xpram.c +++ b/drivers/s390/block/xpram.c @@ -62,8 +62,8 @@ static int xpram_devs;  /*   * Parameter parsing functions.   */ -static int __initdata devs = XPRAM_DEVS; -static char __initdata *sizes[XPRAM_MAX_DEVS]; +static int devs = XPRAM_DEVS; +static char *sizes[XPRAM_MAX_DEVS];  module_param(devs, int, 0);  module_param_array(sizes, charp, NULL, 0); diff --git a/drivers/s390/char/keyboard.c b/drivers/s390/char/keyboard.c index 8cd58e412b5..5ad44daef73 100644 --- a/drivers/s390/char/keyboard.c +++ b/drivers/s390/char/keyboard.c @@ -460,7 +460,8 @@ kbd_ioctl(struct kbd_data *kbd, struct file *file,  	  unsigned int cmd, unsigned long arg)  {  	void __user *argp; -	int ct, perm; +	unsigned int ct; +	int perm;  	argp = (void __user *)arg; diff --git a/drivers/s390/char/tape.h b/drivers/s390/char/tape.h index 7a242f07363..267b54e8ff5 100644 --- a/drivers/s390/char/tape.h +++ b/drivers/s390/char/tape.h @@ -280,6 +280,14 @@ tape_do_io_free(struct tape_device *device, struct tape_request *request)  	return rc;  } +static inline void +tape_do_io_async_free(struct tape_device *device, struct tape_request *request) +{ +	request->callback = (void *) tape_free_request; +	request->callback_data = NULL; +	tape_do_io_async(device, request); +} +  extern int tape_oper_handler(int irq, int status);  extern void tape_noper_handler(int irq, int status);  extern int tape_open(struct tape_device *); diff --git a/drivers/s390/char/tape_34xx.c b/drivers/s390/char/tape_34xx.c index c17f35b6136..c26511171ff 100644 --- a/drivers/s390/char/tape_34xx.c +++ b/drivers/s390/char/tape_34xx.c @@ -53,23 +53,11 @@ static void tape_34xx_delete_sbid_from(struct tape_device *, int);   * Medium sense for 34xx tapes. There is no 'real' medium sense call.   * So we just do a normal sense.   */ -static int -tape_34xx_medium_sense(struct tape_device *device) +static void __tape_34xx_medium_sense(struct tape_request *request)  { -	struct tape_request *request; -	unsigned char       *sense; -	int                  rc; - -	request = tape_alloc_request(1, 32); -	if (IS_ERR(request)) { -		DBF_EXCEPTION(6, "MSEN fail\n"); -		return PTR_ERR(request); -	} - -	request->op = TO_MSEN; -	tape_ccw_end(request->cpaddr, SENSE, 32, request->cpdata); +	struct tape_device *device = request->device; +	unsigned char *sense; -	rc = tape_do_io_interruptible(device, request);  	if (request->rc == 0) {  		sense = request->cpdata; @@ -88,15 +76,47 @@ tape_34xx_medium_sense(struct tape_device *device)  			device->tape_generic_status |= GMT_WR_PROT(~0);  		else  			device->tape_generic_status &= ~GMT_WR_PROT(~0); -	} else { +	} else  		DBF_EVENT(4, "tape_34xx: medium sense failed with rc=%d\n",  			request->rc); -	}  	tape_free_request(request); +} + +static int tape_34xx_medium_sense(struct tape_device *device) +{ +	struct tape_request *request; +	int rc; + +	request = tape_alloc_request(1, 32); +	if (IS_ERR(request)) { +		DBF_EXCEPTION(6, "MSEN fail\n"); +		return PTR_ERR(request); +	} +	request->op = TO_MSEN; +	tape_ccw_end(request->cpaddr, SENSE, 32, request->cpdata); +	rc = tape_do_io_interruptible(device, request); +	__tape_34xx_medium_sense(request);  	return rc;  } +static void tape_34xx_medium_sense_async(struct tape_device *device) +{ +	struct tape_request *request; + +	request = tape_alloc_request(1, 32); +	if (IS_ERR(request)) { +		DBF_EXCEPTION(6, "MSEN fail\n"); +		return; +	} + +	request->op = TO_MSEN; +	tape_ccw_end(request->cpaddr, SENSE, 32, request->cpdata); +	request->callback = (void *) __tape_34xx_medium_sense; +	request->callback_data = NULL; +	tape_do_io_async(device, request); +} +  struct tape_34xx_work {  	struct tape_device	*device;  	enum tape_op		 op; @@ -109,6 +129,9 @@ struct tape_34xx_work {   * is inserted but cannot call tape_do_io* from an interrupt context.   * Maybe that's useful for other actions we want to start from the   * interrupt handler. + * Note: the work handler is called by the system work queue. The tape + * commands started by the handler need to be asynchrounous, otherwise + * a deadlock can occur e.g. in case of a deferred cc=1 (see __tape_do_irq).   */  static void  tape_34xx_work_handler(struct work_struct *work) @@ -119,7 +142,7 @@ tape_34xx_work_handler(struct work_struct *work)  	switch(p->op) {  		case TO_MSEN: -			tape_34xx_medium_sense(device); +			tape_34xx_medium_sense_async(device);  			break;  		default:  			DBF_EVENT(3, "T34XX: internal error: unknown work\n"); diff --git a/drivers/s390/char/tape_3590.c b/drivers/s390/char/tape_3590.c index fbe361fcd2c..de2e99e0a71 100644 --- a/drivers/s390/char/tape_3590.c +++ b/drivers/s390/char/tape_3590.c @@ -329,17 +329,17 @@ out:  /*   * Enable encryption   */ -static int tape_3592_enable_crypt(struct tape_device *device) +static struct tape_request *__tape_3592_enable_crypt(struct tape_device *device)  {  	struct tape_request *request;  	char *data;  	DBF_EVENT(6, "tape_3592_enable_crypt\n");  	if (!crypt_supported(device)) -		return -ENOSYS; +		return ERR_PTR(-ENOSYS);  	request = tape_alloc_request(2, 72);  	if (IS_ERR(request)) -		return PTR_ERR(request); +		return request;  	data = request->cpdata;  	memset(data,0,72); @@ -354,23 +354,42 @@ static int tape_3592_enable_crypt(struct tape_device *device)  	request->op = TO_CRYPT_ON;  	tape_ccw_cc(request->cpaddr, MODE_SET_CB, 36, data);  	tape_ccw_end(request->cpaddr + 1, MODE_SET_CB, 36, data + 36); +	return request; +} + +static int tape_3592_enable_crypt(struct tape_device *device) +{ +	struct tape_request *request; + +	request = __tape_3592_enable_crypt(device); +	if (IS_ERR(request)) +		return PTR_ERR(request);  	return tape_do_io_free(device, request);  } +static void tape_3592_enable_crypt_async(struct tape_device *device) +{ +	struct tape_request *request; + +	request = __tape_3592_enable_crypt(device); +	if (!IS_ERR(request)) +		tape_do_io_async_free(device, request); +} +  /*   * Disable encryption   */ -static int tape_3592_disable_crypt(struct tape_device *device) +static struct tape_request *__tape_3592_disable_crypt(struct tape_device *device)  {  	struct tape_request *request;  	char *data;  	DBF_EVENT(6, "tape_3592_disable_crypt\n");  	if (!crypt_supported(device)) -		return -ENOSYS; +		return ERR_PTR(-ENOSYS);  	request = tape_alloc_request(2, 72);  	if (IS_ERR(request)) -		return PTR_ERR(request); +		return request;  	data = request->cpdata;  	memset(data,0,72); @@ -383,9 +402,28 @@ static int tape_3592_disable_crypt(struct tape_device *device)  	tape_ccw_cc(request->cpaddr, MODE_SET_CB, 36, data);  	tape_ccw_end(request->cpaddr + 1, MODE_SET_CB, 36, data + 36); +	return request; +} + +static int tape_3592_disable_crypt(struct tape_device *device) +{ +	struct tape_request *request; + +	request = __tape_3592_disable_crypt(device); +	if (IS_ERR(request)) +		return PTR_ERR(request);  	return tape_do_io_free(device, request);  } +static void tape_3592_disable_crypt_async(struct tape_device *device) +{ +	struct tape_request *request; + +	request = __tape_3592_disable_crypt(device); +	if (!IS_ERR(request)) +		tape_do_io_async_free(device, request); +} +  /*   * IOCTL: Set encryption status   */ @@ -457,8 +495,7 @@ tape_3590_ioctl(struct tape_device *device, unsigned int cmd, unsigned long arg)  /*   * SENSE Medium: Get Sense data about medium state   */ -static int -tape_3590_sense_medium(struct tape_device *device) +static int tape_3590_sense_medium(struct tape_device *device)  {  	struct tape_request *request; @@ -470,6 +507,18 @@ tape_3590_sense_medium(struct tape_device *device)  	return tape_do_io_free(device, request);  } +static void tape_3590_sense_medium_async(struct tape_device *device) +{ +	struct tape_request *request; + +	request = tape_alloc_request(1, 128); +	if (IS_ERR(request)) +		return; +	request->op = TO_MSEN; +	tape_ccw_end(request->cpaddr, MEDIUM_SENSE, 128, request->cpdata); +	tape_do_io_async_free(device, request); +} +  /*   * MTTELL: Tell block. Return the number of block relative to current file.   */ @@ -546,15 +595,14 @@ tape_3590_read_opposite(struct tape_device *device,   * 2. The attention msg is written to the "read subsystem data" buffer.   * In this case we probably should print it to the console.   */ -static int -tape_3590_read_attmsg(struct tape_device *device) +static void tape_3590_read_attmsg_async(struct tape_device *device)  {  	struct tape_request *request;  	char *buf;  	request = tape_alloc_request(3, 4096);  	if (IS_ERR(request)) -		return PTR_ERR(request); +		return;  	request->op = TO_READ_ATTMSG;  	buf = request->cpdata;  	buf[0] = PREP_RD_SS_DATA; @@ -562,12 +610,15 @@ tape_3590_read_attmsg(struct tape_device *device)  	tape_ccw_cc(request->cpaddr, PERFORM_SS_FUNC, 12, buf);  	tape_ccw_cc(request->cpaddr + 1, READ_SS_DATA, 4096 - 12, buf + 12);  	tape_ccw_end(request->cpaddr + 2, NOP, 0, NULL); -	return tape_do_io_free(device, request); +	tape_do_io_async_free(device, request);  }  /*   * These functions are used to schedule follow-up actions from within an   * interrupt context (like unsolicited interrupts). + * Note: the work handler is called by the system work queue. The tape + * commands started by the handler need to be asynchrounous, otherwise + * a deadlock can occur e.g. in case of a deferred cc=1 (see __tape_do_irq).   */  struct work_handler_data {  	struct tape_device *device; @@ -583,16 +634,16 @@ tape_3590_work_handler(struct work_struct *work)  	switch (p->op) {  	case TO_MSEN: -		tape_3590_sense_medium(p->device); +		tape_3590_sense_medium_async(p->device);  		break;  	case TO_READ_ATTMSG: -		tape_3590_read_attmsg(p->device); +		tape_3590_read_attmsg_async(p->device);  		break;  	case TO_CRYPT_ON: -		tape_3592_enable_crypt(p->device); +		tape_3592_enable_crypt_async(p->device);  		break;  	case TO_CRYPT_OFF: -		tape_3592_disable_crypt(p->device); +		tape_3592_disable_crypt_async(p->device);  		break;  	default:  		DBF_EVENT(3, "T3590: work handler undefined for " diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index 9045c52abd2..fb2bb35c62c 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c @@ -443,7 +443,7 @@ static void scsi_run_queue(struct request_queue *q)  					&sdev->request_queue->queue_flags);  		if (flagset)  			queue_flag_set(QUEUE_FLAG_REENTER, sdev->request_queue); -		__blk_run_queue(sdev->request_queue); +		__blk_run_queue(sdev->request_queue, false);  		if (flagset)  			queue_flag_clear(QUEUE_FLAG_REENTER, sdev->request_queue);  		spin_unlock(sdev->request_queue->queue_lock); diff --git a/drivers/scsi/scsi_transport_fc.c b/drivers/scsi/scsi_transport_fc.c index 998c01be323..5c3ccfc6b62 100644 --- a/drivers/scsi/scsi_transport_fc.c +++ b/drivers/scsi/scsi_transport_fc.c @@ -3829,7 +3829,7 @@ fc_bsg_goose_queue(struct fc_rport *rport)  		  !test_bit(QUEUE_FLAG_REENTER, &rport->rqst_q->queue_flags);  	if (flagset)  		queue_flag_set(QUEUE_FLAG_REENTER, rport->rqst_q); -	__blk_run_queue(rport->rqst_q); +	__blk_run_queue(rport->rqst_q, false);  	if (flagset)  		queue_flag_clear(QUEUE_FLAG_REENTER, rport->rqst_q);  	spin_unlock_irqrestore(rport->rqst_q->queue_lock, flags); diff --git a/drivers/tty/serial/serial_cs.c b/drivers/tty/serial/serial_cs.c index 93760b2ea17..1ef4df9bf7e 100644 --- a/drivers/tty/serial/serial_cs.c +++ b/drivers/tty/serial/serial_cs.c @@ -712,6 +712,7 @@ static struct pcmcia_device_id serial_ids[] = {  	PCMCIA_PFC_DEVICE_PROD_ID12(1, "Xircom", "CreditCard Ethernet+Modem II", 0x2e3ee845, 0xeca401bf),  	PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0032, 0x0e01),  	PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0032, 0x0a05), +	PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0032, 0x0b05),  	PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0032, 0x1101),  	PCMCIA_MFC_DEVICE_MANF_CARD(0, 0x0104, 0x0070),  	PCMCIA_MFC_DEVICE_MANF_CARD(1, 0x0101, 0x0562), diff --git a/drivers/usb/gadget/f_phonet.c b/drivers/usb/gadget/f_phonet.c index 3c6e1a05874..5e1495097ec 100644 --- a/drivers/usb/gadget/f_phonet.c +++ b/drivers/usb/gadget/f_phonet.c @@ -346,14 +346,19 @@ static void pn_rx_complete(struct usb_ep *ep, struct usb_request *req)  		if (unlikely(!skb))  			break; -		skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags, page, 0, -				req->actual); -		page = NULL; -		if (req->actual < req->length) { /* Last fragment */ +		if (skb->len == 0) { /* First fragment */  			skb->protocol = htons(ETH_P_PHONET);  			skb_reset_mac_header(skb); -			pskb_pull(skb, 1); +			/* Can't use pskb_pull() on page in IRQ */ +			memcpy(skb_put(skb, 1), page_address(page), 1); +		} + +		skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags, page, +				skb->len == 0, req->actual); +		page = NULL; + +		if (req->actual < req->length) { /* Last fragment */  			skb->dev = dev;  			dev->stats.rx_packets++;  			dev->stats.rx_bytes += skb->len; diff --git a/drivers/usb/host/ehci-xilinx-of.c b/drivers/usb/host/ehci-xilinx-of.c index e8f4f36fdf0..a6f21b891f6 100644 --- a/drivers/usb/host/ehci-xilinx-of.c +++ b/drivers/usb/host/ehci-xilinx-of.c @@ -29,6 +29,7 @@  #include <linux/of.h>  #include <linux/of_platform.h> +#include <linux/of_address.h>  /**   * ehci_xilinx_of_setup - Initialize the device for ehci_reset() diff --git a/drivers/video/backlight/ltv350qv.c b/drivers/video/backlight/ltv350qv.c index 8010aaeb5ad..dd0e84a9bd2 100644 --- a/drivers/video/backlight/ltv350qv.c +++ b/drivers/video/backlight/ltv350qv.c @@ -239,11 +239,15 @@ static int __devinit ltv350qv_probe(struct spi_device *spi)  	lcd->spi = spi;  	lcd->power = FB_BLANK_POWERDOWN;  	lcd->buffer = kzalloc(8, GFP_KERNEL); +	if (!lcd->buffer) { +		ret = -ENOMEM; +		goto out_free_lcd; +	}  	ld = lcd_device_register("ltv350qv", &spi->dev, lcd, <v_ops);  	if (IS_ERR(ld)) {  		ret = PTR_ERR(ld); -		goto out_free_lcd; +		goto out_free_buffer;  	}  	lcd->ld = ld; @@ -257,6 +261,8 @@ static int __devinit ltv350qv_probe(struct spi_device *spi)  out_unregister:  	lcd_device_unregister(ld); +out_free_buffer: +	kfree(lcd->buffer);  out_free_lcd:  	kfree(lcd);  	return ret; @@ -268,6 +274,7 @@ static int __devexit ltv350qv_remove(struct spi_device *spi)  	ltv350qv_power(lcd, FB_BLANK_POWERDOWN);  	lcd_device_unregister(lcd->ld); +	kfree(lcd->buffer);  	kfree(lcd);  	return 0; diff --git a/fs/ceph/dir.c b/fs/ceph/dir.c index f0aef787a10..099a58615b9 100644 --- a/fs/ceph/dir.c +++ b/fs/ceph/dir.c @@ -60,7 +60,6 @@ int ceph_init_dentry(struct dentry *dentry)  	}  	di->dentry = dentry;  	di->lease_session = NULL; -	di->parent_inode = igrab(dentry->d_parent->d_inode);  	dentry->d_fsdata = di;  	dentry->d_time = jiffies;  	ceph_dentry_lru_add(dentry); @@ -410,7 +409,7 @@ more:  	spin_lock(&inode->i_lock);  	if (ci->i_release_count == fi->dir_release_count) {  		dout(" marking %p complete\n", inode); -		ci->i_ceph_flags |= CEPH_I_COMPLETE; +		/* ci->i_ceph_flags |= CEPH_I_COMPLETE; */  		ci->i_max_offset = filp->f_pos;  	}  	spin_unlock(&inode->i_lock); @@ -497,6 +496,7 @@ struct dentry *ceph_finish_lookup(struct ceph_mds_request *req,  	/* .snap dir? */  	if (err == -ENOENT && +	    ceph_snap(parent) == CEPH_NOSNAP &&  	    strcmp(dentry->d_name.name,  		   fsc->mount_options->snapdir_name) == 0) {  		struct inode *inode = ceph_get_snapdir(parent); @@ -1030,28 +1030,8 @@ out_touch:  static void ceph_dentry_release(struct dentry *dentry)  {  	struct ceph_dentry_info *di = ceph_dentry(dentry); -	struct inode *parent_inode = NULL; -	u64 snapid = CEPH_NOSNAP; -	if (!IS_ROOT(dentry)) { -		parent_inode = di->parent_inode; -		if (parent_inode) -			snapid = ceph_snap(parent_inode); -	} -	dout("dentry_release %p parent %p\n", dentry, parent_inode); -	if (parent_inode && snapid != CEPH_SNAPDIR) { -		struct ceph_inode_info *ci = ceph_inode(parent_inode); - -		spin_lock(&parent_inode->i_lock); -		if (ci->i_shared_gen == di->lease_shared_gen || -		    snapid <= CEPH_MAXSNAP) { -			dout(" clearing %p complete (d_release)\n", -			     parent_inode); -			ci->i_ceph_flags &= ~CEPH_I_COMPLETE; -			ci->i_release_count++; -		} -		spin_unlock(&parent_inode->i_lock); -	} +	dout("dentry_release %p\n", dentry);  	if (di) {  		ceph_dentry_lru_del(dentry);  		if (di->lease_session) @@ -1059,8 +1039,6 @@ static void ceph_dentry_release(struct dentry *dentry)  		kmem_cache_free(ceph_dentry_cachep, di);  		dentry->d_fsdata = NULL;  	} -	if (parent_inode) -		iput(parent_inode);  }  static int ceph_snapdir_d_revalidate(struct dentry *dentry, diff --git a/fs/ceph/inode.c b/fs/ceph/inode.c index 5625463aa47..193bfa5e9cb 100644 --- a/fs/ceph/inode.c +++ b/fs/ceph/inode.c @@ -707,7 +707,7 @@ static int fill_inode(struct inode *inode,  		    (issued & CEPH_CAP_FILE_EXCL) == 0 &&  		    (ci->i_ceph_flags & CEPH_I_COMPLETE) == 0) {  			dout(" marking %p complete (empty)\n", inode); -			ci->i_ceph_flags |= CEPH_I_COMPLETE; +			/* ci->i_ceph_flags |= CEPH_I_COMPLETE; */  			ci->i_max_offset = 2;  		}  		break; diff --git a/fs/ceph/super.h b/fs/ceph/super.h index 88fcaa21b80..20b907d76ae 100644 --- a/fs/ceph/super.h +++ b/fs/ceph/super.h @@ -207,7 +207,6 @@ struct ceph_dentry_info {  	struct dentry *dentry;  	u64 time;  	u64 offset; -	struct inode *parent_inode;  };  struct ceph_inode_xattrs_info { diff --git a/fs/exofs/namei.c b/fs/exofs/namei.c index 264e95d0283..4d70db110cf 100644 --- a/fs/exofs/namei.c +++ b/fs/exofs/namei.c @@ -272,7 +272,6 @@ static int exofs_rename(struct inode *old_dir, struct dentry *old_dentry,  		new_de = exofs_find_entry(new_dir, new_dentry, &new_page);  		if (!new_de)  			goto out_dir; -		inode_inc_link_count(old_inode);  		err = exofs_set_link(new_dir, new_de, new_page, old_inode);  		new_inode->i_ctime = CURRENT_TIME;  		if (dir_de) @@ -286,12 +285,9 @@ static int exofs_rename(struct inode *old_dir, struct dentry *old_dentry,  			if (new_dir->i_nlink >= EXOFS_LINK_MAX)  				goto out_dir;  		} -		inode_inc_link_count(old_inode);  		err = exofs_add_link(new_dentry, old_inode); -		if (err) { -			inode_dec_link_count(old_inode); +		if (err)  			goto out_dir; -		}  		if (dir_de)  			inode_inc_link_count(new_dir);  	} @@ -299,7 +295,7 @@ static int exofs_rename(struct inode *old_dir, struct dentry *old_dentry,  	old_inode->i_ctime = CURRENT_TIME;  	exofs_delete_entry(old_de, old_page); -	inode_dec_link_count(old_inode); +	mark_inode_dirty(old_inode);  	if (dir_de) {  		err = exofs_set_link(old_inode, dir_de, dir_page, new_dir); diff --git a/fs/ext2/namei.c b/fs/ext2/namei.c index 2e1d8341d82..adb91855ccd 100644 --- a/fs/ext2/namei.c +++ b/fs/ext2/namei.c @@ -344,7 +344,6 @@ static int ext2_rename (struct inode * old_dir, struct dentry * old_dentry,  		new_de = ext2_find_entry (new_dir, &new_dentry->d_name, &new_page);  		if (!new_de)  			goto out_dir; -		inode_inc_link_count(old_inode);  		ext2_set_link(new_dir, new_de, new_page, old_inode, 1);  		new_inode->i_ctime = CURRENT_TIME_SEC;  		if (dir_de) @@ -356,12 +355,9 @@ static int ext2_rename (struct inode * old_dir, struct dentry * old_dentry,  			if (new_dir->i_nlink >= EXT2_LINK_MAX)  				goto out_dir;  		} -		inode_inc_link_count(old_inode);  		err = ext2_add_link(new_dentry, old_inode); -		if (err) { -			inode_dec_link_count(old_inode); +		if (err)  			goto out_dir; -		}  		if (dir_de)  			inode_inc_link_count(new_dir);  	} @@ -369,12 +365,11 @@ static int ext2_rename (struct inode * old_dir, struct dentry * old_dentry,  	/*  	 * Like most other Unix systems, set the ctime for inodes on a   	 * rename. -	 * inode_dec_link_count() will mark the inode dirty.  	 */  	old_inode->i_ctime = CURRENT_TIME_SEC; +	mark_inode_dirty(old_inode);  	ext2_delete_entry (old_de, old_page); -	inode_dec_link_count(old_inode);  	if (dir_de) {  		if (old_dir != new_dir) diff --git a/fs/hfs/dir.c b/fs/hfs/dir.c index afa66aaa223..b4d70b13be9 100644 --- a/fs/hfs/dir.c +++ b/fs/hfs/dir.c @@ -238,46 +238,22 @@ static int hfs_mkdir(struct inode *dir, struct dentry *dentry, int mode)  }  /* - * hfs_unlink() + * hfs_remove()   * - * This is the unlink() entry in the inode_operations structure for - * regular HFS directories.  The purpose is to delete an existing - * file, given the inode for the parent directory and the name - * (and its length) of the existing file. - */ -static int hfs_unlink(struct inode *dir, struct dentry *dentry) -{ -	struct inode *inode; -	int res; - -	inode = dentry->d_inode; -	res = hfs_cat_delete(inode->i_ino, dir, &dentry->d_name); -	if (res) -		return res; - -	drop_nlink(inode); -	hfs_delete_inode(inode); -	inode->i_ctime = CURRENT_TIME_SEC; -	mark_inode_dirty(inode); - -	return res; -} - -/* - * hfs_rmdir() + * This serves as both unlink() and rmdir() in the inode_operations + * structure for regular HFS directories.  The purpose is to delete + * an existing child, given the inode for the parent directory and + * the name (and its length) of the existing directory.   * - * This is the rmdir() entry in the inode_operations structure for - * regular HFS directories.  The purpose is to delete an existing - * directory, given the inode for the parent directory and the name - * (and its length) of the existing directory. + * HFS does not have hardlinks, so both rmdir and unlink set the + * link count to 0.  The only difference is the emptiness check.   */ -static int hfs_rmdir(struct inode *dir, struct dentry *dentry) +static int hfs_remove(struct inode *dir, struct dentry *dentry)  { -	struct inode *inode; +	struct inode *inode = dentry->d_inode;  	int res; -	inode = dentry->d_inode; -	if (inode->i_size != 2) +	if (S_ISDIR(inode->i_mode) && inode->i_size != 2)  		return -ENOTEMPTY;  	res = hfs_cat_delete(inode->i_ino, dir, &dentry->d_name);  	if (res) @@ -307,7 +283,7 @@ static int hfs_rename(struct inode *old_dir, struct dentry *old_dentry,  	/* Unlink destination if it already exists */  	if (new_dentry->d_inode) { -		res = hfs_unlink(new_dir, new_dentry); +		res = hfs_remove(new_dir, new_dentry);  		if (res)  			return res;  	} @@ -332,9 +308,9 @@ const struct file_operations hfs_dir_operations = {  const struct inode_operations hfs_dir_inode_operations = {  	.create		= hfs_create,  	.lookup		= hfs_lookup, -	.unlink		= hfs_unlink, +	.unlink		= hfs_remove,  	.mkdir		= hfs_mkdir, -	.rmdir		= hfs_rmdir, +	.rmdir		= hfs_remove,  	.rename		= hfs_rename,  	.setattr	= hfs_inode_setattr,  }; diff --git a/fs/minix/namei.c b/fs/minix/namei.c index ce7337ddfdb..6e6777f1b4b 100644 --- a/fs/minix/namei.c +++ b/fs/minix/namei.c @@ -213,7 +213,6 @@ static int minix_rename(struct inode * old_dir, struct dentry *old_dentry,  		new_de = minix_find_entry(new_dentry, &new_page);  		if (!new_de)  			goto out_dir; -		inode_inc_link_count(old_inode);  		minix_set_link(new_de, new_page, old_inode);  		new_inode->i_ctime = CURRENT_TIME_SEC;  		if (dir_de) @@ -225,18 +224,15 @@ static int minix_rename(struct inode * old_dir, struct dentry *old_dentry,  			if (new_dir->i_nlink >= info->s_link_max)  				goto out_dir;  		} -		inode_inc_link_count(old_inode);  		err = minix_add_link(new_dentry, old_inode); -		if (err) { -			inode_dec_link_count(old_inode); +		if (err)  			goto out_dir; -		}  		if (dir_de)  			inode_inc_link_count(new_dir);  	}  	minix_delete_entry(old_de, old_page); -	inode_dec_link_count(old_inode); +	mark_inode_dirty(old_inode);  	if (dir_de) {  		minix_set_link(dir_de, dir_page, new_dir); diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index 78936a8f40a..1ff76acc7e9 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c @@ -51,6 +51,7 @@  #include <linux/sunrpc/bc_xprt.h>  #include <linux/xattr.h>  #include <linux/utsname.h> +#include <linux/mm.h>  #include "nfs4_fs.h"  #include "delegation.h" @@ -3252,6 +3253,35 @@ static void buf_to_pages(const void *buf, size_t buflen,  	}  } +static int buf_to_pages_noslab(const void *buf, size_t buflen, +		struct page **pages, unsigned int *pgbase) +{ +	struct page *newpage, **spages; +	int rc = 0; +	size_t len; +	spages = pages; + +	do { +		len = min(PAGE_CACHE_SIZE, buflen); +		newpage = alloc_page(GFP_KERNEL); + +		if (newpage == NULL) +			goto unwind; +		memcpy(page_address(newpage), buf, len); +                buf += len; +                buflen -= len; +		*pages++ = newpage; +		rc++; +	} while (buflen != 0); + +	return rc; + +unwind: +	for(; rc > 0; rc--) +		__free_page(spages[rc-1]); +	return -ENOMEM; +} +  struct nfs4_cached_acl {  	int cached;  	size_t len; @@ -3420,13 +3450,23 @@ static int __nfs4_proc_set_acl(struct inode *inode, const void *buf, size_t bufl  		.rpc_argp	= &arg,  		.rpc_resp	= &res,  	}; -	int ret; +	int ret, i;  	if (!nfs4_server_supports_acls(server))  		return -EOPNOTSUPP; +	i = buf_to_pages_noslab(buf, buflen, arg.acl_pages, &arg.acl_pgbase); +	if (i < 0) +		return i;  	nfs_inode_return_delegation(inode); -	buf_to_pages(buf, buflen, arg.acl_pages, &arg.acl_pgbase);  	ret = nfs4_call_sync(server, &msg, &arg, &res, 1); + +	/* +	 * Free each page after tx, so the only ref left is +	 * held by the network stack +	 */ +	for (; i > 0; i--) +		put_page(pages[i-1]); +  	/*  	 * Acl update can result in inode attribute update.  	 * so mark the attribute cache invalid. diff --git a/fs/nilfs2/namei.c b/fs/nilfs2/namei.c index 98034271cd0..161791d2645 100644 --- a/fs/nilfs2/namei.c +++ b/fs/nilfs2/namei.c @@ -397,7 +397,6 @@ static int nilfs_rename(struct inode *old_dir, struct dentry *old_dentry,  		new_de = nilfs_find_entry(new_dir, &new_dentry->d_name, &new_page);  		if (!new_de)  			goto out_dir; -		inc_nlink(old_inode);  		nilfs_set_link(new_dir, new_de, new_page, old_inode);  		nilfs_mark_inode_dirty(new_dir);  		new_inode->i_ctime = CURRENT_TIME; @@ -411,13 +410,9 @@ static int nilfs_rename(struct inode *old_dir, struct dentry *old_dentry,  			if (new_dir->i_nlink >= NILFS_LINK_MAX)  				goto out_dir;  		} -		inc_nlink(old_inode);  		err = nilfs_add_link(new_dentry, old_inode); -		if (err) { -			drop_nlink(old_inode); -			nilfs_mark_inode_dirty(old_inode); +		if (err)  			goto out_dir; -		}  		if (dir_de) {  			inc_nlink(new_dir);  			nilfs_mark_inode_dirty(new_dir); @@ -431,7 +426,6 @@ static int nilfs_rename(struct inode *old_dir, struct dentry *old_dentry,  	old_inode->i_ctime = CURRENT_TIME;  	nilfs_delete_entry(old_de, old_page); -	drop_nlink(old_inode);  	if (dir_de) {  		nilfs_set_link(old_inode, dir_de, dir_page, new_dir); diff --git a/fs/nilfs2/segment.c b/fs/nilfs2/segment.c index 55ebae5c7f3..2de9f636792 100644 --- a/fs/nilfs2/segment.c +++ b/fs/nilfs2/segment.c @@ -430,7 +430,8 @@ static void nilfs_segctor_begin_finfo(struct nilfs_sc_info *sci,  	nilfs_segctor_map_segsum_entry(  		sci, &sci->sc_binfo_ptr, sizeof(struct nilfs_finfo)); -	if (inode->i_sb && !test_bit(NILFS_SC_HAVE_DELTA, &sci->sc_flags)) +	if (NILFS_I(inode)->i_root && +	    !test_bit(NILFS_SC_HAVE_DELTA, &sci->sc_flags))  		set_bit(NILFS_SC_HAVE_DELTA, &sci->sc_flags);  	/* skip finfo */  } diff --git a/fs/proc/proc_devtree.c b/fs/proc/proc_devtree.c index d9396a4fc7f..927cbd115e5 100644 --- a/fs/proc/proc_devtree.c +++ b/fs/proc/proc_devtree.c @@ -233,7 +233,7 @@ void __init proc_device_tree_init(void)  		return;  	root = of_find_node_by_path("/");  	if (root == NULL) { -		printk(KERN_ERR "/proc/device-tree: can't find root\n"); +		pr_debug("/proc/device-tree: can't find root\n");  		return;  	}  	proc_device_tree_add_node(root, proc_device_tree); diff --git a/fs/reiserfs/namei.c b/fs/reiserfs/namei.c index ba5f51ec345..68fdf45cc6c 100644 --- a/fs/reiserfs/namei.c +++ b/fs/reiserfs/namei.c @@ -771,7 +771,7 @@ static int reiserfs_mkdir(struct inode *dir, struct dentry *dentry, int mode)  					EMPTY_DIR_SIZE_V1 : EMPTY_DIR_SIZE,  					dentry, inode, &security);  	if (retval) { -		dir->i_nlink--; +		DEC_DIR_INODE_NLINK(dir)  		goto out_failed;  	} diff --git a/fs/sysv/namei.c b/fs/sysv/namei.c index b427b1208c2..e474fbcf8bd 100644 --- a/fs/sysv/namei.c +++ b/fs/sysv/namei.c @@ -245,7 +245,6 @@ static int sysv_rename(struct inode * old_dir, struct dentry * old_dentry,  		new_de = sysv_find_entry(new_dentry, &new_page);  		if (!new_de)  			goto out_dir; -		inode_inc_link_count(old_inode);  		sysv_set_link(new_de, new_page, old_inode);  		new_inode->i_ctime = CURRENT_TIME_SEC;  		if (dir_de) @@ -257,18 +256,15 @@ static int sysv_rename(struct inode * old_dir, struct dentry * old_dentry,  			if (new_dir->i_nlink >= SYSV_SB(new_dir->i_sb)->s_link_max)  				goto out_dir;  		} -		inode_inc_link_count(old_inode);  		err = sysv_add_link(new_dentry, old_inode); -		if (err) { -			inode_dec_link_count(old_inode); +		if (err)  			goto out_dir; -		}  		if (dir_de)  			inode_inc_link_count(new_dir);  	}  	sysv_delete_entry(old_de, old_page); -	inode_dec_link_count(old_inode); +	mark_inode_dirty(old_inode);  	if (dir_de) {  		sysv_set_link(dir_de, dir_page, new_dir); diff --git a/fs/udf/namei.c b/fs/udf/namei.c index 2be0f9eb86d..b7c338d5e9d 100644 --- a/fs/udf/namei.c +++ b/fs/udf/namei.c @@ -32,6 +32,8 @@  #include <linux/crc-itu-t.h>  #include <linux/exportfs.h> +enum { UDF_MAX_LINKS = 0xffff }; +  static inline int udf_match(int len1, const unsigned char *name1, int len2,  			    const unsigned char *name2)  { @@ -650,7 +652,7 @@ static int udf_mkdir(struct inode *dir, struct dentry *dentry, int mode)  	struct udf_inode_info *iinfo;  	err = -EMLINK; -	if (dir->i_nlink >= (256 << sizeof(dir->i_nlink)) - 1) +	if (dir->i_nlink >= UDF_MAX_LINKS)  		goto out;  	err = -EIO; @@ -1034,9 +1036,8 @@ static int udf_link(struct dentry *old_dentry, struct inode *dir,  	struct fileIdentDesc cfi, *fi;  	int err; -	if (inode->i_nlink >= (256 << sizeof(inode->i_nlink)) - 1) { +	if (inode->i_nlink >= UDF_MAX_LINKS)  		return -EMLINK; -	}  	fi = udf_add_entry(dir, dentry, &fibh, &cfi, &err);  	if (!fi) { @@ -1131,9 +1132,7 @@ static int udf_rename(struct inode *old_dir, struct dentry *old_dentry,  			goto end_rename;  		retval = -EMLINK; -		if (!new_inode && -			new_dir->i_nlink >= -				(256 << sizeof(new_dir->i_nlink)) - 1) +		if (!new_inode && new_dir->i_nlink >= UDF_MAX_LINKS)  			goto end_rename;  	}  	if (!nfi) { diff --git a/fs/ufs/namei.c b/fs/ufs/namei.c index 12f39b9e443..d6f681535eb 100644 --- a/fs/ufs/namei.c +++ b/fs/ufs/namei.c @@ -306,7 +306,6 @@ static int ufs_rename(struct inode *old_dir, struct dentry *old_dentry,  		new_de = ufs_find_entry(new_dir, &new_dentry->d_name, &new_page);  		if (!new_de)  			goto out_dir; -		inode_inc_link_count(old_inode);  		ufs_set_link(new_dir, new_de, new_page, old_inode);  		new_inode->i_ctime = CURRENT_TIME_SEC;  		if (dir_de) @@ -318,12 +317,9 @@ static int ufs_rename(struct inode *old_dir, struct dentry *old_dentry,  			if (new_dir->i_nlink >= UFS_LINK_MAX)  				goto out_dir;  		} -		inode_inc_link_count(old_inode);  		err = ufs_add_link(new_dentry, old_inode); -		if (err) { -			inode_dec_link_count(old_inode); +		if (err)  			goto out_dir; -		}  		if (dir_de)  			inode_inc_link_count(new_dir);  	} @@ -331,12 +327,11 @@ static int ufs_rename(struct inode *old_dir, struct dentry *old_dentry,  	/*  	 * Like most other Unix systems, set the ctime for inodes on a   	 * rename. -	 * inode_dec_link_count() will mark the inode dirty.  	 */  	old_inode->i_ctime = CURRENT_TIME_SEC;  	ufs_delete_entry(old_dir, old_de, old_page); -	inode_dec_link_count(old_inode); +	mark_inode_dirty(old_inode);  	if (dir_de) {  		ufs_set_link(old_inode, dir_de, dir_page, new_dir); diff --git a/fs/xfs/linux-2.6/xfs_ioctl.c b/fs/xfs/linux-2.6/xfs_ioctl.c index f5e2a19e0f8..0ca0e3c024d 100644 --- a/fs/xfs/linux-2.6/xfs_ioctl.c +++ b/fs/xfs/linux-2.6/xfs_ioctl.c @@ -695,14 +695,19 @@ xfs_ioc_fsgeometry_v1(  	xfs_mount_t		*mp,  	void			__user *arg)  { -	xfs_fsop_geom_v1_t	fsgeo; +	xfs_fsop_geom_t         fsgeo;  	int			error; -	error = xfs_fs_geometry(mp, (xfs_fsop_geom_t *)&fsgeo, 3); +	error = xfs_fs_geometry(mp, &fsgeo, 3);  	if (error)  		return -error; -	if (copy_to_user(arg, &fsgeo, sizeof(fsgeo))) +	/* +	 * Caller should have passed an argument of type +	 * xfs_fsop_geom_v1_t.  This is a proper subset of the +	 * xfs_fsop_geom_t that xfs_fs_geometry() fills in. +	 */ +	if (copy_to_user(arg, &fsgeo, sizeof(xfs_fsop_geom_v1_t)))  		return -XFS_ERROR(EFAULT);  	return 0;  } diff --git a/include/keys/rxrpc-type.h b/include/keys/rxrpc-type.h index 5cb86c307f5..fc487543381 100644 --- a/include/keys/rxrpc-type.h +++ b/include/keys/rxrpc-type.h @@ -99,7 +99,6 @@ struct rxrpc_key_token {   * structure of raw payloads passed to add_key() or instantiate key   */  struct rxrpc_key_data_v1 { -	u32		kif_version;		/* 1 */  	u16		security_index;  	u16		ticket_length;  	u32		expiry;			/* time_t */ diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 4d18ff34670..d5063e1b555 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -699,7 +699,7 @@ extern void blk_start_queue(struct request_queue *q);  extern void blk_stop_queue(struct request_queue *q);  extern void blk_sync_queue(struct request_queue *q);  extern void __blk_stop_queue(struct request_queue *q); -extern void __blk_run_queue(struct request_queue *); +extern void __blk_run_queue(struct request_queue *q, bool force_kblockd);  extern void blk_run_queue(struct request_queue *);  extern int blk_rq_map_user(struct request_queue *, struct request *,  			   struct rq_map_data *, void __user *, unsigned long, @@ -1088,7 +1088,6 @@ static inline void put_dev_sector(Sector p)  struct work_struct;  int kblockd_schedule_work(struct request_queue *q, struct work_struct *work); -int kblockd_schedule_delayed_work(struct request_queue *q, struct delayed_work *dwork, unsigned long delay);  #ifdef CONFIG_BLK_CGROUP  /* @@ -1136,7 +1135,6 @@ static inline uint64_t rq_io_start_time_ns(struct request *req)  extern int blk_throtl_init(struct request_queue *q);  extern void blk_throtl_exit(struct request_queue *q);  extern int blk_throtl_bio(struct request_queue *q, struct bio **bio); -extern void throtl_schedule_delayed_work(struct request_queue *q, unsigned long delay);  extern void throtl_shutdown_timer_wq(struct request_queue *q);  #else /* CONFIG_BLK_DEV_THROTTLING */  static inline int blk_throtl_bio(struct request_queue *q, struct bio **bio) @@ -1146,7 +1144,6 @@ static inline int blk_throtl_bio(struct request_queue *q, struct bio **bio)  static inline int blk_throtl_init(struct request_queue *q) { return 0; }  static inline int blk_throtl_exit(struct request_queue *q) { return 0; } -static inline void throtl_schedule_delayed_work(struct request_queue *q, unsigned long delay) {}  static inline void throtl_shutdown_timer_wq(struct request_queue *q) {}  #endif /* CONFIG_BLK_DEV_THROTTLING */ diff --git a/include/linux/blktrace_api.h b/include/linux/blktrace_api.h index 3395cf7130f..b22fb0d3db0 100644 --- a/include/linux/blktrace_api.h +++ b/include/linux/blktrace_api.h @@ -245,7 +245,6 @@ static inline int blk_cmd_buf_len(struct request *rq)  extern void blk_dump_cmd(char *buf, struct request *rq);  extern void blk_fill_rwbs(char *rwbs, u32 rw, int bytes); -extern void blk_fill_rwbs_rq(char *rwbs, struct request *rq);  #endif /* CONFIG_EVENT_TRACING && CONFIG_BLOCK */ diff --git a/include/linux/ceph/messenger.h b/include/linux/ceph/messenger.h index c3011beac30..31d91a64838 100644 --- a/include/linux/ceph/messenger.h +++ b/include/linux/ceph/messenger.h @@ -123,6 +123,7 @@ struct ceph_msg_pos {  #define SOCK_CLOSED	11 /* socket state changed to closed */  #define OPENING         13 /* open connection w/ (possibly new) peer */  #define DEAD            14 /* dead, about to kfree */ +#define BACKOFF         15  /*   * A single connection with another host. @@ -160,7 +161,6 @@ struct ceph_connection {  	struct list_head out_queue;  	struct list_head out_sent;   /* sending or sent but unacked */  	u64 out_seq;		     /* last message queued for send */ -	bool out_keepalive_pending;  	u64 in_seq, in_seq_acked;  /* last message received, acked */ diff --git a/include/linux/gfp.h b/include/linux/gfp.h index 0b84c61607e..dca31761b31 100644 --- a/include/linux/gfp.h +++ b/include/linux/gfp.h @@ -332,16 +332,19 @@ alloc_pages(gfp_t gfp_mask, unsigned int order)  	return alloc_pages_current(gfp_mask, order);  }  extern struct page *alloc_pages_vma(gfp_t gfp_mask, int order, -			struct vm_area_struct *vma, unsigned long addr); +			struct vm_area_struct *vma, unsigned long addr, +			int node);  #else  #define alloc_pages(gfp_mask, order) \  		alloc_pages_node(numa_node_id(), gfp_mask, order) -#define alloc_pages_vma(gfp_mask, order, vma, addr)	\ +#define alloc_pages_vma(gfp_mask, order, vma, addr, node)	\  	alloc_pages(gfp_mask, order)  #endif  #define alloc_page(gfp_mask) alloc_pages(gfp_mask, 0) -#define alloc_page_vma(gfp_mask, vma, addr)	\ -	alloc_pages_vma(gfp_mask, 0, vma, addr) +#define alloc_page_vma(gfp_mask, vma, addr)			\ +	alloc_pages_vma(gfp_mask, 0, vma, addr, numa_node_id()) +#define alloc_page_vma_node(gfp_mask, vma, addr, node)		\ +	alloc_pages_vma(gfp_mask, 0, vma, addr, node)  extern unsigned long __get_free_pages(gfp_t gfp_mask, unsigned int order);  extern unsigned long get_zeroed_page(gfp_t gfp_mask); diff --git a/include/linux/mfd/wm8994/core.h b/include/linux/mfd/wm8994/core.h index 3fd36845ca4..ef4f0b6083a 100644 --- a/include/linux/mfd/wm8994/core.h +++ b/include/linux/mfd/wm8994/core.h @@ -71,6 +71,7 @@ struct wm8994 {  	u16 irq_masks_cache[WM8994_NUM_IRQ_REGS];  	/* Used over suspend/resume */ +	bool suspended;  	u16 ldo_regs[WM8994_NUM_LDO_REGS];  	u16 gpio_regs[WM8994_NUM_GPIO_REGS]; diff --git a/include/linux/ptrace.h b/include/linux/ptrace.h index 092a04f874a..a1147e5dd24 100644 --- a/include/linux/ptrace.h +++ b/include/linux/ptrace.h @@ -102,11 +102,8 @@  extern long arch_ptrace(struct task_struct *child, long request,  			unsigned long addr, unsigned long data); -extern int ptrace_traceme(void);  extern int ptrace_readdata(struct task_struct *tsk, unsigned long src, char __user *dst, int len);  extern int ptrace_writedata(struct task_struct *tsk, char __user *src, unsigned long dst, int len); -extern int ptrace_attach(struct task_struct *tsk); -extern int ptrace_detach(struct task_struct *, unsigned int);  extern void ptrace_disable(struct task_struct *);  extern int ptrace_check_attach(struct task_struct *task, int kill);  extern int ptrace_request(struct task_struct *child, long request, diff --git a/include/trace/events/block.h b/include/trace/events/block.h index aba421d68f6..78f18adb49c 100644 --- a/include/trace/events/block.h +++ b/include/trace/events/block.h @@ -31,7 +31,7 @@ DECLARE_EVENT_CLASS(block_rq_with_error,  					0 : blk_rq_sectors(rq);  		__entry->errors    = rq->errors; -		blk_fill_rwbs_rq(__entry->rwbs, rq); +		blk_fill_rwbs(__entry->rwbs, rq->cmd_flags, blk_rq_bytes(rq));  		blk_dump_cmd(__get_str(cmd), rq);  	), @@ -118,7 +118,7 @@ DECLARE_EVENT_CLASS(block_rq,  		__entry->bytes     = (rq->cmd_type == REQ_TYPE_BLOCK_PC) ?  					blk_rq_bytes(rq) : 0; -		blk_fill_rwbs_rq(__entry->rwbs, rq); +		blk_fill_rwbs(__entry->rwbs, rq->cmd_flags, blk_rq_bytes(rq));  		blk_dump_cmd(__get_str(cmd), rq);  		memcpy(__entry->comm, current->comm, TASK_COMM_LEN);  	), @@ -563,7 +563,7 @@ TRACE_EVENT(block_rq_remap,  		__entry->nr_sector	= blk_rq_sectors(rq);  		__entry->old_dev	= dev;  		__entry->old_sector	= from; -		blk_fill_rwbs_rq(__entry->rwbs, rq); +		blk_fill_rwbs(__entry->rwbs, rq->cmd_flags, blk_rq_bytes(rq));  	),  	TP_printk("%d,%d %s %llu + %u <- (%d,%d) %llu", diff --git a/kernel/cpuset.c b/kernel/cpuset.c index 4349935c2ad..e92e9818903 100644 --- a/kernel/cpuset.c +++ b/kernel/cpuset.c @@ -1575,8 +1575,10 @@ static int cpuset_write_resmask(struct cgroup *cgrp, struct cftype *cft,  		return -ENODEV;  	trialcs = alloc_trial_cpuset(cs); -	if (!trialcs) -		return -ENOMEM; +	if (!trialcs) { +		retval = -ENOMEM; +		goto out; +	}  	switch (cft->private) {  	case FILE_CPULIST: @@ -1591,6 +1593,7 @@ static int cpuset_write_resmask(struct cgroup *cgrp, struct cftype *cft,  	}  	free_trial_cpuset(trialcs); +out:  	cgroup_unlock();  	return retval;  } diff --git a/kernel/ptrace.c b/kernel/ptrace.c index 1708b1e2972..e2302e40b36 100644 --- a/kernel/ptrace.c +++ b/kernel/ptrace.c @@ -163,7 +163,7 @@ bool ptrace_may_access(struct task_struct *task, unsigned int mode)  	return !err;  } -int ptrace_attach(struct task_struct *task) +static int ptrace_attach(struct task_struct *task)  {  	int retval; @@ -219,7 +219,7 @@ out:   * Performs checks and sets PT_PTRACED.   * Should be used by all ptrace implementations for PTRACE_TRACEME.   */ -int ptrace_traceme(void) +static int ptrace_traceme(void)  {  	int ret = -EPERM; @@ -293,7 +293,7 @@ static bool __ptrace_detach(struct task_struct *tracer, struct task_struct *p)  	return false;  } -int ptrace_detach(struct task_struct *child, unsigned int data) +static int ptrace_detach(struct task_struct *child, unsigned int data)  {  	bool dead = false; diff --git a/kernel/trace/blktrace.c b/kernel/trace/blktrace.c index d95721f3370..cbafed7d4f3 100644 --- a/kernel/trace/blktrace.c +++ b/kernel/trace/blktrace.c @@ -1827,21 +1827,5 @@ void blk_fill_rwbs(char *rwbs, u32 rw, int bytes)  	rwbs[i] = '\0';  } -void blk_fill_rwbs_rq(char *rwbs, struct request *rq) -{ -	int rw = rq->cmd_flags & 0x03; -	int bytes; - -	if (rq->cmd_flags & REQ_DISCARD) -		rw |= REQ_DISCARD; - -	if (rq->cmd_flags & REQ_SECURE) -		rw |= REQ_SECURE; - -	bytes = blk_rq_bytes(rq); - -	blk_fill_rwbs(rwbs, rw, bytes); -} -  #endif /* CONFIG_EVENT_TRACING */ diff --git a/lib/nlattr.c b/lib/nlattr.c index 5021cbc3441..ac09f2226dc 100644 --- a/lib/nlattr.c +++ b/lib/nlattr.c @@ -148,7 +148,7 @@ nla_policy_len(const struct nla_policy *p, int n)  {  	int i, len = 0; -	for (i = 0; i < n; i++) { +	for (i = 0; i < n; i++, p++) {  		if (p->len)  			len += nla_total_size(p->len);  		else if (nla_attr_minlen[p->type]) diff --git a/mm/huge_memory.c b/mm/huge_memory.c index 3e29781ee76..dbe99a5f207 100644 --- a/mm/huge_memory.c +++ b/mm/huge_memory.c @@ -650,10 +650,10 @@ static inline gfp_t alloc_hugepage_gfpmask(int defrag)  static inline struct page *alloc_hugepage_vma(int defrag,  					      struct vm_area_struct *vma, -					      unsigned long haddr) +					      unsigned long haddr, int nd)  {  	return alloc_pages_vma(alloc_hugepage_gfpmask(defrag), -			       HPAGE_PMD_ORDER, vma, haddr); +			       HPAGE_PMD_ORDER, vma, haddr, nd);  }  #ifndef CONFIG_NUMA @@ -678,7 +678,7 @@ int do_huge_pmd_anonymous_page(struct mm_struct *mm, struct vm_area_struct *vma,  		if (unlikely(khugepaged_enter(vma)))  			return VM_FAULT_OOM;  		page = alloc_hugepage_vma(transparent_hugepage_defrag(vma), -					  vma, haddr); +					  vma, haddr, numa_node_id());  		if (unlikely(!page))  			goto out;  		if (unlikely(mem_cgroup_newpage_charge(page, mm, GFP_KERNEL))) { @@ -799,8 +799,8 @@ static int do_huge_pmd_wp_page_fallback(struct mm_struct *mm,  	}  	for (i = 0; i < HPAGE_PMD_NR; i++) { -		pages[i] = alloc_page_vma(GFP_HIGHUSER_MOVABLE, -					  vma, address); +		pages[i] = alloc_page_vma_node(GFP_HIGHUSER_MOVABLE, +					       vma, address, page_to_nid(page));  		if (unlikely(!pages[i] ||  			     mem_cgroup_newpage_charge(pages[i], mm,  						       GFP_KERNEL))) { @@ -902,7 +902,7 @@ int do_huge_pmd_wp_page(struct mm_struct *mm, struct vm_area_struct *vma,  	if (transparent_hugepage_enabled(vma) &&  	    !transparent_hugepage_debug_cow())  		new_page = alloc_hugepage_vma(transparent_hugepage_defrag(vma), -					      vma, haddr); +					      vma, haddr, numa_node_id());  	else  		new_page = NULL; @@ -1745,7 +1745,8 @@ static void __collapse_huge_page_copy(pte_t *pte, struct page *page,  static void collapse_huge_page(struct mm_struct *mm,  			       unsigned long address,  			       struct page **hpage, -			       struct vm_area_struct *vma) +			       struct vm_area_struct *vma, +			       int node)  {  	pgd_t *pgd;  	pud_t *pud; @@ -1773,7 +1774,8 @@ static void collapse_huge_page(struct mm_struct *mm,  	 * mmap_sem in read mode is good idea also to allow greater  	 * scalability.  	 */ -	new_page = alloc_hugepage_vma(khugepaged_defrag(), vma, address); +	new_page = alloc_hugepage_vma(khugepaged_defrag(), vma, address, +				      node);  	if (unlikely(!new_page)) {  		up_read(&mm->mmap_sem);  		*hpage = ERR_PTR(-ENOMEM); @@ -1919,6 +1921,7 @@ static int khugepaged_scan_pmd(struct mm_struct *mm,  	struct page *page;  	unsigned long _address;  	spinlock_t *ptl; +	int node = -1;  	VM_BUG_ON(address & ~HPAGE_PMD_MASK); @@ -1949,6 +1952,13 @@ static int khugepaged_scan_pmd(struct mm_struct *mm,  		page = vm_normal_page(vma, _address, pteval);  		if (unlikely(!page))  			goto out_unmap; +		/* +		 * Chose the node of the first page. This could +		 * be more sophisticated and look at more pages, +		 * but isn't for now. +		 */ +		if (node == -1) +			node = page_to_nid(page);  		VM_BUG_ON(PageCompound(page));  		if (!PageLRU(page) || PageLocked(page) || !PageAnon(page))  			goto out_unmap; @@ -1965,7 +1975,7 @@ out_unmap:  	pte_unmap_unlock(pte, ptl);  	if (ret)  		/* collapse_huge_page will return with the mmap_sem released */ -		collapse_huge_page(mm, address, hpage, vma); +		collapse_huge_page(mm, address, hpage, vma, node);  out:  	return ret;  } diff --git a/mm/mempolicy.c b/mm/mempolicy.c index 49355a970be..b53ec99f142 100644 --- a/mm/mempolicy.c +++ b/mm/mempolicy.c @@ -1524,10 +1524,9 @@ static nodemask_t *policy_nodemask(gfp_t gfp, struct mempolicy *policy)  }  /* Return a zonelist indicated by gfp for node representing a mempolicy */ -static struct zonelist *policy_zonelist(gfp_t gfp, struct mempolicy *policy) +static struct zonelist *policy_zonelist(gfp_t gfp, struct mempolicy *policy, +	int nd)  { -	int nd = numa_node_id(); -  	switch (policy->mode) {  	case MPOL_PREFERRED:  		if (!(policy->flags & MPOL_F_LOCAL)) @@ -1679,7 +1678,7 @@ struct zonelist *huge_zonelist(struct vm_area_struct *vma, unsigned long addr,  		zl = node_zonelist(interleave_nid(*mpol, vma, addr,  				huge_page_shift(hstate_vma(vma))), gfp_flags);  	} else { -		zl = policy_zonelist(gfp_flags, *mpol); +		zl = policy_zonelist(gfp_flags, *mpol, numa_node_id());  		if ((*mpol)->mode == MPOL_BIND)  			*nodemask = &(*mpol)->v.nodes;  	} @@ -1820,7 +1819,7 @@ static struct page *alloc_page_interleave(gfp_t gfp, unsigned order,   */  struct page *  alloc_pages_vma(gfp_t gfp, int order, struct vm_area_struct *vma, -		unsigned long addr) +		unsigned long addr, int node)  {  	struct mempolicy *pol = get_vma_policy(current, vma, addr);  	struct zonelist *zl; @@ -1836,7 +1835,7 @@ alloc_pages_vma(gfp_t gfp, int order, struct vm_area_struct *vma,  		put_mems_allowed();  		return page;  	} -	zl = policy_zonelist(gfp, pol); +	zl = policy_zonelist(gfp, pol, node);  	if (unlikely(mpol_needs_cond_ref(pol))) {  		/*  		 * slow path: ref counted shared policy @@ -1892,7 +1891,8 @@ struct page *alloc_pages_current(gfp_t gfp, unsigned order)  		page = alloc_page_interleave(gfp, order, interleave_nodes(pol));  	else  		page = __alloc_pages_nodemask(gfp, order, -			policy_zonelist(gfp, pol), policy_nodemask(gfp, pol)); +				policy_zonelist(gfp, pol, numa_node_id()), +				policy_nodemask(gfp, pol));  	put_mems_allowed();  	return page;  } diff --git a/net/ceph/messenger.c b/net/ceph/messenger.c index 35b36b86d76..05f357828a2 100644 --- a/net/ceph/messenger.c +++ b/net/ceph/messenger.c @@ -336,7 +336,6 @@ static void reset_connection(struct ceph_connection *con)  		ceph_msg_put(con->out_msg);  		con->out_msg = NULL;  	} -	con->out_keepalive_pending = false;  	con->in_seq = 0;  	con->in_seq_acked = 0;  } @@ -1248,8 +1247,6 @@ static int process_connect(struct ceph_connection *con)  		     con->auth_retry);  		if (con->auth_retry == 2) {  			con->error_msg = "connect authorization failure"; -			reset_connection(con); -			set_bit(CLOSED, &con->state);  			return -1;  		}  		con->auth_retry = 1; @@ -1715,14 +1712,6 @@ more:  	/* open the socket first? */  	if (con->sock == NULL) { -		/* -		 * if we were STANDBY and are reconnecting _this_ -		 * connection, bump connect_seq now.  Always bump -		 * global_seq. -		 */ -		if (test_and_clear_bit(STANDBY, &con->state)) -			con->connect_seq++; -  		prepare_write_banner(msgr, con);  		prepare_write_connect(msgr, con, 1);  		prepare_read_banner(con); @@ -1951,7 +1940,24 @@ static void con_work(struct work_struct *work)  						   work.work);  	mutex_lock(&con->mutex); +	if (test_and_clear_bit(BACKOFF, &con->state)) { +		dout("con_work %p backing off\n", con); +		if (queue_delayed_work(ceph_msgr_wq, &con->work, +				       round_jiffies_relative(con->delay))) { +			dout("con_work %p backoff %lu\n", con, con->delay); +			mutex_unlock(&con->mutex); +			return; +		} else { +			con->ops->put(con); +			dout("con_work %p FAILED to back off %lu\n", con, +			     con->delay); +		} +	} +	if (test_bit(STANDBY, &con->state)) { +		dout("con_work %p STANDBY\n", con); +		goto done; +	}  	if (test_bit(CLOSED, &con->state)) { /* e.g. if we are replaced */  		dout("con_work CLOSED\n");  		con_close_socket(con); @@ -2008,10 +2014,12 @@ static void ceph_fault(struct ceph_connection *con)  	/* Requeue anything that hasn't been acked */  	list_splice_init(&con->out_sent, &con->out_queue); -	/* If there are no messages in the queue, place the connection -	 * in a STANDBY state (i.e., don't try to reconnect just yet). */ -	if (list_empty(&con->out_queue) && !con->out_keepalive_pending) { -		dout("fault setting STANDBY\n"); +	/* If there are no messages queued or keepalive pending, place +	 * the connection in a STANDBY state */ +	if (list_empty(&con->out_queue) && +	    !test_bit(KEEPALIVE_PENDING, &con->state)) { +		dout("fault %p setting STANDBY clearing WRITE_PENDING\n", con); +		clear_bit(WRITE_PENDING, &con->state);  		set_bit(STANDBY, &con->state);  	} else {  		/* retry after a delay. */ @@ -2019,11 +2027,24 @@ static void ceph_fault(struct ceph_connection *con)  			con->delay = BASE_DELAY_INTERVAL;  		else if (con->delay < MAX_DELAY_INTERVAL)  			con->delay *= 2; -		dout("fault queueing %p delay %lu\n", con, con->delay);  		con->ops->get(con);  		if (queue_delayed_work(ceph_msgr_wq, &con->work, -				       round_jiffies_relative(con->delay)) == 0) +				       round_jiffies_relative(con->delay))) { +			dout("fault queued %p delay %lu\n", con, con->delay); +		} else {  			con->ops->put(con); +			dout("fault failed to queue %p delay %lu, backoff\n", +			     con, con->delay); +			/* +			 * In many cases we see a socket state change +			 * while con_work is running and end up +			 * queuing (non-delayed) work, such that we +			 * can't backoff with a delay.  Set a flag so +			 * that when con_work restarts we schedule the +			 * delay then. +			 */ +			set_bit(BACKOFF, &con->state); +		}  	}  out_unlock: @@ -2094,6 +2115,19 @@ void ceph_messenger_destroy(struct ceph_messenger *msgr)  }  EXPORT_SYMBOL(ceph_messenger_destroy); +static void clear_standby(struct ceph_connection *con) +{ +	/* come back from STANDBY? */ +	if (test_and_clear_bit(STANDBY, &con->state)) { +		mutex_lock(&con->mutex); +		dout("clear_standby %p and ++connect_seq\n", con); +		con->connect_seq++; +		WARN_ON(test_bit(WRITE_PENDING, &con->state)); +		WARN_ON(test_bit(KEEPALIVE_PENDING, &con->state)); +		mutex_unlock(&con->mutex); +	} +} +  /*   * Queue up an outgoing message on the given connection.   */ @@ -2126,6 +2160,7 @@ void ceph_con_send(struct ceph_connection *con, struct ceph_msg *msg)  	/* if there wasn't anything waiting to send before, queue  	 * new work */ +	clear_standby(con);  	if (test_and_set_bit(WRITE_PENDING, &con->state) == 0)  		queue_con(con);  } @@ -2191,6 +2226,8 @@ void ceph_con_revoke_message(struct ceph_connection *con, struct ceph_msg *msg)   */  void ceph_con_keepalive(struct ceph_connection *con)  { +	dout("con_keepalive %p\n", con); +	clear_standby(con);  	if (test_and_set_bit(KEEPALIVE_PENDING, &con->state) == 0 &&  	    test_and_set_bit(WRITE_PENDING, &con->state) == 0)  		queue_con(con); diff --git a/net/ceph/pagevec.c b/net/ceph/pagevec.c index 1a040e64c69..cd9c21df87d 100644 --- a/net/ceph/pagevec.c +++ b/net/ceph/pagevec.c @@ -16,22 +16,30 @@ struct page **ceph_get_direct_page_vector(const char __user *data,  					  int num_pages, bool write_page)  {  	struct page **pages; -	int rc; +	int got = 0; +	int rc = 0;  	pages = kmalloc(sizeof(*pages) * num_pages, GFP_NOFS);  	if (!pages)  		return ERR_PTR(-ENOMEM);  	down_read(¤t->mm->mmap_sem); -	rc = get_user_pages(current, current->mm, (unsigned long)data, -			    num_pages, write_page, 0, pages, NULL); +	while (got < num_pages) { +		rc = get_user_pages(current, current->mm, +		    (unsigned long)data + ((unsigned long)got * PAGE_SIZE), +		    num_pages - got, write_page, 0, pages + got, NULL); +		if (rc < 0) +			break; +		BUG_ON(rc == 0); +		got += rc; +	}  	up_read(¤t->mm->mmap_sem); -	if (rc < num_pages) +	if (rc < 0)  		goto fail;  	return pages;  fail: -	ceph_put_page_vector(pages, rc > 0 ? rc : 0, false); +	ceph_put_page_vector(pages, got, false);  	return ERR_PTR(rc);  }  EXPORT_SYMBOL(ceph_get_direct_page_vector); diff --git a/net/core/dev_addr_lists.c b/net/core/dev_addr_lists.c index 508f9c18992..133fd22ea28 100644 --- a/net/core/dev_addr_lists.c +++ b/net/core/dev_addr_lists.c @@ -144,7 +144,7 @@ void __hw_addr_del_multiple(struct netdev_hw_addr_list *to_list,  	list_for_each_entry(ha, &from_list->list, list) {  		type = addr_type ? addr_type : ha->type; -		__hw_addr_del(to_list, ha->addr, addr_len, addr_type); +		__hw_addr_del(to_list, ha->addr, addr_len, type);  	}  }  EXPORT_SYMBOL(__hw_addr_del_multiple); diff --git a/net/dcb/dcbnl.c b/net/dcb/dcbnl.c index d5074a56728..c44348adba3 100644 --- a/net/dcb/dcbnl.c +++ b/net/dcb/dcbnl.c @@ -1193,7 +1193,7 @@ static int dcbnl_ieee_set(struct net_device *netdev, struct nlattr **tb,  			goto err;  	} -	if (ieee[DCB_ATTR_IEEE_PFC] && ops->ieee_setets) { +	if (ieee[DCB_ATTR_IEEE_PFC] && ops->ieee_setpfc) {  		struct ieee_pfc *pfc = nla_data(ieee[DCB_ATTR_IEEE_PFC]);  		err = ops->ieee_setpfc(netdev, pfc);  		if (err) diff --git a/net/dccp/input.c b/net/dccp/input.c index 8cde009e8b8..4222e7a654b 100644 --- a/net/dccp/input.c +++ b/net/dccp/input.c @@ -614,6 +614,9 @@ int dccp_rcv_state_process(struct sock *sk, struct sk_buff *skb,  		/* Caller (dccp_v4_do_rcv) will send Reset */  		dcb->dccpd_reset_code = DCCP_RESET_CODE_NO_CONNECTION;  		return 1; +	} else if (sk->sk_state == DCCP_CLOSED) { +		dcb->dccpd_reset_code = DCCP_RESET_CODE_NO_CONNECTION; +		return 1;  	}  	if (sk->sk_state != DCCP_REQUESTING && sk->sk_state != DCCP_RESPOND) { @@ -668,10 +671,6 @@ int dccp_rcv_state_process(struct sock *sk, struct sk_buff *skb,  	}  	switch (sk->sk_state) { -	case DCCP_CLOSED: -		dcb->dccpd_reset_code = DCCP_RESET_CODE_NO_CONNECTION; -		return 1; -  	case DCCP_REQUESTING:  		queued = dccp_rcv_request_sent_state_process(sk, skb, dh, len);  		if (queued >= 0) diff --git a/net/dns_resolver/dns_key.c b/net/dns_resolver/dns_key.c index 739435a6af3..cfa7a5e1c5c 100644 --- a/net/dns_resolver/dns_key.c +++ b/net/dns_resolver/dns_key.c @@ -67,8 +67,9 @@ dns_resolver_instantiate(struct key *key, const void *_data, size_t datalen)  	size_t result_len = 0;  	const char *data = _data, *end, *opt; -	kenter("%%%d,%s,'%s',%zu", -	       key->serial, key->description, data, datalen); +	kenter("%%%d,%s,'%*.*s',%zu", +	       key->serial, key->description, +	       (int)datalen, (int)datalen, data, datalen);  	if (datalen <= 1 || !data || data[datalen - 1] != '\0')  		return -EINVAL; @@ -217,6 +218,19 @@ static void dns_resolver_describe(const struct key *key, struct seq_file *m)  		seq_printf(m, ": %u", key->datalen);  } +/* + * read the DNS data + * - the key's semaphore is read-locked + */ +static long dns_resolver_read(const struct key *key, +			      char __user *buffer, size_t buflen) +{ +	if (key->type_data.x[0]) +		return key->type_data.x[0]; + +	return user_read(key, buffer, buflen); +} +  struct key_type key_type_dns_resolver = {  	.name		= "dns_resolver",  	.instantiate	= dns_resolver_instantiate, @@ -224,7 +238,7 @@ struct key_type key_type_dns_resolver = {  	.revoke		= user_revoke,  	.destroy	= user_destroy,  	.describe	= dns_resolver_describe, -	.read		= user_read, +	.read		= dns_resolver_read,  };  static int __init init_dns_resolver(void) diff --git a/net/ipv6/route.c b/net/ipv6/route.c index a998db6e789..904312e25a3 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c @@ -2557,14 +2557,16 @@ static  int ipv6_sysctl_rtcache_flush(ctl_table *ctl, int write,  			      void __user *buffer, size_t *lenp, loff_t *ppos)  { -	struct net *net = current->nsproxy->net_ns; -	int delay = net->ipv6.sysctl.flush_delay; -	if (write) { -		proc_dointvec(ctl, write, buffer, lenp, ppos); -		fib6_run_gc(delay <= 0 ? ~0UL : (unsigned long)delay, net); -		return 0; -	} else +	struct net *net; +	int delay; +	if (!write)  		return -EINVAL; + +	net = (struct net *)ctl->extra1; +	delay = net->ipv6.sysctl.flush_delay; +	proc_dointvec(ctl, write, buffer, lenp, ppos); +	fib6_run_gc(delay <= 0 ? ~0UL : (unsigned long)delay, net); +	return 0;  }  ctl_table ipv6_route_table_template[] = { @@ -2651,6 +2653,7 @@ struct ctl_table * __net_init ipv6_route_sysctl_init(struct net *net)  	if (table) {  		table[0].data = &net->ipv6.sysctl.flush_delay; +		table[0].extra1 = net;  		table[1].data = &net->ipv6.ip6_dst_ops.gc_thresh;  		table[2].data = &net->ipv6.sysctl.ip6_rt_max_size;  		table[3].data = &net->ipv6.sysctl.ip6_rt_gc_min_interval; diff --git a/net/netfilter/ipvs/ip_vs_ctl.c b/net/netfilter/ipvs/ip_vs_ctl.c index 22f7ad5101a..ba98e1308f3 100644 --- a/net/netfilter/ipvs/ip_vs_ctl.c +++ b/net/netfilter/ipvs/ip_vs_ctl.c @@ -808,9 +808,9 @@ __ip_vs_update_dest(struct ip_vs_service *svc, struct ip_vs_dest *dest,  	dest->u_threshold = udest->u_threshold;  	dest->l_threshold = udest->l_threshold; -	spin_lock(&dest->dst_lock); +	spin_lock_bh(&dest->dst_lock);  	ip_vs_dst_reset(dest); -	spin_unlock(&dest->dst_lock); +	spin_unlock_bh(&dest->dst_lock);  	if (add)  		ip_vs_new_estimator(&dest->stats); diff --git a/net/netfilter/nf_log.c b/net/netfilter/nf_log.c index b07393eab88..91816998ed8 100644 --- a/net/netfilter/nf_log.c +++ b/net/netfilter/nf_log.c @@ -85,6 +85,8 @@ EXPORT_SYMBOL(nf_log_unregister);  int nf_log_bind_pf(u_int8_t pf, const struct nf_logger *logger)  { +	if (pf >= ARRAY_SIZE(nf_loggers)) +		return -EINVAL;  	mutex_lock(&nf_log_mutex);  	if (__find_logger(pf, logger->name) == NULL) {  		mutex_unlock(&nf_log_mutex); @@ -98,6 +100,8 @@ EXPORT_SYMBOL(nf_log_bind_pf);  void nf_log_unbind_pf(u_int8_t pf)  { +	if (pf >= ARRAY_SIZE(nf_loggers)) +		return;  	mutex_lock(&nf_log_mutex);  	rcu_assign_pointer(nf_loggers[pf], NULL);  	mutex_unlock(&nf_log_mutex); diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c index 478181d53c5..1f924595bde 100644 --- a/net/netlink/af_netlink.c +++ b/net/netlink/af_netlink.c @@ -1407,7 +1407,7 @@ static int netlink_recvmsg(struct kiocb *kiocb, struct socket *sock,  	int noblock = flags&MSG_DONTWAIT;  	size_t copied;  	struct sk_buff *skb, *data_skb; -	int err; +	int err, ret;  	if (flags&MSG_OOB)  		return -EOPNOTSUPP; @@ -1470,8 +1470,13 @@ static int netlink_recvmsg(struct kiocb *kiocb, struct socket *sock,  	skb_free_datagram(sk, skb); -	if (nlk->cb && atomic_read(&sk->sk_rmem_alloc) <= sk->sk_rcvbuf / 2) -		netlink_dump(sk); +	if (nlk->cb && atomic_read(&sk->sk_rmem_alloc) <= sk->sk_rcvbuf / 2) { +		ret = netlink_dump(sk); +		if (ret) { +			sk->sk_err = ret; +			sk->sk_error_report(sk); +		} +	}  	scm_recv(sock, msg, siocb->scm, flags);  out: @@ -1736,6 +1741,7 @@ int netlink_dump_start(struct sock *ssk, struct sk_buff *skb,  	struct netlink_callback *cb;  	struct sock *sk;  	struct netlink_sock *nlk; +	int ret;  	cb = kzalloc(sizeof(*cb), GFP_KERNEL);  	if (cb == NULL) @@ -1764,9 +1770,13 @@ int netlink_dump_start(struct sock *ssk, struct sk_buff *skb,  	nlk->cb = cb;  	mutex_unlock(nlk->cb_mutex); -	netlink_dump(sk); +	ret = netlink_dump(sk); +  	sock_put(sk); +	if (ret) +		return ret; +  	/* We successfully started a dump, by returning -EINTR we  	 * signal not to send ACK even if it was requested.  	 */ diff --git a/net/rxrpc/ar-input.c b/net/rxrpc/ar-input.c index 89315009bab..1a2b0633fec 100644 --- a/net/rxrpc/ar-input.c +++ b/net/rxrpc/ar-input.c @@ -423,6 +423,7 @@ void rxrpc_fast_process_packet(struct rxrpc_call *call, struct sk_buff *skb)  			goto protocol_error;  		} +	case RXRPC_PACKET_TYPE_ACKALL:  	case RXRPC_PACKET_TYPE_ACK:  		/* ACK processing is done in process context */  		read_lock_bh(&call->state_lock); diff --git a/sound/pci/hda/patch_cirrus.c b/sound/pci/hda/patch_cirrus.c index a07b031090d..067982f4f18 100644 --- a/sound/pci/hda/patch_cirrus.c +++ b/sound/pci/hda/patch_cirrus.c @@ -1039,9 +1039,11 @@ static struct hda_verb cs_errata_init_verbs[] = {  	{0x11, AC_VERB_SET_PROC_COEF, 0x0008},  	{0x11, AC_VERB_SET_PROC_STATE, 0x00}, +#if 0 /* Don't to set to D3 as we are in power-up sequence */  	{0x07, AC_VERB_SET_POWER_STATE, 0x03}, /* S/PDIF Rx: D3 */  	{0x08, AC_VERB_SET_POWER_STATE, 0x03}, /* S/PDIF Tx: D3 */  	/*{0x01, AC_VERB_SET_POWER_STATE, 0x03},*/ /* AFG: D3 This is already handled */ +#endif  	{} /* terminator */  }; diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c index a5876773672..ec0fa2dd0a2 100644 --- a/sound/pci/hda/patch_hdmi.c +++ b/sound/pci/hda/patch_hdmi.c @@ -1634,6 +1634,9 @@ static struct hda_codec_preset snd_hda_preset_hdmi[] = {  { .id = 0x10de0012, .name = "GPU 12 HDMI/DP",	.patch = patch_nvhdmi_8ch_89 },  { .id = 0x10de0013, .name = "GPU 13 HDMI/DP",	.patch = patch_nvhdmi_8ch_89 },  { .id = 0x10de0014, .name = "GPU 14 HDMI/DP",	.patch = patch_nvhdmi_8ch_89 }, +{ .id = 0x10de0015, .name = "GPU 15 HDMI/DP",	.patch = patch_nvhdmi_8ch_89 }, +{ .id = 0x10de0016, .name = "GPU 16 HDMI/DP",	.patch = patch_nvhdmi_8ch_89 }, +/* 17 is known to be absent */  { .id = 0x10de0018, .name = "GPU 18 HDMI/DP",	.patch = patch_nvhdmi_8ch_89 },  { .id = 0x10de0019, .name = "GPU 19 HDMI/DP",	.patch = patch_nvhdmi_8ch_89 },  { .id = 0x10de001a, .name = "GPU 1a HDMI/DP",	.patch = patch_nvhdmi_8ch_89 }, @@ -1676,6 +1679,8 @@ MODULE_ALIAS("snd-hda-codec-id:10de0011");  MODULE_ALIAS("snd-hda-codec-id:10de0012");  MODULE_ALIAS("snd-hda-codec-id:10de0013");  MODULE_ALIAS("snd-hda-codec-id:10de0014"); +MODULE_ALIAS("snd-hda-codec-id:10de0015"); +MODULE_ALIAS("snd-hda-codec-id:10de0016");  MODULE_ALIAS("snd-hda-codec-id:10de0018");  MODULE_ALIAS("snd-hda-codec-id:10de0019");  MODULE_ALIAS("snd-hda-codec-id:10de001a"); diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 3328a259a24..4261bb8eec1 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c @@ -1133,11 +1133,8 @@ static void alc_automute_speaker(struct hda_codec *codec, int pinctl)  		nid = spec->autocfg.hp_pins[i];  		if (!nid)  			break; -		if (snd_hda_jack_detect(codec, nid)) { -			spec->jack_present = 1; -			break; -		} -		alc_report_jack(codec, spec->autocfg.hp_pins[i]); +		alc_report_jack(codec, nid); +		spec->jack_present |= snd_hda_jack_detect(codec, nid);  	}  	mute = spec->jack_present ? HDA_AMP_MUTE : 0; @@ -15015,7 +15012,7 @@ static struct snd_pci_quirk alc269_cfg_tbl[] = {  	SND_PCI_QUIRK(0x1043, 0x11e3, "ASUS U33Jc", ALC269VB_AMIC),  	SND_PCI_QUIRK(0x1043, 0x1273, "ASUS UL80Jt", ALC269VB_AMIC),  	SND_PCI_QUIRK(0x1043, 0x1283, "ASUS U53Jc", ALC269_AMIC), -	SND_PCI_QUIRK(0x1043, 0x12b3, "ASUS N82Jv", ALC269_AMIC), +	SND_PCI_QUIRK(0x1043, 0x12b3, "ASUS N82JV", ALC269VB_AMIC),  	SND_PCI_QUIRK(0x1043, 0x12d3, "ASUS N61Jv", ALC269_AMIC),  	SND_PCI_QUIRK(0x1043, 0x13a3, "ASUS UL30Vt", ALC269_AMIC),  	SND_PCI_QUIRK(0x1043, 0x1373, "ASUS G73JX", ALC269_AMIC), diff --git a/sound/soc/codecs/wm8994.c b/sound/soc/codecs/wm8994.c index ebaee5ca743..4afbe3b2e44 100644 --- a/sound/soc/codecs/wm8994.c +++ b/sound/soc/codecs/wm8994.c @@ -110,6 +110,9 @@ struct wm8994_priv {  	unsigned int aif1clk_enable:1;  	unsigned int aif2clk_enable:1; + +	unsigned int aif1clk_disable:1; +	unsigned int aif2clk_disable:1;  };  static int wm8994_readable(unsigned int reg) @@ -1015,14 +1018,18 @@ static int late_enable_ev(struct snd_soc_dapm_widget *w,  	switch (event) {  	case SND_SOC_DAPM_PRE_PMU: -		if (wm8994->aif1clk_enable) +		if (wm8994->aif1clk_enable) {  			snd_soc_update_bits(codec, WM8994_AIF1_CLOCKING_1,  					    WM8994_AIF1CLK_ENA_MASK,  					    WM8994_AIF1CLK_ENA); -		if (wm8994->aif2clk_enable) +			wm8994->aif1clk_enable = 0; +		} +		if (wm8994->aif2clk_enable) {  			snd_soc_update_bits(codec, WM8994_AIF2_CLOCKING_1,  					    WM8994_AIF2CLK_ENA_MASK,  					    WM8994_AIF2CLK_ENA); +			wm8994->aif2clk_enable = 0; +		}  		break;  	} @@ -1037,15 +1044,15 @@ static int late_disable_ev(struct snd_soc_dapm_widget *w,  	switch (event) {  	case SND_SOC_DAPM_POST_PMD: -		if (wm8994->aif1clk_enable) { +		if (wm8994->aif1clk_disable) {  			snd_soc_update_bits(codec, WM8994_AIF1_CLOCKING_1,  					    WM8994_AIF1CLK_ENA_MASK, 0); -			wm8994->aif1clk_enable = 0; +			wm8994->aif1clk_disable = 0;  		} -		if (wm8994->aif2clk_enable) { +		if (wm8994->aif2clk_disable) {  			snd_soc_update_bits(codec, WM8994_AIF2_CLOCKING_1,  					    WM8994_AIF2CLK_ENA_MASK, 0); -			wm8994->aif2clk_enable = 0; +			wm8994->aif2clk_disable = 0;  		}  		break;  	} @@ -1063,6 +1070,9 @@ static int aif1clk_ev(struct snd_soc_dapm_widget *w,  	case SND_SOC_DAPM_PRE_PMU:  		wm8994->aif1clk_enable = 1;  		break; +	case SND_SOC_DAPM_POST_PMD: +		wm8994->aif1clk_disable = 1; +		break;  	}  	return 0; @@ -1078,11 +1088,21 @@ static int aif2clk_ev(struct snd_soc_dapm_widget *w,  	case SND_SOC_DAPM_PRE_PMU:  		wm8994->aif2clk_enable = 1;  		break; +	case SND_SOC_DAPM_POST_PMD: +		wm8994->aif2clk_disable = 1; +		break;  	}  	return 0;  } +static int adc_mux_ev(struct snd_soc_dapm_widget *w, +		      struct snd_kcontrol *kcontrol, int event) +{ +	late_enable_ev(w, kcontrol, event); +	return 0; +} +  static int dac_ev(struct snd_soc_dapm_widget *w,  		  struct snd_kcontrol *kcontrol, int event)  { @@ -1403,6 +1423,18 @@ SND_SOC_DAPM_DAC("DAC1L", NULL, WM8994_POWER_MANAGEMENT_5, 1, 0),  SND_SOC_DAPM_DAC("DAC1R", NULL, WM8994_POWER_MANAGEMENT_5, 0, 0),  }; +static const struct snd_soc_dapm_widget wm8994_adc_revd_widgets[] = { +SND_SOC_DAPM_MUX_E("ADCL Mux", WM8994_POWER_MANAGEMENT_4, 1, 0, &adcl_mux, +		   adc_mux_ev, SND_SOC_DAPM_PRE_PMU), +SND_SOC_DAPM_MUX_E("ADCR Mux", WM8994_POWER_MANAGEMENT_4, 0, 0, &adcr_mux, +		   adc_mux_ev, SND_SOC_DAPM_PRE_PMU), +}; + +static const struct snd_soc_dapm_widget wm8994_adc_widgets[] = { +SND_SOC_DAPM_MUX("ADCL Mux", WM8994_POWER_MANAGEMENT_4, 1, 0, &adcl_mux), +SND_SOC_DAPM_MUX("ADCR Mux", WM8994_POWER_MANAGEMENT_4, 0, 0, &adcr_mux), +}; +  static const struct snd_soc_dapm_widget wm8994_dapm_widgets[] = {  SND_SOC_DAPM_INPUT("DMIC1DAT"),  SND_SOC_DAPM_INPUT("DMIC2DAT"), @@ -1497,9 +1529,6 @@ SND_SOC_DAPM_ADC("DMIC1R", NULL, WM8994_POWER_MANAGEMENT_4, 2, 0),  SND_SOC_DAPM_ADC("ADCL", NULL, SND_SOC_NOPM, 1, 0),  SND_SOC_DAPM_ADC("ADCR", NULL, SND_SOC_NOPM, 0, 0), -SND_SOC_DAPM_MUX("ADCL Mux", WM8994_POWER_MANAGEMENT_4, 1, 0, &adcl_mux), -SND_SOC_DAPM_MUX("ADCR Mux", WM8994_POWER_MANAGEMENT_4, 0, 0, &adcr_mux), -  SND_SOC_DAPM_MUX("Left Headphone Mux", SND_SOC_NOPM, 0, 0, &hpl_mux),  SND_SOC_DAPM_MUX("Right Headphone Mux", SND_SOC_NOPM, 0, 0, &hpr_mux), @@ -3280,11 +3309,15 @@ static int wm8994_codec_probe(struct snd_soc_codec *codec)  		if (wm8994->revision < 4) {  			snd_soc_dapm_new_controls(dapm, wm8994_lateclk_revd_widgets,  						  ARRAY_SIZE(wm8994_lateclk_revd_widgets)); +			snd_soc_dapm_new_controls(dapm, wm8994_adc_revd_widgets, +						  ARRAY_SIZE(wm8994_adc_revd_widgets));  			snd_soc_dapm_new_controls(dapm, wm8994_dac_revd_widgets,  						  ARRAY_SIZE(wm8994_dac_revd_widgets));  		} else {  			snd_soc_dapm_new_controls(dapm, wm8994_lateclk_widgets,  						  ARRAY_SIZE(wm8994_lateclk_widgets)); +			snd_soc_dapm_new_controls(dapm, wm8994_adc_widgets, +						  ARRAY_SIZE(wm8994_adc_widgets));  			snd_soc_dapm_new_controls(dapm, wm8994_dac_widgets,  						  ARRAY_SIZE(wm8994_dac_widgets));  		} diff --git a/sound/soc/codecs/wm9081.c b/sound/soc/codecs/wm9081.c index 43825b2102a..cce704c275c 100644 --- a/sound/soc/codecs/wm9081.c +++ b/sound/soc/codecs/wm9081.c @@ -15,6 +15,7 @@  #include <linux/moduleparam.h>  #include <linux/init.h>  #include <linux/delay.h> +#include <linux/device.h>  #include <linux/pm.h>  #include <linux/i2c.h>  #include <linux/platform_device.h> @@ -1341,6 +1342,10 @@ static __devinit int wm9081_i2c_probe(struct i2c_client *i2c,  	wm9081->control_type = SND_SOC_I2C;  	wm9081->control_data = i2c; +	if (dev_get_platdata(&i2c->dev)) +		memcpy(&wm9081->retune, dev_get_platdata(&i2c->dev), +		       sizeof(wm9081->retune)); +  	ret = snd_soc_register_codec(&i2c->dev,  			&soc_codec_dev_wm9081, &wm9081_dai, 1);  	if (ret < 0)  |