diff options
47 files changed, 404 insertions, 431 deletions
diff --git a/arch/arm/kernel/traps.c b/arch/arm/kernel/traps.c index 99a572702509..f84dfe67724f 100644 --- a/arch/arm/kernel/traps.c +++ b/arch/arm/kernel/traps.c | |||
| @@ -266,6 +266,7 @@ void die(const char *str, struct pt_regs *regs, int err) | |||
| 266 | { | 266 | { |
| 267 | struct thread_info *thread = current_thread_info(); | 267 | struct thread_info *thread = current_thread_info(); |
| 268 | int ret; | 268 | int ret; |
| 269 | enum bug_trap_type bug_type = BUG_TRAP_TYPE_NONE; | ||
| 269 | 270 | ||
| 270 | oops_enter(); | 271 | oops_enter(); |
| 271 | 272 | ||
| @@ -273,7 +274,9 @@ void die(const char *str, struct pt_regs *regs, int err) | |||
| 273 | console_verbose(); | 274 | console_verbose(); |
| 274 | bust_spinlocks(1); | 275 | bust_spinlocks(1); |
| 275 | if (!user_mode(regs)) | 276 | if (!user_mode(regs)) |
| 276 | report_bug(regs->ARM_pc, regs); | 277 | bug_type = report_bug(regs->ARM_pc, regs); |
| 278 | if (bug_type != BUG_TRAP_TYPE_NONE) | ||
| 279 | str = "Oops - BUG"; | ||
| 277 | ret = __die(str, err, thread, regs); | 280 | ret = __die(str, err, thread, regs); |
| 278 | 281 | ||
| 279 | if (regs && kexec_should_crash(thread->task)) | 282 | if (regs && kexec_should_crash(thread->task)) |
diff --git a/arch/arm/kernel/vmlinux.lds.S b/arch/arm/kernel/vmlinux.lds.S index 1e19691e0406..43a31fb06318 100644 --- a/arch/arm/kernel/vmlinux.lds.S +++ b/arch/arm/kernel/vmlinux.lds.S | |||
| @@ -10,6 +10,7 @@ | |||
| 10 | #include <asm/page.h> | 10 | #include <asm/page.h> |
| 11 | 11 | ||
| 12 | #define PROC_INFO \ | 12 | #define PROC_INFO \ |
| 13 | . = ALIGN(4); \ | ||
| 13 | VMLINUX_SYMBOL(__proc_info_begin) = .; \ | 14 | VMLINUX_SYMBOL(__proc_info_begin) = .; \ |
| 14 | *(.proc.info.init) \ | 15 | *(.proc.info.init) \ |
| 15 | VMLINUX_SYMBOL(__proc_info_end) = .; | 16 | VMLINUX_SYMBOL(__proc_info_end) = .; |
diff --git a/arch/arm/mach-omap2/board-4430sdp.c b/arch/arm/mach-omap2/board-4430sdp.c index 21fc87648660..4e9071589bfb 100644 --- a/arch/arm/mach-omap2/board-4430sdp.c +++ b/arch/arm/mach-omap2/board-4430sdp.c | |||
| @@ -814,7 +814,7 @@ static struct omap_dss_board_info sdp4430_dss_data = { | |||
| 814 | .default_device = &sdp4430_lcd_device, | 814 | .default_device = &sdp4430_lcd_device, |
| 815 | }; | 815 | }; |
| 816 | 816 | ||
| 817 | static void omap_4430sdp_display_init(void) | 817 | static void __init omap_4430sdp_display_init(void) |
| 818 | { | 818 | { |
| 819 | int r; | 819 | int r; |
| 820 | 820 | ||
| @@ -851,7 +851,7 @@ static struct omap_board_mux board_mux[] __initdata = { | |||
| 851 | #define board_mux NULL | 851 | #define board_mux NULL |
| 852 | #endif | 852 | #endif |
| 853 | 853 | ||
| 854 | static void omap4_sdp4430_wifi_mux_init(void) | 854 | static void __init omap4_sdp4430_wifi_mux_init(void) |
| 855 | { | 855 | { |
| 856 | omap_mux_init_gpio(GPIO_WIFI_IRQ, OMAP_PIN_INPUT | | 856 | omap_mux_init_gpio(GPIO_WIFI_IRQ, OMAP_PIN_INPUT | |
| 857 | OMAP_PIN_OFF_WAKEUPENABLE); | 857 | OMAP_PIN_OFF_WAKEUPENABLE); |
| @@ -878,12 +878,17 @@ static struct wl12xx_platform_data omap4_sdp4430_wlan_data __initdata = { | |||
| 878 | .board_tcxo_clock = WL12XX_TCXOCLOCK_26, | 878 | .board_tcxo_clock = WL12XX_TCXOCLOCK_26, |
| 879 | }; | 879 | }; |
| 880 | 880 | ||
| 881 | static void omap4_sdp4430_wifi_init(void) | 881 | static void __init omap4_sdp4430_wifi_init(void) |
| 882 | { | 882 | { |
| 883 | int ret; | ||
| 884 | |||
| 883 | omap4_sdp4430_wifi_mux_init(); | 885 | omap4_sdp4430_wifi_mux_init(); |
| 884 | if (wl12xx_set_platform_data(&omap4_sdp4430_wlan_data)) | 886 | ret = wl12xx_set_platform_data(&omap4_sdp4430_wlan_data); |
| 885 | pr_err("Error setting wl12xx data\n"); | 887 | if (ret) |
| 886 | platform_device_register(&omap_vwlan_device); | 888 | pr_err("Error setting wl12xx data: %d\n", ret); |
| 889 | ret = platform_device_register(&omap_vwlan_device); | ||
| 890 | if (ret) | ||
| 891 | pr_err("Error registering wl12xx device: %d\n", ret); | ||
| 887 | } | 892 | } |
| 888 | 893 | ||
| 889 | static void __init omap_4430sdp_init(void) | 894 | static void __init omap_4430sdp_init(void) |
diff --git a/arch/arm/mach-omap2/board-omap3evm.c b/arch/arm/mach-omap2/board-omap3evm.c index 003fe34c9343..c775bead1497 100644 --- a/arch/arm/mach-omap2/board-omap3evm.c +++ b/arch/arm/mach-omap2/board-omap3evm.c | |||
| @@ -617,6 +617,21 @@ static struct gpio omap3_evm_ehci_gpios[] __initdata = { | |||
| 617 | { OMAP3_EVM_EHCI_SELECT, GPIOF_OUT_INIT_LOW, "select EHCI port" }, | 617 | { OMAP3_EVM_EHCI_SELECT, GPIOF_OUT_INIT_LOW, "select EHCI port" }, |
| 618 | }; | 618 | }; |
| 619 | 619 | ||
| 620 | static void __init omap3_evm_wl12xx_init(void) | ||
| 621 | { | ||
| 622 | #ifdef CONFIG_WL12XX_PLATFORM_DATA | ||
| 623 | int ret; | ||
| 624 | |||
| 625 | /* WL12xx WLAN Init */ | ||
| 626 | ret = wl12xx_set_platform_data(&omap3evm_wlan_data); | ||
| 627 | if (ret) | ||
| 628 | pr_err("error setting wl12xx data: %d\n", ret); | ||
| 629 | ret = platform_device_register(&omap3evm_wlan_regulator); | ||
| 630 | if (ret) | ||
| 631 | pr_err("error registering wl12xx device: %d\n", ret); | ||
| 632 | #endif | ||
| 633 | } | ||
| 634 | |||
| 620 | static void __init omap3_evm_init(void) | 635 | static void __init omap3_evm_init(void) |
| 621 | { | 636 | { |
| 622 | omap3_evm_get_revision(); | 637 | omap3_evm_get_revision(); |
| @@ -665,13 +680,7 @@ static void __init omap3_evm_init(void) | |||
| 665 | omap_ads7846_init(1, OMAP3_EVM_TS_GPIO, 310, NULL); | 680 | omap_ads7846_init(1, OMAP3_EVM_TS_GPIO, 310, NULL); |
| 666 | omap3evm_init_smsc911x(); | 681 | omap3evm_init_smsc911x(); |
| 667 | omap3_evm_display_init(); | 682 | omap3_evm_display_init(); |
| 668 | 683 | omap3_evm_wl12xx_init(); | |
| 669 | #ifdef CONFIG_WL12XX_PLATFORM_DATA | ||
| 670 | /* WL12xx WLAN Init */ | ||
| 671 | if (wl12xx_set_platform_data(&omap3evm_wlan_data)) | ||
| 672 | pr_err("error setting wl12xx data\n"); | ||
| 673 | platform_device_register(&omap3evm_wlan_regulator); | ||
| 674 | #endif | ||
| 675 | } | 684 | } |
| 676 | 685 | ||
| 677 | MACHINE_START(OMAP3EVM, "OMAP3 EVM") | 686 | MACHINE_START(OMAP3EVM, "OMAP3 EVM") |
diff --git a/arch/arm/mach-omap2/board-omap4panda.c b/arch/arm/mach-omap2/board-omap4panda.c index b7779c206a90..28fc271f7031 100644 --- a/arch/arm/mach-omap2/board-omap4panda.c +++ b/arch/arm/mach-omap2/board-omap4panda.c | |||
| @@ -488,13 +488,15 @@ void omap4_panda_display_init(void) | |||
| 488 | static void __init omap4_panda_init(void) | 488 | static void __init omap4_panda_init(void) |
| 489 | { | 489 | { |
| 490 | int package = OMAP_PACKAGE_CBS; | 490 | int package = OMAP_PACKAGE_CBS; |
| 491 | int ret; | ||
| 491 | 492 | ||
| 492 | if (omap_rev() == OMAP4430_REV_ES1_0) | 493 | if (omap_rev() == OMAP4430_REV_ES1_0) |
| 493 | package = OMAP_PACKAGE_CBL; | 494 | package = OMAP_PACKAGE_CBL; |
| 494 | omap4_mux_init(board_mux, NULL, package); | 495 | omap4_mux_init(board_mux, NULL, package); |
| 495 | 496 | ||
| 496 | if (wl12xx_set_platform_data(&omap_panda_wlan_data)) | 497 | ret = wl12xx_set_platform_data(&omap_panda_wlan_data); |
| 497 | pr_err("error setting wl12xx data\n"); | 498 | if (ret) |
| 499 | pr_err("error setting wl12xx data: %d\n", ret); | ||
| 498 | 500 | ||
| 499 | omap4_panda_i2c_init(); | 501 | omap4_panda_i2c_init(); |
| 500 | platform_add_devices(panda_devices, ARRAY_SIZE(panda_devices)); | 502 | platform_add_devices(panda_devices, ARRAY_SIZE(panda_devices)); |
diff --git a/arch/arm/mach-omap2/board-zoom-peripherals.c b/arch/arm/mach-omap2/board-zoom-peripherals.c index 8d7ce11cfeaf..c126461836ac 100644 --- a/arch/arm/mach-omap2/board-zoom-peripherals.c +++ b/arch/arm/mach-omap2/board-zoom-peripherals.c | |||
| @@ -296,8 +296,10 @@ static void enable_board_wakeup_source(void) | |||
| 296 | 296 | ||
| 297 | void __init zoom_peripherals_init(void) | 297 | void __init zoom_peripherals_init(void) |
| 298 | { | 298 | { |
| 299 | if (wl12xx_set_platform_data(&omap_zoom_wlan_data)) | 299 | int ret = wl12xx_set_platform_data(&omap_zoom_wlan_data); |
| 300 | pr_err("error setting wl12xx data\n"); | 300 | |
| 301 | if (ret) | ||
| 302 | pr_err("error setting wl12xx data: %d\n", ret); | ||
| 301 | 303 | ||
| 302 | omap_i2c_init(); | 304 | omap_i2c_init(); |
| 303 | platform_device_register(&omap_vwlan_device); | 305 | platform_device_register(&omap_vwlan_device); |
diff --git a/arch/arm/mach-omap2/hsmmc.c b/arch/arm/mach-omap2/hsmmc.c index ad0adb5a1e0e..b40c28895298 100644 --- a/arch/arm/mach-omap2/hsmmc.c +++ b/arch/arm/mach-omap2/hsmmc.c | |||
| @@ -293,8 +293,8 @@ static inline void omap_hsmmc_mux(struct omap_mmc_platform_data *mmc_controller, | |||
| 293 | } | 293 | } |
| 294 | } | 294 | } |
| 295 | 295 | ||
| 296 | static int __init omap_hsmmc_pdata_init(struct omap2_hsmmc_info *c, | 296 | static int omap_hsmmc_pdata_init(struct omap2_hsmmc_info *c, |
| 297 | struct omap_mmc_platform_data *mmc) | 297 | struct omap_mmc_platform_data *mmc) |
| 298 | { | 298 | { |
| 299 | char *hc_name; | 299 | char *hc_name; |
| 300 | 300 | ||
| @@ -430,7 +430,7 @@ static int __init omap_hsmmc_pdata_init(struct omap2_hsmmc_info *c, | |||
| 430 | 430 | ||
| 431 | #define MAX_OMAP_MMC_HWMOD_NAME_LEN 16 | 431 | #define MAX_OMAP_MMC_HWMOD_NAME_LEN 16 |
| 432 | 432 | ||
| 433 | void __init omap_init_hsmmc(struct omap2_hsmmc_info *hsmmcinfo, int ctrl_nr) | 433 | void omap_init_hsmmc(struct omap2_hsmmc_info *hsmmcinfo, int ctrl_nr) |
| 434 | { | 434 | { |
| 435 | struct omap_hwmod *oh; | 435 | struct omap_hwmod *oh; |
| 436 | struct platform_device *pdev; | 436 | struct platform_device *pdev; |
| @@ -487,7 +487,7 @@ done: | |||
| 487 | kfree(mmc_data); | 487 | kfree(mmc_data); |
| 488 | } | 488 | } |
| 489 | 489 | ||
| 490 | void __init omap2_hsmmc_init(struct omap2_hsmmc_info *controllers) | 490 | void omap2_hsmmc_init(struct omap2_hsmmc_info *controllers) |
| 491 | { | 491 | { |
| 492 | u32 reg; | 492 | u32 reg; |
| 493 | 493 | ||
diff --git a/arch/arm/mach-omap2/mux.c b/arch/arm/mach-omap2/mux.c index e1cc75d1a57a..fb8bc9fa43b1 100644 --- a/arch/arm/mach-omap2/mux.c +++ b/arch/arm/mach-omap2/mux.c | |||
| @@ -100,8 +100,8 @@ void omap_mux_write_array(struct omap_mux_partition *partition, | |||
| 100 | 100 | ||
| 101 | static char *omap_mux_options; | 101 | static char *omap_mux_options; |
| 102 | 102 | ||
| 103 | static int __init _omap_mux_init_gpio(struct omap_mux_partition *partition, | 103 | static int _omap_mux_init_gpio(struct omap_mux_partition *partition, |
| 104 | int gpio, int val) | 104 | int gpio, int val) |
| 105 | { | 105 | { |
| 106 | struct omap_mux_entry *e; | 106 | struct omap_mux_entry *e; |
| 107 | struct omap_mux *gpio_mux = NULL; | 107 | struct omap_mux *gpio_mux = NULL; |
| @@ -145,7 +145,7 @@ static int __init _omap_mux_init_gpio(struct omap_mux_partition *partition, | |||
| 145 | return 0; | 145 | return 0; |
| 146 | } | 146 | } |
| 147 | 147 | ||
| 148 | int __init omap_mux_init_gpio(int gpio, int val) | 148 | int omap_mux_init_gpio(int gpio, int val) |
| 149 | { | 149 | { |
| 150 | struct omap_mux_partition *partition; | 150 | struct omap_mux_partition *partition; |
| 151 | int ret; | 151 | int ret; |
| @@ -159,9 +159,9 @@ int __init omap_mux_init_gpio(int gpio, int val) | |||
| 159 | return -ENODEV; | 159 | return -ENODEV; |
| 160 | } | 160 | } |
| 161 | 161 | ||
| 162 | static int __init _omap_mux_get_by_name(struct omap_mux_partition *partition, | 162 | static int _omap_mux_get_by_name(struct omap_mux_partition *partition, |
| 163 | const char *muxname, | 163 | const char *muxname, |
| 164 | struct omap_mux **found_mux) | 164 | struct omap_mux **found_mux) |
| 165 | { | 165 | { |
| 166 | struct omap_mux *mux = NULL; | 166 | struct omap_mux *mux = NULL; |
| 167 | struct omap_mux_entry *e; | 167 | struct omap_mux_entry *e; |
| @@ -240,7 +240,7 @@ omap_mux_get_by_name(const char *muxname, | |||
| 240 | return -ENODEV; | 240 | return -ENODEV; |
| 241 | } | 241 | } |
| 242 | 242 | ||
| 243 | int __init omap_mux_init_signal(const char *muxname, int val) | 243 | int omap_mux_init_signal(const char *muxname, int val) |
| 244 | { | 244 | { |
| 245 | struct omap_mux_partition *partition = NULL; | 245 | struct omap_mux_partition *partition = NULL; |
| 246 | struct omap_mux *mux = NULL; | 246 | struct omap_mux *mux = NULL; |
| @@ -1094,8 +1094,8 @@ static void omap_mux_init_package(struct omap_mux *superset, | |||
| 1094 | omap_mux_package_init_balls(package_balls, superset); | 1094 | omap_mux_package_init_balls(package_balls, superset); |
| 1095 | } | 1095 | } |
| 1096 | 1096 | ||
| 1097 | static void omap_mux_init_signals(struct omap_mux_partition *partition, | 1097 | static void __init omap_mux_init_signals(struct omap_mux_partition *partition, |
| 1098 | struct omap_board_mux *board_mux) | 1098 | struct omap_board_mux *board_mux) |
| 1099 | { | 1099 | { |
| 1100 | omap_mux_set_cmdline_signals(); | 1100 | omap_mux_set_cmdline_signals(); |
| 1101 | omap_mux_write_array(partition, board_mux); | 1101 | omap_mux_write_array(partition, board_mux); |
| @@ -1109,8 +1109,8 @@ static void omap_mux_init_package(struct omap_mux *superset, | |||
| 1109 | { | 1109 | { |
| 1110 | } | 1110 | } |
| 1111 | 1111 | ||
| 1112 | static void omap_mux_init_signals(struct omap_mux_partition *partition, | 1112 | static void __init omap_mux_init_signals(struct omap_mux_partition *partition, |
| 1113 | struct omap_board_mux *board_mux) | 1113 | struct omap_board_mux *board_mux) |
| 1114 | { | 1114 | { |
| 1115 | } | 1115 | } |
| 1116 | 1116 | ||
diff --git a/arch/arm/mach-omap2/omap-headsmp.S b/arch/arm/mach-omap2/omap-headsmp.S index b13ef7ef5ef4..503ac777a2ba 100644 --- a/arch/arm/mach-omap2/omap-headsmp.S +++ b/arch/arm/mach-omap2/omap-headsmp.S | |||
| @@ -18,6 +18,7 @@ | |||
| 18 | #include <linux/linkage.h> | 18 | #include <linux/linkage.h> |
| 19 | #include <linux/init.h> | 19 | #include <linux/init.h> |
| 20 | 20 | ||
| 21 | __CPUINIT | ||
| 21 | /* | 22 | /* |
| 22 | * OMAP4 specific entry point for secondary CPU to jump from ROM | 23 | * OMAP4 specific entry point for secondary CPU to jump from ROM |
| 23 | * code. This routine also provides a holding flag into which | 24 | * code. This routine also provides a holding flag into which |
diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c index 5192cabb40ed..eba6cd3816f5 100644 --- a/arch/arm/mach-omap2/omap_hwmod.c +++ b/arch/arm/mach-omap2/omap_hwmod.c | |||
| @@ -1517,8 +1517,8 @@ static int _enable(struct omap_hwmod *oh) | |||
| 1517 | if (oh->_state != _HWMOD_STATE_INITIALIZED && | 1517 | if (oh->_state != _HWMOD_STATE_INITIALIZED && |
| 1518 | oh->_state != _HWMOD_STATE_IDLE && | 1518 | oh->_state != _HWMOD_STATE_IDLE && |
| 1519 | oh->_state != _HWMOD_STATE_DISABLED) { | 1519 | oh->_state != _HWMOD_STATE_DISABLED) { |
| 1520 | WARN(1, "omap_hwmod: %s: enabled state can only be entered " | 1520 | WARN(1, "omap_hwmod: %s: enabled state can only be entered from initialized, idle, or disabled state\n", |
| 1521 | "from initialized, idle, or disabled state\n", oh->name); | 1521 | oh->name); |
| 1522 | return -EINVAL; | 1522 | return -EINVAL; |
| 1523 | } | 1523 | } |
| 1524 | 1524 | ||
| @@ -1600,8 +1600,8 @@ static int _idle(struct omap_hwmod *oh) | |||
| 1600 | pr_debug("omap_hwmod: %s: idling\n", oh->name); | 1600 | pr_debug("omap_hwmod: %s: idling\n", oh->name); |
| 1601 | 1601 | ||
| 1602 | if (oh->_state != _HWMOD_STATE_ENABLED) { | 1602 | if (oh->_state != _HWMOD_STATE_ENABLED) { |
| 1603 | WARN(1, "omap_hwmod: %s: idle state can only be entered from " | 1603 | WARN(1, "omap_hwmod: %s: idle state can only be entered from enabled state\n", |
| 1604 | "enabled state\n", oh->name); | 1604 | oh->name); |
| 1605 | return -EINVAL; | 1605 | return -EINVAL; |
| 1606 | } | 1606 | } |
| 1607 | 1607 | ||
| @@ -1682,8 +1682,8 @@ static int _shutdown(struct omap_hwmod *oh) | |||
| 1682 | 1682 | ||
| 1683 | if (oh->_state != _HWMOD_STATE_IDLE && | 1683 | if (oh->_state != _HWMOD_STATE_IDLE && |
| 1684 | oh->_state != _HWMOD_STATE_ENABLED) { | 1684 | oh->_state != _HWMOD_STATE_ENABLED) { |
| 1685 | WARN(1, "omap_hwmod: %s: disabled state can only be entered " | 1685 | WARN(1, "omap_hwmod: %s: disabled state can only be entered from idle, or enabled state\n", |
| 1686 | "from idle, or enabled state\n", oh->name); | 1686 | oh->name); |
| 1687 | return -EINVAL; | 1687 | return -EINVAL; |
| 1688 | } | 1688 | } |
| 1689 | 1689 | ||
| @@ -2240,8 +2240,8 @@ void omap_hwmod_ocp_barrier(struct omap_hwmod *oh) | |||
| 2240 | BUG_ON(!oh); | 2240 | BUG_ON(!oh); |
| 2241 | 2241 | ||
| 2242 | if (!oh->class->sysc || !oh->class->sysc->sysc_flags) { | 2242 | if (!oh->class->sysc || !oh->class->sysc->sysc_flags) { |
| 2243 | WARN(1, "omap_device: %s: OCP barrier impossible due to " | 2243 | WARN(1, "omap_device: %s: OCP barrier impossible due to device configuration\n", |
| 2244 | "device configuration\n", oh->name); | 2244 | oh->name); |
| 2245 | return; | 2245 | return; |
| 2246 | } | 2246 | } |
| 2247 | 2247 | ||
diff --git a/arch/arm/mach-omap2/prm44xx.c b/arch/arm/mach-omap2/prm44xx.c index 33dd655e6aab..a1d6154dc120 100644 --- a/arch/arm/mach-omap2/prm44xx.c +++ b/arch/arm/mach-omap2/prm44xx.c | |||
| @@ -19,6 +19,7 @@ | |||
| 19 | 19 | ||
| 20 | #include "common.h" | 20 | #include "common.h" |
| 21 | #include <plat/cpu.h> | 21 | #include <plat/cpu.h> |
| 22 | #include <plat/irqs.h> | ||
| 22 | #include <plat/prcm.h> | 23 | #include <plat/prcm.h> |
| 23 | 24 | ||
| 24 | #include "vp.h" | 25 | #include "vp.h" |
diff --git a/arch/arm/mach-omap2/vc.c b/arch/arm/mach-omap2/vc.c index 031d116fbf10..175b7d86d86a 100644 --- a/arch/arm/mach-omap2/vc.c +++ b/arch/arm/mach-omap2/vc.c | |||
| @@ -247,7 +247,7 @@ static void __init omap4_vc_init_channel(struct voltagedomain *voltdm) | |||
| 247 | * omap_vc_i2c_init - initialize I2C interface to PMIC | 247 | * omap_vc_i2c_init - initialize I2C interface to PMIC |
| 248 | * @voltdm: voltage domain containing VC data | 248 | * @voltdm: voltage domain containing VC data |
| 249 | * | 249 | * |
| 250 | * Use PMIC supplied seetings for I2C high-speed mode and | 250 | * Use PMIC supplied settings for I2C high-speed mode and |
| 251 | * master code (if set) and program the VC I2C configuration | 251 | * master code (if set) and program the VC I2C configuration |
| 252 | * register. | 252 | * register. |
| 253 | * | 253 | * |
| @@ -265,8 +265,8 @@ static void __init omap_vc_i2c_init(struct voltagedomain *voltdm) | |||
| 265 | 265 | ||
| 266 | if (initialized) { | 266 | if (initialized) { |
| 267 | if (voltdm->pmic->i2c_high_speed != i2c_high_speed) | 267 | if (voltdm->pmic->i2c_high_speed != i2c_high_speed) |
| 268 | pr_warn("%s: I2C config for all channels must match.", | 268 | pr_warn("%s: I2C config for vdd_%s does not match other channels (%u).", |
| 269 | __func__); | 269 | __func__, voltdm->name, i2c_high_speed); |
| 270 | return; | 270 | return; |
| 271 | } | 271 | } |
| 272 | 272 | ||
| @@ -292,9 +292,7 @@ void __init omap_vc_init_channel(struct voltagedomain *voltdm) | |||
| 292 | u32 val; | 292 | u32 val; |
| 293 | 293 | ||
| 294 | if (!voltdm->pmic || !voltdm->pmic->uv_to_vsel) { | 294 | if (!voltdm->pmic || !voltdm->pmic->uv_to_vsel) { |
| 295 | pr_err("%s: PMIC info requried to configure vc for" | 295 | pr_err("%s: No PMIC info for vdd_%s\n", __func__, voltdm->name); |
| 296 | "vdd_%s not populated.Hence cannot initialize vc\n", | ||
| 297 | __func__, voltdm->name); | ||
| 298 | return; | 296 | return; |
| 299 | } | 297 | } |
| 300 | 298 | ||
diff --git a/arch/arm/mach-omap2/vp.c b/arch/arm/mach-omap2/vp.c index 807391d84a9d..0df88820978d 100644 --- a/arch/arm/mach-omap2/vp.c +++ b/arch/arm/mach-omap2/vp.c | |||
| @@ -41,6 +41,11 @@ void __init omap_vp_init(struct voltagedomain *voltdm) | |||
| 41 | u32 val, sys_clk_rate, timeout, waittime; | 41 | u32 val, sys_clk_rate, timeout, waittime; |
| 42 | u32 vddmin, vddmax, vstepmin, vstepmax; | 42 | u32 vddmin, vddmax, vstepmin, vstepmax; |
| 43 | 43 | ||
| 44 | if (!voltdm->pmic || !voltdm->pmic->uv_to_vsel) { | ||
| 45 | pr_err("%s: No PMIC info for vdd_%s\n", __func__, voltdm->name); | ||
| 46 | return; | ||
| 47 | } | ||
| 48 | |||
| 44 | if (!voltdm->read || !voltdm->write) { | 49 | if (!voltdm->read || !voltdm->write) { |
| 45 | pr_err("%s: No read/write API for accessing vdd_%s regs\n", | 50 | pr_err("%s: No read/write API for accessing vdd_%s regs\n", |
| 46 | __func__, voltdm->name); | 51 | __func__, voltdm->name); |
diff --git a/arch/arm/mm/cache-v7.S b/arch/arm/mm/cache-v7.S index 07c4bc8ea0a4..7a24d39661f0 100644 --- a/arch/arm/mm/cache-v7.S +++ b/arch/arm/mm/cache-v7.S | |||
| @@ -54,9 +54,15 @@ loop1: | |||
| 54 | and r1, r1, #7 @ mask of the bits for current cache only | 54 | and r1, r1, #7 @ mask of the bits for current cache only |
| 55 | cmp r1, #2 @ see what cache we have at this level | 55 | cmp r1, #2 @ see what cache we have at this level |
| 56 | blt skip @ skip if no cache, or just i-cache | 56 | blt skip @ skip if no cache, or just i-cache |
| 57 | #ifdef CONFIG_PREEMPT | ||
| 58 | save_and_disable_irqs r9 @ make cssr&csidr read atomic | ||
| 59 | #endif | ||
| 57 | mcr p15, 2, r10, c0, c0, 0 @ select current cache level in cssr | 60 | mcr p15, 2, r10, c0, c0, 0 @ select current cache level in cssr |
| 58 | isb @ isb to sych the new cssr&csidr | 61 | isb @ isb to sych the new cssr&csidr |
| 59 | mrc p15, 1, r1, c0, c0, 0 @ read the new csidr | 62 | mrc p15, 1, r1, c0, c0, 0 @ read the new csidr |
| 63 | #ifdef CONFIG_PREEMPT | ||
| 64 | restore_irqs_notrace r9 | ||
| 65 | #endif | ||
| 60 | and r2, r1, #7 @ extract the length of the cache lines | 66 | and r2, r1, #7 @ extract the length of the cache lines |
| 61 | add r2, r2, #4 @ add 4 (line length offset) | 67 | add r2, r2, #4 @ add 4 (line length offset) |
| 62 | ldr r4, =0x3ff | 68 | ldr r4, =0x3ff |
diff --git a/arch/x86/include/asm/i387.h b/arch/x86/include/asm/i387.h index 6919e936345b..a29571821b99 100644 --- a/arch/x86/include/asm/i387.h +++ b/arch/x86/include/asm/i387.h | |||
| @@ -29,7 +29,7 @@ extern unsigned int sig_xstate_size; | |||
| 29 | extern void fpu_init(void); | 29 | extern void fpu_init(void); |
| 30 | extern void mxcsr_feature_mask_init(void); | 30 | extern void mxcsr_feature_mask_init(void); |
| 31 | extern int init_fpu(struct task_struct *child); | 31 | extern int init_fpu(struct task_struct *child); |
| 32 | extern asmlinkage void math_state_restore(void); | 32 | extern void math_state_restore(void); |
| 33 | extern void __math_state_restore(void); | 33 | extern void __math_state_restore(void); |
| 34 | extern int dump_fpu(struct pt_regs *, struct user_i387_struct *); | 34 | extern int dump_fpu(struct pt_regs *, struct user_i387_struct *); |
| 35 | 35 | ||
| @@ -307,9 +307,54 @@ static inline void __clear_fpu(struct task_struct *tsk) | |||
| 307 | } | 307 | } |
| 308 | } | 308 | } |
| 309 | 309 | ||
| 310 | /* | ||
| 311 | * Were we in an interrupt that interrupted kernel mode? | ||
| 312 | * | ||
| 313 | * We can do a kernel_fpu_begin/end() pair *ONLY* if that | ||
| 314 | * pair does nothing at all: TS_USEDFPU must be clear (so | ||
| 315 | * that we don't try to save the FPU state), and TS must | ||
| 316 | * be set (so that the clts/stts pair does nothing that is | ||
| 317 | * visible in the interrupted kernel thread). | ||
| 318 | */ | ||
| 319 | static inline bool interrupted_kernel_fpu_idle(void) | ||
| 320 | { | ||
| 321 | return !(current_thread_info()->status & TS_USEDFPU) && | ||
| 322 | (read_cr0() & X86_CR0_TS); | ||
| 323 | } | ||
| 324 | |||
| 325 | /* | ||
| 326 | * Were we in user mode (or vm86 mode) when we were | ||
| 327 | * interrupted? | ||
| 328 | * | ||
| 329 | * Doing kernel_fpu_begin/end() is ok if we are running | ||
| 330 | * in an interrupt context from user mode - we'll just | ||
| 331 | * save the FPU state as required. | ||
| 332 | */ | ||
| 333 | static inline bool interrupted_user_mode(void) | ||
| 334 | { | ||
| 335 | struct pt_regs *regs = get_irq_regs(); | ||
| 336 | return regs && user_mode_vm(regs); | ||
| 337 | } | ||
| 338 | |||
| 339 | /* | ||
| 340 | * Can we use the FPU in kernel mode with the | ||
| 341 | * whole "kernel_fpu_begin/end()" sequence? | ||
| 342 | * | ||
| 343 | * It's always ok in process context (ie "not interrupt") | ||
| 344 | * but it is sometimes ok even from an irq. | ||
| 345 | */ | ||
| 346 | static inline bool irq_fpu_usable(void) | ||
| 347 | { | ||
| 348 | return !in_interrupt() || | ||
| 349 | interrupted_user_mode() || | ||
| 350 | interrupted_kernel_fpu_idle(); | ||
| 351 | } | ||
| 352 | |||
| 310 | static inline void kernel_fpu_begin(void) | 353 | static inline void kernel_fpu_begin(void) |
| 311 | { | 354 | { |
| 312 | struct thread_info *me = current_thread_info(); | 355 | struct thread_info *me = current_thread_info(); |
| 356 | |||
| 357 | WARN_ON_ONCE(!irq_fpu_usable()); | ||
| 313 | preempt_disable(); | 358 | preempt_disable(); |
| 314 | if (me->status & TS_USEDFPU) | 359 | if (me->status & TS_USEDFPU) |
| 315 | __save_init_fpu(me->task); | 360 | __save_init_fpu(me->task); |
| @@ -323,14 +368,6 @@ static inline void kernel_fpu_end(void) | |||
| 323 | preempt_enable(); | 368 | preempt_enable(); |
| 324 | } | 369 | } |
| 325 | 370 | ||
| 326 | static inline bool irq_fpu_usable(void) | ||
| 327 | { | ||
| 328 | struct pt_regs *regs; | ||
| 329 | |||
| 330 | return !in_interrupt() || !(regs = get_irq_regs()) || \ | ||
| 331 | user_mode(regs) || (read_cr0() & X86_CR0_TS); | ||
| 332 | } | ||
| 333 | |||
| 334 | /* | 371 | /* |
| 335 | * Some instructions like VIA's padlock instructions generate a spurious | 372 | * Some instructions like VIA's padlock instructions generate a spurious |
| 336 | * DNA fault but don't modify SSE registers. And these instructions | 373 | * DNA fault but don't modify SSE registers. And these instructions |
| @@ -367,6 +404,7 @@ static inline void irq_ts_restore(int TS_state) | |||
| 367 | */ | 404 | */ |
| 368 | static inline void save_init_fpu(struct task_struct *tsk) | 405 | static inline void save_init_fpu(struct task_struct *tsk) |
| 369 | { | 406 | { |
| 407 | WARN_ON_ONCE(task_thread_info(tsk)->status & TS_USEDFPU); | ||
| 370 | preempt_disable(); | 408 | preempt_disable(); |
| 371 | __save_init_fpu(tsk); | 409 | __save_init_fpu(tsk); |
| 372 | stts(); | 410 | stts(); |
diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c index 482ec3af2067..8ba27dbc107a 100644 --- a/arch/x86/kernel/traps.c +++ b/arch/x86/kernel/traps.c | |||
| @@ -599,10 +599,10 @@ void __math_state_restore(void) | |||
| 599 | * Careful.. There are problems with IBM-designed IRQ13 behaviour. | 599 | * Careful.. There are problems with IBM-designed IRQ13 behaviour. |
| 600 | * Don't touch unless you *really* know how it works. | 600 | * Don't touch unless you *really* know how it works. |
| 601 | * | 601 | * |
| 602 | * Must be called with kernel preemption disabled (in this case, | 602 | * Must be called with kernel preemption disabled (eg with local |
| 603 | * local interrupts are disabled at the call-site in entry.S). | 603 | * local interrupts as in the case of do_device_not_available). |
| 604 | */ | 604 | */ |
| 605 | asmlinkage void math_state_restore(void) | 605 | void math_state_restore(void) |
| 606 | { | 606 | { |
| 607 | struct thread_info *thread = current_thread_info(); | 607 | struct thread_info *thread = current_thread_info(); |
| 608 | struct task_struct *tsk = thread->task; | 608 | struct task_struct *tsk = thread->task; |
| @@ -631,6 +631,7 @@ EXPORT_SYMBOL_GPL(math_state_restore); | |||
| 631 | dotraplinkage void __kprobes | 631 | dotraplinkage void __kprobes |
| 632 | do_device_not_available(struct pt_regs *regs, long error_code) | 632 | do_device_not_available(struct pt_regs *regs, long error_code) |
| 633 | { | 633 | { |
| 634 | WARN_ON_ONCE(!user_mode_vm(regs)); | ||
| 634 | #ifdef CONFIG_MATH_EMULATION | 635 | #ifdef CONFIG_MATH_EMULATION |
| 635 | if (read_cr0() & X86_CR0_EM) { | 636 | if (read_cr0() & X86_CR0_EM) { |
| 636 | struct math_emu_info info = { }; | 637 | struct math_emu_info info = { }; |
diff --git a/arch/x86/pci/xen.c b/arch/x86/pci/xen.c index 492ade8c978e..d99346ea8fdb 100644 --- a/arch/x86/pci/xen.c +++ b/arch/x86/pci/xen.c | |||
| @@ -374,7 +374,7 @@ int __init pci_xen_init(void) | |||
| 374 | 374 | ||
| 375 | int __init pci_xen_hvm_init(void) | 375 | int __init pci_xen_hvm_init(void) |
| 376 | { | 376 | { |
| 377 | if (!xen_feature(XENFEAT_hvm_pirqs)) | 377 | if (!xen_have_vector_callback || !xen_feature(XENFEAT_hvm_pirqs)) |
| 378 | return 0; | 378 | return 0; |
| 379 | 379 | ||
| 380 | #ifdef CONFIG_ACPI | 380 | #ifdef CONFIG_ACPI |
diff --git a/arch/x86/xen/smp.c b/arch/x86/xen/smp.c index 041d4fe9dfe4..501d4e0244ba 100644 --- a/arch/x86/xen/smp.c +++ b/arch/x86/xen/smp.c | |||
| @@ -409,6 +409,13 @@ static void __cpuinit xen_play_dead(void) /* used only with HOTPLUG_CPU */ | |||
| 409 | play_dead_common(); | 409 | play_dead_common(); |
| 410 | HYPERVISOR_vcpu_op(VCPUOP_down, smp_processor_id(), NULL); | 410 | HYPERVISOR_vcpu_op(VCPUOP_down, smp_processor_id(), NULL); |
| 411 | cpu_bringup(); | 411 | cpu_bringup(); |
| 412 | /* | ||
| 413 | * Balance out the preempt calls - as we are running in cpu_idle | ||
| 414 | * loop which has been called at bootup from cpu_bringup_and_idle. | ||
| 415 | * The cpucpu_bringup_and_idle called cpu_bringup which made a | ||
| 416 | * preempt_disable() So this preempt_enable will balance it out. | ||
| 417 | */ | ||
| 418 | preempt_enable(); | ||
| 412 | } | 419 | } |
| 413 | 420 | ||
| 414 | #else /* !CONFIG_HOTPLUG_CPU */ | 421 | #else /* !CONFIG_HOTPLUG_CPU */ |
diff --git a/crypto/sha512_generic.c b/crypto/sha512_generic.c index 88f160b77b1f..f04af931a682 100644 --- a/crypto/sha512_generic.c +++ b/crypto/sha512_generic.c | |||
| @@ -78,7 +78,7 @@ static inline void LOAD_OP(int I, u64 *W, const u8 *input) | |||
| 78 | 78 | ||
| 79 | static inline void BLEND_OP(int I, u64 *W) | 79 | static inline void BLEND_OP(int I, u64 *W) |
| 80 | { | 80 | { |
| 81 | W[I % 16] += s1(W[(I-2) % 16]) + W[(I-7) % 16] + s0(W[(I-15) % 16]); | 81 | W[I & 15] += s1(W[(I-2) & 15]) + W[(I-7) & 15] + s0(W[(I-15) & 15]); |
| 82 | } | 82 | } |
| 83 | 83 | ||
| 84 | static void | 84 | static void |
| @@ -89,46 +89,42 @@ sha512_transform(u64 *state, const u8 *input) | |||
| 89 | int i; | 89 | int i; |
| 90 | u64 W[16]; | 90 | u64 W[16]; |
| 91 | 91 | ||
| 92 | /* load the input */ | ||
| 93 | for (i = 0; i < 16; i++) | ||
| 94 | LOAD_OP(i, W, input); | ||
| 95 | |||
| 96 | /* load the state into our registers */ | 92 | /* load the state into our registers */ |
| 97 | a=state[0]; b=state[1]; c=state[2]; d=state[3]; | 93 | a=state[0]; b=state[1]; c=state[2]; d=state[3]; |
| 98 | e=state[4]; f=state[5]; g=state[6]; h=state[7]; | 94 | e=state[4]; f=state[5]; g=state[6]; h=state[7]; |
| 99 | 95 | ||
| 100 | #define SHA512_0_15(i, a, b, c, d, e, f, g, h) \ | 96 | /* now iterate */ |
| 101 | t1 = h + e1(e) + Ch(e, f, g) + sha512_K[i] + W[i]; \ | 97 | for (i=0; i<80; i+=8) { |
| 102 | t2 = e0(a) + Maj(a, b, c); \ | 98 | if (!(i & 8)) { |
| 103 | d += t1; \ | 99 | int j; |
| 104 | h = t1 + t2 | 100 | |
| 105 | 101 | if (i < 16) { | |
| 106 | #define SHA512_16_79(i, a, b, c, d, e, f, g, h) \ | 102 | /* load the input */ |
| 107 | BLEND_OP(i, W); \ | 103 | for (j = 0; j < 16; j++) |
| 108 | t1 = h + e1(e) + Ch(e, f, g) + sha512_K[i] + W[(i)%16]; \ | 104 | LOAD_OP(i + j, W, input); |
| 109 | t2 = e0(a) + Maj(a, b, c); \ | 105 | } else { |
| 110 | d += t1; \ | 106 | for (j = 0; j < 16; j++) { |
| 111 | h = t1 + t2 | 107 | BLEND_OP(i + j, W); |
| 112 | 108 | } | |
| 113 | for (i = 0; i < 16; i += 8) { | 109 | } |
| 114 | SHA512_0_15(i, a, b, c, d, e, f, g, h); | 110 | } |
| 115 | SHA512_0_15(i + 1, h, a, b, c, d, e, f, g); | 111 | |
| 116 | SHA512_0_15(i + 2, g, h, a, b, c, d, e, f); | 112 | t1 = h + e1(e) + Ch(e,f,g) + sha512_K[i ] + W[(i & 15)]; |
| 117 | SHA512_0_15(i + 3, f, g, h, a, b, c, d, e); | 113 | t2 = e0(a) + Maj(a,b,c); d+=t1; h=t1+t2; |
| 118 | SHA512_0_15(i + 4, e, f, g, h, a, b, c, d); | 114 | t1 = g + e1(d) + Ch(d,e,f) + sha512_K[i+1] + W[(i & 15) + 1]; |
| 119 | SHA512_0_15(i + 5, d, e, f, g, h, a, b, c); | 115 | t2 = e0(h) + Maj(h,a,b); c+=t1; g=t1+t2; |
| 120 | SHA512_0_15(i + 6, c, d, e, f, g, h, a, b); | 116 | t1 = f + e1(c) + Ch(c,d,e) + sha512_K[i+2] + W[(i & 15) + 2]; |
| 121 | SHA512_0_15(i + 7, b, c, d, e, f, g, h, a); | 117 | t2 = e0(g) + Maj(g,h,a); b+=t1; f=t1+t2; |
| 122 | } | 118 | t1 = e + e1(b) + Ch(b,c,d) + sha512_K[i+3] + W[(i & 15) + 3]; |
| 123 | for (i = 16; i < 80; i += 8) { | 119 | t2 = e0(f) + Maj(f,g,h); a+=t1; e=t1+t2; |
| 124 | SHA512_16_79(i, a, b, c, d, e, f, g, h); | 120 | t1 = d + e1(a) + Ch(a,b,c) + sha512_K[i+4] + W[(i & 15) + 4]; |
| 125 | SHA512_16_79(i + 1, h, a, b, c, d, e, f, g); | 121 | t2 = e0(e) + Maj(e,f,g); h+=t1; d=t1+t2; |
| 126 | SHA512_16_79(i + 2, g, h, a, b, c, d, e, f); | 122 | t1 = c + e1(h) + Ch(h,a,b) + sha512_K[i+5] + W[(i & 15) + 5]; |
| 127 | SHA512_16_79(i + 3, f, g, h, a, b, c, d, e); | 123 | t2 = e0(d) + Maj(d,e,f); g+=t1; c=t1+t2; |
| 128 | SHA512_16_79(i + 4, e, f, g, h, a, b, c, d); | 124 | t1 = b + e1(g) + Ch(g,h,a) + sha512_K[i+6] + W[(i & 15) + 6]; |
| 129 | SHA512_16_79(i + 5, d, e, f, g, h, a, b, c); | 125 | t2 = e0(c) + Maj(c,d,e); f+=t1; b=t1+t2; |
| 130 | SHA512_16_79(i + 6, c, d, e, f, g, h, a, b); | 126 | t1 = a + e1(f) + Ch(f,g,h) + sha512_K[i+7] + W[(i & 15) + 7]; |
| 131 | SHA512_16_79(i + 7, b, c, d, e, f, g, h, a); | 127 | t2 = e0(b) + Maj(b,c,d); e+=t1; a=t1+t2; |
| 132 | } | 128 | } |
| 133 | 129 | ||
| 134 | state[0] += a; state[1] += b; state[2] += c; state[3] += d; | 130 | state[0] += a; state[1] += b; state[2] += c; state[3] += d; |
diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig index cd13e9f2f5e6..f147395bac9a 100644 --- a/drivers/mfd/Kconfig +++ b/drivers/mfd/Kconfig | |||
| @@ -200,7 +200,7 @@ config MENELAUS | |||
| 200 | 200 | ||
| 201 | config TWL4030_CORE | 201 | config TWL4030_CORE |
| 202 | bool "Texas Instruments TWL4030/TWL5030/TWL6030/TPS659x0 Support" | 202 | bool "Texas Instruments TWL4030/TWL5030/TWL6030/TPS659x0 Support" |
| 203 | depends on I2C=y && GENERIC_HARDIRQS && IRQ_DOMAIN | 203 | depends on I2C=y && GENERIC_HARDIRQS |
| 204 | help | 204 | help |
| 205 | Say yes here if you have TWL4030 / TWL6030 family chip on your board. | 205 | Say yes here if you have TWL4030 / TWL6030 family chip on your board. |
| 206 | This core driver provides register access and IRQ handling | 206 | This core driver provides register access and IRQ handling |
diff --git a/drivers/mfd/twl-core.c b/drivers/mfd/twl-core.c index e04e04ddc15e..8ce3959c6919 100644 --- a/drivers/mfd/twl-core.c +++ b/drivers/mfd/twl-core.c | |||
| @@ -263,7 +263,9 @@ struct twl_client { | |||
| 263 | 263 | ||
| 264 | static struct twl_client twl_modules[TWL_NUM_SLAVES]; | 264 | static struct twl_client twl_modules[TWL_NUM_SLAVES]; |
| 265 | 265 | ||
| 266 | #ifdef CONFIG_IRQ_DOMAIN | ||
| 266 | static struct irq_domain domain; | 267 | static struct irq_domain domain; |
| 268 | #endif | ||
| 267 | 269 | ||
| 268 | /* mapping the module id to slave id and base address */ | 270 | /* mapping the module id to slave id and base address */ |
| 269 | struct twl_mapping { | 271 | struct twl_mapping { |
| @@ -1226,13 +1228,13 @@ twl_probe(struct i2c_client *client, const struct i2c_device_id *id) | |||
| 1226 | pdata->irq_base = status; | 1228 | pdata->irq_base = status; |
| 1227 | pdata->irq_end = pdata->irq_base + nr_irqs; | 1229 | pdata->irq_end = pdata->irq_base + nr_irqs; |
| 1228 | 1230 | ||
| 1231 | #ifdef CONFIG_IRQ_DOMAIN | ||
| 1229 | domain.irq_base = pdata->irq_base; | 1232 | domain.irq_base = pdata->irq_base; |
| 1230 | domain.nr_irq = nr_irqs; | 1233 | domain.nr_irq = nr_irqs; |
| 1231 | #ifdef CONFIG_OF_IRQ | ||
| 1232 | domain.of_node = of_node_get(node); | 1234 | domain.of_node = of_node_get(node); |
| 1233 | domain.ops = &irq_domain_simple_ops; | 1235 | domain.ops = &irq_domain_simple_ops; |
| 1234 | #endif | ||
| 1235 | irq_domain_add(&domain); | 1236 | irq_domain_add(&domain); |
| 1237 | #endif | ||
| 1236 | 1238 | ||
| 1237 | if (i2c_check_functionality(client->adapter, I2C_FUNC_I2C) == 0) { | 1239 | if (i2c_check_functionality(client->adapter, I2C_FUNC_I2C) == 0) { |
| 1238 | dev_dbg(&client->dev, "can't talk I2C?\n"); | 1240 | dev_dbg(&client->dev, "can't talk I2C?\n"); |
diff --git a/drivers/mfd/twl4030-power.c b/drivers/mfd/twl4030-power.c index d905f5171153..79ca33dfacca 100644 --- a/drivers/mfd/twl4030-power.c +++ b/drivers/mfd/twl4030-power.c | |||
| @@ -124,7 +124,7 @@ static u8 res_config_addrs[] = { | |||
| 124 | [RES_MAIN_REF] = 0x94, | 124 | [RES_MAIN_REF] = 0x94, |
| 125 | }; | 125 | }; |
| 126 | 126 | ||
| 127 | static int __init twl4030_write_script_byte(u8 address, u8 byte) | 127 | static int __devinit twl4030_write_script_byte(u8 address, u8 byte) |
| 128 | { | 128 | { |
| 129 | int err; | 129 | int err; |
| 130 | 130 | ||
| @@ -138,7 +138,7 @@ out: | |||
| 138 | return err; | 138 | return err; |
| 139 | } | 139 | } |
| 140 | 140 | ||
| 141 | static int __init twl4030_write_script_ins(u8 address, u16 pmb_message, | 141 | static int __devinit twl4030_write_script_ins(u8 address, u16 pmb_message, |
| 142 | u8 delay, u8 next) | 142 | u8 delay, u8 next) |
| 143 | { | 143 | { |
| 144 | int err; | 144 | int err; |
| @@ -158,7 +158,7 @@ out: | |||
| 158 | return err; | 158 | return err; |
| 159 | } | 159 | } |
| 160 | 160 | ||
| 161 | static int __init twl4030_write_script(u8 address, struct twl4030_ins *script, | 161 | static int __devinit twl4030_write_script(u8 address, struct twl4030_ins *script, |
| 162 | int len) | 162 | int len) |
| 163 | { | 163 | { |
| 164 | int err; | 164 | int err; |
| @@ -183,7 +183,7 @@ static int __init twl4030_write_script(u8 address, struct twl4030_ins *script, | |||
| 183 | return err; | 183 | return err; |
| 184 | } | 184 | } |
| 185 | 185 | ||
| 186 | static int __init twl4030_config_wakeup3_sequence(u8 address) | 186 | static int __devinit twl4030_config_wakeup3_sequence(u8 address) |
| 187 | { | 187 | { |
| 188 | int err; | 188 | int err; |
| 189 | u8 data; | 189 | u8 data; |
| @@ -208,7 +208,7 @@ out: | |||
| 208 | return err; | 208 | return err; |
| 209 | } | 209 | } |
| 210 | 210 | ||
| 211 | static int __init twl4030_config_wakeup12_sequence(u8 address) | 211 | static int __devinit twl4030_config_wakeup12_sequence(u8 address) |
| 212 | { | 212 | { |
| 213 | int err = 0; | 213 | int err = 0; |
| 214 | u8 data; | 214 | u8 data; |
| @@ -262,7 +262,7 @@ out: | |||
| 262 | return err; | 262 | return err; |
| 263 | } | 263 | } |
| 264 | 264 | ||
| 265 | static int __init twl4030_config_sleep_sequence(u8 address) | 265 | static int __devinit twl4030_config_sleep_sequence(u8 address) |
| 266 | { | 266 | { |
| 267 | int err; | 267 | int err; |
| 268 | 268 | ||
| @@ -276,7 +276,7 @@ static int __init twl4030_config_sleep_sequence(u8 address) | |||
| 276 | return err; | 276 | return err; |
| 277 | } | 277 | } |
| 278 | 278 | ||
| 279 | static int __init twl4030_config_warmreset_sequence(u8 address) | 279 | static int __devinit twl4030_config_warmreset_sequence(u8 address) |
| 280 | { | 280 | { |
| 281 | int err; | 281 | int err; |
| 282 | u8 rd_data; | 282 | u8 rd_data; |
| @@ -324,7 +324,7 @@ out: | |||
| 324 | return err; | 324 | return err; |
| 325 | } | 325 | } |
| 326 | 326 | ||
| 327 | static int __init twl4030_configure_resource(struct twl4030_resconfig *rconfig) | 327 | static int __devinit twl4030_configure_resource(struct twl4030_resconfig *rconfig) |
| 328 | { | 328 | { |
| 329 | int rconfig_addr; | 329 | int rconfig_addr; |
| 330 | int err; | 330 | int err; |
| @@ -416,7 +416,7 @@ static int __init twl4030_configure_resource(struct twl4030_resconfig *rconfig) | |||
| 416 | return 0; | 416 | return 0; |
| 417 | } | 417 | } |
| 418 | 418 | ||
| 419 | static int __init load_twl4030_script(struct twl4030_script *tscript, | 419 | static int __devinit load_twl4030_script(struct twl4030_script *tscript, |
| 420 | u8 address) | 420 | u8 address) |
| 421 | { | 421 | { |
| 422 | int err; | 422 | int err; |
| @@ -527,7 +527,7 @@ void twl4030_power_off(void) | |||
| 527 | pr_err("TWL4030 Unable to power off\n"); | 527 | pr_err("TWL4030 Unable to power off\n"); |
| 528 | } | 528 | } |
| 529 | 529 | ||
| 530 | void __init twl4030_power_init(struct twl4030_power_data *twl4030_scripts) | 530 | void __devinit twl4030_power_init(struct twl4030_power_data *twl4030_scripts) |
| 531 | { | 531 | { |
| 532 | int err = 0; | 532 | int err = 0; |
| 533 | int i; | 533 | int i; |
diff --git a/drivers/pci/xen-pcifront.c b/drivers/pci/xen-pcifront.c index 7cf3d2fcf56a..1620088a0e7e 100644 --- a/drivers/pci/xen-pcifront.c +++ b/drivers/pci/xen-pcifront.c | |||
| @@ -189,7 +189,7 @@ static int pcifront_bus_read(struct pci_bus *bus, unsigned int devfn, | |||
| 189 | 189 | ||
| 190 | if (verbose_request) | 190 | if (verbose_request) |
| 191 | dev_info(&pdev->xdev->dev, | 191 | dev_info(&pdev->xdev->dev, |
| 192 | "read dev=%04x:%02x:%02x.%01x - offset %x size %d\n", | 192 | "read dev=%04x:%02x:%02x.%d - offset %x size %d\n", |
| 193 | pci_domain_nr(bus), bus->number, PCI_SLOT(devfn), | 193 | pci_domain_nr(bus), bus->number, PCI_SLOT(devfn), |
| 194 | PCI_FUNC(devfn), where, size); | 194 | PCI_FUNC(devfn), where, size); |
| 195 | 195 | ||
| @@ -228,7 +228,7 @@ static int pcifront_bus_write(struct pci_bus *bus, unsigned int devfn, | |||
| 228 | 228 | ||
| 229 | if (verbose_request) | 229 | if (verbose_request) |
| 230 | dev_info(&pdev->xdev->dev, | 230 | dev_info(&pdev->xdev->dev, |
| 231 | "write dev=%04x:%02x:%02x.%01x - " | 231 | "write dev=%04x:%02x:%02x.%d - " |
| 232 | "offset %x size %d val %x\n", | 232 | "offset %x size %d val %x\n", |
| 233 | pci_domain_nr(bus), bus->number, | 233 | pci_domain_nr(bus), bus->number, |
| 234 | PCI_SLOT(devfn), PCI_FUNC(devfn), where, size, val); | 234 | PCI_SLOT(devfn), PCI_FUNC(devfn), where, size, val); |
| @@ -432,7 +432,7 @@ static int __devinit pcifront_scan_bus(struct pcifront_device *pdev, | |||
| 432 | d = pci_scan_single_device(b, devfn); | 432 | d = pci_scan_single_device(b, devfn); |
| 433 | if (d) | 433 | if (d) |
| 434 | dev_info(&pdev->xdev->dev, "New device on " | 434 | dev_info(&pdev->xdev->dev, "New device on " |
| 435 | "%04x:%02x:%02x.%02x found.\n", domain, bus, | 435 | "%04x:%02x:%02x.%d found.\n", domain, bus, |
| 436 | PCI_SLOT(devfn), PCI_FUNC(devfn)); | 436 | PCI_SLOT(devfn), PCI_FUNC(devfn)); |
| 437 | } | 437 | } |
| 438 | 438 | ||
| @@ -1041,7 +1041,7 @@ static int pcifront_detach_devices(struct pcifront_device *pdev) | |||
| 1041 | pci_dev = pci_get_slot(pci_bus, PCI_DEVFN(slot, func)); | 1041 | pci_dev = pci_get_slot(pci_bus, PCI_DEVFN(slot, func)); |
| 1042 | if (!pci_dev) { | 1042 | if (!pci_dev) { |
| 1043 | dev_dbg(&pdev->xdev->dev, | 1043 | dev_dbg(&pdev->xdev->dev, |
| 1044 | "Cannot get PCI device %04x:%02x:%02x.%02x\n", | 1044 | "Cannot get PCI device %04x:%02x:%02x.%d\n", |
| 1045 | domain, bus, slot, func); | 1045 | domain, bus, slot, func); |
| 1046 | continue; | 1046 | continue; |
| 1047 | } | 1047 | } |
| @@ -1049,7 +1049,7 @@ static int pcifront_detach_devices(struct pcifront_device *pdev) | |||
| 1049 | pci_dev_put(pci_dev); | 1049 | pci_dev_put(pci_dev); |
| 1050 | 1050 | ||
| 1051 | dev_dbg(&pdev->xdev->dev, | 1051 | dev_dbg(&pdev->xdev->dev, |
| 1052 | "PCI device %04x:%02x:%02x.%02x removed.\n", | 1052 | "PCI device %04x:%02x:%02x.%d removed.\n", |
| 1053 | domain, bus, slot, func); | 1053 | domain, bus, slot, func); |
| 1054 | } | 1054 | } |
| 1055 | 1055 | ||
diff --git a/drivers/power/bq27x00_battery.c b/drivers/power/bq27x00_battery.c index 98bf5676318d..1ed6ea0bad6e 100644 --- a/drivers/power/bq27x00_battery.c +++ b/drivers/power/bq27x00_battery.c | |||
| @@ -62,11 +62,10 @@ | |||
| 62 | 62 | ||
| 63 | #define BQ27500_REG_SOC 0x2C | 63 | #define BQ27500_REG_SOC 0x2C |
| 64 | #define BQ27500_REG_DCAP 0x3C /* Design capacity */ | 64 | #define BQ27500_REG_DCAP 0x3C /* Design capacity */ |
| 65 | #define BQ27500_FLAG_DSG BIT(0) /* Discharging */ | 65 | #define BQ27500_FLAG_DSC BIT(0) |
| 66 | #define BQ27500_FLAG_SOCF BIT(1) /* State-of-Charge threshold final */ | 66 | #define BQ27500_FLAG_SOCF BIT(1) /* State-of-Charge threshold final */ |
| 67 | #define BQ27500_FLAG_SOC1 BIT(2) /* State-of-Charge threshold 1 */ | 67 | #define BQ27500_FLAG_SOC1 BIT(2) /* State-of-Charge threshold 1 */ |
| 68 | #define BQ27500_FLAG_CHG BIT(8) /* Charging */ | 68 | #define BQ27500_FLAG_FC BIT(9) |
| 69 | #define BQ27500_FLAG_FC BIT(9) /* Fully charged */ | ||
| 70 | 69 | ||
| 71 | #define BQ27000_RS 20 /* Resistor sense */ | 70 | #define BQ27000_RS 20 /* Resistor sense */ |
| 72 | 71 | ||
| @@ -312,7 +311,7 @@ static void bq27x00_update(struct bq27x00_device_info *di) | |||
| 312 | struct bq27x00_reg_cache cache = {0, }; | 311 | struct bq27x00_reg_cache cache = {0, }; |
| 313 | bool is_bq27500 = di->chip == BQ27500; | 312 | bool is_bq27500 = di->chip == BQ27500; |
| 314 | 313 | ||
| 315 | cache.flags = bq27x00_read(di, BQ27x00_REG_FLAGS, is_bq27500); | 314 | cache.flags = bq27x00_read(di, BQ27x00_REG_FLAGS, !is_bq27500); |
| 316 | if (cache.flags >= 0) { | 315 | if (cache.flags >= 0) { |
| 317 | if (!is_bq27500 && (cache.flags & BQ27000_FLAG_CI)) { | 316 | if (!is_bq27500 && (cache.flags & BQ27000_FLAG_CI)) { |
| 318 | dev_info(di->dev, "battery is not calibrated! ignoring capacity values\n"); | 317 | dev_info(di->dev, "battery is not calibrated! ignoring capacity values\n"); |
| @@ -401,14 +400,10 @@ static int bq27x00_battery_status(struct bq27x00_device_info *di, | |||
| 401 | if (di->chip == BQ27500) { | 400 | if (di->chip == BQ27500) { |
| 402 | if (di->cache.flags & BQ27500_FLAG_FC) | 401 | if (di->cache.flags & BQ27500_FLAG_FC) |
| 403 | status = POWER_SUPPLY_STATUS_FULL; | 402 | status = POWER_SUPPLY_STATUS_FULL; |
| 404 | else if (di->cache.flags & BQ27500_FLAG_DSG) | 403 | else if (di->cache.flags & BQ27500_FLAG_DSC) |
| 405 | status = POWER_SUPPLY_STATUS_DISCHARGING; | 404 | status = POWER_SUPPLY_STATUS_DISCHARGING; |
| 406 | else if (di->cache.flags & BQ27500_FLAG_CHG) | ||
| 407 | status = POWER_SUPPLY_STATUS_CHARGING; | ||
| 408 | else if (power_supply_am_i_supplied(&di->bat)) | ||
| 409 | status = POWER_SUPPLY_STATUS_NOT_CHARGING; | ||
| 410 | else | 405 | else |
| 411 | status = POWER_SUPPLY_STATUS_UNKNOWN; | 406 | status = POWER_SUPPLY_STATUS_CHARGING; |
| 412 | } else { | 407 | } else { |
| 413 | if (di->cache.flags & BQ27000_FLAG_FC) | 408 | if (di->cache.flags & BQ27000_FLAG_FC) |
| 414 | status = POWER_SUPPLY_STATUS_FULL; | 409 | status = POWER_SUPPLY_STATUS_FULL; |
diff --git a/drivers/power/charger-manager.c b/drivers/power/charger-manager.c index 0378d019efae..88fd9710bda2 100644 --- a/drivers/power/charger-manager.c +++ b/drivers/power/charger-manager.c | |||
| @@ -974,10 +974,11 @@ static int __devexit charger_manager_remove(struct platform_device *pdev) | |||
| 974 | return 0; | 974 | return 0; |
| 975 | } | 975 | } |
| 976 | 976 | ||
| 977 | const struct platform_device_id charger_manager_id[] = { | 977 | static const struct platform_device_id charger_manager_id[] = { |
| 978 | { "charger-manager", 0 }, | 978 | { "charger-manager", 0 }, |
| 979 | { }, | 979 | { }, |
| 980 | }; | 980 | }; |
| 981 | MODULE_DEVICE_TABLE(platform, charger_manager_id); | ||
| 981 | 982 | ||
| 982 | static int cm_suspend_prepare(struct device *dev) | 983 | static int cm_suspend_prepare(struct device *dev) |
| 983 | { | 984 | { |
| @@ -1069,4 +1070,3 @@ module_exit(charger_manager_cleanup); | |||
| 1069 | MODULE_AUTHOR("MyungJoo Ham <myungjoo.ham@samsung.com>"); | 1070 | MODULE_AUTHOR("MyungJoo Ham <myungjoo.ham@samsung.com>"); |
| 1070 | MODULE_DESCRIPTION("Charger Manager"); | 1071 | MODULE_DESCRIPTION("Charger Manager"); |
| 1071 | MODULE_LICENSE("GPL"); | 1072 | MODULE_LICENSE("GPL"); |
| 1072 | MODULE_ALIAS("charger-manager"); | ||
diff --git a/drivers/power/lp8727_charger.c b/drivers/power/lp8727_charger.c index b15b575c070c..c53dd1292f81 100644 --- a/drivers/power/lp8727_charger.c +++ b/drivers/power/lp8727_charger.c | |||
| @@ -464,6 +464,7 @@ static int __devexit lp8727_remove(struct i2c_client *cl) | |||
| 464 | 464 | ||
| 465 | static const struct i2c_device_id lp8727_ids[] = { | 465 | static const struct i2c_device_id lp8727_ids[] = { |
| 466 | {"lp8727", 0}, | 466 | {"lp8727", 0}, |
| 467 | { } | ||
| 467 | }; | 468 | }; |
| 468 | 469 | ||
| 469 | static struct i2c_driver lp8727_driver = { | 470 | static struct i2c_driver lp8727_driver = { |
diff --git a/drivers/video/omap2/dss/dpi.c b/drivers/video/omap2/dss/dpi.c index 395d658a94fc..faaf305fda27 100644 --- a/drivers/video/omap2/dss/dpi.c +++ b/drivers/video/omap2/dss/dpi.c | |||
| @@ -180,6 +180,11 @@ int omapdss_dpi_display_enable(struct omap_dss_device *dssdev) | |||
| 180 | { | 180 | { |
| 181 | int r; | 181 | int r; |
| 182 | 182 | ||
| 183 | if (cpu_is_omap34xx() && !dpi.vdds_dsi_reg) { | ||
| 184 | DSSERR("no VDSS_DSI regulator\n"); | ||
| 185 | return -ENODEV; | ||
| 186 | } | ||
| 187 | |||
| 183 | if (dssdev->manager == NULL) { | 188 | if (dssdev->manager == NULL) { |
| 184 | DSSERR("failed to enable display: no manager\n"); | 189 | DSSERR("failed to enable display: no manager\n"); |
| 185 | return -ENODEV; | 190 | return -ENODEV; |
diff --git a/drivers/xen/cpu_hotplug.c b/drivers/xen/cpu_hotplug.c index 14e2d995e958..4dcfced107f5 100644 --- a/drivers/xen/cpu_hotplug.c +++ b/drivers/xen/cpu_hotplug.c | |||
| @@ -30,7 +30,8 @@ static int vcpu_online(unsigned int cpu) | |||
| 30 | sprintf(dir, "cpu/%u", cpu); | 30 | sprintf(dir, "cpu/%u", cpu); |
| 31 | err = xenbus_scanf(XBT_NIL, dir, "availability", "%s", state); | 31 | err = xenbus_scanf(XBT_NIL, dir, "availability", "%s", state); |
| 32 | if (err != 1) { | 32 | if (err != 1) { |
| 33 | printk(KERN_ERR "XENBUS: Unable to read cpu state\n"); | 33 | if (!xen_initial_domain()) |
| 34 | printk(KERN_ERR "XENBUS: Unable to read cpu state\n"); | ||
| 34 | return err; | 35 | return err; |
| 35 | } | 36 | } |
| 36 | 37 | ||
diff --git a/drivers/xen/xen-pciback/pci_stub.c b/drivers/xen/xen-pciback/pci_stub.c index 7944a17f5cbf..19834d1c7c36 100644 --- a/drivers/xen/xen-pciback/pci_stub.c +++ b/drivers/xen/xen-pciback/pci_stub.c | |||
| @@ -884,7 +884,7 @@ static inline int str_to_quirk(const char *buf, int *domain, int *bus, int | |||
| 884 | int err; | 884 | int err; |
| 885 | 885 | ||
| 886 | err = | 886 | err = |
| 887 | sscanf(buf, " %04x:%02x:%02x.%1x-%08x:%1x:%08x", domain, bus, slot, | 887 | sscanf(buf, " %04x:%02x:%02x.%d-%08x:%1x:%08x", domain, bus, slot, |
| 888 | func, reg, size, mask); | 888 | func, reg, size, mask); |
| 889 | if (err == 7) | 889 | if (err == 7) |
| 890 | return 0; | 890 | return 0; |
| @@ -904,7 +904,7 @@ static int pcistub_device_id_add(int domain, int bus, int slot, int func) | |||
| 904 | pci_dev_id->bus = bus; | 904 | pci_dev_id->bus = bus; |
| 905 | pci_dev_id->devfn = PCI_DEVFN(slot, func); | 905 | pci_dev_id->devfn = PCI_DEVFN(slot, func); |
| 906 | 906 | ||
| 907 | pr_debug(DRV_NAME ": wants to seize %04x:%02x:%02x.%01x\n", | 907 | pr_debug(DRV_NAME ": wants to seize %04x:%02x:%02x.%d\n", |
| 908 | domain, bus, slot, func); | 908 | domain, bus, slot, func); |
| 909 | 909 | ||
| 910 | spin_lock_irqsave(&device_ids_lock, flags); | 910 | spin_lock_irqsave(&device_ids_lock, flags); |
| @@ -934,7 +934,7 @@ static int pcistub_device_id_remove(int domain, int bus, int slot, int func) | |||
| 934 | 934 | ||
| 935 | err = 0; | 935 | err = 0; |
| 936 | 936 | ||
| 937 | pr_debug(DRV_NAME ": removed %04x:%02x:%02x.%01x from " | 937 | pr_debug(DRV_NAME ": removed %04x:%02x:%02x.%d from " |
| 938 | "seize list\n", domain, bus, slot, func); | 938 | "seize list\n", domain, bus, slot, func); |
| 939 | } | 939 | } |
| 940 | } | 940 | } |
| @@ -1029,7 +1029,7 @@ static ssize_t pcistub_slot_show(struct device_driver *drv, char *buf) | |||
| 1029 | break; | 1029 | break; |
| 1030 | 1030 | ||
| 1031 | count += scnprintf(buf + count, PAGE_SIZE - count, | 1031 | count += scnprintf(buf + count, PAGE_SIZE - count, |
| 1032 | "%04x:%02x:%02x.%01x\n", | 1032 | "%04x:%02x:%02x.%d\n", |
| 1033 | pci_dev_id->domain, pci_dev_id->bus, | 1033 | pci_dev_id->domain, pci_dev_id->bus, |
| 1034 | PCI_SLOT(pci_dev_id->devfn), | 1034 | PCI_SLOT(pci_dev_id->devfn), |
| 1035 | PCI_FUNC(pci_dev_id->devfn)); | 1035 | PCI_FUNC(pci_dev_id->devfn)); |
diff --git a/drivers/xen/xen-pciback/xenbus.c b/drivers/xen/xen-pciback/xenbus.c index d5dcf8d5d3d9..64b11f99eacc 100644 --- a/drivers/xen/xen-pciback/xenbus.c +++ b/drivers/xen/xen-pciback/xenbus.c | |||
| @@ -206,6 +206,7 @@ static int xen_pcibk_publish_pci_dev(struct xen_pcibk_device *pdev, | |||
| 206 | goto out; | 206 | goto out; |
| 207 | } | 207 | } |
| 208 | 208 | ||
| 209 | /* Note: The PV protocol uses %02x, don't change it */ | ||
| 209 | err = xenbus_printf(XBT_NIL, pdev->xdev->nodename, str, | 210 | err = xenbus_printf(XBT_NIL, pdev->xdev->nodename, str, |
| 210 | "%04x:%02x:%02x.%02x", domain, bus, | 211 | "%04x:%02x:%02x.%02x", domain, bus, |
| 211 | PCI_SLOT(devfn), PCI_FUNC(devfn)); | 212 | PCI_SLOT(devfn), PCI_FUNC(devfn)); |
| @@ -229,7 +230,7 @@ static int xen_pcibk_export_device(struct xen_pcibk_device *pdev, | |||
| 229 | err = -EINVAL; | 230 | err = -EINVAL; |
| 230 | xenbus_dev_fatal(pdev->xdev, err, | 231 | xenbus_dev_fatal(pdev->xdev, err, |
| 231 | "Couldn't locate PCI device " | 232 | "Couldn't locate PCI device " |
| 232 | "(%04x:%02x:%02x.%01x)! " | 233 | "(%04x:%02x:%02x.%d)! " |
| 233 | "perhaps already in-use?", | 234 | "perhaps already in-use?", |
| 234 | domain, bus, slot, func); | 235 | domain, bus, slot, func); |
| 235 | goto out; | 236 | goto out; |
| @@ -274,7 +275,7 @@ static int xen_pcibk_remove_device(struct xen_pcibk_device *pdev, | |||
| 274 | if (!dev) { | 275 | if (!dev) { |
| 275 | err = -EINVAL; | 276 | err = -EINVAL; |
| 276 | dev_dbg(&pdev->xdev->dev, "Couldn't locate PCI device " | 277 | dev_dbg(&pdev->xdev->dev, "Couldn't locate PCI device " |
| 277 | "(%04x:%02x:%02x.%01x)! not owned by this domain\n", | 278 | "(%04x:%02x:%02x.%d)! not owned by this domain\n", |
| 278 | domain, bus, slot, func); | 279 | domain, bus, slot, func); |
| 279 | goto out; | 280 | goto out; |
| 280 | } | 281 | } |
diff --git a/drivers/xen/xenbus/xenbus_dev_frontend.c b/drivers/xen/xenbus/xenbus_dev_frontend.c index 527dc2a3b89f..89f76252a16f 100644 --- a/drivers/xen/xenbus/xenbus_dev_frontend.c +++ b/drivers/xen/xenbus/xenbus_dev_frontend.c | |||
| @@ -369,6 +369,10 @@ static int xenbus_write_watch(unsigned msg_type, struct xenbus_file_priv *u) | |||
| 369 | goto out; | 369 | goto out; |
| 370 | } | 370 | } |
| 371 | token++; | 371 | token++; |
| 372 | if (memchr(token, 0, u->u.msg.len - (token - path)) == NULL) { | ||
| 373 | rc = -EILSEQ; | ||
| 374 | goto out; | ||
| 375 | } | ||
| 372 | 376 | ||
| 373 | if (msg_type == XS_WATCH) { | 377 | if (msg_type == XS_WATCH) { |
| 374 | watch = alloc_watch_adapter(path, token); | 378 | watch = alloc_watch_adapter(path, token); |
diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c index 9c288653e6d6..602f77c304c9 100644 --- a/fs/cifs/connect.c +++ b/fs/cifs/connect.c | |||
| @@ -773,10 +773,11 @@ standard_receive3(struct TCP_Server_Info *server, struct mid_q_entry *mid) | |||
| 773 | cifs_dump_mem("Bad SMB: ", buf, | 773 | cifs_dump_mem("Bad SMB: ", buf, |
| 774 | min_t(unsigned int, server->total_read, 48)); | 774 | min_t(unsigned int, server->total_read, 48)); |
| 775 | 775 | ||
| 776 | if (mid) | 776 | if (!mid) |
| 777 | handle_mid(mid, server, smb_buffer, length); | 777 | return length; |
| 778 | 778 | ||
| 779 | return length; | 779 | handle_mid(mid, server, smb_buffer, length); |
| 780 | return 0; | ||
| 780 | } | 781 | } |
| 781 | 782 | ||
| 782 | static int | 783 | static int |
| @@ -2125,7 +2126,7 @@ cifs_set_cifscreds(struct smb_vol *vol, struct cifs_ses *ses) | |||
| 2125 | down_read(&key->sem); | 2126 | down_read(&key->sem); |
| 2126 | upayload = key->payload.data; | 2127 | upayload = key->payload.data; |
| 2127 | if (IS_ERR_OR_NULL(upayload)) { | 2128 | if (IS_ERR_OR_NULL(upayload)) { |
| 2128 | rc = PTR_ERR(key); | 2129 | rc = upayload ? PTR_ERR(upayload) : -EINVAL; |
| 2129 | goto out_key_put; | 2130 | goto out_key_put; |
| 2130 | } | 2131 | } |
| 2131 | 2132 | ||
diff --git a/fs/cifs/dir.c b/fs/cifs/dir.c index df8fecb5b993..63a196b97d50 100644 --- a/fs/cifs/dir.c +++ b/fs/cifs/dir.c | |||
| @@ -492,7 +492,7 @@ cifs_lookup(struct inode *parent_dir_inode, struct dentry *direntry, | |||
| 492 | { | 492 | { |
| 493 | int xid; | 493 | int xid; |
| 494 | int rc = 0; /* to get around spurious gcc warning, set to zero here */ | 494 | int rc = 0; /* to get around spurious gcc warning, set to zero here */ |
| 495 | __u32 oplock = 0; | 495 | __u32 oplock = enable_oplocks ? REQ_OPLOCK : 0; |
| 496 | __u16 fileHandle = 0; | 496 | __u16 fileHandle = 0; |
| 497 | bool posix_open = false; | 497 | bool posix_open = false; |
| 498 | struct cifs_sb_info *cifs_sb; | 498 | struct cifs_sb_info *cifs_sb; |
diff --git a/fs/xfs/kmem.h b/fs/xfs/kmem.h index 292eff198030..ab7c53fe346e 100644 --- a/fs/xfs/kmem.h +++ b/fs/xfs/kmem.h | |||
| @@ -110,10 +110,4 @@ kmem_zone_destroy(kmem_zone_t *zone) | |||
| 110 | extern void *kmem_zone_alloc(kmem_zone_t *, unsigned int __nocast); | 110 | extern void *kmem_zone_alloc(kmem_zone_t *, unsigned int __nocast); |
| 111 | extern void *kmem_zone_zalloc(kmem_zone_t *, unsigned int __nocast); | 111 | extern void *kmem_zone_zalloc(kmem_zone_t *, unsigned int __nocast); |
| 112 | 112 | ||
| 113 | static inline int | ||
| 114 | kmem_shake_allow(gfp_t gfp_mask) | ||
| 115 | { | ||
| 116 | return ((gfp_mask & __GFP_WAIT) && (gfp_mask & __GFP_FS)); | ||
| 117 | } | ||
| 118 | |||
| 119 | #endif /* __XFS_SUPPORT_KMEM_H__ */ | 113 | #endif /* __XFS_SUPPORT_KMEM_H__ */ |
diff --git a/fs/xfs/xfs_dquot.c b/fs/xfs/xfs_dquot.c index b4ff40b5f918..cbcb7bea38e2 100644 --- a/fs/xfs/xfs_dquot.c +++ b/fs/xfs/xfs_dquot.c | |||
| @@ -63,82 +63,6 @@ int xfs_dqerror_mod = 33; | |||
| 63 | static struct lock_class_key xfs_dquot_other_class; | 63 | static struct lock_class_key xfs_dquot_other_class; |
| 64 | 64 | ||
| 65 | /* | 65 | /* |
| 66 | * Allocate and initialize a dquot. We don't always allocate fresh memory; | ||
| 67 | * we try to reclaim a free dquot if the number of incore dquots are above | ||
| 68 | * a threshold. | ||
| 69 | * The only field inside the core that gets initialized at this point | ||
| 70 | * is the d_id field. The idea is to fill in the entire q_core | ||
| 71 | * when we read in the on disk dquot. | ||
| 72 | */ | ||
| 73 | STATIC xfs_dquot_t * | ||
| 74 | xfs_qm_dqinit( | ||
| 75 | xfs_mount_t *mp, | ||
| 76 | xfs_dqid_t id, | ||
| 77 | uint type) | ||
| 78 | { | ||
| 79 | xfs_dquot_t *dqp; | ||
| 80 | boolean_t brandnewdquot; | ||
| 81 | |||
| 82 | brandnewdquot = xfs_qm_dqalloc_incore(&dqp); | ||
| 83 | dqp->dq_flags = type; | ||
| 84 | dqp->q_core.d_id = cpu_to_be32(id); | ||
| 85 | dqp->q_mount = mp; | ||
| 86 | |||
| 87 | /* | ||
| 88 | * No need to re-initialize these if this is a reclaimed dquot. | ||
| 89 | */ | ||
| 90 | if (brandnewdquot) { | ||
| 91 | INIT_LIST_HEAD(&dqp->q_freelist); | ||
| 92 | mutex_init(&dqp->q_qlock); | ||
| 93 | init_waitqueue_head(&dqp->q_pinwait); | ||
| 94 | |||
| 95 | /* | ||
| 96 | * Because we want to use a counting completion, complete | ||
| 97 | * the flush completion once to allow a single access to | ||
| 98 | * the flush completion without blocking. | ||
| 99 | */ | ||
| 100 | init_completion(&dqp->q_flush); | ||
| 101 | complete(&dqp->q_flush); | ||
| 102 | |||
| 103 | trace_xfs_dqinit(dqp); | ||
| 104 | } else { | ||
| 105 | /* | ||
| 106 | * Only the q_core portion was zeroed in dqreclaim_one(). | ||
| 107 | * So, we need to reset others. | ||
| 108 | */ | ||
| 109 | dqp->q_nrefs = 0; | ||
| 110 | dqp->q_blkno = 0; | ||
| 111 | INIT_LIST_HEAD(&dqp->q_mplist); | ||
| 112 | INIT_LIST_HEAD(&dqp->q_hashlist); | ||
| 113 | dqp->q_bufoffset = 0; | ||
| 114 | dqp->q_fileoffset = 0; | ||
| 115 | dqp->q_transp = NULL; | ||
| 116 | dqp->q_gdquot = NULL; | ||
| 117 | dqp->q_res_bcount = 0; | ||
| 118 | dqp->q_res_icount = 0; | ||
| 119 | dqp->q_res_rtbcount = 0; | ||
| 120 | atomic_set(&dqp->q_pincount, 0); | ||
| 121 | dqp->q_hash = NULL; | ||
| 122 | ASSERT(list_empty(&dqp->q_freelist)); | ||
| 123 | |||
| 124 | trace_xfs_dqreuse(dqp); | ||
| 125 | } | ||
| 126 | |||
| 127 | /* | ||
| 128 | * In either case we need to make sure group quotas have a different | ||
| 129 | * lock class than user quotas, to make sure lockdep knows we can | ||
| 130 | * locks of one of each at the same time. | ||
| 131 | */ | ||
| 132 | if (!(type & XFS_DQ_USER)) | ||
| 133 | lockdep_set_class(&dqp->q_qlock, &xfs_dquot_other_class); | ||
| 134 | |||
| 135 | /* | ||
| 136 | * log item gets initialized later | ||
| 137 | */ | ||
| 138 | return (dqp); | ||
| 139 | } | ||
| 140 | |||
| 141 | /* | ||
| 142 | * This is called to free all the memory associated with a dquot | 66 | * This is called to free all the memory associated with a dquot |
| 143 | */ | 67 | */ |
| 144 | void | 68 | void |
| @@ -567,7 +491,32 @@ xfs_qm_dqread( | |||
| 567 | int error; | 491 | int error; |
| 568 | int cancelflags = 0; | 492 | int cancelflags = 0; |
| 569 | 493 | ||
| 570 | dqp = xfs_qm_dqinit(mp, id, type); | 494 | |
| 495 | dqp = kmem_zone_zalloc(xfs_Gqm->qm_dqzone, KM_SLEEP); | ||
| 496 | |||
| 497 | dqp->dq_flags = type; | ||
| 498 | dqp->q_core.d_id = cpu_to_be32(id); | ||
| 499 | dqp->q_mount = mp; | ||
| 500 | INIT_LIST_HEAD(&dqp->q_freelist); | ||
| 501 | mutex_init(&dqp->q_qlock); | ||
| 502 | init_waitqueue_head(&dqp->q_pinwait); | ||
| 503 | |||
| 504 | /* | ||
| 505 | * Because we want to use a counting completion, complete | ||
| 506 | * the flush completion once to allow a single access to | ||
| 507 | * the flush completion without blocking. | ||
| 508 | */ | ||
| 509 | init_completion(&dqp->q_flush); | ||
| 510 | complete(&dqp->q_flush); | ||
| 511 | |||
| 512 | /* | ||
| 513 | * Make sure group quotas have a different lock class than user | ||
| 514 | * quotas. | ||
| 515 | */ | ||
| 516 | if (!(type & XFS_DQ_USER)) | ||
| 517 | lockdep_set_class(&dqp->q_qlock, &xfs_dquot_other_class); | ||
| 518 | |||
| 519 | atomic_inc(&xfs_Gqm->qm_totaldquots); | ||
| 571 | 520 | ||
| 572 | trace_xfs_dqread(dqp); | 521 | trace_xfs_dqread(dqp); |
| 573 | 522 | ||
diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 541a508adea1..15ff5392fb65 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c | |||
| @@ -1489,7 +1489,7 @@ xlog_recover_add_to_cont_trans( | |||
| 1489 | old_ptr = item->ri_buf[item->ri_cnt-1].i_addr; | 1489 | old_ptr = item->ri_buf[item->ri_cnt-1].i_addr; |
| 1490 | old_len = item->ri_buf[item->ri_cnt-1].i_len; | 1490 | old_len = item->ri_buf[item->ri_cnt-1].i_len; |
| 1491 | 1491 | ||
| 1492 | ptr = kmem_realloc(old_ptr, len+old_len, old_len, 0u); | 1492 | ptr = kmem_realloc(old_ptr, len+old_len, old_len, KM_SLEEP); |
| 1493 | memcpy(&ptr[old_len], dp, len); /* d, s, l */ | 1493 | memcpy(&ptr[old_len], dp, len); /* d, s, l */ |
| 1494 | item->ri_buf[item->ri_cnt-1].i_len += len; | 1494 | item->ri_buf[item->ri_cnt-1].i_len += len; |
| 1495 | item->ri_buf[item->ri_cnt-1].i_addr = ptr; | 1495 | item->ri_buf[item->ri_cnt-1].i_addr = ptr; |
diff --git a/fs/xfs/xfs_qm.c b/fs/xfs/xfs_qm.c index 671f37eae1c7..c436def733bf 100644 --- a/fs/xfs/xfs_qm.c +++ b/fs/xfs/xfs_qm.c | |||
| @@ -50,7 +50,6 @@ | |||
| 50 | */ | 50 | */ |
| 51 | struct mutex xfs_Gqm_lock; | 51 | struct mutex xfs_Gqm_lock; |
| 52 | struct xfs_qm *xfs_Gqm; | 52 | struct xfs_qm *xfs_Gqm; |
| 53 | uint ndquot; | ||
| 54 | 53 | ||
| 55 | kmem_zone_t *qm_dqzone; | 54 | kmem_zone_t *qm_dqzone; |
| 56 | kmem_zone_t *qm_dqtrxzone; | 55 | kmem_zone_t *qm_dqtrxzone; |
| @@ -93,7 +92,6 @@ xfs_Gqm_init(void) | |||
| 93 | goto out_free_udqhash; | 92 | goto out_free_udqhash; |
| 94 | 93 | ||
| 95 | hsize /= sizeof(xfs_dqhash_t); | 94 | hsize /= sizeof(xfs_dqhash_t); |
| 96 | ndquot = hsize << 8; | ||
| 97 | 95 | ||
| 98 | xqm = kmem_zalloc(sizeof(xfs_qm_t), KM_SLEEP); | 96 | xqm = kmem_zalloc(sizeof(xfs_qm_t), KM_SLEEP); |
| 99 | xqm->qm_dqhashmask = hsize - 1; | 97 | xqm->qm_dqhashmask = hsize - 1; |
| @@ -137,7 +135,6 @@ xfs_Gqm_init(void) | |||
| 137 | xqm->qm_dqtrxzone = qm_dqtrxzone; | 135 | xqm->qm_dqtrxzone = qm_dqtrxzone; |
| 138 | 136 | ||
| 139 | atomic_set(&xqm->qm_totaldquots, 0); | 137 | atomic_set(&xqm->qm_totaldquots, 0); |
| 140 | xqm->qm_dqfree_ratio = XFS_QM_DQFREE_RATIO; | ||
| 141 | xqm->qm_nrefs = 0; | 138 | xqm->qm_nrefs = 0; |
| 142 | return xqm; | 139 | return xqm; |
| 143 | 140 | ||
| @@ -1600,216 +1597,150 @@ xfs_qm_init_quotainos( | |||
| 1600 | return 0; | 1597 | return 0; |
| 1601 | } | 1598 | } |
| 1602 | 1599 | ||
| 1600 | STATIC void | ||
| 1601 | xfs_qm_dqfree_one( | ||
| 1602 | struct xfs_dquot *dqp) | ||
| 1603 | { | ||
| 1604 | struct xfs_mount *mp = dqp->q_mount; | ||
| 1605 | struct xfs_quotainfo *qi = mp->m_quotainfo; | ||
| 1603 | 1606 | ||
| 1607 | mutex_lock(&dqp->q_hash->qh_lock); | ||
| 1608 | list_del_init(&dqp->q_hashlist); | ||
| 1609 | dqp->q_hash->qh_version++; | ||
| 1610 | mutex_unlock(&dqp->q_hash->qh_lock); | ||
| 1604 | 1611 | ||
| 1605 | /* | 1612 | mutex_lock(&qi->qi_dqlist_lock); |
| 1606 | * Pop the least recently used dquot off the freelist and recycle it. | 1613 | list_del_init(&dqp->q_mplist); |
| 1607 | */ | 1614 | qi->qi_dquots--; |
| 1608 | STATIC struct xfs_dquot * | 1615 | qi->qi_dqreclaims++; |
| 1609 | xfs_qm_dqreclaim_one(void) | 1616 | mutex_unlock(&qi->qi_dqlist_lock); |
| 1617 | |||
| 1618 | xfs_qm_dqdestroy(dqp); | ||
| 1619 | } | ||
| 1620 | |||
| 1621 | STATIC void | ||
| 1622 | xfs_qm_dqreclaim_one( | ||
| 1623 | struct xfs_dquot *dqp, | ||
| 1624 | struct list_head *dispose_list) | ||
| 1610 | { | 1625 | { |
| 1611 | struct xfs_dquot *dqp; | 1626 | struct xfs_mount *mp = dqp->q_mount; |
| 1612 | int restarts = 0; | 1627 | int error; |
| 1613 | 1628 | ||
| 1614 | mutex_lock(&xfs_Gqm->qm_dqfrlist_lock); | 1629 | if (!xfs_dqlock_nowait(dqp)) |
| 1615 | restart: | 1630 | goto out_busy; |
| 1616 | list_for_each_entry(dqp, &xfs_Gqm->qm_dqfrlist, q_freelist) { | ||
| 1617 | struct xfs_mount *mp = dqp->q_mount; | ||
| 1618 | 1631 | ||
| 1619 | if (!xfs_dqlock_nowait(dqp)) | 1632 | /* |
| 1620 | continue; | 1633 | * This dquot has acquired a reference in the meantime remove it from |
| 1634 | * the freelist and try again. | ||
| 1635 | */ | ||
| 1636 | if (dqp->q_nrefs) { | ||
| 1637 | xfs_dqunlock(dqp); | ||
| 1621 | 1638 | ||
| 1622 | /* | 1639 | trace_xfs_dqreclaim_want(dqp); |
| 1623 | * This dquot has already been grabbed by dqlookup. | 1640 | XQM_STATS_INC(xqmstats.xs_qm_dqwants); |
| 1624 | * Remove it from the freelist and try again. | ||
| 1625 | */ | ||
| 1626 | if (dqp->q_nrefs) { | ||
| 1627 | trace_xfs_dqreclaim_want(dqp); | ||
| 1628 | XQM_STATS_INC(xqmstats.xs_qm_dqwants); | ||
| 1629 | |||
| 1630 | list_del_init(&dqp->q_freelist); | ||
| 1631 | xfs_Gqm->qm_dqfrlist_cnt--; | ||
| 1632 | restarts++; | ||
| 1633 | goto dqunlock; | ||
| 1634 | } | ||
| 1635 | 1641 | ||
| 1636 | ASSERT(dqp->q_hash); | 1642 | list_del_init(&dqp->q_freelist); |
| 1637 | ASSERT(!list_empty(&dqp->q_mplist)); | 1643 | xfs_Gqm->qm_dqfrlist_cnt--; |
| 1644 | return; | ||
| 1645 | } | ||
| 1638 | 1646 | ||
| 1639 | /* | 1647 | ASSERT(dqp->q_hash); |
| 1640 | * Try to grab the flush lock. If this dquot is in the process | 1648 | ASSERT(!list_empty(&dqp->q_mplist)); |
| 1641 | * of getting flushed to disk, we don't want to reclaim it. | ||
| 1642 | */ | ||
| 1643 | if (!xfs_dqflock_nowait(dqp)) | ||
| 1644 | goto dqunlock; | ||
| 1645 | 1649 | ||
| 1646 | /* | 1650 | /* |
| 1647 | * We have the flush lock so we know that this is not in the | 1651 | * Try to grab the flush lock. If this dquot is in the process of |
| 1648 | * process of being flushed. So, if this is dirty, flush it | 1652 | * getting flushed to disk, we don't want to reclaim it. |
| 1649 | * DELWRI so that we don't get a freelist infested with | 1653 | */ |
| 1650 | * dirty dquots. | 1654 | if (!xfs_dqflock_nowait(dqp)) |
| 1651 | */ | 1655 | goto out_busy; |
| 1652 | if (XFS_DQ_IS_DIRTY(dqp)) { | ||
| 1653 | int error; | ||
| 1654 | 1656 | ||
| 1655 | trace_xfs_dqreclaim_dirty(dqp); | 1657 | /* |
| 1658 | * We have the flush lock so we know that this is not in the | ||
| 1659 | * process of being flushed. So, if this is dirty, flush it | ||
| 1660 | * DELWRI so that we don't get a freelist infested with | ||
| 1661 | * dirty dquots. | ||
| 1662 | */ | ||
| 1663 | if (XFS_DQ_IS_DIRTY(dqp)) { | ||
| 1664 | trace_xfs_dqreclaim_dirty(dqp); | ||
| 1656 | 1665 | ||
| 1657 | /* | 1666 | /* |
| 1658 | * We flush it delayed write, so don't bother | 1667 | * We flush it delayed write, so don't bother releasing the |
| 1659 | * releasing the freelist lock. | 1668 | * freelist lock. |
| 1660 | */ | 1669 | */ |
| 1661 | error = xfs_qm_dqflush(dqp, SYNC_TRYLOCK); | 1670 | error = xfs_qm_dqflush(dqp, 0); |
| 1662 | if (error) { | 1671 | if (error) { |
| 1663 | xfs_warn(mp, "%s: dquot %p flush failed", | 1672 | xfs_warn(mp, "%s: dquot %p flush failed", |
| 1664 | __func__, dqp); | 1673 | __func__, dqp); |
| 1665 | } | ||
| 1666 | goto dqunlock; | ||
| 1667 | } | 1674 | } |
| 1668 | xfs_dqfunlock(dqp); | ||
| 1669 | 1675 | ||
| 1670 | /* | 1676 | /* |
| 1671 | * Prevent lookup now that we are going to reclaim the dquot. | 1677 | * Give the dquot another try on the freelist, as the |
| 1672 | * Once XFS_DQ_FREEING is set lookup won't touch the dquot, | 1678 | * flushing will take some time. |
| 1673 | * thus we can drop the lock now. | ||
| 1674 | */ | 1679 | */ |
| 1675 | dqp->dq_flags |= XFS_DQ_FREEING; | 1680 | goto out_busy; |
| 1676 | xfs_dqunlock(dqp); | 1681 | } |
| 1677 | 1682 | xfs_dqfunlock(dqp); | |
| 1678 | mutex_lock(&dqp->q_hash->qh_lock); | ||
| 1679 | list_del_init(&dqp->q_hashlist); | ||
| 1680 | dqp->q_hash->qh_version++; | ||
| 1681 | mutex_unlock(&dqp->q_hash->qh_lock); | ||
| 1682 | |||
| 1683 | mutex_lock(&mp->m_quotainfo->qi_dqlist_lock); | ||
| 1684 | list_del_init(&dqp->q_mplist); | ||
| 1685 | mp->m_quotainfo->qi_dquots--; | ||
| 1686 | mp->m_quotainfo->qi_dqreclaims++; | ||
| 1687 | mutex_unlock(&mp->m_quotainfo->qi_dqlist_lock); | ||
| 1688 | 1683 | ||
| 1689 | ASSERT(dqp->q_nrefs == 0); | 1684 | /* |
| 1690 | list_del_init(&dqp->q_freelist); | 1685 | * Prevent lookups now that we are past the point of no return. |
| 1691 | xfs_Gqm->qm_dqfrlist_cnt--; | 1686 | */ |
| 1687 | dqp->dq_flags |= XFS_DQ_FREEING; | ||
| 1688 | xfs_dqunlock(dqp); | ||
| 1692 | 1689 | ||
| 1693 | mutex_unlock(&xfs_Gqm->qm_dqfrlist_lock); | 1690 | ASSERT(dqp->q_nrefs == 0); |
| 1694 | return dqp; | 1691 | list_move_tail(&dqp->q_freelist, dispose_list); |
| 1695 | dqunlock: | 1692 | xfs_Gqm->qm_dqfrlist_cnt--; |
| 1696 | xfs_dqunlock(dqp); | ||
| 1697 | if (restarts >= XFS_QM_RECLAIM_MAX_RESTARTS) | ||
| 1698 | break; | ||
| 1699 | goto restart; | ||
| 1700 | } | ||
| 1701 | 1693 | ||
| 1702 | mutex_unlock(&xfs_Gqm->qm_dqfrlist_lock); | 1694 | trace_xfs_dqreclaim_done(dqp); |
| 1703 | return NULL; | 1695 | XQM_STATS_INC(xqmstats.xs_qm_dqreclaims); |
| 1704 | } | 1696 | return; |
| 1705 | 1697 | ||
| 1706 | /* | 1698 | out_busy: |
| 1707 | * Traverse the freelist of dquots and attempt to reclaim a maximum of | 1699 | xfs_dqunlock(dqp); |
| 1708 | * 'howmany' dquots. This operation races with dqlookup(), and attempts to | ||
| 1709 | * favor the lookup function ... | ||
| 1710 | */ | ||
| 1711 | STATIC int | ||
| 1712 | xfs_qm_shake_freelist( | ||
| 1713 | int howmany) | ||
| 1714 | { | ||
| 1715 | int nreclaimed = 0; | ||
| 1716 | xfs_dquot_t *dqp; | ||
| 1717 | 1700 | ||
| 1718 | if (howmany <= 0) | 1701 | /* |
| 1719 | return 0; | 1702 | * Move the dquot to the tail of the list so that we don't spin on it. |
| 1703 | */ | ||
| 1704 | list_move_tail(&dqp->q_freelist, &xfs_Gqm->qm_dqfrlist); | ||
| 1720 | 1705 | ||
| 1721 | while (nreclaimed < howmany) { | 1706 | trace_xfs_dqreclaim_busy(dqp); |
| 1722 | dqp = xfs_qm_dqreclaim_one(); | 1707 | XQM_STATS_INC(xqmstats.xs_qm_dqreclaim_misses); |
| 1723 | if (!dqp) | ||
| 1724 | return nreclaimed; | ||
| 1725 | xfs_qm_dqdestroy(dqp); | ||
| 1726 | nreclaimed++; | ||
| 1727 | } | ||
| 1728 | return nreclaimed; | ||
| 1729 | } | 1708 | } |
| 1730 | 1709 | ||
| 1731 | /* | ||
| 1732 | * The kmem_shake interface is invoked when memory is running low. | ||
| 1733 | */ | ||
| 1734 | /* ARGSUSED */ | ||
| 1735 | STATIC int | 1710 | STATIC int |
| 1736 | xfs_qm_shake( | 1711 | xfs_qm_shake( |
| 1737 | struct shrinker *shrink, | 1712 | struct shrinker *shrink, |
| 1738 | struct shrink_control *sc) | 1713 | struct shrink_control *sc) |
| 1739 | { | 1714 | { |
| 1740 | int ndqused, nfree, n; | 1715 | int nr_to_scan = sc->nr_to_scan; |
| 1741 | gfp_t gfp_mask = sc->gfp_mask; | 1716 | LIST_HEAD (dispose_list); |
| 1742 | 1717 | struct xfs_dquot *dqp; | |
| 1743 | if (!kmem_shake_allow(gfp_mask)) | ||
| 1744 | return 0; | ||
| 1745 | if (!xfs_Gqm) | ||
| 1746 | return 0; | ||
| 1747 | |||
| 1748 | nfree = xfs_Gqm->qm_dqfrlist_cnt; /* free dquots */ | ||
| 1749 | /* incore dquots in all f/s's */ | ||
| 1750 | ndqused = atomic_read(&xfs_Gqm->qm_totaldquots) - nfree; | ||
| 1751 | |||
| 1752 | ASSERT(ndqused >= 0); | ||
| 1753 | 1718 | ||
| 1754 | if (nfree <= ndqused && nfree < ndquot) | 1719 | if ((sc->gfp_mask & (__GFP_FS|__GFP_WAIT)) != (__GFP_FS|__GFP_WAIT)) |
| 1755 | return 0; | 1720 | return 0; |
| 1721 | if (!nr_to_scan) | ||
| 1722 | goto out; | ||
| 1756 | 1723 | ||
| 1757 | ndqused *= xfs_Gqm->qm_dqfree_ratio; /* target # of free dquots */ | 1724 | mutex_lock(&xfs_Gqm->qm_dqfrlist_lock); |
| 1758 | n = nfree - ndqused - ndquot; /* # over target */ | 1725 | while (!list_empty(&xfs_Gqm->qm_dqfrlist)) { |
| 1759 | 1726 | if (nr_to_scan-- <= 0) | |
| 1760 | return xfs_qm_shake_freelist(MAX(nfree, n)); | 1727 | break; |
| 1761 | } | 1728 | dqp = list_first_entry(&xfs_Gqm->qm_dqfrlist, struct xfs_dquot, |
| 1762 | 1729 | q_freelist); | |
| 1763 | 1730 | xfs_qm_dqreclaim_one(dqp, &dispose_list); | |
| 1764 | /*------------------------------------------------------------------*/ | ||
| 1765 | |||
| 1766 | /* | ||
| 1767 | * Return a new incore dquot. Depending on the number of | ||
| 1768 | * dquots in the system, we either allocate a new one on the kernel heap, | ||
| 1769 | * or reclaim a free one. | ||
| 1770 | * Return value is B_TRUE if we allocated a new dquot, B_FALSE if we managed | ||
| 1771 | * to reclaim an existing one from the freelist. | ||
| 1772 | */ | ||
| 1773 | boolean_t | ||
| 1774 | xfs_qm_dqalloc_incore( | ||
| 1775 | xfs_dquot_t **O_dqpp) | ||
| 1776 | { | ||
| 1777 | xfs_dquot_t *dqp; | ||
| 1778 | |||
| 1779 | /* | ||
| 1780 | * Check against high water mark to see if we want to pop | ||
| 1781 | * a nincompoop dquot off the freelist. | ||
| 1782 | */ | ||
| 1783 | if (atomic_read(&xfs_Gqm->qm_totaldquots) >= ndquot) { | ||
| 1784 | /* | ||
| 1785 | * Try to recycle a dquot from the freelist. | ||
| 1786 | */ | ||
| 1787 | if ((dqp = xfs_qm_dqreclaim_one())) { | ||
| 1788 | XQM_STATS_INC(xqmstats.xs_qm_dqreclaims); | ||
| 1789 | /* | ||
| 1790 | * Just zero the core here. The rest will get | ||
| 1791 | * reinitialized by caller. XXX we shouldn't even | ||
| 1792 | * do this zero ... | ||
| 1793 | */ | ||
| 1794 | memset(&dqp->q_core, 0, sizeof(dqp->q_core)); | ||
| 1795 | *O_dqpp = dqp; | ||
| 1796 | return B_FALSE; | ||
| 1797 | } | ||
| 1798 | XQM_STATS_INC(xqmstats.xs_qm_dqreclaim_misses); | ||
| 1799 | } | 1731 | } |
| 1732 | mutex_unlock(&xfs_Gqm->qm_dqfrlist_lock); | ||
| 1800 | 1733 | ||
| 1801 | /* | 1734 | while (!list_empty(&dispose_list)) { |
| 1802 | * Allocate a brand new dquot on the kernel heap and return it | 1735 | dqp = list_first_entry(&dispose_list, struct xfs_dquot, |
| 1803 | * to the caller to initialize. | 1736 | q_freelist); |
| 1804 | */ | 1737 | list_del_init(&dqp->q_freelist); |
| 1805 | ASSERT(xfs_Gqm->qm_dqzone != NULL); | 1738 | xfs_qm_dqfree_one(dqp); |
| 1806 | *O_dqpp = kmem_zone_zalloc(xfs_Gqm->qm_dqzone, KM_SLEEP); | 1739 | } |
| 1807 | atomic_inc(&xfs_Gqm->qm_totaldquots); | 1740 | out: |
| 1808 | 1741 | return (xfs_Gqm->qm_dqfrlist_cnt / 100) * sysctl_vfs_cache_pressure; | |
| 1809 | return B_TRUE; | ||
| 1810 | } | 1742 | } |
| 1811 | 1743 | ||
| 1812 | |||
| 1813 | /* | 1744 | /* |
| 1814 | * Start a transaction and write the incore superblock changes to | 1745 | * Start a transaction and write the incore superblock changes to |
| 1815 | * disk. flags parameter indicates which fields have changed. | 1746 | * disk. flags parameter indicates which fields have changed. |
diff --git a/fs/xfs/xfs_qm.h b/fs/xfs/xfs_qm.h index 9b4f3adefbc5..9a9b997e1a0a 100644 --- a/fs/xfs/xfs_qm.h +++ b/fs/xfs/xfs_qm.h | |||
| @@ -26,24 +26,12 @@ | |||
| 26 | struct xfs_qm; | 26 | struct xfs_qm; |
| 27 | struct xfs_inode; | 27 | struct xfs_inode; |
| 28 | 28 | ||
| 29 | extern uint ndquot; | ||
| 30 | extern struct mutex xfs_Gqm_lock; | 29 | extern struct mutex xfs_Gqm_lock; |
| 31 | extern struct xfs_qm *xfs_Gqm; | 30 | extern struct xfs_qm *xfs_Gqm; |
| 32 | extern kmem_zone_t *qm_dqzone; | 31 | extern kmem_zone_t *qm_dqzone; |
| 33 | extern kmem_zone_t *qm_dqtrxzone; | 32 | extern kmem_zone_t *qm_dqtrxzone; |
| 34 | 33 | ||
| 35 | /* | 34 | /* |
| 36 | * Ditto, for xfs_qm_dqreclaim_one. | ||
| 37 | */ | ||
| 38 | #define XFS_QM_RECLAIM_MAX_RESTARTS 4 | ||
| 39 | |||
| 40 | /* | ||
| 41 | * Ideal ratio of free to in use dquots. Quota manager makes an attempt | ||
| 42 | * to keep this balance. | ||
| 43 | */ | ||
| 44 | #define XFS_QM_DQFREE_RATIO 2 | ||
| 45 | |||
| 46 | /* | ||
| 47 | * Dquot hashtable constants/threshold values. | 35 | * Dquot hashtable constants/threshold values. |
| 48 | */ | 36 | */ |
| 49 | #define XFS_QM_HASHSIZE_LOW (PAGE_SIZE / sizeof(xfs_dqhash_t)) | 37 | #define XFS_QM_HASHSIZE_LOW (PAGE_SIZE / sizeof(xfs_dqhash_t)) |
| @@ -74,7 +62,6 @@ typedef struct xfs_qm { | |||
| 74 | int qm_dqfrlist_cnt; | 62 | int qm_dqfrlist_cnt; |
| 75 | atomic_t qm_totaldquots; /* total incore dquots */ | 63 | atomic_t qm_totaldquots; /* total incore dquots */ |
| 76 | uint qm_nrefs; /* file systems with quota on */ | 64 | uint qm_nrefs; /* file systems with quota on */ |
| 77 | int qm_dqfree_ratio;/* ratio of free to inuse dquots */ | ||
| 78 | kmem_zone_t *qm_dqzone; /* dquot mem-alloc zone */ | 65 | kmem_zone_t *qm_dqzone; /* dquot mem-alloc zone */ |
| 79 | kmem_zone_t *qm_dqtrxzone; /* t_dqinfo of transactions */ | 66 | kmem_zone_t *qm_dqtrxzone; /* t_dqinfo of transactions */ |
| 80 | } xfs_qm_t; | 67 | } xfs_qm_t; |
| @@ -143,7 +130,6 @@ extern int xfs_qm_quotacheck(xfs_mount_t *); | |||
| 143 | extern int xfs_qm_write_sb_changes(xfs_mount_t *, __int64_t); | 130 | extern int xfs_qm_write_sb_changes(xfs_mount_t *, __int64_t); |
| 144 | 131 | ||
| 145 | /* dquot stuff */ | 132 | /* dquot stuff */ |
| 146 | extern boolean_t xfs_qm_dqalloc_incore(xfs_dquot_t **); | ||
| 147 | extern int xfs_qm_dqpurge_all(xfs_mount_t *, uint); | 133 | extern int xfs_qm_dqpurge_all(xfs_mount_t *, uint); |
| 148 | extern void xfs_qm_dqrele_all_inodes(xfs_mount_t *, uint); | 134 | extern void xfs_qm_dqrele_all_inodes(xfs_mount_t *, uint); |
| 149 | 135 | ||
diff --git a/fs/xfs/xfs_qm_stats.c b/fs/xfs/xfs_qm_stats.c index 8671a0b32644..5729ba570877 100644 --- a/fs/xfs/xfs_qm_stats.c +++ b/fs/xfs/xfs_qm_stats.c | |||
| @@ -42,9 +42,9 @@ static int xqm_proc_show(struct seq_file *m, void *v) | |||
| 42 | { | 42 | { |
| 43 | /* maximum; incore; ratio free to inuse; freelist */ | 43 | /* maximum; incore; ratio free to inuse; freelist */ |
| 44 | seq_printf(m, "%d\t%d\t%d\t%u\n", | 44 | seq_printf(m, "%d\t%d\t%d\t%u\n", |
| 45 | ndquot, | 45 | 0, |
| 46 | xfs_Gqm? atomic_read(&xfs_Gqm->qm_totaldquots) : 0, | 46 | xfs_Gqm? atomic_read(&xfs_Gqm->qm_totaldquots) : 0, |
| 47 | xfs_Gqm? xfs_Gqm->qm_dqfree_ratio : 0, | 47 | 0, |
| 48 | xfs_Gqm? xfs_Gqm->qm_dqfrlist_cnt : 0); | 48 | xfs_Gqm? xfs_Gqm->qm_dqfrlist_cnt : 0); |
| 49 | return 0; | 49 | return 0; |
| 50 | } | 50 | } |
diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h index 6b6df5802e95..bb134a819930 100644 --- a/fs/xfs/xfs_trace.h +++ b/fs/xfs/xfs_trace.h | |||
| @@ -733,11 +733,10 @@ DEFINE_EVENT(xfs_dquot_class, name, \ | |||
| 733 | DEFINE_DQUOT_EVENT(xfs_dqadjust); | 733 | DEFINE_DQUOT_EVENT(xfs_dqadjust); |
| 734 | DEFINE_DQUOT_EVENT(xfs_dqreclaim_want); | 734 | DEFINE_DQUOT_EVENT(xfs_dqreclaim_want); |
| 735 | DEFINE_DQUOT_EVENT(xfs_dqreclaim_dirty); | 735 | DEFINE_DQUOT_EVENT(xfs_dqreclaim_dirty); |
| 736 | DEFINE_DQUOT_EVENT(xfs_dqreclaim_unlink); | 736 | DEFINE_DQUOT_EVENT(xfs_dqreclaim_busy); |
| 737 | DEFINE_DQUOT_EVENT(xfs_dqreclaim_done); | ||
| 737 | DEFINE_DQUOT_EVENT(xfs_dqattach_found); | 738 | DEFINE_DQUOT_EVENT(xfs_dqattach_found); |
| 738 | DEFINE_DQUOT_EVENT(xfs_dqattach_get); | 739 | DEFINE_DQUOT_EVENT(xfs_dqattach_get); |
| 739 | DEFINE_DQUOT_EVENT(xfs_dqinit); | ||
| 740 | DEFINE_DQUOT_EVENT(xfs_dqreuse); | ||
| 741 | DEFINE_DQUOT_EVENT(xfs_dqalloc); | 740 | DEFINE_DQUOT_EVENT(xfs_dqalloc); |
| 742 | DEFINE_DQUOT_EVENT(xfs_dqtobp_read); | 741 | DEFINE_DQUOT_EVENT(xfs_dqtobp_read); |
| 743 | DEFINE_DQUOT_EVENT(xfs_dqread); | 742 | DEFINE_DQUOT_EVENT(xfs_dqread); |
diff --git a/kernel/params.c b/kernel/params.c index 32ee04308285..4bc965d8a1fe 100644 --- a/kernel/params.c +++ b/kernel/params.c | |||
| @@ -97,7 +97,8 @@ static int parse_one(char *param, | |||
| 97 | for (i = 0; i < num_params; i++) { | 97 | for (i = 0; i < num_params; i++) { |
| 98 | if (parameq(param, params[i].name)) { | 98 | if (parameq(param, params[i].name)) { |
| 99 | /* No one handled NULL, so do it here. */ | 99 | /* No one handled NULL, so do it here. */ |
| 100 | if (!val && params[i].ops->set != param_set_bool) | 100 | if (!val && params[i].ops->set != param_set_bool |
| 101 | && params[i].ops->set != param_set_bint) | ||
| 101 | return -EINVAL; | 102 | return -EINVAL; |
| 102 | pr_debug("They are equal! Calling %p\n", | 103 | pr_debug("They are equal! Calling %p\n", |
| 103 | params[i].ops->set); | 104 | params[i].ops->set); |
diff --git a/scripts/mod/file2alias.c b/scripts/mod/file2alias.c index e8c969577768..d0de2a2c3a2d 100644 --- a/scripts/mod/file2alias.c +++ b/scripts/mod/file2alias.c | |||
| @@ -932,7 +932,7 @@ static int do_isapnp_entry(const char *filename, | |||
| 932 | (id->function >> 12) & 0x0f, (id->function >> 8) & 0x0f); | 932 | (id->function >> 12) & 0x0f, (id->function >> 8) & 0x0f); |
| 933 | return 1; | 933 | return 1; |
| 934 | } | 934 | } |
| 935 | ADD_TO_DEVTABLE("isa", struct isapnp_device_id, do_isapnp_entry); | 935 | ADD_TO_DEVTABLE("isapnp", struct isapnp_device_id, do_isapnp_entry); |
| 936 | 936 | ||
| 937 | /* | 937 | /* |
| 938 | * Append a match expression for a single masked hex digit. | 938 | * Append a match expression for a single masked hex digit. |
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 9350f3c3bdf8..1358987c49d8 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
| @@ -4374,6 +4374,7 @@ enum { | |||
| 4374 | ALC882_FIXUP_ACER_ASPIRE_8930G, | 4374 | ALC882_FIXUP_ACER_ASPIRE_8930G, |
| 4375 | ALC882_FIXUP_ASPIRE_8930G_VERBS, | 4375 | ALC882_FIXUP_ASPIRE_8930G_VERBS, |
| 4376 | ALC885_FIXUP_MACPRO_GPIO, | 4376 | ALC885_FIXUP_MACPRO_GPIO, |
| 4377 | ALC889_FIXUP_DAC_ROUTE, | ||
| 4377 | }; | 4378 | }; |
| 4378 | 4379 | ||
| 4379 | static void alc889_fixup_coef(struct hda_codec *codec, | 4380 | static void alc889_fixup_coef(struct hda_codec *codec, |
| @@ -4427,6 +4428,23 @@ static void alc885_fixup_macpro_gpio(struct hda_codec *codec, | |||
| 4427 | alc882_gpio_mute(codec, 1, 0); | 4428 | alc882_gpio_mute(codec, 1, 0); |
| 4428 | } | 4429 | } |
| 4429 | 4430 | ||
| 4431 | /* Fix the connection of some pins for ALC889: | ||
| 4432 | * At least, Acer Aspire 5935 shows the connections to DAC3/4 don't | ||
| 4433 | * work correctly (bko#42740) | ||
| 4434 | */ | ||
| 4435 | static void alc889_fixup_dac_route(struct hda_codec *codec, | ||
| 4436 | const struct alc_fixup *fix, int action) | ||
| 4437 | { | ||
| 4438 | if (action == ALC_FIXUP_ACT_PRE_PROBE) { | ||
| 4439 | hda_nid_t conn1[2] = { 0x0c, 0x0d }; | ||
| 4440 | hda_nid_t conn2[2] = { 0x0e, 0x0f }; | ||
| 4441 | snd_hda_override_conn_list(codec, 0x14, 2, conn1); | ||
| 4442 | snd_hda_override_conn_list(codec, 0x15, 2, conn1); | ||
| 4443 | snd_hda_override_conn_list(codec, 0x18, 2, conn2); | ||
| 4444 | snd_hda_override_conn_list(codec, 0x1a, 2, conn2); | ||
| 4445 | } | ||
| 4446 | } | ||
| 4447 | |||
| 4430 | static const struct alc_fixup alc882_fixups[] = { | 4448 | static const struct alc_fixup alc882_fixups[] = { |
| 4431 | [ALC882_FIXUP_ABIT_AW9D_MAX] = { | 4449 | [ALC882_FIXUP_ABIT_AW9D_MAX] = { |
| 4432 | .type = ALC_FIXUP_PINS, | 4450 | .type = ALC_FIXUP_PINS, |
| @@ -4574,6 +4592,10 @@ static const struct alc_fixup alc882_fixups[] = { | |||
| 4574 | .type = ALC_FIXUP_FUNC, | 4592 | .type = ALC_FIXUP_FUNC, |
| 4575 | .v.func = alc885_fixup_macpro_gpio, | 4593 | .v.func = alc885_fixup_macpro_gpio, |
| 4576 | }, | 4594 | }, |
| 4595 | [ALC889_FIXUP_DAC_ROUTE] = { | ||
| 4596 | .type = ALC_FIXUP_FUNC, | ||
| 4597 | .v.func = alc889_fixup_dac_route, | ||
| 4598 | }, | ||
| 4577 | }; | 4599 | }; |
| 4578 | 4600 | ||
| 4579 | static const struct snd_pci_quirk alc882_fixup_tbl[] = { | 4601 | static const struct snd_pci_quirk alc882_fixup_tbl[] = { |
| @@ -4598,6 +4620,7 @@ static const struct snd_pci_quirk alc882_fixup_tbl[] = { | |||
| 4598 | SND_PCI_QUIRK(0x1025, 0x0142, "Acer Aspire 7730G", | 4620 | SND_PCI_QUIRK(0x1025, 0x0142, "Acer Aspire 7730G", |
| 4599 | ALC882_FIXUP_ACER_ASPIRE_4930G), | 4621 | ALC882_FIXUP_ACER_ASPIRE_4930G), |
| 4600 | SND_PCI_QUIRK(0x1025, 0x0155, "Packard-Bell M5120", ALC882_FIXUP_PB_M5210), | 4622 | SND_PCI_QUIRK(0x1025, 0x0155, "Packard-Bell M5120", ALC882_FIXUP_PB_M5210), |
| 4623 | SND_PCI_QUIRK(0x1025, 0x0259, "Acer Aspire 5935", ALC889_FIXUP_DAC_ROUTE), | ||
| 4601 | SND_PCI_QUIRK(0x1025, 0x0296, "Acer Aspire 7736z", ALC882_FIXUP_ACER_ASPIRE_7736), | 4624 | SND_PCI_QUIRK(0x1025, 0x0296, "Acer Aspire 7736z", ALC882_FIXUP_ACER_ASPIRE_7736), |
| 4602 | SND_PCI_QUIRK(0x1043, 0x13c2, "Asus A7M", ALC882_FIXUP_EAPD), | 4625 | SND_PCI_QUIRK(0x1043, 0x13c2, "Asus A7M", ALC882_FIXUP_EAPD), |
| 4603 | SND_PCI_QUIRK(0x1043, 0x1873, "ASUS W90V", ALC882_FIXUP_ASUS_W90V), | 4626 | SND_PCI_QUIRK(0x1043, 0x1873, "ASUS W90V", ALC882_FIXUP_ASUS_W90V), |
diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c index 948f0be2f4f3..6345df131a00 100644 --- a/sound/pci/hda/patch_sigmatel.c +++ b/sound/pci/hda/patch_sigmatel.c | |||
| @@ -5078,9 +5078,9 @@ static int stac92xx_update_led_status(struct hda_codec *codec) | |||
| 5078 | spec->gpio_dir, spec->gpio_data); | 5078 | spec->gpio_dir, spec->gpio_data); |
| 5079 | } else { | 5079 | } else { |
| 5080 | notmtd_lvl = spec->gpio_led_polarity ? | 5080 | notmtd_lvl = spec->gpio_led_polarity ? |
| 5081 | AC_PINCTL_VREF_HIZ : AC_PINCTL_VREF_GRD; | 5081 | AC_PINCTL_VREF_50 : AC_PINCTL_VREF_GRD; |
| 5082 | muted_lvl = spec->gpio_led_polarity ? | 5082 | muted_lvl = spec->gpio_led_polarity ? |
| 5083 | AC_PINCTL_VREF_GRD : AC_PINCTL_VREF_HIZ; | 5083 | AC_PINCTL_VREF_GRD : AC_PINCTL_VREF_50; |
| 5084 | spec->vref_led = muted ? muted_lvl : notmtd_lvl; | 5084 | spec->vref_led = muted ? muted_lvl : notmtd_lvl; |
| 5085 | stac_vrefout_set(codec, spec->vref_mute_led_nid, | 5085 | stac_vrefout_set(codec, spec->vref_mute_led_nid, |
| 5086 | spec->vref_led); | 5086 | spec->vref_led); |
diff --git a/sound/pci/hda/patch_via.c b/sound/pci/hda/patch_via.c index 284e311040fe..dff9a00ee8fb 100644 --- a/sound/pci/hda/patch_via.c +++ b/sound/pci/hda/patch_via.c | |||
| @@ -666,6 +666,9 @@ static void via_auto_init_analog_input(struct hda_codec *codec) | |||
| 666 | /* init input-src */ | 666 | /* init input-src */ |
| 667 | for (i = 0; i < spec->num_adc_nids; i++) { | 667 | for (i = 0; i < spec->num_adc_nids; i++) { |
| 668 | int adc_idx = spec->inputs[spec->cur_mux[i]].adc_idx; | 668 | int adc_idx = spec->inputs[spec->cur_mux[i]].adc_idx; |
| 669 | /* secondary ADCs must have the unique MUX */ | ||
| 670 | if (i > 0 && !spec->mux_nids[i]) | ||
| 671 | break; | ||
| 669 | if (spec->mux_nids[adc_idx]) { | 672 | if (spec->mux_nids[adc_idx]) { |
| 670 | int mux_idx = spec->inputs[spec->cur_mux[i]].mux_idx; | 673 | int mux_idx = spec->inputs[spec->cur_mux[i]].mux_idx; |
| 671 | snd_hda_codec_write(codec, spec->mux_nids[adc_idx], 0, | 674 | snd_hda_codec_write(codec, spec->mux_nids[adc_idx], 0, |
diff --git a/sound/pci/intel8x0.c b/sound/pci/intel8x0.c index 9f3b01bb72c8..e0a4263baa20 100644 --- a/sound/pci/intel8x0.c +++ b/sound/pci/intel8x0.c | |||
| @@ -2102,6 +2102,12 @@ static struct ac97_quirk ac97_quirks[] __devinitdata = { | |||
| 2102 | }, | 2102 | }, |
| 2103 | { | 2103 | { |
| 2104 | .subvendor = 0x161f, | 2104 | .subvendor = 0x161f, |
| 2105 | .subdevice = 0x202f, | ||
| 2106 | .name = "Gateway M520", | ||
| 2107 | .type = AC97_TUNE_INV_EAPD | ||
| 2108 | }, | ||
| 2109 | { | ||
| 2110 | .subvendor = 0x161f, | ||
| 2105 | .subdevice = 0x203a, | 2111 | .subdevice = 0x203a, |
| 2106 | .name = "Gateway 4525GZ", /* AD1981B */ | 2112 | .name = "Gateway 4525GZ", /* AD1981B */ |
| 2107 | .type = AC97_TUNE_INV_EAPD | 2113 | .type = AC97_TUNE_INV_EAPD |
diff --git a/sound/soc/sh/fsi.c b/sound/soc/sh/fsi.c index db6c89a28bda..ea4a82d01160 100644 --- a/sound/soc/sh/fsi.c +++ b/sound/soc/sh/fsi.c | |||
| @@ -1152,12 +1152,8 @@ static snd_pcm_uframes_t fsi_pointer(struct snd_pcm_substream *substream) | |||
| 1152 | { | 1152 | { |
| 1153 | struct fsi_priv *fsi = fsi_get_priv(substream); | 1153 | struct fsi_priv *fsi = fsi_get_priv(substream); |
| 1154 | struct fsi_stream *io = fsi_get_stream(fsi, fsi_is_play(substream)); | 1154 | struct fsi_stream *io = fsi_get_stream(fsi, fsi_is_play(substream)); |
| 1155 | int samples_pos = io->buff_sample_pos - 1; | ||
| 1156 | 1155 | ||
| 1157 | if (samples_pos < 0) | 1156 | return fsi_sample2frame(fsi, io->buff_sample_pos); |
| 1158 | samples_pos = 0; | ||
| 1159 | |||
| 1160 | return fsi_sample2frame(fsi, samples_pos); | ||
| 1161 | } | 1157 | } |
| 1162 | 1158 | ||
| 1163 | static struct snd_pcm_ops fsi_pcm_ops = { | 1159 | static struct snd_pcm_ops fsi_pcm_ops = { |
