diff options
Diffstat (limited to 'include')
119 files changed, 2616 insertions, 662 deletions
diff --git a/include/asm-generic/bitops/builtin-__ffs.h b/include/asm-generic/bitops/builtin-__ffs.h new file mode 100644 index 00000000000..90041e3a41f --- /dev/null +++ b/include/asm-generic/bitops/builtin-__ffs.h @@ -0,0 +1,15 @@ +#ifndef _ASM_GENERIC_BITOPS_BUILTIN___FFS_H_ +#define _ASM_GENERIC_BITOPS_BUILTIN___FFS_H_ + +/** + * __ffs - find first bit in word. + * @word: The word to search + * + * Undefined if no bit exists, so code should check against 0 first. + */ +static __always_inline unsigned long __ffs(unsigned long word) +{ +	return __builtin_ctzl(word); +} + +#endif diff --git a/include/asm-generic/bitops/builtin-__fls.h b/include/asm-generic/bitops/builtin-__fls.h new file mode 100644 index 00000000000..0248f386635 --- /dev/null +++ b/include/asm-generic/bitops/builtin-__fls.h @@ -0,0 +1,15 @@ +#ifndef _ASM_GENERIC_BITOPS_BUILTIN___FLS_H_ +#define _ASM_GENERIC_BITOPS_BUILTIN___FLS_H_ + +/** + * __fls - find last (most-significant) set bit in a long word + * @word: the word to search + * + * Undefined if no set bit exists, so code should check against 0 first. + */ +static __always_inline unsigned long __fls(unsigned long word) +{ +	return (sizeof(word) * 8) - 1 - __builtin_clzl(word); +} + +#endif diff --git a/include/asm-generic/bitops/builtin-ffs.h b/include/asm-generic/bitops/builtin-ffs.h new file mode 100644 index 00000000000..064825829e1 --- /dev/null +++ b/include/asm-generic/bitops/builtin-ffs.h @@ -0,0 +1,17 @@ +#ifndef _ASM_GENERIC_BITOPS_BUILTIN_FFS_H_ +#define _ASM_GENERIC_BITOPS_BUILTIN_FFS_H_ + +/** + * ffs - find first bit set + * @x: the word to search + * + * This is defined the same way as + * the libc and compiler builtin ffs routines, therefore + * differs in spirit from the above ffz (man ffs). + */ +static __always_inline int ffs(int x) +{ +	return __builtin_ffs(x); +} + +#endif diff --git a/include/asm-generic/bitops/builtin-fls.h b/include/asm-generic/bitops/builtin-fls.h new file mode 100644 index 00000000000..eda652d0ac7 --- /dev/null +++ b/include/asm-generic/bitops/builtin-fls.h @@ -0,0 +1,16 @@ +#ifndef _ASM_GENERIC_BITOPS_BUILTIN_FLS_H_ +#define _ASM_GENERIC_BITOPS_BUILTIN_FLS_H_ + +/** + * fls - find last (most-significant) bit set + * @x: the word to search + * + * This is defined the same way as ffs. + * Note fls(0) = 0, fls(1) = 1, fls(0x80000000) = 32. + */ +static __always_inline int fls(int x) +{ +	return x ? sizeof(x) * 8 - __builtin_clz(x) : 0; +} + +#endif diff --git a/include/asm-generic/unistd.h b/include/asm-generic/unistd.h index 991ef01cd77..3748ec92dcb 100644 --- a/include/asm-generic/unistd.h +++ b/include/asm-generic/unistd.h @@ -691,9 +691,11 @@ __SC_COMP(__NR_process_vm_readv, sys_process_vm_readv, \  #define __NR_process_vm_writev 271  __SC_COMP(__NR_process_vm_writev, sys_process_vm_writev, \            compat_sys_process_vm_writev) +#define __NR_kcmp 272 +__SYSCALL(__NR_kcmp, sys_kcmp)  #undef __NR_syscalls -#define __NR_syscalls 272 +#define __NR_syscalls 273  /*   * All syscalls below here should go away really, diff --git a/include/clocksource/arm_generic.h b/include/clocksource/arm_generic.h new file mode 100644 index 00000000000..5b41b0d27f0 --- /dev/null +++ b/include/clocksource/arm_generic.h @@ -0,0 +1,21 @@ +/* + * Copyright (C) 2012 ARM Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program.  If not, see <http://www.gnu.org/licenses/>. + */ +#ifndef __CLKSOURCE_ARM_GENERIC_H +#define __CLKSOURCE_ARM_GENERIC_H + +extern int arm_generic_timer_init(void); + +#endif diff --git a/include/linux/acpi.h b/include/linux/acpi.h index 4f2a7622450..90be9898110 100644 --- a/include/linux/acpi.h +++ b/include/linux/acpi.h @@ -138,9 +138,9 @@ void acpi_penalize_isa_irq(int irq, int active);  void acpi_pci_irq_disable (struct pci_dev *dev);  struct acpi_pci_driver { -	struct acpi_pci_driver *next; -	int (*add)(acpi_handle handle); -	void (*remove)(acpi_handle handle); +	struct list_head node; +	int (*add)(struct acpi_pci_root *root); +	void (*remove)(struct acpi_pci_root *root);  };  int acpi_pci_register_driver(struct acpi_pci_driver *driver); diff --git a/include/linux/atmel_tc.h b/include/linux/atmel_tc.h index 1d14b1dc1ae..89a931babec 100644 --- a/include/linux/atmel_tc.h +++ b/include/linux/atmel_tc.h @@ -63,7 +63,7 @@ struct atmel_tc {  	struct platform_device	*pdev;  	struct resource		*iomem;  	void __iomem		*regs; -	struct atmel_tcb_config	*tcb_config; +	const struct atmel_tcb_config *tcb_config;  	int			irq[3];  	struct clk		*clk[3];  	struct list_head	node; diff --git a/include/linux/bcd.h b/include/linux/bcd.h index 22ea563ba3e..18fff11fb3e 100644 --- a/include/linux/bcd.h +++ b/include/linux/bcd.h @@ -3,7 +3,20 @@  #include <linux/compiler.h> -unsigned bcd2bin(unsigned char val) __attribute_const__; -unsigned char bin2bcd(unsigned val) __attribute_const__; +#define bcd2bin(x)					\ +		(__builtin_constant_p((u8 )(x)) ?	\ +		const_bcd2bin(x) :			\ +		_bcd2bin(x)) + +#define bin2bcd(x)					\ +		(__builtin_constant_p((u8 )(x)) ?	\ +		const_bin2bcd(x) :			\ +		_bin2bcd(x)) + +#define const_bcd2bin(x)	(((x) & 0x0f) + ((x) >> 4) * 10) +#define const_bin2bcd(x)	((((x) / 10) << 4) + (x) % 10) + +unsigned _bcd2bin(unsigned char val) __attribute_const__; +unsigned char _bin2bcd(unsigned val) __attribute_const__;  #endif /* _BCD_H */ diff --git a/include/linux/clk-provider.h b/include/linux/clk-provider.h index 77335fac943..c1273158292 100644 --- a/include/linux/clk-provider.h +++ b/include/linux/clk-provider.h @@ -26,6 +26,7 @@  #define CLK_IGNORE_UNUSED	BIT(3) /* do not gate even if unused */  #define CLK_IS_ROOT		BIT(4) /* root clk, has no parent */  #define CLK_IS_BASIC		BIT(5) /* Basic clk, can't do a to_clk_foo() */ +#define CLK_GET_RATE_NOCACHE	BIT(6) /* do not use the cached clk rate */  struct clk_hw; @@ -360,6 +361,11 @@ int of_clk_add_provider(struct device_node *np,  void of_clk_del_provider(struct device_node *np);  struct clk *of_clk_src_simple_get(struct of_phandle_args *clkspec,  				  void *data); +struct clk_onecell_data { +	struct clk **clks; +	unsigned int clk_num; +}; +struct clk *of_clk_src_onecell_get(struct of_phandle_args *clkspec, void *data);  const char *of_clk_get_parent_name(struct device_node *np, int index);  void of_clk_init(const struct of_device_id *matches); diff --git a/include/linux/compiler-gcc4.h b/include/linux/compiler-gcc4.h index 2f4079175af..934bc34d5f9 100644 --- a/include/linux/compiler-gcc4.h +++ b/include/linux/compiler-gcc4.h @@ -49,6 +49,13 @@  #endif  #endif +#if __GNUC_MINOR__ >= 6 +/* + * Tell the optimizer that something else uses this function or variable. + */ +#define __visible __attribute__((externally_visible)) +#endif +  #if __GNUC_MINOR__ > 0  #define __compiletime_object_size(obj) __builtin_object_size(obj, 0)  #endif diff --git a/include/linux/compiler.h b/include/linux/compiler.h index 923d093c9ce..f430e4162f4 100644 --- a/include/linux/compiler.h +++ b/include/linux/compiler.h @@ -278,6 +278,10 @@ void ftrace_likely_update(struct ftrace_branch_data *f, int val, int expect);  # define __section(S) __attribute__ ((__section__(#S)))  #endif +#ifndef __visible +#define __visible +#endif +  /* Are two types/vars the same type (ignoring qualifiers)? */  #ifndef __same_type  # define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b)) diff --git a/include/linux/dcache.h b/include/linux/dcache.h index caa34e50537..59200795482 100644 --- a/include/linux/dcache.h +++ b/include/linux/dcache.h @@ -206,6 +206,8 @@ struct dentry_operations {  #define DCACHE_MANAGED_DENTRY \  	(DCACHE_MOUNTED|DCACHE_NEED_AUTOMOUNT|DCACHE_MANAGE_TRANSIT) +#define DCACHE_DENTRY_KILLED	0x100000 +  extern seqlock_t rename_lock;  static inline int dname_external(struct dentry *dentry) diff --git a/include/linux/device.h b/include/linux/device.h index 52a5f15a222..af92883bb4a 100644 --- a/include/linux/device.h +++ b/include/linux/device.h @@ -536,6 +536,10 @@ extern void *__devres_alloc(dr_release_t release, size_t size, gfp_t gfp,  #else  extern void *devres_alloc(dr_release_t release, size_t size, gfp_t gfp);  #endif +extern void devres_for_each_res(struct device *dev, dr_release_t release, +				dr_match_t match, void *match_data, +				void (*fn)(struct device *, void *, void *), +				void *data);  extern void devres_free(void *res);  extern void devres_add(struct device *dev, void *res);  extern void *devres_find(struct device *dev, dr_release_t release, @@ -891,12 +895,15 @@ extern const char *dev_driver_string(const struct device *dev);  #ifdef CONFIG_PRINTK -extern int __dev_printk(const char *level, const struct device *dev, -			struct va_format *vaf); +extern __printf(3, 0) +int dev_vprintk_emit(int level, const struct device *dev, +		     const char *fmt, va_list args); +extern __printf(3, 4) +int dev_printk_emit(int level, const struct device *dev, const char *fmt, ...); +  extern __printf(3, 4)  int dev_printk(const char *level, const struct device *dev, -	       const char *fmt, ...) -	; +	       const char *fmt, ...);  extern __printf(2, 3)  int dev_emerg(const struct device *dev, const char *fmt, ...);  extern __printf(2, 3) @@ -914,6 +921,14 @@ int _dev_info(const struct device *dev, const char *fmt, ...);  #else +static inline __printf(3, 0) +int dev_vprintk_emit(int level, const struct device *dev, +		     const char *fmt, va_list args) +{ return 0; } +static inline __printf(3, 4) +int dev_printk_emit(int level, const struct device *dev, const char *fmt, ...) +{ return 0; } +  static inline int __dev_printk(const char *level, const struct device *dev,  			       struct va_format *vaf)  { return 0; } @@ -946,6 +961,32 @@ int _dev_info(const struct device *dev, const char *fmt, ...)  #endif +/* + * Stupid hackaround for existing uses of non-printk uses dev_info + * + * Note that the definition of dev_info below is actually _dev_info + * and a macro is used to avoid redefining dev_info + */ + +#define dev_info(dev, fmt, arg...) _dev_info(dev, fmt, ##arg) + +#if defined(CONFIG_DYNAMIC_DEBUG) +#define dev_dbg(dev, format, ...)		     \ +do {						     \ +	dynamic_dev_dbg(dev, format, ##__VA_ARGS__); \ +} while (0) +#elif defined(DEBUG) +#define dev_dbg(dev, format, arg...)		\ +	dev_printk(KERN_DEBUG, dev, format, ##arg) +#else +#define dev_dbg(dev, format, arg...)				\ +({								\ +	if (0)							\ +		dev_printk(KERN_DEBUG, dev, format, ##arg);	\ +	0;							\ +}) +#endif +  #define dev_level_ratelimited(dev_level, dev, fmt, ...)			\  do {									\  	static DEFINE_RATELIMIT_STATE(_rs,				\ @@ -969,33 +1010,21 @@ do {									\  	dev_level_ratelimited(dev_notice, dev, fmt, ##__VA_ARGS__)  #define dev_info_ratelimited(dev, fmt, ...)				\  	dev_level_ratelimited(dev_info, dev, fmt, ##__VA_ARGS__) +#if defined(CONFIG_DYNAMIC_DEBUG) || defined(DEBUG)  #define dev_dbg_ratelimited(dev, fmt, ...)				\ -	dev_level_ratelimited(dev_dbg, dev, fmt, ##__VA_ARGS__) - -/* - * Stupid hackaround for existing uses of non-printk uses dev_info - * - * Note that the definition of dev_info below is actually _dev_info - * and a macro is used to avoid redefining dev_info - */ - -#define dev_info(dev, fmt, arg...) _dev_info(dev, fmt, ##arg) - -#if defined(CONFIG_DYNAMIC_DEBUG) -#define dev_dbg(dev, format, ...)		     \ -do {						     \ -	dynamic_dev_dbg(dev, format, ##__VA_ARGS__); \ +do {									\ +	static DEFINE_RATELIMIT_STATE(_rs,				\ +				      DEFAULT_RATELIMIT_INTERVAL,	\ +				      DEFAULT_RATELIMIT_BURST);		\ +	DEFINE_DYNAMIC_DEBUG_METADATA(descriptor, fmt);			\ +	if (unlikely(descriptor.flags & _DPRINTK_FLAGS_PRINT) &&	\ +	    __ratelimit(&_rs))						\ +		__dynamic_pr_debug(&descriptor, pr_fmt(fmt),		\ +				   ##__VA_ARGS__);			\  } while (0) -#elif defined(DEBUG) -#define dev_dbg(dev, format, arg...)		\ -	dev_printk(KERN_DEBUG, dev, format, ##arg)  #else -#define dev_dbg(dev, format, arg...)				\ -({								\ -	if (0)							\ -		dev_printk(KERN_DEBUG, dev, format, ##arg);	\ -	0;							\ -}) +#define dev_dbg_ratelimited(dev, fmt, ...)			\ +	no_printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__)  #endif  #ifdef VERBOSE_DEBUG diff --git a/include/linux/efi-bgrt.h b/include/linux/efi-bgrt.h new file mode 100644 index 00000000000..051b21fedf6 --- /dev/null +++ b/include/linux/efi-bgrt.h @@ -0,0 +1,21 @@ +#ifndef _LINUX_EFI_BGRT_H +#define _LINUX_EFI_BGRT_H + +#ifdef CONFIG_ACPI_BGRT + +#include <linux/acpi.h> + +void efi_bgrt_init(void); + +/* The BGRT data itself; only valid if bgrt_image != NULL. */ +extern void *bgrt_image; +extern size_t bgrt_image_size; +extern struct acpi_table_bgrt *bgrt_tab; + +#else /* !CONFIG_ACPI_BGRT */ + +static inline void efi_bgrt_init(void) {} + +#endif /* !CONFIG_ACPI_BGRT */ + +#endif /* _LINUX_EFI_BGRT_H */ diff --git a/include/linux/efi.h b/include/linux/efi.h index ec45ccd8708..8670eb1eb8c 100644 --- a/include/linux/efi.h +++ b/include/linux/efi.h @@ -496,6 +496,14 @@ extern void efi_map_pal_code (void);  extern void efi_memmap_walk (efi_freemem_callback_t callback, void *arg);  extern void efi_gettimeofday (struct timespec *ts);  extern void efi_enter_virtual_mode (void);	/* switch EFI to virtual mode, if possible */ +#ifdef CONFIG_X86 +extern void efi_late_init(void); +extern void efi_free_boot_services(void); +#else +static inline void efi_late_init(void) {} +static inline void efi_free_boot_services(void) {} +#endif +extern void __iomem *efi_lookup_mapped_addr(u64 phys_addr);  extern u64 efi_get_iobase (void);  extern u32 efi_mem_type (unsigned long phys_addr);  extern u64 efi_mem_attributes (unsigned long phys_addr); diff --git a/include/linux/elf.h b/include/linux/elf.h index 999b4f52e8e..0a05051a892 100644 --- a/include/linux/elf.h +++ b/include/linux/elf.h @@ -387,7 +387,11 @@ typedef struct elf64_shdr {  #define NT_S390_PREFIX	0x305		/* s390 prefix register */  #define NT_S390_LAST_BREAK	0x306	/* s390 breaking event address */  #define NT_S390_SYSTEM_CALL	0x307	/* s390 system call restart data */ +#define NT_S390_TDB	0x308		/* s390 transaction diagnostic block */  #define NT_ARM_VFP	0x400		/* ARM VFP/NEON registers */ +#define NT_ARM_TLS	0x401		/* ARM TLS register */ +#define NT_ARM_HW_BREAK	0x402		/* ARM hardware breakpoint registers */ +#define NT_ARM_HW_WATCH	0x403		/* ARM hardware watchpoint registers */  /* Note header in a PT_NOTE section */ diff --git a/include/linux/extcon.h b/include/linux/extcon.h index cdd40147765..7443a560c9d 100644 --- a/include/linux/extcon.h +++ b/include/linux/extcon.h @@ -30,19 +30,19 @@  /*   * The standard cable name is to help support general notifier - * and notifee device drivers to share the common names. + * and notifiee device drivers to share the common names.   * Please use standard cable names unless your notifier device has   * a very unique and abnormal cable or   * the cable type is supposed to be used with only one unique - * pair of notifier/notifee devices. + * pair of notifier/notifiee devices.   *   * Please add any other "standard" cables used with extcon dev.   *   * You may add a dot and number to specify version or specification   * of the specific cable if it is required. (e.g., "Fast-charger.18"   * and "Fast-charger.10" for 1.8A and 1.0A chargers) - * However, the notifee and notifier should be able to handle such - * string and if the notifee can negotiate the protocol or idenify, + * However, the notifiee and notifier should be able to handle such + * string and if the notifiee can negotiate the protocol or identify,   * you don't need such convention. This convention is helpful when   * notifier can distinguish but notifiee cannot.   */ @@ -76,7 +76,7 @@ struct extcon_cable;   * struct extcon_dev - An extcon device represents one external connector.   * @name	The name of this extcon device. Parent device name is used   *		if NULL. - * @supported_cable	Array of supported cable name ending with NULL. + * @supported_cable	Array of supported cable names ending with NULL.   *			If supported_cable is NULL, cable name related APIs   *			are disabled.   * @mutually_exclusive	Array of mutually exclusive set of cables that cannot @@ -95,7 +95,7 @@ struct extcon_cable;   * @state	Attach/detach state of this extcon. Do not provide at   *		register-time   * @nh	Notifier for the state change events from this extcon - * @entry	To support list of extcon devices so that uses can search + * @entry	To support list of extcon devices so that users can search   *		for extcon devices based on the extcon name.   * @lock   * @max_supported	Internal value to store the number of cables. @@ -199,7 +199,7 @@ extern int extcon_update_state(struct extcon_dev *edev, u32 mask, u32 state);  /*   * get/set_cable_state access each bit of the 32b encoded state value.   * They are used to access the status of each cable based on the cable_name - * or cable_index, which is retrived by extcon_find_cable_index + * or cable_index, which is retrieved by extcon_find_cable_index   */  extern int extcon_find_cable_index(struct extcon_dev *sdev,  				   const char *cable_name); @@ -226,9 +226,9 @@ extern int extcon_unregister_interest(struct extcon_specific_cable_nb *nb);  /*   * Following APIs are to monitor every action of a notifier. - * Registerer gets notified for every external port of a connection device. + * Registrar gets notified for every external port of a connection device.   * Probably this could be used to debug an action of notifier; however, - * we do not recommend to use this at normal 'notifiee' device drivers who + * we do not recommend to use this for normal 'notifiee' device drivers who   * want to be notified by a specific external port of the notifier.   */  extern int extcon_register_notifier(struct extcon_dev *edev, diff --git a/include/linux/extcon/extcon-adc-jack.h b/include/linux/extcon/extcon-adc-jack.h new file mode 100644 index 00000000000..20e9eef25d4 --- /dev/null +++ b/include/linux/extcon/extcon-adc-jack.h @@ -0,0 +1,71 @@ +/* + * include/linux/extcon/extcon-adc-jack.h + * + * Analog Jack extcon driver with ADC-based detection capability. + * + * Copyright (C) 2012 Samsung Electronics + * MyungJoo Ham <myungjoo.ham@samsung.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ + +#ifndef _EXTCON_ADC_JACK_H_ +#define _EXTCON_ADC_JACK_H_ __FILE__ + +#include <linux/module.h> +#include <linux/extcon.h> + +/** + * struct adc_jack_cond - condition to use an extcon state + * @state      - the corresponding extcon state (if 0, this struct denotes + *             the last adc_jack_cond element among the array) + * @min_adc    - min adc value for this condition + * @max_adc    - max adc value for this condition + * + * For example, if { .state = 0x3, .min_adc = 100, .max_adc = 200}, it means + * that if ADC value is between (inclusive) 100 and 200, than the cable 0 and + * 1 are attached (1<<0 | 1<<1 == 0x3) + * + * Note that you don't need to describe condition for "no cable attached" + * because when no adc_jack_cond is met, state = 0 is automatically chosen. + */ +struct adc_jack_cond { +	u32 state; /* extcon state value. 0 if invalid */ +	u32 min_adc; +	u32 max_adc; +}; + +/** + * struct adc_jack_pdata - platform data for adc jack device. + * @name       - name of the extcon device. If null, "adc-jack" is used. + * @consumer_channel - Unique name to identify the channel on the consumer + *                   side. This typically describes the channels used within + *                   the consumer. E.g. 'battery_voltage' + * @cable_names        - array of cable names ending with null. + * @adc_contitions     - array of struct adc_jack_cond conditions ending + *                     with .state = 0 entry. This describes how to decode + *                     adc values into extcon state. + * @irq_flags  - irq flags used for the @irq + * @handling_delay_ms  - in some devices, we need to read ADC value some + *                     milli-seconds after the interrupt occurs. You may + *                     describe such delays with @handling_delay_ms, which + *                     is rounded-off by jiffies. + */ +struct adc_jack_pdata { +	const char *name; +	const char *consumer_channel; +	/* +	 * The last entry should be NULL +	 */ +	const char **cable_names; +	/* The last entry's state should be 0 */ +	struct adc_jack_cond *adc_conditions; + +	unsigned long irq_flags; +	unsigned long handling_delay_ms; /* in ms */ +}; + +#endif /* _EXTCON_ADC_JACK_H */ diff --git a/include/linux/firmware.h b/include/linux/firmware.h index 1e7c01189fa..e4279fedb93 100644 --- a/include/linux/firmware.h +++ b/include/linux/firmware.h @@ -12,6 +12,9 @@ struct firmware {  	size_t size;  	const u8 *data;  	struct page **pages; + +	/* firmware loader private fields */ +	void *priv;  };  struct module; @@ -44,6 +47,8 @@ int request_firmware_nowait(  	void (*cont)(const struct firmware *fw, void *context));  void release_firmware(const struct firmware *fw); +int cache_firmware(const char *name); +int uncache_firmware(const char *name);  #else  static inline int request_firmware(const struct firmware **fw,  				   const char *name, @@ -62,6 +67,16 @@ static inline int request_firmware_nowait(  static inline void release_firmware(const struct firmware *fw)  {  } + +static inline int cache_firmware(const char *name) +{ +	return -ENOENT; +} + +static inline int uncache_firmware(const char *name) +{ +	return -EINVAL; +}  #endif  #endif diff --git a/include/linux/fsl_devices.h b/include/linux/fsl_devices.h index 15be561e739..a82296af413 100644 --- a/include/linux/fsl_devices.h +++ b/include/linux/fsl_devices.h @@ -19,9 +19,11 @@  #define FSL_UTMI_PHY_DLY	10	/*As per P1010RM, delay for UTMI  				PHY CLK to become stable - 10ms*/ +#define FSL_USB_PHY_CLK_TIMEOUT	10000	/* uSec */  #define FSL_USB_VER_OLD		0  #define FSL_USB_VER_1_6		1  #define FSL_USB_VER_2_2		2 +#define FSL_USB_VER_2_4		3  #include <linux/types.h> diff --git a/include/linux/ftrace.h b/include/linux/ftrace.h index 55e6d63d46d..a52f2f4fe03 100644 --- a/include/linux/ftrace.h +++ b/include/linux/ftrace.h @@ -10,6 +10,7 @@  #include <linux/kallsyms.h>  #include <linux/linkage.h>  #include <linux/bitops.h> +#include <linux/ptrace.h>  #include <linux/ktime.h>  #include <linux/sched.h>  #include <linux/types.h> @@ -18,6 +19,28 @@  #include <asm/ftrace.h> +/* + * If the arch supports passing the variable contents of + * function_trace_op as the third parameter back from the + * mcount call, then the arch should define this as 1. + */ +#ifndef ARCH_SUPPORTS_FTRACE_OPS +#define ARCH_SUPPORTS_FTRACE_OPS 0 +#endif + +/* + * If the arch's mcount caller does not support all of ftrace's + * features, then it must call an indirect function that + * does. Or at least does enough to prevent any unwelcomed side effects. + */ +#if !defined(CONFIG_HAVE_FUNCTION_TRACE_MCOUNT_TEST) || \ +	!ARCH_SUPPORTS_FTRACE_OPS +# define FTRACE_FORCE_LIST_FUNC 1 +#else +# define FTRACE_FORCE_LIST_FUNC 0 +#endif + +  struct module;  struct ftrace_hash; @@ -29,7 +52,10 @@ ftrace_enable_sysctl(struct ctl_table *table, int write,  		     void __user *buffer, size_t *lenp,  		     loff_t *ppos); -typedef void (*ftrace_func_t)(unsigned long ip, unsigned long parent_ip); +struct ftrace_ops; + +typedef void (*ftrace_func_t)(unsigned long ip, unsigned long parent_ip, +			      struct ftrace_ops *op, struct pt_regs *regs);  /*   * FTRACE_OPS_FL_* bits denote the state of ftrace_ops struct and are @@ -45,12 +71,33 @@ typedef void (*ftrace_func_t)(unsigned long ip, unsigned long parent_ip);   *           could be controled by following calls:   *             ftrace_function_local_enable   *             ftrace_function_local_disable + * SAVE_REGS - The ftrace_ops wants regs saved at each function called + *            and passed to the callback. If this flag is set, but the + *            architecture does not support passing regs + *            (ARCH_SUPPORTS_FTRACE_SAVE_REGS is not defined), then the + *            ftrace_ops will fail to register, unless the next flag + *            is set. + * SAVE_REGS_IF_SUPPORTED - This is the same as SAVE_REGS, but if the + *            handler can handle an arch that does not save regs + *            (the handler tests if regs == NULL), then it can set + *            this flag instead. It will not fail registering the ftrace_ops + *            but, the regs field will be NULL if the arch does not support + *            passing regs to the handler. + *            Note, if this flag is set, the SAVE_REGS flag will automatically + *            get set upon registering the ftrace_ops, if the arch supports it. + * RECURSION_SAFE - The ftrace_ops can set this to tell the ftrace infrastructure + *            that the call back has its own recursion protection. If it does + *            not set this, then the ftrace infrastructure will add recursion + *            protection for the caller.   */  enum { -	FTRACE_OPS_FL_ENABLED		= 1 << 0, -	FTRACE_OPS_FL_GLOBAL		= 1 << 1, -	FTRACE_OPS_FL_DYNAMIC		= 1 << 2, -	FTRACE_OPS_FL_CONTROL		= 1 << 3, +	FTRACE_OPS_FL_ENABLED			= 1 << 0, +	FTRACE_OPS_FL_GLOBAL			= 1 << 1, +	FTRACE_OPS_FL_DYNAMIC			= 1 << 2, +	FTRACE_OPS_FL_CONTROL			= 1 << 3, +	FTRACE_OPS_FL_SAVE_REGS			= 1 << 4, +	FTRACE_OPS_FL_SAVE_REGS_IF_SUPPORTED	= 1 << 5, +	FTRACE_OPS_FL_RECURSION_SAFE		= 1 << 6,  };  struct ftrace_ops { @@ -163,7 +210,8 @@ static inline int ftrace_function_local_disabled(struct ftrace_ops *ops)  	return *this_cpu_ptr(ops->disabled);  } -extern void ftrace_stub(unsigned long a0, unsigned long a1); +extern void ftrace_stub(unsigned long a0, unsigned long a1, +			struct ftrace_ops *op, struct pt_regs *regs);  #else /* !CONFIG_FUNCTION_TRACER */  /* @@ -172,6 +220,10 @@ extern void ftrace_stub(unsigned long a0, unsigned long a1);   */  #define register_ftrace_function(ops) ({ 0; })  #define unregister_ftrace_function(ops) ({ 0; }) +static inline int ftrace_nr_registered_ops(void) +{ +	return 0; +}  static inline void clear_ftrace_function(void) { }  static inline void ftrace_kill(void) { }  static inline void ftrace_stop(void) { } @@ -227,12 +279,33 @@ extern void unregister_ftrace_function_probe_all(char *glob);  extern int ftrace_text_reserved(void *start, void *end); +extern int ftrace_nr_registered_ops(void); + +/* + * The dyn_ftrace record's flags field is split into two parts. + * the first part which is '0-FTRACE_REF_MAX' is a counter of + * the number of callbacks that have registered the function that + * the dyn_ftrace descriptor represents. + * + * The second part is a mask: + *  ENABLED - the function is being traced + *  REGS    - the record wants the function to save regs + *  REGS_EN - the function is set up to save regs. + * + * When a new ftrace_ops is registered and wants a function to save + * pt_regs, the rec->flag REGS is set. When the function has been + * set up to save regs, the REG_EN flag is set. Once a function + * starts saving regs it will do so until all ftrace_ops are removed + * from tracing that function. + */  enum { -	FTRACE_FL_ENABLED	= (1 << 30), +	FTRACE_FL_ENABLED	= (1UL << 29), +	FTRACE_FL_REGS		= (1UL << 30), +	FTRACE_FL_REGS_EN	= (1UL << 31)  }; -#define FTRACE_FL_MASK		(0x3UL << 30) -#define FTRACE_REF_MAX		((1 << 30) - 1) +#define FTRACE_FL_MASK		(0x7UL << 29) +#define FTRACE_REF_MAX		((1UL << 29) - 1)  struct dyn_ftrace {  	union { @@ -244,6 +317,8 @@ struct dyn_ftrace {  };  int ftrace_force_update(void); +int ftrace_set_filter_ip(struct ftrace_ops *ops, unsigned long ip, +			 int remove, int reset);  int ftrace_set_filter(struct ftrace_ops *ops, unsigned char *buf,  		       int len, int reset);  int ftrace_set_notrace(struct ftrace_ops *ops, unsigned char *buf, @@ -263,9 +338,23 @@ enum {  	FTRACE_STOP_FUNC_RET		= (1 << 4),  }; +/* + * The FTRACE_UPDATE_* enum is used to pass information back + * from the ftrace_update_record() and ftrace_test_record() + * functions. These are called by the code update routines + * to find out what is to be done for a given function. + * + *  IGNORE           - The function is already what we want it to be + *  MAKE_CALL        - Start tracing the function + *  MODIFY_CALL      - Stop saving regs for the function + *  MODIFY_CALL_REGS - Start saving regs for the function + *  MAKE_NOP         - Stop tracing the function + */  enum {  	FTRACE_UPDATE_IGNORE,  	FTRACE_UPDATE_MAKE_CALL, +	FTRACE_UPDATE_MODIFY_CALL, +	FTRACE_UPDATE_MODIFY_CALL_REGS,  	FTRACE_UPDATE_MAKE_NOP,  }; @@ -317,7 +406,9 @@ extern int ftrace_dyn_arch_init(void *data);  extern void ftrace_replace_code(int enable);  extern int ftrace_update_ftrace_func(ftrace_func_t func);  extern void ftrace_caller(void); +extern void ftrace_regs_caller(void);  extern void ftrace_call(void); +extern void ftrace_regs_call(void);  extern void mcount_call(void);  void ftrace_modify_all_code(int command); @@ -325,6 +416,15 @@ void ftrace_modify_all_code(int command);  #ifndef FTRACE_ADDR  #define FTRACE_ADDR ((unsigned long)ftrace_caller)  #endif + +#ifndef FTRACE_REGS_ADDR +#ifdef ARCH_SUPPORTS_FTRACE_SAVE_REGS +# define FTRACE_REGS_ADDR ((unsigned long)ftrace_regs_caller) +#else +# define FTRACE_REGS_ADDR FTRACE_ADDR +#endif +#endif +  #ifdef CONFIG_FUNCTION_GRAPH_TRACER  extern void ftrace_graph_caller(void);  extern int ftrace_enable_ftrace_graph_caller(void); @@ -380,6 +480,39 @@ extern int ftrace_make_nop(struct module *mod,   */  extern int ftrace_make_call(struct dyn_ftrace *rec, unsigned long addr); +#ifdef ARCH_SUPPORTS_FTRACE_SAVE_REGS +/** + * ftrace_modify_call - convert from one addr to another (no nop) + * @rec: the mcount call site record + * @old_addr: the address expected to be currently called to + * @addr: the address to change to + * + * This is a very sensitive operation and great care needs + * to be taken by the arch.  The operation should carefully + * read the location, check to see if what is read is indeed + * what we expect it to be, and then on success of the compare, + * it should write to the location. + * + * The code segment at @rec->ip should be a caller to @old_addr + * + * Return must be: + *  0 on success + *  -EFAULT on error reading the location + *  -EINVAL on a failed compare of the contents + *  -EPERM  on error writing to the location + * Any other value will be considered a failure. + */ +extern int ftrace_modify_call(struct dyn_ftrace *rec, unsigned long old_addr, +			      unsigned long addr); +#else +/* Should never be called */ +static inline int ftrace_modify_call(struct dyn_ftrace *rec, unsigned long old_addr, +				     unsigned long addr) +{ +	return -EINVAL; +} +#endif +  /* May be defined in arch */  extern int ftrace_arch_read_dyn_info(char *buf, int size); @@ -387,7 +520,7 @@ extern int skip_trace(unsigned long ip);  extern void ftrace_disable_daemon(void);  extern void ftrace_enable_daemon(void); -#else +#else /* CONFIG_DYNAMIC_FTRACE */  static inline int skip_trace(unsigned long ip) { return 0; }  static inline int ftrace_force_update(void) { return 0; }  static inline void ftrace_disable_daemon(void) { } @@ -405,6 +538,10 @@ static inline int ftrace_text_reserved(void *start, void *end)  {  	return 0;  } +static inline unsigned long ftrace_location(unsigned long ip) +{ +	return 0; +}  /*   * Again users of functions that have ftrace_ops may not @@ -413,6 +550,7 @@ static inline int ftrace_text_reserved(void *start, void *end)   */  #define ftrace_regex_open(ops, flag, inod, file) ({ -ENODEV; })  #define ftrace_set_early_filter(ops, buf, enable) do { } while (0) +#define ftrace_set_filter_ip(ops, ip, remove, reset) ({ -ENODEV; })  #define ftrace_set_filter(ops, buf, len, reset) ({ -ENODEV; })  #define ftrace_set_notrace(ops, buf, len, reset) ({ -ENODEV; })  #define ftrace_free_filter(ops) do { } while (0) diff --git a/include/linux/hardirq.h b/include/linux/hardirq.h index 305f23cd7cf..cab3da3d094 100644 --- a/include/linux/hardirq.h +++ b/include/linux/hardirq.h @@ -132,11 +132,11 @@ extern void synchronize_irq(unsigned int irq);  struct task_struct;  #if !defined(CONFIG_VIRT_CPU_ACCOUNTING) && !defined(CONFIG_IRQ_TIME_ACCOUNTING) -static inline void account_system_vtime(struct task_struct *tsk) +static inline void vtime_account(struct task_struct *tsk)  {  }  #else -extern void account_system_vtime(struct task_struct *tsk); +extern void vtime_account(struct task_struct *tsk);  #endif  #if defined(CONFIG_TINY_RCU) || defined(CONFIG_TINY_PREEMPT_RCU) @@ -162,7 +162,7 @@ extern void rcu_nmi_exit(void);   */  #define __irq_enter()					\  	do {						\ -		account_system_vtime(current);		\ +		vtime_account(current);		\  		add_preempt_count(HARDIRQ_OFFSET);	\  		trace_hardirq_enter();			\  	} while (0) @@ -178,7 +178,7 @@ extern void irq_enter(void);  #define __irq_exit()					\  	do {						\  		trace_hardirq_exit();			\ -		account_system_vtime(current);		\ +		vtime_account(current);		\  		sub_preempt_count(HARDIRQ_OFFSET);	\  	} while (0) diff --git a/include/linux/hid-sensor-hub.h b/include/linux/hid-sensor-hub.h new file mode 100644 index 00000000000..0aa5f4c42ae --- /dev/null +++ b/include/linux/hid-sensor-hub.h @@ -0,0 +1,160 @@ +/* + * HID Sensors Driver + * Copyright (c) 2012, Intel Corporation. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. + * + */ +#ifndef _HID_SENSORS_HUB_H +#define _HID_SENSORS_HUB_H + +#include <linux/hid.h> +#include <linux/hid-sensor-ids.h> + +/** + * struct hid_sensor_hub_attribute_info - Attribute info + * @usage_id:		Parent usage id of a physical device. + * @attrib_id:		Attribute id for this attribute. + * @report_id:		Report id in which this information resides. + * @index:		Field index in the report. + * @units:		Measurment unit for this attribute. + * @unit_expo:		Exponent used in the data. + * @size:		Size in bytes for data size. + */ +struct hid_sensor_hub_attribute_info { +	u32 usage_id; +	u32 attrib_id; +	s32 report_id; +	s32 index; +	s32 units; +	s32 unit_expo; +	s32 size; +}; + +/** + * struct hid_sensor_hub_device - Stores the hub instance data + * @hdev:		Stores the hid instance. + * @vendor_id:		Vendor id of hub device. + * @product_id:		Product id of hub device. + */ +struct hid_sensor_hub_device { +	struct hid_device *hdev; +	u32 vendor_id; +	u32 product_id; +}; + +/** + * struct hid_sensor_hub_callbacks - Client callback functions + * @pdev:		Platform device instance of the client driver. + * @suspend:		Suspend callback. + * @resume:		Resume callback. + * @capture_sample:	Callback to get a sample. + * @send_event:		Send notification to indicate all samples are + *			captured, process and send event + */ +struct hid_sensor_hub_callbacks { +	struct platform_device *pdev; +	int (*suspend)(struct hid_sensor_hub_device *hsdev, void *priv); +	int (*resume)(struct hid_sensor_hub_device *hsdev, void *priv); +	int (*capture_sample)(struct hid_sensor_hub_device *hsdev, +			u32 usage_id, size_t raw_len, char *raw_data, +			void *priv); +	int (*send_event)(struct hid_sensor_hub_device *hsdev, u32 usage_id, +			 void *priv); +}; + +/* Registration functions */ + +/** +* sensor_hub_register_callback() - Register client callbacks +* @hsdev:	Hub device instance. +* @usage_id:	Usage id of the client (E.g. 0x200076 for Gyro). +* @usage_callback: Callback function storage +* +* Used to register callbacks by client processing drivers. Sensor +* hub core driver will call these callbacks to offload processing +* of data streams and notifications. +*/ +int sensor_hub_register_callback(struct hid_sensor_hub_device *hsdev, +			u32 usage_id, +			struct hid_sensor_hub_callbacks *usage_callback); + +/** +* sensor_hub_remove_callback() - Remove client callbacks +* @hsdev:	Hub device instance. +* @usage_id:	Usage id of the client (E.g. 0x200076 for Gyro). +* +* If there is a callback registred, this call will remove that +* callbacks, so that it will stop data and event notifications. +*/ +int sensor_hub_remove_callback(struct hid_sensor_hub_device *hsdev, +			u32 usage_id); + + +/* Hid sensor hub core interfaces */ + +/** +* sensor_hub_input_get_attribute_info() - Get an attribute information +* @hsdev:	Hub device instance. +* @type:	Type of this attribute, input/output/feature +* @usage_id:	Attribute usage id of parent physical device as per spec +* @attr_usage_id:	Attribute usage id as per spec +* @info:	return information about attribute after parsing report +* +* Parses report and returns the attribute information such as report id, +* field index, units and exponet etc. +*/ +int sensor_hub_input_get_attribute_info(struct hid_sensor_hub_device *hsdev, +			u8 type, +			u32 usage_id, u32 attr_usage_id, +			struct hid_sensor_hub_attribute_info *info); + +/** +* sensor_hub_input_attr_get_raw_value() - Synchronous read request +* @usage_id:	Attribute usage id of parent physical device as per spec +* @attr_usage_id:	Attribute usage id as per spec +* @report_id:	Report id to look for +* +* Issues a synchronous read request for an input attribute. Returns +* data upto 32 bits. Since client can get events, so this call should +* not be used for data paths, this will impact performance. +*/ + +int sensor_hub_input_attr_get_raw_value(struct hid_sensor_hub_device *hsdev, +			u32 usage_id, +			u32 attr_usage_id, u32 report_id); +/** +* sensor_hub_set_feature() - Feature set request +* @report_id:	Report id to look for +* @field_index:	Field index inside a report +* @value:	Value to set +* +* Used to set a field in feature report. For example this can set polling +* interval, sensitivity, activate/deactivate state. +*/ +int sensor_hub_set_feature(struct hid_sensor_hub_device *hsdev, u32 report_id, +			u32 field_index, s32 value); + +/** +* sensor_hub_get_feature() - Feature get request +* @report_id:	Report id to look for +* @field_index:	Field index inside a report +* @value:	Place holder for return value +* +* Used to get a field in feature report. For example this can get polling +* interval, sensitivity, activate/deactivate state. +*/ +int sensor_hub_get_feature(struct hid_sensor_hub_device *hsdev, u32 report_id, +			u32 field_index, s32 *value); +#endif diff --git a/include/linux/hid-sensor-ids.h b/include/linux/hid-sensor-ids.h new file mode 100644 index 00000000000..ca8d7e94eb3 --- /dev/null +++ b/include/linux/hid-sensor-ids.h @@ -0,0 +1,112 @@ +/* + * HID Sensors Driver + * Copyright (c) 2012, Intel Corporation. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. + * + */ +#ifndef _HID_SENSORS_IDS_H +#define _HID_SENSORS_IDS_H + +#define HID_UP_SENSOR						0x00200000 +#define HID_MAX_PHY_DEVICES					0xFF + +/* Accel 3D (200073) */ +#define HID_USAGE_SENSOR_ACCEL_3D				0x200073 +#define HID_USAGE_SENSOR_ACCEL_X_AXIS				0x200453 +#define HID_USAGE_SENSOR_ACCEL_Y_AXIS				0x200454 +#define HID_USAGE_SENSOR_ACCEL_Z_AXIS				0x200455 + +/* ALS (200041) */ +#define HID_USAGE_SENSOR_ALS					0x200041 +#define HID_USAGE_SENSOR_LIGHT_ILLUM				0x2004d1 + +/* Gyro 3D: (200076) */ +#define HID_USAGE_SENSOR_GYRO_3D				0x200076 +#define HID_USAGE_SENSOR_ANGL_VELOCITY_X_AXIS			0x200457 +#define HID_USAGE_SENSOR_ANGL_VELOCITY_Y_AXIS			0x200458 +#define HID_USAGE_SENSOR_ANGL_VELOCITY_Z_AXIS			0x200459 + +/*ORIENTATION: Compass 3D: (200083) */ +#define HID_USAGE_SENSOR_COMPASS_3D				0x200083 +#define HID_USAGE_SENSOR_ORIENT_MAGN_HEADING			0x200471 +#define HID_USAGE_SENSOR_ORIENT_MAGN_HEADING_X			0x200472 +#define HID_USAGE_SENSOR_ORIENT_MAGN_HEADING_Y			0x200473 +#define HID_USAGE_SENSOR_ORIENT_MAGN_HEADING_Z			0x200474 + +#define HID_USAGE_SENSOR_ORIENT_COMP_MAGN_NORTH			0x200475 +#define HID_USAGE_SENSOR_ORIENT_COMP_TRUE_NORTH			0x200476 +#define HID_USAGE_SENSOR_ORIENT_MAGN_NORTH			0x200477 +#define HID_USAGE_SENSOR_ORIENT_TRUE_NORTH			0x200478 + +#define HID_USAGE_SENSOR_ORIENT_DISTANCE			0x200479 +#define HID_USAGE_SENSOR_ORIENT_DISTANCE_X			0x20047A +#define HID_USAGE_SENSOR_ORIENT_DISTANCE_Y			0x20047B +#define HID_USAGE_SENSOR_ORIENT_DISTANCE_Z			0x20047C +#define HID_USAGE_SENSOR_ORIENT_DISTANCE_OUT_OF_RANGE		0x20047D +#define HID_USAGE_SENSOR_ORIENT_TILT				0x20047E +#define HID_USAGE_SENSOR_ORIENT_TILT_X				0x20047F +#define HID_USAGE_SENSOR_ORIENT_TILT_Y				0x200480 +#define HID_USAGE_SENSOR_ORIENT_TILT_Z				0x200481 +#define HID_USAGE_SENSOR_ORIENT_ROTATION_MATRIX			0x200482 +#define HID_USAGE_SENSOR_ORIENT_QUATERNION			0x200483 +#define HID_USAGE_SENSOR_ORIENT_MAGN_FLUX			0x200484 + +#define HID_USAGE_SENSOR_ORIENT_MAGN_FLUX_X_AXIS		0x200485 +#define HID_USAGE_SENSOR_ORIENT_MAGN_FLUX_Y_AXIS		0x200486 +#define HID_USAGE_SENSOR_ORIENT_MAGN_FLUX_Z_AXIS		0x200487 + +/* Units */ +#define HID_USAGE_SENSOR_UNITS_NOT_SPECIFIED			0x00 +#define HID_USAGE_SENSOR_UNITS_LUX				0x01 +#define HID_USAGE_SENSOR_UNITS_KELVIN				0x01000100 +#define HID_USAGE_SENSOR_UNITS_FAHRENHEIT			0x03000100 +#define HID_USAGE_SENSOR_UNITS_PASCAL				0xF1E1 +#define HID_USAGE_SENSOR_UNITS_NEWTON				0x11E1 +#define HID_USAGE_SENSOR_UNITS_METERS_PER_SECOND		0x11F0 +#define HID_USAGE_SENSOR_UNITS_METERS_PER_SEC_SQRD		0x11E0 +#define HID_USAGE_SENSOR_UNITS_FARAD				0xE14F2000 +#define HID_USAGE_SENSOR_UNITS_AMPERE				0x01001000 +#define HID_USAGE_SENSOR_UNITS_WATT				0x21d1 +#define HID_USAGE_SENSOR_UNITS_HENRY				0x21E1E000 +#define HID_USAGE_SENSOR_UNITS_OHM				0x21D1E000 +#define HID_USAGE_SENSOR_UNITS_VOLT				0x21D1F000 +#define HID_USAGE_SENSOR_UNITS_HERTZ				0x01F0 +#define HID_USAGE_SENSOR_UNITS_DEGREES_PER_SEC_SQRD		0x14E0 +#define HID_USAGE_SENSOR_UNITS_RADIANS				0x12 +#define HID_USAGE_SENSOR_UNITS_RADIANS_PER_SECOND		0x12F0 +#define HID_USAGE_SENSOR_UNITS_RADIANS_PER_SEC_SQRD		0x12E0 +#define HID_USAGE_SENSOR_UNITS_SECOND				0x0110 +#define HID_USAGE_SENSOR_UNITS_GAUSS				0x01E1F000 +#define HID_USAGE_SENSOR_UNITS_GRAM				0x0101 +#define HID_USAGE_SENSOR_UNITS_CENTIMETER			0x11 +#define HID_USAGE_SENSOR_UNITS_G				0x1A +#define HID_USAGE_SENSOR_UNITS_MILLISECOND			0x19 +#define HID_USAGE_SENSOR_UNITS_PERCENT				0x17 +#define HID_USAGE_SENSOR_UNITS_DEGREES				0x14 +#define HID_USAGE_SENSOR_UNITS_DEGREES_PER_SECOND		0x15 + +/* Common selectors */ +#define HID_USAGE_SENSOR_PROP_REPORT_INTERVAL			0x20030E +#define HID_USAGE_SENSOR_PROP_SENSITIVITY_ABS			0x20030F +#define HID_USAGE_SENSOR_PROP_SENSITIVITY_RANGE_PCT		0x200310 +#define HID_USAGE_SENSOR_PROP_SENSITIVITY_REL_PCT		0x200311 +#define HID_USAGE_SENSOR_PROP_ACCURACY				0x200312 +#define HID_USAGE_SENSOR_PROP_RESOLUTION			0x200313 +#define HID_USAGE_SENSOR_PROP_RANGE_MAXIMUM			0x200314 +#define HID_USAGE_SENSOR_PROP_RANGE_MINIMUM			0x200315 +#define HID_USAGE_SENSOR_PROP_REPORT_STATE			0x200316 +#define HID_USAGE_SENSOR_PROY_POWER_STATE			0x200319 + +#endif diff --git a/include/linux/hid.h b/include/linux/hid.h index 42970de1b40..7e1f37db758 100644 --- a/include/linux/hid.h +++ b/include/linux/hid.h @@ -414,7 +414,7 @@ struct hid_field {  	__u16 dpad;			/* dpad input code */  }; -#define HID_MAX_FIELDS 128 +#define HID_MAX_FIELDS 256  struct hid_report {  	struct list_head list; @@ -626,6 +626,7 @@ struct hid_usage_id {   * @report_fixup: called before report descriptor parsing (NULL means nop)   * @input_mapping: invoked on input registering before mapping an usage   * @input_mapped: invoked on input registering after mapping an usage + * @input_configured: invoked just before the device is registered   * @feature_mapping: invoked on feature registering   * @suspend: invoked on suspend (NULL means nop)   * @resume: invoked on resume if device was not reset (NULL means nop) @@ -670,6 +671,8 @@ struct hid_driver {  	int (*input_mapped)(struct hid_device *hdev,  			struct hid_input *hidinput, struct hid_field *field,  			struct hid_usage *usage, unsigned long **bit, int *max); +	void (*input_configured)(struct hid_device *hdev, +				 struct hid_input *hidinput);  	void (*feature_mapping)(struct hid_device *hdev,  			struct hid_field *field,  			struct hid_usage *usage); diff --git a/include/linux/hyperv.h b/include/linux/hyperv.h index 68ed7f7e1fc..e73b852156b 100644 --- a/include/linux/hyperv.h +++ b/include/linux/hyperv.h @@ -122,12 +122,53 @@  #define REG_U32 4  #define REG_U64 8 +/* + * As we look at expanding the KVP functionality to include + * IP injection functionality, we need to maintain binary + * compatibility with older daemons. + * + * The KVP opcodes are defined by the host and it was unfortunate + * that I chose to treat the registration operation as part of the + * KVP operations defined by the host. + * Here is the level of compatibility + * (between the user level daemon and the kernel KVP driver) that we + * will implement: + * + * An older daemon will always be supported on a newer driver. + * A given user level daemon will require a minimal version of the + * kernel driver. + * If we cannot handle the version differences, we will fail gracefully + * (this can happen when we have a user level daemon that is more + * advanced than the KVP driver. + * + * We will use values used in this handshake for determining if we have + * workable user level daemon and the kernel driver. We begin by taking the + * registration opcode out of the KVP opcode namespace. We will however, + * maintain compatibility with the existing user-level daemon code. + */ + +/* + * Daemon code not supporting IP injection (legacy daemon). + */ + +#define KVP_OP_REGISTER	4 + +/* + * Daemon code supporting IP injection. + * The KVP opcode field is used to communicate the + * registration information; so define a namespace that + * will be distinct from the host defined KVP opcode. + */ + +#define KVP_OP_REGISTER1 100 +  enum hv_kvp_exchg_op {  	KVP_OP_GET = 0,  	KVP_OP_SET,  	KVP_OP_DELETE,  	KVP_OP_ENUMERATE, -	KVP_OP_REGISTER, +	KVP_OP_GET_IP_INFO, +	KVP_OP_SET_IP_INFO,  	KVP_OP_COUNT /* Number of operations, must be last. */  }; @@ -140,6 +181,39 @@ enum hv_kvp_exchg_pool {  	KVP_POOL_COUNT /* Number of pools, must be last. */  }; +/* + * Some Hyper-V status codes. + */ + +#define HV_S_OK				0x00000000 +#define HV_E_FAIL			0x80004005 +#define HV_S_CONT			0x80070103 +#define HV_ERROR_NOT_SUPPORTED		0x80070032 +#define HV_ERROR_MACHINE_LOCKED		0x800704F7 +#define HV_ERROR_DEVICE_NOT_CONNECTED	0x8007048F +#define HV_INVALIDARG			0x80070057 +#define HV_GUID_NOTFOUND		0x80041002 + +#define ADDR_FAMILY_NONE	0x00 +#define ADDR_FAMILY_IPV4	0x01 +#define ADDR_FAMILY_IPV6	0x02 + +#define MAX_ADAPTER_ID_SIZE	128 +#define MAX_IP_ADDR_SIZE	1024 +#define MAX_GATEWAY_SIZE	512 + + +struct hv_kvp_ipaddr_value { +	__u16	adapter_id[MAX_ADAPTER_ID_SIZE]; +	__u8	addr_family; +	__u8	dhcp_enabled; +	__u16	ip_addr[MAX_IP_ADDR_SIZE]; +	__u16	sub_net[MAX_IP_ADDR_SIZE]; +	__u16	gate_way[MAX_GATEWAY_SIZE]; +	__u16	dns_addr[MAX_IP_ADDR_SIZE]; +} __attribute__((packed)); + +  struct hv_kvp_hdr {  	__u8 operation;  	__u8 pool; @@ -181,16 +255,26 @@ struct hv_kvp_register {  };  struct hv_kvp_msg { -	struct hv_kvp_hdr	kvp_hdr; +	union { +		struct hv_kvp_hdr	kvp_hdr; +		int error; +	};  	union {  		struct hv_kvp_msg_get		kvp_get;  		struct hv_kvp_msg_set		kvp_set;  		struct hv_kvp_msg_delete	kvp_delete;  		struct hv_kvp_msg_enumerate	kvp_enum_data; +		struct hv_kvp_ipaddr_value      kvp_ip_val;  		struct hv_kvp_register		kvp_register;  	} body;  } __attribute__((packed)); +struct hv_kvp_ip_msg { +	__u8 operation; +	__u8 pool; +	struct hv_kvp_ipaddr_value      kvp_ip_val; +} __attribute__((packed)); +  #ifdef __KERNEL__  #include <linux/scatterlist.h>  #include <linux/list.h> @@ -405,7 +489,7 @@ struct vmtransfer_page_range {  struct vmtransfer_page_packet_header {  	struct vmpacket_descriptor d;  	u16 xfer_pageset_id; -	bool sender_owns_set; +	u8  sender_owns_set;  	u8 reserved;  	u32 range_cnt;  	struct vmtransfer_page_range ranges[1]; @@ -559,7 +643,7 @@ struct vmbus_channel_query_vmbus_version {  /* VMBus Version Supported parameters */  struct vmbus_channel_version_supported {  	struct vmbus_channel_message_header header; -	bool version_supported; +	u8 version_supported;  } __packed;  /* Offer Channel parameters */ @@ -568,7 +652,7 @@ struct vmbus_channel_offer_channel {  	struct vmbus_channel_offer offer;  	u32 child_relid;  	u8 monitorid; -	bool monitor_allocated; +	u8 monitor_allocated;  } __packed;  /* Rescind Offer parameters */ @@ -704,7 +788,7 @@ struct vmbus_channel_initiate_contact {  struct vmbus_channel_version_response {  	struct vmbus_channel_message_header header; -	bool version_supported; +	u8 version_supported;  } __packed;  enum vmbus_channel_state { @@ -977,11 +1061,6 @@ void vmbus_driver_unregister(struct hv_driver *hv_driver);  #define ICMSGHDRFLAG_REQUEST		2  #define ICMSGHDRFLAG_RESPONSE		4 -#define HV_S_OK				0x00000000 -#define HV_E_FAIL			0x80004005 -#define HV_S_CONT			0x80070103 -#define HV_ERROR_NOT_SUPPORTED		0x80070032 -#define HV_ERROR_MACHINE_LOCKED		0x800704F7  /*   * While we want to handle util services as regular devices, diff --git a/include/linux/iio/adc/ad_sigma_delta.h b/include/linux/iio/adc/ad_sigma_delta.h new file mode 100644 index 00000000000..2e4eab9868a --- /dev/null +++ b/include/linux/iio/adc/ad_sigma_delta.h @@ -0,0 +1,173 @@ +/* + * Support code for Analog Devices Sigma-Delta ADCs + * + * Copyright 2012 Analog Devices Inc. + *  Author: Lars-Peter Clausen <lars@metafoo.de> + * + * Licensed under the GPL-2. + */ +#ifndef __AD_SIGMA_DELTA_H__ +#define __AD_SIGMA_DELTA_H__ + +enum ad_sigma_delta_mode { +	AD_SD_MODE_CONTINUOUS = 0, +	AD_SD_MODE_SINGLE = 1, +	AD_SD_MODE_IDLE = 2, +	AD_SD_MODE_POWERDOWN = 3, +}; + +/** + * struct ad_sigma_delta_calib_data - Calibration data for Sigma Delta devices + * @mode: Calibration mode. + * @channel: Calibration channel. + */ +struct ad_sd_calib_data { +	unsigned int mode; +	unsigned int channel; +}; + +struct ad_sigma_delta; +struct iio_dev; + +/** + * struct ad_sigma_delta_info - Sigma Delta driver specific callbacks and options + * @set_channel: Will be called to select the current channel, may be NULL. + * @set_mode: Will be called to select the current mode, may be NULL. + * @postprocess_sample: Is called for each sampled data word, can be used to + *		modify or drop the sample data, it, may be NULL. + * @has_registers: true if the device has writable and readable registers, false + *		if there is just one read-only sample data shift register. + * @addr_shift: Shift of the register address in the communications register. + * @read_mask: Mask for the communications register having the read bit set. + */ +struct ad_sigma_delta_info { +	int (*set_channel)(struct ad_sigma_delta *, unsigned int channel); +	int (*set_mode)(struct ad_sigma_delta *, enum ad_sigma_delta_mode mode); +	int (*postprocess_sample)(struct ad_sigma_delta *, unsigned int raw_sample); +	bool has_registers; +	unsigned int addr_shift; +	unsigned int read_mask; +}; + +/** + * struct ad_sigma_delta - Sigma Delta device struct + * @spi: The spi device associated with the Sigma Delta device. + * @trig: The IIO trigger associated with the Sigma Delta device. + * + * Most of the fields are private to the sigma delta library code and should not + * be accessed by individual drivers. + */ +struct ad_sigma_delta { +	struct spi_device	*spi; +	struct iio_trigger	*trig; + +/* private: */ +	struct completion	completion; +	bool			irq_dis; + +	bool			bus_locked; + +	uint8_t			comm; + +	const struct ad_sigma_delta_info *info; + +	/* +	 * DMA (thus cache coherency maintenance) requires the +	 * transfer buffers to live in their own cache lines. +	 */ +	uint8_t				data[4] ____cacheline_aligned; +}; + +static inline int ad_sigma_delta_set_channel(struct ad_sigma_delta *sd, +	unsigned int channel) +{ +	if (sd->info->set_channel) +		return sd->info->set_channel(sd, channel); + +	return 0; +} + +static inline int ad_sigma_delta_set_mode(struct ad_sigma_delta *sd, +	unsigned int mode) +{ +	if (sd->info->set_mode) +		return sd->info->set_mode(sd, mode); + +	return 0; +} + +static inline int ad_sigma_delta_postprocess_sample(struct ad_sigma_delta *sd, +	unsigned int raw_sample) +{ +	if (sd->info->postprocess_sample) +		return sd->info->postprocess_sample(sd, raw_sample); + +	return 0; +} + +void ad_sd_set_comm(struct ad_sigma_delta *sigma_delta, uint8_t comm); +int ad_sd_write_reg(struct ad_sigma_delta *sigma_delta, unsigned int reg, +	unsigned int size, unsigned int val); +int ad_sd_read_reg(struct ad_sigma_delta *sigma_delta, unsigned int reg, +	unsigned int size, unsigned int *val); + +int ad_sigma_delta_single_conversion(struct iio_dev *indio_dev, +	const struct iio_chan_spec *chan, int *val); +int ad_sd_calibrate_all(struct ad_sigma_delta *sigma_delta, +	const struct ad_sd_calib_data *cd, unsigned int n); +int ad_sd_init(struct ad_sigma_delta *sigma_delta, struct iio_dev *indio_dev, +	struct spi_device *spi, const struct ad_sigma_delta_info *info); + +int ad_sd_setup_buffer_and_trigger(struct iio_dev *indio_dev); +void ad_sd_cleanup_buffer_and_trigger(struct iio_dev *indio_dev); + +int ad_sd_validate_trigger(struct iio_dev *indio_dev, struct iio_trigger *trig); + +#define __AD_SD_CHANNEL(_si, _channel1, _channel2, _address, _bits, \ +	_storagebits, _shift, _extend_name, _type) \ +	{ \ +		.type = (_type), \ +		.differential = (_channel2 == -1 ? 0 : 1), \ +		.indexed = 1, \ +		.channel = (_channel1), \ +		.channel2 = (_channel2), \ +		.address = (_address), \ +		.extend_name = (_extend_name), \ +		.info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT | \ +			IIO_CHAN_INFO_SCALE_SHARED_BIT | \ +			IIO_CHAN_INFO_OFFSET_SEPARATE_BIT, \ +		.scan_index = (_si), \ +		.scan_type = { \ +			.sign = 'u', \ +			.realbits = (_bits), \ +			.storagebits = (_storagebits), \ +			.shift = (_shift), \ +			.endianness = IIO_BE, \ +		}, \ +	} + +#define AD_SD_DIFF_CHANNEL(_si, _channel1, _channel2, _address, _bits, \ +	_storagebits, _shift) \ +	__AD_SD_CHANNEL(_si, _channel1, _channel2, _address, _bits, \ +		_storagebits, _shift, NULL, IIO_VOLTAGE) + +#define AD_SD_SHORTED_CHANNEL(_si, _channel, _address, _bits, \ +	_storagebits, _shift) \ +	__AD_SD_CHANNEL(_si, _channel, _channel, _address, _bits, \ +		_storagebits, _shift, "shorted", IIO_VOLTAGE) + +#define AD_SD_CHANNEL(_si, _channel, _address, _bits, \ +	_storagebits, _shift) \ +	__AD_SD_CHANNEL(_si, _channel, -1, _address, _bits, \ +		_storagebits, _shift, NULL, IIO_VOLTAGE) + +#define AD_SD_TEMP_CHANNEL(_si, _address, _bits, _storagebits, _shift) \ +	__AD_SD_CHANNEL(_si, 0, -1, _address, _bits, \ +		_storagebits, _shift, NULL, IIO_TEMP) + +#define AD_SD_SUPPLY_CHANNEL(_si, _channel, _address, _bits, _storagebits, \ +	_shift) \ +	__AD_SD_CHANNEL(_si, _channel, -1, _address, _bits, \ +		_storagebits, _shift, "supply", IIO_VOLTAGE) + +#endif diff --git a/include/linux/iio/buffer.h b/include/linux/iio/buffer.h index 8ba516fc2ec..c629b3a1d9a 100644 --- a/include/linux/iio/buffer.h +++ b/include/linux/iio/buffer.h @@ -36,7 +36,7 @@ struct iio_buffer;   * any of them not existing.   **/  struct iio_buffer_access_funcs { -	int (*store_to)(struct iio_buffer *buffer, u8 *data, s64 timestamp); +	int (*store_to)(struct iio_buffer *buffer, u8 *data);  	int (*read_first_n)(struct iio_buffer *buffer,  			    size_t n,  			    char __user *buf); @@ -118,10 +118,8 @@ int iio_scan_mask_set(struct iio_dev *indio_dev,   * iio_push_to_buffer() - push to a registered buffer.   * @buffer:		IIO buffer structure for device   * @data:		the data to push to the buffer - * @timestamp:		timestamp to associate with the data   */ -int iio_push_to_buffer(struct iio_buffer *buffer, unsigned char *data, -		       s64 timestamp); +int iio_push_to_buffer(struct iio_buffer *buffer, unsigned char *data);  int iio_update_demux(struct iio_dev *indio_dev); diff --git a/include/linux/iio/consumer.h b/include/linux/iio/consumer.h index e2657e6d4d2..e875bcf0478 100644 --- a/include/linux/iio/consumer.h +++ b/include/linux/iio/consumer.h @@ -8,7 +8,7 @@   * the Free Software Foundation.   */  #ifndef _IIO_INKERN_CONSUMER_H_ -#define _IIO_INKERN_CONSUMER_H +#define _IIO_INKERN_CONSUMER_H_  #include <linux/iio/types.h>  struct iio_dev; @@ -61,7 +61,7 @@ void iio_channel_release_all(struct iio_channel *chan);  /**   * iio_read_channel_raw() - read from a given channel - * @channel:		The channel being queried. + * @chan:		The channel being queried.   * @val:		Value read back.   *   * Note raw reads from iio channels are in adc counts and hence @@ -71,6 +71,21 @@ int iio_read_channel_raw(struct iio_channel *chan,  			 int *val);  /** + * iio_read_channel_processed() - read processed value from a given channel + * @chan:		The channel being queried. + * @val:		Value read back. + * + * Returns an error code or 0. + * + * This function will read a processed value from a channel. A processed value + * means that this value will have the correct unit and not some device internal + * representation. If the device does not support reporting a processed value + * the function will query the raw value and the channels scale and offset and + * do the appropriate transformation. + */ +int iio_read_channel_processed(struct iio_channel *chan, int *val); + +/**   * iio_get_channel_type() - get the type of a channel   * @channel:		The channel being queried.   * @type:		The type of the channel. @@ -82,7 +97,7 @@ int iio_get_channel_type(struct iio_channel *channel,  /**   * iio_read_channel_scale() - read the scale value for a channel - * @channel:		The channel being queried. + * @chan:		The channel being queried.   * @val:		First part of value read back.   * @val2:		Second part of value read back.   * @@ -93,4 +108,27 @@ int iio_get_channel_type(struct iio_channel *channel,  int iio_read_channel_scale(struct iio_channel *chan, int *val,  			   int *val2); +/** + * iio_convert_raw_to_processed() - Converts a raw value to a processed value + * @chan:		The channel being queried + * @raw:		The raw IIO to convert + * @processed:		The result of the conversion + * @scale:		Scale factor to apply during the conversion + * + * Returns an error code or 0. + * + * This function converts a raw value to processed value for a specific channel. + * A raw value is the device internal representation of a sample and the value + * returned by iio_read_channel_raw, so the unit of that value is device + * depended. A processed value on the other hand is value has a normed unit + * according with the IIO specification. + * + * The scale factor allows to increase the precession of the returned value. For + * a scale factor of 1 the function will return the result in the normal IIO + * unit for the channel type. E.g. millivolt for voltage channels, if you want + * nanovolts instead pass 1000 as the scale factor. + */ +int iio_convert_raw_to_processed(struct iio_channel *chan, int raw, +	int *processed, unsigned int scale); +  #endif diff --git a/include/linux/iio/iio.h b/include/linux/iio/iio.h index be82936c408..c0ae76ac4e0 100644 --- a/include/linux/iio/iio.h +++ b/include/linux/iio/iio.h @@ -35,10 +35,13 @@ enum iio_chan_info_enum {  	IIO_CHAN_INFO_FREQUENCY,  	IIO_CHAN_INFO_PHASE,  	IIO_CHAN_INFO_HARDWAREGAIN, +	IIO_CHAN_INFO_HYSTERESIS,  };  #define IIO_CHAN_INFO_SHARED_BIT(type) BIT(type*2)  #define IIO_CHAN_INFO_SEPARATE_BIT(type) BIT(type*2 + 1) +#define IIO_CHAN_INFO_BITS(type) (IIO_CHAN_INFO_SHARED_BIT(type) | \ +				    IIO_CHAN_INFO_SEPARATE_BIT(type))  #define IIO_CHAN_INFO_RAW_SEPARATE_BIT			\  	IIO_CHAN_INFO_SEPARATE_BIT(IIO_CHAN_INFO_RAW) @@ -100,6 +103,10 @@ enum iio_chan_info_enum {  	IIO_CHAN_INFO_SEPARATE_BIT(IIO_CHAN_INFO_HARDWAREGAIN)  #define IIO_CHAN_INFO_HARDWAREGAIN_SHARED_BIT			\  	IIO_CHAN_INFO_SHARED_BIT(IIO_CHAN_INFO_HARDWAREGAIN) +#define IIO_CHAN_INFO_HYSTERESIS_SEPARATE_BIT			\ +	IIO_CHAN_INFO_SEPARATE_BIT(IIO_CHAN_INFO_HYSTERESIS) +#define IIO_CHAN_INFO_HYSTERESIS_SHARED_BIT			\ +	IIO_CHAN_INFO_SHARED_BIT(IIO_CHAN_INFO_HYSTERESIS)  enum iio_endian {  	IIO_CPU, @@ -164,7 +171,7 @@ ssize_t iio_enum_write(struct iio_dev *indio_dev,   * IIO_ENUM() - Initialize enum extended channel attribute   * @_name:	Attribute name   * @_shared:	Whether the attribute is shared between all channels - * @_e:		Pointer to a iio_enum struct + * @_e:		Pointer to an iio_enum struct   *   * This should usually be used together with IIO_ENUM_AVAILABLE()   */ @@ -180,9 +187,9 @@ ssize_t iio_enum_write(struct iio_dev *indio_dev,  /**   * IIO_ENUM_AVAILABLE() - Initialize enum available extended channel attribute   * @_name:	Attribute name ("_available" will be appended to the name) - * @_e:		Pointer to a iio_enum struct + * @_e:		Pointer to an iio_enum struct   * - * Creates a read only attribute which list all the available enum items in a + * Creates a read only attribute which lists all the available enum items in a   * space separated list. This should usually be used together with IIO_ENUM()   */  #define IIO_ENUM_AVAILABLE(_name, _e) \ @@ -229,6 +236,7 @@ ssize_t iio_enum_write(struct iio_dev *indio_dev,   * @indexed:		Specify the channel has a numerical index. If not,   *			the channel index number will be suppressed for sysfs   *			attributes but not for event codes. + * @output:		Channel is output.   * @differential:	Channel is differential.   */  struct iio_chan_spec { @@ -255,6 +263,21 @@ struct iio_chan_spec {  	unsigned		differential:1;  }; + +/** + * iio_channel_has_info() - Checks whether a channel supports a info attribute + * @chan: The channel to be queried + * @type: Type of the info attribute to be checked + * + * Returns true if the channels supports reporting values for the given info + * attribute type, false otherwise. + */ +static inline bool iio_channel_has_info(const struct iio_chan_spec *chan, +	enum iio_chan_info_enum type) +{ +	return chan->info_mask & IIO_CHAN_INFO_BITS(type); +} +  #define IIO_ST(si, rb, sb, sh)						\  	{ .sign = si, .realbits = rb, .storagebits = sb, .shift = sh } @@ -312,6 +335,9 @@ struct iio_dev;   *			Meaning is event dependent.   * @validate_trigger:	function to validate the trigger when the   *			current trigger gets changed. + * @update_scan_mode:	function to configure device and scan buffer when + *			channels have changed + * @debugfs_reg_access:	function to read or write register value of device   **/  struct iio_info {  	struct module			*driver_module; @@ -367,10 +393,10 @@ struct iio_info {   *			scan mask is valid for the device.   */  struct iio_buffer_setup_ops { -	int				(*preenable)(struct iio_dev *); -	int				(*postenable)(struct iio_dev *); -	int				(*predisable)(struct iio_dev *); -	int				(*postdisable)(struct iio_dev *); +	int (*preenable)(struct iio_dev *); +	int (*postenable)(struct iio_dev *); +	int (*predisable)(struct iio_dev *); +	int (*postdisable)(struct iio_dev *);  	bool (*validate_scan_mask)(struct iio_dev *indio_dev,  				   const unsigned long *scan_mask);  }; @@ -516,6 +542,31 @@ static inline struct iio_dev *iio_device_get(struct iio_dev *indio_dev)  	return indio_dev ? dev_to_iio_dev(get_device(&indio_dev->dev)) : NULL;  } + +/** + * iio_device_set_drvdata() - Set device driver data + * @indio_dev: IIO device structure + * @data: Driver specific data + * + * Allows to attach an arbitrary pointer to an IIO device, which can later be + * retrieved by iio_device_get_drvdata(). + */ +static inline void iio_device_set_drvdata(struct iio_dev *indio_dev, void *data) +{ +	dev_set_drvdata(&indio_dev->dev, data); +} + +/** + * iio_device_get_drvdata() - Get device driver data + * @indio_dev: IIO device structure + * + * Returns the data previously set with iio_device_set_drvdata() + */ +static inline void *iio_device_get_drvdata(struct iio_dev *indio_dev) +{ +	return dev_get_drvdata(&indio_dev->dev); +} +  /* Can we make this smaller? */  #define IIO_ALIGN L1_CACHE_BYTES  /** diff --git a/include/linux/iio/kfifo_buf.h b/include/linux/iio/kfifo_buf.h index 014d5a13b32..25eeac762e8 100644 --- a/include/linux/iio/kfifo_buf.h +++ b/include/linux/iio/kfifo_buf.h @@ -1,3 +1,5 @@ +#ifndef __LINUX_IIO_KFIFO_BUF_H__ +#define __LINUX_IIO_KFIFO_BUF_H__  #include <linux/kfifo.h>  #include <linux/iio/iio.h> @@ -6,3 +8,4 @@  struct iio_buffer *iio_kfifo_allocate(struct iio_dev *indio_dev);  void iio_kfifo_free(struct iio_buffer *r); +#endif diff --git a/include/linux/iio/machine.h b/include/linux/iio/machine.h index 400a453ff67..809a3f08d5a 100644 --- a/include/linux/iio/machine.h +++ b/include/linux/iio/machine.h @@ -8,6 +8,9 @@   * the Free Software Foundation.   */ +#ifndef __LINUX_IIO_MACHINE_H__ +#define __LINUX_IIO_MACHINE_H__ +  /**   * struct iio_map - description of link between consumer and device channels   * @adc_channel_label:	Label used to identify the channel on the provider. @@ -22,3 +25,5 @@ struct iio_map {  	const char *consumer_dev_name;  	const char *consumer_channel;  }; + +#endif diff --git a/include/linux/iio/trigger.h b/include/linux/iio/trigger.h index a9819940a84..20239da1d0f 100644 --- a/include/linux/iio/trigger.h +++ b/include/linux/iio/trigger.h @@ -29,7 +29,7 @@ struct iio_subirq {   * instances of a given device.   **/  struct iio_trigger_ops { -	struct module			*owner; +	struct module *owner;  	int (*set_trigger_state)(struct iio_trigger *trig, bool state);  	int (*try_reenable)(struct iio_trigger *trig);  	int (*validate_device)(struct iio_trigger *trig, @@ -39,7 +39,7 @@ struct iio_trigger_ops {  /**   * struct iio_trigger - industrial I/O trigger device - * + * @ops:		[DRIVER] operations structure   * @id:			[INTERN] unique id number   * @name:		[DRIVER] unique name   * @dev:		[DRIVER] associated device (if relevant) @@ -76,19 +76,19 @@ struct iio_trigger {  static inline struct iio_trigger *to_iio_trigger(struct device *d)  {  	return container_of(d, struct iio_trigger, dev); -}; +}  static inline void iio_trigger_put(struct iio_trigger *trig)  {  	module_put(trig->ops->owner);  	put_device(&trig->dev); -}; +}  static inline void iio_trigger_get(struct iio_trigger *trig)  {  	get_device(&trig->dev);  	__module_get(trig->ops->owner); -}; +}  /**   * iio_trigger_register() - register a trigger with the IIO core @@ -104,7 +104,8 @@ void iio_trigger_unregister(struct iio_trigger *trig_info);  /**   * iio_trigger_poll() - called on a trigger occurring - * @trig: trigger which occurred + * @trig:	trigger which occurred + * @time:	timestamp when trigger occurred   *   * Typically called in relevant hardware interrupt handler.   **/ diff --git a/include/linux/iio/trigger_consumer.h b/include/linux/iio/trigger_consumer.h index 60d64b35694..c4f8c740966 100644 --- a/include/linux/iio/trigger_consumer.h +++ b/include/linux/iio/trigger_consumer.h @@ -7,6 +7,15 @@   * the Free Software Foundation.   */ +#ifndef __LINUX_IIO_TRIGGER_CONSUMER_H__ +#define __LINUX_IIO_TRIGGER_CONSUMER_H__ + +#include <linux/interrupt.h> +#include <linux/types.h> + +struct iio_dev; +struct iio_trigger; +  /**   * struct iio_poll_func - poll function pair   * @@ -50,3 +59,5 @@ void iio_trigger_notify_done(struct iio_trigger *trig);   */  int iio_triggered_buffer_postenable(struct iio_dev *indio_dev);  int iio_triggered_buffer_predisable(struct iio_dev *indio_dev); + +#endif diff --git a/include/linux/iio/types.h b/include/linux/iio/types.h index 44e397705d7..5c647ecfd5b 100644 --- a/include/linux/iio/types.h +++ b/include/linux/iio/types.h @@ -57,5 +57,6 @@ enum iio_modifier {  #define IIO_VAL_INT_PLUS_MICRO 2  #define IIO_VAL_INT_PLUS_NANO 3  #define IIO_VAL_INT_PLUS_MICRO_DB 4 +#define IIO_VAL_FRACTIONAL 10  #endif /* _IIO_TYPES_H_ */ diff --git a/include/linux/input.h b/include/linux/input.h index 725dcd0f63a..ba487430293 100644 --- a/include/linux/input.h +++ b/include/linux/input.h @@ -1169,6 +1169,18 @@ struct ff_effect {  #include <linux/mod_devicetable.h>  /** + * struct input_value - input value representation + * @type: type of value (EV_KEY, EV_ABS, etc) + * @code: the value code + * @value: the value + */ +struct input_value { +	__u16 type; +	__u16 code; +	__s32 value; +}; + +/**   * struct input_dev - represents an input device   * @name: name of the device   * @phys: physical path to the device in the system hierarchy @@ -1203,11 +1215,7 @@ struct ff_effect {   *	software autorepeat   * @timer: timer for software autorepeat   * @rep: current values for autorepeat parameters (delay, rate) - * @mt: pointer to array of struct input_mt_slot holding current values - *	of tracked contacts - * @mtsize: number of MT slots the device uses - * @slot: MT slot currently being transmitted - * @trkid: stores MT tracking ID for the current contact + * @mt: pointer to multitouch state   * @absinfo: array of &struct input_absinfo elements holding information   *	about absolute axes (current value, min, max, flat, fuzz,   *	resolution) @@ -1244,7 +1252,6 @@ struct ff_effect {   *	last user closes the device   * @going_away: marks devices that are in a middle of unregistering and   *	causes input_open_device*() fail with -ENODEV. - * @sync: set to %true when there were no new events since last EV_SYN   * @dev: driver model's view of this device   * @h_list: list of input handles associated with the device. When   *	accessing the list dev->mutex must be held @@ -1287,10 +1294,7 @@ struct input_dev {  	int rep[REP_CNT]; -	struct input_mt_slot *mt; -	int mtsize; -	int slot; -	int trkid; +	struct input_mt *mt;  	struct input_absinfo *absinfo; @@ -1312,12 +1316,14 @@ struct input_dev {  	unsigned int users;  	bool going_away; -	bool sync; -  	struct device dev;  	struct list_head	h_list;  	struct list_head	node; + +	unsigned int num_vals; +	unsigned int max_vals; +	struct input_value *vals;  };  #define to_input_dev(d) container_of(d, struct input_dev, dev) @@ -1378,6 +1384,9 @@ struct input_handle;   * @event: event handler. This method is being called by input core with   *	interrupts disabled and dev->event_lock spinlock held and so   *	it may not sleep + * @events: event sequence handler. This method is being called by + *	input core with interrupts disabled and dev->event_lock + *	spinlock held and so it may not sleep   * @filter: similar to @event; separates normal event handlers from   *	"filters".   * @match: called after comparing device's id with handler's id_table @@ -1414,6 +1423,8 @@ struct input_handler {  	void *private;  	void (*event)(struct input_handle *handle, unsigned int type, unsigned int code, int value); +	void (*events)(struct input_handle *handle, +		       const struct input_value *vals, unsigned int count);  	bool (*filter)(struct input_handle *handle, unsigned int type, unsigned int code, int value);  	bool (*match)(struct input_handler *handler, struct input_dev *dev);  	int (*connect)(struct input_handler *handler, struct input_dev *dev, const struct input_device_id *id); diff --git a/include/linux/input/mt.h b/include/linux/input/mt.h index f86737586e1..cc5cca774ba 100644 --- a/include/linux/input/mt.h +++ b/include/linux/input/mt.h @@ -15,12 +15,41 @@  #define TRKID_MAX	0xffff +#define INPUT_MT_POINTER	0x0001	/* pointer device, e.g. trackpad */ +#define INPUT_MT_DIRECT		0x0002	/* direct device, e.g. touchscreen */ +#define INPUT_MT_DROP_UNUSED	0x0004	/* drop contacts not seen in frame */ +#define INPUT_MT_TRACK		0x0008	/* use in-kernel tracking */ +  /**   * struct input_mt_slot - represents the state of an input MT slot   * @abs: holds current values of ABS_MT axes for this slot + * @frame: last frame at which input_mt_report_slot_state() was called + * @key: optional driver designation of this slot   */  struct input_mt_slot {  	int abs[ABS_MT_LAST - ABS_MT_FIRST + 1]; +	unsigned int frame; +	unsigned int key; +}; + +/** + * struct input_mt - state of tracked contacts + * @trkid: stores MT tracking ID for the next contact + * @num_slots: number of MT slots the device uses + * @slot: MT slot currently being transmitted + * @flags: input_mt operation flags + * @frame: increases every time input_mt_sync_frame() is called + * @red: reduced cost matrix for in-kernel tracking + * @slots: array of slots holding current values of tracked contacts + */ +struct input_mt { +	int trkid; +	int num_slots; +	int slot; +	unsigned int flags; +	unsigned int frame; +	int *red; +	struct input_mt_slot slots[];  };  static inline void input_mt_set_value(struct input_mt_slot *slot, @@ -35,12 +64,18 @@ static inline int input_mt_get_value(const struct input_mt_slot *slot,  	return slot->abs[code - ABS_MT_FIRST];  } -int input_mt_init_slots(struct input_dev *dev, unsigned int num_slots); +static inline bool input_mt_is_active(const struct input_mt_slot *slot) +{ +	return input_mt_get_value(slot, ABS_MT_TRACKING_ID) >= 0; +} + +int input_mt_init_slots(struct input_dev *dev, unsigned int num_slots, +			unsigned int flags);  void input_mt_destroy_slots(struct input_dev *dev); -static inline int input_mt_new_trkid(struct input_dev *dev) +static inline int input_mt_new_trkid(struct input_mt *mt)  { -	return dev->trkid++ & TRKID_MAX; +	return mt->trkid++ & TRKID_MAX;  }  static inline void input_mt_slot(struct input_dev *dev, int slot) @@ -64,4 +99,20 @@ void input_mt_report_slot_state(struct input_dev *dev,  void input_mt_report_finger_count(struct input_dev *dev, int count);  void input_mt_report_pointer_emulation(struct input_dev *dev, bool use_count); +void input_mt_sync_frame(struct input_dev *dev); + +/** + * struct input_mt_pos - contact position + * @x: horizontal coordinate + * @y: vertical coordinate + */ +struct input_mt_pos { +	s16 x, y; +}; + +int input_mt_assign_slots(struct input_dev *dev, int *slots, +			  const struct input_mt_pos *pos, int num_pos); + +int input_mt_get_slot_by_key(struct input_dev *dev, int key); +  #endif diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h index c5f856a040b..5e4e6170f43 100644 --- a/include/linux/interrupt.h +++ b/include/linux/interrupt.h @@ -430,6 +430,8 @@ enum  	NR_SOFTIRQS  }; +#define SOFTIRQ_STOP_IDLE_MASK (~(1 << RCU_SOFTIRQ)) +  /* map softirq index to softirq name. update 'softirq_to_name' in   * kernel/softirq.c when adding a new softirq.   */ diff --git a/include/linux/iommu.h b/include/linux/iommu.h index 7e83370e6fd..f3b99e1c104 100644 --- a/include/linux/iommu.h +++ b/include/linux/iommu.h @@ -256,72 +256,78 @@ static inline void iommu_set_fault_handler(struct iommu_domain *domain,  {  } -int iommu_attach_group(struct iommu_domain *domain, struct iommu_group *group) +static inline int iommu_attach_group(struct iommu_domain *domain, +				     struct iommu_group *group)  {  	return -ENODEV;  } -void iommu_detach_group(struct iommu_domain *domain, struct iommu_group *group) +static inline void iommu_detach_group(struct iommu_domain *domain, +				      struct iommu_group *group)  {  } -struct iommu_group *iommu_group_alloc(void) +static inline struct iommu_group *iommu_group_alloc(void)  {  	return ERR_PTR(-ENODEV);  } -void *iommu_group_get_iommudata(struct iommu_group *group) +static inline void *iommu_group_get_iommudata(struct iommu_group *group)  {  	return NULL;  } -void iommu_group_set_iommudata(struct iommu_group *group, void *iommu_data, -			       void (*release)(void *iommu_data)) +static inline void iommu_group_set_iommudata(struct iommu_group *group, +					     void *iommu_data, +					     void (*release)(void *iommu_data))  {  } -int iommu_group_set_name(struct iommu_group *group, const char *name) +static inline int iommu_group_set_name(struct iommu_group *group, +				       const char *name)  {  	return -ENODEV;  } -int iommu_group_add_device(struct iommu_group *group, struct device *dev) +static inline int iommu_group_add_device(struct iommu_group *group, +					 struct device *dev)  {  	return -ENODEV;  } -void iommu_group_remove_device(struct device *dev) +static inline void iommu_group_remove_device(struct device *dev)  {  } -int iommu_group_for_each_dev(struct iommu_group *group, void *data, -			     int (*fn)(struct device *, void *)) +static inline int iommu_group_for_each_dev(struct iommu_group *group, +					   void *data, +					   int (*fn)(struct device *, void *))  {  	return -ENODEV;  } -struct iommu_group *iommu_group_get(struct device *dev) +static inline struct iommu_group *iommu_group_get(struct device *dev)  {  	return NULL;  } -void iommu_group_put(struct iommu_group *group) +static inline void iommu_group_put(struct iommu_group *group)  {  } -int iommu_group_register_notifier(struct iommu_group *group, -				  struct notifier_block *nb) +static inline int iommu_group_register_notifier(struct iommu_group *group, +						struct notifier_block *nb)  {  	return -ENODEV;  } -int iommu_group_unregister_notifier(struct iommu_group *group, -				    struct notifier_block *nb) +static inline int iommu_group_unregister_notifier(struct iommu_group *group, +						  struct notifier_block *nb)  {  	return 0;  } -int iommu_group_id(struct iommu_group *group) +static inline int iommu_group_id(struct iommu_group *group)  {  	return -ENODEV;  } diff --git a/include/linux/irqdesc.h b/include/linux/irqdesc.h index 9a323d12de1..0ba014c5505 100644 --- a/include/linux/irqdesc.h +++ b/include/linux/irqdesc.h @@ -10,12 +10,10 @@  struct irq_affinity_notify;  struct proc_dir_entry; -struct timer_rand_state;  struct module;  /**   * struct irq_desc - interrupt descriptor   * @irq_data:		per irq and chip data passed down to chip functions - * @timer_rand_state:	pointer to timer rand state struct   * @kstat_irqs:		irq stats per cpu   * @handle_irq:		highlevel irq-events handler   * @preflow_handler:	handler called before the flow handler (currently used by sparc) diff --git a/include/linux/kdb.h b/include/linux/kdb.h index 42d9e863a31..7f6fe6e015b 100644 --- a/include/linux/kdb.h +++ b/include/linux/kdb.h @@ -13,6 +13,14 @@   * Copyright (C) 2009 Jason Wessel <jason.wessel@windriver.com>   */ +typedef enum { +	KDB_REPEAT_NONE = 0,	/* Do not repeat this command */ +	KDB_REPEAT_NO_ARGS,	/* Repeat the command without arguments */ +	KDB_REPEAT_WITH_ARGS,	/* Repeat the command including its arguments */ +} kdb_repeat_t; + +typedef int (*kdb_func_t)(int, const char **); +  #ifdef	CONFIG_KGDB_KDB  #include <linux/init.h>  #include <linux/sched.h> @@ -32,14 +40,6 @@ extern atomic_t kdb_event;  #define KDB_MAXARGS    16 /* Maximum number of arguments to a function  */ -typedef enum { -	KDB_REPEAT_NONE = 0,	/* Do not repeat this command */ -	KDB_REPEAT_NO_ARGS,	/* Repeat the command without arguments */ -	KDB_REPEAT_WITH_ARGS,	/* Repeat the command including its arguments */ -} kdb_repeat_t; - -typedef int (*kdb_func_t)(int, const char **); -  /* KDB return codes from a command or internal kdb function */  #define KDB_NOTFOUND	(-1)  #define KDB_ARGCOUNT	(-2) @@ -149,11 +149,14 @@ extern int kdb_register_repeat(char *, kdb_func_t, char *, char *,  			       short, kdb_repeat_t);  extern int kdb_unregister(char *);  #else /* ! CONFIG_KGDB_KDB */ -#define kdb_printf(...) -#define kdb_init(x) -#define kdb_register(...) -#define kdb_register_repeat(...) -#define kdb_uregister(x) +static inline __printf(1, 2) int kdb_printf(const char *fmt, ...) { return 0; } +static inline void kdb_init(int level) {} +static inline int kdb_register(char *cmd, kdb_func_t func, char *usage, +			       char *help, short minlen) { return 0; } +static inline int kdb_register_repeat(char *cmd, kdb_func_t func, char *usage, +				      char *help, short minlen, +				      kdb_repeat_t repeat) { return 0; } +static inline int kdb_unregister(char *cmd) { return 0; }  #endif	/* CONFIG_KGDB_KDB */  enum {  	KDB_NOT_INITIALIZED, diff --git a/include/linux/kernel.h b/include/linux/kernel.h index 594b419b7d2..2451f1f7a1d 100644 --- a/include/linux/kernel.h +++ b/include/linux/kernel.h @@ -91,7 +91,7 @@  {							\  	typeof(x) __x = x;				\  	typeof(divisor) __d = divisor;			\ -	(((typeof(x))-1) >= 0 || (__x) >= 0) ?		\ +	(((typeof(x))-1) > 0 || (__x) > 0) ?		\  		(((__x) + ((__d) / 2)) / (__d)) :	\  		(((__x) - ((__d) / 2)) / (__d));	\  }							\ diff --git a/include/linux/kernel_stat.h b/include/linux/kernel_stat.h index 2fbd9053c2d..36d12f0884c 100644 --- a/include/linux/kernel_stat.h +++ b/include/linux/kernel_stat.h @@ -130,4 +130,12 @@ extern void account_process_tick(struct task_struct *, int user);  extern void account_steal_ticks(unsigned long ticks);  extern void account_idle_ticks(unsigned long ticks); +#ifdef CONFIG_VIRT_CPU_ACCOUNTING +extern void vtime_task_switch(struct task_struct *prev); +extern void vtime_account_system(struct task_struct *tsk); +extern void vtime_account_idle(struct task_struct *tsk); +#else +static inline void vtime_task_switch(struct task_struct *prev) { } +#endif +  #endif /* _LINUX_KERNEL_STAT_H */ diff --git a/include/linux/kgdb.h b/include/linux/kgdb.h index c4d2fc194ed..4dff0c6ed58 100644 --- a/include/linux/kgdb.h +++ b/include/linux/kgdb.h @@ -240,6 +240,7 @@ extern void kgdb_arch_late(void);   * hardware breakpoints.   * @correct_hw_break: Allow an architecture to specify how to correct the   * hardware debug registers. + * @enable_nmi: Manage NMI-triggered entry to KGDB   */  struct kgdb_arch {  	unsigned char		gdb_bpt_instr[BREAK_INSTR_SIZE]; @@ -252,6 +253,8 @@ struct kgdb_arch {  	void	(*disable_hw_break)(struct pt_regs *regs);  	void	(*remove_all_hw_break)(void);  	void	(*correct_hw_break)(void); + +	void	(*enable_nmi)(bool on);  };  /** @@ -283,6 +286,16 @@ extern struct kgdb_arch		arch_kgdb_ops;  extern unsigned long __weak kgdb_arch_pc(int exception, struct pt_regs *regs); +#ifdef CONFIG_SERIAL_KGDB_NMI +extern int kgdb_register_nmi_console(void); +extern int kgdb_unregister_nmi_console(void); +extern bool kgdb_nmi_poll_knock(void); +#else +static inline int kgdb_register_nmi_console(void) { return 0; } +static inline int kgdb_unregister_nmi_console(void) { return 0; } +static inline bool kgdb_nmi_poll_knock(void) { return 1; } +#endif +  extern int kgdb_register_io_module(struct kgdb_io *local_kgdb_io_ops);  extern void kgdb_unregister_io_module(struct kgdb_io *local_kgdb_io_ops);  extern struct kgdb_io *dbg_io_ops; diff --git a/include/linux/kprobes.h b/include/linux/kprobes.h index b6e1f8c0057..23755ba42ab 100644 --- a/include/linux/kprobes.h +++ b/include/linux/kprobes.h @@ -38,6 +38,7 @@  #include <linux/spinlock.h>  #include <linux/rcupdate.h>  #include <linux/mutex.h> +#include <linux/ftrace.h>  #ifdef CONFIG_KPROBES  #include <asm/kprobes.h> @@ -48,14 +49,26 @@  #define KPROBE_REENTER		0x00000004  #define KPROBE_HIT_SSDONE	0x00000008 +/* + * If function tracer is enabled and the arch supports full + * passing of pt_regs to function tracing, then kprobes can + * optimize on top of function tracing. + */ +#if defined(CONFIG_FUNCTION_TRACER) && defined(ARCH_SUPPORTS_FTRACE_SAVE_REGS) \ +	&& defined(ARCH_SUPPORTS_KPROBES_ON_FTRACE) +# define KPROBES_CAN_USE_FTRACE +#endif +  /* Attach to insert probes on any functions which should be ignored*/  #define __kprobes	__attribute__((__section__(".kprobes.text"))) +  #else /* CONFIG_KPROBES */  typedef int kprobe_opcode_t;  struct arch_specific_insn {  	int dummy;  };  #define __kprobes +  #endif /* CONFIG_KPROBES */  struct kprobe; @@ -128,6 +141,7 @@ struct kprobe {  				   * NOTE:  				   * this flag is only for optimized_kprobe.  				   */ +#define KPROBE_FLAG_FTRACE	8 /* probe is using ftrace */  /* Has this kprobe gone ? */  static inline int kprobe_gone(struct kprobe *p) @@ -146,6 +160,13 @@ static inline int kprobe_optimized(struct kprobe *p)  {  	return p->flags & KPROBE_FLAG_OPTIMIZED;  } + +/* Is this kprobe uses ftrace ? */ +static inline int kprobe_ftrace(struct kprobe *p) +{ +	return p->flags & KPROBE_FLAG_FTRACE; +} +  /*   * Special probe type that uses setjmp-longjmp type tricks to resume   * execution at a specified entry with a matching prototype corresponding @@ -295,6 +316,12 @@ extern int proc_kprobes_optimization_handler(struct ctl_table *table,  #endif  #endif /* CONFIG_OPTPROBES */ +#ifdef KPROBES_CAN_USE_FTRACE +extern void kprobe_ftrace_handler(unsigned long ip, unsigned long parent_ip, +				  struct ftrace_ops *ops, struct pt_regs *regs); +extern int arch_prepare_kprobe_ftrace(struct kprobe *p); +#endif +  /* Get the kprobe at this addr (if any) - called with preemption disabled */  struct kprobe *get_kprobe(void *addr); diff --git a/include/linux/kthread.h b/include/linux/kthread.h index 22ccf9dee17..8d816646f76 100644 --- a/include/linux/kthread.h +++ b/include/linux/kthread.h @@ -14,6 +14,11 @@ struct task_struct *kthread_create_on_node(int (*threadfn)(void *data),  	kthread_create_on_node(threadfn, data, -1, namefmt, ##arg) +struct task_struct *kthread_create_on_cpu(int (*threadfn)(void *data), +					  void *data, +					  unsigned int cpu, +					  const char *namefmt); +  /**   * kthread_run - create and wake a thread.   * @threadfn: the function to run until signal_pending(current). @@ -34,9 +39,13 @@ struct task_struct *kthread_create_on_node(int (*threadfn)(void *data),  void kthread_bind(struct task_struct *k, unsigned int cpu);  int kthread_stop(struct task_struct *k); -int kthread_should_stop(void); +bool kthread_should_stop(void); +bool kthread_should_park(void);  bool kthread_freezable_should_stop(bool *was_frozen);  void *kthread_data(struct task_struct *k); +int kthread_park(struct task_struct *k); +void kthread_unpark(struct task_struct *k); +void kthread_parkme(void);  int kthreadd(void *unused);  extern struct task_struct *kthreadd_task; diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index b70b48b0109..8a59e0abe5f 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -685,7 +685,7 @@ static inline int kvm_deassign_device(struct kvm *kvm,  static inline void kvm_guest_enter(void)  {  	BUG_ON(preemptible()); -	account_system_vtime(current); +	vtime_account(current);  	current->flags |= PF_VCPU;  	/* KVM does not hold any references to rcu protected data when it  	 * switches CPU into a guest mode. In fact switching to a guest mode @@ -699,7 +699,7 @@ static inline void kvm_guest_enter(void)  static inline void kvm_guest_exit(void)  { -	account_system_vtime(current); +	vtime_account(current);  	current->flags &= ~PF_VCPU;  } diff --git a/include/linux/memory.h b/include/linux/memory.h index 1ac7f6e405f..ff9a9f8e0ed 100644 --- a/include/linux/memory.h +++ b/include/linux/memory.h @@ -19,7 +19,7 @@  #include <linux/compiler.h>  #include <linux/mutex.h> -#define MIN_MEMORY_BLOCK_SIZE     (1 << SECTION_SIZE_BITS) +#define MIN_MEMORY_BLOCK_SIZE     (1UL << SECTION_SIZE_BITS)  struct memory_block {  	unsigned long start_section_nr; diff --git a/include/linux/mfd/dbx500-prcmu.h b/include/linux/mfd/dbx500-prcmu.h index 5b90e94399e..c410d99bd66 100644 --- a/include/linux/mfd/dbx500-prcmu.h +++ b/include/linux/mfd/dbx500-prcmu.h @@ -136,6 +136,7 @@ enum prcmu_clock {  	PRCMU_TIMCLK,  	PRCMU_PLLSOC0,  	PRCMU_PLLSOC1, +	PRCMU_ARMSS,  	PRCMU_PLLDDR,  	PRCMU_PLLDSI,  	PRCMU_DSI0CLK, diff --git a/include/linux/mfd/max77686.h b/include/linux/mfd/max77686.h index 3d7ae4d7fd3..46c0f320ed7 100644 --- a/include/linux/mfd/max77686.h +++ b/include/linux/mfd/max77686.h @@ -74,6 +74,7 @@ enum max77686_regulators {  struct max77686_regulator_data {  	int id;  	struct regulator_init_data *initdata; +	struct device_node *of_node;  };  enum max77686_opmode { diff --git a/include/linux/mfd/max8998.h b/include/linux/mfd/max8998.h index f4f0dfa4698..6823548d0c0 100644 --- a/include/linux/mfd/max8998.h +++ b/include/linux/mfd/max8998.h @@ -67,7 +67,7 @@ struct max8998_regulator_data {  /**   * struct max8998_board - packages regulator init data   * @regulators: array of defined regulators - * @num_regulators: number of regultors used + * @num_regulators: number of regulators used   * @irq_base: base IRQ number for max8998, required for IRQs   * @ono: power onoff IRQ number for max8998   * @buck_voltage_lock: Do NOT change the values of the following six diff --git a/include/linux/micrel_phy.h b/include/linux/micrel_phy.h index 61f0905bdc4..de201203bc7 100644 --- a/include/linux/micrel_phy.h +++ b/include/linux/micrel_phy.h @@ -1,3 +1,15 @@ +/* + * include/linux/micrel_phy.h + * + * Micrel PHY IDs + * + * This program is free software; you can redistribute  it and/or modify it + * under  the terms of  the GNU General  Public License as published by the + * Free Software Foundation;  either version 2 of the  License, or (at your + * option) any later version. + * + */ +  #ifndef _MICREL_PHY_H  #define _MICREL_PHY_H @@ -5,10 +17,11 @@  #define PHY_ID_KSZ9021		0x00221610  #define PHY_ID_KS8737		0x00221720 -#define PHY_ID_KS8041		0x00221510 -#define PHY_ID_KS8051		0x00221550 +#define PHY_ID_KSZ8021		0x00221555 +#define PHY_ID_KSZ8041		0x00221510 +#define PHY_ID_KSZ8051		0x00221550  /* both for ks8001 Rev. A/B, and for ks8721 Rev 3. */ -#define PHY_ID_KS8001		0x0022161A +#define PHY_ID_KSZ8001		0x0022161A  /* struct phy_device dev_flags definitions */  #define MICREL_PHY_50MHZ_CLK	0x00000001 diff --git a/include/linux/mod_devicetable.h b/include/linux/mod_devicetable.h index 6955045199b..fed3def6281 100644 --- a/include/linux/mod_devicetable.h +++ b/include/linux/mod_devicetable.h @@ -232,7 +232,7 @@ struct of_device_id  	char	type[32];  	char	compatible[128];  #ifdef __KERNEL__ -	void	*data; +	const void *data;  #else  	kernel_ulong_t data;  #endif @@ -600,4 +600,12 @@ struct x86_cpu_id {  #define X86_MODEL_ANY  0  #define X86_FEATURE_ANY 0	/* Same as FPU, you can't test for that */ +#define IPACK_ANY_FORMAT 0xff +#define IPACK_ANY_ID (~0) +struct ipack_device_id { +	__u8  format;			/* Format version or IPACK_ANY_ID */ +	__u32 vendor;			/* Vendor ID or IPACK_ANY_ID */ +	__u32 device;			/* Device ID or IPACK_ANY_ID */ +}; +  #endif /* LINUX_MOD_DEVICETABLE_H */ diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index 59dc05f3824..5f49cc0a107 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -2720,9 +2720,6 @@ static inline const char *netdev_name(const struct net_device *dev)  	return dev->name;  } -extern int __netdev_printk(const char *level, const struct net_device *dev, -			struct va_format *vaf); -  extern __printf(3, 4)  int netdev_printk(const char *level, const struct net_device *dev,  		  const char *format, ...); diff --git a/include/linux/nvme.h b/include/linux/nvme.h index 9490a00529f..c25cccaa555 100644 --- a/include/linux/nvme.h +++ b/include/linux/nvme.h @@ -35,8 +35,10 @@ struct nvme_bar {  	__u64			acq;	/* Admin CQ Base Address */  }; +#define NVME_CAP_MQES(cap)	((cap) & 0xffff)  #define NVME_CAP_TIMEOUT(cap)	(((cap) >> 24) & 0xff)  #define NVME_CAP_STRIDE(cap)	(((cap) >> 32) & 0xf) +#define NVME_CAP_MPSMIN(cap)	(((cap) >> 48) & 0xf)  enum {  	NVME_CC_ENABLE		= 1 << 0, diff --git a/include/linux/pci-acpi.h b/include/linux/pci-acpi.h index 248fba2af98..9a22b5efb38 100644 --- a/include/linux/pci-acpi.h +++ b/include/linux/pci-acpi.h @@ -22,19 +22,24 @@ extern phys_addr_t acpi_pci_root_get_mcfg_addr(acpi_handle handle);  static inline acpi_handle acpi_find_root_bridge_handle(struct pci_dev *pdev)  {  	struct pci_bus *pbus = pdev->bus; +  	/* Find a PCI root bus */  	while (!pci_is_root_bus(pbus))  		pbus = pbus->parent; -	return acpi_get_pci_rootbridge_handle(pci_domain_nr(pbus), -					      pbus->number); + +	return DEVICE_ACPI_HANDLE(pbus->bridge);  }  static inline acpi_handle acpi_pci_get_bridge_handle(struct pci_bus *pbus)  { -	if (!pci_is_root_bus(pbus)) -		return DEVICE_ACPI_HANDLE(&(pbus->self->dev)); -	return acpi_get_pci_rootbridge_handle(pci_domain_nr(pbus), -					      pbus->number); +	struct device *dev; + +	if (pci_is_root_bus(pbus)) +		dev = pbus->bridge; +	else +		dev = &pbus->self->dev; + +	return DEVICE_ACPI_HANDLE(dev);  }  #endif diff --git a/include/linux/pci.h b/include/linux/pci.h index 5faa8310eec..be1de01de1c 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h @@ -254,10 +254,10 @@ struct pci_dev {  	u8		revision;	/* PCI revision, low byte of class word */  	u8		hdr_type;	/* PCI header type (`multi' flag masked out) */  	u8		pcie_cap;	/* PCI-E capability offset */ -	u8		pcie_type:4;	/* PCI-E device/port type */  	u8		pcie_mpss:3;	/* PCI-E Max Payload Size Supported */  	u8		rom_base_reg;	/* which config register controls the ROM */  	u8		pin;  		/* which interrupt pin this device uses */ +	u16		pcie_flags_reg;	/* cached PCI-E Capabilities Register */  	struct pci_driver *driver;	/* which driver has allocated this device */  	u64		dma_mask;	/* Mask of the bits of bus address this @@ -369,7 +369,6 @@ static inline struct pci_dev *pci_physfn(struct pci_dev *dev)  extern struct pci_dev *alloc_pci_dev(void); -#define pci_dev_b(n) list_entry(n, struct pci_dev, bus_list)  #define	to_pci_dev(n) container_of(n, struct pci_dev, dev)  #define for_each_pci_dev(d) while ((d = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, d)) != NULL) @@ -596,7 +595,7 @@ struct pci_driver {  	int  (*resume_early) (struct pci_dev *dev);  	int  (*resume) (struct pci_dev *dev);	                /* Device woken up */  	void (*shutdown) (struct pci_dev *dev); -	struct pci_error_handlers *err_handler; +	const struct pci_error_handlers *err_handler;  	struct device_driver	driver;  	struct pci_dynids dynids;  }; @@ -734,9 +733,7 @@ u8 pci_common_swizzle(struct pci_dev *dev, u8 *pinp);  extern struct pci_dev *pci_dev_get(struct pci_dev *dev);  extern void pci_dev_put(struct pci_dev *dev);  extern void pci_remove_bus(struct pci_bus *b); -extern void __pci_remove_bus_device(struct pci_dev *dev);  extern void pci_stop_and_remove_bus_device(struct pci_dev *dev); -extern void pci_stop_bus_device(struct pci_dev *dev);  void pci_setup_cardbus(struct pci_bus *bus);  extern void pci_sort_breadthfirst(void);  #define dev_is_pci(d) ((d)->bus == &pci_bus_type) @@ -755,6 +752,7 @@ enum pci_lost_interrupt_reason pci_lost_interrupt(struct pci_dev *dev);  int pci_find_capability(struct pci_dev *dev, int cap);  int pci_find_next_capability(struct pci_dev *dev, u8 pos, int cap);  int pci_find_ext_capability(struct pci_dev *dev, int cap); +int pci_find_next_ext_capability(struct pci_dev *dev, int pos, int cap);  int pci_find_ht_capability(struct pci_dev *dev, int ht_cap);  int pci_find_next_ht_capability(struct pci_dev *dev, int pos, int ht_cap);  struct pci_bus *pci_find_next_bus(const struct pci_bus *from); @@ -816,6 +814,39 @@ static inline int pci_write_config_dword(const struct pci_dev *dev, int where,  	return pci_bus_write_config_dword(dev->bus, dev->devfn, where, val);  } +int pcie_capability_read_word(struct pci_dev *dev, int pos, u16 *val); +int pcie_capability_read_dword(struct pci_dev *dev, int pos, u32 *val); +int pcie_capability_write_word(struct pci_dev *dev, int pos, u16 val); +int pcie_capability_write_dword(struct pci_dev *dev, int pos, u32 val); +int pcie_capability_clear_and_set_word(struct pci_dev *dev, int pos, +				       u16 clear, u16 set); +int pcie_capability_clear_and_set_dword(struct pci_dev *dev, int pos, +					u32 clear, u32 set); + +static inline int pcie_capability_set_word(struct pci_dev *dev, int pos, +					   u16 set) +{ +	return pcie_capability_clear_and_set_word(dev, pos, 0, set); +} + +static inline int pcie_capability_set_dword(struct pci_dev *dev, int pos, +					    u32 set) +{ +	return pcie_capability_clear_and_set_dword(dev, pos, 0, set); +} + +static inline int pcie_capability_clear_word(struct pci_dev *dev, int pos, +					     u16 clear) +{ +	return pcie_capability_clear_and_set_word(dev, pos, clear, 0); +} + +static inline int pcie_capability_clear_dword(struct pci_dev *dev, int pos, +					      u32 clear) +{ +	return pcie_capability_clear_and_set_dword(dev, pos, clear, 0); +} +  /* user-space driven config access */  int pci_user_read_config_byte(struct pci_dev *dev, int where, u8 *val);  int pci_user_read_config_word(struct pci_dev *dev, int where, u16 *val); @@ -1013,7 +1044,6 @@ void pci_unregister_driver(struct pci_driver *dev);  	module_driver(__pci_driver, pci_register_driver, \  		       pci_unregister_driver) -void pci_stop_and_remove_behind_bridge(struct pci_dev *dev);  struct pci_driver *pci_dev_driver(const struct pci_dev *dev);  int pci_add_dynid(struct pci_driver *drv,  		  unsigned int vendor, unsigned int device, @@ -1031,6 +1061,8 @@ int pci_cfg_space_size_ext(struct pci_dev *dev);  int pci_cfg_space_size(struct pci_dev *dev);  unsigned char pci_bus_max_busnr(struct pci_bus *bus);  void pci_setup_bridge(struct pci_bus *bus); +resource_size_t pcibios_window_alignment(struct pci_bus *bus, +					 unsigned long type);  #define PCI_VGA_STATE_CHANGE_BRIDGE (1 << 0)  #define PCI_VGA_STATE_CHANGE_DECODES (1 << 1) @@ -1472,7 +1504,7 @@ enum pci_fixup_pass {  /* Anonymous variables would be nice... */  #define DECLARE_PCI_FIXUP_SECTION(section, name, vendor, device, class,	\  				  class_shift, hook)			\ -	static const struct pci_fixup const __pci_fixup_##name __used	\ +	static const struct pci_fixup __pci_fixup_##name __used		\  	__attribute__((__section__(#section), aligned((sizeof(void *)))))    \  		= { vendor, device, class, class_shift, hook }; @@ -1650,6 +1682,15 @@ static inline bool pci_is_pcie(struct pci_dev *dev)  	return !!pci_pcie_cap(dev);  } +/** + * pci_pcie_type - get the PCIe device/port type + * @dev: PCI device + */ +static inline int pci_pcie_type(const struct pci_dev *dev) +{ +	return (dev->pcie_flags_reg & PCI_EXP_FLAGS_TYPE) >> 4; +} +  void pci_request_acs(void);  bool pci_acs_enabled(struct pci_dev *pdev, u16 acs_flags);  bool pci_acs_path_enabled(struct pci_dev *start, diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h index 6b4565c440c..8d3c4271938 100644 --- a/include/linux/pci_ids.h +++ b/include/linux/pci_ids.h @@ -1847,7 +1847,6 @@  #define PCI_DEVICE_ID_SIIG_8S_20x_650	0x2081  #define PCI_DEVICE_ID_SIIG_8S_20x_850	0x2082  #define PCI_SUBDEVICE_ID_SIIG_QUARTET_SERIAL	0x2050 -#define PCI_SUBDEVICE_ID_SIIG_DUAL_SERIAL	0x2530  #define PCI_VENDOR_ID_RADISYS		0x1331 diff --git a/include/linux/pci_regs.h b/include/linux/pci_regs.h index 7fb75b14375..20ae747ddf3 100644 --- a/include/linux/pci_regs.h +++ b/include/linux/pci_regs.h @@ -549,6 +549,7 @@  #define  PCI_EXP_LNKCAP2_SLS_8_0GB 0x04	/* Current Link Speed 8.0GT/s */  #define  PCI_EXP_LNKCAP2_CROSSLINK 0x100 /* Crosslink supported */  #define PCI_EXP_LNKCTL2		48	/* Link Control 2 */ +#define PCI_EXP_LNKSTA2		50	/* Link Status 2 */  #define PCI_EXP_SLTCTL2		56	/* Slot Control 2 */  /* Extended Capabilities (PCI-X 2.0 and Express) */ @@ -677,6 +678,12 @@  #define  PCI_PWR_CAP_BUDGET(x)	((x) & 1)	/* Included in system budget */  #define PCI_EXT_CAP_PWR_SIZEOF	16 +/* Vendor-Specific (VSEC, PCI_EXT_CAP_ID_VNDR) */ +#define PCI_VNDR_HEADER		4	/* Vendor-Specific Header */ +#define  PCI_VNDR_HEADER_ID(x)	((x) & 0xffff) +#define  PCI_VNDR_HEADER_REV(x)	(((x) >> 16) & 0xf) +#define  PCI_VNDR_HEADER_LEN(x)	(((x) >> 20) & 0xfff) +  /*   * Hypertransport sub capability types   * diff --git a/include/linux/pcieport_if.h b/include/linux/pcieport_if.h index 6775532b92a..e6f91b1406d 100644 --- a/include/linux/pcieport_if.h +++ b/include/linux/pcieport_if.h @@ -49,7 +49,7 @@ struct pcie_port_service_driver {  	int (*resume) (struct pcie_device *dev);  	/* Service Error Recovery Handler */ -	struct pci_error_handlers *err_handler; +	const struct pci_error_handlers *err_handler;  	/* Link Reset Capability - AER service driver specific */  	pci_ers_result_t (*reset_link) (struct pci_dev *dev); diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h index 33ed9d605f9..599afc4bb67 100644 --- a/include/linux/perf_event.h +++ b/include/linux/perf_event.h @@ -130,8 +130,10 @@ enum perf_event_sample_format {  	PERF_SAMPLE_STREAM_ID			= 1U << 9,  	PERF_SAMPLE_RAW				= 1U << 10,  	PERF_SAMPLE_BRANCH_STACK		= 1U << 11, +	PERF_SAMPLE_REGS_USER			= 1U << 12, +	PERF_SAMPLE_STACK_USER			= 1U << 13, -	PERF_SAMPLE_MAX = 1U << 12,		/* non-ABI */ +	PERF_SAMPLE_MAX = 1U << 14,		/* non-ABI */  };  /* @@ -163,6 +165,15 @@ enum perf_branch_sample_type {  	 PERF_SAMPLE_BRANCH_HV)  /* + * Values to determine ABI of the registers dump. + */ +enum perf_sample_regs_abi { +	PERF_SAMPLE_REGS_ABI_NONE	= 0, +	PERF_SAMPLE_REGS_ABI_32		= 1, +	PERF_SAMPLE_REGS_ABI_64		= 2, +}; + +/*   * The format of the data returned by read() on a perf event fd,   * as specified by attr.read_format:   * @@ -194,6 +205,8 @@ enum perf_event_read_format {  #define PERF_ATTR_SIZE_VER0	64	/* sizeof first published struct */  #define PERF_ATTR_SIZE_VER1	72	/* add: config2 */  #define PERF_ATTR_SIZE_VER2	80	/* add: branch_sample_type */ +#define PERF_ATTR_SIZE_VER3	96	/* add: sample_regs_user */ +					/* add: sample_stack_user */  /*   * Hardware event_id to monitor via a performance monitoring event: @@ -255,7 +268,10 @@ struct perf_event_attr {  				exclude_host   :  1, /* don't count in host   */  				exclude_guest  :  1, /* don't count in guest  */ -				__reserved_1   : 43; +				exclude_callchain_kernel : 1, /* exclude kernel callchains */ +				exclude_callchain_user   : 1, /* exclude user callchains */ + +				__reserved_1   : 41;  	union {  		__u32		wakeup_events;	  /* wakeup every n events */ @@ -271,9 +287,25 @@ struct perf_event_attr {  		__u64		bp_len;  		__u64		config2; /* extension of config1 */  	}; -	__u64	branch_sample_type; /* enum branch_sample_type */ +	__u64	branch_sample_type; /* enum perf_branch_sample_type */ + +	/* +	 * Defines set of user regs to dump on samples. +	 * See asm/perf_regs.h for details. +	 */ +	__u64	sample_regs_user; + +	/* +	 * Defines size of the user stack to dump on samples. +	 */ +	__u32	sample_stack_user; + +	/* Align to u64. */ +	__u32	__reserved_2;  }; +#define perf_flags(attr)	(*(&(attr)->read_format + 1)) +  /*   * Ioctls that can be done on a perf event fd:   */ @@ -548,6 +580,13 @@ enum perf_event_type {  	 *	  char                  data[size];}&& PERF_SAMPLE_RAW  	 *  	 *	{ u64 from, to, flags } lbr[nr];} && PERF_SAMPLE_BRANCH_STACK +	 * +	 * 	{ u64			abi; # enum perf_sample_regs_abi +	 * 	  u64			regs[weight(mask)]; } && PERF_SAMPLE_REGS_USER +	 * +	 * 	{ u64			size; +	 * 	  char			data[size]; +	 * 	  u64			dyn_size; } && PERF_SAMPLE_STACK_USER  	 * };  	 */  	PERF_RECORD_SAMPLE			= 9, @@ -609,6 +648,7 @@ struct perf_guest_info_callbacks {  #include <linux/static_key.h>  #include <linux/atomic.h>  #include <linux/sysfs.h> +#include <linux/perf_regs.h>  #include <asm/local.h>  struct perf_callchain_entry { @@ -654,6 +694,11 @@ struct perf_branch_stack {  	struct perf_branch_entry	entries[0];  }; +struct perf_regs_user { +	__u64		abi; +	struct pt_regs	*regs; +}; +  struct task_struct;  /* @@ -1133,6 +1178,8 @@ struct perf_sample_data {  	struct perf_callchain_entry	*callchain;  	struct perf_raw_record		*raw;  	struct perf_branch_stack	*br_stack; +	struct perf_regs_user		regs_user; +	u64				stack_user_size;  };  static inline void perf_sample_data_init(struct perf_sample_data *data, @@ -1142,7 +1189,10 @@ static inline void perf_sample_data_init(struct perf_sample_data *data,  	data->addr = addr;  	data->raw  = NULL;  	data->br_stack = NULL; -	data->period	= period; +	data->period = period; +	data->regs_user.abi = PERF_SAMPLE_REGS_ABI_NONE; +	data->regs_user.regs = NULL; +	data->stack_user_size = 0;  }  extern void perf_output_sample(struct perf_output_handle *handle, @@ -1290,8 +1340,10 @@ static inline bool has_branch_stack(struct perf_event *event)  extern int perf_output_begin(struct perf_output_handle *handle,  			     struct perf_event *event, unsigned int size);  extern void perf_output_end(struct perf_output_handle *handle); -extern void perf_output_copy(struct perf_output_handle *handle, +extern unsigned int perf_output_copy(struct perf_output_handle *handle,  			     const void *buf, unsigned int len); +extern unsigned int perf_output_skip(struct perf_output_handle *handle, +				     unsigned int len);  extern int perf_swevent_get_recursion_context(void);  extern void perf_swevent_put_recursion_context(int rctx);  extern void perf_event_enable(struct perf_event *event); diff --git a/include/linux/perf_regs.h b/include/linux/perf_regs.h new file mode 100644 index 00000000000..3c73d5fe18b --- /dev/null +++ b/include/linux/perf_regs.h @@ -0,0 +1,25 @@ +#ifndef _LINUX_PERF_REGS_H +#define _LINUX_PERF_REGS_H + +#ifdef CONFIG_HAVE_PERF_REGS +#include <asm/perf_regs.h> +u64 perf_reg_value(struct pt_regs *regs, int idx); +int perf_reg_validate(u64 mask); +u64 perf_reg_abi(struct task_struct *task); +#else +static inline u64 perf_reg_value(struct pt_regs *regs, int idx) +{ +	return 0; +} + +static inline int perf_reg_validate(u64 mask) +{ +	return mask ? -ENOSYS : 0; +} + +static inline u64 perf_reg_abi(struct task_struct *task) +{ +	return PERF_SAMPLE_REGS_ABI_NONE; +} +#endif /* CONFIG_HAVE_PERF_REGS */ +#endif /* _LINUX_PERF_REGS_H */ diff --git a/include/linux/platform_data/ad5755.h b/include/linux/platform_data/ad5755.h new file mode 100644 index 00000000000..a5a1cb75187 --- /dev/null +++ b/include/linux/platform_data/ad5755.h @@ -0,0 +1,103 @@ +/* + * Copyright 2012 Analog Devices Inc. + * + * Licensed under the GPL-2. + */ +#ifndef __LINUX_PLATFORM_DATA_AD5755_H__ +#define __LINUX_PLATFORM_DATA_AD5755_H__ + +enum ad5755_mode { +	AD5755_MODE_VOLTAGE_0V_5V		= 0, +	AD5755_MODE_VOLTAGE_0V_10V		= 1, +	AD5755_MODE_VOLTAGE_PLUSMINUS_5V	= 2, +	AD5755_MODE_VOLTAGE_PLUSMINUS_10V	= 3, +	AD5755_MODE_CURRENT_4mA_20mA		= 4, +	AD5755_MODE_CURRENT_0mA_20mA		= 5, +	AD5755_MODE_CURRENT_0mA_24mA		= 6, +}; + +enum ad5755_dc_dc_phase { +	AD5755_DC_DC_PHASE_ALL_SAME_EDGE		= 0, +	AD5755_DC_DC_PHASE_A_B_SAME_EDGE_C_D_OPP_EDGE	= 1, +	AD5755_DC_DC_PHASE_A_C_SAME_EDGE_B_D_OPP_EDGE	= 2, +	AD5755_DC_DC_PHASE_90_DEGREE			= 3, +}; + +enum ad5755_dc_dc_freq { +	AD5755_DC_DC_FREQ_250kHZ = 0, +	AD5755_DC_DC_FREQ_410kHZ = 1, +	AD5755_DC_DC_FREQ_650kHZ = 2, +}; + +enum ad5755_dc_dc_maxv { +	AD5755_DC_DC_MAXV_23V	= 0, +	AD5755_DC_DC_MAXV_24V5	= 1, +	AD5755_DC_DC_MAXV_27V	= 2, +	AD5755_DC_DC_MAXV_29V5	= 3, +}; + +enum ad5755_slew_rate { +	AD5755_SLEW_RATE_64k	= 0, +	AD5755_SLEW_RATE_32k	= 1, +	AD5755_SLEW_RATE_16k	= 2, +	AD5755_SLEW_RATE_8k	= 3, +	AD5755_SLEW_RATE_4k	= 4, +	AD5755_SLEW_RATE_2k	= 5, +	AD5755_SLEW_RATE_1k	= 6, +	AD5755_SLEW_RATE_500	= 7, +	AD5755_SLEW_RATE_250	= 8, +	AD5755_SLEW_RATE_125	= 9, +	AD5755_SLEW_RATE_64	= 10, +	AD5755_SLEW_RATE_32	= 11, +	AD5755_SLEW_RATE_16	= 12, +	AD5755_SLEW_RATE_8	= 13, +	AD5755_SLEW_RATE_4	= 14, +	AD5755_SLEW_RATE_0_5	= 15, +}; + +enum ad5755_slew_step_size { +	AD5755_SLEW_STEP_SIZE_1 = 0, +	AD5755_SLEW_STEP_SIZE_2 = 1, +	AD5755_SLEW_STEP_SIZE_4 = 2, +	AD5755_SLEW_STEP_SIZE_8 = 3, +	AD5755_SLEW_STEP_SIZE_16 = 4, +	AD5755_SLEW_STEP_SIZE_32 = 5, +	AD5755_SLEW_STEP_SIZE_64 = 6, +	AD5755_SLEW_STEP_SIZE_128 = 7, +	AD5755_SLEW_STEP_SIZE_256 = 8, +}; + +/** + * struct ad5755_platform_data - AD5755 DAC driver platform data + * @ext_dc_dc_compenstation_resistor: Whether an external DC-DC converter + * compensation register is used. + * @dc_dc_phase: DC-DC converter phase. + * @dc_dc_freq: DC-DC converter frequency. + * @dc_dc_maxv: DC-DC maximum allowed boost voltage. + * @dac.mode: The mode to be used for the DAC output. + * @dac.ext_current_sense_resistor: Whether an external current sense resistor + * is used. + * @dac.enable_voltage_overrange: Whether to enable 20% voltage output overrange. + * @dac.slew.enable: Whether to enable digital slew. + * @dac.slew.rate: Slew rate of the digital slew. + * @dac.slew.step_size: Slew step size of the digital slew. + **/ +struct ad5755_platform_data { +	bool ext_dc_dc_compenstation_resistor; +	enum ad5755_dc_dc_phase dc_dc_phase; +	enum ad5755_dc_dc_freq dc_dc_freq; +	enum ad5755_dc_dc_maxv dc_dc_maxv; + +	struct { +		enum ad5755_mode mode; +		bool ext_current_sense_resistor; +		bool enable_voltage_overrange; +		struct { +			bool enable; +			enum ad5755_slew_rate rate; +			enum ad5755_slew_step_size step_size; +		} slew; +	} dac[4]; +}; + +#endif diff --git a/include/linux/platform_data/ad7791.h b/include/linux/platform_data/ad7791.h new file mode 100644 index 00000000000..f9e4db1b82a --- /dev/null +++ b/include/linux/platform_data/ad7791.h @@ -0,0 +1,17 @@ +#ifndef __LINUX_PLATFORM_DATA_AD7791__ +#define __LINUX_PLATFORM_DATA_AD7791__ + +/** + * struct ad7791_platform_data - AD7791 device platform data + * @buffered: If set to true configure the device for buffered input mode. + * @burnout_current: If set to true the 100mA burnout current is enabled. + * @unipolar: If set to true sample in unipolar mode, if set to false sample in + *		bipolar mode. + */ +struct ad7791_platform_data { +	bool buffered; +	bool burnout_current; +	bool unipolar; +}; + +#endif diff --git a/include/linux/platform_data/clk-realview.h b/include/linux/platform_data/clk-realview.h new file mode 100644 index 00000000000..2e426a7dbc5 --- /dev/null +++ b/include/linux/platform_data/clk-realview.h @@ -0,0 +1 @@ +void realview_clk_init(void __iomem *sysbase, bool is_pb1176); diff --git a/include/linux/platform_data/clk-ux500.h b/include/linux/platform_data/clk-ux500.h new file mode 100644 index 00000000000..3af0da1f3be --- /dev/null +++ b/include/linux/platform_data/clk-ux500.h @@ -0,0 +1,17 @@ +/* + * Clock definitions for ux500 platforms + * + * Copyright (C) 2012 ST-Ericsson SA + * Author: Ulf Hansson <ulf.hansson@linaro.org> + * + * License terms: GNU General Public License (GPL) version 2 + */ + +#ifndef __CLK_UX500_H +#define __CLK_UX500_H + +void u8500_clk_init(void); +void u9540_clk_init(void); +void u8540_clk_init(void); + +#endif /* __CLK_UX500_H */ diff --git a/include/linux/platform_data/max197.h b/include/linux/platform_data/max197.h new file mode 100644 index 00000000000..e2a41dd7690 --- /dev/null +++ b/include/linux/platform_data/max197.h @@ -0,0 +1,21 @@ +/* + * Maxim MAX197 A/D Converter Driver + * + * Copyright (c) 2012 Savoir-faire Linux Inc. + *          Vivien Didelot <vivien.didelot@savoirfairelinux.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * For further information, see the Documentation/hwmon/max197 file. + */ + +/** + * struct max197_platform_data - MAX197 connectivity info + * @convert:	Function used to start a conversion with control byte ctrl. + *		It must return the raw data, or a negative error code. + */ +struct max197_platform_data { +	int (*convert)(u8 ctrl); +}; diff --git a/include/linux/sht15.h b/include/linux/platform_data/sht15.h index f85c7c523da..33e0fd27225 100644 --- a/include/linux/sht15.h +++ b/include/linux/platform_data/sht15.h @@ -31,4 +31,3 @@ struct sht15_platform_data {  	bool no_otp_reload;  	bool low_resolution;  }; - diff --git a/include/linux/platform_device.h b/include/linux/platform_device.h index 60e9994ef40..5711e9525a2 100644 --- a/include/linux/platform_device.h +++ b/include/linux/platform_device.h @@ -14,11 +14,15 @@  #include <linux/device.h>  #include <linux/mod_devicetable.h> +#define PLATFORM_DEVID_NONE	(-1) +#define PLATFORM_DEVID_AUTO	(-2) +  struct mfd_cell;  struct platform_device {  	const char	* name;  	int		id; +	bool		id_auto;  	struct device	dev;  	u32		num_resources;  	struct resource	* resource; diff --git a/include/linux/pm.h b/include/linux/pm.h index f067e60a383..88f034a23f2 100644 --- a/include/linux/pm.h +++ b/include/linux/pm.h @@ -638,6 +638,7 @@ extern void __suspend_report_result(const char *function, void *fn, int ret);  	} while (0)  extern int device_pm_wait_for_dev(struct device *sub, struct device *dev); +extern void dpm_for_each_dev(void *data, void (*fn)(struct device *, void *));  extern int pm_generic_prepare(struct device *dev);  extern int pm_generic_suspend_late(struct device *dev); @@ -677,6 +678,10 @@ static inline int device_pm_wait_for_dev(struct device *a, struct device *b)  	return 0;  } +static inline void dpm_for_each_dev(void *data, void (*fn)(struct device *, void *)) +{ +} +  #define pm_generic_prepare	NULL  #define pm_generic_suspend	NULL  #define pm_generic_resume	NULL diff --git a/include/linux/power/generic-adc-battery.h b/include/linux/power/generic-adc-battery.h new file mode 100644 index 00000000000..b1ebe08533b --- /dev/null +++ b/include/linux/power/generic-adc-battery.h @@ -0,0 +1,29 @@ +/* + * Copyright (C) 2012, Anish Kumar <anish198519851985@gmail.com> + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef GENERIC_ADC_BATTERY_H +#define GENERIC_ADC_BATTERY_H + +/** + * struct gab_platform_data - platform_data for generic adc iio battery driver. + * @battery_info:         recommended structure to specify static power supply + *			   parameters + * @cal_charge:           calculate charge level. + * @gpio_charge_finished: gpio for the charger. + * @gpio_inverted:        Should be 1 if the GPIO is active low otherwise 0 + * @jitter_delay:         delay required after the interrupt to check battery + *			  status.Default set is 10ms. + */ +struct gab_platform_data { +	struct power_supply_info battery_info; +	int	(*cal_charge)(long value); +	int	gpio_charge_finished; +	bool	gpio_inverted; +	int     jitter_delay; +}; + +#endif /* GENERIC_ADC_BATTERY_H */ diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h index 115ead2b515..7c968e4f929 100644 --- a/include/linux/rcupdate.h +++ b/include/linux/rcupdate.h @@ -191,6 +191,21 @@ extern void rcu_idle_enter(void);  extern void rcu_idle_exit(void);  extern void rcu_irq_enter(void);  extern void rcu_irq_exit(void); + +#ifdef CONFIG_RCU_USER_QS +extern void rcu_user_enter(void); +extern void rcu_user_exit(void); +extern void rcu_user_enter_after_irq(void); +extern void rcu_user_exit_after_irq(void); +extern void rcu_user_hooks_switch(struct task_struct *prev, +				  struct task_struct *next); +#else +static inline void rcu_user_enter(void) { } +static inline void rcu_user_exit(void) { } +static inline void rcu_user_enter_after_irq(void) { } +static inline void rcu_user_exit_after_irq(void) { } +#endif /* CONFIG_RCU_USER_QS */ +  extern void exit_rcu(void);  /** @@ -210,14 +225,12 @@ extern void exit_rcu(void);   * to nest RCU_NONIDLE() wrappers, but the nesting level is currently   * quite limited.  If deeper nesting is required, it will be necessary   * to adjust DYNTICK_TASK_NESTING_VALUE accordingly. - * - * This macro may be used from process-level code only.   */  #define RCU_NONIDLE(a) \  	do { \ -		rcu_idle_exit(); \ +		rcu_irq_enter(); \  		do { a; } while (0); \ -		rcu_idle_enter(); \ +		rcu_irq_exit(); \  	} while (0)  /* diff --git a/include/linux/regmap.h b/include/linux/regmap.h index 7f7e00df3ad..e3bcc3f4dcb 100644 --- a/include/linux/regmap.h +++ b/include/linux/regmap.h @@ -285,6 +285,7 @@ struct regmap_irq {   * @ack_base:    Base ack address.  If zero then the chip is clear on read.   * @wake_base:   Base address for wake enables.  If zero unsupported.   * @irq_reg_stride:  Stride to use for chips where registers are not contiguous. + * @runtime_pm:  Hold a runtime PM lock on the device when accessing it.   *   * @num_regs:    Number of registers in each control bank.   * @irqs:        Descriptors for individual IRQs.  Interrupt numbers are @@ -299,6 +300,8 @@ struct regmap_irq_chip {  	unsigned int ack_base;  	unsigned int wake_base;  	unsigned int irq_reg_stride; +	unsigned int mask_invert; +	bool runtime_pm;  	int num_regs; diff --git a/include/linux/regulator/consumer.h b/include/linux/regulator/consumer.h index da339fd8c75..c43cd3556b1 100644 --- a/include/linux/regulator/consumer.h +++ b/include/linux/regulator/consumer.h @@ -177,6 +177,8 @@ int regulator_set_mode(struct regulator *regulator, unsigned int mode);  unsigned int regulator_get_mode(struct regulator *regulator);  int regulator_set_optimum_mode(struct regulator *regulator, int load_uA); +int regulator_allow_bypass(struct regulator *regulator, bool allow); +  /* regulator notifier block */  int regulator_register_notifier(struct regulator *regulator,  			      struct notifier_block *nb); @@ -328,6 +330,12 @@ static inline int regulator_set_optimum_mode(struct regulator *regulator,  	return REGULATOR_MODE_NORMAL;  } +static inline int regulator_allow_bypass(struct regulator *regulator, +					 bool allow) +{ +	return 0; +} +  static inline int regulator_register_notifier(struct regulator *regulator,  			      struct notifier_block *nb)  { @@ -352,4 +360,11 @@ static inline void regulator_set_drvdata(struct regulator *regulator,  #endif +static inline int regulator_set_voltage_tol(struct regulator *regulator, +					    int new_uV, int tol_uV) +{ +	return regulator_set_voltage(regulator, +				     new_uV - tol_uV, new_uV + tol_uV); +} +  #endif diff --git a/include/linux/regulator/driver.h b/include/linux/regulator/driver.h index bac4c871f3b..7932a3bf21b 100644 --- a/include/linux/regulator/driver.h +++ b/include/linux/regulator/driver.h @@ -32,6 +32,8 @@ enum regulator_status {  	REGULATOR_STATUS_NORMAL,  	REGULATOR_STATUS_IDLE,  	REGULATOR_STATUS_STANDBY, +	/* The regulator is enabled but not regulating */ +	REGULATOR_STATUS_BYPASS,  	/* in case that any other status doesn't apply */  	REGULATOR_STATUS_UNDEFINED,  }; @@ -58,6 +60,7 @@ enum regulator_status {   *	regulator_desc.n_voltages.  Voltages may be reported in any order.   *   * @set_current_limit: Configure a limit for a current-limited regulator. + *                     The driver should select the current closest to max_uA.   * @get_current_limit: Get the configured limit for a current-limited regulator.   *   * @set_mode: Set the configured operating mode for the regulator. @@ -67,6 +70,9 @@ enum regulator_status {   * @get_optimum_mode: Get the most efficient operating mode for the regulator   *                    when running with the specified parameters.   * + * @set_bypass: Set the regulator in bypass mode. + * @get_bypass: Get the regulator bypass mode state. + *   * @enable_time: Time taken for the regulator voltage output voltage to   *               stabilise after being enabled, in microseconds.   * @set_ramp_delay: Set the ramp delay for the regulator. The driver should @@ -133,6 +139,10 @@ struct regulator_ops {  	unsigned int (*get_optimum_mode) (struct regulator_dev *, int input_uV,  					  int output_uV, int load_uA); +	/* control and report on bypass mode */ +	int (*set_bypass)(struct regulator_dev *dev, bool enable); +	int (*get_bypass)(struct regulator_dev *dev, bool *enable); +  	/* the operations below are for configuration of regulator state when  	 * its parent PMIC enters a global STANDBY/HIBERNATE state */ @@ -205,6 +215,8 @@ struct regulator_desc {  	unsigned int vsel_mask;  	unsigned int enable_reg;  	unsigned int enable_mask; +	unsigned int bypass_reg; +	unsigned int bypass_mask;  	unsigned int enable_time;  }; @@ -221,7 +233,8 @@ struct regulator_desc {   * @driver_data: private regulator data   * @of_node: OpenFirmware node to parse for device tree bindings (may be   *           NULL). - * @regmap: regmap to use for core regmap helpers + * @regmap: regmap to use for core regmap helpers if dev_get_regulator() is + *          insufficient.   * @ena_gpio: GPIO controlling regulator enable.   * @ena_gpio_invert: Sense for GPIO enable control.   * @ena_gpio_flags: Flags to use when calling gpio_request_one() @@ -253,6 +266,7 @@ struct regulator_dev {  	int exclusive;  	u32 use_count;  	u32 open_count; +	u32 bypass_count;  	/* lists we belong to */  	struct list_head list; /* list of all regulators */ @@ -310,6 +324,8 @@ int regulator_disable_regmap(struct regulator_dev *rdev);  int regulator_set_voltage_time_sel(struct regulator_dev *rdev,  				   unsigned int old_selector,  				   unsigned int new_selector); +int regulator_set_bypass_regmap(struct regulator_dev *rdev, bool enable); +int regulator_get_bypass_regmap(struct regulator_dev *rdev, bool *enable);  void *regulator_get_init_drvdata(struct regulator_init_data *reg_init_data); diff --git a/include/linux/regulator/fan53555.h b/include/linux/regulator/fan53555.h new file mode 100644 index 00000000000..5c45c85d52c --- /dev/null +++ b/include/linux/regulator/fan53555.h @@ -0,0 +1,60 @@ +/* + * fan53555.h - Fairchild Regulator FAN53555 Driver + * + * Copyright (C) 2012 Marvell Technology Ltd. + * Yunfan Zhang <yfzhang@marvell.com> + * + * This package is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ + +#ifndef __FAN53555_H__ + +/* VSEL ID */ +enum { +	FAN53555_VSEL_ID_0 = 0, +	FAN53555_VSEL_ID_1, +}; + +/* Transition slew rate limiting from a low to high voltage. + * ----------------------- + *   Bin |Slew Rate(mV/uS) + * ------|---------------- + *   000 |    64.00 + * ------|---------------- + *   001 |    32.00 + * ------|---------------- + *   010 |    16.00 + * ------|---------------- + *   011 |     8.00 + * ------|---------------- + *   100 |     4.00 + * ------|---------------- + *   101 |     2.00 + * ------|---------------- + *   110 |     1.00 + * ------|---------------- + *   111 |     0.50 + * ----------------------- + */ +enum { +	FAN53555_SLEW_RATE_64MV = 0, +	FAN53555_SLEW_RATE_32MV, +	FAN53555_SLEW_RATE_16MV, +	FAN53555_SLEW_RATE_8MV, +	FAN53555_SLEW_RATE_4MV, +	FAN53555_SLEW_RATE_2MV, +	FAN53555_SLEW_RATE_1MV, +	FAN53555_SLEW_RATE_0_5MV, +}; + +struct fan53555_platform_data { +	struct regulator_init_data *regulator; +	unsigned int slew_rate; +	/* Sleep VSEL ID */ +	unsigned int sleep_vsel_id; +}; + +#endif /* __FAN53555_H__ */ diff --git a/include/linux/regulator/machine.h b/include/linux/regulator/machine.h index 40dd0a394cf..36adbc82de6 100644 --- a/include/linux/regulator/machine.h +++ b/include/linux/regulator/machine.h @@ -32,6 +32,7 @@ struct regulator;   *           board/machine.   * STATUS:   Regulator can be enabled and disabled.   * DRMS:     Dynamic Regulator Mode Switching is enabled for this regulator. + * BYPASS:   Regulator can be put into bypass mode   */  #define REGULATOR_CHANGE_VOLTAGE	0x1 @@ -39,6 +40,7 @@ struct regulator;  #define REGULATOR_CHANGE_MODE		0x4  #define REGULATOR_CHANGE_STATUS		0x8  #define REGULATOR_CHANGE_DRMS		0x10 +#define REGULATOR_CHANGE_BYPASS		0x20  /**   * struct regulator_state - regulator state during low power system states diff --git a/include/linux/sched.h b/include/linux/sched.h index 23bddac4bad..765dffbb085 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -273,11 +273,11 @@ extern void init_idle_bootup_task(struct task_struct *idle);  extern int runqueue_is_locked(int cpu);  #if defined(CONFIG_SMP) && defined(CONFIG_NO_HZ) -extern void select_nohz_load_balancer(int stop_tick); +extern void nohz_balance_enter_idle(int cpu);  extern void set_cpu_sd_state_idle(void);  extern int get_nohz_timer_target(void);  #else -static inline void select_nohz_load_balancer(int stop_tick) { } +static inline void nohz_balance_enter_idle(int cpu) { }  static inline void set_cpu_sd_state_idle(void) { }  #endif @@ -446,6 +446,9 @@ extern int get_dumpable(struct mm_struct *mm);  #define MMF_VM_HUGEPAGE		17	/* set when VM_HUGEPAGE is set on vma */  #define MMF_EXE_FILE_CHANGED	18	/* see prctl_set_mm_exe_file() */ +#define MMF_HAS_UPROBES		19	/* has uprobes */ +#define MMF_RECALC_UPROBES	20	/* MMF_HAS_UPROBES can be wrong */ +  #define MMF_INIT_MASK		(MMF_DUMPABLE_MASK | MMF_DUMP_FILTER_MASK)  struct sighand_struct { @@ -678,11 +681,6 @@ struct signal_struct {  					 * (notably. ptrace) */  }; -/* Context switch must be unlocked if interrupts are to be enabled */ -#ifdef __ARCH_WANT_INTERRUPTS_ON_CTXSW -# define __ARCH_WANT_UNLOCKED_CTXSW -#endif -  /*   * Bits in flags field of signal_struct.   */ @@ -860,7 +858,6 @@ enum cpu_idle_type {  #define SD_BALANCE_FORK		0x0008	/* Balance on fork, clone */  #define SD_BALANCE_WAKE		0x0010  /* Balance on wakeup */  #define SD_WAKE_AFFINE		0x0020	/* Wake task to waking CPU */ -#define SD_PREFER_LOCAL		0x0040  /* Prefer to keep tasks local to this domain */  #define SD_SHARE_CPUPOWER	0x0080	/* Domain members share cpu power */  #define SD_SHARE_PKG_RESOURCES	0x0200	/* Domain members share cpu pkg resources */  #define SD_SERIALIZE		0x0400	/* Only a single load balancing instance */ @@ -1885,6 +1882,14 @@ static inline void rcu_copy_process(struct task_struct *p)  #endif +static inline void rcu_switch(struct task_struct *prev, +			      struct task_struct *next) +{ +#ifdef CONFIG_RCU_USER_QS +	rcu_user_hooks_switch(prev, next); +#endif +} +  static inline void tsk_restore_flags(struct task_struct *task,  				unsigned long orig_flags, unsigned long flags)  { diff --git a/include/linux/screen_info.h b/include/linux/screen_info.h index 899fbb487c9..fb3c5a8fef3 100644 --- a/include/linux/screen_info.h +++ b/include/linux/screen_info.h @@ -68,6 +68,8 @@ struct screen_info {  #define VIDEO_FLAGS_NOCURSOR	(1 << 0) /* The video mode has no cursor set */ +#define VIDEO_CAPABILITY_SKIP_QUIRKS	(1 << 0) +  #ifdef __KERNEL__  extern struct screen_info screen_info; diff --git a/include/linux/security.h b/include/linux/security.h index 3dea6a9d568..d143b8e0195 100644 --- a/include/linux/security.h +++ b/include/linux/security.h @@ -118,6 +118,7 @@ void reset_security_ops(void);  extern unsigned long mmap_min_addr;  extern unsigned long dac_mmap_min_addr;  #else +#define mmap_min_addr		0UL  #define dac_mmap_min_addr	0UL  #endif diff --git a/include/linux/serial_core.h b/include/linux/serial_core.h index 7cf0b68bbe9..f9b22ec7a9f 100644 --- a/include/linux/serial_core.h +++ b/include/linux/serial_core.h @@ -48,7 +48,8 @@  #define PORT_TEGRA	20	/* NVIDIA Tegra internal UART */  #define PORT_XR17D15X	21	/* Exar XR17D15x UART */  #define PORT_LPC3220	22	/* NXP LPC32xx SoC "Standard" UART */ -#define PORT_MAX_8250	22	/* max port ID */ +#define PORT_8250_CIR	23	/* CIR infrared port, has its own driver */ +#define PORT_MAX_8250	23	/* max port ID */  /*   * ARM specific type numbers.  These are not currently guaranteed @@ -274,6 +275,7 @@ struct uart_ops {  	int		(*verify_port)(struct uart_port *, struct serial_struct *);  	int		(*ioctl)(struct uart_port *, unsigned int, unsigned long);  #ifdef CONFIG_CONSOLE_POLL +	int		(*poll_init)(struct uart_port *);  	void	(*poll_put_char)(struct uart_port *, unsigned char);  	int		(*poll_get_char)(struct uart_port *);  #endif diff --git a/include/linux/smpboot.h b/include/linux/smpboot.h new file mode 100644 index 00000000000..e0106d8581d --- /dev/null +++ b/include/linux/smpboot.h @@ -0,0 +1,43 @@ +#ifndef _LINUX_SMPBOOT_H +#define _LINUX_SMPBOOT_H + +#include <linux/types.h> + +struct task_struct; +/* Cookie handed to the thread_fn*/ +struct smpboot_thread_data; + +/** + * struct smp_hotplug_thread - CPU hotplug related thread descriptor + * @store:		Pointer to per cpu storage for the task pointers + * @list:		List head for core management + * @thread_should_run:	Check whether the thread should run or not. Called with + *			preemption disabled. + * @thread_fn:		The associated thread function + * @setup:		Optional setup function, called when the thread gets + *			operational the first time + * @cleanup:		Optional cleanup function, called when the thread + *			should stop (module exit) + * @park:		Optional park function, called when the thread is + *			parked (cpu offline) + * @unpark:		Optional unpark function, called when the thread is + *			unparked (cpu online) + * @thread_comm:	The base name of the thread + */ +struct smp_hotplug_thread { +	struct task_struct __percpu	**store; +	struct list_head		list; +	int				(*thread_should_run)(unsigned int cpu); +	void				(*thread_fn)(unsigned int cpu); +	void				(*setup)(unsigned int cpu); +	void				(*cleanup)(unsigned int cpu, bool online); +	void				(*park)(unsigned int cpu); +	void				(*unpark)(unsigned int cpu); +	const char			*thread_comm; +}; + +int smpboot_register_percpu_thread(struct smp_hotplug_thread *plug_thread); +void smpboot_unregister_percpu_thread(struct smp_hotplug_thread *plug_thread); +int smpboot_thread_schedule(void); + +#endif diff --git a/include/linux/task_work.h b/include/linux/task_work.h index fb46b03b185..ca5a1cf27da 100644 --- a/include/linux/task_work.h +++ b/include/linux/task_work.h @@ -18,8 +18,7 @@ void task_work_run(void);  static inline void exit_task_work(struct task_struct *task)  { -	if (unlikely(task->task_works)) -		task_work_run(); +	task_work_run();  }  #endif	/* _LINUX_TASK_WORK_H */ diff --git a/include/linux/ti_wilink_st.h b/include/linux/ti_wilink_st.h index 3ca0269dd0b..932b7639224 100644 --- a/include/linux/ti_wilink_st.h +++ b/include/linux/ti_wilink_st.h @@ -281,9 +281,10 @@ struct kim_data_s {  long st_kim_start(void *);  long st_kim_stop(void *); -void st_kim_recv(void *, const unsigned char *, long count);  void st_kim_complete(void *);  void kim_st_list_protocols(struct st_data_s *, void *); +void st_kim_recv(void *, const unsigned char *, long); +  /*   * BTS headers diff --git a/include/linux/timer.h b/include/linux/timer.h index 6abd9138bed..8c5a197e158 100644 --- a/include/linux/timer.h +++ b/include/linux/timer.h @@ -49,147 +49,112 @@ extern struct tvec_base boot_tvec_bases;  #endif  /* - * Note that all tvec_bases are 2 byte aligned and lower bit of - * base in timer_list is guaranteed to be zero. Use the LSB to - * indicate whether the timer is deferrable. + * Note that all tvec_bases are at least 4 byte aligned and lower two bits + * of base in timer_list is guaranteed to be zero. Use them for flags.   *   * A deferrable timer will work normally when the system is busy, but   * will not cause a CPU to come out of idle just to service it; instead,   * the timer will be serviced when the CPU eventually wakes up with a   * subsequent non-deferrable timer. + * + * An irqsafe timer is executed with IRQ disabled and it's safe to wait for + * the completion of the running instance from IRQ handlers, for example, + * by calling del_timer_sync(). + * + * Note: The irq disabled callback execution is a special case for + * workqueue locking issues. It's not meant for executing random crap + * with interrupts disabled. Abuse is monitored!   */ -#define TBASE_DEFERRABLE_FLAG		(0x1) +#define TIMER_DEFERRABLE		0x1LU +#define TIMER_IRQSAFE			0x2LU -#define TIMER_INITIALIZER(_function, _expires, _data) {		\ +#define TIMER_FLAG_MASK			0x3LU + +#define __TIMER_INITIALIZER(_function, _expires, _data, _flags) { \  		.entry = { .prev = TIMER_ENTRY_STATIC },	\  		.function = (_function),			\  		.expires = (_expires),				\  		.data = (_data),				\ -		.base = &boot_tvec_bases,			\ +		.base = (void *)((unsigned long)&boot_tvec_bases + (_flags)), \  		.slack = -1,					\  		__TIMER_LOCKDEP_MAP_INITIALIZER(		\  			__FILE__ ":" __stringify(__LINE__))	\  	} -#define TBASE_MAKE_DEFERRED(ptr) ((struct tvec_base *)		\ -		  ((unsigned char *)(ptr) + TBASE_DEFERRABLE_FLAG)) +#define TIMER_INITIALIZER(_function, _expires, _data)		\ +	__TIMER_INITIALIZER((_function), (_expires), (_data), 0) -#define TIMER_DEFERRED_INITIALIZER(_function, _expires, _data) {\ -		.entry = { .prev = TIMER_ENTRY_STATIC },	\ -		.function = (_function),			\ -		.expires = (_expires),				\ -		.data = (_data),				\ -		.base = TBASE_MAKE_DEFERRED(&boot_tvec_bases),	\ -		__TIMER_LOCKDEP_MAP_INITIALIZER(		\ -			__FILE__ ":" __stringify(__LINE__))	\ -	} +#define TIMER_DEFERRED_INITIALIZER(_function, _expires, _data)	\ +	__TIMER_INITIALIZER((_function), (_expires), (_data), TIMER_DEFERRABLE)  #define DEFINE_TIMER(_name, _function, _expires, _data)		\  	struct timer_list _name =				\  		TIMER_INITIALIZER(_function, _expires, _data) -void init_timer_key(struct timer_list *timer, -		    const char *name, -		    struct lock_class_key *key); -void init_timer_deferrable_key(struct timer_list *timer, -			       const char *name, -			       struct lock_class_key *key); +void init_timer_key(struct timer_list *timer, unsigned int flags, +		    const char *name, struct lock_class_key *key); + +#ifdef CONFIG_DEBUG_OBJECTS_TIMERS +extern void init_timer_on_stack_key(struct timer_list *timer, +				    unsigned int flags, const char *name, +				    struct lock_class_key *key); +extern void destroy_timer_on_stack(struct timer_list *timer); +#else +static inline void destroy_timer_on_stack(struct timer_list *timer) { } +static inline void init_timer_on_stack_key(struct timer_list *timer, +					   unsigned int flags, const char *name, +					   struct lock_class_key *key) +{ +	init_timer_key(timer, flags, name, key); +} +#endif  #ifdef CONFIG_LOCKDEP -#define init_timer(timer)						\ +#define __init_timer(_timer, _flags)					\  	do {								\  		static struct lock_class_key __key;			\ -		init_timer_key((timer), #timer, &__key);		\ +		init_timer_key((_timer), (_flags), #_timer, &__key);	\  	} while (0) -#define init_timer_deferrable(timer)					\ +#define __init_timer_on_stack(_timer, _flags)				\  	do {								\  		static struct lock_class_key __key;			\ -		init_timer_deferrable_key((timer), #timer, &__key);	\ +		init_timer_on_stack_key((_timer), (_flags), #_timer, &__key); \  	} while (0) +#else +#define __init_timer(_timer, _flags)					\ +	init_timer_key((_timer), (_flags), NULL, NULL) +#define __init_timer_on_stack(_timer, _flags)				\ +	init_timer_on_stack_key((_timer), (_flags), NULL, NULL) +#endif +#define init_timer(timer)						\ +	__init_timer((timer), 0) +#define init_timer_deferrable(timer)					\ +	__init_timer((timer), TIMER_DEFERRABLE)  #define init_timer_on_stack(timer)					\ +	__init_timer_on_stack((timer), 0) + +#define __setup_timer(_timer, _fn, _data, _flags)			\  	do {								\ -		static struct lock_class_key __key;			\ -		init_timer_on_stack_key((timer), #timer, &__key);	\ +		__init_timer((_timer), (_flags));			\ +		(_timer)->function = (_fn);				\ +		(_timer)->data = (_data);				\  	} while (0) -#define setup_timer(timer, fn, data)					\ +#define __setup_timer_on_stack(_timer, _fn, _data, _flags)		\  	do {								\ -		static struct lock_class_key __key;			\ -		setup_timer_key((timer), #timer, &__key, (fn), (data));\ +		__init_timer_on_stack((_timer), (_flags));		\ +		(_timer)->function = (_fn);				\ +		(_timer)->data = (_data);				\  	} while (0) +#define setup_timer(timer, fn, data)					\ +	__setup_timer((timer), (fn), (data), 0)  #define setup_timer_on_stack(timer, fn, data)				\ -	do {								\ -		static struct lock_class_key __key;			\ -		setup_timer_on_stack_key((timer), #timer, &__key,	\ -					 (fn), (data));			\ -	} while (0) +	__setup_timer_on_stack((timer), (fn), (data), 0)  #define setup_deferrable_timer_on_stack(timer, fn, data)		\ -	do {								\ -		static struct lock_class_key __key;			\ -		setup_deferrable_timer_on_stack_key((timer), #timer,	\ -						    &__key, (fn),	\ -						    (data));		\ -	} while (0) -#else -#define init_timer(timer)\ -	init_timer_key((timer), NULL, NULL) -#define init_timer_deferrable(timer)\ -	init_timer_deferrable_key((timer), NULL, NULL) -#define init_timer_on_stack(timer)\ -	init_timer_on_stack_key((timer), NULL, NULL) -#define setup_timer(timer, fn, data)\ -	setup_timer_key((timer), NULL, NULL, (fn), (data)) -#define setup_timer_on_stack(timer, fn, data)\ -	setup_timer_on_stack_key((timer), NULL, NULL, (fn), (data)) -#define setup_deferrable_timer_on_stack(timer, fn, data)\ -	setup_deferrable_timer_on_stack_key((timer), NULL, NULL, (fn), (data)) -#endif - -#ifdef CONFIG_DEBUG_OBJECTS_TIMERS -extern void init_timer_on_stack_key(struct timer_list *timer, -				    const char *name, -				    struct lock_class_key *key); -extern void destroy_timer_on_stack(struct timer_list *timer); -#else -static inline void destroy_timer_on_stack(struct timer_list *timer) { } -static inline void init_timer_on_stack_key(struct timer_list *timer, -					   const char *name, -					   struct lock_class_key *key) -{ -	init_timer_key(timer, name, key); -} -#endif - -static inline void setup_timer_key(struct timer_list * timer, -				const char *name, -				struct lock_class_key *key, -				void (*function)(unsigned long), -				unsigned long data) -{ -	timer->function = function; -	timer->data = data; -	init_timer_key(timer, name, key); -} - -static inline void setup_timer_on_stack_key(struct timer_list *timer, -					const char *name, -					struct lock_class_key *key, -					void (*function)(unsigned long), -					unsigned long data) -{ -	timer->function = function; -	timer->data = data; -	init_timer_on_stack_key(timer, name, key); -} - -extern void setup_deferrable_timer_on_stack_key(struct timer_list *timer, -						const char *name, -						struct lock_class_key *key, -						void (*function)(unsigned long), -						unsigned long data); +	__setup_timer_on_stack((timer), (fn), (data), TIMER_DEFERRABLE)  /**   * timer_pending - is a timer pending? diff --git a/include/linux/topology.h b/include/linux/topology.h index fec12d66721..d3cf0d6e771 100644 --- a/include/linux/topology.h +++ b/include/linux/topology.h @@ -129,7 +129,6 @@ int arch_update_cpu_topology(void);  				| 1*SD_BALANCE_FORK			\  				| 0*SD_BALANCE_WAKE			\  				| 1*SD_WAKE_AFFINE			\ -				| 0*SD_PREFER_LOCAL			\  				| 0*SD_SHARE_CPUPOWER			\  				| 1*SD_SHARE_PKG_RESOURCES		\  				| 0*SD_SERIALIZE			\ @@ -160,7 +159,6 @@ int arch_update_cpu_topology(void);  				| 1*SD_BALANCE_FORK			\  				| 0*SD_BALANCE_WAKE			\  				| 1*SD_WAKE_AFFINE			\ -				| 0*SD_PREFER_LOCAL			\  				| 0*SD_SHARE_CPUPOWER			\  				| 0*SD_SHARE_PKG_RESOURCES		\  				| 0*SD_SERIALIZE			\ diff --git a/include/linux/tracepoint.h b/include/linux/tracepoint.h index 802de56c41e..2f322c38bd4 100644 --- a/include/linux/tracepoint.h +++ b/include/linux/tracepoint.h @@ -136,6 +136,22 @@ static inline void tracepoint_synchronize_unregister(void)  		postrcu;						\  	} while (0) +#ifndef MODULE +#define __DECLARE_TRACE_RCU(name, proto, args, cond, data_proto, data_args)	\ +	static inline void trace_##name##_rcuidle(proto)		\ +	{								\ +		if (static_key_false(&__tracepoint_##name.key))		\ +			__DO_TRACE(&__tracepoint_##name,		\ +				TP_PROTO(data_proto),			\ +				TP_ARGS(data_args),			\ +				TP_CONDITION(cond),			\ +				rcu_idle_exit(),			\ +				rcu_idle_enter());			\ +	} +#else +#define __DECLARE_TRACE_RCU(name, proto, args, cond, data_proto, data_args) +#endif +  /*   * Make sure the alignment of the structure in the __tracepoints section will   * not add unwanted padding between the beginning of the section and the @@ -151,16 +167,8 @@ static inline void tracepoint_synchronize_unregister(void)  				TP_ARGS(data_args),			\  				TP_CONDITION(cond),,);			\  	}								\ -	static inline void trace_##name##_rcuidle(proto)		\ -	{								\ -		if (static_key_false(&__tracepoint_##name.key))		\ -			__DO_TRACE(&__tracepoint_##name,		\ -				TP_PROTO(data_proto),			\ -				TP_ARGS(data_args),			\ -				TP_CONDITION(cond),			\ -				rcu_idle_exit(),			\ -				rcu_idle_enter());			\ -	}								\ +	__DECLARE_TRACE_RCU(name, PARAMS(proto), PARAMS(args),		\ +		PARAMS(cond), PARAMS(data_proto), PARAMS(data_args))	\  	static inline int						\  	register_trace_##name(void (*probe)(data_proto), void *data)	\  	{								\ diff --git a/include/linux/uprobes.h b/include/linux/uprobes.h index efe4b3308c7..e6f0331e3d4 100644 --- a/include/linux/uprobes.h +++ b/include/linux/uprobes.h @@ -99,25 +99,27 @@ struct xol_area {  struct uprobes_state {  	struct xol_area		*xol_area; -	atomic_t		count;  }; +  extern int __weak set_swbp(struct arch_uprobe *aup, struct mm_struct *mm, unsigned long vaddr); -extern int __weak set_orig_insn(struct arch_uprobe *aup, struct mm_struct *mm,  unsigned long vaddr, bool verify); +extern int __weak set_orig_insn(struct arch_uprobe *aup, struct mm_struct *mm, unsigned long vaddr);  extern bool __weak is_swbp_insn(uprobe_opcode_t *insn);  extern int uprobe_register(struct inode *inode, loff_t offset, struct uprobe_consumer *uc);  extern void uprobe_unregister(struct inode *inode, loff_t offset, struct uprobe_consumer *uc);  extern int uprobe_mmap(struct vm_area_struct *vma);  extern void uprobe_munmap(struct vm_area_struct *vma, unsigned long start, unsigned long end); +extern void uprobe_dup_mmap(struct mm_struct *oldmm, struct mm_struct *newmm);  extern void uprobe_free_utask(struct task_struct *t);  extern void uprobe_copy_process(struct task_struct *t);  extern unsigned long __weak uprobe_get_swbp_addr(struct pt_regs *regs); +extern void __weak arch_uprobe_enable_step(struct arch_uprobe *arch); +extern void __weak arch_uprobe_disable_step(struct arch_uprobe *arch);  extern int uprobe_post_sstep_notifier(struct pt_regs *regs);  extern int uprobe_pre_sstep_notifier(struct pt_regs *regs);  extern void uprobe_notify_resume(struct pt_regs *regs);  extern bool uprobe_deny_signal(void);  extern bool __weak arch_uprobe_skip_sstep(struct arch_uprobe *aup, struct pt_regs *regs);  extern void uprobe_clear_state(struct mm_struct *mm); -extern void uprobe_reset_state(struct mm_struct *mm);  #else /* !CONFIG_UPROBES */  struct uprobes_state {  }; @@ -138,6 +140,10 @@ static inline void  uprobe_munmap(struct vm_area_struct *vma, unsigned long start, unsigned long end)  {  } +static inline void +uprobe_dup_mmap(struct mm_struct *oldmm, struct mm_struct *newmm) +{ +}  static inline void uprobe_notify_resume(struct pt_regs *regs)  {  } @@ -158,8 +164,5 @@ static inline void uprobe_copy_process(struct task_struct *t)  static inline void uprobe_clear_state(struct mm_struct *mm)  {  } -static inline void uprobe_reset_state(struct mm_struct *mm) -{ -}  #endif /* !CONFIG_UPROBES */  #endif	/* _LINUX_UPROBES_H */ diff --git a/include/linux/usb.h b/include/linux/usb.h index 30d1ae38eab..07915a32fb9 100644 --- a/include/linux/usb.h +++ b/include/linux/usb.h @@ -384,6 +384,13 @@ enum usb_device_removable {  	USB_DEVICE_FIXED,  }; +enum usb_port_connect_type { +	USB_PORT_CONNECT_TYPE_UNKNOWN = 0, +	USB_PORT_CONNECT_TYPE_HOT_PLUG, +	USB_PORT_CONNECT_TYPE_HARD_WIRED, +	USB_PORT_NOT_USED, +}; +  /*   * USB 3.0 Link Power Management (LPM) parameters.   * @@ -469,7 +476,6 @@ struct usb3_lpm_parameters {   *	access from userspace   * @usbfs_dentry: usbfs dentry entry for the device   * @maxchild: number of ports if hub - * @children: child devices - USB devices that are attached to this hub   * @quirks: quirks of the whole device   * @urbnum: number of URBs submitted for the whole device   * @active_duration: total time device is not suspended @@ -543,7 +549,6 @@ struct usb_device {  	struct list_head filelist;  	int maxchild; -	struct usb_device **children;  	u32 quirks;  	atomic_t urbnum; @@ -572,6 +577,19 @@ static inline struct usb_device *interface_to_usbdev(struct usb_interface *intf)  extern struct usb_device *usb_get_dev(struct usb_device *dev);  extern void usb_put_dev(struct usb_device *dev); +extern struct usb_device *usb_hub_find_child(struct usb_device *hdev, +	int port1); + +/** + * usb_hub_for_each_child - iterate over all child devices on the hub + * @hdev:  USB device belonging to the usb hub + * @port1: portnum associated with child device + * @child: child device pointer + */ +#define usb_hub_for_each_child(hdev, port1, child) \ +	for (port1 = 1,	child =	usb_hub_find_child(hdev, port1); \ +		port1 <= hdev->maxchild; \ +		child = usb_hub_find_child(hdev, ++port1))  /* USB device locking */  #define usb_lock_device(udev)		device_lock(&(udev)->dev) @@ -584,6 +602,16 @@ extern int usb_lock_device_for_reset(struct usb_device *udev,  extern int usb_reset_device(struct usb_device *dev);  extern void usb_queue_reset_device(struct usb_interface *dev); +#ifdef CONFIG_ACPI +extern int usb_acpi_set_power_state(struct usb_device *hdev, int index, +	bool enable); +extern bool usb_acpi_power_manageable(struct usb_device *hdev, int index); +#else +static inline int usb_acpi_set_power_state(struct usb_device *hdev, int index, +	bool enable) { return 0; } +static inline bool usb_acpi_power_manageable(struct usb_device *hdev, int index) +	{ return true; } +#endif  /* USB autosuspend and autoresume */  #ifdef CONFIG_USB_SUSPEND diff --git a/include/linux/usb/ch11.h b/include/linux/usb/ch11.h index b6c2863b2c9..7692dc69ccf 100644 --- a/include/linux/usb/ch11.h +++ b/include/linux/usb/ch11.h @@ -236,8 +236,8 @@ struct usb_hub_descriptor {  		struct {  			__u8 bHubHdrDecLat; -			__u16 wHubDelay; -			__u16 DeviceRemovable; +			__le16 wHubDelay; +			__le16 DeviceRemovable;  		}  __attribute__ ((packed)) ss;  	} u;  } __attribute__ ((packed)); diff --git a/include/linux/usb/composite.h b/include/linux/usb/composite.h index 9d8c3b63449..f8dda062180 100644 --- a/include/linux/usb/composite.h +++ b/include/linux/usb/composite.h @@ -34,6 +34,8 @@   * the composite model the host can use both functions at the same time.   */ +#include <linux/bcd.h> +#include <linux/version.h>  #include <linux/usb/ch9.h>  #include <linux/usb/gadget.h> @@ -46,6 +48,9 @@   */  #define USB_GADGET_DELAYED_STATUS       0x7fff	/* Impossibly large value */ +/* big enough to hold our biggest descriptor */ +#define USB_COMP_EP0_BUFSIZ	1024 +  struct usb_configuration;  /** @@ -245,24 +250,31 @@ int usb_add_config(struct usb_composite_dev *,  void usb_remove_config(struct usb_composite_dev *,  		struct usb_configuration *); +/* predefined index for usb_composite_driver */ +enum { +	USB_GADGET_MANUFACTURER_IDX	= 0, +	USB_GADGET_PRODUCT_IDX, +	USB_GADGET_SERIAL_IDX, +	USB_GADGET_FIRST_AVAIL_IDX, +}; +  /**   * struct usb_composite_driver - groups configurations into a gadget   * @name: For diagnostics, identifies the driver. - * @iProduct: Used as iProduct override if @dev->iProduct is not set. - *	If NULL value of @name is taken. - * @iManufacturer: Used as iManufacturer override if @dev->iManufacturer is - *	not set. If NULL a default "<system> <release> with <udc>" value - *	will be used. - * @iSerialNumber: Used as iSerialNumber override if @dev->iSerialNumber is - *	not set.   * @dev: Template descriptor for the device, including default device   *	identifiers. - * @strings: tables of strings, keyed by identifiers assigned during bind() - *	and language IDs provided in control requests + * @strings: tables of strings, keyed by identifiers assigned during @bind + *	and language IDs provided in control requests. Note: The first entries + *	are predefined. The first entry that may be used is + *	USB_GADGET_FIRST_AVAIL_IDX   * @max_speed: Highest speed the driver supports.   * @needs_serial: set to 1 if the gadget needs userspace to provide   * 	a serial number.  If one is not provided, warning will be printed. - * @unbind: Reverses bind; called as a side effect of unregistering + * @bind: (REQUIRED) Used to allocate resources that are shared across the + *	whole device, such as string IDs, and add its configurations using + *	@usb_add_config(). This may fail by returning a negative errno + *	value; it should return zero on successful initialization. + * @unbind: Reverses @bind; called as a side effect of unregistering   *	this driver.   * @disconnect: optional driver disconnect method   * @suspend: Notifies when the host stops sending USB traffic, @@ -271,9 +283,9 @@ void usb_remove_config(struct usb_composite_dev *,   *	before function notifications   *   * Devices default to reporting self powered operation.  Devices which rely - * on bus powered operation should report this in their @bind() method. + * on bus powered operation should report this in their @bind method.   * - * Before returning from bind, various fields in the template descriptor + * Before returning from @bind, various fields in the template descriptor   * may be overridden.  These include the idVendor/idProduct/bcdDevice values   * normally to bind the appropriate host side driver, and the three strings   * (iManufacturer, iProduct, iSerialNumber) normally used to provide user @@ -283,14 +295,12 @@ void usb_remove_config(struct usb_composite_dev *,   */  struct usb_composite_driver {  	const char				*name; -	const char				*iProduct; -	const char				*iManufacturer; -	const char				*iSerialNumber;  	const struct usb_device_descriptor	*dev;  	struct usb_gadget_strings		**strings;  	enum usb_device_speed			max_speed;  	unsigned		needs_serial:1; +	int			(*bind)(struct usb_composite_dev *cdev);  	int			(*unbind)(struct usb_composite_dev *);  	void			(*disconnect)(struct usb_composite_dev *); @@ -298,10 +308,10 @@ struct usb_composite_driver {  	/* global suspend hooks */  	void			(*suspend)(struct usb_composite_dev *);  	void			(*resume)(struct usb_composite_dev *); +	struct usb_gadget_driver		gadget_driver;  }; -extern int usb_composite_probe(struct usb_composite_driver *driver, -			       int (*bind)(struct usb_composite_dev *cdev)); +extern int usb_composite_probe(struct usb_composite_driver *driver);  extern void usb_composite_unregister(struct usb_composite_driver *driver);  extern void usb_composite_setup_continue(struct usb_composite_dev *cdev); @@ -310,7 +320,6 @@ extern void usb_composite_setup_continue(struct usb_composite_dev *cdev);   * struct usb_composite_device - represents one composite usb gadget   * @gadget: read-only, abstracts the gadget's usb peripheral controller   * @req: used for control responses; buffer is pre-allocated - * @bufsiz: size of buffer pre-allocated in @req   * @config: the currently active configuration   *   * One of these devices is allocated and initialized before the @@ -341,7 +350,6 @@ extern void usb_composite_setup_continue(struct usb_composite_dev *cdev);  struct usb_composite_dev {  	struct usb_gadget		*gadget;  	struct usb_request		*req; -	unsigned			bufsiz;  	struct usb_configuration	*config; @@ -352,9 +360,7 @@ struct usb_composite_dev {  	struct list_head		configs;  	struct usb_composite_driver	*driver;  	u8				next_string_id; -	u8				manufacturer_override; -	u8				product_override; -	u8				serial_override; +	char				*def_manufacturer;  	/* the gadget driver won't enable the data pullup  	 * while the deactivation count is nonzero. @@ -375,6 +381,53 @@ extern int usb_string_ids_tab(struct usb_composite_dev *c,  			      struct usb_string *str);  extern int usb_string_ids_n(struct usb_composite_dev *c, unsigned n); +/* + * Some systems will need runtime overrides for the  product identifiers + * published in the device descriptor, either numbers or strings or both. + * String parameters are in UTF-8 (superset of ASCII's 7 bit characters). + */ +struct usb_composite_overwrite { +	u16	idVendor; +	u16	idProduct; +	u16	bcdDevice; +	char	*serial_number; +	char	*manufacturer; +	char	*product; +}; +#define USB_GADGET_COMPOSITE_OPTIONS()					\ +	static struct usb_composite_overwrite coverwrite;		\ +									\ +	module_param_named(idVendor, coverwrite.idVendor, ushort, S_IRUGO); \ +	MODULE_PARM_DESC(idVendor, "USB Vendor ID");			\ +									\ +	module_param_named(idProduct, coverwrite.idProduct, ushort, S_IRUGO); \ +	MODULE_PARM_DESC(idProduct, "USB Product ID");			\ +									\ +	module_param_named(bcdDevice, coverwrite.bcdDevice, ushort, S_IRUGO); \ +	MODULE_PARM_DESC(bcdDevice, "USB Device version (BCD)");	\ +									\ +	module_param_named(iSerialNumber, coverwrite.serial_number, charp, \ +			S_IRUGO); \ +	MODULE_PARM_DESC(iSerialNumber, "SerialNumber string");		\ +									\ +	module_param_named(iManufacturer, coverwrite.manufacturer, charp, \ +			S_IRUGO); \ +	MODULE_PARM_DESC(iManufacturer, "USB Manufacturer string");	\ +									\ +	module_param_named(iProduct, coverwrite.product, charp, S_IRUGO); \ +	MODULE_PARM_DESC(iProduct, "USB Product string") + +void usb_composite_overwrite_options(struct usb_composite_dev *cdev, +		struct usb_composite_overwrite *covr); + +static inline u16 get_default_bcdDevice(void) +{ +	u16 bcdDevice; + +	bcdDevice = bin2bcd((LINUX_VERSION_CODE >> 16 & 0xff)) << 8; +	bcdDevice |= bin2bcd((LINUX_VERSION_CODE >> 8 & 0xff)); +	return bcdDevice; +}  /* messaging utils */  #define DBG(d, fmt, args...) \ diff --git a/include/linux/usb/ehci_def.h b/include/linux/usb/ehci_def.h index de4b9ed5d5d..daec99af5d5 100644 --- a/include/linux/usb/ehci_def.h +++ b/include/linux/usb/ehci_def.h @@ -171,18 +171,18 @@ struct ehci_regs {  #define USBMODE_CM_HC	(3<<0)		/* host controller mode */  #define USBMODE_CM_IDLE	(0<<0)		/* idle state */ -	u32		reserved4[7]; +	u32		reserved4[6];  /* Moorestown has some non-standard registers, partially due to the fact that   * its EHCI controller has both TT and LPM support. HOSTPCx are extensions to   * PORTSCx   */  	/* HOSTPC: offset 0x84 */ -	u32		hostpc[0];	/* HOSTPC extension */ +	u32		hostpc[1];	/* HOSTPC extension */  #define HOSTPC_PHCD	(1<<22)		/* Phy clock disable */  #define HOSTPC_PSPD	(3<<25)		/* Port speed detection */ -	u32		reserved5[17]; +	u32		reserved5[16];  	/* USBMODE_EX: offset 0xc8 */  	u32		usbmode_ex;	/* USB Device mode extension */ @@ -221,18 +221,35 @@ extern int __init early_dbgp_init(char *s);  extern struct console early_dbgp_console;  #endif /* CONFIG_EARLY_PRINTK_DBGP */ +struct usb_hcd; + +#ifdef CONFIG_XEN_DOM0 +extern int xen_dbgp_reset_prep(struct usb_hcd *); +extern int xen_dbgp_external_startup(struct usb_hcd *); +#else +static inline int xen_dbgp_reset_prep(struct usb_hcd *hcd) +{ +	return 1; /* Shouldn't this be 0? */ +} + +static inline int xen_dbgp_external_startup(struct usb_hcd *hcd) +{ +	return -1; +} +#endif +  #ifdef CONFIG_EARLY_PRINTK_DBGP  /* Call backs from ehci host driver to ehci debug driver */ -extern int dbgp_external_startup(void); -extern int dbgp_reset_prep(void); +extern int dbgp_external_startup(struct usb_hcd *); +extern int dbgp_reset_prep(struct usb_hcd *hcd);  #else -static inline int dbgp_reset_prep(void) +static inline int dbgp_reset_prep(struct usb_hcd *hcd)  { -	return 1; +	return xen_dbgp_reset_prep(hcd);  } -static inline int dbgp_external_startup(void) +static inline int dbgp_external_startup(struct usb_hcd *hcd)  { -	return -1; +	return xen_dbgp_external_startup(hcd);  }  #endif diff --git a/include/linux/usb/ehci_pdriver.h b/include/linux/usb/ehci_pdriver.h index 1894f42fe3f..c9d09f8b7ff 100644 --- a/include/linux/usb/ehci_pdriver.h +++ b/include/linux/usb/ehci_pdriver.h @@ -41,6 +41,14 @@ struct usb_ehci_pdata {  	unsigned	big_endian_mmio:1;  	unsigned	port_power_on:1;  	unsigned	port_power_off:1; + +	/* Turn on all power and clocks */ +	int (*power_on)(struct platform_device *pdev); +	/* Turn off all power and clocks */ +	void (*power_off)(struct platform_device *pdev); +	/* Turn on only VBUS suspend power and hotplug detection, +	 * turn off everything else */ +	void (*power_suspend)(struct platform_device *pdev);  };  #endif /* __USB_CORE_EHCI_PDRIVER_H */ diff --git a/include/linux/usb/ezusb.h b/include/linux/usb/ezusb.h new file mode 100644 index 00000000000..fc618d8d1e9 --- /dev/null +++ b/include/linux/usb/ezusb.h @@ -0,0 +1,16 @@ +#ifndef __EZUSB_H +#define __EZUSB_H + + +extern int ezusb_writememory(struct usb_device *dev, int address, +			     unsigned char *data, int length, __u8 bRequest); + +extern int ezusb_fx1_set_reset(struct usb_device *dev, unsigned char reset_bit); +extern int ezusb_fx2_set_reset(struct usb_device *dev, unsigned char reset_bit); + +extern int ezusb_fx1_ihex_firmware_download(struct usb_device *dev, +					    const char *firmware_path); +extern int ezusb_fx2_ihex_firmware_download(struct usb_device *dev, +					    const char *firmware_path); + +#endif /* __EZUSB_H */ diff --git a/include/linux/usb/gadget.h b/include/linux/usb/gadget.h index 9517466abab..5b6e5088824 100644 --- a/include/linux/usb/gadget.h +++ b/include/linux/usb/gadget.h @@ -474,7 +474,8 @@ struct usb_gadget_ops {  	/* Those two are deprecated */  	int	(*start)(struct usb_gadget_driver *, -			int (*bind)(struct usb_gadget *)); +			int (*bind)(struct usb_gadget *, +				struct usb_gadget_driver *driver));  	int	(*stop)(struct usb_gadget_driver *);  }; @@ -502,6 +503,8 @@ struct usb_gadget_ops {   * @name: Identifies the controller hardware type.  Used in diagnostics   *	and sometimes configuration.   * @dev: Driver model state for this abstract device. + * @out_epnum: last used out ep number + * @in_epnum: last used in ep number   *   * Gadgets have a mostly-portable "gadget driver" implementing device   * functions, handling all usb configurations and interfaces.  Gadget @@ -536,6 +539,8 @@ struct usb_gadget {  	unsigned			a_alt_hnp_support:1;  	const char			*name;  	struct device			dev; +	unsigned			out_epnum; +	unsigned			in_epnum;  };  static inline void set_gadget_data(struct usb_gadget *gadget, void *data) @@ -558,14 +563,7 @@ static inline struct usb_gadget *dev_to_usb_gadget(struct device *dev)   */  static inline int gadget_is_dualspeed(struct usb_gadget *g)  { -#ifdef CONFIG_USB_GADGET_DUALSPEED -	/* runtime test would check "g->max_speed" ... that might be -	 * useful to work around hardware bugs, but is mostly pointless -	 */ -	return 1; -#else -	return 0; -#endif +	return g->max_speed >= USB_SPEED_HIGH;  }  /** @@ -575,15 +573,7 @@ static inline int gadget_is_dualspeed(struct usb_gadget *g)   */  static inline int gadget_is_superspeed(struct usb_gadget *g)  { -#ifdef CONFIG_USB_GADGET_SUPERSPEED -	/* -	 * runtime test would check "g->max_speed" ... that might be -	 * useful to work around hardware bugs, but is mostly pointless -	 */ -	return 1; -#else -	return 0; -#endif +	return g->max_speed >= USB_SPEED_SUPER;  }  /** @@ -781,6 +771,7 @@ static inline int usb_gadget_disconnect(struct usb_gadget *gadget)   *	when the host is disconnected.  May be called in_interrupt; this   *	may not sleep.  Some devices can't detect disconnect, so this might   *	not be called except as part of controller shutdown. + * @bind: the driver's bind callback   * @unbind: Invoked when the driver is unbound from a gadget,   *	usually from rmmod (after a disconnect is reported).   *	Called in a context that permits sleeping. @@ -835,6 +826,8 @@ static inline int usb_gadget_disconnect(struct usb_gadget *gadget)  struct usb_gadget_driver {  	char			*function;  	enum usb_device_speed	max_speed; +	int			(*bind)(struct usb_gadget *gadget, +					struct usb_gadget_driver *driver);  	void			(*unbind)(struct usb_gadget *);  	int			(*setup)(struct usb_gadget *,  					const struct usb_ctrlrequest *); @@ -860,7 +853,6 @@ struct usb_gadget_driver {  /**   * usb_gadget_probe_driver - probe a gadget driver   * @driver: the driver being registered - * @bind: the driver's bind callback   * Context: can sleep   *   * Call this in your gadget driver's module initialization function, @@ -869,8 +861,7 @@ struct usb_gadget_driver {   * registration call returns.  It's expected that the @bind() function will   * be in init sections.   */ -int usb_gadget_probe_driver(struct usb_gadget_driver *driver, -		int (*bind)(struct usb_gadget *)); +int usb_gadget_probe_driver(struct usb_gadget_driver *driver);  /**   * usb_gadget_unregister_driver - unregister a gadget driver diff --git a/include/linux/usb/hcd.h b/include/linux/usb/hcd.h index c5fdb148fc0..608050b2545 100644 --- a/include/linux/usb/hcd.h +++ b/include/linux/usb/hcd.h @@ -135,8 +135,8 @@ struct usb_hcd {  	unsigned int		irq;		/* irq allocated */  	void __iomem		*regs;		/* device memory/io */ -	u64			rsrc_start;	/* memory/io resource start */ -	u64			rsrc_len;	/* memory/io resource length */ +	resource_size_t		rsrc_start;	/* memory/io resource start */ +	resource_size_t		rsrc_len;	/* memory/io resource length */  	unsigned		power_budget;	/* in mA, 0 = no limit */  	/* bandwidth_mutex should be taken before adding or removing diff --git a/include/linux/usb/nop-usb-xceiv.h b/include/linux/usb/nop-usb-xceiv.h new file mode 100644 index 00000000000..28884c71741 --- /dev/null +++ b/include/linux/usb/nop-usb-xceiv.h @@ -0,0 +1,24 @@ +#ifndef __LINUX_USB_NOP_XCEIV_H +#define __LINUX_USB_NOP_XCEIV_H + +#include <linux/usb/otg.h> + +struct nop_usb_xceiv_platform_data { +	enum usb_phy_type type; +}; + +#if defined(CONFIG_NOP_USB_XCEIV) || (defined(CONFIG_NOP_USB_XCEIV_MODULE) && defined(MODULE)) +/* sometimes transceivers are accessed only through e.g. ULPI */ +extern void usb_nop_xceiv_register(void); +extern void usb_nop_xceiv_unregister(void); +#else +static inline void usb_nop_xceiv_register(void) +{ +} + +static inline void usb_nop_xceiv_unregister(void) +{ +} +#endif + +#endif /* __LINUX_USB_NOP_XCEIV_H */ diff --git a/include/linux/usb/ohci_pdriver.h b/include/linux/usb/ohci_pdriver.h index 2808f2a9cce..74e7755168b 100644 --- a/include/linux/usb/ohci_pdriver.h +++ b/include/linux/usb/ohci_pdriver.h @@ -33,6 +33,14 @@ struct usb_ohci_pdata {  	unsigned	big_endian_desc:1;  	unsigned	big_endian_mmio:1;  	unsigned	no_big_frame_no:1; + +	/* Turn on all power and clocks */ +	int (*power_on)(struct platform_device *pdev); +	/* Turn off all power and clocks */ +	void (*power_off)(struct platform_device *pdev); +	/* Turn on only VBUS suspend power and hotplug detection, +	 * turn off everything else */ +	void (*power_suspend)(struct platform_device *pdev);  };  #endif /* __USB_CORE_OHCI_PDRIVER_H */ diff --git a/include/linux/usb/omap_usb.h b/include/linux/usb/omap_usb.h new file mode 100644 index 00000000000..0ea17f8ae82 --- /dev/null +++ b/include/linux/usb/omap_usb.h @@ -0,0 +1,46 @@ +/* + * omap_usb.h -- omap usb2 phy header file + * + * Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.com + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Author: Kishon Vijay Abraham I <kishon@ti.com> + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + */ + +#ifndef __DRIVERS_OMAP_USB2_H +#define __DRIVERS_OMAP_USB2_H + +#include <linux/usb/otg.h> + +struct omap_usb { +	struct usb_phy		phy; +	struct phy_companion	*comparator; +	struct device		*dev; +	u32 __iomem		*control_dev; +	struct clk		*wkupclk; +	u8			is_suspended:1; +}; + +#define	PHY_PD	0x1 + +#define	phy_to_omapusb(x)	container_of((x), struct omap_usb, phy) + +#if defined(CONFIG_OMAP_USB2) || defined(CONFIG_OMAP_USB2_MODULE) +extern int omap_usb2_set_comparator(struct phy_companion *comparator); +#else +static inline int omap_usb2_set_comparator(struct phy_companion *comparator) +{ +	return -ENODEV; +} +#endif + +#endif /* __DRIVERS_OMAP_USB_H */ diff --git a/include/linux/usb/otg.h b/include/linux/usb/otg.h index 45824be0a2f..e8a5fe87c6b 100644 --- a/include/linux/usb/otg.h +++ b/include/linux/usb/otg.h @@ -9,56 +9,7 @@  #ifndef __LINUX_USB_OTG_H  #define __LINUX_USB_OTG_H -#include <linux/notifier.h> - -/* OTG defines lots of enumeration states before device reset */ -enum usb_otg_state { -	OTG_STATE_UNDEFINED = 0, - -	/* single-role peripheral, and dual-role default-b */ -	OTG_STATE_B_IDLE, -	OTG_STATE_B_SRP_INIT, -	OTG_STATE_B_PERIPHERAL, - -	/* extra dual-role default-b states */ -	OTG_STATE_B_WAIT_ACON, -	OTG_STATE_B_HOST, - -	/* dual-role default-a */ -	OTG_STATE_A_IDLE, -	OTG_STATE_A_WAIT_VRISE, -	OTG_STATE_A_WAIT_BCON, -	OTG_STATE_A_HOST, -	OTG_STATE_A_SUSPEND, -	OTG_STATE_A_PERIPHERAL, -	OTG_STATE_A_WAIT_VFALL, -	OTG_STATE_A_VBUS_ERR, -}; - -enum usb_phy_events { -	USB_EVENT_NONE,         /* no events or cable disconnected */ -	USB_EVENT_VBUS,         /* vbus valid event */ -	USB_EVENT_ID,           /* id was grounded */ -	USB_EVENT_CHARGER,      /* usb dedicated charger */ -	USB_EVENT_ENUMERATED,   /* gadget driver enumerated */ -}; - -/* associate a type with PHY */ -enum usb_phy_type { -	USB_PHY_TYPE_UNDEFINED, -	USB_PHY_TYPE_USB2, -	USB_PHY_TYPE_USB3, -}; - -struct usb_phy; - -/* for transceivers connected thru an ULPI interface, the user must - * provide access ops - */ -struct usb_phy_io_ops { -	int (*read)(struct usb_phy *x, u32 reg); -	int (*write)(struct usb_phy *x, u32 val, u32 reg); -}; +#include <linux/usb/phy.h>  struct usb_otg {  	u8			default_a; @@ -85,134 +36,9 @@ struct usb_otg {  }; -/* - * the otg driver needs to interact with both device side and host side - * usb controllers.  it decides which controller is active at a given - * moment, using the transceiver, ID signal, HNP and sometimes static - * configuration information (including "board isn't wired for otg"). - */ -struct usb_phy { -	struct device		*dev; -	const char		*label; -	unsigned int		 flags; - -	enum usb_phy_type	type; -	enum usb_otg_state	state; -	enum usb_phy_events	last_event; - -	struct usb_otg		*otg; - -	struct device		*io_dev; -	struct usb_phy_io_ops	*io_ops; -	void __iomem		*io_priv; - -	/* for notification of usb_phy_events */ -	struct atomic_notifier_head	notifier; - -	/* to pass extra port status to the root hub */ -	u16			port_status; -	u16			port_change; - -	/* to support controllers that have multiple transceivers */ -	struct list_head	head; - -	/* initialize/shutdown the OTG controller */ -	int	(*init)(struct usb_phy *x); -	void	(*shutdown)(struct usb_phy *x); - -	/* effective for B devices, ignored for A-peripheral */ -	int	(*set_power)(struct usb_phy *x, -				unsigned mA); - -	/* for non-OTG B devices: set transceiver into suspend mode */ -	int	(*set_suspend)(struct usb_phy *x, -				int suspend); - -	/* notify phy connect status change */ -	int	(*notify_connect)(struct usb_phy *x, int port); -	int	(*notify_disconnect)(struct usb_phy *x, int port); -}; - - -/* for board-specific init logic */ -extern int usb_add_phy(struct usb_phy *, enum usb_phy_type type); -extern void usb_remove_phy(struct usb_phy *); - -#if defined(CONFIG_NOP_USB_XCEIV) || (defined(CONFIG_NOP_USB_XCEIV_MODULE) && defined(MODULE)) -/* sometimes transceivers are accessed only through e.g. ULPI */ -extern void usb_nop_xceiv_register(void); -extern void usb_nop_xceiv_unregister(void); -#else -static inline void usb_nop_xceiv_register(void) -{ -} - -static inline void usb_nop_xceiv_unregister(void) -{ -} -#endif - -/* helpers for direct access thru low-level io interface */ -static inline int usb_phy_io_read(struct usb_phy *x, u32 reg) -{ -	if (x->io_ops && x->io_ops->read) -		return x->io_ops->read(x, reg); - -	return -EINVAL; -} - -static inline int usb_phy_io_write(struct usb_phy *x, u32 val, u32 reg) -{ -	if (x->io_ops && x->io_ops->write) -		return x->io_ops->write(x, val, reg); - -	return -EINVAL; -} - -static inline int -usb_phy_init(struct usb_phy *x) -{ -	if (x->init) -		return x->init(x); - -	return 0; -} - -static inline void -usb_phy_shutdown(struct usb_phy *x) -{ -	if (x->shutdown) -		x->shutdown(x); -} - -/* for usb host and peripheral controller drivers */  #ifdef CONFIG_USB_OTG_UTILS -extern struct usb_phy *usb_get_phy(enum usb_phy_type type); -extern struct usb_phy *devm_usb_get_phy(struct device *dev, -	enum usb_phy_type type); -extern void usb_put_phy(struct usb_phy *); -extern void devm_usb_put_phy(struct device *dev, struct usb_phy *x);  extern const char *otg_state_string(enum usb_otg_state state);  #else -static inline struct usb_phy *usb_get_phy(enum usb_phy_type type) -{ -	return NULL; -} - -static inline struct usb_phy *devm_usb_get_phy(struct device *dev, -	enum usb_phy_type type) -{ -	return NULL; -} - -static inline void usb_put_phy(struct usb_phy *x) -{ -} - -static inline void devm_usb_put_phy(struct device *dev, struct usb_phy *x) -{ -} -  static inline const char *otg_state_string(enum usb_otg_state state)  {  	return NULL; @@ -262,42 +88,6 @@ otg_set_peripheral(struct usb_otg *otg, struct usb_gadget *periph)  }  static inline int -usb_phy_set_power(struct usb_phy *x, unsigned mA) -{ -	if (x && x->set_power) -		return x->set_power(x, mA); -	return 0; -} - -/* Context: can sleep */ -static inline int -usb_phy_set_suspend(struct usb_phy *x, int suspend) -{ -	if (x->set_suspend != NULL) -		return x->set_suspend(x, suspend); -	else -		return 0; -} - -static inline int -usb_phy_notify_connect(struct usb_phy *x, int port) -{ -	if (x->notify_connect) -		return x->notify_connect(x, port); -	else -		return 0; -} - -static inline int -usb_phy_notify_disconnect(struct usb_phy *x, int port) -{ -	if (x->notify_disconnect) -		return x->notify_disconnect(x, port); -	else -		return 0; -} - -static inline int  otg_start_srp(struct usb_otg *otg)  {  	if (otg && otg->start_srp) @@ -306,31 +96,7 @@ otg_start_srp(struct usb_otg *otg)  	return -ENOTSUPP;  } -/* notifiers */ -static inline int -usb_register_notifier(struct usb_phy *x, struct notifier_block *nb) -{ -	return atomic_notifier_chain_register(&x->notifier, nb); -} - -static inline void -usb_unregister_notifier(struct usb_phy *x, struct notifier_block *nb) -{ -	atomic_notifier_chain_unregister(&x->notifier, nb); -} -  /* for OTG controller drivers (and maybe other stuff) */  extern int usb_bus_start_enum(struct usb_bus *bus, unsigned port_num); -static inline const char *usb_phy_type_string(enum usb_phy_type type) -{ -	switch (type) { -	case USB_PHY_TYPE_USB2: -		return "USB2 PHY"; -	case USB_PHY_TYPE_USB3: -		return "USB3 PHY"; -	default: -		return "UNKNOWN PHY TYPE"; -	} -}  #endif /* __LINUX_USB_OTG_H */ diff --git a/include/linux/usb/phy.h b/include/linux/usb/phy.h new file mode 100644 index 00000000000..06b5bae35b2 --- /dev/null +++ b/include/linux/usb/phy.h @@ -0,0 +1,233 @@ +/* USB OTG (On The Go) defines */ +/* + * + * These APIs may be used between USB controllers.  USB device drivers + * (for either host or peripheral roles) don't use these calls; they + * continue to use just usb_device and usb_gadget. + */ + +#ifndef __LINUX_USB_PHY_H +#define __LINUX_USB_PHY_H + +#include <linux/notifier.h> + +enum usb_phy_events { +	USB_EVENT_NONE,         /* no events or cable disconnected */ +	USB_EVENT_VBUS,         /* vbus valid event */ +	USB_EVENT_ID,           /* id was grounded */ +	USB_EVENT_CHARGER,      /* usb dedicated charger */ +	USB_EVENT_ENUMERATED,   /* gadget driver enumerated */ +}; + +/* associate a type with PHY */ +enum usb_phy_type { +	USB_PHY_TYPE_UNDEFINED, +	USB_PHY_TYPE_USB2, +	USB_PHY_TYPE_USB3, +}; + +/* OTG defines lots of enumeration states before device reset */ +enum usb_otg_state { +	OTG_STATE_UNDEFINED = 0, + +	/* single-role peripheral, and dual-role default-b */ +	OTG_STATE_B_IDLE, +	OTG_STATE_B_SRP_INIT, +	OTG_STATE_B_PERIPHERAL, + +	/* extra dual-role default-b states */ +	OTG_STATE_B_WAIT_ACON, +	OTG_STATE_B_HOST, + +	/* dual-role default-a */ +	OTG_STATE_A_IDLE, +	OTG_STATE_A_WAIT_VRISE, +	OTG_STATE_A_WAIT_BCON, +	OTG_STATE_A_HOST, +	OTG_STATE_A_SUSPEND, +	OTG_STATE_A_PERIPHERAL, +	OTG_STATE_A_WAIT_VFALL, +	OTG_STATE_A_VBUS_ERR, +}; + +struct usb_phy; +struct usb_otg; + +/* for transceivers connected thru an ULPI interface, the user must + * provide access ops + */ +struct usb_phy_io_ops { +	int (*read)(struct usb_phy *x, u32 reg); +	int (*write)(struct usb_phy *x, u32 val, u32 reg); +}; + +struct usb_phy { +	struct device		*dev; +	const char		*label; +	unsigned int		 flags; + +	enum usb_phy_type	type; +	enum usb_otg_state	state; +	enum usb_phy_events	last_event; + +	struct usb_otg		*otg; + +	struct device		*io_dev; +	struct usb_phy_io_ops	*io_ops; +	void __iomem		*io_priv; + +	/* for notification of usb_phy_events */ +	struct atomic_notifier_head	notifier; + +	/* to pass extra port status to the root hub */ +	u16			port_status; +	u16			port_change; + +	/* to support controllers that have multiple transceivers */ +	struct list_head	head; + +	/* initialize/shutdown the OTG controller */ +	int	(*init)(struct usb_phy *x); +	void	(*shutdown)(struct usb_phy *x); + +	/* effective for B devices, ignored for A-peripheral */ +	int	(*set_power)(struct usb_phy *x, +				unsigned mA); + +	/* for non-OTG B devices: set transceiver into suspend mode */ +	int	(*set_suspend)(struct usb_phy *x, +				int suspend); + +	/* notify phy connect status change */ +	int	(*notify_connect)(struct usb_phy *x, int port); +	int	(*notify_disconnect)(struct usb_phy *x, int port); +}; + + +/* for board-specific init logic */ +extern int usb_add_phy(struct usb_phy *, enum usb_phy_type type); +extern void usb_remove_phy(struct usb_phy *); + +/* helpers for direct access thru low-level io interface */ +static inline int usb_phy_io_read(struct usb_phy *x, u32 reg) +{ +	if (x->io_ops && x->io_ops->read) +		return x->io_ops->read(x, reg); + +	return -EINVAL; +} + +static inline int usb_phy_io_write(struct usb_phy *x, u32 val, u32 reg) +{ +	if (x->io_ops && x->io_ops->write) +		return x->io_ops->write(x, val, reg); + +	return -EINVAL; +} + +static inline int +usb_phy_init(struct usb_phy *x) +{ +	if (x->init) +		return x->init(x); + +	return 0; +} + +static inline void +usb_phy_shutdown(struct usb_phy *x) +{ +	if (x->shutdown) +		x->shutdown(x); +} + +/* for usb host and peripheral controller drivers */ +#ifdef CONFIG_USB_OTG_UTILS +extern struct usb_phy *usb_get_phy(enum usb_phy_type type); +extern struct usb_phy *devm_usb_get_phy(struct device *dev, +	enum usb_phy_type type); +extern void usb_put_phy(struct usb_phy *); +extern void devm_usb_put_phy(struct device *dev, struct usb_phy *x); +#else +static inline struct usb_phy *usb_get_phy(enum usb_phy_type type) +{ +	return NULL; +} + +static inline struct usb_phy *devm_usb_get_phy(struct device *dev, +	enum usb_phy_type type) +{ +	return NULL; +} + +static inline void usb_put_phy(struct usb_phy *x) +{ +} + +static inline void devm_usb_put_phy(struct device *dev, struct usb_phy *x) +{ +} + +#endif + +static inline int +usb_phy_set_power(struct usb_phy *x, unsigned mA) +{ +	if (x && x->set_power) +		return x->set_power(x, mA); +	return 0; +} + +/* Context: can sleep */ +static inline int +usb_phy_set_suspend(struct usb_phy *x, int suspend) +{ +	if (x->set_suspend != NULL) +		return x->set_suspend(x, suspend); +	else +		return 0; +} + +static inline int +usb_phy_notify_connect(struct usb_phy *x, int port) +{ +	if (x->notify_connect) +		return x->notify_connect(x, port); +	else +		return 0; +} + +static inline int +usb_phy_notify_disconnect(struct usb_phy *x, int port) +{ +	if (x->notify_disconnect) +		return x->notify_disconnect(x, port); +	else +		return 0; +} + +/* notifiers */ +static inline int +usb_register_notifier(struct usb_phy *x, struct notifier_block *nb) +{ +	return atomic_notifier_chain_register(&x->notifier, nb); +} + +static inline void +usb_unregister_notifier(struct usb_phy *x, struct notifier_block *nb) +{ +	atomic_notifier_chain_unregister(&x->notifier, nb); +} + +static inline const char *usb_phy_type_string(enum usb_phy_type type) +{ +	switch (type) { +	case USB_PHY_TYPE_USB2: +		return "USB2 PHY"; +	case USB_PHY_TYPE_USB3: +		return "USB3 PHY"; +	default: +		return "UNKNOWN PHY TYPE"; +	} +} +#endif /* __LINUX_USB_PHY_H */ diff --git a/include/linux/usb/phy_companion.h b/include/linux/usb/phy_companion.h new file mode 100644 index 00000000000..edd2ec23d28 --- /dev/null +++ b/include/linux/usb/phy_companion.h @@ -0,0 +1,34 @@ +/* + * phy-companion.h -- phy companion to indicate the comparator part of PHY + * + * Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.com + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Author: Kishon Vijay Abraham I <kishon@ti.com> + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + */ + +#ifndef __DRIVERS_PHY_COMPANION_H +#define __DRIVERS_PHY_COMPANION_H + +#include <linux/usb/otg.h> + +/* phy_companion to take care of VBUS, ID and srp capabilities */ +struct phy_companion { + +	/* effective for A-peripheral, ignored for B devices */ +	int	(*set_vbus)(struct phy_companion *x, bool enabled); + +	/* for B devices only:  start session with A-Host */ +	int	(*start_srp)(struct phy_companion *x); +}; + +#endif /* __DRIVERS_PHY_COMPANION_H */ diff --git a/include/linux/usb/quirks.h b/include/linux/usb/quirks.h index 3e93de7ecbc..52f944dfe2f 100644 --- a/include/linux/usb/quirks.h +++ b/include/linux/usb/quirks.h @@ -19,8 +19,8 @@  /* device can't handle its Configuration or Interface strings */  #define USB_QUIRK_CONFIG_INTF_STRINGS	0x00000008 -/*device will morph if reset, don't use reset for handling errors */ -#define USB_QUIRK_RESET_MORPHS		0x00000010 +/* device can't be reset(e.g morph devices), don't use reset */ +#define USB_QUIRK_RESET			0x00000010  /* device has more interface descriptions than the bNumInterfaces count,     and can't handle talking to these interfaces */ diff --git a/include/linux/usb/serial.h b/include/linux/usb/serial.h index 86c0b451745..ef9be7e1e19 100644 --- a/include/linux/usb/serial.h +++ b/include/linux/usb/serial.h @@ -301,17 +301,13 @@ extern void usb_serial_port_softint(struct usb_serial_port *port);  extern int usb_serial_suspend(struct usb_interface *intf, pm_message_t message);  extern int usb_serial_resume(struct usb_interface *intf); -extern int ezusb_writememory(struct usb_serial *serial, int address, -			     unsigned char *data, int length, __u8 bRequest); -extern int ezusb_set_reset(struct usb_serial *serial, unsigned char reset_bit); -  /* USB Serial console functions */  #ifdef CONFIG_USB_SERIAL_CONSOLE -extern void usb_serial_console_init(int debug, int minor); +extern void usb_serial_console_init(int minor);  extern void usb_serial_console_exit(void);  extern void usb_serial_console_disconnect(struct usb_serial *serial);  #else -static inline void usb_serial_console_init(int debug, int minor) { } +static inline void usb_serial_console_init(int minor) { }  static inline void usb_serial_console_exit(void) { }  static inline void usb_serial_console_disconnect(struct usb_serial *serial) {}  #endif @@ -333,7 +329,7 @@ extern void usb_serial_generic_throttle(struct tty_struct *tty);  extern void usb_serial_generic_unthrottle(struct tty_struct *tty);  extern void usb_serial_generic_disconnect(struct usb_serial *serial);  extern void usb_serial_generic_release(struct usb_serial *serial); -extern int usb_serial_generic_register(int debug); +extern int usb_serial_generic_register(void);  extern void usb_serial_generic_deregister(void);  extern int usb_serial_generic_submit_read_urbs(struct usb_serial_port *port,  						 gfp_t mem_flags); @@ -355,30 +351,14 @@ extern struct usb_serial_driver usb_serial_generic_device;  extern struct bus_type usb_serial_bus_type;  extern struct tty_driver *usb_serial_tty_driver; -static inline void usb_serial_debug_data(int debug, -					 struct device *dev, +static inline void usb_serial_debug_data(struct device *dev,  					 const char *function, int size,  					 const unsigned char *data)  { -	int i; - -	if (debug) { -		dev_printk(KERN_DEBUG, dev, "%s - length = %d, data = ", -			   function, size); -		for (i = 0; i < size; ++i) -			printk("%.2x ", data[i]); -		printk("\n"); -	} +	dev_dbg(dev, "%s - length = %d, data = %*ph\n", +		function, size, size, data);  } -/* Use our own dbg macro */ -#undef dbg -#define dbg(format, arg...)						\ -do {									\ -	if (debug)							\ -		printk(KERN_DEBUG "%s: " format "\n", __FILE__, ##arg);	\ -} while (0) -  /*   * Macro for reporting errors in write path to avoid inifinite loop   * when port is used as a console. diff --git a/include/linux/usb/tegra_usb_phy.h b/include/linux/usb/tegra_usb_phy.h new file mode 100644 index 00000000000..176b1ca06ae --- /dev/null +++ b/include/linux/usb/tegra_usb_phy.h @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2010 Google, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + */ + +#ifndef __TEGRA_USB_PHY_H +#define __TEGRA_USB_PHY_H + +#include <linux/clk.h> +#include <linux/usb/otg.h> + +struct tegra_utmip_config { +	u8 hssync_start_delay; +	u8 elastic_limit; +	u8 idle_wait_delay; +	u8 term_range_adj; +	u8 xcvr_setup; +	u8 xcvr_lsfslew; +	u8 xcvr_lsrslew; +}; + +struct tegra_ulpi_config { +	int reset_gpio; +	const char *clk; +}; + +enum tegra_usb_phy_port_speed { +	TEGRA_USB_PHY_PORT_SPEED_FULL = 0, +	TEGRA_USB_PHY_PORT_SPEED_LOW, +	TEGRA_USB_PHY_PORT_SPEED_HIGH, +}; + +enum tegra_usb_phy_mode { +	TEGRA_USB_PHY_MODE_DEVICE, +	TEGRA_USB_PHY_MODE_HOST, +}; + +struct tegra_xtal_freq; + +struct tegra_usb_phy { +	int instance; +	const struct tegra_xtal_freq *freq; +	void __iomem *regs; +	void __iomem *pad_regs; +	struct clk *clk; +	struct clk *pll_u; +	struct clk *pad_clk; +	enum tegra_usb_phy_mode mode; +	void *config; +	struct usb_phy *ulpi; +	struct usb_phy u_phy; +	struct device *dev; +}; + +struct tegra_usb_phy *tegra_usb_phy_open(struct device *dev, int instance, +	void __iomem *regs, void *config, enum tegra_usb_phy_mode phy_mode); + +void tegra_usb_phy_clk_disable(struct tegra_usb_phy *phy); + +void tegra_usb_phy_clk_enable(struct tegra_usb_phy *phy); + +void tegra_usb_phy_preresume(struct tegra_usb_phy *phy); + +void tegra_usb_phy_postresume(struct tegra_usb_phy *phy); + +void tegra_ehci_phy_restore_start(struct tegra_usb_phy *phy, +				 enum tegra_usb_phy_port_speed port_speed); + +void tegra_ehci_phy_restore_end(struct tegra_usb_phy *phy); + +#endif /* __TEGRA_USB_PHY_H */ diff --git a/include/linux/usb_usual.h b/include/linux/usb_usual.h index e84e769aadd..bf99cd01be2 100644 --- a/include/linux/usb_usual.h +++ b/include/linux/usb_usual.h @@ -72,33 +72,9 @@  enum { US_DO_ALL_FLAGS };  #undef US_FLAG -/* - * The bias field for libusual and friends. - */ -#define USB_US_TYPE_NONE   0 -#define USB_US_TYPE_STOR   1		/* usb-storage */ -#define USB_US_TYPE_UB     2		/* ub */ - -#define USB_US_TYPE(flags) 		(((flags) >> 24) & 0xFF) -#define USB_US_ORIG_FLAGS(flags)	((flags) & 0x00FFFFFF) -  #include <linux/usb/storage.h> -/* - */  extern int usb_usual_ignore_device(struct usb_interface *intf);  extern struct usb_device_id usb_storage_usb_ids[]; -#ifdef CONFIG_USB_LIBUSUAL - -extern void usb_usual_set_present(int type); -extern void usb_usual_clear_present(int type); -extern int usb_usual_check_type(const struct usb_device_id *, int type); -#else - -#define usb_usual_set_present(t)	do { } while(0) -#define usb_usual_clear_present(t)	do { } while(0) -#define usb_usual_check_type(id, t)	(0) -#endif /* CONFIG_USB_LIBUSUAL */ -  #endif /* __LINUX_USB_USUAL_H */ diff --git a/include/linux/usbdevice_fs.h b/include/linux/usbdevice_fs.h index 3b74666be02..4abe28e41cb 100644 --- a/include/linux/usbdevice_fs.h +++ b/include/linux/usbdevice_fs.h @@ -131,6 +131,19 @@ struct usbdevfs_hub_portinfo {  #define USBDEVFS_CAP_NO_PACKET_SIZE_LIM		0x04  #define USBDEVFS_CAP_BULK_SCATTER_GATHER	0x08 +/* USBDEVFS_DISCONNECT_CLAIM flags & struct */ + +/* disconnect-and-claim if the driver matches the driver field */ +#define USBDEVFS_DISCONNECT_CLAIM_IF_DRIVER	0x01 +/* disconnect-and-claim except when the driver matches the driver field */ +#define USBDEVFS_DISCONNECT_CLAIM_EXCEPT_DRIVER	0x02 + +struct usbdevfs_disconnect_claim { +	unsigned int interface; +	unsigned int flags; +	char driver[USBDEVFS_MAXDRIVERNAME + 1]; +}; +  #ifdef __KERNEL__  #ifdef CONFIG_COMPAT  #include <linux/compat.h> @@ -211,5 +224,6 @@ struct usbdevfs_ioctl32 {  #define USBDEVFS_CLAIM_PORT        _IOR('U', 24, unsigned int)  #define USBDEVFS_RELEASE_PORT      _IOR('U', 25, unsigned int)  #define USBDEVFS_GET_CAPABILITIES  _IOR('U', 26, __u32) +#define USBDEVFS_DISCONNECT_CLAIM  _IOR('U', 27, struct usbdevfs_disconnect_claim)  #endif /* _LINUX_USBDEVICE_FS_H */ diff --git a/include/linux/w1-gpio.h b/include/linux/w1-gpio.h index 3adeff82212..065e3ae79ab 100644 --- a/include/linux/w1-gpio.h +++ b/include/linux/w1-gpio.h @@ -19,6 +19,7 @@ struct w1_gpio_platform_data {  	unsigned int pin;  	unsigned int is_open_drain:1;  	void (*enable_external_pullup)(int enable); +	unsigned int ext_pullup_enable_pin;  };  #endif /* _LINUX_W1_GPIO_H */ diff --git a/include/linux/xfrm.h b/include/linux/xfrm.h index 22e61fdf75a..28e493b5b94 100644 --- a/include/linux/xfrm.h +++ b/include/linux/xfrm.h @@ -84,6 +84,8 @@ struct xfrm_replay_state {  	__u32	bitmap;  }; +#define XFRMA_REPLAY_ESN_MAX	4096 +  struct xfrm_replay_state_esn {  	unsigned int	bmp_len;  	__u32		oseq; diff --git a/include/net/ip6_fib.h b/include/net/ip6_fib.h index 0fedbd8d747..9fc7114159e 100644 --- a/include/net/ip6_fib.h +++ b/include/net/ip6_fib.h @@ -111,9 +111,8 @@ struct rt6_info {  	struct inet6_dev		*rt6i_idev;  	unsigned long			_rt6i_peer; -#ifdef CONFIG_XFRM -	u32				rt6i_flow_cache_genid; -#endif +	u32				rt6i_genid; +  	/* more non-fragment space at head required */  	unsigned short			rt6i_nfheader_len; diff --git a/include/net/net_namespace.h b/include/net/net_namespace.h index ae1cd6c9ba5..fd87963a0ea 100644 --- a/include/net/net_namespace.h +++ b/include/net/net_namespace.h @@ -102,6 +102,7 @@ struct net {  #endif  	struct netns_ipvs	*ipvs;  	struct sock		*diag_nlsk; +	atomic_t		rt_genid;  }; @@ -300,5 +301,14 @@ static inline void unregister_net_sysctl_table(struct ctl_table_header *header)  }  #endif +static inline int rt_genid(struct net *net) +{ +	return atomic_read(&net->rt_genid); +} + +static inline void rt_genid_bump(struct net *net) +{ +	atomic_inc(&net->rt_genid); +}  #endif /* __NET_NET_NAMESPACE_H */ diff --git a/include/net/netns/ipv4.h b/include/net/netns/ipv4.h index 1474dd65c66..eb24dbccd81 100644 --- a/include/net/netns/ipv4.h +++ b/include/net/netns/ipv4.h @@ -65,7 +65,6 @@ struct netns_ipv4 {  	unsigned int sysctl_ping_group_range[2];  	long sysctl_tcp_mem[3]; -	atomic_t rt_genid;  	atomic_t dev_addr_genid;  #ifdef CONFIG_IP_MROUTE diff --git a/include/net/route.h b/include/net/route.h index 776a27f1ab7..da22243d276 100644 --- a/include/net/route.h +++ b/include/net/route.h @@ -108,7 +108,7 @@ extern struct ip_rt_acct __percpu *ip_rt_acct;  struct in_device;  extern int		ip_rt_init(void); -extern void		rt_cache_flush(struct net *net, int how); +extern void		rt_cache_flush(struct net *net);  extern void		rt_flush_dev(struct net_device *dev);  extern struct rtable *__ip_route_output_key(struct net *, struct flowi4 *flp);  extern struct rtable *ip_route_output_flow(struct net *, struct flowi4 *flp, diff --git a/include/net/sock.h b/include/net/sock.h index 72132aef53f..adb7da20b5a 100644 --- a/include/net/sock.h +++ b/include/net/sock.h @@ -1332,7 +1332,7 @@ static inline bool sk_wmem_schedule(struct sock *sk, int size)  }  static inline bool -sk_rmem_schedule(struct sock *sk, struct sk_buff *skb, unsigned int size) +sk_rmem_schedule(struct sock *sk, struct sk_buff *skb, int size)  {  	if (!sk_has_account(sk))  		return true; diff --git a/include/trace/define_trace.h b/include/trace/define_trace.h index b0b4eb24d59..1905ca8dd39 100644 --- a/include/trace/define_trace.h +++ b/include/trace/define_trace.h @@ -1,5 +1,5 @@  /* - * Trace files that want to automate creationg of all tracepoints defined + * Trace files that want to automate creation of all tracepoints defined   * in their file should include this file. The following are macros that the   * trace file may define:   * diff --git a/include/trace/events/kmem.h b/include/trace/events/kmem.h index 5f889f16b0c..08fa27244da 100644 --- a/include/trace/events/kmem.h +++ b/include/trace/events/kmem.h @@ -214,7 +214,7 @@ TRACE_EVENT(mm_page_alloc,  	TP_printk("page=%p pfn=%lu order=%d migratetype=%d gfp_flags=%s",  		__entry->page, -		page_to_pfn(__entry->page), +		__entry->page ? page_to_pfn(__entry->page) : 0,  		__entry->order,  		__entry->migratetype,  		show_gfp_flags(__entry->gfp_flags)) @@ -240,7 +240,7 @@ DECLARE_EVENT_CLASS(mm_page,  	TP_printk("page=%p pfn=%lu order=%u migratetype=%d percpu_refill=%d",  		__entry->page, -		page_to_pfn(__entry->page), +		__entry->page ? page_to_pfn(__entry->page) : 0,  		__entry->order,  		__entry->migratetype,  		__entry->order == 0) diff --git a/include/xen/grant_table.h b/include/xen/grant_table.h index 11e27c3af3c..f19fff8650e 100644 --- a/include/xen/grant_table.h +++ b/include/xen/grant_table.h @@ -187,6 +187,7 @@ int gnttab_map_refs(struct gnttab_map_grant_ref *map_ops,  		    struct gnttab_map_grant_ref *kmap_ops,  		    struct page **pages, unsigned int count);  int gnttab_unmap_refs(struct gnttab_unmap_grant_ref *unmap_ops, -		      struct page **pages, unsigned int count, bool clear_pte); +		      struct gnttab_map_grant_ref *kunmap_ops, +		      struct page **pages, unsigned int count);  #endif /* __ASM_GNTTAB_H__ */ diff --git a/include/xen/interface/physdev.h b/include/xen/interface/physdev.h index 9ce788d8cf4..bfa1d50fe15 100644 --- a/include/xen/interface/physdev.h +++ b/include/xen/interface/physdev.h @@ -258,6 +258,22 @@ struct physdev_pci_device {      uint8_t devfn;  }; +#define PHYSDEVOP_DBGP_RESET_PREPARE    1 +#define PHYSDEVOP_DBGP_RESET_DONE       2 + +#define PHYSDEVOP_DBGP_BUS_UNKNOWN      0 +#define PHYSDEVOP_DBGP_BUS_PCI          1 + +#define PHYSDEVOP_dbgp_op               29 +struct physdev_dbgp_op { +    /* IN */ +    uint8_t op; +    uint8_t bus; +    union { +        struct physdev_pci_device pci; +    } u; +}; +  /*   * Notify that some PIRQ-bound event channels have been unmasked.   * ** This command is obsolete since interface version 0x00030202 and is **  |