diff options
Diffstat (limited to 'include/linux')
314 files changed, 8767 insertions, 2363 deletions
diff --git a/include/linux/aio.h b/include/linux/aio.h index 2dcb72bff4b..2314ad8b3c9 100644 --- a/include/linux/aio.h +++ b/include/linux/aio.h @@ -117,6 +117,7 @@ struct kiocb {  	struct list_head	ki_list;	/* the aio core uses this  						 * for cancellation */ +	struct list_head	ki_batch;	/* batch allocation */  	/*  	 * If the aio_resfd field of the userspace iocb is not zero, diff --git a/include/linux/alarmtimer.h b/include/linux/alarmtimer.h index c5d6095b46f..975009e1cbe 100644 --- a/include/linux/alarmtimer.h +++ b/include/linux/alarmtimer.h @@ -13,6 +13,16 @@ enum alarmtimer_type {  	ALARM_NUMTYPE,  }; +enum alarmtimer_restart { +	ALARMTIMER_NORESTART, +	ALARMTIMER_RESTART, +}; + + +#define ALARMTIMER_STATE_INACTIVE	0x00 +#define ALARMTIMER_STATE_ENQUEUED	0x01 +#define ALARMTIMER_STATE_CALLBACK	0x02 +  /**   * struct alarm - Alarm timer structure   * @node:	timerqueue node for adding to the event list this value @@ -25,16 +35,45 @@ enum alarmtimer_type {   */  struct alarm {  	struct timerqueue_node	node; -	ktime_t			period; -	void			(*function)(struct alarm *); +	enum alarmtimer_restart	(*function)(struct alarm *, ktime_t now);  	enum alarmtimer_type	type; -	bool			enabled; +	int			state;  	void			*data;  };  void alarm_init(struct alarm *alarm, enum alarmtimer_type type, -		void (*function)(struct alarm *)); -void alarm_start(struct alarm *alarm, ktime_t start, ktime_t period); -void alarm_cancel(struct alarm *alarm); +		enum alarmtimer_restart (*function)(struct alarm *, ktime_t)); +void alarm_start(struct alarm *alarm, ktime_t start); +int alarm_try_to_cancel(struct alarm *alarm); +int alarm_cancel(struct alarm *alarm); + +u64 alarm_forward(struct alarm *alarm, ktime_t now, ktime_t interval); + +/* + * A alarmtimer is active, when it is enqueued into timerqueue or the + * callback function is running. + */ +static inline int alarmtimer_active(const struct alarm *timer) +{ +	return timer->state != ALARMTIMER_STATE_INACTIVE; +} + +/* + * Helper function to check, whether the timer is on one of the queues + */ +static inline int alarmtimer_is_queued(struct alarm *timer) +{ +	return timer->state & ALARMTIMER_STATE_ENQUEUED; +} + +/* + * Helper function to check, whether the timer is running the callback + * function + */ +static inline int alarmtimer_callback_running(struct alarm *timer) +{ +	return timer->state & ALARMTIMER_STATE_CALLBACK; +} +  #endif diff --git a/include/linux/amba/pl061.h b/include/linux/amba/pl061.h index 5ddd9ad4b19..2412af944f1 100644 --- a/include/linux/amba/pl061.h +++ b/include/linux/amba/pl061.h @@ -7,8 +7,7 @@ struct pl061_platform_data {  	unsigned	gpio_base;  	/* number of the first IRQ. -	 * If the IRQ functionality in not desired this must be set to -	 * (unsigned) -1. +	 * If the IRQ functionality in not desired this must be set to NO_IRQ.  	 */  	unsigned	irq_base; diff --git a/include/linux/amba/pl08x.h b/include/linux/amba/pl08x.h index e6e28f37d8e..9eabffbc4e5 100644 --- a/include/linux/amba/pl08x.h +++ b/include/linux/amba/pl08x.h @@ -47,6 +47,9 @@ enum {   * @muxval: a number usually used to poke into some mux regiser to   * mux in the signal to this channel   * @cctl_opt: default options for the channel control register + * @device_fc: Flow Controller Settings for ccfg register. Only valid for slave + * channels. Fill with 'true' if peripheral should be flow controller. Direction + * will be selected at Runtime.   * @addr: source/target address in physical memory for this DMA channel,   * can be the address of a FIFO register for burst requests for example.   * This can be left undefined if the PrimeCell API is used for configuring @@ -65,6 +68,7 @@ struct pl08x_channel_data {  	int max_signal;  	u32 muxval;  	u32 cctl; +	bool device_fc;  	dma_addr_t addr;  	bool circular_buffer;  	bool single; @@ -77,13 +81,11 @@ struct pl08x_channel_data {   * @addr: current address   * @maxwidth: the maximum width of a transfer on this bus   * @buswidth: the width of this bus in bytes: 1, 2 or 4 - * @fill_bytes: bytes required to fill to the next bus memory boundary   */  struct pl08x_bus_data {  	dma_addr_t addr;  	u8 maxwidth;  	u8 buswidth; -	size_t fill_bytes;  };  /** @@ -104,17 +106,35 @@ struct pl08x_phy_chan {  };  /** + * struct pl08x_sg - structure containing data per sg + * @src_addr: src address of sg + * @dst_addr: dst address of sg + * @len: transfer len in bytes + * @node: node for txd's dsg_list + */ +struct pl08x_sg { +	dma_addr_t src_addr; +	dma_addr_t dst_addr; +	size_t len; +	struct list_head node; +}; + +/**   * struct pl08x_txd - wrapper for struct dma_async_tx_descriptor + * @tx: async tx descriptor + * @node: node for txd list for channels + * @dsg_list: list of children sg's + * @direction: direction of transfer   * @llis_bus: DMA memory address (physical) start for the LLIs   * @llis_va: virtual memory address start for the LLIs + * @cctl: control reg values for current txd + * @ccfg: config reg values for current txd   */  struct pl08x_txd {  	struct dma_async_tx_descriptor tx;  	struct list_head node; +	struct list_head dsg_list;  	enum dma_data_direction	direction; -	dma_addr_t src_addr; -	dma_addr_t dst_addr; -	size_t len;  	dma_addr_t llis_bus;  	struct pl08x_lli *llis_va;  	/* Default cctl value for LLIs */ diff --git a/include/linux/amba/pl330.h b/include/linux/amba/pl330.h index cbee7de7dd3..d12f077a6da 100644 --- a/include/linux/amba/pl330.h +++ b/include/linux/amba/pl330.h @@ -19,12 +19,8 @@ struct dma_pl330_peri {  	 * Peri_Req i/f of the DMAC that is  	 * peripheral could be reached from.  	 */ -	u8 peri_id; /* {0, 31} */ +	u8 peri_id; /* specific dma id */  	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 { diff --git a/include/linux/atalk.h b/include/linux/atalk.h index d34c187432e..f57c36881c4 100644 --- a/include/linux/atalk.h +++ b/include/linux/atalk.h @@ -3,6 +3,7 @@  #include <linux/types.h>  #include <asm/byteorder.h> +#include <linux/socket.h>  /*   * AppleTalk networking structures @@ -28,7 +29,7 @@ struct atalk_addr {  };  struct sockaddr_at { -	sa_family_t	  sat_family; +	__kernel_sa_family_t sat_family;  	__u8		  sat_port;  	struct atalk_addr sat_addr;  	char		  sat_zero[8]; diff --git a/include/linux/atmel-mci.h b/include/linux/atmel-mci.h index 3e09b345f4d..4c7a4b2104b 100644 --- a/include/linux/atmel-mci.h +++ b/include/linux/atmel-mci.h @@ -1,7 +1,7 @@  #ifndef __LINUX_ATMEL_MCI_H  #define __LINUX_ATMEL_MCI_H -#define ATMEL_MCI_MAX_NR_SLOTS	2 +#define ATMCI_MAX_NR_SLOTS	2  /**   * struct mci_slot_pdata - board-specific per-slot configuration @@ -33,7 +33,7 @@ struct mci_slot_pdata {   */  struct mci_platform_data {  	struct mci_dma_data	*dma_slave; -	struct mci_slot_pdata	slot[ATMEL_MCI_MAX_NR_SLOTS]; +	struct mci_slot_pdata	slot[ATMCI_MAX_NR_SLOTS];  };  #endif /* __LINUX_ATMEL_MCI_H */ diff --git a/include/linux/atmel_pdc.h b/include/linux/atmel_pdc.h index 5058a31d2ce..63499ce806e 100644 --- a/include/linux/atmel_pdc.h +++ b/include/linux/atmel_pdc.h @@ -33,4 +33,6 @@  #define ATMEL_PDC_PTSR		0x124	/* Transfer Status Register */ +#define ATMEL_PDC_SCND_BUF_OFF	0x10	/* Offset between first and second buffer registers */ +  #endif diff --git a/include/linux/audit.h b/include/linux/audit.h index 0c8006129fb..2f81c6f3b63 100644 --- a/include/linux/audit.h +++ b/include/linux/audit.h @@ -584,14 +584,13 @@ extern int audit_signals;  #ifdef CONFIG_AUDIT  /* These are defined in audit.c */  				/* Public API */ -extern void		    audit_log(struct audit_context *ctx, gfp_t gfp_mask, -				      int type, const char *fmt, ...) -				      __attribute__((format(printf,4,5))); +extern __printf(4, 5) +void audit_log(struct audit_context *ctx, gfp_t gfp_mask, int type, +	       const char *fmt, ...);  extern struct audit_buffer *audit_log_start(struct audit_context *ctx, gfp_t gfp_mask, int type); -extern void		    audit_log_format(struct audit_buffer *ab, -					     const char *fmt, ...) -			    __attribute__((format(printf,2,3))); +extern __printf(2, 3) +void audit_log_format(struct audit_buffer *ab, const char *fmt, ...);  extern void		    audit_log_end(struct audit_buffer *ab);  extern int		    audit_string_contains_control(const char *string,  							  size_t len); diff --git a/include/linux/ax25.h b/include/linux/ax25.h index 56c11f0dbd8..74c89a41732 100644 --- a/include/linux/ax25.h +++ b/include/linux/ax25.h @@ -47,7 +47,7 @@ typedef struct {  } ax25_address;  struct sockaddr_ax25 { -	sa_family_t	sax25_family; +	__kernel_sa_family_t sax25_family;  	ax25_address	sax25_call;  	int		sax25_ndigis;  	/* Digipeater ax25_address sets follow */ diff --git a/include/linux/bcma/bcma.h b/include/linux/bcma/bcma.h index 8c96654bef1..5dbd7055cb8 100644 --- a/include/linux/bcma/bcma.h +++ b/include/linux/bcma/bcma.h @@ -6,6 +6,7 @@  #include <linux/bcma/bcma_driver_chipcommon.h>  #include <linux/bcma/bcma_driver_pci.h> +#include <linux/bcma/bcma_driver_mips.h>  #include <linux/ssb/ssb.h> /* SPROM sharing */  #include "bcma_regs.h" @@ -14,9 +15,9 @@ struct bcma_device;  struct bcma_bus;  enum bcma_hosttype { -	BCMA_HOSTTYPE_NONE,  	BCMA_HOSTTYPE_PCI,  	BCMA_HOSTTYPE_SDIO, +	BCMA_HOSTTYPE_SOC,  };  struct bcma_chipinfo { @@ -130,6 +131,7 @@ struct bcma_device {  	struct device dev;  	struct device *dma_dev; +  	unsigned int irq;  	bool dev_registered; @@ -138,6 +140,9 @@ struct bcma_device {  	u32 addr;  	u32 wrap; +	void __iomem *io_addr; +	void __iomem *io_wrap; +  	void *drvdata;  	struct list_head list;  }; @@ -190,9 +195,11 @@ struct bcma_bus {  	struct bcma_device *mapped_core;  	struct list_head cores;  	u8 nr_cores; +	u8 init_done:1;  	struct bcma_drv_cc drv_cc;  	struct bcma_drv_pci drv_pci; +	struct bcma_drv_mips drv_mips;  	/* We decided to share SPROM struct with SSB as long as we do not need  	 * any hacks for BCMA. This simplifies drivers code. */ diff --git a/include/linux/bcma/bcma_driver_chipcommon.h b/include/linux/bcma/bcma_driver_chipcommon.h index a0f684615ae..1526d965ed0 100644 --- a/include/linux/bcma/bcma_driver_chipcommon.h +++ b/include/linux/bcma/bcma_driver_chipcommon.h @@ -24,6 +24,7 @@  #define   BCMA_CC_FLASHT_NONE		0x00000000	/* No flash */  #define   BCMA_CC_FLASHT_STSER		0x00000100	/* ST serial flash */  #define   BCMA_CC_FLASHT_ATSER		0x00000200	/* Atmel serial flash */ +#define   BCMA_CC_FLASHT_NFLASH		0x00000200  #define	  BCMA_CC_FLASHT_PARA		0x00000700	/* Parallel flash */  #define  BCMA_CC_CAP_PLLT		0x00038000	/* PLL Type */  #define   BCMA_PLLTYPE_NONE		0x00000000 @@ -178,6 +179,7 @@  #define BCMA_CC_PROG_CFG		0x0120  #define BCMA_CC_PROG_WAITCNT		0x0124  #define BCMA_CC_FLASH_CFG		0x0128 +#define  BCMA_CC_FLASH_CFG_DS		0x0010	/* Data size, 0=8bit, 1=16bit */  #define BCMA_CC_FLASH_WAITCNT		0x012C  /* 0x1E0 is defined as shared BCMA_CLKCTLST */  #define BCMA_CC_HW_WORKAROUND		0x01E4 /* Hardware workaround (rev >= 20) */ @@ -239,6 +241,64 @@  #define BCMA_CC_SPROM			0x0800 /* SPROM beginning */  #define BCMA_CC_SPROM_PCIE6		0x0830 /* SPROM beginning on PCIe rev >= 6 */ +/* Divider allocation in 4716/47162/5356 */ +#define BCMA_CC_PMU5_MAINPLL_CPU	1 +#define BCMA_CC_PMU5_MAINPLL_MEM	2 +#define BCMA_CC_PMU5_MAINPLL_SSB	3 + +/* PLL usage in 4716/47162 */ +#define BCMA_CC_PMU4716_MAINPLL_PLL0	12 + +/* PLL usage in 5356/5357 */ +#define BCMA_CC_PMU5356_MAINPLL_PLL0	0 +#define BCMA_CC_PMU5357_MAINPLL_PLL0	0 + +/* 4706 PMU */ +#define BCMA_CC_PMU4706_MAINPLL_PLL0	0 + +/* ALP clock on pre-PMU chips */ +#define BCMA_CC_PMU_ALP_CLOCK		20000000 +/* HT clock for systems with PMU-enabled chipcommon */ +#define BCMA_CC_PMU_HT_CLOCK		80000000 + +/* PMU rev 5 (& 6) */ +#define BCMA_CC_PPL_P1P2_OFF		0 +#define BCMA_CC_PPL_P1_MASK		0x0f000000 +#define BCMA_CC_PPL_P1_SHIFT		24 +#define BCMA_CC_PPL_P2_MASK		0x00f00000 +#define BCMA_CC_PPL_P2_SHIFT		20 +#define BCMA_CC_PPL_M14_OFF		1 +#define BCMA_CC_PPL_MDIV_MASK		0x000000ff +#define BCMA_CC_PPL_MDIV_WIDTH		8 +#define BCMA_CC_PPL_NM5_OFF		2 +#define BCMA_CC_PPL_NDIV_MASK		0xfff00000 +#define BCMA_CC_PPL_NDIV_SHIFT		20 +#define BCMA_CC_PPL_FMAB_OFF		3 +#define BCMA_CC_PPL_MRAT_MASK		0xf0000000 +#define BCMA_CC_PPL_MRAT_SHIFT		28 +#define BCMA_CC_PPL_ABRAT_MASK		0x08000000 +#define BCMA_CC_PPL_ABRAT_SHIFT		27 +#define BCMA_CC_PPL_FDIV_MASK		0x07ffffff +#define BCMA_CC_PPL_PLLCTL_OFF		4 +#define BCMA_CC_PPL_PCHI_OFF		5 +#define BCMA_CC_PPL_PCHI_MASK		0x0000003f + +/* BCM4331 ChipControl numbers. */ +#define BCMA_CHIPCTL_4331_BT_COEXIST		BIT(0)	/* 0 disable */ +#define BCMA_CHIPCTL_4331_SECI			BIT(1)	/* 0 SECI is disabled (JATG functional) */ +#define BCMA_CHIPCTL_4331_EXT_LNA		BIT(2)	/* 0 disable */ +#define BCMA_CHIPCTL_4331_SPROM_GPIO13_15	BIT(3)	/* sprom/gpio13-15 mux */ +#define BCMA_CHIPCTL_4331_EXTPA_EN		BIT(4)	/* 0 ext pa disable, 1 ext pa enabled */ +#define BCMA_CHIPCTL_4331_GPIOCLK_ON_SPROMCS	BIT(5)	/* set drive out GPIO_CLK on sprom_cs pin */ +#define BCMA_CHIPCTL_4331_PCIE_MDIO_ON_SPROMCS	BIT(6)	/* use sprom_cs pin as PCIE mdio interface */ +#define BCMA_CHIPCTL_4331_EXTPA_ON_GPIO2_5	BIT(7)	/* aband extpa will be at gpio2/5 and sprom_dout */ +#define BCMA_CHIPCTL_4331_OVR_PIPEAUXCLKEN	BIT(8)	/* override core control on pipe_AuxClkEnable */ +#define BCMA_CHIPCTL_4331_OVR_PIPEAUXPWRDOWN	BIT(9)	/* override core control on pipe_AuxPowerDown */ +#define BCMA_CHIPCTL_4331_PCIE_AUXCLKEN		BIT(10)	/* pcie_auxclkenable */ +#define BCMA_CHIPCTL_4331_PCIE_PIPE_PLLDOWN	BIT(11)	/* pcie_pipe_pllpowerdown */ +#define BCMA_CHIPCTL_4331_BT_SHD0_ON_GPIO4	BIT(16)	/* enable bt_shd0 at gpio4 */ +#define BCMA_CHIPCTL_4331_BT_SHD1_ON_GPIO5	BIT(17)	/* enable bt_shd1 at gpio5 */ +  /* Data for the PMU, if available.   * Check availability with ((struct bcma_chipcommon)->capabilities & BCMA_CC_CAP_PMU)   */ @@ -247,14 +307,37 @@ struct bcma_chipcommon_pmu {  	u32 crystalfreq;	/* The active crystal frequency (in kHz) */  }; +#ifdef CONFIG_BCMA_DRIVER_MIPS +struct bcma_pflash { +	u8 buswidth; +	u32 window; +	u32 window_size; +}; + +struct bcma_serial_port { +	void *regs; +	unsigned long clockspeed; +	unsigned int irq; +	unsigned int baud_base; +	unsigned int reg_shift; +}; +#endif /* CONFIG_BCMA_DRIVER_MIPS */ +  struct bcma_drv_cc {  	struct bcma_device *core;  	u32 status;  	u32 capabilities;  	u32 capabilities_ext; +	u8 setup_done:1;  	/* Fast Powerup Delay constant */  	u16 fast_pwrup_delay;  	struct bcma_chipcommon_pmu pmu; +#ifdef CONFIG_BCMA_DRIVER_MIPS +	struct bcma_pflash pflash; + +	int nr_serial_ports; +	struct bcma_serial_port serial_ports[4]; +#endif /* CONFIG_BCMA_DRIVER_MIPS */  };  /* Register access */ @@ -275,6 +358,8 @@ extern void bcma_core_chipcommon_init(struct bcma_drv_cc *cc);  extern void bcma_chipco_suspend(struct bcma_drv_cc *cc);  extern void bcma_chipco_resume(struct bcma_drv_cc *cc); +void bcma_chipco_bcm4331_ext_pa_lines_ctl(struct bcma_drv_cc *cc, bool enable); +  extern void bcma_chipco_watchdog_timer_set(struct bcma_drv_cc *cc,  					  u32 ticks); @@ -293,4 +378,13 @@ u32 bcma_chipco_gpio_polarity(struct bcma_drv_cc *cc, u32 mask, u32 value);  /* PMU support */  extern void bcma_pmu_init(struct bcma_drv_cc *cc); +extern void bcma_chipco_pll_write(struct bcma_drv_cc *cc, u32 offset, +				  u32 value); +extern void bcma_chipco_pll_maskset(struct bcma_drv_cc *cc, u32 offset, +				    u32 mask, u32 set); +extern void bcma_chipco_chipctl_maskset(struct bcma_drv_cc *cc, +					u32 offset, u32 mask, u32 set); +extern void bcma_chipco_regctl_maskset(struct bcma_drv_cc *cc, +				       u32 offset, u32 mask, u32 set); +  #endif /* LINUX_BCMA_DRIVER_CC_H_ */ diff --git a/include/linux/bcma/bcma_driver_mips.h b/include/linux/bcma/bcma_driver_mips.h new file mode 100644 index 00000000000..c0043645cdc --- /dev/null +++ b/include/linux/bcma/bcma_driver_mips.h @@ -0,0 +1,51 @@ +#ifndef LINUX_BCMA_DRIVER_MIPS_H_ +#define LINUX_BCMA_DRIVER_MIPS_H_ + +#define BCMA_MIPS_IPSFLAG		0x0F08 +/* which sbflags get routed to mips interrupt 1 */ +#define  BCMA_MIPS_IPSFLAG_IRQ1		0x0000003F +#define  BCMA_MIPS_IPSFLAG_IRQ1_SHIFT	0 +/* which sbflags get routed to mips interrupt 2 */ +#define  BCMA_MIPS_IPSFLAG_IRQ2		0x00003F00 +#define  BCMA_MIPS_IPSFLAG_IRQ2_SHIFT	8 +/* which sbflags get routed to mips interrupt 3 */ +#define  BCMA_MIPS_IPSFLAG_IRQ3		0x003F0000 +#define  BCMA_MIPS_IPSFLAG_IRQ3_SHIFT	16 +/* which sbflags get routed to mips interrupt 4 */ +#define  BCMA_MIPS_IPSFLAG_IRQ4		0x3F000000 +#define  BCMA_MIPS_IPSFLAG_IRQ4_SHIFT	24 + +/* MIPS 74K core registers */ +#define BCMA_MIPS_MIPS74K_CORECTL	0x0000 +#define BCMA_MIPS_MIPS74K_EXCEPTBASE	0x0004 +#define BCMA_MIPS_MIPS74K_BIST		0x000C +#define BCMA_MIPS_MIPS74K_INTMASK_INT0	0x0014 +#define BCMA_MIPS_MIPS74K_INTMASK(int) \ +	((int) * 4 + BCMA_MIPS_MIPS74K_INTMASK_INT0) +#define BCMA_MIPS_MIPS74K_NMIMASK	0x002C +#define BCMA_MIPS_MIPS74K_GPIOSEL	0x0040 +#define BCMA_MIPS_MIPS74K_GPIOOUT	0x0044 +#define BCMA_MIPS_MIPS74K_GPIOEN	0x0048 +#define BCMA_MIPS_MIPS74K_CLKCTLST	0x01E0 + +#define BCMA_MIPS_OOBSELOUTA30		0x100 + +struct bcma_device; + +struct bcma_drv_mips { +	struct bcma_device *core; +	u8 setup_done:1; +	unsigned int assigned_irqs; +}; + +#ifdef CONFIG_BCMA_DRIVER_MIPS +extern void bcma_core_mips_init(struct bcma_drv_mips *mcore); +#else +static inline void bcma_core_mips_init(struct bcma_drv_mips *mcore) { } +#endif + +extern u32 bcma_cpu_clock(struct bcma_drv_mips *mcore); + +extern unsigned int bcma_core_mips_irq(struct bcma_device *dev); + +#endif /* LINUX_BCMA_DRIVER_MIPS_H_ */ diff --git a/include/linux/bcma/bcma_soc.h b/include/linux/bcma/bcma_soc.h new file mode 100644 index 00000000000..4203c5593b9 --- /dev/null +++ b/include/linux/bcma/bcma_soc.h @@ -0,0 +1,16 @@ +#ifndef LINUX_BCMA_SOC_H_ +#define LINUX_BCMA_SOC_H_ + +#include <linux/bcma/bcma.h> + +struct bcma_soc { +	struct bcma_bus bus; +	struct bcma_device core_cc; +	struct bcma_device core_mips; +}; + +int __init bcma_host_soc_register(struct bcma_soc *soc); + +int bcma_bus_register(struct bcma_bus *bus); + +#endif /* LINUX_BCMA_SOC_H_ */ diff --git a/include/linux/bio.h b/include/linux/bio.h index ce33e6868a2..a3c071c9e18 100644 --- a/include/linux/bio.h +++ b/include/linux/bio.h @@ -269,14 +269,6 @@ extern void bvec_free_bs(struct bio_set *, struct bio_vec *, unsigned int);  extern unsigned int bvec_nr_vecs(unsigned short idx);  /* - * Allow queuer to specify a completion CPU for this bio - */ -static inline void bio_set_completion_cpu(struct bio *bio, unsigned int cpu) -{ -	bio->bi_comp_cpu = cpu; -} - -/*   * bio_set is used to allow other portions of the IO system to   * allocate their own private memory pools for bio and iovec structures.   * These memory pools in turn all allocate from the bio_slab diff --git a/include/linux/blk_types.h b/include/linux/blk_types.h index 71fc53bb8f1..4053cbd4490 100644 --- a/include/linux/blk_types.h +++ b/include/linux/blk_types.h @@ -59,8 +59,6 @@ struct bio {  	unsigned int		bi_max_vecs;	/* max bvl_vecs we can hold */ -	unsigned int		bi_comp_cpu;	/* completion CPU */ -  	atomic_t		bi_cnt;		/* pin count */  	struct bio_vec		*bi_io_vec;	/* the actual vec list */ @@ -93,11 +91,10 @@ struct bio {  #define BIO_BOUNCED	5	/* bio is a bounce bio */  #define BIO_USER_MAPPED 6	/* contains user pages */  #define BIO_EOPNOTSUPP	7	/* not supported */ -#define BIO_CPU_AFFINE	8	/* complete bio on same CPU as submitted */ -#define BIO_NULL_MAPPED 9	/* contains invalid user pages */ -#define BIO_FS_INTEGRITY 10	/* fs owns integrity data, not block layer */ -#define BIO_QUIET	11	/* Make BIO Quiet */ -#define BIO_MAPPED_INTEGRITY 12/* integrity metadata has been remapped */ +#define BIO_NULL_MAPPED 8	/* contains invalid user pages */ +#define BIO_FS_INTEGRITY 9	/* fs owns integrity data, not block layer */ +#define BIO_QUIET	10	/* Make BIO Quiet */ +#define BIO_MAPPED_INTEGRITY 11/* integrity metadata has been remapped */  #define bio_flagged(bio, flag)	((bio)->bi_flags & (1 << (flag)))  /* diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 7fbaa910334..5267cd2f20d 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -195,7 +195,7 @@ struct request_pm_state  #include <linux/elevator.h>  typedef void (request_fn_proc) (struct request_queue *q); -typedef int (make_request_fn) (struct request_queue *q, struct bio *bio); +typedef void (make_request_fn) (struct request_queue *q, struct bio *bio);  typedef int (prep_rq_fn) (struct request_queue *, struct request *);  typedef void (unprep_rq_fn) (struct request_queue *, struct request *); @@ -680,6 +680,8 @@ extern int scsi_cmd_ioctl(struct request_queue *, struct gendisk *, fmode_t,  extern int sg_scsi_ioctl(struct request_queue *, struct gendisk *, fmode_t,  			 struct scsi_ioctl_command __user *); +extern void blk_queue_bio(struct request_queue *q, struct bio *bio); +  /*   * A queue has just exitted congestion.  Note this in the global counter of   * congested queues, and wake up anyone who was waiting for requests to be @@ -863,16 +865,22 @@ struct request_queue *blk_alloc_queue_node(gfp_t, int);  extern void blk_put_queue(struct request_queue *);  /* - * Note: Code in between changing the blk_plug list/cb_list or element of such - * lists is preemptable, but such code can't do sleep (or be very careful), - * otherwise data is corrupted. For details, please check schedule() where - * blk_schedule_flush_plug() is called. + * blk_plug permits building a queue of related requests by holding the I/O + * fragments for a short period. This allows merging of sequential requests + * into single larger request. As the requests are moved from a per-task list to + * the device's request_queue in a batch, this results in improved scalability + * as the lock contention for request_queue lock is reduced. + * + * It is ok not to disable preemption when adding the request to the plug list + * or when attempting a merge, because blk_schedule_flush_list() will only flush + * the plug list when the task sleeps by itself. For details, please see + * schedule() where blk_schedule_flush_plug() is called.   */  struct blk_plug { -	unsigned long magic; -	struct list_head list; -	struct list_head cb_list; -	unsigned int should_sort; +	unsigned long magic; /* detect uninitialized use-cases */ +	struct list_head list; /* requests */ +	struct list_head cb_list; /* md requires an unplug callback */ +	unsigned int should_sort; /* list to be sorted before flushing? */  };  #define BLK_MAX_REQUEST_COUNT 16 @@ -1189,20 +1197,6 @@ static inline uint64_t rq_io_start_time_ns(struct request *req)  }  #endif -#ifdef CONFIG_BLK_DEV_THROTTLING -extern int blk_throtl_init(struct request_queue *q); -extern void blk_throtl_exit(struct request_queue *q); -extern int blk_throtl_bio(struct request_queue *q, struct bio **bio); -#else /* CONFIG_BLK_DEV_THROTTLING */ -static inline int blk_throtl_bio(struct request_queue *q, struct bio **bio) -{ -	return 0; -} - -static inline int blk_throtl_init(struct request_queue *q) { return 0; } -static inline int blk_throtl_exit(struct request_queue *q) { return 0; } -#endif /* CONFIG_BLK_DEV_THROTTLING */ -  #define MODULE_ALIAS_BLOCKDEV(major,minor) \  	MODULE_ALIAS("block-major-" __stringify(major) "-" __stringify(minor))  #define MODULE_ALIAS_BLOCKDEV_MAJOR(major) \ diff --git a/include/linux/blktrace_api.h b/include/linux/blktrace_api.h index 8e9e4bc6d73..4d1a0748eaf 100644 --- a/include/linux/blktrace_api.h +++ b/include/linux/blktrace_api.h @@ -170,7 +170,7 @@ extern void blk_trace_shutdown(struct request_queue *);  extern int do_blk_trace_setup(struct request_queue *q, char *name,  			      dev_t dev, struct block_device *bdev,  			      struct blk_user_trace_setup *buts); -extern __attribute__((format(printf, 2, 3))) +extern __printf(2, 3)  void __trace_note_message(struct blk_trace *, const char *fmt, ...);  /** diff --git a/include/linux/bma150.h b/include/linux/bma150.h new file mode 100644 index 00000000000..7911fda23bb --- /dev/null +++ b/include/linux/bma150.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2011 Bosch Sensortec GmbH + * Copyright (c) 2011 Unixphere + * + * 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 _BMA150_H_ +#define _BMA150_H_ + +#define BMA150_DRIVER		"bma150" + +struct bma150_cfg { +	bool any_motion_int;		/* Set to enable any-motion interrupt */ +	bool hg_int;			/* Set to enable high-G interrupt */ +	bool lg_int;			/* Set to enable low-G interrupt */ +	unsigned char any_motion_dur;	/* Any-motion duration */ +	unsigned char any_motion_thres;	/* Any-motion threshold */ +	unsigned char hg_hyst;		/* High-G hysterisis */ +	unsigned char hg_dur;		/* High-G duration */ +	unsigned char hg_thres;		/* High-G threshold */ +	unsigned char lg_hyst;		/* Low-G hysterisis */ +	unsigned char lg_dur;		/* Low-G duration */ +	unsigned char lg_thres;		/* Low-G threshold */ +	unsigned char range;		/* BMA0150_RANGE_xxx (in G) */ +	unsigned char bandwidth;	/* BMA0150_BW_xxx (in Hz) */ +}; + +struct bma150_platform_data { +	struct bma150_cfg cfg; +	int (*irq_gpio_cfg)(void); +}; + +#endif /* _BMA150_H_ */ diff --git a/include/linux/caif/caif_socket.h b/include/linux/caif/caif_socket.h index d9cb19b7cff..3f3bac6af7b 100644 --- a/include/linux/caif/caif_socket.h +++ b/include/linux/caif/caif_socket.h @@ -9,12 +9,7 @@  #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. @@ -144,7 +139,7 @@ enum caif_debug_service {   * CAIF Channel. It defines the service to connect to on the modem.   */  struct sockaddr_caif { -	sa_family_t  family; +	__kernel_sa_family_t  family;  	union {  		struct {  			__u8  type;		/* type: enum caif_at_type */ diff --git a/include/linux/can.h b/include/linux/can.h index d18333302cb..9a19bcb3eea 100644 --- a/include/linux/can.h +++ b/include/linux/can.h @@ -8,8 +8,6 @@   * Copyright (c) 2002-2007 Volkswagen Group Electronic Research   * All rights reserved.   * - * Send feedback to <socketcan-users@lists.berlios.de> - *   */  #ifndef CAN_H @@ -78,7 +76,7 @@ struct can_frame {   * @can_addr:    protocol specific address information   */  struct sockaddr_can { -	sa_family_t can_family; +	__kernel_sa_family_t can_family;  	int         can_ifindex;  	union {  		/* transport protocol class address information (e.g. ISOTP) */ diff --git a/include/linux/can/Kbuild b/include/linux/can/Kbuild index 8cb05aae661..c62b7f1728f 100644 --- a/include/linux/can/Kbuild +++ b/include/linux/can/Kbuild @@ -1,4 +1,5 @@  header-y += raw.h  header-y += bcm.h +header-y += gw.h  header-y += error.h  header-y += netlink.h diff --git a/include/linux/can/bcm.h b/include/linux/can/bcm.h index 1432b278c52..3ebe387fea4 100644 --- a/include/linux/can/bcm.h +++ b/include/linux/can/bcm.h @@ -7,14 +7,13 @@   * Copyright (c) 2002-2007 Volkswagen Group Electronic Research   * All rights reserved.   * - * Send feedback to <socketcan-users@lists.berlios.de> - *   */  #ifndef CAN_BCM_H  #define CAN_BCM_H  #include <linux/types.h> +#include <linux/can.h>  /**   * struct bcm_msg_head - head of messages to/from the broadcast manager diff --git a/include/linux/can/core.h b/include/linux/can/core.h index 5ce6b5d62ec..0ccc1cd28b9 100644 --- a/include/linux/can/core.h +++ b/include/linux/can/core.h @@ -8,8 +8,6 @@   * Copyright (c) 2002-2007 Volkswagen Group Electronic Research   * All rights reserved.   * - * Send feedback to <socketcan-users@lists.berlios.de> - *   */  #ifndef CAN_CORE_H diff --git a/include/linux/can/dev.h b/include/linux/can/dev.h index cc0bb496166..a0969fcb72b 100644 --- a/include/linux/can/dev.h +++ b/include/linux/can/dev.h @@ -8,7 +8,6 @@   *   * Copyright (C) 2008 Wolfgang Grandegger <wg@grandegger.com>   * - * Send feedback to <socketcan-users@lists.berlios.de>   */  #ifndef CAN_DEV_H diff --git a/include/linux/can/error.h b/include/linux/can/error.h index 5958074302a..63e855ea6b8 100644 --- a/include/linux/can/error.h +++ b/include/linux/can/error.h @@ -7,8 +7,6 @@   * Copyright (c) 2002-2007 Volkswagen Group Electronic Research   * All rights reserved.   * - * Send feedback to <socketcan-users@lists.berlios.de> - *   */  #ifndef CAN_ERROR_H diff --git a/include/linux/can/gw.h b/include/linux/can/gw.h new file mode 100644 index 00000000000..8e1db18c3cb --- /dev/null +++ b/include/linux/can/gw.h @@ -0,0 +1,162 @@ +/* + * linux/can/gw.h + * + * Definitions for CAN frame Gateway/Router/Bridge + * + * Author: Oliver Hartkopp <oliver.hartkopp@volkswagen.de> + * Copyright (c) 2011 Volkswagen Group Electronic Research + * All rights reserved. + * + */ + +#ifndef CAN_GW_H +#define CAN_GW_H + +#include <linux/types.h> +#include <linux/can.h> + +struct rtcanmsg { +	__u8  can_family; +	__u8  gwtype; +	__u16 flags; +}; + +/* CAN gateway types */ +enum { +	CGW_TYPE_UNSPEC, +	CGW_TYPE_CAN_CAN,	/* CAN->CAN routing */ +	__CGW_TYPE_MAX +}; + +#define CGW_TYPE_MAX (__CGW_TYPE_MAX - 1) + +/* CAN rtnetlink attribute definitions */ +enum { +	CGW_UNSPEC, +	CGW_MOD_AND,	/* CAN frame modification binary AND */ +	CGW_MOD_OR,	/* CAN frame modification binary OR */ +	CGW_MOD_XOR,	/* CAN frame modification binary XOR */ +	CGW_MOD_SET,	/* CAN frame modification set alternate values */ +	CGW_CS_XOR,	/* set data[] XOR checksum into data[index] */ +	CGW_CS_CRC8,	/* set data[] CRC8 checksum into data[index] */ +	CGW_HANDLED,	/* number of handled CAN frames */ +	CGW_DROPPED,	/* number of dropped CAN frames */ +	CGW_SRC_IF,	/* ifindex of source network interface */ +	CGW_DST_IF,	/* ifindex of destination network interface */ +	CGW_FILTER,	/* specify struct can_filter on source CAN device */ +	__CGW_MAX +}; + +#define CGW_MAX (__CGW_MAX - 1) + +#define CGW_FLAGS_CAN_ECHO 0x01 +#define CGW_FLAGS_CAN_SRC_TSTAMP 0x02 + +#define CGW_MOD_FUNCS 4 /* AND OR XOR SET */ + +/* CAN frame elements that are affected by curr. 3 CAN frame modifications */ +#define CGW_MOD_ID	0x01 +#define CGW_MOD_DLC	0x02 +#define CGW_MOD_DATA	0x04 + +#define CGW_FRAME_MODS 3 /* ID DLC DATA */ + +#define MAX_MODFUNCTIONS (CGW_MOD_FUNCS * CGW_FRAME_MODS) + +struct cgw_frame_mod { +	struct can_frame cf; +	__u8 modtype; +} __attribute__((packed)); + +#define CGW_MODATTR_LEN sizeof(struct cgw_frame_mod) + +struct cgw_csum_xor { +	__s8 from_idx; +	__s8 to_idx; +	__s8 result_idx; +	__u8 init_xor_val; +} __attribute__((packed)); + +struct cgw_csum_crc8 { +	__s8 from_idx; +	__s8 to_idx; +	__s8 result_idx; +	__u8 init_crc_val; +	__u8 final_xor_val; +	__u8 crctab[256]; +	__u8 profile; +	__u8 profile_data[20]; +} __attribute__((packed)); + +/* length of checksum operation parameters. idx = index in CAN frame data[] */ +#define CGW_CS_XOR_LEN  sizeof(struct cgw_csum_xor) +#define CGW_CS_CRC8_LEN  sizeof(struct cgw_csum_crc8) + +/* CRC8 profiles (compute CRC for additional data elements - see below) */ +enum { +	CGW_CRC8PRF_UNSPEC, +	CGW_CRC8PRF_1U8,	/* compute one additional u8 value */ +	CGW_CRC8PRF_16U8,	/* u8 value table indexed by data[1] & 0xF */ +	CGW_CRC8PRF_SFFID_XOR,	/* (can_id & 0xFF) ^ (can_id >> 8 & 0xFF) */ +	__CGW_CRC8PRF_MAX +}; + +#define CGW_CRC8PRF_MAX (__CGW_CRC8PRF_MAX - 1) + +/* + * CAN rtnetlink attribute contents in detail + * + * CGW_XXX_IF (length 4 bytes): + * Sets an interface index for source/destination network interfaces. + * For the CAN->CAN gwtype the indices of _two_ CAN interfaces are mandatory. + * + * CGW_FILTER (length 8 bytes): + * Sets a CAN receive filter for the gateway job specified by the + * struct can_filter described in include/linux/can.h + * + * CGW_MOD_XXX (length 17 bytes): + * Specifies a modification that's done to a received CAN frame before it is + * send out to the destination interface. + * + * <struct can_frame> data used as operator + * <u8> affected CAN frame elements + * + * CGW_CS_XOR (length 4 bytes): + * Set a simple XOR checksum starting with an initial value into + * data[result-idx] using data[start-idx] .. data[end-idx] + * + * The XOR checksum is calculated like this: + * + * xor = init_xor_val + * + * for (i = from_idx .. to_idx) + *      xor ^= can_frame.data[i] + * + * can_frame.data[ result_idx ] = xor + * + * CGW_CS_CRC8 (length 282 bytes): + * Set a CRC8 value into data[result-idx] using a given 256 byte CRC8 table, + * a given initial value and a defined input data[start-idx] .. data[end-idx]. + * Finally the result value is XOR'ed with the final_xor_val. + * + * The CRC8 checksum is calculated like this: + * + * crc = init_crc_val + * + * for (i = from_idx .. to_idx) + *      crc = crctab[ crc ^ can_frame.data[i] ] + * + * can_frame.data[ result_idx ] = crc ^ final_xor_val + * + * The calculated CRC may contain additional source data elements that can be + * defined in the handling of 'checksum profiles' e.g. shown in AUTOSAR specs + * like http://www.autosar.org/download/R4.0/AUTOSAR_SWS_E2ELibrary.pdf + * E.g. the profile_data[] may contain additional u8 values (called DATA_IDs) + * that are used depending on counter values inside the CAN frame data[]. + * So far only three profiles have been implemented for illustration. + * + * Remark: In general the attribute data is a linear buffer. + *         Beware of sending unpacked or aligned structs! + */ + +#endif diff --git a/include/linux/can/netlink.h b/include/linux/can/netlink.h index 34542d374dd..14966ddb7df 100644 --- a/include/linux/can/netlink.h +++ b/include/linux/can/netlink.h @@ -5,8 +5,6 @@   *   * Copyright (c) 2009 Wolfgang Grandegger <wg@grandegger.com>   * - * Send feedback to <socketcan-users@lists.berlios.de> - *   */  #ifndef CAN_NETLINK_H diff --git a/include/linux/can/raw.h b/include/linux/can/raw.h index b2a0f87492c..781f3a3701b 100644 --- a/include/linux/can/raw.h +++ b/include/linux/can/raw.h @@ -8,8 +8,6 @@   * Copyright (c) 2002-2007 Volkswagen Group Electronic Research   * All rights reserved.   * - * Send feedback to <socketcan-users@lists.berlios.de> - *   */  #ifndef CAN_RAW_H diff --git a/include/linux/capability.h b/include/linux/capability.h index c4211235000..a63d13d84ad 100644 --- a/include/linux/capability.h +++ b/include/linux/capability.h @@ -198,7 +198,7 @@ struct cpu_vfs_cap_data {  /* Allow modification of routing tables */  /* Allow setting arbitrary process / process group ownership on     sockets */ -/* Allow binding to any address for transparent proxying */ +/* Allow binding to any address for transparent proxying (also via NET_RAW) */  /* Allow setting TOS (type of service) */  /* Allow setting promiscuous mode */  /* Allow clearing driver statistics */ @@ -210,6 +210,7 @@ struct cpu_vfs_cap_data {  /* Allow use of RAW sockets */  /* Allow use of PACKET sockets */ +/* Allow binding to any address for transparent proxying (also via NET_ADMIN) */  #define CAP_NET_RAW          13 diff --git a/include/linux/ceph/libceph.h b/include/linux/ceph/libceph.h index 563755181c1..95bd8502e71 100644 --- a/include/linux/ceph/libceph.h +++ b/include/linux/ceph/libceph.h @@ -215,7 +215,9 @@ extern void ceph_destroy_options(struct ceph_options *opt);  extern int ceph_compare_options(struct ceph_options *new_opt,  				struct ceph_client *client);  extern struct ceph_client *ceph_create_client(struct ceph_options *opt, -					      void *private); +					      void *private, +					      unsigned supported_features, +					      unsigned required_features);  extern u64 ceph_client_id(struct ceph_client *client);  extern void ceph_destroy_client(struct ceph_client *client);  extern int __ceph_open_session(struct ceph_client *client, diff --git a/include/linux/ceph/messenger.h b/include/linux/ceph/messenger.h index d7adf151d33..ffbeb2c217b 100644 --- a/include/linux/ceph/messenger.h +++ b/include/linux/ceph/messenger.h @@ -6,7 +6,6 @@  #include <linux/net.h>  #include <linux/radix-tree.h>  #include <linux/uio.h> -#include <linux/version.h>  #include <linux/workqueue.h>  #include "types.h" @@ -238,7 +237,8 @@ extern void ceph_con_keepalive(struct ceph_connection *con);  extern struct ceph_connection *ceph_con_get(struct ceph_connection *con);  extern void ceph_con_put(struct ceph_connection *con); -extern struct ceph_msg *ceph_msg_new(int type, int front_len, gfp_t flags); +extern struct ceph_msg *ceph_msg_new(int type, int front_len, gfp_t flags, +				     bool can_fail);  extern void ceph_msg_kfree(struct ceph_msg *m); diff --git a/include/linux/cgroup.h b/include/linux/cgroup.h index da7e4bc34e8..1b7f9d52501 100644 --- a/include/linux/cgroup.h +++ b/include/linux/cgroup.h @@ -516,7 +516,7 @@ struct cgroup_subsys {  	struct list_head sibling;  	/* used when use_id == true */  	struct idr idr; -	spinlock_t id_lock; +	rwlock_t id_lock;  	/* should be defined only by modular subsystems */  	struct module *module; diff --git a/include/linux/clk.h b/include/linux/clk.h index 1d37f42ac29..7213b52b2c0 100644 --- a/include/linux/clk.h +++ b/include/linux/clk.h @@ -11,6 +11,8 @@  #ifndef __LINUX_CLK_H  #define __LINUX_CLK_H +#include <linux/kernel.h> +  struct device;  /* @@ -41,11 +43,31 @@ struct clk;  struct clk *clk_get(struct device *dev, const char *id);  /** + * clk_prepare - prepare a clock source + * @clk: clock source + * + * This prepares the clock source for use. + * + * Must not be called from within atomic context. + */ +#ifdef CONFIG_HAVE_CLK_PREPARE +int clk_prepare(struct clk *clk); +#else +static inline int clk_prepare(struct clk *clk) +{ +	might_sleep(); +	return 0; +} +#endif + +/**   * clk_enable - inform the system when the clock source should be running.   * @clk: clock source   *   * If the clock can not be enabled/disabled, this should return success.   * + * May be called from atomic contexts. + *   * Returns success (0) or negative errno.   */  int clk_enable(struct clk *clk); @@ -57,6 +79,8 @@ int clk_enable(struct clk *clk);   * Inform the system that a clock source is no longer required by   * a driver and may be shut down.   * + * May be called from atomic contexts. + *   * Implementation detail: if the clock source is shared between   * multiple drivers, clk_enable() calls must be balanced by the   * same number of clk_disable() calls for the clock source to be @@ -64,6 +88,25 @@ int clk_enable(struct clk *clk);   */  void clk_disable(struct clk *clk); + +/** + * clk_unprepare - undo preparation of a clock source + * @clk: clock source + * + * This undoes a previously prepared clock.  The caller must balance + * the number of prepare and unprepare calls. + * + * Must not be called from within atomic context. + */ +#ifdef CONFIG_HAVE_CLK_PREPARE +void clk_unprepare(struct clk *clk); +#else +static inline void clk_unprepare(struct clk *clk) +{ +	might_sleep(); +} +#endif +  /**   * clk_get_rate - obtain the current clock rate (in Hz) for a clock source.   *		  This is only valid once the clock source has been enabled. diff --git a/include/linux/clkdev.h b/include/linux/clkdev.h index 457bcb0a310..d9a4fd028c9 100644 --- a/include/linux/clkdev.h +++ b/include/linux/clkdev.h @@ -24,6 +24,13 @@ struct clk_lookup {  	struct clk		*clk;  }; +#define CLKDEV_INIT(d, n, c)	\ +	{			\ +		.dev_id = d,	\ +		.con_id = n,	\ +		.clk = c,	\ +	} +  struct clk_lookup *clkdev_alloc(struct clk *clk, const char *con_id,  	const char *dev_fmt, ...); diff --git a/include/linux/clksrc-dbx500-prcmu.h b/include/linux/clksrc-dbx500-prcmu.h new file mode 100644 index 00000000000..4fb8119c49e --- /dev/null +++ b/include/linux/clksrc-dbx500-prcmu.h @@ -0,0 +1,20 @@ +/* + * Copyright (C) ST-Ericsson SA 2011 + * + * License Terms: GNU General Public License v2 + * Author: Mattias Wallin <mattias.wallin@stericsson.com> + * + */ +#ifndef __CLKSRC_DBX500_PRCMU_H +#define __CLKSRC_DBX500_PRCMU_H + +#include <linux/init.h> +#include <linux/io.h> + +#ifdef CONFIG_CLKSRC_DBX500_PRCMU +void __init clksrc_dbx500_prcmu_init(void __iomem *base); +#else +static inline void __init clksrc_dbx500_prcmu_init(void __iomem *base) {} +#endif + +#endif diff --git a/include/linux/clockchips.h b/include/linux/clockchips.h index d6733e27af3..81e803e90aa 100644 --- a/include/linux/clockchips.h +++ b/include/linux/clockchips.h @@ -45,20 +45,22 @@ enum clock_event_nofitiers {   */  #define CLOCK_EVT_FEAT_PERIODIC		0x000001  #define CLOCK_EVT_FEAT_ONESHOT		0x000002 +#define CLOCK_EVT_FEAT_KTIME		0x000004  /*   * x86(64) specific misfeatures:   *   * - Clockevent source stops in C3 State and needs broadcast support.   * - Local APIC timer is used as a dummy device.   */ -#define CLOCK_EVT_FEAT_C3STOP		0x000004 -#define CLOCK_EVT_FEAT_DUMMY		0x000008 +#define CLOCK_EVT_FEAT_C3STOP		0x000008 +#define CLOCK_EVT_FEAT_DUMMY		0x000010  /**   * struct clock_event_device - clock event device descriptor   * @event_handler:	Assigned by the framework to be called by the low   *			level handler of the event source - * @set_next_event:	set next event function + * @set_next_event:	set next event function using a clocksource delta + * @set_next_ktime:	set next event function using a direct ktime value   * @next_event:		local storage for the next event in oneshot mode   * @max_delta_ns:	maximum delta value in ns   * @min_delta_ns:	minimum delta value in ns @@ -81,6 +83,8 @@ struct clock_event_device {  	void			(*event_handler)(struct clock_event_device *);  	int			(*set_next_event)(unsigned long evt,  						  struct clock_event_device *); +	int			(*set_next_ktime)(ktime_t expires, +						  struct clock_event_device *);  	ktime_t			next_event;  	u64			max_delta_ns;  	u64			min_delta_ns; @@ -140,7 +144,7 @@ extern void clockevents_set_mode(struct clock_event_device *dev,  				 enum clock_event_mode mode);  extern int clockevents_register_notifier(struct notifier_block *nb);  extern int clockevents_program_event(struct clock_event_device *dev, -				     ktime_t expires, ktime_t now); +				     ktime_t expires, bool force);  extern void clockevents_handle_noop(struct clock_event_device *dev); diff --git a/include/linux/cn_proc.h b/include/linux/cn_proc.h index 12c517b51ca..d03612b196e 100644 --- a/include/linux/cn_proc.h +++ b/include/linux/cn_proc.h @@ -54,6 +54,7 @@ struct proc_event {  		PROC_EVENT_GID  = 0x00000040,  		PROC_EVENT_SID  = 0x00000080,  		PROC_EVENT_PTRACE = 0x00000100, +		PROC_EVENT_COMM = 0x00000200,  		/* "next" should be 0x00000400 */  		/* "last" is the last process event: exit */  		PROC_EVENT_EXIT = 0x80000000 @@ -103,6 +104,12 @@ struct proc_event {  			__kernel_pid_t tracer_tgid;  		} ptrace; +		struct comm_proc_event { +			__kernel_pid_t process_pid; +			__kernel_pid_t process_tgid; +			char           comm[16]; +		} comm; +  		struct exit_proc_event {  			__kernel_pid_t process_pid;  			__kernel_pid_t process_tgid; @@ -118,6 +125,7 @@ void proc_exec_connector(struct task_struct *task);  void proc_id_connector(struct task_struct *task, int which_id);  void proc_sid_connector(struct task_struct *task);  void proc_ptrace_connector(struct task_struct *task, int which_id); +void proc_comm_connector(struct task_struct *task);  void proc_exit_connector(struct task_struct *task);  #else  static inline void proc_fork_connector(struct task_struct *task) @@ -133,6 +141,9 @@ static inline void proc_id_connector(struct task_struct *task,  static inline void proc_sid_connector(struct task_struct *task)  {} +static inline void proc_comm_connector(struct task_struct *task) +{} +  static inline void proc_ptrace_connector(struct task_struct *task,  					 int ptrace_id)  {} diff --git a/include/linux/compaction.h b/include/linux/compaction.h index cc9f7a42864..bb2bbdbe546 100644 --- a/include/linux/compaction.h +++ b/include/linux/compaction.h @@ -24,8 +24,6 @@ extern unsigned long try_to_compact_pages(struct zonelist *zonelist,  			int order, gfp_t gfp_mask, nodemask_t *mask,  			bool sync);  extern unsigned long compaction_suitable(struct zone *zone, int order); -extern unsigned long compact_zone_order(struct zone *zone, int order, -					gfp_t gfp_mask, bool sync);  /* Do not skip compaction more than 64 times */  #define COMPACT_MAX_DEFER_SHIFT 6 @@ -69,12 +67,6 @@ static inline unsigned long compaction_suitable(struct zone *zone, int order)  	return COMPACT_SKIPPED;  } -static inline unsigned long compact_zone_order(struct zone *zone, int order, -					       gfp_t gfp_mask, bool sync) -{ -	return COMPACT_CONTINUE; -} -  static inline void defer_compaction(struct zone *zone)  {  } diff --git a/include/linux/compat.h b/include/linux/compat.h index c6e7523bf76..154bf568301 100644 --- a/include/linux/compat.h +++ b/include/linux/compat.h @@ -547,7 +547,8 @@ 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); +		struct iovec **ret_pointer, +		int check_access);  extern void __user *compat_alloc_user_space(unsigned long len); diff --git a/include/linux/cpu.h b/include/linux/cpu.h index b1a635acf72..6cb60fd2ea8 100644 --- a/include/linux/cpu.h +++ b/include/linux/cpu.h @@ -196,13 +196,9 @@ static inline void cpu_hotplug_driver_unlock(void)  #endif		/* CONFIG_HOTPLUG_CPU */  #ifdef CONFIG_PM_SLEEP_SMP -extern int suspend_cpu_hotplug; -  extern int disable_nonboot_cpus(void);  extern void enable_nonboot_cpus(void);  #else /* !CONFIG_PM_SLEEP_SMP */ -#define suspend_cpu_hotplug	0 -  static inline int disable_nonboot_cpus(void) { return 0; }  static inline void enable_nonboot_cpus(void) {}  #endif /* !CONFIG_PM_SLEEP_SMP */ diff --git a/include/linux/cpu_pm.h b/include/linux/cpu_pm.h new file mode 100644 index 00000000000..455b233dd3b --- /dev/null +++ b/include/linux/cpu_pm.h @@ -0,0 +1,109 @@ +/* + * Copyright (C) 2011 Google, Inc. + * + * Author: + *	Colin Cross <ccross@android.com> + * + * 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 _LINUX_CPU_PM_H +#define _LINUX_CPU_PM_H + +#include <linux/kernel.h> +#include <linux/notifier.h> + +/* + * When a CPU goes to a low power state that turns off power to the CPU's + * power domain, the contents of some blocks (floating point coprocessors, + * interrupt controllers, caches, timers) in the same power domain can + * be lost.  The cpm_pm notifiers provide a method for platform idle, suspend, + * and hotplug implementations to notify the drivers for these blocks that + * they may be reset. + * + * All cpu_pm notifications must be called with interrupts disabled. + * + * The notifications are split into two classes: CPU notifications and CPU + * cluster notifications. + * + * CPU notifications apply to a single CPU and must be called on the affected + * CPU.  They are used to save per-cpu context for affected blocks. + * + * CPU cluster notifications apply to all CPUs in a single power domain. They + * are used to save any global context for affected blocks, and must be called + * after all the CPUs in the power domain have been notified of the low power + * state. + */ + +/* + * Event codes passed as unsigned long val to notifier calls + */ +enum cpu_pm_event { +	/* A single cpu is entering a low power state */ +	CPU_PM_ENTER, + +	/* A single cpu failed to enter a low power state */ +	CPU_PM_ENTER_FAILED, + +	/* A single cpu is exiting a low power state */ +	CPU_PM_EXIT, + +	/* A cpu power domain is entering a low power state */ +	CPU_CLUSTER_PM_ENTER, + +	/* A cpu power domain failed to enter a low power state */ +	CPU_CLUSTER_PM_ENTER_FAILED, + +	/* A cpu power domain is exiting a low power state */ +	CPU_CLUSTER_PM_EXIT, +}; + +#ifdef CONFIG_CPU_PM +int cpu_pm_register_notifier(struct notifier_block *nb); +int cpu_pm_unregister_notifier(struct notifier_block *nb); +int cpu_pm_enter(void); +int cpu_pm_exit(void); +int cpu_cluster_pm_enter(void); +int cpu_cluster_pm_exit(void); + +#else + +static inline int cpu_pm_register_notifier(struct notifier_block *nb) +{ +	return 0; +} + +static inline int cpu_pm_unregister_notifier(struct notifier_block *nb) +{ +	return 0; +} + +static inline int cpu_pm_enter(void) +{ +	return 0; +} + +static inline int cpu_pm_exit(void) +{ +	return 0; +} + +static inline int cpu_cluster_pm_enter(void) +{ +	return 0; +} + +static inline int cpu_cluster_pm_exit(void) +{ +	return 0; +} +#endif +#endif diff --git a/include/linux/crash_dump.h b/include/linux/crash_dump.h index 74054074e87..5c4abce94ad 100644 --- a/include/linux/crash_dump.h +++ b/include/linux/crash_dump.h @@ -10,6 +10,7 @@  #define ELFCORE_ADDR_ERR	(-2ULL)  extern unsigned long long elfcorehdr_addr; +extern unsigned long long elfcorehdr_size;  extern ssize_t copy_oldmem_page(unsigned long, char *, size_t,  						unsigned long, int); diff --git a/include/linux/crypto.h b/include/linux/crypto.h index e5e468e9133..de9adec5693 100644 --- a/include/linux/crypto.h +++ b/include/linux/crypto.h @@ -72,6 +72,11 @@  #define CRYPTO_ALG_TESTED		0x00000400  /* + * Set if the algorithm is an instance that is build from templates. + */ +#define CRYPTO_ALG_INSTANCE		0x00000800 + +/*   * Transform masks and values (for crt_flags).   */  #define CRYPTO_TFM_REQ_MASK		0x000fff00 diff --git a/include/linux/cryptouser.h b/include/linux/cryptouser.h new file mode 100644 index 00000000000..532fb58f16b --- /dev/null +++ b/include/linux/cryptouser.h @@ -0,0 +1,102 @@ +/* + * Crypto user configuration API. + * + * Copyright (C) 2011 secunet Security Networks AG + * Copyright (C) 2011 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. + */ + +/* Netlink configuration messages.  */ +enum { +	CRYPTO_MSG_BASE = 0x10, +	CRYPTO_MSG_NEWALG = 0x10, +	CRYPTO_MSG_DELALG, +	CRYPTO_MSG_UPDATEALG, +	CRYPTO_MSG_GETALG, +	__CRYPTO_MSG_MAX +}; +#define CRYPTO_MSG_MAX (__CRYPTO_MSG_MAX - 1) +#define CRYPTO_NR_MSGTYPES (CRYPTO_MSG_MAX + 1 - CRYPTO_MSG_BASE) + +#define CRYPTO_MAX_NAME CRYPTO_MAX_ALG_NAME + +/* Netlink message attributes.  */ +enum crypto_attr_type_t { +	CRYPTOCFGA_UNSPEC, +	CRYPTOCFGA_PRIORITY_VAL,	/* __u32 */ +	CRYPTOCFGA_REPORT_LARVAL,	/* struct crypto_report_larval */ +	CRYPTOCFGA_REPORT_HASH,		/* struct crypto_report_hash */ +	CRYPTOCFGA_REPORT_BLKCIPHER,	/* struct crypto_report_blkcipher */ +	CRYPTOCFGA_REPORT_AEAD,		/* struct crypto_report_aead */ +	CRYPTOCFGA_REPORT_COMPRESS,	/* struct crypto_report_comp */ +	CRYPTOCFGA_REPORT_RNG,		/* struct crypto_report_rng */ +	CRYPTOCFGA_REPORT_CIPHER,	/* struct crypto_report_cipher */ +	__CRYPTOCFGA_MAX + +#define CRYPTOCFGA_MAX (__CRYPTOCFGA_MAX - 1) +}; + +struct crypto_user_alg { +	char cru_name[CRYPTO_MAX_ALG_NAME]; +	char cru_driver_name[CRYPTO_MAX_ALG_NAME]; +	char cru_module_name[CRYPTO_MAX_ALG_NAME]; +	__u32 cru_type; +	__u32 cru_mask; +	__u32 cru_refcnt; +	__u32 cru_flags; +}; + +struct crypto_report_larval { +	char type[CRYPTO_MAX_NAME]; +}; + +struct crypto_report_hash { +	char type[CRYPTO_MAX_NAME]; +	unsigned int blocksize; +	unsigned int digestsize; +}; + +struct crypto_report_cipher { +	char type[CRYPTO_MAX_ALG_NAME]; +	unsigned int blocksize; +	unsigned int min_keysize; +	unsigned int max_keysize; +}; + +struct crypto_report_blkcipher { +	char type[CRYPTO_MAX_NAME]; +	char geniv[CRYPTO_MAX_NAME]; +	unsigned int blocksize; +	unsigned int min_keysize; +	unsigned int max_keysize; +	unsigned int ivsize; +}; + +struct crypto_report_aead { +	char type[CRYPTO_MAX_NAME]; +	char geniv[CRYPTO_MAX_NAME]; +	unsigned int blocksize; +	unsigned int maxauthsize; +	unsigned int ivsize; +}; + +struct crypto_report_comp { +	char type[CRYPTO_MAX_NAME]; +}; + +struct crypto_report_rng { +	char type[CRYPTO_MAX_NAME]; +	unsigned int seedsize; +}; diff --git a/include/linux/dcache.h b/include/linux/dcache.h index 62157c03caf..4df92619936 100644 --- a/include/linux/dcache.h +++ b/include/linux/dcache.h @@ -165,6 +165,7 @@ struct dentry_operations {  			unsigned int, const char *, const struct qstr *);  	int (*d_delete)(const struct dentry *);  	void (*d_release)(struct dentry *); +	void (*d_prune)(struct dentry *);  	void (*d_iput)(struct dentry *, struct inode *);  	char *(*d_dname)(struct dentry *, char *, int);  	struct vfsmount *(*d_automount)(struct path *); @@ -184,8 +185,9 @@ struct dentry_operations {  #define DCACHE_OP_COMPARE	0x0002  #define DCACHE_OP_REVALIDATE	0x0004  #define DCACHE_OP_DELETE	0x0008 +#define DCACHE_OP_PRUNE         0x0010 -#define	DCACHE_DISCONNECTED	0x0010 +#define	DCACHE_DISCONNECTED	0x0020       /* This dentry is possibly not currently connected to the dcache tree, in        * which case its parent will either be itself, or will have this flag as        * well.  nfsd will not use a dentry with this bit set, but will first @@ -196,8 +198,8 @@ struct dentry_operations {        * dentry into place and return that dentry rather than the passed one,        * typically using d_splice_alias. */ -#define DCACHE_REFERENCED	0x0020  /* Recently used, don't discard. */ -#define DCACHE_RCUACCESS	0x0040	/* Entry has ever been RCU-visible */ +#define DCACHE_REFERENCED	0x0040  /* Recently used, don't discard. */ +#define DCACHE_RCUACCESS	0x0080	/* Entry has ever been RCU-visible */  #define DCACHE_CANT_MOUNT	0x0100  #define DCACHE_GENOCIDE		0x0200 diff --git a/include/linux/devfreq.h b/include/linux/devfreq.h new file mode 100644 index 00000000000..afb94583960 --- /dev/null +++ b/include/linux/devfreq.h @@ -0,0 +1,238 @@ +/* + * devfreq: Generic Dynamic Voltage and Frequency Scaling (DVFS) Framework + *	    for Non-CPU Devices. + * + * Copyright (C) 2011 Samsung Electronics + *	MyungJoo Ham <myungjoo.ham@samsung.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef __LINUX_DEVFREQ_H__ +#define __LINUX_DEVFREQ_H__ + +#include <linux/device.h> +#include <linux/notifier.h> +#include <linux/opp.h> + +#define DEVFREQ_NAME_LEN 16 + +struct devfreq; + +/** + * struct devfreq_dev_status - Data given from devfreq user device to + *			     governors. Represents the performance + *			     statistics. + * @total_time		The total time represented by this instance of + *			devfreq_dev_status + * @busy_time		The time that the device was working among the + *			total_time. + * @current_frequency	The operating frequency. + * @private_data	An entry not specified by the devfreq framework. + *			A device and a specific governor may have their + *			own protocol with private_data. However, because + *			this is governor-specific, a governor using this + *			will be only compatible with devices aware of it. + */ +struct devfreq_dev_status { +	/* both since the last measure */ +	unsigned long total_time; +	unsigned long busy_time; +	unsigned long current_frequency; +	void *private_date; +}; + +/** + * struct devfreq_dev_profile - Devfreq's user device profile + * @initial_freq	The operating frequency when devfreq_add_device() is + *			called. + * @polling_ms		The polling interval in ms. 0 disables polling. + * @target		The device should set its operating frequency at + *			freq or lowest-upper-than-freq value. If freq is + *			higher than any operable frequency, set maximum. + *			Before returning, target function should set + *			freq at the current frequency. + * @get_dev_status	The device should provide the current performance + *			status to devfreq, which is used by governors. + * @exit		An optional callback that is called when devfreq + *			is removing the devfreq object due to error or + *			from devfreq_remove_device() call. If the user + *			has registered devfreq->nb at a notifier-head, + *			this is the time to unregister it. + */ +struct devfreq_dev_profile { +	unsigned long initial_freq; +	unsigned int polling_ms; + +	int (*target)(struct device *dev, unsigned long *freq); +	int (*get_dev_status)(struct device *dev, +			      struct devfreq_dev_status *stat); +	void (*exit)(struct device *dev); +}; + +/** + * struct devfreq_governor - Devfreq policy governor + * @name		Governor's name + * @get_target_freq	Returns desired operating frequency for the device. + *			Basically, get_target_freq will run + *			devfreq_dev_profile.get_dev_status() to get the + *			status of the device (load = busy_time / total_time). + *			If no_central_polling is set, this callback is called + *			only with update_devfreq() notified by OPP. + * @init		Called when the devfreq is being attached to a device + * @exit		Called when the devfreq is being removed from a + *			device. Governor should stop any internal routines + *			before return because related data may be + *			freed after exit(). + * @no_central_polling	Do not use devfreq's central polling mechanism. + *			When this is set, devfreq will not call + *			get_target_freq with devfreq_monitor(). However, + *			devfreq will call get_target_freq with + *			devfreq_update() notified by OPP framework. + * + * Note that the callbacks are called with devfreq->lock locked by devfreq. + */ +struct devfreq_governor { +	const char name[DEVFREQ_NAME_LEN]; +	int (*get_target_freq)(struct devfreq *this, unsigned long *freq); +	int (*init)(struct devfreq *this); +	void (*exit)(struct devfreq *this); +	const bool no_central_polling; +}; + +/** + * struct devfreq - Device devfreq structure + * @node	list node - contains the devices with devfreq that have been + *		registered. + * @lock	a mutex to protect accessing devfreq. + * @dev		device registered by devfreq class. dev.parent is the device + *		using devfreq. + * @profile	device-specific devfreq profile + * @governor	method how to choose frequency based on the usage. + * @nb		notifier block used to notify devfreq object that it should + *		reevaluate operable frequencies. Devfreq users may use + *		devfreq.nb to the corresponding register notifier call chain. + * @polling_jiffies	interval in jiffies. + * @previous_freq	previously configured frequency value. + * @next_polling	the number of remaining jiffies to poll with + *			"devfreq_monitor" executions to reevaluate + *			frequency/voltage of the device. Set by + *			profile's polling_ms interval. + * @data	Private data of the governor. The devfreq framework does not + *		touch this. + * @being_removed	a flag to mark that this object is being removed in + *			order to prevent trying to remove the object multiple times. + * + * This structure stores the devfreq information for a give device. + * + * Note that when a governor accesses entries in struct devfreq in its + * functions except for the context of callbacks defined in struct + * devfreq_governor, the governor should protect its access with the + * struct mutex lock in struct devfreq. A governor may use this mutex + * to protect its own private data in void *data as well. + */ +struct devfreq { +	struct list_head node; + +	struct mutex lock; +	struct device dev; +	struct devfreq_dev_profile *profile; +	const struct devfreq_governor *governor; +	struct notifier_block nb; + +	unsigned long polling_jiffies; +	unsigned long previous_freq; +	unsigned int next_polling; + +	void *data; /* private data for governors */ + +	bool being_removed; +}; + +#if defined(CONFIG_PM_DEVFREQ) +extern struct devfreq *devfreq_add_device(struct device *dev, +				  struct devfreq_dev_profile *profile, +				  const struct devfreq_governor *governor, +				  void *data); +extern int devfreq_remove_device(struct devfreq *devfreq); + +/* Helper functions for devfreq user device driver with OPP. */ +extern struct opp *devfreq_recommended_opp(struct device *dev, +					   unsigned long *freq); +extern int devfreq_register_opp_notifier(struct device *dev, +					 struct devfreq *devfreq); +extern int devfreq_unregister_opp_notifier(struct device *dev, +					   struct devfreq *devfreq); + +#ifdef CONFIG_DEVFREQ_GOV_POWERSAVE +extern const struct devfreq_governor devfreq_powersave; +#endif +#ifdef CONFIG_DEVFREQ_GOV_PERFORMANCE +extern const struct devfreq_governor devfreq_performance; +#endif +#ifdef CONFIG_DEVFREQ_GOV_USERSPACE +extern const struct devfreq_governor devfreq_userspace; +#endif +#ifdef CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND +extern const struct devfreq_governor devfreq_simple_ondemand; +/** + * struct devfreq_simple_ondemand_data - void *data fed to struct devfreq + *	and devfreq_add_device + * @ upthreshold	If the load is over this value, the frequency jumps. + *			Specify 0 to use the default. Valid value = 0 to 100. + * @ downdifferential	If the load is under upthreshold - downdifferential, + *			the governor may consider slowing the frequency down. + *			Specify 0 to use the default. Valid value = 0 to 100. + *			downdifferential < upthreshold must hold. + * + * If the fed devfreq_simple_ondemand_data pointer is NULL to the governor, + * the governor uses the default values. + */ +struct devfreq_simple_ondemand_data { +	unsigned int upthreshold; +	unsigned int downdifferential; +}; +#endif + +#else /* !CONFIG_PM_DEVFREQ */ +static struct devfreq *devfreq_add_device(struct device *dev, +					  struct devfreq_dev_profile *profile, +					  struct devfreq_governor *governor, +					  void *data); +{ +	return NULL; +} + +static int devfreq_remove_device(struct devfreq *devfreq); +{ +	return 0; +} + +static struct opp *devfreq_recommended_opp(struct device *dev, +					   unsigned long *freq) +{ +	return -EINVAL; +} + +static int devfreq_register_opp_notifier(struct device *dev, +					 struct devfreq *devfreq) +{ +	return -EINVAL; +} + +static int devfreq_unregister_opp_notifier(struct device *dev, +					   struct devfreq *devfreq) +{ +	return -EINVAL; +} + +#define devfreq_powersave	NULL +#define devfreq_performance	NULL +#define devfreq_userspace	NULL +#define devfreq_simple_ondemand	NULL + +#endif /* CONFIG_PM_DEVFREQ */ + +#endif /* __LINUX_DEVFREQ_H__ */ diff --git a/include/linux/device-mapper.h b/include/linux/device-mapper.h index 3fa1f3d90ce..98f34b886f9 100644 --- a/include/linux/device-mapper.h +++ b/include/linux/device-mapper.h @@ -10,6 +10,7 @@  #include <linux/bio.h>  #include <linux/blkdev.h> +#include <linux/ratelimit.h>  struct dm_dev;  struct dm_target; @@ -127,10 +128,6 @@ void dm_put_device(struct dm_target *ti, struct dm_dev *d);   * Information about a target type   */ -/* - * Target features - */ -  struct target_type {  	uint64_t features;  	const char *name; @@ -159,6 +156,30 @@ struct target_type {  	struct list_head list;  }; +/* + * Target features + */ + +/* + * Any table that contains an instance of this target must have only one. + */ +#define DM_TARGET_SINGLETON		0x00000001 +#define dm_target_needs_singleton(type)	((type)->features & DM_TARGET_SINGLETON) + +/* + * Indicates that a target does not support read-only devices. + */ +#define DM_TARGET_ALWAYS_WRITEABLE	0x00000002 +#define dm_target_always_writeable(type) \ +		((type)->features & DM_TARGET_ALWAYS_WRITEABLE) + +/* + * Any device that contains a table with an instance of this target may never + * have tables containing any different target type. + */ +#define DM_TARGET_IMMUTABLE		0x00000004 +#define dm_target_is_immutable(type)	((type)->features & DM_TARGET_IMMUTABLE) +  struct dm_target {  	struct dm_table *table;  	struct target_type *type; @@ -197,6 +218,11 @@ struct dm_target {  	 * whether or not its underlying devices have support.  	 */  	unsigned discards_supported:1; + +	/* +	 * Set if this target does not return zeroes on discarded blocks. +	 */ +	unsigned discard_zeroes_data_unsupported:1;  };  /* Each target can link one of these into the table */ @@ -370,6 +396,14 @@ void *dm_vcalloc(unsigned long nmemb, unsigned long elem_size);   *---------------------------------------------------------------*/  #define DM_NAME "device-mapper" +#ifdef CONFIG_PRINTK +extern struct ratelimit_state dm_ratelimit_state; + +#define dm_ratelimit()	__ratelimit(&dm_ratelimit_state) +#else +#define dm_ratelimit()	0 +#endif +  #define DMCRIT(f, arg...) \  	printk(KERN_CRIT DM_NAME ": " DM_MSG_PREFIX ": " f "\n", ## arg) @@ -377,7 +411,7 @@ void *dm_vcalloc(unsigned long nmemb, unsigned long elem_size);  	printk(KERN_ERR DM_NAME ": " DM_MSG_PREFIX ": " f "\n", ## arg)  #define DMERR_LIMIT(f, arg...) \  	do { \ -		if (printk_ratelimit())	\ +		if (dm_ratelimit())	\  			printk(KERN_ERR DM_NAME ": " DM_MSG_PREFIX ": " \  			       f "\n", ## arg); \  	} while (0) @@ -386,7 +420,7 @@ void *dm_vcalloc(unsigned long nmemb, unsigned long elem_size);  	printk(KERN_WARNING DM_NAME ": " DM_MSG_PREFIX ": " f "\n", ## arg)  #define DMWARN_LIMIT(f, arg...) \  	do { \ -		if (printk_ratelimit())	\ +		if (dm_ratelimit())	\  			printk(KERN_WARNING DM_NAME ": " DM_MSG_PREFIX ": " \  			       f "\n", ## arg); \  	} while (0) @@ -395,7 +429,7 @@ void *dm_vcalloc(unsigned long nmemb, unsigned long elem_size);  	printk(KERN_INFO DM_NAME ": " DM_MSG_PREFIX ": " f "\n", ## arg)  #define DMINFO_LIMIT(f, arg...) \  	do { \ -		if (printk_ratelimit())	\ +		if (dm_ratelimit())	\  			printk(KERN_INFO DM_NAME ": " DM_MSG_PREFIX ": " f \  			       "\n", ## arg); \  	} while (0) @@ -405,7 +439,7 @@ void *dm_vcalloc(unsigned long nmemb, unsigned long elem_size);  	printk(KERN_DEBUG DM_NAME ": " DM_MSG_PREFIX " DEBUG: " f "\n", ## arg)  #  define DMDEBUG_LIMIT(f, arg...) \  	do { \ -		if (printk_ratelimit())	\ +		if (dm_ratelimit())	\  			printk(KERN_DEBUG DM_NAME ": " DM_MSG_PREFIX ": " f \  			       "\n", ## arg); \  	} while (0) diff --git a/include/linux/device.h b/include/linux/device.h index c20dfbfc49b..e88abeecfad 100644 --- a/include/linux/device.h +++ b/include/linux/device.h @@ -33,6 +33,7 @@ struct class;  struct subsys_private;  struct bus_type;  struct device_node; +struct iommu_ops;  struct bus_attribute {  	struct attribute	attr; @@ -67,6 +68,9 @@ extern void bus_remove_file(struct bus_type *, struct bus_attribute *);   * @resume:	Called to bring a device on this bus out of sleep mode.   * @pm:		Power management operations of this bus, callback the specific   *		device driver's pm-ops. + * @iommu_ops   IOMMU specific operations for this bus, used to attach IOMMU + *              driver implementations to a bus and allow the driver to do + *              bus-specific setup   * @p:		The private data of the driver core, only the driver core can   *		touch this.   * @@ -96,6 +100,8 @@ struct bus_type {  	const struct dev_pm_ops *pm; +	struct iommu_ops *iommu_ops; +  	struct subsys_private *p;  }; @@ -350,6 +356,8 @@ struct class_attribute {  			char *buf);  	ssize_t (*store)(struct class *class, struct class_attribute *attr,  			const char *buf, size_t count); +	const void *(*namespace)(struct class *class, +				 const struct class_attribute *attr);  };  #define CLASS_ATTR(_name, _mode, _show, _store)			\ @@ -614,8 +622,8 @@ static inline const char *dev_name(const struct device *dev)  	return kobject_name(&dev->kobj);  } -extern int dev_set_name(struct device *dev, const char *name, ...) -			__attribute__((format(printf, 2, 3))); +extern __printf(2, 3) +int dev_set_name(struct device *dev, const char *name, ...);  #ifdef CONFIG_NUMA  static inline int dev_to_node(struct device *dev) @@ -636,6 +644,11 @@ static inline void set_dev_node(struct device *dev, int node)  }  #endif +static inline struct pm_subsys_data *dev_to_psd(struct device *dev) +{ +	return dev ? dev->power.subsys_data : NULL; +} +  static inline unsigned int dev_get_uevent_suppress(const struct device *dev)  {  	return dev->kobj.uevent_suppress; @@ -740,10 +753,10 @@ extern struct device *device_create_vargs(struct class *cls,  					  void *drvdata,  					  const char *fmt,  					  va_list vargs); -extern struct device *device_create(struct class *cls, struct device *parent, -				    dev_t devt, void *drvdata, -				    const char *fmt, ...) -				    __attribute__((format(printf, 5, 6))); +extern __printf(5, 6) +struct device *device_create(struct class *cls, struct device *parent, +			     dev_t devt, void *drvdata, +			     const char *fmt, ...);  extern void device_destroy(struct class *cls, dev_t devt);  /* @@ -785,61 +798,58 @@ extern const char *dev_driver_string(const struct device *dev);  #ifdef CONFIG_PRINTK -extern int dev_printk(const char *level, const struct device *dev, -		      const char *fmt, ...) -	__attribute__ ((format (printf, 3, 4))); -extern int dev_emerg(const struct device *dev, const char *fmt, ...) -	__attribute__ ((format (printf, 2, 3))); -extern int dev_alert(const struct device *dev, const char *fmt, ...) -	__attribute__ ((format (printf, 2, 3))); -extern int dev_crit(const struct device *dev, const char *fmt, ...) -	__attribute__ ((format (printf, 2, 3))); -extern int dev_err(const struct device *dev, const char *fmt, ...) -	__attribute__ ((format (printf, 2, 3))); -extern int dev_warn(const struct device *dev, const char *fmt, ...) -	__attribute__ ((format (printf, 2, 3))); -extern int dev_notice(const struct device *dev, const char *fmt, ...) -	__attribute__ ((format (printf, 2, 3))); -extern int _dev_info(const struct device *dev, const char *fmt, ...) -	__attribute__ ((format (printf, 2, 3))); +extern int __dev_printk(const char *level, const struct device *dev, +			struct va_format *vaf); +extern __printf(3, 4) +int dev_printk(const char *level, const struct device *dev, +	       const char *fmt, ...) +	; +extern __printf(2, 3) +int dev_emerg(const struct device *dev, const char *fmt, ...); +extern __printf(2, 3) +int dev_alert(const struct device *dev, const char *fmt, ...); +extern __printf(2, 3) +int dev_crit(const struct device *dev, const char *fmt, ...); +extern __printf(2, 3) +int dev_err(const struct device *dev, const char *fmt, ...); +extern __printf(2, 3) +int dev_warn(const struct device *dev, const char *fmt, ...); +extern __printf(2, 3) +int dev_notice(const struct device *dev, const char *fmt, ...); +extern __printf(2, 3) +int _dev_info(const struct device *dev, const char *fmt, ...);  #else -static inline int dev_printk(const char *level, const struct device *dev, -		      const char *fmt, ...) -	__attribute__ ((format (printf, 3, 4))); -static inline int dev_printk(const char *level, const struct device *dev, -		      const char *fmt, ...) -	 { return 0; } +static inline int __dev_printk(const char *level, const struct device *dev, +			       struct va_format *vaf) +{ return 0; } +static inline __printf(3, 4) +int dev_printk(const char *level, const struct device *dev, +	       const char *fmt, ...) +{ return 0; } -static inline int dev_emerg(const struct device *dev, const char *fmt, ...) -	__attribute__ ((format (printf, 2, 3))); -static inline int dev_emerg(const struct device *dev, const char *fmt, ...) -	{ return 0; } -static inline int dev_crit(const struct device *dev, const char *fmt, ...) -	__attribute__ ((format (printf, 2, 3))); -static inline int dev_crit(const struct device *dev, const char *fmt, ...) -	{ return 0; } -static inline int dev_alert(const struct device *dev, const char *fmt, ...) -	__attribute__ ((format (printf, 2, 3))); -static inline int dev_alert(const struct device *dev, const char *fmt, ...) -	{ return 0; } -static inline int dev_err(const struct device *dev, const char *fmt, ...) -	__attribute__ ((format (printf, 2, 3))); -static inline int dev_err(const struct device *dev, const char *fmt, ...) -	{ return 0; } -static inline int dev_warn(const struct device *dev, const char *fmt, ...) -	__attribute__ ((format (printf, 2, 3))); -static inline int dev_warn(const struct device *dev, const char *fmt, ...) -	{ return 0; } -static inline int dev_notice(const struct device *dev, const char *fmt, ...) -	__attribute__ ((format (printf, 2, 3))); -static inline int dev_notice(const struct device *dev, const char *fmt, ...) -	{ return 0; } -static inline int _dev_info(const struct device *dev, const char *fmt, ...) -	__attribute__ ((format (printf, 2, 3))); -static inline int _dev_info(const struct device *dev, const char *fmt, ...) -	{ return 0; } +static inline __printf(2, 3) +int dev_emerg(const struct device *dev, const char *fmt, ...) +{ return 0; } +static inline __printf(2, 3) +int dev_crit(const struct device *dev, const char *fmt, ...) +{ return 0; } +static inline __printf(2, 3) +int dev_alert(const struct device *dev, const char *fmt, ...) +{ return 0; } +static inline __printf(2, 3) +int dev_err(const struct device *dev, const char *fmt, ...) +{ return 0; } +static inline __printf(2, 3) +int dev_warn(const struct device *dev, const char *fmt, ...) +{ return 0; } +static inline __printf(2, 3) +int dev_notice(const struct device *dev, const char *fmt, ...) +{ return 0; } +static inline __printf(2, 3) +int _dev_info(const struct device *dev, const char *fmt, ...) +{ return 0; }  #endif diff --git a/include/linux/dm-ioctl.h b/include/linux/dm-ioctl.h index 0cb8eff76bd..75fd5573516 100644 --- a/include/linux/dm-ioctl.h +++ b/include/linux/dm-ioctl.h @@ -267,9 +267,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	21 +#define DM_VERSION_MINOR	22  #define DM_VERSION_PATCHLEVEL	0 -#define DM_VERSION_EXTRA	"-ioctl (2011-07-06)" +#define DM_VERSION_EXTRA	"-ioctl (2011-10-19)"  /* Status bits */  #define DM_READONLY_FLAG	(1 << 0) /* In/Out */ diff --git a/include/linux/dm-kcopyd.h b/include/linux/dm-kcopyd.h index 5e54458e920..47d9d376e4e 100644 --- a/include/linux/dm-kcopyd.h +++ b/include/linux/dm-kcopyd.h @@ -57,5 +57,9 @@ void *dm_kcopyd_prepare_callback(struct dm_kcopyd_client *kc,  				 dm_kcopyd_notify_fn fn, void *context);  void dm_kcopyd_do_callback(void *job, int read_err, unsigned long write_err); +int dm_kcopyd_zero(struct dm_kcopyd_client *kc, +		   unsigned num_dests, struct dm_io_region *dests, +		   unsigned flags, dm_kcopyd_notify_fn fn, void *context); +  #endif	/* __KERNEL__ */  #endif	/* _LINUX_DM_KCOPYD_H */ diff --git a/include/linux/dm-log-userspace.h b/include/linux/dm-log-userspace.h index eeace7d3ff1..0678c2adc42 100644 --- a/include/linux/dm-log-userspace.h +++ b/include/linux/dm-log-userspace.h @@ -52,15 +52,20 @@   * Payload-to-userspace:   *	A single string containing all the argv arguments separated by ' 's   * Payload-to-kernel: - *	None.  ('data_size' in the dm_ulog_request struct should be 0.) + *	A NUL-terminated string that is the name of the device that is used + *	as the backing store for the log data.  'dm_get_device' will be called + *	on this device.  ('dm_put_device' will be called on this device + *	automatically after calling DM_ULOG_DTR.)  If there is no device needed + *	for log data, 'data_size' in the dm_ulog_request struct should be 0.   *   * The UUID contained in the dm_ulog_request structure is the reference that   * will be used by all request types to a specific log.  The constructor must - * record this assotiation with instance created. + * record this association with the instance created.   *   * When the request has been processed, user-space must return the - * dm_ulog_request to the kernel - setting the 'error' field and - * 'data_size' appropriately. + * dm_ulog_request to the kernel - setting the 'error' field, filling the + * data field with the log device if necessary, and setting 'data_size' + * appropriately.   */  #define DM_ULOG_CTR                    1 @@ -377,8 +382,11 @@   * dm_ulog_request or a change in the way requests are   * issued/handled.  Changes are outlined here:   *	version 1:  Initial implementation + *	version 2:  DM_ULOG_CTR allowed to return a string containing a + *	            device name that is to be registered with DM via + *	            'dm_get_device'.   */ -#define DM_ULOG_REQUEST_VERSION 1 +#define DM_ULOG_REQUEST_VERSION 2  struct dm_ulog_request {  	/* diff --git a/include/linux/dma-mapping.h b/include/linux/dma-mapping.h index 347fdc32177..e13117cbd2f 100644 --- a/include/linux/dma-mapping.h +++ b/include/linux/dma-mapping.h @@ -1,6 +1,7 @@  #ifndef _LINUX_DMA_MAPPING_H  #define _LINUX_DMA_MAPPING_H +#include <linux/string.h>  #include <linux/device.h>  #include <linux/err.h>  #include <linux/dma-attrs.h> @@ -41,6 +42,9 @@ struct dma_map_ops {  	int (*mapping_error)(struct device *dev, dma_addr_t dma_addr);  	int (*dma_supported)(struct device *dev, u64 mask);  	int (*set_dma_mask)(struct device *dev, u64 mask); +#ifdef ARCH_HAS_DMA_GET_REQUIRED_MASK +	u64 (*get_required_mask)(struct device *dev); +#endif  	int is_phys;  }; @@ -117,6 +121,15 @@ static inline int dma_set_seg_boundary(struct device *dev, unsigned long mask)  		return -EIO;  } +static inline void *dma_zalloc_coherent(struct device *dev, size_t size, +					dma_addr_t *dma_handle, gfp_t flag) +{ +	void *ret = dma_alloc_coherent(dev, size, dma_handle, flag); +	if (ret) +		memset(ret, 0, size); +	return ret; +} +  #ifdef CONFIG_HAS_DMA  static inline int dma_get_cache_alignment(void)  { diff --git a/include/linux/dma_remapping.h b/include/linux/dma_remapping.h index bbd8661b347..ef90cbd8e17 100644 --- a/include/linux/dma_remapping.h +++ b/include/linux/dma_remapping.h @@ -25,11 +25,12 @@ struct intel_iommu;  struct dmar_domain;  struct root_entry; -extern void free_dmar_iommu(struct intel_iommu *iommu); -#ifdef CONFIG_DMAR +#ifdef CONFIG_INTEL_IOMMU +extern void free_dmar_iommu(struct intel_iommu *iommu);  extern int iommu_calculate_agaw(struct intel_iommu *iommu);  extern int iommu_calculate_max_sagaw(struct intel_iommu *iommu); +extern int dmar_disabled;  #else  static inline int iommu_calculate_agaw(struct intel_iommu *iommu)  { @@ -39,8 +40,11 @@ static inline int iommu_calculate_max_sagaw(struct intel_iommu *iommu)  {  	return 0;  } +static inline void free_dmar_iommu(struct intel_iommu *iommu) +{ +} +#define dmar_disabled	(1)  #endif -extern int dmar_disabled;  #endif diff --git a/include/linux/dmaengine.h b/include/linux/dmaengine.h index 8fbf40e0713..ace51af4369 100644 --- a/include/linux/dmaengine.h +++ b/include/linux/dmaengine.h @@ -24,8 +24,7 @@  #include <linux/device.h>  #include <linux/uio.h>  #include <linux/dma-direction.h> - -struct scatterlist; +#include <linux/scatterlist.h>  /**   * typedef dma_cookie_t - an opaque DMA cookie @@ -519,6 +518,16 @@ static inline int dmaengine_slave_config(struct dma_chan *chan,  			(unsigned long)config);  } +static inline struct dma_async_tx_descriptor *dmaengine_prep_slave_single( +	struct dma_chan *chan, void *buf, size_t len, +	enum dma_data_direction dir, unsigned long flags) +{ +	struct scatterlist sg; +	sg_init_one(&sg, buf, len); + +	return chan->device->device_prep_slave_sg(chan, &sg, 1, dir, flags); +} +  static inline int dmaengine_terminate_all(struct dma_chan *chan)  {  	return dmaengine_device_control(chan, DMA_TERMINATE_ALL, 0); diff --git a/include/linux/dmar.h b/include/linux/dmar.h index 7b776d71d36..731a6097510 100644 --- a/include/linux/dmar.h +++ b/include/linux/dmar.h @@ -26,8 +26,15 @@  #include <linux/msi.h>  #include <linux/irqreturn.h> +struct acpi_dmar_header; + +/* DMAR Flags */ +#define DMAR_INTR_REMAP		0x1 +#define DMAR_X2APIC_OPT_OUT	0x2 +  struct intel_iommu; -#if defined(CONFIG_DMAR) || defined(CONFIG_INTR_REMAP) +#ifdef CONFIG_DMAR_TABLE +extern struct acpi_table_header *dmar_tbl;  struct dmar_drhd_unit {  	struct list_head list;		/* list of drhd units	*/  	struct  acpi_dmar_header *hdr;	/* ACPI header		*/ @@ -76,7 +83,7 @@ static inline int enable_drhd_fault_handling(void)  {  	return -1;  } -#endif /* !CONFIG_DMAR && !CONFIG_INTR_REMAP */ +#endif /* !CONFIG_DMAR_TABLE */  struct irte {  	union { @@ -107,10 +114,10 @@ struct irte {  	};  }; -#ifdef CONFIG_INTR_REMAP +#ifdef CONFIG_IRQ_REMAP  extern int intr_remapping_enabled;  extern int intr_remapping_supported(void); -extern int enable_intr_remapping(int); +extern int enable_intr_remapping(void);  extern void disable_intr_remapping(void);  extern int reenable_intr_remapping(int); @@ -177,7 +184,7 @@ static inline int set_msi_sid(struct irte *irte, struct pci_dev *dev)  #define intr_remapping_enabled		(0) -static inline int enable_intr_remapping(int eim) +static inline int enable_intr_remapping(void)  {  	return -1;  } @@ -192,6 +199,11 @@ static inline int reenable_intr_remapping(int eim)  }  #endif +enum { +	IRQ_REMAP_XAPIC_MODE, +	IRQ_REMAP_X2APIC_MODE, +}; +  /* Can't use the common MSI interrupt functions   * since DMAR is not a pci device   */ @@ -204,7 +216,7 @@ extern int dmar_set_interrupt(struct intel_iommu *iommu);  extern irqreturn_t dmar_fault(int irq, void *dev_id);  extern int arch_setup_dmar_msi(unsigned int irq); -#ifdef CONFIG_DMAR +#ifdef CONFIG_INTEL_IOMMU  extern int iommu_detected, no_iommu;  extern struct list_head dmar_rmrr_units;  struct dmar_rmrr_unit { @@ -227,9 +239,26 @@ struct dmar_atsr_unit {  	u8 include_all:1;		/* include all ports */  }; +int dmar_parse_rmrr_atsr_dev(void); +extern int dmar_parse_one_rmrr(struct acpi_dmar_header *header); +extern int dmar_parse_one_atsr(struct acpi_dmar_header *header); +extern int dmar_parse_dev_scope(void *start, void *end, int *cnt, +				struct pci_dev ***devices, u16 segment);  extern int intel_iommu_init(void); -#else /* !CONFIG_DMAR: */ +#else /* !CONFIG_INTEL_IOMMU: */  static inline int intel_iommu_init(void) { return -ENODEV; } -#endif /* CONFIG_DMAR */ +static inline int dmar_parse_one_rmrr(struct acpi_dmar_header *header) +{ +	return 0; +} +static inline int dmar_parse_one_atsr(struct acpi_dmar_header *header) +{ +	return 0; +} +static inline int dmar_parse_rmrr_atsr_dev(void) +{ +	return 0; +} +#endif /* CONFIG_INTEL_IOMMU */  #endif /* __DMAR_H__ */ diff --git a/include/linux/drbd_tag_magic.h b/include/linux/drbd_tag_magic.h index 06954319051..81f52f2c572 100644 --- a/include/linux/drbd_tag_magic.h +++ b/include/linux/drbd_tag_magic.h @@ -28,7 +28,7 @@ enum packet_types {  #define NL_STRING(pn, pr, member, len)	\  	unsigned char member[len]; int member ## _len; \  	int tag_and_len ## member; -#include "linux/drbd_nl.h" +#include <linux/drbd_nl.h>  /* declare tag-list-sizes */  static const int tag_list_sizes[] = { diff --git a/include/linux/dvb/frontend.h b/include/linux/dvb/frontend.h index 36a3ed63f57..1b1094c35e4 100644 --- a/include/linux/dvb/frontend.h +++ b/include/linux/dvb/frontend.h @@ -349,6 +349,7 @@ typedef enum fe_delivery_system {  	SYS_CMMB,  	SYS_DAB,  	SYS_DVBT2, +	SYS_TURBO,  } fe_delivery_system_t;  struct dtv_cmds_h { diff --git a/include/linux/dvb/version.h b/include/linux/dvb/version.h index 1421cc84afa..66594b1d5d7 100644 --- a/include/linux/dvb/version.h +++ b/include/linux/dvb/version.h @@ -24,6 +24,6 @@  #define _DVBVERSION_H_  #define DVB_API_VERSION 5 -#define DVB_API_VERSION_MINOR 3 +#define DVB_API_VERSION_MINOR 4  #endif /*_DVBVERSION_H_*/ diff --git a/include/linux/dw_apb_timer.h b/include/linux/dw_apb_timer.h index 49638ea3b77..07261d52a6d 100644 --- a/include/linux/dw_apb_timer.h +++ b/include/linux/dw_apb_timer.h @@ -46,7 +46,7 @@ struct dw_apb_clock_event_device *  dw_apb_clockevent_init(int cpu, const char *name, unsigned rating,  		       void __iomem *base, int irq, unsigned long freq);  struct dw_apb_clocksource * -dw_apb_clocksource_init(unsigned rating, char *name, void __iomem *base, +dw_apb_clocksource_init(unsigned rating, const char *name, void __iomem *base,  			unsigned long freq);  void dw_apb_clocksource_register(struct dw_apb_clocksource *dw_cs);  void dw_apb_clocksource_start(struct dw_apb_clocksource *dw_cs); diff --git a/include/linux/dynamic_debug.h b/include/linux/dynamic_debug.h index e747ecd48e1..0564e3c3988 100644 --- a/include/linux/dynamic_debug.h +++ b/include/linux/dynamic_debug.h @@ -1,13 +1,6 @@  #ifndef _DYNAMIC_DEBUG_H  #define _DYNAMIC_DEBUG_H -/* dynamic_printk_enabled, and dynamic_printk_enabled2 are bitmasks in which - * bit n is set to 1 if any modname hashes into the bucket n, 0 otherwise. They - * use independent hash functions, to reduce the chance of false positives. - */ -extern long long dynamic_debug_enabled; -extern long long dynamic_debug_enabled2; -  /*   * An instance of this structure is created in a special   * ELF section at every dynamic debug callsite.  At runtime, @@ -44,29 +37,57 @@ int ddebug_add_module(struct _ddebug *tab, unsigned int n,  #if defined(CONFIG_DYNAMIC_DEBUG)  extern int ddebug_remove_module(const char *mod_name); -extern int __dynamic_pr_debug(struct _ddebug *descriptor, const char *fmt, ...) -	__attribute__ ((format (printf, 2, 3))); +extern __printf(2, 3) +int __dynamic_pr_debug(struct _ddebug *descriptor, const char *fmt, ...); + +struct device; + +extern __printf(3, 4) +int __dynamic_dev_dbg(struct _ddebug *descriptor, const struct device *dev, +		      const char *fmt, ...); + +struct net_device; + +extern __printf(3, 4) +int __dynamic_netdev_dbg(struct _ddebug *descriptor, +			 const struct net_device *dev, +			 const char *fmt, ...); + +#define DEFINE_DYNAMIC_DEBUG_METADATA(name, fmt)		\ +	static struct _ddebug __used __aligned(8)		\ +	__attribute__((section("__verbose"))) name = {		\ +		.modname = KBUILD_MODNAME,			\ +		.function = __func__,				\ +		.filename = __FILE__,				\ +		.format = (fmt),				\ +		.lineno = __LINE__,				\ +		.flags =  _DPRINTK_FLAGS_DEFAULT,		\ +		.enabled = false,				\ +	} -#define dynamic_pr_debug(fmt, ...) do {					\ -	static struct _ddebug descriptor				\ -	__used								\ -	__attribute__((section("__verbose"), aligned(8))) =		\ -	{ KBUILD_MODNAME, __func__, __FILE__, fmt, __LINE__,		\ -		_DPRINTK_FLAGS_DEFAULT };				\ -	if (unlikely(descriptor.enabled))				\ -		__dynamic_pr_debug(&descriptor, pr_fmt(fmt), ##__VA_ARGS__); \ -	} while (0) +#define dynamic_pr_debug(fmt, ...)				\ +do {								\ +	DEFINE_DYNAMIC_DEBUG_METADATA(descriptor, fmt);		\ +	if (unlikely(descriptor.enabled))			\ +		__dynamic_pr_debug(&descriptor, pr_fmt(fmt),	\ +				   ##__VA_ARGS__);		\ +} while (0) +#define dynamic_dev_dbg(dev, fmt, ...)				\ +do {								\ +	DEFINE_DYNAMIC_DEBUG_METADATA(descriptor, fmt);	\ +	if (unlikely(descriptor.enabled))			\ +		__dynamic_dev_dbg(&descriptor, dev, fmt,	\ +				  ##__VA_ARGS__);		\ +} while (0) -#define dynamic_dev_dbg(dev, fmt, ...) do {				\ -	static struct _ddebug descriptor				\ -	__used								\ -	__attribute__((section("__verbose"), aligned(8))) =		\ -	{ KBUILD_MODNAME, __func__, __FILE__, fmt, __LINE__,		\ -		_DPRINTK_FLAGS_DEFAULT };				\ -	if (unlikely(descriptor.enabled))				\ -		dev_printk(KERN_DEBUG, dev, fmt, ##__VA_ARGS__);	\ -	} while (0) +#define dynamic_netdev_dbg(dev, fmt, ...)			\ +do {								\ +	DEFINE_DYNAMIC_DEBUG_METADATA(descriptor, fmt);		\ +	if (unlikely(descriptor.enabled))			\ +		__dynamic_netdev_dbg(&descriptor, dev, fmt,	\ +				     ##__VA_ARGS__);		\ +} while (0)  #else diff --git a/include/linux/edac.h b/include/linux/edac.h index 4a73257b47d..055b248bdd5 100644 --- a/include/linux/edac.h +++ b/include/linux/edac.h @@ -42,4 +42,354 @@ static inline void opstate_init(void)  	return;  } +#define EDAC_MC_LABEL_LEN	31 +#define MC_PROC_NAME_MAX_LEN	7 + +/* memory devices */ +enum dev_type { +	DEV_UNKNOWN = 0, +	DEV_X1, +	DEV_X2, +	DEV_X4, +	DEV_X8, +	DEV_X16, +	DEV_X32,		/* Do these parts exist? */ +	DEV_X64			/* Do these parts exist? */ +}; + +#define DEV_FLAG_UNKNOWN	BIT(DEV_UNKNOWN) +#define DEV_FLAG_X1		BIT(DEV_X1) +#define DEV_FLAG_X2		BIT(DEV_X2) +#define DEV_FLAG_X4		BIT(DEV_X4) +#define DEV_FLAG_X8		BIT(DEV_X8) +#define DEV_FLAG_X16		BIT(DEV_X16) +#define DEV_FLAG_X32		BIT(DEV_X32) +#define DEV_FLAG_X64		BIT(DEV_X64) + +/* memory types */ +enum mem_type { +	MEM_EMPTY = 0,		/* Empty csrow */ +	MEM_RESERVED,		/* Reserved csrow type */ +	MEM_UNKNOWN,		/* Unknown csrow type */ +	MEM_FPM,		/* Fast page mode */ +	MEM_EDO,		/* Extended data out */ +	MEM_BEDO,		/* Burst Extended data out */ +	MEM_SDR,		/* Single data rate SDRAM */ +	MEM_RDR,		/* Registered single data rate SDRAM */ +	MEM_DDR,		/* Double data rate SDRAM */ +	MEM_RDDR,		/* Registered Double data rate SDRAM */ +	MEM_RMBS,		/* Rambus DRAM */ +	MEM_DDR2,		/* DDR2 RAM */ +	MEM_FB_DDR2,		/* fully buffered DDR2 */ +	MEM_RDDR2,		/* Registered DDR2 RAM */ +	MEM_XDR,		/* Rambus XDR */ +	MEM_DDR3,		/* DDR3 RAM */ +	MEM_RDDR3,		/* Registered DDR3 RAM */ +}; + +#define MEM_FLAG_EMPTY		BIT(MEM_EMPTY) +#define MEM_FLAG_RESERVED	BIT(MEM_RESERVED) +#define MEM_FLAG_UNKNOWN	BIT(MEM_UNKNOWN) +#define MEM_FLAG_FPM		BIT(MEM_FPM) +#define MEM_FLAG_EDO		BIT(MEM_EDO) +#define MEM_FLAG_BEDO		BIT(MEM_BEDO) +#define MEM_FLAG_SDR		BIT(MEM_SDR) +#define MEM_FLAG_RDR		BIT(MEM_RDR) +#define MEM_FLAG_DDR		BIT(MEM_DDR) +#define MEM_FLAG_RDDR		BIT(MEM_RDDR) +#define MEM_FLAG_RMBS		BIT(MEM_RMBS) +#define MEM_FLAG_DDR2           BIT(MEM_DDR2) +#define MEM_FLAG_FB_DDR2        BIT(MEM_FB_DDR2) +#define MEM_FLAG_RDDR2          BIT(MEM_RDDR2) +#define MEM_FLAG_XDR            BIT(MEM_XDR) +#define MEM_FLAG_DDR3		 BIT(MEM_DDR3) +#define MEM_FLAG_RDDR3		 BIT(MEM_RDDR3) + +/* chipset Error Detection and Correction capabilities and mode */ +enum edac_type { +	EDAC_UNKNOWN = 0,	/* Unknown if ECC is available */ +	EDAC_NONE,		/* Doesn't support ECC */ +	EDAC_RESERVED,		/* Reserved ECC type */ +	EDAC_PARITY,		/* Detects parity errors */ +	EDAC_EC,		/* Error Checking - no correction */ +	EDAC_SECDED,		/* Single bit error correction, Double detection */ +	EDAC_S2ECD2ED,		/* Chipkill x2 devices - do these exist? */ +	EDAC_S4ECD4ED,		/* Chipkill x4 devices */ +	EDAC_S8ECD8ED,		/* Chipkill x8 devices */ +	EDAC_S16ECD16ED,	/* Chipkill x16 devices */ +}; + +#define EDAC_FLAG_UNKNOWN	BIT(EDAC_UNKNOWN) +#define EDAC_FLAG_NONE		BIT(EDAC_NONE) +#define EDAC_FLAG_PARITY	BIT(EDAC_PARITY) +#define EDAC_FLAG_EC		BIT(EDAC_EC) +#define EDAC_FLAG_SECDED	BIT(EDAC_SECDED) +#define EDAC_FLAG_S2ECD2ED	BIT(EDAC_S2ECD2ED) +#define EDAC_FLAG_S4ECD4ED	BIT(EDAC_S4ECD4ED) +#define EDAC_FLAG_S8ECD8ED	BIT(EDAC_S8ECD8ED) +#define EDAC_FLAG_S16ECD16ED	BIT(EDAC_S16ECD16ED) + +/* scrubbing capabilities */ +enum scrub_type { +	SCRUB_UNKNOWN = 0,	/* Unknown if scrubber is available */ +	SCRUB_NONE,		/* No scrubber */ +	SCRUB_SW_PROG,		/* SW progressive (sequential) scrubbing */ +	SCRUB_SW_SRC,		/* Software scrub only errors */ +	SCRUB_SW_PROG_SRC,	/* Progressive software scrub from an error */ +	SCRUB_SW_TUNABLE,	/* Software scrub frequency is tunable */ +	SCRUB_HW_PROG,		/* HW progressive (sequential) scrubbing */ +	SCRUB_HW_SRC,		/* Hardware scrub only errors */ +	SCRUB_HW_PROG_SRC,	/* Progressive hardware scrub from an error */ +	SCRUB_HW_TUNABLE	/* Hardware scrub frequency is tunable */ +}; + +#define SCRUB_FLAG_SW_PROG	BIT(SCRUB_SW_PROG) +#define SCRUB_FLAG_SW_SRC	BIT(SCRUB_SW_SRC) +#define SCRUB_FLAG_SW_PROG_SRC	BIT(SCRUB_SW_PROG_SRC) +#define SCRUB_FLAG_SW_TUN	BIT(SCRUB_SW_SCRUB_TUNABLE) +#define SCRUB_FLAG_HW_PROG	BIT(SCRUB_HW_PROG) +#define SCRUB_FLAG_HW_SRC	BIT(SCRUB_HW_SRC) +#define SCRUB_FLAG_HW_PROG_SRC	BIT(SCRUB_HW_PROG_SRC) +#define SCRUB_FLAG_HW_TUN	BIT(SCRUB_HW_TUNABLE) + +/* FIXME - should have notify capabilities: NMI, LOG, PROC, etc */ + +/* EDAC internal operation states */ +#define	OP_ALLOC		0x100 +#define OP_RUNNING_POLL		0x201 +#define OP_RUNNING_INTERRUPT	0x202 +#define OP_RUNNING_POLL_INTR	0x203 +#define OP_OFFLINE		0x300 + +/* + * There are several things to be aware of that aren't at all obvious: + * + * + * SOCKETS, SOCKET SETS, BANKS, ROWS, CHIP-SELECT ROWS, CHANNELS, etc.. + * + * These are some of the many terms that are thrown about that don't always + * mean what people think they mean (Inconceivable!).  In the interest of + * creating a common ground for discussion, terms and their definitions + * will be established. + * + * Memory devices:	The individual chip on a memory stick.  These devices + *			commonly output 4 and 8 bits each.  Grouping several + *			of these in parallel provides 64 bits which is common + *			for a memory stick. + * + * Memory Stick:	A printed circuit board that aggregates multiple + *			memory devices in parallel.  This is the atomic + *			memory component that is purchaseable by Joe consumer + *			and loaded into a memory socket. + * + * Socket:		A physical connector on the motherboard that accepts + *			a single memory stick. + * + * Channel:		Set of memory devices on a memory stick that must be + *			grouped in parallel with one or more additional + *			channels from other memory sticks.  This parallel + *			grouping of the output from multiple channels are + *			necessary for the smallest granularity of memory access. + *			Some memory controllers are capable of single channel - + *			which means that memory sticks can be loaded + *			individually.  Other memory controllers are only + *			capable of dual channel - which means that memory + *			sticks must be loaded as pairs (see "socket set"). + * + * Chip-select row:	All of the memory devices that are selected together. + *			for a single, minimum grain of memory access. + *			This selects all of the parallel memory devices across + *			all of the parallel channels.  Common chip-select rows + *			for single channel are 64 bits, for dual channel 128 + *			bits. + * + * Single-Ranked stick:	A Single-ranked stick has 1 chip-select row of memory. + *			Motherboards commonly drive two chip-select pins to + *			a memory stick. A single-ranked stick, will occupy + *			only one of those rows. The other will be unused. + * + * Double-Ranked stick:	A double-ranked stick has two chip-select rows which + *			access different sets of memory devices.  The two + *			rows cannot be accessed concurrently. + * + * Double-sided stick:	DEPRECATED TERM, see Double-Ranked stick. + *			A double-sided stick has two chip-select rows which + *			access different sets of memory devices.  The two + *			rows cannot be accessed concurrently.  "Double-sided" + *			is irrespective of the memory devices being mounted + *			on both sides of the memory stick. + * + * Socket set:		All of the memory sticks that are required for + *			a single memory access or all of the memory sticks + *			spanned by a chip-select row.  A single socket set + *			has two chip-select rows and if double-sided sticks + *			are used these will occupy those chip-select rows. + * + * Bank:		This term is avoided because it is unclear when + *			needing to distinguish between chip-select rows and + *			socket sets. + * + * Controller pages: + * + * Physical pages: + * + * Virtual pages: + * + * + * STRUCTURE ORGANIZATION AND CHOICES + * + * + * + * PS - I enjoyed writing all that about as much as you enjoyed reading it. + */ + +struct channel_info { +	int chan_idx;		/* channel index */ +	u32 ce_count;		/* Correctable Errors for this CHANNEL */ +	char label[EDAC_MC_LABEL_LEN + 1];	/* DIMM label on motherboard */ +	struct csrow_info *csrow;	/* the parent */ +}; + +struct csrow_info { +	unsigned long first_page;	/* first page number in dimm */ +	unsigned long last_page;	/* last page number in dimm */ +	unsigned long page_mask;	/* used for interleaving - +					 * 0UL for non intlv +					 */ +	u32 nr_pages;		/* number of pages in csrow */ +	u32 grain;		/* granularity of reported error in bytes */ +	int csrow_idx;		/* the chip-select row */ +	enum dev_type dtype;	/* memory device type */ +	u32 ue_count;		/* Uncorrectable Errors for this csrow */ +	u32 ce_count;		/* Correctable Errors for this csrow */ +	enum mem_type mtype;	/* memory csrow type */ +	enum edac_type edac_mode;	/* EDAC mode for this csrow */ +	struct mem_ctl_info *mci;	/* the parent */ + +	struct kobject kobj;	/* sysfs kobject for this csrow */ + +	/* channel information for this csrow */ +	u32 nr_channels; +	struct channel_info *channels; +}; + +struct mcidev_sysfs_group { +	const char *name;				/* group name */ +	const struct mcidev_sysfs_attribute *mcidev_attr; /* group attributes */ +}; + +struct mcidev_sysfs_group_kobj { +	struct list_head list;		/* list for all instances within a mc */ + +	struct kobject kobj;		/* kobj for the group */ + +	const struct mcidev_sysfs_group *grp;	/* group description table */ +	struct mem_ctl_info *mci;	/* the parent */ +}; + +/* mcidev_sysfs_attribute structure + *	used for driver sysfs attributes and in mem_ctl_info + * 	sysfs top level entries + */ +struct mcidev_sysfs_attribute { +	/* It should use either attr or grp */ +	struct attribute attr; +	const struct mcidev_sysfs_group *grp;	/* Points to a group of attributes */ + +	/* Ops for show/store values at the attribute - not used on group */ +        ssize_t (*show)(struct mem_ctl_info *,char *); +        ssize_t (*store)(struct mem_ctl_info *, const char *,size_t); +}; + +/* MEMORY controller information structure + */ +struct mem_ctl_info { +	struct list_head link;	/* for global list of mem_ctl_info structs */ + +	struct module *owner;	/* Module owner of this control struct */ + +	unsigned long mtype_cap;	/* memory types supported by mc */ +	unsigned long edac_ctl_cap;	/* Mem controller EDAC capabilities */ +	unsigned long edac_cap;	/* configuration capabilities - this is +				 * closely related to edac_ctl_cap.  The +				 * difference is that the controller may be +				 * capable of s4ecd4ed which would be listed +				 * in edac_ctl_cap, but if channels aren't +				 * capable of s4ecd4ed then the edac_cap would +				 * not have that capability. +				 */ +	unsigned long scrub_cap;	/* chipset scrub capabilities */ +	enum scrub_type scrub_mode;	/* current scrub mode */ + +	/* Translates sdram memory scrub rate given in bytes/sec to the +	   internal representation and configures whatever else needs +	   to be configured. +	 */ +	int (*set_sdram_scrub_rate) (struct mem_ctl_info * mci, u32 bw); + +	/* Get the current sdram memory scrub rate from the internal +	   representation and converts it to the closest matching +	   bandwidth in bytes/sec. +	 */ +	int (*get_sdram_scrub_rate) (struct mem_ctl_info * mci); + + +	/* pointer to edac checking routine */ +	void (*edac_check) (struct mem_ctl_info * mci); + +	/* +	 * Remaps memory pages: controller pages to physical pages. +	 * For most MC's, this will be NULL. +	 */ +	/* FIXME - why not send the phys page to begin with? */ +	unsigned long (*ctl_page_to_phys) (struct mem_ctl_info * mci, +					   unsigned long page); +	int mc_idx; +	int nr_csrows; +	struct csrow_info *csrows; +	/* +	 * FIXME - what about controllers on other busses? - IDs must be +	 * unique.  dev pointer should be sufficiently unique, but +	 * BUS:SLOT.FUNC numbers may not be unique. +	 */ +	struct device *dev; +	const char *mod_name; +	const char *mod_ver; +	const char *ctl_name; +	const char *dev_name; +	char proc_name[MC_PROC_NAME_MAX_LEN + 1]; +	void *pvt_info; +	u32 ue_noinfo_count;	/* Uncorrectable Errors w/o info */ +	u32 ce_noinfo_count;	/* Correctable Errors w/o info */ +	u32 ue_count;		/* Total Uncorrectable Errors for this MC */ +	u32 ce_count;		/* Total Correctable Errors for this MC */ +	unsigned long start_time;	/* mci load start time (in jiffies) */ + +	struct completion complete; + +	/* edac sysfs device control */ +	struct kobject edac_mci_kobj; + +	/* list for all grp instances within a mc */ +	struct list_head grp_kobj_list; + +	/* Additional top controller level attributes, but specified +	 * by the low level driver. +	 * +	 * Set by the low level driver to provide attributes at the +	 * controller level, same level as 'ue_count' and 'ce_count' above. +	 * An array of structures, NULL terminated +	 * +	 * If attributes are desired, then set to array of attributes +	 * If no attributes are desired, leave NULL +	 */ +	const struct mcidev_sysfs_attribute *mc_driver_sysfs_attributes; + +	/* work struct for this MC */ +	struct delayed_work work; + +	/* the internal state of this controller instance */ +	int op_state; +}; +  #endif diff --git a/include/linux/edac_mce.h b/include/linux/edac_mce.h deleted file mode 100644 index f974fc03536..00000000000 --- a/include/linux/edac_mce.h +++ /dev/null @@ -1,31 +0,0 @@ -/* Provides edac interface to mcelog events - * - * This file may be distributed under the terms of the - * GNU General Public License version 2. - * - * Copyright (c) 2009 by: - *	 Mauro Carvalho Chehab <mchehab@redhat.com> - * - * Red Hat Inc. http://www.redhat.com - */ - -#if defined(CONFIG_EDAC_MCE) || \ -			(defined(CONFIG_EDAC_MCE_MODULE) && defined(MODULE)) - -#include <asm/mce.h> -#include <linux/list.h> - -struct edac_mce { -	struct list_head list; - -	void *priv; -	int (*check_error)(void *priv, struct mce *mce); -}; - -int edac_mce_register(struct edac_mce *edac_mce); -void edac_mce_unregister(struct edac_mce *edac_mce); -int edac_mce_parse(struct mce *mce); - -#else -#define edac_mce_parse(mce) (0) -#endif diff --git a/include/linux/elevator.h b/include/linux/elevator.h index d800d514218..1d0f7a2ff73 100644 --- a/include/linux/elevator.h +++ b/include/linux/elevator.h @@ -38,6 +38,12 @@ 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; + +	/* +	 * Used for both plugged list and elevator merging and in the +	 * former case called without queue_lock.  Read comment on top of +	 * attempt_plug_merge() for details. +	 */  	elevator_bio_merged_fn *elevator_bio_merged_fn;  	elevator_dispatch_fn *elevator_dispatch_fn; diff --git a/include/linux/elf.h b/include/linux/elf.h index 110821cb6ea..31f0508d7da 100644 --- a/include/linux/elf.h +++ b/include/linux/elf.h @@ -395,6 +395,7 @@ typedef struct elf64_shdr {  #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 */ +#define NT_S390_SYSTEM_CALL	0x307	/* s390 system call restart data */  #define NT_ARM_VFP	0x400		/* ARM VFP/NEON registers */ diff --git a/include/linux/ethtool.h b/include/linux/ethtool.h index c6e427ab65f..45f00b61c09 100644 --- a/include/linux/ethtool.h +++ b/include/linux/ethtool.h @@ -117,99 +117,101 @@ struct ethtool_eeprom {  	__u8	data[0];  }; -/* for configuring coalescing parameters of chip */ +/** + * struct ethtool_coalesce - coalescing parameters for IRQs and stats updates + * @cmd: ETHTOOL_{G,S}COALESCE + * @rx_coalesce_usecs: How many usecs to delay an RX interrupt after + *	a packet arrives. + * @rx_max_coalesced_frames: Maximum number of packets to receive + *	before an RX interrupt. + * @rx_coalesce_usecs_irq: Same as @rx_coalesce_usecs, except that + *	this value applies while an IRQ is being serviced by the host. + * @rx_max_coalesced_frames_irq: Same as @rx_max_coalesced_frames, + *	except that this value applies while an IRQ is being serviced + *	by the host. + * @tx_coalesce_usecs: How many usecs to delay a TX interrupt after + *	a packet is sent. + * @tx_max_coalesced_frames: Maximum number of packets to be sent + *	before a TX interrupt. + * @tx_coalesce_usecs_irq: Same as @tx_coalesce_usecs, except that + *	this value applies while an IRQ is being serviced by the host. + * @tx_max_coalesced_frames_irq: Same as @tx_max_coalesced_frames, + *	except that this value applies while an IRQ is being serviced + *	by the host. + * @stats_block_coalesce_usecs: How many usecs to delay in-memory + *	statistics block updates.  Some drivers do not have an + *	in-memory statistic block, and in such cases this value is + *	ignored.  This value must not be zero. + * @use_adaptive_rx_coalesce: Enable adaptive RX coalescing. + * @use_adaptive_tx_coalesce: Enable adaptive TX coalescing. + * @pkt_rate_low: Threshold for low packet rate (packets per second). + * @rx_coalesce_usecs_low: How many usecs to delay an RX interrupt after + *	a packet arrives, when the packet rate is below @pkt_rate_low. + * @rx_max_coalesced_frames_low: Maximum number of packets to be received + *	before an RX interrupt, when the packet rate is below @pkt_rate_low. + * @tx_coalesce_usecs_low: How many usecs to delay a TX interrupt after + *	a packet is sent, when the packet rate is below @pkt_rate_low. + * @tx_max_coalesced_frames_low: Maximum nuumber of packets to be sent before + *	a TX interrupt, when the packet rate is below @pkt_rate_low. + * @pkt_rate_high: Threshold for high packet rate (packets per second). + * @rx_coalesce_usecs_high: How many usecs to delay an RX interrupt after + *	a packet arrives, when the packet rate is above @pkt_rate_high. + * @rx_max_coalesced_frames_high: Maximum number of packets to be received + *	before an RX interrupt, when the packet rate is above @pkt_rate_high. + * @tx_coalesce_usecs_high: How many usecs to delay a TX interrupt after + *	a packet is sent, when the packet rate is above @pkt_rate_high. + * @tx_max_coalesced_frames_high: Maximum number of packets to be sent before + *	a TX interrupt, when the packet rate is above @pkt_rate_high. + * @rate_sample_interval: How often to do adaptive coalescing packet rate + *	sampling, measured in seconds.  Must not be zero. + * + * Each pair of (usecs, max_frames) fields specifies this exit + * condition for interrupt coalescing: + *	(usecs > 0 && time_since_first_completion >= usecs) || + *	(max_frames > 0 && completed_frames >= max_frames) + * It is illegal to set both usecs and max_frames to zero as this + * would cause interrupts to never be generated.  To disable + * coalescing, set usecs = 0 and max_frames = 1. + * + * Some implementations ignore the value of max_frames and use the + * condition: + *	time_since_first_completion >= usecs + * This is deprecated.  Drivers for hardware that does not support + * counting completions should validate that max_frames == !rx_usecs. + * + * Adaptive RX/TX coalescing is an algorithm implemented by some + * drivers to improve latency under low packet rates and improve + * throughput under high packet rates.  Some drivers only implement + * one of RX or TX adaptive coalescing.  Anything not implemented by + * the driver causes these values to be silently ignored. + * + * When the packet rate is below @pkt_rate_high but above + * @pkt_rate_low (both measured in packets per second) the + * normal {rx,tx}_* coalescing parameters are used. + */  struct ethtool_coalesce { -	__u32	cmd;	/* ETHTOOL_{G,S}COALESCE */ - -	/* How many usecs to delay an RX interrupt after -	 * a packet arrives.  If 0, only rx_max_coalesced_frames -	 * is used. -	 */ +	__u32	cmd;  	__u32	rx_coalesce_usecs; - -	/* How many packets to delay an RX interrupt after -	 * a packet arrives.  If 0, only rx_coalesce_usecs is -	 * used.  It is illegal to set both usecs and max frames -	 * to zero as this would cause RX interrupts to never be -	 * generated. -	 */  	__u32	rx_max_coalesced_frames; - -	/* Same as above two parameters, except that these values -	 * apply while an IRQ is being serviced by the host.  Not -	 * all cards support this feature and the values are ignored -	 * in that case. -	 */  	__u32	rx_coalesce_usecs_irq;  	__u32	rx_max_coalesced_frames_irq; - -	/* How many usecs to delay a TX interrupt after -	 * a packet is sent.  If 0, only tx_max_coalesced_frames -	 * is used. -	 */  	__u32	tx_coalesce_usecs; - -	/* How many packets to delay a TX interrupt after -	 * a packet is sent.  If 0, only tx_coalesce_usecs is -	 * used.  It is illegal to set both usecs and max frames -	 * to zero as this would cause TX interrupts to never be -	 * generated. -	 */  	__u32	tx_max_coalesced_frames; - -	/* Same as above two parameters, except that these values -	 * apply while an IRQ is being serviced by the host.  Not -	 * all cards support this feature and the values are ignored -	 * in that case. -	 */  	__u32	tx_coalesce_usecs_irq;  	__u32	tx_max_coalesced_frames_irq; - -	/* How many usecs to delay in-memory statistics -	 * block updates.  Some drivers do not have an in-memory -	 * statistic block, and in such cases this value is ignored. -	 * This value must not be zero. -	 */  	__u32	stats_block_coalesce_usecs; - -	/* Adaptive RX/TX coalescing is an algorithm implemented by -	 * some drivers to improve latency under low packet rates and -	 * improve throughput under high packet rates.  Some drivers -	 * only implement one of RX or TX adaptive coalescing.  Anything -	 * not implemented by the driver causes these values to be -	 * silently ignored. -	 */  	__u32	use_adaptive_rx_coalesce;  	__u32	use_adaptive_tx_coalesce; - -	/* When the packet rate (measured in packets per second) -	 * is below pkt_rate_low, the {rx,tx}_*_low parameters are -	 * used. -	 */  	__u32	pkt_rate_low;  	__u32	rx_coalesce_usecs_low;  	__u32	rx_max_coalesced_frames_low;  	__u32	tx_coalesce_usecs_low;  	__u32	tx_max_coalesced_frames_low; - -	/* When the packet rate is below pkt_rate_high but above -	 * pkt_rate_low (both measured in packets per second) the -	 * normal {rx,tx}_* coalescing parameters are used. -	 */ - -	/* When the packet rate is (measured in packets per second) -	 * is above pkt_rate_high, the {rx,tx}_*_high parameters are -	 * used. -	 */  	__u32	pkt_rate_high;  	__u32	rx_coalesce_usecs_high;  	__u32	rx_max_coalesced_frames_high;  	__u32	tx_coalesce_usecs_high;  	__u32	tx_max_coalesced_frames_high; - -	/* How often to do adaptive coalescing packet rate sampling, -	 * measured in seconds.  Must not be zero. -	 */  	__u32	rate_sample_interval;  }; @@ -444,7 +446,7 @@ struct ethtool_flow_ext {  };  /** - * struct ethtool_rx_flow_spec - specification for RX flow filter + * struct ethtool_rx_flow_spec - classification rule for RX flows   * @flow_type: Type of match to perform, e.g. %TCP_V4_FLOW   * @h_u: Flow fields to match (dependent on @flow_type)   * @h_ext: Additional fields to match @@ -454,7 +456,9 @@ struct ethtool_flow_ext {   *	includes the %FLOW_EXT flag.   * @ring_cookie: RX ring/queue index to deliver to, or %RX_CLS_FLOW_DISC   *	if packets should be discarded - * @location: Index of filter in hardware table + * @location: Location of rule in the table.  Locations must be + *	numbered such that a flow matching multiple rules will be + *	classified according to the first (lowest numbered) rule.   */  struct ethtool_rx_flow_spec {  	__u32		flow_type; @@ -473,9 +477,9 @@ struct ethtool_rx_flow_spec {   *	%ETHTOOL_GRXCLSRLALL, %ETHTOOL_SRXCLSRLDEL or %ETHTOOL_SRXCLSRLINS   * @flow_type: Type of flow to be affected, e.g. %TCP_V4_FLOW   * @data: Command-dependent value - * @fs: Flow filter specification + * @fs: Flow classification rule   * @rule_cnt: Number of rules to be affected - * @rule_locs: Array of valid rule indices + * @rule_locs: Array of used rule locations   *   * For %ETHTOOL_GRXFH and %ETHTOOL_SRXFH, @data is a bitmask indicating   * the fields included in the flow hash, e.g. %RXH_IP_SRC.  The following @@ -487,23 +491,20 @@ struct ethtool_rx_flow_spec {   * For %ETHTOOL_GRXCLSRLCNT, @rule_cnt is set to the number of defined   * rules on return.   * - * For %ETHTOOL_GRXCLSRULE, @fs.@location specifies the index of an - * existing filter rule on entry and @fs contains the rule on return. + * For %ETHTOOL_GRXCLSRULE, @fs.@location specifies the location of an + * existing rule on entry and @fs contains the rule on return.   *   * For %ETHTOOL_GRXCLSRLALL, @rule_cnt specifies the array size of the   * user buffer for @rule_locs on entry.  On return, @data is the size - * of the filter table and @rule_locs contains the indices of the - * defined rules. + * of the rule table, @rule_cnt is the number of defined rules, and + * @rule_locs contains the locations of the defined rules.  Drivers + * must use the second parameter to get_rxnfc() instead of @rule_locs.   * - * For %ETHTOOL_SRXCLSRLINS, @fs specifies the filter rule to add or - * update.  @fs.@location specifies the index to use and must not be - * ignored. + * For %ETHTOOL_SRXCLSRLINS, @fs specifies the rule to add or update. + * @fs.@location specifies the location to use and must not be ignored.   * - * For %ETHTOOL_SRXCLSRLDEL, @fs.@location specifies the index of an - * existing filter rule on entry. - * - * Implementation of indexed classification rules generally requires a - * TCAM. + * For %ETHTOOL_SRXCLSRLDEL, @fs.@location specifies the location of an + * existing rule on entry.   */  struct ethtool_rxnfc {  	__u32				cmd; @@ -726,6 +727,9 @@ enum ethtool_sfeatures_retval_bits {  /* needed by dev_disable_lro() */  extern int __ethtool_set_flags(struct net_device *dev, u32 flags); +extern int __ethtool_get_settings(struct net_device *dev, +				  struct ethtool_cmd *cmd); +  /**   * enum ethtool_phys_id_state - indicator state for physical identification   * @ETHTOOL_ID_INACTIVE: Physical ID indicator should be deactivated @@ -936,7 +940,7 @@ struct ethtool_ops {  	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 *); +			     struct ethtool_rxnfc *, u32 *rule_locs);  	int	(*set_rxnfc)(struct net_device *, struct ethtool_rxnfc *);  	int	(*flash_device)(struct net_device *, struct ethtool_flash *);  	int	(*reset)(struct net_device *, u32 *); diff --git a/include/linux/evm.h b/include/linux/evm.h new file mode 100644 index 00000000000..9fc13a76092 --- /dev/null +++ b/include/linux/evm.h @@ -0,0 +1,100 @@ +/* + * evm.h + * + * Copyright (c) 2009 IBM Corporation + * Author: Mimi Zohar <zohar@us.ibm.com> + */ + +#ifndef _LINUX_EVM_H +#define _LINUX_EVM_H + +#include <linux/integrity.h> +#include <linux/xattr.h> + +struct integrity_iint_cache; + +#ifdef CONFIG_EVM +extern enum integrity_status evm_verifyxattr(struct dentry *dentry, +					     const char *xattr_name, +					     void *xattr_value, +					     size_t xattr_value_len, +					     struct integrity_iint_cache *iint); +extern int evm_inode_setattr(struct dentry *dentry, struct iattr *attr); +extern void evm_inode_post_setattr(struct dentry *dentry, int ia_valid); +extern int evm_inode_setxattr(struct dentry *dentry, const char *name, +			      const void *value, size_t size); +extern void evm_inode_post_setxattr(struct dentry *dentry, +				    const char *xattr_name, +				    const void *xattr_value, +				    size_t xattr_value_len); +extern int evm_inode_removexattr(struct dentry *dentry, const char *xattr_name); +extern void evm_inode_post_removexattr(struct dentry *dentry, +				       const char *xattr_name); +extern int evm_inode_init_security(struct inode *inode, +				   const struct xattr *xattr_array, +				   struct xattr *evm); +#ifdef CONFIG_FS_POSIX_ACL +extern int posix_xattr_acl(const char *xattrname); +#else +static inline int posix_xattr_acl(const char *xattrname) +{ +	return 0; +} +#endif +#else +#ifdef CONFIG_INTEGRITY +static inline enum integrity_status evm_verifyxattr(struct dentry *dentry, +						    const char *xattr_name, +						    void *xattr_value, +						    size_t xattr_value_len, +					struct integrity_iint_cache *iint) +{ +	return INTEGRITY_UNKNOWN; +} +#endif + +static inline int evm_inode_setattr(struct dentry *dentry, struct iattr *attr) +{ +	return 0; +} + +static inline void evm_inode_post_setattr(struct dentry *dentry, int ia_valid) +{ +	return; +} + +static inline int evm_inode_setxattr(struct dentry *dentry, const char *name, +				     const void *value, size_t size) +{ +	return 0; +} + +static inline void evm_inode_post_setxattr(struct dentry *dentry, +					   const char *xattr_name, +					   const void *xattr_value, +					   size_t xattr_value_len) +{ +	return; +} + +static inline int evm_inode_removexattr(struct dentry *dentry, +					const char *xattr_name) +{ +	return 0; +} + +static inline void evm_inode_post_removexattr(struct dentry *dentry, +					      const char *xattr_name) +{ +	return; +} + +static inline int evm_inode_init_security(struct inode *inode, +					  const struct xattr *xattr_array, +					  struct xattr *evm) +{ +	return 0; +} + +#endif /* CONFIG_EVM_H */ +#endif /* LINUX_EVM_H */ diff --git a/include/linux/ext2_fs.h b/include/linux/ext2_fs.h index 53792bf36c7..ce1b719e8bd 100644 --- a/include/linux/ext2_fs.h +++ b/include/linux/ext2_fs.h @@ -197,8 +197,8 @@ struct ext2_group_desc  /* Flags that should be inherited by new inodes from their parent. */  #define EXT2_FL_INHERITED (EXT2_SECRM_FL | EXT2_UNRM_FL | EXT2_COMPR_FL |\ -			   EXT2_SYNC_FL | EXT2_IMMUTABLE_FL | EXT2_APPEND_FL |\ -			   EXT2_NODUMP_FL | EXT2_NOATIME_FL | EXT2_COMPRBLK_FL|\ +			   EXT2_SYNC_FL | EXT2_NODUMP_FL |\ +			   EXT2_NOATIME_FL | EXT2_COMPRBLK_FL |\  			   EXT2_NOCOMP_FL | EXT2_JOURNAL_DATA_FL |\  			   EXT2_NOTAIL_FL | EXT2_DIRSYNC_FL) diff --git a/include/linux/ext3_fs.h b/include/linux/ext3_fs.h index 67a803aee61..dec99116a0e 100644 --- a/include/linux/ext3_fs.h +++ b/include/linux/ext3_fs.h @@ -180,8 +180,8 @@ struct ext3_group_desc  /* Flags that should be inherited by new inodes from their parent. */  #define EXT3_FL_INHERITED (EXT3_SECRM_FL | EXT3_UNRM_FL | EXT3_COMPR_FL |\ -			   EXT3_SYNC_FL | EXT3_IMMUTABLE_FL | EXT3_APPEND_FL |\ -			   EXT3_NODUMP_FL | EXT3_NOATIME_FL | EXT3_COMPRBLK_FL|\ +			   EXT3_SYNC_FL | EXT3_NODUMP_FL |\ +			   EXT3_NOATIME_FL | EXT3_COMPRBLK_FL |\  			   EXT3_NOCOMPR_FL | EXT3_JOURNAL_DATA_FL |\  			   EXT3_NOTAIL_FL | EXT3_DIRSYNC_FL) @@ -381,7 +381,7 @@ struct ext3_inode {   * Mount flags   */  #define EXT3_MOUNT_CHECK		0x00001	/* Do mount-time checks */ -#define EXT3_MOUNT_OLDALLOC		0x00002  /* Don't use the new Orlov allocator */ +/* EXT3_MOUNT_OLDALLOC was there */  #define EXT3_MOUNT_GRPID		0x00004	/* Create files with directory's group */  #define EXT3_MOUNT_DEBUG		0x00008	/* Some debugging messages */  #define EXT3_MOUNT_ERRORS_CONT		0x00010	/* Continue on errors */ @@ -937,15 +937,15 @@ extern int ext3_group_extend(struct super_block *sb,  				ext3_fsblk_t n_blocks_count);  /* super.c */ -extern void ext3_error (struct super_block *, const char *, const char *, ...) -	__attribute__ ((format (printf, 3, 4))); +extern __printf(3, 4) +void ext3_error(struct super_block *, const char *, const char *, ...);  extern void __ext3_std_error (struct super_block *, const char *, int); -extern void ext3_abort (struct super_block *, const char *, const char *, ...) -	__attribute__ ((format (printf, 3, 4))); -extern void ext3_warning (struct super_block *, const char *, const char *, ...) -	__attribute__ ((format (printf, 3, 4))); -extern void ext3_msg(struct super_block *, const char *, const char *, ...) -	__attribute__ ((format (printf, 3, 4))); +extern __printf(3, 4) +void ext3_abort(struct super_block *, const char *, const char *, ...); +extern __printf(3, 4) +void ext3_warning(struct super_block *, const char *, const char *, ...); +extern __printf(3, 4) +void ext3_msg(struct super_block *, const char *, const char *, ...);  extern void ext3_update_dynamic_rev (struct super_block *sb);  #define ext3_std_error(sb, errno)				\ diff --git a/include/linux/ext3_fs_sb.h b/include/linux/ext3_fs_sb.h index 258088ab3c6..64365252f1b 100644 --- a/include/linux/ext3_fs_sb.h +++ b/include/linux/ext3_fs_sb.h @@ -76,10 +76,6 @@ struct ext3_sb_info {  	struct mutex s_resize_lock;  	unsigned long s_commit_interval;  	struct block_device *journal_bdev; -#ifdef CONFIG_JBD_DEBUG -	struct timer_list turn_ro_timer;	/* For turning read-only (crash simulation) */ -	wait_queue_head_t ro_wait_queue;	/* For people waiting for the fs to go read-only */ -#endif  #ifdef CONFIG_QUOTA  	char *s_qf_names[MAXQUOTAS];		/* Names of quota files with journalled quota */  	int s_jquota_fmt;			/* Format of quota to use */ diff --git a/include/linux/filter.h b/include/linux/filter.h index 741956fa5bf..8eeb205f298 100644 --- a/include/linux/filter.h +++ b/include/linux/filter.h @@ -155,7 +155,7 @@ extern unsigned int sk_run_filter(const struct sk_buff *skb,  				  const struct sock_filter *filter);  extern int sk_attach_filter(struct sock_fprog *fprog, struct sock *sk);  extern int sk_detach_filter(struct sock *sk); -extern int sk_chk_filter(struct sock_filter *filter, int flen); +extern int sk_chk_filter(struct sock_filter *filter, unsigned int flen);  #ifdef CONFIG_BPF_JIT  extern void bpf_jit_compile(struct sk_filter *fp); diff --git a/include/linux/freezer.h b/include/linux/freezer.h index 1effc8b56b4..a5386e3ee75 100644 --- a/include/linux/freezer.h +++ b/include/linux/freezer.h @@ -49,6 +49,7 @@ extern int thaw_process(struct task_struct *p);  extern void refrigerator(void);  extern int freeze_processes(void); +extern int freeze_kernel_threads(void);  extern void thaw_processes(void);  static inline int try_to_freeze(void) @@ -134,10 +135,20 @@ static inline void set_freezable_with_signal(void)  }  /* - * Freezer-friendly wrappers around wait_event_interruptible() and - * wait_event_interruptible_timeout(), originally defined in <linux/wait.h> + * Freezer-friendly wrappers around wait_event_interruptible(), + * wait_event_killable() and wait_event_interruptible_timeout(), originally + * defined in <linux/wait.h>   */ +#define wait_event_freezekillable(wq, condition)			\ +({									\ +	int __retval;							\ +	freezer_do_not_count();						\ +	__retval = wait_event_killable(wq, (condition));		\ +	freezer_count();						\ +	__retval;							\ +}) +  #define wait_event_freezable(wq, condition)				\  ({									\  	int __retval;							\ @@ -171,7 +182,8 @@ static inline void clear_freeze_flag(struct task_struct *p) {}  static inline int thaw_process(struct task_struct *p) { return 1; }  static inline void refrigerator(void) {} -static inline int freeze_processes(void) { BUG(); return 0; } +static inline int freeze_processes(void) { return -ENOSYS; } +static inline int freeze_kernel_threads(void) { return -ENOSYS; }  static inline void thaw_processes(void) {}  static inline int try_to_freeze(void) { return 0; } @@ -188,6 +200,9 @@ static inline void set_freezable_with_signal(void) {}  #define wait_event_freezable_timeout(wq, condition, timeout)		\  		wait_event_interruptible_timeout(wq, condition, timeout) +#define wait_event_freezekillable(wq, condition)		\ +		wait_event_killable(wq, condition) +  #endif /* !CONFIG_FREEZER */  #endif	/* FREEZER_H_INCLUDED */ diff --git a/include/linux/fs.h b/include/linux/fs.h index 277f497923a..0c4df261af7 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -58,14 +58,15 @@ struct inodes_stat_t {  #define NR_FILE  8192	/* this can well be larger on a larger system */ -#define MAY_EXEC 1 -#define MAY_WRITE 2 -#define MAY_READ 4 -#define MAY_APPEND 8 -#define MAY_ACCESS 16 -#define MAY_OPEN 32 -#define MAY_CHDIR 64 -#define MAY_NOT_BLOCK 128	/* called from RCU mode, don't block */ +#define MAY_EXEC		0x00000001 +#define MAY_WRITE		0x00000002 +#define MAY_READ		0x00000004 +#define MAY_APPEND		0x00000008 +#define MAY_ACCESS		0x00000010 +#define MAY_OPEN		0x00000020 +#define MAY_CHDIR		0x00000040 +/* called from RCU mode, don't block */ +#define MAY_NOT_BLOCK		0x00000080  /*   * flags in file.f_mode.  Note that FMODE_READ and FMODE_WRITE must correspond @@ -767,14 +768,25 @@ struct inode {  	/* Stat data, not accessed from path walking */  	unsigned long		i_ino; -	unsigned int		i_nlink; +	/* +	 * Filesystems may only read i_nlink directly.  They shall use the +	 * following functions for modification: +	 * +	 *    (set|clear|inc|drop)_nlink +	 *    inode_(inc|dec)_link_count +	 */ +	union { +		const unsigned int i_nlink; +		unsigned int __i_nlink; +	};  	dev_t			i_rdev; -	loff_t			i_size;  	struct timespec		i_atime;  	struct timespec		i_mtime;  	struct timespec		i_ctime; -	unsigned int		i_blkbits; +	spinlock_t		i_lock;	/* i_blocks, i_bytes, maybe i_size */ +	unsigned short          i_bytes;  	blkcnt_t		i_blocks; +	loff_t			i_size;  #ifdef __NEED_I_SIZE_ORDERED  	seqcount_t		i_size_seqcount; @@ -782,7 +794,6 @@ struct inode {  	/* Misc */  	unsigned long		i_state; -	spinlock_t		i_lock;	/* i_blocks, i_bytes, maybe i_size */  	struct mutex		i_mutex;  	unsigned long		dirtied_when;	/* jiffies of first dirtying */ @@ -796,9 +807,10 @@ struct inode {  		struct rcu_head		i_rcu;  	};  	atomic_t		i_count; +	unsigned int		i_blkbits;  	u64			i_version; -	unsigned short          i_bytes;  	atomic_t		i_dio_count; +	atomic_t		i_writecount;  	const struct file_operations	*i_fop;	/* former ->i_op->default_file_ops */  	struct file_lock	*i_flock;  	struct address_space	i_data; @@ -822,7 +834,6 @@ struct inode {  #ifdef CONFIG_IMA  	atomic_t		i_readcount; /* struct files open RO */  #endif -	atomic_t		i_writecount;  	void			*i_private; /* fs or device private pointer */  }; @@ -963,7 +974,12 @@ struct file {  #define f_dentry	f_path.dentry  #define f_vfsmnt	f_path.mnt  	const struct file_operations	*f_op; -	spinlock_t		f_lock;  /* f_ep_links, f_flags, no IRQ */ + +	/* +	 * Protects f_ep_links, f_flags, f_pos vs i_size in lseek SEEK_CUR. +	 * Must not be taken from IRQ context. +	 */ +	spinlock_t		f_lock;  #ifdef CONFIG_SMP  	int			f_sb_list_cpu;  #endif @@ -1063,6 +1079,8 @@ static inline int file_check_writeable(struct file *filp)  #define FL_LEASE	32	/* lease held on this file */  #define FL_CLOSE	64	/* unlock on close */  #define FL_SLEEP	128	/* A blocking lock */ +#define FL_DOWNGRADE_PENDING	256 /* Lease is being downgraded */ +#define FL_UNLOCK_PENDING	512 /* Lease is being broken */  /*   * Special return value from posix_lock_file() and vfs_lock_file() for @@ -1109,7 +1127,7 @@ struct file_lock {  	struct list_head fl_link;	/* doubly linked list of all locks */  	struct list_head fl_block;	/* circular list of blocked processes */  	fl_owner_t fl_owner; -	unsigned char fl_flags; +	unsigned int fl_flags;  	unsigned char fl_type;  	unsigned int fl_pid;  	struct pid *fl_nspid; @@ -1119,7 +1137,9 @@ struct file_lock {  	loff_t fl_end;  	struct fasync_struct *	fl_fasync; /* for lease break notifications */ -	unsigned long fl_break_time;	/* for nonblocking lease breaks */ +	/* for lease breaks: */ +	unsigned long fl_break_time; +	unsigned long fl_downgrade_time;  	const struct file_lock_operations *fl_ops;	/* Callbacks for filesystems */  	const struct lock_manager_operations *fl_lmops;	/* Callbacks for lockmanagers */ @@ -1623,9 +1643,10 @@ struct inode_operations {  struct seq_file;  ssize_t rw_copy_check_uvector(int type, const struct iovec __user * uvector, -				unsigned long nr_segs, unsigned long fast_segs, -				struct iovec *fast_pointer, -				struct iovec **ret_pointer); +			      unsigned long nr_segs, unsigned long fast_segs, +			      struct iovec *fast_pointer, +			      struct iovec **ret_pointer, +			      int check_access);  extern ssize_t vfs_read(struct file *, char __user *, size_t, loff_t *);  extern ssize_t vfs_write(struct file *, const char __user *, size_t, loff_t *); @@ -1744,6 +1765,19 @@ static inline void mark_inode_dirty_sync(struct inode *inode)  }  /** + * set_nlink - directly set an inode's link count + * @inode: inode + * @nlink: new nlink (should be non-zero) + * + * This is a low-level filesystem helper to replace any + * direct filesystem manipulation of i_nlink. + */ +static inline void set_nlink(struct inode *inode, unsigned int nlink) +{ +	inode->__i_nlink = nlink; +} + +/**   * inc_nlink - directly increment an inode's link count   * @inode: inode   * @@ -1753,7 +1787,7 @@ static inline void mark_inode_dirty_sync(struct inode *inode)   */  static inline void inc_nlink(struct inode *inode)  { -	inode->i_nlink++; +	inode->__i_nlink++;  }  static inline void inode_inc_link_count(struct inode *inode) @@ -1775,7 +1809,7 @@ static inline void inode_inc_link_count(struct inode *inode)   */  static inline void drop_nlink(struct inode *inode)  { -	inode->i_nlink--; +	inode->__i_nlink--;  }  /** @@ -1788,7 +1822,7 @@ static inline void drop_nlink(struct inode *inode)   */  static inline void clear_nlink(struct inode *inode)  { -	inode->i_nlink = 0; +	inode->__i_nlink = 0;  }  static inline void inode_dec_link_count(struct inode *inode) @@ -2397,8 +2431,8 @@ 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, -			int origin); +extern loff_t generic_file_llseek_size(struct file *file, loff_t offset, +		int origin, loff_t maxsize);  extern int generic_file_open(struct inode * inode, struct file * filp);  extern int nonseekable_open(struct inode * inode, struct file * filp); @@ -2624,8 +2658,8 @@ static const struct file_operations __fops = {				\  	.llseek	 = generic_file_llseek,					\  }; -static inline void __attribute__((format(printf, 1, 2))) -__simple_attr_check_format(const char *fmt, ...) +static inline __printf(1, 2) +void __simple_attr_check_format(const char *fmt, ...)  {  	/* don't do anything, just let the compiler check the arguments; */  } diff --git a/include/linux/fscache-cache.h b/include/linux/fscache-cache.h index af095b54502..ce31408b1e4 100644 --- a/include/linux/fscache-cache.h +++ b/include/linux/fscache-cache.h @@ -492,10 +492,10 @@ static inline void fscache_end_io(struct fscache_retrieval *op,  /*   * out-of-line cache backend functions   */ -extern void fscache_init_cache(struct fscache_cache *cache, -			       const struct fscache_cache_ops *ops, -			       const char *idfmt, -			       ...) __attribute__ ((format (printf, 3, 4))); +extern __printf(3, 4) +void fscache_init_cache(struct fscache_cache *cache, +			const struct fscache_cache_ops *ops, +			const char *idfmt, ...);  extern int fscache_add_cache(struct fscache_cache *cache,  			     struct fscache_object *fsdef, diff --git a/include/linux/fsl-diu-fb.h b/include/linux/fsl-diu-fb.h index daa9952d217..11c16a1fb9e 100644 --- a/include/linux/fsl-diu-fb.h +++ b/include/linux/fsl-diu-fb.h @@ -20,18 +20,8 @@  #ifndef __FSL_DIU_FB_H__  #define __FSL_DIU_FB_H__ -/* Arbitrary threshold to determine the allocation method - * See mpc8610fb_set_par(), map_video_memory(), and unmap_video_memory() - */ -#define MEM_ALLOC_THRESHOLD (1024*768*4+32) -  #include <linux/types.h> -struct mfb_alpha { -	int enable; -	int alpha; -}; -  struct mfb_chroma_key {  	int enable;  	__u8  red_max; @@ -43,25 +33,29 @@ struct mfb_chroma_key {  };  struct aoi_display_offset { -	int x_aoi_d; -	int y_aoi_d; +	__s32 x_aoi_d; +	__s32 y_aoi_d;  };  #define MFB_SET_CHROMA_KEY	_IOW('M', 1, struct mfb_chroma_key)  #define MFB_SET_BRIGHTNESS	_IOW('M', 3, __u8) +#define MFB_SET_ALPHA		_IOW('M', 0, __u8) +#define MFB_GET_ALPHA		_IOR('M', 0, __u8) +#define MFB_SET_AOID		_IOW('M', 4, struct aoi_display_offset) +#define MFB_GET_AOID		_IOR('M', 4, struct aoi_display_offset) +#define MFB_SET_PIXFMT		_IOW('M', 8, __u32) +#define MFB_GET_PIXFMT		_IOR('M', 8, __u32) -#define MFB_SET_ALPHA		0x80014d00 -#define MFB_GET_ALPHA		0x40014d00 -#define MFB_SET_AOID		0x80084d04 -#define MFB_GET_AOID		0x40084d04 -#define MFB_SET_PIXFMT		0x80014d08 -#define MFB_GET_PIXFMT		0x40014d08 - -#define FBIOGET_GWINFO		0x46E0 -#define FBIOPUT_GWINFO		0x46E1 +/* + * The original definitions of MFB_SET_PIXFMT and MFB_GET_PIXFMT used the + * wrong value for 'size' field of the ioctl.  The current macros above use the + * right size, but we still need to provide backwards compatibility, at least + * for a while. +*/ +#define MFB_SET_PIXFMT_OLD	0x80014d08 +#define MFB_GET_PIXFMT_OLD	0x40014d08  #ifdef __KERNEL__ -#include <linux/spinlock.h>  /*   * These are the fields of area descriptor(in DDR memory) for every plane @@ -159,58 +153,12 @@ struct diu {  	__be32 plut;  } __attribute__ ((packed)); -struct diu_hw { -	struct diu *diu_reg; -	spinlock_t reg_lock; - -	__u32 mode;		/* DIU operation mode */ -}; - -struct diu_addr { -	__u8 __iomem *vaddr;	/* Virtual address */ -	dma_addr_t paddr;	/* Physical address */ -	__u32 	   offset; -}; - -struct diu_pool { -	struct diu_addr ad; -	struct diu_addr gamma; -	struct diu_addr pallete; -	struct diu_addr cursor; -}; - -#define FSL_DIU_BASE_OFFSET	0x2C000	/* Offset of DIU */ -#define INT_LCDC		64	/* DIU interrupt number */ - -#define FSL_AOI_NUM	6	/* 5 AOIs and one dummy AOI */ -				/* 1 for plane 0, 2 for plane 1&2 each */ - -/* Minimum X and Y resolutions */ -#define MIN_XRES	64 -#define MIN_YRES	64 - -/* HW cursor parameters */ -#define MAX_CURS		32 - -/* Modes of operation of DIU */ +/* + * Modes of operation of DIU.  The DIU supports five different modes, but + * the driver only supports modes 0 and 1. + */  #define MFB_MODE0	0	/* DIU off */  #define MFB_MODE1	1	/* All three planes output to display */ -#define MFB_MODE2	2	/* Plane 1 to display, planes 2+3 written back*/ -#define MFB_MODE3	3	/* All three planes written back to memory */ -#define MFB_MODE4	4	/* Color bar generation */ - -/* INT_STATUS/INT_MASK field descriptions */ -#define INT_VSYNC	0x01	/* Vsync interrupt  */ -#define INT_VSYNC_WB	0x02	/* Vsync interrupt for write back operation */ -#define INT_UNDRUN	0x04	/* Under run exception interrupt */ -#define INT_PARERR	0x08	/* Display parameters error interrupt */ -#define INT_LS_BF_VS	0x10	/* Lines before vsync. interrupt */ - -/* Panels'operation modes */ -#define MFB_TYPE_OUTPUT	0	/* Panel output to display */ -#define MFB_TYPE_OFF	1	/* Panel off */ -#define MFB_TYPE_WB	2	/* Panel written back to memory */ -#define MFB_TYPE_TEST	3	/* Panel generate color bar */  #endif /* __KERNEL__ */  #endif /* __FSL_DIU_FB_H__ */ diff --git a/include/linux/gameport.h b/include/linux/gameport.h index b65a6f47277..069ee413910 100644 --- a/include/linux/gameport.h +++ b/include/linux/gameport.h @@ -78,8 +78,8 @@ static inline void gameport_register_port(struct gameport *gameport)  void gameport_unregister_port(struct gameport *gameport); -void gameport_set_phys(struct gameport *gameport, const char *fmt, ...) -	__attribute__ ((format (printf, 2, 3))); +__printf(2, 3) +void gameport_set_phys(struct gameport *gameport, const char *fmt, ...);  #else @@ -93,8 +93,8 @@ static inline void gameport_unregister_port(struct gameport *gameport)  	return;  } -static inline void gameport_set_phys(struct gameport *gameport, -				     const char *fmt, ...) +static inline __printf(2, 3) +void gameport_set_phys(struct gameport *gameport, const char *fmt, ...)  {  	return;  } diff --git a/include/linux/genhd.h b/include/linux/genhd.h index 02fa4697a0e..9de31bc98c8 100644 --- a/include/linux/genhd.h +++ b/include/linux/genhd.h @@ -21,6 +21,8 @@  #define dev_to_part(device)	container_of((device), struct hd_struct, __dev)  #define disk_to_dev(disk)	(&(disk)->part0.__dev)  #define part_to_dev(part)	(&((part)->__dev)) +#define alias_name(disk)	((disk)->alias ? (disk)->alias : \ +						 (disk)->disk_name)  extern struct device_type part_type;  extern struct kobject *block_depr; @@ -58,6 +60,7 @@ enum {  #define DISK_MAX_PARTS			256  #define DISK_NAME_LEN			32 +#define ALIAS_LEN			256  #include <linux/major.h>  #include <linux/device.h> @@ -128,6 +131,7 @@ struct hd_struct {  #define GENHD_FL_EXT_DEVT			64 /* allow extended devt */  #define GENHD_FL_NATIVE_CAPACITY		128  #define GENHD_FL_BLOCK_EVENTS_ON_EXCL_WRITE	256 +#define GENHD_FL_NO_PART_SCAN			512  enum {  	DISK_EVENT_MEDIA_CHANGE			= 1 << 0, /* media changed */ @@ -162,6 +166,7 @@ struct gendisk {                                           * disks that can't be partitioned. */  	char disk_name[DISK_NAME_LEN];	/* name of major driver */ +	char *alias;			/* alias name of disk */  	char *(*devnode)(struct gendisk *gd, mode_t *mode);  	unsigned int events;		/* supported events */ @@ -234,9 +239,10 @@ static inline int disk_max_parts(struct gendisk *disk)  	return disk->minors;  } -static inline bool disk_partitionable(struct gendisk *disk) +static inline bool disk_part_scan_enabled(struct gendisk *disk)  { -	return disk_max_parts(disk) > 1; +	return disk_max_parts(disk) > 1 && +		!(disk->flags & GENHD_FL_NO_PART_SCAN);  }  static inline dev_t disk_devt(struct gendisk *disk) diff --git a/include/linux/gpio.h b/include/linux/gpio.h index 17b5a0d80e4..38ac48b7d3a 100644 --- a/include/linux/gpio.h +++ b/include/linux/gpio.h @@ -14,6 +14,18 @@  #define GPIOF_OUT_INIT_LOW	(GPIOF_DIR_OUT | GPIOF_INIT_LOW)  #define GPIOF_OUT_INIT_HIGH	(GPIOF_DIR_OUT | GPIOF_INIT_HIGH) +/** + * struct gpio - a structure describing a GPIO with configuration + * @gpio:	the GPIO number + * @flags:	GPIO configuration as specified by GPIOF_* + * @label:	a literal description string of this GPIO + */ +struct gpio { +	unsigned	gpio; +	unsigned long	flags; +	const char	*label; +}; +  #ifdef CONFIG_GENERIC_GPIO  #include <asm/gpio.h> @@ -24,18 +36,8 @@  #include <linux/errno.h>  struct device; -struct gpio;  struct gpio_chip; -/* - * Some platforms don't support the GPIO programming interface. - * - * In case some driver uses it anyway (it should normally have - * depended on GENERIC_GPIO), these routines help the compiler - * optimize out much GPIO-related code ... or trigger a runtime - * warning when something is wrongly called. - */ -  static inline bool gpio_is_valid(int number)  {  	return false; diff --git a/include/linux/hid.h b/include/linux/hid.h index 9cf8e7ae745..deed5f9a1e1 100644 --- a/include/linux/hid.h +++ b/include/linux/hid.h @@ -71,6 +71,7 @@  #include <linux/timer.h>  #include <linux/workqueue.h>  #include <linux/input.h> +#include <linux/semaphore.h>  /*   * We parse each description item into this structure. Short items data @@ -312,6 +313,7 @@ struct hid_item {  #define HID_QUIRK_BADPAD			0x00000020  #define HID_QUIRK_MULTI_INPUT			0x00000040  #define HID_QUIRK_HIDINPUT_FORCE		0x00000080 +#define HID_QUIRK_MULTITOUCH			0x00000100  #define HID_QUIRK_SKIP_OUTPUT_REPORTS		0x00010000  #define HID_QUIRK_FULLSPEED_INTERVAL		0x10000000  #define HID_QUIRK_NO_INIT_REPORTS		0x20000000 @@ -475,6 +477,7 @@ struct hid_device {							/* device report descriptor */  	unsigned country;						/* HID country */  	struct hid_report_enum report_enum[HID_REPORT_TYPES]; +	struct semaphore driver_lock;					/* protects the current driver */  	struct device dev;						/* device */  	struct hid_driver *driver;  	struct hid_ll_driver *ll_driver; diff --git a/include/linux/huge_mm.h b/include/linux/huge_mm.h index 48c32ebf65a..a9ace9c3250 100644 --- a/include/linux/huge_mm.h +++ b/include/linux/huge_mm.h @@ -22,6 +22,11 @@ extern int zap_huge_pmd(struct mmu_gather *tlb,  extern int mincore_huge_pmd(struct vm_area_struct *vma, pmd_t *pmd,  			unsigned long addr, unsigned long end,  			unsigned char *vec); +extern int move_huge_pmd(struct vm_area_struct *vma, +			 struct vm_area_struct *new_vma, +			 unsigned long old_addr, +			 unsigned long new_addr, unsigned long old_end, +			 pmd_t *old_pmd, pmd_t *new_pmd);  extern int change_huge_pmd(struct vm_area_struct *vma, pmd_t *pmd,  			unsigned long addr, pgprot_t newprot); diff --git a/include/linux/hwspinlock.h b/include/linux/hwspinlock.h index 8390efc457e..08a2fee4065 100644 --- a/include/linux/hwspinlock.h +++ b/include/linux/hwspinlock.h @@ -20,17 +20,49 @@  #include <linux/err.h>  #include <linux/sched.h> +#include <linux/device.h>  /* hwspinlock mode argument */  #define HWLOCK_IRQSTATE	0x01	/* Disable interrupts, save state */  #define HWLOCK_IRQ	0x02	/* Disable interrupts, don't save state */  struct hwspinlock; +struct hwspinlock_device; +struct hwspinlock_ops; + +/** + * struct hwspinlock_pdata - platform data for hwspinlock drivers + * @base_id: base id for this hwspinlock device + * + * hwspinlock devices provide system-wide hardware locks that are used + * by remote processors that have no other way to achieve synchronization. + * + * To achieve that, each physical lock must have a system-wide id number + * that is agreed upon, otherwise remote processors can't possibly assume + * they're using the same hardware lock. + * + * Usually boards have a single hwspinlock device, which provides several + * hwspinlocks, and in this case, they can be trivially numbered 0 to + * (num-of-locks - 1). + * + * In case boards have several hwspinlocks devices, a different base id + * should be used for each hwspinlock device (they can't all use 0 as + * a starting id!). + * + * This platform data structure should be used to provide the base id + * for each device (which is trivially 0 when only a single hwspinlock + * device exists). It can be shared between different platforms, hence + * its location. + */ +struct hwspinlock_pdata { +	int base_id; +};  #if defined(CONFIG_HWSPINLOCK) || defined(CONFIG_HWSPINLOCK_MODULE) -int hwspin_lock_register(struct hwspinlock *lock); -struct hwspinlock *hwspin_lock_unregister(unsigned int id); +int hwspin_lock_register(struct hwspinlock_device *bank, struct device *dev, +		const struct hwspinlock_ops *ops, int base_id, int num_locks); +int hwspin_lock_unregister(struct hwspinlock_device *bank);  struct hwspinlock *hwspin_lock_request(void);  struct hwspinlock *hwspin_lock_request_specific(unsigned int id);  int hwspin_lock_free(struct hwspinlock *hwlock); @@ -94,16 +126,6 @@ static inline int hwspin_lock_get_id(struct hwspinlock *hwlock)  	return 0;  } -static inline int hwspin_lock_register(struct hwspinlock *hwlock) -{ -	return -ENODEV; -} - -static inline struct hwspinlock *hwspin_lock_unregister(unsigned int id) -{ -	return NULL; -} -  #endif /* !CONFIG_HWSPINLOCK */  /** diff --git a/include/linux/hyperv.h b/include/linux/hyperv.h new file mode 100644 index 00000000000..12ec328481d --- /dev/null +++ b/include/linux/hyperv.h @@ -0,0 +1,873 @@ +/* + * + * Copyright (c) 2011, Microsoft Corporation. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., 59 Temple + * Place - Suite 330, Boston, MA 02111-1307 USA. + * + * Authors: + *   Haiyang Zhang <haiyangz@microsoft.com> + *   Hank Janssen  <hjanssen@microsoft.com> + *   K. Y. Srinivasan <kys@microsoft.com> + * + */ + +#ifndef _HYPERV_H +#define _HYPERV_H + +#include <linux/scatterlist.h> +#include <linux/list.h> +#include <linux/uuid.h> +#include <linux/timer.h> +#include <linux/workqueue.h> +#include <linux/completion.h> +#include <linux/device.h> +#include <linux/mod_devicetable.h> + + +#define MAX_PAGE_BUFFER_COUNT				16 +#define MAX_MULTIPAGE_BUFFER_COUNT			32 /* 128K */ + +#pragma pack(push, 1) + +/* Single-page buffer */ +struct hv_page_buffer { +	u32 len; +	u32 offset; +	u64 pfn; +}; + +/* Multiple-page buffer */ +struct hv_multipage_buffer { +	/* Length and Offset determines the # of pfns in the array */ +	u32 len; +	u32 offset; +	u64 pfn_array[MAX_MULTIPAGE_BUFFER_COUNT]; +}; + +/* 0x18 includes the proprietary packet header */ +#define MAX_PAGE_BUFFER_PACKET		(0x18 +			\ +					(sizeof(struct hv_page_buffer) * \ +					 MAX_PAGE_BUFFER_COUNT)) +#define MAX_MULTIPAGE_BUFFER_PACKET	(0x18 +			\ +					 sizeof(struct hv_multipage_buffer)) + + +#pragma pack(pop) + +struct hv_ring_buffer { +	/* Offset in bytes from the start of ring data below */ +	u32 write_index; + +	/* Offset in bytes from the start of ring data below */ +	u32 read_index; + +	u32 interrupt_mask; + +	/* Pad it to PAGE_SIZE so that data starts on page boundary */ +	u8	reserved[4084]; + +	/* NOTE: +	 * The interrupt_mask field is used only for channels but since our +	 * vmbus connection also uses this data structure and its data starts +	 * here, we commented out this field. +	 */ + +	/* +	 * Ring data starts here + RingDataStartOffset +	 * !!! DO NOT place any fields below this !!! +	 */ +	u8 buffer[0]; +} __packed; + +struct hv_ring_buffer_info { +	struct hv_ring_buffer *ring_buffer; +	u32 ring_size;			/* Include the shared header */ +	spinlock_t ring_lock; + +	u32 ring_datasize;		/* < ring_size */ +	u32 ring_data_startoffset; +}; + +struct hv_ring_buffer_debug_info { +	u32 current_interrupt_mask; +	u32 current_read_index; +	u32 current_write_index; +	u32 bytes_avail_toread; +	u32 bytes_avail_towrite; +}; + +/* + * We use the same version numbering for all Hyper-V modules. + * + * Definition of versioning is as follows; + * + *	Major Number	Changes for these scenarios; + *			1.	When a new version of Windows Hyper-V + *				is released. + *			2.	A Major change has occurred in the + *				Linux IC's. + *			(For example the merge for the first time + *			into the kernel) Every time the Major Number + *			changes, the Revision number is reset to 0. + *	Minor Number	Changes when new functionality is added + *			to the Linux IC's that is not a bug fix. + * + * 3.1 - Added completed hv_utils driver. Shutdown/Heartbeat/Timesync + */ +#define HV_DRV_VERSION           "3.1" + + +/* + * A revision number of vmbus that is used for ensuring both ends on a + * partition are using compatible versions. + */ +#define VMBUS_REVISION_NUMBER		13 + +/* Make maximum size of pipe payload of 16K */ +#define MAX_PIPE_DATA_PAYLOAD		(sizeof(u8) * 16384) + +/* Define PipeMode values. */ +#define VMBUS_PIPE_TYPE_BYTE		0x00000000 +#define VMBUS_PIPE_TYPE_MESSAGE		0x00000004 + +/* The size of the user defined data buffer for non-pipe offers. */ +#define MAX_USER_DEFINED_BYTES		120 + +/* The size of the user defined data buffer for pipe offers. */ +#define MAX_PIPE_USER_DEFINED_BYTES	116 + +/* + * At the center of the Channel Management library is the Channel Offer. This + * struct contains the fundamental information about an offer. + */ +struct vmbus_channel_offer { +	uuid_le if_type; +	uuid_le if_instance; +	u64 int_latency; /* in 100ns units */ +	u32 if_revision; +	u32 server_ctx_size;	/* in bytes */ +	u16 chn_flags; +	u16 mmio_megabytes;		/* in bytes * 1024 * 1024 */ + +	union { +		/* Non-pipes: The user has MAX_USER_DEFINED_BYTES bytes. */ +		struct { +			unsigned char user_def[MAX_USER_DEFINED_BYTES]; +		} std; + +		/* +		 * Pipes: +		 * The following sructure is an integrated pipe protocol, which +		 * is implemented on top of standard user-defined data. Pipe +		 * clients have MAX_PIPE_USER_DEFINED_BYTES left for their own +		 * use. +		 */ +		struct { +			u32  pipe_mode; +			unsigned char user_def[MAX_PIPE_USER_DEFINED_BYTES]; +		} pipe; +	} u; +	u32 padding; +} __packed; + +/* Server Flags */ +#define VMBUS_CHANNEL_ENUMERATE_DEVICE_INTERFACE	1 +#define VMBUS_CHANNEL_SERVER_SUPPORTS_TRANSFER_PAGES	2 +#define VMBUS_CHANNEL_SERVER_SUPPORTS_GPADLS		4 +#define VMBUS_CHANNEL_NAMED_PIPE_MODE			0x10 +#define VMBUS_CHANNEL_LOOPBACK_OFFER			0x100 +#define VMBUS_CHANNEL_PARENT_OFFER			0x200 +#define VMBUS_CHANNEL_REQUEST_MONITORED_NOTIFICATION	0x400 + +struct vmpacket_descriptor { +	u16 type; +	u16 offset8; +	u16 len8; +	u16 flags; +	u64 trans_id; +} __packed; + +struct vmpacket_header { +	u32 prev_pkt_start_offset; +	struct vmpacket_descriptor descriptor; +} __packed; + +struct vmtransfer_page_range { +	u32 byte_count; +	u32 byte_offset; +} __packed; + +struct vmtransfer_page_packet_header { +	struct vmpacket_descriptor d; +	u16 xfer_pageset_id; +	bool sender_owns_set; +	u8 reserved; +	u32 range_cnt; +	struct vmtransfer_page_range ranges[1]; +} __packed; + +struct vmgpadl_packet_header { +	struct vmpacket_descriptor d; +	u32 gpadl; +	u32 reserved; +} __packed; + +struct vmadd_remove_transfer_page_set { +	struct vmpacket_descriptor d; +	u32 gpadl; +	u16 xfer_pageset_id; +	u16 reserved; +} __packed; + +/* + * This structure defines a range in guest physical space that can be made to + * look virtually contiguous. + */ +struct gpa_range { +	u32 byte_count; +	u32 byte_offset; +	u64 pfn_array[0]; +}; + +/* + * This is the format for an Establish Gpadl packet, which contains a handle by + * which this GPADL will be known and a set of GPA ranges associated with it. + * This can be converted to a MDL by the guest OS.  If there are multiple GPA + * ranges, then the resulting MDL will be "chained," representing multiple VA + * ranges. + */ +struct vmestablish_gpadl { +	struct vmpacket_descriptor d; +	u32 gpadl; +	u32 range_cnt; +	struct gpa_range range[1]; +} __packed; + +/* + * This is the format for a Teardown Gpadl packet, which indicates that the + * GPADL handle in the Establish Gpadl packet will never be referenced again. + */ +struct vmteardown_gpadl { +	struct vmpacket_descriptor d; +	u32 gpadl; +	u32 reserved;	/* for alignment to a 8-byte boundary */ +} __packed; + +/* + * This is the format for a GPA-Direct packet, which contains a set of GPA + * ranges, in addition to commands and/or data. + */ +struct vmdata_gpa_direct { +	struct vmpacket_descriptor d; +	u32 reserved; +	u32 range_cnt; +	struct gpa_range range[1]; +} __packed; + +/* This is the format for a Additional Data Packet. */ +struct vmadditional_data { +	struct vmpacket_descriptor d; +	u64 total_bytes; +	u32 offset; +	u32 byte_cnt; +	unsigned char data[1]; +} __packed; + +union vmpacket_largest_possible_header { +	struct vmpacket_descriptor simple_hdr; +	struct vmtransfer_page_packet_header xfer_page_hdr; +	struct vmgpadl_packet_header gpadl_hdr; +	struct vmadd_remove_transfer_page_set add_rm_xfer_page_hdr; +	struct vmestablish_gpadl establish_gpadl_hdr; +	struct vmteardown_gpadl teardown_gpadl_hdr; +	struct vmdata_gpa_direct data_gpa_direct_hdr; +}; + +#define VMPACKET_DATA_START_ADDRESS(__packet)	\ +	(void *)(((unsigned char *)__packet) +	\ +	 ((struct vmpacket_descriptor)__packet)->offset8 * 8) + +#define VMPACKET_DATA_LENGTH(__packet)		\ +	((((struct vmpacket_descriptor)__packet)->len8 -	\ +	  ((struct vmpacket_descriptor)__packet)->offset8) * 8) + +#define VMPACKET_TRANSFER_MODE(__packet)	\ +	(((struct IMPACT)__packet)->type) + +enum vmbus_packet_type { +	VM_PKT_INVALID				= 0x0, +	VM_PKT_SYNCH				= 0x1, +	VM_PKT_ADD_XFER_PAGESET			= 0x2, +	VM_PKT_RM_XFER_PAGESET			= 0x3, +	VM_PKT_ESTABLISH_GPADL			= 0x4, +	VM_PKT_TEARDOWN_GPADL			= 0x5, +	VM_PKT_DATA_INBAND			= 0x6, +	VM_PKT_DATA_USING_XFER_PAGES		= 0x7, +	VM_PKT_DATA_USING_GPADL			= 0x8, +	VM_PKT_DATA_USING_GPA_DIRECT		= 0x9, +	VM_PKT_CANCEL_REQUEST			= 0xa, +	VM_PKT_COMP				= 0xb, +	VM_PKT_DATA_USING_ADDITIONAL_PKT	= 0xc, +	VM_PKT_ADDITIONAL_DATA			= 0xd +}; + +#define VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED	1 + + +/* Version 1 messages */ +enum vmbus_channel_message_type { +	CHANNELMSG_INVALID			=  0, +	CHANNELMSG_OFFERCHANNEL		=  1, +	CHANNELMSG_RESCIND_CHANNELOFFER	=  2, +	CHANNELMSG_REQUESTOFFERS		=  3, +	CHANNELMSG_ALLOFFERS_DELIVERED	=  4, +	CHANNELMSG_OPENCHANNEL		=  5, +	CHANNELMSG_OPENCHANNEL_RESULT		=  6, +	CHANNELMSG_CLOSECHANNEL		=  7, +	CHANNELMSG_GPADL_HEADER		=  8, +	CHANNELMSG_GPADL_BODY			=  9, +	CHANNELMSG_GPADL_CREATED		= 10, +	CHANNELMSG_GPADL_TEARDOWN		= 11, +	CHANNELMSG_GPADL_TORNDOWN		= 12, +	CHANNELMSG_RELID_RELEASED		= 13, +	CHANNELMSG_INITIATE_CONTACT		= 14, +	CHANNELMSG_VERSION_RESPONSE		= 15, +	CHANNELMSG_UNLOAD			= 16, +#ifdef VMBUS_FEATURE_PARENT_OR_PEER_MEMORY_MAPPED_INTO_A_CHILD +	CHANNELMSG_VIEWRANGE_ADD		= 17, +	CHANNELMSG_VIEWRANGE_REMOVE		= 18, +#endif +	CHANNELMSG_COUNT +}; + +struct vmbus_channel_message_header { +	enum vmbus_channel_message_type msgtype; +	u32 padding; +} __packed; + +/* Query VMBus Version parameters */ +struct vmbus_channel_query_vmbus_version { +	struct vmbus_channel_message_header header; +	u32 version; +} __packed; + +/* VMBus Version Supported parameters */ +struct vmbus_channel_version_supported { +	struct vmbus_channel_message_header header; +	bool version_supported; +} __packed; + +/* Offer Channel parameters */ +struct vmbus_channel_offer_channel { +	struct vmbus_channel_message_header header; +	struct vmbus_channel_offer offer; +	u32 child_relid; +	u8 monitorid; +	bool monitor_allocated; +} __packed; + +/* Rescind Offer parameters */ +struct vmbus_channel_rescind_offer { +	struct vmbus_channel_message_header header; +	u32 child_relid; +} __packed; + +/* + * Request Offer -- no parameters, SynIC message contains the partition ID + * Set Snoop -- no parameters, SynIC message contains the partition ID + * Clear Snoop -- no parameters, SynIC message contains the partition ID + * All Offers Delivered -- no parameters, SynIC message contains the partition + *		           ID + * Flush Client -- no parameters, SynIC message contains the partition ID + */ + +/* Open Channel parameters */ +struct vmbus_channel_open_channel { +	struct vmbus_channel_message_header header; + +	/* Identifies the specific VMBus channel that is being opened. */ +	u32 child_relid; + +	/* ID making a particular open request at a channel offer unique. */ +	u32 openid; + +	/* GPADL for the channel's ring buffer. */ +	u32 ringbuffer_gpadlhandle; + +	/* GPADL for the channel's server context save area. */ +	u32 server_contextarea_gpadlhandle; + +	/* +	* The upstream ring buffer begins at offset zero in the memory +	* described by RingBufferGpadlHandle. The downstream ring buffer +	* follows it at this offset (in pages). +	*/ +	u32 downstream_ringbuffer_pageoffset; + +	/* User-specific data to be passed along to the server endpoint. */ +	unsigned char userdata[MAX_USER_DEFINED_BYTES]; +} __packed; + +/* Open Channel Result parameters */ +struct vmbus_channel_open_result { +	struct vmbus_channel_message_header header; +	u32 child_relid; +	u32 openid; +	u32 status; +} __packed; + +/* Close channel parameters; */ +struct vmbus_channel_close_channel { +	struct vmbus_channel_message_header header; +	u32 child_relid; +} __packed; + +/* Channel Message GPADL */ +#define GPADL_TYPE_RING_BUFFER		1 +#define GPADL_TYPE_SERVER_SAVE_AREA	2 +#define GPADL_TYPE_TRANSACTION		8 + +/* + * The number of PFNs in a GPADL message is defined by the number of + * pages that would be spanned by ByteCount and ByteOffset.  If the + * implied number of PFNs won't fit in this packet, there will be a + * follow-up packet that contains more. + */ +struct vmbus_channel_gpadl_header { +	struct vmbus_channel_message_header header; +	u32 child_relid; +	u32 gpadl; +	u16 range_buflen; +	u16 rangecount; +	struct gpa_range range[0]; +} __packed; + +/* This is the followup packet that contains more PFNs. */ +struct vmbus_channel_gpadl_body { +	struct vmbus_channel_message_header header; +	u32 msgnumber; +	u32 gpadl; +	u64 pfn[0]; +} __packed; + +struct vmbus_channel_gpadl_created { +	struct vmbus_channel_message_header header; +	u32 child_relid; +	u32 gpadl; +	u32 creation_status; +} __packed; + +struct vmbus_channel_gpadl_teardown { +	struct vmbus_channel_message_header header; +	u32 child_relid; +	u32 gpadl; +} __packed; + +struct vmbus_channel_gpadl_torndown { +	struct vmbus_channel_message_header header; +	u32 gpadl; +} __packed; + +#ifdef VMBUS_FEATURE_PARENT_OR_PEER_MEMORY_MAPPED_INTO_A_CHILD +struct vmbus_channel_view_range_add { +	struct vmbus_channel_message_header header; +	PHYSICAL_ADDRESS viewrange_base; +	u64 viewrange_length; +	u32 child_relid; +} __packed; + +struct vmbus_channel_view_range_remove { +	struct vmbus_channel_message_header header; +	PHYSICAL_ADDRESS viewrange_base; +	u32 child_relid; +} __packed; +#endif + +struct vmbus_channel_relid_released { +	struct vmbus_channel_message_header header; +	u32 child_relid; +} __packed; + +struct vmbus_channel_initiate_contact { +	struct vmbus_channel_message_header header; +	u32 vmbus_version_requested; +	u32 padding2; +	u64 interrupt_page; +	u64 monitor_page1; +	u64 monitor_page2; +} __packed; + +struct vmbus_channel_version_response { +	struct vmbus_channel_message_header header; +	bool version_supported; +} __packed; + +enum vmbus_channel_state { +	CHANNEL_OFFER_STATE, +	CHANNEL_OPENING_STATE, +	CHANNEL_OPEN_STATE, +}; + +struct vmbus_channel_debug_info { +	u32 relid; +	enum vmbus_channel_state state; +	uuid_le interfacetype; +	uuid_le interface_instance; +	u32 monitorid; +	u32 servermonitor_pending; +	u32 servermonitor_latency; +	u32 servermonitor_connectionid; +	u32 clientmonitor_pending; +	u32 clientmonitor_latency; +	u32 clientmonitor_connectionid; + +	struct hv_ring_buffer_debug_info inbound; +	struct hv_ring_buffer_debug_info outbound; +}; + +/* + * Represents each channel msg on the vmbus connection This is a + * variable-size data structure depending on the msg type itself + */ +struct vmbus_channel_msginfo { +	/* Bookkeeping stuff */ +	struct list_head msglistentry; + +	/* So far, this is only used to handle gpadl body message */ +	struct list_head submsglist; + +	/* Synchronize the request/response if needed */ +	struct completion  waitevent; +	union { +		struct vmbus_channel_version_supported version_supported; +		struct vmbus_channel_open_result open_result; +		struct vmbus_channel_gpadl_torndown gpadl_torndown; +		struct vmbus_channel_gpadl_created gpadl_created; +		struct vmbus_channel_version_response version_response; +	} response; + +	u32 msgsize; +	/* +	 * The channel message that goes out on the "wire". +	 * It will contain at minimum the VMBUS_CHANNEL_MESSAGE_HEADER header +	 */ +	unsigned char msg[0]; +}; + +struct vmbus_close_msg { +	struct vmbus_channel_msginfo info; +	struct vmbus_channel_close_channel msg; +}; + +struct vmbus_channel { +	struct list_head listentry; + +	struct hv_device *device_obj; + +	struct work_struct work; + +	enum vmbus_channel_state state; + +	struct vmbus_channel_offer_channel offermsg; +	/* +	 * These are based on the OfferMsg.MonitorId. +	 * Save it here for easy access. +	 */ +	u8 monitor_grp; +	u8 monitor_bit; + +	u32 ringbuffer_gpadlhandle; + +	/* Allocated memory for ring buffer */ +	void *ringbuffer_pages; +	u32 ringbuffer_pagecount; +	struct hv_ring_buffer_info outbound;	/* send to parent */ +	struct hv_ring_buffer_info inbound;	/* receive from parent */ +	spinlock_t inbound_lock; +	struct workqueue_struct *controlwq; + +	struct vmbus_close_msg close_msg; + +	/* Channel callback are invoked in this workqueue context */ +	/* HANDLE dataWorkQueue; */ + +	void (*onchannel_callback)(void *context); +	void *channel_callback_context; +}; + +void vmbus_onmessage(void *context); + +int vmbus_request_offers(void); + +/* The format must be the same as struct vmdata_gpa_direct */ +struct vmbus_channel_packet_page_buffer { +	u16 type; +	u16 dataoffset8; +	u16 length8; +	u16 flags; +	u64 transactionid; +	u32 reserved; +	u32 rangecount; +	struct hv_page_buffer range[MAX_PAGE_BUFFER_COUNT]; +} __packed; + +/* The format must be the same as struct vmdata_gpa_direct */ +struct vmbus_channel_packet_multipage_buffer { +	u16 type; +	u16 dataoffset8; +	u16 length8; +	u16 flags; +	u64 transactionid; +	u32 reserved; +	u32 rangecount;		/* Always 1 in this case */ +	struct hv_multipage_buffer range; +} __packed; + + +extern int vmbus_open(struct vmbus_channel *channel, +			    u32 send_ringbuffersize, +			    u32 recv_ringbuffersize, +			    void *userdata, +			    u32 userdatalen, +			    void(*onchannel_callback)(void *context), +			    void *context); + +extern void vmbus_close(struct vmbus_channel *channel); + +extern int vmbus_sendpacket(struct vmbus_channel *channel, +				  const void *buffer, +				  u32 bufferLen, +				  u64 requestid, +				  enum vmbus_packet_type type, +				  u32 flags); + +extern int vmbus_sendpacket_pagebuffer(struct vmbus_channel *channel, +					    struct hv_page_buffer pagebuffers[], +					    u32 pagecount, +					    void *buffer, +					    u32 bufferlen, +					    u64 requestid); + +extern int vmbus_sendpacket_multipagebuffer(struct vmbus_channel *channel, +					struct hv_multipage_buffer *mpb, +					void *buffer, +					u32 bufferlen, +					u64 requestid); + +extern int vmbus_establish_gpadl(struct vmbus_channel *channel, +				      void *kbuffer, +				      u32 size, +				      u32 *gpadl_handle); + +extern int vmbus_teardown_gpadl(struct vmbus_channel *channel, +				     u32 gpadl_handle); + +extern int vmbus_recvpacket(struct vmbus_channel *channel, +				  void *buffer, +				  u32 bufferlen, +				  u32 *buffer_actual_len, +				  u64 *requestid); + +extern int vmbus_recvpacket_raw(struct vmbus_channel *channel, +				     void *buffer, +				     u32 bufferlen, +				     u32 *buffer_actual_len, +				     u64 *requestid); + + +extern void vmbus_get_debug_info(struct vmbus_channel *channel, +				     struct vmbus_channel_debug_info *debug); + +extern void vmbus_ontimer(unsigned long data); + +struct hv_dev_port_info { +	u32 int_mask; +	u32 read_idx; +	u32 write_idx; +	u32 bytes_avail_toread; +	u32 bytes_avail_towrite; +}; + +/* Base driver object */ +struct hv_driver { +	const char *name; + +	/* the device type supported by this driver */ +	uuid_le dev_type; +	const struct hv_vmbus_device_id *id_table; + +	struct device_driver driver; + +	int (*probe)(struct hv_device *, const struct hv_vmbus_device_id *); +	int (*remove)(struct hv_device *); +	void (*shutdown)(struct hv_device *); + +}; + +/* Base device object */ +struct hv_device { +	/* the device type id of this device */ +	uuid_le dev_type; + +	/* the device instance id of this device */ +	uuid_le dev_instance; + +	struct device device; + +	struct vmbus_channel *channel; +}; + + +static inline struct hv_device *device_to_hv_device(struct device *d) +{ +	return container_of(d, struct hv_device, device); +} + +static inline struct hv_driver *drv_to_hv_drv(struct device_driver *d) +{ +	return container_of(d, struct hv_driver, driver); +} + +static inline void hv_set_drvdata(struct hv_device *dev, void *data) +{ +	dev_set_drvdata(&dev->device, data); +} + +static inline void *hv_get_drvdata(struct hv_device *dev) +{ +	return dev_get_drvdata(&dev->device); +} + +/* Vmbus interface */ +#define vmbus_driver_register(driver)	\ +	__vmbus_driver_register(driver, THIS_MODULE, KBUILD_MODNAME) +int __must_check __vmbus_driver_register(struct hv_driver *hv_driver, +					 struct module *owner, +					 const char *mod_name); +void vmbus_driver_unregister(struct hv_driver *hv_driver); + +/** + * VMBUS_DEVICE - macro used to describe a specific hyperv vmbus device + * + * This macro is used to create a struct hv_vmbus_device_id that matches a + * specific device. + */ +#define VMBUS_DEVICE(g0, g1, g2, g3, g4, g5, g6, g7,	\ +		     g8, g9, ga, gb, gc, gd, ge, gf)	\ +	.guid = { g0, g1, g2, g3, g4, g5, g6, g7,	\ +		  g8, g9, ga, gb, gc, gd, ge, gf }, + +/* + * Common header for Hyper-V ICs + */ + +#define ICMSGTYPE_NEGOTIATE		0 +#define ICMSGTYPE_HEARTBEAT		1 +#define ICMSGTYPE_KVPEXCHANGE		2 +#define ICMSGTYPE_SHUTDOWN		3 +#define ICMSGTYPE_TIMESYNC		4 +#define ICMSGTYPE_VSS			5 + +#define ICMSGHDRFLAG_TRANSACTION	1 +#define ICMSGHDRFLAG_REQUEST		2 +#define ICMSGHDRFLAG_RESPONSE		4 + +#define HV_S_OK				0x00000000 +#define HV_E_FAIL			0x80004005 +#define HV_ERROR_NOT_SUPPORTED		0x80070032 +#define HV_ERROR_MACHINE_LOCKED		0x800704F7 + +/* + * While we want to handle util services as regular devices, + * there is only one instance of each of these services; so + * we statically allocate the service specific state. + */ + +struct hv_util_service { +	u8 *recv_buffer; +	void (*util_cb)(void *); +	int (*util_init)(struct hv_util_service *); +	void (*util_deinit)(void); +}; + +struct vmbuspipe_hdr { +	u32 flags; +	u32 msgsize; +} __packed; + +struct ic_version { +	u16 major; +	u16 minor; +} __packed; + +struct icmsg_hdr { +	struct ic_version icverframe; +	u16 icmsgtype; +	struct ic_version icvermsg; +	u16 icmsgsize; +	u32 status; +	u8 ictransaction_id; +	u8 icflags; +	u8 reserved[2]; +} __packed; + +struct icmsg_negotiate { +	u16 icframe_vercnt; +	u16 icmsg_vercnt; +	u32 reserved; +	struct ic_version icversion_data[1]; /* any size array */ +} __packed; + +struct shutdown_msg_data { +	u32 reason_code; +	u32 timeout_seconds; +	u32 flags; +	u8  display_message[2048]; +} __packed; + +struct heartbeat_msg_data { +	u64 seq_num; +	u32 reserved[8]; +} __packed; + +/* Time Sync IC defs */ +#define ICTIMESYNCFLAG_PROBE	0 +#define ICTIMESYNCFLAG_SYNC	1 +#define ICTIMESYNCFLAG_SAMPLE	2 + +#ifdef __x86_64__ +#define WLTIMEDELTA	116444736000000000L	/* in 100ns unit */ +#else +#define WLTIMEDELTA	116444736000000000LL +#endif + +struct ictimesync_data { +	u64 parenttime; +	u64 childtime; +	u64 roundtriptime; +	u8 flags; +} __packed; + +struct hyperv_service_callback { +	u8 msg_type; +	char *log_msg; +	uuid_le data; +	struct vmbus_channel *channel; +	void (*callback) (void *context); +}; + +extern void vmbus_prep_negotiate_resp(struct icmsg_hdr *, +				      struct icmsg_negotiate *, u8 *); + +#endif /* _HYPERV_H */ diff --git a/include/linux/i2c-omap.h b/include/linux/i2c-omap.h index 0aa0cbd676f..92a0dc75bc7 100644 --- a/include/linux/i2c-omap.h +++ b/include/linux/i2c-omap.h @@ -32,10 +32,9 @@  struct omap_i2c_bus_platform_data {  	u32		clkrate; +	u32		rev; +	u32		flags;  	void		(*set_mpu_wkup_lat)(struct device *dev, long set); -	int		(*device_enable) (struct platform_device *pdev); -	int		(*device_shutdown) (struct platform_device *pdev); -	int		(*device_idle) (struct platform_device *pdev);  };  #endif diff --git a/include/linux/i2c.h b/include/linux/i2c.h index a6c652ef516..38a21c3edd2 100644 --- a/include/linux/i2c.h +++ b/include/linux/i2c.h @@ -34,6 +34,7 @@  #include <linux/sched.h>	/* for completion */  #include <linux/mutex.h>  #include <linux/of.h>		/* for struct device_node */ +#include <linux/swab.h>		/* for swab16 */  extern struct bus_type i2c_bus_type;  extern struct device_type i2c_adapter_type; @@ -88,6 +89,22 @@ extern s32 i2c_smbus_read_word_data(const struct i2c_client *client,  				    u8 command);  extern s32 i2c_smbus_write_word_data(const struct i2c_client *client,  				     u8 command, u16 value); + +static inline s32 +i2c_smbus_read_word_swapped(const struct i2c_client *client, u8 command) +{ +	s32 value = i2c_smbus_read_word_data(client, command); + +	return (value < 0) ? value : swab16(value); +} + +static inline s32 +i2c_smbus_write_word_swapped(const struct i2c_client *client, +			     u8 command, u16 value) +{ +	return i2c_smbus_write_word_data(client, command, swab16(value)); +} +  /* Returns the number of read bytes */  extern s32 i2c_smbus_read_block_data(const struct i2c_client *client,  				     u8 command, u8 *values); diff --git a/include/linux/i2c/tsc2007.h b/include/linux/i2c/tsc2007.h index 591427a63b0..506a9f7af51 100644 --- a/include/linux/i2c/tsc2007.h +++ b/include/linux/i2c/tsc2007.h @@ -5,7 +5,7 @@  struct tsc2007_platform_data {  	u16	model;				/* 2007. */ -	u16	x_plate_ohms; +	u16	x_plate_ohms;	/* must be non-zero value */  	u16	max_rt; /* max. resistance above which samples are ignored */  	unsigned long poll_delay; /* delay (in ms) after pen-down event  				     before polling starts */ diff --git a/include/linux/i2c/twl4030-madc.h b/include/linux/i2c/twl4030-madc.h index 6427d298fbf..530e11ba073 100644 --- a/include/linux/i2c/twl4030-madc.h +++ b/include/linux/i2c/twl4030-madc.h @@ -129,6 +129,10 @@ enum sample_type {  #define REG_BCICTL2             0x024  #define TWL4030_BCI_ITHSENS	0x007 +/* Register and bits for GPBR1 register */ +#define TWL4030_REG_GPBR1		0x0c +#define TWL4030_GPBR1_MADC_HFCLK_EN	(1 << 7) +  struct twl4030_madc_user_parms {  	int channel;  	int average; diff --git a/include/linux/ieee80211.h b/include/linux/ieee80211.h index 54c87896087..48363c3c40f 100644 --- a/include/linux/ieee80211.h +++ b/include/linux/ieee80211.h @@ -130,6 +130,8 @@  #define IEEE80211_QOS_CTL_ACK_POLICY_BLOCKACK	0x0060  /* A-MSDU 802.11n */  #define IEEE80211_QOS_CTL_A_MSDU_PRESENT	0x0080 +/* Mesh Control 802.11s */ +#define IEEE80211_QOS_CTL_MESH_CONTROL_PRESENT  0x0100  /* U-APSD queue for WMM IEs sent by AP */  #define IEEE80211_WMM_IE_AP_QOSINFO_UAPSD	(1<<7) @@ -629,9 +631,14 @@ struct ieee80211_rann_ie {  	u8 rann_ttl;  	u8 rann_addr[6];  	u32 rann_seq; +	u32 rann_interval;  	u32 rann_metric;  } __attribute__ ((packed)); +enum ieee80211_rann_flags { +	RANN_FLAG_IS_GATE = 1 << 0, +}; +  #define WLAN_SA_QUERY_TR_ID_LEN 2  struct ieee80211_mgmt { @@ -736,19 +743,10 @@ struct ieee80211_mgmt {  					__le16 params;  					__le16 reason_code;  				} __attribute__((packed)) delba; -				struct{ +				struct {  					u8 action_code; -					/* capab_info for open and confirm, -					 * reason for close -					 */ -					__le16 aux; -					/* Followed in plink_confirm by status -					 * code, AID and supported rates, -					 * and directly by supported rates in -					 * plink_open and plink_close -					 */  					u8 variable[0]; -				} __attribute__((packed)) plink_action; +				} __attribute__((packed)) self_prot;  				struct{  					u8 action_code;  					u8 variable[0]; @@ -761,6 +759,12 @@ struct ieee80211_mgmt {  					u8 action;  					u8 smps_control;  				} __attribute__ ((packed)) ht_smps; +				struct { +					u8 action_code; +					u8 dialog_token; +					__le16 capability; +					u8 variable[0]; +				} __packed tdls_discover_resp;  			} u;  		} __attribute__ ((packed)) action;  	} u; @@ -779,6 +783,13 @@ struct ieee80211_mmie {  	u8 mic[8];  } __attribute__ ((packed)); +struct ieee80211_vendor_ie { +	u8 element_id; +	u8 len; +	u8 oui[3]; +	u8 oui_type; +} __packed; +  /* Control frames */  struct ieee80211_rts {  	__le16 frame_control; @@ -800,6 +811,52 @@ struct ieee80211_pspoll {  	u8 ta[6];  } __attribute__ ((packed)); +/* TDLS */ + +/* Link-id information element */ +struct ieee80211_tdls_lnkie { +	u8 ie_type; /* Link Identifier IE */ +	u8 ie_len; +	u8 bssid[6]; +	u8 init_sta[6]; +	u8 resp_sta[6]; +} __packed; + +struct ieee80211_tdls_data { +	u8 da[6]; +	u8 sa[6]; +	__be16 ether_type; +	u8 payload_type; +	u8 category; +	u8 action_code; +	union { +		struct { +			u8 dialog_token; +			__le16 capability; +			u8 variable[0]; +		} __packed setup_req; +		struct { +			__le16 status_code; +			u8 dialog_token; +			__le16 capability; +			u8 variable[0]; +		} __packed setup_resp; +		struct { +			__le16 status_code; +			u8 dialog_token; +			u8 variable[0]; +		} __packed setup_cfm; +		struct { +			__le16 reason_code; +			u8 variable[0]; +		} __packed teardown; +		struct { +			u8 dialog_token; +			u8 variable[0]; +		} __packed discover_req; +	} u; +} __packed; +  /**   * struct ieee80211_bar - HT Block Ack Request   * @@ -816,9 +873,11 @@ struct ieee80211_bar {  } __attribute__((packed));  /* 802.11 BAR control masks */ -#define IEEE80211_BAR_CTRL_ACK_POLICY_NORMAL     0x0000 -#define IEEE80211_BAR_CTRL_CBMTID_COMPRESSED_BA  0x0004 - +#define IEEE80211_BAR_CTRL_ACK_POLICY_NORMAL	0x0000 +#define IEEE80211_BAR_CTRL_MULTI_TID		0x0002 +#define IEEE80211_BAR_CTRL_CBMTID_COMPRESSED_BA	0x0004 +#define IEEE80211_BAR_CTRL_TID_INFO_MASK	0xf000 +#define IEEE80211_BAR_CTRL_TID_INFO_SHIFT	12  #define IEEE80211_HT_MCS_MASK_LEN		10 @@ -1189,16 +1248,13 @@ enum ieee80211_eid {  	WLAN_EID_TS_DELAY = 43,  	WLAN_EID_TCLAS_PROCESSING = 44,  	WLAN_EID_QOS_CAPA = 46, +	/* 802.11z */ +	WLAN_EID_LINK_ID = 101,  	/* 802.11s */  	WLAN_EID_MESH_CONFIG = 113,  	WLAN_EID_MESH_ID = 114,  	WLAN_EID_LINK_METRIC_REPORT = 115,  	WLAN_EID_CONGESTION_NOTIFICATION = 116, -	/* Note that the Peer Link IE has been replaced with the similar -	 * Peer Management IE.  We will keep the former definition until mesh -	 * code is changed to comply with latest 802.11s drafts. -	 */ -	WLAN_EID_PEER_LINK = 55,  /* no longer in 802.11s drafts */  	WLAN_EID_PEER_MGMT = 117,  	WLAN_EID_CHAN_SWITCH_PARAM = 118,  	WLAN_EID_MESH_AWAKE_WINDOW = 119, @@ -1277,13 +1333,11 @@ enum ieee80211_category {  	WLAN_CATEGORY_HT = 7,  	WLAN_CATEGORY_SA_QUERY = 8,  	WLAN_CATEGORY_PROTECTED_DUAL_OF_ACTION = 9, +	WLAN_CATEGORY_TDLS = 12,  	WLAN_CATEGORY_MESH_ACTION = 13,  	WLAN_CATEGORY_MULTIHOP_ACTION = 14,  	WLAN_CATEGORY_SELF_PROTECTED = 15,  	WLAN_CATEGORY_WMM = 17, -	/* TODO: remove MESH_PATH_SEL after mesh is updated -	 * to current 802.11s draft  */ -	WLAN_CATEGORY_MESH_PATH_SEL = 32,  	WLAN_CATEGORY_VENDOR_SPECIFIC_PROTECTED = 126,  	WLAN_CATEGORY_VENDOR_SPECIFIC = 127,  }; @@ -1309,6 +1363,31 @@ enum ieee80211_ht_actioncode {  	WLAN_HT_ACTION_ASEL_IDX_FEEDBACK = 7,  }; +/* Self Protected Action codes */ +enum ieee80211_self_protected_actioncode { +	WLAN_SP_RESERVED = 0, +	WLAN_SP_MESH_PEERING_OPEN = 1, +	WLAN_SP_MESH_PEERING_CONFIRM = 2, +	WLAN_SP_MESH_PEERING_CLOSE = 3, +	WLAN_SP_MGK_INFORM = 4, +	WLAN_SP_MGK_ACK = 5, +}; + +/* Mesh action codes */ +enum ieee80211_mesh_actioncode { +	WLAN_MESH_ACTION_LINK_METRIC_REPORT, +	WLAN_MESH_ACTION_HWMP_PATH_SELECTION, +	WLAN_MESH_ACTION_GATE_ANNOUNCEMENT, +	WLAN_MESH_ACTION_CONGESTION_CONTROL_NOTIFICATION, +	WLAN_MESH_ACTION_MCCA_SETUP_REQUEST, +	WLAN_MESH_ACTION_MCCA_SETUP_REPLY, +	WLAN_MESH_ACTION_MCCA_ADVERTISEMENT_REQUEST, +	WLAN_MESH_ACTION_MCCA_ADVERTISEMENT, +	WLAN_MESH_ACTION_MCCA_TEARDOWN, +	WLAN_MESH_ACTION_TBTT_ADJUSTMENT_REQUEST, +	WLAN_MESH_ACTION_TBTT_ADJUSTMENT_RESPONSE, +}; +  /* Security key length */  enum ieee80211_key_len {  	WLAN_KEY_LEN_WEP40 = 5, @@ -1318,6 +1397,36 @@ enum ieee80211_key_len {  	WLAN_KEY_LEN_AES_CMAC = 16,  }; +/* Public action codes */ +enum ieee80211_pub_actioncode { +	WLAN_PUB_ACTION_TDLS_DISCOVER_RES = 14, +}; + +/* TDLS action codes */ +enum ieee80211_tdls_actioncode { +	WLAN_TDLS_SETUP_REQUEST = 0, +	WLAN_TDLS_SETUP_RESPONSE = 1, +	WLAN_TDLS_SETUP_CONFIRM = 2, +	WLAN_TDLS_TEARDOWN = 3, +	WLAN_TDLS_PEER_TRAFFIC_INDICATION = 4, +	WLAN_TDLS_CHANNEL_SWITCH_REQUEST = 5, +	WLAN_TDLS_CHANNEL_SWITCH_RESPONSE = 6, +	WLAN_TDLS_PEER_PSM_REQUEST = 7, +	WLAN_TDLS_PEER_PSM_RESPONSE = 8, +	WLAN_TDLS_PEER_TRAFFIC_RESPONSE = 9, +	WLAN_TDLS_DISCOVERY_REQUEST = 10, +}; + +/* + * TDLS capabililites to be enabled in the 5th byte of the + * @WLAN_EID_EXT_CAPABILITY information element + */ +#define WLAN_EXT_CAPA5_TDLS_ENABLED	BIT(5) +#define WLAN_EXT_CAPA5_TDLS_PROHIBITED	BIT(6) + +/* TDLS specific payload type in the LLC/SNAP header */ +#define WLAN_TDLS_SNAP_RFTYPE	0x2 +  /**   * enum - mesh path selection protocol identifier   * @@ -1453,6 +1562,9 @@ enum ieee80211_sa_query_action {  #define WLAN_PMKID_LEN			16 +#define WLAN_OUI_WFA			0x506f9a +#define WLAN_OUI_TYPE_WFA_P2P		9 +  /*   * WMM/802.11e Tspec Element   */ diff --git a/include/linux/if.h b/include/linux/if.h index 03489ca92de..db20bd4fd16 100644 --- a/include/linux/if.h +++ b/include/linux/if.h @@ -78,6 +78,7 @@  					 * datapath port */  #define IFF_TX_SKB_SHARING	0x10000	/* The interface supports sharing  					 * skbs on transmit */ +#define IFF_UNICAST_FLT	0x20000		/* Supports unicast filtering	*/  #define IF_GET_IFACE	0x0001		/* for querying only */  #define IF_GET_PROTO	0x0002 diff --git a/include/linux/if_ether.h b/include/linux/if_ether.h index a3d99ff6e3b..e473003e4bd 100644 --- a/include/linux/if_ether.h +++ b/include/linux/if_ether.h @@ -83,11 +83,13 @@  #define ETH_P_8021AH	0x88E7          /* 802.1ah Backbone Service Tag */  #define ETH_P_1588	0x88F7		/* IEEE 1588 Timesync */  #define ETH_P_FCOE	0x8906		/* Fibre Channel over Ethernet  */ +#define ETH_P_TDLS	0x890D          /* TDLS */  #define ETH_P_FIP	0x8914		/* FCoE Initialization Protocol */  #define ETH_P_QINQ1	0x9100		/* deprecated QinQ VLAN [ NOT AN OFFICIALLY REGISTERED ID ] */  #define ETH_P_QINQ2	0x9200		/* deprecated QinQ VLAN [ NOT AN OFFICIALLY REGISTERED ID ] */  #define ETH_P_QINQ3	0x9300		/* deprecated QinQ VLAN [ NOT AN OFFICIALLY REGISTERED ID ] */  #define ETH_P_EDSA	0xDADA		/* Ethertype DSA [ NOT AN OFFICIALLY REGISTERED ID ] */ +#define ETH_P_AF_IUCV   0xFBFB		/* IBM af_iucv [ NOT AN OFFICIALLY REGISTERED ID ] */  /*   *	Non DIX types. Won't clash for 1500 types. diff --git a/include/linux/if_link.h b/include/linux/if_link.h index 0ee969a5593..c52d4b5f872 100644 --- a/include/linux/if_link.h +++ b/include/linux/if_link.h @@ -279,6 +279,7 @@ enum {  	IFLA_VF_MAC,		/* Hardware queue specific attributes */  	IFLA_VF_VLAN,  	IFLA_VF_TX_RATE,	/* TX Bandwidth Allocation */ +	IFLA_VF_SPOOFCHK,	/* Spoof Checking on/off switch */  	__IFLA_VF_MAX,  }; @@ -300,13 +301,22 @@ struct ifla_vf_tx_rate {  	__u32 rate; /* Max TX bandwidth in Mbps, 0 disables throttling */  }; +struct ifla_vf_spoofchk { +	__u32 vf; +	__u32 setting; +}; +#ifdef __KERNEL__ + +/* We don't want this structure exposed to user space */  struct ifla_vf_info {  	__u32 vf;  	__u8 mac[32];  	__u32 vlan;  	__u32 qos;  	__u32 tx_rate; +	__u32 spoofchk;  }; +#endif  /* VF ports management section   * diff --git a/include/linux/if_macvlan.h b/include/linux/if_macvlan.h index e28b2e4959d..d103dca5c56 100644 --- a/include/linux/if_macvlan.h +++ b/include/linux/if_macvlan.h @@ -64,6 +64,7 @@ struct macvlan_dev {  	int (*forward)(struct net_device *dev, struct sk_buff *skb);  	struct macvtap_queue	*taps[MAX_MACVTAP_QUEUES];  	int			numvtaps; +	int			minor;  };  static inline void macvlan_count_rx(const struct macvlan_dev *vlan, diff --git a/include/linux/if_packet.h b/include/linux/if_packet.h index c1486060f5e..f3799295d23 100644 --- a/include/linux/if_packet.h +++ b/include/linux/if_packet.h @@ -61,6 +61,17 @@ struct tpacket_stats {  	unsigned int	tp_drops;  }; +struct tpacket_stats_v3 { +	unsigned int	tp_packets; +	unsigned int	tp_drops; +	unsigned int	tp_freeze_q_cnt; +}; + +union tpacket_stats_u { +	struct tpacket_stats stats1; +	struct tpacket_stats_v3 stats3; +}; +  struct tpacket_auxdata {  	__u32		tp_status;  	__u32		tp_len; @@ -78,6 +89,7 @@ struct tpacket_auxdata {  #define TP_STATUS_LOSING	0x4  #define TP_STATUS_CSUMNOTREADY	0x8  #define TP_STATUS_VLAN_VALID   0x10 /* auxdata has valid tp_vlan_tci */ +#define TP_STATUS_BLK_TMO	0x20  /* Tx ring - header status */  #define TP_STATUS_AVAILABLE	0x0 @@ -85,6 +97,9 @@ struct tpacket_auxdata {  #define TP_STATUS_SENDING	0x2  #define TP_STATUS_WRONG_FORMAT	0x4 +/* Rx ring - feature request bits */ +#define TP_FT_REQ_FILL_RXHASH	0x1 +  struct tpacket_hdr {  	unsigned long	tp_status;  	unsigned int	tp_len; @@ -111,11 +126,100 @@ struct tpacket2_hdr {  	__u16		tp_padding;  }; +struct tpacket_hdr_variant1 { +	__u32	tp_rxhash; +	__u32	tp_vlan_tci; +}; + +struct tpacket3_hdr { +	__u32		tp_next_offset; +	__u32		tp_sec; +	__u32		tp_nsec; +	__u32		tp_snaplen; +	__u32		tp_len; +	__u32		tp_status; +	__u16		tp_mac; +	__u16		tp_net; +	/* pkt_hdr variants */ +	union { +		struct tpacket_hdr_variant1 hv1; +	}; +}; + +struct tpacket_bd_ts { +	unsigned int ts_sec; +	union { +		unsigned int ts_usec; +		unsigned int ts_nsec; +	}; +}; + +struct tpacket_hdr_v1 { +	__u32	block_status; +	__u32	num_pkts; +	__u32	offset_to_first_pkt; + +	/* Number of valid bytes (including padding) +	 * blk_len <= tp_block_size +	 */ +	__u32	blk_len; + +	/* +	 * Quite a few uses of sequence number: +	 * 1. Make sure cache flush etc worked. +	 *    Well, one can argue - why not use the increasing ts below? +	 *    But look at 2. below first. +	 * 2. When you pass around blocks to other user space decoders, +	 *    you can see which blk[s] is[are] outstanding etc. +	 * 3. Validate kernel code. +	 */ +	__aligned_u64	seq_num; + +	/* +	 * ts_last_pkt: +	 * +	 * Case 1.	Block has 'N'(N >=1) packets and TMO'd(timed out) +	 *		ts_last_pkt == 'time-stamp of last packet' and NOT the +	 *		time when the timer fired and the block was closed. +	 *		By providing the ts of the last packet we can absolutely +	 *		guarantee that time-stamp wise, the first packet in the +	 *		next block will never precede the last packet of the +	 *		previous block. +	 * Case 2.	Block has zero packets and TMO'd +	 *		ts_last_pkt = time when the timer fired and the block +	 *		was closed. +	 * Case 3.	Block has 'N' packets and NO TMO. +	 *		ts_last_pkt = time-stamp of the last pkt in the block. +	 * +	 * ts_first_pkt: +	 *		Is always the time-stamp when the block was opened. +	 *		Case a)	ZERO packets +	 *			No packets to deal with but atleast you know the +	 *			time-interval of this block. +	 *		Case b) Non-zero packets +	 *			Use the ts of the first packet in the block. +	 * +	 */ +	struct tpacket_bd_ts	ts_first_pkt, ts_last_pkt; +}; + +union tpacket_bd_header_u { +	struct tpacket_hdr_v1 bh1; +}; + +struct tpacket_block_desc { +	__u32 version; +	__u32 offset_to_priv; +	union tpacket_bd_header_u hdr; +}; +  #define TPACKET2_HDRLEN		(TPACKET_ALIGN(sizeof(struct tpacket2_hdr)) + sizeof(struct sockaddr_ll)) +#define TPACKET3_HDRLEN		(TPACKET_ALIGN(sizeof(struct tpacket3_hdr)) + sizeof(struct sockaddr_ll))  enum tpacket_versions {  	TPACKET_V1,  	TPACKET_V2, +	TPACKET_V3  };  /* @@ -138,6 +242,21 @@ struct tpacket_req {  	unsigned int	tp_frame_nr;	/* Total number of frames */  }; +struct tpacket_req3 { +	unsigned int	tp_block_size;	/* Minimal size of contiguous block */ +	unsigned int	tp_block_nr;	/* Number of blocks */ +	unsigned int	tp_frame_size;	/* Size of frame */ +	unsigned int	tp_frame_nr;	/* Total number of frames */ +	unsigned int	tp_retire_blk_tov; /* timeout in msecs */ +	unsigned int	tp_sizeof_priv; /* offset to private data area */ +	unsigned int	tp_feature_req_word; +}; + +union tpacket_req_u { +	struct tpacket_req	req; +	struct tpacket_req3	req3; +}; +  struct packet_mreq {  	int		mr_ifindex;  	unsigned short	mr_type; diff --git a/include/linux/if_pppol2tp.h b/include/linux/if_pppol2tp.h index 184bc556620..23cefa1111b 100644 --- a/include/linux/if_pppol2tp.h +++ b/include/linux/if_pppol2tp.h @@ -39,7 +39,7 @@ struct pppol2tp_addr {   * bits. So we need a different sockaddr structure.   */  struct pppol2tpv3_addr { -	pid_t	pid;			/* pid that owns the fd. +	__kernel_pid_t	pid;		/* pid that owns the fd.  					 * 0 => current */  	int	fd;			/* FD of UDP or IP socket to use */ diff --git a/include/linux/if_pppox.h b/include/linux/if_pppox.h index 397921b09ef..b5f927f59f2 100644 --- a/include/linux/if_pppox.h +++ b/include/linux/if_pppox.h @@ -20,8 +20,9 @@  #include <linux/types.h>  #include <asm/byteorder.h> -#ifdef  __KERNEL__ +#include <linux/socket.h>  #include <linux/if_ether.h> +#ifdef  __KERNEL__  #include <linux/if.h>  #include <linux/netdevice.h>  #include <linux/ppp_channel.h> @@ -63,7 +64,7 @@ struct pptp_addr {  #define PX_MAX_PROTO   3  struct sockaddr_pppox { -	sa_family_t     sa_family;            /* address family, AF_PPPOX */ +	__kernel_sa_family_t sa_family;       /* address family, AF_PPPOX */  	unsigned int    sa_protocol;          /* protocol identifier */  	union {  		struct pppoe_addr  pppoe; @@ -77,7 +78,7 @@ struct sockaddr_pppox {   * type instead.   */  struct sockaddr_pppol2tp { -	sa_family_t     sa_family;      /* address family, AF_PPPOX */ +	__kernel_sa_family_t sa_family; /* address family, AF_PPPOX */  	unsigned int    sa_protocol;    /* protocol identifier */  	struct pppol2tp_addr pppol2tp;  } __attribute__((packed)); @@ -86,7 +87,7 @@ struct sockaddr_pppol2tp {   * bits. So we need a different sockaddr structure.   */  struct sockaddr_pppol2tpv3 { -	sa_family_t     sa_family;      /* address family, AF_PPPOX */ +	__kernel_sa_family_t sa_family; /* address family, AF_PPPOX */  	unsigned int    sa_protocol;    /* protocol identifier */  	struct pppol2tpv3_addr pppol2tp;  } __attribute__((packed)); diff --git a/include/linux/if_vlan.h b/include/linux/if_vlan.h index 44da4822bca..12d5543b14f 100644 --- a/include/linux/if_vlan.h +++ b/include/linux/if_vlan.h @@ -106,7 +106,7 @@ extern struct net_device *__vlan_find_dev_deep(struct net_device *real_dev,  extern struct net_device *vlan_dev_real_dev(const struct net_device *dev);  extern u16 vlan_dev_vlan_id(const struct net_device *dev); -extern bool vlan_do_receive(struct sk_buff **skb); +extern bool vlan_do_receive(struct sk_buff **skb, bool last_handler);  extern struct sk_buff *vlan_untag(struct sk_buff *skb);  #else @@ -128,9 +128,9 @@ static inline u16 vlan_dev_vlan_id(const struct net_device *dev)  	return 0;  } -static inline bool vlan_do_receive(struct sk_buff **skb) +static inline bool vlan_do_receive(struct sk_buff **skb, bool last_handler)  { -	if ((*skb)->vlan_tci & VLAN_VID_MASK) +	if (((*skb)->vlan_tci & VLAN_VID_MASK) && last_handler)  		(*skb)->pkt_type = PACKET_OTHERHOST;  	return false;  } diff --git a/include/linux/ima.h b/include/linux/ima.h index 09e6e62f995..6ac8e50c6cf 100644 --- a/include/linux/ima.h +++ b/include/linux/ima.h @@ -15,8 +15,6 @@ struct linux_binprm;  #ifdef CONFIG_IMA  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_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); @@ -27,16 +25,6 @@ static inline int ima_bprm_check(struct linux_binprm *bprm)  	return 0;  } -static inline int ima_inode_alloc(struct inode *inode) -{ -	return 0; -} - -static inline void ima_inode_free(struct inode *inode) -{ -	return; -} -  static inline int ima_file_check(struct file *file, int mask)  {  	return 0; @@ -51,6 +39,5 @@ static inline int ima_file_mmap(struct file *file, unsigned long prot)  {  	return 0;  } -  #endif /* CONFIG_IMA_H */  #endif /* _LINUX_IMA_H */ diff --git a/include/linux/in.h b/include/linux/in.h index beeb6dee2b4..01129c0ea87 100644 --- a/include/linux/in.h +++ b/include/linux/in.h @@ -182,7 +182,7 @@ struct in_pktinfo {  /* Structure describing an Internet (IP) socket address. */  #define __SOCK_SIZE__	16		/* sizeof(struct sockaddr)	*/  struct sockaddr_in { -  sa_family_t		sin_family;	/* Address family		*/ +  __kernel_sa_family_t	sin_family;	/* Address family		*/    __be16		sin_port;	/* Port number			*/    struct in_addr	sin_addr;	/* Internet address		*/ diff --git a/include/linux/inet_diag.h b/include/linux/inet_diag.h index bc8c4902208..80b480c9753 100644 --- a/include/linux/inet_diag.h +++ b/include/linux/inet_diag.h @@ -97,9 +97,10 @@ enum {  	INET_DIAG_INFO,  	INET_DIAG_VEGASINFO,  	INET_DIAG_CONG, +	INET_DIAG_TOS,  }; -#define INET_DIAG_MAX INET_DIAG_CONG +#define INET_DIAG_MAX INET_DIAG_TOS  /* INET_DIAG_MEM */ diff --git a/include/linux/init_task.h b/include/linux/init_task.h index d14e058aaee..08ffab01e76 100644 --- a/include/linux/init_task.h +++ b/include/linux/init_task.h @@ -42,7 +42,7 @@ extern struct fs_struct init_fs;  	.cputimer	= { 						\  		.cputime = INIT_CPUTIME,				\  		.running = 0,						\ -		.lock = __SPIN_LOCK_UNLOCKED(sig.cputimer.lock),	\ +		.lock = __RAW_SPIN_LOCK_UNLOCKED(sig.cputimer.lock),	\  	},								\  	.cred_guard_mutex =						\  		 __MUTEX_INITIALIZER(sig.cred_guard_mutex),		\ diff --git a/include/linux/input.h b/include/linux/input.h index a637e781433..3862e32c4ee 100644 --- a/include/linux/input.h +++ b/include/linux/input.h @@ -505,6 +505,7 @@ struct input_keymap_entry {  #define BTN_TOOL_FINGER		0x145  #define BTN_TOOL_MOUSE		0x146  #define BTN_TOOL_LENS		0x147 +#define BTN_TOOL_QUINTTAP	0x148	/* Five fingers on trackpad */  #define BTN_TOUCH		0x14a  #define BTN_STYLUS		0x14b  #define BTN_STYLUS2		0x14c @@ -814,6 +815,7 @@ struct input_keymap_entry {  #define SW_KEYPAD_SLIDE		0x0a  /* set = keypad slide out */  #define SW_FRONT_PROXIMITY	0x0b  /* set = front proximity sensor active */  #define SW_ROTATE_LOCK		0x0c  /* set = rotate locked/disabled */ +#define SW_LINEIN_INSERT	0x0d  /* set = inserted */  #define SW_MAX			0x0f  #define SW_CNT			(SW_MAX+1) @@ -1609,7 +1611,7 @@ struct ff_device {  	struct file *effect_owners[];  }; -int input_ff_create(struct input_dev *dev, int max_effects); +int input_ff_create(struct input_dev *dev, unsigned int max_effects);  void input_ff_destroy(struct input_dev *dev);  int input_ff_event(struct input_dev *dev, unsigned int type, unsigned int code, int value); diff --git a/include/linux/input/adp5589.h b/include/linux/input/adp5589.h index ef792ecfaab..1a05eee15e6 100644 --- a/include/linux/input/adp5589.h +++ b/include/linux/input/adp5589.h @@ -1,5 +1,5 @@  /* - * Analog Devices ADP5589 I/O Expander and QWERTY Keypad Controller + * Analog Devices ADP5589/ADP5585 I/O Expander and QWERTY Keypad Controller   *   * Copyright 2010-2011 Analog Devices Inc.   * @@ -9,89 +9,9 @@  #ifndef _ADP5589_H  #define _ADP5589_H -#define ADP5589_ID			0x00 -#define ADP5589_INT_STATUS		0x01 -#define ADP5589_STATUS			0x02 -#define ADP5589_FIFO_1			0x03 -#define ADP5589_FIFO_2			0x04 -#define ADP5589_FIFO_3			0x05 -#define ADP5589_FIFO_4			0x06 -#define ADP5589_FIFO_5			0x07 -#define ADP5589_FIFO_6			0x08 -#define ADP5589_FIFO_7			0x09 -#define ADP5589_FIFO_8			0x0A -#define ADP5589_FIFO_9			0x0B -#define ADP5589_FIFO_10			0x0C -#define ADP5589_FIFO_11			0x0D -#define ADP5589_FIFO_12			0x0E -#define ADP5589_FIFO_13			0x0F -#define ADP5589_FIFO_14			0x10 -#define ADP5589_FIFO_15			0x11 -#define ADP5589_FIFO_16			0x12 -#define ADP5589_GPI_INT_STAT_A		0x13 -#define ADP5589_GPI_INT_STAT_B		0x14 -#define ADP5589_GPI_INT_STAT_C		0x15 -#define ADP5589_GPI_STATUS_A		0x16 -#define ADP5589_GPI_STATUS_B		0x17 -#define ADP5589_GPI_STATUS_C		0x18 -#define ADP5589_RPULL_CONFIG_A		0x19 -#define ADP5589_RPULL_CONFIG_B		0x1A -#define ADP5589_RPULL_CONFIG_C		0x1B -#define ADP5589_RPULL_CONFIG_D		0x1C -#define ADP5589_RPULL_CONFIG_E		0x1D -#define ADP5589_GPI_INT_LEVEL_A		0x1E -#define ADP5589_GPI_INT_LEVEL_B		0x1F -#define ADP5589_GPI_INT_LEVEL_C		0x20 -#define ADP5589_GPI_EVENT_EN_A		0x21 -#define ADP5589_GPI_EVENT_EN_B		0x22 -#define ADP5589_GPI_EVENT_EN_C		0x23 -#define ADP5589_GPI_INTERRUPT_EN_A	0x24 -#define ADP5589_GPI_INTERRUPT_EN_B	0x25 -#define ADP5589_GPI_INTERRUPT_EN_C	0x26 -#define ADP5589_DEBOUNCE_DIS_A		0x27 -#define ADP5589_DEBOUNCE_DIS_B		0x28 -#define ADP5589_DEBOUNCE_DIS_C		0x29 -#define ADP5589_GPO_DATA_OUT_A		0x2A -#define ADP5589_GPO_DATA_OUT_B		0x2B -#define ADP5589_GPO_DATA_OUT_C		0x2C -#define ADP5589_GPO_OUT_MODE_A		0x2D -#define ADP5589_GPO_OUT_MODE_B		0x2E -#define ADP5589_GPO_OUT_MODE_C		0x2F -#define ADP5589_GPIO_DIRECTION_A	0x30 -#define ADP5589_GPIO_DIRECTION_B	0x31 -#define ADP5589_GPIO_DIRECTION_C	0x32 -#define ADP5589_UNLOCK1			0x33 -#define ADP5589_UNLOCK2			0x34 -#define ADP5589_EXT_LOCK_EVENT		0x35 -#define ADP5589_UNLOCK_TIMERS		0x36 -#define ADP5589_LOCK_CFG		0x37 -#define ADP5589_RESET1_EVENT_A		0x38 -#define ADP5589_RESET1_EVENT_B		0x39 -#define ADP5589_RESET1_EVENT_C		0x3A -#define ADP5589_RESET2_EVENT_A		0x3B -#define ADP5589_RESET2_EVENT_B		0x3C -#define ADP5589_RESET_CFG		0x3D -#define ADP5589_PWM_OFFT_LOW		0x3E -#define ADP5589_PWM_OFFT_HIGH		0x3F -#define ADP5589_PWM_ONT_LOW		0x40 -#define ADP5589_PWM_ONT_HIGH		0x41 -#define ADP5589_PWM_CFG			0x42 -#define ADP5589_CLOCK_DIV_CFG		0x43 -#define ADP5589_LOGIC_1_CFG		0x44 -#define ADP5589_LOGIC_2_CFG		0x45 -#define ADP5589_LOGIC_FF_CFG		0x46 -#define ADP5589_LOGIC_INT_EVENT_EN	0x47 -#define ADP5589_POLL_PTIME_CFG		0x48 -#define ADP5589_PIN_CONFIG_A		0x49 -#define ADP5589_PIN_CONFIG_B		0x4A -#define ADP5589_PIN_CONFIG_C		0x4B -#define ADP5589_PIN_CONFIG_D		0x4C -#define ADP5589_GENERAL_CFG		0x4D -#define ADP5589_INT_EN			0x4E - -#define ADP5589_DEVICE_ID_MASK	0xF - -/* Put one of these structures in i2c_board_info platform_data */ +/* + * ADP5589 specific GPI and Keymap defines + */  #define ADP5589_KEYMAPSIZE	88 @@ -127,6 +47,35 @@  #define ADP5589_GPIMAPSIZE_MAX (ADP5589_GPI_PIN_END - ADP5589_GPI_PIN_BASE + 1) +/* + * ADP5585 specific GPI and Keymap defines + */ + +#define ADP5585_KEYMAPSIZE	30 + +#define ADP5585_GPI_PIN_ROW0 37 +#define ADP5585_GPI_PIN_ROW1 38 +#define ADP5585_GPI_PIN_ROW2 39 +#define ADP5585_GPI_PIN_ROW3 40 +#define ADP5585_GPI_PIN_ROW4 41 +#define ADP5585_GPI_PIN_ROW5 42 +#define ADP5585_GPI_PIN_COL0 43 +#define ADP5585_GPI_PIN_COL1 44 +#define ADP5585_GPI_PIN_COL2 45 +#define ADP5585_GPI_PIN_COL3 46 +#define ADP5585_GPI_PIN_COL4 47 +#define GPI_LOGIC 48 + +#define ADP5585_GPI_PIN_ROW_BASE ADP5585_GPI_PIN_ROW0 +#define ADP5585_GPI_PIN_ROW_END ADP5585_GPI_PIN_ROW5 +#define ADP5585_GPI_PIN_COL_BASE ADP5585_GPI_PIN_COL0 +#define ADP5585_GPI_PIN_COL_END ADP5585_GPI_PIN_COL4 + +#define ADP5585_GPI_PIN_BASE ADP5585_GPI_PIN_ROW_BASE +#define ADP5585_GPI_PIN_END ADP5585_GPI_PIN_COL_END + +#define ADP5585_GPIMAPSIZE_MAX (ADP5585_GPI_PIN_END - ADP5585_GPI_PIN_BASE + 1) +  struct adp5589_gpi_map {  	unsigned short pin;  	unsigned short sw_evt; @@ -159,7 +108,7 @@ struct adp5589_gpi_map {  #define RESET2_POL_HIGH			(1 << 7)  #define RESET2_POL_LOW			(0 << 7) -/* Mask Bits: +/* ADP5589 Mask Bits:   * C C C C C C C C C C C | R R R R R R R R   * 1 9 8 7 6 5 4 3 2 1 0 | 7 6 5 4 3 2 1 0   * 0 @@ -168,18 +117,44 @@ struct adp5589_gpi_map {   * 8 7 6 5 4 3 2 1 0 9 8 | 7 6 5 4 3 2 1 0   */ -#define ADP_ROW(x)			(1 << (x)) -#define ADP_COL(x)			(1 << (x + 8)) +#define ADP_ROW(x)	(1 << (x)) +#define ADP_COL(x)	(1 << (x + 8)) +#define ADP5589_ROW_MASK		0xFF +#define ADP5589_COL_MASK		0xFF +#define ADP5589_COL_SHIFT		8 +#define ADP5589_MAX_ROW_NUM		7 +#define ADP5589_MAX_COL_NUM		10 + +/* ADP5585 Mask Bits: + * C C C C C | R R R R R R + * 4 3 2 1 0 | 5 4 3 2 1 0 + * + * ---- BIT -- ----------- + * 1 0 0 0 0 | 0 0 0 0 0 0 + * 0 9 8 7 6 | 5 4 3 2 1 0 + */ + +#define ADP5585_ROW_MASK		0x3F +#define ADP5585_COL_MASK		0x1F +#define ADP5585_ROW_SHIFT		0 +#define ADP5585_COL_SHIFT		6 +#define ADP5585_MAX_ROW_NUM		5 +#define ADP5585_MAX_COL_NUM		4 + +#define ADP5585_ROW(x)	(1 << ((x) & ADP5585_ROW_MASK)) +#define ADP5585_COL(x)	(1 << (((x) & ADP5585_COL_MASK) + ADP5585_COL_SHIFT)) + +/* Put one of these structures in i2c_board_info platform_data */  struct adp5589_kpad_platform_data {  	unsigned keypad_en_mask;	/* Keypad (Rows/Columns) enable mask */  	const unsigned short *keymap;	/* Pointer to keymap */  	unsigned short keymapsize;	/* Keymap size */  	bool repeat;			/* Enable key repeat */ -	bool en_keylock;		/* Enable key lock feature */ -	unsigned char unlock_key1;	/* Unlock Key 1 */ -	unsigned char unlock_key2;	/* Unlock Key 2 */ -	unsigned char unlock_timer;	/* Time in seconds [0..7] between the two unlock keys 0=disable */ +	bool en_keylock;		/* Enable key lock feature (ADP5589 only)*/ +	unsigned char unlock_key1;	/* Unlock Key 1 (ADP5589 only) */ +	unsigned char unlock_key2;	/* Unlock Key 2 (ADP5589 only) */ +	unsigned char unlock_timer;	/* Time in seconds [0..7] between the two unlock keys 0=disable (ADP5589 only) */  	unsigned char scan_cycle_time;	/* Time between consecutive scan cycles */  	unsigned char reset_cfg;	/* Reset config */  	unsigned short reset1_key_1;	/* Reset Key 1 */ diff --git a/include/linux/input/adxl34x.h b/include/linux/input/adxl34x.h index df00d998a44..57e01a7cb00 100644 --- a/include/linux/input/adxl34x.h +++ b/include/linux/input/adxl34x.h @@ -30,8 +30,9 @@ struct adxl34x_platform_data {  	 * Y, or Z participation in Tap detection. A '0' excludes the  	 * selected axis from participation in Tap detection.  	 * Setting the SUPPRESS bit suppresses Double Tap detection if -	 * acceleration greater than tap_threshold is present between -	 * taps. +	 * acceleration greater than tap_threshold is present during the +	 * tap_latency period, i.e. after the first tap but before the +	 * opening of the second tap window.  	 */  #define ADXL_SUPPRESS	(1 << 3) @@ -226,13 +227,13 @@ struct adxl34x_platform_data {  	 * detection will begin and prevent the detection of activity. This  	 * bit serially links the activity and inactivity functions. When '0'  	 * the inactivity and activity functions are concurrent. Additional -	 * information can be found in the Application section under Link -	 * Mode. +	 * information can be found in the ADXL34x datasheet's Application +	 * section under Link Mode.  	 * AUTO_SLEEP: A '1' sets the ADXL34x to switch to Sleep Mode  	 * when inactivity (acceleration has been below inactivity_threshold  	 * for at least inactivity_time) is detected and the LINK bit is set. -	 * A '0' disables automatic switching to Sleep Mode. See SLEEP -	 * for further description. +	 * A '0' disables automatic switching to Sleep Mode. See the +	 * Sleep Bit section of the ADXL34x datasheet for more information.  	 */  #define ADXL_LINK	(1 << 5) @@ -266,6 +267,12 @@ struct adxl34x_platform_data {  	u8 watermark; +	/* +	 * When acceleration measurements are received from the ADXL34x +	 * events are sent to the event subsystem. The following settings +	 * select the event type and event code for new x, y and z axis data +	 * respectively. +	 */  	u32 ev_type;	/* EV_ABS or EV_REL */  	u32 ev_code_x;	/* ABS_X,Y,Z or REL_X,Y,Z */ @@ -289,7 +296,7 @@ struct adxl34x_platform_data {  	u32 ev_code_act_inactivity;	/* EV_KEY */  	/* -	 * Use ADXL34x INT2 instead of INT1 +	 * Use ADXL34x INT2 pin instead of INT1 pin for interrupt output  	 */  	u8 use_int2; diff --git a/include/linux/integrity.h b/include/linux/integrity.h new file mode 100644 index 00000000000..a0c41256cb9 --- /dev/null +++ b/include/linux/integrity.h @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2009 IBM Corporation + * Author: Mimi Zohar <zohar@us.ibm.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, version 2 of the License. + */ + +#ifndef _LINUX_INTEGRITY_H +#define _LINUX_INTEGRITY_H + +#include <linux/fs.h> + +enum integrity_status { +	INTEGRITY_PASS = 0, +	INTEGRITY_FAIL, +	INTEGRITY_NOLABEL, +	INTEGRITY_NOXATTRS, +	INTEGRITY_UNKNOWN, +}; + +/* List of EVM protected security xattrs */ +#ifdef CONFIG_INTEGRITY +extern int integrity_inode_alloc(struct inode *inode); +extern void integrity_inode_free(struct inode *inode); + +#else +static inline int integrity_inode_alloc(struct inode *inode) +{ +	return 0; +} + +static inline void integrity_inode_free(struct inode *inode) +{ +	return; +} +#endif /* CONFIG_INTEGRITY_H */ +#endif /* _LINUX_INTEGRITY_H */ diff --git a/include/linux/intel-iommu.h b/include/linux/intel-iommu.h index 9310c699a37..e6ca56de993 100644 --- a/include/linux/intel-iommu.h +++ b/include/linux/intel-iommu.h @@ -271,7 +271,7 @@ struct qi_desc {  };  struct q_inval { -	spinlock_t      q_lock; +	raw_spinlock_t  q_lock;  	struct qi_desc  *desc;          /* invalidation queue */  	int             *desc_status;   /* desc status */  	int             free_head;      /* first free entry */ @@ -279,7 +279,7 @@ struct q_inval {  	int             free_cnt;  }; -#ifdef CONFIG_INTR_REMAP +#ifdef CONFIG_IRQ_REMAP  /* 1MB - maximum possible interrupt remapping table size */  #define INTR_REMAP_PAGE_ORDER	8  #define INTR_REMAP_TABLE_REG_SIZE	0xf @@ -311,14 +311,14 @@ struct intel_iommu {  	u64		cap;  	u64		ecap;  	u32		gcmd; /* Holds TE, EAFL. Don't need SRTP, SFL, WBF */ -	spinlock_t	register_lock; /* protect register handling */ +	raw_spinlock_t	register_lock; /* protect register handling */  	int		seq_id;	/* sequence id of the iommu */  	int		agaw; /* agaw of this iommu */  	int		msagaw; /* max sagaw of this iommu */  	unsigned int 	irq;  	unsigned char 	name[13];    /* Device Name */ -#ifdef CONFIG_DMAR +#ifdef CONFIG_INTEL_IOMMU  	unsigned long 	*domain_ids; /* bitmap of domains */  	struct dmar_domain **domains; /* ptr to domains */  	spinlock_t	lock; /* protect context, domain ids */ @@ -329,7 +329,7 @@ struct intel_iommu {  	struct q_inval  *qi;            /* Queued invalidation info */  	u32 *iommu_state; /* Store iommu states between suspend and resume.*/ -#ifdef CONFIG_INTR_REMAP +#ifdef CONFIG_IRQ_REMAP  	struct ir_table *ir_table;	/* Interrupt remapping info */  #endif  	int		node; diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h index a103732b758..a64b00e286f 100644 --- a/include/linux/interrupt.h +++ b/include/linux/interrupt.h @@ -59,6 +59,8 @@   * IRQF_NO_SUSPEND - Do not disable this IRQ during suspend   * IRQF_FORCE_RESUME - Force enable it on resume even if IRQF_NO_SUSPEND is set   * IRQF_NO_THREAD - Interrupt cannot be threaded + * IRQF_EARLY_RESUME - Resume IRQ early during syscore instead of at device + *                resume time.   */  #define IRQF_DISABLED		0x00000020  #define IRQF_SAMPLE_RANDOM	0x00000040 @@ -72,6 +74,7 @@  #define IRQF_NO_SUSPEND		0x00004000  #define IRQF_FORCE_RESUME	0x00008000  #define IRQF_NO_THREAD		0x00010000 +#define IRQF_EARLY_RESUME	0x00020000  #define IRQF_TIMER		(__IRQF_TIMER | IRQF_NO_SUSPEND | IRQF_NO_THREAD) @@ -95,6 +98,7 @@ typedef irqreturn_t (*irq_handler_t)(int, void *);   * @flags:	flags (see IRQF_* above)   * @name:	name of the device   * @dev_id:	cookie to identify the device + * @percpu_dev_id:	cookie to identify the device   * @next:	pointer to the next irqaction for shared interrupts   * @irq:	interrupt number   * @dir:	pointer to the proc/irq/NN/name entry @@ -104,17 +108,18 @@ typedef irqreturn_t (*irq_handler_t)(int, void *);   * @thread_mask:	bitmask for keeping track of @thread activity   */  struct irqaction { -	irq_handler_t handler; -	unsigned long flags; -	void *dev_id; -	struct irqaction *next; -	int irq; -	irq_handler_t thread_fn; -	struct task_struct *thread; -	unsigned long thread_flags; -	unsigned long thread_mask; -	const char *name; -	struct proc_dir_entry *dir; +	irq_handler_t		handler; +	unsigned long		flags; +	void			*dev_id; +	void __percpu		*percpu_dev_id; +	struct irqaction	*next; +	int			irq; +	irq_handler_t		thread_fn; +	struct task_struct	*thread; +	unsigned long		thread_flags; +	unsigned long		thread_mask; +	const char		*name; +	struct proc_dir_entry	*dir;  } ____cacheline_internodealigned_in_smp;  extern irqreturn_t no_action(int cpl, void *dev_id); @@ -136,6 +141,10 @@ 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 int __must_check +request_percpu_irq(unsigned int irq, irq_handler_t handler, +		   const char *devname, void __percpu *percpu_dev_id); +  extern void exit_irq_thread(void);  #else @@ -164,10 +173,18 @@ request_any_context_irq(unsigned int irq, irq_handler_t handler,  	return request_irq(irq, handler, flags, name, dev_id);  } +static inline int __must_check +request_percpu_irq(unsigned int irq, irq_handler_t handler, +		   const char *devname, void __percpu *percpu_dev_id) +{ +	return request_irq(irq, handler, 0, devname, percpu_dev_id); +} +  static inline void exit_irq_thread(void) { }  #endif  extern void free_irq(unsigned int, void *); +extern void free_percpu_irq(unsigned int, void __percpu *);  struct device; @@ -207,7 +224,9 @@ extern void devm_free_irq(struct device *dev, unsigned int irq, void *dev_id);  extern void disable_irq_nosync(unsigned int irq);  extern void disable_irq(unsigned int irq); +extern void disable_percpu_irq(unsigned int irq);  extern void enable_irq(unsigned int irq); +extern void enable_percpu_irq(unsigned int irq, unsigned int type);  /* The following three functions are for the core kernel use only. */  #ifdef CONFIG_GENERIC_HARDIRQS diff --git a/include/linux/io-mapping.h b/include/linux/io-mapping.h index 8cdcc2a199a..e44e84f0156 100644 --- a/include/linux/io-mapping.h +++ b/include/linux/io-mapping.h @@ -27,7 +27,7 @@   * The io_mapping mechanism provides an abstraction for mapping   * individual pages from an io device to the CPU in an efficient fashion.   * - * See Documentation/io_mapping.txt + * See Documentation/io-mapping.txt   */  #ifdef CONFIG_HAVE_ATOMIC_IOMAP @@ -117,6 +117,8 @@ io_mapping_unmap(void __iomem *vaddr)  #else +#include <linux/uaccess.h> +  /* this struct isn't actually defined anywhere */  struct io_mapping; @@ -138,12 +140,14 @@ static inline void __iomem *  io_mapping_map_atomic_wc(struct io_mapping *mapping,  			 unsigned long offset)  { +	pagefault_disable();  	return ((char __force __iomem *) mapping) + offset;  }  static inline void  io_mapping_unmap_atomic(void __iomem *vaddr)  { +	pagefault_enable();  }  /* Non-atomic map/unmap */ diff --git a/include/linux/iommu.h b/include/linux/iommu.h index 9940319d6f9..432acc4c054 100644 --- a/include/linux/iommu.h +++ b/include/linux/iommu.h @@ -25,15 +25,29 @@  #define IOMMU_WRITE	(2)  #define IOMMU_CACHE	(4) /* DMA cache coherency */ +struct iommu_ops; +struct bus_type;  struct device; +struct iommu_domain; + +/* iommu fault flags */ +#define IOMMU_FAULT_READ	0x0 +#define IOMMU_FAULT_WRITE	0x1 + +typedef int (*iommu_fault_handler_t)(struct iommu_domain *, +				struct device *, unsigned long, int);  struct iommu_domain { +	struct iommu_ops *ops;  	void *priv; +	iommu_fault_handler_t handler;  };  #define IOMMU_CAP_CACHE_COHERENCY	0x1  #define IOMMU_CAP_INTR_REMAP		0x2	/* isolates device intrs */ +#ifdef CONFIG_IOMMU_API +  struct iommu_ops {  	int (*domain_init)(struct iommu_domain *domain);  	void (*domain_destroy)(struct iommu_domain *domain); @@ -49,11 +63,9 @@ struct iommu_ops {  			      unsigned long cap);  }; -#ifdef CONFIG_IOMMU_API - -extern void register_iommu(struct iommu_ops *ops); -extern bool iommu_found(void); -extern struct iommu_domain *iommu_domain_alloc(void); +extern int bus_set_iommu(struct bus_type *bus, struct iommu_ops *ops); +extern bool iommu_present(struct bus_type *bus); +extern struct iommu_domain *iommu_domain_alloc(struct bus_type *bus);  extern void iommu_domain_free(struct iommu_domain *domain);  extern int iommu_attach_device(struct iommu_domain *domain,  			       struct device *dev); @@ -67,19 +79,58 @@ 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,  				unsigned long cap); +extern void iommu_set_fault_handler(struct iommu_domain *domain, +					iommu_fault_handler_t handler); -#else /* CONFIG_IOMMU_API */ - -static inline void register_iommu(struct iommu_ops *ops) +/** + * report_iommu_fault() - report about an IOMMU fault to the IOMMU framework + * @domain: the iommu domain where the fault has happened + * @dev: the device where the fault has happened + * @iova: the faulting address + * @flags: mmu fault flags (e.g. IOMMU_FAULT_READ/IOMMU_FAULT_WRITE/...) + * + * This function should be called by the low-level IOMMU implementations + * whenever IOMMU faults happen, to allow high-level users, that are + * interested in such events, to know about them. + * + * This event may be useful for several possible use cases: + * - mere logging of the event + * - dynamic TLB/PTE loading + * - if restarting of the faulting device is required + * + * Returns 0 on success and an appropriate error code otherwise (if dynamic + * PTE/TLB loading will one day be supported, implementations will be able + * to tell whether it succeeded or not according to this return value). + * + * Specifically, -ENOSYS is returned if a fault handler isn't installed + * (though fault handlers can also return -ENOSYS, in case they want to + * elicit the default behavior of the IOMMU drivers). + */ +static inline int report_iommu_fault(struct iommu_domain *domain, +		struct device *dev, unsigned long iova, int flags)  { +	int ret = -ENOSYS; + +	/* +	 * if upper layers showed interest and installed a fault handler, +	 * invoke it. +	 */ +	if (domain->handler) +		ret = domain->handler(domain, dev, iova, flags); + +	return ret;  } -static inline bool iommu_found(void) +#else /* CONFIG_IOMMU_API */ + +struct iommu_ops {}; + +static inline bool iommu_present(struct bus_type *bus)  {  	return false;  } -static inline struct iommu_domain *iommu_domain_alloc(void) +static inline struct iommu_domain *iommu_domain_alloc(struct bus_type *bus)  {  	return NULL;  } @@ -123,6 +174,11 @@ static inline int domain_has_cap(struct iommu_domain *domain,  	return 0;  } +static inline void iommu_set_fault_handler(struct iommu_domain *domain, +					iommu_fault_handler_t handler) +{ +} +  #endif /* CONFIG_IOMMU_API */  #endif /* __LINUX_IOMMU_H */ diff --git a/include/linux/ip6_tunnel.h b/include/linux/ip6_tunnel.h index acb9ad684d6..bf22b031790 100644 --- a/include/linux/ip6_tunnel.h +++ b/include/linux/ip6_tunnel.h @@ -16,6 +16,8 @@  #define IP6_TNL_F_MIP6_DEV 0x8  /* copy DSCP from the outer packet */  #define IP6_TNL_F_RCV_DSCP_COPY 0x10 +/* copy fwmark from inner packet */ +#define IP6_TNL_F_USE_ORIG_FWMARK 0x20  struct ip6_tnl_parm {  	char name[IFNAMSIZ];	/* name of tunnel device */ diff --git a/include/linux/ipx.h b/include/linux/ipx.h index aabb1d29402..3d48014cdd7 100644 --- a/include/linux/ipx.h +++ b/include/linux/ipx.h @@ -7,7 +7,7 @@  #define IPX_MTU		576  struct sockaddr_ipx { -	sa_family_t	sipx_family; +	__kernel_sa_family_t sipx_family;  	__be16		sipx_port;  	__be32		sipx_network;  	unsigned char 	sipx_node[IPX_NODE_LEN]; diff --git a/include/linux/irda.h b/include/linux/irda.h index 00bdad0e851..a014c325231 100644 --- a/include/linux/irda.h +++ b/include/linux/irda.h @@ -26,12 +26,9 @@  #define KERNEL_IRDA_H  #include <linux/types.h> +#include <linux/socket.h> -/* Please do *not* add any #include in this file, this file is - * included as-is in user space. - * Please fix the calling file to properly included needed files before - * this one, or preferably to include <net/irda/irda.h> instead. - * Jean II */ +/* Note that this file is shared with user space. */  /* Hint bit positions for first hint byte */  #define HINT_PNP         0x01 @@ -125,7 +122,7 @@ enum {  #define LSAP_ANY              0xff  struct sockaddr_irda { -	sa_family_t sir_family;   /* AF_IRDA */ +	__kernel_sa_family_t sir_family; /* AF_IRDA */  	__u8        sir_lsap_sel; /* LSAP selector */  	__u32       sir_addr;     /* Device address */  	char        sir_name[25]; /* Usually <service>:IrDA:TinyTP */ diff --git a/include/linux/irq.h b/include/linux/irq.h index 59517300a31..59e49c80cc2 100644 --- a/include/linux/irq.h +++ b/include/linux/irq.h @@ -66,6 +66,7 @@ typedef	void (*irq_preflow_handler_t)(struct irq_data *data);   * IRQ_NO_BALANCING		- Interrupt cannot be balanced (affinity set)   * IRQ_MOVE_PCNTXT		- Interrupt can be migrated from process context   * IRQ_NESTED_TRHEAD		- Interrupt nests into another thread + * IRQ_PER_CPU_DEVID		- Dev_id is a per-cpu variable   */  enum {  	IRQ_TYPE_NONE		= 0x00000000, @@ -88,12 +89,13 @@ enum {  	IRQ_MOVE_PCNTXT		= (1 << 14),  	IRQ_NESTED_THREAD	= (1 << 15),  	IRQ_NOTHREAD		= (1 << 16), +	IRQ_PER_CPU_DEVID	= (1 << 17),  };  #define IRQF_MODIFY_MASK	\  	(IRQ_TYPE_SENSE_MASK | IRQ_NOPROBE | IRQ_NOREQUEST | \  	 IRQ_NOAUTOEN | IRQ_MOVE_PCNTXT | IRQ_LEVEL | IRQ_NO_BALANCING | \ -	 IRQ_PER_CPU | IRQ_NESTED_THREAD) +	 IRQ_PER_CPU | IRQ_NESTED_THREAD | IRQ_NOTHREAD | IRQ_PER_CPU_DEVID)  #define IRQ_NO_BALANCING_MASK	(IRQ_PER_CPU | IRQ_NO_BALANCING) @@ -336,12 +338,14 @@ struct irq_chip {   * IRQCHIP_MASK_ON_SUSPEND:	Mask non wake irqs in the suspend path   * IRQCHIP_ONOFFLINE_ENABLED:	Only call irq_on/off_line callbacks   *				when irq enabled + * IRQCHIP_SKIP_SET_WAKE:	Skip chip.irq_set_wake(), for this irq chip   */  enum {  	IRQCHIP_SET_TYPE_MASKED		= (1 <<  0),  	IRQCHIP_EOI_IF_HANDLED		= (1 <<  1),  	IRQCHIP_MASK_ON_SUSPEND		= (1 <<  2),  	IRQCHIP_ONOFFLINE_ENABLED	= (1 <<  3), +	IRQCHIP_SKIP_SET_WAKE		= (1 <<  4),  };  /* This include will go away once we isolated irq_desc usage to core code */ @@ -365,6 +369,8 @@ enum {  struct irqaction;  extern int setup_irq(unsigned int irq, struct irqaction *new);  extern void remove_irq(unsigned int irq, struct irqaction *act); +extern int setup_percpu_irq(unsigned int irq, struct irqaction *new); +extern void remove_percpu_irq(unsigned int irq, struct irqaction *act);  extern void irq_cpu_online(void);  extern void irq_cpu_offline(void); @@ -392,6 +398,7 @@ extern void handle_edge_irq(unsigned int irq, struct irq_desc *desc);  extern void handle_edge_eoi_irq(unsigned int irq, struct irq_desc *desc);  extern void handle_simple_irq(unsigned int irq, struct irq_desc *desc);  extern void handle_percpu_irq(unsigned int irq, struct irq_desc *desc); +extern void handle_percpu_devid_irq(unsigned int irq, struct irq_desc *desc);  extern void handle_bad_irq(unsigned int irq, struct irq_desc *desc);  extern void handle_nested_irq(unsigned int irq); @@ -420,6 +427,8 @@ static inline void irq_set_chip_and_handler(unsigned int irq, struct irq_chip *c  	irq_set_chip_and_handler_name(irq, chip, handle, NULL);  } +extern int irq_set_percpu_devid(unsigned int irq); +  extern void  __irq_set_handler(unsigned int irq, irq_flow_handler_t handle, int is_chained,  		  const char *name); @@ -481,6 +490,13 @@ static inline void irq_set_nested_thread(unsigned int irq, bool nest)  		irq_clear_status_flags(irq, IRQ_NESTED_THREAD);  } +static inline void irq_set_percpu_devid_flags(unsigned int irq) +{ +	irq_set_status_flags(irq, +			     IRQ_NOAUTOEN | IRQ_PER_CPU | IRQ_NOTHREAD | +			     IRQ_NOPROBE | IRQ_PER_CPU_DEVID); +} +  /* Handle dynamic irq creation and destruction */  extern unsigned int create_irq_nr(unsigned int irq_want, int node);  extern int create_irq(void); diff --git a/include/linux/irq_work.h b/include/linux/irq_work.h index 4fa09d4d0b7..6a9e8f5399e 100644 --- a/include/linux/irq_work.h +++ b/include/linux/irq_work.h @@ -1,20 +1,23 @@  #ifndef _LINUX_IRQ_WORK_H  #define _LINUX_IRQ_WORK_H +#include <linux/llist.h> +  struct irq_work { -	struct irq_work *next; +	unsigned long flags; +	struct llist_node llnode;  	void (*func)(struct irq_work *);  };  static inline -void init_irq_work(struct irq_work *entry, void (*func)(struct irq_work *)) +void init_irq_work(struct irq_work *work, void (*func)(struct irq_work *))  { -	entry->next = NULL; -	entry->func = func; +	work->flags = 0; +	work->func = func;  } -bool irq_work_queue(struct irq_work *entry); +bool irq_work_queue(struct irq_work *work);  void irq_work_run(void); -void irq_work_sync(struct irq_work *entry); +void irq_work_sync(struct irq_work *work);  #endif /* _LINUX_IRQ_WORK_H */ diff --git a/include/linux/irqdesc.h b/include/linux/irqdesc.h index 150134ac709..6b69c2c9dff 100644 --- a/include/linux/irqdesc.h +++ b/include/linux/irqdesc.h @@ -53,6 +53,7 @@ struct irq_desc {  	unsigned long		last_unhandled;	/* Aging timer for unhandled count */  	unsigned int		irqs_unhandled;  	raw_spinlock_t		lock; +	struct cpumask		*percpu_enabled;  #ifdef CONFIG_SMP  	const struct cpumask	*affinity_hint;  	struct irq_affinity_notify *affinity_notify; diff --git a/include/linux/irqdomain.h b/include/linux/irqdomain.h index 3ad553e8eae..99834e581b9 100644 --- a/include/linux/irqdomain.h +++ b/include/linux/irqdomain.h @@ -47,6 +47,7 @@ struct irq_domain_ops {   *            of the irq_domain is responsible for allocating the array of   *            irq_desc structures.   * @nr_irq: Number of irqs managed by the irq domain + * @hwirq_base: Starting number for hwirqs managed by the irq domain   * @ops: pointer to irq_domain methods   * @priv: private data pointer for use by owner.  Not touched by irq_domain   *        core code. @@ -57,6 +58,7 @@ struct irq_domain {  	struct list_head list;  	unsigned int irq_base;  	unsigned int nr_irq; +	unsigned int hwirq_base;  	const struct irq_domain_ops *ops;  	void *priv;  	struct device_node *of_node; @@ -72,9 +74,21 @@ struct irq_domain {  static inline unsigned int irq_domain_to_irq(struct irq_domain *d,  					     unsigned long hwirq)  { -	return d->ops->to_irq ? d->ops->to_irq(d, hwirq) : d->irq_base + hwirq; +	if (d->ops->to_irq) +		return d->ops->to_irq(d, hwirq); +	if (WARN_ON(hwirq < d->hwirq_base)) +		return 0; +	return d->irq_base + hwirq - d->hwirq_base;  } +#define irq_domain_for_each_hwirq(d, hw) \ +	for (hw = d->hwirq_base; hw < d->hwirq_base + d->nr_irq; hw++) + +#define irq_domain_for_each_irq(d, hw, irq) \ +	for (hw = d->hwirq_base, irq = irq_domain_to_irq(d, hw); \ +	     hw < d->hwirq_base + d->nr_irq; \ +	     hw++, irq = irq_domain_to_irq(d, hw)) +  extern void irq_domain_add(struct irq_domain *domain);  extern void irq_domain_del(struct irq_domain *domain);  #endif /* CONFIG_IRQ_DOMAIN */ diff --git a/include/linux/isdn.h b/include/linux/isdn.h index 44cd663c53b..4ccf95d681b 100644 --- a/include/linux/isdn.h +++ b/include/linux/isdn.h @@ -68,7 +68,7 @@  #define ISDN_NET_ENCAP_SYNCPPP    4  #define ISDN_NET_ENCAP_UIHDLC     5  #define ISDN_NET_ENCAP_CISCOHDLCK 6 /* With SLARP and keepalive    */ -#define ISDN_NET_ENCAP_X25IFACE   7 /* Documentation/networking/x25-iface.txt*/ +#define ISDN_NET_ENCAP_X25IFACE   7 /* Documentation/networking/x25-iface.txt */  #define ISDN_NET_ENCAP_MAX_ENCAP  ISDN_NET_ENCAP_X25IFACE  /* Facility which currently uses an ISDN-channel */ diff --git a/include/linux/jbd.h b/include/linux/jbd.h index e6a5e34bed4..c7acdde3243 100644 --- a/include/linux/jbd.h +++ b/include/linux/jbd.h @@ -244,6 +244,7 @@ typedef struct journal_superblock_s  #include <linux/fs.h>  #include <linux/sched.h> +#include <linux/jbd_common.h>  #define J_ASSERT(assert)	BUG_ON(!(assert)) @@ -270,69 +271,6 @@ typedef struct journal_superblock_s  #define J_EXPECT_JH(jh, expr, why...)	__journal_expect(expr, ## why)  #endif -enum jbd_state_bits { -	BH_JBD			/* Has an attached ext3 journal_head */ -	  = BH_PrivateStart, -	BH_JWrite,		/* Being written to log (@@@ DEBUGGING) */ -	BH_Freed,		/* Has been freed (truncated) */ -	BH_Revoked,		/* Has been revoked from the log */ -	BH_RevokeValid,		/* Revoked flag is valid */ -	BH_JBDDirty,		/* Is dirty but journaled */ -	BH_State,		/* Pins most journal_head state */ -	BH_JournalHead,		/* Pins bh->b_private and jh->b_bh */ -	BH_Unshadow,		/* Dummy bit, for BJ_Shadow wakeup filtering */ -}; - -BUFFER_FNS(JBD, jbd) -BUFFER_FNS(JWrite, jwrite) -BUFFER_FNS(JBDDirty, jbddirty) -TAS_BUFFER_FNS(JBDDirty, jbddirty) -BUFFER_FNS(Revoked, revoked) -TAS_BUFFER_FNS(Revoked, revoked) -BUFFER_FNS(RevokeValid, revokevalid) -TAS_BUFFER_FNS(RevokeValid, revokevalid) -BUFFER_FNS(Freed, freed) - -static inline struct buffer_head *jh2bh(struct journal_head *jh) -{ -	return jh->b_bh; -} - -static inline struct journal_head *bh2jh(struct buffer_head *bh) -{ -	return bh->b_private; -} - -static inline void jbd_lock_bh_state(struct buffer_head *bh) -{ -	bit_spin_lock(BH_State, &bh->b_state); -} - -static inline int jbd_trylock_bh_state(struct buffer_head *bh) -{ -	return bit_spin_trylock(BH_State, &bh->b_state); -} - -static inline int jbd_is_locked_bh_state(struct buffer_head *bh) -{ -	return bit_spin_is_locked(BH_State, &bh->b_state); -} - -static inline void jbd_unlock_bh_state(struct buffer_head *bh) -{ -	bit_spin_unlock(BH_State, &bh->b_state); -} - -static inline void jbd_lock_bh_journal_head(struct buffer_head *bh) -{ -	bit_spin_lock(BH_JournalHead, &bh->b_state); -} - -static inline void jbd_unlock_bh_journal_head(struct buffer_head *bh) -{ -	bit_spin_unlock(BH_JournalHead, &bh->b_state); -} -  struct jbd_revoke_table_s;  /** diff --git a/include/linux/jbd2.h b/include/linux/jbd2.h index 38f307b8c33..2092ea21e46 100644 --- a/include/linux/jbd2.h +++ b/include/linux/jbd2.h @@ -275,6 +275,7 @@ typedef struct journal_superblock_s  #include <linux/fs.h>  #include <linux/sched.h> +#include <linux/jbd_common.h>  #define J_ASSERT(assert)	BUG_ON(!(assert)) @@ -302,70 +303,6 @@ typedef struct journal_superblock_s  #define J_EXPECT_JH(jh, expr, why...)	__journal_expect(expr, ## why)  #endif -enum jbd_state_bits { -	BH_JBD			/* Has an attached ext3 journal_head */ -	  = BH_PrivateStart, -	BH_JWrite,		/* Being written to log (@@@ DEBUGGING) */ -	BH_Freed,		/* Has been freed (truncated) */ -	BH_Revoked,		/* Has been revoked from the log */ -	BH_RevokeValid,		/* Revoked flag is valid */ -	BH_JBDDirty,		/* Is dirty but journaled */ -	BH_State,		/* Pins most journal_head state */ -	BH_JournalHead,		/* Pins bh->b_private and jh->b_bh */ -	BH_Unshadow,		/* Dummy bit, for BJ_Shadow wakeup filtering */ -	BH_JBDPrivateStart,	/* First bit available for private use by FS */ -}; - -BUFFER_FNS(JBD, jbd) -BUFFER_FNS(JWrite, jwrite) -BUFFER_FNS(JBDDirty, jbddirty) -TAS_BUFFER_FNS(JBDDirty, jbddirty) -BUFFER_FNS(Revoked, revoked) -TAS_BUFFER_FNS(Revoked, revoked) -BUFFER_FNS(RevokeValid, revokevalid) -TAS_BUFFER_FNS(RevokeValid, revokevalid) -BUFFER_FNS(Freed, freed) - -static inline struct buffer_head *jh2bh(struct journal_head *jh) -{ -	return jh->b_bh; -} - -static inline struct journal_head *bh2jh(struct buffer_head *bh) -{ -	return bh->b_private; -} - -static inline void jbd_lock_bh_state(struct buffer_head *bh) -{ -	bit_spin_lock(BH_State, &bh->b_state); -} - -static inline int jbd_trylock_bh_state(struct buffer_head *bh) -{ -	return bit_spin_trylock(BH_State, &bh->b_state); -} - -static inline int jbd_is_locked_bh_state(struct buffer_head *bh) -{ -	return bit_spin_is_locked(BH_State, &bh->b_state); -} - -static inline void jbd_unlock_bh_state(struct buffer_head *bh) -{ -	bit_spin_unlock(BH_State, &bh->b_state); -} - -static inline void jbd_lock_bh_journal_head(struct buffer_head *bh) -{ -	bit_spin_lock(BH_JournalHead, &bh->b_state); -} - -static inline void jbd_unlock_bh_journal_head(struct buffer_head *bh) -{ -	bit_spin_unlock(BH_JournalHead, &bh->b_state); -} -  /* Flags in jbd_inode->i_flags */  #define __JI_COMMIT_RUNNING 0  /* Commit of the inode data in progress. We use this flag to protect us from @@ -1106,9 +1043,9 @@ static inline handle_t *journal_current_handle(void)   */  extern handle_t *jbd2_journal_start(journal_t *, int nblocks); -extern handle_t *jbd2__journal_start(journal_t *, int nblocks, int gfp_mask); +extern handle_t *jbd2__journal_start(journal_t *, int nblocks, gfp_t gfp_mask);  extern int	 jbd2_journal_restart(handle_t *, int nblocks); -extern int	 jbd2__journal_restart(handle_t *, int nblocks, int gfp_mask); +extern int	 jbd2__journal_restart(handle_t *, int nblocks, gfp_t gfp_mask);  extern int	 jbd2_journal_extend (handle_t *, int nblocks);  extern int	 jbd2_journal_get_write_access(handle_t *, struct buffer_head *);  extern int	 jbd2_journal_get_create_access (handle_t *, struct buffer_head *); diff --git a/include/linux/jbd_common.h b/include/linux/jbd_common.h new file mode 100644 index 00000000000..6230f8556a4 --- /dev/null +++ b/include/linux/jbd_common.h @@ -0,0 +1,68 @@ +#ifndef _LINUX_JBD_STATE_H +#define _LINUX_JBD_STATE_H + +enum jbd_state_bits { +	BH_JBD			/* Has an attached ext3 journal_head */ +	  = BH_PrivateStart, +	BH_JWrite,		/* Being written to log (@@@ DEBUGGING) */ +	BH_Freed,		/* Has been freed (truncated) */ +	BH_Revoked,		/* Has been revoked from the log */ +	BH_RevokeValid,		/* Revoked flag is valid */ +	BH_JBDDirty,		/* Is dirty but journaled */ +	BH_State,		/* Pins most journal_head state */ +	BH_JournalHead,		/* Pins bh->b_private and jh->b_bh */ +	BH_Unshadow,		/* Dummy bit, for BJ_Shadow wakeup filtering */ +	BH_JBDPrivateStart,	/* First bit available for private use by FS */ +}; + +BUFFER_FNS(JBD, jbd) +BUFFER_FNS(JWrite, jwrite) +BUFFER_FNS(JBDDirty, jbddirty) +TAS_BUFFER_FNS(JBDDirty, jbddirty) +BUFFER_FNS(Revoked, revoked) +TAS_BUFFER_FNS(Revoked, revoked) +BUFFER_FNS(RevokeValid, revokevalid) +TAS_BUFFER_FNS(RevokeValid, revokevalid) +BUFFER_FNS(Freed, freed) + +static inline struct buffer_head *jh2bh(struct journal_head *jh) +{ +	return jh->b_bh; +} + +static inline struct journal_head *bh2jh(struct buffer_head *bh) +{ +	return bh->b_private; +} + +static inline void jbd_lock_bh_state(struct buffer_head *bh) +{ +	bit_spin_lock(BH_State, &bh->b_state); +} + +static inline int jbd_trylock_bh_state(struct buffer_head *bh) +{ +	return bit_spin_trylock(BH_State, &bh->b_state); +} + +static inline int jbd_is_locked_bh_state(struct buffer_head *bh) +{ +	return bit_spin_is_locked(BH_State, &bh->b_state); +} + +static inline void jbd_unlock_bh_state(struct buffer_head *bh) +{ +	bit_spin_unlock(BH_State, &bh->b_state); +} + +static inline void jbd_lock_bh_journal_head(struct buffer_head *bh) +{ +	bit_spin_lock(BH_JournalHead, &bh->b_state); +} + +static inline void jbd_unlock_bh_journal_head(struct buffer_head *bh) +{ +	bit_spin_unlock(BH_JournalHead, &bh->b_state); +} + +#endif diff --git a/include/linux/jiffies.h b/include/linux/jiffies.h index f97672a36fa..265e2c3cbd1 100644 --- a/include/linux/jiffies.h +++ b/include/linux/jiffies.h @@ -303,7 +303,7 @@ extern void jiffies_to_timespec(const unsigned long jiffies,  extern unsigned long timeval_to_jiffies(const struct timeval *value);  extern void jiffies_to_timeval(const unsigned long jiffies,  			       struct timeval *value); -extern clock_t jiffies_to_clock_t(long x); +extern clock_t jiffies_to_clock_t(unsigned long x);  extern unsigned long clock_t_to_jiffies(unsigned long x);  extern u64 jiffies_64_to_clock_t(u64 x);  extern u64 nsec_to_clock_t(u64 x); diff --git a/include/linux/kallsyms.h b/include/linux/kallsyms.h index 0df513b7a9f..387571959dd 100644 --- a/include/linux/kallsyms.h +++ b/include/linux/kallsyms.h @@ -101,9 +101,8 @@ static inline int lookup_symbol_attrs(unsigned long addr, unsigned long *size, u  #endif /*CONFIG_KALLSYMS*/  /* This macro allows us to keep printk typechecking */ -static void __check_printsym_format(const char *fmt, ...) -__attribute__((format(printf,1,2))); -static inline void __check_printsym_format(const char *fmt, ...) +static __printf(1, 2) +void __check_printsym_format(const char *fmt, ...)  {  } diff --git a/include/linux/kdb.h b/include/linux/kdb.h index 529d9a0c75a..064725854db 100644 --- a/include/linux/kdb.h +++ b/include/linux/kdb.h @@ -114,12 +114,9 @@ typedef enum {  } 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 __printf(1, 0) int vkdb_printf(const char *fmt, va_list args); +extern __printf(1, 2) int kdb_printf(const char *, ...); +typedef __printf(1, 2) int (*kdb_printf_t)(const char *, ...);  extern void kdb_init(int level); diff --git a/include/linux/kernel.h b/include/linux/kernel.h index 46ac9a50528..e8b1597b5cf 100644 --- a/include/linux/kernel.h +++ b/include/linux/kernel.h @@ -287,6 +287,8 @@ static inline int __must_check kstrtos32_from_user(const char __user *s, size_t  	return kstrtoint_from_user(s, count, base, res);  } +/* Obsolete, do not use.  Use kstrto<foo> instead */ +  extern unsigned long simple_strtoul(const char *,char **,unsigned int);  extern long simple_strtol(const char *,char **,unsigned int);  extern unsigned long long simple_strtoull(const char *,char **,unsigned int); @@ -296,20 +298,20 @@ extern long long simple_strtoll(const char *,char **,unsigned int);  #define strict_strtoull	kstrtoull  #define strict_strtoll	kstrtoll -extern int sprintf(char * buf, const char * fmt, ...) -	__attribute__ ((format (printf, 2, 3))); -extern int vsprintf(char *buf, const char *, va_list) -	__attribute__ ((format (printf, 2, 0))); -extern int snprintf(char * buf, size_t size, const char * fmt, ...) -	__attribute__ ((format (printf, 3, 4))); -extern int vsnprintf(char *buf, size_t size, const char *fmt, va_list args) -	__attribute__ ((format (printf, 3, 0))); -extern int scnprintf(char * buf, size_t size, const char * fmt, ...) -	__attribute__ ((format (printf, 3, 4))); -extern int vscnprintf(char *buf, size_t size, const char *fmt, va_list args) -	__attribute__ ((format (printf, 3, 0))); -extern char *kasprintf(gfp_t gfp, const char *fmt, ...) -	__attribute__ ((format (printf, 2, 3))); +/* lib/printf utilities */ + +extern __printf(2, 3) int sprintf(char *buf, const char * fmt, ...); +extern __printf(2, 0) int vsprintf(char *buf, const char *, va_list); +extern __printf(3, 4) +int snprintf(char *buf, size_t size, const char *fmt, ...); +extern __printf(3, 0) +int vsnprintf(char *buf, size_t size, const char *fmt, va_list args); +extern __printf(3, 4) +int scnprintf(char *buf, size_t size, const char *fmt, ...); +extern __printf(3, 0) +int vscnprintf(char *buf, size_t size, const char *fmt, va_list args); +extern __printf(2, 3) +char *kasprintf(gfp_t gfp, const char *fmt, ...);  extern char *kvasprintf(gfp_t gfp, const char *fmt, va_list args);  extern int sscanf(const char *, const char *, ...) @@ -369,20 +371,26 @@ extern enum system_states {  #define TAINT_WARN			9  #define TAINT_CRAP			10  #define TAINT_FIRMWARE_WORKAROUND	11 +#define TAINT_OOT_MODULE		12  extern const char hex_asc[];  #define hex_asc_lo(x)	hex_asc[((x) & 0x0f)]  #define hex_asc_hi(x)	hex_asc[((x) & 0xf0) >> 4] -static inline char *pack_hex_byte(char *buf, u8 byte) +static inline char *hex_byte_pack(char *buf, u8 byte)  {  	*buf++ = hex_asc_hi(byte);  	*buf++ = hex_asc_lo(byte);  	return buf;  } +static inline char * __deprecated pack_hex_byte(char *buf, u8 byte) +{ +	return hex_byte_pack(buf, byte); +} +  extern int hex_to_bin(char ch); -extern void hex2bin(u8 *dst, const char *src, size_t count); +extern int __must_check hex2bin(u8 *dst, const char *src, size_t count);  /*   * General tracing related utility functions - trace_printk(), @@ -427,8 +435,8 @@ extern void tracing_start(void);  extern void tracing_stop(void);  extern void ftrace_off_permanent(void); -static inline void __attribute__ ((format (printf, 1, 2))) -____trace_printk_check_format(const char *fmt, ...) +static inline __printf(1, 2) +void ____trace_printk_check_format(const char *fmt, ...)  {  }  #define __trace_printk_check_format(fmt, args...)			\ @@ -467,13 +475,11 @@ do {									\  		__trace_printk(_THIS_IP_, fmt, ##args);		\  } while (0) -extern int -__trace_bprintk(unsigned long ip, const char *fmt, ...) -	__attribute__ ((format (printf, 2, 3))); +extern __printf(2, 3) +int __trace_bprintk(unsigned long ip, const char *fmt, ...); -extern int -__trace_printk(unsigned long ip, const char *fmt, ...) -	__attribute__ ((format (printf, 2, 3))); +extern __printf(2, 3) +int __trace_printk(unsigned long ip, const char *fmt, ...);  extern void trace_dump_stack(void); @@ -502,8 +508,8 @@ __ftrace_vprintk(unsigned long ip, const char *fmt, va_list ap);  extern void ftrace_dump(enum ftrace_dump_mode oops_dump_mode);  #else -static inline int -trace_printk(const char *fmt, ...) __attribute__ ((format (printf, 1, 2))); +static inline __printf(1, 2) +int trace_printk(const char *fmt, ...);  static inline void tracing_start(void) { }  static inline void tracing_stop(void) { } diff --git a/include/linux/kexec.h b/include/linux/kexec.h index c2478a342cd..2fa0901219d 100644 --- a/include/linux/kexec.h +++ b/include/linux/kexec.h @@ -33,6 +33,14 @@  #error KEXEC_ARCH not defined  #endif +#ifndef KEXEC_CRASH_CONTROL_MEMORY_LIMIT +#define KEXEC_CRASH_CONTROL_MEMORY_LIMIT KEXEC_CONTROL_MEMORY_LIMIT +#endif + +#ifndef KEXEC_CRASH_MEM_ALIGN +#define KEXEC_CRASH_MEM_ALIGN PAGE_SIZE +#endif +  #define KEXEC_NOTE_HEAD_BYTES ALIGN(sizeof(struct elf_note), 4)  #define KEXEC_CORE_NOTE_NAME "CORE"  #define KEXEC_CORE_NOTE_NAME_BYTES ALIGN(sizeof(KEXEC_CORE_NOTE_NAME), 4) @@ -129,9 +137,11 @@ extern void crash_kexec(struct pt_regs *);  int kexec_should_crash(struct task_struct *);  void crash_save_cpu(struct pt_regs *regs, int cpu);  void crash_save_vmcoreinfo(void); +void crash_map_reserved_pages(void); +void crash_unmap_reserved_pages(void);  void arch_crash_save_vmcoreinfo(void); -void vmcoreinfo_append_str(const char *fmt, ...) -	__attribute__ ((format (printf, 1, 2))); +__printf(1, 2) +void vmcoreinfo_append_str(const char *fmt, ...);  unsigned long paddr_vmcoreinfo_note(void);  #define VMCOREINFO_OSRELEASE(value) \ diff --git a/include/linux/kmod.h b/include/linux/kmod.h index 0da38cf7db7..b16f6539073 100644 --- a/include/linux/kmod.h +++ b/include/linux/kmod.h @@ -32,8 +32,8 @@  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, ...) \ -	__attribute__((format(printf, 2, 3))); +extern __printf(2, 3) +int __request_module(bool wait, const char *name, ...);  #define request_module(mod...) __request_module(true, mod)  #define request_module_nowait(mod...) __request_module(false, mod)  #define try_then_request_module(x, mod...) \ diff --git a/include/linux/kobject.h b/include/linux/kobject.h index 668729cc0fe..ad81e1c5148 100644 --- a/include/linux/kobject.h +++ b/include/linux/kobject.h @@ -72,8 +72,8 @@ struct kobject {  	unsigned int uevent_suppress:1;  }; -extern int kobject_set_name(struct kobject *kobj, const char *name, ...) -			    __attribute__((format(printf, 2, 3))); +extern __printf(2, 3) +int kobject_set_name(struct kobject *kobj, const char *name, ...);  extern int kobject_set_name_vargs(struct kobject *kobj, const char *fmt,  				  va_list vargs); @@ -83,15 +83,13 @@ static inline const char *kobject_name(const struct kobject *kobj)  }  extern void kobject_init(struct kobject *kobj, struct kobj_type *ktype); -extern int __must_check kobject_add(struct kobject *kobj, -				    struct kobject *parent, -				    const char *fmt, ...) -	__attribute__((format(printf, 3, 4))); -extern int __must_check kobject_init_and_add(struct kobject *kobj, -					     struct kobj_type *ktype, -					     struct kobject *parent, -					     const char *fmt, ...) -	__attribute__((format(printf, 4, 5))); +extern __printf(3, 4) __must_check +int kobject_add(struct kobject *kobj, struct kobject *parent, +		const char *fmt, ...); +extern __printf(4, 5) __must_check +int kobject_init_and_add(struct kobject *kobj, +			 struct kobj_type *ktype, struct kobject *parent, +			 const char *fmt, ...);  extern void kobject_del(struct kobject *kobj); @@ -212,8 +210,8 @@ int kobject_uevent(struct kobject *kobj, enum kobject_action action);  int kobject_uevent_env(struct kobject *kobj, enum kobject_action action,  			char *envp[]); -int add_uevent_var(struct kobj_uevent_env *env, const char *format, ...) -	__attribute__((format (printf, 2, 3))); +__printf(2, 3) +int add_uevent_var(struct kobj_uevent_env *env, const char *format, ...);  int kobject_action_type(const char *buf, size_t count,  			enum kobject_action *type); @@ -226,7 +224,7 @@ static inline int kobject_uevent_env(struct kobject *kobj,  				      char *envp[])  { return 0; } -static inline __attribute__((format(printf, 2, 3))) +static inline __printf(2, 3)  int add_uevent_var(struct kobj_uevent_env *env, const char *format, ...)  { return 0; } diff --git a/include/linux/kprobes.h b/include/linux/kprobes.h index dd7c12e875b..dce6e4dbeda 100644 --- a/include/linux/kprobes.h +++ b/include/linux/kprobes.h @@ -181,7 +181,7 @@ struct kretprobe {  	int nmissed;  	size_t data_size;  	struct hlist_head free_instances; -	spinlock_t lock; +	raw_spinlock_t lock;  };  struct kretprobe_instance { diff --git a/include/linux/kthread.h b/include/linux/kthread.h index 1e923e5e88e..5cac19b3a26 100644 --- a/include/linux/kthread.h +++ b/include/linux/kthread.h @@ -4,11 +4,11 @@  #include <linux/err.h>  #include <linux/sched.h> +__printf(4, 5)  struct task_struct *kthread_create_on_node(int (*threadfn)(void *data),  					   void *data,  					   int node, -					   const char namefmt[], ...) -	__attribute__((format(printf, 4, 5))); +					   const char namefmt[], ...);  #define kthread_create(threadfn, data, namefmt, arg...) \  	kthread_create_on_node(threadfn, data, -1, namefmt, ##arg) diff --git a/include/linux/kvm.h b/include/linux/kvm.h index aace6b8691a..f47fcd30273 100644 --- a/include/linux/kvm.h +++ b/include/linux/kvm.h @@ -371,6 +371,7 @@ struct kvm_s390_psw {  #define KVM_S390_INT_VIRTIO		0xffff2603u  #define KVM_S390_INT_SERVICE		0xffff2401u  #define KVM_S390_INT_EMERGENCY		0xffff1201u +#define KVM_S390_INT_EXTERNAL_CALL	0xffff1202u  struct kvm_s390_interrupt {  	__u32 type; @@ -463,7 +464,7 @@ struct kvm_ppc_pvinfo {  #define KVM_CAP_VAPIC 6  #define KVM_CAP_EXT_CPUID 7  #define KVM_CAP_CLOCKSOURCE 8 -#define KVM_CAP_NR_VCPUS 9       /* returns max vcpus per vm */ +#define KVM_CAP_NR_VCPUS 9       /* returns recommended max vcpus per vm */  #define KVM_CAP_NR_MEMSLOTS 10   /* returns max memory slots per vm */  #define KVM_CAP_PIT 11  #define KVM_CAP_NOP_IO_DELAY 12 @@ -553,6 +554,9 @@ struct kvm_ppc_pvinfo {  #define KVM_CAP_SPAPR_TCE 63  #define KVM_CAP_PPC_SMT 64  #define KVM_CAP_PPC_RMA	65 +#define KVM_CAP_MAX_VCPUS 66       /* returns max vcpus per vm */ +#define KVM_CAP_PPC_HIOR 67 +#define KVM_CAP_PPC_PAPR 68  #define KVM_CAP_S390_GMAP 71  #ifdef KVM_CAP_IRQ_ROUTING diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index eabb21a30c3..d5262319997 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -18,6 +18,7 @@  #include <linux/msi.h>  #include <linux/slab.h>  #include <linux/rcupdate.h> +#include <linux/ratelimit.h>  #include <asm/signal.h>  #include <linux/kvm.h> @@ -48,6 +49,7 @@  #define KVM_REQ_EVENT             11  #define KVM_REQ_APF_HALT          12  #define KVM_REQ_STEAL_UPDATE      13 +#define KVM_REQ_NMI               14  #define KVM_USERSPACE_IRQ_SOURCE_ID	0 @@ -55,16 +57,16 @@ struct kvm;  struct kvm_vcpu;  extern struct kmem_cache *kvm_vcpu_cache; -/* - * It would be nice to use something smarter than a linear search, TBD... - * Thankfully we dont expect many devices to register (famous last words :), - * so until then it will suffice.  At least its abstracted so we can change - * in one place. - */ +struct kvm_io_range { +	gpa_t addr; +	int len; +	struct kvm_io_device *dev; +}; +  struct kvm_io_bus {  	int                   dev_count; -#define NR_IOBUS_DEVS 200 -	struct kvm_io_device *devs[NR_IOBUS_DEVS]; +#define NR_IOBUS_DEVS 300 +	struct kvm_io_range range[NR_IOBUS_DEVS];  };  enum kvm_bus { @@ -77,8 +79,8 @@ 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 *kvm, enum kvm_bus bus_idx, -			    struct kvm_io_device *dev); +int kvm_io_bus_register_dev(struct kvm *kvm, enum kvm_bus bus_idx, gpa_t addr, +			    int len, struct kvm_io_device *dev);  int kvm_io_bus_unregister_dev(struct kvm *kvm, enum kvm_bus bus_idx,  			      struct kvm_io_device *dev); @@ -256,8 +258,9 @@ struct kvm {  	struct kvm_arch arch;  	atomic_t users_count;  #ifdef KVM_COALESCED_MMIO_PAGE_OFFSET -	struct kvm_coalesced_mmio_dev *coalesced_mmio_dev;  	struct kvm_coalesced_mmio_ring *coalesced_mmio_ring; +	spinlock_t ring_lock; +	struct list_head coalesced_zones;  #endif  	struct mutex irq_lock; @@ -281,11 +284,8 @@ struct kvm {  /* The guest did something we don't support. */  #define pr_unimpl(vcpu, fmt, ...)					\ - do {									\ -	if (printk_ratelimit())						\ -		printk(KERN_ERR "kvm: %i: cpu%i " fmt,			\ -		       current->tgid, (vcpu)->vcpu_id , ## __VA_ARGS__); \ - } while (0) +	pr_err_ratelimited("kvm: %i: cpu%i " fmt,			\ +			   current->tgid, (vcpu)->vcpu_id , ## __VA_ARGS__)  #define kvm_printf(kvm, fmt ...) printk(KERN_DEBUG fmt)  #define vcpu_printf(vcpu, fmt...) kvm_printf(vcpu->kvm, fmt) diff --git a/include/linux/l2tp.h b/include/linux/l2tp.h index 4bdb31df8e7..e77d7f9bb24 100644 --- a/include/linux/l2tp.h +++ b/include/linux/l2tp.h @@ -8,8 +8,8 @@  #define _LINUX_L2TP_H_  #include <linux/types.h> -#ifdef __KERNEL__  #include <linux/socket.h> +#ifdef __KERNEL__  #include <linux/in.h>  #else  #include <netinet/in.h> @@ -26,14 +26,15 @@  #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 */ +	__kernel_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) - +	unsigned char	__pad[sizeof(struct sockaddr) - +			      sizeof(__kernel_sa_family_t) -  			      sizeof(__be16) - sizeof(struct in_addr) -  			      sizeof(__u32)];  }; diff --git a/include/linux/lapb.h b/include/linux/lapb.h index ce709e1885c..873c1eb635e 100644 --- a/include/linux/lapb.h +++ b/include/linux/lapb.h @@ -44,7 +44,8 @@ struct lapb_parms_struct {  	unsigned int mode;  }; -extern int lapb_register(struct net_device *dev, struct lapb_register_struct *callbacks); +extern int lapb_register(struct net_device *dev, +			 const struct lapb_register_struct *callbacks);  extern int lapb_unregister(struct net_device *dev);  extern int lapb_getparms(struct net_device *dev, struct lapb_parms_struct *parms);  extern int lapb_setparms(struct net_device *dev, struct lapb_parms_struct *parms); diff --git a/include/linux/libata.h b/include/linux/libata.h index efd6f980076..cafc09a64fe 100644 --- a/include/linux/libata.h +++ b/include/linux/libata.h @@ -1052,6 +1052,8 @@ extern int ata_scsi_slave_config(struct scsi_device *sdev);  extern void ata_scsi_slave_destroy(struct scsi_device *sdev);  extern int ata_scsi_change_queue_depth(struct scsi_device *sdev,  				       int queue_depth, int reason); +extern int __ata_change_queue_depth(struct ata_port *ap, struct scsi_device *sdev, +				    int queue_depth, int reason);  extern struct ata_device *ata_dev_pair(struct ata_device *adev);  extern int ata_do_set_mode(struct ata_link *link, struct ata_device **r_failed_dev);  extern void ata_scsi_port_error_handler(struct Scsi_Host *host, struct ata_port *ap); @@ -1254,13 +1256,13 @@ static inline int sata_srst_pmp(struct ata_link *link)  /*   * printk helpers   */ -__attribute__((format (printf, 3, 4))) +__printf(3, 4)  int ata_port_printk(const struct ata_port *ap, const char *level,  		    const char *fmt, ...); -__attribute__((format (printf, 3, 4))) +__printf(3, 4)  int ata_link_printk(const struct ata_link *link, const char *level,  		    const char *fmt, ...); -__attribute__((format (printf, 3, 4))) +__printf(3, 4)  int ata_dev_printk(const struct ata_device *dev, const char *level,  		   const char *fmt, ...); @@ -1302,10 +1304,10 @@ void ata_print_version(const struct device *dev, const char *version);  /*   * ata_eh_info helpers   */ -extern void __ata_ehi_push_desc(struct ata_eh_info *ehi, const char *fmt, ...) -	__attribute__ ((format (printf, 2, 3))); -extern void ata_ehi_push_desc(struct ata_eh_info *ehi, const char *fmt, ...) -	__attribute__ ((format (printf, 2, 3))); +extern __printf(2, 3) +void __ata_ehi_push_desc(struct ata_eh_info *ehi, const char *fmt, ...); +extern __printf(2, 3) +void ata_ehi_push_desc(struct ata_eh_info *ehi, const char *fmt, ...);  extern void ata_ehi_clear_desc(struct ata_eh_info *ehi);  static inline void ata_ehi_hotplugged(struct ata_eh_info *ehi) @@ -1319,8 +1321,8 @@ static inline void ata_ehi_hotplugged(struct ata_eh_info *ehi)  /*   * port description helpers   */ -extern void ata_port_desc(struct ata_port *ap, const char *fmt, ...) -	__attribute__ ((format (printf, 2, 3))); +extern __printf(2, 3) +void ata_port_desc(struct ata_port *ap, const char *fmt, ...);  #ifdef CONFIG_PCI  extern void ata_port_pbar_desc(struct ata_port *ap, int bar, ssize_t offset,  			       const char *name); diff --git a/include/linux/lis3lv02d.h b/include/linux/lis3lv02d.h index d4292c8431e..f1664c636af 100644 --- a/include/linux/lis3lv02d.h +++ b/include/linux/lis3lv02d.h @@ -113,7 +113,6 @@ struct lis3lv02d_platform_data {  	s8 axis_x;  	s8 axis_y;  	s8 axis_z; -#define LIS3_USE_REGULATOR_CTRL 0x01  #define LIS3_USE_BLOCK_READ	0x02  	u16 driver_features;  	int default_rate; diff --git a/include/linux/llc.h b/include/linux/llc.h index ad7074ba81a..a2418ae13ee 100644 --- a/include/linux/llc.h +++ b/include/linux/llc.h @@ -12,16 +12,20 @@   *   * See the GNU General Public License for more details.   */ + +#include <linux/socket.h> +  #define __LLC_SOCK_SIZE__ 16	/* sizeof(sockaddr_llc), word align. */  struct sockaddr_llc { -	sa_family_t     sllc_family;	/* AF_LLC */ -	sa_family_t	sllc_arphrd;	/* ARPHRD_ETHER */ +	__kernel_sa_family_t sllc_family; /* AF_LLC */ +	__kernel_sa_family_t sllc_arphrd; /* ARPHRD_ETHER */  	unsigned char   sllc_test;  	unsigned char   sllc_xid;  	unsigned char	sllc_ua;	/* UA data, only for SOCK_STREAM. */  	unsigned char   sllc_sap;  	unsigned char   sllc_mac[IFHWADDRLEN]; -	unsigned char   __pad[__LLC_SOCK_SIZE__ - sizeof(sa_family_t) * 2 - +	unsigned char   __pad[__LLC_SOCK_SIZE__ - +			      sizeof(__kernel_sa_family_t) * 2 -  			      sizeof(unsigned char) * 4 - IFHWADDRLEN];  }; diff --git a/include/linux/llist.h b/include/linux/llist.h index aa0c8b5b3cd..801b44b07aa 100644 --- a/include/linux/llist.h +++ b/include/linux/llist.h @@ -35,10 +35,30 @@   *   * The basic atomic operation of this list is cmpxchg on long.  On   * architectures that don't have NMI-safe cmpxchg implementation, the - * list can NOT be used in NMI handler.  So code uses the list in NMI - * handler should depend on CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG. + * list can NOT be used in NMI handlers.  So code that uses the list in + * an NMI handler should depend on CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG. + * + * Copyright 2010,2011 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   */ +#include <linux/kernel.h> +#include <asm/system.h> +#include <asm/processor.h> +  struct llist_head {  	struct llist_node *first;  }; @@ -113,14 +133,55 @@ static inline void init_llist_head(struct llist_head *list)   * test whether the list is empty without deleting something from the   * list.   */ -static inline int llist_empty(const struct llist_head *head) +static inline bool llist_empty(const struct llist_head *head)  {  	return ACCESS_ONCE(head->first) == NULL;  } -void llist_add(struct llist_node *new, struct llist_head *head); -void llist_add_batch(struct llist_node *new_first, struct llist_node *new_last, -		     struct llist_head *head); -struct llist_node *llist_del_first(struct llist_head *head); -struct llist_node *llist_del_all(struct llist_head *head); +static inline struct llist_node *llist_next(struct llist_node *node) +{ +	return node->next; +} + +/** + * llist_add - add a new entry + * @new:	new entry to be added + * @head:	the head for your lock-less list + * + * Returns true if the list was empty prior to adding this entry. + */ +static inline bool llist_add(struct llist_node *new, struct llist_head *head) +{ +	struct llist_node *entry, *old_entry; + +	entry = head->first; +	for (;;) { +		old_entry = entry; +		new->next = entry; +		entry = cmpxchg(&head->first, old_entry, new); +		if (entry == old_entry) +			break; +	} + +	return old_entry == NULL; +} + +/** + * llist_del_all - delete all entries from lock-less list + * @head:	the head of lock-less list to delete all entries + * + * If list is empty, return NULL, otherwise, delete all entries and + * return the pointer to the first entry.  The order of entries + * deleted is from the newest to the oldest added one. + */ +static inline struct llist_node *llist_del_all(struct llist_head *head) +{ +	return xchg(&head->first, NULL); +} + +extern bool llist_add_batch(struct llist_node *new_first, +			    struct llist_node *new_last, +			    struct llist_head *head); +extern struct llist_node *llist_del_first(struct llist_head *head); +  #endif /* LLIST_H */ diff --git a/include/linux/lockdep.h b/include/linux/lockdep.h index ef820a3c378..b6a56e37284 100644 --- a/include/linux/lockdep.h +++ b/include/linux/lockdep.h @@ -548,7 +548,7 @@ do {									\  #endif  #ifdef CONFIG_PROVE_RCU -extern void lockdep_rcu_dereference(const char *file, const int line); +void lockdep_rcu_suspicious(const char *file, const int line, const char *s);  #endif  #endif /* __LINUX_LOCKDEP_H */ diff --git a/include/linux/loop.h b/include/linux/loop.h index 683d6989011..11a41a8f08e 100644 --- a/include/linux/loop.h +++ b/include/linux/loop.h @@ -73,8 +73,8 @@ struct loop_device {   */  enum {  	LO_FLAGS_READ_ONLY	= 1, -	LO_FLAGS_USE_AOPS	= 2,  	LO_FLAGS_AUTOCLEAR	= 4, +	LO_FLAGS_PARTSCAN	= 8,  };  #include <asm/posix_types.h>	/* for __kernel_old_dev_t */ diff --git a/include/linux/magic.h b/include/linux/magic.h index 1e5df2af8d8..2d4beab0d5b 100644 --- a/include/linux/magic.h +++ b/include/linux/magic.h @@ -30,11 +30,11 @@  #define ANON_INODE_FS_MAGIC	0x09041934  #define PSTOREFS_MAGIC		0x6165676C -#define MINIX_SUPER_MAGIC	0x137F		/* original minix fs */ -#define MINIX_SUPER_MAGIC2	0x138F		/* minix fs, 30 char names */ -#define MINIX2_SUPER_MAGIC	0x2468		/* minix V2 fs */ -#define MINIX2_SUPER_MAGIC2	0x2478		/* minix V2 fs, 30 char names */ -#define MINIX3_SUPER_MAGIC	0x4d5a		/* minix V3 fs */ +#define MINIX_SUPER_MAGIC	0x137F		/* minix v1 fs, 14 char names */ +#define MINIX_SUPER_MAGIC2	0x138F		/* minix v1 fs, 30 char names */ +#define MINIX2_SUPER_MAGIC	0x2468		/* minix v2 fs, 14 char names */ +#define MINIX2_SUPER_MAGIC2	0x2478		/* minix v2 fs, 30 char names */ +#define MINIX3_SUPER_MAGIC	0x4d5a		/* minix v3 fs, 60 char names */  #define MSDOS_SUPER_MAGIC	0x4d44		/* MD */  #define NCP_SUPER_MAGIC		0x564c		/* Guess, what 0x564c is :-) */ diff --git a/include/linux/memblock.h b/include/linux/memblock.h index 7525e38c434..e6b843e16e8 100644 --- a/include/linux/memblock.h +++ b/include/linux/memblock.h @@ -80,6 +80,7 @@ extern phys_addr_t __memblock_alloc_base(phys_addr_t size,  					   phys_addr_t align,  					   phys_addr_t max_addr);  extern phys_addr_t memblock_phys_mem_size(void); +extern phys_addr_t memblock_start_of_DRAM(void);  extern phys_addr_t memblock_end_of_DRAM(void);  extern void memblock_enforce_memory_limit(phys_addr_t memory_limit);  extern int memblock_is_memory(phys_addr_t addr); diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h index 343bd7661f2..b87068a1a09 100644 --- a/include/linux/memcontrol.h +++ b/include/linux/memcontrol.h @@ -35,7 +35,8 @@ enum mem_cgroup_page_stat_item {  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, +					isolate_mode_t mode, +					struct zone *z,  					struct mem_cgroup *mem_cont,  					int active, int file); @@ -77,8 +78,8 @@ extern void mem_cgroup_uncharge_end(void);  extern void mem_cgroup_uncharge_page(struct page *page);  extern void mem_cgroup_uncharge_cache_page(struct page *page); -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); +extern void mem_cgroup_out_of_memory(struct mem_cgroup *memcg, gfp_t gfp_mask); +int task_in_mem_cgroup(struct task_struct *task, const struct mem_cgroup *memcg);  extern struct mem_cgroup *try_get_mem_cgroup_from_page(struct page *page);  extern struct mem_cgroup *mem_cgroup_from_task(struct task_struct *p); @@ -87,26 +88,28 @@ extern struct mem_cgroup *try_get_mem_cgroup_from_mm(struct mm_struct *mm);  static inline  int mm_match_cgroup(const struct mm_struct *mm, const struct mem_cgroup *cgroup)  { -	struct mem_cgroup *mem; +	struct mem_cgroup *memcg;  	rcu_read_lock(); -	mem = mem_cgroup_from_task(rcu_dereference((mm)->owner)); +	memcg = mem_cgroup_from_task(rcu_dereference((mm)->owner));  	rcu_read_unlock(); -	return cgroup == mem; +	return cgroup == memcg;  } -extern struct cgroup_subsys_state *mem_cgroup_css(struct mem_cgroup *mem); +extern struct cgroup_subsys_state *mem_cgroup_css(struct mem_cgroup *memcg);  extern int  mem_cgroup_prepare_migration(struct page *page,  	struct page *newpage, struct mem_cgroup **ptr, gfp_t gfp_mask); -extern void mem_cgroup_end_migration(struct mem_cgroup *mem, +extern void mem_cgroup_end_migration(struct mem_cgroup *memcg,  	struct page *oldpage, struct page *newpage, bool migration_ok);  /*   * For memory reclaim.   */ -int mem_cgroup_inactive_anon_is_low(struct mem_cgroup *memcg); -int mem_cgroup_inactive_file_is_low(struct mem_cgroup *memcg); +int mem_cgroup_inactive_anon_is_low(struct mem_cgroup *memcg, +				    struct zone *zone); +int mem_cgroup_inactive_file_is_low(struct mem_cgroup *memcg, +				    struct zone *zone);  int mem_cgroup_select_victim_node(struct mem_cgroup *memcg);  unsigned long mem_cgroup_zone_nr_lru_pages(struct mem_cgroup *memcg,  					int nid, int zid, unsigned int lrumask); @@ -147,7 +150,7 @@ static inline void mem_cgroup_dec_page_stat(struct page *page,  unsigned long mem_cgroup_soft_limit_reclaim(struct zone *zone, int order,  						gfp_t gfp_mask,  						unsigned long *total_scanned); -u64 mem_cgroup_get_limit(struct mem_cgroup *mem); +u64 mem_cgroup_get_limit(struct mem_cgroup *memcg);  void mem_cgroup_count_vm_event(struct mm_struct *mm, enum vm_event_item idx);  #ifdef CONFIG_TRANSPARENT_HUGEPAGE @@ -243,18 +246,20 @@ static inline struct mem_cgroup *try_get_mem_cgroup_from_mm(struct mm_struct *mm  	return NULL;  } -static inline int mm_match_cgroup(struct mm_struct *mm, struct mem_cgroup *mem) +static inline int mm_match_cgroup(struct mm_struct *mm, +		struct mem_cgroup *memcg)  {  	return 1;  }  static inline int task_in_mem_cgroup(struct task_struct *task, -				     const struct mem_cgroup *mem) +				     const struct mem_cgroup *memcg)  {  	return 1;  } -static inline struct cgroup_subsys_state *mem_cgroup_css(struct mem_cgroup *mem) +static inline struct cgroup_subsys_state +		*mem_cgroup_css(struct mem_cgroup *memcg)  {  	return NULL;  } @@ -266,22 +271,22 @@ mem_cgroup_prepare_migration(struct page *page, struct page *newpage,  	return 0;  } -static inline void mem_cgroup_end_migration(struct mem_cgroup *mem, +static inline void mem_cgroup_end_migration(struct mem_cgroup *memcg,  		struct page *oldpage, struct page *newpage, bool migration_ok)  {  } -static inline int mem_cgroup_get_reclaim_priority(struct mem_cgroup *mem) +static inline int mem_cgroup_get_reclaim_priority(struct mem_cgroup *memcg)  {  	return 0;  } -static inline void mem_cgroup_note_reclaim_priority(struct mem_cgroup *mem, +static inline void mem_cgroup_note_reclaim_priority(struct mem_cgroup *memcg,  						int priority)  {  } -static inline void mem_cgroup_record_reclaim_priority(struct mem_cgroup *mem, +static inline void mem_cgroup_record_reclaim_priority(struct mem_cgroup *memcg,  						int priority)  {  } @@ -292,13 +297,13 @@ static inline bool mem_cgroup_disabled(void)  }  static inline int -mem_cgroup_inactive_anon_is_low(struct mem_cgroup *memcg) +mem_cgroup_inactive_anon_is_low(struct mem_cgroup *memcg, struct zone *zone)  {  	return 1;  }  static inline int -mem_cgroup_inactive_file_is_low(struct mem_cgroup *memcg) +mem_cgroup_inactive_file_is_low(struct mem_cgroup *memcg, struct zone *zone)  {  	return 1;  } @@ -347,7 +352,7 @@ unsigned long mem_cgroup_soft_limit_reclaim(struct zone *zone, int order,  }  static inline -u64 mem_cgroup_get_limit(struct mem_cgroup *mem) +u64 mem_cgroup_get_limit(struct mem_cgroup *memcg)  {  	return 0;  } diff --git a/include/linux/mfd/ab5500/ab5500.h b/include/linux/mfd/ab5500/ab5500.h new file mode 100644 index 00000000000..a720051ae93 --- /dev/null +++ b/include/linux/mfd/ab5500/ab5500.h @@ -0,0 +1,140 @@ +/* + * Copyright (C) ST-Ericsson 2011 + * + * License Terms: GNU General Public License v2 + */ +#ifndef MFD_AB5500_H +#define MFD_AB5500_H + +#include <linux/device.h> + +enum ab5500_devid { +	AB5500_DEVID_ADC, +	AB5500_DEVID_LEDS, +	AB5500_DEVID_POWER, +	AB5500_DEVID_REGULATORS, +	AB5500_DEVID_SIM, +	AB5500_DEVID_RTC, +	AB5500_DEVID_CHARGER, +	AB5500_DEVID_FUELGAUGE, +	AB5500_DEVID_VIBRATOR, +	AB5500_DEVID_CODEC, +	AB5500_DEVID_USB, +	AB5500_DEVID_OTP, +	AB5500_DEVID_VIDEO, +	AB5500_DEVID_DBIECI, +	AB5500_DEVID_ONSWA, +	AB5500_NUM_DEVICES, +}; + +enum ab5500_banks { +	AB5500_BANK_VIT_IO_I2C_CLK_TST_OTP = 0, +	AB5500_BANK_VDDDIG_IO_I2C_CLK_TST = 1, +	AB5500_BANK_VDENC = 2, +	AB5500_BANK_SIM_USBSIM  = 3, +	AB5500_BANK_LED = 4, +	AB5500_BANK_ADC  = 5, +	AB5500_BANK_RTC  = 6, +	AB5500_BANK_STARTUP  = 7, +	AB5500_BANK_DBI_ECI  = 8, +	AB5500_BANK_CHG  = 9, +	AB5500_BANK_FG_BATTCOM_ACC = 10, +	AB5500_BANK_USB = 11, +	AB5500_BANK_IT = 12, +	AB5500_BANK_VIBRA = 13, +	AB5500_BANK_AUDIO_HEADSETUSB = 14, +	AB5500_NUM_BANKS = 15, +}; + +enum ab5500_banks_addr { +	AB5500_ADDR_VIT_IO_I2C_CLK_TST_OTP = 0x4A, +	AB5500_ADDR_VDDDIG_IO_I2C_CLK_TST = 0x4B, +	AB5500_ADDR_VDENC = 0x06, +	AB5500_ADDR_SIM_USBSIM  = 0x04, +	AB5500_ADDR_LED = 0x10, +	AB5500_ADDR_ADC  = 0x0A, +	AB5500_ADDR_RTC  = 0x0F, +	AB5500_ADDR_STARTUP  = 0x03, +	AB5500_ADDR_DBI_ECI  = 0x07, +	AB5500_ADDR_CHG  = 0x0B, +	AB5500_ADDR_FG_BATTCOM_ACC = 0x0C, +	AB5500_ADDR_USB = 0x05, +	AB5500_ADDR_IT = 0x0E, +	AB5500_ADDR_VIBRA = 0x02, +	AB5500_ADDR_AUDIO_HEADSETUSB = 0x0D, +}; + +/* + * Interrupt register offsets + * Bank : 0x0E + */ +#define AB5500_IT_SOURCE0_REG		0x20 +#define AB5500_IT_SOURCE1_REG		0x21 +#define AB5500_IT_SOURCE2_REG		0x22 +#define AB5500_IT_SOURCE3_REG		0x23 +#define AB5500_IT_SOURCE4_REG		0x24 +#define AB5500_IT_SOURCE5_REG		0x25 +#define AB5500_IT_SOURCE6_REG		0x26 +#define AB5500_IT_SOURCE7_REG		0x27 +#define AB5500_IT_SOURCE8_REG		0x28 +#define AB5500_IT_SOURCE9_REG		0x29 +#define AB5500_IT_SOURCE10_REG		0x2A +#define AB5500_IT_SOURCE11_REG		0x2B +#define AB5500_IT_SOURCE12_REG		0x2C +#define AB5500_IT_SOURCE13_REG		0x2D +#define AB5500_IT_SOURCE14_REG		0x2E +#define AB5500_IT_SOURCE15_REG		0x2F +#define AB5500_IT_SOURCE16_REG		0x30 +#define AB5500_IT_SOURCE17_REG		0x31 +#define AB5500_IT_SOURCE18_REG		0x32 +#define AB5500_IT_SOURCE19_REG		0x33 +#define AB5500_IT_SOURCE20_REG		0x34 +#define AB5500_IT_SOURCE21_REG		0x35 +#define AB5500_IT_SOURCE22_REG		0x36 +#define AB5500_IT_SOURCE23_REG		0x37 + +#define AB5500_NUM_IRQ_REGS		23 + +/** + * struct ab5500 + * @access_mutex: lock out concurrent accesses to the AB registers + * @dev: a pointer to the device struct for this chip driver + * @ab5500_irq: the analog baseband irq + * @irq_base: the platform configuration irq base for subdevices + * @chip_name: name of this chip variant + * @chip_id: 8 bit chip ID for this chip variant + * @irq_lock: a lock to protect the mask + * @abb_events: a local bit mask of the prcmu wakeup events + * @event_mask: a local copy of the mask event registers + * @last_event_mask: a copy of the last event_mask written to hardware + * @startup_events: a copy of the first reading of the event registers + * @startup_events_read: whether the first events have been read + */ +struct ab5500 { +	struct mutex access_mutex; +	struct device *dev; +	unsigned int ab5500_irq; +	unsigned int irq_base; +	char chip_name[32]; +	u8 chip_id; +	struct mutex irq_lock; +	u32 abb_events; +	u8 mask[AB5500_NUM_IRQ_REGS]; +	u8 oldmask[AB5500_NUM_IRQ_REGS]; +	u8 startup_events[AB5500_NUM_IRQ_REGS]; +	bool startup_events_read; +#ifdef CONFIG_DEBUG_FS +	unsigned int debug_bank; +	unsigned int debug_address; +#endif +}; + +struct ab5500_platform_data { +	struct {unsigned int base; unsigned int count; } irq; +	void *dev_data[AB5500_NUM_DEVICES]; +	struct abx500_init_settings *init_settings; +	unsigned int init_settings_sz; +	bool pm_power_off; +}; + +#endif /* MFD_AB5500_H */ diff --git a/include/linux/mfd/ab8500/gpadc.h b/include/linux/mfd/ab8500/gpadc.h index 46b954011f1..252966769d9 100644 --- a/include/linux/mfd/ab8500/gpadc.h +++ b/include/linux/mfd/ab8500/gpadc.h @@ -27,6 +27,9 @@  struct ab8500_gpadc;  struct ab8500_gpadc *ab8500_gpadc_get(char *name); -int ab8500_gpadc_convert(struct ab8500_gpadc *gpadc, u8 input); +int ab8500_gpadc_convert(struct ab8500_gpadc *gpadc, u8 channel); +int ab8500_gpadc_read_raw(struct ab8500_gpadc *gpadc, u8 channel); +int ab8500_gpadc_ad_to_voltage(struct ab8500_gpadc *gpadc, +    u8 channel, int ad_value);  #endif /* _AB8500_GPADC_H */ diff --git a/include/linux/mfd/abx500.h b/include/linux/mfd/abx500.h index 896b5e47f16..9970337ff04 100644 --- a/include/linux/mfd/abx500.h +++ b/include/linux/mfd/abx500.h @@ -6,7 +6,7 @@   *   * ABX500 core access functions.   * The abx500 interface is used for the Analog Baseband chip - * ab3100, ab3550, ab5500, and ab8500. + * ab3100, ab5500, and ab8500.   *   * Author: Mattias Wallin <mattias.wallin@stericsson.com>   * Author: Mattias Nilsson <mattias.i.nilsson@stericsson.com> @@ -29,17 +29,16 @@  #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 +#define AB5500_1_1	0x21 +#define AB5500_2_0	0x24  /* AB8500 CIDs*/ -#define AB8500_CUTEARLY	0x00  #define AB8500_CUT1P0	0x10  #define AB8500_CUT1P1	0x11  #define AB8500_CUT2P0	0x20  #define AB8500_CUT3P0	0x30 +#define AB8500_CUT3P3	0x33  /*   * AB3100, EVENTA1, A2 and A3 event register flags @@ -143,39 +142,6 @@ int ab3100_event_register(struct ab3100 *ab3100,  int ab3100_event_unregister(struct ab3100 *ab3100,  			    struct notifier_block *nb); -/* 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. @@ -186,18 +152,6 @@ struct abx500_init_settings {  	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, diff --git a/include/linux/mfd/db5500-prcmu.h b/include/linux/mfd/db5500-prcmu.h index f0977986402..9890687f582 100644 --- a/include/linux/mfd/db5500-prcmu.h +++ b/include/linux/mfd/db5500-prcmu.h @@ -5,21 +5,35 @@   *   * U5500 PRCMU API.   */ -#ifndef __MACH_PRCMU_U5500_H -#define __MACH_PRCMU_U5500_H +#ifndef __MFD_DB5500_PRCMU_H +#define __MFD_DB5500_PRCMU_H -#ifdef CONFIG_UX500_SOC_DB5500 +#ifdef CONFIG_MFD_DB5500_PRCMU  void db5500_prcmu_early_init(void); - +int db5500_prcmu_set_epod(u16 epod_id, u8 epod_state); +int db5500_prcmu_set_display_clocks(void); +int db5500_prcmu_disable_dsipll(void); +int db5500_prcmu_enable_dsipll(void);  int db5500_prcmu_abb_read(u8 slave, u8 reg, u8 *value, u8 size);  int db5500_prcmu_abb_write(u8 slave, u8 reg, u8 *value, u8 size); +void db5500_prcmu_enable_wakeups(u32 wakeups); +int db5500_prcmu_request_clock(u8 clock, bool enable); +void db5500_prcmu_config_abb_event_readout(u32 abb_events); +void db5500_prcmu_get_abb_event_buffer(void __iomem **buf); +int prcmu_resetout(u8 resoutn, u8 state); +int db5500_prcmu_set_power_state(u8 state, bool keep_ulp_clk, +	bool keep_ap_pll); +int db5500_prcmu_config_esram0_deep_sleep(u8 state); +void db5500_prcmu_system_reset(u16 reset_code); +u16 db5500_prcmu_get_reset_code(void); +bool db5500_prcmu_is_ac_wake_requested(void); +int db5500_prcmu_set_arm_opp(u8 opp); +int db5500_prcmu_get_arm_opp(void);  #else /* !CONFIG_UX500_SOC_DB5500 */ -static inline void db5500_prcmu_early_init(void) -{ -} +static inline void db5500_prcmu_early_init(void) {}  static inline int db5500_prcmu_abb_read(u8 slave, u8 reg, u8 *value, u8 size)  { @@ -31,15 +45,75 @@ static inline int db5500_prcmu_abb_write(u8 slave, u8 reg, u8 *value, u8 size)  	return -ENOSYS;  } -#endif /* CONFIG_UX500_SOC_DB5500 */ +static inline int db5500_prcmu_request_clock(u8 clock, bool enable) +{ +	return 0; +} + +static inline int db5500_prcmu_set_display_clocks(void) +{ +	return 0; +} + +static inline int db5500_prcmu_disable_dsipll(void) +{ +	return 0; +} + +static inline int db5500_prcmu_enable_dsipll(void) +{ +	return 0; +} -static inline int db5500_prcmu_config_abb_event_readout(u32 abb_events) +static inline int db5500_prcmu_config_esram0_deep_sleep(u8 state)  { -#ifdef CONFIG_MACH_U5500_SIMULATOR  	return 0; -#else -	return -1; -#endif  } -#endif /* __MACH_PRCMU_U5500_H */ +static inline void db5500_prcmu_enable_wakeups(u32 wakeups) {} + +static inline int prcmu_resetout(u8 resoutn, u8 state) +{ +	return 0; +} + +static inline int db5500_prcmu_set_epod(u16 epod_id, u8 epod_state) +{ +	return 0; +} + +static inline void db5500_prcmu_get_abb_event_buffer(void __iomem **buf) {} +static inline void db5500_prcmu_config_abb_event_readout(u32 abb_events) {} + +static inline int db5500_prcmu_set_power_state(u8 state, bool keep_ulp_clk, +	bool keep_ap_pll) +{ +	return 0; +} + +static inline void db5500_prcmu_system_reset(u16 reset_code) {} + +static inline u16 db5500_prcmu_get_reset_code(void) +{ +	return 0; +} + +static inline bool db5500_prcmu_is_ac_wake_requested(void) +{ +	return 0; +} + +static inline int db5500_prcmu_set_arm_opp(u8 opp) +{ +	return 0; +} + +static inline int db5500_prcmu_get_arm_opp(void) +{ +	return 0; +} + + +#endif /* CONFIG_MFD_DB5500_PRCMU */ + +#endif /* __MFD_DB5500_PRCMU_H */ diff --git a/include/linux/mfd/db8500-prcmu.h b/include/linux/mfd/db8500-prcmu.h index 917dbcab701..60d27f7bfc1 100644 --- a/include/linux/mfd/db8500-prcmu.h +++ b/include/linux/mfd/db8500-prcmu.h @@ -11,7 +11,6 @@  #define __MFD_DB8500_PRCMU_H  #include <linux/interrupt.h> -#include <linux/notifier.h>  /* This portion previously known as <mach/prcmu-fw-defs_v1.h> */ @@ -133,7 +132,7 @@ enum ap_pwrst {   * @APEXECUTE_TO_APIDLE: Power state transition from ApExecute to ApIdle   */  enum ap_pwrst_trans { -	NO_TRANSITION			= 0x00, +	PRCMU_AP_NO_CHANGE		= 0x00,  	APEXECUTE_TO_APSLEEP		= 0x01,  	APIDLE_TO_APSLEEP		= 0x02, /* To be removed */  	PRCMU_AP_SLEEP			= 0x01, @@ -146,54 +145,6 @@ enum ap_pwrst_trans {  };  /** - * enum ddr_pwrst - DDR power states definition - * @DDR_PWR_STATE_UNCHANGED: SDRAM and DDR controller state is unchanged - * @DDR_PWR_STATE_ON: - * @DDR_PWR_STATE_OFFLOWLAT: - * @DDR_PWR_STATE_OFFHIGHLAT: - */ -enum ddr_pwrst { -	DDR_PWR_STATE_UNCHANGED     = 0x00, -	DDR_PWR_STATE_ON            = 0x01, -	DDR_PWR_STATE_OFFLOWLAT     = 0x02, -	DDR_PWR_STATE_OFFHIGHLAT    = 0x03 -}; - -/** - * enum arm_opp - ARM OPP states definition - * @ARM_OPP_INIT: - * @ARM_NO_CHANGE: The ARM operating point is unchanged - * @ARM_100_OPP: The new ARM operating point is arm100opp - * @ARM_50_OPP: The new ARM operating point is arm50opp - * @ARM_MAX_OPP: Operating point is "max" (more than 100) - * @ARM_MAX_FREQ100OPP: Set max opp if available, else 100 - * @ARM_EXTCLK: The new ARM operating point is armExtClk - */ -enum arm_opp { -	ARM_OPP_INIT = 0x00, -	ARM_NO_CHANGE = 0x01, -	ARM_100_OPP = 0x02, -	ARM_50_OPP = 0x03, -	ARM_MAX_OPP = 0x04, -	ARM_MAX_FREQ100OPP = 0x05, -	ARM_EXTCLK = 0x07 -}; - -/** - * enum ape_opp - APE OPP states definition - * @APE_OPP_INIT: - * @APE_NO_CHANGE: The APE operating point is unchanged - * @APE_100_OPP: The new APE operating point is ape100opp - * @APE_50_OPP: 50% - */ -enum ape_opp { -	APE_OPP_INIT = 0x00, -	APE_NO_CHANGE = 0x01, -	APE_100_OPP = 0x02, -	APE_50_OPP = 0x03 -}; - -/**   * enum hw_acc_state - State definition for hardware accelerator   * @HW_NO_CHANGE: The hardware accelerator state must remain unchanged   * @HW_OFF: The hardware accelerator must be switched off @@ -469,26 +420,6 @@ enum auto_enable {  /* End of file previously known as prcmu-fw-defs_v1.h */ -/* PRCMU Wakeup defines */ -enum prcmu_wakeup_index { -	PRCMU_WAKEUP_INDEX_RTC, -	PRCMU_WAKEUP_INDEX_RTT0, -	PRCMU_WAKEUP_INDEX_RTT1, -	PRCMU_WAKEUP_INDEX_HSI0, -	PRCMU_WAKEUP_INDEX_HSI1, -	PRCMU_WAKEUP_INDEX_USB, -	PRCMU_WAKEUP_INDEX_ABB, -	PRCMU_WAKEUP_INDEX_ABB_FIFO, -	PRCMU_WAKEUP_INDEX_ARM, -	NUM_PRCMU_WAKEUP_INDICES -}; -#define PRCMU_WAKEUP(_name) (BIT(PRCMU_WAKEUP_INDEX_##_name)) - -/* PRCMU QoS APE OPP class */ -#define PRCMU_QOS_APE_OPP 1 -#define PRCMU_QOS_DDR_OPP 2 -#define PRCMU_QOS_DEFAULT_VALUE -1 -  /**   * enum hw_acc_dev - enum for hw accelerators   * @HW_ACC_SVAMMDSP: for SVAMMDSP @@ -527,64 +458,6 @@ enum hw_acc_dev {  };  /* - * Ids for all EPODs (power domains) - * - EPOD_ID_SVAMMDSP: power domain for SVA MMDSP - * - EPOD_ID_SVAPIPE: power domain for SVA pipe - * - EPOD_ID_SIAMMDSP: power domain for SIA MMDSP - * - EPOD_ID_SIAPIPE: power domain for SIA pipe - * - EPOD_ID_SGA: power domain for SGA - * - EPOD_ID_B2R2_MCDE: power domain for B2R2 and MCDE - * - EPOD_ID_ESRAM12: power domain for ESRAM 1 and 2 - * - EPOD_ID_ESRAM34: power domain for ESRAM 3 and 4 - * - NUM_EPOD_ID: number of power domains - */ -#define EPOD_ID_SVAMMDSP	0 -#define EPOD_ID_SVAPIPE		1 -#define EPOD_ID_SIAMMDSP	2 -#define EPOD_ID_SIAPIPE		3 -#define EPOD_ID_SGA		4 -#define EPOD_ID_B2R2_MCDE	5 -#define EPOD_ID_ESRAM12		6 -#define EPOD_ID_ESRAM34		7 -#define NUM_EPOD_ID		8 - -/* - * state definition for EPOD (power domain) - * - EPOD_STATE_NO_CHANGE: The EPOD should remain unchanged - * - EPOD_STATE_OFF: The EPOD is switched off - * - EPOD_STATE_RAMRET: The EPOD is switched off with its internal RAM in - *                         retention - * - EPOD_STATE_ON_CLK_OFF: The EPOD is switched on, clock is still off - * - EPOD_STATE_ON: Same as above, but with clock enabled - */ -#define EPOD_STATE_NO_CHANGE	0x00 -#define EPOD_STATE_OFF		0x01 -#define EPOD_STATE_RAMRET	0x02 -#define EPOD_STATE_ON_CLK_OFF	0x03 -#define EPOD_STATE_ON		0x04 - -/* - * CLKOUT sources - */ -#define PRCMU_CLKSRC_CLK38M		0x00 -#define PRCMU_CLKSRC_ACLK		0x01 -#define PRCMU_CLKSRC_SYSCLK		0x02 -#define PRCMU_CLKSRC_LCDCLK		0x03 -#define PRCMU_CLKSRC_SDMMCCLK		0x04 -#define PRCMU_CLKSRC_TVCLK		0x05 -#define PRCMU_CLKSRC_TIMCLK		0x06 -#define PRCMU_CLKSRC_CLK009		0x07 -/* These are only valid for CLKOUT1: */ -#define PRCMU_CLKSRC_SIAMMDSPCLK	0x40 -#define PRCMU_CLKSRC_I2CCLK		0x41 -#define PRCMU_CLKSRC_MSP02CLK		0x42 -#define PRCMU_CLKSRC_ARMPLL_OBSCLK	0x43 -#define PRCMU_CLKSRC_HSIRXCLK		0x44 -#define PRCMU_CLKSRC_HSITXCLK		0x45 -#define PRCMU_CLKSRC_ARMCLKFIX		0x46 -#define PRCMU_CLKSRC_HDMICLK		0x47 - -/*   * Definitions for autonomous power management configuration.   */ @@ -620,88 +493,12 @@ struct prcmu_auto_pm_config {  	u8 sva_policy;  }; -/** - * enum ddr_opp - DDR OPP states definition - * @DDR_100_OPP: The new DDR operating point is ddr100opp - * @DDR_50_OPP: The new DDR operating point is ddr50opp - * @DDR_25_OPP: The new DDR operating point is ddr25opp - */ -enum ddr_opp { -	DDR_100_OPP = 0x00, -	DDR_50_OPP = 0x01, -	DDR_25_OPP = 0x02, -}; - -/* - * Clock identifiers. - */ -enum prcmu_clock { -	PRCMU_SGACLK, -	PRCMU_UARTCLK, -	PRCMU_MSP02CLK, -	PRCMU_MSP1CLK, -	PRCMU_I2CCLK, -	PRCMU_SDMMCCLK, -	PRCMU_SLIMCLK, -	PRCMU_PER1CLK, -	PRCMU_PER2CLK, -	PRCMU_PER3CLK, -	PRCMU_PER5CLK, -	PRCMU_PER6CLK, -	PRCMU_PER7CLK, -	PRCMU_LCDCLK, -	PRCMU_BMLCLK, -	PRCMU_HSITXCLK, -	PRCMU_HSIRXCLK, -	PRCMU_HDMICLK, -	PRCMU_APEATCLK, -	PRCMU_APETRACECLK, -	PRCMU_MCDECLK, -	PRCMU_IPI2CCLK, -	PRCMU_DSIALTCLK, -	PRCMU_DMACLK, -	PRCMU_B2R2CLK, -	PRCMU_TVCLK, -	PRCMU_SSPCLK, -	PRCMU_RNGCLK, -	PRCMU_UICCCLK, -	PRCMU_NUM_REG_CLOCKS, -	PRCMU_SYSCLK = PRCMU_NUM_REG_CLOCKS, -	PRCMU_TIMCLK, -}; - -/* - * Definitions for controlling ESRAM0 in deep sleep. - */ -#define ESRAM0_DEEP_SLEEP_STATE_OFF 1 -#define ESRAM0_DEEP_SLEEP_STATE_RET 2 - -#ifdef CONFIG_MFD_DB8500_PRCMU -void __init prcmu_early_init(void); -int prcmu_set_display_clocks(void); -int prcmu_disable_dsipll(void); -int prcmu_enable_dsipll(void); -#else -static inline void __init prcmu_early_init(void) {} -#endif -  #ifdef CONFIG_MFD_DB8500_PRCMU +void db8500_prcmu_early_init(void);  int prcmu_set_rc_a2p(enum romcode_write);  enum romcode_read prcmu_get_rc_p2a(void);  enum ap_pwrst prcmu_get_xp70_current_state(void); -int prcmu_set_power_state(u8 state, bool keep_ulp_clk, bool keep_ap_pll); - -void prcmu_enable_wakeups(u32 wakeups); -static inline void prcmu_disable_wakeups(void) -{ -	prcmu_enable_wakeups(0); -} - -void prcmu_config_abb_event_readout(u32 abb_events); -void prcmu_get_abb_event_buffer(void __iomem **buf); -int prcmu_set_arm_opp(u8 opp); -int prcmu_get_arm_opp(void);  bool prcmu_has_arm_maxopp(void);  bool prcmu_is_u8400(void);  int prcmu_set_ape_opp(u8 opp); @@ -710,19 +507,14 @@ int prcmu_request_ape_opp_100_voltage(bool enable);  int prcmu_release_usb_wakeup_state(void);  int prcmu_set_ddr_opp(u8 opp);  int prcmu_get_ddr_opp(void); -unsigned long prcmu_qos_get_cpufreq_opp_delay(void); -void prcmu_qos_set_cpufreq_opp_delay(unsigned long);  /* NOTE! Use regulator framework instead */  int prcmu_set_hwacc(u16 hw_acc_dev, u8 state); -int prcmu_set_epod(u16 epod_id, u8 epod_state);  void prcmu_configure_auto_pm(struct prcmu_auto_pm_config *sleep,  	struct prcmu_auto_pm_config *idle);  bool prcmu_is_auto_pm_enabled(void);  int prcmu_config_clkout(u8 clkout, u8 source, u8 div); -int prcmu_request_clock(u8 clock, bool enable);  int prcmu_set_clock_divider(u8 clock, u8 divider); -int prcmu_config_esram0_deep_sleep(u8 state);  int prcmu_config_hotdog(u8 threshold);  int prcmu_config_hotmon(u8 low, u8 high);  int prcmu_start_temp_sense(u16 cycles32k); @@ -732,14 +524,36 @@ int prcmu_abb_write(u8 slave, u8 reg, u8 *value, u8 size);  void prcmu_ac_wake_req(void);  void prcmu_ac_sleep_req(void); -void prcmu_system_reset(u16 reset_code);  void prcmu_modem_reset(void); -bool prcmu_is_ac_wake_requested(void);  void prcmu_enable_spi2(void);  void prcmu_disable_spi2(void); +int prcmu_config_a9wdog(u8 num, bool sleep_auto_off); +int prcmu_enable_a9wdog(u8 id); +int prcmu_disable_a9wdog(u8 id); +int prcmu_kick_a9wdog(u8 id); +int prcmu_load_a9wdog(u8 id, u32 val); + +void db8500_prcmu_system_reset(u16 reset_code); +int db8500_prcmu_set_power_state(u8 state, bool keep_ulp_clk, bool keep_ap_pll); +void db8500_prcmu_enable_wakeups(u32 wakeups); +int db8500_prcmu_set_epod(u16 epod_id, u8 epod_state); +int db8500_prcmu_request_clock(u8 clock, bool enable); +int db8500_prcmu_set_display_clocks(void); +int db8500_prcmu_disable_dsipll(void); +int db8500_prcmu_enable_dsipll(void); +void db8500_prcmu_config_abb_event_readout(u32 abb_events); +void db8500_prcmu_get_abb_event_buffer(void __iomem **buf); +int db8500_prcmu_config_esram0_deep_sleep(u8 state); +u16 db8500_prcmu_get_reset_code(void); +bool db8500_prcmu_is_ac_wake_requested(void); +int db8500_prcmu_set_arm_opp(u8 opp); +int db8500_prcmu_get_arm_opp(void); +  #else /* !CONFIG_MFD_DB8500_PRCMU */ +static inline void db8500_prcmu_early_init(void) {} +  static inline int prcmu_set_rc_a2p(enum romcode_write code)  {  	return 0; @@ -755,34 +569,12 @@ static inline enum ap_pwrst prcmu_get_xp70_current_state(void)  	return AP_EXECUTE;  } -static inline int prcmu_set_power_state(u8 state, bool keep_ulp_clk, -	bool keep_ap_pll) -{ -	return 0; -} - -static inline void prcmu_enable_wakeups(u32 wakeups) {} - -static inline void prcmu_disable_wakeups(void) {} - -static inline void prcmu_config_abb_event_readout(u32 abb_events) {} - -static inline int prcmu_set_arm_opp(u8 opp) -{ -	return 0; -} - -static inline int prcmu_get_arm_opp(void) -{ -	return ARM_100_OPP; -} - -static bool prcmu_has_arm_maxopp(void) +static inline bool prcmu_has_arm_maxopp(void)  {  	return false;  } -static bool prcmu_is_u8400(void) +static inline bool prcmu_is_u8400(void)  {  	return false;  } @@ -817,13 +609,6 @@ static inline int prcmu_get_ddr_opp(void)  	return DDR_100_OPP;  } -static inline unsigned long prcmu_qos_get_cpufreq_opp_delay(void) -{ -	return 0; -} - -static inline void prcmu_qos_set_cpufreq_opp_delay(unsigned long n) {} -  static inline int prcmu_set_hwacc(u16 hw_acc_dev, u8 state)  {  	return 0; @@ -844,21 +629,11 @@ static inline int prcmu_config_clkout(u8 clkout, u8 source, u8 div)  	return 0;  } -static inline int prcmu_request_clock(u8 clock, bool enable) -{ -	return 0; -} -  static inline int prcmu_set_clock_divider(u8 clock, u8 divider)  {  	return 0;  } -int prcmu_config_esram0_deep_sleep(u8 state) -{ -	return 0; -} -  static inline int prcmu_config_hotdog(u8 threshold)  {  	return 0; @@ -893,86 +668,107 @@ static inline void prcmu_ac_wake_req(void) {}  static inline void prcmu_ac_sleep_req(void) {} -static inline void prcmu_system_reset(u16 reset_code) {} -  static inline void prcmu_modem_reset(void) {} -static inline bool prcmu_is_ac_wake_requested(void) +static inline int prcmu_enable_spi2(void)  { -	return false; +	return 0;  } -#ifndef CONFIG_UX500_SOC_DB5500 -static inline int prcmu_set_display_clocks(void) +static inline int prcmu_disable_spi2(void)  {  	return 0;  } -static inline int prcmu_disable_dsipll(void) +static inline void db8500_prcmu_system_reset(u16 reset_code) {} + +static inline int db8500_prcmu_set_power_state(u8 state, bool keep_ulp_clk, +	bool keep_ap_pll)  {  	return 0;  } -static inline int prcmu_enable_dsipll(void) +static inline void db8500_prcmu_enable_wakeups(u32 wakeups) {} + +static inline int db8500_prcmu_set_epod(u16 epod_id, u8 epod_state)  {  	return 0;  } -#endif -static inline int prcmu_enable_spi2(void) +static inline int db8500_prcmu_request_clock(u8 clock, bool enable)  {  	return 0;  } -static inline int prcmu_disable_spi2(void) +static inline int db8500_prcmu_set_display_clocks(void)  {  	return 0;  } -#endif /* !CONFIG_MFD_DB8500_PRCMU */ +static inline int db8500_prcmu_disable_dsipll(void) +{ +	return 0; +} + +static inline int db8500_prcmu_enable_dsipll(void) +{ +	return 0; +} + +static inline int db8500_prcmu_config_esram0_deep_sleep(u8 state) +{ +	return 0; +} + +static inline void db8500_prcmu_config_abb_event_readout(u32 abb_events) {} -#ifdef CONFIG_UX500_PRCMU_QOS_POWER -int prcmu_qos_requirement(int pm_qos_class); -int prcmu_qos_add_requirement(int pm_qos_class, char *name, s32 value); -int prcmu_qos_update_requirement(int pm_qos_class, char *name, s32 new_value); -void prcmu_qos_remove_requirement(int pm_qos_class, char *name); -int prcmu_qos_add_notifier(int prcmu_qos_class, -			   struct notifier_block *notifier); -int prcmu_qos_remove_notifier(int prcmu_qos_class, -			      struct notifier_block *notifier); -#else -static inline int prcmu_qos_requirement(int prcmu_qos_class) +static inline void db8500_prcmu_get_abb_event_buffer(void __iomem **buf) {} + +static inline u16 db8500_prcmu_get_reset_code(void)  {  	return 0;  } -static inline int prcmu_qos_add_requirement(int prcmu_qos_class, -					    char *name, s32 value) +static inline int prcmu_config_a9wdog(u8 num, bool sleep_auto_off)  {  	return 0;  } -static inline int prcmu_qos_update_requirement(int prcmu_qos_class, -					       char *name, s32 new_value) +static inline int prcmu_enable_a9wdog(u8 id)  {  	return 0;  } -static inline void prcmu_qos_remove_requirement(int prcmu_qos_class, char *name) +static inline int prcmu_disable_a9wdog(u8 id)  { +	return 0;  } -static inline int prcmu_qos_add_notifier(int prcmu_qos_class, -					 struct notifier_block *notifier) +static inline int prcmu_kick_a9wdog(u8 id)  {  	return 0;  } -static inline int prcmu_qos_remove_notifier(int prcmu_qos_class, -					    struct notifier_block *notifier) + +static inline int prcmu_load_a9wdog(u8 id, u32 val)  {  	return 0;  } -#endif +static inline bool db8500_prcmu_is_ac_wake_requested(void) +{ +	return 0; +} + +static inline int db8500_prcmu_set_arm_opp(u8 opp) +{ +	return 0; +} + +static inline int db8500_prcmu_get_arm_opp(void) +{ +	return 0; +} + +#endif /* !CONFIG_MFD_DB8500_PRCMU */  #endif /* __MFD_DB8500_PRCMU_H */ diff --git a/include/linux/mfd/dbx500-prcmu.h b/include/linux/mfd/dbx500-prcmu.h new file mode 100644 index 00000000000..bac942f959c --- /dev/null +++ b/include/linux/mfd/dbx500-prcmu.h @@ -0,0 +1,549 @@ +/* + * Copyright (C) ST Ericsson SA 2011 + * + * License Terms: GNU General Public License v2 + * + * STE Ux500 PRCMU API + */ +#ifndef __MACH_PRCMU_H +#define __MACH_PRCMU_H + +#include <linux/interrupt.h> +#include <linux/notifier.h> +#include <asm/mach-types.h> + +/* PRCMU Wakeup defines */ +enum prcmu_wakeup_index { +	PRCMU_WAKEUP_INDEX_RTC, +	PRCMU_WAKEUP_INDEX_RTT0, +	PRCMU_WAKEUP_INDEX_RTT1, +	PRCMU_WAKEUP_INDEX_HSI0, +	PRCMU_WAKEUP_INDEX_HSI1, +	PRCMU_WAKEUP_INDEX_USB, +	PRCMU_WAKEUP_INDEX_ABB, +	PRCMU_WAKEUP_INDEX_ABB_FIFO, +	PRCMU_WAKEUP_INDEX_ARM, +	PRCMU_WAKEUP_INDEX_CD_IRQ, +	NUM_PRCMU_WAKEUP_INDICES +}; +#define PRCMU_WAKEUP(_name) (BIT(PRCMU_WAKEUP_INDEX_##_name)) + +/* EPOD (power domain) IDs */ + +/* + * DB8500 EPODs + * - EPOD_ID_SVAMMDSP: power domain for SVA MMDSP + * - EPOD_ID_SVAPIPE: power domain for SVA pipe + * - EPOD_ID_SIAMMDSP: power domain for SIA MMDSP + * - EPOD_ID_SIAPIPE: power domain for SIA pipe + * - EPOD_ID_SGA: power domain for SGA + * - EPOD_ID_B2R2_MCDE: power domain for B2R2 and MCDE + * - EPOD_ID_ESRAM12: power domain for ESRAM 1 and 2 + * - EPOD_ID_ESRAM34: power domain for ESRAM 3 and 4 + * - NUM_EPOD_ID: number of power domains + * + * TODO: These should be prefixed. + */ +#define EPOD_ID_SVAMMDSP	0 +#define EPOD_ID_SVAPIPE		1 +#define EPOD_ID_SIAMMDSP	2 +#define EPOD_ID_SIAPIPE		3 +#define EPOD_ID_SGA		4 +#define EPOD_ID_B2R2_MCDE	5 +#define EPOD_ID_ESRAM12		6 +#define EPOD_ID_ESRAM34		7 +#define NUM_EPOD_ID		8 + +/* + * DB5500 EPODs + */ +#define DB5500_EPOD_ID_BASE 0x0100 +#define DB5500_EPOD_ID_SGA (DB5500_EPOD_ID_BASE + 0) +#define DB5500_EPOD_ID_HVA (DB5500_EPOD_ID_BASE + 1) +#define DB5500_EPOD_ID_SIA (DB5500_EPOD_ID_BASE + 2) +#define DB5500_EPOD_ID_DISP (DB5500_EPOD_ID_BASE + 3) +#define DB5500_EPOD_ID_ESRAM12 (DB5500_EPOD_ID_BASE + 6) +#define DB5500_NUM_EPOD_ID 7 + +/* + * state definition for EPOD (power domain) + * - EPOD_STATE_NO_CHANGE: The EPOD should remain unchanged + * - EPOD_STATE_OFF: The EPOD is switched off + * - EPOD_STATE_RAMRET: The EPOD is switched off with its internal RAM in + *                         retention + * - EPOD_STATE_ON_CLK_OFF: The EPOD is switched on, clock is still off + * - EPOD_STATE_ON: Same as above, but with clock enabled + */ +#define EPOD_STATE_NO_CHANGE	0x00 +#define EPOD_STATE_OFF		0x01 +#define EPOD_STATE_RAMRET	0x02 +#define EPOD_STATE_ON_CLK_OFF	0x03 +#define EPOD_STATE_ON		0x04 + +/* + * CLKOUT sources + */ +#define PRCMU_CLKSRC_CLK38M		0x00 +#define PRCMU_CLKSRC_ACLK		0x01 +#define PRCMU_CLKSRC_SYSCLK		0x02 +#define PRCMU_CLKSRC_LCDCLK		0x03 +#define PRCMU_CLKSRC_SDMMCCLK		0x04 +#define PRCMU_CLKSRC_TVCLK		0x05 +#define PRCMU_CLKSRC_TIMCLK		0x06 +#define PRCMU_CLKSRC_CLK009		0x07 +/* These are only valid for CLKOUT1: */ +#define PRCMU_CLKSRC_SIAMMDSPCLK	0x40 +#define PRCMU_CLKSRC_I2CCLK		0x41 +#define PRCMU_CLKSRC_MSP02CLK		0x42 +#define PRCMU_CLKSRC_ARMPLL_OBSCLK	0x43 +#define PRCMU_CLKSRC_HSIRXCLK		0x44 +#define PRCMU_CLKSRC_HSITXCLK		0x45 +#define PRCMU_CLKSRC_ARMCLKFIX		0x46 +#define PRCMU_CLKSRC_HDMICLK		0x47 + +/* + * Clock identifiers. + */ +enum prcmu_clock { +	PRCMU_SGACLK, +	PRCMU_UARTCLK, +	PRCMU_MSP02CLK, +	PRCMU_MSP1CLK, +	PRCMU_I2CCLK, +	PRCMU_SDMMCCLK, +	PRCMU_SLIMCLK, +	PRCMU_PER1CLK, +	PRCMU_PER2CLK, +	PRCMU_PER3CLK, +	PRCMU_PER5CLK, +	PRCMU_PER6CLK, +	PRCMU_PER7CLK, +	PRCMU_LCDCLK, +	PRCMU_BMLCLK, +	PRCMU_HSITXCLK, +	PRCMU_HSIRXCLK, +	PRCMU_HDMICLK, +	PRCMU_APEATCLK, +	PRCMU_APETRACECLK, +	PRCMU_MCDECLK, +	PRCMU_IPI2CCLK, +	PRCMU_DSIALTCLK, +	PRCMU_DMACLK, +	PRCMU_B2R2CLK, +	PRCMU_TVCLK, +	PRCMU_SSPCLK, +	PRCMU_RNGCLK, +	PRCMU_UICCCLK, +	PRCMU_PWMCLK, +	PRCMU_IRDACLK, +	PRCMU_IRRCCLK, +	PRCMU_SIACLK, +	PRCMU_SVACLK, +	PRCMU_NUM_REG_CLOCKS, +	PRCMU_SYSCLK = PRCMU_NUM_REG_CLOCKS, +	PRCMU_TIMCLK, +	PRCMU_PLLSOC0, +	PRCMU_PLLSOC1, +	PRCMU_PLLDDR, +}; + +/** + * enum ape_opp - APE OPP states definition + * @APE_OPP_INIT: + * @APE_NO_CHANGE: The APE operating point is unchanged + * @APE_100_OPP: The new APE operating point is ape100opp + * @APE_50_OPP: 50% + */ +enum ape_opp { +	APE_OPP_INIT = 0x00, +	APE_NO_CHANGE = 0x01, +	APE_100_OPP = 0x02, +	APE_50_OPP = 0x03 +}; + +/** + * enum arm_opp - ARM OPP states definition + * @ARM_OPP_INIT: + * @ARM_NO_CHANGE: The ARM operating point is unchanged + * @ARM_100_OPP: The new ARM operating point is arm100opp + * @ARM_50_OPP: The new ARM operating point is arm50opp + * @ARM_MAX_OPP: Operating point is "max" (more than 100) + * @ARM_MAX_FREQ100OPP: Set max opp if available, else 100 + * @ARM_EXTCLK: The new ARM operating point is armExtClk + */ +enum arm_opp { +	ARM_OPP_INIT = 0x00, +	ARM_NO_CHANGE = 0x01, +	ARM_100_OPP = 0x02, +	ARM_50_OPP = 0x03, +	ARM_MAX_OPP = 0x04, +	ARM_MAX_FREQ100OPP = 0x05, +	ARM_EXTCLK = 0x07 +}; + +/** + * enum ddr_opp - DDR OPP states definition + * @DDR_100_OPP: The new DDR operating point is ddr100opp + * @DDR_50_OPP: The new DDR operating point is ddr50opp + * @DDR_25_OPP: The new DDR operating point is ddr25opp + */ +enum ddr_opp { +	DDR_100_OPP = 0x00, +	DDR_50_OPP = 0x01, +	DDR_25_OPP = 0x02, +}; + +/* + * Definitions for controlling ESRAM0 in deep sleep. + */ +#define ESRAM0_DEEP_SLEEP_STATE_OFF 1 +#define ESRAM0_DEEP_SLEEP_STATE_RET 2 + +/** + * enum ddr_pwrst - DDR power states definition + * @DDR_PWR_STATE_UNCHANGED: SDRAM and DDR controller state is unchanged + * @DDR_PWR_STATE_ON: + * @DDR_PWR_STATE_OFFLOWLAT: + * @DDR_PWR_STATE_OFFHIGHLAT: + */ +enum ddr_pwrst { +	DDR_PWR_STATE_UNCHANGED     = 0x00, +	DDR_PWR_STATE_ON            = 0x01, +	DDR_PWR_STATE_OFFLOWLAT     = 0x02, +	DDR_PWR_STATE_OFFHIGHLAT    = 0x03 +}; + +#include <linux/mfd/db8500-prcmu.h> +#include <linux/mfd/db5500-prcmu.h> + +#if defined(CONFIG_UX500_SOC_DB8500) || defined(CONFIG_UX500_SOC_DB5500) + +static inline void __init prcmu_early_init(void) +{ +	if (machine_is_u5500()) +		return db5500_prcmu_early_init(); +	else +		return db8500_prcmu_early_init(); +} + +static inline int prcmu_set_power_state(u8 state, bool keep_ulp_clk, +		bool keep_ap_pll) +{ +	if (machine_is_u5500()) +		return db5500_prcmu_set_power_state(state, keep_ulp_clk, +			keep_ap_pll); +	else +		return db8500_prcmu_set_power_state(state, keep_ulp_clk, +			keep_ap_pll); +} + +static inline int prcmu_set_epod(u16 epod_id, u8 epod_state) +{ +	if (machine_is_u5500()) +		return -EINVAL; +	else +		return db8500_prcmu_set_epod(epod_id, epod_state); +} + +static inline void prcmu_enable_wakeups(u32 wakeups) +{ +	if (machine_is_u5500()) +		db5500_prcmu_enable_wakeups(wakeups); +	else +		db8500_prcmu_enable_wakeups(wakeups); +} + +static inline void prcmu_disable_wakeups(void) +{ +	prcmu_enable_wakeups(0); +} + +static inline void prcmu_config_abb_event_readout(u32 abb_events) +{ +	if (machine_is_u5500()) +		db5500_prcmu_config_abb_event_readout(abb_events); +	else +		db8500_prcmu_config_abb_event_readout(abb_events); +} + +static inline void prcmu_get_abb_event_buffer(void __iomem **buf) +{ +	if (machine_is_u5500()) +		db5500_prcmu_get_abb_event_buffer(buf); +	else +		db8500_prcmu_get_abb_event_buffer(buf); +} + +int prcmu_abb_read(u8 slave, u8 reg, u8 *value, u8 size); +int prcmu_abb_write(u8 slave, u8 reg, u8 *value, u8 size); + +int prcmu_config_clkout(u8 clkout, u8 source, u8 div); + +static inline int prcmu_request_clock(u8 clock, bool enable) +{ +	if (machine_is_u5500()) +		return db5500_prcmu_request_clock(clock, enable); +	else +		return db8500_prcmu_request_clock(clock, enable); +} + +int prcmu_set_ape_opp(u8 opp); +int prcmu_get_ape_opp(void); +int prcmu_set_ddr_opp(u8 opp); +int prcmu_get_ddr_opp(void); + +static inline int prcmu_set_arm_opp(u8 opp) +{ +	if (machine_is_u5500()) +		return -EINVAL; +	else +		return db8500_prcmu_set_arm_opp(opp); +} + +static inline int prcmu_get_arm_opp(void) +{ +	if (machine_is_u5500()) +		return -EINVAL; +	else +		return db8500_prcmu_get_arm_opp(); +} + +static inline void prcmu_system_reset(u16 reset_code) +{ +	if (machine_is_u5500()) +		return db5500_prcmu_system_reset(reset_code); +	else +		return db8500_prcmu_system_reset(reset_code); +} + +static inline u16 prcmu_get_reset_code(void) +{ +	if (machine_is_u5500()) +		return db5500_prcmu_get_reset_code(); +	else +		return db8500_prcmu_get_reset_code(); +} + +void prcmu_ac_wake_req(void); +void prcmu_ac_sleep_req(void); +void prcmu_modem_reset(void); +static inline bool prcmu_is_ac_wake_requested(void) +{ +	if (machine_is_u5500()) +		return db5500_prcmu_is_ac_wake_requested(); +	else +		return db8500_prcmu_is_ac_wake_requested(); +} + +static inline int prcmu_set_display_clocks(void) +{ +	if (machine_is_u5500()) +		return db5500_prcmu_set_display_clocks(); +	else +		return db8500_prcmu_set_display_clocks(); +} + +static inline int prcmu_disable_dsipll(void) +{ +	if (machine_is_u5500()) +		return db5500_prcmu_disable_dsipll(); +	else +		return db8500_prcmu_disable_dsipll(); +} + +static inline int prcmu_enable_dsipll(void) +{ +	if (machine_is_u5500()) +		return db5500_prcmu_enable_dsipll(); +	else +		return db8500_prcmu_enable_dsipll(); +} + +static inline int prcmu_config_esram0_deep_sleep(u8 state) +{ +	if (machine_is_u5500()) +		return -EINVAL; +	else +		return db8500_prcmu_config_esram0_deep_sleep(state); +} +#else + +static inline void __init prcmu_early_init(void) {} + +static inline int prcmu_set_power_state(u8 state, bool keep_ulp_clk, +	bool keep_ap_pll) +{ +	return 0; +} + +static inline int prcmu_set_epod(u16 epod_id, u8 epod_state) +{ +	return 0; +} + +static inline void prcmu_enable_wakeups(u32 wakeups) {} + +static inline void prcmu_disable_wakeups(void) {} + +static inline int prcmu_abb_read(u8 slave, u8 reg, u8 *value, u8 size) +{ +	return -ENOSYS; +} + +static inline int prcmu_abb_write(u8 slave, u8 reg, u8 *value, u8 size) +{ +	return -ENOSYS; +} + +static inline int prcmu_config_clkout(u8 clkout, u8 source, u8 div) +{ +	return 0; +} + +static inline int prcmu_request_clock(u8 clock, bool enable) +{ +	return 0; +} + +static inline int prcmu_set_ape_opp(u8 opp) +{ +	return 0; +} + +static inline int prcmu_get_ape_opp(void) +{ +	return APE_100_OPP; +} + +static inline int prcmu_set_arm_opp(u8 opp) +{ +	return 0; +} + +static inline int prcmu_get_arm_opp(void) +{ +	return ARM_100_OPP; +} + +static inline int prcmu_set_ddr_opp(u8 opp) +{ +	return 0; +} + +static inline int prcmu_get_ddr_opp(void) +{ +	return DDR_100_OPP; +} + +static inline void prcmu_system_reset(u16 reset_code) {} + +static inline u16 prcmu_get_reset_code(void) +{ +	return 0; +} + +static inline void prcmu_ac_wake_req(void) {} + +static inline void prcmu_ac_sleep_req(void) {} + +static inline void prcmu_modem_reset(void) {} + +static inline bool prcmu_is_ac_wake_requested(void) +{ +	return false; +} + +static inline int prcmu_set_display_clocks(void) +{ +	return 0; +} + +static inline int prcmu_disable_dsipll(void) +{ +	return 0; +} + +static inline int prcmu_enable_dsipll(void) +{ +	return 0; +} + +static inline int prcmu_config_esram0_deep_sleep(u8 state) +{ +	return 0; +} + +static inline void prcmu_config_abb_event_readout(u32 abb_events) {} + +static inline void prcmu_get_abb_event_buffer(void __iomem **buf) +{ +	*buf = NULL; +} + +#endif + +/* PRCMU QoS APE OPP class */ +#define PRCMU_QOS_APE_OPP 1 +#define PRCMU_QOS_DDR_OPP 2 +#define PRCMU_QOS_DEFAULT_VALUE -1 + +#ifdef CONFIG_UX500_PRCMU_QOS_POWER + +unsigned long prcmu_qos_get_cpufreq_opp_delay(void); +void prcmu_qos_set_cpufreq_opp_delay(unsigned long); +void prcmu_qos_force_opp(int, s32); +int prcmu_qos_requirement(int pm_qos_class); +int prcmu_qos_add_requirement(int pm_qos_class, char *name, s32 value); +int prcmu_qos_update_requirement(int pm_qos_class, char *name, s32 new_value); +void prcmu_qos_remove_requirement(int pm_qos_class, char *name); +int prcmu_qos_add_notifier(int prcmu_qos_class, +			   struct notifier_block *notifier); +int prcmu_qos_remove_notifier(int prcmu_qos_class, +			      struct notifier_block *notifier); + +#else + +static inline unsigned long prcmu_qos_get_cpufreq_opp_delay(void) +{ +	return 0; +} + +static inline void prcmu_qos_set_cpufreq_opp_delay(unsigned long n) {} + +static inline void prcmu_qos_force_opp(int prcmu_qos_class, s32 i) {} + +static inline int prcmu_qos_requirement(int prcmu_qos_class) +{ +	return 0; +} + +static inline int prcmu_qos_add_requirement(int prcmu_qos_class, +					    char *name, s32 value) +{ +	return 0; +} + +static inline int prcmu_qos_update_requirement(int prcmu_qos_class, +					       char *name, s32 new_value) +{ +	return 0; +} + +static inline void prcmu_qos_remove_requirement(int prcmu_qos_class, char *name) +{ +} + +static inline int prcmu_qos_add_notifier(int prcmu_qos_class, +					 struct notifier_block *notifier) +{ +	return 0; +} +static inline int prcmu_qos_remove_notifier(int prcmu_qos_class, +					    struct notifier_block *notifier) +{ +	return 0; +} + +#endif + +#endif /* __MACH_PRCMU_H */ diff --git a/include/linux/mfd/intel_msic.h b/include/linux/mfd/intel_msic.h new file mode 100644 index 00000000000..439a7a617bc --- /dev/null +++ b/include/linux/mfd/intel_msic.h @@ -0,0 +1,456 @@ +/* + * include/linux/mfd/intel_msic.h - Core interface for Intel MSIC + * + * Copyright (C) 2011, Intel Corporation + * Author: Mika Westerberg <mika.westerberg@linux.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. + */ + +#ifndef __LINUX_MFD_INTEL_MSIC_H__ +#define __LINUX_MFD_INTEL_MSIC_H__ + +/* ID */ +#define INTEL_MSIC_ID0			0x000	/* RO */ +#define INTEL_MSIC_ID1			0x001	/* RO */ + +/* IRQ */ +#define INTEL_MSIC_IRQLVL1		0x002 +#define INTEL_MSIC_ADC1INT		0x003 +#define INTEL_MSIC_CCINT		0x004 +#define INTEL_MSIC_PWRSRCINT		0x005 +#define INTEL_MSIC_PWRSRCINT1		0x006 +#define INTEL_MSIC_CHRINT		0x007 +#define INTEL_MSIC_CHRINT1		0x008 +#define INTEL_MSIC_RTCIRQ		0x009 +#define INTEL_MSIC_GPIO0LVIRQ		0x00a +#define INTEL_MSIC_GPIO1LVIRQ		0x00b +#define INTEL_MSIC_GPIOHVIRQ		0x00c +#define INTEL_MSIC_VRINT		0x00d +#define INTEL_MSIC_OCAUDIO		0x00e +#define INTEL_MSIC_ACCDET		0x00f +#define INTEL_MSIC_RESETIRQ1		0x010 +#define INTEL_MSIC_RESETIRQ2		0x011 +#define INTEL_MSIC_MADC1INT		0x012 +#define INTEL_MSIC_MCCINT		0x013 +#define INTEL_MSIC_MPWRSRCINT		0x014 +#define INTEL_MSIC_MPWRSRCINT1		0x015 +#define INTEL_MSIC_MCHRINT		0x016 +#define INTEL_MSIC_MCHRINT1		0x017 +#define INTEL_MSIC_RTCIRQMASK		0x018 +#define INTEL_MSIC_GPIO0LVIRQMASK	0x019 +#define INTEL_MSIC_GPIO1LVIRQMASK	0x01a +#define INTEL_MSIC_GPIOHVIRQMASK	0x01b +#define INTEL_MSIC_VRINTMASK		0x01c +#define INTEL_MSIC_OCAUDIOMASK		0x01d +#define INTEL_MSIC_ACCDETMASK		0x01e +#define INTEL_MSIC_RESETIRQ1MASK	0x01f +#define INTEL_MSIC_RESETIRQ2MASK	0x020 +#define INTEL_MSIC_IRQLVL1MSK		0x021 +#define INTEL_MSIC_PBCONFIG		0x03e +#define INTEL_MSIC_PBSTATUS		0x03f	/* RO */ + +/* GPIO */ +#define INTEL_MSIC_GPIO0LV7CTLO		0x040 +#define INTEL_MSIC_GPIO0LV6CTLO		0x041 +#define INTEL_MSIC_GPIO0LV5CTLO		0x042 +#define INTEL_MSIC_GPIO0LV4CTLO		0x043 +#define INTEL_MSIC_GPIO0LV3CTLO		0x044 +#define INTEL_MSIC_GPIO0LV2CTLO		0x045 +#define INTEL_MSIC_GPIO0LV1CTLO		0x046 +#define INTEL_MSIC_GPIO0LV0CTLO		0x047 +#define INTEL_MSIC_GPIO1LV7CTLOS	0x048 +#define INTEL_MSIC_GPIO1LV6CTLO		0x049 +#define INTEL_MSIC_GPIO1LV5CTLO		0x04a +#define INTEL_MSIC_GPIO1LV4CTLO		0x04b +#define INTEL_MSIC_GPIO1LV3CTLO		0x04c +#define INTEL_MSIC_GPIO1LV2CTLO		0x04d +#define INTEL_MSIC_GPIO1LV1CTLO		0x04e +#define INTEL_MSIC_GPIO1LV0CTLO		0x04f +#define INTEL_MSIC_GPIO0LV7CTLI		0x050 +#define INTEL_MSIC_GPIO0LV6CTLI		0x051 +#define INTEL_MSIC_GPIO0LV5CTLI		0x052 +#define INTEL_MSIC_GPIO0LV4CTLI		0x053 +#define INTEL_MSIC_GPIO0LV3CTLI		0x054 +#define INTEL_MSIC_GPIO0LV2CTLI		0x055 +#define INTEL_MSIC_GPIO0LV1CTLI		0x056 +#define INTEL_MSIC_GPIO0LV0CTLI		0x057 +#define INTEL_MSIC_GPIO1LV7CTLIS	0x058 +#define INTEL_MSIC_GPIO1LV6CTLI		0x059 +#define INTEL_MSIC_GPIO1LV5CTLI		0x05a +#define INTEL_MSIC_GPIO1LV4CTLI		0x05b +#define INTEL_MSIC_GPIO1LV3CTLI		0x05c +#define INTEL_MSIC_GPIO1LV2CTLI		0x05d +#define INTEL_MSIC_GPIO1LV1CTLI		0x05e +#define INTEL_MSIC_GPIO1LV0CTLI		0x05f +#define INTEL_MSIC_PWM0CLKDIV1		0x061 +#define INTEL_MSIC_PWM0CLKDIV0		0x062 +#define INTEL_MSIC_PWM1CLKDIV1		0x063 +#define INTEL_MSIC_PWM1CLKDIV0		0x064 +#define INTEL_MSIC_PWM2CLKDIV1		0x065 +#define INTEL_MSIC_PWM2CLKDIV0		0x066 +#define INTEL_MSIC_PWM0DUTYCYCLE	0x067 +#define INTEL_MSIC_PWM1DUTYCYCLE	0x068 +#define INTEL_MSIC_PWM2DUTYCYCLE	0x069 +#define INTEL_MSIC_GPIO0HV3CTLO		0x06d +#define INTEL_MSIC_GPIO0HV2CTLO		0x06e +#define INTEL_MSIC_GPIO0HV1CTLO		0x06f +#define INTEL_MSIC_GPIO0HV0CTLO		0x070 +#define INTEL_MSIC_GPIO1HV3CTLO		0x071 +#define INTEL_MSIC_GPIO1HV2CTLO		0x072 +#define INTEL_MSIC_GPIO1HV1CTLO		0x073 +#define INTEL_MSIC_GPIO1HV0CTLO		0x074 +#define INTEL_MSIC_GPIO0HV3CTLI		0x075 +#define INTEL_MSIC_GPIO0HV2CTLI		0x076 +#define INTEL_MSIC_GPIO0HV1CTLI		0x077 +#define INTEL_MSIC_GPIO0HV0CTLI		0x078 +#define INTEL_MSIC_GPIO1HV3CTLI		0x079 +#define INTEL_MSIC_GPIO1HV2CTLI		0x07a +#define INTEL_MSIC_GPIO1HV1CTLI		0x07b +#define INTEL_MSIC_GPIO1HV0CTLI		0x07c + +/* SVID */ +#define INTEL_MSIC_SVIDCTRL0		0x080 +#define INTEL_MSIC_SVIDCTRL1		0x081 +#define INTEL_MSIC_SVIDCTRL2		0x082 +#define INTEL_MSIC_SVIDTXLASTPKT3	0x083	/* RO */ +#define INTEL_MSIC_SVIDTXLASTPKT2	0x084	/* RO */ +#define INTEL_MSIC_SVIDTXLASTPKT1	0x085	/* RO */ +#define INTEL_MSIC_SVIDTXLASTPKT0	0x086	/* RO */ +#define INTEL_MSIC_SVIDPKTOUTBYTE3	0x087 +#define INTEL_MSIC_SVIDPKTOUTBYTE2	0x088 +#define INTEL_MSIC_SVIDPKTOUTBYTE1	0x089 +#define INTEL_MSIC_SVIDPKTOUTBYTE0	0x08a +#define INTEL_MSIC_SVIDRXVPDEBUG1	0x08b +#define INTEL_MSIC_SVIDRXVPDEBUG0	0x08c +#define INTEL_MSIC_SVIDRXLASTPKT3	0x08d	/* RO */ +#define INTEL_MSIC_SVIDRXLASTPKT2	0x08e	/* RO */ +#define INTEL_MSIC_SVIDRXLASTPKT1	0x08f	/* RO */ +#define INTEL_MSIC_SVIDRXLASTPKT0	0x090	/* RO */ +#define INTEL_MSIC_SVIDRXCHKSTATUS3	0x091	/* RO */ +#define INTEL_MSIC_SVIDRXCHKSTATUS2	0x092	/* RO */ +#define INTEL_MSIC_SVIDRXCHKSTATUS1	0x093	/* RO */ +#define INTEL_MSIC_SVIDRXCHKSTATUS0	0x094	/* RO */ + +/* VREG */ +#define INTEL_MSIC_VCCLATCH		0x0c0 +#define INTEL_MSIC_VNNLATCH		0x0c1 +#define INTEL_MSIC_VCCCNT		0x0c2 +#define INTEL_MSIC_SMPSRAMP		0x0c3 +#define INTEL_MSIC_VNNCNT		0x0c4 +#define INTEL_MSIC_VNNAONCNT		0x0c5 +#define INTEL_MSIC_VCC122AONCNT		0x0c6 +#define INTEL_MSIC_V180AONCNT		0x0c7 +#define INTEL_MSIC_V500CNT		0x0c8 +#define INTEL_MSIC_VIHFCNT		0x0c9 +#define INTEL_MSIC_LDORAMP1		0x0ca +#define INTEL_MSIC_LDORAMP2		0x0cb +#define INTEL_MSIC_VCC108AONCNT		0x0cc +#define INTEL_MSIC_VCC108ASCNT		0x0cd +#define INTEL_MSIC_VCC108CNT		0x0ce +#define INTEL_MSIC_VCCA100ASCNT		0x0cf +#define INTEL_MSIC_VCCA100CNT		0x0d0 +#define INTEL_MSIC_VCC180AONCNT		0x0d1 +#define INTEL_MSIC_VCC180CNT		0x0d2 +#define INTEL_MSIC_VCC330CNT		0x0d3 +#define INTEL_MSIC_VUSB330CNT		0x0d4 +#define INTEL_MSIC_VCCSDIOCNT		0x0d5 +#define INTEL_MSIC_VPROG1CNT		0x0d6 +#define INTEL_MSIC_VPROG2CNT		0x0d7 +#define INTEL_MSIC_VEMMCSCNT		0x0d8 +#define INTEL_MSIC_VEMMC1CNT		0x0d9 +#define INTEL_MSIC_VEMMC2CNT		0x0da +#define INTEL_MSIC_VAUDACNT		0x0db +#define INTEL_MSIC_VHSPCNT		0x0dc +#define INTEL_MSIC_VHSNCNT		0x0dd +#define INTEL_MSIC_VHDMICNT		0x0de +#define INTEL_MSIC_VOTGCNT		0x0df +#define INTEL_MSIC_V1P35CNT		0x0e0 +#define INTEL_MSIC_V330AONCNT		0x0e1 + +/* RESET */ +#define INTEL_MSIC_CHIPCNTRL		0x100	/* WO */ +#define INTEL_MSIC_ERCONFIG		0x101 + +/* BURST */ +#define INTEL_MSIC_BATCURRENTLIMIT12	0x102 +#define INTEL_MSIC_BATTIMELIMIT12	0x103 +#define INTEL_MSIC_BATTIMELIMIT3	0x104 +#define INTEL_MSIC_BATTIMEDB		0x105 +#define INTEL_MSIC_BRSTCONFIGOUTPUTS	0x106 +#define INTEL_MSIC_BRSTCONFIGACTIONS	0x107 +#define INTEL_MSIC_BURSTCONTROLSTATUS	0x108 + +/* RTC */ +#define INTEL_MSIC_RTCB1		0x140	/* RO */ +#define INTEL_MSIC_RTCB2		0x141	/* RO */ +#define INTEL_MSIC_RTCB3		0x142	/* RO */ +#define INTEL_MSIC_RTCB4		0x143	/* RO */ +#define INTEL_MSIC_RTCOB1		0x144 +#define INTEL_MSIC_RTCOB2		0x145 +#define INTEL_MSIC_RTCOB3		0x146 +#define INTEL_MSIC_RTCOB4		0x147 +#define INTEL_MSIC_RTCAB1		0x148 +#define INTEL_MSIC_RTCAB2		0x149 +#define INTEL_MSIC_RTCAB3		0x14a +#define INTEL_MSIC_RTCAB4		0x14b +#define INTEL_MSIC_RTCWAB1		0x14c +#define INTEL_MSIC_RTCWAB2		0x14d +#define INTEL_MSIC_RTCWAB3		0x14e +#define INTEL_MSIC_RTCWAB4		0x14f +#define INTEL_MSIC_RTCSC1		0x150 +#define INTEL_MSIC_RTCSC2		0x151 +#define INTEL_MSIC_RTCSC3		0x152 +#define INTEL_MSIC_RTCSC4		0x153 +#define INTEL_MSIC_RTCSTATUS		0x154	/* RO */ +#define INTEL_MSIC_RTCCONFIG1		0x155 +#define INTEL_MSIC_RTCCONFIG2		0x156 + +/* CHARGER */ +#define INTEL_MSIC_BDTIMER		0x180 +#define INTEL_MSIC_BATTRMV		0x181 +#define INTEL_MSIC_VBUSDET		0x182 +#define INTEL_MSIC_VBUSDET1		0x183 +#define INTEL_MSIC_ADPHVDET		0x184 +#define INTEL_MSIC_ADPLVDET		0x185 +#define INTEL_MSIC_ADPDETDBDM		0x186 +#define INTEL_MSIC_LOWBATTDET		0x187 +#define INTEL_MSIC_CHRCTRL		0x188 +#define INTEL_MSIC_CHRCVOLTAGE		0x189 +#define INTEL_MSIC_CHRCCURRENT		0x18a +#define INTEL_MSIC_SPCHARGER		0x18b +#define INTEL_MSIC_CHRTTIME		0x18c +#define INTEL_MSIC_CHRCTRL1		0x18d +#define INTEL_MSIC_PWRSRCLMT		0x18e +#define INTEL_MSIC_CHRSTWDT		0x18f +#define INTEL_MSIC_WDTWRITE		0x190	/* WO */ +#define INTEL_MSIC_CHRSAFELMT		0x191 +#define INTEL_MSIC_SPWRSRCINT		0x192	/* RO */ +#define INTEL_MSIC_SPWRSRCINT1		0x193	/* RO */ +#define INTEL_MSIC_CHRLEDPWM		0x194 +#define INTEL_MSIC_CHRLEDCTRL		0x195 + +/* ADC */ +#define INTEL_MSIC_ADC1CNTL1		0x1c0 +#define INTEL_MSIC_ADC1CNTL2		0x1c1 +#define INTEL_MSIC_ADC1CNTL3		0x1c2 +#define INTEL_MSIC_ADC1OFFSETH		0x1c3	/* RO */ +#define INTEL_MSIC_ADC1OFFSETL		0x1c4	/* RO */ +#define INTEL_MSIC_ADC1ADDR0		0x1c5 +#define INTEL_MSIC_ADC1ADDR1		0x1c6 +#define INTEL_MSIC_ADC1ADDR2		0x1c7 +#define INTEL_MSIC_ADC1ADDR3		0x1c8 +#define INTEL_MSIC_ADC1ADDR4		0x1c9 +#define INTEL_MSIC_ADC1ADDR5		0x1ca +#define INTEL_MSIC_ADC1ADDR6		0x1cb +#define INTEL_MSIC_ADC1ADDR7		0x1cc +#define INTEL_MSIC_ADC1ADDR8		0x1cd +#define INTEL_MSIC_ADC1ADDR9		0x1ce +#define INTEL_MSIC_ADC1ADDR10		0x1cf +#define INTEL_MSIC_ADC1ADDR11		0x1d0 +#define INTEL_MSIC_ADC1ADDR12		0x1d1 +#define INTEL_MSIC_ADC1ADDR13		0x1d2 +#define INTEL_MSIC_ADC1ADDR14		0x1d3 +#define INTEL_MSIC_ADC1SNS0H		0x1d4	/* RO */ +#define INTEL_MSIC_ADC1SNS0L		0x1d5	/* RO */ +#define INTEL_MSIC_ADC1SNS1H		0x1d6	/* RO */ +#define INTEL_MSIC_ADC1SNS1L		0x1d7	/* RO */ +#define INTEL_MSIC_ADC1SNS2H		0x1d8	/* RO */ +#define INTEL_MSIC_ADC1SNS2L		0x1d9	/* RO */ +#define INTEL_MSIC_ADC1SNS3H		0x1da	/* RO */ +#define INTEL_MSIC_ADC1SNS3L		0x1db	/* RO */ +#define INTEL_MSIC_ADC1SNS4H		0x1dc	/* RO */ +#define INTEL_MSIC_ADC1SNS4L		0x1dd	/* RO */ +#define INTEL_MSIC_ADC1SNS5H		0x1de	/* RO */ +#define INTEL_MSIC_ADC1SNS5L		0x1df	/* RO */ +#define INTEL_MSIC_ADC1SNS6H		0x1e0	/* RO */ +#define INTEL_MSIC_ADC1SNS6L		0x1e1	/* RO */ +#define INTEL_MSIC_ADC1SNS7H		0x1e2	/* RO */ +#define INTEL_MSIC_ADC1SNS7L		0x1e3	/* RO */ +#define INTEL_MSIC_ADC1SNS8H		0x1e4	/* RO */ +#define INTEL_MSIC_ADC1SNS8L		0x1e5	/* RO */ +#define INTEL_MSIC_ADC1SNS9H		0x1e6	/* RO */ +#define INTEL_MSIC_ADC1SNS9L		0x1e7	/* RO */ +#define INTEL_MSIC_ADC1SNS10H		0x1e8	/* RO */ +#define INTEL_MSIC_ADC1SNS10L		0x1e9	/* RO */ +#define INTEL_MSIC_ADC1SNS11H		0x1ea	/* RO */ +#define INTEL_MSIC_ADC1SNS11L		0x1eb	/* RO */ +#define INTEL_MSIC_ADC1SNS12H		0x1ec	/* RO */ +#define INTEL_MSIC_ADC1SNS12L		0x1ed	/* RO */ +#define INTEL_MSIC_ADC1SNS13H		0x1ee	/* RO */ +#define INTEL_MSIC_ADC1SNS13L		0x1ef	/* RO */ +#define INTEL_MSIC_ADC1SNS14H		0x1f0	/* RO */ +#define INTEL_MSIC_ADC1SNS14L		0x1f1	/* RO */ +#define INTEL_MSIC_ADC1BV0H		0x1f2	/* RO */ +#define INTEL_MSIC_ADC1BV0L		0x1f3	/* RO */ +#define INTEL_MSIC_ADC1BV1H		0x1f4	/* RO */ +#define INTEL_MSIC_ADC1BV1L		0x1f5	/* RO */ +#define INTEL_MSIC_ADC1BV2H		0x1f6	/* RO */ +#define INTEL_MSIC_ADC1BV2L		0x1f7	/* RO */ +#define INTEL_MSIC_ADC1BV3H		0x1f8	/* RO */ +#define INTEL_MSIC_ADC1BV3L		0x1f9	/* RO */ +#define INTEL_MSIC_ADC1BI0H		0x1fa	/* RO */ +#define INTEL_MSIC_ADC1BI0L		0x1fb	/* RO */ +#define INTEL_MSIC_ADC1BI1H		0x1fc	/* RO */ +#define INTEL_MSIC_ADC1BI1L		0x1fd	/* RO */ +#define INTEL_MSIC_ADC1BI2H		0x1fe	/* RO */ +#define INTEL_MSIC_ADC1BI2L		0x1ff	/* RO */ +#define INTEL_MSIC_ADC1BI3H		0x200	/* RO */ +#define INTEL_MSIC_ADC1BI3L		0x201	/* RO */ +#define INTEL_MSIC_CCCNTL		0x202 +#define INTEL_MSIC_CCOFFSETH		0x203	/* RO */ +#define INTEL_MSIC_CCOFFSETL		0x204	/* RO */ +#define INTEL_MSIC_CCADCHA		0x205	/* RO */ +#define INTEL_MSIC_CCADCLA		0x206	/* RO */ + +/* AUDIO */ +#define INTEL_MSIC_AUDPLLCTRL		0x240 +#define INTEL_MSIC_DMICBUF0123		0x241 +#define INTEL_MSIC_DMICBUF45		0x242 +#define INTEL_MSIC_DMICGPO		0x244 +#define INTEL_MSIC_DMICMUX		0x245 +#define INTEL_MSIC_DMICCLK		0x246 +#define INTEL_MSIC_MICBIAS		0x247 +#define INTEL_MSIC_ADCCONFIG		0x248 +#define INTEL_MSIC_MICAMP1		0x249 +#define INTEL_MSIC_MICAMP2		0x24a +#define INTEL_MSIC_NOISEMUX		0x24b +#define INTEL_MSIC_AUDIOMUX12		0x24c +#define INTEL_MSIC_AUDIOMUX34		0x24d +#define INTEL_MSIC_AUDIOSINC		0x24e +#define INTEL_MSIC_AUDIOTXEN		0x24f +#define INTEL_MSIC_HSEPRXCTRL		0x250 +#define INTEL_MSIC_IHFRXCTRL		0x251 +#define INTEL_MSIC_VOICETXVOL		0x252 +#define INTEL_MSIC_SIDETONEVOL		0x253 +#define INTEL_MSIC_MUSICSHARVOL		0x254 +#define INTEL_MSIC_VOICETXCTRL		0x255 +#define INTEL_MSIC_HSMIXER		0x256 +#define INTEL_MSIC_DACCONFIG		0x257 +#define INTEL_MSIC_SOFTMUTE		0x258 +#define INTEL_MSIC_HSLVOLCTRL		0x259 +#define INTEL_MSIC_HSRVOLCTRL		0x25a +#define INTEL_MSIC_IHFLVOLCTRL		0x25b +#define INTEL_MSIC_IHFRVOLCTRL		0x25c +#define INTEL_MSIC_DRIVEREN		0x25d +#define INTEL_MSIC_LINEOUTCTRL		0x25e +#define INTEL_MSIC_VIB1CTRL1		0x25f +#define INTEL_MSIC_VIB1CTRL2		0x260 +#define INTEL_MSIC_VIB1CTRL3		0x261 +#define INTEL_MSIC_VIB1SPIPCM_1		0x262 +#define INTEL_MSIC_VIB1SPIPCM_2		0x263 +#define INTEL_MSIC_VIB1CTRL5		0x264 +#define INTEL_MSIC_VIB2CTRL1		0x265 +#define INTEL_MSIC_VIB2CTRL2		0x266 +#define INTEL_MSIC_VIB2CTRL3		0x267 +#define INTEL_MSIC_VIB2SPIPCM_1		0x268 +#define INTEL_MSIC_VIB2SPIPCM_2		0x269 +#define INTEL_MSIC_VIB2CTRL5		0x26a +#define INTEL_MSIC_BTNCTRL1		0x26b +#define INTEL_MSIC_BTNCTRL2		0x26c +#define INTEL_MSIC_PCM1TXSLOT01		0x26d +#define INTEL_MSIC_PCM1TXSLOT23		0x26e +#define INTEL_MSIC_PCM1TXSLOT45		0x26f +#define INTEL_MSIC_PCM1RXSLOT0123	0x270 +#define INTEL_MSIC_PCM1RXSLOT045	0x271 +#define INTEL_MSIC_PCM2TXSLOT01		0x272 +#define INTEL_MSIC_PCM2TXSLOT23		0x273 +#define INTEL_MSIC_PCM2TXSLOT45		0x274 +#define INTEL_MSIC_PCM2RXSLOT01		0x275 +#define INTEL_MSIC_PCM2RXSLOT23		0x276 +#define INTEL_MSIC_PCM2RXSLOT45		0x277 +#define INTEL_MSIC_PCM1CTRL1		0x278 +#define INTEL_MSIC_PCM1CTRL2		0x279 +#define INTEL_MSIC_PCM1CTRL3		0x27a +#define INTEL_MSIC_PCM2CTRL1		0x27b +#define INTEL_MSIC_PCM2CTRL2		0x27c + +/* HDMI */ +#define INTEL_MSIC_HDMIPUEN		0x280 +#define INTEL_MSIC_HDMISTATUS		0x281	/* RO */ + +/* Physical address of the start of the MSIC interrupt tree in SRAM */ +#define INTEL_MSIC_IRQ_PHYS_BASE	0xffff7fc0 + +/** + * struct intel_msic_gpio_pdata - platform data for the MSIC GPIO driver + * @gpio_base: base number for the GPIOs + */ +struct intel_msic_gpio_pdata { +	unsigned	gpio_base; +}; + +/** + * struct intel_msic_ocd_pdata - platform data for the MSIC OCD driver + * @gpio: GPIO number used for OCD interrupts + * + * The MSIC MFD driver converts @gpio into an IRQ number and passes it to + * the OCD driver as %IORESOURCE_IRQ. + */ +struct intel_msic_ocd_pdata { +	unsigned	gpio; +}; + +/* MSIC embedded blocks (subdevices) */ +enum intel_msic_block { +	INTEL_MSIC_BLOCK_TOUCH, +	INTEL_MSIC_BLOCK_ADC, +	INTEL_MSIC_BLOCK_BATTERY, +	INTEL_MSIC_BLOCK_GPIO, +	INTEL_MSIC_BLOCK_AUDIO, +	INTEL_MSIC_BLOCK_HDMI, +	INTEL_MSIC_BLOCK_THERMAL, +	INTEL_MSIC_BLOCK_POWER_BTN, +	INTEL_MSIC_BLOCK_OCD, + +	INTEL_MSIC_BLOCK_LAST, +}; + +/** + * struct intel_msic_platform_data - platform data for the MSIC driver + * @irq: array of interrupt numbers, one per device. If @irq is set to %0 + *	 for a given block, the corresponding platform device is not + *	 created. For devices which don't have an interrupt, use %0xff + *	 (this is same as in SFI spec). + * @gpio: platform data for the MSIC GPIO driver + * @ocd: platform data for the MSIC OCD driver + * + * Once the MSIC driver is initialized, the register interface is ready to + * use. All the platform devices for subdevices are created after the + * register interface is ready so that we can guarantee its availability to + * the subdevice drivers. + * + * Interrupt numbers are passed to the subdevices via %IORESOURCE_IRQ + * resources of the created platform device. + */ +struct intel_msic_platform_data { +	int				irq[INTEL_MSIC_BLOCK_LAST]; +	struct intel_msic_gpio_pdata	*gpio; +	struct intel_msic_ocd_pdata	*ocd; +}; + +struct intel_msic; + +extern int intel_msic_reg_read(unsigned short reg, u8 *val); +extern int intel_msic_reg_write(unsigned short reg, u8 val); +extern int intel_msic_reg_update(unsigned short reg, u8 val, u8 mask); +extern int intel_msic_bulk_read(unsigned short *reg, u8 *buf, size_t count); +extern int intel_msic_bulk_write(unsigned short *reg, u8 *buf, size_t count); + +/* + * pdev_to_intel_msic - gets an MSIC instance from the platform device + * @pdev: platform device pointer + * + * The client drivers need to have pointer to the MSIC instance if they + * want to call intel_msic_irq_read(). This macro can be used for + * convenience to get the MSIC pointer from @pdev where needed. This is + * _only_ valid for devices which are managed by the MSIC. + */ +#define pdev_to_intel_msic(pdev)	(dev_get_drvdata(pdev->dev.parent)) + +extern int intel_msic_irq_read(struct intel_msic *msic, unsigned short reg, +			       u8 *val); + +#endif /* __LINUX_MFD_INTEL_MSIC_H__ */ diff --git a/include/linux/mfd/max8997-private.h b/include/linux/mfd/max8997-private.h index 5ff2400ad46..3f4deb62d6b 100644 --- a/include/linux/mfd/max8997-private.h +++ b/include/linux/mfd/max8997-private.h @@ -326,7 +326,6 @@ struct max8997_dev {  	int irq;  	int ono;  	int irq_base; -	bool wakeup;  	struct mutex irqlock;  	int irq_masks_cur[MAX8997_IRQ_GROUP_NR];  	int irq_masks_cache[MAX8997_IRQ_GROUP_NR]; diff --git a/include/linux/mfd/mc13783.h b/include/linux/mfd/mc13783.h index 7d0f3d6a000..a8eeda773a7 100644 --- a/include/linux/mfd/mc13783.h +++ b/include/linux/mfd/mc13783.h @@ -12,117 +12,6 @@  #include <linux/mfd/mc13xxx.h> -struct mc13783; - -struct mc13xxx *mc13783_to_mc13xxx(struct mc13783 *mc13783); - -static inline void mc13783_lock(struct mc13783 *mc13783) -{ -	mc13xxx_lock(mc13783_to_mc13xxx(mc13783)); -} - -static inline void mc13783_unlock(struct mc13783 *mc13783) -{ -	mc13xxx_unlock(mc13783_to_mc13xxx(mc13783)); -} - -static inline int mc13783_reg_read(struct mc13783 *mc13783, -		unsigned int offset, u32 *val) -{ -	return mc13xxx_reg_read(mc13783_to_mc13xxx(mc13783), offset, val); -} - -static inline int mc13783_reg_write(struct mc13783 *mc13783, -		unsigned int offset, u32 val) -{ -	return mc13xxx_reg_write(mc13783_to_mc13xxx(mc13783), offset, val); -} - -static inline int mc13783_reg_rmw(struct mc13783 *mc13783, -		unsigned int offset, u32 mask, u32 val) -{ -	return mc13xxx_reg_rmw(mc13783_to_mc13xxx(mc13783), offset, mask, val); -} - -static inline int mc13783_get_flags(struct mc13783 *mc13783) -{ -	return mc13xxx_get_flags(mc13783_to_mc13xxx(mc13783)); -} - -static inline int mc13783_irq_request(struct mc13783 *mc13783, int irq, -		irq_handler_t handler, const char *name, void *dev) -{ -	return mc13xxx_irq_request(mc13783_to_mc13xxx(mc13783), irq, -			handler, name, dev); -} - -static inline int mc13783_irq_request_nounmask(struct mc13783 *mc13783, int irq, -		irq_handler_t handler, const char *name, void *dev) -{ -	return mc13xxx_irq_request_nounmask(mc13783_to_mc13xxx(mc13783), irq, -			handler, name, dev); -} - -static inline int mc13783_irq_free(struct mc13783 *mc13783, int irq, void *dev) -{ -	return mc13xxx_irq_free(mc13783_to_mc13xxx(mc13783), irq, dev); -} - -static inline int mc13783_irq_mask(struct mc13783 *mc13783, int irq) -{ -	return mc13xxx_irq_mask(mc13783_to_mc13xxx(mc13783), irq); -} - -static inline int mc13783_irq_unmask(struct mc13783 *mc13783, int irq) -{ -	return mc13xxx_irq_unmask(mc13783_to_mc13xxx(mc13783), irq); -} -static inline int mc13783_irq_status(struct mc13783 *mc13783, int irq, -		int *enabled, int *pending) -{ -	return mc13xxx_irq_status(mc13783_to_mc13xxx(mc13783), -			irq, enabled, pending); -} - -static inline int mc13783_irq_ack(struct mc13783 *mc13783, int irq) -{ -	return mc13xxx_irq_ack(mc13783_to_mc13xxx(mc13783), irq); -} - -#define MC13783_ADC0		43 -#define MC13783_ADC0_ADREFEN		(1 << 10) -#define MC13783_ADC0_ADREFMODE		(1 << 11) -#define MC13783_ADC0_TSMOD0		(1 << 12) -#define MC13783_ADC0_TSMOD1		(1 << 13) -#define MC13783_ADC0_TSMOD2		(1 << 14) -#define MC13783_ADC0_ADINC1		(1 << 16) -#define MC13783_ADC0_ADINC2		(1 << 17) - -#define MC13783_ADC0_TSMOD_MASK		(MC13783_ADC0_TSMOD0 | \ -					MC13783_ADC0_TSMOD1 | \ -					MC13783_ADC0_TSMOD2) - -#define mc13783_regulator_init_data mc13xxx_regulator_init_data -#define mc13783_regulator_platform_data mc13xxx_regulator_platform_data -#define mc13783_led_platform_data mc13xxx_led_platform_data -#define mc13783_leds_platform_data mc13xxx_leds_platform_data - -#define mc13783_platform_data mc13xxx_platform_data -#define MC13783_USE_TOUCHSCREEN	MC13XXX_USE_TOUCHSCREEN -#define MC13783_USE_CODEC	MC13XXX_USE_CODEC -#define MC13783_USE_ADC		MC13XXX_USE_ADC -#define MC13783_USE_RTC		MC13XXX_USE_RTC -#define MC13783_USE_REGULATOR	MC13XXX_USE_REGULATOR -#define MC13783_USE_LED		MC13XXX_USE_LED - -#define MC13783_ADC_MODE_TS		1 -#define MC13783_ADC_MODE_SINGLE_CHAN	2 -#define MC13783_ADC_MODE_MULT_CHAN	3 - -int mc13783_adc_do_conversion(struct mc13783 *mc13783, unsigned int mode, -		unsigned int channel, unsigned int *sample); - -  #define	MC13783_REG_SW1A		0  #define	MC13783_REG_SW1B		1  #define	MC13783_REG_SW2A		2 diff --git a/include/linux/mfd/mc13xxx.h b/include/linux/mfd/mc13xxx.h index c064beaaccb..3816c2fac0a 100644 --- a/include/linux/mfd/mc13xxx.h +++ b/include/linux/mfd/mc13xxx.h @@ -37,6 +37,9 @@ int mc13xxx_irq_ack(struct mc13xxx *mc13xxx, int irq);  int mc13xxx_get_flags(struct mc13xxx *mc13xxx); +int mc13xxx_adc_do_conversion(struct mc13xxx *mc13xxx, +		unsigned int mode, unsigned int channel, unsigned int *sample); +  #define MC13XXX_IRQ_ADCDONE	0  #define MC13XXX_IRQ_ADCBISDONE	1  #define MC13XXX_IRQ_TS		2 @@ -137,17 +140,48 @@ struct mc13xxx_leds_platform_data {  	char tc3_period;  }; +struct mc13xxx_buttons_platform_data { +#define MC13783_BUTTON_DBNC_0MS		0 +#define MC13783_BUTTON_DBNC_30MS	1 +#define MC13783_BUTTON_DBNC_150MS	2 +#define MC13783_BUTTON_DBNC_750MS	3 +#define MC13783_BUTTON_ENABLE		(1 << 2) +#define MC13783_BUTTON_POL_INVERT	(1 << 3) +#define MC13783_BUTTON_RESET_EN		(1 << 4) +	int b1on_flags; +	unsigned short b1on_key; +	int b2on_flags; +	unsigned short b2on_key; +	int b3on_flags; +	unsigned short b3on_key; +}; +  struct mc13xxx_platform_data {  #define MC13XXX_USE_TOUCHSCREEN (1 << 0)  #define MC13XXX_USE_CODEC	(1 << 1)  #define MC13XXX_USE_ADC		(1 << 2)  #define MC13XXX_USE_RTC		(1 << 3) -#define MC13XXX_USE_REGULATOR	(1 << 4) -#define MC13XXX_USE_LED		(1 << 5)  	unsigned int flags;  	struct mc13xxx_regulator_platform_data regulators;  	struct mc13xxx_leds_platform_data *leds; +	struct mc13xxx_buttons_platform_data *buttons;  }; +#define MC13XXX_ADC_MODE_TS		1 +#define MC13XXX_ADC_MODE_SINGLE_CHAN	2 +#define MC13XXX_ADC_MODE_MULT_CHAN	3 + +#define MC13XXX_ADC0		43 +#define MC13XXX_ADC0_ADREFEN		(1 << 10) +#define MC13XXX_ADC0_TSMOD0		(1 << 12) +#define MC13XXX_ADC0_TSMOD1		(1 << 13) +#define MC13XXX_ADC0_TSMOD2		(1 << 14) +#define MC13XXX_ADC0_ADINC1		(1 << 16) +#define MC13XXX_ADC0_ADINC2		(1 << 17) + +#define MC13XXX_ADC0_TSMOD_MASK		(MC13XXX_ADC0_TSMOD0 | \ +					MC13XXX_ADC0_TSMOD1 | \ +					MC13XXX_ADC0_TSMOD2) +  #endif /* ifndef __LINUX_MFD_MC13XXX_H */ diff --git a/include/linux/mfd/pcf50633/core.h b/include/linux/mfd/pcf50633/core.h index 50d4a047118..a80840752b4 100644 --- a/include/linux/mfd/pcf50633/core.h +++ b/include/linux/mfd/pcf50633/core.h @@ -21,6 +21,7 @@  #include <linux/mfd/pcf50633/backlight.h>  struct pcf50633; +struct regmap;  #define PCF50633_NUM_REGULATORS	11 @@ -134,7 +135,7 @@ enum {  struct pcf50633 {  	struct device *dev; -	struct i2c_client *i2c_client; +	struct regmap *regmap;  	struct pcf50633_platform_data *pdata;  	int irq; diff --git a/include/linux/mfd/tps6586x.h b/include/linux/mfd/tps6586x.h index b6bab1b04e2..b19176eab44 100644 --- a/include/linux/mfd/tps6586x.h +++ b/include/linux/mfd/tps6586x.h @@ -1,6 +1,18 @@  #ifndef __LINUX_MFD_TPS6586X_H  #define __LINUX_MFD_TPS6586X_H +#define TPS6586X_SLEW_RATE_INSTANTLY	0x00 +#define TPS6586X_SLEW_RATE_110UV	0x01 +#define TPS6586X_SLEW_RATE_220UV	0x02 +#define TPS6586X_SLEW_RATE_440UV	0x03 +#define TPS6586X_SLEW_RATE_880UV	0x04 +#define TPS6586X_SLEW_RATE_1760UV	0x05 +#define TPS6586X_SLEW_RATE_3520UV	0x06 +#define TPS6586X_SLEW_RATE_7040UV	0x07 + +#define TPS6586X_SLEW_RATE_SET		0x08 +#define TPS6586X_SLEW_RATE_MASK         0x07 +  enum {  	TPS6586X_ID_SM_0,  	TPS6586X_ID_SM_1, @@ -48,6 +60,10 @@ enum {  	TPS6586X_INT_RTC_ALM2,  }; +struct tps6586x_settings { +	int slew_rate; +}; +  struct tps6586x_subdev_info {  	int		id;  	const char	*name; diff --git a/include/linux/mfd/twl6040.h b/include/linux/mfd/twl6040.h index 4c806f6d663..2463c261959 100644 --- a/include/linux/mfd/twl6040.h +++ b/include/linux/mfd/twl6040.h @@ -68,11 +68,6 @@  #define TWL6040_REG_ACCCTL		0x2D  #define TWL6040_REG_STATUS		0x2E -#define TWL6040_CACHEREGNUM		(TWL6040_REG_STATUS + 1) - -#define TWL6040_VIOREGNUM		18 -#define TWL6040_VDDREGNUM		21 -  /* INTID (0x03) fields */  #define TWL6040_THINT			0x01 @@ -125,34 +120,24 @@  #define TWL6040_LPLLFIN			0x08  #define TWL6040_HPLLSEL			0x10 -/* HSLCTL (0x10) fields */ - -#define TWL6040_HSDACMODEL		0x02 -#define TWL6040_HSDRVMODEL		0x08 - -/* HSRCTL (0x11) fields */ +/* HSLCTL/R (0x10/0x11) fields */ -#define TWL6040_HSDACMODER		0x02 -#define TWL6040_HSDRVMODER		0x08 +#define TWL6040_HSDACENA		(1 << 0) +#define TWL6040_HSDACMODE		(1 << 1) +#define TWL6040_HSDRVMODE		(1 << 3) -/* VIBCTLL (0x18) fields */ +/* VIBCTLL/R (0x18/0x1A) fields */ -#define TWL6040_VIBENAL			0x01 -#define TWL6040_VIBCTRLL		0x04 -#define TWL6040_VIBCTRLLP		0x08 -#define TWL6040_VIBCTRLLN		0x10 +#define TWL6040_VIBENA			(1 << 0) +#define TWL6040_VIBSEL			(1 << 1) +#define TWL6040_VIBCTRL			(1 << 2) +#define TWL6040_VIBCTRL_P		(1 << 3) +#define TWL6040_VIBCTRL_N		(1 << 4) -/* VIBDATL (0x19) fields */ +/* VIBDATL/R (0x19/0x1B) fields */  #define TWL6040_VIBDAT_MAX		0x64 -/* VIBCTLR (0x1A) fields */ - -#define TWL6040_VIBENAR			0x01 -#define TWL6040_VIBCTRLR		0x04 -#define TWL6040_VIBCTRLRP		0x08 -#define TWL6040_VIBCTRLRN		0x10 -  /* GPOCTL (0x1E) fields */  #define TWL6040_GPO1			0x01 @@ -200,6 +185,7 @@ struct twl6040 {  	int audpwron;  	int power_count;  	int rev; +	u8 vibra_ctrl_cache[2];  	int pll;  	unsigned int sysclk; @@ -224,5 +210,13 @@ int twl6040_get_pll(struct twl6040 *twl6040);  unsigned int twl6040_get_sysclk(struct twl6040 *twl6040);  int twl6040_irq_init(struct twl6040 *twl6040);  void twl6040_irq_exit(struct twl6040 *twl6040); +/* Get the combined status of the vibra control register */ +int twl6040_get_vibralr_status(struct twl6040 *twl6040); + +static inline int twl6040_get_revid(struct twl6040 *twl6040) +{ +	return twl6040->rev; +} +  #endif  /* End of __TWL6040_CODEC_H__ */ diff --git a/include/linux/mfd/wm831x/core.h b/include/linux/mfd/wm831x/core.h index 8dda8ded5cd..4b1211859f7 100644 --- a/include/linux/mfd/wm831x/core.h +++ b/include/linux/mfd/wm831x/core.h @@ -18,6 +18,7 @@  #include <linux/completion.h>  #include <linux/interrupt.h>  #include <linux/list.h> +#include <linux/regmap.h>  /*   * Register values. @@ -361,12 +362,8 @@ struct wm831x {  	struct mutex io_lock;  	struct device *dev; -	int (*read_dev)(struct wm831x *wm831x, unsigned short reg, -			int bytes, void *dest); -	int (*write_dev)(struct wm831x *wm831x, unsigned short reg, -			 int bytes, void *src); -	void *control_data; +	struct regmap *regmap;  	int irq;  /* Our chip IRQ */  	struct mutex irq_lock; @@ -374,6 +371,8 @@ struct wm831x {  	int irq_masks_cur[WM831X_NUM_IRQ_REGS];   /* Currently active value */  	int irq_masks_cache[WM831X_NUM_IRQ_REGS]; /* Cached hardware value */ +	bool soft_shutdown; +  	/* Chip revision based flags */  	unsigned has_gpio_ena:1;         /* Has GPIO enable bit */  	unsigned has_cs_sts:1;           /* Has current sink status bit */ @@ -383,6 +382,7 @@ struct wm831x {  	/* Used by the interrupt controller code to post writes */  	int gpio_update[WM831X_NUM_GPIO_REGS]; +	bool gpio_level[WM831X_NUM_GPIO_REGS];  	struct mutex auxadc_lock;  	struct list_head auxadc_pending; @@ -412,8 +412,11 @@ int wm831x_bulk_read(struct wm831x *wm831x, unsigned short reg,  int wm831x_device_init(struct wm831x *wm831x, unsigned long id, int irq);  void wm831x_device_exit(struct wm831x *wm831x);  int wm831x_device_suspend(struct wm831x *wm831x); +void wm831x_device_shutdown(struct wm831x *wm831x);  int wm831x_irq_init(struct wm831x *wm831x, int irq);  void wm831x_irq_exit(struct wm831x *wm831x);  void wm831x_auxadc_init(struct wm831x *wm831x); +extern struct regmap_config wm831x_regmap_config; +  #endif diff --git a/include/linux/mfd/wm831x/pdata.h b/include/linux/mfd/wm831x/pdata.h index 0ba24599fe5..1d7a3f7b3b5 100644 --- a/include/linux/mfd/wm831x/pdata.h +++ b/include/linux/mfd/wm831x/pdata.h @@ -123,6 +123,9 @@ struct wm831x_pdata {  	/** Disable the touchscreen */  	bool disable_touch; +	/** The driver should initiate a power off sequence during shutdown */ +	bool soft_shutdown; +  	int irq_base;  	int gpio_base;  	int gpio_defaults[WM831X_GPIO_NUM]; diff --git a/include/linux/mfd/wm8400-private.h b/include/linux/mfd/wm8400-private.h index 2aab4e93a5c..0147b696851 100644 --- a/include/linux/mfd/wm8400-private.h +++ b/include/linux/mfd/wm8400-private.h @@ -25,16 +25,15 @@  #include <linux/mutex.h>  #include <linux/platform_device.h> +struct regmap; +  #define WM8400_REGISTER_COUNT 0x55  struct wm8400 {  	struct device *dev; -	int (*read_dev)(void *data, char reg, int count, u16 *dst); -	int (*write_dev)(void *data, char reg, int count, const u16 *src); -  	struct mutex io_lock; -	void *io_data; +	struct regmap *regmap;  	u16 reg_cache[WM8400_REGISTER_COUNT]; diff --git a/include/linux/mfd/wm8994/core.h b/include/linux/mfd/wm8994/core.h index f0b69cdae41..f44bdb7273b 100644 --- a/include/linux/mfd/wm8994/core.h +++ b/include/linux/mfd/wm8994/core.h @@ -20,10 +20,12 @@  enum wm8994_type {  	WM8994 = 0,  	WM8958 = 1, +	WM1811 = 2,  };  struct regulator_dev;  struct regulator_bulk_data; +struct regmap;  #define WM8994_NUM_GPIO_REGS 11  #define WM8994_NUM_LDO_REGS   2 @@ -50,18 +52,14 @@ struct regulator_bulk_data;  #define WM8994_IRQ_GPIO(x) (x + WM8994_IRQ_TEMP_WARN)  struct wm8994 { -	struct mutex io_lock;  	struct mutex irq_lock;  	enum wm8994_type type;  	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, const void *src); +	struct regmap *regmap; -	void *control_data; +	bool ldo_ena_always_driven;  	int gpio_base;  	int irq_base; diff --git a/include/linux/mfd/wm8994/pdata.h b/include/linux/mfd/wm8994/pdata.h index 97cf4f27d64..ea32f306dca 100644 --- a/include/linux/mfd/wm8994/pdata.h +++ b/include/linux/mfd/wm8994/pdata.h @@ -167,6 +167,13 @@ struct wm8994_pdata {  	/* WM8958 microphone bias configuration */  	int micbias[2]; + +	/* Disable the internal pull downs on the LDOs if they are +	 * always driven (eg, connected to an always on supply or +	 * GPIO that always drives an output.  If they float power +	 * consumption will rise. +	 */ +	bool ldo_ena_always_driven;  };  #endif diff --git a/include/linux/mfd/wm8994/registers.h b/include/linux/mfd/wm8994/registers.h index f3ee8428467..fae295048a8 100644 --- a/include/linux/mfd/wm8994/registers.h +++ b/include/linux/mfd/wm8994/registers.h @@ -72,6 +72,7 @@  #define WM8994_DC_SERVO_2                       0x55  #define WM8994_DC_SERVO_4                       0x57  #define WM8994_DC_SERVO_READBACK                0x58 +#define WM8994_DC_SERVO_4E			0x59  #define WM8994_ANALOGUE_HP_1                    0x60  #define WM8958_MIC_DETECT_1                     0xD0  #define WM8958_MIC_DETECT_2                     0xD1 @@ -133,6 +134,8 @@  #define WM8994_AIF1_DAC1_FILTERS_2              0x421  #define WM8994_AIF1_DAC2_FILTERS_1              0x422  #define WM8994_AIF1_DAC2_FILTERS_2              0x423 +#define WM8958_AIF1_DAC1_NOISE_GATE             0x430 +#define WM8958_AIF1_DAC2_NOISE_GATE             0x431  #define WM8994_AIF1_DRC1_1                      0x440  #define WM8994_AIF1_DRC1_2                      0x441  #define WM8994_AIF1_DRC1_3                      0x442 @@ -190,6 +193,7 @@  #define WM8994_AIF2_ADC_FILTERS                 0x510  #define WM8994_AIF2_DAC_FILTERS_1               0x520  #define WM8994_AIF2_DAC_FILTERS_2               0x521 +#define WM8958_AIF2_DAC_NOISE_GATE              0x530  #define WM8994_AIF2_DRC_1                       0x540  #define WM8994_AIF2_DRC_2                       0x541  #define WM8994_AIF2_DRC_3                       0x542 @@ -1921,6 +1925,44 @@  #define WM8994_LDO2_DISCH_WIDTH                      1  /* LDO2_DISCH */  /* + * R61 (0x3D) - MICBIAS1 + */ +#define WM8958_MICB1_RATE                       0x0020  /* MICB1_RATE */ +#define WM8958_MICB1_RATE_MASK                  0x0020  /* MICB1_RATE */ +#define WM8958_MICB1_RATE_SHIFT                      5  /* MICB1_RATE */ +#define WM8958_MICB1_RATE_WIDTH                      1  /* MICB1_RATE */ +#define WM8958_MICB1_MODE                       0x0010  /* MICB1_MODE */ +#define WM8958_MICB1_MODE_MASK                  0x0010  /* MICB1_MODE */ +#define WM8958_MICB1_MODE_SHIFT                      4  /* MICB1_MODE */ +#define WM8958_MICB1_MODE_WIDTH                      1  /* MICB1_MODE */ +#define WM8958_MICB1_LVL_MASK                   0x000E  /* MICB1_LVL - [3:1] */ +#define WM8958_MICB1_LVL_SHIFT                       1  /* MICB1_LVL - [3:1] */ +#define WM8958_MICB1_LVL_WIDTH                       3  /* MICB1_LVL - [3:1] */ +#define WM8958_MICB1_DISCH                      0x0001  /* MICB1_DISCH */ +#define WM8958_MICB1_DISCH_MASK                 0x0001  /* MICB1_DISCH */ +#define WM8958_MICB1_DISCH_SHIFT                     0  /* MICB1_DISCH */ +#define WM8958_MICB1_DISCH_WIDTH                     1  /* MICB1_DISCH */ + +/* + * R62 (0x3E) - MICBIAS2 + */ +#define WM8958_MICB2_RATE                       0x0020  /* MICB2_RATE */ +#define WM8958_MICB2_RATE_MASK                  0x0020  /* MICB2_RATE */ +#define WM8958_MICB2_RATE_SHIFT                      5  /* MICB2_RATE */ +#define WM8958_MICB2_RATE_WIDTH                      1  /* MICB2_RATE */ +#define WM8958_MICB2_MODE                       0x0010  /* MICB2_MODE */ +#define WM8958_MICB2_MODE_MASK                  0x0010  /* MICB2_MODE */ +#define WM8958_MICB2_MODE_SHIFT                      4  /* MICB2_MODE */ +#define WM8958_MICB2_MODE_WIDTH                      1  /* MICB2_MODE */ +#define WM8958_MICB2_LVL_MASK                   0x000E  /* MICB2_LVL - [3:1] */ +#define WM8958_MICB2_LVL_SHIFT                       1  /* MICB2_LVL - [3:1] */ +#define WM8958_MICB2_LVL_WIDTH                       3  /* MICB2_LVL - [3:1] */ +#define WM8958_MICB2_DISCH                      0x0001  /* MICB2_DISCH */ +#define WM8958_MICB2_DISCH_MASK                 0x0001  /* MICB2_DISCH */ +#define WM8958_MICB2_DISCH_SHIFT                     0  /* MICB2_DISCH */ +#define WM8958_MICB2_DISCH_WIDTH                     1  /* MICB2_DISCH */ + +/*   * R76 (0x4C) - Charge Pump (1)   */  #define WM8994_CP_ENA                           0x8000  /* CP_ENA */ @@ -2027,6 +2069,10 @@  /*   * R96 (0x60) - Analogue HP (1)   */ +#define WM1811_HPOUT1_ATTN                      0x0100  /* HPOUT1_ATTN */ +#define WM1811_HPOUT1_ATTN_MASK                 0x0100  /* HPOUT1_ATTN */ +#define WM1811_HPOUT1_ATTN_SHIFT                     8  /* HPOUT1_ATTN */ +#define WM1811_HPOUT1_ATTN_WIDTH                     1  /* HPOUT1_ATTN */  #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 */ @@ -2949,6 +2995,34 @@  #define WM8994_AIF1DAC2_3D_ENA_WIDTH                 1  /* AIF1DAC2_3D_ENA */  /* + * R1072 (0x430) - AIF1 DAC1 Noise Gate + */ +#define WM8958_AIF1DAC1_NG_HLD_MASK             0x0060  /* AIF1DAC1_NG_HLD - [6:5] */ +#define WM8958_AIF1DAC1_NG_HLD_SHIFT                 5  /* AIF1DAC1_NG_HLD - [6:5] */ +#define WM8958_AIF1DAC1_NG_HLD_WIDTH                 2  /* AIF1DAC1_NG_HLD - [6:5] */ +#define WM8958_AIF1DAC1_NG_THR_MASK             0x000E  /* AIF1DAC1_NG_THR - [3:1] */ +#define WM8958_AIF1DAC1_NG_THR_SHIFT                 1  /* AIF1DAC1_NG_THR - [3:1] */ +#define WM8958_AIF1DAC1_NG_THR_WIDTH                 3  /* AIF1DAC1_NG_THR - [3:1] */ +#define WM8958_AIF1DAC1_NG_ENA                  0x0001  /* AIF1DAC1_NG_ENA */ +#define WM8958_AIF1DAC1_NG_ENA_MASK             0x0001  /* AIF1DAC1_NG_ENA */ +#define WM8958_AIF1DAC1_NG_ENA_SHIFT                 0  /* AIF1DAC1_NG_ENA */ +#define WM8958_AIF1DAC1_NG_ENA_WIDTH                 1  /* AIF1DAC1_NG_ENA */ + +/* + * R1073 (0x431) - AIF1 DAC2 Noise Gate + */ +#define WM8958_AIF1DAC2_NG_HLD_MASK             0x0060  /* AIF1DAC2_NG_HLD - [6:5] */ +#define WM8958_AIF1DAC2_NG_HLD_SHIFT                 5  /* AIF1DAC2_NG_HLD - [6:5] */ +#define WM8958_AIF1DAC2_NG_HLD_WIDTH                 2  /* AIF1DAC2_NG_HLD - [6:5] */ +#define WM8958_AIF1DAC2_NG_THR_MASK             0x000E  /* AIF1DAC2_NG_THR - [3:1] */ +#define WM8958_AIF1DAC2_NG_THR_SHIFT                 1  /* AIF1DAC2_NG_THR - [3:1] */ +#define WM8958_AIF1DAC2_NG_THR_WIDTH                 3  /* AIF1DAC2_NG_THR - [3:1] */ +#define WM8958_AIF1DAC2_NG_ENA                  0x0001  /* AIF1DAC2_NG_ENA */ +#define WM8958_AIF1DAC2_NG_ENA_MASK             0x0001  /* AIF1DAC2_NG_ENA */ +#define WM8958_AIF1DAC2_NG_ENA_SHIFT                 0  /* AIF1DAC2_NG_ENA */ +#define WM8958_AIF1DAC2_NG_ENA_WIDTH                 1  /* AIF1DAC2_NG_ENA */ + +/*   * R1088 (0x440) - AIF1 DRC1 (1)   */  #define WM8994_AIF1DRC1_SIG_DET_RMS_MASK        0xF800  /* AIF1DRC1_SIG_DET_RMS - [15:11] */ @@ -3560,6 +3634,20 @@  #define WM8994_AIF2DAC_3D_ENA_WIDTH                  1  /* AIF2DAC_3D_ENA */  /* + * R1328 (0x530) - AIF2 DAC Noise Gate + */ +#define WM8958_AIF2DAC_NG_HLD_MASK              0x0060  /* AIF2DAC_NG_HLD - [6:5] */ +#define WM8958_AIF2DAC_NG_HLD_SHIFT                  5  /* AIF2DAC_NG_HLD - [6:5] */ +#define WM8958_AIF2DAC_NG_HLD_WIDTH                  2  /* AIF2DAC_NG_HLD - [6:5] */ +#define WM8958_AIF2DAC_NG_THR_MASK              0x000E  /* AIF2DAC_NG_THR - [3:1] */ +#define WM8958_AIF2DAC_NG_THR_SHIFT                  1  /* AIF2DAC_NG_THR - [3:1] */ +#define WM8958_AIF2DAC_NG_THR_WIDTH                  3  /* AIF2DAC_NG_THR - [3:1] */ +#define WM8958_AIF2DAC_NG_ENA                   0x0001  /* AIF2DAC_NG_ENA */ +#define WM8958_AIF2DAC_NG_ENA_MASK              0x0001  /* AIF2DAC_NG_ENA */ +#define WM8958_AIF2DAC_NG_ENA_SHIFT                  0  /* AIF2DAC_NG_ENA */ +#define WM8958_AIF2DAC_NG_ENA_WIDTH                  1  /* AIF2DAC_NG_ENA */ + +/*   * R1344 (0x540) - AIF2 DRC (1)   */  #define WM8994_AIF2DRC_SIG_DET_RMS_MASK         0xF800  /* AIF2DRC_SIG_DET_RMS - [15:11] */ diff --git a/include/linux/mii.h b/include/linux/mii.h index 103113a2fd1..27748230aa6 100644 --- a/include/linux/mii.h +++ b/include/linux/mii.h @@ -11,131 +11,130 @@  #include <linux/types.h>  /* Generic MII registers. */ - -#define MII_BMCR            0x00        /* Basic mode control register */ -#define MII_BMSR            0x01        /* Basic mode status register  */ -#define MII_PHYSID1         0x02        /* PHYS ID 1                   */ -#define MII_PHYSID2         0x03        /* PHYS ID 2                   */ -#define MII_ADVERTISE       0x04        /* Advertisement control reg   */ -#define MII_LPA             0x05        /* Link partner ability reg    */ -#define MII_EXPANSION       0x06        /* Expansion register          */ -#define MII_CTRL1000        0x09        /* 1000BASE-T control          */ -#define MII_STAT1000        0x0a        /* 1000BASE-T status           */ -#define MII_ESTATUS	    0x0f	/* Extended Status */ -#define MII_DCOUNTER        0x12        /* Disconnect counter          */ -#define MII_FCSCOUNTER      0x13        /* False carrier counter       */ -#define MII_NWAYTEST        0x14        /* N-way auto-neg test reg     */ -#define MII_RERRCOUNTER     0x15        /* Receive error counter       */ -#define MII_SREVISION       0x16        /* Silicon revision            */ -#define MII_RESV1           0x17        /* Reserved...                 */ -#define MII_LBRERROR        0x18        /* Lpback, rx, bypass error    */ -#define MII_PHYADDR         0x19        /* PHY address                 */ -#define MII_RESV2           0x1a        /* Reserved...                 */ -#define MII_TPISTATUS       0x1b        /* TPI status for 10mbps       */ -#define MII_NCONFIG         0x1c        /* Network interface config    */ +#define MII_BMCR		0x00	/* Basic mode control register */ +#define MII_BMSR		0x01	/* Basic mode status register  */ +#define MII_PHYSID1		0x02	/* PHYS ID 1                   */ +#define MII_PHYSID2		0x03	/* PHYS ID 2                   */ +#define MII_ADVERTISE		0x04	/* Advertisement control reg   */ +#define MII_LPA			0x05	/* Link partner ability reg    */ +#define MII_EXPANSION		0x06	/* Expansion register          */ +#define MII_CTRL1000		0x09	/* 1000BASE-T control          */ +#define MII_STAT1000		0x0a	/* 1000BASE-T status           */ +#define MII_ESTATUS		0x0f	/* Extended Status             */ +#define MII_DCOUNTER		0x12	/* Disconnect counter          */ +#define MII_FCSCOUNTER		0x13	/* False carrier counter       */ +#define MII_NWAYTEST		0x14	/* N-way auto-neg test reg     */ +#define MII_RERRCOUNTER		0x15	/* Receive error counter       */ +#define MII_SREVISION		0x16	/* Silicon revision            */ +#define MII_RESV1		0x17	/* Reserved...                 */ +#define MII_LBRERROR		0x18	/* Lpback, rx, bypass error    */ +#define MII_PHYADDR		0x19	/* PHY address                 */ +#define MII_RESV2		0x1a	/* Reserved...                 */ +#define MII_TPISTATUS		0x1b	/* TPI status for 10mbps       */ +#define MII_NCONFIG		0x1c	/* Network interface config    */  /* Basic mode control register. */ -#define BMCR_RESV               0x003f  /* Unused...                   */ -#define BMCR_SPEED1000		0x0040  /* MSB of Speed (1000)         */ -#define BMCR_CTST               0x0080  /* Collision test              */ -#define BMCR_FULLDPLX           0x0100  /* Full duplex                 */ -#define BMCR_ANRESTART          0x0200  /* Auto negotiation restart    */ -#define BMCR_ISOLATE            0x0400  /* Disconnect DP83840 from MII */ -#define BMCR_PDOWN              0x0800  /* Powerdown the DP83840       */ -#define BMCR_ANENABLE           0x1000  /* Enable auto negotiation     */ -#define BMCR_SPEED100           0x2000  /* Select 100Mbps              */ -#define BMCR_LOOPBACK           0x4000  /* TXD loopback bits           */ -#define BMCR_RESET              0x8000  /* Reset the DP83840           */ +#define BMCR_RESV		0x003f	/* Unused...                   */ +#define BMCR_SPEED1000		0x0040	/* MSB of Speed (1000)         */ +#define BMCR_CTST		0x0080	/* Collision test              */ +#define BMCR_FULLDPLX		0x0100	/* Full duplex                 */ +#define BMCR_ANRESTART		0x0200	/* Auto negotiation restart    */ +#define BMCR_ISOLATE		0x0400	/* Isolate data paths from MII */ +#define BMCR_PDOWN		0x0800	/* Enable low power state      */ +#define BMCR_ANENABLE		0x1000	/* Enable auto negotiation     */ +#define BMCR_SPEED100		0x2000	/* Select 100Mbps              */ +#define BMCR_LOOPBACK		0x4000	/* TXD loopback bits           */ +#define BMCR_RESET		0x8000	/* Reset to default state      */  /* Basic mode status register. */ -#define BMSR_ERCAP              0x0001  /* Ext-reg capability          */ -#define BMSR_JCD                0x0002  /* Jabber detected             */ -#define BMSR_LSTATUS            0x0004  /* Link status                 */ -#define BMSR_ANEGCAPABLE        0x0008  /* Able to do auto-negotiation */ -#define BMSR_RFAULT             0x0010  /* Remote fault detected       */ -#define BMSR_ANEGCOMPLETE       0x0020  /* Auto-negotiation complete   */ -#define BMSR_RESV               0x00c0  /* Unused...                   */ -#define BMSR_ESTATEN		0x0100	/* Extended Status in R15 */ -#define BMSR_100HALF2           0x0200  /* Can do 100BASE-T2 HDX */ -#define BMSR_100FULL2           0x0400  /* Can do 100BASE-T2 FDX */ -#define BMSR_10HALF             0x0800  /* Can do 10mbps, half-duplex  */ -#define BMSR_10FULL             0x1000  /* Can do 10mbps, full-duplex  */ -#define BMSR_100HALF            0x2000  /* Can do 100mbps, half-duplex */ -#define BMSR_100FULL            0x4000  /* Can do 100mbps, full-duplex */ -#define BMSR_100BASE4           0x8000  /* Can do 100mbps, 4k packets  */ +#define BMSR_ERCAP		0x0001	/* Ext-reg capability          */ +#define BMSR_JCD		0x0002	/* Jabber detected             */ +#define BMSR_LSTATUS		0x0004	/* Link status                 */ +#define BMSR_ANEGCAPABLE	0x0008	/* Able to do auto-negotiation */ +#define BMSR_RFAULT		0x0010	/* Remote fault detected       */ +#define BMSR_ANEGCOMPLETE	0x0020	/* Auto-negotiation complete   */ +#define BMSR_RESV		0x00c0	/* Unused...                   */ +#define BMSR_ESTATEN		0x0100	/* Extended Status in R15      */ +#define BMSR_100HALF2		0x0200	/* Can do 100BASE-T2 HDX       */ +#define BMSR_100FULL2		0x0400	/* Can do 100BASE-T2 FDX       */ +#define BMSR_10HALF		0x0800	/* Can do 10mbps, half-duplex  */ +#define BMSR_10FULL		0x1000	/* Can do 10mbps, full-duplex  */ +#define BMSR_100HALF		0x2000	/* Can do 100mbps, half-duplex */ +#define BMSR_100FULL		0x4000	/* Can do 100mbps, full-duplex */ +#define BMSR_100BASE4		0x8000	/* Can do 100mbps, 4k packets  */  /* Advertisement control register. */ -#define ADVERTISE_SLCT          0x001f  /* Selector bits               */ -#define ADVERTISE_CSMA          0x0001  /* Only selector supported     */ -#define ADVERTISE_10HALF        0x0020  /* Try for 10mbps half-duplex  */ -#define ADVERTISE_1000XFULL     0x0020  /* Try for 1000BASE-X full-duplex */ -#define ADVERTISE_10FULL        0x0040  /* Try for 10mbps full-duplex  */ -#define ADVERTISE_1000XHALF     0x0040  /* Try for 1000BASE-X half-duplex */ -#define ADVERTISE_100HALF       0x0080  /* Try for 100mbps half-duplex */ -#define ADVERTISE_1000XPAUSE    0x0080  /* Try for 1000BASE-X pause    */ -#define ADVERTISE_100FULL       0x0100  /* Try for 100mbps full-duplex */ -#define ADVERTISE_1000XPSE_ASYM 0x0100  /* Try for 1000BASE-X asym pause */ -#define ADVERTISE_100BASE4      0x0200  /* Try for 100mbps 4k packets  */ -#define ADVERTISE_PAUSE_CAP     0x0400  /* Try for pause               */ -#define ADVERTISE_PAUSE_ASYM    0x0800  /* Try for asymetric pause     */ -#define ADVERTISE_RESV          0x1000  /* Unused...                   */ -#define ADVERTISE_RFAULT        0x2000  /* Say we can detect faults    */ -#define ADVERTISE_LPACK         0x4000  /* Ack link partners response  */ -#define ADVERTISE_NPAGE         0x8000  /* Next page bit               */ +#define ADVERTISE_SLCT		0x001f	/* Selector bits               */ +#define ADVERTISE_CSMA		0x0001	/* Only selector supported     */ +#define ADVERTISE_10HALF	0x0020	/* Try for 10mbps half-duplex  */ +#define ADVERTISE_1000XFULL	0x0020	/* Try for 1000BASE-X full-duplex */ +#define ADVERTISE_10FULL	0x0040	/* Try for 10mbps full-duplex  */ +#define ADVERTISE_1000XHALF	0x0040	/* Try for 1000BASE-X half-duplex */ +#define ADVERTISE_100HALF	0x0080	/* Try for 100mbps half-duplex */ +#define ADVERTISE_1000XPAUSE	0x0080	/* Try for 1000BASE-X pause    */ +#define ADVERTISE_100FULL	0x0100	/* Try for 100mbps full-duplex */ +#define ADVERTISE_1000XPSE_ASYM	0x0100	/* Try for 1000BASE-X asym pause */ +#define ADVERTISE_100BASE4	0x0200	/* Try for 100mbps 4k packets  */ +#define ADVERTISE_PAUSE_CAP	0x0400	/* Try for pause               */ +#define ADVERTISE_PAUSE_ASYM	0x0800	/* Try for asymetric pause     */ +#define ADVERTISE_RESV		0x1000	/* Unused...                   */ +#define ADVERTISE_RFAULT	0x2000	/* Say we can detect faults    */ +#define ADVERTISE_LPACK		0x4000	/* Ack link partners response  */ +#define ADVERTISE_NPAGE		0x8000	/* Next page bit               */ -#define ADVERTISE_FULL (ADVERTISE_100FULL | ADVERTISE_10FULL | \ -			ADVERTISE_CSMA) -#define ADVERTISE_ALL (ADVERTISE_10HALF | ADVERTISE_10FULL | \ -                       ADVERTISE_100HALF | ADVERTISE_100FULL) +#define ADVERTISE_FULL		(ADVERTISE_100FULL | ADVERTISE_10FULL | \ +				  ADVERTISE_CSMA) +#define ADVERTISE_ALL		(ADVERTISE_10HALF | ADVERTISE_10FULL | \ +				  ADVERTISE_100HALF | ADVERTISE_100FULL)  /* Link partner ability register. */ -#define LPA_SLCT                0x001f  /* Same as advertise selector  */ -#define LPA_10HALF              0x0020  /* Can do 10mbps half-duplex   */ -#define LPA_1000XFULL           0x0020  /* Can do 1000BASE-X full-duplex */ -#define LPA_10FULL              0x0040  /* Can do 10mbps full-duplex   */ -#define LPA_1000XHALF           0x0040  /* Can do 1000BASE-X half-duplex */ -#define LPA_100HALF             0x0080  /* Can do 100mbps half-duplex  */ -#define LPA_1000XPAUSE          0x0080  /* Can do 1000BASE-X pause     */ -#define LPA_100FULL             0x0100  /* Can do 100mbps full-duplex  */ -#define LPA_1000XPAUSE_ASYM     0x0100  /* Can do 1000BASE-X pause asym*/ -#define LPA_100BASE4            0x0200  /* Can do 100mbps 4k packets   */ -#define LPA_PAUSE_CAP           0x0400  /* Can pause                   */ -#define LPA_PAUSE_ASYM          0x0800  /* Can pause asymetrically     */ -#define LPA_RESV                0x1000  /* Unused...                   */ -#define LPA_RFAULT              0x2000  /* Link partner faulted        */ -#define LPA_LPACK               0x4000  /* Link partner acked us       */ -#define LPA_NPAGE               0x8000  /* Next page bit               */ +#define LPA_SLCT		0x001f	/* Same as advertise selector  */ +#define LPA_10HALF		0x0020	/* Can do 10mbps half-duplex   */ +#define LPA_1000XFULL		0x0020	/* Can do 1000BASE-X full-duplex */ +#define LPA_10FULL		0x0040	/* Can do 10mbps full-duplex   */ +#define LPA_1000XHALF		0x0040	/* Can do 1000BASE-X half-duplex */ +#define LPA_100HALF		0x0080	/* Can do 100mbps half-duplex  */ +#define LPA_1000XPAUSE		0x0080	/* Can do 1000BASE-X pause     */ +#define LPA_100FULL		0x0100	/* Can do 100mbps full-duplex  */ +#define LPA_1000XPAUSE_ASYM	0x0100	/* Can do 1000BASE-X pause asym*/ +#define LPA_100BASE4		0x0200	/* Can do 100mbps 4k packets   */ +#define LPA_PAUSE_CAP		0x0400	/* Can pause                   */ +#define LPA_PAUSE_ASYM		0x0800	/* Can pause asymetrically     */ +#define LPA_RESV		0x1000	/* Unused...                   */ +#define LPA_RFAULT		0x2000	/* Link partner faulted        */ +#define LPA_LPACK		0x4000	/* Link partner acked us       */ +#define LPA_NPAGE		0x8000	/* Next page bit               */  #define LPA_DUPLEX		(LPA_10FULL | LPA_100FULL)  #define LPA_100			(LPA_100FULL | LPA_100HALF | LPA_100BASE4)  /* Expansion register for auto-negotiation. */ -#define EXPANSION_NWAY          0x0001  /* Can do N-way auto-nego      */ -#define EXPANSION_LCWP          0x0002  /* Got new RX page code word   */ -#define EXPANSION_ENABLENPAGE   0x0004  /* This enables npage words    */ -#define EXPANSION_NPCAPABLE     0x0008  /* Link partner supports npage */ -#define EXPANSION_MFAULTS       0x0010  /* Multiple faults detected    */ -#define EXPANSION_RESV          0xffe0  /* Unused...                   */ +#define EXPANSION_NWAY		0x0001	/* Can do N-way auto-nego      */ +#define EXPANSION_LCWP		0x0002	/* Got new RX page code word   */ +#define EXPANSION_ENABLENPAGE	0x0004	/* This enables npage words    */ +#define EXPANSION_NPCAPABLE	0x0008	/* Link partner supports npage */ +#define EXPANSION_MFAULTS	0x0010	/* Multiple faults detected    */ +#define EXPANSION_RESV		0xffe0	/* Unused...                   */ -#define ESTATUS_1000_TFULL	0x2000	/* Can do 1000BT Full */ -#define ESTATUS_1000_THALF	0x1000	/* Can do 1000BT Half */ +#define ESTATUS_1000_TFULL	0x2000	/* Can do 1000BT Full          */ +#define ESTATUS_1000_THALF	0x1000	/* Can do 1000BT Half          */  /* N-way test register. */ -#define NWAYTEST_RESV1          0x00ff  /* Unused...                   */ -#define NWAYTEST_LOOPBACK       0x0100  /* Enable loopback for N-way   */ -#define NWAYTEST_RESV2          0xfe00  /* Unused...                   */ +#define NWAYTEST_RESV1		0x00ff	/* Unused...                   */ +#define NWAYTEST_LOOPBACK	0x0100	/* Enable loopback for N-way   */ +#define NWAYTEST_RESV2		0xfe00	/* Unused...                   */  /* 1000BASE-T Control register */ -#define ADVERTISE_1000FULL      0x0200  /* Advertise 1000BASE-T full duplex */ -#define ADVERTISE_1000HALF      0x0100  /* Advertise 1000BASE-T half duplex */ +#define ADVERTISE_1000FULL	0x0200  /* Advertise 1000BASE-T full duplex */ +#define ADVERTISE_1000HALF	0x0100  /* Advertise 1000BASE-T half duplex */  #define CTL1000_AS_MASTER	0x0800  #define CTL1000_ENABLE_MASTER	0x1000  /* 1000BASE-T Status register */ -#define LPA_1000LOCALRXOK       0x2000  /* Link partner local receiver status */ -#define LPA_1000REMRXOK         0x1000  /* Link partner remote receiver status */ -#define LPA_1000FULL            0x0800  /* Link partner 1000BASE-T full duplex */ -#define LPA_1000HALF            0x0400  /* Link partner 1000BASE-T half duplex */ +#define LPA_1000LOCALRXOK	0x2000	/* Link partner local receiver status */ +#define LPA_1000REMRXOK		0x1000	/* Link partner remote receiver status */ +#define LPA_1000FULL		0x0800	/* Link partner 1000BASE-T full duplex */ +#define LPA_1000HALF		0x0400	/* Link partner 1000BASE-T half duplex */  /* Flow control flags */  #define FLOW_CTRL_TX		0x01 @@ -149,7 +148,7 @@ struct mii_ioctl_data {  	__u16		val_out;  }; -#ifdef __KERNEL__  +#ifdef __KERNEL__  #include <linux/if.h> @@ -180,7 +179,7 @@ extern unsigned int mii_check_media (struct mii_if_info *mii,  				     unsigned int ok_to_print,  				     unsigned int init_media);  extern int generic_mii_ioctl(struct mii_if_info *mii_if, -                      	     struct mii_ioctl_data *mii_data, int cmd, +			     struct mii_ioctl_data *mii_data, int cmd,  			     unsigned int *duplex_changed); @@ -189,7 +188,6 @@ static inline struct mii_ioctl_data *if_mii(struct ifreq *rq)  	return (struct mii_ioctl_data *) &rq->ifr_ifru;  } -  /**   * mii_nway_result   * @negotiated: value of MII ANAR and'd with ANLPAR diff --git a/include/linux/mlx4/device.h b/include/linux/mlx4/device.h index 53ef894bfa0..84b0b1848f1 100644 --- a/include/linux/mlx4/device.h +++ b/include/linux/mlx4/device.h @@ -61,6 +61,7 @@ enum {  	MLX4_DEV_CAP_FLAG_RC		= 1LL <<  0,  	MLX4_DEV_CAP_FLAG_UC		= 1LL <<  1,  	MLX4_DEV_CAP_FLAG_UD		= 1LL <<  2, +	MLX4_DEV_CAP_FLAG_XRC		= 1LL <<  3,  	MLX4_DEV_CAP_FLAG_SRQ		= 1LL <<  6,  	MLX4_DEV_CAP_FLAG_IPOIB_CSUM	= 1LL <<  7,  	MLX4_DEV_CAP_FLAG_BAD_PKEY_CNTR	= 1LL <<  8, @@ -75,6 +76,7 @@ enum {  	MLX4_DEV_CAP_FLAG_UD_MCAST	= 1LL << 21,  	MLX4_DEV_CAP_FLAG_IBOE		= 1LL << 30,  	MLX4_DEV_CAP_FLAG_UC_LOOPBACK	= 1LL << 32, +	MLX4_DEV_CAP_FLAG_FCS_KEEP	= 1LL << 34,  	MLX4_DEV_CAP_FLAG_WOL		= 1LL << 38,  	MLX4_DEV_CAP_FLAG_UDP_RSS	= 1LL << 40,  	MLX4_DEV_CAP_FLAG_VEP_UC_STEER	= 1LL << 41, @@ -82,6 +84,12 @@ enum {  	MLX4_DEV_CAP_FLAG_COUNTERS	= 1LL << 48  }; +#define MLX4_ATTR_EXTENDED_PORT_INFO	cpu_to_be16(0xff90) + +enum { +	MLX_EXT_PORT_CAP_FLAG_EXTENDED_PORT_INFO	= 1 <<  0 +}; +  enum {  	MLX4_BMME_FLAG_LOCAL_INV	= 1 <<  6,  	MLX4_BMME_FLAG_REMOTE_INV	= 1 <<  7, @@ -256,6 +264,8 @@ struct mlx4_caps {  	int			num_qp_per_mgm;  	int			num_pds;  	int			reserved_pds; +	int			max_xrcds; +	int			reserved_xrcds;  	int			mtt_entry_sz;  	u32			max_msg_sz;  	u32			page_size_cap; @@ -276,6 +286,7 @@ struct mlx4_caps {  	u32			port_mask;  	enum mlx4_port_type	possible_type[MLX4_MAX_PORTS + 1];  	u32			max_counters; +	u8			ext_port_cap[MLX4_MAX_PORTS + 1];  };  struct mlx4_buf_list { @@ -499,6 +510,8 @@ static inline void *mlx4_buf_offset(struct mlx4_buf *buf, int offset)  int mlx4_pd_alloc(struct mlx4_dev *dev, u32 *pdn);  void mlx4_pd_free(struct mlx4_dev *dev, u32 pdn); +int mlx4_xrcd_alloc(struct mlx4_dev *dev, u32 *xrcdn); +void mlx4_xrcd_free(struct mlx4_dev *dev, u32 xrcdn);  int mlx4_uar_alloc(struct mlx4_dev *dev, struct mlx4_uar *uar);  void mlx4_uar_free(struct mlx4_dev *dev, struct mlx4_uar *uar); @@ -538,8 +551,8 @@ void mlx4_qp_release_range(struct mlx4_dev *dev, int base_qpn, int cnt);  int mlx4_qp_alloc(struct mlx4_dev *dev, int qpn, struct mlx4_qp *qp);  void mlx4_qp_free(struct mlx4_dev *dev, struct mlx4_qp *qp); -int mlx4_srq_alloc(struct mlx4_dev *dev, u32 pdn, struct mlx4_mtt *mtt, -		   u64 db_rec, struct mlx4_srq *srq); +int mlx4_srq_alloc(struct mlx4_dev *dev, u32 pdn, u32 cqn, u16 xrcdn, +		   struct mlx4_mtt *mtt, u64 db_rec, struct mlx4_srq *srq);  void mlx4_srq_free(struct mlx4_dev *dev, struct mlx4_srq *srq);  int mlx4_srq_arm(struct mlx4_dev *dev, struct mlx4_srq *srq, int limit_watermark);  int mlx4_srq_query(struct mlx4_dev *dev, struct mlx4_srq *srq, int *limit_watermark); diff --git a/include/linux/mlx4/qp.h b/include/linux/mlx4/qp.h index 4001c8249db..48cc4cb9785 100644 --- a/include/linux/mlx4/qp.h +++ b/include/linux/mlx4/qp.h @@ -75,6 +75,7 @@ enum {  	MLX4_QP_ST_UC				= 0x1,  	MLX4_QP_ST_RD				= 0x2,  	MLX4_QP_ST_UD				= 0x3, +	MLX4_QP_ST_XRC				= 0x6,  	MLX4_QP_ST_MLX				= 0x7  }; @@ -137,7 +138,7 @@ struct mlx4_qp_context {  	__be32			ssn;  	__be32			params2;  	__be32			rnr_nextrecvpsn; -	__be32			srcd; +	__be32			xrcd;  	__be32			cqn_recv;  	__be64			db_rec_addr;  	__be32			qkey; diff --git a/include/linux/mm.h b/include/linux/mm.h index 7438071b44a..3dc3a8c2c48 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -356,36 +356,50 @@ static inline struct page *compound_head(struct page *page)  	return page;  } +/* + * The atomic page->_mapcount, starts from -1: so that transitions + * both from it and to it can be tracked, using atomic_inc_and_test + * and atomic_add_negative(-1). + */ +static inline void reset_page_mapcount(struct page *page) +{ +	atomic_set(&(page)->_mapcount, -1); +} + +static inline int page_mapcount(struct page *page) +{ +	return atomic_read(&(page)->_mapcount) + 1; +} +  static inline int page_count(struct page *page)  {  	return atomic_read(&compound_head(page)->_count);  } +static inline void get_huge_page_tail(struct page *page) +{ +	/* +	 * __split_huge_page_refcount() cannot run +	 * from under us. +	 */ +	VM_BUG_ON(page_mapcount(page) < 0); +	VM_BUG_ON(atomic_read(&page->_count) != 0); +	atomic_inc(&page->_mapcount); +} + +extern bool __get_page_tail(struct page *page); +  static inline void get_page(struct page *page)  { +	if (unlikely(PageTail(page))) +		if (likely(__get_page_tail(page))) +			return;  	/*  	 * Getting a normal page or the head of a compound page -	 * requires to already have an elevated page->_count. Only if -	 * we're getting a tail page, the elevated page->_count is -	 * required only in the head page, so for tail pages the -	 * bugcheck only verifies that the page->_count isn't -	 * negative. +	 * requires to already have an elevated page->_count.  	 */ -	VM_BUG_ON(atomic_read(&page->_count) < !PageTail(page)); +	VM_BUG_ON(atomic_read(&page->_count) <= 0);  	atomic_inc(&page->_count); -	/* -	 * Getting a tail page will elevate both the head and tail -	 * page->_count(s). -	 */ -	if (unlikely(PageTail(page))) { -		/* -		 * This is safe only because -		 * __split_huge_page_refcount can't run under -		 * get_page(). -		 */ -		VM_BUG_ON(atomic_read(&page->first_page->_count) <= 0); -		atomic_inc(&page->first_page->_count); -	}  }  static inline struct page *virt_to_head_page(const void *x) @@ -804,21 +818,6 @@ static inline pgoff_t page_index(struct page *page)  }  /* - * The atomic page->_mapcount, like _count, starts from -1: - * so that transitions both from it and to it can be tracked, - * using atomic_inc_and_test and atomic_add_negative(-1). - */ -static inline void reset_page_mapcount(struct page *page) -{ -	atomic_set(&(page)->_mapcount, -1); -} - -static inline int page_mapcount(struct page *page) -{ -	return atomic_read(&(page)->_mapcount) + 1; -} - -/*   * Return true if this page is mapped into pagetables.   */  static inline int page_mapped(struct page *page) @@ -1334,7 +1333,8 @@ extern void si_meminfo(struct sysinfo * val);  extern void si_meminfo_node(struct sysinfo *val, int nid);  extern int after_bootmem; -extern void warn_alloc_failed(gfp_t gfp_mask, int order, const char *fmt, ...); +extern __printf(3, 4) +void warn_alloc_failed(gfp_t gfp_mask, int order, const char *fmt, ...);  extern void setup_per_cpu_pageset(void); diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h index 774b8952deb..5b42f1b34eb 100644 --- a/include/linux/mm_types.h +++ b/include/linux/mm_types.h @@ -62,10 +62,23 @@ struct page {  			struct {  				union { -					atomic_t _mapcount;	/* Count of ptes mapped in mms, -							 * to show when page is mapped -							 * & limit reverse map searches. -							 */ +					/* +					 * Count of ptes mapped in +					 * mms, to show when page is +					 * mapped & limit reverse map +					 * searches. +					 * +					 * Used also for tail pages +					 * refcounting instead of +					 * _count. Tail pages cannot +					 * be mapped and keeping the +					 * tail page _count zero at +					 * all times guarantees +					 * get_page_unless_zero() will +					 * never succeed on tail +					 * pages. +					 */ +					atomic_t _mapcount;  					struct {  						unsigned inuse:16; @@ -79,9 +92,21 @@ struct page {  	};  	/* Third double word block */ -	struct list_head lru;		/* Pageout list, eg. active_list +	union { +		struct list_head lru;	/* Pageout list, eg. active_list  					 * protected by zone->lru_lock !  					 */ +		struct {		/* slub per cpu partial pages */ +			struct page *next;	/* Next partial slab */ +#ifdef CONFIG_64BIT +			int pages;	/* Nr of partial slabs left */ +			int pobjects;	/* Approximate # of objects */ +#else +			short int pages; +			short int pobjects; +#endif +		}; +	};  	/* Remainder is not double word aligned */  	union { @@ -135,6 +160,17 @@ struct page {  #endif  ; +struct page_frag { +	struct page *page; +#if (BITS_PER_LONG > 32) || (PAGE_SIZE >= 65536) +	__u32 offset; +	__u32 size; +#else +	__u16 offset; +	__u16 size; +#endif +}; +  typedef unsigned long __nocast vm_flags_t;  /* @@ -281,8 +317,15 @@ struct mm_struct {  	unsigned long hiwater_rss;	/* High-watermark of RSS usage */  	unsigned long hiwater_vm;	/* High-water virtual memory usage */ -	unsigned long total_vm, locked_vm, shared_vm, exec_vm; -	unsigned long stack_vm, reserved_vm, def_flags, nr_ptes; +	unsigned long total_vm;		/* Total pages mapped */ +	unsigned long locked_vm;	/* Pages that have PG_mlocked set */ +	unsigned long pinned_vm;	/* Refcount permanently increased */ +	unsigned long shared_vm;	/* Shared pages (files) */ +	unsigned long exec_vm;		/* VM_EXEC & ~VM_WRITE */ +	unsigned long stack_vm;		/* VM_GROWSUP/DOWN */ +	unsigned long reserved_vm;	/* VM_RESERVED|VM_IO pages */ +	unsigned long def_flags; +	unsigned long nr_ptes;		/* Page table pages */  	unsigned long start_code, end_code, start_data, end_data;  	unsigned long start_brk, brk, start_stack;  	unsigned long arg_start, arg_end, env_start, env_end; @@ -313,9 +356,6 @@ struct mm_struct {  	unsigned int token_priority;  	unsigned int last_interval; -	/* How many tasks sharing this mm are OOM_DISABLE */ -	atomic_t oom_disable_count; -  	unsigned long flags; /* Must use atomic bitops to access the bits */  	struct core_state *core_state; /* coredumping support */ diff --git a/include/linux/mmc/card.h b/include/linux/mmc/card.h index b460fc2af8a..415f2db414e 100644 --- a/include/linux/mmc/card.h +++ b/include/linux/mmc/card.h @@ -50,8 +50,12 @@ struct mmc_ext_csd {  	u8			rel_sectors;  	u8			rel_param;  	u8			part_config; +	u8			cache_ctrl; +	u8			rst_n_function;  	unsigned int		part_time;		/* Units: ms */  	unsigned int		sa_timeout;		/* Units: 100ns */ +	unsigned int		generic_cmd6_time;	/* Units: 10ms */ +	unsigned int            power_off_longtime;     /* Units: ms */  	unsigned int		hs_max_dtr;  	unsigned int		sectors;  	unsigned int		card_type; @@ -63,11 +67,15 @@ struct mmc_ext_csd {  	bool			enhanced_area_en;	/* enable bit */  	unsigned long long	enhanced_area_offset;	/* Units: Byte */  	unsigned int		enhanced_area_size;	/* Units: KB */ -	unsigned int		boot_size;		/* in bytes */ +	unsigned int		cache_size;		/* Units: KB */ +	bool			hpi_en;			/* HPI enablebit */ +	bool			hpi;			/* HPI support bit */ +	unsigned int		hpi_cmd;		/* cmd used as HPI */  	u8			raw_partition_support;	/* 160 */  	u8			raw_erased_mem_count;	/* 181 */  	u8			raw_ext_csd_structure;	/* 194 */  	u8			raw_card_type;		/* 196 */ +	u8			out_of_int_time;	/* 198 */  	u8			raw_s_a_timeout;		/* 217 */  	u8			raw_hc_erase_gap_size;	/* 221 */  	u8			raw_erase_timeout_mult;	/* 223 */ @@ -77,6 +85,9 @@ struct mmc_ext_csd {  	u8			raw_sec_feature_support;/* 231 */  	u8			raw_trim_mult;		/* 232 */  	u8			raw_sectors[4];		/* 212 - 4 bytes */ + +	unsigned int            feature_support; +#define MMC_DISCARD_FEATURE	BIT(0)                  /* CMD38 feature */  };  struct sd_scr { @@ -157,6 +168,24 @@ struct sdio_func_tuple;  #define SDIO_MAX_FUNCS		7 +/* The number of MMC physical partitions.  These consist of: + * boot partitions (2), general purpose partitions (4) in MMC v4.4. + */ +#define MMC_NUM_BOOT_PARTITION	2 +#define MMC_NUM_GP_PARTITION	4 +#define MMC_NUM_PHY_PARTITION	6 +#define MAX_MMC_PART_NAME_LEN	20 + +/* + * MMC Physical partitions + */ +struct mmc_part { +	unsigned int	size;	/* partition size (in bytes) */ +	unsigned int	part_cfg;	/* partition type */ +	char	name[MAX_MMC_PART_NAME_LEN]; +	bool	force_ro;	/* to make boot parts RO by default */ +}; +  /*   * MMC device   */ @@ -188,6 +217,13 @@ struct mmc_card {  #define MMC_QUIRK_DISABLE_CD	(1<<5)		/* disconnect CD/DAT[3] resistor */  #define MMC_QUIRK_INAND_CMD38	(1<<6)		/* iNAND devices have broken CMD38 */  #define MMC_QUIRK_BLK_NO_CMD23	(1<<7)		/* Avoid CMD23 for regular multiblock */ +#define MMC_QUIRK_BROKEN_BYTE_MODE_512 (1<<8)	/* Avoid sending 512 bytes in */ +						/* byte mode */ +	unsigned int    poweroff_notify_state;	/* eMMC4.5 notify feature */ +#define MMC_NO_POWER_NOTIFICATION	0 +#define MMC_POWERED_ON			1 +#define MMC_POWEROFF_SHORT		2 +#define MMC_POWEROFF_LONG		3  	unsigned int		erase_size;	/* erase size in sectors */   	unsigned int		erase_shift;	/* if erase unit is power 2 */ @@ -216,9 +252,24 @@ struct mmc_card {  	unsigned int		sd_bus_speed;	/* Bus Speed Mode set for the card */  	struct dentry		*debugfs_root; +	struct mmc_part	part[MMC_NUM_PHY_PARTITION]; /* physical partitions */ +	unsigned int    nr_parts;  };  /* + * This function fill contents in mmc_part. + */ +static inline void mmc_part_add(struct mmc_card *card, unsigned int size, +			unsigned int part_cfg, char *name, int idx, bool ro) +{ +	card->part[card->nr_parts].size = size; +	card->part[card->nr_parts].part_cfg = part_cfg; +	sprintf(card->part[card->nr_parts].name, name, idx); +	card->part[card->nr_parts].force_ro = ro; +	card->nr_parts++; +} + +/*   *  The world is not perfect and supplies us with broken mmc/sdio devices.   *  For at least some of these bugs we need a work-around.   */ @@ -377,6 +428,11 @@ static inline int mmc_card_nonstd_func_interface(const struct mmc_card *c)  	return c->quirks & MMC_QUIRK_NONSTD_FUNC_IF;  } +static inline int mmc_card_broken_byte_mode_512(const struct mmc_card *c) +{ +	return c->quirks & MMC_QUIRK_BROKEN_BYTE_MODE_512; +} +  #define mmc_card_name(c)	((c)->cid.prod_name)  #define mmc_card_id(c)		(dev_name(&(c)->dev)) diff --git a/include/linux/mmc/core.h b/include/linux/mmc/core.h index b8b1b7a311f..174a844a5dd 100644 --- a/include/linux/mmc/core.h +++ b/include/linux/mmc/core.h @@ -136,6 +136,7 @@ struct mmc_async_req;  extern struct mmc_async_req *mmc_start_req(struct mmc_host *,  					   struct mmc_async_req *, int *); +extern int mmc_interrupt_hpi(struct mmc_card *);  extern void mmc_wait_for_req(struct mmc_host *, struct mmc_request *);  extern int mmc_wait_for_cmd(struct mmc_host *, struct mmc_command *, int);  extern int mmc_app_cmd(struct mmc_host *, struct mmc_card *); @@ -146,6 +147,7 @@ extern int mmc_switch(struct mmc_card *, u8, u8, u8, unsigned int);  #define MMC_ERASE_ARG		0x00000000  #define MMC_SECURE_ERASE_ARG	0x80000000  #define MMC_TRIM_ARG		0x00000001 +#define MMC_DISCARD_ARG		0x00000003  #define MMC_SECURE_TRIM1_ARG	0x80000001  #define MMC_SECURE_TRIM2_ARG	0x80008000 @@ -156,12 +158,17 @@ extern int mmc_erase(struct mmc_card *card, unsigned int from, unsigned int nr,  		     unsigned int arg);  extern int mmc_can_erase(struct mmc_card *card);  extern int mmc_can_trim(struct mmc_card *card); +extern int mmc_can_discard(struct mmc_card *card); +extern int mmc_can_sanitize(struct mmc_card *card);  extern int mmc_can_secure_erase_trim(struct mmc_card *card);  extern int mmc_erase_group_aligned(struct mmc_card *card, unsigned int from,  				   unsigned int nr);  extern unsigned int mmc_calc_max_discard(struct mmc_card *card);  extern int mmc_set_blocklen(struct mmc_card *card, unsigned int blocklen); +extern int mmc_hw_reset(struct mmc_host *host); +extern int mmc_hw_reset_check(struct mmc_host *host); +extern int mmc_can_reset(struct mmc_card *card);  extern void mmc_set_data_timeout(struct mmc_data *, const struct mmc_card *);  extern unsigned int mmc_align_data_size(struct mmc_card *, unsigned int); @@ -171,6 +178,8 @@ extern void mmc_release_host(struct mmc_host *host);  extern void mmc_do_release_host(struct mmc_host *host);  extern int mmc_try_claim_host(struct mmc_host *host); +extern int mmc_flush_cache(struct mmc_card *); +  /**   *	mmc_claim_host - exclusively claim a host   *	@host: mmc host to claim diff --git a/include/linux/mmc/dw_mmc.h b/include/linux/mmc/dw_mmc.h index 6b46819705d..6dc9b80568a 100644 --- a/include/linux/mmc/dw_mmc.h +++ b/include/linux/mmc/dw_mmc.h @@ -72,6 +72,8 @@ struct mmc_data;   *	rate and timeout calculations.   * @current_speed: Configured rate of the controller.   * @num_slots: Number of slots available. + * @verid: Denote Version ID. + * @data_offset: Set the offset of DATA register according to VERID.   * @pdev: Platform device associated with the MMC controller.   * @pdata: Platform data associated with the MMC controller.   * @slot: Slots sharing this MMC controller. @@ -147,6 +149,8 @@ struct dw_mci {  	u32			current_speed;  	u32			num_slots;  	u32			fifoth_val; +	u16			verid; +	u16			data_offset;  	struct platform_device	*pdev;  	struct dw_mci_board	*pdata;  	struct dw_mci_slot	*slot[MAX_MCI_SLOTS]; diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h index 1d09562ccf7..a3ac9c48e5d 100644 --- a/include/linux/mmc/host.h +++ b/include/linux/mmc/host.h @@ -12,6 +12,7 @@  #include <linux/leds.h>  #include <linux/sched.h> +#include <linux/fault-inject.h>  #include <linux/mmc/core.h>  #include <linux/mmc/pm.h> @@ -108,6 +109,9 @@ struct mmc_host_ops {  	 * It is optional for the host to implement pre_req and post_req in  	 * order to support double buffering of requests (prepare one  	 * request while another request is active). +	 * pre_req() must always be followed by a post_req(). +	 * To undo a call made to pre_req(), call post_req() with +	 * a nonzero err condition.  	 */  	void	(*post_req)(struct mmc_host *host, struct mmc_request *req,  			    int err); @@ -147,6 +151,7 @@ struct mmc_host_ops {  	int	(*execute_tuning)(struct mmc_host *host);  	void	(*enable_preset_value)(struct mmc_host *host, bool enable);  	int	(*select_drive_strength)(unsigned int max_dtr, int host_drv, int card_drv); +	void	(*hw_reset)(struct mmc_host *host);  };  struct mmc_card; @@ -229,8 +234,20 @@ struct mmc_host {  #define MMC_CAP_MAX_CURRENT_600	(1 << 28)	/* Host max current limit is 600mA */  #define MMC_CAP_MAX_CURRENT_800	(1 << 29)	/* Host max current limit is 800mA */  #define MMC_CAP_CMD23		(1 << 30)	/* CMD23 supported. */ +#define MMC_CAP_HW_RESET	(1 << 31)	/* Hardware reset */ + +	unsigned int		caps2;		/* More host capabilities */ + +#define MMC_CAP2_BOOTPART_NOACC	(1 << 0)	/* Boot partition no access */ +#define MMC_CAP2_CACHE_CTRL	(1 << 1)	/* Allow cache control */ +#define MMC_CAP2_POWEROFF_NOTIFY (1 << 2)	/* Notify poweroff supported */ +#define MMC_CAP2_NO_MULTI_READ	(1 << 3)	/* Multiblock reads don't work */  	mmc_pm_flag_t		pm_caps;	/* supported pm features */ +	unsigned int        power_notify_type; +#define MMC_HOST_PW_NOTIFY_NONE		0 +#define MMC_HOST_PW_NOTIFY_SHORT	1 +#define MMC_HOST_PW_NOTIFY_LONG		2  #ifdef CONFIG_MMC_CLKGATE  	int			clk_requests;	/* internal reference counter */ @@ -302,6 +319,10 @@ struct mmc_host {  	struct mmc_async_req	*areq;		/* active async req */ +#ifdef CONFIG_FAIL_MMC_REQUEST +	struct fault_attr	fail_mmc_request; +#endif +  	unsigned long		private[0] ____cacheline_aligned;  }; @@ -330,6 +351,8 @@ extern int mmc_power_restore_host(struct mmc_host *host);  extern void mmc_detect_change(struct mmc_host *, unsigned long delay);  extern void mmc_request_done(struct mmc_host *, struct mmc_request *); +extern int mmc_cache_ctrl(struct mmc_host *, u8); +  static inline void mmc_signal_sdio_irq(struct mmc_host *host)  {  	host->ops->enable_sdio_irq(host, 0); @@ -394,4 +417,10 @@ static inline int mmc_host_cmd23(struct mmc_host *host)  {  	return host->caps & MMC_CAP_CMD23;  } + +static inline int mmc_boot_partition_access(struct mmc_host *host) +{ +	return !(host->caps2 & MMC_CAP2_BOOTPART_NOACC); +} +  #endif /* LINUX_MMC_HOST_H */ diff --git a/include/linux/mmc/mmc.h b/include/linux/mmc/mmc.h index 5a794cb503e..0e7135697d1 100644 --- a/include/linux/mmc/mmc.h +++ b/include/linux/mmc/mmc.h @@ -270,18 +270,31 @@ struct _mmc_csd {   * EXT_CSD fields   */ +#define EXT_CSD_FLUSH_CACHE		32      /* W */ +#define EXT_CSD_CACHE_CTRL		33      /* R/W */ +#define EXT_CSD_POWER_OFF_NOTIFICATION	34	/* R/W */ +#define EXT_CSD_GP_SIZE_MULT		143	/* R/W */  #define EXT_CSD_PARTITION_ATTRIBUTE	156	/* R/W */  #define EXT_CSD_PARTITION_SUPPORT	160	/* RO */ +#define EXT_CSD_HPI_MGMT		161	/* R/W */ +#define EXT_CSD_RST_N_FUNCTION		162	/* R/W */ +#define EXT_CSD_SANITIZE_START		165     /* W */  #define EXT_CSD_WR_REL_PARAM		166	/* RO */  #define EXT_CSD_ERASE_GROUP_DEF		175	/* R/W */  #define EXT_CSD_PART_CONFIG		179	/* R/W */  #define EXT_CSD_ERASED_MEM_CONT		181	/* RO */  #define EXT_CSD_BUS_WIDTH		183	/* R/W */  #define EXT_CSD_HS_TIMING		185	/* R/W */ +#define EXT_CSD_POWER_CLASS		187	/* R/W */  #define EXT_CSD_REV			192	/* RO */  #define EXT_CSD_STRUCTURE		194	/* RO */  #define EXT_CSD_CARD_TYPE		196	/* RO */ +#define EXT_CSD_OUT_OF_INTERRUPT_TIME	198	/* RO */  #define EXT_CSD_PART_SWITCH_TIME        199     /* RO */ +#define EXT_CSD_PWR_CL_52_195		200	/* RO */ +#define EXT_CSD_PWR_CL_26_195		201	/* RO */ +#define EXT_CSD_PWR_CL_52_360		202	/* RO */ +#define EXT_CSD_PWR_CL_26_360		203	/* RO */  #define EXT_CSD_SEC_CNT			212	/* RO, 4 bytes */  #define EXT_CSD_S_A_TIMEOUT		217	/* RO */  #define EXT_CSD_REL_WR_SEC_C		222	/* RO */ @@ -293,6 +306,14 @@ struct _mmc_csd {  #define EXT_CSD_SEC_ERASE_MULT		230	/* RO */  #define EXT_CSD_SEC_FEATURE_SUPPORT	231	/* RO */  #define EXT_CSD_TRIM_MULT		232	/* RO */ +#define EXT_CSD_PWR_CL_200_195		236	/* RO */ +#define EXT_CSD_PWR_CL_200_360		237	/* RO */ +#define EXT_CSD_PWR_CL_DDR_52_195	238	/* RO */ +#define EXT_CSD_PWR_CL_DDR_52_360	239	/* RO */ +#define EXT_CSD_POWER_OFF_LONG_TIME	247	/* RO */ +#define EXT_CSD_GENERIC_CMD6_TIME	248	/* RO */ +#define EXT_CSD_CACHE_SIZE		249	/* RO, 4 bytes */ +#define EXT_CSD_HPI_FEATURES		503	/* RO */  /*   * EXT_CSD field definitions @@ -302,7 +323,9 @@ struct _mmc_csd {  #define EXT_CSD_PART_CONFIG_ACC_MASK	(0x7)  #define EXT_CSD_PART_CONFIG_ACC_BOOT0	(0x1) -#define EXT_CSD_PART_CONFIG_ACC_BOOT1	(0x2) +#define EXT_CSD_PART_CONFIG_ACC_GP0	(0x4) + +#define EXT_CSD_PART_SUPPORT_PART_EN	(0x1)  #define EXT_CSD_CMD_SET_NORMAL		(1<<0)  #define EXT_CSD_CMD_SET_SECURE		(1<<1) @@ -327,7 +350,20 @@ struct _mmc_csd {  #define EXT_CSD_SEC_ER_EN	BIT(0)  #define EXT_CSD_SEC_BD_BLK_EN	BIT(2)  #define EXT_CSD_SEC_GB_CL_EN	BIT(4) +#define EXT_CSD_SEC_SANITIZE	BIT(6)  /* v4.5 only */ + +#define EXT_CSD_RST_N_EN_MASK	0x3 +#define EXT_CSD_RST_N_ENABLED	1	/* RST_n is enabled on card */ + +#define EXT_CSD_NO_POWER_NOTIFICATION	0 +#define EXT_CSD_POWER_ON		1 +#define EXT_CSD_POWER_OFF_SHORT		2 +#define EXT_CSD_POWER_OFF_LONG		3 +#define EXT_CSD_PWR_CL_8BIT_MASK	0xF0	/* 8 bit PWR CLS */ +#define EXT_CSD_PWR_CL_4BIT_MASK	0x0F	/* 8 bit PWR CLS */ +#define EXT_CSD_PWR_CL_8BIT_SHIFT	4 +#define EXT_CSD_PWR_CL_4BIT_SHIFT	0  /*   * MMC_SWITCH access modes   */ diff --git a/include/linux/mmc/sdhci.h b/include/linux/mmc/sdhci.h index 5666f3abfab..e4b69353678 100644 --- a/include/linux/mmc/sdhci.h +++ b/include/linux/mmc/sdhci.h @@ -88,6 +88,10 @@ struct sdhci_host {  /* The read-only detection via SDHCI_PRESENT_STATE register is unstable */  #define SDHCI_QUIRK_UNSTABLE_RO_DETECT			(1<<31) +	unsigned int quirks2;	/* More deviations from spec. */ + +#define SDHCI_QUIRK2_OWN_CARD_DETECTION			(1<<0) +  	int irq;		/* Device IRQ */  	void __iomem *ioaddr;	/* Mapped address */ @@ -115,6 +119,8 @@ struct sdhci_host {  #define SDHCI_NEEDS_RETUNING	(1<<5)	/* Host needs retuning */  #define SDHCI_AUTO_CMD12	(1<<6)	/* Auto CMD12 support */  #define SDHCI_AUTO_CMD23	(1<<7)	/* Auto CMD23 support */ +#define SDHCI_PV_ENABLED	(1<<8)	/* Preset value enabled */ +#define SDHCI_SDIO_IRQ_ENABLED	(1<<9)	/* SDIO irq enabled */  	unsigned int version;	/* SDHCI spec. version */ @@ -125,6 +131,8 @@ struct sdhci_host {  	unsigned int clock;	/* Current clock (MHz) */  	u8 pwr;			/* Current voltage */ +	bool runtime_suspended;	/* Host is runtime suspended */ +  	struct mmc_request *mrq;	/* Current request */  	struct mmc_command *cmd;	/* Current command */  	struct mmc_data *data;	/* Current data request */ diff --git a/include/linux/mmc/sdio.h b/include/linux/mmc/sdio.h index 2a2e9905a24..e0b1123497b 100644 --- a/include/linux/mmc/sdio.h +++ b/include/linux/mmc/sdio.h @@ -72,11 +72,13 @@  #define  SDIO_CCCR_REV_1_00	0	/* CCCR/FBR Version 1.00 */  #define  SDIO_CCCR_REV_1_10	1	/* CCCR/FBR Version 1.10 */  #define  SDIO_CCCR_REV_1_20	2	/* CCCR/FBR Version 1.20 */ +#define  SDIO_CCCR_REV_3_00	3	/* CCCR/FBR Version 3.00 */  #define  SDIO_SDIO_REV_1_00	0	/* SDIO Spec Version 1.00 */  #define  SDIO_SDIO_REV_1_10	1	/* SDIO Spec Version 1.10 */  #define  SDIO_SDIO_REV_1_20	2	/* SDIO Spec Version 1.20 */  #define  SDIO_SDIO_REV_2_00	3	/* SDIO Spec Version 2.00 */ +#define  SDIO_SDIO_REV_3_00	4	/* SDIO Spec Version 3.00 */  #define SDIO_CCCR_SD		0x01 diff --git a/include/linux/mmc/sh_mmcif.h b/include/linux/mmc/sh_mmcif.h index 0222cd8ebe7..04ff452bf5c 100644 --- a/include/linux/mmc/sh_mmcif.h +++ b/include/linux/mmc/sh_mmcif.h @@ -41,7 +41,9 @@ struct sh_mmcif_plat_data {  	void (*set_pwr)(struct platform_device *pdev, int state);  	void (*down_pwr)(struct platform_device *pdev);  	int (*get_cd)(struct platform_device *pdef); -	struct sh_mmcif_dma	*dma; +	struct sh_mmcif_dma	*dma;		/* Deprecated. Instead */ +	unsigned int		slave_id_tx;	/* use embedded slave_id_[tr]x */ +	unsigned int		slave_id_rx;  	u8			sup_pclk;	/* 1 :SH7757, 0: SH7724/SH7372 */  	unsigned long		caps;  	u32			ocr; diff --git a/include/linux/mmc/sh_mobile_sdhi.h b/include/linux/mmc/sh_mobile_sdhi.h index bd50b365167..71b805451bd 100644 --- a/include/linux/mmc/sh_mobile_sdhi.h +++ b/include/linux/mmc/sh_mobile_sdhi.h @@ -6,6 +6,10 @@  struct platform_device;  struct tmio_mmc_data; +#define SH_MOBILE_SDHI_IRQ_CARD_DETECT	"card_detect" +#define SH_MOBILE_SDHI_IRQ_SDCARD	"sdcard" +#define SH_MOBILE_SDHI_IRQ_SDIO		"sdio" +  struct sh_mobile_sdhi_info {  	int dma_slave_tx;  	int dma_slave_rx; diff --git a/include/linux/mmiotrace.h b/include/linux/mmiotrace.h index 97491f78b08..c5d52780d6a 100644 --- a/include/linux/mmiotrace.h +++ b/include/linux/mmiotrace.h @@ -49,8 +49,7 @@ extern void mmiotrace_ioremap(resource_size_t offset, unsigned long size,  extern void mmiotrace_iounmap(volatile void __iomem *addr);  /* For anyone to insert markers. Remember trailing newline. */ -extern int mmiotrace_printk(const char *fmt, ...) -				__attribute__ ((format (printf, 1, 2))); +extern __printf(1, 2) int mmiotrace_printk(const char *fmt, ...);  #else /* !CONFIG_MMIOTRACE: */  static inline int is_kmmio_active(void)  { @@ -71,10 +70,7 @@ static inline void mmiotrace_iounmap(volatile void __iomem *addr)  {  } -static inline int mmiotrace_printk(const char *fmt, ...) -				__attribute__ ((format (printf, 1, 0))); - -static inline int mmiotrace_printk(const char *fmt, ...) +static inline __printf(1, 2) int mmiotrace_printk(const char *fmt, ...)  {  	return 0;  } diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h index be1ac8d7789..188cb2ffe8d 100644 --- a/include/linux/mmzone.h +++ b/include/linux/mmzone.h @@ -100,6 +100,7 @@ enum zone_stat_item {  	NR_UNSTABLE_NFS,	/* NFS unstable pages */  	NR_BOUNCE,  	NR_VMSCAN_WRITE, +	NR_VMSCAN_IMMEDIATE,	/* Prioritise for reclaim when writeback ends */  	NR_WRITEBACK_TEMP,	/* Writeback using temporary buffers */  	NR_ISOLATED_ANON,	/* Temporary isolated pages from anon lru */  	NR_ISOLATED_FILE,	/* Temporary isolated pages from file lru */ @@ -164,6 +165,18 @@ static inline int is_unevictable_lru(enum lru_list l)  #define LRU_ALL_EVICTABLE (LRU_ALL_FILE | LRU_ALL_ANON)  #define LRU_ALL	     ((1 << NR_LRU_LISTS) - 1) +/* Isolate inactive pages */ +#define ISOLATE_INACTIVE	((__force isolate_mode_t)0x1) +/* Isolate active pages */ +#define ISOLATE_ACTIVE		((__force isolate_mode_t)0x2) +/* Isolate clean file */ +#define ISOLATE_CLEAN		((__force isolate_mode_t)0x4) +/* Isolate unmapped file */ +#define ISOLATE_UNMAPPED	((__force isolate_mode_t)0x8) + +/* LRU Isolation modes. */ +typedef unsigned __bitwise__ isolate_mode_t; +  enum zone_watermarks {  	WMARK_MIN,  	WMARK_LOW, diff --git a/include/linux/mod_devicetable.h b/include/linux/mod_devicetable.h index ae28e93fd07..468819cdde8 100644 --- a/include/linux/mod_devicetable.h +++ b/include/linux/mod_devicetable.h @@ -405,6 +405,15 @@ struct virtio_device_id {  };  #define VIRTIO_DEV_ANY_ID	0xffffffff +/* + * For Hyper-V devices we use the device guid as the id. + */ +struct hv_vmbus_device_id { +	__u8 guid[16]; +	kernel_ulong_t driver_data	/* Data private to the driver */ +			__attribute__((aligned(sizeof(kernel_ulong_t)))); +}; +  /* i2c */  #define I2C_NAME_SIZE	20 diff --git a/include/linux/module.h b/include/linux/module.h index 1c30087a2d8..863921637d9 100644 --- a/include/linux/module.h +++ b/include/linux/module.h @@ -580,9 +580,6 @@ int unregister_module_notifier(struct notifier_block * nb);  extern void print_modules(void); -extern void module_update_tracepoints(void); -extern int module_get_iter_tracepoints(struct tracepoint_iter *iter); -  #else /* !CONFIG_MODULES... */  #define EXPORT_SYMBOL(sym)  #define EXPORT_SYMBOL_GPL(sym) @@ -698,15 +695,6 @@ static inline int unregister_module_notifier(struct notifier_block * nb)  static inline void print_modules(void)  {  } - -static inline void module_update_tracepoints(void) -{ -} - -static inline int module_get_iter_tracepoints(struct tracepoint_iter *iter) -{ -	return 0; -}  #endif /* CONFIG_MODULES */  #ifdef CONFIG_SYSFS diff --git a/include/linux/moduleparam.h b/include/linux/moduleparam.h index ddaae98c53f..fffb10bd551 100644 --- a/include/linux/moduleparam.h +++ b/include/linux/moduleparam.h @@ -262,6 +262,26 @@ static inline void __kernel_param_unlock(void)  			    .str = &__param_string_##name, 0, perm);	\  	__MODULE_PARM_TYPE(name, "string") +/** + * parameq - checks if two parameter names match + * @name1: parameter name 1 + * @name2: parameter name 2 + * + * Returns true if the two parameter names are equal. + * Dashes (-) are considered equal to underscores (_). + */ +extern bool parameq(const char *name1, const char *name2); + +/** + * parameqn - checks if two parameter names match + * @name1: parameter name 1 + * @name2: parameter name 2 + * @n: the length to compare + * + * Similar to parameq(), except it compares @n characters. + */ +extern bool parameqn(const char *name1, const char *name2, size_t n); +  /* Called on module insert or kernel boot */  extern int parse_args(const char *name,  		      char *args, diff --git a/include/linux/namei.h b/include/linux/namei.h index 409328d1cbb..ffc02135c48 100644 --- a/include/linux/namei.h +++ b/include/linux/namei.h @@ -67,6 +67,7 @@ enum {LAST_NORM, LAST_ROOT, LAST_DOT, LAST_DOTDOT, LAST_BIND};  #define LOOKUP_EMPTY		0x4000  extern int user_path_at(int, const char __user *, unsigned, struct path *); +extern int user_path_at_empty(int, const char __user *, unsigned, struct path *, int *empty);  #define user_path(name, path) user_path_at(AT_FDCWD, name, LOOKUP_FOLLOW, path)  #define user_lpath(name, path) user_path_at(AT_FDCWD, name, 0, path) diff --git a/include/linux/net_tstamp.h b/include/linux/net_tstamp.h index a3b8546354a..ae5df122e42 100644 --- a/include/linux/net_tstamp.h +++ b/include/linux/net_tstamp.h @@ -45,7 +45,7 @@ struct hwtstamp_config {  };  /* possible values for hwtstamp_config->tx_type */ -enum { +enum hwtstamp_tx_types {  	/*  	 * No outgoing packet will need hardware time stamping;  	 * should a packet arrive which asks for it, no hardware @@ -60,10 +60,19 @@ enum {  	 * before sending the packet.  	 */  	HWTSTAMP_TX_ON, + +	/* +	 * Enables time stamping for outgoing packets just as +	 * HWTSTAMP_TX_ON does, but also enables time stamp insertion +	 * directly into Sync packets. In this case, transmitted Sync +	 * packets will not received a time stamp via the socket error +	 * queue. +	 */ +	HWTSTAMP_TX_ONESTEP_SYNC,  };  /* possible values for hwtstamp_config->rx_filter */ -enum { +enum hwtstamp_rx_filters {  	/* time stamp no incoming packet at all */  	HWTSTAMP_FILTER_NONE, diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index ddee79bb8f1..cbeb5867cff 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -31,7 +31,7 @@  #include <linux/if_link.h>  #ifdef __KERNEL__ -#include <linux/pm_qos_params.h> +#include <linux/pm_qos.h>  #include <linux/timer.h>  #include <linux/delay.h>  #include <linux/atomic.h> @@ -723,9 +723,8 @@ struct netdev_tc_txq {   *   * void (*ndo_set_rx_mode)(struct net_device *dev);   *	This function is called device changes address list filtering. - * - * void (*ndo_set_multicast_list)(struct net_device *dev); - *	This function is called when the multicast address list changes. + *	If driver handles unicast address filtering, it should set + *	IFF_UNICAST_FLT to its priv_flags.   *   * int (*ndo_set_mac_address)(struct net_device *dev, void *addr);   *	This function  is called when the Media Access Control address @@ -782,6 +781,7 @@ struct netdev_tc_txq {   * 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_set_vf_spoofchk)(struct net_device *dev, int vf, bool setting);   * 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, @@ -868,7 +868,6 @@ struct net_device_ops {  	void			(*ndo_change_rx_flags)(struct net_device *dev,  						       int flags);  	void			(*ndo_set_rx_mode)(struct net_device *dev); -	void			(*ndo_set_multicast_list)(struct net_device *dev);  	int			(*ndo_set_mac_address)(struct net_device *dev,  						       void *addr);  	int			(*ndo_validate_addr)(struct net_device *dev); @@ -902,6 +901,8 @@ struct net_device_ops {  						   int queue, u16 vlan, u8 qos);  	int			(*ndo_set_vf_tx_rate)(struct net_device *dev,  						      int vf, int rate); +	int			(*ndo_set_vf_spoofchk)(struct net_device *dev, +						       int vf, bool setting);  	int			(*ndo_get_vf_config)(struct net_device *dev,  						     int vf,  						     struct ifla_vf_info *ivf); @@ -924,11 +925,15 @@ struct net_device_ops {  						       u16 xid,  						       struct scatterlist *sgl,  						       unsigned int sgc); +#endif + +#if defined(CONFIG_LIBFCOE) || defined(CONFIG_LIBFCOE_MODULE)  #define NETDEV_FCOE_WWNN 0  #define NETDEV_FCOE_WWPN 1  	int			(*ndo_fcoe_get_wwn)(struct net_device *dev,  						    u64 *wwn, int type);  #endif +  #ifdef CONFIG_RFS_ACCEL  	int			(*ndo_rx_flow_steer)(struct net_device *dev,  						     const struct sk_buff *skb, @@ -964,7 +969,7 @@ struct net_device {  	 */  	char			name[IFNAMSIZ]; -	struct pm_qos_request_list pm_qos_req; +	struct pm_qos_request	pm_qos_req;  	/* device name hash chain */  	struct hlist_node	name_hlist; @@ -2587,9 +2592,6 @@ static inline int netif_is_bond_slave(struct net_device *dev)  extern struct pernet_operations __net_initdata loopback_net_ops; -int dev_ethtool_get_settings(struct net_device *dev, -			     struct ethtool_cmd *cmd); -  static inline u32 dev_ethtool_get_rx_csum(struct net_device *dev)  {  	if (dev->features & NETIF_F_RXCSUM) @@ -2617,23 +2619,26 @@ static inline const char *netdev_name(const struct net_device *dev)  	return dev->name;  } -extern int netdev_printk(const char *level, const struct net_device *dev, -			 const char *format, ...) -	__attribute__ ((format (printf, 3, 4))); -extern int netdev_emerg(const struct net_device *dev, const char *format, ...) -	__attribute__ ((format (printf, 2, 3))); -extern int netdev_alert(const struct net_device *dev, const char *format, ...) -	__attribute__ ((format (printf, 2, 3))); -extern int netdev_crit(const struct net_device *dev, const char *format, ...) -	__attribute__ ((format (printf, 2, 3))); -extern int netdev_err(const struct net_device *dev, const char *format, ...) -	__attribute__ ((format (printf, 2, 3))); -extern int netdev_warn(const struct net_device *dev, const char *format, ...) -	__attribute__ ((format (printf, 2, 3))); -extern int netdev_notice(const struct net_device *dev, const char *format, ...) -	__attribute__ ((format (printf, 2, 3))); -extern int netdev_info(const struct net_device *dev, const char *format, ...) -	__attribute__ ((format (printf, 2, 3))); +extern int __netdev_printk(const char *level, const struct net_device *dev, +			struct va_format *vaf); + +extern __printf(3, 4) +int netdev_printk(const char *level, const struct net_device *dev, +		  const char *format, ...); +extern __printf(2, 3) +int netdev_emerg(const struct net_device *dev, const char *format, ...); +extern __printf(2, 3) +int netdev_alert(const struct net_device *dev, const char *format, ...); +extern __printf(2, 3) +int netdev_crit(const struct net_device *dev, const char *format, ...); +extern __printf(2, 3) +int netdev_err(const struct net_device *dev, const char *format, ...); +extern __printf(2, 3) +int netdev_warn(const struct net_device *dev, const char *format, ...); +extern __printf(2, 3) +int netdev_notice(const struct net_device *dev, const char *format, ...); +extern __printf(2, 3) +int netdev_info(const struct net_device *dev, const char *format, ...);  #define MODULE_ALIAS_NETDEV(device) \  	MODULE_ALIAS("netdev-" device) @@ -2644,8 +2649,7 @@ extern int netdev_info(const struct net_device *dev, const char *format, ...)  #elif defined(CONFIG_DYNAMIC_DEBUG)  #define netdev_dbg(__dev, format, args...)			\  do {								\ -	dynamic_dev_dbg((__dev)->dev.parent, "%s: " format,	\ -			netdev_name(__dev), ##args);		\ +	dynamic_netdev_dbg(__dev, format, ##args);		\  } while (0)  #else  #define netdev_dbg(__dev, format, args...)			\ @@ -2712,9 +2716,7 @@ do {								\  #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);	\ +		dynamic_netdev_dbg(netdev, format, ##args);	\  } while (0)  #else  #define netif_dbg(priv, type, dev, format, args...)			\ diff --git a/include/linux/netfilter/xt_connlimit.h b/include/linux/netfilter/xt_connlimit.h index 0ca66e97acb..d1366f05d1b 100644 --- a/include/linux/netfilter/xt_connlimit.h +++ b/include/linux/netfilter/xt_connlimit.h @@ -2,6 +2,7 @@  #define _XT_CONNLIMIT_H  #include <linux/types.h> +#include <linux/netfilter.h>  struct xt_connlimit_data; diff --git a/include/linux/netfilter/xt_conntrack.h b/include/linux/netfilter/xt_conntrack.h index 74b904d8f99..e3c041d5402 100644 --- a/include/linux/netfilter/xt_conntrack.h +++ b/include/linux/netfilter/xt_conntrack.h @@ -6,6 +6,7 @@  #define _XT_CONNTRACK_H  #include <linux/types.h> +#include <linux/netfilter.h>  #include <linux/netfilter/nf_conntrack_tuple_common.h>  #define XT_CONNTRACK_STATE_BIT(ctinfo) (1 << ((ctinfo)%IP_CT_IS_REPLY+1)) diff --git a/include/linux/netfilter/xt_iprange.h b/include/linux/netfilter/xt_iprange.h index c1f21a779a4..25fd7cf851f 100644 --- a/include/linux/netfilter/xt_iprange.h +++ b/include/linux/netfilter/xt_iprange.h @@ -2,6 +2,7 @@  #define _LINUX_NETFILTER_XT_IPRANGE_H 1  #include <linux/types.h> +#include <linux/netfilter.h>  enum {  	IPRANGE_SRC     = 1 << 0,	/* match source IP address */ diff --git a/include/linux/netfilter_arp/arp_tables.h b/include/linux/netfilter_arp/arp_tables.h index adbf4bff87e..e08565d4517 100644 --- a/include/linux/netfilter_arp/arp_tables.h +++ b/include/linux/netfilter_arp/arp_tables.h @@ -52,7 +52,7 @@ struct arpt_arp {  	struct in_addr smsk, tmsk;  	/* Device hw address length, src+target device addresses */ -	u_int8_t arhln, arhln_mask; +	__u8 arhln, arhln_mask;  	struct arpt_devaddr_info src_devaddr;  	struct arpt_devaddr_info tgt_devaddr; @@ -71,9 +71,9 @@ struct arpt_arp {  	unsigned char iniface_mask[IFNAMSIZ], outiface_mask[IFNAMSIZ];  	/* Flags word */ -	u_int8_t flags; +	__u8 flags;  	/* Inverse flags */ -	u_int16_t invflags; +	__u16 invflags;  };  /* Values for "flag" field in struct arpt_ip (general arp structure). @@ -102,9 +102,9 @@ struct arpt_entry  	struct arpt_arp arp;  	/* Size of arpt_entry + matches */ -	u_int16_t target_offset; +	__u16 target_offset;  	/* Size of arpt_entry + matches + target */ -	u_int16_t next_offset; +	__u16 next_offset;  	/* Back pointer */  	unsigned int comefrom; @@ -260,8 +260,8 @@ extern unsigned int arpt_do_table(struct sk_buff *skb,  struct compat_arpt_entry {  	struct arpt_arp arp; -	u_int16_t target_offset; -	u_int16_t next_offset; +	__u16 target_offset; +	__u16 next_offset;  	compat_uint_t comefrom;  	struct compat_xt_counters counters;  	unsigned char elems[0]; diff --git a/include/linux/netfilter_decnet.h b/include/linux/netfilter_decnet.h index 6f425369ee2..0b09732aacd 100644 --- a/include/linux/netfilter_decnet.h +++ b/include/linux/netfilter_decnet.h @@ -11,6 +11,9 @@  /* only for userspace compatibility */  #ifndef __KERNEL__ + +#include <limits.h> /* for INT_MIN, INT_MAX */ +  /* IP Cache bits. */  /* Src IP address. */  #define NFC_DN_SRC		0x0001 diff --git a/include/linux/netfilter_ipv4.h b/include/linux/netfilter_ipv4.h index 29c7727ff0e..fa0946c549d 100644 --- a/include/linux/netfilter_ipv4.h +++ b/include/linux/netfilter_ipv4.h @@ -9,6 +9,9 @@  /* only for userspace compatibility */  #ifndef __KERNEL__ + +#include <limits.h> /* for INT_MIN, INT_MAX */ +  /* IP Cache bits. */  /* Src IP address. */  #define NFC_IP_SRC		0x0001 diff --git a/include/linux/netfilter_ipv4/Kbuild b/include/linux/netfilter_ipv4/Kbuild index f9930c87fff..c3b45480ecf 100644 --- a/include/linux/netfilter_ipv4/Kbuild +++ b/include/linux/netfilter_ipv4/Kbuild @@ -12,3 +12,4 @@ header-y += ipt_ah.h  header-y += ipt_ecn.h  header-y += ipt_realm.h  header-y += ipt_ttl.h +header-y += nf_nat.h diff --git a/include/linux/netfilter_ipv4/ip_tables.h b/include/linux/netfilter_ipv4/ip_tables.h index 64a5d95c58e..db79231914c 100644 --- a/include/linux/netfilter_ipv4/ip_tables.h +++ b/include/linux/netfilter_ipv4/ip_tables.h @@ -81,12 +81,12 @@ struct ipt_ip {  	unsigned char iniface_mask[IFNAMSIZ], outiface_mask[IFNAMSIZ];  	/* Protocol, 0 = ANY */ -	u_int16_t proto; +	__u16 proto;  	/* Flags word */ -	u_int8_t flags; +	__u8 flags;  	/* Inverse flags */ -	u_int8_t invflags; +	__u8 invflags;  };  /* Values for "flag" field in struct ipt_ip (general ip structure). */ @@ -114,9 +114,9 @@ struct ipt_entry {  	unsigned int nfcache;  	/* Size of ipt_entry + matches */ -	u_int16_t target_offset; +	__u16 target_offset;  	/* Size of ipt_entry + matches + target */ -	u_int16_t next_offset; +	__u16 next_offset;  	/* Back pointer */  	unsigned int comefrom; @@ -149,9 +149,9 @@ struct ipt_entry {  /* ICMP matching stuff */  struct ipt_icmp { -	u_int8_t type;				/* type to match */ -	u_int8_t code[2];			/* range of code */ -	u_int8_t invflags;			/* Inverse flags */ +	__u8 type;				/* type to match */ +	__u8 code[2];				/* range of code */ +	__u8 invflags;				/* Inverse flags */  };  /* Values for "inv" field for struct ipt_icmp. */ @@ -288,8 +288,8 @@ extern unsigned int ipt_do_table(struct sk_buff *skb,  struct compat_ipt_entry {  	struct ipt_ip ip;  	compat_uint_t nfcache; -	u_int16_t target_offset; -	u_int16_t next_offset; +	__u16 target_offset; +	__u16 next_offset;  	compat_uint_t comefrom;  	struct compat_xt_counters counters;  	unsigned char elems[0]; diff --git a/include/linux/netfilter_ipv4/nf_nat.h b/include/linux/netfilter_ipv4/nf_nat.h new file mode 100644 index 00000000000..7a861d09fc8 --- /dev/null +++ b/include/linux/netfilter_ipv4/nf_nat.h @@ -0,0 +1,58 @@ +#ifndef _LINUX_NF_NAT_H +#define _LINUX_NF_NAT_H + +#include <linux/types.h> + +#define IP_NAT_RANGE_MAP_IPS 1 +#define IP_NAT_RANGE_PROTO_SPECIFIED 2 +#define IP_NAT_RANGE_PROTO_RANDOM 4 +#define IP_NAT_RANGE_PERSISTENT 8 + +/* The protocol-specific manipulable parts of the tuple. */ +union nf_conntrack_man_proto { +	/* Add other protocols here. */ +	__be16 all; + +	struct { +		__be16 port; +	} tcp; +	struct { +		__be16 port; +	} udp; +	struct { +		__be16 id; +	} icmp; +	struct { +		__be16 port; +	} dccp; +	struct { +		__be16 port; +	} sctp; +	struct { +		__be16 key;	/* GRE key is 32bit, PPtP only uses 16bit */ +	} gre; +}; + +/* Single range specification. */ +struct nf_nat_range { +	/* Set to OR of flags above. */ +	unsigned int flags; + +	/* Inclusive: network order. */ +	__be32 min_ip, max_ip; + +	/* Inclusive: network order */ +	union nf_conntrack_man_proto min, max; +}; + +/* For backwards compat: don't use in modern code. */ +struct nf_nat_multi_range_compat { +	unsigned int rangesize; /* Must be 1. */ + +	/* hangs off end. */ +	struct nf_nat_range range[1]; +}; + +#define nf_nat_multi_range nf_nat_multi_range_compat + +#endif diff --git a/include/linux/netfilter_ipv6.h b/include/linux/netfilter_ipv6.h index 1f7e300094c..57c025127f1 100644 --- a/include/linux/netfilter_ipv6.h +++ b/include/linux/netfilter_ipv6.h @@ -12,6 +12,9 @@  /* only for userspace compatibility */  #ifndef __KERNEL__ + +#include <limits.h> /* for INT_MIN, INT_MAX */ +  /* IP Cache bits. */  /* Src IP address. */  #define NFC_IP6_SRC              0x0001 diff --git a/include/linux/netfilter_ipv6/ip6_tables.h b/include/linux/netfilter_ipv6/ip6_tables.h index c9784f7a9c1..f549adccc94 100644 --- a/include/linux/netfilter_ipv6/ip6_tables.h +++ b/include/linux/netfilter_ipv6/ip6_tables.h @@ -81,14 +81,14 @@ struct ip6t_ip6 {  	 *   MH do not match any packets.  	 * - You also need to set IP6T_FLAGS_PROTO to "flags" to check protocol.  	 */ -	u_int16_t proto; +	__u16 proto;  	/* TOS to match iff flags & IP6T_F_TOS */ -	u_int8_t tos; +	__u8 tos;  	/* Flags word */ -	u_int8_t flags; +	__u8 flags;  	/* Inverse flags */ -	u_int8_t invflags; +	__u8 invflags;  };  /* Values for "flag" field in struct ip6t_ip6 (general ip6 structure). */ @@ -118,9 +118,9 @@ struct ip6t_entry {  	unsigned int nfcache;  	/* Size of ipt_entry + matches */ -	u_int16_t target_offset; +	__u16 target_offset;  	/* Size of ipt_entry + matches + target */ -	u_int16_t next_offset; +	__u16 next_offset;  	/* Back pointer */  	unsigned int comefrom; @@ -186,9 +186,9 @@ struct ip6t_error {  /* ICMP matching stuff */  struct ip6t_icmp { -	u_int8_t type;				/* type to match */ -	u_int8_t code[2];			/* range of code */ -	u_int8_t invflags;			/* Inverse flags */ +	__u8 type;				/* type to match */ +	__u8 code[2];				/* range of code */ +	__u8 invflags;				/* Inverse flags */  };  /* Values for "inv" field for struct ipt_icmp. */ @@ -298,8 +298,8 @@ extern int ipv6_find_hdr(const struct sk_buff *skb, unsigned int *offset,  struct compat_ip6t_entry {  	struct ip6t_ip6 ipv6;  	compat_uint_t nfcache; -	u_int16_t target_offset; -	u_int16_t next_offset; +	__u16 target_offset; +	__u16 next_offset;  	compat_uint_t comefrom;  	struct compat_xt_counters counters;  	unsigned char elems[0]; diff --git a/include/linux/netlink.h b/include/linux/netlink.h index 180540a84d3..8374d296736 100644 --- a/include/linux/netlink.h +++ b/include/linux/netlink.h @@ -1,7 +1,7 @@  #ifndef __LINUX_NETLINK_H  #define __LINUX_NETLINK_H -#include <linux/socket.h> /* for sa_family_t */ +#include <linux/socket.h> /* for __kernel_sa_family_t */  #include <linux/types.h>  #define NETLINK_ROUTE		0	/* Routing/device hook				*/ @@ -25,6 +25,7 @@  #define NETLINK_SCSITRANSPORT	18	/* SCSI Transports */  #define NETLINK_ECRYPTFS	19  #define NETLINK_RDMA		20 +#define NETLINK_CRYPTO		21	/* Crypto layer */  #define MAX_LINKS 32		 diff --git a/include/linux/netrom.h b/include/linux/netrom.h index 6939b32f66a..af7313cc9cb 100644 --- a/include/linux/netrom.h +++ b/include/linux/netrom.h @@ -7,6 +7,8 @@  #ifndef	NETROM_KERNEL_H  #define	NETROM_KERNEL_H +#include <linux/ax25.h> +  #define NETROM_MTU	236  #define NETROM_T1	1 diff --git a/include/linux/nfc.h b/include/linux/nfc.h index 330a4c5db58..36cb955b05c 100644 --- a/include/linux/nfc.h +++ b/include/linux/nfc.h @@ -39,6 +39,10 @@   *   * @NFC_CMD_GET_DEVICE: request information about a device (requires   *	%NFC_ATTR_DEVICE_INDEX) or dump request to get a list of all nfc devices + * @NFC_CMD_DEV_UP: turn on the nfc device + *	(requires %NFC_ATTR_DEVICE_INDEX) + * @NFC_CMD_DEV_DOWN: turn off the nfc device + *	(requires %NFC_ATTR_DEVICE_INDEX)   * @NFC_CMD_START_POLL: start polling for targets using the given protocols   *	(requires %NFC_ATTR_DEVICE_INDEX and %NFC_ATTR_PROTOCOLS)   * @NFC_CMD_STOP_POLL: stop polling for targets (requires @@ -56,6 +60,8 @@  enum nfc_commands {  	NFC_CMD_UNSPEC,  	NFC_CMD_GET_DEVICE, +	NFC_CMD_DEV_UP, +	NFC_CMD_DEV_DOWN,  	NFC_CMD_START_POLL,  	NFC_CMD_STOP_POLL,  	NFC_CMD_GET_TARGET, @@ -123,4 +129,6 @@ struct sockaddr_nfc {  #define NFC_SOCKPROTO_RAW	0  #define NFC_SOCKPROTO_MAX	1 +#define NFC_HEADER_SIZE 1 +  #endif /*__LINUX_NFC_H */ diff --git a/include/linux/nfs4.h b/include/linux/nfs4.h index 76f99e8714f..32345c2805c 100644 --- a/include/linux/nfs4.h +++ b/include/linux/nfs4.h @@ -373,6 +373,22 @@ enum nfsstat4 {  	NFS4ERR_DELEG_REVOKED	= 10087,	/* deleg./layout revoked */  }; +static inline bool seqid_mutating_err(u32 err) +{ +	/* rfc 3530 section 8.1.5: */ +	switch (err) { +	case NFS4ERR_STALE_CLIENTID: +	case NFS4ERR_STALE_STATEID: +	case NFS4ERR_BAD_STATEID: +	case NFS4ERR_BAD_SEQID: +	case NFS4ERR_BADXDR: +	case NFS4ERR_RESOURCE: +	case NFS4ERR_NOFILEHANDLE: +		return false; +	}; +	return true; +} +  /*   * Note: NF4BAD is not actually part of the protocol; it is just used   * internally by nfsd. @@ -394,7 +410,10 @@ enum open_claim_type4 {  	NFS4_OPEN_CLAIM_NULL = 0,  	NFS4_OPEN_CLAIM_PREVIOUS = 1,  	NFS4_OPEN_CLAIM_DELEGATE_CUR = 2, -	NFS4_OPEN_CLAIM_DELEGATE_PREV = 3 +	NFS4_OPEN_CLAIM_DELEGATE_PREV = 3, +	NFS4_OPEN_CLAIM_FH = 4, /* 4.1 */ +	NFS4_OPEN_CLAIM_DELEG_CUR_FH = 5, /* 4.1 */ +	NFS4_OPEN_CLAIM_DELEG_PREV_FH = 6, /* 4.1 */  };  enum opentype4 { diff --git a/include/linux/nfs_fs.h b/include/linux/nfs_fs.h index eaac770f886..ab2c6343361 100644 --- a/include/linux/nfs_fs.h +++ b/include/linux/nfs_fs.h @@ -149,7 +149,6 @@ struct nfs_inode {  	unsigned long		read_cache_jiffies;  	unsigned long		attrtimeo;  	unsigned long		attrtimeo_timestamp; -	__u64			change_attr;		/* v4 only */  	unsigned long		attr_gencount;  	/* "Generation counter" for the attribute cache. This is @@ -230,6 +229,7 @@ struct nfs_inode {  #define NFS_INO_COMMIT		(7)		/* inode is committing unstable writes */  #define NFS_INO_PNFS_COMMIT	(8)		/* use pnfs code for commit */  #define NFS_INO_LAYOUTCOMMIT	(9)		/* layoutcommit required */ +#define NFS_INO_LAYOUTCOMMITTING (10)		/* layoutcommit inflight */  static inline struct nfs_inode *NFS_I(const struct inode *inode)  { diff --git a/include/linux/nfs_page.h b/include/linux/nfs_page.h index e2791a27a90..ab465fe8c3d 100644 --- a/include/linux/nfs_page.h +++ b/include/linux/nfs_page.h @@ -34,6 +34,7 @@ enum {  	PG_NEED_COMMIT,  	PG_NEED_RESCHED,  	PG_PNFS_COMMIT, +	PG_PARTIAL_READ_FAILED,  };  struct nfs_inode; diff --git a/include/linux/nfs_xdr.h b/include/linux/nfs_xdr.h index abd615d74a2..c74595ba709 100644 --- a/include/linux/nfs_xdr.h +++ b/include/linux/nfs_xdr.h @@ -1133,7 +1133,6 @@ struct nfs_page;  #define NFS_PAGEVEC_SIZE	(8U)  struct nfs_read_data { -	int			flags;  	struct rpc_task		task;  	struct inode		*inode;  	struct rpc_cred		*cred; @@ -1156,7 +1155,6 @@ struct nfs_read_data {  };  struct nfs_write_data { -	int			flags;  	struct rpc_task		task;  	struct inode		*inode;  	struct rpc_cred		*cred; @@ -1197,9 +1195,6 @@ struct nfs_rpc_ops {  	int	(*getroot) (struct nfs_server *, struct nfs_fh *,  			    struct nfs_fsinfo *); -	int	(*lookupfh)(struct nfs_server *, struct nfs_fh *, -			    struct qstr *, struct nfs_fh *, -			    struct nfs_fattr *);  	int	(*getattr) (struct nfs_server *, struct nfs_fh *,  			    struct nfs_fattr *);  	int	(*setattr) (struct dentry *, struct nfs_fattr *, diff --git a/include/linux/nfsd/Kbuild b/include/linux/nfsd/Kbuild index 55d1467de3c..b8d4001212b 100644 --- a/include/linux/nfsd/Kbuild +++ b/include/linux/nfsd/Kbuild @@ -1,6 +1,4 @@ -header-y += const.h  header-y += debug.h  header-y += export.h  header-y += nfsfh.h  header-y += stats.h -header-y += syscall.h diff --git a/include/linux/nfsd/const.h b/include/linux/nfsd/const.h deleted file mode 100644 index 323f8cfa060..00000000000 --- a/include/linux/nfsd/const.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * include/linux/nfsd/const.h - * - * Various constants related to NFS. - * - * Copyright (C) 1995-1997 Olaf Kirch <okir@monad.swb.de> - */ - -#ifndef _LINUX_NFSD_CONST_H -#define _LINUX_NFSD_CONST_H - -#include <linux/nfs.h> -#include <linux/nfs2.h> -#include <linux/nfs3.h> -#include <linux/nfs4.h> - -/* - * Maximum protocol version supported by knfsd - */ -#define NFSSVC_MAXVERS		3 - -/* - * Maximum blocksizes supported by daemon under various circumstances. - */ -#define NFSSVC_MAXBLKSIZE	RPCSVC_MAXPAYLOAD -/* NFSv2 is limited by the protocol specification, see RFC 1094 */ -#define NFSSVC_MAXBLKSIZE_V2	(8*1024) - -#ifdef __KERNEL__ - -#include <linux/sunrpc/msg_prot.h> - -/* - * Largest number of bytes we need to allocate for an NFS - * call or reply.  Used to control buffer sizes.  We use - * the length of v3 WRITE, READDIR and READDIR replies - * which are an RPC header, up to 26 XDR units of reply - * data, and some page data. - * - * Note that accuracy here doesn't matter too much as the - * size is rounded up to a page size when allocating space. - */ -#define NFSD_BUFSIZE		((RPC_MAX_HEADER_WITH_AUTH+26)*XDR_UNIT + NFSSVC_MAXBLKSIZE) - -#ifdef CONFIG_NFSD_V4 -# define NFSSVC_XDRSIZE		NFS4_SVC_XDRSIZE -#elif defined(CONFIG_NFSD_V3) -# define NFSSVC_XDRSIZE		NFS3_SVC_XDRSIZE -#else -# define NFSSVC_XDRSIZE		NFS2_SVC_XDRSIZE -#endif - -#endif /* __KERNEL__ */ - -#endif /* _LINUX_NFSD_CONST_H */ diff --git a/include/linux/nfsd/export.h b/include/linux/nfsd/export.h index 8a31a20efe7..f85308e688f 100644 --- a/include/linux/nfsd/export.h +++ b/include/linux/nfsd/export.h @@ -96,7 +96,6 @@ struct svc_export {  	struct auth_domain *	ex_client;  	int			ex_flags;  	struct path		ex_path; -	char			*ex_pathname;  	uid_t			ex_anon_uid;  	gid_t			ex_anon_gid;  	int			ex_fsid; @@ -137,6 +136,7 @@ struct svc_export *	rqst_exp_get_by_name(struct svc_rqst *,  					     struct path *);  struct svc_export *	rqst_exp_parent(struct svc_rqst *,  					struct path *); +struct svc_export *	rqst_find_fsidzero_export(struct svc_rqst *);  int			exp_rootfh(struct auth_domain *,   					char *path, struct knfsd_fh *, int maxsize);  __be32			exp_pseudoroot(struct svc_rqst *, struct svc_fh *); diff --git a/include/linux/nfsd/nfsfh.h b/include/linux/nfsd/nfsfh.h index f76d80ccec1..ce4743a2601 100644 --- a/include/linux/nfsd/nfsfh.h +++ b/include/linux/nfsd/nfsfh.h @@ -14,11 +14,14 @@  #ifndef _LINUX_NFSD_FH_H  #define _LINUX_NFSD_FH_H -# include <linux/types.h> +#include <linux/types.h> +#include <linux/nfs.h> +#include <linux/nfs2.h> +#include <linux/nfs3.h> +#include <linux/nfs4.h>  #ifdef __KERNEL__  # include <linux/sunrpc/svc.h>  #endif -#include <linux/nfsd/const.h>  /*   * This is the old "dentry style" Linux NFSv2 file handle. diff --git a/include/linux/nfsd/syscall.h b/include/linux/nfsd/syscall.h deleted file mode 100644 index 812bc1e160d..00000000000 --- a/include/linux/nfsd/syscall.h +++ /dev/null @@ -1,116 +0,0 @@ -/* - * include/linux/nfsd/syscall.h - * - * This file holds all declarations for the knfsd syscall interface. - * - * Copyright (C) 1995-1997 Olaf Kirch <okir@monad.swb.de> - */ - -#ifndef NFSD_SYSCALL_H -#define NFSD_SYSCALL_H - -#include <linux/types.h> -#include <linux/nfsd/export.h> - -/* - * Version of the syscall interface - */ -#define NFSCTL_VERSION		0x0201 - -/* - * These are the commands understood by nfsctl(). - */ -#define NFSCTL_SVC		0	/* This is a server process. */ -#define NFSCTL_ADDCLIENT	1	/* Add an NFS client. */ -#define NFSCTL_DELCLIENT	2	/* Remove an NFS client. */ -#define NFSCTL_EXPORT		3	/* export a file system. */ -#define NFSCTL_UNEXPORT		4	/* unexport a file system. */ -/*#define NFSCTL_UGIDUPDATE	5	/ * update a client's uid/gid map. DISCARDED */ -/*#define NFSCTL_GETFH		6	/ * get an fh by ino DISCARDED */ -#define NFSCTL_GETFD		7	/* get an fh by path (used by mountd) */ -#define	NFSCTL_GETFS		8	/* get an fh by path with max FH len */ - -/* SVC */ -struct nfsctl_svc { -	unsigned short		svc_port; -	int			svc_nthreads; -}; - -/* ADDCLIENT/DELCLIENT */ -struct nfsctl_client { -	char			cl_ident[NFSCLNT_IDMAX+1]; -	int			cl_naddr; -	struct in_addr		cl_addrlist[NFSCLNT_ADDRMAX]; -	int			cl_fhkeytype; -	int			cl_fhkeylen; -	unsigned char		cl_fhkey[NFSCLNT_KEYMAX]; -}; - -/* EXPORT/UNEXPORT */ -struct nfsctl_export { -	char			ex_client[NFSCLNT_IDMAX+1]; -	char			ex_path[NFS_MAXPATHLEN+1]; -	__kernel_old_dev_t	ex_dev; -	__kernel_ino_t		ex_ino; -	int			ex_flags; -	__kernel_uid_t		ex_anon_uid; -	__kernel_gid_t		ex_anon_gid; -}; - -/* GETFD */ -struct nfsctl_fdparm { -	struct sockaddr		gd_addr; -	char			gd_path[NFS_MAXPATHLEN+1]; -	int			gd_version; -}; - -/* GETFS - GET Filehandle with Size */ -struct nfsctl_fsparm { -	struct sockaddr		gd_addr; -	char			gd_path[NFS_MAXPATHLEN+1]; -	int			gd_maxlen; -}; - -/* - * This is the argument union. - */ -struct nfsctl_arg { -	int			ca_version;	/* safeguard */ -	union { -		struct nfsctl_svc	u_svc; -		struct nfsctl_client	u_client; -		struct nfsctl_export	u_export; -		struct nfsctl_fdparm	u_getfd; -		struct nfsctl_fsparm	u_getfs; -		/* -		 * The following dummy member is needed to preserve binary compatibility -		 * on platforms where alignof(void*)>alignof(int).  It's needed because -		 * this union used to contain a member (u_umap) which contained a -		 * pointer. -		 */ -		void *u_ptr; -	} u; -#define ca_svc		u.u_svc -#define ca_client	u.u_client -#define ca_export	u.u_export -#define ca_getfd	u.u_getfd -#define	ca_getfs	u.u_getfs -}; - -union nfsctl_res { -	__u8			cr_getfh[NFS_FHSIZE]; -	struct knfsd_fh		cr_getfs; -}; - -#ifdef __KERNEL__ -/* - * Kernel syscall implementation. - */ -extern int		exp_addclient(struct nfsctl_client *ncp); -extern int		exp_delclient(struct nfsctl_client *ncp); -extern int		exp_export(struct nfsctl_export *nxp); -extern int		exp_unexport(struct nfsctl_export *nxp); - -#endif /* __KERNEL__ */ - -#endif /* NFSD_SYSCALL_H */ diff --git a/include/linux/nl80211.h b/include/linux/nl80211.h index 8ad70dcac3f..8049bf77d79 100644 --- a/include/linux/nl80211.h +++ b/include/linux/nl80211.h @@ -161,6 +161,13 @@   * @NL80211_CMD_SET_BEACON: set the beacon on an access point interface   *	using the %NL80211_ATTR_BEACON_INTERVAL, %NL80211_ATTR_DTIM_PERIOD,   *	%NL80211_ATTR_BEACON_HEAD and %NL80211_ATTR_BEACON_TAIL attributes. + *	Following attributes are provided for drivers that generate full Beacon + *	and Probe Response frames internally: %NL80211_ATTR_SSID, + *	%NL80211_ATTR_HIDDEN_SSID, %NL80211_ATTR_CIPHERS_PAIRWISE, + *	%NL80211_ATTR_CIPHER_GROUP, %NL80211_ATTR_WPA_VERSIONS, + *	%NL80211_ATTR_AKM_SUITES, %NL80211_ATTR_PRIVACY, + *	%NL80211_ATTR_AUTH_TYPE, %NL80211_ATTR_IE, %NL80211_ATTR_IE_PROBE_RESP, + *	%NL80211_ATTR_IE_ASSOC_RESP.   * @NL80211_CMD_NEW_BEACON: add a new beacon to an access point interface,   *	parameters are like for %NL80211_CMD_SET_BEACON.   * @NL80211_CMD_DEL_BEACON: remove the beacon, stop sending it @@ -231,6 +238,8 @@   *   * @NL80211_CMD_GET_SCAN: get scan results   * @NL80211_CMD_TRIGGER_SCAN: trigger a new scan with the given parameters + *	%NL80211_ATTR_TX_NO_CCK_RATE is used to decide whether to send the + *	probe requests at CCK rate or not.   * @NL80211_CMD_NEW_SCAN_RESULTS: scan notification (as a reply to   *	NL80211_CMD_GET_SCAN and on the "scan" multicast group)   * @NL80211_CMD_SCAN_ABORTED: scan was aborted, for unspecified reasons, @@ -425,6 +434,8 @@   *	specified using %NL80211_ATTR_DURATION. 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_ATTR_TX_NO_CCK_RATE is used to decide whether to send the + *	management frames at CCK rate or not in 2GHz band.   * @NL80211_CMD_FRAME_WAIT_CANCEL: When an off-channel TX was requested, this   *	command may be used with the corresponding cookie to cancel the wait   *	time if it is known that it is no longer necessary. @@ -492,6 +503,12 @@   *	this command may also be sent by the driver as an MLME event to   *	inform userspace of the new replay counter.   * + * @NL80211_CMD_PMKSA_CANDIDATE: This is used as an event to inform userspace + *	of PMKSA caching dandidates. + * + * @NL80211_CMD_TDLS_OPER: Perform a high-level TDLS command (e.g. link setup). + * @NL80211_CMD_TDLS_MGMT: Send a TDLS management frame. + *   * @NL80211_CMD_MAX: highest used command number   * @__NL80211_CMD_AFTER_LAST: internal use   */ @@ -616,6 +633,11 @@ enum nl80211_commands {  	NL80211_CMD_SET_REKEY_OFFLOAD, +	NL80211_CMD_PMKSA_CANDIDATE, + +	NL80211_CMD_TDLS_OPER, +	NL80211_CMD_TDLS_MGMT, +  	/* add new commands above here */  	/* used to define NL80211_CMD_MAX below */ @@ -762,6 +784,8 @@ enum nl80211_commands {   *	that can be added to a scan request   * @NL80211_ATTR_MAX_SCHED_SCAN_IE_LEN: maximum length of information   *	elements that can be added to a scheduled scan request + * @NL80211_ATTR_MAX_MATCH_SETS: maximum number of sets that can be + *	used with @NL80211_ATTR_SCHED_SCAN_MATCH, a wiphy attribute.   *   * @NL80211_ATTR_SCAN_FREQUENCIES: nested attribute with frequencies (in MHz)   * @NL80211_ATTR_SCAN_SSIDS: nested attribute with SSIDs, leave out for passive @@ -842,18 +866,20 @@ enum nl80211_commands {   * @NL80211_ATTR_STATUS_CODE: StatusCode for the %NL80211_CMD_CONNECT   *	event (u16)   * @NL80211_ATTR_PRIVACY: Flag attribute, used with connect(), indicating - *	that protected APs should be used. + *	that protected APs should be used. This is also used with NEW_BEACON to + *	indicate that the BSS is to use protection.   * - * @NL80211_ATTR_CIPHERS_PAIRWISE: Used with CONNECT and ASSOCIATE to - *	indicate which unicast key ciphers will be used with the connection + * @NL80211_ATTR_CIPHERS_PAIRWISE: Used with CONNECT, ASSOCIATE, and NEW_BEACON + *	to indicate which unicast key ciphers will be used with the connection   *	(an array of u32). - * @NL80211_ATTR_CIPHER_GROUP: Used with CONNECT and ASSOCIATE to indicate - *	which group key cipher will be used with the connection (a u32). - * @NL80211_ATTR_WPA_VERSIONS: Used with CONNECT and ASSOCIATE to indicate - *	which WPA version(s) the AP we want to associate with is using + * @NL80211_ATTR_CIPHER_GROUP: Used with CONNECT, ASSOCIATE, and NEW_BEACON to + *	indicate which group key cipher will be used with the connection (a + *	u32). + * @NL80211_ATTR_WPA_VERSIONS: Used with CONNECT, ASSOCIATE, and NEW_BEACON to + *	indicate which WPA version(s) the AP we want to associate with is using   *	(a u32 with flags from &enum nl80211_wpa_versions). - * @NL80211_ATTR_AKM_SUITES: Used with CONNECT and ASSOCIATE to indicate - *	which key management algorithm(s) to use (an array of u32). + * @NL80211_ATTR_AKM_SUITES: Used with CONNECT, ASSOCIATE, and NEW_BEACON to + *	indicate which key management algorithm(s) to use (an array of u32).   *   * @NL80211_ATTR_REQ_IE: (Re)association request information elements as   *	sent out by the card, for ROAM and successful CONNECT events. @@ -1002,6 +1028,24 @@ enum nl80211_commands {   * @NL80211_ATTR_SCHED_SCAN_INTERVAL: Interval between scheduled scan   *	cycles, in msecs. + + * @NL80211_ATTR_SCHED_SCAN_MATCH: Nested attribute with one or more + *	sets of attributes to match during scheduled scans.  Only BSSs + *	that match any of the sets will be reported.  These are + *	pass-thru filter rules. + *	For a match to succeed, the BSS must match all attributes of a + *	set.  Since not every hardware supports matching all types of + *	attributes, there is no guarantee that the reported BSSs are + *	fully complying with the match sets and userspace needs to be + *	able to ignore them by itself. + *	Thus, the implementation is somewhat hardware-dependent, but + *	this is only an optimization and the userspace application + *	needs to handle all the non-filtered results anyway. + *	If the match attributes don't make sense when combined with + *	the values passed in @NL80211_ATTR_SCAN_SSIDS (eg. if an SSID + *	is included in the probe request, but the match attributes + *	will never let it go through), -EINVAL may be returned. + *	If ommited, no filtering is done.   *   * @NL80211_ATTR_INTERFACE_COMBINATIONS: Nested attribute listing the supported   *	interface combinations. In each nested item, it contains attributes @@ -1019,6 +1063,52 @@ enum nl80211_commands {   *	being a list of supported rates as defined by IEEE 802.11 7.3.2.2 but   *	without the length restriction (at most %NL80211_MAX_SUPP_RATES).   * + * @NL80211_ATTR_HIDDEN_SSID: indicates whether SSID is to be hidden from Beacon + *	and Probe Response (when response to wildcard Probe Request); see + *	&enum nl80211_hidden_ssid, represented as a u32 + * + * @NL80211_ATTR_IE_PROBE_RESP: Information element(s) for Probe Response frame. + *	This is used with %NL80211_CMD_NEW_BEACON and %NL80211_CMD_SET_BEACON to + *	provide extra IEs (e.g., WPS/P2P IE) into Probe Response frames when the + *	driver (or firmware) replies to Probe Request frames. + * @NL80211_ATTR_IE_ASSOC_RESP: Information element(s) for (Re)Association + *	Response frames. This is used with %NL80211_CMD_NEW_BEACON and + *	%NL80211_CMD_SET_BEACON to provide extra IEs (e.g., WPS/P2P IE) into + *	(Re)Association Response frames when the driver (or firmware) replies to + *	(Re)Association Request frames. + * + * @NL80211_ATTR_STA_WME: Nested attribute containing the wme configuration + *	of the station, see &enum nl80211_sta_wme_attr. + * @NL80211_ATTR_SUPPORT_AP_UAPSD: the device supports uapsd when working + *	as AP. + * + * @NL80211_ATTR_ROAM_SUPPORT: Indicates whether the firmware is capable of + *	roaming to another AP in the same ESS if the signal lever is low. + * + * @NL80211_ATTR_PMKSA_CANDIDATE: Nested attribute containing the PMKSA caching + *	candidate information, see &enum nl80211_pmksa_candidate_attr. + * + * @NL80211_ATTR_TX_NO_CCK_RATE: Indicates whether to use CCK rate or not + *	for management frames transmission. In order to avoid p2p probe/action + *	frames are being transmitted at CCK rate in 2GHz band, the user space + *	applications use this attribute. + *	This attribute is used with %NL80211_CMD_TRIGGER_SCAN and + *	%NL80211_CMD_FRAME commands. + * + * @NL80211_ATTR_TDLS_ACTION: Low level TDLS action code (e.g. link setup + *	request, link setup confirm, link teardown, etc.). Values are + *	described in the TDLS (802.11z) specification. + * @NL80211_ATTR_TDLS_DIALOG_TOKEN: Non-zero token for uniquely identifying a + *	TDLS conversation between two devices. + * @NL80211_ATTR_TDLS_OPERATION: High level TDLS operation; see + *	&enum nl80211_tdls_operation, represented as a u8. + * @NL80211_ATTR_TDLS_SUPPORT: A flag indicating the device can operate + *	as a TDLS peer sta. + * @NL80211_ATTR_TDLS_EXTERNAL_SETUP: The TDLS discovery/setup and teardown + *	procedures should be performed by sending TDLS packets via + *	%NL80211_CMD_TDLS_MGMT. Otherwise %NL80211_CMD_TDLS_OPER should be + *	used for asking the driver to perform a TDLS operation. + *   * @NL80211_ATTR_MAX: highest attribute number currently defined   * @__NL80211_ATTR_AFTER_LAST: internal use   */ @@ -1224,6 +1314,29 @@ enum nl80211_attrs {  	NL80211_ATTR_SCAN_SUPP_RATES, +	NL80211_ATTR_HIDDEN_SSID, + +	NL80211_ATTR_IE_PROBE_RESP, +	NL80211_ATTR_IE_ASSOC_RESP, + +	NL80211_ATTR_STA_WME, +	NL80211_ATTR_SUPPORT_AP_UAPSD, + +	NL80211_ATTR_ROAM_SUPPORT, + +	NL80211_ATTR_SCHED_SCAN_MATCH, +	NL80211_ATTR_MAX_MATCH_SETS, + +	NL80211_ATTR_PMKSA_CANDIDATE, + +	NL80211_ATTR_TX_NO_CCK_RATE, + +	NL80211_ATTR_TDLS_ACTION, +	NL80211_ATTR_TDLS_DIALOG_TOKEN, +	NL80211_ATTR_TDLS_OPERATION, +	NL80211_ATTR_TDLS_SUPPORT, +	NL80211_ATTR_TDLS_EXTERNAL_SETUP, +  	/* add attributes here, update the policy in nl80211.c */  	__NL80211_ATTR_AFTER_LAST, @@ -1321,6 +1434,7 @@ enum nl80211_iftype {   * @NL80211_STA_FLAG_WME: station is WME/QoS capable   * @NL80211_STA_FLAG_MFP: station uses management frame protection   * @NL80211_STA_FLAG_AUTHENTICATED: station is authenticated + * @NL80211_STA_FLAG_TDLS_PEER: station is a TDLS peer   * @NL80211_STA_FLAG_MAX: highest station flag number currently defined   * @__NL80211_STA_FLAG_AFTER_LAST: internal use   */ @@ -1331,6 +1445,7 @@ enum nl80211_sta_flags {  	NL80211_STA_FLAG_WME,  	NL80211_STA_FLAG_MFP,  	NL80211_STA_FLAG_AUTHENTICATED, +	NL80211_STA_FLAG_TDLS_PEER,  	/* keep last */  	__NL80211_STA_FLAG_AFTER_LAST, @@ -1433,6 +1548,7 @@ enum nl80211_sta_bss_param {   * @NL80211_STA_INFO_BSS_PARAM: current station's view of BSS, nested attribute   *     containing info as possible, see &enum nl80211_sta_bss_param   * @NL80211_STA_INFO_CONNECTED_TIME: time since the station is last connected + * @NL80211_STA_INFO_STA_FLAGS: Contains a struct nl80211_sta_flag_update.   * @__NL80211_STA_INFO_AFTER_LAST: internal   * @NL80211_STA_INFO_MAX: highest possible station info attribute   */ @@ -1454,6 +1570,7 @@ enum nl80211_sta_info {  	NL80211_STA_INFO_RX_BITRATE,  	NL80211_STA_INFO_BSS_PARAM,  	NL80211_STA_INFO_CONNECTED_TIME, +	NL80211_STA_INFO_STA_FLAGS,  	/* keep last */  	__NL80211_STA_INFO_AFTER_LAST, @@ -1683,6 +1800,26 @@ enum nl80211_reg_rule_attr {  };  /** + * enum nl80211_sched_scan_match_attr - scheduled scan match attributes + * @__NL80211_SCHED_SCAN_MATCH_ATTR_INVALID: attribute number 0 is reserved + * @NL80211_SCHED_SCAN_MATCH_ATTR_SSID: SSID to be used for matching, + * only report BSS with matching SSID. + * @NL80211_SCHED_SCAN_MATCH_ATTR_MAX: highest scheduled scan filter + *	attribute number currently defined + * @__NL80211_SCHED_SCAN_MATCH_ATTR_AFTER_LAST: internal use + */ +enum nl80211_sched_scan_match_attr { +	__NL80211_SCHED_SCAN_MATCH_ATTR_INVALID, + +	NL80211_ATTR_SCHED_SCAN_MATCH_SSID, + +	/* keep last */ +	__NL80211_SCHED_SCAN_MATCH_ATTR_AFTER_LAST, +	NL80211_SCHED_SCAN_MATCH_ATTR_MAX = +		__NL80211_SCHED_SCAN_MATCH_ATTR_AFTER_LAST - 1 +}; + +/**   * enum nl80211_reg_rule_flags - regulatory rule flags   *   * @NL80211_RRF_NO_OFDM: OFDM modulation not allowed @@ -1833,6 +1970,13 @@ enum nl80211_mntr_flags {   * @NL80211_MESHCONF_ELEMENT_TTL: specifies the value of TTL field set at a   * source mesh point for path selection elements.   * + * @NL80211_MESHCONF_HWMP_RANN_INTERVAL:  The interval of time (in TUs) between + * root announcements are transmitted. + * + * @NL80211_MESHCONF_GATE_ANNOUNCEMENTS: Advertise that this mesh station has + * access to a broader network beyond the MBSS.  This is done via Root + * Announcement frames. + *   * @NL80211_MESHCONF_ATTR_MAX: highest possible mesh configuration attribute   *   * @__NL80211_MESHCONF_ATTR_AFTER_LAST: internal use @@ -1854,6 +1998,8 @@ enum nl80211_meshconf_params {  	NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME,  	NL80211_MESHCONF_HWMP_ROOTMODE,  	NL80211_MESHCONF_ELEMENT_TTL, +	NL80211_MESHCONF_HWMP_RANN_INTERVAL, +	NL80211_MESHCONF_GATE_ANNOUNCEMENTS,  	/* keep last */  	__NL80211_MESHCONF_ATTR_AFTER_LAST, @@ -2430,4 +2576,78 @@ enum nl80211_rekey_data {  	MAX_NL80211_REKEY_DATA = NUM_NL80211_REKEY_DATA - 1  }; +/** + * enum nl80211_hidden_ssid - values for %NL80211_ATTR_HIDDEN_SSID + * @NL80211_HIDDEN_SSID_NOT_IN_USE: do not hide SSID (i.e., broadcast it in + *	Beacon frames) + * @NL80211_HIDDEN_SSID_ZERO_LEN: hide SSID by using zero-length SSID element + *	in Beacon frames + * @NL80211_HIDDEN_SSID_ZERO_CONTENTS: hide SSID by using correct length of SSID + *	element in Beacon frames but zero out each byte in the SSID + */ +enum nl80211_hidden_ssid { +	NL80211_HIDDEN_SSID_NOT_IN_USE, +	NL80211_HIDDEN_SSID_ZERO_LEN, +	NL80211_HIDDEN_SSID_ZERO_CONTENTS +}; + +/** + * enum nl80211_sta_wme_attr - station WME attributes + * @__NL80211_STA_WME_INVALID: invalid number for nested attribute + * @NL80211_STA_WME_UAPSD_QUEUES: bitmap of uapsd queues. the format + *	is the same as the AC bitmap in the QoS info field. + * @NL80211_STA_WME_MAX_SP: max service period. the format is the same + *	as the MAX_SP field in the QoS info field (but already shifted down). + * @__NL80211_STA_WME_AFTER_LAST: internal + * @NL80211_STA_WME_MAX: highest station WME attribute + */ +enum nl80211_sta_wme_attr { +	__NL80211_STA_WME_INVALID, +	NL80211_STA_WME_UAPSD_QUEUES, +	NL80211_STA_WME_MAX_SP, + +	/* keep last */ +	__NL80211_STA_WME_AFTER_LAST, +	NL80211_STA_WME_MAX = __NL80211_STA_WME_AFTER_LAST - 1 +}; + +/** + * enum nl80211_pmksa_candidate_attr - attributes for PMKSA caching candidates + * @__NL80211_PMKSA_CANDIDATE_INVALID: invalid number for nested attributes + * @NL80211_PMKSA_CANDIDATE_INDEX: candidate index (u32; the smaller, the higher + *	priority) + * @NL80211_PMKSA_CANDIDATE_BSSID: candidate BSSID (6 octets) + * @NL80211_PMKSA_CANDIDATE_PREAUTH: RSN pre-authentication supported (flag) + * @NUM_NL80211_PMKSA_CANDIDATE: number of PMKSA caching candidate attributes + *	(internal) + * @MAX_NL80211_PMKSA_CANDIDATE: highest PMKSA caching candidate attribute + *	(internal) + */ +enum nl80211_pmksa_candidate_attr { +	__NL80211_PMKSA_CANDIDATE_INVALID, +	NL80211_PMKSA_CANDIDATE_INDEX, +	NL80211_PMKSA_CANDIDATE_BSSID, +	NL80211_PMKSA_CANDIDATE_PREAUTH, + +	/* keep last */ +	NUM_NL80211_PMKSA_CANDIDATE, +	MAX_NL80211_PMKSA_CANDIDATE = NUM_NL80211_PMKSA_CANDIDATE - 1 +}; + +/** + * enum nl80211_tdls_operation - values for %NL80211_ATTR_TDLS_OPERATION + * @NL80211_TDLS_DISCOVERY_REQ: Send a TDLS discovery request + * @NL80211_TDLS_SETUP: Setup TDLS link + * @NL80211_TDLS_TEARDOWN: Teardown a TDLS link which is already established + * @NL80211_TDLS_ENABLE_LINK: Enable TDLS link + * @NL80211_TDLS_DISABLE_LINK: Disable TDLS link + */ +enum nl80211_tdls_operation { +	NL80211_TDLS_DISCOVERY_REQ, +	NL80211_TDLS_SETUP, +	NL80211_TDLS_TEARDOWN, +	NL80211_TDLS_ENABLE_LINK, +	NL80211_TDLS_DISABLE_LINK, +}; +  #endif /* __LINUX_NL80211_H */ diff --git a/include/linux/of.h b/include/linux/of.h index 9180dc5cb00..0e89aa0bf07 100644 --- a/include/linux/of.h +++ b/include/linux/of.h @@ -17,6 +17,7 @@   */  #include <linux/types.h>  #include <linux/bitops.h> +#include <linux/errno.h>  #include <linux/kref.h>  #include <linux/mod_devicetable.h>  #include <linux/spinlock.h> @@ -68,6 +69,7 @@ struct device_node {  /* Pointer for first entry in chain of all nodes. */  extern struct device_node *allnodes;  extern struct device_node *of_chosen; +extern struct device_node *of_aliases;  extern rwlock_t devtree_lock;  static inline bool of_have_populated_dt(void) @@ -199,16 +201,26 @@ extern int of_property_read_u32_array(const struct device_node *np,  				      const char *propname,  				      u32 *out_values,  				      size_t sz); +extern int of_property_read_u64(const struct device_node *np, +				const char *propname, u64 *out_value);  extern int of_property_read_string(struct device_node *np,  				   const char *propname,  				   const char **out_string); +extern int of_property_read_string_index(struct device_node *np, +					 const char *propname, +					 int index, const char **output); +extern int of_property_count_strings(struct device_node *np, +				     const char *propname);  extern int of_device_is_compatible(const struct device_node *device,  				   const char *);  extern int of_device_is_available(const struct device_node *device);  extern const void *of_get_property(const struct device_node *node,  				const char *name,  				int *lenp); +#define for_each_property(pp, properties) \ +	for (pp = properties; pp != NULL; pp = pp->next) +  extern int of_n_addr_cells(struct device_node *np);  extern int of_n_size_cells(struct device_node *np);  extern const struct of_device_id *of_match_node( @@ -221,6 +233,9 @@ 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 void of_alias_scan(void * (*dt_alloc)(u64 size, u64 align)); +extern int of_alias_get_id(struct device_node *np, const char *stem); +  extern int of_machine_is_compatible(const char *compat);  extern int prom_add_property(struct device_node* np, struct property* prop); @@ -235,6 +250,7 @@ extern void of_attach_node(struct device_node *);  extern void of_detach_node(struct device_node *);  #endif +#define of_match_ptr(_ptr)	(_ptr)  #else /* CONFIG_OF */  static inline bool of_have_populated_dt(void) @@ -242,6 +258,22 @@ static inline bool of_have_populated_dt(void)  	return false;  } +#define for_each_child_of_node(parent, child) \ +	while (0) + +static inline int of_device_is_compatible(const struct device_node *device, +					  const char *name) +{ +	return 0; +} + +static inline struct property *of_find_property(const struct device_node *np, +						const char *name, +						int *lenp) +{ +	return NULL; +} +  static inline int of_property_read_u32_array(const struct device_node *np,  					     const char *propname,  					     u32 *out_values, size_t sz) @@ -256,6 +288,19 @@ static inline int of_property_read_string(struct device_node *np,  	return -ENOSYS;  } +static inline int of_property_read_string_index(struct device_node *np, +						const char *propname, int index, +						const char **out_string) +{ +	return -ENOSYS; +} + +static inline int of_property_count_strings(struct device_node *np, +					    const char *propname) +{ +	return -ENOSYS; +} +  static inline const void *of_get_property(const struct device_node *node,  				const char *name,  				int *lenp) @@ -263,6 +308,31 @@ static inline const void *of_get_property(const struct device_node *node,  	return NULL;  } +static inline int of_property_read_u64(const struct device_node *np, +				       const char *propname, u64 *out_value) +{ +	return -ENOSYS; +} + +static inline struct device_node *of_parse_phandle(struct device_node *np, +						   const char *phandle_name, +						   int index) +{ +	return NULL; +} + +static inline int of_alias_get_id(struct device_node *np, const char *stem) +{ +	return -ENOSYS; +} + +static inline int of_machine_is_compatible(const char *compat) +{ +	return 0; +} + +#define of_match_ptr(_ptr)	NULL +#define of_match_node(_matches, _node)	NULL  #endif /* CONFIG_OF */  static inline int of_property_read_u32(const struct device_node *np, diff --git a/include/linux/of_irq.h b/include/linux/of_irq.h index cd2e61ce4e8..d0307eed20c 100644 --- a/include/linux/of_irq.h +++ b/include/linux/of_irq.h @@ -33,6 +33,8 @@ struct of_irq {  	u32 specifier[OF_MAX_IRQ_SPEC]; /* Specifier copy */  }; +typedef int (*of_irq_init_cb_t)(struct device_node *, struct device_node *); +  /*   * Workarounds only applied to 32bit powermac machines   */ @@ -73,6 +75,7 @@ extern int of_irq_to_resource_table(struct device_node *dev,  		struct resource *res, int nr_irqs);  extern struct device_node *of_irq_find_parent(struct device_node *child); +extern void of_irq_init(const struct of_device_id *matches);  #endif /* CONFIG_OF_IRQ */  #endif /* CONFIG_OF */ diff --git a/include/linux/omap3isp.h b/include/linux/omap3isp.h index b6111f8cd49..c73a34c3434 100644 --- a/include/linux/omap3isp.h +++ b/include/linux/omap3isp.h @@ -62,14 +62,12 @@   * V4L2_EVENT_OMAP3ISP_AEWB: AEWB statistics data ready   * V4L2_EVENT_OMAP3ISP_AF: AF statistics data ready   * V4L2_EVENT_OMAP3ISP_HIST: Histogram statistics data ready - * V4L2_EVENT_OMAP3ISP_HS_VS: Horizontal/vertical synchronization detected   */  #define V4L2_EVENT_OMAP3ISP_CLASS	(V4L2_EVENT_PRIVATE_START | 0x100)  #define V4L2_EVENT_OMAP3ISP_AEWB	(V4L2_EVENT_OMAP3ISP_CLASS | 0x1)  #define V4L2_EVENT_OMAP3ISP_AF		(V4L2_EVENT_OMAP3ISP_CLASS | 0x2)  #define V4L2_EVENT_OMAP3ISP_HIST	(V4L2_EVENT_OMAP3ISP_CLASS | 0x3) -#define V4L2_EVENT_OMAP3ISP_HS_VS	(V4L2_EVENT_OMAP3ISP_CLASS | 0x4)  struct omap3isp_stat_event_status {  	__u32 frame_number; diff --git a/include/linux/oom.h b/include/linux/oom.h index 13b7b02e599..6f9d04a8533 100644 --- a/include/linux/oom.h +++ b/include/linux/oom.h @@ -40,6 +40,7 @@ enum oom_constraint {  	CONSTRAINT_MEMCG,  }; +extern void compare_swap_oom_score_adj(int old_val, int new_val);  extern int test_set_oom_score_adj(int new_val);  extern unsigned int oom_badness(struct task_struct *p, struct mem_cgroup *mem, diff --git a/include/linux/opp.h b/include/linux/opp.h index 7020e9736fc..ee94b33080c 100644 --- a/include/linux/opp.h +++ b/include/linux/opp.h @@ -16,9 +16,14 @@  #include <linux/err.h>  #include <linux/cpufreq.h> +#include <linux/notifier.h>  struct opp; +enum opp_event { +	OPP_EVENT_ADD, OPP_EVENT_ENABLE, OPP_EVENT_DISABLE, +}; +  #if defined(CONFIG_PM_OPP)  unsigned long opp_get_voltage(struct opp *opp); @@ -40,6 +45,8 @@ int opp_enable(struct device *dev, unsigned long freq);  int opp_disable(struct device *dev, unsigned long freq); +struct srcu_notifier_head *opp_get_notifier(struct device *dev); +  #else  static inline unsigned long opp_get_voltage(struct opp *opp)  { @@ -89,7 +96,12 @@ static inline int opp_disable(struct device *dev, unsigned long freq)  {  	return 0;  } -#endif		/* CONFIG_PM */ + +static inline struct srcu_notifier_head *opp_get_notifier(struct device *dev) +{ +	return ERR_PTR(-EINVAL); +} +#endif		/* CONFIG_PM_OPP */  #if defined(CONFIG_CPU_FREQ) && defined(CONFIG_PM_OPP)  int opp_init_cpufreq_table(struct device *dev, diff --git a/include/linux/oprofile.h b/include/linux/oprofile.h index 49c8727eeb5..a4c562453f6 100644 --- a/include/linux/oprofile.h +++ b/include/linux/oprofile.h @@ -166,7 +166,7 @@ ssize_t oprofilefs_ulong_to_user(unsigned long val, char __user * buf, size_t co  int oprofilefs_ulong_from_user(unsigned long * val, char const __user * buf, size_t count);  /** lock for read/write safety */ -extern spinlock_t oprofilefs_lock; +extern raw_spinlock_t oprofilefs_lock;  /**   * Add the contents of a circular buffer to the event buffer. diff --git a/include/linux/pci-ats.h b/include/linux/pci-ats.h index 655824fa4c7..e3d0b389024 100644 --- a/include/linux/pci-ats.h +++ b/include/linux/pci-ats.h @@ -1,6 +1,8 @@  #ifndef LINUX_PCI_ATS_H  #define LINUX_PCI_ATS_H +#include <linux/pci.h> +  /* Address Translation Service */  struct pci_ats {  	int pos;        /* capability position */ @@ -15,6 +17,7 @@ struct pci_ats {  extern int pci_enable_ats(struct pci_dev *dev, int ps);  extern void pci_disable_ats(struct pci_dev *dev);  extern int pci_ats_queue_depth(struct pci_dev *dev); +  /**   * pci_ats_enabled - query the ATS status   * @dev: the PCI device @@ -49,4 +52,76 @@ static inline int pci_ats_enabled(struct pci_dev *dev)  #endif /* CONFIG_PCI_IOV */ +#ifdef CONFIG_PCI_PRI + +extern int  pci_enable_pri(struct pci_dev *pdev, u32 reqs); +extern void pci_disable_pri(struct pci_dev *pdev); +extern bool pci_pri_enabled(struct pci_dev *pdev); +extern int  pci_reset_pri(struct pci_dev *pdev); +extern bool pci_pri_stopped(struct pci_dev *pdev); +extern int  pci_pri_status(struct pci_dev *pdev); + +#else /* CONFIG_PCI_PRI */ + +static inline int pci_enable_pri(struct pci_dev *pdev, u32 reqs) +{ +	return -ENODEV; +} + +static inline void pci_disable_pri(struct pci_dev *pdev) +{ +} + +static inline bool pci_pri_enabled(struct pci_dev *pdev) +{ +	return false; +} + +static inline int pci_reset_pri(struct pci_dev *pdev) +{ +	return -ENODEV; +} + +static inline bool pci_pri_stopped(struct pci_dev *pdev) +{ +	return true; +} + +static inline int pci_pri_status(struct pci_dev *pdev) +{ +	return -ENODEV; +} +#endif /* CONFIG_PCI_PRI */ + +#ifdef CONFIG_PCI_PASID + +extern int pci_enable_pasid(struct pci_dev *pdev, int features); +extern void pci_disable_pasid(struct pci_dev *pdev); +extern int pci_pasid_features(struct pci_dev *pdev); +extern int pci_max_pasids(struct pci_dev *pdev); + +#else  /* CONFIG_PCI_PASID */ + +static inline int pci_enable_pasid(struct pci_dev *pdev, int features) +{ +	return -EINVAL; +} + +static inline void pci_disable_pasid(struct pci_dev *pdev) +{ +} + +static inline int pci_pasid_features(struct pci_dev *pdev) +{ +	return -EINVAL; +} + +static inline int pci_max_pasids(struct pci_dev *pdev) +{ +	return -EINVAL; +} + +#endif /* CONFIG_PCI_PASID */ + +  #endif /* LINUX_PCI_ATS_H*/ diff --git a/include/linux/pci.h b/include/linux/pci.h index 8c230cbcbb4..337df0d5d5f 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h @@ -174,6 +174,8 @@ enum pci_dev_flags {  	PCI_DEV_FLAGS_MSI_INTX_DISABLE_BUG = (__force pci_dev_flags_t) 1,  	/* Device configuration is irrevocably lost if disabled into D3 */  	PCI_DEV_FLAGS_NO_D3 = (__force pci_dev_flags_t) 2, +	/* Provide indication device is assigned by a Virtual Machine Manager */ +	PCI_DEV_FLAGS_ASSIGNED = (__force pci_dev_flags_t) 4,  };  enum pci_irq_reroute_variant { @@ -273,6 +275,7 @@ struct pci_dev {  	unsigned int	pme_support:5;	/* Bitmask of states from which PME#  					   can be generated */  	unsigned int	pme_interrupt:1; +	unsigned int	pme_poll:1;	/* Poll device's PME status bit */  	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 */ @@ -621,8 +624,9 @@ struct pci_driver {  extern void pcie_bus_configure_settings(struct pci_bus *bus, u8 smpss);  enum pcie_bus_config_types { -	PCIE_BUS_PERFORMANCE, +	PCIE_BUS_TUNE_OFF,  	PCIE_BUS_SAFE, +	PCIE_BUS_PERFORMANCE,  	PCIE_BUS_PEER2PEER,  }; @@ -954,6 +958,7 @@ void pci_walk_bus(struct pci_bus *top, int (*cb)(struct pci_dev *, void *),  int pci_cfg_space_size_ext(struct pci_dev *dev);  int pci_cfg_space_size(struct pci_dev *dev);  unsigned char pci_bus_max_busnr(struct pci_bus *bus); +void pci_setup_bridge(struct pci_bus *bus);  #define PCI_VGA_STATE_CHANGE_BRIDGE (1 << 0)  #define PCI_VGA_STATE_CHANGE_DECODES (1 << 1) diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h index ae96bbe5451..3fdf251389d 100644 --- a/include/linux/pci_ids.h +++ b/include/linux/pci_ids.h @@ -2302,6 +2302,11 @@  #define PCI_DEVICE_ID_RENESAS_SH7785	0x0007  #define PCI_DEVICE_ID_RENESAS_SH7786	0x0010 +#define PCI_VENDOR_ID_SOLARFLARE	0x1924 +#define PCI_DEVICE_ID_SOLARFLARE_SFC4000A_0	0x0703 +#define PCI_DEVICE_ID_SOLARFLARE_SFC4000A_1	0x6703 +#define PCI_DEVICE_ID_SOLARFLARE_SFC4000B	0x0710 +  #define PCI_VENDOR_ID_TDI               0x192E  #define PCI_DEVICE_ID_TDI_EHCI          0x0101 @@ -2868,3 +2873,5 @@  #define PCI_VENDOR_ID_XEN		0x5853  #define PCI_DEVICE_ID_XEN_PLATFORM	0x0001 + +#define PCI_VENDOR_ID_OCZ		0x1b85 diff --git a/include/linux/pci_regs.h b/include/linux/pci_regs.h index e8840964aca..b5d9657f310 100644 --- a/include/linux/pci_regs.h +++ b/include/linux/pci_regs.h @@ -663,6 +663,26 @@  #define  PCI_ATS_CTRL_STU(x)	((x) & 0x1f)	/* Smallest Translation Unit */  #define  PCI_ATS_MIN_STU	12	/* shift of minimum STU block */ +/* Page Request Interface */ +#define PCI_PRI_CAP		0x13    /* PRI capability ID */ +#define PCI_PRI_CONTROL_OFF	0x04	/* Offset of control register */ +#define PCI_PRI_STATUS_OFF	0x06	/* Offset of status register */ +#define PCI_PRI_ENABLE		0x0001	/* Enable mask */ +#define PCI_PRI_RESET		0x0002	/* Reset bit mask */ +#define PCI_PRI_STATUS_RF	0x0001  /* Request Failure */ +#define PCI_PRI_STATUS_UPRGI	0x0002  /* Unexpected PRG index */ +#define PCI_PRI_STATUS_STOPPED	0x0100  /* PRI Stopped */ +#define PCI_PRI_MAX_REQ_OFF	0x08	/* Cap offset for max reqs supported */ +#define PCI_PRI_ALLOC_REQ_OFF	0x0c	/* Cap offset for max reqs allowed */ + +/* PASID capability */ +#define PCI_PASID_CAP		0x1b    /* PASID capability ID */ +#define PCI_PASID_CAP_OFF	0x04    /* PASID feature register */ +#define PCI_PASID_CONTROL_OFF   0x06    /* PASID control register */ +#define PCI_PASID_ENABLE	0x01	/* Enable/Supported bit */ +#define PCI_PASID_EXEC		0x02	/* Exec permissions Enable/Supported */ +#define PCI_PASID_PRIV		0x04	/* Priviledge Mode Enable/Support */ +  /* Single Root I/O Virtualization */  #define PCI_SRIOV_CAP		0x04	/* SR-IOV Capabilities */  #define  PCI_SRIOV_CAP_VFM	0x01	/* VF Migration Capable */ diff --git a/include/linux/percpu_counter.h b/include/linux/percpu_counter.h index 5edc9014263..b9df9ed1adc 100644 --- a/include/linux/percpu_counter.h +++ b/include/linux/percpu_counter.h @@ -16,7 +16,7 @@  #ifdef CONFIG_SMP  struct percpu_counter { -	spinlock_t lock; +	raw_spinlock_t lock;  	s64 count;  #ifdef CONFIG_HOTPLUG_CPU  	struct list_head list;	/* All percpu_counters are on a list */ diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h index c816075c01c..1e9ebe5e009 100644 --- a/include/linux/perf_event.h +++ b/include/linux/perf_event.h @@ -220,7 +220,10 @@ struct perf_event_attr {  				mmap_data      :  1, /* non-exec mmap data    */  				sample_id_all  :  1, /* sample_type all events */ -				__reserved_1   : 45; +				exclude_host   :  1, /* don't count in host   */ +				exclude_guest  :  1, /* don't count in guest  */ + +				__reserved_1   : 43;  	union {  		__u32		wakeup_events;	  /* wakeup every n events */ diff --git a/include/linux/phonet.h b/include/linux/phonet.h index 6fb13841db4..f53a4167c5f 100644 --- a/include/linux/phonet.h +++ b/include/linux/phonet.h @@ -24,6 +24,7 @@  #define LINUX_PHONET_H  #include <linux/types.h> +#include <linux/socket.h>  /* Automatic protocol selection */  #define PN_PROTO_TRANSPORT	0 @@ -96,11 +97,11 @@ struct phonetmsg {  /* Phonet socket address structure */  struct sockaddr_pn { -	sa_family_t spn_family; +	__kernel_sa_family_t spn_family;  	__u8 spn_obj;  	__u8 spn_dev;  	__u8 spn_resource; -	__u8 spn_zero[sizeof(struct sockaddr) - sizeof(sa_family_t) - 3]; +	__u8 spn_zero[sizeof(struct sockaddr) - sizeof(__kernel_sa_family_t) - 3];  } __attribute__((packed));  /* Well known address */ diff --git a/include/linux/phy.h b/include/linux/phy.h index 54fc4138955..79f337c4738 100644 --- a/include/linux/phy.h +++ b/include/linux/phy.h @@ -420,7 +420,7 @@ struct phy_driver {  	/*  	 * Requests a Tx timestamp for 'skb'. The phy driver promises -	 * to deliver it to the socket's error queue as soon as a +	 * to deliver it using skb_complete_tx_timestamp() as soon as a  	 * timestamp becomes available. One of the PTP_CLASS_ values  	 * is passed in 'type'.  	 */ diff --git a/include/linux/pinctrl/machine.h b/include/linux/pinctrl/machine.h new file mode 100644 index 00000000000..88863531d86 --- /dev/null +++ b/include/linux/pinctrl/machine.h @@ -0,0 +1,107 @@ +/* + * Machine interface for the pinctrl subsystem. + * + * Copyright (C) 2011 ST-Ericsson SA + * Written on behalf of Linaro for ST-Ericsson + * Based on bits of regulator core, gpio core and clk core + * + * Author: Linus Walleij <linus.walleij@linaro.org> + * + * License terms: GNU General Public License (GPL) version 2 + */ +#ifndef __LINUX_PINMUX_MACHINE_H +#define __LINUX_PINMUX_MACHINE_H + +/** + * struct pinmux_map - boards/machines shall provide this map for devices + * @name: the name of this specific map entry for the particular machine. + *	This is the second parameter passed to pinmux_get() when you want + *	to have several mappings to the same device + * @ctrl_dev: the pin control device to be used by this mapping, may be NULL + *	if you provide .ctrl_dev_name instead (this is more common) + * @ctrl_dev_name: the name of the device controlling this specific mapping, + *	the name must be the same as in your struct device*, may be NULL if + *	you provide .ctrl_dev instead + * @function: a function in the driver to use for this mapping, the driver + *	will lookup the function referenced by this ID on the specified + *	pin control device + * @group: sometimes a function can map to different pin groups, so this + *	selects a certain specific pin group to activate for the function, if + *	left as NULL, the first applicable group will be used + * @dev: the device using this specific mapping, may be NULL if you provide + *	.dev_name instead (this is more common) + * @dev_name: the name of the device using this specific mapping, the name + *	must be the same as in your struct device*, may be NULL if you + *	provide .dev instead + * @hog_on_boot: if this is set to true, the pin control subsystem will itself + *	hog the mappings as the pinmux device drivers are attached, so this is + *	typically used with system maps (mux mappings without an assigned + *	device) that you want to get hogged and enabled by default as soon as + *	a pinmux device supporting it is registered. These maps will not be + *	disabled and put until the system shuts down. + */ +struct pinmux_map { +	const char *name; +	struct device *ctrl_dev; +	const char *ctrl_dev_name; +	const char *function; +	const char *group; +	struct device *dev; +	const char *dev_name; +	const bool hog_on_boot; +}; + +/* + * Convenience macro to set a simple map from a certain pin controller and a + * certain function to a named device + */ +#define PINMUX_MAP(a, b, c, d) \ +	{ .name = a, .ctrl_dev_name = b, .function = c, .dev_name = d } + +/* + * Convenience macro to map a system function onto a certain pinctrl device. + * System functions are not assigned to a particular device. + */ +#define PINMUX_MAP_SYS(a, b, c) \ +	{ .name = a, .ctrl_dev_name = b, .function = c } + +/* + * Convenience macro to map a function onto the primary device pinctrl device + * this is especially helpful on systems that have only one pin controller + * or need to set up a lot of mappings on the primary controller. + */ +#define PINMUX_MAP_PRIMARY(a, b, c) \ +	{ .name = a, .ctrl_dev_name = "pinctrl.0", .function = b, \ +	  .dev_name = c } + +/* + * Convenience macro to map a system function onto the primary pinctrl device. + * System functions are not assigned to a particular device. + */ +#define PINMUX_MAP_PRIMARY_SYS(a, b) \ +	{ .name = a, .ctrl_dev_name = "pinctrl.0", .function = b } + +/* + * Convenience macro to map a system function onto the primary pinctrl device, + * to be hogged by the pinmux core until the system shuts down. + */ +#define PINMUX_MAP_PRIMARY_SYS_HOG(a, b) \ +	{ .name = a, .ctrl_dev_name = "pinctrl.0", .function = b, \ +	  .hog_on_boot = true } + + +#ifdef CONFIG_PINMUX + +extern int pinmux_register_mappings(struct pinmux_map const *map, +				unsigned num_maps); + +#else + +static inline int pinmux_register_mappings(struct pinmux_map const *map, +					   unsigned num_maps) +{ +	return 0; +} + +#endif /* !CONFIG_PINMUX */ +#endif diff --git a/include/linux/pinctrl/pinctrl.h b/include/linux/pinctrl/pinctrl.h new file mode 100644 index 00000000000..3605e947fa9 --- /dev/null +++ b/include/linux/pinctrl/pinctrl.h @@ -0,0 +1,133 @@ +/* + * Interface the pinctrl subsystem + * + * Copyright (C) 2011 ST-Ericsson SA + * Written on behalf of Linaro for ST-Ericsson + * This interface is used in the core to keep track of pins. + * + * Author: Linus Walleij <linus.walleij@linaro.org> + * + * License terms: GNU General Public License (GPL) version 2 + */ +#ifndef __LINUX_PINCTRL_PINCTRL_H +#define __LINUX_PINCTRL_PINCTRL_H + +#ifdef CONFIG_PINCTRL + +#include <linux/radix-tree.h> +#include <linux/spinlock.h> +#include <linux/list.h> +#include <linux/seq_file.h> + +struct pinctrl_dev; +struct pinmux_ops; +struct gpio_chip; + +/** + * struct pinctrl_pin_desc - boards/machines provide information on their + * pins, pads or other muxable units in this struct + * @number: unique pin number from the global pin number space + * @name: a name for this pin + */ +struct pinctrl_pin_desc { +	unsigned number; +	const char *name; +}; + +/* Convenience macro to define a single named or anonymous pin descriptor */ +#define PINCTRL_PIN(a, b) { .number = a, .name = b } +#define PINCTRL_PIN_ANON(a) { .number = a } + +/** + * struct pinctrl_gpio_range - each pin controller can provide subranges of + * the GPIO number space to be handled by the controller + * @node: list node for internal use + * @name: a name for the chip in this range + * @id: an ID number for the chip in this range + * @base: base offset of the GPIO range + * @npins: number of pins in the GPIO range, including the base number + * @gc: an optional pointer to a gpio_chip + */ +struct pinctrl_gpio_range { +	struct list_head node; +	const char *name; +	unsigned int id; +	unsigned int base; +	unsigned int npins; +	struct gpio_chip *gc; +}; + +/** + * struct pinctrl_ops - global pin control operations, to be implemented by + * pin controller drivers. + * @list_groups: list the number of selectable named groups available + *	in this pinmux driver, the core will begin on 0 and call this + *	repeatedly as long as it returns >= 0 to enumerate the groups + * @get_group_name: return the group name of the pin group + * @get_group_pins: return an array of pins corresponding to a certain + *	group selector @pins, and the size of the array in @num_pins + * @pin_dbg_show: optional debugfs display hook that will provide per-device + *	info for a certain pin in debugfs + */ +struct pinctrl_ops { +	int (*list_groups) (struct pinctrl_dev *pctldev, unsigned selector); +	const char *(*get_group_name) (struct pinctrl_dev *pctldev, +				       unsigned selector); +	int (*get_group_pins) (struct pinctrl_dev *pctldev, +			       unsigned selector, +			       const unsigned **pins, +			       unsigned *num_pins); +	void (*pin_dbg_show) (struct pinctrl_dev *pctldev, struct seq_file *s, +			  unsigned offset); +}; + +/** + * struct pinctrl_desc - pin controller descriptor, register this to pin + * control subsystem + * @name: name for the pin controller + * @pins: an array of pin descriptors describing all the pins handled by + *	this pin controller + * @npins: number of descriptors in the array, usually just ARRAY_SIZE() + *	of the pins field above + * @maxpin: since pin spaces may be sparse, there can he "holes" in the + *	pin range, this attribute gives the maximum pin number in the + *	total range. This should not be lower than npins for example, + *	but may be equal to npins if you have no holes in the pin range. + * @pctlops: pin control operation vtable, to support global concepts like + *	grouping of pins, this is optional. + * @pmxops: pinmux operation vtable, if you support pinmuxing in your driver + * @owner: module providing the pin controller, used for refcounting + */ +struct pinctrl_desc { +	const char *name; +	struct pinctrl_pin_desc const *pins; +	unsigned int npins; +	unsigned int maxpin; +	struct pinctrl_ops *pctlops; +	struct pinmux_ops *pmxops; +	struct module *owner; +}; + +/* External interface to pin controller */ +extern struct pinctrl_dev *pinctrl_register(struct pinctrl_desc *pctldesc, +				struct device *dev, void *driver_data); +extern void pinctrl_unregister(struct pinctrl_dev *pctldev); +extern bool pin_is_valid(struct pinctrl_dev *pctldev, int pin); +extern void pinctrl_add_gpio_range(struct pinctrl_dev *pctldev, +				struct pinctrl_gpio_range *range); +extern void pinctrl_remove_gpio_range(struct pinctrl_dev *pctldev, +				struct pinctrl_gpio_range *range); +extern const char *pinctrl_dev_get_name(struct pinctrl_dev *pctldev); +extern void *pinctrl_dev_get_drvdata(struct pinctrl_dev *pctldev); +#else + + +/* Sufficiently stupid default function when pinctrl is not in use */ +static inline bool pin_is_valid(struct pinctrl_dev *pctldev, int pin) +{ +	return pin >= 0; +} + +#endif /* !CONFIG_PINCTRL */ + +#endif /* __LINUX_PINCTRL_PINCTRL_H */ diff --git a/include/linux/pinctrl/pinmux.h b/include/linux/pinctrl/pinmux.h new file mode 100644 index 00000000000..3c430e797ef --- /dev/null +++ b/include/linux/pinctrl/pinmux.h @@ -0,0 +1,117 @@ +/* + * Interface the pinmux subsystem + * + * Copyright (C) 2011 ST-Ericsson SA + * Written on behalf of Linaro for ST-Ericsson + * Based on bits of regulator core, gpio core and clk core + * + * Author: Linus Walleij <linus.walleij@linaro.org> + * + * License terms: GNU General Public License (GPL) version 2 + */ +#ifndef __LINUX_PINCTRL_PINMUX_H +#define __LINUX_PINCTRL_PINMUX_H + +#include <linux/list.h> +#include <linux/seq_file.h> +#include "pinctrl.h" + +/* This struct is private to the core and should be regarded as a cookie */ +struct pinmux; + +#ifdef CONFIG_PINMUX + +struct pinctrl_dev; + +/** + * struct pinmux_ops - pinmux operations, to be implemented by pin controller + * drivers that support pinmuxing + * @request: called by the core to see if a certain pin can be made available + *	available for muxing. This is called by the core to acquire the pins + *	before selecting any actual mux setting across a function. The driver + *	is allowed to answer "no" by returning a negative error code + * @free: the reverse function of the request() callback, frees a pin after + *	being requested + * @list_functions: list the number of selectable named functions available + *	in this pinmux driver, the core will begin on 0 and call this + *	repeatedly as long as it returns >= 0 to enumerate mux settings + * @get_function_name: return the function name of the muxing selector, + *	called by the core to figure out which mux setting it shall map a + *	certain device to + * @get_function_groups: return an array of groups names (in turn + *	referencing pins) connected to a certain function selector. The group + *	name can be used with the generic @pinctrl_ops to retrieve the + *	actual pins affected. The applicable groups will be returned in + *	@groups and the number of groups in @num_groups + * @enable: enable a certain muxing function with a certain pin group. The + *	driver does not need to figure out whether enabling this function + *	conflicts some other use of the pins in that group, such collisions + *	are handled by the pinmux subsystem. The @func_selector selects a + *	certain function whereas @group_selector selects a certain set of pins + *	to be used. On simple controllers the latter argument may be ignored + * @disable: disable a certain muxing selector with a certain pin group + * @gpio_request_enable: requests and enables GPIO on a certain pin. + *	Implement this only if you can mux every pin individually as GPIO. The + *	affected GPIO range is passed along with an offset into that + *	specific GPIO range - function selectors and pin groups are orthogonal + *	to this, the core will however make sure the pins do not collide + */ +struct pinmux_ops { +	int (*request) (struct pinctrl_dev *pctldev, unsigned offset); +	int (*free) (struct pinctrl_dev *pctldev, unsigned offset); +	int (*list_functions) (struct pinctrl_dev *pctldev, unsigned selector); +	const char *(*get_function_name) (struct pinctrl_dev *pctldev, +					  unsigned selector); +	int (*get_function_groups) (struct pinctrl_dev *pctldev, +				  unsigned selector, +				  const char * const **groups, +				  unsigned * const num_groups); +	int (*enable) (struct pinctrl_dev *pctldev, unsigned func_selector, +		       unsigned group_selector); +	void (*disable) (struct pinctrl_dev *pctldev, unsigned func_selector, +			 unsigned group_selector); +	int (*gpio_request_enable) (struct pinctrl_dev *pctldev, +				    struct pinctrl_gpio_range *range, +				    unsigned offset); +}; + +/* External interface to pinmux */ +extern int pinmux_request_gpio(unsigned gpio); +extern void pinmux_free_gpio(unsigned gpio); +extern struct pinmux * __must_check pinmux_get(struct device *dev, const char *name); +extern void pinmux_put(struct pinmux *pmx); +extern int pinmux_enable(struct pinmux *pmx); +extern void pinmux_disable(struct pinmux *pmx); + +#else /* !CONFIG_PINMUX */ + +static inline int pinmux_request_gpio(unsigned gpio) +{ +	return 0; +} + +static inline void pinmux_free_gpio(unsigned gpio) +{ +} + +static inline struct pinmux * __must_check pinmux_get(struct device *dev, const char *name) +{ +	return NULL; +} + +static inline void pinmux_put(struct pinmux *pmx) +{ +} + +static inline int pinmux_enable(struct pinmux *pmx) +{ +	return 0; +} + +static inline void pinmux_disable(struct pinmux *pmx) +{ +} + +#endif /* CONFIG_PINMUX */ + +#endif /* __LINUX_PINCTRL_PINMUX_H */ diff --git a/include/linux/platform_data/dwc3-omap.h b/include/linux/platform_data/dwc3-omap.h new file mode 100644 index 00000000000..ada401244e0 --- /dev/null +++ b/include/linux/platform_data/dwc3-omap.h @@ -0,0 +1,47 @@ +/** + * dwc3-omap.h - OMAP Specific Glue layer, header. + * + * Copyright (C) 2010-2011 Texas Instruments Incorporated - http://www.ti.com + * All rights reserved. + * + * Author: Felipe Balbi <balbi@ti.com> + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + *    notice, this list of conditions, and the following disclaimer, + *    without modification. + * 2. Redistributions in binary form must reproduce the above copyright + *    notice, this list of conditions and the following disclaimer in the + *    documentation and/or other materials provided with the distribution. + * 3. The names of the above-listed copyright holders may not be used + *    to endorse or promote products derived from this software without + *    specific prior written permission. + * + * ALTERNATIVELY, this software may be distributed under the terms of the + * GNU General Public License ("GPL") version 2, as published by the Free + * Software Foundation. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +enum dwc3_omap_utmi_mode { +	DWC3_OMAP_UTMI_MODE_UNKNOWN = 0, +	DWC3_OMAP_UTMI_MODE_HW, +	DWC3_OMAP_UTMI_MODE_SW, +}; + +struct dwc3_omap_data { +	enum dwc3_omap_utmi_mode	utmi_mode; +}; diff --git a/include/linux/platform_data/exynos4_tmu.h b/include/linux/platform_data/exynos4_tmu.h new file mode 100644 index 00000000000..39e038cca59 --- /dev/null +++ b/include/linux/platform_data/exynos4_tmu.h @@ -0,0 +1,83 @@ +/* + * exynos4_tmu.h - Samsung EXYNOS4 TMU (Thermal Management Unit) + * + *  Copyright (C) 2011 Samsung Electronics + *  Donggeun Kim <dg77.kim@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. + * + * 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_EXYNOS4_TMU_H +#define _LINUX_EXYNOS4_TMU_H + +enum calibration_type { +	TYPE_ONE_POINT_TRIMMING, +	TYPE_TWO_POINT_TRIMMING, +	TYPE_NONE, +}; + +/** + * struct exynos4_tmu_platform_data + * @threshold: basic temperature for generating interrupt + *	       25 <= threshold <= 125 [unit: degree Celsius] + * @trigger_levels: array for each interrupt levels + *	[unit: degree Celsius] + *	0: temperature for trigger_level0 interrupt + *	   condition for trigger_level0 interrupt: + *		current temperature > threshold + trigger_levels[0] + *	1: temperature for trigger_level1 interrupt + *	   condition for trigger_level1 interrupt: + *		current temperature > threshold + trigger_levels[1] + *	2: temperature for trigger_level2 interrupt + *	   condition for trigger_level2 interrupt: + *		current temperature > threshold + trigger_levels[2] + *	3: temperature for trigger_level3 interrupt + *	   condition for trigger_level3 interrupt: + *		current temperature > threshold + trigger_levels[3] + * @trigger_level0_en: + *	1 = enable trigger_level0 interrupt, + *	0 = disable trigger_level0 interrupt + * @trigger_level1_en: + *	1 = enable trigger_level1 interrupt, + *	0 = disable trigger_level1 interrupt + * @trigger_level2_en: + *	1 = enable trigger_level2 interrupt, + *	0 = disable trigger_level2 interrupt + * @trigger_level3_en: + *	1 = enable trigger_level3 interrupt, + *	0 = disable trigger_level3 interrupt + * @gain: gain of amplifier in the positive-TC generator block + *	0 <= gain <= 15 + * @reference_voltage: reference voltage of amplifier + *	in the positive-TC generator block + *	0 <= reference_voltage <= 31 + * @cal_type: calibration type for temperature + * + * This structure is required for configuration of exynos4_tmu driver. + */ +struct exynos4_tmu_platform_data { +	u8 threshold; +	u8 trigger_levels[4]; +	bool trigger_level0_en; +	bool trigger_level1_en; +	bool trigger_level2_en; +	bool trigger_level3_en; + +	u8 gain; +	u8 reference_voltage; + +	enum calibration_type cal_type; +}; +#endif /* _LINUX_EXYNOS4_TMU_H */ diff --git a/include/linux/platform_data/leds-renesas-tpu.h b/include/linux/platform_data/leds-renesas-tpu.h new file mode 100644 index 00000000000..055387086fc --- /dev/null +++ b/include/linux/platform_data/leds-renesas-tpu.h @@ -0,0 +1,14 @@ +#ifndef __LEDS_RENESAS_TPU_H__ +#define __LEDS_RENESAS_TPU_H__ + +struct led_renesas_tpu_config { +	char *name; +	unsigned pin_gpio_fn; +	unsigned pin_gpio; +	unsigned int channel_offset; +	unsigned int timer_bit; +	unsigned int max_brightness; +	unsigned int refresh_rate; +}; + +#endif /* __LEDS_RENESAS_TPU_H__ */ diff --git a/include/linux/platform_data/mv_usb.h b/include/linux/platform_data/mv_usb.h new file mode 100644 index 00000000000..e9d9149ddf3 --- /dev/null +++ b/include/linux/platform_data/mv_usb.h @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2011 Marvell International Ltd. 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 of the  License, or (at your + * option) any later version. + */ + +#ifndef __MV_PLATFORM_USB_H +#define __MV_PLATFORM_USB_H + +enum pxa_ehci_type { +	EHCI_UNDEFINED = 0, +	PXA_U2OEHCI,	/* pxa 168, 9xx */ +	PXA_SPH,	/* pxa 168, 9xx SPH */ +	MMP3_HSIC,	/* mmp3 hsic */ +	MMP3_FSIC,	/* mmp3 fsic */ +}; + +enum { +	MV_USB_MODE_OTG, +	MV_USB_MODE_HOST, +}; + +enum { +	VBUS_LOW	= 0, +	VBUS_HIGH	= 1 << 0, +}; + +struct mv_usb_addon_irq { +	unsigned int	irq; +	int		(*poll)(void); +}; + +struct mv_usb_platform_data { +	unsigned int		clknum; +	char			**clkname; +	struct mv_usb_addon_irq	*id;	/* Only valid for OTG. ID pin change*/ +	struct mv_usb_addon_irq	*vbus;	/* valid for OTG/UDC. VBUS change*/ + +	/* only valid for HCD. OTG or Host only*/ +	unsigned int		mode; + +	int     (*phy_init)(unsigned int regbase); +	void    (*phy_deinit)(unsigned int regbase); +	int	(*set_vbus)(unsigned int vbus); +}; + +#endif diff --git a/include/linux/platform_data/ntc_thermistor.h b/include/linux/platform_data/ntc_thermistor.h index abd28621527..88734e871e3 100644 --- a/include/linux/platform_data/ntc_thermistor.h +++ b/include/linux/platform_data/ntc_thermistor.h @@ -36,7 +36,7 @@ struct ntc_thermistor_platform_data {  	 * read_uV()  	 *  	 * How to setup pullup_ohm, pulldown_ohm, and connect is -	 * described at Documentation/hwmon/ntc +	 * described at Documentation/hwmon/ntc_thermistor  	 *  	 * pullup/down_ohm: 0 for infinite / not-connected  	 */ diff --git a/include/linux/platform_device.h b/include/linux/platform_device.h index 27bb05aae70..2a23f7d1a82 100644 --- a/include/linux/platform_device.h +++ b/include/linux/platform_device.h @@ -49,10 +49,54 @@ extern struct resource *platform_get_resource_byname(struct platform_device *, u  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_resndata( +struct platform_device_info { +		struct device *parent; + +		const char *name; +		int id; + +		const struct resource *res; +		unsigned int num_res; + +		const void *data; +		size_t size_data; +		u64 dma_mask; +}; +extern struct platform_device *platform_device_register_full( +		struct platform_device_info *pdevinfo); + +/** + * platform_device_register_resndata - add a platform-level device with + * resources and platform-specific data + * + * @parent: parent device for the device we're adding + * @name: base name of the device we're adding + * @id: instance id + * @res: set of resources that needs to be allocated for the device + * @num: number of resources + * @data: platform specific data for this platform device + * @size: size of platform specific data + * + * Returns &struct platform_device pointer on success, or ERR_PTR() on error. + */ +static inline struct platform_device *platform_device_register_resndata(  		struct device *parent, const char *name, int id,  		const struct resource *res, unsigned int num, -		const void *data, size_t size); +		const void *data, size_t size) { + +	struct platform_device_info pdevinfo = { +		.parent = parent, +		.name = name, +		.id = id, +		.res = res, +		.num_res = num, +		.data = data, +		.size_data = size, +		.dma_mask = 0, +	}; + +	return platform_device_register_full(&pdevinfo); +}  /**   * platform_device_register_simple - add a platform-level device and its resources @@ -146,6 +190,23 @@ static inline void platform_set_drvdata(struct platform_device *pdev, void *data  	dev_set_drvdata(&pdev->dev, data);  } +/* module_platform_driver() - Helper macro for drivers that don't do + * anything special in module init/exit.  This eliminates a lot of + * boilerplate.  Each module may only use this macro once, and + * calling it replaces module_init() and module_exit() + */ +#define module_platform_driver(__platform_driver) \ +static int __init __platform_driver##_init(void) \ +{ \ +	return platform_driver_register(&(__platform_driver)); \ +} \ +module_init(__platform_driver##_init); \ +static void __exit __platform_driver##_exit(void) \ +{ \ +	platform_driver_unregister(&(__platform_driver)); \ +} \ +module_exit(__platform_driver##_exit); +  extern struct platform_device *platform_create_bundle(struct platform_driver *driver,  					int (*probe)(struct platform_device *),  					struct resource *res, unsigned int n_res, diff --git a/include/linux/pm.h b/include/linux/pm.h index f7c84c9abd3..f15acb64681 100644 --- a/include/linux/pm.h +++ b/include/linux/pm.h @@ -326,6 +326,7 @@ extern struct dev_pm_ops generic_subsys_pm_ops;   *			requested by a driver.   */ +#define PM_EVENT_INVALID	(-1)  #define PM_EVENT_ON		0x0000  #define PM_EVENT_FREEZE 	0x0001  #define PM_EVENT_SUSPEND	0x0002 @@ -346,6 +347,7 @@ extern struct dev_pm_ops generic_subsys_pm_ops;  #define PM_EVENT_AUTO_SUSPEND	(PM_EVENT_AUTO | PM_EVENT_SUSPEND)  #define PM_EVENT_AUTO_RESUME	(PM_EVENT_AUTO | PM_EVENT_RESUME) +#define PMSG_INVALID	((struct pm_message){ .event = PM_EVENT_INVALID, })  #define PMSG_ON		((struct pm_message){ .event = PM_EVENT_ON, })  #define PMSG_FREEZE	((struct pm_message){ .event = PM_EVENT_FREEZE, })  #define PMSG_QUIESCE	((struct pm_message){ .event = PM_EVENT_QUIESCE, }) @@ -366,6 +368,8 @@ extern struct dev_pm_ops generic_subsys_pm_ops;  #define PMSG_AUTO_RESUME	((struct pm_message) \  					{ .event = PM_EVENT_AUTO_RESUME, }) +#define PMSG_IS_AUTO(msg)	(((msg).event & PM_EVENT_AUTO) != 0) +  /**   * Device run-time power management status.   * @@ -421,6 +425,22 @@ enum rpm_request {  struct wakeup_source; +struct pm_domain_data { +	struct list_head list_node; +	struct device *dev; +}; + +struct pm_subsys_data { +	spinlock_t lock; +	unsigned int refcount; +#ifdef CONFIG_PM_CLK +	struct list_head clock_list; +#endif +#ifdef CONFIG_PM_GENERIC_DOMAINS +	struct pm_domain_data *domain_data; +#endif +}; +  struct dev_pm_info {  	pm_message_t		power_state;  	unsigned int		can_wakeup:1; @@ -432,6 +452,7 @@ struct dev_pm_info {  	struct list_head	entry;  	struct completion	completion;  	struct wakeup_source	*wakeup; +	bool			wakeup_path:1;  #else  	unsigned int		should_wakeup:1;  #endif @@ -462,10 +483,13 @@ struct dev_pm_info {  	unsigned long		suspended_jiffies;  	unsigned long		accounting_timestamp;  #endif -	void			*subsys_data;  /* Owned by the subsystem. */ +	struct pm_subsys_data	*subsys_data;  /* Owned by the subsystem. */ +	struct pm_qos_constraints *constraints;  };  extern void update_pm_runtime_accounting(struct device *dev); +extern int dev_pm_get_subsys_data(struct device *dev); +extern int dev_pm_put_subsys_data(struct device *dev);  /*   * Power domains provide callbacks that are executed during system suspend, diff --git a/include/linux/pm_clock.h b/include/linux/pm_clock.h new file mode 100644 index 00000000000..8348866e7b0 --- /dev/null +++ b/include/linux/pm_clock.h @@ -0,0 +1,71 @@ +/* + * pm_clock.h - Definitions and headers related to device clocks. + * + * Copyright (C) 2011 Rafael J. Wysocki <rjw@sisk.pl>, Renesas Electronics Corp. + * + * This file is released under the GPLv2. + */ + +#ifndef _LINUX_PM_CLOCK_H +#define _LINUX_PM_CLOCK_H + +#include <linux/device.h> +#include <linux/notifier.h> + +struct pm_clk_notifier_block { +	struct notifier_block nb; +	struct dev_pm_domain *pm_domain; +	char *con_ids[]; +}; + +#ifdef CONFIG_PM_CLK +static inline bool pm_clk_no_clocks(struct device *dev) +{ +	return dev && dev->power.subsys_data +		&& list_empty(&dev->power.subsys_data->clock_list); +} + +extern void pm_clk_init(struct device *dev); +extern int pm_clk_create(struct device *dev); +extern void pm_clk_destroy(struct device *dev); +extern int pm_clk_add(struct device *dev, const char *con_id); +extern void pm_clk_remove(struct device *dev, const char *con_id); +extern int pm_clk_suspend(struct device *dev); +extern int pm_clk_resume(struct device *dev); +#else +static inline bool pm_clk_no_clocks(struct device *dev) +{ +	return true; +} +static inline void pm_clk_init(struct device *dev) +{ +} +static inline int pm_clk_create(struct device *dev) +{ +	return -EINVAL; +} +static inline void pm_clk_destroy(struct device *dev) +{ +} +static inline int pm_clk_add(struct device *dev, const char *con_id) +{ +	return -EINVAL; +} +static inline void pm_clk_remove(struct device *dev, const char *con_id) +{ +} +#define pm_clk_suspend	NULL +#define pm_clk_resume	NULL +#endif + +#ifdef CONFIG_HAVE_CLK +extern void pm_clk_add_notifier(struct bus_type *bus, +					struct pm_clk_notifier_block *clknb); +#else +static inline void pm_clk_add_notifier(struct bus_type *bus, +					struct pm_clk_notifier_block *clknb) +{ +} +#endif + +#endif diff --git a/include/linux/pm_domain.h b/include/linux/pm_domain.h index f9ec1736a11..65633e5a2bc 100644 --- a/include/linux/pm_domain.h +++ b/include/linux/pm_domain.h @@ -13,6 +13,7 @@  enum gpd_status {  	GPD_STATE_ACTIVE = 0,	/* PM domain is active */ +	GPD_STATE_WAIT_MASTER,	/* PM domain's master is being waited for */  	GPD_STATE_BUSY,		/* Something is happening to the PM domain */  	GPD_STATE_REPEAT,	/* Power off in progress, to be repeated */  	GPD_STATE_POWER_OFF,	/* PM domain is off */ @@ -25,15 +26,14 @@ struct dev_power_governor {  struct generic_pm_domain {  	struct dev_pm_domain domain;	/* PM domain operations */  	struct list_head gpd_list_node;	/* Node in the global PM domains list */ -	struct list_head sd_node;	/* Node in the parent's subdomain list */ -	struct generic_pm_domain *parent;	/* Parent PM domain */ -	struct list_head sd_list;	/* List of dubdomains */ +	struct list_head master_links;	/* Links with PM domain as a master */ +	struct list_head slave_links;	/* Links with PM domain as a slave */  	struct list_head dev_list;	/* List of devices */  	struct mutex lock;  	struct dev_power_governor *gov;  	struct work_struct power_off_work;  	unsigned int in_progress;	/* Number of devices being suspended now */ -	unsigned int sd_count;	/* Number of subdomains with power "on" */ +	atomic_t sd_count;	/* Number of subdomains with power "on" */  	enum gpd_status status;	/* Current state of the domain */  	wait_queue_head_t status_wait_queue;  	struct task_struct *poweroff_task;	/* Powering off task */ @@ -42,6 +42,7 @@ struct generic_pm_domain {  	unsigned int suspended_count;	/* System suspend device counter */  	unsigned int prepared_count;	/* Suspend counter of prepared devices */  	bool suspend_power_off;	/* Power status before system suspend */ +	bool dev_irq_safe;	/* Device callbacks are IRQ-safe */  	int (*power_off)(struct generic_pm_domain *domain);  	int (*power_on)(struct generic_pm_domain *domain);  	int (*start_device)(struct device *dev); @@ -54,12 +55,23 @@ static inline struct generic_pm_domain *pd_to_genpd(struct dev_pm_domain *pd)  	return container_of(pd, struct generic_pm_domain, domain);  } -struct dev_list_entry { -	struct list_head node; -	struct device *dev; +struct gpd_link { +	struct generic_pm_domain *master; +	struct list_head master_node; +	struct generic_pm_domain *slave; +	struct list_head slave_node; +}; + +struct generic_pm_domain_data { +	struct pm_domain_data base;  	bool need_restore;  }; +static inline struct generic_pm_domain_data *to_gpd_data(struct pm_domain_data *pdd) +{ +	return container_of(pdd, struct generic_pm_domain_data, base); +} +  #ifdef CONFIG_PM_GENERIC_DOMAINS  extern int pm_genpd_add_device(struct generic_pm_domain *genpd,  			       struct device *dev); diff --git a/include/linux/pm_qos.h b/include/linux/pm_qos.h new file mode 100644 index 00000000000..83b0ea302a8 --- /dev/null +++ b/include/linux/pm_qos.h @@ -0,0 +1,155 @@ +#ifndef _LINUX_PM_QOS_H +#define _LINUX_PM_QOS_H +/* interface for the pm_qos_power infrastructure of the linux kernel. + * + * Mark Gross <mgross@linux.intel.com> + */ +#include <linux/plist.h> +#include <linux/notifier.h> +#include <linux/miscdevice.h> +#include <linux/device.h> + +#define PM_QOS_RESERVED 0 +#define PM_QOS_CPU_DMA_LATENCY 1 +#define PM_QOS_NETWORK_LATENCY 2 +#define PM_QOS_NETWORK_THROUGHPUT 3 + +#define PM_QOS_NUM_CLASSES 4 +#define PM_QOS_DEFAULT_VALUE -1 + +#define PM_QOS_CPU_DMA_LAT_DEFAULT_VALUE	(2000 * USEC_PER_SEC) +#define PM_QOS_NETWORK_LAT_DEFAULT_VALUE	(2000 * USEC_PER_SEC) +#define PM_QOS_NETWORK_THROUGHPUT_DEFAULT_VALUE	0 +#define PM_QOS_DEV_LAT_DEFAULT_VALUE		0 + +struct pm_qos_request { +	struct plist_node node; +	int pm_qos_class; +}; + +struct dev_pm_qos_request { +	struct plist_node node; +	struct device *dev; +}; + +enum pm_qos_type { +	PM_QOS_UNITIALIZED, +	PM_QOS_MAX,		/* return the largest value */ +	PM_QOS_MIN		/* return the smallest value */ +}; + +/* + * Note: The lockless read path depends on the CPU accessing + * target_value atomically.  Atomic access is only guaranteed on all CPU + * types linux supports for 32 bit quantites + */ +struct pm_qos_constraints { +	struct plist_head list; +	s32 target_value;	/* Do not change to 64 bit */ +	s32 default_value; +	enum pm_qos_type type; +	struct blocking_notifier_head *notifiers; +}; + +/* Action requested to pm_qos_update_target */ +enum pm_qos_req_action { +	PM_QOS_ADD_REQ,		/* Add a new request */ +	PM_QOS_UPDATE_REQ,	/* Update an existing request */ +	PM_QOS_REMOVE_REQ	/* Remove an existing request */ +}; + +static inline int dev_pm_qos_request_active(struct dev_pm_qos_request *req) +{ +	return req->dev != 0; +} + +#ifdef CONFIG_PM +int pm_qos_update_target(struct pm_qos_constraints *c, struct plist_node *node, +			 enum pm_qos_req_action action, int value); +void pm_qos_add_request(struct pm_qos_request *req, int pm_qos_class, +			s32 value); +void pm_qos_update_request(struct pm_qos_request *req, +			   s32 new_value); +void pm_qos_remove_request(struct pm_qos_request *req); + +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); +int pm_qos_request_active(struct pm_qos_request *req); +s32 pm_qos_read_value(struct pm_qos_constraints *c); + +s32 dev_pm_qos_read_value(struct device *dev); +int dev_pm_qos_add_request(struct device *dev, struct dev_pm_qos_request *req, +			   s32 value); +int dev_pm_qos_update_request(struct dev_pm_qos_request *req, s32 new_value); +int dev_pm_qos_remove_request(struct dev_pm_qos_request *req); +int dev_pm_qos_add_notifier(struct device *dev, +			    struct notifier_block *notifier); +int dev_pm_qos_remove_notifier(struct device *dev, +			       struct notifier_block *notifier); +int dev_pm_qos_add_global_notifier(struct notifier_block *notifier); +int dev_pm_qos_remove_global_notifier(struct notifier_block *notifier); +void dev_pm_qos_constraints_init(struct device *dev); +void dev_pm_qos_constraints_destroy(struct device *dev); +#else +static inline int pm_qos_update_target(struct pm_qos_constraints *c, +				       struct plist_node *node, +				       enum pm_qos_req_action action, +				       int value) +			{ return 0; } +static inline void pm_qos_add_request(struct pm_qos_request *req, +				      int pm_qos_class, s32 value) +			{ return; } +static inline void pm_qos_update_request(struct pm_qos_request *req, +					 s32 new_value) +			{ return; } +static inline void pm_qos_remove_request(struct pm_qos_request *req) +			{ return; } + +static inline int pm_qos_request(int pm_qos_class) +			{ return 0; } +static inline int pm_qos_add_notifier(int pm_qos_class, +				      struct notifier_block *notifier) +			{ return 0; } +static inline int pm_qos_remove_notifier(int pm_qos_class, +					 struct notifier_block *notifier) +			{ return 0; } +static inline int pm_qos_request_active(struct pm_qos_request *req) +			{ return 0; } +static inline s32 pm_qos_read_value(struct pm_qos_constraints *c) +			{ return 0; } + +static inline s32 dev_pm_qos_read_value(struct device *dev) +			{ return 0; } +static inline int dev_pm_qos_add_request(struct device *dev, +					 struct dev_pm_qos_request *req, +					 s32 value) +			{ return 0; } +static inline int dev_pm_qos_update_request(struct dev_pm_qos_request *req, +					    s32 new_value) +			{ return 0; } +static inline int dev_pm_qos_remove_request(struct dev_pm_qos_request *req) +			{ return 0; } +static inline int dev_pm_qos_add_notifier(struct device *dev, +					  struct notifier_block *notifier) +			{ return 0; } +static inline int dev_pm_qos_remove_notifier(struct device *dev, +					     struct notifier_block *notifier) +			{ return 0; } +static inline int dev_pm_qos_add_global_notifier( +					struct notifier_block *notifier) +			{ return 0; } +static inline int dev_pm_qos_remove_global_notifier( +					struct notifier_block *notifier) +			{ return 0; } +static inline void dev_pm_qos_constraints_init(struct device *dev) +{ +	dev->power.power_state = PMSG_ON; +} +static inline void dev_pm_qos_constraints_destroy(struct device *dev) +{ +	dev->power.power_state = PMSG_INVALID; +} +#endif + +#endif diff --git a/include/linux/pm_qos_params.h b/include/linux/pm_qos_params.h deleted file mode 100644 index a7d87f911ca..00000000000 --- a/include/linux/pm_qos_params.h +++ /dev/null @@ -1,38 +0,0 @@ -#ifndef _LINUX_PM_QOS_PARAMS_H -#define _LINUX_PM_QOS_PARAMS_H -/* interface for the pm_qos_power infrastructure of the linux kernel. - * - * Mark Gross <mgross@linux.intel.com> - */ -#include <linux/plist.h> -#include <linux/notifier.h> -#include <linux/miscdevice.h> - -#define PM_QOS_RESERVED 0 -#define PM_QOS_CPU_DMA_LATENCY 1 -#define PM_QOS_NETWORK_LATENCY 2 -#define PM_QOS_NETWORK_THROUGHPUT 3 - -#define PM_QOS_NUM_CLASSES 4 -#define PM_QOS_DEFAULT_VALUE -1 - -#define PM_QOS_CPU_DMA_LAT_DEFAULT_VALUE	(2000 * USEC_PER_SEC) -#define PM_QOS_NETWORK_LAT_DEFAULT_VALUE	(2000 * USEC_PER_SEC) -#define PM_QOS_NETWORK_THROUGHPUT_DEFAULT_VALUE	0 - -struct pm_qos_request_list { -	struct plist_node list; -	int pm_qos_class; -}; - -void pm_qos_add_request(struct pm_qos_request_list *l, 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_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); -int pm_qos_request_active(struct pm_qos_request_list *req); - -#endif diff --git a/include/linux/pm_runtime.h b/include/linux/pm_runtime.h index daac05d751b..70b284024d9 100644 --- a/include/linux/pm_runtime.h +++ b/include/linux/pm_runtime.h @@ -251,46 +251,4 @@ static inline void pm_runtime_dont_use_autosuspend(struct device *dev)  	__pm_runtime_use_autosuspend(dev, false);  } -struct pm_clk_notifier_block { -	struct notifier_block nb; -	struct dev_pm_domain *pm_domain; -	char *con_ids[]; -}; - -#ifdef CONFIG_PM_CLK -extern int pm_clk_init(struct device *dev); -extern void pm_clk_destroy(struct device *dev); -extern int pm_clk_add(struct device *dev, const char *con_id); -extern void pm_clk_remove(struct device *dev, const char *con_id); -extern int pm_clk_suspend(struct device *dev); -extern int pm_clk_resume(struct device *dev); -#else -static inline int pm_clk_init(struct device *dev) -{ -	return -EINVAL; -} -static inline void pm_clk_destroy(struct device *dev) -{ -} -static inline int pm_clk_add(struct device *dev, const char *con_id) -{ -	return -EINVAL; -} -static inline void pm_clk_remove(struct device *dev, const char *con_id) -{ -} -#define pm_clk_suspend	NULL -#define pm_clk_resume	NULL -#endif - -#ifdef CONFIG_HAVE_CLK -extern void pm_clk_add_notifier(struct bus_type *bus, -					struct pm_clk_notifier_block *clknb); -#else -static inline void pm_clk_add_notifier(struct bus_type *bus, -					struct pm_clk_notifier_block *clknb) -{ -} -#endif -  #endif diff --git a/include/linux/posix-timers.h b/include/linux/posix-timers.h index 959c14132f4..042058fdb0a 100644 --- a/include/linux/posix-timers.h +++ b/include/linux/posix-timers.h @@ -81,7 +81,10 @@ struct k_itimer {  			unsigned long incr;  			unsigned long expires;  		} mmtimer; -		struct alarm alarmtimer; +		struct { +			struct alarm alarmtimer; +			ktime_t interval; +		} alarm;  		struct rcu_head rcu;  	} it;  }; diff --git a/include/linux/pps-gpio.h b/include/linux/pps-gpio.h new file mode 100644 index 00000000000..0035abe41b9 --- /dev/null +++ b/include/linux/pps-gpio.h @@ -0,0 +1,32 @@ +/* + * pps-gpio.h -- PPS client for GPIOs + * + * + * Copyright (C) 2011 James Nuss <jamesnuss@nanometrics.ca> + * + *   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 _PPS_GPIO_H +#define _PPS_GPIO_H + +struct pps_gpio_platform_data { +	bool assert_falling_edge; +	bool capture_clear; +	unsigned int gpio_pin; +	const char *gpio_label; +}; + +#endif diff --git a/include/linux/printk.h b/include/linux/printk.h index 0101d55d965..f0e22f75143 100644 --- a/include/linux/printk.h +++ b/include/linux/printk.h @@ -82,22 +82,22 @@ struct va_format {   * Dummy printk for disabled debugging statements to use whilst maintaining   * gcc's format and side-effect checking.   */ -static inline __attribute__ ((format (printf, 1, 2))) +static inline __printf(1, 2)  int no_printk(const char *fmt, ...)  {  	return 0;  } -extern asmlinkage __attribute__ ((format (printf, 1, 2))) +extern asmlinkage __printf(1, 2)  void early_printk(const char *fmt, ...);  extern int printk_needs_cpu(int cpu);  extern void printk_tick(void);  #ifdef CONFIG_PRINTK -asmlinkage __attribute__ ((format (printf, 1, 0))) +asmlinkage __printf(1, 0)  int vprintk(const char *fmt, va_list args); -asmlinkage __attribute__ ((format (printf, 1, 2))) __cold +asmlinkage __printf(1, 2) __cold  int printk(const char *fmt, ...);  /* @@ -117,12 +117,12 @@ extern int kptr_restrict;  void log_buf_kexec_setup(void);  void __init setup_log_buf(int early);  #else -static inline __attribute__ ((format (printf, 1, 0))) +static inline __printf(1, 0)  int vprintk(const char *s, va_list args)  {  	return 0;  } -static inline __attribute__ ((format (printf, 1, 2))) __cold +static inline __printf(1, 2) __cold  int printk(const char *s, ...)  {  	return 0; diff --git a/include/linux/proportions.h b/include/linux/proportions.h index cf793bbbd05..ef35bb73f69 100644 --- a/include/linux/proportions.h +++ b/include/linux/proportions.h @@ -58,7 +58,7 @@ struct prop_local_percpu {  	 */  	int shift;  	unsigned long period; -	spinlock_t lock;		/* protect the snapshot state */ +	raw_spinlock_t lock;		/* protect the snapshot state */  };  int prop_local_init_percpu(struct prop_local_percpu *pl); @@ -106,11 +106,11 @@ struct prop_local_single {  	 */  	unsigned long period;  	int shift; -	spinlock_t lock;		/* protect the snapshot state */ +	raw_spinlock_t lock;		/* protect the snapshot state */  };  #define INIT_PROP_LOCAL_SINGLE(name)			\ -{	.lock = __SPIN_LOCK_UNLOCKED(name.lock),	\ +{	.lock = __RAW_SPIN_LOCK_UNLOCKED(name.lock),	\  }  int prop_local_init_single(struct prop_local_single *pl); diff --git a/include/linux/pstore.h b/include/linux/pstore.h index cc03bbf5c4b..ea567321ae3 100644 --- a/include/linux/pstore.h +++ b/include/linux/pstore.h @@ -32,15 +32,15 @@ enum pstore_type_id {  struct pstore_info {  	struct module	*owner;  	char		*name; -	struct mutex	buf_mutex;	/* serialize access to 'buf' */ +	spinlock_t	buf_lock;	/* serialize access to 'buf' */  	char		*buf;  	size_t		bufsize;  	int		(*open)(struct pstore_info *psi);  	int		(*close)(struct pstore_info *psi);  	ssize_t		(*read)(u64 *id, enum pstore_type_id *type,  			struct timespec *time, struct pstore_info *psi); -	u64		(*write)(enum pstore_type_id type, unsigned int part, -			size_t size, struct pstore_info *psi); +	int		(*write)(enum pstore_type_id type, u64 *id, +			unsigned int part, size_t size, struct pstore_info *psi);  	int		(*erase)(enum pstore_type_id type, u64 id,  			struct pstore_info *psi);  	void		*data; diff --git a/include/linux/ptp_classify.h b/include/linux/ptp_classify.h index e07e2742a86..1dc420ba213 100644 --- a/include/linux/ptp_classify.h +++ b/include/linux/ptp_classify.h @@ -51,6 +51,7 @@  #define PTP_CLASS_V2_VLAN (PTP_CLASS_V2 | PTP_CLASS_VLAN)  #define PTP_EV_PORT 319 +#define PTP_GEN_BIT 0x08 /* indicates general message, if set in message type */  #define OFF_ETYPE	12  #define OFF_IHL		14 @@ -116,14 +117,20 @@ static inline int ptp_filter_init(struct sock_filter *f, int len)  	{OP_OR,		0,   0, PTP_CLASS_IPV6		}, /*              */ \  	{OP_RETA,	0,   0, 0			}, /*              */ \  /*L3x*/	{OP_RETK,	0,   0, PTP_CLASS_NONE		}, /*              */ \ -/*L40*/	{OP_JEQ,	0,   6, ETH_P_8021Q		}, /* f goto L50   */ \ +/*L40*/	{OP_JEQ,	0,   9, ETH_P_8021Q		}, /* f goto L50   */ \  	{OP_LDH,	0,   0, OFF_ETYPE + 4		}, /*              */ \ -	{OP_JEQ,	0,   9, ETH_P_1588		}, /* f goto L60   */ \ +	{OP_JEQ,	0,  15, ETH_P_1588		}, /* f goto L60   */ \ +	{OP_LDB,	0,   0, ETH_HLEN + VLAN_HLEN	}, /*              */ \ +	{OP_AND,	0,   0, PTP_GEN_BIT		}, /*              */ \ +	{OP_JEQ,	0,  12, 0			}, /* f goto L6x   */ \  	{OP_LDH,	0,   0, ETH_HLEN + VLAN_HLEN	}, /*              */ \  	{OP_AND,	0,   0, PTP_CLASS_VMASK		}, /*              */ \  	{OP_OR,		0,   0, PTP_CLASS_VLAN		}, /*              */ \  	{OP_RETA,	0,   0, 0			}, /*              */ \ -/*L50*/	{OP_JEQ,	0,   4, ETH_P_1588		}, /* f goto L61   */ \ +/*L50*/	{OP_JEQ,	0,   7, ETH_P_1588		}, /* f goto L61   */ \ +	{OP_LDB,	0,   0, ETH_HLEN		}, /*              */ \ +	{OP_AND,	0,   0, PTP_GEN_BIT		}, /*              */ \ +	{OP_JEQ,	0,   4, 0			}, /* f goto L6x   */ \  	{OP_LDH,	0,   0, ETH_HLEN		}, /*              */ \  	{OP_AND,	0,   0, PTP_CLASS_VMASK		}, /*              */ \  	{OP_OR,		0,   0, PTP_CLASS_L2		}, /*              */ \ diff --git a/include/linux/quotaops.h b/include/linux/quotaops.h index 26f9e3612e0..d93f95e6177 100644 --- a/include/linux/quotaops.h +++ b/include/linux/quotaops.h @@ -31,7 +31,7 @@ static inline bool is_quota_modification(struct inode *inode, struct iattr *ia)  #define quota_error(sb, fmt, args...) \  	__quota_error((sb), __func__, fmt , ## args) -extern __attribute__((format (printf, 3, 4))) +extern __printf(3, 4)  void __quota_error(struct super_block *sb, const char *func,  		   const char *fmt, ...); diff --git a/include/linux/random.h b/include/linux/random.h index d13059f3ea3..8f74538c96d 100644 --- a/include/linux/random.h +++ b/include/linux/random.h @@ -91,6 +91,19 @@ static inline void prandom32_seed(struct rnd_state *state, u64 seed)  	state->s3 = __seed(i, 15);  } +#ifdef CONFIG_ARCH_RANDOM +# include <asm/archrandom.h> +#else +static inline int arch_get_random_long(unsigned long *v) +{ +	return 0; +} +static inline int arch_get_random_int(unsigned int *v) +{ +	return 0; +} +#endif +  #endif /* __KERNEL___ */  #endif /* _LINUX_RANDOM_H */ diff --git a/include/linux/ratelimit.h b/include/linux/ratelimit.h index 2f007157fab..e11ccb4cf48 100644 --- a/include/linux/ratelimit.h +++ b/include/linux/ratelimit.h @@ -8,7 +8,7 @@  #define DEFAULT_RATELIMIT_BURST		10  struct ratelimit_state { -	spinlock_t	lock;		/* protect the state */ +	raw_spinlock_t	lock;		/* protect the state */  	int		interval;  	int		burst; @@ -20,7 +20,7 @@ struct ratelimit_state {  #define DEFINE_RATELIMIT_STATE(name, interval_init, burst_init)		\  									\  	struct ratelimit_state name = {					\ -		.lock		= __SPIN_LOCK_UNLOCKED(name.lock),	\ +		.lock		= __RAW_SPIN_LOCK_UNLOCKED(name.lock),	\  		.interval	= interval_init,			\  		.burst		= burst_init,				\  	} @@ -28,7 +28,7 @@ struct ratelimit_state {  static inline void ratelimit_state_init(struct ratelimit_state *rs,  					int interval, int burst)  { -	spin_lock_init(&rs->lock); +	raw_spin_lock_init(&rs->lock);  	rs->interval = interval;  	rs->burst = burst;  	rs->printed = 0; diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h index 8f4f881a0ad..2cf4226ade7 100644 --- a/include/linux/rcupdate.h +++ b/include/linux/rcupdate.h @@ -33,6 +33,7 @@  #ifndef __LINUX_RCUPDATE_H  #define __LINUX_RCUPDATE_H +#include <linux/types.h>  #include <linux/cache.h>  #include <linux/spinlock.h>  #include <linux/threads.h> @@ -64,32 +65,74 @@ static inline void rcutorture_record_progress(unsigned long vernum)  #define ULONG_CMP_GE(a, b)	(ULONG_MAX / 2 >= (a) - (b))  #define ULONG_CMP_LT(a, b)	(ULONG_MAX / 2 < (a) - (b)) +/* Exported common interfaces */ + +#ifdef CONFIG_PREEMPT_RCU +  /** - * struct rcu_head - callback structure for use with RCU - * @next: next update requests in a list - * @func: actual update function to call after the grace period. + * call_rcu() - Queue an RCU callback for invocation after a grace period. + * @head: structure to be used for queueing the RCU updates. + * @func: actual callback function to be invoked after the grace period + * + * The callback function will be invoked some time after a full grace + * period elapses, in other words after all pre-existing RCU read-side + * critical sections have completed.  However, the callback function + * might well execute concurrently with RCU read-side critical sections + * that started after call_rcu() was invoked.  RCU read-side critical + * sections are delimited by rcu_read_lock() and rcu_read_unlock(), + * and may be nested.   */ -struct rcu_head { -	struct rcu_head *next; -	void (*func)(struct rcu_head *head); -}; +extern void call_rcu(struct rcu_head *head, +			      void (*func)(struct rcu_head *head)); -/* Exported common interfaces */ +#else /* #ifdef CONFIG_PREEMPT_RCU */ + +/* In classic RCU, call_rcu() is just call_rcu_sched(). */ +#define	call_rcu	call_rcu_sched + +#endif /* #else #ifdef CONFIG_PREEMPT_RCU */ + +/** + * call_rcu_bh() - Queue an RCU for invocation after a quicker grace period. + * @head: structure to be used for queueing the RCU updates. + * @func: actual callback function to be invoked after the grace period + * + * The callback function will be invoked some time after a full grace + * period elapses, in other words after all currently executing RCU + * read-side critical sections have completed. call_rcu_bh() assumes + * that the read-side critical sections end on completion of a softirq + * handler. This means that read-side critical sections in process + * context must not be interrupted by softirqs. This interface is to be + * used when most of the read-side critical sections are in softirq context. + * RCU read-side critical sections are delimited by : + *  - rcu_read_lock() and  rcu_read_unlock(), if in interrupt context. + *  OR + *  - rcu_read_lock_bh() and rcu_read_unlock_bh(), if in process context. + *  These may be nested. + */ +extern void call_rcu_bh(struct rcu_head *head, +			void (*func)(struct rcu_head *head)); + +/** + * call_rcu_sched() - Queue an RCU for invocation after sched grace period. + * @head: structure to be used for queueing the RCU updates. + * @func: actual callback function to be invoked after the grace period + * + * The callback function will be invoked some time after a full grace + * period elapses, in other words after all currently executing RCU + * read-side critical sections have completed. call_rcu_sched() assumes + * that the read-side critical sections end on enabling of preemption + * or on voluntary preemption. + * RCU read-side critical sections are delimited by : + *  - rcu_read_lock_sched() and  rcu_read_unlock_sched(), + *  OR + *  anything that disables preemption. + *  These may be nested. + */  extern void call_rcu_sched(struct rcu_head *head,  			   void (*func)(struct rcu_head *rcu)); -extern void synchronize_sched(void); -extern void rcu_barrier_bh(void); -extern void rcu_barrier_sched(void); -static inline void __rcu_read_lock_bh(void) -{ -	local_bh_disable(); -} - -static inline void __rcu_read_unlock_bh(void) -{ -	local_bh_enable(); -} +extern void synchronize_sched(void);  #ifdef CONFIG_PREEMPT_RCU @@ -152,6 +195,15 @@ static inline void rcu_exit_nohz(void)  #endif /* #else #ifdef CONFIG_NO_HZ */ +/* + * Infrastructure to implement the synchronize_() primitives in + * TREE_RCU and rcu_barrier_() primitives in TINY_RCU. + */ + +typedef void call_rcu_func_t(struct rcu_head *head, +			     void (*func)(struct rcu_head *head)); +void wait_rcu_gp(call_rcu_func_t crf); +  #if defined(CONFIG_TREE_RCU) || defined(CONFIG_TREE_PREEMPT_RCU)  #include <linux/rcutree.h>  #elif defined(CONFIG_TINY_RCU) || defined(CONFIG_TINY_PREEMPT_RCU) @@ -297,19 +349,31 @@ extern int rcu_my_thread_group_empty(void);  /**   * rcu_lockdep_assert - emit lockdep splat if specified condition not met   * @c: condition to check + * @s: informative message   */ -#define rcu_lockdep_assert(c)						\ +#define rcu_lockdep_assert(c, s)					\  	do {								\  		static bool __warned;					\  		if (debug_lockdep_rcu_enabled() && !__warned && !(c)) {	\  			__warned = true;				\ -			lockdep_rcu_dereference(__FILE__, __LINE__);	\ +			lockdep_rcu_suspicious(__FILE__, __LINE__, s);	\  		}							\  	} while (0) +#define rcu_sleep_check()						\ +	do {								\ +		rcu_lockdep_assert(!lock_is_held(&rcu_bh_lock_map),	\ +				   "Illegal context switch in RCU-bh"	\ +				   " read-side critical section");	\ +		rcu_lockdep_assert(!lock_is_held(&rcu_sched_lock_map),	\ +				   "Illegal context switch in RCU-sched"\ +				   " read-side critical section");	\ +	} while (0) +  #else /* #ifdef CONFIG_PROVE_RCU */ -#define rcu_lockdep_assert(c) do { } while (0) +#define rcu_lockdep_assert(c, s) do { } while (0) +#define rcu_sleep_check() do { } while (0)  #endif /* #else #ifdef CONFIG_PROVE_RCU */ @@ -338,14 +402,16 @@ extern int rcu_my_thread_group_empty(void);  #define __rcu_dereference_check(p, c, space) \  	({ \  		typeof(*p) *_________p1 = (typeof(*p)*__force )ACCESS_ONCE(p); \ -		rcu_lockdep_assert(c); \ +		rcu_lockdep_assert(c, "suspicious rcu_dereference_check()" \ +				      " usage"); \  		rcu_dereference_sparse(p, space); \  		smp_read_barrier_depends(); \  		((typeof(*p) __force __kernel *)(_________p1)); \  	})  #define __rcu_dereference_protected(p, c, space) \  	({ \ -		rcu_lockdep_assert(c); \ +		rcu_lockdep_assert(c, "suspicious rcu_dereference_protected()" \ +				      " usage"); \  		rcu_dereference_sparse(p, space); \  		((typeof(*p) __force __kernel *)(p)); \  	}) @@ -359,15 +425,15 @@ extern int rcu_my_thread_group_empty(void);  #define __rcu_dereference_index_check(p, c) \  	({ \  		typeof(p) _________p1 = ACCESS_ONCE(p); \ -		rcu_lockdep_assert(c); \ +		rcu_lockdep_assert(c, \ +				   "suspicious rcu_dereference_index_check()" \ +				   " usage"); \  		smp_read_barrier_depends(); \  		(_________p1); \  	})  #define __rcu_assign_pointer(p, v, space) \  	({ \ -		if (!__builtin_constant_p(v) || \ -		    ((v) != NULL)) \ -			smp_wmb(); \ +		smp_wmb(); \  		(p) = (typeof(*v) __force space *)(v); \  	}) @@ -500,26 +566,6 @@ extern int rcu_my_thread_group_empty(void);  #define rcu_dereference_protected(p, c) \  	__rcu_dereference_protected((p), (c), __rcu) -/** - * rcu_dereference_bh_protected() - fetch RCU-bh pointer when updates prevented - * @p: The pointer to read, prior to dereferencing - * @c: The conditions under which the dereference will take place - * - * This is the RCU-bh counterpart to rcu_dereference_protected(). - */ -#define rcu_dereference_bh_protected(p, c) \ -	__rcu_dereference_protected((p), (c), __rcu) - -/** - * rcu_dereference_sched_protected() - fetch RCU-sched pointer when updates prevented - * @p: The pointer to read, prior to dereferencing - * @c: The conditions under which the dereference will take place - * - * This is the RCU-sched counterpart to rcu_dereference_protected(). - */ -#define rcu_dereference_sched_protected(p, c) \ -	__rcu_dereference_protected((p), (c), __rcu) -  /**   * rcu_dereference() - fetch RCU-protected pointer for dereferencing @@ -630,7 +676,7 @@ static inline void rcu_read_unlock(void)   */  static inline void rcu_read_lock_bh(void)  { -	__rcu_read_lock_bh(); +	local_bh_disable();  	__acquire(RCU_BH);  	rcu_read_acquire_bh();  } @@ -644,7 +690,7 @@ static inline void rcu_read_unlock_bh(void)  {  	rcu_read_release_bh();  	__release(RCU_BH); -	__rcu_read_unlock_bh(); +	local_bh_enable();  }  /** @@ -698,11 +744,18 @@ static inline notrace void rcu_read_unlock_sched_notrace(void)   * any prior initialization.  Returns the value assigned.   *   * Inserts memory barriers on architectures that require them - * (pretty much all of them other than x86), and also prevents - * the compiler from reordering the code that initializes the - * structure after the pointer assignment.  More importantly, this - * call documents which pointers will be dereferenced by RCU read-side - * code. + * (which is most of them), and also prevents the compiler from + * reordering the code that initializes the structure after the pointer + * assignment.  More importantly, this call documents which pointers + * will be dereferenced by RCU read-side code. + * + * In some special cases, you may use RCU_INIT_POINTER() instead + * of rcu_assign_pointer().  RCU_INIT_POINTER() is a bit faster due + * to the fact that it does not constrain either the CPU or the compiler. + * That said, using RCU_INIT_POINTER() when you should have used + * rcu_assign_pointer() is a very bad thing that results in + * impossible-to-diagnose memory corruption.  So please be careful. + * See the RCU_INIT_POINTER() comment header for details.   */  #define rcu_assign_pointer(p, v) \  	__rcu_assign_pointer((p), (v), __rcu) @@ -710,104 +763,37 @@ static inline notrace void rcu_read_unlock_sched_notrace(void)  /**   * RCU_INIT_POINTER() - initialize an RCU protected pointer   * - * Initialize an RCU-protected pointer in such a way to avoid RCU-lockdep - * splats. - */ -#define RCU_INIT_POINTER(p, v) \ -		p = (typeof(*v) __force __rcu *)(v) - -/* Infrastructure to implement the synchronize_() primitives. */ - -struct rcu_synchronize { -	struct rcu_head head; -	struct completion completion; -}; - -extern void wakeme_after_rcu(struct rcu_head  *head); - -#ifdef CONFIG_PREEMPT_RCU - -/** - * call_rcu() - Queue an RCU callback for invocation after a grace period. - * @head: structure to be used for queueing the RCU updates. - * @func: actual callback function to be invoked after the grace period + * Initialize an RCU-protected pointer in special cases where readers + * do not need ordering constraints on the CPU or the compiler.  These + * special cases are:   * - * The callback function will be invoked some time after a full grace - * period elapses, in other words after all pre-existing RCU read-side - * critical sections have completed.  However, the callback function - * might well execute concurrently with RCU read-side critical sections - * that started after call_rcu() was invoked.  RCU read-side critical - * sections are delimited by rcu_read_lock() and rcu_read_unlock(), - * and may be nested. - */ -extern void call_rcu(struct rcu_head *head, -			      void (*func)(struct rcu_head *head)); - -#else /* #ifdef CONFIG_PREEMPT_RCU */ - -/* In classic RCU, call_rcu() is just call_rcu_sched(). */ -#define	call_rcu	call_rcu_sched - -#endif /* #else #ifdef CONFIG_PREEMPT_RCU */ - -/** - * call_rcu_bh() - Queue an RCU for invocation after a quicker grace period. - * @head: structure to be used for queueing the RCU updates. - * @func: actual callback function to be invoked after the grace period + * 1.	This use of RCU_INIT_POINTER() is NULLing out the pointer -or- + * 2.	The caller has taken whatever steps are required to prevent + *	RCU readers from concurrently accessing this pointer -or- + * 3.	The referenced data structure has already been exposed to + *	readers either at compile time or via rcu_assign_pointer() -and- + *	a.	You have not made -any- reader-visible changes to + *		this structure since then -or- + *	b.	It is OK for readers accessing this structure from its + *		new location to see the old state of the structure.  (For + *		example, the changes were to statistical counters or to + *		other state where exact synchronization is not required.)   * - * The callback function will be invoked some time after a full grace - * period elapses, in other words after all currently executing RCU - * read-side critical sections have completed. call_rcu_bh() assumes - * that the read-side critical sections end on completion of a softirq - * handler. This means that read-side critical sections in process - * context must not be interrupted by softirqs. This interface is to be - * used when most of the read-side critical sections are in softirq context. - * RCU read-side critical sections are delimited by : - *  - rcu_read_lock() and  rcu_read_unlock(), if in interrupt context. - *  OR - *  - rcu_read_lock_bh() and rcu_read_unlock_bh(), if in process context. - *  These may be nested. - */ -extern void call_rcu_bh(struct rcu_head *head, -			void (*func)(struct rcu_head *head)); - -/* - * debug_rcu_head_queue()/debug_rcu_head_unqueue() are used internally - * by call_rcu() and rcu callback execution, and are therefore not part of the - * RCU API. Leaving in rcupdate.h because they are used by all RCU flavors. + * Failure to follow these rules governing use of RCU_INIT_POINTER() will + * result in impossible-to-diagnose memory corruption.  As in the structures + * will look OK in crash dumps, but any concurrent RCU readers might + * see pre-initialized values of the referenced data structure.  So + * please be very careful how you use RCU_INIT_POINTER()!!! + * + * If you are creating an RCU-protected linked structure that is accessed + * by a single external-to-structure RCU-protected pointer, then you may + * use RCU_INIT_POINTER() to initialize the internal RCU-protected + * pointers, but you must use rcu_assign_pointer() to initialize the + * external-to-structure pointer -after- you have completely initialized + * the reader-accessible portions of the linked structure.   */ - -#ifdef CONFIG_DEBUG_OBJECTS_RCU_HEAD -# define STATE_RCU_HEAD_READY	0 -# define STATE_RCU_HEAD_QUEUED	1 - -extern struct debug_obj_descr rcuhead_debug_descr; - -static inline void debug_rcu_head_queue(struct rcu_head *head) -{ -	WARN_ON_ONCE((unsigned long)head & 0x3); -	debug_object_activate(head, &rcuhead_debug_descr); -	debug_object_active_state(head, &rcuhead_debug_descr, -				  STATE_RCU_HEAD_READY, -				  STATE_RCU_HEAD_QUEUED); -} - -static inline void debug_rcu_head_unqueue(struct rcu_head *head) -{ -	debug_object_active_state(head, &rcuhead_debug_descr, -				  STATE_RCU_HEAD_QUEUED, -				  STATE_RCU_HEAD_READY); -	debug_object_deactivate(head, &rcuhead_debug_descr); -} -#else	/* !CONFIG_DEBUG_OBJECTS_RCU_HEAD */ -static inline void debug_rcu_head_queue(struct rcu_head *head) -{ -} - -static inline void debug_rcu_head_unqueue(struct rcu_head *head) -{ -} -#endif	/* #else !CONFIG_DEBUG_OBJECTS_RCU_HEAD */ +#define RCU_INIT_POINTER(p, v) \ +		p = (typeof(*v) __force __rcu *)(v)  static __always_inline bool __is_kfree_rcu_offset(unsigned long offset)  { @@ -827,18 +813,6 @@ void __kfree_rcu(struct rcu_head *head, unsigned long offset)  	call_rcu(head, (rcu_callback)offset);  } -extern void kfree(const void *); - -static inline void __rcu_reclaim(struct rcu_head *head) -{ -	unsigned long offset = (unsigned long)head->func; - -	if (__is_kfree_rcu_offset(offset)) -		kfree((void *)head - offset); -	else -		head->func(head); -} -  /**   * kfree_rcu() - kfree an object after a grace period.   * @ptr:	pointer to kfree diff --git a/include/linux/rcutiny.h b/include/linux/rcutiny.h index 52b3e0281fd..00b7a5e493d 100644 --- a/include/linux/rcutiny.h +++ b/include/linux/rcutiny.h @@ -27,9 +27,23 @@  #include <linux/cache.h> +#ifdef CONFIG_RCU_BOOST  static inline void rcu_init(void)  {  } +#else /* #ifdef CONFIG_RCU_BOOST */ +void rcu_init(void); +#endif /* #else #ifdef CONFIG_RCU_BOOST */ + +static inline void rcu_barrier_bh(void) +{ +	wait_rcu_gp(call_rcu_bh); +} + +static inline void rcu_barrier_sched(void) +{ +	wait_rcu_gp(call_rcu_sched); +}  #ifdef CONFIG_TINY_RCU @@ -45,9 +59,13 @@ static inline void rcu_barrier(void)  #else /* #ifdef CONFIG_TINY_RCU */ -void rcu_barrier(void);  void synchronize_rcu_expedited(void); +static inline void rcu_barrier(void) +{ +	wait_rcu_gp(call_rcu); +} +  #endif /* #else #ifdef CONFIG_TINY_RCU */  static inline void synchronize_rcu_bh(void) diff --git a/include/linux/rcutree.h b/include/linux/rcutree.h index e65d06634dd..67458468f1a 100644 --- a/include/linux/rcutree.h +++ b/include/linux/rcutree.h @@ -67,6 +67,8 @@ static inline void synchronize_rcu_bh_expedited(void)  }  extern void rcu_barrier(void); +extern void rcu_barrier_bh(void); +extern void rcu_barrier_sched(void);  extern unsigned long rcutorture_testseq;  extern unsigned long rcutorture_vernum; diff --git a/include/linux/regmap.h b/include/linux/regmap.h index 60a65cd7e1a..3daac2d8dc3 100644 --- a/include/linux/regmap.h +++ b/include/linux/regmap.h @@ -20,9 +20,77 @@  struct i2c_client;  struct spi_device; +/* An enum of all the supported cache types */ +enum regcache_type { +	REGCACHE_NONE, +	REGCACHE_INDEXED, +	REGCACHE_RBTREE, +	REGCACHE_LZO +}; + +/** + * Default value for a register.  We use an array of structs rather + * than a simple array as many modern devices have very sparse + * register maps. + * + * @reg: Register address. + * @def: Register default value. + */ +struct reg_default { +	unsigned int reg; +	unsigned int def; +}; + +/** + * Configuration for the register map of a device. + * + * @reg_bits: Number of bits in a register address, mandatory. + * @val_bits: Number of bits in a register value, mandatory. + * + * @writeable_reg: Optional callback returning true if the register + *                 can be written to. + * @readable_reg: Optional callback returning true if the register + *                can be read from. + * @volatile_reg: Optional callback returning true if the register + *                value can't be cached. + * @precious_reg: Optional callback returning true if the rgister + *                should not be read outside of a call from the driver + *                (eg, a clear on read interrupt status register). + * + * @max_register: Optional, specifies the maximum valid register index. + * @reg_defaults: Power on reset values for registers (for use with + *                register cache support). + * @num_reg_defaults: Number of elements in reg_defaults. + * + * @read_flag_mask: Mask to be set in the top byte of the register when doing + *                  a read. + * @write_flag_mask: Mask to be set in the top byte of the register when doing + *                   a write. If both read_flag_mask and write_flag_mask are + *                   empty the regmap_bus default masks are used. + * + * @cache_type: The actual cache type. + * @reg_defaults_raw: Power on reset values for registers (for use with + *                    register cache support). + * @num_reg_defaults_raw: Number of elements in reg_defaults_raw. + */  struct regmap_config {  	int reg_bits;  	int val_bits; + +	bool (*writeable_reg)(struct device *dev, unsigned int reg); +	bool (*readable_reg)(struct device *dev, unsigned int reg); +	bool (*volatile_reg)(struct device *dev, unsigned int reg); +	bool (*precious_reg)(struct device *dev, unsigned int reg); + +	unsigned int max_register; +	struct reg_default *reg_defaults; +	unsigned int num_reg_defaults; +	enum regcache_type cache_type; +	const void *reg_defaults_raw; +	unsigned int num_reg_defaults_raw; + +	u8 read_flag_mask; +	u8 write_flag_mask;  };  typedef int (*regmap_hw_write)(struct device *dev, const void *data, @@ -37,25 +105,18 @@ typedef int (*regmap_hw_read)(struct device *dev,  /**   * Description of a hardware bus for the register map infrastructure.   * - * @list: Internal use. - * @type: Bus type, used to identify bus to be used for a device.   * @write: Write operation.   * @gather_write: Write operation with split register/value, return -ENOTSUPP   *                if not implemented  on a given device.   * @read: Read operation.  Data is returned in the buffer used to transmit   *         data. - * @owner: Module with the bus implementation, used to pin the implementation - *         in memory.   * @read_flag_mask: Mask to be set in the top byte of the register when doing   *                  a read.   */  struct regmap_bus { -	struct list_head list; -	struct bus_type *type;  	regmap_hw_write write;  	regmap_hw_gather_write gather_write;  	regmap_hw_read read; -	struct module *owner;  	u8 read_flag_mask;  }; @@ -79,4 +140,8 @@ int regmap_bulk_read(struct regmap *map, unsigned int reg, void *val,  int regmap_update_bits(struct regmap *map, unsigned int reg,  		       unsigned int mask, unsigned int val); +int regcache_sync(struct regmap *map); +void regcache_cache_only(struct regmap *map, bool enable); +void regcache_cache_bypass(struct regmap *map, bool enable); +  #endif diff --git a/include/linux/regulator/consumer.h b/include/linux/regulator/consumer.h index b47771aa571..f7756d146c6 100644 --- a/include/linux/regulator/consumer.h +++ b/include/linux/regulator/consumer.h @@ -141,6 +141,7 @@ int regulator_enable(struct regulator *regulator);  int regulator_disable(struct regulator *regulator);  int regulator_force_disable(struct regulator *regulator);  int regulator_is_enabled(struct regulator *regulator); +int regulator_disable_deferred(struct regulator *regulator, int ms);  int regulator_bulk_get(struct device *dev, int num_consumers,  		       struct regulator_bulk_data *consumers); @@ -211,6 +212,12 @@ static inline int regulator_disable(struct regulator *regulator)  	return 0;  } +static inline int regulator_disable_deferred(struct regulator *regulator, +					     int ms) +{ +	return 0; +} +  static inline int regulator_is_enabled(struct regulator *regulator)  {  	return 1; diff --git a/include/linux/regulator/driver.h b/include/linux/regulator/driver.h index 1a80bc77517..12a1aa04b72 100644 --- a/include/linux/regulator/driver.h +++ b/include/linux/regulator/driver.h @@ -199,6 +199,9 @@ struct regulator_dev {  	struct regulation_constraints *constraints;  	struct regulator *supply;	/* for tree */ +	struct delayed_work disable_work; +	int deferred_disables; +  	void *reg_data;		/* regulator_dev data */  #ifdef CONFIG_DEBUG_FS diff --git a/include/linux/regulator/gpio-regulator.h b/include/linux/regulator/gpio-regulator.h new file mode 100644 index 00000000000..19fbd267406 --- /dev/null +++ b/include/linux/regulator/gpio-regulator.h @@ -0,0 +1,87 @@ +/* + * gpio-regulator.h + * + * Copyright 2011 Heiko Stuebner <heiko@sntech.de> + * + * based on fixed.h + * + * Copyright 2008 Wolfson Microelectronics PLC. + * + * Author: Mark Brown <broonie@opensource.wolfsonmicro.com> + * + * Copyright (c) 2009 Nokia Corporation + * Roger Quadros <ext-roger.quadros@nokia.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 __REGULATOR_GPIO_H +#define __REGULATOR_GPIO_H + +struct regulator_init_data; + +enum regulator_type; + +/** + * struct gpio_regulator_state - state description + * @value:		microvolts or microamps + * @gpios:		bitfield of gpio target-states for the value + * + * This structure describes a supported setting of the regulator + * and the necessary gpio-state to achieve it. + * + * The n-th bit in the bitfield describes the state of the n-th GPIO + * from the gpios-array defined in gpio_regulator_config below. + */ +struct gpio_regulator_state { +	int value; +	int gpios; +}; + +/** + * struct gpio_regulator_config - config structure + * @supply_name:	Name of the regulator supply + * @enable_gpio:	GPIO to use for enable control + *			set to -EINVAL if not used + * @enable_high:	Polarity of enable GPIO + *			1 = Active high, 0 = Active low + * @enabled_at_boot:	Whether regulator has been enabled at + *			boot or not. 1 = Yes, 0 = No + *			This is used to keep the regulator at + *			the default state + * @startup_delay:	Start-up time in microseconds + * @gpios:		Array containing the gpios needed to control + *			the setting of the regulator + * @nr_gpios:		Number of gpios + * @states:		Array of gpio_regulator_state entries describing + *			the gpio state for specific voltages + * @nr_states:		Number of states available + * @regulator_type:	either REGULATOR_CURRENT or REGULATOR_VOLTAGE + * @init_data:		regulator_init_data + * + * This structure contains gpio-voltage regulator configuration + * information that must be passed by platform code to the + * gpio-voltage regulator driver. + */ +struct gpio_regulator_config { +	const char *supply_name; + +	int enable_gpio; +	unsigned enable_high:1; +	unsigned enabled_at_boot:1; +	unsigned startup_delay; + +	struct gpio *gpios; +	int nr_gpios; + +	struct gpio_regulator_state *states; +	int nr_states; + +	enum regulator_type type; +	struct regulator_init_data *init_data; +}; + +#endif diff --git a/include/linux/regulator/machine.h b/include/linux/regulator/machine.h index ce3127a75c8..f3f13fd5868 100644 --- a/include/linux/regulator/machine.h +++ b/include/linux/regulator/machine.h @@ -95,7 +95,7 @@ struct regulator_state {   */  struct regulation_constraints { -	char *name; +	const char *name;  	/* voltage output range (inclusive) - for voltage control */  	int min_uV; diff --git a/include/linux/rfkill-gpio.h b/include/linux/rfkill-gpio.h index a175d059803..4d09f6eab35 100644 --- a/include/linux/rfkill-gpio.h +++ b/include/linux/rfkill-gpio.h @@ -30,6 +30,8 @@   * @reset_gpio:		GPIO which is used for reseting rfkill switch   * @shutdown_gpio:	GPIO which is used for shutdown of rfkill switch   * @power_clk_name:	[optional] name of clk to turn off while blocked + * @gpio_runtime_close:	clean up platform specific gpio configuration + * @gpio_runtime_setup:	set up platform specific gpio configuration   */  struct rfkill_gpio_platform_data { @@ -38,6 +40,8 @@ struct rfkill_gpio_platform_data {  	int			shutdown_gpio;  	const char		*power_clk_name;  	enum rfkill_type	type; +	void	(*gpio_runtime_close)(struct platform_device *); +	int	(*gpio_runtime_setup)(struct platform_device *);  };  #endif /* __RFKILL_GPIO_H */ diff --git a/include/linux/ring_buffer.h b/include/linux/ring_buffer.h index b891de96000..67be0376d8e 100644 --- a/include/linux/ring_buffer.h +++ b/include/linux/ring_buffer.h @@ -154,6 +154,8 @@ void ring_buffer_record_enable(struct ring_buffer *buffer);  void ring_buffer_record_disable_cpu(struct ring_buffer *buffer, int cpu);  void ring_buffer_record_enable_cpu(struct ring_buffer *buffer, int cpu); +unsigned long ring_buffer_oldest_event_ts(struct ring_buffer *buffer, int cpu); +unsigned long ring_buffer_bytes_cpu(struct ring_buffer *buffer, int cpu);  unsigned long ring_buffer_entries(struct ring_buffer *buffer);  unsigned long ring_buffer_overruns(struct ring_buffer *buffer);  unsigned long ring_buffer_entries_cpu(struct ring_buffer *buffer, int cpu); diff --git a/include/linux/rio_ids.h b/include/linux/rio_ids.h index 0cee0152aca..b66d13d1bdc 100644 --- a/include/linux/rio_ids.h +++ b/include/linux/rio_ids.h @@ -39,5 +39,6 @@  #define RIO_DID_IDTCPS1616		0x0379  #define RIO_DID_IDTVPS1616		0x0377  #define RIO_DID_IDTSPS1616		0x0378 +#define RIO_DID_TSI721			0x80ab  #endif				/* LINUX_RIO_IDS_H */ diff --git a/include/linux/rose.h b/include/linux/rose.h index c7b4b184c82..1fcfe95893b 100644 --- a/include/linux/rose.h +++ b/include/linux/rose.h @@ -7,6 +7,9 @@  #ifndef	ROSE_KERNEL_H  #define	ROSE_KERNEL_H +#include <linux/socket.h> +#include <linux/ax25.h> +  #define ROSE_MTU	251  #define ROSE_MAX_DIGIS 6 @@ -44,7 +47,7 @@ typedef struct {  } rose_address;  struct sockaddr_rose { -	sa_family_t	srose_family; +	__kernel_sa_family_t srose_family;  	rose_address	srose_addr;  	ax25_address	srose_call;  	int		srose_ndigis; @@ -52,7 +55,7 @@ struct sockaddr_rose {  };  struct full_sockaddr_rose { -	sa_family_t	srose_family; +	__kernel_sa_family_t srose_family;  	rose_address	srose_addr;  	ax25_address	srose_call;  	unsigned int	srose_ndigis; diff --git a/include/linux/rtc/sirfsoc_rtciobrg.h b/include/linux/rtc/sirfsoc_rtciobrg.h new file mode 100644 index 00000000000..2c92e1c8e05 --- /dev/null +++ b/include/linux/rtc/sirfsoc_rtciobrg.h @@ -0,0 +1,18 @@ +/* + * RTC I/O Bridge interfaces for CSR SiRFprimaII + * ARM access the registers of SYSRTC, GPSRTC and PWRC through this module + * + * Copyright (c) 2011 Cambridge Silicon Radio Limited, a CSR plc group company. + * + * Licensed under GPLv2 or later. + */ +#ifndef _SIRFSOC_RTC_IOBRG_H_ +#define _SIRFSOC_RTC_IOBRG_H_ + +extern void sirfsoc_rtc_iobrg_besyncing(void); + +extern u32 sirfsoc_rtc_iobrg_readl(u32 addr); + +extern void sirfsoc_rtc_iobrg_writel(u32 val, u32 addr); + +#endif diff --git a/include/linux/rwsem-spinlock.h b/include/linux/rwsem-spinlock.h index 34701241b67..d5b13bc07a0 100644 --- a/include/linux/rwsem-spinlock.h +++ b/include/linux/rwsem-spinlock.h @@ -22,7 +22,7 @@   */  struct rw_semaphore {  	__s32			activity; -	spinlock_t		wait_lock; +	raw_spinlock_t		wait_lock;  	struct list_head	wait_list;  #ifdef CONFIG_DEBUG_LOCK_ALLOC  	struct lockdep_map dep_map; diff --git a/include/linux/rwsem.h b/include/linux/rwsem.h index 6a6741440cb..63d40655439 100644 --- a/include/linux/rwsem.h +++ b/include/linux/rwsem.h @@ -25,7 +25,7 @@ struct rw_semaphore;  /* All arch specific implementations share the same struct */  struct rw_semaphore {  	long			count; -	spinlock_t		wait_lock; +	raw_spinlock_t		wait_lock;  	struct list_head	wait_list;  #ifdef CONFIG_DEBUG_LOCK_ALLOC  	struct lockdep_map	dep_map; @@ -56,9 +56,11 @@ static inline int rwsem_is_locked(struct rw_semaphore *sem)  # define __RWSEM_DEP_MAP_INIT(lockname)  #endif -#define __RWSEM_INITIALIZER(name) \ -	{ RWSEM_UNLOCKED_VALUE, __SPIN_LOCK_UNLOCKED(name.wait_lock),	\ -	  LIST_HEAD_INIT((name).wait_list) __RWSEM_DEP_MAP_INIT(name) } +#define __RWSEM_INITIALIZER(name)			\ +	{ RWSEM_UNLOCKED_VALUE,				\ +	  __RAW_SPIN_LOCK_UNLOCKED(name.wait_lock),	\ +	  LIST_HEAD_INIT((name).wait_list)		\ +	  __RWSEM_DEP_MAP_INIT(name) }  #define DECLARE_RWSEM(name) \  	struct rw_semaphore name = __RWSEM_INITIALIZER(name) diff --git a/include/linux/sched.h b/include/linux/sched.h index a4a5582dc61..68daf4f27e2 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -90,6 +90,7 @@ struct sched_param {  #include <linux/task_io_accounting.h>  #include <linux/latencytop.h>  #include <linux/cred.h> +#include <linux/llist.h>  #include <asm/processor.h> @@ -270,7 +271,6 @@ extern void init_idle_bootup_task(struct task_struct *idle);  extern int runqueue_is_locked(int cpu); -extern cpumask_var_t nohz_cpu_mask;  #if defined(CONFIG_SMP) && defined(CONFIG_NO_HZ)  extern void select_nohz_load_balancer(int stop_tick);  extern int get_nohz_timer_target(void); @@ -510,7 +510,7 @@ struct task_cputime {  struct thread_group_cputimer {  	struct task_cputime cputime;  	int running; -	spinlock_t lock; +	raw_spinlock_t lock;  };  #include <linux/rwsem.h> @@ -1225,7 +1225,7 @@ struct task_struct {  	unsigned int ptrace;  #ifdef CONFIG_SMP -	struct task_struct *wake_entry; +	struct llist_node wake_entry;  	int on_cpu;  #endif  	int on_rq; @@ -1260,9 +1260,6 @@ struct task_struct {  #ifdef CONFIG_PREEMPT_RCU  	int rcu_read_lock_nesting;  	char rcu_read_unlock_special; -#if defined(CONFIG_RCU_BOOST) && defined(CONFIG_TREE_PREEMPT_RCU) -	int rcu_boosted; -#endif /* #if defined(CONFIG_RCU_BOOST) && defined(CONFIG_TREE_PREEMPT_RCU) */  	struct list_head rcu_node_entry;  #endif /* #ifdef CONFIG_PREEMPT_RCU */  #ifdef CONFIG_TREE_PREEMPT_RCU @@ -2046,6 +2043,10 @@ static inline void sched_autogroup_fork(struct signal_struct *sig) { }  static inline void sched_autogroup_exit(struct signal_struct *sig) { }  #endif +#ifdef CONFIG_CFS_BANDWIDTH +extern unsigned int sysctl_sched_cfs_bandwidth_slice; +#endif +  #ifdef CONFIG_RT_MUTEXES  extern int rt_mutex_getprio(struct task_struct *p);  extern void rt_mutex_setprio(struct task_struct *p, int prio); @@ -2172,7 +2173,8 @@ extern int force_sigsegv(int, struct task_struct *);  extern int force_sig_info(int, struct siginfo *, struct task_struct *);  extern int __kill_pgrp_info(int sig, struct siginfo *info, struct pid *pgrp);  extern int kill_pid_info(int sig, struct siginfo *info, struct pid *pid); -extern int kill_pid_info_as_uid(int, struct siginfo *, struct pid *, uid_t, uid_t, u32); +extern int kill_pid_info_as_cred(int, struct siginfo *, struct pid *, +				const struct cred *, u32);  extern int kill_pgrp(struct pid *pid, int sig, int priv);  extern int kill_pid(struct pid *pid, int sig, int priv);  extern int kill_proc_info(int, struct siginfo *, pid_t); @@ -2572,7 +2574,7 @@ void thread_group_cputimer(struct task_struct *tsk, struct task_cputime *times);  static inline void thread_group_cputime_init(struct signal_struct *sig)  { -	spin_lock_init(&sig->cputimer.lock); +	raw_spin_lock_init(&sig->cputimer.lock);  }  /* diff --git a/include/linux/security.h b/include/linux/security.h index ebd2a53a3d0..19d8e04e168 100644 --- a/include/linux/security.h +++ b/include/linux/security.h @@ -36,6 +36,7 @@  #include <linux/key.h>  #include <linux/xfrm.h>  #include <linux/slab.h> +#include <linux/xattr.h>  #include <net/flow.h>  /* Maximum number of letters for an LSM name string */ @@ -147,6 +148,10 @@ extern int mmap_min_addr_handler(struct ctl_table *table, int write,  				 void __user *buffer, size_t *lenp, loff_t *ppos);  #endif +/* security_inode_init_security callback function to write xattrs */ +typedef int (*initxattrs) (struct inode *inode, +			   const struct xattr *xattr_array, void *fs_data); +  #ifdef CONFIG_SECURITY  struct security_mnt_opts { @@ -1367,7 +1372,7 @@ static inline void security_free_mnt_opts(struct security_mnt_opts *opts)   * @inode_getsecctx:   * 	Returns a string containing all relavent security context information   * - * 	@inode we wish to set the security context of. + * 	@inode we wish to get the security context of.   *	@ctx is a pointer in which to place the allocated security context.   *	@ctxlen points to the place to put the length of @ctx.   * This is the main security structure. @@ -1655,6 +1660,8 @@ struct security_operations {  extern int security_init(void);  extern int security_module_enable(struct security_operations *ops);  extern int register_security(struct security_operations *ops); +extern void __init security_fixup_ops(struct security_operations *ops); +  /* Security operations */  int security_ptrace_access_check(struct task_struct *child, unsigned int mode); @@ -1704,8 +1711,11 @@ int security_sb_parse_opts_str(char *options, struct security_mnt_opts *opts);  int security_inode_alloc(struct inode *inode);  void security_inode_free(struct inode *inode);  int security_inode_init_security(struct inode *inode, struct inode *dir, -				 const struct qstr *qstr, char **name, -				 void **value, size_t *len); +				 const struct qstr *qstr, +				 initxattrs initxattrs, void *fs_data); +int security_old_inode_init_security(struct inode *inode, struct inode *dir, +				     const struct qstr *qstr, char **name, +				     void **value, size_t *len);  int security_inode_create(struct inode *dir, struct dentry *dentry, int mode);  int security_inode_link(struct dentry *old_dentry, struct inode *dir,  			 struct dentry *new_dentry); @@ -2034,11 +2044,19 @@ static inline void security_inode_free(struct inode *inode)  static inline int security_inode_init_security(struct inode *inode,  						struct inode *dir,  						const struct qstr *qstr, -						char **name, -						void **value, -						size_t *len) +						initxattrs initxattrs, +						void *fs_data)  { -	return -EOPNOTSUPP; +	return 0; +} + +static inline int security_old_inode_init_security(struct inode *inode, +						   struct inode *dir, +						   const struct qstr *qstr, +						   char **name, void **value, +						   size_t *len) +{ +	return 0;  }  static inline int security_inode_create(struct inode *dir, diff --git a/include/linux/sem.h b/include/linux/sem.h index 1feb2de2ee5..10d6b226afc 100644 --- a/include/linux/sem.h +++ b/include/linux/sem.h @@ -83,13 +83,6 @@ struct  seminfo {  struct task_struct; -/* One semaphore structure for each semaphore in the system. */ -struct sem { -	int	semval;		/* current value */ -	int	sempid;		/* pid of last operation */ -	struct list_head sem_pending; /* pending single-sop operations */ -}; -  /* One sem_array data structure for each set of semaphores in the system. */  struct sem_array {  	struct kern_ipc_perm	____cacheline_aligned_in_smp @@ -103,51 +96,21 @@ struct sem_array {  	int			complex_count;	/* pending complex operations */  }; -/* One queue for each sleeping process in the system. */ -struct sem_queue { -	struct list_head	simple_list; /* queue of pending operations */ -	struct list_head	list;	 /* queue of pending operations */ -	struct task_struct	*sleeper; /* this process */ -	struct sem_undo		*undo;	 /* undo structure */ -	int    			pid;	 /* process id of requesting process */ -	int    			status;	 /* completion status of operation */ -	struct sembuf		*sops;	 /* array of pending operations */ -	int			nsops;	 /* number of operations */ -	int			alter;   /* does the operation alter the array? */ -}; - -/* Each task has a list of undo requests. They are executed automatically - * when the process exits. - */ -struct sem_undo { -	struct list_head	list_proc;	/* per-process list: all undos from one process. */ -						/* rcu protected */ -	struct rcu_head		rcu;		/* rcu struct for sem_undo() */ -	struct sem_undo_list	*ulp;		/* sem_undo_list for the process */ -	struct list_head	list_id;	/* per semaphore array list: all undos for one array */ -	int			semid;		/* semaphore set identifier */ -	short *			semadj;		/* array of adjustments, one per semaphore */ -}; - -/* sem_undo_list controls shared access to the list of sem_undo structures - * that may be shared among all a CLONE_SYSVSEM task group. - */  -struct sem_undo_list { -	atomic_t		refcnt; -	spinlock_t		lock; -	struct list_head	list_proc; -}; +#ifdef CONFIG_SYSVIPC  struct sysv_sem {  	struct sem_undo_list *undo_list;  }; -#ifdef CONFIG_SYSVIPC -  extern int copy_semundo(unsigned long clone_flags, struct task_struct *tsk);  extern void exit_sem(struct task_struct *tsk);  #else + +struct sysv_sem { +	/* empty */ +}; +  static inline int copy_semundo(unsigned long clone_flags, struct task_struct *tsk)  {  	return 0; diff --git a/include/linux/semaphore.h b/include/linux/semaphore.h index 39fa04966aa..dc368b8ce21 100644 --- a/include/linux/semaphore.h +++ b/include/linux/semaphore.h @@ -14,14 +14,14 @@  /* Please don't access any members of this structure directly */  struct semaphore { -	spinlock_t		lock; +	raw_spinlock_t		lock;  	unsigned int		count;  	struct list_head	wait_list;  };  #define __SEMAPHORE_INITIALIZER(name, n)				\  {									\ -	.lock		= __SPIN_LOCK_UNLOCKED((name).lock),		\ +	.lock		= __RAW_SPIN_LOCK_UNLOCKED((name).lock),	\  	.count		= n,						\  	.wait_list	= LIST_HEAD_INIT((name).wait_list),		\  } diff --git a/include/linux/seq_file.h b/include/linux/seq_file.h index be720cd2038..0b69a468421 100644 --- a/include/linux/seq_file.h +++ b/include/linux/seq_file.h @@ -84,8 +84,7 @@ int seq_putc(struct seq_file *m, char c);  int seq_puts(struct seq_file *m, const char *s);  int seq_write(struct seq_file *seq, const void *data, size_t len); -int seq_printf(struct seq_file *, const char *, ...) -	__attribute__ ((format (printf,2,3))); +__printf(2, 3) int seq_printf(struct seq_file *, const char *, ...);  int seq_path(struct seq_file *, struct path *, char *);  int seq_dentry(struct seq_file *, struct dentry *, char *); diff --git a/include/linux/serial.h b/include/linux/serial.h index ef914061511..97ff8e27a6c 100644 --- a/include/linux/serial.h +++ b/include/linux/serial.h @@ -211,6 +211,7 @@ struct serial_rs485 {  #define SER_RS485_RTS_ON_SEND		(1 << 1)  #define SER_RS485_RTS_AFTER_SEND	(1 << 2)  #define SER_RS485_RTS_BEFORE_SEND	(1 << 3) +#define SER_RS485_RX_DURING_TX		(1 << 4)  	__u32	delay_rts_before_send;	/* Milliseconds */  	__u32	delay_rts_after_send;	/* Milliseconds */  	__u32	padding[5];		/* Memory is cheap, new structs diff --git a/include/linux/serial_8250.h b/include/linux/serial_8250.h index 97f5b45bbc0..1f05bbeac01 100644 --- a/include/linux/serial_8250.h +++ b/include/linux/serial_8250.h @@ -35,6 +35,7 @@ struct plat_serial8250_port {  	void		(*set_termios)(struct uart_port *,  			               struct ktermios *new,  			               struct ktermios *old); +	int		(*handle_irq)(struct uart_port *);  	void		(*pm)(struct uart_port *, unsigned int state,  			      unsigned old);  }; @@ -80,6 +81,7 @@ extern void serial8250_do_set_termios(struct uart_port *port,  		struct ktermios *termios, struct ktermios *old);  extern void serial8250_do_pm(struct uart_port *port, unsigned int state,  			     unsigned int oldstate); +int serial8250_handle_irq(struct uart_port *port, unsigned int iir);  extern void serial8250_set_isa_configurator(void (*v)  					(int port, struct uart_port *up, diff --git a/include/linux/serial_core.h b/include/linux/serial_core.h index a5c31146a33..eadf33d0abb 100644 --- a/include/linux/serial_core.h +++ b/include/linux/serial_core.h @@ -46,7 +46,8 @@  #define PORT_AR7	18	/* Texas Instruments AR7 internal UART */  #define PORT_U6_16550A	19	/* ST-Ericsson U6xxx internal UART */  #define PORT_TEGRA	20	/* NVIDIA Tegra internal UART */ -#define PORT_MAX_8250	20	/* max port ID */ +#define PORT_XR17D15X	21	/* Exar XR17D15x UART */ +#define PORT_MAX_8250	21	/* max port ID */  /*   * ARM specific type numbers.  These are not currently guaranteed @@ -300,6 +301,7 @@ struct uart_port {  	void			(*set_termios)(struct uart_port *,  				               struct ktermios *new,  				               struct ktermios *old); +	int			(*handle_irq)(struct uart_port *);  	void			(*pm)(struct uart_port *, unsigned int state,  				      unsigned int old);  	unsigned int		irq;			/* irq number */ @@ -317,9 +319,7 @@ struct uart_port {  #define UPIO_MEM32		(3)  #define UPIO_AU			(4)			/* Au1x00 type IO */  #define UPIO_TSI		(5)			/* Tsi108/109 type IO */ -#define UPIO_DWAPB		(6)			/* DesignWare APB UART */ -#define UPIO_RM9000		(7)			/* RM9000 type IO */ -#define UPIO_DWAPB32		(8)			/* DesignWare APB UART (32 bit accesses) */ +#define UPIO_RM9000		(6)			/* RM9000 type IO */  	unsigned int		read_status_mask;	/* driver specific */  	unsigned int		ignore_status_mask;	/* driver specific */ @@ -350,6 +350,7 @@ struct uart_port {  #define UPF_MAGIC_MULTIPLIER	((__force upf_t) (1 << 16))  #define UPF_CONS_FLOW		((__force upf_t) (1 << 23))  #define UPF_SHARE_IRQ		((__force upf_t) (1 << 24)) +#define UPF_EXAR_EFR		((__force upf_t) (1 << 25))  /* The exact UART type is known and should not be probed.  */  #define UPF_FIXED_TYPE		((__force upf_t) (1 << 27))  #define UPF_BOOT_AUTOCONF	((__force upf_t) (1 << 28)) @@ -384,7 +385,6 @@ struct uart_state {  	int			pm_state;  	struct circ_buf		xmit; -	struct tasklet_struct	tlet;  	struct uart_port	*uart_port;  }; diff --git a/include/linux/serial_reg.h b/include/linux/serial_reg.h index c75bda37c18..8ce70d76f83 100644 --- a/include/linux/serial_reg.h +++ b/include/linux/serial_reg.h @@ -152,6 +152,7 @@   * LCR=0xBF (or DLAB=1 for 16C660)   */  #define UART_EFR	2	/* I/O: Extended Features Register */ +#define UART_XR_EFR	9	/* I/O: Extended Features Register (XR17D15x) */  #define UART_EFR_CTS		0x80 /* CTS flow control */  #define UART_EFR_RTS		0x40 /* RTS flow control */  #define UART_EFR_SCD		0x20 /* Special character detect */ diff --git a/include/linux/serial_sci.h b/include/linux/serial_sci.h index 8bffe9ae2ca..0efa1f10bc2 100644 --- a/include/linux/serial_sci.h +++ b/include/linux/serial_sci.h @@ -131,8 +131,6 @@ struct plat_sci_port {  	struct plat_sci_port_ops	*ops; -	struct device	*dma_dev; -  	unsigned int	dma_slave_tx;  	unsigned int	dma_slave_rx;  }; diff --git a/include/linux/serio.h b/include/linux/serio.h index e26f4788845..be7dfb0f12d 100644 --- a/include/linux/serio.h +++ b/include/linux/serio.h @@ -199,5 +199,6 @@ static inline void serio_continue_rx(struct serio *serio)  #define SERIO_DYNAPRO	0x3a  #define SERIO_HAMPSHIRE	0x3b  #define SERIO_PS2MULT	0x3c +#define SERIO_TSC40	0x3d  #endif diff --git a/include/linux/sh_eth.h b/include/linux/sh_eth.h new file mode 100644 index 00000000000..2076acf8294 --- /dev/null +++ b/include/linux/sh_eth.h @@ -0,0 +1,25 @@ +#ifndef __ASM_SH_ETH_H__ +#define __ASM_SH_ETH_H__ + +#include <linux/phy.h> + +enum {EDMAC_LITTLE_ENDIAN, EDMAC_BIG_ENDIAN}; +enum { +	SH_ETH_REG_GIGABIT, +	SH_ETH_REG_FAST_SH4, +	SH_ETH_REG_FAST_SH3_SH2 +}; + +struct sh_eth_plat_data { +	int phy; +	int edmac_endian; +	int register_type; +	phy_interface_t phy_interface; +	void (*set_mdio_gate)(void *addr); + +	unsigned char mac_addr[6]; +	unsigned no_ether_link:1; +	unsigned ether_link_active_low:1; +}; + +#endif diff --git a/include/linux/sh_pfc.h b/include/linux/sh_pfc.h index 30cae70874f..bc8c9208f7e 100644 --- a/include/linux/sh_pfc.h +++ b/include/linux/sh_pfc.h @@ -61,6 +61,14 @@ struct pinmux_data_reg {  	.reg = r, .reg_width = r_width,	\  	.enum_ids = (pinmux_enum_t [r_width]) \ +struct pinmux_irq { +	int irq; +	pinmux_enum_t *enum_ids; +}; + +#define PINMUX_IRQ(irq_nr, ids...)			   \ +	{ .irq = irq_nr, .enum_ids = (pinmux_enum_t []) { ids, 0 } }	\ +  struct pinmux_range {  	pinmux_enum_t begin;  	pinmux_enum_t end; @@ -87,7 +95,9 @@ struct pinmux_info {  	pinmux_enum_t *gpio_data;  	unsigned int gpio_data_size; -	unsigned long *gpio_in_use; +	struct pinmux_irq *gpio_irq; +	unsigned int gpio_irq_size; +  	struct gpio_chip chip;  }; diff --git a/include/linux/shrinker.h b/include/linux/shrinker.h index 790651b4e5b..a83833a1f7a 100644 --- a/include/linux/shrinker.h +++ b/include/linux/shrinker.h @@ -20,6 +20,7 @@ struct shrink_control {   * 'nr_to_scan' entries and attempt to free them up.  It should return   * the number of objects which remain in the cache.  If it returns -1, it means   * it cannot do any scanning at this time (eg. there is a risk of deadlock). + * The callback must not return -1 if nr_to_scan is zero.   *   * The 'gfpmask' refers to the allocation we are currently trying to   * fulfil. diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index 8bd383caa36..fe864885c1e 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h @@ -29,6 +29,7 @@  #include <linux/rcupdate.h>  #include <linux/dmaengine.h>  #include <linux/hrtimer.h> +#include <linux/dma-mapping.h>  /* Don't change this without changing skb_csum_unnecessary! */  #define CHECKSUM_NONE 0 @@ -45,6 +46,11 @@  #define SKB_MAX_HEAD(X)		(SKB_MAX_ORDER((X), 0))  #define SKB_MAX_ALLOC		(SKB_MAX_ORDER(0, 2)) +/* return minimum truesize of one skb containing X bytes of data */ +#define SKB_TRUESIZE(X) ((X) +						\ +			 SKB_DATA_ALIGN(sizeof(struct sk_buff)) +	\ +			 SKB_DATA_ALIGN(sizeof(struct skb_shared_info))) +  /* A. Checksumming of received packets by device.   *   *	NONE: device failed to checksum this packet. @@ -134,7 +140,9 @@ struct sk_buff;  typedef struct skb_frag_struct skb_frag_t;  struct skb_frag_struct { -	struct page *page; +	struct { +		struct page *p; +	} page;  #if (BITS_PER_LONG > 32) || (PAGE_SIZE >= 65536)  	__u32 page_offset;  	__u32 size; @@ -144,6 +152,26 @@ struct skb_frag_struct {  #endif  }; +static inline unsigned int skb_frag_size(const skb_frag_t *frag) +{ +	return frag->size; +} + +static inline void skb_frag_size_set(skb_frag_t *frag, unsigned int size) +{ +	frag->size = size; +} + +static inline void skb_frag_size_add(skb_frag_t *frag, int delta) +{ +	frag->size += delta; +} + +static inline void skb_frag_size_sub(skb_frag_t *frag, int delta) +{ +	frag->size -= delta; +} +  #define HAVE_HW_TIME_STAMP  /** @@ -322,6 +350,8 @@ typedef unsigned char *sk_buff_data_t;   *	@queue_mapping: Queue mapping for multiqueue devices   *	@ndisc_nodetype: router type (from link layer)   *	@ooo_okay: allow the mapping of a socket to a queue to be changed + *	@l4_rxhash: indicate rxhash is a canonical 4-tuple hash over transport + *		ports.   *	@dma_cookie: a cookie to one of several possible DMA operations   *		done by skb DMA functions   *	@secmark: security marking @@ -414,6 +444,7 @@ struct sk_buff {  	__u8			ndisc_nodetype:2;  #endif  	__u8			ooo_okay:1; +	__u8			l4_rxhash:1;  	kmemcheck_bitfield_end(flags2);  	/* 0/13 bit hole */ @@ -521,6 +552,7 @@ static inline struct sk_buff *alloc_skb_fclone(unsigned int size,  	return __alloc_skb(size, priority, 1, NUMA_NO_NODE);  } +extern void skb_recycle(struct sk_buff *skb);  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); @@ -573,11 +605,11 @@ extern unsigned int   skb_find_text(struct sk_buff *skb, unsigned int from,  				    unsigned int to, struct ts_config *config,  				    struct ts_state *state); -extern __u32 __skb_get_rxhash(struct sk_buff *skb); +extern void __skb_get_rxhash(struct sk_buff *skb);  static inline __u32 skb_get_rxhash(struct sk_buff *skb)  {  	if (!skb->rxhash) -		skb->rxhash = __skb_get_rxhash(skb); +		__skb_get_rxhash(skb);  	return skb->rxhash;  } @@ -823,9 +855,9 @@ static inline struct sk_buff *skb_unshare(struct sk_buff *skb,   *	The reference count is not incremented and the reference is therefore   *	volatile. Use with caution.   */ -static inline struct sk_buff *skb_peek(struct sk_buff_head *list_) +static inline struct sk_buff *skb_peek(const struct sk_buff_head *list_)  { -	struct sk_buff *list = ((struct sk_buff *)list_)->next; +	struct sk_buff *list = ((const struct sk_buff *)list_)->next;  	if (list == (struct sk_buff *)list_)  		list = NULL;  	return list; @@ -844,9 +876,9 @@ static inline struct sk_buff *skb_peek(struct sk_buff_head *list_)   *	The reference count is not incremented and the reference is therefore   *	volatile. Use with caution.   */ -static inline struct sk_buff *skb_peek_tail(struct sk_buff_head *list_) +static inline struct sk_buff *skb_peek_tail(const struct sk_buff_head *list_)  { -	struct sk_buff *list = ((struct sk_buff *)list_)->prev; +	struct sk_buff *list = ((const struct sk_buff *)list_)->prev;  	if (list == (struct sk_buff *)list_)  		list = NULL;  	return list; @@ -1123,18 +1155,51 @@ static inline int skb_pagelen(const struct sk_buff *skb)  	int i, len = 0;  	for (i = (int)skb_shinfo(skb)->nr_frags - 1; i >= 0; i--) -		len += skb_shinfo(skb)->frags[i].size; +		len += skb_frag_size(&skb_shinfo(skb)->frags[i]);  	return len + skb_headlen(skb);  } -static inline void skb_fill_page_desc(struct sk_buff *skb, int i, -				      struct page *page, int off, int size) +/** + * __skb_fill_page_desc - initialise a paged fragment in an skb + * @skb: buffer containing fragment to be initialised + * @i: paged fragment index to initialise + * @page: the page to use for this fragment + * @off: the offset to the data with @page + * @size: the length of the data + * + * Initialises the @i'th fragment of @skb to point to &size bytes at + * offset @off within @page. + * + * Does not take any additional reference on the fragment. + */ +static inline void __skb_fill_page_desc(struct sk_buff *skb, int i, +					struct page *page, int off, int size)  {  	skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; -	frag->page		  = page; +	frag->page.p		  = page;  	frag->page_offset	  = off; -	frag->size		  = size; +	skb_frag_size_set(frag, size); +} + +/** + * skb_fill_page_desc - initialise a paged fragment in an skb + * @skb: buffer containing fragment to be initialised + * @i: paged fragment index to initialise + * @page: the page to use for this fragment + * @off: the offset to the data with @page + * @size: the length of the data + * + * As per __skb_fill_page_desc() -- initialises the @i'th fragment of + * @skb to point to &size bytes at offset @off within @page. In + * addition updates @skb such that @i is the last fragment. + * + * Does not take any additional reference on the fragment. + */ +static inline void skb_fill_page_desc(struct sk_buff *skb, int i, +				      struct page *page, int off, int size) +{ +	__skb_fill_page_desc(skb, i, page, off, size);  	skb_shinfo(skb)->nr_frags = i + 1;  } @@ -1629,6 +1694,137 @@ static inline void netdev_free_page(struct net_device *dev, struct page *page)  }  /** + * skb_frag_page - retrieve the page refered to by a paged fragment + * @frag: the paged fragment + * + * Returns the &struct page associated with @frag. + */ +static inline struct page *skb_frag_page(const skb_frag_t *frag) +{ +	return frag->page.p; +} + +/** + * __skb_frag_ref - take an addition reference on a paged fragment. + * @frag: the paged fragment + * + * Takes an additional reference on the paged fragment @frag. + */ +static inline void __skb_frag_ref(skb_frag_t *frag) +{ +	get_page(skb_frag_page(frag)); +} + +/** + * skb_frag_ref - take an addition reference on a paged fragment of an skb. + * @skb: the buffer + * @f: the fragment offset. + * + * Takes an additional reference on the @f'th paged fragment of @skb. + */ +static inline void skb_frag_ref(struct sk_buff *skb, int f) +{ +	__skb_frag_ref(&skb_shinfo(skb)->frags[f]); +} + +/** + * __skb_frag_unref - release a reference on a paged fragment. + * @frag: the paged fragment + * + * Releases a reference on the paged fragment @frag. + */ +static inline void __skb_frag_unref(skb_frag_t *frag) +{ +	put_page(skb_frag_page(frag)); +} + +/** + * skb_frag_unref - release a reference on a paged fragment of an skb. + * @skb: the buffer + * @f: the fragment offset + * + * Releases a reference on the @f'th paged fragment of @skb. + */ +static inline void skb_frag_unref(struct sk_buff *skb, int f) +{ +	__skb_frag_unref(&skb_shinfo(skb)->frags[f]); +} + +/** + * skb_frag_address - gets the address of the data contained in a paged fragment + * @frag: the paged fragment buffer + * + * Returns the address of the data within @frag. The page must already + * be mapped. + */ +static inline void *skb_frag_address(const skb_frag_t *frag) +{ +	return page_address(skb_frag_page(frag)) + frag->page_offset; +} + +/** + * skb_frag_address_safe - gets the address of the data contained in a paged fragment + * @frag: the paged fragment buffer + * + * Returns the address of the data within @frag. Checks that the page + * is mapped and returns %NULL otherwise. + */ +static inline void *skb_frag_address_safe(const skb_frag_t *frag) +{ +	void *ptr = page_address(skb_frag_page(frag)); +	if (unlikely(!ptr)) +		return NULL; + +	return ptr + frag->page_offset; +} + +/** + * __skb_frag_set_page - sets the page contained in a paged fragment + * @frag: the paged fragment + * @page: the page to set + * + * Sets the fragment @frag to contain @page. + */ +static inline void __skb_frag_set_page(skb_frag_t *frag, struct page *page) +{ +	frag->page.p = page; +} + +/** + * skb_frag_set_page - sets the page contained in a paged fragment of an skb + * @skb: the buffer + * @f: the fragment offset + * @page: the page to set + * + * Sets the @f'th fragment of @skb to contain @page. + */ +static inline void skb_frag_set_page(struct sk_buff *skb, int f, +				     struct page *page) +{ +	__skb_frag_set_page(&skb_shinfo(skb)->frags[f], page); +} + +/** + * skb_frag_dma_map - maps a paged fragment via the DMA API + * @dev: the device to map the fragment to + * @frag: the paged fragment to map + * @offset: the offset within the fragment (starting at the + *          fragment's own offset) + * @size: the number of bytes to map + * @dir: the direction of the mapping (%PCI_DMA_*) + * + * Maps the page associated with @frag to @device. + */ +static inline dma_addr_t skb_frag_dma_map(struct device *dev, +					  const skb_frag_t *frag, +					  size_t offset, size_t size, +					  enum dma_data_direction dir) +{ +	return dma_map_page(dev, skb_frag_page(frag), +			    frag->page_offset + offset, size, dir); +} + +/**   *	skb_clone_writable - is the header of a clone writable   *	@skb: buffer to check   *	@len: length up to which to write @@ -1636,7 +1832,7 @@ static inline void netdev_free_page(struct net_device *dev, struct page *page)   *	Returns true if modifying the header part of the cloned buffer   *	does not requires the data to be copied.   */ -static inline int skb_clone_writable(struct sk_buff *skb, unsigned int len) +static inline int skb_clone_writable(const struct sk_buff *skb, unsigned int len)  {  	return !skb_header_cloned(skb) &&  	       skb_headroom(skb) + len <= skb->hdr_len; @@ -1730,13 +1926,13 @@ static inline int skb_add_data(struct sk_buff *skb,  }  static inline int skb_can_coalesce(struct sk_buff *skb, int i, -				   struct page *page, int off) +				   const struct page *page, int off)  {  	if (i) { -		struct skb_frag_struct *frag = &skb_shinfo(skb)->frags[i - 1]; +		const struct skb_frag_struct *frag = &skb_shinfo(skb)->frags[i - 1]; -		return page == frag->page && -		       off == frag->page_offset + frag->size; +		return page == skb_frag_page(frag) && +		       off == frag->page_offset + skb_frag_size(frag);  	}  	return 0;  } @@ -2020,8 +2216,13 @@ static inline bool skb_defer_rx_timestamp(struct sk_buff *skb)  /**   * skb_complete_tx_timestamp() - deliver cloned skb with tx timestamps   * + * PHY drivers may accept clones of transmitted packets for + * timestamping via their phy_driver.txtstamp method. These drivers + * must call this function to return the skb back to the stack, with + * or without a timestamp. + *   * @skb: clone of the the original outgoing packet - * @hwtstamps: hardware time stamps + * @hwtstamps: hardware time stamps, may be NULL if not available   *   */  void skb_complete_tx_timestamp(struct sk_buff *skb, @@ -2257,7 +2458,8 @@ static inline bool skb_warn_if_lro(const struct sk_buff *skb)  {  	/* LRO sets gso_size but not gso_type, whereas if GSO is really  	 * wanted then gso_type will be set. */ -	struct skb_shared_info *shinfo = skb_shinfo(skb); +	const struct skb_shared_info *shinfo = skb_shinfo(skb); +  	if (skb_is_nonlinear(skb) && shinfo->gso_size != 0 &&  	    unlikely(shinfo->gso_type == 0)) {  		__skb_warn_lro_forwarding(skb); @@ -2281,7 +2483,7 @@ static inline void skb_forward_csum(struct sk_buff *skb)   * Instead of forcing ip_summed to CHECKSUM_NONE, we can   * use this helper, to document places where we make this assertion.   */ -static inline void skb_checksum_none_assert(struct sk_buff *skb) +static inline void skb_checksum_none_assert(const struct sk_buff *skb)  {  #ifdef DEBUG  	BUG_ON(skb->ip_summed != CHECKSUM_NONE); @@ -2290,5 +2492,25 @@ static inline void skb_checksum_none_assert(struct sk_buff *skb)  bool skb_partial_csum_set(struct sk_buff *skb, u16 start, u16 off); +static inline bool skb_is_recycleable(const struct sk_buff *skb, int skb_size) +{ +	if (irqs_disabled()) +		return false; + +	if (skb_shinfo(skb)->tx_flags & SKBTX_DEV_ZEROCOPY) +		return false; + +	if (skb_is_nonlinear(skb) || skb->fclone != SKB_FCLONE_UNAVAILABLE) +		return false; + +	skb_size = SKB_DATA_ALIGN(skb_size + NET_SKB_PAD); +	if (skb_end_pointer(skb) - skb->head < skb_size) +		return false; + +	if (skb_shared(skb) || skb_cloned(skb)) +		return false; + +	return true; +}  #endif	/* __KERNEL__ */  #endif	/* _LINUX_SKBUFF_H */ diff --git a/include/linux/slub_def.h b/include/linux/slub_def.h index f58d6413d23..a32bcfdc783 100644 --- a/include/linux/slub_def.h +++ b/include/linux/slub_def.h @@ -36,12 +36,15 @@ enum stat_item {  	ORDER_FALLBACK,		/* Number of times fallback was necessary */  	CMPXCHG_DOUBLE_CPU_FAIL,/* Failure of this_cpu_cmpxchg_double */  	CMPXCHG_DOUBLE_FAIL,	/* Number of times that cmpxchg double did not match */ +	CPU_PARTIAL_ALLOC,	/* Used cpu partial on alloc */ +	CPU_PARTIAL_FREE,	/* USed cpu partial on free */  	NR_SLUB_STAT_ITEMS };  struct kmem_cache_cpu {  	void **freelist;	/* Pointer to next available object */  	unsigned long tid;	/* Globally unique transaction id */  	struct page *page;	/* The slab from which we are allocating */ +	struct page *partial;	/* Partially allocated frozen slabs */  	int node;		/* The node of the page (or -1 for debug) */  #ifdef CONFIG_SLUB_STATS  	unsigned stat[NR_SLUB_STAT_ITEMS]; @@ -79,6 +82,7 @@ struct kmem_cache {  	int size;		/* The size of an object including meta data */  	int objsize;		/* The size of an object without meta data */  	int offset;		/* Free pointer offset. */ +	int cpu_partial;	/* Number of per cpu partial objects to keep around */  	struct kmem_cache_order_objects oo;  	/* Allocation and freeing of slabs */ diff --git a/include/linux/spi/l4f00242t03.h b/include/linux/spi/l4f00242t03.h index aee1dbda4ed..bc8677c8eba 100644 --- a/include/linux/spi/l4f00242t03.h +++ b/include/linux/spi/l4f00242t03.h @@ -24,8 +24,6 @@  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/ssb/ssb.h b/include/linux/ssb/ssb.h index 8623217f84d..f10ed7b4a71 100644 --- a/include/linux/ssb/ssb.h +++ b/include/linux/ssb/ssb.h @@ -25,7 +25,7 @@ struct ssb_sprom {  	u8 et1phyaddr;		/* MII address for enet1 */  	u8 et0mdcport;		/* MDIO for enet0 */  	u8 et1mdcport;		/* MDIO for enet1 */ -	u8 board_rev;		/* Board revision number from SPROM. */ +	u16 board_rev;		/* Board revision number from SPROM. */  	u8 country_code;	/* Country Code */  	u16 leddc_on_time;	/* LED Powersave Duty Cycle On Count */  	u16 leddc_off_time;	/* LED Powersave Duty Cycle Off Count */ diff --git a/include/linux/ssb/ssb_regs.h b/include/linux/ssb/ssb_regs.h index efbf459d571..98941203a27 100644 --- a/include/linux/ssb/ssb_regs.h +++ b/include/linux/ssb/ssb_regs.h @@ -462,6 +462,46 @@  #define SSB_SPROM8_OFDM5GLPO		0x014A	/* 5.2GHz OFDM power offset */  #define SSB_SPROM8_OFDM5GHPO		0x014E	/* 5.8GHz OFDM power offset */ +/* Values for boardflags_lo read from SPROM */ +#define SSB_BFL_BTCOEXIST		0x0001	/* implements Bluetooth coexistance */ +#define SSB_BFL_PACTRL			0x0002	/* GPIO 9 controlling the PA */ +#define SSB_BFL_AIRLINEMODE		0x0004	/* implements GPIO 13 radio disable indication */ +#define SSB_BFL_RSSI			0x0008	/* software calculates nrssi slope. */ +#define SSB_BFL_ENETSPI			0x0010	/* has ephy roboswitch spi */ +#define SSB_BFL_XTAL_NOSLOW		0x0020	/* no slow clock available */ +#define SSB_BFL_CCKHIPWR		0x0040	/* can do high power CCK transmission */ +#define SSB_BFL_ENETADM			0x0080	/* has ADMtek switch */ +#define SSB_BFL_ENETVLAN		0x0100	/* can do vlan */ +#define SSB_BFL_AFTERBURNER		0x0200	/* supports Afterburner mode */ +#define SSB_BFL_NOPCI			0x0400	/* board leaves PCI floating */ +#define SSB_BFL_FEM			0x0800	/* supports the Front End Module */ +#define SSB_BFL_EXTLNA			0x1000	/* has an external LNA */ +#define SSB_BFL_HGPA			0x2000	/* had high gain PA */ +#define SSB_BFL_BTCMOD			0x4000	/* BFL_BTCOEXIST is given in alternate GPIOs */ +#define SSB_BFL_ALTIQ			0x8000	/* alternate I/Q settings */ + +/* Values for boardflags_hi read from SPROM */ +#define SSB_BFH_NOPA			0x0001	/* has no PA */ +#define SSB_BFH_RSSIINV			0x0002	/* RSSI uses positive slope (not TSSI) */ +#define SSB_BFH_PAREF			0x0004	/* uses the PARef LDO */ +#define SSB_BFH_3TSWITCH		0x0008	/* uses a triple throw switch shared with bluetooth */ +#define SSB_BFH_PHASESHIFT		0x0010	/* can support phase shifter */ +#define SSB_BFH_BUCKBOOST		0x0020	/* has buck/booster */ +#define SSB_BFH_FEM_BT			0x0040	/* has FEM and switch to share antenna with bluetooth */ + +/* Values for boardflags2_lo read from SPROM */ +#define SSB_BFL2_RXBB_INT_REG_DIS	0x0001	/* external RX BB regulator present */ +#define SSB_BFL2_APLL_WAR		0x0002	/* alternative A-band PLL settings implemented */ +#define SSB_BFL2_TXPWRCTRL_EN 		0x0004	/* permits enabling TX Power Control */ +#define SSB_BFL2_2X4_DIV		0x0008	/* 2x4 diversity switch */ +#define SSB_BFL2_5G_PWRGAIN		0x0010	/* supports 5G band power gain */ +#define SSB_BFL2_PCIEWAR_OVR		0x0020	/* overrides ASPM and Clkreq settings */ +#define SSB_BFL2_CAESERS_BRD		0x0040	/* is Caesers board (unused) */ +#define SSB_BFL2_BTC3WIRE		0x0080	/* used 3-wire bluetooth coexist */ +#define SSB_BFL2_SKWRKFEM_BRD		0x0100	/* 4321mcm93 uses Skyworks FEM */ +#define SSB_BFL2_SPUR_WAR		0x0200	/* has a workaround for clock-harmonic spurs */ +#define SSB_BFL2_GPLL_WAR		0x0400	/* altenative G-band PLL settings implemented */ +  /* Values for SSB_SPROM1_BINF_CCODE */  enum {  	SSB_SPROM1CCODE_WORLD = 0, diff --git a/include/linux/string.h b/include/linux/string.h index a176db2f2c8..e033564f10b 100644 --- a/include/linux/string.h +++ b/include/linux/string.h @@ -114,6 +114,7 @@ extern int memcmp(const void *,const void *,__kernel_size_t);  #ifndef __HAVE_ARCH_MEMCHR  extern void * memchr(const void *,int,__kernel_size_t);  #endif +void *memchr_inv(const void *s, int c, size_t n);  extern char *kstrdup(const char *s, gfp_t gfp);  extern char *kstrndup(const char *s, size_t len, gfp_t gfp); diff --git a/include/linux/sungem_phy.h b/include/linux/sungem_phy.h new file mode 100644 index 00000000000..bd9be9f59d3 --- /dev/null +++ b/include/linux/sungem_phy.h @@ -0,0 +1,132 @@ +#ifndef __SUNGEM_PHY_H__ +#define __SUNGEM_PHY_H__ + +struct mii_phy; + +/* Operations supported by any kind of PHY */ +struct mii_phy_ops +{ +	int		(*init)(struct mii_phy *phy); +	int		(*suspend)(struct mii_phy *phy); +	int		(*setup_aneg)(struct mii_phy *phy, u32 advertise); +	int		(*setup_forced)(struct mii_phy *phy, int speed, int fd); +	int		(*poll_link)(struct mii_phy *phy); +	int		(*read_link)(struct mii_phy *phy); +	int		(*enable_fiber)(struct mii_phy *phy, int autoneg); +}; + +/* Structure used to statically define an mii/gii based PHY */ +struct mii_phy_def +{ +	u32				phy_id;		/* Concatenated ID1 << 16 | ID2 */ +	u32				phy_id_mask;	/* Significant bits */ +	u32				features;	/* Ethtool SUPPORTED_* defines */ +	int				magic_aneg;	/* Autoneg does all speed test for us */ +	const char*			name; +	const struct mii_phy_ops*	ops; +}; + +enum { +	BCM54XX_COPPER, +	BCM54XX_FIBER, +	BCM54XX_GBIC, +	BCM54XX_SGMII, +	BCM54XX_UNKNOWN, +}; + +/* An instance of a PHY, partially borrowed from mii_if_info */ +struct mii_phy +{ +	struct mii_phy_def*	def; +	u32			advertising; +	int			mii_id; + +	/* 1: autoneg enabled, 0: disabled */ +	int			autoneg; + +	/* forced speed & duplex (no autoneg) +	 * partner speed & duplex & pause (autoneg) +	 */ +	int			speed; +	int			duplex; +	int			pause; + +	/* Provided by host chip */ +	struct net_device	*dev; +	int (*mdio_read) (struct net_device *dev, int mii_id, int reg); +	void (*mdio_write) (struct net_device *dev, int mii_id, int reg, int val); +	void			*platform_data; +}; + +/* Pass in a struct mii_phy with dev, mdio_read and mdio_write + * filled, the remaining fields will be filled on return + */ +extern int sungem_phy_probe(struct mii_phy *phy, int mii_id); + + +/* MII definitions missing from mii.h */ + +#define BMCR_SPD2	0x0040		/* Gigabit enable (bcm54xx)	*/ +#define LPA_PAUSE	0x0400 + +/* More PHY registers (model specific) */ + +/* MII BCM5201 MULTIPHY interrupt register */ +#define MII_BCM5201_INTERRUPT			0x1A +#define MII_BCM5201_INTERRUPT_INTENABLE		0x4000 + +#define MII_BCM5201_AUXMODE2			0x1B +#define MII_BCM5201_AUXMODE2_LOWPOWER		0x0008 + +#define MII_BCM5201_MULTIPHY                    0x1E + +/* MII BCM5201 MULTIPHY register bits */ +#define MII_BCM5201_MULTIPHY_SERIALMODE         0x0002 +#define MII_BCM5201_MULTIPHY_SUPERISOLATE       0x0008 + +/* MII BCM5221 Additional registers */ +#define MII_BCM5221_TEST			0x1f +#define MII_BCM5221_TEST_ENABLE_SHADOWS		0x0080 +#define MII_BCM5221_SHDOW_AUX_STAT2		0x1b +#define MII_BCM5221_SHDOW_AUX_STAT2_APD		0x0020 +#define MII_BCM5221_SHDOW_AUX_MODE4		0x1a +#define MII_BCM5221_SHDOW_AUX_MODE4_IDDQMODE	0x0001 +#define MII_BCM5221_SHDOW_AUX_MODE4_CLKLOPWR	0x0004 + +/* MII BCM5241 Additional registers */ +#define MII_BCM5241_SHDOW_AUX_MODE4_STANDBYPWR	0x0008 + +/* MII BCM5400 1000-BASET Control register */ +#define MII_BCM5400_GB_CONTROL			0x09 +#define MII_BCM5400_GB_CONTROL_FULLDUPLEXCAP	0x0200 + +/* MII BCM5400 AUXCONTROL register */ +#define MII_BCM5400_AUXCONTROL                  0x18 +#define MII_BCM5400_AUXCONTROL_PWR10BASET       0x0004 + +/* MII BCM5400 AUXSTATUS register */ +#define MII_BCM5400_AUXSTATUS                   0x19 +#define MII_BCM5400_AUXSTATUS_LINKMODE_MASK     0x0700 +#define MII_BCM5400_AUXSTATUS_LINKMODE_SHIFT    8 + +/* 1000BT control (Marvell & BCM54xx at least) */ +#define MII_1000BASETCONTROL			0x09 +#define MII_1000BASETCONTROL_FULLDUPLEXCAP	0x0200 +#define MII_1000BASETCONTROL_HALFDUPLEXCAP	0x0100 + +/* Marvell 88E1011 PHY control */ +#define MII_M1011_PHY_SPEC_CONTROL		0x10 +#define MII_M1011_PHY_SPEC_CONTROL_MANUAL_MDIX	0x20 +#define MII_M1011_PHY_SPEC_CONTROL_AUTO_MDIX	0x40 + +/* Marvell 88E1011 PHY status */ +#define MII_M1011_PHY_SPEC_STATUS		0x11 +#define MII_M1011_PHY_SPEC_STATUS_1000		0x8000 +#define MII_M1011_PHY_SPEC_STATUS_100		0x4000 +#define MII_M1011_PHY_SPEC_STATUS_SPD_MASK	0xc000 +#define MII_M1011_PHY_SPEC_STATUS_FULLDUPLEX	0x2000 +#define MII_M1011_PHY_SPEC_STATUS_RESOLVED	0x0800 +#define MII_M1011_PHY_SPEC_STATUS_TX_PAUSE	0x0008 +#define MII_M1011_PHY_SPEC_STATUS_RX_PAUSE	0x0004 + +#endif /* __SUNGEM_PHY_H__ */ diff --git a/include/linux/sunrpc/clnt.h b/include/linux/sunrpc/clnt.h index db7bcaf7c5b..3d8f9c44e27 100644 --- a/include/linux/sunrpc/clnt.h +++ b/include/linux/sunrpc/clnt.h @@ -9,6 +9,7 @@  #ifndef _LINUX_SUNRPC_CLNT_H  #define _LINUX_SUNRPC_CLNT_H +#include <linux/types.h>  #include <linux/socket.h>  #include <linux/in.h>  #include <linux/in6.h> @@ -135,6 +136,8 @@ void		rpc_shutdown_client(struct rpc_clnt *);  void		rpc_release_client(struct rpc_clnt *);  void		rpc_task_release_client(struct rpc_task *); +int		rpcb_create_local(void); +void		rpcb_put_local(void);  int		rpcb_register(u32, u32, int, unsigned short);  int		rpcb_v4_register(const u32 program, const u32 version,  				 const struct sockaddr *address, @@ -161,7 +164,7 @@ const char	*rpc_peeraddr2str(struct rpc_clnt *, enum rpc_display_format_t);  size_t		rpc_ntop(const struct sockaddr *, char *, const size_t);  size_t		rpc_pton(const char *, const size_t,  			 struct sockaddr *, const size_t); -char *		rpc_sockaddr2uaddr(const struct sockaddr *); +char *		rpc_sockaddr2uaddr(const struct sockaddr *, gfp_t);  size_t		rpc_uaddr2sockaddr(const char *, const size_t,  				   struct sockaddr *, const size_t); @@ -218,7 +221,13 @@ static inline bool __rpc_cmp_addr6(const struct sockaddr *sap1,  {  	const struct sockaddr_in6 *sin1 = (const struct sockaddr_in6 *)sap1;  	const struct sockaddr_in6 *sin2 = (const struct sockaddr_in6 *)sap2; -	return ipv6_addr_equal(&sin1->sin6_addr, &sin2->sin6_addr); + +	if (!ipv6_addr_equal(&sin1->sin6_addr, &sin2->sin6_addr)) +		return false; +	else if (ipv6_addr_type(&sin1->sin6_addr) & IPV6_ADDR_LINKLOCAL) +		return sin1->sin6_scope_id == sin2->sin6_scope_id; + +	return true;  }  static inline bool __rpc_copy_addr6(struct sockaddr *dst, diff --git a/include/linux/sunrpc/rpc_pipe_fs.h b/include/linux/sunrpc/rpc_pipe_fs.h index cf14db975da..e4ea43058d8 100644 --- a/include/linux/sunrpc/rpc_pipe_fs.h +++ b/include/linux/sunrpc/rpc_pipe_fs.h @@ -44,6 +44,8 @@ RPC_I(struct inode *inode)  	return container_of(inode, struct rpc_inode, vfs_inode);  } +extern ssize_t rpc_pipe_generic_upcall(struct file *, struct rpc_pipe_msg *, +				       char __user *, size_t);  extern int rpc_queue_upcall(struct inode *, struct rpc_pipe_msg *);  struct rpc_clnt; diff --git a/include/linux/sunrpc/svc.h b/include/linux/sunrpc/svc.h index 223588a976a..35b37b1e929 100644 --- a/include/linux/sunrpc/svc.h +++ b/include/linux/sunrpc/svc.h @@ -212,11 +212,6 @@ static inline void svc_putu32(struct kvec *iov, __be32 val)  	iov->iov_len += sizeof(__be32);  } -union svc_addr_u { -    struct in_addr	addr; -    struct in6_addr	addr6; -}; -  /*   * The context of a single thread, including the request currently being   * processed. @@ -225,8 +220,12 @@ struct svc_rqst {  	struct list_head	rq_list;	/* idle list */  	struct list_head	rq_all;		/* all threads list */  	struct svc_xprt *	rq_xprt;	/* transport ptr */ +  	struct sockaddr_storage	rq_addr;	/* peer address */  	size_t			rq_addrlen; +	struct sockaddr_storage	rq_daddr;	/* dest addr of request +						 *  - reply from here */ +	size_t			rq_daddrlen;  	struct svc_serv *	rq_server;	/* RPC service definition */  	struct svc_pool *	rq_pool;	/* thread pool */ @@ -255,9 +254,6 @@ struct svc_rqst {  	unsigned short  				rq_secure  : 1;	/* secure port */ -	union svc_addr_u	rq_daddr;	/* dest addr of request -						 *  - reply from here */ -  	void *			rq_argp;	/* decoded arguments */  	void *			rq_resp;	/* xdr'd results */  	void *			rq_auth_data;	/* flavor-specific data */ @@ -300,6 +296,21 @@ static inline struct sockaddr *svc_addr(const struct svc_rqst *rqst)  	return (struct sockaddr *) &rqst->rq_addr;  } +static inline struct sockaddr_in *svc_daddr_in(const struct svc_rqst *rqst) +{ +	return (struct sockaddr_in *) &rqst->rq_daddr; +} + +static inline struct sockaddr_in6 *svc_daddr_in6(const struct svc_rqst *rqst) +{ +	return (struct sockaddr_in6 *) &rqst->rq_daddr; +} + +static inline struct sockaddr *svc_daddr(const struct svc_rqst *rqst) +{ +	return (struct sockaddr *) &rqst->rq_daddr; +} +  /*   * Check buffer bounds after decoding arguments   */ @@ -340,7 +351,8 @@ struct svc_deferred_req {  	struct svc_xprt		*xprt;  	struct sockaddr_storage	addr;	/* where reply must go */  	size_t			addrlen; -	union svc_addr_u	daddr;	/* where reply must come from */ +	struct sockaddr_storage	daddr;	/* where reply must come from */ +	size_t			daddrlen;  	struct cache_deferred_req handle;  	size_t			xprt_hlen;  	int			argslen; @@ -401,10 +413,11 @@ struct svc_procedure {  /*   * Function prototypes.   */ +void svc_rpcb_cleanup(struct svc_serv *serv);  struct svc_serv *svc_create(struct svc_program *, unsigned int,  			    void (*shutdown)(struct svc_serv *));  struct svc_rqst *svc_prepare_thread(struct svc_serv *serv, -					struct svc_pool *pool); +					struct svc_pool *pool, int node);  void		   svc_exit_thread(struct svc_rqst *);  struct svc_serv *  svc_create_pooled(struct svc_program *, unsigned int,  			void (*shutdown)(struct svc_serv *), diff --git a/include/linux/suspend.h b/include/linux/suspend.h index 6bbcef22e10..57a692432f8 100644 --- a/include/linux/suspend.h +++ b/include/linux/suspend.h @@ -8,15 +8,18 @@  #include <linux/mm.h>  #include <asm/errno.h> -#if defined(CONFIG_PM_SLEEP) && defined(CONFIG_VT) && defined(CONFIG_VT_CONSOLE) +#ifdef CONFIG_VT  extern void pm_set_vt_switch(int); -extern int pm_prepare_console(void); -extern void pm_restore_console(void);  #else  static inline void pm_set_vt_switch(int do_switch)  {  } +#endif +#ifdef CONFIG_VT_CONSOLE_SLEEP +extern int pm_prepare_console(void); +extern void pm_restore_console(void); +#else  static inline int pm_prepare_console(void)  {  	return 0; @@ -34,6 +37,58 @@ typedef int __bitwise suspend_state_t;  #define PM_SUSPEND_MEM		((__force suspend_state_t) 3)  #define PM_SUSPEND_MAX		((__force suspend_state_t) 4) +enum suspend_stat_step { +	SUSPEND_FREEZE = 1, +	SUSPEND_PREPARE, +	SUSPEND_SUSPEND, +	SUSPEND_SUSPEND_NOIRQ, +	SUSPEND_RESUME_NOIRQ, +	SUSPEND_RESUME +}; + +struct suspend_stats { +	int	success; +	int	fail; +	int	failed_freeze; +	int	failed_prepare; +	int	failed_suspend; +	int	failed_suspend_noirq; +	int	failed_resume; +	int	failed_resume_noirq; +#define	REC_FAILED_NUM	2 +	int	last_failed_dev; +	char	failed_devs[REC_FAILED_NUM][40]; +	int	last_failed_errno; +	int	errno[REC_FAILED_NUM]; +	int	last_failed_step; +	enum suspend_stat_step	failed_steps[REC_FAILED_NUM]; +}; + +extern struct suspend_stats suspend_stats; + +static inline void dpm_save_failed_dev(const char *name) +{ +	strlcpy(suspend_stats.failed_devs[suspend_stats.last_failed_dev], +		name, +		sizeof(suspend_stats.failed_devs[0])); +	suspend_stats.last_failed_dev++; +	suspend_stats.last_failed_dev %= REC_FAILED_NUM; +} + +static inline void dpm_save_failed_errno(int err) +{ +	suspend_stats.errno[suspend_stats.last_failed_errno] = err; +	suspend_stats.last_failed_errno++; +	suspend_stats.last_failed_errno %= REC_FAILED_NUM; +} + +static inline void dpm_save_failed_step(enum suspend_stat_step step) +{ +	suspend_stats.failed_steps[suspend_stats.last_failed_step] = step; +	suspend_stats.last_failed_step++; +	suspend_stats.last_failed_step %= REC_FAILED_NUM; +} +  /**   * struct platform_suspend_ops - Callbacks for managing platform dependent   *	system sleep states. @@ -334,4 +389,38 @@ static inline void unlock_system_sleep(void)  }  #endif +#ifdef CONFIG_ARCH_SAVE_PAGE_KEYS +/* + * The ARCH_SAVE_PAGE_KEYS functions can be used by an architecture + * to save/restore additional information to/from the array of page + * frame numbers in the hibernation image. For s390 this is used to + * save and restore the storage key for each page that is included + * in the hibernation image. + */ +unsigned long page_key_additional_pages(unsigned long pages); +int page_key_alloc(unsigned long pages); +void page_key_free(void); +void page_key_read(unsigned long *pfn); +void page_key_memorize(unsigned long *pfn); +void page_key_write(void *address); + +#else /* !CONFIG_ARCH_SAVE_PAGE_KEYS */ + +static inline unsigned long page_key_additional_pages(unsigned long pages) +{ +	return 0; +} + +static inline int  page_key_alloc(unsigned long pages) +{ +	return 0; +} + +static inline void page_key_free(void) {} +static inline void page_key_read(unsigned long *pfn) {} +static inline void page_key_memorize(unsigned long *pfn) {} +static inline void page_key_write(void *address) {} + +#endif /* !CONFIG_ARCH_SAVE_PAGE_KEYS */ +  #endif /* _LINUX_SUSPEND_H */ diff --git a/include/linux/swap.h b/include/linux/swap.h index c71f84bb62e..1e22e126d2a 100644 --- a/include/linux/swap.h +++ b/include/linux/swap.h @@ -243,15 +243,10 @@ static inline void lru_cache_add_file(struct page *page)  	__lru_cache_add(page, LRU_INACTIVE_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,  					gfp_t gfp_mask, nodemask_t *mask); -extern int __isolate_lru_page(struct page *page, int mode, int file); +extern int __isolate_lru_page(struct page *page, isolate_mode_t mode, int file);  extern unsigned long try_to_free_mem_cgroup_pages(struct mem_cgroup *mem,  						  gfp_t gfp_mask, bool noswap);  extern unsigned long mem_cgroup_shrink_node_zone(struct mem_cgroup *mem, diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h index 1ff0ec2a5e8..86a24b1166d 100644 --- a/include/linux/syscalls.h +++ b/include/linux/syscalls.h @@ -844,4 +844,17 @@ asmlinkage long sys_open_by_handle_at(int mountdirfd,  				      struct file_handle __user *handle,  				      int flags);  asmlinkage long sys_setns(int fd, int nstype); +asmlinkage long sys_process_vm_readv(pid_t pid, +				     const struct iovec __user *lvec, +				     unsigned long liovcnt, +				     const struct iovec __user *rvec, +				     unsigned long riovcnt, +				     unsigned long flags); +asmlinkage long sys_process_vm_writev(pid_t pid, +				      const struct iovec __user *lvec, +				      unsigned long liovcnt, +				      const struct iovec __user *rvec, +				      unsigned long riovcnt, +				      unsigned long flags); +  #endif diff --git a/include/linux/sysctl.h b/include/linux/sysctl.h index 11684d9e6bd..703cfa33a3c 100644 --- a/include/linux/sysctl.h +++ b/include/linux/sysctl.h @@ -435,7 +435,7 @@ enum {  	NET_IPV4_ROUTE_MAX_SIZE=5,  	NET_IPV4_ROUTE_GC_MIN_INTERVAL=6,  	NET_IPV4_ROUTE_GC_TIMEOUT=7, -	NET_IPV4_ROUTE_GC_INTERVAL=8, +	NET_IPV4_ROUTE_GC_INTERVAL=8, /* obsolete since 2.6.38 */  	NET_IPV4_ROUTE_REDIRECT_LOAD=9,  	NET_IPV4_ROUTE_REDIRECT_NUMBER=10,  	NET_IPV4_ROUTE_REDIRECT_SILENCE=11, @@ -931,6 +931,7 @@ enum  #ifdef __KERNEL__  #include <linux/list.h>  #include <linux/rcupdate.h> +#include <linux/wait.h>  /* For the /proc/sys support */  struct ctl_table; @@ -1011,6 +1012,26 @@ extern int proc_do_large_bitmap(struct ctl_table *, int,   * cover common cases.   */ +/* Support for userspace poll() to watch for changes */ +struct ctl_table_poll { +	atomic_t event; +	wait_queue_head_t wait; +}; + +static inline void *proc_sys_poll_event(struct ctl_table_poll *poll) +{ +	return (void *)(unsigned long)atomic_read(&poll->event); +} + +void proc_sys_poll_notify(struct ctl_table_poll *poll); + +#define __CTL_TABLE_POLL_INITIALIZER(name) {				\ +	.event = ATOMIC_INIT(0),					\ +	.wait = __WAIT_QUEUE_HEAD_INITIALIZER(name.wait) } + +#define DEFINE_CTL_TABLE_POLL(name)					\ +	struct ctl_table_poll name = __CTL_TABLE_POLL_INITIALIZER(name) +  /* A sysctl table is an array of struct ctl_table: */  struct ctl_table   { @@ -1021,6 +1042,7 @@ struct ctl_table  	struct ctl_table *child;  	struct ctl_table *parent;	/* Automatically set */  	proc_handler *proc_handler;	/* Callback for text formatting */ +	struct ctl_table_poll *poll;  	void *extra1;  	void *extra2;  }; diff --git a/include/linux/sysfs.h b/include/linux/sysfs.h index d7d2f215814..dac0859e644 100644 --- a/include/linux/sysfs.h +++ b/include/linux/sysfs.h @@ -112,6 +112,7 @@ struct bin_attribute {  struct sysfs_ops {  	ssize_t	(*show)(struct kobject *, struct attribute *,char *);  	ssize_t	(*store)(struct kobject *,struct attribute *,const char *, size_t); +	const void *(*namespace)(struct kobject *, const struct attribute *);  };  struct sysfs_dirent; diff --git a/include/linux/tcp.h b/include/linux/tcp.h index 531ede8006d..7f59ee94698 100644 --- a/include/linux/tcp.h +++ b/include/linux/tcp.h @@ -111,7 +111,8 @@ enum {  #define TCPI_OPT_TIMESTAMPS	1  #define TCPI_OPT_SACK		2  #define TCPI_OPT_WSCALE		4 -#define TCPI_OPT_ECN		8 +#define TCPI_OPT_ECN		8 /* ECN was negociated at TCP session init */ +#define TCPI_OPT_ECN_SEEN	16 /* we received at least one packet with ECT */  enum tcp_ca_state {  	TCP_CA_Open = 0, @@ -379,6 +380,10 @@ struct tcp_sock {  	u32	snd_cwnd_clamp; /* Do not allow snd_cwnd to grow above this */  	u32	snd_cwnd_used;  	u32	snd_cwnd_stamp; +	u32	prior_cwnd;	/* Congestion window at start of Recovery. */ +	u32	prr_delivered;	/* Number of newly delivered packets to +				 * receiver in Recovery. */ +	u32	prr_out;	/* Total number of pkts sent during Recovery. */   	u32	rcv_wnd;	/* Current receiver window		*/  	u32	write_seq;	/* Tail(+1) of data held in tcp send buffer */ diff --git a/include/linux/tipc_config.h b/include/linux/tipc_config.h index 0db239590b4..9730b0e51e4 100644 --- a/include/linux/tipc_config.h +++ b/include/linux/tipc_config.h @@ -41,6 +41,10 @@  #include <linux/string.h>  #include <asm/byteorder.h> +#ifndef __KERNEL__ +#include <arpa/inet.h> /* for ntohs etc. */ +#endif +  /*   * Configuration   * diff --git a/include/linux/topology.h b/include/linux/topology.h index fc839bfa793..e26db031303 100644 --- a/include/linux/topology.h +++ b/include/linux/topology.h @@ -201,6 +201,10 @@ int arch_update_cpu_topology(void);  	.balance_interval	= 64,					\  } +#ifndef SD_NODES_PER_DOMAIN +#define SD_NODES_PER_DOMAIN 16 +#endif +  #ifdef CONFIG_SCHED_BOOK  #ifndef SD_BOOK_INIT  #error Please define an appropriate SD_BOOK_INIT in include/asm/topology.h!!! diff --git a/include/linux/trace_clock.h b/include/linux/trace_clock.h index 7a813038408..4eb490237d4 100644 --- a/include/linux/trace_clock.h +++ b/include/linux/trace_clock.h @@ -15,5 +15,6 @@  extern u64 notrace trace_clock_local(void);  extern u64 notrace trace_clock(void);  extern u64 notrace trace_clock_global(void); +extern u64 notrace trace_clock_counter(void);  #endif /* _LINUX_TRACE_CLOCK_H */ diff --git a/include/linux/trace_seq.h b/include/linux/trace_seq.h index 5cf397ceb72..7dadc3df0c7 100644 --- a/include/linux/trace_seq.h +++ b/include/linux/trace_seq.h @@ -29,10 +29,10 @@ trace_seq_init(struct trace_seq *s)   * Currently only defined when tracing is enabled.   */  #ifdef CONFIG_TRACING -extern int trace_seq_printf(struct trace_seq *s, const char *fmt, ...) -	__attribute__ ((format (printf, 2, 3))); -extern int trace_seq_vprintf(struct trace_seq *s, const char *fmt, va_list args) -	__attribute__ ((format (printf, 2, 0))); +extern __printf(2, 3) +int trace_seq_printf(struct trace_seq *s, const char *fmt, ...); +extern __printf(2, 0) +int trace_seq_vprintf(struct trace_seq *s, const char *fmt, va_list args);  extern int  trace_seq_bprintf(struct trace_seq *s, const char *fmt, const u32 *binary);  extern int trace_print_seq(struct seq_file *m, struct trace_seq *s); diff --git a/include/linux/tracepoint.h b/include/linux/tracepoint.h index d530a4460a0..df0a779c1bb 100644 --- a/include/linux/tracepoint.h +++ b/include/linux/tracepoint.h @@ -54,8 +54,18 @@ extern int tracepoint_probe_unregister_noupdate(const char *name, void *probe,  						void *data);  extern void tracepoint_probe_update_all(void); +#ifdef CONFIG_MODULES +struct tp_module { +	struct list_head list; +	unsigned int num_tracepoints; +	struct tracepoint * const *tracepoints_ptrs; +}; +#endif /* CONFIG_MODULES */ +  struct tracepoint_iter { -	struct module *module; +#ifdef CONFIG_MODULES +	struct tp_module *module; +#endif /* CONFIG_MODULES */  	struct tracepoint * const *tracepoint;  }; @@ -63,8 +73,6 @@ 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 * const **tracepoint, -	struct tracepoint * const *begin, struct tracepoint * const *end);  /*   * tracepoint_synchronize_unregister must be called between the last tracepoint @@ -78,17 +86,6 @@ static inline void tracepoint_synchronize_unregister(void)  #define PARAMS(args...) args -#ifdef CONFIG_TRACEPOINTS -extern -void tracepoint_update_probe_range(struct tracepoint * const *begin, -	struct tracepoint * const *end); -#else -static inline -void tracepoint_update_probe_range(struct tracepoint * const *begin, -	struct tracepoint * const *end) -{ } -#endif /* CONFIG_TRACEPOINTS */ -  #endif /* _LINUX_TRACEPOINT_H */  /* diff --git a/include/linux/tty.h b/include/linux/tty.h index 5f2ede82b3d..5dbb3cb05a8 100644 --- a/include/linux/tty.h +++ b/include/linux/tty.h @@ -473,7 +473,9 @@ extern void proc_clear_tty(struct task_struct *p);  extern struct tty_struct *get_current_tty(void);  extern void tty_default_fops(struct file_operations *fops);  extern struct tty_struct *alloc_tty_struct(void); -extern int tty_add_file(struct tty_struct *tty, struct file *file); +extern int tty_alloc_file(struct file *file); +extern void tty_add_file(struct tty_struct *tty, struct file *file); +extern void tty_free_file(struct file *file);  extern void free_tty_struct(struct tty_struct *tty);  extern void initialize_tty_struct(struct tty_struct *tty,  		struct tty_driver *driver, int idx); @@ -581,6 +583,8 @@ extern int __init tty_init(void);  /* tty_ioctl.c */  extern int n_tty_ioctl_helper(struct tty_struct *tty, struct file *file,  		       unsigned int cmd, unsigned long arg); +extern long n_tty_compat_ioctl_helper(struct tty_struct *tty, struct file *file, +		       unsigned int cmd, unsigned long arg);  /* serial.c */ @@ -602,8 +606,24 @@ extern long vt_compat_ioctl(struct tty_struct *tty,  /* functions for preparation of BKL removal */  extern void __lockfunc tty_lock(void) __acquires(tty_lock);  extern void __lockfunc tty_unlock(void) __releases(tty_lock); -extern struct task_struct *__big_tty_mutex_owner; -#define tty_locked()		(current == __big_tty_mutex_owner) + +/* + * this shall be called only from where BTM is held (like close) + * + * We need this to ensure nobody waits for us to finish while we are waiting. + * Without this we were encountering system stalls. + * + * This should be indeed removed with BTM removal later. + * + * Locking: BTM required. Nobody is allowed to hold port->mutex. + */ +static inline void tty_wait_until_sent_from_close(struct tty_struct *tty, +		long timeout) +{ +	tty_unlock(); /* tty->ops->close holds the BTM, drop it while waiting */ +	tty_wait_until_sent(tty, timeout); +	tty_lock(); +}  /*   * wait_event_interruptible_tty -- wait for a condition with the tty lock held diff --git a/include/linux/types.h b/include/linux/types.h index 176da8c1fbb..57a97234bec 100644 --- a/include/linux/types.h +++ b/include/linux/types.h @@ -238,6 +238,16 @@ struct ustat {  	char			f_fpack[6];  }; +/** + * struct rcu_head - callback structure for use with RCU + * @next: next update requests in a list + * @func: actual update function to call after the grace period. + */ +struct rcu_head { +	struct rcu_head *next; +	void (*func)(struct rcu_head *head); +}; +  #endif	/* __KERNEL__ */  #endif /*  __ASSEMBLY__ */  #endif /* _LINUX_TYPES_H */ diff --git a/include/linux/uinput.h b/include/linux/uinput.h index d28c726ede4..2aa2881b0df 100644 --- a/include/linux/uinput.h +++ b/include/linux/uinput.h @@ -68,7 +68,7 @@ struct uinput_device {  	unsigned char		head;  	unsigned char		tail;  	struct input_event	buff[UINPUT_BUFFER_SIZE]; -	int			ff_effects_max; +	unsigned int		ff_effects_max;  	struct uinput_request	*requests[UINPUT_NUM_REQUESTS];  	wait_queue_head_t	requests_waitq; diff --git a/include/linux/uio_driver.h b/include/linux/uio_driver.h index 665517c05ea..fd99ff9298c 100644 --- a/include/linux/uio_driver.h +++ b/include/linux/uio_driver.h @@ -23,7 +23,10 @@ struct uio_map;  /**   * struct uio_mem - description of a UIO memory region   * @name:		name of the memory region for identification - * @addr:		address of the device's memory + * @addr:		address of the device's memory (phys_addr is used since + * 			addr can be logical, virtual, or physical & phys_addr_t + * 			should always be large enough to handle any of the + * 			address types)   * @size:		size of IO   * @memtype:		type of memory addr points to   * @internal_addr:	ioremap-ped version of addr, for driver internal use @@ -31,7 +34,7 @@ struct uio_map;   */  struct uio_mem {  	const char		*name; -	unsigned long		addr; +	phys_addr_t		addr;  	unsigned long		size;  	int			memtype;  	void __iomem		*internal_addr; diff --git a/include/linux/un.h b/include/linux/un.h index 45561c564b8..3ed3e46c1b1 100644 --- a/include/linux/un.h +++ b/include/linux/un.h @@ -1,10 +1,12 @@  #ifndef _LINUX_UN_H  #define _LINUX_UN_H +#include <linux/socket.h> +  #define UNIX_PATH_MAX	108  struct sockaddr_un { -	sa_family_t sun_family;	/* AF_UNIX */ +	__kernel_sa_family_t sun_family; /* AF_UNIX */  	char sun_path[UNIX_PATH_MAX];	/* pathname */  }; diff --git a/include/linux/usb.h b/include/linux/usb.h index 73c7df48960..6f49a1b39fa 100644 --- a/include/linux/usb.h +++ b/include/linux/usb.h @@ -292,6 +292,16 @@ struct usb_host_config {  	int extralen;  }; +/* USB2.0 and USB3.0 device BOS descriptor set */ +struct usb_host_bos { +	struct usb_bos_descriptor	*desc; + +	/* wireless cap descriptor is handled by wusb */ +	struct usb_ext_cap_descriptor	*ext_cap; +	struct usb_ss_cap_descriptor	*ss_cap; +	struct usb_ss_container_id_descriptor	*ss_id; +}; +  int __usb_get_extra_descriptor(char *buffer, unsigned size,  	unsigned char type, void **ptr);  #define usb_get_extra_descriptor(ifpoint, type, ptr) \ @@ -381,6 +391,7 @@ struct usb_tt;   * @ep0: endpoint 0 data (default control pipe)   * @dev: generic device interface   * @descriptor: USB device descriptor + * @bos: USB device BOS descriptor set   * @config: all of the device's configs   * @actconfig: the active configuration   * @ep_in: array of IN endpoints @@ -399,6 +410,9 @@ struct usb_tt;   *	FIXME -- complete doc   * @authenticated: Crypto authentication passed   * @wusb: device is Wireless USB + * @lpm_capable: device supports LPM + * @usb2_hw_lpm_capable: device can perform USB2 hardware LPM + * @usb2_hw_lpm_enabled: USB2 hardware LPM enabled   * @string_langid: language ID for strings   * @product: iProduct string, if present (static)   * @manufacturer: iManufacturer string, if present (static) @@ -442,6 +456,7 @@ struct usb_device {  	struct device dev;  	struct usb_device_descriptor descriptor; +	struct usb_host_bos *bos;  	struct usb_host_config *config;  	struct usb_host_config *actconfig; @@ -460,6 +475,9 @@ struct usb_device {  	unsigned authorized:1;  	unsigned authenticated:1;  	unsigned wusb:1; +	unsigned lpm_capable:1; +	unsigned usb2_hw_lpm_capable:1; +	unsigned usb2_hw_lpm_enabled:1;  	int string_langid;  	/* static strings from the device */ @@ -1574,7 +1592,7 @@ usb_maxpacket(struct usb_device *udev, int pipe, int is_out)  		return 0;  	/* NOTE:  only 0x07ff bits are for packet size... */ -	return le16_to_cpu(ep->desc.wMaxPacketSize); +	return usb_endpoint_maxp(&ep->desc);  }  /* ----------------------------------------------------------------------- */ diff --git a/include/linux/usb/Kbuild b/include/linux/usb/Kbuild index ed91fb62674..b607f3532e8 100644 --- a/include/linux/usb/Kbuild +++ b/include/linux/usb/Kbuild @@ -7,3 +7,4 @@ header-y += gadgetfs.h  header-y += midi.h  header-y += g_printer.h  header-y += tmc.h +header-y += video.h diff --git a/include/linux/usb/ch9.h b/include/linux/usb/ch9.h index 0fd3fbdd828..d5da6c68c25 100644 --- a/include/linux/usb/ch9.h +++ b/include/linux/usb/ch9.h @@ -34,6 +34,7 @@  #define __LINUX_USB_CH9_H  #include <linux/types.h>	/* __u8 etc */ +#include <asm/byteorder.h>	/* le16_to_cpu */  /*-------------------------------------------------------------------------*/ @@ -143,6 +144,11 @@  #define USB_INTRF_FUNC_SUSPEND	0	/* function suspend */  #define USB_INTR_FUNC_SUSPEND_OPT_MASK	0xFF00 +/* + * Suspend Options, Table 9-7 USB 3.0 spec + */ +#define USB_INTRF_FUNC_SUSPEND_LP	(1 << (8 + 0)) +#define USB_INTRF_FUNC_SUSPEND_RW	(1 << (8 + 1))  #define USB_ENDPOINT_HALT		0	/* IN/OUT will STALL */ @@ -377,12 +383,6 @@ struct usb_endpoint_descriptor {  #define USB_ENDPOINT_NUMBER_MASK	0x0f	/* in bEndpointAddress */  #define USB_ENDPOINT_DIR_MASK		0x80 -#define USB_ENDPOINT_SYNCTYPE		0x0c -#define USB_ENDPOINT_SYNC_NONE		(0 << 2) -#define USB_ENDPOINT_SYNC_ASYNC		(1 << 2) -#define USB_ENDPOINT_SYNC_ADAPTIVE	(2 << 2) -#define USB_ENDPOINT_SYNC_SYNC		(3 << 2) -  #define USB_ENDPOINT_XFERTYPE_MASK	0x03	/* in bmAttributes */  #define USB_ENDPOINT_XFER_CONTROL	0  #define USB_ENDPOINT_XFER_ISOC		1 @@ -390,6 +390,17 @@ struct usb_endpoint_descriptor {  #define USB_ENDPOINT_XFER_INT		3  #define USB_ENDPOINT_MAX_ADJUSTABLE	0x80 +#define USB_ENDPOINT_SYNCTYPE		0x0c +#define USB_ENDPOINT_SYNC_NONE		(0 << 2) +#define USB_ENDPOINT_SYNC_ASYNC		(1 << 2) +#define USB_ENDPOINT_SYNC_ADAPTIVE	(2 << 2) +#define USB_ENDPOINT_SYNC_SYNC		(3 << 2) + +#define USB_ENDPOINT_USAGE_MASK		0x30 +#define USB_ENDPOINT_USAGE_DATA		0x00 +#define USB_ENDPOINT_USAGE_FEEDBACK	0x10 +#define USB_ENDPOINT_USAGE_IMPLICIT_FB	0x20	/* Implicit feedback Data endpoint */ +  /*-------------------------------------------------------------------------*/  /** @@ -570,6 +581,17 @@ static inline int usb_endpoint_is_isoc_out(  	return usb_endpoint_xfer_isoc(epd) && usb_endpoint_dir_out(epd);  } +/** + * usb_endpoint_maxp - get endpoint's max packet size + * @epd: endpoint to be checked + * + * Returns @epd's max packet + */ +static inline int usb_endpoint_maxp(const struct usb_endpoint_descriptor *epd) +{ +	return le16_to_cpu(epd->wMaxPacketSize); +} +  /*-------------------------------------------------------------------------*/  /* USB_DT_SS_ENDPOINT_COMP: SuperSpeed Endpoint Companion descriptor */ @@ -851,6 +873,18 @@ enum usb_device_speed {  	USB_SPEED_SUPER,			/* usb 3.0 */  }; +#ifdef __KERNEL__ + +/** + * usb_speed_string() - Returns human readable-name of the speed. + * @speed: The speed to return human-readable name for.  If it's not + *   any of the speeds defined in usb_device_speed enum, string for + *   USB_SPEED_UNKNOWN will be returned. + */ +extern const char *usb_speed_string(enum usb_device_speed speed); + +#endif +  enum usb_device_state {  	/* NOTATTACHED isn't in the USB spec, and this state acts  	 * the same as ATTACHED ... but it's clearer this way. diff --git a/include/linux/usb/gadget.h b/include/linux/usb/gadget.h index 087f4b93183..1d3a67523ff 100644 --- a/include/linux/usb/gadget.h +++ b/include/linux/usb/gadget.h @@ -437,9 +437,9 @@ static inline void usb_ep_fifo_flush(struct usb_ep *ep)  struct usb_dcd_config_params {  	__u8  bU1devExitLat;	/* U1 Device exit Latency */ -#define USB_DEFULT_U1_DEV_EXIT_LAT	0x01	/* Less then 1 microsec */ +#define USB_DEFAULT_U1_DEV_EXIT_LAT	0x01	/* Less then 1 microsec */  	__le16 bU2DevExitLat;	/* U2 Device exit Latency */ -#define USB_DEFULT_U2_DEV_EXIT_LAT	0x1F4	/* Less then 500 microsec */ +#define USB_DEFAULT_U2_DEV_EXIT_LAT	0x1F4	/* Less then 500 microsec */  }; diff --git a/include/linux/usb/hcd.h b/include/linux/usb/hcd.h index 0097136ba45..03354d557b7 100644 --- a/include/linux/usb/hcd.h +++ b/include/linux/usb/hcd.h @@ -178,7 +178,7 @@ struct usb_hcd {  	 * this structure.  	 */  	unsigned long hcd_priv[0] -			__attribute__ ((aligned(sizeof(unsigned long)))); +			__attribute__ ((aligned(sizeof(s64))));  };  /* 2.4 does this a bit differently ... */ @@ -343,6 +343,7 @@ struct hc_driver {  		 * address is set  		 */  	int	(*update_device)(struct usb_hcd *, struct usb_device *); +	int	(*set_usb2_hw_lpm)(struct usb_hcd *, struct usb_device *, int);  };  extern int usb_hcd_link_urb_to_ep(struct usb_hcd *hcd, struct urb *urb); diff --git a/include/linux/usb/r8a66597.h b/include/linux/usb/r8a66597.h index b6b8660d0c6..55805f9dcf2 100644 --- a/include/linux/usb/r8a66597.h +++ b/include/linux/usb/r8a66597.h @@ -48,6 +48,9 @@ struct r8a66597_platdata {  	/* (external controller only) set one = WR0_N shorted to WR1_N */  	unsigned	wr0_shorted_to_wr1:1; + +	/* set one = using SUDMAC */ +	unsigned	sudmac:1;  };  /* Register definitions */ @@ -417,5 +420,62 @@ struct r8a66597_platdata {  #define	USBSPD		0x00C0  #define	RTPORT		0x0001 +/* SUDMAC registers */ +#define CH0CFG		0x00 +#define CH1CFG		0x04 +#define CH0BA		0x10 +#define CH1BA		0x14 +#define CH0BBC		0x18 +#define CH1BBC		0x1C +#define CH0CA		0x20 +#define CH1CA		0x24 +#define CH0CBC		0x28 +#define CH1CBC		0x2C +#define CH0DEN		0x30 +#define CH1DEN		0x34 +#define DSTSCLR		0x38 +#define DBUFCTRL	0x3C +#define DINTCTRL	0x40 +#define DINTSTS		0x44 +#define DINTSTSCLR	0x48 +#define CH0SHCTRL	0x50 +#define CH1SHCTRL	0x54 + +/* SUDMAC Configuration Registers */ +#define SENDBUFM	0x1000 /* b12: Transmit Buffer Mode */ +#define RCVENDM		0x0100 /* b8: Receive Data Transfer End Mode */ +#define LBA_WAIT	0x0030 /* b5-4: Local Bus Access Wait */ + +/* DMA Enable Registers */ +#define DEN		0x0001 /* b1: DMA Transfer Enable */ + +/* DMA Status Clear Register */ +#define CH1STCLR	0x0002 /* b2: Ch1 DMA Status Clear */ +#define CH0STCLR	0x0001 /* b1: Ch0 DMA Status Clear */ + +/* DMA Buffer Control Register */ +#define CH1BUFW		0x0200 /* b9: Ch1 DMA Buffer Data Transfer Enable */ +#define CH0BUFW		0x0100 /* b8: Ch0 DMA Buffer Data Transfer Enable */ +#define CH1BUFS		0x0002 /* b2: Ch1 DMA Buffer Data Status */ +#define CH0BUFS		0x0001 /* b1: Ch0 DMA Buffer Data Status */ + +/* DMA Interrupt Control Register */ +#define CH1ERRE		0x0200 /* b9: Ch1 SHwy Res Err Detect Int Enable */ +#define CH0ERRE		0x0100 /* b8: Ch0 SHwy Res Err Detect Int Enable */ +#define CH1ENDE		0x0002 /* b2: Ch1 DMA Transfer End Int Enable */ +#define CH0ENDE		0x0001 /* b1: Ch0 DMA Transfer End Int Enable */ + +/* DMA Interrupt Status Register */ +#define CH1ERRS		0x0200 /* b9: Ch1 SHwy Res Err Detect Int Status */ +#define CH0ERRS		0x0100 /* b8: Ch0 SHwy Res Err Detect Int Status */ +#define CH1ENDS		0x0002 /* b2: Ch1 DMA Transfer End Int Status */ +#define CH0ENDS		0x0001 /* b1: Ch0 DMA Transfer End Int Status */ + +/* DMA Interrupt Status Clear Register */ +#define CH1ERRC		0x0200 /* b9: Ch1 SHwy Res Err Detect Int Stat Clear */ +#define CH0ERRC		0x0100 /* b8: Ch0 SHwy Res Err Detect Int Stat Clear */ +#define CH1ENDC		0x0002 /* b2: Ch1 DMA Transfer End Int Stat Clear */ +#define CH0ENDC		0x0001 /* b1: Ch0 DMA Transfer End Int Stat Clear */ +  #endif /* __LINUX_USB_R8A66597_H */ diff --git a/include/linux/usb/renesas_usbhs.h b/include/linux/usb/renesas_usbhs.h index 8977431259c..e5a40c31854 100644 --- a/include/linux/usb/renesas_usbhs.h +++ b/include/linux/usb/renesas_usbhs.h @@ -82,6 +82,13 @@ struct renesas_usbhs_platform_callback {  	 * get VBUS status function.  	 */  	int (*get_vbus)(struct platform_device *pdev); + +	/* +	 * option: +	 * +	 * VBUS control is needed for Host +	 */ +	int (*set_vbus)(struct platform_device *pdev, int enable);  };  /* @@ -101,6 +108,8 @@ struct renesas_usbhs_driver_param {  	 * option:  	 *  	 * for BUSWAIT :: BWAIT +	 * see +	 *	renesas_usbhs/common.c :: usbhsc_set_buswait()  	 * */  	int buswait_bwait; @@ -127,6 +136,11 @@ struct renesas_usbhs_driver_param {  	 * pio <--> dma border.  	 */  	int pio_dma_border; /* default is 64byte */ + +	/* +	 * option: +	 */ +	u32 has_otg:1; /* for controlling PWEN/EXTLP */  };  /* diff --git a/include/linux/utsname.h b/include/linux/utsname.h index 4e5b0213fdc..c714ed75eae 100644 --- a/include/linux/utsname.h +++ b/include/linux/utsname.h @@ -37,6 +37,14 @@ struct new_utsname {  #include <linux/nsproxy.h>  #include <linux/err.h> +enum uts_proc { +	UTS_PROC_OSTYPE, +	UTS_PROC_OSRELEASE, +	UTS_PROC_VERSION, +	UTS_PROC_HOSTNAME, +	UTS_PROC_DOMAINNAME, +}; +  struct user_namespace;  extern struct user_namespace init_user_ns; @@ -80,6 +88,14 @@ static inline struct uts_namespace *copy_utsname(unsigned long flags,  }  #endif +#ifdef CONFIG_PROC_SYSCTL +extern void uts_proc_notify(enum uts_proc proc); +#else +static inline void uts_proc_notify(enum uts_proc proc) +{ +} +#endif +  static inline struct new_utsname *utsname(void)  {  	return ¤t->nsproxy->uts_ns->name; diff --git a/include/linux/videodev2.h b/include/linux/videodev2.h index fca24cc5043..4b752d5ee80 100644 --- a/include/linux/videodev2.h +++ b/include/linux/videodev2.h @@ -653,6 +653,10 @@ struct v4l2_buffer {  #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 */ +#define V4L2_BUF_FLAG_PREPARED	0x0400	/* Buffer is prepared for queuing */ +/* Cache handling flags */ +#define V4L2_BUF_FLAG_NO_CACHE_INVALIDATE	0x0800 +#define V4L2_BUF_FLAG_NO_CACHE_CLEAN		0x1000  /*   *	O V E R L A Y   P R E V I E W @@ -759,10 +763,10 @@ typedef __u64 v4l2_std_id;  #define V4L2_STD_PAL_Nc         ((v4l2_std_id)0x00000400)  #define V4L2_STD_PAL_60         ((v4l2_std_id)0x00000800) -#define V4L2_STD_NTSC_M         ((v4l2_std_id)0x00001000) -#define V4L2_STD_NTSC_M_JP      ((v4l2_std_id)0x00002000) +#define V4L2_STD_NTSC_M         ((v4l2_std_id)0x00001000)	/* BTSC */ +#define V4L2_STD_NTSC_M_JP      ((v4l2_std_id)0x00002000)	/* EIA-J */  #define V4L2_STD_NTSC_443       ((v4l2_std_id)0x00004000) -#define V4L2_STD_NTSC_M_KR      ((v4l2_std_id)0x00008000) +#define V4L2_STD_NTSC_M_KR      ((v4l2_std_id)0x00008000)	/* FM A2 */  #define V4L2_STD_SECAM_B        ((v4l2_std_id)0x00010000)  #define V4L2_STD_SECAM_D        ((v4l2_std_id)0x00020000) @@ -786,47 +790,86 @@ typedef __u64 v4l2_std_id;     v4l2-common.c should be fixed.   */ -/* some merged standards */ -#define V4L2_STD_MN	(V4L2_STD_PAL_M|V4L2_STD_PAL_N|V4L2_STD_PAL_Nc|V4L2_STD_NTSC) -#define V4L2_STD_B	(V4L2_STD_PAL_B|V4L2_STD_PAL_B1|V4L2_STD_SECAM_B) -#define V4L2_STD_GH	(V4L2_STD_PAL_G|V4L2_STD_PAL_H|V4L2_STD_SECAM_G|V4L2_STD_SECAM_H) -#define V4L2_STD_DK	(V4L2_STD_PAL_DK|V4L2_STD_SECAM_DK) +/* + * Some macros to merge video standards in order to make live easier for the + * drivers and V4L2 applications + */ -/* some common needed stuff */ -#define V4L2_STD_PAL_BG		(V4L2_STD_PAL_B		|\ -				 V4L2_STD_PAL_B1	|\ -				 V4L2_STD_PAL_G) -#define V4L2_STD_PAL_DK		(V4L2_STD_PAL_D		|\ -				 V4L2_STD_PAL_D1	|\ -				 V4L2_STD_PAL_K) -#define V4L2_STD_PAL		(V4L2_STD_PAL_BG	|\ -				 V4L2_STD_PAL_DK	|\ -				 V4L2_STD_PAL_H		|\ -				 V4L2_STD_PAL_I) +/* + * "Common" NTSC/M - It should be noticed that V4L2_STD_NTSC_443 is + * Missing here. + */  #define V4L2_STD_NTSC           (V4L2_STD_NTSC_M	|\  				 V4L2_STD_NTSC_M_JP     |\  				 V4L2_STD_NTSC_M_KR) +/* Secam macros */  #define V4L2_STD_SECAM_DK      	(V4L2_STD_SECAM_D	|\  				 V4L2_STD_SECAM_K	|\  				 V4L2_STD_SECAM_K1) +/* All Secam Standards */  #define V4L2_STD_SECAM		(V4L2_STD_SECAM_B	|\  				 V4L2_STD_SECAM_G	|\  				 V4L2_STD_SECAM_H	|\  				 V4L2_STD_SECAM_DK	|\  				 V4L2_STD_SECAM_L       |\  				 V4L2_STD_SECAM_LC) +/* PAL macros */ +#define V4L2_STD_PAL_BG		(V4L2_STD_PAL_B		|\ +				 V4L2_STD_PAL_B1	|\ +				 V4L2_STD_PAL_G) +#define V4L2_STD_PAL_DK		(V4L2_STD_PAL_D		|\ +				 V4L2_STD_PAL_D1	|\ +				 V4L2_STD_PAL_K) +/* + * "Common" PAL - This macro is there to be compatible with the old + * V4L1 concept of "PAL": /BGDKHI. + * Several PAL standards are mising here: /M, /N and /Nc + */ +#define V4L2_STD_PAL		(V4L2_STD_PAL_BG	|\ +				 V4L2_STD_PAL_DK	|\ +				 V4L2_STD_PAL_H		|\ +				 V4L2_STD_PAL_I) +/* Chroma "agnostic" standards */ +#define V4L2_STD_B		(V4L2_STD_PAL_B		|\ +				 V4L2_STD_PAL_B1	|\ +				 V4L2_STD_SECAM_B) +#define V4L2_STD_G		(V4L2_STD_PAL_G		|\ +				 V4L2_STD_SECAM_G) +#define V4L2_STD_H		(V4L2_STD_PAL_H		|\ +				 V4L2_STD_SECAM_H) +#define V4L2_STD_L		(V4L2_STD_SECAM_L	|\ +				 V4L2_STD_SECAM_LC) +#define V4L2_STD_GH		(V4L2_STD_G		|\ +				 V4L2_STD_H) +#define V4L2_STD_DK		(V4L2_STD_PAL_DK	|\ +				 V4L2_STD_SECAM_DK) +#define V4L2_STD_BG		(V4L2_STD_B		|\ +				 V4L2_STD_G) +#define V4L2_STD_MN		(V4L2_STD_PAL_M		|\ +				 V4L2_STD_PAL_N		|\ +				 V4L2_STD_PAL_Nc	|\ +				 V4L2_STD_NTSC) +/* Standards where MTS/BTSC stereo could be found */ +#define V4L2_STD_MTS		(V4L2_STD_NTSC_M	|\ +				 V4L2_STD_PAL_M		|\ +				 V4L2_STD_PAL_N		|\ +				 V4L2_STD_PAL_Nc) + +/* Standards for Countries with 60Hz Line frequency */  #define V4L2_STD_525_60		(V4L2_STD_PAL_M		|\  				 V4L2_STD_PAL_60	|\  				 V4L2_STD_NTSC		|\  				 V4L2_STD_NTSC_443) +/* Standards for Countries with 50Hz Line frequency */  #define V4L2_STD_625_50		(V4L2_STD_PAL		|\  				 V4L2_STD_PAL_N		|\  				 V4L2_STD_PAL_Nc	|\  				 V4L2_STD_SECAM) +  #define V4L2_STD_ATSC           (V4L2_STD_ATSC_8_VSB    |\  				 V4L2_STD_ATSC_16_VSB) - +/* Macros with none and all analog standards */  #define V4L2_STD_UNKNOWN        0  #define V4L2_STD_ALL            (V4L2_STD_525_60	|\  				 V4L2_STD_625_50) @@ -1082,6 +1125,7 @@ struct v4l2_querymenu {  #define V4L2_CTRL_FLAG_INACTIVE 	0x0010  #define V4L2_CTRL_FLAG_SLIDER 		0x0020  #define V4L2_CTRL_FLAG_WRITE_ONLY 	0x0040 +#define V4L2_CTRL_FLAG_VOLATILE		0x0080  /*  Query flag, to be ORed with the control ID */  #define V4L2_CTRL_FLAG_NEXT_CTRL	0x80000000 @@ -1125,6 +1169,7 @@ enum v4l2_power_line_frequency {  	V4L2_CID_POWER_LINE_FREQUENCY_DISABLED	= 0,  	V4L2_CID_POWER_LINE_FREQUENCY_50HZ	= 1,  	V4L2_CID_POWER_LINE_FREQUENCY_60HZ	= 2, +	V4L2_CID_POWER_LINE_FREQUENCY_AUTO	= 3,  };  #define V4L2_CID_HUE_AUTO			(V4L2_CID_BASE+25)  #define V4L2_CID_WHITE_BALANCE_TEMPERATURE	(V4L2_CID_BASE+26) @@ -2006,6 +2051,7 @@ struct v4l2_streamparm {  #define V4L2_EVENT_VSYNC			1  #define V4L2_EVENT_EOS				2  #define V4L2_EVENT_CTRL				3 +#define V4L2_EVENT_FRAME_SYNC			4  #define V4L2_EVENT_PRIVATE_START		0x08000000  /* Payload for V4L2_EVENT_VSYNC */ @@ -2032,12 +2078,17 @@ struct v4l2_event_ctrl {  	__s32 default_value;  }; +struct v4l2_event_frame_sync { +	__u32 frame_sequence; +}; +  struct v4l2_event {  	__u32				type;  	union { -		struct v4l2_event_vsync vsync; -		struct v4l2_event_ctrl	ctrl; -		__u8			data[64]; +		struct v4l2_event_vsync		vsync; +		struct v4l2_event_ctrl		ctrl; +		struct v4l2_event_frame_sync	frame_sync; +		__u8				data[64];  	} u;  	__u32				pending;  	__u32				sequence; @@ -2092,6 +2143,23 @@ struct v4l2_dbg_chip_ident {  	__u32 revision;    /* chip revision, chip specific */  } __attribute__ ((packed)); +/** + * struct v4l2_create_buffers - VIDIOC_CREATE_BUFS argument + * @index:	on return, index of the first created buffer + * @count:	entry: number of requested buffers, + *		return: number of created buffers + * @memory:	buffer memory type + * @format:	frame format, for which buffers are requested + * @reserved:	future extensions + */ +struct v4l2_create_buffers { +	__u32			index; +	__u32			count; +	enum v4l2_memory        memory; +	struct v4l2_format	format; +	__u32			reserved[8]; +}; +  /*   *	I O C T L   C O D E S   F O R   V I D E O   D E V I C E S   * @@ -2182,6 +2250,11 @@ struct v4l2_dbg_chip_ident {  #define	VIDIOC_SUBSCRIBE_EVENT	 _IOW('V', 90, struct v4l2_event_subscription)  #define	VIDIOC_UNSUBSCRIBE_EVENT _IOW('V', 91, struct v4l2_event_subscription) +/* Experimental, the below two ioctls may change over the next couple of kernel +   versions */ +#define VIDIOC_CREATE_BUFS	_IOWR('V', 92, struct v4l2_create_buffers) +#define VIDIOC_PREPARE_BUF	_IOWR('V', 93, struct v4l2_buffer) +  /* 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 71088574960..4c069d8bd74 100644 --- a/include/linux/virtio.h +++ b/include/linux/virtio.h @@ -61,6 +61,9 @@ struct virtqueue {   * 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 + * virtqueue_get_vring_size: return the size of the virtqueue's vring + *	vq: the struct virtqueue containing the vring of interest. + *	Returns the size of the vring.   *   * Locking rules are straightforward: the driver is responsible for   * locking.  No two operations may be invoked simultaneously, with the exception @@ -97,6 +100,8 @@ bool virtqueue_enable_cb_delayed(struct virtqueue *vq);  void *virtqueue_detach_unused_buf(struct virtqueue *vq); +unsigned int virtqueue_get_vring_size(struct virtqueue *vq); +  /**   * virtio_device - representation of a device using virtio   * @index: unique position on the virtio bus @@ -126,10 +131,10 @@ void unregister_virtio_device(struct virtio_device *dev);   * virtio_driver - operations for a virtio I/O driver   * @driver: underlying device driver (populate name and owner).   * @id_table: the ids serviced by this driver. - * @feature_table: an array of feature numbers supported by this device. + * @feature_table: an array of feature numbers supported by this driver.   * @feature_table_size: number of entries in the feature table array.   * @probe: the function to call when a device is found.  Returns 0 or -errno. - * @remove: the function when a device is removed. + * @remove: the function to call when a device is removed.   * @config_changed: optional function to call when the device configuration   *    changes; may be called in interrupt context.   */ diff --git a/include/linux/virtio_config.h b/include/linux/virtio_config.h index 39c88c5ad19..add4790b21f 100644 --- a/include/linux/virtio_config.h +++ b/include/linux/virtio_config.h @@ -155,6 +155,9 @@ static inline bool virtio_has_feature(const struct virtio_device *vdev,  #define virtio_config_val(vdev, fbit, offset, v) \  	virtio_config_buf((vdev), (fbit), (offset), (v), sizeof(*v)) +#define virtio_config_val_len(vdev, fbit, offset, v, len) \ +	virtio_config_buf((vdev), (fbit), (offset), (v), (len)) +  static inline int virtio_config_buf(struct virtio_device *vdev,  				    unsigned int fbit,  				    unsigned int offset, diff --git a/include/linux/virtio_mmio.h b/include/linux/virtio_mmio.h new file mode 100644 index 00000000000..27c7edefbc8 --- /dev/null +++ b/include/linux/virtio_mmio.h @@ -0,0 +1,111 @@ +/* + * Virtio platform device driver + * + * Copyright 2011, ARM Ltd. + * + * Based on Virtio PCI driver by Anthony Liguori, copyright IBM Corp. 2007 + * + * This header is BSD licensed so anyone can use the definitions to implement + * compatible drivers/servers. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + *    notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + *    notice, this list of conditions and the following disclaimer in the + *    documentation and/or other materials provided with the distribution. + * 3. Neither the name of IBM nor the names of its contributors + *    may be used to endorse or promote products derived from this software + *    without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED.  IN NO EVENT SHALL IBM OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef _LINUX_VIRTIO_MMIO_H +#define _LINUX_VIRTIO_MMIO_H + +/* + * Control registers + */ + +/* Magic value ("virt" string) - Read Only */ +#define VIRTIO_MMIO_MAGIC_VALUE		0x000 + +/* Virtio device version - Read Only */ +#define VIRTIO_MMIO_VERSION		0x004 + +/* Virtio device ID - Read Only */ +#define VIRTIO_MMIO_DEVICE_ID		0x008 + +/* Virtio vendor ID - Read Only */ +#define VIRTIO_MMIO_VENDOR_ID		0x00c + +/* Bitmask of the features supported by the host + * (32 bits per set) - Read Only */ +#define VIRTIO_MMIO_HOST_FEATURES	0x010 + +/* Host features set selector - Write Only */ +#define VIRTIO_MMIO_HOST_FEATURES_SEL	0x014 + +/* Bitmask of features activated by the guest + * (32 bits per set) - Write Only */ +#define VIRTIO_MMIO_GUEST_FEATURES	0x020 + +/* Activated features set selector - Write Only */ +#define VIRTIO_MMIO_GUEST_FEATURES_SET	0x024 + +/* Guest's memory page size in bytes - Write Only */ +#define VIRTIO_MMIO_GUEST_PAGE_SIZE	0x028 + +/* Queue selector - Write Only */ +#define VIRTIO_MMIO_QUEUE_SEL		0x030 + +/* Maximum size of the currently selected queue - Read Only */ +#define VIRTIO_MMIO_QUEUE_NUM_MAX	0x034 + +/* Queue size for the currently selected queue - Write Only */ +#define VIRTIO_MMIO_QUEUE_NUM		0x038 + +/* Used Ring alignment for the currently selected queue - Write Only */ +#define VIRTIO_MMIO_QUEUE_ALIGN		0x03c + +/* Guest's PFN for the currently selected queue - Read Write */ +#define VIRTIO_MMIO_QUEUE_PFN		0x040 + +/* Queue notifier - Write Only */ +#define VIRTIO_MMIO_QUEUE_NOTIFY	0x050 + +/* Interrupt status - Read Only */ +#define VIRTIO_MMIO_INTERRUPT_STATUS	0x060 + +/* Interrupt acknowledge - Write Only */ +#define VIRTIO_MMIO_INTERRUPT_ACK	0x064 + +/* Device status register - Read Write */ +#define VIRTIO_MMIO_STATUS		0x070 + +/* The config space is defined by each driver as + * the per-driver configuration space - Read Write */ +#define VIRTIO_MMIO_CONFIG		0x100 + + + +/* + * Interrupt flags (re: interrupt status & acknowledge registers) + */ + +#define VIRTIO_MMIO_INT_VRING		(1 << 0) +#define VIRTIO_MMIO_INT_CONFIG		(1 << 1) + +#endif diff --git a/include/linux/virtio_ring.h b/include/linux/virtio_ring.h index 4a32cb6da42..36be0f6e18a 100644 --- a/include/linux/virtio_ring.h +++ b/include/linux/virtio_ring.h @@ -135,13 +135,13 @@ static inline void vring_init(struct vring *vr, unsigned int num, void *p,  	vr->num = num;  	vr->desc = p;  	vr->avail = p + num*sizeof(struct vring_desc); -	vr->used = (void *)(((unsigned long)&vr->avail->ring[num] + align-1) -			    & ~(align - 1)); +	vr->used = (void *)(((unsigned long)&vr->avail->ring[num] + sizeof(__u16) +		+ align-1) & ~(align - 1));  }  static inline unsigned vring_size(unsigned int num, unsigned long align)  { -	return ((sizeof(struct vring_desc) * num + sizeof(__u16) * (2 + num) +	return ((sizeof(struct vring_desc) * num + sizeof(__u16) * (3 + num)  		 + align - 1) & ~(align - 1))  		+ sizeof(__u16) * 3 + sizeof(struct vring_used_elem) * num;  } diff --git a/include/linux/vmalloc.h b/include/linux/vmalloc.h index 9332e52ea8c..687fb11e201 100644 --- a/include/linux/vmalloc.h +++ b/include/linux/vmalloc.h @@ -13,6 +13,7 @@ struct vm_area_struct;		/* vma defining user mapping in mm_types.h */  #define VM_MAP		0x00000004	/* vmap()ed pages */  #define VM_USERMAP	0x00000008	/* suitable for remap_vmalloc_range */  #define VM_VPAGES	0x00000010	/* buffer for pages was vmalloc'ed */ +#define VM_UNLIST	0x00000020	/* vm_struct is not listed in vmlist */  /* bits [20..32] reserved for arch specific ioremap internals */  /* diff --git a/include/linux/x25.h b/include/linux/x25.h index 6450a7f1207..810cce6737e 100644 --- a/include/linux/x25.h +++ b/include/linux/x25.h @@ -12,6 +12,7 @@  #define	X25_KERNEL_H  #include <linux/types.h> +#include <linux/socket.h>  #define	SIOCX25GSUBSCRIP	(SIOCPROTOPRIVATE + 0)  #define	SIOCX25SSUBSCRIP	(SIOCPROTOPRIVATE + 1) @@ -57,7 +58,7 @@ struct x25_address {   *	Linux X.25 Address structure, used for bind, and connect mostly.   */  struct sockaddr_x25 { -	sa_family_t	   sx25_family;		/* Must be AF_X25 */ +	__kernel_sa_family_t sx25_family;	/* Must be AF_X25 */  	struct x25_address sx25_addr;		/* X.121 Address */  }; diff --git a/include/linux/xattr.h b/include/linux/xattr.h index aed54c50aa6..e5d12203154 100644 --- a/include/linux/xattr.h +++ b/include/linux/xattr.h @@ -30,6 +30,9 @@  #define XATTR_USER_PREFIX_LEN (sizeof (XATTR_USER_PREFIX) - 1)  /* Security namespace */ +#define XATTR_EVM_SUFFIX "evm" +#define XATTR_NAME_EVM XATTR_SECURITY_PREFIX XATTR_EVM_SUFFIX +  #define XATTR_SELINUX_SUFFIX "selinux"  #define XATTR_NAME_SELINUX XATTR_SECURITY_PREFIX XATTR_SELINUX_SUFFIX @@ -49,6 +52,11 @@  #define XATTR_CAPS_SUFFIX "capability"  #define XATTR_NAME_CAPS XATTR_SECURITY_PREFIX XATTR_CAPS_SUFFIX +#define XATTR_POSIX_ACL_ACCESS  "posix_acl_access" +#define XATTR_NAME_POSIX_ACL_ACCESS XATTR_SYSTEM_PREFIX XATTR_POSIX_ACL_ACCESS +#define XATTR_POSIX_ACL_DEFAULT  "posix_acl_default" +#define XATTR_NAME_POSIX_ACL_DEFAULT XATTR_SYSTEM_PREFIX XATTR_POSIX_ACL_DEFAULT +  #ifdef  __KERNEL__  #include <linux/types.h> @@ -67,6 +75,12 @@ struct xattr_handler {  		   size_t size, int flags, int handler_flags);  }; +struct xattr { +	char *name; +	void *value; +	size_t value_len; +}; +  ssize_t xattr_getsecurity(struct inode *, const char *, void *, size_t);  ssize_t vfs_getxattr(struct dentry *, const char *, void *, size_t);  ssize_t vfs_listxattr(struct dentry *d, char *list, size_t size); @@ -78,7 +92,10 @@ ssize_t generic_getxattr(struct dentry *dentry, const char *name, void *buffer,  ssize_t generic_listxattr(struct dentry *dentry, char *buffer, size_t buffer_size);  int generic_setxattr(struct dentry *dentry, const char *name, const void *value, size_t size, int flags);  int generic_removexattr(struct dentry *dentry, const char *name); - +ssize_t vfs_getxattr_alloc(struct dentry *dentry, const char *name, +			   char **xattr_value, size_t size, gfp_t flags); +int vfs_xattr_cmp(struct dentry *dentry, const char *xattr_name, +		  const char *value, size_t size, gfp_t flags);  #endif  /*  __KERNEL__  */  #endif	/* _LINUX_XATTR_H */  |