diff options
Diffstat (limited to 'include')
35 files changed, 335 insertions, 138 deletions
diff --git a/include/acpi/actypes.h b/include/acpi/actypes.h index eba66043cf1..e8bcc4742e0 100644 --- a/include/acpi/actypes.h +++ b/include/acpi/actypes.h @@ -499,9 +499,10 @@ typedef u64 acpi_integer;  #define ACPI_STATE_D0                   (u8) 0  #define ACPI_STATE_D1                   (u8) 1  #define ACPI_STATE_D2                   (u8) 2 -#define ACPI_STATE_D3                   (u8) 3 -#define ACPI_STATE_D3_COLD              (u8) 4 -#define ACPI_D_STATES_MAX               ACPI_STATE_D3_COLD +#define ACPI_STATE_D3_HOT               (u8) 3 +#define ACPI_STATE_D3                   (u8) 4 +#define ACPI_STATE_D3_COLD              ACPI_STATE_D3 +#define ACPI_D_STATES_MAX               ACPI_STATE_D3  #define ACPI_D_STATE_COUNT              5  #define ACPI_STATE_C0                   (u8) 0 diff --git a/include/asm-generic/siginfo.h b/include/asm-generic/siginfo.h index 0dd4e87f6fb..5e5e3865f1e 100644 --- a/include/asm-generic/siginfo.h +++ b/include/asm-generic/siginfo.h @@ -35,6 +35,14 @@ typedef union sigval {  #define __ARCH_SI_BAND_T long  #endif +#ifndef __ARCH_SI_CLOCK_T +#define __ARCH_SI_CLOCK_T __kernel_clock_t +#endif + +#ifndef __ARCH_SI_ATTRIBUTES +#define __ARCH_SI_ATTRIBUTES +#endif +  #ifndef HAVE_ARCH_SIGINFO_T  typedef struct siginfo { @@ -72,8 +80,8 @@ typedef struct siginfo {  			__kernel_pid_t _pid;	/* which child */  			__ARCH_SI_UID_T _uid;	/* sender's uid */  			int _status;		/* exit code */ -			__kernel_clock_t _utime; -			__kernel_clock_t _stime; +			__ARCH_SI_CLOCK_T _utime; +			__ARCH_SI_CLOCK_T _stime;  		} _sigchld;  		/* SIGILL, SIGFPE, SIGSEGV, SIGBUS */ @@ -91,7 +99,7 @@ typedef struct siginfo {  			int _fd;  		} _sigpoll;  	} _sifields; -} siginfo_t; +} __ARCH_SI_ATTRIBUTES siginfo_t;  #endif diff --git a/include/asm-generic/statfs.h b/include/asm-generic/statfs.h index 0fd28e028de..c749af9c098 100644 --- a/include/asm-generic/statfs.h +++ b/include/asm-generic/statfs.h @@ -15,7 +15,7 @@ typedef __kernel_fsid_t	fsid_t;   * with a 10' pole.   */  #ifndef __statfs_word -#if BITS_PER_LONG == 64 +#if __BITS_PER_LONG == 64  #define __statfs_word long  #else  #define __statfs_word __u32 diff --git a/include/linux/efi.h b/include/linux/efi.h index 88ec80670d5..ec45ccd8708 100644 --- a/include/linux/efi.h +++ b/include/linux/efi.h @@ -554,7 +554,18 @@ extern int __init efi_setup_pcdp_console(char *);  #define EFI_VARIABLE_NON_VOLATILE       0x0000000000000001  #define EFI_VARIABLE_BOOTSERVICE_ACCESS 0x0000000000000002  #define EFI_VARIABLE_RUNTIME_ACCESS     0x0000000000000004 +#define EFI_VARIABLE_HARDWARE_ERROR_RECORD 0x0000000000000008 +#define EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS 0x0000000000000010 +#define EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS 0x0000000000000020 +#define EFI_VARIABLE_APPEND_WRITE	0x0000000000000040 +#define EFI_VARIABLE_MASK 	(EFI_VARIABLE_NON_VOLATILE | \ +				EFI_VARIABLE_BOOTSERVICE_ACCESS | \ +				EFI_VARIABLE_RUNTIME_ACCESS | \ +				EFI_VARIABLE_HARDWARE_ERROR_RECORD | \ +				EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS | \ +				EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS | \ +				EFI_VARIABLE_APPEND_WRITE)  /*   * The type of search to perform when calling boottime->locate_handle   */ diff --git a/include/linux/fuse.h b/include/linux/fuse.h index 8ba2c9460b2..8f2ab8fef92 100644 --- a/include/linux/fuse.h +++ b/include/linux/fuse.h @@ -593,7 +593,7 @@ struct fuse_dirent {  	__u64	off;  	__u32	namelen;  	__u32	type; -	char name[0]; +	char name[];  };  #define FUSE_NAME_OFFSET offsetof(struct fuse_dirent, name) diff --git a/include/linux/gpio-pxa.h b/include/linux/gpio-pxa.h index 05071ee34c3..d755b28ba63 100644 --- a/include/linux/gpio-pxa.h +++ b/include/linux/gpio-pxa.h @@ -13,4 +13,8 @@ extern int pxa_last_gpio;  extern int pxa_irq_to_gpio(int irq); +struct pxa_gpio_platform_data { +	int (*gpio_set_wake)(unsigned int gpio, unsigned int on); +}; +  #endif /* __GPIO_PXA_H */ diff --git a/include/linux/hsi/hsi.h b/include/linux/hsi/hsi.h index 4b178067f40..56fae865e27 100644 --- a/include/linux/hsi/hsi.h +++ b/include/linux/hsi/hsi.h @@ -26,9 +26,9 @@  #include <linux/device.h>  #include <linux/mutex.h>  #include <linux/scatterlist.h> -#include <linux/spinlock.h>  #include <linux/list.h>  #include <linux/module.h> +#include <linux/notifier.h>  /* HSI message ttype */  #define HSI_MSG_READ	0 @@ -121,18 +121,18 @@ static inline int hsi_register_board_info(struct hsi_board_info const *info,   * @device: Driver model representation of the device   * @tx_cfg: HSI TX configuration   * @rx_cfg: HSI RX configuration - * @hsi_start_rx: Called after incoming wake line goes high - * @hsi_stop_rx: Called after incoming wake line goes low + * @e_handler: Callback for handling port events (RX Wake High/Low) + * @pclaimed: Keeps tracks if the clients claimed its associated HSI port + * @nb: Notifier block for port events   */  struct hsi_client {  	struct device		device;  	struct hsi_config	tx_cfg;  	struct hsi_config	rx_cfg; -	void			(*hsi_start_rx)(struct hsi_client *cl); -	void			(*hsi_stop_rx)(struct hsi_client *cl);  	/* private: */ +	void			(*ehandler)(struct hsi_client *, unsigned long);  	unsigned int		pclaimed:1; -	struct list_head	link; +	struct notifier_block	nb;  };  #define to_hsi_client(dev) container_of(dev, struct hsi_client, device) @@ -147,6 +147,10 @@ static inline void *hsi_client_drvdata(struct hsi_client *cl)  	return dev_get_drvdata(&cl->device);  } +int hsi_register_port_event(struct hsi_client *cl, +			void (*handler)(struct hsi_client *, unsigned long)); +int hsi_unregister_port_event(struct hsi_client *cl); +  /**   * struct hsi_client_driver - Driver associated to an HSI client   * @driver: Driver model representation of the driver @@ -214,8 +218,7 @@ void hsi_free_msg(struct hsi_msg *msg);   * @start_tx: Callback to inform that a client wants to TX data   * @stop_tx: Callback to inform that a client no longer wishes to TX data   * @release: Callback to inform that a client no longer uses the port - * @clients: List of hsi_clients using the port. - * @clock: Lock to serialize access to the clients list. + * @n_head: Notifier chain for signaling port events to the clients.   */  struct hsi_port {  	struct device			device; @@ -231,14 +234,14 @@ struct hsi_port {  	int				(*start_tx)(struct hsi_client *cl);  	int				(*stop_tx)(struct hsi_client *cl);  	int				(*release)(struct hsi_client *cl); -	struct list_head		clients; -	spinlock_t			clock; +	/* private */ +	struct atomic_notifier_head	n_head;  };  #define to_hsi_port(dev) container_of(dev, struct hsi_port, device)  #define hsi_get_port(cl) to_hsi_port((cl)->device.parent) -void hsi_event(struct hsi_port *port, unsigned int event); +int hsi_event(struct hsi_port *port, unsigned long event);  int hsi_claim_port(struct hsi_client *cl, unsigned int share);  void hsi_release_port(struct hsi_client *cl); @@ -270,13 +273,13 @@ struct hsi_controller {  	struct module		*owner;  	unsigned int		id;  	unsigned int		num_ports; -	struct hsi_port		*port; +	struct hsi_port		**port;  };  #define to_hsi_controller(dev) container_of(dev, struct hsi_controller, device)  struct hsi_controller *hsi_alloc_controller(unsigned int n_ports, gfp_t flags); -void hsi_free_controller(struct hsi_controller *hsi); +void hsi_put_controller(struct hsi_controller *hsi);  int hsi_register_controller(struct hsi_controller *hsi);  void hsi_unregister_controller(struct hsi_controller *hsi); @@ -294,7 +297,7 @@ static inline void *hsi_controller_drvdata(struct hsi_controller *hsi)  static inline struct hsi_port *hsi_find_port_num(struct hsi_controller *hsi,  							unsigned int num)  { -	return (num < hsi->num_ports) ? &hsi->port[num] : NULL; +	return (num < hsi->num_ports) ? hsi->port[num] : NULL;  }  /* diff --git a/include/linux/i2c/twl.h b/include/linux/i2c/twl.h index 2463b610033..1f90de0cfdb 100644 --- a/include/linux/i2c/twl.h +++ b/include/linux/i2c/twl.h @@ -666,23 +666,11 @@ struct twl4030_codec_data {  	unsigned int check_defaults:1;  	unsigned int reset_registers:1;  	unsigned int hs_extmute:1; -	u16 hs_left_step; -	u16 hs_right_step; -	u16 hf_left_step; -	u16 hf_right_step;  	void (*set_hs_extmute)(int mute);  };  struct twl4030_vibra_data {  	unsigned int	coexist; - -	/* twl6040 */ -	unsigned int vibldrv_res;	/* left driver resistance */ -	unsigned int vibrdrv_res;	/* right driver resistance */ -	unsigned int viblmotor_res;	/* left motor resistance */ -	unsigned int vibrmotor_res;	/* right motor resistance */ -	int vddvibl_uV;			/* VDDVIBL volt, set 0 for fixed reg */ -	int vddvibr_uV;			/* VDDVIBR volt, set 0 for fixed reg */  };  struct twl4030_audio_data { diff --git a/include/linux/irq.h b/include/linux/irq.h index 7810406f3d8..b27cfcfd3a5 100644 --- a/include/linux/irq.h +++ b/include/linux/irq.h @@ -49,6 +49,12 @@ typedef	void (*irq_preflow_handler_t)(struct irq_data *data);   * IRQ_TYPE_LEVEL_LOW		- low level triggered   * IRQ_TYPE_LEVEL_MASK		- Mask to filter out the level bits   * IRQ_TYPE_SENSE_MASK		- Mask for all the above bits + * IRQ_TYPE_DEFAULT		- For use by some PICs to ask irq_set_type + *				  to setup the HW to a sane default (used + *                                by irqdomain map() callbacks to synchronize + *                                the HW state and SW flags for a newly + *                                allocated descriptor). + *   * IRQ_TYPE_PROBE		- Special flag for probing in progress   *   * Bits which can be modified via irq_set/clear/modify_status_flags() @@ -77,6 +83,7 @@ enum {  	IRQ_TYPE_LEVEL_LOW	= 0x00000008,  	IRQ_TYPE_LEVEL_MASK	= (IRQ_TYPE_LEVEL_LOW | IRQ_TYPE_LEVEL_HIGH),  	IRQ_TYPE_SENSE_MASK	= 0x0000000f, +	IRQ_TYPE_DEFAULT	= IRQ_TYPE_SENSE_MASK,  	IRQ_TYPE_PROBE		= 0x00000010, diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index 665a260c7e0..72cbf08d45f 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -596,6 +596,7 @@ void kvm_free_irq_source_id(struct kvm *kvm, int irq_source_id);  #ifdef CONFIG_IOMMU_API  int kvm_iommu_map_pages(struct kvm *kvm, struct kvm_memory_slot *slot); +void kvm_iommu_unmap_pages(struct kvm *kvm, struct kvm_memory_slot *slot);  int kvm_iommu_map_guest(struct kvm *kvm);  int kvm_iommu_unmap_guest(struct kvm *kvm);  int kvm_assign_device(struct kvm *kvm, @@ -609,6 +610,11 @@ static inline int kvm_iommu_map_pages(struct kvm *kvm,  	return 0;  } +static inline void kvm_iommu_unmap_pages(struct kvm *kvm, +					 struct kvm_memory_slot *slot) +{ +} +  static inline int kvm_iommu_map_guest(struct kvm *kvm)  {  	return -ENODEV; diff --git a/include/linux/libata.h b/include/linux/libata.h index 42378d637ff..e926df7b54c 100644 --- a/include/linux/libata.h +++ b/include/linux/libata.h @@ -996,7 +996,8 @@ extern int ata_sas_scsi_ioctl(struct ata_port *ap, struct scsi_device *dev,  extern void ata_sas_port_destroy(struct ata_port *);  extern struct ata_port *ata_sas_port_alloc(struct ata_host *,  					   struct ata_port_info *, struct Scsi_Host *); -extern int ata_sas_async_port_init(struct ata_port *); +extern void ata_sas_async_probe(struct ata_port *ap); +extern int ata_sas_sync_probe(struct ata_port *ap);  extern int ata_sas_port_init(struct ata_port *);  extern int ata_sas_port_start(struct ata_port *ap);  extern void ata_sas_port_stop(struct ata_port *ap); diff --git a/include/linux/mfd/db5500-prcmu.h b/include/linux/mfd/db5500-prcmu.h index 9890687f582..5a049dfaf15 100644 --- a/include/linux/mfd/db5500-prcmu.h +++ b/include/linux/mfd/db5500-prcmu.h @@ -8,41 +8,14 @@  #ifndef __MFD_DB5500_PRCMU_H  #define __MFD_DB5500_PRCMU_H -#ifdef CONFIG_MFD_DB5500_PRCMU - -void db5500_prcmu_early_init(void); -int db5500_prcmu_set_epod(u16 epod_id, u8 epod_state); -int db5500_prcmu_set_display_clocks(void); -int db5500_prcmu_disable_dsipll(void); -int db5500_prcmu_enable_dsipll(void); -int db5500_prcmu_abb_read(u8 slave, u8 reg, u8 *value, u8 size); -int db5500_prcmu_abb_write(u8 slave, u8 reg, u8 *value, u8 size); -void db5500_prcmu_enable_wakeups(u32 wakeups); -int db5500_prcmu_request_clock(u8 clock, bool enable); -void db5500_prcmu_config_abb_event_readout(u32 abb_events); -void db5500_prcmu_get_abb_event_buffer(void __iomem **buf); -int prcmu_resetout(u8 resoutn, u8 state); -int db5500_prcmu_set_power_state(u8 state, bool keep_ulp_clk, -	bool keep_ap_pll); -int db5500_prcmu_config_esram0_deep_sleep(u8 state); -void db5500_prcmu_system_reset(u16 reset_code); -u16 db5500_prcmu_get_reset_code(void); -bool db5500_prcmu_is_ac_wake_requested(void); -int db5500_prcmu_set_arm_opp(u8 opp); -int db5500_prcmu_get_arm_opp(void); - -#else /* !CONFIG_UX500_SOC_DB5500 */ - -static inline void db5500_prcmu_early_init(void) {} - -static inline int db5500_prcmu_abb_read(u8 slave, u8 reg, u8 *value, u8 size) +static inline int prcmu_resetout(u8 resoutn, u8 state)  { -	return -ENOSYS; +	return 0;  } -static inline int db5500_prcmu_abb_write(u8 slave, u8 reg, u8 *value, u8 size) +static inline int db5500_prcmu_set_epod(u16 epod_id, u8 epod_state)  { -	return -ENOSYS; +	return 0;  }  static inline int db5500_prcmu_request_clock(u8 clock, bool enable) @@ -50,69 +23,82 @@ static inline int db5500_prcmu_request_clock(u8 clock, bool enable)  	return 0;  } -static inline int db5500_prcmu_set_display_clocks(void) +static inline int db5500_prcmu_set_power_state(u8 state, bool keep_ulp_clk, +	bool keep_ap_pll)  {  	return 0;  } -static inline int db5500_prcmu_disable_dsipll(void) +static inline int db5500_prcmu_config_esram0_deep_sleep(u8 state)  {  	return 0;  } -static inline int db5500_prcmu_enable_dsipll(void) +static inline u16 db5500_prcmu_get_reset_code(void)  {  	return 0;  } -static inline int db5500_prcmu_config_esram0_deep_sleep(u8 state) +static inline bool db5500_prcmu_is_ac_wake_requested(void)  {  	return 0;  } -static inline void db5500_prcmu_enable_wakeups(u32 wakeups) {} - -static inline int prcmu_resetout(u8 resoutn, u8 state) +static inline int db5500_prcmu_set_arm_opp(u8 opp)  {  	return 0;  } -static inline int db5500_prcmu_set_epod(u16 epod_id, u8 epod_state) +static inline int db5500_prcmu_get_arm_opp(void)  {  	return 0;  } -static inline void db5500_prcmu_get_abb_event_buffer(void __iomem **buf) {}  static inline void db5500_prcmu_config_abb_event_readout(u32 abb_events) {} -static inline int db5500_prcmu_set_power_state(u8 state, bool keep_ulp_clk, -	bool keep_ap_pll) -{ -	return 0; -} +static inline void db5500_prcmu_get_abb_event_buffer(void __iomem **buf) {}  static inline void db5500_prcmu_system_reset(u16 reset_code) {} -static inline u16 db5500_prcmu_get_reset_code(void) +static inline void db5500_prcmu_enable_wakeups(u32 wakeups) {} + +#ifdef CONFIG_MFD_DB5500_PRCMU + +void db5500_prcmu_early_init(void); +int db5500_prcmu_set_display_clocks(void); +int db5500_prcmu_disable_dsipll(void); +int db5500_prcmu_enable_dsipll(void); +int db5500_prcmu_abb_read(u8 slave, u8 reg, u8 *value, u8 size); +int db5500_prcmu_abb_write(u8 slave, u8 reg, u8 *value, u8 size); + +#else /* !CONFIG_UX500_SOC_DB5500 */ + +static inline void db5500_prcmu_early_init(void) {} + +static inline int db5500_prcmu_abb_read(u8 slave, u8 reg, u8 *value, u8 size)  { -	return 0; +	return -ENOSYS;  } -static inline bool db5500_prcmu_is_ac_wake_requested(void) +static inline int db5500_prcmu_abb_write(u8 slave, u8 reg, u8 *value, u8 size)  { -	return 0; +	return -ENOSYS;  } -static inline int db5500_prcmu_set_arm_opp(u8 opp) +static inline int db5500_prcmu_set_display_clocks(void)  {  	return 0;  } -static inline int db5500_prcmu_get_arm_opp(void) +static inline int db5500_prcmu_disable_dsipll(void)  {  	return 0;  } +static inline int db5500_prcmu_enable_dsipll(void) +{ +	return 0; +}  #endif /* CONFIG_MFD_DB5500_PRCMU */ diff --git a/include/linux/mfd/rc5t583.h b/include/linux/mfd/rc5t583.h index a2c61609d21..0b64b19d81a 100644 --- a/include/linux/mfd/rc5t583.h +++ b/include/linux/mfd/rc5t583.h @@ -26,6 +26,7 @@  #include <linux/mutex.h>  #include <linux/types.h> +#include <linux/regmap.h>  #define RC5T583_MAX_REGS		0xF8 @@ -279,14 +280,44 @@ struct rc5t583_platform_data {  	bool		enable_shutdown;  }; -int rc5t583_write(struct device *dev, u8 reg, uint8_t val); -int rc5t583_read(struct device *dev, uint8_t reg, uint8_t *val); -int rc5t583_set_bits(struct device *dev, unsigned int reg, -		unsigned int bit_mask); -int rc5t583_clear_bits(struct device *dev, unsigned int reg, -		unsigned int bit_mask); -int rc5t583_update(struct device *dev, unsigned int reg, -		unsigned int val, unsigned int mask); +static inline int rc5t583_write(struct device *dev, uint8_t reg, uint8_t val) +{ +	struct rc5t583 *rc5t583 = dev_get_drvdata(dev); +	return regmap_write(rc5t583->regmap, reg, val); +} + +static inline int rc5t583_read(struct device *dev, uint8_t reg, uint8_t *val) +{ +	struct rc5t583 *rc5t583 = dev_get_drvdata(dev); +	unsigned int ival; +	int ret; +	ret = regmap_read(rc5t583->regmap, reg, &ival); +	if (!ret) +		*val = (uint8_t)ival; +	return ret; +} + +static inline int rc5t583_set_bits(struct device *dev, unsigned int reg, +			unsigned int bit_mask) +{ +	struct rc5t583 *rc5t583 = dev_get_drvdata(dev); +	return regmap_update_bits(rc5t583->regmap, reg, bit_mask, bit_mask); +} + +static inline int rc5t583_clear_bits(struct device *dev, unsigned int reg, +			unsigned int bit_mask) +{ +	struct rc5t583 *rc5t583 = dev_get_drvdata(dev); +	return regmap_update_bits(rc5t583->regmap, reg, bit_mask, 0); +} + +static inline int rc5t583_update(struct device *dev, unsigned int reg, +		unsigned int val, unsigned int mask) +{ +	struct rc5t583 *rc5t583 = dev_get_drvdata(dev); +	return regmap_update_bits(rc5t583->regmap, reg, mask, val); +} +  int rc5t583_ext_power_req_config(struct device *dev, int deepsleep_id,  	int ext_pwr_req, int deepsleep_slot_nr);  int rc5t583_irq_init(struct rc5t583 *rc5t583, int irq, int irq_base); diff --git a/include/linux/mfd/twl6040.h b/include/linux/mfd/twl6040.h index 9bc9ac651da..b15b5f03f5c 100644 --- a/include/linux/mfd/twl6040.h +++ b/include/linux/mfd/twl6040.h @@ -174,8 +174,35 @@  #define TWL6040_SYSCLK_SEL_LPPLL	0  #define TWL6040_SYSCLK_SEL_HPPLL	1 +struct twl6040_codec_data { +	u16 hs_left_step; +	u16 hs_right_step; +	u16 hf_left_step; +	u16 hf_right_step; +}; + +struct twl6040_vibra_data { +	unsigned int vibldrv_res;	/* left driver resistance */ +	unsigned int vibrdrv_res;	/* right driver resistance */ +	unsigned int viblmotor_res;	/* left motor resistance */ +	unsigned int vibrmotor_res;	/* right motor resistance */ +	int vddvibl_uV;			/* VDDVIBL volt, set 0 for fixed reg */ +	int vddvibr_uV;			/* VDDVIBR volt, set 0 for fixed reg */ +}; + +struct twl6040_platform_data { +	int audpwron_gpio;	/* audio power-on gpio */ +	unsigned int irq_base; + +	struct twl6040_codec_data *codec; +	struct twl6040_vibra_data *vibra; +}; + +struct regmap; +  struct twl6040 {  	struct device *dev; +	struct regmap *regmap;  	struct mutex mutex;  	struct mutex io_mutex;  	struct mutex irq_mutex; diff --git a/include/linux/mm.h b/include/linux/mm.h index d8738a464b9..74aa71bea1e 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -1393,29 +1393,20 @@ extern int install_special_mapping(struct mm_struct *mm,  extern unsigned long get_unmapped_area(struct file *, unsigned long, unsigned long, unsigned long, unsigned long); -extern unsigned long do_mmap_pgoff(struct file *file, unsigned long addr, -	unsigned long len, unsigned long prot, -	unsigned long flag, unsigned long pgoff);  extern unsigned long mmap_region(struct file *file, unsigned long addr,  	unsigned long len, unsigned long flags,  	vm_flags_t vm_flags, unsigned long pgoff); - -static inline unsigned long do_mmap(struct file *file, unsigned long addr, -	unsigned long len, unsigned long prot, -	unsigned long flag, unsigned long offset) -{ -	unsigned long ret = -EINVAL; -	if ((offset + PAGE_ALIGN(len)) < offset) -		goto out; -	if (!(offset & ~PAGE_MASK)) -		ret = do_mmap_pgoff(file, addr, len, prot, flag, offset >> PAGE_SHIFT); -out: -	return ret; -} - +extern unsigned long do_mmap(struct file *, unsigned long, +        unsigned long, unsigned long, +        unsigned long, unsigned long);  extern int do_munmap(struct mm_struct *, unsigned long, size_t); -extern unsigned long do_brk(unsigned long, unsigned long); +/* These take the mm semaphore themselves */ +extern unsigned long vm_brk(unsigned long, unsigned long); +extern int vm_munmap(unsigned long, size_t); +extern unsigned long vm_mmap(struct file *, unsigned long, +        unsigned long, unsigned long, +        unsigned long, unsigned long);  /* truncate.c */  extern void truncate_inode_pages(struct address_space *, loff_t); diff --git a/include/linux/mmc/card.h b/include/linux/mmc/card.h index 01beae78f07..629b823f883 100644 --- a/include/linux/mmc/card.h +++ b/include/linux/mmc/card.h @@ -481,7 +481,7 @@ struct mmc_driver {  	struct device_driver drv;  	int (*probe)(struct mmc_card *);  	void (*remove)(struct mmc_card *); -	int (*suspend)(struct mmc_card *, pm_message_t); +	int (*suspend)(struct mmc_card *);  	int (*resume)(struct mmc_card *);  }; diff --git a/include/linux/netfilter_bridge.h b/include/linux/netfilter_bridge.h index 0ddd161f3b0..31d2844e657 100644 --- a/include/linux/netfilter_bridge.h +++ b/include/linux/netfilter_bridge.h @@ -104,9 +104,18 @@ struct bridge_skb_cb {  	} daddr;  }; +static inline void br_drop_fake_rtable(struct sk_buff *skb) +{ +	struct dst_entry *dst = skb_dst(skb); + +	if (dst && (dst->flags & DST_FAKE_RTABLE)) +		skb_dst_drop(skb); +} +  #else  #define nf_bridge_maybe_copy_header(skb)	(0)  #define nf_bridge_pad(skb)			(0) +#define br_drop_fake_rtable(skb)	        do { } while (0)  #endif /* CONFIG_BRIDGE_NETFILTER */  #endif /* __KERNEL__ */ diff --git a/include/linux/nfs_xdr.h b/include/linux/nfs_xdr.h index bfd0d1bf670..7ba3551a041 100644 --- a/include/linux/nfs_xdr.h +++ b/include/linux/nfs_xdr.h @@ -312,6 +312,11 @@ struct nfs4_layoutreturn {  	int rpc_status;  }; +struct stateowner_id { +	__u64	create_time; +	__u32	uniquifier; +}; +  /*   * Arguments to the open call.   */ @@ -321,7 +326,7 @@ struct nfs_openargs {  	int			open_flags;  	fmode_t			fmode;  	__u64                   clientid; -	__u64                   id; +	struct stateowner_id	id;  	union {  		struct {  			struct iattr *  attrs;    /* UNCHECKED, GUARDED */ diff --git a/include/linux/nfsd/Kbuild b/include/linux/nfsd/Kbuild index b8d4001212b..5b7d84ac954 100644 --- a/include/linux/nfsd/Kbuild +++ b/include/linux/nfsd/Kbuild @@ -1,3 +1,4 @@ +header-y += cld.h  header-y += debug.h  header-y += export.h  header-y += nfsfh.h diff --git a/include/linux/pinctrl/machine.h b/include/linux/pinctrl/machine.h index fee4349364f..e4d1de74250 100644 --- a/include/linux/pinctrl/machine.h +++ b/include/linux/pinctrl/machine.h @@ -12,6 +12,8 @@  #ifndef __LINUX_PINCTRL_MACHINE_H  #define __LINUX_PINCTRL_MACHINE_H +#include <linux/bug.h> +  #include "pinctrl-state.h"  enum pinctrl_map_type { @@ -148,7 +150,7 @@ struct pinctrl_map {  #define PIN_MAP_CONFIGS_GROUP_HOG_DEFAULT(dev, grp, cfgs)		\  	PIN_MAP_CONFIGS_GROUP(dev, PINCTRL_STATE_DEFAULT, dev, grp, cfgs) -#ifdef CONFIG_PINMUX +#ifdef CONFIG_PINCTRL  extern int pinctrl_register_mappings(struct pinctrl_map const *map,  				unsigned num_maps); diff --git a/include/linux/pipe_fs_i.h b/include/linux/pipe_fs_i.h index 6d626ff0cfd..e1ac1ce16fb 100644 --- a/include/linux/pipe_fs_i.h +++ b/include/linux/pipe_fs_i.h @@ -6,6 +6,7 @@  #define PIPE_BUF_FLAG_LRU	0x01	/* page is on the LRU */  #define PIPE_BUF_FLAG_ATOMIC	0x02	/* was atomically mapped */  #define PIPE_BUF_FLAG_GIFT	0x04	/* page is a gift */ +#define PIPE_BUF_FLAG_PACKET	0x08	/* read() as a packet */  /**   *	struct pipe_buffer - a linux kernel pipe buffer diff --git a/include/linux/seqlock.h b/include/linux/seqlock.h index c6db9fb33c4..600060e25ec 100644 --- a/include/linux/seqlock.h +++ b/include/linux/seqlock.h @@ -141,7 +141,7 @@ static inline unsigned __read_seqcount_begin(const seqcount_t *s)  	unsigned ret;  repeat: -	ret = s->sequence; +	ret = ACCESS_ONCE(s->sequence);  	if (unlikely(ret & 1)) {  		cpu_relax();  		goto repeat; @@ -166,6 +166,27 @@ static inline unsigned read_seqcount_begin(const seqcount_t *s)  }  /** + * raw_seqcount_begin - begin a seq-read critical section + * @s: pointer to seqcount_t + * Returns: count to be passed to read_seqcount_retry + * + * raw_seqcount_begin opens a read critical section of the given seqcount. + * Validity of the critical section is tested by checking read_seqcount_retry + * function. + * + * Unlike read_seqcount_begin(), this function will not wait for the count + * to stabilize. If a writer is active when we begin, we will fail the + * read_seqcount_retry() instead of stabilizing at the beginning of the + * critical section. + */ +static inline unsigned raw_seqcount_begin(const seqcount_t *s) +{ +	unsigned ret = ACCESS_ONCE(s->sequence); +	smp_rmb(); +	return ret & ~1; +} + +/**   * __read_seqcount_retry - end a seq-read critical section (without barrier)   * @s: pointer to seqcount_t   * @start: count, from read_seqcount_begin diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index 70a3f8d4911..111f26b6e28 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h @@ -238,11 +238,12 @@ enum {  /*   * The callback notifies userspace to release buffers when skb DMA is done in   * lower device, the skb last reference should be 0 when calling this. - * The desc is used to track userspace buffer index. + * The ctx field is used to track device context. + * The desc field is used to track userspace buffer index.   */  struct ubuf_info { -	void (*callback)(void *); -	void *arg; +	void (*callback)(struct ubuf_info *); +	void *ctx;  	unsigned long desc;  }; @@ -1019,7 +1020,7 @@ static inline void skb_queue_splice(const struct sk_buff_head *list,  }  /** - *	skb_queue_splice - join two skb lists and reinitialise the emptied list + *	skb_queue_splice_init - join two skb lists and reinitialise the emptied list   *	@list: the new list to add   *	@head: the place to add it in the first list   * @@ -1050,7 +1051,7 @@ static inline void skb_queue_splice_tail(const struct sk_buff_head *list,  }  /** - *	skb_queue_splice_tail - join two skb lists and reinitialise the emptied list + *	skb_queue_splice_tail_init - join two skb lists and reinitialise the emptied list   *	@list: the new list to add   *	@head: the place to add it in the first list   * diff --git a/include/linux/spi/spi.h b/include/linux/spi/spi.h index 98679b061b6..fa702aeb503 100644 --- a/include/linux/spi/spi.h +++ b/include/linux/spi/spi.h @@ -254,7 +254,7 @@ static inline void spi_unregister_driver(struct spi_driver *sdrv)   *	driver is finished with this message, it must call   *	spi_finalize_current_message() so the subsystem can issue the next   *	transfer - * @prepare_transfer_hardware: there are currently no more messages on the + * @unprepare_transfer_hardware: there are currently no more messages on the   *	queue so the subsystem notifies the driver that it may relax the   *	hardware by issuing this call   * diff --git a/include/linux/usb/hcd.h b/include/linux/usb/hcd.h index 5de415707c2..d28cc78a38e 100644 --- a/include/linux/usb/hcd.h +++ b/include/linux/usb/hcd.h @@ -126,6 +126,8 @@ struct usb_hcd {  	unsigned		wireless:1;	/* Wireless USB HCD */  	unsigned		authorized_default:1;  	unsigned		has_tt:1;	/* Integrated TT in root hub */ +	unsigned		broken_pci_sleep:1;	/* Don't put the +			controller in PCI-D3 for system sleep */  	unsigned int		irq;		/* irq allocated */  	void __iomem		*regs;		/* device memory/io */ diff --git a/include/linux/usb/otg.h b/include/linux/usb/otg.h index f67810f8f21..38ab3f46346 100644 --- a/include/linux/usb/otg.h +++ b/include/linux/usb/otg.h @@ -94,6 +94,7 @@ struct usb_phy {  	struct usb_otg		*otg; +	struct device		*io_dev;  	struct usb_phy_io_ops	*io_ops;  	void __iomem		*io_priv; diff --git a/include/linux/vm_event_item.h b/include/linux/vm_event_item.h index 03b90cdc192..06f8e385825 100644 --- a/include/linux/vm_event_item.h +++ b/include/linux/vm_event_item.h @@ -26,13 +26,14 @@ enum vm_event_item { PGPGIN, PGPGOUT, PSWPIN, PSWPOUT,  		PGFREE, PGACTIVATE, PGDEACTIVATE,  		PGFAULT, PGMAJFAULT,  		FOR_ALL_ZONES(PGREFILL), -		FOR_ALL_ZONES(PGSTEAL), +		FOR_ALL_ZONES(PGSTEAL_KSWAPD), +		FOR_ALL_ZONES(PGSTEAL_DIRECT),  		FOR_ALL_ZONES(PGSCAN_KSWAPD),  		FOR_ALL_ZONES(PGSCAN_DIRECT),  #ifdef CONFIG_NUMA  		PGSCAN_ZONE_RECLAIM_FAILED,  #endif -		PGINODESTEAL, SLABS_SCANNED, KSWAPD_STEAL, KSWAPD_INODESTEAL, +		PGINODESTEAL, SLABS_SCANNED, KSWAPD_INODESTEAL,  		KSWAPD_LOW_WMARK_HIT_QUICKLY, KSWAPD_HIGH_WMARK_HIT_QUICKLY,  		KSWAPD_SKIP_CONGESTION_WAIT,  		PAGEOUTRUN, ALLOCSTALL, PGROTATED, diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h index 6822d2595af..db1c5df4522 100644 --- a/include/net/bluetooth/hci_core.h +++ b/include/net/bluetooth/hci_core.h @@ -314,6 +314,7 @@ struct hci_conn {  	__u8		remote_cap;  	__u8		remote_auth; +	bool		flush_key;  	unsigned int	sent; @@ -980,7 +981,7 @@ int mgmt_discoverable(struct hci_dev *hdev, u8 discoverable);  int mgmt_connectable(struct hci_dev *hdev, u8 connectable);  int mgmt_write_scan_failed(struct hci_dev *hdev, u8 scan, u8 status);  int mgmt_new_link_key(struct hci_dev *hdev, struct link_key *key, -		      u8 persistent); +		      bool persistent);  int mgmt_device_connected(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,  			  u8 addr_type, u32 flags, u8 *name, u8 name_len,  			  u8 *dev_class); diff --git a/include/net/dst.h b/include/net/dst.h index 59c5d18cc38..bed833d9796 100644 --- a/include/net/dst.h +++ b/include/net/dst.h @@ -36,7 +36,11 @@ struct dst_entry {  	struct net_device       *dev;  	struct  dst_ops	        *ops;  	unsigned long		_metrics; -	unsigned long		expires; +	union { +		unsigned long           expires; +		/* point to where the dst_entry copied from */ +		struct dst_entry        *from; +	};  	struct dst_entry	*path;  	struct neighbour __rcu	*_neighbour;  #ifdef CONFIG_XFRM @@ -55,6 +59,7 @@ struct dst_entry {  #define DST_NOCACHE		0x0010  #define DST_NOCOUNT		0x0020  #define DST_NOPEER		0x0040 +#define DST_FAKE_RTABLE		0x0080  	short			error;  	short			obsolete; diff --git a/include/net/ip6_fib.h b/include/net/ip6_fib.h index b26bb810198..0ae759a6c76 100644 --- a/include/net/ip6_fib.h +++ b/include/net/ip6_fib.h @@ -123,6 +123,54 @@ static inline struct inet6_dev *ip6_dst_idev(struct dst_entry *dst)  	return ((struct rt6_info *)dst)->rt6i_idev;  } +static inline void rt6_clean_expires(struct rt6_info *rt) +{ +	if (!(rt->rt6i_flags & RTF_EXPIRES) && rt->dst.from) +		dst_release(rt->dst.from); + +	rt->rt6i_flags &= ~RTF_EXPIRES; +	rt->dst.from = NULL; +} + +static inline void rt6_set_expires(struct rt6_info *rt, unsigned long expires) +{ +	if (!(rt->rt6i_flags & RTF_EXPIRES) && rt->dst.from) +		dst_release(rt->dst.from); + +	rt->rt6i_flags |= RTF_EXPIRES; +	rt->dst.expires = expires; +} + +static inline void rt6_update_expires(struct rt6_info *rt, int timeout) +{ +	if (!(rt->rt6i_flags & RTF_EXPIRES)) { +		if (rt->dst.from) +			dst_release(rt->dst.from); +		/* dst_set_expires relies on expires == 0  +		 * if it has not been set previously. +		 */ +		rt->dst.expires = 0; +	} + +	dst_set_expires(&rt->dst, timeout); +	rt->rt6i_flags |= RTF_EXPIRES; +} + +static inline void rt6_set_from(struct rt6_info *rt, struct rt6_info *from) +{ +	struct dst_entry *new = (struct dst_entry *) from; + +	if (!(rt->rt6i_flags & RTF_EXPIRES) && rt->dst.from) { +		if (new == rt->dst.from) +			return; +		dst_release(rt->dst.from); +	} + +	rt->rt6i_flags &= ~RTF_EXPIRES; +	rt->dst.from = new; +	dst_hold(new); +} +  struct fib6_walker_t {  	struct list_head lh;  	struct fib6_node *root, *node; diff --git a/include/net/ip_vs.h b/include/net/ip_vs.h index 2bdee51ba30..72522f08737 100644 --- a/include/net/ip_vs.h +++ b/include/net/ip_vs.h @@ -393,7 +393,7 @@ struct ip_vs_protocol {  	void (*exit)(struct ip_vs_protocol *pp); -	void (*init_netns)(struct net *net, struct ip_vs_proto_data *pd); +	int (*init_netns)(struct net *net, struct ip_vs_proto_data *pd);  	void (*exit_netns)(struct net *net, struct ip_vs_proto_data *pd); @@ -1203,6 +1203,8 @@ ip_vs_lookup_real_service(struct net *net, int af, __u16 protocol,  extern int ip_vs_use_count_inc(void);  extern void ip_vs_use_count_dec(void); +extern int ip_vs_register_nl_ioctl(void); +extern void ip_vs_unregister_nl_ioctl(void);  extern int ip_vs_control_init(void);  extern void ip_vs_control_cleanup(void);  extern struct ip_vs_dest * diff --git a/include/net/red.h b/include/net/red.h index 77d4c3745cb..ef46058d35b 100644 --- a/include/net/red.h +++ b/include/net/red.h @@ -245,7 +245,7 @@ static inline unsigned long red_calc_qavg_from_idle_time(const struct red_parms  	 *  	 * dummy packets as a burst after idle time, i.e.  	 * -	 * 	p->qavg *= (1-W)^m +	 * 	v->qavg *= (1-W)^m  	 *  	 * This is an apparently overcomplicated solution (f.e. we have to  	 * precompute a table to make this calculation in reasonable time) @@ -279,7 +279,7 @@ static inline unsigned long red_calc_qavg_no_idle_time(const struct red_parms *p  						       unsigned int backlog)  {  	/* -	 * NOTE: p->qavg is fixed point number with point at Wlog. +	 * NOTE: v->qavg is fixed point number with point at Wlog.  	 * The formula below is equvalent to floating point  	 * version:  	 * @@ -390,7 +390,7 @@ static inline void red_adaptative_algo(struct red_parms *p, struct red_vars *v)  	if (red_is_idling(v))  		qavg = red_calc_qavg_from_idle_time(p, v); -	/* p->qavg is fixed point number with point at Wlog */ +	/* v->qavg is fixed point number with point at Wlog */  	qavg >>= p->Wlog;  	if (qavg > p->target_max && p->max_P <= MAX_P_MAX) diff --git a/include/net/sock.h b/include/net/sock.h index a6ba1f8871f..5a0a58ac412 100644 --- a/include/net/sock.h +++ b/include/net/sock.h @@ -246,6 +246,7 @@ struct cg_proto;    *	@sk_user_data: RPC layer private data    *	@sk_sndmsg_page: cached page for sendmsg    *	@sk_sndmsg_off: cached offset for sendmsg +  *	@sk_peek_off: current peek_offset value    *	@sk_send_head: front of stuff to transmit    *	@sk_security: used by security modules    *	@sk_mark: generic packet mark @@ -1128,9 +1129,9 @@ sk_sockets_allocated_read_positive(struct sock *sk)  	struct proto *prot = sk->sk_prot;  	if (mem_cgroup_sockets_enabled && sk->sk_cgrp) -		return percpu_counter_sum_positive(sk->sk_cgrp->sockets_allocated); +		return percpu_counter_read_positive(sk->sk_cgrp->sockets_allocated); -	return percpu_counter_sum_positive(prot->sockets_allocated); +	return percpu_counter_read_positive(prot->sockets_allocated);  }  static inline int diff --git a/include/scsi/libsas.h b/include/scsi/libsas.h index 5f5ed1b8b41..f4f1c96dca7 100644 --- a/include/scsi/libsas.h +++ b/include/scsi/libsas.h @@ -217,11 +217,29 @@ struct domain_device {  	struct kref kref;  }; -struct sas_discovery_event { +struct sas_work { +	struct list_head drain_node;  	struct work_struct work; +}; + +static inline void INIT_SAS_WORK(struct sas_work *sw, void (*fn)(struct work_struct *)) +{ +	INIT_WORK(&sw->work, fn); +	INIT_LIST_HEAD(&sw->drain_node); +} + +struct sas_discovery_event { +	struct sas_work work;  	struct asd_sas_port *port;  }; +static inline struct sas_discovery_event *to_sas_discovery_event(struct work_struct *work) +{ +	struct sas_discovery_event *ev = container_of(work, typeof(*ev), work.work); + +	return ev; +} +  struct sas_discovery {  	struct sas_discovery_event disc_work[DISC_NUM_EVENTS];  	unsigned long    pending; @@ -244,7 +262,7 @@ struct asd_sas_port {  	struct list_head destroy_list;  	enum   sas_linkrate linkrate; -	struct work_struct work; +	struct sas_work work;  /* public: */  	int id; @@ -270,10 +288,17 @@ struct asd_sas_port {  };  struct asd_sas_event { -	struct work_struct work; +	struct sas_work work;  	struct asd_sas_phy *phy;  }; +static inline struct asd_sas_event *to_asd_sas_event(struct work_struct *work) +{ +	struct asd_sas_event *ev = container_of(work, typeof(*ev), work.work); + +	return ev; +} +  /* The phy pretty much is controlled by the LLDD.   * The class only reads those fields.   */ @@ -333,10 +358,17 @@ struct scsi_core {  };  struct sas_ha_event { -	struct work_struct work; +	struct sas_work work;  	struct sas_ha_struct *ha;  }; +static inline struct sas_ha_event *to_sas_ha_event(struct work_struct *work) +{ +	struct sas_ha_event *ev = container_of(work, typeof(*ev), work.work); + +	return ev; +} +  enum sas_ha_state {  	SAS_HA_REGISTERED,  	SAS_HA_DRAINING, diff --git a/include/scsi/sas_ata.h b/include/scsi/sas_ata.h index cdccd2eb7b6..77670e823ed 100644 --- a/include/scsi/sas_ata.h +++ b/include/scsi/sas_ata.h @@ -37,7 +37,7 @@ static inline int dev_is_sata(struct domain_device *dev)  }  int sas_get_ata_info(struct domain_device *dev, struct ex_phy *phy); -int sas_ata_init_host_and_port(struct domain_device *found_dev); +int sas_ata_init(struct domain_device *dev);  void sas_ata_task_abort(struct sas_task *task);  void sas_ata_strategy_handler(struct Scsi_Host *shost);  void sas_ata_eh(struct Scsi_Host *shost, struct list_head *work_q, @@ -52,7 +52,7 @@ static inline int dev_is_sata(struct domain_device *dev)  {  	return 0;  } -static inline int sas_ata_init_host_and_port(struct domain_device *found_dev) +static inline int sas_ata_init(struct domain_device *dev)  {  	return 0;  }  |