Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Pull net into net-next to get the synchronize_net() bug fix in bonding. Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
						commit
						d662483264
					
				| @ -54,7 +54,7 @@ | ||||
| 		}; | ||||
| 
 | ||||
| 		mvsdio@d00d4000 { | ||||
| 			pinctrl-0 = <&sdio_pins2>; | ||||
| 			pinctrl-0 = <&sdio_pins3>; | ||||
| 			pinctrl-names = "default"; | ||||
| 			status = "okay"; | ||||
| 			/* | ||||
|  | ||||
| @ -59,6 +59,12 @@ | ||||
| 					     "mpp50", "mpp51", "mpp52"; | ||||
| 			      marvell,function = "sd0"; | ||||
| 			}; | ||||
| 
 | ||||
| 			sdio_pins3: sdio-pins3 { | ||||
| 			      marvell,pins = "mpp48", "mpp49", "mpp50", | ||||
| 					     "mpp51", "mpp52", "mpp53"; | ||||
| 			      marvell,function = "sd0"; | ||||
| 			}; | ||||
| 	        }; | ||||
| 
 | ||||
| 		gpio0: gpio@d0018100 { | ||||
|  | ||||
| @ -191,8 +191,8 @@ | ||||
| 
 | ||||
| 		prcmu: prcmu@80157000 { | ||||
| 			compatible = "stericsson,db8500-prcmu"; | ||||
| 			reg = <0x80157000 0x1000>; | ||||
| 			reg-names = "prcmu"; | ||||
| 			reg = <0x80157000 0x1000>, <0x801b0000 0x8000>, <0x801b8000 0x1000>; | ||||
| 			reg-names = "prcmu", "prcmu-tcpm", "prcmu-tcdm"; | ||||
| 			interrupts = <0 47 0x4>; | ||||
| 			#address-cells = <1>; | ||||
| 			#size-cells = <1>; | ||||
|  | ||||
| @ -77,6 +77,7 @@ | ||||
| 		}; | ||||
| 
 | ||||
| 		nand@3000000 { | ||||
| 			chip-delay = <40>; | ||||
| 			status = "okay"; | ||||
| 
 | ||||
| 			partition@0 { | ||||
|  | ||||
| @ -13,6 +13,9 @@ | ||||
| 	compatible = "marvell,orion5x"; | ||||
| 	interrupt-parent = <&intc>; | ||||
| 
 | ||||
| 	aliases { | ||||
| 		gpio0 = &gpio0; | ||||
| 	}; | ||||
| 	intc: interrupt-controller { | ||||
| 		compatible = "marvell,orion-intc", "marvell,intc"; | ||||
| 		interrupt-controller; | ||||
| @ -32,7 +35,9 @@ | ||||
| 			#gpio-cells = <2>; | ||||
| 			gpio-controller; | ||||
| 			reg = <0x10100 0x40>; | ||||
| 			ngpio = <32>; | ||||
| 			ngpios = <32>; | ||||
| 			interrupt-controller; | ||||
| 			#interrupt-cells = <2>; | ||||
| 			interrupts = <6>, <7>, <8>, <9>; | ||||
| 		}; | ||||
| 
 | ||||
| @ -91,7 +96,7 @@ | ||||
| 			reg = <0x90000 0x10000>, | ||||
| 			      <0xf2200000 0x800>; | ||||
| 			reg-names = "regs", "sram"; | ||||
| 			interrupts = <22>; | ||||
| 			interrupts = <28>; | ||||
| 			status = "okay"; | ||||
| 		}; | ||||
| 	}; | ||||
|  | ||||
| @ -22,19 +22,9 @@ | ||||
| 
 | ||||
| static struct map_desc cns3xxx_io_desc[] __initdata = { | ||||
| 	{ | ||||
| 		.virtual	= CNS3XXX_TC11MP_TWD_BASE_VIRT, | ||||
| 		.pfn		= __phys_to_pfn(CNS3XXX_TC11MP_TWD_BASE), | ||||
| 		.length		= SZ_4K, | ||||
| 		.type		= MT_DEVICE, | ||||
| 	}, { | ||||
| 		.virtual	= CNS3XXX_TC11MP_GIC_CPU_BASE_VIRT, | ||||
| 		.pfn		= __phys_to_pfn(CNS3XXX_TC11MP_GIC_CPU_BASE), | ||||
| 		.length		= SZ_4K, | ||||
| 		.type		= MT_DEVICE, | ||||
| 	}, { | ||||
| 		.virtual	= CNS3XXX_TC11MP_GIC_DIST_BASE_VIRT, | ||||
| 		.pfn		= __phys_to_pfn(CNS3XXX_TC11MP_GIC_DIST_BASE), | ||||
| 		.length		= SZ_4K, | ||||
| 		.virtual	= CNS3XXX_TC11MP_SCU_BASE_VIRT, | ||||
| 		.pfn		= __phys_to_pfn(CNS3XXX_TC11MP_SCU_BASE), | ||||
| 		.length		= SZ_8K, | ||||
| 		.type		= MT_DEVICE, | ||||
| 	}, { | ||||
| 		.virtual	= CNS3XXX_TIMER1_2_3_BASE_VIRT, | ||||
|  | ||||
| @ -94,10 +94,10 @@ | ||||
| #define RTC_INTR_STS_OFFSET			0x34 | ||||
| 
 | ||||
| #define CNS3XXX_MISC_BASE			0x76000000	/* Misc Control */ | ||||
| #define CNS3XXX_MISC_BASE_VIRT			0xFFF07000	/* Misc Control */ | ||||
| #define CNS3XXX_MISC_BASE_VIRT			0xFB000000	/* Misc Control */ | ||||
| 
 | ||||
| #define CNS3XXX_PM_BASE				0x77000000	/* Power Management Control */ | ||||
| #define CNS3XXX_PM_BASE_VIRT			0xFFF08000 | ||||
| #define CNS3XXX_PM_BASE_VIRT			0xFB001000 | ||||
| 
 | ||||
| #define PM_CLK_GATE_OFFSET			0x00 | ||||
| #define PM_SOFT_RST_OFFSET			0x04 | ||||
| @ -109,7 +109,7 @@ | ||||
| #define PM_PLL_HM_PD_OFFSET			0x1C | ||||
| 
 | ||||
| #define CNS3XXX_UART0_BASE			0x78000000	/* UART 0 */ | ||||
| #define CNS3XXX_UART0_BASE_VIRT			0xFFF09000 | ||||
| #define CNS3XXX_UART0_BASE_VIRT			0xFB002000 | ||||
| 
 | ||||
| #define CNS3XXX_UART1_BASE			0x78400000	/* UART 1 */ | ||||
| #define CNS3XXX_UART1_BASE_VIRT			0xFFF0A000 | ||||
| @ -130,7 +130,7 @@ | ||||
| #define CNS3XXX_I2S_BASE_VIRT			0xFFF10000 | ||||
| 
 | ||||
| #define CNS3XXX_TIMER1_2_3_BASE			0x7C800000	/* Timer */ | ||||
| #define CNS3XXX_TIMER1_2_3_BASE_VIRT		0xFFF10800 | ||||
| #define CNS3XXX_TIMER1_2_3_BASE_VIRT		0xFB003000 | ||||
| 
 | ||||
| #define TIMER1_COUNTER_OFFSET			0x00 | ||||
| #define TIMER1_AUTO_RELOAD_OFFSET		0x04 | ||||
| @ -227,16 +227,16 @@ | ||||
|  * Testchip peripheral and fpga gic regions | ||||
|  */ | ||||
| #define CNS3XXX_TC11MP_SCU_BASE			0x90000000	/* IRQ, Test chip */ | ||||
| #define CNS3XXX_TC11MP_SCU_BASE_VIRT		0xFF000000 | ||||
| #define CNS3XXX_TC11MP_SCU_BASE_VIRT		0xFB004000 | ||||
| 
 | ||||
| #define CNS3XXX_TC11MP_GIC_CPU_BASE		0x90000100	/* Test chip interrupt controller CPU interface */ | ||||
| #define CNS3XXX_TC11MP_GIC_CPU_BASE_VIRT	0xFF000100 | ||||
| #define CNS3XXX_TC11MP_GIC_CPU_BASE_VIRT	(CNS3XXX_TC11MP_SCU_BASE_VIRT + 0x100) | ||||
| 
 | ||||
| #define CNS3XXX_TC11MP_TWD_BASE			0x90000600 | ||||
| #define CNS3XXX_TC11MP_TWD_BASE_VIRT		0xFF000600 | ||||
| #define CNS3XXX_TC11MP_TWD_BASE_VIRT		(CNS3XXX_TC11MP_SCU_BASE_VIRT + 0x600) | ||||
| 
 | ||||
| #define CNS3XXX_TC11MP_GIC_DIST_BASE		0x90001000	/* Test chip interrupt controller distributor */ | ||||
| #define CNS3XXX_TC11MP_GIC_DIST_BASE_VIRT	0xFF001000 | ||||
| #define CNS3XXX_TC11MP_GIC_DIST_BASE_VIRT	(CNS3XXX_TC11MP_SCU_BASE_VIRT + 0x1000) | ||||
| 
 | ||||
| #define CNS3XXX_TC11MP_L220_BASE		0x92002000	/* L220 registers */ | ||||
| #define CNS3XXX_TC11MP_L220_BASE_VIRT		0xFF002000 | ||||
|  | ||||
| @ -47,9 +47,13 @@ static void __raw_writel(unsigned int value, unsigned int ptr) | ||||
| 
 | ||||
| static inline void putc(int c) | ||||
| { | ||||
| 	/* Transmit fifo not full?  */ | ||||
| 	while (__raw_readb(PHYS_UART_FLAG) & UART_FLAG_TXFF) | ||||
| 		; | ||||
| 	int i; | ||||
| 
 | ||||
| 	for (i = 0; i < 10000; i++) { | ||||
| 		/* Transmit fifo not full? */ | ||||
| 		if (!(__raw_readb(PHYS_UART_FLAG) & UART_FLAG_TXFF)) | ||||
| 			break; | ||||
| 	} | ||||
| 
 | ||||
| 	__raw_writeb(c, PHYS_UART_DATA); | ||||
| } | ||||
|  | ||||
| @ -110,6 +110,8 @@ void tzic_handle_irq(struct pt_regs *); | ||||
| 
 | ||||
| extern void imx_enable_cpu(int cpu, bool enable); | ||||
| extern void imx_set_cpu_jump(int cpu, void *jump_addr); | ||||
| extern u32 imx_get_cpu_arg(int cpu); | ||||
| extern void imx_set_cpu_arg(int cpu, u32 arg); | ||||
| extern void v7_cpu_resume(void); | ||||
| extern u32 *pl310_get_save_ptr(void); | ||||
| #ifdef CONFIG_SMP | ||||
|  | ||||
| @ -46,11 +46,23 @@ static inline void cpu_enter_lowpower(void) | ||||
| void imx_cpu_die(unsigned int cpu) | ||||
| { | ||||
| 	cpu_enter_lowpower(); | ||||
| 	/*
 | ||||
| 	 * We use the cpu jumping argument register to sync with | ||||
| 	 * imx_cpu_kill() which is running on cpu0 and waiting for | ||||
| 	 * the register being cleared to kill the cpu. | ||||
| 	 */ | ||||
| 	imx_set_cpu_arg(cpu, ~0); | ||||
| 	cpu_do_idle(); | ||||
| } | ||||
| 
 | ||||
| int imx_cpu_kill(unsigned int cpu) | ||||
| { | ||||
| 	unsigned long timeout = jiffies + msecs_to_jiffies(50); | ||||
| 
 | ||||
| 	while (imx_get_cpu_arg(cpu) == 0) | ||||
| 		if (time_after(jiffies, timeout)) | ||||
| 			return 0; | ||||
| 	imx_enable_cpu(cpu, false); | ||||
| 	imx_set_cpu_arg(cpu, 0); | ||||
| 	return 1; | ||||
| } | ||||
|  | ||||
| @ -43,6 +43,18 @@ void imx_set_cpu_jump(int cpu, void *jump_addr) | ||||
| 		       src_base + SRC_GPR1 + cpu * 8); | ||||
| } | ||||
| 
 | ||||
| u32 imx_get_cpu_arg(int cpu) | ||||
| { | ||||
| 	cpu = cpu_logical_map(cpu); | ||||
| 	return readl_relaxed(src_base + SRC_GPR1 + cpu * 8 + 4); | ||||
| } | ||||
| 
 | ||||
| void imx_set_cpu_arg(int cpu, u32 arg) | ||||
| { | ||||
| 	cpu = cpu_logical_map(cpu); | ||||
| 	writel_relaxed(arg, src_base + SRC_GPR1 + cpu * 8 + 4); | ||||
| } | ||||
| 
 | ||||
