diff options
Diffstat (limited to 'include/linux')
491 files changed, 19769 insertions, 3998 deletions
diff --git a/include/linux/Kbuild b/include/linux/Kbuild index 756f831cbdd..2fc8e14cc24 100644 --- a/include/linux/Kbuild +++ b/include/linux/Kbuild @@ -43,6 +43,7 @@ header-y += blkpg.h  header-y += bpqether.h  header-y += bsg.h  header-y += can.h +header-y += cciss_defs.h  header-y += cdk.h  header-y += chio.h  header-y += coda_psdev.h @@ -93,6 +94,7 @@ header-y += if_ppp.h  header-y += if_slip.h  header-y += if_strip.h  header-y += if_tun.h +header-y += if_x25.h  header-y += in_route.h  header-y += ioctl.h  header-y += ip6_tunnel.h @@ -125,6 +127,7 @@ header-y += nfs2.h  header-y += nfs4_mount.h  header-y += nfs_mount.h  header-y += nl80211.h +header-y += omapfb.h  header-y += param.h  header-y += pci_regs.h  header-y += perf_event.h @@ -362,6 +365,7 @@ unifdef-y += uio.h  unifdef-y += unistd.h  unifdef-y += usbdevice_fs.h  unifdef-y += utsname.h +unifdef-y += vhost.h  unifdef-y += videodev2.h  unifdef-y += videodev.h  unifdef-y += virtio_config.h diff --git a/include/linux/acct.h b/include/linux/acct.h index 882dc724876..3e4737fa6cc 100644 --- a/include/linux/acct.h +++ b/include/linux/acct.h @@ -121,16 +121,15 @@ struct vfsmount;  struct super_block;  struct pacct_struct;  struct pid_namespace; +extern int acct_parm[]; /* for sysctl */  extern void acct_auto_close_mnt(struct vfsmount *m);  extern void acct_auto_close(struct super_block *sb); -extern void acct_init_pacct(struct pacct_struct *pacct);  extern void acct_collect(long exitcode, int group_dead);  extern void acct_process(void);  extern void acct_exit_ns(struct pid_namespace *);  #else  #define acct_auto_close_mnt(x)	do { } while (0)  #define acct_auto_close(x)	do { } while (0) -#define acct_init_pacct(x)	do { } while (0)  #define acct_collect(x,y)	do { } while (0)  #define acct_process()		do { } while (0)  #define acct_exit_ns(ns)	do { } while (0) diff --git a/include/linux/acpi.h b/include/linux/acpi.h index b926afe8c03..224a38c960d 100644 --- a/include/linux/acpi.h +++ b/include/linux/acpi.h @@ -116,11 +116,12 @@ extern unsigned long acpi_realmode_flags;  int acpi_register_gsi (struct device *dev, u32 gsi, int triggering, int polarity);  int acpi_gsi_to_irq (u32 gsi, unsigned int *irq); +int acpi_isa_irq_to_gsi (unsigned isa_irq, u32 *gsi);  #ifdef CONFIG_X86_IO_APIC -extern int acpi_get_override_irq(int bus_irq, int *trigger, int *polarity); +extern int acpi_get_override_irq(u32 gsi, int *trigger, int *polarity);  #else -#define acpi_get_override_irq(bus, trigger, polarity) (-1) +#define acpi_get_override_irq(gsi, trigger, polarity) (-1)  #endif  /*   * This function undoes the effect of one call to acpi_register_gsi(). @@ -247,11 +248,12 @@ int acpi_check_region(resource_size_t start, resource_size_t n,  int acpi_check_mem_region(resource_size_t start, resource_size_t n,  		      const char *name); +int acpi_resources_are_enforced(void); +  #ifdef CONFIG_PM_SLEEP  void __init acpi_no_s4_hw_signature(void);  void __init acpi_old_suspend_ordering(void);  void __init acpi_s4_no_nvs(void); -void __init acpi_set_sci_en_on_resume(void);  #endif /* CONFIG_PM_SLEEP */  struct acpi_osc_context { diff --git a/include/linux/ahci_platform.h b/include/linux/ahci_platform.h new file mode 100644 index 00000000000..f7dd576dd5a --- /dev/null +++ b/include/linux/ahci_platform.h @@ -0,0 +1,29 @@ +/* + * AHCI SATA platform driver + * + * Copyright 2004-2005  Red Hat, Inc. + *   Jeff Garzik <jgarzik@pobox.com> + * Copyright 2010  MontaVista Software, LLC. + *   Anton Vorontsov <avorontsov@ru.mvista.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + */ + +#ifndef _AHCI_PLATFORM_H +#define _AHCI_PLATFORM_H + +struct device; +struct ata_port_info; + +struct ahci_platform_data { +	int (*init)(struct device *dev); +	void (*exit)(struct device *dev); +	const struct ata_port_info *ata_port_info; +	unsigned int force_port_map; +	unsigned int mask_port_map; +}; + +#endif /* _AHCI_PLATFORM_H */ diff --git a/include/linux/aio.h b/include/linux/aio.h index 811dbb36937..7a8db415528 100644 --- a/include/linux/aio.h +++ b/include/linux/aio.h @@ -212,6 +212,8 @@ extern void kick_iocb(struct kiocb *iocb);  extern int aio_complete(struct kiocb *iocb, long res, long res2);  struct mm_struct;  extern void exit_aio(struct mm_struct *mm); +extern long do_io_submit(aio_context_t ctx_id, long nr, +			 struct iocb __user *__user *iocbpp, bool compat);  #else  static inline ssize_t wait_on_sync_kiocb(struct kiocb *iocb) { return 0; }  static inline int aio_put_req(struct kiocb *iocb) { return 0; } @@ -219,6 +221,9 @@ static inline void kick_iocb(struct kiocb *iocb) { }  static inline int aio_complete(struct kiocb *iocb, long res, long res2) { return 0; }  struct mm_struct;  static inline void exit_aio(struct mm_struct *mm) { } +static inline long do_io_submit(aio_context_t ctx_id, long nr, +				struct iocb __user * __user *iocbpp, +				bool compat) { return 0; }  #endif /* CONFIG_AIO */  static inline struct kiocb *list_kiocb(struct list_head *h) diff --git a/include/linux/altera_jtaguart.h b/include/linux/altera_jtaguart.h new file mode 100644 index 00000000000..953b178a165 --- /dev/null +++ b/include/linux/altera_jtaguart.h @@ -0,0 +1,16 @@ +/* + * altera_jtaguart.h -- Altera JTAG UART driver defines. + */ + +#ifndef	__ALTJUART_H +#define	__ALTJUART_H + +#define ALTERA_JTAGUART_MAJOR	204 +#define ALTERA_JTAGUART_MINOR	186 + +struct altera_jtaguart_platform_uart { +	unsigned long mapbase;	/* Physical address base */ +	unsigned int irq;	/* Interrupt vector */ +}; + +#endif /* __ALTJUART_H */ diff --git a/include/linux/altera_uart.h b/include/linux/altera_uart.h new file mode 100644 index 00000000000..8d441064a30 --- /dev/null +++ b/include/linux/altera_uart.h @@ -0,0 +1,14 @@ +/* + * altera_uart.h -- Altera UART driver defines. + */ + +#ifndef	__ALTUART_H +#define	__ALTUART_H + +struct altera_uart_platform_uart { +	unsigned long mapbase;	/* Physical address base */ +	unsigned int irq;	/* Interrupt vector */ +	unsigned int uartclk;	/* UART clock rate */ +}; + +#endif /* __ALTUART_H */ diff --git a/include/linux/amba/bus.h b/include/linux/amba/bus.h index ab94335b4bb..8b103860783 100644 --- a/include/linux/amba/bus.h +++ b/include/linux/amba/bus.h @@ -1,5 +1,9 @@  /* - *  linux/include/asm-arm/hardware/amba.h + *  linux/include/amba/bus.h + * + *  This device type deals with ARM PrimeCells and anything else that + *  presents a proper CID (0xB105F00D) at the end of the I/O register + *  region or that is derived from a PrimeCell.   *   *  Copyright (C) 2003 Deep Blue Solutions Ltd, All Rights Reserved.   * @@ -10,6 +14,9 @@  #ifndef ASMARM_AMBA_H  #define ASMARM_AMBA_H +#include <linux/device.h> +#include <linux/resource.h> +  #define AMBA_NR_IRQS	2  struct amba_device { diff --git a/include/linux/amba/clcd.h b/include/linux/amba/clcd.h index 29c0448265c..ca16c3801a1 100644 --- a/include/linux/amba/clcd.h +++ b/include/linux/amba/clcd.h @@ -21,22 +21,21 @@  #define CLCD_UBAS 		0x00000010  #define CLCD_LBAS 		0x00000014 -#if !defined(CONFIG_ARCH_VERSATILE) && !defined(CONFIG_ARCH_REALVIEW) -#define CLCD_IENB 		0x00000018 -#define CLCD_CNTL 		0x0000001c -#else -/* - * Someone rearranged these two registers on the Versatile - * platform... - */ -#define CLCD_IENB 		0x0000001c -#define CLCD_CNTL 		0x00000018 -#endif +#define CLCD_PL110_IENB		0x00000018 +#define CLCD_PL110_CNTL		0x0000001c +#define CLCD_PL110_STAT		0x00000020 +#define CLCD_PL110_INTR 	0x00000024 +#define CLCD_PL110_UCUR		0x00000028 +#define CLCD_PL110_LCUR		0x0000002C + +#define CLCD_PL111_CNTL		0x00000018 +#define CLCD_PL111_IENB		0x0000001c +#define CLCD_PL111_RIS		0x00000020 +#define CLCD_PL111_MIS		0x00000024 +#define CLCD_PL111_ICR		0x00000028 +#define CLCD_PL111_UCUR		0x0000002c +#define CLCD_PL111_LCUR		0x00000030 -#define CLCD_STAT 		0x00000020 -#define CLCD_INTR 		0x00000024 -#define CLCD_UCUR 		0x00000028 -#define CLCD_LCUR 		0x0000002C  #define CLCD_PALL 		0x00000200  #define CLCD_PALETTE		0x00000200 @@ -147,6 +146,8 @@ struct clcd_fb {  	struct clcd_board	*board;  	void			*board_data;  	void __iomem		*regs; +	u16			off_ienb; +	u16			off_cntl;  	u32			clcd_cntl;  	u32			cmap[16];  }; diff --git a/include/linux/amba/mmci.h b/include/linux/amba/mmci.h index 6b4241748dd..7e466fe7202 100644 --- a/include/linux/amba/mmci.h +++ b/include/linux/amba/mmci.h @@ -6,8 +6,29 @@  #include <linux/mmc/host.h> +/** + * struct mmci_platform_data - platform configuration for the MMCI + * (also known as PL180) block. + * @f_max: the maximum operational frequency for this host in this + * platform configuration. When this is specified it takes precedence + * over the module parameter for the same frequency. + * @ocr_mask: available voltages on the 4 pins from the block, this + * is ignored if a regulator is used, see the MMC_VDD_* masks in + * mmc/host.h + * @translate_vdd: a callback function to translate a MMC_VDD_* + * mask into a value to be binary or:ed and written into the + * MMCIPWR register of the block + * @status: if no GPIO read function was given to the block in + * gpio_wp (below) this function will be called to determine + * whether a card is present in the MMC slot or not + * @gpio_wp: read this GPIO pin to see if the card is write protected + * @gpio_cd: read this GPIO pin to detect card insertion + * @capabilities: the capabilities of the block as implemented in + * this platform, signify anything MMC_CAP_* from mmc/host.h + */  struct mmci_platform_data { -	unsigned int ocr_mask;			/* available voltages */ +	unsigned int f_max; +	unsigned int ocr_mask;  	u32 (*translate_vdd)(struct device *, unsigned int);  	unsigned int (*status)(struct device *);  	int	gpio_wp; diff --git a/include/linux/amba/pl022.h b/include/linux/amba/pl022.h index e4836c6b3dd..abf26cc47a2 100644 --- a/include/linux/amba/pl022.h +++ b/include/linux/amba/pl022.h @@ -71,6 +71,7 @@ struct ssp_clock_params {  /**   * enum ssp_rx_endian - endianess of Rx FIFO Data + * this feature is only available in ST versionf of PL022   */  enum ssp_rx_endian {  	SSP_RX_MSB, @@ -181,7 +182,8 @@ enum ssp_microwire_wait_state {  };  /** - * enum Microwire - whether Full/Half Duplex + * enum ssp_duplex - whether Full/Half Duplex on microwire, only + * available in the ST Micro variant.   * @SSP_MICROWIRE_CHANNEL_FULL_DUPLEX: SSPTXD becomes bi-directional,   *     SSPRXD not used   * @SSP_MICROWIRE_CHANNEL_HALF_DUPLEX: SSPTXD is an output, SSPRXD is @@ -193,6 +195,31 @@ enum ssp_duplex {  };  /** + * enum ssp_clkdelay - an optional clock delay on the feedback clock + * only available in the ST Micro PL023 variant. + * @SSP_FEEDBACK_CLK_DELAY_NONE: no delay, the data coming in from the + * slave is sampled directly + * @SSP_FEEDBACK_CLK_DELAY_1T: the incoming slave data is sampled with + * a delay of T-dt + * @SSP_FEEDBACK_CLK_DELAY_2T: dito with a delay if 2T-dt + * @SSP_FEEDBACK_CLK_DELAY_3T: dito with a delay if 3T-dt + * @SSP_FEEDBACK_CLK_DELAY_4T: dito with a delay if 4T-dt + * @SSP_FEEDBACK_CLK_DELAY_5T: dito with a delay if 5T-dt + * @SSP_FEEDBACK_CLK_DELAY_6T: dito with a delay if 6T-dt + * @SSP_FEEDBACK_CLK_DELAY_7T: dito with a delay if 7T-dt + */ +enum ssp_clkdelay { +	SSP_FEEDBACK_CLK_DELAY_NONE, +	SSP_FEEDBACK_CLK_DELAY_1T, +	SSP_FEEDBACK_CLK_DELAY_2T, +	SSP_FEEDBACK_CLK_DELAY_3T, +	SSP_FEEDBACK_CLK_DELAY_4T, +	SSP_FEEDBACK_CLK_DELAY_5T, +	SSP_FEEDBACK_CLK_DELAY_6T, +	SSP_FEEDBACK_CLK_DELAY_7T +}; + +/**   * CHIP select/deselect commands   */  enum ssp_chip_select { @@ -235,6 +262,8 @@ struct pl022_ssp_controller {   * @ctrl_len: Microwire interface: Control length   * @wait_state: Microwire interface: Wait state   * @duplex: Microwire interface: Full/Half duplex + * @clkdelay: on the PL023 variant, the delay in feeback clock cycles + * before sampling the incoming line   * @cs_control: function pointer to board-specific function to   * assert/deassert I/O port to control HW generation of devices chip-select.   * @dma_xfer_type: Type of DMA xfer (Mem-to-periph or Periph-to-Periph) @@ -258,6 +287,7 @@ struct pl022_config_chip {  	enum ssp_microwire_ctrl_len ctrl_len;  	enum ssp_microwire_wait_state wait_state;  	enum ssp_duplex duplex; +	enum ssp_clkdelay clkdelay;  	void (*cs_control) (u32 control);  }; diff --git a/include/linux/amba/pl061.h b/include/linux/amba/pl061.h index b4fbd986260..5ddd9ad4b19 100644 --- a/include/linux/amba/pl061.h +++ b/include/linux/amba/pl061.h @@ -1,3 +1,5 @@ +#include <linux/types.h> +  /* platform data for the PL061 GPIO driver */  struct pl061_platform_data { diff --git a/include/linux/amba/pl330.h b/include/linux/amba/pl330.h new file mode 100644 index 00000000000..cbee7de7dd3 --- /dev/null +++ b/include/linux/amba/pl330.h @@ -0,0 +1,45 @@ +/* linux/include/linux/amba/pl330.h + * + * Copyright (C) 2010 Samsung Electronics Co. Ltd. + *	Jaswinder Singh <jassi.brar@samsung.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + */ + +#ifndef	__AMBA_PL330_H_ +#define	__AMBA_PL330_H_ + +#include <asm/hardware/pl330.h> + +struct dma_pl330_peri { +	/* +	 * Peri_Req i/f of the DMAC that is +	 * peripheral could be reached from. +	 */ +	u8 peri_id; /* {0, 31} */ +	enum pl330_reqtype rqtype; + +	/* For M->D and D->M Channels */ +	int burst_sz; /* in power of 2 */ +	dma_addr_t fifo_addr; +}; + +struct dma_pl330_platdata { +	/* +	 * Number of valid peripherals connected to DMAC. +	 * This may be different from the value read from +	 * CR0, as the PL330 implementation might have 'holes' +	 * in the peri list or the peri could also be reached +	 * from another DMAC which the platform prefers. +	 */ +	u8 nr_valid_peri; +	/* Array of valid peripherals */ +	struct dma_pl330_peri *peri; +	/* Bytes to allocate for MC buffer */ +	unsigned mcbuf_sz; +}; + +#endif	/* __AMBA_PL330_H_ */ diff --git a/include/linux/ata.h b/include/linux/ata.h index 38a6948ce0c..fe6e681a9d7 100644 --- a/include/linux/ata.h +++ b/include/linux/ata.h @@ -467,7 +467,7 @@ enum ata_ioctls {  /* core structures */ -struct ata_prd { +struct ata_bmdma_prd {  	__le32			addr;  	__le32			flags_len;  }; @@ -647,9 +647,9 @@ static inline int ata_id_has_large_logical_sectors(const u16 *id)  	return id[ATA_ID_SECTOR_SIZE] & (1 << 13);  } -static inline u8 ata_id_logical_per_physical_sectors(const u16 *id) +static inline u16 ata_id_logical_per_physical_sectors(const u16 *id)  { -	return id[ATA_ID_SECTOR_SIZE] & 0xf; +	return 1 << (id[ATA_ID_SECTOR_SIZE] & 0xf);  }  static inline int ata_id_has_lba48(const u16 *id) @@ -841,7 +841,8 @@ static inline int ata_id_current_chs_valid(const u16 *id)  static inline int ata_id_is_cfa(const u16 *id)  { -	if (id[ATA_ID_CONFIG] == 0x848A)	/* Traditional CF */ +	if ((id[ATA_ID_CONFIG] == 0x848A) ||	/* Traditional CF */ +	    (id[ATA_ID_CONFIG] == 0x844A))	/* Delkin Devices CF */  		return 1;  	/*  	 * CF specs don't require specific value in the word 0 anymore and yet @@ -1024,8 +1025,8 @@ static inline int ata_ok(u8 status)  static inline int lba_28_ok(u64 block, u32 n_block)  { -	/* check the ending block number */ -	return ((block + n_block) < ((u64)1 << 28)) && (n_block <= 256); +	/* check the ending block number: must be LESS THAN 0x0fffffff */ +	return ((block + n_block) < ((1 << 28) - 1)) && (n_block <= 256);  }  static inline int lba_48_ok(u64 block, u32 n_block) diff --git a/include/linux/audit.h b/include/linux/audit.h index 3c7a358241a..f391d45c8ae 100644 --- a/include/linux/audit.h +++ b/include/linux/audit.h @@ -424,7 +424,7 @@ extern void audit_syscall_exit(int failed, long return_code);  extern void __audit_getname(const char *name);  extern void audit_putname(const char *name);  extern void __audit_inode(const char *name, const struct dentry *dentry); -extern void __audit_inode_child(const char *dname, const struct dentry *dentry, +extern void __audit_inode_child(const struct dentry *dentry,  				const struct inode *parent);  extern void __audit_ptrace(struct task_struct *t); @@ -442,11 +442,10 @@ static inline void audit_inode(const char *name, const struct dentry *dentry) {  	if (unlikely(!audit_dummy_context()))  		__audit_inode(name, dentry);  } -static inline void audit_inode_child(const char *dname,  -				     const struct dentry *dentry, +static inline void audit_inode_child(const struct dentry *dentry,  				     const struct inode *parent) {  	if (unlikely(!audit_dummy_context())) -		__audit_inode_child(dname, dentry, parent); +		__audit_inode_child(dentry, parent);  }  void audit_core_dumps(long signr); @@ -544,9 +543,9 @@ extern int audit_signals;  #define audit_getname(n) do { ; } while (0)  #define audit_putname(n) do { ; } while (0)  #define __audit_inode(n,d) do { ; } while (0) -#define __audit_inode_child(d,i,p) do { ; } while (0) +#define __audit_inode_child(i,p) do { ; } while (0)  #define audit_inode(n,d) do { ; } while (0) -#define audit_inode_child(d,i,p) do { ; } while (0) +#define audit_inode_child(i,p) do { ; } while (0)  #define audit_core_dumps(i) do { ; } while (0)  #define auditsc_get_stamp(c,t,s) (0)  #define audit_get_loginuid(t) (-1) diff --git a/include/linux/backing-dev.h b/include/linux/backing-dev.h index fcbc26af00e..e6e0cb5437e 100644 --- a/include/linux/backing-dev.h +++ b/include/linux/backing-dev.h @@ -14,6 +14,7 @@  #include <linux/kernel.h>  #include <linux/fs.h>  #include <linux/sched.h> +#include <linux/timer.h>  #include <linux/writeback.h>  #include <asm/atomic.h> @@ -88,6 +89,8 @@ struct backing_dev_info {  	struct device *dev; +	struct timer_list laptop_mode_wb_timer; +  #ifdef CONFIG_DEBUG_FS  	struct dentry *debug_dir;  	struct dentry *debug_stats; @@ -101,10 +104,12 @@ int bdi_register(struct backing_dev_info *bdi, struct device *parent,  		const char *fmt, ...);  int bdi_register_dev(struct backing_dev_info *bdi, dev_t dev);  void bdi_unregister(struct backing_dev_info *bdi); +int bdi_setup_and_register(struct backing_dev_info *, char *, unsigned int);  void bdi_start_writeback(struct backing_dev_info *bdi, struct super_block *sb, -				long nr_pages); +				long nr_pages, int sb_locked);  int bdi_writeback_task(struct bdi_writeback *wb);  int bdi_has_dirty_io(struct backing_dev_info *bdi); +void bdi_arm_supers_timer(void);  extern spinlock_t bdi_lock;  extern struct list_head bdi_list; @@ -246,6 +251,7 @@ int bdi_set_max_ratio(struct backing_dev_info *bdi, unsigned int max_ratio);  #endif  extern struct backing_dev_info default_backing_dev_info; +extern struct backing_dev_info noop_backing_dev_info;  void default_unplug_io_fn(struct backing_dev_info *bdi, struct page *page);  int writeback_in_progress(struct backing_dev_info *bdi); diff --git a/include/linux/backlight.h b/include/linux/backlight.h index 8c4f884db6b..4a3d52e545e 100644 --- a/include/linux/backlight.h +++ b/include/linux/backlight.h @@ -36,18 +36,18 @@ struct backlight_device;  struct fb_info;  struct backlight_ops { -	const unsigned int options; +	unsigned int options;  #define BL_CORE_SUSPENDRESUME	(1 << 0)  	/* Notify the backlight driver some property has changed */ -	int (* const update_status)(struct backlight_device *); +	int (*update_status)(struct backlight_device *);  	/* Return the current backlight brightness (accounting for power,  	   fb_blank etc.) */ -	int (* const get_brightness)(struct backlight_device *); +	int (*get_brightness)(struct backlight_device *);  	/* Check if given framebuffer device is the one bound to this backlight;  	   return 0 if not, !=0 if it is. If NULL, backlight always matches the fb. */ -	int (* const check_fb)(struct fb_info *); +	int (*check_fb)(struct backlight_device *, struct fb_info *);  };  /* This structure defines all the properties of a backlight */ @@ -103,7 +103,8 @@ static inline void backlight_update_status(struct backlight_device *bd)  }  extern struct backlight_device *backlight_device_register(const char *name, -	struct device *dev, void *devdata, const struct backlight_ops *ops); +	struct device *dev, void *devdata, const struct backlight_ops *ops, +	const struct backlight_properties *props);  extern void backlight_device_unregister(struct backlight_device *bd);  extern void backlight_force_update(struct backlight_device *bd,  				   enum backlight_update_reason reason); diff --git a/include/linux/binfmts.h b/include/linux/binfmts.h index 89c6249fc56..c809e286d21 100644 --- a/include/linux/binfmts.h +++ b/include/linux/binfmts.h @@ -74,6 +74,7 @@ struct coredump_params {  	struct pt_regs *regs;  	struct file *file;  	unsigned long limit; +	unsigned long mm_flags;  };  /* diff --git a/include/linux/bitops.h b/include/linux/bitops.h index c05a29cb9bb..fc68053378c 100644 --- a/include/linux/bitops.h +++ b/include/linux/bitops.h @@ -10,22 +10,26 @@  #define BITS_TO_LONGS(nr)	DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(long))  #endif +extern unsigned int __sw_hweight8(unsigned int w); +extern unsigned int __sw_hweight16(unsigned int w); +extern unsigned int __sw_hweight32(unsigned int w); +extern unsigned long __sw_hweight64(__u64 w); +  /*   * Include this here because some architectures need generic_ffs/fls in   * scope   */  #include <asm/bitops.h> -#define for_each_bit(bit, addr, size) \ +#define for_each_set_bit(bit, addr, size) \  	for ((bit) = find_first_bit((addr), (size)); \  	     (bit) < (size); \  	     (bit) = find_next_bit((addr), (size), (bit) + 1)) -  static __inline__ int get_bitmask_order(unsigned int count)  {  	int order; -	 +  	order = fls(count);  	return order;	/* We could be slightly more clever with -1 here... */  } @@ -33,7 +37,7 @@ static __inline__ int get_bitmask_order(unsigned int count)  static __inline__ int get_count_order(unsigned int count)  {  	int order; -	 +  	order = fls(count) - 1;  	if (count & (count - 1))  		order++; diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 5c8018977ef..8b7f5e0914a 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -158,7 +158,6 @@ enum rq_flag_bits {  struct request {  	struct list_head queuelist;  	struct call_single_data csd; -	int cpu;  	struct request_queue *q; @@ -166,9 +165,11 @@ struct request {  	enum rq_cmd_type_bits cmd_type;  	unsigned long atomic_flags; +	int cpu; +  	/* the following two fields are internal, NEVER access directly */ -	sector_t __sector;		/* sector cursor */  	unsigned int __data_len;	/* total data len */ +	sector_t __sector;		/* sector cursor */  	struct bio *bio;  	struct bio *biotail; @@ -185,15 +186,19 @@ struct request {  	};  	/* -	 * two pointers are available for the IO schedulers, if they need +	 * Three pointers are available for the IO schedulers, if they need  	 * more they have to dynamically allocate it.  	 */  	void *elevator_private;  	void *elevator_private2; +	void *elevator_private3;  	struct gendisk *rq_disk;  	unsigned long start_time; - +#ifdef CONFIG_BLK_CGROUP +	unsigned long long start_time_ns; +	unsigned long long io_start_time_ns;    /* when passed to hardware */ +#endif  	/* Number of scatter-gather DMA addr+len pairs after  	 * physical address coalescing is performed.  	 */ @@ -201,20 +206,20 @@ struct request {  	unsigned short ioprio; +	int ref_count; +  	void *special;		/* opaque pointer available for LLD use */  	char *buffer;		/* kaddr of the current segment if available */  	int tag;  	int errors; -	int ref_count; -  	/*  	 * when request is used as a packet command carrier  	 */ -	unsigned short cmd_len;  	unsigned char __cmd[BLK_MAX_CDB];  	unsigned char *cmd; +	unsigned short cmd_len;  	unsigned int extra_len;	/* length of alignment and padding */  	unsigned int sense_len; @@ -316,8 +321,7 @@ struct queue_limits {  	unsigned int		discard_alignment;  	unsigned short		logical_block_size; -	unsigned short		max_hw_segments; -	unsigned short		max_phys_segments; +	unsigned short		max_segments;  	unsigned char		misaligned;  	unsigned char		discard_misaligned; @@ -461,8 +465,8 @@ struct request_queue  #define QUEUE_FLAG_NONROT      14	/* non-rotational device (SSD) */  #define QUEUE_FLAG_VIRT        QUEUE_FLAG_NONROT /* paravirt device */  #define QUEUE_FLAG_IO_STAT     15	/* do IO stats */ -#define QUEUE_FLAG_CQ	       16	/* hardware does queuing */ -#define QUEUE_FLAG_DISCARD     17	/* supports DISCARD */ +#define QUEUE_FLAG_DISCARD     16	/* supports DISCARD */ +#define QUEUE_FLAG_NOXMERGES   17	/* No extended merges */  #define QUEUE_FLAG_DEFAULT	((1 << QUEUE_FLAG_IO_STAT) |		\  				 (1 << QUEUE_FLAG_CLUSTER) |		\ @@ -586,9 +590,10 @@ enum {  #define blk_queue_plugged(q)	test_bit(QUEUE_FLAG_PLUGGED, &(q)->queue_flags)  #define blk_queue_tagged(q)	test_bit(QUEUE_FLAG_QUEUED, &(q)->queue_flags) -#define blk_queue_queuing(q)	test_bit(QUEUE_FLAG_CQ, &(q)->queue_flags)  #define blk_queue_stopped(q)	test_bit(QUEUE_FLAG_STOPPED, &(q)->queue_flags)  #define blk_queue_nomerges(q)	test_bit(QUEUE_FLAG_NOMERGES, &(q)->queue_flags) +#define blk_queue_noxmerges(q)	\ +	test_bit(QUEUE_FLAG_NOXMERGES, &(q)->queue_flags)  #define blk_queue_nonrot(q)	test_bit(QUEUE_FLAG_NONROT, &(q)->queue_flags)  #define blk_queue_io_stat(q)	test_bit(QUEUE_FLAG_IO_STAT, &(q)->queue_flags)  #define blk_queue_flushing(q)	((q)->ordseq) @@ -916,14 +921,17 @@ extern void blk_abort_queue(struct request_queue *);   */  extern struct request_queue *blk_init_queue_node(request_fn_proc *rfn,  					spinlock_t *lock, int node_id); +extern struct request_queue *blk_init_allocated_queue_node(struct request_queue *, +							   request_fn_proc *, +							   spinlock_t *, int node_id);  extern struct request_queue *blk_init_queue(request_fn_proc *, spinlock_t *); +extern struct request_queue *blk_init_allocated_queue(struct request_queue *, +						      request_fn_proc *, spinlock_t *);  extern void blk_cleanup_queue(struct request_queue *);  extern void blk_queue_make_request(struct request_queue *, make_request_fn *);  extern void blk_queue_bounce_limit(struct request_queue *, u64); -extern void blk_queue_max_sectors(struct request_queue *, unsigned int);  extern void blk_queue_max_hw_sectors(struct request_queue *, unsigned int); -extern void blk_queue_max_phys_segments(struct request_queue *, unsigned short); -extern void blk_queue_max_hw_segments(struct request_queue *, unsigned short); +extern void blk_queue_max_segments(struct request_queue *, unsigned short);  extern void blk_queue_max_segment_size(struct request_queue *, unsigned int);  extern void blk_queue_max_discard_sectors(struct request_queue *q,  		unsigned int max_discard_sectors); @@ -995,32 +1003,36 @@ static inline struct request *blk_map_queue_find_tag(struct blk_queue_tag *bqt,  		return NULL;  	return bqt->tag_index[tag];  } - -extern int blkdev_issue_flush(struct block_device *, sector_t *); -#define DISCARD_FL_WAIT		0x01	/* wait for completion */ -#define DISCARD_FL_BARRIER	0x02	/* issue DISCARD_BARRIER request */ -extern int blkdev_issue_discard(struct block_device *, sector_t sector, -		sector_t nr_sects, gfp_t, int flags); - +enum{ +	BLKDEV_WAIT,	/* wait for completion */ +	BLKDEV_BARRIER,	/*issue request with barrier */ +}; +#define BLKDEV_IFL_WAIT		(1 << BLKDEV_WAIT) +#define BLKDEV_IFL_BARRIER	(1 << BLKDEV_BARRIER) +extern int blkdev_issue_flush(struct block_device *, gfp_t, sector_t *, +			unsigned long); +extern int blkdev_issue_discard(struct block_device *bdev, sector_t sector, +		sector_t nr_sects, gfp_t gfp_mask, unsigned long flags); +extern int blkdev_issue_zeroout(struct block_device *bdev, sector_t sector, +			sector_t nr_sects, gfp_t gfp_mask, unsigned long flags);  static inline int sb_issue_discard(struct super_block *sb,  				   sector_t block, sector_t nr_blocks)  {  	block <<= (sb->s_blocksize_bits - 9);  	nr_blocks <<= (sb->s_blocksize_bits - 9);  	return blkdev_issue_discard(sb->s_bdev, block, nr_blocks, GFP_KERNEL, -				    DISCARD_FL_BARRIER); +				   BLKDEV_IFL_WAIT | BLKDEV_IFL_BARRIER);  }  extern int blk_verify_command(unsigned char *cmd, fmode_t has_write_perm); -#define MAX_PHYS_SEGMENTS 128 -#define MAX_HW_SEGMENTS 128 -#define SAFE_MAX_SECTORS 255 -#define BLK_DEF_MAX_SECTORS 1024 - -#define MAX_SEGMENT_SIZE	65536 - -#define BLK_SEG_BOUNDARY_MASK	0xFFFFFFFFUL +enum blk_default_limits { +	BLK_MAX_SEGMENTS	= 128, +	BLK_SAFE_MAX_SECTORS	= 255, +	BLK_DEF_MAX_SECTORS	= 1024, +	BLK_MAX_SEGMENT_SIZE	= 65536, +	BLK_SEG_BOUNDARY_MASK	= 0xFFFFFFFFUL, +};  #define blkdev_entry_to_request(entry) list_entry((entry), struct request, queuelist) @@ -1044,14 +1056,9 @@ static inline unsigned int queue_max_hw_sectors(struct request_queue *q)  	return q->limits.max_hw_sectors;  } -static inline unsigned short queue_max_hw_segments(struct request_queue *q) +static inline unsigned short queue_max_segments(struct request_queue *q)  { -	return q->limits.max_hw_segments; -} - -static inline unsigned short queue_max_phys_segments(struct request_queue *q) -{ -	return q->limits.max_phys_segments; +	return q->limits.max_segments;  }  static inline unsigned int queue_max_segment_size(struct request_queue *q) @@ -1112,18 +1119,13 @@ static inline int queue_alignment_offset(struct request_queue *q)  	return q->limits.alignment_offset;  } -static inline int queue_limit_alignment_offset(struct queue_limits *lim, sector_t offset) +static inline int queue_limit_alignment_offset(struct queue_limits *lim, sector_t sector)  {  	unsigned int granularity = max(lim->physical_block_size, lim->io_min); +	unsigned int alignment = (sector << 9) & (granularity - 1); -	offset &= granularity - 1; -	return (granularity + lim->alignment_offset - offset) & (granularity - 1); -} - -static inline int queue_sector_alignment_offset(struct request_queue *q, -						sector_t sector) -{ -	return queue_limit_alignment_offset(&q->limits, sector << 9); +	return (granularity + lim->alignment_offset - alignment) +		& (granularity - 1);  }  static inline int bdev_alignment_offset(struct block_device *bdev) @@ -1147,10 +1149,8 @@ static inline int queue_discard_alignment(struct request_queue *q)  	return q->limits.discard_alignment;  } -static inline int queue_sector_discard_alignment(struct request_queue *q, -						 sector_t sector) +static inline int queue_limit_discard_alignment(struct queue_limits *lim, sector_t sector)  { -	struct queue_limits *lim = &q->limits;  	unsigned int alignment = (sector << 9) & (lim->discard_granularity - 1);  	return (lim->discard_granularity + lim->discard_alignment - alignment) @@ -1210,6 +1210,39 @@ static inline void put_dev_sector(Sector p)  struct work_struct;  int kblockd_schedule_work(struct request_queue *q, struct work_struct *work); +#ifdef CONFIG_BLK_CGROUP +static inline void set_start_time_ns(struct request *req) +{ +	req->start_time_ns = sched_clock(); +} + +static inline void set_io_start_time_ns(struct request *req) +{ +	req->io_start_time_ns = sched_clock(); +} + +static inline uint64_t rq_start_time_ns(struct request *req) +{ +        return req->start_time_ns; +} + +static inline uint64_t rq_io_start_time_ns(struct request *req) +{ +        return req->io_start_time_ns; +} +#else +static inline void set_start_time_ns(struct request *req) {} +static inline void set_io_start_time_ns(struct request *req) {} +static inline uint64_t rq_start_time_ns(struct request *req) +{ +	return 0; +} +static inline uint64_t rq_io_start_time_ns(struct request *req) +{ +	return 0; +} +#endif +  #define MODULE_ALIAS_BLOCKDEV(major,minor) \  	MODULE_ALIAS("block-major-" __stringify(major) "-" __stringify(minor))  #define MODULE_ALIAS_BLOCKDEV_MAJOR(major) \ @@ -1297,10 +1330,11 @@ struct block_device_operations {  	int (*direct_access) (struct block_device *, sector_t,  						void **, unsigned long *);  	int (*media_changed) (struct gendisk *); -	unsigned long long (*set_capacity) (struct gendisk *, -						unsigned long long); +	void (*unlock_native_capacity) (struct gendisk *);  	int (*revalidate_disk) (struct gendisk *);  	int (*getgeo)(struct block_device *, struct hd_geometry *); +	/* this callback is with swap_lock and sometimes page table lock held */ +	void (*swap_slot_free_notify) (struct block_device *, unsigned long);  	struct module *owner;  }; diff --git a/include/linux/blktrace_api.h b/include/linux/blktrace_api.h index 3b73b9992b2..416bf62d6d4 100644 --- a/include/linux/blktrace_api.h +++ b/include/linux/blktrace_api.h @@ -150,8 +150,8 @@ struct blk_user_trace_setup {  struct blk_trace {  	int trace_state;  	struct rchan *rchan; -	unsigned long *sequence; -	unsigned char *msg_data; +	unsigned long __percpu *sequence; +	unsigned char __percpu *msg_data;  	u16 act_mask;  	u64 start_lba;  	u64 end_lba; diff --git a/include/linux/bootmem.h b/include/linux/bootmem.h index b10ec49ee2d..266ab929123 100644 --- a/include/linux/bootmem.h +++ b/include/linux/bootmem.h @@ -23,6 +23,7 @@ extern unsigned long max_pfn;  extern unsigned long saved_max_pfn;  #endif +#ifndef CONFIG_NO_BOOTMEM  /*   * node_bootmem_map is a map pointer - the bits represent all physical    * memory pages (including holes) on the node. @@ -37,6 +38,7 @@ typedef struct bootmem_data {  } bootmem_data_t;  extern bootmem_data_t bootmem_node_data[]; +#endif  extern unsigned long bootmem_bootmap_pages(unsigned long); @@ -46,6 +48,7 @@ extern unsigned long init_bootmem_node(pg_data_t *pgdat,  				       unsigned long endpfn);  extern unsigned long init_bootmem(unsigned long addr, unsigned long memend); +unsigned long free_all_memory_core_early(int nodeid);  extern unsigned long free_all_bootmem_node(pg_data_t *pgdat);  extern unsigned long free_all_bootmem(void); @@ -84,6 +87,10 @@ extern void *__alloc_bootmem_node(pg_data_t *pgdat,  				  unsigned long size,  				  unsigned long align,  				  unsigned long goal); +void *__alloc_bootmem_node_high(pg_data_t *pgdat, +				  unsigned long size, +				  unsigned long align, +				  unsigned long goal);  extern void *__alloc_bootmem_node_nopanic(pg_data_t *pgdat,  				  unsigned long size,  				  unsigned long align, diff --git a/include/linux/brcmphy.h b/include/linux/brcmphy.h index 2b31b91f587..7f437ca1ed4 100644 --- a/include/linux/brcmphy.h +++ b/include/linux/brcmphy.h @@ -1,3 +1,14 @@ +#define PHY_ID_BCM50610			0x0143bd60 +#define PHY_ID_BCM50610M		0x0143bd70 +#define PHY_ID_BCMAC131			0x0143bc70 +#define PHY_ID_BCM57780			0x03625d90 + +#define PHY_BCM_OUI_MASK		0xfffffc00 +#define PHY_BCM_OUI_1			0x00206000 +#define PHY_BCM_OUI_2			0x0143bc00 +#define PHY_BCM_OUI_3			0x03625c00 + +  #define PHY_BCM_FLAGS_MODE_COPPER	0x00000001  #define PHY_BCM_FLAGS_MODE_1000BX	0x00000002  #define PHY_BCM_FLAGS_INTF_SGMII	0x00000010 diff --git a/include/linux/btree-128.h b/include/linux/btree-128.h new file mode 100644 index 00000000000..0b3414c4c92 --- /dev/null +++ b/include/linux/btree-128.h @@ -0,0 +1,109 @@ +extern struct btree_geo btree_geo128; + +struct btree_head128 { struct btree_head h; }; + +static inline void btree_init_mempool128(struct btree_head128 *head, +					 mempool_t *mempool) +{ +	btree_init_mempool(&head->h, mempool); +} + +static inline int btree_init128(struct btree_head128 *head) +{ +	return btree_init(&head->h); +} + +static inline void btree_destroy128(struct btree_head128 *head) +{ +	btree_destroy(&head->h); +} + +static inline void *btree_lookup128(struct btree_head128 *head, u64 k1, u64 k2) +{ +	u64 key[2] = {k1, k2}; +	return btree_lookup(&head->h, &btree_geo128, (unsigned long *)&key); +} + +static inline void *btree_get_prev128(struct btree_head128 *head, +				      u64 *k1, u64 *k2) +{ +	u64 key[2] = {*k1, *k2}; +	void *val; + +	val = btree_get_prev(&head->h, &btree_geo128, +			     (unsigned long *)&key); +	*k1 = key[0]; +	*k2 = key[1]; +	return val; +} + +static inline int btree_insert128(struct btree_head128 *head, u64 k1, u64 k2, +				  void *val, gfp_t gfp) +{ +	u64 key[2] = {k1, k2}; +	return btree_insert(&head->h, &btree_geo128, +			    (unsigned long *)&key, val, gfp); +} + +static inline int btree_update128(struct btree_head128 *head, u64 k1, u64 k2, +				  void *val) +{ +	u64 key[2] = {k1, k2}; +	return btree_update(&head->h, &btree_geo128, +			    (unsigned long *)&key, val); +} + +static inline void *btree_remove128(struct btree_head128 *head, u64 k1, u64 k2) +{ +	u64 key[2] = {k1, k2}; +	return btree_remove(&head->h, &btree_geo128, (unsigned long *)&key); +} + +static inline void *btree_last128(struct btree_head128 *head, u64 *k1, u64 *k2) +{ +	u64 key[2]; +	void *val; + +	val = btree_last(&head->h, &btree_geo128, (unsigned long *)&key[0]); +	if (val) { +		*k1 = key[0]; +		*k2 = key[1]; +	} + +	return val; +} + +static inline int btree_merge128(struct btree_head128 *target, +				 struct btree_head128 *victim, +				 gfp_t gfp) +{ +	return btree_merge(&target->h, &victim->h, &btree_geo128, gfp); +} + +void visitor128(void *elem, unsigned long opaque, unsigned long *__key, +		size_t index, void *__func); + +typedef void (*visitor128_t)(void *elem, unsigned long opaque, +			     u64 key1, u64 key2, size_t index); + +static inline size_t btree_visitor128(struct btree_head128 *head, +				      unsigned long opaque, +				      visitor128_t func2) +{ +	return btree_visitor(&head->h, &btree_geo128, opaque, +			     visitor128, func2); +} + +static inline size_t btree_grim_visitor128(struct btree_head128 *head, +					   unsigned long opaque, +					   visitor128_t func2) +{ +	return btree_grim_visitor(&head->h, &btree_geo128, opaque, +				  visitor128, func2); +} + +#define btree_for_each_safe128(head, k1, k2, val)	\ +	for (val = btree_last128(head, &k1, &k2);	\ +	     val;					\ +	     val = btree_get_prev128(head, &k1, &k2)) + diff --git a/include/linux/btree-type.h b/include/linux/btree-type.h new file mode 100644 index 00000000000..9a1147ef856 --- /dev/null +++ b/include/linux/btree-type.h @@ -0,0 +1,147 @@ +#define __BTREE_TP(pfx, type, sfx)	pfx ## type ## sfx +#define _BTREE_TP(pfx, type, sfx)	__BTREE_TP(pfx, type, sfx) +#define BTREE_TP(pfx)			_BTREE_TP(pfx, BTREE_TYPE_SUFFIX,) +#define BTREE_FN(name)			BTREE_TP(btree_ ## name) +#define BTREE_TYPE_HEAD			BTREE_TP(struct btree_head) +#define VISITOR_FN			BTREE_TP(visitor) +#define VISITOR_FN_T			_BTREE_TP(visitor, BTREE_TYPE_SUFFIX, _t) + +BTREE_TYPE_HEAD { +	struct btree_head h; +}; + +static inline void BTREE_FN(init_mempool)(BTREE_TYPE_HEAD *head, +					  mempool_t *mempool) +{ +	btree_init_mempool(&head->h, mempool); +} + +static inline int BTREE_FN(init)(BTREE_TYPE_HEAD *head) +{ +	return btree_init(&head->h); +} + +static inline void BTREE_FN(destroy)(BTREE_TYPE_HEAD *head) +{ +	btree_destroy(&head->h); +} + +static inline int BTREE_FN(merge)(BTREE_TYPE_HEAD *target, +				  BTREE_TYPE_HEAD *victim, +				  gfp_t gfp) +{ +	return btree_merge(&target->h, &victim->h, BTREE_TYPE_GEO, gfp); +} + +#if (BITS_PER_LONG > BTREE_TYPE_BITS) +static inline void *BTREE_FN(lookup)(BTREE_TYPE_HEAD *head, BTREE_KEYTYPE key) +{ +	unsigned long _key = key; +	return btree_lookup(&head->h, BTREE_TYPE_GEO, &_key); +} + +static inline int BTREE_FN(insert)(BTREE_TYPE_HEAD *head, BTREE_KEYTYPE key, +				   void *val, gfp_t gfp) +{ +	unsigned long _key = key; +	return btree_insert(&head->h, BTREE_TYPE_GEO, &_key, val, gfp); +} + +static inline int BTREE_FN(update)(BTREE_TYPE_HEAD *head, BTREE_KEYTYPE key, +		void *val) +{ +	unsigned long _key = key; +	return btree_update(&head->h, BTREE_TYPE_GEO, &_key, val); +} + +static inline void *BTREE_FN(remove)(BTREE_TYPE_HEAD *head, BTREE_KEYTYPE key) +{ +	unsigned long _key = key; +	return btree_remove(&head->h, BTREE_TYPE_GEO, &_key); +} + +static inline void *BTREE_FN(last)(BTREE_TYPE_HEAD *head, BTREE_KEYTYPE *key) +{ +	unsigned long _key; +	void *val = btree_last(&head->h, BTREE_TYPE_GEO, &_key); +	if (val) +		*key = _key; +	return val; +} + +static inline void *BTREE_FN(get_prev)(BTREE_TYPE_HEAD *head, BTREE_KEYTYPE *key) +{ +	unsigned long _key = *key; +	void *val = btree_get_prev(&head->h, BTREE_TYPE_GEO, &_key); +	if (val) +		*key = _key; +	return val; +} +#else +static inline void *BTREE_FN(lookup)(BTREE_TYPE_HEAD *head, BTREE_KEYTYPE key) +{ +	return btree_lookup(&head->h, BTREE_TYPE_GEO, (unsigned long *)&key); +} + +static inline int BTREE_FN(insert)(BTREE_TYPE_HEAD *head, BTREE_KEYTYPE key, +			   void *val, gfp_t gfp) +{ +	return btree_insert(&head->h, BTREE_TYPE_GEO, (unsigned long *)&key, +			    val, gfp); +} + +static inline int BTREE_FN(update)(BTREE_TYPE_HEAD *head, BTREE_KEYTYPE key, +		void *val) +{ +	return btree_update(&head->h, BTREE_TYPE_GEO, (unsigned long *)&key, val); +} + +static inline void *BTREE_FN(remove)(BTREE_TYPE_HEAD *head, BTREE_KEYTYPE key) +{ +	return btree_remove(&head->h, BTREE_TYPE_GEO, (unsigned long *)&key); +} + +static inline void *BTREE_FN(last)(BTREE_TYPE_HEAD *head, BTREE_KEYTYPE *key) +{ +	return btree_last(&head->h, BTREE_TYPE_GEO, (unsigned long *)key); +} + +static inline void *BTREE_FN(get_prev)(BTREE_TYPE_HEAD *head, BTREE_KEYTYPE *key) +{ +	return btree_get_prev(&head->h, BTREE_TYPE_GEO, (unsigned long *)key); +} +#endif + +void VISITOR_FN(void *elem, unsigned long opaque, unsigned long *key, +		size_t index, void *__func); + +typedef void (*VISITOR_FN_T)(void *elem, unsigned long opaque, +			     BTREE_KEYTYPE key, size_t index); + +static inline size_t BTREE_FN(visitor)(BTREE_TYPE_HEAD *head, +				       unsigned long opaque, +				       VISITOR_FN_T func2) +{ +	return btree_visitor(&head->h, BTREE_TYPE_GEO, opaque, +			     visitorl, func2); +} + +static inline size_t BTREE_FN(grim_visitor)(BTREE_TYPE_HEAD *head, +					    unsigned long opaque, +					    VISITOR_FN_T func2) +{ +	return btree_grim_visitor(&head->h, BTREE_TYPE_GEO, opaque, +				  visitorl, func2); +} + +#undef VISITOR_FN +#undef VISITOR_FN_T +#undef __BTREE_TP +#undef _BTREE_TP +#undef BTREE_TP +#undef BTREE_FN +#undef BTREE_TYPE_HEAD +#undef BTREE_TYPE_SUFFIX +#undef BTREE_TYPE_GEO +#undef BTREE_KEYTYPE +#undef BTREE_TYPE_BITS diff --git a/include/linux/btree.h b/include/linux/btree.h new file mode 100644 index 00000000000..65b5bb05832 --- /dev/null +++ b/include/linux/btree.h @@ -0,0 +1,243 @@ +#ifndef BTREE_H +#define BTREE_H + +#include <linux/kernel.h> +#include <linux/mempool.h> + +/** + * DOC: B+Tree basics + * + * A B+Tree is a data structure for looking up arbitrary (currently allowing + * unsigned long, u32, u64 and 2 * u64) keys into pointers. The data structure + * is described at http://en.wikipedia.org/wiki/B-tree, we currently do not + * use binary search to find the key on lookups. + * + * Each B+Tree consists of a head, that contains bookkeeping information and + * a variable number (starting with zero) nodes. Each node contains the keys + * and pointers to sub-nodes, or, for leaf nodes, the keys and values for the + * tree entries. + * + * Each node in this implementation has the following layout: + * [key1, key2, ..., keyN] [val1, val2, ..., valN] + * + * Each key here is an array of unsigned longs, geo->no_longs in total. The + * number of keys and values (N) is geo->no_pairs. + */ + +/** + * struct btree_head - btree head + * + * @node: the first node in the tree + * @mempool: mempool used for node allocations + * @height: current of the tree + */ +struct btree_head { +	unsigned long *node; +	mempool_t *mempool; +	int height; +}; + +/* btree geometry */ +struct btree_geo; + +/** + * btree_alloc - allocate function for the mempool + * @gfp_mask: gfp mask for the allocation + * @pool_data: unused + */ +void *btree_alloc(gfp_t gfp_mask, void *pool_data); + +/** + * btree_free - free function for the mempool + * @element: the element to free + * @pool_data: unused + */ +void btree_free(void *element, void *pool_data); + +/** + * btree_init_mempool - initialise a btree with given mempool + * + * @head: the btree head to initialise + * @mempool: the mempool to use + * + * When this function is used, there is no need to destroy + * the mempool. + */ +void btree_init_mempool(struct btree_head *head, mempool_t *mempool); + +/** + * btree_init - initialise a btree + * + * @head: the btree head to initialise + * + * This function allocates the memory pool that the + * btree needs. Returns zero or a negative error code + * (-%ENOMEM) when memory allocation fails. + * + */ +int __must_check btree_init(struct btree_head *head); + +/** + * btree_destroy - destroy mempool + * + * @head: the btree head to destroy + * + * This function destroys the internal memory pool, use only + * when using btree_init(), not with btree_init_mempool(). + */ +void btree_destroy(struct btree_head *head); + +/** + * btree_lookup - look up a key in the btree + * + * @head: the btree to look in + * @geo: the btree geometry + * @key: the key to look up + * + * This function returns the value for the given key, or %NULL. + */ +void *btree_lookup(struct btree_head *head, struct btree_geo *geo, +		   unsigned long *key); + +/** + * btree_insert - insert an entry into the btree + * + * @head: the btree to add to + * @geo: the btree geometry + * @key: the key to add (must not already be present) + * @val: the value to add (must not be %NULL) + * @gfp: allocation flags for node allocations + * + * This function returns 0 if the item could be added, or an + * error code if it failed (may fail due to memory pressure). + */ +int __must_check btree_insert(struct btree_head *head, struct btree_geo *geo, +			      unsigned long *key, void *val, gfp_t gfp); +/** + * btree_update - update an entry in the btree + * + * @head: the btree to update + * @geo: the btree geometry + * @key: the key to update + * @val: the value to change it to (must not be %NULL) + * + * This function returns 0 if the update was successful, or + * -%ENOENT if the key could not be found. + */ +int btree_update(struct btree_head *head, struct btree_geo *geo, +		 unsigned long *key, void *val); +/** + * btree_remove - remove an entry from the btree + * + * @head: the btree to update + * @geo: the btree geometry + * @key: the key to remove + * + * This function returns the removed entry, or %NULL if the key + * could not be found. + */ +void *btree_remove(struct btree_head *head, struct btree_geo *geo, +		   unsigned long *key); + +/** + * btree_merge - merge two btrees + * + * @target: the tree that gets all the entries + * @victim: the tree that gets merged into @target + * @geo: the btree geometry + * @gfp: allocation flags + * + * The two trees @target and @victim may not contain the same keys, + * that is a bug and triggers a BUG(). This function returns zero + * if the trees were merged successfully, and may return a failure + * when memory allocation fails, in which case both trees might have + * been partially merged, i.e. some entries have been moved from + * @victim to @target. + */ +int btree_merge(struct btree_head *target, struct btree_head *victim, +		struct btree_geo *geo, gfp_t gfp); + +/** + * btree_last - get last entry in btree + * + * @head: btree head + * @geo: btree geometry + * @key: last key + * + * Returns the last entry in the btree, and sets @key to the key + * of that entry; returns NULL if the tree is empty, in that case + * key is not changed. + */ +void *btree_last(struct btree_head *head, struct btree_geo *geo, +		 unsigned long *key); + +/** + * btree_get_prev - get previous entry + * + * @head: btree head + * @geo: btree geometry + * @key: pointer to key + * + * The function returns the next item right before the value pointed to by + * @key, and updates @key with its key, or returns %NULL when there is no + * entry with a key smaller than the given key. + */ +void *btree_get_prev(struct btree_head *head, struct btree_geo *geo, +		     unsigned long *key); + + +/* internal use, use btree_visitor{l,32,64,128} */ +size_t btree_visitor(struct btree_head *head, struct btree_geo *geo, +		     unsigned long opaque, +		     void (*func)(void *elem, unsigned long opaque, +				  unsigned long *key, size_t index, +				  void *func2), +		     void *func2); + +/* internal use, use btree_grim_visitor{l,32,64,128} */ +size_t btree_grim_visitor(struct btree_head *head, struct btree_geo *geo, +			  unsigned long opaque, +			  void (*func)(void *elem, unsigned long opaque, +				       unsigned long *key, +				       size_t index, void *func2), +			  void *func2); + + +#include <linux/btree-128.h> + +extern struct btree_geo btree_geo32; +#define BTREE_TYPE_SUFFIX l +#define BTREE_TYPE_BITS BITS_PER_LONG +#define BTREE_TYPE_GEO &btree_geo32 +#define BTREE_KEYTYPE unsigned long +#include <linux/btree-type.h> + +#define btree_for_each_safel(head, key, val)	\ +	for (val = btree_lastl(head, &key);	\ +	     val;				\ +	     val = btree_get_prevl(head, &key)) + +#define BTREE_TYPE_SUFFIX 32 +#define BTREE_TYPE_BITS 32 +#define BTREE_TYPE_GEO &btree_geo32 +#define BTREE_KEYTYPE u32 +#include <linux/btree-type.h> + +#define btree_for_each_safe32(head, key, val)	\ +	for (val = btree_last32(head, &key);	\ +	     val;				\ +	     val = btree_get_prev32(head, &key)) + +extern struct btree_geo btree_geo64; +#define BTREE_TYPE_SUFFIX 64 +#define BTREE_TYPE_BITS 64 +#define BTREE_TYPE_GEO &btree_geo64 +#define BTREE_KEYTYPE u64 +#include <linux/btree-type.h> + +#define btree_for_each_safe64(head, key, val)	\ +	for (val = btree_last64(head, &key);	\ +	     val;				\ +	     val = btree_get_prev64(head, &key)) + +#endif diff --git a/include/linux/buffer_head.h b/include/linux/buffer_head.h index 16ed0284d78..1b9ba193b78 100644 --- a/include/linux/buffer_head.h +++ b/include/linux/buffer_head.h @@ -203,6 +203,9 @@ int block_write_full_page_endio(struct page *page, get_block_t *get_block,  int block_read_full_page(struct page*, get_block_t*);  int block_is_partially_uptodate(struct page *page, read_descriptor_t *desc,  				unsigned long from); +int block_write_begin_newtrunc(struct file *, struct address_space *, +				loff_t, unsigned, unsigned, +				struct page **, void **, get_block_t*);  int block_write_begin(struct file *, struct address_space *,  				loff_t, unsigned, unsigned,  				struct page **, void **, get_block_t*); @@ -214,6 +217,9 @@ int generic_write_end(struct file *, struct address_space *,  				struct page *, void *);  void page_zero_new_buffers(struct page *page, unsigned from, unsigned to);  int block_prepare_write(struct page*, unsigned, unsigned, get_block_t*); +int cont_write_begin_newtrunc(struct file *, struct address_space *, loff_t, +			unsigned, unsigned, struct page **, void **, +			get_block_t *, loff_t *);  int cont_write_begin(struct file *, struct address_space *, loff_t,  			unsigned, unsigned, struct page **, void **,  			get_block_t *, loff_t *); @@ -224,7 +230,10 @@ int block_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf,  void block_sync_page(struct page *);  sector_t generic_block_bmap(struct address_space *, sector_t, get_block_t *);  int block_truncate_page(struct address_space *, loff_t, get_block_t *); -int file_fsync(struct file *, struct dentry *, int); +int file_fsync(struct file *, int); +int nobh_write_begin_newtrunc(struct file *, struct address_space *, +				loff_t, unsigned, unsigned, +				struct page **, void **, get_block_t*);  int nobh_write_begin(struct file *, struct address_space *,  				loff_t, unsigned, unsigned,  				struct page **, void **, get_block_t*); diff --git a/include/linux/caif/caif_socket.h b/include/linux/caif/caif_socket.h new file mode 100644 index 00000000000..2a61eb1beb8 --- /dev/null +++ b/include/linux/caif/caif_socket.h @@ -0,0 +1,165 @@ +/* linux/caif_socket.h + * CAIF Definitions for CAIF socket and network layer + * Copyright (C) ST-Ericsson AB 2010 + * Author:	 Sjur Brendeland/ sjur.brandeland@stericsson.com + * License terms: GNU General Public License (GPL) version 2 + */ + +#ifndef _LINUX_CAIF_SOCKET_H +#define _LINUX_CAIF_SOCKET_H + +#include <linux/types.h> + +#ifdef __KERNEL__ +#include <linux/socket.h> +#else +#include <sys/socket.h> +#endif + +/** + * enum caif_link_selector -    Physical Link Selection. + * @CAIF_LINK_HIGH_BANDW:	Physical interface for high-bandwidth + *				traffic. + * @CAIF_LINK_LOW_LATENCY:	Physical interface for low-latency + *				traffic. + * + * CAIF Link Layers can register their link properties. + * This enum is used for choosing between CAIF Link Layers when + * setting up CAIF Channels when multiple CAIF Link Layers exists. + */ +enum caif_link_selector { +	CAIF_LINK_HIGH_BANDW, +	CAIF_LINK_LOW_LATENCY +}; + +/** + * enum caif_channel_priority - CAIF channel priorities. + * + * @CAIF_PRIO_MIN:	Min priority for a channel. + * @CAIF_PRIO_LOW:	Low-priority channel. + * @CAIF_PRIO_NORMAL:	Normal/default priority level. + * @CAIF_PRIO_HIGH:	High priority level + * @CAIF_PRIO_MAX:	Max priority for channel + * + * Priority can be set on CAIF Channels in order to + * prioritize between traffic on different CAIF Channels. + * These priority levels are recommended, but the priority value + * is not restricted to the values defined in this enum, any value + * between CAIF_PRIO_MIN and CAIF_PRIO_MAX could be used. + */ +enum caif_channel_priority { +	CAIF_PRIO_MIN	 = 0x01, +	CAIF_PRIO_LOW	 = 0x04, +	CAIF_PRIO_NORMAL = 0x0f, +	CAIF_PRIO_HIGH	 = 0x14, +	CAIF_PRIO_MAX	 = 0x1F +}; + +/** + * enum caif_protocol_type  -	CAIF Channel type. + * @CAIFPROTO_AT:		Classic AT channel. + * @CAIFPROTO_DATAGRAM:	Datagram channel. + * @CAIFPROTO_DATAGRAM_LOOP:	Datagram loopback channel, used for testing. + * @CAIFPROTO_UTIL:		Utility (Psock) channel. + * @CAIFPROTO_RFM:		Remote File Manager + * + * This enum defines the CAIF Channel type to be used. This defines + * the service to connect to on the modem. + */ +enum caif_protocol_type { +	CAIFPROTO_AT, +	CAIFPROTO_DATAGRAM, +	CAIFPROTO_DATAGRAM_LOOP, +	CAIFPROTO_UTIL, +	CAIFPROTO_RFM, +	_CAIFPROTO_MAX +}; +#define	CAIFPROTO_MAX _CAIFPROTO_MAX + +/** + * enum caif_at_type - AT Service Endpoint + * @CAIF_ATTYPE_PLAIN:	     Connects to a plain vanilla AT channel. + */ +enum caif_at_type { +	CAIF_ATTYPE_PLAIN = 2 +}; + +/** + * struct sockaddr_caif - the sockaddr structure for CAIF sockets. + * @family:		     Address family number, must be AF_CAIF. + * @u:			     Union of address data 'switched' by family. + * : + * @u.at:                    Applies when family = CAIFPROTO_AT. + * + * @u.at.type:               Type of AT link to set up (enum caif_at_type). + * + * @u.util:                  Applies when family = CAIFPROTO_UTIL + * + * @u.util.service:          Utility service name. + * + * @u.dgm:                   Applies when family = CAIFPROTO_DATAGRAM + * + * @u.dgm.connection_id:     Datagram connection id. + * + * @u.dgm.nsapi:             NSAPI of the PDP-Context. + * + * @u.rfm:                   Applies when family = CAIFPROTO_RFM + * + * @u.rfm.connection_id:     Connection ID for RFM. + * + * @u.rfm.volume:            Volume to mount. + * + * Description: + * This structure holds the connect parameters used for setting up a + * CAIF Channel. It defines the service to connect to on the modem. + */ +struct sockaddr_caif { +	sa_family_t  family; +	union { +		struct { +			__u8  type;		/* type: enum caif_at_type */ +		} at;				/* CAIFPROTO_AT */ +		struct { +			char	  service[16]; +		} util;				/* CAIFPROTO_UTIL */ +		union { +			__u32 connection_id; +			__u8  nsapi; +		} dgm;				/* CAIFPROTO_DATAGRAM(_LOOP)*/ +		struct { +			__u32 connection_id; +			char	  volume[16]; +		} rfm;				/* CAIFPROTO_RFM */ +	} u; +}; + +/** + * enum caif_socket_opts - CAIF option values for getsockopt and setsockopt. + * + * @CAIFSO_LINK_SELECT:		Selector used if multiple CAIF Link layers are + *				available. Either a high bandwidth + *				link can be selected (CAIF_LINK_HIGH_BANDW) or + *				or a low latency link (CAIF_LINK_LOW_LATENCY). + *                              This option is of type __u32. + *				Alternatively SO_BINDTODEVICE can be used. + * + * @CAIFSO_REQ_PARAM:		Used to set the request parameters for a + *				utility channel. (maximum 256 bytes). This + *				option must be set before connecting. + * + * @CAIFSO_RSP_PARAM:		Gets the response parameters for a utility + *				channel. (maximum 256 bytes). This option + *				is valid after a successful connect. + * + * + * This enum defines the CAIF Socket options to be used on a socket + * of type PF_CAIF. + * + */ +enum caif_socket_opts { +	CAIFSO_LINK_SELECT	= 127, +	CAIFSO_REQ_PARAM	= 128, +	CAIFSO_RSP_PARAM	= 129, +}; + +#endif /* _LINUX_CAIF_SOCKET_H */ diff --git a/include/linux/caif/if_caif.h b/include/linux/caif/if_caif.h new file mode 100644 index 00000000000..5e7eed4edf5 --- /dev/null +++ b/include/linux/caif/if_caif.h @@ -0,0 +1,34 @@ +/* + * Copyright (C) ST-Ericsson AB 2010 + * Author:	Sjur Brendeland/ sjur.brandeland@stericsson.com + * License terms: GNU General Public License (GPL) version 2 + */ + +#ifndef IF_CAIF_H_ +#define IF_CAIF_H_ +#include <linux/sockios.h> +#include <linux/types.h> +#include <linux/socket.h> + +/** + * enum ifla_caif - CAIF NetlinkRT parameters. + * @IFLA_CAIF_IPV4_CONNID:  Connection ID for IPv4 PDP Context. + *			    The type of attribute is NLA_U32. + * @IFLA_CAIF_IPV6_CONNID:  Connection ID for IPv6 PDP Context. + *			    The type of attribute is NLA_U32. + * @IFLA_CAIF_LOOPBACK:	    If different from zero, device is doing loopback + *			    The type of attribute is NLA_U8. + * + * When using RT Netlink to create, destroy or configure a CAIF IP interface, + * enum ifla_caif is used to specify the configuration attributes. + */ +enum ifla_caif { +	__IFLA_CAIF_UNSPEC, +	IFLA_CAIF_IPV4_CONNID, +	IFLA_CAIF_IPV6_CONNID, +	IFLA_CAIF_LOOPBACK, +	__IFLA_CAIF_MAX +}; +#define	IFLA_CAIF_MAX (__IFLA_CAIF_MAX-1) + +#endif /*IF_CAIF_H_*/ diff --git a/include/linux/can/dev.h b/include/linux/can/dev.h index 3db7767d2a1..cc0bb496166 100644 --- a/include/linux/can/dev.h +++ b/include/linux/can/dev.h @@ -14,6 +14,7 @@  #ifndef CAN_DEV_H  #define CAN_DEV_H +#include <linux/can.h>  #include <linux/can/netlink.h>  #include <linux/can/error.h> @@ -38,6 +39,7 @@ struct can_priv {  	enum can_state state;  	u32 ctrlmode; +	u32 ctrlmode_supported;  	int restart_ms;  	struct timer_list restart_timer; @@ -46,6 +48,8 @@ struct can_priv {  	int (*do_set_mode)(struct net_device *dev, enum can_mode mode);  	int (*do_get_state)(const struct net_device *dev,  			    enum can_state *state); +	int (*do_get_berr_counter)(const struct net_device *dev, +				   struct can_berr_counter *bec);  	unsigned int echo_skb_max;  	struct sk_buff **echo_skb; @@ -60,6 +64,21 @@ struct can_priv {   */  #define get_can_dlc(i)	(min_t(__u8, (i), 8)) +/* Drop a given socketbuffer if it does not contain a valid CAN frame. */ +static inline int can_dropped_invalid_skb(struct net_device *dev, +					  struct sk_buff *skb) +{ +	const struct can_frame *cf = (struct can_frame *)skb->data; + +	if (unlikely(skb->len != sizeof(*cf) || cf->can_dlc > 8)) { +		kfree_skb(skb); +		dev->stats.tx_dropped++; +		return 1; +	} + +	return 0; +} +  struct net_device *alloc_candev(int sizeof_priv, unsigned int echo_skb_max);  void free_candev(struct net_device *dev); diff --git a/include/linux/can/netlink.h b/include/linux/can/netlink.h index 9ecbb7871c0..3250de935e1 100644 --- a/include/linux/can/netlink.h +++ b/include/linux/can/netlink.h @@ -70,6 +70,14 @@ enum can_state {  };  /* + * CAN bus error counters + */ +struct can_berr_counter { +	__u16 txerr; +	__u16 rxerr; +}; + +/*   * CAN controller mode   */  struct can_ctrlmode { @@ -77,9 +85,11 @@ struct can_ctrlmode {  	__u32 flags;  }; -#define CAN_CTRLMODE_LOOPBACK	0x1	/* Loopback mode */ -#define CAN_CTRLMODE_LISTENONLY	0x2 	/* Listen-only mode */ -#define CAN_CTRLMODE_3_SAMPLES	0x4	/* Triple sampling mode */ +#define CAN_CTRLMODE_LOOPBACK		0x01	/* Loopback mode */ +#define CAN_CTRLMODE_LISTENONLY		0x02 	/* Listen-only mode */ +#define CAN_CTRLMODE_3_SAMPLES		0x04	/* Triple sampling mode */ +#define CAN_CTRLMODE_ONE_SHOT		0x08	/* One-Shot mode */ +#define CAN_CTRLMODE_BERR_REPORTING	0x10	/* Bus-error reporting */  /*   * CAN device statistics @@ -105,6 +115,7 @@ enum {  	IFLA_CAN_CTRLMODE,  	IFLA_CAN_RESTART_MS,  	IFLA_CAN_RESTART, +	IFLA_CAN_BERR_COUNTER,  	__IFLA_CAN_MAX  }; diff --git a/include/linux/can/platform/mcp251x.h b/include/linux/can/platform/mcp251x.h index 1448177d86d..dba28268e65 100644 --- a/include/linux/can/platform/mcp251x.h +++ b/include/linux/can/platform/mcp251x.h @@ -26,8 +26,8 @@  struct mcp251x_platform_data {  	unsigned long oscillator_frequency;  	int model; -#define CAN_MCP251X_MCP2510 0 -#define CAN_MCP251X_MCP2515 1 +#define CAN_MCP251X_MCP2510 0x2510 +#define CAN_MCP251X_MCP2515 0x2515  	int (*board_specific_setup)(struct spi_device *spi);  	int (*transceiver_enable)(int enable);  	int (*power_enable) (int enable); diff --git a/include/linux/can/platform/sja1000.h b/include/linux/can/platform/sja1000.h index 01ee2aeb048..96f8fcc78d7 100644 --- a/include/linux/can/platform/sja1000.h +++ b/include/linux/can/platform/sja1000.h @@ -26,7 +26,7 @@  #define OCR_TX_SHIFT      2  struct sja1000_platform_data { -	u32 clock;	/* CAN bus oscillator frequency in Hz */ +	u32 osc_freq;	/* CAN bus oscillator frequency in Hz */  	u8 ocr;		/* output control register */  	u8 cdr;		/* clock divider register */ diff --git a/include/linux/can/platform/ti_hecc.h b/include/linux/can/platform/ti_hecc.h index 4688c7bb1bd..af17cb3f7a8 100644 --- a/include/linux/can/platform/ti_hecc.h +++ b/include/linux/can/platform/ti_hecc.h @@ -1,3 +1,6 @@ +#ifndef __CAN_PLATFORM_TI_HECC_H__ +#define __CAN_PLATFORM_TI_HECC_H__ +  /*   * TI HECC (High End CAN Controller) driver platform header   * @@ -23,6 +26,7 @@   * @mbx_offset:		Mailbox RAM offset   * @int_line:		Interrupt line to use - 0 or 1   * @version:		version for future use + * @transceiver_switch:	platform specific callback fn for transceiver control   *   * Platform data structure to get all platform specific settings.   * this structure also accounts the fact that the IP may have different @@ -35,6 +39,6 @@ struct ti_hecc_platform_data {  	u32 mbx_offset;  	u32 int_line;  	u32 version; +	void (*transceiver_switch) (int);  }; - - +#endif diff --git a/include/linux/cciss_defs.h b/include/linux/cciss_defs.h new file mode 100644 index 00000000000..316b670d4e3 --- /dev/null +++ b/include/linux/cciss_defs.h @@ -0,0 +1,130 @@ +#ifndef CCISS_DEFS_H +#define CCISS_DEFS_H + +#include <linux/types.h> + +/* general boundary definitions */ +#define SENSEINFOBYTES          32 /* note that this value may vary +				      between host implementations */ + +/* Command Status value */ +#define CMD_SUCCESS             0x0000 +#define CMD_TARGET_STATUS       0x0001 +#define CMD_DATA_UNDERRUN       0x0002 +#define CMD_DATA_OVERRUN        0x0003 +#define CMD_INVALID             0x0004 +#define CMD_PROTOCOL_ERR        0x0005 +#define CMD_HARDWARE_ERR        0x0006 +#define CMD_CONNECTION_LOST     0x0007 +#define CMD_ABORTED             0x0008 +#define CMD_ABORT_FAILED        0x0009 +#define CMD_UNSOLICITED_ABORT   0x000A +#define CMD_TIMEOUT             0x000B +#define CMD_UNABORTABLE		0x000C + +/* transfer direction */ +#define XFER_NONE               0x00 +#define XFER_WRITE              0x01 +#define XFER_READ               0x02 +#define XFER_RSVD               0x03 + +/* task attribute */ +#define ATTR_UNTAGGED           0x00 +#define ATTR_SIMPLE             0x04 +#define ATTR_HEADOFQUEUE        0x05 +#define ATTR_ORDERED            0x06 +#define ATTR_ACA                0x07 + +/* cdb type */ +#define TYPE_CMD				0x00 +#define TYPE_MSG				0x01 + +/* Type defs used in the following structs */ +#define BYTE __u8 +#define WORD __u16 +#define HWORD __u16 +#define DWORD __u32 + +#define CISS_MAX_LUN	1024 + +#define LEVEL2LUN   1 /* index into Target(x) structure, due to byte swapping */ +#define LEVEL3LUN   0 + +#pragma pack(1) + +/* Command List Structure */ +typedef union _SCSI3Addr_struct { +   struct { +    BYTE Dev; +    BYTE Bus:6; +    BYTE Mode:2;        /* b00 */ +  } PeripDev; +   struct { +    BYTE DevLSB; +    BYTE DevMSB:6; +    BYTE Mode:2;        /* b01 */ +  } LogDev; +   struct { +    BYTE Dev:5; +    BYTE Bus:3; +    BYTE Targ:6; +    BYTE Mode:2;        /* b10 */ +  } LogUnit; +} SCSI3Addr_struct; + +typedef struct _PhysDevAddr_struct { +  DWORD             TargetId:24; +  DWORD             Bus:6; +  DWORD             Mode:2; +  SCSI3Addr_struct  Target[2]; /* 2 level target device addr */ +} PhysDevAddr_struct; + +typedef struct _LogDevAddr_struct { +  DWORD            VolId:30; +  DWORD            Mode:2; +  BYTE             reserved[4]; +} LogDevAddr_struct; + +typedef union _LUNAddr_struct { +  BYTE               LunAddrBytes[8]; +  SCSI3Addr_struct   SCSI3Lun[4]; +  PhysDevAddr_struct PhysDev; +  LogDevAddr_struct  LogDev; +} LUNAddr_struct; + +typedef struct _RequestBlock_struct { +  BYTE   CDBLen; +  struct { +    BYTE Type:3; +    BYTE Attribute:3; +    BYTE Direction:2; +  } Type; +  HWORD  Timeout; +  BYTE   CDB[16]; +} RequestBlock_struct; + +typedef union _MoreErrInfo_struct{ +  struct { +    BYTE  Reserved[3]; +    BYTE  Type; +    DWORD ErrorInfo; +  } Common_Info; +  struct{ +    BYTE  Reserved[2]; +    BYTE  offense_size; /* size of offending entry */ +    BYTE  offense_num;  /* byte # of offense 0-base */ +    DWORD offense_value; +  } Invalid_Cmd; +} MoreErrInfo_struct; +typedef struct _ErrorInfo_struct { +  BYTE               ScsiStatus; +  BYTE               SenseLen; +  HWORD              CommandStatus; +  DWORD              ResidualCnt; +  MoreErrInfo_struct MoreErrInfo; +  BYTE               SenseInfo[SENSEINFOBYTES]; +} ErrorInfo_struct; + +#pragma pack() + +#endif /* CCISS_DEFS_H */ diff --git a/include/linux/cciss_ioctl.h b/include/linux/cciss_ioctl.h index eb130b4d8e7..986493f5b92 100644 --- a/include/linux/cciss_ioctl.h +++ b/include/linux/cciss_ioctl.h @@ -3,6 +3,7 @@  #include <linux/types.h>  #include <linux/ioctl.h> +#include <linux/cciss_defs.h>  #define CCISS_IOC_MAGIC 'B' @@ -36,133 +37,6 @@ typedef __u32 DriverVer_type;  #define MAX_KMALLOC_SIZE 128000 -#ifndef CCISS_CMD_H -// This defines are duplicated in cciss_cmd.h in the driver directory  - -//general boundary definitions -#define SENSEINFOBYTES          32//note that this value may vary between host implementations - -//Command Status value -#define CMD_SUCCESS             0x0000 -#define CMD_TARGET_STATUS       0x0001 -#define CMD_DATA_UNDERRUN       0x0002 -#define CMD_DATA_OVERRUN        0x0003 -#define CMD_INVALID             0x0004 -#define CMD_PROTOCOL_ERR        0x0005 -#define CMD_HARDWARE_ERR        0x0006 -#define CMD_CONNECTION_LOST     0x0007 -#define CMD_ABORTED             0x0008 -#define CMD_ABORT_FAILED        0x0009 -#define CMD_UNSOLICITED_ABORT   0x000A -#define CMD_TIMEOUT             0x000B -#define CMD_UNABORTABLE		0x000C - -//transfer direction -#define XFER_NONE               0x00 -#define XFER_WRITE              0x01 -#define XFER_READ               0x02 -#define XFER_RSVD               0x03 - -//task attribute -#define ATTR_UNTAGGED           0x00 -#define ATTR_SIMPLE             0x04 -#define ATTR_HEADOFQUEUE        0x05 -#define ATTR_ORDERED            0x06 -#define ATTR_ACA                0x07 - -//cdb type -#define TYPE_CMD				0x00 -#define TYPE_MSG				0x01 - -// Type defs used in the following structs -#define BYTE __u8 -#define WORD __u16 -#define HWORD __u16 -#define DWORD __u32 - -#define CISS_MAX_LUN	1024 - -#define LEVEL2LUN   1   // index into Target(x) structure, due to byte swapping -#define LEVEL3LUN   0 - -#pragma pack(1) - -//Command List Structure -typedef union _SCSI3Addr_struct { -   struct { -    BYTE Dev; -    BYTE Bus:6; -    BYTE Mode:2;        // b00 -  } PeripDev; -   struct { -    BYTE DevLSB; -    BYTE DevMSB:6; -    BYTE Mode:2;        // b01 -  } LogDev; -   struct { -    BYTE Dev:5; -    BYTE Bus:3; -    BYTE Targ:6; -    BYTE Mode:2;        // b10 -  } LogUnit; -} SCSI3Addr_struct; - -typedef struct _PhysDevAddr_struct { -  DWORD             TargetId:24; -  DWORD             Bus:6; -  DWORD             Mode:2; -  SCSI3Addr_struct  Target[2]; //2 level target device addr -} PhysDevAddr_struct; -   -typedef struct _LogDevAddr_struct { -  DWORD            VolId:30; -  DWORD            Mode:2; -  BYTE             reserved[4]; -} LogDevAddr_struct; - -typedef union _LUNAddr_struct { -  BYTE               LunAddrBytes[8]; -  SCSI3Addr_struct   SCSI3Lun[4]; -  PhysDevAddr_struct PhysDev; -  LogDevAddr_struct  LogDev; -} LUNAddr_struct; - -typedef struct _RequestBlock_struct { -  BYTE   CDBLen; -  struct { -    BYTE Type:3; -    BYTE Attribute:3; -    BYTE Direction:2; -  } Type; -  HWORD  Timeout; -  BYTE   CDB[16]; -} RequestBlock_struct; - -typedef union _MoreErrInfo_struct{ -  struct { -    BYTE  Reserved[3]; -    BYTE  Type; -    DWORD ErrorInfo; -  }Common_Info; -  struct{ -    BYTE  Reserved[2]; -    BYTE  offense_size;//size of offending entry -    BYTE  offense_num; //byte # of offense 0-base -    DWORD offense_value; -  }Invalid_Cmd; -}MoreErrInfo_struct; -typedef struct _ErrorInfo_struct { -  BYTE               ScsiStatus; -  BYTE               SenseLen; -  HWORD              CommandStatus; -  DWORD              ResidualCnt; -  MoreErrInfo_struct MoreErrInfo; -  BYTE               SenseInfo[SENSEINFOBYTES]; -} ErrorInfo_struct; - -#pragma pack() -#endif /* CCISS_CMD_H */  -  typedef struct _IOCTL_Command_struct {    LUNAddr_struct	   LUN_info;    RequestBlock_struct      Request; diff --git a/include/linux/cgroup.h b/include/linux/cgroup.h index 0008dee6651..0c621604baa 100644 --- a/include/linux/cgroup.h +++ b/include/linux/cgroup.h @@ -28,6 +28,7 @@ struct css_id;  extern int cgroup_init_early(void);  extern int cgroup_init(void);  extern void cgroup_lock(void); +extern int cgroup_lock_is_held(void);  extern bool cgroup_lock_live_group(struct cgroup *cgrp);  extern void cgroup_unlock(void);  extern void cgroup_fork(struct task_struct *p); @@ -36,16 +37,24 @@ extern void cgroup_post_fork(struct task_struct *p);  extern void cgroup_exit(struct task_struct *p, int run_callbacks);  extern int cgroupstats_build(struct cgroupstats *stats,  				struct dentry *dentry); +extern int cgroup_load_subsys(struct cgroup_subsys *ss); +extern void cgroup_unload_subsys(struct cgroup_subsys *ss);  extern const struct file_operations proc_cgroup_operations; -/* Define the enumeration of all cgroup subsystems */ +/* Define the enumeration of all builtin cgroup subsystems */  #define SUBSYS(_x) _x ## _subsys_id,  enum cgroup_subsys_id {  #include <linux/cgroup_subsys.h> -	CGROUP_SUBSYS_COUNT +	CGROUP_BUILTIN_SUBSYS_COUNT  };  #undef SUBSYS +/* + * This define indicates the maximum number of subsystems that can be loaded + * at once. We limit to this many since cgroupfs_root has subsys_bits to keep + * track of all of them. + */ +#define CGROUP_SUBSYS_COUNT (BITS_PER_BYTE*sizeof(unsigned long))  /* Per-subsystem/per-cgroup state maintained by the system. */  struct cgroup_subsys_state { @@ -75,6 +84,12 @@ enum {  	CSS_REMOVED, /* This CSS is dead */  }; +/* Caller must verify that the css is not for root cgroup */ +static inline void __css_get(struct cgroup_subsys_state *css, int count) +{ +	atomic_add(count, &css->refcnt); +} +  /*   * Call css_get() to hold a reference on the css; it can be used   * for a reference obtained via: @@ -86,7 +101,7 @@ static inline void css_get(struct cgroup_subsys_state *css)  {  	/* We don't need to reference count the root state */  	if (!test_bit(CSS_ROOT, &css->flags)) -		atomic_inc(&css->refcnt); +		__css_get(css, 1);  }  static inline bool css_is_removed(struct cgroup_subsys_state *css) @@ -117,11 +132,11 @@ static inline bool css_tryget(struct cgroup_subsys_state *css)   * css_get() or css_tryget()   */ -extern void __css_put(struct cgroup_subsys_state *css); +extern void __css_put(struct cgroup_subsys_state *css, int count);  static inline void css_put(struct cgroup_subsys_state *css)  {  	if (!test_bit(CSS_ROOT, &css->flags)) -		__css_put(css); +		__css_put(css, 1);  }  /* bits in struct cgroup flags field */ @@ -220,6 +235,10 @@ struct cgroup {  	/* For RCU-protected deletion */  	struct rcu_head rcu_head; + +	/* List of events which userspace want to recieve */ +	struct list_head event_list; +	spinlock_t event_list_lock;  };  /* @@ -257,7 +276,8 @@ struct css_set {  	/*  	 * Set of subsystem states, one for each subsystem. This array  	 * is immutable after creation apart from the init_css_set -	 * during subsystem registration (at boot time). +	 * during subsystem registration (at boot time) and modular subsystem +	 * loading/unloading.  	 */  	struct cgroup_subsys_state *subsys[CGROUP_SUBSYS_COUNT]; @@ -362,6 +382,23 @@ struct cftype {  	int (*trigger)(struct cgroup *cgrp, unsigned int event);  	int (*release)(struct inode *inode, struct file *file); + +	/* +	 * register_event() callback will be used to add new userspace +	 * waiter for changes related to the cftype. Implement it if +	 * you want to provide this functionality. Use eventfd_signal() +	 * on eventfd to send notification to userspace. +	 */ +	int (*register_event)(struct cgroup *cgrp, struct cftype *cft, +			struct eventfd_ctx *eventfd, const char *args); +	/* +	 * unregister_event() callback will be called when userspace +	 * closes the eventfd or on cgroup removing. +	 * This callback must be implemented, if you want provide +	 * notification functionality. +	 */ +	void (*unregister_event)(struct cgroup *cgrp, struct cftype *cft, +			struct eventfd_ctx *eventfd);  };  struct cgroup_scanner { @@ -427,6 +464,8 @@ struct cgroup_subsys {  	void (*destroy)(struct cgroup_subsys *ss, struct cgroup *cgrp);  	int (*can_attach)(struct cgroup_subsys *ss, struct cgroup *cgrp,  			  struct task_struct *tsk, bool threadgroup); +	void (*cancel_attach)(struct cgroup_subsys *ss, struct cgroup *cgrp, +			  struct task_struct *tsk, bool threadgroup);  	void (*attach)(struct cgroup_subsys *ss, struct cgroup *cgrp,  			struct cgroup *old_cgrp, struct task_struct *tsk,  			bool threadgroup); @@ -471,6 +510,9 @@ struct cgroup_subsys {  	/* used when use_id == true */  	struct idr idr;  	spinlock_t id_lock; + +	/* should be defined only by modular subsystems */ +	struct module *module;  };  #define SUBSYS(_x) extern struct cgroup_subsys _x ## _subsys; @@ -486,7 +528,10 @@ static inline struct cgroup_subsys_state *cgroup_subsys_state(  static inline struct cgroup_subsys_state *task_subsys_state(  	struct task_struct *task, int subsys_id)  { -	return rcu_dereference(task->cgroups->subsys[subsys_id]); +	return rcu_dereference_check(task->cgroups->subsys[subsys_id], +				     rcu_read_lock_held() || +				     lockdep_is_held(&task->alloc_lock) || +				     cgroup_lock_is_held());  }  static inline struct cgroup* task_cgroup(struct task_struct *task, diff --git a/include/linux/circ_buf.h b/include/linux/circ_buf.h index a2ed0591fb1..90f2471dc6f 100644 --- a/include/linux/circ_buf.h +++ b/include/linux/circ_buf.h @@ -1,3 +1,7 @@ +/* + * See Documentation/circular-buffers.txt for more information. + */ +  #ifndef _LINUX_CIRC_BUF_H  #define _LINUX_CIRC_BUF_H 1 diff --git a/include/linux/clockchips.h b/include/linux/clockchips.h index 0cf725bdd2a..fc53492b6ad 100644 --- a/include/linux/clockchips.h +++ b/include/linux/clockchips.h @@ -73,6 +73,7 @@ enum clock_event_nofitiers {   * @list:		list head for the management code   * @mode:		operating mode assigned by the management code   * @next_event:		local storage for the next event in oneshot mode + * @retries:		number of forced programming retries   */  struct clock_event_device {  	const char		*name; @@ -93,6 +94,7 @@ struct clock_event_device {  	struct list_head	list;  	enum clock_event_mode	mode;  	ktime_t			next_event; +	unsigned long		retries;  };  /* diff --git a/include/linux/clocksource.h b/include/linux/clocksource.h index 8a4a130cc19..5ea3c60c160 100644 --- a/include/linux/clocksource.h +++ b/include/linux/clocksource.h @@ -154,6 +154,7 @@ extern u64 timecounter_cyc2time(struct timecounter *tc,   * @max_idle_ns:	max idle time permitted by the clocksource (nsecs)   * @flags:		flags describing special properties   * @vread:		vsyscall based read + * @suspend:		suspend function for the clocksource, if necessary   * @resume:		resume function for the clocksource, if necessary   */  struct clocksource { @@ -172,7 +173,8 @@ struct clocksource {  	u64 max_idle_ns;  	unsigned long flags;  	cycle_t (*vread)(void); -	void (*resume)(void); +	void (*suspend)(struct clocksource *cs); +	void (*resume)(struct clocksource *cs);  #ifdef CONFIG_IA64  	void *fsys_mmio;        /* used by fsyscall asm code */  #define CLKSRC_FSYS_MMIO_SET(mmio, addr)      ((mmio) = (addr)) @@ -271,12 +273,12 @@ static inline s64 clocksource_cyc2ns(cycle_t cycles, u32 mult, u32 shift)  } -/* used to install a new clocksource */  extern int clocksource_register(struct clocksource*);  extern void clocksource_unregister(struct clocksource*);  extern void clocksource_touch_watchdog(void);  extern struct clocksource* clocksource_get_next(void);  extern void clocksource_change_rating(struct clocksource *cs, int rating); +extern void clocksource_suspend(void);  extern void clocksource_resume(void);  extern struct clocksource * __init __weak clocksource_default_clock(void);  extern void clocksource_mark_unstable(struct clocksource *cs); @@ -284,6 +286,24 @@ extern void clocksource_mark_unstable(struct clocksource *cs);  extern void  clocks_calc_mult_shift(u32 *mult, u32 *shift, u32 from, u32 to, u32 minsec); +/* + * Don't call __clocksource_register_scale directly, use + * clocksource_register_hz/khz + */ +extern int +__clocksource_register_scale(struct clocksource *cs, u32 scale, u32 freq); + +static inline int clocksource_register_hz(struct clocksource *cs, u32 hz) +{ +	return __clocksource_register_scale(cs, 1, hz); +} + +static inline int clocksource_register_khz(struct clocksource *cs, u32 khz) +{ +	return __clocksource_register_scale(cs, 1000, khz); +} + +  static inline void  clocksource_calc_mult_shift(struct clocksource *cs, u32 freq, u32 minsec)  { diff --git a/include/linux/coda_psdev.h b/include/linux/coda_psdev.h index 5b5d4731f95..8859e2ede9f 100644 --- a/include/linux/coda_psdev.h +++ b/include/linux/coda_psdev.h @@ -7,6 +7,8 @@  #define MAX_CODADEVS  5	   /* how many do we allow */  #ifdef __KERNEL__ +#include <linux/backing-dev.h> +  struct kstatfs;  /* communication pending/processing queues */ @@ -17,6 +19,7 @@ struct venus_comm {  	struct list_head    vc_processing;  	int                 vc_inuse;  	struct super_block *vc_sb; +	struct backing_dev_info bdi;  }; diff --git a/include/linux/compaction.h b/include/linux/compaction.h new file mode 100644 index 00000000000..5ac51552d90 --- /dev/null +++ b/include/linux/compaction.h @@ -0,0 +1,89 @@ +#ifndef _LINUX_COMPACTION_H +#define _LINUX_COMPACTION_H + +/* Return values for compact_zone() and try_to_compact_pages() */ +/* compaction didn't start as it was not possible or direct reclaim was more suitable */ +#define COMPACT_SKIPPED		0 +/* compaction should continue to another pageblock */ +#define COMPACT_CONTINUE	1 +/* direct compaction partially compacted a zone and there are suitable pages */ +#define COMPACT_PARTIAL		2 +/* The full zone was compacted */ +#define COMPACT_COMPLETE	3 + +#ifdef CONFIG_COMPACTION +extern int sysctl_compact_memory; +extern int sysctl_compaction_handler(struct ctl_table *table, int write, +			void __user *buffer, size_t *length, loff_t *ppos); +extern int sysctl_extfrag_threshold; +extern int sysctl_extfrag_handler(struct ctl_table *table, int write, +			void __user *buffer, size_t *length, loff_t *ppos); + +extern int fragmentation_index(struct zone *zone, unsigned int order); +extern unsigned long try_to_compact_pages(struct zonelist *zonelist, +			int order, gfp_t gfp_mask, nodemask_t *mask); + +/* Do not skip compaction more than 64 times */ +#define COMPACT_MAX_DEFER_SHIFT 6 + +/* + * Compaction is deferred when compaction fails to result in a page + * allocation success. 1 << compact_defer_limit compactions are skipped up + * to a limit of 1 << COMPACT_MAX_DEFER_SHIFT + */ +static inline void defer_compaction(struct zone *zone) +{ +	zone->compact_considered = 0; +	zone->compact_defer_shift++; + +	if (zone->compact_defer_shift > COMPACT_MAX_DEFER_SHIFT) +		zone->compact_defer_shift = COMPACT_MAX_DEFER_SHIFT; +} + +/* Returns true if compaction should be skipped this time */ +static inline bool compaction_deferred(struct zone *zone) +{ +	unsigned long defer_limit = 1UL << zone->compact_defer_shift; + +	/* Avoid possible overflow */ +	if (++zone->compact_considered > defer_limit) +		zone->compact_considered = defer_limit; + +	return zone->compact_considered < (1UL << zone->compact_defer_shift); +} + +#else +static inline unsigned long try_to_compact_pages(struct zonelist *zonelist, +			int order, gfp_t gfp_mask, nodemask_t *nodemask) +{ +	return COMPACT_CONTINUE; +} + +static inline void defer_compaction(struct zone *zone) +{ +} + +static inline bool compaction_deferred(struct zone *zone) +{ +	return 1; +} + +#endif /* CONFIG_COMPACTION */ + +#if defined(CONFIG_COMPACTION) && defined(CONFIG_SYSFS) && defined(CONFIG_NUMA) +extern int compaction_register_node(struct node *node); +extern void compaction_unregister_node(struct node *node); + +#else + +static inline int compaction_register_node(struct node *node) +{ +	return 0; +} + +static inline void compaction_unregister_node(struct node *node) +{ +} +#endif /* CONFIG_COMPACTION && CONFIG_SYSFS && CONFIG_NUMA */ + +#endif /* _LINUX_COMPACTION_H */ diff --git a/include/linux/compat.h b/include/linux/compat.h index ef68119a4fd..168f7daa7bd 100644 --- a/include/linux/compat.h +++ b/include/linux/compat.h @@ -23,6 +23,7 @@  typedef __compat_uid32_t	compat_uid_t;  typedef __compat_gid32_t	compat_gid_t; +struct compat_sel_arg_struct;  struct rusage;  struct compat_itimerspec {  @@ -249,6 +250,8 @@ asmlinkage long compat_sys_select(int n, compat_ulong_t __user *inp,  		compat_ulong_t __user *outp, compat_ulong_t __user *exp,  		struct compat_timeval __user *tvp); +asmlinkage long compat_sys_old_select(struct compat_sel_arg_struct __user *arg); +  asmlinkage long compat_sys_wait4(compat_pid_t pid,  				 compat_uint_t __user *stat_addr, int options,  				 struct compat_rusage __user *ru); @@ -353,5 +356,9 @@ asmlinkage long compat_sys_newfstatat(unsigned int dfd, char __user * filename,  asmlinkage long compat_sys_openat(unsigned int dfd, const char __user *filename,  				  int flags, int mode); +extern ssize_t compat_rw_copy_check_uvector(int type, +		const struct compat_iovec __user *uvector, unsigned long nr_segs, +		unsigned long fast_segs, struct iovec *fast_pointer, +		struct iovec **ret_pointer);  #endif /* CONFIG_COMPAT */  #endif /* _LINUX_COMPAT_H */ diff --git a/include/linux/compiler.h b/include/linux/compiler.h index 5be3dab4a69..a5a472b1074 100644 --- a/include/linux/compiler.h +++ b/include/linux/compiler.h @@ -5,7 +5,7 @@  #ifdef __CHECKER__  # define __user		__attribute__((noderef, address_space(1))) -# define __kernel	/* default address space */ +# define __kernel	__attribute__((address_space(0)))  # define __safe		__attribute__((safe))  # define __force	__attribute__((force))  # define __nocast	__attribute__((nocast)) @@ -15,6 +15,7 @@  # define __acquire(x)	__context__(x,1)  # define __release(x)	__context__(x,-1)  # define __cond_lock(x,c)	((c) ? ({ __acquire(x); 1; }) : 0) +# define __percpu	__attribute__((noderef, address_space(3)))  extern void __chk_user_ptr(const volatile void __user *);  extern void __chk_io_ptr(const volatile void __iomem *);  #else @@ -32,6 +33,7 @@ extern void __chk_io_ptr(const volatile void __iomem *);  # define __acquire(x) (void)0  # define __release(x) (void)0  # define __cond_lock(x,c) (c) +# define __percpu  #endif  #ifdef __KERNEL__ diff --git a/include/linux/completion.h b/include/linux/completion.h index 4a6b604ef7e..51e3145196f 100644 --- a/include/linux/completion.h +++ b/include/linux/completion.h @@ -83,6 +83,8 @@ extern unsigned long wait_for_completion_timeout(struct completion *x,  						   unsigned long timeout);  extern unsigned long wait_for_completion_interruptible_timeout(  			struct completion *x, unsigned long timeout); +extern unsigned long wait_for_completion_killable_timeout( +			struct completion *x, unsigned long timeout);  extern bool try_wait_for_completion(struct completion *x);  extern bool completion_done(struct completion *x); diff --git a/include/linux/connector.h b/include/linux/connector.h index 72ba63eb83c..3a779ffba60 100644 --- a/include/linux/connector.h +++ b/include/linux/connector.h @@ -24,9 +24,6 @@  #include <linux/types.h> -#define CN_IDX_CONNECTOR		0xffffffff -#define CN_VAL_CONNECTOR		0xffffffff -  /*   * Process Events connector unique ids -- used for message routing   */ @@ -75,30 +72,6 @@ struct cn_msg {  	__u8 data[0];  }; -/* - * Notify structure - requests notification about - * registering/unregistering idx/val in range [first, first+range]. - */ -struct cn_notify_req { -	__u32 first; -	__u32 range; -}; - -/* - * Main notification control message - * *_notify_num 	- number of appropriate cn_notify_req structures after  - *				this struct. - * group 		- notification receiver's idx. - * len 			- total length of the attached data. - */ -struct cn_ctl_msg { -	__u32 idx_notify_num; -	__u32 val_notify_num; -	__u32 group; -	__u32 len; -	__u8 data[0]; -}; -  #ifdef __KERNEL__  #include <asm/atomic.h> @@ -151,11 +124,6 @@ struct cn_callback_entry {  	u32 seq, group;  }; -struct cn_ctl_entry { -	struct list_head notify_entry; -	struct cn_ctl_msg *msg; -}; -  struct cn_dev {  	struct cb_id id; diff --git a/include/linux/coredump.h b/include/linux/coredump.h new file mode 100644 index 00000000000..8ba66a9d902 --- /dev/null +++ b/include/linux/coredump.h @@ -0,0 +1,45 @@ +#ifndef _LINUX_COREDUMP_H +#define _LINUX_COREDUMP_H + +#include <linux/types.h> +#include <linux/mm.h> +#include <linux/fs.h> + +/* + * These are the only things you should do on a core-file: use only these + * functions to write out all the necessary info. + */ +static inline int dump_write(struct file *file, const void *addr, int nr) +{ +	return file->f_op->write(file, addr, nr, &file->f_pos) == nr; +} + +static inline int dump_seek(struct file *file, loff_t off) +{ +	int ret = 1; + +	if (file->f_op->llseek && file->f_op->llseek != no_llseek) { +		if (file->f_op->llseek(file, off, SEEK_CUR) < 0) +			return 0; +	} else { +		char *buf = (char *)get_zeroed_page(GFP_KERNEL); + +		if (!buf) +			return 0; +		while (off > 0) { +			unsigned long n = off; + +			if (n > PAGE_SIZE) +				n = PAGE_SIZE; +			if (!dump_write(file, buf, n)) { +				ret = 0; +				break; +			} +			off -= n; +		} +		free_page((unsigned long)buf); +	} +	return ret; +} + +#endif /* _LINUX_COREDUMP_H */ diff --git a/include/linux/cper.h b/include/linux/cper.h new file mode 100644 index 00000000000..4b38f905b70 --- /dev/null +++ b/include/linux/cper.h @@ -0,0 +1,314 @@ +/* + * UEFI Common Platform Error Record + * + * Copyright (C) 2010, Intel Corp. + *	Author: Huang Ying <ying.huang@intel.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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA + */ + +#ifndef LINUX_CPER_H +#define LINUX_CPER_H + +#include <linux/uuid.h> + +/* CPER record signature and the size */ +#define CPER_SIG_RECORD				"CPER" +#define CPER_SIG_SIZE				4 +/* Used in signature_end field in struct cper_record_header */ +#define CPER_SIG_END				0xffffffff + +/* + * CPER record header revision, used in revision field in struct + * cper_record_header + */ +#define CPER_RECORD_REV				0x0100 + +/* + * Severity difinition for error_severity in struct cper_record_header + * and section_severity in struct cper_section_descriptor + */ +#define CPER_SER_RECOVERABLE			0x0 +#define CPER_SER_FATAL				0x1 +#define CPER_SER_CORRECTED			0x2 +#define CPER_SER_INFORMATIONAL			0x3 + +/* + * Validation bits difinition for validation_bits in struct + * cper_record_header. If set, corresponding fields in struct + * cper_record_header contain valid information. + * + * corresponds platform_id + */ +#define CPER_VALID_PLATFORM_ID			0x0001 +/* corresponds timestamp */ +#define CPER_VALID_TIMESTAMP			0x0002 +/* corresponds partition_id */ +#define CPER_VALID_PARTITION_ID			0x0004 + +/* + * Notification type used to generate error record, used in + * notification_type in struct cper_record_header + * + * Corrected Machine Check + */ +#define CPER_NOTIFY_CMC							\ +	UUID_LE(0x2DCE8BB1, 0xBDD7, 0x450e, 0xB9, 0xAD, 0x9C, 0xF4,	\ +		0xEB, 0xD4, 0xF8, 0x90) +/* Corrected Platform Error */ +#define CPER_NOTIFY_CPE							\ +	UUID_LE(0x4E292F96, 0xD843, 0x4a55, 0xA8, 0xC2, 0xD4, 0x81,	\ +		0xF2, 0x7E, 0xBE, 0xEE) +/* Machine Check Exception */ +#define CPER_NOTIFY_MCE							\ +	UUID_LE(0xE8F56FFE, 0x919C, 0x4cc5, 0xBA, 0x88, 0x65, 0xAB,	\ +		0xE1, 0x49, 0x13, 0xBB) +/* PCI Express Error */ +#define CPER_NOTIFY_PCIE						\ +	UUID_LE(0xCF93C01F, 0x1A16, 0x4dfc, 0xB8, 0xBC, 0x9C, 0x4D,	\ +		0xAF, 0x67, 0xC1, 0x04) +/* INIT Record (for IPF) */ +#define CPER_NOTIFY_INIT						\ +	UUID_LE(0xCC5263E8, 0x9308, 0x454a, 0x89, 0xD0, 0x34, 0x0B,	\ +		0xD3, 0x9B, 0xC9, 0x8E) +/* Non-Maskable Interrupt */ +#define CPER_NOTIFY_NMI							\ +	UUID_LE(0x5BAD89FF, 0xB7E6, 0x42c9, 0x81, 0x4A, 0xCF, 0x24,	\ +		0x85, 0xD6, 0xE9, 0x8A) +/* BOOT Error Record */ +#define CPER_NOTIFY_BOOT						\ +	UUID_LE(0x3D61A466, 0xAB40, 0x409a, 0xA6, 0x98, 0xF3, 0x62,	\ +		0xD4, 0x64, 0xB3, 0x8F) +/* DMA Remapping Error */ +#define CPER_NOTIFY_DMAR						\ +	UUID_LE(0x667DD791, 0xC6B3, 0x4c27, 0x8A, 0x6B, 0x0F, 0x8E,	\ +		0x72, 0x2D, 0xEB, 0x41) + +/* + * Flags bits definitions for flags in struct cper_record_header + * If set, the error has been recovered + */ +#define CPER_HW_ERROR_FLAGS_RECOVERED		0x1 +/* If set, the error is for previous boot */ +#define CPER_HW_ERROR_FLAGS_PREVERR		0x2 +/* If set, the error is injected for testing */ +#define CPER_HW_ERROR_FLAGS_SIMULATED		0x4 + +/* + * CPER section header revision, used in revision field in struct + * cper_section_descriptor + */ +#define CPER_SEC_REV				0x0100 + +/* + * Validation bits difinition for validation_bits in struct + * cper_section_descriptor. If set, corresponding fields in struct + * cper_section_descriptor contain valid information. + * + * corresponds fru_id + */ +#define CPER_SEC_VALID_FRU_ID			0x1 +/* corresponds fru_text */ +#define CPER_SEC_VALID_FRU_TEXT			0x2 + +/* + * Flags bits definitions for flags in struct cper_section_descriptor + * + * If set, the section is associated with the error condition + * directly, and should be focused on + */ +#define CPER_SEC_PRIMARY			0x0001 +/* + * If set, the error was not contained within the processor or memory + * hierarchy and the error may have propagated to persistent storage + * or network + */ +#define CPER_SEC_CONTAINMENT_WARNING		0x0002 +/* If set, the component must be re-initialized or re-enabled prior to use */ +#define CPER_SEC_RESET				0x0004 +/* If set, Linux may choose to discontinue use of the resource */ +#define CPER_SEC_ERROR_THRESHOLD_EXCEEDED	0x0008 +/* + * If set, resource could not be queried for error information due to + * conflicts with other system software or resources. Some fields of + * the section will be invalid + */ +#define CPER_SEC_RESOURCE_NOT_ACCESSIBLE	0x0010 +/* + * If set, action has been taken to ensure error containment (such as + * poisoning data), but the error has not been fully corrected and the + * data has not been consumed. Linux may choose to take further + * corrective action before the data is consumed + */ +#define CPER_SEC_LATENT_ERROR			0x0020 + +/* + * Section type definitions, used in section_type field in struct + * cper_section_descriptor + * + * Processor Generic + */ +#define CPER_SEC_PROC_GENERIC						\ +	UUID_LE(0x9876CCAD, 0x47B4, 0x4bdb, 0xB6, 0x5E, 0x16, 0xF1,	\ +		0x93, 0xC4, 0xF3, 0xDB) +/* Processor Specific: X86/X86_64 */ +#define CPER_SEC_PROC_IA						\ +	UUID_LE(0xDC3EA0B0, 0xA144, 0x4797, 0xB9, 0x5B, 0x53, 0xFA,	\ +		0x24, 0x2B, 0x6E, 0x1D) +/* Processor Specific: IA64 */ +#define CPER_SEC_PROC_IPF						\ +	UUID_LE(0xE429FAF1, 0x3CB7, 0x11D4, 0x0B, 0xCA, 0x07, 0x00,	\ +		0x80, 0xC7, 0x3C, 0x88, 0x81) +/* Platform Memory */ +#define CPER_SEC_PLATFORM_MEM						\ +	UUID_LE(0xA5BC1114, 0x6F64, 0x4EDE, 0xB8, 0x63, 0x3E, 0x83,	\ +		0xED, 0x7C, 0x83, 0xB1) +#define CPER_SEC_PCIE							\ +	UUID_LE(0xD995E954, 0xBBC1, 0x430F, 0xAD, 0x91, 0xB4, 0x4D,	\ +		0xCB, 0x3C, 0x6F, 0x35) +/* Firmware Error Record Reference */ +#define CPER_SEC_FW_ERR_REC_REF						\ +	UUID_LE(0x81212A96, 0x09ED, 0x4996, 0x94, 0x71, 0x8D, 0x72,	\ +		0x9C, 0x8E, 0x69, 0xED) +/* PCI/PCI-X Bus */ +#define CPER_SEC_PCI_X_BUS						\ +	UUID_LE(0xC5753963, 0x3B84, 0x4095, 0xBF, 0x78, 0xED, 0xDA,	\ +		0xD3, 0xF9, 0xC9, 0xDD) +/* PCI Component/Device */ +#define CPER_SEC_PCI_DEV						\ +	UUID_LE(0xEB5E4685, 0xCA66, 0x4769, 0xB6, 0xA2, 0x26, 0x06,	\ +		0x8B, 0x00, 0x13, 0x26) +#define CPER_SEC_DMAR_GENERIC						\ +	UUID_LE(0x5B51FEF7, 0xC79D, 0x4434, 0x8F, 0x1B, 0xAA, 0x62,	\ +		0xDE, 0x3E, 0x2C, 0x64) +/* Intel VT for Directed I/O specific DMAr */ +#define CPER_SEC_DMAR_VT						\ +	UUID_LE(0x71761D37, 0x32B2, 0x45cd, 0xA7, 0xD0, 0xB0, 0xFE,	\ +		0xDD, 0x93, 0xE8, 0xCF) +/* IOMMU specific DMAr */ +#define CPER_SEC_DMAR_IOMMU						\ +	UUID_LE(0x036F84E1, 0x7F37, 0x428c, 0xA7, 0x9E, 0x57, 0x5F,	\ +		0xDF, 0xAA, 0x84, 0xEC) + +/* + * All tables and structs must be byte-packed to match CPER + * specification, since the tables are provided by the system BIOS + */ +#pragma pack(1) + +struct cper_record_header { +	char	signature[CPER_SIG_SIZE];	/* must be CPER_SIG_RECORD */ +	__u16	revision;			/* must be CPER_RECORD_REV */ +	__u32	signature_end;			/* must be CPER_SIG_END */ +	__u16	section_count; +	__u32	error_severity; +	__u32	validation_bits; +	__u32	record_length; +	__u64	timestamp; +	uuid_le	platform_id; +	uuid_le	partition_id; +	uuid_le	creator_id; +	uuid_le	notification_type; +	__u64	record_id; +	__u32	flags; +	__u64	persistence_information; +	__u8	reserved[12];			/* must be zero */ +}; + +struct cper_section_descriptor { +	__u32	section_offset;		/* Offset in bytes of the +					 *  section body from the base +					 *  of the record header */ +	__u32	section_length; +	__u16	revision;		/* must be CPER_RECORD_REV */ +	__u8	validation_bits; +	__u8	reserved;		/* must be zero */ +	__u32	flags; +	uuid_le	section_type; +	uuid_le	fru_id; +	__u32	section_severity; +	__u8	fru_text[20]; +}; + +/* Generic Processor Error Section */ +struct cper_sec_proc_generic { +	__u64	validation_bits; +	__u8	proc_type; +	__u8	proc_isa; +	__u8	proc_error_type; +	__u8	operation; +	__u8	flags; +	__u8	level; +	__u16	reserved; +	__u64	cpu_version; +	char	cpu_brand[128]; +	__u64	proc_id; +	__u64	target_addr; +	__u64	requestor_id; +	__u64	responder_id; +	__u64	ip; +}; + +/* IA32/X64 Processor Error Section */ +struct cper_sec_proc_ia { +	__u64	validation_bits; +	__u8	lapic_id; +	__u8	cpuid[48]; +}; + +/* IA32/X64 Processor Error Infomation Structure */ +struct cper_ia_err_info { +	uuid_le	err_type; +	__u64	validation_bits; +	__u64	check_info; +	__u64	target_id; +	__u64	requestor_id; +	__u64	responder_id; +	__u64	ip; +}; + +/* IA32/X64 Processor Context Information Structure */ +struct cper_ia_proc_ctx { +	__u16	reg_ctx_type; +	__u16	reg_arr_size; +	__u32	msr_addr; +	__u64	mm_reg_addr; +}; + +/* Memory Error Section */ +struct cper_sec_mem_err { +	__u64	validation_bits; +	__u64	error_status; +	__u64	physical_addr; +	__u64	physical_addr_mask; +	__u16	node; +	__u16	card; +	__u16	module; +	__u16	bank; +	__u16	device; +	__u16	row; +	__u16	column; +	__u16	bit_pos; +	__u64	requestor_id; +	__u64	responder_id; +	__u64	target_id; +	__u8	error_type; +}; + +/* Reset to default packing */ +#pragma pack() + +u64 cper_next_record_id(void); + +#endif diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h index 4de02b10007..9f15150ce8d 100644 --- a/include/linux/cpufreq.h +++ b/include/linux/cpufreq.h @@ -278,6 +278,27 @@ struct freq_attr {  	ssize_t (*store)(struct cpufreq_policy *, const char *, size_t count);  }; +#define cpufreq_freq_attr_ro(_name)		\ +static struct freq_attr _name =			\ +__ATTR(_name, 0444, show_##_name, NULL) + +#define cpufreq_freq_attr_ro_perm(_name, _perm)	\ +static struct freq_attr _name =			\ +__ATTR(_name, _perm, show_##_name, NULL) + +#define cpufreq_freq_attr_ro_old(_name)		\ +static struct freq_attr _name##_old =		\ +__ATTR(_name, 0444, show_##_name##_old, NULL) + +#define cpufreq_freq_attr_rw(_name)		\ +static struct freq_attr _name =			\ +__ATTR(_name, 0644, show_##_name, store_##_name) + +#define cpufreq_freq_attr_rw_old(_name)		\ +static struct freq_attr _name##_old =		\ +__ATTR(_name, 0644, show_##_name##_old, store_##_name##_old) + +  struct global_attr {  	struct attribute attr;  	ssize_t (*show)(struct kobject *kobj, @@ -286,6 +307,15 @@ struct global_attr {  			 const char *c, size_t count);  }; +#define define_one_global_ro(_name)		\ +static struct global_attr _name =		\ +__ATTR(_name, 0444, show_##_name, NULL) + +#define define_one_global_rw(_name)		\ +static struct global_attr _name =		\ +__ATTR(_name, 0644, show_##_name, store_##_name) + +  /*********************************************************************   *                        CPUFREQ 2.6. INTERFACE                     *   *********************************************************************/ diff --git a/include/linux/cpuidle.h b/include/linux/cpuidle.h index dcf77fa826b..55215cce500 100644 --- a/include/linux/cpuidle.h +++ b/include/linux/cpuidle.h @@ -125,6 +125,7 @@ struct cpuidle_driver {  #ifdef CONFIG_CPU_IDLE  extern int cpuidle_register_driver(struct cpuidle_driver *drv); +struct cpuidle_driver *cpuidle_get_driver(void);  extern void cpuidle_unregister_driver(struct cpuidle_driver *drv);  extern int cpuidle_register_device(struct cpuidle_device *dev);  extern void cpuidle_unregister_device(struct cpuidle_device *dev); @@ -137,16 +138,17 @@ extern void cpuidle_disable_device(struct cpuidle_device *dev);  #else  static inline int cpuidle_register_driver(struct cpuidle_driver *drv) -{return 0;} +{return -ENODEV; } +static inline struct cpuidle_driver *cpuidle_get_driver(void) {return NULL; }  static inline void cpuidle_unregister_driver(struct cpuidle_driver *drv) { }  static inline int cpuidle_register_device(struct cpuidle_device *dev) -{return 0;} +{return -ENODEV; }  static inline void cpuidle_unregister_device(struct cpuidle_device *dev) { }  static inline void cpuidle_pause_and_lock(void) { }  static inline void cpuidle_resume_and_unlock(void) { }  static inline int cpuidle_enable_device(struct cpuidle_device *dev) -{return 0;} +{return -ENODEV; }  static inline void cpuidle_disable_device(struct cpuidle_device *dev) { }  #endif diff --git a/include/linux/cpumask.h b/include/linux/cpumask.h index d77b54733c5..bae6fe24d1f 100644 --- a/include/linux/cpumask.h +++ b/include/linux/cpumask.h @@ -90,10 +90,10 @@ extern const struct cpumask *const cpu_active_mask;  #define cpu_present(cpu)	cpumask_test_cpu((cpu), cpu_present_mask)  #define cpu_active(cpu)		cpumask_test_cpu((cpu), cpu_active_mask)  #else -#define num_online_cpus()	1 -#define num_possible_cpus()	1 -#define num_present_cpus()	1 -#define num_active_cpus()	1 +#define num_online_cpus()	1U +#define num_possible_cpus()	1U +#define num_present_cpus()	1U +#define num_active_cpus()	1U  #define cpu_online(cpu)		((cpu) == 0)  #define cpu_possible(cpu)	((cpu) == 0)  #define cpu_present(cpu)	((cpu) == 0) @@ -143,6 +143,8 @@ static inline unsigned int cpumask_any_but(const struct cpumask *mask,  #define for_each_cpu(cpu, mask)			\  	for ((cpu) = 0; (cpu) < 1; (cpu)++, (void)mask) +#define for_each_cpu_not(cpu, mask)		\ +	for ((cpu) = 0; (cpu) < 1; (cpu)++, (void)mask)  #define for_each_cpu_and(cpu, mask, and)	\  	for ((cpu) = 0; (cpu) < 1; (cpu)++, (void)mask, (void)and)  #else @@ -203,6 +205,18 @@ int cpumask_any_but(const struct cpumask *mask, unsigned int cpu);  		(cpu) < nr_cpu_ids;)  /** + * for_each_cpu_not - iterate over every cpu in a complemented mask + * @cpu: the (optionally unsigned) integer iterator + * @mask: the cpumask pointer + * + * After the loop, cpu is >= nr_cpu_ids. + */ +#define for_each_cpu_not(cpu, mask)				\ +	for ((cpu) = -1;					\ +		(cpu) = cpumask_next_zero((cpu), (mask)),	\ +		(cpu) < nr_cpu_ids;) + +/**   * for_each_cpu_and - iterate over every cpu in both masks   * @cpu: the (optionally unsigned) integer iterator   * @mask: the first cpumask pointer diff --git a/include/linux/cpuset.h b/include/linux/cpuset.h index a5740fc4d04..457ed765a11 100644 --- a/include/linux/cpuset.h +++ b/include/linux/cpuset.h @@ -21,8 +21,7 @@ extern int number_of_cpusets;	/* How many cpusets are defined in system? */  extern int cpuset_init(void);  extern void cpuset_init_smp(void);  extern void cpuset_cpus_allowed(struct task_struct *p, struct cpumask *mask); -extern void cpuset_cpus_allowed_locked(struct task_struct *p, -				       struct cpumask *mask); +extern int cpuset_cpus_allowed_fallback(struct task_struct *p);  extern nodemask_t cpuset_mems_allowed(struct task_struct *p);  #define cpuset_current_mems_allowed (current->mems_allowed)  void cpuset_init_current_mems_allowed(void); @@ -69,10 +68,8 @@ struct seq_file;  extern void cpuset_task_status_allowed(struct seq_file *m,  					struct task_struct *task); -extern void cpuset_lock(void); -extern void cpuset_unlock(void); -  extern int cpuset_mem_spread_node(void); +extern int cpuset_slab_spread_node(void);  static inline int cpuset_do_page_mem_spread(void)  { @@ -90,9 +87,44 @@ extern void rebuild_sched_domains(void);  extern void cpuset_print_task_mems_allowed(struct task_struct *p); +/* + * reading current mems_allowed and mempolicy in the fastpath must protected + * by get_mems_allowed() + */ +static inline void get_mems_allowed(void) +{ +	current->mems_allowed_change_disable++; + +	/* +	 * ensure that reading mems_allowed and mempolicy happens after the +	 * update of ->mems_allowed_change_disable. +	 * +	 * the write-side task finds ->mems_allowed_change_disable is not 0, +	 * and knows the read-side task is reading mems_allowed or mempolicy, +	 * so it will clear old bits lazily. +	 */ +	smp_mb(); +} + +static inline void put_mems_allowed(void) +{ +	/* +	 * ensure that reading mems_allowed and mempolicy before reducing +	 * mems_allowed_change_disable. +	 * +	 * the write-side task will know that the read-side task is still +	 * reading mems_allowed or mempolicy, don't clears old bits in the +	 * nodemask. +	 */ +	smp_mb(); +	--ACCESS_ONCE(current->mems_allowed_change_disable); +} +  static inline void set_mems_allowed(nodemask_t nodemask)  { +	task_lock(current);  	current->mems_allowed = nodemask; +	task_unlock(current);  }  #else /* !CONFIG_CPUSETS */ @@ -105,10 +137,11 @@ static inline void cpuset_cpus_allowed(struct task_struct *p,  {  	cpumask_copy(mask, cpu_possible_mask);  } -static inline void cpuset_cpus_allowed_locked(struct task_struct *p, -					      struct cpumask *mask) + +static inline int cpuset_cpus_allowed_fallback(struct task_struct *p)  { -	cpumask_copy(mask, cpu_possible_mask); +	cpumask_copy(&p->cpus_allowed, cpu_possible_mask); +	return cpumask_any(cpu_active_mask);  }  static inline nodemask_t cpuset_mems_allowed(struct task_struct *p) @@ -157,14 +190,16 @@ static inline void cpuset_task_status_allowed(struct seq_file *m,  {  } -static inline void cpuset_lock(void) {} -static inline void cpuset_unlock(void) {} -  static inline int cpuset_mem_spread_node(void)  {  	return 0;  } +static inline int cpuset_slab_spread_node(void) +{ +	return 0; +} +  static inline int cpuset_do_page_mem_spread(void)  {  	return 0; @@ -193,6 +228,14 @@ static inline void set_mems_allowed(nodemask_t nodemask)  {  } +static inline void get_mems_allowed(void) +{ +} + +static inline void put_mems_allowed(void) +{ +} +  #endif /* !CONFIG_CPUSETS */  #endif /* _LINUX_CPUSET_H */ diff --git a/include/linux/cred.h b/include/linux/cred.h index 4e3387a89cb..75c0fa88130 100644 --- a/include/linux/cred.h +++ b/include/linux/cred.h @@ -156,7 +156,6 @@ extern int copy_creds(struct task_struct *, unsigned long);  extern struct cred *cred_alloc_blank(void);  extern struct cred *prepare_creds(void);  extern struct cred *prepare_exec_creds(void); -extern struct cred *prepare_usermodehelper_creds(void);  extern int commit_creds(struct cred *);  extern void abort_creds(struct cred *);  extern const struct cred *override_creds(const struct cred *); @@ -280,7 +279,7 @@ static inline void put_cred(const struct cred *_cred)   * task or by holding tasklist_lock to prevent it from being unlinked.   */  #define __task_cred(task) \ -	((const struct cred *)(rcu_dereference((task)->real_cred))) +	((const struct cred *)(rcu_dereference_check((task)->real_cred, rcu_read_lock_held() || lockdep_tasklist_lock_is_held())))  /**   * get_task_cred - Get another task's objective credentials diff --git a/include/linux/crypto.h b/include/linux/crypto.h index 24d2e30f1b4..a6a7a1c83f5 100644 --- a/include/linux/crypto.h +++ b/include/linux/crypto.h @@ -99,13 +99,7 @@   * as arm where pointers are 32-bit aligned but there are data types such as   * u64 which require 64-bit alignment.   */ -#if defined(ARCH_KMALLOC_MINALIGN)  #define CRYPTO_MINALIGN ARCH_KMALLOC_MINALIGN -#elif defined(ARCH_SLAB_MINALIGN) -#define CRYPTO_MINALIGN ARCH_SLAB_MINALIGN -#else -#define CRYPTO_MINALIGN __alignof__(unsigned long long) -#endif  #define CRYPTO_MINALIGN_ATTR __attribute__ ((__aligned__(CRYPTO_MINALIGN))) diff --git a/include/linux/davinci_emac.h b/include/linux/davinci_emac.h new file mode 100644 index 00000000000..7c930dba477 --- /dev/null +++ b/include/linux/davinci_emac.h @@ -0,0 +1,39 @@ +/* + * TI DaVinci EMAC platform support + * + * Author: Kevin Hilman, Deep Root Systems, LLC + * + * 2007 (c) Deep Root Systems, LLC. This file is licensed under + * the terms of the GNU General Public License version 2. This program + * is licensed "as is" without any warranty of any kind, whether express + * or implied. + */ +#ifndef _LINUX_DAVINCI_EMAC_H +#define _LINUX_DAVINCI_EMAC_H + +#include <linux/if_ether.h> +#include <linux/memory.h> + +struct emac_platform_data { +	char mac_addr[ETH_ALEN]; +	u32 ctrl_reg_offset; +	u32 ctrl_mod_reg_offset; +	u32 ctrl_ram_offset; +	u32 hw_ram_addr; +	u32 mdio_reg_offset; +	u32 ctrl_ram_size; +	u32 phy_mask; +	u32 mdio_max_freq; +	u8 rmii_en; +	u8 version; +	void (*interrupt_enable) (void); +	void (*interrupt_disable) (void); +}; + +enum { +	EMAC_VERSION_1,	/* DM644x */ +	EMAC_VERSION_2,	/* DM646x */ +}; + +void davinci_get_mac_addr(struct memory_accessor *mem_acc, void *context); +#endif diff --git a/include/linux/dcache.h b/include/linux/dcache.h index 30b93b2a01a..eebb617c17d 100644 --- a/include/linux/dcache.h +++ b/include/linux/dcache.h @@ -186,6 +186,8 @@ d_iput:		no		no		no       yes  #define DCACHE_FSNOTIFY_PARENT_WATCHED	0x0080 /* Parent inode is watched by some fsnotify listener */ +#define DCACHE_CANT_MOUNT	0x0100 +  extern spinlock_t dcache_lock;  extern seqlock_t rename_lock; @@ -358,6 +360,18 @@ static inline int d_unlinked(struct dentry *dentry)  	return d_unhashed(dentry) && !IS_ROOT(dentry);  } +static inline int cant_mount(struct dentry *dentry) +{ +	return (dentry->d_flags & DCACHE_CANT_MOUNT); +} + +static inline void dont_mount(struct dentry *dentry) +{ +	spin_lock(&dentry->d_lock); +	dentry->d_flags |= DCACHE_CANT_MOUNT; +	spin_unlock(&dentry->d_lock); +} +  static inline struct dentry *dget_parent(struct dentry *dentry)  {  	struct dentry *ret; diff --git a/include/linux/dcbnl.h b/include/linux/dcbnl.h index b7cdbb4373d..8723491f7df 100644 --- a/include/linux/dcbnl.h +++ b/include/linux/dcbnl.h @@ -22,8 +22,6 @@  #include <linux/types.h> -#define DCB_PROTO_VERSION 1 -  struct dcbmsg {  	__u8               dcb_family;  	__u8               cmd; diff --git a/include/linux/debugfs.h b/include/linux/debugfs.h index fc1b930f246..e7d9b20ddc5 100644 --- a/include/linux/debugfs.h +++ b/include/linux/debugfs.h @@ -63,6 +63,8 @@ struct dentry *debugfs_create_x16(const char *name, mode_t mode,  				  struct dentry *parent, u16 *value);  struct dentry *debugfs_create_x32(const char *name, mode_t mode,  				  struct dentry *parent, u32 *value); +struct dentry *debugfs_create_x64(const char *name, mode_t mode, +				  struct dentry *parent, u64 *value);  struct dentry *debugfs_create_size_t(const char *name, mode_t mode,  				     struct dentry *parent, size_t *value);  struct dentry *debugfs_create_bool(const char *name, mode_t mode, diff --git a/include/linux/debugobjects.h b/include/linux/debugobjects.h index 8c243aaa86a..597692f1fc8 100644 --- a/include/linux/debugobjects.h +++ b/include/linux/debugobjects.h @@ -20,12 +20,14 @@ struct debug_obj_descr;   * struct debug_obj - representaion of an tracked object   * @node:	hlist node to link the object into the tracker list   * @state:	tracked object state + * @astate:	current active state   * @object:	pointer to the real object   * @descr:	pointer to an object type specific debug description structure   */  struct debug_obj {  	struct hlist_node	node;  	enum debug_obj_state	state; +	unsigned int		astate;  	void			*object;  	struct debug_obj_descr	*descr;  }; @@ -60,6 +62,15 @@ extern void debug_object_deactivate(void *addr, struct debug_obj_descr *descr);  extern void debug_object_destroy   (void *addr, struct debug_obj_descr *descr);  extern void debug_object_free      (void *addr, struct debug_obj_descr *descr); +/* + * Active state: + * - Set at 0 upon initialization. + * - Must return to 0 before deactivation. + */ +extern void +debug_object_active_state(void *addr, struct debug_obj_descr *descr, +			  unsigned int expect, unsigned int next); +  extern void debug_objects_early_init(void);  extern void debug_objects_mem_init(void);  #else diff --git a/include/linux/decompress/mm.h b/include/linux/decompress/mm.h index 5032b9a31ae..ad5ec1d0475 100644 --- a/include/linux/decompress/mm.h +++ b/include/linux/decompress/mm.h @@ -14,11 +14,21 @@  /* Code active when included from pre-boot environment: */ +/* + * Some architectures want to ensure there is no local data in their + * pre-boot environment, so that data can arbitarily relocated (via + * GOT references).  This is achieved by defining STATIC_RW_DATA to + * be null. + */ +#ifndef STATIC_RW_DATA +#define STATIC_RW_DATA static +#endif +  /* A trivial malloc implementation, adapted from   *  malloc by Hannu Savolainen 1993 and Matthias Urlichs 1994   */ -static unsigned long malloc_ptr; -static int malloc_count; +STATIC_RW_DATA unsigned long malloc_ptr; +STATIC_RW_DATA int malloc_count;  static void *malloc(int size)  { diff --git a/include/linux/delayacct.h b/include/linux/delayacct.h index 5076fe0c8a9..6cee17c2231 100644 --- a/include/linux/delayacct.h +++ b/include/linux/delayacct.h @@ -18,6 +18,7 @@  #define _LINUX_DELAYACCT_H  #include <linux/sched.h> +#include <linux/slab.h>  /*   * Per-task flags relevant to delay accounting diff --git a/include/linux/device-mapper.h b/include/linux/device-mapper.h index d4c9c0b88ad..1381cd97b4e 100644 --- a/include/linux/device-mapper.h +++ b/include/linux/device-mapper.h @@ -118,10 +118,9 @@ struct dm_dev {  /*   * Constructors should call these functions to ensure destination devices   * are opened/closed correctly. - * FIXME: too many arguments.   */ -int dm_get_device(struct dm_target *ti, const char *path, sector_t start, -		  sector_t len, fmode_t mode, struct dm_dev **result); +int dm_get_device(struct dm_target *ti, const char *path, fmode_t mode, +						 struct dm_dev **result);  void dm_put_device(struct dm_target *ti, struct dm_dev *d);  /* diff --git a/include/linux/device.h b/include/linux/device.h index a62799f2ab0..0713e10571d 100644 --- a/include/linux/device.h +++ b/include/linux/device.h @@ -22,7 +22,6 @@  #include <linux/types.h>  #include <linux/module.h>  #include <linux/pm.h> -#include <linux/semaphore.h>  #include <asm/atomic.h>  #include <asm/device.h> @@ -34,6 +33,7 @@ struct class;  struct class_private;  struct bus_type;  struct bus_type_private; +struct device_node;  struct bus_attribute {  	struct attribute	attr; @@ -106,7 +106,7 @@ extern int bus_unregister_notifier(struct bus_type *bus,  /* All 4 notifers below get called with the target struct device *   * as an argument. Note that those functions are likely to be called - * with the device semaphore held in the core, so be careful. + * with the device lock held in the core, so be careful.   */  #define BUS_NOTIFY_ADD_DEVICE		0x00000001 /* device added */  #define BUS_NOTIFY_DEL_DEVICE		0x00000002 /* device removed */ @@ -128,6 +128,10 @@ struct device_driver {  	bool suppress_bind_attrs;	/* disables bind/unbind via sysfs */ +#if defined(CONFIG_OF) +	const struct of_device_id	*of_match_table; +#endif +  	int (*probe) (struct device *dev);  	int (*remove) (struct device *dev);  	void (*shutdown) (struct device *dev); @@ -203,6 +207,9 @@ struct class {  	int (*suspend)(struct device *dev, pm_message_t state);  	int (*resume)(struct device *dev); +	const struct kobj_ns_type_operations *ns_type; +	const void *(*namespace)(struct device *dev); +  	const struct dev_pm_ops *pm;  	struct class_private *p; @@ -251,8 +258,10 @@ extern struct device *class_find_device(struct class *class,  struct class_attribute {  	struct attribute attr; -	ssize_t (*show)(struct class *class, char *buf); -	ssize_t (*store)(struct class *class, const char *buf, size_t count); +	ssize_t (*show)(struct class *class, struct class_attribute *attr, +			char *buf); +	ssize_t (*store)(struct class *class, struct class_attribute *attr, +			const char *buf, size_t count);  };  #define CLASS_ATTR(_name, _mode, _show, _store)			\ @@ -263,6 +272,23 @@ extern int __must_check class_create_file(struct class *class,  extern void class_remove_file(struct class *class,  			      const struct class_attribute *attr); +/* Simple class attribute that is just a static string */ + +struct class_attribute_string { +	struct class_attribute attr; +	char *str; +}; + +/* Currently read-only only */ +#define _CLASS_ATTR_STRING(_name, _mode, _str) \ +	{ __ATTR(_name, _mode, show_class_attr_string, NULL), _str } +#define CLASS_ATTR_STRING(_name, _mode, _str) \ +	struct class_attribute_string class_attr_##_name = \ +		_CLASS_ATTR_STRING(_name, _mode, _str) + +extern ssize_t show_class_attr_string(struct class *class, struct class_attribute *attr, +                        char *buf); +  struct class_interface {  	struct list_head	node;  	struct class		*class; @@ -385,7 +411,7 @@ struct device {  	const char		*init_name; /* initial name of the device */  	struct device_type	*type; -	struct semaphore	sem;	/* semaphore to synchronize calls to +	struct mutex		mutex;	/* mutex to synchronize calls to  					 * its driver.  					 */ @@ -414,6 +440,9 @@ struct device {  					     override */  	/* arch specific additions */  	struct dev_archdata	archdata; +#ifdef CONFIG_OF +	struct device_node	*of_node; +#endif  	dev_t			devt;	/* dev_t, creates the sysfs "dev" */ @@ -432,6 +461,10 @@ struct device {  static inline const char *dev_name(const struct device *dev)  { +	/* Use the init name until the kobject becomes available */ +	if (dev->init_name) +		return dev->init_name; +  	return kobject_name(&dev->kobj);  } @@ -472,6 +505,38 @@ static inline int device_is_registered(struct device *dev)  	return dev->kobj.state_in_sysfs;  } +static inline void device_enable_async_suspend(struct device *dev) +{ +	if (dev->power.status == DPM_ON) +		dev->power.async_suspend = true; +} + +static inline void device_disable_async_suspend(struct device *dev) +{ +	if (dev->power.status == DPM_ON) +		dev->power.async_suspend = false; +} + +static inline bool device_async_suspend_enabled(struct device *dev) +{ +	return !!dev->power.async_suspend; +} + +static inline void device_lock(struct device *dev) +{ +	mutex_lock(&dev->mutex); +} + +static inline int device_trylock(struct device *dev) +{ +	return mutex_trylock(&dev->mutex); +} + +static inline void device_unlock(struct device *dev) +{ +	mutex_unlock(&dev->mutex); +} +  void driver_init(void);  /* diff --git a/include/linux/dm-io.h b/include/linux/dm-io.h index b6bf17ee2f6..5c9186b93ff 100644 --- a/include/linux/dm-io.h +++ b/include/linux/dm-io.h @@ -37,14 +37,14 @@ enum dm_io_mem_type {  struct dm_io_memory {  	enum dm_io_mem_type type; +	unsigned offset; +  	union {  		struct page_list *pl;  		struct bio_vec *bvec;  		void *vma;  		void *addr;  	} ptr; - -	unsigned offset;  };  struct dm_io_notify { diff --git a/include/linux/dm-ioctl.h b/include/linux/dm-ioctl.h index aa95508d2f9..2c445e11379 100644 --- a/include/linux/dm-ioctl.h +++ b/include/linux/dm-ioctl.h @@ -266,9 +266,9 @@ enum {  #define DM_DEV_SET_GEOMETRY	_IOWR(DM_IOCTL, DM_DEV_SET_GEOMETRY_CMD, struct dm_ioctl)  #define DM_VERSION_MAJOR	4 -#define DM_VERSION_MINOR	16 +#define DM_VERSION_MINOR	17  #define DM_VERSION_PATCHLEVEL	0 -#define DM_VERSION_EXTRA	"-ioctl (2009-11-05)" +#define DM_VERSION_EXTRA	"-ioctl (2010-03-05)"  /* Status bits */  #define DM_READONLY_FLAG	(1 << 0) /* In/Out */ @@ -316,4 +316,9 @@ enum {   */  #define DM_QUERY_INACTIVE_TABLE_FLAG	(1 << 12) /* In */ +/* + * If set, a uevent was generated for which the caller may need to wait. + */ +#define DM_UEVENT_GENERATED_FLAG	(1 << 13) /* Out */ +  #endif				/* _LINUX_DM_IOCTL_H */ diff --git a/include/linux/dm9000.h b/include/linux/dm9000.h index c30879cf93b..96e87693d93 100644 --- a/include/linux/dm9000.h +++ b/include/linux/dm9000.h @@ -23,7 +23,7 @@  #define DM9000_PLATF_NO_EEPROM	(0x0010)  #define DM9000_PLATF_SIMPLE_PHY (0x0020)  /* Use NSR to find LinkStatus */ -/* platfrom data for platfrom device structure's platfrom_data field */ +/* platform data for platform device structure's platform_data field */  struct dm9000_plat_data {  	unsigned int	flags; diff --git a/include/linux/dma-mapping.h b/include/linux/dma-mapping.h index 91b76184606..89b7e1a605b 100644 --- a/include/linux/dma-mapping.h +++ b/include/linux/dma-mapping.h @@ -40,16 +40,6 @@ struct dma_map_ops {  	void (*sync_single_for_device)(struct device *dev,  				       dma_addr_t dma_handle, size_t size,  				       enum dma_data_direction dir); -	void (*sync_single_range_for_cpu)(struct device *dev, -					  dma_addr_t dma_handle, -					  unsigned long offset, -					  size_t size, -					  enum dma_data_direction dir); -	void (*sync_single_range_for_device)(struct device *dev, -					     dma_addr_t dma_handle, -					     unsigned long offset, -					     size_t size, -					     enum dma_data_direction dir);  	void (*sync_sg_for_cpu)(struct device *dev,  				struct scatterlist *sg, int nents,  				enum dma_data_direction dir); @@ -105,21 +95,6 @@ static inline int is_device_dma_capable(struct device *dev)  #include <asm-generic/dma-mapping-broken.h>  #endif -/* for backwards compatibility, removed soon */ -static inline void __deprecated dma_sync_single(struct device *dev, -						dma_addr_t addr, size_t size, -						enum dma_data_direction dir) -{ -	dma_sync_single_for_cpu(dev, addr, size, dir); -} - -static inline void __deprecated dma_sync_sg(struct device *dev, -					    struct scatterlist *sg, int nelems, -					    enum dma_data_direction dir) -{ -	dma_sync_sg_for_cpu(dev, sg, nelems, dir); -} -  static inline u64 dma_get_mask(struct device *dev)  {  	if (dev && dev->dma_mask && *dev->dma_mask) @@ -127,6 +102,14 @@ static inline u64 dma_get_mask(struct device *dev)  	return DMA_BIT_MASK(32);  } +static inline int dma_set_coherent_mask(struct device *dev, u64 mask) +{ +	if (!dma_supported(dev, mask)) +		return -EIO; +	dev->coherent_dma_mask = mask; +	return 0; +} +  extern u64 dma_get_required_mask(struct device *dev);  static inline unsigned int dma_get_max_seg_size(struct device *dev) @@ -232,4 +215,20 @@ struct dma_attrs;  #endif /* CONFIG_HAVE_DMA_ATTRS */ +#ifdef CONFIG_NEED_DMA_MAP_STATE +#define DEFINE_DMA_UNMAP_ADDR(ADDR_NAME)        dma_addr_t ADDR_NAME +#define DEFINE_DMA_UNMAP_LEN(LEN_NAME)          __u32 LEN_NAME +#define dma_unmap_addr(PTR, ADDR_NAME)           ((PTR)->ADDR_NAME) +#define dma_unmap_addr_set(PTR, ADDR_NAME, VAL)  (((PTR)->ADDR_NAME) = (VAL)) +#define dma_unmap_len(PTR, LEN_NAME)             ((PTR)->LEN_NAME) +#define dma_unmap_len_set(PTR, LEN_NAME, VAL)    (((PTR)->LEN_NAME) = (VAL)) +#else +#define DEFINE_DMA_UNMAP_ADDR(ADDR_NAME) +#define DEFINE_DMA_UNMAP_LEN(LEN_NAME) +#define dma_unmap_addr(PTR, ADDR_NAME)           (0) +#define dma_unmap_addr_set(PTR, ADDR_NAME, VAL)  do { } while (0) +#define dma_unmap_len(PTR, LEN_NAME)             (0) +#define dma_unmap_len_set(PTR, LEN_NAME, VAL)    do { } while (0) +#endif +  #endif diff --git a/include/linux/dmaengine.h b/include/linux/dmaengine.h index 78784982b33..5204f018931 100644 --- a/include/linux/dmaengine.h +++ b/include/linux/dmaengine.h @@ -31,6 +31,8 @@   * if dma_cookie_t is >0 it's a DMA request cookie, <0 it's an error code   */  typedef s32 dma_cookie_t; +#define DMA_MIN_COOKIE	1 +#define DMA_MAX_COOKIE	INT_MAX  #define dma_submit_error(cookie) ((cookie) < 0 ? 1 : 0) @@ -38,11 +40,13 @@ typedef s32 dma_cookie_t;   * enum dma_status - DMA transaction status   * @DMA_SUCCESS: transaction completed successfully   * @DMA_IN_PROGRESS: transaction not yet processed + * @DMA_PAUSED: transaction is paused   * @DMA_ERROR: transaction failed   */  enum dma_status {  	DMA_SUCCESS,  	DMA_IN_PROGRESS, +	DMA_PAUSED,  	DMA_ERROR,  }; @@ -105,6 +109,19 @@ enum dma_ctrl_flags {  };  /** + * enum dma_ctrl_cmd - DMA operations that can optionally be exercised + * on a running channel. + * @DMA_TERMINATE_ALL: terminate all ongoing transfers + * @DMA_PAUSE: pause ongoing transfers + * @DMA_RESUME: resume paused transfer + */ +enum dma_ctrl_cmd { +	DMA_TERMINATE_ALL, +	DMA_PAUSE, +	DMA_RESUME, +}; + +/**   * enum sum_check_bits - bit position of pq_check_flags   */  enum sum_check_bits { @@ -162,7 +179,7 @@ struct dma_chan {  	struct dma_chan_dev *dev;  	struct list_head device_node; -	struct dma_chan_percpu *local; +	struct dma_chan_percpu __percpu *local;  	int client_count;  	int table_count;  	void *private; @@ -228,9 +245,84 @@ struct dma_async_tx_descriptor {  	dma_cookie_t (*tx_submit)(struct dma_async_tx_descriptor *tx);  	dma_async_tx_callback callback;  	void *callback_param; +#ifndef CONFIG_ASYNC_TX_DISABLE_CHANNEL_SWITCH  	struct dma_async_tx_descriptor *next;  	struct dma_async_tx_descriptor *parent;  	spinlock_t lock; +#endif +}; + +#ifdef CONFIG_ASYNC_TX_DISABLE_CHANNEL_SWITCH +static inline void txd_lock(struct dma_async_tx_descriptor *txd) +{ +} +static inline void txd_unlock(struct dma_async_tx_descriptor *txd) +{ +} +static inline void txd_chain(struct dma_async_tx_descriptor *txd, struct dma_async_tx_descriptor *next) +{ +	BUG(); +} +static inline void txd_clear_parent(struct dma_async_tx_descriptor *txd) +{ +} +static inline void txd_clear_next(struct dma_async_tx_descriptor *txd) +{ +} +static inline struct dma_async_tx_descriptor *txd_next(struct dma_async_tx_descriptor *txd) +{ +	return NULL; +} +static inline struct dma_async_tx_descriptor *txd_parent(struct dma_async_tx_descriptor *txd) +{ +	return NULL; +} + +#else +static inline void txd_lock(struct dma_async_tx_descriptor *txd) +{ +	spin_lock_bh(&txd->lock); +} +static inline void txd_unlock(struct dma_async_tx_descriptor *txd) +{ +	spin_unlock_bh(&txd->lock); +} +static inline void txd_chain(struct dma_async_tx_descriptor *txd, struct dma_async_tx_descriptor *next) +{ +	txd->next = next; +	next->parent = txd; +} +static inline void txd_clear_parent(struct dma_async_tx_descriptor *txd) +{ +	txd->parent = NULL; +} +static inline void txd_clear_next(struct dma_async_tx_descriptor *txd) +{ +	txd->next = NULL; +} +static inline struct dma_async_tx_descriptor *txd_parent(struct dma_async_tx_descriptor *txd) +{ +	return txd->parent; +} +static inline struct dma_async_tx_descriptor *txd_next(struct dma_async_tx_descriptor *txd) +{ +	return txd->next; +} +#endif + +/** + * struct dma_tx_state - filled in to report the status of + * a transfer. + * @last: last completed DMA cookie + * @used: last issued DMA cookie (i.e. the one in progress) + * @residue: the remaining number of bytes left to transmit + *	on the selected transfer for states DMA_IN_PROGRESS and + *	DMA_PAUSED if this is implemented in the driver, else 0 + */ +struct dma_tx_state { +	dma_cookie_t last; +	dma_cookie_t used; +	u32 residue;  };  /** @@ -259,8 +351,12 @@ struct dma_async_tx_descriptor {   * @device_prep_dma_memset: prepares a memset operation   * @device_prep_dma_interrupt: prepares an end of chain interrupt operation   * @device_prep_slave_sg: prepares a slave dma operation - * @device_terminate_all: terminate all pending operations - * @device_is_tx_complete: poll for transaction completion + * @device_control: manipulate all pending operations on a channel, returns + *	zero or error code + * @device_tx_status: poll for transaction completion, the optional + *	txstate parameter can be supplied with a pointer to get a + *	struct with auxilary transfer status information, otherwise the call + *	will just return a simple status code   * @device_issue_pending: push pending transactions to hardware   */  struct dma_device { @@ -311,11 +407,12 @@ struct dma_device {  		struct dma_chan *chan, struct scatterlist *sgl,  		unsigned int sg_len, enum dma_data_direction direction,  		unsigned long flags); -	void (*device_terminate_all)(struct dma_chan *chan); +	int (*device_control)(struct dma_chan *chan, enum dma_ctrl_cmd cmd, +		unsigned long arg); -	enum dma_status (*device_is_tx_complete)(struct dma_chan *chan, -			dma_cookie_t cookie, dma_cookie_t *last, -			dma_cookie_t *used); +	enum dma_status (*device_tx_status)(struct dma_chan *chan, +					    dma_cookie_t cookie, +					    struct dma_tx_state *txstate);  	void (*device_issue_pending)(struct dma_chan *chan);  }; @@ -556,7 +653,15 @@ static inline void dma_async_issue_pending(struct dma_chan *chan)  static inline enum dma_status dma_async_is_tx_complete(struct dma_chan *chan,  	dma_cookie_t cookie, dma_cookie_t *last, dma_cookie_t *used)  { -	return chan->device->device_is_tx_complete(chan, cookie, last, used); +	struct dma_tx_state state; +	enum dma_status status; + +	status = chan->device->device_tx_status(chan, cookie, &state); +	if (last) +		*last = state.last; +	if (used) +		*used = state.used; +	return status;  }  #define dma_async_memcpy_complete(chan, cookie, last, used)\ @@ -584,6 +689,16 @@ static inline enum dma_status dma_async_is_complete(dma_cookie_t cookie,  	return DMA_IN_PROGRESS;  } +static inline void +dma_set_tx_state(struct dma_tx_state *st, dma_cookie_t last, dma_cookie_t used, u32 residue) +{ +	if (st) { +		st->last = last; +		st->used = used; +		st->residue = residue; +	} +} +  enum dma_status dma_sync_wait(struct dma_chan *chan, dma_cookie_t cookie);  #ifdef CONFIG_DMA_ENGINE  enum dma_status dma_wait_for_async_tx(struct dma_async_tx_descriptor *tx); diff --git a/include/linux/dqblk_xfs.h b/include/linux/dqblk_xfs.h index 527504c11c5..4389ae72024 100644 --- a/include/linux/dqblk_xfs.h +++ b/include/linux/dqblk_xfs.h @@ -110,6 +110,15 @@ typedef struct fs_disk_quota {  #define FS_DQ_WARNS_MASK	(FS_DQ_BWARNS | FS_DQ_IWARNS | FS_DQ_RTBWARNS)  /* + * Accounting values.  These can only be set for filesystem with + * non-transactional quotas that require quotacheck(8) in userspace. + */ +#define FS_DQ_BCOUNT		(1<<12) +#define FS_DQ_ICOUNT		(1<<13) +#define FS_DQ_RTBCOUNT		(1<<14) +#define FS_DQ_ACCT_MASK		(FS_DQ_BCOUNT | FS_DQ_ICOUNT | FS_DQ_RTBCOUNT) + +/*   * Various flags related to quotactl(2).  Only relevant to XFS filesystems.   */  #define XFS_QUOTA_UDQ_ACCT	(1<<0)  /* user quota accounting */ diff --git a/include/linux/drbd.h b/include/linux/drbd.h index 78962272338..68530521ad0 100644 --- a/include/linux/drbd.h +++ b/include/linux/drbd.h @@ -53,10 +53,10 @@  extern const char *drbd_buildtag(void); -#define REL_VERSION "8.3.7" +#define REL_VERSION "8.3.8rc1"  #define API_VERSION 88  #define PRO_VERSION_MIN 86 -#define PRO_VERSION_MAX 91 +#define PRO_VERSION_MAX 94  enum drbd_io_error_p { @@ -139,6 +139,7 @@ enum drbd_ret_codes {  	ERR_DATA_NOT_CURRENT	= 150,  	ERR_CONNECTED		= 151, /* DRBD 8.3 only */  	ERR_PERM		= 152, +	ERR_NEED_APV_93		= 153,  	/* insert new ones above this line */  	AFTER_LAST_ERR_CODE diff --git a/include/linux/drbd_limits.h b/include/linux/drbd_limits.h index 51f47a586ad..440b42e38e8 100644 --- a/include/linux/drbd_limits.h +++ b/include/linux/drbd_limits.h @@ -133,5 +133,21 @@  #define DRBD_MAX_BIO_BVECS_MAX 128  #define DRBD_MAX_BIO_BVECS_DEF 0 +#define DRBD_DP_VOLUME_MIN 4 +#define DRBD_DP_VOLUME_MAX 1048576 +#define DRBD_DP_VOLUME_DEF 16384 + +#define DRBD_DP_INTERVAL_MIN 1 +#define DRBD_DP_INTERVAL_MAX 600 +#define DRBD_DP_INTERVAL_DEF 5 + +#define DRBD_RS_THROTTLE_TH_MIN 1 +#define DRBD_RS_THROTTLE_TH_MAX 600 +#define DRBD_RS_THROTTLE_TH_DEF 20 + +#define DRBD_RS_HOLD_OFF_TH_MIN 1 +#define DRBD_RS_HOLD_OFF_TH_MAX 6000 +#define DRBD_RS_HOLD_OFF_TH_DEF 100 +  #undef RANGE  #endif diff --git a/include/linux/drbd_nl.h b/include/linux/drbd_nl.h index a4d82f89599..ce77a746fc9 100644 --- a/include/linux/drbd_nl.h +++ b/include/linux/drbd_nl.h @@ -12,7 +12,7 @@  #endif  NL_PACKET(primary, 1, -       NL_BIT(		1,	T_MAY_IGNORE,	overwrite_peer) +       NL_BIT(		1,	T_MAY_IGNORE,	primary_force)  )  NL_PACKET(secondary, 2, ) @@ -63,6 +63,7 @@ NL_PACKET(net_conf, 5,  	NL_BIT(		41,	T_MAY_IGNORE,	always_asbp)  	NL_BIT(		61,	T_MAY_IGNORE,	no_cork)  	NL_BIT(		62,	T_MANDATORY,	auto_sndbuf_size) +	NL_BIT(		70,	T_MANDATORY,	dry_run)  )  NL_PACKET(disconnect, 6, ) @@ -70,12 +71,17 @@ NL_PACKET(disconnect, 6, )  NL_PACKET(resize, 7,  	NL_INT64(		29,	T_MAY_IGNORE,	resize_size)  	NL_BIT(			68,	T_MAY_IGNORE,	resize_force) +	NL_BIT(			69,	T_MANDATORY,	no_resync)  )  NL_PACKET(syncer_conf, 8,  	NL_INTEGER(	30,	T_MAY_IGNORE,	rate)  	NL_INTEGER(	31,	T_MAY_IGNORE,	after)  	NL_INTEGER(	32,	T_MAY_IGNORE,	al_extents) +	NL_INTEGER(     71,	T_MAY_IGNORE,	dp_volume) +	NL_INTEGER(     72,	T_MAY_IGNORE,	dp_interval) +	NL_INTEGER(     73,	T_MAY_IGNORE,	throttle_th) +	NL_INTEGER(     74,	T_MAY_IGNORE,	hold_off_th)  	NL_STRING(      52,     T_MAY_IGNORE,   verify_alg,     SHARED_SECRET_MAX)  	NL_STRING(      51,     T_MAY_IGNORE,   cpu_mask,       32)  	NL_STRING(	64,	T_MAY_IGNORE,	csums_alg,	SHARED_SECRET_MAX) diff --git a/include/linux/ds2782_battery.h b/include/linux/ds2782_battery.h new file mode 100644 index 00000000000..b4e281f65c1 --- /dev/null +++ b/include/linux/ds2782_battery.h @@ -0,0 +1,8 @@ +#ifndef __LINUX_DS2782_BATTERY_H +#define __LINUX_DS2782_BATTERY_H + +struct ds278x_platform_data { +	int rsns; +}; + +#endif diff --git a/include/linux/dynamic_debug.h b/include/linux/dynamic_debug.h index f8c2e176750..b3cd4de9432 100644 --- a/include/linux/dynamic_debug.h +++ b/include/linux/dynamic_debug.h @@ -28,7 +28,7 @@ struct _ddebug {  	/*   	 * The flags field controls the behaviour at the callsite.   	 * The bits here are changed dynamically when the user - 	 * writes commands to <debugfs>/dynamic_debug/ddebug +	 * writes commands to <debugfs>/dynamic_debug/control  	 */  #define _DPRINTK_FLAGS_PRINT   (1<<0)  /* printk() a message using the format */  #define _DPRINTK_FLAGS_DEFAULT 0 diff --git a/include/linux/early_res.h b/include/linux/early_res.h new file mode 100644 index 00000000000..29c09f57a13 --- /dev/null +++ b/include/linux/early_res.h @@ -0,0 +1,23 @@ +#ifndef _LINUX_EARLY_RES_H +#define _LINUX_EARLY_RES_H +#ifdef __KERNEL__ + +extern void reserve_early(u64 start, u64 end, char *name); +extern void reserve_early_overlap_ok(u64 start, u64 end, char *name); +extern void free_early(u64 start, u64 end); +void free_early_partial(u64 start, u64 end); +extern void early_res_to_bootmem(u64 start, u64 end); + +void reserve_early_without_check(u64 start, u64 end, char *name); +u64 find_early_area(u64 ei_start, u64 ei_last, u64 start, u64 end, +			 u64 size, u64 align); +u64 find_early_area_size(u64 ei_start, u64 ei_last, u64 start, +			 u64 *sizep, u64 align); +u64 find_fw_memmap_area(u64 start, u64 end, u64 size, u64 align); +u64 get_max_mapped(void); +#include <linux/range.h> +int get_free_all_memory_range(struct range **rangep, int nodeid); + +#endif /* __KERNEL__ */ + +#endif /* _LINUX_EARLY_RES_H */ diff --git a/include/linux/elevator.h b/include/linux/elevator.h index 1cb3372e65d..2c958f4fce1 100644 --- a/include/linux/elevator.h +++ b/include/linux/elevator.h @@ -14,6 +14,9 @@ typedef void (elevator_merged_fn) (struct request_queue *, struct request *, int  typedef int (elevator_allow_merge_fn) (struct request_queue *, struct request *, struct bio *); +typedef void (elevator_bio_merged_fn) (struct request_queue *, +						struct request *, struct bio *); +  typedef int (elevator_dispatch_fn) (struct request_queue *, int);  typedef void (elevator_add_req_fn) (struct request_queue *, struct request *); @@ -36,6 +39,7 @@ struct elevator_ops  	elevator_merged_fn *elevator_merged_fn;  	elevator_merge_req_fn *elevator_merge_req_fn;  	elevator_allow_merge_fn *elevator_allow_merge_fn; +	elevator_bio_merged_fn *elevator_bio_merged_fn;  	elevator_dispatch_fn *elevator_dispatch_fn;  	elevator_add_req_fn *elevator_add_req_fn; @@ -103,6 +107,8 @@ extern int elv_merge(struct request_queue *, struct request **, struct bio *);  extern void elv_merge_requests(struct request_queue *, struct request *,  			       struct request *);  extern void elv_merged_request(struct request_queue *, struct request *, int); +extern void elv_bio_merged(struct request_queue *q, struct request *, +				struct bio *);  extern void elv_requeue_request(struct request_queue *, struct request *);  extern int elv_queue_empty(struct request_queue *);  extern struct request *elv_former_request(struct request_queue *, struct request *); diff --git a/include/linux/elf.h b/include/linux/elf.h index 0cc4d55151b..4d608014753 100644 --- a/include/linux/elf.h +++ b/include/linux/elf.h @@ -50,6 +50,28 @@ typedef __s64	Elf64_Sxword;  #define PT_GNU_STACK	(PT_LOOS + 0x474e551) +/* + * Extended Numbering + * + * If the real number of program header table entries is larger than + * or equal to PN_XNUM(0xffff), it is set to sh_info field of the + * section header at index 0, and PN_XNUM is set to e_phnum + * field. Otherwise, the section header at index 0 is zero + * initialized, if it exists. + * + * Specifications are available in: + * + * - Sun microsystems: Linker and Libraries. + *   Part No: 817-1984-17, September 2008. + *   URL: http://docs.sun.com/app/docs/doc/817-1984 + * + * - System V ABI AMD64 Architecture Processor Supplement + *   Draft Version 0.99., + *   May 11, 2009. + *   URL: http://www.x86-64.org/ + */ +#define PN_XNUM 0xffff +  /* These constants define the different elf file types */  #define ET_NONE   0  #define ET_REL    1 @@ -286,7 +308,7 @@ typedef struct elf64_phdr {  #define SHN_COMMON	0xfff2  #define SHN_HIRESERVE	0xffff -typedef struct { +typedef struct elf32_shdr {    Elf32_Word	sh_name;    Elf32_Word	sh_type;    Elf32_Word	sh_flags; @@ -349,7 +371,11 @@ typedef struct elf64_shdr {  #define ELF_OSABI ELFOSABI_NONE  #endif -/* Notes used in ET_CORE */ +/* + * Notes used in ET_CORE. Architectures export some of the arch register sets + * using the corresponding note types via the PTRACE_GETREGSET and + * PTRACE_SETREGSET requests. + */  #define NT_PRSTATUS	1  #define NT_PRFPREG	2  #define NT_PRPSINFO	3 @@ -361,7 +387,14 @@ typedef struct elf64_shdr {  #define NT_PPC_VSX	0x102		/* PowerPC VSX registers */  #define NT_386_TLS	0x200		/* i386 TLS slots (struct user_desc) */  #define NT_386_IOPERM	0x201		/* x86 io permission bitmap (1=deny) */ +#define NT_X86_XSTATE	0x202		/* x86 extended state using xsave */  #define NT_S390_HIGH_GPRS	0x300	/* s390 upper register halves */ +#define NT_S390_TIMER	0x301		/* s390 timer register */ +#define NT_S390_TODCMP	0x302		/* s390 TOD clock comparator register */ +#define NT_S390_TODPREG	0x303		/* s390 TOD programmable register */ +#define NT_S390_CTRS	0x304		/* s390 control registers */ +#define NT_S390_PREFIX	0x305		/* s390 prefix register */ +#define NT_S390_LAST_BREAK	0x306	/* s390 breaking event address */  /* Note header in a PT_NOTE section */ @@ -384,16 +417,20 @@ typedef struct elf64_note {  extern Elf32_Dyn _DYNAMIC [];  #define elfhdr		elf32_hdr  #define elf_phdr	elf32_phdr +#define elf_shdr	elf32_shdr  #define elf_note	elf32_note  #define elf_addr_t	Elf32_Off +#define Elf_Half	Elf32_Half  #else  extern Elf64_Dyn _DYNAMIC [];  #define elfhdr		elf64_hdr  #define elf_phdr	elf64_phdr +#define elf_shdr	elf64_shdr  #define elf_note	elf64_note  #define elf_addr_t	Elf64_Off +#define Elf_Half	Elf64_Half  #endif diff --git a/include/linux/elfcore.h b/include/linux/elfcore.h index 00d6a68d042..394a3e0e4a6 100644 --- a/include/linux/elfcore.h +++ b/include/linux/elfcore.h @@ -8,6 +8,8 @@  #include <linux/user.h>  #endif  #include <linux/ptrace.h> +#include <linux/elf.h> +#include <linux/fs.h>  struct elf_siginfo  { @@ -148,7 +150,22 @@ static inline int elf_core_copy_task_xfpregs(struct task_struct *t, elf_fpxregse  }  #endif -#endif /* __KERNEL__ */ +/* + * These functions parameterize elf_core_dump in fs/binfmt_elf.c to write out + * extra segments containing the gate DSO contents.  Dumping its + * contents makes post-mortem fully interpretable later without matching up + * the same kernel and hardware config to see what PC values meant. + * Dumping its extra ELF program headers includes all the other information + * a debugger needs to easily find how the gate DSO was being used. + */ +extern Elf_Half elf_core_extra_phdrs(void); +extern int +elf_core_write_extra_phdrs(struct file *file, loff_t offset, size_t *size, +			   unsigned long limit); +extern int +elf_core_write_extra_data(struct file *file, size_t *size, unsigned long limit); +extern size_t elf_core_extra_data_size(void); +#endif /* __KERNEL__ */  #endif /* _LINUX_ELFCORE_H */ diff --git a/include/linux/err.h b/include/linux/err.h index 1b12642636c..448afc12c78 100644 --- a/include/linux/err.h +++ b/include/linux/err.h @@ -19,22 +19,22 @@  #define IS_ERR_VALUE(x) unlikely((x) >= (unsigned long)-MAX_ERRNO) -static inline void *ERR_PTR(long error) +static inline void * __must_check ERR_PTR(long error)  {  	return (void *) error;  } -static inline long PTR_ERR(const void *ptr) +static inline long __must_check PTR_ERR(const void *ptr)  {  	return (long) ptr;  } -static inline long IS_ERR(const void *ptr) +static inline long __must_check IS_ERR(const void *ptr)  {  	return IS_ERR_VALUE((unsigned long)ptr);  } -static inline long IS_ERR_OR_NULL(const void *ptr) +static inline long __must_check IS_ERR_OR_NULL(const void *ptr)  {  	return !ptr || IS_ERR_VALUE((unsigned long)ptr);  } @@ -46,7 +46,7 @@ static inline long IS_ERR_OR_NULL(const void *ptr)   * Explicitly cast an error-valued pointer to another pointer type in such a   * way as to make it clear that's what's going on.   */ -static inline void *ERR_CAST(const void *ptr) +static inline void * __must_check ERR_CAST(const void *ptr)  {  	/* cast away the const */  	return (void *) ptr; diff --git a/include/linux/ethtool.h b/include/linux/ethtool.h index ef4a2d84d92..276b40a1683 100644 --- a/include/linux/ethtool.h +++ b/include/linux/ethtool.h @@ -61,6 +61,13 @@ struct ethtool_drvinfo {  				/* For PCI devices, use pci_name(pci_dev). */  	char	reserved1[32];  	char	reserved2[12]; +				/* +				 * Some struct members below are filled in +				 * using ops->get_sset_count().  Obtaining +				 * this info from ethtool_drvinfo is now +				 * deprecated; Use ETHTOOL_GSSET_INFO +				 * instead. +				 */  	__u32	n_priv_flags;	/* number of flags valid in ETHTOOL_GPFLAGS */  	__u32	n_stats;	/* number of u64's from ETHTOOL_GSTATS */  	__u32	testinfo_len; @@ -242,6 +249,7 @@ enum ethtool_stringset {  	ETH_SS_TEST		= 0,  	ETH_SS_STATS,  	ETH_SS_PRIV_FLAGS, +	ETH_SS_NTUPLE_FILTERS,  };  /* for passing string sets for data tagging */ @@ -252,6 +260,17 @@ struct ethtool_gstrings {  	__u8	data[0];  }; +struct ethtool_sset_info { +	__u32	cmd;		/* ETHTOOL_GSSET_INFO */ +	__u32	reserved; +	__u64	sset_mask;	/* input: each bit selects an sset to query */ +				/* output: each bit a returned sset */ +	__u32	data[0];	/* ETH_SS_xxx count, in order, based on bits +				   in sset_mask.  One bit implies one +				   __u32, two bits implies two +				   __u32's, etc. */ +}; +  enum ethtool_test_flags {  	ETH_TEST_FL_OFFLINE	= (1 << 0),	/* online / offline */  	ETH_TEST_FL_FAILED	= (1 << 1),	/* test passed / failed */ @@ -290,6 +309,8 @@ struct ethtool_perm_addr {   */  enum ethtool_flags {  	ETH_FLAG_LRO		= (1 << 15),	/* LRO is enabled */ +	ETH_FLAG_NTUPLE		= (1 << 27),	/* N-tuple filters enabled */ +	ETH_FLAG_RXHASH		= (1 << 28),  };  /* The following structures are for supporting RX network flow @@ -363,6 +384,35 @@ struct ethtool_rxnfc {  	__u32				rule_locs[0];  }; +struct ethtool_rx_ntuple_flow_spec { +	__u32		 flow_type; +	union { +		struct ethtool_tcpip4_spec		tcp_ip4_spec; +		struct ethtool_tcpip4_spec		udp_ip4_spec; +		struct ethtool_tcpip4_spec		sctp_ip4_spec; +		struct ethtool_ah_espip4_spec		ah_ip4_spec; +		struct ethtool_ah_espip4_spec		esp_ip4_spec; +		struct ethtool_rawip4_spec		raw_ip4_spec; +		struct ethtool_ether_spec		ether_spec; +		struct ethtool_usrip4_spec		usr_ip4_spec; +		__u8					hdata[64]; +	} h_u, m_u; /* entry, mask */ + +	__u16	        vlan_tag; +	__u16	        vlan_tag_mask; +	__u64		data;      /* user-defined flow spec data */ +	__u64		data_mask; /* user-defined flow spec mask */ + +	/* signed to distinguish between queue and actions (DROP) */ +	__s32		action; +#define ETHTOOL_RXNTUPLE_ACTION_DROP -1 +}; + +struct ethtool_rx_ntuple { +	__u32					cmd; +	struct ethtool_rx_ntuple_flow_spec	fs; +}; +  #define ETHTOOL_FLASH_MAX_FILENAME	128  enum ethtool_flash_op_type {  	ETHTOOL_FLASH_ALL_REGIONS	= 0, @@ -377,6 +427,20 @@ struct ethtool_flash {  #ifdef __KERNEL__ +#include <linux/rculist.h> + +struct ethtool_rx_ntuple_flow_spec_container { +	struct ethtool_rx_ntuple_flow_spec fs; +	struct list_head list; +}; + +struct ethtool_rx_ntuple_list { +#define ETHTOOL_MAX_NTUPLE_LIST_ENTRY 1024 +#define ETHTOOL_MAX_NTUPLE_STRING_PER_ENTRY 14 +	struct list_head	list; +	unsigned int		count; +}; +  struct net_device;  /* Some generic methods drivers may use in their ethtool_ops */ @@ -394,6 +458,7 @@ u32 ethtool_op_get_ufo(struct net_device *dev);  int ethtool_op_set_ufo(struct net_device *dev, u32 data);  u32 ethtool_op_get_flags(struct net_device *dev);  int ethtool_op_set_flags(struct net_device *dev, u32 data); +void ethtool_ntuple_flush(struct net_device *dev);  /**   * ðtool_ops - Alter and report network device settings @@ -426,12 +491,12 @@ int ethtool_op_set_flags(struct net_device *dev, u32 data);   * get_ufo: Report whether UDP fragmentation offload is enabled   * set_ufo: Turn UDP fragmentation offload on or off   * self_test: Run specified self-tests - * get_strings: Return a set of strings that describe the requested objects  + * get_strings: Return a set of strings that describe the requested objects   * phys_id: Identify the device   * get_stats: Return statistics about the device   * get_flags: get 32-bit flags bitmap   * set_flags: set 32-bit flags bitmap - *  + *   * Description:   *   * get_settings: @@ -467,14 +532,20 @@ struct ethtool_ops {  	int	(*nway_reset)(struct net_device *);  	u32	(*get_link)(struct net_device *);  	int	(*get_eeprom_len)(struct net_device *); -	int	(*get_eeprom)(struct net_device *, struct ethtool_eeprom *, u8 *); -	int	(*set_eeprom)(struct net_device *, struct ethtool_eeprom *, u8 *); +	int	(*get_eeprom)(struct net_device *, +			      struct ethtool_eeprom *, u8 *); +	int	(*set_eeprom)(struct net_device *, +			      struct ethtool_eeprom *, u8 *);  	int	(*get_coalesce)(struct net_device *, struct ethtool_coalesce *);  	int	(*set_coalesce)(struct net_device *, struct ethtool_coalesce *); -	void	(*get_ringparam)(struct net_device *, struct ethtool_ringparam *); -	int	(*set_ringparam)(struct net_device *, struct ethtool_ringparam *); -	void	(*get_pauseparam)(struct net_device *, struct ethtool_pauseparam*); -	int	(*set_pauseparam)(struct net_device *, struct ethtool_pauseparam*); +	void	(*get_ringparam)(struct net_device *, +				 struct ethtool_ringparam *); +	int	(*set_ringparam)(struct net_device *, +				 struct ethtool_ringparam *); +	void	(*get_pauseparam)(struct net_device *, +				  struct ethtool_pauseparam*); +	int	(*set_pauseparam)(struct net_device *, +				  struct ethtool_pauseparam*);  	u32	(*get_rx_csum)(struct net_device *);  	int	(*set_rx_csum)(struct net_device *, u32);  	u32	(*get_tx_csum)(struct net_device *); @@ -486,20 +557,25 @@ struct ethtool_ops {  	void	(*self_test)(struct net_device *, struct ethtool_test *, u64 *);  	void	(*get_strings)(struct net_device *, u32 stringset, u8 *);  	int	(*phys_id)(struct net_device *, u32); -	void	(*get_ethtool_stats)(struct net_device *, struct ethtool_stats *, u64 *); +	void	(*get_ethtool_stats)(struct net_device *, +				     struct ethtool_stats *, u64 *);  	int	(*begin)(struct net_device *);  	void	(*complete)(struct net_device *); -	u32     (*get_ufo)(struct net_device *); -	int     (*set_ufo)(struct net_device *, u32); -	u32     (*get_flags)(struct net_device *); -	int     (*set_flags)(struct net_device *, u32); -	u32     (*get_priv_flags)(struct net_device *); -	int     (*set_priv_flags)(struct net_device *, u32); +	u32	(*get_ufo)(struct net_device *); +	int	(*set_ufo)(struct net_device *, u32); +	u32	(*get_flags)(struct net_device *); +	int	(*set_flags)(struct net_device *, u32); +	u32	(*get_priv_flags)(struct net_device *); +	int	(*set_priv_flags)(struct net_device *, u32);  	int	(*get_sset_count)(struct net_device *, int); -	int	(*get_rxnfc)(struct net_device *, struct ethtool_rxnfc *, void *); +	int	(*get_rxnfc)(struct net_device *, +			     struct ethtool_rxnfc *, void *);  	int	(*set_rxnfc)(struct net_device *, struct ethtool_rxnfc *); -	int     (*flash_device)(struct net_device *, struct ethtool_flash *); +	int	(*flash_device)(struct net_device *, struct ethtool_flash *);  	int	(*reset)(struct net_device *, u32 *); +	int	(*set_rx_ntuple)(struct net_device *, +				 struct ethtool_rx_ntuple *); +	int	(*get_rx_ntuple)(struct net_device *, u32 stringset, void *);  };  #endif /* __KERNEL__ */ @@ -510,29 +586,29 @@ struct ethtool_ops {  #define ETHTOOL_GREGS		0x00000004 /* Get NIC registers. */  #define ETHTOOL_GWOL		0x00000005 /* Get wake-on-lan options. */  #define ETHTOOL_SWOL		0x00000006 /* Set wake-on-lan options. */ -#define ETHTOOL_GMSGLVL		0x00000007 /* Get driver message level */ -#define ETHTOOL_SMSGLVL		0x00000008 /* Set driver msg level. */ +#define ETHTOOL_GMSGLVL	0x00000007 /* Get driver message level */ +#define ETHTOOL_SMSGLVL	0x00000008 /* Set driver msg level. */  #define ETHTOOL_NWAY_RST	0x00000009 /* Restart autonegotiation. */  #define ETHTOOL_GLINK		0x0000000a /* Get link status (ethtool_value) */ -#define ETHTOOL_GEEPROM		0x0000000b /* Get EEPROM data */ -#define ETHTOOL_SEEPROM		0x0000000c /* Set EEPROM data. */ +#define ETHTOOL_GEEPROM	0x0000000b /* Get EEPROM data */ +#define ETHTOOL_SEEPROM	0x0000000c /* Set EEPROM data. */  #define ETHTOOL_GCOALESCE	0x0000000e /* Get coalesce config */  #define ETHTOOL_SCOALESCE	0x0000000f /* Set coalesce config. */  #define ETHTOOL_GRINGPARAM	0x00000010 /* Get ring parameters */  #define ETHTOOL_SRINGPARAM	0x00000011 /* Set ring parameters. */  #define ETHTOOL_GPAUSEPARAM	0x00000012 /* Get pause parameters */  #define ETHTOOL_SPAUSEPARAM	0x00000013 /* Set pause parameters. */ -#define ETHTOOL_GRXCSUM		0x00000014 /* Get RX hw csum enable (ethtool_value) */ -#define ETHTOOL_SRXCSUM		0x00000015 /* Set RX hw csum enable (ethtool_value) */ -#define ETHTOOL_GTXCSUM		0x00000016 /* Get TX hw csum enable (ethtool_value) */ -#define ETHTOOL_STXCSUM		0x00000017 /* Set TX hw csum enable (ethtool_value) */ +#define ETHTOOL_GRXCSUM	0x00000014 /* Get RX hw csum enable (ethtool_value) */ +#define ETHTOOL_SRXCSUM	0x00000015 /* Set RX hw csum enable (ethtool_value) */ +#define ETHTOOL_GTXCSUM	0x00000016 /* Get TX hw csum enable (ethtool_value) */ +#define ETHTOOL_STXCSUM	0x00000017 /* Set TX hw csum enable (ethtool_value) */  #define ETHTOOL_GSG		0x00000018 /* Get scatter-gather enable  					    * (ethtool_value) */  #define ETHTOOL_SSG		0x00000019 /* Set scatter-gather enable  					    * (ethtool_value). */  #define ETHTOOL_TEST		0x0000001a /* execute NIC self-test. */  #define ETHTOOL_GSTRINGS	0x0000001b /* get specified string set */ -#define ETHTOOL_PHYS_ID		0x0000001c /* identify the NIC */ +#define ETHTOOL_PHYS_ID	0x0000001c /* identify the NIC */  #define ETHTOOL_GSTATS		0x0000001d /* get NIC-specific statistics */  #define ETHTOOL_GTSO		0x0000001e /* Get TSO enable (ethtool_value) */  #define ETHTOOL_STSO		0x0000001f /* Set TSO enable (ethtool_value) */ @@ -543,21 +619,24 @@ struct ethtool_ops {  #define ETHTOOL_SGSO		0x00000024 /* Set GSO enable (ethtool_value) */  #define ETHTOOL_GFLAGS		0x00000025 /* Get flags bitmap(ethtool_value) */  #define ETHTOOL_SFLAGS		0x00000026 /* Set flags bitmap(ethtool_value) */ -#define ETHTOOL_GPFLAGS		0x00000027 /* Get driver-private flags bitmap */ -#define ETHTOOL_SPFLAGS		0x00000028 /* Set driver-private flags bitmap */ +#define ETHTOOL_GPFLAGS	0x00000027 /* Get driver-private flags bitmap */ +#define ETHTOOL_SPFLAGS	0x00000028 /* Set driver-private flags bitmap */ -#define	ETHTOOL_GRXFH		0x00000029 /* Get RX flow hash configuration */ -#define	ETHTOOL_SRXFH		0x0000002a /* Set RX flow hash configuration */ +#define ETHTOOL_GRXFH		0x00000029 /* Get RX flow hash configuration */ +#define ETHTOOL_SRXFH		0x0000002a /* Set RX flow hash configuration */  #define ETHTOOL_GGRO		0x0000002b /* Get GRO enable (ethtool_value) */  #define ETHTOOL_SGRO		0x0000002c /* Set GRO enable (ethtool_value) */ -#define	ETHTOOL_GRXRINGS	0x0000002d /* Get RX rings available for LB */ -#define	ETHTOOL_GRXCLSRLCNT	0x0000002e /* Get RX class rule count */ -#define	ETHTOOL_GRXCLSRULE	0x0000002f /* Get RX classification rule */ -#define	ETHTOOL_GRXCLSRLALL	0x00000030 /* Get all RX classification rule */ -#define	ETHTOOL_SRXCLSRLDEL	0x00000031 /* Delete RX classification rule */ -#define	ETHTOOL_SRXCLSRLINS	0x00000032 /* Insert RX classification rule */ -#define	ETHTOOL_FLASHDEV	0x00000033 /* Flash firmware to device */ -#define	ETHTOOL_RESET		0x00000034 /* Reset hardware */ +#define ETHTOOL_GRXRINGS	0x0000002d /* Get RX rings available for LB */ +#define ETHTOOL_GRXCLSRLCNT	0x0000002e /* Get RX class rule count */ +#define ETHTOOL_GRXCLSRULE	0x0000002f /* Get RX classification rule */ +#define ETHTOOL_GRXCLSRLALL	0x00000030 /* Get all RX classification rule */ +#define ETHTOOL_SRXCLSRLDEL	0x00000031 /* Delete RX classification rule */ +#define ETHTOOL_SRXCLSRLINS	0x00000032 /* Insert RX classification rule */ +#define ETHTOOL_FLASHDEV	0x00000033 /* Flash firmware to device */ +#define ETHTOOL_RESET		0x00000034 /* Reset hardware */ +#define ETHTOOL_SRXNTUPLE	0x00000035 /* Add an n-tuple filter to device */ +#define ETHTOOL_GRXNTUPLE	0x00000036 /* Get n-tuple filters from device */ +#define ETHTOOL_GSSET_INFO	0x00000037 /* Get string set info */  /* compatibility with older code */  #define SPARC_ETH_GSET		ETHTOOL_GSET @@ -566,18 +645,18 @@ struct ethtool_ops {  /* Indicates what features are supported by the interface. */  #define SUPPORTED_10baseT_Half		(1 << 0)  #define SUPPORTED_10baseT_Full		(1 << 1) -#define SUPPORTED_100baseT_Half		(1 << 2) -#define SUPPORTED_100baseT_Full		(1 << 3) +#define SUPPORTED_100baseT_Half	(1 << 2) +#define SUPPORTED_100baseT_Full	(1 << 3)  #define SUPPORTED_1000baseT_Half	(1 << 4)  #define SUPPORTED_1000baseT_Full	(1 << 5)  #define SUPPORTED_Autoneg		(1 << 6)  #define SUPPORTED_TP			(1 << 7)  #define SUPPORTED_AUI			(1 << 8)  #define SUPPORTED_MII			(1 << 9) -#define SUPPORTED_FIBRE			(1 << 10) +#define SUPPORTED_FIBRE		(1 << 10)  #define SUPPORTED_BNC			(1 << 11)  #define SUPPORTED_10000baseT_Full	(1 << 12) -#define SUPPORTED_Pause			(1 << 13) +#define SUPPORTED_Pause		(1 << 13)  #define SUPPORTED_Asym_Pause		(1 << 14)  #define SUPPORTED_2500baseX_Full	(1 << 15)  #define SUPPORTED_Backplane		(1 << 16) @@ -587,8 +666,8 @@ struct ethtool_ops {  #define SUPPORTED_10000baseR_FEC	(1 << 20)  /* Indicates what features are advertised by the interface. */ -#define ADVERTISED_10baseT_Half		(1 << 0) -#define ADVERTISED_10baseT_Full		(1 << 1) +#define ADVERTISED_10baseT_Half	(1 << 0) +#define ADVERTISED_10baseT_Full	(1 << 1)  #define ADVERTISED_100baseT_Half	(1 << 2)  #define ADVERTISED_100baseT_Full	(1 << 3)  #define ADVERTISED_1000baseT_Half	(1 << 4) @@ -627,12 +706,12 @@ struct ethtool_ops {  #define DUPLEX_FULL		0x01  /* Which connector port. */ -#define PORT_TP			0x00 +#define PORT_TP		0x00  #define PORT_AUI		0x01  #define PORT_MII		0x02  #define PORT_FIBRE		0x03  #define PORT_BNC		0x04 -#define PORT_DA			0x05 +#define PORT_DA		0x05  #define PORT_NONE		0xef  #define PORT_OTHER		0xff @@ -646,7 +725,7 @@ struct ethtool_ops {  /* Enable or disable autonegotiation.  If this is set to enable,   * the forced link modes above are completely ignored.   */ -#define AUTONEG_DISABLE		0x00 +#define AUTONEG_DISABLE	0x00  #define AUTONEG_ENABLE		0x01  /* Mode MDI or MDI-X */ @@ -677,8 +756,8 @@ struct ethtool_ops {  #define	AH_V6_FLOW	0x0b  #define	ESP_V6_FLOW	0x0c  #define	IP_USER_FLOW	0x0d -#define IPV4_FLOW       0x10 -#define IPV6_FLOW       0x11 +#define	IPV4_FLOW	0x10 +#define	IPV6_FLOW	0x11  /* L3-L4 network traffic flow hash options */  #define	RXH_L2DA	(1 << 1) diff --git a/include/linux/exportfs.h b/include/linux/exportfs.h index dc12f416a49..a9cd507f8cd 100644 --- a/include/linux/exportfs.h +++ b/include/linux/exportfs.h @@ -96,6 +96,7 @@ struct fid {   * @fh_to_parent:   find the implied object's parent and get a dentry for it   * @get_name:       find the name for a given inode in a given directory   * @get_parent:     find the parent of a given directory + * @commit_metadata: commit metadata changes to stable storage   *   * See Documentation/filesystems/nfs/Exporting for details on how to use   * this interface correctly. @@ -137,6 +138,9 @@ struct fid {   *    is also a directory.  In the event that it cannot be found, or storage   *    space cannot be allocated, a %ERR_PTR should be returned.   * + * commit_metadata: + *    @commit_metadata should commit metadata changes to stable storage. + *   * Locking rules:   *    get_parent is called with child->d_inode->i_mutex down   *    get_name is not (which is possibly inconsistent) @@ -152,6 +156,7 @@ struct export_operations {  	int (*get_name)(struct dentry *parent, char *name,  			struct dentry *child);  	struct dentry * (*get_parent)(struct dentry *child); +	int (*commit_metadata)(struct inode *inode);  };  extern int exportfs_encode_fh(struct dentry *dentry, struct fid *fid, diff --git a/include/linux/ext2_fs_sb.h b/include/linux/ext2_fs_sb.h index 1cdb66367c9..db4d9f586bb 100644 --- a/include/linux/ext2_fs_sb.h +++ b/include/linux/ext2_fs_sb.h @@ -106,6 +106,15 @@ struct ext2_sb_info {  	spinlock_t s_rsv_window_lock;  	struct rb_root s_rsv_window_root;  	struct ext2_reserve_window_node s_rsv_window_head; +	/* +	 * s_lock protects against concurrent modifications of s_mount_state, +	 * s_blocks_last, s_overhead_last and the content of superblock's +	 * buffer pointed to by sbi->s_es. +	 * +	 * Note: It is used in ext2_show_options() to provide a consistent view +	 * of the mount options. +	 */ +	spinlock_t s_lock;  };  static inline spinlock_t * diff --git a/include/linux/ext3_fs.h b/include/linux/ext3_fs.h index 6b049030fbe..7fc62d4550b 100644 --- a/include/linux/ext3_fs.h +++ b/include/linux/ext3_fs.h @@ -202,14 +202,6 @@ static inline __u32 ext3_mask_flags(umode_t mode, __u32 flags)  		return flags & EXT3_OTHER_FLMASK;  } -/* - * Inode dynamic state flags - */ -#define EXT3_STATE_JDATA		0x00000001 /* journaled data exists */ -#define EXT3_STATE_NEW			0x00000002 /* inode is newly created */ -#define EXT3_STATE_XATTR		0x00000004 /* has in-inode xattrs */ -#define EXT3_STATE_FLUSH_ON_CLOSE	0x00000008 -  /* Used to pass group descriptor data when online resize is done */  struct ext3_new_group_input {  	__u32 group;            /* Group number for this data */ @@ -560,6 +552,31 @@ static inline int ext3_valid_inum(struct super_block *sb, unsigned long ino)  		(ino >= EXT3_FIRST_INO(sb) &&  		 ino <= le32_to_cpu(EXT3_SB(sb)->s_es->s_inodes_count));  } + +/* + * Inode dynamic state flags + */ +enum { +	EXT3_STATE_JDATA,		/* journaled data exists */ +	EXT3_STATE_NEW,			/* inode is newly created */ +	EXT3_STATE_XATTR,		/* has in-inode xattrs */ +	EXT3_STATE_FLUSH_ON_CLOSE,	/* flush dirty pages on close */ +}; + +static inline int ext3_test_inode_state(struct inode *inode, int bit) +{ +	return test_bit(bit, &EXT3_I(inode)->i_state_flags); +} + +static inline void ext3_set_inode_state(struct inode *inode, int bit) +{ +	set_bit(bit, &EXT3_I(inode)->i_state_flags); +} + +static inline void ext3_clear_inode_state(struct inode *inode, int bit) +{ +	clear_bit(bit, &EXT3_I(inode)->i_state_flags); +}  #else  /* Assume that user mode programs are passing in an ext3fs superblock, not   * a kernel struct super_block.  This will allow us to call the feature-test @@ -851,7 +868,7 @@ extern int ext3_htree_store_dirent(struct file *dir_file, __u32 hash,  extern void ext3_htree_free_dir_info(struct dir_private_info *p);  /* fsync.c */ -extern int ext3_sync_file (struct file *, struct dentry *, int); +extern int ext3_sync_file(struct file *, int);  /* hash.c */  extern int ext3fs_dirhash(const char *name, int len, struct @@ -877,7 +894,7 @@ int ext3_get_blocks_handle(handle_t *handle, struct inode *inode,  	int create);  extern struct inode *ext3_iget(struct super_block *, unsigned long); -extern int  ext3_write_inode (struct inode *, int); +extern int  ext3_write_inode (struct inode *, struct writeback_control *);  extern int  ext3_setattr (struct dentry *, struct iattr *);  extern void ext3_delete_inode (struct inode *);  extern int  ext3_sync_inode (handle_t *, struct inode *); diff --git a/include/linux/ext3_fs_i.h b/include/linux/ext3_fs_i.h index 93e7428156b..f42c098aed8 100644 --- a/include/linux/ext3_fs_i.h +++ b/include/linux/ext3_fs_i.h @@ -87,7 +87,7 @@ struct ext3_inode_info {  	 * near to their parent directory's inode.  	 */  	__u32	i_block_group; -	__u32	i_state;		/* Dynamic state flags for ext3 */ +	unsigned long	i_state_flags;	/* Dynamic state flags for ext3 */  	/* block reservation info */  	struct ext3_block_alloc_info *i_block_alloc_info; diff --git a/include/linux/fault-inject.h b/include/linux/fault-inject.h index 06ca9b21dad..7b64ad40e4c 100644 --- a/include/linux/fault-inject.h +++ b/include/linux/fault-inject.h @@ -82,9 +82,10 @@ static inline void cleanup_fault_attr_dentries(struct fault_attr *attr)  #endif /* CONFIG_FAULT_INJECTION */  #ifdef CONFIG_FAILSLAB -extern bool should_failslab(size_t size, gfp_t gfpflags); +extern bool should_failslab(size_t size, gfp_t gfpflags, unsigned long flags);  #else -static inline bool should_failslab(size_t size, gfp_t gfpflags) +static inline bool should_failslab(size_t size, gfp_t gfpflags, +				unsigned long flags)  {  	return false;  } diff --git a/include/linux/fb.h b/include/linux/fb.h index 369767bd873..907ace3a64c 100644 --- a/include/linux/fb.h +++ b/include/linux/fb.h @@ -4,8 +4,6 @@  #include <linux/types.h>  #include <linux/i2c.h> -struct dentry; -  /* Definitions of frame buffers						*/  #define FB_MAX			32	/* sufficient for now */ @@ -37,7 +35,7 @@ struct dentry;  #define FBIOGET_HWCINFO         0x4616  #define FBIOPUT_MODEINFO        0x4617  #define FBIOGET_DISPINFO        0x4618 - +#define FBIO_WAITFORVSYNC	_IOW('F', 0x20, __u32)  #define FB_TYPE_PACKED_PIXELS		0	/* Packed Pixels	*/  #define FB_TYPE_PLANES			1	/* Non interleaved planes */ @@ -403,6 +401,7 @@ struct fb_cursor {  #include <linux/notifier.h>  #include <linux/list.h>  #include <linux/backlight.h> +#include <linux/slab.h>  #include <asm/io.h>  struct vm_area_struct; @@ -543,6 +542,8 @@ struct fb_cursor_user {  #define FB_EVENT_GET_REQ                0x0D  /*      Unbind from the console if possible */  #define FB_EVENT_FB_UNBIND              0x0E +/*      CONSOLE-SPECIFIC: remap all consoles to new fb - for vga switcheroo */ +#define FB_EVENT_REMAP_ALL_CONSOLE      0x0F  struct fb_event {  	struct fb_info *info; @@ -860,10 +861,22 @@ struct fb_info {  	/* we need the PCI or similiar aperture base/size not  	   smem_start/size as smem_start may just be an object  	   allocated inside the aperture so may not actually overlap */ -	resource_size_t aperture_base; -	resource_size_t aperture_size; +	struct apertures_struct { +		unsigned int count; +		struct aperture { +			resource_size_t base; +			resource_size_t size; +		} ranges[0]; +	} *apertures;  }; +static inline struct apertures_struct *alloc_apertures(unsigned int max_num) { +	struct apertures_struct *a = kzalloc(sizeof(struct apertures_struct) +			+ max_num * sizeof(struct aperture), GFP_KERNEL); +	a->count = max_num; +	return a; +} +  #ifdef MODULE  #define FBINFO_DEFAULT	FBINFO_MODULE  #else @@ -956,6 +969,8 @@ extern ssize_t fb_sys_write(struct fb_info *info, const char __user *buf,  /* drivers/video/fbmem.c */  extern int register_framebuffer(struct fb_info *fb_info);  extern int unregister_framebuffer(struct fb_info *fb_info); +extern void remove_conflicting_framebuffers(struct apertures_struct *a, +				const char *name, bool primary);  extern int fb_prepare_logo(struct fb_info *fb_info, int rotate);  extern int fb_show_logo(struct fb_info *fb_info, int rotate);  extern char* fb_get_buffer_offset(struct fb_info *info, struct fb_pixmap *buf, u32 size); @@ -1000,8 +1015,7 @@ extern void fb_deferred_io_open(struct fb_info *info,  				struct inode *inode,  				struct file *file);  extern void fb_deferred_io_cleanup(struct fb_info *info); -extern int fb_deferred_io_fsync(struct file *file, struct dentry *dentry, -				int datasync); +extern int fb_deferred_io_fsync(struct file *file, int datasync);  static inline bool fb_be_math(struct fb_info *info)  { diff --git a/include/linux/fcntl.h b/include/linux/fcntl.h index 86037400a6e..afc00af3229 100644 --- a/include/linux/fcntl.h +++ b/include/linux/fcntl.h @@ -22,6 +22,12 @@  #define F_NOTIFY	(F_LINUX_SPECIFIC_BASE+2)  /* + * Set and get of pipe page size array + */ +#define F_SETPIPE_SZ	(F_LINUX_SPECIFIC_BASE + 7) +#define F_GETPIPE_SZ	(F_LINUX_SPECIFIC_BASE + 8) + +/*   * Types of directory notifications that may be requested.   */  #define DN_ACCESS	0x00000001	/* File accessed */ diff --git a/include/linux/fdtable.h b/include/linux/fdtable.h index a2ec74bc481..013dc529e95 100644 --- a/include/linux/fdtable.h +++ b/include/linux/fdtable.h @@ -57,7 +57,14 @@ struct files_struct {  	struct file * fd_array[NR_OPEN_DEFAULT];  }; -#define files_fdtable(files) (rcu_dereference((files)->fdt)) +#define rcu_dereference_check_fdtable(files, fdtfd) \ +	(rcu_dereference_check((fdtfd), \ +			       rcu_read_lock_held() || \ +			       lockdep_is_held(&(files)->file_lock) || \ +			       atomic_read(&(files)->count) == 1)) + +#define files_fdtable(files) \ +		(rcu_dereference_check_fdtable((files), (files)->fdt))  struct file_operations;  struct vfsmount; @@ -78,7 +85,7 @@ static inline struct file * fcheck_files(struct files_struct *files, unsigned in  	struct fdtable *fdt = files_fdtable(files);  	if (fd < fdt->max_fds) -		file = rcu_dereference(fdt->fd[fd]); +		file = rcu_dereference_check_fdtable(files, fdt->fd[fd]);  	return file;  } diff --git a/include/linux/fec.h b/include/linux/fec.h new file mode 100644 index 00000000000..5d3523d8dd0 --- /dev/null +++ b/include/linux/fec.h @@ -0,0 +1,21 @@ +/* include/linux/fec.h + * + * Copyright (c) 2009 Orex Computed Radiography + *   Baruch Siach <baruch@tkos.co.il> + * + * Header file for the FEC platform data + * + * 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_FEC_H__ +#define __LINUX_FEC_H__ + +#include <linux/phy.h> + +struct fec_platform_data { +	phy_interface_t phy; +}; + +#endif diff --git a/include/linux/file.h b/include/linux/file.h index 5555508fd51..b1e12970f61 100644 --- a/include/linux/file.h +++ b/include/linux/file.h @@ -11,7 +11,6 @@  struct file; -extern void __fput(struct file *);  extern void fput(struct file *);  extern void drop_file_write_access(struct file *file); diff --git a/include/linux/filter.h b/include/linux/filter.h index 29a0e3db9f4..151f5d703b7 100644 --- a/include/linux/filter.h +++ b/include/linux/filter.h @@ -123,7 +123,8 @@ struct sock_fprog {	/* Required for SO_ATTACH_FILTER. */  #define SKF_AD_NLATTR_NEST	16  #define SKF_AD_MARK 	20  #define SKF_AD_QUEUE	24 -#define SKF_AD_MAX	28 +#define SKF_AD_HATYPE	28 +#define SKF_AD_MAX	32  #define SKF_NET_OFF   (-0x100000)  #define SKF_LL_OFF    (-0x200000) diff --git a/include/linux/firewire-cdev.h b/include/linux/firewire-cdev.h index 520ecf86cbb..68f883b30a5 100644 --- a/include/linux/firewire-cdev.h +++ b/include/linux/firewire-cdev.h @@ -1,21 +1,26 @@  /*   * Char device interface.   * - * Copyright (C) 2005-2006  Kristian Hoegsberg <krh@bitplanet.net> + * Copyright (C) 2005-2007  Kristian Hoegsberg <krh@bitplanet.net>   * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions:   * - * 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. + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software.   * - * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE.   */  #ifndef _LINUX_FIREWIRE_CDEV_H @@ -248,13 +253,20 @@ union fw_cdev_event {  #define FW_CDEV_IOC_SEND_BROADCAST_REQUEST       _IOW('#', 0x12, struct fw_cdev_send_request)  #define FW_CDEV_IOC_SEND_STREAM_PACKET           _IOW('#', 0x13, struct fw_cdev_send_stream_packet) +/* available since kernel version 2.6.34 */ +#define FW_CDEV_IOC_GET_CYCLE_TIMER2   _IOWR('#', 0x14, struct fw_cdev_get_cycle_timer2) +  /*   * FW_CDEV_VERSION History   *  1  (2.6.22)  - initial version   *  2  (2.6.30)  - changed &fw_cdev_event_iso_interrupt.header if   *                 &fw_cdev_create_iso_context.header_size is 8 or more + *     (2.6.32)  - added time stamp to xmit &fw_cdev_event_iso_interrupt + *     (2.6.33)  - IR has always packet-per-buffer semantics now, not one of + *                 dual-buffer or packet-per-buffer depending on hardware + *  3  (2.6.34)  - made &fw_cdev_get_cycle_timer reliable   */ -#define FW_CDEV_VERSION 2 +#define FW_CDEV_VERSION 3  /**   * struct fw_cdev_get_info - General purpose information ioctl @@ -431,7 +443,7 @@ struct fw_cdev_remove_descriptor {   * @type:	%FW_CDEV_ISO_CONTEXT_TRANSMIT or %FW_CDEV_ISO_CONTEXT_RECEIVE   * @header_size: Header size to strip for receive contexts   * @channel:	Channel to bind to - * @speed:	Speed to transmit at + * @speed:	Speed for transmit contexts   * @closure:	To be returned in &fw_cdev_event_iso_interrupt   * @handle:	Handle to context, written back by kernel   * @@ -444,6 +456,9 @@ struct fw_cdev_remove_descriptor {   * If a context was successfully created, the kernel writes back a handle to the   * context, which must be passed in for subsequent operations on that context.   * + * For receive contexts, @header_size must be at least 4 and must be a multiple + * of 4. + *   * Note that the effect of a @header_size > 4 depends on   * &fw_cdev_get_info.version, as documented at &fw_cdev_event_iso_interrupt.   */ @@ -474,10 +489,34 @@ struct fw_cdev_create_iso_context {   *   * &struct fw_cdev_iso_packet is used to describe isochronous packet queues.   * - * Use the FW_CDEV_ISO_ macros to fill in @control.  The sy and tag fields are - * specified by IEEE 1394a and IEC 61883. + * Use the FW_CDEV_ISO_ macros to fill in @control.   * - * FIXME - finish this documentation + * For transmit packets, the header length must be a multiple of 4 and specifies + * the numbers of bytes in @header that will be prepended to the packet's + * payload; these bytes are copied into the kernel and will not be accessed + * after the ioctl has returned.  The sy and tag fields are copied to the iso + * packet header (these fields are specified by IEEE 1394a and IEC 61883-1). + * The skip flag specifies that no packet is to be sent in a frame; when using + * this, all other fields except the interrupt flag must be zero. + * + * For receive packets, the header length must be a multiple of the context's + * header size; if the header length is larger than the context's header size, + * multiple packets are queued for this entry.  The sy and tag fields are + * ignored.  If the sync flag is set, the context drops all packets until + * a packet with a matching sy field is received (the sync value to wait for is + * specified in the &fw_cdev_start_iso structure).  The payload length defines + * how many payload bytes can be received for one packet (in addition to payload + * quadlets that have been defined as headers and are stripped and returned in + * the &fw_cdev_event_iso_interrupt structure).  If more bytes are received, the + * additional bytes are dropped.  If less bytes are received, the remaining + * bytes in this part of the payload buffer will not be written to, not even by + * the next packet, i.e., packets received in consecutive frames will not + * necessarily be consecutive in memory.  If an entry has queued multiple + * packets, the payload length is divided equally among them. + * + * When a packet with the interrupt flag set has been completed, the + * &fw_cdev_event_iso_interrupt event will be sent.  An entry that has queued + * multiple receive packets is completed when its last packet is completed.   */  struct fw_cdev_iso_packet {  	__u32 control; @@ -494,7 +533,7 @@ struct fw_cdev_iso_packet {   * Queue a number of isochronous packets for reception or transmission.   * This ioctl takes a pointer to an array of &fw_cdev_iso_packet structs,   * which describe how to transmit from or receive into a contiguous region - * of a mmap()'ed payload buffer.  As part of the packet descriptors, + * of a mmap()'ed payload buffer.  As part of transmit packet descriptors,   * a series of headers can be supplied, which will be prepended to the   * payload during DMA.   * @@ -544,14 +583,18 @@ struct fw_cdev_stop_iso {  /**   * struct fw_cdev_get_cycle_timer - read cycle timer register   * @local_time:   system time, in microseconds since the Epoch - * @cycle_timer:  isochronous cycle timer, as per OHCI 1.1 clause 5.13 + * @cycle_timer:  Cycle Time register contents   *   * The %FW_CDEV_IOC_GET_CYCLE_TIMER ioctl reads the isochronous cycle timer - * and also the system clock.  This allows to express the receive time of an - * isochronous packet as a system time with microsecond accuracy. + * and also the system clock (%CLOCK_REALTIME).  This allows to express the + * receive time of an isochronous packet as a system time.   *   * @cycle_timer consists of 7 bits cycleSeconds, 13 bits cycleCount, and - * 12 bits cycleOffset, in host byte order. + * 12 bits cycleOffset, in host byte order.  Cf. the Cycle Time register + * per IEEE 1394 or Isochronous Cycle Timer register per OHCI-1394. + * + * In version 1 and 2 of the ABI, this ioctl returned unreliable (non- + * monotonic) @cycle_timer values on certain controllers.   */  struct fw_cdev_get_cycle_timer {  	__u64 local_time; @@ -559,6 +602,25 @@ struct fw_cdev_get_cycle_timer {  };  /** + * struct fw_cdev_get_cycle_timer2 - read cycle timer register + * @tv_sec:       system time, seconds + * @tv_nsec:      system time, sub-seconds part in nanoseconds + * @clk_id:       input parameter, clock from which to get the system time + * @cycle_timer:  Cycle Time register contents + * + * The %FW_CDEV_IOC_GET_CYCLE_TIMER2 works like + * %FW_CDEV_IOC_GET_CYCLE_TIMER but lets you choose a clock like with POSIX' + * clock_gettime function.  Supported @clk_id values are POSIX' %CLOCK_REALTIME + * and %CLOCK_MONOTONIC and Linux' %CLOCK_MONOTONIC_RAW. + */ +struct fw_cdev_get_cycle_timer2 { +	__s64 tv_sec; +	__s32 tv_nsec; +	__s32 clk_id; +	__u32 cycle_timer; +}; + +/**   * struct fw_cdev_allocate_iso_resource - (De)allocate a channel or bandwidth   * @closure:	Passed back to userspace in correponding iso resource events   * @channels:	Isochronous channels of which one is to be (de)allocated @@ -590,8 +652,8 @@ struct fw_cdev_get_cycle_timer {   * instead of allocated.   * An %FW_CDEV_EVENT_ISO_RESOURCE_DEALLOCATED event concludes this operation.   * - * To summarize, %FW_CDEV_IOC_DEALLOCATE_ISO_RESOURCE allocates iso resources - * for the lifetime of the fd or handle. + * To summarize, %FW_CDEV_IOC_ALLOCATE_ISO_RESOURCE allocates iso resources + * for the lifetime of the fd or @handle.   * In contrast, %FW_CDEV_IOC_ALLOCATE_ISO_RESOURCE_ONCE allocates iso resources   * for the duration of a bus generation.   * diff --git a/include/linux/firewire-constants.h b/include/linux/firewire-constants.h index b316770a43f..9b4bb5fbba4 100644 --- a/include/linux/firewire-constants.h +++ b/include/linux/firewire-constants.h @@ -1,3 +1,28 @@ +/* + * IEEE 1394 constants. + * + * Copyright (C) 2005-2007  Kristian Hoegsberg <krh@bitplanet.net> + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ +  #ifndef _LINUX_FIREWIRE_CONSTANTS_H  #define _LINUX_FIREWIRE_CONSTANTS_H @@ -21,7 +46,7 @@  #define EXTCODE_WRAP_ADD		0x6  #define EXTCODE_VENDOR_DEPENDENT	0x7 -/* Juju specific tcodes */ +/* Linux firewire-core (Juju) specific tcodes */  #define TCODE_LOCK_MASK_SWAP		(0x10 | EXTCODE_MASK_SWAP)  #define TCODE_LOCK_COMPARE_SWAP		(0x10 | EXTCODE_COMPARE_SWAP)  #define TCODE_LOCK_FETCH_ADD		(0x10 | EXTCODE_FETCH_ADD) @@ -36,7 +61,7 @@  #define RCODE_TYPE_ERROR		0x6  #define RCODE_ADDRESS_ERROR		0x7 -/* Juju specific rcodes */ +/* Linux firewire-core (Juju) specific rcodes */  #define RCODE_SEND_ERROR		0x10  #define RCODE_CANCELLED			0x11  #define RCODE_BUSY			0x12 diff --git a/include/linux/firewire.h b/include/linux/firewire.h index a0e67150a72..72e2b8ac2a5 100644 --- a/include/linux/firewire.h +++ b/include/linux/firewire.h @@ -55,22 +55,21 @@  #define CSR_DESCRIPTOR		0x01  #define CSR_VENDOR		0x03  #define CSR_HARDWARE_VERSION	0x04 -#define CSR_NODE_CAPABILITIES	0x0c  #define CSR_UNIT		0x11  #define CSR_SPECIFIER_ID	0x12  #define CSR_VERSION		0x13  #define CSR_DEPENDENT_INFO	0x14  #define CSR_MODEL		0x17 -#define CSR_INSTANCE		0x18  #define CSR_DIRECTORY_ID	0x20  struct fw_csr_iterator { -	u32 *p; -	u32 *end; +	const u32 *p; +	const u32 *end;  }; -void fw_csr_iterator_init(struct fw_csr_iterator *ci, u32 *p); +void fw_csr_iterator_init(struct fw_csr_iterator *ci, const u32 *p);  int fw_csr_iterator_next(struct fw_csr_iterator *ci, int *key, int *value); +int fw_csr_string(const u32 *directory, int key, char *buf, size_t size);  extern struct bus_type fw_bus_type; @@ -88,7 +87,6 @@ struct fw_card {  	int current_tlabel;  	u64 tlabel_mask;  	struct list_head transaction_list; -	struct timer_list flush_timer;  	unsigned long reset_jiffies;  	unsigned long long guid; @@ -162,7 +160,7 @@ struct fw_device {  	struct mutex client_list_mutex;  	struct list_head client_list; -	u32 *config_rom; +	const u32 *config_rom;  	size_t config_rom_length;  	int config_rom_retries;  	unsigned is_local:1; @@ -204,7 +202,7 @@ int fw_device_enable_phys_dma(struct fw_device *device);   */  struct fw_unit {  	struct device device; -	u32 *directory; +	const u32 *directory;  	struct fw_attribute_group attribute_group;  }; @@ -289,6 +287,8 @@ struct fw_transaction {  	int tlabel;  	int timestamp;  	struct list_head link; +	struct fw_card *card; +	struct timer_list split_timeout_timer;  	struct fw_packet packet; diff --git a/include/linux/firmware-map.h b/include/linux/firmware-map.h index 875451f1373..c6dcc1dfe78 100644 --- a/include/linux/firmware-map.h +++ b/include/linux/firmware-map.h @@ -24,17 +24,17 @@   */  #ifdef CONFIG_FIRMWARE_MEMMAP -int firmware_map_add(u64 start, u64 end, const char *type);  int firmware_map_add_early(u64 start, u64 end, const char *type); +int firmware_map_add_hotplug(u64 start, u64 end, const char *type);  #else /* CONFIG_FIRMWARE_MEMMAP */ -static inline int firmware_map_add(u64 start, u64 end, const char *type) +static inline int firmware_map_add_early(u64 start, u64 end, const char *type)  {  	return 0;  } -static inline int firmware_map_add_early(u64 start, u64 end, const char *type) +static inline int firmware_map_add_hotplug(u64 start, u64 end, const char *type)  {  	return 0;  } diff --git a/include/linux/firmware.h b/include/linux/firmware.h index 043811f0d27..53d1e6c4f84 100644 --- a/include/linux/firmware.h +++ b/include/linux/firmware.h @@ -12,6 +12,7 @@  struct firmware {  	size_t size;  	const u8 *data; +	struct page **pages;  };  struct device; diff --git a/include/linux/freezer.h b/include/linux/freezer.h index 5a361f85cfe..da7e52b099f 100644 --- a/include/linux/freezer.h +++ b/include/linux/freezer.h @@ -64,9 +64,12 @@ extern bool freeze_task(struct task_struct *p, bool sig_only);  extern void cancel_freezing(struct task_struct *p);  #ifdef CONFIG_CGROUP_FREEZER -extern int cgroup_frozen(struct task_struct *task); +extern int cgroup_freezing_or_frozen(struct task_struct *task);  #else /* !CONFIG_CGROUP_FREEZER */ -static inline int cgroup_frozen(struct task_struct *task) { return 0; } +static inline int cgroup_freezing_or_frozen(struct task_struct *task) +{ +	return 0; +}  #endif /* !CONFIG_CGROUP_FREEZER */  /* diff --git a/include/linux/fs.h b/include/linux/fs.h index b1bcb275b59..3428393942a 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -60,24 +60,24 @@ struct inodes_stat_t {   */  /* file is open for reading */ -#define FMODE_READ		((__force fmode_t)1) +#define FMODE_READ		((__force fmode_t)0x1)  /* file is open for writing */ -#define FMODE_WRITE		((__force fmode_t)2) +#define FMODE_WRITE		((__force fmode_t)0x2)  /* file is seekable */ -#define FMODE_LSEEK		((__force fmode_t)4) +#define FMODE_LSEEK		((__force fmode_t)0x4)  /* file can be accessed using pread */ -#define FMODE_PREAD		((__force fmode_t)8) +#define FMODE_PREAD		((__force fmode_t)0x8)  /* file can be accessed using pwrite */ -#define FMODE_PWRITE		((__force fmode_t)16) +#define FMODE_PWRITE		((__force fmode_t)0x10)  /* File is opened for execution with sys_execve / sys_uselib */ -#define FMODE_EXEC		((__force fmode_t)32) +#define FMODE_EXEC		((__force fmode_t)0x20)  /* File is opened with O_NDELAY (only set for block devices) */ -#define FMODE_NDELAY		((__force fmode_t)64) +#define FMODE_NDELAY		((__force fmode_t)0x40)  /* File is opened with O_EXCL (only set for block devices) */ -#define FMODE_EXCL		((__force fmode_t)128) +#define FMODE_EXCL		((__force fmode_t)0x80)  /* File is opened using open(.., 3, ..) and is writeable only for ioctls     (specialy hack for floppy.c) */ -#define FMODE_WRITE_IOCTL	((__force fmode_t)256) +#define FMODE_WRITE_IOCTL	((__force fmode_t)0x100)  /*   * Don't update ctime and mtime. @@ -85,7 +85,10 @@ struct inodes_stat_t {   * Currently a special hack for the XFS open_by_handle ioctl, but we'll   * hopefully graduate it to a proper O_CMTIME flag supported by open(2) soon.   */ -#define FMODE_NOCMTIME		((__force fmode_t)2048) +#define FMODE_NOCMTIME		((__force fmode_t)0x800) + +/* Expect random access pattern */ +#define FMODE_RANDOM		((__force fmode_t)0x1000)  /*   * The below are the various read and write types that we support. Some of @@ -648,6 +651,7 @@ struct block_device {  	int			bd_openers;  	struct mutex		bd_mutex;	/* open/close mutex */  	struct list_head	bd_inodes; +	void *			bd_claiming;  	void *			bd_holder;  	int			bd_holders;  #ifdef CONFIG_SYSFS @@ -729,6 +733,7 @@ struct inode {  	uid_t			i_uid;  	gid_t			i_gid;  	dev_t			i_rdev; +	unsigned int		i_blkbits;  	u64			i_version;  	loff_t			i_size;  #ifdef __NEED_I_SIZE_ORDERED @@ -738,7 +743,6 @@ struct inode {  	struct timespec		i_mtime;  	struct timespec		i_ctime;  	blkcnt_t		i_blocks; -	unsigned int		i_blkbits;  	unsigned short          i_bytes;  	umode_t			i_mode;  	spinlock_t		i_lock;	/* i_blocks, i_bytes, maybe i_size */ @@ -950,6 +954,7 @@ extern spinlock_t files_lock;  #define file_list_unlock() spin_unlock(&files_lock);  #define get_file(x)	atomic_long_inc(&(x)->f_count) +#define fput_atomic(x)	atomic_long_add_unless(&(x)->f_count, -1, 1)  #define file_count(x)	atomic_long_read(&(x)->f_count)  #ifdef CONFIG_DEBUG_WRITECOUNT @@ -1277,10 +1282,12 @@ static inline int lock_may_write(struct inode *inode, loff_t start,  struct fasync_struct { -	int	magic; -	int	fa_fd; -	struct	fasync_struct	*fa_next; /* singly linked list */ -	struct	file 		*fa_file; +	spinlock_t		fa_lock; +	int			magic; +	int			fa_fd; +	struct fasync_struct	*fa_next; /* singly linked list */ +	struct file		*fa_file; +	struct rcu_head		fa_rcu;  };  #define FASYNC_MAGIC 0x4601 @@ -1289,8 +1296,6 @@ struct fasync_struct {  extern int fasync_helper(int, struct file *, int, struct fasync_struct **);  /* can be called from interrupts */  extern void kill_fasync(struct fasync_struct **, int, int); -/* only for net: no internal synchronization */ -extern void __kill_fasync(struct fasync_struct *, int, int);  extern int __f_setown(struct file *filp, struct pid *, enum pid_type, int force);  extern int f_setown(struct file *filp, unsigned long arg, int force); @@ -1305,18 +1310,18 @@ extern int send_sigurg(struct fown_struct *fown);  #define MNT_FORCE	0x00000001	/* Attempt to forcibily umount */  #define MNT_DETACH	0x00000002	/* Just detach from the tree */  #define MNT_EXPIRE	0x00000004	/* Mark for expiry */ +#define UMOUNT_NOFOLLOW	0x00000008	/* Don't follow symlink on umount */ +#define UMOUNT_UNUSED	0x80000000	/* Flag guaranteed to be unused */  extern struct list_head super_blocks;  extern spinlock_t sb_lock; -#define sb_entry(list)  list_entry((list), struct super_block, s_list) -#define S_BIAS (1<<30)  struct super_block {  	struct list_head	s_list;		/* Keep this first */  	dev_t			s_dev;		/* search index; _not_ kdev_t */ -	unsigned long		s_blocksize; -	unsigned char		s_blocksize_bits;  	unsigned char		s_dirt; +	unsigned char		s_blocksize_bits; +	unsigned long		s_blocksize;  	loff_t			s_maxbytes;	/* Max file size */  	struct file_system_type	*s_type;  	const struct super_operations	*s_op; @@ -1329,12 +1334,11 @@ struct super_block {  	struct rw_semaphore	s_umount;  	struct mutex		s_lock;  	int			s_count; -	int			s_need_sync;  	atomic_t		s_active;  #ifdef CONFIG_SECURITY  	void                    *s_security;  #endif -	struct xattr_handler	**s_xattr; +	const struct xattr_handler **s_xattr;  	struct list_head	s_inodes;	/* all inodes */  	struct hlist_head	s_anon;		/* anonymous dentries for (nfs) exporting */ @@ -1357,16 +1361,16 @@ struct super_block {  	void 			*s_fs_info;	/* Filesystem private info */  	fmode_t			s_mode; +	/* Granularity of c/m/atime in ns. +	   Cannot be worse than a second */ +	u32		   s_time_gran; +  	/*  	 * The next field is for VFS *only*. No filesystems have any business  	 * even looking at it. You had been warned.  	 */  	struct mutex s_vfs_rename_mutex;	/* Kludge */ -	/* Granularity of c/m/atime in ns. -	   Cannot be worse than a second */ -	u32		   s_time_gran; -  	/*  	 * Filesystem subtype.  If non-empty the filesystem type field  	 * in /proc/mounts will be "type.subtype" @@ -1426,7 +1430,8 @@ extern void dentry_unhash(struct dentry *dentry);   * VFS file helper functions.   */  extern int file_permission(struct file *, int); - +extern void inode_init_owner(struct inode *inode, const struct inode *dir, +			mode_t mode);  /*   * VFS FS_IOC_FIEMAP helper definitions.   */ @@ -1493,7 +1498,7 @@ struct file_operations {  	int (*open) (struct inode *, struct file *);  	int (*flush) (struct file *, fl_owner_t id);  	int (*release) (struct inode *, struct file *); -	int (*fsync) (struct file *, struct dentry *, int datasync); +	int (*fsync) (struct file *, int datasync);  	int (*aio_fsync) (struct kiocb *, int datasync);  	int (*fasync) (int, struct file *, int);  	int (*lock) (struct file *, int, struct file_lock *); @@ -1555,7 +1560,7 @@ struct super_operations {  	void (*destroy_inode)(struct inode *);     	void (*dirty_inode) (struct inode *); -	int (*write_inode) (struct inode *, int); +	int (*write_inode) (struct inode *, struct writeback_control *wbc);  	void (*drop_inode) (struct inode *);  	void (*delete_inode) (struct inode *);  	void (*put_super) (struct super_block *); @@ -1739,6 +1744,7 @@ struct file_system_type {  	struct lock_class_key s_lock_key;  	struct lock_class_key s_umount_key; +	struct lock_class_key s_vfs_rename_key;  	struct lock_class_key i_lock_key;  	struct lock_class_key i_mutex_key; @@ -1776,8 +1782,6 @@ extern int get_sb_pseudo(struct file_system_type *, char *,  	const struct super_operations *ops, unsigned long,  	struct vfsmount *mnt);  extern void simple_set_mnt(struct vfsmount *mnt, struct super_block *sb); -int __put_super_and_need_restart(struct super_block *sb); -void put_super(struct super_block *sb);  /* Alas, no aliases. Too much hassle with bringing module.h everywhere */  #define fops_get(fops) \ @@ -1794,8 +1798,11 @@ extern int may_umount(struct vfsmount *);  extern long do_mount(char *, char *, char *, unsigned long, void *);  extern struct vfsmount *collect_mounts(struct path *);  extern void drop_collected_mounts(struct vfsmount *); - +extern int iterate_mounts(int (*)(struct vfsmount *, void *), void *, +			  struct vfsmount *);  extern int vfs_statfs(struct dentry *, struct kstatfs *); +extern int freeze_super(struct super_block *super); +extern int thaw_super(struct super_block *super);  extern int current_umask(void); @@ -2058,12 +2065,6 @@ extern int invalidate_inodes(struct super_block *);  unsigned long invalidate_mapping_pages(struct address_space *mapping,  					pgoff_t start, pgoff_t end); -static inline unsigned long __deprecated -invalidate_inode_pages(struct address_space *mapping) -{ -	return invalidate_mapping_pages(mapping, 0, ~0UL); -} -  static inline void invalidate_remote_inode(struct inode *inode)  {  	if (S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) || @@ -2087,9 +2088,9 @@ extern int __filemap_fdatawrite_range(struct address_space *mapping,  extern int filemap_fdatawrite_range(struct address_space *mapping,  				loff_t start, loff_t end); -extern int vfs_fsync_range(struct file *file, struct dentry *dentry, -			   loff_t start, loff_t end, int datasync); -extern int vfs_fsync(struct file *file, struct dentry *dentry, int datasync); +extern int vfs_fsync_range(struct file *file, loff_t start, loff_t end, +			   int datasync); +extern int vfs_fsync(struct file *file, int datasync);  extern int generic_write_sync(struct file *file, loff_t pos, loff_t count);  extern void sync_supers(void);  extern void emergency_sync(void); @@ -2132,6 +2133,7 @@ extern struct file * open_exec(const char *);  /* fs/dcache.c -- generic fs support functions */  extern int is_subdir(struct dentry *, struct dentry *); +extern int path_is_under(struct path *, struct path *);  extern ino_t find_inode_number(struct dentry *, struct qstr *);  #include <linux/err.h> @@ -2211,6 +2213,7 @@ extern int generic_segment_checks(const struct iovec *iov,  /* fs/block_dev.c */  extern ssize_t blkdev_aio_write(struct kiocb *iocb, const struct iovec *iov,  				unsigned long nr_segs, loff_t pos); +extern int blkdev_fsync(struct file *filp, int datasync);  /* fs/splice.c */  extern ssize_t generic_file_splice_read(struct file *, loff_t *, @@ -2226,6 +2229,7 @@ extern long do_splice_direct(struct file *in, loff_t *ppos, struct file *out,  extern void  file_ra_state_init(struct file_ra_state *ra, struct address_space *mapping); +extern loff_t noop_llseek(struct file *file, loff_t offset, int origin);  extern loff_t no_llseek(struct file *file, loff_t offset, int origin);  extern loff_t generic_file_llseek(struct file *file, loff_t offset, int origin);  extern loff_t generic_file_llseek_unlocked(struct file *file, loff_t offset, @@ -2248,10 +2252,19 @@ static inline int xip_truncate_page(struct address_space *mapping, loff_t from)  #endif  #ifdef CONFIG_BLOCK +struct bio; +typedef void (dio_submit_t)(int rw, struct bio *bio, struct inode *inode, +			    loff_t file_offset); +void dio_end_io(struct bio *bio, int error); + +ssize_t __blockdev_direct_IO_newtrunc(int rw, struct kiocb *iocb, struct inode *inode, +	struct block_device *bdev, const struct iovec *iov, loff_t offset, +	unsigned long nr_segs, get_block_t get_block, dio_iodone_t end_io, +	dio_submit_t submit_io, int lock_type);  ssize_t __blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode,  	struct block_device *bdev, const struct iovec *iov, loff_t offset,  	unsigned long nr_segs, get_block_t get_block, dio_iodone_t end_io, -	int lock_type); +	dio_submit_t submit_io,	int lock_type);  enum {  	/* need locking between buffered and direct access */ @@ -2261,13 +2274,31 @@ enum {  	DIO_SKIP_HOLES	= 0x02,  }; +static inline ssize_t blockdev_direct_IO_newtrunc(int rw, struct kiocb *iocb, +	struct inode *inode, struct block_device *bdev, const struct iovec *iov, +	loff_t offset, unsigned long nr_segs, get_block_t get_block, +	dio_iodone_t end_io) +{ +	return __blockdev_direct_IO_newtrunc(rw, iocb, inode, bdev, iov, offset, +				    nr_segs, get_block, end_io, NULL, +				    DIO_LOCKING | DIO_SKIP_HOLES); +} + +static inline ssize_t blockdev_direct_IO_no_locking_newtrunc(int rw, struct kiocb *iocb, +	struct inode *inode, struct block_device *bdev, const struct iovec *iov, +	loff_t offset, unsigned long nr_segs, get_block_t get_block, +	dio_iodone_t end_io) +{ +	return __blockdev_direct_IO_newtrunc(rw, iocb, inode, bdev, iov, offset, +				nr_segs, get_block, end_io, NULL, 0); +}  static inline ssize_t blockdev_direct_IO(int rw, struct kiocb *iocb,  	struct inode *inode, struct block_device *bdev, const struct iovec *iov,  	loff_t offset, unsigned long nr_segs, get_block_t get_block,  	dio_iodone_t end_io)  {  	return __blockdev_direct_IO(rw, iocb, inode, bdev, iov, offset, -				    nr_segs, get_block, end_io, +				    nr_segs, get_block, end_io, NULL,  				    DIO_LOCKING | DIO_SKIP_HOLES);  } @@ -2277,7 +2308,7 @@ static inline ssize_t blockdev_direct_IO_no_locking(int rw, struct kiocb *iocb,  	dio_iodone_t end_io)  {  	return __blockdev_direct_IO(rw, iocb, inode, bdev, iov, offset, -				nr_segs, get_block, end_io, 0); +				    nr_segs, get_block, end_io, NULL, 0);  }  #endif @@ -2313,8 +2344,9 @@ extern int vfs_fstatat(int , char __user *, struct kstat *, int);  extern int do_vfs_ioctl(struct file *filp, unsigned int fd, unsigned int cmd,  		    unsigned long arg);  extern int __generic_block_fiemap(struct inode *inode, -				  struct fiemap_extent_info *fieinfo, u64 start, -				  u64 len, get_block_t *get_block); +				  struct fiemap_extent_info *fieinfo, +				  loff_t start, loff_t len, +				  get_block_t *get_block);  extern int generic_block_fiemap(struct inode *inode,  				struct fiemap_extent_info *fieinfo, u64 start,  				u64 len, get_block_t *get_block); @@ -2326,22 +2358,23 @@ extern struct super_block *get_super(struct block_device *);  extern struct super_block *get_active_super(struct block_device *bdev);  extern struct super_block *user_get_super(dev_t);  extern void drop_super(struct super_block *sb); +extern void iterate_supers(void (*)(struct super_block *, void *), void *);  extern int dcache_dir_open(struct inode *, struct file *);  extern int dcache_dir_close(struct inode *, struct file *);  extern loff_t dcache_dir_lseek(struct file *, loff_t, int);  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_link(struct dentry *, struct inode *, struct dentry *);  extern int simple_unlink(struct inode *, struct dentry *);  extern int simple_rmdir(struct inode *, struct dentry *);  extern int simple_rename(struct inode *, struct dentry *, struct inode *, struct dentry *); -extern int simple_sync_file(struct file *, struct dentry *, int); +extern int simple_setsize(struct inode *, loff_t); +extern int noop_fsync(struct file *, int);  extern int simple_empty(struct dentry *);  extern int simple_readpage(struct file *file, struct page *page); -extern int simple_prepare_write(struct file *file, struct page *page, -			unsigned offset, unsigned to);  extern int simple_write_begin(struct file *file, struct address_space *mapping,  			loff_t pos, unsigned len, unsigned flags,  			struct page **pagep, void **fsdata); @@ -2361,8 +2394,10 @@ extern void simple_release_fs(struct vfsmount **mount, int *count);  extern ssize_t simple_read_from_buffer(void __user *to, size_t count,  			loff_t *ppos, const void *from, size_t available); +extern ssize_t simple_write_to_buffer(void *to, size_t available, loff_t *ppos, +		const void __user *from, size_t count); -extern int simple_fsync(struct file *, struct dentry *, int); +extern int generic_file_fsync(struct file *, int);  #ifdef CONFIG_MIGRATION  extern int buffer_migrate_page(struct address_space *, @@ -2373,7 +2408,8 @@ extern int buffer_migrate_page(struct address_space *,  extern int inode_change_ok(const struct inode *, struct iattr *);  extern int inode_newsize_ok(const struct inode *, loff_t offset); -extern int __must_check inode_setattr(struct inode *, struct iattr *); +extern int __must_check inode_setattr(struct inode *, const struct iattr *); +extern void generic_setattr(struct inode *inode, const struct iattr *attr);  extern void file_update_time(struct file *file); diff --git a/include/linux/fscache-cache.h b/include/linux/fscache-cache.h index 7be0c6fbe88..c57db27ac86 100644 --- a/include/linux/fscache-cache.h +++ b/include/linux/fscache-cache.h @@ -105,7 +105,7 @@ struct fscache_operation {  	/* operation releaser */  	fscache_operation_release_t release; -#ifdef CONFIG_SLOW_WORK_PROC +#ifdef CONFIG_SLOW_WORK_DEBUG  	const char *name;		/* operation name */  	const char *state;		/* operation state */  #define fscache_set_op_name(OP, N)	do { (OP)->name  = (N); } while(0) diff --git a/include/linux/fsnotify.h b/include/linux/fsnotify.h index 936f9aa8bb9..01755909ce8 100644 --- a/include/linux/fsnotify.h +++ b/include/linux/fsnotify.h @@ -15,6 +15,7 @@  #include <linux/inotify.h>  #include <linux/fsnotify_backend.h>  #include <linux/audit.h> +#include <linux/slab.h>  /*   * fsnotify_d_instantiate - instantiate a dentry for inode @@ -65,7 +66,7 @@ static inline void fsnotify_link_count(struct inode *inode)   * fsnotify_move - file old_name at old_dir was moved to new_name at new_dir   */  static inline void fsnotify_move(struct inode *old_dir, struct inode *new_dir, -				 const char *old_name, const char *new_name, +				 const char *old_name,  				 int isdir, struct inode *target, struct dentry *moved)  {  	struct inode *source = moved->d_inode; @@ -73,6 +74,7 @@ static inline void fsnotify_move(struct inode *old_dir, struct inode *new_dir,  	u32 fs_cookie = fsnotify_get_cookie();  	__u32 old_dir_mask = (FS_EVENT_ON_CHILD | FS_MOVED_FROM);  	__u32 new_dir_mask = (FS_EVENT_ON_CHILD | FS_MOVED_TO); +	const char *new_name = moved->d_name.name;  	if (old_dir == new_dir)  		old_dir_mask |= FS_DN_RENAME; @@ -103,7 +105,7 @@ static inline void fsnotify_move(struct inode *old_dir, struct inode *new_dir,  		inotify_inode_queue_event(source, IN_MOVE_SELF, 0, NULL, NULL);  		fsnotify(source, FS_MOVE_SELF, moved->d_inode, FSNOTIFY_EVENT_INODE, NULL, 0);  	} -	audit_inode_child(new_name, moved, new_dir); +	audit_inode_child(moved, new_dir);  }  /* @@ -146,7 +148,7 @@ static inline void fsnotify_create(struct inode *inode, struct dentry *dentry)  {  	inotify_inode_queue_event(inode, IN_CREATE, 0, dentry->d_name.name,  				  dentry->d_inode); -	audit_inode_child(dentry->d_name.name, dentry, inode); +	audit_inode_child(dentry, inode);  	fsnotify(inode, FS_CREATE, dentry->d_inode, FSNOTIFY_EVENT_INODE, dentry->d_name.name, 0);  } @@ -161,7 +163,7 @@ static inline void fsnotify_link(struct inode *dir, struct inode *inode, struct  	inotify_inode_queue_event(dir, IN_CREATE, 0, new_dentry->d_name.name,  				  inode);  	fsnotify_link_count(inode); -	audit_inode_child(new_dentry->d_name.name, new_dentry, dir); +	audit_inode_child(new_dentry, dir);  	fsnotify(dir, FS_CREATE, inode, FSNOTIFY_EVENT_INODE, new_dentry->d_name.name, 0);  } @@ -175,7 +177,7 @@ static inline void fsnotify_mkdir(struct inode *inode, struct dentry *dentry)  	struct inode *d_inode = dentry->d_inode;  	inotify_inode_queue_event(inode, mask, 0, dentry->d_name.name, d_inode); -	audit_inode_child(dentry->d_name.name, dentry, inode); +	audit_inode_child(dentry, inode);  	fsnotify(inode, mask, d_inode, FSNOTIFY_EVENT_INODE, dentry->d_name.name, 0);  } diff --git a/include/linux/ftrace.h b/include/linux/ftrace.h index 0b4f97d24d7..41e46330d9b 100644 --- a/include/linux/ftrace.h +++ b/include/linux/ftrace.h @@ -82,9 +82,13 @@ void clear_ftrace_function(void);  extern void ftrace_stub(unsigned long a0, unsigned long a1);  #else /* !CONFIG_FUNCTION_TRACER */ -# define register_ftrace_function(ops) do { } while (0) -# define unregister_ftrace_function(ops) do { } while (0) -# define clear_ftrace_function(ops) do { } while (0) +/* + * (un)register_ftrace_function must be a macro since the ops parameter + * must not be evaluated. + */ +#define register_ftrace_function(ops) ({ 0; }) +#define unregister_ftrace_function(ops) ({ 0; }) +static inline void clear_ftrace_function(void) { }  static inline void ftrace_kill(void) { }  static inline void ftrace_stop(void) { }  static inline void ftrace_start(void) { } @@ -134,6 +138,8 @@ extern void  unregister_ftrace_function_probe_func(char *glob, struct ftrace_probe_ops *ops);  extern void unregister_ftrace_function_probe_all(char *glob); +extern int ftrace_text_reserved(void *start, void *end); +  enum {  	FTRACE_FL_FREE		= (1 << 0),  	FTRACE_FL_FAILED	= (1 << 1), @@ -141,7 +147,6 @@ enum {  	FTRACE_FL_ENABLED	= (1 << 3),  	FTRACE_FL_NOTRACE	= (1 << 4),  	FTRACE_FL_CONVERTED	= (1 << 5), -	FTRACE_FL_FROZEN	= (1 << 6),  };  struct dyn_ftrace { @@ -236,11 +241,13 @@ extern int skip_trace(unsigned long ip);  extern void ftrace_disable_daemon(void);  extern void ftrace_enable_daemon(void);  #else -# define skip_trace(ip)				({ 0; }) -# define ftrace_force_update()			({ 0; }) -# define ftrace_set_filter(buf, len, reset)	do { } while (0) -# define ftrace_disable_daemon()		do { } while (0) -# define ftrace_enable_daemon()			do { } while (0) +static inline int skip_trace(unsigned long ip) { return 0; } +static inline int ftrace_force_update(void) { return 0; } +static inline void ftrace_set_filter(unsigned char *buf, int len, int reset) +{ +} +static inline void ftrace_disable_daemon(void) { } +static inline void ftrace_enable_daemon(void) { }  static inline void ftrace_release_mod(struct module *mod) {}  static inline int register_ftrace_command(struct ftrace_func_command *cmd)  { @@ -250,6 +257,10 @@ static inline int unregister_ftrace_command(char *cmd_name)  {  	return -EINVAL;  } +static inline int ftrace_text_reserved(void *start, void *end) +{ +	return 0; +}  #endif /* CONFIG_DYNAMIC_FTRACE */  /* totally disable ftrace - can not re-enable after this */ @@ -309,16 +320,16 @@ static inline void __ftrace_enabled_restore(int enabled)    extern void time_hardirqs_on(unsigned long a0, unsigned long a1);    extern void time_hardirqs_off(unsigned long a0, unsigned long a1);  #else -# define time_hardirqs_on(a0, a1)		do { } while (0) -# define time_hardirqs_off(a0, a1)		do { } while (0) +  static inline void time_hardirqs_on(unsigned long a0, unsigned long a1) { } +  static inline void time_hardirqs_off(unsigned long a0, unsigned long a1) { }  #endif  #ifdef CONFIG_PREEMPT_TRACER    extern void trace_preempt_on(unsigned long a0, unsigned long a1);    extern void trace_preempt_off(unsigned long a0, unsigned long a1);  #else -# define trace_preempt_on(a0, a1)		do { } while (0) -# define trace_preempt_off(a0, a1)		do { } while (0) +  static inline void trace_preempt_on(unsigned long a0, unsigned long a1) { } +  static inline void trace_preempt_off(unsigned long a0, unsigned long a1) { }  #endif  #ifdef CONFIG_FTRACE_MCOUNT_RECORD @@ -347,6 +358,10 @@ struct ftrace_graph_ret {  	int depth;  }; +/* Type of the callback handlers for tracing function graph*/ +typedef void (*trace_func_graph_ret_t)(struct ftrace_graph_ret *); /* return */ +typedef int (*trace_func_graph_ent_t)(struct ftrace_graph_ent *); /* entry */ +  #ifdef CONFIG_FUNCTION_GRAPH_TRACER  /* for init task */ @@ -395,10 +410,6 @@ extern char __irqentry_text_end[];  #define FTRACE_RETFUNC_DEPTH 50  #define FTRACE_RETSTACK_ALLOC_SIZE 32 -/* Type of the callback handlers for tracing function graph*/ -typedef void (*trace_func_graph_ret_t)(struct ftrace_graph_ret *); /* return */ -typedef int (*trace_func_graph_ent_t)(struct ftrace_graph_ent *); /* entry */ -  extern int register_ftrace_graph(trace_func_graph_ret_t retfunc,  				trace_func_graph_ent_t entryfunc); @@ -436,6 +447,13 @@ static inline void unpause_graph_tracing(void)  static inline void ftrace_graph_init_task(struct task_struct *t) { }  static inline void ftrace_graph_exit_task(struct task_struct *t) { } +static inline int register_ftrace_graph(trace_func_graph_ret_t retfunc, +			  trace_func_graph_ent_t entryfunc) +{ +	return -1; +} +static inline void unregister_ftrace_graph(void) { } +  static inline int task_curr_ret_stack(struct task_struct *tsk)  {  	return -1; @@ -487,7 +505,9 @@ static inline int test_tsk_trace_graph(struct task_struct *tsk)  	return tsk->trace & TSK_TRACE_FL_GRAPH;  } -extern int ftrace_dump_on_oops; +enum ftrace_dump_mode; + +extern enum ftrace_dump_mode ftrace_dump_on_oops;  #ifdef CONFIG_PREEMPT  #define INIT_TRACE_RECURSION		.trace_recursion = 0, @@ -499,16 +519,10 @@ extern int ftrace_dump_on_oops;  #define INIT_TRACE_RECURSION  #endif -#ifdef CONFIG_HW_BRANCH_TRACER - -void trace_hw_branch(u64 from, u64 to); -void trace_hw_branch_oops(void); - -#else /* CONFIG_HW_BRANCH_TRACER */ +#ifdef CONFIG_FTRACE_SYSCALLS -static inline void trace_hw_branch(u64 from, u64 to) {} -static inline void trace_hw_branch_oops(void) {} +unsigned long arch_syscall_addr(int nr); -#endif /* CONFIG_HW_BRANCH_TRACER */ +#endif /* CONFIG_FTRACE_SYSCALLS */  #endif /* _LINUX_FTRACE_H */ diff --git a/include/linux/ftrace_event.h b/include/linux/ftrace_event.h index 2233c98d80d..3167f2df412 100644 --- a/include/linux/ftrace_event.h +++ b/include/linux/ftrace_event.h @@ -5,6 +5,7 @@  #include <linux/trace_seq.h>  #include <linux/percpu.h>  #include <linux/hardirq.h> +#include <linux/perf_event.h>  struct trace_array;  struct tracer; @@ -24,6 +25,9 @@ const char *ftrace_print_flags_seq(struct trace_seq *p, const char *delim,  const char *ftrace_print_symbols_seq(struct trace_seq *p, unsigned long val,  				     const struct trace_print_flags *symbol_array); +const char *ftrace_print_hex_seq(struct trace_seq *p, +				 const unsigned char *buf, int len); +  /*   * The trace entry - the most basic unit of tracing. This is what   * is printed in the end as a single line in the trace output, such as: @@ -57,6 +61,7 @@ struct trace_iterator {  	/* The below is zeroed out in pipe_read */  	struct trace_seq	seq;  	struct trace_entry	*ent; +	unsigned long		lost_events;  	int			leftover;  	int			cpu;  	u64			ts; @@ -68,18 +73,25 @@ struct trace_iterator {  }; +struct trace_event; +  typedef enum print_line_t (*trace_print_func)(struct trace_iterator *iter, -					      int flags); -struct trace_event { -	struct hlist_node	node; -	struct list_head	list; -	int			type; +				      int flags, struct trace_event *event); + +struct trace_event_functions {  	trace_print_func	trace;  	trace_print_func	raw;  	trace_print_func	hex;  	trace_print_func	binary;  }; +struct trace_event { +	struct hlist_node		node; +	struct list_head		list; +	int				type; +	struct trace_event_functions	*funcs; +}; +  extern int register_ftrace_event(struct trace_event *event);  extern int unregister_ftrace_event(struct trace_event *event); @@ -111,35 +123,73 @@ void tracing_record_cmdline(struct task_struct *tsk);  struct event_filter; +enum trace_reg { +	TRACE_REG_REGISTER, +	TRACE_REG_UNREGISTER, +	TRACE_REG_PERF_REGISTER, +	TRACE_REG_PERF_UNREGISTER, +}; + +struct ftrace_event_call; + +struct ftrace_event_class { +	char			*system; +	void			*probe; +#ifdef CONFIG_PERF_EVENTS +	void			*perf_probe; +#endif +	int			(*reg)(struct ftrace_event_call *event, +				       enum trace_reg type); +	int			(*define_fields)(struct ftrace_event_call *); +	struct list_head	*(*get_fields)(struct ftrace_event_call *); +	struct list_head	fields; +	int			(*raw_init)(struct ftrace_event_call *); +}; + +enum { +	TRACE_EVENT_FL_ENABLED_BIT, +	TRACE_EVENT_FL_FILTERED_BIT, +}; + +enum { +	TRACE_EVENT_FL_ENABLED	= (1 << TRACE_EVENT_FL_ENABLED_BIT), +	TRACE_EVENT_FL_FILTERED	= (1 << TRACE_EVENT_FL_FILTERED_BIT), +}; +  struct ftrace_event_call {  	struct list_head	list; +	struct ftrace_event_class *class;  	char			*name; -	char			*system;  	struct dentry		*dir; -	struct trace_event	*event; -	int			enabled; -	int			(*regfunc)(struct ftrace_event_call *); -	void			(*unregfunc)(struct ftrace_event_call *); -	int			id; -	int			(*raw_init)(struct ftrace_event_call *); -	int			(*show_format)(struct ftrace_event_call *, -					       struct trace_seq *); -	int			(*define_fields)(struct ftrace_event_call *); -	struct list_head	fields; -	int			filter_active; +	struct trace_event	event; +	const char		*print_fmt;  	struct event_filter	*filter;  	void			*mod;  	void			*data; -	int			profile_count; -	int			(*profile_enable)(struct ftrace_event_call *); -	void			(*profile_disable)(struct ftrace_event_call *); -}; +	/* +	 * 32 bit flags: +	 *   bit 1:		enabled +	 *   bit 2:		filter_active +	 * +	 * Changes to flags must hold the event_mutex. +	 * +	 * Note: Reads of flags do not hold the event_mutex since +	 * they occur in critical sections. But the way flags +	 * is currently used, these changes do no affect the code +	 * except that when a change is made, it may have a slight +	 * delay in propagating the changes to other CPUs due to +	 * caching and such. +	 */ +	unsigned int		flags; -#define FTRACE_MAX_PROFILE_SIZE	2048 +#ifdef CONFIG_PERF_EVENTS +	int			perf_refcount; +	struct hlist_head	*perf_events; +#endif +}; -extern char *perf_trace_buf; -extern char *perf_trace_buf_nmi; +#define PERF_MAX_TRACE_SIZE	2048  #define MAX_FILTER_PRED		32  #define MAX_FILTER_STR_VAL	256	/* Should handle KSYM_SYMBOL_LEN */ @@ -188,13 +238,28 @@ do {									\  		__trace_printk(ip, fmt, ##args);			\  } while (0) -#ifdef CONFIG_EVENT_PROFILE +#ifdef CONFIG_PERF_EVENTS  struct perf_event; -extern int ftrace_profile_enable(int event_id); -extern void ftrace_profile_disable(int event_id); -extern int ftrace_profile_set_filter(struct perf_event *event, int event_id, + +DECLARE_PER_CPU(struct pt_regs, perf_trace_regs); + +extern int  perf_trace_init(struct perf_event *event); +extern void perf_trace_destroy(struct perf_event *event); +extern int  perf_trace_enable(struct perf_event *event); +extern void perf_trace_disable(struct perf_event *event); +extern int  ftrace_profile_set_filter(struct perf_event *event, int event_id,  				     char *filter_str);  extern void ftrace_profile_free_filter(struct perf_event *event); +extern void *perf_trace_buf_prepare(int size, unsigned short type, +				    struct pt_regs *regs, int *rctxp); + +static inline void +perf_trace_buf_submit(void *raw_data, int size, int rctx, u64 addr, +		       u64 count, struct pt_regs *regs, void *head) +{ +	perf_tp_event(addr, count, raw_data, size, regs, head); +	perf_swevent_put_recursion_context(rctx); +}  #endif  #endif /* _LINUX_FTRACE_EVENT_H */ diff --git a/include/linux/fuse.h b/include/linux/fuse.h index 3e2925a34bf..88e0eb59691 100644 --- a/include/linux/fuse.h +++ b/include/linux/fuse.h @@ -34,6 +34,9 @@   * 7.13   *  - make max number of background requests and congestion threshold   *    tunables + * + * 7.14 + *  - add splice support to fuse device   */  #ifndef _LINUX_FUSE_H @@ -65,7 +68,7 @@  #define FUSE_KERNEL_VERSION 7  /** Minor version number of this interface */ -#define FUSE_KERNEL_MINOR_VERSION 13 +#define FUSE_KERNEL_MINOR_VERSION 14  /** The node ID of the root inode */  #define FUSE_ROOT_ID 1 diff --git a/include/linux/gameport.h b/include/linux/gameport.h index 1bc08541c2b..361d1cc288d 100644 --- a/include/linux/gameport.h +++ b/include/linux/gameport.h @@ -16,6 +16,7 @@  #include <linux/mutex.h>  #include <linux/device.h>  #include <linux/timer.h> +#include <linux/slab.h>  struct gameport { @@ -46,7 +47,6 @@ struct gameport {  	struct mutex drv_mutex;		/* protects serio->drv so attributes can pin driver */  	struct device dev; -	unsigned int registered;	/* port has been fully registered with driver core */  	struct list_head node;  }; diff --git a/include/linux/generic_acl.h b/include/linux/generic_acl.h index ca666d18ed6..574bea4013b 100644 --- a/include/linux/generic_acl.h +++ b/include/linux/generic_acl.h @@ -5,8 +5,8 @@  struct inode; -extern struct xattr_handler generic_acl_access_handler; -extern struct xattr_handler generic_acl_default_handler; +extern const struct xattr_handler generic_acl_access_handler; +extern const struct xattr_handler generic_acl_default_handler;  int generic_acl_init(struct inode *, struct inode *);  int generic_acl_chmod(struct inode *); diff --git a/include/linux/genetlink.h b/include/linux/genetlink.h index b834ef6d59f..61549b26ad6 100644 --- a/include/linux/genetlink.h +++ b/include/linux/genetlink.h @@ -80,4 +80,12 @@ enum {  #define CTRL_ATTR_MCAST_GRP_MAX (__CTRL_ATTR_MCAST_GRP_MAX - 1) +#ifdef __KERNEL__ + +/* All generic netlink requests are serialized by a global lock.  */ +extern void genl_lock(void); +extern void genl_unlock(void); + +#endif /* __KERNEL__ */ +  #endif	/* __LINUX_GENERIC_NETLINK_H */ diff --git a/include/linux/genhd.h b/include/linux/genhd.h index 9717081c75a..5f2f4c4d8fb 100644 --- a/include/linux/genhd.h +++ b/include/linux/genhd.h @@ -101,7 +101,7 @@ struct hd_struct {  	unsigned long stamp;  	int in_flight[2];  #ifdef	CONFIG_SMP -	struct disk_stats *dkstats; +	struct disk_stats __percpu *dkstats;  #else  	struct disk_stats dkstats;  #endif @@ -109,7 +109,7 @@ struct hd_struct {  };  #define GENHD_FL_REMOVABLE			1 -#define GENHD_FL_DRIVERFS			2 +/* 2 is unused */  #define GENHD_FL_MEDIA_CHANGE_NOTIFY		4  #define GENHD_FL_CD				8  #define GENHD_FL_UP				16 diff --git a/include/linux/gfp.h b/include/linux/gfp.h index 557bdad320b..975609cb854 100644 --- a/include/linux/gfp.h +++ b/include/linux/gfp.h @@ -15,7 +15,7 @@ struct vm_area_struct;   * Zone modifiers (see linux/mmzone.h - low three bits)   *   * Do not put any conditional on these. If necessary modify the definitions - * without the underscores and use the consistently. The definitions here may + * without the underscores and use them consistently. The definitions here may   * be used in bit comparisons.   */  #define __GFP_DMA	((__force gfp_t)0x01u) @@ -30,7 +30,8 @@ struct vm_area_struct;   * _might_ fail.  This depends upon the particular VM implementation.   *   * __GFP_NOFAIL: The VM implementation _must_ retry infinitely: the caller - * cannot handle allocation failures. + * cannot handle allocation failures.  This modifier is deprecated and no new + * users should be added.   *   * __GFP_NORETRY: The VM implementation must not retry indefinitely.   * @@ -83,6 +84,7 @@ struct vm_area_struct;  #define GFP_HIGHUSER_MOVABLE	(__GFP_WAIT | __GFP_IO | __GFP_FS | \  				 __GFP_HARDWALL | __GFP_HIGHMEM | \  				 __GFP_MOVABLE) +#define GFP_IOFS	(__GFP_IO | __GFP_FS)  #ifdef CONFIG_NUMA  #define GFP_THISNODE	(__GFP_THISNODE | __GFP_NOWARN | __GFP_NORETRY) @@ -99,7 +101,7 @@ struct vm_area_struct;  			__GFP_NORETRY|__GFP_NOMEMALLOC)  /* Control slab gfp mask during early boot */ -#define GFP_BOOT_MASK __GFP_BITS_MASK & ~(__GFP_WAIT|__GFP_IO|__GFP_FS) +#define GFP_BOOT_MASK (__GFP_BITS_MASK & ~(__GFP_WAIT|__GFP_IO|__GFP_FS))  /* Control allocation constraints */  #define GFP_CONSTRAINT_MASK (__GFP_HARDWALL|__GFP_THISNODE) @@ -150,12 +152,12 @@ static inline int allocflags_to_migratetype(gfp_t gfp_flags)   * GFP_ZONE_TABLE is a word size bitstring that is used for looking up the   * zone to use given the lowest 4 bits of gfp_t. Entries are ZONE_SHIFT long   * and there are 16 of them to cover all possible combinations of - * __GFP_DMA, __GFP_DMA32, __GFP_MOVABLE and __GFP_HIGHMEM + * __GFP_DMA, __GFP_DMA32, __GFP_MOVABLE and __GFP_HIGHMEM.   *   * The zone fallback order is MOVABLE=>HIGHMEM=>NORMAL=>DMA32=>DMA.   * But GFP_MOVABLE is not only a zone specifier but also an allocation   * policy. Therefore __GFP_MOVABLE plus another zone selector is valid. - * Only 1bit of the lowest 3 bit (DMA,DMA32,HIGHMEM) can be set to "1". + * Only 1 bit of the lowest 3 bits (DMA,DMA32,HIGHMEM) can be set to "1".   *   *       bit       result   *       ================= @@ -185,7 +187,7 @@ static inline int allocflags_to_migratetype(gfp_t gfp_flags)  #define GFP_ZONE_TABLE ( \  	(ZONE_NORMAL << 0 * ZONES_SHIFT)				\ -	| (OPT_ZONE_DMA << __GFP_DMA * ZONES_SHIFT) 			\ +	| (OPT_ZONE_DMA << __GFP_DMA * ZONES_SHIFT)			\  	| (OPT_ZONE_HIGHMEM << __GFP_HIGHMEM * ZONES_SHIFT)		\  	| (OPT_ZONE_DMA32 << __GFP_DMA32 * ZONES_SHIFT)			\  	| (ZONE_NORMAL << __GFP_MOVABLE * ZONES_SHIFT)			\ @@ -195,7 +197,7 @@ static inline int allocflags_to_migratetype(gfp_t gfp_flags)  )  /* - * GFP_ZONE_BAD is a bitmap for all combination of __GFP_DMA, __GFP_DMA32 + * GFP_ZONE_BAD is a bitmap for all combinations of __GFP_DMA, __GFP_DMA32   * __GFP_HIGHMEM and __GFP_MOVABLE that are not permitted. One flag per   * entry starting with bit 0. Bit is set if the combination is not   * allowed. @@ -318,17 +320,17 @@ void *alloc_pages_exact(size_t size, gfp_t gfp_mask);  void free_pages_exact(void *virt, size_t size);  #define __get_free_page(gfp_mask) \ -		__get_free_pages((gfp_mask),0) +		__get_free_pages((gfp_mask), 0)  #define __get_dma_pages(gfp_mask, order) \ -		__get_free_pages((gfp_mask) | GFP_DMA,(order)) +		__get_free_pages((gfp_mask) | GFP_DMA, (order))  extern void __free_pages(struct page *page, unsigned int order);  extern void free_pages(unsigned long addr, unsigned int order); -extern void free_hot_page(struct page *page); +extern void free_hot_cold_page(struct page *page, int cold);  #define __free_page(page) __free_pages((page), 0) -#define free_page(addr) free_pages((addr),0) +#define free_page(addr) free_pages((addr), 0)  void page_alloc_init(void);  void drain_zone_pages(struct zone *zone, struct per_cpu_pages *pcp); @@ -337,9 +339,7 @@ void drain_local_pages(void *dummy);  extern gfp_t gfp_allowed_mask; -static inline void set_gfp_allowed_mask(gfp_t mask) -{ -	gfp_allowed_mask = mask; -} +extern void set_gfp_allowed_mask(gfp_t mask); +extern gfp_t clear_gfp_allowed_mask(gfp_t mask);  #endif /* __LINUX_GFP_H */ diff --git a/include/linux/gfs2_ondisk.h b/include/linux/gfs2_ondisk.h index 81f90a59cda..4f4462974c1 100644 --- a/include/linux/gfs2_ondisk.h +++ b/include/linux/gfs2_ondisk.h @@ -180,33 +180,6 @@ struct gfs2_rgrp {  };  /* - * quota linked list: user quotas and group quotas form two separate  - * singly linked lists. ll_next stores uids or gids of next quotas in the  - * linked list. - -Given the uid/gid, how to calculate the quota file offsets for the corresponding -gfs2_quota structures on disk: - -for user quotas, given uid, -offset = uid * sizeof(struct gfs2_quota); - -for group quotas, given gid, -offset = (gid * sizeof(struct gfs2_quota)) + sizeof(struct gfs2_quota); - - -  uid:0   gid:0       uid:12   gid:12      uid:17   gid:17     uid:5142 gid:5142 -+-------+-------+    +-------+-------+    +-------+- - - -+    +- - - -+-------+ -| valid | valid | :: | valid | valid | :: | valid | inval | :: | inval | valid | -+-------+-------+    +-------+-------+    +-------+- - - -+    +- - - -+-------+ -next:12   next:12    next:17 next:5142    next:NULL                    next:NULL -    |       |            |       |            |<-- user quota list         | -     \______|___________/ \______|___________/         group quota list -->| -            |                    |                                         | -             \__________________/ \_______________________________________/ - -*/ - -/*   * quota structure   */ @@ -214,8 +187,7 @@ struct gfs2_quota {  	__be64 qu_limit;  	__be64 qu_warn;  	__be64 qu_value; -	__be32 qu_ll_next; /* location of next quota in list */ -	__u8 qu_reserved[60]; +	__u8 qu_reserved[64];  };  /* diff --git a/include/linux/gpio.h b/include/linux/gpio.h index 4e949a5b5b8..03f616b78cf 100644 --- a/include/linux/gpio.h +++ b/include/linux/gpio.h @@ -51,6 +51,11 @@ static inline int gpio_direction_output(unsigned gpio, int value)  	return -ENOSYS;  } +static inline int gpio_set_debounce(unsigned gpio, unsigned debounce) +{ +	return -ENOSYS; +} +  static inline int gpio_get_value(unsigned gpio)  {  	/* GPIO can never have been requested or set as {in,out}put */ diff --git a/include/linux/gpio_keys.h b/include/linux/gpio_keys.h index 1289fa7623c..cd0b3f30f48 100644 --- a/include/linux/gpio_keys.h +++ b/include/linux/gpio_keys.h @@ -10,6 +10,7 @@ struct gpio_keys_button {  	int type;		/* input event type (EV_KEY, EV_SW) */  	int wakeup;		/* configure the button as a wake-up source */  	int debounce_interval;	/* debounce ticks interval in msecs */ +	bool can_disable;  };  struct gpio_keys_platform_data { diff --git a/include/linux/gsmmux.h b/include/linux/gsmmux.h new file mode 100644 index 00000000000..378de4195ca --- /dev/null +++ b/include/linux/gsmmux.h @@ -0,0 +1,25 @@ +#ifndef _LINUX_GSMMUX_H +#define _LINUX_GSMMUX_H + +struct gsm_config +{ +	unsigned int adaption; +	unsigned int encapsulation; +	unsigned int initiator; +	unsigned int t1; +	unsigned int t2; +	unsigned int t3; +	unsigned int n2; +	unsigned int mru; +	unsigned int mtu; +	unsigned int k; +	unsigned int i; +	unsigned int unused[8];		/* Padding for expansion without +					   breaking stuff */ +}; + +#define GSMIOC_GETCONF		_IOR('G', 0, struct gsm_config) +#define GSMIOC_SETCONF		_IOW('G', 1, struct gsm_config) + + +#endif diff --git a/include/linux/hdpu_features.h b/include/linux/hdpu_features.h deleted file mode 100644 index 6a8715431ae..00000000000 --- a/include/linux/hdpu_features.h +++ /dev/null @@ -1,26 +0,0 @@ -#include <linux/spinlock.h> - -struct cpustate_t { -	spinlock_t lock; -	int excl; -        int open_count; -	unsigned char cached_val; -	int inited; -	unsigned long *set_addr; -	unsigned long *clr_addr; -}; - - -#define HDPU_CPUSTATE_NAME "hdpu cpustate" -#define HDPU_NEXUS_NAME "hdpu nexus" - -#define CPUSTATE_KERNEL_MAJOR  0x10 - -#define CPUSTATE_KERNEL_INIT_DRV   0 /* CPU State Driver Initialized */ -#define CPUSTATE_KERNEL_INIT_PCI   1 /* 64360 PCI Busses Init */ -#define CPUSTATE_KERNEL_INIT_REG   2 /* 64360 Bridge Init */ -#define CPUSTATE_KERNEL_CPU1_KICK  3 /* Boot cpu 1 */ -#define CPUSTATE_KERNEL_CPU1_OK    4  /* Cpu 1 has checked in */ -#define CPUSTATE_KERNEL_OK         5 /* Terminal state */ -#define CPUSTATE_KERNEL_RESET   14 /* Board reset via SW*/ -#define CPUSTATE_KERNEL_HALT   15 /* Board halted via SW*/ diff --git a/include/linux/hid.h b/include/linux/hid.h index 87093652dda..895001f7f4b 100644 --- a/include/linux/hid.h +++ b/include/linux/hid.h @@ -308,11 +308,13 @@ struct hid_item {  #define HID_QUIRK_NOTOUCH			0x00000002  #define HID_QUIRK_IGNORE			0x00000004  #define HID_QUIRK_NOGET				0x00000008 +#define HID_QUIRK_HIDDEV_FORCE			0x00000010  #define HID_QUIRK_BADPAD			0x00000020  #define HID_QUIRK_MULTI_INPUT			0x00000040  #define HID_QUIRK_SKIP_OUTPUT_REPORTS		0x00010000  #define HID_QUIRK_FULLSPEED_INTERVAL		0x10000000  #define HID_QUIRK_NO_INIT_REPORTS		0x20000000 +#define HID_QUIRK_NO_IGNORE			0x40000000  /*   * This is the global environment of the parser. This information is @@ -501,7 +503,7 @@ struct hid_device {							/* device report descriptor */  	void (*hiddev_report_event) (struct hid_device *, struct hid_report *);  	/* handler for raw output data, used by hidraw */ -	int (*hid_output_raw_report) (struct hid_device *, __u8 *, size_t); +	int (*hid_output_raw_report) (struct hid_device *, __u8 *, size_t, unsigned char);  	/* debugging support via debugfs */  	unsigned short debug; @@ -589,6 +591,9 @@ struct hid_usage_id {   * @report_fixup: called before report descriptor parsing (NULL means nop)   * @input_mapping: invoked on input registering before mapping an usage   * @input_mapped: invoked on input registering after mapping an usage + * @suspend: invoked on suspend (NULL means nop) + * @resume: invoked on resume if device was not reset (NULL means nop) + * @reset_resume: invoked on resume if device was reset (NULL means nop)   *   * raw_event and event should return 0 on no action performed, 1 when no   * further processing should be done and negative on error @@ -629,6 +634,11 @@ struct hid_driver {  	int (*input_mapped)(struct hid_device *hdev,  			struct hid_input *hidinput, struct hid_field *field,  			struct hid_usage *usage, unsigned long **bit, int *max); +#ifdef CONFIG_PM +	int (*suspend)(struct hid_device *hdev, pm_message_t message); +	int (*resume)(struct hid_device *hdev); +	int (*reset_resume)(struct hid_device *hdev); +#endif  /* private: */  	struct device_driver driver;  }; @@ -663,7 +673,7 @@ struct hid_ll_driver {  /* Applications from HID Usage Tables 4/8/99 Version 1.1 */  /* We ignore a few input applications that are not widely used */ -#define IS_INPUT_APPLICATION(a) (((a >= 0x00010000) && (a <= 0x00010008)) || (a == 0x00010080) || (a == 0x000c0001) || (a == 0x000d0002)) +#define IS_INPUT_APPLICATION(a) (((a >= 0x00010000) && (a <= 0x00010008)) || (a == 0x00010080) || (a == 0x000c0001) || ((a >= 0x000d0002) && (a <= 0x000d0006)))  /* HID core API */ @@ -690,6 +700,7 @@ int hid_input_report(struct hid_device *, int type, u8 *, int, int);  int hidinput_find_field(struct hid_device *hid, unsigned int type, unsigned int code, struct hid_field **field);  void hid_output_report(struct hid_report *report, __u8 *data);  struct hid_device *hid_allocate_device(void); +struct hid_report *hid_register_report(struct hid_device *device, unsigned type, unsigned id);  int hid_parse_report(struct hid_device *hid, __u8 *start, unsigned size);  int hid_check_keys_pressed(struct hid_device *hid);  int hid_connect(struct hid_device *hid, unsigned int connect_mask); diff --git a/include/linux/highmem.h b/include/linux/highmem.h index ab2cc20e21a..caafd0561aa 100644 --- a/include/linux/highmem.h +++ b/include/linux/highmem.h @@ -17,11 +17,17 @@ static inline void flush_anon_page(struct vm_area_struct *vma, struct page *page  static inline void flush_kernel_dcache_page(struct page *page)  {  } +static inline void flush_kernel_vmap_range(void *vaddr, int size) +{ +} +static inline void invalidate_kernel_vmap_range(void *vaddr, int size) +{ +}  #endif  #include <asm/kmap_types.h> -#if defined(CONFIG_DEBUG_HIGHMEM) && defined(CONFIG_TRACE_IRQFLAGS_SUPPORT) +#ifdef CONFIG_DEBUG_HIGHMEM  void debug_kmap_atomic(enum km_type type); diff --git a/include/linux/hil.h b/include/linux/hil.h index 13352d7d0ca..523785a9de7 100644 --- a/include/linux/hil.h +++ b/include/linux/hil.h @@ -168,14 +168,14 @@ enum hil_command {  	HIL_CMD_PR6	= 0x45,	/* Prompt6 */  	HIL_CMD_PR7	= 0x46,	/* Prompt7 */  	HIL_CMD_PRM	= 0x47,	/* Prompt (General Purpose) */ -	HIL_CMD_AK1	= 0x48,	/* Acknowlege1 */   -	HIL_CMD_AK2	= 0x49,	/* Acknowlege2 */ -	HIL_CMD_AK3	= 0x4a,	/* Acknowlege3 */ -	HIL_CMD_AK4	= 0x4b,	/* Acknowlege4 */ -	HIL_CMD_AK5	= 0x4c,	/* Acknowlege5 */ -	HIL_CMD_AK6	= 0x4d,	/* Acknowlege6 */ -	HIL_CMD_AK7	= 0x4e,	/* Acknowlege7 */ -	HIL_CMD_ACK	= 0x4f,	/* Acknowlege (General Purpose) */ +	HIL_CMD_AK1	= 0x48,	/* Acknowledge1 */   +	HIL_CMD_AK2	= 0x49,	/* Acknowledge2 */ +	HIL_CMD_AK3	= 0x4a,	/* Acknowledge3 */ +	HIL_CMD_AK4	= 0x4b,	/* Acknowledge4 */ +	HIL_CMD_AK5	= 0x4c,	/* Acknowledge5 */ +	HIL_CMD_AK6	= 0x4d,	/* Acknowledge6 */ +	HIL_CMD_AK7	= 0x4e,	/* Acknowledge7 */ +	HIL_CMD_ACK	= 0x4f,	/* Acknowledge (General Purpose) */  	/* 0x50 to 0x78 reserved for future use  */  	/* 0x80 to 0xEF device-specific commands */ diff --git a/include/linux/hrtimer.h b/include/linux/hrtimer.h index 5d86fb2309d..fd0c1b857d3 100644 --- a/include/linux/hrtimer.h +++ b/include/linux/hrtimer.h @@ -422,6 +422,8 @@ extern void hrtimer_init_sleeper(struct hrtimer_sleeper *sl,  extern int schedule_hrtimeout_range(ktime_t *expires, unsigned long delta,  						const enum hrtimer_mode mode); +extern int schedule_hrtimeout_range_clock(ktime_t *expires, +		unsigned long delta, const enum hrtimer_mode mode, int clock);  extern int schedule_hrtimeout(ktime_t *expires, const enum hrtimer_mode mode);  /* Soft interrupt function to run the hrtimer queues: */ diff --git a/include/linux/htcpld.h b/include/linux/htcpld.h new file mode 100644 index 00000000000..ab3f6cb4ddd --- /dev/null +++ b/include/linux/htcpld.h @@ -0,0 +1,24 @@ +#ifndef __LINUX_HTCPLD_H +#define __LINUX_HTCPLD_H + +struct htcpld_chip_platform_data { +	unsigned int addr; +	unsigned int reset; +	unsigned int num_gpios; +	unsigned int gpio_out_base; +	unsigned int gpio_in_base; +	unsigned int irq_base; +	unsigned int num_irqs; +}; + +struct htcpld_core_platform_data { +	unsigned int                      int_reset_gpio_hi; +	unsigned int                      int_reset_gpio_lo; +	unsigned int                      i2c_adapter_id; + +	struct htcpld_chip_platform_data  *chip; +	unsigned int                      num_chip; +}; + +#endif /* __LINUX_HTCPLD_H */ + diff --git a/include/linux/hw_breakpoint.h b/include/linux/hw_breakpoint.h index 41235c93e4e..a2d6ea49ec5 100644 --- a/include/linux/hw_breakpoint.h +++ b/include/linux/hw_breakpoint.h @@ -9,9 +9,22 @@ enum {  };  enum { -	HW_BREAKPOINT_R = 1, -	HW_BREAKPOINT_W = 2, -	HW_BREAKPOINT_X = 4, +	HW_BREAKPOINT_EMPTY	= 0, +	HW_BREAKPOINT_R		= 1, +	HW_BREAKPOINT_W		= 2, +	HW_BREAKPOINT_RW	= HW_BREAKPOINT_R | HW_BREAKPOINT_W, +	HW_BREAKPOINT_X		= 4, +	HW_BREAKPOINT_INVALID   = HW_BREAKPOINT_RW | HW_BREAKPOINT_X, +}; + +enum bp_type_idx { +	TYPE_INST 	= 0, +#ifdef CONFIG_HAVE_MIXED_BREAKPOINTS_REGS +	TYPE_DATA	= 0, +#else +	TYPE_DATA	= 1, +#endif +	TYPE_MAX  };  #ifdef __KERNEL__ @@ -34,6 +47,12 @@ static inline void hw_breakpoint_init(struct perf_event_attr *attr)  	attr->sample_period = 1;  } +static inline void ptrace_breakpoint_init(struct perf_event_attr *attr) +{ +	hw_breakpoint_init(attr); +	attr->exclude_kernel = 1; +} +  static inline unsigned long hw_breakpoint_addr(struct perf_event *bp)  {  	return bp->attr.bp_addr; @@ -44,7 +63,7 @@ static inline int hw_breakpoint_type(struct perf_event *bp)  	return bp->attr.bp_type;  } -static inline int hw_breakpoint_len(struct perf_event *bp) +static inline unsigned long hw_breakpoint_len(struct perf_event *bp)  {  	return bp->attr.bp_len;  } @@ -66,15 +85,17 @@ register_wide_hw_breakpoint_cpu(struct perf_event_attr *attr,  				perf_overflow_handler_t	triggered,  				int cpu); -extern struct perf_event ** +extern struct perf_event * __percpu *  register_wide_hw_breakpoint(struct perf_event_attr *attr,  			    perf_overflow_handler_t triggered);  extern int register_perf_hw_breakpoint(struct perf_event *bp);  extern int __register_perf_hw_breakpoint(struct perf_event *bp);  extern void unregister_hw_breakpoint(struct perf_event *bp); -extern void unregister_wide_hw_breakpoint(struct perf_event **cpu_events); +extern void unregister_wide_hw_breakpoint(struct perf_event * __percpu *cpu_events); +extern int dbg_reserve_bp_slot(struct perf_event *bp); +extern int dbg_release_bp_slot(struct perf_event *bp);  extern int reserve_bp_slot(struct perf_event *bp);  extern void release_bp_slot(struct perf_event *bp); @@ -98,7 +119,7 @@ static inline struct perf_event *  register_wide_hw_breakpoint_cpu(struct perf_event_attr *attr,  				perf_overflow_handler_t	 triggered,  				int cpu)		{ return NULL; } -static inline struct perf_event ** +static inline struct perf_event * __percpu *  register_wide_hw_breakpoint(struct perf_event_attr *attr,  			    perf_overflow_handler_t triggered)	{ return NULL; }  static inline int @@ -107,7 +128,7 @@ static inline int  __register_perf_hw_breakpoint(struct perf_event *bp) 	{ return -ENOSYS; }  static inline void unregister_hw_breakpoint(struct perf_event *bp)	{ }  static inline void -unregister_wide_hw_breakpoint(struct perf_event **cpu_events)		{ } +unregister_wide_hw_breakpoint(struct perf_event * __percpu *cpu_events)	{ }  static inline int  reserve_bp_slot(struct perf_event *bp)			{return -ENOSYS; }  static inline void release_bp_slot(struct perf_event *bp) 		{ } diff --git a/include/linux/i2c-algo-bit.h b/include/linux/i2c-algo-bit.h index 111334f5b92..4f98148c11c 100644 --- a/include/linux/i2c-algo-bit.h +++ b/include/linux/i2c-algo-bit.h @@ -36,6 +36,8 @@ struct i2c_algo_bit_data {  	void (*setscl) (void *data, int state);  	int  (*getsda) (void *data);  	int  (*getscl) (void *data); +	int  (*pre_xfer)  (struct i2c_adapter *); +	void (*post_xfer) (struct i2c_adapter *);  	/* local settings */  	int udelay;		/* half clock cycle time in us, diff --git a/include/linux/i2c-omap.h b/include/linux/i2c-omap.h new file mode 100644 index 00000000000..78ebf507ce5 --- /dev/null +++ b/include/linux/i2c-omap.h @@ -0,0 +1,9 @@ +#ifndef __I2C_OMAP_H__ +#define __I2C_OMAP_H__ + +struct omap_i2c_bus_platform_data { +	u32		clkrate; +	void		(*set_mpu_wkup_lat)(struct device *dev, long set); +}; + +#endif diff --git a/include/linux/i2c-pnx.h b/include/linux/i2c-pnx.h index 9eb07bbc652..a87124d4d53 100644 --- a/include/linux/i2c-pnx.h +++ b/include/linux/i2c-pnx.h @@ -12,9 +12,8 @@  #ifndef __I2C_PNX_H__  #define __I2C_PNX_H__ -#include <linux/pm.h> -  struct platform_device; +struct clk;  struct i2c_pnx_mif {  	int			ret;		/* Return value */ @@ -26,20 +25,18 @@ struct i2c_pnx_mif {  };  struct i2c_pnx_algo_data { -	u32			base; -	u32			ioaddr; -	int			irq; +	void __iomem		*ioaddr;  	struct i2c_pnx_mif	mif;  	int			last; +	struct clk		*clk; +	struct i2c_pnx_data	*i2c_pnx; +	struct i2c_adapter	adapter;  };  struct i2c_pnx_data { -	int (*suspend) (struct platform_device *pdev, pm_message_t state); -	int (*resume) (struct platform_device *pdev); -	u32 (*calculate_input_freq) (struct platform_device *pdev); -	int (*set_clock_run) (struct platform_device *pdev); -	int (*set_clock_stop) (struct platform_device *pdev); -	struct i2c_adapter *adapter; +	const char *name; +	u32 base; +	int irq;  };  #endif /* __I2C_PNX_H__ */ diff --git a/include/linux/i2c-smbus.h b/include/linux/i2c-smbus.h new file mode 100644 index 00000000000..63f57a8c8b3 --- /dev/null +++ b/include/linux/i2c-smbus.h @@ -0,0 +1,50 @@ +/* + * i2c-smbus.h - SMBus extensions to the I2C protocol + * + * Copyright (C) 2010 Jean Delvare <khali@linux-fr.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#ifndef _LINUX_I2C_SMBUS_H +#define _LINUX_I2C_SMBUS_H + +#include <linux/i2c.h> + + +/** + * i2c_smbus_alert_setup - platform data for the smbus_alert i2c client + * @alert_edge_triggered: whether the alert interrupt is edge (1) or level (0) + *		triggered + * @irq: IRQ number, if the smbus_alert driver should take care of interrupt + *		handling + * + * If irq is not specified, the smbus_alert driver doesn't take care of + * interrupt handling. In that case it is up to the I2C bus driver to either + * handle the interrupts or to poll for alerts. + * + * If irq is specified then it it crucial that alert_edge_triggered is + * properly set. + */ +struct i2c_smbus_alert_setup { +	unsigned int		alert_edge_triggered:1; +	int			irq; +}; + +struct i2c_client *i2c_setup_smbus_alert(struct i2c_adapter *adapter, +					 struct i2c_smbus_alert_setup *setup); +int i2c_handle_smbus_alert(struct i2c_client *ara); + +#endif /* _LINUX_I2C_SMBUS_H */ diff --git a/include/linux/i2c-xiic.h b/include/linux/i2c-xiic.h new file mode 100644 index 00000000000..4f9f2256a97 --- /dev/null +++ b/include/linux/i2c-xiic.h @@ -0,0 +1,43 @@ +/* + * i2c-xiic.h + * Copyright (c) 2009 Intel Corporation + * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +/* Supports: + * Xilinx IIC + */ + +#ifndef _LINUX_I2C_XIIC_H +#define _LINUX_I2C_XIIC_H + +/** + * struct xiic_i2c_platform_data - Platform data of the Xilinx I2C driver + * @num_devices:	Number of devices that shall be added when the driver + *			is probed. + * @devices:		The actuall devices to add. + * + * This purpose of this platform data struct is to be able to provide a number + * of devices that should be added to the I2C bus. The reason is that sometimes + * the I2C board info is not enough, a new PCI board can for instance be + * plugged into a standard PC, and the bus number might be unknown at + * early init time. + */ +struct xiic_i2c_platform_data { +	u8				num_devices; +	struct i2c_board_info const	*devices; +}; + +#endif /* _LINUX_I2C_XIIC_H */ diff --git a/include/linux/i2c.h b/include/linux/i2c.h index 02fc617782e..21067b41853 100644 --- a/include/linux/i2c.h +++ b/include/linux/i2c.h @@ -34,6 +34,7 @@  #include <linux/device.h>	/* for struct device */  #include <linux/sched.h>	/* for completion */  #include <linux/mutex.h> +#include <linux/of.h>		/* for struct device_node */  extern struct bus_type i2c_bus_type; @@ -53,6 +54,7 @@ struct i2c_board_info;   * on a bus (or read from them). Apart from two basic transfer functions to   * transmit one message at a time, a more complex version can be used to   * transmit an arbitrary number of messages without interruption. + * @count must be be less than 64k since msg.len is u16.   */  extern int i2c_master_send(struct i2c_client *client, const char *buf,  			   int count); @@ -152,6 +154,13 @@ struct i2c_driver {  	int (*suspend)(struct i2c_client *, pm_message_t mesg);  	int (*resume)(struct i2c_client *); +	/* Alert callback, for example for the SMBus alert protocol. +	 * The format and meaning of the data value depends on the protocol. +	 * For the SMBus alert protocol, there is a single bit of data passed +	 * as the alert response's low bit ("event flag"). +	 */ +	void (*alert)(struct i2c_client *, unsigned int data); +  	/* a ioctl like command that can be used to perform specific functions  	 * with the device.  	 */ @@ -243,6 +252,9 @@ struct i2c_board_info {  	unsigned short	addr;  	void		*platform_data;  	struct dev_archdata	*archdata; +#ifdef CONFIG_OF +	struct device_node *of_node; +#endif  	int		irq;  }; @@ -347,6 +359,8 @@ struct i2c_adapter {  	int nr;  	char name[48];  	struct completion dev_released; + +	struct list_head userspace_clients;  };  #define to_i2c_adapter(d) container_of(d, struct i2c_adapter, dev) diff --git a/include/linux/i2c/adp8860.h b/include/linux/i2c/adp8860.h new file mode 100644 index 00000000000..0b4d39855c9 --- /dev/null +++ b/include/linux/i2c/adp8860.h @@ -0,0 +1,154 @@ +/* + * Definitions and platform data for Analog Devices + * Backlight drivers ADP8860 + * + * Copyright 2009-2010 Analog Devices Inc. + * + * Licensed under the GPL-2 or later. + */ + +#ifndef __LINUX_I2C_ADP8860_H +#define __LINUX_I2C_ADP8860_H + +#include <linux/leds.h> +#include <linux/types.h> + +#define ID_ADP8860		8860 + +#define ADP8860_MAX_BRIGHTNESS	0x7F +#define FLAG_OFFT_SHIFT 8 + +/* + * LEDs subdevice platform data + */ + +#define ADP8860_LED_DIS_BLINK	(0 << FLAG_OFFT_SHIFT) +#define ADP8860_LED_OFFT_600ms	(1 << FLAG_OFFT_SHIFT) +#define ADP8860_LED_OFFT_1200ms	(2 << FLAG_OFFT_SHIFT) +#define ADP8860_LED_OFFT_1800ms	(3 << FLAG_OFFT_SHIFT) + +#define ADP8860_LED_ONT_200ms	0 +#define ADP8860_LED_ONT_600ms	1 +#define ADP8860_LED_ONT_800ms	2 +#define ADP8860_LED_ONT_1200ms	3 + +#define ADP8860_LED_D7		(7) +#define ADP8860_LED_D6		(6) +#define ADP8860_LED_D5		(5) +#define ADP8860_LED_D4		(4) +#define ADP8860_LED_D3		(3) +#define ADP8860_LED_D2		(2) +#define ADP8860_LED_D1		(1) + +/* + * Backlight subdevice platform data + */ + +#define ADP8860_BL_D7		(1 << 6) +#define ADP8860_BL_D6		(1 << 5) +#define ADP8860_BL_D5		(1 << 4) +#define ADP8860_BL_D4		(1 << 3) +#define ADP8860_BL_D3		(1 << 2) +#define ADP8860_BL_D2		(1 << 1) +#define ADP8860_BL_D1		(1 << 0) + +#define ADP8860_FADE_T_DIS	0	/* Fade Timer Disabled */ +#define ADP8860_FADE_T_300ms	1	/* 0.3 Sec */ +#define ADP8860_FADE_T_600ms	2 +#define ADP8860_FADE_T_900ms	3 +#define ADP8860_FADE_T_1200ms	4 +#define ADP8860_FADE_T_1500ms	5 +#define ADP8860_FADE_T_1800ms	6 +#define ADP8860_FADE_T_2100ms	7 +#define ADP8860_FADE_T_2400ms	8 +#define ADP8860_FADE_T_2700ms	9 +#define ADP8860_FADE_T_3000ms	10 +#define ADP8860_FADE_T_3500ms	11 +#define ADP8860_FADE_T_4000ms	12 +#define ADP8860_FADE_T_4500ms	13 +#define ADP8860_FADE_T_5000ms	14 +#define ADP8860_FADE_T_5500ms	15	/* 5.5 Sec */ + +#define ADP8860_FADE_LAW_LINEAR	0 +#define ADP8860_FADE_LAW_SQUARE	1 +#define ADP8860_FADE_LAW_CUBIC1	2 +#define ADP8860_FADE_LAW_CUBIC2	3 + +#define ADP8860_BL_AMBL_FILT_80ms	0	/* Light sensor filter time */ +#define ADP8860_BL_AMBL_FILT_160ms	1 +#define ADP8860_BL_AMBL_FILT_320ms	2 +#define ADP8860_BL_AMBL_FILT_640ms	3 +#define ADP8860_BL_AMBL_FILT_1280ms	4 +#define ADP8860_BL_AMBL_FILT_2560ms	5 +#define ADP8860_BL_AMBL_FILT_5120ms	6 +#define ADP8860_BL_AMBL_FILT_10240ms	7	/* 10.24 sec */ + +/* + * Blacklight current 0..30mA + */ +#define ADP8860_BL_CUR_mA(I)		((I * 127) / 30) + +/* + * L2 comparator current 0..1106uA + */ +#define ADP8860_L2_COMP_CURR_uA(I)	((I * 255) / 1106) + +/* + * L3 comparator current 0..138uA + */ +#define ADP8860_L3_COMP_CURR_uA(I)	((I * 255) / 138) + +struct adp8860_backlight_platform_data { +	u8 bl_led_assign;	/* 1 = Backlight 0 = Individual LED */ + +	u8 bl_fade_in;		/* Backlight Fade-In Timer */ +	u8 bl_fade_out;		/* Backlight Fade-Out Timer */ +	u8 bl_fade_law;		/* fade-on/fade-off transfer characteristic */ + +	u8 en_ambl_sens;	/* 1 = enable ambient light sensor */ +	u8 abml_filt;		/* Light sensor filter time */ + +	u8 l1_daylight_max;	/* use BL_CUR_mA(I) 0 <= I <= 30 mA */ +	u8 l1_daylight_dim;	/* typ = 0, use BL_CUR_mA(I) 0 <= I <= 30 mA */ +	u8 l2_office_max;	/* use BL_CUR_mA(I) 0 <= I <= 30 mA */ +	u8 l2_office_dim;	/* typ = 0, use BL_CUR_mA(I) 0 <= I <= 30 mA */ +	u8 l3_dark_max;		/* use BL_CUR_mA(I) 0 <= I <= 30 mA */ +	u8 l3_dark_dim;		/* typ = 0, use BL_CUR_mA(I) 0 <= I <= 30 mA */ + +	u8 l2_trip;		/* use L2_COMP_CURR_uA(I) 0 <= I <= 1106 uA */ +	u8 l2_hyst;		/* use L2_COMP_CURR_uA(I) 0 <= I <= 1106 uA */ +	u8 l3_trip;		/* use L3_COMP_CURR_uA(I) 0 <= I <= 551 uA */ +	u8 l3_hyst;		/* use L3_COMP_CURR_uA(I) 0 <= I <= 551 uA */ + +	/** +	 * Independent Current Sinks / LEDS +	 * Sinks not assigned to the Backlight can be exposed to +	 * user space using the LEDS CLASS interface +	 */ + +	int num_leds; +	struct led_info	*leds; +	u8 led_fade_in;		/* LED Fade-In Timer */ +	u8 led_fade_out;	/* LED Fade-Out Timer */ +	u8 led_fade_law;	/* fade-on/fade-off transfer characteristic */ +	u8 led_on_time; + +	/** +	 * Gain down disable. Setting this option does not allow the +	 * charge pump to switch to lower gains. NOT AVAILABLE on ADP8860 +	 * 1 = the charge pump doesn't switch down in gain until all LEDs are 0. +	 *  The charge pump switches up in gain as needed. This feature is +	 *  useful if the ADP8863 charge pump is used to drive an external load. +	 *  This feature must be used when utilizing small fly capacitors +	 *  (0402 or smaller). +	 * 0 = the charge pump automatically switches up and down in gain. +	 *  This provides optimal efficiency, but is not suitable for driving +	 *  loads that are not connected through the ADP8863 diode drivers. +	 *  Additionally, the charge pump fly capacitors should be low ESR +	 * and sized 0603 or greater. +	 */ + +	u8 gdwn_dis; +}; + +#endif /* __LINUX_I2C_ADP8860_H */ diff --git a/include/linux/i2c/max732x.h b/include/linux/i2c/max732x.h index e10336631c6..c04bac8bf2f 100644 --- a/include/linux/i2c/max732x.h +++ b/include/linux/i2c/max732x.h @@ -7,6 +7,9 @@ struct max732x_platform_data {  	/* number of the first GPIO */  	unsigned	gpio_base; +	/* interrupt base */ +	int		irq_base; +  	void		*context;	/* param to setup/teardown */  	int		(*setup)(struct i2c_client *client, diff --git a/include/linux/i2c/pca953x.h b/include/linux/i2c/pca953x.h index 81736d6a8db..139ba52667c 100644 --- a/include/linux/i2c/pca953x.h +++ b/include/linux/i2c/pca953x.h @@ -1,3 +1,9 @@ +#ifndef _LINUX_PCA953X_H +#define _LINUX_PCA953X_H + +#include <linux/types.h> +#include <linux/i2c.h> +  /* platform data for the PCA9539 16-bit I/O expander driver */  struct pca953x_platform_data { @@ -7,6 +13,9 @@ struct pca953x_platform_data {  	/* initial polarity inversion setting */  	uint16_t	invert; +	/* interrupt base */ +	int		irq_base; +  	void		*context;	/* param to setup/teardown */  	int		(*setup)(struct i2c_client *client, @@ -15,5 +24,7 @@ struct pca953x_platform_data {  	int		(*teardown)(struct i2c_client *client,  				unsigned gpio, unsigned ngpio,  				void *context); -	char		**names; +	const char	*const *names;  }; + +#endif /* _LINUX_PCA953X_H */ diff --git a/include/linux/i2c/twl.h b/include/linux/i2c/twl.h index bf1c5be1f5b..6de90bfc6ac 100644 --- a/include/linux/i2c/twl.h +++ b/include/linux/i2c/twl.h @@ -80,6 +80,11 @@  #define TWL_MODULE_PM_MASTER	TWL4030_MODULE_PM_MASTER  #define TWL_MODULE_PM_RECEIVER	TWL4030_MODULE_PM_RECEIVER  #define TWL_MODULE_RTC		TWL4030_MODULE_RTC +#define TWL_MODULE_PWM		TWL4030_MODULE_PWM0 + +#define TWL6030_MODULE_ID0	0x0D +#define TWL6030_MODULE_ID1	0x0E +#define TWL6030_MODULE_ID2	0x0F  #define GPIO_INTR_OFFSET	0  #define KEYPAD_INTR_OFFSET	1 @@ -239,6 +244,21 @@ int twl6030_interrupt_mask(u8 bit_mask, u8 offset);  /*----------------------------------------------------------------------*/ +/*Interface Bit Register (INTBR) offsets + *(Use TWL_4030_MODULE_INTBR) + */ + +#define REG_GPPUPDCTR1			0x0F + +/*I2C1 and I2C4(SR) SDA/SCL pull-up control bits */ + +#define I2C_SCL_CTRL_PU			BIT(0) +#define I2C_SDA_CTRL_PU			BIT(2) +#define SR_I2C_SCL_CTRL_PU		BIT(4) +#define SR_I2C_SDA_CTRL_PU		BIT(6) + +/*----------------------------------------------------------------------*/ +  /*   * Keypad register offsets (use TWL4030_MODULE_KEYPAD)   * ... SIH/interrupt only @@ -476,7 +496,7 @@ struct twl4030_madc_platform_data {  	int		irq_line;  }; -/* Boards have uniqe mappings of {row, col} --> keycode. +/* Boards have unique mappings of {row, col} --> keycode.   * Column and row are 8 bits each, but range only from 0..7.   * a PERSISTENT_KEY is "always on" and never reported.   */ @@ -530,6 +550,7 @@ struct twl4030_power_data {  };  extern void twl4030_power_init(struct twl4030_power_data *triton2_scripts); +extern int twl4030_remove_script(u8 flags);  struct twl4030_codec_audio_data {  	unsigned int	audio_mclk; @@ -547,6 +568,10 @@ struct twl4030_codec_data {  	unsigned int	audio_mclk;  	struct twl4030_codec_audio_data		*audio;  	struct twl4030_codec_vibra_data		*vibra; + +	/* twl6040 */ +	int audpwron_gpio;	/* audio power-on gpio */ +	int naudint_irq;	/* audio interrupt */  };  struct twl4030_platform_data { @@ -601,12 +626,7 @@ int twl4030_sih_setup(int module);  #define TWL4030_VAUX3_DEV_GRP		0x1F  #define TWL4030_VAUX3_DEDICATED		0x22 -#if defined(CONFIG_TWL4030_BCI_BATTERY) || \ -	defined(CONFIG_TWL4030_BCI_BATTERY_MODULE) -	extern int twl4030charger_usb_en(int enable); -#else -	static inline int twl4030charger_usb_en(int enable) { return 0; } -#endif +static inline int twl4030charger_usb_en(int enable) { return 0; }  /*----------------------------------------------------------------------*/ @@ -644,15 +664,15 @@ int twl4030_sih_setup(int module);  #define TWL4030_REG_VUSB3V1	19  /* TWL6030 SMPS/LDO's */ -/* EXTERNAL dc-to-dc buck convertor contollable via SR */ +/* EXTERNAL dc-to-dc buck convertor controllable via SR */  #define TWL6030_REG_VDD1	30  #define TWL6030_REG_VDD2	31  #define TWL6030_REG_VDD3	32  /* Non SR compliant dc-to-dc buck convertors */ -#define	TWL6030_REG_VMEM	33 +#define TWL6030_REG_VMEM	33  #define TWL6030_REG_V2V1	34 -#define	TWL6030_REG_V1V29	35 +#define TWL6030_REG_V1V29	35  #define TWL6030_REG_V1V8	36  /* EXTERNAL LDOs */ diff --git a/include/linux/i2o.h b/include/linux/i2o.h index 4c4e57d1f19..9e7a12d6385 100644 --- a/include/linux/i2o.h +++ b/include/linux/i2o.h @@ -385,7 +385,7 @@  /* defines for max_sectors and max_phys_segments */  #define I2O_MAX_SECTORS			1024  #define I2O_MAX_SECTORS_LIMITED		128 -#define I2O_MAX_PHYS_SEGMENTS		MAX_PHYS_SEGMENTS +#define I2O_MAX_PHYS_SEGMENTS		BLK_MAX_SEGMENTS  /*   *	Message structures @@ -782,7 +782,6 @@ extern int i2o_exec_lct_get(struct i2o_controller *);  #define to_i2o_driver(drv) container_of(drv,struct i2o_driver, driver)  #define to_i2o_device(dev) container_of(dev, struct i2o_device, device)  #define to_i2o_controller(dev) container_of(dev, struct i2o_controller, device) -#define kobj_to_i2o_device(kobj) to_i2o_device(container_of(kobj, struct device, kobj))  /**   *	i2o_out_to_virt - Turn an I2O message to a virtual address diff --git a/include/linux/icmpv6.h b/include/linux/icmpv6.h index c0d8357917e..4c4c74ec598 100644 --- a/include/linux/icmpv6.h +++ b/include/linux/icmpv6.h @@ -174,8 +174,7 @@ struct icmp6_filter {  extern void				icmpv6_send(struct sk_buff *skb,  						    u8 type, u8 code, -						    __u32 info,  -						    struct net_device *dev); +						    __u32 info);  extern int				icmpv6_init(void);  extern int				icmpv6_err_convert(u8 type, u8 code, diff --git a/include/linux/ide.h b/include/linux/ide.h index 0ec61295904..7b02aa5ce9b 100644 --- a/include/linux/ide.h +++ b/include/linux/ide.h @@ -362,7 +362,7 @@ struct ide_drive_s;  struct ide_disk_ops {  	int		(*check)(struct ide_drive_s *, const char *);  	int		(*get_capacity)(struct ide_drive_s *); -	u64		(*set_capacity)(struct ide_drive_s *, u64); +	void		(*unlock_native_capacity)(struct ide_drive_s *);  	void		(*setup)(struct ide_drive_s *);  	void		(*flush)(struct ide_drive_s *);  	int		(*init_media)(struct ide_drive_s *, struct gendisk *); @@ -515,7 +515,9 @@ struct ide_drive_s {          u8	init_speed;	/* transfer rate set at boot */          u8	current_speed;	/* current transfer rate set */  	u8	desired_speed;	/* desired transfer rate set */ -        u8	dn;		/* now wide spread use */ +	u8	pio_mode;	/* for ->set_pio_mode _only_ */ +	u8	dma_mode;	/* for ->set_dma_mode _only_ */ +	u8	dn;		/* now wide spread use */  	u8	acoustic;	/* acoustic management */  	u8	media;		/* disk, cdrom, tape, floppy, ... */  	u8	ready_stat;	/* min status value for drive ready */ @@ -622,8 +624,8 @@ extern const struct ide_tp_ops default_tp_ops;   */  struct ide_port_ops {  	void	(*init_dev)(ide_drive_t *); -	void	(*set_pio_mode)(ide_drive_t *, const u8); -	void	(*set_dma_mode)(ide_drive_t *, const u8); +	void	(*set_pio_mode)(struct hwif_s *, ide_drive_t *); +	void	(*set_dma_mode)(struct hwif_s *, ide_drive_t *);  	int	(*reset_poll)(ide_drive_t *);  	void	(*pre_reset)(ide_drive_t *);  	void	(*resetproc)(ide_drive_t *); @@ -1167,6 +1169,7 @@ extern void ide_stall_queue(ide_drive_t *drive, unsigned long timeout);  extern void ide_timer_expiry(unsigned long);  extern irqreturn_t ide_intr(int irq, void *dev_id);  extern void do_ide_request(struct request_queue *); +extern void ide_requeue_and_plug(ide_drive_t *drive, struct request *rq);  void ide_init_disk(struct gendisk *, ide_drive_t *); @@ -1494,7 +1497,6 @@ int ide_timing_compute(ide_drive_t *, u8, struct ide_timing *, int, int);  #ifdef CONFIG_IDE_XFER_MODE  int ide_scan_pio_blacklist(char *);  const char *ide_xfer_verbose(u8); -u8 ide_get_best_pio_mode(ide_drive_t *, u8, u8);  int ide_pio_need_iordy(ide_drive_t *, const u8);  int ide_set_pio_mode(ide_drive_t *, u8);  int ide_set_dma_mode(ide_drive_t *, u8); diff --git a/include/linux/ieee80211.h b/include/linux/ieee80211.h index 163c840437d..97b2eae6a22 100644 --- a/include/linux/ieee80211.h +++ b/include/linux/ieee80211.h @@ -120,6 +120,26 @@  #define IEEE80211_QOS_CTL_TID_MASK	0x000F  #define IEEE80211_QOS_CTL_TAG1D_MASK	0x0007 +/* U-APSD queue for WMM IEs sent by AP */ +#define IEEE80211_WMM_IE_AP_QOSINFO_UAPSD	(1<<7) + +/* U-APSD queues for WMM IEs sent by STA */ +#define IEEE80211_WMM_IE_STA_QOSINFO_AC_VO	(1<<0) +#define IEEE80211_WMM_IE_STA_QOSINFO_AC_VI	(1<<1) +#define IEEE80211_WMM_IE_STA_QOSINFO_AC_BK	(1<<2) +#define IEEE80211_WMM_IE_STA_QOSINFO_AC_BE	(1<<3) +#define IEEE80211_WMM_IE_STA_QOSINFO_AC_MASK	0x0f + +/* U-APSD max SP length for WMM IEs sent by STA */ +#define IEEE80211_WMM_IE_STA_QOSINFO_SP_ALL	0x00 +#define IEEE80211_WMM_IE_STA_QOSINFO_SP_2	0x01 +#define IEEE80211_WMM_IE_STA_QOSINFO_SP_4	0x02 +#define IEEE80211_WMM_IE_STA_QOSINFO_SP_6	0x03 +#define IEEE80211_WMM_IE_STA_QOSINFO_SP_MASK	0x03 +#define IEEE80211_WMM_IE_STA_QOSINFO_SP_SHIFT	5 + +#define IEEE80211_HT_CTL_LEN		4 +  struct ieee80211_hdr {  	__le16 frame_control;  	__le16 duration_id; @@ -130,6 +150,25 @@ struct ieee80211_hdr {  	u8 addr4[6];  } __attribute__ ((packed)); +struct ieee80211_hdr_3addr { +	__le16 frame_control; +	__le16 duration_id; +	u8 addr1[6]; +	u8 addr2[6]; +	u8 addr3[6]; +	__le16 seq_ctrl; +} __attribute__ ((packed)); + +struct ieee80211_qos_hdr { +	__le16 frame_control; +	__le16 duration_id; +	u8 addr1[6]; +	u8 addr2[6]; +	u8 addr3[6]; +	__le16 seq_ctrl; +	__le16 qos_ctrl; +} __attribute__ ((packed)); +  /**   * ieee80211_has_tods - check if IEEE80211_FCTL_TODS is set   * @fc: frame control bytes in little-endian byteorder @@ -707,6 +746,10 @@ struct ieee80211_mgmt {  					u8 action;  					u8 trans_id[WLAN_SA_QUERY_TR_ID_LEN];  				} __attribute__ ((packed)) sa_query; +				struct { +					u8 action; +					u8 smps_control; +				} __attribute__ ((packed)) ht_smps;  			} u;  		} __attribute__ ((packed)) action;  	} u; @@ -771,7 +814,10 @@ struct ieee80211_bar {  /**   * struct ieee80211_mcs_info - MCS information   * @rx_mask: RX mask - * @rx_highest: highest supported RX rate + * @rx_highest: highest supported RX rate. If set represents + *	the highest supported RX data rate in units of 1 Mbps. + *	If this field is 0 this value should not be used to + *	consider the highest RX data rate supported.   * @tx_params: TX parameters   */  struct ieee80211_mcs_info { @@ -824,11 +870,13 @@ struct ieee80211_ht_cap {  #define IEEE80211_HT_CAP_LDPC_CODING		0x0001  #define IEEE80211_HT_CAP_SUP_WIDTH_20_40	0x0002  #define IEEE80211_HT_CAP_SM_PS			0x000C +#define		IEEE80211_HT_CAP_SM_PS_SHIFT	2  #define IEEE80211_HT_CAP_GRN_FLD		0x0010  #define IEEE80211_HT_CAP_SGI_20			0x0020  #define IEEE80211_HT_CAP_SGI_40			0x0040  #define IEEE80211_HT_CAP_TX_STBC		0x0080  #define IEEE80211_HT_CAP_RX_STBC		0x0300 +#define		IEEE80211_HT_CAP_RX_STBC_SHIFT	8  #define IEEE80211_HT_CAP_DELAY_BA		0x0400  #define IEEE80211_HT_CAP_MAX_AMSDU		0x0800  #define IEEE80211_HT_CAP_DSSSCCK40		0x1000 @@ -839,6 +887,7 @@ struct ieee80211_ht_cap {  /* 802.11n HT capability AMPDU settings (for ampdu_params_info) */  #define IEEE80211_HT_AMPDU_PARM_FACTOR		0x03  #define IEEE80211_HT_AMPDU_PARM_DENSITY		0x1C +#define		IEEE80211_HT_AMPDU_PARM_DENSITY_SHIFT	2  /*   * Maximum length of AMPDU that the STA can receive. @@ -922,12 +971,17 @@ struct ieee80211_ht_info {  #define IEEE80211_MAX_AMPDU_BUF 0x40 -/* Spatial Multiplexing Power Save Modes */ +/* Spatial Multiplexing Power Save Modes (for capability) */  #define WLAN_HT_CAP_SM_PS_STATIC	0  #define WLAN_HT_CAP_SM_PS_DYNAMIC	1  #define WLAN_HT_CAP_SM_PS_INVALID	2  #define WLAN_HT_CAP_SM_PS_DISABLED	3 +/* for SM power control field lower two bits */ +#define WLAN_HT_SMPS_CONTROL_DISABLED	0 +#define WLAN_HT_SMPS_CONTROL_STATIC	1 +#define WLAN_HT_SMPS_CONTROL_DYNAMIC	3 +  /* Authentication algorithms */  #define WLAN_AUTH_OPEN 0  #define WLAN_AUTH_SHARED_KEY 1 @@ -1071,12 +1125,12 @@ enum ieee80211_eid {  	WLAN_EID_TIM = 5,  	WLAN_EID_IBSS_PARAMS = 6,  	WLAN_EID_CHALLENGE = 16, -	/* 802.11d */ +  	WLAN_EID_COUNTRY = 7,  	WLAN_EID_HP_PARAMS = 8,  	WLAN_EID_HP_TABLE = 9,  	WLAN_EID_REQUEST = 10, -	/* 802.11e */ +  	WLAN_EID_QBSS_LOAD = 11,  	WLAN_EID_EDCA_PARAM_SET = 12,  	WLAN_EID_TSPEC = 13, @@ -1099,7 +1153,7 @@ enum ieee80211_eid {  	WLAN_EID_PREP = 69,  	WLAN_EID_PERR = 70,  	WLAN_EID_RANN = 49,	/* compatible with FreeBSD */ -	/* 802.11h */ +  	WLAN_EID_PWR_CONSTRAINT = 32,  	WLAN_EID_PWR_CAPABILITY = 33,  	WLAN_EID_TPC_REQUEST = 34, @@ -1110,20 +1164,41 @@ enum ieee80211_eid {  	WLAN_EID_MEASURE_REPORT = 39,  	WLAN_EID_QUIET = 40,  	WLAN_EID_IBSS_DFS = 41, -	/* 802.11g */ +  	WLAN_EID_ERP_INFO = 42,  	WLAN_EID_EXT_SUPP_RATES = 50, -	/* 802.11n */ +  	WLAN_EID_HT_CAPABILITY = 45,  	WLAN_EID_HT_INFORMATION = 61, -	/* 802.11i */ +  	WLAN_EID_RSN = 48, -	WLAN_EID_TIMEOUT_INTERVAL = 56, -	WLAN_EID_MMIE = 76 /* 802.11w */, +	WLAN_EID_MMIE = 76,  	WLAN_EID_WPA = 221,  	WLAN_EID_GENERIC = 221,  	WLAN_EID_VENDOR_SPECIFIC = 221, -	WLAN_EID_QOS_PARAMETER = 222 +	WLAN_EID_QOS_PARAMETER = 222, + +	WLAN_EID_AP_CHAN_REPORT = 51, +	WLAN_EID_NEIGHBOR_REPORT = 52, +	WLAN_EID_RCPI = 53, +	WLAN_EID_BSS_AVG_ACCESS_DELAY = 63, +	WLAN_EID_ANTENNA_INFO = 64, +	WLAN_EID_RSNI = 65, +	WLAN_EID_MEASUREMENT_PILOT_TX_INFO = 66, +	WLAN_EID_BSS_AVAILABLE_CAPACITY = 67, +	WLAN_EID_BSS_AC_ACCESS_DELAY = 68, +	WLAN_EID_RRM_ENABLED_CAPABILITIES = 70, +	WLAN_EID_MULTIPLE_BSSID = 71, + +	WLAN_EID_MOBILITY_DOMAIN = 54, +	WLAN_EID_FAST_BSS_TRANSITION = 55, +	WLAN_EID_TIMEOUT_INTERVAL = 56, +	WLAN_EID_RIC_DATA = 57, +	WLAN_EID_RIC_DESCRIPTOR = 75, + +	WLAN_EID_DSE_REGISTERED_LOCATION = 58, +	WLAN_EID_SUPPORTED_REGULATORY_CLASSES = 59, +	WLAN_EID_EXT_CHANSWITCH_ANN = 60,  };  /* Action category code */ @@ -1137,6 +1212,8 @@ enum ieee80211_category {  	WLAN_CATEGORY_SA_QUERY = 8,  	WLAN_CATEGORY_PROTECTED_DUAL_OF_ACTION = 9,  	WLAN_CATEGORY_WMM = 17, +	WLAN_CATEGORY_MESH_PLINK = 30,		/* Pending ANA approval */ +	WLAN_CATEGORY_MESH_PATH_SEL = 32,	/* Pending ANA approval */  	WLAN_CATEGORY_VENDOR_SPECIFIC_PROTECTED = 126,  	WLAN_CATEGORY_VENDOR_SPECIFIC = 127,  }; @@ -1150,6 +1227,18 @@ enum ieee80211_spectrum_mgmt_actioncode {  	WLAN_ACTION_SPCT_CHL_SWITCH = 4,  }; +/* HT action codes */ +enum ieee80211_ht_actioncode { +	WLAN_HT_ACTION_NOTIFY_CHANWIDTH = 0, +	WLAN_HT_ACTION_SMPS = 1, +	WLAN_HT_ACTION_PSMP = 2, +	WLAN_HT_ACTION_PCO_PHASE = 3, +	WLAN_HT_ACTION_CSI = 4, +	WLAN_HT_ACTION_NONCOMPRESSED_BF = 5, +	WLAN_HT_ACTION_COMPRESSED_BF = 6, +	WLAN_HT_ACTION_ASEL_IDX_FEEDBACK = 7, +}; +  /* Security key length */  enum ieee80211_key_len {  	WLAN_KEY_LEN_WEP40 = 5, @@ -1238,7 +1327,6 @@ enum ieee80211_back_actioncode {  enum ieee80211_back_parties {  	WLAN_BACK_RECIPIENT = 0,  	WLAN_BACK_INITIATOR = 1, -	WLAN_BACK_TIMER = 2,  };  /* SA Query action */ diff --git a/include/linux/if.h b/include/linux/if.h index 3a9f410a296..be350e62a90 100644 --- a/include/linux/if.h +++ b/include/linux/if.h @@ -71,6 +71,8 @@  					 * release skb->dst  					 */  #define IFF_DONT_BRIDGE 0x800		/* disallow bridging this ether dev */ +#define IFF_IN_NETPOLL	0x1000		/* whether we are processing netpoll */ +#define IFF_DISABLE_NETPOLL	0x2000	/* disable netpoll at run-time */  #define IF_GET_IFACE	0x0001		/* for querying only */  #define IF_GET_PROTO	0x0002 diff --git a/include/linux/if_arp.h b/include/linux/if_arp.h index e80b7f88f7c..6d722f41ee7 100644 --- a/include/linux/if_arp.h +++ b/include/linux/if_arp.h @@ -90,6 +90,7 @@  #define ARPHRD_PHONET	820		/* PhoNet media type		*/  #define ARPHRD_PHONET_PIPE 821		/* PhoNet pipe header		*/ +#define ARPHRD_CAIF	822		/* CAIF media type		*/  #define ARPHRD_VOID	  0xFFFF	/* Void type, nothing is known */  #define ARPHRD_NONE	  0xFFFE	/* zero header length */ diff --git a/include/linux/if_ether.h b/include/linux/if_ether.h index 299b4121f91..bed7a4682b9 100644 --- a/include/linux/if_ether.h +++ b/include/linux/if_ether.h @@ -109,6 +109,7 @@  #define ETH_P_TRAILER	0x001C		/* Trailer switch tagging	*/  #define ETH_P_PHONET	0x00F5		/* Nokia Phonet frames          */  #define ETH_P_IEEE802154 0x00F6		/* IEEE802.15.4 frame		*/ +#define ETH_P_CAIF	0x00F7		/* ST-Ericsson CAIF protocol	*/  /*   *	This is an Ethernet frame header. diff --git a/include/linux/if_link.h b/include/linux/if_link.h index 6674791622c..85c812db5a3 100644 --- a/include/linux/if_link.h +++ b/include/linux/if_link.h @@ -37,6 +37,38 @@ struct rtnl_link_stats {  	__u32	tx_compressed;  }; +struct rtnl_link_stats64 { +	__u64	rx_packets;		/* total packets received	*/ +	__u64	tx_packets;		/* total packets transmitted	*/ +	__u64	rx_bytes;		/* total bytes received 	*/ +	__u64	tx_bytes;		/* total bytes transmitted	*/ +	__u64	rx_errors;		/* bad packets received		*/ +	__u64	tx_errors;		/* packet transmit problems	*/ +	__u64	rx_dropped;		/* no space in linux buffers	*/ +	__u64	tx_dropped;		/* no space available in linux	*/ +	__u64	multicast;		/* multicast packets received	*/ +	__u64	collisions; + +	/* detailed rx_errors: */ +	__u64	rx_length_errors; +	__u64	rx_over_errors;		/* receiver ring buff overflow	*/ +	__u64	rx_crc_errors;		/* recved pkt with crc error	*/ +	__u64	rx_frame_errors;	/* recv'd frame alignment error */ +	__u64	rx_fifo_errors;		/* recv'r fifo overrun		*/ +	__u64	rx_missed_errors;	/* receiver missed packet	*/ + +	/* detailed tx_errors */ +	__u64	tx_aborted_errors; +	__u64	tx_carrier_errors; +	__u64	tx_fifo_errors; +	__u64	tx_heartbeat_errors; +	__u64	tx_window_errors; + +	/* for cslip etc */ +	__u64	rx_compressed; +	__u64	tx_compressed; +}; +  /* The struct should be in sync with struct ifmap */  struct rtnl_link_ifmap {  	__u64	mem_start; @@ -78,6 +110,11 @@ enum {  #define IFLA_LINKINFO IFLA_LINKINFO  	IFLA_NET_NS_PID,  	IFLA_IFALIAS, +	IFLA_NUM_VF,		/* Number of VFs if device is SR-IOV PF */ +	IFLA_VFINFO_LIST, +	IFLA_STATS64, +	IFLA_VF_PORTS, +	IFLA_PORT_SELF,  	__IFLA_MAX  }; @@ -196,4 +233,120 @@ enum macvlan_mode {  	MACVLAN_MODE_BRIDGE  = 4, /* talk to bridge ports directly */  }; +/* SR-IOV virtual function managment section */ + +enum { +	IFLA_VF_INFO_UNSPEC, +	IFLA_VF_INFO, +	__IFLA_VF_INFO_MAX, +}; + +#define IFLA_VF_INFO_MAX (__IFLA_VF_INFO_MAX - 1) + +enum { +	IFLA_VF_UNSPEC, +	IFLA_VF_MAC,		/* Hardware queue specific attributes */ +	IFLA_VF_VLAN, +	IFLA_VF_TX_RATE,	/* TX Bandwidth Allocation */ +	__IFLA_VF_MAX, +}; + +#define IFLA_VF_MAX (__IFLA_VF_MAX - 1) + +struct ifla_vf_mac { +	__u32 vf; +	__u8 mac[32]; /* MAX_ADDR_LEN */ +}; + +struct ifla_vf_vlan { +	__u32 vf; +	__u32 vlan; /* 0 - 4095, 0 disables VLAN filter */ +	__u32 qos; +}; + +struct ifla_vf_tx_rate { +	__u32 vf; +	__u32 rate; /* Max TX bandwidth in Mbps, 0 disables throttling */ +}; + +struct ifla_vf_info { +	__u32 vf; +	__u8 mac[32]; +	__u32 vlan; +	__u32 qos; +	__u32 tx_rate; +}; + +/* VF ports management section + * + *	Nested layout of set/get msg is: + * + *		[IFLA_NUM_VF] + *		[IFLA_VF_PORTS] + *			[IFLA_VF_PORT] + *				[IFLA_PORT_*], ... + *			[IFLA_VF_PORT] + *				[IFLA_PORT_*], ... + *			... + *		[IFLA_PORT_SELF] + *			[IFLA_PORT_*], ... + */ + +enum { +	IFLA_VF_PORT_UNSPEC, +	IFLA_VF_PORT,			/* nest */ +	__IFLA_VF_PORT_MAX, +}; + +#define IFLA_VF_PORT_MAX (__IFLA_VF_PORT_MAX - 1) + +enum { +	IFLA_PORT_UNSPEC, +	IFLA_PORT_VF,			/* __u32 */ +	IFLA_PORT_PROFILE,		/* string */ +	IFLA_PORT_VSI_TYPE,		/* 802.1Qbg (pre-)standard VDP */ +	IFLA_PORT_INSTANCE_UUID,	/* binary UUID */ +	IFLA_PORT_HOST_UUID,		/* binary UUID */ +	IFLA_PORT_REQUEST,		/* __u8 */ +	IFLA_PORT_RESPONSE,		/* __u16, output only */ +	__IFLA_PORT_MAX, +}; + +#define IFLA_PORT_MAX (__IFLA_PORT_MAX - 1) + +#define PORT_PROFILE_MAX	40 +#define PORT_UUID_MAX		16 +#define PORT_SELF_VF		-1 + +enum { +	PORT_REQUEST_PREASSOCIATE = 0, +	PORT_REQUEST_PREASSOCIATE_RR, +	PORT_REQUEST_ASSOCIATE, +	PORT_REQUEST_DISASSOCIATE, +}; + +enum { +	PORT_VDP_RESPONSE_SUCCESS = 0, +	PORT_VDP_RESPONSE_INVALID_FORMAT, +	PORT_VDP_RESPONSE_INSUFFICIENT_RESOURCES, +	PORT_VDP_RESPONSE_UNUSED_VTID, +	PORT_VDP_RESPONSE_VTID_VIOLATION, +	PORT_VDP_RESPONSE_VTID_VERSION_VIOALTION, +	PORT_VDP_RESPONSE_OUT_OF_SYNC, +	/* 0x08-0xFF reserved for future VDP use */ +	PORT_PROFILE_RESPONSE_SUCCESS = 0x100, +	PORT_PROFILE_RESPONSE_INPROGRESS, +	PORT_PROFILE_RESPONSE_INVALID, +	PORT_PROFILE_RESPONSE_BADSTATE, +	PORT_PROFILE_RESPONSE_INSUFFICIENT_RESOURCES, +	PORT_PROFILE_RESPONSE_ERROR, +}; + +struct ifla_port_vsi { +	__u8 vsi_mgr_id; +	__u8 vsi_type_id[3]; +	__u8 vsi_type_version; +	__u8 pad[3]; +}; +  #endif /* _LINUX_IF_LINK_H */ diff --git a/include/linux/if_macvlan.h b/include/linux/if_macvlan.h index 5f200bac374..9ea047aca79 100644 --- a/include/linux/if_macvlan.h +++ b/include/linux/if_macvlan.h @@ -1,6 +1,91 @@  #ifndef _LINUX_IF_MACVLAN_H  #define _LINUX_IF_MACVLAN_H -extern struct sk_buff *(*macvlan_handle_frame_hook)(struct sk_buff *); +#include <linux/if_link.h> +#include <linux/list.h> +#include <linux/netdevice.h> +#include <linux/netlink.h> +#include <net/netlink.h> + +#if defined(CONFIG_MACVTAP) || defined(CONFIG_MACVTAP_MODULE) +struct socket *macvtap_get_socket(struct file *); +#else +#include <linux/err.h> +#include <linux/errno.h> +struct file; +struct socket; +static inline struct socket *macvtap_get_socket(struct file *f) +{ +	return ERR_PTR(-EINVAL); +} +#endif /* CONFIG_MACVTAP */ + +struct macvlan_port; +struct macvtap_queue; + +/** + *	struct macvlan_rx_stats - MACVLAN percpu rx stats + *	@rx_packets: number of received packets + *	@rx_bytes: number of received bytes + *	@multicast: number of received multicast packets + *	@rx_errors: number of errors + */ +struct macvlan_rx_stats { +	unsigned long rx_packets; +	unsigned long rx_bytes; +	unsigned long multicast; +	unsigned long rx_errors; +}; + +struct macvlan_dev { +	struct net_device	*dev; +	struct list_head	list; +	struct hlist_node	hlist; +	struct macvlan_port	*port; +	struct net_device	*lowerdev; +	struct macvlan_rx_stats __percpu *rx_stats; +	enum macvlan_mode	mode; +	int (*receive)(struct sk_buff *skb); +	int (*forward)(struct net_device *dev, struct sk_buff *skb); +	struct macvtap_queue	*tap; +}; + +static inline void macvlan_count_rx(const struct macvlan_dev *vlan, +				    unsigned int len, bool success, +				    bool multicast) +{ +	struct macvlan_rx_stats *rx_stats; + +	rx_stats = per_cpu_ptr(vlan->rx_stats, smp_processor_id()); +	if (likely(success)) { +		rx_stats->rx_packets++;; +		rx_stats->rx_bytes += len; +		if (multicast) +			rx_stats->multicast++; +	} else { +		rx_stats->rx_errors++; +	} +} + +extern int macvlan_common_newlink(struct net *src_net, struct net_device *dev, +				  struct nlattr *tb[], struct nlattr *data[], +				  int (*receive)(struct sk_buff *skb), +				  int (*forward)(struct net_device *dev, +						 struct sk_buff *skb)); + +extern void macvlan_count_rx(const struct macvlan_dev *vlan, +			     unsigned int len, bool success, +			     bool multicast); + +extern void macvlan_dellink(struct net_device *dev, struct list_head *head); + +extern int macvlan_link_register(struct rtnl_link_ops *ops); + +extern netdev_tx_t macvlan_start_xmit(struct sk_buff *skb, +				      struct net_device *dev); + + +extern struct sk_buff *(*macvlan_handle_frame_hook)(struct macvlan_port *, +						    struct sk_buff *);  #endif /* _LINUX_IF_MACVLAN_H */ diff --git a/include/linux/if_packet.h b/include/linux/if_packet.h index 4021d47cc43..6ac23ef1801 100644 --- a/include/linux/if_packet.h +++ b/include/linux/if_packet.h @@ -46,6 +46,8 @@ struct sockaddr_ll {  #define PACKET_RESERVE			12  #define PACKET_TX_RING			13  #define PACKET_LOSS			14 +#define PACKET_VNET_HDR			15 +#define PACKET_TX_TIMESTAMP		16  struct tpacket_stats {  	unsigned int	tp_packets; diff --git a/include/linux/if_pppol2tp.h b/include/linux/if_pppol2tp.h index c58baea4a25..184bc556620 100644 --- a/include/linux/if_pppol2tp.h +++ b/include/linux/if_pppol2tp.h @@ -2,7 +2,7 @@   * Linux PPP over L2TP (PPPoL2TP) Socket Implementation (RFC 2661)   *   * This file supplies definitions required by the PPP over L2TP driver - * (pppol2tp.c).  All version information wrt this file is located in pppol2tp.c + * (l2tp_ppp.c).  All version information wrt this file is located in l2tp_ppp.c   *   * License:   *		This program is free software; you can redistribute it and/or @@ -35,6 +35,20 @@ struct pppol2tp_addr {  	__u16 d_tunnel, d_session;	/* For sending outgoing packets */  }; +/* The L2TPv3 protocol changes tunnel and session ids from 16 to 32 + * bits. So we need a different sockaddr structure. + */ +struct pppol2tpv3_addr { +	pid_t	pid;			/* pid that owns the fd. +					 * 0 => current */ +	int	fd;			/* FD of UDP or IP socket to use */ + +	struct sockaddr_in addr;	/* IP address and port to send to */ + +	__u32 s_tunnel, s_session;	/* For matching incoming packets */ +	__u32 d_tunnel, d_session;	/* For sending outgoing packets */ +}; +  /* Socket options:   * DEBUG	- bitmask of debug message categories   * SENDSEQ	- 0 => don't send packets with sequence numbers diff --git a/include/linux/if_pppox.h b/include/linux/if_pppox.h index 90b5fae5d71..a6577af0c4e 100644 --- a/include/linux/if_pppox.h +++ b/include/linux/if_pppox.h @@ -72,6 +72,15 @@ struct sockaddr_pppol2tp {  	struct pppol2tp_addr pppol2tp;  }__attribute__ ((packed)); +/* The L2TPv3 protocol changes tunnel and session ids from 16 to 32 + * bits. So we need a different sockaddr structure. + */ +struct sockaddr_pppol2tpv3 { +	sa_family_t     sa_family;      /* address family, AF_PPPOX */ +	unsigned int    sa_protocol;    /* protocol identifier */ +	struct pppol2tpv3_addr pppol2tp; +} __attribute__ ((packed)); +  /*********************************************************************   *   * ioctl interface for defining forwarding of connections diff --git a/include/linux/if_tun.h b/include/linux/if_tun.h index 3f5fd523b49..06b1829731f 100644 --- a/include/linux/if_tun.h +++ b/include/linux/if_tun.h @@ -18,6 +18,7 @@  #include <linux/types.h>  #include <linux/if_ether.h> +#include <linux/filter.h>  /* Read queue size */  #define TUN_READQ_SIZE	500 @@ -48,6 +49,10 @@  #define TUNGETIFF      _IOR('T', 210, unsigned int)  #define TUNGETSNDBUF   _IOR('T', 211, int)  #define TUNSETSNDBUF   _IOW('T', 212, int) +#define TUNATTACHFILTER _IOW('T', 213, struct sock_fprog) +#define TUNDETACHFILTER _IOW('T', 214, struct sock_fprog) +#define TUNGETVNETHDRSZ _IOR('T', 215, int) +#define TUNSETVNETHDRSZ _IOW('T', 216, int)  /* TUNSETIFF ifr flags */  #define IFF_TUN		0x0001 @@ -86,4 +91,18 @@ struct tun_filter {  	__u8   addr[0][ETH_ALEN];  }; +#ifdef __KERNEL__ +#if defined(CONFIG_TUN) || defined(CONFIG_TUN_MODULE) +struct socket *tun_get_socket(struct file *); +#else +#include <linux/err.h> +#include <linux/errno.h> +struct file; +struct socket; +static inline struct socket *tun_get_socket(struct file *f) +{ +	return ERR_PTR(-EINVAL); +} +#endif /* CONFIG_TUN */ +#endif /* __KERNEL__ */  #endif /* __IF_TUN_H */ diff --git a/include/linux/if_tunnel.h b/include/linux/if_tunnel.h index 1822d635be6..16b92d008be 100644 --- a/include/linux/if_tunnel.h +++ b/include/linux/if_tunnel.h @@ -2,6 +2,7 @@  #define _IF_TUNNEL_H_  #include <linux/types.h> +#include <asm/byteorder.h>  #ifdef __KERNEL__  #include <linux/ip.h> diff --git a/include/linux/if_x25.h b/include/linux/if_x25.h new file mode 100644 index 00000000000..897765f5feb --- /dev/null +++ b/include/linux/if_x25.h @@ -0,0 +1,26 @@ +/* + *  Linux X.25 packet to device interface + * + *  This program is free software; you can redistribute it and/or modify + *  it under the terms of the GNU General Public License as published by + *  the Free Software Foundation; either version 2 of the License, or + *  (at your option) any later version. + * + *  This program is distributed in the hope that it will be useful, + *  but WITHOUT ANY WARRANTY; without even the implied warranty of + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + *  GNU General Public License for more details. + */ + +#ifndef _IF_X25_H +#define _IF_X25_H + +#include <linux/types.h> + +/* Documentation/networking/x25-iface.txt */ +#define X25_IFACE_DATA		0x00 +#define X25_IFACE_CONNECT	0x01 +#define X25_IFACE_DISCONNECT	0x02 +#define X25_IFACE_PARAMS	0x03 + +#endif /* _IF_X25_H */ diff --git a/include/linux/igmp.h b/include/linux/igmp.h index 724c27e5d17..93fc2449af1 100644 --- a/include/linux/igmp.h +++ b/include/linux/igmp.h @@ -153,6 +153,7 @@ extern int sysctl_igmp_max_msf;  struct ip_sf_socklist {  	unsigned int		sl_max;  	unsigned int		sl_count; +	struct rcu_head		rcu;  	__be32			sl_addr[0];  }; @@ -170,6 +171,7 @@ struct ip_mc_socklist {  	struct ip_mreqn		multi;  	unsigned int		sfmode;		/* MCAST_{INCLUDE,EXCLUDE} */  	struct ip_sf_socklist	*sflist; +	struct rcu_head		rcu;  };  struct ip_sf_list { diff --git a/include/linux/ima.h b/include/linux/ima.h index 99dc6d5cf7e..975837e7d6c 100644 --- a/include/linux/ima.h +++ b/include/linux/ima.h @@ -17,7 +17,7 @@ struct linux_binprm;  extern int ima_bprm_check(struct linux_binprm *bprm);  extern int ima_inode_alloc(struct inode *inode);  extern void ima_inode_free(struct inode *inode); -extern int ima_path_check(struct path *path, int mask); +extern int ima_file_check(struct file *file, int mask);  extern void ima_file_free(struct file *file);  extern int ima_file_mmap(struct file *file, unsigned long prot);  extern void ima_counts_get(struct file *file); @@ -38,7 +38,7 @@ static inline void ima_inode_free(struct inode *inode)  	return;  } -static inline int ima_path_check(struct path *path, int mask) +static inline int ima_file_check(struct file *file, int mask)  {  	return 0;  } diff --git a/include/linux/in.h b/include/linux/in.h index b615649db12..583c76f9c30 100644 --- a/include/linux/in.h +++ b/include/linux/in.h @@ -84,6 +84,8 @@ struct in_addr {  #define IP_ORIGDSTADDR       20  #define IP_RECVORIGDSTADDR   IP_ORIGDSTADDR +#define IP_MINTTL       21 +  /* IP_MTU_DISCOVER values */  #define IP_PMTUDISC_DONT		0	/* Never send DF frames */  #define IP_PMTUDISC_WANT		1	/* Use per route hints	*/ diff --git a/include/linux/in6.h b/include/linux/in6.h index bd55c6e46b2..c4bf46f764b 100644 --- a/include/linux/in6.h +++ b/include/linux/in6.h @@ -221,10 +221,10 @@ struct in6_flowlabel_req {  #define IPV6_RTHDR		57  #define IPV6_RECVDSTOPTS	58  #define IPV6_DSTOPTS		59 -#if 0	/* not yet */  #define IPV6_RECVPATHMTU	60  #define IPV6_PATHMTU		61  #define IPV6_DONTFRAG		62 +#if 0	/* not yet */  #define IPV6_USE_MIN_MTU	63  #endif @@ -265,6 +265,9 @@ struct in6_flowlabel_req {  #define IPV6_PREFER_SRC_CGA		0x0008  #define IPV6_PREFER_SRC_NONCGA		0x0800 +/* RFC5082: Generalized Ttl Security Mechanism */ +#define IPV6_MINHOPCOUNT		73 +  /*   * Multicast Routing:   * see include/linux/mroute6.h. diff --git a/include/linux/inetdevice.h b/include/linux/inetdevice.h index b2304929434..2be1a1a2beb 100644 --- a/include/linux/inetdevice.h +++ b/include/linux/inetdevice.h @@ -10,10 +10,40 @@  #include <linux/timer.h>  #include <linux/sysctl.h> +enum +{ +	IPV4_DEVCONF_FORWARDING=1, +	IPV4_DEVCONF_MC_FORWARDING, +	IPV4_DEVCONF_PROXY_ARP, +	IPV4_DEVCONF_ACCEPT_REDIRECTS, +	IPV4_DEVCONF_SECURE_REDIRECTS, +	IPV4_DEVCONF_SEND_REDIRECTS, +	IPV4_DEVCONF_SHARED_MEDIA, +	IPV4_DEVCONF_RP_FILTER, +	IPV4_DEVCONF_ACCEPT_SOURCE_ROUTE, +	IPV4_DEVCONF_BOOTP_RELAY, +	IPV4_DEVCONF_LOG_MARTIANS, +	IPV4_DEVCONF_TAG, +	IPV4_DEVCONF_ARPFILTER, +	IPV4_DEVCONF_MEDIUM_ID, +	IPV4_DEVCONF_NOXFRM, +	IPV4_DEVCONF_NOPOLICY, +	IPV4_DEVCONF_FORCE_IGMP_VERSION, +	IPV4_DEVCONF_ARP_ANNOUNCE, +	IPV4_DEVCONF_ARP_IGNORE, +	IPV4_DEVCONF_PROMOTE_SECONDARIES, +	IPV4_DEVCONF_ARP_ACCEPT, +	IPV4_DEVCONF_ARP_NOTIFY, +	IPV4_DEVCONF_ACCEPT_LOCAL, +	IPV4_DEVCONF_SRC_VMARK, +	IPV4_DEVCONF_PROXY_ARP_PVLAN, +	__IPV4_DEVCONF_MAX +}; +  struct ipv4_devconf {  	void	*sysctl; -	int	data[__NET_IPV4_CONF_MAX - 1]; -	DECLARE_BITMAP(state, __NET_IPV4_CONF_MAX - 1); +	int	data[__IPV4_DEVCONF_MAX - 1]; +	DECLARE_BITMAP(state, __IPV4_DEVCONF_MAX - 1);  };  struct in_device { @@ -40,7 +70,7 @@ struct in_device {  	struct rcu_head		rcu_head;  }; -#define IPV4_DEVCONF(cnf, attr) ((cnf).data[NET_IPV4_CONF_ ## attr - 1]) +#define IPV4_DEVCONF(cnf, attr) ((cnf).data[IPV4_DEVCONF_ ## attr - 1])  #define IPV4_DEVCONF_ALL(net, attr) \  	IPV4_DEVCONF((*(net)->ipv4.devconf_all), attr) @@ -60,13 +90,13 @@ static inline void ipv4_devconf_set(struct in_device *in_dev, int index,  static inline void ipv4_devconf_setall(struct in_device *in_dev)  { -	bitmap_fill(in_dev->cnf.state, __NET_IPV4_CONF_MAX - 1); +	bitmap_fill(in_dev->cnf.state, __IPV4_DEVCONF_MAX - 1);  }  #define IN_DEV_CONF_GET(in_dev, attr) \ -	ipv4_devconf_get((in_dev), NET_IPV4_CONF_ ## attr) +	ipv4_devconf_get((in_dev), IPV4_DEVCONF_ ## attr)  #define IN_DEV_CONF_SET(in_dev, attr, val) \ -	ipv4_devconf_set((in_dev), NET_IPV4_CONF_ ## attr, (val)) +	ipv4_devconf_set((in_dev), IPV4_DEVCONF_ ## attr, (val))  #define IN_DEV_ANDCONF(in_dev, attr) \  	(IPV4_DEVCONF_ALL(dev_net(in_dev->dev), attr) && \ @@ -89,6 +119,7 @@ static inline void ipv4_devconf_setall(struct in_device *in_dev)  #define IN_DEV_LOG_MARTIANS(in_dev)	IN_DEV_ORCONF((in_dev), LOG_MARTIANS)  #define IN_DEV_PROXY_ARP(in_dev)	IN_DEV_ORCONF((in_dev), PROXY_ARP) +#define IN_DEV_PROXY_ARP_PVLAN(in_dev)	IN_DEV_CONF_GET(in_dev, PROXY_ARP_PVLAN)  #define IN_DEV_SHARED_MEDIA(in_dev)	IN_DEV_ORCONF((in_dev), SHARED_MEDIA)  #define IN_DEV_TX_REDIRECTS(in_dev)	IN_DEV_ORCONF((in_dev), SEND_REDIRECTS)  #define IN_DEV_SEC_REDIRECTS(in_dev)	IN_DEV_ORCONF((in_dev), \ diff --git a/include/linux/init_task.h b/include/linux/init_task.h index f00253b3fc4..1f43fa56f60 100644 --- a/include/linux/init_task.h +++ b/include/linux/init_task.h @@ -16,7 +16,7 @@ extern struct files_struct init_files;  extern struct fs_struct init_fs;  #define INIT_SIGNALS(sig) {						\ -	.count		= ATOMIC_INIT(1), 				\ +	.nr_threads	= 1,						\  	.wait_chldexit	= __WAIT_QUEUE_HEAD_INITIALIZER(sig.wait_chldexit),\  	.shared_pending	= { 						\  		.list = LIST_HEAD_INIT(sig.shared_pending.list),	\ @@ -32,18 +32,10 @@ extern struct fs_struct init_fs;  }  extern struct nsproxy init_nsproxy; -#define INIT_NSPROXY(nsproxy) {						\ -	.pid_ns		= &init_pid_ns,					\ -	.count		= ATOMIC_INIT(1),				\ -	.uts_ns		= &init_uts_ns,					\ -	.mnt_ns		= NULL,						\ -	INIT_NET_NS(net_ns)                                             \ -	INIT_IPC_NS(ipc_ns)						\ -}  #define INIT_SIGHAND(sighand) {						\  	.count		= ATOMIC_INIT(1), 				\ -	.action		= { { { .sa_handler = NULL, } }, },		\ +	.action		= { { { .sa_handler = SIG_DFL, } }, },		\  	.siglock	= __SPIN_LOCK_UNLOCKED(sighand.siglock),	\  	.signalfd_wqh	= __WAIT_QUEUE_HEAD_INITIALIZER(sighand.signalfd_wqh),	\  } @@ -53,11 +45,10 @@ extern struct group_info init_groups;  #define INIT_STRUCT_PID {						\  	.count 		= ATOMIC_INIT(1),				\  	.tasks		= {						\ -		{ .first = &init_task.pids[PIDTYPE_PID].node },		\ -		{ .first = &init_task.pids[PIDTYPE_PGID].node },	\ -		{ .first = &init_task.pids[PIDTYPE_SID].node },		\ +		{ .first = NULL },					\ +		{ .first = NULL },					\ +		{ .first = NULL },					\  	},								\ -	.rcu		= RCU_HEAD_INIT,				\  	.level		= 0,						\  	.numbers	= { {						\  		.nr		= 0,					\ @@ -70,7 +61,7 @@ extern struct group_info init_groups;  {								\  	.node = {						\  		.next = NULL,					\ -		.pprev = &init_struct_pid.tasks[type].first,	\ +		.pprev = NULL,					\  	},							\  	.pid = &init_struct_pid,				\  } @@ -172,6 +163,7 @@ extern struct cred init_cred;  		[PIDTYPE_PGID] = INIT_PID_LINK(PIDTYPE_PGID),		\  		[PIDTYPE_SID]  = INIT_PID_LINK(PIDTYPE_SID),		\  	},								\ +	.thread_group	= LIST_HEAD_INIT(tsk.thread_group),		\  	.dirties = INIT_PROP_LOCAL_SINGLE(dirties),			\  	INIT_IDS							\  	INIT_PERF_EVENTS(tsk)						\ diff --git a/include/linux/input.h b/include/linux/input.h index 735ceaf1bc2..6fcc9101bee 100644 --- a/include/linux/input.h +++ b/include/linux/input.h @@ -58,10 +58,10 @@ struct input_absinfo {  #define EVIOCGVERSION		_IOR('E', 0x01, int)			/* get driver version */  #define EVIOCGID		_IOR('E', 0x02, struct input_id)	/* get device ID */ -#define EVIOCGREP		_IOR('E', 0x03, int[2])			/* get repeat settings */ -#define EVIOCSREP		_IOW('E', 0x03, int[2])			/* set repeat settings */ -#define EVIOCGKEYCODE		_IOR('E', 0x04, int[2])			/* get keycode */ -#define EVIOCSKEYCODE		_IOW('E', 0x04, int[2])			/* set keycode */ +#define EVIOCGREP		_IOR('E', 0x03, unsigned int[2])	/* get repeat settings */ +#define EVIOCSREP		_IOW('E', 0x03, unsigned int[2])	/* set repeat settings */ +#define EVIOCGKEYCODE		_IOR('E', 0x04, unsigned int[2])	/* get keycode */ +#define EVIOCSKEYCODE		_IOW('E', 0x04, unsigned int[2])	/* set keycode */  #define EVIOCGNAME(len)		_IOC(_IOC_READ, 'E', 0x06, len)		/* get device name */  #define EVIOCGPHYS(len)		_IOC(_IOC_READ, 'E', 0x07, len)		/* get physical location */ @@ -376,8 +376,9 @@ struct input_absinfo {  #define KEY_DISPLAY_OFF		245	/* display device to off state */  #define KEY_WIMAX		246 +#define KEY_RFKILL		247	/* Key that controls all radios */ -/* Range 248 - 255 is reserved for special needs of AT keyboard driver */ +/* Code 255 is reserved for special needs of AT keyboard driver */  #define BTN_MISC		0x100  #define BTN_0			0x100 @@ -596,6 +597,49 @@ struct input_absinfo {  #define KEY_NUMERIC_POUND	0x20b  #define KEY_CAMERA_FOCUS	0x210 +#define KEY_WPS_BUTTON		0x211	/* WiFi Protected Setup key */ + +#define BTN_TRIGGER_HAPPY		0x2c0 +#define BTN_TRIGGER_HAPPY1		0x2c0 +#define BTN_TRIGGER_HAPPY2		0x2c1 +#define BTN_TRIGGER_HAPPY3		0x2c2 +#define BTN_TRIGGER_HAPPY4		0x2c3 +#define BTN_TRIGGER_HAPPY5		0x2c4 +#define BTN_TRIGGER_HAPPY6		0x2c5 +#define BTN_TRIGGER_HAPPY7		0x2c6 +#define BTN_TRIGGER_HAPPY8		0x2c7 +#define BTN_TRIGGER_HAPPY9		0x2c8 +#define BTN_TRIGGER_HAPPY10		0x2c9 +#define BTN_TRIGGER_HAPPY11		0x2ca +#define BTN_TRIGGER_HAPPY12		0x2cb +#define BTN_TRIGGER_HAPPY13		0x2cc +#define BTN_TRIGGER_HAPPY14		0x2cd +#define BTN_TRIGGER_HAPPY15		0x2ce +#define BTN_TRIGGER_HAPPY16		0x2cf +#define BTN_TRIGGER_HAPPY17		0x2d0 +#define BTN_TRIGGER_HAPPY18		0x2d1 +#define BTN_TRIGGER_HAPPY19		0x2d2 +#define BTN_TRIGGER_HAPPY20		0x2d3 +#define BTN_TRIGGER_HAPPY21		0x2d4 +#define BTN_TRIGGER_HAPPY22		0x2d5 +#define BTN_TRIGGER_HAPPY23		0x2d6 +#define BTN_TRIGGER_HAPPY24		0x2d7 +#define BTN_TRIGGER_HAPPY25		0x2d8 +#define BTN_TRIGGER_HAPPY26		0x2d9 +#define BTN_TRIGGER_HAPPY27		0x2da +#define BTN_TRIGGER_HAPPY28		0x2db +#define BTN_TRIGGER_HAPPY29		0x2dc +#define BTN_TRIGGER_HAPPY30		0x2dd +#define BTN_TRIGGER_HAPPY31		0x2de +#define BTN_TRIGGER_HAPPY32		0x2df +#define BTN_TRIGGER_HAPPY33		0x2e0 +#define BTN_TRIGGER_HAPPY34		0x2e1 +#define BTN_TRIGGER_HAPPY35		0x2e2 +#define BTN_TRIGGER_HAPPY36		0x2e3 +#define BTN_TRIGGER_HAPPY37		0x2e4 +#define BTN_TRIGGER_HAPPY38		0x2e5 +#define BTN_TRIGGER_HAPPY39		0x2e6 +#define BTN_TRIGGER_HAPPY40		0x2e7  /* We avoid low common keys in module aliases so they don't get huge. */  #define KEY_MIN_INTERESTING	KEY_MUTE @@ -762,6 +806,7 @@ struct input_absinfo {  #define BUS_HOST		0x19  #define BUS_GSC			0x1A  #define BUS_ATARI		0x1B +#define BUS_SPI			0x1C  /*   * MT_TOOL types @@ -1098,8 +1143,10 @@ struct input_dev {  	unsigned int keycodemax;  	unsigned int keycodesize;  	void *keycode; -	int (*setkeycode)(struct input_dev *dev, int scancode, int keycode); -	int (*getkeycode)(struct input_dev *dev, int scancode, int *keycode); +	int (*setkeycode)(struct input_dev *dev, +			  unsigned int scancode, unsigned int keycode); +	int (*getkeycode)(struct input_dev *dev, +			  unsigned int scancode, unsigned int *keycode);  	struct ff_device *ff; @@ -1108,7 +1155,7 @@ struct input_dev {  	int sync; -	int abs[ABS_MAX + 1]; +	int abs[ABS_CNT];  	int rep[REP_MAX + 1];  	unsigned long key[BITS_TO_LONGS(KEY_CNT)]; @@ -1116,11 +1163,11 @@ struct input_dev {  	unsigned long snd[BITS_TO_LONGS(SND_CNT)];  	unsigned long sw[BITS_TO_LONGS(SW_CNT)]; -	int absmax[ABS_MAX + 1]; -	int absmin[ABS_MAX + 1]; -	int absfuzz[ABS_MAX + 1]; -	int absflat[ABS_MAX + 1]; -	int absres[ABS_MAX + 1]; +	int absmax[ABS_CNT]; +	int absmin[ABS_CNT]; +	int absfuzz[ABS_CNT]; +	int absflat[ABS_CNT]; +	int absres[ABS_CNT];  	int (*open)(struct input_dev *dev);  	void (*close)(struct input_dev *dev); @@ -1199,6 +1246,10 @@ struct input_handle;   * @event: event handler. This method is being called by input core with   *	interrupts disabled and dev->event_lock spinlock held and so   *	it may not sleep + * @filter: similar to @event; separates normal event handlers from + *	"filters". + * @match: called after comparing device's id with handler's id_table + *	to perform fine-grained matching between device and handler   * @connect: called when attaching a handler to an input device   * @disconnect: disconnects a handler from input device   * @start: starts handler for given handle. This function is called by @@ -1210,8 +1261,6 @@ struct input_handle;   * @name: name of the handler, to be shown in /proc/bus/input/handlers   * @id_table: pointer to a table of input_device_ids this driver can   *	handle - * @blacklist: pointer to a table of input_device_ids this driver should - *	ignore even if they match @id_table   * @h_list: list of input handles associated with the handler   * @node: for placing the driver onto input_handler_list   * @@ -1220,6 +1269,11 @@ struct input_handle;   * same time. All of them will get their copy of input event generated by   * the device.   * + * The very same structure is used to implement input filters. Input core + * allows filters to run first and will not pass event to regular handlers + * if any of the filters indicate that the event should be filtered (by + * returning %true from their filter() method). + *   * Note that input core serializes calls to connect() and disconnect()   * methods.   */ @@ -1228,6 +1282,8 @@ struct input_handler {  	void *private;  	void (*event)(struct input_handle *handle, unsigned int type, unsigned int code, int value); +	bool (*filter)(struct input_handle *handle, unsigned int type, unsigned int code, int value); +	bool (*match)(struct input_handler *handler, struct input_dev *dev);  	int (*connect)(struct input_handler *handler, struct input_dev *dev, const struct input_device_id *id);  	void (*disconnect)(struct input_handle *handle);  	void (*start)(struct input_handle *handle); @@ -1237,7 +1293,6 @@ struct input_handler {  	const char *name;  	const struct input_device_id *id_table; -	const struct input_device_id *blacklist;  	struct list_head	h_list;  	struct list_head	node; @@ -1363,8 +1418,10 @@ static inline void input_set_abs_params(struct input_dev *dev, int axis, int min  	dev->absbit[BIT_WORD(axis)] |= BIT_MASK(axis);  } -int input_get_keycode(struct input_dev *dev, int scancode, int *keycode); -int input_set_keycode(struct input_dev *dev, int scancode, int keycode); +int input_get_keycode(struct input_dev *dev, +		      unsigned int scancode, unsigned int *keycode); +int input_set_keycode(struct input_dev *dev, +		      unsigned int scancode, unsigned int keycode);  extern struct class input_class; diff --git a/include/linux/input/ad714x.h b/include/linux/input/ad714x.h new file mode 100644 index 00000000000..0cbe5e81482 --- /dev/null +++ b/include/linux/input/ad714x.h @@ -0,0 +1,63 @@ +/* + * include/linux/input/ad714x.h + * + * AD714x is very flexible, it can be used as buttons, scrollwheel, + * slider, touchpad at the same time. That depends on the boards. + * The platform_data for the device's "struct device" holds this + * information. + * + * Copyright 2009 Analog Devices Inc. + * + * Licensed under the GPL-2 or later. + */ + +#ifndef __LINUX_INPUT_AD714X_H__ +#define __LINUX_INPUT_AD714X_H__ + +#define STAGE_NUM              12 +#define STAGE_CFGREG_NUM       8 +#define SYS_CFGREG_NUM         8 + +/* board information which need be initialized in arch/mach... */ +struct ad714x_slider_plat { +	int start_stage; +	int end_stage; +	int max_coord; +}; + +struct ad714x_wheel_plat { +	int start_stage; +	int end_stage; +	int max_coord; +}; + +struct ad714x_touchpad_plat { +	int x_start_stage; +	int x_end_stage; +	int x_max_coord; + +	int y_start_stage; +	int y_end_stage; +	int y_max_coord; +}; + +struct ad714x_button_plat { +	int keycode; +	unsigned short l_mask; +	unsigned short h_mask; +}; + +struct ad714x_platform_data { +	int slider_num; +	int wheel_num; +	int touchpad_num; +	int button_num; +	struct ad714x_slider_plat *slider; +	struct ad714x_wheel_plat *wheel; +	struct ad714x_touchpad_plat *touchpad; +	struct ad714x_button_plat *button; +	unsigned short stage_cfg_reg[STAGE_NUM][STAGE_CFGREG_NUM]; +	unsigned short sys_cfg_reg[SYS_CFGREG_NUM]; +}; + +#endif diff --git a/include/linux/input/matrix_keypad.h b/include/linux/input/matrix_keypad.h index 3bd018baae2..c964cd7f436 100644 --- a/include/linux/input/matrix_keypad.h +++ b/include/linux/input/matrix_keypad.h @@ -44,6 +44,7 @@ struct matrix_keymap_data {   * @active_low: gpio polarity   * @wakeup: controls whether the device should be set up as wakeup   *	source + * @no_autorepeat: disable key autorepeat   *   * This structure represents platform-specific data that use used by   * matrix_keypad driver to perform proper initialization. @@ -64,6 +65,7 @@ struct matrix_keypad_platform_data {  	bool		active_low;  	bool		wakeup; +	bool		no_autorepeat;  };  /** diff --git a/include/linux/input/sh_keysc.h b/include/linux/input/sh_keysc.h index c211b5cf08e..649dc7f1292 100644 --- a/include/linux/input/sh_keysc.h +++ b/include/linux/input/sh_keysc.h @@ -1,14 +1,15 @@  #ifndef __SH_KEYSC_H__  #define __SH_KEYSC_H__ -#define SH_KEYSC_MAXKEYS 30 +#define SH_KEYSC_MAXKEYS 49  struct sh_keysc_info { -	enum { SH_KEYSC_MODE_1, SH_KEYSC_MODE_2, SH_KEYSC_MODE_3 } mode; +	enum { SH_KEYSC_MODE_1, SH_KEYSC_MODE_2, SH_KEYSC_MODE_3, +	       SH_KEYSC_MODE_4, SH_KEYSC_MODE_5, SH_KEYSC_MODE_6 } mode;  	int scan_timing; /* 0 -> 7, see KYCR1, SCN[2:0] */  	int delay;  	int kycr2_delay; -	int keycodes[SH_KEYSC_MAXKEYS]; +	int keycodes[SH_KEYSC_MAXKEYS]; /* KEYIN * KEYOUT */  };  #endif /* __SH_KEYSC_H__ */ diff --git a/include/linux/input/tps6507x-ts.h b/include/linux/input/tps6507x-ts.h new file mode 100644 index 00000000000..ab144031392 --- /dev/null +++ b/include/linux/input/tps6507x-ts.h @@ -0,0 +1,24 @@ +/* linux/i2c/tps6507x-ts.h + * + * Functions to access TPS65070 touch screen chip. + * + * Copyright (c) 2009 RidgeRun (todd.fischer@ridgerun.com) + * + * + *  For licencing details see kernel-base/COPYING + */ + +#ifndef __LINUX_I2C_TPS6507X_TS_H +#define __LINUX_I2C_TPS6507X_TS_H + +/* Board specific touch screen initial values */ +struct touchscreen_init_data { +	int	poll_period;	/* ms */ +	int	vref;		/* non-zero to leave vref on */ +	__u16	min_pressure;	/* min reading to be treated as a touch */ +	__u16	vendor; +	__u16	product; +	__u16	version; +}; + +#endif /*  __LINUX_I2C_TPS6507X_TS_H */ diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h index 75f3f00ac1e..c2331138ca1 100644 --- a/include/linux/interrupt.h +++ b/include/linux/interrupt.h @@ -39,7 +39,8 @@   * These flags used only by the kernel as part of the   * irq handling routines.   * - * IRQF_DISABLED - keep irqs disabled when calling the action handler + * IRQF_DISABLED - keep irqs disabled when calling the action handler. + *                 DEPRECATED. This flag is a NOOP and scheduled to be removed   * IRQF_SAMPLE_RANDOM - irq is used to feed the random generator   * IRQF_SHARED - allow sharing the irq among several devices   * IRQF_PROBE_SHARED - set by callers when they expect sharing mismatches to occur @@ -77,6 +78,18 @@ enum {  	IRQTF_AFFINITY,  }; +/* + * These values can be returned by request_any_context_irq() and + * describe the context the interrupt will be run in. + * + * IRQC_IS_HARDIRQ - interrupt runs in hardirq context + * IRQC_IS_NESTED - interrupt runs in a nested threaded context + */ +enum { +	IRQC_IS_HARDIRQ	= 0, +	IRQC_IS_NESTED, +}; +  typedef irqreturn_t (*irq_handler_t)(int, void *);  /** @@ -120,6 +133,10 @@ request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags,  	return request_threaded_irq(irq, handler, NULL, flags, name, dev);  } +extern int __must_check +request_any_context_irq(unsigned int irq, irq_handler_t handler, +			unsigned long flags, const char *name, void *dev_id); +  extern void exit_irq_thread(void);  #else @@ -141,6 +158,13 @@ request_threaded_irq(unsigned int irq, irq_handler_t handler,  	return request_irq(irq, handler, flags, name, dev);  } +static inline int __must_check +request_any_context_irq(unsigned int irq, irq_handler_t handler, +			unsigned long flags, const char *name, void *dev_id) +{ +	return request_irq(irq, handler, flags, name, dev_id); +} +  static inline void exit_irq_thread(void) { }  #endif @@ -209,6 +233,7 @@ extern int irq_set_affinity(unsigned int irq, const struct cpumask *cpumask);  extern int irq_can_set_affinity(unsigned int irq);  extern int irq_select_affinity(unsigned int irq); +extern int irq_set_affinity_hint(unsigned int irq, const struct cpumask *m);  #else /* CONFIG_SMP */  static inline int irq_set_affinity(unsigned int irq, const struct cpumask *m) @@ -223,6 +248,11 @@ static inline int irq_can_set_affinity(unsigned int irq)  static inline int irq_select_affinity(unsigned int irq)  { return 0; } +static inline int irq_set_affinity_hint(unsigned int irq, +                                        const struct cpumask *m) +{ +	return -EINVAL; +}  #endif /* CONFIG_SMP && CONFIG_GENERIC_HARDIRQS */  #ifdef CONFIG_GENERIC_HARDIRQS diff --git a/include/linux/io-mapping.h b/include/linux/io-mapping.h index 97eb928b492..25085ddd955 100644 --- a/include/linux/io-mapping.h +++ b/include/linux/io-mapping.h @@ -19,6 +19,7 @@  #define _LINUX_IO_MAPPING_H  #include <linux/types.h> +#include <linux/slab.h>  #include <asm/io.h>  #include <asm/page.h>  #include <asm/iomap.h> diff --git a/include/linux/iocontext.h b/include/linux/iocontext.h index 78ef023227d..a0bb301afac 100644 --- a/include/linux/iocontext.h +++ b/include/linux/iocontext.h @@ -42,15 +42,15 @@ struct io_context {  	unsigned short ioprio;  	unsigned short ioprio_changed; -#ifdef CONFIG_BLK_CGROUP +#if defined(CONFIG_BLK_CGROUP) || defined(CONFIG_BLK_CGROUP_MODULE)  	unsigned short cgroup_changed;  #endif  	/*  	 * For request batching  	 */ -	unsigned long last_waited; /* Time last woken after wait for request */  	int nr_batch_requests;     /* Number of requests left in the batch */ +	unsigned long last_waited; /* Time last woken after wait for request */  	struct radix_tree_root radix_root;  	struct hlist_head cic_list; diff --git a/include/linux/iommu.h b/include/linux/iommu.h index 3af4ffd591b..be22ad83689 100644 --- a/include/linux/iommu.h +++ b/include/linux/iommu.h @@ -37,9 +37,9 @@ struct iommu_ops {  	int (*attach_dev)(struct iommu_domain *domain, struct device *dev);  	void (*detach_dev)(struct iommu_domain *domain, struct device *dev);  	int (*map)(struct iommu_domain *domain, unsigned long iova, -		   phys_addr_t paddr, size_t size, int prot); -	void (*unmap)(struct iommu_domain *domain, unsigned long iova, -		      size_t size); +		   phys_addr_t paddr, int gfp_order, int prot); +	int (*unmap)(struct iommu_domain *domain, unsigned long iova, +		     int gfp_order);  	phys_addr_t (*iova_to_phys)(struct iommu_domain *domain,  				    unsigned long iova);  	int (*domain_has_cap)(struct iommu_domain *domain, @@ -56,10 +56,10 @@ extern int iommu_attach_device(struct iommu_domain *domain,  			       struct device *dev);  extern void iommu_detach_device(struct iommu_domain *domain,  				struct device *dev); -extern int iommu_map_range(struct iommu_domain *domain, unsigned long iova, -			   phys_addr_t paddr, size_t size, int prot); -extern void iommu_unmap_range(struct iommu_domain *domain, unsigned long iova, -			      size_t size); +extern int iommu_map(struct iommu_domain *domain, unsigned long iova, +		     phys_addr_t paddr, int gfp_order, int prot); +extern int iommu_unmap(struct iommu_domain *domain, unsigned long iova, +		       int gfp_order);  extern phys_addr_t iommu_iova_to_phys(struct iommu_domain *domain,  				      unsigned long iova);  extern int iommu_domain_has_cap(struct iommu_domain *domain, @@ -96,16 +96,16 @@ static inline void iommu_detach_device(struct iommu_domain *domain,  {  } -static inline int iommu_map_range(struct iommu_domain *domain, -				  unsigned long iova, phys_addr_t paddr, -				  size_t size, int prot) +static inline int iommu_map(struct iommu_domain *domain, unsigned long iova, +			    phys_addr_t paddr, int gfp_order, int prot)  {  	return -ENODEV;  } -static inline void iommu_unmap_range(struct iommu_domain *domain, -				     unsigned long iova, size_t size) +static inline int iommu_unmap(struct iommu_domain *domain, unsigned long iova, +			      int gfp_order)  { +	return -ENODEV;  }  static inline phys_addr_t iommu_iova_to_phys(struct iommu_domain *domain, diff --git a/include/linux/ioport.h b/include/linux/ioport.h index 7129504e053..b22790268b6 100644 --- a/include/linux/ioport.h +++ b/include/linux/ioport.h @@ -34,22 +34,25 @@ struct resource_list {   */  #define IORESOURCE_BITS		0x000000ff	/* Bus-specific bits */ -#define IORESOURCE_TYPE_BITS	0x00000f00	/* Resource type */ +#define IORESOURCE_TYPE_BITS	0x00001f00	/* Resource type */  #define IORESOURCE_IO		0x00000100  #define IORESOURCE_MEM		0x00000200  #define IORESOURCE_IRQ		0x00000400  #define IORESOURCE_DMA		0x00000800 +#define IORESOURCE_BUS		0x00001000 -#define IORESOURCE_PREFETCH	0x00001000	/* No side effects */ -#define IORESOURCE_READONLY	0x00002000 -#define IORESOURCE_CACHEABLE	0x00004000 -#define IORESOURCE_RANGELENGTH	0x00008000 -#define IORESOURCE_SHADOWABLE	0x00010000 +#define IORESOURCE_PREFETCH	0x00002000	/* No side effects */ +#define IORESOURCE_READONLY	0x00004000 +#define IORESOURCE_CACHEABLE	0x00008000 +#define IORESOURCE_RANGELENGTH	0x00010000 +#define IORESOURCE_SHADOWABLE	0x00020000 -#define IORESOURCE_SIZEALIGN	0x00020000	/* size indicates alignment */ -#define IORESOURCE_STARTALIGN	0x00040000	/* start field is alignment */ +#define IORESOURCE_SIZEALIGN	0x00040000	/* size indicates alignment */ +#define IORESOURCE_STARTALIGN	0x00080000	/* start field is alignment */  #define IORESOURCE_MEM_64	0x00100000 +#define IORESOURCE_WINDOW	0x00200000	/* forwarded by bridge */ +#define IORESOURCE_MUXED	0x00400000	/* Resource is software muxed */  #define IORESOURCE_EXCLUSIVE	0x08000000	/* Userland may not map this resource */  #define IORESOURCE_DISABLED	0x10000000 @@ -110,18 +113,23 @@ struct resource_list {  extern struct resource ioport_resource;  extern struct resource iomem_resource; +extern struct resource *request_resource_conflict(struct resource *root, struct resource *new);  extern int request_resource(struct resource *root, struct resource *new);  extern int release_resource(struct resource *new); +void release_child_resources(struct resource *new);  extern void reserve_region_with_split(struct resource *root,  			     resource_size_t start, resource_size_t end,  			     const char *name); +extern struct resource *insert_resource_conflict(struct resource *parent, struct resource *new);  extern int insert_resource(struct resource *parent, struct resource *new);  extern void insert_resource_expand_to_fit(struct resource *root, struct resource *new);  extern int allocate_resource(struct resource *root, struct resource *new,  			     resource_size_t size, resource_size_t min,  			     resource_size_t max, resource_size_t align, -			     void (*alignf)(void *, struct resource *, -					    resource_size_t, resource_size_t), +			     resource_size_t (*alignf)(void *, +						       const struct resource *, +						       resource_size_t, +						       resource_size_t),  			     void *alignf_data);  int adjust_resource(struct resource *res, resource_size_t start,  		    resource_size_t size); @@ -136,7 +144,8 @@ static inline unsigned long resource_type(const struct resource *res)  }  /* Convenience shorthand with allocation */ -#define request_region(start,n,name)	__request_region(&ioport_resource, (start), (n), (name), 0) +#define request_region(start,n,name)		__request_region(&ioport_resource, (start), (n), (name), 0) +#define request_muxed_region(start,n,name)	__request_region(&ioport_resource, (start), (n), (name), IORESOURCE_MUXED)  #define __request_mem_region(start,n,name, excl) __request_region(&iomem_resource, (start), (n), (name), excl)  #define request_mem_region(start,n,name) __request_region(&iomem_resource, (start), (n), (name), 0)  #define request_mem_region_exclusive(start,n,name) \ diff --git a/include/linux/ipc_namespace.h b/include/linux/ipc_namespace.h index 07baa38bce3..51952989ad4 100644 --- a/include/linux/ipc_namespace.h +++ b/include/linux/ipc_namespace.h @@ -62,11 +62,6 @@ extern struct ipc_namespace init_ipc_ns;  extern atomic_t nr_ipc_ns;  extern spinlock_t mq_lock; -#if defined(CONFIG_POSIX_MQUEUE) || defined(CONFIG_SYSVIPC) -#define INIT_IPC_NS(ns)		.ns		= &init_ipc_ns, -#else -#define INIT_IPC_NS(ns) -#endif  #ifdef CONFIG_SYSVIPC  extern int register_ipcns_notifier(struct ipc_namespace *); diff --git a/include/linux/ipmi_smi.h b/include/linux/ipmi_smi.h index f7c9c75a277..4b48318ac54 100644 --- a/include/linux/ipmi_smi.h +++ b/include/linux/ipmi_smi.h @@ -39,7 +39,6 @@  #include <linux/module.h>  #include <linux/device.h>  #include <linux/platform_device.h> -#include <linux/ipmi_smi.h>  /* This files describes the interface for IPMI system management interface     drivers to bind into the IPMI message handler. */ diff --git a/include/linux/ipv6.h b/include/linux/ipv6.h index e0cc9a7db2b..99e1ab7e3ee 100644 --- a/include/linux/ipv6.h +++ b/include/linux/ipv6.h @@ -21,6 +21,10 @@ struct in6_pktinfo {  	int		ipi6_ifindex;  }; +struct ip6_mtuinfo { +	struct sockaddr_in6	ip6m_addr; +	__u32			ip6m_mtu; +};  struct in6_ifreq {  	struct in6_addr	ifr6_addr; @@ -250,9 +254,11 @@ struct inet6_skb_parm {  #define IP6SKB_XFRM_TRANSFORMED	1  #define IP6SKB_FORWARDED	2 +#define IP6SKB_REROUTED		4  };  #define IP6CB(skb)	((struct inet6_skb_parm*)((skb)->cb)) +#define IP6CBMTU(skb)	((struct ip6_mtuinfo *)((skb)->cb))  static inline int inet6_iif(const struct sk_buff *skb)  { @@ -334,21 +340,25 @@ struct ipv6_pinfo {  				dstopts:1,  				odstopts:1,                                  rxflow:1, -				rxtclass:1; +				rxtclass:1, +				rxpmtu:1;  		} bits;  		__u16		all;  	} rxopt;  	/* sockopt flags */ -	__u8			recverr:1, +	__u16			recverr:1,  	                        sndflow:1,  				pmtudisc:2,  				ipv6only:1, -				srcprefs:3;	/* 001: prefer temporary address +				srcprefs:3,	/* 001: prefer temporary address  						 * 010: prefer public address  						 * 100: prefer care-of address  						 */ +				dontfrag:1; +	__u8			min_hopcount;  	__u8			tclass; +	__u8			padding;  	__u32			dst_cookie; @@ -358,6 +368,7 @@ struct ipv6_pinfo {  	struct ipv6_txoptions	*opt;  	struct sk_buff		*pktoptions; +	struct sk_buff		*rxpmtu;  	struct {  		struct ipv6_txoptions *opt;  		u8 hop_limit; @@ -372,6 +383,7 @@ struct raw6_sock {  	__u32			checksum;	/* perform checksum */  	__u32			offset;		/* checksum offset  */  	struct icmp6_filter	filter; +	__u32			ip6mr_table;  	/* ipv6_pinfo has to be the last member of raw6_sock, see inet6_sk_generic */  	struct ipv6_pinfo	inet6;  }; diff --git a/include/linux/irq.h b/include/linux/irq.h index 451481c082b..c03243ad84b 100644 --- a/include/linux/irq.h +++ b/include/linux/irq.h @@ -90,7 +90,7 @@ struct msi_desc;   * @startup:		start up the interrupt (defaults to ->enable if NULL)   * @shutdown:		shut down the interrupt (defaults to ->disable if NULL)   * @enable:		enable the interrupt (defaults to chip->unmask if NULL) - * @disable:		disable the interrupt (defaults to chip->mask if NULL) + * @disable:		disable the interrupt   * @ack:		start of a new interrupt   * @mask:		mask an interrupt source   * @mask_ack:		ack and mask an interrupt source @@ -195,6 +195,7 @@ struct irq_desc {  	raw_spinlock_t		lock;  #ifdef CONFIG_SMP  	cpumask_var_t		affinity; +	const struct cpumask	*affinity_hint;  	unsigned int		node;  #ifdef CONFIG_GENERIC_PENDING_IRQ  	cpumask_var_t		pending_mask; @@ -400,7 +401,9 @@ static inline int irq_has_action(unsigned int irq)  /* Dynamic irq helper functions */  extern void dynamic_irq_init(unsigned int irq); +void dynamic_irq_init_keep_chip_data(unsigned int irq);  extern void dynamic_irq_cleanup(unsigned int irq); +void dynamic_irq_cleanup_keep_chip_data(unsigned int irq);  /* Set/get chip/data for an IRQ: */  extern int set_irq_chip(unsigned int irq, struct irq_chip *chip); diff --git a/include/linux/isapnp.h b/include/linux/isapnp.h index cd5a269fdb5..e2d28b026a8 100644 --- a/include/linux/isapnp.h +++ b/include/linux/isapnp.h @@ -43,10 +43,10 @@   */  #ifdef __KERNEL__ +#include <linux/mod_devicetable.h>  #define DEVICE_COUNT_COMPATIBLE 4 -#define ISAPNP_ANY_ID		0xffff  #define ISAPNP_CARD_DEVS	8  #define ISAPNP_CARD_ID(_va, _vb, _vc, _device) \ @@ -74,12 +74,6 @@ struct isapnp_card_id {  #define ISAPNP_DEVICE_SINGLE_END \  		.card_vendor = 0, .card_device = 0 -struct isapnp_device_id { -	unsigned short card_vendor, card_device; -	unsigned short vendor, function; -	unsigned long driver_data;	/* data private to the driver */ -}; -  #if defined(CONFIG_ISAPNP) || (defined(CONFIG_ISAPNP_MODULE) && defined(MODULE))  #define __ISAPNP__ diff --git a/include/linux/iscsi_ibft.h b/include/linux/iscsi_ibft.h index 6092487e295..d2e4042f8f5 100644 --- a/include/linux/iscsi_ibft.h +++ b/include/linux/iscsi_ibft.h @@ -42,9 +42,13 @@ extern struct ibft_table_header *ibft_addr;   * mapped address is set in the ibft_addr variable.   */  #ifdef CONFIG_ISCSI_IBFT_FIND -extern void __init reserve_ibft_region(void); +unsigned long find_ibft_region(unsigned long *sizep);  #else -static inline void reserve_ibft_region(void) { } +static inline unsigned long find_ibft_region(unsigned long *sizep) +{ +	*sizep = 0; +	return 0; +}  #endif  #endif /* ISCSI_IBFT_H */ diff --git a/include/linux/isdn/capilli.h b/include/linux/isdn/capilli.h index 7acb87a4487..11b57c48585 100644 --- a/include/linux/isdn/capilli.h +++ b/include/linux/isdn/capilli.h @@ -50,8 +50,7 @@ struct capi_ctr {  	u16  (*send_message)(struct capi_ctr *, struct sk_buff *skb);  	char *(*procinfo)(struct capi_ctr *); -	int (*ctr_read_proc)(char *page, char **start, off_t off, -			     int count, int *eof, struct capi_ctr *card); +	const struct file_operations *proc_fops;  	/* filled in before calling ready callback */  	u8 manu[CAPI_MANUFACTURER_LEN];		/* CAPI_GET_MANUFACTURER */ @@ -67,9 +66,10 @@ struct capi_ctr {  	unsigned long nsentdatapkt;  	int cnr;				/* controller number */ -	volatile unsigned short cardstate;	/* controller state */ -	volatile int blocked;			/* output blocked */ +	unsigned short state;			/* controller state */ +	int blocked;				/* output blocked */  	int traceflag;				/* capi trace */ +	wait_queue_head_t state_wait_queue;  	struct proc_dir_entry *procent;          char procfn[128]; diff --git a/include/linux/ivtvfb.h b/include/linux/ivtvfb.h index 9d88b29ddf5..e8b92f67f10 100644 --- a/include/linux/ivtvfb.h +++ b/include/linux/ivtvfb.h @@ -33,6 +33,5 @@ struct ivtvfb_dma_frame {  };  #define IVTVFB_IOC_DMA_FRAME 	_IOW('V', BASE_VIDIOC_PRIVATE+0, struct ivtvfb_dma_frame) -#define FBIO_WAITFORVSYNC	_IOW('F', 0x20, __u32)  #endif diff --git a/include/linux/jbd.h b/include/linux/jbd.h index 331530cd3cc..e06965081ba 100644 --- a/include/linux/jbd.h +++ b/include/linux/jbd.h @@ -31,6 +31,7 @@  #include <linux/mutex.h>  #include <linux/timer.h>  #include <linux/lockdep.h> +#include <linux/slab.h>  #define journal_oom_retry 1 @@ -246,19 +247,8 @@ typedef struct journal_superblock_s  #define J_ASSERT(assert)	BUG_ON(!(assert)) -#if defined(CONFIG_BUFFER_DEBUG) -void buffer_assertion_failure(struct buffer_head *bh); -#define J_ASSERT_BH(bh, expr)						\ -	do {								\ -		if (!(expr))						\ -			buffer_assertion_failure(bh);			\ -		J_ASSERT(expr);						\ -	} while (0) -#define J_ASSERT_JH(jh, expr)	J_ASSERT_BH(jh2bh(jh), expr) -#else  #define J_ASSERT_BH(bh, expr)	J_ASSERT(expr)  #define J_ASSERT_JH(jh, expr)	J_ASSERT(expr) -#endif  #if defined(JBD_PARANOID_IOFAIL)  #define J_EXPECT(expr, why...)		J_ASSERT(expr) @@ -437,9 +427,9 @@ struct transaction_s  	enum {  		T_RUNNING,  		T_LOCKED, -		T_RUNDOWN,  		T_FLUSH,  		T_COMMIT, +		T_COMMIT_RECORD,  		T_FINISHED  	}			t_state; @@ -1001,6 +991,7 @@ int journal_start_commit(journal_t *journal, tid_t *tid);  int journal_force_commit_nested(journal_t *journal);  int log_wait_commit(journal_t *journal, tid_t tid);  int log_do_checkpoint(journal_t *journal); +int journal_trans_will_send_data_barrier(journal_t *journal, tid_t tid);  void __log_wait_for_space(journal_t *journal);  extern void	__journal_drop_transaction(journal_t *, transaction_t *); diff --git a/include/linux/jbd2.h b/include/linux/jbd2.h index 638ce4554c7..a4d2e9f7088 100644 --- a/include/linux/jbd2.h +++ b/include/linux/jbd2.h @@ -30,6 +30,7 @@  #include <linux/bit_spinlock.h>  #include <linux/mutex.h>  #include <linux/timer.h> +#include <linux/slab.h>  #endif  #define journal_oom_retry 1 @@ -69,15 +70,8 @@ extern u8 jbd2_journal_enable_debug;  #define jbd_debug(f, a...)	/**/  #endif -static inline void *jbd2_alloc(size_t size, gfp_t flags) -{ -	return (void *)__get_free_pages(flags, get_order(size)); -} - -static inline void jbd2_free(void *ptr, size_t size) -{ -	free_pages((unsigned long)ptr, get_order(size)); -}; +extern void *jbd2_alloc(size_t size, gfp_t flags); +extern void jbd2_free(void *ptr, size_t size);  #define JBD2_MIN_JOURNAL_BLOCKS 1024 @@ -284,19 +278,8 @@ typedef struct journal_superblock_s  #define J_ASSERT(assert)	BUG_ON(!(assert)) -#if defined(CONFIG_BUFFER_DEBUG) -void buffer_assertion_failure(struct buffer_head *bh); -#define J_ASSERT_BH(bh, expr)						\ -	do {								\ -		if (!(expr))						\ -			buffer_assertion_failure(bh);			\ -		J_ASSERT(expr);						\ -	} while (0) -#define J_ASSERT_JH(jh, expr)	J_ASSERT_BH(jh2bh(jh), expr) -#else  #define J_ASSERT_BH(bh, expr)	J_ASSERT(expr)  #define J_ASSERT_JH(jh, expr)	J_ASSERT(expr) -#endif  #if defined(JBD2_PARANOID_IOFAIL)  #define J_EXPECT(expr, why...)		J_ASSERT(expr) diff --git a/include/linux/jffs2.h b/include/linux/jffs2.h index 2b32d638147..0874ab59ffe 100644 --- a/include/linux/jffs2.h +++ b/include/linux/jffs2.h @@ -215,8 +215,8 @@ union jffs2_node_union  /* Data payload for device nodes. */  union jffs2_device_node { -	jint16_t old; -	jint32_t new; +	jint16_t old_id; +	jint32_t new_id;  };  #endif /* __LINUX_JFFS2_H__ */ diff --git a/include/linux/joystick.h b/include/linux/joystick.h index 9e20c29c1e1..47199b13e0e 100644 --- a/include/linux/joystick.h +++ b/include/linux/joystick.h @@ -64,8 +64,8 @@ struct js_event {  #define JSIOCSCORR		_IOW('j', 0x21, struct js_corr)			/* set correction values */  #define JSIOCGCORR		_IOR('j', 0x22, struct js_corr)			/* get correction values */ -#define JSIOCSAXMAP		_IOW('j', 0x31, __u8[ABS_MAX + 1])		/* set axis mapping */ -#define JSIOCGAXMAP		_IOR('j', 0x32, __u8[ABS_MAX + 1])		/* get axis mapping */ +#define JSIOCSAXMAP		_IOW('j', 0x31, __u8[ABS_CNT])			/* set axis mapping */ +#define JSIOCGAXMAP		_IOR('j', 0x32, __u8[ABS_CNT])			/* get axis mapping */  #define JSIOCSBTNMAP		_IOW('j', 0x33, __u16[KEY_MAX - BTN_MISC + 1])	/* set button mapping */  #define JSIOCGBTNMAP		_IOR('j', 0x34, __u16[KEY_MAX - BTN_MISC + 1])	/* get button mapping */ diff --git a/include/linux/kbd_kern.h b/include/linux/kbd_kern.h index 8bdb16bfe5f..506ad20c18f 100644 --- a/include/linux/kbd_kern.h +++ b/include/linux/kbd_kern.h @@ -161,7 +161,4 @@ static inline void con_schedule_flip(struct tty_struct *t)  	schedule_delayed_work(&t->buf.work, 0);  } -/* mac_hid.c */ -extern int mac_hid_mouse_emulate_buttons(int, unsigned int, int); -  #endif diff --git a/include/linux/kdb.h b/include/linux/kdb.h new file mode 100644 index 00000000000..ccb2b3ec0fe --- /dev/null +++ b/include/linux/kdb.h @@ -0,0 +1,117 @@ +#ifndef _KDB_H +#define _KDB_H + +/* + * Kernel Debugger Architecture Independent Global Headers + * + * This file is subject to the terms and conditions of the GNU General Public + * License.  See the file "COPYING" in the main directory of this archive + * for more details. + * + * Copyright (c) 2000-2007 Silicon Graphics, Inc.  All Rights Reserved. + * Copyright (C) 2000 Stephane Eranian <eranian@hpl.hp.com> + * Copyright (C) 2009 Jason Wessel <jason.wessel@windriver.com> + */ + +#ifdef	CONFIG_KGDB_KDB +#include <linux/init.h> +#include <linux/sched.h> +#include <asm/atomic.h> + +#define KDB_POLL_FUNC_MAX	5 +extern int kdb_poll_idx; + +/* + * kdb_initial_cpu is initialized to -1, and is set to the cpu + * number whenever the kernel debugger is entered. + */ +extern int kdb_initial_cpu; +extern atomic_t kdb_event; + +/* + * kdb_diemsg + * + *	Contains a pointer to the last string supplied to the + *	kernel 'die' panic function. + */ +extern const char *kdb_diemsg; + +#define KDB_FLAG_EARLYKDB	(1 << 0) /* set from boot parameter kdb=early */ +#define KDB_FLAG_CATASTROPHIC	(1 << 1) /* A catastrophic event has occurred */ +#define KDB_FLAG_CMD_INTERRUPT	(1 << 2) /* Previous command was interrupted */ +#define KDB_FLAG_NOIPI		(1 << 3) /* Do not send IPIs */ +#define KDB_FLAG_ONLY_DO_DUMP	(1 << 4) /* Only do a dump, used when +					  * kdb is off */ +#define KDB_FLAG_NO_CONSOLE	(1 << 5) /* No console is available, +					  * kdb is disabled */ +#define KDB_FLAG_NO_VT_CONSOLE	(1 << 6) /* No VT console is available, do +					  * not use keyboard */ +#define KDB_FLAG_NO_I8042	(1 << 7) /* No i8042 chip is available, do +					  * not use keyboard */ + +extern int kdb_flags;	/* Global flags, see kdb_state for per cpu state */ + +extern void kdb_save_flags(void); +extern void kdb_restore_flags(void); + +#define KDB_FLAG(flag)		(kdb_flags & KDB_FLAG_##flag) +#define KDB_FLAG_SET(flag)	((void)(kdb_flags |= KDB_FLAG_##flag)) +#define KDB_FLAG_CLEAR(flag)	((void)(kdb_flags &= ~KDB_FLAG_##flag)) + +/* + * External entry point for the kernel debugger.  The pt_regs + * at the time of entry are supplied along with the reason for + * entry to the kernel debugger. + */ + +typedef enum { +	KDB_REASON_ENTER = 1,	/* KDB_ENTER() trap/fault - regs valid */ +	KDB_REASON_ENTER_SLAVE,	/* KDB_ENTER_SLAVE() trap/fault - regs valid */ +	KDB_REASON_BREAK,	/* Breakpoint inst. - regs valid */ +	KDB_REASON_DEBUG,	/* Debug Fault - regs valid */ +	KDB_REASON_OOPS,	/* Kernel Oops - regs valid */ +	KDB_REASON_SWITCH,	/* CPU switch - regs valid*/ +	KDB_REASON_KEYBOARD,	/* Keyboard entry - regs valid */ +	KDB_REASON_NMI,		/* Non-maskable interrupt; regs valid */ +	KDB_REASON_RECURSE,	/* Recursive entry to kdb; +				 * regs probably valid */ +	KDB_REASON_SSTEP,	/* Single Step trap. - regs valid */ +} kdb_reason_t; + +extern int kdb_trap_printk; +extern int vkdb_printf(const char *fmt, va_list args) +	    __attribute__ ((format (printf, 1, 0))); +extern int kdb_printf(const char *, ...) +	    __attribute__ ((format (printf, 1, 2))); +typedef int (*kdb_printf_t)(const char *, ...) +	     __attribute__ ((format (printf, 1, 2))); + +extern void kdb_init(int level); + +/* Access to kdb specific polling devices */ +typedef int (*get_char_func)(void); +extern get_char_func kdb_poll_funcs[]; +extern int kdb_get_kbd_char(void); + +static inline +int kdb_process_cpu(const struct task_struct *p) +{ +	unsigned int cpu = task_thread_info(p)->cpu; +	if (cpu > num_possible_cpus()) +		cpu = 0; +	return cpu; +} + +/* kdb access to register set for stack dumping */ +extern struct pt_regs *kdb_current_regs; + +#else /* ! CONFIG_KGDB_KDB */ +#define kdb_printf(...) +#define kdb_init(x) +#endif	/* CONFIG_KGDB_KDB */ +enum { +	KDB_NOT_INITIALIZED, +	KDB_INIT_EARLY, +	KDB_INIT_FULL, +}; +#endif	/* !_KDB_H */ diff --git a/include/linux/kernel.h b/include/linux/kernel.h index 328bca609b9..8317ec4b9f3 100644 --- a/include/linux/kernel.h +++ b/include/linux/kernel.h @@ -4,6 +4,8 @@  /*   * 'kernel.h' contains some often-used function prototypes etc   */ +#define __ALIGN_KERNEL(x, a)		__ALIGN_KERNEL_MASK(x, (typeof(x))(a) - 1) +#define __ALIGN_KERNEL_MASK(x, mask)	(((x) + (mask)) & ~(mask))  #ifdef __KERNEL__ @@ -22,9 +24,9 @@  extern const char linux_banner[];  extern const char linux_proc_banner[]; -#define USHORT_MAX	((u16)(~0U)) -#define SHORT_MAX	((s16)(USHORT_MAX>>1)) -#define SHORT_MIN	(-SHORT_MAX - 1) +#define USHRT_MAX	((u16)(~0U)) +#define SHRT_MAX	((s16)(USHRT_MAX>>1)) +#define SHRT_MIN	((s16)(-SHRT_MAX - 1))  #define INT_MAX		((int)(~0U>>1))  #define INT_MIN		(-INT_MAX - 1)  #define UINT_MAX	(~0U) @@ -37,13 +39,23 @@ extern const char linux_proc_banner[];  #define STACK_MAGIC	0xdeadbeef -#define ALIGN(x,a)		__ALIGN_MASK(x,(typeof(x))(a)-1) -#define __ALIGN_MASK(x,mask)	(((x)+(mask))&~(mask)) +#define ALIGN(x, a)		__ALIGN_KERNEL((x), (a)) +#define __ALIGN_MASK(x, mask)	__ALIGN_KERNEL_MASK((x), (mask))  #define PTR_ALIGN(p, a)		((typeof(p))ALIGN((unsigned long)(p), (a)))  #define IS_ALIGNED(x, a)		(((x) & ((typeof(x))(a) - 1)) == 0)  #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]) + __must_be_array(arr)) +/* + * This looks more complex than it should be. But we need to + * get the type for the ~ right in round_down (it needs to be + * as wide as the result!), and we want to evaluate the macro + * arguments just once each. + */ +#define __round_mask(x, y) ((__typeof__(x))((y)-1)) +#define round_up(x, y) ((((x)-1) | __round_mask(x, y))+1) +#define round_down(x, y) ((x) & ~__round_mask(x, y)) +  #define FIELD_SIZEOF(t, f) (sizeof(((t*)0)->f))  #define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d))  #define roundup(x, y) ((((x) + ((y) - 1)) / (y)) * (y)) @@ -124,7 +136,7 @@ extern int _cond_resched(void);  #endif  #ifdef CONFIG_DEBUG_SPINLOCK_SLEEP -  void __might_sleep(char *file, int line, int preempt_offset); +  void __might_sleep(const char *file, int line, int preempt_offset);  /**   * might_sleep - annotation for functions that can sleep   * @@ -138,7 +150,8 @@ extern int _cond_resched(void);  # define might_sleep() \  	do { __might_sleep(__FILE__, __LINE__, 0); might_resched(); } while (0)  #else -  static inline void __might_sleep(char *file, int line, int preempt_offset) { } +  static inline void __might_sleep(const char *file, int line, +				   int preempt_offset) { }  # define might_sleep() do { might_resched(); } while (0)  #endif @@ -333,6 +346,7 @@ extern enum system_states {  #define TAINT_OVERRIDDEN_ACPI_TABLE	8  #define TAINT_WARN			9  #define TAINT_CRAP			10 +#define TAINT_FIRMWARE_WORKAROUND	11  extern void dump_stack(void) __cold; @@ -361,6 +375,8 @@ static inline char *pack_hex_byte(char *buf, u8 byte)  	return buf;  } +extern int hex_to_bin(char ch); +  #ifndef pr_fmt  #define pr_fmt(fmt) fmt  #endif @@ -375,6 +391,7 @@ static inline char *pack_hex_byte(char *buf, u8 byte)          printk(KERN_ERR pr_fmt(fmt), ##__VA_ARGS__)  #define pr_warning(fmt, ...) \          printk(KERN_WARNING pr_fmt(fmt), ##__VA_ARGS__) +#define pr_warn pr_warning  #define pr_notice(fmt, ...) \          printk(KERN_NOTICE pr_fmt(fmt), ##__VA_ARGS__)  #define pr_info(fmt, ...) \ @@ -409,14 +426,13 @@ static inline char *pack_hex_byte(char *buf, u8 byte)   * no local ratelimit_state used in the !PRINTK case   */  #ifdef CONFIG_PRINTK -#define printk_ratelimited(fmt, ...)  ({		\ -	static struct ratelimit_state _rs = {		\ -		.interval = DEFAULT_RATELIMIT_INTERVAL, \ -		.burst = DEFAULT_RATELIMIT_BURST,       \ -	};                                              \ -							\ -	if (!__ratelimit(&_rs))                         \ -		printk(fmt, ##__VA_ARGS__);		\ +#define printk_ratelimited(fmt, ...)  ({				\ +	static DEFINE_RATELIMIT_STATE(_rs,				\ +				      DEFAULT_RATELIMIT_INTERVAL,	\ +				      DEFAULT_RATELIMIT_BURST);		\ +									\ +	if (__ratelimit(&_rs))						\ +		printk(fmt, ##__VA_ARGS__);				\  })  #else  /* No effect, but we still get type checking even in the !PRINTK case: */ @@ -433,6 +449,7 @@ static inline char *pack_hex_byte(char *buf, u8 byte)  	printk_ratelimited(KERN_ERR pr_fmt(fmt), ##__VA_ARGS__)  #define pr_warning_ratelimited(fmt, ...) \  	printk_ratelimited(KERN_WARNING pr_fmt(fmt), ##__VA_ARGS__) +#define pr_warn_ratelimited pr_warning_ratelimited  #define pr_notice_ratelimited(fmt, ...) \  	printk_ratelimited(KERN_NOTICE pr_fmt(fmt), ##__VA_ARGS__)  #define pr_info_ratelimited(fmt, ...) \ @@ -479,6 +496,13 @@ static inline void tracing_off(void) { }  static inline void tracing_off_permanent(void) { }  static inline int tracing_is_on(void) { return 0; }  #endif + +enum ftrace_dump_mode { +	DUMP_NONE, +	DUMP_ALL, +	DUMP_ORIG, +}; +  #ifdef CONFIG_TRACING  extern void tracing_start(void);  extern void tracing_stop(void); @@ -560,7 +584,7 @@ __ftrace_vbprintk(unsigned long ip, const char *fmt, va_list ap);  extern int  __ftrace_vprintk(unsigned long ip, const char *fmt, va_list ap); -extern void ftrace_dump(void); +extern void ftrace_dump(enum ftrace_dump_mode oops_dump_mode);  #else  static inline void  ftrace_special(unsigned long arg1, unsigned long arg2, unsigned long arg3) { } @@ -581,7 +605,7 @@ ftrace_vprintk(const char *fmt, va_list ap)  {  	return 0;  } -static inline void ftrace_dump(void) { } +static inline void ftrace_dump(enum ftrace_dump_mode oops_dump_mode) { }  #endif /* CONFIG_TRACING */  /* diff --git a/include/linux/kernelcapi.h b/include/linux/kernelcapi.h index a53e932f80f..9c2683929fd 100644 --- a/include/linux/kernelcapi.h +++ b/include/linux/kernelcapi.h @@ -48,9 +48,7 @@ typedef struct kcapi_carddef {  #include <linux/list.h>  #include <linux/skbuff.h>  #include <linux/workqueue.h> - -#define	KCI_CONTRUP	0	/* arg: struct capi_profile */ -#define	KCI_CONTRDOWN	1	/* arg: NULL */ +#include <linux/notifier.h>  struct capi20_appl {  	u16 applid; @@ -67,11 +65,6 @@ struct capi20_appl {  	struct sk_buff_head recv_queue;  	struct work_struct recv_work;  	int release_in_progress; - -	/* ugly hack to allow for notification of added/removed -	 * controllers. The Right Way (tm) is known. XXX -	 */ -	void (*callback) (unsigned int cmd, __u32 contr, void *data);  };  u16 capi20_isinstalled(void); @@ -84,11 +77,11 @@ u16 capi20_get_serial(u32 contr, u8 serial[CAPI_SERIAL_LEN]);  u16 capi20_get_profile(u32 contr, struct capi_profile *profp);  int capi20_manufacturer(unsigned int cmd, void __user *data); -/* temporary hack XXX */ -void capi20_set_callback(struct capi20_appl *ap,  -			 void (*callback) (unsigned int cmd, __u32 contr, void *data)); - +#define CAPICTR_UP			0 +#define CAPICTR_DOWN			1 +int register_capictr_notifier(struct notifier_block *nb); +int unregister_capictr_notifier(struct notifier_block *nb);  #define CAPI_NOERROR                      0x0000 diff --git a/include/linux/kexec.h b/include/linux/kexec.h index c356b6914ff..03e8e8dbc57 100644 --- a/include/linux/kexec.h +++ b/include/linux/kexec.h @@ -199,7 +199,7 @@ extern struct kimage *kexec_crash_image;   */  extern struct resource crashk_res;  typedef u32 note_buf_t[KEXEC_NOTE_BYTES/4]; -extern note_buf_t *crash_notes; +extern note_buf_t __percpu *crash_notes;  extern u32 vmcoreinfo_note[VMCOREINFO_NOTE_SIZE/4];  extern size_t vmcoreinfo_size;  extern size_t vmcoreinfo_max_size; diff --git a/include/linux/kfifo.h b/include/linux/kfifo.h index 6f6c5f300af..9fad0527344 100644 --- a/include/linux/kfifo.h +++ b/include/linux/kfifo.h @@ -86,7 +86,8 @@ union { \   */  #define INIT_KFIFO(name) \  	name = __kfifo_initializer(sizeof(name##kfifo_buffer) - \ -				sizeof(struct kfifo), name##kfifo_buffer) +				sizeof(struct kfifo), \ +				name##kfifo_buffer + sizeof(struct kfifo))  /**   * DEFINE_KFIFO - macro to define and initialize a kfifo @@ -102,8 +103,6 @@ union { \  	unsigned char name##kfifo_buffer[size]; \  	struct kfifo name = __kfifo_initializer(size, name##kfifo_buffer) -#undef __kfifo_initializer -  extern void kfifo_init(struct kfifo *fifo, void *buffer,  			unsigned int size);  extern __must_check int kfifo_alloc(struct kfifo *fifo, unsigned int size, @@ -124,7 +123,7 @@ extern __must_check unsigned int kfifo_out_peek(struct kfifo *fifo,   */  static inline bool kfifo_initialized(struct kfifo *fifo)  { -	return fifo->buffer != 0; +	return fifo->buffer != NULL;  }  /** @@ -202,7 +201,7 @@ static inline __must_check unsigned int kfifo_avail(struct kfifo *fifo)   * @n: the length of the data to be added.   * @lock: pointer to the spinlock to use for locking.   * - * This function copies at most @len bytes from the @from buffer into + * This function copies at most @n bytes from the @from buffer into   * the FIFO depending on the free space, and returns the number of   * bytes copied.   */ @@ -228,7 +227,7 @@ static inline unsigned int kfifo_in_locked(struct kfifo *fifo,   * @n: the size of the destination buffer.   * @lock: pointer to the spinlock to use for locking.   * - * This function copies at most @len bytes from the FIFO into the + * This function copies at most @n bytes from the FIFO into the   * @to buffer and returns the number of copied bytes.   */  static inline __must_check unsigned int kfifo_out_locked(struct kfifo *fifo, diff --git a/include/linux/kgdb.h b/include/linux/kgdb.h index 19ec41a183f..9340f34d1bb 100644 --- a/include/linux/kgdb.h +++ b/include/linux/kgdb.h @@ -16,10 +16,12 @@  #include <linux/serial_8250.h>  #include <linux/linkage.h>  #include <linux/init.h> -  #include <asm/atomic.h> +#ifdef CONFIG_HAVE_ARCH_KGDB  #include <asm/kgdb.h> +#endif +#ifdef CONFIG_KGDB  struct pt_regs;  /** @@ -34,20 +36,6 @@ struct pt_regs;  extern int kgdb_skipexception(int exception, struct pt_regs *regs);  /** - *	kgdb_post_primary_code - (optional) Save error vector/code numbers. - *	@regs: Original pt_regs. - *	@e_vector: Original error vector. - *	@err_code: Original error code. - * - *	This is usually needed on architectures which support SMP and - *	KGDB.  This function is called after all the secondary cpus have - *	been put to a know spin state and the primary CPU has control over - *	KGDB. - */ -extern void kgdb_post_primary_code(struct pt_regs *regs, int e_vector, -				  int err_code); - -/**   *	kgdb_disable_hw_debug - (optional) Disable hardware debugging hook   *	@regs: Current &struct pt_regs.   * @@ -72,6 +60,7 @@ struct uart_port;  void kgdb_breakpoint(void);  extern int kgdb_connected; +extern int kgdb_io_module_registered;  extern atomic_t			kgdb_setting_breakpoint;  extern atomic_t			kgdb_cpu_doing_single_step; @@ -202,12 +191,34 @@ kgdb_arch_handle_exception(int vector, int signo, int err_code,   */  extern void kgdb_roundup_cpus(unsigned long flags); +/** + *	kgdb_arch_set_pc - Generic call back to the program counter + *	@regs: Current &struct pt_regs. + *  @pc: The new value for the program counter + * + *	This function handles updating the program counter and requires an + *	architecture specific implementation. + */ +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);  /** + *	kgdb_arch_late - Perform any architecture specific initalization. + * + *	This function will handle the late initalization of any + *	architecture specific callbacks.  This is an optional function for + *	handling things like late initialization of hw breakpoints.  The + *	default implementation does nothing. + */ +extern void kgdb_arch_late(void); + + +/**   * struct kgdb_arch - Describe architecture specific values.   * @gdb_bpt_instr: The instruction to trigger a breakpoint.   * @flags: Flags for the breakpoint, currently just %KGDB_HW_BREAKPOINT. @@ -247,6 +258,8 @@ struct kgdb_arch {   * the I/O driver.   * @post_exception: Pointer to a function that will do any cleanup work   * for the I/O driver. + * @is_console: 1 if the end device is a console 0 if the I/O device is + * not a console   */  struct kgdb_io {  	const char		*name; @@ -256,6 +269,7 @@ struct kgdb_io {  	int			(*init) (void);  	void			(*pre_exception) (void);  	void			(*post_exception) (void); +	int			is_console;  };  extern struct kgdb_arch		arch_kgdb_ops; @@ -264,12 +278,14 @@ extern unsigned long __weak kgdb_arch_pc(int exception, struct pt_regs *regs);  extern int kgdb_register_io_module(struct kgdb_io *local_kgdb_io_ops);  extern void kgdb_unregister_io_module(struct kgdb_io *local_kgdb_io_ops); +extern struct kgdb_io *dbg_io_ops;  extern int kgdb_hex2long(char **ptr, unsigned long *long_val);  extern int kgdb_mem2hex(char *mem, char *buf, int count);  extern int kgdb_hex2mem(char *buf, char *mem, int count);  extern int kgdb_isremovedbreak(unsigned long addr); +extern void kgdb_schedule_breakpoint(void);  extern int  kgdb_handle_exception(int ex_vector, int signo, int err_code, @@ -278,5 +294,12 @@ extern int kgdb_nmicallback(int cpu, void *regs);  extern int			kgdb_single_step;  extern atomic_t			kgdb_active; - +#define in_dbg_master() \ +	(raw_smp_processor_id() == atomic_read(&kgdb_active)) +extern bool dbg_is_early; +extern void __init dbg_late_init(void); +#else /* ! CONFIG_KGDB */ +#define in_dbg_master() (0) +#define dbg_late_init() +#endif /* ! CONFIG_KGDB */  #endif /* _KGDB_H_ */ diff --git a/include/linux/kmod.h b/include/linux/kmod.h index 384ca8bbf1a..6efd7a78de6 100644 --- a/include/linux/kmod.h +++ b/include/linux/kmod.h @@ -23,10 +23,12 @@  #include <linux/stddef.h>  #include <linux/errno.h>  #include <linux/compiler.h> +#include <linux/workqueue.h>  #define KMOD_PATH_LEN 256  #ifdef CONFIG_MODULES +extern char modprobe_path[]; /* for sysctl */  /* modprobe exit status on success, -ve on error.  Return value   * usually useless though. */  extern int __request_module(bool wait, const char *name, ...) \ @@ -44,19 +46,6 @@ static inline int request_module_nowait(const char *name, ...) { return -ENOSYS;  struct key;  struct file; -struct subprocess_info; - -/* Allocate a subprocess_info structure */ -struct subprocess_info *call_usermodehelper_setup(char *path, char **argv, -						  char **envp, gfp_t gfp_mask); - -/* Set various pieces of state into the subprocess_info structure */ -void call_usermodehelper_setkeys(struct subprocess_info *info, -				 struct key *session_keyring); -int call_usermodehelper_stdinpipe(struct subprocess_info *sub_info, -				  struct file **filp); -void call_usermodehelper_setcleanup(struct subprocess_info *info, -				    void (*cleanup)(char **argv, char **envp));  enum umh_wait {  	UMH_NO_WAIT = -1,	/* don't wait at all */ @@ -64,6 +53,29 @@ enum umh_wait {  	UMH_WAIT_PROC = 1,	/* wait for the process to complete */  }; +struct subprocess_info { +	struct work_struct work; +	struct completion *complete; +	char *path; +	char **argv; +	char **envp; +	enum umh_wait wait; +	int retval; +	int (*init)(struct subprocess_info *info); +	void (*cleanup)(struct subprocess_info *info); +	void *data; +}; + +/* Allocate a subprocess_info structure */ +struct subprocess_info *call_usermodehelper_setup(char *path, char **argv, +						  char **envp, gfp_t gfp_mask); + +/* Set various pieces of state into the subprocess_info structure */ +void call_usermodehelper_setfns(struct subprocess_info *info, +		    int (*init)(struct subprocess_info *info), +		    void (*cleanup)(struct subprocess_info *info), +		    void *data); +  /* Actually execute the sub-process */  int call_usermodehelper_exec(struct subprocess_info *info, enum umh_wait wait); @@ -72,38 +84,33 @@ int call_usermodehelper_exec(struct subprocess_info *info, enum umh_wait wait);  void call_usermodehelper_freeinfo(struct subprocess_info *info);  static inline int -call_usermodehelper(char *path, char **argv, char **envp, enum umh_wait wait) +call_usermodehelper_fns(char *path, char **argv, char **envp, +			enum umh_wait wait, +			int (*init)(struct subprocess_info *info), +			void (*cleanup)(struct subprocess_info *), void *data)  {  	struct subprocess_info *info;  	gfp_t gfp_mask = (wait == UMH_NO_WAIT) ? GFP_ATOMIC : GFP_KERNEL;  	info = call_usermodehelper_setup(path, argv, envp, gfp_mask); +  	if (info == NULL)  		return -ENOMEM; + +	call_usermodehelper_setfns(info, init, cleanup, data); +  	return call_usermodehelper_exec(info, wait);  }  static inline int -call_usermodehelper_keys(char *path, char **argv, char **envp, -			 struct key *session_keyring, enum umh_wait wait) +call_usermodehelper(char *path, char **argv, char **envp, enum umh_wait wait)  { -	struct subprocess_info *info; -	gfp_t gfp_mask = (wait == UMH_NO_WAIT) ? GFP_ATOMIC : GFP_KERNEL; - -	info = call_usermodehelper_setup(path, argv, envp, gfp_mask); -	if (info == NULL) -		return -ENOMEM; - -	call_usermodehelper_setkeys(info, session_keyring); -	return call_usermodehelper_exec(info, wait); +	return call_usermodehelper_fns(path, argv, envp, wait, +				       NULL, NULL, NULL);  }  extern void usermodehelper_init(void); -struct file; -extern int call_usermodehelper_pipe(char *path, char *argv[], char *envp[], -				    struct file **filp); -  extern int usermodehelper_disable(void);  extern void usermodehelper_enable(void); diff --git a/include/linux/kobj_map.h b/include/linux/kobj_map.h index 73717ed9ea7..18ca75ffcc5 100644 --- a/include/linux/kobj_map.h +++ b/include/linux/kobj_map.h @@ -1,3 +1,10 @@ +/* + * kobj_map.h + */ + +#ifndef _KOBJ_MAP_H_ +#define _KOBJ_MAP_H_ +  #include <linux/mutex.h>  typedef struct kobject *kobj_probe_t(dev_t, int *, void *); @@ -8,3 +15,5 @@ int kobj_map(struct kobj_map *, dev_t, unsigned long, struct module *,  void kobj_unmap(struct kobj_map *, dev_t, unsigned long);  struct kobject *kobj_lookup(struct kobj_map *, dev_t, int *);  struct kobj_map *kobj_map_init(kobj_probe_t *, struct mutex *); + +#endif /* _KOBJ_MAP_H_ */ diff --git a/include/linux/kobject.h b/include/linux/kobject.h index 58ae8e00fcd..cf343a85253 100644 --- a/include/linux/kobject.h +++ b/include/linux/kobject.h @@ -106,8 +106,10 @@ extern char *kobject_get_path(struct kobject *kobj, gfp_t flag);  struct kobj_type {  	void (*release)(struct kobject *kobj); -	struct sysfs_ops *sysfs_ops; +	const struct sysfs_ops *sysfs_ops;  	struct attribute **default_attrs; +	const struct kobj_ns_type_operations *(*child_ns_type)(struct kobject *kobj); +	const void *(*namespace)(struct kobject *kobj);  };  struct kobj_uevent_env { @@ -118,9 +120,9 @@ struct kobj_uevent_env {  };  struct kset_uevent_ops { -	int (*filter)(struct kset *kset, struct kobject *kobj); -	const char *(*name)(struct kset *kset, struct kobject *kobj); -	int (*uevent)(struct kset *kset, struct kobject *kobj, +	int (* const filter)(struct kset *kset, struct kobject *kobj); +	const char *(* const name)(struct kset *kset, struct kobject *kobj); +	int (* const uevent)(struct kset *kset, struct kobject *kobj,  		      struct kobj_uevent_env *env);  }; @@ -132,7 +134,43 @@ struct kobj_attribute {  			 const char *buf, size_t count);  }; -extern struct sysfs_ops kobj_sysfs_ops; +extern const struct sysfs_ops kobj_sysfs_ops; + +/* + * Namespace types which are used to tag kobjects and sysfs entries. + * Network namespace will likely be the first. + */ +enum kobj_ns_type { +	KOBJ_NS_TYPE_NONE = 0, +	KOBJ_NS_TYPE_NET, +	KOBJ_NS_TYPES +}; + +struct sock; + +/* + * Callbacks so sysfs can determine namespaces + *   @current_ns: return calling task's namespace + *   @netlink_ns: return namespace to which a sock belongs (right?) + *   @initial_ns: return the initial namespace (i.e. init_net_ns) + */ +struct kobj_ns_type_operations { +	enum kobj_ns_type type; +	const void *(*current_ns)(void); +	const void *(*netlink_ns)(struct sock *sk); +	const void *(*initial_ns)(void); +}; + +int kobj_ns_type_register(const struct kobj_ns_type_operations *ops); +int kobj_ns_type_registered(enum kobj_ns_type type); +const struct kobj_ns_type_operations *kobj_child_ns_ops(struct kobject *parent); +const struct kobj_ns_type_operations *kobj_ns_ops(struct kobject *kobj); + +const void *kobj_ns_current(enum kobj_ns_type type); +const void *kobj_ns_netlink(enum kobj_ns_type type, struct sock *sk); +const void *kobj_ns_initial(enum kobj_ns_type type); +void kobj_ns_exit(enum kobj_ns_type type, const void *ns); +  /**   * struct kset - a set of kobjects of a specific type, belonging to a specific subsystem. @@ -155,14 +193,14 @@ struct kset {  	struct list_head list;  	spinlock_t list_lock;  	struct kobject kobj; -	struct kset_uevent_ops *uevent_ops; +	const struct kset_uevent_ops *uevent_ops;  };  extern void kset_init(struct kset *kset);  extern int __must_check kset_register(struct kset *kset);  extern void kset_unregister(struct kset *kset);  extern struct kset * __must_check kset_create_and_add(const char *name, -						struct kset_uevent_ops *u, +						const struct kset_uevent_ops *u,  						struct kobject *parent_kobj);  static inline struct kset *to_kset(struct kobject *kobj) diff --git a/include/linux/kprobes.h b/include/linux/kprobes.h index 1b672f74a32..e7d1b2e0070 100644 --- a/include/linux/kprobes.h +++ b/include/linux/kprobes.h @@ -122,6 +122,11 @@ struct kprobe {  /* Kprobe status flags */  #define KPROBE_FLAG_GONE	1 /* breakpoint has already gone */  #define KPROBE_FLAG_DISABLED	2 /* probe is temporarily disabled */ +#define KPROBE_FLAG_OPTIMIZED	4 /* +				   * probe is really optimized. +				   * NOTE: +				   * this flag is only for optimized_kprobe. +				   */  /* Has this kprobe gone ? */  static inline int kprobe_gone(struct kprobe *p) @@ -134,6 +139,12 @@ static inline int kprobe_disabled(struct kprobe *p)  {  	return p->flags & (KPROBE_FLAG_DISABLED | KPROBE_FLAG_GONE);  } + +/* Is this kprobe really running optimized path ? */ +static inline int kprobe_optimized(struct kprobe *p) +{ +	return p->flags & KPROBE_FLAG_OPTIMIZED; +}  /*   * Special probe type that uses setjmp-longjmp type tricks to resume   * execution at a specified entry with a matching prototype corresponding @@ -249,6 +260,39 @@ extern kprobe_opcode_t *get_insn_slot(void);  extern void free_insn_slot(kprobe_opcode_t *slot, int dirty);  extern void kprobes_inc_nmissed_count(struct kprobe *p); +#ifdef CONFIG_OPTPROBES +/* + * Internal structure for direct jump optimized probe + */ +struct optimized_kprobe { +	struct kprobe kp; +	struct list_head list;	/* list for optimizing queue */ +	struct arch_optimized_insn optinsn; +}; + +/* Architecture dependent functions for direct jump optimization */ +extern int arch_prepared_optinsn(struct arch_optimized_insn *optinsn); +extern int arch_check_optimized_kprobe(struct optimized_kprobe *op); +extern int arch_prepare_optimized_kprobe(struct optimized_kprobe *op); +extern void arch_remove_optimized_kprobe(struct optimized_kprobe *op); +extern int  arch_optimize_kprobe(struct optimized_kprobe *op); +extern void arch_unoptimize_kprobe(struct optimized_kprobe *op); +extern kprobe_opcode_t *get_optinsn_slot(void); +extern void free_optinsn_slot(kprobe_opcode_t *slot, int dirty); +extern int arch_within_optimized_kprobe(struct optimized_kprobe *op, +					unsigned long addr); + +extern void opt_pre_handler(struct kprobe *p, struct pt_regs *regs); + +#ifdef CONFIG_SYSCTL +extern int sysctl_kprobes_optimization; +extern int proc_kprobes_optimization_handler(struct ctl_table *table, +					     int write, void __user *buffer, +					     size_t *length, loff_t *ppos); +#endif + +#endif /* CONFIG_OPTPROBES */ +  /* Get the kprobe at this addr (if any) - called with preemption disabled */  struct kprobe *get_kprobe(void *addr);  void kretprobe_hash_lock(struct task_struct *tsk, diff --git a/include/linux/kref.h b/include/linux/kref.h index b0cb0ebad9e..6cc38fc07ab 100644 --- a/include/linux/kref.h +++ b/include/linux/kref.h @@ -1,5 +1,5 @@  /* - * kref.c - library routines for handling generic reference counted objects + * kref.h - library routines for handling generic reference counted objects   *   * Copyright (C) 2004 Greg Kroah-Hartman <greg@kroah.com>   * Copyright (C) 2004 IBM Corp. @@ -21,7 +21,6 @@ struct kref {  	atomic_t refcount;  }; -void kref_set(struct kref *kref, int num);  void kref_init(struct kref *kref);  void kref_get(struct kref *kref);  int kref_put(struct kref *kref, void (*release) (struct kref *kref)); diff --git a/include/linux/ks8842.h b/include/linux/ks8842.h new file mode 100644 index 00000000000..da0341b8ca0 --- /dev/null +++ b/include/linux/ks8842.h @@ -0,0 +1,34 @@ +/* + * ks8842.h KS8842 platform data struct definition + * Copyright (c) 2010 Intel Corporation + * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#ifndef _LINUX_KS8842_H +#define _LINUX_KS8842_H + +#include <linux/if_ether.h> + +/** + * struct ks8842_platform_data - Platform data of the KS8842 network driver + * @macaddr:	The MAC address of the device, set to all 0:s to use the on in + *		the chip. + * + */ +struct ks8842_platform_data { +	u8 macaddr[ETH_ALEN]; +}; + +#endif diff --git a/include/linux/ktime.h b/include/linux/ktime.h index ce5983225be..e1ceaa9b36b 100644 --- a/include/linux/ktime.h +++ b/include/linux/ktime.h @@ -130,7 +130,7 @@ static inline ktime_t timeval_to_ktime(struct timeval tv)  /* Convert ktime_t to nanoseconds - NOP in the scalar storage format: */  #define ktime_to_ns(kt)			((kt).tv64) -#else +#else	/* !((BITS_PER_LONG == 64) || defined(CONFIG_KTIME_SCALAR)) */  /*   * Helper macros/inlines to get the ktime_t math right in the timespec @@ -275,7 +275,7 @@ static inline s64 ktime_to_ns(const ktime_t kt)  	return (s64) kt.tv.sec * NSEC_PER_SEC + kt.tv.nsec;  } -#endif +#endif	/* !((BITS_PER_LONG == 64) || defined(CONFIG_KTIME_SCALAR)) */  /**   * ktime_equal - Compares two ktime_t variables to see if they are equal @@ -295,6 +295,12 @@ static inline s64 ktime_to_us(const ktime_t kt)  	return (s64) tv.tv_sec * USEC_PER_SEC + tv.tv_usec;  } +static inline s64 ktime_to_ms(const ktime_t kt) +{ +	struct timeval tv = ktime_to_timeval(kt); +	return (s64) tv.tv_sec * MSEC_PER_SEC + tv.tv_usec / USEC_PER_MSEC; +} +  static inline s64 ktime_us_delta(const ktime_t later, const ktime_t earlier)  {         return ktime_to_us(ktime_sub(later, earlier)); diff --git a/include/linux/kvm.h b/include/linux/kvm.h index a24de0b1858..23ea0225390 100644 --- a/include/linux/kvm.h +++ b/include/linux/kvm.h @@ -103,7 +103,7 @@ struct kvm_userspace_memory_region {  /* for kvm_memory_region::flags */  #define KVM_MEM_LOG_DIRTY_PAGES  1UL - +#define KVM_MEMSLOT_INVALID      (1UL << 1)  /* for KVM_IRQ_LINE */  struct kvm_irq_level { @@ -160,6 +160,7 @@ struct kvm_pit_config {  #define KVM_EXIT_DCR              15  #define KVM_EXIT_NMI              16  #define KVM_EXIT_INTERNAL_ERROR   17 +#define KVM_EXIT_OSI              18  /* For KVM_EXIT_INTERNAL_ERROR */  #define KVM_INTERNAL_ERROR_EMULATION 1 @@ -259,6 +260,10 @@ struct kvm_run {  			__u32 ndata;  			__u64 data[16];  		} internal; +		/* KVM_EXIT_OSI */ +		struct { +			__u64 gprs[32]; +		} osi;  		/* Fix the size of the union. */  		char padding[256];  	}; @@ -400,6 +405,15 @@ struct kvm_ioeventfd {  	__u8  pad[36];  }; +/* for KVM_ENABLE_CAP */ +struct kvm_enable_cap { +	/* in */ +	__u32 cap; +	__u32 flags; +	__u64 args[4]; +	__u8  pad[64]; +}; +  #define KVMIO 0xAE  /* @@ -497,6 +511,19 @@ struct kvm_ioeventfd {  #endif  #define KVM_CAP_S390_PSW 42  #define KVM_CAP_PPC_SEGSTATE 43 +#define KVM_CAP_HYPERV 44 +#define KVM_CAP_HYPERV_VAPIC 45 +#define KVM_CAP_HYPERV_SPIN 46 +#define KVM_CAP_PCI_SEGMENT 47 +#define KVM_CAP_PPC_PAIRED_SINGLES 48 +#define KVM_CAP_INTR_SHADOW 49 +#ifdef __KVM_HAVE_DEBUGREGS +#define KVM_CAP_DEBUGREGS 50 +#endif +#define KVM_CAP_X86_ROBUST_SINGLESTEP 51 +#define KVM_CAP_PPC_OSI 52 +#define KVM_CAP_PPC_UNSET_IRQ 53 +#define KVM_CAP_ENABLE_CAP 54  #ifdef KVM_CAP_IRQ_ROUTING @@ -683,6 +710,10 @@ struct kvm_clock_data {  /* Available with KVM_CAP_VCPU_EVENTS */  #define KVM_GET_VCPU_EVENTS       _IOR(KVMIO,  0x9f, struct kvm_vcpu_events)  #define KVM_SET_VCPU_EVENTS       _IOW(KVMIO,  0xa0, struct kvm_vcpu_events) +/* Available with KVM_CAP_DEBUGREGS */ +#define KVM_GET_DEBUGREGS         _IOR(KVMIO,  0xa1, struct kvm_debugregs) +#define KVM_SET_DEBUGREGS         _IOW(KVMIO,  0xa2, struct kvm_debugregs) +#define KVM_ENABLE_CAP            _IOW(KVMIO,  0xa3, struct kvm_enable_cap)  #define KVM_DEV_ASSIGN_ENABLE_IOMMU	(1 << 0) @@ -691,8 +722,9 @@ struct kvm_assigned_pci_dev {  	__u32 busnr;  	__u32 devfn;  	__u32 flags; +	__u32 segnr;  	union { -		__u32 reserved[12]; +		__u32 reserved[11];  	};  }; diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index bd5a616d937..7cb116afa1c 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -38,6 +38,7 @@  #define KVM_REQ_MMU_SYNC           7  #define KVM_REQ_KVMCLOCK_UPDATE    8  #define KVM_REQ_KICK               9 +#define KVM_REQ_DEACTIVATE_FPU    10  #define KVM_USERSPACE_IRQ_SOURCE_ID	0 @@ -53,24 +54,24 @@ extern struct kmem_cache *kvm_vcpu_cache;   */  struct kvm_io_bus {  	int                   dev_count; -#define NR_IOBUS_DEVS 6 +#define NR_IOBUS_DEVS 200  	struct kvm_io_device *devs[NR_IOBUS_DEVS];  }; -void kvm_io_bus_init(struct kvm_io_bus *bus); -void kvm_io_bus_destroy(struct kvm_io_bus *bus); -int kvm_io_bus_write(struct kvm_io_bus *bus, gpa_t addr, int len, -		     const void *val); -int kvm_io_bus_read(struct kvm_io_bus *bus, gpa_t addr, int len, +enum kvm_bus { +	KVM_MMIO_BUS, +	KVM_PIO_BUS, +	KVM_NR_BUSES +}; + +int kvm_io_bus_write(struct kvm *kvm, enum kvm_bus bus_idx, gpa_t addr, +		     int len, const void *val); +int kvm_io_bus_read(struct kvm *kvm, enum kvm_bus bus_idx, gpa_t addr, int len,  		    void *val); -int __kvm_io_bus_register_dev(struct kvm_io_bus *bus, -			       struct kvm_io_device *dev); -int kvm_io_bus_register_dev(struct kvm *kvm, struct kvm_io_bus *bus, +int kvm_io_bus_register_dev(struct kvm *kvm, enum kvm_bus bus_idx,  			    struct kvm_io_device *dev); -void __kvm_io_bus_unregister_dev(struct kvm_io_bus *bus, -				 struct kvm_io_device *dev); -void kvm_io_bus_unregister_dev(struct kvm *kvm, struct kvm_io_bus *bus, -			       struct kvm_io_device *dev); +int kvm_io_bus_unregister_dev(struct kvm *kvm, enum kvm_bus bus_idx, +			      struct kvm_io_device *dev);  struct kvm_vcpu {  	struct kvm *kvm; @@ -83,6 +84,8 @@ struct kvm_vcpu {  	struct kvm_run *run;  	unsigned long requests;  	unsigned long guest_debug; +	int srcu_idx; +  	int fpu_active;  	int guest_fpu_loaded;  	wait_queue_head_t wq; @@ -102,6 +105,12 @@ struct kvm_vcpu {  	struct kvm_vcpu_arch arch;  }; +/* + * Some of the bitops functions do not support too long bitmaps. + * This number must be determined not to exceed such limits. + */ +#define KVM_MEM_MAX_NR_PAGES ((1UL << 31) - 1) +  struct kvm_memory_slot {  	gfn_t base_gfn;  	unsigned long npages; @@ -116,6 +125,11 @@ struct kvm_memory_slot {  	int user_alloc;  }; +static inline unsigned long kvm_dirty_bitmap_bytes(struct kvm_memory_slot *memslot) +{ +	return ALIGN(memslot->npages, BITS_PER_LONG) / 8; +} +  struct kvm_kernel_irq_routing_entry {  	u32 gsi;  	u32 type; @@ -150,14 +164,19 @@ struct kvm_irq_routing_table {};  #endif -struct kvm { -	spinlock_t mmu_lock; -	spinlock_t requests_lock; -	struct rw_semaphore slots_lock; -	struct mm_struct *mm; /* userspace tied to this vm */ +struct kvm_memslots {  	int nmemslots;  	struct kvm_memory_slot memslots[KVM_MEMORY_SLOTS +  					KVM_PRIVATE_MEM_SLOTS]; +}; + +struct kvm { +	spinlock_t mmu_lock; +	raw_spinlock_t requests_lock; +	struct mutex slots_lock; +	struct mm_struct *mm; /* userspace tied to this vm */ +	struct kvm_memslots *memslots; +	struct srcu_struct srcu;  #ifdef CONFIG_KVM_APIC_ARCHITECTURE  	u32 bsp_vcpu_id;  	struct kvm_vcpu *bsp_vcpu; @@ -166,8 +185,7 @@ struct kvm {  	atomic_t online_vcpus;  	struct list_head vm_list;  	struct mutex lock; -	struct kvm_io_bus mmio_bus; -	struct kvm_io_bus pio_bus; +	struct kvm_io_bus *buses[KVM_NR_BUSES];  #ifdef CONFIG_HAVE_KVM_EVENTFD  	struct {  		spinlock_t        lock; @@ -225,17 +243,23 @@ void kvm_vcpu_uninit(struct kvm_vcpu *vcpu);  void vcpu_load(struct kvm_vcpu *vcpu);  void vcpu_put(struct kvm_vcpu *vcpu); -int kvm_init(void *opaque, unsigned int vcpu_size, +int kvm_init(void *opaque, unsigned vcpu_size, unsigned vcpu_align,  		  struct module *module);  void kvm_exit(void);  void kvm_get_kvm(struct kvm *kvm);  void kvm_put_kvm(struct kvm *kvm); +static inline struct kvm_memslots *kvm_memslots(struct kvm *kvm) +{ +	return rcu_dereference_check(kvm->memslots, +			srcu_read_lock_held(&kvm->srcu) +			|| lockdep_is_held(&kvm->slots_lock)); +} +  #define HPA_MSB ((sizeof(hpa_t) * 8) - 1)  #define HPA_ERR_MASK ((hpa_t)1 << HPA_MSB)  static inline int is_error_hpa(hpa_t hpa) { return hpa >> HPA_MSB; } -struct page *gva_to_page(struct kvm_vcpu *vcpu, gva_t gva);  extern struct page *bad_page;  extern pfn_t bad_pfn; @@ -249,13 +273,20 @@ int kvm_set_memory_region(struct kvm *kvm,  int __kvm_set_memory_region(struct kvm *kvm,  			    struct kvm_userspace_memory_region *mem,  			    int user_alloc); -int kvm_arch_set_memory_region(struct kvm *kvm, +int kvm_arch_prepare_memory_region(struct kvm *kvm, +				struct kvm_memory_slot *memslot, +				struct kvm_memory_slot old, +				struct kvm_userspace_memory_region *mem, +				int user_alloc); +void kvm_arch_commit_memory_region(struct kvm *kvm,  				struct kvm_userspace_memory_region *mem,  				struct kvm_memory_slot old,  				int user_alloc);  void kvm_disable_largepages(void);  void kvm_arch_flush_shadow(struct kvm *kvm);  gfn_t unalias_gfn(struct kvm *kvm, gfn_t gfn); +gfn_t unalias_gfn_instantiation(struct kvm *kvm, gfn_t gfn); +  struct page *gfn_to_page(struct kvm *kvm, gfn_t gfn);  unsigned long gfn_to_hva(struct kvm *kvm, gfn_t gfn);  void kvm_release_page_clean(struct page *page); @@ -264,6 +295,9 @@ void kvm_set_page_dirty(struct page *page);  void kvm_set_page_accessed(struct page *page);  pfn_t gfn_to_pfn(struct kvm *kvm, gfn_t gfn); +pfn_t gfn_to_pfn_memslot(struct kvm *kvm, +			 struct kvm_memory_slot *slot, gfn_t gfn); +int memslot_id(struct kvm *kvm, gfn_t gfn);  void kvm_release_pfn_dirty(pfn_t);  void kvm_release_pfn_clean(pfn_t pfn);  void kvm_set_pfn_dirty(pfn_t pfn); @@ -283,6 +317,7 @@ int kvm_clear_guest_page(struct kvm *kvm, gfn_t gfn, int offset, int len);  int kvm_clear_guest(struct kvm *kvm, gpa_t gpa, unsigned long len);  struct kvm_memory_slot *gfn_to_memslot(struct kvm *kvm, gfn_t gfn);  int kvm_is_visible_gfn(struct kvm *kvm, gfn_t gfn); +unsigned long kvm_host_page_size(struct kvm *kvm, gfn_t gfn);  void mark_page_dirty(struct kvm *kvm, gfn_t gfn);  void kvm_vcpu_block(struct kvm_vcpu *vcpu); @@ -383,6 +418,7 @@ struct kvm_assigned_dev_kernel {  	struct work_struct interrupt_work;  	struct list_head list;  	int assigned_dev_id; +	int host_segnr;  	int host_busnr;  	int host_devfn;  	unsigned int entries_nr; @@ -429,8 +465,7 @@ void kvm_free_irq_source_id(struct kvm *kvm, int irq_source_id);  #define KVM_IOMMU_CACHE_COHERENCY	0x1  #ifdef CONFIG_IOMMU_API -int kvm_iommu_map_pages(struct kvm *kvm, gfn_t base_gfn, -			unsigned long npages); +int kvm_iommu_map_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, @@ -480,11 +515,6 @@ static inline void kvm_guest_exit(void)  	current->flags &= ~PF_VCPU;  } -static inline int memslot_id(struct kvm *kvm, struct kvm_memory_slot *slot) -{ -	return slot - kvm->memslots; -} -  static inline gpa_t gfn_to_gpa(gfn_t gfn)  {  	return (gpa_t)gfn << PAGE_SHIFT; @@ -532,6 +562,10 @@ static inline int mmu_notifier_retry(struct kvm_vcpu *vcpu, unsigned long mmu_se  }  #endif +#ifndef KVM_ARCH_HAS_UNALIAS_INSTANTIATION +#define unalias_gfn_instantiation unalias_gfn +#endif +  #ifdef CONFIG_HAVE_KVM_IRQCHIP  #define KVM_MAX_IRQ_ROUTES 1024 diff --git a/include/linux/l2tp.h b/include/linux/l2tp.h new file mode 100644 index 00000000000..4bdb31df8e7 --- /dev/null +++ b/include/linux/l2tp.h @@ -0,0 +1,163 @@ +/* + * L2TP-over-IP socket for L2TPv3. + * + * Author: James Chapman <jchapman@katalix.com> + */ + +#ifndef _LINUX_L2TP_H_ +#define _LINUX_L2TP_H_ + +#include <linux/types.h> +#ifdef __KERNEL__ +#include <linux/socket.h> +#include <linux/in.h> +#else +#include <netinet/in.h> +#endif + +#define IPPROTO_L2TP		115 + +/** + * struct sockaddr_l2tpip - the sockaddr structure for L2TP-over-IP sockets + * @l2tp_family:  address family number AF_L2TPIP. + * @l2tp_addr:    protocol specific address information + * @l2tp_conn_id: connection id of tunnel + */ +#define __SOCK_SIZE__	16		/* sizeof(struct sockaddr)	*/ +struct sockaddr_l2tpip { +	/* The first fields must match struct sockaddr_in */ +	sa_family_t	l2tp_family;	/* AF_INET */ +	__be16		l2tp_unused;	/* INET port number (unused) */ +	struct in_addr	l2tp_addr;	/* Internet address */ + +	__u32		l2tp_conn_id;	/* Connection ID of tunnel */ + +	/* Pad to size of `struct sockaddr'. */ +	unsigned char	__pad[sizeof(struct sockaddr) - sizeof(sa_family_t) - +			      sizeof(__be16) - sizeof(struct in_addr) - +			      sizeof(__u32)]; +}; + +/***************************************************************************** + *  NETLINK_GENERIC netlink family. + *****************************************************************************/ + +/* + * Commands. + * Valid TLVs of each command are:- + * TUNNEL_CREATE	- CONN_ID, pw_type, netns, ifname, ipinfo, udpinfo, udpcsum, vlanid + * TUNNEL_DELETE	- CONN_ID + * TUNNEL_MODIFY	- CONN_ID, udpcsum + * TUNNEL_GETSTATS	- CONN_ID, (stats) + * TUNNEL_GET		- CONN_ID, (...) + * SESSION_CREATE	- SESSION_ID, PW_TYPE, offset, data_seq, cookie, peer_cookie, offset, l2spec + * SESSION_DELETE	- SESSION_ID + * SESSION_MODIFY	- SESSION_ID, data_seq + * SESSION_GET		- SESSION_ID, (...) + * SESSION_GETSTATS	- SESSION_ID, (stats) + * + */ +enum { +	L2TP_CMD_NOOP, +	L2TP_CMD_TUNNEL_CREATE, +	L2TP_CMD_TUNNEL_DELETE, +	L2TP_CMD_TUNNEL_MODIFY, +	L2TP_CMD_TUNNEL_GET, +	L2TP_CMD_SESSION_CREATE, +	L2TP_CMD_SESSION_DELETE, +	L2TP_CMD_SESSION_MODIFY, +	L2TP_CMD_SESSION_GET, +	__L2TP_CMD_MAX, +}; + +#define L2TP_CMD_MAX			(__L2TP_CMD_MAX - 1) + +/* + * ATTR types defined for L2TP + */ +enum { +	L2TP_ATTR_NONE,			/* no data */ +	L2TP_ATTR_PW_TYPE,		/* u16, enum l2tp_pwtype */ +	L2TP_ATTR_ENCAP_TYPE,		/* u16, enum l2tp_encap_type */ +	L2TP_ATTR_OFFSET,		/* u16 */ +	L2TP_ATTR_DATA_SEQ,		/* u16 */ +	L2TP_ATTR_L2SPEC_TYPE,		/* u8, enum l2tp_l2spec_type */ +	L2TP_ATTR_L2SPEC_LEN,		/* u8, enum l2tp_l2spec_type */ +	L2TP_ATTR_PROTO_VERSION,	/* u8 */ +	L2TP_ATTR_IFNAME,		/* string */ +	L2TP_ATTR_CONN_ID,		/* u32 */ +	L2TP_ATTR_PEER_CONN_ID,		/* u32 */ +	L2TP_ATTR_SESSION_ID,		/* u32 */ +	L2TP_ATTR_PEER_SESSION_ID,	/* u32 */ +	L2TP_ATTR_UDP_CSUM,		/* u8 */ +	L2TP_ATTR_VLAN_ID,		/* u16 */ +	L2TP_ATTR_COOKIE,		/* 0, 4 or 8 bytes */ +	L2TP_ATTR_PEER_COOKIE,		/* 0, 4 or 8 bytes */ +	L2TP_ATTR_DEBUG,		/* u32 */ +	L2TP_ATTR_RECV_SEQ,		/* u8 */ +	L2TP_ATTR_SEND_SEQ,		/* u8 */ +	L2TP_ATTR_LNS_MODE,		/* u8 */ +	L2TP_ATTR_USING_IPSEC,		/* u8 */ +	L2TP_ATTR_RECV_TIMEOUT,		/* msec */ +	L2TP_ATTR_FD,			/* int */ +	L2TP_ATTR_IP_SADDR,		/* u32 */ +	L2TP_ATTR_IP_DADDR,		/* u32 */ +	L2TP_ATTR_UDP_SPORT,		/* u16 */ +	L2TP_ATTR_UDP_DPORT,		/* u16 */ +	L2TP_ATTR_MTU,			/* u16 */ +	L2TP_ATTR_MRU,			/* u16 */ +	L2TP_ATTR_STATS,		/* nested */ +	__L2TP_ATTR_MAX, +}; + +#define L2TP_ATTR_MAX			(__L2TP_ATTR_MAX - 1) + +/* Nested in L2TP_ATTR_STATS */ +enum { +	L2TP_ATTR_STATS_NONE,		/* no data */ +	L2TP_ATTR_TX_PACKETS,		/* u64 */ +	L2TP_ATTR_TX_BYTES,		/* u64 */ +	L2TP_ATTR_TX_ERRORS,		/* u64 */ +	L2TP_ATTR_RX_PACKETS,		/* u64 */ +	L2TP_ATTR_RX_BYTES,		/* u64 */ +	L2TP_ATTR_RX_SEQ_DISCARDS,	/* u64 */ +	L2TP_ATTR_RX_OOS_PACKETS,	/* u64 */ +	L2TP_ATTR_RX_ERRORS,		/* u64 */ +	__L2TP_ATTR_STATS_MAX, +}; + +#define L2TP_ATTR_STATS_MAX		(__L2TP_ATTR_STATS_MAX - 1) + +enum l2tp_pwtype { +	L2TP_PWTYPE_NONE = 0x0000, +	L2TP_PWTYPE_ETH_VLAN = 0x0004, +	L2TP_PWTYPE_ETH = 0x0005, +	L2TP_PWTYPE_PPP = 0x0007, +	L2TP_PWTYPE_PPP_AC = 0x0008, +	L2TP_PWTYPE_IP = 0x000b, +	__L2TP_PWTYPE_MAX +}; + +enum l2tp_l2spec_type { +	L2TP_L2SPECTYPE_NONE, +	L2TP_L2SPECTYPE_DEFAULT, +}; + +enum l2tp_encap_type { +	L2TP_ENCAPTYPE_UDP, +	L2TP_ENCAPTYPE_IP, +}; + +enum l2tp_seqmode { +	L2TP_SEQ_NONE = 0, +	L2TP_SEQ_IP = 1, +	L2TP_SEQ_ALL = 2, +}; + +/* + * NETLINK_GENERIC related info + */ +#define L2TP_GENL_NAME		"l2tp" +#define L2TP_GENL_VERSION	0x1 + +#endif diff --git a/include/linux/lcd.h b/include/linux/lcd.h index c67fecafff9..8877123f2d6 100644 --- a/include/linux/lcd.h +++ b/include/linux/lcd.h @@ -69,6 +69,29 @@ struct lcd_device {  	struct device dev;  }; +struct lcd_platform_data { +	/* reset lcd panel device. */ +	int (*reset)(struct lcd_device *ld); +	/* on or off to lcd panel. if 'enable' is 0 then +	   lcd power off and 1, lcd power on. */ +	int (*power_on)(struct lcd_device *ld, int enable); + +	/* it indicates whether lcd panel was enabled +	   from bootloader or not. */ +	int lcd_enabled; +	/* it means delay for stable time when it becomes low to high +	   or high to low that is dependent on whether reset gpio is +	   low active or high active. */ +	unsigned int reset_delay; +	/* stable time needing to become lcd power on. */ +	unsigned int power_on_delay; +	/* stable time needing to become lcd power off. */ +	unsigned int power_off_delay; + +	/* it could be used for any purpose. */ +	void *pdata; +}; +  static inline void lcd_set_power(struct lcd_device *ld, int power)  {  	mutex_lock(&ld->update_lock); diff --git a/include/linux/lcm.h b/include/linux/lcm.h new file mode 100644 index 00000000000..7bf01d779b4 --- /dev/null +++ b/include/linux/lcm.h @@ -0,0 +1,8 @@ +#ifndef _LCM_H +#define _LCM_H + +#include <linux/compiler.h> + +unsigned long lcm(unsigned long a, unsigned long b) __attribute_const__; + +#endif /* _LCM_H */ diff --git a/include/linux/leds.h b/include/linux/leds.h index d8bf9665e70..ba6986a1166 100644 --- a/include/linux/leds.h +++ b/include/linux/leds.h @@ -149,14 +149,18 @@ struct gpio_led {  	unsigned	default_state : 2;  	/* default_state should be one of LEDS_GPIO_DEFSTATE_(ON|OFF|KEEP) */  }; -#define LEDS_GPIO_DEFSTATE_OFF	0 -#define LEDS_GPIO_DEFSTATE_ON	1 -#define LEDS_GPIO_DEFSTATE_KEEP	2 +#define LEDS_GPIO_DEFSTATE_OFF		0 +#define LEDS_GPIO_DEFSTATE_ON		1 +#define LEDS_GPIO_DEFSTATE_KEEP		2  struct gpio_led_platform_data {  	int 		num_leds;  	struct gpio_led *leds; -	int		(*gpio_blink_set)(unsigned gpio, + +#define GPIO_LED_NO_BLINK_LOW	0	/* No blink GPIO state low */ +#define GPIO_LED_NO_BLINK_HIGH	1	/* No blink GPIO state high */ +#define GPIO_LED_BLINK		2	/* Plase, blink */ +	int		(*gpio_blink_set)(unsigned gpio, int state,  					unsigned long *delay_on,  					unsigned long *delay_off);  }; diff --git a/include/linux/libata.h b/include/linux/libata.h index 73112250862..3bad2701bfa 100644 --- a/include/linux/libata.h +++ b/include/linux/libata.h @@ -146,6 +146,7 @@ enum {  	ATA_DFLAG_SLEEPING	= (1 << 15), /* device is sleeping */  	ATA_DFLAG_DUBIOUS_XFER	= (1 << 16), /* data transfer not verified */  	ATA_DFLAG_NO_UNLOAD	= (1 << 17), /* device doesn't support unload */ +	ATA_DFLAG_UNLOCK_HPA	= (1 << 18), /* unlock HPA */  	ATA_DFLAG_INIT_MASK	= (1 << 24) - 1,  	ATA_DFLAG_DETACH	= (1 << 24), @@ -201,12 +202,6 @@ enum {  	ATA_FLAG_SW_ACTIVITY	= (1 << 22), /* driver supports sw activity  					      * led */ -	/* The following flag belongs to ap->pflags but is kept in -	 * ap->flags because it's referenced in many LLDs and will be -	 * removed in not-too-distant future. -	 */ -	ATA_FLAG_DISABLED	= (1 << 23), /* port is disabled, ignore it */ -  	/* bits 24:31 of ap->flags are reserved for LLD specific flags */ @@ -255,12 +250,13 @@ enum {  	ATA_TMOUT_INTERNAL_QUICK = 5000,  	ATA_TMOUT_MAX_PARK	= 30000, -	/* FIXME: GoVault needs 2s but we can't afford that without -	 * parallel probing.  800ms is enough for iVDR disk -	 * HHD424020F7SV00.  Increase to 2secs when parallel probing -	 * is in place. +	/* +	 * GoVault needs 2s and iVDR disk HHD424020F7SV00 800ms.  2s +	 * is too much without parallel probing.  Use 2s if parallel +	 * probing is available, 800ms otherwise.  	 */ -	ATA_TMOUT_FF_WAIT	=  800, +	ATA_TMOUT_FF_WAIT_LONG	=  2000, +	ATA_TMOUT_FF_WAIT	=   800,  	/* Spec mandates to wait for ">= 2ms" before checking status  	 * after reset.  We wait 150ms, because that was the magic @@ -390,6 +386,7 @@ enum {  	ATA_HORKAGE_1_5_GBPS	= (1 << 13),	/* force 1.5 Gbps */  	ATA_HORKAGE_NOSETXFER	= (1 << 14),	/* skip SETXFER, SATA only */  	ATA_HORKAGE_BROKEN_FPDMA_AA	= (1 << 15),	/* skip AA */ +	ATA_HORKAGE_DUMP_ID	= (1 << 16),	/* dump IDENTIFY data */  	 /* DMA mask for user DMA control: User visible values; DO NOT  	    renumber */ @@ -517,7 +514,9 @@ struct ata_ioports {  	void __iomem		*command_addr;  	void __iomem		*altstatus_addr;  	void __iomem		*ctl_addr; +#ifdef CONFIG_ATA_BMDMA  	void __iomem		*bmdma_addr; +#endif /* CONFIG_ATA_BMDMA */  	void __iomem		*scr_addr;  };  #endif /* CONFIG_ATA_SFF */ @@ -720,15 +719,17 @@ struct ata_port {  	unsigned int		print_id; /* user visible unique port ID */  	unsigned int		port_no; /* 0 based port no. inside the host */ -	struct ata_prd		*prd;	 /* our SG list */ -	dma_addr_t		prd_dma; /* and its DMA mapping */ -  #ifdef CONFIG_ATA_SFF  	struct ata_ioports	ioaddr;	/* ATA cmd/ctl/dma register blocks */ -#endif /* CONFIG_ATA_SFF */ -  	u8			ctl;	/* cache of ATA control register */  	u8			last_ctl;	/* Cache last written value */ +	struct delayed_work	sff_pio_task; +#ifdef CONFIG_ATA_BMDMA +	struct ata_bmdma_prd	*bmdma_prd;	/* BMDMA SG list */ +	dma_addr_t		bmdma_prd_dma;	/* and its DMA mapping */ +#endif /* CONFIG_ATA_BMDMA */ +#endif /* CONFIG_ATA_SFF */ +  	unsigned int		pio_mask;  	unsigned int		mwdma_mask;  	unsigned int		udma_mask; @@ -750,8 +751,6 @@ struct ata_port {  	struct ata_host		*host;  	struct device 		*dev; -	void			*port_task_data; -	struct delayed_work	port_task;  	struct delayed_work	hotplug_task;  	struct work_struct	scsi_rescan_task; @@ -848,6 +847,7 @@ struct ata_port_operations {  	 * SFF / taskfile oriented ops  	 */  	void (*sff_dev_select)(struct ata_port *ap, unsigned int device); +	void (*sff_set_devctl)(struct ata_port *ap, u8 ctl);  	u8   (*sff_check_status)(struct ata_port *ap);  	u8   (*sff_check_altstatus)(struct ata_port *ap);  	void (*sff_tf_load)(struct ata_port *ap, const struct ata_taskfile *tf); @@ -856,15 +856,17 @@ struct ata_port_operations {  				 const struct ata_taskfile *tf);  	unsigned int (*sff_data_xfer)(struct ata_device *dev,  			unsigned char *buf, unsigned int buflen, int rw); -	u8   (*sff_irq_on)(struct ata_port *); +	void (*sff_irq_on)(struct ata_port *); +	bool (*sff_irq_check)(struct ata_port *);  	void (*sff_irq_clear)(struct ata_port *); +	void (*sff_drain_fifo)(struct ata_queued_cmd *qc); +#ifdef CONFIG_ATA_BMDMA  	void (*bmdma_setup)(struct ata_queued_cmd *qc);  	void (*bmdma_start)(struct ata_queued_cmd *qc);  	void (*bmdma_stop)(struct ata_queued_cmd *qc);  	u8   (*bmdma_status)(struct ata_port *ap); - -	void (*drain_fifo)(struct ata_queued_cmd *qc); +#endif /* CONFIG_ATA_BMDMA */  #endif /* CONFIG_ATA_SFF */  	ssize_t (*em_show)(struct ata_port *ap, char *buf); @@ -933,7 +935,6 @@ static inline int ata_port_is_dummy(struct ata_port *ap)  	return ap->ops == &ata_dummy_port_ops;  } -extern void ata_port_probe(struct ata_port *);  extern int sata_set_spd(struct ata_link *link);  extern int ata_std_prereset(struct ata_link *link, unsigned long deadline);  extern int ata_wait_after_reset(struct ata_link *link, unsigned long deadline, @@ -948,7 +949,6 @@ extern int sata_link_hardreset(struct ata_link *link,  extern int sata_std_hardreset(struct ata_link *link, unsigned int *class,  			      unsigned long deadline);  extern void ata_std_postreset(struct ata_link *link, unsigned int *classes); -extern void ata_port_disable(struct ata_port *);  extern struct ata_host *ata_host_alloc(struct device *dev, int max_ports);  extern struct ata_host *ata_host_alloc_pinfo(struct device *dev, @@ -1004,7 +1004,6 @@ extern unsigned long ata_xfer_mode2mask(u8 xfer_mode);  extern int ata_xfer_mode2shift(unsigned long xfer_mode);  extern const char *ata_mode_string(unsigned long xfer_mask);  extern unsigned long ata_id_xfermask(const u16 *id); -extern int ata_port_start(struct ata_port *ap);  extern int ata_std_qc_defer(struct ata_queued_cmd *qc);  extern void ata_noop_qc_prep(struct ata_queued_cmd *qc);  extern void ata_sg_init(struct ata_queued_cmd *qc, struct scatterlist *sg, @@ -1037,9 +1036,6 @@ extern int ata_cable_sata(struct ata_port *ap);  extern int ata_cable_ignore(struct ata_port *ap);  extern int ata_cable_unknown(struct ata_port *ap); -extern void ata_pio_queue_task(struct ata_port *ap, void *data, -			       unsigned long delay); -  /* Timing helpers */  extern unsigned int ata_pio_need_iordy(const struct ata_device *);  extern const struct ata_timing *ata_timing_find_mode(u8 xfer_mode); @@ -1441,7 +1437,11 @@ static inline void ata_tf_init(struct ata_device *dev, struct ata_taskfile *tf)  {  	memset(tf, 0, sizeof(*tf)); +#ifdef CONFIG_ATA_SFF  	tf->ctl = dev->link->ap->ctl; +#else +	tf->ctl = ATA_DEVCTL_OBS; +#endif  	if (dev->devno == 0)  		tf->device = ATA_DEVICE_OBS;  	else @@ -1562,7 +1562,6 @@ extern void sata_pmp_error_handler(struct ata_port *ap);  #ifdef CONFIG_ATA_SFF  extern const struct ata_port_operations ata_sff_port_ops; -extern const struct ata_port_operations ata_bmdma_port_ops;  extern const struct ata_port_operations ata_bmdma32_port_ops;  /* PIO only, sg_tablesize and dma_boundary limits can be removed */ @@ -1571,13 +1570,6 @@ extern const struct ata_port_operations ata_bmdma32_port_ops;  	.sg_tablesize		= LIBATA_MAX_PRD,		\  	.dma_boundary		= ATA_DMA_BOUNDARY -#define ATA_BMDMA_SHT(drv_name)					\ -	ATA_BASE_SHT(drv_name),					\ -	.sg_tablesize		= LIBATA_MAX_PRD,		\ -	.dma_boundary		= ATA_DMA_BOUNDARY - -extern void ata_sff_qc_prep(struct ata_queued_cmd *qc); -extern void ata_sff_dumb_qc_prep(struct ata_queued_cmd *qc);  extern void ata_sff_dev_select(struct ata_port *ap, unsigned int device);  extern u8 ata_sff_check_status(struct ata_port *ap);  extern void ata_sff_pause(struct ata_port *ap); @@ -1595,13 +1587,14 @@ extern unsigned int ata_sff_data_xfer32(struct ata_device *dev,  			unsigned char *buf, unsigned int buflen, int rw);  extern unsigned int ata_sff_data_xfer_noirq(struct ata_device *dev,  			unsigned char *buf, unsigned int buflen, int rw); -extern u8 ata_sff_irq_on(struct ata_port *ap); +extern void ata_sff_irq_on(struct ata_port *ap);  extern void ata_sff_irq_clear(struct ata_port *ap);  extern int ata_sff_hsm_move(struct ata_port *ap, struct ata_queued_cmd *qc,  			    u8 status, int in_wq); +extern void ata_sff_queue_pio_task(struct ata_port *ap, unsigned long delay);  extern unsigned int ata_sff_qc_issue(struct ata_queued_cmd *qc);  extern bool ata_sff_qc_fill_rtf(struct ata_queued_cmd *qc); -extern unsigned int ata_sff_host_intr(struct ata_port *ap, +extern unsigned int ata_sff_port_intr(struct ata_port *ap,  				      struct ata_queued_cmd *qc);  extern irqreturn_t ata_sff_interrupt(int irq, void *dev_instance);  extern void ata_sff_lost_interrupt(struct ata_port *ap); @@ -1619,21 +1612,8 @@ extern int sata_sff_hardreset(struct ata_link *link, unsigned int *class,  extern void ata_sff_postreset(struct ata_link *link, unsigned int *classes);  extern void ata_sff_drain_fifo(struct ata_queued_cmd *qc);  extern void ata_sff_error_handler(struct ata_port *ap); -extern void ata_sff_post_internal_cmd(struct ata_queued_cmd *qc); -extern int ata_sff_port_start(struct ata_port *ap); -extern int ata_sff_port_start32(struct ata_port *ap);  extern void ata_sff_std_ports(struct ata_ioports *ioaddr); -extern unsigned long ata_bmdma_mode_filter(struct ata_device *dev, -					   unsigned long xfer_mask); -extern void ata_bmdma_setup(struct ata_queued_cmd *qc); -extern void ata_bmdma_start(struct ata_queued_cmd *qc); -extern void ata_bmdma_stop(struct ata_queued_cmd *qc); -extern u8 ata_bmdma_status(struct ata_port *ap); -extern void ata_bus_reset(struct ata_port *ap); -  #ifdef CONFIG_PCI -extern int ata_pci_bmdma_clear_simplex(struct pci_dev *pdev); -extern int ata_pci_bmdma_init(struct ata_host *host);  extern int ata_pci_sff_init_host(struct ata_host *host);  extern int ata_pci_sff_prepare_host(struct pci_dev *pdev,  				    const struct ata_port_info * const * ppi, @@ -1642,9 +1622,47 @@ extern int ata_pci_sff_activate_host(struct ata_host *host,  				     irq_handler_t irq_handler,  				     struct scsi_host_template *sht);  extern int ata_pci_sff_init_one(struct pci_dev *pdev, -				const struct ata_port_info * const * ppi, -				struct scsi_host_template *sht, void *host_priv); +		const struct ata_port_info * const * ppi, +		struct scsi_host_template *sht, void *host_priv, int hflags); +#endif /* CONFIG_PCI */ + +#ifdef CONFIG_ATA_BMDMA + +extern const struct ata_port_operations ata_bmdma_port_ops; + +#define ATA_BMDMA_SHT(drv_name)					\ +	ATA_BASE_SHT(drv_name),					\ +	.sg_tablesize		= LIBATA_MAX_PRD,		\ +	.dma_boundary		= ATA_DMA_BOUNDARY + +extern void ata_bmdma_qc_prep(struct ata_queued_cmd *qc); +extern unsigned int ata_bmdma_qc_issue(struct ata_queued_cmd *qc); +extern void ata_bmdma_dumb_qc_prep(struct ata_queued_cmd *qc); +extern unsigned int ata_bmdma_port_intr(struct ata_port *ap, +				      struct ata_queued_cmd *qc); +extern irqreturn_t ata_bmdma_interrupt(int irq, void *dev_instance); +extern void ata_bmdma_error_handler(struct ata_port *ap); +extern void ata_bmdma_post_internal_cmd(struct ata_queued_cmd *qc); +extern void ata_bmdma_irq_clear(struct ata_port *ap); +extern void ata_bmdma_setup(struct ata_queued_cmd *qc); +extern void ata_bmdma_start(struct ata_queued_cmd *qc); +extern void ata_bmdma_stop(struct ata_queued_cmd *qc); +extern u8 ata_bmdma_status(struct ata_port *ap); +extern int ata_bmdma_port_start(struct ata_port *ap); +extern int ata_bmdma_port_start32(struct ata_port *ap); + +#ifdef CONFIG_PCI +extern int ata_pci_bmdma_clear_simplex(struct pci_dev *pdev); +extern void ata_pci_bmdma_init(struct ata_host *host); +extern int ata_pci_bmdma_prepare_host(struct pci_dev *pdev, +				      const struct ata_port_info * const * ppi, +				      struct ata_host **r_host); +extern int ata_pci_bmdma_init_one(struct pci_dev *pdev, +				  const struct ata_port_info * const * ppi, +				  struct scsi_host_template *sht, +				  void *host_priv, int hflags);  #endif /* CONFIG_PCI */ +#endif /* CONFIG_ATA_BMDMA */  /**   *	ata_sff_busy_wait - Wait for a port status register diff --git a/include/linux/lis3lv02d.h b/include/linux/lis3lv02d.h index f1ca0dcc162..0e8a346424b 100644 --- a/include/linux/lis3lv02d.h +++ b/include/linux/lis3lv02d.h @@ -25,12 +25,14 @@ struct lis3lv02d_platform_data {  #define LIS3_IRQ1_FF_WU_12	(3 << 0)  #define LIS3_IRQ1_DATA_READY	(4 << 0)  #define LIS3_IRQ1_CLICK		(7 << 0) +#define LIS3_IRQ1_MASK		(7 << 0)  #define LIS3_IRQ2_DISABLE	(0 << 3)  #define LIS3_IRQ2_FF_WU_1	(1 << 3)  #define LIS3_IRQ2_FF_WU_2	(2 << 3)  #define LIS3_IRQ2_FF_WU_12	(3 << 3)  #define LIS3_IRQ2_DATA_READY	(4 << 3)  #define LIS3_IRQ2_CLICK		(7 << 3) +#define LIS3_IRQ2_MASK		(7 << 3)  #define LIS3_IRQ_OPEN_DRAIN	(1 << 6)  #define LIS3_IRQ_ACTIVE_LOW	(1 << 7)  	unsigned char irq_cfg; @@ -43,6 +45,15 @@ struct lis3lv02d_platform_data {  #define LIS3_WAKEUP_Z_HI	(1 << 5)  	unsigned char wakeup_flags;  	unsigned char wakeup_thresh; +	unsigned char wakeup_flags2; +	unsigned char wakeup_thresh2; +#define LIS3_HIPASS_CUTFF_8HZ   0 +#define LIS3_HIPASS_CUTFF_4HZ   1 +#define LIS3_HIPASS_CUTFF_2HZ   2 +#define LIS3_HIPASS_CUTFF_1HZ   3 +#define LIS3_HIPASS1_DISABLE    (1 << 2) +#define LIS3_HIPASS2_DISABLE    (1 << 3) +	unsigned char hipass_ctrl;  #define LIS3_NO_MAP		0  #define LIS3_DEV_X		1  #define LIS3_DEV_Y		2 @@ -58,6 +69,7 @@ struct lis3lv02d_platform_data {  	/* Limits for selftest are specified in chip data sheet */  	s16 st_min_limits[3]; /* min pass limit x, y, z */  	s16 st_max_limits[3]; /* max pass limit x, y, z */ +	int irq2;  };  #endif /* __LIS3LV02D_H_ */ diff --git a/include/linux/list.h b/include/linux/list.h index 969f6e92d08..8392884a297 100644 --- a/include/linux/list.h +++ b/include/linux/list.h @@ -206,6 +206,20 @@ static inline int list_empty_careful(const struct list_head *head)  }  /** + * list_rotate_left - rotate the list to the left + * @head: the head of the list + */ +static inline void list_rotate_left(struct list_head *head) +{ +	struct list_head *first; + +	if (!list_empty(head)) { +		first = head->next; +		list_move_tail(first, head); +	} +} + +/**   * list_is_singular - tests whether a list has just one entry.   * @head: the list to test.   */ @@ -484,7 +498,7 @@ static inline void list_splice_tail_init(struct list_head *list,  	     pos = n, n = list_entry(n->member.next, typeof(*n), member))  /** - * list_for_each_entry_safe_continue + * list_for_each_entry_safe_continue - continue list iteration safe against removal   * @pos:	the type * to use as a loop cursor.   * @n:		another type * to use as temporary storage   * @head:	the head for your list. @@ -500,7 +514,7 @@ static inline void list_splice_tail_init(struct list_head *list,  	     pos = n, n = list_entry(n->member.next, typeof(*n), member))  /** - * list_for_each_entry_safe_from + * list_for_each_entry_safe_from - iterate over list from current point safe against removal   * @pos:	the type * to use as a loop cursor.   * @n:		another type * to use as temporary storage   * @head:	the head for your list. @@ -515,7 +529,7 @@ static inline void list_splice_tail_init(struct list_head *list,  	     pos = n, n = list_entry(n->member.next, typeof(*n), member))  /** - * list_for_each_entry_safe_reverse + * list_for_each_entry_safe_reverse - iterate backwards over list safe against removal   * @pos:	the type * to use as a loop cursor.   * @n:		another type * to use as temporary storage   * @head:	the head for your list. diff --git a/include/linux/llc.h b/include/linux/llc.h index 7733585603f..ad7074ba81a 100644 --- a/include/linux/llc.h +++ b/include/linux/llc.h @@ -36,6 +36,7 @@ enum llc_sockopts {  	LLC_OPT_BUSY_TMR_EXP,	/* busy state expire time (secs). */  	LLC_OPT_TX_WIN,		/* tx window size. */  	LLC_OPT_RX_WIN,		/* rx window size. */ +	LLC_OPT_PKTINFO,	/* ancillary packet information. */  	LLC_OPT_MAX  }; @@ -70,6 +71,12 @@ enum llc_sockopts {  #define LLC_SAP_RM	0xD4		/* Resource Management 		*/  #define LLC_SAP_GLOBAL	0xFF		/* Global SAP. 			*/ +struct llc_pktinfo { +	int lpi_ifindex; +	unsigned char lpi_sap; +	unsigned char lpi_mac[IFHWADDRLEN]; +}; +  #ifdef __KERNEL__  #define LLC_SAP_DYN_START	0xC0  #define LLC_SAP_DYN_STOP	0xDE diff --git a/include/linux/lmb.h b/include/linux/lmb.h index ef82b8fcbdd..f3d14333ebe 100644 --- a/include/linux/lmb.h +++ b/include/linux/lmb.h @@ -42,6 +42,7 @@ extern void __init lmb_init(void);  extern void __init lmb_analyze(void);  extern long lmb_add(u64 base, u64 size);  extern long lmb_remove(u64 base, u64 size); +extern long __init lmb_free(u64 base, u64 size);  extern long __init lmb_reserve(u64 base, u64 size);  extern u64 __init lmb_alloc_nid(u64 size, u64 align, int nid,  				u64 (*nid_range)(u64, u64, int *)); diff --git a/include/linux/lockdep.h b/include/linux/lockdep.h index 9ccf0e286b2..06aed8305bf 100644 --- a/include/linux/lockdep.h +++ b/include/linux/lockdep.h @@ -12,6 +12,10 @@  struct task_struct;  struct lockdep_map; +/* for sysctl */ +extern int prove_locking; +extern int lock_stat; +  #ifdef CONFIG_LOCKDEP  #include <linux/linkage.h> @@ -40,6 +44,8 @@ struct lock_class_key {  	struct lockdep_subclass_key	subkeys[MAX_LOCKDEP_SUBCLASSES];  }; +extern struct lock_class_key __lockdep_no_validate__; +  #define LOCKSTAT_POINTS		4  /* @@ -266,6 +272,9 @@ extern void lockdep_init_map(struct lockdep_map *lock, const char *name,  #define lockdep_set_subclass(lock, sub)	\  		lockdep_init_map(&(lock)->dep_map, #lock, \  				 (lock)->dep_map.key, sub) + +#define lockdep_set_novalidate_class(lock) \ +	lockdep_set_class(lock, &__lockdep_no_validate__)  /*   * Compare locking classes   */ @@ -350,6 +359,9 @@ static inline void lockdep_on(void)  #define lockdep_set_class_and_subclass(lock, key, sub) \  		do { (void)(key); } while (0)  #define lockdep_set_subclass(lock, sub)		do { } while (0) + +#define lockdep_set_novalidate_class(lock) do { } while (0) +  /*   * We don't define lockdep_match_class() and lockdep_match_key() for !LOCKDEP   * case since the result is not well defined and the caller should rather @@ -534,4 +546,8 @@ do {									\  # define might_lock_read(lock) do { } while (0)  #endif +#ifdef CONFIG_PROVE_RCU +extern void lockdep_rcu_dereference(const char *file, const int line); +#endif +  #endif /* __LINUX_LOCKDEP_H */ diff --git a/include/linux/lru_cache.h b/include/linux/lru_cache.h index 3a2b2d9b047..de48d167568 100644 --- a/include/linux/lru_cache.h +++ b/include/linux/lru_cache.h @@ -64,7 +64,7 @@ For crash recovery after replication node failure,    usually the condition is softened to regions that _may_ have been target of    in-flight WRITE IO, e.g. by only lazily clearing the on-disk write-intent    bitmap, trading frequency of meta data transactions against amount of -  (possibly unneccessary) resync traffic. +  (possibly unnecessary) resync traffic.    If we set a hard limit on the area that may be "hot" at any given time, we    limit the amount of resync traffic needed for crash recovery. diff --git a/include/linux/lsm_audit.h b/include/linux/lsm_audit.h index f78f83d7663..6907251d520 100644 --- a/include/linux/lsm_audit.h +++ b/include/linux/lsm_audit.h @@ -33,7 +33,7 @@ struct common_audit_data {  #define LSM_AUDIT_DATA_IPC	4  #define LSM_AUDIT_DATA_TASK	5  #define LSM_AUDIT_DATA_KEY	6 -#define LSM_AUDIT_NO_AUDIT	7 +#define LSM_AUDIT_DATA_NONE	7  #define LSM_AUDIT_DATA_KMOD	8  	struct task_struct *tsk;  	union 	{ diff --git a/include/linux/magic.h b/include/linux/magic.h index 76285e01b39..eb9800f0578 100644 --- a/include/linux/magic.h +++ b/include/linux/magic.h @@ -52,7 +52,6 @@  #define CGROUP_SUPER_MAGIC	0x27e0eb  #define FUTEXFS_SUPER_MAGIC	0xBAD1DEA -#define INOTIFYFS_SUPER_MAGIC	0x2BAD1DEA  #define STACK_END_MAGIC		0x57AC6E9D diff --git a/include/linux/matroxfb.h b/include/linux/matroxfb.h index 2203121a43e..8c22a893864 100644 --- a/include/linux/matroxfb.h +++ b/include/linux/matroxfb.h @@ -4,6 +4,7 @@  #include <asm/ioctl.h>  #include <linux/types.h>  #include <linux/videodev2.h> +#include <linux/fb.h>  struct matroxioc_output_mode {  	__u32	output;		/* which output */ @@ -37,7 +38,5 @@ enum matroxfb_ctrl_id {    MATROXFB_CID_LAST  }; -#define FBIO_WAITFORVSYNC	_IOW('F', 0x20, __u32) -  #endif diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h index 1f9b119f4ac..9411d32840b 100644 --- a/include/linux/memcontrol.h +++ b/include/linux/memcontrol.h @@ -25,6 +25,13 @@ struct page_cgroup;  struct page;  struct mm_struct; +extern unsigned long mem_cgroup_isolate_pages(unsigned long nr_to_scan, +					struct list_head *dst, +					unsigned long *scanned, int order, +					int mode, struct zone *z, +					struct mem_cgroup *mem_cont, +					int active, int file); +  #ifdef CONFIG_CGROUP_MEM_RES_CTLR  /*   * All "charge" functions with gfp_mask should use GFP_KERNEL or @@ -64,12 +71,6 @@ extern void mem_cgroup_uncharge_cache_page(struct page *page);  extern int mem_cgroup_shmem_charge_fallback(struct page *page,  			struct mm_struct *mm, gfp_t gfp_mask); -extern unsigned long mem_cgroup_isolate_pages(unsigned long nr_to_scan, -					struct list_head *dst, -					unsigned long *scanned, int order, -					int mode, struct zone *z, -					struct mem_cgroup *mem_cont, -					int active, int file);  extern void mem_cgroup_out_of_memory(struct mem_cgroup *mem, gfp_t gfp_mask);  int task_in_mem_cgroup(struct task_struct *task, const struct mem_cgroup *mem); @@ -89,7 +90,8 @@ int mm_match_cgroup(const struct mm_struct *mm, const struct mem_cgroup *cgroup)  extern struct cgroup_subsys_state *mem_cgroup_css(struct mem_cgroup *mem);  extern int -mem_cgroup_prepare_migration(struct page *page, struct mem_cgroup **ptr); +mem_cgroup_prepare_migration(struct page *page, +	struct page *newpage, struct mem_cgroup **ptr);  extern void mem_cgroup_end_migration(struct mem_cgroup *mem,  	struct page *oldpage, struct page *newpage); @@ -124,7 +126,6 @@ static inline bool mem_cgroup_disabled(void)  	return false;  } -extern bool mem_cgroup_oom_called(struct task_struct *task);  void mem_cgroup_update_file_mapped(struct page *page, int val);  unsigned long mem_cgroup_soft_limit_reclaim(struct zone *zone, int order,  						gfp_t gfp_mask, int nid, @@ -227,7 +228,8 @@ static inline struct cgroup_subsys_state *mem_cgroup_css(struct mem_cgroup *mem)  }  static inline int -mem_cgroup_prepare_migration(struct page *page, struct mem_cgroup **ptr) +mem_cgroup_prepare_migration(struct page *page, struct page *newpage, +	struct mem_cgroup **ptr)  {  	return 0;  } @@ -258,11 +260,6 @@ static inline bool mem_cgroup_disabled(void)  	return true;  } -static inline bool mem_cgroup_oom_called(struct task_struct *task) -{ -	return false; -} -  static inline int  mem_cgroup_inactive_anon_is_low(struct mem_cgroup *memcg)  { diff --git a/include/linux/memory.h b/include/linux/memory.h index 1adfe779eb9..85582e1bcee 100644 --- a/include/linux/memory.h +++ b/include/linux/memory.h @@ -36,6 +36,8 @@ struct memory_block {  	struct sys_device sysdev;  }; +int arch_get_memory_phys_device(unsigned long start_pfn); +  /* These states are exposed to userspace as text strings in sysfs */  #define	MEM_ONLINE		(1<<0) /* exposed to userspace */  #define	MEM_GOING_OFFLINE	(1<<1) /* exposed to userspace */ diff --git a/include/linux/memory_hotplug.h b/include/linux/memory_hotplug.h index 35b07b773e6..864035fb8f8 100644 --- a/include/linux/memory_hotplug.h +++ b/include/linux/memory_hotplug.h @@ -202,6 +202,7 @@ static inline int is_mem_section_removable(unsigned long pfn,  }  #endif /* CONFIG_MEMORY_HOTREMOVE */ +extern int mem_online_node(int nid);  extern int add_memory(int nid, u64 start, u64 size);  extern int arch_add_memory(int nid, u64 start, u64 size);  extern int remove_memory(u64 start, u64 size); diff --git a/include/linux/mempolicy.h b/include/linux/mempolicy.h index 1cc966cd3e5..7b9ef6bf45a 100644 --- a/include/linux/mempolicy.h +++ b/include/linux/mempolicy.h @@ -23,6 +23,13 @@ enum {  	MPOL_MAX,	/* always last member of enum */  }; +enum mpol_rebind_step { +	MPOL_REBIND_ONCE,	/* do rebind work at once(not by two step) */ +	MPOL_REBIND_STEP1,	/* first step(set all the newly nodes) */ +	MPOL_REBIND_STEP2,	/* second step(clean all the disallowed nodes)*/ +	MPOL_REBIND_NSTEP, +}; +  /* Flags for set_mempolicy */  #define MPOL_F_STATIC_NODES	(1 << 15)  #define MPOL_F_RELATIVE_NODES	(1 << 14) @@ -51,6 +58,7 @@ enum {   */  #define MPOL_F_SHARED  (1 << 0)	/* identify shared policies */  #define MPOL_F_LOCAL   (1 << 1)	/* preferred local allocation */ +#define MPOL_F_REBINDING (1 << 2)	/* identify policies in rebinding */  #ifdef __KERNEL__ @@ -193,8 +201,8 @@ struct mempolicy *mpol_shared_policy_lookup(struct shared_policy *sp,  extern void numa_default_policy(void);  extern void numa_policy_init(void); -extern void mpol_rebind_task(struct task_struct *tsk, -					const nodemask_t *new); +extern void mpol_rebind_task(struct task_struct *tsk, const nodemask_t *new, +				enum mpol_rebind_step step);  extern void mpol_rebind_mm(struct mm_struct *mm, nodemask_t *new);  extern void mpol_fix_fork_child_flag(struct task_struct *p); @@ -308,7 +316,8 @@ static inline void numa_default_policy(void)  }  static inline void mpol_rebind_task(struct task_struct *tsk, -					const nodemask_t *new) +				const nodemask_t *new, +				enum mpol_rebind_step step)  {  } diff --git a/include/linux/meye.h b/include/linux/meye.h index 12010ace1f0..0dd49954f74 100644 --- a/include/linux/meye.h +++ b/include/linux/meye.h @@ -44,17 +44,17 @@ struct meye_params {  };  /* query the extended parameters */ -#define MEYEIOC_G_PARAMS	_IOR ('v', BASE_VIDIOCPRIVATE+0, struct meye_params) +#define MEYEIOC_G_PARAMS	_IOR ('v', BASE_VIDIOC_PRIVATE+0, struct meye_params)  /* set the extended parameters */ -#define MEYEIOC_S_PARAMS	_IOW ('v', BASE_VIDIOCPRIVATE+1, struct meye_params) +#define MEYEIOC_S_PARAMS	_IOW ('v', BASE_VIDIOC_PRIVATE+1, struct meye_params)  /* queue a buffer for mjpeg capture */ -#define MEYEIOC_QBUF_CAPT	_IOW ('v', BASE_VIDIOCPRIVATE+2, int) +#define MEYEIOC_QBUF_CAPT	_IOW ('v', BASE_VIDIOC_PRIVATE+2, int)  /* sync a previously queued mjpeg buffer */ -#define MEYEIOC_SYNC		_IOWR('v', BASE_VIDIOCPRIVATE+3, int) +#define MEYEIOC_SYNC		_IOWR('v', BASE_VIDIOC_PRIVATE+3, int)  /* get a still uncompressed snapshot */ -#define MEYEIOC_STILLCAPT	_IO  ('v', BASE_VIDIOCPRIVATE+4) +#define MEYEIOC_STILLCAPT	_IO  ('v', BASE_VIDIOC_PRIVATE+4)  /* get a jpeg compressed snapshot */ -#define MEYEIOC_STILLJCAPT	_IOR ('v', BASE_VIDIOCPRIVATE+5, int) +#define MEYEIOC_STILLJCAPT	_IOR ('v', BASE_VIDIOC_PRIVATE+5, int)  /* V4L2 private controls */  #define V4L2_CID_AGC		V4L2_CID_PRIVATE_BASE diff --git a/include/linux/mfd/88pm8607.h b/include/linux/mfd/88pm8607.h deleted file mode 100644 index f41b428d2ce..00000000000 --- a/include/linux/mfd/88pm8607.h +++ /dev/null @@ -1,217 +0,0 @@ -/* - * Marvell 88PM8607 Interface - * - * Copyright (C) 2009 Marvell International Ltd. - * 	Haojian Zhuang <haojian.zhuang@marvell.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_MFD_88PM8607_H -#define __LINUX_MFD_88PM8607_H - -enum { -	PM8607_ID_BUCK1 = 0, -	PM8607_ID_BUCK2, -	PM8607_ID_BUCK3, - -	PM8607_ID_LDO1, -	PM8607_ID_LDO2, -	PM8607_ID_LDO3, -	PM8607_ID_LDO4, -	PM8607_ID_LDO5, -	PM8607_ID_LDO6, -	PM8607_ID_LDO7, -	PM8607_ID_LDO8, -	PM8607_ID_LDO9, -	PM8607_ID_LDO10, -	PM8607_ID_LDO12, -	PM8607_ID_LDO14, - -	PM8607_ID_RG_MAX, -}; - -#define CHIP_ID				(0x40) -#define CHIP_ID_MASK			(0xF8) - -/* Interrupt Registers */ -#define PM8607_STATUS_1			(0x01) -#define PM8607_STATUS_2			(0x02) -#define PM8607_INT_STATUS1		(0x03) -#define PM8607_INT_STATUS2		(0x04) -#define PM8607_INT_STATUS3		(0x05) -#define PM8607_INT_MASK_1		(0x06) -#define PM8607_INT_MASK_2		(0x07) -#define PM8607_INT_MASK_3		(0x08) - -/* Regulator Control Registers */ -#define PM8607_LDO1			(0x10) -#define PM8607_LDO2			(0x11) -#define PM8607_LDO3			(0x12) -#define PM8607_LDO4			(0x13) -#define PM8607_LDO5			(0x14) -#define PM8607_LDO6			(0x15) -#define PM8607_LDO7			(0x16) -#define PM8607_LDO8			(0x17) -#define PM8607_LDO9			(0x18) -#define PM8607_LDO10			(0x19) -#define PM8607_LDO12			(0x1A) -#define PM8607_LDO14			(0x1B) -#define PM8607_SLEEP_MODE1		(0x1C) -#define PM8607_SLEEP_MODE2		(0x1D) -#define PM8607_SLEEP_MODE3		(0x1E) -#define PM8607_SLEEP_MODE4		(0x1F) -#define PM8607_GO			(0x20) -#define PM8607_SLEEP_BUCK1		(0x21) -#define PM8607_SLEEP_BUCK2		(0x22) -#define PM8607_SLEEP_BUCK3		(0x23) -#define PM8607_BUCK1			(0x24) -#define PM8607_BUCK2			(0x25) -#define PM8607_BUCK3			(0x26) -#define PM8607_BUCK_CONTROLS		(0x27) -#define PM8607_SUPPLIES_EN11		(0x2B) -#define PM8607_SUPPLIES_EN12		(0x2C) -#define PM8607_GROUP1			(0x2D) -#define PM8607_GROUP2			(0x2E) -#define PM8607_GROUP3			(0x2F) -#define PM8607_GROUP4			(0x30) -#define PM8607_GROUP5			(0x31) -#define PM8607_GROUP6			(0x32) -#define PM8607_SUPPLIES_EN21		(0x33) -#define PM8607_SUPPLIES_EN22		(0x34) - -/* RTC Control Registers */ -#define PM8607_RTC1			(0xA0) -#define PM8607_RTC_COUNTER1		(0xA1) -#define PM8607_RTC_COUNTER2		(0xA2) -#define PM8607_RTC_COUNTER3		(0xA3) -#define PM8607_RTC_COUNTER4		(0xA4) -#define PM8607_RTC_EXPIRE1		(0xA5) -#define PM8607_RTC_EXPIRE2		(0xA6) -#define PM8607_RTC_EXPIRE3		(0xA7) -#define PM8607_RTC_EXPIRE4		(0xA8) -#define PM8607_RTC_TRIM1		(0xA9) -#define PM8607_RTC_TRIM2		(0xAA) -#define PM8607_RTC_TRIM3		(0xAB) -#define PM8607_RTC_TRIM4		(0xAC) -#define PM8607_RTC_MISC1		(0xAD) -#define PM8607_RTC_MISC2		(0xAE) -#define PM8607_RTC_MISC3		(0xAF) - -/* Misc Registers */ -#define PM8607_CHIP_ID			(0x00) -#define PM8607_LDO1			(0x10) -#define PM8607_DVC3			(0x26) -#define PM8607_MISC1			(0x40) - -/* bit definitions for PM8607 events */ -#define PM8607_EVENT_ONKEY		(1 << 0) -#define PM8607_EVENT_EXTON		(1 << 1) -#define PM8607_EVENT_CHG		(1 << 2) -#define PM8607_EVENT_BAT		(1 << 3) -#define PM8607_EVENT_RTC		(1 << 4) -#define PM8607_EVENT_CC			(1 << 5) -#define PM8607_EVENT_VBAT		(1 << 8) -#define PM8607_EVENT_VCHG		(1 << 9) -#define PM8607_EVENT_VSYS		(1 << 10) -#define PM8607_EVENT_TINT		(1 << 11) -#define PM8607_EVENT_GPADC0		(1 << 12) -#define PM8607_EVENT_GPADC1		(1 << 13) -#define PM8607_EVENT_GPADC2		(1 << 14) -#define PM8607_EVENT_GPADC3		(1 << 15) -#define PM8607_EVENT_AUDIO_SHORT	(1 << 16) -#define PM8607_EVENT_PEN		(1 << 17) -#define PM8607_EVENT_HEADSET		(1 << 18) -#define PM8607_EVENT_HOOK		(1 << 19) -#define PM8607_EVENT_MICIN		(1 << 20) -#define PM8607_EVENT_CHG_TIMEOUT	(1 << 21) -#define PM8607_EVENT_CHG_DONE		(1 << 22) -#define PM8607_EVENT_CHG_FAULT		(1 << 23) - -/* bit definitions of Status Query Interface */ -#define PM8607_STATUS_CC		(1 << 3) -#define PM8607_STATUS_PEN		(1 << 4) -#define PM8607_STATUS_HEADSET		(1 << 5) -#define PM8607_STATUS_HOOK		(1 << 6) -#define PM8607_STATUS_MICIN		(1 << 7) -#define PM8607_STATUS_ONKEY		(1 << 8) -#define PM8607_STATUS_EXTON		(1 << 9) -#define PM8607_STATUS_CHG		(1 << 10) -#define PM8607_STATUS_BAT		(1 << 11) -#define PM8607_STATUS_VBUS		(1 << 12) -#define PM8607_STATUS_OV		(1 << 13) - -/* bit definitions of BUCK3 */ -#define PM8607_BUCK3_DOUBLE		(1 << 6) - -/* bit definitions of Misc1 */ -#define PM8607_MISC1_PI2C		(1 << 0) - -/* Interrupt Number in 88PM8607 */ -enum { -	PM8607_IRQ_ONKEY = 0, -	PM8607_IRQ_EXTON, -	PM8607_IRQ_CHG, -	PM8607_IRQ_BAT, -	PM8607_IRQ_RTC, -	PM8607_IRQ_VBAT = 8, -	PM8607_IRQ_VCHG, -	PM8607_IRQ_VSYS, -	PM8607_IRQ_TINT, -	PM8607_IRQ_GPADC0, -	PM8607_IRQ_GPADC1, -	PM8607_IRQ_GPADC2, -	PM8607_IRQ_GPADC3, -	PM8607_IRQ_AUDIO_SHORT = 16, -	PM8607_IRQ_PEN, -	PM8607_IRQ_HEADSET, -	PM8607_IRQ_HOOK, -	PM8607_IRQ_MICIN, -	PM8607_IRQ_CHG_FAIL, -	PM8607_IRQ_CHG_DONE, -	PM8607_IRQ_CHG_FAULT, -}; - -enum { -	PM8607_CHIP_A0 = 0x40, -	PM8607_CHIP_A1 = 0x41, -	PM8607_CHIP_B0 = 0x48, -}; - - -struct pm8607_chip { -	struct device		*dev; -	struct mutex		io_lock; -	struct i2c_client	*client; - -	int (*read)(struct pm8607_chip *chip, int reg, int bytes, void *dest); -	int (*write)(struct pm8607_chip *chip, int reg, int bytes, void *src); - -	int			buck3_double;	/* DVC ramp slope double */ -	unsigned char		chip_id; - -}; - -#define PM8607_MAX_REGULATOR	15	/* 3 Bucks, 12 LDOs */ - -enum { -	GI2C_PORT = 0, -	PI2C_PORT, -}; - -struct pm8607_platform_data { -	int	i2c_port;	/* Controlled by GI2C or PI2C */ -	struct regulator_init_data *regulator[PM8607_MAX_REGULATOR]; -}; - -extern int pm8607_reg_read(struct pm8607_chip *, int); -extern int pm8607_reg_write(struct pm8607_chip *, int, unsigned char); -extern int pm8607_bulk_read(struct pm8607_chip *, int, int, -			    unsigned char *); -extern int pm8607_bulk_write(struct pm8607_chip *, int, int, -			     unsigned char *); -extern int pm8607_set_bits(struct pm8607_chip *, int, unsigned char, -			   unsigned char); -#endif /* __LINUX_MFD_88PM8607_H */ diff --git a/include/linux/mfd/88pm860x.h b/include/linux/mfd/88pm860x.h new file mode 100644 index 00000000000..bfd23bef736 --- /dev/null +++ b/include/linux/mfd/88pm860x.h @@ -0,0 +1,376 @@ +/* + * Marvell 88PM860x Interface + * + * Copyright (C) 2009 Marvell International Ltd. + * 	Haojian Zhuang <haojian.zhuang@marvell.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_MFD_88PM860X_H +#define __LINUX_MFD_88PM860X_H + +#include <linux/interrupt.h> + +#define MFD_NAME_SIZE		(40) + +enum { +	CHIP_INVALID = 0, +	CHIP_PM8606, +	CHIP_PM8607, +	CHIP_MAX, +}; + +enum { +	PM8606_ID_INVALID, +	PM8606_ID_BACKLIGHT, +	PM8606_ID_LED, +	PM8606_ID_VIBRATOR, +	PM8606_ID_TOUCH, +	PM8606_ID_SOUND, +	PM8606_ID_CHARGER, +	PM8606_ID_MAX, +}; + +enum { +	PM8606_BACKLIGHT1 = 0, +	PM8606_BACKLIGHT2, +	PM8606_BACKLIGHT3, +}; + +enum { +	PM8606_LED1_RED = 0, +	PM8606_LED1_GREEN, +	PM8606_LED1_BLUE, +	PM8606_LED2_RED, +	PM8606_LED2_GREEN, +	PM8606_LED2_BLUE, +	PM8607_LED_VIBRATOR, +}; + + +/* 8606 Registers */ +#define PM8606_DCM_BOOST		(0x00) +#define PM8606_PWM			(0x01) + +/* Backlight Registers */ +#define PM8606_WLED1A			(0x02) +#define PM8606_WLED1B			(0x03) +#define PM8606_WLED2A			(0x04) +#define PM8606_WLED2B			(0x05) +#define PM8606_WLED3A			(0x06) +#define PM8606_WLED3B			(0x07) + +/* LED Registers */ +#define PM8606_RGB2A			(0x08) +#define PM8606_RGB2B			(0x09) +#define PM8606_RGB2C			(0x0A) +#define PM8606_RGB2D			(0x0B) +#define PM8606_RGB1A			(0x0C) +#define PM8606_RGB1B			(0x0D) +#define PM8606_RGB1C			(0x0E) +#define PM8606_RGB1D			(0x0F) + +#define PM8606_PREREGULATORA		(0x10) +#define PM8606_PREREGULATORB		(0x11) +#define PM8606_VIBRATORA		(0x12) +#define PM8606_VIBRATORB		(0x13) +#define PM8606_VCHG			(0x14) +#define PM8606_VSYS			(0x15) +#define PM8606_MISC			(0x16) +#define PM8606_CHIP_ID			(0x17) +#define PM8606_STATUS			(0x18) +#define PM8606_FLAGS			(0x19) +#define PM8606_PROTECTA			(0x1A) +#define PM8606_PROTECTB			(0x1B) +#define PM8606_PROTECTC			(0x1C) + +/* Bit definitions of PM8606 registers */ +#define PM8606_DCM_500MA		(0x0)	/* current limit */ +#define PM8606_DCM_750MA		(0x1) +#define PM8606_DCM_1000MA		(0x2) +#define PM8606_DCM_1250MA		(0x3) +#define PM8606_DCM_250MV		(0x0 << 2) +#define PM8606_DCM_300MV		(0x1 << 2) +#define PM8606_DCM_350MV		(0x2 << 2) +#define PM8606_DCM_400MV		(0x3 << 2) + +#define PM8606_PWM_31200HZ		(0x0) +#define PM8606_PWM_15600HZ		(0x1) +#define PM8606_PWM_7800HZ		(0x2) +#define PM8606_PWM_3900HZ		(0x3) +#define PM8606_PWM_1950HZ		(0x4) +#define PM8606_PWM_976HZ		(0x5) +#define PM8606_PWM_488HZ		(0x6) +#define PM8606_PWM_244HZ		(0x7) +#define PM8606_PWM_FREQ_MASK		(0x7) + +#define PM8606_WLED_ON			(1 << 0) +#define PM8606_WLED_CURRENT(x)		((x & 0x1F) << 1) + +#define PM8606_LED_CURRENT(x)		(((x >> 2) & 0x07) << 5) + +#define PM8606_VSYS_EN			(1 << 1) + +#define PM8606_MISC_OSC_EN		(1 << 4) + +enum { +	PM8607_ID_BUCK1 = 0, +	PM8607_ID_BUCK2, +	PM8607_ID_BUCK3, + +	PM8607_ID_LDO1, +	PM8607_ID_LDO2, +	PM8607_ID_LDO3, +	PM8607_ID_LDO4, +	PM8607_ID_LDO5, +	PM8607_ID_LDO6, +	PM8607_ID_LDO7, +	PM8607_ID_LDO8, +	PM8607_ID_LDO9, +	PM8607_ID_LDO10, +	PM8607_ID_LDO12, +	PM8607_ID_LDO13, +	PM8607_ID_LDO14, + +	PM8607_ID_RG_MAX, +}; + +#define PM8607_VERSION			(0x40)	/* 8607 chip ID */ +#define PM8607_VERSION_MASK		(0xF0)	/* 8607 chip ID mask */ + +/* Interrupt Registers */ +#define PM8607_STATUS_1			(0x01) +#define PM8607_STATUS_2			(0x02) +#define PM8607_INT_STATUS1		(0x03) +#define PM8607_INT_STATUS2		(0x04) +#define PM8607_INT_STATUS3		(0x05) +#define PM8607_INT_MASK_1		(0x06) +#define PM8607_INT_MASK_2		(0x07) +#define PM8607_INT_MASK_3		(0x08) + +/* Regulator Control Registers */ +#define PM8607_LDO1			(0x10) +#define PM8607_LDO2			(0x11) +#define PM8607_LDO3			(0x12) +#define PM8607_LDO4			(0x13) +#define PM8607_LDO5			(0x14) +#define PM8607_LDO6			(0x15) +#define PM8607_LDO7			(0x16) +#define PM8607_LDO8			(0x17) +#define PM8607_LDO9			(0x18) +#define PM8607_LDO10			(0x19) +#define PM8607_LDO12			(0x1A) +#define PM8607_LDO14			(0x1B) +#define PM8607_SLEEP_MODE1		(0x1C) +#define PM8607_SLEEP_MODE2		(0x1D) +#define PM8607_SLEEP_MODE3		(0x1E) +#define PM8607_SLEEP_MODE4		(0x1F) +#define PM8607_GO			(0x20) +#define PM8607_SLEEP_BUCK1		(0x21) +#define PM8607_SLEEP_BUCK2		(0x22) +#define PM8607_SLEEP_BUCK3		(0x23) +#define PM8607_BUCK1			(0x24) +#define PM8607_BUCK2			(0x25) +#define PM8607_BUCK3			(0x26) +#define PM8607_BUCK_CONTROLS		(0x27) +#define PM8607_SUPPLIES_EN11		(0x2B) +#define PM8607_SUPPLIES_EN12		(0x2C) +#define PM8607_GROUP1			(0x2D) +#define PM8607_GROUP2			(0x2E) +#define PM8607_GROUP3			(0x2F) +#define PM8607_GROUP4			(0x30) +#define PM8607_GROUP5			(0x31) +#define PM8607_GROUP6			(0x32) +#define PM8607_SUPPLIES_EN21		(0x33) +#define PM8607_SUPPLIES_EN22		(0x34) + +/* Vibrator Control Registers */ +#define PM8607_VIBRATOR_SET		(0x28) +#define PM8607_VIBRATOR_PWM		(0x29) + +/* GPADC Registers */ +#define PM8607_GP_BIAS1			(0x4F) +#define PM8607_MEAS_EN1			(0x50) +#define PM8607_MEAS_EN2			(0x51) +#define PM8607_MEAS_EN3			(0x52) +#define PM8607_MEAS_OFF_TIME1		(0x53) +#define PM8607_MEAS_OFF_TIME2		(0x54) +#define PM8607_TSI_PREBIAS		(0x55)	/* prebias time */ +#define PM8607_PD_PREBIAS		(0x56)	/* prebias time */ +#define PM8607_GPADC_MISC1		(0x57) + +/* RTC Control Registers */ +#define PM8607_RTC1			(0xA0) +#define PM8607_RTC_COUNTER1		(0xA1) +#define PM8607_RTC_COUNTER2		(0xA2) +#define PM8607_RTC_COUNTER3		(0xA3) +#define PM8607_RTC_COUNTER4		(0xA4) +#define PM8607_RTC_EXPIRE1		(0xA5) +#define PM8607_RTC_EXPIRE2		(0xA6) +#define PM8607_RTC_EXPIRE3		(0xA7) +#define PM8607_RTC_EXPIRE4		(0xA8) +#define PM8607_RTC_TRIM1		(0xA9) +#define PM8607_RTC_TRIM2		(0xAA) +#define PM8607_RTC_TRIM3		(0xAB) +#define PM8607_RTC_TRIM4		(0xAC) +#define PM8607_RTC_MISC1		(0xAD) +#define PM8607_RTC_MISC2		(0xAE) +#define PM8607_RTC_MISC3		(0xAF) + +/* Misc Registers */ +#define PM8607_CHIP_ID			(0x00) +#define PM8607_B0_MISC1			(0x0C) +#define PM8607_LDO1			(0x10) +#define PM8607_DVC3			(0x26) +#define PM8607_A1_MISC1			(0x40) + +/* bit definitions of Status Query Interface */ +#define PM8607_STATUS_CC		(1 << 3) +#define PM8607_STATUS_PEN		(1 << 4) +#define PM8607_STATUS_HEADSET		(1 << 5) +#define PM8607_STATUS_HOOK		(1 << 6) +#define PM8607_STATUS_MICIN		(1 << 7) +#define PM8607_STATUS_ONKEY		(1 << 8) +#define PM8607_STATUS_EXTON		(1 << 9) +#define PM8607_STATUS_CHG		(1 << 10) +#define PM8607_STATUS_BAT		(1 << 11) +#define PM8607_STATUS_VBUS		(1 << 12) +#define PM8607_STATUS_OV		(1 << 13) + +/* bit definitions of BUCK3 */ +#define PM8607_BUCK3_DOUBLE		(1 << 6) + +/* bit definitions of Misc1 */ +#define PM8607_A1_MISC1_PI2C		(1 << 0) +#define PM8607_B0_MISC1_INV_INT		(1 << 0) +#define PM8607_B0_MISC1_INT_CLEAR	(1 << 1) +#define PM8607_B0_MISC1_INT_MASK	(1 << 2) +#define PM8607_B0_MISC1_PI2C		(1 << 3) +#define PM8607_B0_MISC1_RESET		(1 << 6) + +/* bits definitions of GPADC */ +#define PM8607_GPADC_EN			(1 << 0) +#define PM8607_GPADC_PREBIAS_MASK	(3 << 1) +#define PM8607_GPADC_SLOT_CYCLE_MASK	(3 << 3)	/* slow mode */ +#define PM8607_GPADC_OFF_SCALE_MASK	(3 << 5)	/* GP sleep mode */ +#define PM8607_GPADC_SW_CAL_MASK	(1 << 7) + +#define PM8607_PD_PREBIAS_MASK		(0x1F << 0) +#define PM8607_PD_PRECHG_MASK		(7 << 5) + +/* Interrupt Number in 88PM8607 */ +enum { +	PM8607_IRQ_ONKEY, +	PM8607_IRQ_EXTON, +	PM8607_IRQ_CHG, +	PM8607_IRQ_BAT, +	PM8607_IRQ_RTC, +	PM8607_IRQ_CC, +	PM8607_IRQ_VBAT, +	PM8607_IRQ_VCHG, +	PM8607_IRQ_VSYS, +	PM8607_IRQ_TINT, +	PM8607_IRQ_GPADC0, +	PM8607_IRQ_GPADC1, +	PM8607_IRQ_GPADC2, +	PM8607_IRQ_GPADC3, +	PM8607_IRQ_AUDIO_SHORT, +	PM8607_IRQ_PEN, +	PM8607_IRQ_HEADSET, +	PM8607_IRQ_HOOK, +	PM8607_IRQ_MICIN, +	PM8607_IRQ_CHG_FAIL, +	PM8607_IRQ_CHG_DONE, +	PM8607_IRQ_CHG_FAULT, +}; + +enum { +	PM8607_CHIP_A0 = 0x40, +	PM8607_CHIP_A1 = 0x41, +	PM8607_CHIP_B0 = 0x48, +}; + +struct pm860x_chip { +	struct device		*dev; +	struct mutex		io_lock; +	struct mutex		irq_lock; +	struct i2c_client	*client; +	struct i2c_client	*companion;	/* companion chip client */ + +	int			buck3_double;	/* DVC ramp slope double */ +	unsigned short		companion_addr; +	int			id; +	int			irq_mode; +	int			irq_base; +	int			core_irq; +	unsigned char		chip_version; + +}; + +#define PM8607_MAX_REGULATOR	PM8607_ID_RG_MAX	/* 3 Bucks, 13 LDOs */ + +enum { +	GI2C_PORT = 0, +	PI2C_PORT, +}; + +struct pm860x_backlight_pdata { +	int		id; +	int		pwm; +	int		iset; +	unsigned long	flags; +}; + +struct pm860x_led_pdata { +	int		id; +	int		iset; +	unsigned long	flags; +}; + +struct pm860x_touch_pdata { +	int		gpadc_prebias; +	int		slot_cycle; +	int		off_scale; +	int		sw_cal; +	int		tsi_prebias;	/* time, slot */ +	int		pen_prebias;	/* time, slot */ +	int		pen_prechg;	/* time, slot */ +	int		res_x;		/* resistor of Xplate */ +	unsigned long	flags; +}; + +struct pm860x_power_pdata { +	unsigned	fast_charge;	/* charge current */ +}; + +struct pm860x_platform_data { +	struct pm860x_backlight_pdata	*backlight; +	struct pm860x_led_pdata		*led; +	struct pm860x_touch_pdata	*touch; +	struct pm860x_power_pdata	*power; + +	unsigned short	companion_addr;	/* I2C address of companion chip */ +	int		i2c_port;	/* Controlled by GI2C or PI2C */ +	int		irq_mode;	/* Clear interrupt by read/write(0/1) */ +	int		irq_base;	/* IRQ base number of 88pm860x */ +	struct regulator_init_data *regulator[PM8607_MAX_REGULATOR]; +}; + +extern char pm860x_backlight_name[][MFD_NAME_SIZE]; +extern char pm860x_led_name[][MFD_NAME_SIZE]; + +extern int pm860x_reg_read(struct i2c_client *, int); +extern int pm860x_reg_write(struct i2c_client *, int, unsigned char); +extern int pm860x_bulk_read(struct i2c_client *, int, int, unsigned char *); +extern int pm860x_bulk_write(struct i2c_client *, int, int, unsigned char *); +extern int pm860x_set_bits(struct i2c_client *, int, unsigned char, +			   unsigned char); + +extern int pm860x_device_init(struct pm860x_chip *chip, +			      struct pm860x_platform_data *pdata) __devinit ; +extern void pm860x_device_exit(struct pm860x_chip *chip) __devexit ; + +#endif /* __LINUX_MFD_88PM860X_H */ diff --git a/include/linux/mfd/ab4500.h b/include/linux/mfd/ab4500.h deleted file mode 100644 index a42a7033ae5..00000000000 --- a/include/linux/mfd/ab4500.h +++ /dev/null @@ -1,262 +0,0 @@ -/* - * Copyright (C) 2009 ST-Ericsson - * - * Author: Srinidhi KASAGAR <srinidhi.kasagar@stericsson.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. - * - * AB4500 device core funtions, for client access - */ -#ifndef MFD_AB4500_H -#define MFD_AB4500_H - -#include <linux/device.h> - -/* - * AB4500 bank addresses - */ -#define AB4500_SYS_CTRL1_BLOCK	0x1 -#define AB4500_SYS_CTRL2_BLOCK	0x2 -#define AB4500_REGU_CTRL1	0x3 -#define AB4500_REGU_CTRL2	0x4 -#define AB4500_USB		0x5 -#define AB4500_TVOUT		0x6 -#define AB4500_DBI		0x7 -#define AB4500_ECI_AV_ACC	0x8 -#define AB4500_RESERVED		0x9 -#define AB4500_GPADC		0xA -#define AB4500_CHARGER		0xB -#define AB4500_GAS_GAUGE	0xC -#define AB4500_AUDIO		0xD -#define AB4500_INTERRUPT	0xE -#define AB4500_RTC		0xF -#define AB4500_MISC		0x10 -#define AB4500_DEBUG		0x12 -#define AB4500_PROD_TEST	0x13 -#define AB4500_OTP_EMUL		0x15 - -/* - * System control 1 register offsets. - * Bank = 0x01 - */ -#define AB4500_TURNON_STAT_REG		0x0100 -#define AB4500_RESET_STAT_REG		0x0101 -#define AB4500_PONKEY1_PRESS_STAT_REG	0x0102 - -#define AB4500_FSM_STAT1_REG		0x0140 -#define AB4500_FSM_STAT2_REG		0x0141 -#define AB4500_SYSCLK_REQ_STAT_REG	0x0142 -#define AB4500_USB_STAT1_REG		0x0143 -#define AB4500_USB_STAT2_REG		0x0144 -#define AB4500_STATUS_SPARE1_REG	0x0145 -#define AB4500_STATUS_SPARE2_REG	0x0146 - -#define AB4500_CTRL1_REG		0x0180 -#define AB4500_CTRL2_REG		0x0181 - -/* - * System control 2 register offsets. - * bank = 0x02 - */ -#define AB4500_CTRL3_REG		0x0200 -#define AB4500_MAIN_WDOG_CTRL_REG	0x0201 -#define AB4500_MAIN_WDOG_TIMER_REG	0x0202 -#define AB4500_LOW_BAT_REG		0x0203 -#define AB4500_BATT_OK_REG		0x0204 -#define AB4500_SYSCLK_TIMER_REG		0x0205 -#define AB4500_SMPSCLK_CTRL_REG		0x0206 -#define AB4500_SMPSCLK_SEL1_REG		0x0207 -#define AB4500_SMPSCLK_SEL2_REG		0x0208 -#define AB4500_SMPSCLK_SEL3_REG		0x0209 -#define AB4500_SYSULPCLK_CONF_REG	0x020A -#define AB4500_SYSULPCLK_CTRL1_REG	0x020B -#define AB4500_SYSCLK_CTRL_REG		0x020C -#define AB4500_SYSCLK_REQ1_VALID_REG	0x020D -#define AB4500_SYSCLK_REQ_VALID_REG	0x020E -#define AB4500_SYSCTRL_SPARE_REG	0x020F -#define AB4500_PAD_CONF_REG		0x0210 - -/* - * Regu control1 register offsets - * Bank = 0x03 - */ -#define AB4500_REGU_SERIAL_CTRL1_REG	0x0300 -#define AB4500_REGU_SERIAL_CTRL2_REG	0x0301 -#define AB4500_REGU_SERIAL_CTRL3_REG	0x0302 -#define AB4500_REGU_REQ_CTRL1_REG	0x0303 -#define AB4500_REGU_REQ_CTRL2_REG	0x0304 -#define AB4500_REGU_REQ_CTRL3_REG	0x0305 -#define AB4500_REGU_REQ_CTRL4_REG	0x0306 -#define AB4500_REGU_MISC1_REG		0x0380 -#define AB4500_REGU_OTGSUPPLY_CTRL_REG	0x0381 -#define AB4500_REGU_VUSB_CTRL_REG	0x0382 -#define AB4500_REGU_VAUDIO_SUPPLY_REG	0x0383 -#define AB4500_REGU_CTRL1_SPARE_REG	0x0384 - -/* - * Regu control2 Vmod register offsets - */ -#define AB4500_REGU_VMOD_REGU_REG	0x0440 -#define AB4500_REGU_VMOD_SEL1_REG	0x0441 -#define AB4500_REGU_VMOD_SEL2_REG	0x0442 -#define AB4500_REGU_CTRL_DISCH_REG	0x0443 -#define AB4500_REGU_CTRL_DISCH2_REG	0x0444 - -/* - * USB/ULPI register offsets - * Bank : 0x5 - */ -#define AB4500_USB_LINE_STAT_REG	0x0580 -#define AB4500_USB_LINE_CTRL1_REG	0x0581 -#define AB4500_USB_LINE_CTRL2_REG	0x0582 -#define AB4500_USB_LINE_CTRL3_REG	0x0583 -#define AB4500_USB_LINE_CTRL4_REG	0x0584 -#define AB4500_USB_LINE_CTRL5_REG	0x0585 -#define AB4500_USB_OTG_CTRL_REG		0x0587 -#define AB4500_USB_OTG_STAT_REG		0x0588 -#define AB4500_USB_OTG_STAT_REG		0x0588 -#define AB4500_USB_CTRL_SPARE_REG	0x0589 -#define AB4500_USB_PHY_CTRL_REG		0x058A - -/* - * TVOUT / CTRL register offsets - * Bank : 0x06 - */ -#define AB4500_TVOUT_CTRL_REG		0x0680 - -/* - * DBI register offsets - * Bank : 0x07 - */ -#define AB4500_DBI_REG1_REG		0x0700 -#define AB4500_DBI_REG2_REG		0x0701 - -/* - * ECI regsiter offsets - * Bank : 0x08 - */ -#define AB4500_ECI_CTRL_REG		0x0800 -#define AB4500_ECI_HOOKLEVEL_REG	0x0801 -#define AB4500_ECI_DATAOUT_REG		0x0802 -#define AB4500_ECI_DATAIN_REG		0x0803 - -/* - * AV Connector register offsets - * Bank : 0x08 - */ -#define AB4500_AV_CONN_REG		0x0840 - -/* - * Accessory detection register offsets - * Bank : 0x08 - */ -#define AB4500_ACC_DET_DB1_REG		0x0880 -#define AB4500_ACC_DET_DB2_REG		0x0881 - -/* - * GPADC register offsets - * Bank : 0x0A - */ -#define AB4500_GPADC_CTRL1_REG		0x0A00 -#define AB4500_GPADC_CTRL2_REG		0x0A01 -#define AB4500_GPADC_CTRL3_REG		0x0A02 -#define AB4500_GPADC_AUTO_TIMER_REG	0x0A03 -#define AB4500_GPADC_STAT_REG		0x0A04 -#define AB4500_GPADC_MANDATAL_REG	0x0A05 -#define AB4500_GPADC_MANDATAH_REG	0x0A06 -#define AB4500_GPADC_AUTODATAL_REG	0x0A07 -#define AB4500_GPADC_AUTODATAH_REG	0x0A08 -#define AB4500_GPADC_MUX_CTRL_REG	0x0A09 - -/* - * Charger / status register offfsets - * Bank : 0x0B - */ -#define AB4500_CH_STATUS1_REG		0x0B00 -#define AB4500_CH_STATUS2_REG		0x0B01 -#define AB4500_CH_USBCH_STAT1_REG	0x0B02 -#define AB4500_CH_USBCH_STAT2_REG	0x0B03 -#define AB4500_CH_FSM_STAT_REG		0x0B04 -#define AB4500_CH_STAT_REG		0x0B05 - -/* - * Charger / control register offfsets - * Bank : 0x0B - */ -#define AB4500_CH_VOLT_LVL_REG		0x0B40 - -/* - * Charger / main control register offfsets - * Bank : 0x0B - */ -#define AB4500_MCH_CTRL1		0x0B80 -#define AB4500_MCH_CTRL2		0x0B81 -#define AB4500_MCH_IPT_CURLVL_REG	0x0B82 -#define AB4500_CH_WD_REG		0x0B83 - -/* - * Charger / USB control register offsets - * Bank : 0x0B - */ -#define AB4500_USBCH_CTRL1_REG		0x0BC0 -#define AB4500_USBCH_CTRL2_REG		0x0BC1 -#define AB4500_USBCH_IPT_CRNTLVL_REG	0x0BC2 - -/* - * RTC bank register offsets - * Bank : 0xF - */ -#define AB4500_RTC_SOFF_STAT_REG	0x0F00 -#define AB4500_RTC_CC_CONF_REG		0x0F01 -#define AB4500_RTC_READ_REQ_REG		0x0F02 -#define AB4500_RTC_WATCH_TSECMID_REG	0x0F03 -#define AB4500_RTC_WATCH_TSECHI_REG	0x0F04 -#define AB4500_RTC_WATCH_TMIN_LOW_REG	0x0F05 -#define AB4500_RTC_WATCH_TMIN_MID_REG	0x0F06 -#define AB4500_RTC_WATCH_TMIN_HI_REG	0x0F07 -#define AB4500_RTC_ALRM_MIN_LOW_REG	0x0F08 -#define AB4500_RTC_ALRM_MIN_MID_REG	0x0F09 -#define AB4500_RTC_ALRM_MIN_HI_REG	0x0F0A -#define AB4500_RTC_STAT_REG		0x0F0B -#define AB4500_RTC_BKUP_CHG_REG		0x0F0C -#define AB4500_RTC_FORCE_BKUP_REG	0x0F0D -#define AB4500_RTC_CALIB_REG		0x0F0E -#define AB4500_RTC_SWITCH_STAT_REG	0x0F0F - -/* - * PWM Out generators - * Bank: 0x10 - */ -#define AB4500_PWM_OUT_CTRL1_REG	0x1060 -#define AB4500_PWM_OUT_CTRL2_REG	0x1061 -#define AB4500_PWM_OUT_CTRL3_REG	0x1062 -#define AB4500_PWM_OUT_CTRL4_REG	0x1063 -#define AB4500_PWM_OUT_CTRL5_REG	0x1064 -#define AB4500_PWM_OUT_CTRL6_REG	0x1065 -#define AB4500_PWM_OUT_CTRL7_REG	0x1066 - -#define AB4500_I2C_PAD_CTRL_REG		0x1067 -#define AB4500_REV_REG			0x1080 - -/** - * struct ab4500 - * @spi: spi device structure - * @tx_buf: transmit buffer - * @rx_buf: receive buffer - * @lock: sync primitive - */ -struct ab4500 { -	struct spi_device	*spi; -	unsigned long		tx_buf[4]; -	unsigned long		rx_buf[4]; -	struct mutex		lock; -}; - -int ab4500_write(struct ab4500 *ab4500, unsigned char block, -		unsigned long addr, unsigned char data); -int ab4500_read(struct ab4500 *ab4500, unsigned char block, -		unsigned long addr); - -#endif /* MFD_AB4500_H */ diff --git a/include/linux/mfd/ab8500.h b/include/linux/mfd/ab8500.h new file mode 100644 index 00000000000..b63ff3ba335 --- /dev/null +++ b/include/linux/mfd/ab8500.h @@ -0,0 +1,128 @@ +/* + * Copyright (C) ST-Ericsson SA 2010 + * + * License Terms: GNU General Public License v2 + * Author: Srinidhi Kasagar <srinidhi.kasagar@stericsson.com> + */ +#ifndef MFD_AB8500_H +#define MFD_AB8500_H + +#include <linux/device.h> + +/* + * Interrupts + */ + +#define AB8500_INT_MAIN_EXT_CH_NOT_OK	0 +#define AB8500_INT_UN_PLUG_TV_DET	1 +#define AB8500_INT_PLUG_TV_DET		2 +#define AB8500_INT_TEMP_WARM		3 +#define AB8500_INT_PON_KEY2DB_F		4 +#define AB8500_INT_PON_KEY2DB_R		5 +#define AB8500_INT_PON_KEY1DB_F		6 +#define AB8500_INT_PON_KEY1DB_R		7 +#define AB8500_INT_BATT_OVV		8 +#define AB8500_INT_MAIN_CH_UNPLUG_DET	10 +#define AB8500_INT_MAIN_CH_PLUG_DET	11 +#define AB8500_INT_USB_ID_DET_F		12 +#define AB8500_INT_USB_ID_DET_R		13 +#define AB8500_INT_VBUS_DET_F		14 +#define AB8500_INT_VBUS_DET_R		15 +#define AB8500_INT_VBUS_CH_DROP_END	16 +#define AB8500_INT_RTC_60S		17 +#define AB8500_INT_RTC_ALARM		18 +#define AB8500_INT_BAT_CTRL_INDB	20 +#define AB8500_INT_CH_WD_EXP		21 +#define AB8500_INT_VBUS_OVV		22 +#define AB8500_INT_MAIN_CH_DROP_END	23 +#define AB8500_INT_CCN_CONV_ACC		24 +#define AB8500_INT_INT_AUD		25 +#define AB8500_INT_CCEOC		26 +#define AB8500_INT_CC_INT_CALIB		27 +#define AB8500_INT_LOW_BAT_F		28 +#define AB8500_INT_LOW_BAT_R		29 +#define AB8500_INT_BUP_CHG_NOT_OK	30 +#define AB8500_INT_BUP_CHG_OK		31 +#define AB8500_INT_GP_HW_ADC_CONV_END	32 +#define AB8500_INT_ACC_DETECT_1DB_F	33 +#define AB8500_INT_ACC_DETECT_1DB_R	34 +#define AB8500_INT_ACC_DETECT_22DB_F	35 +#define AB8500_INT_ACC_DETECT_22DB_R	36 +#define AB8500_INT_ACC_DETECT_21DB_F	37 +#define AB8500_INT_ACC_DETECT_21DB_R	38 +#define AB8500_INT_GP_SW_ADC_CONV_END	39 +#define AB8500_INT_BTEMP_LOW		72 +#define AB8500_INT_BTEMP_LOW_MEDIUM	73 +#define AB8500_INT_BTEMP_MEDIUM_HIGH	74 +#define AB8500_INT_BTEMP_HIGH		75 +#define AB8500_INT_USB_CHARGER_NOT_OK	81 +#define AB8500_INT_ID_WAKEUP_R		82 +#define AB8500_INT_ID_DET_R1R		84 +#define AB8500_INT_ID_DET_R2R		85 +#define AB8500_INT_ID_DET_R3R		86 +#define AB8500_INT_ID_DET_R4R		87 +#define AB8500_INT_ID_WAKEUP_F		88 +#define AB8500_INT_ID_DET_R1F		90 +#define AB8500_INT_ID_DET_R2F		91 +#define AB8500_INT_ID_DET_R3F		92 +#define AB8500_INT_ID_DET_R4F		93 +#define AB8500_INT_USB_CHG_DET_DONE	94 +#define AB8500_INT_USB_CH_TH_PROT_F	96 +#define AB8500_INT_USB_CH_TH_PROP_R	97 +#define AB8500_INT_MAIN_CH_TH_PROP_F	98 +#define AB8500_INT_MAIN_CH_TH_PROT_R	99 +#define AB8500_INT_USB_CHARGER_NOT_OKF	103 + +#define AB8500_NR_IRQS			104 +#define AB8500_NUM_IRQ_REGS		13 + +/** + * struct ab8500 - ab8500 internal structure + * @dev: parent device + * @lock: read/write operations lock + * @irq_lock: genirq bus lock + * @revision: chip revision + * @irq: irq line + * @write: register write + * @read: register read + * @rx_buf: rx buf for SPI + * @tx_buf: tx buf for SPI + * @mask: cache of IRQ regs for bus lock + * @oldmask: cache of previous IRQ regs for bus lock + */ +struct ab8500 { +	struct device	*dev; +	struct mutex	lock; +	struct mutex	irq_lock; +	int		revision; +	int		irq_base; +	int		irq; + +	int (*write) (struct ab8500 *a8500, u16 addr, u8 data); +	int (*read) (struct ab8500 *a8500, u16 addr); + +	unsigned long	tx_buf[4]; +	unsigned long	rx_buf[4]; + +	u8 mask[AB8500_NUM_IRQ_REGS]; +	u8 oldmask[AB8500_NUM_IRQ_REGS]; +}; + +/** + * struct ab8500_platform_data - AB8500 platform data + * @irq_base: start of AB8500 IRQs, AB8500_NR_IRQS will be used + * @init: board-specific initialization after detection of ab8500 + */ +struct ab8500_platform_data { +	int irq_base; +	void (*init) (struct ab8500 *); +}; + +extern int ab8500_write(struct ab8500 *a8500, u16 addr, u8 data); +extern int ab8500_read(struct ab8500 *a8500, u16 addr); +extern int ab8500_set_bits(struct ab8500 *a8500, u16 addr, u8 mask, u8 data); + +extern int __devinit ab8500_init(struct ab8500 *ab8500); +extern int __devexit ab8500_exit(struct ab8500 *ab8500); + +#endif /* MFD_AB8500_H */ diff --git a/include/linux/mfd/ab3100.h b/include/linux/mfd/abx500.h index e9aa4c9d749..390726fcbcb 100644 --- a/include/linux/mfd/ab3100.h +++ b/include/linux/mfd/abx500.h @@ -3,18 +3,37 @@   * License terms: GNU General Public License (GPL) version 2   * AB3100 core access functions   * Author: Linus Walleij <linus.walleij@stericsson.com> + * + * ABX500 core access functions. + * The abx500 interface is used for the Analog Baseband chip + * ab3100, ab3550, ab5500 and possibly comming. It is not used for + * ab4500 and ab8500 since they are another family of chip. + * + * Author: Mattias Wallin <mattias.wallin@stericsson.com> + * Author: Mattias Nilsson <mattias.i.nilsson@stericsson.com> + * Author: Bengt Jonsson <bengt.g.jonsson@stericsson.com> + * Author: Rickard Andersson <rickard.andersson@stericsson.com>   */  #include <linux/device.h> -#include <linux/workqueue.h>  #include <linux/regulator/machine.h> -#ifndef MFD_AB3100_H -#define MFD_AB3100_H +#ifndef MFD_ABX500_H +#define MFD_ABX500_H -#define ABUNKNOWN	0 -#define	AB3000		1 -#define	AB3100		2 +#define AB3100_P1A	0xc0 +#define AB3100_P1B	0xc1 +#define AB3100_P1C	0xc2 +#define AB3100_P1D	0xc3 +#define AB3100_P1E	0xc4 +#define AB3100_P1F	0xc5 +#define AB3100_P1G	0xc6 +#define AB3100_R2A	0xc7 +#define AB3100_R2B	0xc8 +#define AB3550_P1A	0x10 +#define AB5500_1_0	0x20 +#define AB5500_2_0	0x21 +#define AB5500_2_1	0x22  /*   * AB3100, EVENTA1, A2 and A3 event register flags @@ -74,7 +93,6 @@   * @testreg_client: secondary client for test registers   * @chip_name: name of this chip variant   * @chip_id: 8 bit chip ID for this chip variant - * @work: an event handling worker   * @event_subscribers: event subscribers are listed here   * @startup_events: a copy of the first reading of the event registers   * @startup_events_read: whether the first events have been read @@ -90,9 +108,8 @@ struct ab3100 {  	struct i2c_client *testreg_client;  	char chip_name[32];  	u8 chip_id; -	struct work_struct work;  	struct blocking_notifier_head event_subscribers; -	u32 startup_events; +	u8 startup_events[3];  	bool startup_events_read;  }; @@ -115,18 +132,102 @@ struct ab3100_platform_data {  	int external_voltage;  }; -int ab3100_set_register_interruptible(struct ab3100 *ab3100, u8 reg, u8 regval); -int ab3100_get_register_interruptible(struct ab3100 *ab3100, u8 reg, u8 *regval); -int ab3100_get_register_page_interruptible(struct ab3100 *ab3100, -			     u8 first_reg, u8 *regvals, u8 numregs); -int ab3100_mask_and_set_register_interruptible(struct ab3100 *ab3100, -				 u8 reg, u8 andmask, u8 ormask); -u8 ab3100_get_chip_type(struct ab3100 *ab3100);  int ab3100_event_register(struct ab3100 *ab3100,  			  struct notifier_block *nb);  int ab3100_event_unregister(struct ab3100 *ab3100,  			    struct notifier_block *nb); -int ab3100_event_registers_startup_state_get(struct ab3100 *ab3100, -					     u32 *fatevent); +/* AB3550, STR register flags */ +#define AB3550_STR_ONSWA				(0x01) +#define AB3550_STR_ONSWB				(0x02) +#define AB3550_STR_ONSWC				(0x04) +#define AB3550_STR_DCIO					(0x08) +#define AB3550_STR_BOOT_MODE				(0x10) +#define AB3550_STR_SIM_OFF				(0x20) +#define AB3550_STR_BATT_REMOVAL				(0x40) +#define AB3550_STR_VBUS					(0x80) + +/* Interrupt mask registers */ +#define AB3550_IMR1 0x29 +#define AB3550_IMR2 0x2a +#define AB3550_IMR3 0x2b +#define AB3550_IMR4 0x2c +#define AB3550_IMR5 0x2d + +enum ab3550_devid { +	AB3550_DEVID_ADC, +	AB3550_DEVID_DAC, +	AB3550_DEVID_LEDS, +	AB3550_DEVID_POWER, +	AB3550_DEVID_REGULATORS, +	AB3550_DEVID_SIM, +	AB3550_DEVID_UART, +	AB3550_DEVID_RTC, +	AB3550_DEVID_CHARGER, +	AB3550_DEVID_FUELGAUGE, +	AB3550_DEVID_VIBRATOR, +	AB3550_DEVID_CODEC, +	AB3550_NUM_DEVICES, +}; + +/** + * struct abx500_init_setting + * Initial value of the registers for driver to use during setup. + */ +struct abx500_init_settings { +	u8 bank; +	u8 reg; +	u8 setting; +}; + +/** + * struct ab3550_platform_data + * Data supplied to initialize board connections to the AB3550 + */ +struct ab3550_platform_data { +	struct {unsigned int base; unsigned int count; } irq; +	void *dev_data[AB3550_NUM_DEVICES]; +	size_t dev_data_sz[AB3550_NUM_DEVICES]; +	struct abx500_init_settings *init_settings; +	unsigned int init_settings_sz; +}; + +int abx500_set_register_interruptible(struct device *dev, u8 bank, u8 reg, +	u8 value); +int abx500_get_register_interruptible(struct device *dev, u8 bank, u8 reg, +	u8 *value); +int abx500_get_register_page_interruptible(struct device *dev, u8 bank, +	u8 first_reg, u8 *regvals, u8 numregs); +int abx500_set_register_page_interruptible(struct device *dev, u8 bank, +	u8 first_reg, u8 *regvals, u8 numregs); +/** + * abx500_mask_and_set_register_inerruptible() - Modifies selected bits of a + *	target register + * + * @dev: The AB sub device. + * @bank: The i2c bank number. + * @bitmask: The bit mask to use. + * @bitvalues: The new bit values. + * + * Updates the value of an AB register: + * value -> ((value & ~bitmask) | (bitvalues & bitmask)) + */ +int abx500_mask_and_set_register_interruptible(struct device *dev, u8 bank, +	u8 reg, u8 bitmask, u8 bitvalues); +int abx500_get_chip_id(struct device *dev); +int abx500_event_registers_startup_state_get(struct device *dev, u8 *event); +int abx500_startup_irq_enabled(struct device *dev, unsigned int irq); + +struct abx500_ops { +	int (*get_chip_id) (struct device *); +	int (*get_register) (struct device *, u8, u8, u8 *); +	int (*set_register) (struct device *, u8, u8, u8); +	int (*get_register_page) (struct device *, u8, u8, u8 *, u8); +	int (*set_register_page) (struct device *, u8, u8, u8 *, u8); +	int (*mask_and_set_register) (struct device *, u8, u8, u8, u8); +	int (*event_registers_startup_state_get) (struct device *, u8 *); +	int (*startup_irq_enabled) (struct device *, unsigned int); +}; + +int abx500_register_ops(struct device *core_dev, struct abx500_ops *ops);  #endif diff --git a/include/linux/mfd/davinci_voicecodec.h b/include/linux/mfd/davinci_voicecodec.h new file mode 100644 index 00000000000..0ab61320ffa --- /dev/null +++ b/include/linux/mfd/davinci_voicecodec.h @@ -0,0 +1,126 @@ +/* + * DaVinci Voice Codec Core Interface for TI platforms + * + * Copyright (C) 2010 Texas Instruments, Inc + * + * Author: Miguel Aguilar <miguel.aguilar@ridgerun.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef __LINUX_MFD_DAVINCI_VOICECODEC_H_ +#define __LINUX_MFD_DAVINIC_VOICECODEC_H_ + +#include <linux/kernel.h> +#include <linux/platform_device.h> +#include <linux/mfd/core.h> + +#include <mach/edma.h> + +/* + * Register values. + */ +#define DAVINCI_VC_PID			0x00 +#define DAVINCI_VC_CTRL			0x04 +#define DAVINCI_VC_INTEN		0x08 +#define DAVINCI_VC_INTSTATUS		0x0c +#define DAVINCI_VC_INTCLR		0x10 +#define DAVINCI_VC_EMUL_CTRL		0x14 +#define DAVINCI_VC_RFIFO		0x20 +#define DAVINCI_VC_WFIFO		0x24 +#define DAVINCI_VC_FIFOSTAT		0x28 +#define DAVINCI_VC_TST_CTRL		0x2C +#define DAVINCI_VC_REG05		0x94 +#define DAVINCI_VC_REG09		0xA4 +#define DAVINCI_VC_REG12		0xB0 + +/* DAVINCI_VC_CTRL bit fields */ +#define DAVINCI_VC_CTRL_MASK		0x5500 +#define DAVINCI_VC_CTRL_RSTADC		BIT(0) +#define DAVINCI_VC_CTRL_RSTDAC		BIT(1) +#define DAVINCI_VC_CTRL_RD_BITS_8	BIT(4) +#define DAVINCI_VC_CTRL_RD_UNSIGNED	BIT(5) +#define DAVINCI_VC_CTRL_WD_BITS_8	BIT(6) +#define DAVINCI_VC_CTRL_WD_UNSIGNED	BIT(7) +#define DAVINCI_VC_CTRL_RFIFOEN		BIT(8) +#define DAVINCI_VC_CTRL_RFIFOCL		BIT(9) +#define DAVINCI_VC_CTRL_RFIFOMD_WORD_1	BIT(10) +#define DAVINCI_VC_CTRL_WFIFOEN		BIT(12) +#define DAVINCI_VC_CTRL_WFIFOCL		BIT(13) +#define DAVINCI_VC_CTRL_WFIFOMD_WORD_1	BIT(14) + +/* DAVINCI_VC_INT bit fields */ +#define DAVINCI_VC_INT_MASK		0x3F +#define DAVINCI_VC_INT_RDRDY_MASK	BIT(0) +#define DAVINCI_VC_INT_RERROVF_MASK	BIT(1) +#define DAVINCI_VC_INT_RERRUDR_MASK	BIT(2) +#define DAVINCI_VC_INT_WDREQ_MASK	BIT(3) +#define DAVINCI_VC_INT_WERROVF_MASKBIT	BIT(4) +#define DAVINCI_VC_INT_WERRUDR_MASK	BIT(5) + +/* DAVINCI_VC_REG05 bit fields */ +#define DAVINCI_VC_REG05_PGA_GAIN	0x07 + +/* DAVINCI_VC_REG09 bit fields */ +#define DAVINCI_VC_REG09_MUTE		0x40 +#define DAVINCI_VC_REG09_DIG_ATTEN	0x3F + +/* DAVINCI_VC_REG12 bit fields */ +#define DAVINCI_VC_REG12_POWER_ALL_ON	0xFD +#define DAVINCI_VC_REG12_POWER_ALL_OFF	0x00 + +#define DAVINCI_VC_CELLS		2 + +enum davinci_vc_cells { +	DAVINCI_VC_VCIF_CELL, +	DAVINCI_VC_CQ93VC_CELL, +}; + +struct davinci_vcif { +	struct platform_device	*pdev; +	u32 dma_tx_channel; +	u32 dma_rx_channel; +	dma_addr_t dma_tx_addr; +	dma_addr_t dma_rx_addr; +}; + +struct cq93vc { +	struct platform_device *pdev; +	struct snd_soc_codec *codec; +	u32 sysclk; +}; + +struct davinci_vc; + +struct davinci_vc { +	/* Device data */ +	struct device *dev; +	struct platform_device *pdev; +	struct clk *clk; + +	/* Memory resources */ +	void __iomem *base; +	resource_size_t pbase; +	size_t base_size; + +	/* MFD cells */ +	struct mfd_cell cells[DAVINCI_VC_CELLS]; + +	/* Client devices */ +	struct davinci_vcif davinci_vcif; +	struct cq93vc cq93vc; +}; + +#endif diff --git a/include/linux/mfd/janz.h b/include/linux/mfd/janz.h new file mode 100644 index 00000000000..e9994c46980 --- /dev/null +++ b/include/linux/mfd/janz.h @@ -0,0 +1,54 @@ +/* + * Common Definitions for Janz MODULbus devices + * + * Copyright (c) 2010 Ira W. Snyder <iws@ovro.caltech.edu> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + */ + +#ifndef JANZ_H +#define JANZ_H + +struct janz_platform_data { +	/* MODULbus Module Number */ +	unsigned int modno; +}; + +/* PLX bridge chip onboard registers */ +struct janz_cmodio_onboard_regs { +	u8 unused1; + +	/* +	 * Read access: interrupt status +	 * Write access: interrupt disable +	 */ +	u8 int_disable; +	u8 unused2; + +	/* +	 * Read access: MODULbus number (hex switch) +	 * Write access: interrupt enable +	 */ +	u8 int_enable; +	u8 unused3; + +	/* write-only */ +	u8 reset_assert; +	u8 unused4; + +	/* write-only */ +	u8 reset_deassert; +	u8 unused5; + +	/* read-write access to serial EEPROM */ +	u8 eep; +	u8 unused6; + +	/* write-only access to EEPROM chip select */ +	u8 enid; +}; + +#endif /* JANZ_H */ diff --git a/include/linux/mfd/max8925.h b/include/linux/mfd/max8925.h new file mode 100644 index 00000000000..5259dfe8c58 --- /dev/null +++ b/include/linux/mfd/max8925.h @@ -0,0 +1,253 @@ +/* + * Maxim8925 Interface + * + * Copyright (C) 2009 Marvell International Ltd. + *	Haojian Zhuang <haojian.zhuang@marvell.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_MFD_MAX8925_H +#define __LINUX_MFD_MAX8925_H + +#include <linux/mutex.h> +#include <linux/interrupt.h> + +/* Unified sub device IDs for MAX8925 */ +enum { +	MAX8925_ID_SD1, +	MAX8925_ID_SD2, +	MAX8925_ID_SD3, +	MAX8925_ID_LDO1, +	MAX8925_ID_LDO2, +	MAX8925_ID_LDO3, +	MAX8925_ID_LDO4, +	MAX8925_ID_LDO5, +	MAX8925_ID_LDO6, +	MAX8925_ID_LDO7, +	MAX8925_ID_LDO8, +	MAX8925_ID_LDO9, +	MAX8925_ID_LDO10, +	MAX8925_ID_LDO11, +	MAX8925_ID_LDO12, +	MAX8925_ID_LDO13, +	MAX8925_ID_LDO14, +	MAX8925_ID_LDO15, +	MAX8925_ID_LDO16, +	MAX8925_ID_LDO17, +	MAX8925_ID_LDO18, +	MAX8925_ID_LDO19, +	MAX8925_ID_LDO20, +	MAX8925_ID_MAX, +}; + +enum { +	/* +	 * Charging current threshold trigger going from fast charge +	 * to TOPOFF charge. From 5% to 20% of fasting charging current. +	 */ +	MAX8925_TOPOFF_THR_5PER, +	MAX8925_TOPOFF_THR_10PER, +	MAX8925_TOPOFF_THR_15PER, +	MAX8925_TOPOFF_THR_20PER, +}; + +enum { +	/* Fast charging current */ +	MAX8925_FCHG_85MA, +	MAX8925_FCHG_300MA, +	MAX8925_FCHG_460MA, +	MAX8925_FCHG_600MA, +	MAX8925_FCHG_700MA, +	MAX8925_FCHG_800MA, +	MAX8925_FCHG_900MA, +	MAX8925_FCHG_1000MA, +}; + +/* Charger registers */ +#define MAX8925_CHG_IRQ1		(0x7e) +#define MAX8925_CHG_IRQ2		(0x7f) +#define MAX8925_CHG_IRQ1_MASK		(0x80) +#define MAX8925_CHG_IRQ2_MASK		(0x81) +#define MAX8925_CHG_STATUS		(0x82) + +/* GPM registers */ +#define MAX8925_SYSENSEL		(0x00) +#define MAX8925_ON_OFF_IRQ1		(0x01) +#define MAX8925_ON_OFF_IRQ1_MASK	(0x02) +#define MAX8925_ON_OFF_STATUS		(0x03) +#define MAX8925_ON_OFF_IRQ2		(0x0d) +#define MAX8925_ON_OFF_IRQ2_MASK	(0x0e) +#define MAX8925_RESET_CNFG		(0x0f) + +/* Touch registers */ +#define MAX8925_TSC_IRQ			(0x00) +#define MAX8925_TSC_IRQ_MASK		(0x01) +#define MAX8925_TSC_CNFG1		(0x02) +#define MAX8925_ADC_SCHED		(0x10) +#define MAX8925_ADC_RES_END		(0x6f) + +#define MAX8925_NREF_OK			(1 << 4) + +/* RTC registers */ +#define MAX8925_ALARM0_CNTL		(0x18) +#define MAX8925_ALARM1_CNTL		(0x19) +#define MAX8925_RTC_IRQ			(0x1c) +#define MAX8925_RTC_IRQ_MASK		(0x1d) +#define MAX8925_MPL_CNTL		(0x1e) + +/* WLED registers */ +#define MAX8925_WLED_MODE_CNTL		(0x84) +#define MAX8925_WLED_CNTL		(0x85) + +/* MAX8925 Registers */ +#define MAX8925_SDCTL1			(0x04) +#define MAX8925_SDCTL2			(0x07) +#define MAX8925_SDCTL3			(0x0A) +#define MAX8925_SDV1			(0x06) +#define MAX8925_SDV2			(0x09) +#define MAX8925_SDV3			(0x0C) +#define MAX8925_LDOCTL1			(0x18) +#define MAX8925_LDOCTL2			(0x1C) +#define MAX8925_LDOCTL3			(0x20) +#define MAX8925_LDOCTL4			(0x24) +#define MAX8925_LDOCTL5			(0x28) +#define MAX8925_LDOCTL6			(0x2C) +#define MAX8925_LDOCTL7			(0x30) +#define MAX8925_LDOCTL8			(0x34) +#define MAX8925_LDOCTL9			(0x38) +#define MAX8925_LDOCTL10		(0x3C) +#define MAX8925_LDOCTL11		(0x40) +#define MAX8925_LDOCTL12		(0x44) +#define MAX8925_LDOCTL13		(0x48) +#define MAX8925_LDOCTL14		(0x4C) +#define MAX8925_LDOCTL15		(0x50) +#define MAX8925_LDOCTL16		(0x10) +#define MAX8925_LDOCTL17		(0x14) +#define MAX8925_LDOCTL18		(0x72) +#define MAX8925_LDOCTL19		(0x5C) +#define MAX8925_LDOCTL20		(0x9C) +#define MAX8925_LDOVOUT1		(0x1A) +#define MAX8925_LDOVOUT2		(0x1E) +#define MAX8925_LDOVOUT3		(0x22) +#define MAX8925_LDOVOUT4		(0x26) +#define MAX8925_LDOVOUT5		(0x2A) +#define MAX8925_LDOVOUT6		(0x2E) +#define MAX8925_LDOVOUT7		(0x32) +#define MAX8925_LDOVOUT8		(0x36) +#define MAX8925_LDOVOUT9		(0x3A) +#define MAX8925_LDOVOUT10		(0x3E) +#define MAX8925_LDOVOUT11		(0x42) +#define MAX8925_LDOVOUT12		(0x46) +#define MAX8925_LDOVOUT13		(0x4A) +#define MAX8925_LDOVOUT14		(0x4E) +#define MAX8925_LDOVOUT15		(0x52) +#define MAX8925_LDOVOUT16		(0x12) +#define MAX8925_LDOVOUT17		(0x16) +#define MAX8925_LDOVOUT18		(0x74) +#define MAX8925_LDOVOUT19		(0x5E) +#define MAX8925_LDOVOUT20		(0x9E) + +/* bit definitions */ +#define CHG_IRQ1_MASK			(0x07) +#define CHG_IRQ2_MASK			(0xff) +#define ON_OFF_IRQ1_MASK		(0xff) +#define ON_OFF_IRQ2_MASK		(0x03) +#define TSC_IRQ_MASK			(0x03) +#define RTC_IRQ_MASK			(0x0c) + +#define MAX8925_MAX_REGULATOR		(23) + +#define MAX8925_NAME_SIZE		(32) + +/* IRQ definitions */ +enum { +	MAX8925_IRQ_VCHG_DC_OVP, +	MAX8925_IRQ_VCHG_DC_F, +	MAX8925_IRQ_VCHG_DC_R, +	MAX8925_IRQ_VCHG_USB_OVP, +	MAX8925_IRQ_VCHG_USB_F, +	MAX8925_IRQ_VCHG_USB_R, +	MAX8925_IRQ_VCHG_THM_OK_R, +	MAX8925_IRQ_VCHG_THM_OK_F, +	MAX8925_IRQ_VCHG_SYSLOW_F, +	MAX8925_IRQ_VCHG_SYSLOW_R, +	MAX8925_IRQ_VCHG_RST, +	MAX8925_IRQ_VCHG_DONE, +	MAX8925_IRQ_VCHG_TOPOFF, +	MAX8925_IRQ_VCHG_TMR_FAULT, +	MAX8925_IRQ_GPM_RSTIN, +	MAX8925_IRQ_GPM_MPL, +	MAX8925_IRQ_GPM_SW_3SEC, +	MAX8925_IRQ_GPM_EXTON_F, +	MAX8925_IRQ_GPM_EXTON_R, +	MAX8925_IRQ_GPM_SW_1SEC, +	MAX8925_IRQ_GPM_SW_F, +	MAX8925_IRQ_GPM_SW_R, +	MAX8925_IRQ_GPM_SYSCKEN_F, +	MAX8925_IRQ_GPM_SYSCKEN_R, +	MAX8925_IRQ_RTC_ALARM1, +	MAX8925_IRQ_RTC_ALARM0, +	MAX8925_IRQ_TSC_STICK, +	MAX8925_IRQ_TSC_NSTICK, +	MAX8925_NR_IRQS, +}; + +struct max8925_chip { +	struct device		*dev; +	struct i2c_client	*i2c; +	struct i2c_client	*adc; +	struct i2c_client	*rtc; +	struct mutex		io_lock; +	struct mutex		irq_lock; + +	int			irq_base; +	int			core_irq; +	int			tsc_irq; +}; + +struct max8925_backlight_pdata { +	int	lxw_scl;	/* 0/1 -- 0.8Ohm/0.4Ohm */ +	int	lxw_freq;	/* 700KHz ~ 1400KHz */ +	int	dual_string;	/* 0/1 -- single/dual string */ +}; + +struct max8925_touch_pdata { +	unsigned int		flags; +}; + +struct max8925_power_pdata { +	int		(*set_charger)(int); +	unsigned	batt_detect:1; +	unsigned	topoff_threshold:2; +	unsigned	fast_charge:3;	/* charge current */ +}; + +/* + * irq_base: stores IRQ base number of MAX8925 in platform + * tsc_irq: stores IRQ number of MAX8925 TSC + */ +struct max8925_platform_data { +	struct max8925_backlight_pdata	*backlight; +	struct max8925_touch_pdata	*touch; +	struct max8925_power_pdata	*power; +	struct regulator_init_data	*regulator[MAX8925_MAX_REGULATOR]; + +	int		irq_base; +	int		tsc_irq; +}; + +extern int max8925_reg_read(struct i2c_client *, int); +extern int max8925_reg_write(struct i2c_client *, int, unsigned char); +extern int max8925_bulk_read(struct i2c_client *, int, int, unsigned char *); +extern int max8925_bulk_write(struct i2c_client *, int, int, unsigned char *); +extern int max8925_set_bits(struct i2c_client *, int, unsigned char, +			unsigned char); + +extern int max8925_device_init(struct max8925_chip *, +				struct max8925_platform_data *); +extern void max8925_device_exit(struct max8925_chip *); +#endif /* __LINUX_MFD_MAX8925_H */ + diff --git a/include/linux/mfd/mc13783.h b/include/linux/mfd/mc13783.h index 35680409b8c..4a894f68854 100644 --- a/include/linux/mfd/mc13783.h +++ b/include/linux/mfd/mc13783.h @@ -26,10 +26,30 @@ int mc13783_irq_request(struct mc13783 *mc13783, int irq,  int mc13783_irq_request_nounmask(struct mc13783 *mc13783, int irq,  		irq_handler_t handler, const char *name, void *dev);  int mc13783_irq_free(struct mc13783 *mc13783, int irq, void *dev); -int mc13783_ackirq(struct mc13783 *mc13783, int irq); -int mc13783_mask(struct mc13783 *mc13783, int irq); -int mc13783_unmask(struct mc13783 *mc13783, int irq); +int mc13783_irq_mask(struct mc13783 *mc13783, int irq); +int mc13783_irq_unmask(struct mc13783 *mc13783, int irq); +int mc13783_irq_status(struct mc13783 *mc13783, int irq, +		int *enabled, int *pending); +int mc13783_irq_ack(struct mc13783 *mc13783, int irq); + +static inline int mc13783_mask(struct mc13783 *mc13783, int irq) __deprecated; +static inline int mc13783_mask(struct mc13783 *mc13783, int irq) +{ +	return mc13783_irq_mask(mc13783, irq); +} + +static inline int mc13783_unmask(struct mc13783 *mc13783, int irq) __deprecated; +static inline int mc13783_unmask(struct mc13783 *mc13783, int irq) +{ +	return mc13783_irq_unmask(mc13783, irq); +} + +static inline int mc13783_ackirq(struct mc13783 *mc13783, int irq) __deprecated; +static inline int mc13783_ackirq(struct mc13783 *mc13783, int irq) +{ +	return mc13783_irq_ack(mc13783, irq); +}  #define MC13783_ADC0		43  #define MC13783_ADC0_ADREFEN		(1 << 10) @@ -44,6 +64,70 @@ int mc13783_unmask(struct mc13783 *mc13783, int irq);  					MC13783_ADC0_TSMOD1 | \  					MC13783_ADC0_TSMOD2) +struct mc13783_led_platform_data { +#define MC13783_LED_MD		0 +#define MC13783_LED_AD		1 +#define MC13783_LED_KP		2 +#define MC13783_LED_R1		3 +#define MC13783_LED_G1		4 +#define MC13783_LED_B1		5 +#define MC13783_LED_R2		6 +#define MC13783_LED_G2		7 +#define MC13783_LED_B2		8 +#define MC13783_LED_R3		9 +#define MC13783_LED_G3		10 +#define MC13783_LED_B3		11 +#define MC13783_LED_MAX MC13783_LED_B3 +	int id; +	const char *name; +	const char *default_trigger; + +/* Three or two bits current selection depending on the led */ +	char max_current; +}; + +struct mc13783_leds_platform_data { +	int num_leds; +	struct mc13783_led_platform_data *led; + +#define MC13783_LED_TRIODE_MD	(1 << 0) +#define MC13783_LED_TRIODE_AD	(1 << 1) +#define MC13783_LED_TRIODE_KP	(1 << 2) +#define MC13783_LED_BOOST_EN	(1 << 3) +#define MC13783_LED_TC1HALF	(1 << 4) +#define MC13783_LED_SLEWLIMTC	(1 << 5) +#define MC13783_LED_SLEWLIMBL	(1 << 6) +#define MC13783_LED_TRIODE_TC1	(1 << 7) +#define MC13783_LED_TRIODE_TC2	(1 << 8) +#define MC13783_LED_TRIODE_TC3	(1 << 9) +	int flags; + +#define MC13783_LED_AB_DISABLED		0 +#define MC13783_LED_AB_MD1		1 +#define MC13783_LED_AB_MD12		2 +#define MC13783_LED_AB_MD123		3 +#define MC13783_LED_AB_MD1234		4 +#define MC13783_LED_AB_MD1234_AD1	5 +#define MC13783_LED_AB_MD1234_AD12	6 +#define MC13783_LED_AB_MD1_AD		7 +	char abmode; + +#define MC13783_LED_ABREF_200MV	0 +#define MC13783_LED_ABREF_400MV	1 +#define MC13783_LED_ABREF_600MV	2 +#define MC13783_LED_ABREF_800MV	3 +	char abref; + +#define MC13783_LED_PERIOD_10MS		0 +#define MC13783_LED_PERIOD_100MS	1 +#define MC13783_LED_PERIOD_500MS	2 +#define MC13783_LED_PERIOD_2S		3 +	char bl_period; +	char tc1_period; +	char tc2_period; +	char tc3_period; +}; +  /* to be cleaned up */  struct regulator_init_data; @@ -60,12 +144,14 @@ struct mc13783_regulator_platform_data {  struct mc13783_platform_data {  	int num_regulators;  	struct mc13783_regulator_init_data *regulators; +	struct mc13783_leds_platform_data *leds;  #define MC13783_USE_TOUCHSCREEN (1 << 0)  #define MC13783_USE_CODEC	(1 << 1)  #define MC13783_USE_ADC		(1 << 2)  #define MC13783_USE_RTC		(1 << 3)  #define MC13783_USE_REGULATOR	(1 << 4) +#define MC13783_USE_LED		(1 << 5)  	unsigned int flags;  }; @@ -108,6 +194,8 @@ int mc13783_adc_do_conversion(struct mc13783 *mc13783, unsigned int mode,  #define	MC13783_REGU_V2		28  #define	MC13783_REGU_V3		29  #define	MC13783_REGU_V4		30 +#define	MC13783_REGU_PWGT1SPI	31 +#define	MC13783_REGU_PWGT2SPI	32  #define MC13783_IRQ_ADCDONE	0  #define MC13783_IRQ_ADCBISDONE	1 diff --git a/include/linux/mfd/pcf50633/backlight.h b/include/linux/mfd/pcf50633/backlight.h new file mode 100644 index 00000000000..83747e217b2 --- /dev/null +++ b/include/linux/mfd/pcf50633/backlight.h @@ -0,0 +1,51 @@ +/* + *  Copyright (C) 2009-2010, Lars-Peter Clausen <lars@metafoo.de> + *      PCF50633 backlight device driver + * + *  This program is free software; you can redistribute	 it and/or modify it + *  under  the terms of	 the GNU General  Public License as published by the + *  Free Software Foundation;  either version 2 of the	License, or (at your + *  option) any later version. + * + *  You should have received a copy of the  GNU General Public License along + *  with this program; if not, write  to the Free Software Foundation, Inc., + *  675 Mass Ave, Cambridge, MA 02139, USA. + * + */ + +#ifndef __LINUX_MFD_PCF50633_BACKLIGHT +#define __LINUX_MFD_PCF50633_BACKLIGHT + +/* +* @default_brightness: Backlight brightness is initialized to this value +* +* Brightness to be used after the driver has been probed. +* Valid range 0-63. +* +* @default_brightness_limit: The actual brightness is limited by this value +* +* Brightness limit to be used after the driver has been probed. This is useful +* when it is not known how much power is available for the backlight during +* probe. +* Valid range 0-63. Can be changed later with pcf50633_bl_set_brightness_limit. +* +* @ramp_time: Display ramp time when changing brightness +* +* When changing the backlights brightness the change is not instant, instead +* it fades smooth from one state to another. This value specifies how long +* the fade should take. The lower the value the higher the fade time. +* Valid range 0-255 +*/ +struct pcf50633_bl_platform_data { +	unsigned int	default_brightness; +	unsigned int	default_brightness_limit; +	uint8_t		ramp_time; +}; + + +struct pcf50633; + +int pcf50633_bl_set_brightness_limit(struct pcf50633 *pcf, unsigned int limit); + +#endif + diff --git a/include/linux/mfd/pcf50633/core.h b/include/linux/mfd/pcf50633/core.h index 3398bd9aab1..ad411a78870 100644 --- a/include/linux/mfd/pcf50633/core.h +++ b/include/linux/mfd/pcf50633/core.h @@ -18,6 +18,7 @@  #include <linux/regulator/driver.h>  #include <linux/regulator/machine.h>  #include <linux/power_supply.h> +#include <linux/mfd/pcf50633/backlight.h>  struct pcf50633; @@ -43,6 +44,8 @@ struct pcf50633_platform_data {  	void (*force_shutdown)(struct pcf50633 *);  	u8 resumers[5]; + +	struct pcf50633_bl_platform_data *backlight_data;  };  struct pcf50633_irq { @@ -152,6 +155,7 @@ struct pcf50633 {  	struct platform_device *mbc_pdev;  	struct platform_device *adc_pdev;  	struct platform_device *input_pdev; +	struct platform_device *bl_pdev;  	struct platform_device *regulator_pdev[PCF50633_NUM_REGULATORS];  }; diff --git a/include/linux/mfd/rdc321x.h b/include/linux/mfd/rdc321x.h new file mode 100644 index 00000000000..4bdf19c8eed --- /dev/null +++ b/include/linux/mfd/rdc321x.h @@ -0,0 +1,26 @@ +#ifndef __RDC321X_MFD_H +#define __RDC321X_MFD_H + +#include <linux/types.h> +#include <linux/pci.h> + +/* Offsets to be accessed in the southbridge PCI + * device configuration register */ +#define RDC321X_WDT_CTRL	0x44 +#define RDC321X_GPIO_CTRL_REG1	0x48 +#define RDC321X_GPIO_DATA_REG1	0x4c +#define RDC321X_GPIO_CTRL_REG2	0x84 +#define RDC321X_GPIO_DATA_REG2	0x88 + +#define RDC321X_MAX_GPIO	58 + +struct rdc321x_gpio_pdata { +	struct pci_dev *sb_pdev; +	unsigned max_gpios; +}; + +struct rdc321x_wdt_pdata { +	struct pci_dev *sb_pdev; +}; + +#endif /* __RDC321X_MFD_H */ diff --git a/include/linux/mfd/sh_mobile_sdhi.h b/include/linux/mfd/sh_mobile_sdhi.h index 3bcd7163485..49067802a6d 100644 --- a/include/linux/mfd/sh_mobile_sdhi.h +++ b/include/linux/mfd/sh_mobile_sdhi.h @@ -1,7 +1,13 @@  #ifndef __SH_MOBILE_SDHI_H__  #define __SH_MOBILE_SDHI_H__ +#include <linux/types.h> +  struct sh_mobile_sdhi_info { +	int dma_slave_tx; +	int dma_slave_rx; +	unsigned long tmio_flags; +	u32 tmio_ocr_mask;	/* available MMC voltages */  	void (*set_pwr)(struct platform_device *pdev, int state);  }; diff --git a/include/linux/mfd/tc35892.h b/include/linux/mfd/tc35892.h new file mode 100644 index 00000000000..e47f770d306 --- /dev/null +++ b/include/linux/mfd/tc35892.h @@ -0,0 +1,132 @@ +/* + * Copyright (C) ST-Ericsson SA 2010 + * + * License Terms: GNU General Public License, version 2 + */ + +#ifndef __LINUX_MFD_TC35892_H +#define __LINUX_MFD_TC35892_H + +#include <linux/device.h> + +#define TC35892_RSTCTRL_IRQRST	(1 << 4) +#define TC35892_RSTCTRL_TIMRST	(1 << 3) +#define TC35892_RSTCTRL_ROTRST	(1 << 2) +#define TC35892_RSTCTRL_KBDRST	(1 << 1) +#define TC35892_RSTCTRL_GPIRST	(1 << 0) + +#define TC35892_IRQST		0x91 + +#define TC35892_MANFCODE_MAGIC	0x03 +#define TC35892_MANFCODE	0x80 +#define TC35892_VERSION		0x81 +#define TC35892_IOCFG		0xA7 + +#define TC35892_CLKMODE		0x88 +#define TC35892_CLKCFG		0x89 +#define TC35892_CLKEN		0x8A + +#define TC35892_RSTCTRL		0x82 +#define TC35892_EXTRSTN		0x83 +#define TC35892_RSTINTCLR	0x84 + +#define TC35892_GPIOIS0		0xC9 +#define TC35892_GPIOIS1		0xCA +#define TC35892_GPIOIS2		0xCB +#define TC35892_GPIOIBE0	0xCC +#define TC35892_GPIOIBE1	0xCD +#define TC35892_GPIOIBE2	0xCE +#define TC35892_GPIOIEV0	0xCF +#define TC35892_GPIOIEV1	0xD0 +#define TC35892_GPIOIEV2	0xD1 +#define TC35892_GPIOIE0		0xD2 +#define TC35892_GPIOIE1		0xD3 +#define TC35892_GPIOIE2		0xD4 +#define TC35892_GPIORIS0	0xD6 +#define TC35892_GPIORIS1	0xD7 +#define TC35892_GPIORIS2	0xD8 +#define TC35892_GPIOMIS0	0xD9 +#define TC35892_GPIOMIS1	0xDA +#define TC35892_GPIOMIS2	0xDB +#define TC35892_GPIOIC0		0xDC +#define TC35892_GPIOIC1		0xDD +#define TC35892_GPIOIC2		0xDE + +#define TC35892_GPIODATA0	0xC0 +#define TC35892_GPIOMASK0	0xc1 +#define TC35892_GPIODATA1	0xC2 +#define TC35892_GPIOMASK1	0xc3 +#define TC35892_GPIODATA2	0xC4 +#define TC35892_GPIOMASK2	0xC5 + +#define TC35892_GPIODIR0	0xC6 +#define TC35892_GPIODIR1	0xC7 +#define TC35892_GPIODIR2	0xC8 + +#define TC35892_GPIOSYNC0	0xE6 +#define TC35892_GPIOSYNC1	0xE7 +#define TC35892_GPIOSYNC2	0xE8 + +#define TC35892_GPIOWAKE0	0xE9 +#define TC35892_GPIOWAKE1	0xEA +#define TC35892_GPIOWAKE2	0xEB + +#define TC35892_GPIOODM0	0xE0 +#define TC35892_GPIOODE0	0xE1 +#define TC35892_GPIOODM1	0xE2 +#define TC35892_GPIOODE1	0xE3 +#define TC35892_GPIOODM2	0xE4 +#define TC35892_GPIOODE2	0xE5 + +#define TC35892_INT_GPIIRQ	0 +#define TC35892_INT_TI0IRQ	1 +#define TC35892_INT_TI1IRQ	2 +#define TC35892_INT_TI2IRQ	3 +#define TC35892_INT_ROTIRQ	5 +#define TC35892_INT_KBDIRQ	6 +#define TC35892_INT_PORIRQ	7 + +#define TC35892_NR_INTERNAL_IRQS	8 +#define TC35892_INT_GPIO(x)	(TC35892_NR_INTERNAL_IRQS + (x)) + +struct tc35892 { +	struct mutex lock; +	struct device *dev; +	struct i2c_client *i2c; + +	int irq_base; +	int num_gpio; +	struct tc35892_platform_data *pdata; +}; + +extern int tc35892_reg_write(struct tc35892 *tc35892, u8 reg, u8 data); +extern int tc35892_reg_read(struct tc35892 *tc35892, u8 reg); +extern int tc35892_block_read(struct tc35892 *tc35892, u8 reg, u8 length, +			      u8 *values); +extern int tc35892_block_write(struct tc35892 *tc35892, u8 reg, u8 length, +			       const u8 *values); +extern int tc35892_set_bits(struct tc35892 *tc35892, u8 reg, u8 mask, u8 val); + +/** + * struct tc35892_gpio_platform_data - TC35892 GPIO platform data + * @gpio_base: first gpio number assigned to TC35892.  A maximum of + *	       %TC35892_NR_GPIOS GPIOs will be allocated. + */ +struct tc35892_gpio_platform_data { +	int gpio_base; +}; + +/** + * struct tc35892_platform_data - TC35892 platform data + * @irq_base: base IRQ number.  %TC35892_NR_IRQS irqs will be used. + * @gpio: GPIO-specific platform data + */ +struct tc35892_platform_data { +	int irq_base; +	struct tc35892_gpio_platform_data *gpio; +}; + +#define TC35892_NR_GPIOS	24 +#define TC35892_NR_IRQS		TC35892_INT_GPIO(TC35892_NR_GPIOS) + +#endif diff --git a/include/linux/mfd/tmio.h b/include/linux/mfd/tmio.h index 9cb1834deff..f07425bc3dc 100644 --- a/include/linux/mfd/tmio.h +++ b/include/linux/mfd/tmio.h @@ -50,16 +50,28 @@  		tmio_iowrite16((val) >> 16, (base) + ((reg + 2) << (shift))); \  	} while (0) +/* tmio MMC platform flags */ +#define TMIO_MMC_WRPROTECT_DISABLE	(1 << 0) +  int tmio_core_mmc_enable(void __iomem *cnf, int shift, unsigned long base);  int tmio_core_mmc_resume(void __iomem *cnf, int shift, unsigned long base);  void tmio_core_mmc_pwr(void __iomem *cnf, int shift, int state);  void tmio_core_mmc_clk_div(void __iomem *cnf, int shift, int state); +struct tmio_mmc_dma { +	void *chan_priv_tx; +	void *chan_priv_rx; +}; +  /*   * data for the MMC controller   */  struct tmio_mmc_data { -	const unsigned int		hclk; +	unsigned int			hclk; +	unsigned long			capabilities; +	unsigned long			flags; +	u32				ocr_mask;	/* available voltages */ +	struct tmio_mmc_dma		*dma;  	void (*set_pwr)(struct platform_device *host, int state);  	void (*set_clk_div)(struct platform_device *host, int state);  }; diff --git a/include/linux/mfd/tps6507x.h b/include/linux/mfd/tps6507x.h new file mode 100644 index 00000000000..c923e4864f5 --- /dev/null +++ b/include/linux/mfd/tps6507x.h @@ -0,0 +1,169 @@ +/* linux/mfd/tps6507x.h + * + * Functions to access TPS65070 power management chip. + * + * Copyright (c) 2009 RidgeRun (todd.fischer@ridgerun.com) + * + * + *  For licencing details see kernel-base/COPYING + */ + +#ifndef __LINUX_MFD_TPS6507X_H +#define __LINUX_MFD_TPS6507X_H + +/* + * ---------------------------------------------------------------------------- + * Registers, all 8 bits + * ---------------------------------------------------------------------------- + */ + + +/* Register definitions */ +#define	TPS6507X_REG_PPATH1			0X01 +#define	TPS6507X_CHG_USB			BIT(7) +#define	TPS6507X_CHG_AC				BIT(6) +#define	TPS6507X_CHG_USB_PW_ENABLE		BIT(5) +#define	TPS6507X_CHG_AC_PW_ENABLE		BIT(4) +#define	TPS6507X_CHG_AC_CURRENT			BIT(2) +#define	TPS6507X_CHG_USB_CURRENT		BIT(0) + +#define	TPS6507X_REG_INT			0X02 +#define	TPS6507X_REG_MASK_AC_USB		BIT(7) +#define	TPS6507X_REG_MASK_TSC			BIT(6) +#define	TPS6507X_REG_MASK_PB_IN			BIT(5) +#define	TPS6507X_REG_TSC_INT			BIT(3) +#define	TPS6507X_REG_PB_IN_INT			BIT(2) +#define	TPS6507X_REG_AC_USB_APPLIED		BIT(1) +#define	TPS6507X_REG_AC_USB_REMOVED		BIT(0) + +#define	TPS6507X_REG_CHGCONFIG0			0X03 + +#define	TPS6507X_REG_CHGCONFIG1			0X04 +#define	TPS6507X_CON_CTRL1_DCDC1_ENABLE		BIT(4) +#define	TPS6507X_CON_CTRL1_DCDC2_ENABLE		BIT(3) +#define	TPS6507X_CON_CTRL1_DCDC3_ENABLE		BIT(2) +#define	TPS6507X_CON_CTRL1_LDO1_ENABLE		BIT(1) +#define	TPS6507X_CON_CTRL1_LDO2_ENABLE		BIT(0) + +#define	TPS6507X_REG_CHGCONFIG2			0X05 + +#define	TPS6507X_REG_CHGCONFIG3			0X06 + +#define	TPS6507X_REG_ADCONFIG			0X07 +#define	TPS6507X_ADCONFIG_AD_ENABLE		BIT(7) +#define	TPS6507X_ADCONFIG_START_CONVERSION	BIT(6) +#define	TPS6507X_ADCONFIG_CONVERSION_DONE	BIT(5) +#define	TPS6507X_ADCONFIG_VREF_ENABLE		BIT(4) +#define	TPS6507X_ADCONFIG_INPUT_AD_IN1		0 +#define	TPS6507X_ADCONFIG_INPUT_AD_IN2		1 +#define	TPS6507X_ADCONFIG_INPUT_AD_IN3		2 +#define	TPS6507X_ADCONFIG_INPUT_AD_IN4		3 +#define	TPS6507X_ADCONFIG_INPUT_TS_PIN		4 +#define	TPS6507X_ADCONFIG_INPUT_BAT_CURRENT	5 +#define	TPS6507X_ADCONFIG_INPUT_AC_VOLTAGE	6 +#define	TPS6507X_ADCONFIG_INPUT_SYS_VOLTAGE	7 +#define	TPS6507X_ADCONFIG_INPUT_CHARGER_VOLTAGE 8 +#define	TPS6507X_ADCONFIG_INPUT_BAT_VOLTAGE	9 +#define	TPS6507X_ADCONFIG_INPUT_THRESHOLD_VOLTAGE 10 +#define	TPS6507X_ADCONFIG_INPUT_ISET1_VOLTAGE	11 +#define	TPS6507X_ADCONFIG_INPUT_ISET2_VOLTAGE	12 +#define	TPS6507X_ADCONFIG_INPUT_REAL_TSC	14 +#define	TPS6507X_ADCONFIG_INPUT_TSC		15 + +#define	TPS6507X_REG_TSCMODE			0X08 +#define	TPS6507X_TSCMODE_X_POSITION		0 +#define	TPS6507X_TSCMODE_Y_POSITION		1 +#define	TPS6507X_TSCMODE_PRESSURE		2 +#define	TPS6507X_TSCMODE_X_PLATE		3 +#define	TPS6507X_TSCMODE_Y_PLATE		4 +#define	TPS6507X_TSCMODE_STANDBY		5 +#define	TPS6507X_TSCMODE_ADC_INPUT		6 +#define	TPS6507X_TSCMODE_DISABLE		7 + +#define	TPS6507X_REG_ADRESULT_1			0X09 + +#define	TPS6507X_REG_ADRESULT_2			0X0A +#define	TPS6507X_REG_ADRESULT_2_MASK		(BIT(1) | BIT(0)) + +#define	TPS6507X_REG_PGOOD			0X0B + +#define	TPS6507X_REG_PGOODMASK			0X0C + +#define	TPS6507X_REG_CON_CTRL1			0X0D +#define	TPS6507X_CON_CTRL1_DCDC1_ENABLE		BIT(4) +#define	TPS6507X_CON_CTRL1_DCDC2_ENABLE		BIT(3) +#define	TPS6507X_CON_CTRL1_DCDC3_ENABLE		BIT(2) +#define	TPS6507X_CON_CTRL1_LDO1_ENABLE		BIT(1) +#define	TPS6507X_CON_CTRL1_LDO2_ENABLE		BIT(0) + +#define	TPS6507X_REG_CON_CTRL2			0X0E + +#define	TPS6507X_REG_CON_CTRL3			0X0F + +#define	TPS6507X_REG_DEFDCDC1			0X10 +#define TPS6507X_DEFDCDC1_DCDC1_EXT_ADJ_EN	BIT(7) +#define TPS6507X_DEFDCDC1_DCDC1_MASK		0X3F + +#define	TPS6507X_REG_DEFDCDC2_LOW		0X11 +#define TPS6507X_DEFDCDC2_LOW_DCDC2_MASK	0X3F + +#define	TPS6507X_REG_DEFDCDC2_HIGH		0X12 +#define TPS6507X_DEFDCDC2_HIGH_DCDC2_MASK	0X3F + +#define	TPS6507X_REG_DEFDCDC3_LOW		0X13 +#define TPS6507X_DEFDCDC3_LOW_DCDC3_MASK	0X3F + +#define	TPS6507X_REG_DEFDCDC3_HIGH		0X14 +#define TPS6507X_DEFDCDC3_HIGH_DCDC3_MASK	0X3F + +#define	TPS6507X_REG_DEFSLEW			0X15 + +#define	TPS6507X_REG_LDO_CTRL1			0X16 +#define TPS6507X_REG_LDO_CTRL1_LDO1_MASK	0X0F + +#define	TPS6507X_REG_DEFLDO2			0X17 +#define TPS6507X_REG_DEFLDO2_LDO2_MASK		0X3F + +#define	TPS6507X_REG_WLED_CTRL1			0X18 + +#define	TPS6507X_REG_WLED_CTRL2			0X19 + +/* VDCDC MASK */ +#define TPS6507X_DEFDCDCX_DCDC_MASK		0X3F + +#define TPS6507X_MAX_REGISTER			0X19 + +/** + * struct tps6507x_board - packages regulator and touchscreen init data + * @tps6507x_regulator_data: regulator initialization values + * + * Board data may be used to initialize regulator and touchscreen. + */ + +struct tps6507x_board { +	struct regulator_init_data *tps6507x_pmic_init_data; +	struct touchscreen_init_data *tps6507x_ts_init_data; +}; + +/** + * struct tps6507x_dev - tps6507x sub-driver chip access routines + * @read_dev() - I2C register read function + * @write_dev() - I2C register write function + * + * Device data may be used to access the TPS6507x chip + */ + +struct tps6507x_dev { +	struct device *dev; +	struct i2c_client *i2c_client; +	int (*read_dev)(struct tps6507x_dev *tps6507x, char reg, int size, +			void *dest); +	int (*write_dev)(struct tps6507x_dev *tps6507x, char reg, int size, +			 void *src); + +	/* Client devices */ +	struct tps6507x_pmic *pmic; +	struct tps6507x_ts *ts; +}; + +#endif /*  __LINUX_MFD_TPS6507X_H */ diff --git a/include/linux/mfd/ucb1x00.h b/include/linux/mfd/ucb1x00.h index aa9c3789bed..4321f044d1e 100644 --- a/include/linux/mfd/ucb1x00.h +++ b/include/linux/mfd/ucb1x00.h @@ -12,6 +12,7 @@  #include <linux/mfd/mcp.h>  #include <linux/gpio.h> +#include <linux/semaphore.h>  #define UCB_IO_DATA	0x00  #define UCB_IO_DIR	0x01 diff --git a/include/linux/mfd/wm831x/core.h b/include/linux/mfd/wm831x/core.h index 5184b79c700..eb5bd4e0e03 100644 --- a/include/linux/mfd/wm831x/core.h +++ b/include/linux/mfd/wm831x/core.h @@ -15,6 +15,7 @@  #ifndef __MFD_WM831X_CORE_H__  #define __MFD_WM831X_CORE_H__ +#include <linux/completion.h>  #include <linux/interrupt.h>  /* @@ -254,9 +255,15 @@ struct wm831x {  	int irq_masks_cur[WM831X_NUM_IRQ_REGS];   /* Currently active value */  	int irq_masks_cache[WM831X_NUM_IRQ_REGS]; /* Cached hardware value */ +	/* Chip revision based flags */ +	unsigned has_gpio_ena:1;         /* Has GPIO enable bit */ +	unsigned has_cs_sts:1;           /* Has current sink status bit */ +	unsigned charger_irq_wake:1;     /* Are charger IRQs a wake source? */ +  	int num_gpio;  	struct mutex auxadc_lock; +	struct completion auxadc_done;  	/* The WM831x has a security key blocking access to certain  	 * registers.  The mutex is taken by the accessors for locking diff --git a/include/linux/mfd/wm831x/gpio.h b/include/linux/mfd/wm831x/gpio.h index 2835614af0e..9b163c58865 100644 --- a/include/linux/mfd/wm831x/gpio.h +++ b/include/linux/mfd/wm831x/gpio.h @@ -41,6 +41,10 @@  #define WM831X_GPN_OD_MASK                      0x0200  /* GPN_OD */  #define WM831X_GPN_OD_SHIFT                          9  /* GPN_OD */  #define WM831X_GPN_OD_WIDTH                          1  /* GPN_OD */ +#define WM831X_GPN_ENA                          0x0080  /* GPN_ENA */ +#define WM831X_GPN_ENA_MASK                     0x0080  /* GPN_ENA */ +#define WM831X_GPN_ENA_SHIFT                         7  /* GPN_ENA */ +#define WM831X_GPN_ENA_WIDTH                         1  /* GPN_ENA */  #define WM831X_GPN_TRI                          0x0080  /* GPN_TRI */  #define WM831X_GPN_TRI_MASK                     0x0080  /* GPN_TRI */  #define WM831X_GPN_TRI_SHIFT                         7  /* GPN_TRI */ diff --git a/include/linux/mfd/wm8350/audio.h b/include/linux/mfd/wm8350/audio.h index d899dc0223b..a95141eafce 100644 --- a/include/linux/mfd/wm8350/audio.h +++ b/include/linux/mfd/wm8350/audio.h @@ -492,6 +492,8 @@   */  #define WM8350_JACK_L_LVL			0x0800  #define WM8350_JACK_R_LVL                       0x0400 +#define WM8350_JACK_MICSCD_LVL			0x0200 +#define WM8350_JACK_MICSD_LVL			0x0100  /*   * WM8350 Platform setup diff --git a/include/linux/mfd/wm8350/core.h b/include/linux/mfd/wm8350/core.h index 43868899bf4..98fcc977e82 100644 --- a/include/linux/mfd/wm8350/core.h +++ b/include/linux/mfd/wm8350/core.h @@ -16,6 +16,7 @@  #include <linux/kernel.h>  #include <linux/mutex.h>  #include <linux/interrupt.h> +#include <linux/completion.h>  #include <linux/mfd/wm8350/audio.h>  #include <linux/mfd/wm8350/gpio.h> @@ -579,6 +580,8 @@  #define WM8350_NUM_IRQ				63 +#define WM8350_NUM_IRQ_REGS 7 +  struct wm8350_reg_access {  	u16 readable;		/* Mask of readable bits */  	u16 writable;		/* Mask of writable bits */ @@ -600,11 +603,6 @@ extern const u16 wm8352_mode3_defaults[];  struct wm8350; -struct wm8350_irq { -	irq_handler_t handler; -	void *data; -}; -  struct wm8350_hwmon {  	struct platform_device *pdev;  	struct device *classdev; @@ -624,11 +622,13 @@ struct wm8350 {  	u16 *reg_cache;  	struct mutex auxadc_mutex; +	struct completion auxadc_done;  	/* Interrupt handling */ -	struct mutex irq_mutex; /* IRQ table mutex */ -	struct wm8350_irq irq[WM8350_NUM_IRQ]; +	struct mutex irq_lock;  	int chip_irq; +	int irq_base; +	u16 irq_masks[WM8350_NUM_IRQ_REGS];  	/* Client devices */  	struct wm8350_codec codec; @@ -647,11 +647,13 @@ struct wm8350 {   *        used by the platform to configure GPIO functions and similar.   * @irq_high: Set if WM8350 IRQ is active high.   * @irq_base: Base IRQ for genirq (not currently used). + * @gpio_base: Base for gpiolib.   */  struct wm8350_platform_data {  	int (*init)(struct wm8350 *wm8350);  	int irq_high;  	int irq_base; +	int gpio_base;  }; @@ -677,12 +679,33 @@ int wm8350_block_write(struct wm8350 *wm8350, int reg, int size, u16 *src);  /*   * WM8350 internal interrupts   */ -int wm8350_register_irq(struct wm8350 *wm8350, int irq, -			irq_handler_t handler, unsigned long flags, -			const char *name, void *data); -int wm8350_free_irq(struct wm8350 *wm8350, int irq); -int wm8350_mask_irq(struct wm8350 *wm8350, int irq); -int wm8350_unmask_irq(struct wm8350 *wm8350, int irq); +static inline int wm8350_register_irq(struct wm8350 *wm8350, int irq, +				      irq_handler_t handler, +				      unsigned long flags, +				      const char *name, void *data) +{ +	if (!wm8350->irq_base) +		return -ENODEV; + +	return request_threaded_irq(irq + wm8350->irq_base, NULL, +				    handler, flags, name, data); +} + +static inline void wm8350_free_irq(struct wm8350 *wm8350, int irq, void *data) +{ +	free_irq(irq + wm8350->irq_base, data); +} + +static inline void wm8350_mask_irq(struct wm8350 *wm8350, int irq) +{ +	disable_irq(irq + wm8350->irq_base); +} + +static inline void wm8350_unmask_irq(struct wm8350 *wm8350, int irq) +{ +	enable_irq(irq + wm8350->irq_base); +} +  int wm8350_irq_init(struct wm8350 *wm8350, int irq,  		    struct wm8350_platform_data *pdata);  int wm8350_irq_exit(struct wm8350 *wm8350); diff --git a/include/linux/mfd/wm8350/gpio.h b/include/linux/mfd/wm8350/gpio.h index 71af3d6ebe9..d657bcd6d95 100644 --- a/include/linux/mfd/wm8350/gpio.h +++ b/include/linux/mfd/wm8350/gpio.h @@ -29,6 +29,7 @@  #define WM8350_GPIO_FUNCTION_SELECT_2           0x8D  #define WM8350_GPIO_FUNCTION_SELECT_3           0x8E  #define WM8350_GPIO_FUNCTION_SELECT_4           0x8F +#define WM8350_GPIO_LEVEL			0xE6  /*   * GPIO Functions diff --git a/include/linux/mfd/wm8350/rtc.h b/include/linux/mfd/wm8350/rtc.h index 24add2bef6c..ebd72ffc62d 100644 --- a/include/linux/mfd/wm8350/rtc.h +++ b/include/linux/mfd/wm8350/rtc.h @@ -263,6 +263,7 @@ struct wm8350_rtc {  	struct platform_device *pdev;  	struct rtc_device *rtc;  	int alarm_enabled;      /* used over suspend/resume */ +	int update_enabled;  };  #endif diff --git a/include/linux/mfd/wm8994/core.h b/include/linux/mfd/wm8994/core.h new file mode 100644 index 00000000000..de79baee492 --- /dev/null +++ b/include/linux/mfd/wm8994/core.h @@ -0,0 +1,105 @@ +/* + * include/linux/mfd/wm8994/core.h -- Core interface for WM8994 + * + * Copyright 2009 Wolfson Microelectronics PLC. + * + * Author: Mark Brown <broonie@opensource.wolfsonmicro.com> + * + *  This program is free software; you can redistribute  it and/or modify it + *  under  the terms of  the GNU General  Public License as published by the + *  Free Software Foundation;  either version 2 of the  License, or (at your + *  option) any later version. + * + */ + +#ifndef __MFD_WM8994_CORE_H__ +#define __MFD_WM8994_CORE_H__ + +#include <linux/interrupt.h> + +struct regulator_dev; +struct regulator_bulk_data; + +#define WM8994_NUM_GPIO_REGS 11 +#define WM8994_NUM_LDO_REGS   2 +#define WM8994_NUM_IRQ_REGS   2 + +#define WM8994_IRQ_TEMP_SHUT		0 +#define WM8994_IRQ_MIC1_DET		1 +#define WM8994_IRQ_MIC1_SHRT		2 +#define WM8994_IRQ_MIC2_DET		3 +#define WM8994_IRQ_MIC2_SHRT		4 +#define WM8994_IRQ_FLL1_LOCK		5 +#define WM8994_IRQ_FLL2_LOCK		6 +#define WM8994_IRQ_SRC1_LOCK		7 +#define WM8994_IRQ_SRC2_LOCK		8 +#define WM8994_IRQ_AIF1DRC1_SIG_DET	9 +#define WM8994_IRQ_AIF1DRC2_SIG_DET	10 +#define WM8994_IRQ_AIF2DRC_SIG_DET	11 +#define WM8994_IRQ_FIFOS_ERR		12 +#define WM8994_IRQ_WSEQ_DONE		13 +#define WM8994_IRQ_DCS_DONE		14 +#define WM8994_IRQ_TEMP_WARN		15 + +/* GPIOs in the chip are numbered from 1-11 */ +#define WM8994_IRQ_GPIO(x) (x + WM8994_IRQ_TEMP_WARN) + +struct wm8994 { +	struct mutex io_lock; +	struct mutex irq_lock; + +	struct device *dev; +	int (*read_dev)(struct wm8994 *wm8994, unsigned short reg, +			int bytes, void *dest); +	int (*write_dev)(struct wm8994 *wm8994, unsigned short reg, +			 int bytes, void *src); + +	void *control_data; + +	int gpio_base; +	int irq_base; + +	int irq; +	u16 irq_masks_cur[WM8994_NUM_IRQ_REGS]; +	u16 irq_masks_cache[WM8994_NUM_IRQ_REGS]; + +	/* Used over suspend/resume */ +	u16 ldo_regs[WM8994_NUM_LDO_REGS]; +	u16 gpio_regs[WM8994_NUM_GPIO_REGS]; + +	struct regulator_dev *dbvdd; +	struct regulator_bulk_data *supplies; +}; + +/* Device I/O API */ +int wm8994_reg_read(struct wm8994 *wm8994, unsigned short reg); +int wm8994_reg_write(struct wm8994 *wm8994, unsigned short reg, +		 unsigned short val); +int wm8994_set_bits(struct wm8994 *wm8994, unsigned short reg, +		    unsigned short mask, unsigned short val); +int wm8994_bulk_read(struct wm8994 *wm8994, unsigned short reg, +		     int count, u16 *buf); + + +/* Helper to save on boilerplate */ +static inline int wm8994_request_irq(struct wm8994 *wm8994, int irq, +				     irq_handler_t handler, const char *name, +				     void *data) +{ +	if (!wm8994->irq_base) +		return -EINVAL; +	return request_threaded_irq(wm8994->irq_base + irq, NULL, handler, +				    IRQF_TRIGGER_RISING, name, +				    data); +} +static inline void wm8994_free_irq(struct wm8994 *wm8994, int irq, void *data) +{ +	if (!wm8994->irq_base) +		return; +	free_irq(wm8994->irq_base + irq, data); +} + +int wm8994_irq_init(struct wm8994 *wm8994); +void wm8994_irq_exit(struct wm8994 *wm8994); + +#endif diff --git a/include/linux/mfd/wm8994/gpio.h b/include/linux/mfd/wm8994/gpio.h new file mode 100644 index 00000000000..b4d4c22991e --- /dev/null +++ b/include/linux/mfd/wm8994/gpio.h @@ -0,0 +1,72 @@ +/* + * include/linux/mfd/wm8994/gpio.h - GPIO configuration for WM8994 + * + * Copyright 2009 Wolfson Microelectronics PLC. + * + * Author: Mark Brown <broonie@opensource.wolfsonmicro.com> + * + *  This program is free software; you can redistribute  it and/or modify it + *  under  the terms of  the GNU General  Public License as published by the + *  Free Software Foundation;  either version 2 of the  License, or (at your + *  option) any later version. + * + */ + +#ifndef __MFD_WM8994_GPIO_H__ +#define __MFD_WM8994_GPIO_H__ + +#define WM8994_GPIO_MAX 11 + +#define WM8994_GP_FN_PIN_SPECIFIC    0 +#define WM8994_GP_FN_GPIO            1 +#define WM8994_GP_FN_SDOUT           2 +#define WM8994_GP_FN_IRQ             3 +#define WM8994_GP_FN_TEMPERATURE     4 +#define WM8994_GP_FN_MICBIAS1_DET    5 +#define WM8994_GP_FN_MICBIAS1_SHORT  6 +#define WM8994_GP_FN_MICBIAS2_DET    7 +#define WM8994_GP_FN_MICBIAS2_SHORT  8 +#define WM8994_GP_FN_FLL1_LOCK       9 +#define WM8994_GP_FN_FLL2_LOCK      10 +#define WM8994_GP_FN_SRC1_LOCK      11 +#define WM8994_GP_FN_SRC2_LOCK      12 +#define WM8994_GP_FN_DRC1_ACT       13 +#define WM8994_GP_FN_DRC2_ACT       14 +#define WM8994_GP_FN_DRC3_ACT       15 +#define WM8994_GP_FN_WSEQ_STATUS    16 +#define WM8994_GP_FN_FIFO_ERROR     17 +#define WM8994_GP_FN_OPCLK          18 + +#define WM8994_GPN_DIR                          0x8000  /* GPN_DIR */ +#define WM8994_GPN_DIR_MASK                     0x8000  /* GPN_DIR */ +#define WM8994_GPN_DIR_SHIFT                        15  /* GPN_DIR */ +#define WM8994_GPN_DIR_WIDTH                         1  /* GPN_DIR */ +#define WM8994_GPN_PU                           0x4000  /* GPN_PU */ +#define WM8994_GPN_PU_MASK                      0x4000  /* GPN_PU */ +#define WM8994_GPN_PU_SHIFT                         14  /* GPN_PU */ +#define WM8994_GPN_PU_WIDTH                          1  /* GPN_PU */ +#define WM8994_GPN_PD                           0x2000  /* GPN_PD */ +#define WM8994_GPN_PD_MASK                      0x2000  /* GPN_PD */ +#define WM8994_GPN_PD_SHIFT                         13  /* GPN_PD */ +#define WM8994_GPN_PD_WIDTH                          1  /* GPN_PD */ +#define WM8994_GPN_POL                          0x0400  /* GPN_POL */ +#define WM8994_GPN_POL_MASK                     0x0400  /* GPN_POL */ +#define WM8994_GPN_POL_SHIFT                        10  /* GPN_POL */ +#define WM8994_GPN_POL_WIDTH                         1  /* GPN_POL */ +#define WM8994_GPN_OP_CFG                       0x0200  /* GPN_OP_CFG */ +#define WM8994_GPN_OP_CFG_MASK                  0x0200  /* GPN_OP_CFG */ +#define WM8994_GPN_OP_CFG_SHIFT                      9  /* GPN_OP_CFG */ +#define WM8994_GPN_OP_CFG_WIDTH                      1  /* GPN_OP_CFG */ +#define WM8994_GPN_DB                           0x0100  /* GPN_DB */ +#define WM8994_GPN_DB_MASK                      0x0100  /* GPN_DB */ +#define WM8994_GPN_DB_SHIFT                          8  /* GPN_DB */ +#define WM8994_GPN_DB_WIDTH                          1  /* GPN_DB */ +#define WM8994_GPN_LVL                          0x0040  /* GPN_LVL */ +#define WM8994_GPN_LVL_MASK                     0x0040  /* GPN_LVL */ +#define WM8994_GPN_LVL_SHIFT                         6  /* GPN_LVL */ +#define WM8994_GPN_LVL_WIDTH                         1  /* GPN_LVL */ +#define WM8994_GPN_FN_MASK                      0x001F  /* GPN_FN - [4:0] */ +#define WM8994_GPN_FN_SHIFT                          0  /* GPN_FN - [4:0] */ +#define WM8994_GPN_FN_WIDTH                          5  /* GPN_FN - [4:0] */ + +#endif diff --git a/include/linux/mfd/wm8994/pdata.h b/include/linux/mfd/wm8994/pdata.h new file mode 100644 index 00000000000..5c51f367c06 --- /dev/null +++ b/include/linux/mfd/wm8994/pdata.h @@ -0,0 +1,98 @@ +/* + * include/linux/mfd/wm8994/pdata.h -- Platform data for WM8994 + * + * Copyright 2009 Wolfson Microelectronics PLC. + * + * Author: Mark Brown <broonie@opensource.wolfsonmicro.com> + * + *  This program is free software; you can redistribute  it and/or modify it + *  under  the terms of  the GNU General  Public License as published by the + *  Free Software Foundation;  either version 2 of the  License, or (at your + *  option) any later version. + * + */ + +#ifndef __MFD_WM8994_PDATA_H__ +#define __MFD_WM8994_PDATA_H__ + +#define WM8994_NUM_LDO   2 +#define WM8994_NUM_GPIO 11 + +struct wm8994_ldo_pdata { +	/** GPIOs to enable regulator, 0 or less if not available */ +	int enable; + +	const char *supply; +	struct regulator_init_data *init_data; +}; + +#define WM8994_CONFIGURE_GPIO 0x8000 + +#define WM8994_DRC_REGS 5 +#define WM8994_EQ_REGS  19 + +/** + * DRC configurations are specified with a label and a set of register + * values to write (the enable bits will be ignored).  At runtime an + * enumerated control will be presented for each DRC block allowing + * the user to choose the configration to use. + * + * Configurations may be generated by hand or by using the DRC control + * panel provided by the WISCE - see  http://www.wolfsonmicro.com/wisce/ + * for details. + */ +struct wm8994_drc_cfg { +        const char *name; +        u16 regs[WM8994_DRC_REGS]; +}; + +/** + * ReTune Mobile configurations are specified with a label, sample + * rate and set of values to write (the enable bits will be ignored). + * + * Configurations are expected to be generated using the ReTune Mobile + * control panel in WISCE - see http://www.wolfsonmicro.com/wisce/ + */ +struct wm8994_retune_mobile_cfg { +        const char *name; +        unsigned int rate; +        u16 regs[WM8994_EQ_REGS]; +}; + +struct wm8994_pdata { +	int gpio_base; + +	/** +	 * Default values for GPIOs if non-zero, WM8994_CONFIGURE_GPIO +	 * can be used for all zero values. +	 */ +	int gpio_defaults[WM8994_NUM_GPIO]; + +	struct wm8994_ldo_pdata ldo[WM8994_NUM_LDO]; + +	int irq_base;  /** Base IRQ number for WM8994, required for IRQs */ + +        int num_drc_cfgs; +        struct wm8994_drc_cfg *drc_cfgs; + +        int num_retune_mobile_cfgs; +        struct wm8994_retune_mobile_cfg *retune_mobile_cfgs; + +        /* LINEOUT can be differential or single ended */ +        unsigned int lineout1_diff:1; +        unsigned int lineout2_diff:1; + +        /* Common mode feedback */ +        unsigned int lineout1fb:1; +        unsigned int lineout2fb:1; + +        /* Microphone biases: 0=0.9*AVDD1 1=0.65*AVVD1 */ +        unsigned int micbias1_lvl:1; +        unsigned int micbias2_lvl:1; + +        /* Jack detect threashold levels, see datasheet for values */ +        unsigned int jd_scthr:2; +        unsigned int jd_thr:2; +}; + +#endif diff --git a/include/linux/mfd/wm8994/registers.h b/include/linux/mfd/wm8994/registers.h new file mode 100644 index 00000000000..967f62f5415 --- /dev/null +++ b/include/linux/mfd/wm8994/registers.h @@ -0,0 +1,4292 @@ +/* + * include/linux/mfd/wm8994/registers.h -- Register definitions for WM8994 + * + * Copyright 2009 Wolfson Microelectronics PLC. + * + * Author: Mark Brown <broonie@opensource.wolfsonmicro.com> + * + *  This program is free software; you can redistribute  it and/or modify it + *  under  the terms of  the GNU General  Public License as published by the + *  Free Software Foundation;  either version 2 of the  License, or (at your + *  option) any later version. + * + */ + +#ifndef __MFD_WM8994_REGISTERS_H__ +#define __MFD_WM8994_REGISTERS_H__ + +/* + * Register values. + */ +#define WM8994_SOFTWARE_RESET                   0x00 +#define WM8994_POWER_MANAGEMENT_1               0x01 +#define WM8994_POWER_MANAGEMENT_2               0x02 +#define WM8994_POWER_MANAGEMENT_3               0x03 +#define WM8994_POWER_MANAGEMENT_4               0x04 +#define WM8994_POWER_MANAGEMENT_5               0x05 +#define WM8994_POWER_MANAGEMENT_6               0x06 +#define WM8994_INPUT_MIXER_1                    0x15 +#define WM8994_LEFT_LINE_INPUT_1_2_VOLUME       0x18 +#define WM8994_LEFT_LINE_INPUT_3_4_VOLUME       0x19 +#define WM8994_RIGHT_LINE_INPUT_1_2_VOLUME      0x1A +#define WM8994_RIGHT_LINE_INPUT_3_4_VOLUME      0x1B +#define WM8994_LEFT_OUTPUT_VOLUME               0x1C +#define WM8994_RIGHT_OUTPUT_VOLUME              0x1D +#define WM8994_LINE_OUTPUTS_VOLUME              0x1E +#define WM8994_HPOUT2_VOLUME                    0x1F +#define WM8994_LEFT_OPGA_VOLUME                 0x20 +#define WM8994_RIGHT_OPGA_VOLUME                0x21 +#define WM8994_SPKMIXL_ATTENUATION              0x22 +#define WM8994_SPKMIXR_ATTENUATION              0x23 +#define WM8994_SPKOUT_MIXERS                    0x24 +#define WM8994_CLASSD                           0x25 +#define WM8994_SPEAKER_VOLUME_LEFT              0x26 +#define WM8994_SPEAKER_VOLUME_RIGHT             0x27 +#define WM8994_INPUT_MIXER_2                    0x28 +#define WM8994_INPUT_MIXER_3                    0x29 +#define WM8994_INPUT_MIXER_4                    0x2A +#define WM8994_INPUT_MIXER_5                    0x2B +#define WM8994_INPUT_MIXER_6                    0x2C +#define WM8994_OUTPUT_MIXER_1                   0x2D +#define WM8994_OUTPUT_MIXER_2                   0x2E +#define WM8994_OUTPUT_MIXER_3                   0x2F +#define WM8994_OUTPUT_MIXER_4                   0x30 +#define WM8994_OUTPUT_MIXER_5                   0x31 +#define WM8994_OUTPUT_MIXER_6                   0x32 +#define WM8994_HPOUT2_MIXER                     0x33 +#define WM8994_LINE_MIXER_1                     0x34 +#define WM8994_LINE_MIXER_2                     0x35 +#define WM8994_SPEAKER_MIXER                    0x36 +#define WM8994_ADDITIONAL_CONTROL               0x37 +#define WM8994_ANTIPOP_1                        0x38 +#define WM8994_ANTIPOP_2                        0x39 +#define WM8994_MICBIAS                          0x3A +#define WM8994_LDO_1                            0x3B +#define WM8994_LDO_2                            0x3C +#define WM8994_CHARGE_PUMP_1                    0x4C +#define WM8994_CLASS_W_1                        0x51 +#define WM8994_DC_SERVO_1                       0x54 +#define WM8994_DC_SERVO_2                       0x55 +#define WM8994_DC_SERVO_4                       0x57 +#define WM8994_DC_SERVO_READBACK                0x58 +#define WM8994_ANALOGUE_HP_1                    0x60 +#define WM8994_CHIP_REVISION                    0x100 +#define WM8994_CONTROL_INTERFACE                0x101 +#define WM8994_WRITE_SEQUENCER_CTRL_1           0x110 +#define WM8994_WRITE_SEQUENCER_CTRL_2           0x111 +#define WM8994_AIF1_CLOCKING_1                  0x200 +#define WM8994_AIF1_CLOCKING_2                  0x201 +#define WM8994_AIF2_CLOCKING_1                  0x204 +#define WM8994_AIF2_CLOCKING_2                  0x205 +#define WM8994_CLOCKING_1                       0x208 +#define WM8994_CLOCKING_2                       0x209 +#define WM8994_AIF1_RATE                        0x210 +#define WM8994_AIF2_RATE                        0x211 +#define WM8994_RATE_STATUS                      0x212 +#define WM8994_FLL1_CONTROL_1                   0x220 +#define WM8994_FLL1_CONTROL_2                   0x221 +#define WM8994_FLL1_CONTROL_3                   0x222 +#define WM8994_FLL1_CONTROL_4                   0x223 +#define WM8994_FLL1_CONTROL_5                   0x224 +#define WM8994_FLL2_CONTROL_1                   0x240 +#define WM8994_FLL2_CONTROL_2                   0x241 +#define WM8994_FLL2_CONTROL_3                   0x242 +#define WM8994_FLL2_CONTROL_4                   0x243 +#define WM8994_FLL2_CONTROL_5                   0x244 +#define WM8994_AIF1_CONTROL_1                   0x300 +#define WM8994_AIF1_CONTROL_2                   0x301 +#define WM8994_AIF1_MASTER_SLAVE                0x302 +#define WM8994_AIF1_BCLK                        0x303 +#define WM8994_AIF1ADC_LRCLK                    0x304 +#define WM8994_AIF1DAC_LRCLK                    0x305 +#define WM8994_AIF1DAC_DATA                     0x306 +#define WM8994_AIF1ADC_DATA                     0x307 +#define WM8994_AIF2_CONTROL_1                   0x310 +#define WM8994_AIF2_CONTROL_2                   0x311 +#define WM8994_AIF2_MASTER_SLAVE                0x312 +#define WM8994_AIF2_BCLK                        0x313 +#define WM8994_AIF2ADC_LRCLK                    0x314 +#define WM8994_AIF2DAC_LRCLK                    0x315 +#define WM8994_AIF2DAC_DATA                     0x316 +#define WM8994_AIF2ADC_DATA                     0x317 +#define WM8994_AIF1_ADC1_LEFT_VOLUME            0x400 +#define WM8994_AIF1_ADC1_RIGHT_VOLUME           0x401 +#define WM8994_AIF1_DAC1_LEFT_VOLUME            0x402 +#define WM8994_AIF1_DAC1_RIGHT_VOLUME           0x403 +#define WM8994_AIF1_ADC2_LEFT_VOLUME            0x404 +#define WM8994_AIF1_ADC2_RIGHT_VOLUME           0x405 +#define WM8994_AIF1_DAC2_LEFT_VOLUME            0x406 +#define WM8994_AIF1_DAC2_RIGHT_VOLUME           0x407 +#define WM8994_AIF1_ADC1_FILTERS                0x410 +#define WM8994_AIF1_ADC2_FILTERS                0x411 +#define WM8994_AIF1_DAC1_FILTERS_1              0x420 +#define WM8994_AIF1_DAC1_FILTERS_2              0x421 +#define WM8994_AIF1_DAC2_FILTERS_1              0x422 +#define WM8994_AIF1_DAC2_FILTERS_2              0x423 +#define WM8994_AIF1_DRC1_1                      0x440 +#define WM8994_AIF1_DRC1_2                      0x441 +#define WM8994_AIF1_DRC1_3                      0x442 +#define WM8994_AIF1_DRC1_4                      0x443 +#define WM8994_AIF1_DRC1_5                      0x444 +#define WM8994_AIF1_DRC2_1                      0x450 +#define WM8994_AIF1_DRC2_2                      0x451 +#define WM8994_AIF1_DRC2_3                      0x452 +#define WM8994_AIF1_DRC2_4                      0x453 +#define WM8994_AIF1_DRC2_5                      0x454 +#define WM8994_AIF1_DAC1_EQ_GAINS_1             0x480 +#define WM8994_AIF1_DAC1_EQ_GAINS_2             0x481 +#define WM8994_AIF1_DAC1_EQ_BAND_1_A            0x482 +#define WM8994_AIF1_DAC1_EQ_BAND_1_B            0x483 +#define WM8994_AIF1_DAC1_EQ_BAND_1_PG           0x484 +#define WM8994_AIF1_DAC1_EQ_BAND_2_A            0x485 +#define WM8994_AIF1_DAC1_EQ_BAND_2_B            0x486 +#define WM8994_AIF1_DAC1_EQ_BAND_2_C            0x487 +#define WM8994_AIF1_DAC1_EQ_BAND_2_PG           0x488 +#define WM8994_AIF1_DAC1_EQ_BAND_3_A            0x489 +#define WM8994_AIF1_DAC1_EQ_BAND_3_B            0x48A +#define WM8994_AIF1_DAC1_EQ_BAND_3_C            0x48B +#define WM8994_AIF1_DAC1_EQ_BAND_3_PG           0x48C +#define WM8994_AIF1_DAC1_EQ_BAND_4_A            0x48D +#define WM8994_AIF1_DAC1_EQ_BAND_4_B            0x48E +#define WM8994_AIF1_DAC1_EQ_BAND_4_C            0x48F +#define WM8994_AIF1_DAC1_EQ_BAND_4_PG           0x490 +#define WM8994_AIF1_DAC1_EQ_BAND_5_A            0x491 +#define WM8994_AIF1_DAC1_EQ_BAND_5_B            0x492 +#define WM8994_AIF1_DAC1_EQ_BAND_5_PG           0x493 +#define WM8994_AIF1_DAC2_EQ_GAINS_1             0x4A0 +#define WM8994_AIF1_DAC2_EQ_GAINS_2             0x4A1 +#define WM8994_AIF1_DAC2_EQ_BAND_1_A            0x4A2 +#define WM8994_AIF1_DAC2_EQ_BAND_1_B            0x4A3 +#define WM8994_AIF1_DAC2_EQ_BAND_1_PG           0x4A4 +#define WM8994_AIF1_DAC2_EQ_BAND_2_A            0x4A5 +#define WM8994_AIF1_DAC2_EQ_BAND_2_B            0x4A6 +#define WM8994_AIF1_DAC2_EQ_BAND_2_C            0x4A7 +#define WM8994_AIF1_DAC2_EQ_BAND_2_PG           0x4A8 +#define WM8994_AIF1_DAC2_EQ_BAND_3_A            0x4A9 +#define WM8994_AIF1_DAC2_EQ_BAND_3_B            0x4AA +#define WM8994_AIF1_DAC2_EQ_BAND_3_C            0x4AB +#define WM8994_AIF1_DAC2_EQ_BAND_3_PG           0x4AC +#define WM8994_AIF1_DAC2_EQ_BAND_4_A            0x4AD +#define WM8994_AIF1_DAC2_EQ_BAND_4_B            0x4AE +#define WM8994_AIF1_DAC2_EQ_BAND_4_C            0x4AF +#define WM8994_AIF1_DAC2_EQ_BAND_4_PG           0x4B0 +#define WM8994_AIF1_DAC2_EQ_BAND_5_A            0x4B1 +#define WM8994_AIF1_DAC2_EQ_BAND_5_B            0x4B2 +#define WM8994_AIF1_DAC2_EQ_BAND_5_PG           0x4B3 +#define WM8994_AIF2_ADC_LEFT_VOLUME             0x500 +#define WM8994_AIF2_ADC_RIGHT_VOLUME            0x501 +#define WM8994_AIF2_DAC_LEFT_VOLUME             0x502 +#define WM8994_AIF2_DAC_RIGHT_VOLUME            0x503 +#define WM8994_AIF2_ADC_FILTERS                 0x510 +#define WM8994_AIF2_DAC_FILTERS_1               0x520 +#define WM8994_AIF2_DAC_FILTERS_2               0x521 +#define WM8994_AIF2_DRC_1                       0x540 +#define WM8994_AIF2_DRC_2                       0x541 +#define WM8994_AIF2_DRC_3                       0x542 +#define WM8994_AIF2_DRC_4                       0x543 +#define WM8994_AIF2_DRC_5                       0x544 +#define WM8994_AIF2_EQ_GAINS_1                  0x580 +#define WM8994_AIF2_EQ_GAINS_2                  0x581 +#define WM8994_AIF2_EQ_BAND_1_A                 0x582 +#define WM8994_AIF2_EQ_BAND_1_B                 0x583 +#define WM8994_AIF2_EQ_BAND_1_PG                0x584 +#define WM8994_AIF2_EQ_BAND_2_A                 0x585 +#define WM8994_AIF2_EQ_BAND_2_B                 0x586 +#define WM8994_AIF2_EQ_BAND_2_C                 0x587 +#define WM8994_AIF2_EQ_BAND_2_PG                0x588 +#define WM8994_AIF2_EQ_BAND_3_A                 0x589 +#define WM8994_AIF2_EQ_BAND_3_B                 0x58A +#define WM8994_AIF2_EQ_BAND_3_C                 0x58B +#define WM8994_AIF2_EQ_BAND_3_PG                0x58C +#define WM8994_AIF2_EQ_BAND_4_A                 0x58D +#define WM8994_AIF2_EQ_BAND_4_B                 0x58E +#define WM8994_AIF2_EQ_BAND_4_C                 0x58F +#define WM8994_AIF2_EQ_BAND_4_PG                0x590 +#define WM8994_AIF2_EQ_BAND_5_A                 0x591 +#define WM8994_AIF2_EQ_BAND_5_B                 0x592 +#define WM8994_AIF2_EQ_BAND_5_PG                0x593 +#define WM8994_DAC1_MIXER_VOLUMES               0x600 +#define WM8994_DAC1_LEFT_MIXER_ROUTING          0x601 +#define WM8994_DAC1_RIGHT_MIXER_ROUTING         0x602 +#define WM8994_DAC2_MIXER_VOLUMES               0x603 +#define WM8994_DAC2_LEFT_MIXER_ROUTING          0x604 +#define WM8994_DAC2_RIGHT_MIXER_ROUTING         0x605 +#define WM8994_AIF1_ADC1_LEFT_MIXER_ROUTING     0x606 +#define WM8994_AIF1_ADC1_RIGHT_MIXER_ROUTING    0x607 +#define WM8994_AIF1_ADC2_LEFT_MIXER_ROUTING     0x608 +#define WM8994_AIF1_ADC2_RIGHT_MIXER_ROUTING    0x609 +#define WM8994_DAC1_LEFT_VOLUME                 0x610 +#define WM8994_DAC1_RIGHT_VOLUME                0x611 +#define WM8994_DAC2_LEFT_VOLUME                 0x612 +#define WM8994_DAC2_RIGHT_VOLUME                0x613 +#define WM8994_DAC_SOFTMUTE                     0x614 +#define WM8994_OVERSAMPLING                     0x620 +#define WM8994_SIDETONE                         0x621 +#define WM8994_GPIO_1                           0x700 +#define WM8994_GPIO_2                           0x701 +#define WM8994_GPIO_3                           0x702 +#define WM8994_GPIO_4                           0x703 +#define WM8994_GPIO_5                           0x704 +#define WM8994_GPIO_6                           0x705 +#define WM8994_GPIO_7                           0x706 +#define WM8994_GPIO_8                           0x707 +#define WM8994_GPIO_9                           0x708 +#define WM8994_GPIO_10                          0x709 +#define WM8994_GPIO_11                          0x70A +#define WM8994_PULL_CONTROL_1                   0x720 +#define WM8994_PULL_CONTROL_2                   0x721 +#define WM8994_INTERRUPT_STATUS_1               0x730 +#define WM8994_INTERRUPT_STATUS_2               0x731 +#define WM8994_INTERRUPT_RAW_STATUS_2           0x732 +#define WM8994_INTERRUPT_STATUS_1_MASK          0x738 +#define WM8994_INTERRUPT_STATUS_2_MASK          0x739 +#define WM8994_INTERRUPT_CONTROL                0x740 +#define WM8994_IRQ_DEBOUNCE                     0x748 +#define WM8994_WRITE_SEQUENCER_0                0x3000 +#define WM8994_WRITE_SEQUENCER_1                0x3001 +#define WM8994_WRITE_SEQUENCER_2                0x3002 +#define WM8994_WRITE_SEQUENCER_3                0x3003 +#define WM8994_WRITE_SEQUENCER_4                0x3004 +#define WM8994_WRITE_SEQUENCER_5                0x3005 +#define WM8994_WRITE_SEQUENCER_6                0x3006 +#define WM8994_WRITE_SEQUENCER_7                0x3007 +#define WM8994_WRITE_SEQUENCER_8                0x3008 +#define WM8994_WRITE_SEQUENCER_9                0x3009 +#define WM8994_WRITE_SEQUENCER_10               0x300A +#define WM8994_WRITE_SEQUENCER_11               0x300B +#define WM8994_WRITE_SEQUENCER_12               0x300C +#define WM8994_WRITE_SEQUENCER_13               0x300D +#define WM8994_WRITE_SEQUENCER_14               0x300E +#define WM8994_WRITE_SEQUENCER_15               0x300F +#define WM8994_WRITE_SEQUENCER_16               0x3010 +#define WM8994_WRITE_SEQUENCER_17               0x3011 +#define WM8994_WRITE_SEQUENCER_18               0x3012 +#define WM8994_WRITE_SEQUENCER_19               0x3013 +#define WM8994_WRITE_SEQUENCER_20               0x3014 +#define WM8994_WRITE_SEQUENCER_21               0x3015 +#define WM8994_WRITE_SEQUENCER_22               0x3016 +#define WM8994_WRITE_SEQUENCER_23               0x3017 +#define WM8994_WRITE_SEQUENCER_24               0x3018 +#define WM8994_WRITE_SEQUENCER_25               0x3019 +#define WM8994_WRITE_SEQUENCER_26               0x301A +#define WM8994_WRITE_SEQUENCER_27               0x301B +#define WM8994_WRITE_SEQUENCER_28               0x301C +#define WM8994_WRITE_SEQUENCER_29               0x301D +#define WM8994_WRITE_SEQUENCER_30               0x301E +#define WM8994_WRITE_SEQUENCER_31               0x301F +#define WM8994_WRITE_SEQUENCER_32               0x3020 +#define WM8994_WRITE_SEQUENCER_33               0x3021 +#define WM8994_WRITE_SEQUENCER_34               0x3022 +#define WM8994_WRITE_SEQUENCER_35               0x3023 +#define WM8994_WRITE_SEQUENCER_36               0x3024 +#define WM8994_WRITE_SEQUENCER_37               0x3025 +#define WM8994_WRITE_SEQUENCER_38               0x3026 +#define WM8994_WRITE_SEQUENCER_39               0x3027 +#define WM8994_WRITE_SEQUENCER_40               0x3028 +#define WM8994_WRITE_SEQUENCER_41               0x3029 +#define WM8994_WRITE_SEQUENCER_42               0x302A +#define WM8994_WRITE_SEQUENCER_43               0x302B +#define WM8994_WRITE_SEQUENCER_44               0x302C +#define WM8994_WRITE_SEQUENCER_45               0x302D +#define WM8994_WRITE_SEQUENCER_46               0x302E +#define WM8994_WRITE_SEQUENCER_47               0x302F +#define WM8994_WRITE_SEQUENCER_48               0x3030 +#define WM8994_WRITE_SEQUENCER_49               0x3031 +#define WM8994_WRITE_SEQUENCER_50               0x3032 +#define WM8994_WRITE_SEQUENCER_51               0x3033 +#define WM8994_WRITE_SEQUENCER_52               0x3034 +#define WM8994_WRITE_SEQUENCER_53               0x3035 +#define WM8994_WRITE_SEQUENCER_54               0x3036 +#define WM8994_WRITE_SEQUENCER_55               0x3037 +#define WM8994_WRITE_SEQUENCER_56               0x3038 +#define WM8994_WRITE_SEQUENCER_57               0x3039 +#define WM8994_WRITE_SEQUENCER_58               0x303A +#define WM8994_WRITE_SEQUENCER_59               0x303B +#define WM8994_WRITE_SEQUENCER_60               0x303C +#define WM8994_WRITE_SEQUENCER_61               0x303D +#define WM8994_WRITE_SEQUENCER_62               0x303E +#define WM8994_WRITE_SEQUENCER_63               0x303F +#define WM8994_WRITE_SEQUENCER_64               0x3040 +#define WM8994_WRITE_SEQUENCER_65               0x3041 +#define WM8994_WRITE_SEQUENCER_66               0x3042 +#define WM8994_WRITE_SEQUENCER_67               0x3043 +#define WM8994_WRITE_SEQUENCER_68               0x3044 +#define WM8994_WRITE_SEQUENCER_69               0x3045 +#define WM8994_WRITE_SEQUENCER_70               0x3046 +#define WM8994_WRITE_SEQUENCER_71               0x3047 +#define WM8994_WRITE_SEQUENCER_72               0x3048 +#define WM8994_WRITE_SEQUENCER_73               0x3049 +#define WM8994_WRITE_SEQUENCER_74               0x304A +#define WM8994_WRITE_SEQUENCER_75               0x304B +#define WM8994_WRITE_SEQUENCER_76               0x304C +#define WM8994_WRITE_SEQUENCER_77               0x304D +#define WM8994_WRITE_SEQUENCER_78               0x304E +#define WM8994_WRITE_SEQUENCER_79               0x304F +#define WM8994_WRITE_SEQUENCER_80               0x3050 +#define WM8994_WRITE_SEQUENCER_81               0x3051 +#define WM8994_WRITE_SEQUENCER_82               0x3052 +#define WM8994_WRITE_SEQUENCER_83               0x3053 +#define WM8994_WRITE_SEQUENCER_84               0x3054 +#define WM8994_WRITE_SEQUENCER_85               0x3055 +#define WM8994_WRITE_SEQUENCER_86               0x3056 +#define WM8994_WRITE_SEQUENCER_87               0x3057 +#define WM8994_WRITE_SEQUENCER_88               0x3058 +#define WM8994_WRITE_SEQUENCER_89               0x3059 +#define WM8994_WRITE_SEQUENCER_90               0x305A +#define WM8994_WRITE_SEQUENCER_91               0x305B +#define WM8994_WRITE_SEQUENCER_92               0x305C +#define WM8994_WRITE_SEQUENCER_93               0x305D +#define WM8994_WRITE_SEQUENCER_94               0x305E +#define WM8994_WRITE_SEQUENCER_95               0x305F +#define WM8994_WRITE_SEQUENCER_96               0x3060 +#define WM8994_WRITE_SEQUENCER_97               0x3061 +#define WM8994_WRITE_SEQUENCER_98               0x3062 +#define WM8994_WRITE_SEQUENCER_99               0x3063 +#define WM8994_WRITE_SEQUENCER_100              0x3064 +#define WM8994_WRITE_SEQUENCER_101              0x3065 +#define WM8994_WRITE_SEQUENCER_102              0x3066 +#define WM8994_WRITE_SEQUENCER_103              0x3067 +#define WM8994_WRITE_SEQUENCER_104              0x3068 +#define WM8994_WRITE_SEQUENCER_105              0x3069 +#define WM8994_WRITE_SEQUENCER_106              0x306A +#define WM8994_WRITE_SEQUENCER_107              0x306B +#define WM8994_WRITE_SEQUENCER_108              0x306C +#define WM8994_WRITE_SEQUENCER_109              0x306D +#define WM8994_WRITE_SEQUENCER_110              0x306E +#define WM8994_WRITE_SEQUENCER_111              0x306F +#define WM8994_WRITE_SEQUENCER_112              0x3070 +#define WM8994_WRITE_SEQUENCER_113              0x3071 +#define WM8994_WRITE_SEQUENCER_114              0x3072 +#define WM8994_WRITE_SEQUENCER_115              0x3073 +#define WM8994_WRITE_SEQUENCER_116              0x3074 +#define WM8994_WRITE_SEQUENCER_117              0x3075 +#define WM8994_WRITE_SEQUENCER_118              0x3076 +#define WM8994_WRITE_SEQUENCER_119              0x3077 +#define WM8994_WRITE_SEQUENCER_120              0x3078 +#define WM8994_WRITE_SEQUENCER_121              0x3079 +#define WM8994_WRITE_SEQUENCER_122              0x307A +#define WM8994_WRITE_SEQUENCER_123              0x307B +#define WM8994_WRITE_SEQUENCER_124              0x307C +#define WM8994_WRITE_SEQUENCER_125              0x307D +#define WM8994_WRITE_SEQUENCER_126              0x307E +#define WM8994_WRITE_SEQUENCER_127              0x307F +#define WM8994_WRITE_SEQUENCER_128              0x3080 +#define WM8994_WRITE_SEQUENCER_129              0x3081 +#define WM8994_WRITE_SEQUENCER_130              0x3082 +#define WM8994_WRITE_SEQUENCER_131              0x3083 +#define WM8994_WRITE_SEQUENCER_132              0x3084 +#define WM8994_WRITE_SEQUENCER_133              0x3085 +#define WM8994_WRITE_SEQUENCER_134              0x3086 +#define WM8994_WRITE_SEQUENCER_135              0x3087 +#define WM8994_WRITE_SEQUENCER_136              0x3088 +#define WM8994_WRITE_SEQUENCER_137              0x3089 +#define WM8994_WRITE_SEQUENCER_138              0x308A +#define WM8994_WRITE_SEQUENCER_139              0x308B +#define WM8994_WRITE_SEQUENCER_140              0x308C +#define WM8994_WRITE_SEQUENCER_141              0x308D +#define WM8994_WRITE_SEQUENCER_142              0x308E +#define WM8994_WRITE_SEQUENCER_143              0x308F +#define WM8994_WRITE_SEQUENCER_144              0x3090 +#define WM8994_WRITE_SEQUENCER_145              0x3091 +#define WM8994_WRITE_SEQUENCER_146              0x3092 +#define WM8994_WRITE_SEQUENCER_147              0x3093 +#define WM8994_WRITE_SEQUENCER_148              0x3094 +#define WM8994_WRITE_SEQUENCER_149              0x3095 +#define WM8994_WRITE_SEQUENCER_150              0x3096 +#define WM8994_WRITE_SEQUENCER_151              0x3097 +#define WM8994_WRITE_SEQUENCER_152              0x3098 +#define WM8994_WRITE_SEQUENCER_153              0x3099 +#define WM8994_WRITE_SEQUENCER_154              0x309A +#define WM8994_WRITE_SEQUENCER_155              0x309B +#define WM8994_WRITE_SEQUENCER_156              0x309C +#define WM8994_WRITE_SEQUENCER_157              0x309D +#define WM8994_WRITE_SEQUENCER_158              0x309E +#define WM8994_WRITE_SEQUENCER_159              0x309F +#define WM8994_WRITE_SEQUENCER_160              0x30A0 +#define WM8994_WRITE_SEQUENCER_161              0x30A1 +#define WM8994_WRITE_SEQUENCER_162              0x30A2 +#define WM8994_WRITE_SEQUENCER_163              0x30A3 +#define WM8994_WRITE_SEQUENCER_164              0x30A4 +#define WM8994_WRITE_SEQUENCER_165              0x30A5 +#define WM8994_WRITE_SEQUENCER_166              0x30A6 +#define WM8994_WRITE_SEQUENCER_167              0x30A7 +#define WM8994_WRITE_SEQUENCER_168              0x30A8 +#define WM8994_WRITE_SEQUENCER_169              0x30A9 +#define WM8994_WRITE_SEQUENCER_170              0x30AA +#define WM8994_WRITE_SEQUENCER_171              0x30AB +#define WM8994_WRITE_SEQUENCER_172              0x30AC +#define WM8994_WRITE_SEQUENCER_173              0x30AD +#define WM8994_WRITE_SEQUENCER_174              0x30AE +#define WM8994_WRITE_SEQUENCER_175              0x30AF +#define WM8994_WRITE_SEQUENCER_176              0x30B0 +#define WM8994_WRITE_SEQUENCER_177              0x30B1 +#define WM8994_WRITE_SEQUENCER_178              0x30B2 +#define WM8994_WRITE_SEQUENCER_179              0x30B3 +#define WM8994_WRITE_SEQUENCER_180              0x30B4 +#define WM8994_WRITE_SEQUENCER_181              0x30B5 +#define WM8994_WRITE_SEQUENCER_182              0x30B6 +#define WM8994_WRITE_SEQUENCER_183              0x30B7 +#define WM8994_WRITE_SEQUENCER_184              0x30B8 +#define WM8994_WRITE_SEQUENCER_185              0x30B9 +#define WM8994_WRITE_SEQUENCER_186              0x30BA +#define WM8994_WRITE_SEQUENCER_187              0x30BB +#define WM8994_WRITE_SEQUENCER_188              0x30BC +#define WM8994_WRITE_SEQUENCER_189              0x30BD +#define WM8994_WRITE_SEQUENCER_190              0x30BE +#define WM8994_WRITE_SEQUENCER_191              0x30BF +#define WM8994_WRITE_SEQUENCER_192              0x30C0 +#define WM8994_WRITE_SEQUENCER_193              0x30C1 +#define WM8994_WRITE_SEQUENCER_194              0x30C2 +#define WM8994_WRITE_SEQUENCER_195              0x30C3 +#define WM8994_WRITE_SEQUENCER_196              0x30C4 +#define WM8994_WRITE_SEQUENCER_197              0x30C5 +#define WM8994_WRITE_SEQUENCER_198              0x30C6 +#define WM8994_WRITE_SEQUENCER_199              0x30C7 +#define WM8994_WRITE_SEQUENCER_200              0x30C8 +#define WM8994_WRITE_SEQUENCER_201              0x30C9 +#define WM8994_WRITE_SEQUENCER_202              0x30CA +#define WM8994_WRITE_SEQUENCER_203              0x30CB +#define WM8994_WRITE_SEQUENCER_204              0x30CC +#define WM8994_WRITE_SEQUENCER_205              0x30CD +#define WM8994_WRITE_SEQUENCER_206              0x30CE +#define WM8994_WRITE_SEQUENCER_207              0x30CF +#define WM8994_WRITE_SEQUENCER_208              0x30D0 +#define WM8994_WRITE_SEQUENCER_209              0x30D1 +#define WM8994_WRITE_SEQUENCER_210              0x30D2 +#define WM8994_WRITE_SEQUENCER_211              0x30D3 +#define WM8994_WRITE_SEQUENCER_212              0x30D4 +#define WM8994_WRITE_SEQUENCER_213              0x30D5 +#define WM8994_WRITE_SEQUENCER_214              0x30D6 +#define WM8994_WRITE_SEQUENCER_215              0x30D7 +#define WM8994_WRITE_SEQUENCER_216              0x30D8 +#define WM8994_WRITE_SEQUENCER_217              0x30D9 +#define WM8994_WRITE_SEQUENCER_218              0x30DA +#define WM8994_WRITE_SEQUENCER_219              0x30DB +#define WM8994_WRITE_SEQUENCER_220              0x30DC +#define WM8994_WRITE_SEQUENCER_221              0x30DD +#define WM8994_WRITE_SEQUENCER_222              0x30DE +#define WM8994_WRITE_SEQUENCER_223              0x30DF +#define WM8994_WRITE_SEQUENCER_224              0x30E0 +#define WM8994_WRITE_SEQUENCER_225              0x30E1 +#define WM8994_WRITE_SEQUENCER_226              0x30E2 +#define WM8994_WRITE_SEQUENCER_227              0x30E3 +#define WM8994_WRITE_SEQUENCER_228              0x30E4 +#define WM8994_WRITE_SEQUENCER_229              0x30E5 +#define WM8994_WRITE_SEQUENCER_230              0x30E6 +#define WM8994_WRITE_SEQUENCER_231              0x30E7 +#define WM8994_WRITE_SEQUENCER_232              0x30E8 +#define WM8994_WRITE_SEQUENCER_233              0x30E9 +#define WM8994_WRITE_SEQUENCER_234              0x30EA +#define WM8994_WRITE_SEQUENCER_235              0x30EB +#define WM8994_WRITE_SEQUENCER_236              0x30EC +#define WM8994_WRITE_SEQUENCER_237              0x30ED +#define WM8994_WRITE_SEQUENCER_238              0x30EE +#define WM8994_WRITE_SEQUENCER_239              0x30EF +#define WM8994_WRITE_SEQUENCER_240              0x30F0 +#define WM8994_WRITE_SEQUENCER_241              0x30F1 +#define WM8994_WRITE_SEQUENCER_242              0x30F2 +#define WM8994_WRITE_SEQUENCER_243              0x30F3 +#define WM8994_WRITE_SEQUENCER_244              0x30F4 +#define WM8994_WRITE_SEQUENCER_245              0x30F5 +#define WM8994_WRITE_SEQUENCER_246              0x30F6 +#define WM8994_WRITE_SEQUENCER_247              0x30F7 +#define WM8994_WRITE_SEQUENCER_248              0x30F8 +#define WM8994_WRITE_SEQUENCER_249              0x30F9 +#define WM8994_WRITE_SEQUENCER_250              0x30FA +#define WM8994_WRITE_SEQUENCER_251              0x30FB +#define WM8994_WRITE_SEQUENCER_252              0x30FC +#define WM8994_WRITE_SEQUENCER_253              0x30FD +#define WM8994_WRITE_SEQUENCER_254              0x30FE +#define WM8994_WRITE_SEQUENCER_255              0x30FF +#define WM8994_WRITE_SEQUENCER_256              0x3100 +#define WM8994_WRITE_SEQUENCER_257              0x3101 +#define WM8994_WRITE_SEQUENCER_258              0x3102 +#define WM8994_WRITE_SEQUENCER_259              0x3103 +#define WM8994_WRITE_SEQUENCER_260              0x3104 +#define WM8994_WRITE_SEQUENCER_261              0x3105 +#define WM8994_WRITE_SEQUENCER_262              0x3106 +#define WM8994_WRITE_SEQUENCER_263              0x3107 +#define WM8994_WRITE_SEQUENCER_264              0x3108 +#define WM8994_WRITE_SEQUENCER_265              0x3109 +#define WM8994_WRITE_SEQUENCER_266              0x310A +#define WM8994_WRITE_SEQUENCER_267              0x310B +#define WM8994_WRITE_SEQUENCER_268              0x310C +#define WM8994_WRITE_SEQUENCER_269              0x310D +#define WM8994_WRITE_SEQUENCER_270              0x310E +#define WM8994_WRITE_SEQUENCER_271              0x310F +#define WM8994_WRITE_SEQUENCER_272              0x3110 +#define WM8994_WRITE_SEQUENCER_273              0x3111 +#define WM8994_WRITE_SEQUENCER_274              0x3112 +#define WM8994_WRITE_SEQUENCER_275              0x3113 +#define WM8994_WRITE_SEQUENCER_276              0x3114 +#define WM8994_WRITE_SEQUENCER_277              0x3115 +#define WM8994_WRITE_SEQUENCER_278              0x3116 +#define WM8994_WRITE_SEQUENCER_279              0x3117 +#define WM8994_WRITE_SEQUENCER_280              0x3118 +#define WM8994_WRITE_SEQUENCER_281              0x3119 +#define WM8994_WRITE_SEQUENCER_282              0x311A +#define WM8994_WRITE_SEQUENCER_283              0x311B +#define WM8994_WRITE_SEQUENCER_284              0x311C +#define WM8994_WRITE_SEQUENCER_285              0x311D +#define WM8994_WRITE_SEQUENCER_286              0x311E +#define WM8994_WRITE_SEQUENCER_287              0x311F +#define WM8994_WRITE_SEQUENCER_288              0x3120 +#define WM8994_WRITE_SEQUENCER_289              0x3121 +#define WM8994_WRITE_SEQUENCER_290              0x3122 +#define WM8994_WRITE_SEQUENCER_291              0x3123 +#define WM8994_WRITE_SEQUENCER_292              0x3124 +#define WM8994_WRITE_SEQUENCER_293              0x3125 +#define WM8994_WRITE_SEQUENCER_294              0x3126 +#define WM8994_WRITE_SEQUENCER_295              0x3127 +#define WM8994_WRITE_SEQUENCER_296              0x3128 +#define WM8994_WRITE_SEQUENCER_297              0x3129 +#define WM8994_WRITE_SEQUENCER_298              0x312A +#define WM8994_WRITE_SEQUENCER_299              0x312B +#define WM8994_WRITE_SEQUENCER_300              0x312C +#define WM8994_WRITE_SEQUENCER_301              0x312D +#define WM8994_WRITE_SEQUENCER_302              0x312E +#define WM8994_WRITE_SEQUENCER_303              0x312F +#define WM8994_WRITE_SEQUENCER_304              0x3130 +#define WM8994_WRITE_SEQUENCER_305              0x3131 +#define WM8994_WRITE_SEQUENCER_306              0x3132 +#define WM8994_WRITE_SEQUENCER_307              0x3133 +#define WM8994_WRITE_SEQUENCER_308              0x3134 +#define WM8994_WRITE_SEQUENCER_309              0x3135 +#define WM8994_WRITE_SEQUENCER_310              0x3136 +#define WM8994_WRITE_SEQUENCER_311              0x3137 +#define WM8994_WRITE_SEQUENCER_312              0x3138 +#define WM8994_WRITE_SEQUENCER_313              0x3139 +#define WM8994_WRITE_SEQUENCER_314              0x313A +#define WM8994_WRITE_SEQUENCER_315              0x313B +#define WM8994_WRITE_SEQUENCER_316              0x313C +#define WM8994_WRITE_SEQUENCER_317              0x313D +#define WM8994_WRITE_SEQUENCER_318              0x313E +#define WM8994_WRITE_SEQUENCER_319              0x313F +#define WM8994_WRITE_SEQUENCER_320              0x3140 +#define WM8994_WRITE_SEQUENCER_321              0x3141 +#define WM8994_WRITE_SEQUENCER_322              0x3142 +#define WM8994_WRITE_SEQUENCER_323              0x3143 +#define WM8994_WRITE_SEQUENCER_324              0x3144 +#define WM8994_WRITE_SEQUENCER_325              0x3145 +#define WM8994_WRITE_SEQUENCER_326              0x3146 +#define WM8994_WRITE_SEQUENCER_327              0x3147 +#define WM8994_WRITE_SEQUENCER_328              0x3148 +#define WM8994_WRITE_SEQUENCER_329              0x3149 +#define WM8994_WRITE_SEQUENCER_330              0x314A +#define WM8994_WRITE_SEQUENCER_331              0x314B +#define WM8994_WRITE_SEQUENCER_332              0x314C +#define WM8994_WRITE_SEQUENCER_333              0x314D +#define WM8994_WRITE_SEQUENCER_334              0x314E +#define WM8994_WRITE_SEQUENCER_335              0x314F +#define WM8994_WRITE_SEQUENCER_336              0x3150 +#define WM8994_WRITE_SEQUENCER_337              0x3151 +#define WM8994_WRITE_SEQUENCER_338              0x3152 +#define WM8994_WRITE_SEQUENCER_339              0x3153 +#define WM8994_WRITE_SEQUENCER_340              0x3154 +#define WM8994_WRITE_SEQUENCER_341              0x3155 +#define WM8994_WRITE_SEQUENCER_342              0x3156 +#define WM8994_WRITE_SEQUENCER_343              0x3157 +#define WM8994_WRITE_SEQUENCER_344              0x3158 +#define WM8994_WRITE_SEQUENCER_345              0x3159 +#define WM8994_WRITE_SEQUENCER_346              0x315A +#define WM8994_WRITE_SEQUENCER_347              0x315B +#define WM8994_WRITE_SEQUENCER_348              0x315C +#define WM8994_WRITE_SEQUENCER_349              0x315D +#define WM8994_WRITE_SEQUENCER_350              0x315E +#define WM8994_WRITE_SEQUENCER_351              0x315F +#define WM8994_WRITE_SEQUENCER_352              0x3160 +#define WM8994_WRITE_SEQUENCER_353              0x3161 +#define WM8994_WRITE_SEQUENCER_354              0x3162 +#define WM8994_WRITE_SEQUENCER_355              0x3163 +#define WM8994_WRITE_SEQUENCER_356              0x3164 +#define WM8994_WRITE_SEQUENCER_357              0x3165 +#define WM8994_WRITE_SEQUENCER_358              0x3166 +#define WM8994_WRITE_SEQUENCER_359              0x3167 +#define WM8994_WRITE_SEQUENCER_360              0x3168 +#define WM8994_WRITE_SEQUENCER_361              0x3169 +#define WM8994_WRITE_SEQUENCER_362              0x316A +#define WM8994_WRITE_SEQUENCER_363              0x316B +#define WM8994_WRITE_SEQUENCER_364              0x316C +#define WM8994_WRITE_SEQUENCER_365              0x316D +#define WM8994_WRITE_SEQUENCER_366              0x316E +#define WM8994_WRITE_SEQUENCER_367              0x316F +#define WM8994_WRITE_SEQUENCER_368              0x3170 +#define WM8994_WRITE_SEQUENCER_369              0x3171 +#define WM8994_WRITE_SEQUENCER_370              0x3172 +#define WM8994_WRITE_SEQUENCER_371              0x3173 +#define WM8994_WRITE_SEQUENCER_372              0x3174 +#define WM8994_WRITE_SEQUENCER_373              0x3175 +#define WM8994_WRITE_SEQUENCER_374              0x3176 +#define WM8994_WRITE_SEQUENCER_375              0x3177 +#define WM8994_WRITE_SEQUENCER_376              0x3178 +#define WM8994_WRITE_SEQUENCER_377              0x3179 +#define WM8994_WRITE_SEQUENCER_378              0x317A +#define WM8994_WRITE_SEQUENCER_379              0x317B +#define WM8994_WRITE_SEQUENCER_380              0x317C +#define WM8994_WRITE_SEQUENCER_381              0x317D +#define WM8994_WRITE_SEQUENCER_382              0x317E +#define WM8994_WRITE_SEQUENCER_383              0x317F +#define WM8994_WRITE_SEQUENCER_384              0x3180 +#define WM8994_WRITE_SEQUENCER_385              0x3181 +#define WM8994_WRITE_SEQUENCER_386              0x3182 +#define WM8994_WRITE_SEQUENCER_387              0x3183 +#define WM8994_WRITE_SEQUENCER_388              0x3184 +#define WM8994_WRITE_SEQUENCER_389              0x3185 +#define WM8994_WRITE_SEQUENCER_390              0x3186 +#define WM8994_WRITE_SEQUENCER_391              0x3187 +#define WM8994_WRITE_SEQUENCER_392              0x3188 +#define WM8994_WRITE_SEQUENCER_393              0x3189 +#define WM8994_WRITE_SEQUENCER_394              0x318A +#define WM8994_WRITE_SEQUENCER_395              0x318B +#define WM8994_WRITE_SEQUENCER_396              0x318C +#define WM8994_WRITE_SEQUENCER_397              0x318D +#define WM8994_WRITE_SEQUENCER_398              0x318E +#define WM8994_WRITE_SEQUENCER_399              0x318F +#define WM8994_WRITE_SEQUENCER_400              0x3190 +#define WM8994_WRITE_SEQUENCER_401              0x3191 +#define WM8994_WRITE_SEQUENCER_402              0x3192 +#define WM8994_WRITE_SEQUENCER_403              0x3193 +#define WM8994_WRITE_SEQUENCER_404              0x3194 +#define WM8994_WRITE_SEQUENCER_405              0x3195 +#define WM8994_WRITE_SEQUENCER_406              0x3196 +#define WM8994_WRITE_SEQUENCER_407              0x3197 +#define WM8994_WRITE_SEQUENCER_408              0x3198 +#define WM8994_WRITE_SEQUENCER_409              0x3199 +#define WM8994_WRITE_SEQUENCER_410              0x319A +#define WM8994_WRITE_SEQUENCER_411              0x319B +#define WM8994_WRITE_SEQUENCER_412              0x319C +#define WM8994_WRITE_SEQUENCER_413              0x319D +#define WM8994_WRITE_SEQUENCER_414              0x319E +#define WM8994_WRITE_SEQUENCER_415              0x319F +#define WM8994_WRITE_SEQUENCER_416              0x31A0 +#define WM8994_WRITE_SEQUENCER_417              0x31A1 +#define WM8994_WRITE_SEQUENCER_418              0x31A2 +#define WM8994_WRITE_SEQUENCER_419              0x31A3 +#define WM8994_WRITE_SEQUENCER_420              0x31A4 +#define WM8994_WRITE_SEQUENCER_421              0x31A5 +#define WM8994_WRITE_SEQUENCER_422              0x31A6 +#define WM8994_WRITE_SEQUENCER_423              0x31A7 +#define WM8994_WRITE_SEQUENCER_424              0x31A8 +#define WM8994_WRITE_SEQUENCER_425              0x31A9 +#define WM8994_WRITE_SEQUENCER_426              0x31AA +#define WM8994_WRITE_SEQUENCER_427              0x31AB +#define WM8994_WRITE_SEQUENCER_428              0x31AC +#define WM8994_WRITE_SEQUENCER_429              0x31AD +#define WM8994_WRITE_SEQUENCER_430              0x31AE +#define WM8994_WRITE_SEQUENCER_431              0x31AF +#define WM8994_WRITE_SEQUENCER_432              0x31B0 +#define WM8994_WRITE_SEQUENCER_433              0x31B1 +#define WM8994_WRITE_SEQUENCER_434              0x31B2 +#define WM8994_WRITE_SEQUENCER_435              0x31B3 +#define WM8994_WRITE_SEQUENCER_436              0x31B4 +#define WM8994_WRITE_SEQUENCER_437              0x31B5 +#define WM8994_WRITE_SEQUENCER_438              0x31B6 +#define WM8994_WRITE_SEQUENCER_439              0x31B7 +#define WM8994_WRITE_SEQUENCER_440              0x31B8 +#define WM8994_WRITE_SEQUENCER_441              0x31B9 +#define WM8994_WRITE_SEQUENCER_442              0x31BA +#define WM8994_WRITE_SEQUENCER_443              0x31BB +#define WM8994_WRITE_SEQUENCER_444              0x31BC +#define WM8994_WRITE_SEQUENCER_445              0x31BD +#define WM8994_WRITE_SEQUENCER_446              0x31BE +#define WM8994_WRITE_SEQUENCER_447              0x31BF +#define WM8994_WRITE_SEQUENCER_448              0x31C0 +#define WM8994_WRITE_SEQUENCER_449              0x31C1 +#define WM8994_WRITE_SEQUENCER_450              0x31C2 +#define WM8994_WRITE_SEQUENCER_451              0x31C3 +#define WM8994_WRITE_SEQUENCER_452              0x31C4 +#define WM8994_WRITE_SEQUENCER_453              0x31C5 +#define WM8994_WRITE_SEQUENCER_454              0x31C6 +#define WM8994_WRITE_SEQUENCER_455              0x31C7 +#define WM8994_WRITE_SEQUENCER_456              0x31C8 +#define WM8994_WRITE_SEQUENCER_457              0x31C9 +#define WM8994_WRITE_SEQUENCER_458              0x31CA +#define WM8994_WRITE_SEQUENCER_459              0x31CB +#define WM8994_WRITE_SEQUENCER_460              0x31CC +#define WM8994_WRITE_SEQUENCER_461              0x31CD +#define WM8994_WRITE_SEQUENCER_462              0x31CE +#define WM8994_WRITE_SEQUENCER_463              0x31CF +#define WM8994_WRITE_SEQUENCER_464              0x31D0 +#define WM8994_WRITE_SEQUENCER_465              0x31D1 +#define WM8994_WRITE_SEQUENCER_466              0x31D2 +#define WM8994_WRITE_SEQUENCER_467              0x31D3 +#define WM8994_WRITE_SEQUENCER_468              0x31D4 +#define WM8994_WRITE_SEQUENCER_469              0x31D5 +#define WM8994_WRITE_SEQUENCER_470              0x31D6 +#define WM8994_WRITE_SEQUENCER_471              0x31D7 +#define WM8994_WRITE_SEQUENCER_472              0x31D8 +#define WM8994_WRITE_SEQUENCER_473              0x31D9 +#define WM8994_WRITE_SEQUENCER_474              0x31DA +#define WM8994_WRITE_SEQUENCER_475              0x31DB +#define WM8994_WRITE_SEQUENCER_476              0x31DC +#define WM8994_WRITE_SEQUENCER_477              0x31DD +#define WM8994_WRITE_SEQUENCER_478              0x31DE +#define WM8994_WRITE_SEQUENCER_479              0x31DF +#define WM8994_WRITE_SEQUENCER_480              0x31E0 +#define WM8994_WRITE_SEQUENCER_481              0x31E1 +#define WM8994_WRITE_SEQUENCER_482              0x31E2 +#define WM8994_WRITE_SEQUENCER_483              0x31E3 +#define WM8994_WRITE_SEQUENCER_484              0x31E4 +#define WM8994_WRITE_SEQUENCER_485              0x31E5 +#define WM8994_WRITE_SEQUENCER_486              0x31E6 +#define WM8994_WRITE_SEQUENCER_487              0x31E7 +#define WM8994_WRITE_SEQUENCER_488              0x31E8 +#define WM8994_WRITE_SEQUENCER_489              0x31E9 +#define WM8994_WRITE_SEQUENCER_490              0x31EA +#define WM8994_WRITE_SEQUENCER_491              0x31EB +#define WM8994_WRITE_SEQUENCER_492              0x31EC +#define WM8994_WRITE_SEQUENCER_493              0x31ED +#define WM8994_WRITE_SEQUENCER_494              0x31EE +#define WM8994_WRITE_SEQUENCER_495              0x31EF +#define WM8994_WRITE_SEQUENCER_496              0x31F0 +#define WM8994_WRITE_SEQUENCER_497              0x31F1 +#define WM8994_WRITE_SEQUENCER_498              0x31F2 +#define WM8994_WRITE_SEQUENCER_499              0x31F3 +#define WM8994_WRITE_SEQUENCER_500              0x31F4 +#define WM8994_WRITE_SEQUENCER_501              0x31F5 +#define WM8994_WRITE_SEQUENCER_502              0x31F6 +#define WM8994_WRITE_SEQUENCER_503              0x31F7 +#define WM8994_WRITE_SEQUENCER_504              0x31F8 +#define WM8994_WRITE_SEQUENCER_505              0x31F9 +#define WM8994_WRITE_SEQUENCER_506              0x31FA +#define WM8994_WRITE_SEQUENCER_507              0x31FB +#define WM8994_WRITE_SEQUENCER_508              0x31FC +#define WM8994_WRITE_SEQUENCER_509              0x31FD +#define WM8994_WRITE_SEQUENCER_510              0x31FE +#define WM8994_WRITE_SEQUENCER_511              0x31FF + +#define WM8994_REGISTER_COUNT                   736 +#define WM8994_MAX_REGISTER                     0x31FF +#define WM8994_MAX_CACHED_REGISTER              0x749 + +/* + * Field Definitions. + */ + +/* + * R0 (0x00) - Software Reset + */ +#define WM8994_SW_RESET_MASK                    0xFFFF  /* SW_RESET - [15:0] */ +#define WM8994_SW_RESET_SHIFT                        0  /* SW_RESET - [15:0] */ +#define WM8994_SW_RESET_WIDTH                       16  /* SW_RESET - [15:0] */ + +/* + * R1 (0x01) - Power Management (1) + */ +#define WM8994_SPKOUTR_ENA                      0x2000  /* SPKOUTR_ENA */ +#define WM8994_SPKOUTR_ENA_MASK                 0x2000  /* SPKOUTR_ENA */ +#define WM8994_SPKOUTR_ENA_SHIFT                    13  /* SPKOUTR_ENA */ +#define WM8994_SPKOUTR_ENA_WIDTH                     1  /* SPKOUTR_ENA */ +#define WM8994_SPKOUTL_ENA                      0x1000  /* SPKOUTL_ENA */ +#define WM8994_SPKOUTL_ENA_MASK                 0x1000  /* SPKOUTL_ENA */ +#define WM8994_SPKOUTL_ENA_SHIFT                    12  /* SPKOUTL_ENA */ +#define WM8994_SPKOUTL_ENA_WIDTH                     1  /* SPKOUTL_ENA */ +#define WM8994_HPOUT2_ENA                       0x0800  /* HPOUT2_ENA */ +#define WM8994_HPOUT2_ENA_MASK                  0x0800  /* HPOUT2_ENA */ +#define WM8994_HPOUT2_ENA_SHIFT                     11  /* HPOUT2_ENA */ +#define WM8994_HPOUT2_ENA_WIDTH                      1  /* HPOUT2_ENA */ +#define WM8994_HPOUT1L_ENA                      0x0200  /* HPOUT1L_ENA */ +#define WM8994_HPOUT1L_ENA_MASK                 0x0200  /* HPOUT1L_ENA */ +#define WM8994_HPOUT1L_ENA_SHIFT                     9  /* HPOUT1L_ENA */ +#define WM8994_HPOUT1L_ENA_WIDTH                     1  /* HPOUT1L_ENA */ +#define WM8994_HPOUT1R_ENA                      0x0100  /* HPOUT1R_ENA */ +#define WM8994_HPOUT1R_ENA_MASK                 0x0100  /* HPOUT1R_ENA */ +#define WM8994_HPOUT1R_ENA_SHIFT                     8  /* HPOUT1R_ENA */ +#define WM8994_HPOUT1R_ENA_WIDTH                     1  /* HPOUT1R_ENA */ +#define WM8994_MICB2_ENA                        0x0020  /* MICB2_ENA */ +#define WM8994_MICB2_ENA_MASK                   0x0020  /* MICB2_ENA */ +#define WM8994_MICB2_ENA_SHIFT                       5  /* MICB2_ENA */ +#define WM8994_MICB2_ENA_WIDTH                       1  /* MICB2_ENA */ +#define WM8994_MICB1_ENA                        0x0010  /* MICB1_ENA */ +#define WM8994_MICB1_ENA_MASK                   0x0010  /* MICB1_ENA */ +#define WM8994_MICB1_ENA_SHIFT                       4  /* MICB1_ENA */ +#define WM8994_MICB1_ENA_WIDTH                       1  /* MICB1_ENA */ +#define WM8994_VMID_SEL_MASK                    0x0006  /* VMID_SEL - [2:1] */ +#define WM8994_VMID_SEL_SHIFT                        1  /* VMID_SEL - [2:1] */ +#define WM8994_VMID_SEL_WIDTH                        2  /* VMID_SEL - [2:1] */ +#define WM8994_BIAS_ENA                         0x0001  /* BIAS_ENA */ +#define WM8994_BIAS_ENA_MASK                    0x0001  /* BIAS_ENA */ +#define WM8994_BIAS_ENA_SHIFT                        0  /* BIAS_ENA */ +#define WM8994_BIAS_ENA_WIDTH                        1  /* BIAS_ENA */ + +/* + * R2 (0x02) - Power Management (2) + */ +#define WM8994_TSHUT_ENA                        0x4000  /* TSHUT_ENA */ +#define WM8994_TSHUT_ENA_MASK                   0x4000  /* TSHUT_ENA */ +#define WM8994_TSHUT_ENA_SHIFT                      14  /* TSHUT_ENA */ +#define WM8994_TSHUT_ENA_WIDTH                       1  /* TSHUT_ENA */ +#define WM8994_TSHUT_OPDIS                      0x2000  /* TSHUT_OPDIS */ +#define WM8994_TSHUT_OPDIS_MASK                 0x2000  /* TSHUT_OPDIS */ +#define WM8994_TSHUT_OPDIS_SHIFT                    13  /* TSHUT_OPDIS */ +#define WM8994_TSHUT_OPDIS_WIDTH                     1  /* TSHUT_OPDIS */ +#define WM8994_OPCLK_ENA                        0x0800  /* OPCLK_ENA */ +#define WM8994_OPCLK_ENA_MASK                   0x0800  /* OPCLK_ENA */ +#define WM8994_OPCLK_ENA_SHIFT                      11  /* OPCLK_ENA */ +#define WM8994_OPCLK_ENA_WIDTH                       1  /* OPCLK_ENA */ +#define WM8994_MIXINL_ENA                       0x0200  /* MIXINL_ENA */ +#define WM8994_MIXINL_ENA_MASK                  0x0200  /* MIXINL_ENA */ +#define WM8994_MIXINL_ENA_SHIFT                      9  /* MIXINL_ENA */ +#define WM8994_MIXINL_ENA_WIDTH                      1  /* MIXINL_ENA */ +#define WM8994_MIXINR_ENA                       0x0100  /* MIXINR_ENA */ +#define WM8994_MIXINR_ENA_MASK                  0x0100  /* MIXINR_ENA */ +#define WM8994_MIXINR_ENA_SHIFT                      8  /* MIXINR_ENA */ +#define WM8994_MIXINR_ENA_WIDTH                      1  /* MIXINR_ENA */ +#define WM8994_IN2L_ENA                         0x0080  /* IN2L_ENA */ +#define WM8994_IN2L_ENA_MASK                    0x0080  /* IN2L_ENA */ +#define WM8994_IN2L_ENA_SHIFT                        7  /* IN2L_ENA */ +#define WM8994_IN2L_ENA_WIDTH                        1  /* IN2L_ENA */ +#define WM8994_IN1L_ENA                         0x0040  /* IN1L_ENA */ +#define WM8994_IN1L_ENA_MASK                    0x0040  /* IN1L_ENA */ +#define WM8994_IN1L_ENA_SHIFT                        6  /* IN1L_ENA */ +#define WM8994_IN1L_ENA_WIDTH                        1  /* IN1L_ENA */ +#define WM8994_IN2R_ENA                         0x0020  /* IN2R_ENA */ +#define WM8994_IN2R_ENA_MASK                    0x0020  /* IN2R_ENA */ +#define WM8994_IN2R_ENA_SHIFT                        5  /* IN2R_ENA */ +#define WM8994_IN2R_ENA_WIDTH                        1  /* IN2R_ENA */ +#define WM8994_IN1R_ENA                         0x0010  /* IN1R_ENA */ +#define WM8994_IN1R_ENA_MASK                    0x0010  /* IN1R_ENA */ +#define WM8994_IN1R_ENA_SHIFT                        4  /* IN1R_ENA */ +#define WM8994_IN1R_ENA_WIDTH                        1  /* IN1R_ENA */ + +/* + * R3 (0x03) - Power Management (3) + */ +#define WM8994_LINEOUT1N_ENA                    0x2000  /* LINEOUT1N_ENA */ +#define WM8994_LINEOUT1N_ENA_MASK               0x2000  /* LINEOUT1N_ENA */ +#define WM8994_LINEOUT1N_ENA_SHIFT                  13  /* LINEOUT1N_ENA */ +#define WM8994_LINEOUT1N_ENA_WIDTH                   1  /* LINEOUT1N_ENA */ +#define WM8994_LINEOUT1P_ENA                    0x1000  /* LINEOUT1P_ENA */ +#define WM8994_LINEOUT1P_ENA_MASK               0x1000  /* LINEOUT1P_ENA */ +#define WM8994_LINEOUT1P_ENA_SHIFT                  12  /* LINEOUT1P_ENA */ +#define WM8994_LINEOUT1P_ENA_WIDTH                   1  /* LINEOUT1P_ENA */ +#define WM8994_LINEOUT2N_ENA                    0x0800  /* LINEOUT2N_ENA */ +#define WM8994_LINEOUT2N_ENA_MASK               0x0800  /* LINEOUT2N_ENA */ +#define WM8994_LINEOUT2N_ENA_SHIFT                  11  /* LINEOUT2N_ENA */ +#define WM8994_LINEOUT2N_ENA_WIDTH                   1  /* LINEOUT2N_ENA */ +#define WM8994_LINEOUT2P_ENA                    0x0400  /* LINEOUT2P_ENA */ +#define WM8994_LINEOUT2P_ENA_MASK               0x0400  /* LINEOUT2P_ENA */ +#define WM8994_LINEOUT2P_ENA_SHIFT                  10  /* LINEOUT2P_ENA */ +#define WM8994_LINEOUT2P_ENA_WIDTH                   1  /* LINEOUT2P_ENA */ +#define WM8994_SPKRVOL_ENA                      0x0200  /* SPKRVOL_ENA */ +#define WM8994_SPKRVOL_ENA_MASK                 0x0200  /* SPKRVOL_ENA */ +#define WM8994_SPKRVOL_ENA_SHIFT                     9  /* SPKRVOL_ENA */ +#define WM8994_SPKRVOL_ENA_WIDTH                     1  /* SPKRVOL_ENA */ +#define WM8994_SPKLVOL_ENA                      0x0100  /* SPKLVOL_ENA */ +#define WM8994_SPKLVOL_ENA_MASK                 0x0100  /* SPKLVOL_ENA */ +#define WM8994_SPKLVOL_ENA_SHIFT                     8  /* SPKLVOL_ENA */ +#define WM8994_SPKLVOL_ENA_WIDTH                     1  /* SPKLVOL_ENA */ +#define WM8994_MIXOUTLVOL_ENA                   0x0080  /* MIXOUTLVOL_ENA */ +#define WM8994_MIXOUTLVOL_ENA_MASK              0x0080  /* MIXOUTLVOL_ENA */ +#define WM8994_MIXOUTLVOL_ENA_SHIFT                  7  /* MIXOUTLVOL_ENA */ +#define WM8994_MIXOUTLVOL_ENA_WIDTH                  1  /* MIXOUTLVOL_ENA */ +#define WM8994_MIXOUTRVOL_ENA                   0x0040  /* MIXOUTRVOL_ENA */ +#define WM8994_MIXOUTRVOL_ENA_MASK              0x0040  /* MIXOUTRVOL_ENA */ +#define WM8994_MIXOUTRVOL_ENA_SHIFT                  6  /* MIXOUTRVOL_ENA */ +#define WM8994_MIXOUTRVOL_ENA_WIDTH                  1  /* MIXOUTRVOL_ENA */ +#define WM8994_MIXOUTL_ENA                      0x0020  /* MIXOUTL_ENA */ +#define WM8994_MIXOUTL_ENA_MASK                 0x0020  /* MIXOUTL_ENA */ +#define WM8994_MIXOUTL_ENA_SHIFT                     5  /* MIXOUTL_ENA */ +#define WM8994_MIXOUTL_ENA_WIDTH                     1  /* MIXOUTL_ENA */ +#define WM8994_MIXOUTR_ENA                      0x0010  /* MIXOUTR_ENA */ +#define WM8994_MIXOUTR_ENA_MASK                 0x0010  /* MIXOUTR_ENA */ +#define WM8994_MIXOUTR_ENA_SHIFT                     4  /* MIXOUTR_ENA */ +#define WM8994_MIXOUTR_ENA_WIDTH                     1  /* MIXOUTR_ENA */ + +/* + * R4 (0x04) - Power Management (4) + */ +#define WM8994_AIF2ADCL_ENA                     0x2000  /* AIF2ADCL_ENA */ +#define WM8994_AIF2ADCL_ENA_MASK                0x2000  /* AIF2ADCL_ENA */ +#define WM8994_AIF2ADCL_ENA_SHIFT                   13  /* AIF2ADCL_ENA */ +#define WM8994_AIF2ADCL_ENA_WIDTH                    1  /* AIF2ADCL_ENA */ +#define WM8994_AIF2ADCR_ENA                     0x1000  /* AIF2ADCR_ENA */ +#define WM8994_AIF2ADCR_ENA_MASK                0x1000  /* AIF2ADCR_ENA */ +#define WM8994_AIF2ADCR_ENA_SHIFT                   12  /* AIF2ADCR_ENA */ +#define WM8994_AIF2ADCR_ENA_WIDTH                    1  /* AIF2ADCR_ENA */ +#define WM8994_AIF1ADC2L_ENA                    0x0800  /* AIF1ADC2L_ENA */ +#define WM8994_AIF1ADC2L_ENA_MASK               0x0800  /* AIF1ADC2L_ENA */ +#define WM8994_AIF1ADC2L_ENA_SHIFT                  11  /* AIF1ADC2L_ENA */ +#define WM8994_AIF1ADC2L_ENA_WIDTH                   1  /* AIF1ADC2L_ENA */ +#define WM8994_AIF1ADC2R_ENA                    0x0400  /* AIF1ADC2R_ENA */ +#define WM8994_AIF1ADC2R_ENA_MASK               0x0400  /* AIF1ADC2R_ENA */ +#define WM8994_AIF1ADC2R_ENA_SHIFT                  10  /* AIF1ADC2R_ENA */ +#define WM8994_AIF1ADC2R_ENA_WIDTH                   1  /* AIF1ADC2R_ENA */ +#define WM8994_AIF1ADC1L_ENA                    0x0200  /* AIF1ADC1L_ENA */ +#define WM8994_AIF1ADC1L_ENA_MASK               0x0200  /* AIF1ADC1L_ENA */ +#define WM8994_AIF1ADC1L_ENA_SHIFT                   9  /* AIF1ADC1L_ENA */ +#define WM8994_AIF1ADC1L_ENA_WIDTH                   1  /* AIF1ADC1L_ENA */ +#define WM8994_AIF1ADC1R_ENA                    0x0100  /* AIF1ADC1R_ENA */ +#define WM8994_AIF1ADC1R_ENA_MASK               0x0100  /* AIF1ADC1R_ENA */ +#define WM8994_AIF1ADC1R_ENA_SHIFT                   8  /* AIF1ADC1R_ENA */ +#define WM8994_AIF1ADC1R_ENA_WIDTH                   1  /* AIF1ADC1R_ENA */ +#define WM8994_DMIC2L_ENA                       0x0020  /* DMIC2L_ENA */ +#define WM8994_DMIC2L_ENA_MASK                  0x0020  /* DMIC2L_ENA */ +#define WM8994_DMIC2L_ENA_SHIFT                      5  /* DMIC2L_ENA */ +#define WM8994_DMIC2L_ENA_WIDTH                      1  /* DMIC2L_ENA */ +#define WM8994_DMIC2R_ENA                       0x0010  /* DMIC2R_ENA */ +#define WM8994_DMIC2R_ENA_MASK                  0x0010  /* DMIC2R_ENA */ +#define WM8994_DMIC2R_ENA_SHIFT                      4  /* DMIC2R_ENA */ +#define WM8994_DMIC2R_ENA_WIDTH                      1  /* DMIC2R_ENA */ +#define WM8994_DMIC1L_ENA                       0x0008  /* DMIC1L_ENA */ +#define WM8994_DMIC1L_ENA_MASK                  0x0008  /* DMIC1L_ENA */ +#define WM8994_DMIC1L_ENA_SHIFT                      3  /* DMIC1L_ENA */ +#define WM8994_DMIC1L_ENA_WIDTH                      1  /* DMIC1L_ENA */ +#define WM8994_DMIC1R_ENA                       0x0004  /* DMIC1R_ENA */ +#define WM8994_DMIC1R_ENA_MASK                  0x0004  /* DMIC1R_ENA */ +#define WM8994_DMIC1R_ENA_SHIFT                      2  /* DMIC1R_ENA */ +#define WM8994_DMIC1R_ENA_WIDTH                      1  /* DMIC1R_ENA */ +#define WM8994_ADCL_ENA                         0x0002  /* ADCL_ENA */ +#define WM8994_ADCL_ENA_MASK                    0x0002  /* ADCL_ENA */ +#define WM8994_ADCL_ENA_SHIFT                        1  /* ADCL_ENA */ +#define WM8994_ADCL_ENA_WIDTH                        1  /* ADCL_ENA */ +#define WM8994_ADCR_ENA                         0x0001  /* ADCR_ENA */ +#define WM8994_ADCR_ENA_MASK                    0x0001  /* ADCR_ENA */ +#define WM8994_ADCR_ENA_SHIFT                        0  /* ADCR_ENA */ +#define WM8994_ADCR_ENA_WIDTH                        1  /* ADCR_ENA */ + +/* + * R5 (0x05) - Power Management (5) + */ +#define WM8994_AIF2DACL_ENA                     0x2000  /* AIF2DACL_ENA */ +#define WM8994_AIF2DACL_ENA_MASK                0x2000  /* AIF2DACL_ENA */ +#define WM8994_AIF2DACL_ENA_SHIFT                   13  /* AIF2DACL_ENA */ +#define WM8994_AIF2DACL_ENA_WIDTH                    1  /* AIF2DACL_ENA */ +#define WM8994_AIF2DACR_ENA                     0x1000  /* AIF2DACR_ENA */ +#define WM8994_AIF2DACR_ENA_MASK                0x1000  /* AIF2DACR_ENA */ +#define WM8994_AIF2DACR_ENA_SHIFT                   12  /* AIF2DACR_ENA */ +#define WM8994_AIF2DACR_ENA_WIDTH                    1  /* AIF2DACR_ENA */ +#define WM8994_AIF1DAC2L_ENA                    0x0800  /* AIF1DAC2L_ENA */ +#define WM8994_AIF1DAC2L_ENA_MASK               0x0800  /* AIF1DAC2L_ENA */ +#define WM8994_AIF1DAC2L_ENA_SHIFT                  11  /* AIF1DAC2L_ENA */ +#define WM8994_AIF1DAC2L_ENA_WIDTH                   1  /* AIF1DAC2L_ENA */ +#define WM8994_AIF1DAC2R_ENA                    0x0400  /* AIF1DAC2R_ENA */ +#define WM8994_AIF1DAC2R_ENA_MASK               0x0400  /* AIF1DAC2R_ENA */ +#define WM8994_AIF1DAC2R_ENA_SHIFT                  10  /* AIF1DAC2R_ENA */ +#define WM8994_AIF1DAC2R_ENA_WIDTH                   1  /* AIF1DAC2R_ENA */ +#define WM8994_AIF1DAC1L_ENA                    0x0200  /* AIF1DAC1L_ENA */ +#define WM8994_AIF1DAC1L_ENA_MASK               0x0200  /* AIF1DAC1L_ENA */ +#define WM8994_AIF1DAC1L_ENA_SHIFT                   9  /* AIF1DAC1L_ENA */ +#define WM8994_AIF1DAC1L_ENA_WIDTH                   1  /* AIF1DAC1L_ENA */ +#define WM8994_AIF1DAC1R_ENA                    0x0100  /* AIF1DAC1R_ENA */ +#define WM8994_AIF1DAC1R_ENA_MASK               0x0100  /* AIF1DAC1R_ENA */ +#define WM8994_AIF1DAC1R_ENA_SHIFT                   8  /* AIF1DAC1R_ENA */ +#define WM8994_AIF1DAC1R_ENA_WIDTH                   1  /* AIF1DAC1R_ENA */ +#define WM8994_DAC2L_ENA                        0x0008  /* DAC2L_ENA */ +#define WM8994_DAC2L_ENA_MASK                   0x0008  /* DAC2L_ENA */ +#define WM8994_DAC2L_ENA_SHIFT                       3  /* DAC2L_ENA */ +#define WM8994_DAC2L_ENA_WIDTH                       1  /* DAC2L_ENA */ +#define WM8994_DAC2R_ENA                        0x0004  /* DAC2R_ENA */ +#define WM8994_DAC2R_ENA_MASK                   0x0004  /* DAC2R_ENA */ +#define WM8994_DAC2R_ENA_SHIFT                       2  /* DAC2R_ENA */ +#define WM8994_DAC2R_ENA_WIDTH                       1  /* DAC2R_ENA */ +#define WM8994_DAC1L_ENA                        0x0002  /* DAC1L_ENA */ +#define WM8994_DAC1L_ENA_MASK                   0x0002  /* DAC1L_ENA */ +#define WM8994_DAC1L_ENA_SHIFT                       1  /* DAC1L_ENA */ +#define WM8994_DAC1L_ENA_WIDTH                       1  /* DAC1L_ENA */ +#define WM8994_DAC1R_ENA                        0x0001  /* DAC1R_ENA */ +#define WM8994_DAC1R_ENA_MASK                   0x0001  /* DAC1R_ENA */ +#define WM8994_DAC1R_ENA_SHIFT                       0  /* DAC1R_ENA */ +#define WM8994_DAC1R_ENA_WIDTH                       1  /* DAC1R_ENA */ + +/* + * R6 (0x06) - Power Management (6) + */ +#define WM8994_AIF3_TRI                         0x0020  /* AIF3_TRI */ +#define WM8994_AIF3_TRI_MASK                    0x0020  /* AIF3_TRI */ +#define WM8994_AIF3_TRI_SHIFT                        5  /* AIF3_TRI */ +#define WM8994_AIF3_TRI_WIDTH                        1  /* AIF3_TRI */ +#define WM8994_AIF3_ADCDAT_SRC_MASK             0x0018  /* AIF3_ADCDAT_SRC - [4:3] */ +#define WM8994_AIF3_ADCDAT_SRC_SHIFT                 3  /* AIF3_ADCDAT_SRC - [4:3] */ +#define WM8994_AIF3_ADCDAT_SRC_WIDTH                 2  /* AIF3_ADCDAT_SRC - [4:3] */ +#define WM8994_AIF2_ADCDAT_SRC                  0x0004  /* AIF2_ADCDAT_SRC */ +#define WM8994_AIF2_ADCDAT_SRC_MASK             0x0004  /* AIF2_ADCDAT_SRC */ +#define WM8994_AIF2_ADCDAT_SRC_SHIFT                 2  /* AIF2_ADCDAT_SRC */ +#define WM8994_AIF2_ADCDAT_SRC_WIDTH                 1  /* AIF2_ADCDAT_SRC */ +#define WM8994_AIF2_DACDAT_SRC                  0x0002  /* AIF2_DACDAT_SRC */ +#define WM8994_AIF2_DACDAT_SRC_MASK             0x0002  /* AIF2_DACDAT_SRC */ +#define WM8994_AIF2_DACDAT_SRC_SHIFT                 1  /* AIF2_DACDAT_SRC */ +#define WM8994_AIF2_DACDAT_SRC_WIDTH                 1  /* AIF2_DACDAT_SRC */ +#define WM8994_AIF1_DACDAT_SRC                  0x0001  /* AIF1_DACDAT_SRC */ +#define WM8994_AIF1_DACDAT_SRC_MASK             0x0001  /* AIF1_DACDAT_SRC */ +#define WM8994_AIF1_DACDAT_SRC_SHIFT                 0  /* AIF1_DACDAT_SRC */ +#define WM8994_AIF1_DACDAT_SRC_WIDTH                 1  /* AIF1_DACDAT_SRC */ + +/* + * R21 (0x15) - Input Mixer (1) + */ +#define WM8994_IN1RP_MIXINR_BOOST               0x0100  /* IN1RP_MIXINR_BOOST */ +#define WM8994_IN1RP_MIXINR_BOOST_MASK          0x0100  /* IN1RP_MIXINR_BOOST */ +#define WM8994_IN1RP_MIXINR_BOOST_SHIFT              8  /* IN1RP_MIXINR_BOOST */ +#define WM8994_IN1RP_MIXINR_BOOST_WIDTH              1  /* IN1RP_MIXINR_BOOST */ +#define WM8994_IN1LP_MIXINL_BOOST               0x0080  /* IN1LP_MIXINL_BOOST */ +#define WM8994_IN1LP_MIXINL_BOOST_MASK          0x0080  /* IN1LP_MIXINL_BOOST */ +#define WM8994_IN1LP_MIXINL_BOOST_SHIFT              7  /* IN1LP_MIXINL_BOOST */ +#define WM8994_IN1LP_MIXINL_BOOST_WIDTH              1  /* IN1LP_MIXINL_BOOST */ +#define WM8994_INPUTS_CLAMP                     0x0040  /* INPUTS_CLAMP */ +#define WM8994_INPUTS_CLAMP_MASK                0x0040  /* INPUTS_CLAMP */ +#define WM8994_INPUTS_CLAMP_SHIFT                    6  /* INPUTS_CLAMP */ +#define WM8994_INPUTS_CLAMP_WIDTH                    1  /* INPUTS_CLAMP */ + +/* + * R24 (0x18) - Left Line Input 1&2 Volume + */ +#define WM8994_IN1_VU                           0x0100  /* IN1_VU */ +#define WM8994_IN1_VU_MASK                      0x0100  /* IN1_VU */ +#define WM8994_IN1_VU_SHIFT                          8  /* IN1_VU */ +#define WM8994_IN1_VU_WIDTH                          1  /* IN1_VU */ +#define WM8994_IN1L_MUTE                        0x0080  /* IN1L_MUTE */ +#define WM8994_IN1L_MUTE_MASK                   0x0080  /* IN1L_MUTE */ +#define WM8994_IN1L_MUTE_SHIFT                       7  /* IN1L_MUTE */ +#define WM8994_IN1L_MUTE_WIDTH                       1  /* IN1L_MUTE */ +#define WM8994_IN1L_ZC                          0x0040  /* IN1L_ZC */ +#define WM8994_IN1L_ZC_MASK                     0x0040  /* IN1L_ZC */ +#define WM8994_IN1L_ZC_SHIFT                         6  /* IN1L_ZC */ +#define WM8994_IN1L_ZC_WIDTH                         1  /* IN1L_ZC */ +#define WM8994_IN1L_VOL_MASK                    0x001F  /* IN1L_VOL - [4:0] */ +#define WM8994_IN1L_VOL_SHIFT                        0  /* IN1L_VOL - [4:0] */ +#define WM8994_IN1L_VOL_WIDTH                        5  /* IN1L_VOL - [4:0] */ + +/* + * R25 (0x19) - Left Line Input 3&4 Volume + */ +#define WM8994_IN2_VU                           0x0100  /* IN2_VU */ +#define WM8994_IN2_VU_MASK                      0x0100  /* IN2_VU */ +#define WM8994_IN2_VU_SHIFT                          8  /* IN2_VU */ +#define WM8994_IN2_VU_WIDTH                          1  /* IN2_VU */ +#define WM8994_IN2L_MUTE                        0x0080  /* IN2L_MUTE */ +#define WM8994_IN2L_MUTE_MASK                   0x0080  /* IN2L_MUTE */ +#define WM8994_IN2L_MUTE_SHIFT                       7  /* IN2L_MUTE */ +#define WM8994_IN2L_MUTE_WIDTH                       1  /* IN2L_MUTE */ +#define WM8994_IN2L_ZC                          0x0040  /* IN2L_ZC */ +#define WM8994_IN2L_ZC_MASK                     0x0040  /* IN2L_ZC */ +#define WM8994_IN2L_ZC_SHIFT                         6  /* IN2L_ZC */ +#define WM8994_IN2L_ZC_WIDTH                         1  /* IN2L_ZC */ +#define WM8994_IN2L_VOL_MASK                    0x001F  /* IN2L_VOL - [4:0] */ +#define WM8994_IN2L_VOL_SHIFT                        0  /* IN2L_VOL - [4:0] */ +#define WM8994_IN2L_VOL_WIDTH                        5  /* IN2L_VOL - [4:0] */ + +/* + * R26 (0x1A) - Right Line Input 1&2 Volume + */ +#define WM8994_IN1_VU                           0x0100  /* IN1_VU */ +#define WM8994_IN1_VU_MASK                      0x0100  /* IN1_VU */ +#define WM8994_IN1_VU_SHIFT                          8  /* IN1_VU */ +#define WM8994_IN1_VU_WIDTH                          1  /* IN1_VU */ +#define WM8994_IN1R_MUTE                        0x0080  /* IN1R_MUTE */ +#define WM8994_IN1R_MUTE_MASK                   0x0080  /* IN1R_MUTE */ +#define WM8994_IN1R_MUTE_SHIFT                       7  /* IN1R_MUTE */ +#define WM8994_IN1R_MUTE_WIDTH                       1  /* IN1R_MUTE */ +#define WM8994_IN1R_ZC                          0x0040  /* IN1R_ZC */ +#define WM8994_IN1R_ZC_MASK                     0x0040  /* IN1R_ZC */ +#define WM8994_IN1R_ZC_SHIFT                         6  /* IN1R_ZC */ +#define WM8994_IN1R_ZC_WIDTH                         1  /* IN1R_ZC */ +#define WM8994_IN1R_VOL_MASK                    0x001F  /* IN1R_VOL - [4:0] */ +#define WM8994_IN1R_VOL_SHIFT                        0  /* IN1R_VOL - [4:0] */ +#define WM8994_IN1R_VOL_WIDTH                        5  /* IN1R_VOL - [4:0] */ + +/* + * R27 (0x1B) - Right Line Input 3&4 Volume + */ +#define WM8994_IN2_VU                           0x0100  /* IN2_VU */ +#define WM8994_IN2_VU_MASK                      0x0100  /* IN2_VU */ +#define WM8994_IN2_VU_SHIFT                          8  /* IN2_VU */ +#define WM8994_IN2_VU_WIDTH                          1  /* IN2_VU */ +#define WM8994_IN2R_MUTE                        0x0080  /* IN2R_MUTE */ +#define WM8994_IN2R_MUTE_MASK                   0x0080  /* IN2R_MUTE */ +#define WM8994_IN2R_MUTE_SHIFT                       7  /* IN2R_MUTE */ +#define WM8994_IN2R_MUTE_WIDTH                       1  /* IN2R_MUTE */ +#define WM8994_IN2R_ZC                          0x0040  /* IN2R_ZC */ +#define WM8994_IN2R_ZC_MASK                     0x0040  /* IN2R_ZC */ +#define WM8994_IN2R_ZC_SHIFT                         6  /* IN2R_ZC */ +#define WM8994_IN2R_ZC_WIDTH                         1  /* IN2R_ZC */ +#define WM8994_IN2R_VOL_MASK                    0x001F  /* IN2R_VOL - [4:0] */ +#define WM8994_IN2R_VOL_SHIFT                        0  /* IN2R_VOL - [4:0] */ +#define WM8994_IN2R_VOL_WIDTH                        5  /* IN2R_VOL - [4:0] */ + +/* + * R28 (0x1C) - Left Output Volume + */ +#define WM8994_HPOUT1_VU                        0x0100  /* HPOUT1_VU */ +#define WM8994_HPOUT1_VU_MASK                   0x0100  /* HPOUT1_VU */ +#define WM8994_HPOUT1_VU_SHIFT                       8  /* HPOUT1_VU */ +#define WM8994_HPOUT1_VU_WIDTH                       1  /* HPOUT1_VU */ +#define WM8994_HPOUT1L_ZC                       0x0080  /* HPOUT1L_ZC */ +#define WM8994_HPOUT1L_ZC_MASK                  0x0080  /* HPOUT1L_ZC */ +#define WM8994_HPOUT1L_ZC_SHIFT                      7  /* HPOUT1L_ZC */ +#define WM8994_HPOUT1L_ZC_WIDTH                      1  /* HPOUT1L_ZC */ +#define WM8994_HPOUT1L_MUTE_N                   0x0040  /* HPOUT1L_MUTE_N */ +#define WM8994_HPOUT1L_MUTE_N_MASK              0x0040  /* HPOUT1L_MUTE_N */ +#define WM8994_HPOUT1L_MUTE_N_SHIFT                  6  /* HPOUT1L_MUTE_N */ +#define WM8994_HPOUT1L_MUTE_N_WIDTH                  1  /* HPOUT1L_MUTE_N */ +#define WM8994_HPOUT1L_VOL_MASK                 0x003F  /* HPOUT1L_VOL - [5:0] */ +#define WM8994_HPOUT1L_VOL_SHIFT                     0  /* HPOUT1L_VOL - [5:0] */ +#define WM8994_HPOUT1L_VOL_WIDTH                     6  /* HPOUT1L_VOL - [5:0] */ + +/* + * R29 (0x1D) - Right Output Volume + */ +#define WM8994_HPOUT1_VU                        0x0100  /* HPOUT1_VU */ +#define WM8994_HPOUT1_VU_MASK                   0x0100  /* HPOUT1_VU */ +#define WM8994_HPOUT1_VU_SHIFT                       8  /* HPOUT1_VU */ +#define WM8994_HPOUT1_VU_WIDTH                       1  /* HPOUT1_VU */ +#define WM8994_HPOUT1R_ZC                       0x0080  /* HPOUT1R_ZC */ +#define WM8994_HPOUT1R_ZC_MASK                  0x0080  /* HPOUT1R_ZC */ +#define WM8994_HPOUT1R_ZC_SHIFT                      7  /* HPOUT1R_ZC */ +#define WM8994_HPOUT1R_ZC_WIDTH                      1  /* HPOUT1R_ZC */ +#define WM8994_HPOUT1R_MUTE_N                   0x0040  /* HPOUT1R_MUTE_N */ +#define WM8994_HPOUT1R_MUTE_N_MASK              0x0040  /* HPOUT1R_MUTE_N */ +#define WM8994_HPOUT1R_MUTE_N_SHIFT                  6  /* HPOUT1R_MUTE_N */ +#define WM8994_HPOUT1R_MUTE_N_WIDTH                  1  /* HPOUT1R_MUTE_N */ +#define WM8994_HPOUT1R_VOL_MASK                 0x003F  /* HPOUT1R_VOL - [5:0] */ +#define WM8994_HPOUT1R_VOL_SHIFT                     0  /* HPOUT1R_VOL - [5:0] */ +#define WM8994_HPOUT1R_VOL_WIDTH                     6  /* HPOUT1R_VOL - [5:0] */ + +/* + * R30 (0x1E) - Line Outputs Volume + */ +#define WM8994_LINEOUT1N_MUTE                   0x0040  /* LINEOUT1N_MUTE */ +#define WM8994_LINEOUT1N_MUTE_MASK              0x0040  /* LINEOUT1N_MUTE */ +#define WM8994_LINEOUT1N_MUTE_SHIFT                  6  /* LINEOUT1N_MUTE */ +#define WM8994_LINEOUT1N_MUTE_WIDTH                  1  /* LINEOUT1N_MUTE */ +#define WM8994_LINEOUT1P_MUTE                   0x0020  /* LINEOUT1P_MUTE */ +#define WM8994_LINEOUT1P_MUTE_MASK              0x0020  /* LINEOUT1P_MUTE */ +#define WM8994_LINEOUT1P_MUTE_SHIFT                  5  /* LINEOUT1P_MUTE */ +#define WM8994_LINEOUT1P_MUTE_WIDTH                  1  /* LINEOUT1P_MUTE */ +#define WM8994_LINEOUT1_VOL                     0x0010  /* LINEOUT1_VOL */ +#define WM8994_LINEOUT1_VOL_MASK                0x0010  /* LINEOUT1_VOL */ +#define WM8994_LINEOUT1_VOL_SHIFT                    4  /* LINEOUT1_VOL */ +#define WM8994_LINEOUT1_VOL_WIDTH                    1  /* LINEOUT1_VOL */ +#define WM8994_LINEOUT2N_MUTE                   0x0004  /* LINEOUT2N_MUTE */ +#define WM8994_LINEOUT2N_MUTE_MASK              0x0004  /* LINEOUT2N_MUTE */ +#define WM8994_LINEOUT2N_MUTE_SHIFT                  2  /* LINEOUT2N_MUTE */ +#define WM8994_LINEOUT2N_MUTE_WIDTH                  1  /* LINEOUT2N_MUTE */ +#define WM8994_LINEOUT2P_MUTE                   0x0002  /* LINEOUT2P_MUTE */ +#define WM8994_LINEOUT2P_MUTE_MASK              0x0002  /* LINEOUT2P_MUTE */ +#define WM8994_LINEOUT2P_MUTE_SHIFT                  1  /* LINEOUT2P_MUTE */ +#define WM8994_LINEOUT2P_MUTE_WIDTH                  1  /* LINEOUT2P_MUTE */ +#define WM8994_LINEOUT2_VOL                     0x0001  /* LINEOUT2_VOL */ +#define WM8994_LINEOUT2_VOL_MASK                0x0001  /* LINEOUT2_VOL */ +#define WM8994_LINEOUT2_VOL_SHIFT                    0  /* LINEOUT2_VOL */ +#define WM8994_LINEOUT2_VOL_WIDTH                    1  /* LINEOUT2_VOL */ + +/* + * R31 (0x1F) - HPOUT2 Volume + */ +#define WM8994_HPOUT2_MUTE                      0x0020  /* HPOUT2_MUTE */ +#define WM8994_HPOUT2_MUTE_MASK                 0x0020  /* HPOUT2_MUTE */ +#define WM8994_HPOUT2_MUTE_SHIFT                     5  /* HPOUT2_MUTE */ +#define WM8994_HPOUT2_MUTE_WIDTH                     1  /* HPOUT2_MUTE */ +#define WM8994_HPOUT2_VOL                       0x0010  /* HPOUT2_VOL */ +#define WM8994_HPOUT2_VOL_MASK                  0x0010  /* HPOUT2_VOL */ +#define WM8994_HPOUT2_VOL_SHIFT                      4  /* HPOUT2_VOL */ +#define WM8994_HPOUT2_VOL_WIDTH                      1  /* HPOUT2_VOL */ + +/* + * R32 (0x20) - Left OPGA Volume + */ +#define WM8994_MIXOUT_VU                        0x0100  /* MIXOUT_VU */ +#define WM8994_MIXOUT_VU_MASK                   0x0100  /* MIXOUT_VU */ +#define WM8994_MIXOUT_VU_SHIFT                       8  /* MIXOUT_VU */ +#define WM8994_MIXOUT_VU_WIDTH                       1  /* MIXOUT_VU */ +#define WM8994_MIXOUTL_ZC                       0x0080  /* MIXOUTL_ZC */ +#define WM8994_MIXOUTL_ZC_MASK                  0x0080  /* MIXOUTL_ZC */ +#define WM8994_MIXOUTL_ZC_SHIFT                      7  /* MIXOUTL_ZC */ +#define WM8994_MIXOUTL_ZC_WIDTH                      1  /* MIXOUTL_ZC */ +#define WM8994_MIXOUTL_MUTE_N                   0x0040  /* MIXOUTL_MUTE_N */ +#define WM8994_MIXOUTL_MUTE_N_MASK              0x0040  /* MIXOUTL_MUTE_N */ +#define WM8994_MIXOUTL_MUTE_N_SHIFT                  6  /* MIXOUTL_MUTE_N */ +#define WM8994_MIXOUTL_MUTE_N_WIDTH                  1  /* MIXOUTL_MUTE_N */ +#define WM8994_MIXOUTL_VOL_MASK                 0x003F  /* MIXOUTL_VOL - [5:0] */ +#define WM8994_MIXOUTL_VOL_SHIFT                     0  /* MIXOUTL_VOL - [5:0] */ +#define WM8994_MIXOUTL_VOL_WIDTH                     6  /* MIXOUTL_VOL - [5:0] */ + +/* + * R33 (0x21) - Right OPGA Volume + */ +#define WM8994_MIXOUT_VU                        0x0100  /* MIXOUT_VU */ +#define WM8994_MIXOUT_VU_MASK                   0x0100  /* MIXOUT_VU */ +#define WM8994_MIXOUT_VU_SHIFT                       8  /* MIXOUT_VU */ +#define WM8994_MIXOUT_VU_WIDTH                       1  /* MIXOUT_VU */ +#define WM8994_MIXOUTR_ZC                       0x0080  /* MIXOUTR_ZC */ +#define WM8994_MIXOUTR_ZC_MASK                  0x0080  /* MIXOUTR_ZC */ +#define WM8994_MIXOUTR_ZC_SHIFT                      7  /* MIXOUTR_ZC */ +#define WM8994_MIXOUTR_ZC_WIDTH                      1  /* MIXOUTR_ZC */ +#define WM8994_MIXOUTR_MUTE_N                   0x0040  /* MIXOUTR_MUTE_N */ +#define WM8994_MIXOUTR_MUTE_N_MASK              0x0040  /* MIXOUTR_MUTE_N */ +#define WM8994_MIXOUTR_MUTE_N_SHIFT                  6  /* MIXOUTR_MUTE_N */ +#define WM8994_MIXOUTR_MUTE_N_WIDTH                  1  /* MIXOUTR_MUTE_N */ +#define WM8994_MIXOUTR_VOL_MASK                 0x003F  /* MIXOUTR_VOL - [5:0] */ +#define WM8994_MIXOUTR_VOL_SHIFT                     0  /* MIXOUTR_VOL - [5:0] */ +#define WM8994_MIXOUTR_VOL_WIDTH                     6  /* MIXOUTR_VOL - [5:0] */ + +/* + * R34 (0x22) - SPKMIXL Attenuation + */ +#define WM8994_DAC2L_SPKMIXL_VOL                0x0040  /* DAC2L_SPKMIXL_VOL */ +#define WM8994_DAC2L_SPKMIXL_VOL_MASK           0x0040  /* DAC2L_SPKMIXL_VOL */ +#define WM8994_DAC2L_SPKMIXL_VOL_SHIFT               6  /* DAC2L_SPKMIXL_VOL */ +#define WM8994_DAC2L_SPKMIXL_VOL_WIDTH               1  /* DAC2L_SPKMIXL_VOL */ +#define WM8994_MIXINL_SPKMIXL_VOL               0x0020  /* MIXINL_SPKMIXL_VOL */ +#define WM8994_MIXINL_SPKMIXL_VOL_MASK          0x0020  /* MIXINL_SPKMIXL_VOL */ +#define WM8994_MIXINL_SPKMIXL_VOL_SHIFT              5  /* MIXINL_SPKMIXL_VOL */ +#define WM8994_MIXINL_SPKMIXL_VOL_WIDTH              1  /* MIXINL_SPKMIXL_VOL */ +#define WM8994_IN1LP_SPKMIXL_VOL                0x0010  /* IN1LP_SPKMIXL_VOL */ +#define WM8994_IN1LP_SPKMIXL_VOL_MASK           0x0010  /* IN1LP_SPKMIXL_VOL */ +#define WM8994_IN1LP_SPKMIXL_VOL_SHIFT               4  /* IN1LP_SPKMIXL_VOL */ +#define WM8994_IN1LP_SPKMIXL_VOL_WIDTH               1  /* IN1LP_SPKMIXL_VOL */ +#define WM8994_MIXOUTL_SPKMIXL_VOL              0x0008  /* MIXOUTL_SPKMIXL_VOL */ +#define WM8994_MIXOUTL_SPKMIXL_VOL_MASK         0x0008  /* MIXOUTL_SPKMIXL_VOL */ +#define WM8994_MIXOUTL_SPKMIXL_VOL_SHIFT             3  /* MIXOUTL_SPKMIXL_VOL */ +#define WM8994_MIXOUTL_SPKMIXL_VOL_WIDTH             1  /* MIXOUTL_SPKMIXL_VOL */ +#define WM8994_DAC1L_SPKMIXL_VOL                0x0004  /* DAC1L_SPKMIXL_VOL */ +#define WM8994_DAC1L_SPKMIXL_VOL_MASK           0x0004  /* DAC1L_SPKMIXL_VOL */ +#define WM8994_DAC1L_SPKMIXL_VOL_SHIFT               2  /* DAC1L_SPKMIXL_VOL */ +#define WM8994_DAC1L_SPKMIXL_VOL_WIDTH               1  /* DAC1L_SPKMIXL_VOL */ +#define WM8994_SPKMIXL_VOL_MASK                 0x0003  /* SPKMIXL_VOL - [1:0] */ +#define WM8994_SPKMIXL_VOL_SHIFT                     0  /* SPKMIXL_VOL - [1:0] */ +#define WM8994_SPKMIXL_VOL_WIDTH                     2  /* SPKMIXL_VOL - [1:0] */ + +/* + * R35 (0x23) - SPKMIXR Attenuation + */ +#define WM8994_SPKOUT_CLASSAB                   0x0100  /* SPKOUT_CLASSAB */ +#define WM8994_SPKOUT_CLASSAB_MASK              0x0100  /* SPKOUT_CLASSAB */ +#define WM8994_SPKOUT_CLASSAB_SHIFT                  8  /* SPKOUT_CLASSAB */ +#define WM8994_SPKOUT_CLASSAB_WIDTH                  1  /* SPKOUT_CLASSAB */ +#define WM8994_DAC2R_SPKMIXR_VOL                0x0040  /* DAC2R_SPKMIXR_VOL */ +#define WM8994_DAC2R_SPKMIXR_VOL_MASK           0x0040  /* DAC2R_SPKMIXR_VOL */ +#define WM8994_DAC2R_SPKMIXR_VOL_SHIFT               6  /* DAC2R_SPKMIXR_VOL */ +#define WM8994_DAC2R_SPKMIXR_VOL_WIDTH               1  /* DAC2R_SPKMIXR_VOL */ +#define WM8994_MIXINR_SPKMIXR_VOL               0x0020  /* MIXINR_SPKMIXR_VOL */ +#define WM8994_MIXINR_SPKMIXR_VOL_MASK          0x0020  /* MIXINR_SPKMIXR_VOL */ +#define WM8994_MIXINR_SPKMIXR_VOL_SHIFT              5  /* MIXINR_SPKMIXR_VOL */ +#define WM8994_MIXINR_SPKMIXR_VOL_WIDTH              1  /* MIXINR_SPKMIXR_VOL */ +#define WM8994_IN1RP_SPKMIXR_VOL                0x0010  /* IN1RP_SPKMIXR_VOL */ +#define WM8994_IN1RP_SPKMIXR_VOL_MASK           0x0010  /* IN1RP_SPKMIXR_VOL */ +#define WM8994_IN1RP_SPKMIXR_VOL_SHIFT               4  /* IN1RP_SPKMIXR_VOL */ +#define WM8994_IN1RP_SPKMIXR_VOL_WIDTH               1  /* IN1RP_SPKMIXR_VOL */ +#define WM8994_MIXOUTR_SPKMIXR_VOL              0x0008  /* MIXOUTR_SPKMIXR_VOL */ +#define WM8994_MIXOUTR_SPKMIXR_VOL_MASK         0x0008  /* MIXOUTR_SPKMIXR_VOL */ +#define WM8994_MIXOUTR_SPKMIXR_VOL_SHIFT             3  /* MIXOUTR_SPKMIXR_VOL */ +#define WM8994_MIXOUTR_SPKMIXR_VOL_WIDTH             1  /* MIXOUTR_SPKMIXR_VOL */ +#define WM8994_DAC1R_SPKMIXR_VOL                0x0004  /* DAC1R_SPKMIXR_VOL */ +#define WM8994_DAC1R_SPKMIXR_VOL_MASK           0x0004  /* DAC1R_SPKMIXR_VOL */ +#define WM8994_DAC1R_SPKMIXR_VOL_SHIFT               2  /* DAC1R_SPKMIXR_VOL */ +#define WM8994_DAC1R_SPKMIXR_VOL_WIDTH               1  /* DAC1R_SPKMIXR_VOL */ +#define WM8994_SPKMIXR_VOL_MASK                 0x0003  /* SPKMIXR_VOL - [1:0] */ +#define WM8994_SPKMIXR_VOL_SHIFT                     0  /* SPKMIXR_VOL - [1:0] */ +#define WM8994_SPKMIXR_VOL_WIDTH                     2  /* SPKMIXR_VOL - [1:0] */ + +/* + * R36 (0x24) - SPKOUT Mixers + */ +#define WM8994_IN2LRP_TO_SPKOUTL                0x0020  /* IN2LRP_TO_SPKOUTL */ +#define WM8994_IN2LRP_TO_SPKOUTL_MASK           0x0020  /* IN2LRP_TO_SPKOUTL */ +#define WM8994_IN2LRP_TO_SPKOUTL_SHIFT               5  /* IN2LRP_TO_SPKOUTL */ +#define WM8994_IN2LRP_TO_SPKOUTL_WIDTH               1  /* IN2LRP_TO_SPKOUTL */ +#define WM8994_SPKMIXL_TO_SPKOUTL               0x0010  /* SPKMIXL_TO_SPKOUTL */ +#define WM8994_SPKMIXL_TO_SPKOUTL_MASK          0x0010  /* SPKMIXL_TO_SPKOUTL */ +#define WM8994_SPKMIXL_TO_SPKOUTL_SHIFT              4  /* SPKMIXL_TO_SPKOUTL */ +#define WM8994_SPKMIXL_TO_SPKOUTL_WIDTH              1  /* SPKMIXL_TO_SPKOUTL */ +#define WM8994_SPKMIXR_TO_SPKOUTL               0x0008  /* SPKMIXR_TO_SPKOUTL */ +#define WM8994_SPKMIXR_TO_SPKOUTL_MASK          0x0008  /* SPKMIXR_TO_SPKOUTL */ +#define WM8994_SPKMIXR_TO_SPKOUTL_SHIFT              3  /* SPKMIXR_TO_SPKOUTL */ +#define WM8994_SPKMIXR_TO_SPKOUTL_WIDTH              1  /* SPKMIXR_TO_SPKOUTL */ +#define WM8994_IN2LRP_TO_SPKOUTR                0x0004  /* IN2LRP_TO_SPKOUTR */ +#define WM8994_IN2LRP_TO_SPKOUTR_MASK           0x0004  /* IN2LRP_TO_SPKOUTR */ +#define WM8994_IN2LRP_TO_SPKOUTR_SHIFT               2  /* IN2LRP_TO_SPKOUTR */ +#define WM8994_IN2LRP_TO_SPKOUTR_WIDTH               1  /* IN2LRP_TO_SPKOUTR */ +#define WM8994_SPKMIXL_TO_SPKOUTR               0x0002  /* SPKMIXL_TO_SPKOUTR */ +#define WM8994_SPKMIXL_TO_SPKOUTR_MASK          0x0002  /* SPKMIXL_TO_SPKOUTR */ +#define WM8994_SPKMIXL_TO_SPKOUTR_SHIFT              1  /* SPKMIXL_TO_SPKOUTR */ +#define WM8994_SPKMIXL_TO_SPKOUTR_WIDTH              1  /* SPKMIXL_TO_SPKOUTR */ +#define WM8994_SPKMIXR_TO_SPKOUTR               0x0001  /* SPKMIXR_TO_SPKOUTR */ +#define WM8994_SPKMIXR_TO_SPKOUTR_MASK          0x0001  /* SPKMIXR_TO_SPKOUTR */ +#define WM8994_SPKMIXR_TO_SPKOUTR_SHIFT              0  /* SPKMIXR_TO_SPKOUTR */ +#define WM8994_SPKMIXR_TO_SPKOUTR_WIDTH              1  /* SPKMIXR_TO_SPKOUTR */ + +/* + * R37 (0x25) - ClassD + */ +#define WM8994_SPKOUTL_BOOST_MASK               0x0038  /* SPKOUTL_BOOST - [5:3] */ +#define WM8994_SPKOUTL_BOOST_SHIFT                   3  /* SPKOUTL_BOOST - [5:3] */ +#define WM8994_SPKOUTL_BOOST_WIDTH                   3  /* SPKOUTL_BOOST - [5:3] */ +#define WM8994_SPKOUTR_BOOST_MASK               0x0007  /* SPKOUTR_BOOST - [2:0] */ +#define WM8994_SPKOUTR_BOOST_SHIFT                   0  /* SPKOUTR_BOOST - [2:0] */ +#define WM8994_SPKOUTR_BOOST_WIDTH                   3  /* SPKOUTR_BOOST - [2:0] */ + +/* + * R38 (0x26) - Speaker Volume Left + */ +#define WM8994_SPKOUT_VU                        0x0100  /* SPKOUT_VU */ +#define WM8994_SPKOUT_VU_MASK                   0x0100  /* SPKOUT_VU */ +#define WM8994_SPKOUT_VU_SHIFT                       8  /* SPKOUT_VU */ +#define WM8994_SPKOUT_VU_WIDTH                       1  /* SPKOUT_VU */ +#define WM8994_SPKOUTL_ZC                       0x0080  /* SPKOUTL_ZC */ +#define WM8994_SPKOUTL_ZC_MASK                  0x0080  /* SPKOUTL_ZC */ +#define WM8994_SPKOUTL_ZC_SHIFT                      7  /* SPKOUTL_ZC */ +#define WM8994_SPKOUTL_ZC_WIDTH                      1  /* SPKOUTL_ZC */ +#define WM8994_SPKOUTL_MUTE_N                   0x0040  /* SPKOUTL_MUTE_N */ +#define WM8994_SPKOUTL_MUTE_N_MASK              0x0040  /* SPKOUTL_MUTE_N */ +#define WM8994_SPKOUTL_MUTE_N_SHIFT                  6  /* SPKOUTL_MUTE_N */ +#define WM8994_SPKOUTL_MUTE_N_WIDTH                  1  /* SPKOUTL_MUTE_N */ +#define WM8994_SPKOUTL_VOL_MASK                 0x003F  /* SPKOUTL_VOL - [5:0] */ +#define WM8994_SPKOUTL_VOL_SHIFT                     0  /* SPKOUTL_VOL - [5:0] */ +#define WM8994_SPKOUTL_VOL_WIDTH                     6  /* SPKOUTL_VOL - [5:0] */ + +/* + * R39 (0x27) - Speaker Volume Right + */ +#define WM8994_SPKOUT_VU                        0x0100  /* SPKOUT_VU */ +#define WM8994_SPKOUT_VU_MASK                   0x0100  /* SPKOUT_VU */ +#define WM8994_SPKOUT_VU_SHIFT                       8  /* SPKOUT_VU */ +#define WM8994_SPKOUT_VU_WIDTH                       1  /* SPKOUT_VU */ +#define WM8994_SPKOUTR_ZC                       0x0080  /* SPKOUTR_ZC */ +#define WM8994_SPKOUTR_ZC_MASK                  0x0080  /* SPKOUTR_ZC */ +#define WM8994_SPKOUTR_ZC_SHIFT                      7  /* SPKOUTR_ZC */ +#define WM8994_SPKOUTR_ZC_WIDTH                      1  /* SPKOUTR_ZC */ +#define WM8994_SPKOUTR_MUTE_N                   0x0040  /* SPKOUTR_MUTE_N */ +#define WM8994_SPKOUTR_MUTE_N_MASK              0x0040  /* SPKOUTR_MUTE_N */ +#define WM8994_SPKOUTR_MUTE_N_SHIFT                  6  /* SPKOUTR_MUTE_N */ +#define WM8994_SPKOUTR_MUTE_N_WIDTH                  1  /* SPKOUTR_MUTE_N */ +#define WM8994_SPKOUTR_VOL_MASK                 0x003F  /* SPKOUTR_VOL - [5:0] */ +#define WM8994_SPKOUTR_VOL_SHIFT                     0  /* SPKOUTR_VOL - [5:0] */ +#define WM8994_SPKOUTR_VOL_WIDTH                     6  /* SPKOUTR_VOL - [5:0] */ + +/* + * R40 (0x28) - Input Mixer (2) + */ +#define WM8994_IN2LP_TO_IN2L                    0x0080  /* IN2LP_TO_IN2L */ +#define WM8994_IN2LP_TO_IN2L_MASK               0x0080  /* IN2LP_TO_IN2L */ +#define WM8994_IN2LP_TO_IN2L_SHIFT                   7  /* IN2LP_TO_IN2L */ +#define WM8994_IN2LP_TO_IN2L_WIDTH                   1  /* IN2LP_TO_IN2L */ +#define WM8994_IN2LN_TO_IN2L                    0x0040  /* IN2LN_TO_IN2L */ +#define WM8994_IN2LN_TO_IN2L_MASK               0x0040  /* IN2LN_TO_IN2L */ +#define WM8994_IN2LN_TO_IN2L_SHIFT                   6  /* IN2LN_TO_IN2L */ +#define WM8994_IN2LN_TO_IN2L_WIDTH                   1  /* IN2LN_TO_IN2L */ +#define WM8994_IN1LP_TO_IN1L                    0x0020  /* IN1LP_TO_IN1L */ +#define WM8994_IN1LP_TO_IN1L_MASK               0x0020  /* IN1LP_TO_IN1L */ +#define WM8994_IN1LP_TO_IN1L_SHIFT                   5  /* IN1LP_TO_IN1L */ +#define WM8994_IN1LP_TO_IN1L_WIDTH                   1  /* IN1LP_TO_IN1L */ +#define WM8994_IN1LN_TO_IN1L                    0x0010  /* IN1LN_TO_IN1L */ +#define WM8994_IN1LN_TO_IN1L_MASK               0x0010  /* IN1LN_TO_IN1L */ +#define WM8994_IN1LN_TO_IN1L_SHIFT                   4  /* IN1LN_TO_IN1L */ +#define WM8994_IN1LN_TO_IN1L_WIDTH                   1  /* IN1LN_TO_IN1L */ +#define WM8994_IN2RP_TO_IN2R                    0x0008  /* IN2RP_TO_IN2R */ +#define WM8994_IN2RP_TO_IN2R_MASK               0x0008  /* IN2RP_TO_IN2R */ +#define WM8994_IN2RP_TO_IN2R_SHIFT                   3  /* IN2RP_TO_IN2R */ +#define WM8994_IN2RP_TO_IN2R_WIDTH                   1  /* IN2RP_TO_IN2R */ +#define WM8994_IN2RN_TO_IN2R                    0x0004  /* IN2RN_TO_IN2R */ +#define WM8994_IN2RN_TO_IN2R_MASK               0x0004  /* IN2RN_TO_IN2R */ +#define WM8994_IN2RN_TO_IN2R_SHIFT                   2  /* IN2RN_TO_IN2R */ +#define WM8994_IN2RN_TO_IN2R_WIDTH                   1  /* IN2RN_TO_IN2R */ +#define WM8994_IN1RP_TO_IN1R                    0x0002  /* IN1RP_TO_IN1R */ +#define WM8994_IN1RP_TO_IN1R_MASK               0x0002  /* IN1RP_TO_IN1R */ +#define WM8994_IN1RP_TO_IN1R_SHIFT                   1  /* IN1RP_TO_IN1R */ +#define WM8994_IN1RP_TO_IN1R_WIDTH                   1  /* IN1RP_TO_IN1R */ +#define WM8994_IN1RN_TO_IN1R                    0x0001  /* IN1RN_TO_IN1R */ +#define WM8994_IN1RN_TO_IN1R_MASK               0x0001  /* IN1RN_TO_IN1R */ +#define WM8994_IN1RN_TO_IN1R_SHIFT                   0  /* IN1RN_TO_IN1R */ +#define WM8994_IN1RN_TO_IN1R_WIDTH                   1  /* IN1RN_TO_IN1R */ + +/* + * R41 (0x29) - Input Mixer (3) + */ +#define WM8994_IN2L_TO_MIXINL                   0x0100  /* IN2L_TO_MIXINL */ +#define WM8994_IN2L_TO_MIXINL_MASK              0x0100  /* IN2L_TO_MIXINL */ +#define WM8994_IN2L_TO_MIXINL_SHIFT                  8  /* IN2L_TO_MIXINL */ +#define WM8994_IN2L_TO_MIXINL_WIDTH                  1  /* IN2L_TO_MIXINL */ +#define WM8994_IN2L_MIXINL_VOL                  0x0080  /* IN2L_MIXINL_VOL */ +#define WM8994_IN2L_MIXINL_VOL_MASK             0x0080  /* IN2L_MIXINL_VOL */ +#define WM8994_IN2L_MIXINL_VOL_SHIFT                 7  /* IN2L_MIXINL_VOL */ +#define WM8994_IN2L_MIXINL_VOL_WIDTH                 1  /* IN2L_MIXINL_VOL */ +#define WM8994_IN1L_TO_MIXINL                   0x0020  /* IN1L_TO_MIXINL */ +#define WM8994_IN1L_TO_MIXINL_MASK              0x0020  /* IN1L_TO_MIXINL */ +#define WM8994_IN1L_TO_MIXINL_SHIFT                  5  /* IN1L_TO_MIXINL */ +#define WM8994_IN1L_TO_MIXINL_WIDTH                  1  /* IN1L_TO_MIXINL */ +#define WM8994_IN1L_MIXINL_VOL                  0x0010  /* IN1L_MIXINL_VOL */ +#define WM8994_IN1L_MIXINL_VOL_MASK             0x0010  /* IN1L_MIXINL_VOL */ +#define WM8994_IN1L_MIXINL_VOL_SHIFT                 4  /* IN1L_MIXINL_VOL */ +#define WM8994_IN1L_MIXINL_VOL_WIDTH                 1  /* IN1L_MIXINL_VOL */ +#define WM8994_MIXOUTL_MIXINL_VOL_MASK          0x0007  /* MIXOUTL_MIXINL_VOL - [2:0] */ +#define WM8994_MIXOUTL_MIXINL_VOL_SHIFT              0  /* MIXOUTL_MIXINL_VOL - [2:0] */ +#define WM8994_MIXOUTL_MIXINL_VOL_WIDTH              3  /* MIXOUTL_MIXINL_VOL - [2:0] */ + +/* + * R42 (0x2A) - Input Mixer (4) + */ +#define WM8994_IN2R_TO_MIXINR                   0x0100  /* IN2R_TO_MIXINR */ +#define WM8994_IN2R_TO_MIXINR_MASK              0x0100  /* IN2R_TO_MIXINR */ +#define WM8994_IN2R_TO_MIXINR_SHIFT                  8  /* IN2R_TO_MIXINR */ +#define WM8994_IN2R_TO_MIXINR_WIDTH                  1  /* IN2R_TO_MIXINR */ +#define WM8994_IN2R_MIXINR_VOL                  0x0080  /* IN2R_MIXINR_VOL */ +#define WM8994_IN2R_MIXINR_VOL_MASK             0x0080  /* IN2R_MIXINR_VOL */ +#define WM8994_IN2R_MIXINR_VOL_SHIFT                 7  /* IN2R_MIXINR_VOL */ +#define WM8994_IN2R_MIXINR_VOL_WIDTH                 1  /* IN2R_MIXINR_VOL */ +#define WM8994_IN1R_TO_MIXINR                   0x0020  /* IN1R_TO_MIXINR */ +#define WM8994_IN1R_TO_MIXINR_MASK              0x0020  /* IN1R_TO_MIXINR */ +#define WM8994_IN1R_TO_MIXINR_SHIFT                  5  /* IN1R_TO_MIXINR */ +#define WM8994_IN1R_TO_MIXINR_WIDTH                  1  /* IN1R_TO_MIXINR */ +#define WM8994_IN1R_MIXINR_VOL                  0x0010  /* IN1R_MIXINR_VOL */ +#define WM8994_IN1R_MIXINR_VOL_MASK             0x0010  /* IN1R_MIXINR_VOL */ +#define WM8994_IN1R_MIXINR_VOL_SHIFT                 4  /* IN1R_MIXINR_VOL */ +#define WM8994_IN1R_MIXINR_VOL_WIDTH                 1  /* IN1R_MIXINR_VOL */ +#define WM8994_MIXOUTR_MIXINR_VOL_MASK          0x0007  /* MIXOUTR_MIXINR_VOL - [2:0] */ +#define WM8994_MIXOUTR_MIXINR_VOL_SHIFT              0  /* MIXOUTR_MIXINR_VOL - [2:0] */ +#define WM8994_MIXOUTR_MIXINR_VOL_WIDTH              3  /* MIXOUTR_MIXINR_VOL - [2:0] */ + +/* + * R43 (0x2B) - Input Mixer (5) + */ +#define WM8994_IN1LP_MIXINL_VOL_MASK            0x01C0  /* IN1LP_MIXINL_VOL - [8:6] */ +#define WM8994_IN1LP_MIXINL_VOL_SHIFT                6  /* IN1LP_MIXINL_VOL - [8:6] */ +#define WM8994_IN1LP_MIXINL_VOL_WIDTH                3  /* IN1LP_MIXINL_VOL - [8:6] */ +#define WM8994_IN2LRP_MIXINL_VOL_MASK           0x0007  /* IN2LRP_MIXINL_VOL - [2:0] */ +#define WM8994_IN2LRP_MIXINL_VOL_SHIFT               0  /* IN2LRP_MIXINL_VOL - [2:0] */ +#define WM8994_IN2LRP_MIXINL_VOL_WIDTH               3  /* IN2LRP_MIXINL_VOL - [2:0] */ + +/* + * R44 (0x2C) - Input Mixer (6) + */ +#define WM8994_IN1RP_MIXINR_VOL_MASK            0x01C0  /* IN1RP_MIXINR_VOL - [8:6] */ +#define WM8994_IN1RP_MIXINR_VOL_SHIFT                6  /* IN1RP_MIXINR_VOL - [8:6] */ +#define WM8994_IN1RP_MIXINR_VOL_WIDTH                3  /* IN1RP_MIXINR_VOL - [8:6] */ +#define WM8994_IN2LRP_MIXINR_VOL_MASK           0x0007  /* IN2LRP_MIXINR_VOL - [2:0] */ +#define WM8994_IN2LRP_MIXINR_VOL_SHIFT               0  /* IN2LRP_MIXINR_VOL - [2:0] */ +#define WM8994_IN2LRP_MIXINR_VOL_WIDTH               3  /* IN2LRP_MIXINR_VOL - [2:0] */ + +/* + * R45 (0x2D) - Output Mixer (1) + */ +#define WM8994_DAC1L_TO_HPOUT1L                 0x0100  /* DAC1L_TO_HPOUT1L */ +#define WM8994_DAC1L_TO_HPOUT1L_MASK            0x0100  /* DAC1L_TO_HPOUT1L */ +#define WM8994_DAC1L_TO_HPOUT1L_SHIFT                8  /* DAC1L_TO_HPOUT1L */ +#define WM8994_DAC1L_TO_HPOUT1L_WIDTH                1  /* DAC1L_TO_HPOUT1L */ +#define WM8994_MIXINR_TO_MIXOUTL                0x0080  /* MIXINR_TO_MIXOUTL */ +#define WM8994_MIXINR_TO_MIXOUTL_MASK           0x0080  /* MIXINR_TO_MIXOUTL */ +#define WM8994_MIXINR_TO_MIXOUTL_SHIFT               7  /* MIXINR_TO_MIXOUTL */ +#define WM8994_MIXINR_TO_MIXOUTL_WIDTH               1  /* MIXINR_TO_MIXOUTL */ +#define WM8994_MIXINL_TO_MIXOUTL                0x0040  /* MIXINL_TO_MIXOUTL */ +#define WM8994_MIXINL_TO_MIXOUTL_MASK           0x0040  /* MIXINL_TO_MIXOUTL */ +#define WM8994_MIXINL_TO_MIXOUTL_SHIFT               6  /* MIXINL_TO_MIXOUTL */ +#define WM8994_MIXINL_TO_MIXOUTL_WIDTH               1  /* MIXINL_TO_MIXOUTL */ +#define WM8994_IN2RN_TO_MIXOUTL                 0x0020  /* IN2RN_TO_MIXOUTL */ +#define WM8994_IN2RN_TO_MIXOUTL_MASK            0x0020  /* IN2RN_TO_MIXOUTL */ +#define WM8994_IN2RN_TO_MIXOUTL_SHIFT                5  /* IN2RN_TO_MIXOUTL */ +#define WM8994_IN2RN_TO_MIXOUTL_WIDTH                1  /* IN2RN_TO_MIXOUTL */ +#define WM8994_IN2LN_TO_MIXOUTL                 0x0010  /* IN2LN_TO_MIXOUTL */ +#define WM8994_IN2LN_TO_MIXOUTL_MASK            0x0010  /* IN2LN_TO_MIXOUTL */ +#define WM8994_IN2LN_TO_MIXOUTL_SHIFT                4  /* IN2LN_TO_MIXOUTL */ +#define WM8994_IN2LN_TO_MIXOUTL_WIDTH                1  /* IN2LN_TO_MIXOUTL */ +#define WM8994_IN1R_TO_MIXOUTL                  0x0008  /* IN1R_TO_MIXOUTL */ +#define WM8994_IN1R_TO_MIXOUTL_MASK             0x0008  /* IN1R_TO_MIXOUTL */ +#define WM8994_IN1R_TO_MIXOUTL_SHIFT                 3  /* IN1R_TO_MIXOUTL */ +#define WM8994_IN1R_TO_MIXOUTL_WIDTH                 1  /* IN1R_TO_MIXOUTL */ +#define WM8994_IN1L_TO_MIXOUTL                  0x0004  /* IN1L_TO_MIXOUTL */ +#define WM8994_IN1L_TO_MIXOUTL_MASK             0x0004  /* IN1L_TO_MIXOUTL */ +#define WM8994_IN1L_TO_MIXOUTL_SHIFT                 2  /* IN1L_TO_MIXOUTL */ +#define WM8994_IN1L_TO_MIXOUTL_WIDTH                 1  /* IN1L_TO_MIXOUTL */ +#define WM8994_IN2LP_TO_MIXOUTL                 0x0002  /* IN2LP_TO_MIXOUTL */ +#define WM8994_IN2LP_TO_MIXOUTL_MASK            0x0002  /* IN2LP_TO_MIXOUTL */ +#define WM8994_IN2LP_TO_MIXOUTL_SHIFT                1  /* IN2LP_TO_MIXOUTL */ +#define WM8994_IN2LP_TO_MIXOUTL_WIDTH                1  /* IN2LP_TO_MIXOUTL */ +#define WM8994_DAC1L_TO_MIXOUTL                 0x0001  /* DAC1L_TO_MIXOUTL */ +#define WM8994_DAC1L_TO_MIXOUTL_MASK            0x0001  /* DAC1L_TO_MIXOUTL */ +#define WM8994_DAC1L_TO_MIXOUTL_SHIFT                0  /* DAC1L_TO_MIXOUTL */ +#define WM8994_DAC1L_TO_MIXOUTL_WIDTH                1  /* DAC1L_TO_MIXOUTL */ + +/* + * R46 (0x2E) - Output Mixer (2) + */ +#define WM8994_DAC1R_TO_HPOUT1R                 0x0100  /* DAC1R_TO_HPOUT1R */ +#define WM8994_DAC1R_TO_HPOUT1R_MASK            0x0100  /* DAC1R_TO_HPOUT1R */ +#define WM8994_DAC1R_TO_HPOUT1R_SHIFT                8  /* DAC1R_TO_HPOUT1R */ +#define WM8994_DAC1R_TO_HPOUT1R_WIDTH                1  /* DAC1R_TO_HPOUT1R */ +#define WM8994_MIXINL_TO_MIXOUTR                0x0080  /* MIXINL_TO_MIXOUTR */ +#define WM8994_MIXINL_TO_MIXOUTR_MASK           0x0080  /* MIXINL_TO_MIXOUTR */ +#define WM8994_MIXINL_TO_MIXOUTR_SHIFT               7  /* MIXINL_TO_MIXOUTR */ +#define WM8994_MIXINL_TO_MIXOUTR_WIDTH               1  /* MIXINL_TO_MIXOUTR */ +#define WM8994_MIXINR_TO_MIXOUTR                0x0040  /* MIXINR_TO_MIXOUTR */ +#define WM8994_MIXINR_TO_MIXOUTR_MASK           0x0040  /* MIXINR_TO_MIXOUTR */ +#define WM8994_MIXINR_TO_MIXOUTR_SHIFT               6  /* MIXINR_TO_MIXOUTR */ +#define WM8994_MIXINR_TO_MIXOUTR_WIDTH               1  /* MIXINR_TO_MIXOUTR */ +#define WM8994_IN2LN_TO_MIXOUTR                 0x0020  /* IN2LN_TO_MIXOUTR */ +#define WM8994_IN2LN_TO_MIXOUTR_MASK            0x0020  /* IN2LN_TO_MIXOUTR */ +#define WM8994_IN2LN_TO_MIXOUTR_SHIFT                5  /* IN2LN_TO_MIXOUTR */ +#define WM8994_IN2LN_TO_MIXOUTR_WIDTH                1  /* IN2LN_TO_MIXOUTR */ +#define WM8994_IN2RN_TO_MIXOUTR                 0x0010  /* IN2RN_TO_MIXOUTR */ +#define WM8994_IN2RN_TO_MIXOUTR_MASK            0x0010  /* IN2RN_TO_MIXOUTR */ +#define WM8994_IN2RN_TO_MIXOUTR_SHIFT                4  /* IN2RN_TO_MIXOUTR */ +#define WM8994_IN2RN_TO_MIXOUTR_WIDTH                1  /* IN2RN_TO_MIXOUTR */ +#define WM8994_IN1L_TO_MIXOUTR                  0x0008  /* IN1L_TO_MIXOUTR */ +#define WM8994_IN1L_TO_MIXOUTR_MASK             0x0008  /* IN1L_TO_MIXOUTR */ +#define WM8994_IN1L_TO_MIXOUTR_SHIFT                 3  /* IN1L_TO_MIXOUTR */ +#define WM8994_IN1L_TO_MIXOUTR_WIDTH                 1  /* IN1L_TO_MIXOUTR */ +#define WM8994_IN1R_TO_MIXOUTR                  0x0004  /* IN1R_TO_MIXOUTR */ +#define WM8994_IN1R_TO_MIXOUTR_MASK             0x0004  /* IN1R_TO_MIXOUTR */ +#define WM8994_IN1R_TO_MIXOUTR_SHIFT                 2  /* IN1R_TO_MIXOUTR */ +#define WM8994_IN1R_TO_MIXOUTR_WIDTH                 1  /* IN1R_TO_MIXOUTR */ +#define WM8994_IN2RP_TO_MIXOUTR                 0x0002  /* IN2RP_TO_MIXOUTR */ +#define WM8994_IN2RP_TO_MIXOUTR_MASK            0x0002  /* IN2RP_TO_MIXOUTR */ +#define WM8994_IN2RP_TO_MIXOUTR_SHIFT                1  /* IN2RP_TO_MIXOUTR */ +#define WM8994_IN2RP_TO_MIXOUTR_WIDTH                1  /* IN2RP_TO_MIXOUTR */ +#define WM8994_DAC1R_TO_MIXOUTR                 0x0001  /* DAC1R_TO_MIXOUTR */ +#define WM8994_DAC1R_TO_MIXOUTR_MASK            0x0001  /* DAC1R_TO_MIXOUTR */ +#define WM8994_DAC1R_TO_MIXOUTR_SHIFT                0  /* DAC1R_TO_MIXOUTR */ +#define WM8994_DAC1R_TO_MIXOUTR_WIDTH                1  /* DAC1R_TO_MIXOUTR */ + +/* + * R47 (0x2F) - Output Mixer (3) + */ +#define WM8994_IN2LP_MIXOUTL_VOL_MASK           0x0E00  /* IN2LP_MIXOUTL_VOL - [11:9] */ +#define WM8994_IN2LP_MIXOUTL_VOL_SHIFT               9  /* IN2LP_MIXOUTL_VOL - [11:9] */ +#define WM8994_IN2LP_MIXOUTL_VOL_WIDTH               3  /* IN2LP_MIXOUTL_VOL - [11:9] */ +#define WM8994_IN2LN_MIXOUTL_VOL_MASK           0x01C0  /* IN2LN_MIXOUTL_VOL - [8:6] */ +#define WM8994_IN2LN_MIXOUTL_VOL_SHIFT               6  /* IN2LN_MIXOUTL_VOL - [8:6] */ +#define WM8994_IN2LN_MIXOUTL_VOL_WIDTH               3  /* IN2LN_MIXOUTL_VOL - [8:6] */ +#define WM8994_IN1R_MIXOUTL_VOL_MASK            0x0038  /* IN1R_MIXOUTL_VOL - [5:3] */ +#define WM8994_IN1R_MIXOUTL_VOL_SHIFT                3  /* IN1R_MIXOUTL_VOL - [5:3] */ +#define WM8994_IN1R_MIXOUTL_VOL_WIDTH                3  /* IN1R_MIXOUTL_VOL - [5:3] */ +#define WM8994_IN1L_MIXOUTL_VOL_MASK            0x0007  /* IN1L_MIXOUTL_VOL - [2:0] */ +#define WM8994_IN1L_MIXOUTL_VOL_SHIFT                0  /* IN1L_MIXOUTL_VOL - [2:0] */ +#define WM8994_IN1L_MIXOUTL_VOL_WIDTH                3  /* IN1L_MIXOUTL_VOL - [2:0] */ + +/* + * R48 (0x30) - Output Mixer (4) + */ +#define WM8994_IN2RP_MIXOUTR_VOL_MASK           0x0E00  /* IN2RP_MIXOUTR_VOL - [11:9] */ +#define WM8994_IN2RP_MIXOUTR_VOL_SHIFT               9  /* IN2RP_MIXOUTR_VOL - [11:9] */ +#define WM8994_IN2RP_MIXOUTR_VOL_WIDTH               3  /* IN2RP_MIXOUTR_VOL - [11:9] */ +#define WM8994_IN2RN_MIXOUTR_VOL_MASK           0x01C0  /* IN2RN_MIXOUTR_VOL - [8:6] */ +#define WM8994_IN2RN_MIXOUTR_VOL_SHIFT               6  /* IN2RN_MIXOUTR_VOL - [8:6] */ +#define WM8994_IN2RN_MIXOUTR_VOL_WIDTH               3  /* IN2RN_MIXOUTR_VOL - [8:6] */ +#define WM8994_IN1L_MIXOUTR_VOL_MASK            0x0038  /* IN1L_MIXOUTR_VOL - [5:3] */ +#define WM8994_IN1L_MIXOUTR_VOL_SHIFT                3  /* IN1L_MIXOUTR_VOL - [5:3] */ +#define WM8994_IN1L_MIXOUTR_VOL_WIDTH                3  /* IN1L_MIXOUTR_VOL - [5:3] */ +#define WM8994_IN1R_MIXOUTR_VOL_MASK            0x0007  /* IN1R_MIXOUTR_VOL - [2:0] */ +#define WM8994_IN1R_MIXOUTR_VOL_SHIFT                0  /* IN1R_MIXOUTR_VOL - [2:0] */ +#define WM8994_IN1R_MIXOUTR_VOL_WIDTH                3  /* IN1R_MIXOUTR_VOL - [2:0] */ + +/* + * R49 (0x31) - Output Mixer (5) + */ +#define WM8994_DAC1L_MIXOUTL_VOL_MASK           0x0E00  /* DAC1L_MIXOUTL_VOL - [11:9] */ +#define WM8994_DAC1L_MIXOUTL_VOL_SHIFT               9  /* DAC1L_MIXOUTL_VOL - [11:9] */ +#define WM8994_DAC1L_MIXOUTL_VOL_WIDTH               3  /* DAC1L_MIXOUTL_VOL - [11:9] */ +#define WM8994_IN2RN_MIXOUTL_VOL_MASK           0x01C0  /* IN2RN_MIXOUTL_VOL - [8:6] */ +#define WM8994_IN2RN_MIXOUTL_VOL_SHIFT               6  /* IN2RN_MIXOUTL_VOL - [8:6] */ +#define WM8994_IN2RN_MIXOUTL_VOL_WIDTH               3  /* IN2RN_MIXOUTL_VOL - [8:6] */ +#define WM8994_MIXINR_MIXOUTL_VOL_MASK          0x0038  /* MIXINR_MIXOUTL_VOL - [5:3] */ +#define WM8994_MIXINR_MIXOUTL_VOL_SHIFT              3  /* MIXINR_MIXOUTL_VOL - [5:3] */ +#define WM8994_MIXINR_MIXOUTL_VOL_WIDTH              3  /* MIXINR_MIXOUTL_VOL - [5:3] */ +#define WM8994_MIXINL_MIXOUTL_VOL_MASK          0x0007  /* MIXINL_MIXOUTL_VOL - [2:0] */ +#define WM8994_MIXINL_MIXOUTL_VOL_SHIFT              0  /* MIXINL_MIXOUTL_VOL - [2:0] */ +#define WM8994_MIXINL_MIXOUTL_VOL_WIDTH              3  /* MIXINL_MIXOUTL_VOL - [2:0] */ + +/* + * R50 (0x32) - Output Mixer (6) + */ +#define WM8994_DAC1R_MIXOUTR_VOL_MASK           0x0E00  /* DAC1R_MIXOUTR_VOL - [11:9] */ +#define WM8994_DAC1R_MIXOUTR_VOL_SHIFT               9  /* DAC1R_MIXOUTR_VOL - [11:9] */ +#define WM8994_DAC1R_MIXOUTR_VOL_WIDTH               3  /* DAC1R_MIXOUTR_VOL - [11:9] */ +#define WM8994_IN2LN_MIXOUTR_VOL_MASK           0x01C0  /* IN2LN_MIXOUTR_VOL - [8:6] */ +#define WM8994_IN2LN_MIXOUTR_VOL_SHIFT               6  /* IN2LN_MIXOUTR_VOL - [8:6] */ +#define WM8994_IN2LN_MIXOUTR_VOL_WIDTH               3  /* IN2LN_MIXOUTR_VOL - [8:6] */ +#define WM8994_MIXINL_MIXOUTR_VOL_MASK          0x0038  /* MIXINL_MIXOUTR_VOL - [5:3] */ +#define WM8994_MIXINL_MIXOUTR_VOL_SHIFT              3  /* MIXINL_MIXOUTR_VOL - [5:3] */ +#define WM8994_MIXINL_MIXOUTR_VOL_WIDTH              3  /* MIXINL_MIXOUTR_VOL - [5:3] */ +#define WM8994_MIXINR_MIXOUTR_VOL_MASK          0x0007  /* MIXINR_MIXOUTR_VOL - [2:0] */ +#define WM8994_MIXINR_MIXOUTR_VOL_SHIFT              0  /* MIXINR_MIXOUTR_VOL - [2:0] */ +#define WM8994_MIXINR_MIXOUTR_VOL_WIDTH              3  /* MIXINR_MIXOUTR_VOL - [2:0] */ + +/* + * R51 (0x33) - HPOUT2 Mixer + */ +#define WM8994_IN2LRP_TO_HPOUT2                 0x0020  /* IN2LRP_TO_HPOUT2 */ +#define WM8994_IN2LRP_TO_HPOUT2_MASK            0x0020  /* IN2LRP_TO_HPOUT2 */ +#define WM8994_IN2LRP_TO_HPOUT2_SHIFT                5  /* IN2LRP_TO_HPOUT2 */ +#define WM8994_IN2LRP_TO_HPOUT2_WIDTH                1  /* IN2LRP_TO_HPOUT2 */ +#define WM8994_MIXOUTLVOL_TO_HPOUT2             0x0010  /* MIXOUTLVOL_TO_HPOUT2 */ +#define WM8994_MIXOUTLVOL_TO_HPOUT2_MASK        0x0010  /* MIXOUTLVOL_TO_HPOUT2 */ +#define WM8994_MIXOUTLVOL_TO_HPOUT2_SHIFT            4  /* MIXOUTLVOL_TO_HPOUT2 */ +#define WM8994_MIXOUTLVOL_TO_HPOUT2_WIDTH            1  /* MIXOUTLVOL_TO_HPOUT2 */ +#define WM8994_MIXOUTRVOL_TO_HPOUT2             0x0008  /* MIXOUTRVOL_TO_HPOUT2 */ +#define WM8994_MIXOUTRVOL_TO_HPOUT2_MASK        0x0008  /* MIXOUTRVOL_TO_HPOUT2 */ +#define WM8994_MIXOUTRVOL_TO_HPOUT2_SHIFT            3  /* MIXOUTRVOL_TO_HPOUT2 */ +#define WM8994_MIXOUTRVOL_TO_HPOUT2_WIDTH            1  /* MIXOUTRVOL_TO_HPOUT2 */ + +/* + * R52 (0x34) - Line Mixer (1) + */ +#define WM8994_MIXOUTL_TO_LINEOUT1N             0x0040  /* MIXOUTL_TO_LINEOUT1N */ +#define WM8994_MIXOUTL_TO_LINEOUT1N_MASK        0x0040  /* MIXOUTL_TO_LINEOUT1N */ +#define WM8994_MIXOUTL_TO_LINEOUT1N_SHIFT            6  /* MIXOUTL_TO_LINEOUT1N */ +#define WM8994_MIXOUTL_TO_LINEOUT1N_WIDTH            1  /* MIXOUTL_TO_LINEOUT1N */ +#define WM8994_MIXOUTR_TO_LINEOUT1N             0x0020  /* MIXOUTR_TO_LINEOUT1N */ +#define WM8994_MIXOUTR_TO_LINEOUT1N_MASK        0x0020  /* MIXOUTR_TO_LINEOUT1N */ +#define WM8994_MIXOUTR_TO_LINEOUT1N_SHIFT            5  /* MIXOUTR_TO_LINEOUT1N */ +#define WM8994_MIXOUTR_TO_LINEOUT1N_WIDTH            1  /* MIXOUTR_TO_LINEOUT1N */ +#define WM8994_LINEOUT1_MODE                    0x0010  /* LINEOUT1_MODE */ +#define WM8994_LINEOUT1_MODE_MASK               0x0010  /* LINEOUT1_MODE */ +#define WM8994_LINEOUT1_MODE_SHIFT                   4  /* LINEOUT1_MODE */ +#define WM8994_LINEOUT1_MODE_WIDTH                   1  /* LINEOUT1_MODE */ +#define WM8994_IN1R_TO_LINEOUT1P                0x0004  /* IN1R_TO_LINEOUT1P */ +#define WM8994_IN1R_TO_LINEOUT1P_MASK           0x0004  /* IN1R_TO_LINEOUT1P */ +#define WM8994_IN1R_TO_LINEOUT1P_SHIFT               2  /* IN1R_TO_LINEOUT1P */ +#define WM8994_IN1R_TO_LINEOUT1P_WIDTH               1  /* IN1R_TO_LINEOUT1P */ +#define WM8994_IN1L_TO_LINEOUT1P                0x0002  /* IN1L_TO_LINEOUT1P */ +#define WM8994_IN1L_TO_LINEOUT1P_MASK           0x0002  /* IN1L_TO_LINEOUT1P */ +#define WM8994_IN1L_TO_LINEOUT1P_SHIFT               1  /* IN1L_TO_LINEOUT1P */ +#define WM8994_IN1L_TO_LINEOUT1P_WIDTH               1  /* IN1L_TO_LINEOUT1P */ +#define WM8994_MIXOUTL_TO_LINEOUT1P             0x0001  /* MIXOUTL_TO_LINEOUT1P */ +#define WM8994_MIXOUTL_TO_LINEOUT1P_MASK        0x0001  /* MIXOUTL_TO_LINEOUT1P */ +#define WM8994_MIXOUTL_TO_LINEOUT1P_SHIFT            0  /* MIXOUTL_TO_LINEOUT1P */ +#define WM8994_MIXOUTL_TO_LINEOUT1P_WIDTH            1  /* MIXOUTL_TO_LINEOUT1P */ + +/* + * R53 (0x35) - Line Mixer (2) + */ +#define WM8994_MIXOUTR_TO_LINEOUT2N             0x0040  /* MIXOUTR_TO_LINEOUT2N */ +#define WM8994_MIXOUTR_TO_LINEOUT2N_MASK        0x0040  /* MIXOUTR_TO_LINEOUT2N */ +#define WM8994_MIXOUTR_TO_LINEOUT2N_SHIFT            6  /* MIXOUTR_TO_LINEOUT2N */ +#define WM8994_MIXOUTR_TO_LINEOUT2N_WIDTH            1  /* MIXOUTR_TO_LINEOUT2N */ +#define WM8994_MIXOUTL_TO_LINEOUT2N             0x0020  /* MIXOUTL_TO_LINEOUT2N */ +#define WM8994_MIXOUTL_TO_LINEOUT2N_MASK        0x0020  /* MIXOUTL_TO_LINEOUT2N */ +#define WM8994_MIXOUTL_TO_LINEOUT2N_SHIFT            5  /* MIXOUTL_TO_LINEOUT2N */ +#define WM8994_MIXOUTL_TO_LINEOUT2N_WIDTH            1  /* MIXOUTL_TO_LINEOUT2N */ +#define WM8994_LINEOUT2_MODE                    0x0010  /* LINEOUT2_MODE */ +#define WM8994_LINEOUT2_MODE_MASK               0x0010  /* LINEOUT2_MODE */ +#define WM8994_LINEOUT2_MODE_SHIFT                   4  /* LINEOUT2_MODE */ +#define WM8994_LINEOUT2_MODE_WIDTH                   1  /* LINEOUT2_MODE */ +#define WM8994_IN1L_TO_LINEOUT2P                0x0004  /* IN1L_TO_LINEOUT2P */ +#define WM8994_IN1L_TO_LINEOUT2P_MASK           0x0004  /* IN1L_TO_LINEOUT2P */ +#define WM8994_IN1L_TO_LINEOUT2P_SHIFT               2  /* IN1L_TO_LINEOUT2P */ +#define WM8994_IN1L_TO_LINEOUT2P_WIDTH               1  /* IN1L_TO_LINEOUT2P */ +#define WM8994_IN1R_TO_LINEOUT2P                0x0002  /* IN1R_TO_LINEOUT2P */ +#define WM8994_IN1R_TO_LINEOUT2P_MASK           0x0002  /* IN1R_TO_LINEOUT2P */ +#define WM8994_IN1R_TO_LINEOUT2P_SHIFT               1  /* IN1R_TO_LINEOUT2P */ +#define WM8994_IN1R_TO_LINEOUT2P_WIDTH               1  /* IN1R_TO_LINEOUT2P */ +#define WM8994_MIXOUTR_TO_LINEOUT2P             0x0001  /* MIXOUTR_TO_LINEOUT2P */ +#define WM8994_MIXOUTR_TO_LINEOUT2P_MASK        0x0001  /* MIXOUTR_TO_LINEOUT2P */ +#define WM8994_MIXOUTR_TO_LINEOUT2P_SHIFT            0  /* MIXOUTR_TO_LINEOUT2P */ +#define WM8994_MIXOUTR_TO_LINEOUT2P_WIDTH            1  /* MIXOUTR_TO_LINEOUT2P */ + +/* + * R54 (0x36) - Speaker Mixer + */ +#define WM8994_DAC2L_TO_SPKMIXL                 0x0200  /* DAC2L_TO_SPKMIXL */ +#define WM8994_DAC2L_TO_SPKMIXL_MASK            0x0200  /* DAC2L_TO_SPKMIXL */ +#define WM8994_DAC2L_TO_SPKMIXL_SHIFT                9  /* DAC2L_TO_SPKMIXL */ +#define WM8994_DAC2L_TO_SPKMIXL_WIDTH                1  /* DAC2L_TO_SPKMIXL */ +#define WM8994_DAC2R_TO_SPKMIXR                 0x0100  /* DAC2R_TO_SPKMIXR */ +#define WM8994_DAC2R_TO_SPKMIXR_MASK            0x0100  /* DAC2R_TO_SPKMIXR */ +#define WM8994_DAC2R_TO_SPKMIXR_SHIFT                8  /* DAC2R_TO_SPKMIXR */ +#define WM8994_DAC2R_TO_SPKMIXR_WIDTH                1  /* DAC2R_TO_SPKMIXR */ +#define WM8994_MIXINL_TO_SPKMIXL                0x0080  /* MIXINL_TO_SPKMIXL */ +#define WM8994_MIXINL_TO_SPKMIXL_MASK           0x0080  /* MIXINL_TO_SPKMIXL */ +#define WM8994_MIXINL_TO_SPKMIXL_SHIFT               7  /* MIXINL_TO_SPKMIXL */ +#define WM8994_MIXINL_TO_SPKMIXL_WIDTH               1  /* MIXINL_TO_SPKMIXL */ +#define WM8994_MIXINR_TO_SPKMIXR                0x0040  /* MIXINR_TO_SPKMIXR */ +#define WM8994_MIXINR_TO_SPKMIXR_MASK           0x0040  /* MIXINR_TO_SPKMIXR */ +#define WM8994_MIXINR_TO_SPKMIXR_SHIFT               6  /* MIXINR_TO_SPKMIXR */ +#define WM8994_MIXINR_TO_SPKMIXR_WIDTH               1  /* MIXINR_TO_SPKMIXR */ +#define WM8994_IN1LP_TO_SPKMIXL                 0x0020  /* IN1LP_TO_SPKMIXL */ +#define WM8994_IN1LP_TO_SPKMIXL_MASK            0x0020  /* IN1LP_TO_SPKMIXL */ +#define WM8994_IN1LP_TO_SPKMIXL_SHIFT                5  /* IN1LP_TO_SPKMIXL */ +#define WM8994_IN1LP_TO_SPKMIXL_WIDTH                1  /* IN1LP_TO_SPKMIXL */ +#define WM8994_IN1RP_TO_SPKMIXR                 0x0010  /* IN1RP_TO_SPKMIXR */ +#define WM8994_IN1RP_TO_SPKMIXR_MASK            0x0010  /* IN1RP_TO_SPKMIXR */ +#define WM8994_IN1RP_TO_SPKMIXR_SHIFT                4  /* IN1RP_TO_SPKMIXR */ +#define WM8994_IN1RP_TO_SPKMIXR_WIDTH                1  /* IN1RP_TO_SPKMIXR */ +#define WM8994_MIXOUTL_TO_SPKMIXL               0x0008  /* MIXOUTL_TO_SPKMIXL */ +#define WM8994_MIXOUTL_TO_SPKMIXL_MASK          0x0008  /* MIXOUTL_TO_SPKMIXL */ +#define WM8994_MIXOUTL_TO_SPKMIXL_SHIFT              3  /* MIXOUTL_TO_SPKMIXL */ +#define WM8994_MIXOUTL_TO_SPKMIXL_WIDTH              1  /* MIXOUTL_TO_SPKMIXL */ +#define WM8994_MIXOUTR_TO_SPKMIXR               0x0004  /* MIXOUTR_TO_SPKMIXR */ +#define WM8994_MIXOUTR_TO_SPKMIXR_MASK          0x0004  /* MIXOUTR_TO_SPKMIXR */ +#define WM8994_MIXOUTR_TO_SPKMIXR_SHIFT              2  /* MIXOUTR_TO_SPKMIXR */ +#define WM8994_MIXOUTR_TO_SPKMIXR_WIDTH              1  /* MIXOUTR_TO_SPKMIXR */ +#define WM8994_DAC1L_TO_SPKMIXL                 0x0002  /* DAC1L_TO_SPKMIXL */ +#define WM8994_DAC1L_TO_SPKMIXL_MASK            0x0002  /* DAC1L_TO_SPKMIXL */ +#define WM8994_DAC1L_TO_SPKMIXL_SHIFT                1  /* DAC1L_TO_SPKMIXL */ +#define WM8994_DAC1L_TO_SPKMIXL_WIDTH                1  /* DAC1L_TO_SPKMIXL */ +#define WM8994_DAC1R_TO_SPKMIXR                 0x0001  /* DAC1R_TO_SPKMIXR */ +#define WM8994_DAC1R_TO_SPKMIXR_MASK            0x0001  /* DAC1R_TO_SPKMIXR */ +#define WM8994_DAC1R_TO_SPKMIXR_SHIFT                0  /* DAC1R_TO_SPKMIXR */ +#define WM8994_DAC1R_TO_SPKMIXR_WIDTH                1  /* DAC1R_TO_SPKMIXR */ + +/* + * R55 (0x37) - Additional Control + */ +#define WM8994_LINEOUT1_FB                      0x0080  /* LINEOUT1_FB */ +#define WM8994_LINEOUT1_FB_MASK                 0x0080  /* LINEOUT1_FB */ +#define WM8994_LINEOUT1_FB_SHIFT                     7  /* LINEOUT1_FB */ +#define WM8994_LINEOUT1_FB_WIDTH                     1  /* LINEOUT1_FB */ +#define WM8994_LINEOUT2_FB                      0x0040  /* LINEOUT2_FB */ +#define WM8994_LINEOUT2_FB_MASK                 0x0040  /* LINEOUT2_FB */ +#define WM8994_LINEOUT2_FB_SHIFT                     6  /* LINEOUT2_FB */ +#define WM8994_LINEOUT2_FB_WIDTH                     1  /* LINEOUT2_FB */ +#define WM8994_VROI                             0x0001  /* VROI */ +#define WM8994_VROI_MASK                        0x0001  /* VROI */ +#define WM8994_VROI_SHIFT                            0  /* VROI */ +#define WM8994_VROI_WIDTH                            1  /* VROI */ + +/* + * R56 (0x38) - AntiPOP (1) + */ +#define WM8994_LINEOUT_VMID_BUF_ENA             0x0080  /* LINEOUT_VMID_BUF_ENA */ +#define WM8994_LINEOUT_VMID_BUF_ENA_MASK        0x0080  /* LINEOUT_VMID_BUF_ENA */ +#define WM8994_LINEOUT_VMID_BUF_ENA_SHIFT            7  /* LINEOUT_VMID_BUF_ENA */ +#define WM8994_LINEOUT_VMID_BUF_ENA_WIDTH            1  /* LINEOUT_VMID_BUF_ENA */ +#define WM8994_HPOUT2_IN_ENA                    0x0040  /* HPOUT2_IN_ENA */ +#define WM8994_HPOUT2_IN_ENA_MASK               0x0040  /* HPOUT2_IN_ENA */ +#define WM8994_HPOUT2_IN_ENA_SHIFT                   6  /* HPOUT2_IN_ENA */ +#define WM8994_HPOUT2_IN_ENA_WIDTH                   1  /* HPOUT2_IN_ENA */ +#define WM8994_LINEOUT1_DISCH                   0x0020  /* LINEOUT1_DISCH */ +#define WM8994_LINEOUT1_DISCH_MASK              0x0020  /* LINEOUT1_DISCH */ +#define WM8994_LINEOUT1_DISCH_SHIFT                  5  /* LINEOUT1_DISCH */ +#define WM8994_LINEOUT1_DISCH_WIDTH                  1  /* LINEOUT1_DISCH */ +#define WM8994_LINEOUT2_DISCH                   0x0010  /* LINEOUT2_DISCH */ +#define WM8994_LINEOUT2_DISCH_MASK              0x0010  /* LINEOUT2_DISCH */ +#define WM8994_LINEOUT2_DISCH_SHIFT                  4  /* LINEOUT2_DISCH */ +#define WM8994_LINEOUT2_DISCH_WIDTH                  1  /* LINEOUT2_DISCH */ + +/* + * R57 (0x39) - AntiPOP (2) + */ +#define WM8994_MICB2_DISCH                      0x0100  /* MICB2_DISCH */ +#define WM8994_MICB2_DISCH_MASK                 0x0100  /* MICB2_DISCH */ +#define WM8994_MICB2_DISCH_SHIFT                     8  /* MICB2_DISCH */ +#define WM8994_MICB2_DISCH_WIDTH                     1  /* MICB2_DISCH */ +#define WM8994_MICB1_DISCH                      0x0080  /* MICB1_DISCH */ +#define WM8994_MICB1_DISCH_MASK                 0x0080  /* MICB1_DISCH */ +#define WM8994_MICB1_DISCH_SHIFT                     7  /* MICB1_DISCH */ +#define WM8994_MICB1_DISCH_WIDTH                     1  /* MICB1_DISCH */ +#define WM8994_VMID_RAMP_MASK                   0x0060  /* VMID_RAMP - [6:5] */ +#define WM8994_VMID_RAMP_SHIFT                       5  /* VMID_RAMP - [6:5] */ +#define WM8994_VMID_RAMP_WIDTH                       2  /* VMID_RAMP - [6:5] */ +#define WM8994_VMID_BUF_ENA                     0x0008  /* VMID_BUF_ENA */ +#define WM8994_VMID_BUF_ENA_MASK                0x0008  /* VMID_BUF_ENA */ +#define WM8994_VMID_BUF_ENA_SHIFT                    3  /* VMID_BUF_ENA */ +#define WM8994_VMID_BUF_ENA_WIDTH                    1  /* VMID_BUF_ENA */ +#define WM8994_STARTUP_BIAS_ENA                 0x0004  /* STARTUP_BIAS_ENA */ +#define WM8994_STARTUP_BIAS_ENA_MASK            0x0004  /* STARTUP_BIAS_ENA */ +#define WM8994_STARTUP_BIAS_ENA_SHIFT                2  /* STARTUP_BIAS_ENA */ +#define WM8994_STARTUP_BIAS_ENA_WIDTH                1  /* STARTUP_BIAS_ENA */ +#define WM8994_BIAS_SRC                         0x0002  /* BIAS_SRC */ +#define WM8994_BIAS_SRC_MASK                    0x0002  /* BIAS_SRC */ +#define WM8994_BIAS_SRC_SHIFT                        1  /* BIAS_SRC */ +#define WM8994_BIAS_SRC_WIDTH                        1  /* BIAS_SRC */ +#define WM8994_VMID_DISCH                       0x0001  /* VMID_DISCH */ +#define WM8994_VMID_DISCH_MASK                  0x0001  /* VMID_DISCH */ +#define WM8994_VMID_DISCH_SHIFT                      0  /* VMID_DISCH */ +#define WM8994_VMID_DISCH_WIDTH                      1  /* VMID_DISCH */ + +/* + * R58 (0x3A) - MICBIAS + */ +#define WM8994_MICD_SCTHR_MASK                  0x00C0  /* MICD_SCTHR - [7:6] */ +#define WM8994_MICD_SCTHR_SHIFT                      6  /* MICD_SCTHR - [7:6] */ +#define WM8994_MICD_SCTHR_WIDTH                      2  /* MICD_SCTHR - [7:6] */ +#define WM8994_MICD_THR_MASK                    0x0038  /* MICD_THR - [5:3] */ +#define WM8994_MICD_THR_SHIFT                        3  /* MICD_THR - [5:3] */ +#define WM8994_MICD_THR_WIDTH                        3  /* MICD_THR - [5:3] */ +#define WM8994_MICD_ENA                         0x0004  /* MICD_ENA */ +#define WM8994_MICD_ENA_MASK                    0x0004  /* MICD_ENA */ +#define WM8994_MICD_ENA_SHIFT                        2  /* MICD_ENA */ +#define WM8994_MICD_ENA_WIDTH                        1  /* MICD_ENA */ +#define WM8994_MICB2_LVL                        0x0002  /* MICB2_LVL */ +#define WM8994_MICB2_LVL_MASK                   0x0002  /* MICB2_LVL */ +#define WM8994_MICB2_LVL_SHIFT                       1  /* MICB2_LVL */ +#define WM8994_MICB2_LVL_WIDTH                       1  /* MICB2_LVL */ +#define WM8994_MICB1_LVL                        0x0001  /* MICB1_LVL */ +#define WM8994_MICB1_LVL_MASK                   0x0001  /* MICB1_LVL */ +#define WM8994_MICB1_LVL_SHIFT                       0  /* MICB1_LVL */ +#define WM8994_MICB1_LVL_WIDTH                       1  /* MICB1_LVL */ + +/* + * R59 (0x3B) - LDO 1 + */ +#define WM8994_LDO1_VSEL_MASK                   0x000E  /* LDO1_VSEL - [3:1] */ +#define WM8994_LDO1_VSEL_SHIFT                       1  /* LDO1_VSEL - [3:1] */ +#define WM8994_LDO1_VSEL_WIDTH                       3  /* LDO1_VSEL - [3:1] */ +#define WM8994_LDO1_DISCH                       0x0001  /* LDO1_DISCH */ +#define WM8994_LDO1_DISCH_MASK                  0x0001  /* LDO1_DISCH */ +#define WM8994_LDO1_DISCH_SHIFT                      0  /* LDO1_DISCH */ +#define WM8994_LDO1_DISCH_WIDTH                      1  /* LDO1_DISCH */ + +/* + * R60 (0x3C) - LDO 2 + */ +#define WM8994_LDO2_VSEL_MASK                   0x0006  /* LDO2_VSEL - [2:1] */ +#define WM8994_LDO2_VSEL_SHIFT                       1  /* LDO2_VSEL - [2:1] */ +#define WM8994_LDO2_VSEL_WIDTH                       2  /* LDO2_VSEL - [2:1] */ +#define WM8994_LDO2_DISCH                       0x0001  /* LDO2_DISCH */ +#define WM8994_LDO2_DISCH_MASK                  0x0001  /* LDO2_DISCH */ +#define WM8994_LDO2_DISCH_SHIFT                      0  /* LDO2_DISCH */ +#define WM8994_LDO2_DISCH_WIDTH                      1  /* LDO2_DISCH */ + +/* + * R76 (0x4C) - Charge Pump (1) + */ +#define WM8994_CP_ENA                           0x8000  /* CP_ENA */ +#define WM8994_CP_ENA_MASK                      0x8000  /* CP_ENA */ +#define WM8994_CP_ENA_SHIFT                         15  /* CP_ENA */ +#define WM8994_CP_ENA_WIDTH                          1  /* CP_ENA */ + +/* + * R81 (0x51) - Class W (1) + */ +#define WM8994_CP_DYN_SRC_SEL_MASK              0x0300  /* CP_DYN_SRC_SEL - [9:8] */ +#define WM8994_CP_DYN_SRC_SEL_SHIFT                  8  /* CP_DYN_SRC_SEL - [9:8] */ +#define WM8994_CP_DYN_SRC_SEL_WIDTH                  2  /* CP_DYN_SRC_SEL - [9:8] */ +#define WM8994_CP_DYN_PWR                       0x0001  /* CP_DYN_PWR */ +#define WM8994_CP_DYN_PWR_MASK                  0x0001  /* CP_DYN_PWR */ +#define WM8994_CP_DYN_PWR_SHIFT                      0  /* CP_DYN_PWR */ +#define WM8994_CP_DYN_PWR_WIDTH                      1  /* CP_DYN_PWR */ + +/* + * R84 (0x54) - DC Servo (1) + */ +#define WM8994_DCS_TRIG_SINGLE_1                0x2000  /* DCS_TRIG_SINGLE_1 */ +#define WM8994_DCS_TRIG_SINGLE_1_MASK           0x2000  /* DCS_TRIG_SINGLE_1 */ +#define WM8994_DCS_TRIG_SINGLE_1_SHIFT              13  /* DCS_TRIG_SINGLE_1 */ +#define WM8994_DCS_TRIG_SINGLE_1_WIDTH               1  /* DCS_TRIG_SINGLE_1 */ +#define WM8994_DCS_TRIG_SINGLE_0                0x1000  /* DCS_TRIG_SINGLE_0 */ +#define WM8994_DCS_TRIG_SINGLE_0_MASK           0x1000  /* DCS_TRIG_SINGLE_0 */ +#define WM8994_DCS_TRIG_SINGLE_0_SHIFT              12  /* DCS_TRIG_SINGLE_0 */ +#define WM8994_DCS_TRIG_SINGLE_0_WIDTH               1  /* DCS_TRIG_SINGLE_0 */ +#define WM8994_DCS_TRIG_SERIES_1                0x0200  /* DCS_TRIG_SERIES_1 */ +#define WM8994_DCS_TRIG_SERIES_1_MASK           0x0200  /* DCS_TRIG_SERIES_1 */ +#define WM8994_DCS_TRIG_SERIES_1_SHIFT               9  /* DCS_TRIG_SERIES_1 */ +#define WM8994_DCS_TRIG_SERIES_1_WIDTH               1  /* DCS_TRIG_SERIES_1 */ +#define WM8994_DCS_TRIG_SERIES_0                0x0100  /* DCS_TRIG_SERIES_0 */ +#define WM8994_DCS_TRIG_SERIES_0_MASK           0x0100  /* DCS_TRIG_SERIES_0 */ +#define WM8994_DCS_TRIG_SERIES_0_SHIFT               8  /* DCS_TRIG_SERIES_0 */ +#define WM8994_DCS_TRIG_SERIES_0_WIDTH               1  /* DCS_TRIG_SERIES_0 */ +#define WM8994_DCS_TRIG_STARTUP_1               0x0020  /* DCS_TRIG_STARTUP_1 */ +#define WM8994_DCS_TRIG_STARTUP_1_MASK          0x0020  /* DCS_TRIG_STARTUP_1 */ +#define WM8994_DCS_TRIG_STARTUP_1_SHIFT              5  /* DCS_TRIG_STARTUP_1 */ +#define WM8994_DCS_TRIG_STARTUP_1_WIDTH              1  /* DCS_TRIG_STARTUP_1 */ +#define WM8994_DCS_TRIG_STARTUP_0               0x0010  /* DCS_TRIG_STARTUP_0 */ +#define WM8994_DCS_TRIG_STARTUP_0_MASK          0x0010  /* DCS_TRIG_STARTUP_0 */ +#define WM8994_DCS_TRIG_STARTUP_0_SHIFT              4  /* DCS_TRIG_STARTUP_0 */ +#define WM8994_DCS_TRIG_STARTUP_0_WIDTH              1  /* DCS_TRIG_STARTUP_0 */ +#define WM8994_DCS_TRIG_DAC_WR_1                0x0008  /* DCS_TRIG_DAC_WR_1 */ +#define WM8994_DCS_TRIG_DAC_WR_1_MASK           0x0008  /* DCS_TRIG_DAC_WR_1 */ +#define WM8994_DCS_TRIG_DAC_WR_1_SHIFT               3  /* DCS_TRIG_DAC_WR_1 */ +#define WM8994_DCS_TRIG_DAC_WR_1_WIDTH               1  /* DCS_TRIG_DAC_WR_1 */ +#define WM8994_DCS_TRIG_DAC_WR_0                0x0004  /* DCS_TRIG_DAC_WR_0 */ +#define WM8994_DCS_TRIG_DAC_WR_0_MASK           0x0004  /* DCS_TRIG_DAC_WR_0 */ +#define WM8994_DCS_TRIG_DAC_WR_0_SHIFT               2  /* DCS_TRIG_DAC_WR_0 */ +#define WM8994_DCS_TRIG_DAC_WR_0_WIDTH               1  /* DCS_TRIG_DAC_WR_0 */ +#define WM8994_DCS_ENA_CHAN_1                   0x0002  /* DCS_ENA_CHAN_1 */ +#define WM8994_DCS_ENA_CHAN_1_MASK              0x0002  /* DCS_ENA_CHAN_1 */ +#define WM8994_DCS_ENA_CHAN_1_SHIFT                  1  /* DCS_ENA_CHAN_1 */ +#define WM8994_DCS_ENA_CHAN_1_WIDTH                  1  /* DCS_ENA_CHAN_1 */ +#define WM8994_DCS_ENA_CHAN_0                   0x0001  /* DCS_ENA_CHAN_0 */ +#define WM8994_DCS_ENA_CHAN_0_MASK              0x0001  /* DCS_ENA_CHAN_0 */ +#define WM8994_DCS_ENA_CHAN_0_SHIFT                  0  /* DCS_ENA_CHAN_0 */ +#define WM8994_DCS_ENA_CHAN_0_WIDTH                  1  /* DCS_ENA_CHAN_0 */ + +/* + * R85 (0x55) - DC Servo (2) + */ +#define WM8994_DCS_SERIES_NO_01_MASK            0x0FE0  /* DCS_SERIES_NO_01 - [11:5] */ +#define WM8994_DCS_SERIES_NO_01_SHIFT                5  /* DCS_SERIES_NO_01 - [11:5] */ +#define WM8994_DCS_SERIES_NO_01_WIDTH                7  /* DCS_SERIES_NO_01 - [11:5] */ +#define WM8994_DCS_TIMER_PERIOD_01_MASK         0x000F  /* DCS_TIMER_PERIOD_01 - [3:0] */ +#define WM8994_DCS_TIMER_PERIOD_01_SHIFT             0  /* DCS_TIMER_PERIOD_01 - [3:0] */ +#define WM8994_DCS_TIMER_PERIOD_01_WIDTH             4  /* DCS_TIMER_PERIOD_01 - [3:0] */ + +/* + * R87 (0x57) - DC Servo (4) + */ +#define WM8994_DCS_DAC_WR_VAL_1_MASK            0xFF00  /* DCS_DAC_WR_VAL_1 - [15:8] */ +#define WM8994_DCS_DAC_WR_VAL_1_SHIFT                8  /* DCS_DAC_WR_VAL_1 - [15:8] */ +#define WM8994_DCS_DAC_WR_VAL_1_WIDTH                8  /* DCS_DAC_WR_VAL_1 - [15:8] */ +#define WM8994_DCS_DAC_WR_VAL_0_MASK            0x00FF  /* DCS_DAC_WR_VAL_0 - [7:0] */ +#define WM8994_DCS_DAC_WR_VAL_0_SHIFT                0  /* DCS_DAC_WR_VAL_0 - [7:0] */ +#define WM8994_DCS_DAC_WR_VAL_0_WIDTH                8  /* DCS_DAC_WR_VAL_0 - [7:0] */ + +/* + * R88 (0x58) - DC Servo Readback + */ +#define WM8994_DCS_CAL_COMPLETE_MASK            0x0300  /* DCS_CAL_COMPLETE - [9:8] */ +#define WM8994_DCS_CAL_COMPLETE_SHIFT                8  /* DCS_CAL_COMPLETE - [9:8] */ +#define WM8994_DCS_CAL_COMPLETE_WIDTH                2  /* DCS_CAL_COMPLETE - [9:8] */ +#define WM8994_DCS_DAC_WR_COMPLETE_MASK         0x0030  /* DCS_DAC_WR_COMPLETE - [5:4] */ +#define WM8994_DCS_DAC_WR_COMPLETE_SHIFT             4  /* DCS_DAC_WR_COMPLETE - [5:4] */ +#define WM8994_DCS_DAC_WR_COMPLETE_WIDTH             2  /* DCS_DAC_WR_COMPLETE - [5:4] */ +#define WM8994_DCS_STARTUP_COMPLETE_MASK        0x0003  /* DCS_STARTUP_COMPLETE - [1:0] */ +#define WM8994_DCS_STARTUP_COMPLETE_SHIFT            0  /* DCS_STARTUP_COMPLETE - [1:0] */ +#define WM8994_DCS_STARTUP_COMPLETE_WIDTH            2  /* DCS_STARTUP_COMPLETE - [1:0] */ + +/* + * R96 (0x60) - Analogue HP (1) + */ +#define WM8994_HPOUT1L_RMV_SHORT                0x0080  /* HPOUT1L_RMV_SHORT */ +#define WM8994_HPOUT1L_RMV_SHORT_MASK           0x0080  /* HPOUT1L_RMV_SHORT */ +#define WM8994_HPOUT1L_RMV_SHORT_SHIFT               7  /* HPOUT1L_RMV_SHORT */ +#define WM8994_HPOUT1L_RMV_SHORT_WIDTH               1  /* HPOUT1L_RMV_SHORT */ +#define WM8994_HPOUT1L_OUTP                     0x0040  /* HPOUT1L_OUTP */ +#define WM8994_HPOUT1L_OUTP_MASK                0x0040  /* HPOUT1L_OUTP */ +#define WM8994_HPOUT1L_OUTP_SHIFT                    6  /* HPOUT1L_OUTP */ +#define WM8994_HPOUT1L_OUTP_WIDTH                    1  /* HPOUT1L_OUTP */ +#define WM8994_HPOUT1L_DLY                      0x0020  /* HPOUT1L_DLY */ +#define WM8994_HPOUT1L_DLY_MASK                 0x0020  /* HPOUT1L_DLY */ +#define WM8994_HPOUT1L_DLY_SHIFT                     5  /* HPOUT1L_DLY */ +#define WM8994_HPOUT1L_DLY_WIDTH                     1  /* HPOUT1L_DLY */ +#define WM8994_HPOUT1R_RMV_SHORT                0x0008  /* HPOUT1R_RMV_SHORT */ +#define WM8994_HPOUT1R_RMV_SHORT_MASK           0x0008  /* HPOUT1R_RMV_SHORT */ +#define WM8994_HPOUT1R_RMV_SHORT_SHIFT               3  /* HPOUT1R_RMV_SHORT */ +#define WM8994_HPOUT1R_RMV_SHORT_WIDTH               1  /* HPOUT1R_RMV_SHORT */ +#define WM8994_HPOUT1R_OUTP                     0x0004  /* HPOUT1R_OUTP */ +#define WM8994_HPOUT1R_OUTP_MASK                0x0004  /* HPOUT1R_OUTP */ +#define WM8994_HPOUT1R_OUTP_SHIFT                    2  /* HPOUT1R_OUTP */ +#define WM8994_HPOUT1R_OUTP_WIDTH                    1  /* HPOUT1R_OUTP */ +#define WM8994_HPOUT1R_DLY                      0x0002  /* HPOUT1R_DLY */ +#define WM8994_HPOUT1R_DLY_MASK                 0x0002  /* HPOUT1R_DLY */ +#define WM8994_HPOUT1R_DLY_SHIFT                     1  /* HPOUT1R_DLY */ +#define WM8994_HPOUT1R_DLY_WIDTH                     1  /* HPOUT1R_DLY */ + +/* + * R256 (0x100) - Chip Revision + */ +#define WM8994_CHIP_REV_MASK                    0x000F  /* CHIP_REV - [3:0] */ +#define WM8994_CHIP_REV_SHIFT                        0  /* CHIP_REV - [3:0] */ +#define WM8994_CHIP_REV_WIDTH                        4  /* CHIP_REV - [3:0] */ + +/* + * R257 (0x101) - Control Interface + */ +#define WM8994_SPI_CONTRD                       0x0040  /* SPI_CONTRD */ +#define WM8994_SPI_CONTRD_MASK                  0x0040  /* SPI_CONTRD */ +#define WM8994_SPI_CONTRD_SHIFT                      6  /* SPI_CONTRD */ +#define WM8994_SPI_CONTRD_WIDTH                      1  /* SPI_CONTRD */ +#define WM8994_SPI_4WIRE                        0x0020  /* SPI_4WIRE */ +#define WM8994_SPI_4WIRE_MASK                   0x0020  /* SPI_4WIRE */ +#define WM8994_SPI_4WIRE_SHIFT                       5  /* SPI_4WIRE */ +#define WM8994_SPI_4WIRE_WIDTH                       1  /* SPI_4WIRE */ +#define WM8994_SPI_CFG                          0x0010  /* SPI_CFG */ +#define WM8994_SPI_CFG_MASK                     0x0010  /* SPI_CFG */ +#define WM8994_SPI_CFG_SHIFT                         4  /* SPI_CFG */ +#define WM8994_SPI_CFG_WIDTH                         1  /* SPI_CFG */ +#define WM8994_AUTO_INC                         0x0004  /* AUTO_INC */ +#define WM8994_AUTO_INC_MASK                    0x0004  /* AUTO_INC */ +#define WM8994_AUTO_INC_SHIFT                        2  /* AUTO_INC */ +#define WM8994_AUTO_INC_WIDTH                        1  /* AUTO_INC */ + +/* + * R272 (0x110) - Write Sequencer Ctrl (1) + */ +#define WM8994_WSEQ_ENA                         0x8000  /* WSEQ_ENA */ +#define WM8994_WSEQ_ENA_MASK                    0x8000  /* WSEQ_ENA */ +#define WM8994_WSEQ_ENA_SHIFT                       15  /* WSEQ_ENA */ +#define WM8994_WSEQ_ENA_WIDTH                        1  /* WSEQ_ENA */ +#define WM8994_WSEQ_ABORT                       0x0200  /* WSEQ_ABORT */ +#define WM8994_WSEQ_ABORT_MASK                  0x0200  /* WSEQ_ABORT */ +#define WM8994_WSEQ_ABORT_SHIFT                      9  /* WSEQ_ABORT */ +#define WM8994_WSEQ_ABORT_WIDTH                      1  /* WSEQ_ABORT */ +#define WM8994_WSEQ_START                       0x0100  /* WSEQ_START */ +#define WM8994_WSEQ_START_MASK                  0x0100  /* WSEQ_START */ +#define WM8994_WSEQ_START_SHIFT                      8  /* WSEQ_START */ +#define WM8994_WSEQ_START_WIDTH                      1  /* WSEQ_START */ +#define WM8994_WSEQ_START_INDEX_MASK            0x007F  /* WSEQ_START_INDEX - [6:0] */ +#define WM8994_WSEQ_START_INDEX_SHIFT                0  /* WSEQ_START_INDEX - [6:0] */ +#define WM8994_WSEQ_START_INDEX_WIDTH                7  /* WSEQ_START_INDEX - [6:0] */ + +/* + * R273 (0x111) - Write Sequencer Ctrl (2) + */ +#define WM8994_WSEQ_BUSY                        0x0100  /* WSEQ_BUSY */ +#define WM8994_WSEQ_BUSY_MASK                   0x0100  /* WSEQ_BUSY */ +#define WM8994_WSEQ_BUSY_SHIFT                       8  /* WSEQ_BUSY */ +#define WM8994_WSEQ_BUSY_WIDTH                       1  /* WSEQ_BUSY */ +#define WM8994_WSEQ_CURRENT_INDEX_MASK          0x007F  /* WSEQ_CURRENT_INDEX - [6:0] */ +#define WM8994_WSEQ_CURRENT_INDEX_SHIFT              0  /* WSEQ_CURRENT_INDEX - [6:0] */ +#define WM8994_WSEQ_CURRENT_INDEX_WIDTH              7  /* WSEQ_CURRENT_INDEX - [6:0] */ + +/* + * R512 (0x200) - AIF1 Clocking (1) + */ +#define WM8994_AIF1CLK_SRC_MASK                 0x0018  /* AIF1CLK_SRC - [4:3] */ +#define WM8994_AIF1CLK_SRC_SHIFT                     3  /* AIF1CLK_SRC - [4:3] */ +#define WM8994_AIF1CLK_SRC_WIDTH                     2  /* AIF1CLK_SRC - [4:3] */ +#define WM8994_AIF1CLK_INV                      0x0004  /* AIF1CLK_INV */ +#define WM8994_AIF1CLK_INV_MASK                 0x0004  /* AIF1CLK_INV */ +#define WM8994_AIF1CLK_INV_SHIFT                     2  /* AIF1CLK_INV */ +#define WM8994_AIF1CLK_INV_WIDTH                     1  /* AIF1CLK_INV */ +#define WM8994_AIF1CLK_DIV                      0x0002  /* AIF1CLK_DIV */ +#define WM8994_AIF1CLK_DIV_MASK                 0x0002  /* AIF1CLK_DIV */ +#define WM8994_AIF1CLK_DIV_SHIFT                     1  /* AIF1CLK_DIV */ +#define WM8994_AIF1CLK_DIV_WIDTH                     1  /* AIF1CLK_DIV */ +#define WM8994_AIF1CLK_ENA                      0x0001  /* AIF1CLK_ENA */ +#define WM8994_AIF1CLK_ENA_MASK                 0x0001  /* AIF1CLK_ENA */ +#define WM8994_AIF1CLK_ENA_SHIFT                     0  /* AIF1CLK_ENA */ +#define WM8994_AIF1CLK_ENA_WIDTH                     1  /* AIF1CLK_ENA */ + +/* + * R513 (0x201) - AIF1 Clocking (2) + */ +#define WM8994_AIF1DAC_DIV_MASK                 0x0038  /* AIF1DAC_DIV - [5:3] */ +#define WM8994_AIF1DAC_DIV_SHIFT                     3  /* AIF1DAC_DIV - [5:3] */ +#define WM8994_AIF1DAC_DIV_WIDTH                     3  /* AIF1DAC_DIV - [5:3] */ +#define WM8994_AIF1ADC_DIV_MASK                 0x0007  /* AIF1ADC_DIV - [2:0] */ +#define WM8994_AIF1ADC_DIV_SHIFT                     0  /* AIF1ADC_DIV - [2:0] */ +#define WM8994_AIF1ADC_DIV_WIDTH                     3  /* AIF1ADC_DIV - [2:0] */ + +/* + * R516 (0x204) - AIF2 Clocking (1) + */ +#define WM8994_AIF2CLK_SRC_MASK                 0x0018  /* AIF2CLK_SRC - [4:3] */ +#define WM8994_AIF2CLK_SRC_SHIFT                     3  /* AIF2CLK_SRC - [4:3] */ +#define WM8994_AIF2CLK_SRC_WIDTH                     2  /* AIF2CLK_SRC - [4:3] */ +#define WM8994_AIF2CLK_INV                      0x0004  /* AIF2CLK_INV */ +#define WM8994_AIF2CLK_INV_MASK                 0x0004  /* AIF2CLK_INV */ +#define WM8994_AIF2CLK_INV_SHIFT                     2  /* AIF2CLK_INV */ +#define WM8994_AIF2CLK_INV_WIDTH                     1  /* AIF2CLK_INV */ +#define WM8994_AIF2CLK_DIV                      0x0002  /* AIF2CLK_DIV */ +#define WM8994_AIF2CLK_DIV_MASK                 0x0002  /* AIF2CLK_DIV */ +#define WM8994_AIF2CLK_DIV_SHIFT                     1  /* AIF2CLK_DIV */ +#define WM8994_AIF2CLK_DIV_WIDTH                     1  /* AIF2CLK_DIV */ +#define WM8994_AIF2CLK_ENA                      0x0001  /* AIF2CLK_ENA */ +#define WM8994_AIF2CLK_ENA_MASK                 0x0001  /* AIF2CLK_ENA */ +#define WM8994_AIF2CLK_ENA_SHIFT                     0  /* AIF2CLK_ENA */ +#define WM8994_AIF2CLK_ENA_WIDTH                     1  /* AIF2CLK_ENA */ + +/* + * R517 (0x205) - AIF2 Clocking (2) + */ +#define WM8994_AIF2DAC_DIV_MASK                 0x0038  /* AIF2DAC_DIV - [5:3] */ +#define WM8994_AIF2DAC_DIV_SHIFT                     3  /* AIF2DAC_DIV - [5:3] */ +#define WM8994_AIF2DAC_DIV_WIDTH                     3  /* AIF2DAC_DIV - [5:3] */ +#define WM8994_AIF2ADC_DIV_MASK                 0x0007  /* AIF2ADC_DIV - [2:0] */ +#define WM8994_AIF2ADC_DIV_SHIFT                     0  /* AIF2ADC_DIV - [2:0] */ +#define WM8994_AIF2ADC_DIV_WIDTH                     3  /* AIF2ADC_DIV - [2:0] */ + +/* + * R520 (0x208) - Clocking (1) + */ +#define WM8994_TOCLK_ENA                        0x0010  /* TOCLK_ENA */ +#define WM8994_TOCLK_ENA_MASK                   0x0010  /* TOCLK_ENA */ +#define WM8994_TOCLK_ENA_SHIFT                       4  /* TOCLK_ENA */ +#define WM8994_TOCLK_ENA_WIDTH                       1  /* TOCLK_ENA */ +#define WM8994_AIF1DSPCLK_ENA                   0x0008  /* AIF1DSPCLK_ENA */ +#define WM8994_AIF1DSPCLK_ENA_MASK              0x0008  /* AIF1DSPCLK_ENA */ +#define WM8994_AIF1DSPCLK_ENA_SHIFT                  3  /* AIF1DSPCLK_ENA */ +#define WM8994_AIF1DSPCLK_ENA_WIDTH                  1  /* AIF1DSPCLK_ENA */ +#define WM8994_AIF2DSPCLK_ENA                   0x0004  /* AIF2DSPCLK_ENA */ +#define WM8994_AIF2DSPCLK_ENA_MASK              0x0004  /* AIF2DSPCLK_ENA */ +#define WM8994_AIF2DSPCLK_ENA_SHIFT                  2  /* AIF2DSPCLK_ENA */ +#define WM8994_AIF2DSPCLK_ENA_WIDTH                  1  /* AIF2DSPCLK_ENA */ +#define WM8994_SYSDSPCLK_ENA                    0x0002  /* SYSDSPCLK_ENA */ +#define WM8994_SYSDSPCLK_ENA_MASK               0x0002  /* SYSDSPCLK_ENA */ +#define WM8994_SYSDSPCLK_ENA_SHIFT                   1  /* SYSDSPCLK_ENA */ +#define WM8994_SYSDSPCLK_ENA_WIDTH                   1  /* SYSDSPCLK_ENA */ +#define WM8994_SYSCLK_SRC                       0x0001  /* SYSCLK_SRC */ +#define WM8994_SYSCLK_SRC_MASK                  0x0001  /* SYSCLK_SRC */ +#define WM8994_SYSCLK_SRC_SHIFT                      0  /* SYSCLK_SRC */ +#define WM8994_SYSCLK_SRC_WIDTH                      1  /* SYSCLK_SRC */ + +/* + * R521 (0x209) - Clocking (2) + */ +#define WM8994_TOCLK_DIV_MASK                   0x0700  /* TOCLK_DIV - [10:8] */ +#define WM8994_TOCLK_DIV_SHIFT                       8  /* TOCLK_DIV - [10:8] */ +#define WM8994_TOCLK_DIV_WIDTH                       3  /* TOCLK_DIV - [10:8] */ +#define WM8994_DBCLK_DIV_MASK                   0x0070  /* DBCLK_DIV - [6:4] */ +#define WM8994_DBCLK_DIV_SHIFT                       4  /* DBCLK_DIV - [6:4] */ +#define WM8994_DBCLK_DIV_WIDTH                       3  /* DBCLK_DIV - [6:4] */ +#define WM8994_OPCLK_DIV_MASK                   0x0007  /* OPCLK_DIV - [2:0] */ +#define WM8994_OPCLK_DIV_SHIFT                       0  /* OPCLK_DIV - [2:0] */ +#define WM8994_OPCLK_DIV_WIDTH                       3  /* OPCLK_DIV - [2:0] */ + +/* + * R528 (0x210) - AIF1 Rate + */ +#define WM8994_AIF1_SR_MASK                     0x00F0  /* AIF1_SR - [7:4] */ +#define WM8994_AIF1_SR_SHIFT                         4  /* AIF1_SR - [7:4] */ +#define WM8994_AIF1_SR_WIDTH                         4  /* AIF1_SR - [7:4] */ +#define WM8994_AIF1CLK_RATE_MASK                0x000F  /* AIF1CLK_RATE - [3:0] */ +#define WM8994_AIF1CLK_RATE_SHIFT                    0  /* AIF1CLK_RATE - [3:0] */ +#define WM8994_AIF1CLK_RATE_WIDTH                    4  /* AIF1CLK_RATE - [3:0] */ + +/* + * R529 (0x211) - AIF2 Rate + */ +#define WM8994_AIF2_SR_MASK                     0x00F0  /* AIF2_SR - [7:4] */ +#define WM8994_AIF2_SR_SHIFT                         4  /* AIF2_SR - [7:4] */ +#define WM8994_AIF2_SR_WIDTH                         4  /* AIF2_SR - [7:4] */ +#define WM8994_AIF2CLK_RATE_MASK                0x000F  /* AIF2CLK_RATE - [3:0] */ +#define WM8994_AIF2CLK_RATE_SHIFT                    0  /* AIF2CLK_RATE - [3:0] */ +#define WM8994_AIF2CLK_RATE_WIDTH                    4  /* AIF2CLK_RATE - [3:0] */ + +/* + * R530 (0x212) - Rate Status + */ +#define WM8994_SR_ERROR_MASK                    0x000F  /* SR_ERROR - [3:0] */ +#define WM8994_SR_ERROR_SHIFT                        0  /* SR_ERROR - [3:0] */ +#define WM8994_SR_ERROR_WIDTH                        4  /* SR_ERROR - [3:0] */ + +/* + * R544 (0x220) - FLL1 Control (1) + */ +#define WM8994_FLL1_FRAC                        0x0004  /* FLL1_FRAC */ +#define WM8994_FLL1_FRAC_MASK                   0x0004  /* FLL1_FRAC */ +#define WM8994_FLL1_FRAC_SHIFT                       2  /* FLL1_FRAC */ +#define WM8994_FLL1_FRAC_WIDTH                       1  /* FLL1_FRAC */ +#define WM8994_FLL1_OSC_ENA                     0x0002  /* FLL1_OSC_ENA */ +#define WM8994_FLL1_OSC_ENA_MASK                0x0002  /* FLL1_OSC_ENA */ +#define WM8994_FLL1_OSC_ENA_SHIFT                    1  /* FLL1_OSC_ENA */ +#define WM8994_FLL1_OSC_ENA_WIDTH                    1  /* FLL1_OSC_ENA */ +#define WM8994_FLL1_ENA                         0x0001  /* FLL1_ENA */ +#define WM8994_FLL1_ENA_MASK                    0x0001  /* FLL1_ENA */ +#define WM8994_FLL1_ENA_SHIFT                        0  /* FLL1_ENA */ +#define WM8994_FLL1_ENA_WIDTH                        1  /* FLL1_ENA */ + +/* + * R545 (0x221) - FLL1 Control (2) + */ +#define WM8994_FLL1_OUTDIV_MASK                 0x3F00  /* FLL1_OUTDIV - [13:8] */ +#define WM8994_FLL1_OUTDIV_SHIFT                     8  /* FLL1_OUTDIV - [13:8] */ +#define WM8994_FLL1_OUTDIV_WIDTH                     6  /* FLL1_OUTDIV - [13:8] */ +#define WM8994_FLL1_CTRL_RATE_MASK              0x0070  /* FLL1_CTRL_RATE - [6:4] */ +#define WM8994_FLL1_CTRL_RATE_SHIFT                  4  /* FLL1_CTRL_RATE - [6:4] */ +#define WM8994_FLL1_CTRL_RATE_WIDTH                  3  /* FLL1_CTRL_RATE - [6:4] */ +#define WM8994_FLL1_FRATIO_MASK                 0x0007  /* FLL1_FRATIO - [2:0] */ +#define WM8994_FLL1_FRATIO_SHIFT                     0  /* FLL1_FRATIO - [2:0] */ +#define WM8994_FLL1_FRATIO_WIDTH                     3  /* FLL1_FRATIO - [2:0] */ + +/* + * R546 (0x222) - FLL1 Control (3) + */ +#define WM8994_FLL1_K_MASK                      0xFFFF  /* FLL1_K - [15:0] */ +#define WM8994_FLL1_K_SHIFT                          0  /* FLL1_K - [15:0] */ +#define WM8994_FLL1_K_WIDTH                         16  /* FLL1_K - [15:0] */ + +/* + * R547 (0x223) - FLL1 Control (4) + */ +#define WM8994_FLL1_N_MASK                      0x7FE0  /* FLL1_N - [14:5] */ +#define WM8994_FLL1_N_SHIFT                          5  /* FLL1_N - [14:5] */ +#define WM8994_FLL1_N_WIDTH                         10  /* FLL1_N - [14:5] */ +#define WM8994_FLL1_LOOP_GAIN_MASK              0x000F  /* FLL1_LOOP_GAIN - [3:0] */ +#define WM8994_FLL1_LOOP_GAIN_SHIFT                  0  /* FLL1_LOOP_GAIN - [3:0] */ +#define WM8994_FLL1_LOOP_GAIN_WIDTH                  4  /* FLL1_LOOP_GAIN - [3:0] */ + +/* + * R548 (0x224) - FLL1 Control (5) + */ +#define WM8994_FLL1_FRC_NCO_VAL_MASK            0x1F80  /* FLL1_FRC_NCO_VAL - [12:7] */ +#define WM8994_FLL1_FRC_NCO_VAL_SHIFT                7  /* FLL1_FRC_NCO_VAL - [12:7] */ +#define WM8994_FLL1_FRC_NCO_VAL_WIDTH                6  /* FLL1_FRC_NCO_VAL - [12:7] */ +#define WM8994_FLL1_FRC_NCO                     0x0040  /* FLL1_FRC_NCO */ +#define WM8994_FLL1_FRC_NCO_MASK                0x0040  /* FLL1_FRC_NCO */ +#define WM8994_FLL1_FRC_NCO_SHIFT                    6  /* FLL1_FRC_NCO */ +#define WM8994_FLL1_FRC_NCO_WIDTH                    1  /* FLL1_FRC_NCO */ +#define WM8994_FLL1_REFCLK_DIV_MASK             0x0018  /* FLL1_REFCLK_DIV - [4:3] */ +#define WM8994_FLL1_REFCLK_DIV_SHIFT                 3  /* FLL1_REFCLK_DIV - [4:3] */ +#define WM8994_FLL1_REFCLK_DIV_WIDTH                 2  /* FLL1_REFCLK_DIV - [4:3] */ +#define WM8994_FLL1_REFCLK_SRC_MASK             0x0003  /* FLL1_REFCLK_SRC - [1:0] */ +#define WM8994_FLL1_REFCLK_SRC_SHIFT                 0  /* FLL1_REFCLK_SRC - [1:0] */ +#define WM8994_FLL1_REFCLK_SRC_WIDTH                 2  /* FLL1_REFCLK_SRC - [1:0] */ + +/* + * R576 (0x240) - FLL2 Control (1) + */ +#define WM8994_FLL2_FRAC                        0x0004  /* FLL2_FRAC */ +#define WM8994_FLL2_FRAC_MASK                   0x0004  /* FLL2_FRAC */ +#define WM8994_FLL2_FRAC_SHIFT                       2  /* FLL2_FRAC */ +#define WM8994_FLL2_FRAC_WIDTH                       1  /* FLL2_FRAC */ +#define WM8994_FLL2_OSC_ENA                     0x0002  /* FLL2_OSC_ENA */ +#define WM8994_FLL2_OSC_ENA_MASK                0x0002  /* FLL2_OSC_ENA */ +#define WM8994_FLL2_OSC_ENA_SHIFT                    1  /* FLL2_OSC_ENA */ +#define WM8994_FLL2_OSC_ENA_WIDTH                    1  /* FLL2_OSC_ENA */ +#define WM8994_FLL2_ENA                         0x0001  /* FLL2_ENA */ +#define WM8994_FLL2_ENA_MASK                    0x0001  /* FLL2_ENA */ +#define WM8994_FLL2_ENA_SHIFT                        0  /* FLL2_ENA */ +#define WM8994_FLL2_ENA_WIDTH                        1  /* FLL2_ENA */ + +/* + * R577 (0x241) - FLL2 Control (2) + */ +#define WM8994_FLL2_OUTDIV_MASK                 0x3F00  /* FLL2_OUTDIV - [13:8] */ +#define WM8994_FLL2_OUTDIV_SHIFT                     8  /* FLL2_OUTDIV - [13:8] */ +#define WM8994_FLL2_OUTDIV_WIDTH                     6  /* FLL2_OUTDIV - [13:8] */ +#define WM8994_FLL2_CTRL_RATE_MASK              0x0070  /* FLL2_CTRL_RATE - [6:4] */ +#define WM8994_FLL2_CTRL_RATE_SHIFT                  4  /* FLL2_CTRL_RATE - [6:4] */ +#define WM8994_FLL2_CTRL_RATE_WIDTH                  3  /* FLL2_CTRL_RATE - [6:4] */ +#define WM8994_FLL2_FRATIO_MASK                 0x0007  /* FLL2_FRATIO - [2:0] */ +#define WM8994_FLL2_FRATIO_SHIFT                     0  /* FLL2_FRATIO - [2:0] */ +#define WM8994_FLL2_FRATIO_WIDTH                     3  /* FLL2_FRATIO - [2:0] */ + +/* + * R578 (0x242) - FLL2 Control (3) + */ +#define WM8994_FLL2_K_MASK                      0xFFFF  /* FLL2_K - [15:0] */ +#define WM8994_FLL2_K_SHIFT                          0  /* FLL2_K - [15:0] */ +#define WM8994_FLL2_K_WIDTH                         16  /* FLL2_K - [15:0] */ + +/* + * R579 (0x243) - FLL2 Control (4) + */ +#define WM8994_FLL2_N_MASK                      0x7FE0  /* FLL2_N - [14:5] */ +#define WM8994_FLL2_N_SHIFT                          5  /* FLL2_N - [14:5] */ +#define WM8994_FLL2_N_WIDTH                         10  /* FLL2_N - [14:5] */ +#define WM8994_FLL2_LOOP_GAIN_MASK              0x000F  /* FLL2_LOOP_GAIN - [3:0] */ +#define WM8994_FLL2_LOOP_GAIN_SHIFT                  0  /* FLL2_LOOP_GAIN - [3:0] */ +#define WM8994_FLL2_LOOP_GAIN_WIDTH                  4  /* FLL2_LOOP_GAIN - [3:0] */ + +/* + * R580 (0x244) - FLL2 Control (5) + */ +#define WM8994_FLL2_FRC_NCO_VAL_MASK            0x1F80  /* FLL2_FRC_NCO_VAL - [12:7] */ +#define WM8994_FLL2_FRC_NCO_VAL_SHIFT                7  /* FLL2_FRC_NCO_VAL - [12:7] */ +#define WM8994_FLL2_FRC_NCO_VAL_WIDTH                6  /* FLL2_FRC_NCO_VAL - [12:7] */ +#define WM8994_FLL2_FRC_NCO                     0x0040  /* FLL2_FRC_NCO */ +#define WM8994_FLL2_FRC_NCO_MASK                0x0040  /* FLL2_FRC_NCO */ +#define WM8994_FLL2_FRC_NCO_SHIFT                    6  /* FLL2_FRC_NCO */ +#define WM8994_FLL2_FRC_NCO_WIDTH                    1  /* FLL2_FRC_NCO */ +#define WM8994_FLL2_REFCLK_DIV_MASK             0x0018  /* FLL2_REFCLK_DIV - [4:3] */ +#define WM8994_FLL2_REFCLK_DIV_SHIFT                 3  /* FLL2_REFCLK_DIV - [4:3] */ +#define WM8994_FLL2_REFCLK_DIV_WIDTH                 2  /* FLL2_REFCLK_DIV - [4:3] */ +#define WM8994_FLL2_REFCLK_SRC_MASK             0x0003  /* FLL2_REFCLK_SRC - [1:0] */ +#define WM8994_FLL2_REFCLK_SRC_SHIFT                 0  /* FLL2_REFCLK_SRC - [1:0] */ +#define WM8994_FLL2_REFCLK_SRC_WIDTH                 2  /* FLL2_REFCLK_SRC - [1:0] */ + +/* + * R768 (0x300) - AIF1 Control (1) + */ +#define WM8994_AIF1ADCL_SRC                     0x8000  /* AIF1ADCL_SRC */ +#define WM8994_AIF1ADCL_SRC_MASK                0x8000  /* AIF1ADCL_SRC */ +#define WM8994_AIF1ADCL_SRC_SHIFT                   15  /* AIF1ADCL_SRC */ +#define WM8994_AIF1ADCL_SRC_WIDTH                    1  /* AIF1ADCL_SRC */ +#define WM8994_AIF1ADCR_SRC                     0x4000  /* AIF1ADCR_SRC */ +#define WM8994_AIF1ADCR_SRC_MASK                0x4000  /* AIF1ADCR_SRC */ +#define WM8994_AIF1ADCR_SRC_SHIFT                   14  /* AIF1ADCR_SRC */ +#define WM8994_AIF1ADCR_SRC_WIDTH                    1  /* AIF1ADCR_SRC */ +#define WM8994_AIF1ADC_TDM                      0x2000  /* AIF1ADC_TDM */ +#define WM8994_AIF1ADC_TDM_MASK                 0x2000  /* AIF1ADC_TDM */ +#define WM8994_AIF1ADC_TDM_SHIFT                    13  /* AIF1ADC_TDM */ +#define WM8994_AIF1ADC_TDM_WIDTH                     1  /* AIF1ADC_TDM */ +#define WM8994_AIF1_BCLK_INV                    0x0100  /* AIF1_BCLK_INV */ +#define WM8994_AIF1_BCLK_INV_MASK               0x0100  /* AIF1_BCLK_INV */ +#define WM8994_AIF1_BCLK_INV_SHIFT                   8  /* AIF1_BCLK_INV */ +#define WM8994_AIF1_BCLK_INV_WIDTH                   1  /* AIF1_BCLK_INV */ +#define WM8994_AIF1_LRCLK_INV                   0x0080  /* AIF1_LRCLK_INV */ +#define WM8994_AIF1_LRCLK_INV_MASK              0x0080  /* AIF1_LRCLK_INV */ +#define WM8994_AIF1_LRCLK_INV_SHIFT                  7  /* AIF1_LRCLK_INV */ +#define WM8994_AIF1_LRCLK_INV_WIDTH                  1  /* AIF1_LRCLK_INV */ +#define WM8994_AIF1_WL_MASK                     0x0060  /* AIF1_WL - [6:5] */ +#define WM8994_AIF1_WL_SHIFT                         5  /* AIF1_WL - [6:5] */ +#define WM8994_AIF1_WL_WIDTH                         2  /* AIF1_WL - [6:5] */ +#define WM8994_AIF1_FMT_MASK                    0x0018  /* AIF1_FMT - [4:3] */ +#define WM8994_AIF1_FMT_SHIFT                        3  /* AIF1_FMT - [4:3] */ +#define WM8994_AIF1_FMT_WIDTH                        2  /* AIF1_FMT - [4:3] */ + +/* + * R769 (0x301) - AIF1 Control (2) + */ +#define WM8994_AIF1DACL_SRC                     0x8000  /* AIF1DACL_SRC */ +#define WM8994_AIF1DACL_SRC_MASK                0x8000  /* AIF1DACL_SRC */ +#define WM8994_AIF1DACL_SRC_SHIFT                   15  /* AIF1DACL_SRC */ +#define WM8994_AIF1DACL_SRC_WIDTH                    1  /* AIF1DACL_SRC */ +#define WM8994_AIF1DACR_SRC                     0x4000  /* AIF1DACR_SRC */ +#define WM8994_AIF1DACR_SRC_MASK                0x4000  /* AIF1DACR_SRC */ +#define WM8994_AIF1DACR_SRC_SHIFT                   14  /* AIF1DACR_SRC */ +#define WM8994_AIF1DACR_SRC_WIDTH                    1  /* AIF1DACR_SRC */ +#define WM8994_AIF1DAC_BOOST_MASK               0x0C00  /* AIF1DAC_BOOST - [11:10] */ +#define WM8994_AIF1DAC_BOOST_SHIFT                  10  /* AIF1DAC_BOOST - [11:10] */ +#define WM8994_AIF1DAC_BOOST_WIDTH                   2  /* AIF1DAC_BOOST - [11:10] */ +#define WM8994_AIF1_MONO                        0x0100  /* AIF1_MONO */ +#define WM8994_AIF1_MONO_MASK                   0x0100  /* AIF1_MONO */ +#define WM8994_AIF1_MONO_SHIFT                       8  /* AIF1_MONO */ +#define WM8994_AIF1_MONO_WIDTH                       1  /* AIF1_MONO */ +#define WM8994_AIF1DAC_COMP                     0x0010  /* AIF1DAC_COMP */ +#define WM8994_AIF1DAC_COMP_MASK                0x0010  /* AIF1DAC_COMP */ +#define WM8994_AIF1DAC_COMP_SHIFT                    4  /* AIF1DAC_COMP */ +#define WM8994_AIF1DAC_COMP_WIDTH                    1  /* AIF1DAC_COMP */ +#define WM8994_AIF1DAC_COMPMODE                 0x0008  /* AIF1DAC_COMPMODE */ +#define WM8994_AIF1DAC_COMPMODE_MASK            0x0008  /* AIF1DAC_COMPMODE */ +#define WM8994_AIF1DAC_COMPMODE_SHIFT                3  /* AIF1DAC_COMPMODE */ +#define WM8994_AIF1DAC_COMPMODE_WIDTH                1  /* AIF1DAC_COMPMODE */ +#define WM8994_AIF1ADC_COMP                     0x0004  /* AIF1ADC_COMP */ +#define WM8994_AIF1ADC_COMP_MASK                0x0004  /* AIF1ADC_COMP */ +#define WM8994_AIF1ADC_COMP_SHIFT                    2  /* AIF1ADC_COMP */ +#define WM8994_AIF1ADC_COMP_WIDTH                    1  /* AIF1ADC_COMP */ +#define WM8994_AIF1ADC_COMPMODE                 0x0002  /* AIF1ADC_COMPMODE */ +#define WM8994_AIF1ADC_COMPMODE_MASK            0x0002  /* AIF1ADC_COMPMODE */ +#define WM8994_AIF1ADC_COMPMODE_SHIFT                1  /* AIF1ADC_COMPMODE */ +#define WM8994_AIF1ADC_COMPMODE_WIDTH                1  /* AIF1ADC_COMPMODE */ +#define WM8994_AIF1_LOOPBACK                    0x0001  /* AIF1_LOOPBACK */ +#define WM8994_AIF1_LOOPBACK_MASK               0x0001  /* AIF1_LOOPBACK */ +#define WM8994_AIF1_LOOPBACK_SHIFT                   0  /* AIF1_LOOPBACK */ +#define WM8994_AIF1_LOOPBACK_WIDTH                   1  /* AIF1_LOOPBACK */ + +/* + * R770 (0x302) - AIF1 Master/Slave + */ +#define WM8994_AIF1_TRI                         0x8000  /* AIF1_TRI */ +#define WM8994_AIF1_TRI_MASK                    0x8000  /* AIF1_TRI */ +#define WM8994_AIF1_TRI_SHIFT                       15  /* AIF1_TRI */ +#define WM8994_AIF1_TRI_WIDTH                        1  /* AIF1_TRI */ +#define WM8994_AIF1_MSTR                        0x4000  /* AIF1_MSTR */ +#define WM8994_AIF1_MSTR_MASK                   0x4000  /* AIF1_MSTR */ +#define WM8994_AIF1_MSTR_SHIFT                      14  /* AIF1_MSTR */ +#define WM8994_AIF1_MSTR_WIDTH                       1  /* AIF1_MSTR */ +#define WM8994_AIF1_CLK_FRC                     0x2000  /* AIF1_CLK_FRC */ +#define WM8994_AIF1_CLK_FRC_MASK                0x2000  /* AIF1_CLK_FRC */ +#define WM8994_AIF1_CLK_FRC_SHIFT                   13  /* AIF1_CLK_FRC */ +#define WM8994_AIF1_CLK_FRC_WIDTH                    1  /* AIF1_CLK_FRC */ +#define WM8994_AIF1_LRCLK_FRC                   0x1000  /* AIF1_LRCLK_FRC */ +#define WM8994_AIF1_LRCLK_FRC_MASK              0x1000  /* AIF1_LRCLK_FRC */ +#define WM8994_AIF1_LRCLK_FRC_SHIFT                 12  /* AIF1_LRCLK_FRC */ +#define WM8994_AIF1_LRCLK_FRC_WIDTH                  1  /* AIF1_LRCLK_FRC */ + +/* + * R771 (0x303) - AIF1 BCLK + */ +#define WM8994_AIF1_BCLK_DIV_MASK               0x01F0  /* AIF1_BCLK_DIV - [8:4] */ +#define WM8994_AIF1_BCLK_DIV_SHIFT                   4  /* AIF1_BCLK_DIV - [8:4] */ +#define WM8994_AIF1_BCLK_DIV_WIDTH                   5  /* AIF1_BCLK_DIV - [8:4] */ + +/* + * R772 (0x304) - AIF1ADC LRCLK + */ +#define WM8994_AIF1ADC_LRCLK_DIR                0x0800  /* AIF1ADC_LRCLK_DIR */ +#define WM8994_AIF1ADC_LRCLK_DIR_MASK           0x0800  /* AIF1ADC_LRCLK_DIR */ +#define WM8994_AIF1ADC_LRCLK_DIR_SHIFT              11  /* AIF1ADC_LRCLK_DIR */ +#define WM8994_AIF1ADC_LRCLK_DIR_WIDTH               1  /* AIF1ADC_LRCLK_DIR */ +#define WM8994_AIF1ADC_RATE_MASK                0x07FF  /* AIF1ADC_RATE - [10:0] */ +#define WM8994_AIF1ADC_RATE_SHIFT                    0  /* AIF1ADC_RATE - [10:0] */ +#define WM8994_AIF1ADC_RATE_WIDTH                   11  /* AIF1ADC_RATE - [10:0] */ + +/* + * R773 (0x305) - AIF1DAC LRCLK + */ +#define WM8994_AIF1DAC_LRCLK_DIR                0x0800  /* AIF1DAC_LRCLK_DIR */ +#define WM8994_AIF1DAC_LRCLK_DIR_MASK           0x0800  /* AIF1DAC_LRCLK_DIR */ +#define WM8994_AIF1DAC_LRCLK_DIR_SHIFT              11  /* AIF1DAC_LRCLK_DIR */ +#define WM8994_AIF1DAC_LRCLK_DIR_WIDTH               1  /* AIF1DAC_LRCLK_DIR */ +#define WM8994_AIF1DAC_RATE_MASK                0x07FF  /* AIF1DAC_RATE - [10:0] */ +#define WM8994_AIF1DAC_RATE_SHIFT                    0  /* AIF1DAC_RATE - [10:0] */ +#define WM8994_AIF1DAC_RATE_WIDTH                   11  /* AIF1DAC_RATE - [10:0] */ + +/* + * R774 (0x306) - AIF1DAC Data + */ +#define WM8994_AIF1DACL_DAT_INV                 0x0002  /* AIF1DACL_DAT_INV */ +#define WM8994_AIF1DACL_DAT_INV_MASK            0x0002  /* AIF1DACL_DAT_INV */ +#define WM8994_AIF1DACL_DAT_INV_SHIFT                1  /* AIF1DACL_DAT_INV */ +#define WM8994_AIF1DACL_DAT_INV_WIDTH                1  /* AIF1DACL_DAT_INV */ +#define WM8994_AIF1DACR_DAT_INV                 0x0001  /* AIF1DACR_DAT_INV */ +#define WM8994_AIF1DACR_DAT_INV_MASK            0x0001  /* AIF1DACR_DAT_INV */ +#define WM8994_AIF1DACR_DAT_INV_SHIFT                0  /* AIF1DACR_DAT_INV */ +#define WM8994_AIF1DACR_DAT_INV_WIDTH                1  /* AIF1DACR_DAT_INV */ + +/* + * R775 (0x307) - AIF1ADC Data + */ +#define WM8994_AIF1ADCL_DAT_INV                 0x0002  /* AIF1ADCL_DAT_INV */ +#define WM8994_AIF1ADCL_DAT_INV_MASK            0x0002  /* AIF1ADCL_DAT_INV */ +#define WM8994_AIF1ADCL_DAT_INV_SHIFT                1  /* AIF1ADCL_DAT_INV */ +#define WM8994_AIF1ADCL_DAT_INV_WIDTH                1  /* AIF1ADCL_DAT_INV */ +#define WM8994_AIF1ADCR_DAT_INV                 0x0001  /* AIF1ADCR_DAT_INV */ +#define WM8994_AIF1ADCR_DAT_INV_MASK            0x0001  /* AIF1ADCR_DAT_INV */ +#define WM8994_AIF1ADCR_DAT_INV_SHIFT                0  /* AIF1ADCR_DAT_INV */ +#define WM8994_AIF1ADCR_DAT_INV_WIDTH                1  /* AIF1ADCR_DAT_INV */ + +/* + * R784 (0x310) - AIF2 Control (1) + */ +#define WM8994_AIF2ADCL_SRC                     0x8000  /* AIF2ADCL_SRC */ +#define WM8994_AIF2ADCL_SRC_MASK                0x8000  /* AIF2ADCL_SRC */ +#define WM8994_AIF2ADCL_SRC_SHIFT                   15  /* AIF2ADCL_SRC */ +#define WM8994_AIF2ADCL_SRC_WIDTH                    1  /* AIF2ADCL_SRC */ +#define WM8994_AIF2ADCR_SRC                     0x4000  /* AIF2ADCR_SRC */ +#define WM8994_AIF2ADCR_SRC_MASK                0x4000  /* AIF2ADCR_SRC */ +#define WM8994_AIF2ADCR_SRC_SHIFT                   14  /* AIF2ADCR_SRC */ +#define WM8994_AIF2ADCR_SRC_WIDTH                    1  /* AIF2ADCR_SRC */ +#define WM8994_AIF2ADC_TDM                      0x2000  /* AIF2ADC_TDM */ +#define WM8994_AIF2ADC_TDM_MASK                 0x2000  /* AIF2ADC_TDM */ +#define WM8994_AIF2ADC_TDM_SHIFT                    13  /* AIF2ADC_TDM */ +#define WM8994_AIF2ADC_TDM_WIDTH                     1  /* AIF2ADC_TDM */ +#define WM8994_AIF2ADC_TDM_CHAN                 0x1000  /* AIF2ADC_TDM_CHAN */ +#define WM8994_AIF2ADC_TDM_CHAN_MASK            0x1000  /* AIF2ADC_TDM_CHAN */ +#define WM8994_AIF2ADC_TDM_CHAN_SHIFT               12  /* AIF2ADC_TDM_CHAN */ +#define WM8994_AIF2ADC_TDM_CHAN_WIDTH                1  /* AIF2ADC_TDM_CHAN */ +#define WM8994_AIF2_BCLK_INV                    0x0100  /* AIF2_BCLK_INV */ +#define WM8994_AIF2_BCLK_INV_MASK               0x0100  /* AIF2_BCLK_INV */ +#define WM8994_AIF2_BCLK_INV_SHIFT                   8  /* AIF2_BCLK_INV */ +#define WM8994_AIF2_BCLK_INV_WIDTH                   1  /* AIF2_BCLK_INV */ +#define WM8994_AIF2_LRCLK_INV                   0x0080  /* AIF2_LRCLK_INV */ +#define WM8994_AIF2_LRCLK_INV_MASK              0x0080  /* AIF2_LRCLK_INV */ +#define WM8994_AIF2_LRCLK_INV_SHIFT                  7  /* AIF2_LRCLK_INV */ +#define WM8994_AIF2_LRCLK_INV_WIDTH                  1  /* AIF2_LRCLK_INV */ +#define WM8994_AIF2_WL_MASK                     0x0060  /* AIF2_WL - [6:5] */ +#define WM8994_AIF2_WL_SHIFT                         5  /* AIF2_WL - [6:5] */ +#define WM8994_AIF2_WL_WIDTH                         2  /* AIF2_WL - [6:5] */ +#define WM8994_AIF2_FMT_MASK                    0x0018  /* AIF2_FMT - [4:3] */ +#define WM8994_AIF2_FMT_SHIFT                        3  /* AIF2_FMT - [4:3] */ +#define WM8994_AIF2_FMT_WIDTH                        2  /* AIF2_FMT - [4:3] */ + +/* + * R785 (0x311) - AIF2 Control (2) + */ +#define WM8994_AIF2DACL_SRC                     0x8000  /* AIF2DACL_SRC */ +#define WM8994_AIF2DACL_SRC_MASK                0x8000  /* AIF2DACL_SRC */ +#define WM8994_AIF2DACL_SRC_SHIFT                   15  /* AIF2DACL_SRC */ +#define WM8994_AIF2DACL_SRC_WIDTH                    1  /* AIF2DACL_SRC */ +#define WM8994_AIF2DACR_SRC                     0x4000  /* AIF2DACR_SRC */ +#define WM8994_AIF2DACR_SRC_MASK                0x4000  /* AIF2DACR_SRC */ +#define WM8994_AIF2DACR_SRC_SHIFT                   14  /* AIF2DACR_SRC */ +#define WM8994_AIF2DACR_SRC_WIDTH                    1  /* AIF2DACR_SRC */ +#define WM8994_AIF2DAC_TDM                      0x2000  /* AIF2DAC_TDM */ +#define WM8994_AIF2DAC_TDM_MASK                 0x2000  /* AIF2DAC_TDM */ +#define WM8994_AIF2DAC_TDM_SHIFT                    13  /* AIF2DAC_TDM */ +#define WM8994_AIF2DAC_TDM_WIDTH                     1  /* AIF2DAC_TDM */ +#define WM8994_AIF2DAC_TDM_CHAN                 0x1000  /* AIF2DAC_TDM_CHAN */ +#define WM8994_AIF2DAC_TDM_CHAN_MASK            0x1000  /* AIF2DAC_TDM_CHAN */ +#define WM8994_AIF2DAC_TDM_CHAN_SHIFT               12  /* AIF2DAC_TDM_CHAN */ +#define WM8994_AIF2DAC_TDM_CHAN_WIDTH                1  /* AIF2DAC_TDM_CHAN */ +#define WM8994_AIF2DAC_BOOST_MASK               0x0C00  /* AIF2DAC_BOOST - [11:10] */ +#define WM8994_AIF2DAC_BOOST_SHIFT                  10  /* AIF2DAC_BOOST - [11:10] */ +#define WM8994_AIF2DAC_BOOST_WIDTH                   2  /* AIF2DAC_BOOST - [11:10] */ +#define WM8994_AIF2_MONO                        0x0100  /* AIF2_MONO */ +#define WM8994_AIF2_MONO_MASK                   0x0100  /* AIF2_MONO */ +#define WM8994_AIF2_MONO_SHIFT                       8  /* AIF2_MONO */ +#define WM8994_AIF2_MONO_WIDTH                       1  /* AIF2_MONO */ +#define WM8994_AIF2DAC_COMP                     0x0010  /* AIF2DAC_COMP */ +#define WM8994_AIF2DAC_COMP_MASK                0x0010  /* AIF2DAC_COMP */ +#define WM8994_AIF2DAC_COMP_SHIFT                    4  /* AIF2DAC_COMP */ +#define WM8994_AIF2DAC_COMP_WIDTH                    1  /* AIF2DAC_COMP */ +#define WM8994_AIF2DAC_COMPMODE                 0x0008  /* AIF2DAC_COMPMODE */ +#define WM8994_AIF2DAC_COMPMODE_MASK            0x0008  /* AIF2DAC_COMPMODE */ +#define WM8994_AIF2DAC_COMPMODE_SHIFT                3  /* AIF2DAC_COMPMODE */ +#define WM8994_AIF2DAC_COMPMODE_WIDTH                1  /* AIF2DAC_COMPMODE */ +#define WM8994_AIF2ADC_COMP                     0x0004  /* AIF2ADC_COMP */ +#define WM8994_AIF2ADC_COMP_MASK                0x0004  /* AIF2ADC_COMP */ +#define WM8994_AIF2ADC_COMP_SHIFT                    2  /* AIF2ADC_COMP */ +#define WM8994_AIF2ADC_COMP_WIDTH                    1  /* AIF2ADC_COMP */ +#define WM8994_AIF2ADC_COMPMODE                 0x0002  /* AIF2ADC_COMPMODE */ +#define WM8994_AIF2ADC_COMPMODE_MASK            0x0002  /* AIF2ADC_COMPMODE */ +#define WM8994_AIF2ADC_COMPMODE_SHIFT                1  /* AIF2ADC_COMPMODE */ +#define WM8994_AIF2ADC_COMPMODE_WIDTH                1  /* AIF2ADC_COMPMODE */ +#define WM8994_AIF2_LOOPBACK                    0x0001  /* AIF2_LOOPBACK */ +#define WM8994_AIF2_LOOPBACK_MASK               0x0001  /* AIF2_LOOPBACK */ +#define WM8994_AIF2_LOOPBACK_SHIFT                   0  /* AIF2_LOOPBACK */ +#define WM8994_AIF2_LOOPBACK_WIDTH                   1  /* AIF2_LOOPBACK */ + +/* + * R786 (0x312) - AIF2 Master/Slave + */ +#define WM8994_AIF2_TRI                         0x8000  /* AIF2_TRI */ +#define WM8994_AIF2_TRI_MASK                    0x8000  /* AIF2_TRI */ +#define WM8994_AIF2_TRI_SHIFT                       15  /* AIF2_TRI */ +#define WM8994_AIF2_TRI_WIDTH                        1  /* AIF2_TRI */ +#define WM8994_AIF2_MSTR                        0x4000  /* AIF2_MSTR */ +#define WM8994_AIF2_MSTR_MASK                   0x4000  /* AIF2_MSTR */ +#define WM8994_AIF2_MSTR_SHIFT                      14  /* AIF2_MSTR */ +#define WM8994_AIF2_MSTR_WIDTH                       1  /* AIF2_MSTR */ +#define WM8994_AIF2_CLK_FRC                     0x2000  /* AIF2_CLK_FRC */ +#define WM8994_AIF2_CLK_FRC_MASK                0x2000  /* AIF2_CLK_FRC */ +#define WM8994_AIF2_CLK_FRC_SHIFT                   13  /* AIF2_CLK_FRC */ +#define WM8994_AIF2_CLK_FRC_WIDTH                    1  /* AIF2_CLK_FRC */ +#define WM8994_AIF2_LRCLK_FRC                   0x1000  /* AIF2_LRCLK_FRC */ +#define WM8994_AIF2_LRCLK_FRC_MASK              0x1000  /* AIF2_LRCLK_FRC */ +#define WM8994_AIF2_LRCLK_FRC_SHIFT                 12  /* AIF2_LRCLK_FRC */ +#define WM8994_AIF2_LRCLK_FRC_WIDTH                  1  /* AIF2_LRCLK_FRC */ + +/* + * R787 (0x313) - AIF2 BCLK + */ +#define WM8994_AIF2_BCLK_DIV_MASK               0x01F0  /* AIF2_BCLK_DIV - [8:4] */ +#define WM8994_AIF2_BCLK_DIV_SHIFT                   4  /* AIF2_BCLK_DIV - [8:4] */ +#define WM8994_AIF2_BCLK_DIV_WIDTH                   5  /* AIF2_BCLK_DIV - [8:4] */ + +/* + * R788 (0x314) - AIF2ADC LRCLK + */ +#define WM8994_AIF2ADC_LRCLK_DIR                0x0800  /* AIF2ADC_LRCLK_DIR */ +#define WM8994_AIF2ADC_LRCLK_DIR_MASK           0x0800  /* AIF2ADC_LRCLK_DIR */ +#define WM8994_AIF2ADC_LRCLK_DIR_SHIFT              11  /* AIF2ADC_LRCLK_DIR */ +#define WM8994_AIF2ADC_LRCLK_DIR_WIDTH               1  /* AIF2ADC_LRCLK_DIR */ +#define WM8994_AIF2ADC_RATE_MASK                0x07FF  /* AIF2ADC_RATE - [10:0] */ +#define WM8994_AIF2ADC_RATE_SHIFT                    0  /* AIF2ADC_RATE - [10:0] */ +#define WM8994_AIF2ADC_RATE_WIDTH                   11  /* AIF2ADC_RATE - [10:0] */ + +/* + * R789 (0x315) - AIF2DAC LRCLK + */ +#define WM8994_AIF2DAC_LRCLK_DIR                0x0800  /* AIF2DAC_LRCLK_DIR */ +#define WM8994_AIF2DAC_LRCLK_DIR_MASK           0x0800  /* AIF2DAC_LRCLK_DIR */ +#define WM8994_AIF2DAC_LRCLK_DIR_SHIFT              11  /* AIF2DAC_LRCLK_DIR */ +#define WM8994_AIF2DAC_LRCLK_DIR_WIDTH               1  /* AIF2DAC_LRCLK_DIR */ +#define WM8994_AIF2DAC_RATE_MASK                0x07FF  /* AIF2DAC_RATE - [10:0] */ +#define WM8994_AIF2DAC_RATE_SHIFT                    0  /* AIF2DAC_RATE - [10:0] */ +#define WM8994_AIF2DAC_RATE_WIDTH                   11  /* AIF2DAC_RATE - [10:0] */ + +/* + * R790 (0x316) - AIF2DAC Data + */ +#define WM8994_AIF2DACL_DAT_INV                 0x0002  /* AIF2DACL_DAT_INV */ +#define WM8994_AIF2DACL_DAT_INV_MASK            0x0002  /* AIF2DACL_DAT_INV */ +#define WM8994_AIF2DACL_DAT_INV_SHIFT                1  /* AIF2DACL_DAT_INV */ +#define WM8994_AIF2DACL_DAT_INV_WIDTH                1  /* AIF2DACL_DAT_INV */ +#define WM8994_AIF2DACR_DAT_INV                 0x0001  /* AIF2DACR_DAT_INV */ +#define WM8994_AIF2DACR_DAT_INV_MASK            0x0001  /* AIF2DACR_DAT_INV */ +#define WM8994_AIF2DACR_DAT_INV_SHIFT                0  /* AIF2DACR_DAT_INV */ +#define WM8994_AIF2DACR_DAT_INV_WIDTH                1  /* AIF2DACR_DAT_INV */ + +/* + * R791 (0x317) - AIF2ADC Data + */ +#define WM8994_AIF2ADCL_DAT_INV                 0x0002  /* AIF2ADCL_DAT_INV */ +#define WM8994_AIF2ADCL_DAT_INV_MASK            0x0002  /* AIF2ADCL_DAT_INV */ +#define WM8994_AIF2ADCL_DAT_INV_SHIFT                1  /* AIF2ADCL_DAT_INV */ +#define WM8994_AIF2ADCL_DAT_INV_WIDTH                1  /* AIF2ADCL_DAT_INV */ +#define WM8994_AIF2ADCR_DAT_INV                 0x0001  /* AIF2ADCR_DAT_INV */ +#define WM8994_AIF2ADCR_DAT_INV_MASK            0x0001  /* AIF2ADCR_DAT_INV */ +#define WM8994_AIF2ADCR_DAT_INV_SHIFT                0  /* AIF2ADCR_DAT_INV */ +#define WM8994_AIF2ADCR_DAT_INV_WIDTH                1  /* AIF2ADCR_DAT_INV */ + +/* + * R1024 (0x400) - AIF1 ADC1 Left Volume + */ +#define WM8994_AIF1ADC1_VU                      0x0100  /* AIF1ADC1_VU */ +#define WM8994_AIF1ADC1_VU_MASK                 0x0100  /* AIF1ADC1_VU */ +#define WM8994_AIF1ADC1_VU_SHIFT                     8  /* AIF1ADC1_VU */ +#define WM8994_AIF1ADC1_VU_WIDTH                     1  /* AIF1ADC1_VU */ +#define WM8994_AIF1ADC1L_VOL_MASK               0x00FF  /* AIF1ADC1L_VOL - [7:0] */ +#define WM8994_AIF1ADC1L_VOL_SHIFT                   0  /* AIF1ADC1L_VOL - [7:0] */ +#define WM8994_AIF1ADC1L_VOL_WIDTH                   8  /* AIF1ADC1L_VOL - [7:0] */ + +/* + * R1025 (0x401) - AIF1 ADC1 Right Volume + */ +#define WM8994_AIF1ADC1_VU                      0x0100  /* AIF1ADC1_VU */ +#define WM8994_AIF1ADC1_VU_MASK                 0x0100  /* AIF1ADC1_VU */ +#define WM8994_AIF1ADC1_VU_SHIFT                     8  /* AIF1ADC1_VU */ +#define WM8994_AIF1ADC1_VU_WIDTH                     1  /* AIF1ADC1_VU */ +#define WM8994_AIF1ADC1R_VOL_MASK               0x00FF  /* AIF1ADC1R_VOL - [7:0] */ +#define WM8994_AIF1ADC1R_VOL_SHIFT                   0  /* AIF1ADC1R_VOL - [7:0] */ +#define WM8994_AIF1ADC1R_VOL_WIDTH                   8  /* AIF1ADC1R_VOL - [7:0] */ + +/* + * R1026 (0x402) - AIF1 DAC1 Left Volume + */ +#define WM8994_AIF1DAC1_VU                      0x0100  /* AIF1DAC1_VU */ +#define WM8994_AIF1DAC1_VU_MASK                 0x0100  /* AIF1DAC1_VU */ +#define WM8994_AIF1DAC1_VU_SHIFT                     8  /* AIF1DAC1_VU */ +#define WM8994_AIF1DAC1_VU_WIDTH                     1  /* AIF1DAC1_VU */ +#define WM8994_AIF1DAC1L_VOL_MASK               0x00FF  /* AIF1DAC1L_VOL - [7:0] */ +#define WM8994_AIF1DAC1L_VOL_SHIFT                   0  /* AIF1DAC1L_VOL - [7:0] */ +#define WM8994_AIF1DAC1L_VOL_WIDTH                   8  /* AIF1DAC1L_VOL - [7:0] */ + +/* + * R1027 (0x403) - AIF1 DAC1 Right Volume + */ +#define WM8994_AIF1DAC1_VU                      0x0100  /* AIF1DAC1_VU */ +#define WM8994_AIF1DAC1_VU_MASK                 0x0100  /* AIF1DAC1_VU */ +#define WM8994_AIF1DAC1_VU_SHIFT                     8  /* AIF1DAC1_VU */ +#define WM8994_AIF1DAC1_VU_WIDTH                     1  /* AIF1DAC1_VU */ +#define WM8994_AIF1DAC1R_VOL_MASK               0x00FF  /* AIF1DAC1R_VOL - [7:0] */ +#define WM8994_AIF1DAC1R_VOL_SHIFT                   0  /* AIF1DAC1R_VOL - [7:0] */ +#define WM8994_AIF1DAC1R_VOL_WIDTH                   8  /* AIF1DAC1R_VOL - [7:0] */ + +/* + * R1028 (0x404) - AIF1 ADC2 Left Volume + */ +#define WM8994_AIF1ADC2_VU                      0x0100  /* AIF1ADC2_VU */ +#define WM8994_AIF1ADC2_VU_MASK                 0x0100  /* AIF1ADC2_VU */ +#define WM8994_AIF1ADC2_VU_SHIFT                     8  /* AIF1ADC2_VU */ +#define WM8994_AIF1ADC2_VU_WIDTH                     1  /* AIF1ADC2_VU */ +#define WM8994_AIF1ADC2L_VOL_MASK               0x00FF  /* AIF1ADC2L_VOL - [7:0] */ +#define WM8994_AIF1ADC2L_VOL_SHIFT                   0  /* AIF1ADC2L_VOL - [7:0] */ +#define WM8994_AIF1ADC2L_VOL_WIDTH                   8  /* AIF1ADC2L_VOL - [7:0] */ + +/* + * R1029 (0x405) - AIF1 ADC2 Right Volume + */ +#define WM8994_AIF1ADC2_VU                      0x0100  /* AIF1ADC2_VU */ +#define WM8994_AIF1ADC2_VU_MASK                 0x0100  /* AIF1ADC2_VU */ +#define WM8994_AIF1ADC2_VU_SHIFT                     8  /* AIF1ADC2_VU */ +#define WM8994_AIF1ADC2_VU_WIDTH                     1  /* AIF1ADC2_VU */ +#define WM8994_AIF1ADC2R_VOL_MASK               0x00FF  /* AIF1ADC2R_VOL - [7:0] */ +#define WM8994_AIF1ADC2R_VOL_SHIFT                   0  /* AIF1ADC2R_VOL - [7:0] */ +#define WM8994_AIF1ADC2R_VOL_WIDTH                   8  /* AIF1ADC2R_VOL - [7:0] */ + +/* + * R1030 (0x406) - AIF1 DAC2 Left Volume + */ +#define WM8994_AIF1DAC2_VU                      0x0100  /* AIF1DAC2_VU */ +#define WM8994_AIF1DAC2_VU_MASK                 0x0100  /* AIF1DAC2_VU */ +#define WM8994_AIF1DAC2_VU_SHIFT                     8  /* AIF1DAC2_VU */ +#define WM8994_AIF1DAC2_VU_WIDTH                     1  /* AIF1DAC2_VU */ +#define WM8994_AIF1DAC2L_VOL_MASK               0x00FF  /* AIF1DAC2L_VOL - [7:0] */ +#define WM8994_AIF1DAC2L_VOL_SHIFT                   0  /* AIF1DAC2L_VOL - [7:0] */ +#define WM8994_AIF1DAC2L_VOL_WIDTH                   8  /* AIF1DAC2L_VOL - [7:0] */ + +/* + * R1031 (0x407) - AIF1 DAC2 Right Volume + */ +#define WM8994_AIF1DAC2_VU                      0x0100  /* AIF1DAC2_VU */ +#define WM8994_AIF1DAC2_VU_MASK                 0x0100  /* AIF1DAC2_VU */ +#define WM8994_AIF1DAC2_VU_SHIFT                     8  /* AIF1DAC2_VU */ +#define WM8994_AIF1DAC2_VU_WIDTH                     1  /* AIF1DAC2_VU */ +#define WM8994_AIF1DAC2R_VOL_MASK               0x00FF  /* AIF1DAC2R_VOL - [7:0] */ +#define WM8994_AIF1DAC2R_VOL_SHIFT                   0  /* AIF1DAC2R_VOL - [7:0] */ +#define WM8994_AIF1DAC2R_VOL_WIDTH                   8  /* AIF1DAC2R_VOL - [7:0] */ + +/* + * R1040 (0x410) - AIF1 ADC1 Filters + */ +#define WM8994_AIF1ADC_4FS                      0x8000  /* AIF1ADC_4FS */ +#define WM8994_AIF1ADC_4FS_MASK                 0x8000  /* AIF1ADC_4FS */ +#define WM8994_AIF1ADC_4FS_SHIFT                    15  /* AIF1ADC_4FS */ +#define WM8994_AIF1ADC_4FS_WIDTH                     1  /* AIF1ADC_4FS */ +#define WM8994_AIF1ADC1_HPF_CUT_MASK            0x6000  /* AIF1ADC1_HPF_CUT - [14:13] */ +#define WM8994_AIF1ADC1_HPF_CUT_SHIFT               13  /* AIF1ADC1_HPF_CUT - [14:13] */ +#define WM8994_AIF1ADC1_HPF_CUT_WIDTH                2  /* AIF1ADC1_HPF_CUT - [14:13] */ +#define WM8994_AIF1ADC1L_HPF                    0x1000  /* AIF1ADC1L_HPF */ +#define WM8994_AIF1ADC1L_HPF_MASK               0x1000  /* AIF1ADC1L_HPF */ +#define WM8994_AIF1ADC1L_HPF_SHIFT                  12  /* AIF1ADC1L_HPF */ +#define WM8994_AIF1ADC1L_HPF_WIDTH                   1  /* AIF1ADC1L_HPF */ +#define WM8994_AIF1ADC1R_HPF                    0x0800  /* AIF1ADC1R_HPF */ +#define WM8994_AIF1ADC1R_HPF_MASK               0x0800  /* AIF1ADC1R_HPF */ +#define WM8994_AIF1ADC1R_HPF_SHIFT                  11  /* AIF1ADC1R_HPF */ +#define WM8994_AIF1ADC1R_HPF_WIDTH                   1  /* AIF1ADC1R_HPF */ + +/* + * R1041 (0x411) - AIF1 ADC2 Filters + */ +#define WM8994_AIF1ADC2_HPF_CUT_MASK            0x6000  /* AIF1ADC2_HPF_CUT - [14:13] */ +#define WM8994_AIF1ADC2_HPF_CUT_SHIFT               13  /* AIF1ADC2_HPF_CUT - [14:13] */ +#define WM8994_AIF1ADC2_HPF_CUT_WIDTH                2  /* AIF1ADC2_HPF_CUT - [14:13] */ +#define WM8994_AIF1ADC2L_HPF                    0x1000  /* AIF1ADC2L_HPF */ +#define WM8994_AIF1ADC2L_HPF_MASK               0x1000  /* AIF1ADC2L_HPF */ +#define WM8994_AIF1ADC2L_HPF_SHIFT                  12  /* AIF1ADC2L_HPF */ +#define WM8994_AIF1ADC2L_HPF_WIDTH                   1  /* AIF1ADC2L_HPF */ +#define WM8994_AIF1ADC2R_HPF                    0x0800  /* AIF1ADC2R_HPF */ +#define WM8994_AIF1ADC2R_HPF_MASK               0x0800  /* AIF1ADC2R_HPF */ +#define WM8994_AIF1ADC2R_HPF_SHIFT                  11  /* AIF1ADC2R_HPF */ +#define WM8994_AIF1ADC2R_HPF_WIDTH                   1  /* AIF1ADC2R_HPF */ + +/* + * R1056 (0x420) - AIF1 DAC1 Filters (1) + */ +#define WM8994_AIF1DAC1_MUTE                    0x0200  /* AIF1DAC1_MUTE */ +#define WM8994_AIF1DAC1_MUTE_MASK               0x0200  /* AIF1DAC1_MUTE */ +#define WM8994_AIF1DAC1_MUTE_SHIFT                   9  /* AIF1DAC1_MUTE */ +#define WM8994_AIF1DAC1_MUTE_WIDTH                   1  /* AIF1DAC1_MUTE */ +#define WM8994_AIF1DAC1_MONO                    0x0080  /* AIF1DAC1_MONO */ +#define WM8994_AIF1DAC1_MONO_MASK               0x0080  /* AIF1DAC1_MONO */ +#define WM8994_AIF1DAC1_MONO_SHIFT                   7  /* AIF1DAC1_MONO */ +#define WM8994_AIF1DAC1_MONO_WIDTH                   1  /* AIF1DAC1_MONO */ +#define WM8994_AIF1DAC1_MUTERATE                0x0020  /* AIF1DAC1_MUTERATE */ +#define WM8994_AIF1DAC1_MUTERATE_MASK           0x0020  /* AIF1DAC1_MUTERATE */ +#define WM8994_AIF1DAC1_MUTERATE_SHIFT               5  /* AIF1DAC1_MUTERATE */ +#define WM8994_AIF1DAC1_MUTERATE_WIDTH               1  /* AIF1DAC1_MUTERATE */ +#define WM8994_AIF1DAC1_UNMUTE_RAMP             0x0010  /* AIF1DAC1_UNMUTE_RAMP */ +#define WM8994_AIF1DAC1_UNMUTE_RAMP_MASK        0x0010  /* AIF1DAC1_UNMUTE_RAMP */ +#define WM8994_AIF1DAC1_UNMUTE_RAMP_SHIFT            4  /* AIF1DAC1_UNMUTE_RAMP */ +#define WM8994_AIF1DAC1_UNMUTE_RAMP_WIDTH            1  /* AIF1DAC1_UNMUTE_RAMP */ +#define WM8994_AIF1DAC1_DEEMP_MASK              0x0006  /* AIF1DAC1_DEEMP - [2:1] */ +#define WM8994_AIF1DAC1_DEEMP_SHIFT                  1  /* AIF1DAC1_DEEMP - [2:1] */ +#define WM8994_AIF1DAC1_DEEMP_WIDTH                  2  /* AIF1DAC1_DEEMP - [2:1] */ + +/* + * R1057 (0x421) - AIF1 DAC1 Filters (2) + */ +#define WM8994_AIF1DAC1_3D_GAIN_MASK            0x3E00  /* AIF1DAC1_3D_GAIN - [13:9] */ +#define WM8994_AIF1DAC1_3D_GAIN_SHIFT                9  /* AIF1DAC1_3D_GAIN - [13:9] */ +#define WM8994_AIF1DAC1_3D_GAIN_WIDTH                5  /* AIF1DAC1_3D_GAIN - [13:9] */ +#define WM8994_AIF1DAC1_3D_ENA                  0x0100  /* AIF1DAC1_3D_ENA */ +#define WM8994_AIF1DAC1_3D_ENA_MASK             0x0100  /* AIF1DAC1_3D_ENA */ +#define WM8994_AIF1DAC1_3D_ENA_SHIFT                 8  /* AIF1DAC1_3D_ENA */ +#define WM8994_AIF1DAC1_3D_ENA_WIDTH                 1  /* AIF1DAC1_3D_ENA */ + +/* + * R1058 (0x422) - AIF1 DAC2 Filters (1) + */ +#define WM8994_AIF1DAC2_MUTE                    0x0200  /* AIF1DAC2_MUTE */ +#define WM8994_AIF1DAC2_MUTE_MASK               0x0200  /* AIF1DAC2_MUTE */ +#define WM8994_AIF1DAC2_MUTE_SHIFT                   9  /* AIF1DAC2_MUTE */ +#define WM8994_AIF1DAC2_MUTE_WIDTH                   1  /* AIF1DAC2_MUTE */ +#define WM8994_AIF1DAC2_MONO                    0x0080  /* AIF1DAC2_MONO */ +#define WM8994_AIF1DAC2_MONO_MASK               0x0080  /* AIF1DAC2_MONO */ +#define WM8994_AIF1DAC2_MONO_SHIFT                   7  /* AIF1DAC2_MONO */ +#define WM8994_AIF1DAC2_MONO_WIDTH                   1  /* AIF1DAC2_MONO */ +#define WM8994_AIF1DAC2_MUTERATE                0x0020  /* AIF1DAC2_MUTERATE */ +#define WM8994_AIF1DAC2_MUTERATE_MASK           0x0020  /* AIF1DAC2_MUTERATE */ +#define WM8994_AIF1DAC2_MUTERATE_SHIFT               5  /* AIF1DAC2_MUTERATE */ +#define WM8994_AIF1DAC2_MUTERATE_WIDTH               1  /* AIF1DAC2_MUTERATE */ +#define WM8994_AIF1DAC2_UNMUTE_RAMP             0x0010  /* AIF1DAC2_UNMUTE_RAMP */ +#define WM8994_AIF1DAC2_UNMUTE_RAMP_MASK        0x0010  /* AIF1DAC2_UNMUTE_RAMP */ +#define WM8994_AIF1DAC2_UNMUTE_RAMP_SHIFT            4  /* AIF1DAC2_UNMUTE_RAMP */ +#define WM8994_AIF1DAC2_UNMUTE_RAMP_WIDTH            1  /* AIF1DAC2_UNMUTE_RAMP */ +#define WM8994_AIF1DAC2_DEEMP_MASK              0x0006  /* AIF1DAC2_DEEMP - [2:1] */ +#define WM8994_AIF1DAC2_DEEMP_SHIFT                  1  /* AIF1DAC2_DEEMP - [2:1] */ +#define WM8994_AIF1DAC2_DEEMP_WIDTH                  2  /* AIF1DAC2_DEEMP - [2:1] */ + +/* + * R1059 (0x423) - AIF1 DAC2 Filters (2) + */ +#define WM8994_AIF1DAC2_3D_GAIN_MASK            0x3E00  /* AIF1DAC2_3D_GAIN - [13:9] */ +#define WM8994_AIF1DAC2_3D_GAIN_SHIFT                9  /* AIF1DAC2_3D_GAIN - [13:9] */ +#define WM8994_AIF1DAC2_3D_GAIN_WIDTH                5  /* AIF1DAC2_3D_GAIN - [13:9] */ +#define WM8994_AIF1DAC2_3D_ENA                  0x0100  /* AIF1DAC2_3D_ENA */ +#define WM8994_AIF1DAC2_3D_ENA_MASK             0x0100  /* AIF1DAC2_3D_ENA */ +#define WM8994_AIF1DAC2_3D_ENA_SHIFT                 8  /* AIF1DAC2_3D_ENA */ +#define WM8994_AIF1DAC2_3D_ENA_WIDTH                 1  /* AIF1DAC2_3D_ENA */ + +/* + * R1088 (0x440) - AIF1 DRC1 (1) + */ +#define WM8994_AIF1DRC1_SIG_DET_RMS_MASK        0xF800  /* AIF1DRC1_SIG_DET_RMS - [15:11] */ +#define WM8994_AIF1DRC1_SIG_DET_RMS_SHIFT           11  /* AIF1DRC1_SIG_DET_RMS - [15:11] */ +#define WM8994_AIF1DRC1_SIG_DET_RMS_WIDTH            5  /* AIF1DRC1_SIG_DET_RMS - [15:11] */ +#define WM8994_AIF1DRC1_SIG_DET_PK_MASK         0x0600  /* AIF1DRC1_SIG_DET_PK - [10:9] */ +#define WM8994_AIF1DRC1_SIG_DET_PK_SHIFT             9  /* AIF1DRC1_SIG_DET_PK - [10:9] */ +#define WM8994_AIF1DRC1_SIG_DET_PK_WIDTH             2  /* AIF1DRC1_SIG_DET_PK - [10:9] */ +#define WM8994_AIF1DRC1_NG_ENA                  0x0100  /* AIF1DRC1_NG_ENA */ +#define WM8994_AIF1DRC1_NG_ENA_MASK             0x0100  /* AIF1DRC1_NG_ENA */ +#define WM8994_AIF1DRC1_NG_ENA_SHIFT                 8  /* AIF1DRC1_NG_ENA */ +#define WM8994_AIF1DRC1_NG_ENA_WIDTH                 1  /* AIF1DRC1_NG_ENA */ +#define WM8994_AIF1DRC1_SIG_DET_MODE            0x0080  /* AIF1DRC1_SIG_DET_MODE */ +#define WM8994_AIF1DRC1_SIG_DET_MODE_MASK       0x0080  /* AIF1DRC1_SIG_DET_MODE */ +#define WM8994_AIF1DRC1_SIG_DET_MODE_SHIFT           7  /* AIF1DRC1_SIG_DET_MODE */ +#define WM8994_AIF1DRC1_SIG_DET_MODE_WIDTH           1  /* AIF1DRC1_SIG_DET_MODE */ +#define WM8994_AIF1DRC1_SIG_DET                 0x0040  /* AIF1DRC1_SIG_DET */ +#define WM8994_AIF1DRC1_SIG_DET_MASK            0x0040  /* AIF1DRC1_SIG_DET */ +#define WM8994_AIF1DRC1_SIG_DET_SHIFT                6  /* AIF1DRC1_SIG_DET */ +#define WM8994_AIF1DRC1_SIG_DET_WIDTH                1  /* AIF1DRC1_SIG_DET */ +#define WM8994_AIF1DRC1_KNEE2_OP_ENA            0x0020  /* AIF1DRC1_KNEE2_OP_ENA */ +#define WM8994_AIF1DRC1_KNEE2_OP_ENA_MASK       0x0020  /* AIF1DRC1_KNEE2_OP_ENA */ +#define WM8994_AIF1DRC1_KNEE2_OP_ENA_SHIFT           5  /* AIF1DRC1_KNEE2_OP_ENA */ +#define WM8994_AIF1DRC1_KNEE2_OP_ENA_WIDTH           1  /* AIF1DRC1_KNEE2_OP_ENA */ +#define WM8994_AIF1DRC1_QR                      0x0010  /* AIF1DRC1_QR */ +#define WM8994_AIF1DRC1_QR_MASK                 0x0010  /* AIF1DRC1_QR */ +#define WM8994_AIF1DRC1_QR_SHIFT                     4  /* AIF1DRC1_QR */ +#define WM8994_AIF1DRC1_QR_WIDTH                     1  /* AIF1DRC1_QR */ +#define WM8994_AIF1DRC1_ANTICLIP                0x0008  /* AIF1DRC1_ANTICLIP */ +#define WM8994_AIF1DRC1_ANTICLIP_MASK           0x0008  /* AIF1DRC1_ANTICLIP */ +#define WM8994_AIF1DRC1_ANTICLIP_SHIFT               3  /* AIF1DRC1_ANTICLIP */ +#define WM8994_AIF1DRC1_ANTICLIP_WIDTH               1  /* AIF1DRC1_ANTICLIP */ +#define WM8994_AIF1DAC1_DRC_ENA                 0x0004  /* AIF1DAC1_DRC_ENA */ +#define WM8994_AIF1DAC1_DRC_ENA_MASK            0x0004  /* AIF1DAC1_DRC_ENA */ +#define WM8994_AIF1DAC1_DRC_ENA_SHIFT                2  /* AIF1DAC1_DRC_ENA */ +#define WM8994_AIF1DAC1_DRC_ENA_WIDTH                1  /* AIF1DAC1_DRC_ENA */ +#define WM8994_AIF1ADC1L_DRC_ENA                0x0002  /* AIF1ADC1L_DRC_ENA */ +#define WM8994_AIF1ADC1L_DRC_ENA_MASK           0x0002  /* AIF1ADC1L_DRC_ENA */ +#define WM8994_AIF1ADC1L_DRC_ENA_SHIFT               1  /* AIF1ADC1L_DRC_ENA */ +#define WM8994_AIF1ADC1L_DRC_ENA_WIDTH               1  /* AIF1ADC1L_DRC_ENA */ +#define WM8994_AIF1ADC1R_DRC_ENA                0x0001  /* AIF1ADC1R_DRC_ENA */ +#define WM8994_AIF1ADC1R_DRC_ENA_MASK           0x0001  /* AIF1ADC1R_DRC_ENA */ +#define WM8994_AIF1ADC1R_DRC_ENA_SHIFT               0  /* AIF1ADC1R_DRC_ENA */ +#define WM8994_AIF1ADC1R_DRC_ENA_WIDTH               1  /* AIF1ADC1R_DRC_ENA */ + +/* + * R1089 (0x441) - AIF1 DRC1 (2) + */ +#define WM8994_AIF1DRC1_ATK_MASK                0x1E00  /* AIF1DRC1_ATK - [12:9] */ +#define WM8994_AIF1DRC1_ATK_SHIFT                    9  /* AIF1DRC1_ATK - [12:9] */ +#define WM8994_AIF1DRC1_ATK_WIDTH                    4  /* AIF1DRC1_ATK - [12:9] */ +#define WM8994_AIF1DRC1_DCY_MASK                0x01E0  /* AIF1DRC1_DCY - [8:5] */ +#define WM8994_AIF1DRC1_DCY_SHIFT                    5  /* AIF1DRC1_DCY - [8:5] */ +#define WM8994_AIF1DRC1_DCY_WIDTH                    4  /* AIF1DRC1_DCY - [8:5] */ +#define WM8994_AIF1DRC1_MINGAIN_MASK            0x001C  /* AIF1DRC1_MINGAIN - [4:2] */ +#define WM8994_AIF1DRC1_MINGAIN_SHIFT                2  /* AIF1DRC1_MINGAIN - [4:2] */ +#define WM8994_AIF1DRC1_MINGAIN_WIDTH                3  /* AIF1DRC1_MINGAIN - [4:2] */ +#define WM8994_AIF1DRC1_MAXGAIN_MASK            0x0003  /* AIF1DRC1_MAXGAIN - [1:0] */ +#define WM8994_AIF1DRC1_MAXGAIN_SHIFT                0  /* AIF1DRC1_MAXGAIN - [1:0] */ +#define WM8994_AIF1DRC1_MAXGAIN_WIDTH                2  /* AIF1DRC1_MAXGAIN - [1:0] */ + +/* + * R1090 (0x442) - AIF1 DRC1 (3) + */ +#define WM8994_AIF1DRC1_NG_MINGAIN_MASK         0xF000  /* AIF1DRC1_NG_MINGAIN - [15:12] */ +#define WM8994_AIF1DRC1_NG_MINGAIN_SHIFT            12  /* AIF1DRC1_NG_MINGAIN - [15:12] */ +#define WM8994_AIF1DRC1_NG_MINGAIN_WIDTH             4  /* AIF1DRC1_NG_MINGAIN - [15:12] */ +#define WM8994_AIF1DRC1_NG_EXP_MASK             0x0C00  /* AIF1DRC1_NG_EXP - [11:10] */ +#define WM8994_AIF1DRC1_NG_EXP_SHIFT                10  /* AIF1DRC1_NG_EXP - [11:10] */ +#define WM8994_AIF1DRC1_NG_EXP_WIDTH                 2  /* AIF1DRC1_NG_EXP - [11:10] */ +#define WM8994_AIF1DRC1_QR_THR_MASK             0x0300  /* AIF1DRC1_QR_THR - [9:8] */ +#define WM8994_AIF1DRC1_QR_THR_SHIFT                 8  /* AIF1DRC1_QR_THR - [9:8] */ +#define WM8994_AIF1DRC1_QR_THR_WIDTH                 2  /* AIF1DRC1_QR_THR - [9:8] */ +#define WM8994_AIF1DRC1_QR_DCY_MASK             0x00C0  /* AIF1DRC1_QR_DCY - [7:6] */ +#define WM8994_AIF1DRC1_QR_DCY_SHIFT                 6  /* AIF1DRC1_QR_DCY - [7:6] */ +#define WM8994_AIF1DRC1_QR_DCY_WIDTH                 2  /* AIF1DRC1_QR_DCY - [7:6] */ +#define WM8994_AIF1DRC1_HI_COMP_MASK            0x0038  /* AIF1DRC1_HI_COMP - [5:3] */ +#define WM8994_AIF1DRC1_HI_COMP_SHIFT                3  /* AIF1DRC1_HI_COMP - [5:3] */ +#define WM8994_AIF1DRC1_HI_COMP_WIDTH                3  /* AIF1DRC1_HI_COMP - [5:3] */ +#define WM8994_AIF1DRC1_LO_COMP_MASK            0x0007  /* AIF1DRC1_LO_COMP - [2:0] */ +#define WM8994_AIF1DRC1_LO_COMP_SHIFT                0  /* AIF1DRC1_LO_COMP - [2:0] */ +#define WM8994_AIF1DRC1_LO_COMP_WIDTH                3  /* AIF1DRC1_LO_COMP - [2:0] */ + +/* + * R1091 (0x443) - AIF1 DRC1 (4) + */ +#define WM8994_AIF1DRC1_KNEE_IP_MASK            0x07E0  /* AIF1DRC1_KNEE_IP - [10:5] */ +#define WM8994_AIF1DRC1_KNEE_IP_SHIFT                5  /* AIF1DRC1_KNEE_IP - [10:5] */ +#define WM8994_AIF1DRC1_KNEE_IP_WIDTH                6  /* AIF1DRC1_KNEE_IP - [10:5] */ +#define WM8994_AIF1DRC1_KNEE_OP_MASK            0x001F  /* AIF1DRC1_KNEE_OP - [4:0] */ +#define WM8994_AIF1DRC1_KNEE_OP_SHIFT                0  /* AIF1DRC1_KNEE_OP - [4:0] */ +#define WM8994_AIF1DRC1_KNEE_OP_WIDTH                5  /* AIF1DRC1_KNEE_OP - [4:0] */ + +/* + * R1092 (0x444) - AIF1 DRC1 (5) + */ +#define WM8994_AIF1DRC1_KNEE2_IP_MASK           0x03E0  /* AIF1DRC1_KNEE2_IP - [9:5] */ +#define WM8994_AIF1DRC1_KNEE2_IP_SHIFT               5  /* AIF1DRC1_KNEE2_IP - [9:5] */ +#define WM8994_AIF1DRC1_KNEE2_IP_WIDTH               5  /* AIF1DRC1_KNEE2_IP - [9:5] */ +#define WM8994_AIF1DRC1_KNEE2_OP_MASK           0x001F  /* AIF1DRC1_KNEE2_OP - [4:0] */ +#define WM8994_AIF1DRC1_KNEE2_OP_SHIFT               0  /* AIF1DRC1_KNEE2_OP - [4:0] */ +#define WM8994_AIF1DRC1_KNEE2_OP_WIDTH               5  /* AIF1DRC1_KNEE2_OP - [4:0] */ + +/* + * R1104 (0x450) - AIF1 DRC2 (1) + */ +#define WM8994_AIF1DRC2_SIG_DET_RMS_MASK        0xF800  /* AIF1DRC2_SIG_DET_RMS - [15:11] */ +#define WM8994_AIF1DRC2_SIG_DET_RMS_SHIFT           11  /* AIF1DRC2_SIG_DET_RMS - [15:11] */ +#define WM8994_AIF1DRC2_SIG_DET_RMS_WIDTH            5  /* AIF1DRC2_SIG_DET_RMS - [15:11] */ +#define WM8994_AIF1DRC2_SIG_DET_PK_MASK         0x0600  /* AIF1DRC2_SIG_DET_PK - [10:9] */ +#define WM8994_AIF1DRC2_SIG_DET_PK_SHIFT             9  /* AIF1DRC2_SIG_DET_PK - [10:9] */ +#define WM8994_AIF1DRC2_SIG_DET_PK_WIDTH             2  /* AIF1DRC2_SIG_DET_PK - [10:9] */ +#define WM8994_AIF1DRC2_NG_ENA                  0x0100  /* AIF1DRC2_NG_ENA */ +#define WM8994_AIF1DRC2_NG_ENA_MASK             0x0100  /* AIF1DRC2_NG_ENA */ +#define WM8994_AIF1DRC2_NG_ENA_SHIFT                 8  /* AIF1DRC2_NG_ENA */ +#define WM8994_AIF1DRC2_NG_ENA_WIDTH                 1  /* AIF1DRC2_NG_ENA */ +#define WM8994_AIF1DRC2_SIG_DET_MODE            0x0080  /* AIF1DRC2_SIG_DET_MODE */ +#define WM8994_AIF1DRC2_SIG_DET_MODE_MASK       0x0080  /* AIF1DRC2_SIG_DET_MODE */ +#define WM8994_AIF1DRC2_SIG_DET_MODE_SHIFT           7  /* AIF1DRC2_SIG_DET_MODE */ +#define WM8994_AIF1DRC2_SIG_DET_MODE_WIDTH           1  /* AIF1DRC2_SIG_DET_MODE */ +#define WM8994_AIF1DRC2_SIG_DET                 0x0040  /* AIF1DRC2_SIG_DET */ +#define WM8994_AIF1DRC2_SIG_DET_MASK            0x0040  /* AIF1DRC2_SIG_DET */ +#define WM8994_AIF1DRC2_SIG_DET_SHIFT                6  /* AIF1DRC2_SIG_DET */ +#define WM8994_AIF1DRC2_SIG_DET_WIDTH                1  /* AIF1DRC2_SIG_DET */ +#define WM8994_AIF1DRC2_KNEE2_OP_ENA            0x0020  /* AIF1DRC2_KNEE2_OP_ENA */ +#define WM8994_AIF1DRC2_KNEE2_OP_ENA_MASK       0x0020  /* AIF1DRC2_KNEE2_OP_ENA */ +#define WM8994_AIF1DRC2_KNEE2_OP_ENA_SHIFT           5  /* AIF1DRC2_KNEE2_OP_ENA */ +#define WM8994_AIF1DRC2_KNEE2_OP_ENA_WIDTH           1  /* AIF1DRC2_KNEE2_OP_ENA */ +#define WM8994_AIF1DRC2_QR                      0x0010  /* AIF1DRC2_QR */ +#define WM8994_AIF1DRC2_QR_MASK                 0x0010  /* AIF1DRC2_QR */ +#define WM8994_AIF1DRC2_QR_SHIFT                     4  /* AIF1DRC2_QR */ +#define WM8994_AIF1DRC2_QR_WIDTH                     1  /* AIF1DRC2_QR */ +#define WM8994_AIF1DRC2_ANTICLIP                0x0008  /* AIF1DRC2_ANTICLIP */ +#define WM8994_AIF1DRC2_ANTICLIP_MASK           0x0008  /* AIF1DRC2_ANTICLIP */ +#define WM8994_AIF1DRC2_ANTICLIP_SHIFT               3  /* AIF1DRC2_ANTICLIP */ +#define WM8994_AIF1DRC2_ANTICLIP_WIDTH               1  /* AIF1DRC2_ANTICLIP */ +#define WM8994_AIF1DAC2_DRC_ENA                 0x0004  /* AIF1DAC2_DRC_ENA */ +#define WM8994_AIF1DAC2_DRC_ENA_MASK            0x0004  /* AIF1DAC2_DRC_ENA */ +#define WM8994_AIF1DAC2_DRC_ENA_SHIFT                2  /* AIF1DAC2_DRC_ENA */ +#define WM8994_AIF1DAC2_DRC_ENA_WIDTH                1  /* AIF1DAC2_DRC_ENA */ +#define WM8994_AIF1ADC2L_DRC_ENA                0x0002  /* AIF1ADC2L_DRC_ENA */ +#define WM8994_AIF1ADC2L_DRC_ENA_MASK           0x0002  /* AIF1ADC2L_DRC_ENA */ +#define WM8994_AIF1ADC2L_DRC_ENA_SHIFT               1  /* AIF1ADC2L_DRC_ENA */ +#define WM8994_AIF1ADC2L_DRC_ENA_WIDTH               1  /* AIF1ADC2L_DRC_ENA */ +#define WM8994_AIF1ADC2R_DRC_ENA                0x0001  /* AIF1ADC2R_DRC_ENA */ +#define WM8994_AIF1ADC2R_DRC_ENA_MASK           0x0001  /* AIF1ADC2R_DRC_ENA */ +#define WM8994_AIF1ADC2R_DRC_ENA_SHIFT               0  /* AIF1ADC2R_DRC_ENA */ +#define WM8994_AIF1ADC2R_DRC_ENA_WIDTH               1  /* AIF1ADC2R_DRC_ENA */ + +/* + * R1105 (0x451) - AIF1 DRC2 (2) + */ +#define WM8994_AIF1DRC2_ATK_MASK                0x1E00  /* AIF1DRC2_ATK - [12:9] */ +#define WM8994_AIF1DRC2_ATK_SHIFT                    9  /* AIF1DRC2_ATK - [12:9] */ +#define WM8994_AIF1DRC2_ATK_WIDTH                    4  /* AIF1DRC2_ATK - [12:9] */ +#define WM8994_AIF1DRC2_DCY_MASK                0x01E0  /* AIF1DRC2_DCY - [8:5] */ +#define WM8994_AIF1DRC2_DCY_SHIFT                    5  /* AIF1DRC2_DCY - [8:5] */ +#define WM8994_AIF1DRC2_DCY_WIDTH                    4  /* AIF1DRC2_DCY - [8:5] */ +#define WM8994_AIF1DRC2_MINGAIN_MASK            0x001C  /* AIF1DRC2_MINGAIN - [4:2] */ +#define WM8994_AIF1DRC2_MINGAIN_SHIFT                2  /* AIF1DRC2_MINGAIN - [4:2] */ +#define WM8994_AIF1DRC2_MINGAIN_WIDTH                3  /* AIF1DRC2_MINGAIN - [4:2] */ +#define WM8994_AIF1DRC2_MAXGAIN_MASK            0x0003  /* AIF1DRC2_MAXGAIN - [1:0] */ +#define WM8994_AIF1DRC2_MAXGAIN_SHIFT                0  /* AIF1DRC2_MAXGAIN - [1:0] */ +#define WM8994_AIF1DRC2_MAXGAIN_WIDTH                2  /* AIF1DRC2_MAXGAIN - [1:0] */ + +/* + * R1106 (0x452) - AIF1 DRC2 (3) + */ +#define WM8994_AIF1DRC2_NG_MINGAIN_MASK         0xF000  /* AIF1DRC2_NG_MINGAIN - [15:12] */ +#define WM8994_AIF1DRC2_NG_MINGAIN_SHIFT            12  /* AIF1DRC2_NG_MINGAIN - [15:12] */ +#define WM8994_AIF1DRC2_NG_MINGAIN_WIDTH             4  /* AIF1DRC2_NG_MINGAIN - [15:12] */ +#define WM8994_AIF1DRC2_NG_EXP_MASK             0x0C00  /* AIF1DRC2_NG_EXP - [11:10] */ +#define WM8994_AIF1DRC2_NG_EXP_SHIFT                10  /* AIF1DRC2_NG_EXP - [11:10] */ +#define WM8994_AIF1DRC2_NG_EXP_WIDTH                 2  /* AIF1DRC2_NG_EXP - [11:10] */ +#define WM8994_AIF1DRC2_QR_THR_MASK             0x0300  /* AIF1DRC2_QR_THR - [9:8] */ +#define WM8994_AIF1DRC2_QR_THR_SHIFT                 8  /* AIF1DRC2_QR_THR - [9:8] */ +#define WM8994_AIF1DRC2_QR_THR_WIDTH                 2  /* AIF1DRC2_QR_THR - [9:8] */ +#define WM8994_AIF1DRC2_QR_DCY_MASK             0x00C0  /* AIF1DRC2_QR_DCY - [7:6] */ +#define WM8994_AIF1DRC2_QR_DCY_SHIFT                 6  /* AIF1DRC2_QR_DCY - [7:6] */ +#define WM8994_AIF1DRC2_QR_DCY_WIDTH                 2  /* AIF1DRC2_QR_DCY - [7:6] */ +#define WM8994_AIF1DRC2_HI_COMP_MASK            0x0038  /* AIF1DRC2_HI_COMP - [5:3] */ +#define WM8994_AIF1DRC2_HI_COMP_SHIFT                3  /* AIF1DRC2_HI_COMP - [5:3] */ +#define WM8994_AIF1DRC2_HI_COMP_WIDTH                3  /* AIF1DRC2_HI_COMP - [5:3] */ +#define WM8994_AIF1DRC2_LO_COMP_MASK            0x0007  /* AIF1DRC2_LO_COMP - [2:0] */ +#define WM8994_AIF1DRC2_LO_COMP_SHIFT                0  /* AIF1DRC2_LO_COMP - [2:0] */ +#define WM8994_AIF1DRC2_LO_COMP_WIDTH                3  /* AIF1DRC2_LO_COMP - [2:0] */ + +/* + * R1107 (0x453) - AIF1 DRC2 (4) + */ +#define WM8994_AIF1DRC2_KNEE_IP_MASK            0x07E0  /* AIF1DRC2_KNEE_IP - [10:5] */ +#define WM8994_AIF1DRC2_KNEE_IP_SHIFT                5  /* AIF1DRC2_KNEE_IP - [10:5] */ +#define WM8994_AIF1DRC2_KNEE_IP_WIDTH                6  /* AIF1DRC2_KNEE_IP - [10:5] */ +#define WM8994_AIF1DRC2_KNEE_OP_MASK            0x001F  /* AIF1DRC2_KNEE_OP - [4:0] */ +#define WM8994_AIF1DRC2_KNEE_OP_SHIFT                0  /* AIF1DRC2_KNEE_OP - [4:0] */ +#define WM8994_AIF1DRC2_KNEE_OP_WIDTH                5  /* AIF1DRC2_KNEE_OP - [4:0] */ + +/* + * R1108 (0x454) - AIF1 DRC2 (5) + */ +#define WM8994_AIF1DRC2_KNEE2_IP_MASK           0x03E0  /* AIF1DRC2_KNEE2_IP - [9:5] */ +#define WM8994_AIF1DRC2_KNEE2_IP_SHIFT               5  /* AIF1DRC2_KNEE2_IP - [9:5] */ +#define WM8994_AIF1DRC2_KNEE2_IP_WIDTH               5  /* AIF1DRC2_KNEE2_IP - [9:5] */ +#define WM8994_AIF1DRC2_KNEE2_OP_MASK           0x001F  /* AIF1DRC2_KNEE2_OP - [4:0] */ +#define WM8994_AIF1DRC2_KNEE2_OP_SHIFT               0  /* AIF1DRC2_KNEE2_OP - [4:0] */ +#define WM8994_AIF1DRC2_KNEE2_OP_WIDTH               5  /* AIF1DRC2_KNEE2_OP - [4:0] */ + +/* + * R1152 (0x480) - AIF1 DAC1 EQ Gains (1) + */ +#define WM8994_AIF1DAC1_EQ_B1_GAIN_MASK         0xF800  /* AIF1DAC1_EQ_B1_GAIN - [15:11] */ +#define WM8994_AIF1DAC1_EQ_B1_GAIN_SHIFT            11  /* AIF1DAC1_EQ_B1_GAIN - [15:11] */ +#define WM8994_AIF1DAC1_EQ_B1_GAIN_WIDTH             5  /* AIF1DAC1_EQ_B1_GAIN - [15:11] */ +#define WM8994_AIF1DAC1_EQ_B2_GAIN_MASK         0x07C0  /* AIF1DAC1_EQ_B2_GAIN - [10:6] */ +#define WM8994_AIF1DAC1_EQ_B2_GAIN_SHIFT             6  /* AIF1DAC1_EQ_B2_GAIN - [10:6] */ +#define WM8994_AIF1DAC1_EQ_B2_GAIN_WIDTH             5  /* AIF1DAC1_EQ_B2_GAIN - [10:6] */ +#define WM8994_AIF1DAC1_EQ_B3_GAIN_MASK         0x003E  /* AIF1DAC1_EQ_B3_GAIN - [5:1] */ +#define WM8994_AIF1DAC1_EQ_B3_GAIN_SHIFT             1  /* AIF1DAC1_EQ_B3_GAIN - [5:1] */ +#define WM8994_AIF1DAC1_EQ_B3_GAIN_WIDTH             5  /* AIF1DAC1_EQ_B3_GAIN - [5:1] */ +#define WM8994_AIF1DAC1_EQ_ENA                  0x0001  /* AIF1DAC1_EQ_ENA */ +#define WM8994_AIF1DAC1_EQ_ENA_MASK             0x0001  /* AIF1DAC1_EQ_ENA */ +#define WM8994_AIF1DAC1_EQ_ENA_SHIFT                 0  /* AIF1DAC1_EQ_ENA */ +#define WM8994_AIF1DAC1_EQ_ENA_WIDTH                 1  /* AIF1DAC1_EQ_ENA */ + +/* + * R1153 (0x481) - AIF1 DAC1 EQ Gains (2) + */ +#define WM8994_AIF1DAC1_EQ_B4_GAIN_MASK         0xF800  /* AIF1DAC1_EQ_B4_GAIN - [15:11] */ +#define WM8994_AIF1DAC1_EQ_B4_GAIN_SHIFT            11  /* AIF1DAC1_EQ_B4_GAIN - [15:11] */ +#define WM8994_AIF1DAC1_EQ_B4_GAIN_WIDTH             5  /* AIF1DAC1_EQ_B4_GAIN - [15:11] */ +#define WM8994_AIF1DAC1_EQ_B5_GAIN_MASK         0x07C0  /* AIF1DAC1_EQ_B5_GAIN - [10:6] */ +#define WM8994_AIF1DAC1_EQ_B5_GAIN_SHIFT             6  /* AIF1DAC1_EQ_B5_GAIN - [10:6] */ +#define WM8994_AIF1DAC1_EQ_B5_GAIN_WIDTH             5  /* AIF1DAC1_EQ_B5_GAIN - [10:6] */ + +/* + * R1154 (0x482) - AIF1 DAC1 EQ Band 1 A + */ +#define WM8994_AIF1DAC1_EQ_B1_A_MASK            0xFFFF  /* AIF1DAC1_EQ_B1_A - [15:0] */ +#define WM8994_AIF1DAC1_EQ_B1_A_SHIFT                0  /* AIF1DAC1_EQ_B1_A - [15:0] */ +#define WM8994_AIF1DAC1_EQ_B1_A_WIDTH               16  /* AIF1DAC1_EQ_B1_A - [15:0] */ + +/* + * R1155 (0x483) - AIF1 DAC1 EQ Band 1 B + */ +#define WM8994_AIF1DAC1_EQ_B1_B_MASK            0xFFFF  /* AIF1DAC1_EQ_B1_B - [15:0] */ +#define WM8994_AIF1DAC1_EQ_B1_B_SHIFT                0  /* AIF1DAC1_EQ_B1_B - [15:0] */ +#define WM8994_AIF1DAC1_EQ_B1_B_WIDTH               16  /* AIF1DAC1_EQ_B1_B - [15:0] */ + +/* + * R1156 (0x484) - AIF1 DAC1 EQ Band 1 PG + */ +#define WM8994_AIF1DAC1_EQ_B1_PG_MASK           0xFFFF  /* AIF1DAC1_EQ_B1_PG - [15:0] */ +#define WM8994_AIF1DAC1_EQ_B1_PG_SHIFT               0  /* AIF1DAC1_EQ_B1_PG - [15:0] */ +#define WM8994_AIF1DAC1_EQ_B1_PG_WIDTH              16  /* AIF1DAC1_EQ_B1_PG - [15:0] */ + +/* + * R1157 (0x485) - AIF1 DAC1 EQ Band 2 A + */ +#define WM8994_AIF1DAC1_EQ_B2_A_MASK            0xFFFF  /* AIF1DAC1_EQ_B2_A - [15:0] */ +#define WM8994_AIF1DAC1_EQ_B2_A_SHIFT                0  /* AIF1DAC1_EQ_B2_A - [15:0] */ +#define WM8994_AIF1DAC1_EQ_B2_A_WIDTH               16  /* AIF1DAC1_EQ_B2_A - [15:0] */ + +/* + * R1158 (0x486) - AIF1 DAC1 EQ Band 2 B + */ +#define WM8994_AIF1DAC1_EQ_B2_B_MASK            0xFFFF  /* AIF1DAC1_EQ_B2_B - [15:0] */ +#define WM8994_AIF1DAC1_EQ_B2_B_SHIFT                0  /* AIF1DAC1_EQ_B2_B - [15:0] */ +#define WM8994_AIF1DAC1_EQ_B2_B_WIDTH               16  /* AIF1DAC1_EQ_B2_B - [15:0] */ + +/* + * R1159 (0x487) - AIF1 DAC1 EQ Band 2 C + */ +#define WM8994_AIF1DAC1_EQ_B2_C_MASK            0xFFFF  /* AIF1DAC1_EQ_B2_C - [15:0] */ +#define WM8994_AIF1DAC1_EQ_B2_C_SHIFT                0  /* AIF1DAC1_EQ_B2_C - [15:0] */ +#define WM8994_AIF1DAC1_EQ_B2_C_WIDTH               16  /* AIF1DAC1_EQ_B2_C - [15:0] */ + +/* + * R1160 (0x488) - AIF1 DAC1 EQ Band 2 PG + */ +#define WM8994_AIF1DAC1_EQ_B2_PG_MASK           0xFFFF  /* AIF1DAC1_EQ_B2_PG - [15:0] */ +#define WM8994_AIF1DAC1_EQ_B2_PG_SHIFT               0  /* AIF1DAC1_EQ_B2_PG - [15:0] */ +#define WM8994_AIF1DAC1_EQ_B2_PG_WIDTH              16  /* AIF1DAC1_EQ_B2_PG - [15:0] */ + +/* + * R1161 (0x489) - AIF1 DAC1 EQ Band 3 A + */ +#define WM8994_AIF1DAC1_EQ_B3_A_MASK            0xFFFF  /* AIF1DAC1_EQ_B3_A - [15:0] */ +#define WM8994_AIF1DAC1_EQ_B3_A_SHIFT                0  /* AIF1DAC1_EQ_B3_A - [15:0] */ +#define WM8994_AIF1DAC1_EQ_B3_A_WIDTH               16  /* AIF1DAC1_EQ_B3_A - [15:0] */ + +/* + * R1162 (0x48A) - AIF1 DAC1 EQ Band 3 B + */ +#define WM8994_AIF1DAC1_EQ_B3_B_MASK            0xFFFF  /* AIF1DAC1_EQ_B3_B - [15:0] */ +#define WM8994_AIF1DAC1_EQ_B3_B_SHIFT                0  /* AIF1DAC1_EQ_B3_B - [15:0] */ +#define WM8994_AIF1DAC1_EQ_B3_B_WIDTH               16  /* AIF1DAC1_EQ_B3_B - [15:0] */ + +/* + * R1163 (0x48B) - AIF1 DAC1 EQ Band 3 C + */ +#define WM8994_AIF1DAC1_EQ_B3_C_MASK            0xFFFF  /* AIF1DAC1_EQ_B3_C - [15:0] */ +#define WM8994_AIF1DAC1_EQ_B3_C_SHIFT                0  /* AIF1DAC1_EQ_B3_C - [15:0] */ +#define WM8994_AIF1DAC1_EQ_B3_C_WIDTH               16  /* AIF1DAC1_EQ_B3_C - [15:0] */ + +/* + * R1164 (0x48C) - AIF1 DAC1 EQ Band 3 PG + */ +#define WM8994_AIF1DAC1_EQ_B3_PG_MASK           0xFFFF  /* AIF1DAC1_EQ_B3_PG - [15:0] */ +#define WM8994_AIF1DAC1_EQ_B3_PG_SHIFT               0  /* AIF1DAC1_EQ_B3_PG - [15:0] */ +#define WM8994_AIF1DAC1_EQ_B3_PG_WIDTH              16  /* AIF1DAC1_EQ_B3_PG - [15:0] */ + +/* + * R1165 (0x48D) - AIF1 DAC1 EQ Band 4 A + */ +#define WM8994_AIF1DAC1_EQ_B4_A_MASK            0xFFFF  /* AIF1DAC1_EQ_B4_A - [15:0] */ +#define WM8994_AIF1DAC1_EQ_B4_A_SHIFT                0  /* AIF1DAC1_EQ_B4_A - [15:0] */ +#define WM8994_AIF1DAC1_EQ_B4_A_WIDTH               16  /* AIF1DAC1_EQ_B4_A - [15:0] */ + +/* + * R1166 (0x48E) - AIF1 DAC1 EQ Band 4 B + */ +#define WM8994_AIF1DAC1_EQ_B4_B_MASK            0xFFFF  /* AIF1DAC1_EQ_B4_B - [15:0] */ +#define WM8994_AIF1DAC1_EQ_B4_B_SHIFT                0  /* AIF1DAC1_EQ_B4_B - [15:0] */ +#define WM8994_AIF1DAC1_EQ_B4_B_WIDTH               16  /* AIF1DAC1_EQ_B4_B - [15:0] */ + +/* + * R1167 (0x48F) - AIF1 DAC1 EQ Band 4 C + */ +#define WM8994_AIF1DAC1_EQ_B4_C_MASK            0xFFFF  /* AIF1DAC1_EQ_B4_C - [15:0] */ +#define WM8994_AIF1DAC1_EQ_B4_C_SHIFT                0  /* AIF1DAC1_EQ_B4_C - [15:0] */ +#define WM8994_AIF1DAC1_EQ_B4_C_WIDTH               16  /* AIF1DAC1_EQ_B4_C - [15:0] */ + +/* + * R1168 (0x490) - AIF1 DAC1 EQ Band 4 PG + */ +#define WM8994_AIF1DAC1_EQ_B4_PG_MASK           0xFFFF  /* AIF1DAC1_EQ_B4_PG - [15:0] */ +#define WM8994_AIF1DAC1_EQ_B4_PG_SHIFT               0  /* AIF1DAC1_EQ_B4_PG - [15:0] */ +#define WM8994_AIF1DAC1_EQ_B4_PG_WIDTH              16  /* AIF1DAC1_EQ_B4_PG - [15:0] */ + +/* + * R1169 (0x491) - AIF1 DAC1 EQ Band 5 A + */ +#define WM8994_AIF1DAC1_EQ_B5_A_MASK            0xFFFF  /* AIF1DAC1_EQ_B5_A - [15:0] */ +#define WM8994_AIF1DAC1_EQ_B5_A_SHIFT                0  /* AIF1DAC1_EQ_B5_A - [15:0] */ +#define WM8994_AIF1DAC1_EQ_B5_A_WIDTH               16  /* AIF1DAC1_EQ_B5_A - [15:0] */ + +/* + * R1170 (0x492) - AIF1 DAC1 EQ Band 5 B + */ +#define WM8994_AIF1DAC1_EQ_B5_B_MASK            0xFFFF  /* AIF1DAC1_EQ_B5_B - [15:0] */ +#define WM8994_AIF1DAC1_EQ_B5_B_SHIFT                0  /* AIF1DAC1_EQ_B5_B - [15:0] */ +#define WM8994_AIF1DAC1_EQ_B5_B_WIDTH               16  /* AIF1DAC1_EQ_B5_B - [15:0] */ + +/* + * R1171 (0x493) - AIF1 DAC1 EQ Band 5 PG + */ +#define WM8994_AIF1DAC1_EQ_B5_PG_MASK           0xFFFF  /* AIF1DAC1_EQ_B5_PG - [15:0] */ +#define WM8994_AIF1DAC1_EQ_B5_PG_SHIFT               0  /* AIF1DAC1_EQ_B5_PG - [15:0] */ +#define WM8994_AIF1DAC1_EQ_B5_PG_WIDTH              16  /* AIF1DAC1_EQ_B5_PG - [15:0] */ + +/* + * R1184 (0x4A0) - AIF1 DAC2 EQ Gains (1) + */ +#define WM8994_AIF1DAC2_EQ_B1_GAIN_MASK         0xF800  /* AIF1DAC2_EQ_B1_GAIN - [15:11] */ +#define WM8994_AIF1DAC2_EQ_B1_GAIN_SHIFT            11  /* AIF1DAC2_EQ_B1_GAIN - [15:11] */ +#define WM8994_AIF1DAC2_EQ_B1_GAIN_WIDTH             5  /* AIF1DAC2_EQ_B1_GAIN - [15:11] */ +#define WM8994_AIF1DAC2_EQ_B2_GAIN_MASK         0x07C0  /* AIF1DAC2_EQ_B2_GAIN - [10:6] */ +#define WM8994_AIF1DAC2_EQ_B2_GAIN_SHIFT             6  /* AIF1DAC2_EQ_B2_GAIN - [10:6] */ +#define WM8994_AIF1DAC2_EQ_B2_GAIN_WIDTH             5  /* AIF1DAC2_EQ_B2_GAIN - [10:6] */ +#define WM8994_AIF1DAC2_EQ_B3_GAIN_MASK         0x003E  /* AIF1DAC2_EQ_B3_GAIN - [5:1] */ +#define WM8994_AIF1DAC2_EQ_B3_GAIN_SHIFT             1  /* AIF1DAC2_EQ_B3_GAIN - [5:1] */ +#define WM8994_AIF1DAC2_EQ_B3_GAIN_WIDTH             5  /* AIF1DAC2_EQ_B3_GAIN - [5:1] */ +#define WM8994_AIF1DAC2_EQ_ENA                  0x0001  /* AIF1DAC2_EQ_ENA */ +#define WM8994_AIF1DAC2_EQ_ENA_MASK             0x0001  /* AIF1DAC2_EQ_ENA */ +#define WM8994_AIF1DAC2_EQ_ENA_SHIFT                 0  /* AIF1DAC2_EQ_ENA */ +#define WM8994_AIF1DAC2_EQ_ENA_WIDTH                 1  /* AIF1DAC2_EQ_ENA */ + +/* + * R1185 (0x4A1) - AIF1 DAC2 EQ Gains (2) + */ +#define WM8994_AIF1DAC2_EQ_B4_GAIN_MASK         0xF800  /* AIF1DAC2_EQ_B4_GAIN - [15:11] */ +#define WM8994_AIF1DAC2_EQ_B4_GAIN_SHIFT            11  /* AIF1DAC2_EQ_B4_GAIN - [15:11] */ +#define WM8994_AIF1DAC2_EQ_B4_GAIN_WIDTH             5  /* AIF1DAC2_EQ_B4_GAIN - [15:11] */ +#define WM8994_AIF1DAC2_EQ_B5_GAIN_MASK         0x07C0  /* AIF1DAC2_EQ_B5_GAIN - [10:6] */ +#define WM8994_AIF1DAC2_EQ_B5_GAIN_SHIFT             6  /* AIF1DAC2_EQ_B5_GAIN - [10:6] */ +#define WM8994_AIF1DAC2_EQ_B5_GAIN_WIDTH             5  /* AIF1DAC2_EQ_B5_GAIN - [10:6] */ + +/* + * R1186 (0x4A2) - AIF1 DAC2 EQ Band 1 A + */ +#define WM8994_AIF1DAC2_EQ_B1_A_MASK            0xFFFF  /* AIF1DAC2_EQ_B1_A - [15:0] */ +#define WM8994_AIF1DAC2_EQ_B1_A_SHIFT                0  /* AIF1DAC2_EQ_B1_A - [15:0] */ +#define WM8994_AIF1DAC2_EQ_B1_A_WIDTH               16  /* AIF1DAC2_EQ_B1_A - [15:0] */ + +/* + * R1187 (0x4A3) - AIF1 DAC2 EQ Band 1 B + */ +#define WM8994_AIF1DAC2_EQ_B1_B_MASK            0xFFFF  /* AIF1DAC2_EQ_B1_B - [15:0] */ +#define WM8994_AIF1DAC2_EQ_B1_B_SHIFT                0  /* AIF1DAC2_EQ_B1_B - [15:0] */ +#define WM8994_AIF1DAC2_EQ_B1_B_WIDTH               16  /* AIF1DAC2_EQ_B1_B - [15:0] */ + +/* + * R1188 (0x4A4) - AIF1 DAC2 EQ Band 1 PG + */ +#define WM8994_AIF1DAC2_EQ_B1_PG_MASK           0xFFFF  /* AIF1DAC2_EQ_B1_PG - [15:0] */ +#define WM8994_AIF1DAC2_EQ_B1_PG_SHIFT               0  /* AIF1DAC2_EQ_B1_PG - [15:0] */ +#define WM8994_AIF1DAC2_EQ_B1_PG_WIDTH              16  /* AIF1DAC2_EQ_B1_PG - [15:0] */ + +/* + * R1189 (0x4A5) - AIF1 DAC2 EQ Band 2 A + */ +#define WM8994_AIF1DAC2_EQ_B2_A_MASK            0xFFFF  /* AIF1DAC2_EQ_B2_A - [15:0] */ +#define WM8994_AIF1DAC2_EQ_B2_A_SHIFT                0  /* AIF1DAC2_EQ_B2_A - [15:0] */ +#define WM8994_AIF1DAC2_EQ_B2_A_WIDTH               16  /* AIF1DAC2_EQ_B2_A - [15:0] */ + +/* + * R1190 (0x4A6) - AIF1 DAC2 EQ Band 2 B + */ +#define WM8994_AIF1DAC2_EQ_B2_B_MASK            0xFFFF  /* AIF1DAC2_EQ_B2_B - [15:0] */ +#define WM8994_AIF1DAC2_EQ_B2_B_SHIFT                0  /* AIF1DAC2_EQ_B2_B - [15:0] */ +#define WM8994_AIF1DAC2_EQ_B2_B_WIDTH               16  /* AIF1DAC2_EQ_B2_B - [15:0] */ + +/* + * R1191 (0x4A7) - AIF1 DAC2 EQ Band 2 C + */ +#define WM8994_AIF1DAC2_EQ_B2_C_MASK            0xFFFF  /* AIF1DAC2_EQ_B2_C - [15:0] */ +#define WM8994_AIF1DAC2_EQ_B2_C_SHIFT                0  /* AIF1DAC2_EQ_B2_C - [15:0] */ +#define WM8994_AIF1DAC2_EQ_B2_C_WIDTH               16  /* AIF1DAC2_EQ_B2_C - [15:0] */ + +/* + * R1192 (0x4A8) - AIF1 DAC2 EQ Band 2 PG + */ +#define WM8994_AIF1DAC2_EQ_B2_PG_MASK           0xFFFF  /* AIF1DAC2_EQ_B2_PG - [15:0] */ +#define WM8994_AIF1DAC2_EQ_B2_PG_SHIFT               0  /* AIF1DAC2_EQ_B2_PG - [15:0] */ +#define WM8994_AIF1DAC2_EQ_B2_PG_WIDTH              16  /* AIF1DAC2_EQ_B2_PG - [15:0] */ + +/* + * R1193 (0x4A9) - AIF1 DAC2 EQ Band 3 A + */ +#define WM8994_AIF1DAC2_EQ_B3_A_MASK            0xFFFF  /* AIF1DAC2_EQ_B3_A - [15:0] */ +#define WM8994_AIF1DAC2_EQ_B3_A_SHIFT                0  /* AIF1DAC2_EQ_B3_A - [15:0] */ +#define WM8994_AIF1DAC2_EQ_B3_A_WIDTH               16  /* AIF1DAC2_EQ_B3_A - [15:0] */ + +/* + * R1194 (0x4AA) - AIF1 DAC2 EQ Band 3 B + */ +#define WM8994_AIF1DAC2_EQ_B3_B_MASK            0xFFFF  /* AIF1DAC2_EQ_B3_B - [15:0] */ +#define WM8994_AIF1DAC2_EQ_B3_B_SHIFT                0  /* AIF1DAC2_EQ_B3_B - [15:0] */ +#define WM8994_AIF1DAC2_EQ_B3_B_WIDTH               16  /* AIF1DAC2_EQ_B3_B - [15:0] */ + +/* + * R1195 (0x4AB) - AIF1 DAC2 EQ Band 3 C + */ +#define WM8994_AIF1DAC2_EQ_B3_C_MASK            0xFFFF  /* AIF1DAC2_EQ_B3_C - [15:0] */ +#define WM8994_AIF1DAC2_EQ_B3_C_SHIFT                0  /* AIF1DAC2_EQ_B3_C - [15:0] */ +#define WM8994_AIF1DAC2_EQ_B3_C_WIDTH               16  /* AIF1DAC2_EQ_B3_C - [15:0] */ + +/* + * R1196 (0x4AC) - AIF1 DAC2 EQ Band 3 PG + */ +#define WM8994_AIF1DAC2_EQ_B3_PG_MASK           0xFFFF  /* AIF1DAC2_EQ_B3_PG - [15:0] */ +#define WM8994_AIF1DAC2_EQ_B3_PG_SHIFT               0  /* AIF1DAC2_EQ_B3_PG - [15:0] */ +#define WM8994_AIF1DAC2_EQ_B3_PG_WIDTH              16  /* AIF1DAC2_EQ_B3_PG - [15:0] */ + +/* + * R1197 (0x4AD) - AIF1 DAC2 EQ Band 4 A + */ +#define WM8994_AIF1DAC2_EQ_B4_A_MASK            0xFFFF  /* AIF1DAC2_EQ_B4_A - [15:0] */ +#define WM8994_AIF1DAC2_EQ_B4_A_SHIFT                0  /* AIF1DAC2_EQ_B4_A - [15:0] */ +#define WM8994_AIF1DAC2_EQ_B4_A_WIDTH               16  /* AIF1DAC2_EQ_B4_A - [15:0] */ + +/* + * R1198 (0x4AE) - AIF1 DAC2 EQ Band 4 B + */ +#define WM8994_AIF1DAC2_EQ_B4_B_MASK            0xFFFF  /* AIF1DAC2_EQ_B4_B - [15:0] */ +#define WM8994_AIF1DAC2_EQ_B4_B_SHIFT                0  /* AIF1DAC2_EQ_B4_B - [15:0] */ +#define WM8994_AIF1DAC2_EQ_B4_B_WIDTH               16  /* AIF1DAC2_EQ_B4_B - [15:0] */ + +/* + * R1199 (0x4AF) - AIF1 DAC2 EQ Band 4 C + */ +#define WM8994_AIF1DAC2_EQ_B4_C_MASK            0xFFFF  /* AIF1DAC2_EQ_B4_C - [15:0] */ +#define WM8994_AIF1DAC2_EQ_B4_C_SHIFT                0  /* AIF1DAC2_EQ_B4_C - [15:0] */ +#define WM8994_AIF1DAC2_EQ_B4_C_WIDTH               16  /* AIF1DAC2_EQ_B4_C - [15:0] */ + +/* + * R1200 (0x4B0) - AIF1 DAC2 EQ Band 4 PG + */ +#define WM8994_AIF1DAC2_EQ_B4_PG_MASK           0xFFFF  /* AIF1DAC2_EQ_B4_PG - [15:0] */ +#define WM8994_AIF1DAC2_EQ_B4_PG_SHIFT               0  /* AIF1DAC2_EQ_B4_PG - [15:0] */ +#define WM8994_AIF1DAC2_EQ_B4_PG_WIDTH              16  /* AIF1DAC2_EQ_B4_PG - [15:0] */ + +/* + * R1201 (0x4B1) - AIF1 DAC2 EQ Band 5 A + */ +#define WM8994_AIF1DAC2_EQ_B5_A_MASK            0xFFFF  /* AIF1DAC2_EQ_B5_A - [15:0] */ +#define WM8994_AIF1DAC2_EQ_B5_A_SHIFT                0  /* AIF1DAC2_EQ_B5_A - [15:0] */ +#define WM8994_AIF1DAC2_EQ_B5_A_WIDTH               16  /* AIF1DAC2_EQ_B5_A - [15:0] */ + +/* + * R1202 (0x4B2) - AIF1 DAC2 EQ Band 5 B + */ +#define WM8994_AIF1DAC2_EQ_B5_B_MASK            0xFFFF  /* AIF1DAC2_EQ_B5_B - [15:0] */ +#define WM8994_AIF1DAC2_EQ_B5_B_SHIFT                0  /* AIF1DAC2_EQ_B5_B - [15:0] */ +#define WM8994_AIF1DAC2_EQ_B5_B_WIDTH               16  /* AIF1DAC2_EQ_B5_B - [15:0] */ + +/* + * R1203 (0x4B3) - AIF1 DAC2 EQ Band 5 PG + */ +#define WM8994_AIF1DAC2_EQ_B5_PG_MASK           0xFFFF  /* AIF1DAC2_EQ_B5_PG - [15:0] */ +#define WM8994_AIF1DAC2_EQ_B5_PG_SHIFT               0  /* AIF1DAC2_EQ_B5_PG - [15:0] */ +#define WM8994_AIF1DAC2_EQ_B5_PG_WIDTH              16  /* AIF1DAC2_EQ_B5_PG - [15:0] */ + +/* + * R1280 (0x500) - AIF2 ADC Left Volume + */ +#define WM8994_AIF2ADC_VU                       0x0100  /* AIF2ADC_VU */ +#define WM8994_AIF2ADC_VU_MASK                  0x0100  /* AIF2ADC_VU */ +#define WM8994_AIF2ADC_VU_SHIFT                      8  /* AIF2ADC_VU */ +#define WM8994_AIF2ADC_VU_WIDTH                      1  /* AIF2ADC_VU */ +#define WM8994_AIF2ADCL_VOL_MASK                0x00FF  /* AIF2ADCL_VOL - [7:0] */ +#define WM8994_AIF2ADCL_VOL_SHIFT                    0  /* AIF2ADCL_VOL - [7:0] */ +#define WM8994_AIF2ADCL_VOL_WIDTH                    8  /* AIF2ADCL_VOL - [7:0] */ + +/* + * R1281 (0x501) - AIF2 ADC Right Volume + */ +#define WM8994_AIF2ADC_VU                       0x0100  /* AIF2ADC_VU */ +#define WM8994_AIF2ADC_VU_MASK                  0x0100  /* AIF2ADC_VU */ +#define WM8994_AIF2ADC_VU_SHIFT                      8  /* AIF2ADC_VU */ +#define WM8994_AIF2ADC_VU_WIDTH                      1  /* AIF2ADC_VU */ +#define WM8994_AIF2ADCR_VOL_MASK                0x00FF  /* AIF2ADCR_VOL - [7:0] */ +#define WM8994_AIF2ADCR_VOL_SHIFT                    0  /* AIF2ADCR_VOL - [7:0] */ +#define WM8994_AIF2ADCR_VOL_WIDTH                    8  /* AIF2ADCR_VOL - [7:0] */ + +/* + * R1282 (0x502) - AIF2 DAC Left Volume + */ +#define WM8994_AIF2DAC_VU                       0x0100  /* AIF2DAC_VU */ +#define WM8994_AIF2DAC_VU_MASK                  0x0100  /* AIF2DAC_VU */ +#define WM8994_AIF2DAC_VU_SHIFT                      8  /* AIF2DAC_VU */ +#define WM8994_AIF2DAC_VU_WIDTH                      1  /* AIF2DAC_VU */ +#define WM8994_AIF2DACL_VOL_MASK                0x00FF  /* AIF2DACL_VOL - [7:0] */ +#define WM8994_AIF2DACL_VOL_SHIFT                    0  /* AIF2DACL_VOL - [7:0] */ +#define WM8994_AIF2DACL_VOL_WIDTH                    8  /* AIF2DACL_VOL - [7:0] */ + +/* + * R1283 (0x503) - AIF2 DAC Right Volume + */ +#define WM8994_AIF2DAC_VU                       0x0100  /* AIF2DAC_VU */ +#define WM8994_AIF2DAC_VU_MASK                  0x0100  /* AIF2DAC_VU */ +#define WM8994_AIF2DAC_VU_SHIFT                      8  /* AIF2DAC_VU */ +#define WM8994_AIF2DAC_VU_WIDTH                      1  /* AIF2DAC_VU */ +#define WM8994_AIF2DACR_VOL_MASK                0x00FF  /* AIF2DACR_VOL - [7:0] */ +#define WM8994_AIF2DACR_VOL_SHIFT                    0  /* AIF2DACR_VOL - [7:0] */ +#define WM8994_AIF2DACR_VOL_WIDTH                    8  /* AIF2DACR_VOL - [7:0] */ + +/* + * R1296 (0x510) - AIF2 ADC Filters + */ +#define WM8994_AIF2ADC_4FS                      0x8000  /* AIF2ADC_4FS */ +#define WM8994_AIF2ADC_4FS_MASK                 0x8000  /* AIF2ADC_4FS */ +#define WM8994_AIF2ADC_4FS_SHIFT                    15  /* AIF2ADC_4FS */ +#define WM8994_AIF2ADC_4FS_WIDTH                     1  /* AIF2ADC_4FS */ +#define WM8994_AIF2ADC_HPF_CUT_MASK             0x6000  /* AIF2ADC_HPF_CUT - [14:13] */ +#define WM8994_AIF2ADC_HPF_CUT_SHIFT                13  /* AIF2ADC_HPF_CUT - [14:13] */ +#define WM8994_AIF2ADC_HPF_CUT_WIDTH                 2  /* AIF2ADC_HPF_CUT - [14:13] */ +#define WM8994_AIF2ADCL_HPF                     0x1000  /* AIF2ADCL_HPF */ +#define WM8994_AIF2ADCL_HPF_MASK                0x1000  /* AIF2ADCL_HPF */ +#define WM8994_AIF2ADCL_HPF_SHIFT                   12  /* AIF2ADCL_HPF */ +#define WM8994_AIF2ADCL_HPF_WIDTH                    1  /* AIF2ADCL_HPF */ +#define WM8994_AIF2ADCR_HPF                     0x0800  /* AIF2ADCR_HPF */ +#define WM8994_AIF2ADCR_HPF_MASK                0x0800  /* AIF2ADCR_HPF */ +#define WM8994_AIF2ADCR_HPF_SHIFT                   11  /* AIF2ADCR_HPF */ +#define WM8994_AIF2ADCR_HPF_WIDTH                    1  /* AIF2ADCR_HPF */ + +/* + * R1312 (0x520) - AIF2 DAC Filters (1) + */ +#define WM8994_AIF2DAC_MUTE                     0x0200  /* AIF2DAC_MUTE */ +#define WM8994_AIF2DAC_MUTE_MASK                0x0200  /* AIF2DAC_MUTE */ +#define WM8994_AIF2DAC_MUTE_SHIFT                    9  /* AIF2DAC_MUTE */ +#define WM8994_AIF2DAC_MUTE_WIDTH                    1  /* AIF2DAC_MUTE */ +#define WM8994_AIF2DAC_MONO                     0x0080  /* AIF2DAC_MONO */ +#define WM8994_AIF2DAC_MONO_MASK                0x0080  /* AIF2DAC_MONO */ +#define WM8994_AIF2DAC_MONO_SHIFT                    7  /* AIF2DAC_MONO */ +#define WM8994_AIF2DAC_MONO_WIDTH                    1  /* AIF2DAC_MONO */ +#define WM8994_AIF2DAC_MUTERATE                 0x0020  /* AIF2DAC_MUTERATE */ +#define WM8994_AIF2DAC_MUTERATE_MASK            0x0020  /* AIF2DAC_MUTERATE */ +#define WM8994_AIF2DAC_MUTERATE_SHIFT                5  /* AIF2DAC_MUTERATE */ +#define WM8994_AIF2DAC_MUTERATE_WIDTH                1  /* AIF2DAC_MUTERATE */ +#define WM8994_AIF2DAC_UNMUTE_RAMP              0x0010  /* AIF2DAC_UNMUTE_RAMP */ +#define WM8994_AIF2DAC_UNMUTE_RAMP_MASK         0x0010  /* AIF2DAC_UNMUTE_RAMP */ +#define WM8994_AIF2DAC_UNMUTE_RAMP_SHIFT             4  /* AIF2DAC_UNMUTE_RAMP */ +#define WM8994_AIF2DAC_UNMUTE_RAMP_WIDTH             1  /* AIF2DAC_UNMUTE_RAMP */ +#define WM8994_AIF2DAC_DEEMP_MASK               0x0006  /* AIF2DAC_DEEMP - [2:1] */ +#define WM8994_AIF2DAC_DEEMP_SHIFT                   1  /* AIF2DAC_DEEMP - [2:1] */ +#define WM8994_AIF2DAC_DEEMP_WIDTH                   2  /* AIF2DAC_DEEMP - [2:1] */ + +/* + * R1313 (0x521) - AIF2 DAC Filters (2) + */ +#define WM8994_AIF2DAC_3D_GAIN_MASK             0x3E00  /* AIF2DAC_3D_GAIN - [13:9] */ +#define WM8994_AIF2DAC_3D_GAIN_SHIFT                 9  /* AIF2DAC_3D_GAIN - [13:9] */ +#define WM8994_AIF2DAC_3D_GAIN_WIDTH                 5  /* AIF2DAC_3D_GAIN - [13:9] */ +#define WM8994_AIF2DAC_3D_ENA                   0x0100  /* AIF2DAC_3D_ENA */ +#define WM8994_AIF2DAC_3D_ENA_MASK              0x0100  /* AIF2DAC_3D_ENA */ +#define WM8994_AIF2DAC_3D_ENA_SHIFT                  8  /* AIF2DAC_3D_ENA */ +#define WM8994_AIF2DAC_3D_ENA_WIDTH                  1  /* AIF2DAC_3D_ENA */ + +/* + * R1344 (0x540) - AIF2 DRC (1) + */ +#define WM8994_AIF2DRC_SIG_DET_RMS_MASK         0xF800  /* AIF2DRC_SIG_DET_RMS - [15:11] */ +#define WM8994_AIF2DRC_SIG_DET_RMS_SHIFT            11  /* AIF2DRC_SIG_DET_RMS - [15:11] */ +#define WM8994_AIF2DRC_SIG_DET_RMS_WIDTH             5  /* AIF2DRC_SIG_DET_RMS - [15:11] */ +#define WM8994_AIF2DRC_SIG_DET_PK_MASK          0x0600  /* AIF2DRC_SIG_DET_PK - [10:9] */ +#define WM8994_AIF2DRC_SIG_DET_PK_SHIFT              9  /* AIF2DRC_SIG_DET_PK - [10:9] */ +#define WM8994_AIF2DRC_SIG_DET_PK_WIDTH              2  /* AIF2DRC_SIG_DET_PK - [10:9] */ +#define WM8994_AIF2DRC_NG_ENA                   0x0100  /* AIF2DRC_NG_ENA */ +#define WM8994_AIF2DRC_NG_ENA_MASK              0x0100  /* AIF2DRC_NG_ENA */ +#define WM8994_AIF2DRC_NG_ENA_SHIFT                  8  /* AIF2DRC_NG_ENA */ +#define WM8994_AIF2DRC_NG_ENA_WIDTH                  1  /* AIF2DRC_NG_ENA */ +#define WM8994_AIF2DRC_SIG_DET_MODE             0x0080  /* AIF2DRC_SIG_DET_MODE */ +#define WM8994_AIF2DRC_SIG_DET_MODE_MASK        0x0080  /* AIF2DRC_SIG_DET_MODE */ +#define WM8994_AIF2DRC_SIG_DET_MODE_SHIFT            7  /* AIF2DRC_SIG_DET_MODE */ +#define WM8994_AIF2DRC_SIG_DET_MODE_WIDTH            1  /* AIF2DRC_SIG_DET_MODE */ +#define WM8994_AIF2DRC_SIG_DET                  0x0040  /* AIF2DRC_SIG_DET */ +#define WM8994_AIF2DRC_SIG_DET_MASK             0x0040  /* AIF2DRC_SIG_DET */ +#define WM8994_AIF2DRC_SIG_DET_SHIFT                 6  /* AIF2DRC_SIG_DET */ +#define WM8994_AIF2DRC_SIG_DET_WIDTH                 1  /* AIF2DRC_SIG_DET */ +#define WM8994_AIF2DRC_KNEE2_OP_ENA             0x0020  /* AIF2DRC_KNEE2_OP_ENA */ +#define WM8994_AIF2DRC_KNEE2_OP_ENA_MASK        0x0020  /* AIF2DRC_KNEE2_OP_ENA */ +#define WM8994_AIF2DRC_KNEE2_OP_ENA_SHIFT            5  /* AIF2DRC_KNEE2_OP_ENA */ +#define WM8994_AIF2DRC_KNEE2_OP_ENA_WIDTH            1  /* AIF2DRC_KNEE2_OP_ENA */ +#define WM8994_AIF2DRC_QR                       0x0010  /* AIF2DRC_QR */ +#define WM8994_AIF2DRC_QR_MASK                  0x0010  /* AIF2DRC_QR */ +#define WM8994_AIF2DRC_QR_SHIFT                      4  /* AIF2DRC_QR */ +#define WM8994_AIF2DRC_QR_WIDTH                      1  /* AIF2DRC_QR */ +#define WM8994_AIF2DRC_ANTICLIP                 0x0008  /* AIF2DRC_ANTICLIP */ +#define WM8994_AIF2DRC_ANTICLIP_MASK            0x0008  /* AIF2DRC_ANTICLIP */ +#define WM8994_AIF2DRC_ANTICLIP_SHIFT                3  /* AIF2DRC_ANTICLIP */ +#define WM8994_AIF2DRC_ANTICLIP_WIDTH                1  /* AIF2DRC_ANTICLIP */ +#define WM8994_AIF2DAC_DRC_ENA                  0x0004  /* AIF2DAC_DRC_ENA */ +#define WM8994_AIF2DAC_DRC_ENA_MASK             0x0004  /* AIF2DAC_DRC_ENA */ +#define WM8994_AIF2DAC_DRC_ENA_SHIFT                 2  /* AIF2DAC_DRC_ENA */ +#define WM8994_AIF2DAC_DRC_ENA_WIDTH                 1  /* AIF2DAC_DRC_ENA */ +#define WM8994_AIF2ADCL_DRC_ENA                 0x0002  /* AIF2ADCL_DRC_ENA */ +#define WM8994_AIF2ADCL_DRC_ENA_MASK            0x0002  /* AIF2ADCL_DRC_ENA */ +#define WM8994_AIF2ADCL_DRC_ENA_SHIFT                1  /* AIF2ADCL_DRC_ENA */ +#define WM8994_AIF2ADCL_DRC_ENA_WIDTH                1  /* AIF2ADCL_DRC_ENA */ +#define WM8994_AIF2ADCR_DRC_ENA                 0x0001  /* AIF2ADCR_DRC_ENA */ +#define WM8994_AIF2ADCR_DRC_ENA_MASK            0x0001  /* AIF2ADCR_DRC_ENA */ +#define WM8994_AIF2ADCR_DRC_ENA_SHIFT                0  /* AIF2ADCR_DRC_ENA */ +#define WM8994_AIF2ADCR_DRC_ENA_WIDTH                1  /* AIF2ADCR_DRC_ENA */ + +/* + * R1345 (0x541) - AIF2 DRC (2) + */ +#define WM8994_AIF2DRC_ATK_MASK                 0x1E00  /* AIF2DRC_ATK - [12:9] */ +#define WM8994_AIF2DRC_ATK_SHIFT                     9  /* AIF2DRC_ATK - [12:9] */ +#define WM8994_AIF2DRC_ATK_WIDTH                     4  /* AIF2DRC_ATK - [12:9] */ +#define WM8994_AIF2DRC_DCY_MASK                 0x01E0  /* AIF2DRC_DCY - [8:5] */ +#define WM8994_AIF2DRC_DCY_SHIFT                     5  /* AIF2DRC_DCY - [8:5] */ +#define WM8994_AIF2DRC_DCY_WIDTH                     4  /* AIF2DRC_DCY - [8:5] */ +#define WM8994_AIF2DRC_MINGAIN_MASK             0x001C  /* AIF2DRC_MINGAIN - [4:2] */ +#define WM8994_AIF2DRC_MINGAIN_SHIFT                 2  /* AIF2DRC_MINGAIN - [4:2] */ +#define WM8994_AIF2DRC_MINGAIN_WIDTH                 3  /* AIF2DRC_MINGAIN - [4:2] */ +#define WM8994_AIF2DRC_MAXGAIN_MASK             0x0003  /* AIF2DRC_MAXGAIN - [1:0] */ +#define WM8994_AIF2DRC_MAXGAIN_SHIFT                 0  /* AIF2DRC_MAXGAIN - [1:0] */ +#define WM8994_AIF2DRC_MAXGAIN_WIDTH                 2  /* AIF2DRC_MAXGAIN - [1:0] */ + +/* + * R1346 (0x542) - AIF2 DRC (3) + */ +#define WM8994_AIF2DRC_NG_MINGAIN_MASK          0xF000  /* AIF2DRC_NG_MINGAIN - [15:12] */ +#define WM8994_AIF2DRC_NG_MINGAIN_SHIFT             12  /* AIF2DRC_NG_MINGAIN - [15:12] */ +#define WM8994_AIF2DRC_NG_MINGAIN_WIDTH              4  /* AIF2DRC_NG_MINGAIN - [15:12] */ +#define WM8994_AIF2DRC_NG_EXP_MASK              0x0C00  /* AIF2DRC_NG_EXP - [11:10] */ +#define WM8994_AIF2DRC_NG_EXP_SHIFT                 10  /* AIF2DRC_NG_EXP - [11:10] */ +#define WM8994_AIF2DRC_NG_EXP_WIDTH                  2  /* AIF2DRC_NG_EXP - [11:10] */ +#define WM8994_AIF2DRC_QR_THR_MASK              0x0300  /* AIF2DRC_QR_THR - [9:8] */ +#define WM8994_AIF2DRC_QR_THR_SHIFT                  8  /* AIF2DRC_QR_THR - [9:8] */ +#define WM8994_AIF2DRC_QR_THR_WIDTH                  2  /* AIF2DRC_QR_THR - [9:8] */ +#define WM8994_AIF2DRC_QR_DCY_MASK              0x00C0  /* AIF2DRC_QR_DCY - [7:6] */ +#define WM8994_AIF2DRC_QR_DCY_SHIFT                  6  /* AIF2DRC_QR_DCY - [7:6] */ +#define WM8994_AIF2DRC_QR_DCY_WIDTH                  2  /* AIF2DRC_QR_DCY - [7:6] */ +#define WM8994_AIF2DRC_HI_COMP_MASK             0x0038  /* AIF2DRC_HI_COMP - [5:3] */ +#define WM8994_AIF2DRC_HI_COMP_SHIFT                 3  /* AIF2DRC_HI_COMP - [5:3] */ +#define WM8994_AIF2DRC_HI_COMP_WIDTH                 3  /* AIF2DRC_HI_COMP - [5:3] */ +#define WM8994_AIF2DRC_LO_COMP_MASK             0x0007  /* AIF2DRC_LO_COMP - [2:0] */ +#define WM8994_AIF2DRC_LO_COMP_SHIFT                 0  /* AIF2DRC_LO_COMP - [2:0] */ +#define WM8994_AIF2DRC_LO_COMP_WIDTH                 3  /* AIF2DRC_LO_COMP - [2:0] */ + +/* + * R1347 (0x543) - AIF2 DRC (4) + */ +#define WM8994_AIF2DRC_KNEE_IP_MASK             0x07E0  /* AIF2DRC_KNEE_IP - [10:5] */ +#define WM8994_AIF2DRC_KNEE_IP_SHIFT                 5  /* AIF2DRC_KNEE_IP - [10:5] */ +#define WM8994_AIF2DRC_KNEE_IP_WIDTH                 6  /* AIF2DRC_KNEE_IP - [10:5] */ +#define WM8994_AIF2DRC_KNEE_OP_MASK             0x001F  /* AIF2DRC_KNEE_OP - [4:0] */ +#define WM8994_AIF2DRC_KNEE_OP_SHIFT                 0  /* AIF2DRC_KNEE_OP - [4:0] */ +#define WM8994_AIF2DRC_KNEE_OP_WIDTH                 5  /* AIF2DRC_KNEE_OP - [4:0] */ + +/* + * R1348 (0x544) - AIF2 DRC (5) + */ +#define WM8994_AIF2DRC_KNEE2_IP_MASK            0x03E0  /* AIF2DRC_KNEE2_IP - [9:5] */ +#define WM8994_AIF2DRC_KNEE2_IP_SHIFT                5  /* AIF2DRC_KNEE2_IP - [9:5] */ +#define WM8994_AIF2DRC_KNEE2_IP_WIDTH                5  /* AIF2DRC_KNEE2_IP - [9:5] */ +#define WM8994_AIF2DRC_KNEE2_OP_MASK            0x001F  /* AIF2DRC_KNEE2_OP - [4:0] */ +#define WM8994_AIF2DRC_KNEE2_OP_SHIFT                0  /* AIF2DRC_KNEE2_OP - [4:0] */ +#define WM8994_AIF2DRC_KNEE2_OP_WIDTH                5  /* AIF2DRC_KNEE2_OP - [4:0] */ + +/* + * R1408 (0x580) - AIF2 EQ Gains (1) + */ +#define WM8994_AIF2DAC_EQ_B1_GAIN_MASK          0xF800  /* AIF2DAC_EQ_B1_GAIN - [15:11] */ +#define WM8994_AIF2DAC_EQ_B1_GAIN_SHIFT             11  /* AIF2DAC_EQ_B1_GAIN - [15:11] */ +#define WM8994_AIF2DAC_EQ_B1_GAIN_WIDTH              5  /* AIF2DAC_EQ_B1_GAIN - [15:11] */ +#define WM8994_AIF2DAC_EQ_B2_GAIN_MASK          0x07C0  /* AIF2DAC_EQ_B2_GAIN - [10:6] */ +#define WM8994_AIF2DAC_EQ_B2_GAIN_SHIFT              6  /* AIF2DAC_EQ_B2_GAIN - [10:6] */ +#define WM8994_AIF2DAC_EQ_B2_GAIN_WIDTH              5  /* AIF2DAC_EQ_B2_GAIN - [10:6] */ +#define WM8994_AIF2DAC_EQ_B3_GAIN_MASK          0x003E  /* AIF2DAC_EQ_B3_GAIN - [5:1] */ +#define WM8994_AIF2DAC_EQ_B3_GAIN_SHIFT              1  /* AIF2DAC_EQ_B3_GAIN - [5:1] */ +#define WM8994_AIF2DAC_EQ_B3_GAIN_WIDTH              5  /* AIF2DAC_EQ_B3_GAIN - [5:1] */ +#define WM8994_AIF2DAC_EQ_ENA                   0x0001  /* AIF2DAC_EQ_ENA */ +#define WM8994_AIF2DAC_EQ_ENA_MASK              0x0001  /* AIF2DAC_EQ_ENA */ +#define WM8994_AIF2DAC_EQ_ENA_SHIFT                  0  /* AIF2DAC_EQ_ENA */ +#define WM8994_AIF2DAC_EQ_ENA_WIDTH                  1  /* AIF2DAC_EQ_ENA */ + +/* + * R1409 (0x581) - AIF2 EQ Gains (2) + */ +#define WM8994_AIF2DAC_EQ_B4_GAIN_MASK          0xF800  /* AIF2DAC_EQ_B4_GAIN - [15:11] */ +#define WM8994_AIF2DAC_EQ_B4_GAIN_SHIFT             11  /* AIF2DAC_EQ_B4_GAIN - [15:11] */ +#define WM8994_AIF2DAC_EQ_B4_GAIN_WIDTH              5  /* AIF2DAC_EQ_B4_GAIN - [15:11] */ +#define WM8994_AIF2DAC_EQ_B5_GAIN_MASK          0x07C0  /* AIF2DAC_EQ_B5_GAIN - [10:6] */ +#define WM8994_AIF2DAC_EQ_B5_GAIN_SHIFT              6  /* AIF2DAC_EQ_B5_GAIN - [10:6] */ +#define WM8994_AIF2DAC_EQ_B5_GAIN_WIDTH              5  /* AIF2DAC_EQ_B5_GAIN - [10:6] */ + +/* + * R1410 (0x582) - AIF2 EQ Band 1 A + */ +#define WM8994_AIF2DAC_EQ_B1_A_MASK             0xFFFF  /* AIF2DAC_EQ_B1_A - [15:0] */ +#define WM8994_AIF2DAC_EQ_B1_A_SHIFT                 0  /* AIF2DAC_EQ_B1_A - [15:0] */ +#define WM8994_AIF2DAC_EQ_B1_A_WIDTH                16  /* AIF2DAC_EQ_B1_A - [15:0] */ + +/* + * R1411 (0x583) - AIF2 EQ Band 1 B + */ +#define WM8994_AIF2DAC_EQ_B1_B_MASK             0xFFFF  /* AIF2DAC_EQ_B1_B - [15:0] */ +#define WM8994_AIF2DAC_EQ_B1_B_SHIFT                 0  /* AIF2DAC_EQ_B1_B - [15:0] */ +#define WM8994_AIF2DAC_EQ_B1_B_WIDTH                16  /* AIF2DAC_EQ_B1_B - [15:0] */ + +/* + * R1412 (0x584) - AIF2 EQ Band 1 PG + */ +#define WM8994_AIF2DAC_EQ_B1_PG_MASK            0xFFFF  /* AIF2DAC_EQ_B1_PG - [15:0] */ +#define WM8994_AIF2DAC_EQ_B1_PG_SHIFT                0  /* AIF2DAC_EQ_B1_PG - [15:0] */ +#define WM8994_AIF2DAC_EQ_B1_PG_WIDTH               16  /* AIF2DAC_EQ_B1_PG - [15:0] */ + +/* + * R1413 (0x585) - AIF2 EQ Band 2 A + */ +#define WM8994_AIF2DAC_EQ_B2_A_MASK             0xFFFF  /* AIF2DAC_EQ_B2_A - [15:0] */ +#define WM8994_AIF2DAC_EQ_B2_A_SHIFT                 0  /* AIF2DAC_EQ_B2_A - [15:0] */ +#define WM8994_AIF2DAC_EQ_B2_A_WIDTH                16  /* AIF2DAC_EQ_B2_A - [15:0] */ + +/* + * R1414 (0x586) - AIF2 EQ Band 2 B + */ +#define WM8994_AIF2DAC_EQ_B2_B_MASK             0xFFFF  /* AIF2DAC_EQ_B2_B - [15:0] */ +#define WM8994_AIF2DAC_EQ_B2_B_SHIFT                 0  /* AIF2DAC_EQ_B2_B - [15:0] */ +#define WM8994_AIF2DAC_EQ_B2_B_WIDTH                16  /* AIF2DAC_EQ_B2_B - [15:0] */ + +/* + * R1415 (0x587) - AIF2 EQ Band 2 C + */ +#define WM8994_AIF2DAC_EQ_B2_C_MASK             0xFFFF  /* AIF2DAC_EQ_B2_C - [15:0] */ +#define WM8994_AIF2DAC_EQ_B2_C_SHIFT                 0  /* AIF2DAC_EQ_B2_C - [15:0] */ +#define WM8994_AIF2DAC_EQ_B2_C_WIDTH                16  /* AIF2DAC_EQ_B2_C - [15:0] */ + +/* + * R1416 (0x588) - AIF2 EQ Band 2 PG + */ +#define WM8994_AIF2DAC_EQ_B2_PG_MASK            0xFFFF  /* AIF2DAC_EQ_B2_PG - [15:0] */ +#define WM8994_AIF2DAC_EQ_B2_PG_SHIFT                0  /* AIF2DAC_EQ_B2_PG - [15:0] */ +#define WM8994_AIF2DAC_EQ_B2_PG_WIDTH               16  /* AIF2DAC_EQ_B2_PG - [15:0] */ + +/* + * R1417 (0x589) - AIF2 EQ Band 3 A + */ +#define WM8994_AIF2DAC_EQ_B3_A_MASK             0xFFFF  /* AIF2DAC_EQ_B3_A - [15:0] */ +#define WM8994_AIF2DAC_EQ_B3_A_SHIFT                 0  /* AIF2DAC_EQ_B3_A - [15:0] */ +#define WM8994_AIF2DAC_EQ_B3_A_WIDTH                16  /* AIF2DAC_EQ_B3_A - [15:0] */ + +/* + * R1418 (0x58A) - AIF2 EQ Band 3 B + */ +#define WM8994_AIF2DAC_EQ_B3_B_MASK             0xFFFF  /* AIF2DAC_EQ_B3_B - [15:0] */ +#define WM8994_AIF2DAC_EQ_B3_B_SHIFT                 0  /* AIF2DAC_EQ_B3_B - [15:0] */ +#define WM8994_AIF2DAC_EQ_B3_B_WIDTH                16  /* AIF2DAC_EQ_B3_B - [15:0] */ + +/* + * R1419 (0x58B) - AIF2 EQ Band 3 C + */ +#define WM8994_AIF2DAC_EQ_B3_C_MASK             0xFFFF  /* AIF2DAC_EQ_B3_C - [15:0] */ +#define WM8994_AIF2DAC_EQ_B3_C_SHIFT                 0  /* AIF2DAC_EQ_B3_C - [15:0] */ +#define WM8994_AIF2DAC_EQ_B3_C_WIDTH                16  /* AIF2DAC_EQ_B3_C - [15:0] */ + +/* + * R1420 (0x58C) - AIF2 EQ Band 3 PG + */ +#define WM8994_AIF2DAC_EQ_B3_PG_MASK            0xFFFF  /* AIF2DAC_EQ_B3_PG - [15:0] */ +#define WM8994_AIF2DAC_EQ_B3_PG_SHIFT                0  /* AIF2DAC_EQ_B3_PG - [15:0] */ +#define WM8994_AIF2DAC_EQ_B3_PG_WIDTH               16  /* AIF2DAC_EQ_B3_PG - [15:0] */ + +/* + * R1421 (0x58D) - AIF2 EQ Band 4 A + */ +#define WM8994_AIF2DAC_EQ_B4_A_MASK             0xFFFF  /* AIF2DAC_EQ_B4_A - [15:0] */ +#define WM8994_AIF2DAC_EQ_B4_A_SHIFT                 0  /* AIF2DAC_EQ_B4_A - [15:0] */ +#define WM8994_AIF2DAC_EQ_B4_A_WIDTH                16  /* AIF2DAC_EQ_B4_A - [15:0] */ + +/* + * R1422 (0x58E) - AIF2 EQ Band 4 B + */ +#define WM8994_AIF2DAC_EQ_B4_B_MASK             0xFFFF  /* AIF2DAC_EQ_B4_B - [15:0] */ +#define WM8994_AIF2DAC_EQ_B4_B_SHIFT                 0  /* AIF2DAC_EQ_B4_B - [15:0] */ +#define WM8994_AIF2DAC_EQ_B4_B_WIDTH                16  /* AIF2DAC_EQ_B4_B - [15:0] */ + +/* + * R1423 (0x58F) - AIF2 EQ Band 4 C + */ +#define WM8994_AIF2DAC_EQ_B4_C_MASK             0xFFFF  /* AIF2DAC_EQ_B4_C - [15:0] */ +#define WM8994_AIF2DAC_EQ_B4_C_SHIFT                 0  /* AIF2DAC_EQ_B4_C - [15:0] */ +#define WM8994_AIF2DAC_EQ_B4_C_WIDTH                16  /* AIF2DAC_EQ_B4_C - [15:0] */ + +/* + * R1424 (0x590) - AIF2 EQ Band 4 PG + */ +#define WM8994_AIF2DAC_EQ_B4_PG_MASK            0xFFFF  /* AIF2DAC_EQ_B4_PG - [15:0] */ +#define WM8994_AIF2DAC_EQ_B4_PG_SHIFT                0  /* AIF2DAC_EQ_B4_PG - [15:0] */ +#define WM8994_AIF2DAC_EQ_B4_PG_WIDTH               16  /* AIF2DAC_EQ_B4_PG - [15:0] */ + +/* + * R1425 (0x591) - AIF2 EQ Band 5 A + */ +#define WM8994_AIF2DAC_EQ_B5_A_MASK             0xFFFF  /* AIF2DAC_EQ_B5_A - [15:0] */ +#define WM8994_AIF2DAC_EQ_B5_A_SHIFT                 0  /* AIF2DAC_EQ_B5_A - [15:0] */ +#define WM8994_AIF2DAC_EQ_B5_A_WIDTH                16  /* AIF2DAC_EQ_B5_A - [15:0] */ + +/* + * R1426 (0x592) - AIF2 EQ Band 5 B + */ +#define WM8994_AIF2DAC_EQ_B5_B_MASK             0xFFFF  /* AIF2DAC_EQ_B5_B - [15:0] */ +#define WM8994_AIF2DAC_EQ_B5_B_SHIFT                 0  /* AIF2DAC_EQ_B5_B - [15:0] */ +#define WM8994_AIF2DAC_EQ_B5_B_WIDTH                16  /* AIF2DAC_EQ_B5_B - [15:0] */ + +/* + * R1427 (0x593) - AIF2 EQ Band 5 PG + */ +#define WM8994_AIF2DAC_EQ_B5_PG_MASK            0xFFFF  /* AIF2DAC_EQ_B5_PG - [15:0] */ +#define WM8994_AIF2DAC_EQ_B5_PG_SHIFT                0  /* AIF2DAC_EQ_B5_PG - [15:0] */ +#define WM8994_AIF2DAC_EQ_B5_PG_WIDTH               16  /* AIF2DAC_EQ_B5_PG - [15:0] */ + +/* + * R1536 (0x600) - DAC1 Mixer Volumes + */ +#define WM8994_ADCR_DAC1_VOL_MASK               0x01E0  /* ADCR_DAC1_VOL - [8:5] */ +#define WM8994_ADCR_DAC1_VOL_SHIFT                   5  /* ADCR_DAC1_VOL - [8:5] */ +#define WM8994_ADCR_DAC1_VOL_WIDTH                   4  /* ADCR_DAC1_VOL - [8:5] */ +#define WM8994_ADCL_DAC1_VOL_MASK               0x000F  /* ADCL_DAC1_VOL - [3:0] */ +#define WM8994_ADCL_DAC1_VOL_SHIFT                   0  /* ADCL_DAC1_VOL - [3:0] */ +#define WM8994_ADCL_DAC1_VOL_WIDTH                   4  /* ADCL_DAC1_VOL - [3:0] */ + +/* + * R1537 (0x601) - DAC1 Left Mixer Routing + */ +#define WM8994_ADCR_TO_DAC1L                    0x0020  /* ADCR_TO_DAC1L */ +#define WM8994_ADCR_TO_DAC1L_MASK               0x0020  /* ADCR_TO_DAC1L */ +#define WM8994_ADCR_TO_DAC1L_SHIFT                   5  /* ADCR_TO_DAC1L */ +#define WM8994_ADCR_TO_DAC1L_WIDTH                   1  /* ADCR_TO_DAC1L */ +#define WM8994_ADCL_TO_DAC1L                    0x0010  /* ADCL_TO_DAC1L */ +#define WM8994_ADCL_TO_DAC1L_MASK               0x0010  /* ADCL_TO_DAC1L */ +#define WM8994_ADCL_TO_DAC1L_SHIFT                   4  /* ADCL_TO_DAC1L */ +#define WM8994_ADCL_TO_DAC1L_WIDTH                   1  /* ADCL_TO_DAC1L */ +#define WM8994_AIF2DACL_TO_DAC1L                0x0004  /* AIF2DACL_TO_DAC1L */ +#define WM8994_AIF2DACL_TO_DAC1L_MASK           0x0004  /* AIF2DACL_TO_DAC1L */ +#define WM8994_AIF2DACL_TO_DAC1L_SHIFT               2  /* AIF2DACL_TO_DAC1L */ +#define WM8994_AIF2DACL_TO_DAC1L_WIDTH               1  /* AIF2DACL_TO_DAC1L */ +#define WM8994_AIF1DAC2L_TO_DAC1L               0x0002  /* AIF1DAC2L_TO_DAC1L */ +#define WM8994_AIF1DAC2L_TO_DAC1L_MASK          0x0002  /* AIF1DAC2L_TO_DAC1L */ +#define WM8994_AIF1DAC2L_TO_DAC1L_SHIFT              1  /* AIF1DAC2L_TO_DAC1L */ +#define WM8994_AIF1DAC2L_TO_DAC1L_WIDTH              1  /* AIF1DAC2L_TO_DAC1L */ +#define WM8994_AIF1DAC1L_TO_DAC1L               0x0001  /* AIF1DAC1L_TO_DAC1L */ +#define WM8994_AIF1DAC1L_TO_DAC1L_MASK          0x0001  /* AIF1DAC1L_TO_DAC1L */ +#define WM8994_AIF1DAC1L_TO_DAC1L_SHIFT              0  /* AIF1DAC1L_TO_DAC1L */ +#define WM8994_AIF1DAC1L_TO_DAC1L_WIDTH              1  /* AIF1DAC1L_TO_DAC1L */ + +/* + * R1538 (0x602) - DAC1 Right Mixer Routing + */ +#define WM8994_ADCR_TO_DAC1R                    0x0020  /* ADCR_TO_DAC1R */ +#define WM8994_ADCR_TO_DAC1R_MASK               0x0020  /* ADCR_TO_DAC1R */ +#define WM8994_ADCR_TO_DAC1R_SHIFT                   5  /* ADCR_TO_DAC1R */ +#define WM8994_ADCR_TO_DAC1R_WIDTH                   1  /* ADCR_TO_DAC1R */ +#define WM8994_ADCL_TO_DAC1R                    0x0010  /* ADCL_TO_DAC1R */ +#define WM8994_ADCL_TO_DAC1R_MASK               0x0010  /* ADCL_TO_DAC1R */ +#define WM8994_ADCL_TO_DAC1R_SHIFT                   4  /* ADCL_TO_DAC1R */ +#define WM8994_ADCL_TO_DAC1R_WIDTH                   1  /* ADCL_TO_DAC1R */ +#define WM8994_AIF2DACR_TO_DAC1R                0x0004  /* AIF2DACR_TO_DAC1R */ +#define WM8994_AIF2DACR_TO_DAC1R_MASK           0x0004  /* AIF2DACR_TO_DAC1R */ +#define WM8994_AIF2DACR_TO_DAC1R_SHIFT               2  /* AIF2DACR_TO_DAC1R */ +#define WM8994_AIF2DACR_TO_DAC1R_WIDTH               1  /* AIF2DACR_TO_DAC1R */ +#define WM8994_AIF1DAC2R_TO_DAC1R               0x0002  /* AIF1DAC2R_TO_DAC1R */ +#define WM8994_AIF1DAC2R_TO_DAC1R_MASK          0x0002  /* AIF1DAC2R_TO_DAC1R */ +#define WM8994_AIF1DAC2R_TO_DAC1R_SHIFT              1  /* AIF1DAC2R_TO_DAC1R */ +#define WM8994_AIF1DAC2R_TO_DAC1R_WIDTH              1  /* AIF1DAC2R_TO_DAC1R */ +#define WM8994_AIF1DAC1R_TO_DAC1R               0x0001  /* AIF1DAC1R_TO_DAC1R */ +#define WM8994_AIF1DAC1R_TO_DAC1R_MASK          0x0001  /* AIF1DAC1R_TO_DAC1R */ +#define WM8994_AIF1DAC1R_TO_DAC1R_SHIFT              0  /* AIF1DAC1R_TO_DAC1R */ +#define WM8994_AIF1DAC1R_TO_DAC1R_WIDTH              1  /* AIF1DAC1R_TO_DAC1R */ + +/* + * R1539 (0x603) - DAC2 Mixer Volumes + */ +#define WM8994_ADCR_DAC2_VOL_MASK               0x01E0  /* ADCR_DAC2_VOL - [8:5] */ +#define WM8994_ADCR_DAC2_VOL_SHIFT                   5  /* ADCR_DAC2_VOL - [8:5] */ +#define WM8994_ADCR_DAC2_VOL_WIDTH                   4  /* ADCR_DAC2_VOL - [8:5] */ +#define WM8994_ADCL_DAC2_VOL_MASK               0x000F  /* ADCL_DAC2_VOL - [3:0] */ +#define WM8994_ADCL_DAC2_VOL_SHIFT                   0  /* ADCL_DAC2_VOL - [3:0] */ +#define WM8994_ADCL_DAC2_VOL_WIDTH                   4  /* ADCL_DAC2_VOL - [3:0] */ + +/* + * R1540 (0x604) - DAC2 Left Mixer Routing + */ +#define WM8994_ADCR_TO_DAC2L                    0x0020  /* ADCR_TO_DAC2L */ +#define WM8994_ADCR_TO_DAC2L_MASK               0x0020  /* ADCR_TO_DAC2L */ +#define WM8994_ADCR_TO_DAC2L_SHIFT                   5  /* ADCR_TO_DAC2L */ +#define WM8994_ADCR_TO_DAC2L_WIDTH                   1  /* ADCR_TO_DAC2L */ +#define WM8994_ADCL_TO_DAC2L                    0x0010  /* ADCL_TO_DAC2L */ +#define WM8994_ADCL_TO_DAC2L_MASK               0x0010  /* ADCL_TO_DAC2L */ +#define WM8994_ADCL_TO_DAC2L_SHIFT                   4  /* ADCL_TO_DAC2L */ +#define WM8994_ADCL_TO_DAC2L_WIDTH                   1  /* ADCL_TO_DAC2L */ +#define WM8994_AIF2DACL_TO_DAC2L                0x0004  /* AIF2DACL_TO_DAC2L */ +#define WM8994_AIF2DACL_TO_DAC2L_MASK           0x0004  /* AIF2DACL_TO_DAC2L */ +#define WM8994_AIF2DACL_TO_DAC2L_SHIFT               2  /* AIF2DACL_TO_DAC2L */ +#define WM8994_AIF2DACL_TO_DAC2L_WIDTH               1  /* AIF2DACL_TO_DAC2L */ +#define WM8994_AIF1DAC2L_TO_DAC2L               0x0002  /* AIF1DAC2L_TO_DAC2L */ +#define WM8994_AIF1DAC2L_TO_DAC2L_MASK          0x0002  /* AIF1DAC2L_TO_DAC2L */ +#define WM8994_AIF1DAC2L_TO_DAC2L_SHIFT              1  /* AIF1DAC2L_TO_DAC2L */ +#define WM8994_AIF1DAC2L_TO_DAC2L_WIDTH              1  /* AIF1DAC2L_TO_DAC2L */ +#define WM8994_AIF1DAC1L_TO_DAC2L               0x0001  /* AIF1DAC1L_TO_DAC2L */ +#define WM8994_AIF1DAC1L_TO_DAC2L_MASK          0x0001  /* AIF1DAC1L_TO_DAC2L */ +#define WM8994_AIF1DAC1L_TO_DAC2L_SHIFT              0  /* AIF1DAC1L_TO_DAC2L */ +#define WM8994_AIF1DAC1L_TO_DAC2L_WIDTH              1  /* AIF1DAC1L_TO_DAC2L */ + +/* + * R1541 (0x605) - DAC2 Right Mixer Routing + */ +#define WM8994_ADCR_TO_DAC2R                    0x0020  /* ADCR_TO_DAC2R */ +#define WM8994_ADCR_TO_DAC2R_MASK               0x0020  /* ADCR_TO_DAC2R */ +#define WM8994_ADCR_TO_DAC2R_SHIFT                   5  /* ADCR_TO_DAC2R */ +#define WM8994_ADCR_TO_DAC2R_WIDTH                   1  /* ADCR_TO_DAC2R */ +#define WM8994_ADCL_TO_DAC2R                    0x0010  /* ADCL_TO_DAC2R */ +#define WM8994_ADCL_TO_DAC2R_MASK               0x0010  /* ADCL_TO_DAC2R */ +#define WM8994_ADCL_TO_DAC2R_SHIFT                   4  /* ADCL_TO_DAC2R */ +#define WM8994_ADCL_TO_DAC2R_WIDTH                   1  /* ADCL_TO_DAC2R */ +#define WM8994_AIF2DACR_TO_DAC2R                0x0004  /* AIF2DACR_TO_DAC2R */ +#define WM8994_AIF2DACR_TO_DAC2R_MASK           0x0004  /* AIF2DACR_TO_DAC2R */ +#define WM8994_AIF2DACR_TO_DAC2R_SHIFT               2  /* AIF2DACR_TO_DAC2R */ +#define WM8994_AIF2DACR_TO_DAC2R_WIDTH               1  /* AIF2DACR_TO_DAC2R */ +#define WM8994_AIF1DAC2R_TO_DAC2R               0x0002  /* AIF1DAC2R_TO_DAC2R */ +#define WM8994_AIF1DAC2R_TO_DAC2R_MASK          0x0002  /* AIF1DAC2R_TO_DAC2R */ +#define WM8994_AIF1DAC2R_TO_DAC2R_SHIFT              1  /* AIF1DAC2R_TO_DAC2R */ +#define WM8994_AIF1DAC2R_TO_DAC2R_WIDTH              1  /* AIF1DAC2R_TO_DAC2R */ +#define WM8994_AIF1DAC1R_TO_DAC2R               0x0001  /* AIF1DAC1R_TO_DAC2R */ +#define WM8994_AIF1DAC1R_TO_DAC2R_MASK          0x0001  /* AIF1DAC1R_TO_DAC2R */ +#define WM8994_AIF1DAC1R_TO_DAC2R_SHIFT              0  /* AIF1DAC1R_TO_DAC2R */ +#define WM8994_AIF1DAC1R_TO_DAC2R_WIDTH              1  /* AIF1DAC1R_TO_DAC2R */ + +/* + * R1542 (0x606) - AIF1 ADC1 Left Mixer Routing + */ +#define WM8994_ADC1L_TO_AIF1ADC1L               0x0002  /* ADC1L_TO_AIF1ADC1L */ +#define WM8994_ADC1L_TO_AIF1ADC1L_MASK          0x0002  /* ADC1L_TO_AIF1ADC1L */ +#define WM8994_ADC1L_TO_AIF1ADC1L_SHIFT              1  /* ADC1L_TO_AIF1ADC1L */ +#define WM8994_ADC1L_TO_AIF1ADC1L_WIDTH              1  /* ADC1L_TO_AIF1ADC1L */ +#define WM8994_AIF2DACL_TO_AIF1ADC1L            0x0001  /* AIF2DACL_TO_AIF1ADC1L */ +#define WM8994_AIF2DACL_TO_AIF1ADC1L_MASK       0x0001  /* AIF2DACL_TO_AIF1ADC1L */ +#define WM8994_AIF2DACL_TO_AIF1ADC1L_SHIFT           0  /* AIF2DACL_TO_AIF1ADC1L */ +#define WM8994_AIF2DACL_TO_AIF1ADC1L_WIDTH           1  /* AIF2DACL_TO_AIF1ADC1L */ + +/* + * R1543 (0x607) - AIF1 ADC1 Right Mixer Routing + */ +#define WM8994_ADC1R_TO_AIF1ADC1R               0x0002  /* ADC1R_TO_AIF1ADC1R */ +#define WM8994_ADC1R_TO_AIF1ADC1R_MASK          0x0002  /* ADC1R_TO_AIF1ADC1R */ +#define WM8994_ADC1R_TO_AIF1ADC1R_SHIFT              1  /* ADC1R_TO_AIF1ADC1R */ +#define WM8994_ADC1R_TO_AIF1ADC1R_WIDTH              1  /* ADC1R_TO_AIF1ADC1R */ +#define WM8994_AIF2DACR_TO_AIF1ADC1R            0x0001  /* AIF2DACR_TO_AIF1ADC1R */ +#define WM8994_AIF2DACR_TO_AIF1ADC1R_MASK       0x0001  /* AIF2DACR_TO_AIF1ADC1R */ +#define WM8994_AIF2DACR_TO_AIF1ADC1R_SHIFT           0  /* AIF2DACR_TO_AIF1ADC1R */ +#define WM8994_AIF2DACR_TO_AIF1ADC1R_WIDTH           1  /* AIF2DACR_TO_AIF1ADC1R */ + +/* + * R1544 (0x608) - AIF1 ADC2 Left Mixer Routing + */ +#define WM8994_ADC2L_TO_AIF1ADC2L               0x0002  /* ADC2L_TO_AIF1ADC2L */ +#define WM8994_ADC2L_TO_AIF1ADC2L_MASK          0x0002  /* ADC2L_TO_AIF1ADC2L */ +#define WM8994_ADC2L_TO_AIF1ADC2L_SHIFT              1  /* ADC2L_TO_AIF1ADC2L */ +#define WM8994_ADC2L_TO_AIF1ADC2L_WIDTH              1  /* ADC2L_TO_AIF1ADC2L */ +#define WM8994_AIF2DACL_TO_AIF1ADC2L            0x0001  /* AIF2DACL_TO_AIF1ADC2L */ +#define WM8994_AIF2DACL_TO_AIF1ADC2L_MASK       0x0001  /* AIF2DACL_TO_AIF1ADC2L */ +#define WM8994_AIF2DACL_TO_AIF1ADC2L_SHIFT           0  /* AIF2DACL_TO_AIF1ADC2L */ +#define WM8994_AIF2DACL_TO_AIF1ADC2L_WIDTH           1  /* AIF2DACL_TO_AIF1ADC2L */ + +/* + * R1545 (0x609) - AIF1 ADC2 Right mixer Routing + */ +#define WM8994_ADC2R_TO_AIF1ADC2R               0x0002  /* ADC2R_TO_AIF1ADC2R */ +#define WM8994_ADC2R_TO_AIF1ADC2R_MASK          0x0002  /* ADC2R_TO_AIF1ADC2R */ +#define WM8994_ADC2R_TO_AIF1ADC2R_SHIFT              1  /* ADC2R_TO_AIF1ADC2R */ +#define WM8994_ADC2R_TO_AIF1ADC2R_WIDTH              1  /* ADC2R_TO_AIF1ADC2R */ +#define WM8994_AIF2DACR_TO_AIF1ADC2R            0x0001  /* AIF2DACR_TO_AIF1ADC2R */ +#define WM8994_AIF2DACR_TO_AIF1ADC2R_MASK       0x0001  /* AIF2DACR_TO_AIF1ADC2R */ +#define WM8994_AIF2DACR_TO_AIF1ADC2R_SHIFT           0  /* AIF2DACR_TO_AIF1ADC2R */ +#define WM8994_AIF2DACR_TO_AIF1ADC2R_WIDTH           1  /* AIF2DACR_TO_AIF1ADC2R */ + +/* + * R1552 (0x610) - DAC1 Left Volume + */ +#define WM8994_DAC1L_MUTE                       0x0200  /* DAC1L_MUTE */ +#define WM8994_DAC1L_MUTE_MASK                  0x0200  /* DAC1L_MUTE */ +#define WM8994_DAC1L_MUTE_SHIFT                      9  /* DAC1L_MUTE */ +#define WM8994_DAC1L_MUTE_WIDTH                      1  /* DAC1L_MUTE */ +#define WM8994_DAC1_VU                          0x0100  /* DAC1_VU */ +#define WM8994_DAC1_VU_MASK                     0x0100  /* DAC1_VU */ +#define WM8994_DAC1_VU_SHIFT                         8  /* DAC1_VU */ +#define WM8994_DAC1_VU_WIDTH                         1  /* DAC1_VU */ +#define WM8994_DAC1L_VOL_MASK                   0x00FF  /* DAC1L_VOL - [7:0] */ +#define WM8994_DAC1L_VOL_SHIFT                       0  /* DAC1L_VOL - [7:0] */ +#define WM8994_DAC1L_VOL_WIDTH                       8  /* DAC1L_VOL - [7:0] */ + +/* + * R1553 (0x611) - DAC1 Right Volume + */ +#define WM8994_DAC1R_MUTE                       0x0200  /* DAC1R_MUTE */ +#define WM8994_DAC1R_MUTE_MASK                  0x0200  /* DAC1R_MUTE */ +#define WM8994_DAC1R_MUTE_SHIFT                      9  /* DAC1R_MUTE */ +#define WM8994_DAC1R_MUTE_WIDTH                      1  /* DAC1R_MUTE */ +#define WM8994_DAC1_VU                          0x0100  /* DAC1_VU */ +#define WM8994_DAC1_VU_MASK                     0x0100  /* DAC1_VU */ +#define WM8994_DAC1_VU_SHIFT                         8  /* DAC1_VU */ +#define WM8994_DAC1_VU_WIDTH                         1  /* DAC1_VU */ +#define WM8994_DAC1R_VOL_MASK                   0x00FF  /* DAC1R_VOL - [7:0] */ +#define WM8994_DAC1R_VOL_SHIFT                       0  /* DAC1R_VOL - [7:0] */ +#define WM8994_DAC1R_VOL_WIDTH                       8  /* DAC1R_VOL - [7:0] */ + +/* + * R1554 (0x612) - DAC2 Left Volume + */ +#define WM8994_DAC2L_MUTE                       0x0200  /* DAC2L_MUTE */ +#define WM8994_DAC2L_MUTE_MASK                  0x0200  /* DAC2L_MUTE */ +#define WM8994_DAC2L_MUTE_SHIFT                      9  /* DAC2L_MUTE */ +#define WM8994_DAC2L_MUTE_WIDTH                      1  /* DAC2L_MUTE */ +#define WM8994_DAC2_VU                          0x0100  /* DAC2_VU */ +#define WM8994_DAC2_VU_MASK                     0x0100  /* DAC2_VU */ +#define WM8994_DAC2_VU_SHIFT                         8  /* DAC2_VU */ +#define WM8994_DAC2_VU_WIDTH                         1  /* DAC2_VU */ +#define WM8994_DAC2L_VOL_MASK                   0x00FF  /* DAC2L_VOL - [7:0] */ +#define WM8994_DAC2L_VOL_SHIFT                       0  /* DAC2L_VOL - [7:0] */ +#define WM8994_DAC2L_VOL_WIDTH                       8  /* DAC2L_VOL - [7:0] */ + +/* + * R1555 (0x613) - DAC2 Right Volume + */ +#define WM8994_DAC2R_MUTE                       0x0200  /* DAC2R_MUTE */ +#define WM8994_DAC2R_MUTE_MASK                  0x0200  /* DAC2R_MUTE */ +#define WM8994_DAC2R_MUTE_SHIFT                      9  /* DAC2R_MUTE */ +#define WM8994_DAC2R_MUTE_WIDTH                      1  /* DAC2R_MUTE */ +#define WM8994_DAC2_VU                          0x0100  /* DAC2_VU */ +#define WM8994_DAC2_VU_MASK                     0x0100  /* DAC2_VU */ +#define WM8994_DAC2_VU_SHIFT                         8  /* DAC2_VU */ +#define WM8994_DAC2_VU_WIDTH                         1  /* DAC2_VU */ +#define WM8994_DAC2R_VOL_MASK                   0x00FF  /* DAC2R_VOL - [7:0] */ +#define WM8994_DAC2R_VOL_SHIFT                       0  /* DAC2R_VOL - [7:0] */ +#define WM8994_DAC2R_VOL_WIDTH                       8  /* DAC2R_VOL - [7:0] */ + +/* + * R1556 (0x614) - DAC Softmute + */ +#define WM8994_DAC_SOFTMUTEMODE                 0x0002  /* DAC_SOFTMUTEMODE */ +#define WM8994_DAC_SOFTMUTEMODE_MASK            0x0002  /* DAC_SOFTMUTEMODE */ +#define WM8994_DAC_SOFTMUTEMODE_SHIFT                1  /* DAC_SOFTMUTEMODE */ +#define WM8994_DAC_SOFTMUTEMODE_WIDTH                1  /* DAC_SOFTMUTEMODE */ +#define WM8994_DAC_MUTERATE                     0x0001  /* DAC_MUTERATE */ +#define WM8994_DAC_MUTERATE_MASK                0x0001  /* DAC_MUTERATE */ +#define WM8994_DAC_MUTERATE_SHIFT                    0  /* DAC_MUTERATE */ +#define WM8994_DAC_MUTERATE_WIDTH                    1  /* DAC_MUTERATE */ + +/* + * R1568 (0x620) - Oversampling + */ +#define WM8994_ADC_OSR128                       0x0002  /* ADC_OSR128 */ +#define WM8994_ADC_OSR128_MASK                  0x0002  /* ADC_OSR128 */ +#define WM8994_ADC_OSR128_SHIFT                      1  /* ADC_OSR128 */ +#define WM8994_ADC_OSR128_WIDTH                      1  /* ADC_OSR128 */ +#define WM8994_DAC_OSR128                       0x0001  /* DAC_OSR128 */ +#define WM8994_DAC_OSR128_MASK                  0x0001  /* DAC_OSR128 */ +#define WM8994_DAC_OSR128_SHIFT                      0  /* DAC_OSR128 */ +#define WM8994_DAC_OSR128_WIDTH                      1  /* DAC_OSR128 */ + +/* + * R1569 (0x621) - Sidetone + */ +#define WM8994_ST_HPF_CUT_MASK                  0x0380  /* ST_HPF_CUT - [9:7] */ +#define WM8994_ST_HPF_CUT_SHIFT                      7  /* ST_HPF_CUT - [9:7] */ +#define WM8994_ST_HPF_CUT_WIDTH                      3  /* ST_HPF_CUT - [9:7] */ +#define WM8994_ST_HPF                           0x0040  /* ST_HPF */ +#define WM8994_ST_HPF_MASK                      0x0040  /* ST_HPF */ +#define WM8994_ST_HPF_SHIFT                          6  /* ST_HPF */ +#define WM8994_ST_HPF_WIDTH                          1  /* ST_HPF */ +#define WM8994_STR_SEL                          0x0002  /* STR_SEL */ +#define WM8994_STR_SEL_MASK                     0x0002  /* STR_SEL */ +#define WM8994_STR_SEL_SHIFT                         1  /* STR_SEL */ +#define WM8994_STR_SEL_WIDTH                         1  /* STR_SEL */ +#define WM8994_STL_SEL                          0x0001  /* STL_SEL */ +#define WM8994_STL_SEL_MASK                     0x0001  /* STL_SEL */ +#define WM8994_STL_SEL_SHIFT                         0  /* STL_SEL */ +#define WM8994_STL_SEL_WIDTH                         1  /* STL_SEL */ + +/* + * R1824 (0x720) - Pull Control (1) + */ +#define WM8994_DMICDAT2_PU                      0x0800  /* DMICDAT2_PU */ +#define WM8994_DMICDAT2_PU_MASK                 0x0800  /* DMICDAT2_PU */ +#define WM8994_DMICDAT2_PU_SHIFT                    11  /* DMICDAT2_PU */ +#define WM8994_DMICDAT2_PU_WIDTH                     1  /* DMICDAT2_PU */ +#define WM8994_DMICDAT2_PD                      0x0400  /* DMICDAT2_PD */ +#define WM8994_DMICDAT2_PD_MASK                 0x0400  /* DMICDAT2_PD */ +#define WM8994_DMICDAT2_PD_SHIFT                    10  /* DMICDAT2_PD */ +#define WM8994_DMICDAT2_PD_WIDTH                     1  /* DMICDAT2_PD */ +#define WM8994_DMICDAT1_PU                      0x0200  /* DMICDAT1_PU */ +#define WM8994_DMICDAT1_PU_MASK                 0x0200  /* DMICDAT1_PU */ +#define WM8994_DMICDAT1_PU_SHIFT                     9  /* DMICDAT1_PU */ +#define WM8994_DMICDAT1_PU_WIDTH                     1  /* DMICDAT1_PU */ +#define WM8994_DMICDAT1_PD                      0x0100  /* DMICDAT1_PD */ +#define WM8994_DMICDAT1_PD_MASK                 0x0100  /* DMICDAT1_PD */ +#define WM8994_DMICDAT1_PD_SHIFT                     8  /* DMICDAT1_PD */ +#define WM8994_DMICDAT1_PD_WIDTH                     1  /* DMICDAT1_PD */ +#define WM8994_MCLK1_PU                         0x0080  /* MCLK1_PU */ +#define WM8994_MCLK1_PU_MASK                    0x0080  /* MCLK1_PU */ +#define WM8994_MCLK1_PU_SHIFT                        7  /* MCLK1_PU */ +#define WM8994_MCLK1_PU_WIDTH                        1  /* MCLK1_PU */ +#define WM8994_MCLK1_PD                         0x0040  /* MCLK1_PD */ +#define WM8994_MCLK1_PD_MASK                    0x0040  /* MCLK1_PD */ +#define WM8994_MCLK1_PD_SHIFT                        6  /* MCLK1_PD */ +#define WM8994_MCLK1_PD_WIDTH                        1  /* MCLK1_PD */ +#define WM8994_DACDAT1_PU                       0x0020  /* DACDAT1_PU */ +#define WM8994_DACDAT1_PU_MASK                  0x0020  /* DACDAT1_PU */ +#define WM8994_DACDAT1_PU_SHIFT                      5  /* DACDAT1_PU */ +#define WM8994_DACDAT1_PU_WIDTH                      1  /* DACDAT1_PU */ +#define WM8994_DACDAT1_PD                       0x0010  /* DACDAT1_PD */ +#define WM8994_DACDAT1_PD_MASK                  0x0010  /* DACDAT1_PD */ +#define WM8994_DACDAT1_PD_SHIFT                      4  /* DACDAT1_PD */ +#define WM8994_DACDAT1_PD_WIDTH                      1  /* DACDAT1_PD */ +#define WM8994_DACLRCLK1_PU                     0x0008  /* DACLRCLK1_PU */ +#define WM8994_DACLRCLK1_PU_MASK                0x0008  /* DACLRCLK1_PU */ +#define WM8994_DACLRCLK1_PU_SHIFT                    3  /* DACLRCLK1_PU */ +#define WM8994_DACLRCLK1_PU_WIDTH                    1  /* DACLRCLK1_PU */ +#define WM8994_DACLRCLK1_PD                     0x0004  /* DACLRCLK1_PD */ +#define WM8994_DACLRCLK1_PD_MASK                0x0004  /* DACLRCLK1_PD */ +#define WM8994_DACLRCLK1_PD_SHIFT                    2  /* DACLRCLK1_PD */ +#define WM8994_DACLRCLK1_PD_WIDTH                    1  /* DACLRCLK1_PD */ +#define WM8994_BCLK1_PU                         0x0002  /* BCLK1_PU */ +#define WM8994_BCLK1_PU_MASK                    0x0002  /* BCLK1_PU */ +#define WM8994_BCLK1_PU_SHIFT                        1  /* BCLK1_PU */ +#define WM8994_BCLK1_PU_WIDTH                        1  /* BCLK1_PU */ +#define WM8994_BCLK1_PD                         0x0001  /* BCLK1_PD */ +#define WM8994_BCLK1_PD_MASK                    0x0001  /* BCLK1_PD */ +#define WM8994_BCLK1_PD_SHIFT                        0  /* BCLK1_PD */ +#define WM8994_BCLK1_PD_WIDTH                        1  /* BCLK1_PD */ + +/* + * R1825 (0x721) - Pull Control (2) + */ +#define WM8994_CSNADDR_PD                       0x0100  /* CSNADDR_PD */ +#define WM8994_CSNADDR_PD_MASK                  0x0100  /* CSNADDR_PD */ +#define WM8994_CSNADDR_PD_SHIFT                      8  /* CSNADDR_PD */ +#define WM8994_CSNADDR_PD_WIDTH                      1  /* CSNADDR_PD */ +#define WM8994_LDO2ENA_PD                       0x0040  /* LDO2ENA_PD */ +#define WM8994_LDO2ENA_PD_MASK                  0x0040  /* LDO2ENA_PD */ +#define WM8994_LDO2ENA_PD_SHIFT                      6  /* LDO2ENA_PD */ +#define WM8994_LDO2ENA_PD_WIDTH                      1  /* LDO2ENA_PD */ +#define WM8994_LDO1ENA_PD                       0x0010  /* LDO1ENA_PD */ +#define WM8994_LDO1ENA_PD_MASK                  0x0010  /* LDO1ENA_PD */ +#define WM8994_LDO1ENA_PD_SHIFT                      4  /* LDO1ENA_PD */ +#define WM8994_LDO1ENA_PD_WIDTH                      1  /* LDO1ENA_PD */ +#define WM8994_CIFMODE_PD                       0x0004  /* CIFMODE_PD */ +#define WM8994_CIFMODE_PD_MASK                  0x0004  /* CIFMODE_PD */ +#define WM8994_CIFMODE_PD_SHIFT                      2  /* CIFMODE_PD */ +#define WM8994_CIFMODE_PD_WIDTH                      1  /* CIFMODE_PD */ +#define WM8994_SPKMODE_PU                       0x0002  /* SPKMODE_PU */ +#define WM8994_SPKMODE_PU_MASK                  0x0002  /* SPKMODE_PU */ +#define WM8994_SPKMODE_PU_SHIFT                      1  /* SPKMODE_PU */ +#define WM8994_SPKMODE_PU_WIDTH                      1  /* SPKMODE_PU */ + +/* + * R1840 (0x730) - Interrupt Status 1 + */ +#define WM8994_GP11_EINT                        0x0400  /* GP11_EINT */ +#define WM8994_GP11_EINT_MASK                   0x0400  /* GP11_EINT */ +#define WM8994_GP11_EINT_SHIFT                      10  /* GP11_EINT */ +#define WM8994_GP11_EINT_WIDTH                       1  /* GP11_EINT */ +#define WM8994_GP10_EINT                        0x0200  /* GP10_EINT */ +#define WM8994_GP10_EINT_MASK                   0x0200  /* GP10_EINT */ +#define WM8994_GP10_EINT_SHIFT                       9  /* GP10_EINT */ +#define WM8994_GP10_EINT_WIDTH                       1  /* GP10_EINT */ +#define WM8994_GP9_EINT                         0x0100  /* GP9_EINT */ +#define WM8994_GP9_EINT_MASK                    0x0100  /* GP9_EINT */ +#define WM8994_GP9_EINT_SHIFT                        8  /* GP9_EINT */ +#define WM8994_GP9_EINT_WIDTH                        1  /* GP9_EINT */ +#define WM8994_GP8_EINT                         0x0080  /* GP8_EINT */ +#define WM8994_GP8_EINT_MASK                    0x0080  /* GP8_EINT */ +#define WM8994_GP8_EINT_SHIFT                        7  /* GP8_EINT */ +#define WM8994_GP8_EINT_WIDTH                        1  /* GP8_EINT */ +#define WM8994_GP7_EINT                         0x0040  /* GP7_EINT */ +#define WM8994_GP7_EINT_MASK                    0x0040  /* GP7_EINT */ +#define WM8994_GP7_EINT_SHIFT                        6  /* GP7_EINT */ +#define WM8994_GP7_EINT_WIDTH                        1  /* GP7_EINT */ +#define WM8994_GP6_EINT                         0x0020  /* GP6_EINT */ +#define WM8994_GP6_EINT_MASK                    0x0020  /* GP6_EINT */ +#define WM8994_GP6_EINT_SHIFT                        5  /* GP6_EINT */ +#define WM8994_GP6_EINT_WIDTH                        1  /* GP6_EINT */ +#define WM8994_GP5_EINT                         0x0010  /* GP5_EINT */ +#define WM8994_GP5_EINT_MASK                    0x0010  /* GP5_EINT */ +#define WM8994_GP5_EINT_SHIFT                        4  /* GP5_EINT */ +#define WM8994_GP5_EINT_WIDTH                        1  /* GP5_EINT */ +#define WM8994_GP4_EINT                         0x0008  /* GP4_EINT */ +#define WM8994_GP4_EINT_MASK                    0x0008  /* GP4_EINT */ +#define WM8994_GP4_EINT_SHIFT                        3  /* GP4_EINT */ +#define WM8994_GP4_EINT_WIDTH                        1  /* GP4_EINT */ +#define WM8994_GP3_EINT                         0x0004  /* GP3_EINT */ +#define WM8994_GP3_EINT_MASK                    0x0004  /* GP3_EINT */ +#define WM8994_GP3_EINT_SHIFT                        2  /* GP3_EINT */ +#define WM8994_GP3_EINT_WIDTH                        1  /* GP3_EINT */ +#define WM8994_GP2_EINT                         0x0002  /* GP2_EINT */ +#define WM8994_GP2_EINT_MASK                    0x0002  /* GP2_EINT */ +#define WM8994_GP2_EINT_SHIFT                        1  /* GP2_EINT */ +#define WM8994_GP2_EINT_WIDTH                        1  /* GP2_EINT */ +#define WM8994_GP1_EINT                         0x0001  /* GP1_EINT */ +#define WM8994_GP1_EINT_MASK                    0x0001  /* GP1_EINT */ +#define WM8994_GP1_EINT_SHIFT                        0  /* GP1_EINT */ +#define WM8994_GP1_EINT_WIDTH                        1  /* GP1_EINT */ + +/* + * R1841 (0x731) - Interrupt Status 2 + */ +#define WM8994_TEMP_WARN_EINT                   0x8000  /* TEMP_WARN_EINT */ +#define WM8994_TEMP_WARN_EINT_MASK              0x8000  /* TEMP_WARN_EINT */ +#define WM8994_TEMP_WARN_EINT_SHIFT                 15  /* TEMP_WARN_EINT */ +#define WM8994_TEMP_WARN_EINT_WIDTH                  1  /* TEMP_WARN_EINT */ +#define WM8994_DCS_DONE_EINT                    0x4000  /* DCS_DONE_EINT */ +#define WM8994_DCS_DONE_EINT_MASK               0x4000  /* DCS_DONE_EINT */ +#define WM8994_DCS_DONE_EINT_SHIFT                  14  /* DCS_DONE_EINT */ +#define WM8994_DCS_DONE_EINT_WIDTH                   1  /* DCS_DONE_EINT */ +#define WM8994_WSEQ_DONE_EINT                   0x2000  /* WSEQ_DONE_EINT */ +#define WM8994_WSEQ_DONE_EINT_MASK              0x2000  /* WSEQ_DONE_EINT */ +#define WM8994_WSEQ_DONE_EINT_SHIFT                 13  /* WSEQ_DONE_EINT */ +#define WM8994_WSEQ_DONE_EINT_WIDTH                  1  /* WSEQ_DONE_EINT */ +#define WM8994_FIFOS_ERR_EINT                   0x1000  /* FIFOS_ERR_EINT */ +#define WM8994_FIFOS_ERR_EINT_MASK              0x1000  /* FIFOS_ERR_EINT */ +#define WM8994_FIFOS_ERR_EINT_SHIFT                 12  /* FIFOS_ERR_EINT */ +#define WM8994_FIFOS_ERR_EINT_WIDTH                  1  /* FIFOS_ERR_EINT */ +#define WM8994_AIF2DRC_SIG_DET_EINT             0x0800  /* AIF2DRC_SIG_DET_EINT */ +#define WM8994_AIF2DRC_SIG_DET_EINT_MASK        0x0800  /* AIF2DRC_SIG_DET_EINT */ +#define WM8994_AIF2DRC_SIG_DET_EINT_SHIFT           11  /* AIF2DRC_SIG_DET_EINT */ +#define WM8994_AIF2DRC_SIG_DET_EINT_WIDTH            1  /* AIF2DRC_SIG_DET_EINT */ +#define WM8994_AIF1DRC2_SIG_DET_EINT            0x0400  /* AIF1DRC2_SIG_DET_EINT */ +#define WM8994_AIF1DRC2_SIG_DET_EINT_MASK       0x0400  /* AIF1DRC2_SIG_DET_EINT */ +#define WM8994_AIF1DRC2_SIG_DET_EINT_SHIFT          10  /* AIF1DRC2_SIG_DET_EINT */ +#define WM8994_AIF1DRC2_SIG_DET_EINT_WIDTH           1  /* AIF1DRC2_SIG_DET_EINT */ +#define WM8994_AIF1DRC1_SIG_DET_EINT            0x0200  /* AIF1DRC1_SIG_DET_EINT */ +#define WM8994_AIF1DRC1_SIG_DET_EINT_MASK       0x0200  /* AIF1DRC1_SIG_DET_EINT */ +#define WM8994_AIF1DRC1_SIG_DET_EINT_SHIFT           9  /* AIF1DRC1_SIG_DET_EINT */ +#define WM8994_AIF1DRC1_SIG_DET_EINT_WIDTH           1  /* AIF1DRC1_SIG_DET_EINT */ +#define WM8994_SRC2_LOCK_EINT                   0x0100  /* SRC2_LOCK_EINT */ +#define WM8994_SRC2_LOCK_EINT_MASK              0x0100  /* SRC2_LOCK_EINT */ +#define WM8994_SRC2_LOCK_EINT_SHIFT                  8  /* SRC2_LOCK_EINT */ +#define WM8994_SRC2_LOCK_EINT_WIDTH                  1  /* SRC2_LOCK_EINT */ +#define WM8994_SRC1_LOCK_EINT                   0x0080  /* SRC1_LOCK_EINT */ +#define WM8994_SRC1_LOCK_EINT_MASK              0x0080  /* SRC1_LOCK_EINT */ +#define WM8994_SRC1_LOCK_EINT_SHIFT                  7  /* SRC1_LOCK_EINT */ +#define WM8994_SRC1_LOCK_EINT_WIDTH                  1  /* SRC1_LOCK_EINT */ +#define WM8994_FLL2_LOCK_EINT                   0x0040  /* FLL2_LOCK_EINT */ +#define WM8994_FLL2_LOCK_EINT_MASK              0x0040  /* FLL2_LOCK_EINT */ +#define WM8994_FLL2_LOCK_EINT_SHIFT                  6  /* FLL2_LOCK_EINT */ +#define WM8994_FLL2_LOCK_EINT_WIDTH                  1  /* FLL2_LOCK_EINT */ +#define WM8994_FLL1_LOCK_EINT                   0x0020  /* FLL1_LOCK_EINT */ +#define WM8994_FLL1_LOCK_EINT_MASK              0x0020  /* FLL1_LOCK_EINT */ +#define WM8994_FLL1_LOCK_EINT_SHIFT                  5  /* FLL1_LOCK_EINT */ +#define WM8994_FLL1_LOCK_EINT_WIDTH                  1  /* FLL1_LOCK_EINT */ +#define WM8994_MIC2_SHRT_EINT                   0x0010  /* MIC2_SHRT_EINT */ +#define WM8994_MIC2_SHRT_EINT_MASK              0x0010  /* MIC2_SHRT_EINT */ +#define WM8994_MIC2_SHRT_EINT_SHIFT                  4  /* MIC2_SHRT_EINT */ +#define WM8994_MIC2_SHRT_EINT_WIDTH                  1  /* MIC2_SHRT_EINT */ +#define WM8994_MIC2_DET_EINT                    0x0008  /* MIC2_DET_EINT */ +#define WM8994_MIC2_DET_EINT_MASK               0x0008  /* MIC2_DET_EINT */ +#define WM8994_MIC2_DET_EINT_SHIFT                   3  /* MIC2_DET_EINT */ +#define WM8994_MIC2_DET_EINT_WIDTH                   1  /* MIC2_DET_EINT */ +#define WM8994_MIC1_SHRT_EINT                   0x0004  /* MIC1_SHRT_EINT */ +#define WM8994_MIC1_SHRT_EINT_MASK              0x0004  /* MIC1_SHRT_EINT */ +#define WM8994_MIC1_SHRT_EINT_SHIFT                  2  /* MIC1_SHRT_EINT */ +#define WM8994_MIC1_SHRT_EINT_WIDTH                  1  /* MIC1_SHRT_EINT */ +#define WM8994_MIC1_DET_EINT                    0x0002  /* MIC1_DET_EINT */ +#define WM8994_MIC1_DET_EINT_MASK               0x0002  /* MIC1_DET_EINT */ +#define WM8994_MIC1_DET_EINT_SHIFT                   1  /* MIC1_DET_EINT */ +#define WM8994_MIC1_DET_EINT_WIDTH                   1  /* MIC1_DET_EINT */ +#define WM8994_TEMP_SHUT_EINT                   0x0001  /* TEMP_SHUT_EINT */ +#define WM8994_TEMP_SHUT_EINT_MASK              0x0001  /* TEMP_SHUT_EINT */ +#define WM8994_TEMP_SHUT_EINT_SHIFT                  0  /* TEMP_SHUT_EINT */ +#define WM8994_TEMP_SHUT_EINT_WIDTH                  1  /* TEMP_SHUT_EINT */ + +/* + * R1842 (0x732) - Interrupt Raw Status 2 + */ +#define WM8994_TEMP_WARN_STS                    0x8000  /* TEMP_WARN_STS */ +#define WM8994_TEMP_WARN_STS_MASK               0x8000  /* TEMP_WARN_STS */ +#define WM8994_TEMP_WARN_STS_SHIFT                  15  /* TEMP_WARN_STS */ +#define WM8994_TEMP_WARN_STS_WIDTH                   1  /* TEMP_WARN_STS */ +#define WM8994_DCS_DONE_STS                     0x4000  /* DCS_DONE_STS */ +#define WM8994_DCS_DONE_STS_MASK                0x4000  /* DCS_DONE_STS */ +#define WM8994_DCS_DONE_STS_SHIFT                   14  /* DCS_DONE_STS */ +#define WM8994_DCS_DONE_STS_WIDTH                    1  /* DCS_DONE_STS */ +#define WM8994_WSEQ_DONE_STS                    0x2000  /* WSEQ_DONE_STS */ +#define WM8994_WSEQ_DONE_STS_MASK               0x2000  /* WSEQ_DONE_STS */ +#define WM8994_WSEQ_DONE_STS_SHIFT                  13  /* WSEQ_DONE_STS */ +#define WM8994_WSEQ_DONE_STS_WIDTH                   1  /* WSEQ_DONE_STS */ +#define WM8994_FIFOS_ERR_STS                    0x1000  /* FIFOS_ERR_STS */ +#define WM8994_FIFOS_ERR_STS_MASK               0x1000  /* FIFOS_ERR_STS */ +#define WM8994_FIFOS_ERR_STS_SHIFT                  12  /* FIFOS_ERR_STS */ +#define WM8994_FIFOS_ERR_STS_WIDTH                   1  /* FIFOS_ERR_STS */ +#define WM8994_AIF2DRC_SIG_DET_STS              0x0800  /* AIF2DRC_SIG_DET_STS */ +#define WM8994_AIF2DRC_SIG_DET_STS_MASK         0x0800  /* AIF2DRC_SIG_DET_STS */ +#define WM8994_AIF2DRC_SIG_DET_STS_SHIFT            11  /* AIF2DRC_SIG_DET_STS */ +#define WM8994_AIF2DRC_SIG_DET_STS_WIDTH             1  /* AIF2DRC_SIG_DET_STS */ +#define WM8994_AIF1DRC2_SIG_DET_STS             0x0400  /* AIF1DRC2_SIG_DET_STS */ +#define WM8994_AIF1DRC2_SIG_DET_STS_MASK        0x0400  /* AIF1DRC2_SIG_DET_STS */ +#define WM8994_AIF1DRC2_SIG_DET_STS_SHIFT           10  /* AIF1DRC2_SIG_DET_STS */ +#define WM8994_AIF1DRC2_SIG_DET_STS_WIDTH            1  /* AIF1DRC2_SIG_DET_STS */ +#define WM8994_AIF1DRC1_SIG_DET_STS             0x0200  /* AIF1DRC1_SIG_DET_STS */ +#define WM8994_AIF1DRC1_SIG_DET_STS_MASK        0x0200  /* AIF1DRC1_SIG_DET_STS */ +#define WM8994_AIF1DRC1_SIG_DET_STS_SHIFT            9  /* AIF1DRC1_SIG_DET_STS */ +#define WM8994_AIF1DRC1_SIG_DET_STS_WIDTH            1  /* AIF1DRC1_SIG_DET_STS */ +#define WM8994_SRC2_LOCK_STS                    0x0100  /* SRC2_LOCK_STS */ +#define WM8994_SRC2_LOCK_STS_MASK               0x0100  /* SRC2_LOCK_STS */ +#define WM8994_SRC2_LOCK_STS_SHIFT                   8  /* SRC2_LOCK_STS */ +#define WM8994_SRC2_LOCK_STS_WIDTH                   1  /* SRC2_LOCK_STS */ +#define WM8994_SRC1_LOCK_STS                    0x0080  /* SRC1_LOCK_STS */ +#define WM8994_SRC1_LOCK_STS_MASK               0x0080  /* SRC1_LOCK_STS */ +#define WM8994_SRC1_LOCK_STS_SHIFT                   7  /* SRC1_LOCK_STS */ +#define WM8994_SRC1_LOCK_STS_WIDTH                   1  /* SRC1_LOCK_STS */ +#define WM8994_FLL2_LOCK_STS                    0x0040  /* FLL2_LOCK_STS */ +#define WM8994_FLL2_LOCK_STS_MASK               0x0040  /* FLL2_LOCK_STS */ +#define WM8994_FLL2_LOCK_STS_SHIFT                   6  /* FLL2_LOCK_STS */ +#define WM8994_FLL2_LOCK_STS_WIDTH                   1  /* FLL2_LOCK_STS */ +#define WM8994_FLL1_LOCK_STS                    0x0020  /* FLL1_LOCK_STS */ +#define WM8994_FLL1_LOCK_STS_MASK               0x0020  /* FLL1_LOCK_STS */ +#define WM8994_FLL1_LOCK_STS_SHIFT                   5  /* FLL1_LOCK_STS */ +#define WM8994_FLL1_LOCK_STS_WIDTH                   1  /* FLL1_LOCK_STS */ +#define WM8994_MIC2_SHRT_STS                    0x0010  /* MIC2_SHRT_STS */ +#define WM8994_MIC2_SHRT_STS_MASK               0x0010  /* MIC2_SHRT_STS */ +#define WM8994_MIC2_SHRT_STS_SHIFT                   4  /* MIC2_SHRT_STS */ +#define WM8994_MIC2_SHRT_STS_WIDTH                   1  /* MIC2_SHRT_STS */ +#define WM8994_MIC2_DET_STS                     0x0008  /* MIC2_DET_STS */ +#define WM8994_MIC2_DET_STS_MASK                0x0008  /* MIC2_DET_STS */ +#define WM8994_MIC2_DET_STS_SHIFT                    3  /* MIC2_DET_STS */ +#define WM8994_MIC2_DET_STS_WIDTH                    1  /* MIC2_DET_STS */ +#define WM8994_MIC1_SHRT_STS                    0x0004  /* MIC1_SHRT_STS */ +#define WM8994_MIC1_SHRT_STS_MASK               0x0004  /* MIC1_SHRT_STS */ +#define WM8994_MIC1_SHRT_STS_SHIFT                   2  /* MIC1_SHRT_STS */ +#define WM8994_MIC1_SHRT_STS_WIDTH                   1  /* MIC1_SHRT_STS */ +#define WM8994_MIC1_DET_STS                     0x0002  /* MIC1_DET_STS */ +#define WM8994_MIC1_DET_STS_MASK                0x0002  /* MIC1_DET_STS */ +#define WM8994_MIC1_DET_STS_SHIFT                    1  /* MIC1_DET_STS */ +#define WM8994_MIC1_DET_STS_WIDTH                    1  /* MIC1_DET_STS */ +#define WM8994_TEMP_SHUT_STS                    0x0001  /* TEMP_SHUT_STS */ +#define WM8994_TEMP_SHUT_STS_MASK               0x0001  /* TEMP_SHUT_STS */ +#define WM8994_TEMP_SHUT_STS_SHIFT                   0  /* TEMP_SHUT_STS */ +#define WM8994_TEMP_SHUT_STS_WIDTH                   1  /* TEMP_SHUT_STS */ + +/* + * R1848 (0x738) - Interrupt Status 1 Mask + */ +#define WM8994_IM_GP11_EINT                     0x0400  /* IM_GP11_EINT */ +#define WM8994_IM_GP11_EINT_MASK                0x0400  /* IM_GP11_EINT */ +#define WM8994_IM_GP11_EINT_SHIFT                   10  /* IM_GP11_EINT */ +#define WM8994_IM_GP11_EINT_WIDTH                    1  /* IM_GP11_EINT */ +#define WM8994_IM_GP10_EINT                     0x0200  /* IM_GP10_EINT */ +#define WM8994_IM_GP10_EINT_MASK                0x0200  /* IM_GP10_EINT */ +#define WM8994_IM_GP10_EINT_SHIFT                    9  /* IM_GP10_EINT */ +#define WM8994_IM_GP10_EINT_WIDTH                    1  /* IM_GP10_EINT */ +#define WM8994_IM_GP9_EINT                      0x0100  /* IM_GP9_EINT */ +#define WM8994_IM_GP9_EINT_MASK                 0x0100  /* IM_GP9_EINT */ +#define WM8994_IM_GP9_EINT_SHIFT                     8  /* IM_GP9_EINT */ +#define WM8994_IM_GP9_EINT_WIDTH                     1  /* IM_GP9_EINT */ +#define WM8994_IM_GP8_EINT                      0x0080  /* IM_GP8_EINT */ +#define WM8994_IM_GP8_EINT_MASK                 0x0080  /* IM_GP8_EINT */ +#define WM8994_IM_GP8_EINT_SHIFT                     7  /* IM_GP8_EINT */ +#define WM8994_IM_GP8_EINT_WIDTH                     1  /* IM_GP8_EINT */ +#define WM8994_IM_GP7_EINT                      0x0040  /* IM_GP7_EINT */ +#define WM8994_IM_GP7_EINT_MASK                 0x0040  /* IM_GP7_EINT */ +#define WM8994_IM_GP7_EINT_SHIFT                     6  /* IM_GP7_EINT */ +#define WM8994_IM_GP7_EINT_WIDTH                     1  /* IM_GP7_EINT */ +#define WM8994_IM_GP6_EINT                      0x0020  /* IM_GP6_EINT */ +#define WM8994_IM_GP6_EINT_MASK                 0x0020  /* IM_GP6_EINT */ +#define WM8994_IM_GP6_EINT_SHIFT                     5  /* IM_GP6_EINT */ +#define WM8994_IM_GP6_EINT_WIDTH                     1  /* IM_GP6_EINT */ +#define WM8994_IM_GP5_EINT                      0x0010  /* IM_GP5_EINT */ +#define WM8994_IM_GP5_EINT_MASK                 0x0010  /* IM_GP5_EINT */ +#define WM8994_IM_GP5_EINT_SHIFT                     4  /* IM_GP5_EINT */ +#define WM8994_IM_GP5_EINT_WIDTH                     1  /* IM_GP5_EINT */ +#define WM8994_IM_GP4_EINT                      0x0008  /* IM_GP4_EINT */ +#define WM8994_IM_GP4_EINT_MASK                 0x0008  /* IM_GP4_EINT */ +#define WM8994_IM_GP4_EINT_SHIFT                     3  /* IM_GP4_EINT */ +#define WM8994_IM_GP4_EINT_WIDTH                     1  /* IM_GP4_EINT */ +#define WM8994_IM_GP3_EINT                      0x0004  /* IM_GP3_EINT */ +#define WM8994_IM_GP3_EINT_MASK                 0x0004  /* IM_GP3_EINT */ +#define WM8994_IM_GP3_EINT_SHIFT                     2  /* IM_GP3_EINT */ +#define WM8994_IM_GP3_EINT_WIDTH                     1  /* IM_GP3_EINT */ +#define WM8994_IM_GP2_EINT                      0x0002  /* IM_GP2_EINT */ +#define WM8994_IM_GP2_EINT_MASK                 0x0002  /* IM_GP2_EINT */ +#define WM8994_IM_GP2_EINT_SHIFT                     1  /* IM_GP2_EINT */ +#define WM8994_IM_GP2_EINT_WIDTH                     1  /* IM_GP2_EINT */ +#define WM8994_IM_GP1_EINT                      0x0001  /* IM_GP1_EINT */ +#define WM8994_IM_GP1_EINT_MASK                 0x0001  /* IM_GP1_EINT */ +#define WM8994_IM_GP1_EINT_SHIFT                     0  /* IM_GP1_EINT */ +#define WM8994_IM_GP1_EINT_WIDTH                     1  /* IM_GP1_EINT */ + +/* + * R1849 (0x739) - Interrupt Status 2 Mask + */ +#define WM8994_IM_TEMP_WARN_EINT                0x8000  /* IM_TEMP_WARN_EINT */ +#define WM8994_IM_TEMP_WARN_EINT_MASK           0x8000  /* IM_TEMP_WARN_EINT */ +#define WM8994_IM_TEMP_WARN_EINT_SHIFT              15  /* IM_TEMP_WARN_EINT */ +#define WM8994_IM_TEMP_WARN_EINT_WIDTH               1  /* IM_TEMP_WARN_EINT */ +#define WM8994_IM_DCS_DONE_EINT                 0x4000  /* IM_DCS_DONE_EINT */ +#define WM8994_IM_DCS_DONE_EINT_MASK            0x4000  /* IM_DCS_DONE_EINT */ +#define WM8994_IM_DCS_DONE_EINT_SHIFT               14  /* IM_DCS_DONE_EINT */ +#define WM8994_IM_DCS_DONE_EINT_WIDTH                1  /* IM_DCS_DONE_EINT */ +#define WM8994_IM_WSEQ_DONE_EINT                0x2000  /* IM_WSEQ_DONE_EINT */ +#define WM8994_IM_WSEQ_DONE_EINT_MASK           0x2000  /* IM_WSEQ_DONE_EINT */ +#define WM8994_IM_WSEQ_DONE_EINT_SHIFT              13  /* IM_WSEQ_DONE_EINT */ +#define WM8994_IM_WSEQ_DONE_EINT_WIDTH               1  /* IM_WSEQ_DONE_EINT */ +#define WM8994_IM_FIFOS_ERR_EINT                0x1000  /* IM_FIFOS_ERR_EINT */ +#define WM8994_IM_FIFOS_ERR_EINT_MASK           0x1000  /* IM_FIFOS_ERR_EINT */ +#define WM8994_IM_FIFOS_ERR_EINT_SHIFT              12  /* IM_FIFOS_ERR_EINT */ +#define WM8994_IM_FIFOS_ERR_EINT_WIDTH               1  /* IM_FIFOS_ERR_EINT */ +#define WM8994_IM_AIF2DRC_SIG_DET_EINT          0x0800  /* IM_AIF2DRC_SIG_DET_EINT */ +#define WM8994_IM_AIF2DRC_SIG_DET_EINT_MASK     0x0800  /* IM_AIF2DRC_SIG_DET_EINT */ +#define WM8994_IM_AIF2DRC_SIG_DET_EINT_SHIFT        11  /* IM_AIF2DRC_SIG_DET_EINT */ +#define WM8994_IM_AIF2DRC_SIG_DET_EINT_WIDTH         1  /* IM_AIF2DRC_SIG_DET_EINT */ +#define WM8994_IM_AIF1DRC2_SIG_DET_EINT         0x0400  /* IM_AIF1DRC2_SIG_DET_EINT */ +#define WM8994_IM_AIF1DRC2_SIG_DET_EINT_MASK    0x0400  /* IM_AIF1DRC2_SIG_DET_EINT */ +#define WM8994_IM_AIF1DRC2_SIG_DET_EINT_SHIFT       10  /* IM_AIF1DRC2_SIG_DET_EINT */ +#define WM8994_IM_AIF1DRC2_SIG_DET_EINT_WIDTH        1  /* IM_AIF1DRC2_SIG_DET_EINT */ +#define WM8994_IM_AIF1DRC1_SIG_DET_EINT         0x0200  /* IM_AIF1DRC1_SIG_DET_EINT */ +#define WM8994_IM_AIF1DRC1_SIG_DET_EINT_MASK    0x0200  /* IM_AIF1DRC1_SIG_DET_EINT */ +#define WM8994_IM_AIF1DRC1_SIG_DET_EINT_SHIFT        9  /* IM_AIF1DRC1_SIG_DET_EINT */ +#define WM8994_IM_AIF1DRC1_SIG_DET_EINT_WIDTH        1  /* IM_AIF1DRC1_SIG_DET_EINT */ +#define WM8994_IM_SRC2_LOCK_EINT                0x0100  /* IM_SRC2_LOCK_EINT */ +#define WM8994_IM_SRC2_LOCK_EINT_MASK           0x0100  /* IM_SRC2_LOCK_EINT */ +#define WM8994_IM_SRC2_LOCK_EINT_SHIFT               8  /* IM_SRC2_LOCK_EINT */ +#define WM8994_IM_SRC2_LOCK_EINT_WIDTH               1  /* IM_SRC2_LOCK_EINT */ +#define WM8994_IM_SRC1_LOCK_EINT                0x0080  /* IM_SRC1_LOCK_EINT */ +#define WM8994_IM_SRC1_LOCK_EINT_MASK           0x0080  /* IM_SRC1_LOCK_EINT */ +#define WM8994_IM_SRC1_LOCK_EINT_SHIFT               7  /* IM_SRC1_LOCK_EINT */ +#define WM8994_IM_SRC1_LOCK_EINT_WIDTH               1  /* IM_SRC1_LOCK_EINT */ +#define WM8994_IM_FLL2_LOCK_EINT                0x0040  /* IM_FLL2_LOCK_EINT */ +#define WM8994_IM_FLL2_LOCK_EINT_MASK           0x0040  /* IM_FLL2_LOCK_EINT */ +#define WM8994_IM_FLL2_LOCK_EINT_SHIFT               6  /* IM_FLL2_LOCK_EINT */ +#define WM8994_IM_FLL2_LOCK_EINT_WIDTH               1  /* IM_FLL2_LOCK_EINT */ +#define WM8994_IM_FLL1_LOCK_EINT                0x0020  /* IM_FLL1_LOCK_EINT */ +#define WM8994_IM_FLL1_LOCK_EINT_MASK           0x0020  /* IM_FLL1_LOCK_EINT */ +#define WM8994_IM_FLL1_LOCK_EINT_SHIFT               5  /* IM_FLL1_LOCK_EINT */ +#define WM8994_IM_FLL1_LOCK_EINT_WIDTH               1  /* IM_FLL1_LOCK_EINT */ +#define WM8994_IM_MIC2_SHRT_EINT                0x0010  /* IM_MIC2_SHRT_EINT */ +#define WM8994_IM_MIC2_SHRT_EINT_MASK           0x0010  /* IM_MIC2_SHRT_EINT */ +#define WM8994_IM_MIC2_SHRT_EINT_SHIFT               4  /* IM_MIC2_SHRT_EINT */ +#define WM8994_IM_MIC2_SHRT_EINT_WIDTH               1  /* IM_MIC2_SHRT_EINT */ +#define WM8994_IM_MIC2_DET_EINT                 0x0008  /* IM_MIC2_DET_EINT */ +#define WM8994_IM_MIC2_DET_EINT_MASK            0x0008  /* IM_MIC2_DET_EINT */ +#define WM8994_IM_MIC2_DET_EINT_SHIFT                3  /* IM_MIC2_DET_EINT */ +#define WM8994_IM_MIC2_DET_EINT_WIDTH                1  /* IM_MIC2_DET_EINT */ +#define WM8994_IM_MIC1_SHRT_EINT                0x0004  /* IM_MIC1_SHRT_EINT */ +#define WM8994_IM_MIC1_SHRT_EINT_MASK           0x0004  /* IM_MIC1_SHRT_EINT */ +#define WM8994_IM_MIC1_SHRT_EINT_SHIFT               2  /* IM_MIC1_SHRT_EINT */ +#define WM8994_IM_MIC1_SHRT_EINT_WIDTH               1  /* IM_MIC1_SHRT_EINT */ +#define WM8994_IM_MIC1_DET_EINT                 0x0002  /* IM_MIC1_DET_EINT */ +#define WM8994_IM_MIC1_DET_EINT_MASK            0x0002  /* IM_MIC1_DET_EINT */ +#define WM8994_IM_MIC1_DET_EINT_SHIFT                1  /* IM_MIC1_DET_EINT */ +#define WM8994_IM_MIC1_DET_EINT_WIDTH                1  /* IM_MIC1_DET_EINT */ +#define WM8994_IM_TEMP_SHUT_EINT                0x0001  /* IM_TEMP_SHUT_EINT */ +#define WM8994_IM_TEMP_SHUT_EINT_MASK           0x0001  /* IM_TEMP_SHUT_EINT */ +#define WM8994_IM_TEMP_SHUT_EINT_SHIFT               0  /* IM_TEMP_SHUT_EINT */ +#define WM8994_IM_TEMP_SHUT_EINT_WIDTH               1  /* IM_TEMP_SHUT_EINT */ + +/* + * R1856 (0x740) - Interrupt Control + */ +#define WM8994_IM_IRQ                           0x0001  /* IM_IRQ */ +#define WM8994_IM_IRQ_MASK                      0x0001  /* IM_IRQ */ +#define WM8994_IM_IRQ_SHIFT                          0  /* IM_IRQ */ +#define WM8994_IM_IRQ_WIDTH                          1  /* IM_IRQ */ + +/* + * R1864 (0x748) - IRQ Debounce + */ +#define WM8994_TEMP_WARN_DB                     0x0020  /* TEMP_WARN_DB */ +#define WM8994_TEMP_WARN_DB_MASK                0x0020  /* TEMP_WARN_DB */ +#define WM8994_TEMP_WARN_DB_SHIFT                    5  /* TEMP_WARN_DB */ +#define WM8994_TEMP_WARN_DB_WIDTH                    1  /* TEMP_WARN_DB */ +#define WM8994_MIC2_SHRT_DB                     0x0010  /* MIC2_SHRT_DB */ +#define WM8994_MIC2_SHRT_DB_MASK                0x0010  /* MIC2_SHRT_DB */ +#define WM8994_MIC2_SHRT_DB_SHIFT                    4  /* MIC2_SHRT_DB */ +#define WM8994_MIC2_SHRT_DB_WIDTH                    1  /* MIC2_SHRT_DB */ +#define WM8994_MIC2_DET_DB                      0x0008  /* MIC2_DET_DB */ +#define WM8994_MIC2_DET_DB_MASK                 0x0008  /* MIC2_DET_DB */ +#define WM8994_MIC2_DET_DB_SHIFT                     3  /* MIC2_DET_DB */ +#define WM8994_MIC2_DET_DB_WIDTH                     1  /* MIC2_DET_DB */ +#define WM8994_MIC1_SHRT_DB                     0x0004  /* MIC1_SHRT_DB */ +#define WM8994_MIC1_SHRT_DB_MASK                0x0004  /* MIC1_SHRT_DB */ +#define WM8994_MIC1_SHRT_DB_SHIFT                    2  /* MIC1_SHRT_DB */ +#define WM8994_MIC1_SHRT_DB_WIDTH                    1  /* MIC1_SHRT_DB */ +#define WM8994_MIC1_DET_DB                      0x0002  /* MIC1_DET_DB */ +#define WM8994_MIC1_DET_DB_MASK                 0x0002  /* MIC1_DET_DB */ +#define WM8994_MIC1_DET_DB_SHIFT                     1  /* MIC1_DET_DB */ +#define WM8994_MIC1_DET_DB_WIDTH                     1  /* MIC1_DET_DB */ +#define WM8994_TEMP_SHUT_DB                     0x0001  /* TEMP_SHUT_DB */ +#define WM8994_TEMP_SHUT_DB_MASK                0x0001  /* TEMP_SHUT_DB */ +#define WM8994_TEMP_SHUT_DB_SHIFT                    0  /* TEMP_SHUT_DB */ +#define WM8994_TEMP_SHUT_DB_WIDTH                    1  /* TEMP_SHUT_DB */ + +#endif diff --git a/include/linux/migrate.h b/include/linux/migrate.h index 7f085c97c79..7238231b8dd 100644 --- a/include/linux/migrate.h +++ b/include/linux/migrate.h @@ -9,7 +9,7 @@ typedef struct page *new_page_t(struct page *, unsigned long private, int **);  #ifdef CONFIG_MIGRATION  #define PAGE_MIGRATION 1 -extern int putback_lru_pages(struct list_head *l); +extern void putback_lru_pages(struct list_head *l);  extern int migrate_page(struct address_space *,  			struct page *, struct page *);  extern int migrate_pages(struct list_head *l, new_page_t x, @@ -19,17 +19,19 @@ extern int fail_migrate_page(struct address_space *,  			struct page *, struct page *);  extern int migrate_prep(void); +extern int migrate_prep_local(void);  extern int migrate_vmas(struct mm_struct *mm,  		const nodemask_t *from, const nodemask_t *to,  		unsigned long flags);  #else  #define PAGE_MIGRATION 0 -static inline int putback_lru_pages(struct list_head *l) { return 0; } +static inline void putback_lru_pages(struct list_head *l) {}  static inline int migrate_pages(struct list_head *l, new_page_t x,  		unsigned long private, int offlining) { return -ENOSYS; }  static inline int migrate_prep(void) { return -ENOSYS; } +static inline int migrate_prep_local(void) { return -ENOSYS; }  static inline int migrate_vmas(struct mm_struct *mm,  		const nodemask_t *from, const nodemask_t *to, diff --git a/include/linux/miscdevice.h b/include/linux/miscdevice.h index adaf3c15e44..b631c46cffd 100644 --- a/include/linux/miscdevice.h +++ b/include/linux/miscdevice.h @@ -30,6 +30,9 @@  #define HPET_MINOR		228  #define FUSE_MINOR		229  #define KVM_MINOR		232 +#define VHOST_NET_MINOR		233 +#define BTRFS_MINOR		234 +#define AUTOFS_MINOR		235  #define MISC_DYNAMIC_MINOR	255  struct device; diff --git a/include/linux/mlx4/device.h b/include/linux/mlx4/device.h index e92d1bfdb33..7a7f9c1e679 100644 --- a/include/linux/mlx4/device.h +++ b/include/linux/mlx4/device.h @@ -123,8 +123,8 @@ enum {  	MLX4_OPCODE_RDMA_READ		= 0x10,  	MLX4_OPCODE_ATOMIC_CS		= 0x11,  	MLX4_OPCODE_ATOMIC_FA		= 0x12, -	MLX4_OPCODE_ATOMIC_MASK_CS	= 0x14, -	MLX4_OPCODE_ATOMIC_MASK_FA	= 0x15, +	MLX4_OPCODE_MASKED_ATOMIC_CS	= 0x14, +	MLX4_OPCODE_MASKED_ATOMIC_FA	= 0x15,  	MLX4_OPCODE_BIND_MW		= 0x18,  	MLX4_OPCODE_FMR			= 0x19,  	MLX4_OPCODE_LOCAL_INVAL		= 0x1b, diff --git a/include/linux/mlx4/qp.h b/include/linux/mlx4/qp.h index 9f29d86e5dc..7abe64326f7 100644 --- a/include/linux/mlx4/qp.h +++ b/include/linux/mlx4/qp.h @@ -285,6 +285,13 @@ struct mlx4_wqe_atomic_seg {  	__be64			compare;  }; +struct mlx4_wqe_masked_atomic_seg { +	__be64			swap_add; +	__be64			compare; +	__be64			swap_add_mask; +	__be64			compare_mask; +}; +  struct mlx4_wqe_data_seg {  	__be32			byte_count;  	__be32			lkey; diff --git a/include/linux/mm.h b/include/linux/mm.h index 60c467bfbab..b969efb0378 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -12,13 +12,14 @@  #include <linux/prio_tree.h>  #include <linux/debug_locks.h>  #include <linux/mm_types.h> +#include <linux/range.h> +#include <linux/pfn.h>  struct mempolicy;  struct anon_vma;  struct file_ra_state;  struct user_struct;  struct writeback_control; -struct rlimit;  #ifndef CONFIG_DISCONTIGMEM          /* Don't use mapnrs, do it properly */  extern unsigned long max_mapnr; @@ -106,6 +107,9 @@ extern unsigned int kobjsize(const void *objp);  #define VM_PFN_AT_MMAP	0x40000000	/* PFNMAP vma that is fully mapped at mmap time */  #define VM_MERGEABLE	0x80000000	/* KSM may merge identical pages */ +/* Bits set in the VMA until the stack is in its final location */ +#define VM_STACK_INCOMPLETE_SETUP	(VM_RAND_READ | VM_SEQ_READ) +  #ifndef VM_STACK_DEFAULT_FLAGS		/* arch can override this */  #define VM_STACK_DEFAULT_FLAGS VM_DATA_DEFAULT_FLAGS  #endif @@ -265,6 +269,8 @@ static inline int get_page_unless_zero(struct page *page)  	return atomic_inc_not_zero(&page->_count);  } +extern int page_is_ram(unsigned long pfn); +  /* Support for virtually mapped pages */  struct page *vmalloc_to_page(const void *addr);  unsigned long vmalloc_to_pfn(const void *addr); @@ -332,6 +338,7 @@ void put_page(struct page *page);  void put_pages_list(struct list_head *pages);  void split_page(struct page *page, unsigned int order); +int split_free_page(struct page *page);  /*   * Compound pages have a destructor function.  Provide a @@ -589,7 +596,7 @@ static inline void set_page_links(struct page *page, enum zone_type zone,  static __always_inline void *lowmem_page_address(struct page *page)  { -	return __va(page_to_pfn(page) << PAGE_SHIFT); +	return __va(PFN_PHYS(page_to_pfn(page)));  }  #if defined(CONFIG_HIGHMEM) && !defined(WANT_PAGE_VIRTUAL) @@ -780,8 +787,8 @@ struct mm_walk {  	int (*pmd_entry)(pmd_t *, unsigned long, unsigned long, struct mm_walk *);  	int (*pte_entry)(pte_t *, unsigned long, unsigned long, struct mm_walk *);  	int (*pte_hole)(unsigned long, unsigned long, struct mm_walk *); -	int (*hugetlb_entry)(pte_t *, unsigned long, unsigned long, -			     struct mm_walk *); +	int (*hugetlb_entry)(pte_t *, unsigned long, +			     unsigned long, unsigned long, struct mm_walk *);  	struct mm_struct *mm;  	void *private;  }; @@ -867,6 +874,114 @@ extern int mprotect_fixup(struct vm_area_struct *vma,   */  int __get_user_pages_fast(unsigned long start, int nr_pages, int write,  			  struct page **pages); +/* + * per-process(per-mm_struct) statistics. + */ +#if defined(SPLIT_RSS_COUNTING) +/* + * The mm counters are not protected by its page_table_lock, + * so must be incremented atomically. + */ +static inline void set_mm_counter(struct mm_struct *mm, int member, long value) +{ +	atomic_long_set(&mm->rss_stat.count[member], value); +} + +unsigned long get_mm_counter(struct mm_struct *mm, int member); + +static inline void add_mm_counter(struct mm_struct *mm, int member, long value) +{ +	atomic_long_add(value, &mm->rss_stat.count[member]); +} + +static inline void inc_mm_counter(struct mm_struct *mm, int member) +{ +	atomic_long_inc(&mm->rss_stat.count[member]); +} + +static inline void dec_mm_counter(struct mm_struct *mm, int member) +{ +	atomic_long_dec(&mm->rss_stat.count[member]); +} + +#else  /* !USE_SPLIT_PTLOCKS */ +/* + * The mm counters are protected by its page_table_lock, + * so can be incremented directly. + */ +static inline void set_mm_counter(struct mm_struct *mm, int member, long value) +{ +	mm->rss_stat.count[member] = value; +} + +static inline unsigned long get_mm_counter(struct mm_struct *mm, int member) +{ +	return mm->rss_stat.count[member]; +} + +static inline void add_mm_counter(struct mm_struct *mm, int member, long value) +{ +	mm->rss_stat.count[member] += value; +} + +static inline void inc_mm_counter(struct mm_struct *mm, int member) +{ +	mm->rss_stat.count[member]++; +} + +static inline void dec_mm_counter(struct mm_struct *mm, int member) +{ +	mm->rss_stat.count[member]--; +} + +#endif /* !USE_SPLIT_PTLOCKS */ + +static inline unsigned long get_mm_rss(struct mm_struct *mm) +{ +	return get_mm_counter(mm, MM_FILEPAGES) + +		get_mm_counter(mm, MM_ANONPAGES); +} + +static inline unsigned long get_mm_hiwater_rss(struct mm_struct *mm) +{ +	return max(mm->hiwater_rss, get_mm_rss(mm)); +} + +static inline unsigned long get_mm_hiwater_vm(struct mm_struct *mm) +{ +	return max(mm->hiwater_vm, mm->total_vm); +} + +static inline void update_hiwater_rss(struct mm_struct *mm) +{ +	unsigned long _rss = get_mm_rss(mm); + +	if ((mm)->hiwater_rss < _rss) +		(mm)->hiwater_rss = _rss; +} + +static inline void update_hiwater_vm(struct mm_struct *mm) +{ +	if (mm->hiwater_vm < mm->total_vm) +		mm->hiwater_vm = mm->total_vm; +} + +static inline void setmax_mm_hiwater_rss(unsigned long *maxrss, +					 struct mm_struct *mm) +{ +	unsigned long hiwater_rss = get_mm_hiwater_rss(mm); + +	if (*maxrss < hiwater_rss) +		*maxrss = hiwater_rss; +} + +#if defined(SPLIT_RSS_COUNTING) +void sync_mm_rss(struct task_struct *task, struct mm_struct *mm); +#else +static inline void sync_mm_rss(struct task_struct *task, struct mm_struct *mm) +{ +} +#endif  /*   * A callback you can register to apply pressure to ageable caches. @@ -1047,6 +1162,10 @@ extern void get_pfn_range_for_nid(unsigned int nid,  extern unsigned long find_min_pfn_with_active_regions(void);  extern void free_bootmem_with_active_regions(int nid,  						unsigned long max_low_pfn); +int add_from_early_node_map(struct range *range, int az, +				   int nr_range, int nid); +void *__alloc_memory_core_early(int nodeid, u64 size, u64 align, +				 u64 goal, u64 limit);  typedef int (*work_fn_t)(unsigned long, unsigned long, void *);  extern void work_with_active_regions(int nid, work_fn_t work_fn, void *data);  extern void sparse_memory_present_with_active_regions(int nid); @@ -1079,11 +1198,7 @@ extern void si_meminfo(struct sysinfo * val);  extern void si_meminfo_node(struct sysinfo *val, int nid);  extern int after_bootmem; -#ifdef CONFIG_NUMA  extern void setup_per_cpu_pageset(void); -#else -static inline void setup_per_cpu_pageset(void) {} -#endif  extern void zone_pcp_update(struct zone *zone); @@ -1111,7 +1226,7 @@ static inline void vma_nonlinear_insert(struct vm_area_struct *vma,  /* mmap.c */  extern int __vm_enough_memory(struct mm_struct *mm, long pages, int cap_sys_admin); -extern void vma_adjust(struct vm_area_struct *vma, unsigned long start, +extern int vma_adjust(struct vm_area_struct *vma, unsigned long start,  	unsigned long end, pgoff_t pgoff, struct vm_area_struct *insert);  extern struct vm_area_struct *vma_merge(struct mm_struct *,  	struct vm_area_struct *prev, unsigned long addr, unsigned long end, @@ -1319,21 +1434,25 @@ extern int randomize_va_space;  const char * arch_vma_name(struct vm_area_struct *vma);  void print_vma_addr(char *prefix, unsigned long rip); +void sparse_mem_maps_populate_node(struct page **map_map, +				   unsigned long pnum_begin, +				   unsigned long pnum_end, +				   unsigned long map_count, +				   int nodeid); +  struct page *sparse_mem_map_populate(unsigned long pnum, int nid);  pgd_t *vmemmap_pgd_populate(unsigned long addr, int node);  pud_t *vmemmap_pud_populate(pgd_t *pgd, unsigned long addr, int node);  pmd_t *vmemmap_pmd_populate(pud_t *pud, unsigned long addr, int node);  pte_t *vmemmap_pte_populate(pmd_t *pmd, unsigned long addr, int node);  void *vmemmap_alloc_block(unsigned long size, int node); +void *vmemmap_alloc_block_buf(unsigned long size, int node);  void vmemmap_verify(pte_t *, int, unsigned long, unsigned long);  int vmemmap_populate_basepages(struct page *start_page,  						unsigned long pages, int node);  int vmemmap_populate(struct page *start_page, unsigned long pages, int node);  void vmemmap_populate_print_last(void); -extern int account_locked_memory(struct mm_struct *mm, struct rlimit *rlim, -				 size_t size); -extern void refund_locked_memory(struct mm_struct *mm, size_t size);  enum mf_flags {  	MF_COUNT_INCREASED = 1 << 0, @@ -1347,5 +1466,7 @@ extern void shake_page(struct page *p, int access);  extern atomic_long_t mce_bad_pages;  extern int soft_offline_page(struct page *page, int flags); +extern void dump_page(struct page *page); +  #endif /* __KERNEL__ */  #endif /* _LINUX_MM_H */ diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h index 36f96271306..b8bb9a6a1f3 100644 --- a/include/linux/mm_types.h +++ b/include/linux/mm_types.h @@ -24,12 +24,6 @@ struct address_space;  #define USE_SPLIT_PTLOCKS	(NR_CPUS >= CONFIG_SPLIT_PTLOCK_CPUS) -#if USE_SPLIT_PTLOCKS -typedef atomic_long_t mm_counter_t; -#else  /* !USE_SPLIT_PTLOCKS */ -typedef unsigned long mm_counter_t; -#endif /* !USE_SPLIT_PTLOCKS */ -  /*   * Each physical page in the system has a struct page associated with   * it to keep track of whatever it is we are using the page for at the @@ -169,7 +163,8 @@ struct vm_area_struct {  	 * can only be in the i_mmap tree.  An anonymous MAP_PRIVATE, stack  	 * or brk vma (with NULL file) can only be in an anon_vma list.  	 */ -	struct list_head anon_vma_node;	/* Serialized by anon_vma->lock */ +	struct list_head anon_vma_chain; /* Serialized by mmap_sem & +					  * page_table_lock */  	struct anon_vma *anon_vma;	/* Serialized by page_table_lock */  	/* Function pointers to deal with this struct. */ @@ -201,6 +196,29 @@ struct core_state {  	struct completion startup;  }; +enum { +	MM_FILEPAGES, +	MM_ANONPAGES, +	MM_SWAPENTS, +	NR_MM_COUNTERS +}; + +#if USE_SPLIT_PTLOCKS && defined(CONFIG_MMU) +#define SPLIT_RSS_COUNTING +struct mm_rss_stat { +	atomic_long_t count[NR_MM_COUNTERS]; +}; +/* per-thread cached information, */ +struct task_rss_stat { +	int events;	/* for synchronization threshold */ +	int count[NR_MM_COUNTERS]; +}; +#else  /* !USE_SPLIT_PTLOCKS */ +struct mm_rss_stat { +	unsigned long count[NR_MM_COUNTERS]; +}; +#endif /* !USE_SPLIT_PTLOCKS */ +  struct mm_struct {  	struct vm_area_struct * mmap;		/* list of VMAs */  	struct rb_root mm_rb; @@ -227,11 +245,6 @@ struct mm_struct {  						 * by mmlist_lock  						 */ -	/* Special counters, in some configurations protected by the -	 * page_table_lock, in other configurations by being atomic. -	 */ -	mm_counter_t _file_rss; -	mm_counter_t _anon_rss;  	unsigned long hiwater_rss;	/* High-watermark of RSS usage */  	unsigned long hiwater_vm;	/* High-water virtual memory usage */ @@ -244,6 +257,12 @@ struct mm_struct {  	unsigned long saved_auxv[AT_VECTOR_SIZE]; /* for /proc/PID/auxv */ +	/* +	 * Special counters, in some configurations protected by the +	 * page_table_lock, in other configurations by being atomic. +	 */ +	struct mm_rss_stat rss_stat; +  	struct linux_binfmt *binfmt;  	cpumask_t cpu_vm_mask; diff --git a/include/linux/mmc/card.h b/include/linux/mmc/card.h index 2ee22e8af11..d02d2c6e0cf 100644 --- a/include/linux/mmc/card.h +++ b/include/linux/mmc/card.h @@ -99,6 +99,8 @@ struct mmc_card {  #define MMC_STATE_BLOCKADDR	(1<<3)		/* card uses block-addressing */  	unsigned int		quirks; 	/* card quirks */  #define MMC_QUIRK_LENIENT_FN0	(1<<0)		/* allow SDIO FN0 writes outside of the VS CCCR range */ +#define MMC_QUIRK_BLKSZ_FOR_BYTE_MODE (1<<1)	/* use func->cur_blksize */ +						/* for byte mode */  	u32			raw_cid[4];	/* raw card CID */  	u32			raw_csd[4];	/* raw card CSD */ @@ -139,6 +141,11 @@ static inline int mmc_card_lenient_fn0(const struct mmc_card *c)  	return c->quirks & MMC_QUIRK_LENIENT_FN0;  } +static inline int mmc_blksz_for_byte_mode(const struct mmc_card *c) +{ +	return c->quirks & MMC_QUIRK_BLKSZ_FOR_BYTE_MODE; +} +  #define mmc_card_name(c)	((c)->cid.prod_name)  #define mmc_card_id(c)		(dev_name(&(c)->dev)) diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h index eaf36364b7d..f65913c9f5a 100644 --- a/include/linux/mmc/host.h +++ b/include/linux/mmc/host.h @@ -14,6 +14,7 @@  #include <linux/sched.h>  #include <linux/mmc/core.h> +#include <linux/mmc/pm.h>  struct mmc_ios {  	unsigned int	clock;			/* clock rate */ @@ -107,6 +108,9 @@ struct mmc_host_ops {  	int	(*get_cd)(struct mmc_host *host);  	void	(*enable_sdio_irq)(struct mmc_host *host, int enable); + +	/* optional callback for HC quirks */ +	void	(*init_card)(struct mmc_host *host, struct mmc_card *card);  };  struct mmc_card; @@ -152,6 +156,8 @@ struct mmc_host {  #define MMC_CAP_NONREMOVABLE	(1 << 8)	/* Nonremovable e.g. eMMC */  #define MMC_CAP_WAIT_WHILE_BUSY	(1 << 9)	/* Waits while card is busy */ +	mmc_pm_flag_t		pm_caps;	/* supported pm features */ +  	/* host specific block data */  	unsigned int		max_seg_size;	/* see blk_queue_max_segment_size */  	unsigned short		max_hw_segs;	/* see blk_queue_max_hw_segments */ @@ -197,6 +203,8 @@ struct mmc_host {  	struct task_struct	*sdio_irq_thread;  	atomic_t		sdio_irq_thread_abort; +	mmc_pm_flag_t		pm_flags;	/* requested pm features */ +  #ifdef CONFIG_LEDS_TRIGGERS  	struct led_trigger	*led;		/* activity led */  #endif @@ -222,7 +230,7 @@ static inline void *mmc_priv(struct mmc_host *host)  #define mmc_classdev(x)	(&(x)->class_dev)  #define mmc_hostname(x)	(dev_name(&(x)->class_dev)) -extern int mmc_suspend_host(struct mmc_host *, pm_message_t); +extern int mmc_suspend_host(struct mmc_host *);  extern int mmc_resume_host(struct mmc_host *);  extern void mmc_power_save_host(struct mmc_host *host); diff --git a/include/linux/mmc/mmc.h b/include/linux/mmc/mmc.h index c02c8db7370..8a49cbf0376 100644 --- a/include/linux/mmc/mmc.h +++ b/include/linux/mmc/mmc.h @@ -268,6 +268,7 @@ struct _mmc_csd {  #define EXT_CSD_CARD_TYPE_26	(1<<0)	/* Card can run at 26MHz */  #define EXT_CSD_CARD_TYPE_52	(1<<1)	/* Card can run at 52MHz */ +#define EXT_CSD_CARD_TYPE_MASK	0x3	/* Mask out reserved and DDR bits */  #define EXT_CSD_BUS_WIDTH_1	0	/* Card is in 1 bit mode */  #define EXT_CSD_BUS_WIDTH_4	1	/* Card is in 4 bit mode */ diff --git a/include/linux/mmc/pm.h b/include/linux/mmc/pm.h new file mode 100644 index 00000000000..d37aac49cf9 --- /dev/null +++ b/include/linux/mmc/pm.h @@ -0,0 +1,30 @@ +/* + * linux/include/linux/mmc/pm.h + * + * Author:	Nicolas Pitre + * Copyright:	(C) 2009 Marvell Technology Group Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef LINUX_MMC_PM_H +#define LINUX_MMC_PM_H + +/* + * These flags are used to describe power management features that + * some cards (typically SDIO cards) might wish to benefit from when + * the host system is being suspended.  There are several layers of + * abstractions involved, from the host controller driver, to the MMC core + * code, to the SDIO core code, to finally get to the actual SDIO function + * driver.  This file is therefore used for common definitions shared across + * all those layers. + */ + +typedef unsigned int mmc_pm_flag_t; + +#define MMC_PM_KEEP_POWER	(1 << 0)	/* preserve card power during suspend */ +#define MMC_PM_WAKE_SDIO_IRQ	(1 << 1)	/* wake up host system on SDIO IRQ assertion */ + +#endif diff --git a/include/linux/mmc/sdhci-spear.h b/include/linux/mmc/sdhci-spear.h new file mode 100644 index 00000000000..9188c973f3e --- /dev/null +++ b/include/linux/mmc/sdhci-spear.h @@ -0,0 +1,42 @@ +/* + * include/linux/mmc/sdhci-spear.h + * + * SDHCI declarations specific to ST SPEAr platform + * + * Copyright (C) 2010 ST Microelectronics + * Viresh Kumar<viresh.kumar@st.com> + * + * This file is licensed under the terms of the GNU General Public + * License version 2. This program is licensed "as is" without any + * warranty of any kind, whether express or implied. + */ + +#ifndef MMC_SDHCI_SPEAR_H +#define MMC_SDHCI_SPEAR_H + +#include <linux/platform_device.h> +/* + * struct sdhci_plat_data: spear sdhci platform data structure + * + * @card_power_gpio: gpio pin for enabling/disabling power to sdhci socket + * @power_active_high: if set, enable power to sdhci socket by setting + *			card_power_gpio + * @power_always_enb: If set, then enable power on probe, otherwise enable only + *			on card insertion and disable on card removal. + * card_int_gpio: gpio pin used for card detection + */ +struct sdhci_plat_data { +	int card_power_gpio; +	int power_active_high; +	int power_always_enb; +	int card_int_gpio; +}; + +/* This function is used to set platform_data field of pdev->dev */ +static inline void +sdhci_set_plat_data(struct platform_device *pdev, struct sdhci_plat_data *data) +{ +	pdev->dev.platform_data = data; +} + +#endif /* MMC_SDHCI_SPEAR_H */ diff --git a/include/linux/mmc/sdio.h b/include/linux/mmc/sdio.h index 47ba464f517..329a8faa6e3 100644 --- a/include/linux/mmc/sdio.h +++ b/include/linux/mmc/sdio.h @@ -94,6 +94,10 @@  #define  SDIO_BUS_WIDTH_1BIT	0x00  #define  SDIO_BUS_WIDTH_4BIT	0x02 +#define  SDIO_BUS_ECSI		0x20	/* Enable continuous SPI interrupt */ +#define  SDIO_BUS_SCSI		0x40	/* Support continuous SPI interrupt */ + +#define  SDIO_BUS_ASYNC_INT	0x20  #define  SDIO_BUS_CD_DISABLE     0x80	/* disable pull-up on DAT3 (pin 1) */ diff --git a/include/linux/mmc/sdio_func.h b/include/linux/mmc/sdio_func.h index ac3ab683fec..31baaf82f45 100644 --- a/include/linux/mmc/sdio_func.h +++ b/include/linux/mmc/sdio_func.h @@ -15,6 +15,8 @@  #include <linux/device.h>  #include <linux/mod_devicetable.h> +#include <linux/mmc/pm.h> +  struct mmc_card;  struct sdio_func; @@ -143,6 +145,9 @@ extern void sdio_writew(struct sdio_func *func, u16 b,  extern void sdio_writel(struct sdio_func *func, u32 b,  	unsigned int addr, int *err_ret); +extern u8 sdio_writeb_readb(struct sdio_func *func, u8 write_byte, +	unsigned int addr, int *err_ret); +  extern int sdio_memcpy_toio(struct sdio_func *func, unsigned int addr,  	void *src, int count);  extern int sdio_writesb(struct sdio_func *func, unsigned int addr, @@ -153,5 +158,8 @@ extern unsigned char sdio_f0_readb(struct sdio_func *func,  extern void sdio_f0_writeb(struct sdio_func *func, unsigned char b,  	unsigned int addr, int *err_ret); +extern mmc_pm_flag_t sdio_get_host_pm_caps(struct sdio_func *func); +extern int sdio_set_host_pm_flags(struct sdio_func *func, mmc_pm_flag_t flags); +  #endif diff --git a/include/linux/mmc/sh_mmcif.h b/include/linux/mmc/sh_mmcif.h new file mode 100644 index 00000000000..aafe832f18a --- /dev/null +++ b/include/linux/mmc/sh_mmcif.h @@ -0,0 +1,39 @@ +/* + * include/linux/mmc/sh_mmcif.h + * + * platform data for eMMC driver + * + * Copyright (C) 2010 Renesas Solutions Corp. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License. + * + */ + +#ifndef __SH_MMCIF_H__ +#define __SH_MMCIF_H__ + +/* + * MMCIF : CE_CLK_CTRL [19:16] + * 1000 : Peripheral clock / 512 + * 0111 : Peripheral clock / 256 + * 0110 : Peripheral clock / 128 + * 0101 : Peripheral clock / 64 + * 0100 : Peripheral clock / 32 + * 0011 : Peripheral clock / 16 + * 0010 : Peripheral clock / 8 + * 0001 : Peripheral clock / 4 + * 0000 : Peripheral clock / 2 + * 1111 : Peripheral clock (sup_pclk set '1') + */ + +struct sh_mmcif_plat_data { +	void (*set_pwr)(struct platform_device *pdev, int state); +	void (*down_pwr)(struct platform_device *pdev); +	u8	sup_pclk;	/* 1 :SH7757, 0: SH7724/SH7372 */ +	unsigned long caps; +	u32	ocr; +}; + +#endif /* __SH_MMCIF_H__ */ diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h index 30fe668c254..b4d109e389b 100644 --- a/include/linux/mmzone.h +++ b/include/linux/mmzone.h @@ -184,13 +184,7 @@ struct per_cpu_pageset {  	s8 stat_threshold;  	s8 vm_stat_diff[NR_VM_ZONE_STAT_ITEMS];  #endif -} ____cacheline_aligned_in_smp; - -#ifdef CONFIG_NUMA -#define zone_pcp(__z, __cpu) ((__z)->pageset[(__cpu)]) -#else -#define zone_pcp(__z, __cpu) (&(__z)->pageset[(__cpu)]) -#endif +};  #endif /* !__GENERATING_BOUNDS.H */ @@ -306,14 +300,13 @@ struct zone {  	 */  	unsigned long		min_unmapped_pages;  	unsigned long		min_slab_pages; -	struct per_cpu_pageset	*pageset[NR_CPUS]; -#else -	struct per_cpu_pageset	pageset[NR_CPUS];  #endif +	struct per_cpu_pageset __percpu *pageset;  	/*  	 * free areas of different sizes  	 */  	spinlock_t		lock; +	int                     all_unreclaimable; /* All pages pinned */  #ifdef CONFIG_MEMORY_HOTPLUG  	/* see spanned/present_pages for more description */  	seqlock_t		span_seqlock; @@ -328,6 +321,15 @@ struct zone {  	unsigned long		*pageblock_flags;  #endif /* CONFIG_SPARSEMEM */ +#ifdef CONFIG_COMPACTION +	/* +	 * On compaction failure, 1<<compact_defer_shift compactions +	 * are skipped before trying again. The number attempted since +	 * last failure is tracked with compact_considered. +	 */ +	unsigned int		compact_considered; +	unsigned int		compact_defer_shift; +#endif  	ZONE_PADDING(_pad1_) @@ -349,7 +351,7 @@ struct zone {  	 * prev_priority holds the scanning priority for this zone.  It is  	 * defined as the scanning priority at which we achieved our reclaim  	 * target at the previous try_to_free_pages() or balance_pgdat() -	 * invokation. +	 * invocation.  	 *  	 * We use prev_priority as a measure of how much stress page reclaim is  	 * under - it drives the swappiness decision: whether to unmap mapped @@ -425,7 +427,6 @@ struct zone {  } ____cacheline_internodealigned_in_smp;  typedef enum { -	ZONE_ALL_UNRECLAIMABLE,		/* all pages pinned */  	ZONE_RECLAIM_LOCKED,		/* prevents concurrent reclaim */  	ZONE_OOM_LOCKED,		/* zone is in OOM killer zonelist */  } zone_flags_t; @@ -445,11 +446,6 @@ static inline void zone_clear_flag(struct zone *zone, zone_flags_t flag)  	clear_bit(flag, &zone->flags);  } -static inline int zone_is_all_unreclaimable(const struct zone *zone) -{ -	return test_bit(ZONE_ALL_UNRECLAIMABLE, &zone->flags); -} -  static inline int zone_is_reclaim_locked(const struct zone *zone)  {  	return test_bit(ZONE_RECLAIM_LOCKED, &zone->flags); @@ -620,7 +616,9 @@ typedef struct pglist_data {  	struct page_cgroup *node_page_cgroup;  #endif  #endif +#ifndef CONFIG_NO_BOOTMEM  	struct bootmem_data *bdata; +#endif  #ifdef CONFIG_MEMORY_HOTPLUG  	/*  	 * Must be held any time you expect node_start_pfn, node_present_pages @@ -652,9 +650,10 @@ typedef struct pglist_data {  #include <linux/memory_hotplug.h> +extern struct mutex zonelists_mutex;  void get_zone_counts(unsigned long *active, unsigned long *inactive,  			unsigned long *free); -void build_all_zonelists(void); +void build_all_zonelists(void *data);  void wakeup_kswapd(struct zone *zone, int order);  int zone_watermark_ok(struct zone *z, int order, unsigned long mark,  		int classzone_idx, int alloc_flags); @@ -672,6 +671,12 @@ void memory_present(int nid, unsigned long start, unsigned long end);  static inline void memory_present(int nid, unsigned long start, unsigned long end) {}  #endif +#ifdef CONFIG_HAVE_MEMORYLESS_NODES +int local_memory_node(int node_id); +#else +static inline int local_memory_node(int node_id) { return node_id; }; +#endif +  #ifdef CONFIG_NEED_NODE_MEMMAP_SIZE  unsigned long __init node_memmap_size_bytes(int, unsigned long, unsigned long);  #endif @@ -983,7 +988,7 @@ struct mem_section {  #endif  #define SECTION_NR_TO_ROOT(sec)	((sec) / SECTIONS_PER_ROOT) -#define NR_SECTION_ROOTS	(NR_MEM_SECTIONS / SECTIONS_PER_ROOT) +#define NR_SECTION_ROOTS	DIV_ROUND_UP(NR_MEM_SECTIONS, SECTIONS_PER_ROOT)  #define SECTION_ROOT_MASK	(SECTIONS_PER_ROOT - 1)  #ifdef CONFIG_SPARSEMEM_EXTREME diff --git a/include/linux/mnt_namespace.h b/include/linux/mnt_namespace.h index d74785c2393..0b89efc6f21 100644 --- a/include/linux/mnt_namespace.h +++ b/include/linux/mnt_namespace.h @@ -35,6 +35,7 @@ static inline void get_mnt_ns(struct mnt_namespace *ns)  extern const struct seq_operations mounts_op;  extern const struct seq_operations mountinfo_op;  extern const struct seq_operations mountstats_op; +extern int mnt_had_events(struct proc_mounts *);  #endif  #endif diff --git a/include/linux/mod_devicetable.h b/include/linux/mod_devicetable.h index f58e9d836f3..48c007dae47 100644 --- a/include/linux/mod_devicetable.h +++ b/include/linux/mod_devicetable.h @@ -474,4 +474,46 @@ struct platform_device_id {  			__attribute__((aligned(sizeof(kernel_ulong_t))));  }; +#define MDIO_MODULE_PREFIX	"mdio:" + +#define MDIO_ID_FMT "%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d" +#define MDIO_ID_ARGS(_id) \ +	(_id)>>31, ((_id)>>30) & 1, ((_id)>>29) & 1, ((_id)>>28) & 1,	\ +	((_id)>>27) & 1, ((_id)>>26) & 1, ((_id)>>25) & 1, ((_id)>>24) & 1, \ +	((_id)>>23) & 1, ((_id)>>22) & 1, ((_id)>>21) & 1, ((_id)>>20) & 1, \ +	((_id)>>19) & 1, ((_id)>>18) & 1, ((_id)>>17) & 1, ((_id)>>16) & 1, \ +	((_id)>>15) & 1, ((_id)>>14) & 1, ((_id)>>13) & 1, ((_id)>>12) & 1, \ +	((_id)>>11) & 1, ((_id)>>10) & 1, ((_id)>>9) & 1, ((_id)>>8) & 1, \ +	((_id)>>7) & 1, ((_id)>>6) & 1, ((_id)>>5) & 1, ((_id)>>4) & 1, \ +	((_id)>>3) & 1, ((_id)>>2) & 1, ((_id)>>1) & 1, (_id) & 1 + +/** + * struct mdio_device_id - identifies PHY devices on an MDIO/MII bus + * @phy_id: The result of + *     (mdio_read(&MII_PHYSID1) << 16 | mdio_read(&PHYSID2)) & @phy_id_mask + *     for this PHY type + * @phy_id_mask: Defines the significant bits of @phy_id.  A value of 0 + *     is used to terminate an array of struct mdio_device_id. + */ +struct mdio_device_id { +	__u32 phy_id; +	__u32 phy_id_mask; +}; + +struct zorro_device_id { +	__u32 id;			/* Device ID or ZORRO_WILDCARD */ +	kernel_ulong_t driver_data;	/* Data private to the driver */ +}; + +#define ZORRO_WILDCARD			(0xffffffff)	/* not official */ + +#define ZORRO_DEVICE_MODALIAS_FMT	"zorro:i%08X" + +#define ISAPNP_ANY_ID		0xffff +struct isapnp_device_id { +	unsigned short card_vendor, card_device; +	unsigned short vendor, function; +	kernel_ulong_t driver_data;	/* data private to the driver */ +}; +  #endif /* LINUX_MOD_DEVICETABLE_H */ diff --git a/include/linux/module.h b/include/linux/module.h index 6cb1a3cab5d..6914fcad467 100644 --- a/include/linux/module.h +++ b/include/linux/module.h @@ -17,7 +17,7 @@  #include <linux/moduleparam.h>  #include <linux/tracepoint.h> -#include <asm/local.h> +#include <linux/percpu.h>  #include <asm/module.h>  #include <trace/events/module.h> @@ -175,6 +175,7 @@ struct notifier_block;  #ifdef CONFIG_MODULES +extern int modules_disabled; /* for sysctl */  /* Get/put a kernel symbol (calls must be symmetric) */  void *__symbol_get(const char *symbol);  void *__symbol_get_gpl(const char *symbol); @@ -329,8 +330,11 @@ struct module  	struct module_notes_attrs *notes_attrs;  #endif +#ifdef CONFIG_SMP  	/* Per-cpu data. */ -	void *percpu; +	void __percpu *percpu; +	unsigned int percpu_size; +#endif  	/* The command line arguments (may be mangled).  People like  	   keeping pointers to this stuff */ @@ -363,11 +367,10 @@ struct module  	/* Destruction function. */  	void (*exit)(void); -#ifdef CONFIG_SMP -	char *refptr; -#else -	local_t ref; -#endif +	struct module_ref { +		unsigned int incs; +		unsigned int decs; +	} __percpu *refptr;  #endif  #ifdef CONFIG_CONSTRUCTORS @@ -393,6 +396,7 @@ static inline int module_is_live(struct module *mod)  struct module *__module_text_address(unsigned long addr);  struct module *__module_address(unsigned long addr);  bool is_module_address(unsigned long addr); +bool is_module_percpu_address(unsigned long addr);  bool is_module_text_address(unsigned long addr);  static inline int within_module_core(unsigned long addr, struct module *mod) @@ -454,25 +458,15 @@ void __symbol_put(const char *symbol);  #define symbol_put(x) __symbol_put(MODULE_SYMBOL_PREFIX #x)  void symbol_put_addr(void *addr); -static inline local_t *__module_ref_addr(struct module *mod, int cpu) -{ -#ifdef CONFIG_SMP -	return (local_t *) (mod->refptr + per_cpu_offset(cpu)); -#else -	return &mod->ref; -#endif -} -  /* Sometimes we know we already have a refcount, and it's easier not     to handle the error case (which only happens with rmmod --wait). */  static inline void __module_get(struct module *module)  {  	if (module) { -		unsigned int cpu = get_cpu(); -		local_inc(__module_ref_addr(module, cpu)); -		trace_module_get(module, _THIS_IP_, -				 local_read(__module_ref_addr(module, cpu))); -		put_cpu(); +		preempt_disable(); +		__this_cpu_inc(module->refptr->incs); +		trace_module_get(module, _THIS_IP_); +		preempt_enable();  	}  } @@ -481,15 +475,15 @@ static inline int try_module_get(struct module *module)  	int ret = 1;  	if (module) { -		unsigned int cpu = get_cpu(); +		preempt_disable(); +  		if (likely(module_is_live(module))) { -			local_inc(__module_ref_addr(module, cpu)); -			trace_module_get(module, _THIS_IP_, -				local_read(__module_ref_addr(module, cpu))); -		} -		else +			__this_cpu_inc(module->refptr->incs); +			trace_module_get(module, _THIS_IP_); +		} else  			ret = 0; -		put_cpu(); + +		preempt_enable();  	}  	return ret;  } @@ -571,6 +565,11 @@ static inline bool is_module_address(unsigned long addr)  	return false;  } +static inline bool is_module_percpu_address(unsigned long addr) +{ +	return false; +} +  static inline bool is_module_text_address(unsigned long addr)  {  	return false; diff --git a/include/linux/mount.h b/include/linux/mount.h index 5d527536486..4bd05474d11 100644 --- a/include/linux/mount.h +++ b/include/linux/mount.h @@ -34,7 +34,18 @@ struct mnt_namespace;  #define MNT_SHARED	0x1000	/* if the vfsmount is a shared mount */  #define MNT_UNBINDABLE	0x2000	/* if the vfsmount is a unbindable mount */ -#define MNT_PNODE_MASK	0x3000	/* propagation flag mask */ +/* + * MNT_SHARED_MASK is the set of flags that should be cleared when a + * mount becomes shared.  Currently, this is only the flag that says a + * mount cannot be bind mounted, since this is how we create a mount + * that shares events with another mount.  If you add a new MNT_* + * flag, consider how it interacts with shared mounts. + */ +#define MNT_SHARED_MASK	(MNT_UNBINDABLE) +#define MNT_PROPAGATION_MASK	(MNT_SHARED | MNT_UNBINDABLE) + + +#define MNT_INTERNAL	0x4000  struct vfsmount {  	struct list_head mnt_hash; @@ -66,7 +77,7 @@ struct vfsmount {  	int mnt_pinned;  	int mnt_ghosts;  #ifdef CONFIG_SMP -	int *mnt_writers; +	int __percpu *mnt_writers;  #else  	int mnt_writers;  #endif @@ -123,7 +134,6 @@ extern int do_add_mount(struct vfsmount *newmnt, struct path *path,  extern void mark_mounts_for_expiry(struct list_head *mounts); -extern spinlock_t vfsmount_lock;  extern dev_t name_to_dev_t(char *name);  #endif /* _LINUX_MOUNT_H */ diff --git a/include/linux/mroute.h b/include/linux/mroute.h index c5f3d53548e..fa04b246c9a 100644 --- a/include/linux/mroute.h +++ b/include/linux/mroute.h @@ -27,7 +27,8 @@  #define MRT_DEL_MFC	(MRT_BASE+5)	/* Delete a multicast forwarding entry	*/  #define MRT_VERSION	(MRT_BASE+6)	/* Get the kernel multicast version	*/  #define MRT_ASSERT	(MRT_BASE+7)	/* Activate PIM assert mode		*/ -#define MRT_PIM		(MRT_BASE+8)	/* enable PIM code	*/ +#define MRT_PIM		(MRT_BASE+8)	/* enable PIM code			*/ +#define MRT_TABLE	(MRT_BASE+9)	/* Specify mroute table ID		*/  #define SIOCGETVIFCNT	SIOCPROTOPRIVATE	/* IP protocol privates */  #define SIOCGETSGCNT	(SIOCPROTOPRIVATE+1) @@ -191,10 +192,7 @@ struct vif_device {  #define VIFF_STATIC 0x8000  struct mfc_cache { -	struct mfc_cache *next;			/* Next entry on cache line 	*/ -#ifdef CONFIG_NET_NS -	struct net *mfc_net; -#endif +	struct list_head list;  	__be32 mfc_mcastgrp;			/* Group the entry belongs to 	*/  	__be32 mfc_origin;			/* Source of packet 		*/  	vifi_t mfc_parent;			/* Source interface		*/ @@ -217,18 +215,6 @@ struct mfc_cache {  	} mfc_un;  }; -static inline -struct net *mfc_net(const struct mfc_cache *mfc) -{ -	return read_pnet(&mfc->mfc_net); -} - -static inline -void mfc_net_set(struct mfc_cache *mfc, struct net *net) -{ -	write_pnet(&mfc->mfc_net, hold_net(net)); -} -  #define MFC_STATIC		1  #define MFC_NOTIFY		2 diff --git a/include/linux/mroute6.h b/include/linux/mroute6.h index 2caa1a8e525..6091ab77f38 100644 --- a/include/linux/mroute6.h +++ b/include/linux/mroute6.h @@ -24,7 +24,8 @@  #define MRT6_DEL_MFC	(MRT6_BASE+5)	/* Delete a multicast forwarding entry	*/  #define MRT6_VERSION	(MRT6_BASE+6)	/* Get the kernel multicast version	*/  #define MRT6_ASSERT	(MRT6_BASE+7)	/* Activate PIM assert mode		*/ -#define MRT6_PIM	(MRT6_BASE+8)	/* enable PIM code	*/ +#define MRT6_PIM	(MRT6_BASE+8)	/* enable PIM code			*/ +#define MRT6_TABLE	(MRT6_BASE+9)	/* Specify mroute table ID		*/  #define SIOCGETMIFCNT_IN6	SIOCPROTOPRIVATE	/* IP protocol privates */  #define SIOCGETSGCNT_IN6	(SIOCPROTOPRIVATE+1) @@ -182,10 +183,7 @@ struct mif_device {  #define VIFF_STATIC 0x8000  struct mfc6_cache { -	struct mfc6_cache *next;		/* Next entry on cache line 	*/ -#ifdef CONFIG_NET_NS -	struct net *mfc6_net; -#endif +	struct list_head list;  	struct in6_addr mf6c_mcastgrp;			/* Group the entry belongs to 	*/  	struct in6_addr mf6c_origin;			/* Source of packet 		*/  	mifi_t mf6c_parent;			/* Source interface		*/ @@ -208,18 +206,6 @@ struct mfc6_cache {  	} mfc_un;  }; -static inline -struct net *mfc6_net(const struct mfc6_cache *mfc) -{ -	return read_pnet(&mfc->mfc6_net); -} - -static inline -void mfc6_net_set(struct mfc6_cache *mfc, struct net *net) -{ -	write_pnet(&mfc->mfc6_net, hold_net(net)); -} -  #define MFC_STATIC		1  #define MFC_NOTIFY		2 @@ -244,14 +230,17 @@ extern int ip6mr_get_route(struct net *net, struct sk_buff *skb,  			   struct rtmsg *rtm, int nowait);  #ifdef CONFIG_IPV6_MROUTE -static inline struct sock *mroute6_socket(struct net *net) -{ -	return net->ipv6.mroute6_sk; -} +extern struct sock *mroute6_socket(struct net *net, struct sk_buff *skb);  extern int ip6mr_sk_done(struct sock *sk);  #else -static inline struct sock *mroute6_socket(struct net *net) { return NULL; } -static inline int ip6mr_sk_done(struct sock *sk) { return 0; } +static inline struct sock *mroute6_socket(struct net *net, struct sk_buff *skb) +{ +	return NULL; +} +static inline int ip6mr_sk_done(struct sock *sk) +{ +	return 0; +}  #endif  #endif diff --git a/include/linux/msdos_fs.h b/include/linux/msdos_fs.h index ce38f1caa5e..34066e65fde 100644 --- a/include/linux/msdos_fs.h +++ b/include/linux/msdos_fs.h @@ -15,6 +15,7 @@  #define MSDOS_DPB_BITS	4		/* log2(MSDOS_DPB) */  #define MSDOS_DPS	(SECTOR_SIZE / sizeof(struct msdos_dir_entry))  #define MSDOS_DPS_BITS	4		/* log2(MSDOS_DPS) */ +#define MSDOS_LONGNAME	256		/* maximum name length */  #define CF_LE_W(v)	le16_to_cpu(v)  #define CF_LE_L(v)	le32_to_cpu(v)  #define CT_LE_W(v)	cpu_to_le16(v) @@ -47,8 +48,8 @@  #define DELETED_FLAG	0xe5	/* marks file as deleted when in name[0] */  #define IS_FREE(n)	(!*(n) || *(n) == DELETED_FLAG) +#define FAT_LFN_LEN	255	/* maximum long name length */  #define MSDOS_NAME	11	/* maximum name length */ -#define MSDOS_LONGNAME	256	/* maximum name length */  #define MSDOS_SLOTS	21	/* max # of slots for short and long names */  #define MSDOS_DOT	".          "	/* ".", padded to MSDOS_NAME chars */  #define MSDOS_DOTDOT	"..         "	/* "..", padded to MSDOS_NAME chars */ diff --git a/include/linux/msm_mdp.h b/include/linux/msm_mdp.h new file mode 100644 index 00000000000..d11fe0f2f95 --- /dev/null +++ b/include/linux/msm_mdp.h @@ -0,0 +1,78 @@ +/* include/linux/msm_mdp.h + * + * Copyright (C) 2007 Google Incorporated + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + */ +#ifndef _MSM_MDP_H_ +#define _MSM_MDP_H_ + +#include <linux/types.h> + +#define MSMFB_IOCTL_MAGIC 'm' +#define MSMFB_GRP_DISP          _IOW(MSMFB_IOCTL_MAGIC, 1, unsigned int) +#define MSMFB_BLIT              _IOW(MSMFB_IOCTL_MAGIC, 2, unsigned int) + +enum { +	MDP_RGB_565,		/* RGB 565 planar */ +	MDP_XRGB_8888,		/* RGB 888 padded */ +	MDP_Y_CBCR_H2V2,	/* Y and CbCr, pseudo planar w/ Cb is in MSB */ +	MDP_ARGB_8888,		/* ARGB 888 */ +	MDP_RGB_888,		/* RGB 888 planar */ +	MDP_Y_CRCB_H2V2,	/* Y and CrCb, pseudo planar w/ Cr is in MSB */ +	MDP_YCRYCB_H2V1,	/* YCrYCb interleave */ +	MDP_Y_CRCB_H2V1,	/* Y and CrCb, pseduo planar w/ Cr is in MSB */ +	MDP_Y_CBCR_H2V1,	/* Y and CrCb, pseduo planar w/ Cr is in MSB */ +	MDP_RGBA_8888,		/* ARGB 888 */ +	MDP_BGRA_8888,		/* ABGR 888 */ +	MDP_IMGTYPE_LIMIT	/* Non valid image type after this enum */ +}; + +enum { +	PMEM_IMG, +	FB_IMG, +}; + +/* flag values */ +#define MDP_ROT_NOP	0 +#define MDP_FLIP_LR	0x1 +#define MDP_FLIP_UD	0x2 +#define MDP_ROT_90	0x4 +#define MDP_ROT_180	(MDP_FLIP_UD|MDP_FLIP_LR) +#define MDP_ROT_270	(MDP_ROT_90|MDP_FLIP_UD|MDP_FLIP_LR) +#define MDP_DITHER	0x8 +#define MDP_BLUR	0x10 + +#define MDP_TRANSP_NOP	0xffffffff +#define MDP_ALPHA_NOP	0xff + +struct mdp_rect { +	u32 x, y, w, h; +}; + +struct mdp_img { +	u32 width, height, format, offset; +	int memory_id;		/* the file descriptor */ +}; + +struct mdp_blit_req { +	struct mdp_img src; +	struct mdp_img dst; +	struct mdp_rect src_rect; +	struct mdp_rect dst_rect; +	u32 alpha, transp_mask, flags; +}; + +struct mdp_blit_req_list { +	u32 count; +	struct mdp_blit_req req[]; +}; + +#endif /* _MSM_MDP_H_ */ diff --git a/include/linux/mtd/blktrans.h b/include/linux/mtd/blktrans.h index 8b4aa0523db..b481ccd7ff3 100644 --- a/include/linux/mtd/blktrans.h +++ b/include/linux/mtd/blktrans.h @@ -9,6 +9,8 @@  #define __MTD_TRANS_H__  #include <linux/mutex.h> +#include <linux/kref.h> +#include <linux/sysfs.h>  struct hd_geometry;  struct mtd_info; @@ -24,11 +26,16 @@ struct mtd_blktrans_dev {  	int devnum;  	unsigned long size;  	int readonly; -	void *blkcore_priv; /* gendisk in 2.5, devfs_handle in 2.4 */ +	int open; +	struct kref ref; +	struct gendisk *disk; +	struct attribute_group *disk_attributes; +	struct task_struct *thread; +	struct request_queue *rq; +	spinlock_t queue_lock; +	void *priv;  }; -struct blkcore_priv; /* Differs for 2.4 and 2.5 kernels; private */ -  struct mtd_blktrans_ops {  	char *name;  	int major; @@ -60,8 +67,6 @@ struct mtd_blktrans_ops {  	struct list_head devs;  	struct list_head list;  	struct module *owner; - -	struct mtd_blkcore_priv *blkcore_priv;  };  extern int register_mtd_blktrans(struct mtd_blktrans_ops *tr); diff --git a/include/linux/mtd/cfi.h b/include/linux/mtd/cfi.h index df89f427523..574d9ee066f 100644 --- a/include/linux/mtd/cfi.h +++ b/include/linux/mtd/cfi.h @@ -253,6 +253,7 @@ struct cfi_bri_query {  #define P_ID_MITSUBISHI_STD     0x0100  #define P_ID_MITSUBISHI_EXT     0x0101  #define P_ID_SST_PAGE           0x0102 +#define P_ID_SST_OLD            0x0701  #define P_ID_INTEL_PERFORMANCE  0x0200  #define P_ID_INTEL_DATA         0x0210  #define P_ID_RESERVED           0xffff @@ -297,7 +298,7 @@ static inline uint32_t cfi_build_cmd_addr(uint32_t cmd_ofs,  	 * and 32bit devices on 16 bit busses  	 * set the low bit of the alternating bit sequence of the address.  	 */ -	if (((type * interleave) > bankwidth) && ((uint8_t)cmd_ofs == 0xaa)) +	if (((type * interleave) > bankwidth) && ((cmd_ofs & 0xff) == 0xaa))  		addr |= (type >> 1)*interleave;  	return  addr; @@ -515,14 +516,25 @@ struct cfi_fixup {  	void* param;  }; -#define CFI_MFR_ANY 0xffff -#define CFI_ID_ANY  0xffff +#define CFI_MFR_ANY		0xFFFF +#define CFI_ID_ANY		0xFFFF +#define CFI_MFR_CONTINUATION	0x007F -#define CFI_MFR_AMD	0x0001 -#define CFI_MFR_INTEL	0x0089 -#define CFI_MFR_ATMEL	0x001F -#define CFI_MFR_SAMSUNG	0x00EC -#define CFI_MFR_ST	0x0020 /* STMicroelectronics */ +#define CFI_MFR_AMD		0x0001 +#define CFI_MFR_ATMEL		0x001F +#define CFI_MFR_EON		0x001C +#define CFI_MFR_FUJITSU		0x0004 +#define CFI_MFR_HYUNDAI		0x00AD +#define CFI_MFR_INTEL		0x0089 +#define CFI_MFR_MACRONIX	0x00C2 +#define CFI_MFR_NEC		0x0010 +#define CFI_MFR_PMC		0x009D +#define CFI_MFR_SAMSUNG		0x00EC +#define CFI_MFR_SHARP		0x00B0 +#define CFI_MFR_SST		0x00BF +#define CFI_MFR_ST		0x0020 /* STMicroelectronics */ +#define CFI_MFR_TOSHIBA		0x0098 +#define CFI_MFR_WINBOND		0x00DA  void cfi_fixup(struct mtd_info *mtd, struct cfi_fixup* fixups); diff --git a/include/linux/mtd/flashchip.h b/include/linux/mtd/flashchip.h index d0bf422ae37..f43e9b49b75 100644 --- a/include/linux/mtd/flashchip.h +++ b/include/linux/mtd/flashchip.h @@ -15,6 +15,7 @@   * has asm/spinlock.h, or 2.4, which has linux/spinlock.h   */  #include <linux/sched.h> +#include <linux/mutex.h>  typedef enum {  	FL_READY, @@ -74,8 +75,7 @@ struct flchip {  	unsigned int erase_suspended:1;  	unsigned long in_progress_block_addr; -	spinlock_t *mutex; -	spinlock_t _spinlock; /* We do it like this because sometimes they'll be shared. */ +	struct mutex mutex;  	wait_queue_head_t wq; /* Wait on here when we're waiting for the chip  			     to be ready */  	int word_write_time; diff --git a/include/linux/mtd/map.h b/include/linux/mtd/map.h index b981b877221..de89eca864c 100644 --- a/include/linux/mtd/map.h +++ b/include/linux/mtd/map.h @@ -7,6 +7,7 @@  #include <linux/types.h>  #include <linux/list.h>  #include <linux/string.h> +#include <linux/bug.h>  #include <linux/mtd/compatmac.h> @@ -386,6 +387,8 @@ static inline map_word inline_map_read(struct map_info *map, unsigned long ofs)  #endif  	else if (map_bankwidth_is_large(map))  		memcpy_fromio(r.x, map->virt+ofs, map->bankwidth); +	else +		BUG();  	return r;  } diff --git a/include/linux/mtd/mtd.h b/include/linux/mtd/mtd.h index 0f32a9b6ff5..5326435a757 100644 --- a/include/linux/mtd/mtd.h +++ b/include/linux/mtd/mtd.h @@ -20,7 +20,6 @@  #define MTD_CHAR_MAJOR 90  #define MTD_BLOCK_MAJOR 31 -#define MAX_MTD_DEVICES 32  #define MTD_ERASE_PENDING      	0x01  #define MTD_ERASING		0x02 @@ -61,9 +60,7 @@ struct mtd_erase_region_info {   * MTD_OOB_PLACE:	oob data are placed at the given offset   * MTD_OOB_AUTO:	oob data are automatically placed at the free areas   *			which are defined by the ecclayout - * MTD_OOB_RAW:		mode to read raw data+oob in one chunk. The oob data - *			is inserted into the data. Thats a raw image of the - *			flash contents. + * MTD_OOB_RAW:		mode to read oob and data without doing ECC checking   */  typedef enum {  	MTD_OOB_PLACE, @@ -290,8 +287,9 @@ extern int add_mtd_device(struct mtd_info *mtd);  extern int del_mtd_device (struct mtd_info *mtd);  extern struct mtd_info *get_mtd_device(struct mtd_info *mtd, int num); +extern int __get_mtd_device(struct mtd_info *mtd); +extern void __put_mtd_device(struct mtd_info *mtd);  extern struct mtd_info *get_mtd_device_nm(const char *name); -  extern void put_mtd_device(struct mtd_info *mtd); diff --git a/include/linux/mtd/mtdram.h b/include/linux/mtd/mtdram.h index 04fdc07b735..68891313875 100644 --- a/include/linux/mtd/mtdram.h +++ b/include/linux/mtd/mtdram.h @@ -3,6 +3,6 @@  #include <linux/mtd/mtd.h>  int mtdram_init_device(struct mtd_info *mtd, void *mapped_address, -                       unsigned long size, char *name); +			unsigned long size, char *name);  #endif /* __MTD_MTDRAM_H__ */ diff --git a/include/linux/mtd/nand.h b/include/linux/mtd/nand.h index ccab9dfc521..a81b185e23a 100644 --- a/include/linux/mtd/nand.h +++ b/include/linux/mtd/nand.h @@ -25,11 +25,13 @@  #include <linux/mtd/bbm.h>  struct mtd_info; +struct nand_flash_dev;  /* Scan and identify a NAND device */  extern int nand_scan (struct mtd_info *mtd, int max_chips);  /* Separate phases of nand_scan(), allowing board driver to intervene   * and override command or ECC setup according to flash type */ -extern int nand_scan_ident(struct mtd_info *mtd, int max_chips); +extern int nand_scan_ident(struct mtd_info *mtd, int max_chips, +			   struct nand_flash_dev *table);  extern int nand_scan_tail(struct mtd_info *mtd);  /* Free resources held by the NAND device */ @@ -38,6 +40,12 @@ extern void nand_release (struct mtd_info *mtd);  /* Internal helper for board drivers which need to override command function */  extern void nand_wait_ready(struct mtd_info *mtd); +/* locks all blockes present in the device */ +extern int nand_lock(struct mtd_info *mtd, loff_t ofs, uint64_t len); + +/* unlocks specified locked blockes */ +extern int nand_unlock(struct mtd_info *mtd, loff_t ofs, uint64_t len); +  /* The maximum number of NAND chips in an array */  #define NAND_MAX_CHIPS		8 @@ -45,7 +53,7 @@ extern void nand_wait_ready(struct mtd_info *mtd);   * is supported now. If you add a chip with bigger oobsize/page   * adjust this accordingly.   */ -#define NAND_MAX_OOBSIZE	128 +#define NAND_MAX_OOBSIZE	256  #define NAND_MAX_PAGESIZE	4096  /* @@ -82,6 +90,10 @@ extern void nand_wait_ready(struct mtd_info *mtd);  #define NAND_CMD_ERASE2		0xd0  #define NAND_CMD_RESET		0xff +#define NAND_CMD_LOCK		0x2a +#define NAND_CMD_UNLOCK1	0x23 +#define NAND_CMD_UNLOCK2	0x24 +  /* Extended commands for large page devices */  #define NAND_CMD_READSTART	0x30  #define NAND_CMD_RNDOUTSTART	0xE0 @@ -169,6 +181,14 @@ typedef enum {  #define NAND_NO_READRDY		0x00000100  /* Chip does not allow subpage writes */  #define NAND_NO_SUBPAGE_WRITE	0x00000200 +/* Chip stores bad block marker on the last page of the eraseblock */ +#define NAND_BB_LAST_PAGE	0x00000400 + +/* Device is one of 'new' xD cards that expose fake nand command set */ +#define NAND_BROKEN_XD		0x00000400 + +/* Device behaves just like nand, but is readonly */ +#define NAND_ROM		0x00000800  /* Options valid for Samsung large page devices */  #define NAND_SAMSUNG_LP_OPTIONS \ @@ -391,6 +411,7 @@ struct nand_chip {  	int		subpagesize;  	uint8_t		cellinfo;  	int		badblockpos; +	int		badblockbits;  	flstate_t	state; diff --git a/include/linux/mtd/onenand.h b/include/linux/mtd/onenand.h index 5509eb06b32..c26ff86ad08 100644 --- a/include/linux/mtd/onenand.h +++ b/include/linux/mtd/onenand.h @@ -125,6 +125,9 @@ struct onenand_chip {  	flstate_t		state;  	unsigned char		*page_buf;  	unsigned char		*oob_buf; +#ifdef CONFIG_MTD_ONENAND_VERIFY_WRITE +	unsigned char		*verify_buf; +#endif  	int			subpagesize;  	struct nand_ecclayout	*ecclayout; @@ -175,10 +178,14 @@ struct onenand_chip {  #define ONENAND_HAS_CONT_LOCK		(0x0001)  #define ONENAND_HAS_UNLOCK_ALL		(0x0002)  #define ONENAND_HAS_2PLANE		(0x0004) +#define ONENAND_HAS_4KB_PAGE		(0x0008)  #define ONENAND_SKIP_UNLOCK_CHECK	(0x0100)  #define ONENAND_PAGEBUF_ALLOC		(0x1000)  #define ONENAND_OOBBUF_ALLOC		(0x2000) +#define ONENAND_IS_4KB_PAGE(this)					\ +	(this->options & ONENAND_HAS_4KB_PAGE) +  /*   * OneNAND Flash Manufacturer ID Codes   */ @@ -205,6 +212,8 @@ struct mtd_partition;  struct onenand_platform_data {  	void		(*mmcontrol)(struct mtd_info *mtd, int sync_read); +	int		(*read_bufferram)(struct mtd_info *mtd, int area, +			unsigned char *buffer, int offset, size_t count);  	struct mtd_partition *parts;  	unsigned int	nr_parts;  }; diff --git a/include/linux/mtd/sh_flctl.h b/include/linux/mtd/sh_flctl.h index e77c1cea404..9cf4c4c7955 100644 --- a/include/linux/mtd/sh_flctl.h +++ b/include/linux/mtd/sh_flctl.h @@ -51,6 +51,8 @@  #define _4ECCCNTEN	(0x1 << 24)  #define _4ECCEN		(0x1 << 23)  #define _4ECCCORRECT	(0x1 << 22) +#define SHBUSSEL	(0x1 << 20) +#define SEL_16BIT	(0x1 << 19)  #define SNAND_E		(0x1 << 18)	/* SNAND (0=512 1=2048)*/  #define QTSEL_E		(0x1 << 17)  #define ENDIAN		(0x1 << 16)	/* 1 = little endian */ @@ -91,11 +93,10 @@  #define INIT_FL4ECCRESULT_VAL	0x03FF03FF  #define LOOP_TIMEOUT_MAX	0x00010000 -#define mtd_to_flctl(mtd)	container_of(mtd, struct sh_flctl, mtd) -  struct sh_flctl {  	struct mtd_info		mtd;  	struct nand_chip	chip; +	struct platform_device	*pdev;  	void __iomem		*reg;  	uint8_t	done_buff[2048 + 64];	/* max size 2048 + 64 */ @@ -122,4 +123,9 @@ struct sh_flctl_platform_data {  	unsigned has_hwecc:1;  }; +static inline struct sh_flctl *mtd_to_flctl(struct mtd_info *mtdinfo) +{ +	return container_of(mtdinfo, struct sh_flctl, mtd); +} +  #endif	/* __SH_FLCTL_H__ */ diff --git a/include/linux/ncp_fs.h b/include/linux/ncp_fs.h index 30b06c89394..4522aed0090 100644 --- a/include/linux/ncp_fs.h +++ b/include/linux/ncp_fs.h @@ -210,7 +210,7 @@ int ncp_date_dos2unix(__le16 time, __le16 date);  void ncp_date_unix2dos(int unix_date, __le16 * time, __le16 * date);  /* linux/fs/ncpfs/ioctl.c */ -int ncp_ioctl(struct inode *, struct file *, unsigned int, unsigned long); +long ncp_ioctl(struct file *, unsigned int, unsigned long);  long ncp_compat_ioctl(struct file *, unsigned int, unsigned long);  /* linux/fs/ncpfs/sock.c */ diff --git a/include/linux/ncp_fs_sb.h b/include/linux/ncp_fs_sb.h index 6330fc76b00..5ec9ca67168 100644 --- a/include/linux/ncp_fs_sb.h +++ b/include/linux/ncp_fs_sb.h @@ -12,6 +12,7 @@  #include <linux/ncp_mount.h>  #include <linux/net.h>  #include <linux/mutex.h> +#include <linux/backing-dev.h>  #ifdef __KERNEL__ @@ -127,6 +128,7 @@ struct ncp_server {  		size_t len;  		__u8 data[128];  	} unexpected_packet; +	struct backing_dev_info bdi;  };  extern void ncp_tcp_rcv_proc(struct work_struct *work); diff --git a/include/linux/net.h b/include/linux/net.h index 5e8083cacc8..2b4deeeb864 100644 --- a/include/linux/net.h +++ b/include/linux/net.h @@ -59,6 +59,7 @@ typedef enum {  #include <linux/wait.h>  #include <linux/fcntl.h>	/* For O_CLOEXEC and O_NONBLOCK */  #include <linux/kmemcheck.h> +#include <linux/rcupdate.h>  struct poll_table_struct;  struct pipe_inode_info; @@ -116,6 +117,12 @@ enum sock_shutdown_cmd {  	SHUT_RDWR	= 2,  }; +struct socket_wq { +	wait_queue_head_t	wait; +	struct fasync_struct	*fasync_list; +	struct rcu_head		rcu; +} ____cacheline_aligned_in_smp; +  /**   *  struct socket - general BSD socket   *  @state: socket state (%SS_CONNECTED, etc) @@ -135,11 +142,8 @@ struct socket {  	kmemcheck_bitfield_end(type);  	unsigned long		flags; -	/* -	 * Please keep fasync_list & wait fields in the same cache line -	 */ -	struct fasync_struct	*fasync_list; -	wait_queue_head_t	wait; + +	struct socket_wq	*wq;  	struct file		*file;  	struct sock		*sk; @@ -174,18 +178,22 @@ struct proto_ops {  				      struct poll_table_struct *wait);  	int		(*ioctl)     (struct socket *sock, unsigned int cmd,  				      unsigned long arg); +#ifdef CONFIG_COMPAT  	int	 	(*compat_ioctl) (struct socket *sock, unsigned int cmd,  				      unsigned long arg); +#endif  	int		(*listen)    (struct socket *sock, int len);  	int		(*shutdown)  (struct socket *sock, int flags);  	int		(*setsockopt)(struct socket *sock, int level,  				      int optname, char __user *optval, unsigned int optlen);  	int		(*getsockopt)(struct socket *sock, int level,  				      int optname, char __user *optval, int __user *optlen); +#ifdef CONFIG_COMPAT  	int		(*compat_setsockopt)(struct socket *sock, int level,  				      int optname, char __user *optval, unsigned int optlen);  	int		(*compat_getsockopt)(struct socket *sock, int level,  				      int optname, char __user *optval, int __user *optlen); +#endif  	int		(*sendmsg)   (struct kiocb *iocb, struct socket *sock,  				      struct msghdr *m, size_t total_len);  	int		(*recvmsg)   (struct kiocb *iocb, struct socket *sock, diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index a3fccc85b1a..40291f37502 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -28,8 +28,10 @@  #include <linux/if.h>  #include <linux/if_ether.h>  #include <linux/if_packet.h> +#include <linux/if_link.h>  #ifdef __KERNEL__ +#include <linux/pm_qos_params.h>  #include <linux/timer.h>  #include <linux/delay.h>  #include <linux/mm.h> @@ -136,7 +138,7 @@ static inline bool dev_xmit_complete(int rc)   *	used.   */ -#if defined(CONFIG_WLAN_80211) || defined(CONFIG_AX25) || defined(CONFIG_AX25_MODULE) +#if defined(CONFIG_WLAN) || defined(CONFIG_AX25) || defined(CONFIG_AX25_MODULE)  # if defined(CONFIG_MAC80211_MESH)  #  define LL_MAX_HEADER 128  # else @@ -217,34 +219,6 @@ struct neighbour;  struct neigh_parms;  struct sk_buff; -struct netif_rx_stats { -	unsigned total; -	unsigned dropped; -	unsigned time_squeeze; -	unsigned cpu_collision; -}; - -DECLARE_PER_CPU(struct netif_rx_stats, netdev_rx_stat); - -struct dev_addr_list { -	struct dev_addr_list	*next; -	u8			da_addr[MAX_ADDR_LEN]; -	u8			da_addrlen; -	u8			da_synced; -	int			da_users; -	int			da_gusers; -}; - -/* - *	We tag multicasts with these structures. - */ - -#define dev_mc_list	dev_addr_list -#define dmi_addr	da_addr -#define dmi_addrlen	da_addrlen -#define dmi_users	da_users -#define dmi_gusers	da_gusers -  struct netdev_hw_addr {  	struct list_head	list;  	unsigned char		addr[MAX_ADDR_LEN]; @@ -253,8 +227,10 @@ struct netdev_hw_addr {  #define NETDEV_HW_ADDR_T_SAN		2  #define NETDEV_HW_ADDR_T_SLAVE		3  #define NETDEV_HW_ADDR_T_UNICAST	4 +#define NETDEV_HW_ADDR_T_MULTICAST	5  	int			refcount;  	bool			synced; +	bool			global_use;  	struct rcu_head		rcu_head;  }; @@ -263,6 +239,21 @@ struct netdev_hw_addr_list {  	int			count;  }; +#define netdev_hw_addr_list_count(l) ((l)->count) +#define netdev_hw_addr_list_empty(l) (netdev_hw_addr_list_count(l) == 0) +#define netdev_hw_addr_list_for_each(ha, l) \ +	list_for_each_entry(ha, &(l)->list, list) + +#define netdev_uc_count(dev) netdev_hw_addr_list_count(&(dev)->uc) +#define netdev_uc_empty(dev) netdev_hw_addr_list_empty(&(dev)->uc) +#define netdev_for_each_uc_addr(ha, dev) \ +	netdev_hw_addr_list_for_each(ha, &(dev)->uc) + +#define netdev_mc_count(dev) netdev_hw_addr_list_count(&(dev)->mc) +#define netdev_mc_empty(dev) netdev_hw_addr_list_empty(&(dev)->mc) +#define netdev_for_each_mc_addr(ha, dev) \ +	netdev_hw_addr_list_for_each(ha, &(dev)->mc) +  struct hh_cache {  	struct hh_cache *hh_next;	/* Next entry			     */  	atomic_t	hh_refcnt;	/* number of users                   */ @@ -518,6 +509,85 @@ struct netdev_queue {  	unsigned long		tx_dropped;  } ____cacheline_aligned_in_smp; +#ifdef CONFIG_RPS +/* + * This structure holds an RPS map which can be of variable length.  The + * map is an array of CPUs. + */ +struct rps_map { +	unsigned int len; +	struct rcu_head rcu; +	u16 cpus[0]; +}; +#define RPS_MAP_SIZE(_num) (sizeof(struct rps_map) + (_num * sizeof(u16))) + +/* + * The rps_dev_flow structure contains the mapping of a flow to a CPU and the + * tail pointer for that CPU's input queue at the time of last enqueue. + */ +struct rps_dev_flow { +	u16 cpu; +	u16 fill; +	unsigned int last_qtail; +}; + +/* + * The rps_dev_flow_table structure contains a table of flow mappings. + */ +struct rps_dev_flow_table { +	unsigned int mask; +	struct rcu_head rcu; +	struct work_struct free_work; +	struct rps_dev_flow flows[0]; +}; +#define RPS_DEV_FLOW_TABLE_SIZE(_num) (sizeof(struct rps_dev_flow_table) + \ +    (_num * sizeof(struct rps_dev_flow))) + +/* + * The rps_sock_flow_table contains mappings of flows to the last CPU + * on which they were processed by the application (set in recvmsg). + */ +struct rps_sock_flow_table { +	unsigned int mask; +	u16 ents[0]; +}; +#define	RPS_SOCK_FLOW_TABLE_SIZE(_num) (sizeof(struct rps_sock_flow_table) + \ +    (_num * sizeof(u16))) + +#define RPS_NO_CPU 0xffff + +static inline void rps_record_sock_flow(struct rps_sock_flow_table *table, +					u32 hash) +{ +	if (table && hash) { +		unsigned int cpu, index = hash & table->mask; + +		/* We only give a hint, preemption can change cpu under us */ +		cpu = raw_smp_processor_id(); + +		if (table->ents[index] != cpu) +			table->ents[index] = cpu; +	} +} + +static inline void rps_reset_sock_flow(struct rps_sock_flow_table *table, +				       u32 hash) +{ +	if (table && hash) +		table->ents[hash & table->mask] = RPS_NO_CPU; +} + +extern struct rps_sock_flow_table *rps_sock_flow_table; + +/* This structure contains an instance of an RX queue. */ +struct netdev_rx_queue { +	struct rps_map *rps_map; +	struct rps_dev_flow_table *rps_flow_table; +	struct kobject kobj; +	struct netdev_rx_queue *first; +	atomic_t count; +} ____cacheline_aligned_in_smp; +#endif /* CONFIG_RPS */  /*   * This structure defines the management hooks for network devices. @@ -610,6 +680,16 @@ struct netdev_queue {   *	this function is called when a VLAN id is unregistered.   *   * void (*ndo_poll_controller)(struct net_device *dev); + * + *	SR-IOV management functions. + * int (*ndo_set_vf_mac)(struct net_device *dev, int vf, u8* mac); + * int (*ndo_set_vf_vlan)(struct net_device *dev, int vf, u16 vlan, u8 qos); + * int (*ndo_set_vf_tx_rate)(struct net_device *dev, int vf, int rate); + * int (*ndo_get_vf_config)(struct net_device *dev, + *			    int vf, struct ifla_vf_info *ivf); + * int (*ndo_set_vf_port)(struct net_device *dev, int vf, + *			  struct nlattr *port[]); + * int (*ndo_get_vf_port)(struct net_device *dev, int vf, struct sk_buff *skb);   */  #define HAVE_NET_DEVICE_OPS  struct net_device_ops { @@ -621,30 +701,21 @@ struct net_device_ops {  						   struct net_device *dev);  	u16			(*ndo_select_queue)(struct net_device *dev,  						    struct sk_buff *skb); -#define HAVE_CHANGE_RX_FLAGS  	void			(*ndo_change_rx_flags)(struct net_device *dev,  						       int flags); -#define HAVE_SET_RX_MODE  	void			(*ndo_set_rx_mode)(struct net_device *dev); -#define HAVE_MULTICAST  	void			(*ndo_set_multicast_list)(struct net_device *dev); -#define HAVE_SET_MAC_ADDR  	int			(*ndo_set_mac_address)(struct net_device *dev,  						       void *addr); -#define HAVE_VALIDATE_ADDR  	int			(*ndo_validate_addr)(struct net_device *dev); -#define HAVE_PRIVATE_IOCTL  	int			(*ndo_do_ioctl)(struct net_device *dev,  					        struct ifreq *ifr, int cmd); -#define HAVE_SET_CONFIG  	int			(*ndo_set_config)(struct net_device *dev,  					          struct ifmap *map); -#define HAVE_CHANGE_MTU  	int			(*ndo_change_mtu)(struct net_device *dev,  						  int new_mtu);  	int			(*ndo_neigh_setup)(struct net_device *dev,  						   struct neigh_parms *); -#define HAVE_TX_TIMEOUT  	void			(*ndo_tx_timeout) (struct net_device *dev);  	struct net_device_stats* (*ndo_get_stats)(struct net_device *dev); @@ -656,9 +727,23 @@ struct net_device_ops {  	void			(*ndo_vlan_rx_kill_vid)(struct net_device *dev,  						        unsigned short vid);  #ifdef CONFIG_NET_POLL_CONTROLLER -#define HAVE_NETDEV_POLL  	void                    (*ndo_poll_controller)(struct net_device *dev); +	void			(*ndo_netpoll_cleanup)(struct net_device *dev);  #endif +	int			(*ndo_set_vf_mac)(struct net_device *dev, +						  int queue, u8 *mac); +	int			(*ndo_set_vf_vlan)(struct net_device *dev, +						   int queue, u16 vlan, u8 qos); +	int			(*ndo_set_vf_tx_rate)(struct net_device *dev, +						      int vf, int rate); +	int			(*ndo_get_vf_config)(struct net_device *dev, +						     int vf, +						     struct ifla_vf_info *ivf); +	int			(*ndo_set_vf_port)(struct net_device *dev, +						   int vf, +						   struct nlattr *port[]); +	int			(*ndo_get_vf_port)(struct net_device *dev, +						   int vf, struct sk_buff *skb);  #if defined(CONFIG_FCOE) || defined(CONFIG_FCOE_MODULE)  	int			(*ndo_fcoe_enable)(struct net_device *dev);  	int			(*ndo_fcoe_disable)(struct net_device *dev); @@ -693,6 +778,9 @@ struct net_device {  	 * the interface.  	 */  	char			name[IFNAMSIZ]; + +	struct pm_qos_request_list *pm_qos_req; +  	/* device name hash chain */  	struct hlist_node	name_hlist;  	/* snmp alias */ @@ -745,6 +833,8 @@ struct net_device {  #define NETIF_F_FCOE_CRC	(1 << 24) /* FCoE CRC32 */  #define NETIF_F_SCTP_CSUM	(1 << 25) /* SCTP checksum offload */  #define NETIF_F_FCOE_MTU	(1 << 26) /* Supports max FCoE MTU, 2158 bytes*/ +#define NETIF_F_NTUPLE		(1 << 27) /* N-tuple filters supported */ +#define NETIF_F_RXHASH		(1 << 28) /* Receive hashing offload */  	/* Segmentation offload features */  #define NETIF_F_GSO_SHIFT	16 @@ -801,7 +891,7 @@ struct net_device {  	unsigned char		operstate; /* RFC2863 operstate */  	unsigned char		link_mode; /* mapping policy to operstate */ -	unsigned		mtu;	/* interface MTU value		*/ +	unsigned int		mtu;	/* interface MTU value		*/  	unsigned short		type;	/* interface hardware type	*/  	unsigned short		hard_header_len;	/* hardware hdr length	*/ @@ -821,12 +911,10 @@ struct net_device {  	unsigned char		addr_len;	/* hardware address length	*/  	unsigned short          dev_id;		/* for shared network cards */ -	struct netdev_hw_addr_list	uc;	/* Secondary unicast -						   mac addresses */ -	int			uc_promisc;  	spinlock_t		addr_list_lock; -	struct dev_addr_list	*mc_list;	/* Multicast mac addresses	*/ -	int			mc_count;	/* Number of installed mcasts	*/ +	struct netdev_hw_addr_list	uc;	/* Unicast mac addresses */ +	struct netdev_hw_addr_list	mc;	/* Multicast mac addresses */ +	int			uc_promisc;  	unsigned int		promiscuity;  	unsigned int		allmulti; @@ -859,6 +947,15 @@ struct net_device {  	unsigned char		broadcast[MAX_ADDR_LEN];	/* hw bcast add	*/ +#ifdef CONFIG_RPS +	struct kset		*queues_kset; + +	struct netdev_rx_queue	*_rx; + +	/* Number of RX queues allocated at alloc_netdev_mq() time  */ +	unsigned int		num_rx_queues; +#endif +  	struct netdev_queue	rx_queue;  	struct netdev_queue	*_tx ____cacheline_aligned_in_smp; @@ -905,7 +1002,12 @@ struct net_device {  	       NETREG_UNREGISTERED,	/* completed unregister todo */  	       NETREG_RELEASED,		/* called free_netdev */  	       NETREG_DUMMY,		/* dummy device for NAPI poll */ -	} reg_state; +	} reg_state:16; + +	enum { +		RTNL_LINK_INITIALIZED, +		RTNL_LINK_INITIALIZING, +	} rtnl_link_state:16;  	/* Called from unregister, can be used to call free_netdev */  	void (*destructor)(struct net_device *dev); @@ -953,6 +1055,8 @@ struct net_device {  	/* max exchange id for FCoE LRO by ddp */  	unsigned int		fcoe_ddp_xid;  #endif +	/* n-tuple filter list attached to this device */ +	struct ethtool_rx_ntuple_list ethtool_ntuple_list;  };  #define to_net_dev(d) container_of(d, struct net_device, dev) @@ -1009,6 +1113,15 @@ 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 @@ -1271,19 +1384,52 @@ static inline int unregister_gifconf(unsigned int family)  }  /* - * Incoming packets are placed on per-cpu queues so that - * no locking is needed. + * Incoming packets are placed on per-cpu queues   */  struct softnet_data {  	struct Qdisc		*output_queue; -	struct sk_buff_head	input_pkt_queue; +	struct Qdisc		**output_queue_tailp;  	struct list_head	poll_list;  	struct sk_buff		*completion_queue; +	struct sk_buff_head	process_queue; + +	/* stats */ +	unsigned int		processed; +	unsigned int		time_squeeze; +	unsigned int		cpu_collision; +	unsigned int		received_rps; +#ifdef CONFIG_RPS +	struct softnet_data	*rps_ipi_list; + +	/* Elements below can be accessed between CPUs for RPS */ +	struct call_single_data	csd ____cacheline_aligned_in_smp; +	struct softnet_data	*rps_ipi_next; +	unsigned int		cpu; +	unsigned int		input_queue_head; +	unsigned int		input_queue_tail; +#endif +	unsigned		dropped; +	struct sk_buff_head	input_pkt_queue;  	struct napi_struct	backlog;  }; -DECLARE_PER_CPU(struct softnet_data,softnet_data); +static inline void input_queue_head_incr(struct softnet_data *sd) +{ +#ifdef CONFIG_RPS +	sd->input_queue_head++; +#endif +} + +static inline void input_queue_tail_incr_save(struct softnet_data *sd, +					      unsigned int *qtail) +{ +#ifdef CONFIG_RPS +	*qtail = ++sd->input_queue_tail; +#endif +} + +DECLARE_PER_CPU_ALIGNED(struct softnet_data, softnet_data);  #define HAVE_NETIF_QUEUE @@ -1527,7 +1673,6 @@ extern int		netif_rx(struct sk_buff *skb);  extern int		netif_rx_ni(struct sk_buff *skb);  #define HAVE_NETIF_RECEIVE_SKB 1  extern int		netif_receive_skb(struct sk_buff *skb); -extern void		napi_gro_flush(struct napi_struct *napi);  extern gro_result_t	dev_gro_receive(struct napi_struct *napi,  					struct sk_buff *skb);  extern gro_result_t	napi_skb_finish(gro_result_t ret, struct sk_buff *skb); @@ -1553,7 +1698,9 @@ extern int		dev_valid_name(const char *name);  extern int		dev_ioctl(struct net *net, unsigned int cmd, void __user *);  extern int		dev_ethtool(struct net *net, struct ifreq *);  extern unsigned		dev_get_flags(const struct net_device *); +extern int		__dev_change_flags(struct net_device *, unsigned int flags);  extern int		dev_change_flags(struct net_device *, unsigned); +extern void		__dev_notify_flags(struct net_device *, unsigned int old_flags);  extern int		dev_change_name(struct net_device *, const char *);  extern int		dev_set_alias(struct net_device *, const char *, size_t);  extern int		dev_change_net_namespace(struct net_device *, @@ -1909,6 +2056,22 @@ extern struct net_device *alloc_netdev_mq(int sizeof_priv, const char *name,  extern int		register_netdev(struct net_device *dev);  extern void		unregister_netdev(struct net_device *dev); +/* General hardware address lists handling functions */ +extern int __hw_addr_add_multiple(struct netdev_hw_addr_list *to_list, +				  struct netdev_hw_addr_list *from_list, +				  int addr_len, unsigned char addr_type); +extern void __hw_addr_del_multiple(struct netdev_hw_addr_list *to_list, +				   struct netdev_hw_addr_list *from_list, +				   int addr_len, unsigned char addr_type); +extern int __hw_addr_sync(struct netdev_hw_addr_list *to_list, +			  struct netdev_hw_addr_list *from_list, +			  int addr_len); +extern void __hw_addr_unsync(struct netdev_hw_addr_list *to_list, +			     struct netdev_hw_addr_list *from_list, +			     int addr_len); +extern void __hw_addr_flush(struct netdev_hw_addr_list *list); +extern void __hw_addr_init(struct netdev_hw_addr_list *list); +  /* Functions used for device addresses handling */  extern int dev_addr_add(struct net_device *dev, unsigned char *addr,  			unsigned char addr_type); @@ -1920,26 +2083,34 @@ extern int dev_addr_add_multiple(struct net_device *to_dev,  extern int dev_addr_del_multiple(struct net_device *to_dev,  				 struct net_device *from_dev,  				 unsigned char addr_type); +extern void dev_addr_flush(struct net_device *dev); +extern int dev_addr_init(struct net_device *dev); + +/* Functions used for unicast addresses handling */ +extern int dev_uc_add(struct net_device *dev, unsigned char *addr); +extern int dev_uc_del(struct net_device *dev, unsigned char *addr); +extern int dev_uc_sync(struct net_device *to, struct net_device *from); +extern void dev_uc_unsync(struct net_device *to, struct net_device *from); +extern void dev_uc_flush(struct net_device *dev); +extern void dev_uc_init(struct net_device *dev); + +/* Functions used for multicast addresses handling */ +extern int dev_mc_add(struct net_device *dev, unsigned char *addr); +extern int dev_mc_add_global(struct net_device *dev, unsigned char *addr); +extern int dev_mc_del(struct net_device *dev, unsigned char *addr); +extern int dev_mc_del_global(struct net_device *dev, unsigned char *addr); +extern int dev_mc_sync(struct net_device *to, struct net_device *from); +extern void dev_mc_unsync(struct net_device *to, struct net_device *from); +extern void dev_mc_flush(struct net_device *dev); +extern void dev_mc_init(struct net_device *dev);  /* Functions used for secondary unicast and multicast support */  extern void		dev_set_rx_mode(struct net_device *dev);  extern void		__dev_set_rx_mode(struct net_device *dev); -extern int		dev_unicast_delete(struct net_device *dev, void *addr); -extern int		dev_unicast_add(struct net_device *dev, void *addr); -extern int		dev_unicast_sync(struct net_device *to, struct net_device *from); -extern void		dev_unicast_unsync(struct net_device *to, struct net_device *from); -extern int 		dev_mc_delete(struct net_device *dev, void *addr, int alen, int all); -extern int		dev_mc_add(struct net_device *dev, void *addr, int alen, int newonly); -extern int		dev_mc_sync(struct net_device *to, struct net_device *from); -extern void		dev_mc_unsync(struct net_device *to, struct net_device *from); -extern int 		__dev_addr_delete(struct dev_addr_list **list, int *count, void *addr, int alen, int all); -extern int		__dev_addr_add(struct dev_addr_list **list, int *count, void *addr, int alen, int newonly); -extern int		__dev_addr_sync(struct dev_addr_list **to, int *to_count, struct dev_addr_list **from, int *from_count); -extern void		__dev_addr_unsync(struct dev_addr_list **to, int *to_count, struct dev_addr_list **from, int *from_count);  extern int		dev_set_promiscuity(struct net_device *dev, int inc);  extern int		dev_set_allmulti(struct net_device *dev, int inc);  extern void		netdev_state_change(struct net_device *dev); -extern void		netdev_bonding_change(struct net_device *dev, +extern int		netdev_bonding_change(struct net_device *dev,  					      unsigned long event);  extern void		netdev_features_change(struct net_device *dev);  /* Load a device via the kmod */ @@ -1949,6 +2120,7 @@ extern const struct net_device_stats *dev_get_stats(struct net_device *dev);  extern void		dev_txq_stats_fold(const struct net_device *dev, struct net_device_stats *stats);  extern int		netdev_max_backlog; +extern int		netdev_tstamp_prequeue;  extern int		weight_p;  extern int		netdev_set_master(struct net_device *dev, struct net_device *master);  extern int skb_checksum_help(struct sk_buff *skb); @@ -2009,54 +2181,14 @@ static inline void netif_set_gso_max_size(struct net_device *dev,  	dev->gso_max_size = size;  } -static inline void skb_bond_set_mac_by_master(struct sk_buff *skb, -					      struct net_device *master) -{ -	if (skb->pkt_type == PACKET_HOST) { -		u16 *dest = (u16 *) eth_hdr(skb)->h_dest; +extern int __skb_bond_should_drop(struct sk_buff *skb, +				  struct net_device *master); -		memcpy(dest, master->dev_addr, ETH_ALEN); -	} -} - -/* On bonding slaves other than the currently active slave, suppress - * duplicates except for 802.3ad ETH_P_SLOW, alb non-mcast/bcast, and - * ARP on active-backup slaves with arp_validate enabled. - */ -static inline int skb_bond_should_drop(struct sk_buff *skb) +static inline int skb_bond_should_drop(struct sk_buff *skb, +				       struct net_device *master)  { -	struct net_device *dev = skb->dev; -	struct net_device *master = dev->master; - -	if (master) { -		if (master->priv_flags & IFF_MASTER_ARPMON) -			dev->last_rx = jiffies; - -		if ((master->priv_flags & IFF_MASTER_ALB) && master->br_port) { -			/* Do address unmangle. The local destination address -			 * will be always the one master has. Provides the right -			 * functionality in a bridge. -			 */ -			skb_bond_set_mac_by_master(skb, master); -		} - -		if (dev->priv_flags & IFF_SLAVE_INACTIVE) { -			if ((dev->priv_flags & IFF_SLAVE_NEEDARP) && -			    skb->protocol == __cpu_to_be16(ETH_P_ARP)) -				return 0; - -			if (master->priv_flags & IFF_MASTER_ALB) { -				if (skb->pkt_type != PACKET_BROADCAST && -				    skb->pkt_type != PACKET_MULTICAST) -					return 0; -			} -			if (master->priv_flags & IFF_MASTER_8023AD && -			    skb->protocol == __cpu_to_be16(ETH_P_SLOW)) -				return 0; - -			return 1; -		} -	} +	if (master) +		return __skb_bond_should_drop(skb, master);  	return 0;  } @@ -2083,6 +2215,130 @@ static inline u32 dev_ethtool_get_flags(struct net_device *dev)  		return 0;  	return dev->ethtool_ops->get_flags(dev);  } + +/* Logging, debugging and troubleshooting/diagnostic helpers. */ + +/* netdev_printk helpers, similar to dev_printk */ + +static inline const char *netdev_name(const struct net_device *dev) +{ +	if (dev->reg_state != NETREG_REGISTERED) +		return "(unregistered net_device)"; +	return dev->name; +} + +#define netdev_printk(level, netdev, format, args...)		\ +	dev_printk(level, (netdev)->dev.parent,			\ +		   "%s: " format,				\ +		   netdev_name(netdev), ##args) + +#define netdev_emerg(dev, format, args...)			\ +	netdev_printk(KERN_EMERG, dev, format, ##args) +#define netdev_alert(dev, format, args...)			\ +	netdev_printk(KERN_ALERT, dev, format, ##args) +#define netdev_crit(dev, format, args...)			\ +	netdev_printk(KERN_CRIT, dev, format, ##args) +#define netdev_err(dev, format, args...)			\ +	netdev_printk(KERN_ERR, dev, format, ##args) +#define netdev_warn(dev, format, args...)			\ +	netdev_printk(KERN_WARNING, dev, format, ##args) +#define netdev_notice(dev, format, args...)			\ +	netdev_printk(KERN_NOTICE, dev, format, ##args) +#define netdev_info(dev, format, args...)			\ +	netdev_printk(KERN_INFO, dev, format, ##args) + +#if defined(DEBUG) +#define netdev_dbg(__dev, format, args...)			\ +	netdev_printk(KERN_DEBUG, __dev, format, ##args) +#elif defined(CONFIG_DYNAMIC_DEBUG) +#define netdev_dbg(__dev, format, args...)			\ +do {								\ +	dynamic_dev_dbg((__dev)->dev.parent, "%s: " format,	\ +			netdev_name(__dev), ##args);		\ +} while (0) +#else +#define netdev_dbg(__dev, format, args...)			\ +({								\ +	if (0)							\ +		netdev_printk(KERN_DEBUG, __dev, format, ##args); \ +	0;							\ +}) +#endif + +#if defined(VERBOSE_DEBUG) +#define netdev_vdbg	netdev_dbg +#else + +#define netdev_vdbg(dev, format, args...)			\ +({								\ +	if (0)							\ +		netdev_printk(KERN_DEBUG, dev, format, ##args);	\ +	0;							\ +}) +#endif + +/* + * netdev_WARN() acts like dev_printk(), but with the key difference + * of using a WARN/WARN_ON to get the message out, including the + * file/line information and a backtrace. + */ +#define netdev_WARN(dev, format, args...)			\ +	WARN(1, "netdevice: %s\n" format, netdev_name(dev), ##args); + +/* netif printk helpers, similar to netdev_printk */ + +#define netif_printk(priv, type, level, dev, fmt, args...)	\ +do {					  			\ +	if (netif_msg_##type(priv))				\ +		netdev_printk(level, (dev), fmt, ##args);	\ +} while (0) + +#define netif_emerg(priv, type, dev, fmt, args...)		\ +	netif_printk(priv, type, KERN_EMERG, dev, fmt, ##args) +#define netif_alert(priv, type, dev, fmt, args...)		\ +	netif_printk(priv, type, KERN_ALERT, dev, fmt, ##args) +#define netif_crit(priv, type, dev, fmt, args...)		\ +	netif_printk(priv, type, KERN_CRIT, dev, fmt, ##args) +#define netif_err(priv, type, dev, fmt, args...)		\ +	netif_printk(priv, type, KERN_ERR, dev, fmt, ##args) +#define netif_warn(priv, type, dev, fmt, args...)		\ +	netif_printk(priv, type, KERN_WARNING, dev, fmt, ##args) +#define netif_notice(priv, type, dev, fmt, args...)		\ +	netif_printk(priv, type, KERN_NOTICE, dev, fmt, ##args) +#define netif_info(priv, type, dev, fmt, args...)		\ +	netif_printk(priv, type, KERN_INFO, (dev), fmt, ##args) + +#if defined(DEBUG) +#define netif_dbg(priv, type, dev, format, args...)		\ +	netif_printk(priv, type, KERN_DEBUG, dev, format, ##args) +#elif defined(CONFIG_DYNAMIC_DEBUG) +#define netif_dbg(priv, type, netdev, format, args...)		\ +do {								\ +	if (netif_msg_##type(priv))				\ +		dynamic_dev_dbg((netdev)->dev.parent,		\ +				"%s: " format,			\ +				netdev_name(netdev), ##args);	\ +} while (0) +#else +#define netif_dbg(priv, type, dev, format, args...)			\ +({									\ +	if (0)								\ +		netif_printk(priv, type, KERN_DEBUG, dev, format, ##args); \ +	0;								\ +}) +#endif + +#if defined(VERBOSE_DEBUG) +#define netif_vdbg	netdev_dbg +#else +#define netif_vdbg(priv, type, dev, format, args...)		\ +({								\ +	if (0)							\ +		netif_printk(priv, type, KERN_DEBUG, dev, format, ##args); \ +	0;							\ +}) +#endif +  #endif /* __KERNEL__ */  #endif	/* _LINUX_NETDEVICE_H */ diff --git a/include/linux/netfilter.h b/include/linux/netfilter.h index 48c54960773..89341c32631 100644 --- a/include/linux/netfilter.h +++ b/include/linux/netfilter.h @@ -114,15 +114,17 @@ struct nf_sockopt_ops {  	int set_optmin;  	int set_optmax;  	int (*set)(struct sock *sk, int optval, void __user *user, unsigned int len); +#ifdef CONFIG_COMPAT  	int (*compat_set)(struct sock *sk, int optval,  			void __user *user, unsigned int len); - +#endif  	int get_optmin;  	int get_optmax;  	int (*get)(struct sock *sk, int optval, void __user *user, int *len); +#ifdef CONFIG_COMPAT  	int (*compat_get)(struct sock *sk, int optval,  			void __user *user, int *len); - +#endif  	/* Use the module struct to lock set/get code in place */  	struct module *owner;  }; @@ -161,11 +163,8 @@ static inline int nf_hook_thresh(u_int8_t pf, unsigned int hook,  				 struct sk_buff *skb,  				 struct net_device *indev,  				 struct net_device *outdev, -				 int (*okfn)(struct sk_buff *), int thresh, -				 int cond) +				 int (*okfn)(struct sk_buff *), int thresh)  { -	if (!cond) -		return 1;  #ifndef CONFIG_NETFILTER_DEBUG  	if (list_empty(&nf_hooks[pf][hook]))  		return 1; @@ -177,7 +176,7 @@ static inline int nf_hook(u_int8_t pf, unsigned int hook, struct sk_buff *skb,  			  struct net_device *indev, struct net_device *outdev,  			  int (*okfn)(struct sk_buff *))  { -	return nf_hook_thresh(pf, hook, skb, indev, outdev, okfn, INT_MIN, 1); +	return nf_hook_thresh(pf, hook, skb, indev, outdev, okfn, INT_MIN);  }  /* Activate hook; either okfn or kfree_skb called, unless a hook @@ -197,36 +196,49 @@ static inline int nf_hook(u_int8_t pf, unsigned int hook, struct sk_buff *skb,     coders :)  */ -/* This is gross, but inline doesn't cut it for avoiding the function -   call in fast path: gcc doesn't inline (needs value tracking?). --RR */ - -/* HX: It's slightly less gross now. */ +static inline int +NF_HOOK_THRESH(uint8_t pf, unsigned int hook, struct sk_buff *skb, +	       struct net_device *in, struct net_device *out, +	       int (*okfn)(struct sk_buff *), int thresh) +{ +	int ret = nf_hook_thresh(pf, hook, skb, in, out, okfn, thresh); +	if (ret == 1) +		ret = okfn(skb); +	return ret; +} -#define NF_HOOK_THRESH(pf, hook, skb, indev, outdev, okfn, thresh)	       \ -({int __ret;								       \ -if ((__ret=nf_hook_thresh(pf, hook, (skb), indev, outdev, okfn, thresh, 1)) == 1)\ -	__ret = (okfn)(skb);						       \ -__ret;}) +static inline int +NF_HOOK_COND(uint8_t pf, unsigned int hook, struct sk_buff *skb, +	     struct net_device *in, struct net_device *out, +	     int (*okfn)(struct sk_buff *), bool cond) +{ +	int ret; -#define NF_HOOK_COND(pf, hook, skb, indev, outdev, okfn, cond)		       \ -({int __ret;								       \ -if ((__ret=nf_hook_thresh(pf, hook, (skb), indev, outdev, okfn, INT_MIN, cond)) == 1)\ -	__ret = (okfn)(skb);						       \ -__ret;}) +	if (!cond || +	    (ret = nf_hook_thresh(pf, hook, skb, in, out, okfn, INT_MIN) == 1)) +		ret = okfn(skb); +	return ret; +} -#define NF_HOOK(pf, hook, skb, indev, outdev, okfn) \ -	NF_HOOK_THRESH(pf, hook, skb, indev, outdev, okfn, INT_MIN) +static inline int +NF_HOOK(uint8_t pf, unsigned int hook, struct sk_buff *skb, +	struct net_device *in, struct net_device *out, +	int (*okfn)(struct sk_buff *)) +{ +	return NF_HOOK_THRESH(pf, hook, skb, in, out, okfn, INT_MIN); +}  /* Call setsockopt() */  int nf_setsockopt(struct sock *sk, u_int8_t pf, int optval, char __user *opt,  		  unsigned int len);  int nf_getsockopt(struct sock *sk, u_int8_t pf, int optval, char __user *opt,  		  int *len); - +#ifdef CONFIG_COMPAT  int compat_nf_setsockopt(struct sock *sk, u_int8_t pf, int optval,  		char __user *opt, unsigned int len);  int compat_nf_getsockopt(struct sock *sk, u_int8_t pf, int optval,  		char __user *opt, int *len); +#endif  /* Call this before modifying an existing packet: ensures it is     modifiable and linear to the point you care about (writable_len). @@ -325,8 +337,7 @@ static inline int nf_hook_thresh(u_int8_t pf, unsigned int hook,  				 struct sk_buff *skb,  				 struct net_device *indev,  				 struct net_device *outdev, -				 int (*okfn)(struct sk_buff *), int thresh, -				 int cond) +				 int (*okfn)(struct sk_buff *), int thresh)  {  	return okfn(skb);  } diff --git a/include/linux/netfilter/Kbuild b/include/linux/netfilter/Kbuild index 2aea50399c0..48767cd1645 100644 --- a/include/linux/netfilter/Kbuild +++ b/include/linux/netfilter/Kbuild @@ -6,6 +6,7 @@ header-y += nfnetlink_queue.h  header-y += xt_CLASSIFY.h  header-y += xt_CONNMARK.h  header-y += xt_CONNSECMARK.h +header-y += xt_CT.h  header-y += xt_DSCP.h  header-y += xt_LED.h  header-y += xt_MARK.h @@ -15,6 +16,7 @@ header-y += xt_RATEEST.h  header-y += xt_SECMARK.h  header-y += xt_TCPMSS.h  header-y += xt_TCPOPTSTRIP.h +header-y += xt_TEE.h  header-y += xt_TPROXY.h  header-y += xt_comment.h  header-y += xt_connbytes.h diff --git a/include/linux/netfilter/nf_conntrack_common.h b/include/linux/netfilter/nf_conntrack_common.h index a374787ed9b..14e6d32002c 100644 --- a/include/linux/netfilter/nf_conntrack_common.h +++ b/include/linux/netfilter/nf_conntrack_common.h @@ -72,6 +72,28 @@ enum ip_conntrack_status {  	/* Connection has fixed timeout. */  	IPS_FIXED_TIMEOUT_BIT = 10,  	IPS_FIXED_TIMEOUT = (1 << IPS_FIXED_TIMEOUT_BIT), + +	/* Conntrack is a template */ +	IPS_TEMPLATE_BIT = 11, +	IPS_TEMPLATE = (1 << IPS_TEMPLATE_BIT), +}; + +/* Connection tracking event types */ +enum ip_conntrack_events { +	IPCT_NEW,		/* new conntrack */ +	IPCT_RELATED,		/* related conntrack */ +	IPCT_DESTROY,		/* destroyed conntrack */ +	IPCT_REPLY,		/* connection has seen two-way traffic */ +	IPCT_ASSURED,		/* connection status has changed to assured */ +	IPCT_PROTOINFO,		/* protocol information has changed */ +	IPCT_HELPER,		/* new helper has been set */ +	IPCT_MARK,		/* new mark has been set */ +	IPCT_NATSEQADJ,		/* NAT is doing sequence adjustment */ +	IPCT_SECMARK,		/* new security mark has been set */ +}; + +enum ip_conntrack_expect_events { +	IPEXP_NEW,		/* new expectation */  };  #ifdef __KERNEL__ @@ -91,6 +113,7 @@ struct ip_conntrack_stat {  	unsigned int expect_new;  	unsigned int expect_create;  	unsigned int expect_delete; +	unsigned int search_restart;  };  /* call to create an explicit dependency on nf_conntrack. */ diff --git a/include/linux/netfilter/nf_conntrack_sip.h b/include/linux/netfilter/nf_conntrack_sip.h index 23aa2ec6b7b..ff8cfbcf3b8 100644 --- a/include/linux/netfilter/nf_conntrack_sip.h +++ b/include/linux/netfilter/nf_conntrack_sip.h @@ -14,6 +14,7 @@ enum sip_expectation_classes {  	SIP_EXPECT_SIGNALLING,  	SIP_EXPECT_AUDIO,  	SIP_EXPECT_VIDEO, +	SIP_EXPECT_IMAGE,  	__SIP_EXPECT_MAX  };  #define SIP_EXPECT_MAX	(__SIP_EXPECT_MAX - 1) @@ -34,10 +35,10 @@ struct sdp_media_type {  struct sip_handler {  	const char	*method;  	unsigned int	len; -	int		(*request)(struct sk_buff *skb, +	int		(*request)(struct sk_buff *skb, unsigned int dataoff,  				   const char **dptr, unsigned int *datalen,  				   unsigned int cseq); -	int		(*response)(struct sk_buff *skb, +	int		(*response)(struct sk_buff *skb, unsigned int dataoff,  				    const char **dptr, unsigned int *datalen,  				    unsigned int cseq, unsigned int code);  }; @@ -84,7 +85,8 @@ enum sip_header_types {  	SIP_HDR_FROM,  	SIP_HDR_TO,  	SIP_HDR_CONTACT, -	SIP_HDR_VIA, +	SIP_HDR_VIA_UDP, +	SIP_HDR_VIA_TCP,  	SIP_HDR_EXPIRES,  	SIP_HDR_CONTENT_LENGTH,  }; @@ -100,33 +102,40 @@ enum sdp_header_types {  };  extern unsigned int (*nf_nat_sip_hook)(struct sk_buff *skb, +				       unsigned int dataoff,  				       const char **dptr,  				       unsigned int *datalen); +extern void (*nf_nat_sip_seq_adjust_hook)(struct sk_buff *skb, s16 off);  extern unsigned int (*nf_nat_sip_expect_hook)(struct sk_buff *skb, +					      unsigned int dataoff,  					      const char **dptr,  					      unsigned int *datalen,  					      struct nf_conntrack_expect *exp,  					      unsigned int matchoff,  					      unsigned int matchlen);  extern unsigned int (*nf_nat_sdp_addr_hook)(struct sk_buff *skb, -					    const char **dptr,  					    unsigned int dataoff, +					    const char **dptr,  					    unsigned int *datalen, +					    unsigned int sdpoff,  					    enum sdp_header_types type,  					    enum sdp_header_types term,  					    const union nf_inet_addr *addr);  extern unsigned int (*nf_nat_sdp_port_hook)(struct sk_buff *skb, +					    unsigned int dataoff,  					    const char **dptr,  					    unsigned int *datalen,  					    unsigned int matchoff,  					    unsigned int matchlen,  					    u_int16_t port);  extern unsigned int (*nf_nat_sdp_session_hook)(struct sk_buff *skb, -					       const char **dptr,  					       unsigned int dataoff, +					       const char **dptr,  					       unsigned int *datalen, +					       unsigned int sdpoff,  					       const union nf_inet_addr *addr);  extern unsigned int (*nf_nat_sdp_media_hook)(struct sk_buff *skb, +					     unsigned int dataoff,  					     const char **dptr,  					     unsigned int *datalen,  					     struct nf_conntrack_expect *rtp_exp, diff --git a/include/linux/netfilter/nf_conntrack_tuple_common.h b/include/linux/netfilter/nf_conntrack_tuple_common.h index 8e145f0d61c..2ea22b018a8 100644 --- a/include/linux/netfilter/nf_conntrack_tuple_common.h +++ b/include/linux/netfilter/nf_conntrack_tuple_common.h @@ -1,8 +1,7 @@  #ifndef _NF_CONNTRACK_TUPLE_COMMON_H  #define _NF_CONNTRACK_TUPLE_COMMON_H -enum ip_conntrack_dir -{ +enum ip_conntrack_dir {  	IP_CT_DIR_ORIGINAL,  	IP_CT_DIR_REPLY,  	IP_CT_DIR_MAX diff --git a/include/linux/netfilter/nfnetlink.h b/include/linux/netfilter/nfnetlink.h index 49d321f3ccd..361d6b5630e 100644 --- a/include/linux/netfilter/nfnetlink.h +++ b/include/linux/netfilter/nfnetlink.h @@ -73,11 +73,11 @@ struct nfnetlink_subsystem {  extern int nfnetlink_subsys_register(const struct nfnetlink_subsystem *n);  extern int nfnetlink_subsys_unregister(const struct nfnetlink_subsystem *n); -extern int nfnetlink_has_listeners(unsigned int group); -extern int nfnetlink_send(struct sk_buff *skb, u32 pid, unsigned group,  +extern int nfnetlink_has_listeners(struct net *net, unsigned int group); +extern int nfnetlink_send(struct sk_buff *skb, struct net *net, u32 pid, unsigned group,  			  int echo, gfp_t flags); -extern void nfnetlink_set_err(u32 pid, u32 group, int error); -extern int nfnetlink_unicast(struct sk_buff *skb, u_int32_t pid, int flags); +extern int nfnetlink_set_err(struct net *net, u32 pid, u32 group, int error); +extern int nfnetlink_unicast(struct sk_buff *skb, struct net *net, u_int32_t pid, int flags);  extern void nfnl_lock(void);  extern void nfnl_unlock(void); diff --git a/include/linux/netfilter/nfnetlink_conntrack.h b/include/linux/netfilter/nfnetlink_conntrack.h index ed4ef8d0b11..9ed534c991b 100644 --- a/include/linux/netfilter/nfnetlink_conntrack.h +++ b/include/linux/netfilter/nfnetlink_conntrack.h @@ -40,6 +40,7 @@ enum ctattr_type {  	CTA_NAT_SEQ_ADJ_ORIG,  	CTA_NAT_SEQ_ADJ_REPLY,  	CTA_SECMARK, +	CTA_ZONE,  	__CTA_MAX  };  #define CTA_MAX (__CTA_MAX - 1) @@ -159,6 +160,7 @@ enum ctattr_expect {  	CTA_EXPECT_TIMEOUT,  	CTA_EXPECT_ID,  	CTA_EXPECT_HELP_NAME, +	CTA_EXPECT_ZONE,  	__CTA_EXPECT_MAX  };  #define CTA_EXPECT_MAX (__CTA_EXPECT_MAX - 1) diff --git a/include/linux/netfilter/x_tables.h b/include/linux/netfilter/x_tables.h index 378f27ae777..24e5d01d27d 100644 --- a/include/linux/netfilter/x_tables.h +++ b/include/linux/netfilter/x_tables.h @@ -1,9 +1,10 @@  #ifndef _X_TABLES_H  #define _X_TABLES_H - +#include <linux/kernel.h>  #include <linux/types.h>  #define XT_FUNCTION_MAXNAMELEN 30 +#define XT_EXTENSION_MAXNAMELEN 29  #define XT_TABLE_MAXNAMELEN 32  struct xt_entry_match { @@ -12,8 +13,7 @@ struct xt_entry_match {  			__u16 match_size;  			/* Used by userspace */ -			char name[XT_FUNCTION_MAXNAMELEN-1]; - +			char name[XT_EXTENSION_MAXNAMELEN];  			__u8 revision;  		} user;  		struct { @@ -36,8 +36,7 @@ struct xt_entry_target {  			__u16 target_size;  			/* Used by userspace */ -			char name[XT_FUNCTION_MAXNAMELEN-1]; - +			char name[XT_EXTENSION_MAXNAMELEN];  			__u8 revision;  		} user;  		struct { @@ -70,8 +69,7 @@ struct xt_standard_target {  /* The argument to IPT_SO_GET_REVISION_*.  Returns highest revision   * kernel supports, if >= revision. */  struct xt_get_revision { -	char name[XT_FUNCTION_MAXNAMELEN-1]; - +	char name[XT_EXTENSION_MAXNAMELEN];  	__u8 revision;  }; @@ -93,8 +91,7 @@ struct _xt_align {  	__u64 u64;  }; -#define XT_ALIGN(s) (((s) + (__alignof__(struct _xt_align)-1)) 	\ -			& ~(__alignof__(struct _xt_align)-1)) +#define XT_ALIGN(s) __ALIGN_KERNEL((s), __alignof__(struct _xt_align))  /* Standard return verdict, or do jump. */  #define XT_STANDARD_TARGET "" @@ -121,6 +118,7 @@ struct xt_counters_info {  #define XT_INV_PROTO		0x40	/* Invert the sense of PROTO. */ +#ifndef __KERNEL__  /* fn returns 0 to continue iteration */  #define XT_MATCH_ITERATE(type, e, fn, args...)			\  ({								\ @@ -164,47 +162,77 @@ struct xt_counters_info {  #define XT_ENTRY_ITERATE(type, entries, size, fn, args...) \  	XT_ENTRY_ITERATE_CONTINUE(type, entries, size, 0, fn, args) +#endif /* !__KERNEL__ */ + +/* pos is normally a struct ipt_entry/ip6t_entry/etc. */ +#define xt_entry_foreach(pos, ehead, esize) \ +	for ((pos) = (typeof(pos))(ehead); \ +	     (pos) < (typeof(pos))((char *)(ehead) + (esize)); \ +	     (pos) = (typeof(pos))((char *)(pos) + (pos)->next_offset)) + +/* can only be xt_entry_match, so no use of typeof here */ +#define xt_ematch_foreach(pos, entry) \ +	for ((pos) = (struct xt_entry_match *)entry->elems; \ +	     (pos) < (struct xt_entry_match *)((char *)(entry) + \ +	             (entry)->target_offset); \ +	     (pos) = (struct xt_entry_match *)((char *)(pos) + \ +	             (pos)->u.match_size)) +  #ifdef __KERNEL__  #include <linux/netdevice.h>  /** - * struct xt_match_param - parameters for match extensions' match functions + * struct xt_action_param - parameters for matches/targets   * + * @match:	the match extension + * @target:	the target extension + * @matchinfo:	per-match data + * @targetinfo:	per-target data   * @in:		input netdevice   * @out:	output netdevice - * @match:	struct xt_match through which this function was invoked - * @matchinfo:	per-match data   * @fragoff:	packet is a fragment, this is the data offset   * @thoff:	position of transport header relative to skb->data   * @hook:	hook number given packet came from   * @family:	Actual NFPROTO_* through which the function is invoked   * 		(helpful when match->family == NFPROTO_UNSPEC) + * + * Fields written to by extensions: + *   * @hotdrop:	drop packet if we had inspection problems + * Network namespace obtainable using dev_net(in/out)   */ -struct xt_match_param { +struct xt_action_param { +	union { +		const struct xt_match *match; +		const struct xt_target *target; +	}; +	union { +		const void *matchinfo, *targinfo; +	};  	const struct net_device *in, *out; -	const struct xt_match *match; -	const void *matchinfo;  	int fragoff;  	unsigned int thoff;  	unsigned int hooknum;  	u_int8_t family; -	bool *hotdrop; +	bool hotdrop;  };  /**   * struct xt_mtchk_param - parameters for match extensions'   * checkentry functions   * + * @net:	network namespace through which the check was invoked   * @table:	table the rule is tried to be inserted into   * @entryinfo:	the family-specific rule data - * 		(struct ipt_ip, ip6t_ip, ebt_entry) + * 		(struct ipt_ip, ip6t_ip, arpt_arp or (note) ebt_entry)   * @match:	struct xt_match through which this function was invoked   * @matchinfo:	per-match data   * @hook_mask:	via which hooks the new rule is reachable + * Other fields as above.   */  struct xt_mtchk_param { +	struct net *net;  	const char *table;  	const void *entryinfo;  	const struct xt_match *match; @@ -213,31 +241,18 @@ struct xt_mtchk_param {  	u_int8_t family;  }; -/* Match destructor parameters */ +/** + * struct xt_mdtor_param - match destructor parameters + * Fields as above. + */  struct xt_mtdtor_param { +	struct net *net;  	const struct xt_match *match;  	void *matchinfo;  	u_int8_t family;  };  /** - * struct xt_target_param - parameters for target extensions' target functions - * - * @hooknum:	hook through which this target was invoked - * @target:	struct xt_target through which this function was invoked - * @targinfo:	per-target data - * - * Other fields see above. - */ -struct xt_target_param { -	const struct net_device *in, *out; -	const struct xt_target *target; -	const void *targinfo; -	unsigned int hooknum; -	u_int8_t family; -}; - -/**   * struct xt_tgchk_param - parameters for target extensions'   * checkentry functions   * @@ -247,6 +262,7 @@ struct xt_target_param {   * Other fields see above.   */  struct xt_tgchk_param { +	struct net *net;  	const char *table;  	const void *entryinfo;  	const struct xt_target *target; @@ -257,6 +273,7 @@ struct xt_tgchk_param {  /* Target destructor parameters */  struct xt_tgdtor_param { +	struct net *net;  	const struct xt_target *target;  	void *targinfo;  	u_int8_t family; @@ -265,7 +282,7 @@ struct xt_tgdtor_param {  struct xt_match {  	struct list_head list; -	const char name[XT_FUNCTION_MAXNAMELEN-1]; +	const char name[XT_EXTENSION_MAXNAMELEN];  	u_int8_t revision;  	/* Return true or false: return FALSE and set *hotdrop = 1 to @@ -274,27 +291,26 @@ struct xt_match {  	   non-linear skb, using skb_header_pointer and  	   skb_ip_make_writable. */  	bool (*match)(const struct sk_buff *skb, -		      const struct xt_match_param *); +		      struct xt_action_param *);  	/* Called when user tries to insert an entry of this type. */ -	bool (*checkentry)(const struct xt_mtchk_param *); +	int (*checkentry)(const struct xt_mtchk_param *);  	/* Called when entry of this type deleted. */  	void (*destroy)(const struct xt_mtdtor_param *); - +#ifdef CONFIG_COMPAT  	/* Called when userspace align differs from kernel space one */ -	void (*compat_from_user)(void *dst, void *src); -	int (*compat_to_user)(void __user *dst, void *src); - +	void (*compat_from_user)(void *dst, const void *src); +	int (*compat_to_user)(void __user *dst, const void *src); +#endif  	/* Set this to THIS_MODULE if you are a module, otherwise NULL */  	struct module *me; -	/* Free to use by each match */ -	unsigned long data; -  	const char *table;  	unsigned int matchsize; +#ifdef CONFIG_COMPAT  	unsigned int compatsize; +#endif  	unsigned int hooks;  	unsigned short proto; @@ -305,38 +321,40 @@ struct xt_match {  struct xt_target {  	struct list_head list; -	const char name[XT_FUNCTION_MAXNAMELEN-1]; +	const char name[XT_EXTENSION_MAXNAMELEN]; +	u_int8_t revision;  	/* Returns verdict. Argument order changed since 2.6.9, as this  	   must now handle non-linear skbs, using skb_copy_bits and  	   skb_ip_make_writable. */  	unsigned int (*target)(struct sk_buff *skb, -			       const struct xt_target_param *); +			       const struct xt_action_param *);  	/* Called when user tries to insert an entry of this type:             hook_mask is a bitmask of hooks from which it can be             called. */ -	/* Should return true or false. */ -	bool (*checkentry)(const struct xt_tgchk_param *); +	/* Should return 0 on success or an error code otherwise (-Exxxx). */ +	int (*checkentry)(const struct xt_tgchk_param *);  	/* Called when entry of this type deleted. */  	void (*destroy)(const struct xt_tgdtor_param *); - +#ifdef CONFIG_COMPAT  	/* Called when userspace align differs from kernel space one */ -	void (*compat_from_user)(void *dst, void *src); -	int (*compat_to_user)(void __user *dst, void *src); - +	void (*compat_from_user)(void *dst, const void *src); +	int (*compat_to_user)(void __user *dst, const void *src); +#endif  	/* Set this to THIS_MODULE if you are a module, otherwise NULL */  	struct module *me;  	const char *table;  	unsigned int targetsize; +#ifdef CONFIG_COMPAT  	unsigned int compatsize; +#endif  	unsigned int hooks;  	unsigned short proto;  	unsigned short family; -	u_int8_t revision;  };  /* Furniture shopping... */ @@ -353,6 +371,7 @@ struct xt_table {  	struct module *me;  	u_int8_t af;		/* address/protocol family */ +	int priority;		/* hook order */  	/* A unique name... */  	const char name[XT_TABLE_MAXNAMELEN]; @@ -373,6 +392,13 @@ struct xt_table_info {  	unsigned int hook_entry[NF_INET_NUMHOOKS];  	unsigned int underflow[NF_INET_NUMHOOKS]; +	/* +	 * Number of user chains. Since tables cannot have loops, at most +	 * @stacksize jumps (number of user chains) can possibly be made. +	 */ +	unsigned int stacksize; +	unsigned int __percpu *stackptr; +	void ***jumpstack;  	/* ipt_entry tables: one per CPU */  	/* Note : this field MUST be the last one, see XT_TABLE_INFO_SZ */  	void *entries[1]; @@ -408,6 +434,8 @@ extern struct xt_table_info *xt_replace_table(struct xt_table *table,  extern struct xt_match *xt_find_match(u8 af, const char *name, u8 revision);  extern struct xt_target *xt_find_target(u8 af, const char *name, u8 revision); +extern struct xt_match *xt_request_find_match(u8 af, const char *name, +					      u8 revision);  extern struct xt_target *xt_request_find_target(u8 af, const char *name,  						u8 revision);  extern int xt_find_revision(u8 af, const char *name, u8 revision, @@ -514,6 +542,9 @@ static inline unsigned long ifname_compare_aligned(const char *_a,  	return ret;  } +extern struct nf_hook_ops *xt_hook_link(const struct xt_table *, nf_hookfn *); +extern void xt_hook_unlink(const struct xt_table *, struct nf_hook_ops *); +  #ifdef CONFIG_COMPAT  #include <net/compat.h> @@ -554,11 +585,7 @@ struct compat_xt_entry_target {   * current task alignment */  struct compat_xt_counters { -#if defined(CONFIG_X86_64) || defined(CONFIG_IA64) -	u_int32_t cnt[4]; -#else -	u_int64_t cnt[2]; -#endif +	compat_u64 pcnt, bcnt;			/* Packet and byte counters */  };  struct compat_xt_counters_info { @@ -567,26 +594,32 @@ struct compat_xt_counters_info {  	struct compat_xt_counters counters[0];  }; -#define COMPAT_XT_ALIGN(s) (((s) + (__alignof__(struct compat_xt_counters)-1)) \ -		& ~(__alignof__(struct compat_xt_counters)-1)) +struct _compat_xt_align { +	__u8 u8; +	__u16 u16; +	__u32 u32; +	compat_u64 u64; +}; + +#define COMPAT_XT_ALIGN(s) __ALIGN_KERNEL((s), __alignof__(struct _compat_xt_align))  extern void xt_compat_lock(u_int8_t af);  extern void xt_compat_unlock(u_int8_t af);  extern int xt_compat_add_offset(u_int8_t af, unsigned int offset, short delta);  extern void xt_compat_flush_offsets(u_int8_t af); -extern short xt_compat_calc_jump(u_int8_t af, unsigned int offset); +extern int xt_compat_calc_jump(u_int8_t af, unsigned int offset);  extern int xt_compat_match_offset(const struct xt_match *match);  extern int xt_compat_match_from_user(struct xt_entry_match *m,  				     void **dstptr, unsigned int *size); -extern int xt_compat_match_to_user(struct xt_entry_match *m, +extern int xt_compat_match_to_user(const struct xt_entry_match *m,  				   void __user **dstptr, unsigned int *size);  extern int xt_compat_target_offset(const struct xt_target *target);  extern void xt_compat_target_from_user(struct xt_entry_target *t,  				       void **dstptr, unsigned int *size); -extern int xt_compat_target_to_user(struct xt_entry_target *t, +extern int xt_compat_target_to_user(const struct xt_entry_target *t,  				    void __user **dstptr, unsigned int *size);  #endif /* CONFIG_COMPAT */ diff --git a/include/linux/netfilter/xt_CONNMARK.h b/include/linux/netfilter/xt_CONNMARK.h index 0a854586675..2f2e48ec802 100644 --- a/include/linux/netfilter/xt_CONNMARK.h +++ b/include/linux/netfilter/xt_CONNMARK.h @@ -1,26 +1,6 @@  #ifndef _XT_CONNMARK_H_target  #define _XT_CONNMARK_H_target -#include <linux/types.h> - -/* Copyright (C) 2002,2004 MARA Systems AB <http://www.marasystems.com> - * by Henrik Nordstrom <hno@marasystems.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - */ - -enum { -	XT_CONNMARK_SET = 0, -	XT_CONNMARK_SAVE, -	XT_CONNMARK_RESTORE -}; - -struct xt_connmark_tginfo1 { -	__u32 ctmark, ctmask, nfmask; -	__u8 mode; -}; +#include <linux/netfilter/xt_connmark.h>  #endif /*_XT_CONNMARK_H_target*/ diff --git a/include/linux/netfilter/xt_CT.h b/include/linux/netfilter/xt_CT.h new file mode 100644 index 00000000000..1b564106891 --- /dev/null +++ b/include/linux/netfilter/xt_CT.h @@ -0,0 +1,17 @@ +#ifndef _XT_CT_H +#define _XT_CT_H + +#define XT_CT_NOTRACK	0x1 + +struct xt_ct_target_info { +	u_int16_t	flags; +	u_int16_t	zone; +	u_int32_t	ct_events; +	u_int32_t	exp_events; +	char		helper[16]; + +	/* Used internally by the kernel */ +	struct nf_conn	*ct __attribute__((aligned(8))); +}; + +#endif /* _XT_CT_H */ diff --git a/include/linux/netfilter/xt_MARK.h b/include/linux/netfilter/xt_MARK.h index bc9561bdef7..41c456deba2 100644 --- a/include/linux/netfilter/xt_MARK.h +++ b/include/linux/netfilter/xt_MARK.h @@ -1,10 +1,6 @@  #ifndef _XT_MARK_H_target  #define _XT_MARK_H_target -#include <linux/types.h> - -struct xt_mark_tginfo2 { -	__u32 mark, mask; -}; +#include <linux/netfilter/xt_mark.h>  #endif /*_XT_MARK_H_target */ diff --git a/include/linux/netfilter/xt_TEE.h b/include/linux/netfilter/xt_TEE.h new file mode 100644 index 00000000000..5c21d5c829a --- /dev/null +++ b/include/linux/netfilter/xt_TEE.h @@ -0,0 +1,12 @@ +#ifndef _XT_TEE_TARGET_H +#define _XT_TEE_TARGET_H + +struct xt_tee_tginfo { +	union nf_inet_addr gw; +	char oif[16]; + +	/* used internally by the kernel */ +	struct xt_tee_priv *priv __attribute__((aligned(8))); +}; + +#endif /* _XT_TEE_TARGET_H */ diff --git a/include/linux/netfilter/xt_connmark.h b/include/linux/netfilter/xt_connmark.h index 619e47cde01..efc17a8305f 100644 --- a/include/linux/netfilter/xt_connmark.h +++ b/include/linux/netfilter/xt_connmark.h @@ -12,6 +12,17 @@   * (at your option) any later version.   */ +enum { +	XT_CONNMARK_SET = 0, +	XT_CONNMARK_SAVE, +	XT_CONNMARK_RESTORE +}; + +struct xt_connmark_tginfo1 { +	__u32 ctmark, ctmask, nfmask; +	__u8 mode; +}; +  struct xt_connmark_mtinfo1 {  	__u32 mark, mask;  	__u8 invert; diff --git a/include/linux/netfilter/xt_mark.h b/include/linux/netfilter/xt_mark.h index 6607c8f38ea..ecadc40d5cd 100644 --- a/include/linux/netfilter/xt_mark.h +++ b/include/linux/netfilter/xt_mark.h @@ -3,6 +3,10 @@  #include <linux/types.h> +struct xt_mark_tginfo2 { +	__u32 mark, mask; +}; +  struct xt_mark_mtinfo1 {  	__u32 mark, mask;  	__u8 invert; diff --git a/include/linux/netfilter/xt_recent.h b/include/linux/netfilter/xt_recent.h index d2c27660992..83318e01425 100644 --- a/include/linux/netfilter/xt_recent.h +++ b/include/linux/netfilter/xt_recent.h @@ -9,6 +9,7 @@ enum {  	XT_RECENT_UPDATE   = 1 << 2,  	XT_RECENT_REMOVE   = 1 << 3,  	XT_RECENT_TTL      = 1 << 4, +	XT_RECENT_REAP     = 1 << 5,  	XT_RECENT_SOURCE   = 0,  	XT_RECENT_DEST     = 1, @@ -16,6 +17,12 @@ enum {  	XT_RECENT_NAME_LEN = 200,  }; +/* Only allowed with --rcheck and --update */ +#define XT_RECENT_MODIFIERS (XT_RECENT_TTL|XT_RECENT_REAP) + +#define XT_RECENT_VALID_FLAGS (XT_RECENT_CHECK|XT_RECENT_SET|XT_RECENT_UPDATE|\ +			       XT_RECENT_REMOVE|XT_RECENT_TTL|XT_RECENT_REAP) +  struct xt_recent_mtinfo {  	__u32 seconds;  	__u32 hit_count; diff --git a/include/linux/netfilter_arp/arp_tables.h b/include/linux/netfilter_arp/arp_tables.h index f2336523a9d..e9948c0560f 100644 --- a/include/linux/netfilter_arp/arp_tables.h +++ b/include/linux/netfilter_arp/arp_tables.h @@ -211,9 +211,11 @@ static __inline__ struct arpt_entry_target *arpt_get_target(struct arpt_entry *e  	return (void *)e + e->target_offset;  } +#ifndef __KERNEL__  /* fn returns 0 to continue iteration */  #define ARPT_ENTRY_ITERATE(entries, size, fn, args...) \  	XT_ENTRY_ITERATE(struct arpt_entry, entries, size, fn, ## args) +#endif  /*   *	Main firewall chains definitions and global var's definitions. @@ -258,6 +260,7 @@ struct arpt_error {  	.target.errorname = "ERROR",					       \  } +extern void *arpt_alloc_initial_table(const struct xt_table *);  extern struct xt_table *arpt_register_table(struct net *net,  					    const struct xt_table *table,  					    const struct arpt_replace *repl); @@ -290,14 +293,6 @@ compat_arpt_get_target(struct compat_arpt_entry *e)  #define COMPAT_ARPT_ALIGN(s)	COMPAT_XT_ALIGN(s) -/* fn returns 0 to continue iteration */ -#define COMPAT_ARPT_ENTRY_ITERATE(entries, size, fn, args...) \ -	XT_ENTRY_ITERATE(struct compat_arpt_entry, entries, size, fn, ## args) - -#define COMPAT_ARPT_ENTRY_ITERATE_CONTINUE(entries, size, n, fn, args...) \ -	XT_ENTRY_ITERATE_CONTINUE(struct compat_arpt_entry, entries, size, n, \ -				  fn, ## args) -  #endif /* CONFIG_COMPAT */  #endif /*__KERNEL__*/  #endif /* _ARPTABLES_H */ diff --git a/include/linux/netfilter_bridge.h b/include/linux/netfilter_bridge.h index f8105e54716..0ddd161f3b0 100644 --- a/include/linux/netfilter_bridge.h +++ b/include/linux/netfilter_bridge.h @@ -41,10 +41,10 @@ enum nf_br_hook_priorities {  #define BRNF_PKT_TYPE			0x01  #define BRNF_BRIDGED_DNAT		0x02 -#define BRNF_DONT_TAKE_PARENT		0x04 -#define BRNF_BRIDGED			0x08 -#define BRNF_NF_BRIDGE_PREROUTING	0x10 - +#define BRNF_BRIDGED			0x04 +#define BRNF_NF_BRIDGE_PREROUTING	0x08 +#define BRNF_8021Q			0x10 +#define BRNF_PPPoE			0x20  /* Only used in br_forward.c */  extern int nf_bridge_copy_header(struct sk_buff *skb); @@ -68,6 +68,27 @@ static inline unsigned int nf_bridge_encap_header_len(const struct sk_buff *skb)  	}  } +static inline unsigned int nf_bridge_mtu_reduction(const struct sk_buff *skb) +{ +	if (unlikely(skb->nf_bridge->mask & BRNF_PPPoE)) +		return PPPOE_SES_HLEN; +	return 0; +} + +extern int br_handle_frame_finish(struct sk_buff *skb); +/* Only used in br_device.c */ +static inline int br_nf_pre_routing_finish_bridge_slow(struct sk_buff *skb) +{ +	struct nf_bridge_info *nf_bridge = skb->nf_bridge; + +	skb_pull(skb, ETH_HLEN); +	nf_bridge->mask ^= BRNF_BRIDGED_DNAT; +	skb_copy_to_linear_data_offset(skb, -(ETH_HLEN-ETH_ALEN), +				       skb->nf_bridge->data, ETH_HLEN-ETH_ALEN); +	skb->dev = nf_bridge->physindev; +	return br_handle_frame_finish(skb); +} +  /* This is called by the IP fragmenting code and it ensures there is   * enough room for the encapsulating header (if there is one). */  static inline unsigned int nf_bridge_pad(const struct sk_buff *skb) diff --git a/include/linux/netfilter_bridge/ebtables.h b/include/linux/netfilter_bridge/ebtables.h index 3cc40c131cc..1c6f0c5f530 100644 --- a/include/linux/netfilter_bridge/ebtables.h +++ b/include/linux/netfilter_bridge/ebtables.h @@ -289,7 +289,7 @@ struct ebt_table {  		     ~(__alignof__(struct ebt_replace)-1))  extern struct ebt_table *ebt_register_table(struct net *net,  					    const struct ebt_table *table); -extern void ebt_unregister_table(struct ebt_table *table); +extern void ebt_unregister_table(struct net *net, struct ebt_table *table);  extern unsigned int ebt_do_table(unsigned int hook, struct sk_buff *skb,     const struct net_device *in, const struct net_device *out,     struct ebt_table *table); diff --git a/include/linux/netfilter_ipv4/ip_tables.h b/include/linux/netfilter_ipv4/ip_tables.h index 27b3f580730..704a7b6e816 100644 --- a/include/linux/netfilter_ipv4/ip_tables.h +++ b/include/linux/netfilter_ipv4/ip_tables.h @@ -223,6 +223,7 @@ ipt_get_target(struct ipt_entry *e)  	return (void *)e + e->target_offset;  } +#ifndef __KERNEL__  /* fn returns 0 to continue iteration */  #define IPT_MATCH_ITERATE(e, fn, args...) \  	XT_MATCH_ITERATE(struct ipt_entry, e, fn, ## args) @@ -230,6 +231,7 @@ ipt_get_target(struct ipt_entry *e)  /* fn returns 0 to continue iteration */  #define IPT_ENTRY_ITERATE(entries, size, fn, args...) \  	XT_ENTRY_ITERATE(struct ipt_entry, entries, size, fn, ## args) +#endif  /*   *	Main firewall chains definitions and global var's definitions. @@ -242,7 +244,7 @@ extern void ipt_init(void) __init;  extern struct xt_table *ipt_register_table(struct net *net,  					   const struct xt_table *table,  					   const struct ipt_replace *repl); -extern void ipt_unregister_table(struct xt_table *table); +extern void ipt_unregister_table(struct net *net, struct xt_table *table);  /* Standard entry. */  struct ipt_standard { @@ -282,6 +284,7 @@ struct ipt_error {  	.target.errorname = "ERROR",					       \  } +extern void *ipt_alloc_initial_table(const struct xt_table *);  extern unsigned int ipt_do_table(struct sk_buff *skb,  				 unsigned int hook,  				 const struct net_device *in, @@ -312,19 +315,6 @@ compat_ipt_get_target(struct compat_ipt_entry *e)  #define COMPAT_IPT_ALIGN(s) 	COMPAT_XT_ALIGN(s) -/* fn returns 0 to continue iteration */ -#define COMPAT_IPT_MATCH_ITERATE(e, fn, args...) \ -	XT_MATCH_ITERATE(struct compat_ipt_entry, e, fn, ## args) - -/* fn returns 0 to continue iteration */ -#define COMPAT_IPT_ENTRY_ITERATE(entries, size, fn, args...) \ -	XT_ENTRY_ITERATE(struct compat_ipt_entry, entries, size, fn, ## args) - -/* fn returns 0 to continue iteration */ -#define COMPAT_IPT_ENTRY_ITERATE_CONTINUE(entries, size, n, fn, args...) \ -	XT_ENTRY_ITERATE_CONTINUE(struct compat_ipt_entry, entries, size, n, \ -				  fn, ## args) -  #endif /* CONFIG_COMPAT */  #endif /*__KERNEL__*/  #endif /* _IPTABLES_H */ diff --git a/include/linux/netfilter_ipv6.h b/include/linux/netfilter_ipv6.h index d654873aa25..1f7e300094c 100644 --- a/include/linux/netfilter_ipv6.h +++ b/include/linux/netfilter_ipv6.h @@ -59,6 +59,7 @@  enum nf_ip6_hook_priorities {  	NF_IP6_PRI_FIRST = INT_MIN,  	NF_IP6_PRI_CONNTRACK_DEFRAG = -400, +	NF_IP6_PRI_RAW = -300,  	NF_IP6_PRI_SELINUX_FIRST = -225,  	NF_IP6_PRI_CONNTRACK = -200,  	NF_IP6_PRI_MANGLE = -150, diff --git a/include/linux/netfilter_ipv6/ip6_tables.h b/include/linux/netfilter_ipv6/ip6_tables.h index b31050d20ae..18442ff19c0 100644 --- a/include/linux/netfilter_ipv6/ip6_tables.h +++ b/include/linux/netfilter_ipv6/ip6_tables.h @@ -280,6 +280,7 @@ ip6t_get_target(struct ip6t_entry *e)  	return (void *)e + e->target_offset;  } +#ifndef __KERNEL__  /* fn returns 0 to continue iteration */  #define IP6T_MATCH_ITERATE(e, fn, args...) \  	XT_MATCH_ITERATE(struct ip6t_entry, e, fn, ## args) @@ -287,6 +288,7 @@ ip6t_get_target(struct ip6t_entry *e)  /* fn returns 0 to continue iteration */  #define IP6T_ENTRY_ITERATE(entries, size, fn, args...) \  	XT_ENTRY_ITERATE(struct ip6t_entry, entries, size, fn, ## args) +#endif  /*   *	Main firewall chains definitions and global var's definitions. @@ -297,10 +299,11 @@ ip6t_get_target(struct ip6t_entry *e)  #include <linux/init.h>  extern void ip6t_init(void) __init; +extern void *ip6t_alloc_initial_table(const struct xt_table *);  extern struct xt_table *ip6t_register_table(struct net *net,  					    const struct xt_table *table,  					    const struct ip6t_replace *repl); -extern void ip6t_unregister_table(struct xt_table *table); +extern void ip6t_unregister_table(struct net *net, struct xt_table *table);  extern unsigned int ip6t_do_table(struct sk_buff *skb,  				  unsigned int hook,  				  const struct net_device *in, @@ -313,10 +316,6 @@ extern int ip6t_ext_hdr(u8 nexthdr);  extern int ipv6_find_hdr(const struct sk_buff *skb, unsigned int *offset,  			 int target, unsigned short *fragoff); -extern int ip6_masked_addrcmp(const struct in6_addr *addr1, -			      const struct in6_addr *mask, -			      const struct in6_addr *addr2); -  #define IP6T_ALIGN(s) XT_ALIGN(s)  #ifdef CONFIG_COMPAT @@ -340,18 +339,6 @@ compat_ip6t_get_target(struct compat_ip6t_entry *e)  #define COMPAT_IP6T_ALIGN(s)	COMPAT_XT_ALIGN(s) -/* fn returns 0 to continue iteration */ -#define COMPAT_IP6T_MATCH_ITERATE(e, fn, args...) \ -	XT_MATCH_ITERATE(struct compat_ip6t_entry, e, fn, ## args) - -/* fn returns 0 to continue iteration */ -#define COMPAT_IP6T_ENTRY_ITERATE(entries, size, fn, args...) \ -	XT_ENTRY_ITERATE(struct compat_ip6t_entry, entries, size, fn, ## args) - -#define COMPAT_IP6T_ENTRY_ITERATE_CONTINUE(entries, size, n, fn, args...) \ -	XT_ENTRY_ITERATE_CONTINUE(struct compat_ip6t_entry, entries, size, n, \ -				  fn, ## args) -  #endif /* CONFIG_COMPAT */  #endif /*__KERNEL__*/  #endif /* _IP6_TABLES_H */ diff --git a/include/linux/netlink.h b/include/linux/netlink.h index fde27c01732..59d066936ab 100644 --- a/include/linux/netlink.h +++ b/include/linux/netlink.h @@ -188,7 +188,11 @@ extern int netlink_has_listeners(struct sock *sk, unsigned int group);  extern int netlink_unicast(struct sock *ssk, struct sk_buff *skb, __u32 pid, int nonblock);  extern int netlink_broadcast(struct sock *ssk, struct sk_buff *skb, __u32 pid,  			     __u32 group, gfp_t allocation); -extern void netlink_set_err(struct sock *ssk, __u32 pid, __u32 group, int code); +extern int netlink_broadcast_filtered(struct sock *ssk, struct sk_buff *skb, +	__u32 pid, __u32 group, gfp_t allocation, +	int (*filter)(struct sock *dsk, struct sk_buff *skb, void *data), +	void *filter_data); +extern int netlink_set_err(struct sock *ssk, __u32 pid, __u32 group, int code);  extern int netlink_register_notifier(struct notifier_block *nb);  extern int netlink_unregister_notifier(struct notifier_block *nb); diff --git a/include/linux/netpoll.h b/include/linux/netpoll.h index 2524267210d..e9e23121586 100644 --- a/include/linux/netpoll.h +++ b/include/linux/netpoll.h @@ -14,6 +14,7 @@  struct netpoll {  	struct net_device *dev; +	struct net_device *real_dev;  	char dev_name[IFNAMSIZ];  	const char *name;  	void (*rx_hook)(struct netpoll *, int, char *, int); @@ -21,18 +22,26 @@ struct netpoll {  	__be32 local_ip, remote_ip;  	u16 local_port, remote_port;  	u8 remote_mac[ETH_ALEN]; + +	struct list_head rx; /* rx_np list element */  };  struct netpoll_info {  	atomic_t refcnt; +  	int rx_flags;  	spinlock_t rx_lock; -	struct netpoll *rx_np; /* netpoll that registered an rx_hook */ +	struct list_head rx_np; /* netpolls that registered an rx_hook */ +  	struct sk_buff_head arp_tx; /* list of arp requests to reply to */  	struct sk_buff_head txq; +  	struct delayed_work tx_work; + +	struct netpoll *netpoll;  }; +void netpoll_poll_dev(struct net_device *dev);  void netpoll_poll(struct netpoll *np);  void netpoll_send_udp(struct netpoll *np, const char *msg, int len);  void netpoll_print_options(struct netpoll *np); @@ -42,22 +51,23 @@ int netpoll_trap(void);  void netpoll_set_trap(int trap);  void netpoll_cleanup(struct netpoll *np);  int __netpoll_rx(struct sk_buff *skb); +void netpoll_send_skb(struct netpoll *np, struct sk_buff *skb);  #ifdef CONFIG_NETPOLL -static inline int netpoll_rx(struct sk_buff *skb) +static inline bool netpoll_rx(struct sk_buff *skb)  {  	struct netpoll_info *npinfo = skb->dev->npinfo;  	unsigned long flags; -	int ret = 0; +	bool ret = false; -	if (!npinfo || (!npinfo->rx_np && !npinfo->rx_flags)) -		return 0; +	if (!npinfo || (list_empty(&npinfo->rx_np) && !npinfo->rx_flags)) +		return false;  	spin_lock_irqsave(&npinfo->rx_lock, flags);  	/* check rx_flags again with the lock held */  	if (npinfo->rx_flags && __netpoll_rx(skb)) -		ret = 1; +		ret = true;  	spin_unlock_irqrestore(&npinfo->rx_lock, flags);  	return ret; @@ -67,7 +77,7 @@ static inline int netpoll_rx_on(struct sk_buff *skb)  {  	struct netpoll_info *npinfo = skb->dev->npinfo; -	return npinfo && (npinfo->rx_np || npinfo->rx_flags); +	return npinfo && (!list_empty(&npinfo->rx_np) || npinfo->rx_flags);  }  static inline int netpoll_receive_skb(struct sk_buff *skb) diff --git a/include/linux/nfs_fs.h b/include/linux/nfs_fs.h index d09db1bc908..77c2ae53431 100644 --- a/include/linux/nfs_fs.h +++ b/include/linux/nfs_fs.h @@ -33,9 +33,6 @@  #define FLUSH_STABLE		4	/* commit to stable storage */  #define FLUSH_LOWPRI		8	/* low priority background flush */  #define FLUSH_HIGHPRI		16	/* high priority memory reclaim flush */ -#define FLUSH_NOCOMMIT		32	/* Don't send the NFSv3/v4 COMMIT */ -#define FLUSH_INVALIDATE	64	/* Invalidate the page cache */ -#define FLUSH_NOWRITEPAGE	128	/* Don't call writepage() */  #ifdef __KERNEL__ @@ -166,6 +163,7 @@ struct nfs_inode {  	struct radix_tree_root	nfs_page_tree;  	unsigned long		npages; +	unsigned long		ncommit;  	/* Open contexts for shared mmap writes */  	struct list_head	open_files; @@ -211,6 +209,7 @@ struct nfs_inode {  #define NFS_INO_FLUSHING	(4)		/* inode is flushing out data */  #define NFS_INO_FSCACHE		(5)		/* inode can be cached by FS-Cache */  #define NFS_INO_FSCACHE_LOCK	(6)		/* FS-Cache cookie management lock */ +#define NFS_INO_COMMIT		(7)		/* inode is committing unstable writes */  static inline struct nfs_inode *NFS_I(const struct inode *inode)  { @@ -349,7 +348,6 @@ extern int nfs_attribute_timeout(struct inode *inode);  extern int nfs_revalidate_inode(struct nfs_server *server, struct inode *inode);  extern int __nfs_revalidate_inode(struct nfs_server *, struct inode *);  extern int nfs_revalidate_mapping(struct inode *inode, struct address_space *mapping); -extern int nfs_revalidate_mapping_nolock(struct inode *inode, struct address_space *mapping);  extern int nfs_setattr(struct dentry *, struct iattr *);  extern void nfs_setattr_update_inode(struct inode *inode, struct iattr *attr);  extern struct nfs_open_context *get_nfs_open_context(struct nfs_open_context *ctx); @@ -358,6 +356,20 @@ extern struct nfs_open_context *nfs_find_open_context(struct inode *inode, struc  extern u64 nfs_compat_user_ino64(u64 fileid);  extern void nfs_fattr_init(struct nfs_fattr *fattr); +extern struct nfs_fattr *nfs_alloc_fattr(void); + +static inline void nfs_free_fattr(const struct nfs_fattr *fattr) +{ +	kfree(fattr); +} + +extern struct nfs_fh *nfs_alloc_fhandle(void); + +static inline void nfs_free_fhandle(const struct nfs_fh *fh) +{ +	kfree(fh); +} +  /* linux/net/ipv4/ipconfig.c: trims ip addr off front of name, too. */  extern __be32 root_nfs_parse_addr(char *name); /*__init*/  extern unsigned long nfs_inc_attr_generation_counter(void); @@ -477,21 +489,12 @@ extern int nfs_writeback_done(struct rpc_task *, struct nfs_write_data *);   * Try to write back everything synchronously (but check the   * return value!)   */ -extern long nfs_sync_mapping_wait(struct address_space *, struct writeback_control *, int);  extern int nfs_wb_all(struct inode *inode); -extern int nfs_wb_nocommit(struct inode *inode);  extern int nfs_wb_page(struct inode *inode, struct page* page);  extern int nfs_wb_page_cancel(struct inode *inode, struct page* page);  #if defined(CONFIG_NFS_V3) || defined(CONFIG_NFS_V4) -extern int  nfs_commit_inode(struct inode *, int);  extern struct nfs_write_data *nfs_commitdata_alloc(void);  extern void nfs_commit_free(struct nfs_write_data *wdata); -#else -static inline int -nfs_commit_inode(struct inode *inode, int how) -{ -	return 0; -}  #endif  static inline int diff --git a/include/linux/nfs_fs_sb.h b/include/linux/nfs_fs_sb.h index 34fc6be5bfc..d6e10a4c06e 100644 --- a/include/linux/nfs_fs_sb.h +++ b/include/linux/nfs_fs_sb.h @@ -44,7 +44,6 @@ struct nfs_client {  #ifdef CONFIG_NFS_V4  	u64			cl_clientid;	/* constant */ -	nfs4_verifier		cl_confirm;  	unsigned long		cl_state;  	struct rb_root		cl_openowner_id; @@ -105,7 +104,7 @@ struct nfs_server {  	struct rpc_clnt *	client;		/* RPC client handle */  	struct rpc_clnt *	client_acl;	/* ACL RPC client handle */  	struct nlm_host		*nlm_host;	/* NLM client handle */ -	struct nfs_iostats *	io_stats;	/* I/O statistics */ +	struct nfs_iostats __percpu *io_stats;	/* I/O statistics */  	struct backing_dev_info	backing_dev_info;  	atomic_long_t		writeback;	/* number of writeback pages */  	int			flags;		/* various flags */ @@ -176,6 +175,7 @@ struct nfs_server {  #define NFS_CAP_ATIME		(1U << 11)  #define NFS_CAP_CTIME		(1U << 12)  #define NFS_CAP_MTIME		(1U << 13) +#define NFS_CAP_POSIX_LOCK	(1U << 14)  /* maximum number of slots to use */ @@ -193,6 +193,8 @@ struct nfs4_slot_table {  	int		max_slots;		/* # slots in table */  	int		highest_used_slotid;	/* sent to server on each SEQ.  						 * op for dynamic resizing */ +	int		target_max_slots;	/* Set by CB_RECALL_SLOT as +						 * the new max_slots */  };  static inline int slot_idx(struct nfs4_slot_table *tbl, struct nfs4_slot *sp) diff --git a/include/linux/nfs_xdr.h b/include/linux/nfs_xdr.h index 89b28812ec2..51914d7d6cc 100644 --- a/include/linux/nfs_xdr.h +++ b/include/linux/nfs_xdr.h @@ -386,8 +386,8 @@ struct nfs_removeargs {  struct nfs_removeres {  	const struct nfs_server *server; +	struct nfs_fattr	*dir_attr;  	struct nfs4_change_info	cinfo; -	struct nfs_fattr	dir_attr;  	struct nfs4_sequence_res 	seq_res;  }; @@ -824,6 +824,11 @@ struct nfs4_setclientid {  	u32				sc_cb_ident;  }; +struct nfs4_setclientid_res { +	u64				clientid; +	nfs4_verifier			confirm; +}; +  struct nfs4_statfs_arg {  	const struct nfs_fh *		fh;  	const u32 *			bitmask; diff --git a/include/linux/nfsd/nfsfh.h b/include/linux/nfsd/nfsfh.h index 65e333afaee..80d55bbc536 100644 --- a/include/linux/nfsd/nfsfh.h +++ b/include/linux/nfsd/nfsfh.h @@ -40,12 +40,12 @@ struct nfs_fhbase_old {   * This is the new flexible, extensible style NFSv2/v3 file handle.   * by Neil Brown <neilb@cse.unsw.edu.au> - March 2000   * - * The file handle is seens as a list of 4byte words. - * The first word contains a version number (1) and four descriptor bytes + * The file handle starts with a sequence of four-byte words. + * The first word contains a version number (1) and three descriptor bytes   * that tell how the remaining 3 variable length fields should be handled.   * These three bytes are auth_type, fsid_type and fileid_type.   * - * All 4byte values are in host-byte-order. + * All four-byte values are in host-byte-order.   *   * The auth_type field specifies how the filehandle can be authenticated   * This might allow a file to be confirmed to be in a writable part of a diff --git a/include/linux/nilfs2_fs.h b/include/linux/nilfs2_fs.h index 3fe02cf8b65..8c2c6116e78 100644 --- a/include/linux/nilfs2_fs.h +++ b/include/linux/nilfs2_fs.h @@ -153,6 +153,7 @@ struct nilfs_super_root {  						   semantics also for data */  #define NILFS_MOUNT_NORECOVERY		0x4000  /* Disable write access during  						   mount-time recovery */ +#define NILFS_MOUNT_DISCARD		0x8000  /* Issue DISCARD requests */  /** @@ -198,16 +199,15 @@ struct nilfs_super_block {  	__le32	s_creator_os;		/* OS */  	__le16	s_def_resuid;		/* Default uid for reserved blocks */  	__le16	s_def_resgid;		/* Default gid for reserved blocks */ -	__le32	s_first_ino; 		/* First non-reserved inode */ +	__le32	s_first_ino;		/* First non-reserved inode */ -	__le16  s_inode_size; 		/* Size of an inode */ +	__le16  s_inode_size;		/* Size of an inode */  	__le16  s_dat_entry_size;       /* Size of a dat entry */  	__le16  s_checkpoint_size;      /* Size of a checkpoint */  	__le16	s_segment_usage_size;	/* Size of a segment usage */  	__u8	s_uuid[16];		/* 128-bit uuid for volume */ -	char	s_volume_name[16]; 	/* volume name */ -	char	s_last_mounted[64]; 	/* directory where last mounted */ +	char	s_volume_name[80];	/* volume name */  	__le32  s_c_interval;           /* Commit interval of segment */  	__le32  s_c_block_max;          /* Threshold of data amount for @@ -376,6 +376,7 @@ union nilfs_binfo {   * @ss_nfinfo: number of finfo structures   * @ss_sumbytes: total size of segment summary in bytes   * @ss_pad: padding + * @ss_cno: checkpoint number   */  struct nilfs_segment_summary {  	__le32 ss_datasum; @@ -390,6 +391,7 @@ struct nilfs_segment_summary {  	__le32 ss_nfinfo;  	__le32 ss_sumbytes;  	__le32 ss_pad; +	__le64 ss_cno;  	/* array of finfo structures */  }; @@ -436,10 +438,10 @@ struct nilfs_palloc_group_desc {  /**   * struct nilfs_dat_entry - disk address translation entry - * @dt_blocknr: block number - * @dt_start: start checkpoint number - * @dt_end: end checkpoint number - * @dt_rsv: reserved for future use + * @de_blocknr: block number + * @de_start: start checkpoint number + * @de_end: end checkpoint number + * @de_rsv: reserved for future use   */  struct nilfs_dat_entry {  	__le64 de_blocknr; diff --git a/include/linux/nl80211.h b/include/linux/nl80211.h index da8ea2e1927..b7c77f9712f 100644 --- a/include/linux/nl80211.h +++ b/include/linux/nl80211.h @@ -3,7 +3,7 @@  /*   * 802.11 netlink interface public header   * - * Copyright 2006, 2007, 2008 Johannes Berg <johannes@sipsolutions.net> + * Copyright 2006-2010 Johannes Berg <johannes@sipsolutions.net>   * Copyright 2008 Michael Wu <flamingice@sourmilk.net>   * Copyright 2008 Luis Carlos Cobo <luisca@cozybit.com>   * Copyright 2008 Michael Buesch <mb@bu3sch.de> @@ -52,6 +52,8 @@   *	%NL80211_ATTR_WIPHY_CHANNEL_TYPE, %NL80211_ATTR_WIPHY_RETRY_SHORT,   *	%NL80211_ATTR_WIPHY_RETRY_LONG, %NL80211_ATTR_WIPHY_FRAG_THRESHOLD,   *	and/or %NL80211_ATTR_WIPHY_RTS_THRESHOLD. + *	However, for setting the channel, see %NL80211_CMD_SET_CHANNEL + *	instead, the support here is for backward compatibility only.   * @NL80211_CMD_NEW_WIPHY: Newly created wiphy, response to get request   *	or rename notification. Has attributes %NL80211_ATTR_WIPHY and   *	%NL80211_ATTR_WIPHY_NAME. @@ -270,6 +272,75 @@   * @NL80211_CMD_SET_WIPHY_NETNS: Set a wiphy's netns. Note that all devices   *	associated with this wiphy must be down and will follow.   * + * @NL80211_CMD_REMAIN_ON_CHANNEL: Request to remain awake on the specified + *	channel for the specified amount of time. This can be used to do + *	off-channel operations like transmit a Public Action frame and wait for + *	a response while being associated to an AP on another channel. + *	%NL80211_ATTR_WIPHY or %NL80211_ATTR_IFINDEX is used to specify which + *	radio is used. %NL80211_ATTR_WIPHY_FREQ is used to specify the + *	frequency for the operation and %NL80211_ATTR_WIPHY_CHANNEL_TYPE may be + *	optionally used to specify additional channel parameters. + *	%NL80211_ATTR_DURATION is used to specify the duration in milliseconds + *	to remain on the channel. This command is also used as an event to + *	notify when the requested duration starts (it may take a while for the + *	driver to schedule this time due to other concurrent needs for the + *	radio). + *	When called, this operation returns a cookie (%NL80211_ATTR_COOKIE) + *	that will be included with any events pertaining to this request; + *	the cookie is also used to cancel the request. + * @NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL: This command can be used to cancel a + *	pending remain-on-channel duration if the desired operation has been + *	completed prior to expiration of the originally requested duration. + *	%NL80211_ATTR_WIPHY or %NL80211_ATTR_IFINDEX is used to specify the + *	radio. The %NL80211_ATTR_COOKIE attribute must be given as well to + *	uniquely identify the request. + *	This command is also used as an event to notify when a requested + *	remain-on-channel duration has expired. + * + * @NL80211_CMD_SET_TX_BITRATE_MASK: Set the mask of rates to be used in TX + *	rate selection. %NL80211_ATTR_IFINDEX is used to specify the interface + *	and @NL80211_ATTR_TX_RATES the set of allowed rates. + * + * @NL80211_CMD_REGISTER_ACTION: Register for receiving certain action frames + *	(via @NL80211_CMD_ACTION) for processing in userspace. This command + *	requires an interface index and a match attribute containing the first + *	few bytes of the frame that should match, e.g. a single byte for only + *	a category match or four bytes for vendor frames including the OUI. + *	The registration cannot be dropped, but is removed automatically + *	when the netlink socket is closed. Multiple registrations can be made. + * @NL80211_CMD_ACTION: Action frame TX request and RX notification. This + *	command is used both as a request to transmit an Action frame and as an + *	event indicating reception of an Action frame that was not processed in + *	kernel code, but is for us (i.e., which may need to be processed in a + *	user space application). %NL80211_ATTR_FRAME is used to specify the + *	frame contents (including header). %NL80211_ATTR_WIPHY_FREQ (and + *	optionally %NL80211_ATTR_WIPHY_CHANNEL_TYPE) is used to indicate on + *	which channel the frame is to be transmitted or was received. This + *	channel has to be the current channel (remain-on-channel or the + *	operational channel). When called, this operation returns a cookie + *	(%NL80211_ATTR_COOKIE) that will be included with the TX status event + *	pertaining to the TX request. + * @NL80211_CMD_ACTION_TX_STATUS: Report TX status of an Action frame + *	transmitted with %NL80211_CMD_ACTION. %NL80211_ATTR_COOKIE identifies + *	the TX command and %NL80211_ATTR_FRAME includes the contents of the + *	frame. %NL80211_ATTR_ACK flag is included if the recipient acknowledged + *	the frame. + * @NL80211_CMD_SET_CQM: Connection quality monitor configuration. This command + *	is used to configure connection quality monitoring notification trigger + *	levels. + * @NL80211_CMD_NOTIFY_CQM: Connection quality monitor notification. This + *	command is used as an event to indicate the that a trigger level was + *	reached. + * @NL80211_CMD_SET_CHANNEL: Set the channel (using %NL80211_ATTR_WIPHY_FREQ + *	and %NL80211_ATTR_WIPHY_CHANNEL_TYPE) the given interface (identifed + *	by %NL80211_ATTR_IFINDEX) shall operate on. + *	In case multiple channels are supported by the device, the mechanism + *	with which it switches channels is implementation-defined. + *	When a monitor interface is given, it can only switch channel while + *	no other interfaces are operating to avoid disturbing the operation + *	of any other interfaces, and other interfaces will again take + *	precedence when they are used. + *   * @NL80211_CMD_MAX: highest used command number   * @__NL80211_CMD_AFTER_LAST: internal use   */ @@ -353,6 +424,23 @@ enum nl80211_commands {  	NL80211_CMD_DEL_PMKSA,  	NL80211_CMD_FLUSH_PMKSA, +	NL80211_CMD_REMAIN_ON_CHANNEL, +	NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL, + +	NL80211_CMD_SET_TX_BITRATE_MASK, + +	NL80211_CMD_REGISTER_ACTION, +	NL80211_CMD_ACTION, +	NL80211_CMD_ACTION_TX_STATUS, + +	NL80211_CMD_SET_POWER_SAVE, +	NL80211_CMD_GET_POWER_SAVE, + +	NL80211_CMD_SET_CQM, +	NL80211_CMD_NOTIFY_CQM, + +	NL80211_CMD_SET_CHANNEL, +  	/* add new commands above here */  	/* used to define NL80211_CMD_MAX below */ @@ -402,6 +490,8 @@ enum nl80211_commands {   * @NL80211_ATTR_WIPHY_RTS_THRESHOLD: RTS threshold (TX frames with length   *	larger than or equal to this use RTS/CTS handshake); allowed range:   *	0..65536, disable with (u32)-1; dot11RTSThreshold; u32 + * @NL80211_ATTR_WIPHY_COVERAGE_CLASS: Coverage Class as defined by IEEE 802.11 + *	section 7.3.2.9; dot11CoverageClass; u8   *   * @NL80211_ATTR_IFINDEX: network interface index of the device to operate on   * @NL80211_ATTR_IFNAME: network interface name @@ -606,6 +696,35 @@ enum nl80211_commands {   * @NL80211_ATTR_MAX_NUM_PMKIDS: maximum number of PMKIDs a firmware can   *	cache, a wiphy attribute.   * + * @NL80211_ATTR_DURATION: Duration of an operation in milliseconds, u32. + * + * @NL80211_ATTR_COOKIE: Generic 64-bit cookie to identify objects. + * + * @NL80211_ATTR_TX_RATES: Nested set of attributes + *	(enum nl80211_tx_rate_attributes) describing TX rates per band. The + *	enum nl80211_band value is used as the index (nla_type() of the nested + *	data. If a band is not included, it will be configured to allow all + *	rates based on negotiated supported rates information. This attribute + *	is used with %NL80211_CMD_SET_TX_BITRATE_MASK. + * + * @NL80211_ATTR_FRAME_MATCH: A binary attribute which typically must contain + *	at least one byte, currently used with @NL80211_CMD_REGISTER_ACTION. + * + * @NL80211_ATTR_ACK: Flag attribute indicating that the frame was + *	acknowledged by the recipient. + * + * @NL80211_ATTR_CQM: connection quality monitor configuration in a + *	nested attribute with %NL80211_ATTR_CQM_* sub-attributes. + * + * @NL80211_ATTR_LOCAL_STATE_CHANGE: Flag attribute to indicate that a command + *	is requesting a local authentication/association state change without + *	invoking actual management frame exchange. This can be used with + *	NL80211_CMD_AUTHENTICATE, NL80211_CMD_DEAUTHENTICATE, + *	NL80211_CMD_DISASSOCIATE. + * + * @NL80211_ATTR_AP_ISOLATE: (AP mode) Do not forward traffic between stations + *	connected to this BSS. + *   * @NL80211_ATTR_MAX: highest attribute number currently defined   * @__NL80211_ATTR_AFTER_LAST: internal use   */ @@ -743,6 +862,26 @@ enum nl80211_attrs {  	NL80211_ATTR_PMKID,  	NL80211_ATTR_MAX_NUM_PMKIDS, +	NL80211_ATTR_DURATION, + +	NL80211_ATTR_COOKIE, + +	NL80211_ATTR_WIPHY_COVERAGE_CLASS, + +	NL80211_ATTR_TX_RATES, + +	NL80211_ATTR_FRAME_MATCH, + +	NL80211_ATTR_ACK, + +	NL80211_ATTR_PS_STATE, + +	NL80211_ATTR_CQM, + +	NL80211_ATTR_LOCAL_STATE_CHANGE, + +	NL80211_ATTR_AP_ISOLATE, +  	/* add attributes here, update the policy in nl80211.c */  	__NL80211_ATTR_AFTER_LAST, @@ -1323,13 +1462,20 @@ enum nl80211_channel_type {   * @NL80211_BSS_BEACON_INTERVAL: beacon interval of the (I)BSS (u16)   * @NL80211_BSS_CAPABILITY: capability field (CPU order, u16)   * @NL80211_BSS_INFORMATION_ELEMENTS: binary attribute containing the - *	raw information elements from the probe response/beacon (bin) + *	raw information elements from the probe response/beacon (bin); + *	if the %NL80211_BSS_BEACON_IES attribute is present, the IEs here are + *	from a Probe Response frame; otherwise they are from a Beacon frame. + *	However, if the driver does not indicate the source of the IEs, these + *	IEs may be from either frame subtype.   * @NL80211_BSS_SIGNAL_MBM: signal strength of probe response/beacon   *	in mBm (100 * dBm) (s32)   * @NL80211_BSS_SIGNAL_UNSPEC: signal strength of the probe response/beacon   *	in unspecified units, scaled to 0..100 (u8)   * @NL80211_BSS_STATUS: status, if this BSS is "used"   * @NL80211_BSS_SEEN_MS_AGO: age of this BSS entry in ms + * @NL80211_BSS_BEACON_IES: binary attribute containing the raw information + *	elements from a Beacon frame (bin); not present if no Beacon frame has + *	yet been received   * @__NL80211_BSS_AFTER_LAST: internal   * @NL80211_BSS_MAX: highest BSS attribute   */ @@ -1345,6 +1491,7 @@ enum nl80211_bss {  	NL80211_BSS_SIGNAL_UNSPEC,  	NL80211_BSS_STATUS,  	NL80211_BSS_SEEN_MS_AGO, +	NL80211_BSS_BEACON_IES,  	/* keep last */  	__NL80211_BSS_AFTER_LAST, @@ -1442,4 +1589,74 @@ enum nl80211_key_attributes {  	NL80211_KEY_MAX = __NL80211_KEY_AFTER_LAST - 1  }; +/** + * enum nl80211_tx_rate_attributes - TX rate set attributes + * @__NL80211_TXRATE_INVALID: invalid + * @NL80211_TXRATE_LEGACY: Legacy (non-MCS) rates allowed for TX rate selection + *	in an array of rates as defined in IEEE 802.11 7.3.2.2 (u8 values with + *	1 = 500 kbps) but without the IE length restriction (at most + *	%NL80211_MAX_SUPP_RATES in a single array). + * @__NL80211_TXRATE_AFTER_LAST: internal + * @NL80211_TXRATE_MAX: highest TX rate attribute + */ +enum nl80211_tx_rate_attributes { +	__NL80211_TXRATE_INVALID, +	NL80211_TXRATE_LEGACY, + +	/* keep last */ +	__NL80211_TXRATE_AFTER_LAST, +	NL80211_TXRATE_MAX = __NL80211_TXRATE_AFTER_LAST - 1 +}; + +/** + * enum nl80211_band - Frequency band + * @NL80211_BAND_2GHZ - 2.4 GHz ISM band + * @NL80211_BAND_5GHZ - around 5 GHz band (4.9 - 5.7 GHz) + */ +enum nl80211_band { +	NL80211_BAND_2GHZ, +	NL80211_BAND_5GHZ, +}; + +enum nl80211_ps_state { +	NL80211_PS_DISABLED, +	NL80211_PS_ENABLED, +}; + +/** + * enum nl80211_attr_cqm - connection quality monitor attributes + * @__NL80211_ATTR_CQM_INVALID: invalid + * @NL80211_ATTR_CQM_RSSI_THOLD: RSSI threshold in dBm. This value specifies + *	the threshold for the RSSI level at which an event will be sent. Zero + *	to disable. + * @NL80211_ATTR_CQM_RSSI_HYST: RSSI hysteresis in dBm. This value specifies + *	the minimum amount the RSSI level must change after an event before a + *	new event may be issued (to reduce effects of RSSI oscillation). + * @NL80211_ATTR_CQM_RSSI_THRESHOLD_EVENT: RSSI threshold event + * @__NL80211_ATTR_CQM_AFTER_LAST: internal + * @NL80211_ATTR_CQM_MAX: highest key attribute + */ +enum nl80211_attr_cqm { +	__NL80211_ATTR_CQM_INVALID, +	NL80211_ATTR_CQM_RSSI_THOLD, +	NL80211_ATTR_CQM_RSSI_HYST, +	NL80211_ATTR_CQM_RSSI_THRESHOLD_EVENT, + +	/* keep last */ +	__NL80211_ATTR_CQM_AFTER_LAST, +	NL80211_ATTR_CQM_MAX = __NL80211_ATTR_CQM_AFTER_LAST - 1 +}; + +/** + * enum nl80211_cqm_rssi_threshold_event - RSSI threshold event + * @NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW - The RSSI level is lower than the + *      configured threshold + * @NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH - The RSSI is higher than the + *      configured threshold + */ +enum nl80211_cqm_rssi_threshold_event { +	NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW, +	NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH, +}; +  #endif /* __LINUX_NL80211_H */ diff --git a/include/linux/nodemask.h b/include/linux/nodemask.h index 454997cccbd..dba35e41337 100644 --- a/include/linux/nodemask.h +++ b/include/linux/nodemask.h @@ -69,8 +69,6 @@   * int node_online(node)		Is some node online?   * int node_possible(node)		Is some node possible?   * - * int any_online_node(mask)		First online node in mask - *   * node_set_online(node)		set bit 'node' in node_online_map   * node_set_offline(node)		clear bit 'node' in node_online_map   * @@ -467,15 +465,6 @@ static inline int num_node_state(enum node_states state)  #define node_online_map 	node_states[N_ONLINE]  #define node_possible_map 	node_states[N_POSSIBLE] -#define any_online_node(mask)			\ -({						\ -	int node;				\ -	for_each_node_mask(node, (mask))	\ -		if (node_online(node))		\ -			break;			\ -	node;					\ -}) -  #define num_online_nodes()	num_node_state(N_ONLINE)  #define num_possible_nodes()	num_node_state(N_POSSIBLE)  #define node_online(node)	node_state((node), N_ONLINE) @@ -494,7 +483,7 @@ static inline int num_node_state(enum node_states state)  			type *name = kmalloc(sizeof(*name), gfp_flags)  #define NODEMASK_FREE(m)			kfree(m)  #else -#define NODEMASK_ALLOC(type, name, gfp_flags)	type _name, *name = &_name +#define NODEMASK_ALLOC(type, name, gfp_flags)	type _##name, *name = &_##name  #define NODEMASK_FREE(m)			do {} while (0)  #endif diff --git a/include/linux/notifier.h b/include/linux/notifier.h index fee6c2f6807..540703b555c 100644 --- a/include/linux/notifier.h +++ b/include/linux/notifier.h @@ -164,7 +164,10 @@ extern int __srcu_notifier_call_chain(struct srcu_notifier_head *nh,  /* Encapsulate (negative) errno value (in particular, NOTIFY_BAD <=> EPERM). */  static inline int notifier_from_errno(int err)  { -	return NOTIFY_STOP_MASK | (NOTIFY_OK - err); +	if (err) +		return NOTIFY_STOP_MASK | (NOTIFY_OK - err); + +	return NOTIFY_OK;  }  /* Restore (negative) errno value from notify return value. */ @@ -182,7 +185,10 @@ static inline int notifier_to_errno(int ret)   *	VC switch chains (for loadable kernel svgalib VC switch helpers) etc...   */ -/* netdevice notifier chain */ +/* netdevice notifier chain. Please remember to update the rtnetlink + * notification exclusion list in rtnetlink_event() when adding new + * types. + */  #define NETDEV_UP	0x0001	/* For now you can't veto a device up/down */  #define NETDEV_DOWN	0x0002  #define NETDEV_REBOOT	0x0003	/* Tell a protocol stack a network interface @@ -199,10 +205,11 @@ static inline int notifier_to_errno(int ret)  #define NETDEV_FEAT_CHANGE	0x000B  #define NETDEV_BONDING_FAILOVER 0x000C  #define NETDEV_PRE_UP		0x000D -#define NETDEV_BONDING_OLDTYPE  0x000E -#define NETDEV_BONDING_NEWTYPE  0x000F +#define NETDEV_PRE_TYPE_CHANGE	0x000E +#define NETDEV_POST_TYPE_CHANGE	0x000F  #define NETDEV_POST_INIT	0x0010  #define NETDEV_UNREGISTER_BATCH 0x0011 +#define NETDEV_BONDING_DESLAVE  0x0012  #define SYS_DOWN	0x0001	/* Notify of system down */  #define SYS_RESTART	SYS_DOWN diff --git a/include/linux/of.h b/include/linux/of.h index e7facd8fbce..a367e19bb3a 100644 --- a/include/linux/of.h +++ b/include/linux/of.h @@ -19,6 +19,11 @@  #include <linux/bitops.h>  #include <linux/kref.h>  #include <linux/mod_devicetable.h> +#include <linux/spinlock.h> + +#include <asm/byteorder.h> + +#ifdef CONFIG_OF  typedef u32 phandle;  typedef u32 ihandle; @@ -39,10 +44,7 @@ struct of_irq_controller;  struct device_node {  	const char *name;  	const char *type; -	phandle	node; -#if !defined(CONFIG_SPARC) -	phandle linux_phandle; -#endif +	phandle phandle;  	char	*full_name;  	struct	property *properties; @@ -63,6 +65,11 @@ struct device_node {  #endif  }; +/* Pointer for first entry in chain of all nodes. */ +extern struct device_node *allnodes; +extern struct device_node *of_chosen; +extern rwlock_t devtree_lock; +  static inline int of_node_check_flag(struct device_node *n, unsigned long flag)  {  	return test_bit(flag, &n->_flags); @@ -73,12 +80,6 @@ static inline void of_node_set_flag(struct device_node *n, unsigned long flag)  	set_bit(flag, &n->_flags);  } -static inline void -set_node_proc_entry(struct device_node *dn, struct proc_dir_entry *de) -{ -	dn->pde = de; -} -  extern struct device_node *of_find_all_nodes(struct device_node *prev);  #if defined(CONFIG_SPARC) @@ -101,26 +102,36 @@ extern void of_node_put(struct device_node *node);   */  /* Helper to read a big number; size is in cells (not bytes) */ -static inline u64 of_read_number(const u32 *cell, int size) +static inline u64 of_read_number(const __be32 *cell, int size)  {  	u64 r = 0;  	while (size--) -		r = (r << 32) | *(cell++); +		r = (r << 32) | be32_to_cpu(*(cell++));  	return r;  }  /* Like of_read_number, but we want an unsigned long result */ -#ifdef CONFIG_PPC32 -static inline unsigned long of_read_ulong(const u32 *cell, int size) +static inline unsigned long of_read_ulong(const __be32 *cell, int size)  { -	return cell[size-1]; +	/* toss away upper bits if unsigned long is smaller than u64 */ +	return of_read_number(cell, size);  } -#else -#define of_read_ulong(cell, size)	of_read_number(cell, size) -#endif  #include <asm/prom.h> +/* Default #address and #size cells.  Allow arch asm/prom.h to override */ +#if !defined(OF_ROOT_NODE_ADDR_CELLS_DEFAULT) +#define OF_ROOT_NODE_ADDR_CELLS_DEFAULT 1 +#define OF_ROOT_NODE_SIZE_CELLS_DEFAULT 1 +#endif + +/* Default string compare functions, Allow arch asm/prom.h to override */ +#if !defined(of_compat_cmp) +#define of_compat_cmp(s1, s2, l)	strcasecmp((s1), (s2)) +#define of_prop_cmp(s1, s2)		strcmp((s1), (s2)) +#define of_node_cmp(s1, s2)		strcasecmp((s1), (s2)) +#endif +  /* flag descriptions */  #define OF_DYNAMIC	1 /* node and properties were allocated via kmalloc */  #define OF_DETACHED	2 /* node has been detached from the device tree */ @@ -187,4 +198,19 @@ extern int of_parse_phandles_with_args(struct device_node *np,  	const char *list_name, const char *cells_name, int index,  	struct device_node **out_node, const void **out_args); +extern int of_machine_is_compatible(const char *compat); + +extern int prom_add_property(struct device_node* np, struct property* prop); +extern int prom_remove_property(struct device_node *np, struct property *prop); +extern int prom_update_property(struct device_node *np, +				struct property *newprop, +				struct property *oldprop); + +#if defined(CONFIG_OF_DYNAMIC) +/* For updating the device tree at runtime */ +extern void of_attach_node(struct device_node *); +extern void of_detach_node(struct device_node *); +#endif + +#endif /* CONFIG_OF */  #endif /* _LINUX_OF_H */ diff --git a/include/linux/of_device.h b/include/linux/of_device.h index d3a74e00a3e..11651facc5f 100644 --- a/include/linux/of_device.h +++ b/include/linux/of_device.h @@ -1,6 +1,7 @@  #ifndef _LINUX_OF_DEVICE_H  #define _LINUX_OF_DEVICE_H +#ifdef CONFIG_OF_DEVICE  #include <linux/device.h>  #include <linux/of.h>  #include <linux/mod_devicetable.h> @@ -10,7 +11,7 @@  #define	to_of_device(d) container_of(d, struct of_device, dev)  extern const struct of_device_id *of_match_device( -	const struct of_device_id *matches, const struct of_device *dev); +	const struct of_device_id *matches, const struct device *dev);  extern struct of_device *of_dev_get(struct of_device *dev);  extern void of_dev_put(struct of_device *dev); @@ -26,5 +27,6 @@ static inline void of_device_free(struct of_device *dev)  extern ssize_t of_device_get_modalias(struct of_device *ofdev,  					char *str, ssize_t len); +#endif /* CONFIG_OF_DEVICE */  #endif /* _LINUX_OF_DEVICE_H */ diff --git a/include/linux/of_fdt.h b/include/linux/of_fdt.h index 41d432b1355..71e1a916d3f 100644 --- a/include/linux/of_fdt.h +++ b/include/linux/of_fdt.h @@ -42,45 +42,66 @@   * ends when size is 0   */  struct boot_param_header { -	u32	magic;			/* magic word OF_DT_HEADER */ -	u32	totalsize;		/* total size of DT block */ -	u32	off_dt_struct;		/* offset to structure */ -	u32	off_dt_strings;		/* offset to strings */ -	u32	off_mem_rsvmap;		/* offset to memory reserve map */ -	u32	version;		/* format version */ -	u32	last_comp_version;	/* last compatible version */ +	__be32	magic;			/* magic word OF_DT_HEADER */ +	__be32	totalsize;		/* total size of DT block */ +	__be32	off_dt_struct;		/* offset to structure */ +	__be32	off_dt_strings;		/* offset to strings */ +	__be32	off_mem_rsvmap;		/* offset to memory reserve map */ +	__be32	version;		/* format version */ +	__be32	last_comp_version;	/* last compatible version */  	/* version 2 fields below */ -	u32	boot_cpuid_phys;	/* Physical CPU id we're booting on */ +	__be32	boot_cpuid_phys;	/* Physical CPU id we're booting on */  	/* version 3 fields below */ -	u32	dt_strings_size;	/* size of the DT strings block */ +	__be32	dt_strings_size;	/* size of the DT strings block */  	/* version 17 fields below */ -	u32	dt_struct_size;		/* size of the DT structure block */ +	__be32	dt_struct_size;		/* size of the DT structure block */  }; +#if defined(CONFIG_OF_FLATTREE) +/* TBD: Temporary export of fdt globals - remove when code fully merged */ +extern int __initdata dt_root_addr_cells; +extern int __initdata dt_root_size_cells; +extern struct boot_param_header *initial_boot_params; +  /* For scanning the flat device-tree at boot time */ -extern int __init of_scan_flat_dt(int (*it)(unsigned long node, -					    const char *uname, int depth, -					    void *data), -				  void *data); -extern void __init *of_get_flat_dt_prop(unsigned long node, const char *name, -					unsigned long *size); -extern int __init of_flat_dt_is_compatible(unsigned long node, -					   const char *name); -extern unsigned long __init of_get_flat_dt_root(void); +extern char *find_flat_dt_string(u32 offset); +extern int of_scan_flat_dt(int (*it)(unsigned long node, const char *uname, +				     int depth, void *data), +			   void *data); +extern void *of_get_flat_dt_prop(unsigned long node, const char *name, +				 unsigned long *size); +extern int of_flat_dt_is_compatible(unsigned long node, const char *name); +extern unsigned long of_get_flat_dt_root(void); +extern void early_init_dt_scan_chosen_arch(unsigned long node); +extern int early_init_dt_scan_chosen(unsigned long node, const char *uname, +				     int depth, void *data); +extern void early_init_dt_check_for_initrd(unsigned long node); +extern int early_init_dt_scan_memory(unsigned long node, const char *uname, +				     int depth, void *data); +extern void early_init_dt_add_memory_arch(u64 base, u64 size); +extern u64 early_init_dt_alloc_memory_arch(u64 size, u64 align); +extern u64 dt_mem_next_cell(int s, __be32 **cellp); + +/* + * If BLK_DEV_INITRD, the fdt early init code will call this function, + * to be provided by the arch code. start and end are specified as + * physical addresses. + */ +#ifdef CONFIG_BLK_DEV_INITRD +extern void early_init_dt_setup_initrd_arch(unsigned long start, +					    unsigned long end); +#endif + +/* Early flat tree scan hooks */ +extern int early_init_dt_scan_root(unsigned long node, const char *uname, +				   int depth, void *data);  /* Other Prototypes */ -extern void finish_device_tree(void);  extern void unflatten_device_tree(void);  extern void early_init_devtree(void *); -extern int machine_is_compatible(const char *compat); -extern void print_properties(struct device_node *node); -extern int prom_n_intr_cells(struct device_node* np); -extern void prom_get_irq_senses(unsigned char *senses, int off, int max); -extern int prom_add_property(struct device_node* np, struct property* prop); -extern int prom_remove_property(struct device_node *np, struct property *prop); -extern int prom_update_property(struct device_node *np, -				struct property *newprop, -				struct property *oldprop); +#else /* CONFIG_OF_FLATTREE */ +static inline void unflatten_device_tree(void) {} +#endif /* CONFIG_OF_FLATTREE */  #endif /* __ASSEMBLY__ */  #endif /* _LINUX_OF_FDT_H */ diff --git a/include/linux/of_platform.h b/include/linux/of_platform.h index 90840665133..1643d3761eb 100644 --- a/include/linux/of_platform.h +++ b/include/linux/of_platform.h @@ -11,6 +11,7 @@   *   */ +#ifdef CONFIG_OF_DEVICE  #include <linux/module.h>  #include <linux/device.h>  #include <linux/mod_devicetable.h> @@ -30,10 +31,6 @@ extern struct bus_type of_platform_bus_type;   */  struct of_platform_driver  { -	const char		*name; -	const struct of_device_id	*match_table; -	struct module		*owner; -  	int	(*probe)(struct of_device* dev,  			 const struct of_device_id *match);  	int	(*remove)(struct of_device* dev); @@ -66,5 +63,6 @@ static inline void of_unregister_platform_driver(struct of_platform_driver *drv)  extern struct of_device *of_find_device_by_node(struct device_node *np);  extern int of_bus_type_init(struct bus_type *bus, const char *name); +#endif /* CONFIG_OF_DEVICE */  #endif	/* _LINUX_OF_PLATFORM_H */ diff --git a/include/linux/omapfb.h b/include/linux/omapfb.h index f46c40ac6d4..9bdd91486b4 100644 --- a/include/linux/omapfb.h +++ b/include/linux/omapfb.h @@ -57,6 +57,7 @@  #define OMAPFB_WAITFORGO	OMAP_IO(60)  #define OMAPFB_GET_VRAM_INFO	OMAP_IOR(61, struct omapfb_vram_info)  #define OMAPFB_SET_TEARSYNC	OMAP_IOW(62, struct omapfb_tearsync_info) +#define OMAPFB_GET_DISPLAY_INFO	OMAP_IOR(63, struct omapfb_display_info)  #define OMAPFB_CAPS_GENERIC_MASK	0x00000fff  #define OMAPFB_CAPS_LCDC_MASK		0x00fff000 @@ -206,6 +207,14 @@ struct omapfb_tearsync_info {  	__u16 reserved2;  }; +struct omapfb_display_info { +	__u16 xres; +	__u16 yres; +	__u32 width;	/* phys width of the display in micrometers */ +	__u32 height;	/* phys height of the display in micrometers */ +	__u32 reserved[5]; +}; +  #ifdef __KERNEL__  #include <plat/board.h> diff --git a/include/linux/padata.h b/include/linux/padata.h new file mode 100644 index 00000000000..8d8406246ee --- /dev/null +++ b/include/linux/padata.h @@ -0,0 +1,143 @@ +/* + * padata.h - header for the padata parallelization interface + * + * Copyright (C) 2008, 2009 secunet Security Networks AG + * Copyright (C) 2008, 2009 Steffen Klassert <steffen.klassert@secunet.com> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#ifndef PADATA_H +#define PADATA_H + +#include <linux/workqueue.h> +#include <linux/spinlock.h> +#include <linux/list.h> +#include <linux/timer.h> + +/** + * struct padata_priv -  Embedded to the users data structure. + * + * @list: List entry, to attach to the padata lists. + * @pd: Pointer to the internal control structure. + * @cb_cpu: Callback cpu for serializatioon. + * @seq_nr: Sequence number of the parallelized data object. + * @info: Used to pass information from the parallel to the serial function. + * @parallel: Parallel execution function. + * @serial: Serial complete function. + */ +struct padata_priv { +	struct list_head	list; +	struct parallel_data	*pd; +	int			cb_cpu; +	int			seq_nr; +	int			info; +	void                    (*parallel)(struct padata_priv *padata); +	void                    (*serial)(struct padata_priv *padata); +}; + +/** + * struct padata_list + * + * @list: List head. + * @lock: List lock. + */ +struct padata_list { +	struct list_head        list; +	spinlock_t              lock; +}; + +/** + * struct padata_queue - The percpu padata queues. + * + * @parallel: List to wait for parallelization. + * @reorder: List to wait for reordering after parallel processing. + * @serial: List to wait for serialization after reordering. + * @pwork: work struct for parallelization. + * @swork: work struct for serialization. + * @pd: Backpointer to the internal control structure. + * @num_obj: Number of objects that are processed by this cpu. + * @cpu_index: Index of the cpu. + */ +struct padata_queue { +	struct padata_list	parallel; +	struct padata_list	reorder; +	struct padata_list	serial; +	struct work_struct	pwork; +	struct work_struct	swork; +	struct parallel_data    *pd; +	atomic_t		num_obj; +	int			cpu_index; +}; + +/** + * struct parallel_data - Internal control structure, covers everything + * that depends on the cpumask in use. + * + * @pinst: padata instance. + * @queue: percpu padata queues. + * @seq_nr: The sequence number that will be attached to the next object. + * @reorder_objects: Number of objects waiting in the reorder queues. + * @refcnt: Number of objects holding a reference on this parallel_data. + * @max_seq_nr:  Maximal used sequence number. + * @cpumask: cpumask in use. + * @lock: Reorder lock. + * @timer: Reorder timer. + */ +struct parallel_data { +	struct padata_instance	*pinst; +	struct padata_queue	*queue; +	atomic_t		seq_nr; +	atomic_t		reorder_objects; +	atomic_t                refcnt; +	unsigned int		max_seq_nr; +	cpumask_var_t		cpumask; +	spinlock_t              lock; +	struct timer_list       timer; +}; + +/** + * struct padata_instance - The overall control structure. + * + * @cpu_notifier: cpu hotplug notifier. + * @wq: The workqueue in use. + * @pd: The internal control structure. + * @cpumask: User supplied cpumask. + * @lock: padata instance lock. + * @flags: padata flags. + */ +struct padata_instance { +	struct notifier_block   cpu_notifier; +	struct workqueue_struct *wq; +	struct parallel_data	*pd; +	cpumask_var_t           cpumask; +	struct mutex		lock; +	u8			flags; +#define	PADATA_INIT		1 +#define	PADATA_RESET		2 +}; + +extern struct padata_instance *padata_alloc(const struct cpumask *cpumask, +					    struct workqueue_struct *wq); +extern void padata_free(struct padata_instance *pinst); +extern int padata_do_parallel(struct padata_instance *pinst, +			      struct padata_priv *padata, int cb_cpu); +extern void padata_do_serial(struct padata_priv *padata); +extern int padata_set_cpumask(struct padata_instance *pinst, +			      cpumask_var_t cpumask); +extern int padata_add_cpu(struct padata_instance *pinst, int cpu); +extern int padata_remove_cpu(struct padata_instance *pinst, int cpu); +extern void padata_start(struct padata_instance *pinst); +extern void padata_stop(struct padata_instance *pinst); +#endif diff --git a/include/linux/page_cgroup.h b/include/linux/page_cgroup.h index b0e4eb12623..5bb13b3db84 100644 --- a/include/linux/page_cgroup.h +++ b/include/linux/page_cgroup.h @@ -39,6 +39,8 @@ enum {  	PCG_CACHE, /* charged as cache */  	PCG_USED, /* this object is in use. */  	PCG_ACCT_LRU, /* page has been accounted for */ +	PCG_FILE_MAPPED, /* page is accounted as "mapped" */ +	PCG_MIGRATION, /* under page migration */  };  #define TESTPCGFLAG(uname, lname)			\ @@ -73,6 +75,15 @@ CLEARPCGFLAG(AcctLRU, ACCT_LRU)  TESTPCGFLAG(AcctLRU, ACCT_LRU)  TESTCLEARPCGFLAG(AcctLRU, ACCT_LRU) + +SETPCGFLAG(FileMapped, FILE_MAPPED) +CLEARPCGFLAG(FileMapped, FILE_MAPPED) +TESTPCGFLAG(FileMapped, FILE_MAPPED) + +SETPCGFLAG(Migration, MIGRATION) +CLEARPCGFLAG(Migration, MIGRATION) +TESTPCGFLAG(Migration, MIGRATION) +  static inline int page_cgroup_nid(struct page_cgroup *pc)  {  	return page_to_nid(pc->page); @@ -118,6 +129,8 @@ static inline void __init page_cgroup_init_flatmem(void)  #include <linux/swap.h>  #ifdef CONFIG_CGROUP_MEM_RES_CTLR_SWAP +extern unsigned short swap_cgroup_cmpxchg(swp_entry_t ent, +					unsigned short old, unsigned short new);  extern unsigned short swap_cgroup_record(swp_entry_t ent, unsigned short id);  extern unsigned short lookup_swap_cgroup(swp_entry_t ent);  extern int swap_cgroup_swapon(int type, unsigned long max_pages); diff --git a/include/linux/pci-acpi.h b/include/linux/pci-acpi.h index 93a7c08f869..c8b6473c5f4 100644 --- a/include/linux/pci-acpi.h +++ b/include/linux/pci-acpi.h @@ -11,6 +11,13 @@  #include <linux/acpi.h>  #ifdef CONFIG_ACPI +extern acpi_status pci_acpi_add_bus_pm_notifier(struct acpi_device *dev, +						 struct pci_bus *pci_bus); +extern acpi_status pci_acpi_remove_bus_pm_notifier(struct acpi_device *dev); +extern acpi_status pci_acpi_add_pm_notifier(struct acpi_device *dev, +					     struct pci_dev *pci_dev); +extern acpi_status pci_acpi_remove_pm_notifier(struct acpi_device *dev); +  static inline acpi_handle acpi_find_root_bridge_handle(struct pci_dev *pdev)  {  	struct pci_bus *pbus = pdev->bus; diff --git a/include/linux/pci-dma.h b/include/linux/pci-dma.h new file mode 100644 index 00000000000..549a041f9c0 --- /dev/null +++ b/include/linux/pci-dma.h @@ -0,0 +1,11 @@ +#ifndef _LINUX_PCI_DMA_H +#define _LINUX_PCI_DMA_H + +#define DECLARE_PCI_UNMAP_ADDR(ADDR_NAME) DEFINE_DMA_UNMAP_ADDR(ADDR_NAME); +#define DECLARE_PCI_UNMAP_LEN(LEN_NAME)   DEFINE_DMA_UNMAP_LEN(LEN_NAME); +#define pci_unmap_addr             dma_unmap_addr +#define pci_unmap_addr_set         dma_unmap_addr_set +#define pci_unmap_len              dma_unmap_len +#define pci_unmap_len_set          dma_unmap_len_set + +#endif diff --git a/include/linux/pci.h b/include/linux/pci.h index 174e5392e51..6a471aba3b0 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h @@ -187,6 +187,33 @@ enum pci_bus_flags {  	PCI_BUS_FLAGS_NO_MMRBC = (__force pci_bus_flags_t) 2,  }; +/* Based on the PCI Hotplug Spec, but some values are made up by us */ +enum pci_bus_speed { +	PCI_SPEED_33MHz			= 0x00, +	PCI_SPEED_66MHz			= 0x01, +	PCI_SPEED_66MHz_PCIX		= 0x02, +	PCI_SPEED_100MHz_PCIX		= 0x03, +	PCI_SPEED_133MHz_PCIX		= 0x04, +	PCI_SPEED_66MHz_PCIX_ECC	= 0x05, +	PCI_SPEED_100MHz_PCIX_ECC	= 0x06, +	PCI_SPEED_133MHz_PCIX_ECC	= 0x07, +	PCI_SPEED_66MHz_PCIX_266	= 0x09, +	PCI_SPEED_100MHz_PCIX_266	= 0x0a, +	PCI_SPEED_133MHz_PCIX_266	= 0x0b, +	AGP_UNKNOWN			= 0x0c, +	AGP_1X				= 0x0d, +	AGP_2X				= 0x0e, +	AGP_4X				= 0x0f, +	AGP_8X				= 0x10, +	PCI_SPEED_66MHz_PCIX_533	= 0x11, +	PCI_SPEED_100MHz_PCIX_533	= 0x12, +	PCI_SPEED_133MHz_PCIX_533	= 0x13, +	PCIE_SPEED_2_5GT		= 0x14, +	PCIE_SPEED_5_0GT		= 0x15, +	PCIE_SPEED_8_0GT		= 0x16, +	PCI_SPEED_UNKNOWN		= 0xff, +}; +  struct pci_cap_saved_state {  	struct hlist_node next;  	char cap_nr; @@ -239,6 +266,7 @@ struct pci_dev {  					   configuration space */  	unsigned int	pme_support:5;	/* Bitmask of states from which PME#  					   can be generated */ +	unsigned int	pme_interrupt:1;  	unsigned int	d1_support:1;	/* Low power state D1 is supported */  	unsigned int	d2_support:1;	/* Low power state D2 is supported */  	unsigned int	no_d1d2:1;	/* Only allow D0 and D3 */ @@ -275,14 +303,16 @@ struct pci_dev {  	unsigned int	msix_enabled:1;  	unsigned int	ari_enabled:1;	/* ARI forwarding */  	unsigned int	is_managed:1; -	unsigned int	is_pcie:1; +	unsigned int	is_pcie:1;	/* Obsolete. Will be removed. +					   Use pci_is_pcie() instead */  	unsigned int    needs_freset:1; /* Dev requires fundamental reset */  	unsigned int	state_saved:1;  	unsigned int	is_physfn:1;  	unsigned int	is_virtfn:1;  	unsigned int	reset_fn:1;  	unsigned int    is_hotplug_bridge:1; -	unsigned int    aer_firmware_first:1; +	unsigned int    __aer_firmware_first_valid:1; +	unsigned int	__aer_firmware_first:1;  	pci_dev_flags_t dev_flags;  	atomic_t	enable_cnt;	/* pci_enable_device has been called */ @@ -305,6 +335,16 @@ struct pci_dev {  #endif  }; +static inline struct pci_dev *pci_physfn(struct pci_dev *dev) +{ +#ifdef CONFIG_PCI_IOV +	if (dev->is_virtfn) +		dev = dev->physfn; +#endif + +	return dev; +} +  extern struct pci_dev *alloc_pci_dev(void);  #define pci_dev_b(n) list_entry(n, struct pci_dev, bus_list) @@ -335,9 +375,26 @@ static inline void pci_add_saved_cap(struct pci_dev *pci_dev,  	hlist_add_head(&new_cap->next, &pci_dev->saved_cap_space);  } -#ifndef PCI_BUS_NUM_RESOURCES -#define PCI_BUS_NUM_RESOURCES	16 -#endif +/* + * The first PCI_BRIDGE_RESOURCE_NUM PCI bus resources (those that correspond + * to P2P or CardBus bridge windows) go in a table.  Additional ones (for + * buses below host bridges or subtractive decode bridges) go in the list. + * Use pci_bus_for_each_resource() to iterate through all the resources. + */ + +/* + * PCI_SUBTRACTIVE_DECODE means the bridge forwards the window implicitly + * and there's no way to program the bridge with the details of the window. + * This does not apply to ACPI _CRS windows, even with the _DEC subtractive- + * decode bit set, because they are explicit and can be programmed with _SRS. + */ +#define PCI_SUBTRACTIVE_DECODE	0x1 + +struct pci_bus_resource { +	struct list_head list; +	struct resource *res; +	unsigned int flags; +};  #define PCI_REGION_FLAG_MASK	0x0fU	/* These bits of resource flags tell us the PCI region flags */ @@ -348,8 +405,8 @@ struct pci_bus {  	struct list_head devices;	/* list of devices on this bus */  	struct pci_dev	*self;		/* bridge device as seen by parent */  	struct list_head slots;		/* list of slots on this bus */ -	struct resource	*resource[PCI_BUS_NUM_RESOURCES]; -					/* address space routed to this bus */ +	struct resource *resource[PCI_BRIDGE_RESOURCE_NUM]; +	struct list_head resources;	/* address space routed to this bus */  	struct pci_ops	*ops;		/* configuration access functions */  	void		*sysdata;	/* hook for sys-specific extension */ @@ -359,6 +416,8 @@ struct pci_bus {  	unsigned char	primary;	/* number of primary bridge */  	unsigned char	secondary;	/* number of secondary bridge */  	unsigned char	subordinate;	/* max number of subordinate buses */ +	unsigned char	max_bus_speed;	/* enum pci_bus_speed */ +	unsigned char	cur_bus_speed;	/* enum pci_bus_speed */  	char		name[48]; @@ -563,7 +622,8 @@ int __must_check pcibios_enable_device(struct pci_dev *, int mask);  char *pcibios_setup(char *str);  /* Used only when drivers/pci/setup.c is used */ -void pcibios_align_resource(void *, struct resource *, resource_size_t, +resource_size_t pcibios_align_resource(void *, const struct resource *, +				resource_size_t,  				resource_size_t);  void pcibios_update_irq(struct pci_dev *, int irq); @@ -589,6 +649,7 @@ struct pci_bus *pci_create_bus(struct device *parent, int bus,  			       struct pci_ops *ops, void *sysdata);  struct pci_bus *pci_add_new_bus(struct pci_bus *parent, struct pci_dev *dev,  				int busnr); +void pcie_update_link_speed(struct pci_bus *bus, u16 link_status);  struct pci_slot *pci_create_slot(struct pci_bus *parent, int slot_nr,  				 const char *name,  				 struct hotplug_slot *hotplug); @@ -612,15 +673,12 @@ extern void pci_remove_bus_device(struct pci_dev *dev);  extern void pci_stop_bus_device(struct pci_dev *dev);  void pci_setup_cardbus(struct pci_bus *bus);  extern void pci_sort_breadthfirst(void); +#define dev_is_pci(d) ((d)->bus == &pci_bus_type) +#define dev_is_pf(d) ((dev_is_pci(d) ? to_pci_dev(d)->is_physfn : false)) +#define dev_num_vf(d) ((dev_is_pci(d) ? pci_num_vf(to_pci_dev(d)) : 0))  /* Generic PCI functions exported to card drivers */ -#ifdef CONFIG_PCI_LEGACY -struct pci_dev __deprecated *pci_find_device(unsigned int vendor, -					     unsigned int device, -					     struct pci_dev *from); -#endif /* CONFIG_PCI_LEGACY */ -  enum pci_lost_interrupt_reason {  	PCI_LOST_IRQ_NO_INFORMATION = 0,  	PCI_LOST_IRQ_DISABLE_MSI, @@ -631,6 +689,8 @@ enum pci_lost_interrupt_reason pci_lost_interrupt(struct pci_dev *dev);  int pci_find_capability(struct pci_dev *dev, int cap);  int pci_find_next_capability(struct pci_dev *dev, u8 pos, int cap);  int pci_find_ext_capability(struct pci_dev *dev, int cap); +int pci_bus_find_ext_capability(struct pci_bus *bus, unsigned int devfn, +				int cap);  int pci_find_ht_capability(struct pci_dev *dev, int ht_cap);  int pci_find_next_ht_capability(struct pci_dev *dev, int pos, int ht_cap);  struct pci_bus *pci_find_next_bus(const struct pci_bus *from); @@ -720,8 +780,6 @@ int pci_try_set_mwi(struct pci_dev *dev);  void pci_clear_mwi(struct pci_dev *dev);  void pci_intx(struct pci_dev *dev, int enable);  void pci_msi_off(struct pci_dev *dev); -int pci_set_dma_mask(struct pci_dev *dev, u64 mask); -int pci_set_consistent_dma_mask(struct pci_dev *dev, u64 mask);  int pci_set_dma_max_seg_size(struct pci_dev *dev, unsigned int size);  int pci_set_dma_seg_boundary(struct pci_dev *dev, unsigned long mask);  int pcix_get_max_mmrbc(struct pci_dev *dev); @@ -750,11 +808,23 @@ int pci_set_power_state(struct pci_dev *dev, pci_power_t state);  pci_power_t pci_choose_state(struct pci_dev *dev, pm_message_t state);  bool pci_pme_capable(struct pci_dev *dev, pci_power_t state);  void pci_pme_active(struct pci_dev *dev, bool enable); -int pci_enable_wake(struct pci_dev *dev, pci_power_t state, bool enable); +int __pci_enable_wake(struct pci_dev *dev, pci_power_t state, +		      bool runtime, bool enable);  int pci_wake_from_d3(struct pci_dev *dev, bool enable);  pci_power_t pci_target_state(struct pci_dev *dev);  int pci_prepare_to_sleep(struct pci_dev *dev);  int pci_back_from_sleep(struct pci_dev *dev); +bool pci_dev_run_wake(struct pci_dev *dev); + +static inline int pci_enable_wake(struct pci_dev *dev, pci_power_t state, +				  bool enable) +{ +	return __pci_enable_wake(dev, state, false, enable); +} + +/* For use by arch with custom probe code */ +void set_pcie_port_type(struct pci_dev *pdev); +void set_pcie_hotplug_bridge(struct pci_dev *pdev);  /* Functions for PCI Hotplug drivers to use */  int pci_bus_find_capability(struct pci_bus *bus, unsigned int devfn, int cap); @@ -772,6 +842,7 @@ void pci_bus_assign_resources(const struct pci_bus *bus);  void pci_bus_size_bridges(struct pci_bus *bus);  int pci_claim_resource(struct pci_dev *, int);  void pci_assign_unassigned_resources(void); +void pci_assign_unassigned_bridge_resources(struct pci_dev *bridge);  void pdev_enable_device(struct pci_dev *);  void pdev_sort_resources(struct pci_dev *, struct resource_list *);  int pci_enable_resources(struct pci_dev *, int mask); @@ -789,12 +860,23 @@ int pci_request_selected_regions_exclusive(struct pci_dev *, int, const char *);  void pci_release_selected_regions(struct pci_dev *, int);  /* drivers/pci/bus.c */ +void pci_bus_add_resource(struct pci_bus *bus, struct resource *res, unsigned int flags); +struct resource *pci_bus_resource_n(const struct pci_bus *bus, int n); +void pci_bus_remove_resources(struct pci_bus *bus); + +#define pci_bus_for_each_resource(bus, res, i)				\ +	for (i = 0;							\ +	    (res = pci_bus_resource_n(bus, i)) || i < PCI_BRIDGE_RESOURCE_NUM; \ +	     i++) +  int __must_check pci_bus_alloc_resource(struct pci_bus *bus,  			struct resource *res, resource_size_t size,  			resource_size_t align, resource_size_t min,  			unsigned int type_mask, -			void (*alignf)(void *, struct resource *, -				resource_size_t, resource_size_t), +			resource_size_t (*alignf)(void *, +						  const struct resource *, +						  resource_size_t, +						  resource_size_t),  			void *alignf_data);  void pci_enable_bridges(struct pci_bus *bus); @@ -831,6 +913,7 @@ int pci_set_vga_state(struct pci_dev *pdev, bool decode,  		      unsigned int command_bits, bool change_bridge);  /* kmem_cache style wrapper around pci_alloc_consistent() */ +#include <linux/pci-dma.h>  #include <linux/dmapool.h>  #define	pci_pool dma_pool @@ -955,6 +1038,11 @@ static inline int pci_proc_domain(struct pci_bus *bus)  }  #endif /* CONFIG_PCI_DOMAINS */ +/* some architectures require additional setup to direct VGA traffic */ +typedef int (*arch_set_vga_state_t)(struct pci_dev *pdev, bool decode, +		      unsigned int command_bits, bool change_bridge); +extern void pci_register_set_vga_state(arch_set_vga_state_t func); +  #else /* CONFIG_PCI is not enabled */  /* @@ -973,13 +1061,6 @@ static inline int pci_proc_domain(struct pci_bus *bus)  _PCI_NOP_ALL(read, *)  _PCI_NOP_ALL(write,) -static inline struct pci_dev *pci_find_device(unsigned int vendor, -					      unsigned int device, -					      struct pci_dev *from) -{ -	return NULL; -} -  static inline struct pci_dev *pci_get_device(unsigned int vendor,  					     unsigned int device,  					     struct pci_dev *from) @@ -1129,6 +1210,9 @@ static inline struct pci_dev *pci_get_bus_and_slot(unsigned int bus,  						unsigned int devfn)  { return NULL; } +#define dev_is_pci(d) (false) +#define dev_is_pf(d) (false) +#define dev_num_vf(d) (0)  #endif /* CONFIG_PCI */  /* Include architecture-dependent settings and functions */ @@ -1237,8 +1321,12 @@ enum pci_fixup_pass {  	DECLARE_PCI_FIXUP_SECTION(.pci_fixup_suspend,			\  			suspend##vendor##device##hook, vendor, device, hook) - +#ifdef CONFIG_PCI_QUIRKS  void pci_fixup_device(enum pci_fixup_pass pass, struct pci_dev *dev); +#else +static inline void pci_fixup_device(enum pci_fixup_pass pass, +				    struct pci_dev *dev) {} +#endif  void __iomem *pcim_iomap(struct pci_dev *pdev, int bar, unsigned long maxlen);  void pcim_iounmap(struct pci_dev *pdev, void __iomem *addr); @@ -1286,6 +1374,7 @@ void __iomem *pci_ioremap_bar(struct pci_dev *pdev, int bar);  extern int pci_enable_sriov(struct pci_dev *dev, int nr_virtfn);  extern void pci_disable_sriov(struct pci_dev *dev);  extern irqreturn_t pci_sriov_migration(struct pci_dev *dev); +extern int pci_num_vf(struct pci_dev *dev);  #else  static inline int pci_enable_sriov(struct pci_dev *dev, int nr_virtfn)  { @@ -1298,6 +1387,10 @@ static inline irqreturn_t pci_sriov_migration(struct pci_dev *dev)  {  	return IRQ_NONE;  } +static inline int pci_num_vf(struct pci_dev *dev) +{ +	return 0; +}  #endif  #if defined(CONFIG_HOTPLUG_PCI) || defined(CONFIG_HOTPLUG_PCI_MODULE) @@ -1334,5 +1427,93 @@ static inline bool pci_is_pcie(struct pci_dev *dev)  void pci_request_acs(void); + +#define PCI_VPD_LRDT			0x80	/* Large Resource Data Type */ +#define PCI_VPD_LRDT_ID(x)		(x | PCI_VPD_LRDT) + +/* Large Resource Data Type Tag Item Names */ +#define PCI_VPD_LTIN_ID_STRING		0x02	/* Identifier String */ +#define PCI_VPD_LTIN_RO_DATA		0x10	/* Read-Only Data */ +#define PCI_VPD_LTIN_RW_DATA		0x11	/* Read-Write Data */ + +#define PCI_VPD_LRDT_ID_STRING		PCI_VPD_LRDT_ID(PCI_VPD_LTIN_ID_STRING) +#define PCI_VPD_LRDT_RO_DATA		PCI_VPD_LRDT_ID(PCI_VPD_LTIN_RO_DATA) +#define PCI_VPD_LRDT_RW_DATA		PCI_VPD_LRDT_ID(PCI_VPD_LTIN_RW_DATA) + +/* Small Resource Data Type Tag Item Names */ +#define PCI_VPD_STIN_END		0x78	/* End */ + +#define PCI_VPD_SRDT_END		PCI_VPD_STIN_END + +#define PCI_VPD_SRDT_TIN_MASK		0x78 +#define PCI_VPD_SRDT_LEN_MASK		0x07 + +#define PCI_VPD_LRDT_TAG_SIZE		3 +#define PCI_VPD_SRDT_TAG_SIZE		1 + +#define PCI_VPD_INFO_FLD_HDR_SIZE	3 + +#define PCI_VPD_RO_KEYWORD_PARTNO	"PN" +#define PCI_VPD_RO_KEYWORD_MFR_ID	"MN" +#define PCI_VPD_RO_KEYWORD_VENDOR0	"V0" + +/** + * pci_vpd_lrdt_size - Extracts the Large Resource Data Type length + * @lrdt: Pointer to the beginning of the Large Resource Data Type tag + * + * Returns the extracted Large Resource Data Type length. + */ +static inline u16 pci_vpd_lrdt_size(const u8 *lrdt) +{ +	return (u16)lrdt[1] + ((u16)lrdt[2] << 8); +} + +/** + * pci_vpd_srdt_size - Extracts the Small Resource Data Type length + * @lrdt: Pointer to the beginning of the Small Resource Data Type tag + * + * Returns the extracted Small Resource Data Type length. + */ +static inline u8 pci_vpd_srdt_size(const u8 *srdt) +{ +	return (*srdt) & PCI_VPD_SRDT_LEN_MASK; +} + +/** + * pci_vpd_info_field_size - Extracts the information field length + * @lrdt: Pointer to the beginning of an information field header + * + * Returns the extracted information field length. + */ +static inline u8 pci_vpd_info_field_size(const u8 *info_field) +{ +	return info_field[2]; +} + +/** + * pci_vpd_find_tag - Locates the Resource Data Type tag provided + * @buf: Pointer to buffered vpd data + * @off: The offset into the buffer at which to begin the search + * @len: The length of the vpd buffer + * @rdt: The Resource Data Type to search for + * + * Returns the index where the Resource Data Type was found or + * -ENOENT otherwise. + */ +int pci_vpd_find_tag(const u8 *buf, unsigned int off, unsigned int len, u8 rdt); + +/** + * pci_vpd_find_info_keyword - Locates an information field keyword in the VPD + * @buf: Pointer to buffered vpd data + * @off: The offset into the buffer at which to begin the search + * @len: The length of the buffer area, relative to off, in which to search + * @kw: The keyword to search for + * + * Returns the index where the information field keyword was found or + * -ENOENT otherwise. + */ +int pci_vpd_find_info_keyword(const u8 *buf, unsigned int off, +			      unsigned int len, const char *kw); +  #endif /* __KERNEL__ */  #endif /* LINUX_PCI_H */ diff --git a/include/linux/pci_hotplug.h b/include/linux/pci_hotplug.h index 652ba797696..5d09cbafa7d 100644 --- a/include/linux/pci_hotplug.h +++ b/include/linux/pci_hotplug.h @@ -28,26 +28,6 @@  #ifndef _PCI_HOTPLUG_H  #define _PCI_HOTPLUG_H - -/* These values come from the PCI Hotplug Spec */ -enum pci_bus_speed { -	PCI_SPEED_33MHz			= 0x00, -	PCI_SPEED_66MHz			= 0x01, -	PCI_SPEED_66MHz_PCIX		= 0x02, -	PCI_SPEED_100MHz_PCIX		= 0x03, -	PCI_SPEED_133MHz_PCIX		= 0x04, -	PCI_SPEED_66MHz_PCIX_ECC	= 0x05, -	PCI_SPEED_100MHz_PCIX_ECC	= 0x06, -	PCI_SPEED_133MHz_PCIX_ECC	= 0x07, -	PCI_SPEED_66MHz_PCIX_266	= 0x09, -	PCI_SPEED_100MHz_PCIX_266	= 0x0a, -	PCI_SPEED_133MHz_PCIX_266	= 0x0b, -	PCI_SPEED_66MHz_PCIX_533	= 0x11, -	PCI_SPEED_100MHz_PCIX_533	= 0x12, -	PCI_SPEED_133MHz_PCIX_533	= 0x13, -	PCI_SPEED_UNKNOWN		= 0xff, -}; -  /* These values come from the PCI Express Spec */  enum pcie_link_width {  	PCIE_LNK_WIDTH_RESRV	= 0x00, @@ -61,12 +41,6 @@ enum pcie_link_width {  	PCIE_LNK_WIDTH_UNKNOWN  = 0xFF,  }; -enum pcie_link_speed { -	PCIE_2_5GB		= 0x14, -	PCIE_5_0GB		= 0x15, -	PCIE_LNK_SPEED_UNKNOWN	= 0xFF, -}; -  /**   * struct hotplug_slot_ops -the callbacks that the hotplug pci core can use   * @owner: The module owner of this structure @@ -89,12 +63,6 @@ enum pcie_link_speed {   * @get_adapter_status: Called to get see if an adapter is present in the slot or not.   *	If this field is NULL, the value passed in the struct hotplug_slot_info   *	will be used when this value is requested by a user. - * @get_max_bus_speed: Called to get the max bus speed for a slot. - *	If this field is NULL, the value passed in the struct hotplug_slot_info - *	will be used when this value is requested by a user. - * @get_cur_bus_speed: Called to get the current bus speed for a slot. - *	If this field is NULL, the value passed in the struct hotplug_slot_info - *	will be used when this value is requested by a user.   *   * The table of function pointers that is passed to the hotplug pci core by a   * hotplug pci driver.  These functions are called by the hotplug pci core when @@ -112,17 +80,14 @@ struct hotplug_slot_ops {  	int (*get_attention_status)	(struct hotplug_slot *slot, u8 *value);  	int (*get_latch_status)		(struct hotplug_slot *slot, u8 *value);  	int (*get_adapter_status)	(struct hotplug_slot *slot, u8 *value); -	int (*get_max_bus_speed)	(struct hotplug_slot *slot, enum pci_bus_speed *value); -	int (*get_cur_bus_speed)	(struct hotplug_slot *slot, enum pci_bus_speed *value);  };  /**   * struct hotplug_slot_info - used to notify the hotplug pci core of the state of the slot - * @power: if power is enabled or not (1/0) + * @power_status: if power is enabled or not (1/0)   * @attention_status: if the attention light is enabled or not (1/0)   * @latch_status: if the latch (if any) is open or closed (1/0) - * @adapter_present: if there is a pci board present in the slot or not (1/0) - * @address: (domain << 16 | bus << 8 | dev) + * @adapter_status: if there is a pci board present in the slot or not (1/0)   *   * Used to notify the hotplug pci core of the status of a specific slot.   */ @@ -131,8 +96,6 @@ struct hotplug_slot_info {  	u8	attention_status;  	u8	latch_status;  	u8	adapter_status; -	enum pci_bus_speed	max_bus_speed; -	enum pci_bus_speed	cur_bus_speed;  };  /** diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h index cca8a044e2b..ae66851870b 100644 --- a/include/linux/pci_ids.h +++ b/include/linux/pci_ids.h @@ -770,7 +770,6 @@  #define PCI_VENDOR_ID_TI		0x104c  #define PCI_DEVICE_ID_TI_TVP4020	0x3d07  #define PCI_DEVICE_ID_TI_4450		0x8011 -#define PCI_DEVICE_ID_TI_TSB43AB22	0x8023  #define PCI_DEVICE_ID_TI_XX21_XX11	0x8031  #define PCI_DEVICE_ID_TI_XX21_XX11_FM	0x8033  #define PCI_DEVICE_ID_TI_XX21_XX11_SD	0x8034 @@ -2333,6 +2332,8 @@  #define PCI_VENDOR_ID_KORENIX		0x1982  #define PCI_DEVICE_ID_KORENIX_JETCARDF0	0x1600  #define PCI_DEVICE_ID_KORENIX_JETCARDF1	0x16ff +#define PCI_DEVICE_ID_KORENIX_JETCARDF2	0x1700 +#define PCI_DEVICE_ID_KORENIX_JETCARDF3	0x17ff  #define PCI_VENDOR_ID_QMI		0x1a32 @@ -2417,6 +2418,9 @@  #define PCI_DEVICE_ID_INTEL_82840_HB	0x1a21  #define PCI_DEVICE_ID_INTEL_82845_HB	0x1a30  #define PCI_DEVICE_ID_INTEL_IOAT	0x1a38 +#define PCI_DEVICE_ID_INTEL_CPT_SMBUS	0x1c22 +#define PCI_DEVICE_ID_INTEL_CPT_LPC_MIN	0x1c41 +#define PCI_DEVICE_ID_INTEL_CPT_LPC_MAX	0x1c5f  #define PCI_DEVICE_ID_INTEL_82801AA_0	0x2410  #define PCI_DEVICE_ID_INTEL_82801AA_1	0x2411  #define PCI_DEVICE_ID_INTEL_82801AA_3	0x2413 @@ -2694,6 +2698,7 @@  #define PCI_DEVICE_ID_NETMOS_9835	0x9835  #define PCI_DEVICE_ID_NETMOS_9845	0x9845  #define PCI_DEVICE_ID_NETMOS_9855	0x9855 +#define PCI_DEVICE_ID_NETMOS_9865	0x9865  #define PCI_DEVICE_ID_NETMOS_9901	0x9901  #define PCI_VENDOR_ID_3COM_2		0xa727 diff --git a/include/linux/pci_regs.h b/include/linux/pci_regs.h index 9f2ad0aa3c3..455b9ccdfca 100644 --- a/include/linux/pci_regs.h +++ b/include/linux/pci_regs.h @@ -442,7 +442,10 @@  #define  PCI_EXP_LNKCTL_LABIE	0x0800	/* Lnk Autonomous Bandwidth Interrupt Enable */  #define PCI_EXP_LNKSTA		18	/* Link Status */  #define  PCI_EXP_LNKSTA_CLS	0x000f	/* Current Link Speed */ +#define  PCI_EXP_LNKSTA_CLS_2_5GB 0x01	/* Current Link Speed 2.5GT/s */ +#define  PCI_EXP_LNKSTA_CLS_5_0GB 0x02	/* Current Link Speed 5.0GT/s */  #define  PCI_EXP_LNKSTA_NLW	0x03f0	/* Nogotiated Link Width */ +#define  PCI_EXP_LNKSTA_NLW_SHIFT 4	/* start of NLW mask in link status */  #define  PCI_EXP_LNKSTA_LT	0x0800	/* Link Training */  #define  PCI_EXP_LNKSTA_SLC	0x1000	/* Slot Clock Configuration */  #define  PCI_EXP_LNKSTA_DLLLA	0x2000	/* Data Link Layer Link Active */ @@ -507,6 +510,7 @@  #define PCI_EXT_CAP_ID_VC	2  #define PCI_EXT_CAP_ID_DSN	3  #define PCI_EXT_CAP_ID_PWR	4 +#define PCI_EXT_CAP_ID_VNDR	11  #define PCI_EXT_CAP_ID_ACS	13  #define PCI_EXT_CAP_ID_ARI	14  #define PCI_EXT_CAP_ID_ATS	15 @@ -562,8 +566,7 @@  #define PCI_ERR_ROOT_FIRST_FATAL	0x00000010	/* First Fatal */  #define PCI_ERR_ROOT_NONFATAL_RCV	0x00000020	/* Non-Fatal Received */  #define PCI_ERR_ROOT_FATAL_RCV		0x00000040	/* Fatal Received */ -#define PCI_ERR_ROOT_COR_SRC	52 -#define PCI_ERR_ROOT_SRC	54 +#define PCI_ERR_ROOT_ERR_SRC	52	/* Error Source Identification */  /* Virtual Channel */  #define PCI_VC_PORT_REG1	4 diff --git a/include/linux/pda_power.h b/include/linux/pda_power.h index d4cf7a2ceb3..c9e4d814ff7 100644 --- a/include/linux/pda_power.h +++ b/include/linux/pda_power.h @@ -24,6 +24,8 @@ struct pda_power_pdata {  	int (*is_usb_online)(void);  	void (*set_charge)(int flags);  	void (*exit)(struct device *dev); +	int (*suspend)(pm_message_t state); +	int (*resume)(void);  	char **supplied_to;  	size_t num_supplicants; diff --git a/include/linux/percpu-defs.h b/include/linux/percpu-defs.h index 2351191f8c8..ce2dc655cd1 100644 --- a/include/linux/percpu-defs.h +++ b/include/linux/percpu-defs.h @@ -2,12 +2,6 @@  #define _LINUX_PERCPU_DEFS_H  /* - * Determine the real variable name from the name visible in the - * kernel sources. - */ -#define per_cpu_var(var) per_cpu__##var - -/*   * Base implementations of per-CPU variable declarations and definitions, where   * the section in which the variable is to be placed is provided by the   * 'sec' argument.  This may be used to affect the parameters governing the @@ -18,13 +12,23 @@   * that section.   */  #define __PCPU_ATTRS(sec)						\ -	__attribute__((section(PER_CPU_BASE_SECTION sec)))		\ +	__percpu __attribute__((section(PER_CPU_BASE_SECTION sec)))	\  	PER_CPU_ATTRIBUTES  #define __PCPU_DUMMY_ATTRS						\  	__attribute__((section(".discard"), unused))  /* + * Macro which verifies @ptr is a percpu pointer without evaluating + * @ptr.  This is to be used in percpu accessors to verify that the + * input parameter is a percpu pointer. + */ +#define __verify_pcpu_ptr(ptr)	do {					\ +	const void __percpu *__vpp_verify = (typeof(ptr))NULL;		\ +	(void)__vpp_verify;						\ +} while (0) + +/*   * s390 and alpha modules require percpu variables to be defined as   * weak to force the compiler to generate GOT based external   * references for them.  This is necessary because percpu sections @@ -56,24 +60,24 @@   */  #define DECLARE_PER_CPU_SECTION(type, name, sec)			\  	extern __PCPU_DUMMY_ATTRS char __pcpu_scope_##name;		\ -	extern __PCPU_ATTRS(sec) __typeof__(type) per_cpu__##name +	extern __PCPU_ATTRS(sec) __typeof__(type) name  #define DEFINE_PER_CPU_SECTION(type, name, sec)				\  	__PCPU_DUMMY_ATTRS char __pcpu_scope_##name;			\  	extern __PCPU_DUMMY_ATTRS char __pcpu_unique_##name;		\  	__PCPU_DUMMY_ATTRS char __pcpu_unique_##name;			\  	__PCPU_ATTRS(sec) PER_CPU_DEF_ATTRIBUTES __weak			\ -	__typeof__(type) per_cpu__##name +	__typeof__(type) name  #else  /*   * Normal declaration and definition macros.   */  #define DECLARE_PER_CPU_SECTION(type, name, sec)			\ -	extern __PCPU_ATTRS(sec) __typeof__(type) per_cpu__##name +	extern __PCPU_ATTRS(sec) __typeof__(type) name  #define DEFINE_PER_CPU_SECTION(type, name, sec)				\  	__PCPU_ATTRS(sec) PER_CPU_DEF_ATTRIBUTES			\ -	__typeof__(type) per_cpu__##name +	__typeof__(type) name  #endif  /* @@ -135,10 +139,16 @@  	__aligned(PAGE_SIZE)  /* - * Intermodule exports for per-CPU variables. + * Intermodule exports for per-CPU variables.  sparse forgets about + * address space across EXPORT_SYMBOL(), change EXPORT_SYMBOL() to + * noop if __CHECKER__.   */ -#define EXPORT_PER_CPU_SYMBOL(var) EXPORT_SYMBOL(per_cpu__##var) -#define EXPORT_PER_CPU_SYMBOL_GPL(var) EXPORT_SYMBOL_GPL(per_cpu__##var) - +#ifndef __CHECKER__ +#define EXPORT_PER_CPU_SYMBOL(var) EXPORT_SYMBOL(var) +#define EXPORT_PER_CPU_SYMBOL_GPL(var) EXPORT_SYMBOL_GPL(var) +#else +#define EXPORT_PER_CPU_SYMBOL(var) +#define EXPORT_PER_CPU_SYMBOL_GPL(var) +#endif  #endif /* _LINUX_PERCPU_DEFS_H */ diff --git a/include/linux/percpu.h b/include/linux/percpu.h index cf5efbcf716..d3a38d68710 100644 --- a/include/linux/percpu.h +++ b/include/linux/percpu.h @@ -2,10 +2,10 @@  #define __LINUX_PERCPU_H  #include <linux/preempt.h> -#include <linux/slab.h> /* For kmalloc() */  #include <linux/smp.h>  #include <linux/cpumask.h>  #include <linux/pfn.h> +#include <linux/init.h>  #include <asm/percpu.h> @@ -27,10 +27,17 @@   * we force a syntax error here if it isn't.   */  #define get_cpu_var(var) (*({				\ -	extern int simple_identifier_##var(void);	\  	preempt_disable();				\  	&__get_cpu_var(var); })) -#define put_cpu_var(var) preempt_enable() + +/* + * The weird & is necessary because sparse considers (void)(var) to be + * a direct dereference of percpu variable (var). + */ +#define put_cpu_var(var) do {				\ +	(void)&(var);					\ +	preempt_enable();				\ +} while (0)  #ifdef CONFIG_SMP @@ -127,10 +134,8 @@ extern int __init pcpu_page_first_chunk(size_t reserved_size,   */  #define per_cpu_ptr(ptr, cpu)	SHIFT_PERCPU_PTR((ptr), per_cpu_offset((cpu))) -extern void *__alloc_reserved_percpu(size_t size, size_t align); -extern void *__alloc_percpu(size_t size, size_t align); -extern void free_percpu(void *__pdata); -extern phys_addr_t per_cpu_ptr_to_phys(void *addr); +extern void __percpu *__alloc_reserved_percpu(size_t size, size_t align); +extern bool is_kernel_percpu_address(unsigned long addr);  #ifndef CONFIG_HAVE_SETUP_PER_CPU_AREA  extern void __init setup_per_cpu_areas(void); @@ -140,25 +145,10 @@ extern void __init setup_per_cpu_areas(void);  #define per_cpu_ptr(ptr, cpu) ({ (void)(cpu); (ptr); }) -static inline void *__alloc_percpu(size_t size, size_t align) -{ -	/* -	 * Can't easily make larger alignment work with kmalloc.  WARN -	 * on it.  Larger alignment should only be used for module -	 * percpu sections on SMP for which this path isn't used. -	 */ -	WARN_ON_ONCE(align > SMP_CACHE_BYTES); -	return kzalloc(size, GFP_KERNEL); -} - -static inline void free_percpu(void *p) -{ -	kfree(p); -} - -static inline phys_addr_t per_cpu_ptr_to_phys(void *addr) +/* can't distinguish from other static vars, always false */ +static inline bool is_kernel_percpu_address(unsigned long addr)  { -	return __pa(addr); +	return false;  }  static inline void __init setup_per_cpu_areas(void) { } @@ -170,8 +160,12 @@ static inline void *pcpu_lpage_remapped(void *kaddr)  #endif /* CONFIG_SMP */ +extern void __percpu *__alloc_percpu(size_t size, size_t align); +extern void free_percpu(void __percpu *__pdata); +extern phys_addr_t per_cpu_ptr_to_phys(void *addr); +  #define alloc_percpu(type)	\ -	(typeof(type) *)__alloc_percpu(sizeof(type), __alignof__(type)) +	(typeof(type) __percpu *)__alloc_percpu(sizeof(type), __alignof__(type))  /*   * Optional methods for optimized non-lvalue per-cpu variable access. @@ -188,17 +182,19 @@ static inline void *pcpu_lpage_remapped(void *kaddr)  #ifndef percpu_read  # define percpu_read(var)						\    ({									\ -	typeof(per_cpu_var(var)) __tmp_var__;				\ -	__tmp_var__ = get_cpu_var(var);					\ -	put_cpu_var(var);						\ -	__tmp_var__;							\ +	typeof(var) *pr_ptr__ = &(var);					\ +	typeof(var) pr_ret__;						\ +	pr_ret__ = get_cpu_var(*pr_ptr__);				\ +	put_cpu_var(*pr_ptr__);						\ +	pr_ret__;							\    })  #endif  #define __percpu_generic_to_op(var, val, op)				\  do {									\ -	get_cpu_var(var) op val;					\ -	put_cpu_var(var);						\ +	typeof(var) *pgto_ptr__ = &(var);				\ +	get_cpu_var(*pgto_ptr__) op val;				\ +	put_cpu_var(*pgto_ptr__);					\  } while (0)  #ifndef percpu_write @@ -234,6 +230,7 @@ extern void __bad_size_call_parameter(void);  #define __pcpu_size_call_return(stem, variable)				\  ({	typeof(variable) pscr_ret__;					\ +	__verify_pcpu_ptr(&(variable));					\  	switch(sizeof(variable)) {					\  	case 1: pscr_ret__ = stem##1(variable);break;			\  	case 2: pscr_ret__ = stem##2(variable);break;			\ @@ -247,6 +244,7 @@ extern void __bad_size_call_parameter(void);  #define __pcpu_size_call(stem, variable, ...)				\  do {									\ +	__verify_pcpu_ptr(&(variable));					\  	switch(sizeof(variable)) {					\  		case 1: stem##1(variable, __VA_ARGS__);break;		\  		case 2: stem##2(variable, __VA_ARGS__);break;		\ @@ -259,8 +257,7 @@ do {									\  /*   * Optimized manipulation for memory allocated through the per cpu - * allocator or for addresses of per cpu variables (can be determined - * using per_cpu_var(xx). + * allocator or for addresses of per cpu variables.   *   * These operation guarantee exclusivity of access for other operations   * on the *same* processor. The assumption is that per cpu data is only @@ -311,7 +308,7 @@ do {									\  #define _this_cpu_generic_to_op(pcp, val, op)				\  do {									\  	preempt_disable();						\ -	*__this_cpu_ptr(&pcp) op val;					\ +	*__this_cpu_ptr(&(pcp)) op val;					\  	preempt_enable();						\  } while (0) diff --git a/include/linux/percpu_counter.h b/include/linux/percpu_counter.h index a7684a51399..c88d67b5939 100644 --- a/include/linux/percpu_counter.h +++ b/include/linux/percpu_counter.h @@ -21,7 +21,7 @@ struct percpu_counter {  #ifdef CONFIG_HOTPLUG_CPU  	struct list_head list;	/* All percpu_counters are on a list */  #endif -	s32 *counters; +	s32 __percpu *counters;  };  extern int percpu_counter_batch; @@ -98,9 +98,6 @@ static inline void percpu_counter_set(struct percpu_counter *fbc, s64 amount)  	fbc->count = amount;  } -#define __percpu_counter_add(fbc, amount, batch) \ -	percpu_counter_add(fbc, amount) -  static inline void  percpu_counter_add(struct percpu_counter *fbc, s64 amount)  { @@ -109,6 +106,12 @@ percpu_counter_add(struct percpu_counter *fbc, s64 amount)  	preempt_enable();  } +static inline void +__percpu_counter_add(struct percpu_counter *fbc, s64 amount, s32 batch) +{ +	percpu_counter_add(fbc, amount); +} +  static inline s64 percpu_counter_read(struct percpu_counter *fbc)  {  	return fbc->count; diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h index 8fa71874113..fb6c91eac7e 100644 --- a/include/linux/perf_event.h +++ b/include/linux/perf_event.h @@ -203,19 +203,28 @@ struct perf_event_attr {  				enable_on_exec :  1, /* next exec enables     */  				task           :  1, /* trace fork/exit       */  				watermark      :  1, /* wakeup_watermark      */ +				/* +				 * precise_ip: +				 * +				 *  0 - SAMPLE_IP can have arbitrary skid +				 *  1 - SAMPLE_IP must have constant skid +				 *  2 - SAMPLE_IP requested to have 0 skid +				 *  3 - SAMPLE_IP must have 0 skid +				 * +				 *  See also PERF_RECORD_MISC_EXACT_IP +				 */ +				precise_ip     :  2, /* skid constraint       */ -				__reserved_1   : 49; +				__reserved_1   : 47;  	union {  		__u32		wakeup_events;	  /* wakeup every n events */  		__u32		wakeup_watermark; /* bytes before wakeup   */  	}; -	__u32			__reserved_2; - -	__u64			bp_addr;  	__u32			bp_type; -	__u32			bp_len; +	__u64			bp_addr; +	__u64			bp_len;  };  /* @@ -289,11 +298,24 @@ struct perf_event_mmap_page {  	__u64	data_tail;		/* user-space written tail */  }; -#define PERF_RECORD_MISC_CPUMODE_MASK		(3 << 0) -#define PERF_RECORD_MISC_CPUMODE_UNKNOWN		(0 << 0) +#define PERF_RECORD_MISC_CPUMODE_MASK		(7 << 0) +#define PERF_RECORD_MISC_CPUMODE_UNKNOWN	(0 << 0)  #define PERF_RECORD_MISC_KERNEL			(1 << 0)  #define PERF_RECORD_MISC_USER			(2 << 0)  #define PERF_RECORD_MISC_HYPERVISOR		(3 << 0) +#define PERF_RECORD_MISC_GUEST_KERNEL		(4 << 0) +#define PERF_RECORD_MISC_GUEST_USER		(5 << 0) + +/* + * Indicates that the content of PERF_SAMPLE_IP points to + * the actual instruction that triggered the event. See also + * perf_event_attr::precise_ip. + */ +#define PERF_RECORD_MISC_EXACT_IP		(1 << 14) +/* + * Reserve the last bit to indicate some extended misc field + */ +#define PERF_RECORD_MISC_EXT_RESERVED		(1 << 15)  struct perf_event_header {  	__u32	type; @@ -356,8 +378,8 @@ enum perf_event_type {  	 *	u64				stream_id;  	 * };  	 */ -	PERF_RECORD_THROTTLE		= 5, -	PERF_RECORD_UNTHROTTLE		= 6, +	PERF_RECORD_THROTTLE			= 5, +	PERF_RECORD_UNTHROTTLE			= 6,  	/*  	 * struct { @@ -371,10 +393,10 @@ enum perf_event_type {  	/*  	 * struct { -	 * 	struct perf_event_header	header; -	 * 	u32				pid, tid; +	 *	struct perf_event_header	header; +	 *	u32				pid, tid;  	 * -	 * 	struct read_format		values; +	 *	struct read_format		values;  	 * };  	 */  	PERF_RECORD_READ			= 8, @@ -412,7 +434,7 @@ enum perf_event_type {  	 *	  char                  data[size];}&& PERF_SAMPLE_RAW  	 * };  	 */ -	PERF_RECORD_SAMPLE		= 9, +	PERF_RECORD_SAMPLE			= 9,  	PERF_RECORD_MAX,			/* non-ABI */  }; @@ -441,6 +463,12 @@ enum perf_callchain_context {  # include <asm/perf_event.h>  #endif +struct perf_guest_info_callbacks { +	int (*is_in_guest) (void); +	int (*is_user_mode) (void); +	unsigned long (*get_guest_ip) (void); +}; +  #ifdef CONFIG_HAVE_HW_BREAKPOINT  #include <asm/hw_breakpoint.h>  #endif @@ -454,7 +482,10 @@ enum perf_callchain_context {  #include <linux/fs.h>  #include <linux/pid_namespace.h>  #include <linux/workqueue.h> +#include <linux/ftrace.h> +#include <linux/cpu.h>  #include <asm/atomic.h> +#include <asm/local.h>  #define PERF_MAX_STACK_DEPTH		255 @@ -468,6 +499,17 @@ struct perf_raw_record {  	void				*data;  }; +struct perf_branch_entry { +	__u64				from; +	__u64				to; +	__u64				flags; +}; + +struct perf_branch_stack { +	__u64				nr; +	struct perf_branch_entry	entries[0]; +}; +  struct task_struct;  /** @@ -478,18 +520,19 @@ struct hw_perf_event {  	union {  		struct { /* hardware */  			u64		config; +			u64		last_tag;  			unsigned long	config_base;  			unsigned long	event_base;  			int		idx; +			int		last_cpu;  		};  		struct { /* software */  			s64		remaining;  			struct hrtimer	hrtimer;  		};  #ifdef CONFIG_HAVE_HW_BREAKPOINT -		union { /* breakpoint */ -			struct arch_hw_breakpoint	info; -		}; +		/* breakpoint */ +		struct arch_hw_breakpoint	info;  #endif  	};  	atomic64_t			prev_count; @@ -498,22 +541,35 @@ struct hw_perf_event {  	atomic64_t			period_left;  	u64				interrupts; -	u64				freq_count; -	u64				freq_interrupts; -	u64				freq_stamp; +	u64				freq_time_stamp; +	u64				freq_count_stamp;  #endif  };  struct perf_event; +#define PERF_EVENT_TXN_STARTED 1 +  /**   * struct pmu - generic performance monitoring unit   */  struct pmu {  	int (*enable)			(struct perf_event *event);  	void (*disable)			(struct perf_event *event); +	int (*start)			(struct perf_event *event); +	void (*stop)			(struct perf_event *event);  	void (*read)			(struct perf_event *event);  	void (*unthrottle)		(struct perf_event *event); + +	/* +	 * group events scheduling is treated as a transaction, +	 * add group events as a whole and perform one schedulability test. +	 * If test fails, roll back the whole group +	 */ + +	void (*start_txn)	(const struct pmu *pmu); +	void (*cancel_txn)	(const struct pmu *pmu); +	int  (*commit_txn)	(const struct pmu *pmu);  };  /** @@ -532,21 +588,19 @@ struct perf_mmap_data {  	struct rcu_head			rcu_head;  #ifdef CONFIG_PERF_USE_VMALLOC  	struct work_struct		work; +	int				page_order;	/* allocation order  */  #endif -	int				data_order;  	int				nr_pages;	/* nr of data pages  */  	int				writable;	/* are we writable   */  	int				nr_locked;	/* nr pages mlocked  */  	atomic_t			poll;		/* POLL_ for wakeups */ -	atomic_t			events;		/* event_id limit       */ - -	atomic_long_t			head;		/* write position    */ -	atomic_long_t			done_head;	/* completed head    */ -	atomic_t			lock;		/* concurrent writes */ -	atomic_t			wakeup;		/* needs a wakeup    */ -	atomic_t			lost;		/* nr records lost   */ +	local_t				head;		/* write position    */ +	local_t				nest;		/* nested writers    */ +	local_t				events;		/* event limit       */ +	local_t				wakeup;		/* wakeup stamp      */ +	local_t				lost;		/* nr records lost   */  	long				watermark;	/* wakeup watermark  */ @@ -565,6 +619,18 @@ typedef void (*perf_overflow_handler_t)(struct perf_event *, int,  					struct perf_sample_data *,  					struct pt_regs *regs); +enum perf_group_flag { +	PERF_GROUP_SOFTWARE = 0x1, +}; + +#define SWEVENT_HLIST_BITS	8 +#define SWEVENT_HLIST_SIZE	(1 << SWEVENT_HLIST_BITS) + +struct swevent_hlist { +	struct hlist_head	heads[SWEVENT_HLIST_SIZE]; +	struct rcu_head		rcu_head; +}; +  /**   * struct perf_event - performance event kernel representation:   */ @@ -573,7 +639,9 @@ struct perf_event {  	struct list_head		group_entry;  	struct list_head		event_entry;  	struct list_head		sibling_list; +	struct hlist_node		hlist_entry;  	int				nr_siblings; +	int				group_flags;  	struct perf_event		*group_leader;  	struct perf_event		*output;  	const struct pmu		*pmu; @@ -658,7 +726,8 @@ struct perf_event {  	perf_overflow_handler_t		overflow_handler; -#ifdef CONFIG_EVENT_PROFILE +#ifdef CONFIG_EVENT_TRACING +	struct ftrace_event_call	*tp_event;  	struct event_filter		*filter;  #endif @@ -683,7 +752,8 @@ struct perf_event_context {  	 */  	struct mutex			mutex; -	struct list_head		group_list; +	struct list_head		pinned_groups; +	struct list_head		flexible_groups;  	struct list_head		event_list;  	int				nr_events;  	int				nr_active; @@ -718,6 +788,9 @@ struct perf_cpu_context {  	int				active_oncpu;  	int				max_pertask;  	int				exclusive; +	struct swevent_hlist		*swevent_hlist; +	struct mutex			hlist_mutex; +	int				hlist_refcount;  	/*  	 * Recursion avoidance: @@ -730,11 +803,12 @@ struct perf_cpu_context {  struct perf_output_handle {  	struct perf_event		*event;  	struct perf_mmap_data		*data; -	unsigned long			head; -	unsigned long			offset; +	unsigned long			wakeup; +	unsigned long			size; +	void				*addr; +	int				page;  	int				nmi;  	int				sample; -	int				locked;  };  #ifdef CONFIG_PERF_EVENTS @@ -746,10 +820,9 @@ extern int perf_max_events;  extern const struct pmu *hw_perf_event_init(struct perf_event *event); -extern void perf_event_task_sched_in(struct task_struct *task, int cpu); -extern void perf_event_task_sched_out(struct task_struct *task, -					struct task_struct *next, int cpu); -extern void perf_event_task_tick(struct task_struct *task, int cpu); +extern void perf_event_task_sched_in(struct task_struct *task); +extern void perf_event_task_sched_out(struct task_struct *task, struct task_struct *next); +extern void perf_event_task_tick(struct task_struct *task);  extern int perf_event_init_task(struct task_struct *child);  extern void perf_event_exit_task(struct task_struct *child);  extern void perf_event_free_task(struct task_struct *task); @@ -762,9 +835,6 @@ extern void perf_disable(void);  extern void perf_enable(void);  extern int perf_event_task_disable(void);  extern int perf_event_task_enable(void); -extern int hw_perf_group_sched_in(struct perf_event *group_leader, -	       struct perf_cpu_context *cpuctx, -	       struct perf_event_context *ctx, int cpu);  extern void perf_event_update_userpage(struct perf_event *event);  extern int perf_event_release_kernel(struct perf_event *event);  extern struct perf_event * @@ -796,6 +866,13 @@ struct perf_sample_data {  	struct perf_raw_record		*raw;  }; +static inline +void perf_sample_data_init(struct perf_sample_data *data, u64 addr) +{ +	data->addr = addr; +	data->raw  = NULL; +} +  extern void perf_output_sample(struct perf_output_handle *handle,  			       struct perf_event_header *header,  			       struct perf_sample_data *data, @@ -828,11 +905,56 @@ extern atomic_t perf_swevent_enabled[PERF_COUNT_SW_MAX];  extern void __perf_sw_event(u32, u64, int, struct pt_regs *, u64); +extern void +perf_arch_fetch_caller_regs(struct pt_regs *regs, unsigned long ip, int skip); + +/* + * Take a snapshot of the regs. Skip ip and frame pointer to + * the nth caller. We only need a few of the regs: + * - ip for PERF_SAMPLE_IP + * - cs for user_mode() tests + * - bp for callchains + * - eflags, for future purposes, just in case + */ +static inline void perf_fetch_caller_regs(struct pt_regs *regs, int skip) +{ +	unsigned long ip; + +	memset(regs, 0, sizeof(*regs)); + +	switch (skip) { +	case 1 : +		ip = CALLER_ADDR0; +		break; +	case 2 : +		ip = CALLER_ADDR1; +		break; +	case 3 : +		ip = CALLER_ADDR2; +		break; +	case 4: +		ip = CALLER_ADDR3; +		break; +	/* No need to support further for now */ +	default: +		ip = 0; +	} + +	return perf_arch_fetch_caller_regs(regs, ip, skip); +} +  static inline void  perf_sw_event(u32 event_id, u64 nr, int nmi, struct pt_regs *regs, u64 addr)  { -	if (atomic_read(&perf_swevent_enabled[event_id])) +	if (atomic_read(&perf_swevent_enabled[event_id])) { +		struct pt_regs hot_regs; + +		if (!regs) { +			perf_fetch_caller_regs(&hot_regs, 1); +			regs = &hot_regs; +		}  		__perf_sw_event(event_id, nr, nmi, regs, addr); +	}  }  extern void __perf_event_mmap(struct vm_area_struct *vma); @@ -843,6 +965,10 @@ static inline void perf_event_mmap(struct vm_area_struct *vma)  		__perf_event_mmap(vma);  } +extern struct perf_guest_info_callbacks *perf_guest_cbs; +extern int perf_register_guest_info_callbacks(struct perf_guest_info_callbacks *callbacks); +extern int perf_unregister_guest_info_callbacks(struct perf_guest_info_callbacks *callbacks); +  extern void perf_event_comm(struct task_struct *tsk);  extern void perf_event_fork(struct task_struct *tsk); @@ -852,9 +978,25 @@ extern int sysctl_perf_event_paranoid;  extern int sysctl_perf_event_mlock;  extern int sysctl_perf_event_sample_rate; +static inline bool perf_paranoid_tracepoint_raw(void) +{ +	return sysctl_perf_event_paranoid > -1; +} + +static inline bool perf_paranoid_cpu(void) +{ +	return sysctl_perf_event_paranoid > 0; +} + +static inline bool perf_paranoid_kernel(void) +{ +	return sysctl_perf_event_paranoid > 1; +} +  extern void perf_event_init(void); -extern void perf_tp_event(int event_id, u64 addr, u64 count, -				 void *record, int entry_size); +extern void perf_tp_event(u64 addr, u64 count, void *record, +			  int entry_size, struct pt_regs *regs, +			  struct hlist_head *head);  extern void perf_bp_event(struct perf_event *event, void *data);  #ifndef perf_misc_flags @@ -875,12 +1017,12 @@ extern void perf_event_enable(struct perf_event *event);  extern void perf_event_disable(struct perf_event *event);  #else  static inline void -perf_event_task_sched_in(struct task_struct *task, int cpu)		{ } +perf_event_task_sched_in(struct task_struct *task)			{ }  static inline void  perf_event_task_sched_out(struct task_struct *task, -			    struct task_struct *next, int cpu)		{ } +			    struct task_struct *next)			{ }  static inline void -perf_event_task_tick(struct task_struct *task, int cpu)			{ } +perf_event_task_tick(struct task_struct *task)				{ }  static inline int perf_event_init_task(struct task_struct *child)	{ return 0; }  static inline void perf_event_exit_task(struct task_struct *child)	{ }  static inline void perf_event_free_task(struct task_struct *task)	{ } @@ -895,13 +1037,18 @@ static inline void  perf_sw_event(u32 event_id, u64 nr, int nmi,  		     struct pt_regs *regs, u64 addr)			{ }  static inline void -perf_bp_event(struct perf_event *event, void *data)		{ } +perf_bp_event(struct perf_event *event, void *data)			{ } + +static inline int perf_register_guest_info_callbacks +(struct perf_guest_info_callbacks *callbacks) { return 0; } +static inline int perf_unregister_guest_info_callbacks +(struct perf_guest_info_callbacks *callbacks) { return 0; }  static inline void perf_event_mmap(struct vm_area_struct *vma)		{ }  static inline void perf_event_comm(struct task_struct *tsk)		{ }  static inline void perf_event_fork(struct task_struct *tsk)		{ }  static inline void perf_event_init(void)				{ } -static inline int  perf_swevent_get_recursion_context(void)  { return -1; } +static inline int  perf_swevent_get_recursion_context(void)		{ return -1; }  static inline void perf_swevent_put_recursion_context(int rctx)		{ }  static inline void perf_event_enable(struct perf_event *event)		{ }  static inline void perf_event_disable(struct perf_event *event)		{ } @@ -910,5 +1057,21 @@ static inline void perf_event_disable(struct perf_event *event)		{ }  #define perf_output_put(handle, x) \  	perf_output_copy((handle), &(x), sizeof(x)) +/* + * This has to have a higher priority than migration_notifier in sched.c. + */ +#define perf_cpu_notifier(fn)					\ +do {								\ +	static struct notifier_block fn##_nb __cpuinitdata =	\ +		{ .notifier_call = fn, .priority = 20 };	\ +	fn(&fn##_nb, (unsigned long)CPU_UP_PREPARE,		\ +		(void *)(unsigned long)smp_processor_id());	\ +	fn(&fn##_nb, (unsigned long)CPU_STARTING,		\ +		(void *)(unsigned long)smp_processor_id());	\ +	fn(&fn##_nb, (unsigned long)CPU_ONLINE,			\ +		(void *)(unsigned long)smp_processor_id());	\ +	register_cpu_notifier(&fn##_nb);			\ +} while (0) +  #endif /* __KERNEL__ */  #endif /* _LINUX_PERF_EVENT_H */ diff --git a/include/linux/pfkeyv2.h b/include/linux/pfkeyv2.h index 228b0b6306b..0b80c806631 100644 --- a/include/linux/pfkeyv2.h +++ b/include/linux/pfkeyv2.h @@ -315,6 +315,7 @@ struct sadb_x_kmaddress {  #define SADB_X_EALG_AES_GCM_ICV12	19  #define SADB_X_EALG_AES_GCM_ICV16	20  #define SADB_X_EALG_CAMELLIACBC		22 +#define SADB_X_EALG_NULL_AES_GMAC	23  #define SADB_EALG_MAX                   253 /* last EALG */  /* private allocations should use 249-255 (RFC2407) */  #define SADB_X_EALG_SERPENTCBC  252     /* draft-ietf-ipsec-ciph-aes-cbc-00 */ diff --git a/include/linux/phy.h b/include/linux/phy.h index 6a7eb402165..987e111f7b1 100644 --- a/include/linux/phy.h +++ b/include/linux/phy.h @@ -24,6 +24,7 @@  #include <linux/mii.h>  #include <linux/timer.h>  #include <linux/workqueue.h> +#include <linux/mod_devicetable.h>  #include <asm/atomic.h> @@ -81,6 +82,10 @@ typedef enum {   */  #define MII_BUS_ID_SIZE	(20 - 3) +/* Or MII_ADDR_C45 into regnum for read/write on mii_bus to enable the 21 bit +   IEEE 802.3ae clause 45 addressing mode used by 10GIGE phy chips. */ +#define MII_ADDR_C45 (1<<30) +  /*   * The Bus class for PHYs.  Devices which provide access to   * PHYs should register using this structure @@ -127,8 +132,8 @@ int mdiobus_register(struct mii_bus *bus);  void mdiobus_unregister(struct mii_bus *bus);  void mdiobus_free(struct mii_bus *bus);  struct phy_device *mdiobus_scan(struct mii_bus *bus, int addr); -int mdiobus_read(struct mii_bus *bus, int addr, u16 regnum); -int mdiobus_write(struct mii_bus *bus, int addr, u16 regnum, u16 val); +int mdiobus_read(struct mii_bus *bus, int addr, u32 regnum); +int mdiobus_write(struct mii_bus *bus, int addr, u32 regnum, u16 val);  #define PHY_INTERRUPT_DISABLED	0x0 @@ -422,7 +427,7 @@ struct phy_fixup {   * because the bus read/write functions may wait for an interrupt   * to conclude the operation.   */ -static inline int phy_read(struct phy_device *phydev, u16 regnum) +static inline int phy_read(struct phy_device *phydev, u32 regnum)  {  	return mdiobus_read(phydev->bus, phydev->addr, regnum);  } @@ -437,7 +442,7 @@ static inline int phy_read(struct phy_device *phydev, u16 regnum)   * because the bus read/write functions may wait for an interrupt   * to conclude the operation.   */ -static inline int phy_write(struct phy_device *phydev, u16 regnum, u16 val) +static inline int phy_write(struct phy_device *phydev, u32 regnum, u16 val)  {  	return mdiobus_write(phydev->bus, phydev->addr, regnum, val);  } @@ -452,6 +457,7 @@ int phy_attach_direct(struct net_device *dev, struct phy_device *phydev,  		u32 flags, phy_interface_t interface);  struct phy_device * phy_attach(struct net_device *dev,  		const char *bus_id, u32 flags, phy_interface_t interface); +struct phy_device *phy_find_first(struct mii_bus *bus);  int phy_connect_direct(struct net_device *dev, struct phy_device *phydev,  		void (*handler)(struct net_device *), u32 flags,  		phy_interface_t interface); diff --git a/include/linux/pipe_fs_i.h b/include/linux/pipe_fs_i.h index b43a9e03905..16de3933c45 100644 --- a/include/linux/pipe_fs_i.h +++ b/include/linux/pipe_fs_i.h @@ -3,7 +3,7 @@  #define PIPEFS_MAGIC 0x50495045 -#define PIPE_BUFFERS (16) +#define PIPE_DEF_BUFFERS	16  #define PIPE_BUF_FLAG_LRU	0x01	/* page is on the LRU */  #define PIPE_BUF_FLAG_ATOMIC	0x02	/* was atomically mapped */ @@ -44,17 +44,17 @@ struct pipe_buffer {   **/  struct pipe_inode_info {  	wait_queue_head_t wait; -	unsigned int nrbufs, curbuf; -	struct page *tmp_page; +	unsigned int nrbufs, curbuf, buffers;  	unsigned int readers;  	unsigned int writers;  	unsigned int waiting_writers;  	unsigned int r_counter;  	unsigned int w_counter; +	struct page *tmp_page;  	struct fasync_struct *fasync_readers;  	struct fasync_struct *fasync_writers;  	struct inode *inode; -	struct pipe_buffer bufs[PIPE_BUFFERS]; +	struct pipe_buffer *bufs;  };  /* @@ -139,6 +139,8 @@ void pipe_lock(struct pipe_inode_info *);  void pipe_unlock(struct pipe_inode_info *);  void pipe_double_lock(struct pipe_inode_info *, struct pipe_inode_info *); +extern unsigned int pipe_max_pages; +  /* Drop the inode semaphore and wait for a pipe event, atomically */  void pipe_wait(struct pipe_inode_info *pipe); @@ -154,4 +156,7 @@ int generic_pipe_buf_confirm(struct pipe_inode_info *, struct pipe_buffer *);  int generic_pipe_buf_steal(struct pipe_inode_info *, struct pipe_buffer *);  void generic_pipe_buf_release(struct pipe_inode_info *, struct pipe_buffer *); +/* for F_SETPIPE_SZ and F_GETPIPE_SZ */ +long pipe_fcntl(struct file *, unsigned int, unsigned long arg); +  #endif diff --git a/include/linux/pktcdvd.h b/include/linux/pktcdvd.h index 76e5053e1fa..721301b0a90 100644 --- a/include/linux/pktcdvd.h +++ b/include/linux/pktcdvd.h @@ -163,10 +163,8 @@ struct packet_iosched  	atomic_t		attention;	/* Set to non-zero when queue processing is needed */  	int			writing;	/* Non-zero when writing, zero when reading */  	spinlock_t		lock;		/* Protecting read/write queue manipulations */ -	struct bio		*read_queue; -	struct bio		*read_queue_tail; -	struct bio		*write_queue; -	struct bio		*write_queue_tail; +	struct bio_list		read_queue; +	struct bio_list		write_queue;  	sector_t		last_write;	/* The sector where the last write ended */  	int			successive_reads;  }; @@ -206,8 +204,8 @@ struct packet_data  	spinlock_t		lock;		/* Lock protecting state transitions and */  						/* orig_bios list */ -	struct bio		*orig_bios;	/* Original bios passed to pkt_make_request */ -	struct bio		*orig_bios_tail;/* that will be handled by this packet */ +	struct bio_list		orig_bios;	/* Original bios passed to pkt_make_request */ +						/* that will be handled by this packet */  	int			write_size;	/* Total size of all bios in the orig_bios */  						/* list, measured in number of frames */ diff --git a/include/linux/platform_device.h b/include/linux/platform_device.h index 71ff887ca44..5417944d368 100644 --- a/include/linux/platform_device.h +++ b/include/linux/platform_device.h @@ -21,7 +21,7 @@ struct platform_device {  	u32		num_resources;  	struct resource	* resource; -	struct platform_device_id	*id_entry; +	const struct platform_device_id	*id_entry;  	/* arch specific additions */  	struct pdev_archdata	archdata; @@ -44,12 +44,14 @@ extern int platform_get_irq_byname(struct platform_device *, const char *);  extern int platform_add_devices(struct platform_device **, int);  extern struct platform_device *platform_device_register_simple(const char *, int id, -					struct resource *, unsigned int); +					const struct resource *, unsigned int);  extern struct platform_device *platform_device_register_data(struct device *,  		const char *, int, const void *, size_t);  extern struct platform_device *platform_device_alloc(const char *name, int id); -extern int platform_device_add_resources(struct platform_device *pdev, struct resource *res, unsigned int num); +extern int platform_device_add_resources(struct platform_device *pdev, +					 const struct resource *res, +					 unsigned int num);  extern int platform_device_add_data(struct platform_device *pdev, const void *data, size_t size);  extern int platform_device_add(struct platform_device *pdev);  extern void platform_device_del(struct platform_device *pdev); @@ -62,7 +64,7 @@ struct platform_driver {  	int (*suspend)(struct platform_device *, pm_message_t state);  	int (*resume)(struct platform_device *);  	struct device_driver driver; -	struct platform_device_id *id_table; +	const struct platform_device_id *id_table;  };  extern int platform_driver_register(struct platform_driver *); @@ -77,6 +79,11 @@ extern int platform_driver_probe(struct platform_driver *driver,  #define platform_get_drvdata(_dev)	dev_get_drvdata(&(_dev)->dev)  #define platform_set_drvdata(_dev,data)	dev_set_drvdata(&(_dev)->dev, (data)) +extern struct platform_device *platform_create_bundle(struct platform_driver *driver, +					int (*probe)(struct platform_device *), +					struct resource *res, unsigned int n_res, +					const void *data, size_t size); +  /* early platform driver interface */  struct early_platform_driver {  	const char *class_str; diff --git a/include/linux/plist.h b/include/linux/plist.h index 8227f717c70..6898985e7b3 100644 --- a/include/linux/plist.h +++ b/include/linux/plist.h @@ -45,7 +45,7 @@   * the insertion of new nodes. There are no nodes with duplicate   * priorites on the list.   * - * The nodes on the node_list is ordered by priority and can contain + * The nodes on the node_list are ordered by priority and can contain   * entries which have the same priority. Those entries are ordered   * FIFO   * @@ -265,7 +265,7 @@ static inline int plist_node_empty(const struct plist_node *node)   *   * Assumes the plist is _not_ empty.   */ -static inline struct plist_node* plist_first(const struct plist_head *head) +static inline struct plist_node *plist_first(const struct plist_head *head)  {  	return list_entry(head->node_list.next,  			  struct plist_node, plist.node_list); diff --git a/include/linux/pm.h b/include/linux/pm.h index 198b8f9fe05..8e258c72797 100644 --- a/include/linux/pm.h +++ b/include/linux/pm.h @@ -26,6 +26,7 @@  #include <linux/spinlock.h>  #include <linux/wait.h>  #include <linux/timer.h> +#include <linux/completion.h>  /*   * Callbacks for platform drivers to implement. @@ -214,20 +215,59 @@ struct dev_pm_ops {  	int (*runtime_idle)(struct device *dev);  }; +#ifdef CONFIG_PM_SLEEP +#define SET_SYSTEM_SLEEP_PM_OPS(suspend_fn, resume_fn) \ +	.suspend = suspend_fn, \ +	.resume = resume_fn, \ +	.freeze = suspend_fn, \ +	.thaw = resume_fn, \ +	.poweroff = suspend_fn, \ +	.restore = resume_fn, +#else +#define SET_SYSTEM_SLEEP_PM_OPS(suspend_fn, resume_fn) +#endif + +#ifdef CONFIG_PM_RUNTIME +#define SET_RUNTIME_PM_OPS(suspend_fn, resume_fn, idle_fn) \ +	.runtime_suspend = suspend_fn, \ +	.runtime_resume = resume_fn, \ +	.runtime_idle = idle_fn, +#else +#define SET_RUNTIME_PM_OPS(suspend_fn, resume_fn, idle_fn) +#endif +  /*   * Use this if you want to use the same suspend and resume callbacks for suspend   * to RAM and hibernation.   */  #define SIMPLE_DEV_PM_OPS(name, suspend_fn, resume_fn) \  const struct dev_pm_ops name = { \ -	.suspend = suspend_fn, \ -	.resume = resume_fn, \ -	.freeze = suspend_fn, \ -	.thaw = resume_fn, \ -	.poweroff = suspend_fn, \ -	.restore = resume_fn, \ +	SET_SYSTEM_SLEEP_PM_OPS(suspend_fn, resume_fn) \ +} + +/* + * Use this for defining a set of PM operations to be used in all situations + * (sustem suspend, hibernation or runtime PM). + */ +#define UNIVERSAL_DEV_PM_OPS(name, suspend_fn, resume_fn, idle_fn) \ +const struct dev_pm_ops name = { \ +	SET_SYSTEM_SLEEP_PM_OPS(suspend_fn, resume_fn) \ +	SET_RUNTIME_PM_OPS(suspend_fn, resume_fn, idle_fn) \  } +/* + * Use this for subsystems (bus types, device types, device classes) that don't + * need any special suspend/resume handling in addition to invoking the PM + * callbacks provided by device drivers supporting both the system sleep PM and + * runtime PM, make the pm member point to generic_subsys_pm_ops. + */ +#ifdef CONFIG_PM_OPS +extern struct dev_pm_ops generic_subsys_pm_ops; +#define GENERIC_SUBSYS_PM_OPS	(&generic_subsys_pm_ops) +#else +#define GENERIC_SUBSYS_PM_OPS	NULL +#endif +  /**   * PM_EVENT_ messages   * @@ -412,9 +452,11 @@ struct dev_pm_info {  	pm_message_t		power_state;  	unsigned int		can_wakeup:1;  	unsigned int		should_wakeup:1; +	unsigned		async_suspend:1;  	enum dpm_state		status;		/* Owned by the PM core */  #ifdef CONFIG_PM_SLEEP  	struct list_head	entry; +	struct completion	completion;  #endif  #ifdef CONFIG_PM_RUNTIME  	struct timer_list	suspend_timer; @@ -430,6 +472,7 @@ struct dev_pm_info {  	unsigned int		request_pending:1;  	unsigned int		deferred_resume:1;  	unsigned int		run_wake:1; +	unsigned int		runtime_auto:1;  	enum rpm_request	request;  	enum rpm_status		runtime_status;  	int			runtime_error; @@ -508,6 +551,7 @@ extern void __suspend_report_result(const char *function, void *fn, int ret);  		__suspend_report_result(__func__, fn, ret);		\  	} while (0) +extern void device_pm_wait_for_dev(struct device *sub, struct device *dev);  #else /* !CONFIG_PM_SLEEP */  #define device_pm_lock() do {} while (0) @@ -520,6 +564,7 @@ static inline int dpm_suspend_start(pm_message_t state)  #define suspend_report_result(fn, ret)		do {} while (0) +static inline void device_pm_wait_for_dev(struct device *a, struct device *b) {}  #endif /* !CONFIG_PM_SLEEP */  /* How to reorder dpm_list after device_move() */ diff --git a/include/linux/pm_qos_params.h b/include/linux/pm_qos_params.h index d74f75ed1e4..8ba440e5eb7 100644 --- a/include/linux/pm_qos_params.h +++ b/include/linux/pm_qos_params.h @@ -14,12 +14,14 @@  #define PM_QOS_NUM_CLASSES 4  #define PM_QOS_DEFAULT_VALUE -1 -int pm_qos_add_requirement(int qos, char *name, s32 value); -int pm_qos_update_requirement(int qos, char *name, s32 new_value); -void pm_qos_remove_requirement(int qos, char *name); +struct pm_qos_request_list; -int pm_qos_requirement(int qos); +struct pm_qos_request_list *pm_qos_add_request(int pm_qos_class, s32 value); +void pm_qos_update_request(struct pm_qos_request_list *pm_qos_req, +		s32 new_value); +void pm_qos_remove_request(struct pm_qos_request_list *pm_qos_req); -int pm_qos_add_notifier(int qos, struct notifier_block *notifier); -int pm_qos_remove_notifier(int qos, struct notifier_block *notifier); +int pm_qos_request(int pm_qos_class); +int pm_qos_add_notifier(int pm_qos_class, struct notifier_block *notifier); +int pm_qos_remove_notifier(int pm_qos_class, struct notifier_block *notifier); diff --git a/include/linux/pm_runtime.h b/include/linux/pm_runtime.h index 370ce0a6fe4..6e81888c622 100644 --- a/include/linux/pm_runtime.h +++ b/include/linux/pm_runtime.h @@ -28,6 +28,11 @@ extern int __pm_runtime_set_status(struct device *dev, unsigned int status);  extern int pm_runtime_barrier(struct device *dev);  extern void pm_runtime_enable(struct device *dev);  extern void __pm_runtime_disable(struct device *dev, bool check_resume); +extern void pm_runtime_allow(struct device *dev); +extern void pm_runtime_forbid(struct device *dev); +extern int pm_generic_runtime_idle(struct device *dev); +extern int pm_generic_runtime_suspend(struct device *dev); +extern int pm_generic_runtime_resume(struct device *dev);  static inline bool pm_children_suspended(struct device *dev)  { @@ -60,6 +65,11 @@ static inline void device_set_run_wake(struct device *dev, bool enable)  	dev->power.run_wake = enable;  } +static inline bool pm_runtime_suspended(struct device *dev) +{ +	return dev->power.runtime_status == RPM_SUSPENDED; +} +  #else /* !CONFIG_PM_RUNTIME */  static inline int pm_runtime_idle(struct device *dev) { return -ENOSYS; } @@ -78,6 +88,8 @@ static inline int __pm_runtime_set_status(struct device *dev,  static inline int pm_runtime_barrier(struct device *dev) { return 0; }  static inline void pm_runtime_enable(struct device *dev) {}  static inline void __pm_runtime_disable(struct device *dev, bool c) {} +static inline void pm_runtime_allow(struct device *dev) {} +static inline void pm_runtime_forbid(struct device *dev) {}  static inline bool pm_children_suspended(struct device *dev) { return false; }  static inline void pm_suspend_ignore_children(struct device *dev, bool en) {} @@ -85,6 +97,11 @@ static inline void pm_runtime_get_noresume(struct device *dev) {}  static inline void pm_runtime_put_noidle(struct device *dev) {}  static inline bool device_run_wake(struct device *dev) { return false; }  static inline void device_set_run_wake(struct device *dev, bool enable) {} +static inline bool pm_runtime_suspended(struct device *dev) { return false; } + +static inline int pm_generic_runtime_idle(struct device *dev) { return 0; } +static inline int pm_generic_runtime_suspend(struct device *dev) { return 0; } +static inline int pm_generic_runtime_resume(struct device *dev) { return 0; }  #endif /* !CONFIG_PM_RUNTIME */ diff --git a/include/linux/pm_wakeup.h b/include/linux/pm_wakeup.h index 0aae7776185..22d64c18056 100644 --- a/include/linux/pm_wakeup.h +++ b/include/linux/pm_wakeup.h @@ -25,32 +25,34 @@  # error "please don't include this file directly"  #endif +#include <linux/types.h> +  #ifdef CONFIG_PM  /* changes to device_may_wakeup take effect on the next pm state change.   * by default, devices should wakeup if they can.   */ -static inline void device_init_wakeup(struct device *dev, int val) +static inline void device_init_wakeup(struct device *dev, bool val)  { -	dev->power.can_wakeup = dev->power.should_wakeup = !!val; +	dev->power.can_wakeup = dev->power.should_wakeup = val;  } -static inline void device_set_wakeup_capable(struct device *dev, int val) +static inline void device_set_wakeup_capable(struct device *dev, bool capable)  { -	dev->power.can_wakeup = !!val; +	dev->power.can_wakeup = capable;  } -static inline int device_can_wakeup(struct device *dev) +static inline bool device_can_wakeup(struct device *dev)  {  	return dev->power.can_wakeup;  } -static inline void device_set_wakeup_enable(struct device *dev, int val) +static inline void device_set_wakeup_enable(struct device *dev, bool enable)  { -	dev->power.should_wakeup = !!val; +	dev->power.should_wakeup = enable;  } -static inline int device_may_wakeup(struct device *dev) +static inline bool device_may_wakeup(struct device *dev)  {  	return dev->power.can_wakeup && dev->power.should_wakeup;  } @@ -58,20 +60,28 @@ static inline int device_may_wakeup(struct device *dev)  #else /* !CONFIG_PM */  /* For some reason the next two routines work even without CONFIG_PM */ -static inline void device_init_wakeup(struct device *dev, int val) +static inline void device_init_wakeup(struct device *dev, bool val)  { -	dev->power.can_wakeup = !!val; +	dev->power.can_wakeup = val;  } -static inline void device_set_wakeup_capable(struct device *dev, int val) { } +static inline void device_set_wakeup_capable(struct device *dev, bool capable) +{ +} -static inline int device_can_wakeup(struct device *dev) +static inline bool device_can_wakeup(struct device *dev)  {  	return dev->power.can_wakeup;  } -#define device_set_wakeup_enable(dev, val)	do {} while (0) -#define device_may_wakeup(dev)			0 +static inline void device_set_wakeup_enable(struct device *dev, bool enable) +{ +} + +static inline bool device_may_wakeup(struct device *dev) +{ +	return false; +}  #endif /* !CONFIG_PM */ diff --git a/include/linux/poison.h b/include/linux/poison.h index 2110a81c5e2..34066ffd893 100644 --- a/include/linux/poison.h +++ b/include/linux/poison.h @@ -48,6 +48,15 @@  #define POISON_FREE	0x6b	/* for use-after-free poisoning */  #define	POISON_END	0xa5	/* end-byte of poisoning */ +/********** mm/hugetlb.c **********/ +/* + * Private mappings of hugetlb pages use this poisoned value for + * page->mapping. The core VM should not be doing anything with this mapping + * but futex requires the existence of some page->mapping value even though it + * is unused if PAGE_MAPPING_ANON is set. + */ +#define HUGETLB_POISON	((void *)(0x00300300 + POISON_POINTER_DELTA + PAGE_MAPPING_ANON)) +  /********** arch/$ARCH/mm/init.c **********/  #define POISON_FREE_INITMEM	0xcc diff --git a/include/linux/poll.h b/include/linux/poll.h index 6673743946f..600cc1fde64 100644 --- a/include/linux/poll.h +++ b/include/linux/poll.h @@ -10,8 +10,10 @@  #include <linux/wait.h>  #include <linux/string.h>  #include <linux/fs.h> +#include <linux/sysctl.h>  #include <asm/uaccess.h> +extern struct ctl_table epoll_table[]; /* for sysctl */  /* ~832 bytes of stack space used max in sys_select/sys_poll before allocating     additional memory. */  #define MAX_STACK_ALLOC 832 diff --git a/include/linux/power_supply.h b/include/linux/power_supply.h index b5d096d3a9b..30083a896f3 100644 --- a/include/linux/power_supply.h +++ b/include/linux/power_supply.h @@ -82,6 +82,7 @@ enum power_supply_property {  	POWER_SUPPLY_PROP_PRESENT,  	POWER_SUPPLY_PROP_ONLINE,  	POWER_SUPPLY_PROP_TECHNOLOGY, +	POWER_SUPPLY_PROP_CYCLE_COUNT,  	POWER_SUPPLY_PROP_VOLTAGE_MAX,  	POWER_SUPPLY_PROP_VOLTAGE_MIN,  	POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN, @@ -113,6 +114,7 @@ enum power_supply_property {  	POWER_SUPPLY_PROP_TIME_TO_EMPTY_AVG,  	POWER_SUPPLY_PROP_TIME_TO_FULL_NOW,  	POWER_SUPPLY_PROP_TIME_TO_FULL_AVG, +	POWER_SUPPLY_PROP_TYPE, /* use power_supply.type instead */  	/* Properties of type `const char *' */  	POWER_SUPPLY_PROP_MODEL_NAME,  	POWER_SUPPLY_PROP_MANUFACTURER, @@ -143,6 +145,11 @@ struct power_supply {  	int (*get_property)(struct power_supply *psy,  			    enum power_supply_property psp,  			    union power_supply_propval *val); +	int (*set_property)(struct power_supply *psy, +			    enum power_supply_property psp, +			    const union power_supply_propval *val); +	int (*property_is_writeable)(struct power_supply *psy, +				     enum power_supply_property psp);  	void (*external_power_changed)(struct power_supply *psy);  	void (*set_charged)(struct power_supply *psy); diff --git a/include/linux/ppp_channel.h b/include/linux/ppp_channel.h index 0d3fa63e90e..bff98ec1bfe 100644 --- a/include/linux/ppp_channel.h +++ b/include/linux/ppp_channel.h @@ -72,6 +72,9 @@ extern int ppp_channel_index(struct ppp_channel *);  /* Get the unit number associated with a channel, or -1 if none */  extern int ppp_unit_number(struct ppp_channel *); +/* Get the device name associated with a channel, or NULL if none */ +extern char *ppp_dev_name(struct ppp_channel *); +  /*   * SMP locking notes:   * The channel code must ensure that when it calls ppp_unregister_channel, diff --git a/include/linux/ptrace.h b/include/linux/ptrace.h index 56f2d63a5cb..4272521e29e 100644 --- a/include/linux/ptrace.h +++ b/include/linux/ptrace.h @@ -27,6 +27,26 @@  #define PTRACE_GETSIGINFO	0x4202  #define PTRACE_SETSIGINFO	0x4203 +/* + * Generic ptrace interface that exports the architecture specific regsets + * using the corresponding NT_* types (which are also used in the core dump). + * Please note that the NT_PRSTATUS note type in a core dump contains a full + * 'struct elf_prstatus'. But the user_regset for NT_PRSTATUS contains just the + * elf_gregset_t that is the pr_reg field of 'struct elf_prstatus'. For all the + * other user_regset flavors, the user_regset layout and the ELF core dump note + * payload are exactly the same layout. + * + * This interface usage is as follows: + *	struct iovec iov = { buf, len}; + * + *	ret = ptrace(PTRACE_GETREGSET/PTRACE_SETREGSET, pid, NT_XXX_TYPE, &iov); + * + * On the successful completion, iov.len will be updated by the kernel, + * specifying how much the kernel has written/read to/from the user's iov.buf. + */ +#define PTRACE_GETREGSET	0x4204 +#define PTRACE_SETREGSET	0x4205 +  /* options set using PTRACE_SETOPTIONS */  #define PTRACE_O_TRACESYSGOOD	0x00000001  #define PTRACE_O_TRACEFORK	0x00000002 @@ -244,6 +264,9 @@ static inline void user_enable_single_step(struct task_struct *task)  static inline void user_disable_single_step(struct task_struct *task)  {  } +#else +extern void user_enable_single_step(struct task_struct *); +extern void user_disable_single_step(struct task_struct *);  #endif	/* arch_has_single_step */  #ifndef arch_has_block_step @@ -271,6 +294,8 @@ static inline void user_enable_block_step(struct task_struct *task)  {  	BUG();			/* This can never be called.  */  } +#else +extern void user_enable_block_step(struct task_struct *);  #endif	/* arch_has_block_step */  #ifdef ARCH_HAS_USER_SINGLE_STEP_INFO @@ -320,18 +345,6 @@ static inline void user_single_step_siginfo(struct task_struct *tsk,  #define arch_ptrace_stop(code, info)		do { } while (0)  #endif -#ifndef arch_ptrace_untrace -/* - * Do machine-specific work before untracing child. - * - * This is called for a normal detach as well as from ptrace_exit() - * when the tracing task dies. - * - * Called with write_lock(&tasklist_lock) held. - */ -#define arch_ptrace_untrace(task)		do { } while (0) -#endif -  extern int task_current_syscall(struct task_struct *target, long *callno,  				unsigned long args[6], unsigned int maxargs,  				unsigned long *sp, unsigned long *pc); diff --git a/include/linux/quota.h b/include/linux/quota.h index a6861f11748..94c1f03b50e 100644 --- a/include/linux/quota.h +++ b/include/linux/quota.h @@ -174,6 +174,7 @@ enum {  #include <linux/rwsem.h>  #include <linux/spinlock.h>  #include <linux/wait.h> +#include <linux/percpu_counter.h>  #include <linux/dqblk_xfs.h>  #include <linux/dqblk_v1.h> @@ -238,19 +239,36 @@ static inline int info_dirty(struct mem_dqinfo *info)  	return test_bit(DQF_INFO_DIRTY_B, &info->dqi_flags);  } +enum { +	DQST_LOOKUPS, +	DQST_DROPS, +	DQST_READS, +	DQST_WRITES, +	DQST_CACHE_HITS, +	DQST_ALLOC_DQUOTS, +	DQST_FREE_DQUOTS, +	DQST_SYNCS, +	_DQST_DQSTAT_LAST +}; +  struct dqstats { -	int lookups; -	int drops; -	int reads; -	int writes; -	int cache_hits; -	int allocated_dquots; -	int free_dquots; -	int syncs; +	int stat[_DQST_DQSTAT_LAST]; +	struct percpu_counter counter[_DQST_DQSTAT_LAST];  }; +extern struct dqstats *dqstats_pcpu;  extern struct dqstats dqstats; +static inline void dqstats_inc(unsigned int type) +{ +	percpu_counter_inc(&dqstats.counter[type]); +} + +static inline void dqstats_dec(unsigned int type) +{ +	percpu_counter_dec(&dqstats.counter[type]); +} +  #define DQ_MOD_B	0	/* dquot modified since read */  #define DQ_BLKS_B	1	/* uid/gid has been warned about blk limit */  #define DQ_INODES_B	2	/* uid/gid has been warned about inode limit */ @@ -279,9 +297,6 @@ struct dquot {  	struct mem_dqblk dq_dqb;	/* Diskquota usage */  }; -#define QUOTA_OK          0 -#define NO_QUOTA          1 -  /* Operations which must be implemented by each quota format */  struct quota_format_ops {  	int (*check_quota_file)(struct super_block *sb, int type);	/* Detect whether file is in our format */ @@ -295,13 +310,6 @@ struct quota_format_ops {  /* Operations working with dquots */  struct dquot_operations { -	int (*initialize) (struct inode *, int); -	int (*drop) (struct inode *); -	int (*alloc_space) (struct inode *, qsize_t, int); -	int (*alloc_inode) (const struct inode *, qsize_t); -	int (*free_space) (struct inode *, qsize_t); -	int (*free_inode) (const struct inode *, qsize_t); -	int (*transfer) (struct inode *, struct iattr *);  	int (*write_dquot) (struct dquot *);		/* Ordinary dquot write */  	struct dquot *(*alloc_dquot)(struct super_block *, int);	/* Allocate memory for new dquot */  	void (*destroy_dquot)(struct dquot *);		/* Free memory for dquot */ @@ -309,12 +317,6 @@ struct dquot_operations {  	int (*release_dquot) (struct dquot *);		/* Quota is going to be deleted from disk */  	int (*mark_dirty) (struct dquot *);		/* Dquot is marked dirty */  	int (*write_info) (struct super_block *, int);	/* Write of quota "superblock" */ -	/* reserve quota for delayed block allocation */ -	int (*reserve_space) (struct inode *, qsize_t, int); -	/* claim reserved quota for delayed alloc */ -	int (*claim_space) (struct inode *, qsize_t); -	/* release rsved quota for delayed alloc */ -	void (*release_rsv) (struct inode *, qsize_t);  	/* get reserved quota for delayed alloc, value returned is managed by  	 * quota code only */  	qsize_t *(*get_reserved_space) (struct inode *); @@ -322,17 +324,15 @@ struct dquot_operations {  /* Operations handling requests from userspace */  struct quotactl_ops { -	int (*quota_on)(struct super_block *, int, int, char *, int); -	int (*quota_off)(struct super_block *, int, int); -	int (*quota_sync)(struct super_block *, int); +	int (*quota_on)(struct super_block *, int, int, char *); +	int (*quota_off)(struct super_block *, int); +	int (*quota_sync)(struct super_block *, int, int);  	int (*get_info)(struct super_block *, int, struct if_dqinfo *);  	int (*set_info)(struct super_block *, int, struct if_dqinfo *); -	int (*get_dqblk)(struct super_block *, int, qid_t, struct if_dqblk *); -	int (*set_dqblk)(struct super_block *, int, qid_t, struct if_dqblk *); +	int (*get_dqblk)(struct super_block *, int, qid_t, struct fs_disk_quota *); +	int (*set_dqblk)(struct super_block *, int, qid_t, struct fs_disk_quota *);  	int (*get_xstate)(struct super_block *, struct fs_quota_stat *);  	int (*set_xstate)(struct super_block *, unsigned int, int); -	int (*get_xquota)(struct super_block *, int, qid_t, struct fs_disk_quota *); -	int (*set_xquota)(struct super_block *, int, qid_t, struct fs_disk_quota *);  };  struct quota_format_type { @@ -357,26 +357,25 @@ enum {  #define DQUOT_STATE_FLAGS	(DQUOT_USAGE_ENABLED | DQUOT_LIMITS_ENABLED | \  				 DQUOT_SUSPENDED)  /* Other quota flags */ -#define DQUOT_QUOTA_SYS_FILE	(1 << 6)	/* Quota file is a special +#define DQUOT_STATE_LAST	(_DQUOT_STATE_FLAGS * MAXQUOTAS) +#define DQUOT_QUOTA_SYS_FILE	(1 << DQUOT_STATE_LAST) +						/* Quota file is a special  						 * system file and user cannot  						 * touch it. Filesystem is  						 * responsible for setting  						 * S_NOQUOTA, S_NOATIME flags  						 */ -#define DQUOT_NEGATIVE_USAGE	(1 << 7)	/* Allow negative quota usage */ +#define DQUOT_NEGATIVE_USAGE	(1 << (DQUOT_STATE_LAST + 1)) +					       /* Allow negative quota usage */  static inline unsigned int dquot_state_flag(unsigned int flags, int type)  { -	if (type == USRQUOTA) -		return flags; -	return flags << _DQUOT_STATE_FLAGS; +	return flags << _DQUOT_STATE_FLAGS * type;  }  static inline unsigned int dquot_generic_flag(unsigned int flags, int type)  { -	if (type == USRQUOTA) -		return flags; -	return flags >> _DQUOT_STATE_FLAGS; +	return (flags >> _DQUOT_STATE_FLAGS * type) & DQUOT_STATE_FLAGS;  }  #ifdef CONFIG_QUOTA_NETLINK_INTERFACE diff --git a/include/linux/quotaops.h b/include/linux/quotaops.h index 3ebb2315364..aa36793b48b 100644 --- a/include/linux/quotaops.h +++ b/include/linux/quotaops.h @@ -9,25 +9,34 @@  #include <linux/fs.h> +#define DQUOT_SPACE_WARN	0x1 +#define DQUOT_SPACE_RESERVE	0x2 +#define DQUOT_SPACE_NOFAIL	0x4 +  static inline struct quota_info *sb_dqopt(struct super_block *sb)  {  	return &sb->s_dquot;  } +/* i_mutex must being held */ +static inline bool is_quota_modification(struct inode *inode, struct iattr *ia) +{ +	return (ia->ia_valid & ATTR_SIZE && ia->ia_size != inode->i_size) || +		(ia->ia_valid & ATTR_UID && ia->ia_uid != inode->i_uid) || +		(ia->ia_valid & ATTR_GID && ia->ia_gid != inode->i_gid); +} +  #if defined(CONFIG_QUOTA)  /*   * declaration of quota_function calls in kernel.   */ -void sync_quota_sb(struct super_block *sb, int type); -static inline void writeout_quota_sb(struct super_block *sb, int type) -{ -	if (sb->s_qcop->quota_sync) -		sb->s_qcop->quota_sync(sb, type); -} +void inode_add_rsv_space(struct inode *inode, qsize_t number); +void inode_claim_rsv_space(struct inode *inode, qsize_t number); +void inode_sub_rsv_space(struct inode *inode, qsize_t number); -int dquot_initialize(struct inode *inode, int type); -int dquot_drop(struct inode *inode); +void dquot_initialize(struct inode *inode); +void dquot_drop(struct inode *inode);  struct dquot *dqget(struct super_block *sb, unsigned int id, int type);  void dqput(struct dquot *dquot);  int dquot_scan_active(struct super_block *sb, @@ -36,43 +45,49 @@ int dquot_scan_active(struct super_block *sb,  struct dquot *dquot_alloc(struct super_block *sb, int type);  void dquot_destroy(struct dquot *dquot); -int dquot_alloc_space(struct inode *inode, qsize_t number, int prealloc); -int dquot_alloc_inode(const struct inode *inode, qsize_t number); +int __dquot_alloc_space(struct inode *inode, qsize_t number, int flags); +void __dquot_free_space(struct inode *inode, qsize_t number, int flags); -int dquot_reserve_space(struct inode *inode, qsize_t number, int prealloc); -int dquot_claim_space(struct inode *inode, qsize_t number); -void dquot_release_reserved_space(struct inode *inode, qsize_t number); -qsize_t dquot_get_reserved_space(struct inode *inode); +int dquot_alloc_inode(const struct inode *inode); -int dquot_free_space(struct inode *inode, qsize_t number); -int dquot_free_inode(const struct inode *inode, qsize_t number); +int dquot_claim_space_nodirty(struct inode *inode, qsize_t number); +void dquot_free_inode(const struct inode *inode); + +int dquot_disable(struct super_block *sb, int type, unsigned int flags); +/* Suspend quotas on remount RO */ +static inline int dquot_suspend(struct super_block *sb, int type) +{ +	return dquot_disable(sb, type, DQUOT_SUSPENDED); +} +int dquot_resume(struct super_block *sb, int type); -int dquot_transfer(struct inode *inode, struct iattr *iattr);  int dquot_commit(struct dquot *dquot);  int dquot_acquire(struct dquot *dquot);  int dquot_release(struct dquot *dquot);  int dquot_commit_info(struct super_block *sb, int type);  int dquot_mark_dquot_dirty(struct dquot *dquot); -int vfs_quota_on(struct super_block *sb, int type, int format_id, - 	char *path, int remount); -int vfs_quota_enable(struct inode *inode, int type, int format_id, +int dquot_file_open(struct inode *inode, struct file *file); + +int dquot_quota_on(struct super_block *sb, int type, int format_id, +	char *path); +int dquot_enable(struct inode *inode, int type, int format_id,  	unsigned int flags); -int vfs_quota_on_path(struct super_block *sb, int type, int format_id, +int dquot_quota_on_path(struct super_block *sb, int type, int format_id,   	struct path *path); -int vfs_quota_on_mount(struct super_block *sb, char *qf_name, +int dquot_quota_on_mount(struct super_block *sb, char *qf_name,   	int format_id, int type); -int vfs_quota_off(struct super_block *sb, int type, int remount); -int vfs_quota_disable(struct super_block *sb, int type, unsigned int flags); -int vfs_quota_sync(struct super_block *sb, int type); -int vfs_get_dqinfo(struct super_block *sb, int type, struct if_dqinfo *ii); -int vfs_set_dqinfo(struct super_block *sb, int type, struct if_dqinfo *ii); -int vfs_get_dqblk(struct super_block *sb, int type, qid_t id, struct if_dqblk *di); -int vfs_set_dqblk(struct super_block *sb, int type, qid_t id, struct if_dqblk *di); +int dquot_quota_off(struct super_block *sb, int type); +int dquot_quota_sync(struct super_block *sb, int type, int wait); +int dquot_get_dqinfo(struct super_block *sb, int type, struct if_dqinfo *ii); +int dquot_set_dqinfo(struct super_block *sb, int type, struct if_dqinfo *ii); +int dquot_get_dqblk(struct super_block *sb, int type, qid_t id, +		struct fs_disk_quota *di); +int dquot_set_dqblk(struct super_block *sb, int type, qid_t id, +		struct fs_disk_quota *di); -void vfs_dq_drop(struct inode *inode); -int vfs_dq_transfer(struct inode *inode, struct iattr *iattr); -int vfs_dq_quota_on_remount(struct super_block *sb); +int __dquot_transfer(struct inode *inode, struct dquot **transfer_to); +int dquot_transfer(struct inode *inode, struct iattr *iattr);  static inline struct mem_dqinfo *sb_dqinfo(struct super_block *sb, int type)  { @@ -83,189 +98,63 @@ static inline struct mem_dqinfo *sb_dqinfo(struct super_block *sb, int type)   * Functions for checking status of quota   */ -static inline int sb_has_quota_usage_enabled(struct super_block *sb, int type) +static inline bool sb_has_quota_usage_enabled(struct super_block *sb, int type)  {  	return sb_dqopt(sb)->flags &  				dquot_state_flag(DQUOT_USAGE_ENABLED, type);  } -static inline int sb_has_quota_limits_enabled(struct super_block *sb, int type) +static inline bool sb_has_quota_limits_enabled(struct super_block *sb, int type)  {  	return sb_dqopt(sb)->flags &  				dquot_state_flag(DQUOT_LIMITS_ENABLED, type);  } -static inline int sb_has_quota_suspended(struct super_block *sb, int type) +static inline bool sb_has_quota_suspended(struct super_block *sb, int type)  {  	return sb_dqopt(sb)->flags &  				dquot_state_flag(DQUOT_SUSPENDED, type);  } -static inline int sb_any_quota_suspended(struct super_block *sb) +static inline unsigned sb_any_quota_suspended(struct super_block *sb)  { -	return sb_has_quota_suspended(sb, USRQUOTA) || -		sb_has_quota_suspended(sb, GRPQUOTA); +	unsigned type, tmsk = 0; +	for (type = 0; type < MAXQUOTAS; type++) +		tmsk |= sb_has_quota_suspended(sb, type) << type; +	return tmsk;  }  /* Does kernel know about any quota information for given sb + type? */ -static inline int sb_has_quota_loaded(struct super_block *sb, int type) +static inline bool sb_has_quota_loaded(struct super_block *sb, int type)  {  	/* Currently if anything is on, then quota usage is on as well */  	return sb_has_quota_usage_enabled(sb, type);  } -static inline int sb_any_quota_loaded(struct super_block *sb) +static inline unsigned sb_any_quota_loaded(struct super_block *sb)  { -	return sb_has_quota_loaded(sb, USRQUOTA) || -		sb_has_quota_loaded(sb, GRPQUOTA); +	unsigned type, tmsk = 0; +	for (type = 0; type < MAXQUOTAS; type++) +		tmsk |= sb_has_quota_loaded(sb, type) << type; +	return	tmsk;  } -static inline int sb_has_quota_active(struct super_block *sb, int type) +static inline bool sb_has_quota_active(struct super_block *sb, int type)  {  	return sb_has_quota_loaded(sb, type) &&  	       !sb_has_quota_suspended(sb, type);  } -static inline int sb_any_quota_active(struct super_block *sb) +static inline unsigned sb_any_quota_active(struct super_block *sb)  { -	return sb_has_quota_active(sb, USRQUOTA) || -	       sb_has_quota_active(sb, GRPQUOTA); +	return sb_any_quota_loaded(sb) & ~sb_any_quota_suspended(sb);  }  /*   * Operations supported for diskquotas.   */  extern const struct dquot_operations dquot_operations; -extern const struct quotactl_ops vfs_quotactl_ops; - -#define sb_dquot_ops (&dquot_operations) -#define sb_quotactl_ops (&vfs_quotactl_ops) - -/* It is better to call this function outside of any transaction as it might - * need a lot of space in journal for dquot structure allocation. */ -static inline void vfs_dq_init(struct inode *inode) -{ -	BUG_ON(!inode->i_sb); -	if (sb_any_quota_active(inode->i_sb) && !IS_NOQUOTA(inode)) -		inode->i_sb->dq_op->initialize(inode, -1); -} - -/* The following allocation/freeing/transfer functions *must* be called inside - * a transaction (deadlocks possible otherwise) */ -static inline int vfs_dq_prealloc_space_nodirty(struct inode *inode, qsize_t nr) -{ -	if (sb_any_quota_active(inode->i_sb)) { -		/* Used space is updated in alloc_space() */ -		if (inode->i_sb->dq_op->alloc_space(inode, nr, 1) == NO_QUOTA) -			return 1; -	} -	else -		inode_add_bytes(inode, nr); -	return 0; -} - -static inline int vfs_dq_prealloc_space(struct inode *inode, qsize_t nr) -{ -	int ret; -        if (!(ret =  vfs_dq_prealloc_space_nodirty(inode, nr))) -		mark_inode_dirty(inode); -	return ret; -} - -static inline int vfs_dq_alloc_space_nodirty(struct inode *inode, qsize_t nr) -{ -	if (sb_any_quota_active(inode->i_sb)) { -		/* Used space is updated in alloc_space() */ -		if (inode->i_sb->dq_op->alloc_space(inode, nr, 0) == NO_QUOTA) -			return 1; -	} -	else -		inode_add_bytes(inode, nr); -	return 0; -} - -static inline int vfs_dq_alloc_space(struct inode *inode, qsize_t nr) -{ -	int ret; -	if (!(ret = vfs_dq_alloc_space_nodirty(inode, nr))) -		mark_inode_dirty(inode); -	return ret; -} - -static inline int vfs_dq_reserve_space(struct inode *inode, qsize_t nr) -{ -	if (sb_any_quota_active(inode->i_sb)) { -		/* Used space is updated in alloc_space() */ -		if (inode->i_sb->dq_op->reserve_space(inode, nr, 0) == NO_QUOTA) -			return 1; -	} -	return 0; -} - -static inline int vfs_dq_alloc_inode(struct inode *inode) -{ -	if (sb_any_quota_active(inode->i_sb)) { -		vfs_dq_init(inode); -		if (inode->i_sb->dq_op->alloc_inode(inode, 1) == NO_QUOTA) -			return 1; -	} -	return 0; -} - -/* - * Convert in-memory reserved quotas to real consumed quotas - */ -static inline int vfs_dq_claim_space(struct inode *inode, qsize_t nr) -{ -	if (sb_any_quota_active(inode->i_sb)) { -		if (inode->i_sb->dq_op->claim_space(inode, nr) == NO_QUOTA) -			return 1; -	} else -		inode_add_bytes(inode, nr); - -	mark_inode_dirty(inode); -	return 0; -} - -/* - * Release reserved (in-memory) quotas - */ -static inline -void vfs_dq_release_reservation_space(struct inode *inode, qsize_t nr) -{ -	if (sb_any_quota_active(inode->i_sb)) -		inode->i_sb->dq_op->release_rsv(inode, nr); -} - -static inline void vfs_dq_free_space_nodirty(struct inode *inode, qsize_t nr) -{ -	if (sb_any_quota_active(inode->i_sb)) -		inode->i_sb->dq_op->free_space(inode, nr); -	else -		inode_sub_bytes(inode, nr); -} - -static inline void vfs_dq_free_space(struct inode *inode, qsize_t nr) -{ -	vfs_dq_free_space_nodirty(inode, nr); -	mark_inode_dirty(inode); -} - -static inline void vfs_dq_free_inode(struct inode *inode) -{ -	if (sb_any_quota_active(inode->i_sb)) -		inode->i_sb->dq_op->free_inode(inode, 1); -} - -/* Cannot be called inside a transaction */ -static inline int vfs_dq_off(struct super_block *sb, int remount) -{ -	int ret = -ENOSYS; - -	if (sb->s_qcop && sb->s_qcop->quota_off) -		ret = sb->s_qcop->quota_off(sb, -1, remount); -	return ret; -} +extern const struct quotactl_ops dquot_quotactl_ops;  #else @@ -310,151 +199,161 @@ static inline int sb_any_quota_active(struct super_block *sb)  	return 0;  } -/* - * NO-OP when quota not configured. - */ -#define sb_dquot_ops				(NULL) -#define sb_quotactl_ops				(NULL) - -static inline void vfs_dq_init(struct inode *inode) +static inline void dquot_initialize(struct inode *inode)  {  } -static inline void vfs_dq_drop(struct inode *inode) +static inline void dquot_drop(struct inode *inode)  {  } -static inline int vfs_dq_alloc_inode(struct inode *inode) +static inline int dquot_alloc_inode(const struct inode *inode)  {  	return 0;  } -static inline void vfs_dq_free_inode(struct inode *inode) +static inline void dquot_free_inode(const struct inode *inode)  {  } -static inline void sync_quota_sb(struct super_block *sb, int type) +static inline int dquot_transfer(struct inode *inode, struct iattr *iattr)  { +	return 0;  } -static inline void writeout_quota_sb(struct super_block *sb, int type) +static inline int __dquot_alloc_space(struct inode *inode, qsize_t number, +		int flags)  { +	if (!(flags & DQUOT_SPACE_RESERVE)) +		inode_add_bytes(inode, number); +	return 0;  } -static inline int vfs_dq_off(struct super_block *sb, int remount) +static inline void __dquot_free_space(struct inode *inode, qsize_t number, +		int flags)  { -	return 0; +	if (!(flags & DQUOT_SPACE_RESERVE)) +		inode_sub_bytes(inode, number);  } -static inline int vfs_dq_quota_on_remount(struct super_block *sb) +static inline int dquot_claim_space_nodirty(struct inode *inode, qsize_t number)  { +	inode_add_bytes(inode, number);  	return 0;  } -static inline int vfs_dq_transfer(struct inode *inode, struct iattr *iattr) +static inline int dquot_disable(struct super_block *sb, int type, +		unsigned int flags)  {  	return 0;  } -static inline int vfs_dq_prealloc_space_nodirty(struct inode *inode, qsize_t nr) +static inline int dquot_suspend(struct super_block *sb, int type)  { -	inode_add_bytes(inode, nr);  	return 0;  } -static inline int vfs_dq_prealloc_space(struct inode *inode, qsize_t nr) +static inline int dquot_resume(struct super_block *sb, int type)  { -	vfs_dq_prealloc_space_nodirty(inode, nr); -	mark_inode_dirty(inode);  	return 0;  } -static inline int vfs_dq_alloc_space_nodirty(struct inode *inode, qsize_t nr) +#define dquot_file_open		generic_file_open + +#endif /* CONFIG_QUOTA */ + +static inline int dquot_alloc_space_nodirty(struct inode *inode, qsize_t nr)  { -	inode_add_bytes(inode, nr); -	return 0; +	return __dquot_alloc_space(inode, nr, DQUOT_SPACE_WARN);  } -static inline int vfs_dq_alloc_space(struct inode *inode, qsize_t nr) +static inline void dquot_alloc_space_nofail(struct inode *inode, qsize_t nr)  { -	vfs_dq_alloc_space_nodirty(inode, nr); +	__dquot_alloc_space(inode, nr, DQUOT_SPACE_WARN|DQUOT_SPACE_NOFAIL);  	mark_inode_dirty(inode); -	return 0;  } -static inline int vfs_dq_reserve_space(struct inode *inode, qsize_t nr) +static inline int dquot_alloc_space(struct inode *inode, qsize_t nr)  { -	return 0; -} +	int ret; -static inline int vfs_dq_claim_space(struct inode *inode, qsize_t nr) -{ -	return vfs_dq_alloc_space(inode, nr); +	ret = dquot_alloc_space_nodirty(inode, nr); +	if (!ret) +		mark_inode_dirty(inode); +	return ret;  } -static inline -int vfs_dq_release_reservation_space(struct inode *inode, qsize_t nr) +static inline int dquot_alloc_block_nodirty(struct inode *inode, qsize_t nr)  { -	return 0; +	return dquot_alloc_space_nodirty(inode, nr << inode->i_blkbits);  } -static inline void vfs_dq_free_space_nodirty(struct inode *inode, qsize_t nr) +static inline void dquot_alloc_block_nofail(struct inode *inode, qsize_t nr)  { -	inode_sub_bytes(inode, nr); +	dquot_alloc_space_nofail(inode, nr << inode->i_blkbits);  } -static inline void vfs_dq_free_space(struct inode *inode, qsize_t nr) +static inline int dquot_alloc_block(struct inode *inode, qsize_t nr)  { -	vfs_dq_free_space_nodirty(inode, nr); -	mark_inode_dirty(inode); -}	 - -#endif /* CONFIG_QUOTA */ +	return dquot_alloc_space(inode, nr << inode->i_blkbits); +} -static inline int vfs_dq_prealloc_block_nodirty(struct inode *inode, qsize_t nr) +static inline int dquot_prealloc_block_nodirty(struct inode *inode, qsize_t nr)  { -	return vfs_dq_prealloc_space_nodirty(inode, nr << inode->i_blkbits); +	return __dquot_alloc_space(inode, nr << inode->i_blkbits, 0);  } -static inline int vfs_dq_prealloc_block(struct inode *inode, qsize_t nr) +static inline int dquot_prealloc_block(struct inode *inode, qsize_t nr)  { -	return vfs_dq_prealloc_space(inode, nr << inode->i_blkbits); +	int ret; + +	ret = dquot_prealloc_block_nodirty(inode, nr); +	if (!ret) +		mark_inode_dirty(inode); +	return ret;  } -static inline int vfs_dq_alloc_block_nodirty(struct inode *inode, qsize_t nr) +static inline int dquot_reserve_block(struct inode *inode, qsize_t nr)  { -	return vfs_dq_alloc_space_nodirty(inode, nr << inode->i_blkbits); +	return __dquot_alloc_space(inode, nr << inode->i_blkbits, +				DQUOT_SPACE_WARN|DQUOT_SPACE_RESERVE);  } -static inline int vfs_dq_alloc_block(struct inode *inode, qsize_t nr) +static inline int dquot_claim_block(struct inode *inode, qsize_t nr)  { -	return vfs_dq_alloc_space(inode, nr << inode->i_blkbits); +	int ret; + +	ret = dquot_claim_space_nodirty(inode, nr << inode->i_blkbits); +	if (!ret) +		mark_inode_dirty(inode); +	return ret;  } -static inline int vfs_dq_reserve_block(struct inode *inode, qsize_t nr) +static inline void dquot_free_space_nodirty(struct inode *inode, qsize_t nr)  { -	return vfs_dq_reserve_space(inode, nr << inode->i_blkbits); +	__dquot_free_space(inode, nr, 0);  } -static inline int vfs_dq_claim_block(struct inode *inode, qsize_t nr) +static inline void dquot_free_space(struct inode *inode, qsize_t nr)  { -	return vfs_dq_claim_space(inode, nr << inode->i_blkbits); +	dquot_free_space_nodirty(inode, nr); +	mark_inode_dirty(inode);  } -static inline -void vfs_dq_release_reservation_block(struct inode *inode, qsize_t nr) +static inline void dquot_free_block_nodirty(struct inode *inode, qsize_t nr)  { -	vfs_dq_release_reservation_space(inode, nr << inode->i_blkbits); +	dquot_free_space_nodirty(inode, nr << inode->i_blkbits);  } -static inline void vfs_dq_free_block_nodirty(struct inode *inode, qsize_t nr) +static inline void dquot_free_block(struct inode *inode, qsize_t nr)  { -	vfs_dq_free_space_nodirty(inode, nr << inode->i_blkbits); +	dquot_free_space(inode, nr << inode->i_blkbits);  } -static inline void vfs_dq_free_block(struct inode *inode, qsize_t nr) +static inline void dquot_release_reservation_block(struct inode *inode, +		qsize_t nr)  { -	vfs_dq_free_space(inode, nr << inode->i_blkbits); +	__dquot_free_space(inode, nr << inode->i_blkbits, DQUOT_SPACE_RESERVE);  }  #endif /* _LINUX_QUOTAOPS_ */ diff --git a/include/linux/radix-tree.h b/include/linux/radix-tree.h index c5da7491809..55ca73cf25e 100644 --- a/include/linux/radix-tree.h +++ b/include/linux/radix-tree.h @@ -121,6 +121,13 @@ do {									\   * (Note, rcu_assign_pointer and rcu_dereference are not needed to control   * access to data items when inserting into or looking up from the radix tree)   * + * Note that the value returned by radix_tree_tag_get() may not be relied upon + * if only the RCU read lock is held.  Functions to set/clear tags and to + * delete nodes running concurrently with it may affect its result such that + * two consecutive reads in the same locked section may return different + * values.  If reliability is required, modification functions must also be + * excluded from concurrency. + *   * radix_tree_tagged is able to be called without locking or RCU.   */ diff --git a/include/linux/raid_class.h b/include/linux/raid_class.h index 6b537f1ac96..31e1ff69efc 100644 --- a/include/linux/raid_class.h +++ b/include/linux/raid_class.h @@ -32,6 +32,7 @@ enum raid_level {  	RAID_LEVEL_0,  	RAID_LEVEL_1,  	RAID_LEVEL_10, +	RAID_LEVEL_1E,  	RAID_LEVEL_3,  	RAID_LEVEL_4,  	RAID_LEVEL_5, diff --git a/include/linux/ramfs.h b/include/linux/ramfs.h index 4e768dda87b..e7320b5e82f 100644 --- a/include/linux/ramfs.h +++ b/include/linux/ramfs.h @@ -1,7 +1,8 @@  #ifndef _LINUX_RAMFS_H  #define _LINUX_RAMFS_H -struct inode *ramfs_get_inode(struct super_block *sb, int mode, dev_t dev); +struct inode *ramfs_get_inode(struct super_block *sb, const struct inode *dir, +	 int mode, dev_t dev);  extern int ramfs_get_sb(struct file_system_type *fs_type,  	 int flags, const char *dev_name, void *data, struct vfsmount *mnt); @@ -20,4 +21,6 @@ extern const struct file_operations ramfs_file_operations;  extern const struct vm_operations_struct generic_file_vm_ops;  extern int __init init_rootfs(void); +int ramfs_fill_super(struct super_block *sb, void *data, int silent); +  #endif diff --git a/include/linux/random.h b/include/linux/random.h index 25d02fe5c9b..fb7ab9de5f3 100644 --- a/include/linux/random.h +++ b/include/linux/random.h @@ -40,6 +40,10 @@ struct rand_pool_info {  	__u32	buf[0];  }; +struct rnd_state { +	__u32 s1, s2, s3; +}; +  /* Exported functions */  #ifdef __KERNEL__ @@ -74,6 +78,30 @@ unsigned long randomize_range(unsigned long start, unsigned long end, unsigned l  u32 random32(void);  void srandom32(u32 seed); +u32 prandom32(struct rnd_state *); + +/* + * Handle minimum values for seeds + */ +static inline u32 __seed(u32 x, u32 m) +{ +	return (x < m) ? x + m : x; +} + +/** + * prandom32_seed - set seed for prandom32(). + * @state: pointer to state structure to receive the seed. + * @seed: arbitrary 64-bit value to use as a seed. + */ +static inline void prandom32_seed(struct rnd_state *state, u64 seed) +{ +	u32 i = (seed >> 32) ^ (seed << 10) ^ seed; + +	state->s1 = __seed(i, 1); +	state->s2 = __seed(i, 7); +	state->s3 = __seed(i, 15); +} +  #endif /* __KERNEL___ */  #endif /* _LINUX_RANDOM_H */ diff --git a/include/linux/range.h b/include/linux/range.h new file mode 100644 index 00000000000..bd184a5db79 --- /dev/null +++ b/include/linux/range.h @@ -0,0 +1,30 @@ +#ifndef _LINUX_RANGE_H +#define _LINUX_RANGE_H + +struct range { +	u64   start; +	u64   end; +}; + +int add_range(struct range *range, int az, int nr_range, +		u64 start, u64 end); + + +int add_range_with_merge(struct range *range, int az, int nr_range, +				u64 start, u64 end); + +void subtract_range(struct range *range, int az, u64 start, u64 end); + +int clean_sort_range(struct range *range, int az); + +void sort_range(struct range *range, int nr_range); + +#define MAX_RESOURCE ((resource_size_t)~0) +static inline resource_size_t cap_resource(u64 val) +{ +	if (val > MAX_RESOURCE) +		return MAX_RESOURCE; + +	return val; +} +#endif diff --git a/include/linux/ratelimit.h b/include/linux/ratelimit.h index 668cf1bef03..8f69d09a41a 100644 --- a/include/linux/ratelimit.h +++ b/include/linux/ratelimit.h @@ -2,7 +2,7 @@  #define _LINUX_RATELIMIT_H  #include <linux/param.h> -#include <linux/spinlock_types.h> +#include <linux/spinlock.h>  #define DEFAULT_RATELIMIT_INTERVAL	(5 * HZ)  #define DEFAULT_RATELIMIT_BURST		10 @@ -25,6 +25,17 @@ struct ratelimit_state {  		.burst		= burst_init,				\  	} +static inline void ratelimit_state_init(struct ratelimit_state *rs, +					int interval, int burst) +{ +	spin_lock_init(&rs->lock); +	rs->interval = interval; +	rs->burst = burst; +	rs->printed = 0; +	rs->missed = 0; +	rs->begin = 0; +} +  extern int ___ratelimit(struct ratelimit_state *rs, const char *func);  #define __ratelimit(state) ___ratelimit(state, __func__) diff --git a/include/linux/rbtree.h b/include/linux/rbtree.h index 9c295411d01..fe1872e5b37 100644 --- a/include/linux/rbtree.h +++ b/include/linux/rbtree.h @@ -25,10 +25,10 @@    Some example of insert and search follows here. The search is a plain    normal search over an ordered tree. The insert instead must be implemented -  int two steps: as first thing the code must insert the element in -  order as a red leaf in the tree, then the support library function -  rb_insert_color() must be called. Such function will do the -  not trivial work to rebalance the rbtree if necessary. +  in two steps: First, the code must insert the element in order as a red leaf +  in the tree, and then the support library function rb_insert_color() must +  be called. Such function will do the not trivial work to rebalance the +  rbtree, if necessary.  -----------------------------------------------------------------------  static inline struct page * rb_search_page_cache(struct inode * inode, @@ -110,6 +110,7 @@ struct rb_node  struct rb_root  {  	struct rb_node *rb_node; +	void (*augment_cb)(struct rb_node *node);  }; @@ -129,7 +130,9 @@ static inline void rb_set_color(struct rb_node *rb, int color)  	rb->rb_parent_color = (rb->rb_parent_color & ~1) | color;  } -#define RB_ROOT	(struct rb_root) { NULL, } +#define RB_ROOT	(struct rb_root) { NULL, NULL, } +#define RB_AUGMENT_ROOT(x)	(struct rb_root) { NULL, x} +  #define	rb_entry(ptr, type, member) container_of(ptr, type, member)  #define RB_EMPTY_ROOT(root)	((root)->rb_node == NULL) diff --git a/include/linux/rculist.h b/include/linux/rculist.h index 1bf0f708c4f..4ec3b38ce9c 100644 --- a/include/linux/rculist.h +++ b/include/linux/rculist.h @@ -208,7 +208,7 @@ static inline void list_splice_init_rcu(struct list_head *list,   * primitives such as list_add_rcu() as long as it's guarded by rcu_read_lock().   */  #define list_entry_rcu(ptr, type, member) \ -	container_of(rcu_dereference(ptr), type, member) +	container_of(rcu_dereference_raw(ptr), type, member)  /**   * list_first_entry_rcu - get the first element from a list @@ -225,9 +225,9 @@ static inline void list_splice_init_rcu(struct list_head *list,  	list_entry_rcu((ptr)->next, type, member)  #define __list_for_each_rcu(pos, head) \ -	for (pos = rcu_dereference((head)->next); \ +	for (pos = rcu_dereference_raw((head)->next); \  		pos != (head); \ -		pos = rcu_dereference(pos->next)) +		pos = rcu_dereference_raw(pos->next))  /**   * list_for_each_entry_rcu	-	iterate over rcu list of given type @@ -257,9 +257,9 @@ static inline void list_splice_init_rcu(struct list_head *list,   * as long as the traversal is guarded by rcu_read_lock().   */  #define list_for_each_continue_rcu(pos, head) \ -	for ((pos) = rcu_dereference((pos)->next); \ +	for ((pos) = rcu_dereference_raw((pos)->next); \  		prefetch((pos)->next), (pos) != (head); \ -		(pos) = rcu_dereference((pos)->next)) +		(pos) = rcu_dereference_raw((pos)->next))  /**   * list_for_each_entry_continue_rcu - continue iteration over list of given type @@ -406,6 +406,11 @@ static inline void hlist_add_after_rcu(struct hlist_node *prev,  		n->next->pprev = &n->next;  } +#define __hlist_for_each_rcu(pos, head)			\ +	for (pos = rcu_dereference((head)->first);	\ +	     pos && ({ prefetch(pos->next); 1; });	\ +	     pos = rcu_dereference(pos->next)) +  /**   * hlist_for_each_entry_rcu - iterate over rcu list of given type   * @tpos:	the type * to use as a loop cursor. @@ -418,10 +423,52 @@ static inline void hlist_add_after_rcu(struct hlist_node *prev,   * as long as the traversal is guarded by rcu_read_lock().   */  #define hlist_for_each_entry_rcu(tpos, pos, head, member)		 \ -	for (pos = rcu_dereference((head)->first);			 \ +	for (pos = rcu_dereference_raw((head)->first);			 \ +		pos && ({ prefetch(pos->next); 1; }) &&			 \ +		({ tpos = hlist_entry(pos, typeof(*tpos), member); 1; }); \ +		pos = rcu_dereference_raw(pos->next)) + +/** + * hlist_for_each_entry_rcu_bh - iterate over rcu list of given type + * @tpos:	the type * to use as a loop cursor. + * @pos:	the &struct hlist_node to use as a loop cursor. + * @head:	the head for your list. + * @member:	the name of the hlist_node within the struct. + * + * This list-traversal primitive may safely run concurrently with + * the _rcu list-mutation primitives such as hlist_add_head_rcu() + * as long as the traversal is guarded by rcu_read_lock(). + */ +#define hlist_for_each_entry_rcu_bh(tpos, pos, head, member)		 \ +	for (pos = rcu_dereference_bh((head)->first);			 \  		pos && ({ prefetch(pos->next); 1; }) &&			 \  		({ tpos = hlist_entry(pos, typeof(*tpos), member); 1; }); \ -		pos = rcu_dereference(pos->next)) +		pos = rcu_dereference_bh(pos->next)) + +/** + * hlist_for_each_entry_continue_rcu - iterate over a hlist continuing after current point + * @tpos:	the type * to use as a loop cursor. + * @pos:	the &struct hlist_node to use as a loop cursor. + * @member:	the name of the hlist_node within the struct. + */ +#define hlist_for_each_entry_continue_rcu(tpos, pos, member)		\ +	for (pos = rcu_dereference((pos)->next);			\ +	     pos && ({ prefetch(pos->next); 1; }) &&			\ +	     ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1; });  \ +	     pos = rcu_dereference(pos->next)) + +/** + * hlist_for_each_entry_continue_rcu_bh - iterate over a hlist continuing after current point + * @tpos:	the type * to use as a loop cursor. + * @pos:	the &struct hlist_node to use as a loop cursor. + * @member:	the name of the hlist_node within the struct. + */ +#define hlist_for_each_entry_continue_rcu_bh(tpos, pos, member)		\ +	for (pos = rcu_dereference_bh((pos)->next);			\ +	     pos && ({ prefetch(pos->next); 1; }) &&			\ +	     ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1; });  \ +	     pos = rcu_dereference_bh(pos->next)) +  #endif	/* __KERNEL__ */  #endif diff --git a/include/linux/rculist_nulls.h b/include/linux/rculist_nulls.h index 589a40919f0..b70ffe53cb9 100644 --- a/include/linux/rculist_nulls.h +++ b/include/linux/rculist_nulls.h @@ -101,10 +101,10 @@ static inline void hlist_nulls_add_head_rcu(struct hlist_nulls_node *n,   *   */  #define hlist_nulls_for_each_entry_rcu(tpos, pos, head, member) \ -	for (pos = rcu_dereference((head)->first);			 \ +	for (pos = rcu_dereference_raw((head)->first);			 \  		(!is_a_nulls(pos)) &&			\  		({ tpos = hlist_nulls_entry(pos, typeof(*tpos), member); 1; }); \ -		pos = rcu_dereference(pos->next)) +		pos = rcu_dereference_raw(pos->next))  #endif  #endif diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h index 24440f4bf47..b653b4aaa8a 100644 --- a/include/linux/rcupdate.h +++ b/include/linux/rcupdate.h @@ -41,6 +41,10 @@  #include <linux/lockdep.h>  #include <linux/completion.h> +#ifdef CONFIG_RCU_TORTURE_TEST +extern int rcutorture_runnable; /* for sysctl */ +#endif /* #ifdef CONFIG_RCU_TORTURE_TEST */ +  /**   * struct rcu_head - callback structure for use with RCU   * @next: next update requests in a list @@ -52,8 +56,6 @@ struct rcu_head {  };  /* Exported common interfaces */ -extern void synchronize_rcu_bh(void); -extern void synchronize_sched(void);  extern void rcu_barrier(void);  extern void rcu_barrier_bh(void);  extern void rcu_barrier_sched(void); @@ -77,15 +79,204 @@ extern void rcu_init(void);         (ptr)->next = NULL; (ptr)->func = NULL; \  } while (0) +static inline void init_rcu_head_on_stack(struct rcu_head *head) +{ +} + +static inline void destroy_rcu_head_on_stack(struct rcu_head *head) +{ +} +  #ifdef CONFIG_DEBUG_LOCK_ALLOC +  extern struct lockdep_map rcu_lock_map; -# define rcu_read_acquire()	\ -			lock_acquire(&rcu_lock_map, 0, 0, 2, 1, NULL, _THIS_IP_) +# define rcu_read_acquire() \ +		lock_acquire(&rcu_lock_map, 0, 0, 2, 1, NULL, _THIS_IP_)  # define rcu_read_release()	lock_release(&rcu_lock_map, 1, _THIS_IP_) -#else -# define rcu_read_acquire()	do { } while (0) -# define rcu_read_release()	do { } while (0) -#endif + +extern struct lockdep_map rcu_bh_lock_map; +# define rcu_read_acquire_bh() \ +		lock_acquire(&rcu_bh_lock_map, 0, 0, 2, 1, NULL, _THIS_IP_) +# define rcu_read_release_bh()	lock_release(&rcu_bh_lock_map, 1, _THIS_IP_) + +extern struct lockdep_map rcu_sched_lock_map; +# define rcu_read_acquire_sched() \ +		lock_acquire(&rcu_sched_lock_map, 0, 0, 2, 1, NULL, _THIS_IP_) +# define rcu_read_release_sched() \ +		lock_release(&rcu_sched_lock_map, 1, _THIS_IP_) + +extern int debug_lockdep_rcu_enabled(void); + +/** + * rcu_read_lock_held - might we be in RCU read-side critical section? + * + * If CONFIG_DEBUG_LOCK_ALLOC is selected, returns nonzero iff in an RCU + * read-side critical section.  In absence of CONFIG_DEBUG_LOCK_ALLOC, + * this assumes we are in an RCU read-side critical section unless it can + * prove otherwise. + * + * Check debug_lockdep_rcu_enabled() to prevent false positives during boot + * and while lockdep is disabled. + */ +static inline int rcu_read_lock_held(void) +{ +	if (!debug_lockdep_rcu_enabled()) +		return 1; +	return lock_is_held(&rcu_lock_map); +} + +/* + * rcu_read_lock_bh_held() is defined out of line to avoid #include-file + * hell. + */ +extern int rcu_read_lock_bh_held(void); + +/** + * rcu_read_lock_sched_held - might we be in RCU-sched read-side critical section? + * + * If CONFIG_DEBUG_LOCK_ALLOC is selected, returns nonzero iff in an + * RCU-sched read-side critical section.  In absence of + * CONFIG_DEBUG_LOCK_ALLOC, this assumes we are in an RCU-sched read-side + * critical section unless it can prove otherwise.  Note that disabling + * of preemption (including disabling irqs) counts as an RCU-sched + * read-side critical section. + * + * Check debug_lockdep_rcu_enabled() to prevent false positives during boot + * and while lockdep is disabled. + */ +#ifdef CONFIG_PREEMPT +static inline int rcu_read_lock_sched_held(void) +{ +	int lockdep_opinion = 0; + +	if (!debug_lockdep_rcu_enabled()) +		return 1; +	if (debug_locks) +		lockdep_opinion = lock_is_held(&rcu_sched_lock_map); +	return lockdep_opinion || preempt_count() != 0 || irqs_disabled(); +} +#else /* #ifdef CONFIG_PREEMPT */ +static inline int rcu_read_lock_sched_held(void) +{ +	return 1; +} +#endif /* #else #ifdef CONFIG_PREEMPT */ + +#else /* #ifdef CONFIG_DEBUG_LOCK_ALLOC */ + +# define rcu_read_acquire()		do { } while (0) +# define rcu_read_release()		do { } while (0) +# define rcu_read_acquire_bh()		do { } while (0) +# define rcu_read_release_bh()		do { } while (0) +# define rcu_read_acquire_sched()	do { } while (0) +# define rcu_read_release_sched()	do { } while (0) + +static inline int rcu_read_lock_held(void) +{ +	return 1; +} + +static inline int rcu_read_lock_bh_held(void) +{ +	return 1; +} + +#ifdef CONFIG_PREEMPT +static inline int rcu_read_lock_sched_held(void) +{ +	return preempt_count() != 0 || irqs_disabled(); +} +#else /* #ifdef CONFIG_PREEMPT */ +static inline int rcu_read_lock_sched_held(void) +{ +	return 1; +} +#endif /* #else #ifdef CONFIG_PREEMPT */ + +#endif /* #else #ifdef CONFIG_DEBUG_LOCK_ALLOC */ + +#ifdef CONFIG_PROVE_RCU + +extern int rcu_my_thread_group_empty(void); + +#define __do_rcu_dereference_check(c)					\ +	do {								\ +		static bool __warned;					\ +		if (debug_lockdep_rcu_enabled() && !__warned && !(c)) {	\ +			__warned = true;				\ +			lockdep_rcu_dereference(__FILE__, __LINE__);	\ +		}							\ +	} while (0) + +/** + * rcu_dereference_check - rcu_dereference with debug checking + * @p: The pointer to read, prior to dereferencing + * @c: The conditions under which the dereference will take place + * + * Do an rcu_dereference(), but check that the conditions under which the + * dereference will take place are correct.  Typically the conditions indicate + * the various locking conditions that should be held at that point.  The check + * should return true if the conditions are satisfied. + * + * For example: + * + *	bar = rcu_dereference_check(foo->bar, rcu_read_lock_held() || + *					      lockdep_is_held(&foo->lock)); + * + * could be used to indicate to lockdep that foo->bar may only be dereferenced + * if either the RCU read lock is held, or that the lock required to replace + * the bar struct at foo->bar is held. + * + * Note that the list of conditions may also include indications of when a lock + * need not be held, for example during initialisation or destruction of the + * target struct: + * + *	bar = rcu_dereference_check(foo->bar, rcu_read_lock_held() || + *					      lockdep_is_held(&foo->lock) || + *					      atomic_read(&foo->usage) == 0); + */ +#define rcu_dereference_check(p, c) \ +	({ \ +		__do_rcu_dereference_check(c); \ +		rcu_dereference_raw(p); \ +	}) + +/** + * rcu_dereference_protected - fetch RCU pointer when updates prevented + * + * Return the value of the specified RCU-protected pointer, but omit + * both the smp_read_barrier_depends() and the ACCESS_ONCE().  This + * is useful in cases where update-side locks prevent the value of the + * pointer from changing.  Please note that this primitive does -not- + * prevent the compiler from repeating this reference or combining it + * with other references, so it should not be used without protection + * of appropriate locks. + */ +#define rcu_dereference_protected(p, c) \ +	({ \ +		__do_rcu_dereference_check(c); \ +		(p); \ +	}) + +#else /* #ifdef CONFIG_PROVE_RCU */ + +#define rcu_dereference_check(p, c)	rcu_dereference_raw(p) +#define rcu_dereference_protected(p, c) (p) + +#endif /* #else #ifdef CONFIG_PROVE_RCU */ + +/** + * rcu_access_pointer - fetch RCU pointer with no dereferencing + * + * Return the value of the specified RCU-protected pointer, but omit the + * smp_read_barrier_depends() and keep the ACCESS_ONCE().  This is useful + * when the value of this pointer is accessed, but the pointer is not + * dereferenced, for example, when testing an RCU-protected pointer against + * NULL.  This may also be used in cases where update-side locks prevent + * the value of the pointer from changing, but rcu_dereference_protected() + * is a lighter-weight primitive for this use case. + */ +#define rcu_access_pointer(p)	ACCESS_ONCE(p)  /**   * rcu_read_lock - mark the beginning of an RCU read-side critical section. @@ -160,7 +351,7 @@ static inline void rcu_read_lock_bh(void)  {  	__rcu_read_lock_bh();  	__acquire(RCU_BH); -	rcu_read_acquire(); +	rcu_read_acquire_bh();  }  /* @@ -170,7 +361,7 @@ static inline void rcu_read_lock_bh(void)   */  static inline void rcu_read_unlock_bh(void)  { -	rcu_read_release(); +	rcu_read_release_bh();  	__release(RCU_BH);  	__rcu_read_unlock_bh();  } @@ -188,7 +379,7 @@ static inline void rcu_read_lock_sched(void)  {  	preempt_disable();  	__acquire(RCU_SCHED); -	rcu_read_acquire(); +	rcu_read_acquire_sched();  }  /* Used by lockdep and tracing: cannot be traced, cannot call lockdep. */ @@ -205,7 +396,7 @@ static inline notrace void rcu_read_lock_sched_notrace(void)   */  static inline void rcu_read_unlock_sched(void)  { -	rcu_read_release(); +	rcu_read_release_sched();  	__release(RCU_SCHED);  	preempt_enable();  } @@ -219,22 +410,49 @@ static inline notrace void rcu_read_unlock_sched_notrace(void)  /** - * rcu_dereference - fetch an RCU-protected pointer in an - * RCU read-side critical section.  This pointer may later - * be safely dereferenced. + * rcu_dereference_raw - fetch an RCU-protected pointer + * + * The caller must be within some flavor of RCU read-side critical + * section, or must be otherwise preventing the pointer from changing, + * for example, by holding an appropriate lock.  This pointer may later + * be safely dereferenced.  It is the caller's responsibility to have + * done the right thing, as this primitive does no checking of any kind.   *   * Inserts memory barriers on architectures that require them   * (currently only the Alpha), and, more importantly, documents   * exactly which pointers are protected by RCU.   */ - -#define rcu_dereference(p)     ({ \ +#define rcu_dereference_raw(p)	({ \  				typeof(p) _________p1 = ACCESS_ONCE(p); \  				smp_read_barrier_depends(); \  				(_________p1); \  				})  /** + * rcu_dereference - fetch an RCU-protected pointer, checking for RCU + * + * Makes rcu_dereference_check() do the dirty work. + */ +#define rcu_dereference(p) \ +	rcu_dereference_check(p, rcu_read_lock_held()) + +/** + * rcu_dereference_bh - fetch an RCU-protected pointer, checking for RCU-bh + * + * Makes rcu_dereference_check() do the dirty work. + */ +#define rcu_dereference_bh(p) \ +		rcu_dereference_check(p, rcu_read_lock_bh_held()) + +/** + * rcu_dereference_sched - fetch RCU-protected pointer, checking for RCU-sched + * + * Makes rcu_dereference_check() do the dirty work. + */ +#define rcu_dereference_sched(p) \ +		rcu_dereference_check(p, rcu_read_lock_sched_held()) + +/**   * rcu_assign_pointer - assign (publicize) a pointer to a newly   * initialized structure that will be dereferenced by RCU read-side   * critical sections.  Returns the value assigned. diff --git a/include/linux/rcutiny.h b/include/linux/rcutiny.h index 96cc307ed9f..e2e893144a8 100644 --- a/include/linux/rcutiny.h +++ b/include/linux/rcutiny.h @@ -29,6 +29,10 @@  void rcu_sched_qs(int cpu);  void rcu_bh_qs(int cpu); +static inline void rcu_note_context_switch(int cpu) +{ +	rcu_sched_qs(cpu); +}  #define __rcu_read_lock()	preempt_disable()  #define __rcu_read_unlock()	preempt_enable() @@ -60,9 +64,29 @@ static inline long rcu_batches_completed_bh(void)  	return 0;  } -extern int rcu_expedited_torture_stats(char *page); +static inline void rcu_force_quiescent_state(void) +{ +} + +static inline void rcu_bh_force_quiescent_state(void) +{ +} + +static inline void rcu_sched_force_quiescent_state(void) +{ +} + +extern void synchronize_sched(void); + +static inline void synchronize_rcu(void) +{ +	synchronize_sched(); +} -#define synchronize_rcu synchronize_sched +static inline void synchronize_rcu_bh(void) +{ +	synchronize_sched(); +}  static inline void synchronize_rcu_expedited(void)  { @@ -93,10 +117,6 @@ static inline void rcu_exit_nohz(void)  #endif /* #else #ifdef CONFIG_NO_HZ */ -static inline void rcu_scheduler_starting(void) -{ -} -  static inline void exit_rcu(void)  {  } @@ -106,4 +126,17 @@ static inline int rcu_preempt_depth(void)  	return 0;  } +#ifdef CONFIG_DEBUG_LOCK_ALLOC + +extern int rcu_scheduler_active __read_mostly; +extern void rcu_scheduler_starting(void); + +#else /* #ifdef CONFIG_DEBUG_LOCK_ALLOC */ + +static inline void rcu_scheduler_starting(void) +{ +} + +#endif /* #else #ifdef CONFIG_DEBUG_LOCK_ALLOC */ +  #endif /* __LINUX_RCUTINY_H */ diff --git a/include/linux/rcutree.h b/include/linux/rcutree.h index 8044b1b9433..c0ed1c056f2 100644 --- a/include/linux/rcutree.h +++ b/include/linux/rcutree.h @@ -34,9 +34,8 @@ struct notifier_block;  extern void rcu_sched_qs(int cpu);  extern void rcu_bh_qs(int cpu); +extern void rcu_note_context_switch(int cpu);  extern int rcu_needs_cpu(int cpu); -extern void rcu_scheduler_starting(void); -extern int rcu_expedited_torture_stats(char *page);  #ifdef CONFIG_TREE_PREEMPT_RCU @@ -87,6 +86,8 @@ static inline void __rcu_read_unlock_bh(void)  extern void call_rcu_sched(struct rcu_head *head,  			   void (*func)(struct rcu_head *rcu)); +extern void synchronize_rcu_bh(void); +extern void synchronize_sched(void);  extern void synchronize_rcu_expedited(void);  static inline void synchronize_rcu_bh_expedited(void) @@ -99,6 +100,9 @@ extern void rcu_check_callbacks(int cpu, int user);  extern long rcu_batches_completed(void);  extern long rcu_batches_completed_bh(void);  extern long rcu_batches_completed_sched(void); +extern void rcu_force_quiescent_state(void); +extern void rcu_bh_force_quiescent_state(void); +extern void rcu_sched_force_quiescent_state(void);  #ifdef CONFIG_NO_HZ  void rcu_enter_nohz(void); @@ -118,4 +122,7 @@ static inline int rcu_blocking_is_gp(void)  	return num_online_cpus() == 1;  } +extern void rcu_scheduler_starting(void); +extern int rcu_scheduler_active __read_mostly; +  #endif /* __LINUX_RCUTREE_H */ diff --git a/include/linux/reboot.h b/include/linux/reboot.h index 988e55fe649..3005d5a7fce 100644 --- a/include/linux/reboot.h +++ b/include/linux/reboot.h @@ -64,6 +64,7 @@ extern void kernel_restart(char *cmd);  extern void kernel_halt(void);  extern void kernel_power_off(void); +extern int C_A_D; /* for sysctl */  void ctrl_alt_del(void);  #define POWEROFF_CMD_PATH_LEN	256 diff --git a/include/linux/regulator/consumer.h b/include/linux/regulator/consumer.h index 030d92255c7..ebd74726529 100644 --- a/include/linux/regulator/consumer.h +++ b/include/linux/regulator/consumer.h @@ -89,8 +89,9 @@   * REGULATION_OUT Regulator output is out of regulation.   * FAIL           Regulator output has failed.   * OVER_TEMP      Regulator over temp. - * FORCE_DISABLE  Regulator shut down by software. + * FORCE_DISABLE  Regulator forcibly shut down by software.   * VOLTAGE_CHANGE Regulator voltage changed. + * DISABLE        Regulator was disabled.   *   * NOTE: These events can be OR'ed together when passed into handler.   */ @@ -102,6 +103,7 @@  #define REGULATOR_EVENT_OVER_TEMP		0x10  #define REGULATOR_EVENT_FORCE_DISABLE		0x20  #define REGULATOR_EVENT_VOLTAGE_CHANGE		0x40 +#define REGULATOR_EVENT_DISABLE 		0x80  struct regulator; @@ -181,9 +183,13 @@ static inline struct regulator *__must_check regulator_get(struct device *dev,  {  	/* Nothing except the stubbed out regulator API should be  	 * looking at the value except to check if it is an error -	 * value so the actual return value doesn't matter. +	 * value. Drivers are free to handle NULL specifically by +	 * skipping all regulator API calls, but they don't have to. +	 * Drivers which don't, should make sure they properly handle +	 * corner cases of the API, such as regulator_get_voltage() +	 * returning 0.  	 */ -	return (struct regulator *)id; +	return NULL;  }  static inline void regulator_put(struct regulator *regulator)  { diff --git a/include/linux/regulator/driver.h b/include/linux/regulator/driver.h index 31f2055eae2..592cd7c642c 100644 --- a/include/linux/regulator/driver.h +++ b/include/linux/regulator/driver.h @@ -58,6 +58,9 @@ enum regulator_status {   * @get_optimum_mode: Get the most efficient operating mode for the regulator   *                    when running with the specified parameters.   * + * @enable_time: Time taken for the regulator voltage output voltage to + *               stabalise after being enabled, in microseconds. + *   * @set_suspend_voltage: Set the voltage for the regulator when the system   *                       is suspended.   * @set_suspend_enable: Mark the regulator as enabled when the system is @@ -93,6 +96,9 @@ struct regulator_ops {  	int (*set_mode) (struct regulator_dev *, unsigned int mode);  	unsigned int (*get_mode) (struct regulator_dev *); +	/* Time taken to enable the regulator */ +	int (*enable_time) (struct regulator_dev *); +  	/* report regulator status ... most other accessors report  	 * control inputs, this reports results of combining inputs  	 * from Linux (and other sources) with the actual load. diff --git a/include/linux/regulator/fixed.h b/include/linux/regulator/fixed.h index e94a4a1c7c8..ffd7d508e72 100644 --- a/include/linux/regulator/fixed.h +++ b/include/linux/regulator/fixed.h @@ -25,6 +25,7 @@ struct regulator_init_data;   * @microvolts:		Output voltage of regulator   * @gpio:		GPIO to use for enable control   * 			set to -EINVAL if not used + * @startup_delay:	Start-up time in microseconds   * @enable_high:	Polarity of enable GPIO   *			1 = Active high, 0 = Active low   * @enabled_at_boot:	Whether regulator has been enabled at @@ -41,6 +42,7 @@ struct fixed_voltage_config {  	const char *supply_name;  	int microvolts;  	int gpio; +	unsigned startup_delay;  	unsigned enable_high:1;  	unsigned enabled_at_boot:1;  	struct regulator_init_data *init_data; diff --git a/include/linux/regulator/machine.h b/include/linux/regulator/machine.h index 234a8476cba..e2980287245 100644 --- a/include/linux/regulator/machine.h +++ b/include/linux/regulator/machine.h @@ -157,7 +157,11 @@ struct regulator_consumer_supply {   *   * Initialisation constraints, our supply and consumers supplies.   * - * @supply_regulator_dev: Parent regulator (if any). + * @supply_regulator: Parent regulator.  Specified using the regulator name + *                    as it appears in the name field in sysfs, which can + *                    be explicitly set using the constraints field 'name'. + * @supply_regulator_dev: Parent regulator (if any) - DEPRECATED in favour + *                        of supply_regulator.   *   * @constraints: Constraints.  These must be specified for the regulator to   *               be usable. @@ -168,7 +172,8 @@ struct regulator_consumer_supply {   * @driver_data: Data passed to regulator_init.   */  struct regulator_init_data { -	struct device *supply_regulator_dev; /* or NULL for LINE */ +	const char *supply_regulator;        /* or NULL for system supply */ +	struct device *supply_regulator_dev; /* or NULL for system supply */  	struct regulation_constraints constraints; diff --git a/include/linux/regulator/max8649.h b/include/linux/regulator/max8649.h new file mode 100644 index 00000000000..417d14ecd5c --- /dev/null +++ b/include/linux/regulator/max8649.h @@ -0,0 +1,44 @@ +/* + * Interface of Maxim max8649 + * + * Copyright (C) 2009-2010 Marvell International Ltd. + *      Haojian Zhuang <haojian.zhuang@marvell.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_REGULATOR_MAX8649_H +#define	__LINUX_REGULATOR_MAX8649_H + +#include <linux/regulator/machine.h> + +enum { +	MAX8649_EXTCLK_26MHZ = 0, +	MAX8649_EXTCLK_13MHZ, +	MAX8649_EXTCLK_19MHZ,	/* 19.2MHz */ +}; + +enum { +	MAX8649_RAMP_32MV = 0, +	MAX8649_RAMP_16MV, +	MAX8649_RAMP_8MV, +	MAX8649_RAMP_4MV, +	MAX8649_RAMP_2MV, +	MAX8649_RAMP_1MV, +	MAX8649_RAMP_0_5MV, +	MAX8649_RAMP_0_25MV, +}; + +struct max8649_platform_data { +	struct regulator_init_data *regulator; + +	unsigned	mode:2;		/* bit[1:0] = VID1,VID0 */ +	unsigned	extclk_freq:2; +	unsigned	extclk:1; +	unsigned	ramp_timing:3; +	unsigned	ramp_down:1; +}; + +#endif	/* __LINUX_REGULATOR_MAX8649_H */ diff --git a/include/linux/reiserfs_acl.h b/include/linux/reiserfs_acl.h index b4448853900..3fd8c4506bb 100644 --- a/include/linux/reiserfs_acl.h +++ b/include/linux/reiserfs_acl.h @@ -53,8 +53,8 @@ int reiserfs_inherit_default_acl(struct reiserfs_transaction_handle *th,  				 struct inode *dir, struct dentry *dentry,  				 struct inode *inode);  int reiserfs_cache_default_acl(struct inode *dir); -extern struct xattr_handler reiserfs_posix_acl_default_handler; -extern struct xattr_handler reiserfs_posix_acl_access_handler; +extern const struct xattr_handler reiserfs_posix_acl_default_handler; +extern const struct xattr_handler reiserfs_posix_acl_access_handler;  #else diff --git a/include/linux/reiserfs_fs.h b/include/linux/reiserfs_fs.h index 1ba3cf6edfb..3b603f47418 100644 --- a/include/linux/reiserfs_fs.h +++ b/include/linux/reiserfs_fs.h @@ -2034,7 +2034,7 @@ void reiserfs_read_locked_inode(struct inode *inode,  int reiserfs_find_actor(struct inode *inode, void *p);  int reiserfs_init_locked_inode(struct inode *inode, void *p);  void reiserfs_delete_inode(struct inode *inode); -int reiserfs_write_inode(struct inode *inode, int); +int reiserfs_write_inode(struct inode *inode, struct writeback_control *wbc);  int reiserfs_get_block(struct inode *inode, sector_t block,  		       struct buffer_head *bh_result, int create);  struct dentry *reiserfs_fh_to_dentry(struct super_block *sb, struct fid *fid, diff --git a/include/linux/reiserfs_xattr.h b/include/linux/reiserfs_xattr.h index 99928dce37e..b2cf2089769 100644 --- a/include/linux/reiserfs_xattr.h +++ b/include/linux/reiserfs_xattr.h @@ -58,9 +58,9 @@ int reiserfs_xattr_set_handle(struct reiserfs_transaction_handle *,  			      struct inode *, const char *, const void *,  			      size_t, int); -extern struct xattr_handler reiserfs_xattr_user_handler; -extern struct xattr_handler reiserfs_xattr_trusted_handler; -extern struct xattr_handler reiserfs_xattr_security_handler; +extern const struct xattr_handler reiserfs_xattr_user_handler; +extern const struct xattr_handler reiserfs_xattr_trusted_handler; +extern const struct xattr_handler reiserfs_xattr_security_handler;  #ifdef CONFIG_REISERFS_FS_SECURITY  int reiserfs_security_init(struct inode *dir, struct inode *inode,  			   struct reiserfs_security_handle *sec); @@ -70,6 +70,11 @@ int reiserfs_security_write(struct reiserfs_transaction_handle *th,  void reiserfs_security_free(struct reiserfs_security_handle *sec);  #endif +static inline int reiserfs_xattrs_initialized(struct super_block *sb) +{ +	return REISERFS_SB(sb)->priv_root != NULL; +} +  #define xattr_size(size) ((size) + sizeof(struct reiserfs_xattr_header))  static inline loff_t reiserfs_xattr_nblocks(struct inode *inode, loff_t size)  { diff --git a/include/linux/resume-trace.h b/include/linux/resume-trace.h index c9ba2fdf807..bc8c3881c72 100644 --- a/include/linux/resume-trace.h +++ b/include/linux/resume-trace.h @@ -6,6 +6,11 @@  extern int pm_trace_enabled; +static inline int pm_trace_is_enabled(void) +{ +       return pm_trace_enabled; +} +  struct device;  extern void set_trace_device(struct device *);  extern void generate_resume_trace(const void *tracedata, unsigned int user); @@ -17,6 +22,8 @@ extern void generate_resume_trace(const void *tracedata, unsigned int user);  #else +static inline int pm_trace_is_enabled(void) { return 0; } +  #define TRACE_DEVICE(dev) do { } while (0)  #define TRACE_RESUME(dev) do { } while (0) diff --git a/include/linux/rfkill.h b/include/linux/rfkill.h index 97059d08a62..4f82326eb29 100644 --- a/include/linux/rfkill.h +++ b/include/linux/rfkill.h @@ -29,7 +29,7 @@  /**   * enum rfkill_type - type of rfkill switch.   * - * @RFKILL_TYPE_ALL: toggles all switches (userspace only) + * @RFKILL_TYPE_ALL: toggles all switches (requests only - not a switch type)   * @RFKILL_TYPE_WLAN: switch is on a 802.11 wireless network device.   * @RFKILL_TYPE_BLUETOOTH: switch is on a bluetooth device.   * @RFKILL_TYPE_UWB: switch is on a ultra wideband device. diff --git a/include/linux/ring_buffer.h b/include/linux/ring_buffer.h index 5fcc31ed577..25b4f686d91 100644 --- a/include/linux/ring_buffer.h +++ b/include/linux/ring_buffer.h @@ -120,12 +120,16 @@ int ring_buffer_write(struct ring_buffer *buffer,  		      unsigned long length, void *data);  struct ring_buffer_event * -ring_buffer_peek(struct ring_buffer *buffer, int cpu, u64 *ts); +ring_buffer_peek(struct ring_buffer *buffer, int cpu, u64 *ts, +		 unsigned long *lost_events);  struct ring_buffer_event * -ring_buffer_consume(struct ring_buffer *buffer, int cpu, u64 *ts); +ring_buffer_consume(struct ring_buffer *buffer, int cpu, u64 *ts, +		    unsigned long *lost_events);  struct ring_buffer_iter * -ring_buffer_read_start(struct ring_buffer *buffer, int cpu); +ring_buffer_read_prepare(struct ring_buffer *buffer, int cpu); +void ring_buffer_read_prepare_sync(void); +void ring_buffer_read_start(struct ring_buffer_iter *iter);  void ring_buffer_read_finish(struct ring_buffer_iter *iter);  struct ring_buffer_event * diff --git a/include/linux/rio.h b/include/linux/rio.h index dc0c75556c6..bd6eb0ed34a 100644 --- a/include/linux/rio.h +++ b/include/linux/rio.h @@ -64,10 +64,13 @@  #define RIO_INB_MBOX_RESOURCE	1  #define RIO_OUTB_MBOX_RESOURCE	2 +#define RIO_PW_MSG_SIZE		64 +  extern struct bus_type rio_bus_type;  extern struct list_head rio_devices;	/* list of all devices */  struct rio_mport; +union rio_pw_msg;  /**   * struct rio_dev - RIO device info @@ -85,11 +88,15 @@ struct rio_mport;   * @swpinfo: Switch port info   * @src_ops: Source operation capabilities   * @dst_ops: Destination operation capabilities + * @comp_tag: RIO component tag + * @phys_efptr: RIO device extended features pointer + * @em_efptr: RIO Error Management features pointer   * @dma_mask: Mask of bits of RIO address this device implements   * @rswitch: Pointer to &struct rio_switch if valid for this device   * @driver: Driver claiming this device   * @dev: Device model device   * @riores: RIO resources this device owns + * @pwcback: port-write callback function for this device   * @destid: Network destination ID   */  struct rio_dev { @@ -107,11 +114,15 @@ struct rio_dev {  	u32 swpinfo;		/* Only used for switches */  	u32 src_ops;  	u32 dst_ops; +	u32 comp_tag; +	u32 phys_efptr; +	u32 em_efptr;  	u64 dma_mask;  	struct rio_switch *rswitch;	/* RIO switch info */  	struct rio_driver *driver;	/* RIO driver claiming this device */  	struct device dev;	/* LDM device structure */  	struct resource riores[RIO_MAX_DEV_RESOURCES]; +	int (*pwcback) (struct rio_dev *rdev, union rio_pw_msg *msg, int step);  	u16 destid;  }; @@ -211,8 +222,14 @@ struct rio_net {   * @hopcount: Hopcount to this switch   * @destid: Associated destid in the path   * @route_table: Copy of switch routing table + * @port_ok: Status of each port (one bit per port) - OK=1 or UNINIT=0   * @add_entry: Callback for switch-specific route add function   * @get_entry: Callback for switch-specific route get function + * @clr_table: Callback for switch-specific clear route table function + * @set_domain: Callback for switch-specific domain setting function + * @get_domain: Callback for switch-specific domain get function + * @em_init: Callback for switch-specific error management initialization function + * @em_handle: Callback for switch-specific error management handler function   */  struct rio_switch {  	struct list_head node; @@ -220,10 +237,19 @@ struct rio_switch {  	u16 hopcount;  	u16 destid;  	u8 *route_table; +	u32 port_ok;  	int (*add_entry) (struct rio_mport * mport, u16 destid, u8 hopcount,  			  u16 table, u16 route_destid, u8 route_port);  	int (*get_entry) (struct rio_mport * mport, u16 destid, u8 hopcount,  			  u16 table, u16 route_destid, u8 * route_port); +	int (*clr_table) (struct rio_mport *mport, u16 destid, u8 hopcount, +			  u16 table); +	int (*set_domain) (struct rio_mport *mport, u16 destid, u8 hopcount, +			   u8 sw_domain); +	int (*get_domain) (struct rio_mport *mport, u16 destid, u8 hopcount, +			   u8 *sw_domain); +	int (*em_init) (struct rio_dev *dev); +	int (*em_handle) (struct rio_dev *dev, u8 swport);  };  /* Low-level architecture-dependent routines */ @@ -235,6 +261,7 @@ struct rio_switch {   * @cread: Callback to perform network read of config space.   * @cwrite: Callback to perform network write of config space.   * @dsend: Callback to send a doorbell message. + * @pwenable: Callback to enable/disable port-write message handling.   */  struct rio_ops {  	int (*lcread) (struct rio_mport *mport, int index, u32 offset, int len, @@ -246,6 +273,7 @@ struct rio_ops {  	int (*cwrite) (struct rio_mport *mport, int index, u16 destid,  			u8 hopcount, u32 offset, int len, u32 data);  	int (*dsend) (struct rio_mport *mport, int index, u16 destid, u16 data); +	int (*pwenable) (struct rio_mport *mport, int enable);  };  #define RIO_RESOURCE_MEM	0x00000100 @@ -302,21 +330,28 @@ struct rio_device_id {  };  /** - * struct rio_route_ops - Per-switch route operations + * struct rio_switch_ops - Per-switch operations   * @vid: RIO vendor ID   * @did: RIO device ID - * @add_hook: Callback that adds a route entry - * @get_hook: Callback that gets a route entry + * @init_hook: Callback that performs switch device initialization   * - * Defines the operations that are necessary to manipulate the route - * tables for a particular RIO switch device. + * Defines the operations that are necessary to initialize/control + * a particular RIO switch device.   */ -struct rio_route_ops { +struct rio_switch_ops {  	u16 vid, did; -	int (*add_hook) (struct rio_mport * mport, u16 destid, u8 hopcount, -			 u16 table, u16 route_destid, u8 route_port); -	int (*get_hook) (struct rio_mport * mport, u16 destid, u8 hopcount, -			 u16 table, u16 route_destid, u8 * route_port); +	int (*init_hook) (struct rio_dev *rdev, int do_enum); +}; + +union rio_pw_msg { +	struct { +		u32 comptag;	/* Component Tag CSR */ +		u32 errdetect;	/* Port N Error Detect CSR */ +		u32 is_port;	/* Implementation specific + PortID */ +		u32 ltlerrdet;	/* LTL Error Detect CSR */ +		u32 padding[12]; +	} em; +	u32 raw[RIO_PW_MSG_SIZE/sizeof(u32)];  };  /* Architecture and hardware-specific functions */ diff --git a/include/linux/rio_drv.h b/include/linux/rio_drv.h index c93a58a4003..edc55da717b 100644 --- a/include/linux/rio_drv.h +++ b/include/linux/rio_drv.h @@ -413,6 +413,12 @@ void rio_release_regions(struct rio_dev *);  int rio_request_region(struct rio_dev *, int, char *);  void rio_release_region(struct rio_dev *, int); +/* Port-Write management */ +extern int rio_request_inb_pwrite(struct rio_dev *, +			int (*)(struct rio_dev *, union rio_pw_msg*, int)); +extern int rio_release_inb_pwrite(struct rio_dev *); +extern int rio_inb_pwrite_handler(union rio_pw_msg *pw_msg); +  /* LDM support */  int rio_register_driver(struct rio_driver *);  void rio_unregister_driver(struct rio_driver *); diff --git a/include/linux/rio_ids.h b/include/linux/rio_ids.h index 919d4e07d54..db50e1c288b 100644 --- a/include/linux/rio_ids.h +++ b/include/linux/rio_ids.h @@ -20,5 +20,19 @@  #define RIO_VID_TUNDRA			0x000d  #define RIO_DID_TSI500			0x0500 +#define RIO_DID_TSI568			0x0568 +#define RIO_DID_TSI572			0x0572 +#define RIO_DID_TSI574			0x0574 +#define RIO_DID_TSI576			0x0578 /* Same ID as Tsi578 */ +#define RIO_DID_TSI577			0x0577 +#define RIO_DID_TSI578			0x0578 + +#define RIO_VID_IDT			0x0038 +#define RIO_DID_IDT70K200		0x0310 +#define RIO_DID_IDTCPS8			0x035c +#define RIO_DID_IDTCPS12		0x035d +#define RIO_DID_IDTCPS16		0x035b +#define RIO_DID_IDTCPS6Q		0x035f +#define RIO_DID_IDTCPS10Q		0x035e  #endif				/* LINUX_RIO_IDS_H */ diff --git a/include/linux/rio_regs.h b/include/linux/rio_regs.h index 326540f9b54..aedee0489fb 100644 --- a/include/linux/rio_regs.h +++ b/include/linux/rio_regs.h @@ -39,6 +39,8 @@  #define  RIO_PEF_INB_MBOX2		0x00200000	/* [II] Mailbox 2 */  #define  RIO_PEF_INB_MBOX3		0x00100000	/* [II] Mailbox 3 */  #define  RIO_PEF_INB_DOORBELL		0x00080000	/* [II] Doorbells */ +#define  RIO_PEF_EXT_RT			0x00000200	/* [III, 1.3] Extended route table support */ +#define  RIO_PEF_STD_RT			0x00000100	/* [III, 1.3] Standard route table support */  #define  RIO_PEF_CTLS			0x00000010	/* [III] CTLS */  #define  RIO_PEF_EXT_FEATURES		0x00000008	/* [I] EFT_PTR valid */  #define  RIO_PEF_ADDR_66		0x00000004	/* [I] 66 bits */ @@ -91,7 +93,10 @@  #define  RIO_OPS_ATOMIC_CLR		0x00000010	/* [I] Atomic clr op */  #define  RIO_OPS_PORT_WRITE		0x00000004	/* [I] Port-write op */ -					/* 0x20-0x3c *//* Reserved */ +					/* 0x20-0x30 *//* Reserved */ + +#define	RIO_SWITCH_RT_LIMIT	0x34	/* [III, 1.3] Switch Route Table Destination ID Limit CAR */ +#define	 RIO_RT_MAX_DESTID		0x0000ffff  #define RIO_MBOX_CSR		0x40	/* [II] Mailbox CSR */  #define  RIO_MBOX0_AVAIL		0x80000000	/* [II] Mbox 0 avail */ @@ -153,7 +158,11 @@  #define RIO_HOST_DID_LOCK_CSR	0x68	/* [III] Host Base Device ID Lock CSR */  #define RIO_COMPONENT_TAG_CSR	0x6c	/* [III] Component Tag CSR */ -					/* 0x70-0xf8 *//* Reserved */ +#define RIO_STD_RTE_CONF_DESTID_SEL_CSR	0x70 +#define RIO_STD_RTE_CONF_PORT_SEL_CSR	0x74 +#define RIO_STD_RTE_DEFAULT_PORT	0x78 + +					/* 0x7c-0xf8 *//* Reserved */  					/* 0x100-0xfff8 *//* [I] Extended Features Space */  					/* 0x10000-0xfffff8 *//* [I] Implementation-defined Space */ @@ -183,9 +192,14 @@  #define RIO_EFB_PAR_EP_ID	0x0001	/* [IV] LP/LVDS EP Devices */  #define RIO_EFB_PAR_EP_REC_ID	0x0002	/* [IV] LP/LVDS EP Recovery Devices */  #define RIO_EFB_PAR_EP_FREE_ID	0x0003	/* [IV] LP/LVDS EP Free Devices */ +#define RIO_EFB_SER_EP_ID_V13P	0x0001	/* [VI] LP/Serial EP Devices, RapidIO Spec ver 1.3 and above */ +#define RIO_EFB_SER_EP_REC_ID_V13P	0x0002	/* [VI] LP/Serial EP Recovery Devices, RapidIO Spec ver 1.3 and above */ +#define RIO_EFB_SER_EP_FREE_ID_V13P	0x0003	/* [VI] LP/Serial EP Free Devices, RapidIO Spec ver 1.3 and above */  #define RIO_EFB_SER_EP_ID	0x0004	/* [VI] LP/Serial EP Devices */  #define RIO_EFB_SER_EP_REC_ID	0x0005	/* [VI] LP/Serial EP Recovery Devices */  #define RIO_EFB_SER_EP_FREE_ID	0x0006	/* [VI] LP/Serial EP Free Devices */ +#define RIO_EFB_SER_EP_FREC_ID	0x0009  /* [VI] LP/Serial EP Free Recovery Devices */ +#define RIO_EFB_ERR_MGMNT	0x0007  /* [VIII] Error Management Extensions */  /*   * Physical 8/16 LP-LVDS @@ -201,15 +215,71 @@  #define RIO_PORT_MNT_HEADER		0x0000  #define RIO_PORT_REQ_CTL_CSR		0x0020  #define RIO_PORT_RSP_CTL_CSR		0x0024	/* 0x0001/0x0002 */ +#define RIO_PORT_LINKTO_CTL_CSR		0x0020	/* Serial */ +#define RIO_PORT_RSPTO_CTL_CSR		0x0024	/* Serial */  #define RIO_PORT_GEN_CTL_CSR		0x003c  #define  RIO_PORT_GEN_HOST		0x80000000  #define  RIO_PORT_GEN_MASTER		0x40000000  #define  RIO_PORT_GEN_DISCOVERED	0x20000000  #define RIO_PORT_N_MNT_REQ_CSR(x)	(0x0040 + x*0x20)	/* 0x0002 */  #define RIO_PORT_N_MNT_RSP_CSR(x)	(0x0044 + x*0x20)	/* 0x0002 */ +#define  RIO_PORT_N_MNT_RSP_RVAL	0x80000000 /* Response Valid */ +#define  RIO_PORT_N_MNT_RSP_ASTAT	0x000003e0 /* ackID Status */ +#define  RIO_PORT_N_MNT_RSP_LSTAT	0x0000001f /* Link Status */  #define RIO_PORT_N_ACK_STS_CSR(x)	(0x0048 + x*0x20)	/* 0x0002 */ -#define RIO_PORT_N_ERR_STS_CSR(x)	(0x58 + x*0x20) -#define PORT_N_ERR_STS_PORT_OK	0x00000002 -#define RIO_PORT_N_CTL_CSR(x)		(0x5c + x*0x20) +#define  RIO_PORT_N_ACK_CLEAR		0x80000000 +#define  RIO_PORT_N_ACK_INBOUND		0x1f000000 +#define  RIO_PORT_N_ACK_OUTSTAND	0x00001f00 +#define  RIO_PORT_N_ACK_OUTBOUND	0x0000001f +#define RIO_PORT_N_ERR_STS_CSR(x)	(0x0058 + x*0x20) +#define  RIO_PORT_N_ERR_STS_PW_OUT_ES	0x00010000 /* Output Error-stopped */ +#define  RIO_PORT_N_ERR_STS_PW_INP_ES	0x00000100 /* Input Error-stopped */ +#define  RIO_PORT_N_ERR_STS_PW_PEND	0x00000010 /* Port-Write Pending */ +#define  RIO_PORT_N_ERR_STS_PORT_ERR	0x00000004 +#define  RIO_PORT_N_ERR_STS_PORT_OK	0x00000002 +#define  RIO_PORT_N_ERR_STS_PORT_UNINIT	0x00000001 +#define  RIO_PORT_N_ERR_STS_CLR_MASK	0x07120204 +#define RIO_PORT_N_CTL_CSR(x)		(0x005c + x*0x20) +#define  RIO_PORT_N_CTL_PWIDTH		0xc0000000 +#define  RIO_PORT_N_CTL_PWIDTH_1	0x00000000 +#define  RIO_PORT_N_CTL_PWIDTH_4	0x40000000 +#define  RIO_PORT_N_CTL_P_TYP_SER	0x00000001 +#define  RIO_PORT_N_CTL_LOCKOUT		0x00000002 +#define  RIO_PORT_N_CTL_EN_RX_SER	0x00200000 +#define  RIO_PORT_N_CTL_EN_TX_SER	0x00400000 +#define  RIO_PORT_N_CTL_EN_RX_PAR	0x08000000 +#define  RIO_PORT_N_CTL_EN_TX_PAR	0x40000000 + +/* + * Error Management Extensions (RapidIO 1.3+, Part 8) + * + * Extended Features Block ID=0x0007 + */ + +/* General EM Registers (Common for all Ports) */ + +#define RIO_EM_EFB_HEADER	0x000	/* Error Management Extensions Block Header */ +#define RIO_EM_LTL_ERR_DETECT	0x008	/* Logical/Transport Layer Error Detect CSR */ +#define RIO_EM_LTL_ERR_EN	0x00c	/* Logical/Transport Layer Error Enable CSR */ +#define RIO_EM_LTL_HIADDR_CAP	0x010	/* Logical/Transport Layer High Address Capture CSR */ +#define RIO_EM_LTL_ADDR_CAP	0x014	/* Logical/Transport Layer Address Capture CSR */ +#define RIO_EM_LTL_DEVID_CAP	0x018	/* Logical/Transport Layer Device ID Capture CSR */ +#define RIO_EM_LTL_CTRL_CAP	0x01c	/* Logical/Transport Layer Control Capture CSR */ +#define RIO_EM_PW_TGT_DEVID	0x028	/* Port-write Target deviceID CSR */ +#define RIO_EM_PKT_TTL		0x02c	/* Packet Time-to-live CSR */ + +/* Per-Port EM Registers */ + +#define RIO_EM_PN_ERR_DETECT(x)	(0x040 + x*0x40) /* Port N Error Detect CSR */ +#define  REM_PED_IMPL_SPEC		0x80000000 +#define  REM_PED_LINK_TO		0x00000001 +#define RIO_EM_PN_ERRRATE_EN(x) (0x044 + x*0x40) /* Port N Error Rate Enable CSR */ +#define RIO_EM_PN_ATTRIB_CAP(x)	(0x048 + x*0x40) /* Port N Attributes Capture CSR */ +#define RIO_EM_PN_PKT_CAP_0(x)	(0x04c + x*0x40) /* Port N Packet/Control Symbol Capture 0 CSR */ +#define RIO_EM_PN_PKT_CAP_1(x)	(0x050 + x*0x40) /* Port N Packet Capture 1 CSR */ +#define RIO_EM_PN_PKT_CAP_2(x)	(0x054 + x*0x40) /* Port N Packet Capture 2 CSR */ +#define RIO_EM_PN_PKT_CAP_3(x)	(0x058 + x*0x40) /* Port N Packet Capture 3 CSR */ +#define RIO_EM_PN_ERRRATE(x)	(0x068 + x*0x40) /* Port N Error Rate CSR */ +#define RIO_EM_PN_ERRRATE_TR(x) (0x06c + x*0x40) /* Port N Error Rate Threshold CSR */  #endif				/* LINUX_RIO_REGS_H */ diff --git a/include/linux/rmap.h b/include/linux/rmap.h index b019ae64e2a..77216742c17 100644 --- a/include/linux/rmap.h +++ b/include/linux/rmap.h @@ -26,8 +26,17 @@   */  struct anon_vma {  	spinlock_t lock;	/* Serialize access to vma list */ -#ifdef CONFIG_KSM -	atomic_t ksm_refcount; +#if defined(CONFIG_KSM) || defined(CONFIG_MIGRATION) + +	/* +	 * The external_refcount is taken by either KSM or page migration +	 * to take a reference to an anon_vma when there is no +	 * guarantee that the vma of page tables will exist for +	 * the duration of the operation. A caller that takes +	 * the reference is responsible for clearing up the +	 * anon_vma if they are the last user on release +	 */ +	atomic_t external_refcount;  #endif  	/*  	 * NOTE: the LSB of the head.next is set by @@ -37,26 +46,46 @@ struct anon_vma {  	 * is serialized by a system wide lock only visible to  	 * mm_take_all_locks() (mm_all_locks_mutex).  	 */ -	struct list_head head;	/* List of private "related" vmas */ +	struct list_head head;	/* Chain of private "related" vmas */ +}; + +/* + * The copy-on-write semantics of fork mean that an anon_vma + * can become associated with multiple processes. Furthermore, + * each child process will have its own anon_vma, where new + * pages for that process are instantiated. + * + * This structure allows us to find the anon_vmas associated + * with a VMA, or the VMAs associated with an anon_vma. + * The "same_vma" list contains the anon_vma_chains linking + * all the anon_vmas associated with this VMA. + * The "same_anon_vma" list contains the anon_vma_chains + * which link all the VMAs associated with this anon_vma. + */ +struct anon_vma_chain { +	struct vm_area_struct *vma; +	struct anon_vma *anon_vma; +	struct list_head same_vma;   /* locked by mmap_sem & page_table_lock */ +	struct list_head same_anon_vma;	/* locked by anon_vma->lock */  };  #ifdef CONFIG_MMU -#ifdef CONFIG_KSM -static inline void ksm_refcount_init(struct anon_vma *anon_vma) +#if defined(CONFIG_KSM) || defined(CONFIG_MIGRATION) +static inline void anonvma_external_refcount_init(struct anon_vma *anon_vma)  { -	atomic_set(&anon_vma->ksm_refcount, 0); +	atomic_set(&anon_vma->external_refcount, 0);  } -static inline int ksm_refcount(struct anon_vma *anon_vma) +static inline int anonvma_external_refcount(struct anon_vma *anon_vma)  { -	return atomic_read(&anon_vma->ksm_refcount); +	return atomic_read(&anon_vma->external_refcount);  }  #else -static inline void ksm_refcount_init(struct anon_vma *anon_vma) +static inline void anonvma_external_refcount_init(struct anon_vma *anon_vma)  {  } -static inline int ksm_refcount(struct anon_vma *anon_vma) +static inline int anonvma_external_refcount(struct anon_vma *anon_vma)  {  	return 0;  } @@ -89,15 +118,23 @@ static inline void anon_vma_unlock(struct vm_area_struct *vma)   */  void anon_vma_init(void);	/* create anon_vma_cachep */  int  anon_vma_prepare(struct vm_area_struct *); -void __anon_vma_merge(struct vm_area_struct *, struct vm_area_struct *); -void anon_vma_unlink(struct vm_area_struct *); -void anon_vma_link(struct vm_area_struct *); +void unlink_anon_vmas(struct vm_area_struct *); +int anon_vma_clone(struct vm_area_struct *, struct vm_area_struct *); +int anon_vma_fork(struct vm_area_struct *, struct vm_area_struct *);  void __anon_vma_link(struct vm_area_struct *);  void anon_vma_free(struct anon_vma *); +static inline void anon_vma_merge(struct vm_area_struct *vma, +				  struct vm_area_struct *next) +{ +	VM_BUG_ON(vma->anon_vma != next->anon_vma); +	unlink_anon_vmas(next); +} +  /*   * rmap interfaces called when adding or removing pte of page   */ +void page_move_anon_rmap(struct page *, struct vm_area_struct *, unsigned long);  void page_add_anon_rmap(struct page *, struct vm_area_struct *, unsigned long);  void page_add_new_anon_rmap(struct page *, struct vm_area_struct *, unsigned long);  void page_add_file_rmap(struct page *); @@ -181,7 +218,7 @@ static inline int page_referenced(struct page *page, int is_locked,  				  unsigned long *vm_flags)  {  	*vm_flags = 0; -	return TestClearPageReferenced(page); +	return 0;  }  #define try_to_unmap(page, refs) SWAP_FAIL diff --git a/include/linux/rtc-v3020.h b/include/linux/rtc-v3020.h index 8ba646e610d..e55d82cebf8 100644 --- a/include/linux/rtc-v3020.h +++ b/include/linux/rtc-v3020.h @@ -15,7 +15,7 @@  struct v3020_platform_data {  	int leftshift; /* (1<<(leftshift)) & readl() */ -	int use_gpio:1; +	unsigned int use_gpio:1;  	unsigned int gpio_cs;  	unsigned int gpio_wr;  	unsigned int gpio_rd; diff --git a/include/linux/rtc.h b/include/linux/rtc.h index 60f88a7fb13..14dbc83ded2 100644 --- a/include/linux/rtc.h +++ b/include/linux/rtc.h @@ -238,6 +238,12 @@ static inline bool is_leap_year(unsigned int year)  	return (!(year % 4) && (year % 100)) || !(year % 400);  } +#ifdef CONFIG_RTC_HCTOSYS +extern int rtc_hctosys_ret; +#else +#define rtc_hctosys_ret -ENODEV +#endif +  #endif /* __KERNEL__ */  #endif /* _LINUX_RTC_H_ */ diff --git a/include/linux/rtmutex.h b/include/linux/rtmutex.h index 281d8fd775e..8d522ffeda3 100644 --- a/include/linux/rtmutex.h +++ b/include/linux/rtmutex.h @@ -16,6 +16,8 @@  #include <linux/plist.h>  #include <linux/spinlock_types.h> +extern int max_lock_depth; /* for sysctl */ +  /**   * The rt_mutex structure   * diff --git a/include/linux/rtnetlink.h b/include/linux/rtnetlink.h index 05330fc5b43..fbc8cb0d48c 100644 --- a/include/linux/rtnetlink.h +++ b/include/linux/rtnetlink.h @@ -7,6 +7,13 @@  #include <linux/if_addr.h>  #include <linux/neighbour.h> +/* rtnetlink families. Values up to 127 are reserved for real address + * families, values above 128 may be used arbitrarily. + */ +#define RTNL_FAMILY_IPMR		128 +#define RTNL_FAMILY_IP6MR		129 +#define RTNL_FAMILY_MAX			129 +  /****   *		Routing/neighbour discovery messages.   ****/ @@ -362,6 +369,8 @@ enum {  #define RTAX_FEATURES RTAX_FEATURES  	RTAX_RTO_MIN,  #define RTAX_RTO_MIN RTAX_RTO_MIN +	RTAX_INITRWND, +#define RTAX_INITRWND RTAX_INITRWND  	__RTAX_MAX  }; @@ -735,6 +744,9 @@ extern void rtnl_lock(void);  extern void rtnl_unlock(void);  extern int rtnl_trylock(void);  extern int rtnl_is_locked(void); +#ifdef CONFIG_PROVE_LOCKING +extern int lockdep_rtnl_is_held(void); +#endif /* #ifdef CONFIG_PROVE_LOCKING */  extern void rtnetlink_init(void);  extern void __rtnl_unlock(void); diff --git a/include/linux/rwlock.h b/include/linux/rwlock.h index 71e0b00b6f2..bc2994ed66e 100644 --- a/include/linux/rwlock.h +++ b/include/linux/rwlock.h @@ -29,25 +29,25 @@ do {								\  #endif  #ifdef CONFIG_DEBUG_SPINLOCK - extern void do_raw_read_lock(rwlock_t *lock); + extern void do_raw_read_lock(rwlock_t *lock) __acquires(lock);  #define do_raw_read_lock_flags(lock, flags) do_raw_read_lock(lock)   extern int do_raw_read_trylock(rwlock_t *lock); - extern void do_raw_read_unlock(rwlock_t *lock); - extern void do_raw_write_lock(rwlock_t *lock); + extern void do_raw_read_unlock(rwlock_t *lock) __releases(lock); + extern void do_raw_write_lock(rwlock_t *lock) __acquires(lock);  #define do_raw_write_lock_flags(lock, flags) do_raw_write_lock(lock)   extern int do_raw_write_trylock(rwlock_t *lock); - extern void do_raw_write_unlock(rwlock_t *lock); + extern void do_raw_write_unlock(rwlock_t *lock) __releases(lock);  #else -# define do_raw_read_lock(rwlock)	arch_read_lock(&(rwlock)->raw_lock) +# define do_raw_read_lock(rwlock)	do {__acquire(lock); arch_read_lock(&(rwlock)->raw_lock); } while (0)  # define do_raw_read_lock_flags(lock, flags) \ -		arch_read_lock_flags(&(lock)->raw_lock, *(flags)) +		do {__acquire(lock); arch_read_lock_flags(&(lock)->raw_lock, *(flags)); } while (0)  # define do_raw_read_trylock(rwlock)	arch_read_trylock(&(rwlock)->raw_lock) -# define do_raw_read_unlock(rwlock)	arch_read_unlock(&(rwlock)->raw_lock) -# define do_raw_write_lock(rwlock)	arch_write_lock(&(rwlock)->raw_lock) +# define do_raw_read_unlock(rwlock)	do {arch_read_unlock(&(rwlock)->raw_lock); __release(lock); } while (0) +# define do_raw_write_lock(rwlock)	do {__acquire(lock); arch_write_lock(&(rwlock)->raw_lock); } while (0)  # define do_raw_write_lock_flags(lock, flags) \ -		arch_write_lock_flags(&(lock)->raw_lock, *(flags)) +		do {__acquire(lock); arch_write_lock_flags(&(lock)->raw_lock, *(flags)); } while (0)  # define do_raw_write_trylock(rwlock)	arch_write_trylock(&(rwlock)->raw_lock) -# define do_raw_write_unlock(rwlock)	arch_write_unlock(&(rwlock)->raw_lock) +# define do_raw_write_unlock(rwlock)	do {arch_write_unlock(&(rwlock)->raw_lock); __release(lock); } while (0)  #endif  #define read_can_lock(rwlock)		arch_read_can_lock(&(rwlock)->raw_lock) diff --git a/include/linux/sched.h b/include/linux/sched.h index abdfacc5865..f118809c953 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -97,9 +97,8 @@ struct sched_param {  struct exec_domain;  struct futex_pi_state;  struct robust_list_head; -struct bio; +struct bio_list;  struct fs_struct; -struct bts_context;  struct perf_event_context;  /* @@ -258,6 +257,10 @@ extern spinlock_t mmlist_lock;  struct task_struct; +#ifdef CONFIG_PROVE_RCU +extern int lockdep_tasklist_lock_is_held(void); +#endif /* #ifdef CONFIG_PROVE_RCU */ +  extern void sched_init(void);  extern void sched_init_smp(void);  extern asmlinkage void schedule_tail(struct task_struct *prev); @@ -265,17 +268,22 @@ extern void init_idle(struct task_struct *idle, int cpu);  extern void init_idle_bootup_task(struct task_struct *idle);  extern int runqueue_is_locked(int cpu); -extern void task_rq_unlock_wait(struct task_struct *p);  extern cpumask_var_t nohz_cpu_mask;  #if defined(CONFIG_SMP) && defined(CONFIG_NO_HZ)  extern int select_nohz_load_balancer(int cpu);  extern int get_nohz_load_balancer(void); +extern int nohz_ratelimit(int cpu);  #else  static inline int select_nohz_load_balancer(int cpu)  {  	return 0;  } + +static inline int nohz_ratelimit(int cpu) +{ +	return 0; +}  #endif  /* @@ -310,6 +318,7 @@ extern void sched_show_task(struct task_struct *p);  #ifdef CONFIG_DETECT_SOFTLOCKUP  extern void softlockup_tick(void);  extern void touch_softlockup_watchdog(void); +extern void touch_softlockup_watchdog_sync(void);  extern void touch_all_softlockup_watchdogs(void);  extern int proc_dosoftlockup_thresh(struct ctl_table *table, int write,  				    void __user *buffer, @@ -323,6 +332,9 @@ static inline void softlockup_tick(void)  static inline void touch_softlockup_watchdog(void)  {  } +static inline void touch_softlockup_watchdog_sync(void) +{ +}  static inline void touch_all_softlockup_watchdogs(void)  {  } @@ -371,7 +383,7 @@ struct user_namespace;   * 1-3 now and depends on arch. We use "5" as safe margin, here.   */  #define MAPCOUNT_ELF_CORE_MARGIN	(5) -#define DEFAULT_MAX_MAP_COUNT	(USHORT_MAX - MAPCOUNT_ELF_CORE_MARGIN) +#define DEFAULT_MAX_MAP_COUNT	(USHRT_MAX - MAPCOUNT_ELF_CORE_MARGIN)  extern int sysctl_max_map_count; @@ -392,60 +404,6 @@ extern void arch_unmap_area_topdown(struct mm_struct *, unsigned long);  static inline void arch_pick_mmap_layout(struct mm_struct *mm) {}  #endif -#if USE_SPLIT_PTLOCKS -/* - * The mm counters are not protected by its page_table_lock, - * so must be incremented atomically. - */ -#define set_mm_counter(mm, member, value) atomic_long_set(&(mm)->_##member, value) -#define get_mm_counter(mm, member) ((unsigned long)atomic_long_read(&(mm)->_##member)) -#define add_mm_counter(mm, member, value) atomic_long_add(value, &(mm)->_##member) -#define inc_mm_counter(mm, member) atomic_long_inc(&(mm)->_##member) -#define dec_mm_counter(mm, member) atomic_long_dec(&(mm)->_##member) - -#else  /* !USE_SPLIT_PTLOCKS */ -/* - * The mm counters are protected by its page_table_lock, - * so can be incremented directly. - */ -#define set_mm_counter(mm, member, value) (mm)->_##member = (value) -#define get_mm_counter(mm, member) ((mm)->_##member) -#define add_mm_counter(mm, member, value) (mm)->_##member += (value) -#define inc_mm_counter(mm, member) (mm)->_##member++ -#define dec_mm_counter(mm, member) (mm)->_##member-- - -#endif /* !USE_SPLIT_PTLOCKS */ - -#define get_mm_rss(mm)					\ -	(get_mm_counter(mm, file_rss) + get_mm_counter(mm, anon_rss)) -#define update_hiwater_rss(mm)	do {			\ -	unsigned long _rss = get_mm_rss(mm);		\ -	if ((mm)->hiwater_rss < _rss)			\ -		(mm)->hiwater_rss = _rss;		\ -} while (0) -#define update_hiwater_vm(mm)	do {			\ -	if ((mm)->hiwater_vm < (mm)->total_vm)		\ -		(mm)->hiwater_vm = (mm)->total_vm;	\ -} while (0) - -static inline unsigned long get_mm_hiwater_rss(struct mm_struct *mm) -{ -	return max(mm->hiwater_rss, get_mm_rss(mm)); -} - -static inline void setmax_mm_hiwater_rss(unsigned long *maxrss, -					 struct mm_struct *mm) -{ -	unsigned long hiwater_rss = get_mm_hiwater_rss(mm); - -	if (*maxrss < hiwater_rss) -		*maxrss = hiwater_rss; -} - -static inline unsigned long get_mm_hiwater_vm(struct mm_struct *mm) -{ -	return max(mm->hiwater_vm, mm->total_vm); -}  extern void set_dumpable(struct mm_struct *mm, int value);  extern int get_dumpable(struct mm_struct *mm); @@ -568,8 +526,9 @@ struct thread_group_cputimer {   * the locking of signal_struct.   */  struct signal_struct { -	atomic_t		count; +	atomic_t		sigcnt;  	atomic_t		live; +	int			nr_threads;  	wait_queue_head_t	wait_chldexit;	/* for wait4() */ @@ -736,14 +695,6 @@ struct user_struct {  	uid_t uid;  	struct user_namespace *user_ns; -#ifdef CONFIG_USER_SCHED -	struct task_group *tg; -#ifdef CONFIG_SYSFS -	struct kobject kobj; -	struct delayed_work work; -#endif -#endif -  #ifdef CONFIG_PERF_EVENTS  	atomic_long_t locked_vm;  #endif @@ -874,7 +825,10 @@ static inline int sd_balance_for_mc_power(void)  	if (sched_smt_power_savings)  		return SD_POWERSAVINGS_BALANCE; -	return SD_PREFER_SIBLING; +	if (!sched_mc_power_savings) +		return SD_PREFER_SIBLING; + +	return 0;  }  static inline int sd_balance_for_package_power(void) @@ -1005,6 +959,7 @@ struct sched_domain {  	char *name;  #endif +	unsigned int span_weight;  	/*  	 * Span of all CPUs in this domain.  	 * @@ -1077,11 +1032,17 @@ struct sched_domain;  #define WF_SYNC		0x01		/* waker goes to sleep after wakup */  #define WF_FORK		0x02		/* child wakeup after fork */ +#define ENQUEUE_WAKEUP		1 +#define ENQUEUE_WAKING		2 +#define ENQUEUE_HEAD		4 + +#define DEQUEUE_SLEEP		1 +  struct sched_class {  	const struct sched_class *next; -	void (*enqueue_task) (struct rq *rq, struct task_struct *p, int wakeup); -	void (*dequeue_task) (struct rq *rq, struct task_struct *p, int sleep); +	void (*enqueue_task) (struct rq *rq, struct task_struct *p, int flags); +	void (*dequeue_task) (struct rq *rq, struct task_struct *p, int flags);  	void (*yield_task) (struct rq *rq);  	void (*check_preempt_curr) (struct rq *rq, struct task_struct *p, int flags); @@ -1090,16 +1051,9 @@ struct sched_class {  	void (*put_prev_task) (struct rq *rq, struct task_struct *p);  #ifdef CONFIG_SMP -	int  (*select_task_rq)(struct task_struct *p, int sd_flag, int flags); - -	unsigned long (*load_balance) (struct rq *this_rq, int this_cpu, -			struct rq *busiest, unsigned long max_load_move, -			struct sched_domain *sd, enum cpu_idle_type idle, -			int *all_pinned, int *this_best_prio); +	int  (*select_task_rq)(struct rq *rq, struct task_struct *p, +			       int sd_flag, int flags); -	int (*move_one_task) (struct rq *this_rq, int this_cpu, -			      struct rq *busiest, struct sched_domain *sd, -			      enum cpu_idle_type idle);  	void (*pre_schedule) (struct rq *this_rq, struct task_struct *task);  	void (*post_schedule) (struct rq *this_rq);  	void (*task_waking) (struct rq *this_rq, struct task_struct *task); @@ -1135,36 +1089,8 @@ struct load_weight {  	unsigned long weight, inv_weight;  }; -/* - * CFS stats for a schedulable entity (task, task-group etc) - * - * Current field usage histogram: - * - *     4 se->block_start - *     4 se->run_node - *     4 se->sleep_start - *     6 se->load.weight - */ -struct sched_entity { -	struct load_weight	load;		/* for load-balancing */ -	struct rb_node		run_node; -	struct list_head	group_node; -	unsigned int		on_rq; - -	u64			exec_start; -	u64			sum_exec_runtime; -	u64			vruntime; -	u64			prev_sum_exec_runtime; - -	u64			last_wakeup; -	u64			avg_overlap; - -	u64			nr_migrations; - -	u64			start_runtime; -	u64			avg_wakeup; -  #ifdef CONFIG_SCHEDSTATS +struct sched_statistics {  	u64			wait_start;  	u64			wait_max;  	u64			wait_count; @@ -1196,6 +1122,24 @@ struct sched_entity {  	u64			nr_wakeups_affine_attempts;  	u64			nr_wakeups_passive;  	u64			nr_wakeups_idle; +}; +#endif + +struct sched_entity { +	struct load_weight	load;		/* for load-balancing */ +	struct rb_node		run_node; +	struct list_head	group_node; +	unsigned int		on_rq; + +	u64			exec_start; +	u64			sum_exec_runtime; +	u64			vruntime; +	u64			prev_sum_exec_runtime; + +	u64			nr_migrations; + +#ifdef CONFIG_SCHEDSTATS +	struct sched_statistics statistics;  #endif  #ifdef CONFIG_FAIR_GROUP_SCHED @@ -1282,7 +1226,9 @@ struct task_struct {  	struct plist_node pushable_tasks;  	struct mm_struct *mm, *active_mm; - +#if defined(SPLIT_RSS_COUNTING) +	struct task_rss_stat	rss_stat; +#endif  /* task state */  	int exit_state;  	int exit_code, exit_signal; @@ -1328,12 +1274,6 @@ struct task_struct {  	struct list_head ptraced;  	struct list_head ptrace_entry; -	/* -	 * This is the tracer handle for the ptrace BTS extension. -	 * This field actually belongs to the ptracer task. -	 */ -	struct bts_context *bts; -  	/* PID/PID hash table linkage. */  	struct pid_link pids[PIDTYPE_MAX];  	struct list_head thread_group; @@ -1462,7 +1402,7 @@ struct task_struct {  	void *journal_info;  /* stacked block device info */ -	struct bio *bio_list, **bio_tail; +	struct bio_list *bio_list;  /* VM state */  	struct reclaim_state *reclaim_state; @@ -1481,7 +1421,9 @@ struct task_struct {  #endif  #ifdef CONFIG_CPUSETS  	nodemask_t mems_allowed;	/* Protected by alloc_lock */ +	int mems_allowed_change_disable;  	int cpuset_mem_spread_rotor; +	int cpuset_slab_spread_rotor;  #endif  #ifdef CONFIG_CGROUPS  	/* Control Group info protected by css_set_lock */ @@ -1533,7 +1475,7 @@ struct task_struct {  	struct list_head	*scm_work_list;  #ifdef CONFIG_FUNCTION_GRAPH_TRACER -	/* Index of current stored adress in ret_stack */ +	/* Index of current stored address in ret_stack */  	int curr_ret_stack;  	/* Stack of return addresses for return function tracing */  	struct ftrace_ret_stack	*ret_stack; @@ -1553,7 +1495,6 @@ struct task_struct {  	/* bitmask of trace recursion */  	unsigned long trace_recursion;  #endif /* CONFIG_TRACING */ -	unsigned long stack_start;  #ifdef CONFIG_CGROUP_MEM_RES_CTLR /* memcg uses this to do batch job */  	struct memcg_batch_info {  		int do_batch;	/* incremented when batch uncharge started */ @@ -1903,6 +1844,7 @@ extern void sched_clock_idle_sleep_event(void);  extern void sched_clock_idle_wakeup_event(u64 delta_ns);  #ifdef CONFIG_HOTPLUG_CPU +extern void move_task_off_dead_cpu(int dead_cpu, struct task_struct *p);  extern void idle_task_exit(void);  #else  static inline void idle_task_exit(void) {} @@ -2094,7 +2036,7 @@ extern int do_notify_parent(struct task_struct *, int);  extern void __wake_up_parent(struct task_struct *p, struct task_struct *parent);  extern void force_sig(int, struct task_struct *);  extern int send_sig(int, struct task_struct *, int); -extern void zap_other_threads(struct task_struct *p); +extern int zap_other_threads(struct task_struct *p);  extern struct sigqueue *sigqueue_alloc(void);  extern void sigqueue_free(struct sigqueue *);  extern int send_sigqueue(struct sigqueue *,  struct task_struct *, int group); @@ -2159,7 +2101,6 @@ extern void flush_thread(void);  extern void exit_thread(void);  extern void exit_files(struct task_struct *); -extern void __cleanup_signal(struct signal_struct *);  extern void __cleanup_sighand(struct sighand_struct *);  extern void exit_itimers(struct signal_struct *); @@ -2179,10 +2120,8 @@ extern void set_task_comm(struct task_struct *tsk, char *from);  extern char *get_task_comm(char *to, struct task_struct *tsk);  #ifdef CONFIG_SMP -extern void wait_task_context_switch(struct task_struct *p);  extern unsigned long wait_task_inactive(struct task_struct *, long match_state);  #else -static inline void wait_task_context_switch(struct task_struct *p) {}  static inline unsigned long wait_task_inactive(struct task_struct *p,  					       long match_state)  { @@ -2208,6 +2147,11 @@ extern bool current_is_single_threaded(void);  #define while_each_thread(g, t) \  	while ((t = next_thread(t)) != g) +static inline int get_nr_threads(struct task_struct *tsk) +{ +	return tsk->signal->nr_threads; +} +  /* de_thread depends on thread_group_leader not being a pid based check */  #define thread_group_leader(p)	(p == p->group_leader) @@ -2451,13 +2395,7 @@ void thread_group_cputimer(struct task_struct *tsk, struct task_cputime *times);  static inline void thread_group_cputime_init(struct signal_struct *sig)  { -	sig->cputimer.cputime = INIT_CPUTIME;  	spin_lock_init(&sig->cputimer.lock); -	sig->cputimer.running = 0; -} - -static inline void thread_group_cputime_free(struct signal_struct *sig) -{  }  /* @@ -2513,13 +2451,9 @@ extern long sched_getaffinity(pid_t pid, struct cpumask *mask);  extern void normalize_rt_tasks(void); -#ifdef CONFIG_GROUP_SCHED +#ifdef CONFIG_CGROUP_SCHED  extern struct task_group init_task_group; -#ifdef CONFIG_USER_SCHED -extern struct task_group root_task_group; -extern void set_tg_uid(struct user_struct *user); -#endif  extern struct task_group *sched_create_group(struct task_group *parent);  extern void sched_destroy_group(struct task_group *tg); diff --git a/include/linux/sdhci-pltfm.h b/include/linux/sdhci-pltfm.h new file mode 100644 index 00000000000..0239bd70241 --- /dev/null +++ b/include/linux/sdhci-pltfm.h @@ -0,0 +1,35 @@ +/* + * Platform data declarations for the sdhci-pltfm driver. + * + * Copyright (c) 2010 MontaVista Software, LLC. + * + * Author: Anton Vorontsov <avorontsov@ru.mvista.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or (at + * your option) any later version. + */ + +#ifndef _SDHCI_PLTFM_H +#define _SDHCI_PLTFM_H + +struct sdhci_ops; +struct sdhci_host; + +/** + * struct sdhci_pltfm_data - SDHCI platform-specific information & hooks + * @ops: optional pointer to the platform-provided SDHCI ops + * @quirks: optional SDHCI quirks + * @init: optional hook that is called during device probe, before the + *        driver tries to access any SDHCI registers + * @exit: optional hook that is called during device removal + */ +struct sdhci_pltfm_data { +	struct sdhci_ops *ops; +	unsigned int quirks; +	int (*init)(struct sdhci_host *host); +	void (*exit)(struct sdhci_host *host); +}; + +#endif /* _SDHCI_PLTFM_H */ diff --git a/include/linux/security.h b/include/linux/security.h index 2c627d361c0..0c881917046 100644 --- a/include/linux/security.h +++ b/include/linux/security.h @@ -33,7 +33,7 @@  #include <linux/sched.h>  #include <linux/key.h>  #include <linux/xfrm.h> -#include <linux/gfp.h> +#include <linux/slab.h>  #include <net/flow.h>  /* Maximum number of letters for an LSM name string */ @@ -76,7 +76,7 @@ extern int cap_task_prctl(int option, unsigned long arg2, unsigned long arg3,  extern int cap_task_setscheduler(struct task_struct *p, int policy, struct sched_param *lp);  extern int cap_task_setioprio(struct task_struct *p, int ioprio);  extern int cap_task_setnice(struct task_struct *p, int nice); -extern int cap_syslog(int type); +extern int cap_syslog(int type, bool from_file);  extern int cap_vm_enough_memory(struct mm_struct *mm, long pages);  struct msghdr; @@ -95,6 +95,8 @@ struct seq_file;  extern int cap_netlink_send(struct sock *sk, struct sk_buff *skb);  extern int cap_netlink_recv(struct sk_buff *skb, int cap); +void reset_security_ops(void); +  #ifdef CONFIG_MMU  extern unsigned long mmap_min_addr;  extern unsigned long dac_mmap_min_addr; @@ -265,49 +267,16 @@ static inline void security_free_mnt_opts(struct security_mnt_opts *opts)   *	@orig the original mount data copied from userspace.   *	@copy copied data which will be passed to the security module.   *	Returns 0 if the copy was successful. - * @sb_check_sb: - *	Check permission before the device with superblock @mnt->sb is mounted - *	on the mount point named by @nd. - *	@mnt contains the vfsmount for device being mounted. - *	@path contains the path for the mount point. - *	Return 0 if permission is granted.   * @sb_umount:   *	Check permission before the @mnt file system is unmounted.   *	@mnt contains the mounted file system.   *	@flags contains the unmount flags, e.g. MNT_FORCE.   *	Return 0 if permission is granted. - * @sb_umount_close: - *	Close any files in the @mnt mounted filesystem that are held open by - *	the security module.  This hook is called during an umount operation - *	prior to checking whether the filesystem is still busy. - *	@mnt contains the mounted filesystem. - * @sb_umount_busy: - *	Handle a failed umount of the @mnt mounted filesystem, e.g.  re-opening - *	any files that were closed by umount_close.  This hook is called during - *	an umount operation if the umount fails after a call to the - *	umount_close hook. - *	@mnt contains the mounted filesystem. - * @sb_post_remount: - *	Update the security module's state when a filesystem is remounted. - *	This hook is only called if the remount was successful. - *	@mnt contains the mounted file system. - *	@flags contains the new filesystem flags. - *	@data contains the filesystem-specific data. - * @sb_post_addmount: - *	Update the security module's state when a filesystem is mounted. - *	This hook is called any time a mount is successfully grafetd to - *	the tree. - *	@mnt contains the mounted filesystem. - *	@mountpoint contains the path for the mount point.   * @sb_pivotroot:   *	Check permission before pivoting the root filesystem.   *	@old_path contains the path for the new location of the current root (put_old).   *	@new_path contains the path for the new root (new_root).   *	Return 0 if permission is granted. - * @sb_post_pivotroot: - *	Update module state after a successful pivot. - *	@old_path contains the path for the old root. - *	@new_path contains the path for the new root.   * @sb_set_mnt_opts:   *	Set the security relevant mount options used for a superblock   *	@sb the superblock to set security mount options for @@ -509,12 +478,6 @@ static inline void security_free_mnt_opts(struct security_mnt_opts *opts)   *	@mnt is the vfsmount where the dentry was looked up   *	@dentry contains the dentry structure for the file.   *	Return 0 if permission is granted. - * @inode_delete: - *	@inode contains the inode structure for deleted inode. - *	This hook is called when a deleted inode is released (i.e. an inode - *	with no hard links has its use count drop to zero).  A security module - *	can use this hook to release any persistent label associated with the - *	inode.   * @inode_setxattr:   *	Check permission before setting the extended attributes   *	@value identified by @name for @dentry. @@ -689,10 +652,6 @@ static inline void security_free_mnt_opts(struct security_mnt_opts *opts)   *	@old points to the original credentials.   *	@gfp indicates the atomicity of any memory allocations.   *	Prepare a new set of credentials by copying the data from the old set. - * @cred_commit: - *	@new points to the new credentials. - *	@old points to the original credentials. - *	Install a new set of credentials.   * @cred_transfer:   *	@new points to the new credentials.   *	@old points to the original credentials. @@ -715,18 +674,6 @@ static inline void security_free_mnt_opts(struct security_mnt_opts *opts)   *	userspace to load a kernel module with the given name.   *	@kmod_name name of the module requested by the kernel   *	Return 0 if successful. - * @task_setuid: - *	Check permission before setting one or more of the user identity - *	attributes of the current process.  The @flags parameter indicates - *	which of the set*uid system calls invoked this hook and how to - *	interpret the @id0, @id1, and @id2 parameters.  See the LSM_SETID - *	definitions at the beginning of this file for the @flags values and - *	their meanings. - *	@id0 contains a uid. - *	@id1 contains a uid. - *	@id2 contains a uid. - *	@flags contains one of the LSM_SETID_* values. - *	Return 0 if permission is granted.   * @task_fix_setuid:   *	Update the module's state after setting one or more of the user   *	identity attributes of the current process.  The @flags parameter @@ -736,18 +683,6 @@ static inline void security_free_mnt_opts(struct security_mnt_opts *opts)   *	@old is the set of credentials that are being replaces   *	@flags contains one of the LSM_SETID_* values.   *	Return 0 on success. - * @task_setgid: - *	Check permission before setting one or more of the group identity - *	attributes of the current process.  The @flags parameter indicates - *	which of the set*gid system calls invoked this hook and how to - *	interpret the @id0, @id1, and @id2 parameters.  See the LSM_SETID - *	definitions at the beginning of this file for the @flags values and - *	their meanings. - *	@id0 contains a gid. - *	@id1 contains a gid. - *	@id2 contains a gid. - *	@flags contains one of the LSM_SETID_* values. - *	Return 0 if permission is granted.   * @task_setpgid:   *	Check permission before setting the process group identifier of the   *	process @p to @pgid. @@ -769,11 +704,6 @@ static inline void security_free_mnt_opts(struct security_mnt_opts *opts)   *	@p contains the task_struct for the process and place is into @secid.   *	In case of failure, @secid will be set to zero.   * - * @task_setgroups: - *	Check permission before setting the supplementary group set of the - *	current process. - *	@group_info contains the new group information. - *	Return 0 if permission is granted.   * @task_setnice:   *	Check permission before setting the nice value of @p to @nice.   *	@p contains the task_struct of process. @@ -985,6 +915,7 @@ static inline void security_free_mnt_opts(struct security_mnt_opts *opts)   *	Check permissions on incoming network packets.  This hook is distinct   *	from Netfilter's IP input hooks since it is the first time that the   *	incoming sk_buff @skb has been associated with a particular socket, @sk. + *	Must not sleep inside this hook because some callers hold spinlocks.   *	@sk contains the sock (not socket) associated with the incoming sk_buff.   *	@skb contains the incoming network data.   * @socket_getpeersec_stream: @@ -1136,13 +1067,6 @@ static inline void security_free_mnt_opts(struct security_mnt_opts *opts)   *	Return the length of the string (including terminating NUL) or -ve if   *      an error.   *	May also return 0 (and a NULL buffer pointer) if there is no label. - * @key_session_to_parent: - *	Forcibly assign the session keyring from a process to its parent - *	process. - *	@cred: Pointer to process's credentials - *	@parent_cred: Pointer to parent process's credentials - *	@keyring: Proposed new session keyring - *	Return 0 if permission is granted, -ve error otherwise.   *   * Security hooks affecting all System V IPC operations.   * @@ -1330,13 +1254,6 @@ static inline void security_free_mnt_opts(struct security_mnt_opts *opts)   *	@cap contains the capability <include/linux/capability.h>.   *	@audit: Whether to write an audit message or not   *	Return 0 if the capability is granted for @tsk. - * @acct: - *	Check permission before enabling or disabling process accounting.  If - *	accounting is being enabled, then @file refers to the open file used to - *	store accounting records.  If accounting is being disabled, then @file - *	is NULL. - *	@file contains the file structure for the accounting file (may be NULL). - *	Return 0 if permission is granted.   * @sysctl:   *	Check permission before accessing the @table sysctl variable in the   *	manner specified by @op. @@ -1348,6 +1265,7 @@ static inline void security_free_mnt_opts(struct security_mnt_opts *opts)   *	logging to the console.   *	See the syslog(2) manual page for an explanation of the @type values.   *	@type contains the type of action. + *	@from_file indicates the context of action (if it came from /proc).   *	Return 0 if permission is granted.   * @settime:   *	Check permission to change the system time. @@ -1458,11 +1376,10 @@ struct security_operations {  		       const kernel_cap_t *permitted);  	int (*capable) (struct task_struct *tsk, const struct cred *cred,  			int cap, int audit); -	int (*acct) (struct file *file);  	int (*sysctl) (struct ctl_table *table, int op);  	int (*quotactl) (int cmds, int type, int id, struct super_block *sb);  	int (*quota_on) (struct dentry *dentry); -	int (*syslog) (int type); +	int (*syslog) (int type, bool from_file);  	int (*settime) (struct timespec *ts, struct timezone *tz);  	int (*vm_enough_memory) (struct mm_struct *mm, long pages); @@ -1480,18 +1397,9 @@ struct security_operations {  	int (*sb_statfs) (struct dentry *dentry);  	int (*sb_mount) (char *dev_name, struct path *path,  			 char *type, unsigned long flags, void *data); -	int (*sb_check_sb) (struct vfsmount *mnt, struct path *path);  	int (*sb_umount) (struct vfsmount *mnt, int flags); -	void (*sb_umount_close) (struct vfsmount *mnt); -	void (*sb_umount_busy) (struct vfsmount *mnt); -	void (*sb_post_remount) (struct vfsmount *mnt, -				 unsigned long flags, void *data); -	void (*sb_post_addmount) (struct vfsmount *mnt, -				  struct path *mountpoint);  	int (*sb_pivotroot) (struct path *old_path,  			     struct path *new_path); -	void (*sb_post_pivotroot) (struct path *old_path, -				   struct path *new_path);  	int (*sb_set_mnt_opts) (struct super_block *sb,  				struct security_mnt_opts *opts);  	void (*sb_clone_mnt_opts) (const struct super_block *oldsb, @@ -1540,7 +1448,6 @@ struct security_operations {  	int (*inode_permission) (struct inode *inode, int mask);  	int (*inode_setattr)	(struct dentry *dentry, struct iattr *attr);  	int (*inode_getattr) (struct vfsmount *mnt, struct dentry *dentry); -	void (*inode_delete) (struct inode *inode);  	int (*inode_setxattr) (struct dentry *dentry, const char *name,  			       const void *value, size_t size, int flags);  	void (*inode_post_setxattr) (struct dentry *dentry, const char *name, @@ -1581,20 +1488,16 @@ struct security_operations {  	void (*cred_free) (struct cred *cred);  	int (*cred_prepare)(struct cred *new, const struct cred *old,  			    gfp_t gfp); -	void (*cred_commit)(struct cred *new, const struct cred *old);  	void (*cred_transfer)(struct cred *new, const struct cred *old);  	int (*kernel_act_as)(struct cred *new, u32 secid);  	int (*kernel_create_files_as)(struct cred *new, struct inode *inode);  	int (*kernel_module_request)(char *kmod_name); -	int (*task_setuid) (uid_t id0, uid_t id1, uid_t id2, int flags);  	int (*task_fix_setuid) (struct cred *new, const struct cred *old,  				int flags); -	int (*task_setgid) (gid_t id0, gid_t id1, gid_t id2, int flags);  	int (*task_setpgid) (struct task_struct *p, pid_t pgid);  	int (*task_getpgid) (struct task_struct *p);  	int (*task_getsid) (struct task_struct *p);  	void (*task_getsecid) (struct task_struct *p, u32 *secid); -	int (*task_setgroups) (struct group_info *group_info);  	int (*task_setnice) (struct task_struct *p, int nice);  	int (*task_setioprio) (struct task_struct *p, int ioprio);  	int (*task_getioprio) (struct task_struct *p); @@ -1724,9 +1627,6 @@ struct security_operations {  			       const struct cred *cred,  			       key_perm_t perm);  	int (*key_getsecurity)(struct key *key, char **_buffer); -	int (*key_session_to_parent)(const struct cred *cred, -				     const struct cred *parent_cred, -				     struct key *key);  #endif	/* CONFIG_KEYS */  #ifdef CONFIG_AUDIT @@ -1757,11 +1657,10 @@ int security_capset(struct cred *new, const struct cred *old,  int security_capable(int cap);  int security_real_capable(struct task_struct *tsk, int cap);  int security_real_capable_noaudit(struct task_struct *tsk, int cap); -int security_acct(struct file *file);  int security_sysctl(struct ctl_table *table, int op);  int security_quotactl(int cmds, int type, int id, struct super_block *sb);  int security_quota_on(struct dentry *dentry); -int security_syslog(int type); +int security_syslog(int type, bool from_file);  int security_settime(struct timespec *ts, struct timezone *tz);  int security_vm_enough_memory(long pages);  int security_vm_enough_memory_mm(struct mm_struct *mm, long pages); @@ -1779,14 +1678,8 @@ int security_sb_show_options(struct seq_file *m, struct super_block *sb);  int security_sb_statfs(struct dentry *dentry);  int security_sb_mount(char *dev_name, struct path *path,  		      char *type, unsigned long flags, void *data); -int security_sb_check_sb(struct vfsmount *mnt, struct path *path);  int security_sb_umount(struct vfsmount *mnt, int flags); -void security_sb_umount_close(struct vfsmount *mnt); -void security_sb_umount_busy(struct vfsmount *mnt); -void security_sb_post_remount(struct vfsmount *mnt, unsigned long flags, void *data); -void security_sb_post_addmount(struct vfsmount *mnt, struct path *mountpoint);  int security_sb_pivotroot(struct path *old_path, struct path *new_path); -void security_sb_post_pivotroot(struct path *old_path, struct path *new_path);  int security_sb_set_mnt_opts(struct super_block *sb, struct security_mnt_opts *opts);  void security_sb_clone_mnt_opts(const struct super_block *oldsb,  				struct super_block *newsb); @@ -1812,7 +1705,6 @@ int security_inode_follow_link(struct dentry *dentry, struct nameidata *nd);  int security_inode_permission(struct inode *inode, int mask);  int security_inode_setattr(struct dentry *dentry, struct iattr *attr);  int security_inode_getattr(struct vfsmount *mnt, struct dentry *dentry); -void security_inode_delete(struct inode *inode);  int security_inode_setxattr(struct dentry *dentry, const char *name,  			    const void *value, size_t size, int flags);  void security_inode_post_setxattr(struct dentry *dentry, const char *name, @@ -1846,20 +1738,16 @@ int security_task_create(unsigned long clone_flags);  int security_cred_alloc_blank(struct cred *cred, gfp_t gfp);  void security_cred_free(struct cred *cred);  int security_prepare_creds(struct cred *new, const struct cred *old, gfp_t gfp); -void security_commit_creds(struct cred *new, const struct cred *old);  void security_transfer_creds(struct cred *new, const struct cred *old);  int security_kernel_act_as(struct cred *new, u32 secid);  int security_kernel_create_files_as(struct cred *new, struct inode *inode);  int security_kernel_module_request(char *kmod_name); -int security_task_setuid(uid_t id0, uid_t id1, uid_t id2, int flags);  int security_task_fix_setuid(struct cred *new, const struct cred *old,  			     int flags); -int security_task_setgid(gid_t id0, gid_t id1, gid_t id2, int flags);  int security_task_setpgid(struct task_struct *p, pid_t pgid);  int security_task_getpgid(struct task_struct *p);  int security_task_getsid(struct task_struct *p);  void security_task_getsecid(struct task_struct *p, u32 *secid); -int security_task_setgroups(struct group_info *group_info);  int security_task_setnice(struct task_struct *p, int nice);  int security_task_setioprio(struct task_struct *p, int ioprio);  int security_task_getioprio(struct task_struct *p); @@ -1986,11 +1874,6 @@ int security_real_capable_noaudit(struct task_struct *tsk, int cap)  	return ret;  } -static inline int security_acct(struct file *file) -{ -	return 0; -} -  static inline int security_sysctl(struct ctl_table *table, int op)  {  	return 0; @@ -2007,9 +1890,9 @@ static inline int security_quota_on(struct dentry *dentry)  	return 0;  } -static inline int security_syslog(int type) +static inline int security_syslog(int type, bool from_file)  { -	return cap_syslog(type); +	return cap_syslog(type, from_file);  }  static inline int security_settime(struct timespec *ts, struct timezone *tz) @@ -2095,41 +1978,17 @@ static inline int security_sb_mount(char *dev_name, struct path *path,  	return 0;  } -static inline int security_sb_check_sb(struct vfsmount *mnt, -				       struct path *path) -{ -	return 0; -} -  static inline int security_sb_umount(struct vfsmount *mnt, int flags)  {  	return 0;  } -static inline void security_sb_umount_close(struct vfsmount *mnt) -{ } - -static inline void security_sb_umount_busy(struct vfsmount *mnt) -{ } - -static inline void security_sb_post_remount(struct vfsmount *mnt, -					     unsigned long flags, void *data) -{ } - -static inline void security_sb_post_addmount(struct vfsmount *mnt, -					     struct path *mountpoint) -{ } -  static inline int security_sb_pivotroot(struct path *old_path,  					struct path *new_path)  {  	return 0;  } -static inline void security_sb_post_pivotroot(struct path *old_path, -					      struct path *new_path) -{ } -  static inline int security_sb_set_mnt_opts(struct super_block *sb,  					   struct security_mnt_opts *opts)  { @@ -2245,9 +2104,6 @@ static inline int security_inode_getattr(struct vfsmount *mnt,  	return 0;  } -static inline void security_inode_delete(struct inode *inode) -{ } -  static inline int security_inode_setxattr(struct dentry *dentry,  		const char *name, const void *value, size_t size, int flags)  { @@ -2394,11 +2250,6 @@ static inline int security_prepare_creds(struct cred *new,  	return 0;  } -static inline void security_commit_creds(struct cred *new, -					 const struct cred *old) -{ -} -  static inline void security_transfer_creds(struct cred *new,  					   const struct cred *old)  { @@ -2420,12 +2271,6 @@ static inline int security_kernel_module_request(char *kmod_name)  	return 0;  } -static inline int security_task_setuid(uid_t id0, uid_t id1, uid_t id2, -				       int flags) -{ -	return 0; -} -  static inline int security_task_fix_setuid(struct cred *new,  					   const struct cred *old,  					   int flags) @@ -2433,12 +2278,6 @@ static inline int security_task_fix_setuid(struct cred *new,  	return cap_task_fix_setuid(new, old, flags);  } -static inline int security_task_setgid(gid_t id0, gid_t id1, gid_t id2, -				       int flags) -{ -	return 0; -} -  static inline int security_task_setpgid(struct task_struct *p, pid_t pgid)  {  	return 0; @@ -2459,11 +2298,6 @@ static inline void security_task_getsecid(struct task_struct *p, u32 *secid)  	*secid = 0;  } -static inline int security_task_setgroups(struct group_info *group_info) -{ -	return 0; -} -  static inline int security_task_setnice(struct task_struct *p, int nice)  {  	return cap_task_setnice(p, nice); @@ -3060,9 +2894,6 @@ void security_key_free(struct key *key);  int security_key_permission(key_ref_t key_ref,  			    const struct cred *cred, key_perm_t perm);  int security_key_getsecurity(struct key *key, char **_buffer); -int security_key_session_to_parent(const struct cred *cred, -				   const struct cred *parent_cred, -				   struct key *key);  #else @@ -3090,13 +2921,6 @@ static inline int security_key_getsecurity(struct key *key, char **_buffer)  	return 0;  } -static inline int security_key_session_to_parent(const struct cred *cred, -						 const struct cred *parent_cred, -						 struct key *key) -{ -	return 0; -} -  #endif  #endif /* CONFIG_KEYS */ diff --git a/include/linux/sem.h b/include/linux/sem.h index 8a4adbef8a0..f2961afa2f6 100644 --- a/include/linux/sem.h +++ b/include/linux/sem.h @@ -79,6 +79,7 @@ struct  seminfo {  #ifdef __KERNEL__  #include <asm/atomic.h>  #include <linux/rcupdate.h> +#include <linux/cache.h>  struct task_struct; @@ -91,7 +92,8 @@ struct sem {  /* One sem_array data structure for each set of semaphores in the system. */  struct sem_array { -	struct kern_ipc_perm	sem_perm;	/* permissions .. see ipc.h */ +	struct kern_ipc_perm	____cacheline_aligned_in_smp +				sem_perm;	/* permissions .. see ipc.h */  	time_t			sem_otime;	/* last semop time */  	time_t			sem_ctime;	/* last change time */  	struct sem		*sem_base;	/* ptr to first semaphore in array */ diff --git a/include/linux/seq_file.h b/include/linux/seq_file.h index 8366d8f12e5..03c0232b416 100644 --- a/include/linux/seq_file.h +++ b/include/linux/seq_file.h @@ -135,4 +135,22 @@ extern struct list_head *seq_list_start_head(struct list_head *head,  extern struct list_head *seq_list_next(void *v, struct list_head *head,  		loff_t *ppos); +/* + * Helpers for iteration over hlist_head-s in seq_files + */ + +extern struct hlist_node *seq_hlist_start(struct hlist_head *head, +					  loff_t pos); +extern struct hlist_node *seq_hlist_start_head(struct hlist_head *head, +					       loff_t pos); +extern struct hlist_node *seq_hlist_next(void *v, struct hlist_head *head, +					 loff_t *ppos); + +extern struct hlist_node *seq_hlist_start_rcu(struct hlist_head *head, +					      loff_t pos); +extern struct hlist_node *seq_hlist_start_head_rcu(struct hlist_head *head, +						   loff_t pos); +extern struct hlist_node *seq_hlist_next_rcu(void *v, +						   struct hlist_head *head, +						   loff_t *ppos);  #endif diff --git a/include/linux/serial_core.h b/include/linux/serial_core.h index 8c3dd36fe91..f10db6e5f3b 100644 --- a/include/linux/serial_core.h +++ b/include/linux/serial_core.h @@ -182,6 +182,10 @@  /* Aeroflex Gaisler GRLIB APBUART */  #define PORT_APBUART    90 +/* Altera UARTs */ +#define PORT_ALTERA_JTAGUART	91 +#define PORT_ALTERA_UART	92 +  #ifdef __KERNEL__  #include <linux/compiler.h> @@ -246,6 +250,7 @@ struct uart_ops {  #endif  }; +#define NO_POLL_CHAR		0x00ff0000  #define UART_CONFIG_TYPE	(1 << 0)  #define UART_CONFIG_IRQ		(1 << 1) @@ -491,9 +496,13 @@ uart_handle_dcd_change(struct uart_port *uport, unsigned int status)  {  	struct uart_state *state = uport->state;  	struct tty_port *port = &state->port; +	struct tty_ldisc *ld = tty_ldisc_ref(port->tty); +	struct timespec ts; -	uport->icount.dcd++; +	if (ld && ld->ops->dcd_change) +		getnstimeofday(&ts); +	uport->icount.dcd++;  #ifdef CONFIG_HARD_PPS  	if ((uport->flags & UPF_HARDPPS_CD) && status)  		hardpps(); @@ -505,6 +514,11 @@ uart_handle_dcd_change(struct uart_port *uport, unsigned int status)  		else if (port->tty)  			tty_hangup(port->tty);  	} + +	if (ld && ld->ops->dcd_change) +		ld->ops->dcd_change(port->tty, status, &ts); +	if (ld) +		tty_ldisc_deref(ld);  }  /** diff --git a/include/linux/serial_sci.h b/include/linux/serial_sci.h index 1c297ddc9d5..f5364a1de68 100644 --- a/include/linux/serial_sci.h +++ b/include/linux/serial_sci.h @@ -2,6 +2,9 @@  #define __LINUX_SERIAL_SCI_H  #include <linux/serial_core.h> +#ifdef CONFIG_SERIAL_SH_SCI_DMA +#include <asm/dmaengine.h> +#endif  /*   * Generic header for SuperH SCI(F) (used by sh/sh64/h8300 and related parts) @@ -16,6 +19,8 @@ enum {  	SCIx_NR_IRQS,  }; +struct device; +  /*   * Platform device specific platform_data struct   */ @@ -26,6 +31,11 @@ struct plat_sci_port {  	unsigned int	type;			/* SCI / SCIF / IRDA */  	upf_t		flags;			/* UPF_* flags */  	char		*clk;			/* clock string */ +	struct device	*dma_dev; +#ifdef CONFIG_SERIAL_SH_SCI_DMA +	unsigned int dma_slave_tx; +	unsigned int dma_slave_rx; +#endif  };  #endif /* __LINUX_SERIAL_SCI_H */ diff --git a/include/linux/serio.h b/include/linux/serio.h index 813d26c247e..b5552568178 100644 --- a/include/linux/serio.h +++ b/include/linux/serio.h @@ -30,7 +30,6 @@ struct serio {  	char phys[32];  	bool manual_bind; -	bool registered;	/* port has been fully registered with driver core */  	struct serio_device_id id; @@ -197,5 +196,6 @@ static inline void serio_continue_rx(struct serio *serio)  #define SERIO_TOUCHIT213	0x38  #define SERIO_W8001	0x39  #define SERIO_DYNAPRO	0x3a +#define SERIO_HAMPSHIRE	0x3b  #endif diff --git a/include/linux/sfi.h b/include/linux/sfi.h index 9a6f7607174..0299b4ce63d 100644 --- a/include/linux/sfi.h +++ b/include/linux/sfi.h @@ -73,6 +73,8 @@  #define SFI_SIG_SPIB		"SPIB"  #define SFI_SIG_I2CB		"I2CB"  #define SFI_SIG_GPEM		"GPEM" +#define SFI_SIG_DEVS		"DEVS" +#define SFI_SIG_GPIO		"GPIO"  #define SFI_SIGNATURE_SIZE	4  #define SFI_OEM_ID_SIZE		6 @@ -145,6 +147,27 @@ struct sfi_rtc_table_entry {  	u32	irq;  } __packed; +struct sfi_device_table_entry { +	u8	type;		/* bus type, I2C, SPI or ...*/ +#define SFI_DEV_TYPE_SPI	0 +#define SFI_DEV_TYPE_I2C	1 +#define SFI_DEV_TYPE_UART	2 +#define SFI_DEV_TYPE_HSI	3 +#define SFI_DEV_TYPE_IPC	4 + +	u8	host_num;	/* attached to host 0, 1...*/ +	u16	addr; +	u8	irq; +	u32	max_freq; +	char	name[16]; +} __packed; + +struct sfi_gpio_table_entry { +	char	controller_name[16]; +	u16	pin_no; +	char	pin_name[16]; +} __packed; +  struct sfi_spi_table_entry {  	u16	host_num;	/* attached to host 0, 1...*/  	u16	cs;		/* chip select */ @@ -166,7 +189,6 @@ struct sfi_gpe_table_entry {  	u16	phys_id;	/* physical GPE id */  } __packed; -  typedef int (*sfi_table_handler) (struct sfi_table_header *table);  #ifdef CONFIG_SFI diff --git a/include/linux/sh_clk.h b/include/linux/sh_clk.h new file mode 100644 index 00000000000..1636d1e2a5f --- /dev/null +++ b/include/linux/sh_clk.h @@ -0,0 +1,150 @@ +#ifndef __SH_CLOCK_H +#define __SH_CLOCK_H + +#include <linux/list.h> +#include <linux/seq_file.h> +#include <linux/cpufreq.h> +#include <linux/clk.h> +#include <linux/err.h> + +struct clk; + +struct clk_ops { +	void (*init)(struct clk *clk); +	int (*enable)(struct clk *clk); +	void (*disable)(struct clk *clk); +	unsigned long (*recalc)(struct clk *clk); +	int (*set_rate)(struct clk *clk, unsigned long rate, int algo_id); +	int (*set_parent)(struct clk *clk, struct clk *parent); +	long (*round_rate)(struct clk *clk, unsigned long rate); +}; + +struct clk { +	struct list_head	node; +	const char		*name; +	int			id; + +	struct clk		*parent; +	struct clk_ops		*ops; + +	struct list_head	children; +	struct list_head	sibling;	/* node for children */ + +	int			usecount; + +	unsigned long		rate; +	unsigned long		flags; + +	void __iomem		*enable_reg; +	unsigned int		enable_bit; + +	unsigned long		arch_flags; +	void			*priv; +	struct dentry		*dentry; +	struct cpufreq_frequency_table *freq_table; +}; + +#define CLK_ENABLE_ON_INIT	(1 << 0) + +/* drivers/sh/clk.c */ +unsigned long followparent_recalc(struct clk *); +void recalculate_root_clocks(void); +void propagate_rate(struct clk *); +int clk_reparent(struct clk *child, struct clk *parent); +int clk_register(struct clk *); +void clk_unregister(struct clk *); +void clk_enable_init_clocks(void); + +/** + * clk_set_rate_ex - set the clock rate for a clock source, with additional parameter + * @clk: clock source + * @rate: desired clock rate in Hz + * @algo_id: algorithm id to be passed down to ops->set_rate + * + * Returns success (0) or negative errno. + */ +int clk_set_rate_ex(struct clk *clk, unsigned long rate, int algo_id); + +enum clk_sh_algo_id { +	NO_CHANGE = 0, + +	IUS_N1_N1, +	IUS_322, +	IUS_522, +	IUS_N11, + +	SB_N1, + +	SB3_N1, +	SB3_32, +	SB3_43, +	SB3_54, + +	BP_N1, + +	IP_N1, +}; + +struct clk_div_mult_table { +	unsigned int *divisors; +	unsigned int nr_divisors; +	unsigned int *multipliers; +	unsigned int nr_multipliers; +}; + +struct cpufreq_frequency_table; +void clk_rate_table_build(struct clk *clk, +			  struct cpufreq_frequency_table *freq_table, +			  int nr_freqs, +			  struct clk_div_mult_table *src_table, +			  unsigned long *bitmap); + +long clk_rate_table_round(struct clk *clk, +			  struct cpufreq_frequency_table *freq_table, +			  unsigned long rate); + +int clk_rate_table_find(struct clk *clk, +			struct cpufreq_frequency_table *freq_table, +			unsigned long rate); + +#define SH_CLK_MSTP32(_parent, _enable_reg, _enable_bit, _flags)	\ +{									\ +	.parent		= _parent,					\ +	.enable_reg	= (void __iomem *)_enable_reg,			\ +	.enable_bit	= _enable_bit,					\ +	.flags		= _flags,					\ +} + +int sh_clk_mstp32_register(struct clk *clks, int nr); + +#define SH_CLK_DIV4(_parent, _reg, _shift, _div_bitmap, _flags)	\ +{								\ +	.parent = _parent,					\ +	.enable_reg = (void __iomem *)_reg,			\ +	.enable_bit = _shift,					\ +	.arch_flags = _div_bitmap,				\ +	.flags = _flags,					\ +} + +struct clk_div4_table { +	struct clk_div_mult_table *div_mult_table; +	void (*kick)(struct clk *clk); +}; + +int sh_clk_div4_register(struct clk *clks, int nr, +			 struct clk_div4_table *table); +int sh_clk_div4_enable_register(struct clk *clks, int nr, +			 struct clk_div4_table *table); +int sh_clk_div4_reparent_register(struct clk *clks, int nr, +			 struct clk_div4_table *table); + +#define SH_CLK_DIV6(_parent, _reg, _flags)	\ +{						\ +	.parent = _parent,			\ +	.enable_reg = (void __iomem *)_reg,	\ +	.flags = _flags,			\ +} + +int sh_clk_div6_register(struct clk *clks, int nr); + +#endif /* __SH_CLOCK_H */ diff --git a/include/linux/sh_dma.h b/include/linux/sh_dma.h new file mode 100644 index 00000000000..b08cd4efa15 --- /dev/null +++ b/include/linux/sh_dma.h @@ -0,0 +1,102 @@ +/* + * Header for the new SH dmaengine driver + * + * Copyright (C) 2010 Guennadi Liakhovetski <g.liakhovetski@gmx.de> + * + * 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 SH_DMA_H +#define SH_DMA_H + +#include <linux/list.h> +#include <linux/dmaengine.h> + +/* Used by slave DMA clients to request DMA to/from a specific peripheral */ +struct sh_dmae_slave { +	unsigned int			slave_id; /* Set by the platform */ +	struct device			*dma_dev; /* Set by the platform */ +	const struct sh_dmae_slave_config	*config;  /* Set by the driver */ +}; + +struct sh_dmae_regs { +	u32 sar; /* SAR / source address */ +	u32 dar; /* DAR / destination address */ +	u32 tcr; /* TCR / transfer count */ +}; + +struct sh_desc { +	struct sh_dmae_regs hw; +	struct list_head node; +	struct dma_async_tx_descriptor async_tx; +	enum dma_data_direction direction; +	dma_cookie_t cookie; +	size_t partial; +	int chunks; +	int mark; +}; + +struct sh_dmae_slave_config { +	unsigned int			slave_id; +	dma_addr_t			addr; +	u32				chcr; +	char				mid_rid; +}; + +struct sh_dmae_channel { +	unsigned int	offset; +	unsigned int	dmars; +	unsigned int	dmars_bit; +}; + +struct sh_dmae_pdata { +	const struct sh_dmae_slave_config *slave; +	int slave_num; +	const struct sh_dmae_channel *channel; +	int channel_num; +	unsigned int ts_low_shift; +	unsigned int ts_low_mask; +	unsigned int ts_high_shift; +	unsigned int ts_high_mask; +	const unsigned int *ts_shift; +	int ts_shift_num; +	u16 dmaor_init; +}; + +/* DMA register */ +#define SAR	0x00 +#define DAR	0x04 +#define TCR	0x08 +#define CHCR	0x0C +#define DMAOR	0x40 + +/* DMAOR definitions */ +#define DMAOR_AE	0x00000004 +#define DMAOR_NMIF	0x00000002 +#define DMAOR_DME	0x00000001 + +/* Definitions for the SuperH DMAC */ +#define REQ_L	0x00000000 +#define REQ_E	0x00080000 +#define RACK_H	0x00000000 +#define RACK_L	0x00040000 +#define ACK_R	0x00000000 +#define ACK_W	0x00020000 +#define ACK_H	0x00000000 +#define ACK_L	0x00010000 +#define DM_INC	0x00004000 +#define DM_DEC	0x00008000 +#define DM_FIX	0x0000c000 +#define SM_INC	0x00001000 +#define SM_DEC	0x00002000 +#define SM_FIX	0x00003000 +#define RS_IN	0x00000200 +#define RS_OUT	0x00000300 +#define TS_BLK	0x00000040 +#define TM_BUR	0x00000020 +#define CHCR_DE	0x00000001 +#define CHCR_TE	0x00000002 +#define CHCR_IE	0x00000004 + +#endif diff --git a/include/linux/sh_intc.h b/include/linux/sh_intc.h index 4ef246f1465..0d6cd38e673 100644 --- a/include/linux/sh_intc.h +++ b/include/linux/sh_intc.h @@ -1,6 +1,8 @@  #ifndef __SH_INTC_H  #define __SH_INTC_H +#include <linux/ioport.h> +  typedef unsigned char intc_enum;  struct intc_vect { @@ -21,6 +23,9 @@ struct intc_group {  struct intc_mask_reg {  	unsigned long set_reg, clr_reg, reg_width;  	intc_enum enum_ids[32]; +#ifdef CONFIG_INTC_BALANCING +	unsigned long dist_reg; +#endif  #ifdef CONFIG_SMP  	unsigned long smp;  #endif @@ -39,13 +44,19 @@ struct intc_sense_reg {  	intc_enum enum_ids[16];  }; +#ifdef CONFIG_INTC_BALANCING +#define INTC_SMP_BALANCING(reg)	.dist_reg = (reg) +#else +#define INTC_SMP_BALANCING(reg) +#endif +  #ifdef CONFIG_SMP -#define INTC_SMP(stride, nr) .smp = (stride) | ((nr) << 8) +#define INTC_SMP(stride, nr)	.smp = (stride) | ((nr) << 8)  #else  #define INTC_SMP(stride, nr)  #endif -struct intc_desc { +struct intc_hw_desc {  	struct intc_vect *vectors;  	unsigned int nr_vectors;  	struct intc_group *groups; @@ -56,34 +67,56 @@ struct intc_desc {  	unsigned int nr_prio_regs;  	struct intc_sense_reg *sense_regs;  	unsigned int nr_sense_regs; -	char *name;  	struct intc_mask_reg *ack_regs;  	unsigned int nr_ack_regs;  };  #define _INTC_ARRAY(a) a, sizeof(a)/sizeof(*a) +#define INTC_HW_DESC(vectors, groups, mask_regs,	\ +		     prio_regs,	sense_regs, ack_regs)	\ +{							\ +	_INTC_ARRAY(vectors), _INTC_ARRAY(groups),	\ +	_INTC_ARRAY(mask_regs), _INTC_ARRAY(prio_regs),	\ +	_INTC_ARRAY(sense_regs), _INTC_ARRAY(ack_regs),	\ +} + +struct intc_desc { +	char *name; +	struct resource *resource; +	unsigned int num_resources; +	intc_enum force_enable; +	intc_enum force_disable; +	struct intc_hw_desc hw; +}; +  #define DECLARE_INTC_DESC(symbol, chipname, vectors, groups,		\  	mask_regs, prio_regs, sense_regs)				\  struct intc_desc symbol __initdata = {					\ -	_INTC_ARRAY(vectors), _INTC_ARRAY(groups),			\ -	_INTC_ARRAY(mask_regs), _INTC_ARRAY(prio_regs),			\ -	_INTC_ARRAY(sense_regs),					\ -	chipname,							\ +	.name = chipname,						\ +	.hw = INTC_HW_DESC(vectors, groups, mask_regs,			\ +			   prio_regs, sense_regs, NULL),		\  }  #define DECLARE_INTC_DESC_ACK(symbol, chipname, vectors, groups,	\  	mask_regs, prio_regs, sense_regs, ack_regs)			\  struct intc_desc symbol __initdata = {					\ -	_INTC_ARRAY(vectors), _INTC_ARRAY(groups),			\ -	_INTC_ARRAY(mask_regs), _INTC_ARRAY(prio_regs),			\ -	_INTC_ARRAY(sense_regs),					\ -	chipname,							\ -	_INTC_ARRAY(ack_regs),						\ +	.name = chipname,						\ +	.hw = INTC_HW_DESC(vectors, groups, mask_regs,			\ +			   prio_regs, sense_regs, ack_regs),		\  } -void __init register_intc_controller(struct intc_desc *desc); +int __init register_intc_controller(struct intc_desc *desc);  int intc_set_priority(unsigned int irq, unsigned int prio); +#ifdef CONFIG_INTC_USERIMASK +int register_intc_userimask(unsigned long addr); +#else +static inline int register_intc_userimask(unsigned long addr) +{ +	return 0; +} +#endif +  int reserve_irq_vector(unsigned int irq);  void reserve_irq_legacy(void); diff --git a/include/linux/signal.h b/include/linux/signal.h index ab9272cc270..fcd2b14b193 100644 --- a/include/linux/signal.h +++ b/include/linux/signal.h @@ -7,6 +7,8 @@  #ifdef __KERNEL__  #include <linux/list.h> +/* for sysctl */ +extern int print_fatal_signals;  /*   * Real Time signals may be queued.   */ diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index ae836fded53..bf243fc5495 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h @@ -187,12 +187,8 @@ union skb_shared_tx {   * the end of the header data, ie. at skb->end.   */  struct skb_shared_info { -	atomic_t	dataref;  	unsigned short	nr_frags;  	unsigned short	gso_size; -#ifdef CONFIG_HAS_DMA -	dma_addr_t	dma_head; -#endif  	/* Warning: this field is not always filled in (UFO)! */  	unsigned short	gso_segs;  	unsigned short  gso_type; @@ -200,10 +196,13 @@ struct skb_shared_info {  	union skb_shared_tx tx_flags;  	struct sk_buff	*frag_list;  	struct skb_shared_hwtstamps hwtstamps; + +	/* +	 * Warning : all fields before dataref are cleared in __alloc_skb() +	 */ +	atomic_t	dataref; +  	skb_frag_t	frags[MAX_SKB_FRAGS]; -#ifdef CONFIG_HAS_DMA -	dma_addr_t	dma_maps[MAX_SKB_FRAGS]; -#endif  	/* Intermediate layers must ensure that destructor_arg  	 * remains valid until skb destructor */  	void *		destructor_arg; @@ -265,7 +264,7 @@ typedef unsigned char *sk_buff_data_t;   *	@transport_header: Transport layer header   *	@network_header: Network layer header   *	@mac_header: Link layer header - *	@_skb_dst: destination entry + *	@_skb_refdst: destination entry (with norefcount bit)   *	@sp: the security path, used for xfrm   *	@cb: Control buffer. Free for use by every layer. Put private vars here   *	@len: Length of actual data @@ -300,6 +299,7 @@ typedef unsigned char *sk_buff_data_t;   *	@nfct_reasm: netfilter conntrack re-assembly pointer   *	@nf_bridge: Saved data about a bridged frame - see br_netfilter.c   *	@skb_iif: ifindex of device we arrived on + *	@rxhash: the packet hash computed on receive   *	@queue_mapping: Queue mapping for multiqueue devices   *	@tc_index: Traffic control index   *	@tc_verd: traffic control verdict @@ -315,22 +315,23 @@ struct sk_buff {  	struct sk_buff		*next;  	struct sk_buff		*prev; -	struct sock		*sk;  	ktime_t			tstamp; + +	struct sock		*sk;  	struct net_device	*dev; -	unsigned long		_skb_dst; -#ifdef CONFIG_XFRM -	struct	sec_path	*sp; -#endif  	/*  	 * This is the control buffer. It is free to use for every  	 * layer. Please put your private variables there. If you  	 * want to keep them across layers you have to do a skb_clone()  	 * first. This is owned by whoever has the skb queued ATM.  	 */ -	char			cb[48]; +	char			cb[48] __aligned(8); +	unsigned long		_skb_refdst; +#ifdef CONFIG_XFRM +	struct	sec_path	*sp; +#endif  	unsigned int		len,  				data_len;  	__u16			mac_len, @@ -354,8 +355,8 @@ struct sk_buff {  				ipvs_property:1,  				peeked:1,  				nf_trace:1; -	__be16			protocol:16;  	kmemcheck_bitfield_end(flags1); +	__be16			protocol;  	void			(*destructor)(struct sk_buff *skb);  #if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE) @@ -374,6 +375,8 @@ struct sk_buff {  #endif  #endif +	__u32			rxhash; +  	kmemcheck_bitfield_begin(flags2);  	__u16			queue_mapping:16;  #ifdef CONFIG_IPV6_NDISC_NODETYPE @@ -416,14 +419,64 @@ struct sk_buff {  #include <asm/system.h> +/* + * skb might have a dst pointer attached, refcounted or not. + * _skb_refdst low order bit is set if refcount was _not_ taken + */ +#define SKB_DST_NOREF	1UL +#define SKB_DST_PTRMASK	~(SKB_DST_NOREF) + +/** + * skb_dst - returns skb dst_entry + * @skb: buffer + * + * Returns skb dst_entry, regardless of reference taken or not. + */  static inline struct dst_entry *skb_dst(const struct sk_buff *skb)  { -	return (struct dst_entry *)skb->_skb_dst; +	/* If refdst was not refcounted, check we still are in a  +	 * rcu_read_lock section +	 */ +	WARN_ON((skb->_skb_refdst & SKB_DST_NOREF) && +		!rcu_read_lock_held() && +		!rcu_read_lock_bh_held()); +	return (struct dst_entry *)(skb->_skb_refdst & SKB_DST_PTRMASK);  } +/** + * skb_dst_set - sets skb dst + * @skb: buffer + * @dst: dst entry + * + * Sets skb dst, assuming a reference was taken on dst and should + * be released by skb_dst_drop() + */  static inline void skb_dst_set(struct sk_buff *skb, struct dst_entry *dst)  { -	skb->_skb_dst = (unsigned long)dst; +	skb->_skb_refdst = (unsigned long)dst; +} + +/** + * skb_dst_set_noref - sets skb dst, without a reference + * @skb: buffer + * @dst: dst entry + * + * Sets skb dst, assuming a reference was not taken on dst + * skb_dst_drop() should not dst_release() this dst + */ +static inline void skb_dst_set_noref(struct sk_buff *skb, struct dst_entry *dst) +{ +	WARN_ON(!rcu_read_lock_held() && !rcu_read_lock_bh_held()); +	skb->_skb_refdst = (unsigned long)dst | SKB_DST_NOREF; +} + +/** + * skb_dst_is_noref - Test if skb dst isnt refcounted + * @skb: buffer + */ +static inline bool skb_dst_is_noref(const struct sk_buff *skb) +{ +	return (skb->_skb_refdst & SKB_DST_NOREF) && skb_dst(skb);  }  static inline struct rtable *skb_rtable(const struct sk_buff *skb) @@ -448,7 +501,7 @@ static inline struct sk_buff *alloc_skb_fclone(unsigned int size,  	return __alloc_skb(size, priority, 1, -1);  } -extern int skb_recycle_check(struct sk_buff *skb, int skb_size); +extern bool skb_recycle_check(struct sk_buff *skb, int skb_size);  extern struct sk_buff *skb_morph(struct sk_buff *dst, struct sk_buff *src);  extern struct sk_buff *skb_clone(struct sk_buff *skb, @@ -472,11 +525,6 @@ extern int	       skb_cow_data(struct sk_buff *skb, int tailbits,  				    struct sk_buff **trailer);  extern int	       skb_pad(struct sk_buff *skb, int pad);  #define dev_kfree_skb(a)	consume_skb(a) -#define dev_consume_skb(a)	kfree_skb_clean(a) -extern void	      skb_over_panic(struct sk_buff *skb, int len, -				     void *here); -extern void	      skb_under_panic(struct sk_buff *skb, int len, -				      void *here);  extern int skb_append_datato_frags(struct sock *sk, struct sk_buff *skb,  			int getfrag(void *from, char *to, int offset, @@ -738,7 +786,7 @@ static inline struct sk_buff *skb_unshare(struct sk_buff *skb,  }  /** - *	skb_peek + *	skb_peek - peek at the head of an &sk_buff_head   *	@list_: list to peek at   *   *	Peek an &sk_buff. Unlike most other operations you _MUST_ @@ -759,7 +807,7 @@ static inline struct sk_buff *skb_peek(struct sk_buff_head *list_)  }  /** - *	skb_peek_tail + *	skb_peek_tail - peek at the tail of an &sk_buff_head   *	@list_: list to peek at   *   *	Peek an &sk_buff. Unlike most other operations you _MUST_ @@ -1135,6 +1183,11 @@ static inline unsigned char *__skb_pull(struct sk_buff *skb, unsigned int len)  	return skb->data += len;  } +static inline unsigned char *skb_pull_inline(struct sk_buff *skb, unsigned int len) +{ +	return unlikely(len > skb->len) ? NULL : __skb_pull(skb, len); +} +  extern unsigned char *__pskb_pull_tail(struct sk_buff *skb, int delta);  static inline unsigned char *__pskb_pull(struct sk_buff *skb, unsigned int len) @@ -1358,9 +1411,12 @@ static inline int skb_network_offset(const struct sk_buff *skb)   *   * Various parts of the networking layer expect at least 32 bytes of   * headroom, you should not reduce this. + * With RPS, we raised NET_SKB_PAD to 64 so that get_rps_cpus() fetches span + * a 64 bytes aligned block to fit modern (>= 64 bytes) cache line sizes + * NET_IP_ALIGN(2) + ethernet_header(14) + IP_header(20/40) + ports(8)   */  #ifndef NET_SKB_PAD -#define NET_SKB_PAD	32 +#define NET_SKB_PAD	64  #endif  extern int ___pskb_trim(struct sk_buff *skb, unsigned int len); diff --git a/include/linux/slab.h b/include/linux/slab.h index 2da8372519f..49d1247cd6d 100644 --- a/include/linux/slab.h +++ b/include/linux/slab.h @@ -70,6 +70,11 @@  #else  # define SLAB_NOTRACK		0x00000000UL  #endif +#ifdef CONFIG_FAILSLAB +# define SLAB_FAILSLAB		0x02000000UL	/* Fault injection mark */ +#else +# define SLAB_FAILSLAB		0x00000000UL +#endif  /* The following flags affect the page allocator grouping pages by mobility */  #define SLAB_RECLAIM_ACCOUNT	0x00020000UL		/* Objects are reclaimable */ @@ -101,6 +106,7 @@ int kmem_cache_shrink(struct kmem_cache *);  void kmem_cache_free(struct kmem_cache *, void *);  unsigned int kmem_cache_size(struct kmem_cache *);  const char *kmem_cache_name(struct kmem_cache *); +int kern_ptr_validate(const void *ptr, unsigned long size);  int kmem_ptr_validate(struct kmem_cache *cachep, const void *ptr);  /* diff --git a/include/linux/slab_def.h b/include/linux/slab_def.h index ca6b2b31799..1812dac8c49 100644 --- a/include/linux/slab_def.h +++ b/include/linux/slab_def.h @@ -16,6 +16,30 @@  #include <linux/compiler.h>  #include <linux/kmemtrace.h> +#ifndef ARCH_KMALLOC_MINALIGN +/* + * Enforce a minimum alignment for the kmalloc caches. + * Usually, the kmalloc caches are cache_line_size() aligned, except when + * DEBUG and FORCED_DEBUG are enabled, then they are BYTES_PER_WORD aligned. + * Some archs want to perform DMA into kmalloc caches and need a guaranteed + * alignment larger than the alignment of a 64-bit integer. + * ARCH_KMALLOC_MINALIGN allows that. + * Note that increasing this value may disable some debug features. + */ +#define ARCH_KMALLOC_MINALIGN __alignof__(unsigned long long) +#endif + +#ifndef ARCH_SLAB_MINALIGN +/* + * Enforce a minimum alignment for all caches. + * Intended for archs that get misalignment faults even for BYTES_PER_WORD + * aligned buffers. Includes ARCH_KMALLOC_MINALIGN. + * If possible: Do not enable this flag for CONFIG_DEBUG_SLAB, it disables + * some debug features. + */ +#define ARCH_SLAB_MINALIGN 0 +#endif +  /*   * struct kmem_cache   * diff --git a/include/linux/slob_def.h b/include/linux/slob_def.h index 0ec00b39d00..62667f72c2e 100644 --- a/include/linux/slob_def.h +++ b/include/linux/slob_def.h @@ -1,6 +1,14 @@  #ifndef __LINUX_SLOB_DEF_H  #define __LINUX_SLOB_DEF_H +#ifndef ARCH_KMALLOC_MINALIGN +#define ARCH_KMALLOC_MINALIGN __alignof__(unsigned long) +#endif + +#ifndef ARCH_SLAB_MINALIGN +#define ARCH_SLAB_MINALIGN __alignof__(unsigned long) +#endif +  void *kmem_cache_alloc_node(struct kmem_cache *, gfp_t flags, int node);  static __always_inline void *kmem_cache_alloc(struct kmem_cache *cachep, diff --git a/include/linux/slub_def.h b/include/linux/slub_def.h index 1e14beb23f9..4ba59cfc1f7 100644 --- a/include/linux/slub_def.h +++ b/include/linux/slub_def.h @@ -38,8 +38,6 @@ struct kmem_cache_cpu {  	void **freelist;	/* Pointer to first free per cpu object */  	struct page *page;	/* The slab from which we are allocating */  	int node;		/* The node of the page (or -1 for debug) */ -	unsigned int offset;	/* Freepointer offset (in word units) */ -	unsigned int objsize;	/* Size of an object (from kmem_cache) */  #ifdef CONFIG_SLUB_STATS  	unsigned stat[NR_SLUB_STAT_ITEMS];  #endif @@ -69,6 +67,7 @@ struct kmem_cache_order_objects {   * Slab cache management.   */  struct kmem_cache { +	struct kmem_cache_cpu *cpu_slab;  	/* Used for retriving partial slabs etc */  	unsigned long flags;  	int size;		/* The size of an object including meta data */ @@ -76,12 +75,6 @@ struct kmem_cache {  	int offset;		/* Free pointer offset. */  	struct kmem_cache_order_objects oo; -	/* -	 * Avoid an extra cache line for UP, SMP and for the node local to -	 * struct kmem_cache. -	 */ -	struct kmem_cache_node local_node; -  	/* Allocation and freeing of slabs */  	struct kmem_cache_order_objects max;  	struct kmem_cache_order_objects min; @@ -103,11 +96,9 @@ struct kmem_cache {  	 */  	int remote_node_defrag_ratio;  	struct kmem_cache_node *node[MAX_NUMNODES]; -#endif -#ifdef CONFIG_SMP -	struct kmem_cache_cpu *cpu_slab[NR_CPUS];  #else -	struct kmem_cache_cpu cpu_slab; +	/* Avoid an extra cache line for UP */ +	struct kmem_cache_node local_node;  #endif  }; @@ -122,6 +113,14 @@ struct kmem_cache {  #define KMALLOC_SHIFT_LOW ilog2(KMALLOC_MIN_SIZE) +#ifndef ARCH_KMALLOC_MINALIGN +#define ARCH_KMALLOC_MINALIGN __alignof__(unsigned long long) +#endif + +#ifndef ARCH_SLAB_MINALIGN +#define ARCH_SLAB_MINALIGN __alignof__(unsigned long long) +#endif +  /*   * Maximum kmalloc object size handled by SLUB. Larger object allocations   * are passed through to the page allocator. The page allocator "fastpath" @@ -135,11 +134,21 @@ struct kmem_cache {  #define SLUB_PAGE_SHIFT (PAGE_SHIFT + 2) +#ifdef CONFIG_ZONE_DMA +#define SLUB_DMA __GFP_DMA +/* Reserve extra caches for potential DMA use */ +#define KMALLOC_CACHES (2 * SLUB_PAGE_SHIFT) +#else +/* Disable DMA functionality */ +#define SLUB_DMA (__force gfp_t)0 +#define KMALLOC_CACHES SLUB_PAGE_SHIFT +#endif +  /*   * We keep the general caches in an array of slab caches that are used for   * 2^x bytes of allocations.   */ -extern struct kmem_cache kmalloc_caches[SLUB_PAGE_SHIFT]; +extern struct kmem_cache kmalloc_caches[KMALLOC_CACHES];  /*   * Sorry that the following has to be that ugly but some versions of GCC @@ -207,13 +216,6 @@ static __always_inline struct kmem_cache *kmalloc_slab(size_t size)  	return &kmalloc_caches[index];  } -#ifdef CONFIG_ZONE_DMA -#define SLUB_DMA __GFP_DMA -#else -/* Disable DMA functionality */ -#define SLUB_DMA (__force gfp_t)0 -#endif -  void *kmem_cache_alloc(struct kmem_cache *, gfp_t);  void *__kmalloc(size_t size, gfp_t flags); diff --git a/include/linux/smb_fs_sb.h b/include/linux/smb_fs_sb.h index 8a060a7040d..bb947dd1fba 100644 --- a/include/linux/smb_fs_sb.h +++ b/include/linux/smb_fs_sb.h @@ -10,6 +10,7 @@  #define _SMB_FS_SB  #include <linux/types.h> +#include <linux/backing-dev.h>  #include <linux/smb.h>  /* @@ -74,6 +75,8 @@ struct smb_sb_info {  	struct smb_ops *ops;  	struct super_block *super_block; + +	struct backing_dev_info bdi;  };  static inline int diff --git a/include/linux/smp.h b/include/linux/smp.h index 7a0570e6a59..cfa2d20e35f 100644 --- a/include/linux/smp.h +++ b/include/linux/smp.h @@ -154,7 +154,7 @@ smp_call_function_any(const struct cpumask *mask, void (*func)(void *info),  /*   * smp_processor_id(): get the current CPU ID.   * - * if DEBUG_PREEMPT is enabled the we check whether it is + * if DEBUG_PREEMPT is enabled then we check whether it is   * used in a preemption-safe way. (smp_processor_id() is safe   * if it's used in a preemption-off critical section, or in   * a thread that is bound to the current CPU.) diff --git a/include/linux/snmp.h b/include/linux/snmp.h index 0f953fe4041..52797714ade 100644 --- a/include/linux/snmp.h +++ b/include/linux/snmp.h @@ -100,6 +100,7 @@ enum  	ICMP6_MIB_INMSGS,			/* InMsgs */  	ICMP6_MIB_INERRORS,			/* InErrors */  	ICMP6_MIB_OUTMSGS,			/* OutMsgs */ +	ICMP6_MIB_OUTERRORS,			/* OutErrors */  	__ICMP6_MIB_MAX  }; @@ -225,6 +226,9 @@ enum  	LINUX_MIB_SACKSHIFTED,  	LINUX_MIB_SACKMERGED,  	LINUX_MIB_SACKSHIFTFALLBACK, +	LINUX_MIB_TCPBACKLOGDROP, +	LINUX_MIB_TCPMINTTLDROP, /* RFC 5082 */ +	LINUX_MIB_TCPDEFERACCEPTDROP,  	__LINUX_MIB_MAX  }; @@ -257,6 +261,7 @@ enum  	LINUX_MIB_XFRMOUTPOLBLOCK,		/* XfrmOutPolBlock */  	LINUX_MIB_XFRMOUTPOLDEAD,		/* XfrmOutPolDead */  	LINUX_MIB_XFRMOUTPOLERROR,		/* XfrmOutPolError */ +	LINUX_MIB_XFRMFWDHDRERROR,		/* XfrmFwdHdrError*/  	__LINUX_MIB_XFRMMAX  }; diff --git a/include/linux/socket.h b/include/linux/socket.h index 7b3aae2052a..032a19eb61b 100644 --- a/include/linux/socket.h +++ b/include/linux/socket.h @@ -189,7 +189,8 @@ struct ucred {  #define AF_ISDN		34	/* mISDN sockets 		*/  #define AF_PHONET	35	/* Phonet sockets		*/  #define AF_IEEE802154	36	/* IEEE802154 sockets		*/ -#define AF_MAX		37	/* For now.. */ +#define AF_CAIF		37	/* CAIF sockets			*/ +#define AF_MAX		38	/* For now.. */  /* Protocol families, same as address families. */  #define PF_UNSPEC	AF_UNSPEC @@ -229,6 +230,7 @@ struct ucred {  #define PF_ISDN		AF_ISDN  #define PF_PHONET	AF_PHONET  #define PF_IEEE802154	AF_IEEE802154 +#define PF_CAIF		AF_CAIF  #define PF_MAX		AF_MAX  /* Maximum queue length specifiable by listen.  */ @@ -255,6 +257,7 @@ struct ucred {  #define MSG_ERRQUEUE	0x2000	/* Fetch message from error queue */  #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_EOF         MSG_FIN @@ -300,6 +303,7 @@ struct ucred {  #define SOL_PNPIPE	275  #define SOL_RDS		276  #define SOL_IUCV	277 +#define SOL_CAIF	278  /* IPX options */  #define IPX_TYPE	1 diff --git a/include/linux/spi/ads7846.h b/include/linux/spi/ads7846.h index 51948eb6927..b4ae570d3c9 100644 --- a/include/linux/spi/ads7846.h +++ b/include/linux/spi/ads7846.h @@ -12,7 +12,7 @@ enum ads7846_filter {  };  struct ads7846_platform_data { -	u16	model;			/* 7843, 7845, 7846. */ +	u16	model;			/* 7843, 7845, 7846, 7873. */  	u16	vref_delay_usecs;	/* 0 for external vref; etc */  	u16	vref_mv;		/* external vref value, milliVolts */  	bool	keep_vref_on;		/* set to keep vref on for differential @@ -53,5 +53,6 @@ struct ads7846_platform_data {  	int	(*filter)	(void *filter_data, int data_idx, int *val);  	void	(*filter_cleanup)(void *filter_data);  	void	(*wait_for_sync)(void); +	bool	wakeup;  }; diff --git a/include/linux/spi/dw_spi.h b/include/linux/spi/dw_spi.h index 51b3e771a9a..cc813f95a2f 100644 --- a/include/linux/spi/dw_spi.h +++ b/include/linux/spi/dw_spi.h @@ -90,6 +90,7 @@ struct dw_spi {  	unsigned long		paddr;  	u32			iolen;  	int			irq; +	u32			fifo_len;	/* depth of the FIFO buffer */  	u32			max_freq;	/* max bus freq supported */  	u16			bus_num; @@ -171,6 +172,10 @@ static inline void spi_chip_sel(struct dw_spi *dws, u16 cs)  {  	if (cs > dws->num_cs)  		return; + +	if (dws->cs_control) +		dws->cs_control(1); +  	dw_writel(dws, ser, 1 << cs);  } diff --git a/include/linux/spi/l4f00242t03.h b/include/linux/spi/l4f00242t03.h new file mode 100644 index 00000000000..aee1dbda4ed --- /dev/null +++ b/include/linux/spi/l4f00242t03.h @@ -0,0 +1,31 @@ +/* + * l4f00242t03.h -- Platform glue for Epson L4F00242T03 LCD + * + * Copyright (c) 2009 Alberto Panizzo <maramaopercheseimorto@gmail.com> + * Based on Marek Vasut work in lms283gf05.h + * + * 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA +*/ + +#ifndef _INCLUDE_LINUX_SPI_L4F00242T03_H_ +#define _INCLUDE_LINUX_SPI_L4F00242T03_H_ + +struct l4f00242t03_pdata { +	unsigned int	reset_gpio; +	unsigned int	data_enable_gpio; +	const char 	*io_supply;	/* will be set to 1.8 V */ +	const char 	*core_supply;	/* will be set to 2.8 V */ +}; + +#endif /* _INCLUDE_LINUX_SPI_L4F00242T03_H_ */ diff --git a/include/linux/spi/max7301.h b/include/linux/spi/max7301.h index 6dfd83f19b4..34af0a3477b 100644 --- a/include/linux/spi/max7301.h +++ b/include/linux/spi/max7301.h @@ -1,9 +1,27 @@  #ifndef LINUX_SPI_MAX7301_H  #define LINUX_SPI_MAX7301_H +#include <linux/gpio.h> + +/* + * Some registers must be read back to modify. + * To save time we cache them here in memory + */ +struct max7301 { +	struct mutex	lock; +	u8		port_config[8];	/* field 0 is unused */ +	u32		out_level;	/* cached output levels */ +	struct gpio_chip chip; +	struct device *dev; +	int (*write)(struct device *dev, unsigned int reg, unsigned int val); +	int (*read)(struct device *dev, unsigned int reg); +}; +  struct max7301_platform_data {  	/* number assigned to the first GPIO */  	unsigned	base;  }; +extern int __max730x_remove(struct device *dev); +extern int __max730x_probe(struct max7301 *ts);  #endif diff --git a/include/linux/spi/spi.h b/include/linux/spi/spi.h index 97b60b37f44..af56071b06f 100644 --- a/include/linux/spi/spi.h +++ b/include/linux/spi/spi.h @@ -21,6 +21,7 @@  #include <linux/device.h>  #include <linux/mod_devicetable.h> +#include <linux/slab.h>  /*   * INTERFACES between SPI master-side drivers and SPI infrastructure. diff --git a/include/linux/spi/spi_bitbang.h b/include/linux/spi/spi_bitbang.h index 3274c507b8a..f987a2bee16 100644 --- a/include/linux/spi/spi_bitbang.h +++ b/include/linux/spi/spi_bitbang.h @@ -1,24 +1,6 @@  #ifndef	__SPI_BITBANG_H  #define	__SPI_BITBANG_H -/* - * Mix this utility code with some glue code to get one of several types of - * simple SPI master driver.  Two do polled word-at-a-time I/O: - * - *   -	GPIO/parport bitbangers.  Provide chipselect() and txrx_word[](), - *	expanding the per-word routines from the inline templates below. - * - *   -	Drivers for controllers resembling bare shift registers.  Provide - *	chipselect() and txrx_word[](), with custom setup()/cleanup() methods - *	that use your controller's clock and chipselect registers. - * - * Some hardware works well with requests at spi_transfer scope: - * - *   -	Drivers leveraging smarter hardware, with fifos or DMA; or for half - *	duplex (MicroWire) controllers.  Provide chipselect() and txrx_bufs(), - *	and custom setup()/cleanup() methods. - */ -  #include <linux/workqueue.h>  struct spi_bitbang { @@ -68,86 +50,3 @@ extern int spi_bitbang_start(struct spi_bitbang *spi);  extern int spi_bitbang_stop(struct spi_bitbang *spi);  #endif	/* __SPI_BITBANG_H */ - -/*-------------------------------------------------------------------------*/ - -#ifdef	EXPAND_BITBANG_TXRX - -/* - * The code that knows what GPIO pins do what should have declared four - * functions, ideally as inlines, before #defining EXPAND_BITBANG_TXRX - * and including this header: - * - *  void setsck(struct spi_device *, int is_on); - *  void setmosi(struct spi_device *, int is_on); - *  int getmiso(struct spi_device *); - *  void spidelay(unsigned); - * - * setsck()'s is_on parameter is a zero/nonzero boolean. - * - * setmosi()'s is_on parameter is a zero/nonzero boolean. - * - * getmiso() is required to return 0 or 1 only. Any other value is invalid - * and will result in improper operation. - * - * A non-inlined routine would call bitbang_txrx_*() routines.  The - * main loop could easily compile down to a handful of instructions, - * especially if the delay is a NOP (to run at peak speed). - * - * Since this is software, the timings may not be exactly what your board's - * chips need ... there may be several reasons you'd need to tweak timings - * in these routines, not just make to make it faster or slower to match a - * particular CPU clock rate. - */ - -static inline u32 -bitbang_txrx_be_cpha0(struct spi_device *spi, -		unsigned nsecs, unsigned cpol, -		u32 word, u8 bits) -{ -	/* if (cpol == 0) this is SPI_MODE_0; else this is SPI_MODE_2 */ - -	/* clock starts at inactive polarity */ -	for (word <<= (32 - bits); likely(bits); bits--) { - -		/* setup MSB (to slave) on trailing edge */ -		setmosi(spi, word & (1 << 31)); -		spidelay(nsecs);	/* T(setup) */ - -		setsck(spi, !cpol); -		spidelay(nsecs); - -		/* sample MSB (from slave) on leading edge */ -		word <<= 1; -		word |= getmiso(spi); -		setsck(spi, cpol); -	} -	return word; -} - -static inline u32 -bitbang_txrx_be_cpha1(struct spi_device *spi, -		unsigned nsecs, unsigned cpol, -		u32 word, u8 bits) -{ -	/* if (cpol == 0) this is SPI_MODE_1; else this is SPI_MODE_3 */ - -	/* clock starts at inactive polarity */ -	for (word <<= (32 - bits); likely(bits); bits--) { - -		/* setup MSB (to slave) on leading edge */ -		setsck(spi, !cpol); -		setmosi(spi, word & (1 << 31)); -		spidelay(nsecs); /* T(setup) */ - -		setsck(spi, cpol); -		spidelay(nsecs); - -		/* sample MSB (from slave) on trailing edge */ -		word <<= 1; -		word |= getmiso(spi); -	} -	return word; -} - -#endif	/* EXPAND_BITBANG_TXRX */ diff --git a/include/linux/spi/wl12xx.h b/include/linux/spi/wl12xx.h index aed64ed3dc8..a223ecbc71e 100644 --- a/include/linux/spi/wl12xx.h +++ b/include/linux/spi/wl12xx.h @@ -26,6 +26,8 @@  struct wl12xx_platform_data {  	void (*set_power)(bool enable); +	/* SDIO only: IRQ number if WLAN_IRQ line is used, 0 for SDIO IRQs */ +	int irq;  	bool use_eeprom;  }; diff --git a/include/linux/spinlock.h b/include/linux/spinlock.h index dd57af41326..f8854655860 100644 --- a/include/linux/spinlock.h +++ b/include/linux/spinlock.h @@ -128,19 +128,21 @@ static inline void smp_mb__after_lock(void) { smp_mb(); }  #define raw_spin_unlock_wait(lock)	arch_spin_unlock_wait(&(lock)->raw_lock)  #ifdef CONFIG_DEBUG_SPINLOCK - extern void do_raw_spin_lock(raw_spinlock_t *lock); + extern void do_raw_spin_lock(raw_spinlock_t *lock) __acquires(lock);  #define do_raw_spin_lock_flags(lock, flags) do_raw_spin_lock(lock)   extern int do_raw_spin_trylock(raw_spinlock_t *lock); - extern void do_raw_spin_unlock(raw_spinlock_t *lock); + extern void do_raw_spin_unlock(raw_spinlock_t *lock) __releases(lock);  #else -static inline void do_raw_spin_lock(raw_spinlock_t *lock) +static inline void do_raw_spin_lock(raw_spinlock_t *lock) __acquires(lock)  { +	__acquire(lock);  	arch_spin_lock(&lock->raw_lock);  }  static inline void -do_raw_spin_lock_flags(raw_spinlock_t *lock, unsigned long *flags) +do_raw_spin_lock_flags(raw_spinlock_t *lock, unsigned long *flags) __acquires(lock)  { +	__acquire(lock);  	arch_spin_lock_flags(&lock->raw_lock, *flags);  } @@ -149,9 +151,10 @@ static inline int do_raw_spin_trylock(raw_spinlock_t *lock)  	return arch_spin_trylock(&(lock)->raw_lock);  } -static inline void do_raw_spin_unlock(raw_spinlock_t *lock) +static inline void do_raw_spin_unlock(raw_spinlock_t *lock) __releases(lock)  {  	arch_spin_unlock(&lock->raw_lock); +	__release(lock);  }  #endif diff --git a/include/linux/splice.h b/include/linux/splice.h index 18e7c7c0cae..997c3b4c212 100644 --- a/include/linux/splice.h +++ b/include/linux/splice.h @@ -82,4 +82,11 @@ extern ssize_t splice_to_pipe(struct pipe_inode_info *,  extern ssize_t splice_direct_to_actor(struct file *, struct splice_desc *,  				      splice_direct_actor *); +/* + * for dynamic pipe sizing + */ +extern int splice_grow_spd(struct pipe_inode_info *, struct splice_pipe_desc *); +extern void splice_shrink_spd(struct pipe_inode_info *, +				struct splice_pipe_desc *); +  #endif diff --git a/include/linux/srcu.h b/include/linux/srcu.h index 4765d97dcaf..4d5d2f546db 100644 --- a/include/linux/srcu.h +++ b/include/linux/srcu.h @@ -27,14 +27,19 @@  #ifndef _LINUX_SRCU_H  #define _LINUX_SRCU_H +#include <linux/mutex.h> +  struct srcu_struct_array {  	int c[2];  };  struct srcu_struct {  	int completed; -	struct srcu_struct_array *per_cpu_ref; +	struct srcu_struct_array __percpu *per_cpu_ref;  	struct mutex mutex; +#ifdef CONFIG_DEBUG_LOCK_ALLOC +	struct lockdep_map dep_map; +#endif /* #ifdef CONFIG_DEBUG_LOCK_ALLOC */  };  #ifndef CONFIG_PREEMPT @@ -43,12 +48,100 @@ struct srcu_struct {  #define srcu_barrier()  #endif /* #else #ifndef CONFIG_PREEMPT */ +#ifdef CONFIG_DEBUG_LOCK_ALLOC + +int __init_srcu_struct(struct srcu_struct *sp, const char *name, +		       struct lock_class_key *key); + +#define init_srcu_struct(sp) \ +({ \ +	static struct lock_class_key __srcu_key; \ +	\ +	__init_srcu_struct((sp), #sp, &__srcu_key); \ +}) + +# define srcu_read_acquire(sp) \ +		lock_acquire(&(sp)->dep_map, 0, 0, 2, 1, NULL, _THIS_IP_) +# define srcu_read_release(sp) \ +		lock_release(&(sp)->dep_map, 1, _THIS_IP_) + +#else /* #ifdef CONFIG_DEBUG_LOCK_ALLOC */ +  int init_srcu_struct(struct srcu_struct *sp); + +# define srcu_read_acquire(sp)  do { } while (0) +# define srcu_read_release(sp)  do { } while (0) + +#endif /* #else #ifdef CONFIG_DEBUG_LOCK_ALLOC */ +  void cleanup_srcu_struct(struct srcu_struct *sp); -int srcu_read_lock(struct srcu_struct *sp) __acquires(sp); -void srcu_read_unlock(struct srcu_struct *sp, int idx) __releases(sp); +int __srcu_read_lock(struct srcu_struct *sp) __acquires(sp); +void __srcu_read_unlock(struct srcu_struct *sp, int idx) __releases(sp);  void synchronize_srcu(struct srcu_struct *sp);  void synchronize_srcu_expedited(struct srcu_struct *sp);  long srcu_batches_completed(struct srcu_struct *sp); +#ifdef CONFIG_DEBUG_LOCK_ALLOC + +/** + * srcu_read_lock_held - might we be in SRCU read-side critical section? + * + * If CONFIG_DEBUG_LOCK_ALLOC is selected, returns nonzero iff in an SRCU + * read-side critical section.  In absence of CONFIG_DEBUG_LOCK_ALLOC, + * this assumes we are in an SRCU read-side critical section unless it can + * prove otherwise. + */ +static inline int srcu_read_lock_held(struct srcu_struct *sp) +{ +	if (debug_locks) +		return lock_is_held(&sp->dep_map); +	return 1; +} + +#else /* #ifdef CONFIG_DEBUG_LOCK_ALLOC */ + +static inline int srcu_read_lock_held(struct srcu_struct *sp) +{ +	return 1; +} + +#endif /* #else #ifdef CONFIG_DEBUG_LOCK_ALLOC */ + +/** + * srcu_dereference - fetch SRCU-protected pointer with checking + * + * Makes rcu_dereference_check() do the dirty work. + */ +#define srcu_dereference(p, sp) \ +		rcu_dereference_check(p, srcu_read_lock_held(sp)) + +/** + * srcu_read_lock - register a new reader for an SRCU-protected structure. + * @sp: srcu_struct in which to register the new reader. + * + * Enter an SRCU read-side critical section.  Note that SRCU read-side + * critical sections may be nested. + */ +static inline int srcu_read_lock(struct srcu_struct *sp) __acquires(sp) +{ +	int retval = __srcu_read_lock(sp); + +	srcu_read_acquire(sp); +	return retval; +} + +/** + * srcu_read_unlock - unregister a old reader from an SRCU-protected structure. + * @sp: srcu_struct in which to unregister the old reader. + * @idx: return value from corresponding srcu_read_lock(). + * + * Exit an SRCU read-side critical section. + */ +static inline void srcu_read_unlock(struct srcu_struct *sp, int idx) +	__releases(sp) +{ +	srcu_read_release(sp); +	__srcu_read_unlock(sp, idx); +} +  #endif diff --git a/include/linux/ssb/ssb.h b/include/linux/ssb/ssb.h index 24f98854736..a2608bff9c7 100644 --- a/include/linux/ssb/ssb.h +++ b/include/linux/ssb/ssb.h @@ -305,6 +305,7 @@ struct ssb_bus {  	/* ID information about the Chip. */  	u16 chip_id;  	u16 chip_rev; +	u16 sprom_offset;  	u16 sprom_size;		/* number of words in sprom */  	u8 chip_package; @@ -394,6 +395,9 @@ extern int ssb_bus_sdiobus_register(struct ssb_bus *bus,  extern void ssb_bus_unregister(struct ssb_bus *bus); +/* Does the device have an SPROM? */ +extern bool ssb_is_sprom_available(struct ssb_bus *bus); +  /* Set a fallback SPROM.   * See kdoc at the function definition for complete documentation. */  extern int ssb_arch_set_fallback_sprom(const struct ssb_sprom *sprom); diff --git a/include/linux/ssb/ssb_driver_chipcommon.h b/include/linux/ssb/ssb_driver_chipcommon.h index 4e27acf0a92..2cdf249b4e5 100644 --- a/include/linux/ssb/ssb_driver_chipcommon.h +++ b/include/linux/ssb/ssb_driver_chipcommon.h @@ -53,6 +53,7 @@  #define  SSB_CHIPCO_CAP_64BIT		0x08000000	/* 64-bit Backplane */  #define  SSB_CHIPCO_CAP_PMU		0x10000000	/* PMU available (rev >= 20) */  #define  SSB_CHIPCO_CAP_ECI		0x20000000	/* ECI available (rev >= 20) */ +#define  SSB_CHIPCO_CAP_SPROM		0x40000000	/* SPROM present */  #define SSB_CHIPCO_CORECTL		0x0008  #define  SSB_CHIPCO_CORECTL_UARTCLK0	0x00000001	/* Drive UART with internal clock */  #define	 SSB_CHIPCO_CORECTL_SE		0x00000002	/* sync clk out enable (corerev >= 3) */ @@ -385,6 +386,7 @@  /** Chip specific Chip-Status register contents. */ +#define SSB_CHIPCO_CHST_4322_SPROM_EXISTS	0x00000040 /* SPROM present */  #define SSB_CHIPCO_CHST_4325_SPROM_OTP_SEL	0x00000003  #define SSB_CHIPCO_CHST_4325_DEFCIS_SEL		0 /* OTP is powered up, use def. CIS, no SPROM */  #define SSB_CHIPCO_CHST_4325_SPROM_SEL		1 /* OTP is powered up, SPROM is present */ @@ -398,6 +400,18 @@  #define SSB_CHIPCO_CHST_4325_RCAL_VALUE_SHIFT	4  #define SSB_CHIPCO_CHST_4325_PMUTOP_2B 		0x00000200 /* 1 for 2b, 0 for to 2a */ +/** Macros to determine SPROM presence based on Chip-Status register. */ +#define SSB_CHIPCO_CHST_4312_SPROM_PRESENT(status) \ +	((status & SSB_CHIPCO_CHST_4325_SPROM_OTP_SEL) != \ +		SSB_CHIPCO_CHST_4325_OTP_SEL) +#define SSB_CHIPCO_CHST_4322_SPROM_PRESENT(status) \ +	(status & SSB_CHIPCO_CHST_4322_SPROM_EXISTS) +#define SSB_CHIPCO_CHST_4325_SPROM_PRESENT(status) \ +	(((status & SSB_CHIPCO_CHST_4325_SPROM_OTP_SEL) != \ +		SSB_CHIPCO_CHST_4325_DEFCIS_SEL) && \ +	 ((status & SSB_CHIPCO_CHST_4325_SPROM_OTP_SEL) != \ +		SSB_CHIPCO_CHST_4325_OTP_SEL)) +  /** Clockcontrol masks and values **/ @@ -564,6 +578,7 @@ struct ssb_chipcommon_pmu {  struct ssb_chipcommon {  	struct ssb_device *dev;  	u32 capabilities; +	u32 status;  	/* Fast Powerup Delay constant */  	u16 fast_pwrup_delay;  	struct ssb_chipcommon_pmu pmu; diff --git a/include/linux/ssb/ssb_regs.h b/include/linux/ssb/ssb_regs.h index 9ae9082eaeb..a6d5225b927 100644 --- a/include/linux/ssb/ssb_regs.h +++ b/include/linux/ssb/ssb_regs.h @@ -170,26 +170,27 @@  #define SSB_SPROMSIZE_WORDS_R4		220  #define SSB_SPROMSIZE_BYTES_R123	(SSB_SPROMSIZE_WORDS_R123 * sizeof(u16))  #define SSB_SPROMSIZE_BYTES_R4		(SSB_SPROMSIZE_WORDS_R4 * sizeof(u16)) -#define SSB_SPROM_BASE			0x1000 -#define SSB_SPROM_REVISION		0x107E +#define SSB_SPROM_BASE1			0x1000 +#define SSB_SPROM_BASE31		0x0800 +#define SSB_SPROM_REVISION		0x007E  #define  SSB_SPROM_REVISION_REV		0x00FF	/* SPROM Revision number */  #define  SSB_SPROM_REVISION_CRC		0xFF00	/* SPROM CRC8 value */  #define  SSB_SPROM_REVISION_CRC_SHIFT	8  /* SPROM Revision 1 */ -#define SSB_SPROM1_SPID			0x1004	/* Subsystem Product ID for PCI */ -#define SSB_SPROM1_SVID			0x1006	/* Subsystem Vendor ID for PCI */ -#define SSB_SPROM1_PID			0x1008	/* Product ID for PCI */ -#define SSB_SPROM1_IL0MAC		0x1048	/* 6 bytes MAC address for 802.11b/g */ -#define SSB_SPROM1_ET0MAC		0x104E	/* 6 bytes MAC address for Ethernet */ -#define SSB_SPROM1_ET1MAC		0x1054	/* 6 bytes MAC address for 802.11a */ -#define SSB_SPROM1_ETHPHY		0x105A	/* Ethernet PHY settings */ +#define SSB_SPROM1_SPID			0x0004	/* Subsystem Product ID for PCI */ +#define SSB_SPROM1_SVID			0x0006	/* Subsystem Vendor ID for PCI */ +#define SSB_SPROM1_PID			0x0008	/* Product ID for PCI */ +#define SSB_SPROM1_IL0MAC		0x0048	/* 6 bytes MAC address for 802.11b/g */ +#define SSB_SPROM1_ET0MAC		0x004E	/* 6 bytes MAC address for Ethernet */ +#define SSB_SPROM1_ET1MAC		0x0054	/* 6 bytes MAC address for 802.11a */ +#define SSB_SPROM1_ETHPHY		0x005A	/* Ethernet PHY settings */  #define  SSB_SPROM1_ETHPHY_ET0A		0x001F	/* MII Address for enet0 */  #define  SSB_SPROM1_ETHPHY_ET1A		0x03E0	/* MII Address for enet1 */  #define  SSB_SPROM1_ETHPHY_ET1A_SHIFT	5  #define  SSB_SPROM1_ETHPHY_ET0M		(1<<14)	/* MDIO for enet0 */  #define  SSB_SPROM1_ETHPHY_ET1M		(1<<15)	/* MDIO for enet1 */ -#define SSB_SPROM1_BINF			0x105C	/* Board info */ +#define SSB_SPROM1_BINF			0x005C	/* Board info */  #define  SSB_SPROM1_BINF_BREV		0x00FF	/* Board Revision */  #define  SSB_SPROM1_BINF_CCODE		0x0F00	/* Country Code */  #define  SSB_SPROM1_BINF_CCODE_SHIFT	8 @@ -197,63 +198,63 @@  #define  SSB_SPROM1_BINF_ANTBG_SHIFT	12  #define  SSB_SPROM1_BINF_ANTA		0xC000	/* Available A-PHY antennas */  #define  SSB_SPROM1_BINF_ANTA_SHIFT	14 -#define SSB_SPROM1_PA0B0		0x105E -#define SSB_SPROM1_PA0B1		0x1060 -#define SSB_SPROM1_PA0B2		0x1062 -#define SSB_SPROM1_GPIOA		0x1064	/* General Purpose IO pins 0 and 1 */ +#define SSB_SPROM1_PA0B0		0x005E +#define SSB_SPROM1_PA0B1		0x0060 +#define SSB_SPROM1_PA0B2		0x0062 +#define SSB_SPROM1_GPIOA		0x0064	/* General Purpose IO pins 0 and 1 */  #define  SSB_SPROM1_GPIOA_P0		0x00FF	/* Pin 0 */  #define  SSB_SPROM1_GPIOA_P1		0xFF00	/* Pin 1 */  #define  SSB_SPROM1_GPIOA_P1_SHIFT	8 -#define SSB_SPROM1_GPIOB		0x1066	/* General Purpuse IO pins 2 and 3 */ +#define SSB_SPROM1_GPIOB		0x0066	/* General Purpuse IO pins 2 and 3 */  #define  SSB_SPROM1_GPIOB_P2		0x00FF	/* Pin 2 */  #define  SSB_SPROM1_GPIOB_P3		0xFF00	/* Pin 3 */  #define  SSB_SPROM1_GPIOB_P3_SHIFT	8 -#define SSB_SPROM1_MAXPWR		0x1068	/* Power Amplifier Max Power */ +#define SSB_SPROM1_MAXPWR		0x0068	/* Power Amplifier Max Power */  #define  SSB_SPROM1_MAXPWR_BG		0x00FF	/* B-PHY and G-PHY (in dBm Q5.2) */  #define  SSB_SPROM1_MAXPWR_A		0xFF00	/* A-PHY (in dBm Q5.2) */  #define  SSB_SPROM1_MAXPWR_A_SHIFT	8 -#define SSB_SPROM1_PA1B0		0x106A -#define SSB_SPROM1_PA1B1		0x106C -#define SSB_SPROM1_PA1B2		0x106E -#define SSB_SPROM1_ITSSI		0x1070	/* Idle TSSI Target */ +#define SSB_SPROM1_PA1B0		0x006A +#define SSB_SPROM1_PA1B1		0x006C +#define SSB_SPROM1_PA1B2		0x006E +#define SSB_SPROM1_ITSSI		0x0070	/* Idle TSSI Target */  #define  SSB_SPROM1_ITSSI_BG		0x00FF	/* B-PHY and G-PHY*/  #define  SSB_SPROM1_ITSSI_A		0xFF00	/* A-PHY */  #define  SSB_SPROM1_ITSSI_A_SHIFT	8 -#define SSB_SPROM1_BFLLO		0x1072	/* Boardflags (low 16 bits) */ -#define SSB_SPROM1_AGAIN		0x1074	/* Antenna Gain (in dBm Q5.2) */ +#define SSB_SPROM1_BFLLO		0x0072	/* Boardflags (low 16 bits) */ +#define SSB_SPROM1_AGAIN		0x0074	/* Antenna Gain (in dBm Q5.2) */  #define  SSB_SPROM1_AGAIN_BG		0x00FF	/* B-PHY and G-PHY */  #define  SSB_SPROM1_AGAIN_BG_SHIFT	0  #define  SSB_SPROM1_AGAIN_A		0xFF00	/* A-PHY */  #define  SSB_SPROM1_AGAIN_A_SHIFT	8  /* SPROM Revision 2 (inherits from rev 1) */ -#define SSB_SPROM2_BFLHI		0x1038	/* Boardflags (high 16 bits) */ -#define SSB_SPROM2_MAXP_A		0x103A	/* A-PHY Max Power */ +#define SSB_SPROM2_BFLHI		0x0038	/* Boardflags (high 16 bits) */ +#define SSB_SPROM2_MAXP_A		0x003A	/* A-PHY Max Power */  #define  SSB_SPROM2_MAXP_A_HI		0x00FF	/* Max Power High */  #define  SSB_SPROM2_MAXP_A_LO		0xFF00	/* Max Power Low */  #define  SSB_SPROM2_MAXP_A_LO_SHIFT	8 -#define SSB_SPROM2_PA1LOB0		0x103C	/* A-PHY PowerAmplifier Low Settings */ -#define SSB_SPROM2_PA1LOB1		0x103E	/* A-PHY PowerAmplifier Low Settings */ -#define SSB_SPROM2_PA1LOB2		0x1040	/* A-PHY PowerAmplifier Low Settings */ -#define SSB_SPROM2_PA1HIB0		0x1042	/* A-PHY PowerAmplifier High Settings */ -#define SSB_SPROM2_PA1HIB1		0x1044	/* A-PHY PowerAmplifier High Settings */ -#define SSB_SPROM2_PA1HIB2		0x1046	/* A-PHY PowerAmplifier High Settings */ -#define SSB_SPROM2_OPO			0x1078	/* OFDM Power Offset from CCK Level */ +#define SSB_SPROM2_PA1LOB0		0x003C	/* A-PHY PowerAmplifier Low Settings */ +#define SSB_SPROM2_PA1LOB1		0x003E	/* A-PHY PowerAmplifier Low Settings */ +#define SSB_SPROM2_PA1LOB2		0x0040	/* A-PHY PowerAmplifier Low Settings */ +#define SSB_SPROM2_PA1HIB0		0x0042	/* A-PHY PowerAmplifier High Settings */ +#define SSB_SPROM2_PA1HIB1		0x0044	/* A-PHY PowerAmplifier High Settings */ +#define SSB_SPROM2_PA1HIB2		0x0046	/* A-PHY PowerAmplifier High Settings */ +#define SSB_SPROM2_OPO			0x0078	/* OFDM Power Offset from CCK Level */  #define  SSB_SPROM2_OPO_VALUE		0x00FF  #define  SSB_SPROM2_OPO_UNUSED		0xFF00 -#define SSB_SPROM2_CCODE		0x107C	/* Two char Country Code */ +#define SSB_SPROM2_CCODE		0x007C	/* Two char Country Code */  /* SPROM Revision 3 (inherits most data from rev 2) */ -#define SSB_SPROM3_IL0MAC		0x104A	/* 6 bytes MAC address for 802.11b/g */ -#define SSB_SPROM3_OFDMAPO		0x102C	/* A-PHY OFDM Mid Power Offset (4 bytes, BigEndian) */ -#define SSB_SPROM3_OFDMALPO		0x1030	/* A-PHY OFDM Low Power Offset (4 bytes, BigEndian) */ -#define SSB_SPROM3_OFDMAHPO		0x1034	/* A-PHY OFDM High Power Offset (4 bytes, BigEndian) */ -#define SSB_SPROM3_GPIOLDC		0x1042	/* GPIO LED Powersave Duty Cycle (4 bytes, BigEndian) */ +#define SSB_SPROM3_OFDMAPO		0x002C	/* A-PHY OFDM Mid Power Offset (4 bytes, BigEndian) */ +#define SSB_SPROM3_OFDMALPO		0x0030	/* A-PHY OFDM Low Power Offset (4 bytes, BigEndian) */ +#define SSB_SPROM3_OFDMAHPO		0x0034	/* A-PHY OFDM High Power Offset (4 bytes, BigEndian) */ +#define SSB_SPROM3_GPIOLDC		0x0042	/* GPIO LED Powersave Duty Cycle (4 bytes, BigEndian) */  #define  SSB_SPROM3_GPIOLDC_OFF		0x0000FF00	/* Off Count */  #define  SSB_SPROM3_GPIOLDC_OFF_SHIFT	8  #define  SSB_SPROM3_GPIOLDC_ON		0x00FF0000	/* On Count */  #define  SSB_SPROM3_GPIOLDC_ON_SHIFT	16 -#define SSB_SPROM3_CCKPO		0x1078	/* CCK Power Offset */ +#define SSB_SPROM3_IL0MAC		0x004A	/* 6 bytes MAC address for 802.11b/g */ +#define SSB_SPROM3_CCKPO		0x0078	/* CCK Power Offset */  #define  SSB_SPROM3_CCKPO_1M		0x000F	/* 1M Rate PO */  #define  SSB_SPROM3_CCKPO_2M		0x00F0	/* 2M Rate PO */  #define  SSB_SPROM3_CCKPO_2M_SHIFT	4 @@ -264,100 +265,100 @@  #define  SSB_SPROM3_OFDMGPO		0x107A	/* G-PHY OFDM Power Offset (4 bytes, BigEndian) */  /* SPROM Revision 4 */ -#define SSB_SPROM4_IL0MAC		0x104C	/* 6 byte MAC address for a/b/g/n */ -#define SSB_SPROM4_ETHPHY		0x105A	/* Ethernet PHY settings ?? */ +#define SSB_SPROM4_BFLLO		0x0044	/* Boardflags (low 16 bits) */ +#define SSB_SPROM4_BFLHI		0x0046  /* Board Flags Hi */ +#define SSB_SPROM4_IL0MAC		0x004C	/* 6 byte MAC address for a/b/g/n */ +#define SSB_SPROM4_CCODE		0x0052	/* Country Code (2 bytes) */ +#define SSB_SPROM4_GPIOA		0x0056	/* Gen. Purpose IO # 0 and 1 */ +#define  SSB_SPROM4_GPIOA_P0		0x00FF	/* Pin 0 */ +#define  SSB_SPROM4_GPIOA_P1		0xFF00	/* Pin 1 */ +#define  SSB_SPROM4_GPIOA_P1_SHIFT	8 +#define SSB_SPROM4_GPIOB		0x0058	/* Gen. Purpose IO # 2 and 3 */ +#define  SSB_SPROM4_GPIOB_P2		0x00FF	/* Pin 2 */ +#define  SSB_SPROM4_GPIOB_P3		0xFF00	/* Pin 3 */ +#define  SSB_SPROM4_GPIOB_P3_SHIFT	8 +#define SSB_SPROM4_ETHPHY		0x005A	/* Ethernet PHY settings ?? */  #define  SSB_SPROM4_ETHPHY_ET0A		0x001F	/* MII Address for enet0 */  #define  SSB_SPROM4_ETHPHY_ET1A		0x03E0	/* MII Address for enet1 */  #define  SSB_SPROM4_ETHPHY_ET1A_SHIFT	5  #define  SSB_SPROM4_ETHPHY_ET0M		(1<<14)	/* MDIO for enet0 */  #define  SSB_SPROM4_ETHPHY_ET1M		(1<<15)	/* MDIO for enet1 */ -#define SSB_SPROM4_CCODE		0x1052	/* Country Code (2 bytes) */ -#define SSB_SPROM4_ANTAVAIL		0x105D  /* Antenna available bitfields */ -#define SSB_SPROM4_ANTAVAIL_A		0x00FF	/* A-PHY bitfield */ -#define SSB_SPROM4_ANTAVAIL_A_SHIFT	0 -#define SSB_SPROM4_ANTAVAIL_BG		0xFF00	/* B-PHY and G-PHY bitfield */ -#define SSB_SPROM4_ANTAVAIL_BG_SHIFT	8 -#define SSB_SPROM4_BFLLO		0x1044	/* Boardflags (low 16 bits) */ -#define SSB_SPROM4_AGAIN01		0x105E	/* Antenna Gain (in dBm Q5.2) */ +#define SSB_SPROM4_ANTAVAIL		0x005D  /* Antenna available bitfields */ +#define  SSB_SPROM4_ANTAVAIL_A		0x00FF	/* A-PHY bitfield */ +#define  SSB_SPROM4_ANTAVAIL_A_SHIFT	0 +#define  SSB_SPROM4_ANTAVAIL_BG		0xFF00	/* B-PHY and G-PHY bitfield */ +#define  SSB_SPROM4_ANTAVAIL_BG_SHIFT	8 +#define SSB_SPROM4_AGAIN01		0x005E	/* Antenna Gain (in dBm Q5.2) */  #define  SSB_SPROM4_AGAIN0		0x00FF	/* Antenna 0 */  #define  SSB_SPROM4_AGAIN0_SHIFT	0  #define  SSB_SPROM4_AGAIN1		0xFF00	/* Antenna 1 */  #define  SSB_SPROM4_AGAIN1_SHIFT	8 -#define SSB_SPROM4_AGAIN23		0x1060 +#define SSB_SPROM4_AGAIN23		0x0060  #define  SSB_SPROM4_AGAIN2		0x00FF	/* Antenna 2 */  #define  SSB_SPROM4_AGAIN2_SHIFT	0  #define  SSB_SPROM4_AGAIN3		0xFF00	/* Antenna 3 */  #define  SSB_SPROM4_AGAIN3_SHIFT	8 -#define SSB_SPROM4_BFLHI		0x1046  /* Board Flags Hi */ -#define SSB_SPROM4_MAXP_BG		0x1080  /* Max Power BG in path 1 */ +#define SSB_SPROM4_MAXP_BG		0x0080  /* Max Power BG in path 1 */  #define  SSB_SPROM4_MAXP_BG_MASK	0x00FF  /* Mask for Max Power BG */  #define  SSB_SPROM4_ITSSI_BG		0xFF00	/* Mask for path 1 itssi_bg */  #define  SSB_SPROM4_ITSSI_BG_SHIFT	8 -#define SSB_SPROM4_MAXP_A		0x108A  /* Max Power A in path 1 */ +#define SSB_SPROM4_MAXP_A		0x008A  /* Max Power A in path 1 */  #define  SSB_SPROM4_MAXP_A_MASK		0x00FF  /* Mask for Max Power A */  #define  SSB_SPROM4_ITSSI_A		0xFF00	/* Mask for path 1 itssi_a */  #define  SSB_SPROM4_ITSSI_A_SHIFT	8 -#define SSB_SPROM4_GPIOA		0x1056	/* Gen. Purpose IO # 0 and 1 */ -#define  SSB_SPROM4_GPIOA_P0		0x00FF	/* Pin 0 */ -#define  SSB_SPROM4_GPIOA_P1		0xFF00	/* Pin 1 */ -#define  SSB_SPROM4_GPIOA_P1_SHIFT	8 -#define SSB_SPROM4_GPIOB		0x1058	/* Gen. Purpose IO # 2 and 3 */ -#define  SSB_SPROM4_GPIOB_P2		0x00FF	/* Pin 2 */ -#define  SSB_SPROM4_GPIOB_P3		0xFF00	/* Pin 3 */ -#define  SSB_SPROM4_GPIOB_P3_SHIFT	8 -#define SSB_SPROM4_PA0B0		0x1082	/* The paXbY locations are */ -#define SSB_SPROM4_PA0B1		0x1084	/*   only guesses */ -#define SSB_SPROM4_PA0B2		0x1086 -#define SSB_SPROM4_PA1B0		0x108E -#define SSB_SPROM4_PA1B1		0x1090 -#define SSB_SPROM4_PA1B2		0x1092 +#define SSB_SPROM4_PA0B0		0x0082	/* The paXbY locations are */ +#define SSB_SPROM4_PA0B1		0x0084	/*   only guesses */ +#define SSB_SPROM4_PA0B2		0x0086 +#define SSB_SPROM4_PA1B0		0x008E +#define SSB_SPROM4_PA1B1		0x0090 +#define SSB_SPROM4_PA1B2		0x0092  /* SPROM Revision 5 (inherits most data from rev 4) */ -#define SSB_SPROM5_BFLLO		0x104A	/* Boardflags (low 16 bits) */ -#define SSB_SPROM5_BFLHI		0x104C  /* Board Flags Hi */ -#define SSB_SPROM5_IL0MAC		0x1052	/* 6 byte MAC address for a/b/g/n */ -#define SSB_SPROM5_CCODE		0x1044	/* Country Code (2 bytes) */ -#define SSB_SPROM5_GPIOA		0x1076	/* Gen. Purpose IO # 0 and 1 */ +#define SSB_SPROM5_CCODE		0x0044	/* Country Code (2 bytes) */ +#define SSB_SPROM5_BFLLO		0x004A	/* Boardflags (low 16 bits) */ +#define SSB_SPROM5_BFLHI		0x004C  /* Board Flags Hi */ +#define SSB_SPROM5_IL0MAC		0x0052	/* 6 byte MAC address for a/b/g/n */ +#define SSB_SPROM5_GPIOA		0x0076	/* Gen. Purpose IO # 0 and 1 */  #define  SSB_SPROM5_GPIOA_P0		0x00FF	/* Pin 0 */  #define  SSB_SPROM5_GPIOA_P1		0xFF00	/* Pin 1 */  #define  SSB_SPROM5_GPIOA_P1_SHIFT	8 -#define SSB_SPROM5_GPIOB		0x1078	/* Gen. Purpose IO # 2 and 3 */ +#define SSB_SPROM5_GPIOB		0x0078	/* Gen. Purpose IO # 2 and 3 */  #define  SSB_SPROM5_GPIOB_P2		0x00FF	/* Pin 2 */  #define  SSB_SPROM5_GPIOB_P3		0xFF00	/* Pin 3 */  #define  SSB_SPROM5_GPIOB_P3_SHIFT	8  /* SPROM Revision 8 */ -#define SSB_SPROM8_BOARDREV		0x1082	/* Board revision */ -#define SSB_SPROM8_BFLLO		0x1084	/* Board flags (bits 0-15) */ -#define SSB_SPROM8_BFLHI		0x1086	/* Board flags (bits 16-31) */ -#define SSB_SPROM8_BFL2LO		0x1088	/* Board flags (bits 32-47) */ -#define SSB_SPROM8_BFL2HI		0x108A	/* Board flags (bits 48-63) */ -#define SSB_SPROM8_IL0MAC		0x108C	/* 6 byte MAC address */ -#define SSB_SPROM8_CCODE		0x1092	/* 2 byte country code */ -#define SSB_SPROM8_ANTAVAIL		0x109C  /* Antenna available bitfields*/ -#define SSB_SPROM8_ANTAVAIL_A		0xFF00	/* A-PHY bitfield */ -#define SSB_SPROM8_ANTAVAIL_A_SHIFT	8 -#define SSB_SPROM8_ANTAVAIL_BG		0x00FF	/* B-PHY and G-PHY bitfield */ -#define SSB_SPROM8_ANTAVAIL_BG_SHIFT	0 -#define SSB_SPROM8_AGAIN01		0x109E	/* Antenna Gain (in dBm Q5.2) */ +#define SSB_SPROM8_BOARDREV		0x0082	/* Board revision */ +#define SSB_SPROM8_BFLLO		0x0084	/* Board flags (bits 0-15) */ +#define SSB_SPROM8_BFLHI		0x0086	/* Board flags (bits 16-31) */ +#define SSB_SPROM8_BFL2LO		0x0088	/* Board flags (bits 32-47) */ +#define SSB_SPROM8_BFL2HI		0x008A	/* Board flags (bits 48-63) */ +#define SSB_SPROM8_IL0MAC		0x008C	/* 6 byte MAC address */ +#define SSB_SPROM8_CCODE		0x0092	/* 2 byte country code */ +#define SSB_SPROM8_GPIOA		0x0096	/*Gen. Purpose IO # 0 and 1 */ +#define  SSB_SPROM8_GPIOA_P0		0x00FF	/* Pin 0 */ +#define  SSB_SPROM8_GPIOA_P1		0xFF00	/* Pin 1 */ +#define  SSB_SPROM8_GPIOA_P1_SHIFT	8 +#define SSB_SPROM8_GPIOB		0x0098	/* Gen. Purpose IO # 2 and 3 */ +#define  SSB_SPROM8_GPIOB_P2		0x00FF	/* Pin 2 */ +#define  SSB_SPROM8_GPIOB_P3		0xFF00	/* Pin 3 */ +#define  SSB_SPROM8_GPIOB_P3_SHIFT	8 +#define SSB_SPROM8_ANTAVAIL		0x009C  /* Antenna available bitfields*/ +#define  SSB_SPROM8_ANTAVAIL_A		0xFF00	/* A-PHY bitfield */ +#define  SSB_SPROM8_ANTAVAIL_A_SHIFT	8 +#define  SSB_SPROM8_ANTAVAIL_BG		0x00FF	/* B-PHY and G-PHY bitfield */ +#define  SSB_SPROM8_ANTAVAIL_BG_SHIFT	0 +#define SSB_SPROM8_AGAIN01		0x009E	/* Antenna Gain (in dBm Q5.2) */  #define  SSB_SPROM8_AGAIN0		0x00FF	/* Antenna 0 */  #define  SSB_SPROM8_AGAIN0_SHIFT	0  #define  SSB_SPROM8_AGAIN1		0xFF00	/* Antenna 1 */  #define  SSB_SPROM8_AGAIN1_SHIFT	8 -#define SSB_SPROM8_AGAIN23		0x10A0 +#define SSB_SPROM8_AGAIN23		0x00A0  #define  SSB_SPROM8_AGAIN2		0x00FF	/* Antenna 2 */  #define  SSB_SPROM8_AGAIN2_SHIFT	0  #define  SSB_SPROM8_AGAIN3		0xFF00	/* Antenna 3 */  #define  SSB_SPROM8_AGAIN3_SHIFT	8 -#define SSB_SPROM8_GPIOA		0x1096	/*Gen. Purpose IO # 0 and 1 */ -#define  SSB_SPROM8_GPIOA_P0		0x00FF	/* Pin 0 */ -#define  SSB_SPROM8_GPIOA_P1		0xFF00	/* Pin 1 */ -#define  SSB_SPROM8_GPIOA_P1_SHIFT	8 -#define SSB_SPROM8_GPIOB		0x1098	/* Gen. Purpose IO # 2 and 3 */ -#define  SSB_SPROM8_GPIOB_P2		0x00FF	/* Pin 2 */ -#define  SSB_SPROM8_GPIOB_P3		0xFF00	/* Pin 3 */ -#define  SSB_SPROM8_GPIOB_P3_SHIFT	8 -#define SSB_SPROM8_RSSIPARM2G		0x10A4	/* RSSI params for 2GHz */ +#define SSB_SPROM8_RSSIPARM2G		0x00A4	/* RSSI params for 2GHz */  #define  SSB_SPROM8_RSSISMF2G		0x000F  #define  SSB_SPROM8_RSSISMC2G		0x00F0  #define  SSB_SPROM8_RSSISMC2G_SHIFT	4 @@ -365,7 +366,7 @@  #define  SSB_SPROM8_RSSISAV2G_SHIFT	8  #define  SSB_SPROM8_BXA2G		0x1800  #define  SSB_SPROM8_BXA2G_SHIFT		11 -#define SSB_SPROM8_RSSIPARM5G		0x10A6	/* RSSI params for 5GHz */ +#define SSB_SPROM8_RSSIPARM5G		0x00A6	/* RSSI params for 5GHz */  #define  SSB_SPROM8_RSSISMF5G		0x000F  #define  SSB_SPROM8_RSSISMC5G		0x00F0  #define  SSB_SPROM8_RSSISMC5G_SHIFT	4 @@ -373,47 +374,47 @@  #define  SSB_SPROM8_RSSISAV5G_SHIFT	8  #define  SSB_SPROM8_BXA5G		0x1800  #define  SSB_SPROM8_BXA5G_SHIFT		11 -#define SSB_SPROM8_TRI25G		0x10A8	/* TX isolation 2.4&5.3GHz */ +#define SSB_SPROM8_TRI25G		0x00A8	/* TX isolation 2.4&5.3GHz */  #define  SSB_SPROM8_TRI2G		0x00FF	/* TX isolation 2.4GHz */  #define  SSB_SPROM8_TRI5G		0xFF00	/* TX isolation 5.3GHz */  #define  SSB_SPROM8_TRI5G_SHIFT		8 -#define SSB_SPROM8_TRI5GHL		0x10AA	/* TX isolation 5.2/5.8GHz */ +#define SSB_SPROM8_TRI5GHL		0x00AA	/* TX isolation 5.2/5.8GHz */  #define  SSB_SPROM8_TRI5GL		0x00FF	/* TX isolation 5.2GHz */  #define  SSB_SPROM8_TRI5GH		0xFF00	/* TX isolation 5.8GHz */  #define  SSB_SPROM8_TRI5GH_SHIFT	8 -#define SSB_SPROM8_RXPO			0x10AC  /* RX power offsets */ +#define SSB_SPROM8_RXPO			0x00AC  /* RX power offsets */  #define  SSB_SPROM8_RXPO2G		0x00FF	/* 2GHz RX power offset */  #define  SSB_SPROM8_RXPO5G		0xFF00	/* 5GHz RX power offset */  #define  SSB_SPROM8_RXPO5G_SHIFT	8 -#define SSB_SPROM8_MAXP_BG		0x10C0  /* Max Power 2GHz in path 1 */ +#define SSB_SPROM8_MAXP_BG		0x00C0  /* Max Power 2GHz in path 1 */  #define  SSB_SPROM8_MAXP_BG_MASK	0x00FF  /* Mask for Max Power 2GHz */  #define  SSB_SPROM8_ITSSI_BG		0xFF00	/* Mask for path 1 itssi_bg */  #define  SSB_SPROM8_ITSSI_BG_SHIFT	8 -#define SSB_SPROM8_PA0B0		0x10C2	/* 2GHz power amp settings */ -#define SSB_SPROM8_PA0B1		0x10C4 -#define SSB_SPROM8_PA0B2		0x10C6 -#define SSB_SPROM8_MAXP_A		0x10C8  /* Max Power 5.3GHz */ +#define SSB_SPROM8_PA0B0		0x00C2	/* 2GHz power amp settings */ +#define SSB_SPROM8_PA0B1		0x00C4 +#define SSB_SPROM8_PA0B2		0x00C6 +#define SSB_SPROM8_MAXP_A		0x00C8  /* Max Power 5.3GHz */  #define  SSB_SPROM8_MAXP_A_MASK		0x00FF  /* Mask for Max Power 5.3GHz */  #define  SSB_SPROM8_ITSSI_A		0xFF00	/* Mask for path 1 itssi_a */  #define  SSB_SPROM8_ITSSI_A_SHIFT	8 -#define SSB_SPROM8_MAXP_AHL		0x10CA  /* Max Power 5.2/5.8GHz */ +#define SSB_SPROM8_MAXP_AHL		0x00CA  /* Max Power 5.2/5.8GHz */  #define  SSB_SPROM8_MAXP_AH_MASK	0x00FF  /* Mask for Max Power 5.8GHz */  #define  SSB_SPROM8_MAXP_AL_MASK	0xFF00  /* Mask for Max Power 5.2GHz */  #define  SSB_SPROM8_MAXP_AL_SHIFT	8 -#define SSB_SPROM8_PA1B0		0x10CC	/* 5.3GHz power amp settings */ -#define SSB_SPROM8_PA1B1		0x10CE -#define SSB_SPROM8_PA1B2		0x10D0 -#define SSB_SPROM8_PA1LOB0		0x10D2	/* 5.2GHz power amp settings */ -#define SSB_SPROM8_PA1LOB1		0x10D4 -#define SSB_SPROM8_PA1LOB2		0x10D6 -#define SSB_SPROM8_PA1HIB0		0x10D8	/* 5.8GHz power amp settings */ -#define SSB_SPROM8_PA1HIB1		0x10DA -#define SSB_SPROM8_PA1HIB2		0x10DC -#define SSB_SPROM8_CCK2GPO		0x1140	/* CCK power offset */ -#define SSB_SPROM8_OFDM2GPO		0x1142	/* 2.4GHz OFDM power offset */ -#define SSB_SPROM8_OFDM5GPO		0x1146	/* 5.3GHz OFDM power offset */ -#define SSB_SPROM8_OFDM5GLPO		0x114A	/* 5.2GHz OFDM power offset */ -#define SSB_SPROM8_OFDM5GHPO		0x114E	/* 5.8GHz OFDM power offset */ +#define SSB_SPROM8_PA1B0		0x00CC	/* 5.3GHz power amp settings */ +#define SSB_SPROM8_PA1B1		0x00CE +#define SSB_SPROM8_PA1B2		0x00D0 +#define SSB_SPROM8_PA1LOB0		0x00D2	/* 5.2GHz power amp settings */ +#define SSB_SPROM8_PA1LOB1		0x00D4 +#define SSB_SPROM8_PA1LOB2		0x00D6 +#define SSB_SPROM8_PA1HIB0		0x00D8	/* 5.8GHz power amp settings */ +#define SSB_SPROM8_PA1HIB1		0x00DA +#define SSB_SPROM8_PA1HIB2		0x00DC +#define SSB_SPROM8_CCK2GPO		0x0140	/* CCK power offset */ +#define SSB_SPROM8_OFDM2GPO		0x0142	/* 2.4GHz OFDM power offset */ +#define SSB_SPROM8_OFDM5GPO		0x0146	/* 5.3GHz OFDM power offset */ +#define SSB_SPROM8_OFDM5GLPO		0x014A	/* 5.2GHz OFDM power offset */ +#define SSB_SPROM8_OFDM5GHPO		0x014E	/* 5.8GHz OFDM power offset */  /* Values for SSB_SPROM1_BINF_CCODE */  enum { diff --git a/include/linux/stmmac.h b/include/linux/stmmac.h new file mode 100644 index 00000000000..632ff7c0328 --- /dev/null +++ b/include/linux/stmmac.h @@ -0,0 +1,54 @@ +/******************************************************************************* + +  Header file for stmmac platform data + +  Copyright (C) 2009  STMicroelectronics Ltd + +  This program is free software; you can redistribute it and/or modify it +  under the terms and conditions of the GNU General Public License, +  version 2, as published by the Free Software Foundation. + +  This program is distributed in the hope it will be useful, but WITHOUT +  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for +  more details. + +  You should have received a copy of the GNU General Public License along with +  this program; if not, write to the Free Software Foundation, Inc., +  51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. + +  The full GNU General Public License is included in this distribution in +  the file called "COPYING". + +  Author: Giuseppe Cavallaro <peppe.cavallaro@st.com> +*******************************************************************************/ + +#ifndef __STMMAC_PLATFORM_DATA +#define __STMMAC_PLATFORM_DATA + +/* platfrom data for platfrom device structure's platfrom_data field */ + +/* Private data for the STM on-board ethernet driver */ +struct plat_stmmacenet_data { +	int bus_id; +	int pbl; +	int has_gmac; +	int enh_desc; +	void (*fix_mac_speed)(void *priv, unsigned int speed); +	void (*bus_setup)(unsigned long ioaddr); +#ifdef CONFIG_STM_DRIVERS +	struct stm_pad_config *pad_config; +#endif +	void *bsp_priv; +}; + +struct plat_stmmacphy_data { +	int bus_id; +	int phy_addr; +	unsigned int phy_mask; +	int interface; +	int (*phy_reset)(void *priv); +	void *priv; +}; +#endif + diff --git a/include/linux/stop_machine.h b/include/linux/stop_machine.h index baba3a23a81..6b524a0d02e 100644 --- a/include/linux/stop_machine.h +++ b/include/linux/stop_machine.h @@ -1,13 +1,101 @@  #ifndef _LINUX_STOP_MACHINE  #define _LINUX_STOP_MACHINE -/* "Bogolock": stop the entire machine, disable interrupts.  This is a -   very heavy lock, which is equivalent to grabbing every spinlock -   (and more).  So the "read" side to such a lock is anything which -   disables preeempt. */ +  #include <linux/cpu.h>  #include <linux/cpumask.h> +#include <linux/list.h>  #include <asm/system.h> +/* + * stop_cpu[s]() is simplistic per-cpu maximum priority cpu + * monopolization mechanism.  The caller can specify a non-sleeping + * function to be executed on a single or multiple cpus preempting all + * other processes and monopolizing those cpus until it finishes. + * + * Resources for this mechanism are preallocated when a cpu is brought + * up and requests are guaranteed to be served as long as the target + * cpus are online. + */ +typedef int (*cpu_stop_fn_t)(void *arg); + +#ifdef CONFIG_SMP + +struct cpu_stop_work { +	struct list_head	list;		/* cpu_stopper->works */ +	cpu_stop_fn_t		fn; +	void			*arg; +	struct cpu_stop_done	*done; +}; + +int stop_one_cpu(unsigned int cpu, cpu_stop_fn_t fn, void *arg); +void stop_one_cpu_nowait(unsigned int cpu, cpu_stop_fn_t fn, void *arg, +			 struct cpu_stop_work *work_buf); +int stop_cpus(const struct cpumask *cpumask, cpu_stop_fn_t fn, void *arg); +int try_stop_cpus(const struct cpumask *cpumask, cpu_stop_fn_t fn, void *arg); + +#else	/* CONFIG_SMP */ + +#include <linux/workqueue.h> + +struct cpu_stop_work { +	struct work_struct	work; +	cpu_stop_fn_t		fn; +	void			*arg; +}; + +static inline int stop_one_cpu(unsigned int cpu, cpu_stop_fn_t fn, void *arg) +{ +	int ret = -ENOENT; +	preempt_disable(); +	if (cpu == smp_processor_id()) +		ret = fn(arg); +	preempt_enable(); +	return ret; +} + +static void stop_one_cpu_nowait_workfn(struct work_struct *work) +{ +	struct cpu_stop_work *stwork = +		container_of(work, struct cpu_stop_work, work); +	preempt_disable(); +	stwork->fn(stwork->arg); +	preempt_enable(); +} + +static inline void stop_one_cpu_nowait(unsigned int cpu, +				       cpu_stop_fn_t fn, void *arg, +				       struct cpu_stop_work *work_buf) +{ +	if (cpu == smp_processor_id()) { +		INIT_WORK(&work_buf->work, stop_one_cpu_nowait_workfn); +		work_buf->fn = fn; +		work_buf->arg = arg; +		schedule_work(&work_buf->work); +	} +} + +static inline int stop_cpus(const struct cpumask *cpumask, +			    cpu_stop_fn_t fn, void *arg) +{ +	if (cpumask_test_cpu(raw_smp_processor_id(), cpumask)) +		return stop_one_cpu(raw_smp_processor_id(), fn, arg); +	return -ENOENT; +} + +static inline int try_stop_cpus(const struct cpumask *cpumask, +				cpu_stop_fn_t fn, void *arg) +{ +	return stop_cpus(cpumask, fn, arg); +} + +#endif	/* CONFIG_SMP */ + +/* + * stop_machine "Bogolock": stop the entire machine, disable + * interrupts.  This is a very heavy lock, which is equivalent to + * grabbing every spinlock (and more).  So the "read" side to such a + * lock is anything which disables preeempt. + */  #if defined(CONFIG_STOP_MACHINE) && defined(CONFIG_SMP)  /** @@ -36,24 +124,7 @@ int stop_machine(int (*fn)(void *), void *data, const struct cpumask *cpus);   */  int __stop_machine(int (*fn)(void *), void *data, const struct cpumask *cpus); -/** - * stop_machine_create: create all stop_machine threads - * - * Description: This causes all stop_machine threads to be created before - * stop_machine actually gets called. This can be used by subsystems that - * need a non failing stop_machine infrastructure. - */ -int stop_machine_create(void); - -/** - * stop_machine_destroy: destroy all stop_machine threads - * - * Description: This causes all stop_machine threads which were created with - * stop_machine_create to be destroyed again. - */ -void stop_machine_destroy(void); - -#else +#else	 /* CONFIG_STOP_MACHINE && CONFIG_SMP */  static inline int stop_machine(int (*fn)(void *), void *data,  			       const struct cpumask *cpus) @@ -65,8 +136,5 @@ static inline int stop_machine(int (*fn)(void *), void *data,  	return ret;  } -static inline int stop_machine_create(void) { return 0; } -static inline void stop_machine_destroy(void) { } - -#endif /* CONFIG_SMP */ -#endif /* _LINUX_STOP_MACHINE */ +#endif	/* CONFIG_STOP_MACHINE && CONFIG_SMP */ +#endif	/* _LINUX_STOP_MACHINE */ diff --git a/include/linux/sunrpc/auth.h b/include/linux/sunrpc/auth.h index 996df4dac7d..87d7ec0bf77 100644 --- a/include/linux/sunrpc/auth.h +++ b/include/linux/sunrpc/auth.h @@ -54,6 +54,7 @@ struct rpc_cred {  #define RPCAUTH_CRED_NEW	0  #define RPCAUTH_CRED_UPTODATE	1  #define RPCAUTH_CRED_HASHED	2 +#define RPCAUTH_CRED_NEGATIVE	3  #define RPCAUTH_CRED_MAGIC	0x0f4aa4f0 diff --git a/include/linux/sunrpc/auth_gss.h b/include/linux/sunrpc/auth_gss.h index d48d4e605f7..671538d25bc 100644 --- a/include/linux/sunrpc/auth_gss.h +++ b/include/linux/sunrpc/auth_gss.h @@ -82,6 +82,7 @@ struct gss_cred {  	enum rpc_gss_svc	gc_service;  	struct gss_cl_ctx	*gc_ctx;  	struct gss_upcall_msg	*gc_upcall; +	unsigned long		gc_upcall_timestamp;  	unsigned char		gc_machine_cred : 1;  }; diff --git a/include/linux/sunrpc/bc_xprt.h b/include/linux/sunrpc/bc_xprt.h index 6508f0dc0ef..7c91260c44a 100644 --- a/include/linux/sunrpc/bc_xprt.h +++ b/include/linux/sunrpc/bc_xprt.h @@ -36,14 +36,32 @@ struct rpc_rqst *xprt_alloc_bc_request(struct rpc_xprt *xprt);  void xprt_free_bc_request(struct rpc_rqst *req);  int xprt_setup_backchannel(struct rpc_xprt *, unsigned int min_reqs);  void xprt_destroy_backchannel(struct rpc_xprt *, int max_reqs); -void bc_release_request(struct rpc_task *);  int bc_send(struct rpc_rqst *req); + +/* + * Determine if a shared backchannel is in use + */ +static inline int svc_is_backchannel(const struct svc_rqst *rqstp) +{ +	if (rqstp->rq_server->bc_xprt) +		return 1; +	return 0; +}  #else /* CONFIG_NFS_V4_1 */  static inline int xprt_setup_backchannel(struct rpc_xprt *xprt,  					 unsigned int min_reqs)  {  	return 0;  } + +static inline int svc_is_backchannel(const struct svc_rqst *rqstp) +{ +	return 0; +} + +static inline void xprt_free_bc_request(struct rpc_rqst *req) +{ +}  #endif /* CONFIG_NFS_V4_1 */  #endif /* _LINUX_SUNRPC_BC_XPRT_H */ diff --git a/include/linux/sunrpc/gss_api.h b/include/linux/sunrpc/gss_api.h index 03f33330ece..5d8048beb05 100644 --- a/include/linux/sunrpc/gss_api.h +++ b/include/linux/sunrpc/gss_api.h @@ -35,7 +35,8 @@ int gss_import_sec_context(  		const void*		input_token,  		size_t			bufsize,  		struct gss_api_mech	*mech, -		struct gss_ctx		**ctx_id); +		struct gss_ctx		**ctx_id, +		gfp_t			gfp_mask);  u32 gss_get_mic(  		struct gss_ctx		*ctx_id,  		struct xdr_buf		*message, @@ -80,6 +81,8 @@ struct gss_api_mech {  	/* pseudoflavors supported by this mechanism: */  	int			gm_pf_num;  	struct pf_desc *	gm_pfs; +	/* Should the following be a callback operation instead? */ +	const char		*gm_upcall_enctypes;  };  /* and must provide the following operations: */ @@ -87,7 +90,8 @@ struct gss_api_ops {  	int (*gss_import_sec_context)(  			const void		*input_token,  			size_t			bufsize, -			struct gss_ctx		*ctx_id); +			struct gss_ctx		*ctx_id, +			gfp_t			gfp_mask);  	u32 (*gss_get_mic)(  			struct gss_ctx		*ctx_id,  			struct xdr_buf		*message, diff --git a/include/linux/sunrpc/gss_krb5.h b/include/linux/sunrpc/gss_krb5.h index e7bbdba474d..5af2931cf58 100644 --- a/include/linux/sunrpc/gss_krb5.h +++ b/include/linux/sunrpc/gss_krb5.h @@ -4,7 +4,7 @@   *  Adapted from MIT Kerberos 5-1.2.1 lib/include/krb5.h,   *  lib/gssapi/krb5/gssapiP_krb5.h, and others   * - *  Copyright (c) 2000 The Regents of the University of Michigan. + *  Copyright (c) 2000-2008 The Regents of the University of Michigan.   *  All rights reserved.   *   *  Andy Adamson   <andros@umich.edu> @@ -36,17 +36,86 @@   *   */ +#include <linux/crypto.h>  #include <linux/sunrpc/auth_gss.h>  #include <linux/sunrpc/gss_err.h>  #include <linux/sunrpc/gss_asn1.h> +/* Length of constant used in key derivation */ +#define GSS_KRB5_K5CLENGTH (5) + +/* Maximum key length (in bytes) for the supported crypto algorithms*/ +#define GSS_KRB5_MAX_KEYLEN (32) + +/* Maximum checksum function output for the supported crypto algorithms */ +#define GSS_KRB5_MAX_CKSUM_LEN  (20) + +/* Maximum blocksize for the supported crypto algorithms */ +#define GSS_KRB5_MAX_BLOCKSIZE  (16) + +struct krb5_ctx; + +struct gss_krb5_enctype { +	const u32		etype;		/* encryption (key) type */ +	const u32		ctype;		/* checksum type */ +	const char		*name;		/* "friendly" name */ +	const char		*encrypt_name;	/* crypto encrypt name */ +	const char		*cksum_name;	/* crypto checksum name */ +	const u16		signalg;	/* signing algorithm */ +	const u16		sealalg;	/* sealing algorithm */ +	const u32		blocksize;	/* encryption blocksize */ +	const u32		conflen;	/* confounder length +						   (normally the same as +						   the blocksize) */ +	const u32		cksumlength;	/* checksum length */ +	const u32		keyed_cksum;	/* is it a keyed cksum? */ +	const u32		keybytes;	/* raw key len, in bytes */ +	const u32		keylength;	/* final key len, in bytes */ +	u32 (*encrypt) (struct crypto_blkcipher *tfm, +			void *iv, void *in, void *out, +			int length);		/* encryption function */ +	u32 (*decrypt) (struct crypto_blkcipher *tfm, +			void *iv, void *in, void *out, +			int length);		/* decryption function */ +	u32 (*mk_key) (const struct gss_krb5_enctype *gk5e, +		       struct xdr_netobj *in, +		       struct xdr_netobj *out);	/* complete key generation */ +	u32 (*encrypt_v2) (struct krb5_ctx *kctx, u32 offset, +			   struct xdr_buf *buf, int ec, +			   struct page **pages); /* v2 encryption function */ +	u32 (*decrypt_v2) (struct krb5_ctx *kctx, u32 offset, +			   struct xdr_buf *buf, u32 *headskip, +			   u32 *tailskip);	/* v2 decryption function */ +}; + +/* krb5_ctx flags definitions */ +#define KRB5_CTX_FLAG_INITIATOR         0x00000001 +#define KRB5_CTX_FLAG_CFX               0x00000002 +#define KRB5_CTX_FLAG_ACCEPTOR_SUBKEY   0x00000004 +  struct krb5_ctx {  	int			initiate; /* 1 = initiating, 0 = accepting */ +	u32			enctype; +	u32			flags; +	const struct gss_krb5_enctype *gk5e; /* enctype-specific info */  	struct crypto_blkcipher	*enc;  	struct crypto_blkcipher	*seq; +	struct crypto_blkcipher *acceptor_enc; +	struct crypto_blkcipher *initiator_enc; +	struct crypto_blkcipher *acceptor_enc_aux; +	struct crypto_blkcipher *initiator_enc_aux; +	u8			Ksess[GSS_KRB5_MAX_KEYLEN]; /* session key */ +	u8			cksum[GSS_KRB5_MAX_KEYLEN];  	s32			endtime;  	u32			seq_send; +	u64			seq_send64;  	struct xdr_netobj	mech_used; +	u8			initiator_sign[GSS_KRB5_MAX_KEYLEN]; +	u8			acceptor_sign[GSS_KRB5_MAX_KEYLEN]; +	u8			initiator_seal[GSS_KRB5_MAX_KEYLEN]; +	u8			acceptor_seal[GSS_KRB5_MAX_KEYLEN]; +	u8			initiator_integ[GSS_KRB5_MAX_KEYLEN]; +	u8			acceptor_integ[GSS_KRB5_MAX_KEYLEN];  };  extern spinlock_t krb5_seq_lock; @@ -57,6 +126,18 @@ extern spinlock_t krb5_seq_lock;  #define KG_TOK_MIC_MSG    0x0101  #define KG_TOK_WRAP_MSG   0x0201 +#define KG2_TOK_INITIAL     0x0101 +#define KG2_TOK_RESPONSE    0x0202 +#define KG2_TOK_MIC         0x0404 +#define KG2_TOK_WRAP        0x0504 + +#define KG2_TOKEN_FLAG_SENTBYACCEPTOR   0x01 +#define KG2_TOKEN_FLAG_SEALED           0x02 +#define KG2_TOKEN_FLAG_ACCEPTORSUBKEY   0x04 + +#define KG2_RESP_FLAG_ERROR             0x0001 +#define KG2_RESP_FLAG_DELEG_OK          0x0002 +  enum sgn_alg {  	SGN_ALG_DES_MAC_MD5 = 0x0000,  	SGN_ALG_MD2_5 = 0x0001, @@ -81,6 +162,9 @@ enum seal_alg {  #define CKSUMTYPE_RSA_MD5_DES		0x0008  #define CKSUMTYPE_NIST_SHA		0x0009  #define CKSUMTYPE_HMAC_SHA1_DES3	0x000c +#define CKSUMTYPE_HMAC_SHA1_96_AES128   0x000f +#define CKSUMTYPE_HMAC_SHA1_96_AES256   0x0010 +#define CKSUMTYPE_HMAC_MD5_ARCFOUR      -138 /* Microsoft md5 hmac cksumtype */  /* from gssapi_err_krb5.h */  #define KG_CCACHE_NOMATCH                        (39756032L) @@ -111,11 +195,56 @@ enum seal_alg {  #define ENCTYPE_DES3_CBC_RAW    0x0006	/* DES-3 cbc mode raw */  #define ENCTYPE_DES_HMAC_SHA1   0x0008  #define ENCTYPE_DES3_CBC_SHA1   0x0010 +#define ENCTYPE_AES128_CTS_HMAC_SHA1_96 0x0011 +#define ENCTYPE_AES256_CTS_HMAC_SHA1_96 0x0012 +#define ENCTYPE_ARCFOUR_HMAC            0x0017 +#define ENCTYPE_ARCFOUR_HMAC_EXP        0x0018  #define ENCTYPE_UNKNOWN         0x01ff -s32 -make_checksum(char *, char *header, int hdrlen, struct xdr_buf *body, -		   int body_offset, struct xdr_netobj *cksum); +/* + * Constants used for key derivation + */ +/* for 3DES */ +#define KG_USAGE_SEAL (22) +#define KG_USAGE_SIGN (23) +#define KG_USAGE_SEQ  (24) + +/* from rfc3961 */ +#define KEY_USAGE_SEED_CHECKSUM         (0x99) +#define KEY_USAGE_SEED_ENCRYPTION       (0xAA) +#define KEY_USAGE_SEED_INTEGRITY        (0x55) + +/* from rfc4121 */ +#define KG_USAGE_ACCEPTOR_SEAL  (22) +#define KG_USAGE_ACCEPTOR_SIGN  (23) +#define KG_USAGE_INITIATOR_SEAL (24) +#define KG_USAGE_INITIATOR_SIGN (25) + +/* + * This compile-time check verifies that we will not exceed the + * slack space allotted by the client and server auth_gss code + * before they call gss_wrap(). + */ +#define GSS_KRB5_MAX_SLACK_NEEDED \ +	(GSS_KRB5_TOK_HDR_LEN     /* gss token header */         \ +	+ GSS_KRB5_MAX_CKSUM_LEN  /* gss token checksum */       \ +	+ GSS_KRB5_MAX_BLOCKSIZE  /* confounder */               \ +	+ GSS_KRB5_MAX_BLOCKSIZE  /* possible padding */         \ +	+ GSS_KRB5_TOK_HDR_LEN    /* encrypted hdr in v2 token */\ +	+ GSS_KRB5_MAX_CKSUM_LEN  /* encryption hmac */          \ +	+ 4 + 4                   /* RPC verifier */             \ +	+ GSS_KRB5_TOK_HDR_LEN                                   \ +	+ GSS_KRB5_MAX_CKSUM_LEN) + +u32 +make_checksum(struct krb5_ctx *kctx, char *header, int hdrlen, +		struct xdr_buf *body, int body_offset, u8 *cksumkey, +		unsigned int usage, struct xdr_netobj *cksumout); + +u32 +make_checksum_v2(struct krb5_ctx *, char *header, int hdrlen, +		 struct xdr_buf *body, int body_offset, u8 *key, +		 unsigned int usage, struct xdr_netobj *cksum);  u32 gss_get_mic_kerberos(struct gss_ctx *, struct xdr_buf *,  		struct xdr_netobj *); @@ -149,11 +278,54 @@ gss_decrypt_xdr_buf(struct crypto_blkcipher *tfm, struct xdr_buf *inbuf,  		    int offset);  s32 -krb5_make_seq_num(struct crypto_blkcipher *key, +krb5_make_seq_num(struct krb5_ctx *kctx, +		struct crypto_blkcipher *key,  		int direction,  		u32 seqnum, unsigned char *cksum, unsigned char *buf);  s32 -krb5_get_seq_num(struct crypto_blkcipher *key, +krb5_get_seq_num(struct krb5_ctx *kctx,  	       unsigned char *cksum,  	       unsigned char *buf, int *direction, u32 *seqnum); + +int +xdr_extend_head(struct xdr_buf *buf, unsigned int base, unsigned int shiftlen); + +u32 +krb5_derive_key(const struct gss_krb5_enctype *gk5e, +		const struct xdr_netobj *inkey, +		struct xdr_netobj *outkey, +		const struct xdr_netobj *in_constant, +		gfp_t gfp_mask); + +u32 +gss_krb5_des3_make_key(const struct gss_krb5_enctype *gk5e, +		       struct xdr_netobj *randombits, +		       struct xdr_netobj *key); + +u32 +gss_krb5_aes_make_key(const struct gss_krb5_enctype *gk5e, +		      struct xdr_netobj *randombits, +		      struct xdr_netobj *key); + +u32 +gss_krb5_aes_encrypt(struct krb5_ctx *kctx, u32 offset, +		     struct xdr_buf *buf, int ec, +		     struct page **pages); + +u32 +gss_krb5_aes_decrypt(struct krb5_ctx *kctx, u32 offset, +		     struct xdr_buf *buf, u32 *plainoffset, +		     u32 *plainlen); + +int +krb5_rc4_setup_seq_key(struct krb5_ctx *kctx, +		       struct crypto_blkcipher *cipher, +		       unsigned char *cksum); + +int +krb5_rc4_setup_enc_key(struct krb5_ctx *kctx, +		       struct crypto_blkcipher *cipher, +		       s32 seqnum); +void +gss_krb5_make_confounder(char *p, u32 conflen); diff --git a/include/linux/sunrpc/metrics.h b/include/linux/sunrpc/metrics.h index 77f78e56c48..b6edbc0ea83 100644 --- a/include/linux/sunrpc/metrics.h +++ b/include/linux/sunrpc/metrics.h @@ -26,6 +26,7 @@  #define _LINUX_SUNRPC_METRICS_H  #include <linux/seq_file.h> +#include <linux/ktime.h>  #define RPC_IOSTATS_VERS	"1.0" @@ -58,9 +59,9 @@ struct rpc_iostats {  	 * and the total time the request spent from init to release  	 * are measured.  	 */ -	unsigned long long	om_queue,	/* jiffies queued for xmit */ -				om_rtt,		/* jiffies for RPC RTT */ -				om_execute;	/* jiffies for RPC execution */ +	ktime_t			om_queue,	/* queued for xmit */ +				om_rtt,		/* RPC RTT */ +				om_execute;	/* RPC execution */  } ____cacheline_aligned;  struct rpc_task; diff --git a/include/linux/sunrpc/sched.h b/include/linux/sunrpc/sched.h index 7bc7fd5291c..7be4f3a6d24 100644 --- a/include/linux/sunrpc/sched.h +++ b/include/linux/sunrpc/sched.h @@ -10,6 +10,7 @@  #define _LINUX_SUNRPC_SCHED_H_  #include <linux/timer.h> +#include <linux/ktime.h>  #include <linux/sunrpc/types.h>  #include <linux/spinlock.h>  #include <linux/wait.h> @@ -40,21 +41,15 @@ struct rpc_wait {   * This is the RPC task struct   */  struct rpc_task { -#ifdef RPC_DEBUG -	unsigned long		tk_magic;	/* 0xf00baa */ -#endif  	atomic_t		tk_count;	/* Reference count */  	struct list_head	tk_task;	/* global list of tasks */  	struct rpc_clnt *	tk_client;	/* RPC client */  	struct rpc_rqst *	tk_rqstp;	/* RPC request */ -	int			tk_status;	/* result of last operation */  	/*  	 * RPC call state  	 */  	struct rpc_message	tk_msg;		/* RPC call info */ -	__u8			tk_garb_retry; -	__u8			tk_cred_retry;  	/*  	 * callback	to be executed after waking up @@ -67,7 +62,6 @@ struct rpc_task {  	void *			tk_calldata;  	unsigned long		tk_timeout;	/* timeout for rpc_sleep() */ -	unsigned short		tk_flags;	/* misc flags */  	unsigned long		tk_runstate;	/* Task run status */  	struct workqueue_struct	*tk_workqueue;	/* Normally rpciod, but could  						 * be any workqueue @@ -78,17 +72,19 @@ struct rpc_task {  		struct rpc_wait		tk_wait;	/* RPC wait */  	} u; -	unsigned short		tk_timeouts;	/* maj timeouts */ -	size_t			tk_bytes_sent;	/* total bytes sent */ -	unsigned long		tk_start;	/* RPC task init timestamp */ -	long			tk_rtt;		/* round-trip time (jiffies) */ +	ktime_t			tk_start;	/* RPC task init timestamp */  	pid_t			tk_owner;	/* Process id for batching tasks */ -	unsigned char		tk_priority : 2;/* Task priority */ +	int			tk_status;	/* result of last operation */ +	unsigned short		tk_flags;	/* misc flags */ +	unsigned short		tk_timeouts;	/* maj timeouts */  #ifdef RPC_DEBUG  	unsigned short		tk_pid;		/* debugging aid */  #endif +	unsigned char		tk_priority : 2,/* Task priority */ +				tk_garb_retry : 2, +				tk_cred_retry : 2;  };  #define tk_xprt			tk_client->cl_xprt diff --git a/include/linux/sunrpc/xdr.h b/include/linux/sunrpc/xdr.h index f5cc0898bc5..35cf2e8cd7c 100644 --- a/include/linux/sunrpc/xdr.h +++ b/include/linux/sunrpc/xdr.h @@ -1,7 +1,10 @@  /* - * include/linux/sunrpc/xdr.h + * XDR standard data types and function declarations   *   * Copyright (C) 1995-1997 Olaf Kirch <okir@monad.swb.de> + * + * Based on: + *   RFC 4506 "XDR: External Data Representation Standard", May 2006   */  #ifndef _SUNRPC_XDR_H_ @@ -62,7 +65,6 @@ struct xdr_buf {  	unsigned int	buflen,		/* Total length of storage buffer */  			len;		/* Length of XDR encoded message */ -  };  /* @@ -178,7 +180,7 @@ struct xdr_array2_desc {  };  extern int xdr_decode_array2(struct xdr_buf *buf, unsigned int base, -                             struct xdr_array2_desc *desc); +			     struct xdr_array2_desc *desc);  extern int xdr_encode_array2(struct xdr_buf *buf, unsigned int base,  			     struct xdr_array2_desc *desc); diff --git a/include/linux/sunrpc/xprt.h b/include/linux/sunrpc/xprt.h index 6f9457a75b8..b5147030239 100644 --- a/include/linux/sunrpc/xprt.h +++ b/include/linux/sunrpc/xprt.h @@ -13,6 +13,7 @@  #include <linux/socket.h>  #include <linux/in.h>  #include <linux/kref.h> +#include <linux/ktime.h>  #include <linux/sunrpc/sched.h>  #include <linux/sunrpc/xdr.h>  #include <linux/sunrpc/msg_prot.h> @@ -65,8 +66,6 @@ struct rpc_rqst {  	struct rpc_task *	rq_task;	/* RPC task data */  	__be32			rq_xid;		/* request XID */  	int			rq_cong;	/* has incremented xprt->cong */ -	int			rq_reply_bytes_recvd;	/* number of reply */ -							/* bytes received */  	u32			rq_seqno;	/* gss seq no. used on req. */  	int			rq_enc_pages_num;  	struct page		**rq_enc_pages;	/* scratch pages for use by @@ -77,12 +76,16 @@ struct rpc_rqst {  	__u32 *			rq_buffer;	/* XDR encode buffer */  	size_t			rq_callsize,  				rq_rcvsize; +	size_t			rq_xmit_bytes_sent;	/* total bytes sent */ +	size_t			rq_reply_bytes_recvd;	/* total reply bytes */ +							/* received */  	struct xdr_buf		rq_private_buf;		/* The receive buffer  							 * used in the softirq.  							 */  	unsigned long		rq_majortimeo;	/* major timeout alarm */  	unsigned long		rq_timeout;	/* Current timeout value */ +	ktime_t			rq_rtt;		/* round-trip time */  	unsigned int		rq_retries;	/* # of retries */  	unsigned int		rq_connect_cookie;  						/* A cookie used to track the @@ -94,7 +97,7 @@ struct rpc_rqst {  	 */  	u32			rq_bytes_sent;	/* Bytes we have sent */ -	unsigned long		rq_xtime;	/* when transmitted */ +	ktime_t			rq_xtime;	/* transmit time stamp */  	int			rq_ntrans;  #if defined(CONFIG_NFS_V4_1) @@ -174,8 +177,7 @@ struct rpc_xprt {  	/*  	 * Connection of transports  	 */ -	unsigned long		connect_timeout, -				bind_timeout, +	unsigned long		bind_timeout,  				reestablish_timeout;  	unsigned int		connect_cookie;	/* A cookie that gets bumped  						   every time the transport @@ -294,7 +296,6 @@ void			xprt_set_retrans_timeout_rtt(struct rpc_task *task);  void			xprt_wake_pending_tasks(struct rpc_xprt *xprt, int status);  void			xprt_wait_for_buffer_space(struct rpc_task *task, rpc_action action);  void			xprt_write_space(struct rpc_xprt *xprt); -void			xprt_update_rtt(struct rpc_task *task);  void			xprt_adjust_cwnd(struct rpc_task *task, int result);  struct rpc_rqst *	xprt_lookup_rqst(struct rpc_xprt *xprt, __be32 xid);  void			xprt_complete_rqst(struct rpc_task *task, int copied); diff --git a/include/linux/swap.h b/include/linux/swap.h index a2602a8207a..ff4acea9bbd 100644 --- a/include/linux/swap.h +++ b/include/linux/swap.h @@ -146,11 +146,13 @@ enum {  	SWP_DISCARDING	= (1 << 3),	/* now discarding a free cluster */  	SWP_SOLIDSTATE	= (1 << 4),	/* blkdev seeks are cheap */  	SWP_CONTINUED	= (1 << 5),	/* swap_map has count continuation */ +	SWP_BLKDEV	= (1 << 6),	/* its a block device */  					/* add others here before... */  	SWP_SCANNING	= (1 << 8),	/* refcount in scan_swap_map */  };  #define SWAP_CLUSTER_MAX 32 +#define COMPACT_CLUSTER_MAX SWAP_CLUSTER_MAX  #define SWAP_MAP_MAX	0x3e	/* Max duplication count, in first swap_map */  #define SWAP_MAP_BAD	0x3f	/* Note pageblock is bad, in first swap_map */ @@ -223,20 +225,15 @@ static inline void lru_cache_add_anon(struct page *page)  	__lru_cache_add(page, LRU_INACTIVE_ANON);  } -static inline void lru_cache_add_active_anon(struct page *page) -{ -	__lru_cache_add(page, LRU_ACTIVE_ANON); -} -  static inline void lru_cache_add_file(struct page *page)  {  	__lru_cache_add(page, LRU_INACTIVE_FILE);  } -static inline void lru_cache_add_active_file(struct page *page) -{ -	__lru_cache_add(page, LRU_ACTIVE_FILE); -} +/* LRU Isolation modes. */ +#define ISOLATE_INACTIVE 0	/* Isolate inactive pages. */ +#define ISOLATE_ACTIVE 1	/* Isolate active pages. */ +#define ISOLATE_BOTH 2		/* Isolate both active and inactive pages. */  /* linux/mm/vmscan.c */  extern unsigned long try_to_free_pages(struct zonelist *zonelist, int order, @@ -285,6 +282,11 @@ extern void kswapd_stop(int nid);  extern int shmem_unuse(swp_entry_t entry, struct page *page);  #endif /* CONFIG_MMU */ +#ifdef CONFIG_CGROUP_MEM_RES_CTLR +extern void mem_cgroup_get_shmem_target(struct inode *inode, pgoff_t pgoff, +					struct page **pagep, swp_entry_t *ent); +#endif +  extern void swap_unplug_io_fn(struct backing_dev_info *, struct page *);  #ifdef CONFIG_SWAP @@ -355,6 +357,7 @@ static inline void disable_swap_token(void)  #ifdef CONFIG_CGROUP_MEM_RES_CTLR  extern void  mem_cgroup_uncharge_swapcache(struct page *page, swp_entry_t ent, bool swapout); +extern int mem_cgroup_count_swap_user(swp_entry_t ent, struct page **pagep);  #else  static inline void  mem_cgroup_uncharge_swapcache(struct page *page, swp_entry_t ent, bool swapout) @@ -485,6 +488,14 @@ mem_cgroup_uncharge_swapcache(struct page *page, swp_entry_t ent)  {  } +#ifdef CONFIG_CGROUP_MEM_RES_CTLR +static inline int +mem_cgroup_count_swap_user(swp_entry_t ent, struct page **pagep) +{ +	return 0; +} +#endif +  #endif /* CONFIG_SWAP */  #endif /* __KERNEL__*/  #endif /* _LINUX_SWAP_H */ diff --git a/include/linux/swiotlb.h b/include/linux/swiotlb.h index febedcf67c7..81a4e213c6c 100644 --- a/include/linux/swiotlb.h +++ b/include/linux/swiotlb.h @@ -73,16 +73,6 @@ extern void  swiotlb_sync_sg_for_device(struct device *hwdev, struct scatterlist *sg,  			   int nelems, enum dma_data_direction dir); -extern void -swiotlb_sync_single_range_for_cpu(struct device *hwdev, dma_addr_t dev_addr, -				  unsigned long offset, size_t size, -				  enum dma_data_direction dir); - -extern void -swiotlb_sync_single_range_for_device(struct device *hwdev, dma_addr_t dev_addr, -				     unsigned long offset, size_t size, -				     enum dma_data_direction dir); -  extern int  swiotlb_dma_mapping_error(struct device *hwdev, dma_addr_t dma_addr); diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h index 207466a49f3..a1a86a53bc7 100644 --- a/include/linux/syscalls.h +++ b/include/linux/syscalls.h @@ -23,6 +23,7 @@ struct kexec_segment;  struct linux_dirent;  struct linux_dirent64;  struct list_head; +struct mmap_arg_struct;  struct msgbuf;  struct msghdr;  struct mmsghdr; @@ -30,10 +31,13 @@ struct msqid_ds;  struct new_utsname;  struct nfsctl_arg;  struct __old_kernel_stat; +struct oldold_utsname; +struct old_utsname;  struct pollfd;  struct rlimit;  struct rusage;  struct sched_param; +struct sel_arg_struct;  struct semaphore;  struct sembuf;  struct shmid_ds; @@ -99,22 +103,6 @@ struct perf_event_attr;  #define __SC_TEST5(t5, a5, ...)	__SC_TEST(t5); __SC_TEST4(__VA_ARGS__)  #define __SC_TEST6(t6, a6, ...)	__SC_TEST(t6); __SC_TEST5(__VA_ARGS__) -#ifdef CONFIG_EVENT_PROFILE - -#define TRACE_SYS_ENTER_PROFILE_INIT(sname)				       \ -	.profile_enable = prof_sysenter_enable,				       \ -	.profile_disable = prof_sysenter_disable, - -#define TRACE_SYS_EXIT_PROFILE_INIT(sname)				       \ -	.profile_enable = prof_sysexit_enable,				       \ -	.profile_disable = prof_sysexit_disable, -#else -#define TRACE_SYS_ENTER_PROFILE(sname) -#define TRACE_SYS_ENTER_PROFILE_INIT(sname) -#define TRACE_SYS_EXIT_PROFILE(sname) -#define TRACE_SYS_EXIT_PROFILE_INIT(sname) -#endif -  #ifdef CONFIG_FTRACE_SYSCALLS  #define __SC_STR_ADECL1(t, a)		#a  #define __SC_STR_ADECL2(t, a, ...)	#a, __SC_STR_ADECL1(__VA_ARGS__) @@ -130,54 +118,43 @@ struct perf_event_attr;  #define __SC_STR_TDECL5(t, a, ...)	#t, __SC_STR_TDECL4(__VA_ARGS__)  #define __SC_STR_TDECL6(t, a, ...)	#t, __SC_STR_TDECL5(__VA_ARGS__) +extern struct ftrace_event_class event_class_syscall_enter; +extern struct ftrace_event_class event_class_syscall_exit; +extern struct trace_event_functions enter_syscall_print_funcs; +extern struct trace_event_functions exit_syscall_print_funcs; +  #define SYSCALL_TRACE_ENTER_EVENT(sname)				\ -	static const struct syscall_metadata __syscall_meta_##sname;	\ -	static struct ftrace_event_call event_enter_##sname;		\ -	static struct trace_event enter_syscall_print_##sname = {	\ -		.trace                  = print_syscall_enter,		\ -	};								\ +	static struct syscall_metadata __syscall_meta_##sname;		\ +	static struct ftrace_event_call					\ +	__attribute__((__aligned__(4))) event_enter_##sname;		\  	static struct ftrace_event_call __used				\  	  __attribute__((__aligned__(4)))				\  	  __attribute__((section("_ftrace_events")))			\  	  event_enter_##sname = {					\  		.name                   = "sys_enter"#sname,		\ -		.system                 = "syscalls",			\ -		.event                  = &enter_syscall_print_##sname,	\ -		.raw_init		= trace_event_raw_init,		\ -		.show_format		= syscall_enter_format,		\ -		.define_fields		= syscall_enter_define_fields,	\ -		.regfunc		= reg_event_syscall_enter,	\ -		.unregfunc		= unreg_event_syscall_enter,	\ +		.class			= &event_class_syscall_enter,	\ +		.event.funcs            = &enter_syscall_print_funcs,	\  		.data			= (void *)&__syscall_meta_##sname,\ -		TRACE_SYS_ENTER_PROFILE_INIT(sname)			\  	}  #define SYSCALL_TRACE_EXIT_EVENT(sname)					\ -	static const struct syscall_metadata __syscall_meta_##sname;	\ -	static struct ftrace_event_call event_exit_##sname;		\ -	static struct trace_event exit_syscall_print_##sname = {	\ -		.trace                  = print_syscall_exit,		\ -	};								\ +	static struct syscall_metadata __syscall_meta_##sname;		\ +	static struct ftrace_event_call					\ +	__attribute__((__aligned__(4))) event_exit_##sname;		\  	static struct ftrace_event_call __used				\  	  __attribute__((__aligned__(4)))				\  	  __attribute__((section("_ftrace_events")))			\  	  event_exit_##sname = {					\  		.name                   = "sys_exit"#sname,		\ -		.system                 = "syscalls",			\ -		.event                  = &exit_syscall_print_##sname,	\ -		.raw_init		= trace_event_raw_init,		\ -		.show_format		= syscall_exit_format,		\ -		.define_fields		= syscall_exit_define_fields,	\ -		.regfunc		= reg_event_syscall_exit,	\ -		.unregfunc		= unreg_event_syscall_exit,	\ +		.class			= &event_class_syscall_exit,	\ +		.event.funcs		= &exit_syscall_print_funcs,	\  		.data			= (void *)&__syscall_meta_##sname,\ -		TRACE_SYS_EXIT_PROFILE_INIT(sname)			\  	}  #define SYSCALL_METADATA(sname, nb)				\  	SYSCALL_TRACE_ENTER_EVENT(sname);			\  	SYSCALL_TRACE_EXIT_EVENT(sname);			\ -	static const struct syscall_metadata __used		\ +	static struct syscall_metadata __used			\  	  __attribute__((__aligned__(4)))			\  	  __attribute__((section("__syscalls_metadata")))	\  	  __syscall_meta_##sname = {				\ @@ -187,12 +164,14 @@ struct perf_event_attr;  		.args		= args_##sname,			\  		.enter_event	= &event_enter_##sname,		\  		.exit_event	= &event_exit_##sname,		\ +		.enter_fields	= LIST_HEAD_INIT(__syscall_meta_##sname.enter_fields), \ +		.exit_fields	= LIST_HEAD_INIT(__syscall_meta_##sname.exit_fields), \  	};  #define SYSCALL_DEFINE0(sname)					\  	SYSCALL_TRACE_ENTER_EVENT(_##sname);			\  	SYSCALL_TRACE_EXIT_EVENT(_##sname);			\ -	static const struct syscall_metadata __used		\ +	static struct syscall_metadata __used			\  	  __attribute__((__aligned__(4)))			\  	  __attribute__((section("__syscalls_metadata")))	\  	  __syscall_meta__##sname = {				\ @@ -200,6 +179,8 @@ struct perf_event_attr;  		.nb_args 	= 0,				\  		.enter_event	= &event_enter__##sname,	\  		.exit_event	= &event_exit__##sname,		\ +		.enter_fields	= LIST_HEAD_INIT(__syscall_meta__##sname.enter_fields), \ +		.exit_fields	= LIST_HEAD_INIT(__syscall_meta__##sname.exit_fields), \  	};							\  	asmlinkage long sys_##sname(void)  #else @@ -638,6 +619,7 @@ asmlinkage long sys_poll(struct pollfd __user *ufds, unsigned int nfds,  				long timeout);  asmlinkage long sys_select(int n, fd_set __user *inp, fd_set __user *outp,  			fd_set __user *exp, struct timeval __user *tvp); +asmlinkage long sys_old_select(struct sel_arg_struct __user *arg);  asmlinkage long sys_epoll_create(int size);  asmlinkage long sys_epoll_create1(int flags);  asmlinkage long sys_epoll_ctl(int epfd, int op, int fd, @@ -652,6 +634,8 @@ asmlinkage long sys_gethostname(char __user *name, int len);  asmlinkage long sys_sethostname(char __user *name, int len);  asmlinkage long sys_setdomainname(char __user *name, int len);  asmlinkage long sys_newuname(struct new_utsname __user *name); +asmlinkage long sys_uname(struct old_utsname __user *); +asmlinkage long sys_olduname(struct oldold_utsname __user *);  asmlinkage long sys_getrlimit(unsigned int resource,  				struct rlimit __user *rlim); @@ -681,6 +665,8 @@ asmlinkage long sys_shmat(int shmid, char __user *shmaddr, int shmflg);  asmlinkage long sys_shmget(key_t key, size_t size, int flag);  asmlinkage long sys_shmdt(char __user *shmaddr);  asmlinkage long sys_shmctl(int shmid, int cmd, struct shmid_ds __user *buf); +asmlinkage long sys_ipc(unsigned int call, int first, unsigned long second, +		unsigned long third, void __user *ptr, long fifth);  asmlinkage long sys_mq_open(const char __user *name, int oflag, mode_t mode, struct mq_attr __user *attr);  asmlinkage long sys_mq_unlink(const char __user *name); @@ -836,4 +822,6 @@ asmlinkage long sys_perf_event_open(  asmlinkage long sys_mmap_pgoff(unsigned long addr, unsigned long len,  			unsigned long prot, unsigned long flags,  			unsigned long fd, unsigned long pgoff); +asmlinkage long sys_old_mmap(struct mmap_arg_struct __user *arg); +  #endif diff --git a/include/linux/sysctl.h b/include/linux/sysctl.h index bd27fbc9db6..7bb5cb64f3b 100644 --- a/include/linux/sysctl.h +++ b/include/linux/sysctl.h @@ -481,9 +481,6 @@ enum  	NET_IPV4_CONF_PROMOTE_SECONDARIES=20,  	NET_IPV4_CONF_ARP_ACCEPT=21,  	NET_IPV4_CONF_ARP_NOTIFY=22, -	NET_IPV4_CONF_ACCEPT_LOCAL=23, -	NET_IPV4_CONF_SRC_VMARK=24, -	__NET_IPV4_CONF_MAX  };  /* /proc/sys/net/ipv4/netfilter */ @@ -599,7 +596,6 @@ enum {  	NET_NEIGH_GC_THRESH3=16,  	NET_NEIGH_RETRANS_TIME_MS=17,  	NET_NEIGH_REACHABLE_TIME_MS=18, -	__NET_NEIGH_MAX  };  /* /proc/sys/net/dccp */ @@ -984,6 +980,8 @@ extern int proc_doulongvec_minmax(struct ctl_table *, int,  				  void __user *, size_t *, loff_t *);  extern int proc_doulongvec_ms_jiffies_minmax(struct ctl_table *table, int,  				      void __user *, size_t *, loff_t *); +extern int proc_do_large_bitmap(struct ctl_table *, int, +				void __user *, size_t *, loff_t *);  /*   * Register a set of sysctl names by calling register_sysctl_table diff --git a/include/linux/sysdev.h b/include/linux/sysdev.h index f395bb3fa2f..1154c29f410 100644 --- a/include/linux/sysdev.h +++ b/include/linux/sysdev.h @@ -27,10 +27,12 @@  struct sys_device; +struct sysdev_class_attribute;  struct sysdev_class {  	const char *name;  	struct list_head	drivers; +	struct sysdev_class_attribute **attrs;  	/* Default operations for these types of devices */  	int	(*shutdown)(struct sys_device *); @@ -41,8 +43,10 @@ struct sysdev_class {  struct sysdev_class_attribute {  	struct attribute attr; -	ssize_t (*show)(struct sysdev_class *, char *); -	ssize_t (*store)(struct sysdev_class *, const char *, size_t); +	ssize_t (*show)(struct sysdev_class *, struct sysdev_class_attribute *, +			char *); +	ssize_t (*store)(struct sysdev_class *, struct sysdev_class_attribute *, +			 const char *, size_t);  };  #define _SYSDEV_CLASS_ATTR(_name,_mode,_show,_store) 		\ @@ -119,6 +123,19 @@ struct sysdev_attribute {  extern int sysdev_create_file(struct sys_device *, struct sysdev_attribute *);  extern void sysdev_remove_file(struct sys_device *, struct sysdev_attribute *); +/* Create/remove NULL terminated attribute list */ +static inline int +sysdev_create_files(struct sys_device *d, struct sysdev_attribute **a) +{ +	return sysfs_create_files(&d->kobj, (const struct attribute **)a); +} + +static inline void +sysdev_remove_files(struct sys_device *d, struct sysdev_attribute **a) +{ +	return sysfs_remove_files(&d->kobj, (const struct attribute **)a); +} +  struct sysdev_ext_attribute {  	struct sysdev_attribute attr;  	void *var; diff --git a/include/linux/sysfs.h b/include/linux/sysfs.h index cfa83083a2d..f2694eb4dd3 100644 --- a/include/linux/sysfs.h +++ b/include/linux/sysfs.h @@ -15,10 +15,12 @@  #include <linux/compiler.h>  #include <linux/errno.h>  #include <linux/list.h> +#include <linux/lockdep.h>  #include <asm/atomic.h>  struct kobject;  struct module; +enum kobj_ns_type;  /* FIXME   * The *owner field is no longer used. @@ -29,8 +31,33 @@ struct attribute {  	const char		*name;  	struct module		*owner;  	mode_t			mode; +#ifdef CONFIG_DEBUG_LOCK_ALLOC +	struct lock_class_key	*key; +	struct lock_class_key	skey; +#endif  }; +/** + *	sysfs_attr_init - initialize a dynamically allocated sysfs attribute + *	@attr: struct attribute to initialize + * + *	Initialize a dynamically allocated struct attribute so we can + *	make lockdep happy.  This is a new requirement for attributes + *	and initially this is only needed when lockdep is enabled. + *	Lockdep gives a nice error when your attribute is added to + *	sysfs if you don't have this. + */ +#ifdef CONFIG_DEBUG_LOCK_ALLOC +#define sysfs_attr_init(attr)				\ +do {							\ +	static struct lock_class_key __key;		\ +							\ +	(attr)->key = &__key;				\ +} while(0) +#else +#define sysfs_attr_init(attr) do {} while(0) +#endif +  struct attribute_group {  	const char		*name;  	mode_t			(*is_visible)(struct kobject *, @@ -60,20 +87,33 @@ struct attribute_group {  #define attr_name(_attr) (_attr).attr.name +struct file;  struct vm_area_struct;  struct bin_attribute {  	struct attribute	attr;  	size_t			size;  	void			*private; -	ssize_t (*read)(struct kobject *, struct bin_attribute *, +	ssize_t (*read)(struct file *, struct kobject *, struct bin_attribute *,  			char *, loff_t, size_t); -	ssize_t (*write)(struct kobject *, struct bin_attribute *, +	ssize_t (*write)(struct file *,struct kobject *, struct bin_attribute *,  			 char *, loff_t, size_t); -	int (*mmap)(struct kobject *, struct bin_attribute *attr, +	int (*mmap)(struct file *, struct kobject *, struct bin_attribute *attr,  		    struct vm_area_struct *vma);  }; +/** + *	sysfs_bin_attr_init - initialize a dynamically allocated bin_attribute + *	@attr: struct bin_attribute to initialize + * + *	Initialize a dynamically allocated struct bin_attribute so we + *	can make lockdep happy.  This is a new requirement for + *	attributes and initially this is only needed when lockdep is + *	enabled.  Lockdep gives a nice error when your attribute is + *	added to sysfs if you don't have this. + */ +#define sysfs_bin_attr_init(bin_attr) sysfs_attr_init(&(bin_attr)->attr) +  struct sysfs_ops {  	ssize_t	(*show)(struct kobject *, struct attribute *,char *);  	ssize_t	(*store)(struct kobject *,struct attribute *,const char *, size_t); @@ -94,9 +134,12 @@ int __must_check sysfs_move_dir(struct kobject *kobj,  int __must_check sysfs_create_file(struct kobject *kobj,  				   const struct attribute *attr); +int __must_check sysfs_create_files(struct kobject *kobj, +				   const struct attribute **attr);  int __must_check sysfs_chmod_file(struct kobject *kobj, struct attribute *attr,  				  mode_t mode);  void sysfs_remove_file(struct kobject *kobj, const struct attribute *attr); +void sysfs_remove_files(struct kobject *kobj, const struct attribute **attr);  int __must_check sysfs_create_bin_file(struct kobject *kobj,  				       const struct bin_attribute *attr); @@ -110,6 +153,12 @@ int __must_check sysfs_create_link_nowarn(struct kobject *kobj,  					  const char *name);  void sysfs_remove_link(struct kobject *kobj, const char *name); +int sysfs_rename_link(struct kobject *kobj, struct kobject *target, +			const char *old_name, const char *new_name); + +void sysfs_delete_link(struct kobject *dir, struct kobject *targ, +			const char *name); +  int __must_check sysfs_create_group(struct kobject *kobj,  				    const struct attribute_group *grp);  int sysfs_update_group(struct kobject *kobj, @@ -124,10 +173,15 @@ void sysfs_remove_file_from_group(struct kobject *kobj,  void sysfs_notify(struct kobject *kobj, const char *dir, const char *attr);  void sysfs_notify_dirent(struct sysfs_dirent *sd);  struct sysfs_dirent *sysfs_get_dirent(struct sysfs_dirent *parent_sd, +				      const void *ns,  				      const unsigned char *name);  struct sysfs_dirent *sysfs_get(struct sysfs_dirent *sd);  void sysfs_put(struct sysfs_dirent *sd);  void sysfs_printk_last_file(void); + +/* Called to clear a ns tag when it is no longer valid */ +void sysfs_exit_ns(enum kobj_ns_type type, const void *tag); +  int __must_check sysfs_init(void);  #else /* CONFIG_SYSFS */ @@ -164,6 +218,12 @@ static inline int sysfs_create_file(struct kobject *kobj,  	return 0;  } +static inline int sysfs_create_files(struct kobject *kobj, +				    const struct attribute **attr) +{ +	return 0; +} +  static inline int sysfs_chmod_file(struct kobject *kobj,  				   struct attribute *attr, mode_t mode)  { @@ -175,6 +235,11 @@ static inline void sysfs_remove_file(struct kobject *kobj,  {  } +static inline void sysfs_remove_files(struct kobject *kobj, +				     const struct attribute **attr) +{ +} +  static inline int sysfs_create_bin_file(struct kobject *kobj,  					const struct bin_attribute *attr)  { @@ -203,6 +268,17 @@ static inline void sysfs_remove_link(struct kobject *kobj, const char *name)  {  } +static inline int sysfs_rename_link(struct kobject *k, struct kobject *t, +				    const char *old_name, const char *new_name) +{ +	return 0; +} + +static inline void sysfs_delete_link(struct kobject *k, struct kobject *t, +				     const char *name) +{ +} +  static inline int sysfs_create_group(struct kobject *kobj,  				     const struct attribute_group *grp)  { @@ -240,6 +316,7 @@ static inline void sysfs_notify_dirent(struct sysfs_dirent *sd)  }  static inline  struct sysfs_dirent *sysfs_get_dirent(struct sysfs_dirent *parent_sd, +				      const void *ns,  				      const unsigned char *name)  {  	return NULL; @@ -252,6 +329,10 @@ static inline void sysfs_put(struct sysfs_dirent *sd)  {  } +static inline void sysfs_exit_ns(int type, const void *tag) +{ +} +  static inline int __must_check sysfs_init(void)  {  	return 0; diff --git a/include/linux/syslog.h b/include/linux/syslog.h new file mode 100644 index 00000000000..38911391a13 --- /dev/null +++ b/include/linux/syslog.h @@ -0,0 +1,52 @@ +/*  Syslog internals + * + *  Copyright 2010 Canonical, Ltd. + *  Author: Kees Cook <kees.cook@canonical.com> + * + *  This program is free software; you can redistribute it and/or modify + *  it under the terms of the GNU General Public License as published by + *  the Free Software Foundation; either version 2, or (at your option) + *  any later version. + * + *  This program is distributed in the hope that it will be useful, + *  but WITHOUT ANY WARRANTY; without even the implied warranty of + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + *  GNU General Public License for more details. + * + *  You should have received a copy of the GNU General Public License + *  along with this program; see the file COPYING.  If not, write to + *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#ifndef _LINUX_SYSLOG_H +#define _LINUX_SYSLOG_H + +/* Close the log.  Currently a NOP. */ +#define SYSLOG_ACTION_CLOSE          0 +/* Open the log. Currently a NOP. */ +#define SYSLOG_ACTION_OPEN           1 +/* Read from the log. */ +#define SYSLOG_ACTION_READ           2 +/* Read all messages remaining in the ring buffer. */ +#define SYSLOG_ACTION_READ_ALL       3 +/* Read and clear all messages remaining in the ring buffer */ +#define SYSLOG_ACTION_READ_CLEAR     4 +/* Clear ring buffer. */ +#define SYSLOG_ACTION_CLEAR          5 +/* Disable printk's to console */ +#define SYSLOG_ACTION_CONSOLE_OFF    6 +/* Enable printk's to console */ +#define SYSLOG_ACTION_CONSOLE_ON     7 +/* Set level of messages printed to console */ +#define SYSLOG_ACTION_CONSOLE_LEVEL  8 +/* Return number of unread characters in the log buffer */ +#define SYSLOG_ACTION_SIZE_UNREAD    9 +/* Return size of the log buffer */ +#define SYSLOG_ACTION_SIZE_BUFFER   10 + +#define SYSLOG_FROM_CALL 0 +#define SYSLOG_FROM_FILE 1 + +int do_syslog(int type, char __user *buf, int count, bool from_file); + +#endif /* _LINUX_SYSLOG_H */ diff --git a/include/linux/sysrq.h b/include/linux/sysrq.h index 99adcdc0d3c..4496322e28d 100644 --- a/include/linux/sysrq.h +++ b/include/linux/sysrq.h @@ -39,41 +39,34 @@ struct sysrq_key_op {  #ifdef CONFIG_MAGIC_SYSRQ -extern int sysrq_on(void); - -/* - * Do not use this one directly: - */ -extern int __sysrq_enabled; -  /* Generic SysRq interface -- you may call it from any device driver, supplying   * ASCII code of the key, pointer to registers and kbd/tty structs (if they   * are available -- else NULL's).   */  void handle_sysrq(int key, struct tty_struct *tty); -void __handle_sysrq(int key, struct tty_struct *tty, int check_mask);  int register_sysrq_key(int key, struct sysrq_key_op *op);  int unregister_sysrq_key(int key, struct sysrq_key_op *op);  struct sysrq_key_op *__sysrq_get_key_op(int key); +int sysrq_toggle_support(int enable_mask); +  #else -static inline int sysrq_on(void) +static inline void handle_sysrq(int key, struct tty_struct *tty)  { -	return 0;  } -static inline int __reterr(void) + +static inline int register_sysrq_key(int key, struct sysrq_key_op *op)  {  	return -EINVAL;  } -static inline void handle_sysrq(int key, struct tty_struct *tty) + +static inline int unregister_sysrq_key(int key, struct sysrq_key_op *op)  { +	return -EINVAL;  } -#define register_sysrq_key(ig,nore) __reterr() -#define unregister_sysrq_key(ig,nore) __reterr() -  #endif  #endif /* _LINUX_SYSRQ_H */ diff --git a/include/linux/taskstats_kern.h b/include/linux/taskstats_kern.h index 3398f455326..58de6edf751 100644 --- a/include/linux/taskstats_kern.h +++ b/include/linux/taskstats_kern.h @@ -9,16 +9,12 @@  #include <linux/taskstats.h>  #include <linux/sched.h> +#include <linux/slab.h>  #ifdef CONFIG_TASKSTATS  extern struct kmem_cache *taskstats_cache;  extern struct mutex taskstats_exit_mutex; -static inline void taskstats_tgid_init(struct signal_struct *sig) -{ -	sig->stats = NULL; -} -  static inline void taskstats_tgid_free(struct signal_struct *sig)  {  	if (sig->stats) @@ -30,8 +26,6 @@ extern void taskstats_init_early(void);  #else  static inline void taskstats_exit(struct task_struct *tsk, int group_dead)  {} -static inline void taskstats_tgid_init(struct signal_struct *sig) -{}  static inline void taskstats_tgid_free(struct signal_struct *sig)  {}  static inline void taskstats_init_early(void) diff --git a/include/linux/tboot.h b/include/linux/tboot.h index bf2a0c74887..1dba6ee5520 100644 --- a/include/linux/tboot.h +++ b/include/linux/tboot.h @@ -150,6 +150,7 @@ extern int tboot_force_iommu(void);  #else +#define tboot_enabled()			0  #define tboot_probe()			do { } while (0)  #define tboot_shutdown(shutdown_type)	do { } while (0)  #define tboot_sleep(sleep_state, pm1a_control, pm1b_control)	\ diff --git a/include/linux/tca6416_keypad.h b/include/linux/tca6416_keypad.h new file mode 100644 index 00000000000..7bd266f3525 --- /dev/null +++ b/include/linux/tca6416_keypad.h @@ -0,0 +1,34 @@ +/* + * tca6416 keypad platform support + * + * Copyright (C) 2010 Texas Instruments + * + * Author: Sriramakrishnan <srk@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 _TCA6416_KEYS_H +#define _TCA6416_KEYS_H + +#include <linux/types.h> + +struct tca6416_button { +	/* Configuration parameters */ +	int code;		/* input event code (KEY_*, SW_*) */ +	int active_low; +	int type;		/* input event type (EV_KEY, EV_SW) */ +}; + +struct tca6416_keys_platform_data { +	struct tca6416_button *buttons; +	int nbuttons; +	unsigned int rep:1;	/* enable input subsystem auto repeat */ +	uint16_t pinmask; +	uint16_t invert; +	int irq_is_gpio; +	int use_polling;	/* use polling if Interrupt is not connected*/ +}; +#endif diff --git a/include/linux/tcp.h b/include/linux/tcp.h index 7fee8a4df93..a778ee02459 100644 --- a/include/linux/tcp.h +++ b/include/linux/tcp.h @@ -103,6 +103,8 @@ enum {  #define TCP_CONGESTION		13	/* Congestion control algorithm */  #define TCP_MD5SIG		14	/* TCP MD5 Signature (RFC2385) */  #define TCP_COOKIE_TRANSACTIONS	15	/* TCP Cookie Transactions */ +#define TCP_THIN_LINEAR_TIMEOUTS 16      /* Use linear timeouts for thin streams*/ +#define TCP_THIN_DUPACK         17      /* Fast retrans. after 1 dupack */  /* for TCP_INFO socket option */  #define TCPI_OPT_TIMESTAMPS	1 @@ -340,7 +342,10 @@ struct tcp_sock {  	u32	frto_highmark;	/* snd_nxt when RTO occurred */  	u16	advmss;		/* Advertised MSS			*/  	u8	frto_counter;	/* Number of new acks after RTO */ -	u8	nonagle;	/* Disable Nagle algorithm?             */ +	u8	nonagle     : 4,/* Disable Nagle algorithm?             */ +		thin_lto    : 1,/* Use linear timeouts for thin streams */ +		thin_dupack : 1,/* Fast retransmit on first dupack      */ +		unused      : 2;  /* RTT measurement */  	u32	srtt;		/* smoothed round trip time << 3	*/ diff --git a/include/linux/threads.h b/include/linux/threads.h index 052b12bec8b..383ab9592be 100644 --- a/include/linux/threads.h +++ b/include/linux/threads.h @@ -33,4 +33,13 @@  #define PID_MAX_LIMIT (CONFIG_BASE_SMALL ? PAGE_SIZE * 8 : \  	(sizeof(long) > 4 ? 4 * 1024 * 1024 : PID_MAX_DEFAULT)) +/* + * Define a minimum number of pids per cpu.  Heuristically based + * on original pid max of 32k for 32 cpus.  Also, increase the + * minimum settable value for pid_max on the running system based + * on similar defaults.  See kernel/pid.c:pidmap_init() for details. + */ +#define PIDS_PER_CPU_DEFAULT	1024 +#define PIDS_PER_CPU_MIN	8 +  #endif diff --git a/include/linux/tick.h b/include/linux/tick.h index d2ae79e21be..b232ccc0ee2 100644 --- a/include/linux/tick.h +++ b/include/linux/tick.h @@ -42,6 +42,7 @@ enum tick_nohz_mode {   * @idle_waketime:	Time when the idle was interrupted   * @idle_exittime:	Time when the idle state was left   * @idle_sleeptime:	Sum of the time slept in idle with sched tick stopped + * @iowait_sleeptime:	Sum of the time slept in idle with sched tick stopped, with IO outstanding   * @sleep_length:	Duration of the current idle sleep   * @do_timer_lst:	CPU was the last one doing do_timer before going idle   */ @@ -60,7 +61,7 @@ struct tick_sched {  	ktime_t				idle_waketime;  	ktime_t				idle_exittime;  	ktime_t				idle_sleeptime; -	ktime_t				idle_lastupdate; +	ktime_t				iowait_sleeptime;  	ktime_t				sleep_length;  	unsigned long			last_jiffies;  	unsigned long			next_jiffies; @@ -124,6 +125,7 @@ extern void tick_nohz_stop_sched_tick(int inidle);  extern void tick_nohz_restart_sched_tick(void);  extern ktime_t tick_nohz_get_sleep_length(void);  extern u64 get_cpu_idle_time_us(int cpu, u64 *last_update_time); +extern u64 get_cpu_iowait_time_us(int cpu, u64 *last_update_time);  # else  static inline void tick_nohz_stop_sched_tick(int inidle) { }  static inline void tick_nohz_restart_sched_tick(void) { } @@ -134,6 +136,7 @@ static inline ktime_t tick_nohz_get_sleep_length(void)  	return len;  }  static inline u64 get_cpu_idle_time_us(int cpu, u64 *unused) { return -1; } +static inline u64 get_cpu_iowait_time_us(int cpu, u64 *unused) { return -1; }  # endif /* !NO_HZ */  #endif diff --git a/include/linux/timb_dma.h b/include/linux/timb_dma.h new file mode 100644 index 00000000000..bb043e970b9 --- /dev/null +++ b/include/linux/timb_dma.h @@ -0,0 +1,55 @@ +/* + * timb_dma.h timberdale FPGA DMA driver defines + * Copyright (c) 2010 Intel Corporation + * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +/* Supports: + * Timberdale FPGA DMA engine + */ + +#ifndef _LINUX_TIMB_DMA_H +#define _LINUX_TIMB_DMA_H + +/** + * struct timb_dma_platform_data_channel - Description of each individual + *	DMA channel for the timberdale DMA driver + * @rx:			true if this channel handles data in the direction to + *	the CPU. + * @bytes_per_line:	Number of bytes per line, this is specific for channels + *	handling video data. For other channels this shall be left to 0. + * @descriptors:	Number of descriptors to allocate for this channel. + * @descriptor_elements: Number of elements in each descriptor. + * + */ +struct timb_dma_platform_data_channel { +	bool rx; +	unsigned int bytes_per_line; +	unsigned int descriptors; +	unsigned int descriptor_elements; +}; + +/** + * struct timb_dma_platform_data - Platform data of the timberdale DMA driver + * @nr_channels:	Number of defined channels in the channels array. + * @channels:		Definition of the each channel. + * + */ +struct timb_dma_platform_data { +	unsigned nr_channels; +	struct timb_dma_platform_data_channel channels[32]; +}; + +#endif diff --git a/include/linux/time.h b/include/linux/time.h index 6e026e45a17..ea3559f0b3f 100644 --- a/include/linux/time.h +++ b/include/linux/time.h @@ -150,7 +150,6 @@ extern struct timespec timespec_trunc(struct timespec t, unsigned gran);  extern int timekeeping_valid_for_hres(void);  extern u64 timekeeping_max_deferment(void);  extern void update_wall_time(void); -extern void update_xtime_cache(u64 nsec);  extern void timekeeping_leap_insert(int leapsecond);  struct tms; diff --git a/include/linux/timer.h b/include/linux/timer.h index a2d1eb6cb3f..ea965b857a5 100644 --- a/include/linux/timer.h +++ b/include/linux/timer.h @@ -10,13 +10,19 @@  struct tvec_base;  struct timer_list { +	/* +	 * All fields that change during normal runtime grouped to the +	 * same cacheline +	 */  	struct list_head entry;  	unsigned long expires; +	struct tvec_base *base;  	void (*function)(unsigned long);  	unsigned long data; -	struct tvec_base *base; +	int slack; +  #ifdef CONFIG_TIMER_STATS  	void *start_site;  	char start_comm[16]; @@ -165,6 +171,8 @@ extern int mod_timer(struct timer_list *timer, unsigned long expires);  extern int mod_timer_pending(struct timer_list *timer, unsigned long expires);  extern int mod_timer_pinned(struct timer_list *timer, unsigned long expires); +extern void set_timer_slack(struct timer_list *time, int slack_hz); +  #define TIMER_NOT_PINNED	0  #define TIMER_PINNED		1  /* diff --git a/include/linux/timex.h b/include/linux/timex.h index 94f8faecdcb..32d852f8cbe 100644 --- a/include/linux/timex.h +++ b/include/linux/timex.h @@ -232,16 +232,11 @@ struct timex {   */  extern unsigned long tick_usec;		/* USER_HZ period (usec) */  extern unsigned long tick_nsec;		/* ACTHZ          period (nsec) */ -extern int tickadj;			/* amount of adjustment per tick */  /*   * phase-lock loop variables   */  extern int time_status;		/* clock synchronization status bits */ -extern long time_maxerror;	/* maximum error */ -extern long time_esterror;	/* estimated error */ - -extern long time_adjust;	/* The amount of adjtime left */  extern void ntp_init(void);  extern void ntp_clear(void); @@ -274,9 +269,6 @@ extern void second_overflow(void);  extern void update_ntp_one_tick(void);  extern int do_adjtimex(struct timex *); -/* Don't use! Compatibility define for existing users. */ -#define tickadj	(500/HZ ? : 1) -  int read_current_timer(unsigned long *timer_val);  /* The clock frequency of the i8253/i8254 PIT */ diff --git a/include/linux/tipc.h b/include/linux/tipc.h index 3d92396639d..181c8d0e6f7 100644 --- a/include/linux/tipc.h +++ b/include/linux/tipc.h @@ -107,7 +107,7 @@ static inline unsigned int tipc_node(__u32 addr)   * Message importance levels   */ -#define TIPC_LOW_IMPORTANCE		0  /* default */ +#define TIPC_LOW_IMPORTANCE		0  #define TIPC_MEDIUM_IMPORTANCE		1  #define TIPC_HIGH_IMPORTANCE		2  #define TIPC_CRITICAL_IMPORTANCE	3 @@ -127,23 +127,17 @@ static inline unsigned int tipc_node(__u32 addr)   * TIPC topology subscription service definitions   */ -#define TIPC_SUB_PORTS     	0x01  	/* filter for port availability */ -#define TIPC_SUB_SERVICE     	0x02  	/* filter for service availability */ -#define TIPC_SUB_CANCEL         0x04    /* cancel a subscription */ -#if 0 -/* The following filter options are not currently implemented */ -#define TIPC_SUB_NO_BIND_EVTS	0x04	/* filter out "publish" events */ -#define TIPC_SUB_NO_UNBIND_EVTS	0x08	/* filter out "withdraw" events */ -#define TIPC_SUB_SINGLE_EVT	0x10	/* expire after first event */ -#endif +#define TIPC_SUB_SERVICE     	0x00  	/* Filter for service availability    */ +#define TIPC_SUB_PORTS     	0x01  	/* Filter for port availability  */ +#define TIPC_SUB_CANCEL         0x04    /* Cancel a subscription         */  #define TIPC_WAIT_FOREVER	~0	/* timeout for permanent subscription */  struct tipc_subscr { -	struct tipc_name_seq seq;	/* name sequence of interest */ -	__u32 timeout;			/* subscription duration (in ms) */ -        __u32 filter;   		/* bitmask of filter options */ -	char usr_handle[8];		/* available for subscriber use */ +	struct tipc_name_seq seq;	/* NBO. Name sequence of interest */ +	__u32 timeout;			/* NBO. Subscription duration (in ms) */ +        __u32 filter;   		/* NBO. Bitmask of filter options */ +	char usr_handle[8];		/* Opaque. Available for subscriber use */  };  #define TIPC_PUBLISHED		1	/* publication event */ @@ -151,11 +145,11 @@ struct tipc_subscr {  #define TIPC_SUBSCR_TIMEOUT	3	/* subscription timeout event */  struct tipc_event { -	__u32 event;			/* event type */ -	__u32 found_lower;		/* matching name seq instances */ -	__u32 found_upper;		/*    "      "    "     "      */ -	struct tipc_portid port;	/* associated port */ -	struct tipc_subscr s;		/* associated subscription */ +	__u32 event;			/* NBO. Event type, as defined above */ +	__u32 found_lower;		/* NBO. Matching name seq instances  */ +	__u32 found_upper;		/*  "      "       "   "    "        */ +	struct tipc_portid port;	/* NBO. Associated port              */ +	struct tipc_subscr s;		/* Original, associated subscription */  };  /* @@ -188,7 +182,7 @@ struct sockaddr_tipc {  		struct tipc_name_seq nameseq;  		struct {  			struct tipc_name name; -			__u32 domain; /* 0: own zone */ +			__u32 domain;  		} name;  	} addr;  }; @@ -206,7 +200,7 @@ struct sockaddr_tipc {   */  #define TIPC_IMPORTANCE		127	/* Default: TIPC_LOW_IMPORTANCE */ -#define TIPC_SRC_DROPPABLE	128	/* Default: 0 (resend congested msg) */ +#define TIPC_SRC_DROPPABLE	128	/* Default: based on socket type */  #define TIPC_DEST_DROPPABLE	129	/* Default: based on socket type */  #define TIPC_CONN_TIMEOUT	130	/* Default: 8000 (ms)  */  #define TIPC_NODE_RECVQ_DEPTH	131	/* Default: none (read only) */ diff --git a/include/linux/tipc_config.h b/include/linux/tipc_config.h index 2bc6fa4adeb..9cde86c3241 100644 --- a/include/linux/tipc_config.h +++ b/include/linux/tipc_config.h @@ -74,6 +74,7 @@  #define  TIPC_CMD_SHOW_NAME_TABLE   0x0005    /* tx name_tbl_query, rx ultra_string */  #define  TIPC_CMD_SHOW_PORTS        0x0006    /* tx none, rx ultra_string */  #define  TIPC_CMD_SHOW_LINK_STATS   0x000B    /* tx link_name, rx ultra_string */ +#define  TIPC_CMD_SHOW_STATS        0x000F    /* tx unsigned, rx ultra_string */  #if 0  #define  TIPC_CMD_SHOW_PORT_STATS   0x0008    /* tx port_ref, rx ultra_string */ diff --git a/include/linux/topology.h b/include/linux/topology.h index 5b81156780b..c44df50a05a 100644 --- a/include/linux/topology.h +++ b/include/linux/topology.h @@ -31,6 +31,7 @@  #include <linux/bitops.h>  #include <linux/mmzone.h>  #include <linux/smp.h> +#include <linux/percpu.h>  #include <asm/topology.h>  #ifndef node_has_online_mem @@ -203,8 +204,114 @@ int arch_update_cpu_topology(void);  #ifndef SD_NODE_INIT  #error Please define an appropriate SD_NODE_INIT in include/asm/topology.h!!!  #endif +  #endif /* CONFIG_NUMA */ +#ifdef CONFIG_USE_PERCPU_NUMA_NODE_ID +DECLARE_PER_CPU(int, numa_node); + +#ifndef numa_node_id +/* Returns the number of the current Node. */ +static inline int numa_node_id(void) +{ +	return __this_cpu_read(numa_node); +} +#endif + +#ifndef cpu_to_node +static inline int cpu_to_node(int cpu) +{ +	return per_cpu(numa_node, cpu); +} +#endif + +#ifndef set_numa_node +static inline void set_numa_node(int node) +{ +	percpu_write(numa_node, node); +} +#endif + +#ifndef set_cpu_numa_node +static inline void set_cpu_numa_node(int cpu, int node) +{ +	per_cpu(numa_node, cpu) = node; +} +#endif + +#else	/* !CONFIG_USE_PERCPU_NUMA_NODE_ID */ + +/* Returns the number of the current Node. */ +#ifndef numa_node_id +static inline int numa_node_id(void) +{ +	return cpu_to_node(raw_smp_processor_id()); +} +#endif + +#endif	/* [!]CONFIG_USE_PERCPU_NUMA_NODE_ID */ + +#ifdef CONFIG_HAVE_MEMORYLESS_NODES + +/* + * N.B., Do NOT reference the '_numa_mem_' per cpu variable directly. + * It will not be defined when CONFIG_HAVE_MEMORYLESS_NODES is not defined. + * Use the accessor functions set_numa_mem(), numa_mem_id() and cpu_to_mem(). + */ +DECLARE_PER_CPU(int, _numa_mem_); + +#ifndef set_numa_mem +static inline void set_numa_mem(int node) +{ +	percpu_write(_numa_mem_, node); +} +#endif + +#ifndef numa_mem_id +/* Returns the number of the nearest Node with memory */ +static inline int numa_mem_id(void) +{ +	return __this_cpu_read(_numa_mem_); +} +#endif + +#ifndef cpu_to_mem +static inline int cpu_to_mem(int cpu) +{ +	return per_cpu(_numa_mem_, cpu); +} +#endif + +#ifndef set_cpu_numa_mem +static inline void set_cpu_numa_mem(int cpu, int node) +{ +	per_cpu(_numa_mem_, cpu) = node; +} +#endif + +#else	/* !CONFIG_HAVE_MEMORYLESS_NODES */ + +static inline void set_numa_mem(int node) {} + +static inline void set_cpu_numa_mem(int cpu, int node) {} + +#ifndef numa_mem_id +/* Returns the number of the nearest Node with memory */ +static inline int numa_mem_id(void) +{ +	return numa_node_id(); +} +#endif + +#ifndef cpu_to_mem +static inline int cpu_to_mem(int cpu) +{ +	return cpu_to_node(cpu); +} +#endif + +#endif	/* [!]CONFIG_HAVE_MEMORYLESS_NODES */ +  #ifndef topology_physical_package_id  #define topology_physical_package_id(cpu)	((void)(cpu), -1)  #endif @@ -218,9 +325,4 @@ int arch_update_cpu_topology(void);  #define topology_core_cpumask(cpu)		cpumask_of(cpu)  #endif -/* Returns the number of the current Node. */ -#ifndef numa_node_id -#define numa_node_id()		(cpu_to_node(raw_smp_processor_id())) -#endif -  #endif /* _LINUX_TOPOLOGY_H */ diff --git a/include/linux/tracepoint.h b/include/linux/tracepoint.h index f59604ed0ec..9a59d1f98cd 100644 --- a/include/linux/tracepoint.h +++ b/include/linux/tracepoint.h @@ -20,12 +20,17 @@  struct module;  struct tracepoint; +struct tracepoint_func { +	void *func; +	void *data; +}; +  struct tracepoint {  	const char *name;		/* Tracepoint name */  	int state;			/* State. */  	void (*regfunc)(void);  	void (*unregfunc)(void); -	void **funcs; +	struct tracepoint_func *funcs;  } __attribute__((aligned(32)));		/*  					 * Aligned on 32 bytes because it is  					 * globally visible and gcc happily @@ -33,6 +38,68 @@ struct tracepoint {  					 * Keep in sync with vmlinux.lds.h.  					 */ +/* + * Connect a probe to a tracepoint. + * Internal API, should not be used directly. + */ +extern int tracepoint_probe_register(const char *name, void *probe, void *data); + +/* + * Disconnect a probe from a tracepoint. + * Internal API, should not be used directly. + */ +extern int +tracepoint_probe_unregister(const char *name, void *probe, void *data); + +extern int tracepoint_probe_register_noupdate(const char *name, void *probe, +					      void *data); +extern int tracepoint_probe_unregister_noupdate(const char *name, void *probe, +						void *data); +extern void tracepoint_probe_update_all(void); + +struct tracepoint_iter { +	struct module *module; +	struct tracepoint *tracepoint; +}; + +extern void tracepoint_iter_start(struct tracepoint_iter *iter); +extern void tracepoint_iter_next(struct tracepoint_iter *iter); +extern void tracepoint_iter_stop(struct tracepoint_iter *iter); +extern void tracepoint_iter_reset(struct tracepoint_iter *iter); +extern int tracepoint_get_iter_range(struct tracepoint **tracepoint, +	struct tracepoint *begin, struct tracepoint *end); + +/* + * tracepoint_synchronize_unregister must be called between the last tracepoint + * probe unregistration and the end of module exit to make sure there is no + * caller executing a probe when it is freed. + */ +static inline void tracepoint_synchronize_unregister(void) +{ +	synchronize_sched(); +} + +#define PARAMS(args...) args + +#ifdef CONFIG_TRACEPOINTS +extern void tracepoint_update_probe_range(struct tracepoint *begin, +	struct tracepoint *end); +#else +static inline void tracepoint_update_probe_range(struct tracepoint *begin, +	struct tracepoint *end) +{ } +#endif /* CONFIG_TRACEPOINTS */ + +#endif /* _LINUX_TRACEPOINT_H */ + +/* + * Note: we keep the TRACE_EVENT and DECLARE_TRACE outside the include + *  file ifdef protection. + *  This is due to the way trace events work. If a file includes two + *  trace event headers under one "CREATE_TRACE_POINTS" the first include + *  will override the TRACE_EVENT and break the second include. + */ +  #ifndef DECLARE_TRACE  #define TP_PROTO(args...)	args @@ -43,17 +110,27 @@ struct tracepoint {  /*   * it_func[0] is never NULL because there is at least one element in the array   * when the array itself is non NULL. + * + * Note, the proto and args passed in includes "__data" as the first parameter. + * The reason for this is to handle the "void" prototype. If a tracepoint + * has a "void" prototype, then it is invalid to declare a function + * as "(void *, void)". The DECLARE_TRACE_NOARGS() will pass in just + * "void *data", where as the DECLARE_TRACE() will pass in "void *data, proto".   */  #define __DO_TRACE(tp, proto, args)					\  	do {								\ -		void **it_func;						\ +		struct tracepoint_func *it_func_ptr;			\ +		void *it_func;						\ +		void *__data;						\  									\  		rcu_read_lock_sched_notrace();				\ -		it_func = rcu_dereference((tp)->funcs);			\ -		if (it_func) {						\ +		it_func_ptr = rcu_dereference_sched((tp)->funcs);	\ +		if (it_func_ptr) {					\  			do {						\ -				((void(*)(proto))(*it_func))(args);	\ -			} while (*(++it_func));				\ +				it_func = (it_func_ptr)->func;		\ +				__data = (it_func_ptr)->data;		\ +				((void(*)(proto))(it_func))(args);	\ +			} while ((++it_func_ptr)->func);		\  		}							\  		rcu_read_unlock_sched_notrace();			\  	} while (0) @@ -63,24 +140,32 @@ struct tracepoint {   * not add unwanted padding between the beginning of the section and the   * structure. Force alignment to the same alignment as the section start.   */ -#define DECLARE_TRACE(name, proto, args)				\ +#define __DECLARE_TRACE(name, proto, args, data_proto, data_args)	\  	extern struct tracepoint __tracepoint_##name;			\  	static inline void trace_##name(proto)				\  	{								\  		if (unlikely(__tracepoint_##name.state))		\  			__DO_TRACE(&__tracepoint_##name,		\ -				TP_PROTO(proto), TP_ARGS(args));	\ +				TP_PROTO(data_proto),			\ +				TP_ARGS(data_args));			\  	}								\ -	static inline int register_trace_##name(void (*probe)(proto))	\ +	static inline int						\ +	register_trace_##name(void (*probe)(data_proto), void *data)	\  	{								\ -		return tracepoint_probe_register(#name, (void *)probe);	\ +		return tracepoint_probe_register(#name, (void *)probe,	\ +						 data);			\  	}								\ -	static inline int unregister_trace_##name(void (*probe)(proto))	\ +	static inline int						\ +	unregister_trace_##name(void (*probe)(data_proto), void *data)	\ +	{								\ +		return tracepoint_probe_unregister(#name, (void *)probe, \ +						   data);		\ +	}								\ +	static inline void						\ +	check_trace_callback_type_##name(void (*cb)(data_proto))	\  	{								\ -		return tracepoint_probe_unregister(#name, (void *)probe);\  	} -  #define DEFINE_TRACE_FN(name, reg, unreg)				\  	static const char __tpstrtab_##name[]				\  	__attribute__((section("__tracepoints_strings"))) = #name;	\ @@ -96,22 +181,24 @@ struct tracepoint {  #define EXPORT_TRACEPOINT_SYMBOL(name)					\  	EXPORT_SYMBOL(__tracepoint_##name) -extern void tracepoint_update_probe_range(struct tracepoint *begin, -	struct tracepoint *end); -  #else /* !CONFIG_TRACEPOINTS */ -#define DECLARE_TRACE(name, proto, args)				\ -	static inline void _do_trace_##name(struct tracepoint *tp, proto) \ -	{ }								\ +#define __DECLARE_TRACE(name, proto, args, data_proto, data_args)	\  	static inline void trace_##name(proto)				\  	{ }								\ -	static inline int register_trace_##name(void (*probe)(proto))	\ +	static inline int						\ +	register_trace_##name(void (*probe)(data_proto),		\ +			      void *data)				\  	{								\  		return -ENOSYS;						\  	}								\ -	static inline int unregister_trace_##name(void (*probe)(proto))	\ +	static inline int						\ +	unregister_trace_##name(void (*probe)(data_proto),		\ +				void *data)				\  	{								\  		return -ENOSYS;						\ +	}								\ +	static inline void check_trace_callback_type_##name(void (*cb)(data_proto)) \ +	{								\  	}  #define DEFINE_TRACE_FN(name, reg, unreg) @@ -119,60 +206,31 @@ extern void tracepoint_update_probe_range(struct tracepoint *begin,  #define EXPORT_TRACEPOINT_SYMBOL_GPL(name)  #define EXPORT_TRACEPOINT_SYMBOL(name) -static inline void tracepoint_update_probe_range(struct tracepoint *begin, -	struct tracepoint *end) -{ }  #endif /* CONFIG_TRACEPOINTS */ -#endif /* DECLARE_TRACE */ - -/* - * Connect a probe to a tracepoint. - * Internal API, should not be used directly. - */ -extern int tracepoint_probe_register(const char *name, void *probe); - -/* - * Disconnect a probe from a tracepoint. - * Internal API, should not be used directly. - */ -extern int tracepoint_probe_unregister(const char *name, void *probe); - -extern int tracepoint_probe_register_noupdate(const char *name, void *probe); -extern int tracepoint_probe_unregister_noupdate(const char *name, void *probe); -extern void tracepoint_probe_update_all(void); - -struct tracepoint_iter { -	struct module *module; -	struct tracepoint *tracepoint; -}; - -extern void tracepoint_iter_start(struct tracepoint_iter *iter); -extern void tracepoint_iter_next(struct tracepoint_iter *iter); -extern void tracepoint_iter_stop(struct tracepoint_iter *iter); -extern void tracepoint_iter_reset(struct tracepoint_iter *iter); -extern int tracepoint_get_iter_range(struct tracepoint **tracepoint, -	struct tracepoint *begin, struct tracepoint *end);  /* - * tracepoint_synchronize_unregister must be called between the last tracepoint - * probe unregistration and the end of module exit to make sure there is no - * caller executing a probe when it is freed. + * The need for the DECLARE_TRACE_NOARGS() is to handle the prototype + * (void). "void" is a special value in a function prototype and can + * not be combined with other arguments. Since the DECLARE_TRACE() + * macro adds a data element at the beginning of the prototype, + * we need a way to differentiate "(void *data, proto)" from + * "(void *data, void)". The second prototype is invalid. + * + * DECLARE_TRACE_NOARGS() passes "void" as the tracepoint prototype + * and "void *__data" as the callback prototype. + * + * DECLARE_TRACE() passes "proto" as the tracepoint protoype and + * "void *__data, proto" as the callback prototype.   */ -static inline void tracepoint_synchronize_unregister(void) -{ -	synchronize_sched(); -} +#define DECLARE_TRACE_NOARGS(name)					\ +		__DECLARE_TRACE(name, void, , void *__data, __data) -#define PARAMS(args...) args - -#endif /* _LINUX_TRACEPOINT_H */ +#define DECLARE_TRACE(name, proto, args)				\ +		__DECLARE_TRACE(name, PARAMS(proto), PARAMS(args),	\ +				PARAMS(void *__data, proto),		\ +				PARAMS(__data, args)) -/* - * Note: we keep the TRACE_EVENT outside the include file ifdef protection. - *  This is due to the way trace events work. If a file includes two - *  trace event headers under one "CREATE_TRACE_POINTS" the first include - *  will override the TRACE_EVENT and break the second include. - */ +#endif /* DECLARE_TRACE */  #ifndef TRACE_EVENT  /* diff --git a/include/linux/tty.h b/include/linux/tty.h index 6abfcf5b588..931078b7322 100644 --- a/include/linux/tty.h +++ b/include/linux/tty.h @@ -23,7 +23,7 @@   */  #define NR_UNIX98_PTY_DEFAULT	4096      /* Default maximum for Unix98 ptys */  #define NR_UNIX98_PTY_MAX	(1 << MINORBITS) /* Absolute limit */ -#define NR_LDISCS		20 +#define NR_LDISCS		30  /* line disciplines */  #define N_TTY		0 @@ -46,8 +46,9 @@  #define N_GIGASET_M101	16	/* Siemens Gigaset M101 serial DECT adapter */  #define N_SLCAN		17	/* Serial / USB serial CAN Adaptors */  #define N_PPS		18	/* Pulse per Second */ -  #define N_V253		19	/* Codec control over voice modem */ +#define N_CAIF		20      /* CAIF protocol for talking to modems */ +#define N_GSM0710	21	/* GSM 0710 Mux */  /*   * This character is the same as _POSIX_VDISABLE: it cannot be used as @@ -68,6 +69,17 @@ struct tty_buffer {  	unsigned long data[0];  }; +/* + * We default to dicing tty buffer allocations to this many characters + * in order to avoid multiple page allocations. We know the size of + * tty_buffer itself but it must also be taken into account that the + * the buffer is 256 byte aligned. See tty_buffer_find for the allocation + * logic this must match + */ + +#define TTY_BUFFER_PAGE	(((PAGE_SIZE - sizeof(struct tty_buffer)) / 2) & ~0xFF) + +  struct tty_bufhead {  	struct delayed_work work;  	spinlock_t lock; @@ -213,6 +225,7 @@ struct tty_port {  	wait_queue_head_t	close_wait;	/* Close waiters */  	wait_queue_head_t	delta_msr_wait;	/* Modem status change */  	unsigned long		flags;		/* TTY flags ASY_*/ +	unsigned char		console:1;	/* port is a console */  	struct mutex		mutex;		/* Locking */  	struct mutex		buf_mutex;	/* Buffer alloc lock */  	unsigned char		*xmit_buf;	/* Optional buffer */ @@ -504,6 +517,7 @@ extern void tty_ldisc_enable(struct tty_struct *tty);  /* n_tty.c */  extern struct tty_ldisc_ops tty_ldisc_N_TTY; +extern void n_tty_inherit_ops(struct tty_ldisc_ops *ops);  /* tty_audit.c */  #ifdef CONFIG_AUDIT diff --git a/include/linux/tty_flip.h b/include/linux/tty_flip.h index eb677cf5610..9239d033a0a 100644 --- a/include/linux/tty_flip.h +++ b/include/linux/tty_flip.h @@ -2,8 +2,8 @@  #define _LINUX_TTY_FLIP_H  extern int tty_buffer_request_room(struct tty_struct *tty, size_t size); -extern int tty_insert_flip_string(struct tty_struct *tty, const unsigned char *chars, size_t size);  extern int tty_insert_flip_string_flags(struct tty_struct *tty, const unsigned char *chars, const char *flags, size_t size); +extern int tty_insert_flip_string_fixed_flag(struct tty_struct *tty, const unsigned char *chars, char flag, size_t size);  extern int tty_prepare_flip_string(struct tty_struct *tty, unsigned char **chars, size_t size);  extern int tty_prepare_flip_string_flags(struct tty_struct *tty, unsigned char **chars, char **flags, size_t size);  void tty_schedule_flip(struct tty_struct *tty); @@ -20,4 +20,9 @@ static inline int tty_insert_flip_char(struct tty_struct *tty,  	return tty_insert_flip_string_flags(tty, &ch, &flag, 1);  } +static inline int tty_insert_flip_string(struct tty_struct *tty, const unsigned char *chars, size_t size) +{ +	return tty_insert_flip_string_fixed_flag(tty, chars, TTY_NORMAL, size); +} +  #endif /* _LINUX_TTY_FLIP_H */ diff --git a/include/linux/tty_ldisc.h b/include/linux/tty_ldisc.h index 0c4ee9b88f8..526d66f066a 100644 --- a/include/linux/tty_ldisc.h +++ b/include/linux/tty_ldisc.h @@ -99,6 +99,12 @@   *	cease I/O to the tty driver. Can sleep. The driver should   *	seek to perform this action quickly but should wait until   *	any pending driver I/O is completed. + * + * void (*dcd_change)(struct tty_struct *tty, unsigned int status, + * 			struct timespec *ts) + * + *	Tells the discipline that the DCD pin has changed its status and + *	the relative timestamp. Pointer ts can be NULL.   */  #include <linux/fs.h> @@ -136,6 +142,8 @@ struct tty_ldisc_ops {  	void	(*receive_buf)(struct tty_struct *, const unsigned char *cp,  			       char *fp, int count);  	void	(*write_wakeup)(struct tty_struct *); +	void	(*dcd_change)(struct tty_struct *, unsigned int, +				struct timespec *);  	struct  module *owner; diff --git a/include/linux/types.h b/include/linux/types.h index c42724f8c80..23d237a075e 100644 --- a/include/linux/types.h +++ b/include/linux/types.h @@ -188,12 +188,12 @@ typedef u32 phys_addr_t;  typedef phys_addr_t resource_size_t;  typedef struct { -	volatile int counter; +	int counter;  } atomic_t;  #ifdef CONFIG_64BIT  typedef struct { -	volatile long counter; +	long counter;  } atomic64_t;  #endif diff --git a/include/linux/uinput.h b/include/linux/uinput.h index 15ddd4483b0..60c81da77f0 100644 --- a/include/linux/uinput.h +++ b/include/linux/uinput.h @@ -166,11 +166,11 @@ struct uinput_ff_erase {  struct uinput_user_dev {  	char name[UINPUT_MAX_NAME_SIZE];  	struct input_id id; -        int ff_effects_max; -        int absmax[ABS_MAX + 1]; -        int absmin[ABS_MAX + 1]; -        int absfuzz[ABS_MAX + 1]; -        int absflat[ABS_MAX + 1]; +	int ff_effects_max; +	int absmax[ABS_CNT]; +	int absmin[ABS_CNT]; +	int absfuzz[ABS_CNT]; +	int absflat[ABS_CNT];  };  #endif	/* __UINPUT_H_ */ diff --git a/include/linux/usb.h b/include/linux/usb.h index d7ace1b80f0..d5922a87799 100644 --- a/include/linux/usb.h +++ b/include/linux/usb.h @@ -45,27 +45,14 @@ struct wusb_dev;  struct ep_device; -/* For SS devices */ -/** - * struct usb_host_ss_ep_comp - Valid for SuperSpeed devices only - * @desc: endpoint companion descriptor, wMaxPacketSize in native byteorder - * @extra: descriptors following this endpoint companion descriptor - * @extralen: how many bytes of "extra" are valid - */ -struct usb_host_ss_ep_comp { -	struct usb_ss_ep_comp_descriptor	desc; -	unsigned char				*extra;   /* Extra descriptors */ -	int					extralen; -}; -  /**   * struct usb_host_endpoint - host-side endpoint descriptor and queue   * @desc: descriptor for this endpoint, wMaxPacketSize in native byteorder + * @ss_ep_comp: SuperSpeed companion descriptor for this endpoint   * @urb_list: urbs queued to this endpoint; maintained by usbcore   * @hcpriv: for use by HCD; typically holds hardware dma queue head (QH)   *	with one or more transfer descriptors (TDs) per urb   * @ep_dev: ep_device for sysfs info - * @ss_ep_comp: companion descriptor information for this endpoint   * @extra: descriptors following this endpoint in the configuration   * @extralen: how many bytes of "extra" are valid   * @enabled: URBs may be submitted to this endpoint @@ -74,11 +61,11 @@ struct usb_host_ss_ep_comp {   * descriptor within an active interface in a given USB configuration.   */  struct usb_host_endpoint { -	struct usb_endpoint_descriptor	desc; +	struct usb_endpoint_descriptor		desc; +	struct usb_ss_ep_comp_descriptor	ss_ep_comp;  	struct list_head		urb_list;  	void				*hcpriv; -	struct ep_device 		*ep_dev;	/* For sysfs info */ -	struct usb_host_ss_ep_comp	*ss_ep_comp;	/* For SS devices */ +	struct ep_device		*ep_dev;	/* For sysfs info */  	unsigned char *extra;   /* Extra descriptors */  	int extralen; @@ -109,8 +96,8 @@ enum usb_interface_condition {  /**   * struct usb_interface - what usb device drivers talk to   * @altsetting: array of interface structures, one for each alternate - * 	setting that may be selected.  Each one includes a set of - * 	endpoint configurations.  They will be in no particular order. + *	setting that may be selected.  Each one includes a set of + *	endpoint configurations.  They will be in no particular order.   * @cur_altsetting: the current altsetting.   * @num_altsetting: number of altsettings defined.   * @intf_assoc: interface association descriptor @@ -122,7 +109,6 @@ enum usb_interface_condition {   *	number from the USB core by calling usb_register_dev().   * @condition: binding state of the interface: not bound, binding   *	(in probe()), bound to a driver, or unbinding (in disconnect()) - * @is_active: flag set when the interface is bound and not suspended.   * @sysfs_files_created: sysfs attributes exist   * @ep_devs_created: endpoint child pseudo-devices exist   * @unregistering: flag set when the interface is being unregistered @@ -135,8 +121,7 @@ enum usb_interface_condition {   * @dev: driver model's view of this device   * @usb_dev: if an interface is bound to the USB major, this will point   *	to the sysfs representation for that device. - * @pm_usage_cnt: PM usage counter for this interface; autosuspend is not - *	allowed unless the counter is 0. + * @pm_usage_cnt: PM usage counter for this interface   * @reset_ws: Used for scheduling resets from atomic context.   * @reset_running: set to 1 if the interface is currently running a   *      queued reset so that usb_cancel_queued_reset() doesn't try to @@ -184,7 +169,6 @@ struct usb_interface {  	int minor;			/* minor number this interface is  					 * bound to */  	enum usb_interface_condition condition;		/* state of binding */ -	unsigned is_active:1;		/* the interface is not suspended */  	unsigned sysfs_files_created:1;	/* the sysfs attributes exist */  	unsigned ep_devs_created:1;	/* endpoint "devices" exist */  	unsigned unregistering:1;	/* unregistration is in progress */ @@ -200,8 +184,6 @@ struct usb_interface {  	struct work_struct reset_ws;	/* for resets in atomic context */  };  #define	to_usb_interface(d) container_of(d, struct usb_interface, dev) -#define	interface_to_usbdev(intf) \ -	container_of(intf->dev.parent, struct usb_device, dev)  static inline void *usb_get_intfdata(struct usb_interface *intf)  { @@ -218,7 +200,7 @@ void usb_put_intf(struct usb_interface *intf);  /* this maximum is arbitrary */  #define USB_MAXINTERFACES	32 -#define USB_MAXIADS		USB_MAXINTERFACES/2 +#define USB_MAXIADS		(USB_MAXINTERFACES/2)  /**   * struct usb_interface_cache - long-term representation of a device interface @@ -339,6 +321,7 @@ struct usb_bus {  	struct usb_devmap devmap;	/* device address allocation map */  	struct usb_device *root_hub;	/* Root hub */ +	struct usb_bus *hs_companion;	/* Companion EHCI bus, if any */  	struct list_head bus_list;	/* list of busses */  	int bandwidth_allocated;	/* on this bus: how much of the time @@ -400,7 +383,6 @@ struct usb_tt;   * @portnum: parent port number (origin 1)   * @level: number of USB hub ancestors   * @can_submit: URBs may be submitted - * @discon_suspended: disconnected while suspended   * @persist_enabled:  USB_PERSIST enabled for this device   * @have_langid: whether string_langid is valid   * @authorized: policy has said we can use it; @@ -420,20 +402,14 @@ struct usb_tt;   * @usbfs_dentry: usbfs dentry entry for the device   * @maxchild: number of ports if hub   * @children: child devices - USB devices that are attached to this hub - * @pm_usage_cnt: usage counter for autosuspend   * @quirks: quirks of the whole device   * @urbnum: number of URBs submitted for the whole device   * @active_duration: total time device is not suspended - * @autosuspend: for delayed autosuspends - * @autoresume: for autoresumes requested while in_interrupt - * @pm_mutex: protects PM operations   * @last_busy: time of last use   * @autosuspend_delay: in jiffies   * @connect_time: time device was first connected   * @do_remote_wakeup:  remote wakeup should be enabled   * @reset_resume: needs reset instead of resume - * @autosuspend_disabled: autosuspend disabled by the user - * @skip_sys_resume: skip the next system resume   * @wusb_dev: if this is a Wireless USB device, link to the WUSB   *	specific data for the device.   * @slot_id: Slot ID assigned by xHCI @@ -444,7 +420,7 @@ struct usb_tt;   */  struct usb_device {  	int		devnum; -	char		devpath [16]; +	char		devpath[16];  	u32		route;  	enum usb_device_state	state;  	enum usb_device_speed	speed; @@ -474,11 +450,10 @@ struct usb_device {  	u8 level;  	unsigned can_submit:1; -	unsigned discon_suspended:1;  	unsigned persist_enabled:1;  	unsigned have_langid:1;  	unsigned authorized:1; - 	unsigned authenticated:1; +	unsigned authenticated:1;  	unsigned wusb:1;  	int string_langid; @@ -498,38 +473,36 @@ struct usb_device {  	int maxchild;  	struct usb_device *children[USB_MAXCHILDREN]; -	int pm_usage_cnt;  	u32 quirks;  	atomic_t urbnum;  	unsigned long active_duration;  #ifdef CONFIG_PM -	struct delayed_work autosuspend; -	struct work_struct autoresume; -	struct mutex pm_mutex; -  	unsigned long last_busy;  	int autosuspend_delay;  	unsigned long connect_time;  	unsigned do_remote_wakeup:1;  	unsigned reset_resume:1; -	unsigned autosuspend_disabled:1; -	unsigned skip_sys_resume:1;  #endif  	struct wusb_dev *wusb_dev;  	int slot_id;  };  #define	to_usb_device(d) container_of(d, struct usb_device, dev) +static inline struct usb_device *interface_to_usbdev(struct usb_interface *intf) +{ +	return to_usb_device(intf->dev.parent); +} +  extern struct usb_device *usb_get_dev(struct usb_device *dev);  extern void usb_put_dev(struct usb_device *dev);  /* USB device locking */ -#define usb_lock_device(udev)		down(&(udev)->dev.sem) -#define usb_unlock_device(udev)		up(&(udev)->dev.sem) -#define usb_trylock_device(udev)	down_trylock(&(udev)->dev.sem) +#define usb_lock_device(udev)		device_lock(&(udev)->dev) +#define usb_unlock_device(udev)		device_unlock(&(udev)->dev) +#define usb_trylock_device(udev)	device_trylock(&(udev)->dev)  extern int usb_lock_device_for_reset(struct usb_device *udev,  				     const struct usb_interface *iface); @@ -537,25 +510,18 @@ extern int usb_lock_device_for_reset(struct usb_device *udev,  extern int usb_reset_device(struct usb_device *dev);  extern void usb_queue_reset_device(struct usb_interface *dev); -extern struct usb_device *usb_find_device(u16 vendor_id, u16 product_id);  /* USB autosuspend and autoresume */  #ifdef CONFIG_USB_SUSPEND +extern void usb_enable_autosuspend(struct usb_device *udev); +extern void usb_disable_autosuspend(struct usb_device *udev); +  extern int usb_autopm_get_interface(struct usb_interface *intf);  extern void usb_autopm_put_interface(struct usb_interface *intf);  extern int usb_autopm_get_interface_async(struct usb_interface *intf);  extern void usb_autopm_put_interface_async(struct usb_interface *intf); - -static inline void usb_autopm_get_interface_no_resume( -		struct usb_interface *intf) -{ -	atomic_inc(&intf->pm_usage_cnt); -} -static inline void usb_autopm_put_interface_no_suspend( -		struct usb_interface *intf) -{ -	atomic_dec(&intf->pm_usage_cnt); -} +extern void usb_autopm_get_interface_no_resume(struct usb_interface *intf); +extern void usb_autopm_put_interface_no_suspend(struct usb_interface *intf);  static inline void usb_mark_last_busy(struct usb_device *udev)  { @@ -564,6 +530,11 @@ static inline void usb_mark_last_busy(struct usb_device *udev)  #else +static inline int usb_enable_autosuspend(struct usb_device *udev) +{ return 0; } +static inline int usb_disable_autosuspend(struct usb_device *udev) +{ return 0; } +  static inline int usb_autopm_get_interface(struct usb_interface *intf)  { return 0; }  static inline int usb_autopm_get_interface_async(struct usb_interface *intf) @@ -588,6 +559,16 @@ static inline void usb_mark_last_busy(struct usb_device *udev)  /* for drivers using iso endpoints */  extern int usb_get_current_frame_number(struct usb_device *usb_dev); +/* Sets up a group of bulk endpoints to support multiple stream IDs. */ +extern int usb_alloc_streams(struct usb_interface *interface, +		struct usb_host_endpoint **eps, unsigned int num_eps, +		unsigned int num_streams, gfp_t mem_flags); + +/* Reverts a group of bulk endpoints back to not using stream IDs. */ +extern void usb_free_streams(struct usb_interface *interface, +		struct usb_host_endpoint **eps, unsigned int num_eps, +		gfp_t mem_flags); +  /* used these for multi-interface device registration */  extern int usb_driver_claim_interface(struct usb_driver *driver,  			struct usb_interface *iface, void *priv); @@ -683,7 +664,7 @@ static inline int usb_make_path(struct usb_device *dev, char *buf, size_t size)   * This macro is used to create a struct usb_device_id that matches a   * specific device.   */ -#define USB_DEVICE(vend,prod) \ +#define USB_DEVICE(vend, prod) \  	.match_flags = USB_DEVICE_ID_MATCH_DEVICE, \  	.idVendor = (vend), \  	.idProduct = (prod) @@ -974,17 +955,25 @@ extern int usb_disabled(void);  #define URB_ISO_ASAP		0x0002	/* iso-only, urb->start_frame  					 * ignored */  #define URB_NO_TRANSFER_DMA_MAP	0x0004	/* urb->transfer_dma valid on submit */ -#define URB_NO_SETUP_DMA_MAP	0x0008	/* urb->setup_dma valid on submit */  #define URB_NO_FSBR		0x0020	/* UHCI-specific */  #define URB_ZERO_PACKET		0x0040	/* Finish bulk OUT with short packet */  #define URB_NO_INTERRUPT	0x0080	/* HINT: no non-error interrupt  					 * needed */  #define URB_FREE_BUFFER		0x0100	/* Free transfer buffer with the URB */ +/* The following flags are used internally by usbcore and HCDs */  #define URB_DIR_IN		0x0200	/* Transfer from device to host */  #define URB_DIR_OUT		0  #define URB_DIR_MASK		URB_DIR_IN +#define URB_DMA_MAP_SINGLE	0x00010000	/* Non-scatter-gather mapping */ +#define URB_DMA_MAP_PAGE	0x00020000	/* HCD-unsupported S-G */ +#define URB_DMA_MAP_SG		0x00040000	/* HCD-supported S-G */ +#define URB_MAP_LOCAL		0x00080000	/* HCD-local-memory mapping */ +#define URB_SETUP_MAP_SINGLE	0x00100000	/* Setup packet DMA mapped */ +#define URB_SETUP_MAP_LOCAL	0x00200000	/* HCD-local setup packet */ +#define URB_DMA_SG_COMBINED	0x00400000	/* S-G entries were combined */ +  struct usb_iso_packet_descriptor {  	unsigned int offset;  	unsigned int length;		/* expected length */ @@ -1061,17 +1050,14 @@ typedef void (*usb_complete_t)(struct urb *);   * @setup_packet: Only used for control transfers, this points to eight bytes   *	of setup data.  Control transfers always start by sending this data   *	to the device.  Then transfer_buffer is read or written, if needed. - * @setup_dma: For control transfers with URB_NO_SETUP_DMA_MAP set, the - *	device driver has provided this DMA address for the setup packet. - *	The host controller driver should use this in preference to - *	setup_packet, but the HCD may chose to ignore the address if it must - *	copy the setup packet into internal structures.  Therefore, setup_packet - *	must always point to a valid buffer. + * @setup_dma: DMA pointer for the setup packet.  The caller must not use + *	this field; setup_packet must point to a valid buffer.   * @start_frame: Returns the initial frame for isochronous transfers.   * @number_of_packets: Lists the number of ISO transfer buffers.   * @interval: Specifies the polling interval for interrupt or isochronous   *	transfers.  The units are frames (milliseconds) for full and low - *	speed devices, and microframes (1/8 millisecond) for highspeed ones. + *	speed devices, and microframes (1/8 millisecond) for highspeed + *	and SuperSpeed devices.   * @error_count: Returns the number of ISO transfers that reported errors.   * @context: For use in completion functions.  This normally points to   *	request-specific driver context. @@ -1097,13 +1083,14 @@ typedef void (*usb_complete_t)(struct urb *);   * bounce buffer or talking to an IOMMU),   * although they're cheap on commodity x86 and ppc hardware.   * - * Alternatively, drivers may pass the URB_NO_xxx_DMA_MAP transfer flags, - * which tell the host controller driver that no such mapping is needed since + * Alternatively, drivers may pass the URB_NO_TRANSFER_DMA_MAP transfer flag, + * which tells the host controller driver that no such mapping is needed for + * the transfer_buffer since   * the device driver is DMA-aware.  For example, a device driver might - * allocate a DMA buffer with usb_buffer_alloc() or call usb_buffer_map(). - * When these transfer flags are provided, host controller drivers will - * attempt to use the dma addresses found in the transfer_dma and/or - * setup_dma fields rather than determining a dma address themselves. + * allocate a DMA buffer with usb_alloc_coherent() or call usb_buffer_map(). + * When this transfer flag is provided, host controller drivers will + * attempt to use the dma address found in the transfer_dma + * field rather than determining a dma address themselves.   *   * Note that transfer_buffer must still be set if the controller   * does not support DMA (as indicated by bus.uses_dma) and when talking @@ -1126,11 +1113,9 @@ typedef void (*usb_complete_t)(struct urb *);   * should always terminate with a short packet, even if it means adding an   * extra zero length packet.   * - * Control URBs must provide a setup_packet.  The setup_packet and - * transfer_buffer may each be mapped for DMA or not, independently of - * the other.  The transfer_flags bits URB_NO_TRANSFER_DMA_MAP and - * URB_NO_SETUP_DMA_MAP indicate which buffers have already been mapped. - * URB_NO_SETUP_DMA_MAP is ignored for non-control URBs. + * Control URBs must provide a valid pointer in the setup_packet field. + * Unlike the transfer_buffer, the setup_packet may not be mapped for DMA + * beforehand.   *   * Interrupt URBs must provide an interval, saying how often (in milliseconds   * or, for highspeed devices, 125 microsecond units) @@ -1201,14 +1186,15 @@ struct urb {  					 * current owner */  	struct list_head anchor_list;	/* the URB may be anchored */  	struct usb_anchor *anchor; -	struct usb_device *dev; 	/* (in) pointer to associated device */ +	struct usb_device *dev;		/* (in) pointer to associated device */  	struct usb_host_endpoint *ep;	/* (internal) pointer to endpoint */  	unsigned int pipe;		/* (in) pipe information */ +	unsigned int stream_id;		/* (in) stream ID */  	int status;			/* (return) non-ISO status */  	unsigned int transfer_flags;	/* (in) URB_SHORT_NOT_OK | ...*/  	void *transfer_buffer;		/* (in) associated data buffer */  	dma_addr_t transfer_dma;	/* (in) dma addr for transfer_buffer */ -	struct usb_sg_request *sg;	/* (in) scatter gather buffer list */ +	struct scatterlist *sg;		/* (in) scatter gather buffer list */  	int num_sgs;			/* (in) number of entries in the sg list */  	u32 transfer_buffer_length;	/* (in) data buffer length */  	u32 actual_length;		/* (return) actual transfer length */ @@ -1302,9 +1288,16 @@ static inline void usb_fill_bulk_urb(struct urb *urb,   *   * Initializes a interrupt urb with the proper information needed to submit   * it to a device. - * Note that high speed interrupt endpoints use a logarithmic encoding of - * the endpoint interval, and express polling intervals in microframes - * (eight per millisecond) rather than in frames (one per millisecond). + * + * Note that High Speed and SuperSpeed interrupt endpoints use a logarithmic + * encoding of the endpoint interval, and express polling intervals in + * microframes (eight per millisecond) rather than in frames (one per + * millisecond). + * + * Wireless USB also uses the logarithmic encoding, but specifies it in units of + * 128us instead of 125us.  For Wireless USB devices, the interval is passed + * through to the host controller, rather than being translated into microframe + * units.   */  static inline void usb_fill_int_urb(struct urb *urb,  				    struct usb_device *dev, @@ -1321,7 +1314,7 @@ static inline void usb_fill_int_urb(struct urb *urb,  	urb->transfer_buffer_length = buffer_length;  	urb->complete = complete_fn;  	urb->context = context; -	if (dev->speed == USB_SPEED_HIGH) +	if (dev->speed == USB_SPEED_HIGH || dev->speed == USB_SPEED_SUPER)  		urb->interval = 1 << (interval - 1);  	else  		urb->interval = interval; @@ -1374,9 +1367,9 @@ static inline int usb_urb_dir_out(struct urb *urb)  	return (urb->transfer_flags & URB_DIR_MASK) == URB_DIR_OUT;  } -void *usb_buffer_alloc(struct usb_device *dev, size_t size, +void *usb_alloc_coherent(struct usb_device *dev, size_t size,  	gfp_t mem_flags, dma_addr_t *dma); -void usb_buffer_free(struct usb_device *dev, size_t size, +void usb_free_coherent(struct usb_device *dev, size_t size,  	void *addr, dma_addr_t dma);  #if 0 @@ -1463,8 +1456,6 @@ struct usb_sg_request {  	struct usb_device	*dev;  	int			pipe; -	struct scatterlist	*sg; -	int			nents;  	int			entries;  	struct urb		**urbs; @@ -1532,23 +1523,31 @@ static inline unsigned int __create_pipe(struct usb_device *dev,  }  /* Create various pipes... */ -#define usb_sndctrlpipe(dev,endpoint)	\ +#define usb_sndctrlpipe(dev, endpoint)	\  	((PIPE_CONTROL << 30) | __create_pipe(dev, endpoint)) -#define usb_rcvctrlpipe(dev,endpoint)	\ +#define usb_rcvctrlpipe(dev, endpoint)	\  	((PIPE_CONTROL << 30) | __create_pipe(dev, endpoint) | USB_DIR_IN) -#define usb_sndisocpipe(dev,endpoint)	\ +#define usb_sndisocpipe(dev, endpoint)	\  	((PIPE_ISOCHRONOUS << 30) | __create_pipe(dev, endpoint)) -#define usb_rcvisocpipe(dev,endpoint)	\ +#define usb_rcvisocpipe(dev, endpoint)	\  	((PIPE_ISOCHRONOUS << 30) | __create_pipe(dev, endpoint) | USB_DIR_IN) -#define usb_sndbulkpipe(dev,endpoint)	\ +#define usb_sndbulkpipe(dev, endpoint)	\  	((PIPE_BULK << 30) | __create_pipe(dev, endpoint)) -#define usb_rcvbulkpipe(dev,endpoint)	\ +#define usb_rcvbulkpipe(dev, endpoint)	\  	((PIPE_BULK << 30) | __create_pipe(dev, endpoint) | USB_DIR_IN) -#define usb_sndintpipe(dev,endpoint)	\ +#define usb_sndintpipe(dev, endpoint)	\  	((PIPE_INTERRUPT << 30) | __create_pipe(dev, endpoint)) -#define usb_rcvintpipe(dev,endpoint)	\ +#define usb_rcvintpipe(dev, endpoint)	\  	((PIPE_INTERRUPT << 30) | __create_pipe(dev, endpoint) | USB_DIR_IN) +static inline struct usb_host_endpoint * +usb_pipe_endpoint(struct usb_device *dev, unsigned int pipe) +{ +	struct usb_host_endpoint **eps; +	eps = usb_pipein(pipe) ? dev->ep_in : dev->ep_out; +	return eps[usb_pipeendpoint(pipe)]; +} +  /*-------------------------------------------------------------------------*/  static inline __u16 @@ -1582,14 +1581,18 @@ extern void usb_register_notify(struct notifier_block *nb);  extern void usb_unregister_notify(struct notifier_block *nb);  #ifdef DEBUG -#define dbg(format, arg...) printk(KERN_DEBUG "%s: " format "\n" , \ -	__FILE__ , ## arg) +#define dbg(format, arg...)						\ +	printk(KERN_DEBUG "%s: " format "\n", __FILE__, ##arg)  #else -#define dbg(format, arg...) do {} while (0) +#define dbg(format, arg...)						\ +do {									\ +	if (0)								\ +		printk(KERN_DEBUG "%s: " format "\n", __FILE__, ##arg); \ +} while (0)  #endif -#define err(format, arg...) printk(KERN_ERR KBUILD_MODNAME ": " \ -	format "\n" , ## arg) +#define err(format, arg...)					\ +	printk(KERN_ERR KBUILD_MODNAME ": " format "\n", ##arg)  /* debugfs stuff */  extern struct dentry *usb_debug_root; diff --git a/include/linux/usb/Kbuild b/include/linux/usb/Kbuild index 54c446309a2..51410e0200c 100644 --- a/include/linux/usb/Kbuild +++ b/include/linux/usb/Kbuild @@ -1,8 +1,8 @@  header-y += audio.h  header-y += cdc.h  header-y += ch9.h +header-y += ch11.h  header-y += gadgetfs.h  header-y += midi.h  header-y += g_printer.h  header-y += tmc.h -header-y += vstusb.h diff --git a/include/linux/usb/atmel_usba_udc.h b/include/linux/usb/atmel_usba_udc.h index 6311fa2d9f8..ba99af275a3 100644 --- a/include/linux/usb/atmel_usba_udc.h +++ b/include/linux/usb/atmel_usba_udc.h @@ -15,6 +15,7 @@ struct usba_ep_data {  struct usba_platform_data {  	int			vbus_pin; +	int			vbus_pin_inverted;  	int			num_ep;  	struct usba_ep_data	ep[0];  }; diff --git a/include/linux/usb/audio-v2.h b/include/linux/usb/audio-v2.h new file mode 100644 index 00000000000..92f1d99f0f1 --- /dev/null +++ b/include/linux/usb/audio-v2.h @@ -0,0 +1,394 @@ +/* + * Copyright (c) 2010 Daniel Mack <daniel@caiaq.de> + * + * This software is distributed under the terms of the GNU General Public + * License ("GPL") version 2, as published by the Free Software Foundation. + * + * This file holds USB constants and structures defined + * by the USB Device Class Definition for Audio Devices in version 2.0. + * Comments below reference relevant sections of the documents contained + * in http://www.usb.org/developers/devclass_docs/Audio2.0_final.zip + */ + +#ifndef __LINUX_USB_AUDIO_V2_H +#define __LINUX_USB_AUDIO_V2_H + +#include <linux/types.h> + +/* v1.0 and v2.0 of this standard have many things in common. For the rest + * of the definitions, please refer to audio.h */ + +/* 4.7.2.1 Clock Source Descriptor */ + +struct uac_clock_source_descriptor { +	__u8 bLength; +	__u8 bDescriptorType; +	__u8 bDescriptorSubtype; +	__u8 bClockID; +	__u8 bmAttributes; +	__u8 bmControls; +	__u8 bAssocTerminal; +	__u8 iClockSource; +} __attribute__((packed)); + +/* 4.7.2.2 Clock Source Descriptor */ + +struct uac_clock_selector_descriptor { +	__u8 bLength; +	__u8 bDescriptorType; +	__u8 bDescriptorSubtype; +	__u8 bClockID; +	__u8 bNrInPins; +	__u8 bmControls; +	__u8 baCSourceID[]; +} __attribute__((packed)); + +/* 4.7.2.4 Input terminal descriptor */ + +struct uac2_input_terminal_descriptor { +	__u8 bLength; +	__u8 bDescriptorType; +	__u8 bDescriptorSubtype; +	__u8 bTerminalID; +	__u16 wTerminalType; +	__u8 bAssocTerminal; +	__u8 bCSourceID; +	__u8 bNrChannels; +	__u32 bmChannelConfig; +	__u8 iChannelNames; +	__u16 bmControls; +	__u8 iTerminal; +} __attribute__((packed)); + +/* 4.7.2.5 Output terminal descriptor */ + +struct uac2_output_terminal_descriptor { +	__u8 bLength; +	__u8 bDescriptorType; +	__u8 bDescriptorSubtype; +	__u8 bTerminalID; +	__u16 wTerminalType; +	__u8 bAssocTerminal; +	__u8 bSourceID; +	__u8 bCSourceID; +	__u16 bmControls; +	__u8 iTerminal; +} __attribute__((packed)); + + + +/* 4.7.2.8 Feature Unit Descriptor */ + +struct uac2_feature_unit_descriptor { +	__u8 bLength; +	__u8 bDescriptorType; +	__u8 bDescriptorSubtype; +	__u8 bUnitID; +	__u8 bSourceID; +	/* bmaControls is actually u32, +	 * but u8 is needed for the hybrid parser */ +	__u8 bmaControls[0]; /* variable length */ +} __attribute__((packed)); + +/* 4.9.2 Class-Specific AS Interface Descriptor */ + +struct uac_as_header_descriptor_v2 { +	__u8 bLength; +	__u8 bDescriptorType; +	__u8 bDescriptorSubtype; +	__u8 bTerminalLink; +	__u8 bmControls; +	__u8 bFormatType; +	__u32 bmFormats; +	__u8 bNrChannels; +	__u32 bmChannelConfig; +	__u8 iChannelNames; +} __attribute__((packed)); + +/* 4.10.1.2 Class-Specific AS Isochronous Audio Data Endpoint Descriptor */ + +struct uac2_iso_endpoint_descriptor { +	__u8  bLength;			/* in bytes: 8 */ +	__u8  bDescriptorType;		/* USB_DT_CS_ENDPOINT */ +	__u8  bDescriptorSubtype;	/* EP_GENERAL */ +	__u8  bmAttributes; +	__u8  bmControls; +	__u8  bLockDelayUnits; +	__le16 wLockDelay; +} __attribute__((packed)); + +#define UAC2_CONTROL_PITCH		(3 << 0) +#define UAC2_CONTROL_DATA_OVERRUN	(3 << 2) +#define UAC2_CONTROL_DATA_UNDERRUN	(3 << 4) + +/* 6.1 Interrupt Data Message */ + +#define UAC2_INTERRUPT_DATA_MSG_VENDOR	(1 << 0) +#define UAC2_INTERRUPT_DATA_MSG_EP	(1 << 1) + +struct uac2_interrupt_data_msg { +	__u8 bInfo; +	__u8 bAttribute; +	__le16 wValue; +	__le16 wIndex; +} __attribute__((packed)); + +/* A.7 Audio Function Category Codes */ +#define UAC2_FUNCTION_SUBCLASS_UNDEFINED	0x00 +#define UAC2_FUNCTION_DESKTOP_SPEAKER		0x01 +#define UAC2_FUNCTION_HOME_THEATER		0x02 +#define UAC2_FUNCTION_MICROPHONE		0x03 +#define UAC2_FUNCTION_HEADSET			0x04 +#define UAC2_FUNCTION_TELEPHONE			0x05 +#define UAC2_FUNCTION_CONVERTER			0x06 +#define UAC2_FUNCTION_SOUND_RECORDER		0x07 +#define UAC2_FUNCTION_IO_BOX			0x08 +#define UAC2_FUNCTION_MUSICAL_INSTRUMENT	0x09 +#define UAC2_FUNCTION_PRO_AUDIO			0x0a +#define UAC2_FUNCTION_AUDIO_VIDEO		0x0b +#define UAC2_FUNCTION_CONTROL_PANEL		0x0c +#define UAC2_FUNCTION_OTHER			0xff + +/* A.9 Audio Class-Specific AC Interface Descriptor Subtypes */ +/* see audio.h for the rest, which is identical to v1 */ +#define UAC2_EFFECT_UNIT			0x07 +#define UAC2_PROCESSING_UNIT_V2		0x08 +#define UAC2_EXTENSION_UNIT_V2		0x09 +#define UAC2_CLOCK_SOURCE		0x0a +#define UAC2_CLOCK_SELECTOR		0x0b +#define UAC2_CLOCK_MULTIPLIER		0x0c +#define UAC2_SAMPLE_RATE_CONVERTER	0x0d + +/* A.10 Audio Class-Specific AS Interface Descriptor Subtypes */ +/* see audio.h for the rest, which is identical to v1 */ +#define UAC2_ENCODER			0x03 +#define UAC2_DECODER			0x04 + +/* A.11 Effect Unit Effect Types */ +#define UAC2_EFFECT_UNDEFINED		0x00 +#define UAC2_EFFECT_PARAM_EQ		0x01 +#define UAC2_EFFECT_REVERB		0x02 +#define UAC2_EFFECT_MOD_DELAY		0x03 +#define UAC2_EFFECT_DYN_RANGE_COMP	0x04 + +/* A.12 Processing Unit Process Types */ +#define UAC2_PROCESS_UNDEFINED		0x00 +#define UAC2_PROCESS_UP_DOWNMIX		0x01 +#define UAC2_PROCESS_DOLBY_PROLOCIC	0x02 +#define UAC2_PROCESS_STEREO_EXTENDER	0x03 + +/* A.14 Audio Class-Specific Request Codes */ +#define UAC2_CS_CUR			0x01 +#define UAC2_CS_RANGE			0x02 +#define UAC2_CS_MEM			0x03 + +/* A.15 Encoder Type Codes */ +#define UAC2_ENCODER_UNDEFINED		0x00 +#define UAC2_ENCODER_OTHER		0x01 +#define UAC2_ENCODER_MPEG		0x02 +#define UAC2_ENCODER_AC3		0x03 +#define UAC2_ENCODER_WMA		0x04 +#define UAC2_ENCODER_DTS		0x05 + +/* A.16 Decoder Type Codes */ +#define UAC2_DECODER_UNDEFINED		0x00 +#define UAC2_DECODER_OTHER		0x01 +#define UAC2_DECODER_MPEG		0x02 +#define UAC2_DECODER_AC3		0x03 +#define UAC2_DECODER_WMA		0x04 +#define UAC2_DECODER_DTS		0x05 + +/* A.17.1 Clock Source Control Selectors */ +#define UAC2_CS_UNDEFINED		0x00 +#define UAC2_CS_CONTROL_SAM_FREQ	0x01 +#define UAC2_CS_CONTROL_CLOCK_VALID	0x02 + +/* A.17.2 Clock Selector Control Selectors */ +#define UAC2_CX_UNDEFINED		0x00 +#define UAC2_CX_CLOCK_SELECTOR		0x01 + +/* A.17.3 Clock Multiplier Control Selectors */ +#define UAC2_CM_UNDEFINED		0x00 +#define UAC2_CM_NUMERATOR		0x01 +#define UAC2_CM_DENOMINTATOR		0x02 + +/* A.17.4 Terminal Control Selectors */ +#define UAC2_TE_UNDEFINED		0x00 +#define UAC2_TE_COPY_PROTECT		0x01 +#define UAC2_TE_CONNECTOR		0x02 +#define UAC2_TE_OVERLOAD		0x03 +#define UAC2_TE_CLUSTER			0x04 +#define UAC2_TE_UNDERFLOW		0x05 +#define UAC2_TE_OVERFLOW		0x06 +#define UAC2_TE_LATENCY			0x07 + +/* A.17.5 Mixer Control Selectors */ +#define UAC2_MU_UNDEFINED		0x00 +#define UAC2_MU_MIXER			0x01 +#define UAC2_MU_CLUSTER			0x02 +#define UAC2_MU_UNDERFLOW		0x03 +#define UAC2_MU_OVERFLOW		0x04 +#define UAC2_MU_LATENCY			0x05 + +/* A.17.6 Selector Control Selectors */ +#define UAC2_SU_UNDEFINED		0x00 +#define UAC2_SU_SELECTOR		0x01 +#define UAC2_SU_LATENCY			0x02 + +/* A.17.7 Feature Unit Control Selectors */ +/* see audio.h for the rest, which is identical to v1 */ +#define UAC2_FU_INPUT_GAIN		0x0b +#define UAC2_FU_INPUT_GAIN_PAD		0x0c +#define UAC2_FU_PHASE_INVERTER		0x0d +#define UAC2_FU_UNDERFLOW		0x0e +#define UAC2_FU_OVERFLOW		0x0f +#define UAC2_FU_LATENCY			0x10 + +/* A.17.8.1 Parametric Equalizer Section Effect Unit Control Selectors */ +#define UAC2_PE_UNDEFINED		0x00 +#define UAC2_PE_ENABLE			0x01 +#define UAC2_PE_CENTERFREQ		0x02 +#define UAC2_PE_QFACTOR			0x03 +#define UAC2_PE_GAIN			0x04 +#define UAC2_PE_UNDERFLOW		0x05 +#define UAC2_PE_OVERFLOW		0x06 +#define UAC2_PE_LATENCY			0x07 + +/* A.17.8.2 Reverberation Effect Unit Control Selectors */ +#define UAC2_RV_UNDEFINED		0x00 +#define UAC2_RV_ENABLE			0x01 +#define UAC2_RV_TYPE			0x02 +#define UAC2_RV_LEVEL			0x03 +#define UAC2_RV_TIME			0x04 +#define UAC2_RV_FEEDBACK		0x05 +#define UAC2_RV_PREDELAY		0x06 +#define UAC2_RV_DENSITY			0x07 +#define UAC2_RV_HIFREQ_ROLLOFF		0x08 +#define UAC2_RV_UNDERFLOW		0x09 +#define UAC2_RV_OVERFLOW		0x0a +#define UAC2_RV_LATENCY			0x0b + +/* A.17.8.3 Modulation Delay Effect Control Selectors */ +#define UAC2_MD_UNDEFINED		0x00 +#define UAC2_MD_ENABLE			0x01 +#define UAC2_MD_BALANCE			0x02 +#define UAC2_MD_RATE			0x03 +#define UAC2_MD_DEPTH			0x04 +#define UAC2_MD_TIME			0x05 +#define UAC2_MD_FEEDBACK		0x06 +#define UAC2_MD_UNDERFLOW		0x07 +#define UAC2_MD_OVERFLOW		0x08 +#define UAC2_MD_LATENCY			0x09 + +/* A.17.8.4 Dynamic Range Compressor Effect Unit Control Selectors */ +#define UAC2_DR_UNDEFINED		0x00 +#define UAC2_DR_ENABLE			0x01 +#define UAC2_DR_COMPRESSION_RATE	0x02 +#define UAC2_DR_MAXAMPL			0x03 +#define UAC2_DR_THRESHOLD		0x04 +#define UAC2_DR_ATTACK_TIME		0x05 +#define UAC2_DR_RELEASE_TIME		0x06 +#define UAC2_DR_UNDEFLOW		0x07 +#define UAC2_DR_OVERFLOW		0x08 +#define UAC2_DR_LATENCY			0x09 + +/* A.17.9.1 Up/Down-mix Processing Unit Control Selectors */ +#define UAC2_UD_UNDEFINED		0x00 +#define UAC2_UD_ENABLE			0x01 +#define UAC2_UD_MODE_SELECT		0x02 +#define UAC2_UD_CLUSTER			0x03 +#define UAC2_UD_UNDERFLOW		0x04 +#define UAC2_UD_OVERFLOW		0x05 +#define UAC2_UD_LATENCY			0x06 + +/* A.17.9.2 Dolby Prologic[tm] Processing Unit Control Selectors */ +#define UAC2_DP_UNDEFINED		0x00 +#define UAC2_DP_ENABLE			0x01 +#define UAC2_DP_MODE_SELECT		0x02 +#define UAC2_DP_CLUSTER			0x03 +#define UAC2_DP_UNDERFFLOW		0x04 +#define UAC2_DP_OVERFLOW		0x05 +#define UAC2_DP_LATENCY			0x06 + +/* A.17.9.3 Stereo Expander Processing Unit Control Selectors */ +#define UAC2_ST_EXT_UNDEFINED		0x00 +#define UAC2_ST_EXT_ENABLE		0x01 +#define UAC2_ST_EXT_WIDTH		0x02 +#define UAC2_ST_EXT_UNDEFLOW		0x03 +#define UAC2_ST_EXT_OVERFLOW		0x04 +#define UAC2_ST_EXT_LATENCY		0x05 + +/* A.17.10 Extension Unit Control Selectors */ +#define UAC2_XU_UNDEFINED		0x00 +#define UAC2_XU_ENABLE			0x01 +#define UAC2_XU_CLUSTER			0x02 +#define UAC2_XU_UNDERFLOW		0x03 +#define UAC2_XU_OVERFLOW		0x04 +#define UAC2_XU_LATENCY			0x05 + +/* A.17.11 AudioStreaming Interface Control Selectors */ +#define UAC2_AS_UNDEFINED		0x00 +#define UAC2_AS_ACT_ALT_SETTING		0x01 +#define UAC2_AS_VAL_ALT_SETTINGS	0x02 +#define UAC2_AS_AUDIO_DATA_FORMAT	0x03 + +/* A.17.12 Encoder Control Selectors */ +#define UAC2_EN_UNDEFINED		0x00 +#define UAC2_EN_BIT_RATE		0x01 +#define UAC2_EN_QUALITY			0x02 +#define UAC2_EN_VBR			0x03 +#define UAC2_EN_TYPE			0x04 +#define UAC2_EN_UNDERFLOW		0x05 +#define UAC2_EN_OVERFLOW		0x06 +#define UAC2_EN_ENCODER_ERROR		0x07 +#define UAC2_EN_PARAM1			0x08 +#define UAC2_EN_PARAM2			0x09 +#define UAC2_EN_PARAM3			0x0a +#define UAC2_EN_PARAM4			0x0b +#define UAC2_EN_PARAM5			0x0c +#define UAC2_EN_PARAM6			0x0d +#define UAC2_EN_PARAM7			0x0e +#define UAC2_EN_PARAM8			0x0f + +/* A.17.13.1 MPEG Decoder Control Selectors */ +#define UAC2_MPEG_UNDEFINED		0x00 +#define UAC2_MPEG_DUAL_CHANNEL		0x01 +#define UAC2_MPEG_SECOND_STEREO		0x02 +#define UAC2_MPEG_MULTILINGUAL		0x03 +#define UAC2_MPEG_DYN_RANGE		0x04 +#define UAC2_MPEG_SCALING		0x05 +#define UAC2_MPEG_HILO_SCALING		0x06 +#define UAC2_MPEG_UNDERFLOW		0x07 +#define UAC2_MPEG_OVERFLOW		0x08 +#define UAC2_MPEG_DECODER_ERROR		0x09 + +/* A17.13.2 AC3 Decoder Control Selectors */ +#define UAC2_AC3_UNDEFINED		0x00 +#define UAC2_AC3_MODE			0x01 +#define UAC2_AC3_DYN_RANGE		0x02 +#define UAC2_AC3_SCALING		0x03 +#define UAC2_AC3_HILO_SCALING		0x04 +#define UAC2_AC3_UNDERFLOW		0x05 +#define UAC2_AC3_OVERFLOW		0x06 +#define UAC2_AC3_DECODER_ERROR		0x07 + +/* A17.13.3 WMA Decoder Control Selectors */ +#define UAC2_WMA_UNDEFINED		0x00 +#define UAC2_WMA_UNDERFLOW		0x01 +#define UAC2_WMA_OVERFLOW		0x02 +#define UAC2_WMA_DECODER_ERROR		0x03 + +/* A17.13.4 DTS Decoder Control Selectors */ +#define UAC2_DTS_UNDEFINED		0x00 +#define UAC2_DTS_UNDERFLOW		0x01 +#define UAC2_DTS_OVERFLOW		0x02 +#define UAC2_DTS_DECODER_ERROR		0x03 + +/* A17.14 Endpoint Control Selectors */ +#define UAC2_EP_CS_UNDEFINED		0x00 +#define UAC2_EP_CS_PITCH		0x01 +#define UAC2_EP_CS_DATA_OVERRUN		0x02 +#define UAC2_EP_CS_DATA_UNDERRUN	0x03 + +#endif /* __LINUX_USB_AUDIO_V2_H */ + diff --git a/include/linux/usb/audio.h b/include/linux/usb/audio.h index eaf9dffe0a0..5d646c38875 100644 --- a/include/linux/usb/audio.h +++ b/include/linux/usb/audio.h @@ -13,6 +13,9 @@   * Comments below reference relevant sections of that document:   *   * http://www.usb.org/developers/devclass_docs/audio10.pdf + * + * Types and defines in this file are either specific to version 1.0 of + * this standard or common for newer versions.   */  #ifndef __LINUX_USB_AUDIO_H @@ -20,6 +23,10 @@  #include <linux/types.h> +/* bInterfaceProtocol values to denote the version of the standard used */ +#define UAC_VERSION_1			0x00 +#define UAC_VERSION_2			0x20 +  /* A.2 Audio Interface Subclass Codes */  #define USB_SUBCLASS_AUDIOCONTROL	0x01  #define USB_SUBCLASS_AUDIOSTREAMING	0x02 @@ -32,8 +39,8 @@  #define UAC_MIXER_UNIT			0x04  #define UAC_SELECTOR_UNIT		0x05  #define UAC_FEATURE_UNIT		0x06 -#define UAC_PROCESSING_UNIT		0x07 -#define UAC_EXTENSION_UNIT		0x08 +#define UAC_PROCESSING_UNIT_V1		0x07 +#define UAC_EXTENSION_UNIT_V1		0x08  /* A.6 Audio Class-Specific AS Interface Descriptor Subtypes */  #define UAC_AS_GENERAL			0x01 @@ -81,7 +88,7 @@  /* Terminal Control Selectors */  /* 4.3.2  Class-Specific AC Interface Descriptor */ -struct uac_ac_header_descriptor { +struct uac_ac_header_descriptor_v1 {  	__u8  bLength;			/* 8 + n */  	__u8  bDescriptorType;		/* USB_DT_CS_INTERFACE */  	__u8  bDescriptorSubtype;	/* UAC_MS_HEADER */ @@ -94,8 +101,8 @@ struct uac_ac_header_descriptor {  #define UAC_DT_AC_HEADER_SIZE(n)	(8 + (n))  /* As above, but more useful for defining your own descriptors: */ -#define DECLARE_UAC_AC_HEADER_DESCRIPTOR(n) 			\ -struct uac_ac_header_descriptor_##n {				\ +#define DECLARE_UAC_AC_HEADER_DESCRIPTOR(n)			\ +struct uac_ac_header_descriptor_v1_##n {			\  	__u8  bLength;						\  	__u8  bDescriptorType;					\  	__u8  bDescriptorSubtype;				\ @@ -130,8 +137,12 @@ struct uac_input_terminal_descriptor {  #define UAC_INPUT_TERMINAL_MICROPHONE_ARRAY		0x205  #define UAC_INPUT_TERMINAL_PROC_MICROPHONE_ARRAY	0x206 +/* Terminals - control selectors */ + +#define UAC_TERMINAL_CS_COPY_PROTECT_CONTROL		0x01 +  /* 4.3.2.2 Output Terminal Descriptor */ -struct uac_output_terminal_descriptor { +struct uac_output_terminal_descriptor_v1 {  	__u8  bLength;			/* in bytes: 9 */  	__u8  bDescriptorType;		/* CS_INTERFACE descriptor type */  	__u8  bDescriptorSubtype;	/* OUTPUT_TERMINAL descriptor subtype */ @@ -158,7 +169,7 @@ struct uac_output_terminal_descriptor {  #define UAC_DT_FEATURE_UNIT_SIZE(ch)		(7 + ((ch) + 1) * 2)  /* As above, but more useful for defining your own descriptors: */ -#define DECLARE_UAC_FEATURE_UNIT_DESCRIPTOR(ch) 		\ +#define DECLARE_UAC_FEATURE_UNIT_DESCRIPTOR(ch)			\  struct uac_feature_unit_descriptor_##ch {			\  	__u8  bLength;						\  	__u8  bDescriptorType;					\ @@ -170,8 +181,158 @@ struct uac_feature_unit_descriptor_##ch {			\  	__u8  iFeature;						\  } __attribute__ ((packed)) +/* 4.3.2.3 Mixer Unit Descriptor */ +struct uac_mixer_unit_descriptor { +	__u8 bLength; +	__u8 bDescriptorType; +	__u8 bDescriptorSubtype; +	__u8 bUnitID; +	__u8 bNrInPins; +	__u8 baSourceID[]; +} __attribute__ ((packed)); + +static inline __u8 uac_mixer_unit_bNrChannels(struct uac_mixer_unit_descriptor *desc) +{ +	return desc->baSourceID[desc->bNrInPins]; +} + +static inline __u32 uac_mixer_unit_wChannelConfig(struct uac_mixer_unit_descriptor *desc, +						  int protocol) +{ +	if (protocol == UAC_VERSION_1) +		return (desc->baSourceID[desc->bNrInPins + 2] << 8) | +			desc->baSourceID[desc->bNrInPins + 1]; +	else +		return  (desc->baSourceID[desc->bNrInPins + 4] << 24) | +			(desc->baSourceID[desc->bNrInPins + 3] << 16) | +			(desc->baSourceID[desc->bNrInPins + 2] << 8)  | +			(desc->baSourceID[desc->bNrInPins + 1]); +} + +static inline __u8 uac_mixer_unit_iChannelNames(struct uac_mixer_unit_descriptor *desc, +						int protocol) +{ +	return (protocol == UAC_VERSION_1) ? +		desc->baSourceID[desc->bNrInPins + 3] : +		desc->baSourceID[desc->bNrInPins + 5]; +} + +static inline __u8 *uac_mixer_unit_bmControls(struct uac_mixer_unit_descriptor *desc, +					      int protocol) +{ +	return (protocol == UAC_VERSION_1) ? +		&desc->baSourceID[desc->bNrInPins + 4] : +		&desc->baSourceID[desc->bNrInPins + 6]; +} + +static inline __u8 uac_mixer_unit_iMixer(struct uac_mixer_unit_descriptor *desc) +{ +	__u8 *raw = (__u8 *) desc; +	return raw[desc->bLength - 1]; +} + +/* 4.3.2.4 Selector Unit Descriptor */ +struct uac_selector_unit_descriptor { +	__u8 bLength; +	__u8 bDescriptorType; +	__u8 bDescriptorSubtype; +	__u8 bUintID; +	__u8 bNrInPins; +	__u8 baSourceID[]; +} __attribute__ ((packed)); + +static inline __u8 uac_selector_unit_iSelector(struct uac_selector_unit_descriptor *desc) +{ +	__u8 *raw = (__u8 *) desc; +	return raw[9 + desc->bLength - 1]; +} + +/* 4.3.2.5 Feature Unit Descriptor */ +struct uac_feature_unit_descriptor { +	__u8 bLength; +	__u8 bDescriptorType; +	__u8 bDescriptorSubtype; +	__u8 bUnitID; +	__u8 bSourceID; +	__u8 bControlSize; +	__u8 bmaControls[0]; /* variable length */ +} __attribute__((packed)); + +static inline __u8 uac_feature_unit_iFeature(struct uac_feature_unit_descriptor *desc) +{ +	__u8 *raw = (__u8 *) desc; +	return raw[desc->bLength - 1]; +} + +/* 4.3.2.6 Processing Unit Descriptors */ +struct uac_processing_unit_descriptor { +	__u8 bLength; +	__u8 bDescriptorType; +	__u8 bDescriptorSubtype; +	__u8 bUnitID; +	__u16 wProcessType; +	__u8 bNrInPins; +	__u8 baSourceID[]; +} __attribute__ ((packed)); + +static inline __u8 uac_processing_unit_bNrChannels(struct uac_processing_unit_descriptor *desc) +{ +	return desc->baSourceID[desc->bNrInPins]; +} + +static inline __u32 uac_processing_unit_wChannelConfig(struct uac_processing_unit_descriptor *desc, +						       int protocol) +{ +	if (protocol == UAC_VERSION_1) +		return (desc->baSourceID[desc->bNrInPins + 2] << 8) | +			desc->baSourceID[desc->bNrInPins + 1]; +	else +		return  (desc->baSourceID[desc->bNrInPins + 4] << 24) | +			(desc->baSourceID[desc->bNrInPins + 3] << 16) | +			(desc->baSourceID[desc->bNrInPins + 2] << 8)  | +			(desc->baSourceID[desc->bNrInPins + 1]); +} + +static inline __u8 uac_processing_unit_iChannelNames(struct uac_processing_unit_descriptor *desc, +						     int protocol) +{ +	return (protocol == UAC_VERSION_1) ? +		desc->baSourceID[desc->bNrInPins + 3] : +		desc->baSourceID[desc->bNrInPins + 5]; +} + +static inline __u8 uac_processing_unit_bControlSize(struct uac_processing_unit_descriptor *desc, +						    int protocol) +{ +	return (protocol == UAC_VERSION_1) ? +		desc->baSourceID[desc->bNrInPins + 4] : +		desc->baSourceID[desc->bNrInPins + 6]; +} + +static inline __u8 *uac_processing_unit_bmControls(struct uac_processing_unit_descriptor *desc, +						   int protocol) +{ +	return (protocol == UAC_VERSION_1) ? +		&desc->baSourceID[desc->bNrInPins + 5] : +		&desc->baSourceID[desc->bNrInPins + 7]; +} + +static inline __u8 uac_processing_unit_iProcessing(struct uac_processing_unit_descriptor *desc, +						   int protocol) +{ +	__u8 control_size = uac_processing_unit_bControlSize(desc, protocol); +	return desc->baSourceID[desc->bNrInPins + control_size]; +} + +static inline __u8 *uac_processing_unit_specific(struct uac_processing_unit_descriptor *desc, +						 int protocol) +{ +	__u8 control_size = uac_processing_unit_bControlSize(desc, protocol); +	return &desc->baSourceID[desc->bNrInPins + control_size + 1]; +} +  /* 4.5.2 Class-Specific AS Interface Descriptor */ -struct uac_as_header_descriptor { +struct uac_as_header_descriptor_v1 {  	__u8  bLength;			/* in bytes: 7 */  	__u8  bDescriptorType;		/* USB_DT_CS_INTERFACE */  	__u8  bDescriptorSubtype;	/* AS_GENERAL */ @@ -217,7 +378,7 @@ struct uac_format_type_i_discrete_descriptor {  	__u8  tSamFreq[][3];  } __attribute__ ((packed)); -#define DECLARE_UAC_FORMAT_TYPE_I_DISCRETE_DESC(n) 		\ +#define DECLARE_UAC_FORMAT_TYPE_I_DISCRETE_DESC(n)		\  struct uac_format_type_i_discrete_descriptor_##n {		\  	__u8  bLength;						\  	__u8  bDescriptorType;					\ @@ -232,11 +393,61 @@ struct uac_format_type_i_discrete_descriptor_##n {		\  #define UAC_FORMAT_TYPE_I_DISCRETE_DESC_SIZE(n)	(8 + (n * 3)) +struct uac_format_type_i_ext_descriptor { +	__u8 bLength; +	__u8 bDescriptorType; +	__u8 bDescriptorSubtype; +	__u8 bFormatType; +	__u8 bSubslotSize; +	__u8 bBitResolution; +	__u8 bHeaderLength; +	__u8 bControlSize; +	__u8 bSideBandProtocol; +} __attribute__((packed)); + +/* Formats - Audio Data Format Type I Codes */ + +#define UAC_FORMAT_TYPE_II_MPEG	0x1001 +#define UAC_FORMAT_TYPE_II_AC3	0x1002 + +struct uac_format_type_ii_discrete_descriptor { +	__u8 bLength; +	__u8 bDescriptorType; +	__u8 bDescriptorSubtype; +	__u8 bFormatType; +	__le16 wMaxBitRate; +	__le16 wSamplesPerFrame; +	__u8 bSamFreqType; +	__u8 tSamFreq[][3]; +} __attribute__((packed)); + +struct uac_format_type_ii_ext_descriptor { +	__u8 bLength; +	__u8 bDescriptorType; +	__u8 bDescriptorSubtype; +	__u8 bFormatType; +	__u16 wMaxBitRate; +	__u16 wSamplesPerFrame; +	__u8 bHeaderLength; +	__u8 bSideBandProtocol; +} __attribute__((packed)); + +/* type III */ +#define UAC_FORMAT_TYPE_III_IEC1937_AC3	0x2001 +#define UAC_FORMAT_TYPE_III_IEC1937_MPEG1_LAYER1	0x2002 +#define UAC_FORMAT_TYPE_III_IEC1937_MPEG2_NOEXT	0x2003 +#define UAC_FORMAT_TYPE_III_IEC1937_MPEG2_EXT	0x2004 +#define UAC_FORMAT_TYPE_III_IEC1937_MPEG2_LAYER1_LS	0x2005 +#define UAC_FORMAT_TYPE_III_IEC1937_MPEG2_LAYER23_LS	0x2006 +  /* Formats - A.2 Format Type Codes */  #define UAC_FORMAT_TYPE_UNDEFINED	0x0  #define UAC_FORMAT_TYPE_I		0x1  #define UAC_FORMAT_TYPE_II		0x2  #define UAC_FORMAT_TYPE_III		0x3 +#define UAC_EXT_FORMAT_TYPE_I		0x81 +#define UAC_EXT_FORMAT_TYPE_II		0x82 +#define UAC_EXT_FORMAT_TYPE_III		0x83  struct uac_iso_endpoint_descriptor {  	__u8  bLength;			/* in bytes: 7 */ @@ -245,7 +456,7 @@ struct uac_iso_endpoint_descriptor {  	__u8  bmAttributes;  	__u8  bLockDelayUnits;  	__le16 wLockDelay; -}; +} __attribute__((packed));  #define UAC_ISO_ENDPOINT_DESC_SIZE	7  #define UAC_EP_CS_ATTR_SAMPLE_RATE	0x01 @@ -253,6 +464,7 @@ struct uac_iso_endpoint_descriptor {  #define UAC_EP_CS_ATTR_FILL_MAX		0x80  /* A.10.2 Feature Unit Control Selectors */ +  #define UAC_FU_CONTROL_UNDEFINED	0x00  #define UAC_MUTE_CONTROL		0x01  #define UAC_VOLUME_CONTROL		0x02 @@ -276,6 +488,21 @@ struct uac_iso_endpoint_descriptor {  #define UAC_FU_BASS_BOOST	(1 << (UAC_BASS_BOOST_CONTROL - 1))  #define UAC_FU_LOUDNESS		(1 << (UAC_LOUDNESS_CONTROL - 1)) +/* status word format (3.7.1.1) */ + +#define UAC1_STATUS_TYPE_ORIG_MASK		0x0f +#define UAC1_STATUS_TYPE_ORIG_AUDIO_CONTROL_IF	0x0 +#define UAC1_STATUS_TYPE_ORIG_AUDIO_STREAM_IF	0x1 +#define UAC1_STATUS_TYPE_ORIG_AUDIO_STREAM_EP	0x2 + +#define UAC1_STATUS_TYPE_IRQ_PENDING		(1 << 7) +#define UAC1_STATUS_TYPE_MEM_CHANGED		(1 << 6) + +struct uac1_status_word { +	__u8 bStatusType; +	__u8 bOriginator; +} __attribute__((packed)); +  #ifdef __KERNEL__  struct usb_audio_control { diff --git a/include/linux/usb/cdc.h b/include/linux/usb/cdc.h index c24124a42ce..c117a68d04a 100644 --- a/include/linux/usb/cdc.h +++ b/include/linux/usb/cdc.h @@ -18,6 +18,7 @@  #define USB_CDC_SUBCLASS_MDLM			0x0a  #define USB_CDC_SUBCLASS_OBEX			0x0b  #define USB_CDC_SUBCLASS_EEM			0x0c +#define USB_CDC_SUBCLASS_NCM			0x0d  #define USB_CDC_PROTO_NONE			0 @@ -49,6 +50,7 @@  #define USB_CDC_MDLM_DETAIL_TYPE	0x13	/* mdlm_detail_desc */  #define USB_CDC_DMM_TYPE		0x14  #define USB_CDC_OBEX_TYPE		0x15 +#define USB_CDC_NCM_TYPE		0x1a  /* "Header Functional Descriptor" from CDC spec  5.2.3.1 */  struct usb_cdc_header_desc { @@ -174,6 +176,15 @@ struct usb_cdc_obex_desc {  	__le16	bcdVersion;  } __attribute__ ((packed)); +/* "NCM Control Model Functional Descriptor" */ +struct usb_cdc_ncm_desc { +	__u8	bLength; +	__u8	bDescriptorType; +	__u8	bDescriptorSubType; + +	__le16	bcdNcmVersion; +	__u8	bmNetworkCapabilities; +} __attribute__ ((packed));  /*-------------------------------------------------------------------------*/  /* @@ -197,6 +208,17 @@ struct usb_cdc_obex_desc {  #define USB_CDC_GET_ETHERNET_PM_PATTERN_FILTER	0x42  #define USB_CDC_SET_ETHERNET_PACKET_FILTER	0x43  #define USB_CDC_GET_ETHERNET_STATISTIC		0x44 +#define USB_CDC_GET_NTB_PARAMETERS		0x80 +#define USB_CDC_GET_NET_ADDRESS			0x81 +#define USB_CDC_SET_NET_ADDRESS			0x82 +#define USB_CDC_GET_NTB_FORMAT			0x83 +#define USB_CDC_SET_NTB_FORMAT			0x84 +#define USB_CDC_GET_NTB_INPUT_SIZE		0x85 +#define USB_CDC_SET_NTB_INPUT_SIZE		0x86 +#define USB_CDC_GET_MAX_DATAGRAM_SIZE		0x87 +#define USB_CDC_SET_MAX_DATAGRAM_SIZE		0x88 +#define USB_CDC_GET_CRC_MODE			0x89 +#define USB_CDC_SET_CRC_MODE			0x8a  /* Line Coding Structure from CDC spec 6.2.13 */  struct usb_cdc_line_coding { @@ -247,4 +269,76 @@ struct usb_cdc_notification {  	__le16	wLength;  } __attribute__ ((packed)); +/*-------------------------------------------------------------------------*/ + +/* + * Class Specific structures and constants + * + * CDC NCM parameter structure, CDC NCM subclass 6.2.1 + * + */ + +struct usb_cdc_ncm_ntb_parameter { +	__le16	wLength; +	__le16	bmNtbFormatSupported; +	__le32	dwNtbInMaxSize; +	__le16	wNdpInDivisor; +	__le16	wNdpInPayloadRemainder; +	__le16	wNdpInAlignment; +	__le16	wPadding1; +	__le32	dwNtbOutMaxSize; +	__le16	wNdpOutDivisor; +	__le16	wNdpOutPayloadRemainder; +	__le16	wNdpOutAlignment; +	__le16	wPadding2; +} __attribute__ ((packed)); + +/* + * CDC NCM transfer headers, CDC NCM subclass 3.2 + */ + +#define NCM_NTH16_SIGN		0x484D434E /* NCMH */ +#define NCM_NTH32_SIGN		0x686D636E /* ncmh */ + +struct usb_cdc_ncm_nth16 { +	__le32	dwSignature; +	__le16	wHeaderLength; +	__le16	wSequence; +	__le16	wBlockLength; +	__le16	wFpIndex; +} __attribute__ ((packed)); + +struct usb_cdc_ncm_nth32 { +	__le32	dwSignature; +	__le16	wHeaderLength; +	__le16	wSequence; +	__le32	dwBlockLength; +	__le32	dwFpIndex; +} __attribute__ ((packed)); + +/* + * CDC NCM datagram pointers, CDC NCM subclass 3.3 + */ + +#define NCM_NDP16_CRC_SIGN	0x314D434E /* NCM1 */ +#define NCM_NDP16_NOCRC_SIGN	0x304D434E /* NCM0 */ +#define NCM_NDP32_CRC_SIGN	0x316D636E /* ncm1 */ +#define NCM_NDP32_NOCRC_SIGN	0x306D636E /* ncm0 */ + +struct usb_cdc_ncm_ndp16 { +	__le32	dwSignature; +	__le16	wLength; +	__le16	wNextFpIndex; +	__u8	data[0]; +} __attribute__ ((packed)); + +struct usb_cdc_ncm_ndp32 { +	__le32	dwSignature; +	__le16	wLength; +	__le16	wReserved6; +	__le32	dwNextFpIndex; +	__le32	dwReserved12; +	__u8	data[0]; +} __attribute__ ((packed)); +  #endif /* __LINUX_USB_CDC_H */ diff --git a/include/linux/usb/ch11.h b/include/linux/usb/ch11.h new file mode 100644 index 00000000000..119194c85d1 --- /dev/null +++ b/include/linux/usb/ch11.h @@ -0,0 +1,167 @@ +/* + * This file holds Hub protocol constants and data structures that are + * defined in chapter 11 (Hub Specification) of the USB 2.0 specification. + * + * It is used/shared between the USB core, the HCDs and couple of other USB + * drivers. + */ + +#ifndef __LINUX_CH11_H +#define __LINUX_CH11_H + +#include <linux/types.h>	/* __u8 etc */ + +/* + * Hub request types + */ + +#define USB_RT_HUB	(USB_TYPE_CLASS | USB_RECIP_DEVICE) +#define USB_RT_PORT	(USB_TYPE_CLASS | USB_RECIP_OTHER) + +/* + * Hub class requests + * See USB 2.0 spec Table 11-16 + */ +#define HUB_CLEAR_TT_BUFFER	8 +#define HUB_RESET_TT		9 +#define HUB_GET_TT_STATE	10 +#define HUB_STOP_TT		11 + +/* + * Hub Class feature numbers + * See USB 2.0 spec Table 11-17 + */ +#define C_HUB_LOCAL_POWER	0 +#define C_HUB_OVER_CURRENT	1 + +/* + * Port feature numbers + * See USB 2.0 spec Table 11-17 + */ +#define USB_PORT_FEAT_CONNECTION	0 +#define USB_PORT_FEAT_ENABLE		1 +#define USB_PORT_FEAT_SUSPEND		2	/* L2 suspend */ +#define USB_PORT_FEAT_OVER_CURRENT	3 +#define USB_PORT_FEAT_RESET		4 +#define USB_PORT_FEAT_L1		5	/* L1 suspend */ +#define USB_PORT_FEAT_POWER		8 +#define USB_PORT_FEAT_LOWSPEED		9	/* Should never be used */ +#define USB_PORT_FEAT_C_CONNECTION	16 +#define USB_PORT_FEAT_C_ENABLE		17 +#define USB_PORT_FEAT_C_SUSPEND		18 +#define USB_PORT_FEAT_C_OVER_CURRENT	19 +#define USB_PORT_FEAT_C_RESET		20 +#define USB_PORT_FEAT_TEST              21 +#define USB_PORT_FEAT_INDICATOR         22 +#define USB_PORT_FEAT_C_PORT_L1         23 + +/* + * Hub Status and Hub Change results + * See USB 2.0 spec Table 11-19 and Table 11-20 + */ +struct usb_port_status { +	__le16 wPortStatus; +	__le16 wPortChange; +} __attribute__ ((packed)); + +/* + * wPortStatus bit field + * See USB 2.0 spec Table 11-21 + */ +#define USB_PORT_STAT_CONNECTION	0x0001 +#define USB_PORT_STAT_ENABLE		0x0002 +#define USB_PORT_STAT_SUSPEND		0x0004 +#define USB_PORT_STAT_OVERCURRENT	0x0008 +#define USB_PORT_STAT_RESET		0x0010 +#define USB_PORT_STAT_L1		0x0020 +/* bits 6 to 7 are reserved */ +#define USB_PORT_STAT_POWER		0x0100 +#define USB_PORT_STAT_LOW_SPEED		0x0200 +#define USB_PORT_STAT_HIGH_SPEED        0x0400 +#define USB_PORT_STAT_TEST              0x0800 +#define USB_PORT_STAT_INDICATOR         0x1000 +/* bits 13 to 15 are reserved */ +#define USB_PORT_STAT_SUPER_SPEED	0x8000	/* Linux-internal */ + +/* + * wPortChange bit field + * See USB 2.0 spec Table 11-22 + * Bits 0 to 4 shown, bits 5 to 15 are reserved + */ +#define USB_PORT_STAT_C_CONNECTION	0x0001 +#define USB_PORT_STAT_C_ENABLE		0x0002 +#define USB_PORT_STAT_C_SUSPEND		0x0004 +#define USB_PORT_STAT_C_OVERCURRENT	0x0008 +#define USB_PORT_STAT_C_RESET		0x0010 +#define USB_PORT_STAT_C_L1		0x0020 + +/* + * wHubCharacteristics (masks) + * See USB 2.0 spec Table 11-13, offset 3 + */ +#define HUB_CHAR_LPSM		0x0003 /* D1 .. D0 */ +#define HUB_CHAR_COMPOUND	0x0004 /* D2       */ +#define HUB_CHAR_OCPM		0x0018 /* D4 .. D3 */ +#define HUB_CHAR_TTTT           0x0060 /* D6 .. D5 */ +#define HUB_CHAR_PORTIND        0x0080 /* D7       */ + +struct usb_hub_status { +	__le16 wHubStatus; +	__le16 wHubChange; +} __attribute__ ((packed)); + +/* + * Hub Status & Hub Change bit masks + * See USB 2.0 spec Table 11-19 and Table 11-20 + * Bits 0 and 1 for wHubStatus and wHubChange + * Bits 2 to 15 are reserved for both + */ +#define HUB_STATUS_LOCAL_POWER	0x0001 +#define HUB_STATUS_OVERCURRENT	0x0002 +#define HUB_CHANGE_LOCAL_POWER	0x0001 +#define HUB_CHANGE_OVERCURRENT	0x0002 + + +/* + * Hub descriptor + * See USB 2.0 spec Table 11-13 + */ + +#define USB_DT_HUB			(USB_TYPE_CLASS | 0x09) +#define USB_DT_HUB_NONVAR_SIZE		7 + +struct usb_hub_descriptor { +	__u8  bDescLength; +	__u8  bDescriptorType; +	__u8  bNbrPorts; +	__le16 wHubCharacteristics; +	__u8  bPwrOn2PwrGood; +	__u8  bHubContrCurrent; +		/* add 1 bit for hub status change; round to bytes */ +	__u8  DeviceRemovable[(USB_MAXCHILDREN + 1 + 7) / 8]; +	__u8  PortPwrCtrlMask[(USB_MAXCHILDREN + 1 + 7) / 8]; +} __attribute__ ((packed)); + + +/* port indicator status selectors, tables 11-7 and 11-25 */ +#define HUB_LED_AUTO	0 +#define HUB_LED_AMBER	1 +#define HUB_LED_GREEN	2 +#define HUB_LED_OFF	3 + +enum hub_led_mode { +	INDICATOR_AUTO = 0, +	INDICATOR_CYCLE, +	/* software blinks for attention:  software, hardware, reserved */ +	INDICATOR_GREEN_BLINK, INDICATOR_GREEN_BLINK_OFF, +	INDICATOR_AMBER_BLINK, INDICATOR_AMBER_BLINK_OFF, +	INDICATOR_ALT_BLINK, INDICATOR_ALT_BLINK_OFF +} __attribute__ ((packed)); + +/* Transaction Translator Think Times, in bits */ +#define HUB_TTTT_8_BITS		0x00 +#define HUB_TTTT_16_BITS	0x20 +#define HUB_TTTT_24_BITS	0x40 +#define HUB_TTTT_32_BITS	0x60 + +#endif /* __LINUX_CH11_H */ diff --git a/include/linux/usb/ch9.h b/include/linux/usb/ch9.h index 94012e649d8..da2ed77d3e8 100644 --- a/include/linux/usb/ch9.h +++ b/include/linux/usb/ch9.h @@ -191,6 +191,8 @@ struct usb_ctrlrequest {  #define USB_DT_WIRE_ADAPTER		0x21  #define USB_DT_RPIPE			0x22  #define USB_DT_CS_RADIO_CONTROL		0x23 +/* From the T10 UAS specification */ +#define USB_DT_PIPE_USAGE		0x24  /* From the USB 3.0 spec */  #define	USB_DT_SS_ENDPOINT_COMP		0x30 @@ -475,7 +477,7 @@ static inline int usb_endpoint_xfer_isoc(  static inline int usb_endpoint_is_bulk_in(  				const struct usb_endpoint_descriptor *epd)  { -	return (usb_endpoint_xfer_bulk(epd) && usb_endpoint_dir_in(epd)); +	return usb_endpoint_xfer_bulk(epd) && usb_endpoint_dir_in(epd);  }  /** @@ -488,7 +490,7 @@ static inline int usb_endpoint_is_bulk_in(  static inline int usb_endpoint_is_bulk_out(  				const struct usb_endpoint_descriptor *epd)  { -	return (usb_endpoint_xfer_bulk(epd) && usb_endpoint_dir_out(epd)); +	return usb_endpoint_xfer_bulk(epd) && usb_endpoint_dir_out(epd);  }  /** @@ -501,7 +503,7 @@ static inline int usb_endpoint_is_bulk_out(  static inline int usb_endpoint_is_int_in(  				const struct usb_endpoint_descriptor *epd)  { -	return (usb_endpoint_xfer_int(epd) && usb_endpoint_dir_in(epd)); +	return usb_endpoint_xfer_int(epd) && usb_endpoint_dir_in(epd);  }  /** @@ -514,7 +516,7 @@ static inline int usb_endpoint_is_int_in(  static inline int usb_endpoint_is_int_out(  				const struct usb_endpoint_descriptor *epd)  { -	return (usb_endpoint_xfer_int(epd) && usb_endpoint_dir_out(epd)); +	return usb_endpoint_xfer_int(epd) && usb_endpoint_dir_out(epd);  }  /** @@ -527,7 +529,7 @@ static inline int usb_endpoint_is_int_out(  static inline int usb_endpoint_is_isoc_in(  				const struct usb_endpoint_descriptor *epd)  { -	return (usb_endpoint_xfer_isoc(epd) && usb_endpoint_dir_in(epd)); +	return usb_endpoint_xfer_isoc(epd) && usb_endpoint_dir_in(epd);  }  /** @@ -540,7 +542,7 @@ static inline int usb_endpoint_is_isoc_in(  static inline int usb_endpoint_is_isoc_out(  				const struct usb_endpoint_descriptor *epd)  { -	return (usb_endpoint_xfer_isoc(epd) && usb_endpoint_dir_out(epd)); +	return usb_endpoint_xfer_isoc(epd) && usb_endpoint_dir_out(epd);  }  /*-------------------------------------------------------------------------*/ @@ -556,6 +558,8 @@ struct usb_ss_ep_comp_descriptor {  } __attribute__ ((packed));  #define USB_DT_SS_EP_COMP_SIZE		6 +/* Bits 4:0 of bmAttributes if this is a bulk endpoint */ +#define USB_SS_MAX_STREAMS(p)		(1 << (p & 0x1f))  /*-------------------------------------------------------------------------*/ @@ -775,7 +779,7 @@ enum usb_device_speed {  	USB_SPEED_UNKNOWN = 0,			/* enumerating */  	USB_SPEED_LOW, USB_SPEED_FULL,		/* usb 1.1 */  	USB_SPEED_HIGH,				/* usb 2.0 */ -	USB_SPEED_VARIABLE,			/* wireless (usb 2.5) */ +	USB_SPEED_WIRELESS,			/* wireless (usb 2.5) */  	USB_SPEED_SUPER,			/* usb 3.0 */  }; diff --git a/include/linux/usb/composite.h b/include/linux/usb/composite.h index 738ea1a691c..139353efad3 100644 --- a/include/linux/usb/composite.h +++ b/include/linux/usb/composite.h @@ -326,6 +326,7 @@ struct usb_composite_dev {  	/* private: */  	/* internals */ +	unsigned int			suspended:1;  	struct usb_device_descriptor	desc;  	struct list_head		configs;  	struct usb_composite_driver	*driver; diff --git a/include/linux/usb/ehci_def.h b/include/linux/usb/ehci_def.h index af4b86f3aca..80287af2a73 100644 --- a/include/linux/usb/ehci_def.h +++ b/include/linux/usb/ehci_def.h @@ -45,7 +45,7 @@ struct ehci_caps {  #define HCC_CANPARK(p)		((p)&(1 << 2))  /* true: can park on async qh */  #define HCC_PGM_FRAMELISTLEN(p) ((p)&(1 << 1))  /* true: periodic_size changes*/  #define HCC_64BIT_ADDR(p)       ((p)&(1))       /* true: can use 64-bit addr */ -	u8		portroute [8];	 /* nibbles for routing - offset 0xC */ +	u8		portroute[8];	 /* nibbles for routing - offset 0xC */  } __attribute__ ((packed)); @@ -92,14 +92,14 @@ struct ehci_regs {  	/* ASYNCLISTADDR: offset 0x18 */  	u32		async_next;	/* address of next async queue head */ -	u32		reserved [9]; +	u32		reserved[9];  	/* CONFIGFLAG: offset 0x40 */  	u32		configured_flag;  #define FLAG_CF		(1<<0)		/* true: we'll support "high speed" */  	/* PORTSC: offset 0x44 */ -	u32		port_status [0];	/* up to N_PORTS */ +	u32		port_status[0];	/* up to N_PORTS */  /* 31:23 reserved */  #define PORT_WKOC_E	(1<<22)		/* wake on overcurrent (enable) */  #define PORT_WKDISC_E	(1<<21)		/* wake on disconnect (enable) */ diff --git a/include/linux/usb/functionfs.h b/include/linux/usb/functionfs.h new file mode 100644 index 00000000000..a34a2a043b2 --- /dev/null +++ b/include/linux/usb/functionfs.h @@ -0,0 +1,199 @@ +#ifndef __LINUX_FUNCTIONFS_H__ +#define __LINUX_FUNCTIONFS_H__ 1 + + +#include <linux/types.h> +#include <linux/ioctl.h> + +#include <linux/usb/ch9.h> + + +enum { +	FUNCTIONFS_DESCRIPTORS_MAGIC = 1, +	FUNCTIONFS_STRINGS_MAGIC     = 2 +}; + + +#ifndef __KERNEL__ + +/* Descriptor of an non-audio endpoint */ +struct usb_endpoint_descriptor_no_audio { +	__u8  bLength; +	__u8  bDescriptorType; + +	__u8  bEndpointAddress; +	__u8  bmAttributes; +	__le16 wMaxPacketSize; +	__u8  bInterval; +} __attribute__((packed)); + + +/* + * All numbers must be in little endian order. + */ + +struct usb_functionfs_descs_head { +	__le32 magic; +	__le32 length; +	__le32 fs_count; +	__le32 hs_count; +} __attribute__((packed)); + +/* + * Descriptors format: + * + * | off | name      | type         | description                          | + * |-----+-----------+--------------+--------------------------------------| + * |   0 | magic     | LE32         | FUNCTIONFS_{FS,HS}_DESCRIPTORS_MAGIC | + * |   4 | lenght    | LE32         | length of the whole data chunk       | + * |   8 | fs_count  | LE32         | number of full-speed descriptors     | + * |  12 | hs_count  | LE32         | number of high-speed descriptors     | + * |  16 | fs_descrs | Descriptor[] | list of full-speed descriptors       | + * |     | hs_descrs | Descriptor[] | list of high-speed descriptors       | + * + * descs are just valid USB descriptors and have the following format: + * + * | off | name            | type | description              | + * |-----+-----------------+------+--------------------------| + * |   0 | bLength         | U8   | length of the descriptor | + * |   1 | bDescriptorType | U8   | descriptor type          | + * |   2 | payload         |      | descriptor's payload     | + */ + +struct usb_functionfs_strings_head { +	__le32 magic; +	__le32 length; +	__le32 str_count; +	__le32 lang_count; +} __attribute__((packed)); + +/* + * Strings format: + * + * | off | name       | type                  | description                | + * |-----+------------+-----------------------+----------------------------| + * |   0 | magic      | LE32                  | FUNCTIONFS_STRINGS_MAGIC   | + * |   4 | length     | LE32                  | length of the data chunk   | + * |   8 | str_count  | LE32                  | number of strings          | + * |  12 | lang_count | LE32                  | number of languages        | + * |  16 | stringtab  | StringTab[lang_count] | table of strings per lang  | + * + * For each language there is one stringtab entry (ie. there are lang_count + * stringtab entires).  Each StringTab has following format: + * + * | off | name    | type              | description                        | + * |-----+---------+-------------------+------------------------------------| + * |   0 | lang    | LE16              | language code                      | + * |   2 | strings | String[str_count] | array of strings in given language | + * + * For each string ther is one strings entry (ie. there are str_count + * string entries).  Each String is a NUL terminated string encoded in + * UTF-8. + */ + +#endif + + +/* + * Events are delivered on the ep0 file descriptor, when the user mode driver + * reads from this file descriptor after writing the descriptors.  Don't + * stop polling this descriptor. + */ + +enum usb_functionfs_event_type { +	FUNCTIONFS_BIND, +	FUNCTIONFS_UNBIND, + +	FUNCTIONFS_ENABLE, +	FUNCTIONFS_DISABLE, + +	FUNCTIONFS_SETUP, + +	FUNCTIONFS_SUSPEND, +	FUNCTIONFS_RESUME +}; + +/* NOTE:  this structure must stay the same size and layout on + * both 32-bit and 64-bit kernels. + */ +struct usb_functionfs_event { +	union { +		/* SETUP: packet; DATA phase i/o precedes next event +		 *(setup.bmRequestType & USB_DIR_IN) flags direction */ +		struct usb_ctrlrequest	setup; +	} __attribute__((packed)) u; + +	/* enum usb_functionfs_event_type */ +	__u8				type; +	__u8				_pad[3]; +} __attribute__((packed)); + + +/* Endpoint ioctls */ +/* The same as in gadgetfs */ + +/* IN transfers may be reported to the gadget driver as complete + *	when the fifo is loaded, before the host reads the data; + * OUT transfers may be reported to the host's "client" driver as + *	complete when they're sitting in the FIFO unread. + * THIS returns how many bytes are "unclaimed" in the endpoint fifo + * (needed for precise fault handling, when the hardware allows it) + */ +#define	FUNCTIONFS_FIFO_STATUS	_IO('g', 1) + +/* discards any unclaimed data in the fifo. */ +#define	FUNCTIONFS_FIFO_FLUSH	_IO('g', 2) + +/* resets endpoint halt+toggle; used to implement set_interface. + * some hardware (like pxa2xx) can't support this. + */ +#define	FUNCTIONFS_CLEAR_HALT	_IO('g', 3) + +/* Specific for functionfs */ + +/* + * Returns reverse mapping of an interface.  Called on EP0.  If there + * is no such interface returns -EDOM.  If function is not active + * returns -ENODEV. + */ +#define	FUNCTIONFS_INTERFACE_REVMAP	_IO('g', 128) + +/* + * Returns real bEndpointAddress of an endpoint.  If function is not + * active returns -ENODEV. + */ +#define	FUNCTIONFS_ENDPOINT_REVMAP	_IO('g', 129) + + +#ifdef __KERNEL__ + +struct ffs_data; +struct usb_composite_dev; +struct usb_configuration; + + +static int  functionfs_init(void) __attribute__((warn_unused_result)); +static void functionfs_cleanup(void); + +static int functionfs_bind(struct ffs_data *ffs, struct usb_composite_dev *cdev) +	__attribute__((warn_unused_result, nonnull)); +static void functionfs_unbind(struct ffs_data *ffs) +	__attribute__((nonnull)); + +static int functionfs_add(struct usb_composite_dev *cdev, +			  struct usb_configuration *c, +			  struct ffs_data *ffs) +	__attribute__((warn_unused_result, nonnull)); + + +static int functionfs_ready_callback(struct ffs_data *ffs) +	__attribute__((warn_unused_result, nonnull)); +static void functionfs_closed_callback(struct ffs_data *ffs) +	__attribute__((nonnull)); +static int functionfs_check_dev_callback(const char *dev_name) +	__attribute__((warn_unused_result, nonnull)); + + +#endif + +#endif diff --git a/include/linux/usb/g_hid.h b/include/linux/usb/g_hid.h new file mode 100644 index 00000000000..50f5745df28 --- /dev/null +++ b/include/linux/usb/g_hid.h @@ -0,0 +1,32 @@ +/* + * g_hid.h -- Header file for USB HID gadget driver + * + * Copyright (C) 2010 Fabien Chouteau <fabien.chouteau@barco.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA + */ + +#ifndef __LINUX_USB_G_HID_H +#define __LINUX_USB_G_HID_H + +struct hidg_func_descriptor { +	unsigned char		subclass; +	unsigned char		protocol; +	unsigned short		report_length; +	unsigned short		report_desc_length; +	unsigned char		report_desc[]; +}; + +#endif /* __LINUX_USB_G_HID_H */ diff --git a/include/linux/usb/gadget.h b/include/linux/usb/gadget.h index bbf45d500b6..d3ef42d7d2f 100644 --- a/include/linux/usb/gadget.h +++ b/include/linux/usb/gadget.h @@ -15,6 +15,8 @@  #ifndef __LINUX_USB_GADGET_H  #define __LINUX_USB_GADGET_H +#include <linux/slab.h> +  struct usb_ep;  /** @@ -492,9 +494,13 @@ static inline void set_gadget_data(struct usb_gadget *gadget, void *data)  	{ dev_set_drvdata(&gadget->dev, data); }  static inline void *get_gadget_data(struct usb_gadget *gadget)  	{ return dev_get_drvdata(&gadget->dev); } +static inline struct usb_gadget *dev_to_usb_gadget(struct device *dev) +{ +	return container_of(dev, struct usb_gadget, dev); +}  /* iterates the non-control endpoints; 'tmp' is a struct usb_ep pointer */ -#define gadget_for_each_ep(tmp,gadget) \ +#define gadget_for_each_ep(tmp, gadget) \  	list_for_each_entry(tmp, &(gadget)->ep_list, ep_list) diff --git a/include/linux/usb/gadgetfs.h b/include/linux/usb/gadgetfs.h index 612102e4d75..0bb12e0d4f8 100644 --- a/include/linux/usb/gadgetfs.h +++ b/include/linux/usb/gadgetfs.h @@ -19,7 +19,7 @@  #define __LINUX_USB_GADGETFS_H  #include <linux/types.h> -#include <asm/ioctl.h> +#include <linux/ioctl.h>  #include <linux/usb/ch9.h> diff --git a/include/linux/usb/hcd.h b/include/linux/usb/hcd.h new file mode 100644 index 00000000000..2e3a4ea1a3d --- /dev/null +++ b/include/linux/usb/hcd.h @@ -0,0 +1,625 @@ +/* + * Copyright (c) 2001-2002 by David Brownell + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#ifndef __USB_CORE_HCD_H +#define __USB_CORE_HCD_H + +#ifdef __KERNEL__ + +#include <linux/rwsem.h> + +#define MAX_TOPO_LEVEL		6 + +/* This file contains declarations of usbcore internals that are mostly + * used or exposed by Host Controller Drivers. + */ + +/* + * USB Packet IDs (PIDs) + */ +#define USB_PID_EXT			0xf0	/* USB 2.0 LPM ECN */ +#define USB_PID_OUT			0xe1 +#define USB_PID_ACK			0xd2 +#define USB_PID_DATA0			0xc3 +#define USB_PID_PING			0xb4	/* USB 2.0 */ +#define USB_PID_SOF			0xa5 +#define USB_PID_NYET			0x96	/* USB 2.0 */ +#define USB_PID_DATA2			0x87	/* USB 2.0 */ +#define USB_PID_SPLIT			0x78	/* USB 2.0 */ +#define USB_PID_IN			0x69 +#define USB_PID_NAK			0x5a +#define USB_PID_DATA1			0x4b +#define USB_PID_PREAMBLE		0x3c	/* Token mode */ +#define USB_PID_ERR			0x3c	/* USB 2.0: handshake mode */ +#define USB_PID_SETUP			0x2d +#define USB_PID_STALL			0x1e +#define USB_PID_MDATA			0x0f	/* USB 2.0 */ + +/*-------------------------------------------------------------------------*/ + +/* + * USB Host Controller Driver (usb_hcd) framework + * + * Since "struct usb_bus" is so thin, you can't share much code in it. + * This framework is a layer over that, and should be more sharable. + * + * @authorized_default: Specifies if new devices are authorized to + *                      connect by default or they require explicit + *                      user space authorization; this bit is settable + *                      through /sys/class/usb_host/X/authorized_default. + *                      For the rest is RO, so we don't lock to r/w it. + */ + +/*-------------------------------------------------------------------------*/ + +struct usb_hcd { + +	/* +	 * housekeeping +	 */ +	struct usb_bus		self;		/* hcd is-a bus */ +	struct kref		kref;		/* reference counter */ + +	const char		*product_desc;	/* product/vendor string */ +	char			irq_descr[24];	/* driver + bus # */ + +	struct timer_list	rh_timer;	/* drives root-hub polling */ +	struct urb		*status_urb;	/* the current status urb */ +#ifdef CONFIG_USB_SUSPEND +	struct work_struct	wakeup_work;	/* for remote wakeup */ +#endif + +	/* +	 * hardware info/state +	 */ +	const struct hc_driver	*driver;	/* hw-specific hooks */ + +	/* Flags that need to be manipulated atomically */ +	unsigned long		flags; +#define HCD_FLAG_HW_ACCESSIBLE	0x00000001 +#define HCD_FLAG_SAW_IRQ	0x00000002 + +	unsigned		rh_registered:1;/* is root hub registered? */ + +	/* The next flag is a stopgap, to be removed when all the HCDs +	 * support the new root-hub polling mechanism. */ +	unsigned		uses_new_polling:1; +	unsigned		poll_rh:1;	/* poll for rh status? */ +	unsigned		poll_pending:1;	/* status has changed? */ +	unsigned		wireless:1;	/* Wireless USB HCD */ +	unsigned		authorized_default:1; +	unsigned		has_tt:1;	/* Integrated TT in root hub */ + +	int			irq;		/* irq allocated */ +	void __iomem		*regs;		/* device memory/io */ +	u64			rsrc_start;	/* memory/io resource start */ +	u64			rsrc_len;	/* memory/io resource length */ +	unsigned		power_budget;	/* in mA, 0 = no limit */ + +	/* bandwidth_mutex should be taken before adding or removing +	 * any new bus bandwidth constraints: +	 *   1. Before adding a configuration for a new device. +	 *   2. Before removing the configuration to put the device into +	 *      the addressed state. +	 *   3. Before selecting a different configuration. +	 *   4. Before selecting an alternate interface setting. +	 * +	 * bandwidth_mutex should be dropped after a successful control message +	 * to the device, or resetting the bandwidth after a failed attempt. +	 */ +	struct mutex		bandwidth_mutex; + + +#define HCD_BUFFER_POOLS	4 +	struct dma_pool		*pool[HCD_BUFFER_POOLS]; + +	int			state; +#	define	__ACTIVE		0x01 +#	define	__SUSPEND		0x04 +#	define	__TRANSIENT		0x80 + +#	define	HC_STATE_HALT		0 +#	define	HC_STATE_RUNNING	(__ACTIVE) +#	define	HC_STATE_QUIESCING	(__SUSPEND|__TRANSIENT|__ACTIVE) +#	define	HC_STATE_RESUMING	(__SUSPEND|__TRANSIENT) +#	define	HC_STATE_SUSPENDED	(__SUSPEND) + +#define	HC_IS_RUNNING(state) ((state) & __ACTIVE) +#define	HC_IS_SUSPENDED(state) ((state) & __SUSPEND) + +	/* more shared queuing code would be good; it should support +	 * smarter scheduling, handle transaction translators, etc; +	 * input size of periodic table to an interrupt scheduler. +	 * (ohci 32, uhci 1024, ehci 256/512/1024). +	 */ + +	/* The HC driver's private data is stored at the end of +	 * this structure. +	 */ +	unsigned long hcd_priv[0] +			__attribute__ ((aligned(sizeof(unsigned long)))); +}; + +/* 2.4 does this a bit differently ... */ +static inline struct usb_bus *hcd_to_bus(struct usb_hcd *hcd) +{ +	return &hcd->self; +} + +static inline struct usb_hcd *bus_to_hcd(struct usb_bus *bus) +{ +	return container_of(bus, struct usb_hcd, self); +} + +struct hcd_timeout {	/* timeouts we allocate */ +	struct list_head	timeout_list; +	struct timer_list	timer; +}; + +/*-------------------------------------------------------------------------*/ + + +struct hc_driver { +	const char	*description;	/* "ehci-hcd" etc */ +	const char	*product_desc;	/* product/vendor string */ +	size_t		hcd_priv_size;	/* size of private data */ + +	/* irq handler */ +	irqreturn_t	(*irq) (struct usb_hcd *hcd); + +	int	flags; +#define	HCD_MEMORY	0x0001		/* HC regs use memory (else I/O) */ +#define	HCD_LOCAL_MEM	0x0002		/* HC needs local memory */ +#define	HCD_USB11	0x0010		/* USB 1.1 */ +#define	HCD_USB2	0x0020		/* USB 2.0 */ +#define	HCD_USB3	0x0040		/* USB 3.0 */ +#define	HCD_MASK	0x0070 + +	/* called to init HCD and root hub */ +	int	(*reset) (struct usb_hcd *hcd); +	int	(*start) (struct usb_hcd *hcd); + +	/* NOTE:  these suspend/resume calls relate to the HC as +	 * a whole, not just the root hub; they're for PCI bus glue. +	 */ +	/* called after suspending the hub, before entering D3 etc */ +	int	(*pci_suspend)(struct usb_hcd *hcd); + +	/* called after entering D0 (etc), before resuming the hub */ +	int	(*pci_resume)(struct usb_hcd *hcd, bool hibernated); + +	/* cleanly make HCD stop writing memory and doing I/O */ +	void	(*stop) (struct usb_hcd *hcd); + +	/* shutdown HCD */ +	void	(*shutdown) (struct usb_hcd *hcd); + +	/* return current frame number */ +	int	(*get_frame_number) (struct usb_hcd *hcd); + +	/* manage i/o requests, device state */ +	int	(*urb_enqueue)(struct usb_hcd *hcd, +				struct urb *urb, gfp_t mem_flags); +	int	(*urb_dequeue)(struct usb_hcd *hcd, +				struct urb *urb, int status); + +	/* hw synch, freeing endpoint resources that urb_dequeue can't */ +	void	(*endpoint_disable)(struct usb_hcd *hcd, +			struct usb_host_endpoint *ep); + +	/* (optional) reset any endpoint state such as sequence number +	   and current window */ +	void	(*endpoint_reset)(struct usb_hcd *hcd, +			struct usb_host_endpoint *ep); + +	/* root hub support */ +	int	(*hub_status_data) (struct usb_hcd *hcd, char *buf); +	int	(*hub_control) (struct usb_hcd *hcd, +				u16 typeReq, u16 wValue, u16 wIndex, +				char *buf, u16 wLength); +	int	(*bus_suspend)(struct usb_hcd *); +	int	(*bus_resume)(struct usb_hcd *); +	int	(*start_port_reset)(struct usb_hcd *, unsigned port_num); + +		/* force handover of high-speed port to full-speed companion */ +	void	(*relinquish_port)(struct usb_hcd *, int); +		/* has a port been handed over to a companion? */ +	int	(*port_handed_over)(struct usb_hcd *, int); + +		/* CLEAR_TT_BUFFER completion callback */ +	void	(*clear_tt_buffer_complete)(struct usb_hcd *, +				struct usb_host_endpoint *); + +	/* xHCI specific functions */ +		/* Called by usb_alloc_dev to alloc HC device structures */ +	int	(*alloc_dev)(struct usb_hcd *, struct usb_device *); +		/* Called by usb_disconnect to free HC device structures */ +	void	(*free_dev)(struct usb_hcd *, struct usb_device *); +	/* Change a group of bulk endpoints to support multiple stream IDs */ +	int	(*alloc_streams)(struct usb_hcd *hcd, struct usb_device *udev, +		struct usb_host_endpoint **eps, unsigned int num_eps, +		unsigned int num_streams, gfp_t mem_flags); +	/* Reverts a group of bulk endpoints back to not using stream IDs. +	 * Can fail if we run out of memory. +	 */ +	int	(*free_streams)(struct usb_hcd *hcd, struct usb_device *udev, +		struct usb_host_endpoint **eps, unsigned int num_eps, +		gfp_t mem_flags); + +	/* Bandwidth computation functions */ +	/* Note that add_endpoint() can only be called once per endpoint before +	 * check_bandwidth() or reset_bandwidth() must be called. +	 * drop_endpoint() can only be called once per endpoint also. +	 * A call to xhci_drop_endpoint() followed by a call to +	 * xhci_add_endpoint() will add the endpoint to the schedule with +	 * possibly new parameters denoted by a different endpoint descriptor +	 * in usb_host_endpoint.  A call to xhci_add_endpoint() followed by a +	 * call to xhci_drop_endpoint() is not allowed. +	 */ +		/* Allocate endpoint resources and add them to a new schedule */ +	int	(*add_endpoint)(struct usb_hcd *, struct usb_device *, +				struct usb_host_endpoint *); +		/* Drop an endpoint from a new schedule */ +	int	(*drop_endpoint)(struct usb_hcd *, struct usb_device *, +				 struct usb_host_endpoint *); +		/* Check that a new hardware configuration, set using +		 * endpoint_enable and endpoint_disable, does not exceed bus +		 * bandwidth.  This must be called before any set configuration +		 * or set interface requests are sent to the device. +		 */ +	int	(*check_bandwidth)(struct usb_hcd *, struct usb_device *); +		/* Reset the device schedule to the last known good schedule, +		 * which was set from a previous successful call to +		 * check_bandwidth().  This reverts any add_endpoint() and +		 * drop_endpoint() calls since that last successful call. +		 * Used for when a check_bandwidth() call fails due to resource +		 * or bandwidth constraints. +		 */ +	void	(*reset_bandwidth)(struct usb_hcd *, struct usb_device *); +		/* Returns the hardware-chosen device address */ +	int	(*address_device)(struct usb_hcd *, struct usb_device *udev); +		/* Notifies the HCD after a hub descriptor is fetched. +		 * Will block. +		 */ +	int	(*update_hub_device)(struct usb_hcd *, struct usb_device *hdev, +			struct usb_tt *tt, gfp_t mem_flags); +	int	(*reset_device)(struct usb_hcd *, struct usb_device *); +}; + +extern int usb_hcd_link_urb_to_ep(struct usb_hcd *hcd, struct urb *urb); +extern int usb_hcd_check_unlink_urb(struct usb_hcd *hcd, struct urb *urb, +		int status); +extern void usb_hcd_unlink_urb_from_ep(struct usb_hcd *hcd, struct urb *urb); + +extern int usb_hcd_submit_urb(struct urb *urb, gfp_t mem_flags); +extern int usb_hcd_unlink_urb(struct urb *urb, int status); +extern void usb_hcd_giveback_urb(struct usb_hcd *hcd, struct urb *urb, +		int status); +extern void usb_hcd_flush_endpoint(struct usb_device *udev, +		struct usb_host_endpoint *ep); +extern void usb_hcd_disable_endpoint(struct usb_device *udev, +		struct usb_host_endpoint *ep); +extern void usb_hcd_reset_endpoint(struct usb_device *udev, +		struct usb_host_endpoint *ep); +extern void usb_hcd_synchronize_unlinks(struct usb_device *udev); +extern int usb_hcd_alloc_bandwidth(struct usb_device *udev, +		struct usb_host_config *new_config, +		struct usb_host_interface *old_alt, +		struct usb_host_interface *new_alt); +extern int usb_hcd_get_frame_number(struct usb_device *udev); + +extern struct usb_hcd *usb_create_hcd(const struct hc_driver *driver, +		struct device *dev, const char *bus_name); +extern struct usb_hcd *usb_get_hcd(struct usb_hcd *hcd); +extern void usb_put_hcd(struct usb_hcd *hcd); +extern int usb_add_hcd(struct usb_hcd *hcd, +		unsigned int irqnum, unsigned long irqflags); +extern void usb_remove_hcd(struct usb_hcd *hcd); + +struct platform_device; +extern void usb_hcd_platform_shutdown(struct platform_device *dev); + +#ifdef CONFIG_PCI +struct pci_dev; +struct pci_device_id; +extern int usb_hcd_pci_probe(struct pci_dev *dev, +				const struct pci_device_id *id); +extern void usb_hcd_pci_remove(struct pci_dev *dev); +extern void usb_hcd_pci_shutdown(struct pci_dev *dev); + +#ifdef CONFIG_PM_SLEEP +extern const struct dev_pm_ops usb_hcd_pci_pm_ops; +#endif +#endif /* CONFIG_PCI */ + +/* pci-ish (pdev null is ok) buffer alloc/mapping support */ +int hcd_buffer_create(struct usb_hcd *hcd); +void hcd_buffer_destroy(struct usb_hcd *hcd); + +void *hcd_buffer_alloc(struct usb_bus *bus, size_t size, +	gfp_t mem_flags, dma_addr_t *dma); +void hcd_buffer_free(struct usb_bus *bus, size_t size, +	void *addr, dma_addr_t dma); + +/* generic bus glue, needed for host controllers that don't use PCI */ +extern irqreturn_t usb_hcd_irq(int irq, void *__hcd); + +extern void usb_hc_died(struct usb_hcd *hcd); +extern void usb_hcd_poll_rh_status(struct usb_hcd *hcd); + +/* The D0/D1 toggle bits ... USE WITH CAUTION (they're almost hcd-internal) */ +#define usb_gettoggle(dev, ep, out) (((dev)->toggle[out] >> (ep)) & 1) +#define	usb_dotoggle(dev, ep, out)  ((dev)->toggle[out] ^= (1 << (ep))) +#define usb_settoggle(dev, ep, out, bit) \ +		((dev)->toggle[out] = ((dev)->toggle[out] & ~(1 << (ep))) | \ +		 ((bit) << (ep))) + +/* -------------------------------------------------------------------------- */ + +/* Enumeration is only for the hub driver, or HCD virtual root hubs */ +extern struct usb_device *usb_alloc_dev(struct usb_device *parent, +					struct usb_bus *, unsigned port); +extern int usb_new_device(struct usb_device *dev); +extern void usb_disconnect(struct usb_device **); + +extern int usb_get_configuration(struct usb_device *dev); +extern void usb_destroy_configuration(struct usb_device *dev); + +/*-------------------------------------------------------------------------*/ + +/* + * HCD Root Hub support + */ + +#include <linux/usb/ch11.h> + +/* + * As of USB 2.0, full/low speed devices are segregated into trees. + * One type grows from USB 1.1 host controllers (OHCI, UHCI etc). + * The other type grows from high speed hubs when they connect to + * full/low speed devices using "Transaction Translators" (TTs). + * + * TTs should only be known to the hub driver, and high speed bus + * drivers (only EHCI for now).  They affect periodic scheduling and + * sometimes control/bulk error recovery. + */ + +struct usb_device; + +struct usb_tt { +	struct usb_device	*hub;	/* upstream highspeed hub */ +	int			multi;	/* true means one TT per port */ +	unsigned		think_time;	/* think time in ns */ + +	/* for control/bulk error recovery (CLEAR_TT_BUFFER) */ +	spinlock_t		lock; +	struct list_head	clear_list;	/* of usb_tt_clear */ +	struct work_struct	clear_work; +}; + +struct usb_tt_clear { +	struct list_head	clear_list; +	unsigned		tt; +	u16			devinfo; +	struct usb_hcd		*hcd; +	struct usb_host_endpoint	*ep; +}; + +extern int usb_hub_clear_tt_buffer(struct urb *urb); +extern void usb_ep0_reinit(struct usb_device *); + +/* (shifted) direction/type/recipient from the USB 2.0 spec, table 9.2 */ +#define DeviceRequest \ +	((USB_DIR_IN|USB_TYPE_STANDARD|USB_RECIP_DEVICE)<<8) +#define DeviceOutRequest \ +	((USB_DIR_OUT|USB_TYPE_STANDARD|USB_RECIP_DEVICE)<<8) + +#define InterfaceRequest \ +	((USB_DIR_IN|USB_TYPE_STANDARD|USB_RECIP_INTERFACE)<<8) + +#define EndpointRequest \ +	((USB_DIR_IN|USB_TYPE_STANDARD|USB_RECIP_INTERFACE)<<8) +#define EndpointOutRequest \ +	((USB_DIR_OUT|USB_TYPE_STANDARD|USB_RECIP_INTERFACE)<<8) + +/* class requests from the USB 2.0 hub spec, table 11-15 */ +/* GetBusState and SetHubDescriptor are optional, omitted */ +#define ClearHubFeature		(0x2000 | USB_REQ_CLEAR_FEATURE) +#define ClearPortFeature	(0x2300 | USB_REQ_CLEAR_FEATURE) +#define GetHubDescriptor	(0xa000 | USB_REQ_GET_DESCRIPTOR) +#define GetHubStatus		(0xa000 | USB_REQ_GET_STATUS) +#define GetPortStatus		(0xa300 | USB_REQ_GET_STATUS) +#define SetHubFeature		(0x2000 | USB_REQ_SET_FEATURE) +#define SetPortFeature		(0x2300 | USB_REQ_SET_FEATURE) + + +/*-------------------------------------------------------------------------*/ + +/* + * Generic bandwidth allocation constants/support + */ +#define FRAME_TIME_USECS	1000L +#define BitTime(bytecount) (7 * 8 * bytecount / 6) /* with integer truncation */ +		/* Trying not to use worst-case bit-stuffing +		 * of (7/6 * 8 * bytecount) = 9.33 * bytecount */ +		/* bytecount = data payload byte count */ + +#define NS_TO_US(ns)	((ns + 500L) / 1000L) +			/* convert & round nanoseconds to microseconds */ + + +/* + * Full/low speed bandwidth allocation constants/support. + */ +#define BW_HOST_DELAY	1000L		/* nanoseconds */ +#define BW_HUB_LS_SETUP	333L		/* nanoseconds */ +			/* 4 full-speed bit times (est.) */ + +#define FRAME_TIME_BITS			12000L	/* frame = 1 millisecond */ +#define FRAME_TIME_MAX_BITS_ALLOC	(90L * FRAME_TIME_BITS / 100L) +#define FRAME_TIME_MAX_USECS_ALLOC	(90L * FRAME_TIME_USECS / 100L) + +/* + * Ceiling [nano/micro]seconds (typical) for that many bytes at high speed + * ISO is a bit less, no ACK ... from USB 2.0 spec, 5.11.3 (and needed + * to preallocate bandwidth) + */ +#define USB2_HOST_DELAY	5	/* nsec, guess */ +#define HS_NSECS(bytes) (((55 * 8 * 2083) \ +	+ (2083UL * (3 + BitTime(bytes))))/1000 \ +	+ USB2_HOST_DELAY) +#define HS_NSECS_ISO(bytes) (((38 * 8 * 2083) \ +	+ (2083UL * (3 + BitTime(bytes))))/1000 \ +	+ USB2_HOST_DELAY) +#define HS_USECS(bytes)		NS_TO_US(HS_NSECS(bytes)) +#define HS_USECS_ISO(bytes)	NS_TO_US(HS_NSECS_ISO(bytes)) + +extern long usb_calc_bus_time(int speed, int is_input, +			int isoc, int bytecount); + +/*-------------------------------------------------------------------------*/ + +extern void usb_set_device_state(struct usb_device *udev, +		enum usb_device_state new_state); + +/*-------------------------------------------------------------------------*/ + +/* exported only within usbcore */ + +extern struct list_head usb_bus_list; +extern struct mutex usb_bus_list_lock; +extern wait_queue_head_t usb_kill_urb_queue; + +extern int usb_find_interface_driver(struct usb_device *dev, +	struct usb_interface *interface); + +#define usb_endpoint_out(ep_dir)	(!((ep_dir) & USB_DIR_IN)) + +#ifdef CONFIG_PM +extern void usb_root_hub_lost_power(struct usb_device *rhdev); +extern int hcd_bus_suspend(struct usb_device *rhdev, pm_message_t msg); +extern int hcd_bus_resume(struct usb_device *rhdev, pm_message_t msg); +#endif /* CONFIG_PM */ + +#ifdef CONFIG_USB_SUSPEND +extern void usb_hcd_resume_root_hub(struct usb_hcd *hcd); +#else +static inline void usb_hcd_resume_root_hub(struct usb_hcd *hcd) +{ +	return; +} +#endif /* CONFIG_USB_SUSPEND */ + + +/* + * USB device fs stuff + */ + +#ifdef CONFIG_USB_DEVICEFS + +/* + * these are expected to be called from the USB core/hub thread + * with the kernel lock held + */ +extern void usbfs_update_special(void); +extern int usbfs_init(void); +extern void usbfs_cleanup(void); + +#else /* CONFIG_USB_DEVICEFS */ + +static inline void usbfs_update_special(void) {} +static inline int usbfs_init(void) { return 0; } +static inline void usbfs_cleanup(void) { } + +#endif /* CONFIG_USB_DEVICEFS */ + +/*-------------------------------------------------------------------------*/ + +#if defined(CONFIG_USB_MON) || defined(CONFIG_USB_MON_MODULE) + +struct usb_mon_operations { +	void (*urb_submit)(struct usb_bus *bus, struct urb *urb); +	void (*urb_submit_error)(struct usb_bus *bus, struct urb *urb, int err); +	void (*urb_complete)(struct usb_bus *bus, struct urb *urb, int status); +	/* void (*urb_unlink)(struct usb_bus *bus, struct urb *urb); */ +}; + +extern struct usb_mon_operations *mon_ops; + +static inline void usbmon_urb_submit(struct usb_bus *bus, struct urb *urb) +{ +	if (bus->monitored) +		(*mon_ops->urb_submit)(bus, urb); +} + +static inline void usbmon_urb_submit_error(struct usb_bus *bus, struct urb *urb, +    int error) +{ +	if (bus->monitored) +		(*mon_ops->urb_submit_error)(bus, urb, error); +} + +static inline void usbmon_urb_complete(struct usb_bus *bus, struct urb *urb, +		int status) +{ +	if (bus->monitored) +		(*mon_ops->urb_complete)(bus, urb, status); +} + +int usb_mon_register(struct usb_mon_operations *ops); +void usb_mon_deregister(void); + +#else + +static inline void usbmon_urb_submit(struct usb_bus *bus, struct urb *urb) {} +static inline void usbmon_urb_submit_error(struct usb_bus *bus, struct urb *urb, +    int error) {} +static inline void usbmon_urb_complete(struct usb_bus *bus, struct urb *urb, +		int status) {} + +#endif /* CONFIG_USB_MON || CONFIG_USB_MON_MODULE */ + +/*-------------------------------------------------------------------------*/ + +/* hub.h ... DeviceRemovable in 2.4.2-ac11, gone in 2.4.10 */ +/* bleech -- resurfaced in 2.4.11 or 2.4.12 */ +#define bitmap	DeviceRemovable + + +/*-------------------------------------------------------------------------*/ + +/* random stuff */ + +#define	RUN_CONTEXT (in_irq() ? "in_irq" \ +		: (in_interrupt() ? "in_interrupt" : "can sleep")) + + +/* This rwsem is for use only by the hub driver and ehci-hcd. + * Nobody else should touch it. + */ +extern struct rw_semaphore ehci_cf_port_reset_rwsem; + +/* Keep track of which host controller drivers are loaded */ +#define USB_UHCI_LOADED		0 +#define USB_OHCI_LOADED		1 +#define USB_EHCI_LOADED		2 +extern unsigned long usb_hcds_loaded; + +#endif /* __KERNEL__ */ + +#endif /* __USB_CORE_HCD_H */ diff --git a/include/linux/usb/langwell_udc.h b/include/linux/usb/langwell_udc.h index c949178a653..2d2d1bbad9d 100644 --- a/include/linux/usb/langwell_udc.h +++ b/include/linux/usb/langwell_udc.h @@ -181,7 +181,7 @@ struct langwell_op_regs {  #define	PORTS_PIC	(BIT(15) | BIT(14))	/* port indicator control */  #define	PORTS_PO	BIT(13)	/* port owner */  #define	PORTS_PP	BIT(12)	/* port power */ -#define	PORTS_LS	(BIT(11) | BIT(10)) 	/* line status */ +#define	PORTS_LS	(BIT(11) | BIT(10))	/* line status */  #define	PORTS_SLP	BIT(9)	/* suspend using L1 */  #define	PORTS_PR	BIT(8)	/* port reset */  #define	PORTS_SUSP	BIT(7)	/* suspend */ diff --git a/include/linux/usb/musb.h b/include/linux/usb/musb.h index d4375566926..ee2dd1d506e 100644 --- a/include/linux/usb/musb.h +++ b/include/linux/usb/musb.h @@ -22,37 +22,73 @@ enum musb_mode {  struct clk; +enum musb_fifo_style { +	FIFO_RXTX, +	FIFO_TX, +	FIFO_RX +} __attribute__ ((packed)); + +enum musb_buf_mode { +	BUF_SINGLE, +	BUF_DOUBLE +} __attribute__ ((packed)); + +struct musb_fifo_cfg { +	u8			hw_ep_num; +	enum musb_fifo_style	style; +	enum musb_buf_mode	mode; +	u16			maxpacket; +}; + +#define MUSB_EP_FIFO(ep, st, m, pkt)		\ +{						\ +	.hw_ep_num	= ep,			\ +	.style		= st,			\ +	.mode		= m,			\ +	.maxpacket	= pkt,			\ +} + +#define MUSB_EP_FIFO_SINGLE(ep, st, pkt)	\ +	MUSB_EP_FIFO(ep, st, BUF_SINGLE, pkt) + +#define MUSB_EP_FIFO_DOUBLE(ep, st, pkt)	\ +	MUSB_EP_FIFO(ep, st, BUF_DOUBLE, pkt) +  struct musb_hdrc_eps_bits {  	const char	name[16];  	u8		bits;  };  struct musb_hdrc_config { +	struct musb_fifo_cfg	*fifo_cfg;	/* board fifo configuration */ +	unsigned		fifo_cfg_size;	/* size of the fifo configuration */ +  	/* MUSB configuration-specific details */  	unsigned	multipoint:1;	/* multipoint device */ -	unsigned	dyn_fifo:1;	/* supports dynamic fifo sizing */ -	unsigned	soft_con:1;	/* soft connect required */ -	unsigned	utm_16:1;	/* utm data witdh is 16 bits */ +	unsigned	dyn_fifo:1 __deprecated; /* supports dynamic fifo sizing */ +	unsigned	soft_con:1 __deprecated; /* soft connect required */ +	unsigned	utm_16:1 __deprecated; /* utm data witdh is 16 bits */  	unsigned	big_endian:1;	/* true if CPU uses big-endian */  	unsigned	mult_bulk_tx:1;	/* Tx ep required for multbulk pkts */  	unsigned	mult_bulk_rx:1;	/* Rx ep required for multbulk pkts */  	unsigned	high_iso_tx:1;	/* Tx ep required for HB iso */  	unsigned	high_iso_rx:1;	/* Rx ep required for HD iso */ -	unsigned	dma:1;		/* supports DMA */ -	unsigned	vendor_req:1;	/* vendor registers required */ +	unsigned	dma:1 __deprecated; /* supports DMA */ +	unsigned	vendor_req:1 __deprecated; /* vendor registers required */  	u8		num_eps;	/* number of endpoints _with_ ep0 */ -	u8		dma_channels;	/* number of dma channels */ +	u8		dma_channels __deprecated; /* number of dma channels */  	u8		dyn_fifo_size;	/* dynamic size in bytes */ -	u8		vendor_ctrl;	/* vendor control reg width */ -	u8		vendor_stat;	/* vendor status reg witdh */ -	u8		dma_req_chan;	/* bitmask for required dma channels */ +	u8		vendor_ctrl __deprecated; /* vendor control reg width */ +	u8		vendor_stat __deprecated; /* vendor status reg witdh */ +	u8		dma_req_chan __deprecated; /* bitmask for required dma channels */  	u8		ram_bits;	/* ram address size */ -	struct musb_hdrc_eps_bits *eps_bits; +	struct musb_hdrc_eps_bits *eps_bits __deprecated;  #ifdef CONFIG_BLACKFIN -        /* A GPIO controlling VRSEL in Blackfin */ -        unsigned int    gpio_vrsel; +	/* A GPIO controlling VRSEL in Blackfin */ +	unsigned int	gpio_vrsel; +	unsigned int	gpio_vrsel_active;  #endif  }; @@ -76,6 +112,9 @@ struct musb_hdrc_platform_data {  	/* (HOST or OTG) msec/2 after VBUS on till power good */  	u8		potpgt; +	/* (HOST or OTG) program PHY for external Vbus */ +	unsigned	extvbus:1; +  	/* Power the device on or off */  	int		(*set_power)(int state); @@ -84,6 +123,9 @@ struct musb_hdrc_platform_data {  	/* MUSB configuration-specific details */  	struct musb_hdrc_config	*config; + +	/* Architecture specific board data	*/ +	void		*board_data;  }; diff --git a/include/linux/usb/ncm.h b/include/linux/usb/ncm.h new file mode 100644 index 00000000000..006d1064c8b --- /dev/null +++ b/include/linux/usb/ncm.h @@ -0,0 +1,114 @@ +/* + * USB CDC NCM auxiliary definitions + */ + +#ifndef __LINUX_USB_NCM_H +#define __LINUX_USB_NCM_H + +#include <linux/types.h> +#include <linux/usb/cdc.h> +#include <asm/unaligned.h> + +#define NCM_NTB_MIN_IN_SIZE		2048 +#define NCM_NTB_MIN_OUT_SIZE		2048 + +#define NCM_CONTROL_TIMEOUT		(5 * 1000) + +/* bmNetworkCapabilities */ + +#define NCM_NCAP_ETH_FILTER	(1 << 0) +#define NCM_NCAP_NET_ADDRESS	(1 << 1) +#define NCM_NCAP_ENCAP_COMM	(1 << 2) +#define NCM_NCAP_MAX_DGRAM	(1 << 3) +#define NCM_NCAP_CRC_MODE	(1 << 4) + +/* + * Here are options for NCM Datagram Pointer table (NDP) parser. + * There are 2 different formats: NDP16 and NDP32 in the spec (ch. 3), + * in NDP16 offsets and sizes fields are 1 16bit word wide, + * in NDP32 -- 2 16bit words wide. Also signatures are different. + * To make the parser code the same, put the differences in the structure, + * and switch pointers to the structures when the format is changed. + */ + +struct ndp_parser_opts { +	u32		nth_sign; +	u32		ndp_sign; +	unsigned	nth_size; +	unsigned	ndp_size; +	unsigned	ndplen_align; +	/* sizes in u16 units */ +	unsigned	dgram_item_len; /* index or length */ +	unsigned	block_length; +	unsigned	fp_index; +	unsigned	reserved1; +	unsigned	reserved2; +	unsigned	next_fp_index; +}; + +#define INIT_NDP16_OPTS {					\ +		.nth_sign = NCM_NTH16_SIGN,			\ +		.ndp_sign = NCM_NDP16_NOCRC_SIGN,		\ +		.nth_size = sizeof(struct usb_cdc_ncm_nth16),	\ +		.ndp_size = sizeof(struct usb_cdc_ncm_ndp16),	\ +		.ndplen_align = 4,				\ +		.dgram_item_len = 1,				\ +		.block_length = 1,				\ +		.fp_index = 1,					\ +		.reserved1 = 0,					\ +		.reserved2 = 0,					\ +		.next_fp_index = 1,				\ +	} + + +#define INIT_NDP32_OPTS {					\ +		.nth_sign = NCM_NTH32_SIGN,			\ +		.ndp_sign = NCM_NDP32_NOCRC_SIGN,		\ +		.nth_size = sizeof(struct usb_cdc_ncm_nth32),	\ +		.ndp_size = sizeof(struct usb_cdc_ncm_ndp32),	\ +		.ndplen_align = 8,				\ +		.dgram_item_len = 2,				\ +		.block_length = 2,				\ +		.fp_index = 2,					\ +		.reserved1 = 1,					\ +		.reserved2 = 2,					\ +		.next_fp_index = 2,				\ +	} + +static inline void put_ncm(__le16 **p, unsigned size, unsigned val) +{ +	switch (size) { +	case 1: +		put_unaligned_le16((u16)val, *p); +		break; +	case 2: +		put_unaligned_le32((u32)val, *p); + +		break; +	default: +		BUG(); +	} + +	*p += size; +} + +static inline unsigned get_ncm(__le16 **p, unsigned size) +{ +	unsigned tmp; + +	switch (size) { +	case 1: +		tmp = get_unaligned_le16(*p); +		break; +	case 2: +		tmp = get_unaligned_le32(*p); +		break; +	default: +		BUG(); +	} + +	*p += size; +	return tmp; +} + +#endif /* __LINUX_USB_NCM_H */ diff --git a/include/linux/usb/net2280.h b/include/linux/usb/net2280.h index 96ca549a778..148b8fa5b1a 100644 --- a/include/linux/usb/net2280.h +++ b/include/linux/usb/net2280.h @@ -353,7 +353,7 @@ struct net2280_dma_regs {	/* [11.7] */  #define     DMA_TRANSACTION_DONE_INTERRUPT                      24  #define     DMA_ABORT                                           1  #define     DMA_START                                           0 -	u32		_unused0 [2]; +	u32		_unused0[2];  	/* offset 0x0190, 0x01b0, 0x01d0, 0x01f0, */  	u32		dmacount;  #define     VALID_BIT                                           31 @@ -374,7 +374,7 @@ struct net2280_dep_regs {	/* [11.8] */  	u32		dep_cfg;  	/* offset 0x0204, 0x0214, 0x224, 0x234, 0x244 */  	u32		dep_rsp; -	u32		_unused [2]; +	u32		_unused[2];  } __attribute__ ((packed));  /* configurable endpoint registers, BAR0 + 0x0300 ... array of seven structs @@ -437,7 +437,7 @@ struct net2280_ep_regs {	/* [11.9] */  	/* offset 0x0310, 0x0330, 0x0350, 0x0370, 0x0390, 0x03b0, 0x03d0 */  	u32		ep_avail;  	u32		ep_data; -	u32		_unused0 [2]; +	u32		_unused0[2];  } __attribute__ ((packed));  #endif /* __LINUX_USB_NET2280_H */ diff --git a/include/linux/usb/otg.h b/include/linux/usb/otg.h index 52bb917641f..f8302d036a7 100644 --- a/include/linux/usb/otg.h +++ b/include/linux/usb/otg.h @@ -9,6 +9,8 @@  #ifndef __LINUX_USB_OTG_H  #define __LINUX_USB_OTG_H +#include <linux/notifier.h> +  /* OTG defines lots of enumeration states before device reset */  enum usb_otg_state {  	OTG_STATE_UNDEFINED = 0, @@ -33,6 +35,14 @@ enum usb_otg_state {  	OTG_STATE_A_VBUS_ERR,  }; +enum usb_xceiv_events { +	USB_EVENT_NONE,         /* no events or cable disconnected */ +	USB_EVENT_VBUS,         /* vbus valid event */ +	USB_EVENT_ID,           /* id was grounded */ +	USB_EVENT_CHARGER,      /* usb dedicated charger */ +	USB_EVENT_ENUMERATED,   /* gadget driver enumerated */ +}; +  #define USB_OTG_PULLUP_ID		(1 << 0)  #define USB_OTG_PULLDOWN_DP		(1 << 1)  #define USB_OTG_PULLDOWN_DM		(1 << 2) @@ -70,6 +80,9 @@ struct otg_transceiver {  	struct otg_io_access_ops	*io_ops;  	void __iomem			*io_priv; +	/* for notification of usb_xceiv_events */ +	struct blocking_notifier_head	notifier; +  	/* to pass extra port status to the root hub */  	u16			port_status;  	u16			port_change; @@ -110,9 +123,19 @@ struct otg_transceiver {  /* for board-specific init logic */  extern int otg_set_transceiver(struct otg_transceiver *); +#if defined(CONFIG_NOP_USB_XCEIV) || defined(CONFIG_NOP_USB_XCEIV_MODULE)  /* sometimes transceivers are accessed only through e.g. ULPI */  extern void usb_nop_xceiv_register(void);  extern void usb_nop_xceiv_unregister(void); +#else +static inline void usb_nop_xceiv_register(void) +{ +} + +static inline void usb_nop_xceiv_unregister(void) +{ +} +#endif  /* helpers for direct access thru low-level io interface */  static inline int otg_io_read(struct otg_transceiver *otg, u32 reg) @@ -203,6 +226,18 @@ otg_start_srp(struct otg_transceiver *otg)  	return otg->start_srp(otg);  } +/* notifiers */ +static inline int +otg_register_notifier(struct otg_transceiver *otg, struct notifier_block *nb) +{ +	return blocking_notifier_chain_register(&otg->notifier, nb); +} + +static inline void +otg_unregister_notifier(struct otg_transceiver *otg, struct notifier_block *nb) +{ +	blocking_notifier_chain_unregister(&otg->notifier, nb); +}  /* for OTG controller drivers (and maybe other stuff) */  extern int usb_bus_start_enum(struct usb_bus *bus, unsigned port_num); diff --git a/include/linux/usb/quirks.h b/include/linux/usb/quirks.h index 2526f3bbd27..16b7f334754 100644 --- a/include/linux/usb/quirks.h +++ b/include/linux/usb/quirks.h @@ -19,4 +19,11 @@  /* device can't handle its Configuration or Interface strings */  #define USB_QUIRK_CONFIG_INTF_STRINGS	0x00000008 +/*device will morph if reset, don't use reset for handling errors */ +#define USB_QUIRK_RESET_MORPHS		0x00000010 + +/* device has more interface descriptions than the bNumInterfaces count, +   and can't handle talking to these interfaces */ +#define USB_QUIRK_HONOR_BNUMINTERFACES	0x00000020 +  #endif /* __LINUX_USB_QUIRKS_H */ diff --git a/include/linux/usb/rndis_host.h b/include/linux/usb/rndis_host.h index 1ef1ebc2b04..05ef5286198 100644 --- a/include/linux/usb/rndis_host.h +++ b/include/linux/usb/rndis_host.h @@ -34,10 +34,10 @@  struct rndis_msg_hdr {  	__le32	msg_type;			/* RNDIS_MSG_* */  	__le32	msg_len; -	// followed by data that varies between messages +	/* followed by data that varies between messages */  	__le32	request_id;  	__le32	status; -	// ... and more +	/* ... and more */  } __attribute__ ((packed));  /* MS-Windows uses this strange size, but RNDIS spec says 1024 minimum */ @@ -92,67 +92,67 @@ struct rndis_msg_hdr {  struct rndis_data_hdr {  	__le32	msg_type;		/* RNDIS_MSG_PACKET */ -	__le32	msg_len;		// rndis_data_hdr + data_len + pad -	__le32	data_offset;		// 36 -- right after header -	__le32	data_len;		// ... real packet size +	__le32	msg_len;		/* rndis_data_hdr + data_len + pad */ +	__le32	data_offset;		/* 36 -- right after header */ +	__le32	data_len;		/* ... real packet size */ -	__le32	oob_data_offset;	// zero -	__le32	oob_data_len;		// zero -	__le32	num_oob;		// zero -	__le32	packet_data_offset;	// zero +	__le32	oob_data_offset;	/* zero */ +	__le32	oob_data_len;		/* zero */ +	__le32	num_oob;		/* zero */ +	__le32	packet_data_offset;	/* zero */ -	__le32	packet_data_len;	// zero -	__le32	vc_handle;		// zero -	__le32	reserved;		// zero +	__le32	packet_data_len;	/* zero */ +	__le32	vc_handle;		/* zero */ +	__le32	reserved;		/* zero */  } __attribute__ ((packed));  struct rndis_init {		/* OUT */ -	// header and: +	/* header and: */  	__le32	msg_type;			/* RNDIS_MSG_INIT */ -	__le32	msg_len;			// 24 +	__le32	msg_len;			/* 24 */  	__le32	request_id; -	__le32	major_version;			// of rndis (1.0) +	__le32	major_version;			/* of rndis (1.0) */  	__le32	minor_version;  	__le32	max_transfer_size;  } __attribute__ ((packed));  struct rndis_init_c {		/* IN */ -	// header and: +	/* header and: */  	__le32	msg_type;			/* RNDIS_MSG_INIT_C */  	__le32	msg_len;  	__le32	request_id;  	__le32	status; -	__le32	major_version;			// of rndis (1.0) +	__le32	major_version;			/* of rndis (1.0) */  	__le32	minor_version;  	__le32	device_flags; -	__le32	medium;				// zero == 802.3 +	__le32	medium;				/* zero == 802.3 */  	__le32	max_packets_per_message;  	__le32	max_transfer_size; -	__le32	packet_alignment;		// max 7; (1<<n) bytes -	__le32	af_list_offset;			// zero -	__le32	af_list_size;			// zero +	__le32	packet_alignment;		/* max 7; (1<<n) bytes */ +	__le32	af_list_offset;			/* zero */ +	__le32	af_list_size;			/* zero */  } __attribute__ ((packed));  struct rndis_halt {		/* OUT (no reply) */ -	// header and: +	/* header and: */  	__le32	msg_type;			/* RNDIS_MSG_HALT */  	__le32	msg_len;  	__le32	request_id;  } __attribute__ ((packed));  struct rndis_query {		/* OUT */ -	// header and: +	/* header and: */  	__le32	msg_type;			/* RNDIS_MSG_QUERY */  	__le32	msg_len;  	__le32	request_id;  	__le32	oid;  	__le32	len;  	__le32	offset; -/*?*/	__le32	handle;				// zero +/*?*/	__le32	handle;				/* zero */  } __attribute__ ((packed));  struct rndis_query_c {		/* IN */ -	// header and: +	/* header and: */  	__le32	msg_type;			/* RNDIS_MSG_QUERY_C */  	__le32	msg_len;  	__le32	request_id; @@ -162,18 +162,18 @@ struct rndis_query_c {		/* IN */  } __attribute__ ((packed));  struct rndis_set {		/* OUT */ -	// header and: +	/* header and: */  	__le32	msg_type;			/* RNDIS_MSG_SET */  	__le32	msg_len;  	__le32	request_id;  	__le32	oid;  	__le32	len;  	__le32	offset; -/*?*/	__le32	handle;				// zero +/*?*/	__le32	handle;				/* zero */  } __attribute__ ((packed));  struct rndis_set_c {		/* IN */ -	// header and: +	/* header and: */  	__le32	msg_type;			/* RNDIS_MSG_SET_C */  	__le32	msg_len;  	__le32	request_id; @@ -181,14 +181,14 @@ struct rndis_set_c {		/* IN */  } __attribute__ ((packed));  struct rndis_reset {		/* IN */ -	// header and: +	/* header and: */  	__le32	msg_type;			/* RNDIS_MSG_RESET */  	__le32	msg_len;  	__le32	reserved;  } __attribute__ ((packed));  struct rndis_reset_c {		/* OUT */ -	// header and: +	/* header and: */  	__le32	msg_type;			/* RNDIS_MSG_RESET_C */  	__le32	msg_len;  	__le32	status; @@ -196,7 +196,7 @@ struct rndis_reset_c {		/* OUT */  } __attribute__ ((packed));  struct rndis_indicate {		/* IN (unrequested) */ -	// header and: +	/* header and: */  	__le32	msg_type;			/* RNDIS_MSG_INDICATE */  	__le32	msg_len;  	__le32	status; @@ -208,14 +208,14 @@ struct rndis_indicate {		/* IN (unrequested) */  } __attribute__ ((packed));  struct rndis_keepalive {	/* OUT (optionally IN) */ -	// header and: +	/* header and: */  	__le32	msg_type;			/* RNDIS_MSG_KEEPALIVE */  	__le32	msg_len;  	__le32	request_id;  } __attribute__ ((packed));  struct rndis_keepalive_c {	/* IN (optionally OUT) */ -	// header and: +	/* header and: */  	__le32	msg_type;			/* RNDIS_MSG_KEEPALIVE_C */  	__le32	msg_len;  	__le32	request_id; diff --git a/include/linux/usb/serial.h b/include/linux/usb/serial.h index 1819396ed50..84a4c44c208 100644 --- a/include/linux/usb/serial.h +++ b/include/linux/usb/serial.h @@ -35,6 +35,9 @@ enum port_dev_state {  	PORT_UNREGISTERING,  }; +/* USB serial flags */ +#define USB_SERIAL_WRITE_BUSY	0 +  /**   * usb_serial_port: structure for the specific ports of a device.   * @serial: pointer back to the struct usb_serial owner of this port. @@ -49,7 +52,7 @@ enum port_dev_state {   * @interrupt_out_size: the size of the interrupt_out_buffer, in bytes.   * @interrupt_out_urb: pointer to the interrupt out struct urb for this port.   * @interrupt_out_endpointAddress: endpoint address for the interrupt out pipe - * 	for this port. + *	for this port.   * @bulk_in_buffer: pointer to the bulk in buffer for this port.   * @bulk_in_size: the size of the bulk_in_buffer, in bytes.   * @read_urb: pointer to the bulk in struct urb for this port. @@ -60,13 +63,17 @@ enum port_dev_state {   * @write_urb: pointer to the bulk out struct urb for this port.   * @write_fifo: kfifo used to buffer outgoing data   * @write_urb_busy: port`s writing status + * @bulk_out_buffers: pointers to the bulk out buffers for this port + * @write_urbs: pointers to the bulk out urbs for this port + * @write_urbs_free: status bitmap the for bulk out urbs + * @tx_bytes: number of bytes currently in host stack queues   * @bulk_out_endpointAddress: endpoint address for the bulk out pipe for this   *	port. + * @flags: usb serial port flags   * @write_wait: a wait_queue_head_t used by the port.   * @work: work queue entry for the line discipline waking up.   * @throttled: nonzero if the read urb is inactive to throttle the device   * @throttle_req: nonzero if the tty wants to throttle us - * @console: attached usb serial console   * @dev: pointer to the serial device   *   * This structure is used by the usb-serial core and drivers for the specific @@ -97,16 +104,19 @@ struct usb_serial_port {  	struct urb		*write_urb;  	struct kfifo		write_fifo;  	int			write_urb_busy; + +	unsigned char		*bulk_out_buffers[2]; +	struct urb		*write_urbs[2]; +	unsigned long		write_urbs_free;  	__u8			bulk_out_endpointAddress; -	int			tx_bytes_flight; -	int			urbs_in_flight; +	int			tx_bytes; +	unsigned long		flags;  	wait_queue_head_t	write_wait;  	struct work_struct	work;  	char			throttled;  	char			throttle_req; -	char			console;  	unsigned long		sysrq; /* sysrq timeout */  	struct device		dev;  	enum port_dev_state	dev_state; @@ -181,6 +191,8 @@ static inline void usb_set_serial_data(struct usb_serial *serial, void *data)   * @id_table: pointer to a list of usb_device_id structures that define all   *	of the devices this structure can support.   * @num_ports: the number of different ports this device will have. + * @bulk_in_size: bytes to allocate for bulk-in buffer (0 = end-point size) + * @bulk_out_size: bytes to allocate for bulk-out buffer (0 = end-point size)   * @calc_num_ports: pointer to a function to determine how many ports this   *	device has dynamically.  It will be called after the probe()   *	callback is called, but before attach() @@ -223,7 +235,9 @@ struct usb_serial_driver {  	struct device_driver	driver;  	struct usb_driver	*usb_driver;  	struct usb_dynids	dynids; -	int			max_in_flight_urbs; + +	size_t			bulk_in_size; +	size_t			bulk_out_size;  	int (*probe)(struct usb_serial *serial, const struct usb_device_id *id);  	int (*attach)(struct usb_serial *serial); @@ -269,6 +283,11 @@ struct usb_serial_driver {  	void (*write_int_callback)(struct urb *urb);  	void (*read_bulk_callback)(struct urb *urb);  	void (*write_bulk_callback)(struct urb *urb); +	/* Called by the generic read bulk callback */ +	void (*process_read_urb)(struct urb *urb); +	/* Called by the generic write implementation */ +	int (*prepare_write_buffer)(struct usb_serial_port *port, +						void *dest, size_t size);  };  #define to_usb_serial_driver(d) \  	container_of(d, struct usb_serial_driver, driver) @@ -318,8 +337,11 @@ extern void usb_serial_generic_disconnect(struct usb_serial *serial);  extern void usb_serial_generic_release(struct usb_serial *serial);  extern int usb_serial_generic_register(int debug);  extern void usb_serial_generic_deregister(void); -extern void usb_serial_generic_resubmit_read_urb(struct usb_serial_port *port, +extern int usb_serial_generic_submit_read_urb(struct usb_serial_port *port,  						 gfp_t mem_flags); +extern void usb_serial_generic_process_read_urb(struct urb *urb); +extern int usb_serial_generic_prepare_write_buffer(struct usb_serial_port *port, +						void *dest, size_t size);  extern int usb_serial_handle_sysrq_char(struct tty_struct *tty,  					struct usb_serial_port *port,  					unsigned int ch); @@ -351,14 +373,11 @@ static inline void usb_serial_debug_data(int debug,  /* Use our own dbg macro */  #undef dbg -#define dbg(format, arg...) \ -	do { \ -		if (debug) \ -			printk(KERN_DEBUG "%s: " format "\n" , __FILE__ , \ -				## arg); \ -	} while (0) - - +#define dbg(format, arg...)						\ +do {									\ +	if (debug)							\ +		printk(KERN_DEBUG "%s: " format "\n", __FILE__, ##arg);	\ +} while (0)  #endif /* __LINUX_USB_SERIAL_H */ diff --git a/include/linux/usb/ulpi.h b/include/linux/usb/ulpi.h index 20675c6ebc4..2369d07c3c8 100644 --- a/include/linux/usb/ulpi.h +++ b/include/linux/usb/ulpi.h @@ -1,6 +1,146 @@ +/* + * ulpi.h -- ULPI defines and function prorotypes + * + * Copyright (C) 2010 Nokia Corporation + * + * This software is distributed under the terms of the GNU General + * Public License ("GPL") as published by the Free Software Foundation, + * version 2 of that License. + */ +  #ifndef __LINUX_USB_ULPI_H  #define __LINUX_USB_ULPI_H +/*-------------------------------------------------------------------------*/ + +/* + * Macros for Set and Clear + * See ULPI 1.1 specification to find the registers with Set and Clear offsets + */ +#define ULPI_SET(a)				(a + 1) +#define ULPI_CLR(a)				(a + 2) + +/*-------------------------------------------------------------------------*/ + +/* + * Register Map + */ +#define ULPI_VENDOR_ID_LOW			0x00 +#define ULPI_VENDOR_ID_HIGH			0x01 +#define ULPI_PRODUCT_ID_LOW			0x02 +#define ULPI_PRODUCT_ID_HIGH			0x03 +#define ULPI_FUNC_CTRL				0x04 +#define ULPI_IFC_CTRL				0x07 +#define ULPI_OTG_CTRL				0x0a +#define ULPI_USB_INT_EN_RISE			0x0d +#define ULPI_USB_INT_EN_FALL			0x10 +#define ULPI_USB_INT_STS			0x13 +#define ULPI_USB_INT_LATCH			0x14 +#define ULPI_DEBUG				0x15 +#define ULPI_SCRATCH				0x16 +/* Optional Carkit Registers */ +#define ULPI_CARCIT_CTRL			0x19 +#define ULPI_CARCIT_INT_DELAY			0x1c +#define ULPI_CARCIT_INT_EN			0x1d +#define ULPI_CARCIT_INT_STS			0x20 +#define ULPI_CARCIT_INT_LATCH			0x21 +#define ULPI_CARCIT_PLS_CTRL			0x22 +/* Other Optional Registers */ +#define ULPI_TX_POS_WIDTH			0x25 +#define ULPI_TX_NEG_WIDTH			0x26 +#define ULPI_POLARITY_RECOVERY			0x27 +/* Access Extended Register Set */ +#define ULPI_ACCESS_EXTENDED			0x2f +/* Vendor Specific */ +#define ULPI_VENDOR_SPECIFIC			0x30 +/* Extended Registers */ +#define ULPI_EXT_VENDOR_SPECIFIC		0x80 + +/*-------------------------------------------------------------------------*/ + +/* Function Control */ +#define ULPI_FUNC_CTRL_XCVRSEL			(1 << 0) +#define  ULPI_FUNC_CTRL_XCVRSEL_MASK		(3 << 0) +#define  ULPI_FUNC_CTRL_HIGH_SPEED		(0 << 0) +#define  ULPI_FUNC_CTRL_FULL_SPEED		(1 << 0) +#define  ULPI_FUNC_CTRL_LOW_SPEED		(2 << 0) +#define  ULPI_FUNC_CTRL_FS4LS			(3 << 0) +#define ULPI_FUNC_CTRL_TERMSELECT		(1 << 2) +#define ULPI_FUNC_CTRL_OPMODE			(1 << 3) +#define  ULPI_FUNC_CTRL_OPMODE_MASK		(3 << 3) +#define  ULPI_FUNC_CTRL_OPMODE_NORMAL		(0 << 3) +#define  ULPI_FUNC_CTRL_OPMODE_NONDRIVING	(1 << 3) +#define  ULPI_FUNC_CTRL_OPMODE_DISABLE_NRZI	(2 << 3) +#define  ULPI_FUNC_CTRL_OPMODE_NOSYNC_NOEOP	(3 << 3) +#define ULPI_FUNC_CTRL_RESET			(1 << 5) +#define ULPI_FUNC_CTRL_SUSPENDM			(1 << 6) + +/* Interface Control */ +#define ULPI_IFC_CTRL_6_PIN_SERIAL_MODE		(1 << 0) +#define ULPI_IFC_CTRL_3_PIN_SERIAL_MODE		(1 << 1) +#define ULPI_IFC_CTRL_CARKITMODE		(1 << 2) +#define ULPI_IFC_CTRL_CLOCKSUSPENDM		(1 << 3) +#define ULPI_IFC_CTRL_AUTORESUME		(1 << 4) +#define ULPI_IFC_CTRL_EXTERNAL_VBUS		(1 << 5) +#define ULPI_IFC_CTRL_PASSTHRU			(1 << 6) +#define ULPI_IFC_CTRL_PROTECT_IFC_DISABLE	(1 << 7) + +/* OTG Control */ +#define ULPI_OTG_CTRL_ID_PULLUP			(1 << 0) +#define ULPI_OTG_CTRL_DP_PULLDOWN		(1 << 1) +#define ULPI_OTG_CTRL_DM_PULLDOWN		(1 << 2) +#define ULPI_OTG_CTRL_DISCHRGVBUS		(1 << 3) +#define ULPI_OTG_CTRL_CHRGVBUS			(1 << 4) +#define ULPI_OTG_CTRL_DRVVBUS			(1 << 5) +#define ULPI_OTG_CTRL_DRVVBUS_EXT		(1 << 6) +#define ULPI_OTG_CTRL_EXTVBUSIND		(1 << 7) + +/* USB Interrupt Enable Rising, + * USB Interrupt Enable Falling, + * USB Interrupt Status and + * USB Interrupt Latch + */ +#define ULPI_INT_HOST_DISCONNECT		(1 << 0) +#define ULPI_INT_VBUS_VALID			(1 << 1) +#define ULPI_INT_SESS_VALID			(1 << 2) +#define ULPI_INT_SESS_END			(1 << 3) +#define ULPI_INT_IDGRD				(1 << 4) + +/* Debug */ +#define ULPI_DEBUG_LINESTATE0			(1 << 0) +#define ULPI_DEBUG_LINESTATE1			(1 << 1) + +/* Carkit Control */ +#define ULPI_CARKIT_CTRL_CARKITPWR		(1 << 0) +#define ULPI_CARKIT_CTRL_IDGNDDRV		(1 << 1) +#define ULPI_CARKIT_CTRL_TXDEN			(1 << 2) +#define ULPI_CARKIT_CTRL_RXDEN			(1 << 3) +#define ULPI_CARKIT_CTRL_SPKLEFTEN		(1 << 4) +#define ULPI_CARKIT_CTRL_SPKRIGHTEN		(1 << 5) +#define ULPI_CARKIT_CTRL_MICEN			(1 << 6) + +/* Carkit Interrupt Enable */ +#define ULPI_CARKIT_INT_EN_IDFLOAT_RISE		(1 << 0) +#define ULPI_CARKIT_INT_EN_IDFLOAT_FALL		(1 << 1) +#define ULPI_CARKIT_INT_EN_CARINTDET		(1 << 2) +#define ULPI_CARKIT_INT_EN_DP_RISE		(1 << 3) +#define ULPI_CARKIT_INT_EN_DP_FALL		(1 << 4) + +/* Carkit Interrupt Status and + * Carkit Interrupt Latch + */ +#define ULPI_CARKIT_INT_IDFLOAT			(1 << 0) +#define ULPI_CARKIT_INT_CARINTDET		(1 << 1) +#define ULPI_CARKIT_INT_DP			(1 << 2) + +/* Carkit Pulse Control*/ +#define ULPI_CARKIT_PLS_CTRL_TXPLSEN		(1 << 0) +#define ULPI_CARKIT_PLS_CTRL_RXPLSEN		(1 << 1) +#define ULPI_CARKIT_PLS_CTRL_SPKRLEFT_BIASEN	(1 << 2) +#define ULPI_CARKIT_PLS_CTRL_SPKRRIGHT_BIASEN	(1 << 3) + +/*-------------------------------------------------------------------------*/ +  struct otg_transceiver *otg_ulpi_create(struct otg_io_access_ops *ops,  					unsigned int flags); diff --git a/include/linux/usb/usbnet.h b/include/linux/usb/usbnet.h index 8ce61359bf7..7ae27a47381 100644 --- a/include/linux/usb/usbnet.h +++ b/include/linux/usb/usbnet.h @@ -43,7 +43,7 @@ struct usbnet {  	/* protocol/interface state */  	struct net_device	*net;  	int			msg_enable; -	unsigned long		data [5]; +	unsigned long		data[5];  	u32			xid;  	u32			hard_mtu;	/* count any extra framing */  	size_t			rx_urb_size;	/* size for rx urbs */ @@ -148,8 +148,8 @@ struct driver_info {   * much everything except custom framing and chip-specific stuff.   */  extern int usbnet_probe(struct usb_interface *, const struct usb_device_id *); -extern int usbnet_suspend (struct usb_interface *, pm_message_t ); -extern int usbnet_resume (struct usb_interface *); +extern int usbnet_suspend(struct usb_interface *, pm_message_t); +extern int usbnet_resume(struct usb_interface *);  extern void usbnet_disconnect(struct usb_interface *); @@ -165,8 +165,8 @@ struct cdc_state {  	struct usb_interface		*data;  }; -extern int usbnet_generic_cdc_bind (struct usbnet *, struct usb_interface *); -extern void usbnet_cdc_unbind (struct usbnet *, struct usb_interface *); +extern int usbnet_generic_cdc_bind(struct usbnet *, struct usb_interface *); +extern void usbnet_cdc_unbind(struct usbnet *, struct usb_interface *);  /* CDC and RNDIS support the same host-chosen packet filters for IN transfers */  #define	DEFAULT_FILTER	(USB_CDC_PACKET_TYPE_BROADCAST \ @@ -189,50 +189,31 @@ struct skb_data {	/* skb->cb is one of these */  	size_t			length;  }; -extern int usbnet_open (struct net_device *net); -extern int usbnet_stop (struct net_device *net); -extern netdev_tx_t usbnet_start_xmit (struct sk_buff *skb, -				      struct net_device *net); -extern void usbnet_tx_timeout (struct net_device *net); -extern int usbnet_change_mtu (struct net_device *net, int new_mtu); +extern int usbnet_open(struct net_device *net); +extern int usbnet_stop(struct net_device *net); +extern netdev_tx_t usbnet_start_xmit(struct sk_buff *skb, +				     struct net_device *net); +extern void usbnet_tx_timeout(struct net_device *net); +extern int usbnet_change_mtu(struct net_device *net, int new_mtu);  extern int usbnet_get_endpoints(struct usbnet *, struct usb_interface *);  extern int usbnet_get_ethernet_addr(struct usbnet *, int); -extern void usbnet_defer_kevent (struct usbnet *, int); -extern void usbnet_skb_return (struct usbnet *, struct sk_buff *); +extern void usbnet_defer_kevent(struct usbnet *, int); +extern void usbnet_skb_return(struct usbnet *, struct sk_buff *);  extern void usbnet_unlink_rx_urbs(struct usbnet *);  extern void usbnet_pause_rx(struct usbnet *);  extern void usbnet_resume_rx(struct usbnet *);  extern void usbnet_purge_paused_rxq(struct usbnet *); -extern int usbnet_get_settings (struct net_device *net, struct ethtool_cmd *cmd); -extern int usbnet_set_settings (struct net_device *net, struct ethtool_cmd *cmd); -extern u32 usbnet_get_link (struct net_device *net); -extern u32 usbnet_get_msglevel (struct net_device *); -extern void usbnet_set_msglevel (struct net_device *, u32); -extern void usbnet_get_drvinfo (struct net_device *, struct ethtool_drvinfo *); +extern int usbnet_get_settings(struct net_device *net, +			       struct ethtool_cmd *cmd); +extern int usbnet_set_settings(struct net_device *net, +			       struct ethtool_cmd *cmd); +extern u32 usbnet_get_link(struct net_device *net); +extern u32 usbnet_get_msglevel(struct net_device *); +extern void usbnet_set_msglevel(struct net_device *, u32); +extern void usbnet_get_drvinfo(struct net_device *, struct ethtool_drvinfo *);  extern int usbnet_nway_reset(struct net_device *net); -/* messaging support includes the interface name, so it must not be - * used before it has one ... notably, in minidriver bind() calls. - */ -#ifdef DEBUG -#define devdbg(usbnet, fmt, arg...) \ -	printk(KERN_DEBUG "%s: " fmt "\n" , (usbnet)->net->name , ## arg) -#else -#define devdbg(usbnet, fmt, arg...) \ -	({ if (0) printk(KERN_DEBUG "%s: " fmt "\n" , (usbnet)->net->name , \ -		## arg); 0; }) -#endif - -#define deverr(usbnet, fmt, arg...) \ -	printk(KERN_ERR "%s: " fmt "\n" , (usbnet)->net->name , ## arg) -#define devwarn(usbnet, fmt, arg...) \ -	printk(KERN_WARNING "%s: " fmt "\n" , (usbnet)->net->name , ## arg) - -#define devinfo(usbnet, fmt, arg...) \ -	printk(KERN_INFO "%s: " fmt "\n" , (usbnet)->net->name , ## arg); \ - -  #endif /* __LINUX_USB_USBNET_H */ diff --git a/include/linux/usb/vstusb.h b/include/linux/usb/vstusb.h deleted file mode 100644 index 1cfac67191f..00000000000 --- a/include/linux/usb/vstusb.h +++ /dev/null @@ -1,71 +0,0 @@ -/***************************************************************************** - *  File: drivers/usb/misc/vstusb.h - * - *  Purpose: Support for the bulk USB Vernier Spectrophotometers - * - *  Author:     EQware Engineering, Inc. - *              Oregon City, OR, USA 97045 - * - *  Copyright:  2007, 2008 - *              Vernier Software & Technology - *              Beaverton, OR, USA 97005 - * - *  Web:        www.vernier.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. - * - *****************************************************************************/ -/***************************************************************************** - * - *  The vstusb module is a standard usb 'client' driver running on top of the - *  standard usb host controller stack. - * - *  In general, vstusb supports standard bulk usb pipes.  It supports multiple - *  devices and multiple pipes per device. - * - *  The vstusb driver supports two interfaces: - *  1 - ioctl SEND_PIPE/RECV_PIPE - a general bulk write/read msg - *  	interface to any pipe with timeout support; - *  2 - standard read/write with ioctl config - offers standard read/write - *  	interface with ioctl configured pipes and timeouts. - * - *  Both interfaces can be signal from other process and will abort its i/o - *  operation. - * - *  A timeout of 0 means NO timeout.  The user can still terminate the read via - *  signal. - * - *  If using multiple threads with this driver, the user should ensure that - *  any reads, writes, or ioctls are complete before closing the device. - *  Changing read/write timeouts or pipes takes effect on next read/write. - * - *****************************************************************************/ - -struct vstusb_args { -	union { -		/* this struct is used for IOCTL_VSTUSB_SEND_PIPE,	* -		 * IOCTL_VSTUSB_RECV_PIPE, and read()/write() fops	*/ -		struct { -			void __user	*buffer; -			size_t          count; -			unsigned int    timeout_ms; -			int             pipe; -		}; - -		/* this one is used for IOCTL_VSTUSB_CONFIG_RW  	*/ -		struct { -			int rd_pipe; -			int rd_timeout_ms; -			int wr_pipe; -			int wr_timeout_ms; -		}; -	}; -}; - -#define VST_IOC_MAGIC 'L' -#define VST_IOC_FIRST 0x20 -#define IOCTL_VSTUSB_SEND_PIPE	_IO(VST_IOC_MAGIC, VST_IOC_FIRST) -#define IOCTL_VSTUSB_RECV_PIPE	_IO(VST_IOC_MAGIC, VST_IOC_FIRST + 1) -#define IOCTL_VSTUSB_CONFIG_RW	_IO(VST_IOC_MAGIC, VST_IOC_FIRST + 2) diff --git a/include/linux/usb/wusb-wa.h b/include/linux/usb/wusb-wa.h index fb7c359bdfb..f9dec37f617 100644 --- a/include/linux/usb/wusb-wa.h +++ b/include/linux/usb/wusb-wa.h @@ -87,7 +87,7 @@ enum rpipe_crs {   * FIXME: explain rpipes   */  struct usb_rpipe_descriptor { -	u8 	bLength; +	u8	bLength;  	u8	bDescriptorType;  	__le16  wRPipeIndex;  	__le16	wRequests; diff --git a/include/linux/uuid.h b/include/linux/uuid.h new file mode 100644 index 00000000000..5b7efbfcee4 --- /dev/null +++ b/include/linux/uuid.h @@ -0,0 +1,70 @@ +/* + * UUID/GUID definition + * + * Copyright (C) 2010, Intel Corp. + *	Huang Ying <ying.huang@intel.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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA + */ + +#ifndef _LINUX_UUID_H_ +#define _LINUX_UUID_H_ + +#include <linux/types.h> +#include <linux/string.h> + +typedef struct { +	__u8 b[16]; +} uuid_le; + +typedef struct { +	__u8 b[16]; +} uuid_be; + +#define UUID_LE(a, b, c, d0, d1, d2, d3, d4, d5, d6, d7)		\ +((uuid_le)								\ +{{ (a) & 0xff, ((a) >> 8) & 0xff, ((a) >> 16) & 0xff, ((a) >> 24) & 0xff, \ +   (b) & 0xff, ((b) >> 8) & 0xff,					\ +   (c) & 0xff, ((c) >> 8) & 0xff,					\ +   (d0), (d1), (d2), (d3), (d4), (d5), (d6), (d7) }}) + +#define UUID_BE(a, b, c, d0, d1, d2, d3, d4, d5, d6, d7)		\ +((uuid_be)								\ +{{ ((a) >> 24) & 0xff, ((a) >> 16) & 0xff, ((a) >> 8) & 0xff, (a) & 0xff, \ +   ((b) >> 8) & 0xff, (b) & 0xff,					\ +   ((c) >> 8) & 0xff, (c) & 0xff,					\ +   (d0), (d1), (d2), (d3), (d4), (d5), (d6), (d7) }}) + +#define NULL_UUID_LE							\ +	UUID_LE(0x00000000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00,	\ +		0x00, 0x00, 0x00, 0x00) + +#define NULL_UUID_BE							\ +	UUID_BE(0x00000000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00,	\ +		0x00, 0x00, 0x00, 0x00) + +static inline int uuid_le_cmp(const uuid_le u1, const uuid_le u2) +{ +	return memcmp(&u1, &u2, sizeof(uuid_le)); +} + +static inline int uuid_be_cmp(const uuid_be u1, const uuid_be u2) +{ +	return memcmp(&u1, &u2, sizeof(uuid_be)); +} + +extern void uuid_le_gen(uuid_le *u); +extern void uuid_be_gen(uuid_be *u); + +#endif diff --git a/include/linux/vga_switcheroo.h b/include/linux/vga_switcheroo.h new file mode 100644 index 00000000000..ae9ab13b963 --- /dev/null +++ b/include/linux/vga_switcheroo.h @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2010 Red Hat Inc. + * Author : Dave Airlie <airlied@redhat.com> + * + * Licensed under GPLv2 + * + * vga_switcheroo.h - Support for laptop with dual GPU using one set of outputs + */ + +#include <linux/fb.h> + +enum vga_switcheroo_state { +	VGA_SWITCHEROO_OFF, +	VGA_SWITCHEROO_ON, +}; + +enum vga_switcheroo_client_id { +	VGA_SWITCHEROO_IGD, +	VGA_SWITCHEROO_DIS, +	VGA_SWITCHEROO_MAX_CLIENTS, +}; + +struct vga_switcheroo_handler { +	int (*switchto)(enum vga_switcheroo_client_id id); +	int (*power_state)(enum vga_switcheroo_client_id id, +			   enum vga_switcheroo_state state); +	int (*init)(void); +	int (*get_client_id)(struct pci_dev *pdev); +}; + + +#if defined(CONFIG_VGA_SWITCHEROO) +void vga_switcheroo_unregister_client(struct pci_dev *dev); +int vga_switcheroo_register_client(struct pci_dev *dev, +				   void (*set_gpu_state)(struct pci_dev *dev, enum vga_switcheroo_state), +				   bool (*can_switch)(struct pci_dev *dev)); + +void vga_switcheroo_client_fb_set(struct pci_dev *dev, +				  struct fb_info *info); + +int vga_switcheroo_register_handler(struct vga_switcheroo_handler *handler); +void vga_switcheroo_unregister_handler(void); + +int vga_switcheroo_process_delayed_switch(void); + +#else + +static inline void vga_switcheroo_unregister_client(struct pci_dev *dev) {} +static inline int vga_switcheroo_register_client(struct pci_dev *dev, +					  void (*set_gpu_state)(struct pci_dev *dev, enum vga_switcheroo_state), +					  bool (*can_switch)(struct pci_dev *dev)) { return 0; } +static inline void vga_switcheroo_client_fb_set(struct pci_dev *dev, struct fb_info *info) {} +static inline int vga_switcheroo_register_handler(struct vga_switcheroo_handler *handler) { return 0; } +static inline void vga_switcheroo_unregister_handler(void) {} +static inline int vga_switcheroo_process_delayed_switch(void) { return 0; } + +#endif diff --git a/include/linux/vhost.h b/include/linux/vhost.h new file mode 100644 index 00000000000..e847f1e3075 --- /dev/null +++ b/include/linux/vhost.h @@ -0,0 +1,130 @@ +#ifndef _LINUX_VHOST_H +#define _LINUX_VHOST_H +/* Userspace interface for in-kernel virtio accelerators. */ + +/* vhost is used to reduce the number of system calls involved in virtio. + * + * Existing virtio net code is used in the guest without modification. + * + * This header includes interface used by userspace hypervisor for + * device configuration. + */ + +#include <linux/types.h> +#include <linux/compiler.h> +#include <linux/ioctl.h> +#include <linux/virtio_config.h> +#include <linux/virtio_ring.h> + +struct vhost_vring_state { +	unsigned int index; +	unsigned int num; +}; + +struct vhost_vring_file { +	unsigned int index; +	int fd; /* Pass -1 to unbind from file. */ + +}; + +struct vhost_vring_addr { +	unsigned int index; +	/* Option flags. */ +	unsigned int flags; +	/* Flag values: */ +	/* Whether log address is valid. If set enables logging. */ +#define VHOST_VRING_F_LOG 0 + +	/* Start of array of descriptors (virtually contiguous) */ +	__u64 desc_user_addr; +	/* Used structure address. Must be 32 bit aligned */ +	__u64 used_user_addr; +	/* Available structure address. Must be 16 bit aligned */ +	__u64 avail_user_addr; +	/* Logging support. */ +	/* Log writes to used structure, at offset calculated from specified +	 * address. Address must be 32 bit aligned. */ +	__u64 log_guest_addr; +}; + +struct vhost_memory_region { +	__u64 guest_phys_addr; +	__u64 memory_size; /* bytes */ +	__u64 userspace_addr; +	__u64 flags_padding; /* No flags are currently specified. */ +}; + +/* All region addresses and sizes must be 4K aligned. */ +#define VHOST_PAGE_SIZE 0x1000 + +struct vhost_memory { +	__u32 nregions; +	__u32 padding; +	struct vhost_memory_region regions[0]; +}; + +/* ioctls */ + +#define VHOST_VIRTIO 0xAF + +/* Features bitmask for forward compatibility.  Transport bits are used for + * vhost specific features. */ +#define VHOST_GET_FEATURES	_IOR(VHOST_VIRTIO, 0x00, __u64) +#define VHOST_SET_FEATURES	_IOW(VHOST_VIRTIO, 0x00, __u64) + +/* Set current process as the (exclusive) owner of this file descriptor.  This + * must be called before any other vhost command.  Further calls to + * VHOST_OWNER_SET fail until VHOST_OWNER_RESET is called. */ +#define VHOST_SET_OWNER _IO(VHOST_VIRTIO, 0x01) +/* Give up ownership, and reset the device to default values. + * Allows subsequent call to VHOST_OWNER_SET to succeed. */ +#define VHOST_RESET_OWNER _IO(VHOST_VIRTIO, 0x02) + +/* Set up/modify memory layout */ +#define VHOST_SET_MEM_TABLE	_IOW(VHOST_VIRTIO, 0x03, struct vhost_memory) + +/* Write logging setup. */ +/* Memory writes can optionally be logged by setting bit at an offset + * (calculated from the physical address) from specified log base. + * The bit is set using an atomic 32 bit operation. */ +/* Set base address for logging. */ +#define VHOST_SET_LOG_BASE _IOW(VHOST_VIRTIO, 0x04, __u64) +/* Specify an eventfd file descriptor to signal on log write. */ +#define VHOST_SET_LOG_FD _IOW(VHOST_VIRTIO, 0x07, int) + +/* Ring setup. */ +/* Set number of descriptors in ring. This parameter can not + * be modified while ring is running (bound to a device). */ +#define VHOST_SET_VRING_NUM _IOW(VHOST_VIRTIO, 0x10, struct vhost_vring_state) +/* Set addresses for the ring. */ +#define VHOST_SET_VRING_ADDR _IOW(VHOST_VIRTIO, 0x11, struct vhost_vring_addr) +/* Base value where queue looks for available descriptors */ +#define VHOST_SET_VRING_BASE _IOW(VHOST_VIRTIO, 0x12, struct vhost_vring_state) +/* Get accessor: reads index, writes value in num */ +#define VHOST_GET_VRING_BASE _IOWR(VHOST_VIRTIO, 0x12, struct vhost_vring_state) + +/* The following ioctls use eventfd file descriptors to signal and poll + * for events. */ + +/* Set eventfd to poll for added buffers */ +#define VHOST_SET_VRING_KICK _IOW(VHOST_VIRTIO, 0x20, struct vhost_vring_file) +/* Set eventfd to signal when buffers have beed used */ +#define VHOST_SET_VRING_CALL _IOW(VHOST_VIRTIO, 0x21, struct vhost_vring_file) +/* Set eventfd to signal an error */ +#define VHOST_SET_VRING_ERR _IOW(VHOST_VIRTIO, 0x22, struct vhost_vring_file) + +/* VHOST_NET specific defines */ + +/* Attach virtio net ring to a raw socket, or tap device. + * The socket must be already bound to an ethernet device, this device will be + * used for transmit.  Pass fd -1 to unbind from the socket and the transmit + * device.  This can be used to stop the ring (e.g. for migration). */ +#define VHOST_NET_SET_BACKEND _IOW(VHOST_VIRTIO, 0x30, struct vhost_vring_file) + +/* Feature bits */ +/* Log all write descriptors. Can be changed while device is active. */ +#define VHOST_F_LOG_ALL 26 +/* vhost-net should add virtio_net_hdr for RX, and strip for TX packets. */ +#define VHOST_NET_F_VIRTIO_NET_HDR 27 + +#endif diff --git a/include/linux/via-core.h b/include/linux/via-core.h new file mode 100644 index 00000000000..7ffb521e1a7 --- /dev/null +++ b/include/linux/via-core.h @@ -0,0 +1,219 @@ +/* + * Copyright 1998-2009 VIA Technologies, Inc. All Rights Reserved. + * Copyright 2001-2008 S3 Graphics, Inc. All Rights Reserved. + * Copyright 2009-2010 Jonathan Corbet <corbet@lwn.net> + * Copyright 2010 Florian Tobias Schandinat <FlorianSchandinat@gmx.de> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; + * either version 2, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTIES OR REPRESENTATIONS; 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., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef __VIA_CORE_H__ +#define __VIA_CORE_H__ +#include <linux/types.h> +#include <linux/io.h> +#include <linux/spinlock.h> +#include <linux/pci.h> + +/* + * A description of each known serial I2C/GPIO port. + */ +enum via_port_type { +	VIA_PORT_NONE = 0, +	VIA_PORT_I2C, +	VIA_PORT_GPIO, +}; + +enum via_port_mode { +	VIA_MODE_OFF = 0, +	VIA_MODE_I2C,		/* Used as I2C port */ +	VIA_MODE_GPIO,	/* Two GPIO ports */ +}; + +enum viafb_i2c_adap { +	VIA_PORT_26 = 0, +	VIA_PORT_31, +	VIA_PORT_25, +	VIA_PORT_2C, +	VIA_PORT_3D, +}; +#define VIAFB_NUM_PORTS 5 + +struct via_port_cfg { +	enum via_port_type	type; +	enum via_port_mode	mode; +	u16			io_port; +	u8			ioport_index; +}; + +/* + * This is the global viafb "device" containing stuff needed by + * all subdevs. + */ +struct viafb_dev { +	struct pci_dev *pdev; +	int chip_type; +	struct via_port_cfg *port_cfg; +	/* +	 * Spinlock for access to device registers.  Not yet +	 * globally used. +	 */ +	spinlock_t reg_lock; +	/* +	 * The framebuffer MMIO region.  Little, if anything, touches +	 * this memory directly, and certainly nothing outside of the +	 * framebuffer device itself.  We *do* have to be able to allocate +	 * chunks of this memory for other devices, though. +	 */ +	unsigned long fbmem_start; +	long fbmem_len; +	void __iomem *fbmem; +#if defined(CONFIG_FB_VIA_CAMERA) || defined(CONFIG_FB_VIA_CAMERA_MODULE) +	long camera_fbmem_offset; +	long camera_fbmem_size; +#endif +	/* +	 * The MMIO region for device registers. +	 */ +	unsigned long engine_start; +	unsigned long engine_len; +	void __iomem *engine_mmio; + +}; + +/* + * Interrupt management. + */ + +void viafb_irq_enable(u32 mask); +void viafb_irq_disable(u32 mask); + +/* + * The global interrupt control register and its bits. + */ +#define VDE_INTERRUPT	0x200	/* Video interrupt flags/masks */ +#define   VDE_I_DVISENSE  0x00000001  /* DVI sense int status */ +#define   VDE_I_VBLANK    0x00000002  /* Vertical blank status */ +#define   VDE_I_MCCFI	  0x00000004  /* MCE compl. frame int status */ +#define   VDE_I_VSYNC	  0x00000008  /* VGA VSYNC int status */ +#define   VDE_I_DMA0DDONE 0x00000010  /* DMA 0 descr done */ +#define   VDE_I_DMA0TDONE 0x00000020  /* DMA 0 transfer done */ +#define   VDE_I_DMA1DDONE 0x00000040  /* DMA 1 descr done */ +#define   VDE_I_DMA1TDONE 0x00000080  /* DMA 1 transfer done */ +#define   VDE_I_C1AV      0x00000100  /* Cap Eng 1 act vid end */ +#define   VDE_I_HQV0	  0x00000200  /* First HQV engine */ +#define   VDE_I_HQV1      0x00000400  /* Second HQV engine */ +#define   VDE_I_HQV1EN	  0x00000800  /* Second HQV engine enable */ +#define   VDE_I_C0AV      0x00001000  /* Cap Eng 0 act vid end */ +#define   VDE_I_C0VBI     0x00002000  /* Cap Eng 0 VBI end */ +#define   VDE_I_C1VBI     0x00004000  /* Cap Eng 1 VBI end */ +#define   VDE_I_VSYNC2    0x00008000  /* Sec. Disp. VSYNC */ +#define   VDE_I_DVISNSEN  0x00010000  /* DVI sense enable */ +#define   VDE_I_VSYNC2EN  0x00020000  /* Sec Disp VSYNC enable */ +#define   VDE_I_MCCFIEN	  0x00040000  /* MC comp frame int mask enable */ +#define   VDE_I_VSYNCEN   0x00080000  /* VSYNC enable */ +#define   VDE_I_DMA0DDEN  0x00100000  /* DMA 0 descr done enable */ +#define   VDE_I_DMA0TDEN  0x00200000  /* DMA 0 trans done enable */ +#define   VDE_I_DMA1DDEN  0x00400000  /* DMA 1 descr done enable */ +#define   VDE_I_DMA1TDEN  0x00800000  /* DMA 1 trans done enable */ +#define   VDE_I_C1AVEN    0x01000000  /* cap 1 act vid end enable */ +#define   VDE_I_HQV0EN	  0x02000000  /* First hqv engine enable */ +#define   VDE_I_C1VBIEN	  0x04000000  /* Cap 1 VBI end enable */ +#define   VDE_I_LVDSSI    0x08000000  /* LVDS sense interrupt */ +#define   VDE_I_C0AVEN    0x10000000  /* Cap 0 act vid end enable */ +#define   VDE_I_C0VBIEN   0x20000000  /* Cap 0 VBI end enable */ +#define   VDE_I_LVDSSIEN  0x40000000  /* LVDS Sense enable */ +#define   VDE_I_ENABLE	  0x80000000  /* Global interrupt enable */ + +/* + * DMA management. + */ +int viafb_request_dma(void); +void viafb_release_dma(void); +/* void viafb_dma_copy_out(unsigned int offset, dma_addr_t paddr, int len); */ +int viafb_dma_copy_out_sg(unsigned int offset, struct scatterlist *sg, int nsg); + +/* + * DMA Controller registers. + */ +#define VDMA_MR0	0xe00		/* Mod reg 0 */ +#define   VDMA_MR_CHAIN   0x01		/* Chaining mode */ +#define   VDMA_MR_TDIE    0x02		/* Transfer done int enable */ +#define VDMA_CSR0	0xe04		/* Control/status */ +#define	  VDMA_C_ENABLE	  0x01		  /* DMA Enable */ +#define	  VDMA_C_START	  0x02		  /* Start a transfer */ +#define	  VDMA_C_ABORT	  0x04		  /* Abort a transfer */ +#define	  VDMA_C_DONE	  0x08		  /* Transfer is done */ +#define VDMA_MARL0	0xe20		/* Mem addr low */ +#define VDMA_MARH0	0xe24		/* Mem addr high */ +#define VDMA_DAR0	0xe28		/* Device address */ +#define VDMA_DQWCR0	0xe2c		/* Count (16-byte) */ +#define VDMA_TMR0	0xe30		/* Tile mode reg */ +#define VDMA_DPRL0	0xe34		/* Not sure */ +#define	  VDMA_DPR_IN	  0x08		/* Inbound transfer to FB */ +#define VDMA_DPRH0	0xe38 +#define VDMA_PMR0	(0xe00 + 0x134) /* Pitch mode */ + +/* + * Useful stuff that probably belongs somewhere global. + */ +#define VGA_WIDTH	640 +#define VGA_HEIGHT	480 + +/* + * Indexed port operations.  Note that these are all multi-op + * functions; every invocation will be racy if you're not holding + * reg_lock. + */ + +#define VIAStatus   0x3DA  /* Non-indexed port */ +#define VIACR       0x3D4 +#define VIASR       0x3C4 +#define VIAGR       0x3CE +#define VIAAR       0x3C0 + +static inline u8 via_read_reg(u16 port, u8 index) +{ +	outb(index, port); +	return inb(port + 1); +} + +static inline void via_write_reg(u16 port, u8 index, u8 data) +{ +	outb(index, port); +	outb(data, port + 1); +} + +static inline void via_write_reg_mask(u16 port, u8 index, u8 data, u8 mask) +{ +	u8 old; + +	outb(index, port); +	old = inb(port + 1); +	outb((data & mask) | (old & ~mask), port + 1); +} + +#define VIA_MISC_REG_READ	0x03CC +#define VIA_MISC_REG_WRITE	0x03C2 + +static inline void via_write_misc_reg_mask(u8 data, u8 mask) +{ +	u8 old = inb(VIA_MISC_REG_READ); +	outb((data & mask) | (old & ~mask), VIA_MISC_REG_WRITE); +} + + +#endif /* __VIA_CORE_H__ */ diff --git a/include/linux/via-gpio.h b/include/linux/via-gpio.h new file mode 100644 index 00000000000..8281aea3dd6 --- /dev/null +++ b/include/linux/via-gpio.h @@ -0,0 +1,14 @@ +/* + * Support for viafb GPIO ports. + * + * Copyright 2009 Jonathan Corbet <corbet@lwn.net> + * Distributable under version 2 of the GNU General Public License. + */ + +#ifndef __VIA_GPIO_H__ +#define __VIA_GPIO_H__ + +extern int viafb_gpio_lookup(const char *name); +extern int viafb_gpio_init(void); +extern void viafb_gpio_exit(void); +#endif diff --git a/include/linux/via_i2c.h b/include/linux/via_i2c.h new file mode 100644 index 00000000000..44532e468c0 --- /dev/null +++ b/include/linux/via_i2c.h @@ -0,0 +1,42 @@ +/* + * Copyright 1998-2009 VIA Technologies, Inc. All Rights Reserved. + * Copyright 2001-2008 S3 Graphics, Inc. All Rights Reserved. + + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; + * either version 2, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTIES OR REPRESENTATIONS; 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., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ +#ifndef __VIA_I2C_H__ +#define __VIA_I2C_H__ + +#include <linux/i2c.h> +#include <linux/i2c-algo-bit.h> + +struct via_i2c_stuff { +	u16 i2c_port;			/* GPIO or I2C port */ +	u16 is_active;			/* Being used as I2C? */ +	struct i2c_adapter adapter; +	struct i2c_algo_bit_data algo; +}; + + +int viafb_i2c_readbyte(u8 adap, u8 slave_addr, u8 index, u8 *pdata); +int viafb_i2c_writebyte(u8 adap, u8 slave_addr, u8 index, u8 data); +int viafb_i2c_readbytes(u8 adap, u8 slave_addr, u8 index, u8 *buff, int buff_len); +struct i2c_adapter *viafb_find_i2c_adapter(enum viafb_i2c_adap which); + +extern int viafb_i2c_init(void); +extern void viafb_i2c_exit(void); +#endif /* __VIA_I2C_H__ */ diff --git a/include/linux/videodev2.h b/include/linux/videodev2.h index d4962a782b8..047f7e6edb8 100644 --- a/include/linux/videodev2.h +++ b/include/linux/videodev2.h @@ -160,16 +160,6 @@ enum v4l2_buf_type {  	V4L2_BUF_TYPE_PRIVATE              = 0x80,  }; -enum v4l2_ctrl_type { -	V4L2_CTRL_TYPE_INTEGER	     = 1, -	V4L2_CTRL_TYPE_BOOLEAN	     = 2, -	V4L2_CTRL_TYPE_MENU	     = 3, -	V4L2_CTRL_TYPE_BUTTON	     = 4, -	V4L2_CTRL_TYPE_INTEGER64     = 5, -	V4L2_CTRL_TYPE_CTRL_CLASS    = 6, -	V4L2_CTRL_TYPE_STRING        = 7, -}; -  enum v4l2_tuner_type {  	V4L2_TUNER_RADIO	     = 1,  	V4L2_TUNER_ANALOG_TV	     = 2, @@ -294,6 +284,8 @@ struct v4l2_pix_format {  /* Grey formats */  #define V4L2_PIX_FMT_GREY    v4l2_fourcc('G', 'R', 'E', 'Y') /*  8  Greyscale     */ +#define V4L2_PIX_FMT_Y4      v4l2_fourcc('Y', '0', '4', ' ') /*  4  Greyscale     */ +#define V4L2_PIX_FMT_Y6      v4l2_fourcc('Y', '0', '6', ' ') /*  6  Greyscale     */  #define V4L2_PIX_FMT_Y10     v4l2_fourcc('Y', '1', '0', ' ') /* 10  Greyscale     */  #define V4L2_PIX_FMT_Y16     v4l2_fourcc('Y', '1', '6', ' ') /* 16  Greyscale     */ @@ -350,6 +342,7 @@ struct v4l2_pix_format {  #define V4L2_PIX_FMT_MPEG     v4l2_fourcc('M', 'P', 'E', 'G') /* MPEG-1/2/4    */  /*  Vendor-specific formats   */ +#define V4L2_PIX_FMT_CPIA1    v4l2_fourcc('C', 'P', 'I', 'A') /* cpia1 YUV */  #define V4L2_PIX_FMT_WNVA     v4l2_fourcc('W', 'N', 'V', 'A') /* Winnov hw compress */  #define V4L2_PIX_FMT_SN9C10X  v4l2_fourcc('S', '9', '1', '0') /* SN9C10x compression */  #define V4L2_PIX_FMT_SN9C20X_I420 v4l2_fourcc('S', '9', '2', '0') /* SN9C20x YUV 4:2:0 */ @@ -362,11 +355,13 @@ struct v4l2_pix_format {  #define V4L2_PIX_FMT_SPCA561  v4l2_fourcc('S', '5', '6', '1') /* compressed GBRG bayer */  #define V4L2_PIX_FMT_PAC207   v4l2_fourcc('P', '2', '0', '7') /* compressed BGGR bayer */  #define V4L2_PIX_FMT_MR97310A v4l2_fourcc('M', '3', '1', '0') /* compressed BGGR bayer */ +#define V4L2_PIX_FMT_SN9C2028 v4l2_fourcc('S', 'O', 'N', 'X') /* compressed GBRG bayer */  #define V4L2_PIX_FMT_SQ905C   v4l2_fourcc('9', '0', '5', 'C') /* compressed RGGB bayer */  #define V4L2_PIX_FMT_PJPG     v4l2_fourcc('P', 'J', 'P', 'G') /* Pixart 73xx JPEG */  #define V4L2_PIX_FMT_OV511    v4l2_fourcc('O', '5', '1', '1') /* ov511 JPEG */  #define V4L2_PIX_FMT_OV518    v4l2_fourcc('O', '5', '1', '8') /* ov518 JPEG */  #define V4L2_PIX_FMT_STV0680  v4l2_fourcc('S', '6', '8', '0') /* stv0680 bayer */ +#define V4L2_PIX_FMT_TM6000   v4l2_fourcc('T', 'M', '6', '0') /* tm5600/tm60x0 */  /*   *	F O R M A T   E N U M E R A T I O N @@ -547,6 +542,8 @@ struct v4l2_buffer {  #define V4L2_BUF_FLAG_KEYFRAME	0x0008	/* Image is a keyframe (I-frame) */  #define V4L2_BUF_FLAG_PFRAME	0x0010	/* Image is a P-frame */  #define V4L2_BUF_FLAG_BFRAME	0x0020	/* Image is a B-frame */ +/* Buffer is ready, but the data contained within is corrupted. */ +#define V4L2_BUF_FLAG_ERROR	0x0040  #define V4L2_BUF_FLAG_TIMECODE	0x0100	/* timecode field is valid */  #define V4L2_BUF_FLAG_INPUT     0x0200  /* input field is valid */ @@ -937,6 +934,16 @@ struct v4l2_ext_controls {  #define V4L2_CTRL_ID2CLASS(id)    ((id) & 0x0fff0000UL)  #define V4L2_CTRL_DRIVER_PRIV(id) (((id) & 0xffff) >= 0x1000) +enum v4l2_ctrl_type { +	V4L2_CTRL_TYPE_INTEGER	     = 1, +	V4L2_CTRL_TYPE_BOOLEAN	     = 2, +	V4L2_CTRL_TYPE_MENU	     = 3, +	V4L2_CTRL_TYPE_BUTTON	     = 4, +	V4L2_CTRL_TYPE_INTEGER64     = 5, +	V4L2_CTRL_TYPE_CTRL_CLASS    = 6, +	V4L2_CTRL_TYPE_STRING        = 7, +}; +  /*  Used in the VIDIOC_QUERYCTRL ioctl for querying controls */  struct v4l2_queryctrl {  	__u32		     id; @@ -1021,14 +1028,24 @@ enum v4l2_colorfx {  	V4L2_COLORFX_NONE	= 0,  	V4L2_COLORFX_BW		= 1,  	V4L2_COLORFX_SEPIA	= 2, +	V4L2_COLORFX_NEGATIVE = 3, +	V4L2_COLORFX_EMBOSS = 4, +	V4L2_COLORFX_SKETCH = 5, +	V4L2_COLORFX_SKY_BLUE = 6, +	V4L2_COLORFX_GRASS_GREEN = 7, +	V4L2_COLORFX_SKIN_WHITEN = 8, +	V4L2_COLORFX_VIVID = 9,  };  #define V4L2_CID_AUTOBRIGHTNESS			(V4L2_CID_BASE+32)  #define V4L2_CID_BAND_STOP_FILTER		(V4L2_CID_BASE+33)  #define V4L2_CID_ROTATE				(V4L2_CID_BASE+34)  #define V4L2_CID_BG_COLOR			(V4L2_CID_BASE+35) + +#define V4L2_CID_CHROMA_GAIN                    (V4L2_CID_BASE+36) +  /* last CID + 1 */ -#define V4L2_CID_LASTP1                         (V4L2_CID_BASE+36) +#define V4L2_CID_LASTP1                         (V4L2_CID_BASE+37)  /*  MPEG-class control IDs defined by V4L2 */  #define V4L2_CID_MPEG_BASE 			(V4L2_CTRL_CLASS_MPEG | 0x900) @@ -1274,6 +1291,9 @@ enum  v4l2_exposure_auto_type {  #define V4L2_CID_PRIVACY			(V4L2_CID_CAMERA_CLASS_BASE+16) +#define V4L2_CID_IRIS_ABSOLUTE			(V4L2_CID_CAMERA_CLASS_BASE+17) +#define V4L2_CID_IRIS_RELATIVE			(V4L2_CID_CAMERA_CLASS_BASE+18) +  /* FM Modulator class control IDs */  #define V4L2_CID_FM_TX_CLASS_BASE		(V4L2_CTRL_CLASS_FM_TX | 0x900)  #define V4L2_CID_FM_TX_CLASS			(V4L2_CTRL_CLASS_FM_TX | 1) @@ -1619,6 +1639,38 @@ struct v4l2_streamparm {  };  /* + *	E V E N T S + */ + +#define V4L2_EVENT_ALL				0 +#define V4L2_EVENT_VSYNC			1 +#define V4L2_EVENT_EOS				2 +#define V4L2_EVENT_PRIVATE_START		0x08000000 + +/* Payload for V4L2_EVENT_VSYNC */ +struct v4l2_event_vsync { +	/* Can be V4L2_FIELD_ANY, _NONE, _TOP or _BOTTOM */ +	__u8 field; +} __attribute__ ((packed)); + +struct v4l2_event { +	__u32				type; +	union { +		struct v4l2_event_vsync vsync; +		__u8			data[64]; +	} u; +	__u32				pending; +	__u32				sequence; +	struct timespec			timestamp; +	__u32				reserved[9]; +}; + +struct v4l2_event_subscription { +	__u32				type; +	__u32				reserved[7]; +}; + +/*   *	A D V A N C E D   D E B U G G I N G   *   *	NOTE: EXPERIMENTAL API, NEVER RELY ON THIS IN APPLICATIONS! @@ -1740,6 +1792,9 @@ struct v4l2_dbg_chip_ident {  #define	VIDIOC_QUERY_DV_PRESET	_IOR('V',  86, struct v4l2_dv_preset)  #define	VIDIOC_S_DV_TIMINGS	_IOWR('V', 87, struct v4l2_dv_timings)  #define	VIDIOC_G_DV_TIMINGS	_IOWR('V', 88, struct v4l2_dv_timings) +#define	VIDIOC_DQEVENT		 _IOR('V', 89, struct v4l2_event) +#define	VIDIOC_SUBSCRIBE_EVENT	 _IOW('V', 90, struct v4l2_event_subscription) +#define	VIDIOC_UNSUBSCRIBE_EVENT _IOW('V', 91, struct v4l2_event_subscription)  /* Reminder: when adding new ioctls please add support for them to     drivers/media/video/v4l2-compat-ioctl32.c as well! */ diff --git a/include/linux/virtio.h b/include/linux/virtio.h index 057a2e01075..aff5b4f7404 100644 --- a/include/linux/virtio.h +++ b/include/linux/virtio.h @@ -7,6 +7,7 @@  #include <linux/spinlock.h>  #include <linux/device.h>  #include <linux/mod_devicetable.h> +#include <linux/gfp.h>  /**   * virtqueue - a queue to register buffers for sending or receiving. @@ -14,7 +15,6 @@   * @callback: the function to call when buffers are consumed (can be NULL).   * @name: the name of this virtqueue (mainly for debugging)   * @vdev: the virtio device this queue was created for. - * @vq_ops: the operations for this virtqueue (see below).   * @priv: a pointer for the virtqueue implementation to use.   */  struct virtqueue { @@ -22,56 +22,71 @@ struct virtqueue {  	void (*callback)(struct virtqueue *vq);  	const char *name;  	struct virtio_device *vdev; -	struct virtqueue_ops *vq_ops;  	void *priv;  };  /** - * virtqueue_ops - operations for virtqueue abstraction layer - * @add_buf: expose buffer to other end + * operations for virtqueue + * virtqueue_add_buf: expose buffer to other end   *	vq: the struct virtqueue we're talking about.   *	sg: the description of the buffer(s).   *	out_num: the number of sg readable by other side   *	in_num: the number of sg which are writable (after readable ones)   *	data: the token identifying the buffer. + *	gfp: how to do memory allocations (if necessary).   *      Returns remaining capacity of queue (sg segments) or a negative error. - * @kick: update after add_buf + * virtqueue_kick: update after add_buf   *	vq: the struct virtqueue   *	After one or more add_buf calls, invoke this to kick the other side. - * @get_buf: get the next used buffer + * virtqueue_get_buf: get the next used buffer   *	vq: the struct virtqueue we're talking about.   *	len: the length written into the buffer   *	Returns NULL or the "data" token handed to add_buf. - * @disable_cb: disable callbacks + * virtqueue_disable_cb: disable callbacks   *	vq: the struct virtqueue we're talking about.   *	Note that this is not necessarily synchronous, hence unreliable and only   *	useful as an optimization. - * @enable_cb: restart callbacks after disable_cb. + * virtqueue_enable_cb: restart callbacks after disable_cb.   *	vq: the struct virtqueue we're talking about.   *	This re-enables callbacks; it returns "false" if there are pending   *	buffers in the queue, to detect a possible race between the driver   *	checking for more work, and enabling callbacks. + * virtqueue_detach_unused_buf: detach first unused buffer + * 	vq: the struct virtqueue we're talking about. + * 	Returns NULL or the "data" token handed to add_buf   *   * Locking rules are straightforward: the driver is responsible for   * locking.  No two operations may be invoked simultaneously, with the exception - * of @disable_cb. + * of virtqueue_disable_cb.   *   * All operations can be called in any context.   */ -struct virtqueue_ops { -	int (*add_buf)(struct virtqueue *vq, -		       struct scatterlist sg[], -		       unsigned int out_num, -		       unsigned int in_num, -		       void *data); -	void (*kick)(struct virtqueue *vq); +int virtqueue_add_buf_gfp(struct virtqueue *vq, +			  struct scatterlist sg[], +			  unsigned int out_num, +			  unsigned int in_num, +			  void *data, +			  gfp_t gfp); -	void *(*get_buf)(struct virtqueue *vq, unsigned int *len); +static inline int virtqueue_add_buf(struct virtqueue *vq, +				    struct scatterlist sg[], +				    unsigned int out_num, +				    unsigned int in_num, +				    void *data) +{ +	return virtqueue_add_buf_gfp(vq, sg, out_num, in_num, data, GFP_ATOMIC); +} -	void (*disable_cb)(struct virtqueue *vq); -	bool (*enable_cb)(struct virtqueue *vq); -}; +void virtqueue_kick(struct virtqueue *vq); + +void *virtqueue_get_buf(struct virtqueue *vq, unsigned int *len); + +void virtqueue_disable_cb(struct virtqueue *vq); + +bool virtqueue_enable_cb(struct virtqueue *vq); + +void *virtqueue_detach_unused_buf(struct virtqueue *vq);  /**   * virtio_device - representation of a device using virtio @@ -94,6 +109,7 @@ struct virtio_device {  	void *priv;  }; +#define dev_to_virtio(dev) container_of(dev, struct virtio_device, dev)  int register_virtio_device(struct virtio_device *dev);  void unregister_virtio_device(struct virtio_device *dev); diff --git a/include/linux/virtio_9p.h b/include/linux/virtio_9p.h index 095e10d148b..5cf11765146 100644 --- a/include/linux/virtio_9p.h +++ b/include/linux/virtio_9p.h @@ -5,7 +5,16 @@  #include <linux/virtio_ids.h>  #include <linux/virtio_config.h> -/* Maximum number of virtio channels per partition (1 for now) */ -#define MAX_9P_CHAN	1 +/* The feature bitmap for virtio 9P */ + +/* The mount point is specified in a config variable */ +#define VIRTIO_9P_MOUNT_TAG 0 + +struct virtio_9p_config { +	/* length of the tag name */ +	__u16 tag_len; +	/* non-NULL terminated tag name */ +	__u8 tag[0]; +} __attribute__((packed));  #endif /* _LINUX_VIRTIO_9P_H */ diff --git a/include/linux/virtio_balloon.h b/include/linux/virtio_balloon.h index 1418f048cb3..a50ecd1b81a 100644 --- a/include/linux/virtio_balloon.h +++ b/include/linux/virtio_balloon.h @@ -7,6 +7,7 @@  /* The feature bitmap for virtio balloon */  #define VIRTIO_BALLOON_F_MUST_TELL_HOST	0 /* Tell before reclaiming pages */ +#define VIRTIO_BALLOON_F_STATS_VQ	1 /* Memory Stats virtqueue */  /* Size of a PFN in the balloon interface. */  #define VIRTIO_BALLOON_PFN_SHIFT 12 @@ -18,4 +19,18 @@ struct virtio_balloon_config  	/* Number of pages we've actually got in balloon. */  	__le32 actual;  }; + +#define VIRTIO_BALLOON_S_SWAP_IN  0   /* Amount of memory swapped in */ +#define VIRTIO_BALLOON_S_SWAP_OUT 1   /* Amount of memory swapped out */ +#define VIRTIO_BALLOON_S_MAJFLT   2   /* Number of major faults */ +#define VIRTIO_BALLOON_S_MINFLT   3   /* Number of minor faults */ +#define VIRTIO_BALLOON_S_MEMFREE  4   /* Total amount of free memory */ +#define VIRTIO_BALLOON_S_MEMTOT   5   /* Total amount of memory */ +#define VIRTIO_BALLOON_S_NR       6 + +struct virtio_balloon_stat { +	u16 tag; +	u64 val; +} __attribute__((packed)); +  #endif /* _LINUX_VIRTIO_BALLOON_H */ diff --git a/include/linux/virtio_blk.h b/include/linux/virtio_blk.h index fd294c56d57..167720d695e 100644 --- a/include/linux/virtio_blk.h +++ b/include/linux/virtio_blk.h @@ -15,6 +15,9 @@  #define VIRTIO_BLK_F_BLK_SIZE	6	/* Block size of disk is available*/  #define VIRTIO_BLK_F_SCSI	7	/* Supports scsi command passthru */  #define VIRTIO_BLK_F_FLUSH	9	/* Cache flush command support */ +#define VIRTIO_BLK_F_TOPOLOGY	10	/* Topology information is available */ + +#define VIRTIO_BLK_ID_BYTES	20	/* ID string length */  struct virtio_blk_config {  	/* The capacity (in 512-byte sectors). */ @@ -29,8 +32,20 @@ struct virtio_blk_config {  		__u8 heads;  		__u8 sectors;  	} geometry; +  	/* block size of device (if VIRTIO_BLK_F_BLK_SIZE) */  	__u32 blk_size; + +	/* the next 4 entries are guarded by VIRTIO_BLK_F_TOPOLOGY  */ +	/* exponent for physical block per logical block. */ +	__u8 physical_block_exp; +	/* alignment offset in logical blocks. */ +	__u8 alignment_offset; +	/* minimum I/O size without performance penalty in logical blocks. */ +	__u16 min_io_size; +	/* optimal sustained I/O size in logical blocks. */ +	__u32 opt_io_size; +  } __attribute__((packed));  /* @@ -54,6 +69,9 @@ struct virtio_blk_config {  /* Cache flush command */  #define VIRTIO_BLK_T_FLUSH	4 +/* Get device ID command */ +#define VIRTIO_BLK_T_GET_ID    8 +  /* Barrier before this op. */  #define VIRTIO_BLK_T_BARRIER	0x80000000 diff --git a/include/linux/virtio_console.h b/include/linux/virtio_console.h index fe885174cc1..a85064db8f9 100644 --- a/include/linux/virtio_console.h +++ b/include/linux/virtio_console.h @@ -3,19 +3,47 @@  #include <linux/types.h>  #include <linux/virtio_ids.h>  #include <linux/virtio_config.h> -/* This header, excluding the #ifdef __KERNEL__ part, is BSD licensed so - * anyone can use the definitions to implement compatible drivers/servers. */ +/* + * This header, excluding the #ifdef __KERNEL__ part, is BSD licensed so + * anyone can use the definitions to implement compatible drivers/servers. + * + * Copyright (C) Red Hat, Inc., 2009, 2010 + */  /* Feature bits */  #define VIRTIO_CONSOLE_F_SIZE	0	/* Does host provide console size? */ +#define VIRTIO_CONSOLE_F_MULTIPORT 1	/* Does host provide multiple ports? */ + +#define VIRTIO_CONSOLE_BAD_ID		(~(u32)0)  struct virtio_console_config {  	/* colums of the screens */  	__u16 cols;  	/* rows of the screens */  	__u16 rows; +	/* max. number of ports this device can hold */ +	__u32 max_nr_ports;  } __attribute__((packed)); +/* + * A message that's passed between the Host and the Guest for a + * particular port. + */ +struct virtio_console_control { +	__u32 id;		/* Port number */ +	__u16 event;		/* The kind of control event (see below) */ +	__u16 value;		/* Extra information for the key */ +}; + +/* Some events for control messages */ +#define VIRTIO_CONSOLE_DEVICE_READY	0 +#define VIRTIO_CONSOLE_PORT_ADD		1 +#define VIRTIO_CONSOLE_PORT_REMOVE	2 +#define VIRTIO_CONSOLE_PORT_READY	3 +#define VIRTIO_CONSOLE_CONSOLE_PORT	4 +#define VIRTIO_CONSOLE_RESIZE		5 +#define VIRTIO_CONSOLE_PORT_OPEN	6 +#define VIRTIO_CONSOLE_PORT_NAME	7  #ifdef __KERNEL__  int __init virtio_cons_early_init(int (*put_chars)(u32, const char *, int)); diff --git a/include/linux/vmstat.h b/include/linux/vmstat.h index ee03bba9c5d..7f43ccdc1d3 100644 --- a/include/linux/vmstat.h +++ b/include/linux/vmstat.h @@ -43,6 +43,10 @@ enum vm_event_item { PGPGIN, PGPGOUT, PSWPIN, PSWPOUT,  		KSWAPD_LOW_WMARK_HIT_QUICKLY, KSWAPD_HIGH_WMARK_HIT_QUICKLY,  		KSWAPD_SKIP_CONGESTION_WAIT,  		PAGEOUTRUN, ALLOCSTALL, PGROTATED, +#ifdef CONFIG_COMPACTION +		COMPACTBLOCKS, COMPACTPAGES, COMPACTPAGEFAILED, +		COMPACTSTALL, COMPACTFAIL, COMPACTSUCCESS, +#endif  #ifdef CONFIG_HUGETLB_PAGE  		HTLB_BUDDY_PGALLOC, HTLB_BUDDY_PGALLOC_FAIL,  #endif @@ -78,22 +82,22 @@ DECLARE_PER_CPU(struct vm_event_state, vm_event_states);  static inline void __count_vm_event(enum vm_event_item item)  { -	__this_cpu_inc(per_cpu_var(vm_event_states).event[item]); +	__this_cpu_inc(vm_event_states.event[item]);  }  static inline void count_vm_event(enum vm_event_item item)  { -	this_cpu_inc(per_cpu_var(vm_event_states).event[item]); +	this_cpu_inc(vm_event_states.event[item]);  }  static inline void __count_vm_events(enum vm_event_item item, long delta)  { -	__this_cpu_add(per_cpu_var(vm_event_states).event[item], delta); +	__this_cpu_add(vm_event_states.event[item], delta);  }  static inline void count_vm_events(enum vm_event_item item, long delta)  { -	this_cpu_add(per_cpu_var(vm_event_states).event[item], delta); +	this_cpu_add(vm_event_states.event[item], delta);  }  extern void all_vm_events(unsigned long *); diff --git a/include/linux/wait.h b/include/linux/wait.h index a48e16b77d5..0836ccc5712 100644 --- a/include/linux/wait.h +++ b/include/linux/wait.h @@ -127,12 +127,26 @@ static inline void __add_wait_queue(wait_queue_head_t *head, wait_queue_t *new)  /*   * Used for wake-one threads:   */ +static inline void __add_wait_queue_exclusive(wait_queue_head_t *q, +					      wait_queue_t *wait) +{ +	wait->flags |= WQ_FLAG_EXCLUSIVE; +	__add_wait_queue(q, wait); +} +  static inline void __add_wait_queue_tail(wait_queue_head_t *head, -						wait_queue_t *new) +					 wait_queue_t *new)  {  	list_add_tail(&new->task_list, &head->task_list);  } +static inline void __add_wait_queue_tail_exclusive(wait_queue_head_t *q, +					      wait_queue_t *wait) +{ +	wait->flags |= WQ_FLAG_EXCLUSIVE; +	__add_wait_queue_tail(q, wait); +} +  static inline void __remove_wait_queue(wait_queue_head_t *head,  							wait_queue_t *old)  { @@ -362,6 +376,155 @@ do {									\  	__ret;								\  }) + +#define __wait_event_interruptible_locked(wq, condition, exclusive, irq) \ +({									\ +	int __ret = 0;							\ +	DEFINE_WAIT(__wait);						\ +	if (exclusive)							\ +		__wait.flags |= WQ_FLAG_EXCLUSIVE;			\ +	do {								\ +		if (likely(list_empty(&__wait.task_list)))		\ +			__add_wait_queue_tail(&(wq), &__wait);		\ +		set_current_state(TASK_INTERRUPTIBLE);			\ +		if (signal_pending(current)) {				\ +			__ret = -ERESTARTSYS;				\ +			break;						\ +		}							\ +		if (irq)						\ +			spin_unlock_irq(&(wq).lock);			\ +		else							\ +			spin_unlock(&(wq).lock);			\ +		schedule();						\ +		if (irq)						\ +			spin_lock_irq(&(wq).lock);			\ +		else							\ +			spin_lock(&(wq).lock);				\ +	} while (!(condition));						\ +	__remove_wait_queue(&(wq), &__wait);				\ +	__set_current_state(TASK_RUNNING);				\ +	__ret;								\ +}) + + +/** + * wait_event_interruptible_locked - sleep until a condition gets true + * @wq: the waitqueue to wait on + * @condition: a C expression for the event to wait for + * + * The process is put to sleep (TASK_INTERRUPTIBLE) until the + * @condition evaluates to true or a signal is received. + * The @condition is checked each time the waitqueue @wq is woken up. + * + * It must be called with wq.lock being held.  This spinlock is + * unlocked while sleeping but @condition testing is done while lock + * is held and when this macro exits the lock is held. + * + * The lock is locked/unlocked using spin_lock()/spin_unlock() + * functions which must match the way they are locked/unlocked outside + * of this macro. + * + * wake_up_locked() has to be called after changing any variable that could + * change the result of the wait condition. + * + * The function will return -ERESTARTSYS if it was interrupted by a + * signal and 0 if @condition evaluated to true. + */ +#define wait_event_interruptible_locked(wq, condition)			\ +	((condition)							\ +	 ? 0 : __wait_event_interruptible_locked(wq, condition, 0, 0)) + +/** + * wait_event_interruptible_locked_irq - sleep until a condition gets true + * @wq: the waitqueue to wait on + * @condition: a C expression for the event to wait for + * + * The process is put to sleep (TASK_INTERRUPTIBLE) until the + * @condition evaluates to true or a signal is received. + * The @condition is checked each time the waitqueue @wq is woken up. + * + * It must be called with wq.lock being held.  This spinlock is + * unlocked while sleeping but @condition testing is done while lock + * is held and when this macro exits the lock is held. + * + * The lock is locked/unlocked using spin_lock_irq()/spin_unlock_irq() + * functions which must match the way they are locked/unlocked outside + * of this macro. + * + * wake_up_locked() has to be called after changing any variable that could + * change the result of the wait condition. + * + * The function will return -ERESTARTSYS if it was interrupted by a + * signal and 0 if @condition evaluated to true. + */ +#define wait_event_interruptible_locked_irq(wq, condition)		\ +	((condition)							\ +	 ? 0 : __wait_event_interruptible_locked(wq, condition, 0, 1)) + +/** + * wait_event_interruptible_exclusive_locked - sleep exclusively until a condition gets true + * @wq: the waitqueue to wait on + * @condition: a C expression for the event to wait for + * + * The process is put to sleep (TASK_INTERRUPTIBLE) until the + * @condition evaluates to true or a signal is received. + * The @condition is checked each time the waitqueue @wq is woken up. + * + * It must be called with wq.lock being held.  This spinlock is + * unlocked while sleeping but @condition testing is done while lock + * is held and when this macro exits the lock is held. + * + * The lock is locked/unlocked using spin_lock()/spin_unlock() + * functions which must match the way they are locked/unlocked outside + * of this macro. + * + * The process is put on the wait queue with an WQ_FLAG_EXCLUSIVE flag + * set thus when other process waits process on the list if this + * process is awaken further processes are not considered. + * + * wake_up_locked() has to be called after changing any variable that could + * change the result of the wait condition. + * + * The function will return -ERESTARTSYS if it was interrupted by a + * signal and 0 if @condition evaluated to true. + */ +#define wait_event_interruptible_exclusive_locked(wq, condition)	\ +	((condition)							\ +	 ? 0 : __wait_event_interruptible_locked(wq, condition, 1, 0)) + +/** + * wait_event_interruptible_exclusive_locked_irq - sleep until a condition gets true + * @wq: the waitqueue to wait on + * @condition: a C expression for the event to wait for + * + * The process is put to sleep (TASK_INTERRUPTIBLE) until the + * @condition evaluates to true or a signal is received. + * The @condition is checked each time the waitqueue @wq is woken up. + * + * It must be called with wq.lock being held.  This spinlock is + * unlocked while sleeping but @condition testing is done while lock + * is held and when this macro exits the lock is held. + * + * The lock is locked/unlocked using spin_lock_irq()/spin_unlock_irq() + * functions which must match the way they are locked/unlocked outside + * of this macro. + * + * The process is put on the wait queue with an WQ_FLAG_EXCLUSIVE flag + * set thus when other process waits process on the list if this + * process is awaken further processes are not considered. + * + * wake_up_locked() has to be called after changing any variable that could + * change the result of the wait condition. + * + * The function will return -ERESTARTSYS if it was interrupted by a + * signal and 0 if @condition evaluated to true. + */ +#define wait_event_interruptible_exclusive_locked_irq(wq, condition)	\ +	((condition)							\ +	 ? 0 : __wait_event_interruptible_locked(wq, condition, 1, 1)) + + +  #define __wait_event_killable(wq, condition, ret)			\  do {									\  	DEFINE_WAIT(__wait);						\ @@ -404,25 +567,6 @@ do {									\  })  /* - * Must be called with the spinlock in the wait_queue_head_t held. - */ -static inline void add_wait_queue_exclusive_locked(wait_queue_head_t *q, -						   wait_queue_t * wait) -{ -	wait->flags |= WQ_FLAG_EXCLUSIVE; -	__add_wait_queue_tail(q,  wait); -} - -/* - * Must be called with the spinlock in the wait_queue_head_t held. - */ -static inline void remove_wait_queue_locked(wait_queue_head_t *q, -					    wait_queue_t * wait) -{ -	__remove_wait_queue(q,  wait); -} - -/*   * These are the old interfaces to sleep waiting for an event.   * They are racy.  DO NOT use them, use the wait_event* interfaces above.   * We plan to remove these interfaces. diff --git a/include/linux/wimax/debug.h b/include/linux/wimax/debug.h index db8096e8853..57031b4d12f 100644 --- a/include/linux/wimax/debug.h +++ b/include/linux/wimax/debug.h @@ -155,6 +155,7 @@  #include <linux/types.h>  #include <linux/device.h> +#include <linux/slab.h>  /* Backend stuff */ diff --git a/include/linux/wireless.h b/include/linux/wireless.h index 5b4c6c772a9..e6827eedf18 100644 --- a/include/linux/wireless.h +++ b/include/linux/wireless.h @@ -346,6 +346,8 @@  #define SIOCIWFIRST	0x8B00  #define SIOCIWLAST	SIOCIWLASTPRIV		/* 0x8BFF */  #define IW_IOCTL_IDX(cmd)	((cmd) - SIOCIWFIRST) +#define IW_HANDLER(id, func)			\ +	[IW_IOCTL_IDX(id)] = func  /* Odd : get (world access), even : set (root access) */  #define IW_IS_SET(cmd)	(!((cmd) & 0x1)) @@ -648,7 +650,7 @@   * 32 bit bitmasks. Note : 32 bits = 0x20 = 2^5. */  #define IW_EVENT_CAPA_BASE(cmd)		((cmd >= SIOCIWFIRSTPRIV) ? \  					 (cmd - SIOCIWFIRSTPRIV + 0x60) : \ -					 (cmd - SIOCSIWCOMMIT)) +					 (cmd - SIOCIWFIRST))  #define IW_EVENT_CAPA_INDEX(cmd)	(IW_EVENT_CAPA_BASE(cmd) >> 5)  #define IW_EVENT_CAPA_MASK(cmd)		(1 << (IW_EVENT_CAPA_BASE(cmd) & 0x1F))  /* Event capability constants - event autogenerated by the kernel diff --git a/include/linux/writeback.h b/include/linux/writeback.h index 76e8903cd20..cc97d6caf2b 100644 --- a/include/linux/writeback.h +++ b/include/linux/writeback.h @@ -34,6 +34,9 @@ struct writeback_control {  	enum writeback_sync_modes sync_mode;  	unsigned long *older_than_this;	/* If !NULL, only write back inodes  					   older than this */ +	unsigned long wb_start;         /* Time writeback_inodes_wb was +					   called. This is needed to avoid +					   extra jobs and livelock */  	long nr_to_write;		/* Write this many pages, and decrement  					   this for each page written */  	long pages_skipped;		/* Pages which were not written */ @@ -62,6 +65,15 @@ struct writeback_control {  	 * so we use a single control to update them  	 */  	unsigned no_nrwrite_index_update:1; + +	/* +	 * For WB_SYNC_ALL, the sb must always be pinned. For WB_SYNC_NONE, +	 * the writeback code will pin the sb for the caller. However, +	 * for eg umount, the caller does WB_SYNC_NONE but already has +	 * the sb pinned. If the below is set, caller already has the +	 * sb pinned. +	 */ +	unsigned sb_pinned:1;  };  /* @@ -70,6 +82,7 @@ struct writeback_control {  struct bdi_writeback;  int inode_wait(void *);  void writeback_inodes_sb(struct super_block *); +void writeback_inodes_sb_locked(struct super_block *);  int writeback_inodes_sb_if_idle(struct super_block *);  void sync_inodes_sb(struct super_block *);  void writeback_inodes_wbc(struct writeback_control *wbc); @@ -93,8 +106,14 @@ static inline void inode_sync_wait(struct inode *inode)  /*   * mm/page-writeback.c   */ -void laptop_io_completion(void); +#ifdef CONFIG_BLOCK +void laptop_io_completion(struct backing_dev_info *info);  void laptop_sync_completion(void); +void laptop_mode_sync(struct work_struct *work); +void laptop_mode_timer_fn(unsigned long data); +#else +static inline void laptop_sync_completion(void) { } +#endif  void throttle_vm_writeout(gfp_t gfp_mask);  /* These are exported to sysctl. */ diff --git a/include/linux/xattr.h b/include/linux/xattr.h index fb9b7e6e1e2..0cfa1e9c4cc 100644 --- a/include/linux/xattr.h +++ b/include/linux/xattr.h @@ -37,7 +37,7 @@ struct inode;  struct dentry;  struct xattr_handler { -	char *prefix; +	const char *prefix;  	int flags;	/* fs private flags passed back to the handlers */  	size_t (*list)(struct dentry *dentry, char *list, size_t list_size,  		       const char *name, size_t name_len, int handler_flags); diff --git a/include/linux/xfrm.h b/include/linux/xfrm.h index 29e04beb1fc..b971e384849 100644 --- a/include/linux/xfrm.h +++ b/include/linux/xfrm.h @@ -267,8 +267,8 @@ enum xfrm_attr_type_t {  	XFRMA_ALG_COMP,		/* struct xfrm_algo */  	XFRMA_ENCAP,		/* struct xfrm_algo + struct xfrm_encap_tmpl */  	XFRMA_TMPL,		/* 1 or more struct xfrm_user_tmpl */ -	XFRMA_SA, -	XFRMA_POLICY, +	XFRMA_SA,		/* struct xfrm_usersa_info  */ +	XFRMA_POLICY,		/*struct xfrm_userpolicy_info */  	XFRMA_SEC_CTX,		/* struct xfrm_sec_ctx */  	XFRMA_LTIME_VAL,  	XFRMA_REPLAY_VAL, @@ -276,17 +276,23 @@ enum xfrm_attr_type_t {  	XFRMA_ETIMER_THRESH,  	XFRMA_SRCADDR,		/* xfrm_address_t */  	XFRMA_COADDR,		/* xfrm_address_t */ -	XFRMA_LASTUSED, +	XFRMA_LASTUSED,		/* unsigned long  */  	XFRMA_POLICY_TYPE,	/* struct xfrm_userpolicy_type */  	XFRMA_MIGRATE,  	XFRMA_ALG_AEAD,		/* struct xfrm_algo_aead */  	XFRMA_KMADDRESS,        /* struct xfrm_user_kmaddress */  	XFRMA_ALG_AUTH_TRUNC,	/* struct xfrm_algo_auth */ +	XFRMA_MARK,		/* struct xfrm_mark */  	__XFRMA_MAX  #define XFRMA_MAX (__XFRMA_MAX - 1)  }; +struct xfrm_mark { +	__u32           v; /* value */ +	__u32           m; /* mask */ +}; +  enum xfrm_sadattr_type_t {  	XFRMA_SAD_UNSPEC,  	XFRMA_SAD_CNT, diff --git a/include/linux/z2_battery.h b/include/linux/z2_battery.h new file mode 100644 index 00000000000..7b9750404d2 --- /dev/null +++ b/include/linux/z2_battery.h @@ -0,0 +1,17 @@ +#ifndef _LINUX_Z2_BATTERY_H +#define _LINUX_Z2_BATTERY_H + +struct z2_battery_info { +	int	 batt_I2C_bus; +	int	 batt_I2C_addr; +	int	 batt_I2C_reg; +	int	 charge_gpio; +	int	 min_voltage; +	int	 max_voltage; +	int	 batt_div; +	int	 batt_mult; +	int	 batt_tech; +	char	*batt_name; +}; + +#endif diff --git a/include/linux/zorro.h b/include/linux/zorro.h index 913bfc226dd..7bf9db525e9 100644 --- a/include/linux/zorro.h +++ b/include/linux/zorro.h @@ -38,8 +38,6 @@  typedef __u32 zorro_id; -#define ZORRO_WILDCARD		(0xffffffff)	/* not official */ -  /* Include the ID list */  #include <linux/zorro_ids.h> @@ -116,6 +114,7 @@ struct ConfigDev {  #include <linux/init.h>  #include <linux/ioport.h> +#include <linux/mod_devicetable.h>  #include <asm/zorro.h> @@ -142,29 +141,10 @@ struct zorro_dev {       *  Zorro bus       */ -struct zorro_bus { -    struct list_head devices;		/* list of devices on this bus */ -    unsigned int num_resources;		/* number of resources */ -    struct resource resources[4];	/* address space routed to this bus */ -    struct device dev; -    char name[10]; -}; - -extern struct zorro_bus zorro_bus;	/* single Zorro bus */  extern struct bus_type zorro_bus_type;      /* -     *  Zorro device IDs -     */ - -struct zorro_device_id { -	zorro_id id;			/* Device ID or ZORRO_WILDCARD */ -	unsigned long driver_data;	/* Data private to the driver */ -}; - - -    /*       *  Zorro device drivers       */  |