diff options
47 files changed, 503 insertions, 429 deletions
diff --git a/Documentation/DocBook/media/v4l/pixfmt-nv12m.xml b/Documentation/DocBook/media/v4l/pixfmt-nv12m.xml index 3fd3ce5df270..5274c24d11e0 100644 --- a/Documentation/DocBook/media/v4l/pixfmt-nv12m.xml +++ b/Documentation/DocBook/media/v4l/pixfmt-nv12m.xml | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | <refentry id="V4L2-PIX-FMT-NV12M"> | 1 | <refentry id="V4L2-PIX-FMT-NV12M"> |
| 2 | <refmeta> | 2 | <refmeta> |
| 3 | <refentrytitle>V4L2_PIX_FMT_NV12M ('NV12M')</refentrytitle> | 3 | <refentrytitle>V4L2_PIX_FMT_NV12M ('NM12')</refentrytitle> |
| 4 | &manvol; | 4 | &manvol; |
| 5 | </refmeta> | 5 | </refmeta> |
| 6 | <refnamediv> | 6 | <refnamediv> |
diff --git a/Documentation/DocBook/media/v4l/pixfmt-yuv420m.xml b/Documentation/DocBook/media/v4l/pixfmt-yuv420m.xml index 9957863daf18..60308f1eefdf 100644 --- a/Documentation/DocBook/media/v4l/pixfmt-yuv420m.xml +++ b/Documentation/DocBook/media/v4l/pixfmt-yuv420m.xml | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | <refentry id="V4L2-PIX-FMT-YUV420M"> | 1 | <refentry id="V4L2-PIX-FMT-YUV420M"> |
| 2 | <refmeta> | 2 | <refmeta> |
| 3 | <refentrytitle>V4L2_PIX_FMT_YUV420M ('YU12M')</refentrytitle> | 3 | <refentrytitle>V4L2_PIX_FMT_YUV420M ('YM12')</refentrytitle> |
| 4 | &manvol; | 4 | &manvol; |
| 5 | </refmeta> | 5 | </refmeta> |
| 6 | <refnamediv> | 6 | <refnamediv> |
diff --git a/arch/arm/mach-omap2/board-4430sdp.c b/arch/arm/mach-omap2/board-4430sdp.c index a39fc4bbd2b8..130ab00c09a2 100644 --- a/arch/arm/mach-omap2/board-4430sdp.c +++ b/arch/arm/mach-omap2/board-4430sdp.c | |||
| @@ -20,6 +20,7 @@ | |||
| 20 | #include <linux/usb/otg.h> | 20 | #include <linux/usb/otg.h> |
| 21 | #include <linux/spi/spi.h> | 21 | #include <linux/spi/spi.h> |
| 22 | #include <linux/i2c/twl.h> | 22 | #include <linux/i2c/twl.h> |
| 23 | #include <linux/mfd/twl6040.h> | ||
| 23 | #include <linux/gpio_keys.h> | 24 | #include <linux/gpio_keys.h> |
| 24 | #include <linux/regulator/machine.h> | 25 | #include <linux/regulator/machine.h> |
| 25 | #include <linux/regulator/fixed.h> | 26 | #include <linux/regulator/fixed.h> |
| @@ -560,7 +561,7 @@ static struct regulator_init_data sdp4430_vusim = { | |||
| 560 | }, | 561 | }, |
| 561 | }; | 562 | }; |
| 562 | 563 | ||
| 563 | static struct twl4030_codec_data twl6040_codec = { | 564 | static struct twl6040_codec_data twl6040_codec = { |
| 564 | /* single-step ramp for headset and handsfree */ | 565 | /* single-step ramp for headset and handsfree */ |
| 565 | .hs_left_step = 0x0f, | 566 | .hs_left_step = 0x0f, |
| 566 | .hs_right_step = 0x0f, | 567 | .hs_right_step = 0x0f, |
| @@ -568,7 +569,7 @@ static struct twl4030_codec_data twl6040_codec = { | |||
| 568 | .hf_right_step = 0x1d, | 569 | .hf_right_step = 0x1d, |
| 569 | }; | 570 | }; |
| 570 | 571 | ||
| 571 | static struct twl4030_vibra_data twl6040_vibra = { | 572 | static struct twl6040_vibra_data twl6040_vibra = { |
| 572 | .vibldrv_res = 8, | 573 | .vibldrv_res = 8, |
| 573 | .vibrdrv_res = 3, | 574 | .vibrdrv_res = 3, |
| 574 | .viblmotor_res = 10, | 575 | .viblmotor_res = 10, |
| @@ -577,16 +578,14 @@ static struct twl4030_vibra_data twl6040_vibra = { | |||
| 577 | .vddvibr_uV = 0, /* fixed volt supply - VBAT */ | 578 | .vddvibr_uV = 0, /* fixed volt supply - VBAT */ |
| 578 | }; | 579 | }; |
| 579 | 580 | ||
| 580 | static struct twl4030_audio_data twl6040_audio = { | 581 | static struct twl6040_platform_data twl6040_data = { |
| 581 | .codec = &twl6040_codec, | 582 | .codec = &twl6040_codec, |
| 582 | .vibra = &twl6040_vibra, | 583 | .vibra = &twl6040_vibra, |
| 583 | .audpwron_gpio = 127, | 584 | .audpwron_gpio = 127, |
| 584 | .naudint_irq = OMAP44XX_IRQ_SYS_2N, | ||
| 585 | .irq_base = TWL6040_CODEC_IRQ_BASE, | 585 | .irq_base = TWL6040_CODEC_IRQ_BASE, |
| 586 | }; | 586 | }; |
| 587 | 587 | ||
| 588 | static struct twl4030_platform_data sdp4430_twldata = { | 588 | static struct twl4030_platform_data sdp4430_twldata = { |
| 589 | .audio = &twl6040_audio, | ||
| 590 | /* Regulators */ | 589 | /* Regulators */ |
| 591 | .vusim = &sdp4430_vusim, | 590 | .vusim = &sdp4430_vusim, |
| 592 | .vaux1 = &sdp4430_vaux1, | 591 | .vaux1 = &sdp4430_vaux1, |
| @@ -617,7 +616,8 @@ static int __init omap4_i2c_init(void) | |||
| 617 | TWL_COMMON_REGULATOR_VCXIO | | 616 | TWL_COMMON_REGULATOR_VCXIO | |
| 618 | TWL_COMMON_REGULATOR_VUSB | | 617 | TWL_COMMON_REGULATOR_VUSB | |
| 619 | TWL_COMMON_REGULATOR_CLK32KG); | 618 | TWL_COMMON_REGULATOR_CLK32KG); |
| 620 | omap4_pmic_init("twl6030", &sdp4430_twldata); | 619 | omap4_pmic_init("twl6030", &sdp4430_twldata, |
| 620 | &twl6040_data, OMAP44XX_IRQ_SYS_2N); | ||
| 621 | omap_register_i2c_bus(2, 400, NULL, 0); | 621 | omap_register_i2c_bus(2, 400, NULL, 0); |
| 622 | omap_register_i2c_bus(3, 400, sdp4430_i2c_3_boardinfo, | 622 | omap_register_i2c_bus(3, 400, sdp4430_i2c_3_boardinfo, |
| 623 | ARRAY_SIZE(sdp4430_i2c_3_boardinfo)); | 623 | ARRAY_SIZE(sdp4430_i2c_3_boardinfo)); |
diff --git a/arch/arm/mach-omap2/board-generic.c b/arch/arm/mach-omap2/board-generic.c index 74e1687b5170..098d183a0086 100644 --- a/arch/arm/mach-omap2/board-generic.c +++ b/arch/arm/mach-omap2/board-generic.c | |||
| @@ -137,7 +137,7 @@ static struct twl4030_platform_data sdp4430_twldata = { | |||
| 137 | 137 | ||
| 138 | static void __init omap4_i2c_init(void) | 138 | static void __init omap4_i2c_init(void) |
| 139 | { | 139 | { |
| 140 | omap4_pmic_init("twl6030", &sdp4430_twldata); | 140 | omap4_pmic_init("twl6030", &sdp4430_twldata, NULL, 0); |
| 141 | } | 141 | } |
| 142 | 142 | ||
| 143 | static void __init omap4_init(void) | 143 | static void __init omap4_init(void) |
diff --git a/arch/arm/mach-omap2/board-omap4panda.c b/arch/arm/mach-omap2/board-omap4panda.c index d8c0e89f0126..1b782ba53433 100644 --- a/arch/arm/mach-omap2/board-omap4panda.c +++ b/arch/arm/mach-omap2/board-omap4panda.c | |||
| @@ -25,6 +25,7 @@ | |||
| 25 | #include <linux/gpio.h> | 25 | #include <linux/gpio.h> |
| 26 | #include <linux/usb/otg.h> | 26 | #include <linux/usb/otg.h> |
| 27 | #include <linux/i2c/twl.h> | 27 | #include <linux/i2c/twl.h> |
| 28 | #include <linux/mfd/twl6040.h> | ||
| 28 | #include <linux/regulator/machine.h> | 29 | #include <linux/regulator/machine.h> |
| 29 | #include <linux/regulator/fixed.h> | 30 | #include <linux/regulator/fixed.h> |
| 30 | #include <linux/wl12xx.h> | 31 | #include <linux/wl12xx.h> |
| @@ -284,7 +285,7 @@ static int __init omap4_twl6030_hsmmc_init(struct omap2_hsmmc_info *controllers) | |||
| 284 | return 0; | 285 | return 0; |
| 285 | } | 286 | } |
| 286 | 287 | ||
| 287 | static struct twl4030_codec_data twl6040_codec = { | 288 | static struct twl6040_codec_data twl6040_codec = { |
| 288 | /* single-step ramp for headset and handsfree */ | 289 | /* single-step ramp for headset and handsfree */ |
| 289 | .hs_left_step = 0x0f, | 290 | .hs_left_step = 0x0f, |
| 290 | .hs_right_step = 0x0f, | 291 | .hs_right_step = 0x0f, |
| @@ -292,17 +293,14 @@ static struct twl4030_codec_data twl6040_codec = { | |||
| 292 | .hf_right_step = 0x1d, | 293 | .hf_right_step = 0x1d, |
| 293 | }; | 294 | }; |
| 294 | 295 | ||
| 295 | static struct twl4030_audio_data twl6040_audio = { | 296 | static struct twl6040_platform_data twl6040_data = { |
| 296 | .codec = &twl6040_codec, | 297 | .codec = &twl6040_codec, |
| 297 | .audpwron_gpio = 127, | 298 | .audpwron_gpio = 127, |
| 298 | .naudint_irq = OMAP44XX_IRQ_SYS_2N, | ||
| 299 | .irq_base = TWL6040_CODEC_IRQ_BASE, | 299 | .irq_base = TWL6040_CODEC_IRQ_BASE, |
| 300 | }; | 300 | }; |
| 301 | 301 | ||
| 302 | /* Panda board uses the common PMIC configuration */ | 302 | /* Panda board uses the common PMIC configuration */ |
| 303 | static struct twl4030_platform_data omap4_panda_twldata = { | 303 | static struct twl4030_platform_data omap4_panda_twldata; |
| 304 | .audio = &twl6040_audio, | ||
| 305 | }; | ||
| 306 | 304 | ||
| 307 | /* | 305 | /* |
| 308 | * Display monitor features are burnt in their EEPROM as EDID data. The EEPROM | 306 | * Display monitor features are burnt in their EEPROM as EDID data. The EEPROM |
| @@ -326,7 +324,8 @@ static int __init omap4_panda_i2c_init(void) | |||
| 326 | TWL_COMMON_REGULATOR_VCXIO | | 324 | TWL_COMMON_REGULATOR_VCXIO | |
| 327 | TWL_COMMON_REGULATOR_VUSB | | 325 | TWL_COMMON_REGULATOR_VUSB | |
| 328 | TWL_COMMON_REGULATOR_CLK32KG); | 326 | TWL_COMMON_REGULATOR_CLK32KG); |
| 329 | omap4_pmic_init("twl6030", &omap4_panda_twldata); | 327 | omap4_pmic_init("twl6030", &omap4_panda_twldata, |
| 328 | &twl6040_data, OMAP44XX_IRQ_SYS_2N); | ||
| 330 | omap_register_i2c_bus(2, 400, NULL, 0); | 329 | omap_register_i2c_bus(2, 400, NULL, 0); |
| 331 | /* | 330 | /* |
| 332 | * Bus 3 is attached to the DVI port where devices like the pico DLP | 331 | * Bus 3 is attached to the DVI port where devices like the pico DLP |
diff --git a/arch/arm/mach-omap2/twl-common.c b/arch/arm/mach-omap2/twl-common.c index 4b57757bf9d1..7a7b89304c48 100644 --- a/arch/arm/mach-omap2/twl-common.c +++ b/arch/arm/mach-omap2/twl-common.c | |||
| @@ -37,6 +37,16 @@ static struct i2c_board_info __initdata pmic_i2c_board_info = { | |||
| 37 | .flags = I2C_CLIENT_WAKE, | 37 | .flags = I2C_CLIENT_WAKE, |
| 38 | }; | 38 | }; |
| 39 | 39 | ||
| 40 | static struct i2c_board_info __initdata omap4_i2c1_board_info[] = { | ||
| 41 | { | ||
| 42 | .addr = 0x48, | ||
| 43 | .flags = I2C_CLIENT_WAKE, | ||
| 44 | }, | ||
| 45 | { | ||
| 46 | I2C_BOARD_INFO("twl6040", 0x4b), | ||
| 47 | }, | ||
| 48 | }; | ||
| 49 | |||
| 40 | void __init omap_pmic_init(int bus, u32 clkrate, | 50 | void __init omap_pmic_init(int bus, u32 clkrate, |
| 41 | const char *pmic_type, int pmic_irq, | 51 | const char *pmic_type, int pmic_irq, |
| 42 | struct twl4030_platform_data *pmic_data) | 52 | struct twl4030_platform_data *pmic_data) |
| @@ -49,14 +59,31 @@ void __init omap_pmic_init(int bus, u32 clkrate, | |||
| 49 | omap_register_i2c_bus(bus, clkrate, &pmic_i2c_board_info, 1); | 59 | omap_register_i2c_bus(bus, clkrate, &pmic_i2c_board_info, 1); |
| 50 | } | 60 | } |
| 51 | 61 | ||
| 62 | void __init omap4_pmic_init(const char *pmic_type, | ||
| 63 | struct twl4030_platform_data *pmic_data, | ||
| 64 | struct twl6040_platform_data *twl6040_data, int twl6040_irq) | ||
| 65 | { | ||
| 66 | /* PMIC part*/ | ||
| 67 | strncpy(omap4_i2c1_board_info[0].type, pmic_type, | ||
| 68 | sizeof(omap4_i2c1_board_info[0].type)); | ||
| 69 | omap4_i2c1_board_info[0].irq = OMAP44XX_IRQ_SYS_1N; | ||
| 70 | omap4_i2c1_board_info[0].platform_data = pmic_data; | ||
| 71 | |||
| 72 | /* TWL6040 audio IC part */ | ||
| 73 | omap4_i2c1_board_info[1].irq = twl6040_irq; | ||
| 74 | omap4_i2c1_board_info[1].platform_data = twl6040_data; | ||
| 75 | |||
| 76 | omap_register_i2c_bus(1, 400, omap4_i2c1_board_info, 2); | ||
| 77 | |||
| 78 | } | ||
| 79 | |||
| 52 | void __init omap_pmic_late_init(void) | 80 | void __init omap_pmic_late_init(void) |
| 53 | { | 81 | { |
| 54 | /* Init the OMAP TWL parameters (if PMIC has been registerd) */ | 82 | /* Init the OMAP TWL parameters (if PMIC has been registerd) */ |
| 55 | if (!pmic_i2c_board_info.irq) | 83 | if (pmic_i2c_board_info.irq) |
| 56 | return; | 84 | omap3_twl_init(); |
| 57 | 85 | if (omap4_i2c1_board_info[0].irq) | |
| 58 | omap3_twl_init(); | 86 | omap4_twl_init(); |
| 59 | omap4_twl_init(); | ||
| 60 | } | 87 | } |
| 61 | 88 | ||
| 62 | #if defined(CONFIG_ARCH_OMAP3) | 89 | #if defined(CONFIG_ARCH_OMAP3) |
diff --git a/arch/arm/mach-omap2/twl-common.h b/arch/arm/mach-omap2/twl-common.h index 275dde8cb27a..09627483a57f 100644 --- a/arch/arm/mach-omap2/twl-common.h +++ b/arch/arm/mach-omap2/twl-common.h | |||
| @@ -29,6 +29,7 @@ | |||
| 29 | 29 | ||
| 30 | 30 | ||
| 31 | struct twl4030_platform_data; | 31 | struct twl4030_platform_data; |
| 32 | struct twl6040_platform_data; | ||
| 32 | 33 | ||
| 33 | void omap_pmic_init(int bus, u32 clkrate, const char *pmic_type, int pmic_irq, | 34 | void omap_pmic_init(int bus, u32 clkrate, const char *pmic_type, int pmic_irq, |
| 34 | struct twl4030_platform_data *pmic_data); | 35 | struct twl4030_platform_data *pmic_data); |
| @@ -46,12 +47,9 @@ static inline void omap3_pmic_init(const char *pmic_type, | |||
| 46 | omap_pmic_init(1, 2600, pmic_type, INT_34XX_SYS_NIRQ, pmic_data); | 47 | omap_pmic_init(1, 2600, pmic_type, INT_34XX_SYS_NIRQ, pmic_data); |
| 47 | } | 48 | } |
| 48 | 49 | ||
| 49 | static inline void omap4_pmic_init(const char *pmic_type, | 50 | void omap4_pmic_init(const char *pmic_type, |
| 50 | struct twl4030_platform_data *pmic_data) | 51 | struct twl4030_platform_data *pmic_data, |
| 51 | { | 52 | struct twl6040_platform_data *audio_data, int twl6040_irq); |
| 52 | /* Phoenix Audio IC needs I2C1 to start with 400 KHz or less */ | ||
| 53 | omap_pmic_init(1, 400, pmic_type, OMAP44XX_IRQ_SYS_1N, pmic_data); | ||
| 54 | } | ||
| 55 | 53 | ||
| 56 | void omap3_pmic_get_config(struct twl4030_platform_data *pmic_data, | 54 | void omap3_pmic_get_config(struct twl4030_platform_data *pmic_data, |
| 57 | u32 pdata_flags, u32 regulators_flags); | 55 | u32 pdata_flags, u32 regulators_flags); |
diff --git a/arch/ia64/kernel/perfmon.c b/arch/ia64/kernel/perfmon.c index 9d0fd7d5bb82..f00ba025375d 100644 --- a/arch/ia64/kernel/perfmon.c +++ b/arch/ia64/kernel/perfmon.c | |||
| @@ -604,12 +604,6 @@ pfm_unprotect_ctx_ctxsw(pfm_context_t *x, unsigned long f) | |||
| 604 | spin_unlock(&(x)->ctx_lock); | 604 | spin_unlock(&(x)->ctx_lock); |
| 605 | } | 605 | } |
| 606 | 606 | ||
| 607 | static inline unsigned int | ||
| 608 | pfm_do_munmap(struct mm_struct *mm, unsigned long addr, size_t len, int acct) | ||
| 609 | { | ||
| 610 | return do_munmap(mm, addr, len); | ||
| 611 | } | ||
| 612 | |||
| 613 | static inline unsigned long | 607 | static inline unsigned long |
| 614 | pfm_get_unmapped_area(struct file *file, unsigned long addr, unsigned long len, unsigned long pgoff, unsigned long flags, unsigned long exec) | 608 | pfm_get_unmapped_area(struct file *file, unsigned long addr, unsigned long len, unsigned long pgoff, unsigned long flags, unsigned long exec) |
| 615 | { | 609 | { |
| @@ -1458,8 +1452,9 @@ pfm_unreserve_session(pfm_context_t *ctx, int is_syswide, unsigned int cpu) | |||
| 1458 | * a PROTECT_CTX() section. | 1452 | * a PROTECT_CTX() section. |
| 1459 | */ | 1453 | */ |
| 1460 | static int | 1454 | static int |
| 1461 | pfm_remove_smpl_mapping(struct task_struct *task, void *vaddr, unsigned long size) | 1455 | pfm_remove_smpl_mapping(void *vaddr, unsigned long size) |
| 1462 | { | 1456 | { |
| 1457 | struct task_struct *task = current; | ||
| 1463 | int r; | 1458 | int r; |
| 1464 | 1459 | ||
| 1465 | /* sanity checks */ | 1460 | /* sanity checks */ |
| @@ -1473,13 +1468,8 @@ pfm_remove_smpl_mapping(struct task_struct *task, void *vaddr, unsigned long siz | |||
| 1473 | /* | 1468 | /* |
| 1474 | * does the actual unmapping | 1469 | * does the actual unmapping |
| 1475 | */ | 1470 | */ |
| 1476 | down_write(&task->mm->mmap_sem); | 1471 | r = vm_munmap((unsigned long)vaddr, size); |
| 1477 | 1472 | ||
| 1478 | DPRINT(("down_write done smpl_vaddr=%p size=%lu\n", vaddr, size)); | ||
| 1479 | |||
| 1480 | r = pfm_do_munmap(task->mm, (unsigned long)vaddr, size, 0); | ||
| 1481 | |||
| 1482 | up_write(&task->mm->mmap_sem); | ||
| 1483 | if (r !=0) { | 1473 | if (r !=0) { |
| 1484 | printk(KERN_ERR "perfmon: [%d] unable to unmap sampling buffer @%p size=%lu\n", task_pid_nr(task), vaddr, size); | 1474 | printk(KERN_ERR "perfmon: [%d] unable to unmap sampling buffer @%p size=%lu\n", task_pid_nr(task), vaddr, size); |
| 1485 | } | 1475 | } |
| @@ -1945,7 +1935,7 @@ pfm_flush(struct file *filp, fl_owner_t id) | |||
| 1945 | * because some VM function reenables interrupts. | 1935 | * because some VM function reenables interrupts. |
| 1946 | * | 1936 | * |
| 1947 | */ | 1937 | */ |
| 1948 | if (smpl_buf_vaddr) pfm_remove_smpl_mapping(current, smpl_buf_vaddr, smpl_buf_size); | 1938 | if (smpl_buf_vaddr) pfm_remove_smpl_mapping(smpl_buf_vaddr, smpl_buf_size); |
| 1949 | 1939 | ||
| 1950 | return 0; | 1940 | return 0; |
| 1951 | } | 1941 | } |
diff --git a/arch/sparc/kernel/sys_sparc_64.c b/arch/sparc/kernel/sys_sparc_64.c index 232df9949530..3ee51f189a55 100644 --- a/arch/sparc/kernel/sys_sparc_64.c +++ b/arch/sparc/kernel/sys_sparc_64.c | |||
| @@ -566,15 +566,10 @@ out: | |||
| 566 | 566 | ||
| 567 | SYSCALL_DEFINE2(64_munmap, unsigned long, addr, size_t, len) | 567 | SYSCALL_DEFINE2(64_munmap, unsigned long, addr, size_t, len) |
| 568 | { | 568 | { |
| 569 | long ret; | ||
| 570 | |||
| 571 | if (invalid_64bit_range(addr, len)) | 569 | if (invalid_64bit_range(addr, len)) |
| 572 | return -EINVAL; | 570 | return -EINVAL; |
| 573 | 571 | ||
| 574 | down_write(¤t->mm->mmap_sem); | 572 | return vm_munmap(addr, len); |
| 575 | ret = do_munmap(current->mm, addr, len); | ||
| 576 | up_write(¤t->mm->mmap_sem); | ||
| 577 | return ret; | ||
| 578 | } | 573 | } |
| 579 | 574 | ||
| 580 | extern unsigned long do_mremap(unsigned long addr, | 575 | extern unsigned long do_mremap(unsigned long addr, |
diff --git a/arch/tile/kernel/single_step.c b/arch/tile/kernel/single_step.c index 9efbc1391b3c..89529c9f0605 100644 --- a/arch/tile/kernel/single_step.c +++ b/arch/tile/kernel/single_step.c | |||
| @@ -346,12 +346,10 @@ void single_step_once(struct pt_regs *regs) | |||
| 346 | } | 346 | } |
| 347 | 347 | ||
| 348 | /* allocate a cache line of writable, executable memory */ | 348 | /* allocate a cache line of writable, executable memory */ |
| 349 | down_write(¤t->mm->mmap_sem); | 349 | buffer = (void __user *) vm_mmap(NULL, 0, 64, |
| 350 | buffer = (void __user *) do_mmap(NULL, 0, 64, | ||
| 351 | PROT_EXEC | PROT_READ | PROT_WRITE, | 350 | PROT_EXEC | PROT_READ | PROT_WRITE, |
| 352 | MAP_PRIVATE | MAP_ANONYMOUS, | 351 | MAP_PRIVATE | MAP_ANONYMOUS, |
| 353 | 0); | 352 | 0); |
| 354 | up_write(¤t->mm->mmap_sem); | ||
| 355 | 353 | ||
| 356 | if (IS_ERR((void __force *)buffer)) { | 354 | if (IS_ERR((void __force *)buffer)) { |
| 357 | kfree(state); | 355 | kfree(state); |
diff --git a/arch/x86/ia32/ia32_aout.c b/arch/x86/ia32/ia32_aout.c index d511d951a052..4824fb45560f 100644 --- a/arch/x86/ia32/ia32_aout.c +++ b/arch/x86/ia32/ia32_aout.c | |||
| @@ -119,9 +119,7 @@ static void set_brk(unsigned long start, unsigned long end) | |||
| 119 | end = PAGE_ALIGN(end); | 119 | end = PAGE_ALIGN(end); |
| 120 | if (end <= start) | 120 | if (end <= start) |
| 121 | return; | 121 | return; |
| 122 | down_write(¤t->mm->mmap_sem); | 122 | vm_brk(start, end - start); |
| 123 | do_brk(start, end - start); | ||
| 124 | up_write(¤t->mm->mmap_sem); | ||
| 125 | } | 123 | } |
| 126 | 124 | ||
| 127 | #ifdef CORE_DUMP | 125 | #ifdef CORE_DUMP |
| @@ -332,9 +330,7 @@ static int load_aout_binary(struct linux_binprm *bprm, struct pt_regs *regs) | |||
| 332 | pos = 32; | 330 | pos = 32; |
| 333 | map_size = ex.a_text+ex.a_data; | 331 | map_size = ex.a_text+ex.a_data; |
| 334 | 332 | ||
| 335 | down_write(¤t->mm->mmap_sem); | 333 | error = vm_brk(text_addr & PAGE_MASK, map_size); |
| 336 | error = do_brk(text_addr & PAGE_MASK, map_size); | ||
| 337 | up_write(¤t->mm->mmap_sem); | ||
| 338 | 334 | ||
| 339 | if (error != (text_addr & PAGE_MASK)) { | 335 | if (error != (text_addr & PAGE_MASK)) { |
| 340 | send_sig(SIGKILL, current, 0); | 336 | send_sig(SIGKILL, current, 0); |
| @@ -373,9 +369,7 @@ static int load_aout_binary(struct linux_binprm *bprm, struct pt_regs *regs) | |||
| 373 | if (!bprm->file->f_op->mmap || (fd_offset & ~PAGE_MASK) != 0) { | 369 | if (!bprm->file->f_op->mmap || (fd_offset & ~PAGE_MASK) != 0) { |
| 374 | loff_t pos = fd_offset; | 370 | loff_t pos = fd_offset; |
| 375 | 371 | ||
| 376 | down_write(¤t->mm->mmap_sem); | 372 | vm_brk(N_TXTADDR(ex), ex.a_text+ex.a_data); |
| 377 | do_brk(N_TXTADDR(ex), ex.a_text+ex.a_data); | ||
| 378 | up_write(¤t->mm->mmap_sem); | ||
| 379 | bprm->file->f_op->read(bprm->file, | 373 | bprm->file->f_op->read(bprm->file, |
| 380 | (char __user *)N_TXTADDR(ex), | 374 | (char __user *)N_TXTADDR(ex), |
| 381 | ex.a_text+ex.a_data, &pos); | 375 | ex.a_text+ex.a_data, &pos); |
| @@ -385,26 +379,22 @@ static int load_aout_binary(struct linux_binprm *bprm, struct pt_regs *regs) | |||
| 385 | goto beyond_if; | 379 | goto beyond_if; |
| 386 | } | 380 | } |
| 387 | 381 | ||
| 388 | down_write(¤t->mm->mmap_sem); | 382 | error = vm_mmap(bprm->file, N_TXTADDR(ex), ex.a_text, |
| 389 | error = do_mmap(bprm->file, N_TXTADDR(ex), ex.a_text, | ||
| 390 | PROT_READ | PROT_EXEC, | 383 | PROT_READ | PROT_EXEC, |
| 391 | MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE | | 384 | MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE | |
| 392 | MAP_EXECUTABLE | MAP_32BIT, | 385 | MAP_EXECUTABLE | MAP_32BIT, |
| 393 | fd_offset); | 386 | fd_offset); |
| 394 | up_write(¤t->mm->mmap_sem); | ||
| 395 | 387 | ||
| 396 | if (error != N_TXTADDR(ex)) { | 388 | if (error != N_TXTADDR(ex)) { |
| 397 | send_sig(SIGKILL, current, 0); | 389 | send_sig(SIGKILL, current, 0); |
| 398 | return error; | 390 | return error; |
| 399 | } | 391 | } |
| 400 | 392 | ||
| 401 | down_write(¤t->mm->mmap_sem); | 393 | error = vm_mmap(bprm->file, N_DATADDR(ex), ex.a_data, |
| 402 | error = do_mmap(bprm->file, N_DATADDR(ex), ex.a_data, | ||
| 403 | PROT_READ | PROT_WRITE | PROT_EXEC, | 394 | PROT_READ | PROT_WRITE | PROT_EXEC, |
| 404 | MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE | | 395 | MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE | |
| 405 | MAP_EXECUTABLE | MAP_32BIT, | 396 | MAP_EXECUTABLE | MAP_32BIT, |
| 406 | fd_offset + ex.a_text); | 397 | fd_offset + ex.a_text); |
| 407 | up_write(¤t->mm->mmap_sem); | ||
| 408 | if (error != N_DATADDR(ex)) { | 398 | if (error != N_DATADDR(ex)) { |
| 409 | send_sig(SIGKILL, current, 0); | 399 | send_sig(SIGKILL, current, 0); |
| 410 | return error; | 400 | return error; |
| @@ -476,9 +466,7 @@ static int load_aout_library(struct file *file) | |||
| 476 | error_time = jiffies; | 466 | error_time = jiffies; |
| 477 | } | 467 | } |
| 478 | #endif | 468 | #endif |
| 479 | down_write(¤t->mm->mmap_sem); | 469 | vm_brk(start_addr, ex.a_text + ex.a_data + ex.a_bss); |
| 480 | do_brk(start_addr, ex.a_text + ex.a_data + ex.a_bss); | ||
| 481 | up_write(¤t->mm->mmap_sem); | ||
| 482 | 470 | ||
| 483 | file->f_op->read(file, (char __user *)start_addr, | 471 | file->f_op->read(file, (char __user *)start_addr, |
| 484 | ex.a_text + ex.a_data, &pos); | 472 | ex.a_text + ex.a_data, &pos); |
| @@ -490,12 +478,10 @@ static int load_aout_library(struct file *file) | |||
| 490 | goto out; | 478 | goto out; |
| 491 | } | 479 | } |
| 492 | /* Now use mmap to map the library into memory. */ | 480 | /* Now use mmap to map the library into memory. */ |
| 493 | down_write(¤t->mm->mmap_sem); | 481 | error = vm_mmap(file, start_addr, ex.a_text + ex.a_data, |
| 494 | error = do_mmap(file, start_addr, ex.a_text + ex.a_data, | ||
| 495 | PROT_READ | PROT_WRITE | PROT_EXEC, | 482 | PROT_READ | PROT_WRITE | PROT_EXEC, |
| 496 | MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE | MAP_32BIT, | 483 | MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE | MAP_32BIT, |
| 497 | N_TXTOFF(ex)); | 484 | N_TXTOFF(ex)); |
| 498 | up_write(¤t->mm->mmap_sem); | ||
| 499 | retval = error; | 485 | retval = error; |
| 500 | if (error != start_addr) | 486 | if (error != start_addr) |
| 501 | goto out; | 487 | goto out; |
| @@ -503,9 +489,7 @@ static int load_aout_library(struct file *file) | |||
| 503 | len = PAGE_ALIGN(ex.a_text + ex.a_data); | 489 | len = PAGE_ALIGN(ex.a_text + ex.a_data); |
| 504 | bss = ex.a_text + ex.a_data + ex.a_bss; | 490 | bss = ex.a_text + ex.a_data + ex.a_bss; |
| 505 | if (bss > len) { | 491 | if (bss > len) { |
| 506 | down_write(¤t->mm->mmap_sem); | 492 | error = vm_brk(start_addr + len, bss - len); |
| 507 | error = do_brk(start_addr + len, bss - len); | ||
| 508 | up_write(¤t->mm->mmap_sem); | ||
| 509 | retval = error; | 493 | retval = error; |
| 510 | if (error != start_addr + len) | 494 | if (error != start_addr + len) |
| 511 | goto out; | 495 | goto out; |
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 4044ce0bf7c1..91a5e989abcf 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c | |||
| @@ -6336,13 +6336,11 @@ int kvm_arch_prepare_memory_region(struct kvm *kvm, | |||
| 6336 | if (npages && !old.rmap) { | 6336 | if (npages && !old.rmap) { |
| 6337 | unsigned long userspace_addr; | 6337 | unsigned long userspace_addr; |
| 6338 | 6338 | ||
| 6339 | down_write(¤t->mm->mmap_sem); | 6339 | userspace_addr = vm_mmap(NULL, 0, |
| 6340 | userspace_addr = do_mmap(NULL, 0, | ||
| 6341 | npages * PAGE_SIZE, | 6340 | npages * PAGE_SIZE, |
| 6342 | PROT_READ | PROT_WRITE, | 6341 | PROT_READ | PROT_WRITE, |
| 6343 | map_flags, | 6342 | map_flags, |
| 6344 | 0); | 6343 | 0); |
| 6345 | up_write(¤t->mm->mmap_sem); | ||
| 6346 | 6344 | ||
| 6347 | if (IS_ERR((void *)userspace_addr)) | 6345 | if (IS_ERR((void *)userspace_addr)) |
| 6348 | return PTR_ERR((void *)userspace_addr); | 6346 | return PTR_ERR((void *)userspace_addr); |
| @@ -6366,10 +6364,8 @@ void kvm_arch_commit_memory_region(struct kvm *kvm, | |||
| 6366 | if (!user_alloc && !old.user_alloc && old.rmap && !npages) { | 6364 | if (!user_alloc && !old.user_alloc && old.rmap && !npages) { |
| 6367 | int ret; | 6365 | int ret; |
| 6368 | 6366 | ||
| 6369 | down_write(¤t->mm->mmap_sem); | 6367 | ret = vm_munmap(old.userspace_addr, |
| 6370 | ret = do_munmap(current->mm, old.userspace_addr, | ||
| 6371 | old.npages * PAGE_SIZE); | 6368 | old.npages * PAGE_SIZE); |
| 6372 | up_write(¤t->mm->mmap_sem); | ||
| 6373 | if (ret < 0) | 6369 | if (ret < 0) |
| 6374 | printk(KERN_WARNING | 6370 | printk(KERN_WARNING |
| 6375 | "kvm_vm_ioctl_set_memory_region: " | 6371 | "kvm_vm_ioctl_set_memory_region: " |
diff --git a/drivers/gpu/drm/drm_bufs.c b/drivers/gpu/drm/drm_bufs.c index 30372f7b2d45..348b367debeb 100644 --- a/drivers/gpu/drm/drm_bufs.c +++ b/drivers/gpu/drm/drm_bufs.c | |||
| @@ -1510,8 +1510,8 @@ int drm_freebufs(struct drm_device *dev, void *data, | |||
| 1510 | * \param arg pointer to a drm_buf_map structure. | 1510 | * \param arg pointer to a drm_buf_map structure. |
| 1511 | * \return zero on success or a negative number on failure. | 1511 | * \return zero on success or a negative number on failure. |
| 1512 | * | 1512 | * |
| 1513 | * Maps the AGP, SG or PCI buffer region with do_mmap(), and copies information | 1513 | * Maps the AGP, SG or PCI buffer region with vm_mmap(), and copies information |
| 1514 | * about each buffer into user space. For PCI buffers, it calls do_mmap() with | 1514 | * about each buffer into user space. For PCI buffers, it calls vm_mmap() with |
| 1515 | * offset equal to 0, which drm_mmap() interpretes as PCI buffers and calls | 1515 | * offset equal to 0, which drm_mmap() interpretes as PCI buffers and calls |
| 1516 | * drm_mmap_dma(). | 1516 | * drm_mmap_dma(). |
| 1517 | */ | 1517 | */ |
| @@ -1553,18 +1553,14 @@ int drm_mapbufs(struct drm_device *dev, void *data, | |||
| 1553 | retcode = -EINVAL; | 1553 | retcode = -EINVAL; |
| 1554 | goto done; | 1554 | goto done; |
| 1555 | } | 1555 | } |
| 1556 | down_write(¤t->mm->mmap_sem); | 1556 | virtual = vm_mmap(file_priv->filp, 0, map->size, |
| 1557 | virtual = do_mmap(file_priv->filp, 0, map->size, | ||
| 1558 | PROT_READ | PROT_WRITE, | 1557 | PROT_READ | PROT_WRITE, |
| 1559 | MAP_SHARED, | 1558 | MAP_SHARED, |
| 1560 | token); | 1559 | token); |
| 1561 | up_write(¤t->mm->mmap_sem); | ||
| 1562 | } else { | 1560 | } else { |
| 1563 | down_write(¤t->mm->mmap_sem); | 1561 | virtual = vm_mmap(file_priv->filp, 0, dma->byte_count, |
| 1564 | virtual = do_mmap(file_priv->filp, 0, dma->byte_count, | ||
| 1565 | PROT_READ | PROT_WRITE, | 1562 | PROT_READ | PROT_WRITE, |
| 1566 | MAP_SHARED, 0); | 1563 | MAP_SHARED, 0); |
| 1567 | up_write(¤t->mm->mmap_sem); | ||
| 1568 | } | 1564 | } |
| 1569 | if (virtual > -1024UL) { | 1565 | if (virtual > -1024UL) { |
| 1570 | /* Real error */ | 1566 | /* Real error */ |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_gem.c b/drivers/gpu/drm/exynos/exynos_drm_gem.c index 26d51979116b..392ce71ed6a1 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_gem.c +++ b/drivers/gpu/drm/exynos/exynos_drm_gem.c | |||
| @@ -581,10 +581,8 @@ int exynos_drm_gem_mmap_ioctl(struct drm_device *dev, void *data, | |||
| 581 | obj->filp->f_op = &exynos_drm_gem_fops; | 581 | obj->filp->f_op = &exynos_drm_gem_fops; |
| 582 | obj->filp->private_data = obj; | 582 | obj->filp->private_data = obj; |
| 583 | 583 | ||
| 584 | down_write(¤t->mm->mmap_sem); | 584 | addr = vm_mmap(obj->filp, 0, args->size, |
| 585 | addr = do_mmap(obj->filp, 0, args->size, | ||
| 586 | PROT_READ | PROT_WRITE, MAP_SHARED, 0); | 585 | PROT_READ | PROT_WRITE, MAP_SHARED, 0); |
| 587 | up_write(¤t->mm->mmap_sem); | ||
| 588 | 586 | ||
| 589 | drm_gem_object_unreference_unlocked(obj); | 587 | drm_gem_object_unreference_unlocked(obj); |
| 590 | 588 | ||
diff --git a/drivers/gpu/drm/i810/i810_dma.c b/drivers/gpu/drm/i810/i810_dma.c index 2c8a60c3b98e..f920fb5e42b6 100644 --- a/drivers/gpu/drm/i810/i810_dma.c +++ b/drivers/gpu/drm/i810/i810_dma.c | |||
| @@ -129,6 +129,7 @@ static int i810_map_buffer(struct drm_buf *buf, struct drm_file *file_priv) | |||
| 129 | if (buf_priv->currently_mapped == I810_BUF_MAPPED) | 129 | if (buf_priv->currently_mapped == I810_BUF_MAPPED) |
| 130 | return -EINVAL; | 130 | return -EINVAL; |
| 131 | 131 | ||
| 132 | /* This is all entirely broken */ | ||
| 132 | down_write(¤t->mm->mmap_sem); | 133 | down_write(¤t->mm->mmap_sem); |
| 133 | old_fops = file_priv->filp->f_op; | 134 | old_fops = file_priv->filp->f_op; |
| 134 | file_priv->filp->f_op = &i810_buffer_fops; | 135 | file_priv->filp->f_op = &i810_buffer_fops; |
| @@ -157,11 +158,8 @@ static int i810_unmap_buffer(struct drm_buf *buf) | |||
| 157 | if (buf_priv->currently_mapped != I810_BUF_MAPPED) | 158 | if (buf_priv->currently_mapped != I810_BUF_MAPPED) |
| 158 | return -EINVAL; | 159 | return -EINVAL; |
| 159 | 160 | ||
| 160 | down_write(¤t->mm->mmap_sem); | 161 | retcode = vm_munmap((unsigned long)buf_priv->virtual, |
| 161 | retcode = do_munmap(current->mm, | ||
| 162 | (unsigned long)buf_priv->virtual, | ||
| 163 | (size_t) buf->total); | 162 | (size_t) buf->total); |
| 164 | up_write(¤t->mm->mmap_sem); | ||
| 165 | 163 | ||
| 166 | buf_priv->currently_mapped = I810_BUF_UNMAPPED; | 164 | buf_priv->currently_mapped = I810_BUF_UNMAPPED; |
| 167 | buf_priv->virtual = NULL; | 165 | buf_priv->virtual = NULL; |
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 0e3c6acde955..0d1e4b7b4b99 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c | |||
| @@ -1087,11 +1087,9 @@ i915_gem_mmap_ioctl(struct drm_device *dev, void *data, | |||
| 1087 | if (obj == NULL) | 1087 | if (obj == NULL) |
| 1088 | return -ENOENT; | 1088 | return -ENOENT; |
| 1089 | 1089 | ||
| 1090 | down_write(¤t->mm->mmap_sem); | 1090 | addr = vm_mmap(obj->filp, 0, args->size, |
| 1091 | addr = do_mmap(obj->filp, 0, args->size, | ||
| 1092 | PROT_READ | PROT_WRITE, MAP_SHARED, | 1091 | PROT_READ | PROT_WRITE, MAP_SHARED, |
| 1093 | args->offset); | 1092 | args->offset); |
| 1094 | up_write(¤t->mm->mmap_sem); | ||
| 1095 | drm_gem_object_unreference_unlocked(obj); | 1093 | drm_gem_object_unreference_unlocked(obj); |
| 1096 | if (IS_ERR((void *)addr)) | 1094 | if (IS_ERR((void *)addr)) |
| 1097 | return addr; | 1095 | return addr; |
diff --git a/drivers/input/misc/Kconfig b/drivers/input/misc/Kconfig index 2d787796bf50..7faf4a7fcaa9 100644 --- a/drivers/input/misc/Kconfig +++ b/drivers/input/misc/Kconfig | |||
| @@ -380,8 +380,7 @@ config INPUT_TWL4030_VIBRA | |||
| 380 | 380 | ||
| 381 | config INPUT_TWL6040_VIBRA | 381 | config INPUT_TWL6040_VIBRA |
| 382 | tristate "Support for TWL6040 Vibrator" | 382 | tristate "Support for TWL6040 Vibrator" |
| 383 | depends on TWL4030_CORE | 383 | depends on TWL6040_CORE |
| 384 | select TWL6040_CORE | ||
| 385 | select INPUT_FF_MEMLESS | 384 | select INPUT_FF_MEMLESS |
| 386 | help | 385 | help |
| 387 | This option enables support for TWL6040 Vibrator Driver. | 386 | This option enables support for TWL6040 Vibrator Driver. |
diff --git a/drivers/input/misc/twl6040-vibra.c b/drivers/input/misc/twl6040-vibra.c index 45874fed523a..14e94f56cb7d 100644 --- a/drivers/input/misc/twl6040-vibra.c +++ b/drivers/input/misc/twl6040-vibra.c | |||
| @@ -28,7 +28,7 @@ | |||
| 28 | #include <linux/module.h> | 28 | #include <linux/module.h> |
| 29 | #include <linux/platform_device.h> | 29 | #include <linux/platform_device.h> |
| 30 | #include <linux/workqueue.h> | 30 | #include <linux/workqueue.h> |
| 31 | #include <linux/i2c/twl.h> | 31 | #include <linux/input.h> |
| 32 | #include <linux/mfd/twl6040.h> | 32 | #include <linux/mfd/twl6040.h> |
| 33 | #include <linux/slab.h> | 33 | #include <linux/slab.h> |
| 34 | #include <linux/delay.h> | 34 | #include <linux/delay.h> |
| @@ -257,7 +257,7 @@ static SIMPLE_DEV_PM_OPS(twl6040_vibra_pm_ops, twl6040_vibra_suspend, NULL); | |||
| 257 | 257 | ||
| 258 | static int __devinit twl6040_vibra_probe(struct platform_device *pdev) | 258 | static int __devinit twl6040_vibra_probe(struct platform_device *pdev) |
| 259 | { | 259 | { |
| 260 | struct twl4030_vibra_data *pdata = pdev->dev.platform_data; | 260 | struct twl6040_vibra_data *pdata = pdev->dev.platform_data; |
| 261 | struct vibra_info *info; | 261 | struct vibra_info *info; |
| 262 | int ret; | 262 | int ret; |
| 263 | 263 | ||
diff --git a/drivers/media/common/tuners/xc5000.c b/drivers/media/common/tuners/xc5000.c index 7f98984e4fad..eab2ea424200 100644 --- a/drivers/media/common/tuners/xc5000.c +++ b/drivers/media/common/tuners/xc5000.c | |||
| @@ -54,6 +54,7 @@ struct xc5000_priv { | |||
| 54 | struct list_head hybrid_tuner_instance_list; | 54 | struct list_head hybrid_tuner_instance_list; |
| 55 | 55 | ||
| 56 | u32 if_khz; | 56 | u32 if_khz; |
| 57 | u32 xtal_khz; | ||
| 57 | u32 freq_hz; | 58 | u32 freq_hz; |
| 58 | u32 bandwidth; | 59 | u32 bandwidth; |
| 59 | u8 video_standard; | 60 | u8 video_standard; |
| @@ -214,9 +215,9 @@ static const struct xc5000_fw_cfg xc5000a_1_6_114 = { | |||
| 214 | .size = 12401, | 215 | .size = 12401, |
| 215 | }; | 216 | }; |
| 216 | 217 | ||
| 217 | static const struct xc5000_fw_cfg xc5000c_41_024_5_31875 = { | 218 | static const struct xc5000_fw_cfg xc5000c_41_024_5 = { |
| 218 | .name = "dvb-fe-xc5000c-41.024.5-31875.fw", | 219 | .name = "dvb-fe-xc5000c-41.024.5.fw", |
| 219 | .size = 16503, | 220 | .size = 16497, |
| 220 | }; | 221 | }; |
| 221 | 222 | ||
| 222 | static inline const struct xc5000_fw_cfg *xc5000_assign_firmware(int chip_id) | 223 | static inline const struct xc5000_fw_cfg *xc5000_assign_firmware(int chip_id) |
| @@ -226,7 +227,7 @@ static inline const struct xc5000_fw_cfg *xc5000_assign_firmware(int chip_id) | |||
| 226 | case XC5000A: | 227 | case XC5000A: |
| 227 | return &xc5000a_1_6_114; | 228 | return &xc5000a_1_6_114; |
| 228 | case XC5000C: | 229 | case XC5000C: |
| 229 | return &xc5000c_41_024_5_31875; | 230 | return &xc5000c_41_024_5; |
| 230 | } | 231 | } |
| 231 | } | 232 | } |
| 232 | 233 | ||
| @@ -572,6 +573,31 @@ static int xc_tune_channel(struct xc5000_priv *priv, u32 freq_hz, int mode) | |||
| 572 | return found; | 573 | return found; |
| 573 | } | 574 | } |
| 574 | 575 | ||
| 576 | static int xc_set_xtal(struct dvb_frontend *fe) | ||
| 577 | { | ||
| 578 | struct xc5000_priv *priv = fe->tuner_priv; | ||
| 579 | int ret = XC_RESULT_SUCCESS; | ||
| 580 | |||
| 581 | switch (priv->chip_id) { | ||
| 582 | default: | ||
| 583 | case XC5000A: | ||
| 584 | /* 32.000 MHz xtal is default */ | ||
| 585 | break; | ||
| 586 | case XC5000C: | ||
| 587 | switch (priv->xtal_khz) { | ||
| 588 | default: | ||
| 589 | case 32000: | ||
| 590 | /* 32.000 MHz xtal is default */ | ||
| 591 | break; | ||
| 592 | case 31875: | ||
| 593 | /* 31.875 MHz xtal configuration */ | ||
| 594 | ret = xc_write_reg(priv, 0x000f, 0x8081); | ||
| 595 | break; | ||
| 596 | } | ||
| 597 | break; | ||
| 598 | } | ||
| 599 | return ret; | ||
| 600 | } | ||
| 575 | 601 | ||
| 576 | static int xc5000_fwupload(struct dvb_frontend *fe) | 602 | static int xc5000_fwupload(struct dvb_frontend *fe) |
| 577 | { | 603 | { |
| @@ -603,6 +629,8 @@ static int xc5000_fwupload(struct dvb_frontend *fe) | |||
| 603 | } else { | 629 | } else { |
| 604 | printk(KERN_INFO "xc5000: firmware uploading...\n"); | 630 | printk(KERN_INFO "xc5000: firmware uploading...\n"); |
| 605 | ret = xc_load_i2c_sequence(fe, fw->data); | 631 | ret = xc_load_i2c_sequence(fe, fw->data); |
| 632 | if (XC_RESULT_SUCCESS == ret) | ||
| 633 | ret = xc_set_xtal(fe); | ||
| 606 | printk(KERN_INFO "xc5000: firmware upload complete...\n"); | 634 | printk(KERN_INFO "xc5000: firmware upload complete...\n"); |
| 607 | } | 635 | } |
| 608 | 636 | ||
| @@ -1164,6 +1192,9 @@ struct dvb_frontend *xc5000_attach(struct dvb_frontend *fe, | |||
| 1164 | priv->if_khz = cfg->if_khz; | 1192 | priv->if_khz = cfg->if_khz; |
| 1165 | } | 1193 | } |
| 1166 | 1194 | ||
| 1195 | if (priv->xtal_khz == 0) | ||
| 1196 | priv->xtal_khz = cfg->xtal_khz; | ||
| 1197 | |||
| 1167 | if (priv->radio_input == 0) | 1198 | if (priv->radio_input == 0) |
| 1168 | priv->radio_input = cfg->radio_input; | 1199 | priv->radio_input = cfg->radio_input; |
| 1169 | 1200 | ||
diff --git a/drivers/media/common/tuners/xc5000.h b/drivers/media/common/tuners/xc5000.h index 3396f8e02b40..39a73bf01406 100644 --- a/drivers/media/common/tuners/xc5000.h +++ b/drivers/media/common/tuners/xc5000.h | |||
| @@ -34,6 +34,7 @@ struct xc5000_config { | |||
| 34 | u8 i2c_address; | 34 | u8 i2c_address; |
| 35 | u32 if_khz; | 35 | u32 if_khz; |
| 36 | u8 radio_input; | 36 | u8 radio_input; |
| 37 | u32 xtal_khz; | ||
| 37 | 38 | ||
| 38 | int chip_id; | 39 | int chip_id; |
| 39 | }; | 40 | }; |
diff --git a/drivers/media/dvb/dvb-core/dvb_frontend.c b/drivers/media/dvb/dvb-core/dvb_frontend.c index 39696c6a4ed7..0f64d7182657 100644 --- a/drivers/media/dvb/dvb-core/dvb_frontend.c +++ b/drivers/media/dvb/dvb-core/dvb_frontend.c | |||
| @@ -1446,6 +1446,28 @@ static int set_delivery_system(struct dvb_frontend *fe, u32 desired_system) | |||
| 1446 | __func__); | 1446 | __func__); |
| 1447 | return -EINVAL; | 1447 | return -EINVAL; |
| 1448 | } | 1448 | } |
| 1449 | /* | ||
| 1450 | * Get a delivery system that is compatible with DVBv3 | ||
| 1451 | * NOTE: in order for this to work with softwares like Kaffeine that | ||
| 1452 | * uses a DVBv5 call for DVB-S2 and a DVBv3 call to go back to | ||
| 1453 | * DVB-S, drivers that support both should put the SYS_DVBS entry | ||
| 1454 | * before the SYS_DVBS2, otherwise it won't switch back to DVB-S. | ||
| 1455 | * The real fix is that userspace applications should not use DVBv3 | ||
| 1456 | * and not trust on calling FE_SET_FRONTEND to switch the delivery | ||
| 1457 | * system. | ||
| 1458 | */ | ||
| 1459 | ncaps = 0; | ||
| 1460 | while (fe->ops.delsys[ncaps] && ncaps < MAX_DELSYS) { | ||
| 1461 | if (fe->ops.delsys[ncaps] == desired_system) { | ||
| 1462 | delsys = desired_system; | ||
| 1463 | break; | ||
| 1464 | } | ||
| 1465 | ncaps++; | ||
| 1466 | } | ||
| 1467 | if (delsys == SYS_UNDEFINED) { | ||
| 1468 | dprintk("%s() Couldn't find a delivery system that matches %d\n", | ||
| 1469 | __func__, desired_system); | ||
| 1470 | } | ||
| 1449 | } else { | 1471 | } else { |
| 1450 | /* | 1472 | /* |
| 1451 | * This is a DVBv5 call. So, it likely knows the supported | 1473 | * This is a DVBv5 call. So, it likely knows the supported |
| @@ -1494,9 +1516,10 @@ static int set_delivery_system(struct dvb_frontend *fe, u32 desired_system) | |||
| 1494 | __func__); | 1516 | __func__); |
| 1495 | return -EINVAL; | 1517 | return -EINVAL; |
| 1496 | } | 1518 | } |
| 1497 | c->delivery_system = delsys; | ||
| 1498 | } | 1519 | } |
| 1499 | 1520 | ||
| 1521 | c->delivery_system = delsys; | ||
| 1522 | |||
| 1500 | /* | 1523 | /* |
| 1501 | * The DVBv3 or DVBv5 call is requesting a different system. So, | 1524 | * The DVBv3 or DVBv5 call is requesting a different system. So, |
| 1502 | * emulation is needed. | 1525 | * emulation is needed. |
diff --git a/drivers/media/dvb/frontends/drxk_hard.c b/drivers/media/dvb/frontends/drxk_hard.c index 36d11756492f..a414b1f2b6a5 100644 --- a/drivers/media/dvb/frontends/drxk_hard.c +++ b/drivers/media/dvb/frontends/drxk_hard.c | |||
| @@ -1520,8 +1520,10 @@ static int scu_command(struct drxk_state *state, | |||
| 1520 | dprintk(1, "\n"); | 1520 | dprintk(1, "\n"); |
| 1521 | 1521 | ||
| 1522 | if ((cmd == 0) || ((parameterLen > 0) && (parameter == NULL)) || | 1522 | if ((cmd == 0) || ((parameterLen > 0) && (parameter == NULL)) || |
| 1523 | ((resultLen > 0) && (result == NULL))) | 1523 | ((resultLen > 0) && (result == NULL))) { |
| 1524 | goto error; | 1524 | printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__); |
| 1525 | return status; | ||
| 1526 | } | ||
| 1525 | 1527 | ||
| 1526 | mutex_lock(&state->mutex); | 1528 | mutex_lock(&state->mutex); |
| 1527 | 1529 | ||
diff --git a/drivers/media/rc/winbond-cir.c b/drivers/media/rc/winbond-cir.c index b09c5fae489b..af526586fa26 100644 --- a/drivers/media/rc/winbond-cir.c +++ b/drivers/media/rc/winbond-cir.c | |||
| @@ -1046,6 +1046,7 @@ wbcir_probe(struct pnp_dev *device, const struct pnp_device_id *dev_id) | |||
| 1046 | goto exit_unregister_led; | 1046 | goto exit_unregister_led; |
| 1047 | } | 1047 | } |
| 1048 | 1048 | ||
| 1049 | data->dev->driver_type = RC_DRIVER_IR_RAW; | ||
| 1049 | data->dev->driver_name = WBCIR_NAME; | 1050 | data->dev->driver_name = WBCIR_NAME; |
| 1050 | data->dev->input_name = WBCIR_NAME; | 1051 | data->dev->input_name = WBCIR_NAME; |
| 1051 | data->dev->input_phys = "wbcir/cir0"; | 1052 | data->dev->input_phys = "wbcir/cir0"; |
diff --git a/drivers/media/video/Kconfig b/drivers/media/video/Kconfig index f2479c5c0eb2..ce1e7ba940f6 100644 --- a/drivers/media/video/Kconfig +++ b/drivers/media/video/Kconfig | |||
| @@ -492,7 +492,7 @@ config VIDEO_VS6624 | |||
| 492 | 492 | ||
| 493 | config VIDEO_MT9M032 | 493 | config VIDEO_MT9M032 |
| 494 | tristate "MT9M032 camera sensor support" | 494 | tristate "MT9M032 camera sensor support" |
| 495 | depends on I2C && VIDEO_V4L2 | 495 | depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API |
| 496 | select VIDEO_APTINA_PLL | 496 | select VIDEO_APTINA_PLL |
| 497 | ---help--- | 497 | ---help--- |
| 498 | This driver supports MT9M032 camera sensors from Aptina, monochrome | 498 | This driver supports MT9M032 camera sensors from Aptina, monochrome |
diff --git a/drivers/media/video/mt9m032.c b/drivers/media/video/mt9m032.c index 7636672c3548..645973c5feb0 100644 --- a/drivers/media/video/mt9m032.c +++ b/drivers/media/video/mt9m032.c | |||
| @@ -392,10 +392,11 @@ static int mt9m032_set_pad_format(struct v4l2_subdev *subdev, | |||
| 392 | } | 392 | } |
| 393 | 393 | ||
| 394 | /* Scaling is not supported, the format is thus fixed. */ | 394 | /* Scaling is not supported, the format is thus fixed. */ |
| 395 | ret = mt9m032_get_pad_format(subdev, fh, fmt); | 395 | fmt->format = *__mt9m032_get_pad_format(sensor, fh, fmt->which); |
| 396 | ret = 0; | ||
| 396 | 397 | ||
| 397 | done: | 398 | done: |
| 398 | mutex_lock(&sensor->lock); | 399 | mutex_unlock(&sensor->lock); |
| 399 | return ret; | 400 | return ret; |
| 400 | } | 401 | } |
| 401 | 402 | ||
diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig index 29f463cc09cb..11e44386fa9b 100644 --- a/drivers/mfd/Kconfig +++ b/drivers/mfd/Kconfig | |||
| @@ -268,10 +268,17 @@ config TWL6030_PWM | |||
| 268 | This is used to control charging LED brightness. | 268 | This is used to control charging LED brightness. |
| 269 | 269 | ||
| 270 | config TWL6040_CORE | 270 | config TWL6040_CORE |
| 271 | bool | 271 | bool "Support for TWL6040 audio codec" |
| 272 | depends on TWL4030_CORE && GENERIC_HARDIRQS | 272 | depends on I2C=y && GENERIC_HARDIRQS |
| 273 | select MFD_CORE | 273 | select MFD_CORE |
| 274 | select REGMAP_I2C | ||
| 274 | default n | 275 | default n |
| 276 | help | ||
| 277 | Say yes here if you want support for Texas Instruments TWL6040 audio | ||
| 278 | codec. | ||
| 279 | This driver provides common support for accessing the device, | ||
| 280 | additional drivers must be enabled in order to use the | ||
| 281 | functionality of the device (audio, vibra). | ||
| 275 | 282 | ||
| 276 | config MFD_STMPE | 283 | config MFD_STMPE |
| 277 | bool "Support STMicroelectronics STMPE" | 284 | bool "Support STMicroelectronics STMPE" |
diff --git a/drivers/mfd/asic3.c b/drivers/mfd/asic3.c index 1895cf9fab8c..1582c3d95257 100644 --- a/drivers/mfd/asic3.c +++ b/drivers/mfd/asic3.c | |||
| @@ -527,7 +527,9 @@ static void asic3_gpio_set(struct gpio_chip *chip, | |||
| 527 | 527 | ||
| 528 | static int asic3_gpio_to_irq(struct gpio_chip *chip, unsigned offset) | 528 | static int asic3_gpio_to_irq(struct gpio_chip *chip, unsigned offset) |
| 529 | { | 529 | { |
| 530 | return (offset < ASIC3_NUM_GPIOS) ? IRQ_BOARD_START + offset : -ENXIO; | 530 | struct asic3 *asic = container_of(chip, struct asic3, gpio); |
| 531 | |||
| 532 | return (offset < ASIC3_NUM_GPIOS) ? asic->irq_base + offset : -ENXIO; | ||
| 531 | } | 533 | } |
| 532 | 534 | ||
| 533 | static __init int asic3_gpio_probe(struct platform_device *pdev, | 535 | static __init int asic3_gpio_probe(struct platform_device *pdev, |
diff --git a/drivers/mfd/omap-usb-host.c b/drivers/mfd/omap-usb-host.c index 95a2e546a489..c8aae6640e64 100644 --- a/drivers/mfd/omap-usb-host.c +++ b/drivers/mfd/omap-usb-host.c | |||
| @@ -25,7 +25,6 @@ | |||
| 25 | #include <linux/clk.h> | 25 | #include <linux/clk.h> |
| 26 | #include <linux/dma-mapping.h> | 26 | #include <linux/dma-mapping.h> |
| 27 | #include <linux/spinlock.h> | 27 | #include <linux/spinlock.h> |
| 28 | #include <linux/gpio.h> | ||
| 29 | #include <plat/usb.h> | 28 | #include <plat/usb.h> |
| 30 | #include <linux/pm_runtime.h> | 29 | #include <linux/pm_runtime.h> |
| 31 | 30 | ||
| @@ -502,19 +501,6 @@ static void omap_usbhs_init(struct device *dev) | |||
| 502 | pm_runtime_get_sync(dev); | 501 | pm_runtime_get_sync(dev); |
| 503 | spin_lock_irqsave(&omap->lock, flags); | 502 | spin_lock_irqsave(&omap->lock, flags); |
| 504 | 503 | ||
| 505 | if (pdata->ehci_data->phy_reset) { | ||
| 506 | if (gpio_is_valid(pdata->ehci_data->reset_gpio_port[0])) | ||
| 507 | gpio_request_one(pdata->ehci_data->reset_gpio_port[0], | ||
| 508 | GPIOF_OUT_INIT_LOW, "USB1 PHY reset"); | ||
| 509 | |||
| 510 | if (gpio_is_valid(pdata->ehci_data->reset_gpio_port[1])) | ||
| 511 | gpio_request_one(pdata->ehci_data->reset_gpio_port[1], | ||
| 512 | GPIOF_OUT_INIT_LOW, "USB2 PHY reset"); | ||
| 513 | |||
| 514 | /* Hold the PHY in RESET for enough time till DIR is high */ | ||
| 515 | udelay(10); | ||
| 516 | } | ||
| 517 | |||
| 518 | omap->usbhs_rev = usbhs_read(omap->uhh_base, OMAP_UHH_REVISION); | 504 | omap->usbhs_rev = usbhs_read(omap->uhh_base, OMAP_UHH_REVISION); |
| 519 | dev_dbg(dev, "OMAP UHH_REVISION 0x%x\n", omap->usbhs_rev); | 505 | dev_dbg(dev, "OMAP UHH_REVISION 0x%x\n", omap->usbhs_rev); |
| 520 | 506 | ||
| @@ -593,39 +579,10 @@ static void omap_usbhs_init(struct device *dev) | |||
| 593 | usbhs_omap_tll_init(dev, OMAP_TLL_CHANNEL_COUNT); | 579 | usbhs_omap_tll_init(dev, OMAP_TLL_CHANNEL_COUNT); |
| 594 | } | 580 | } |
| 595 | 581 | ||
| 596 | if (pdata->ehci_data->phy_reset) { | ||
| 597 | /* Hold the PHY in RESET for enough time till | ||
| 598 | * PHY is settled and ready | ||
| 599 | */ | ||
| 600 | udelay(10); | ||
| 601 | |||
| 602 | if (gpio_is_valid(pdata->ehci_data->reset_gpio_port[0])) | ||
| 603 | gpio_set_value | ||
| 604 | (pdata->ehci_data->reset_gpio_port[0], 1); | ||
| 605 | |||
| 606 | if (gpio_is_valid(pdata->ehci_data->reset_gpio_port[1])) | ||
| 607 | gpio_set_value | ||
| 608 | (pdata->ehci_data->reset_gpio_port[1], 1); | ||
| 609 | } | ||
| 610 | |||
| 611 | spin_unlock_irqrestore(&omap->lock, flags); | 582 | spin_unlock_irqrestore(&omap->lock, flags); |
| 612 | pm_runtime_put_sync(dev); | 583 | pm_runtime_put_sync(dev); |
| 613 | } | 584 | } |
| 614 | 585 | ||
| 615 | static void omap_usbhs_deinit(struct device *dev) | ||
| 616 | { | ||
| 617 | struct usbhs_hcd_omap *omap = dev_get_drvdata(dev); | ||
| 618 | struct usbhs_omap_platform_data *pdata = &omap->platdata; | ||
| 619 | |||
| 620 | if (pdata->ehci_data->phy_reset) { | ||
| 621 | if (gpio_is_valid(pdata->ehci_data->reset_gpio_port[0])) | ||
| 622 | gpio_free(pdata->ehci_data->reset_gpio_port[0]); | ||
| 623 | |||
| 624 | if (gpio_is_valid(pdata->ehci_data->reset_gpio_port[1])) | ||
| 625 | gpio_free(pdata->ehci_data->reset_gpio_port[1]); | ||
| 626 | } | ||
| 627 | } | ||
| 628 | |||
| 629 | 586 | ||
| 630 | /** | 587 | /** |
| 631 | * usbhs_omap_probe - initialize TI-based HCDs | 588 | * usbhs_omap_probe - initialize TI-based HCDs |
| @@ -860,7 +817,6 @@ static int __devexit usbhs_omap_remove(struct platform_device *pdev) | |||
| 860 | { | 817 | { |
| 861 | struct usbhs_hcd_omap *omap = platform_get_drvdata(pdev); | 818 | struct usbhs_hcd_omap *omap = platform_get_drvdata(pdev); |
| 862 | 819 | ||
| 863 | omap_usbhs_deinit(&pdev->dev); | ||
| 864 | iounmap(omap->tll_base); | 820 | iounmap(omap->tll_base); |
| 865 | iounmap(omap->uhh_base); | 821 | iounmap(omap->uhh_base); |
| 866 | clk_put(omap->init_60m_fclk); | 822 | clk_put(omap->init_60m_fclk); |
diff --git a/drivers/mfd/rc5t583.c b/drivers/mfd/rc5t583.c index 99ef944c621d..44afae0a69ce 100644 --- a/drivers/mfd/rc5t583.c +++ b/drivers/mfd/rc5t583.c | |||
| @@ -80,44 +80,6 @@ static struct mfd_cell rc5t583_subdevs[] = { | |||
| 80 | {.name = "rc5t583-key", } | 80 | {.name = "rc5t583-key", } |
| 81 | }; | 81 | }; |
| 82 | 82 | ||
| 83 | int rc5t583_write(struct device *dev, uint8_t reg, uint8_t val) | ||
| 84 | { | ||
| 85 | struct rc5t583 *rc5t583 = dev_get_drvdata(dev); | ||
| 86 | return regmap_write(rc5t583->regmap, reg, val); | ||
| 87 | } | ||
| 88 | |||
| 89 | int rc5t583_read(struct device *dev, uint8_t reg, uint8_t *val) | ||
| 90 | { | ||
| 91 | struct rc5t583 *rc5t583 = dev_get_drvdata(dev); | ||
| 92 | unsigned int ival; | ||
| 93 | int ret; | ||
| 94 | ret = regmap_read(rc5t583->regmap, reg, &ival); | ||
| 95 | if (!ret) | ||
| 96 | *val = (uint8_t)ival; | ||
| 97 | return ret; | ||
| 98 | } | ||
| 99 | |||
| 100 | int rc5t583_set_bits(struct device *dev, unsigned int reg, | ||
| 101 | unsigned int bit_mask) | ||
| 102 | { | ||
| 103 | struct rc5t583 *rc5t583 = dev_get_drvdata(dev); | ||
| 104 | return regmap_update_bits(rc5t583->regmap, reg, bit_mask, bit_mask); | ||
| 105 | } | ||
| 106 | |||
| 107 | int rc5t583_clear_bits(struct device *dev, unsigned int reg, | ||
| 108 | unsigned int bit_mask) | ||
| 109 | { | ||
| 110 | struct rc5t583 *rc5t583 = dev_get_drvdata(dev); | ||
| 111 | return regmap_update_bits(rc5t583->regmap, reg, bit_mask, 0); | ||
| 112 | } | ||
| 113 | |||
| 114 | int rc5t583_update(struct device *dev, unsigned int reg, | ||
| 115 | unsigned int val, unsigned int mask) | ||
| 116 | { | ||
| 117 | struct rc5t583 *rc5t583 = dev_get_drvdata(dev); | ||
| 118 | return regmap_update_bits(rc5t583->regmap, reg, mask, val); | ||
| 119 | } | ||
| 120 | |||
| 121 | static int __rc5t583_set_ext_pwrreq1_control(struct device *dev, | 83 | static int __rc5t583_set_ext_pwrreq1_control(struct device *dev, |
| 122 | int id, int ext_pwr, int slots) | 84 | int id, int ext_pwr, int slots) |
| 123 | { | 85 | { |
| @@ -197,6 +159,7 @@ int rc5t583_ext_power_req_config(struct device *dev, int ds_id, | |||
| 197 | ds_id, ext_pwr_req); | 159 | ds_id, ext_pwr_req); |
| 198 | return 0; | 160 | return 0; |
| 199 | } | 161 | } |
| 162 | EXPORT_SYMBOL(rc5t583_ext_power_req_config); | ||
| 200 | 163 | ||
| 201 | static int rc5t583_clear_ext_power_req(struct rc5t583 *rc5t583, | 164 | static int rc5t583_clear_ext_power_req(struct rc5t583 *rc5t583, |
| 202 | struct rc5t583_platform_data *pdata) | 165 | struct rc5t583_platform_data *pdata) |
diff --git a/drivers/mfd/twl6040-core.c b/drivers/mfd/twl6040-core.c index b2d8e512d3cb..2d6bedadca09 100644 --- a/drivers/mfd/twl6040-core.c +++ b/drivers/mfd/twl6040-core.c | |||
| @@ -30,7 +30,9 @@ | |||
| 30 | #include <linux/platform_device.h> | 30 | #include <linux/platform_device.h> |
| 31 | #include <linux/gpio.h> | 31 | #include <linux/gpio.h> |
| 32 | #include <linux/delay.h> | 32 | #include <linux/delay.h> |
| 33 | #include <linux/i2c/twl.h> | 33 | #include <linux/i2c.h> |
| 34 | #include <linux/regmap.h> | ||
| 35 | #include <linux/err.h> | ||
| 34 | #include <linux/mfd/core.h> | 36 | #include <linux/mfd/core.h> |
| 35 | #include <linux/mfd/twl6040.h> | 37 | #include <linux/mfd/twl6040.h> |
| 36 | 38 | ||
| @@ -39,7 +41,7 @@ | |||
| 39 | int twl6040_reg_read(struct twl6040 *twl6040, unsigned int reg) | 41 | int twl6040_reg_read(struct twl6040 *twl6040, unsigned int reg) |
| 40 | { | 42 | { |
| 41 | int ret; | 43 | int ret; |
| 42 | u8 val = 0; | 44 | unsigned int val; |
| 43 | 45 | ||
| 44 | mutex_lock(&twl6040->io_mutex); | 46 | mutex_lock(&twl6040->io_mutex); |
| 45 | /* Vibra control registers from cache */ | 47 | /* Vibra control registers from cache */ |
| @@ -47,7 +49,7 @@ int twl6040_reg_read(struct twl6040 *twl6040, unsigned int reg) | |||
| 47 | reg == TWL6040_REG_VIBCTLR)) { | 49 | reg == TWL6040_REG_VIBCTLR)) { |
| 48 | val = twl6040->vibra_ctrl_cache[VIBRACTRL_MEMBER(reg)]; | 50 | val = twl6040->vibra_ctrl_cache[VIBRACTRL_MEMBER(reg)]; |
| 49 | } else { | 51 | } else { |
| 50 | ret = twl_i2c_read_u8(TWL_MODULE_AUDIO_VOICE, &val, reg); | 52 | ret = regmap_read(twl6040->regmap, reg, &val); |
| 51 | if (ret < 0) { | 53 | if (ret < 0) { |
| 52 | mutex_unlock(&twl6040->io_mutex); | 54 | mutex_unlock(&twl6040->io_mutex); |
| 53 | return ret; | 55 | return ret; |
| @@ -64,7 +66,7 @@ int twl6040_reg_write(struct twl6040 *twl6040, unsigned int reg, u8 val) | |||
| 64 | int ret; | 66 | int ret; |
| 65 | 67 | ||
| 66 | mutex_lock(&twl6040->io_mutex); | 68 | mutex_lock(&twl6040->io_mutex); |
| 67 | ret = twl_i2c_write_u8(TWL_MODULE_AUDIO_VOICE, val, reg); | 69 | ret = regmap_write(twl6040->regmap, reg, val); |
| 68 | /* Cache the vibra control registers */ | 70 | /* Cache the vibra control registers */ |
| 69 | if (reg == TWL6040_REG_VIBCTLL || reg == TWL6040_REG_VIBCTLR) | 71 | if (reg == TWL6040_REG_VIBCTLL || reg == TWL6040_REG_VIBCTLR) |
| 70 | twl6040->vibra_ctrl_cache[VIBRACTRL_MEMBER(reg)] = val; | 72 | twl6040->vibra_ctrl_cache[VIBRACTRL_MEMBER(reg)] = val; |
| @@ -77,16 +79,9 @@ EXPORT_SYMBOL(twl6040_reg_write); | |||
| 77 | int twl6040_set_bits(struct twl6040 *twl6040, unsigned int reg, u8 mask) | 79 | int twl6040_set_bits(struct twl6040 *twl6040, unsigned int reg, u8 mask) |
| 78 | { | 80 | { |
| 79 | int ret; | 81 | int ret; |
| 80 | u8 val; | ||
| 81 | 82 | ||
| 82 | mutex_lock(&twl6040->io_mutex); | 83 | mutex_lock(&twl6040->io_mutex); |
| 83 | ret = twl_i2c_read_u8(TWL_MODULE_AUDIO_VOICE, &val, reg); | 84 | ret = regmap_update_bits(twl6040->regmap, reg, mask, mask); |
| 84 | if (ret) | ||
| 85 | goto out; | ||
| 86 | |||
| 87 | val |= mask; | ||
| 88 | ret = twl_i2c_write_u8(TWL_MODULE_AUDIO_VOICE, val, reg); | ||
| 89 | out: | ||
| 90 | mutex_unlock(&twl6040->io_mutex); | 85 | mutex_unlock(&twl6040->io_mutex); |
| 91 | return ret; | 86 | return ret; |
| 92 | } | 87 | } |
| @@ -95,16 +90,9 @@ EXPORT_SYMBOL(twl6040_set_bits); | |||
| 95 | int twl6040_clear_bits(struct twl6040 *twl6040, unsigned int reg, u8 mask) | 90 | int twl6040_clear_bits(struct twl6040 *twl6040, unsigned int reg, u8 mask) |
| 96 | { | 91 | { |
| 97 | int ret; | 92 | int ret; |
| 98 | u8 val; | ||
| 99 | 93 | ||
| 100 | mutex_lock(&twl6040->io_mutex); | 94 | mutex_lock(&twl6040->io_mutex); |
| 101 | ret = twl_i2c_read_u8(TWL_MODULE_AUDIO_VOICE, &val, reg); | 95 | ret = regmap_update_bits(twl6040->regmap, reg, mask, 0); |
| 102 | if (ret) | ||
| 103 | goto out; | ||
| 104 | |||
| 105 | val &= ~mask; | ||
| 106 | ret = twl_i2c_write_u8(TWL_MODULE_AUDIO_VOICE, val, reg); | ||
| 107 | out: | ||
| 108 | mutex_unlock(&twl6040->io_mutex); | 96 | mutex_unlock(&twl6040->io_mutex); |
| 109 | return ret; | 97 | return ret; |
| 110 | } | 98 | } |
| @@ -494,32 +482,58 @@ static struct resource twl6040_codec_rsrc[] = { | |||
| 494 | }, | 482 | }, |
| 495 | }; | 483 | }; |
| 496 | 484 | ||
| 497 | static int __devinit twl6040_probe(struct platform_device *pdev) | 485 | static bool twl6040_readable_reg(struct device *dev, unsigned int reg) |
| 498 | { | 486 | { |
| 499 | struct twl4030_audio_data *pdata = pdev->dev.platform_data; | 487 | /* Register 0 is not readable */ |
| 488 | if (!reg) | ||
| 489 | return false; | ||
| 490 | return true; | ||
| 491 | } | ||
| 492 | |||
| 493 | static struct regmap_config twl6040_regmap_config = { | ||
| 494 | .reg_bits = 8, | ||
| 495 | .val_bits = 8, | ||
| 496 | .max_register = TWL6040_REG_STATUS, /* 0x2e */ | ||
| 497 | |||
| 498 | .readable_reg = twl6040_readable_reg, | ||
| 499 | }; | ||
| 500 | |||
| 501 | static int __devinit twl6040_probe(struct i2c_client *client, | ||
| 502 | const struct i2c_device_id *id) | ||
| 503 | { | ||
| 504 | struct twl6040_platform_data *pdata = client->dev.platform_data; | ||
| 500 | struct twl6040 *twl6040; | 505 | struct twl6040 *twl6040; |
| 501 | struct mfd_cell *cell = NULL; | 506 | struct mfd_cell *cell = NULL; |
| 502 | int ret, children = 0; | 507 | int ret, children = 0; |
| 503 | 508 | ||
| 504 | if (!pdata) { | 509 | if (!pdata) { |
| 505 | dev_err(&pdev->dev, "Platform data is missing\n"); | 510 | dev_err(&client->dev, "Platform data is missing\n"); |
| 506 | return -EINVAL; | 511 | return -EINVAL; |
| 507 | } | 512 | } |
| 508 | 513 | ||
| 509 | /* In order to operate correctly we need valid interrupt config */ | 514 | /* In order to operate correctly we need valid interrupt config */ |
| 510 | if (!pdata->naudint_irq || !pdata->irq_base) { | 515 | if (!client->irq || !pdata->irq_base) { |
| 511 | dev_err(&pdev->dev, "Invalid IRQ configuration\n"); | 516 | dev_err(&client->dev, "Invalid IRQ configuration\n"); |
| 512 | return -EINVAL; | 517 | return -EINVAL; |
| 513 | } | 518 | } |
| 514 | 519 | ||
| 515 | twl6040 = kzalloc(sizeof(struct twl6040), GFP_KERNEL); | 520 | twl6040 = devm_kzalloc(&client->dev, sizeof(struct twl6040), |
| 516 | if (!twl6040) | 521 | GFP_KERNEL); |
| 517 | return -ENOMEM; | 522 | if (!twl6040) { |
| 523 | ret = -ENOMEM; | ||
| 524 | goto err; | ||
| 525 | } | ||
| 526 | |||
| 527 | twl6040->regmap = regmap_init_i2c(client, &twl6040_regmap_config); | ||
| 528 | if (IS_ERR(twl6040->regmap)) { | ||
| 529 | ret = PTR_ERR(twl6040->regmap); | ||
| 530 | goto err; | ||
| 531 | } | ||
| 518 | 532 | ||
| 519 | platform_set_drvdata(pdev, twl6040); | 533 | i2c_set_clientdata(client, twl6040); |
| 520 | 534 | ||
| 521 | twl6040->dev = &pdev->dev; | 535 | twl6040->dev = &client->dev; |
| 522 | twl6040->irq = pdata->naudint_irq; | 536 | twl6040->irq = client->irq; |
| 523 | twl6040->irq_base = pdata->irq_base; | 537 | twl6040->irq_base = pdata->irq_base; |
| 524 | 538 | ||
| 525 | mutex_init(&twl6040->mutex); | 539 | mutex_init(&twl6040->mutex); |
| @@ -588,12 +602,12 @@ static int __devinit twl6040_probe(struct platform_device *pdev) | |||
| 588 | } | 602 | } |
| 589 | 603 | ||
| 590 | if (children) { | 604 | if (children) { |
| 591 | ret = mfd_add_devices(&pdev->dev, pdev->id, twl6040->cells, | 605 | ret = mfd_add_devices(&client->dev, -1, twl6040->cells, |
| 592 | children, NULL, 0); | 606 | children, NULL, 0); |
| 593 | if (ret) | 607 | if (ret) |
| 594 | goto mfd_err; | 608 | goto mfd_err; |
| 595 | } else { | 609 | } else { |
| 596 | dev_err(&pdev->dev, "No platform data found for children\n"); | 610 | dev_err(&client->dev, "No platform data found for children\n"); |
| 597 | ret = -ENODEV; | 611 | ret = -ENODEV; |
| 598 | goto mfd_err; | 612 | goto mfd_err; |
| 599 | } | 613 | } |
| @@ -608,14 +622,15 @@ gpio2_err: | |||
| 608 | if (gpio_is_valid(twl6040->audpwron)) | 622 | if (gpio_is_valid(twl6040->audpwron)) |
| 609 | gpio_free(twl6040->audpwron); | 623 | gpio_free(twl6040->audpwron); |
| 610 | gpio1_err: | 624 | gpio1_err: |
| 611 | platform_set_drvdata(pdev, NULL); | 625 | i2c_set_clientdata(client, NULL); |
| 612 | kfree(twl6040); | 626 | regmap_exit(twl6040->regmap); |
| 627 | err: | ||
| 613 | return ret; | 628 | return ret; |
| 614 | } | 629 | } |
| 615 | 630 | ||
| 616 | static int __devexit twl6040_remove(struct platform_device *pdev) | 631 | static int __devexit twl6040_remove(struct i2c_client *client) |
| 617 | { | 632 | { |
| 618 | struct twl6040 *twl6040 = platform_get_drvdata(pdev); | 633 | struct twl6040 *twl6040 = i2c_get_clientdata(client); |
| 619 | 634 | ||
| 620 | if (twl6040->power_count) | 635 | if (twl6040->power_count) |
| 621 | twl6040_power(twl6040, 0); | 636 | twl6040_power(twl6040, 0); |
| @@ -626,23 +641,30 @@ static int __devexit twl6040_remove(struct platform_device *pdev) | |||
| 626 | free_irq(twl6040->irq_base + TWL6040_IRQ_READY, twl6040); | 641 | free_irq(twl6040->irq_base + TWL6040_IRQ_READY, twl6040); |
| 627 | twl6040_irq_exit(twl6040); | 642 | twl6040_irq_exit(twl6040); |
| 628 | 643 | ||
| 629 | mfd_remove_devices(&pdev->dev); | 644 | mfd_remove_devices(&client->dev); |
| 630 | platform_set_drvdata(pdev, NULL); | 645 | i2c_set_clientdata(client, NULL); |
| 631 | kfree(twl6040); | 646 | regmap_exit(twl6040->regmap); |
| 632 | 647 | ||
| 633 | return 0; | 648 | return 0; |
| 634 | } | 649 | } |
| 635 | 650 | ||
| 636 | static struct platform_driver twl6040_driver = { | 651 | static const struct i2c_device_id twl6040_i2c_id[] = { |
| 652 | { "twl6040", 0, }, | ||
| 653 | { }, | ||
| 654 | }; | ||
| 655 | MODULE_DEVICE_TABLE(i2c, twl6040_i2c_id); | ||
| 656 | |||
| 657 | static struct i2c_driver twl6040_driver = { | ||
| 658 | .driver = { | ||
| 659 | .name = "twl6040", | ||
| 660 | .owner = THIS_MODULE, | ||
| 661 | }, | ||
| 637 | .probe = twl6040_probe, | 662 | .probe = twl6040_probe, |
| 638 | .remove = __devexit_p(twl6040_remove), | 663 | .remove = __devexit_p(twl6040_remove), |
| 639 | .driver = { | 664 | .id_table = twl6040_i2c_id, |
| 640 | .owner = THIS_MODULE, | ||
| 641 | .name = "twl6040", | ||
| 642 | }, | ||
| 643 | }; | 665 | }; |
| 644 | 666 | ||
| 645 | module_platform_driver(twl6040_driver); | 667 | module_i2c_driver(twl6040_driver); |
| 646 | 668 | ||
| 647 | MODULE_DESCRIPTION("TWL6040 MFD"); | 669 | MODULE_DESCRIPTION("TWL6040 MFD"); |
| 648 | MODULE_AUTHOR("Misael Lopez Cruz <misael.lopez@ti.com>"); | 670 | MODULE_AUTHOR("Misael Lopez Cruz <misael.lopez@ti.com>"); |
diff --git a/drivers/usb/host/ehci-omap.c b/drivers/usb/host/ehci-omap.c index bba9850f32f0..5c78f9e71466 100644 --- a/drivers/usb/host/ehci-omap.c +++ b/drivers/usb/host/ehci-omap.c | |||
| @@ -42,6 +42,7 @@ | |||
| 42 | #include <plat/usb.h> | 42 | #include <plat/usb.h> |
| 43 | #include <linux/regulator/consumer.h> | 43 | #include <linux/regulator/consumer.h> |
| 44 | #include <linux/pm_runtime.h> | 44 | #include <linux/pm_runtime.h> |
| 45 | #include <linux/gpio.h> | ||
| 45 | 46 | ||
| 46 | /* EHCI Register Set */ | 47 | /* EHCI Register Set */ |
| 47 | #define EHCI_INSNREG04 (0xA0) | 48 | #define EHCI_INSNREG04 (0xA0) |
| @@ -191,6 +192,19 @@ static int ehci_hcd_omap_probe(struct platform_device *pdev) | |||
| 191 | } | 192 | } |
| 192 | } | 193 | } |
| 193 | 194 | ||
| 195 | if (pdata->phy_reset) { | ||
| 196 | if (gpio_is_valid(pdata->reset_gpio_port[0])) | ||
| 197 | gpio_request_one(pdata->reset_gpio_port[0], | ||
| 198 | GPIOF_OUT_INIT_LOW, "USB1 PHY reset"); | ||
| 199 | |||
| 200 | if (gpio_is_valid(pdata->reset_gpio_port[1])) | ||
| 201 | gpio_request_one(pdata->reset_gpio_port[1], | ||
| 202 | GPIOF_OUT_INIT_LOW, "USB2 PHY reset"); | ||
| 203 | |||
| 204 | /* Hold the PHY in RESET for enough time till DIR is high */ | ||
| 205 | udelay(10); | ||
| 206 | } | ||
| 207 | |||
| 194 | pm_runtime_enable(dev); | 208 | pm_runtime_enable(dev); |
| 195 | pm_runtime_get_sync(dev); | 209 | pm_runtime_get_sync(dev); |
| 196 | 210 | ||
| @@ -237,6 +251,19 @@ static int ehci_hcd_omap_probe(struct platform_device *pdev) | |||
| 237 | /* root ports should always stay powered */ | 251 | /* root ports should always stay powered */ |
| 238 | ehci_port_power(omap_ehci, 1); | 252 | ehci_port_power(omap_ehci, 1); |
| 239 | 253 | ||
| 254 | if (pdata->phy_reset) { | ||
| 255 | /* Hold the PHY in RESET for enough time till | ||
| 256 | * PHY is settled and ready | ||
| 257 | */ | ||
| 258 | udelay(10); | ||
| 259 | |||
| 260 | if (gpio_is_valid(pdata->reset_gpio_port[0])) | ||
| 261 | gpio_set_value(pdata->reset_gpio_port[0], 1); | ||
| 262 | |||
| 263 | if (gpio_is_valid(pdata->reset_gpio_port[1])) | ||
| 264 | gpio_set_value(pdata->reset_gpio_port[1], 1); | ||
| 265 | } | ||
| 266 | |||
| 240 | return 0; | 267 | return 0; |
| 241 | 268 | ||
| 242 | err_add_hcd: | 269 | err_add_hcd: |
| @@ -259,8 +286,9 @@ err_io: | |||
| 259 | */ | 286 | */ |
| 260 | static int ehci_hcd_omap_remove(struct platform_device *pdev) | 287 | static int ehci_hcd_omap_remove(struct platform_device *pdev) |
| 261 | { | 288 | { |
| 262 | struct device *dev = &pdev->dev; | 289 | struct device *dev = &pdev->dev; |
| 263 | struct usb_hcd *hcd = dev_get_drvdata(dev); | 290 | struct usb_hcd *hcd = dev_get_drvdata(dev); |
| 291 | struct ehci_hcd_omap_platform_data *pdata = dev->platform_data; | ||
| 264 | 292 | ||
| 265 | usb_remove_hcd(hcd); | 293 | usb_remove_hcd(hcd); |
| 266 | disable_put_regulator(dev->platform_data); | 294 | disable_put_regulator(dev->platform_data); |
| @@ -269,6 +297,13 @@ static int ehci_hcd_omap_remove(struct platform_device *pdev) | |||
| 269 | pm_runtime_put_sync(dev); | 297 | pm_runtime_put_sync(dev); |
| 270 | pm_runtime_disable(dev); | 298 | pm_runtime_disable(dev); |
| 271 | 299 | ||
| 300 | if (pdata->phy_reset) { | ||
| 301 | if (gpio_is_valid(pdata->reset_gpio_port[0])) | ||
| 302 | gpio_free(pdata->reset_gpio_port[0]); | ||
| 303 | |||
| 304 | if (gpio_is_valid(pdata->reset_gpio_port[1])) | ||
| 305 | gpio_free(pdata->reset_gpio_port[1]); | ||
| 306 | } | ||
| 272 | return 0; | 307 | return 0; |
| 273 | } | 308 | } |
| 274 | 309 | ||
| @@ -93,9 +93,8 @@ static void aio_free_ring(struct kioctx *ctx) | |||
| 93 | put_page(info->ring_pages[i]); | 93 | put_page(info->ring_pages[i]); |
| 94 | 94 | ||
| 95 | if (info->mmap_size) { | 95 | if (info->mmap_size) { |
| 96 | down_write(&ctx->mm->mmap_sem); | 96 | BUG_ON(ctx->mm != current->mm); |
| 97 | do_munmap(ctx->mm, info->mmap_base, info->mmap_size); | 97 | vm_munmap(info->mmap_base, info->mmap_size); |
| 98 | up_write(&ctx->mm->mmap_sem); | ||
| 99 | } | 98 | } |
| 100 | 99 | ||
| 101 | if (info->ring_pages && info->ring_pages != info->internal_pages) | 100 | if (info->ring_pages && info->ring_pages != info->internal_pages) |
| @@ -389,6 +388,17 @@ void exit_aio(struct mm_struct *mm) | |||
| 389 | "exit_aio:ioctx still alive: %d %d %d\n", | 388 | "exit_aio:ioctx still alive: %d %d %d\n", |
| 390 | atomic_read(&ctx->users), ctx->dead, | 389 | atomic_read(&ctx->users), ctx->dead, |
| 391 | ctx->reqs_active); | 390 | ctx->reqs_active); |
| 391 | /* | ||
| 392 | * We don't need to bother with munmap() here - | ||
| 393 | * exit_mmap(mm) is coming and it'll unmap everything. | ||
| 394 | * Since aio_free_ring() uses non-zero ->mmap_size | ||
| 395 | * as indicator that it needs to unmap the area, | ||
| 396 | * just set it to 0; aio_free_ring() is the only | ||
| 397 | * place that uses ->mmap_size, so it's safe. | ||
| 398 | * That way we get all munmap done to current->mm - | ||
| 399 | * all other callers have ctx->mm == current->mm. | ||
| 400 | */ | ||
| 401 | ctx->ring_info.mmap_size = 0; | ||
| 392 | put_ioctx(ctx); | 402 | put_ioctx(ctx); |
| 393 | } | 403 | } |
| 394 | } | 404 | } |
diff --git a/fs/binfmt_aout.c b/fs/binfmt_aout.c index 2eb12f13593d..d146e181d10d 100644 --- a/fs/binfmt_aout.c +++ b/fs/binfmt_aout.c | |||
| @@ -50,9 +50,7 @@ static int set_brk(unsigned long start, unsigned long end) | |||
| 50 | end = PAGE_ALIGN(end); | 50 | end = PAGE_ALIGN(end); |
| 51 | if (end > start) { | 51 | if (end > start) { |
| 52 | unsigned long addr; | 52 | unsigned long addr; |
| 53 | down_write(¤t->mm->mmap_sem); | 53 | addr = vm_brk(start, end - start); |
| 54 | addr = do_brk(start, end - start); | ||
| 55 | up_write(¤t->mm->mmap_sem); | ||
| 56 | if (BAD_ADDR(addr)) | 54 | if (BAD_ADDR(addr)) |
| 57 | return addr; | 55 | return addr; |
| 58 | } | 56 | } |
| @@ -280,9 +278,7 @@ static int load_aout_binary(struct linux_binprm * bprm, struct pt_regs * regs) | |||
| 280 | pos = 32; | 278 | pos = 32; |
| 281 | map_size = ex.a_text+ex.a_data; | 279 | map_size = ex.a_text+ex.a_data; |
| 282 | #endif | 280 | #endif |
| 283 | down_write(¤t->mm->mmap_sem); | 281 | error = vm_brk(text_addr & PAGE_MASK, map_size); |
| 284 | error = do_brk(text_addr & PAGE_MASK, map_size); | ||
| 285 | up_write(¤t->mm->mmap_sem); | ||
| 286 | if (error != (text_addr & PAGE_MASK)) { | 282 | if (error != (text_addr & PAGE_MASK)) { |
| 287 | send_sig(SIGKILL, current, 0); | 283 | send_sig(SIGKILL, current, 0); |
| 288 | return error; | 284 | return error; |
| @@ -313,9 +309,7 @@ static int load_aout_binary(struct linux_binprm * bprm, struct pt_regs * regs) | |||
| 313 | 309 | ||
| 314 | if (!bprm->file->f_op->mmap||((fd_offset & ~PAGE_MASK) != 0)) { | 310 | if (!bprm->file->f_op->mmap||((fd_offset & ~PAGE_MASK) != 0)) { |
| 315 | loff_t pos = fd_offset; | 311 | loff_t pos = fd_offset; |
| 316 | down_write(¤t->mm->mmap_sem); | 312 | vm_brk(N_TXTADDR(ex), ex.a_text+ex.a_data); |
| 317 | do_brk(N_TXTADDR(ex), ex.a_text+ex.a_data); | ||
| 318 | up_write(¤t->mm->mmap_sem); | ||
| 319 | bprm->file->f_op->read(bprm->file, | 313 | bprm->file->f_op->read(bprm->file, |
| 320 | (char __user *)N_TXTADDR(ex), | 314 | (char __user *)N_TXTADDR(ex), |
| 321 | ex.a_text+ex.a_data, &pos); | 315 | ex.a_text+ex.a_data, &pos); |
| @@ -325,24 +319,20 @@ static int load_aout_binary(struct linux_binprm * bprm, struct pt_regs * regs) | |||
| 325 | goto beyond_if; | 319 | goto beyond_if; |
| 326 | } | 320 | } |
| 327 | 321 | ||
| 328 | down_write(¤t->mm->mmap_sem); | 322 | error = vm_mmap(bprm->file, N_TXTADDR(ex), ex.a_text, |
| 329 | error = do_mmap(bprm->file, N_TXTADDR(ex), ex.a_text, | ||
| 330 | PROT_READ | PROT_EXEC, | 323 | PROT_READ | PROT_EXEC, |
| 331 | MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE | MAP_EXECUTABLE, | 324 | MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE | MAP_EXECUTABLE, |
| 332 | fd_offset); | 325 | fd_offset); |
| 333 | up_write(¤t->mm->mmap_sem); | ||
| 334 | 326 | ||
| 335 | if (error != N_TXTADDR(ex)) { | 327 | if (error != N_TXTADDR(ex)) { |
| 336 | send_sig(SIGKILL, current, 0); | 328 | send_sig(SIGKILL, current, 0); |
| 337 | return error; | 329 | return error; |
| 338 | } | 330 | } |
| 339 | 331 | ||
| 340 | down_write(¤t->mm->mmap_sem); | 332 | error = vm_mmap(bprm->file, N_DATADDR(ex), ex.a_data, |
| 341 | error = do_mmap(bprm->file, N_DATADDR(ex), ex.a_data, | ||
| 342 | PROT_READ | PROT_WRITE | PROT_EXEC, | 333 | PROT_READ | PROT_WRITE | PROT_EXEC, |
| 343 | MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE | MAP_EXECUTABLE, | 334 | MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE | MAP_EXECUTABLE, |
| 344 | fd_offset + ex.a_text); | 335 | fd_offset + ex.a_text); |
| 345 | up_write(¤t->mm->mmap_sem); | ||
| 346 | if (error != N_DATADDR(ex)) { | 336 | if (error != N_DATADDR(ex)) { |
| 347 | send_sig(SIGKILL, current, 0); | 337 | send_sig(SIGKILL, current, 0); |
| 348 | return error; | 338 | return error; |
| @@ -412,9 +402,7 @@ static int load_aout_library(struct file *file) | |||
| 412 | "N_TXTOFF is not page aligned. Please convert library: %s\n", | 402 | "N_TXTOFF is not page aligned. Please convert library: %s\n", |
| 413 | file->f_path.dentry->d_name.name); | 403 | file->f_path.dentry->d_name.name); |
| 414 | } | 404 | } |
| 415 | down_write(¤t->mm->mmap_sem); | 405 | vm_brk(start_addr, ex.a_text + ex.a_data + ex.a_bss); |
| 416 | do_brk(start_addr, ex.a_text + ex.a_data + ex.a_bss); | ||
| 417 | up_write(¤t->mm->mmap_sem); | ||
| 418 | 406 | ||
| 419 | file->f_op->read(file, (char __user *)start_addr, | 407 | file->f_op->read(file, (char __user *)start_addr, |
| 420 | ex.a_text + ex.a_data, &pos); | 408 | ex.a_text + ex.a_data, &pos); |
| @@ -425,12 +413,10 @@ static int load_aout_library(struct file *file) | |||
| 425 | goto out; | 413 | goto out; |
| 426 | } | 414 | } |
| 427 | /* Now use mmap to map the library into memory. */ | 415 | /* Now use mmap to map the library into memory. */ |
| 428 | down_write(¤t->mm->mmap_sem); | 416 | error = vm_mmap(file, start_addr, ex.a_text + ex.a_data, |
| 429 | error = do_mmap(file, start_addr, ex.a_text + ex.a_data, | ||
| 430 | PROT_READ | PROT_WRITE | PROT_EXEC, | 417 | PROT_READ | PROT_WRITE | PROT_EXEC, |
| 431 | MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE, | 418 | MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE, |
| 432 | N_TXTOFF(ex)); | 419 | N_TXTOFF(ex)); |
| 433 | up_write(¤t->mm->mmap_sem); | ||
| 434 | retval = error; | 420 | retval = error; |
| 435 | if (error != start_addr) | 421 | if (error != start_addr) |
| 436 | goto out; | 422 | goto out; |
| @@ -438,9 +424,7 @@ static int load_aout_library(struct file *file) | |||
| 438 | len = PAGE_ALIGN(ex.a_text + ex.a_data); | 424 | len = PAGE_ALIGN(ex.a_text + ex.a_data); |
| 439 | bss = ex.a_text + ex.a_data + ex.a_bss; | 425 | bss = ex.a_text + ex.a_data + ex.a_bss; |
| 440 | if (bss > len) { | 426 | if (bss > len) { |
| 441 | down_write(¤t->mm->mmap_sem); | 427 | error = vm_brk(start_addr + len, bss - len); |
| 442 | error = do_brk(start_addr + len, bss - len); | ||
| 443 | up_write(¤t->mm->mmap_sem); | ||
| 444 | retval = error; | 428 | retval = error; |
| 445 | if (error != start_addr + len) | 429 | if (error != start_addr + len) |
| 446 | goto out; | 430 | goto out; |
diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c index 48ffb3dc610a..16f735417072 100644 --- a/fs/binfmt_elf.c +++ b/fs/binfmt_elf.c | |||
| @@ -82,9 +82,7 @@ static int set_brk(unsigned long start, unsigned long end) | |||
| 82 | end = ELF_PAGEALIGN(end); | 82 | end = ELF_PAGEALIGN(end); |
| 83 | if (end > start) { | 83 | if (end > start) { |
| 84 | unsigned long addr; | 84 | unsigned long addr; |
| 85 | down_write(¤t->mm->mmap_sem); | 85 | addr = vm_brk(start, end - start); |
| 86 | addr = do_brk(start, end - start); | ||
| 87 | up_write(¤t->mm->mmap_sem); | ||
| 88 | if (BAD_ADDR(addr)) | 86 | if (BAD_ADDR(addr)) |
| 89 | return addr; | 87 | return addr; |
| 90 | } | 88 | } |
| @@ -514,9 +512,7 @@ static unsigned long load_elf_interp(struct elfhdr *interp_elf_ex, | |||
| 514 | elf_bss = ELF_PAGESTART(elf_bss + ELF_MIN_ALIGN - 1); | 512 | elf_bss = ELF_PAGESTART(elf_bss + ELF_MIN_ALIGN - 1); |
| 515 | 513 | ||
| 516 | /* Map the last of the bss segment */ | 514 | /* Map the last of the bss segment */ |
| 517 | down_write(¤t->mm->mmap_sem); | 515 | error = vm_brk(elf_bss, last_bss - elf_bss); |
| 518 | error = do_brk(elf_bss, last_bss - elf_bss); | ||
| 519 | up_write(¤t->mm->mmap_sem); | ||
| 520 | if (BAD_ADDR(error)) | 516 | if (BAD_ADDR(error)) |
| 521 | goto out_close; | 517 | goto out_close; |
| 522 | } | 518 | } |
| @@ -962,10 +958,8 @@ static int load_elf_binary(struct linux_binprm *bprm, struct pt_regs *regs) | |||
| 962 | and some applications "depend" upon this behavior. | 958 | and some applications "depend" upon this behavior. |
| 963 | Since we do not have the power to recompile these, we | 959 | Since we do not have the power to recompile these, we |
| 964 | emulate the SVr4 behavior. Sigh. */ | 960 | emulate the SVr4 behavior. Sigh. */ |
| 965 | down_write(¤t->mm->mmap_sem); | 961 | error = vm_mmap(NULL, 0, PAGE_SIZE, PROT_READ | PROT_EXEC, |
| 966 | error = do_mmap(NULL, 0, PAGE_SIZE, PROT_READ | PROT_EXEC, | ||
| 967 | MAP_FIXED | MAP_PRIVATE, 0); | 962 | MAP_FIXED | MAP_PRIVATE, 0); |
| 968 | up_write(¤t->mm->mmap_sem); | ||
| 969 | } | 963 | } |
| 970 | 964 | ||
| 971 | #ifdef ELF_PLAT_INIT | 965 | #ifdef ELF_PLAT_INIT |
| @@ -1050,8 +1044,7 @@ static int load_elf_library(struct file *file) | |||
| 1050 | eppnt++; | 1044 | eppnt++; |
| 1051 | 1045 | ||
| 1052 | /* Now use mmap to map the library into memory. */ | 1046 | /* Now use mmap to map the library into memory. */ |
| 1053 | down_write(¤t->mm->mmap_sem); | 1047 | error = vm_mmap(file, |
| 1054 | error = do_mmap(file, | ||
| 1055 | ELF_PAGESTART(eppnt->p_vaddr), | 1048 | ELF_PAGESTART(eppnt->p_vaddr), |
| 1056 | (eppnt->p_filesz + | 1049 | (eppnt->p_filesz + |
| 1057 | ELF_PAGEOFFSET(eppnt->p_vaddr)), | 1050 | ELF_PAGEOFFSET(eppnt->p_vaddr)), |
| @@ -1059,7 +1052,6 @@ static int load_elf_library(struct file *file) | |||
| 1059 | MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE, | 1052 | MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE, |
| 1060 | (eppnt->p_offset - | 1053 | (eppnt->p_offset - |
| 1061 | ELF_PAGEOFFSET(eppnt->p_vaddr))); | 1054 | ELF_PAGEOFFSET(eppnt->p_vaddr))); |
| 1062 | up_write(¤t->mm->mmap_sem); | ||
| 1063 | if (error != ELF_PAGESTART(eppnt->p_vaddr)) | 1055 | if (error != ELF_PAGESTART(eppnt->p_vaddr)) |
| 1064 | goto out_free_ph; | 1056 | goto out_free_ph; |
| 1065 | 1057 | ||
| @@ -1072,11 +1064,8 @@ static int load_elf_library(struct file *file) | |||
| 1072 | len = ELF_PAGESTART(eppnt->p_filesz + eppnt->p_vaddr + | 1064 | len = ELF_PAGESTART(eppnt->p_filesz + eppnt->p_vaddr + |
| 1073 | ELF_MIN_ALIGN - 1); | 1065 | ELF_MIN_ALIGN - 1); |
| 1074 | bss = eppnt->p_memsz + eppnt->p_vaddr; | 1066 | bss = eppnt->p_memsz + eppnt->p_vaddr; |
| 1075 | if (bss > len) { | 1067 | if (bss > len) |
| 1076 | down_write(¤t->mm->mmap_sem); | 1068 | vm_brk(len, bss - len); |
| 1077 | do_brk(len, bss - len); | ||
| 1078 | up_write(¤t->mm->mmap_sem); | ||
| 1079 | } | ||
| 1080 | error = 0; | 1069 | error = 0; |
| 1081 | 1070 | ||
| 1082 | out_free_ph: | 1071 | out_free_ph: |
diff --git a/fs/binfmt_elf_fdpic.c b/fs/binfmt_elf_fdpic.c index 9bd5612a8224..d390a0fffc65 100644 --- a/fs/binfmt_elf_fdpic.c +++ b/fs/binfmt_elf_fdpic.c | |||
| @@ -390,21 +390,17 @@ static int load_elf_fdpic_binary(struct linux_binprm *bprm, | |||
| 390 | (executable_stack == EXSTACK_DEFAULT && VM_STACK_FLAGS & VM_EXEC)) | 390 | (executable_stack == EXSTACK_DEFAULT && VM_STACK_FLAGS & VM_EXEC)) |
| 391 | stack_prot |= PROT_EXEC; | 391 | stack_prot |= PROT_EXEC; |
| 392 | 392 | ||
| 393 | down_write(¤t->mm->mmap_sem); | 393 | current->mm->start_brk = vm_mmap(NULL, 0, stack_size, stack_prot, |
| 394 | current->mm->start_brk = do_mmap(NULL, 0, stack_size, stack_prot, | ||
| 395 | MAP_PRIVATE | MAP_ANONYMOUS | | 394 | MAP_PRIVATE | MAP_ANONYMOUS | |
| 396 | MAP_UNINITIALIZED | MAP_GROWSDOWN, | 395 | MAP_UNINITIALIZED | MAP_GROWSDOWN, |
| 397 | 0); | 396 | 0); |
| 398 | 397 | ||
| 399 | if (IS_ERR_VALUE(current->mm->start_brk)) { | 398 | if (IS_ERR_VALUE(current->mm->start_brk)) { |
| 400 | up_write(¤t->mm->mmap_sem); | ||
| 401 | retval = current->mm->start_brk; | 399 | retval = current->mm->start_brk; |
| 402 | current->mm->start_brk = 0; | 400 | current->mm->start_brk = 0; |
| 403 | goto error_kill; | 401 | goto error_kill; |
| 404 | } | 402 | } |
| 405 | 403 | ||
| 406 | up_write(¤t->mm->mmap_sem); | ||
| 407 | |||
| 408 | current->mm->brk = current->mm->start_brk; | 404 | current->mm->brk = current->mm->start_brk; |
| 409 | current->mm->context.end_brk = current->mm->start_brk; | 405 | current->mm->context.end_brk = current->mm->start_brk; |
| 410 | current->mm->context.end_brk += | 406 | current->mm->context.end_brk += |
| @@ -955,10 +951,8 @@ static int elf_fdpic_map_file_constdisp_on_uclinux( | |||
| 955 | if (params->flags & ELF_FDPIC_FLAG_EXECUTABLE) | 951 | if (params->flags & ELF_FDPIC_FLAG_EXECUTABLE) |
| 956 | mflags |= MAP_EXECUTABLE; | 952 | mflags |= MAP_EXECUTABLE; |
| 957 | 953 | ||
| 958 | down_write(&mm->mmap_sem); | 954 | maddr = vm_mmap(NULL, load_addr, top - base, |
| 959 | maddr = do_mmap(NULL, load_addr, top - base, | ||
| 960 | PROT_READ | PROT_WRITE | PROT_EXEC, mflags, 0); | 955 | PROT_READ | PROT_WRITE | PROT_EXEC, mflags, 0); |
| 961 | up_write(&mm->mmap_sem); | ||
| 962 | if (IS_ERR_VALUE(maddr)) | 956 | if (IS_ERR_VALUE(maddr)) |
| 963 | return (int) maddr; | 957 | return (int) maddr; |
| 964 | 958 | ||
| @@ -1096,10 +1090,8 @@ static int elf_fdpic_map_file_by_direct_mmap(struct elf_fdpic_params *params, | |||
| 1096 | 1090 | ||
| 1097 | /* create the mapping */ | 1091 | /* create the mapping */ |
| 1098 | disp = phdr->p_vaddr & ~PAGE_MASK; | 1092 | disp = phdr->p_vaddr & ~PAGE_MASK; |
| 1099 | down_write(&mm->mmap_sem); | 1093 | maddr = vm_mmap(file, maddr, phdr->p_memsz + disp, prot, flags, |
| 1100 | maddr = do_mmap(file, maddr, phdr->p_memsz + disp, prot, flags, | ||
| 1101 | phdr->p_offset - disp); | 1094 | phdr->p_offset - disp); |
| 1102 | up_write(&mm->mmap_sem); | ||
| 1103 | 1095 | ||
| 1104 | kdebug("mmap[%d] <file> sz=%lx pr=%x fl=%x of=%lx --> %08lx", | 1096 | kdebug("mmap[%d] <file> sz=%lx pr=%x fl=%x of=%lx --> %08lx", |
| 1105 | loop, phdr->p_memsz + disp, prot, flags, | 1097 | loop, phdr->p_memsz + disp, prot, flags, |
| @@ -1143,10 +1135,8 @@ static int elf_fdpic_map_file_by_direct_mmap(struct elf_fdpic_params *params, | |||
| 1143 | unsigned long xmaddr; | 1135 | unsigned long xmaddr; |
| 1144 | 1136 | ||
| 1145 | flags |= MAP_FIXED | MAP_ANONYMOUS; | 1137 | flags |= MAP_FIXED | MAP_ANONYMOUS; |
| 1146 | down_write(&mm->mmap_sem); | 1138 | xmaddr = vm_mmap(NULL, xaddr, excess - excess1, |
| 1147 | xmaddr = do_mmap(NULL, xaddr, excess - excess1, | ||
| 1148 | prot, flags, 0); | 1139 | prot, flags, 0); |
| 1149 | up_write(&mm->mmap_sem); | ||
| 1150 | 1140 | ||
| 1151 | kdebug("mmap[%d] <anon>" | 1141 | kdebug("mmap[%d] <anon>" |
| 1152 | " ad=%lx sz=%lx pr=%x fl=%x of=0 --> %08lx", | 1142 | " ad=%lx sz=%lx pr=%x fl=%x of=0 --> %08lx", |
diff --git a/fs/binfmt_flat.c b/fs/binfmt_flat.c index 024d20ee3ca3..6b2daf99fab8 100644 --- a/fs/binfmt_flat.c +++ b/fs/binfmt_flat.c | |||
| @@ -542,10 +542,8 @@ static int load_flat_file(struct linux_binprm * bprm, | |||
| 542 | */ | 542 | */ |
| 543 | DBG_FLT("BINFMT_FLAT: ROM mapping of file (we hope)\n"); | 543 | DBG_FLT("BINFMT_FLAT: ROM mapping of file (we hope)\n"); |
| 544 | 544 | ||
| 545 | down_write(¤t->mm->mmap_sem); | 545 | textpos = vm_mmap(bprm->file, 0, text_len, PROT_READ|PROT_EXEC, |
| 546 | textpos = do_mmap(bprm->file, 0, text_len, PROT_READ|PROT_EXEC, | ||
| 547 | MAP_PRIVATE|MAP_EXECUTABLE, 0); | 546 | MAP_PRIVATE|MAP_EXECUTABLE, 0); |
| 548 | up_write(¤t->mm->mmap_sem); | ||
| 549 | if (!textpos || IS_ERR_VALUE(textpos)) { | 547 | if (!textpos || IS_ERR_VALUE(textpos)) { |
| 550 | if (!textpos) | 548 | if (!textpos) |
| 551 | textpos = (unsigned long) -ENOMEM; | 549 | textpos = (unsigned long) -ENOMEM; |
| @@ -556,10 +554,8 @@ static int load_flat_file(struct linux_binprm * bprm, | |||
| 556 | 554 | ||
| 557 | len = data_len + extra + MAX_SHARED_LIBS * sizeof(unsigned long); | 555 | len = data_len + extra + MAX_SHARED_LIBS * sizeof(unsigned long); |
| 558 | len = PAGE_ALIGN(len); | 556 | len = PAGE_ALIGN(len); |
| 559 | down_write(¤t->mm->mmap_sem); | 557 | realdatastart = vm_mmap(0, 0, len, |
| 560 | realdatastart = do_mmap(0, 0, len, | ||
| 561 | PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE, 0); | 558 | PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE, 0); |
| 562 | up_write(¤t->mm->mmap_sem); | ||
| 563 | 559 | ||
| 564 | if (realdatastart == 0 || IS_ERR_VALUE(realdatastart)) { | 560 | if (realdatastart == 0 || IS_ERR_VALUE(realdatastart)) { |
| 565 | if (!realdatastart) | 561 | if (!realdatastart) |
| @@ -603,10 +599,8 @@ static int load_flat_file(struct linux_binprm * bprm, | |||
| 603 | 599 | ||
| 604 | len = text_len + data_len + extra + MAX_SHARED_LIBS * sizeof(unsigned long); | 600 | len = text_len + data_len + extra + MAX_SHARED_LIBS * sizeof(unsigned long); |
| 605 | len = PAGE_ALIGN(len); | 601 | len = PAGE_ALIGN(len); |
| 606 | down_write(¤t->mm->mmap_sem); | 602 | textpos = vm_mmap(0, 0, len, |
| 607 | textpos = do_mmap(0, 0, len, | ||
| 608 | PROT_READ | PROT_EXEC | PROT_WRITE, MAP_PRIVATE, 0); | 603 | PROT_READ | PROT_EXEC | PROT_WRITE, MAP_PRIVATE, 0); |
| 609 | up_write(¤t->mm->mmap_sem); | ||
| 610 | 604 | ||
| 611 | if (!textpos || IS_ERR_VALUE(textpos)) { | 605 | if (!textpos || IS_ERR_VALUE(textpos)) { |
| 612 | if (!textpos) | 606 | if (!textpos) |
diff --git a/fs/binfmt_som.c b/fs/binfmt_som.c index e4fc746629a7..4517aaff61b4 100644 --- a/fs/binfmt_som.c +++ b/fs/binfmt_som.c | |||
| @@ -147,10 +147,8 @@ static int map_som_binary(struct file *file, | |||
| 147 | code_size = SOM_PAGEALIGN(hpuxhdr->exec_tsize); | 147 | code_size = SOM_PAGEALIGN(hpuxhdr->exec_tsize); |
| 148 | current->mm->start_code = code_start; | 148 | current->mm->start_code = code_start; |
| 149 | current->mm->end_code = code_start + code_size; | 149 | current->mm->end_code = code_start + code_size; |
| 150 | down_write(¤t->mm->mmap_sem); | 150 | retval = vm_mmap(file, code_start, code_size, prot, |
| 151 | retval = do_mmap(file, code_start, code_size, prot, | ||
| 152 | flags, SOM_PAGESTART(hpuxhdr->exec_tfile)); | 151 | flags, SOM_PAGESTART(hpuxhdr->exec_tfile)); |
| 153 | up_write(¤t->mm->mmap_sem); | ||
| 154 | if (retval < 0 && retval > -1024) | 152 | if (retval < 0 && retval > -1024) |
| 155 | goto out; | 153 | goto out; |
| 156 | 154 | ||
| @@ -158,20 +156,16 @@ static int map_som_binary(struct file *file, | |||
| 158 | data_size = SOM_PAGEALIGN(hpuxhdr->exec_dsize); | 156 | data_size = SOM_PAGEALIGN(hpuxhdr->exec_dsize); |
| 159 | current->mm->start_data = data_start; | 157 | current->mm->start_data = data_start; |
| 160 | current->mm->end_data = bss_start = data_start + data_size; | 158 | current->mm->end_data = bss_start = data_start + data_size; |
| 161 | down_write(¤t->mm->mmap_sem); | 159 | retval = vm_mmap(file, data_start, data_size, |
| 162 | retval = do_mmap(file, data_start, data_size, | ||
| 163 | prot | PROT_WRITE, flags, | 160 | prot | PROT_WRITE, flags, |
| 164 | SOM_PAGESTART(hpuxhdr->exec_dfile)); | 161 | SOM_PAGESTART(hpuxhdr->exec_dfile)); |
| 165 | up_write(¤t->mm->mmap_sem); | ||
| 166 | if (retval < 0 && retval > -1024) | 162 | if (retval < 0 && retval > -1024) |
| 167 | goto out; | 163 | goto out; |
| 168 | 164 | ||
| 169 | som_brk = bss_start + SOM_PAGEALIGN(hpuxhdr->exec_bsize); | 165 | som_brk = bss_start + SOM_PAGEALIGN(hpuxhdr->exec_bsize); |
| 170 | current->mm->start_brk = current->mm->brk = som_brk; | 166 | current->mm->start_brk = current->mm->brk = som_brk; |
| 171 | down_write(¤t->mm->mmap_sem); | 167 | retval = vm_mmap(NULL, bss_start, som_brk - bss_start, |
| 172 | retval = do_mmap(NULL, bss_start, som_brk - bss_start, | ||
| 173 | prot | PROT_WRITE, MAP_FIXED | MAP_PRIVATE, 0); | 168 | prot | PROT_WRITE, MAP_FIXED | MAP_PRIVATE, 0); |
| 174 | up_write(¤t->mm->mmap_sem); | ||
| 175 | if (retval > 0 || retval < -1024) | 169 | if (retval > 0 || retval < -1024) |
| 176 | retval = 0; | 170 | retval = 0; |
| 177 | out: | 171 | out: |
diff --git a/include/linux/i2c/twl.h b/include/linux/i2c/twl.h index 2463b6100333..1f90de0cfdbe 100644 --- a/include/linux/i2c/twl.h +++ b/include/linux/i2c/twl.h | |||
| @@ -666,23 +666,11 @@ struct twl4030_codec_data { | |||
| 666 | unsigned int check_defaults:1; | 666 | unsigned int check_defaults:1; |
| 667 | unsigned int reset_registers:1; | 667 | unsigned int reset_registers:1; |
| 668 | unsigned int hs_extmute:1; | 668 | unsigned int hs_extmute:1; |
| 669 | u16 hs_left_step; | ||
| 670 | u16 hs_right_step; | ||
| 671 | u16 hf_left_step; | ||
| 672 | u16 hf_right_step; | ||
| 673 | void (*set_hs_extmute)(int mute); | 669 | void (*set_hs_extmute)(int mute); |
| 674 | }; | 670 | }; |
| 675 | 671 | ||
| 676 | struct twl4030_vibra_data { | 672 | struct twl4030_vibra_data { |
| 677 | unsigned int coexist; | 673 | unsigned int coexist; |
| 678 | |||
| 679 | /* twl6040 */ | ||
| 680 | unsigned int vibldrv_res; /* left driver resistance */ | ||
| 681 | unsigned int vibrdrv_res; /* right driver resistance */ | ||
| 682 | unsigned int viblmotor_res; /* left motor resistance */ | ||
| 683 | unsigned int vibrmotor_res; /* right motor resistance */ | ||
| 684 | int vddvibl_uV; /* VDDVIBL volt, set 0 for fixed reg */ | ||
| 685 | int vddvibr_uV; /* VDDVIBR volt, set 0 for fixed reg */ | ||
| 686 | }; | 674 | }; |
| 687 | 675 | ||
| 688 | struct twl4030_audio_data { | 676 | struct twl4030_audio_data { |
diff --git a/include/linux/mfd/db5500-prcmu.h b/include/linux/mfd/db5500-prcmu.h index 9890687f582d..5a049dfaf153 100644 --- a/include/linux/mfd/db5500-prcmu.h +++ b/include/linux/mfd/db5500-prcmu.h | |||
| @@ -8,41 +8,14 @@ | |||
| 8 | #ifndef __MFD_DB5500_PRCMU_H | 8 | #ifndef __MFD_DB5500_PRCMU_H |
| 9 | #define __MFD_DB5500_PRCMU_H | 9 | #define __MFD_DB5500_PRCMU_H |
| 10 | 10 | ||
| 11 | #ifdef CONFIG_MFD_DB5500_PRCMU | 11 | static inline int prcmu_resetout(u8 resoutn, u8 state) |
| 12 | |||
| 13 | void db5500_prcmu_early_init(void); | ||
| 14 | int db5500_prcmu_set_epod(u16 epod_id, u8 epod_state); | ||
| 15 | int db5500_prcmu_set_display_clocks(void); | ||
| 16 | int db5500_prcmu_disable_dsipll(void); | ||
| 17 | int db5500_prcmu_enable_dsipll(void); | ||
| 18 | int db5500_prcmu_abb_read(u8 slave, u8 reg, u8 *value, u8 size); | ||
| 19 | int db5500_prcmu_abb_write(u8 slave, u8 reg, u8 *value, u8 size); | ||
| 20 | void db5500_prcmu_enable_wakeups(u32 wakeups); | ||
| 21 | int db5500_prcmu_request_clock(u8 clock, bool enable); | ||
| 22 | void db5500_prcmu_config_abb_event_readout(u32 abb_events); | ||
| 23 | void db5500_prcmu_get_abb_event_buffer(void __iomem **buf); | ||
| 24 | int prcmu_resetout(u8 resoutn, u8 state); | ||
| 25 | int db5500_prcmu_set_power_state(u8 state, bool keep_ulp_clk, | ||
| 26 | bool keep_ap_pll); | ||
| 27 | int db5500_prcmu_config_esram0_deep_sleep(u8 state); | ||
| 28 | void db5500_prcmu_system_reset(u16 reset_code); | ||
| 29 | u16 db5500_prcmu_get_reset_code(void); | ||
| 30 | bool db5500_prcmu_is_ac_wake_requested(void); | ||
| 31 | int db5500_prcmu_set_arm_opp(u8 opp); | ||
| 32 | int db5500_prcmu_get_arm_opp(void); | ||
| 33 | |||
| 34 | #else /* !CONFIG_UX500_SOC_DB5500 */ | ||
| 35 | |||
| 36 | static inline void db5500_prcmu_early_init(void) {} | ||
| 37 | |||
| 38 | static inline int db5500_prcmu_abb_read(u8 slave, u8 reg, u8 *value, u8 size) | ||
| 39 | { | 12 | { |
| 40 | return -ENOSYS; | 13 | return 0; |
| 41 | } | 14 | } |
| 42 | 15 | ||
| 43 | static inline int db5500_prcmu_abb_write(u8 slave, u8 reg, u8 *value, u8 size) | 16 | static inline int db5500_prcmu_set_epod(u16 epod_id, u8 epod_state) |
| 44 | { | 17 | { |
| 45 | return -ENOSYS; | 18 | return 0; |
| 46 | } | 19 | } |
| 47 | 20 | ||
| 48 | static inline int db5500_prcmu_request_clock(u8 clock, bool enable) | 21 | static inline int db5500_prcmu_request_clock(u8 clock, bool enable) |
| @@ -50,69 +23,82 @@ static inline int db5500_prcmu_request_clock(u8 clock, bool enable) | |||
| 50 | return 0; | 23 | return 0; |
| 51 | } | 24 | } |
| 52 | 25 | ||
| 53 | static inline int db5500_prcmu_set_display_clocks(void) | 26 | static inline int db5500_prcmu_set_power_state(u8 state, bool keep_ulp_clk, |
| 27 | bool keep_ap_pll) | ||
| 54 | { | 28 | { |
| 55 | return 0; | 29 | return 0; |
| 56 | } | 30 | } |
| 57 | 31 | ||
| 58 | static inline int db5500_prcmu_disable_dsipll(void) | 32 | static inline int db5500_prcmu_config_esram0_deep_sleep(u8 state) |
| 59 | { | 33 | { |
| 60 | return 0; | 34 | return 0; |
| 61 | } | 35 | } |
| 62 | 36 | ||
| 63 | static inline int db5500_prcmu_enable_dsipll(void) | 37 | static inline u16 db5500_prcmu_get_reset_code(void) |
| 64 | { | 38 | { |
| 65 | return 0; | 39 | return 0; |
| 66 | } | 40 | } |
| 67 | 41 | ||
| 68 | static inline int db5500_prcmu_config_esram0_deep_sleep(u8 state) | 42 | static inline bool db5500_prcmu_is_ac_wake_requested(void) |
| 69 | { | 43 | { |
| 70 | return 0; | 44 | return 0; |
| 71 | } | 45 | } |
| 72 | 46 | ||
| 73 | static inline void db5500_prcmu_enable_wakeups(u32 wakeups) {} | 47 | static inline int db5500_prcmu_set_arm_opp(u8 opp) |
| 74 | |||
| 75 | static inline int prcmu_resetout(u8 resoutn, u8 state) | ||
| 76 | { | 48 | { |
| 77 | return 0; | 49 | return 0; |
| 78 | } | 50 | } |
| 79 | 51 | ||
| 80 | static inline int db5500_prcmu_set_epod(u16 epod_id, u8 epod_state) | 52 | static inline int db5500_prcmu_get_arm_opp(void) |
| 81 | { | 53 | { |
| 82 | return 0; | 54 | return 0; |
| 83 | } | 55 | } |
| 84 | 56 | ||
| 85 | static inline void db5500_prcmu_get_abb_event_buffer(void __iomem **buf) {} | ||
| 86 | static inline void db5500_prcmu_config_abb_event_readout(u32 abb_events) {} | 57 | static inline void db5500_prcmu_config_abb_event_readout(u32 abb_events) {} |
| 87 | 58 | ||
| 88 | static inline int db5500_prcmu_set_power_state(u8 state, bool keep_ulp_clk, | 59 | static inline void db5500_prcmu_get_abb_event_buffer(void __iomem **buf) {} |
| 89 | bool keep_ap_pll) | ||
| 90 | { | ||
| 91 | return 0; | ||
| 92 | } | ||
| 93 | 60 | ||
| 94 | static inline void db5500_prcmu_system_reset(u16 reset_code) {} | 61 | static inline void db5500_prcmu_system_reset(u16 reset_code) {} |
| 95 | 62 | ||
| 96 | static inline u16 db5500_prcmu_get_reset_code(void) | 63 | static inline void db5500_prcmu_enable_wakeups(u32 wakeups) {} |
| 64 | |||
| 65 | #ifdef CONFIG_MFD_DB5500_PRCMU | ||
| 66 | |||
| 67 | void db5500_prcmu_early_init(void); | ||
| 68 | int db5500_prcmu_set_display_clocks(void); | ||
| 69 | int db5500_prcmu_disable_dsipll(void); | ||
| 70 | int db5500_prcmu_enable_dsipll(void); | ||
| 71 | int db5500_prcmu_abb_read(u8 slave, u8 reg, u8 *value, u8 size); | ||
| 72 | int db5500_prcmu_abb_write(u8 slave, u8 reg, u8 *value, u8 size); | ||
| 73 | |||
| 74 | #else /* !CONFIG_UX500_SOC_DB5500 */ | ||
| 75 | |||
| 76 | static inline void db5500_prcmu_early_init(void) {} | ||
| 77 | |||
| 78 | static inline int db5500_prcmu_abb_read(u8 slave, u8 reg, u8 *value, u8 size) | ||
| 97 | { | 79 | { |
| 98 | return 0; | 80 | return -ENOSYS; |
| 99 | } | 81 | } |
| 100 | 82 | ||
| 101 | static inline bool db5500_prcmu_is_ac_wake_requested(void) | 83 | static inline int db5500_prcmu_abb_write(u8 slave, u8 reg, u8 *value, u8 size) |
| 102 | { | 84 | { |
| 103 | return 0; | 85 | return -ENOSYS; |
| 104 | } | 86 | } |
| 105 | 87 | ||
| 106 | static inline int db5500_prcmu_set_arm_opp(u8 opp) | 88 | static inline int db5500_prcmu_set_display_clocks(void) |
| 107 | { | 89 | { |
| 108 | return 0; | 90 | return 0; |
| 109 | } | 91 | } |
| 110 | 92 | ||
| 111 | static inline int db5500_prcmu_get_arm_opp(void) | 93 | static inline int db5500_prcmu_disable_dsipll(void) |
| 112 | { | 94 | { |
| 113 | return 0; | 95 | return 0; |
| 114 | } | 96 | } |
| 115 | 97 | ||
| 98 | static inline int db5500_prcmu_enable_dsipll(void) | ||
| 99 | { | ||
| 100 | return 0; | ||
| 101 | } | ||
| 116 | 102 | ||
| 117 | #endif /* CONFIG_MFD_DB5500_PRCMU */ | 103 | #endif /* CONFIG_MFD_DB5500_PRCMU */ |
| 118 | 104 | ||
diff --git a/include/linux/mfd/rc5t583.h b/include/linux/mfd/rc5t583.h index a2c61609d21d..0b64b19d81ab 100644 --- a/include/linux/mfd/rc5t583.h +++ b/include/linux/mfd/rc5t583.h | |||
| @@ -26,6 +26,7 @@ | |||
| 26 | 26 | ||
| 27 | #include <linux/mutex.h> | 27 | #include <linux/mutex.h> |
| 28 | #include <linux/types.h> | 28 | #include <linux/types.h> |
| 29 | #include <linux/regmap.h> | ||
| 29 | 30 | ||
| 30 | #define RC5T583_MAX_REGS 0xF8 | 31 | #define RC5T583_MAX_REGS 0xF8 |
| 31 | 32 | ||
| @@ -279,14 +280,44 @@ struct rc5t583_platform_data { | |||
| 279 | bool enable_shutdown; | 280 | bool enable_shutdown; |
| 280 | }; | 281 | }; |
| 281 | 282 | ||
| 282 | int rc5t583_write(struct device *dev, u8 reg, uint8_t val); | 283 | static inline int rc5t583_write(struct device *dev, uint8_t reg, uint8_t val) |
| 283 | int rc5t583_read(struct device *dev, uint8_t reg, uint8_t *val); | 284 | { |
| 284 | int rc5t583_set_bits(struct device *dev, unsigned int reg, | 285 | struct rc5t583 *rc5t583 = dev_get_drvdata(dev); |
| 285 | unsigned int bit_mask); | 286 | return regmap_write(rc5t583->regmap, reg, val); |
| 286 | int rc5t583_clear_bits(struct device *dev, unsigned int reg, | 287 | } |
| 287 | unsigned int bit_mask); | 288 | |
| 288 | int rc5t583_update(struct device *dev, unsigned int reg, | 289 | static inline int rc5t583_read(struct device *dev, uint8_t reg, uint8_t *val) |
| 289 | unsigned int val, unsigned int mask); | 290 | { |
| 291 | struct rc5t583 *rc5t583 = dev_get_drvdata(dev); | ||
| 292 | unsigned int ival; | ||
| 293 | int ret; | ||
| 294 | ret = regmap_read(rc5t583->regmap, reg, &ival); | ||
| 295 | if (!ret) | ||
| 296 | *val = (uint8_t)ival; | ||
| 297 | return ret; | ||
| 298 | } | ||
| 299 | |||
| 300 | static inline int rc5t583_set_bits(struct device *dev, unsigned int reg, | ||
| 301 | unsigned int bit_mask) | ||
| 302 | { | ||
| 303 | struct rc5t583 *rc5t583 = dev_get_drvdata(dev); | ||
| 304 | return regmap_update_bits(rc5t583->regmap, reg, bit_mask, bit_mask); | ||
| 305 | } | ||
| 306 | |||
| 307 | static inline int rc5t583_clear_bits(struct device *dev, unsigned int reg, | ||
| 308 | unsigned int bit_mask) | ||
| 309 | { | ||
| 310 | struct rc5t583 *rc5t583 = dev_get_drvdata(dev); | ||
| 311 | return regmap_update_bits(rc5t583->regmap, reg, bit_mask, 0); | ||
| 312 | } | ||
| 313 | |||
| 314 | static inline int rc5t583_update(struct device *dev, unsigned int reg, | ||
| 315 | unsigned int val, unsigned int mask) | ||
| 316 | { | ||
| 317 | struct rc5t583 *rc5t583 = dev_get_drvdata(dev); | ||
| 318 | return regmap_update_bits(rc5t583->regmap, reg, mask, val); | ||
| 319 | } | ||
| 320 | |||
| 290 | int rc5t583_ext_power_req_config(struct device *dev, int deepsleep_id, | 321 | int rc5t583_ext_power_req_config(struct device *dev, int deepsleep_id, |
| 291 | int ext_pwr_req, int deepsleep_slot_nr); | 322 | int ext_pwr_req, int deepsleep_slot_nr); |
| 292 | int rc5t583_irq_init(struct rc5t583 *rc5t583, int irq, int irq_base); | 323 | int rc5t583_irq_init(struct rc5t583 *rc5t583, int irq, int irq_base); |
diff --git a/include/linux/mfd/twl6040.h b/include/linux/mfd/twl6040.h index 9bc9ac651dad..b15b5f03f5c4 100644 --- a/include/linux/mfd/twl6040.h +++ b/include/linux/mfd/twl6040.h | |||
| @@ -174,8 +174,35 @@ | |||
| 174 | #define TWL6040_SYSCLK_SEL_LPPLL 0 | 174 | #define TWL6040_SYSCLK_SEL_LPPLL 0 |
| 175 | #define TWL6040_SYSCLK_SEL_HPPLL 1 | 175 | #define TWL6040_SYSCLK_SEL_HPPLL 1 |
| 176 | 176 | ||
| 177 | struct twl6040_codec_data { | ||
| 178 | u16 hs_left_step; | ||
| 179 | u16 hs_right_step; | ||
| 180 | u16 hf_left_step; | ||
| 181 | u16 hf_right_step; | ||
| 182 | }; | ||
| 183 | |||
| 184 | struct twl6040_vibra_data { | ||
| 185 | unsigned int vibldrv_res; /* left driver resistance */ | ||
| 186 | unsigned int vibrdrv_res; /* right driver resistance */ | ||
| 187 | unsigned int viblmotor_res; /* left motor resistance */ | ||
| 188 | unsigned int vibrmotor_res; /* right motor resistance */ | ||
| 189 | int vddvibl_uV; /* VDDVIBL volt, set 0 for fixed reg */ | ||
| 190 | int vddvibr_uV; /* VDDVIBR volt, set 0 for fixed reg */ | ||
| 191 | }; | ||
| 192 | |||
| 193 | struct twl6040_platform_data { | ||
| 194 | int audpwron_gpio; /* audio power-on gpio */ | ||
| 195 | unsigned int irq_base; | ||
| 196 | |||
| 197 | struct twl6040_codec_data *codec; | ||
| 198 | struct twl6040_vibra_data *vibra; | ||
| 199 | }; | ||
| 200 | |||
| 201 | struct regmap; | ||
| 202 | |||
| 177 | struct twl6040 { | 203 | struct twl6040 { |
| 178 | struct device *dev; | 204 | struct device *dev; |
| 205 | struct regmap *regmap; | ||
| 179 | struct mutex mutex; | 206 | struct mutex mutex; |
| 180 | struct mutex io_mutex; | 207 | struct mutex io_mutex; |
| 181 | struct mutex irq_mutex; | 208 | struct mutex irq_mutex; |
diff --git a/include/linux/mm.h b/include/linux/mm.h index d8738a464b94..74aa71bea1e4 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h | |||
| @@ -1393,29 +1393,20 @@ extern int install_special_mapping(struct mm_struct *mm, | |||
| 1393 | 1393 | ||
| 1394 | extern unsigned long get_unmapped_area(struct file *, unsigned long, unsigned long, unsigned long, unsigned long); | 1394 | extern unsigned long get_unmapped_area(struct file *, unsigned long, unsigned long, unsigned long, unsigned long); |
| 1395 | 1395 | ||
| 1396 | extern unsigned long do_mmap_pgoff(struct file *file, unsigned long addr, | ||
| 1397 | unsigned long len, unsigned long prot, | ||
| 1398 | unsigned long flag, unsigned long pgoff); | ||
| 1399 | extern unsigned long mmap_region(struct file *file, unsigned long addr, | 1396 | extern unsigned long mmap_region(struct file *file, unsigned long addr, |
| 1400 | unsigned long len, unsigned long flags, | 1397 | unsigned long len, unsigned long flags, |
| 1401 | vm_flags_t vm_flags, unsigned long pgoff); | 1398 | vm_flags_t vm_flags, unsigned long pgoff); |
| 1402 | 1399 | extern unsigned long do_mmap(struct file *, unsigned long, | |
| 1403 | static inline unsigned long do_mmap(struct file *file, unsigned long addr, | 1400 | unsigned long, unsigned long, |
| 1404 | unsigned long len, unsigned long prot, | 1401 | unsigned long, unsigned long); |
| 1405 | unsigned long flag, unsigned long offset) | ||
| 1406 | { | ||
| 1407 | unsigned long ret = -EINVAL; | ||
| 1408 | if ((offset + PAGE_ALIGN(len)) < offset) | ||
| 1409 | goto out; | ||
| 1410 | if (!(offset & ~PAGE_MASK)) | ||
| 1411 | ret = do_mmap_pgoff(file, addr, len, prot, flag, offset >> PAGE_SHIFT); | ||
| 1412 | out: | ||
| 1413 | return ret; | ||
| 1414 | } | ||
| 1415 | |||
| 1416 | extern int do_munmap(struct mm_struct *, unsigned long, size_t); | 1402 | extern int do_munmap(struct mm_struct *, unsigned long, size_t); |
| 1417 | 1403 | ||
| 1418 | extern unsigned long do_brk(unsigned long, unsigned long); | 1404 | /* These take the mm semaphore themselves */ |
| 1405 | extern unsigned long vm_brk(unsigned long, unsigned long); | ||
| 1406 | extern int vm_munmap(unsigned long, size_t); | ||
| 1407 | extern unsigned long vm_mmap(struct file *, unsigned long, | ||
| 1408 | unsigned long, unsigned long, | ||
| 1409 | unsigned long, unsigned long); | ||
| 1419 | 1410 | ||
| 1420 | /* truncate.c */ | 1411 | /* truncate.c */ |
| 1421 | extern void truncate_inode_pages(struct address_space *, loff_t); | 1412 | extern void truncate_inode_pages(struct address_space *, loff_t); |
| @@ -240,6 +240,8 @@ static struct vm_area_struct *remove_vma(struct vm_area_struct *vma) | |||
| 240 | return next; | 240 | return next; |
| 241 | } | 241 | } |
| 242 | 242 | ||
| 243 | static unsigned long do_brk(unsigned long addr, unsigned long len); | ||
| 244 | |||
| 243 | SYSCALL_DEFINE1(brk, unsigned long, brk) | 245 | SYSCALL_DEFINE1(brk, unsigned long, brk) |
| 244 | { | 246 | { |
| 245 | unsigned long rlim, retval; | 247 | unsigned long rlim, retval; |
| @@ -951,7 +953,7 @@ static inline unsigned long round_hint_to_min(unsigned long hint) | |||
| 951 | * The caller must hold down_write(¤t->mm->mmap_sem). | 953 | * The caller must hold down_write(¤t->mm->mmap_sem). |
| 952 | */ | 954 | */ |
| 953 | 955 | ||
| 954 | unsigned long do_mmap_pgoff(struct file *file, unsigned long addr, | 956 | static unsigned long do_mmap_pgoff(struct file *file, unsigned long addr, |
| 955 | unsigned long len, unsigned long prot, | 957 | unsigned long len, unsigned long prot, |
| 956 | unsigned long flags, unsigned long pgoff) | 958 | unsigned long flags, unsigned long pgoff) |
| 957 | { | 959 | { |
| @@ -1087,7 +1089,32 @@ unsigned long do_mmap_pgoff(struct file *file, unsigned long addr, | |||
| 1087 | 1089 | ||
| 1088 | return mmap_region(file, addr, len, flags, vm_flags, pgoff); | 1090 | return mmap_region(file, addr, len, flags, vm_flags, pgoff); |
| 1089 | } | 1091 | } |
| 1090 | EXPORT_SYMBOL(do_mmap_pgoff); | 1092 | |
| 1093 | unsigned long do_mmap(struct file *file, unsigned long addr, | ||
| 1094 | unsigned long len, unsigned long prot, | ||
| 1095 | unsigned long flag, unsigned long offset) | ||
| 1096 | { | ||
| 1097 | if (unlikely(offset + PAGE_ALIGN(len) < offset)) | ||
| 1098 | return -EINVAL; | ||
| 1099 | if (unlikely(offset & ~PAGE_MASK)) | ||
| 1100 | return -EINVAL; | ||
| 1101 | return do_mmap_pgoff(file, addr, len, prot, flag, offset >> PAGE_SHIFT); | ||
| 1102 | } | ||
| 1103 | EXPORT_SYMBOL(do_mmap); | ||
| 1104 | |||
| 1105 | unsigned long vm_mmap(struct file *file, unsigned long addr, | ||
| 1106 | unsigned long len, unsigned long prot, | ||
| 1107 | unsigned long flag, unsigned long offset) | ||
| 1108 | { | ||
| 1109 | unsigned long ret; | ||
| 1110 | struct mm_struct *mm = current->mm; | ||
| 1111 | |||
| 1112 | down_write(&mm->mmap_sem); | ||
| 1113 | ret = do_mmap(file, addr, len, prot, flag, offset); | ||
| 1114 | up_write(&mm->mmap_sem); | ||
| 1115 | return ret; | ||
| 1116 | } | ||
| 1117 | EXPORT_SYMBOL(vm_mmap); | ||
| 1091 | 1118 | ||
| 1092 | SYSCALL_DEFINE6(mmap_pgoff, unsigned long, addr, unsigned long, len, | 1119 | SYSCALL_DEFINE6(mmap_pgoff, unsigned long, addr, unsigned long, len, |
| 1093 | unsigned long, prot, unsigned long, flags, | 1120 | unsigned long, prot, unsigned long, flags, |
| @@ -2105,21 +2132,25 @@ int do_munmap(struct mm_struct *mm, unsigned long start, size_t len) | |||
| 2105 | 2132 | ||
| 2106 | return 0; | 2133 | return 0; |
| 2107 | } | 2134 | } |
| 2108 | |||
| 2109 | EXPORT_SYMBOL(do_munmap); | 2135 | EXPORT_SYMBOL(do_munmap); |
| 2110 | 2136 | ||
| 2111 | SYSCALL_DEFINE2(munmap, unsigned long, addr, size_t, len) | 2137 | int vm_munmap(unsigned long start, size_t len) |
| 2112 | { | 2138 | { |
| 2113 | int ret; | 2139 | int ret; |
| 2114 | struct mm_struct *mm = current->mm; | 2140 | struct mm_struct *mm = current->mm; |
| 2115 | 2141 | ||
| 2116 | profile_munmap(addr); | ||
| 2117 | |||
| 2118 | down_write(&mm->mmap_sem); | 2142 | down_write(&mm->mmap_sem); |
| 2119 | ret = do_munmap(mm, addr, len); | 2143 | ret = do_munmap(mm, start, len); |
| 2120 | up_write(&mm->mmap_sem); | 2144 | up_write(&mm->mmap_sem); |
| 2121 | return ret; | 2145 | return ret; |
| 2122 | } | 2146 | } |
| 2147 | EXPORT_SYMBOL(vm_munmap); | ||
| 2148 | |||
| 2149 | SYSCALL_DEFINE2(munmap, unsigned long, addr, size_t, len) | ||
| 2150 | { | ||
| 2151 | profile_munmap(addr); | ||
| 2152 | return vm_munmap(addr, len); | ||
| 2153 | } | ||
| 2123 | 2154 | ||
| 2124 | static inline void verify_mm_writelocked(struct mm_struct *mm) | 2155 | static inline void verify_mm_writelocked(struct mm_struct *mm) |
| 2125 | { | 2156 | { |
| @@ -2136,7 +2167,7 @@ static inline void verify_mm_writelocked(struct mm_struct *mm) | |||
| 2136 | * anonymous maps. eventually we may be able to do some | 2167 | * anonymous maps. eventually we may be able to do some |
| 2137 | * brk-specific accounting here. | 2168 | * brk-specific accounting here. |
| 2138 | */ | 2169 | */ |
| 2139 | unsigned long do_brk(unsigned long addr, unsigned long len) | 2170 | static unsigned long do_brk(unsigned long addr, unsigned long len) |
| 2140 | { | 2171 | { |
| 2141 | struct mm_struct * mm = current->mm; | 2172 | struct mm_struct * mm = current->mm; |
| 2142 | struct vm_area_struct * vma, * prev; | 2173 | struct vm_area_struct * vma, * prev; |
| @@ -2232,7 +2263,17 @@ out: | |||
| 2232 | return addr; | 2263 | return addr; |
| 2233 | } | 2264 | } |
| 2234 | 2265 | ||
| 2235 | EXPORT_SYMBOL(do_brk); | 2266 | unsigned long vm_brk(unsigned long addr, unsigned long len) |
| 2267 | { | ||
| 2268 | struct mm_struct *mm = current->mm; | ||
| 2269 | unsigned long ret; | ||
| 2270 | |||
| 2271 | down_write(&mm->mmap_sem); | ||
| 2272 | ret = do_brk(addr, len); | ||
| 2273 | up_write(&mm->mmap_sem); | ||
| 2274 | return ret; | ||
| 2275 | } | ||
| 2276 | EXPORT_SYMBOL(vm_brk); | ||
| 2236 | 2277 | ||
| 2237 | /* Release all mmaps. */ | 2278 | /* Release all mmaps. */ |
| 2238 | void exit_mmap(struct mm_struct *mm) | 2279 | void exit_mmap(struct mm_struct *mm) |
diff --git a/mm/nommu.c b/mm/nommu.c index f59e170fceb4..bb8f4f004a82 100644 --- a/mm/nommu.c +++ b/mm/nommu.c | |||
| @@ -1233,7 +1233,7 @@ enomem: | |||
| 1233 | /* | 1233 | /* |
| 1234 | * handle mapping creation for uClinux | 1234 | * handle mapping creation for uClinux |
| 1235 | */ | 1235 | */ |
| 1236 | unsigned long do_mmap_pgoff(struct file *file, | 1236 | static unsigned long do_mmap_pgoff(struct file *file, |
| 1237 | unsigned long addr, | 1237 | unsigned long addr, |
| 1238 | unsigned long len, | 1238 | unsigned long len, |
| 1239 | unsigned long prot, | 1239 | unsigned long prot, |
| @@ -1470,7 +1470,32 @@ error_getting_region: | |||
| 1470 | show_free_areas(0); | 1470 | show_free_areas(0); |
| 1471 | return -ENOMEM; | 1471 | return -ENOMEM; |
| 1472 | } | 1472 | } |
| 1473 | EXPORT_SYMBOL(do_mmap_pgoff); | 1473 | |
| 1474 | unsigned long do_mmap(struct file *file, unsigned long addr, | ||
| 1475 | unsigned long len, unsigned long prot, | ||
| 1476 | unsigned long flag, unsigned long offset) | ||
| 1477 | { | ||
| 1478 | if (unlikely(offset + PAGE_ALIGN(len) < offset)) | ||
| 1479 | return -EINVAL; | ||
| 1480 | if (unlikely(offset & ~PAGE_MASK)) | ||
| 1481 | return -EINVAL; | ||
| 1482 | return do_mmap_pgoff(file, addr, len, prot, flag, offset >> PAGE_SHIFT); | ||
| 1483 | } | ||
| 1484 | EXPORT_SYMBOL(do_mmap); | ||
| 1485 | |||
| 1486 | unsigned long vm_mmap(struct file *file, unsigned long addr, | ||
| 1487 | unsigned long len, unsigned long prot, | ||
| 1488 | unsigned long flag, unsigned long offset) | ||
| 1489 | { | ||
| 1490 | unsigned long ret; | ||
| 1491 | struct mm_struct *mm = current->mm; | ||
| 1492 | |||
| 1493 | down_write(&mm->mmap_sem); | ||
| 1494 | ret = do_mmap(file, addr, len, prot, flag, offset); | ||
| 1495 | up_write(&mm->mmap_sem); | ||
| 1496 | return ret; | ||
| 1497 | } | ||
| 1498 | EXPORT_SYMBOL(vm_mmap); | ||
| 1474 | 1499 | ||
| 1475 | SYSCALL_DEFINE6(mmap_pgoff, unsigned long, addr, unsigned long, len, | 1500 | SYSCALL_DEFINE6(mmap_pgoff, unsigned long, addr, unsigned long, len, |
| 1476 | unsigned long, prot, unsigned long, flags, | 1501 | unsigned long, prot, unsigned long, flags, |
| @@ -1709,16 +1734,22 @@ erase_whole_vma: | |||
| 1709 | } | 1734 | } |
| 1710 | EXPORT_SYMBOL(do_munmap); | 1735 | EXPORT_SYMBOL(do_munmap); |
| 1711 | 1736 | ||
| 1712 | SYSCALL_DEFINE2(munmap, unsigned long, addr, size_t, len) | 1737 | int vm_munmap(unsigned long addr, size_t len) |
| 1713 | { | 1738 | { |
| 1714 | int ret; | ||
| 1715 | struct mm_struct *mm = current->mm; | 1739 | struct mm_struct *mm = current->mm; |
| 1740 | int ret; | ||
| 1716 | 1741 | ||
| 1717 | down_write(&mm->mmap_sem); | 1742 | down_write(&mm->mmap_sem); |
| 1718 | ret = do_munmap(mm, addr, len); | 1743 | ret = do_munmap(mm, addr, len); |
| 1719 | up_write(&mm->mmap_sem); | 1744 | up_write(&mm->mmap_sem); |
| 1720 | return ret; | 1745 | return ret; |
| 1721 | } | 1746 | } |
| 1747 | EXPORT_SYMBOL(vm_munmap); | ||
| 1748 | |||
| 1749 | SYSCALL_DEFINE2(munmap, unsigned long, addr, size_t, len) | ||
| 1750 | { | ||
| 1751 | return vm_munmap(addr, len); | ||
| 1752 | } | ||
| 1722 | 1753 | ||
| 1723 | /* | 1754 | /* |
| 1724 | * release all the mappings made in a process's VM space | 1755 | * release all the mappings made in a process's VM space |
| @@ -1744,7 +1775,7 @@ void exit_mmap(struct mm_struct *mm) | |||
| 1744 | kleave(""); | 1775 | kleave(""); |
| 1745 | } | 1776 | } |
| 1746 | 1777 | ||
| 1747 | unsigned long do_brk(unsigned long addr, unsigned long len) | 1778 | unsigned long vm_brk(unsigned long addr, unsigned long len) |
| 1748 | { | 1779 | { |
| 1749 | return -ENOMEM; | 1780 | return -ENOMEM; |
| 1750 | } | 1781 | } |
diff --git a/sound/soc/codecs/Kconfig b/sound/soc/codecs/Kconfig index 6508e8b790bb..59d8efaa17e9 100644 --- a/sound/soc/codecs/Kconfig +++ b/sound/soc/codecs/Kconfig | |||
| @@ -57,7 +57,7 @@ config SND_SOC_ALL_CODECS | |||
| 57 | select SND_SOC_TPA6130A2 if I2C | 57 | select SND_SOC_TPA6130A2 if I2C |
| 58 | select SND_SOC_TLV320DAC33 if I2C | 58 | select SND_SOC_TLV320DAC33 if I2C |
| 59 | select SND_SOC_TWL4030 if TWL4030_CORE | 59 | select SND_SOC_TWL4030 if TWL4030_CORE |
| 60 | select SND_SOC_TWL6040 if TWL4030_CORE | 60 | select SND_SOC_TWL6040 if TWL6040_CORE |
| 61 | select SND_SOC_UDA134X | 61 | select SND_SOC_UDA134X |
| 62 | select SND_SOC_UDA1380 if I2C | 62 | select SND_SOC_UDA1380 if I2C |
| 63 | select SND_SOC_WL1273 if MFD_WL1273_CORE | 63 | select SND_SOC_WL1273 if MFD_WL1273_CORE |
| @@ -276,7 +276,6 @@ config SND_SOC_TWL4030 | |||
| 276 | tristate | 276 | tristate |
| 277 | 277 | ||
| 278 | config SND_SOC_TWL6040 | 278 | config SND_SOC_TWL6040 |
| 279 | select TWL6040_CORE | ||
| 280 | tristate | 279 | tristate |
| 281 | 280 | ||
| 282 | config SND_SOC_UDA134X | 281 | config SND_SOC_UDA134X |
diff --git a/sound/soc/codecs/twl6040.c b/sound/soc/codecs/twl6040.c index 2d8c6b825e57..dc7509b9d53a 100644 --- a/sound/soc/codecs/twl6040.c +++ b/sound/soc/codecs/twl6040.c | |||
| @@ -26,7 +26,6 @@ | |||
| 26 | #include <linux/pm.h> | 26 | #include <linux/pm.h> |
| 27 | #include <linux/platform_device.h> | 27 | #include <linux/platform_device.h> |
| 28 | #include <linux/slab.h> | 28 | #include <linux/slab.h> |
| 29 | #include <linux/i2c/twl.h> | ||
| 30 | #include <linux/mfd/twl6040.h> | 29 | #include <linux/mfd/twl6040.h> |
| 31 | 30 | ||
| 32 | #include <sound/core.h> | 31 | #include <sound/core.h> |
| @@ -1528,7 +1527,7 @@ static int twl6040_resume(struct snd_soc_codec *codec) | |||
| 1528 | static int twl6040_probe(struct snd_soc_codec *codec) | 1527 | static int twl6040_probe(struct snd_soc_codec *codec) |
| 1529 | { | 1528 | { |
| 1530 | struct twl6040_data *priv; | 1529 | struct twl6040_data *priv; |
| 1531 | struct twl4030_codec_data *pdata = dev_get_platdata(codec->dev); | 1530 | struct twl6040_codec_data *pdata = dev_get_platdata(codec->dev); |
| 1532 | struct platform_device *pdev = container_of(codec->dev, | 1531 | struct platform_device *pdev = container_of(codec->dev, |
| 1533 | struct platform_device, dev); | 1532 | struct platform_device, dev); |
| 1534 | int ret = 0; | 1533 | int ret = 0; |
diff --git a/sound/soc/omap/Kconfig b/sound/soc/omap/Kconfig index e00dd0b1139c..deafbfaacdbf 100644 --- a/sound/soc/omap/Kconfig +++ b/sound/soc/omap/Kconfig | |||
| @@ -97,7 +97,7 @@ config SND_OMAP_SOC_SDP3430 | |||
| 97 | 97 | ||
| 98 | config SND_OMAP_SOC_OMAP_ABE_TWL6040 | 98 | config SND_OMAP_SOC_OMAP_ABE_TWL6040 |
| 99 | tristate "SoC Audio support for OMAP boards using ABE and twl6040 codec" | 99 | tristate "SoC Audio support for OMAP boards using ABE and twl6040 codec" |
| 100 | depends on TWL4030_CORE && SND_OMAP_SOC && ARCH_OMAP4 | 100 | depends on TWL6040_CORE && SND_OMAP_SOC && ARCH_OMAP4 |
| 101 | select SND_OMAP_SOC_DMIC | 101 | select SND_OMAP_SOC_DMIC |
| 102 | select SND_OMAP_SOC_MCPDM | 102 | select SND_OMAP_SOC_MCPDM |
| 103 | select SND_SOC_TWL6040 | 103 | select SND_SOC_TWL6040 |