| void imx_src_prepare_restart(void) | ||||
| { | ||||
| 	u32 val; | ||||
|  | ||||
| @ -53,6 +53,8 @@ static struct mv_sata_platform_data guruplug_sata_data = { | ||||
| 
 | ||||
| static struct mvsdio_platform_data guruplug_mvsdio_data = { | ||||
| 	/* unfortunately the CD signal has not been connected */ | ||||
| 	.gpio_card_detect = -1, | ||||
| 	.gpio_write_protect = -1, | ||||
| }; | ||||
| 
 | ||||
| static struct gpio_led guruplug_led_pins[] = { | ||||
|  | ||||
| @ -55,6 +55,7 @@ static struct mv_sata_platform_data openrd_sata_data = { | ||||
| 
 | ||||
| static struct mvsdio_platform_data openrd_mvsdio_data = { | ||||
| 	.gpio_card_detect = 29,	/* MPP29 used as SD card detect */ | ||||
| 	.gpio_write_protect = -1, | ||||
| }; | ||||
| 
 | ||||
| static unsigned int openrd_mpp_config[] __initdata = { | ||||
|  | ||||
| @ -69,6 +69,7 @@ static struct mv_sata_platform_data rd88f6281_sata_data = { | ||||
| 
 | ||||
| static struct mvsdio_platform_data rd88f6281_mvsdio_data = { | ||||
| 	.gpio_card_detect = 28, | ||||
| 	.gpio_write_protect = -1, | ||||
| }; | ||||
| 
 | ||||
| static unsigned int rd88f6281_mpp_config[] __initdata = { | ||||
|  | ||||
| @ -62,7 +62,10 @@ static int msm_timer_set_next_event(unsigned long cycles, | ||||
| { | ||||
| 	u32 ctrl = readl_relaxed(event_base + TIMER_ENABLE); | ||||
| 
 | ||||
| 	writel_relaxed(0, event_base + TIMER_CLEAR); | ||||
| 	ctrl &= ~TIMER_ENABLE_EN; | ||||
| 	writel_relaxed(ctrl, event_base + TIMER_ENABLE); | ||||
| 
 | ||||
| 	writel_relaxed(ctrl, event_base + TIMER_CLEAR); | ||||
| 	writel_relaxed(cycles, event_base + TIMER_MATCH_VAL); | ||||
| 	writel_relaxed(ctrl | TIMER_ENABLE_EN, event_base + TIMER_ENABLE); | ||||
| 	return 0; | ||||
|  | ||||
| @ -44,6 +44,8 @@ | ||||
| 
 | ||||
| #define ARMADA_370_XP_MAX_PER_CPU_IRQS		(28) | ||||
| 
 | ||||
| #define ARMADA_370_XP_TIMER0_PER_CPU_IRQ	(5) | ||||
| 
 | ||||
| #define ACTIVE_DOORBELLS			(8) | ||||
| 
 | ||||
| static DEFINE_RAW_SPINLOCK(irq_controller_lock); | ||||
| @ -62,7 +64,7 @@ static void armada_370_xp_irq_mask(struct irq_data *d) | ||||
| #ifdef CONFIG_SMP | ||||
| 	irq_hw_number_t hwirq = irqd_to_hwirq(d); | ||||
| 
 | ||||
| 	if (hwirq > ARMADA_370_XP_MAX_PER_CPU_IRQS) | ||||
| 	if (hwirq != ARMADA_370_XP_TIMER0_PER_CPU_IRQ) | ||||
| 		writel(hwirq, main_int_base + | ||||
| 				ARMADA_370_XP_INT_CLEAR_ENABLE_OFFS); | ||||
| 	else | ||||
| @ -79,7 +81,7 @@ static void armada_370_xp_irq_unmask(struct irq_data *d) | ||||
| #ifdef CONFIG_SMP | ||||
| 	irq_hw_number_t hwirq = irqd_to_hwirq(d); | ||||
| 
 | ||||
| 	if (hwirq > ARMADA_370_XP_MAX_PER_CPU_IRQS) | ||||
| 	if (hwirq != ARMADA_370_XP_TIMER0_PER_CPU_IRQ) | ||||
| 		writel(hwirq, main_int_base + | ||||
| 				ARMADA_370_XP_INT_SET_ENABLE_OFFS); | ||||
| 	else | ||||
| @ -147,7 +149,7 @@ static int armada_370_xp_mpic_irq_map(struct irq_domain *h, | ||||
| 	writel(hw, main_int_base + ARMADA_370_XP_INT_SET_ENABLE_OFFS); | ||||
| 	irq_set_status_flags(virq, IRQ_LEVEL); | ||||
| 
 | ||||
| 	if (hw < ARMADA_370_XP_MAX_PER_CPU_IRQS) { | ||||
| 	if (hw == ARMADA_370_XP_TIMER0_PER_CPU_IRQ) { | ||||
| 		irq_set_percpu_devid(virq); | ||||
| 		irq_set_chip_and_handler(virq, &armada_370_xp_irq_chip, | ||||
| 					handle_percpu_devid_irq); | ||||
|  | ||||
| @ -538,15 +538,6 @@ static struct clk usb_hhc_ck16xx = { | ||||
| }; | ||||
| 
 | ||||
| static struct clk usb_dc_ck = { | ||||
| 	.name		= "usb_dc_ck", | ||||
| 	.ops		= &clkops_generic, | ||||
| 	/* Direct from ULPD, no parent */ | ||||
| 	.rate		= 48000000, | ||||
| 	.enable_reg	= OMAP1_IO_ADDRESS(SOFT_REQ_REG), | ||||
| 	.enable_bit	= USB_REQ_EN_SHIFT, | ||||
| }; | ||||
| 
 | ||||
| static struct clk usb_dc_ck7xx = { | ||||
| 	.name		= "usb_dc_ck", | ||||
| 	.ops		= &clkops_generic, | ||||
| 	/* Direct from ULPD, no parent */ | ||||
| @ -727,8 +718,7 @@ static struct omap_clk omap_clks[] = { | ||||
| 	CLK(NULL,	"usb_clko",	&usb_clko,	CK_16XX | CK_1510 | CK_310), | ||||
| 	CLK(NULL,	"usb_hhc_ck",	&usb_hhc_ck1510, CK_1510 | CK_310), | ||||
| 	CLK(NULL,	"usb_hhc_ck",	&usb_hhc_ck16xx, CK_16XX), | ||||
| 	CLK(NULL,	"usb_dc_ck",	&usb_dc_ck,	CK_16XX), | ||||
| 	CLK(NULL,	"usb_dc_ck",	&usb_dc_ck7xx,	CK_7XX), | ||||
| 	CLK(NULL,	"usb_dc_ck",	&usb_dc_ck,	CK_16XX | CK_7XX), | ||||
| 	CLK(NULL,	"mclk",		&mclk_1510,	CK_1510 | CK_310), | ||||
| 	CLK(NULL,	"mclk",		&mclk_16xx,	CK_16XX), | ||||
| 	CLK(NULL,	"bclk",		&bclk_1510,	CK_1510 | CK_310), | ||||
|  | ||||
| @ -52,6 +52,13 @@ | ||||
|  */ | ||||
| #define OMAP4_DPLL_ABE_DEFFREQ				98304000 | ||||
| 
 | ||||
| /*
 | ||||
|  * OMAP4 USB DPLL default frequency. In OMAP4430 TRM version V, section | ||||
|  * "3.6.3.9.5 DPLL_USB Preferred Settings" shows that the preferred | ||||
|  * locked frequency for the USB DPLL is 960MHz. | ||||
|  */ | ||||
| #define OMAP4_DPLL_USB_DEFFREQ				960000000 | ||||
| 
 | ||||
| /* Root clocks */ | ||||
| 
 | ||||
| DEFINE_CLK_FIXED_RATE(extalt_clkin_ck, CLK_IS_ROOT, 59000000, 0x0); | ||||
| @ -1011,6 +1018,10 @@ DEFINE_CLK_OMAP_MUX(hsmmc2_fclk, "l3_init_clkdm", hsmmc1_fclk_sel, | ||||
| 		    OMAP4430_CM_L3INIT_MMC2_CLKCTRL, OMAP4430_CLKSEL_MASK, | ||||
| 		    hsmmc1_fclk_parents, func_dmic_abe_gfclk_ops); | ||||
| 
 | ||||
| DEFINE_CLK_GATE(ocp2scp_usb_phy_phy_48m, "func_48m_fclk", &func_48m_fclk, 0x0, | ||||
| 		OMAP4430_CM_L3INIT_USBPHYOCP2SCP_CLKCTRL, | ||||
| 		OMAP4430_OPTFCLKEN_PHY_48M_SHIFT, 0x0, NULL); | ||||
| 
 | ||||
| DEFINE_CLK_GATE(sha2md5_fck, "l3_div_ck", &l3_div_ck, 0x0, | ||||
| 		OMAP4430_CM_L4SEC_SHA2MD51_CLKCTRL, | ||||
| 		OMAP4430_MODULEMODE_SWCTRL_SHIFT, 0x0, NULL); | ||||
| @ -1538,6 +1549,7 @@ static struct omap_clk omap44xx_clks[] = { | ||||
| 	CLK(NULL,	"per_mcbsp4_gfclk",			&per_mcbsp4_gfclk,	CK_443X), | ||||
| 	CLK(NULL,	"hsmmc1_fclk",			&hsmmc1_fclk,	CK_443X), | ||||
| 	CLK(NULL,	"hsmmc2_fclk",			&hsmmc2_fclk,	CK_443X), | ||||
| 	CLK(NULL,	"ocp2scp_usb_phy_phy_48m",	&ocp2scp_usb_phy_phy_48m,	CK_443X), | ||||
| 	CLK(NULL,	"sha2md5_fck",			&sha2md5_fck,	CK_443X), | ||||
| 	CLK(NULL,	"slimbus1_fclk_1",		&slimbus1_fclk_1,	CK_443X), | ||||
| 	CLK(NULL,	"slimbus1_fclk_0",		&slimbus1_fclk_0,	CK_443X), | ||||
| @ -1705,5 +1717,13 @@ int __init omap4xxx_clk_init(void) | ||||
| 	if (rc) | ||||
| 		pr_err("%s: failed to configure ABE DPLL!\n", __func__); | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * Lock USB DPLL on OMAP4 devices so that the L3INIT power | ||||
| 	 * domain can transition to retention state when not in use. | ||||
| 	 */ | ||||
| 	rc = clk_set_rate(&dpll_usb_ck, OMAP4_DPLL_USB_DEFFREQ); | ||||
| 	if (rc) | ||||
| 		pr_err("%s: failed to configure USB DPLL!\n", __func__); | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| @ -293,5 +293,8 @@ extern void omap_reserve(void); | ||||
| struct omap_hwmod; | ||||
| extern int omap_dss_reset(struct omap_hwmod *); | ||||
| 
 | ||||
| /* SoC specific clock initializer */ | ||||
| extern int (*omap_clk_init)(void); | ||||
| 
 | ||||
| #endif /* __ASSEMBLER__ */ | ||||
| #endif /* __ARCH_ARM_MACH_OMAP2PLUS_COMMON_H */ | ||||
|  | ||||
| @ -54,6 +54,12 @@ | ||||
| #include "prm3xxx.h" | ||||
| #include "prm44xx.h" | ||||
| 
 | ||||
| /*
 | ||||
|  * omap_clk_init: points to a function that does the SoC-specific | ||||
|  * clock initializations | ||||
|  */ | ||||
| int (*omap_clk_init)(void); | ||||
| 
 | ||||
| /*
 | ||||
|  * The machine specific code may provide the extra mapping besides the | ||||
|  * default mapping provided here. | ||||
| @ -397,7 +403,7 @@ void __init omap2420_init_early(void) | ||||
| 	omap242x_clockdomains_init(); | ||||
| 	omap2420_hwmod_init(); | ||||
| 	omap_hwmod_init_postsetup(); | ||||
| 	omap2420_clk_init(); | ||||
| 	omap_clk_init = omap2420_clk_init; | ||||
| } | ||||
| 
 | ||||
| void __init omap2420_init_late(void) | ||||
| @ -427,7 +433,7 @@ void __init omap2430_init_early(void) | ||||
| 	omap243x_clockdomains_init(); | ||||
| 	omap2430_hwmod_init(); | ||||
| 	omap_hwmod_init_postsetup(); | ||||
| 	omap2430_clk_init(); | ||||
| 	omap_clk_init = omap2430_clk_init; | ||||
| } | ||||
| 
 | ||||
| void __init omap2430_init_late(void) | ||||
| @ -462,7 +468,7 @@ void __init omap3_init_early(void) | ||||
| 	omap3xxx_clockdomains_init(); | ||||
| 	omap3xxx_hwmod_init(); | ||||
| 	omap_hwmod_init_postsetup(); | ||||
| 	omap3xxx_clk_init(); | ||||
| 	omap_clk_init = omap3xxx_clk_init; | ||||
| } | ||||
| 
 | ||||
| void __init omap3430_init_early(void) | ||||
| @ -500,7 +506,7 @@ void __init ti81xx_init_early(void) | ||||
| 	omap3xxx_clockdomains_init(); | ||||
| 	omap3xxx_hwmod_init(); | ||||
| 	omap_hwmod_init_postsetup(); | ||||
| 	omap3xxx_clk_init(); | ||||
| 	omap_clk_init = omap3xxx_clk_init; | ||||
| } | ||||
| 
 | ||||
| void __init omap3_init_late(void) | ||||
| @ -568,7 +574,7 @@ void __init am33xx_init_early(void) | ||||
| 	am33xx_clockdomains_init(); | ||||
| 	am33xx_hwmod_init(); | ||||
| 	omap_hwmod_init_postsetup(); | ||||
| 	am33xx_clk_init(); | ||||
| 	omap_clk_init = am33xx_clk_init; | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| @ -593,7 +599,7 @@ void __init omap4430_init_early(void) | ||||
| 	omap44xx_clockdomains_init(); | ||||
| 	omap44xx_hwmod_init(); | ||||
| 	omap_hwmod_init_postsetup(); | ||||
| 	omap4xxx_clk_init(); | ||||
| 	omap_clk_init = omap4xxx_clk_init; | ||||
| } | ||||
| 
 | ||||
| void __init omap4430_init_late(void) | ||||
|  | ||||
| @ -1368,7 +1368,9 @@ static void _enable_sysc(struct omap_hwmod *oh) | ||||
| 	} | ||||
| 
 | ||||
| 	if (sf & SYSC_HAS_MIDLEMODE) { | ||||
| 		if (oh->flags & HWMOD_SWSUP_MSTANDBY) { | ||||
| 		if (oh->flags & HWMOD_FORCE_MSTANDBY) { | ||||
| 			idlemode = HWMOD_IDLEMODE_FORCE; | ||||
| 		} else if (oh->flags & HWMOD_SWSUP_MSTANDBY) { | ||||
| 			idlemode = HWMOD_IDLEMODE_NO; | ||||
| 		} else { | ||||
| 			if (sf & SYSC_HAS_ENAWAKEUP) | ||||
| @ -1440,7 +1442,8 @@ static void _idle_sysc(struct omap_hwmod *oh) | ||||
| 	} | ||||
| 
 | ||||
| 	if (sf & SYSC_HAS_MIDLEMODE) { | ||||
| 		if (oh->flags & HWMOD_SWSUP_MSTANDBY) { | ||||
| 		if ((oh->flags & HWMOD_SWSUP_MSTANDBY) || | ||||
| 		    (oh->flags & HWMOD_FORCE_MSTANDBY)) { | ||||
| 			idlemode = HWMOD_IDLEMODE_FORCE; | ||||
| 		} else { | ||||
| 			if (sf & SYSC_HAS_ENAWAKEUP) | ||||
|  | ||||
| @ -427,8 +427,8 @@ struct omap_hwmod_omap4_prcm { | ||||
|  * | ||||
|  * HWMOD_SWSUP_SIDLE: omap_hwmod code should manually bring module in and out | ||||
|  *     of idle, rather than relying on module smart-idle | ||||
|  * HWMOD_SWSUP_MSTDBY: omap_hwmod code should manually bring module in and out | ||||
|  *     of standby, rather than relying on module smart-standby | ||||
|  * HWMOD_SWSUP_MSTANDBY: omap_hwmod code should manually bring module in and | ||||
|  *     out of standby, rather than relying on module smart-standby | ||||
|  * HWMOD_INIT_NO_RESET: don't reset this module at boot - important for | ||||
|  *     SDRAM controller, etc. XXX probably belongs outside the main hwmod file | ||||
|  *     XXX Should be HWMOD_SETUP_NO_RESET | ||||
| @ -459,6 +459,10 @@ struct omap_hwmod_omap4_prcm { | ||||
|  *     correctly, or this is being abused to deal with some PM latency | ||||
|  *     issues -- but we're currently suffering from a shortage of | ||||
|  *     folks who are able to track these issues down properly. | ||||
|  * HWMOD_FORCE_MSTANDBY: Always keep MIDLEMODE bits cleared so that device | ||||
|  *     is kept in force-standby mode. Failing to do so causes PM problems | ||||
|  *     with musb on OMAP3630 at least. Note that musb has a dedicated register | ||||
|  *     to control MSTANDBY signal when MIDLEMODE is set to force-standby. | ||||
|  */ | ||||
| #define HWMOD_SWSUP_SIDLE			(1 << 0) | ||||
| #define HWMOD_SWSUP_MSTANDBY			(1 << 1) | ||||
| @ -471,6 +475,7 @@ struct omap_hwmod_omap4_prcm { | ||||
| #define HWMOD_16BIT_REG				(1 << 8) | ||||
| #define HWMOD_EXT_OPT_MAIN_CLK			(1 << 9) | ||||
| #define HWMOD_BLOCK_WFI				(1 << 10) | ||||
| #define HWMOD_FORCE_MSTANDBY			(1 << 11) | ||||
| 
 | ||||
| /*
 | ||||
|  * omap_hwmod._int_flags definitions | ||||
|  | ||||
| @ -1707,9 +1707,14 @@ static struct omap_hwmod omap3xxx_usbhsotg_hwmod = { | ||||
| 	 * Erratum ID: i479  idle_req / idle_ack mechanism potentially | ||||
| 	 * broken when autoidle is enabled | ||||
| 	 * workaround is to disable the autoidle bit at module level. | ||||
| 	 * | ||||
| 	 * Enabling the device in any other MIDLEMODE setting but force-idle | ||||
| 	 * causes core_pwrdm not enter idle states at least on OMAP3630. | ||||
| 	 * Note that musb has OTG_FORCESTDBY register that controls MSTANDBY | ||||
| 	 * signal when MIDLEMODE is set to force-idle. | ||||
| 	 */ | ||||
| 	.flags		= HWMOD_NO_OCP_AUTOIDLE | HWMOD_SWSUP_SIDLE | ||||
| 				| HWMOD_SWSUP_MSTANDBY, | ||||
| 				| HWMOD_FORCE_MSTANDBY, | ||||
| }; | ||||
| 
 | ||||
| /* usb_otg_hs */ | ||||
|  | ||||
| @ -2714,6 +2714,10 @@ static struct omap_ocp2scp_dev ocp2scp_dev_attr[] = { | ||||
| 	{ } | ||||
| }; | ||||
| 
 | ||||
| static struct omap_hwmod_opt_clk ocp2scp_usb_phy_opt_clks[] = { | ||||
| 	{ .role = "48mhz", .clk = "ocp2scp_usb_phy_phy_48m" }, | ||||
| }; | ||||
| 
 | ||||
| /* ocp2scp_usb_phy */ | ||||
| static struct omap_hwmod omap44xx_ocp2scp_usb_phy_hwmod = { | ||||
| 	.name		= "ocp2scp_usb_phy", | ||||
| @ -2728,6 +2732,8 @@ static struct omap_hwmod omap44xx_ocp2scp_usb_phy_hwmod = { | ||||
| 		}, | ||||
| 	}, | ||||
| 	.dev_attr	= ocp2scp_dev_attr, | ||||
| 	.opt_clks	= ocp2scp_usb_phy_opt_clks, | ||||
| 	.opt_clks_cnt	= ARRAY_SIZE(ocp2scp_usb_phy_opt_clks), | ||||
| }; | ||||
| 
 | ||||
| /*
 | ||||
|  | ||||
| @ -547,6 +547,8 @@ static inline void __init realtime_counter_init(void) | ||||
| 			       clksrc_nr, clksrc_src)			\ | ||||
| void __init omap##name##_gptimer_timer_init(void)			\ | ||||
| {									\ | ||||
| 	if (omap_clk_init)						\ | ||||
| 		omap_clk_init();					\ | ||||
| 	omap_dmtimer_init();						\ | ||||
| 	omap2_gp_clockevent_init((clkev_nr), clkev_src, clkev_prop);	\ | ||||
| 	omap2_gptimer_clocksource_init((clksrc_nr), clksrc_src);	\ | ||||
| @ -556,6 +558,8 @@ void __init omap##name##_gptimer_timer_init(void)			\ | ||||
| 				clksrc_nr, clksrc_src)			\ | ||||
| void __init omap##name##_sync32k_timer_init(void)		\ | ||||
| {									\ | ||||
| 	if (omap_clk_init)						\ | ||||
| 		omap_clk_init();					\ | ||||
| 	omap_dmtimer_init();						\ | ||||
| 	omap2_gp_clockevent_init((clkev_nr), clkev_src, clkev_prop);	\ | ||||
| 	/* Enable the use of clocksource="gp_timer" kernel parameter */	\ | ||||
|  | ||||
| @ -81,7 +81,6 @@ static struct stedma40_chan_cfg mop500_sdi0_dma_cfg_tx = { | ||||
| #endif | ||||
| 
 | ||||
| struct mmci_platform_data mop500_sdi0_data = { | ||||
| 	.ios_handler	= mop500_sdi0_ios_handler, | ||||
| 	.ocr_mask	= MMC_VDD_29_30, | ||||
| 	.f_max		= 50000000, | ||||
| 	.capabilities	= MMC_CAP_4_BIT_DATA | | ||||
|  | ||||
| @ -12,6 +12,7 @@ | ||||
| #include <linux/init.h> | ||||
| #include <linux/interrupt.h> | ||||
| #include <linux/platform_device.h> | ||||
| #include <linux/clk.h> | ||||
| #include <linux/io.h> | ||||
| #include <linux/i2c.h> | ||||
| #include <linux/platform_data/i2c-nomadik.h> | ||||
| @ -439,6 +440,15 @@ static void mop500_prox_deactivate(struct device *dev) | ||||
| 	regulator_put(prox_regulator); | ||||
| } | ||||
| 
 | ||||
| void mop500_snowball_ethernet_clock_enable(void) | ||||
| { | ||||
| 	struct clk *clk; | ||||
| 
 | ||||
| 	clk = clk_get_sys("fsmc", NULL); | ||||
| 	if (!IS_ERR(clk)) | ||||
| 		clk_prepare_enable(clk); | ||||
| } | ||||
| 
 | ||||
| static struct cryp_platform_data u8500_cryp1_platform_data = { | ||||
| 		.mem_to_engine = { | ||||
| 				.dir = STEDMA40_MEM_TO_PERIPH, | ||||
| @ -683,6 +693,8 @@ static void __init snowball_init_machine(void) | ||||
| 	mop500_audio_init(parent); | ||||
| 	mop500_uart_init(parent); | ||||
| 
 | ||||
| 	mop500_snowball_ethernet_clock_enable(); | ||||
| 
 | ||||
| 	/* This board has full regulator constraints */ | ||||
| 	regulator_has_full_constraints(); | ||||
| } | ||||
|  | ||||
| @ -104,6 +104,7 @@ void __init mop500_pinmaps_init(void); | ||||
| void __init snowball_pinmaps_init(void); | ||||
| void __init hrefv60_pinmaps_init(void); | ||||
| void mop500_audio_init(struct device *parent); | ||||
| void mop500_snowball_ethernet_clock_enable(void); | ||||
| 
 | ||||
| int __init mop500_uib_init(void); | ||||
| void mop500_uib_i2c_add(int busnum, struct i2c_board_info *info, | ||||
|  | ||||
| @ -312,9 +312,10 @@ static void __init u8500_init_machine(void) | ||||
| 	/* Pinmaps must be in place before devices register */ | ||||
| 	if (of_machine_is_compatible("st-ericsson,mop500")) | ||||
| 		mop500_pinmaps_init(); | ||||
| 	else if (of_machine_is_compatible("calaosystems,snowball-a9500")) | ||||
| 	else if (of_machine_is_compatible("calaosystems,snowball-a9500")) { | ||||
| 		snowball_pinmaps_init(); | ||||
| 	else if (of_machine_is_compatible("st-ericsson,hrefv60+")) | ||||
| 		mop500_snowball_ethernet_clock_enable(); | ||||
| 	} else if (of_machine_is_compatible("st-ericsson,hrefv60+")) | ||||
| 		hrefv60_pinmaps_init(); | ||||
| 	else if (of_machine_is_compatible("st-ericsson,ccu9540")) {} | ||||
| 		/* TODO: Add pinmaps for ccu9540 board. */ | ||||
|  | ||||
| @ -18,7 +18,7 @@ config MIPS | ||||
| 	select HAVE_KRETPROBES | ||||
| 	select HAVE_DEBUG_KMEMLEAK | ||||
| 	select ARCH_BINFMT_ELF_RANDOMIZE_PIE | ||||
| 	select HAVE_ARCH_TRANSPARENT_HUGEPAGE | ||||
| 	select HAVE_ARCH_TRANSPARENT_HUGEPAGE if CPU_SUPPORTS_HUGEPAGES && 64BIT | ||||
| 	select RTC_LIB if !MACH_LOONGSON | ||||
| 	select GENERIC_ATOMIC64 if !64BIT | ||||
| 	select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE | ||||
| @ -1493,7 +1493,6 @@ config CPU_XLP | ||||
| 	select CPU_SUPPORTS_32BIT_KERNEL | ||||
| 	select CPU_SUPPORTS_64BIT_KERNEL | ||||
| 	select CPU_SUPPORTS_HIGHMEM | ||||
| 	select CPU_HAS_LLSC | ||||
| 	select WEAK_ORDERING | ||||
| 	select WEAK_REORDERING_BEYOND_LLSC | ||||
| 	select CPU_HAS_PREFETCH | ||||
|  | ||||
| @ -745,10 +745,7 @@ void __init board_prom_init(void) | ||||
| 		strcpy(cfe_version, "unknown"); | ||||
| 	printk(KERN_INFO PFX "CFE version: %s\n", cfe_version); | ||||
| 
 | ||||
| 	if (bcm63xx_nvram_init(boot_addr + BCM963XX_NVRAM_OFFSET)) { | ||||
| 		printk(KERN_ERR PFX "invalid nvram checksum\n"); | ||||
| 		return; | ||||
| 	} | ||||
| 	bcm63xx_nvram_init(boot_addr + BCM963XX_NVRAM_OFFSET); | ||||
| 
 | ||||
| 	board_name = bcm63xx_nvram_get_name(); | ||||
| 	/* find board by name */ | ||||
|  | ||||
| @ -38,7 +38,7 @@ struct bcm963xx_nvram { | ||||
| static struct bcm963xx_nvram nvram; | ||||
| static int mac_addr_used; | ||||
| 
 | ||||
| int __init bcm63xx_nvram_init(void *addr) | ||||
| void __init bcm63xx_nvram_init(void *addr) | ||||
| { | ||||
| 	unsigned int check_len; | ||||
| 	u32 crc, expected_crc; | ||||
| @ -60,9 +60,8 @@ int __init bcm63xx_nvram_init(void *addr) | ||||
| 	crc = crc32_le(~0, (u8 *)&nvram, check_len); | ||||
| 
 | ||||
| 	if (crc != expected_crc) | ||||
| 		return -EINVAL; | ||||
| 
 | ||||
| 	return 0; | ||||
| 		pr_warn("nvram checksum failed, contents may be invalid (expected %08x, got %08x)\n", | ||||
| 			expected_crc, crc); | ||||
| } | ||||
| 
 | ||||
| u8 *bcm63xx_nvram_get_name(void) | ||||
|  | ||||
| @ -157,4 +157,4 @@ int __init bcm63xx_register_devices(void) | ||||
| 	return board_register_devices(); | ||||
| } | ||||
| 
 | ||||
| device_initcall(bcm63xx_register_devices); | ||||
| arch_initcall(bcm63xx_register_devices); | ||||
|  | ||||
| @ -9,10 +9,8 @@ | ||||
|  * | ||||
|  * Initialized the local nvram copy from the target address and checks | ||||
|  * its checksum. | ||||
|  * | ||||
|  * Returns 0 on success. | ||||
|  */ | ||||
| int __init bcm63xx_nvram_init(void *nvram); | ||||
| void bcm63xx_nvram_init(void *nvram); | ||||
| 
 | ||||
| /**
 | ||||
|  * bcm63xx_nvram_get_name() - returns the board name according to nvram | ||||
|  | ||||
| @ -28,11 +28,7 @@ | ||||
| /* #define cpu_has_prefetch	? */ | ||||
| #define cpu_has_mcheck		1 | ||||
| /* #define cpu_has_ejtag	? */ | ||||
| #ifdef CONFIG_CPU_HAS_LLSC | ||||
| #define cpu_has_llsc		1 | ||||
| #else | ||||
| #define cpu_has_llsc		0 | ||||
| #endif | ||||
| /* #define cpu_has_vtag_icache	? */ | ||||
| /* #define cpu_has_dc_aliases	? */ | ||||
| /* #define cpu_has_ic_fills_f_dc ? */ | ||||
|  | ||||
| @ -1166,7 +1166,10 @@ do {									\ | ||||
| 	unsigned int __dspctl;						\ | ||||
| 									\ | ||||
| 	__asm__ __volatile__(						\ | ||||
| 	"	.set push					\n"	\ | ||||
| 	"	.set dsp					\n"	\ | ||||
| 	"	rddsp	%0, %x1					\n"	\ | ||||
| 	"	.set pop					\n"	\ | ||||
| 	: "=r" (__dspctl)						\ | ||||
| 	: "i" (mask));							\ | ||||
| 	__dspctl;							\ | ||||
| @ -1175,30 +1178,198 @@ do {									\ | ||||
| #define wrdsp(val, mask)						\ | ||||
| do {									\ | ||||
| 	__asm__ __volatile__(						\ | ||||
| 	"	.set push					\n"	\ | ||||
| 	"	.set dsp					\n"	\ | ||||
| 	"	wrdsp	%0, %x1					\n"	\ | ||||
| 	"	.set pop					\n"	\ | ||||
| 	:								\ | ||||
| 	: "r" (val), "i" (mask));					\ | ||||
| } while (0) | ||||
| 
 | ||||
| #define mflo0() ({ long mflo0; __asm__("mflo %0, $ac0" : "=r" (mflo0)); mflo0;}) | ||||
| #define mflo1() ({ long mflo1; __asm__("mflo %0, $ac1" : "=r" (mflo1)); mflo1;}) | ||||
| #define mflo2() ({ long mflo2; __asm__("mflo %0, $ac2" : "=r" (mflo2)); mflo2;}) | ||||
| #define mflo3() ({ long mflo3; __asm__("mflo %0, $ac3" : "=r" (mflo3)); mflo3;}) | ||||
| #define mflo0()								\ | ||||
| ({									\ | ||||
| 	long mflo0;							\ | ||||
| 	__asm__(							\ | ||||
| 	"	.set push					\n"	\ | ||||
| 	"	.set dsp					\n"	\ | ||||
| 	"	mflo %0, $ac0					\n"	\ | ||||
| 	"	.set pop					\n" 	\ | ||||
| 	: "=r" (mflo0)); 						\ | ||||
| 	mflo0;								\ | ||||
| }) | ||||
| 
 | ||||
| #define mfhi0() ({ long mfhi0; __asm__("mfhi %0, $ac0" : "=r" (mfhi0)); mfhi0;}) | ||||
| #define mfhi1() ({ long mfhi1; __asm__("mfhi %0, $ac1" : "=r" (mfhi1)); mfhi1;}) | ||||
| #define mfhi2() ({ long mfhi2; __asm__("mfhi %0, $ac2" : "=r" (mfhi2)); mfhi2;}) | ||||
| #define mfhi3() ({ long mfhi3; __asm__("mfhi %0, $ac3" : "=r" (mfhi3)); mfhi3;}) | ||||
| #define mflo1()								\ | ||||
| ({									\ | ||||
| 	long mflo1;							\ | ||||
| 	__asm__(							\ | ||||
| 	"	.set push					\n"	\ | ||||
| 	"	.set dsp					\n"	\ | ||||
| 	"	mflo %0, $ac1					\n"	\ | ||||
| 	"	.set pop					\n" 	\ | ||||
| 	: "=r" (mflo1)); 						\ | ||||
| 	mflo1;								\ | ||||
| }) | ||||
| 
 | ||||
| #define mtlo0(x) __asm__("mtlo %0, $ac0" ::"r" (x)) | ||||
| #define mtlo1(x) __asm__("mtlo %0, $ac1" ::"r" (x)) | ||||
| #define mtlo2(x) __asm__("mtlo %0, $ac2" ::"r" (x)) | ||||
| #define mtlo3(x) __asm__("mtlo %0, $ac3" ::"r" (x)) | ||||
| #define mflo2()								\ | ||||
| ({									\ | ||||
| 	long mflo2;							\ | ||||
| 	__asm__(							\ | ||||
| 	"	.set push					\n"	\ | ||||
| 	"	.set dsp					\n"	\ | ||||
| 	"	mflo %0, $ac2					\n"	\ | ||||
| 	"	.set pop					\n" 	\ | ||||
| 	: "=r" (mflo2)); 						\ | ||||
| 	mflo2;								\ | ||||
| }) | ||||
| 
 | ||||
| #define mthi0(x) __asm__("mthi %0, $ac0" ::"r" (x)) | ||||
| #define mthi1(x) __asm__("mthi %0, $ac1" ::"r" (x)) | ||||
| #define mthi2(x) __asm__("mthi %0, $ac2" ::"r" (x)) | ||||
| #define mthi3(x) __asm__("mthi %0, $ac3" ::"r" (x)) | ||||
| #define mflo3()								\ | ||||
| ({									\ | ||||
| 	long mflo3;							\ | ||||
| 	__asm__(							\ | ||||
| 	"	.set push					\n"	\ | ||||
| 	"	.set dsp					\n"	\ | ||||
| 	"	mflo %0, $ac3					\n"	\ | ||||
| 	"	.set pop					\n" 	\ | ||||
| 	: "=r" (mflo3)); 						\ | ||||
| 	mflo3;								\ | ||||
| }) | ||||
| 
 | ||||
| #define mfhi0()								\ | ||||
| ({									\ | ||||
| 	long mfhi0;							\ | ||||
| 	__asm__(							\ | ||||
| 	"	.set push					\n"	\ | ||||
| 	"	.set dsp					\n"	\ | ||||
| 	"	mfhi %0, $ac0					\n"	\ | ||||
| 	"	.set pop					\n" 	\ | ||||
| 	: "=r" (mfhi0)); 						\ | ||||
| 	mfhi0;								\ | ||||
| }) | ||||
| 
 | ||||
| #define mfhi1()								\ | ||||
| ({									\ | ||||
| 	long mfhi1;							\ | ||||
| 	__asm__(							\ | ||||
| 	"	.set push					\n"	\ | ||||
| 	"	.set dsp					\n"	\ | ||||
| 	"	mfhi %0, $ac1					\n"	\ | ||||
| 	"	.set pop					\n" 	\ | ||||
| 	: "=r" (mfhi1)); 						\ | ||||
| 	mfhi1;								\ | ||||
| }) | ||||
| 
 | ||||
| #define mfhi2()								\ | ||||
| ({									\ | ||||
| 	long mfhi2;							\ | ||||
| 	__asm__(							\ | ||||
| 	"	.set push					\n"	\ | ||||
| 	"	.set dsp					\n"	\ | ||||
| 	"	mfhi %0, $ac2					\n"	\ | ||||
| 	"	.set pop					\n" 	\ | ||||
| 	: "=r" (mfhi2)); 						\ | ||||
| 	mfhi2;								\ | ||||
| }) | ||||
| 
 | ||||
| #define mfhi3()								\ | ||||
| ({									\ | ||||
| 	long mfhi3;							\ | ||||
| 	__asm__(							\ | ||||
| 	"	.set push					\n"	\ | ||||
| 	"	.set dsp					\n"	\ | ||||
| 	"	mfhi %0, $ac3					\n"	\ | ||||
| 	"	.set pop					\n" 	\ | ||||
| 	: "=r" (mfhi3)); 						\ | ||||
| 	mfhi3;								\ | ||||
| }) | ||||
| 
 | ||||
| 
 | ||||
| #define mtlo0(x)							\ | ||||
| ({									\ | ||||
| 	__asm__(							\ | ||||
| 	"	.set push					\n"	\ | ||||
| 	"	.set dsp					\n"	\ | ||||
| 	"	mtlo %0, $ac0					\n"	\ | ||||
| 	"	.set pop					\n"	\ | ||||
| 	:								\ | ||||
| 	: "r" (x));							\ | ||||
| }) | ||||
| 
 | ||||
| #define mtlo1(x)							\ | ||||
| ({									\ | ||||
| 	__asm__(							\ | ||||
| 	"	.set push					\n"	\ | ||||
| 	"	.set dsp					\n"	\ | ||||
| 	"	mtlo %0, $ac1					\n"	\ | ||||
| 	"	.set pop					\n"	\ | ||||
| 	:								\ | ||||
| 	: "r" (x));							\ | ||||
| }) | ||||
| 
 | ||||
| #define mtlo2(x)							\ | ||||
| ({									\ | ||||
| 	__asm__(							\ | ||||
| 	"	.set push					\n"	\ | ||||
| 	"	.set dsp					\n"	\ | ||||
| 	"	mtlo %0, $ac2					\n"	\ | ||||
| 	"	.set pop					\n"	\ | ||||
| 	:								\ | ||||
| 	: "r" (x));							\ | ||||
| }) | ||||
| 
 | ||||
| #define mtlo3(x)							\ | ||||
| ({									\ | ||||
| 	__asm__(							\ | ||||
| 	"	.set push					\n"	\ | ||||
| 	"	.set dsp					\n"	\ | ||||
| 	"	mtlo %0, $ac3					\n"	\ | ||||
| 	"	.set pop					\n"	\ | ||||
| 	:								\ | ||||
| 	: "r" (x));							\ | ||||
| }) | ||||
| 
 | ||||
| #define mthi0(x)							\ | ||||
| ({									\ | ||||
| 	__asm__(							\ | ||||
| 	"	.set push					\n"	\ | ||||
| 	"	.set dsp					\n"	\ | ||||
| 	"	mthi %0, $ac0					\n"	\ | ||||
| 	"	.set pop					\n"	\ | ||||
| 	:								\ | ||||
| 	: "r" (x));							\ | ||||
| }) | ||||
| 
 | ||||
| #define mthi1(x)							\ | ||||
| ({									\ | ||||
| 	__asm__(							\ | ||||
| 	"	.set push					\n"	\ | ||||
| 	"	.set dsp					\n"	\ | ||||
| 	"	mthi %0, $ac1					\n"	\ | ||||
| 	"	.set pop					\n"	\ | ||||
| 	:								\ | ||||
| 	: "r" (x));							\ | ||||
| }) | ||||
| 
 | ||||
| #define mthi2(x)							\ | ||||
| ({									\ | ||||
| 	__asm__(							\ | ||||
| 	"	.set push					\n"	\ | ||||
| 	"	.set dsp					\n"	\ | ||||
| 	"	mthi %0, $ac2					\n"	\ | ||||
| 	"	.set pop					\n"	\ | ||||
| 	:								\ | ||||
| 	: "r" (x));							\ | ||||
| }) | ||||
| 
 | ||||
| #define mthi3(x)							\ | ||||
| ({									\ | ||||
| 	__asm__(							\ | ||||
| 	"	.set push					\n"	\ | ||||
| 	"	.set dsp					\n"	\ | ||||
| 	"	mthi %0, $ac3					\n"	\ | ||||
| 	"	.set pop					\n"	\ | ||||
| 	:								\ | ||||
| 	: "r" (x));							\ | ||||
| }) | ||||
| 
 | ||||
| #else | ||||
| 
 | ||||
|  | ||||
| @ -21,6 +21,6 @@ | ||||
| #include <asm/sigcontext.h> | ||||
| #include <asm/siginfo.h> | ||||
| 
 | ||||
| #define __ARCH_HAS_ODD_SIGACTION | ||||
| #define __ARCH_HAS_IRIX_SIGACTION | ||||
| 
 | ||||
| #endif /* _ASM_SIGNAL_H */ | ||||
|  | ||||
| @ -100,29 +100,16 @@ obj-$(CONFIG_HW_PERF_EVENTS)	+= perf_event_mipsxx.o | ||||
| obj-$(CONFIG_JUMP_LABEL)	+= jump_label.o | ||||
| 
 | ||||
| #
 | ||||
| # DSP ASE supported for MIPS32 or MIPS64 Release 2 cores only. It is safe
 | ||||
| # to enable DSP assembler support here even if the MIPS Release 2 CPU we
 | ||||
| # are targetting does not support DSP because all code-paths making use of
 | ||||
| # it properly check that the running CPU *actually does* support these
 | ||||
| # instructions.
 | ||||
| # DSP ASE supported for MIPS32 or MIPS64 Release 2 cores only. It is not
 | ||||
| # safe to unconditionnaly use the assembler -mdsp / -mdspr2 switches
 | ||||
| # here because the compiler may use DSP ASE instructions (such as lwx) in
 | ||||
| # code paths where we cannot check that the CPU we are running on supports it.
 | ||||
| # Proper abstraction using HAVE_AS_DSP and macros is done in
 | ||||
| # arch/mips/include/asm/mipsregs.h.
 | ||||
| #
 | ||||
| ifeq ($(CONFIG_CPU_MIPSR2), y) | ||||
| CFLAGS_DSP 			= -DHAVE_AS_DSP | ||||
| 
 | ||||
| #
 | ||||
| # Check if assembler supports DSP ASE
 | ||||
| #
 | ||||
| ifeq ($(call cc-option-yn,-mdsp), y) | ||||
| CFLAGS_DSP			+= -mdsp | ||||
| endif | ||||
| 
 | ||||
| #
 | ||||
| # Check if assembler supports DSP ASE Rev2
 | ||||
| #
 | ||||
| ifeq ($(call cc-option-yn,-mdspr2), y) | ||||
| CFLAGS_DSP			+= -mdspr2 | ||||
| endif | ||||
| 
 | ||||
| CFLAGS_signal.o			= $(CFLAGS_DSP) | ||||
| CFLAGS_signal32.o		= $(CFLAGS_DSP) | ||||
| CFLAGS_process.o		= $(CFLAGS_DSP) | ||||
|  | ||||
| @ -580,6 +580,9 @@ static inline void cpu_probe_legacy(struct cpuinfo_mips *c, unsigned int cpu) | ||||
| 		c->tlbsize = 48; | ||||
| 		break; | ||||
| 	case PRID_IMP_VR41XX: | ||||
| 		set_isa(c, MIPS_CPU_ISA_III); | ||||
| 		c->options = R4K_OPTS; | ||||
| 		c->tlbsize = 32; | ||||
| 		switch (c->processor_id & 0xf0) { | ||||
| 		case PRID_REV_VR4111: | ||||
| 			c->cputype = CPU_VR4111; | ||||
| @ -604,6 +607,7 @@ static inline void cpu_probe_legacy(struct cpuinfo_mips *c, unsigned int cpu) | ||||
| 				__cpu_name[cpu] = "NEC VR4131"; | ||||
| 			} else { | ||||
| 				c->cputype = CPU_VR4133; | ||||
| 				c->options |= MIPS_CPU_LLSC; | ||||
| 				__cpu_name[cpu] = "NEC VR4133"; | ||||
| 			} | ||||
| 			break; | ||||
| @ -613,9 +617,6 @@ static inline void cpu_probe_legacy(struct cpuinfo_mips *c, unsigned int cpu) | ||||
| 			__cpu_name[cpu] = "NEC Vr41xx"; | ||||
| 			break; | ||||
| 		} | ||||
| 		set_isa(c, MIPS_CPU_ISA_III); | ||||
| 		c->options = R4K_OPTS; | ||||
| 		c->tlbsize = 32; | ||||
| 		break; | ||||
| 	case PRID_IMP_R4300: | ||||
| 		c->cputype = CPU_R4300; | ||||
|  | ||||
| @ -171,7 +171,7 @@ SYSCALL_DEFINE6(32_ipc, u32, call, long, first, long, second, long, third, | ||||
| 		err = compat_sys_shmctl(first, second, compat_ptr(ptr)); | ||||
| 		break; | ||||
| 	default: | ||||
| 		err = -EINVAL; | ||||
| 		err = -ENOSYS; | ||||
| 		break; | ||||
| 	} | ||||
| 
 | ||||
|  | ||||
| @ -67,7 +67,7 @@ static int show_cpuinfo(struct seq_file *m, void *v) | ||||
| 	if (cpu_has_mips_r) { | ||||
| 		seq_printf(m, "isa\t\t\t:"); | ||||
| 		if (cpu_has_mips_1) | ||||
| 			seq_printf(m, "%s", "mips1"); | ||||
| 			seq_printf(m, "%s", " mips1"); | ||||
| 		if (cpu_has_mips_2) | ||||
| 			seq_printf(m, "%s", " mips2"); | ||||
| 		if (cpu_has_mips_3) | ||||
|  | ||||
| @ -90,12 +90,12 @@ int __mips_test_and_set_bit(unsigned long nr, | ||||
| 	unsigned bit = nr & SZLONG_MASK; | ||||
| 	unsigned long mask; | ||||
| 	unsigned long flags; | ||||
| 	unsigned long res; | ||||
| 	int res; | ||||
| 
 | ||||
| 	a += nr >> SZLONG_LOG; | ||||
| 	mask = 1UL << bit; | ||||
| 	raw_local_irq_save(flags); | ||||
| 	res = (mask & *a); | ||||
| 	res = (mask & *a) != 0; | ||||
| 	*a |= mask; | ||||
| 	raw_local_irq_restore(flags); | ||||
| 	return res; | ||||
| @ -116,12 +116,12 @@ int __mips_test_and_set_bit_lock(unsigned long nr, | ||||
| 	unsigned bit = nr & SZLONG_MASK; | ||||
| 	unsigned long mask; | ||||
| 	unsigned long flags; | ||||
| 	unsigned long res; | ||||
| 	int res; | ||||
| 
 | ||||
| 	a += nr >> SZLONG_LOG; | ||||
| 	mask = 1UL << bit; | ||||
| 	raw_local_irq_save(flags); | ||||
| 	res = (mask & *a); | ||||
| 	res = (mask & *a) != 0; | ||||
| 	*a |= mask; | ||||
| 	raw_local_irq_restore(flags); | ||||
| 	return res; | ||||
| @ -141,12 +141,12 @@ int __mips_test_and_clear_bit(unsigned long nr, volatile unsigned long *addr) | ||||
| 	unsigned bit = nr & SZLONG_MASK; | ||||
| 	unsigned long mask; | ||||
| 	unsigned long flags; | ||||
| 	unsigned long res; | ||||
| 	int res; | ||||
| 
 | ||||
| 	a += nr >> SZLONG_LOG; | ||||
| 	mask = 1UL << bit; | ||||
| 	raw_local_irq_save(flags); | ||||
| 	res = (mask & *a); | ||||
| 	res = (mask & *a) != 0; | ||||
| 	*a &= ~mask; | ||||
| 	raw_local_irq_restore(flags); | ||||
| 	return res; | ||||
| @ -166,12 +166,12 @@ int __mips_test_and_change_bit(unsigned long nr, volatile unsigned long *addr) | ||||
| 	unsigned bit = nr & SZLONG_MASK; | ||||
| 	unsigned long mask; | ||||
| 	unsigned long flags; | ||||
| 	unsigned long res; | ||||
| 	int res; | ||||
| 
 | ||||
| 	a += nr >> SZLONG_LOG; | ||||
| 	mask = 1UL << bit; | ||||
| 	raw_local_irq_save(flags); | ||||
| 	res = (mask & *a); | ||||
| 	res = (mask & *a) != 0; | ||||
| 	*a ^= mask; | ||||
| 	raw_local_irq_restore(flags); | ||||
| 	return res; | ||||
|  | ||||
| @ -270,7 +270,7 @@ LEAF(csum_partial) | ||||
| #endif | ||||
| 
 | ||||
| 	/* odd buffer alignment? */ | ||||
| #ifdef CPU_MIPSR2 | ||||
| #ifdef CONFIG_CPU_MIPSR2 | ||||
| 	wsbh	v1, sum | ||||
| 	movn	sum, v1, t7 | ||||
| #else | ||||
| @ -670,7 +670,7 @@ EXC(	sb	t0, NBYTES-2(dst), .Ls_exc) | ||||
| 	addu	sum, v1 | ||||
| #endif | ||||
| 
 | ||||
| #ifdef CPU_MIPSR2 | ||||
| #ifdef CONFIG_CPU_MIPSR2 | ||||
| 	wsbh	v1, sum | ||||
| 	movn	sum, v1, odd | ||||
| #else | ||||
|  | ||||
| @ -398,7 +398,7 @@ static int regcache_rbtree_sync(struct regmap *map, unsigned int min, | ||||
| 			base = 0; | ||||
| 
 | ||||
| 		if (max < rbnode->base_reg + rbnode->blklen) | ||||
| 			end = rbnode->base_reg + rbnode->blklen - max; | ||||
| 			end = max - rbnode->base_reg + 1; | ||||
| 		else | ||||
| 			end = rbnode->blklen; | ||||
| 
 | ||||
|  | ||||
| @ -710,12 +710,12 @@ skip_format_initialization: | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	regmap_debugfs_init(map, config->name); | ||||
| 
 | ||||
| 	ret = regcache_init(map, config); | ||||
| 	if (ret != 0) | ||||
| 		goto err_range; | ||||
| 
 | ||||
| 	regmap_debugfs_init(map, config->name); | ||||
| 
 | ||||
| 	/* Add a devres resource for dev_get_regmap() */ | ||||
| 	m = devres_alloc(dev_get_regmap_release, sizeof(*m), GFP_KERNEL); | ||||
| 	if (!m) { | ||||
| @ -943,8 +943,7 @@ static int _regmap_raw_write(struct regmap *map, unsigned int reg, | ||||
| 		unsigned int ival; | ||||
| 		int val_bytes = map->format.val_bytes; | ||||
| 		for (i = 0; i < val_len / val_bytes; i++) { | ||||
| 			memcpy(map->work_buf, val + (i * val_bytes), val_bytes); | ||||
| 			ival = map->format.parse_val(map->work_buf); | ||||
| 			ival = map->format.parse_val(val + (i * val_bytes)); | ||||
| 			ret = regcache_write(map, reg + (i * map->reg_stride), | ||||
| 					     ival); | ||||
| 			if (ret) { | ||||
| @ -1036,6 +1035,8 @@ static int _regmap_raw_write(struct regmap *map, unsigned int reg, | ||||
| 			kfree(async->work_buf); | ||||
| 			kfree(async); | ||||
| 		} | ||||
| 
 | ||||
| 		return ret; | ||||
| 	} | ||||
| 
 | ||||
| 	trace_regmap_hw_write_start(map->dev, reg, | ||||
|  | ||||
| @ -922,6 +922,11 @@ static int loop_set_fd(struct loop_device *lo, fmode_t mode, | ||||
| 		lo->lo_flags |= LO_FLAGS_PARTSCAN; | ||||
| 	if (lo->lo_flags & LO_FLAGS_PARTSCAN) | ||||
| 		ioctl_by_bdev(bdev, BLKRRPART, 0); | ||||
| 
 | ||||
| 	/* Grab the block_device to prevent its destruction after we
 | ||||
| 	 * put /dev/loopXX inode. Later in loop_clr_fd() we bdput(bdev). | ||||
| 	 */ | ||||
| 	bdgrab(bdev); | ||||
| 	return 0; | ||||
| 
 | ||||
| out_clr: | ||||
| @ -1031,8 +1036,10 @@ static int loop_clr_fd(struct loop_device *lo) | ||||
| 	memset(lo->lo_encrypt_key, 0, LO_KEY_SIZE); | ||||
| 	memset(lo->lo_crypt_name, 0, LO_NAME_SIZE); | ||||
| 	memset(lo->lo_file_name, 0, LO_NAME_SIZE); | ||||
| 	if (bdev) | ||||
| 	if (bdev) { | ||||
| 		bdput(bdev); | ||||
| 		invalidate_bdev(bdev); | ||||
| 	} | ||||
| 	set_capacity(lo->lo_disk, 0); | ||||
| 	loop_sysfs_exit(lo); | ||||
| 	if (bdev) { | ||||
|  | ||||
| @ -380,6 +380,15 @@ void hwrng_unregister(struct hwrng *rng) | ||||
| } | ||||
| EXPORT_SYMBOL_GPL(hwrng_unregister); | ||||
| 
 | ||||
| static void __exit hwrng_exit(void) | ||||
| { | ||||
| 	mutex_lock(&rng_mutex); | ||||
| 	BUG_ON(current_rng); | ||||
| 	kfree(rng_buffer); | ||||
| 	mutex_unlock(&rng_mutex); | ||||
| } | ||||
| 
 | ||||
| module_exit(hwrng_exit); | ||||
| 
 | ||||
| MODULE_DESCRIPTION("H/W Random Number Generator (RNG) driver"); | ||||
| MODULE_LICENSE("GPL"); | ||||
|  | ||||
| @ -149,7 +149,8 @@ struct ports_device { | ||||
| 	spinlock_t ports_lock; | ||||
| 
 | ||||
| 	/* To protect the vq operations for the control channel */ | ||||
| 	spinlock_t cvq_lock; | ||||
| 	spinlock_t c_ivq_lock; | ||||
| 	spinlock_t c_ovq_lock; | ||||
| 
 | ||||
| 	/* The current config space is stored here */ | ||||
| 	struct virtio_console_config config; | ||||
| @ -569,11 +570,14 @@ static ssize_t __send_control_msg(struct ports_device *portdev, u32 port_id, | ||||
| 	vq = portdev->c_ovq; | ||||
| 
 | ||||
| 	sg_init_one(sg, &cpkt, sizeof(cpkt)); | ||||
| 
 | ||||
| 	spin_lock(&portdev->c_ovq_lock); | ||||
| 	if (virtqueue_add_buf(vq, sg, 1, 0, &cpkt, GFP_ATOMIC) == 0) { | ||||
| 		virtqueue_kick(vq); | ||||
| 		while (!virtqueue_get_buf(vq, &len)) | ||||
| 			cpu_relax(); | ||||
| 	} | ||||
| 	spin_unlock(&portdev->c_ovq_lock); | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| @ -1436,7 +1440,7 @@ static int add_port(struct ports_device *portdev, u32 id) | ||||
| 		 * rproc_serial does not want the console port, only | ||||
| 		 * the generic port implementation. | ||||
| 		 */ | ||||
| 		port->host_connected = port->guest_connected = true; | ||||
| 		port->host_connected = true; | ||||
| 	else if (!use_multiport(port->portdev)) { | ||||
| 		/*
 | ||||
| 		 * If we're not using multiport support, | ||||
| @ -1709,23 +1713,23 @@ static void control_work_handler(struct work_struct *work) | ||||
| 	portdev = container_of(work, struct ports_device, control_work); | ||||
| 	vq = portdev->c_ivq; | ||||
| 
 | ||||
| 	spin_lock(&portdev->cvq_lock); | ||||
| 	spin_lock(&portdev->c_ivq_lock); | ||||
| 	while ((buf = virtqueue_get_buf(vq, &len))) { | ||||
| 		spin_unlock(&portdev->cvq_lock); | ||||
| 		spin_unlock(&portdev->c_ivq_lock); | ||||
| 
 | ||||
| 		buf->len = len; | ||||
| 		buf->offset = 0; | ||||
| 
 | ||||
| 		handle_control_message(portdev, buf); | ||||
| 
 | ||||
| 		spin_lock(&portdev->cvq_lock); | ||||
| 		spin_lock(&portdev->c_ivq_lock); | ||||
| 		if (add_inbuf(portdev->c_ivq, buf) < 0) { | ||||
| 			dev_warn(&portdev->vdev->dev, | ||||
| 				 "Error adding buffer to queue\n"); | ||||
| 			free_buf(buf, false); | ||||
| 		} | ||||
| 	} | ||||
| 	spin_unlock(&portdev->cvq_lock); | ||||
| 	spin_unlock(&portdev->c_ivq_lock); | ||||
| } | ||||
| 
 | ||||
| static void out_intr(struct virtqueue *vq) | ||||
| @ -1752,13 +1756,23 @@ static void in_intr(struct virtqueue *vq) | ||||
| 	port->inbuf = get_inbuf(port); | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * Don't queue up data when port is closed.  This condition | ||||
| 	 * Normally the port should not accept data when the port is | ||||
| 	 * closed. For generic serial ports, the host won't (shouldn't) | ||||
| 	 * send data till the guest is connected. But this condition | ||||
| 	 * can be reached when a console port is not yet connected (no | ||||
| 	 * tty is spawned) and the host sends out data to console | ||||
| 	 * ports.  For generic serial ports, the host won't | ||||
| 	 * (shouldn't) send data till the guest is connected. | ||||
| 	 * tty is spawned) and the other side sends out data over the | ||||
| 	 * vring, or when a remote devices start sending data before | ||||
| 	 * the ports are opened. | ||||
| 	 * | ||||
| 	 * A generic serial port will discard data if not connected, | ||||
| 	 * while console ports and rproc-serial ports accepts data at | ||||
| 	 * any time. rproc-serial is initiated with guest_connected to | ||||
| 	 * false because port_fops_open expects this. Console ports are | ||||
| 	 * hooked up with an HVC console and is initialized with | ||||
| 	 * guest_connected to true. | ||||
| 	 */ | ||||
| 	if (!port->guest_connected) | ||||
| 
 | ||||
| 	if (!port->guest_connected && !is_rproc_serial(port->portdev->vdev)) | ||||
| 		discard_port_data(port); | ||||
| 
 | ||||
| 	spin_unlock_irqrestore(&port->inbuf_lock, flags); | ||||
| @ -1986,10 +2000,12 @@ static int virtcons_probe(struct virtio_device *vdev) | ||||
| 	if (multiport) { | ||||
| 		unsigned int nr_added_bufs; | ||||
| 
 | ||||
| 		spin_lock_init(&portdev->cvq_lock); | ||||
| 		spin_lock_init(&portdev->c_ivq_lock); | ||||
| 		spin_lock_init(&portdev->c_ovq_lock); | ||||
| 		INIT_WORK(&portdev->control_work, &control_work_handler); | ||||
| 
 | ||||
| 		nr_added_bufs = fill_queue(portdev->c_ivq, &portdev->cvq_lock); | ||||
| 		nr_added_bufs = fill_queue(portdev->c_ivq, | ||||
| 					   &portdev->c_ivq_lock); | ||||
| 		if (!nr_added_bufs) { | ||||
| 			dev_err(&vdev->dev, | ||||
| 				"Error allocating buffers for control queue\n"); | ||||
| @ -2140,7 +2156,7 @@ static int virtcons_restore(struct virtio_device *vdev) | ||||
| 		return ret; | ||||
| 
 | ||||
| 	if (use_multiport(portdev)) | ||||
| 		fill_queue(portdev->c_ivq, &portdev->cvq_lock); | ||||
| 		fill_queue(portdev->c_ivq, &portdev->c_ivq_lock); | ||||
| 
 | ||||
| 	list_for_each_entry(port, &portdev->ports, list) { | ||||
| 		port->in_vq = portdev->in_vqs[port->id]; | ||||
|  | ||||
| @ -703,7 +703,7 @@ static void tegra20_pll_init(void) | ||||
| 	clks[pll_a_out0] = clk; | ||||
| 
 | ||||
| 	/* PLLE */ | ||||
| 	clk = tegra_clk_register_plle("pll_e", "pll_ref", clk_base, NULL, | ||||
| 	clk = tegra_clk_register_plle("pll_e", "pll_ref", clk_base, pmc_base, | ||||
| 			     0, 100000000, &pll_e_params, | ||||
| 			     0, pll_e_freq_table, NULL); | ||||
| 	clk_register_clkdev(clk, "pll_e", NULL); | ||||
|  | ||||
| @ -2326,7 +2326,6 @@ int drm_mode_addfb(struct drm_device *dev, | ||||
| 	fb = dev->mode_config.funcs->fb_create(dev, file_priv, &r); | ||||
| 	if (IS_ERR(fb)) { | ||||
| 		DRM_DEBUG_KMS("could not create framebuffer\n"); | ||||
| 		drm_modeset_unlock_all(dev); | ||||
| 		return PTR_ERR(fb); | ||||
| 	} | ||||
| 
 | ||||
| @ -2506,7 +2505,6 @@ int drm_mode_addfb2(struct drm_device *dev, | ||||
| 	fb = dev->mode_config.funcs->fb_create(dev, file_priv, r); | ||||
| 	if (IS_ERR(fb)) { | ||||
| 		DRM_DEBUG_KMS("could not create framebuffer\n"); | ||||
| 		drm_modeset_unlock_all(dev); | ||||
| 		return PTR_ERR(fb); | ||||
| 	} | ||||
| 
 | ||||
|  | ||||
| @ -123,6 +123,7 @@ int drm_open(struct inode *inode, struct file *filp) | ||||
| 	int retcode = 0; | ||||
| 	int need_setup = 0; | ||||
| 	struct address_space *old_mapping; | ||||
| 	struct address_space *old_imapping; | ||||
| 
 | ||||
| 	minor = idr_find(&drm_minors_idr, minor_id); | ||||
| 	if (!minor) | ||||
| @ -137,6 +138,7 @@ int drm_open(struct inode *inode, struct file *filp) | ||||
| 	if (!dev->open_count++) | ||||
| 		need_setup = 1; | ||||
| 	mutex_lock(&dev->struct_mutex); | ||||
| 	old_imapping = inode->i_mapping; | ||||
| 	old_mapping = dev->dev_mapping; | ||||
| 	if (old_mapping == NULL) | ||||
| 		dev->dev_mapping = &inode->i_data; | ||||
| @ -159,8 +161,8 @@ int drm_open(struct inode *inode, struct file *filp) | ||||
| 
 | ||||
| err_undo: | ||||
| 	mutex_lock(&dev->struct_mutex); | ||||
| 	filp->f_mapping = old_mapping; | ||||
| 	inode->i_mapping = old_mapping; | ||||
| 	filp->f_mapping = old_imapping; | ||||
| 	inode->i_mapping = old_imapping; | ||||
| 	iput(container_of(dev->dev_mapping, struct inode, i_data)); | ||||
| 	dev->dev_mapping = old_mapping; | ||||
| 	mutex_unlock(&dev->struct_mutex); | ||||
|  | ||||
| @ -57,7 +57,7 @@ eb_create(struct drm_i915_gem_execbuffer2 *args) | ||||
| 	if (eb == NULL) { | ||||
| 		int size = args->buffer_count; | ||||
| 		int count = PAGE_SIZE / sizeof(struct hlist_head) / 2; | ||||
| 		BUILD_BUG_ON(!is_power_of_2(PAGE_SIZE / sizeof(struct hlist_head))); | ||||
| 		BUILD_BUG_ON_NOT_POWER_OF_2(PAGE_SIZE / sizeof(struct hlist_head)); | ||||
| 		while (count > 2*size) | ||||
| 			count >>= 1; | ||||
| 		eb = kzalloc(count*sizeof(struct hlist_head) + | ||||
|  | ||||
| @ -45,6 +45,9 @@ | ||||
| 
 | ||||
| struct intel_crt { | ||||
| 	struct intel_encoder base; | ||||
| 	/* DPMS state is stored in the connector, which we need in the
 | ||||
| 	 * encoder's enable/disable callbacks */ | ||||
| 	struct intel_connector *connector; | ||||
| 	bool force_hotplug_required; | ||||
| 	u32 adpa_reg; | ||||
| }; | ||||
| @ -81,29 +84,6 @@ static bool intel_crt_get_hw_state(struct intel_encoder *encoder, | ||||
| 	return true; | ||||
| } | ||||
| 
 | ||||
| static void intel_disable_crt(struct intel_encoder *encoder) | ||||
| { | ||||
| 	struct drm_i915_private *dev_priv = encoder->base.dev->dev_private; | ||||
| 	struct intel_crt *crt = intel_encoder_to_crt(encoder); | ||||
| 	u32 temp; | ||||
| 
 | ||||
| 	temp = I915_READ(crt->adpa_reg); | ||||
| 	temp |= ADPA_HSYNC_CNTL_DISABLE | ADPA_VSYNC_CNTL_DISABLE; | ||||
| 	temp &= ~ADPA_DAC_ENABLE; | ||||
| 	I915_WRITE(crt->adpa_reg, temp); | ||||
| } | ||||
| 
 | ||||
| static void intel_enable_crt(struct intel_encoder *encoder) | ||||
| { | ||||
| 	struct drm_i915_private *dev_priv = encoder->base.dev->dev_private; | ||||
| 	struct intel_crt *crt = intel_encoder_to_crt(encoder); | ||||
| 	u32 temp; | ||||
| 
 | ||||
| 	temp = I915_READ(crt->adpa_reg); | ||||
| 	temp |= ADPA_DAC_ENABLE; | ||||
| 	I915_WRITE(crt->adpa_reg, temp); | ||||
| } | ||||
| 
 | ||||
| /* Note: The caller is required to filter out dpms modes not supported by the
 | ||||
|  * platform. */ | ||||
| static void intel_crt_set_dpms(struct intel_encoder *encoder, int mode) | ||||
| @ -135,6 +115,19 @@ static void intel_crt_set_dpms(struct intel_encoder *encoder, int mode) | ||||
| 	I915_WRITE(crt->adpa_reg, temp); | ||||
| } | ||||
| 
 | ||||
| static void intel_disable_crt(struct intel_encoder *encoder) | ||||
| { | ||||
| 	intel_crt_set_dpms(encoder, DRM_MODE_DPMS_OFF); | ||||
| } | ||||
| 
 | ||||
| static void intel_enable_crt(struct intel_encoder *encoder) | ||||
| { | ||||
| 	struct intel_crt *crt = intel_encoder_to_crt(encoder); | ||||
| 
 | ||||
| 	intel_crt_set_dpms(encoder, crt->connector->base.dpms); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| static void intel_crt_dpms(struct drm_connector *connector, int mode) | ||||
| { | ||||
| 	struct drm_device *dev = connector->dev; | ||||
| @ -746,6 +739,7 @@ void intel_crt_init(struct drm_device *dev) | ||||
| 	} | ||||
| 
 | ||||
| 	connector = &intel_connector->base; | ||||
| 	crt->connector = intel_connector; | ||||
| 	drm_connector_init(dev, &intel_connector->base, | ||||
| 			   &intel_crt_connector_funcs, DRM_MODE_CONNECTOR_VGA); | ||||
| 
 | ||||
|  | ||||
| @ -2559,12 +2559,15 @@ void intel_dp_encoder_destroy(struct drm_encoder *encoder) | ||||
| { | ||||
| 	struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder); | ||||
| 	struct intel_dp *intel_dp = &intel_dig_port->dp; | ||||
| 	struct drm_device *dev = intel_dp_to_dev(intel_dp); | ||||
| 
 | ||||
| 	i2c_del_adapter(&intel_dp->adapter); | ||||
| 	drm_encoder_cleanup(encoder); | ||||
| 	if (is_edp(intel_dp)) { | ||||
| 		cancel_delayed_work_sync(&intel_dp->panel_vdd_work); | ||||
| 		mutex_lock(&dev->mode_config.mutex); | ||||
| 		ironlake_panel_vdd_off_sync(intel_dp); | ||||
| 		mutex_unlock(&dev->mode_config.mutex); | ||||
| 	} | ||||
| 	kfree(intel_dig_port); | ||||
| } | ||||
|  | ||||
| @ -391,7 +391,7 @@ nouveau_abi16_ioctl_notifierobj_alloc(ABI16_IOCTL_ARGS) | ||||
| 	struct nouveau_drm *drm = nouveau_drm(dev); | ||||
| 	struct nouveau_device *device = nv_device(drm->device); | ||||
| 	struct nouveau_abi16 *abi16 = nouveau_abi16_get(file_priv, dev); | ||||
| 	struct nouveau_abi16_chan *chan, *temp; | ||||
| 	struct nouveau_abi16_chan *chan = NULL, *temp; | ||||
| 	struct nouveau_abi16_ntfy *ntfy; | ||||
| 	struct nouveau_object *object; | ||||
| 	struct nv_dma_class args = {}; | ||||
| @ -404,10 +404,11 @@ nouveau_abi16_ioctl_notifierobj_alloc(ABI16_IOCTL_ARGS) | ||||
| 	if (unlikely(nv_device(abi16->device)->card_type >= NV_C0)) | ||||
| 		return nouveau_abi16_put(abi16, -EINVAL); | ||||
| 
 | ||||
| 	list_for_each_entry_safe(chan, temp, &abi16->channels, head) { | ||||
| 		if (chan->chan->handle == (NVDRM_CHAN | info->channel)) | ||||
| 	list_for_each_entry(temp, &abi16->channels, head) { | ||||
| 		if (temp->chan->handle == (NVDRM_CHAN | info->channel)) { | ||||
| 			chan = temp; | ||||
| 			break; | ||||
| 		chan = NULL; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	if (!chan) | ||||
| @ -459,17 +460,18 @@ nouveau_abi16_ioctl_gpuobj_free(ABI16_IOCTL_ARGS) | ||||
| { | ||||
| 	struct drm_nouveau_gpuobj_free *fini = data; | ||||
| 	struct nouveau_abi16 *abi16 = nouveau_abi16_get(file_priv, dev); | ||||
| 	struct nouveau_abi16_chan *chan, *temp; | ||||
| 	struct nouveau_abi16_chan *chan = NULL, *temp; | ||||
| 	struct nouveau_abi16_ntfy *ntfy; | ||||
| 	int ret; | ||||
| 
 | ||||
| 	if (unlikely(!abi16)) | ||||
| 		return -ENOMEM; | ||||
| 
 | ||||
| 	list_for_each_entry_safe(chan, temp, &abi16->channels, head) { | ||||
| 		if (chan->chan->handle == (NVDRM_CHAN | fini->channel)) | ||||
| 	list_for_each_entry(temp, &abi16->channels, head) { | ||||
| 		if (temp->chan->handle == (NVDRM_CHAN | fini->channel)) { | ||||
| 			chan = temp; | ||||
| 			break; | ||||
| 		chan = NULL; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	if (!chan) | ||||
|  | ||||
| @ -71,12 +71,26 @@ module_param_named(modeset, nouveau_modeset, int, 0400); | ||||
| 
 | ||||
| static struct drm_driver driver; | ||||
| 
 | ||||
| static int | ||||
| nouveau_drm_vblank_handler(struct nouveau_eventh *event, int head) | ||||
| { | ||||
| 	struct nouveau_drm *drm = | ||||
| 		container_of(event, struct nouveau_drm, vblank[head]); | ||||
| 	drm_handle_vblank(drm->dev, head); | ||||
| 	return NVKM_EVENT_KEEP; | ||||
| } | ||||
| 
 | ||||
| static int | ||||
| nouveau_drm_vblank_enable(struct drm_device *dev, int head) | ||||
| { | ||||
| 	struct nouveau_drm *drm = nouveau_drm(dev); | ||||
| 	struct nouveau_disp *pdisp = nouveau_disp(drm->device); | ||||
| 	nouveau_event_get(pdisp->vblank, head, &drm->vblank); | ||||
| 
 | ||||
| 	if (WARN_ON_ONCE(head > ARRAY_SIZE(drm->vblank))) | ||||
| 		return -EIO; | ||||
| 	WARN_ON_ONCE(drm->vblank[head].func); | ||||
| 	drm->vblank[head].func = nouveau_drm_vblank_handler; | ||||
| 	nouveau_event_get(pdisp->vblank, head, &drm->vblank[head]); | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| @ -85,16 +99,11 @@ nouveau_drm_vblank_disable(struct drm_device *dev, int head) | ||||
| { | ||||
| 	struct nouveau_drm *drm = nouveau_drm(dev); | ||||
| 	struct nouveau_disp *pdisp = nouveau_disp(drm->device); | ||||
| 	nouveau_event_put(pdisp->vblank, head, &drm->vblank); | ||||
| } | ||||
| 
 | ||||
| static int | ||||
| nouveau_drm_vblank_handler(struct nouveau_eventh *event, int head) | ||||
| { | ||||
| 	struct nouveau_drm *drm = | ||||
| 		container_of(event, struct nouveau_drm, vblank); | ||||
| 	drm_handle_vblank(drm->dev, head); | ||||
| 	return NVKM_EVENT_KEEP; | ||||
| 	if (drm->vblank[head].func) | ||||
| 		nouveau_event_put(pdisp->vblank, head, &drm->vblank[head]); | ||||
| 	else | ||||
| 		WARN_ON_ONCE(1); | ||||
| 	drm->vblank[head].func = NULL; | ||||
| } | ||||
| 
 | ||||
| static u64 | ||||
| @ -292,7 +301,6 @@ nouveau_drm_load(struct drm_device *dev, unsigned long flags) | ||||
| 
 | ||||
| 	dev->dev_private = drm; | ||||
| 	drm->dev = dev; | ||||
| 	drm->vblank.func = nouveau_drm_vblank_handler; | ||||
| 
 | ||||
| 	INIT_LIST_HEAD(&drm->clients); | ||||
| 	spin_lock_init(&drm->tile.lock); | ||||
|  | ||||
| @ -113,7 +113,7 @@ struct nouveau_drm { | ||||
| 	struct nvbios vbios; | ||||
| 	struct nouveau_display *display; | ||||
| 	struct backlight_device *backlight; | ||||
| 	struct nouveau_eventh vblank; | ||||
| 	struct nouveau_eventh vblank[4]; | ||||
| 
 | ||||
| 	/* power management */ | ||||
| 	struct nouveau_pm *pm; | ||||
|  | ||||
| @ -1975,12 +1975,11 @@ static int __bond_release_one(struct net_device *bond_dev, | ||||
| 		return -EINVAL; | ||||
| 	} | ||||
| 
 | ||||
| 	write_unlock_bh(&bond->lock); | ||||
| 	/* unregister rx_handler early so bond_handle_frame wouldn't be called
 | ||||
| 	 * for this slave anymore. | ||||
| 	 */ | ||||
| 	netdev_rx_handler_unregister(slave_dev); | ||||
| 	write_unlock_bh(&bond->lock); | ||||
| 	synchronize_net(); | ||||
| 	write_lock_bh(&bond->lock); | ||||
| 
 | ||||
| 	if (!all && !bond->params.fail_over_mac) { | ||||
|  | ||||
| @ -411,8 +411,8 @@ static int mlx4_en_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid) | ||||
| 
 | ||||
| static void mlx4_en_u64_to_mac(unsigned char dst_mac[ETH_ALEN + 2], u64 src_mac) | ||||
| { | ||||
| 	unsigned int i; | ||||
| 	for (i = ETH_ALEN - 1; i; --i) { | ||||
| 	int i; | ||||
| 	for (i = ETH_ALEN - 1; i >= 0; --i) { | ||||
| 		dst_mac[i] = src_mac & 0xff; | ||||
| 		src_mac >>= 8; | ||||
| 	} | ||||
|  | ||||
| @ -940,6 +940,7 @@ static int bnx2fc_libfc_config(struct fc_lport *lport) | ||||
| 	fc_exch_init(lport); | ||||
| 	fc_rport_init(lport); | ||||
| 	fc_disc_init(lport); | ||||
| 	fc_disc_config(lport, lport); | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| @ -2133,6 +2134,7 @@ static int _bnx2fc_create(struct net_device *netdev, | ||||
| 	} | ||||
| 
 | ||||
| 	ctlr = bnx2fc_to_ctlr(interface); | ||||
| 	cdev = fcoe_ctlr_to_ctlr_dev(ctlr); | ||||
| 	interface->vlan_id = vlan_id; | ||||
| 
 | ||||
| 	interface->timer_work_queue = | ||||
| @ -2143,7 +2145,7 @@ static int _bnx2fc_create(struct net_device *netdev, | ||||
| 		goto ifput_err; | ||||
| 	} | ||||
| 
 | ||||
| 	lport = bnx2fc_if_create(interface, &interface->hba->pcidev->dev, 0); | ||||
| 	lport = bnx2fc_if_create(interface, &cdev->dev, 0); | ||||
| 	if (!lport) { | ||||
| 		printk(KERN_ERR PFX "Failed to create interface (%s)\n", | ||||
| 			netdev->name); | ||||
| @ -2159,8 +2161,6 @@ static int _bnx2fc_create(struct net_device *netdev, | ||||
| 	/* Make this master N_port */ | ||||
| 	ctlr->lp = lport; | ||||
| 
 | ||||
| 	cdev = fcoe_ctlr_to_ctlr_dev(ctlr); | ||||
| 
 | ||||
| 	if (link_state == BNX2FC_CREATE_LINK_UP) | ||||
| 		cdev->enabled = FCOE_CTLR_ENABLED; | ||||
| 	else | ||||
|  | ||||
| @ -490,7 +490,6 @@ static void fcoe_interface_cleanup(struct fcoe_interface *fcoe) | ||||
| { | ||||
| 	struct net_device *netdev = fcoe->netdev; | ||||
| 	struct fcoe_ctlr *fip = fcoe_to_ctlr(fcoe); | ||||
| 	struct fcoe_ctlr_device *ctlr_dev = fcoe_ctlr_to_ctlr_dev(fip); | ||||
| 
 | ||||
| 	rtnl_lock(); | ||||
| 	if (!fcoe->removed) | ||||
| @ -501,7 +500,6 @@ static void fcoe_interface_cleanup(struct fcoe_interface *fcoe) | ||||
| 	/* tear-down the FCoE controller */ | ||||
| 	fcoe_ctlr_destroy(fip); | ||||
| 	scsi_host_put(fip->lp->host); | ||||
| 	fcoe_ctlr_device_delete(ctlr_dev); | ||||
| 	dev_put(netdev); | ||||
| 	module_put(THIS_MODULE); | ||||
| } | ||||
| @ -2194,6 +2192,8 @@ out_nodev: | ||||
|  */ | ||||
| static void fcoe_destroy_work(struct work_struct *work) | ||||
| { | ||||
| 	struct fcoe_ctlr_device *cdev; | ||||
| 	struct fcoe_ctlr *ctlr; | ||||
| 	struct fcoe_port *port; | ||||
| 	struct fcoe_interface *fcoe; | ||||
| 	struct Scsi_Host *shost; | ||||
| @ -2224,10 +2224,15 @@ static void fcoe_destroy_work(struct work_struct *work) | ||||
| 	mutex_lock(&fcoe_config_mutex); | ||||
| 
 | ||||
| 	fcoe = port->priv; | ||||
| 	ctlr = fcoe_to_ctlr(fcoe); | ||||
| 	cdev = fcoe_ctlr_to_ctlr_dev(ctlr); | ||||
| 
 | ||||
| 	fcoe_if_destroy(port->lport); | ||||
| 	fcoe_interface_cleanup(fcoe); | ||||
| 
 | ||||
| 	mutex_unlock(&fcoe_config_mutex); | ||||
| 
 | ||||
| 	fcoe_ctlr_device_delete(cdev); | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
| @ -2335,7 +2340,9 @@ static int _fcoe_create(struct net_device *netdev, enum fip_state fip_mode, | ||||
| 		rc = -EIO; | ||||
| 		rtnl_unlock(); | ||||
| 		fcoe_interface_cleanup(fcoe); | ||||
| 		goto out_nortnl; | ||||
| 		mutex_unlock(&fcoe_config_mutex); | ||||
| 		fcoe_ctlr_device_delete(ctlr_dev); | ||||
| 		goto out; | ||||
| 	} | ||||
| 
 | ||||
| 	/* Make this the "master" N_Port */ | ||||
| @ -2375,8 +2382,8 @@ static int _fcoe_create(struct net_device *netdev, enum fip_state fip_mode, | ||||
| 
 | ||||
| out_nodev: | ||||
| 	rtnl_unlock(); | ||||
| out_nortnl: | ||||
| 	mutex_unlock(&fcoe_config_mutex); | ||||
| out: | ||||
| 	return rc; | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -2814,6 +2814,47 @@ unlock: | ||||
| 		fc_lport_set_local_id(fip->lp, new_port_id); | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * fcoe_ctlr_mode_set() - Set or reset the ctlr's mode | ||||
|  * @lport: The local port to be (re)configured | ||||
|  * @fip:   The FCoE controller whose mode is changing | ||||
|  * @fip_mode: The new fip mode | ||||
|  * | ||||
|  * Note that the we shouldn't be changing the libfc discovery settings | ||||
|  * (fc_disc_config) while an lport is going through the libfc state | ||||
|  * machine. The mode can only be changed when a fcoe_ctlr device is | ||||
|  * disabled, so that should ensure that this routine is only called | ||||
|  * when nothing is happening. | ||||
|  */ | ||||
| void fcoe_ctlr_mode_set(struct fc_lport *lport, struct fcoe_ctlr *fip, | ||||
| 			enum fip_state fip_mode) | ||||
| { | ||||
| 	void *priv; | ||||
| 
 | ||||
| 	WARN_ON(lport->state != LPORT_ST_RESET && | ||||
| 		lport->state != LPORT_ST_DISABLED); | ||||
| 
 | ||||
| 	if (fip_mode == FIP_MODE_VN2VN) { | ||||
| 		lport->rport_priv_size = sizeof(struct fcoe_rport); | ||||
| 		lport->point_to_multipoint = 1; | ||||
| 		lport->tt.disc_recv_req = fcoe_ctlr_disc_recv; | ||||
| 		lport->tt.disc_start = fcoe_ctlr_disc_start; | ||||
| 		lport->tt.disc_stop = fcoe_ctlr_disc_stop; | ||||
| 		lport->tt.disc_stop_final = fcoe_ctlr_disc_stop_final; | ||||
| 		priv = fip; | ||||
| 	} else { | ||||
| 		lport->rport_priv_size = 0; | ||||
| 		lport->point_to_multipoint = 0; | ||||
| 		lport->tt.disc_recv_req = NULL; | ||||
| 		lport->tt.disc_start = NULL; | ||||
| 		lport->tt.disc_stop = NULL; | ||||
| 		lport->tt.disc_stop_final = NULL; | ||||
| 		priv = lport; | ||||
| 	} | ||||
| 
 | ||||
| 	fc_disc_config(lport, priv); | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * fcoe_libfc_config() - Sets up libfc related properties for local port | ||||
|  * @lport:    The local port to configure libfc for | ||||
| @ -2833,21 +2874,9 @@ int fcoe_libfc_config(struct fc_lport *lport, struct fcoe_ctlr *fip, | ||||
| 	fc_exch_init(lport); | ||||
| 	fc_elsct_init(lport); | ||||
| 	fc_lport_init(lport); | ||||
| 	if (fip->mode == FIP_MODE_VN2VN) | ||||
| 		lport->rport_priv_size = sizeof(struct fcoe_rport); | ||||
| 	fc_rport_init(lport); | ||||
| 	if (fip->mode == FIP_MODE_VN2VN) { | ||||
| 		lport->point_to_multipoint = 1; | ||||
| 		lport->tt.disc_recv_req = fcoe_ctlr_disc_recv; | ||||
| 		lport->tt.disc_start = fcoe_ctlr_disc_start; | ||||
| 		lport->tt.disc_stop = fcoe_ctlr_disc_stop; | ||||
| 		lport->tt.disc_stop_final = fcoe_ctlr_disc_stop_final; | ||||
| 		mutex_init(&lport->disc.disc_mutex); | ||||
| 		INIT_LIST_HEAD(&lport->disc.rports); | ||||
| 		lport->disc.priv = fip; | ||||
| 	} else { | ||||
| 		fc_disc_init(lport); | ||||
| 	} | ||||
| 	fc_disc_init(lport); | ||||
| 	fcoe_ctlr_mode_set(lport, fip, fip->mode); | ||||
| 	return 0; | ||||
| } | ||||
| EXPORT_SYMBOL_GPL(fcoe_libfc_config); | ||||
| @ -2875,6 +2904,7 @@ EXPORT_SYMBOL(fcoe_fcf_get_selected); | ||||
| void fcoe_ctlr_set_fip_mode(struct fcoe_ctlr_device *ctlr_dev) | ||||
| { | ||||
| 	struct fcoe_ctlr *ctlr = fcoe_ctlr_device_priv(ctlr_dev); | ||||
| 	struct fc_lport *lport = ctlr->lp; | ||||
| 
 | ||||
| 	mutex_lock(&ctlr->ctlr_mutex); | ||||
| 	switch (ctlr_dev->mode) { | ||||
| @ -2888,5 +2918,7 @@ void fcoe_ctlr_set_fip_mode(struct fcoe_ctlr_device *ctlr_dev) | ||||
| 	} | ||||
| 
 | ||||
| 	mutex_unlock(&ctlr->ctlr_mutex); | ||||
| 
 | ||||
| 	fcoe_ctlr_mode_set(lport, ctlr, ctlr->mode); | ||||
| } | ||||
| EXPORT_SYMBOL(fcoe_ctlr_set_fip_mode); | ||||
|  | ||||
| @ -712,12 +712,13 @@ static void fc_disc_stop_final(struct fc_lport *lport) | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * fc_disc_init() - Initialize the discovery layer for a local port | ||||
|  * @lport: The local port that needs the discovery layer to be initialized | ||||
|  * fc_disc_config() - Configure the discovery layer for a local port | ||||
|  * @lport: The local port that needs the discovery layer to be configured | ||||
|  * @priv: Private data structre for users of the discovery layer | ||||
|  */ | ||||
| int fc_disc_init(struct fc_lport *lport) | ||||
| void fc_disc_config(struct fc_lport *lport, void *priv) | ||||
| { | ||||
| 	struct fc_disc *disc; | ||||
| 	struct fc_disc *disc = &lport->disc; | ||||
| 
 | ||||
| 	if (!lport->tt.disc_start) | ||||
| 		lport->tt.disc_start = fc_disc_start; | ||||
| @ -732,12 +733,21 @@ int fc_disc_init(struct fc_lport *lport) | ||||
| 		lport->tt.disc_recv_req = fc_disc_recv_req; | ||||
| 
 | ||||
| 	disc = &lport->disc; | ||||
| 
 | ||||
| 	disc->priv = priv; | ||||
| } | ||||
| EXPORT_SYMBOL(fc_disc_config); | ||||
| 
 | ||||
| /**
 | ||||
|  * fc_disc_init() - Initialize the discovery layer for a local port | ||||
|  * @lport: The local port that needs the discovery layer to be initialized | ||||
|  */ | ||||
| void fc_disc_init(struct fc_lport *lport) | ||||
| { | ||||
| 	struct fc_disc *disc = &lport->disc; | ||||
| 
 | ||||
| 	INIT_DELAYED_WORK(&disc->disc_work, fc_disc_timeout); | ||||
| 	mutex_init(&disc->disc_mutex); | ||||
| 	INIT_LIST_HEAD(&disc->rports); | ||||
| 
 | ||||
| 	disc->priv = lport; | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| EXPORT_SYMBOL(fc_disc_init); | ||||
|  | ||||
| @ -858,6 +858,7 @@ static void sh_mobile_lcdc_geometry(struct sh_mobile_lcdc_chan *ch) | ||||
| 	tmp = ((mode->xres & 7) << 24) | ((display_h_total & 7) << 16) | ||||
| 	    | ((mode->hsync_len & 7) << 8) | (hsync_pos & 7); | ||||
| 	lcdc_write_chan(ch, LDHAJR, tmp); | ||||
| 	lcdc_write_chan_mirror(ch, LDHAJR, tmp); | ||||
| } | ||||
| 
 | ||||
| static void sh_mobile_lcdc_overlay_setup(struct sh_mobile_lcdc_overlay *ovl) | ||||
|  | ||||
| @ -551,6 +551,7 @@ struct block_device *bdgrab(struct block_device *bdev) | ||||
| 	ihold(bdev->bd_inode); | ||||
| 	return bdev; | ||||
| } | ||||
| EXPORT_SYMBOL(bdgrab); | ||||
| 
 | ||||
| long nr_blockdev_pages(void) | ||||
| { | ||||
|  | ||||
| @ -264,7 +264,7 @@ nfsd4_decode_fattr(struct nfsd4_compoundargs *argp, u32 *bmval, | ||||
| 		iattr->ia_valid |= ATTR_SIZE; | ||||
| 	} | ||||
| 	if (bmval[0] & FATTR4_WORD0_ACL) { | ||||
| 		int nace; | ||||
| 		u32 nace; | ||||
| 		struct nfs4_ace *ace; | ||||
| 
 | ||||
| 		READ_BUF(4); len += 4; | ||||
|  | ||||
| @ -141,11 +141,11 @@ typedef struct { | ||||
| } compat_sigset_t; | ||||
| 
 | ||||
| struct compat_sigaction { | ||||
| #ifndef __ARCH_HAS_ODD_SIGACTION | ||||
| #ifndef __ARCH_HAS_IRIX_SIGACTION | ||||
| 	compat_uptr_t			sa_handler; | ||||
| 	compat_ulong_t			sa_flags; | ||||
| #else | ||||
| 	compat_ulong_t			sa_flags; | ||||
| 	compat_uint_t			sa_flags; | ||||
| 	compat_uptr_t			sa_handler; | ||||
| #endif | ||||
| #ifdef __ARCH_HAS_SA_RESTORER | ||||
|  | ||||
| @ -250,11 +250,11 @@ extern int show_unhandled_signals; | ||||
| extern int sigsuspend(sigset_t *); | ||||
| 
 | ||||
| struct sigaction { | ||||
| #ifndef __ARCH_HAS_ODD_SIGACTION | ||||
| #ifndef __ARCH_HAS_IRIX_SIGACTION | ||||
| 	__sighandler_t	sa_handler; | ||||
| 	unsigned long	sa_flags; | ||||
| #else | ||||
| 	unsigned long	sa_flags; | ||||
| 	unsigned int	sa_flags; | ||||
| 	__sighandler_t	sa_handler; | ||||
| #endif | ||||
| #ifdef __ARCH_HAS_SA_RESTORER | ||||
|  | ||||
| @ -1074,7 +1074,8 @@ void fc_rport_terminate_io(struct fc_rport *); | ||||
| /*
 | ||||
|  * DISCOVERY LAYER | ||||
|  *****************************/ | ||||
| int fc_disc_init(struct fc_lport *); | ||||
| void fc_disc_init(struct fc_lport *); | ||||
| void fc_disc_config(struct fc_lport *, void *); | ||||
| 
 | ||||
| static inline struct fc_lport *fc_disc_lport(struct fc_disc *disc) | ||||
| { | ||||
|  | ||||
| @ -872,6 +872,7 @@ long do_msgrcv(int msqid, void __user *buf, size_t bufsz, long msgtyp, | ||||
| 							goto out_unlock; | ||||
| 						break; | ||||
| 					} | ||||
| 					msg = ERR_PTR(-EAGAIN); | ||||
| 				} else | ||||
| 					break; | ||||
| 				msg_counter++; | ||||
|  | ||||
| @ -2616,6 +2616,9 @@ static void sit_add_v4_addrs(struct inet6_dev *idev) | ||||
| static void init_loopback(struct net_device *dev) | ||||
| { | ||||
| 	struct inet6_dev  *idev; | ||||
| 	struct net_device *sp_dev; | ||||
| 	struct inet6_ifaddr *sp_ifa; | ||||
| 	struct rt6_info *sp_rt; | ||||
| 
 | ||||
| 	/* ::1 */ | ||||
| 
 | ||||
| @ -2627,6 +2630,30 @@ static void init_loopback(struct net_device *dev) | ||||
| 	} | ||||
| 
 | ||||
| 	add_addr(idev, &in6addr_loopback, 128, IFA_HOST); | ||||
| 
 | ||||
| 	/* Add routes to other interface's IPv6 addresses */ | ||||
| 	for_each_netdev(dev_net(dev), sp_dev) { | ||||
| 		if (!strcmp(sp_dev->name, dev->name)) | ||||
| 			continue; | ||||
| 
 | ||||
| 		idev = __in6_dev_get(sp_dev); | ||||
| 		if (!idev) | ||||
| 			continue; | ||||
| 
 | ||||
| 		read_lock_bh(&idev->lock); | ||||
| 		list_for_each_entry(sp_ifa, &idev->addr_list, if_list) { | ||||
| 
 | ||||
| 			if (sp_ifa->flags & (IFA_F_DADFAILED | IFA_F_TENTATIVE)) | ||||
| 				continue; | ||||
| 
 | ||||
| 			sp_rt = addrconf_dst_alloc(idev, &sp_ifa->addr, 0); | ||||
| 
 | ||||
| 			/* Failure cases are ignored */ | ||||
| 			if (!IS_ERR(sp_rt)) | ||||
| 				ip6_ins_rt(sp_rt); | ||||
| 		} | ||||
| 		read_unlock_bh(&idev->lock); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| static void addrconf_add_linklocal(struct inet6_dev *idev, const struct in6_addr *addr) | ||||
|  | ||||
| @ -962,8 +962,11 @@ cbq_dequeue(struct Qdisc *sch) | ||||
| 		cbq_update(q); | ||||
| 		if ((incr -= incr2) < 0) | ||||
| 			incr = 0; | ||||
| 		q->now += incr; | ||||
| 	} else { | ||||
| 		if (now > q->now) | ||||
| 			q->now = now; | ||||
| 	} | ||||
| 	q->now += incr; | ||||
| 	q->now_rt = now; | ||||
| 
 | ||||
| 	for (;;) { | ||||
|  | ||||
| @ -207,7 +207,7 @@ static struct sock *__vsock_find_bound_socket(struct sockaddr_vm *addr) | ||||
| 	struct vsock_sock *vsk; | ||||
| 
 | ||||
| 	list_for_each_entry(vsk, vsock_bound_sockets(addr), bound_table) | ||||
| 		if (vsock_addr_equals_addr_any(addr, &vsk->local_addr)) | ||||
| 		if (addr->svm_port == vsk->local_addr.svm_port) | ||||
| 			return sk_vsock(vsk); | ||||
| 
 | ||||
| 	return NULL; | ||||
| @ -220,8 +220,8 @@ static struct sock *__vsock_find_connected_socket(struct sockaddr_vm *src, | ||||
| 
 | ||||
| 	list_for_each_entry(vsk, vsock_connected_sockets(src, dst), | ||||
| 			    connected_table) { | ||||
| 		if (vsock_addr_equals_addr(src, &vsk->remote_addr) | ||||
| 		    && vsock_addr_equals_addr(dst, &vsk->local_addr)) { | ||||
| 		if (vsock_addr_equals_addr(src, &vsk->remote_addr) && | ||||
| 		    dst->svm_port == vsk->local_addr.svm_port) { | ||||
| 			return sk_vsock(vsk); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| @ -472,19 +472,16 @@ static struct sock *vmci_transport_get_pending( | ||||
| 	struct vsock_sock *vlistener; | ||||
| 	struct vsock_sock *vpending; | ||||
| 	struct sock *pending; | ||||
| 	struct sockaddr_vm src; | ||||
| 
 | ||||
| 	vsock_addr_init(&src, pkt->dg.src.context, pkt->src_port); | ||||
| 
 | ||||
| 	vlistener = vsock_sk(listener); | ||||
| 
 | ||||
| 	list_for_each_entry(vpending, &vlistener->pending_links, | ||||
| 			    pending_links) { | ||||
| 		struct sockaddr_vm src; | ||||
| 		struct sockaddr_vm dst; | ||||
| 
 | ||||
| 		vsock_addr_init(&src, pkt->dg.src.context, pkt->src_port); | ||||
| 		vsock_addr_init(&dst, pkt->dg.dst.context, pkt->dst_port); | ||||
| 
 | ||||
| 		if (vsock_addr_equals_addr(&src, &vpending->remote_addr) && | ||||
| 		    vsock_addr_equals_addr(&dst, &vpending->local_addr)) { | ||||
| 		    pkt->dst_port == vpending->local_addr.svm_port) { | ||||
| 			pending = sk_vsock(vpending); | ||||
| 			sock_hold(pending); | ||||
| 			goto found; | ||||
| @ -749,10 +746,15 @@ static int vmci_transport_recv_stream_cb(void *data, struct vmci_datagram *dg) | ||||
| 	 */ | ||||
| 	bh_lock_sock(sk); | ||||
| 
 | ||||
| 	if (!sock_owned_by_user(sk) && sk->sk_state == SS_CONNECTED) | ||||
| 		vmci_trans(vsk)->notify_ops->handle_notify_pkt( | ||||
| 				sk, pkt, true, &dst, &src, | ||||
| 				&bh_process_pkt); | ||||
| 	if (!sock_owned_by_user(sk)) { | ||||
| 		/* The local context ID may be out of date, update it. */ | ||||
| 		vsk->local_addr.svm_cid = dst.svm_cid; | ||||
| 
 | ||||
| 		if (sk->sk_state == SS_CONNECTED) | ||||
| 			vmci_trans(vsk)->notify_ops->handle_notify_pkt( | ||||
| 					sk, pkt, true, &dst, &src, | ||||
| 					&bh_process_pkt); | ||||
| 	} | ||||
| 
 | ||||
| 	bh_unlock_sock(sk); | ||||
| 
 | ||||
| @ -912,6 +914,9 @@ static void vmci_transport_recv_pkt_work(struct work_struct *work) | ||||
| 
 | ||||
| 	lock_sock(sk); | ||||
| 
 | ||||
| 	/* The local context ID may be out of date. */ | ||||
| 	vsock_sk(sk)->local_addr.svm_cid = pkt->dg.dst.context; | ||||
| 
 | ||||
| 	switch (sk->sk_state) { | ||||
| 	case SS_LISTEN: | ||||
| 		vmci_transport_recv_listen(sk, pkt); | ||||
| @ -968,6 +973,10 @@ static int vmci_transport_recv_listen(struct sock *sk, | ||||
| 	pending = vmci_transport_get_pending(sk, pkt); | ||||
| 	if (pending) { | ||||
| 		lock_sock(pending); | ||||
| 
 | ||||
| 		/* The local context ID may be out of date. */ | ||||
| 		vsock_sk(pending)->local_addr.svm_cid = pkt->dg.dst.context; | ||||
| 
 | ||||
| 		switch (pending->sk_state) { | ||||
| 		case SS_CONNECTING: | ||||
| 			err = vmci_transport_recv_connecting_server(sk, | ||||
|  | ||||
| @ -64,16 +64,6 @@ bool vsock_addr_equals_addr(const struct sockaddr_vm *addr, | ||||
| } | ||||
| EXPORT_SYMBOL_GPL(vsock_addr_equals_addr); | ||||
| 
 | ||||
| bool vsock_addr_equals_addr_any(const struct sockaddr_vm *addr, | ||||
| 				const struct sockaddr_vm *other) | ||||
| { | ||||
| 	return (addr->svm_cid == VMADDR_CID_ANY || | ||||
| 		other->svm_cid == VMADDR_CID_ANY || | ||||
| 		addr->svm_cid == other->svm_cid) && | ||||
| 	       addr->svm_port == other->svm_port; | ||||
| } | ||||
| EXPORT_SYMBOL_GPL(vsock_addr_equals_addr_any); | ||||
| 
 | ||||
| int vsock_addr_cast(const struct sockaddr *addr, | ||||
| 		    size_t len, struct sockaddr_vm **out_addr) | ||||
| { | ||||
|  | ||||
| @ -24,8 +24,6 @@ bool vsock_addr_bound(const struct sockaddr_vm *addr); | ||||
| void vsock_addr_unbind(struct sockaddr_vm *addr); | ||||
| bool vsock_addr_equals_addr(const struct sockaddr_vm *addr, | ||||
| 			    const struct sockaddr_vm *other); | ||||
| bool vsock_addr_equals_addr_any(const struct sockaddr_vm *addr, | ||||
| 				const struct sockaddr_vm *other); | ||||
| int vsock_addr_cast(const struct sockaddr *addr, size_t len, | ||||
| 		    struct sockaddr_vm **out_addr); | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user