diff options
Diffstat (limited to 'include')
96 files changed, 1553 insertions, 359 deletions
diff --git a/include/acpi/actypes.h b/include/acpi/actypes.h index eba66043cf1..e8bcc4742e0 100644 --- a/include/acpi/actypes.h +++ b/include/acpi/actypes.h @@ -499,9 +499,10 @@ typedef u64 acpi_integer;  #define ACPI_STATE_D0                   (u8) 0  #define ACPI_STATE_D1                   (u8) 1  #define ACPI_STATE_D2                   (u8) 2 -#define ACPI_STATE_D3                   (u8) 3 -#define ACPI_STATE_D3_COLD              (u8) 4 -#define ACPI_D_STATES_MAX               ACPI_STATE_D3_COLD +#define ACPI_STATE_D3_HOT               (u8) 3 +#define ACPI_STATE_D3                   (u8) 4 +#define ACPI_STATE_D3_COLD              ACPI_STATE_D3 +#define ACPI_D_STATES_MAX               ACPI_STATE_D3  #define ACPI_D_STATE_COUNT              5  #define ACPI_STATE_C0                   (u8) 0 diff --git a/include/asm-generic/cmpxchg.h b/include/asm-generic/cmpxchg.h index 8a361834dc2..14883026015 100644 --- a/include/asm-generic/cmpxchg.h +++ b/include/asm-generic/cmpxchg.h @@ -10,6 +10,7 @@  #error "Cannot use generic cmpxchg on SMP"  #endif +#include <linux/types.h>  #include <linux/irqflags.h>  #ifndef xchg diff --git a/include/asm-generic/siginfo.h b/include/asm-generic/siginfo.h index 0dd4e87f6fb..5e5e3865f1e 100644 --- a/include/asm-generic/siginfo.h +++ b/include/asm-generic/siginfo.h @@ -35,6 +35,14 @@ typedef union sigval {  #define __ARCH_SI_BAND_T long  #endif +#ifndef __ARCH_SI_CLOCK_T +#define __ARCH_SI_CLOCK_T __kernel_clock_t +#endif + +#ifndef __ARCH_SI_ATTRIBUTES +#define __ARCH_SI_ATTRIBUTES +#endif +  #ifndef HAVE_ARCH_SIGINFO_T  typedef struct siginfo { @@ -72,8 +80,8 @@ typedef struct siginfo {  			__kernel_pid_t _pid;	/* which child */  			__ARCH_SI_UID_T _uid;	/* sender's uid */  			int _status;		/* exit code */ -			__kernel_clock_t _utime; -			__kernel_clock_t _stime; +			__ARCH_SI_CLOCK_T _utime; +			__ARCH_SI_CLOCK_T _stime;  		} _sigchld;  		/* SIGILL, SIGFPE, SIGSEGV, SIGBUS */ @@ -91,7 +99,7 @@ typedef struct siginfo {  			int _fd;  		} _sigpoll;  	} _sifields; -} siginfo_t; +} __ARCH_SI_ATTRIBUTES siginfo_t;  #endif diff --git a/include/asm-generic/statfs.h b/include/asm-generic/statfs.h index 0fd28e028de..c749af9c098 100644 --- a/include/asm-generic/statfs.h +++ b/include/asm-generic/statfs.h @@ -15,7 +15,7 @@ typedef __kernel_fsid_t	fsid_t;   * with a 10' pole.   */  #ifndef __statfs_word -#if BITS_PER_LONG == 64 +#if __BITS_PER_LONG == 64  #define __statfs_word long  #else  #define __statfs_word __u32 diff --git a/include/crypto/internal/aead.h b/include/crypto/internal/aead.h index d838c945575..2eba340230a 100644 --- a/include/crypto/internal/aead.h +++ b/include/crypto/internal/aead.h @@ -31,6 +31,8 @@ static inline void crypto_set_aead_spawn(  	crypto_set_spawn(&spawn->base, inst);  } +struct crypto_alg *crypto_lookup_aead(const char *name, u32 type, u32 mask); +  int crypto_grab_aead(struct crypto_aead_spawn *spawn, const char *name,  		     u32 type, u32 mask); diff --git a/include/crypto/internal/skcipher.h b/include/crypto/internal/skcipher.h index 3a748a6bf77..06e8b32d541 100644 --- a/include/crypto/internal/skcipher.h +++ b/include/crypto/internal/skcipher.h @@ -34,6 +34,8 @@ static inline void crypto_set_skcipher_spawn(  int crypto_grab_skcipher(struct crypto_skcipher_spawn *spawn, const char *name,  			 u32 type, u32 mask); +struct crypto_alg *crypto_lookup_skcipher(const char *name, u32 type, u32 mask); +  static inline void crypto_drop_skcipher(struct crypto_skcipher_spawn *spawn)  {  	crypto_drop_spawn(&spawn->base); diff --git a/include/drm/drm.h b/include/drm/drm.h index 34a7b89fd00..64ff02d5b73 100644 --- a/include/drm/drm.h +++ b/include/drm/drm.h @@ -617,6 +617,17 @@ struct drm_get_cap {  	__u64 value;  }; +#define DRM_CLOEXEC O_CLOEXEC +struct drm_prime_handle { +	__u32 handle; + +	/** Flags.. only applicable for handle->fd */ +	__u32 flags; + +	/** Returned dmabuf file descriptor */ +	__s32 fd; +}; +  #include "drm_mode.h"  #define DRM_IOCTL_BASE			'd' @@ -673,7 +684,8 @@ struct drm_get_cap {  #define DRM_IOCTL_UNLOCK		DRM_IOW( 0x2b, struct drm_lock)  #define DRM_IOCTL_FINISH		DRM_IOW( 0x2c, struct drm_lock) -#define DRM_IOCTL_GEM_PRIME_OPEN        DRM_IOWR(0x2e, struct drm_gem_open) +#define DRM_IOCTL_PRIME_HANDLE_TO_FD    DRM_IOWR(0x2d, struct drm_prime_handle) +#define DRM_IOCTL_PRIME_FD_TO_HANDLE    DRM_IOWR(0x2e, struct drm_prime_handle)  #define DRM_IOCTL_AGP_ACQUIRE		DRM_IO(  0x30)  #define DRM_IOCTL_AGP_RELEASE		DRM_IO(  0x31) diff --git a/include/drm/drmP.h b/include/drm/drmP.h index 574bd1c81eb..dd731043fec 100644 --- a/include/drm/drmP.h +++ b/include/drm/drmP.h @@ -91,6 +91,7 @@ struct drm_device;  #define DRM_UT_CORE 		0x01  #define DRM_UT_DRIVER		0x02  #define DRM_UT_KMS		0x04 +#define DRM_UT_PRIME		0x08  /*   * Three debug levels are defined.   * drm_core, drm_driver, drm_kms @@ -150,6 +151,7 @@ int drm_err(const char *func, const char *format, ...);  #define DRIVER_IRQ_VBL2    0x800  #define DRIVER_GEM         0x1000  #define DRIVER_MODESET     0x2000 +#define DRIVER_PRIME       0x4000  #define DRIVER_BUS_PCI 0x1  #define DRIVER_BUS_PLATFORM 0x2 @@ -215,6 +217,11 @@ int drm_err(const char *func, const char *format, ...);  		drm_ut_debug_printk(DRM_UT_KMS, DRM_NAME, 		\  					 __func__, fmt, ##args);	\  	} while (0) +#define DRM_DEBUG_PRIME(fmt, args...)					\ +	do {								\ +		drm_ut_debug_printk(DRM_UT_PRIME, DRM_NAME,		\ +					__func__, fmt, ##args);		\ +	} while (0)  #define DRM_LOG(fmt, args...)						\  	do {								\  		drm_ut_debug_printk(DRM_UT_CORE, NULL,			\ @@ -238,6 +245,7 @@ int drm_err(const char *func, const char *format, ...);  #else  #define DRM_DEBUG_DRIVER(fmt, args...) do { } while (0)  #define DRM_DEBUG_KMS(fmt, args...)	do { } while (0) +#define DRM_DEBUG_PRIME(fmt, args...)	do { } while (0)  #define DRM_DEBUG(fmt, arg...)		 do { } while (0)  #define DRM_LOG(fmt, arg...)		do { } while (0)  #define DRM_LOG_KMS(fmt, args...) do { } while (0) @@ -410,6 +418,12 @@ struct drm_pending_event {  	void (*destroy)(struct drm_pending_event *event);  }; +/* initial implementaton using a linked list - todo hashtab */ +struct drm_prime_file_private { +	struct list_head head; +	struct mutex lock; +}; +  /** File private data */  struct drm_file {  	int authenticated; @@ -437,6 +451,8 @@ struct drm_file {  	wait_queue_head_t event_wait;  	struct list_head event_list;  	int event_space; + +	struct drm_prime_file_private prime;  };  /** Wait queue */ @@ -652,6 +668,12 @@ struct drm_gem_object {  	uint32_t pending_write_domain;  	void *driver_private; + +	/* dma buf exported from this GEM object */ +	struct dma_buf *export_dma_buf; + +	/* dma buf attachment backing this object */ +	struct dma_buf_attachment *import_attach;  };  #include "drm_crtc.h" @@ -890,6 +912,20 @@ struct drm_driver {  	int (*gem_open_object) (struct drm_gem_object *, struct drm_file *);  	void (*gem_close_object) (struct drm_gem_object *, struct drm_file *); +	/* prime: */ +	/* export handle -> fd (see drm_gem_prime_handle_to_fd() helper) */ +	int (*prime_handle_to_fd)(struct drm_device *dev, struct drm_file *file_priv, +				uint32_t handle, uint32_t flags, int *prime_fd); +	/* import fd -> handle (see drm_gem_prime_fd_to_handle() helper) */ +	int (*prime_fd_to_handle)(struct drm_device *dev, struct drm_file *file_priv, +				int prime_fd, uint32_t *handle); +	/* export GEM -> dmabuf */ +	struct dma_buf * (*gem_prime_export)(struct drm_device *dev, +				struct drm_gem_object *obj, int flags); +	/* import dmabuf -> GEM */ +	struct drm_gem_object * (*gem_prime_import)(struct drm_device *dev, +				struct dma_buf *dma_buf); +  	/* vga arb irq handler */  	void (*vgaarb_irq)(struct drm_device *dev, bool state); @@ -1509,6 +1545,32 @@ extern int drm_vblank_info(struct seq_file *m, void *data);  extern int drm_clients_info(struct seq_file *m, void* data);  extern int drm_gem_name_info(struct seq_file *m, void *data); + +extern int drm_gem_prime_handle_to_fd(struct drm_device *dev, +		struct drm_file *file_priv, uint32_t handle, uint32_t flags, +		int *prime_fd); +extern int drm_gem_prime_fd_to_handle(struct drm_device *dev, +		struct drm_file *file_priv, int prime_fd, uint32_t *handle); + +extern int drm_prime_handle_to_fd_ioctl(struct drm_device *dev, void *data, +					struct drm_file *file_priv); +extern int drm_prime_fd_to_handle_ioctl(struct drm_device *dev, void *data, +					struct drm_file *file_priv); + +extern struct sg_table *drm_prime_pages_to_sg(struct page **pages, int nr_pages); +extern void drm_prime_gem_destroy(struct drm_gem_object *obj, struct sg_table *sg); + + +void drm_prime_init_file_private(struct drm_prime_file_private *prime_fpriv); +void drm_prime_destroy_file_private(struct drm_prime_file_private *prime_fpriv); +int drm_prime_add_imported_buf_handle(struct drm_prime_file_private *prime_fpriv, struct dma_buf *dma_buf, uint32_t handle); +int drm_prime_lookup_imported_buf_handle(struct drm_prime_file_private *prime_fpriv, struct dma_buf *dma_buf, uint32_t *handle); +void drm_prime_remove_imported_buf_handle(struct drm_prime_file_private *prime_fpriv, struct dma_buf *dma_buf); + +int drm_prime_add_dma_buf(struct drm_device *dev, struct drm_gem_object *obj); +int drm_prime_lookup_obj(struct drm_device *dev, struct dma_buf *buf, +			 struct drm_gem_object **obj); +  #if DRM_DEBUG_CODE  extern int drm_vma_info(struct seq_file *m, void *data);  #endif diff --git a/include/drm/exynos_drm.h b/include/drm/exynos_drm.h index 3963116083a..e478de4e5d5 100644 --- a/include/drm/exynos_drm.h +++ b/include/drm/exynos_drm.h @@ -85,7 +85,7 @@ struct drm_exynos_gem_mmap {  struct drm_exynos_vidi_connection {  	unsigned int connection;  	unsigned int extensions; -	uint64_t *edid; +	uint64_t edid;  };  struct drm_exynos_plane_set_zpos { @@ -96,7 +96,8 @@ struct drm_exynos_plane_set_zpos {  /* memory type definitions. */  enum e_drm_exynos_gem_mem_type {  	/* Physically Non-Continuous memory. */ -	EXYNOS_BO_NONCONTIG	= 1 << 0 +	EXYNOS_BO_NONCONTIG	= 1 << 0, +	EXYNOS_BO_MASK		= EXYNOS_BO_NONCONTIG  };  #define DRM_EXYNOS_GEM_CREATE		0x00 diff --git a/include/drm/intel-gtt.h b/include/drm/intel-gtt.h index 0a0001b9dc7..923afb5dcf0 100644 --- a/include/drm/intel-gtt.h +++ b/include/drm/intel-gtt.h @@ -44,4 +44,8 @@ void intel_gtt_insert_pages(unsigned int first_entry, unsigned int num_entries,  /* flag for GFDT type */  #define AGP_USER_CACHED_MEMORY_GFDT (1 << 3) +#ifdef CONFIG_INTEL_IOMMU +extern int intel_iommu_gfx_mapped; +#endif +  #endif diff --git a/include/linux/Kbuild b/include/linux/Kbuild index d05df281035..3c9b616c834 100644 --- a/include/linux/Kbuild +++ b/include/linux/Kbuild @@ -3,6 +3,7 @@ header-y += can/  header-y += caif/  header-y += dvb/  header-y += hdlc/ +header-y += hsi/  header-y += isdn/  header-y += mmc/  header-y += nfsd/ diff --git a/include/linux/amba/bus.h b/include/linux/amba/bus.h index 7847e197730..8d54f79457b 100644 --- a/include/linux/amba/bus.h +++ b/include/linux/amba/bus.h @@ -30,7 +30,6 @@ struct amba_device {  	struct device		dev;  	struct resource		res;  	struct clk		*pclk; -	struct regulator	*vcore;  	u64			dma_mask;  	unsigned int		periphid;  	unsigned int		irq[AMBA_NR_IRQS]; @@ -75,12 +74,6 @@ void amba_release_regions(struct amba_device *);  #define amba_pclk_disable(d)	\  	do { if (!IS_ERR((d)->pclk)) clk_disable((d)->pclk); } while (0) -#define amba_vcore_enable(d)	\ -	(IS_ERR((d)->vcore) ? 0 : regulator_enable((d)->vcore)) - -#define amba_vcore_disable(d)	\ -	do { if (!IS_ERR((d)->vcore)) regulator_disable((d)->vcore); } while (0) -  /* Some drivers don't use the struct amba_device */  #define AMBA_CONFIG_BITS(a) (((a) >> 24) & 0xff)  #define AMBA_REV_BITS(a) (((a) >> 20) & 0x0f) diff --git a/include/linux/amba/pl022.h b/include/linux/amba/pl022.h index b8c51124ed1..76dd1b199a1 100644 --- a/include/linux/amba/pl022.h +++ b/include/linux/amba/pl022.h @@ -25,6 +25,8 @@  #ifndef _SSP_PL022_H  #define _SSP_PL022_H +#include <linux/types.h> +  /**   * whether SSP is in loopback mode or not   */ diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 606cf339bb5..2aa24664a5b 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -426,14 +426,10 @@ struct request_queue {  				 (1 << QUEUE_FLAG_SAME_COMP)	|	\  				 (1 << QUEUE_FLAG_ADD_RANDOM)) -static inline int queue_is_locked(struct request_queue *q) +static inline void queue_lockdep_assert_held(struct request_queue *q)  { -#ifdef CONFIG_SMP -	spinlock_t *lock = q->queue_lock; -	return lock && spin_is_locked(lock); -#else -	return 1; -#endif +	if (q->queue_lock) +		lockdep_assert_held(q->queue_lock);  }  static inline void queue_flag_set_unlocked(unsigned int flag, @@ -445,7 +441,7 @@ static inline void queue_flag_set_unlocked(unsigned int flag,  static inline int queue_flag_test_and_clear(unsigned int flag,  					    struct request_queue *q)  { -	WARN_ON_ONCE(!queue_is_locked(q)); +	queue_lockdep_assert_held(q);  	if (test_bit(flag, &q->queue_flags)) {  		__clear_bit(flag, &q->queue_flags); @@ -458,7 +454,7 @@ static inline int queue_flag_test_and_clear(unsigned int flag,  static inline int queue_flag_test_and_set(unsigned int flag,  					  struct request_queue *q)  { -	WARN_ON_ONCE(!queue_is_locked(q)); +	queue_lockdep_assert_held(q);  	if (!test_bit(flag, &q->queue_flags)) {  		__set_bit(flag, &q->queue_flags); @@ -470,7 +466,7 @@ static inline int queue_flag_test_and_set(unsigned int flag,  static inline void queue_flag_set(unsigned int flag, struct request_queue *q)  { -	WARN_ON_ONCE(!queue_is_locked(q)); +	queue_lockdep_assert_held(q);  	__set_bit(flag, &q->queue_flags);  } @@ -487,7 +483,7 @@ static inline int queue_in_flight(struct request_queue *q)  static inline void queue_flag_clear(unsigned int flag, struct request_queue *q)  { -	WARN_ON_ONCE(!queue_is_locked(q)); +	queue_lockdep_assert_held(q);  	__clear_bit(flag, &q->queue_flags);  } diff --git a/include/linux/cpumask.h b/include/linux/cpumask.h index 1ffdb9856bb..a2c819d3c96 100644 --- a/include/linux/cpumask.h +++ b/include/linux/cpumask.h @@ -764,12 +764,6 @@ static inline const struct cpumask *get_cpu_mask(unsigned int cpu)   *   */  #ifndef CONFIG_DISABLE_OBSOLETE_CPUMASK_FUNCTIONS -/* These strip const, as traditionally they weren't const. */ -#define cpu_possible_map	(*(cpumask_t *)cpu_possible_mask) -#define cpu_online_map		(*(cpumask_t *)cpu_online_mask) -#define cpu_present_map		(*(cpumask_t *)cpu_present_mask) -#define cpu_active_map		(*(cpumask_t *)cpu_active_mask) -  #define cpumask_of_cpu(cpu) (*get_cpu_mask(cpu))  #define CPU_MASK_LAST_WORD BITMAP_LAST_WORD_MASK(NR_CPUS) diff --git a/include/linux/cryptouser.h b/include/linux/cryptouser.h index 532fb58f16b..4abf2ea6a88 100644 --- a/include/linux/cryptouser.h +++ b/include/linux/cryptouser.h @@ -100,3 +100,6 @@ struct crypto_report_rng {  	char type[CRYPTO_MAX_NAME];  	unsigned int seedsize;  }; + +#define CRYPTO_REPORT_MAXSIZE (sizeof(struct crypto_user_alg) + \ +			       sizeof(struct crypto_report_blkcipher)) diff --git a/include/linux/dma-attrs.h b/include/linux/dma-attrs.h index 71ad34eca6e..547ab568d3a 100644 --- a/include/linux/dma-attrs.h +++ b/include/linux/dma-attrs.h @@ -13,6 +13,8 @@  enum dma_attr {  	DMA_ATTR_WRITE_BARRIER,  	DMA_ATTR_WEAK_ORDERING, +	DMA_ATTR_WRITE_COMBINE, +	DMA_ATTR_NON_CONSISTENT,  	DMA_ATTR_MAX,  }; diff --git a/include/linux/dma-mapping.h b/include/linux/dma-mapping.h index 5a736af3cc7..dfc099e56a6 100644 --- a/include/linux/dma-mapping.h +++ b/include/linux/dma-mapping.h @@ -9,10 +9,15 @@  #include <linux/scatterlist.h>  struct dma_map_ops { -	void* (*alloc_coherent)(struct device *dev, size_t size, -				dma_addr_t *dma_handle, gfp_t gfp); -	void (*free_coherent)(struct device *dev, size_t size, -			      void *vaddr, dma_addr_t dma_handle); +	void* (*alloc)(struct device *dev, size_t size, +				dma_addr_t *dma_handle, gfp_t gfp, +				struct dma_attrs *attrs); +	void (*free)(struct device *dev, size_t size, +			      void *vaddr, dma_addr_t dma_handle, +			      struct dma_attrs *attrs); +	int (*mmap)(struct device *, struct vm_area_struct *, +			  void *, dma_addr_t, size_t, struct dma_attrs *attrs); +  	dma_addr_t (*map_page)(struct device *dev, struct page *page,  			       unsigned long offset, size_t size,  			       enum dma_data_direction dir, diff --git a/include/linux/dmaengine.h b/include/linux/dmaengine.h index 676f967390a..f9a2e5e67a5 100644 --- a/include/linux/dmaengine.h +++ b/include/linux/dmaengine.h @@ -974,6 +974,7 @@ int dma_async_device_register(struct dma_device *device);  void dma_async_device_unregister(struct dma_device *device);  void dma_run_dependencies(struct dma_async_tx_descriptor *tx);  struct dma_chan *dma_find_channel(enum dma_transaction_type tx_type); +struct dma_chan *net_dma_find_channel(void);  #define dma_request_channel(mask, x, y) __dma_request_channel(&(mask), x, y)  /* --- Helper iov-locking functions --- */ diff --git a/include/linux/efi.h b/include/linux/efi.h index 88ec80670d5..ec45ccd8708 100644 --- a/include/linux/efi.h +++ b/include/linux/efi.h @@ -554,7 +554,18 @@ extern int __init efi_setup_pcdp_console(char *);  #define EFI_VARIABLE_NON_VOLATILE       0x0000000000000001  #define EFI_VARIABLE_BOOTSERVICE_ACCESS 0x0000000000000002  #define EFI_VARIABLE_RUNTIME_ACCESS     0x0000000000000004 +#define EFI_VARIABLE_HARDWARE_ERROR_RECORD 0x0000000000000008 +#define EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS 0x0000000000000010 +#define EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS 0x0000000000000020 +#define EFI_VARIABLE_APPEND_WRITE	0x0000000000000040 +#define EFI_VARIABLE_MASK 	(EFI_VARIABLE_NON_VOLATILE | \ +				EFI_VARIABLE_BOOTSERVICE_ACCESS | \ +				EFI_VARIABLE_RUNTIME_ACCESS | \ +				EFI_VARIABLE_HARDWARE_ERROR_RECORD | \ +				EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS | \ +				EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS | \ +				EFI_VARIABLE_APPEND_WRITE)  /*   * The type of search to perform when calling boottime->locate_handle   */ diff --git a/include/linux/etherdevice.h b/include/linux/etherdevice.h index 8a1835855fa..fe5136d8145 100644 --- a/include/linux/etherdevice.h +++ b/include/linux/etherdevice.h @@ -159,7 +159,8 @@ static inline void eth_hw_addr_random(struct net_device *dev)   * @addr1: Pointer to a six-byte array containing the Ethernet address   * @addr2: Pointer other six-byte array containing the Ethernet address   * - * Compare two ethernet addresses, returns 0 if equal + * Compare two ethernet addresses, returns 0 if equal, non-zero otherwise. + * Unlike memcmp(), it doesn't return a value suitable for sorting.   */  static inline unsigned compare_ether_addr(const u8 *addr1, const u8 *addr2)  { @@ -184,10 +185,10 @@ static inline unsigned long zap_last_2bytes(unsigned long value)   * @addr1: Pointer to an array of 8 bytes   * @addr2: Pointer to an other array of 8 bytes   * - * Compare two ethernet addresses, returns 0 if equal. - * Same result than "memcmp(addr1, addr2, ETH_ALEN)" but without conditional - * branches, and possibly long word memory accesses on CPU allowing cheap - * unaligned memory reads. + * Compare two ethernet addresses, returns 0 if equal, non-zero otherwise. + * Unlike memcmp(), it doesn't return a value suitable for sorting. + * The function doesn't need any conditional branches and possibly uses + * word memory accesses on CPU allowing cheap unaligned memory reads.   * arrays = { byte1, byte2, byte3, byte4, byte6, byte7, pad1, pad2}   *   * Please note that alignment of addr1 & addr2 is only guaranted to be 16 bits. diff --git a/include/linux/ethtool.h b/include/linux/ethtool.h index e1d9e0ede30..f5647b59a90 100644 --- a/include/linux/ethtool.h +++ b/include/linux/ethtool.h @@ -896,8 +896,7 @@ static inline u32 ethtool_rxfh_indir_default(u32 index, u32 n_rx_rings)   *   * All operations are optional (i.e. the function pointer may be set   * to %NULL) and callers must take this into account.  Callers must - * hold the RTNL, except that for @get_drvinfo the caller may or may - * not hold the RTNL. + * hold the RTNL lock.   *   * See the structures used by these operations for further documentation.   * diff --git a/include/linux/firewire.h b/include/linux/firewire.h index 4db7b68f058..cdc9b719e9c 100644 --- a/include/linux/firewire.h +++ b/include/linux/firewire.h @@ -2,6 +2,7 @@  #define _LINUX_FIREWIRE_H  #include <linux/completion.h> +#include <linux/device.h>  #include <linux/dma-mapping.h>  #include <linux/kernel.h>  #include <linux/kref.h> @@ -64,8 +65,6 @@  #define CSR_MODEL		0x17  #define CSR_DIRECTORY_ID	0x20 -struct device; -  struct fw_csr_iterator {  	const u32 *p;  	const u32 *end; diff --git a/include/linux/fs.h b/include/linux/fs.h index 135693e79f2..8de675523e4 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -1215,6 +1215,7 @@ extern int vfs_setlease(struct file *, long, struct file_lock **);  extern int lease_modify(struct file_lock **, int);  extern int lock_may_read(struct inode *, loff_t start, unsigned long count);  extern int lock_may_write(struct inode *, loff_t start, unsigned long count); +extern void locks_delete_block(struct file_lock *waiter);  extern void lock_flocks(void);  extern void unlock_flocks(void);  #else /* !CONFIG_FILE_LOCKING */ @@ -1359,6 +1360,10 @@ static inline int lock_may_write(struct inode *inode, loff_t start,  	return 1;  } +static inline void locks_delete_block(struct file_lock *waiter) +{ +} +  static inline void lock_flocks(void)  {  } @@ -2506,6 +2511,7 @@ extern int dcache_readdir(struct file *, void *, filldir_t);  extern int simple_setattr(struct dentry *, struct iattr *);  extern int simple_getattr(struct vfsmount *, struct dentry *, struct kstat *);  extern int simple_statfs(struct dentry *, struct kstatfs *); +extern int simple_open(struct inode *inode, struct file *file);  extern int simple_link(struct dentry *, struct inode *, struct dentry *);  extern int simple_unlink(struct inode *, struct dentry *);  extern int simple_rmdir(struct inode *, struct dentry *); diff --git a/include/linux/fuse.h b/include/linux/fuse.h index 8ba2c9460b2..8f2ab8fef92 100644 --- a/include/linux/fuse.h +++ b/include/linux/fuse.h @@ -593,7 +593,7 @@ struct fuse_dirent {  	__u64	off;  	__u32	namelen;  	__u32	type; -	char name[0]; +	char name[];  };  #define FUSE_NAME_OFFSET offsetof(struct fuse_dirent, name) diff --git a/include/linux/gpio-pxa.h b/include/linux/gpio-pxa.h index 05071ee34c3..d755b28ba63 100644 --- a/include/linux/gpio-pxa.h +++ b/include/linux/gpio-pxa.h @@ -13,4 +13,8 @@ extern int pxa_last_gpio;  extern int pxa_irq_to_gpio(int irq); +struct pxa_gpio_platform_data { +	int (*gpio_set_wake)(unsigned int gpio, unsigned int on); +}; +  #endif /* __GPIO_PXA_H */ diff --git a/include/linux/hsi/Kbuild b/include/linux/hsi/Kbuild new file mode 100644 index 00000000000..271a770b478 --- /dev/null +++ b/include/linux/hsi/Kbuild @@ -0,0 +1 @@ +header-y += hsi_char.h diff --git a/include/linux/hsi/hsi.h b/include/linux/hsi/hsi.h new file mode 100644 index 00000000000..56fae865e27 --- /dev/null +++ b/include/linux/hsi/hsi.h @@ -0,0 +1,413 @@ +/* + * HSI core header file. + * + * Copyright (C) 2010 Nokia Corporation. All rights reserved. + * + * Contact: Carlos Chinea <carlos.chinea@nokia.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. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + */ + +#ifndef __LINUX_HSI_H__ +#define __LINUX_HSI_H__ + +#include <linux/device.h> +#include <linux/mutex.h> +#include <linux/scatterlist.h> +#include <linux/list.h> +#include <linux/module.h> +#include <linux/notifier.h> + +/* HSI message ttype */ +#define HSI_MSG_READ	0 +#define HSI_MSG_WRITE	1 + +/* HSI configuration values */ +enum { +	HSI_MODE_STREAM	= 1, +	HSI_MODE_FRAME, +}; + +enum { +	HSI_FLOW_SYNC,	/* Synchronized flow */ +	HSI_FLOW_PIPE,	/* Pipelined flow */ +}; + +enum { +	HSI_ARB_RR,	/* Round-robin arbitration */ +	HSI_ARB_PRIO,	/* Channel priority arbitration */ +}; + +#define HSI_MAX_CHANNELS	16 + +/* HSI message status codes */ +enum { +	HSI_STATUS_COMPLETED,	/* Message transfer is completed */ +	HSI_STATUS_PENDING,	/* Message pending to be read/write (POLL) */ +	HSI_STATUS_PROCEEDING,	/* Message transfer is ongoing */ +	HSI_STATUS_QUEUED,	/* Message waiting to be served */ +	HSI_STATUS_ERROR,	/* Error when message transfer was ongoing */ +}; + +/* HSI port event codes */ +enum { +	HSI_EVENT_START_RX, +	HSI_EVENT_STOP_RX, +}; + +/** + * struct hsi_config - Configuration for RX/TX HSI modules + * @mode: Bit transmission mode (STREAM or FRAME) + * @channels: Number of channels to use [1..16] + * @speed: Max bit transmission speed (Kbit/s) + * @flow: RX flow type (SYNCHRONIZED or PIPELINE) + * @arb_mode: Arbitration mode for TX frame (Round robin, priority) + */ +struct hsi_config { +	unsigned int	mode; +	unsigned int	channels; +	unsigned int	speed; +	union { +		unsigned int	flow;		/* RX only */ +		unsigned int	arb_mode;	/* TX only */ +	}; +}; + +/** + * struct hsi_board_info - HSI client board info + * @name: Name for the HSI device + * @hsi_id: HSI controller id where the client sits + * @port: Port number in the controller where the client sits + * @tx_cfg: HSI TX configuration + * @rx_cfg: HSI RX configuration + * @platform_data: Platform related data + * @archdata: Architecture-dependent device data + */ +struct hsi_board_info { +	const char		*name; +	unsigned int		hsi_id; +	unsigned int		port; +	struct hsi_config	tx_cfg; +	struct hsi_config	rx_cfg; +	void			*platform_data; +	struct dev_archdata	*archdata; +}; + +#ifdef CONFIG_HSI_BOARDINFO +extern int hsi_register_board_info(struct hsi_board_info const *info, +							unsigned int len); +#else +static inline int hsi_register_board_info(struct hsi_board_info const *info, +							unsigned int len) +{ +	return 0; +} +#endif /* CONFIG_HSI_BOARDINFO */ + +/** + * struct hsi_client - HSI client attached to an HSI port + * @device: Driver model representation of the device + * @tx_cfg: HSI TX configuration + * @rx_cfg: HSI RX configuration + * @e_handler: Callback for handling port events (RX Wake High/Low) + * @pclaimed: Keeps tracks if the clients claimed its associated HSI port + * @nb: Notifier block for port events + */ +struct hsi_client { +	struct device		device; +	struct hsi_config	tx_cfg; +	struct hsi_config	rx_cfg; +	/* private: */ +	void			(*ehandler)(struct hsi_client *, unsigned long); +	unsigned int		pclaimed:1; +	struct notifier_block	nb; +}; + +#define to_hsi_client(dev) container_of(dev, struct hsi_client, device) + +static inline void hsi_client_set_drvdata(struct hsi_client *cl, void *data) +{ +	dev_set_drvdata(&cl->device, data); +} + +static inline void *hsi_client_drvdata(struct hsi_client *cl) +{ +	return dev_get_drvdata(&cl->device); +} + +int hsi_register_port_event(struct hsi_client *cl, +			void (*handler)(struct hsi_client *, unsigned long)); +int hsi_unregister_port_event(struct hsi_client *cl); + +/** + * struct hsi_client_driver - Driver associated to an HSI client + * @driver: Driver model representation of the driver + */ +struct hsi_client_driver { +	struct device_driver	driver; +}; + +#define to_hsi_client_driver(drv) container_of(drv, struct hsi_client_driver,\ +									driver) + +int hsi_register_client_driver(struct hsi_client_driver *drv); + +static inline void hsi_unregister_client_driver(struct hsi_client_driver *drv) +{ +	driver_unregister(&drv->driver); +} + +/** + * struct hsi_msg - HSI message descriptor + * @link: Free to use by the current descriptor owner + * @cl: HSI device client that issues the transfer + * @sgt: Head of the scatterlist array + * @context: Client context data associated to the transfer + * @complete: Transfer completion callback + * @destructor: Destructor to free resources when flushing + * @status: Status of the transfer when completed + * @actual_len: Actual length of data transfered on completion + * @channel: Channel were to TX/RX the message + * @ttype: Transfer type (TX if set, RX otherwise) + * @break_frame: if true HSI will send/receive a break frame. Data buffers are + *		ignored in the request. + */ +struct hsi_msg { +	struct list_head	link; +	struct hsi_client	*cl; +	struct sg_table		sgt; +	void			*context; + +	void			(*complete)(struct hsi_msg *msg); +	void			(*destructor)(struct hsi_msg *msg); + +	int			status; +	unsigned int		actual_len; +	unsigned int		channel; +	unsigned int		ttype:1; +	unsigned int		break_frame:1; +}; + +struct hsi_msg *hsi_alloc_msg(unsigned int n_frag, gfp_t flags); +void hsi_free_msg(struct hsi_msg *msg); + +/** + * struct hsi_port - HSI port device + * @device: Driver model representation of the device + * @tx_cfg: Current TX path configuration + * @rx_cfg: Current RX path configuration + * @num: Port number + * @shared: Set when port can be shared by different clients + * @claimed: Reference count of clients which claimed the port + * @lock: Serialize port claim + * @async: Asynchronous transfer callback + * @setup: Callback to set the HSI client configuration + * @flush: Callback to clean the HW state and destroy all pending transfers + * @start_tx: Callback to inform that a client wants to TX data + * @stop_tx: Callback to inform that a client no longer wishes to TX data + * @release: Callback to inform that a client no longer uses the port + * @n_head: Notifier chain for signaling port events to the clients. + */ +struct hsi_port { +	struct device			device; +	struct hsi_config		tx_cfg; +	struct hsi_config		rx_cfg; +	unsigned int			num; +	unsigned int			shared:1; +	int				claimed; +	struct mutex			lock; +	int				(*async)(struct hsi_msg *msg); +	int				(*setup)(struct hsi_client *cl); +	int				(*flush)(struct hsi_client *cl); +	int				(*start_tx)(struct hsi_client *cl); +	int				(*stop_tx)(struct hsi_client *cl); +	int				(*release)(struct hsi_client *cl); +	/* private */ +	struct atomic_notifier_head	n_head; +}; + +#define to_hsi_port(dev) container_of(dev, struct hsi_port, device) +#define hsi_get_port(cl) to_hsi_port((cl)->device.parent) + +int hsi_event(struct hsi_port *port, unsigned long event); +int hsi_claim_port(struct hsi_client *cl, unsigned int share); +void hsi_release_port(struct hsi_client *cl); + +static inline int hsi_port_claimed(struct hsi_client *cl) +{ +	return cl->pclaimed; +} + +static inline void hsi_port_set_drvdata(struct hsi_port *port, void *data) +{ +	dev_set_drvdata(&port->device, data); +} + +static inline void *hsi_port_drvdata(struct hsi_port *port) +{ +	return dev_get_drvdata(&port->device); +} + +/** + * struct hsi_controller - HSI controller device + * @device: Driver model representation of the device + * @owner: Pointer to the module owning the controller + * @id: HSI controller ID + * @num_ports: Number of ports in the HSI controller + * @port: Array of HSI ports + */ +struct hsi_controller { +	struct device		device; +	struct module		*owner; +	unsigned int		id; +	unsigned int		num_ports; +	struct hsi_port		**port; +}; + +#define to_hsi_controller(dev) container_of(dev, struct hsi_controller, device) + +struct hsi_controller *hsi_alloc_controller(unsigned int n_ports, gfp_t flags); +void hsi_put_controller(struct hsi_controller *hsi); +int hsi_register_controller(struct hsi_controller *hsi); +void hsi_unregister_controller(struct hsi_controller *hsi); + +static inline void hsi_controller_set_drvdata(struct hsi_controller *hsi, +								void *data) +{ +	dev_set_drvdata(&hsi->device, data); +} + +static inline void *hsi_controller_drvdata(struct hsi_controller *hsi) +{ +	return dev_get_drvdata(&hsi->device); +} + +static inline struct hsi_port *hsi_find_port_num(struct hsi_controller *hsi, +							unsigned int num) +{ +	return (num < hsi->num_ports) ? hsi->port[num] : NULL; +} + +/* + * API for HSI clients + */ +int hsi_async(struct hsi_client *cl, struct hsi_msg *msg); + +/** + * hsi_id - Get HSI controller ID associated to a client + * @cl: Pointer to a HSI client + * + * Return the controller id where the client is attached to + */ +static inline unsigned int hsi_id(struct hsi_client *cl) +{ +	return	to_hsi_controller(cl->device.parent->parent)->id; +} + +/** + * hsi_port_id - Gets the port number a client is attached to + * @cl: Pointer to HSI client + * + * Return the port number associated to the client + */ +static inline unsigned int hsi_port_id(struct hsi_client *cl) +{ +	return	to_hsi_port(cl->device.parent)->num; +} + +/** + * hsi_setup - Configure the client's port + * @cl: Pointer to the HSI client + * + * When sharing ports, clients should either relay on a single + * client setup or have the same setup for all of them. + * + * Return -errno on failure, 0 on success + */ +static inline int hsi_setup(struct hsi_client *cl) +{ +	if (!hsi_port_claimed(cl)) +		return -EACCES; +	return	hsi_get_port(cl)->setup(cl); +} + +/** + * hsi_flush - Flush all pending transactions on the client's port + * @cl: Pointer to the HSI client + * + * This function will destroy all pending hsi_msg in the port and reset + * the HW port so it is ready to receive and transmit from a clean state. + * + * Return -errno on failure, 0 on success + */ +static inline int hsi_flush(struct hsi_client *cl) +{ +	if (!hsi_port_claimed(cl)) +		return -EACCES; +	return hsi_get_port(cl)->flush(cl); +} + +/** + * hsi_async_read - Submit a read transfer + * @cl: Pointer to the HSI client + * @msg: HSI message descriptor of the transfer + * + * Return -errno on failure, 0 on success + */ +static inline int hsi_async_read(struct hsi_client *cl, struct hsi_msg *msg) +{ +	msg->ttype = HSI_MSG_READ; +	return hsi_async(cl, msg); +} + +/** + * hsi_async_write - Submit a write transfer + * @cl: Pointer to the HSI client + * @msg: HSI message descriptor of the transfer + * + * Return -errno on failure, 0 on success + */ +static inline int hsi_async_write(struct hsi_client *cl, struct hsi_msg *msg) +{ +	msg->ttype = HSI_MSG_WRITE; +	return hsi_async(cl, msg); +} + +/** + * hsi_start_tx - Signal the port that the client wants to start a TX + * @cl: Pointer to the HSI client + * + * Return -errno on failure, 0 on success + */ +static inline int hsi_start_tx(struct hsi_client *cl) +{ +	if (!hsi_port_claimed(cl)) +		return -EACCES; +	return hsi_get_port(cl)->start_tx(cl); +} + +/** + * hsi_stop_tx - Signal the port that the client no longer wants to transmit + * @cl: Pointer to the HSI client + * + * Return -errno on failure, 0 on success + */ +static inline int hsi_stop_tx(struct hsi_client *cl) +{ +	if (!hsi_port_claimed(cl)) +		return -EACCES; +	return hsi_get_port(cl)->stop_tx(cl); +} +#endif /* __LINUX_HSI_H__ */ diff --git a/include/linux/hsi/hsi_char.h b/include/linux/hsi/hsi_char.h new file mode 100644 index 00000000000..76160b4f455 --- /dev/null +++ b/include/linux/hsi/hsi_char.h @@ -0,0 +1,63 @@ +/* + * Part of the HSI character device driver. + * + * Copyright (C) 2010 Nokia Corporation. All rights reserved. + * + * Contact: Andras Domokos <andras.domokos at nokia.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. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + */ + + +#ifndef __HSI_CHAR_H +#define __HSI_CHAR_H + +#define HSI_CHAR_MAGIC		'k' +#define HSC_IOW(num, dtype)	_IOW(HSI_CHAR_MAGIC, num, dtype) +#define HSC_IOR(num, dtype)	_IOR(HSI_CHAR_MAGIC, num, dtype) +#define HSC_IOWR(num, dtype)	_IOWR(HSI_CHAR_MAGIC, num, dtype) +#define HSC_IO(num)		_IO(HSI_CHAR_MAGIC, num) + +#define HSC_RESET		HSC_IO(16) +#define HSC_SET_PM		HSC_IO(17) +#define HSC_SEND_BREAK		HSC_IO(18) +#define HSC_SET_RX		HSC_IOW(19, struct hsc_rx_config) +#define HSC_GET_RX		HSC_IOW(20, struct hsc_rx_config) +#define HSC_SET_TX		HSC_IOW(21, struct hsc_tx_config) +#define HSC_GET_TX		HSC_IOW(22, struct hsc_tx_config) + +#define HSC_PM_DISABLE		0 +#define HSC_PM_ENABLE		1 + +#define HSC_MODE_STREAM		1 +#define HSC_MODE_FRAME		2 +#define HSC_FLOW_SYNC		0 +#define HSC_ARB_RR		0 +#define HSC_ARB_PRIO		1 + +struct hsc_rx_config { +	uint32_t mode; +	uint32_t flow; +	uint32_t channels; +}; + +struct hsc_tx_config { +	uint32_t mode; +	uint32_t channels; +	uint32_t speed; +	uint32_t arb_mode; +}; + +#endif /* __HSI_CHAR_H */ diff --git a/include/linux/i2c/twl.h b/include/linux/i2c/twl.h index 2463b610033..1f90de0cfdb 100644 --- a/include/linux/i2c/twl.h +++ b/include/linux/i2c/twl.h @@ -666,23 +666,11 @@ struct twl4030_codec_data {  	unsigned int check_defaults:1;  	unsigned int reset_registers:1;  	unsigned int hs_extmute:1; -	u16 hs_left_step; -	u16 hs_right_step; -	u16 hf_left_step; -	u16 hf_right_step;  	void (*set_hs_extmute)(int mute);  };  struct twl4030_vibra_data {  	unsigned int	coexist; - -	/* twl6040 */ -	unsigned int vibldrv_res;	/* left driver resistance */ -	unsigned int vibrdrv_res;	/* right driver resistance */ -	unsigned int viblmotor_res;	/* left motor resistance */ -	unsigned int vibrmotor_res;	/* right motor resistance */ -	int vddvibl_uV;			/* VDDVIBL volt, set 0 for fixed reg */ -	int vddvibr_uV;			/* VDDVIBR volt, set 0 for fixed reg */  };  struct twl4030_audio_data { diff --git a/include/linux/if_eql.h b/include/linux/if_eql.h index 79c4f268410..18a5d02a864 100644 --- a/include/linux/if_eql.h +++ b/include/linux/if_eql.h @@ -22,7 +22,7 @@  #define EQL_DEFAULT_SLAVE_PRIORITY 28800  #define EQL_DEFAULT_MAX_SLAVES     4  #define EQL_DEFAULT_MTU            576 -#define EQL_DEFAULT_RESCHED_IVAL   100 +#define EQL_DEFAULT_RESCHED_IVAL   HZ  #define EQL_ENSLAVE     (SIOCDEVPRIVATE)  #define EQL_EMANCIPATE  (SIOCDEVPRIVATE + 1) diff --git a/include/linux/irq.h b/include/linux/irq.h index bff29c58da2..b27cfcfd3a5 100644 --- a/include/linux/irq.h +++ b/include/linux/irq.h @@ -49,6 +49,12 @@ typedef	void (*irq_preflow_handler_t)(struct irq_data *data);   * IRQ_TYPE_LEVEL_LOW		- low level triggered   * IRQ_TYPE_LEVEL_MASK		- Mask to filter out the level bits   * IRQ_TYPE_SENSE_MASK		- Mask for all the above bits + * IRQ_TYPE_DEFAULT		- For use by some PICs to ask irq_set_type + *				  to setup the HW to a sane default (used + *                                by irqdomain map() callbacks to synchronize + *                                the HW state and SW flags for a newly + *                                allocated descriptor). + *   * IRQ_TYPE_PROBE		- Special flag for probing in progress   *   * Bits which can be modified via irq_set/clear/modify_status_flags() @@ -77,6 +83,7 @@ enum {  	IRQ_TYPE_LEVEL_LOW	= 0x00000008,  	IRQ_TYPE_LEVEL_MASK	= (IRQ_TYPE_LEVEL_LOW | IRQ_TYPE_LEVEL_HIGH),  	IRQ_TYPE_SENSE_MASK	= 0x0000000f, +	IRQ_TYPE_DEFAULT	= IRQ_TYPE_SENSE_MASK,  	IRQ_TYPE_PROBE		= 0x00000010, @@ -263,6 +270,11 @@ static inline void irqd_clr_chained_irq_inprogress(struct irq_data *d)  	d->state_use_accessors &= ~IRQD_IRQ_INPROGRESS;  } +static inline irq_hw_number_t irqd_to_hwirq(struct irq_data *d) +{ +	return d->hwirq; +} +  /**   * struct irq_chip - hardware interrupt chip descriptor   * diff --git a/include/linux/irqdomain.h b/include/linux/irqdomain.h index ead4a421579..c65740d76e6 100644 --- a/include/linux/irqdomain.h +++ b/include/linux/irqdomain.h @@ -42,12 +42,6 @@ struct of_device_id;  /* Number of irqs reserved for a legacy isa controller */  #define NUM_ISA_INTERRUPTS	16 -/* This type is the placeholder for a hardware interrupt number. It has to - * be big enough to enclose whatever representation is used by a given - * platform. - */ -typedef unsigned long irq_hw_number_t; -  /**   * struct irq_domain_ops - Methods for irq_domain objects   * @match: Match an interrupt controller device node to a host, returns @@ -104,6 +98,9 @@ struct irq_domain {  			unsigned int size;  			unsigned int *revmap;  		} linear; +		struct { +			unsigned int max_irq; +		} nomap;  		struct radix_tree_root tree;  	} revmap_data;  	const struct irq_domain_ops *ops; @@ -126,6 +123,7 @@ struct irq_domain *irq_domain_add_linear(struct device_node *of_node,  					 const struct irq_domain_ops *ops,  					 void *host_data);  struct irq_domain *irq_domain_add_nomap(struct device_node *of_node, +					 unsigned int max_irq,  					 const struct irq_domain_ops *ops,  					 void *host_data);  struct irq_domain *irq_domain_add_tree(struct device_node *of_node, @@ -134,7 +132,6 @@ struct irq_domain *irq_domain_add_tree(struct device_node *of_node,  extern struct irq_domain *irq_find_host(struct device_node *node);  extern void irq_set_default_host(struct irq_domain *host); -extern void irq_set_virq_count(unsigned int count);  static inline struct irq_domain *irq_domain_add_legacy_isa(  				struct device_node *of_node, @@ -146,7 +143,6 @@ static inline struct irq_domain *irq_domain_add_legacy_isa(  }  extern struct irq_domain *irq_find_host(struct device_node *node);  extern void irq_set_default_host(struct irq_domain *host); -extern void irq_set_virq_count(unsigned int count);  extern unsigned int irq_create_mapping(struct irq_domain *host, diff --git a/include/linux/kconfig.h b/include/linux/kconfig.h index 067eda0e4b3..be342b94c64 100644 --- a/include/linux/kconfig.h +++ b/include/linux/kconfig.h @@ -4,29 +4,43 @@  #include <generated/autoconf.h>  /* - * Helper macros to use CONFIG_ options in C expressions. Note that + * Helper macros to use CONFIG_ options in C/CPP expressions. Note that   * these only work with boolean and tristate options.   */  /* + * Getting something that works in C and CPP for an arg that may or may + * not be defined is tricky.  Here, if we have "#define CONFIG_BOOGER 1" + * we match on the placeholder define, insert the "0," for arg1 and generate + * the triplet (0, 1, 0).  Then the last step cherry picks the 2nd arg (a one). + * When CONFIG_BOOGER is not defined, we generate a (... 1, 0) pair, and when + * the last step cherry picks the 2nd arg, we get a zero. + */ +#define __ARG_PLACEHOLDER_1 0, +#define config_enabled(cfg) _config_enabled(cfg) +#define _config_enabled(value) __config_enabled(__ARG_PLACEHOLDER_##value) +#define __config_enabled(arg1_or_junk) ___config_enabled(arg1_or_junk 1, 0) +#define ___config_enabled(__ignored, val, ...) val + +/*   * IS_ENABLED(CONFIG_FOO) evaluates to 1 if CONFIG_FOO is set to 'y' or 'm',   * 0 otherwise.   *   */  #define IS_ENABLED(option) \ -	(__enabled_ ## option || __enabled_ ## option ## _MODULE) +	(config_enabled(option) || config_enabled(option##_MODULE))  /*   * IS_BUILTIN(CONFIG_FOO) evaluates to 1 if CONFIG_FOO is set to 'y', 0   * otherwise. For boolean options, this is equivalent to   * IS_ENABLED(CONFIG_FOO).   */ -#define IS_BUILTIN(option) __enabled_ ## option +#define IS_BUILTIN(option) config_enabled(option)  /*   * IS_MODULE(CONFIG_FOO) evaluates to 1 if CONFIG_FOO is set to 'm', 0   * otherwise.   */ -#define IS_MODULE(option) __enabled_ ## option ## _MODULE +#define IS_MODULE(option) config_enabled(option##_MODULE)  #endif /* __LINUX_KCONFIG_H */ diff --git a/include/linux/kgdb.h b/include/linux/kgdb.h index fa391835508..c4d2fc194ed 100644 --- a/include/linux/kgdb.h +++ b/include/linux/kgdb.h @@ -63,7 +63,8 @@ enum kgdb_bptype {  	BP_HARDWARE_BREAKPOINT,  	BP_WRITE_WATCHPOINT,  	BP_READ_WATCHPOINT, -	BP_ACCESS_WATCHPOINT +	BP_ACCESS_WATCHPOINT, +	BP_POKE_BREAKPOINT,  };  enum kgdb_bpstate { @@ -207,8 +208,8 @@ extern void kgdb_arch_set_pc(struct pt_regs *regs, unsigned long pc);  /* Optional functions. */  extern int kgdb_validate_break_address(unsigned long addr); -extern int kgdb_arch_set_breakpoint(unsigned long addr, char *saved_instr); -extern int kgdb_arch_remove_breakpoint(unsigned long addr, char *bundle); +extern int kgdb_arch_set_breakpoint(struct kgdb_bkpt *bpt); +extern int kgdb_arch_remove_breakpoint(struct kgdb_bkpt *bpt);  /**   *	kgdb_arch_late - Perform any architecture specific initalization. diff --git a/include/linux/kmod.h b/include/linux/kmod.h index 9efeae67910..dd99c329e16 100644 --- a/include/linux/kmod.h +++ b/include/linux/kmod.h @@ -110,12 +110,29 @@ call_usermodehelper(char *path, char **argv, char **envp, int wait)  extern struct ctl_table usermodehelper_table[]; +enum umh_disable_depth { +	UMH_ENABLED = 0, +	UMH_FREEZING, +	UMH_DISABLED, +}; +  extern void usermodehelper_init(void); -extern int usermodehelper_disable(void); -extern void usermodehelper_enable(void); -extern bool usermodehelper_is_disabled(void); -extern void read_lock_usermodehelper(void); -extern void read_unlock_usermodehelper(void); +extern int __usermodehelper_disable(enum umh_disable_depth depth); +extern void __usermodehelper_set_disable_depth(enum umh_disable_depth depth); + +static inline int usermodehelper_disable(void) +{ +	return __usermodehelper_disable(UMH_DISABLED); +} + +static inline void usermodehelper_enable(void) +{ +	__usermodehelper_set_disable_depth(UMH_ENABLED); +} + +extern int usermodehelper_read_trylock(void); +extern long usermodehelper_read_lock_wait(long timeout); +extern void usermodehelper_read_unlock(void);  #endif /* __LINUX_KMOD_H__ */ diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index 665a260c7e0..72cbf08d45f 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -596,6 +596,7 @@ void kvm_free_irq_source_id(struct kvm *kvm, int irq_source_id);  #ifdef CONFIG_IOMMU_API  int kvm_iommu_map_pages(struct kvm *kvm, struct kvm_memory_slot *slot); +void kvm_iommu_unmap_pages(struct kvm *kvm, struct kvm_memory_slot *slot);  int kvm_iommu_map_guest(struct kvm *kvm);  int kvm_iommu_unmap_guest(struct kvm *kvm);  int kvm_assign_device(struct kvm *kvm, @@ -609,6 +610,11 @@ static inline int kvm_iommu_map_pages(struct kvm *kvm,  	return 0;  } +static inline void kvm_iommu_unmap_pages(struct kvm *kvm, +					 struct kvm_memory_slot *slot) +{ +} +  static inline int kvm_iommu_map_guest(struct kvm *kvm)  {  	return -ENODEV; diff --git a/include/linux/libata.h b/include/linux/libata.h index 42378d637ff..e926df7b54c 100644 --- a/include/linux/libata.h +++ b/include/linux/libata.h @@ -996,7 +996,8 @@ extern int ata_sas_scsi_ioctl(struct ata_port *ap, struct scsi_device *dev,  extern void ata_sas_port_destroy(struct ata_port *);  extern struct ata_port *ata_sas_port_alloc(struct ata_host *,  					   struct ata_port_info *, struct Scsi_Host *); -extern int ata_sas_async_port_init(struct ata_port *); +extern void ata_sas_async_probe(struct ata_port *ap); +extern int ata_sas_sync_probe(struct ata_port *ap);  extern int ata_sas_port_init(struct ata_port *);  extern int ata_sas_port_start(struct ata_port *ap);  extern void ata_sas_port_stop(struct ata_port *ap); diff --git a/include/linux/lsm_audit.h b/include/linux/lsm_audit.h index eab507f2b1c..fad48aab893 100644 --- a/include/linux/lsm_audit.h +++ b/include/linux/lsm_audit.h @@ -22,6 +22,23 @@  #include <linux/key.h>  #include <linux/skbuff.h> +struct lsm_network_audit { +	int netif; +	struct sock *sk; +	u16 family; +	__be16 dport; +	__be16 sport; +	union { +		struct { +			__be32 daddr; +			__be32 saddr; +		} v4; +		struct { +			struct in6_addr daddr; +			struct in6_addr saddr; +		} v6; +	} fam; +};  /* Auxiliary data to use in generating the audit record. */  struct common_audit_data { @@ -41,23 +58,7 @@ struct common_audit_data {  		struct path path;  		struct dentry *dentry;  		struct inode *inode; -		struct { -			int netif; -			struct sock *sk; -			u16 family; -			__be16 dport; -			__be16 sport; -			union { -				struct { -					__be32 daddr; -					__be32 saddr; -				} v4; -				struct { -					struct in6_addr daddr; -					struct in6_addr saddr; -				} v6; -			} fam; -		} net; +		struct lsm_network_audit *net;  		int cap;  		int ipc_id;  		struct task_struct *tsk; @@ -72,64 +73,15 @@ struct common_audit_data {  	/* this union contains LSM specific data */  	union {  #ifdef CONFIG_SECURITY_SMACK -		/* SMACK data */ -		struct smack_audit_data { -			const char *function; -			char *subject; -			char *object; -			char *request; -			int result; -		} smack_audit_data; +		struct smack_audit_data *smack_audit_data;  #endif  #ifdef CONFIG_SECURITY_SELINUX -		/* SELinux data */ -		struct { -			u32 ssid; -			u32 tsid; -			u16 tclass; -			u32 requested; -			u32 audited; -			u32 denied; -			/* -			 * auditdeny is a bit tricky and unintuitive.  See the -			 * comments in avc.c for it's meaning and usage. -			 */ -			u32 auditdeny; -			struct av_decision *avd; -			int result; -		} selinux_audit_data; +		struct selinux_audit_data *selinux_audit_data;  #endif  #ifdef CONFIG_SECURITY_APPARMOR -		struct { -			int error; -			int op; -			int type; -			void *profile; -			const char *name; -			const char *info; -			union { -				void *target; -				struct { -					long pos; -					void *target; -				} iface; -				struct { -					int rlim; -					unsigned long max; -				} rlim; -				struct { -					const char *target; -					u32 request; -					u32 denied; -					uid_t ouid; -				} fs; -			}; -		} apparmor_audit_data; +		struct apparmor_audit_data *apparmor_audit_data;  #endif -	}; -	/* these callback will be implemented by a specific LSM */ -	void (*lsm_pre_audit)(struct audit_buffer *, void *); -	void (*lsm_post_audit)(struct audit_buffer *, void *); +	}; /* per LSM data pointer union */  };  #define v4info fam.v4 @@ -146,6 +98,8 @@ int ipv6_skb_to_auditdata(struct sk_buff *skb,  	{ memset((_d), 0, sizeof(struct common_audit_data)); \  	 (_d)->type = LSM_AUDIT_DATA_##_t; } -void common_lsm_audit(struct common_audit_data *a); +void common_lsm_audit(struct common_audit_data *a, +	void (*pre_audit)(struct audit_buffer *, void *), +	void (*post_audit)(struct audit_buffer *, void *));  #endif diff --git a/include/linux/mfd/db5500-prcmu.h b/include/linux/mfd/db5500-prcmu.h index 9890687f582..5a049dfaf15 100644 --- a/include/linux/mfd/db5500-prcmu.h +++ b/include/linux/mfd/db5500-prcmu.h @@ -8,41 +8,14 @@  #ifndef __MFD_DB5500_PRCMU_H  #define __MFD_DB5500_PRCMU_H -#ifdef CONFIG_MFD_DB5500_PRCMU - -void db5500_prcmu_early_init(void); -int db5500_prcmu_set_epod(u16 epod_id, u8 epod_state); -int db5500_prcmu_set_display_clocks(void); -int db5500_prcmu_disable_dsipll(void); -int db5500_prcmu_enable_dsipll(void); -int db5500_prcmu_abb_read(u8 slave, u8 reg, u8 *value, u8 size); -int db5500_prcmu_abb_write(u8 slave, u8 reg, u8 *value, u8 size); -void db5500_prcmu_enable_wakeups(u32 wakeups); -int db5500_prcmu_request_clock(u8 clock, bool enable); -void db5500_prcmu_config_abb_event_readout(u32 abb_events); -void db5500_prcmu_get_abb_event_buffer(void __iomem **buf); -int prcmu_resetout(u8 resoutn, u8 state); -int db5500_prcmu_set_power_state(u8 state, bool keep_ulp_clk, -	bool keep_ap_pll); -int db5500_prcmu_config_esram0_deep_sleep(u8 state); -void db5500_prcmu_system_reset(u16 reset_code); -u16 db5500_prcmu_get_reset_code(void); -bool db5500_prcmu_is_ac_wake_requested(void); -int db5500_prcmu_set_arm_opp(u8 opp); -int db5500_prcmu_get_arm_opp(void); - -#else /* !CONFIG_UX500_SOC_DB5500 */ - -static inline void db5500_prcmu_early_init(void) {} - -static inline int db5500_prcmu_abb_read(u8 slave, u8 reg, u8 *value, u8 size) +static inline int prcmu_resetout(u8 resoutn, u8 state)  { -	return -ENOSYS; +	return 0;  } -static inline int db5500_prcmu_abb_write(u8 slave, u8 reg, u8 *value, u8 size) +static inline int db5500_prcmu_set_epod(u16 epod_id, u8 epod_state)  { -	return -ENOSYS; +	return 0;  }  static inline int db5500_prcmu_request_clock(u8 clock, bool enable) @@ -50,69 +23,82 @@ static inline int db5500_prcmu_request_clock(u8 clock, bool enable)  	return 0;  } -static inline int db5500_prcmu_set_display_clocks(void) +static inline int db5500_prcmu_set_power_state(u8 state, bool keep_ulp_clk, +	bool keep_ap_pll)  {  	return 0;  } -static inline int db5500_prcmu_disable_dsipll(void) +static inline int db5500_prcmu_config_esram0_deep_sleep(u8 state)  {  	return 0;  } -static inline int db5500_prcmu_enable_dsipll(void) +static inline u16 db5500_prcmu_get_reset_code(void)  {  	return 0;  } -static inline int db5500_prcmu_config_esram0_deep_sleep(u8 state) +static inline bool db5500_prcmu_is_ac_wake_requested(void)  {  	return 0;  } -static inline void db5500_prcmu_enable_wakeups(u32 wakeups) {} - -static inline int prcmu_resetout(u8 resoutn, u8 state) +static inline int db5500_prcmu_set_arm_opp(u8 opp)  {  	return 0;  } -static inline int db5500_prcmu_set_epod(u16 epod_id, u8 epod_state) +static inline int db5500_prcmu_get_arm_opp(void)  {  	return 0;  } -static inline void db5500_prcmu_get_abb_event_buffer(void __iomem **buf) {}  static inline void db5500_prcmu_config_abb_event_readout(u32 abb_events) {} -static inline int db5500_prcmu_set_power_state(u8 state, bool keep_ulp_clk, -	bool keep_ap_pll) -{ -	return 0; -} +static inline void db5500_prcmu_get_abb_event_buffer(void __iomem **buf) {}  static inline void db5500_prcmu_system_reset(u16 reset_code) {} -static inline u16 db5500_prcmu_get_reset_code(void) +static inline void db5500_prcmu_enable_wakeups(u32 wakeups) {} + +#ifdef CONFIG_MFD_DB5500_PRCMU + +void db5500_prcmu_early_init(void); +int db5500_prcmu_set_display_clocks(void); +int db5500_prcmu_disable_dsipll(void); +int db5500_prcmu_enable_dsipll(void); +int db5500_prcmu_abb_read(u8 slave, u8 reg, u8 *value, u8 size); +int db5500_prcmu_abb_write(u8 slave, u8 reg, u8 *value, u8 size); + +#else /* !CONFIG_UX500_SOC_DB5500 */ + +static inline void db5500_prcmu_early_init(void) {} + +static inline int db5500_prcmu_abb_read(u8 slave, u8 reg, u8 *value, u8 size)  { -	return 0; +	return -ENOSYS;  } -static inline bool db5500_prcmu_is_ac_wake_requested(void) +static inline int db5500_prcmu_abb_write(u8 slave, u8 reg, u8 *value, u8 size)  { -	return 0; +	return -ENOSYS;  } -static inline int db5500_prcmu_set_arm_opp(u8 opp) +static inline int db5500_prcmu_set_display_clocks(void)  {  	return 0;  } -static inline int db5500_prcmu_get_arm_opp(void) +static inline int db5500_prcmu_disable_dsipll(void)  {  	return 0;  } +static inline int db5500_prcmu_enable_dsipll(void) +{ +	return 0; +}  #endif /* CONFIG_MFD_DB5500_PRCMU */ diff --git a/include/linux/mfd/mc13xxx.h b/include/linux/mfd/mc13xxx.h index 10e038bac8d..bf070755982 100644 --- a/include/linux/mfd/mc13xxx.h +++ b/include/linux/mfd/mc13xxx.h @@ -170,6 +170,16 @@ struct mc13xxx_ts_platform_data {  	bool atox;  }; +enum mc13783_ssi_port { +	MC13783_SSI1_PORT, +	MC13783_SSI2_PORT, +}; + +struct mc13xxx_codec_platform_data { +	enum mc13783_ssi_port adc_ssi_port; +	enum mc13783_ssi_port dac_ssi_port; +}; +  struct mc13xxx_platform_data {  #define MC13XXX_USE_TOUCHSCREEN (1 << 0)  #define MC13XXX_USE_CODEC	(1 << 1) @@ -181,6 +191,7 @@ struct mc13xxx_platform_data {  	struct mc13xxx_leds_platform_data *leds;  	struct mc13xxx_buttons_platform_data *buttons;  	struct mc13xxx_ts_platform_data touch; +	struct mc13xxx_codec_platform_data *codec;  };  #define MC13XXX_ADC_MODE_TS		1 diff --git a/include/linux/mfd/rc5t583.h b/include/linux/mfd/rc5t583.h index a2c61609d21..0b64b19d81a 100644 --- a/include/linux/mfd/rc5t583.h +++ b/include/linux/mfd/rc5t583.h @@ -26,6 +26,7 @@  #include <linux/mutex.h>  #include <linux/types.h> +#include <linux/regmap.h>  #define RC5T583_MAX_REGS		0xF8 @@ -279,14 +280,44 @@ struct rc5t583_platform_data {  	bool		enable_shutdown;  }; -int rc5t583_write(struct device *dev, u8 reg, uint8_t val); -int rc5t583_read(struct device *dev, uint8_t reg, uint8_t *val); -int rc5t583_set_bits(struct device *dev, unsigned int reg, -		unsigned int bit_mask); -int rc5t583_clear_bits(struct device *dev, unsigned int reg, -		unsigned int bit_mask); -int rc5t583_update(struct device *dev, unsigned int reg, -		unsigned int val, unsigned int mask); +static inline int rc5t583_write(struct device *dev, uint8_t reg, uint8_t val) +{ +	struct rc5t583 *rc5t583 = dev_get_drvdata(dev); +	return regmap_write(rc5t583->regmap, reg, val); +} + +static inline int rc5t583_read(struct device *dev, uint8_t reg, uint8_t *val) +{ +	struct rc5t583 *rc5t583 = dev_get_drvdata(dev); +	unsigned int ival; +	int ret; +	ret = regmap_read(rc5t583->regmap, reg, &ival); +	if (!ret) +		*val = (uint8_t)ival; +	return ret; +} + +static inline int rc5t583_set_bits(struct device *dev, unsigned int reg, +			unsigned int bit_mask) +{ +	struct rc5t583 *rc5t583 = dev_get_drvdata(dev); +	return regmap_update_bits(rc5t583->regmap, reg, bit_mask, bit_mask); +} + +static inline int rc5t583_clear_bits(struct device *dev, unsigned int reg, +			unsigned int bit_mask) +{ +	struct rc5t583 *rc5t583 = dev_get_drvdata(dev); +	return regmap_update_bits(rc5t583->regmap, reg, bit_mask, 0); +} + +static inline int rc5t583_update(struct device *dev, unsigned int reg, +		unsigned int val, unsigned int mask) +{ +	struct rc5t583 *rc5t583 = dev_get_drvdata(dev); +	return regmap_update_bits(rc5t583->regmap, reg, mask, val); +} +  int rc5t583_ext_power_req_config(struct device *dev, int deepsleep_id,  	int ext_pwr_req, int deepsleep_slot_nr);  int rc5t583_irq_init(struct rc5t583 *rc5t583, int irq, int irq_base); diff --git a/include/linux/mfd/twl6040.h b/include/linux/mfd/twl6040.h index 9bc9ac651da..b15b5f03f5c 100644 --- a/include/linux/mfd/twl6040.h +++ b/include/linux/mfd/twl6040.h @@ -174,8 +174,35 @@  #define TWL6040_SYSCLK_SEL_LPPLL	0  #define TWL6040_SYSCLK_SEL_HPPLL	1 +struct twl6040_codec_data { +	u16 hs_left_step; +	u16 hs_right_step; +	u16 hf_left_step; +	u16 hf_right_step; +}; + +struct twl6040_vibra_data { +	unsigned int vibldrv_res;	/* left driver resistance */ +	unsigned int vibrdrv_res;	/* right driver resistance */ +	unsigned int viblmotor_res;	/* left motor resistance */ +	unsigned int vibrmotor_res;	/* right motor resistance */ +	int vddvibl_uV;			/* VDDVIBL volt, set 0 for fixed reg */ +	int vddvibr_uV;			/* VDDVIBR volt, set 0 for fixed reg */ +}; + +struct twl6040_platform_data { +	int audpwron_gpio;	/* audio power-on gpio */ +	unsigned int irq_base; + +	struct twl6040_codec_data *codec; +	struct twl6040_vibra_data *vibra; +}; + +struct regmap; +  struct twl6040 {  	struct device *dev; +	struct regmap *regmap;  	struct mutex mutex;  	struct mutex io_mutex;  	struct mutex irq_mutex; diff --git a/include/linux/mm.h b/include/linux/mm.h index d8738a464b9..74aa71bea1e 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -1393,29 +1393,20 @@ extern int install_special_mapping(struct mm_struct *mm,  extern unsigned long get_unmapped_area(struct file *, unsigned long, unsigned long, unsigned long, unsigned long); -extern unsigned long do_mmap_pgoff(struct file *file, unsigned long addr, -	unsigned long len, unsigned long prot, -	unsigned long flag, unsigned long pgoff);  extern unsigned long mmap_region(struct file *file, unsigned long addr,  	unsigned long len, unsigned long flags,  	vm_flags_t vm_flags, unsigned long pgoff); - -static inline unsigned long do_mmap(struct file *file, unsigned long addr, -	unsigned long len, unsigned long prot, -	unsigned long flag, unsigned long offset) -{ -	unsigned long ret = -EINVAL; -	if ((offset + PAGE_ALIGN(len)) < offset) -		goto out; -	if (!(offset & ~PAGE_MASK)) -		ret = do_mmap_pgoff(file, addr, len, prot, flag, offset >> PAGE_SHIFT); -out: -	return ret; -} - +extern unsigned long do_mmap(struct file *, unsigned long, +        unsigned long, unsigned long, +        unsigned long, unsigned long);  extern int do_munmap(struct mm_struct *, unsigned long, size_t); -extern unsigned long do_brk(unsigned long, unsigned long); +/* These take the mm semaphore themselves */ +extern unsigned long vm_brk(unsigned long, unsigned long); +extern int vm_munmap(unsigned long, size_t); +extern unsigned long vm_mmap(struct file *, unsigned long, +        unsigned long, unsigned long, +        unsigned long, unsigned long);  /* truncate.c */  extern void truncate_inode_pages(struct address_space *, loff_t); diff --git a/include/linux/mmc/card.h b/include/linux/mmc/card.h index 01beae78f07..629b823f883 100644 --- a/include/linux/mmc/card.h +++ b/include/linux/mmc/card.h @@ -481,7 +481,7 @@ struct mmc_driver {  	struct device_driver drv;  	int (*probe)(struct mmc_card *);  	void (*remove)(struct mmc_card *); -	int (*suspend)(struct mmc_card *, pm_message_t); +	int (*suspend)(struct mmc_card *);  	int (*resume)(struct mmc_card *);  }; diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index 1f77540bdc9..33900a53c99 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -1403,15 +1403,6 @@ static inline bool netdev_uses_dsa_tags(struct net_device *dev)  	return 0;  } -#ifndef CONFIG_NET_NS -static inline void skb_set_dev(struct sk_buff *skb, struct net_device *dev) -{ -	skb->dev = dev; -} -#else /* CONFIG_NET_NS */ -void skb_set_dev(struct sk_buff *skb, struct net_device *dev); -#endif -  static inline bool netdev_uses_trailer_tags(struct net_device *dev)  {  #ifdef CONFIG_NET_DSA_TAG_TRAILER @@ -2604,8 +2595,6 @@ extern void		net_disable_timestamp(void);  extern void *dev_seq_start(struct seq_file *seq, loff_t *pos);  extern void *dev_seq_next(struct seq_file *seq, void *v, loff_t *pos);  extern void dev_seq_stop(struct seq_file *seq, void *v); -extern int dev_seq_open_ops(struct inode *inode, struct file *file, -			    const struct seq_operations *ops);  #endif  extern int netdev_class_create_file(struct class_attribute *class_attr); diff --git a/include/linux/netfilter/xt_set.h b/include/linux/netfilter/xt_set.h index c0405ac9287..e3a9978f259 100644 --- a/include/linux/netfilter/xt_set.h +++ b/include/linux/netfilter/xt_set.h @@ -58,8 +58,8 @@ struct xt_set_info_target_v1 {  struct xt_set_info_target_v2 {  	struct xt_set_info add_set;  	struct xt_set_info del_set; -	u32 flags; -	u32 timeout; +	__u32 flags; +	__u32 timeout;  };  #endif /*_XT_SET_H*/ diff --git a/include/linux/netfilter_bridge.h b/include/linux/netfilter_bridge.h index 0ddd161f3b0..31d2844e657 100644 --- a/include/linux/netfilter_bridge.h +++ b/include/linux/netfilter_bridge.h @@ -104,9 +104,18 @@ struct bridge_skb_cb {  	} daddr;  }; +static inline void br_drop_fake_rtable(struct sk_buff *skb) +{ +	struct dst_entry *dst = skb_dst(skb); + +	if (dst && (dst->flags & DST_FAKE_RTABLE)) +		skb_dst_drop(skb); +} +  #else  #define nf_bridge_maybe_copy_header(skb)	(0)  #define nf_bridge_pad(skb)			(0) +#define br_drop_fake_rtable(skb)	        do { } while (0)  #endif /* CONFIG_BRIDGE_NETFILTER */  #endif /* __KERNEL__ */ diff --git a/include/linux/netfilter_ipv6/ip6_tables.h b/include/linux/netfilter_ipv6/ip6_tables.h index f549adccc94..1bc898b14a8 100644 --- a/include/linux/netfilter_ipv6/ip6_tables.h +++ b/include/linux/netfilter_ipv6/ip6_tables.h @@ -287,7 +287,17 @@ extern unsigned int ip6t_do_table(struct sk_buff *skb,  				  struct xt_table *table);  /* Check for an extension */ -extern int ip6t_ext_hdr(u8 nexthdr); +static inline int +ip6t_ext_hdr(u8 nexthdr) +{	return (nexthdr == IPPROTO_HOPOPTS) || +	       (nexthdr == IPPROTO_ROUTING) || +	       (nexthdr == IPPROTO_FRAGMENT) || +	       (nexthdr == IPPROTO_ESP) || +	       (nexthdr == IPPROTO_AH) || +	       (nexthdr == IPPROTO_NONE) || +	       (nexthdr == IPPROTO_DSTOPTS); +} +  /* find specified header and get offset to it */  extern int ipv6_find_hdr(const struct sk_buff *skb, unsigned int *offset,  			 int target, unsigned short *fragoff); diff --git a/include/linux/nfs_xdr.h b/include/linux/nfs_xdr.h index bfd0d1bf670..7ba3551a041 100644 --- a/include/linux/nfs_xdr.h +++ b/include/linux/nfs_xdr.h @@ -312,6 +312,11 @@ struct nfs4_layoutreturn {  	int rpc_status;  }; +struct stateowner_id { +	__u64	create_time; +	__u32	uniquifier; +}; +  /*   * Arguments to the open call.   */ @@ -321,7 +326,7 @@ struct nfs_openargs {  	int			open_flags;  	fmode_t			fmode;  	__u64                   clientid; -	__u64                   id; +	struct stateowner_id	id;  	union {  		struct {  			struct iattr *  attrs;    /* UNCHECKED, GUARDED */ diff --git a/include/linux/nfsd/Kbuild b/include/linux/nfsd/Kbuild index b8d4001212b..5b7d84ac954 100644 --- a/include/linux/nfsd/Kbuild +++ b/include/linux/nfsd/Kbuild @@ -1,3 +1,4 @@ +header-y += cld.h  header-y += debug.h  header-y += export.h  header-y += nfsfh.h diff --git a/include/linux/pinctrl/machine.h b/include/linux/pinctrl/machine.h index fee4349364f..e4d1de74250 100644 --- a/include/linux/pinctrl/machine.h +++ b/include/linux/pinctrl/machine.h @@ -12,6 +12,8 @@  #ifndef __LINUX_PINCTRL_MACHINE_H  #define __LINUX_PINCTRL_MACHINE_H +#include <linux/bug.h> +  #include "pinctrl-state.h"  enum pinctrl_map_type { @@ -148,7 +150,7 @@ struct pinctrl_map {  #define PIN_MAP_CONFIGS_GROUP_HOG_DEFAULT(dev, grp, cfgs)		\  	PIN_MAP_CONFIGS_GROUP(dev, PINCTRL_STATE_DEFAULT, dev, grp, cfgs) -#ifdef CONFIG_PINMUX +#ifdef CONFIG_PINCTRL  extern int pinctrl_register_mappings(struct pinctrl_map const *map,  				unsigned num_maps); diff --git a/include/linux/pipe_fs_i.h b/include/linux/pipe_fs_i.h index 6d626ff0cfd..e1ac1ce16fb 100644 --- a/include/linux/pipe_fs_i.h +++ b/include/linux/pipe_fs_i.h @@ -6,6 +6,7 @@  #define PIPE_BUF_FLAG_LRU	0x01	/* page is on the LRU */  #define PIPE_BUF_FLAG_ATOMIC	0x02	/* was atomically mapped */  #define PIPE_BUF_FLAG_GIFT	0x04	/* page is a gift */ +#define PIPE_BUF_FLAG_PACKET	0x08	/* read() as a packet */  /**   *	struct pipe_buffer - a linux kernel pipe buffer diff --git a/include/linux/platform_data/atmel.h b/include/linux/platform_data/atmel.h index d056263545b..b0f2c56a8ea 100644 --- a/include/linux/platform_data/atmel.h +++ b/include/linux/platform_data/atmel.h @@ -4,8 +4,8 @@   * GPL v2 Only   */ -#ifndef __ATMEL_NAND_H__ -#define __ATMEL_NAND_H__ +#ifndef __ATMEL_H__ +#define __ATMEL_H__  #include <linux/mtd/nand.h> @@ -24,4 +24,4 @@ struct atmel_nand_data {  	unsigned int	num_parts;  }; -#endif /* __ATMEL_NAND_H__ */ +#endif /* __ATMEL_H__ */ diff --git a/include/linux/pm_qos.h b/include/linux/pm_qos.h index 2e9191a712f..233149cb19f 100644 --- a/include/linux/pm_qos.h +++ b/include/linux/pm_qos.h @@ -8,6 +8,7 @@  #include <linux/notifier.h>  #include <linux/miscdevice.h>  #include <linux/device.h> +#include <linux/workqueue.h>  enum {  	PM_QOS_RESERVED = 0, @@ -29,6 +30,7 @@ enum {  struct pm_qos_request {  	struct plist_node node;  	int pm_qos_class; +	struct delayed_work work; /* for pm_qos_update_request_timeout */  };  struct dev_pm_qos_request { @@ -73,6 +75,8 @@ void pm_qos_add_request(struct pm_qos_request *req, int pm_qos_class,  			s32 value);  void pm_qos_update_request(struct pm_qos_request *req,  			   s32 new_value); +void pm_qos_update_request_timeout(struct pm_qos_request *req, +				   s32 new_value, unsigned long timeout_us);  void pm_qos_remove_request(struct pm_qos_request *req);  int pm_qos_request(int pm_qos_class); diff --git a/include/linux/regmap.h b/include/linux/regmap.h index a90abb6bfa6..0258bcd6258 100644 --- a/include/linux/regmap.h +++ b/include/linux/regmap.h @@ -46,7 +46,13 @@ struct reg_default {  /**   * Configuration for the register map of a device.   * + * @name: Optional name of the regmap. Useful when a device has multiple + *        register regions. + *   * @reg_bits: Number of bits in a register address, mandatory. + * @reg_stride: The register address stride. Valid register addresses are a + *              multiple of this value. If set to 0, a value of 1 will be + *              used.   * @pad_bits: Number of bits of padding between register and value.   * @val_bits: Number of bits in a register value, mandatory.   * @@ -77,7 +83,10 @@ struct reg_default {   * @num_reg_defaults_raw: Number of elements in reg_defaults_raw.   */  struct regmap_config { +	const char *name; +  	int reg_bits; +	int reg_stride;  	int pad_bits;  	int val_bits; @@ -97,18 +106,21 @@ struct regmap_config {  	u8 write_flag_mask;  }; -typedef int (*regmap_hw_write)(struct device *dev, const void *data, +typedef int (*regmap_hw_write)(void *context, const void *data,  			       size_t count); -typedef int (*regmap_hw_gather_write)(struct device *dev, +typedef int (*regmap_hw_gather_write)(void *context,  				      const void *reg, size_t reg_len,  				      const void *val, size_t val_len); -typedef int (*regmap_hw_read)(struct device *dev, +typedef int (*regmap_hw_read)(void *context,  			      const void *reg_buf, size_t reg_size,  			      void *val_buf, size_t val_size); +typedef void (*regmap_hw_free_context)(void *context);  /**   * Description of a hardware bus for the register map infrastructure.   * + * @fast_io: Register IO is fast. Use a spinlock instead of a mutex + *           to perform locking.   * @write: Write operation.   * @gather_write: Write operation with split register/value, return -ENOTSUPP   *                if not implemented  on a given device. @@ -118,27 +130,37 @@ typedef int (*regmap_hw_read)(struct device *dev,   *                  a read.   */  struct regmap_bus { +	bool fast_io;  	regmap_hw_write write;  	regmap_hw_gather_write gather_write;  	regmap_hw_read read; +	regmap_hw_free_context free_context;  	u8 read_flag_mask;  };  struct regmap *regmap_init(struct device *dev,  			   const struct regmap_bus *bus, +			   void *bus_context,  			   const struct regmap_config *config);  struct regmap *regmap_init_i2c(struct i2c_client *i2c,  			       const struct regmap_config *config);  struct regmap *regmap_init_spi(struct spi_device *dev,  			       const struct regmap_config *config); +struct regmap *regmap_init_mmio(struct device *dev, +				void __iomem *regs, +				const struct regmap_config *config);  struct regmap *devm_regmap_init(struct device *dev,  				const struct regmap_bus *bus, +				void *bus_context,  				const struct regmap_config *config);  struct regmap *devm_regmap_init_i2c(struct i2c_client *i2c,  				    const struct regmap_config *config);  struct regmap *devm_regmap_init_spi(struct spi_device *dev,  				    const struct regmap_config *config); +struct regmap *devm_regmap_init_mmio(struct device *dev, +				     void __iomem *regs, +				     const struct regmap_config *config);  void regmap_exit(struct regmap *map);  int regmap_reinit_cache(struct regmap *map, diff --git a/include/linux/regulator/machine.h b/include/linux/regulator/machine.h index 7abb1609331..b02108446be 100644 --- a/include/linux/regulator/machine.h +++ b/include/linux/regulator/machine.h @@ -71,7 +71,7 @@ struct regulator_state {   * @uV_offset: Offset applied to voltages from consumer to compensate for   *             voltage drops.   * - * @min_uA: Smallest consumers consumers may set. + * @min_uA: Smallest current consumers may set.   * @max_uA: Largest current consumers may set.   *   * @valid_modes_mask: Mask of modes which may be configured by consumers. @@ -134,10 +134,8 @@ struct regulation_constraints {  /**   * struct regulator_consumer_supply - supply -> device mapping   * - * This maps a supply name to a device.  Only one of dev or dev_name - * can be specified.  Use of dev_name allows support for buses which - * make struct device available late such as I2C and is the preferred - * form. + * This maps a supply name to a device. Use of dev_name allows support for + * buses which make struct device available late such as I2C.   *   * @dev_name: Result of dev_name() for the consumer.   * @supply: Name for the supply. diff --git a/include/linux/seqlock.h b/include/linux/seqlock.h index c6db9fb33c4..600060e25ec 100644 --- a/include/linux/seqlock.h +++ b/include/linux/seqlock.h @@ -141,7 +141,7 @@ static inline unsigned __read_seqcount_begin(const seqcount_t *s)  	unsigned ret;  repeat: -	ret = s->sequence; +	ret = ACCESS_ONCE(s->sequence);  	if (unlikely(ret & 1)) {  		cpu_relax();  		goto repeat; @@ -166,6 +166,27 @@ static inline unsigned read_seqcount_begin(const seqcount_t *s)  }  /** + * raw_seqcount_begin - begin a seq-read critical section + * @s: pointer to seqcount_t + * Returns: count to be passed to read_seqcount_retry + * + * raw_seqcount_begin opens a read critical section of the given seqcount. + * Validity of the critical section is tested by checking read_seqcount_retry + * function. + * + * Unlike read_seqcount_begin(), this function will not wait for the count + * to stabilize. If a writer is active when we begin, we will fail the + * read_seqcount_retry() instead of stabilizing at the beginning of the + * critical section. + */ +static inline unsigned raw_seqcount_begin(const seqcount_t *s) +{ +	unsigned ret = ACCESS_ONCE(s->sequence); +	smp_rmb(); +	return ret & ~1; +} + +/**   * __read_seqcount_retry - end a seq-read critical section (without barrier)   * @s: pointer to seqcount_t   * @start: count, from read_seqcount_begin diff --git a/include/linux/serial_core.h b/include/linux/serial_core.h index f51bf2e70c6..2db407a4005 100644 --- a/include/linux/serial_core.h +++ b/include/linux/serial_core.h @@ -357,7 +357,7 @@ struct uart_port {  #define UPF_CONS_FLOW		((__force upf_t) (1 << 23))  #define UPF_SHARE_IRQ		((__force upf_t) (1 << 24))  #define UPF_EXAR_EFR		((__force upf_t) (1 << 25)) -#define UPF_IIR_ONCE		((__force upf_t) (1 << 26)) +#define UPF_BUG_THRE		((__force upf_t) (1 << 26))  /* The exact UART type is known and should not be probed.  */  #define UPF_FIXED_TYPE		((__force upf_t) (1 << 27))  #define UPF_BOOT_AUTOCONF	((__force upf_t) (1 << 28)) diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index 33370271b8b..111f26b6e28 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h @@ -238,11 +238,12 @@ enum {  /*   * The callback notifies userspace to release buffers when skb DMA is done in   * lower device, the skb last reference should be 0 when calling this. - * The desc is used to track userspace buffer index. + * The ctx field is used to track device context. + * The desc field is used to track userspace buffer index.   */  struct ubuf_info { -	void (*callback)(void *); -	void *arg; +	void (*callback)(struct ubuf_info *); +	void *ctx;  	unsigned long desc;  }; @@ -481,6 +482,7 @@ struct sk_buff {  	union {  		__u32		mark;  		__u32		dropcount; +		__u32		avail_size;  	};  	sk_buff_data_t		transport_header; @@ -1018,7 +1020,7 @@ static inline void skb_queue_splice(const struct sk_buff_head *list,  }  /** - *	skb_queue_splice - join two skb lists and reinitialise the emptied list + *	skb_queue_splice_init - join two skb lists and reinitialise the emptied list   *	@list: the new list to add   *	@head: the place to add it in the first list   * @@ -1049,7 +1051,7 @@ static inline void skb_queue_splice_tail(const struct sk_buff_head *list,  }  /** - *	skb_queue_splice_tail - join two skb lists and reinitialise the emptied list + *	skb_queue_splice_tail_init - join two skb lists and reinitialise the emptied list   *	@list: the new list to add   *	@head: the place to add it in the first list   * @@ -1366,6 +1368,18 @@ static inline int skb_tailroom(const struct sk_buff *skb)  }  /** + *	skb_availroom - bytes at buffer end + *	@skb: buffer to check + * + *	Return the number of bytes of free space at the tail of an sk_buff + *	allocated by sk_stream_alloc() + */ +static inline int skb_availroom(const struct sk_buff *skb) +{ +	return skb_is_nonlinear(skb) ? 0 : skb->avail_size - skb->len; +} + +/**   *	skb_reserve - adjust headroom   *	@skb: buffer to alter   *	@len: bytes to move diff --git a/include/linux/socket.h b/include/linux/socket.h index da2d3e2543f..b84bbd48b87 100644 --- a/include/linux/socket.h +++ b/include/linux/socket.h @@ -265,7 +265,7 @@ struct ucred {  #define MSG_NOSIGNAL	0x4000	/* Do not generate SIGPIPE */  #define MSG_MORE	0x8000	/* Sender will send more */  #define MSG_WAITFORONE	0x10000	/* recvmmsg(): block until 1+ packets avail */ - +#define MSG_SENDPAGE_NOTLAST 0x20000 /* sendpage() internal : not the last page */  #define MSG_EOF         MSG_FIN  #define MSG_CMSG_CLOEXEC 0x40000000	/* Set close_on_exit for file diff --git a/include/linux/spi/spi.h b/include/linux/spi/spi.h index 98679b061b6..fa702aeb503 100644 --- a/include/linux/spi/spi.h +++ b/include/linux/spi/spi.h @@ -254,7 +254,7 @@ static inline void spi_unregister_driver(struct spi_driver *sdrv)   *	driver is finished with this message, it must call   *	spi_finalize_current_message() so the subsystem can issue the next   *	transfer - * @prepare_transfer_hardware: there are currently no more messages on the + * @unprepare_transfer_hardware: there are currently no more messages on the   *	queue so the subsystem notifies the driver that it may relax the   *	hardware by issuing this call   * diff --git a/include/linux/stddef.h b/include/linux/stddef.h index 6a40c76bdcf..1747b6787b9 100644 --- a/include/linux/stddef.h +++ b/include/linux/stddef.h @@ -3,14 +3,10 @@  #include <linux/compiler.h> +#ifdef __KERNEL__ +  #undef NULL -#if defined(__cplusplus) -#define NULL 0 -#else  #define NULL ((void *)0) -#endif - -#ifdef __KERNEL__  enum {  	false	= 0, diff --git a/include/linux/swap.h b/include/linux/swap.h index 8dc0ea7caf0..b1fd5c7925f 100644 --- a/include/linux/swap.h +++ b/include/linux/swap.h @@ -305,6 +305,13 @@ static inline int mem_cgroup_swappiness(struct mem_cgroup *mem)  	return vm_swappiness;  }  #endif +#ifdef CONFIG_CGROUP_MEM_RES_CTLR_SWAP +extern void mem_cgroup_uncharge_swap(swp_entry_t ent); +#else +static inline void mem_cgroup_uncharge_swap(swp_entry_t ent) +{ +} +#endif  #ifdef CONFIG_SWAP  /* linux/mm/page_io.c */  extern int swap_readpage(struct page *); @@ -375,13 +382,6 @@ mem_cgroup_uncharge_swapcache(struct page *page, swp_entry_t ent, bool swapout)  {  }  #endif -#ifdef CONFIG_CGROUP_MEM_RES_CTLR_SWAP -extern void mem_cgroup_uncharge_swap(swp_entry_t ent); -#else -static inline void mem_cgroup_uncharge_swap(swp_entry_t ent) -{ -} -#endif  #else /* CONFIG_SWAP */ diff --git a/include/linux/types.h b/include/linux/types.h index e5fa5034551..7f480db6023 100644 --- a/include/linux/types.h +++ b/include/linux/types.h @@ -210,6 +210,12 @@ typedef u32 phys_addr_t;  typedef phys_addr_t resource_size_t; +/* + * This type is the placeholder for a hardware interrupt number. It has to be + * big enough to enclose whatever representation is used by a given platform. + */ +typedef unsigned long irq_hw_number_t; +  typedef struct {  	int counter;  } atomic_t; diff --git a/include/linux/usb/hcd.h b/include/linux/usb/hcd.h index 5de415707c2..d28cc78a38e 100644 --- a/include/linux/usb/hcd.h +++ b/include/linux/usb/hcd.h @@ -126,6 +126,8 @@ struct usb_hcd {  	unsigned		wireless:1;	/* Wireless USB HCD */  	unsigned		authorized_default:1;  	unsigned		has_tt:1;	/* Integrated TT in root hub */ +	unsigned		broken_pci_sleep:1;	/* Don't put the +			controller in PCI-D3 for system sleep */  	unsigned int		irq;		/* irq allocated */  	void __iomem		*regs;		/* device memory/io */ diff --git a/include/linux/usb/otg.h b/include/linux/usb/otg.h index f67810f8f21..38ab3f46346 100644 --- a/include/linux/usb/otg.h +++ b/include/linux/usb/otg.h @@ -94,6 +94,7 @@ struct usb_phy {  	struct usb_otg		*otg; +	struct device		*io_dev;  	struct usb_phy_io_ops	*io_ops;  	void __iomem		*io_priv; diff --git a/include/linux/usb/serial.h b/include/linux/usb/serial.h index fbb666b1b67..47428388823 100644 --- a/include/linux/usb/serial.h +++ b/include/linux/usb/serial.h @@ -28,13 +28,6 @@  /* parity check flag */  #define RELEVANT_IFLAG(iflag)	(iflag & (IGNBRK|BRKINT|IGNPAR|PARMRK|INPCK)) -enum port_dev_state { -	PORT_UNREGISTERED, -	PORT_REGISTERING, -	PORT_REGISTERED, -	PORT_UNREGISTERING, -}; -  /* USB serial flags */  #define USB_SERIAL_WRITE_BUSY	0 @@ -124,7 +117,6 @@ struct usb_serial_port {  	char			throttle_req;  	unsigned long		sysrq; /* sysrq timeout */  	struct device		dev; -	enum port_dev_state	dev_state;  };  #define to_usb_serial_port(d) container_of(d, struct usb_serial_port, dev) diff --git a/include/linux/vgaarb.h b/include/linux/vgaarb.h index 9c3120dca29..b572f80bdfd 100644 --- a/include/linux/vgaarb.h +++ b/include/linux/vgaarb.h @@ -47,6 +47,8 @@   */  #define VGA_DEFAULT_DEVICE     (NULL) +struct pci_dev; +  /* For use by clients */  /** diff --git a/include/linux/vm_event_item.h b/include/linux/vm_event_item.h index 03b90cdc192..06f8e385825 100644 --- a/include/linux/vm_event_item.h +++ b/include/linux/vm_event_item.h @@ -26,13 +26,14 @@ enum vm_event_item { PGPGIN, PGPGOUT, PSWPIN, PSWPOUT,  		PGFREE, PGACTIVATE, PGDEACTIVATE,  		PGFAULT, PGMAJFAULT,  		FOR_ALL_ZONES(PGREFILL), -		FOR_ALL_ZONES(PGSTEAL), +		FOR_ALL_ZONES(PGSTEAL_KSWAPD), +		FOR_ALL_ZONES(PGSTEAL_DIRECT),  		FOR_ALL_ZONES(PGSCAN_KSWAPD),  		FOR_ALL_ZONES(PGSCAN_DIRECT),  #ifdef CONFIG_NUMA  		PGSCAN_ZONE_RECLAIM_FAILED,  #endif -		PGINODESTEAL, SLABS_SCANNED, KSWAPD_STEAL, KSWAPD_INODESTEAL, +		PGINODESTEAL, SLABS_SCANNED, KSWAPD_INODESTEAL,  		KSWAPD_LOW_WMARK_HIT_QUICKLY, KSWAPD_HIGH_WMARK_HIT_QUICKLY,  		KSWAPD_SKIP_CONGESTION_WAIT,  		PAGEOUTRUN, ALLOCSTALL, PGROTATED, diff --git a/include/net/bluetooth/hci.h b/include/net/bluetooth/hci.h index 344b0f97282..d47e523c9d8 100644 --- a/include/net/bluetooth/hci.h +++ b/include/net/bluetooth/hci.h @@ -92,6 +92,7 @@ enum {  	HCI_SERVICE_CACHE,  	HCI_LINK_KEYS,  	HCI_DEBUG_KEYS, +	HCI_UNREGISTER,  	HCI_LE_SCAN,  	HCI_SSP_ENABLED, @@ -1327,8 +1328,8 @@ struct sockaddr_hci {  #define HCI_DEV_NONE	0xffff  #define HCI_CHANNEL_RAW		0 -#define HCI_CHANNEL_CONTROL	1  #define HCI_CHANNEL_MONITOR	2 +#define HCI_CHANNEL_CONTROL	3  struct hci_filter {  	unsigned long type_mask; diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h index daefaac5113..db1c5df4522 100644 --- a/include/net/bluetooth/hci_core.h +++ b/include/net/bluetooth/hci_core.h @@ -314,6 +314,7 @@ struct hci_conn {  	__u8		remote_cap;  	__u8		remote_auth; +	bool		flush_key;  	unsigned int	sent; @@ -427,7 +428,7 @@ enum {  static inline bool hci_conn_ssp_enabled(struct hci_conn *conn)  {  	struct hci_dev *hdev = conn->hdev; -	return (test_bit(HCI_SSP_ENABLED, &hdev->flags) && +	return (test_bit(HCI_SSP_ENABLED, &hdev->dev_flags) &&  				test_bit(HCI_CONN_SSP_ENABLED, &conn->flags));  } @@ -907,11 +908,13 @@ static inline void hci_role_switch_cfm(struct hci_conn *conn, __u8 status,  static inline bool eir_has_data_type(u8 *data, size_t data_len, u8 type)  { -	u8 field_len; -	size_t parsed; +	size_t parsed = 0; -	for (parsed = 0; parsed < data_len - 1; parsed += field_len) { -		field_len = data[0]; +	if (data_len < 2) +		return false; + +	while (parsed < data_len - 1) { +		u8 field_len = data[0];  		if (field_len == 0)  			break; @@ -978,7 +981,7 @@ int mgmt_discoverable(struct hci_dev *hdev, u8 discoverable);  int mgmt_connectable(struct hci_dev *hdev, u8 connectable);  int mgmt_write_scan_failed(struct hci_dev *hdev, u8 scan, u8 status);  int mgmt_new_link_key(struct hci_dev *hdev, struct link_key *key, -		      u8 persistent); +		      bool persistent);  int mgmt_device_connected(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,  			  u8 addr_type, u32 flags, u8 *name, u8 name_len,  			  u8 *dev_class); diff --git a/include/net/bluetooth/mgmt.h b/include/net/bluetooth/mgmt.h index ffc1377e092..ebfd91fc20f 100644 --- a/include/net/bluetooth/mgmt.h +++ b/include/net/bluetooth/mgmt.h @@ -117,7 +117,7 @@ struct mgmt_mode {  #define MGMT_OP_SET_DISCOVERABLE	0x0006  struct mgmt_cp_set_discoverable {  	__u8	val; -	__u16	timeout; +	__le16	timeout;  } __packed;  #define MGMT_SET_DISCOVERABLE_SIZE	3 diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h index 248fb05feb6..83d800c31e3 100644 --- a/include/net/cfg80211.h +++ b/include/net/cfg80211.h @@ -620,8 +620,10 @@ struct sta_bss_parameters {   * @llid: mesh local link id   * @plid: mesh peer link id   * @plink_state: mesh peer link state - * @signal: signal strength of last received packet in dBm - * @signal_avg: signal strength average in dBm + * @signal: the signal strength, type depends on the wiphy's signal_type +	NOTE: For CFG80211_SIGNAL_TYPE_MBM, value is expressed in _dBm_. + * @signal_avg: avg signal strength, type depends on the wiphy's signal_type +	NOTE: For CFG80211_SIGNAL_TYPE_MBM, value is expressed in _dBm_.   * @txrate: current unicast bitrate from this station   * @rxrate: current unicast bitrate to this station   * @rx_packets: packets received from this station diff --git a/include/net/dst.h b/include/net/dst.h index 59c5d18cc38..bed833d9796 100644 --- a/include/net/dst.h +++ b/include/net/dst.h @@ -36,7 +36,11 @@ struct dst_entry {  	struct net_device       *dev;  	struct  dst_ops	        *ops;  	unsigned long		_metrics; -	unsigned long		expires; +	union { +		unsigned long           expires; +		/* point to where the dst_entry copied from */ +		struct dst_entry        *from; +	};  	struct dst_entry	*path;  	struct neighbour __rcu	*_neighbour;  #ifdef CONFIG_XFRM @@ -55,6 +59,7 @@ struct dst_entry {  #define DST_NOCACHE		0x0010  #define DST_NOCOUNT		0x0020  #define DST_NOPEER		0x0040 +#define DST_FAKE_RTABLE		0x0080  	short			error;  	short			obsolete; diff --git a/include/net/ip6_fib.h b/include/net/ip6_fib.h index b26bb810198..0ae759a6c76 100644 --- a/include/net/ip6_fib.h +++ b/include/net/ip6_fib.h @@ -123,6 +123,54 @@ static inline struct inet6_dev *ip6_dst_idev(struct dst_entry *dst)  	return ((struct rt6_info *)dst)->rt6i_idev;  } +static inline void rt6_clean_expires(struct rt6_info *rt) +{ +	if (!(rt->rt6i_flags & RTF_EXPIRES) && rt->dst.from) +		dst_release(rt->dst.from); + +	rt->rt6i_flags &= ~RTF_EXPIRES; +	rt->dst.from = NULL; +} + +static inline void rt6_set_expires(struct rt6_info *rt, unsigned long expires) +{ +	if (!(rt->rt6i_flags & RTF_EXPIRES) && rt->dst.from) +		dst_release(rt->dst.from); + +	rt->rt6i_flags |= RTF_EXPIRES; +	rt->dst.expires = expires; +} + +static inline void rt6_update_expires(struct rt6_info *rt, int timeout) +{ +	if (!(rt->rt6i_flags & RTF_EXPIRES)) { +		if (rt->dst.from) +			dst_release(rt->dst.from); +		/* dst_set_expires relies on expires == 0  +		 * if it has not been set previously. +		 */ +		rt->dst.expires = 0; +	} + +	dst_set_expires(&rt->dst, timeout); +	rt->rt6i_flags |= RTF_EXPIRES; +} + +static inline void rt6_set_from(struct rt6_info *rt, struct rt6_info *from) +{ +	struct dst_entry *new = (struct dst_entry *) from; + +	if (!(rt->rt6i_flags & RTF_EXPIRES) && rt->dst.from) { +		if (new == rt->dst.from) +			return; +		dst_release(rt->dst.from); +	} + +	rt->rt6i_flags &= ~RTF_EXPIRES; +	rt->dst.from = new; +	dst_hold(new); +} +  struct fib6_walker_t {  	struct list_head lh;  	struct fib6_node *root, *node; diff --git a/include/net/ip_vs.h b/include/net/ip_vs.h index 2bdee51ba30..72522f08737 100644 --- a/include/net/ip_vs.h +++ b/include/net/ip_vs.h @@ -393,7 +393,7 @@ struct ip_vs_protocol {  	void (*exit)(struct ip_vs_protocol *pp); -	void (*init_netns)(struct net *net, struct ip_vs_proto_data *pd); +	int (*init_netns)(struct net *net, struct ip_vs_proto_data *pd);  	void (*exit_netns)(struct net *net, struct ip_vs_proto_data *pd); @@ -1203,6 +1203,8 @@ ip_vs_lookup_real_service(struct net *net, int af, __u16 protocol,  extern int ip_vs_use_count_inc(void);  extern void ip_vs_use_count_dec(void); +extern int ip_vs_register_nl_ioctl(void); +extern void ip_vs_unregister_nl_ioctl(void);  extern int ip_vs_control_init(void);  extern void ip_vs_control_cleanup(void);  extern struct ip_vs_dest * diff --git a/include/net/mac80211.h b/include/net/mac80211.h index 87d203ff7a8..9210bdc7bd8 100644 --- a/include/net/mac80211.h +++ b/include/net/mac80211.h @@ -1327,7 +1327,7 @@ static inline struct ieee80211_rate *  ieee80211_get_tx_rate(const struct ieee80211_hw *hw,  		      const struct ieee80211_tx_info *c)  { -	if (WARN_ON(c->control.rates[0].idx < 0)) +	if (WARN_ON_ONCE(c->control.rates[0].idx < 0))  		return NULL;  	return &hw->wiphy->bands[c->band]->bitrates[c->control.rates[0].idx];  } diff --git a/include/net/netfilter/xt_log.h b/include/net/netfilter/xt_log.h index 7e1544e8f70..9d9756cca01 100644 --- a/include/net/netfilter/xt_log.h +++ b/include/net/netfilter/xt_log.h @@ -47,7 +47,7 @@ static void sb_close(struct sbuff *m)  	if (likely(m != &emergency))  		kfree(m);  	else { -		xchg(&emergency_ptr, m); +		emergency_ptr = m;  		local_bh_enable();  	}  } diff --git a/include/net/red.h b/include/net/red.h index 77d4c3745cb..ef46058d35b 100644 --- a/include/net/red.h +++ b/include/net/red.h @@ -245,7 +245,7 @@ static inline unsigned long red_calc_qavg_from_idle_time(const struct red_parms  	 *  	 * dummy packets as a burst after idle time, i.e.  	 * -	 * 	p->qavg *= (1-W)^m +	 * 	v->qavg *= (1-W)^m  	 *  	 * This is an apparently overcomplicated solution (f.e. we have to  	 * precompute a table to make this calculation in reasonable time) @@ -279,7 +279,7 @@ static inline unsigned long red_calc_qavg_no_idle_time(const struct red_parms *p  						       unsigned int backlog)  {  	/* -	 * NOTE: p->qavg is fixed point number with point at Wlog. +	 * NOTE: v->qavg is fixed point number with point at Wlog.  	 * The formula below is equvalent to floating point  	 * version:  	 * @@ -390,7 +390,7 @@ static inline void red_adaptative_algo(struct red_parms *p, struct red_vars *v)  	if (red_is_idling(v))  		qavg = red_calc_qavg_from_idle_time(p, v); -	/* p->qavg is fixed point number with point at Wlog */ +	/* v->qavg is fixed point number with point at Wlog */  	qavg >>= p->Wlog;  	if (qavg > p->target_max && p->max_P <= MAX_P_MAX) diff --git a/include/net/sctp/sctp.h b/include/net/sctp/sctp.h index 6ee44b24864..a2ef81466b0 100644 --- a/include/net/sctp/sctp.h +++ b/include/net/sctp/sctp.h @@ -704,4 +704,17 @@ static inline void sctp_v4_map_v6(union sctp_addr *addr)  	addr->v6.sin6_addr.s6_addr32[2] = htonl(0x0000ffff);  } +/* The cookie is always 0 since this is how it's used in the + * pmtu code. + */ +static inline struct dst_entry *sctp_transport_dst_check(struct sctp_transport *t) +{ +	if (t->dst && !dst_check(t->dst, 0)) { +		dst_release(t->dst); +		t->dst = NULL; +	} + +	return t->dst; +} +  #endif /* __net_sctp_h__ */ diff --git a/include/net/sock.h b/include/net/sock.h index a6ba1f8871f..5a0a58ac412 100644 --- a/include/net/sock.h +++ b/include/net/sock.h @@ -246,6 +246,7 @@ struct cg_proto;    *	@sk_user_data: RPC layer private data    *	@sk_sndmsg_page: cached page for sendmsg    *	@sk_sndmsg_off: cached offset for sendmsg +  *	@sk_peek_off: current peek_offset value    *	@sk_send_head: front of stuff to transmit    *	@sk_security: used by security modules    *	@sk_mark: generic packet mark @@ -1128,9 +1129,9 @@ sk_sockets_allocated_read_positive(struct sock *sk)  	struct proto *prot = sk->sk_prot;  	if (mem_cgroup_sockets_enabled && sk->sk_cgrp) -		return percpu_counter_sum_positive(sk->sk_cgrp->sockets_allocated); +		return percpu_counter_read_positive(sk->sk_cgrp->sockets_allocated); -	return percpu_counter_sum_positive(prot->sockets_allocated); +	return percpu_counter_read_positive(prot->sockets_allocated);  }  static inline int diff --git a/include/scsi/libsas.h b/include/scsi/libsas.h index 5f5ed1b8b41..f4f1c96dca7 100644 --- a/include/scsi/libsas.h +++ b/include/scsi/libsas.h @@ -217,11 +217,29 @@ struct domain_device {  	struct kref kref;  }; -struct sas_discovery_event { +struct sas_work { +	struct list_head drain_node;  	struct work_struct work; +}; + +static inline void INIT_SAS_WORK(struct sas_work *sw, void (*fn)(struct work_struct *)) +{ +	INIT_WORK(&sw->work, fn); +	INIT_LIST_HEAD(&sw->drain_node); +} + +struct sas_discovery_event { +	struct sas_work work;  	struct asd_sas_port *port;  }; +static inline struct sas_discovery_event *to_sas_discovery_event(struct work_struct *work) +{ +	struct sas_discovery_event *ev = container_of(work, typeof(*ev), work.work); + +	return ev; +} +  struct sas_discovery {  	struct sas_discovery_event disc_work[DISC_NUM_EVENTS];  	unsigned long    pending; @@ -244,7 +262,7 @@ struct asd_sas_port {  	struct list_head destroy_list;  	enum   sas_linkrate linkrate; -	struct work_struct work; +	struct sas_work work;  /* public: */  	int id; @@ -270,10 +288,17 @@ struct asd_sas_port {  };  struct asd_sas_event { -	struct work_struct work; +	struct sas_work work;  	struct asd_sas_phy *phy;  }; +static inline struct asd_sas_event *to_asd_sas_event(struct work_struct *work) +{ +	struct asd_sas_event *ev = container_of(work, typeof(*ev), work.work); + +	return ev; +} +  /* The phy pretty much is controlled by the LLDD.   * The class only reads those fields.   */ @@ -333,10 +358,17 @@ struct scsi_core {  };  struct sas_ha_event { -	struct work_struct work; +	struct sas_work work;  	struct sas_ha_struct *ha;  }; +static inline struct sas_ha_event *to_sas_ha_event(struct work_struct *work) +{ +	struct sas_ha_event *ev = container_of(work, typeof(*ev), work.work); + +	return ev; +} +  enum sas_ha_state {  	SAS_HA_REGISTERED,  	SAS_HA_DRAINING, diff --git a/include/scsi/sas_ata.h b/include/scsi/sas_ata.h index cdccd2eb7b6..77670e823ed 100644 --- a/include/scsi/sas_ata.h +++ b/include/scsi/sas_ata.h @@ -37,7 +37,7 @@ static inline int dev_is_sata(struct domain_device *dev)  }  int sas_get_ata_info(struct domain_device *dev, struct ex_phy *phy); -int sas_ata_init_host_and_port(struct domain_device *found_dev); +int sas_ata_init(struct domain_device *dev);  void sas_ata_task_abort(struct sas_task *task);  void sas_ata_strategy_handler(struct Scsi_Host *shost);  void sas_ata_eh(struct Scsi_Host *shost, struct list_head *work_q, @@ -52,7 +52,7 @@ static inline int dev_is_sata(struct domain_device *dev)  {  	return 0;  } -static inline int sas_ata_init_host_and_port(struct domain_device *found_dev) +static inline int sas_ata_init(struct domain_device *dev)  {  	return 0;  } diff --git a/include/scsi/scsi_cmnd.h b/include/scsi/scsi_cmnd.h index 377df4a2851..1e1198546c7 100644 --- a/include/scsi/scsi_cmnd.h +++ b/include/scsi/scsi_cmnd.h @@ -134,6 +134,9 @@ struct scsi_cmnd {  static inline struct scsi_driver *scsi_cmd_to_driver(struct scsi_cmnd *cmd)  { +	if (!cmd->request->rq_disk) +		return NULL; +  	return *(struct scsi_driver **)cmd->request->rq_disk->private_data;  } diff --git a/include/sound/cs42l52.h b/include/sound/cs42l52.h new file mode 100644 index 00000000000..4c68955f733 --- /dev/null +++ b/include/sound/cs42l52.h @@ -0,0 +1,36 @@ +/* + * linux/sound/cs42l52.h -- Platform data for CS42L52 + * + * Copyright (c) 2012 Cirrus Logic Inc. + * + * 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 __CS42L52_H +#define __CS42L52_H + +struct cs42l52_platform_data { + +	/* MICBIAS Level. Check datasheet Pg48 */ +	unsigned int micbias_lvl; + +	/* MICA mode selection 0=Single 1=Differential */ +	unsigned int mica_cfg; + +	/* MICB mode selection 0=Single 1=Differential */ +	unsigned int micb_cfg; + +	/* MICA Select 0=MIC1A 1=MIC2A */ +	unsigned int mica_sel; + +	/* MICB Select 0=MIC2A 1=MIC2B */ +	unsigned int micb_sel; + +	/* Charge Pump Freq. Check datasheet Pg73 */ +	unsigned int chgfreq; + +}; + +#endif /* __CS42L52_H */ diff --git a/include/sound/max98095.h b/include/sound/max98095.h index 7513a42dd4a..e87ae67b0a5 100644 --- a/include/sound/max98095.h +++ b/include/sound/max98095.h @@ -49,6 +49,18 @@ struct max98095_pdata {  	 */  	unsigned int digmic_left_mode:1;  	unsigned int digmic_right_mode:1; + +	/* Pin5 is the mechanical method of sensing jack insertion +	 * but it is something that might not be supported. +	 * 0 = PIN5 not supported +	 * 1 = PIN5 supported +	 */ +	unsigned int jack_detect_pin5en:1; + +	/* Slew amount for jack detection. Calculated as 4 * (delay + 1). +	 * Default delay is 24 to get a time of 100ms. +	 */ +	unsigned int jack_detect_delay;  };  #endif diff --git a/include/sound/sh_fsi.h b/include/sound/sh_fsi.h index b457e87fbd0..956e30e89ea 100644 --- a/include/sound/sh_fsi.h +++ b/include/sound/sh_fsi.h @@ -84,16 +84,4 @@ struct sh_fsi_platform_info {  	struct sh_fsi_port_info port_b;  }; -/* - * for fsi-ak4642 - */ -struct fsi_ak4642_info { -	const char *name; -	const char *card; -	const char *cpu_dai; -	const char *codec; -	const char *platform; -	int id; -}; -  #endif /* __SOUND_FSI_H */ diff --git a/include/sound/simple_card.h b/include/sound/simple_card.h new file mode 100644 index 00000000000..4b62b8dc6a4 --- /dev/null +++ b/include/sound/simple_card.h @@ -0,0 +1,38 @@ +/* + * ASoC simple sound card support + * + * Copyright (C) 2012 Renesas Solutions Corp. + * Kuninori Morimoto <kuninori.morimoto.gx@renesas.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 __SIMPLE_CARD_H +#define __SIMPLE_CARD_H + +#include <sound/soc.h> + +struct asoc_simple_dai_init_info { +	unsigned int fmt; +	unsigned int cpu_daifmt; +	unsigned int codec_daifmt; +	unsigned int sysclk; +}; + +struct asoc_simple_card_info { +	const char *name; +	const char *card; +	const char *cpu_dai; +	const char *codec; +	const char *platform; +	const char *codec_dai; +	struct asoc_simple_dai_init_info *init; /* for snd_link.init */ + +	/* used in simple-card.c */ +	struct snd_soc_dai_link snd_link; +	struct snd_soc_card snd_card; +}; + +#endif /* __SIMPLE_CARD_H */ diff --git a/include/sound/soc-dai.h b/include/sound/soc-dai.h index c429f248cf4..1f69e0af294 100644 --- a/include/sound/soc-dai.h +++ b/include/sound/soc-dai.h @@ -173,6 +173,8 @@ struct snd_soc_dai_ops {  		struct snd_soc_dai *);  	int (*trigger)(struct snd_pcm_substream *, int,  		struct snd_soc_dai *); +	int (*bespoke_trigger)(struct snd_pcm_substream *, int, +		struct snd_soc_dai *);  	/*  	 * For hardware based FIFO caused delay reporting.  	 * Optional. @@ -196,6 +198,7 @@ struct snd_soc_dai_driver {  	const char *name;  	unsigned int id;  	int ac97_control; +	unsigned int base;  	/* DAI driver callbacks */  	int (*probe)(struct snd_soc_dai *dai); @@ -241,6 +244,7 @@ struct snd_soc_dai {  	struct snd_soc_dapm_widget *playback_widget;  	struct snd_soc_dapm_widget *capture_widget; +	struct snd_soc_dapm_context dapm;  	/* DAI DMA data */  	void *playback_dma_data; diff --git a/include/sound/soc-dapm.h b/include/sound/soc-dapm.h index 8da3c240906..e3833d9f191 100644 --- a/include/sound/soc-dapm.h +++ b/include/sound/soc-dapm.h @@ -141,10 +141,6 @@ struct device;  {       .id = snd_soc_dapm_mixer, .name = wname, .reg = wreg, .shift = wshift, \  	.invert = winvert, .kcontrol_news = wcontrols, \  	.num_kcontrols = wncontrols, .event = wevent, .event_flags = wflags} -#define SND_SOC_DAPM_MICBIAS_E(wname, wreg, wshift, winvert, wevent, wflags) \ -{	.id = snd_soc_dapm_micbias, .name = wname, .reg = wreg, .shift = wshift, \ -	.invert = winvert, .kcontrol_news = NULL, .num_kcontrols = 0, \ -	.event = wevent, .event_flags = wflags}  #define SND_SOC_DAPM_SWITCH_E(wname, wreg, wshift, winvert, wcontrols, \  	wevent, wflags) \  {	.id = snd_soc_dapm_switch, .name = wname, .reg = wreg, .shift = wshift, \ @@ -324,6 +320,8 @@ struct snd_soc_dapm_path;  struct snd_soc_dapm_pin;  struct snd_soc_dapm_route;  struct snd_soc_dapm_context; +struct regulator; +struct snd_soc_dapm_widget_list;  int dapm_reg_event(struct snd_soc_dapm_widget *w,  		   struct snd_kcontrol *kcontrol, int event); @@ -359,6 +357,10 @@ int snd_soc_dapm_new_controls(struct snd_soc_dapm_context *dapm,  int snd_soc_dapm_new_dai_widgets(struct snd_soc_dapm_context *dapm,  				 struct snd_soc_dai *dai);  int snd_soc_dapm_link_dai_widgets(struct snd_soc_card *card); +int snd_soc_dapm_new_pcm(struct snd_soc_card *card, +			 const struct snd_soc_pcm_stream *params, +			 struct snd_soc_dapm_widget *source, +			 struct snd_soc_dapm_widget *sink);  /* dapm path setup */  int snd_soc_dapm_new_widgets(struct snd_soc_dapm_context *dapm); @@ -369,8 +371,8 @@ int snd_soc_dapm_weak_routes(struct snd_soc_dapm_context *dapm,  			     const struct snd_soc_dapm_route *route, int num);  /* dapm events */ -int snd_soc_dapm_stream_event(struct snd_soc_pcm_runtime *rtd, int stream, -			      struct snd_soc_dai *dai, int event); +void snd_soc_dapm_stream_event(struct snd_soc_pcm_runtime *rtd, int stream, +	int event);  void snd_soc_dapm_shutdown(struct snd_soc_card *card);  /* external DAPM widget events */ @@ -402,6 +404,10 @@ void snd_soc_dapm_auto_nc_codec_pins(struct snd_soc_codec *codec);  /* Mostly internal - should not normally be used */  void dapm_mark_dirty(struct snd_soc_dapm_widget *w, const char *reason); +/* dapm path query */ +int snd_soc_dapm_dai_get_connected_widgets(struct snd_soc_dai *dai, int stream, +	struct snd_soc_dapm_widget_list **list); +  /* dapm widget types */  enum snd_soc_dapm_type {  	snd_soc_dapm_input = 0,		/* input pin */ @@ -430,6 +436,12 @@ enum snd_soc_dapm_type {  	snd_soc_dapm_aif_out,		/* audio interface output */  	snd_soc_dapm_siggen,		/* signal generator */  	snd_soc_dapm_dai,		/* link to DAI structure */ +	snd_soc_dapm_dai_link,		/* link between two DAI structures */ +}; + +enum snd_soc_dapm_subclass { +	SND_SOC_DAPM_CLASS_INIT		= 0, +	SND_SOC_DAPM_CLASS_RUNTIME	= 1,  };  /* @@ -482,9 +494,11 @@ struct snd_soc_dapm_widget {  	struct snd_soc_dapm_context *dapm;  	void *priv;				/* widget specific data */ +	struct regulator *regulator;		/* attached regulator */ +	const struct snd_soc_pcm_stream *params; /* params for dai links */  	/* dapm control */ -	short reg;						/* negative reg = no direct dapm */ +	int reg;				/* negative reg = no direct dapm */  	unsigned char shift;			/* bits to shift */  	unsigned int saved_value;		/* widget saved value */  	unsigned int value;				/* widget current value */ diff --git a/include/sound/soc-dpcm.h b/include/sound/soc-dpcm.h new file mode 100644 index 00000000000..04598f1efd7 --- /dev/null +++ b/include/sound/soc-dpcm.h @@ -0,0 +1,138 @@ +/* + * linux/sound/soc-dpcm.h -- ALSA SoC Dynamic PCM Support + * + * Author:		Liam Girdwood <lrg@ti.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef __LINUX_SND_SOC_DPCM_H +#define __LINUX_SND_SOC_DPCM_H + +#include <linux/list.h> +#include <sound/pcm.h> + +struct snd_soc_pcm_runtime; + +/* + * Types of runtime_update to perform. e.g. originated from FE PCM ops + * or audio route changes triggered by muxes/mixers. + */ +enum snd_soc_dpcm_update { +	SND_SOC_DPCM_UPDATE_NO	= 0, +	SND_SOC_DPCM_UPDATE_BE, +	SND_SOC_DPCM_UPDATE_FE, +}; + +/* + * Dynamic PCM Frontend -> Backend link management states. + */ +enum snd_soc_dpcm_link_state { +	SND_SOC_DPCM_LINK_STATE_NEW	= 0,	/* newly created link */ +	SND_SOC_DPCM_LINK_STATE_FREE,		/* link to be dismantled */ +}; + +/* + * Dynamic PCM Frontend -> Backend link PCM states. + */ +enum snd_soc_dpcm_state { +	SND_SOC_DPCM_STATE_NEW	= 0, +	SND_SOC_DPCM_STATE_OPEN, +	SND_SOC_DPCM_STATE_HW_PARAMS, +	SND_SOC_DPCM_STATE_PREPARE, +	SND_SOC_DPCM_STATE_START, +	SND_SOC_DPCM_STATE_STOP, +	SND_SOC_DPCM_STATE_PAUSED, +	SND_SOC_DPCM_STATE_SUSPEND, +	SND_SOC_DPCM_STATE_HW_FREE, +	SND_SOC_DPCM_STATE_CLOSE, +}; + +/* + * Dynamic PCM trigger ordering. Triggering flexibility is required as some + * DSPs require triggering before/after their CPU platform and DAIs. + * + * i.e. some clients may want to manually order this call in their PCM + * trigger() whilst others will just use the regular core ordering. + */ +enum snd_soc_dpcm_trigger { +	SND_SOC_DPCM_TRIGGER_PRE		= 0, +	SND_SOC_DPCM_TRIGGER_POST, +	SND_SOC_DPCM_TRIGGER_BESPOKE, +}; + +/* + * Dynamic PCM link + * This links together a FE and BE DAI at runtime and stores the link + * state information and the hw_params configuration. + */ +struct snd_soc_dpcm { +	/* FE and BE DAIs*/ +	struct snd_soc_pcm_runtime *be; +	struct snd_soc_pcm_runtime *fe; + +	/* link state */ +	enum snd_soc_dpcm_link_state state; + +	/* list of BE and FE for this DPCM link */ +	struct list_head list_be; +	struct list_head list_fe; + +	/* hw params for this link - may be different for each link */ +	struct snd_pcm_hw_params hw_params; +#ifdef CONFIG_DEBUG_FS +	struct dentry *debugfs_state; +#endif +}; + +/* + * Dynamic PCM runtime data. + */ +struct snd_soc_dpcm_runtime { +	struct list_head be_clients; +	struct list_head fe_clients; + +	int users; +	struct snd_pcm_runtime *runtime; +	struct snd_pcm_hw_params hw_params; + +	/* state and update */ +	enum snd_soc_dpcm_update runtime_update; +	enum snd_soc_dpcm_state state; +}; + +/* can this BE stop and free */ +int snd_soc_dpcm_can_be_free_stop(struct snd_soc_pcm_runtime *fe, +		struct snd_soc_pcm_runtime *be, int stream); + +/* can this BE perform a hw_params() */ +int snd_soc_dpcm_can_be_params(struct snd_soc_pcm_runtime *fe, +		struct snd_soc_pcm_runtime *be, int stream); + +/* is the current PCM operation for this FE ? */ +int snd_soc_dpcm_fe_can_update(struct snd_soc_pcm_runtime *fe, int stream); + +/* is the current PCM operation for this BE ? */ +int snd_soc_dpcm_be_can_update(struct snd_soc_pcm_runtime *fe, +		struct snd_soc_pcm_runtime *be, int stream); + +/* get the substream for this BE */ +struct snd_pcm_substream * +	snd_soc_dpcm_get_substream(struct snd_soc_pcm_runtime *be, int stream); + +/* get the BE runtime state */ +enum snd_soc_dpcm_state +	snd_soc_dpcm_be_get_state(struct snd_soc_pcm_runtime *be, int stream); + +/* set the BE runtime state */ +void snd_soc_dpcm_be_set_state(struct snd_soc_pcm_runtime *be, int stream, +	enum snd_soc_dpcm_state state); + +/* internal use only */ +int soc_dpcm_be_digital_mute(struct snd_soc_pcm_runtime *fe, int mute); +int soc_dpcm_debugfs_add(struct snd_soc_pcm_runtime *rtd); +int soc_dpcm_runtime_update(struct snd_soc_dapm_widget *); + +#endif diff --git a/include/sound/soc.h b/include/sound/soc.h index 2ebf7877c14..c703871f5f6 100644 --- a/include/sound/soc.h +++ b/include/sound/soc.h @@ -55,6 +55,18 @@  	.info = snd_soc_info_volsw, .get = snd_soc_get_volsw,\  	.put = snd_soc_put_volsw, \  	.private_value =  SOC_SINGLE_VALUE(reg, shift, max, invert) } +#define SOC_SINGLE_SX_TLV(xname, xreg, xshift, xmin, xmax, tlv_array) \ +{       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \ +	.access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | \ +	SNDRV_CTL_ELEM_ACCESS_READWRITE, \ +	.tlv.p  = (tlv_array),\ +	.info = snd_soc_info_volsw, \ +	.get = snd_soc_get_volsw_sx,\ +	.put = snd_soc_put_volsw_sx, \ +	.private_value = (unsigned long)&(struct soc_mixer_control) \ +		{.reg = xreg, .rreg = xreg, \ +		.shift = xshift, .rshift = xshift, \ +		.max = xmax, .min = xmin} }  #define SOC_DOUBLE(xname, reg, shift_left, shift_right, max, invert) \  {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname),\  	.info = snd_soc_info_volsw, .get = snd_soc_get_volsw, \ @@ -85,6 +97,18 @@  	.get = snd_soc_get_volsw, .put = snd_soc_put_volsw, \  	.private_value = SOC_DOUBLE_R_VALUE(reg_left, reg_right, xshift, \  					    xmax, xinvert) } +#define SOC_DOUBLE_R_SX_TLV(xname, xreg, xrreg, xshift, xmin, xmax, tlv_array) \ +{       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname), \ +	.access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | \ +	SNDRV_CTL_ELEM_ACCESS_READWRITE, \ +	.tlv.p  = (tlv_array), \ +	.info = snd_soc_info_volsw, \ +	.get = snd_soc_get_volsw_sx, \ +	.put = snd_soc_put_volsw_sx, \ +	.private_value = (unsigned long)&(struct soc_mixer_control) \ +		{.reg = xreg, .rreg = xrreg, \ +		.shift = xshift, .rshift = xshift, \ +		.max = xmax, .min = xmin} }  #define SOC_DOUBLE_S8_TLV(xname, xreg, xmin, xmax, tlv_array) \  {	.iface  = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname), \  	.access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | \ @@ -171,20 +195,6 @@  	.get = xhandler_get, .put = xhandler_put, \  	.private_value = (unsigned long)&xenum } -#define SOC_DOUBLE_R_SX_TLV(xname, xreg_left, xreg_right, xshift,\ -		xmin, xmax, tlv_array) \ -{	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname), \ -	.access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | \ -		  SNDRV_CTL_ELEM_ACCESS_READWRITE, \ -	.tlv.p = (tlv_array), \ -	.info = snd_soc_info_volsw_2r_sx, \ -	.get = snd_soc_get_volsw_2r_sx, \ -	.put = snd_soc_put_volsw_2r_sx, \ -	.private_value = (unsigned long)&(struct soc_mixer_control) \ -		{.reg = xreg_left, \ -		 .rreg = xreg_right, .shift = xshift, \ -		 .min = xmin, .max = xmax} } -  #define SND_SOC_BYTES(xname, xbase, xregs)		      \  {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname,   \  	.info = snd_soc_bytes_info, .get = snd_soc_bytes_get, \ @@ -200,6 +210,19 @@  		{.base = xbase, .num_regs = xregs,	      \  		 .mask = xmask }) } +#define SOC_SINGLE_XR_SX(xname, xregbase, xregcount, xnbits, \ +		xmin, xmax, xinvert) \ +{	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname), \ +	.info = snd_soc_info_xr_sx, .get = snd_soc_get_xr_sx, \ +	.put = snd_soc_put_xr_sx, \ +	.private_value = (unsigned long)&(struct soc_mreg_control) \ +		{.regbase = xregbase, .regcount = xregcount, .nbits = xnbits, \ +		.invert = xinvert, .min = xmin, .max = xmax} } + +#define SOC_SINGLE_STROBE(xname, xreg, xshift, xinvert) \ +	SOC_SINGLE_EXT(xname, xreg, xshift, 1, xinvert, \ +		snd_soc_get_strobe, snd_soc_put_strobe) +  /*   * Simplified versions of above macros, declaring a struct and calculating   * ARRAY_SIZE internally @@ -264,6 +287,7 @@ struct snd_soc_jack_zone;  struct snd_soc_jack_pin;  struct snd_soc_cache_ops;  #include <sound/soc-dapm.h> +#include <sound/soc-dpcm.h>  #ifdef CONFIG_GPIOLIB  struct snd_soc_jack_gpio; @@ -288,6 +312,11 @@ enum snd_soc_pcm_subclass {  	SND_SOC_PCM_CLASS_BE	= 1,  }; +enum snd_soc_card_subclass { +	SND_SOC_CARD_CLASS_INIT		= 0, +	SND_SOC_CARD_CLASS_RUNTIME	= 1, +}; +  int snd_soc_codec_set_sysclk(struct snd_soc_codec *codec, int clk_id,  			     int source, unsigned int freq, int dir);  int snd_soc_codec_set_pll(struct snd_soc_codec *codec, int pll_id, int source, @@ -333,6 +362,11 @@ int snd_soc_platform_write(struct snd_soc_platform *platform,  					unsigned int reg, unsigned int val);  int soc_new_pcm(struct snd_soc_pcm_runtime *rtd, int num); +struct snd_pcm_substream *snd_soc_get_dai_substream(struct snd_soc_card *card, +		const char *dai_link, int stream); +struct snd_soc_pcm_runtime *snd_soc_get_pcm_runtime(struct snd_soc_card *card, +		const char *dai_link); +  /* Utility functions to get clock rates from various things */  int snd_soc_calc_frame_size(int sample_size, int channels, int tdm_slots);  int snd_soc_params_to_frame_size(struct snd_pcm_hw_params *params); @@ -343,6 +377,9 @@ int snd_soc_params_to_bclk(struct snd_pcm_hw_params *parms);  int snd_soc_set_runtime_hwparams(struct snd_pcm_substream *substream,  	const struct snd_pcm_hardware *hw); +int snd_soc_platform_trigger(struct snd_pcm_substream *substream, +		int cmd, struct snd_soc_platform *platform); +  /* Jack reporting */  int snd_soc_jack_new(struct snd_soc_codec *codec, const char *id, int type,  		     struct snd_soc_jack *jack); @@ -413,6 +450,10 @@ int snd_soc_put_volsw(struct snd_kcontrol *kcontrol,  	struct snd_ctl_elem_value *ucontrol);  #define snd_soc_get_volsw_2r snd_soc_get_volsw  #define snd_soc_put_volsw_2r snd_soc_put_volsw +int snd_soc_get_volsw_sx(struct snd_kcontrol *kcontrol, +	struct snd_ctl_elem_value *ucontrol); +int snd_soc_put_volsw_sx(struct snd_kcontrol *kcontrol, +	struct snd_ctl_elem_value *ucontrol);  int snd_soc_info_volsw_s8(struct snd_kcontrol *kcontrol,  	struct snd_ctl_elem_info *uinfo);  int snd_soc_get_volsw_s8(struct snd_kcontrol *kcontrol, @@ -421,19 +462,22 @@ int snd_soc_put_volsw_s8(struct snd_kcontrol *kcontrol,  	struct snd_ctl_elem_value *ucontrol);  int snd_soc_limit_volume(struct snd_soc_codec *codec,  	const char *name, int max); -int snd_soc_info_volsw_2r_sx(struct snd_kcontrol *kcontrol, -	struct snd_ctl_elem_info *uinfo); -int snd_soc_get_volsw_2r_sx(struct snd_kcontrol *kcontrol, -	struct snd_ctl_elem_value *ucontrol); -int snd_soc_put_volsw_2r_sx(struct snd_kcontrol *kcontrol, -	struct snd_ctl_elem_value *ucontrol);  int snd_soc_bytes_info(struct snd_kcontrol *kcontrol,  		       struct snd_ctl_elem_info *uinfo);  int snd_soc_bytes_get(struct snd_kcontrol *kcontrol,  		      struct snd_ctl_elem_value *ucontrol);  int snd_soc_bytes_put(struct snd_kcontrol *kcontrol,  		      struct snd_ctl_elem_value *ucontrol); - +int snd_soc_info_xr_sx(struct snd_kcontrol *kcontrol, +	struct snd_ctl_elem_info *uinfo); +int snd_soc_get_xr_sx(struct snd_kcontrol *kcontrol, +	struct snd_ctl_elem_value *ucontrol); +int snd_soc_put_xr_sx(struct snd_kcontrol *kcontrol, +	struct snd_ctl_elem_value *ucontrol); +int snd_soc_get_strobe(struct snd_kcontrol *kcontrol, +	struct snd_ctl_elem_value *ucontrol); +int snd_soc_put_strobe(struct snd_kcontrol *kcontrol, +	struct snd_ctl_elem_value *ucontrol);  /**   * struct snd_soc_reg_access - Describes whether a given register is @@ -513,6 +557,7 @@ struct snd_soc_jack_gpio {  #endif  struct snd_soc_jack { +	struct mutex mutex;  	struct snd_jack *jack;  	struct snd_soc_codec *codec;  	struct list_head pins; @@ -711,6 +756,7 @@ struct snd_soc_platform_driver {  	/* platform IO - used for platform DAPM */  	unsigned int (*read)(struct snd_soc_platform *, unsigned int);  	int (*write)(struct snd_soc_platform *, unsigned int, unsigned int); +	int (*bespoke_trigger)(struct snd_pcm_substream *, int);  };  struct snd_soc_platform { @@ -746,21 +792,36 @@ struct snd_soc_dai_link {  	const char *cpu_dai_name;  	const struct device_node *cpu_dai_of_node;  	const char *codec_dai_name; +	int be_id;	/* optional ID for machine driver BE identification */ + +	const struct snd_soc_pcm_stream *params;  	unsigned int dai_fmt;           /* format to set on init */ +	enum snd_soc_dpcm_trigger trigger[2]; /* trigger type for DPCM */ +  	/* Keep DAI active over suspend */  	unsigned int ignore_suspend:1;  	/* Symmetry requirements */  	unsigned int symmetric_rates:1; +	/* Do not create a PCM for this DAI link (Backend link) */ +	unsigned int no_pcm:1; + +	/* This DAI link can route to other DAI links at runtime (Frontend)*/ +	unsigned int dynamic:1; +  	/* pmdown_time is ignored at stop */  	unsigned int ignore_pmdown_time:1;  	/* codec/machine specific init - e.g. add machine controls */  	int (*init)(struct snd_soc_pcm_runtime *rtd); +	/* optional hw_params re-writing for BE and FE sync */ +	int (*be_hw_params_fixup)(struct snd_soc_pcm_runtime *rtd, +			struct snd_pcm_hw_params *params); +  	/* machine stream operations */  	struct snd_soc_ops *ops;  }; @@ -800,6 +861,7 @@ struct snd_soc_card {  	struct list_head list;  	struct mutex mutex; +	struct mutex dapm_mutex;  	bool instantiated; @@ -889,9 +951,11 @@ struct snd_soc_pcm_runtime {  	enum snd_soc_pcm_subclass pcm_subclass;  	struct snd_pcm_ops ops; -	unsigned int complete:1;  	unsigned int dev_registered:1; +	/* Dynamic PCM BE runtime data */ +	struct snd_soc_dpcm_runtime dpcm[2]; +  	long pmdown_time;  	/* runtime devices */ @@ -902,6 +966,10 @@ struct snd_soc_pcm_runtime {  	struct snd_soc_dai *cpu_dai;  	struct delayed_work delayed_work; +#ifdef CONFIG_DEBUG_FS +	struct dentry *debugfs_dpcm_root; +	struct dentry *debugfs_dpcm_state; +#endif  };  /* mixer control */ @@ -916,6 +984,12 @@ struct soc_bytes {  	u32 mask;  }; +/* multi register control */ +struct soc_mreg_control { +	long min, max; +	unsigned int regbase, regcount, nbits, invert; +}; +  /* enumerated kcontrol */  struct soc_enum {  	unsigned short reg; diff --git a/include/trace/events/asoc.h b/include/trace/events/asoc.h index ab26f8aa3c7..5fc2dcdd21c 100644 --- a/include/trace/events/asoc.h +++ b/include/trace/events/asoc.h @@ -7,6 +7,8 @@  #include <linux/ktime.h>  #include <linux/tracepoint.h> +#define DAPM_DIRECT "(direct)" +  struct snd_soc_jack;  struct snd_soc_codec;  struct snd_soc_platform; @@ -241,6 +243,84 @@ TRACE_EVENT(snd_soc_dapm_walk_done,  		  (int)__entry->path_checks, (int)__entry->neighbour_checks)  ); +TRACE_EVENT(snd_soc_dapm_output_path, + +	TP_PROTO(struct snd_soc_dapm_widget *widget, +		struct snd_soc_dapm_path *path), + +	TP_ARGS(widget, path), + +	TP_STRUCT__entry( +		__string(	wname,	widget->name		) +		__string(	pname,	path->name ? path->name : DAPM_DIRECT) +		__string(	psname,	path->sink->name	) +		__field(	int,	path_sink		) +		__field(	int,	path_connect		) +	), + +	TP_fast_assign( +		__assign_str(wname, widget->name); +		__assign_str(pname, path->name ? path->name : DAPM_DIRECT); +		__assign_str(psname, path->sink->name); +		__entry->path_connect = path->connect; +		__entry->path_sink = (long)path->sink; +	), + +	TP_printk("%c%s -> %s -> %s\n", +		(int) __entry->path_sink && +		(int) __entry->path_connect ? '*' : ' ', +		__get_str(wname), __get_str(pname), __get_str(psname)) +); + +TRACE_EVENT(snd_soc_dapm_input_path, + +	TP_PROTO(struct snd_soc_dapm_widget *widget, +		struct snd_soc_dapm_path *path), + +	TP_ARGS(widget, path), + +	TP_STRUCT__entry( +		__string(	wname,	widget->name		) +		__string(	pname,	path->name ? path->name : DAPM_DIRECT) +		__string(	psname,	path->source->name	) +		__field(	int,	path_source		) +		__field(	int,	path_connect		) +	), + +	TP_fast_assign( +		__assign_str(wname, widget->name); +		__assign_str(pname, path->name ? path->name : DAPM_DIRECT); +		__assign_str(psname, path->source->name); +		__entry->path_connect = path->connect; +		__entry->path_source = (long)path->source; +	), + +	TP_printk("%c%s <- %s <- %s\n", +		(int) __entry->path_source && +		(int) __entry->path_connect ? '*' : ' ', +		__get_str(wname), __get_str(pname), __get_str(psname)) +); + +TRACE_EVENT(snd_soc_dapm_connected, + +	TP_PROTO(int paths, int stream), + +	TP_ARGS(paths, stream), + +	TP_STRUCT__entry( +		__field(	int,	paths		) +		__field(	int,	stream		) +	), + +	TP_fast_assign( +		__entry->paths = paths; +		__entry->stream = stream; +	), + +	TP_printk("%s: found %d paths\n", +		__entry->stream ? "capture" : "playback", __entry->paths) +); +  TRACE_EVENT(snd_soc_jack_irq,  	TP_PROTO(const char *name), diff --git a/include/trace/events/sched.h b/include/trace/events/sched.h index fbc7b1ad929..ea7a2035456 100644 --- a/include/trace/events/sched.h +++ b/include/trace/events/sched.h @@ -295,7 +295,7 @@ TRACE_EVENT(sched_process_exec,  	TP_fast_assign(  		__assign_str(filename, bprm->filename);  		__entry->pid		= p->pid; -		__entry->old_pid	= p->pid; +		__entry->old_pid	= old_pid;  	),  	TP_printk("filename=%s pid=%d old_pid=%d", __get_str(filename), diff --git a/include/xen/swiotlb-xen.h b/include/xen/swiotlb-xen.h index 2ea2fdc79c1..4f4d449f00f 100644 --- a/include/xen/swiotlb-xen.h +++ b/include/xen/swiotlb-xen.h @@ -7,11 +7,13 @@ extern void xen_swiotlb_init(int verbose);  extern void  *xen_swiotlb_alloc_coherent(struct device *hwdev, size_t size, -			    dma_addr_t *dma_handle, gfp_t flags); +			    dma_addr_t *dma_handle, gfp_t flags, +			    struct dma_attrs *attrs);  extern void  xen_swiotlb_free_coherent(struct device *hwdev, size_t size, -			  void *vaddr, dma_addr_t dma_handle); +			  void *vaddr, dma_addr_t dma_handle, +			  struct dma_attrs *attrs);  extern dma_addr_t xen_swiotlb_map_page(struct device *dev, struct page *page,  				       unsigned long offset, size_t size,  |