diff options
73 files changed, 786 insertions, 602 deletions
diff --git a/.gitignore b/.gitignore index 9bb1cb6d825d..869e1a3b64b6 100644 --- a/.gitignore +++ b/.gitignore | |||
| @@ -3,6 +3,10 @@ | |||
| 3 | # subdirectories here. Add them in the ".gitignore" file | 3 | # subdirectories here. Add them in the ".gitignore" file |
| 4 | # in that subdirectory instead. | 4 | # in that subdirectory instead. |
| 5 | # | 5 | # |
| 6 | # NOTE! Please use 'git-ls-files -i --exclude-standard' | ||
| 7 | # command after changing this file, to see if there are | ||
| 8 | # any tracked files which get ignored after the change. | ||
| 9 | # | ||
| 6 | # Normal rules | 10 | # Normal rules |
| 7 | # | 11 | # |
| 8 | .* | 12 | .* |
| @@ -18,19 +22,21 @@ | |||
| 18 | *.lst | 22 | *.lst |
| 19 | *.symtypes | 23 | *.symtypes |
| 20 | *.order | 24 | *.order |
| 25 | *.elf | ||
| 26 | *.bin | ||
| 27 | *.gz | ||
| 21 | 28 | ||
| 22 | # | 29 | # |
| 23 | # Top-level generic files | 30 | # Top-level generic files |
| 24 | # | 31 | # |
| 25 | tags | 32 | tags |
| 26 | TAGS | 33 | TAGS |
| 27 | vmlinux* | 34 | vmlinux |
| 28 | !vmlinux.lds.S | ||
| 29 | !vmlinux.lds.h | ||
| 30 | System.map | 35 | System.map |
| 31 | Module.markers | 36 | Module.markers |
| 32 | Module.symvers | 37 | Module.symvers |
| 33 | !.gitignore | 38 | !.gitignore |
| 39 | !.mailmap | ||
| 34 | 40 | ||
| 35 | # | 41 | # |
| 36 | # Generated include files | 42 | # Generated include files |
diff --git a/Documentation/feature-removal-schedule.txt b/Documentation/feature-removal-schedule.txt index 5b3f31faed56..46ece3fba6f9 100644 --- a/Documentation/feature-removal-schedule.txt +++ b/Documentation/feature-removal-schedule.txt | |||
| @@ -312,3 +312,12 @@ When: 2.6.26 | |||
| 312 | Why: Implementation became generic; users should now include | 312 | Why: Implementation became generic; users should now include |
| 313 | linux/semaphore.h instead. | 313 | linux/semaphore.h instead. |
| 314 | Who: Matthew Wilcox <willy@linux.intel.com> | 314 | Who: Matthew Wilcox <willy@linux.intel.com> |
| 315 | |||
| 316 | --------------------------- | ||
| 317 | |||
| 318 | What: CONFIG_THERMAL_HWMON | ||
| 319 | When: January 2009 | ||
| 320 | Why: This option was introduced just to allow older lm-sensors userspace | ||
| 321 | to keep working over the upgrade to 2.6.26. At the scheduled time of | ||
| 322 | removal fixed lm-sensors (2.x or 3.x) should be readily available. | ||
| 323 | Who: Rene Herman <rene.herman@gmail.com> | ||
diff --git a/Documentation/video4linux/CARDLIST.au0828 b/Documentation/video4linux/CARDLIST.au0828 index aaae360312e4..86d1c8e7b18f 100644 --- a/Documentation/video4linux/CARDLIST.au0828 +++ b/Documentation/video4linux/CARDLIST.au0828 | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | 0 -> Unknown board (au0828) | 1 | 0 -> Unknown board (au0828) |
| 2 | 1 -> Hauppauge HVR950Q (au0828) [2040:7200] | 2 | 1 -> Hauppauge HVR950Q (au0828) [2040:7200,2040:7210,2040:7217,2040:721b,2040:721f,2040:7280,0fd9:0008] |
| 3 | 2 -> Hauppauge HVR850 (au0828) [2040:7240] | 3 | 2 -> Hauppauge HVR850 (au0828) [2040:7240] |
| 4 | 3 -> DViCO FusionHDTV USB (au0828) [0fe9:d620] | 4 | 3 -> DViCO FusionHDTV USB (au0828) [0fe9:d620] |
diff --git a/arch/blackfin/kernel/cplb-nompu/cplbinit.c b/arch/blackfin/kernel/cplb-nompu/cplbinit.c index 917325bfbd84..6be0c50122e8 100644 --- a/arch/blackfin/kernel/cplb-nompu/cplbinit.c +++ b/arch/blackfin/kernel/cplb-nompu/cplbinit.c | |||
| @@ -254,7 +254,8 @@ close_cplbtab(struct cplb_tab *table) | |||
| 254 | } | 254 | } |
| 255 | 255 | ||
| 256 | /* helper function */ | 256 | /* helper function */ |
| 257 | static void __fill_code_cplbtab(struct cplb_tab *t, int i, u32 a_start, u32 a_end) | 257 | static void __init |
| 258 | __fill_code_cplbtab(struct cplb_tab *t, int i, u32 a_start, u32 a_end) | ||
| 258 | { | 259 | { |
| 259 | if (cplb_data[i].psize) { | 260 | if (cplb_data[i].psize) { |
| 260 | fill_cplbtab(t, | 261 | fill_cplbtab(t, |
| @@ -291,7 +292,8 @@ static void __fill_code_cplbtab(struct cplb_tab *t, int i, u32 a_start, u32 a_en | |||
| 291 | } | 292 | } |
| 292 | } | 293 | } |
| 293 | 294 | ||
| 294 | static void __fill_data_cplbtab(struct cplb_tab *t, int i, u32 a_start, u32 a_end) | 295 | static void __init |
| 296 | __fill_data_cplbtab(struct cplb_tab *t, int i, u32 a_start, u32 a_end) | ||
| 295 | { | 297 | { |
| 296 | if (cplb_data[i].psize) { | 298 | if (cplb_data[i].psize) { |
| 297 | fill_cplbtab(t, | 299 | fill_cplbtab(t, |
diff --git a/arch/blackfin/kernel/irqchip.c b/arch/blackfin/kernel/irqchip.c index 73647c158774..07402f57c9de 100644 --- a/arch/blackfin/kernel/irqchip.c +++ b/arch/blackfin/kernel/irqchip.c | |||
| @@ -60,9 +60,14 @@ static struct irq_chip bad_chip = { | |||
| 60 | }; | 60 | }; |
| 61 | 61 | ||
| 62 | static struct irq_desc bad_irq_desc = { | 62 | static struct irq_desc bad_irq_desc = { |
| 63 | .status = IRQ_DISABLED, | ||
| 63 | .chip = &bad_chip, | 64 | .chip = &bad_chip, |
| 64 | .handle_irq = handle_bad_irq, | 65 | .handle_irq = handle_bad_irq, |
| 65 | .depth = 1, | 66 | .depth = 1, |
| 67 | .lock = __SPIN_LOCK_UNLOCKED(irq_desc->lock), | ||
| 68 | #ifdef CONFIG_SMP | ||
| 69 | .affinity = CPU_MASK_ALL | ||
| 70 | #endif | ||
| 66 | }; | 71 | }; |
| 67 | 72 | ||
| 68 | int show_interrupts(struct seq_file *p, void *v) | 73 | int show_interrupts(struct seq_file *p, void *v) |
diff --git a/arch/x86/kernel/i387.c b/arch/x86/kernel/i387.c index eb9ddd8efb82..95e80e5033c3 100644 --- a/arch/x86/kernel/i387.c +++ b/arch/x86/kernel/i387.c | |||
| @@ -162,7 +162,7 @@ int xfpregs_get(struct task_struct *target, const struct user_regset *regset, | |||
| 162 | int ret; | 162 | int ret; |
| 163 | 163 | ||
| 164 | if (!cpu_has_fxsr) | 164 | if (!cpu_has_fxsr) |
| 165 | return -ENODEV; | 165 | return -EIO; |
| 166 | 166 | ||
| 167 | ret = init_fpu(target); | 167 | ret = init_fpu(target); |
| 168 | if (ret) | 168 | if (ret) |
| @@ -179,7 +179,7 @@ int xfpregs_set(struct task_struct *target, const struct user_regset *regset, | |||
| 179 | int ret; | 179 | int ret; |
| 180 | 180 | ||
| 181 | if (!cpu_has_fxsr) | 181 | if (!cpu_has_fxsr) |
| 182 | return -ENODEV; | 182 | return -EIO; |
| 183 | 183 | ||
| 184 | ret = init_fpu(target); | 184 | ret = init_fpu(target); |
| 185 | if (ret) | 185 | if (ret) |
diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c index 56078d61c793..3e1cecedde42 100644 --- a/arch/x86/kernel/smpboot.c +++ b/arch/x86/kernel/smpboot.c | |||
| @@ -996,7 +996,6 @@ do_rest: | |||
| 996 | #endif | 996 | #endif |
| 997 | cpu_clear(cpu, cpu_callout_map); /* was set by do_boot_cpu() */ | 997 | cpu_clear(cpu, cpu_callout_map); /* was set by do_boot_cpu() */ |
| 998 | cpu_clear(cpu, cpu_initialized); /* was set by cpu_init() */ | 998 | cpu_clear(cpu, cpu_initialized); /* was set by cpu_init() */ |
| 999 | cpu_clear(cpu, cpu_possible_map); | ||
| 1000 | cpu_clear(cpu, cpu_present_map); | 999 | cpu_clear(cpu, cpu_present_map); |
| 1001 | per_cpu(x86_cpu_to_apicid, cpu) = BAD_APICID; | 1000 | per_cpu(x86_cpu_to_apicid, cpu) = BAD_APICID; |
| 1002 | } | 1001 | } |
diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c index 156e6d7b0e32..f6d20be7a8f4 100644 --- a/arch/x86/mm/init_64.c +++ b/arch/x86/mm/init_64.c | |||
| @@ -135,7 +135,7 @@ static __init void *spp_getpage(void) | |||
| 135 | return ptr; | 135 | return ptr; |
| 136 | } | 136 | } |
| 137 | 137 | ||
| 138 | static void | 138 | static __init void |
| 139 | set_pte_phys(unsigned long vaddr, unsigned long phys, pgprot_t prot) | 139 | set_pte_phys(unsigned long vaddr, unsigned long phys, pgprot_t prot) |
| 140 | { | 140 | { |
| 141 | pgd_t *pgd; | 141 | pgd_t *pgd; |
| @@ -214,7 +214,7 @@ void __init cleanup_highmap(void) | |||
| 214 | } | 214 | } |
| 215 | 215 | ||
| 216 | /* NOTE: this is meant to be run only at boot */ | 216 | /* NOTE: this is meant to be run only at boot */ |
| 217 | void __set_fixmap(enum fixed_addresses idx, unsigned long phys, pgprot_t prot) | 217 | void __init __set_fixmap(enum fixed_addresses idx, unsigned long phys, pgprot_t prot) |
| 218 | { | 218 | { |
| 219 | unsigned long address = __fix_to_virt(idx); | 219 | unsigned long address = __fix_to_virt(idx); |
| 220 | 220 | ||
| @@ -506,7 +506,7 @@ early_param("memtest", parse_memtest); | |||
| 506 | 506 | ||
| 507 | static void __init early_memtest(unsigned long start, unsigned long end) | 507 | static void __init early_memtest(unsigned long start, unsigned long end) |
| 508 | { | 508 | { |
| 509 | u64 t_start, t_size; | 509 | unsigned long t_start, t_size; |
| 510 | unsigned pattern; | 510 | unsigned pattern; |
| 511 | 511 | ||
| 512 | if (!memtest_pattern) | 512 | if (!memtest_pattern) |
| @@ -525,7 +525,7 @@ static void __init early_memtest(unsigned long start, unsigned long end) | |||
| 525 | if (t_start + t_size > end) | 525 | if (t_start + t_size > end) |
| 526 | t_size = end - t_start; | 526 | t_size = end - t_start; |
| 527 | 527 | ||
| 528 | printk(KERN_CONT "\n %016llx - %016llx pattern %d", | 528 | printk(KERN_CONT "\n %016lx - %016lx pattern %d", |
| 529 | t_start, t_start + t_size, pattern); | 529 | t_start, t_start + t_size, pattern); |
| 530 | 530 | ||
| 531 | memtest(t_start, t_size, pattern); | 531 | memtest(t_start, t_size, pattern); |
diff --git a/drivers/acpi/bay.c b/drivers/acpi/bay.c index 26038c2a2a71..61b6c5beb2d3 100644 --- a/drivers/acpi/bay.c +++ b/drivers/acpi/bay.c | |||
| @@ -377,6 +377,9 @@ static int __init bay_init(void) | |||
| 377 | 377 | ||
| 378 | INIT_LIST_HEAD(&drive_bays); | 378 | INIT_LIST_HEAD(&drive_bays); |
| 379 | 379 | ||
| 380 | if (acpi_disabled) | ||
| 381 | return -ENODEV; | ||
| 382 | |||
| 380 | /* look for dockable drive bays */ | 383 | /* look for dockable drive bays */ |
| 381 | acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT, | 384 | acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT, |
| 382 | ACPI_UINT32_MAX, find_bay, &bays, NULL); | 385 | ACPI_UINT32_MAX, find_bay, &bays, NULL); |
diff --git a/drivers/acpi/dock.c b/drivers/acpi/dock.c index 96c542f7fded..bb7c51f712bd 100644 --- a/drivers/acpi/dock.c +++ b/drivers/acpi/dock.c | |||
| @@ -917,6 +917,9 @@ static int __init dock_init(void) | |||
| 917 | 917 | ||
| 918 | dock_station = NULL; | 918 | dock_station = NULL; |
| 919 | 919 | ||
| 920 | if (acpi_disabled) | ||
| 921 | return 0; | ||
| 922 | |||
| 920 | /* look for a dock station */ | 923 | /* look for a dock station */ |
| 921 | acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT, | 924 | acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT, |
| 922 | ACPI_UINT32_MAX, find_dock, &num, NULL); | 925 | ACPI_UINT32_MAX, find_dock, &num, NULL); |
diff --git a/drivers/acpi/glue.c b/drivers/acpi/glue.c index 2808dc60fd67..9b227d4dc9c9 100644 --- a/drivers/acpi/glue.c +++ b/drivers/acpi/glue.c | |||
| @@ -333,6 +333,9 @@ static int __init acpi_rtc_init(void) | |||
| 333 | { | 333 | { |
| 334 | struct device *dev = get_rtc_dev(); | 334 | struct device *dev = get_rtc_dev(); |
| 335 | 335 | ||
| 336 | if (acpi_disabled) | ||
| 337 | return 0; | ||
| 338 | |||
| 336 | if (dev) { | 339 | if (dev) { |
| 337 | rtc_wake_setup(); | 340 | rtc_wake_setup(); |
| 338 | rtc_info.wake_on = rtc_wake_on; | 341 | rtc_info.wake_on = rtc_wake_on; |
diff --git a/drivers/firewire/fw-sbp2.c b/drivers/firewire/fw-sbp2.c index b2458bb8e9ca..227d2e036cd8 100644 --- a/drivers/firewire/fw-sbp2.c +++ b/drivers/firewire/fw-sbp2.c | |||
| @@ -1051,7 +1051,8 @@ static int sbp2_scan_unit_dir(struct sbp2_target *tgt, u32 *directory, | |||
| 1051 | break; | 1051 | break; |
| 1052 | 1052 | ||
| 1053 | case SBP2_CSR_LOGICAL_UNIT_DIRECTORY: | 1053 | case SBP2_CSR_LOGICAL_UNIT_DIRECTORY: |
| 1054 | if (sbp2_scan_logical_unit_dir(tgt, ci.p + value) < 0) | 1054 | /* Adjust for the increment in the iterator */ |
| 1055 | if (sbp2_scan_logical_unit_dir(tgt, ci.p - 1 + value) < 0) | ||
| 1055 | return -ENOMEM; | 1056 | return -ENOMEM; |
| 1056 | break; | 1057 | break; |
| 1057 | } | 1058 | } |
diff --git a/drivers/media/common/ir-keymaps.c b/drivers/media/common/ir-keymaps.c index a3485817e46c..8fa91f846d59 100644 --- a/drivers/media/common/ir-keymaps.c +++ b/drivers/media/common/ir-keymaps.c | |||
| @@ -2201,3 +2201,41 @@ IR_KEYTAB_TYPE ir_codes_powercolor_real_angel[IR_KEYTAB_SIZE] = { | |||
| 2201 | [0x25] = KEY_POWER, /* power */ | 2201 | [0x25] = KEY_POWER, /* power */ |
| 2202 | }; | 2202 | }; |
| 2203 | EXPORT_SYMBOL_GPL(ir_codes_powercolor_real_angel); | 2203 | EXPORT_SYMBOL_GPL(ir_codes_powercolor_real_angel); |
| 2204 | |||
| 2205 | IR_KEYTAB_TYPE ir_codes_avermedia_a16d[IR_KEYTAB_SIZE] = { | ||
| 2206 | [0x20] = KEY_LIST, | ||
| 2207 | [0x00] = KEY_POWER, | ||
| 2208 | [0x28] = KEY_1, | ||
| 2209 | [0x18] = KEY_2, | ||
| 2210 | [0x38] = KEY_3, | ||
| 2211 | [0x24] = KEY_4, | ||
| 2212 | [0x14] = KEY_5, | ||
| 2213 | [0x34] = KEY_6, | ||
| 2214 | [0x2c] = KEY_7, | ||
| 2215 | [0x1c] = KEY_8, | ||
| 2216 | [0x3c] = KEY_9, | ||
| 2217 | [0x12] = KEY_SUBTITLE, | ||
| 2218 | [0x22] = KEY_0, | ||
| 2219 | [0x32] = KEY_REWIND, | ||
| 2220 | [0x3a] = KEY_SHUFFLE, | ||
| 2221 | [0x02] = KEY_PRINT, | ||
| 2222 | [0x11] = KEY_CHANNELDOWN, | ||
| 2223 | [0x31] = KEY_CHANNELUP, | ||
| 2224 | [0x0c] = KEY_ZOOM, | ||
| 2225 | [0x1e] = KEY_VOLUMEDOWN, | ||
| 2226 | [0x3e] = KEY_VOLUMEUP, | ||
| 2227 | [0x0a] = KEY_MUTE, | ||
| 2228 | [0x04] = KEY_AUDIO, | ||
| 2229 | [0x26] = KEY_RECORD, | ||
| 2230 | [0x06] = KEY_PLAY, | ||
| 2231 | [0x36] = KEY_STOP, | ||
| 2232 | [0x16] = KEY_PAUSE, | ||
| 2233 | [0x2e] = KEY_REWIND, | ||
| 2234 | [0x0e] = KEY_FASTFORWARD, | ||
| 2235 | [0x30] = KEY_TEXT, | ||
| 2236 | [0x21] = KEY_GREEN, | ||
| 2237 | [0x01] = KEY_BLUE, | ||
| 2238 | [0x08] = KEY_EPG, | ||
| 2239 | [0x2a] = KEY_MENU, | ||
| 2240 | }; | ||
| 2241 | EXPORT_SYMBOL_GPL(ir_codes_avermedia_a16d); | ||
diff --git a/drivers/media/common/tuners/tda18271-common.c b/drivers/media/common/tuners/tda18271-common.c index f1894fec32b9..6fb5b4586569 100644 --- a/drivers/media/common/tuners/tda18271-common.c +++ b/drivers/media/common/tuners/tda18271-common.c | |||
| @@ -649,9 +649,17 @@ int tda18271_calc_rf_cal(struct dvb_frontend *fe, u32 *freq) | |||
| 649 | u8 val; | 649 | u8 val; |
| 650 | 650 | ||
| 651 | int ret = tda18271_lookup_map(fe, RF_CAL, freq, &val); | 651 | int ret = tda18271_lookup_map(fe, RF_CAL, freq, &val); |
| 652 | /* The TDA18271HD/C1 rf_cal map lookup is expected to go out of range | ||
| 653 | * for frequencies above 61.1 MHz. In these cases, the internal RF | ||
| 654 | * tracking filters calibration mechanism is used. | ||
| 655 | * | ||
| 656 | * There is no need to warn the user about this. | ||
| 657 | */ | ||
| 658 | if (ret < 0) | ||
| 659 | goto fail; | ||
| 652 | 660 | ||
| 653 | regs[R_EB14] = val; | 661 | regs[R_EB14] = val; |
| 654 | 662 | fail: | |
| 655 | return ret; | 663 | return ret; |
| 656 | } | 664 | } |
| 657 | 665 | ||
diff --git a/drivers/media/common/tuners/tda18271-fe.c b/drivers/media/common/tuners/tda18271-fe.c index 89c01fb1f859..93063c6fbbf6 100644 --- a/drivers/media/common/tuners/tda18271-fe.c +++ b/drivers/media/common/tuners/tda18271-fe.c | |||
| @@ -45,6 +45,21 @@ static inline int charge_pump_source(struct dvb_frontend *fe, int force) | |||
| 45 | TDA18271_MAIN_PLL, force); | 45 | TDA18271_MAIN_PLL, force); |
| 46 | } | 46 | } |
| 47 | 47 | ||
| 48 | static inline void tda18271_set_if_notch(struct dvb_frontend *fe) | ||
| 49 | { | ||
| 50 | struct tda18271_priv *priv = fe->tuner_priv; | ||
| 51 | unsigned char *regs = priv->tda18271_regs; | ||
| 52 | |||
| 53 | switch (priv->mode) { | ||
| 54 | case TDA18271_ANALOG: | ||
| 55 | regs[R_MPD] &= ~0x80; /* IF notch = 0 */ | ||
| 56 | break; | ||
| 57 | case TDA18271_DIGITAL: | ||
| 58 | regs[R_MPD] |= 0x80; /* IF notch = 1 */ | ||
| 59 | break; | ||
| 60 | } | ||
| 61 | } | ||
| 62 | |||
| 48 | static int tda18271_channel_configuration(struct dvb_frontend *fe, | 63 | static int tda18271_channel_configuration(struct dvb_frontend *fe, |
| 49 | struct tda18271_std_map_item *map, | 64 | struct tda18271_std_map_item *map, |
| 50 | u32 freq, u32 bw) | 65 | u32 freq, u32 bw) |
| @@ -60,25 +75,18 @@ static int tda18271_channel_configuration(struct dvb_frontend *fe, | |||
| 60 | regs[R_EP3] &= ~0x1f; /* clear std bits */ | 75 | regs[R_EP3] &= ~0x1f; /* clear std bits */ |
| 61 | regs[R_EP3] |= (map->agc_mode << 3) | map->std; | 76 | regs[R_EP3] |= (map->agc_mode << 3) | map->std; |
| 62 | 77 | ||
| 63 | /* set rfagc to high speed mode */ | 78 | if (priv->id == TDA18271HDC2) { |
| 64 | regs[R_EP3] &= ~0x04; | 79 | /* set rfagc to high speed mode */ |
| 80 | regs[R_EP3] &= ~0x04; | ||
| 81 | } | ||
| 65 | 82 | ||
| 66 | /* set cal mode to normal */ | 83 | /* set cal mode to normal */ |
| 67 | regs[R_EP4] &= ~0x03; | 84 | regs[R_EP4] &= ~0x03; |
| 68 | 85 | ||
| 69 | /* update IF output level & IF notch frequency */ | 86 | /* update IF output level */ |
| 70 | regs[R_EP4] &= ~0x1c; /* clear if level bits */ | 87 | regs[R_EP4] &= ~0x1c; /* clear if level bits */ |
| 71 | regs[R_EP4] |= (map->if_lvl << 2); | 88 | regs[R_EP4] |= (map->if_lvl << 2); |
| 72 | 89 | ||
| 73 | switch (priv->mode) { | ||
| 74 | case TDA18271_ANALOG: | ||
| 75 | regs[R_MPD] &= ~0x80; /* IF notch = 0 */ | ||
| 76 | break; | ||
| 77 | case TDA18271_DIGITAL: | ||
| 78 | regs[R_MPD] |= 0x80; /* IF notch = 1 */ | ||
| 79 | break; | ||
| 80 | } | ||
| 81 | |||
| 82 | /* update FM_RFn */ | 90 | /* update FM_RFn */ |
| 83 | regs[R_EP4] &= ~0x80; | 91 | regs[R_EP4] &= ~0x80; |
| 84 | regs[R_EP4] |= map->fm_rfn << 7; | 92 | regs[R_EP4] |= map->fm_rfn << 7; |
| @@ -95,6 +103,9 @@ static int tda18271_channel_configuration(struct dvb_frontend *fe, | |||
| 95 | /* disable Power Level Indicator */ | 103 | /* disable Power Level Indicator */ |
| 96 | regs[R_EP1] |= 0x40; | 104 | regs[R_EP1] |= 0x40; |
| 97 | 105 | ||
| 106 | /* make sure thermometer is off */ | ||
| 107 | regs[R_TM] &= ~0x10; | ||
| 108 | |||
| 98 | /* frequency dependent parameters */ | 109 | /* frequency dependent parameters */ |
| 99 | 110 | ||
| 100 | tda18271_calc_ir_measure(fe, &freq); | 111 | tda18271_calc_ir_measure(fe, &freq); |
| @@ -135,6 +146,7 @@ static int tda18271_channel_configuration(struct dvb_frontend *fe, | |||
| 135 | switch (priv->role) { | 146 | switch (priv->role) { |
| 136 | case TDA18271_MASTER: | 147 | case TDA18271_MASTER: |
| 137 | tda18271_calc_main_pll(fe, N); | 148 | tda18271_calc_main_pll(fe, N); |
| 149 | tda18271_set_if_notch(fe); | ||
| 138 | tda18271_write_regs(fe, R_MPD, 4); | 150 | tda18271_write_regs(fe, R_MPD, 4); |
| 139 | break; | 151 | break; |
| 140 | case TDA18271_SLAVE: | 152 | case TDA18271_SLAVE: |
| @@ -142,6 +154,7 @@ static int tda18271_channel_configuration(struct dvb_frontend *fe, | |||
| 142 | tda18271_write_regs(fe, R_CPD, 4); | 154 | tda18271_write_regs(fe, R_CPD, 4); |
| 143 | 155 | ||
| 144 | regs[R_MPD] = regs[R_CPD] & 0x7f; | 156 | regs[R_MPD] = regs[R_CPD] & 0x7f; |
| 157 | tda18271_set_if_notch(fe); | ||
| 145 | tda18271_write_regs(fe, R_MPD, 1); | 158 | tda18271_write_regs(fe, R_MPD, 1); |
| 146 | break; | 159 | break; |
| 147 | } | 160 | } |
| @@ -160,12 +173,14 @@ static int tda18271_channel_configuration(struct dvb_frontend *fe, | |||
| 160 | 173 | ||
| 161 | msleep(20); | 174 | msleep(20); |
| 162 | 175 | ||
| 163 | /* set rfagc to normal speed mode */ | 176 | if (priv->id == TDA18271HDC2) { |
| 164 | if (map->fm_rfn) | 177 | /* set rfagc to normal speed mode */ |
| 165 | regs[R_EP3] &= ~0x04; | 178 | if (map->fm_rfn) |
| 166 | else | 179 | regs[R_EP3] &= ~0x04; |
| 167 | regs[R_EP3] |= 0x04; | 180 | else |
| 168 | ret = tda18271_write_regs(fe, R_EP3, 1); | 181 | regs[R_EP3] |= 0x04; |
| 182 | ret = tda18271_write_regs(fe, R_EP3, 1); | ||
| 183 | } | ||
| 169 | fail: | 184 | fail: |
| 170 | return ret; | 185 | return ret; |
| 171 | } | 186 | } |
| @@ -507,7 +522,7 @@ static int tda18271_powerscan_init(struct dvb_frontend *fe) | |||
| 507 | /* set cal mode to normal */ | 522 | /* set cal mode to normal */ |
| 508 | regs[R_EP4] &= ~0x03; | 523 | regs[R_EP4] &= ~0x03; |
| 509 | 524 | ||
| 510 | /* update IF output level & IF notch frequency */ | 525 | /* update IF output level */ |
| 511 | regs[R_EP4] &= ~0x1c; /* clear if level bits */ | 526 | regs[R_EP4] &= ~0x1c; /* clear if level bits */ |
| 512 | 527 | ||
| 513 | ret = tda18271_write_regs(fe, R_EP3, 2); | 528 | ret = tda18271_write_regs(fe, R_EP3, 2); |
diff --git a/drivers/media/common/tuners/xc5000.c b/drivers/media/common/tuners/xc5000.c index ceae6db901ec..7cf4f5bdb2ec 100644 --- a/drivers/media/common/tuners/xc5000.c +++ b/drivers/media/common/tuners/xc5000.c | |||
| @@ -177,6 +177,7 @@ static XC_TV_STANDARD XC5000_Standard[MAX_TV_STANDARD] = { | |||
| 177 | {"FM Radio-INPUT1", 0x0208, 0x9002} | 177 | {"FM Radio-INPUT1", 0x0208, 0x9002} |
| 178 | }; | 178 | }; |
| 179 | 179 | ||
| 180 | static int xc5000_is_firmware_loaded(struct dvb_frontend *fe); | ||
| 180 | static int xc5000_writeregs(struct xc5000_priv *priv, u8 *buf, u8 len); | 181 | static int xc5000_writeregs(struct xc5000_priv *priv, u8 *buf, u8 len); |
| 181 | static int xc5000_readregs(struct xc5000_priv *priv, u8 *buf, u8 len); | 182 | static int xc5000_readregs(struct xc5000_priv *priv, u8 *buf, u8 len); |
| 182 | static void xc5000_TunerReset(struct dvb_frontend *fe); | 183 | static void xc5000_TunerReset(struct dvb_frontend *fe); |
| @@ -352,7 +353,7 @@ static int xc_SetTVStandard(struct xc5000_priv *priv, | |||
| 352 | 353 | ||
| 353 | static int xc_shutdown(struct xc5000_priv *priv) | 354 | static int xc_shutdown(struct xc5000_priv *priv) |
| 354 | { | 355 | { |
| 355 | return 0; | 356 | return XC_RESULT_SUCCESS; |
| 356 | /* Fixme: cannot bring tuner back alive once shutdown | 357 | /* Fixme: cannot bring tuner back alive once shutdown |
| 357 | * without reloading the driver modules. | 358 | * without reloading the driver modules. |
| 358 | * return xc_write_reg(priv, XREG_POWER_DOWN, 0); | 359 | * return xc_write_reg(priv, XREG_POWER_DOWN, 0); |
| @@ -685,6 +686,25 @@ static int xc5000_set_params(struct dvb_frontend *fe, | |||
| 685 | return 0; | 686 | return 0; |
| 686 | } | 687 | } |
| 687 | 688 | ||
| 689 | static int xc5000_is_firmware_loaded(struct dvb_frontend *fe) | ||
| 690 | { | ||
| 691 | struct xc5000_priv *priv = fe->tuner_priv; | ||
| 692 | int ret; | ||
| 693 | u16 id; | ||
| 694 | |||
| 695 | ret = xc5000_readreg(priv, XREG_PRODUCT_ID, &id); | ||
| 696 | if (ret == XC_RESULT_SUCCESS) { | ||
| 697 | if (id == XC_PRODUCT_ID_FW_NOT_LOADED) | ||
| 698 | ret = XC_RESULT_RESET_FAILURE; | ||
| 699 | else | ||
| 700 | ret = XC_RESULT_SUCCESS; | ||
| 701 | } | ||
| 702 | |||
| 703 | dprintk(1, "%s() returns %s id = 0x%x\n", __func__, | ||
| 704 | ret == XC_RESULT_SUCCESS ? "True" : "False", id); | ||
| 705 | return ret; | ||
| 706 | } | ||
| 707 | |||
| 688 | static int xc_load_fw_and_init_tuner(struct dvb_frontend *fe); | 708 | static int xc_load_fw_and_init_tuner(struct dvb_frontend *fe); |
| 689 | 709 | ||
| 690 | static int xc5000_set_analog_params(struct dvb_frontend *fe, | 710 | static int xc5000_set_analog_params(struct dvb_frontend *fe, |
| @@ -693,7 +713,7 @@ static int xc5000_set_analog_params(struct dvb_frontend *fe, | |||
| 693 | struct xc5000_priv *priv = fe->tuner_priv; | 713 | struct xc5000_priv *priv = fe->tuner_priv; |
| 694 | int ret; | 714 | int ret; |
| 695 | 715 | ||
| 696 | if(priv->fwloaded == 0) | 716 | if (xc5000_is_firmware_loaded(fe) != XC_RESULT_SUCCESS) |
| 697 | xc_load_fw_and_init_tuner(fe); | 717 | xc_load_fw_and_init_tuner(fe); |
| 698 | 718 | ||
| 699 | dprintk(1, "%s() frequency=%d (in units of 62.5khz)\n", | 719 | dprintk(1, "%s() frequency=%d (in units of 62.5khz)\n", |
| @@ -808,11 +828,10 @@ static int xc_load_fw_and_init_tuner(struct dvb_frontend *fe) | |||
| 808 | struct xc5000_priv *priv = fe->tuner_priv; | 828 | struct xc5000_priv *priv = fe->tuner_priv; |
| 809 | int ret = 0; | 829 | int ret = 0; |
| 810 | 830 | ||
| 811 | if (priv->fwloaded == 0) { | 831 | if (xc5000_is_firmware_loaded(fe) != XC_RESULT_SUCCESS) { |
| 812 | ret = xc5000_fwupload(fe); | 832 | ret = xc5000_fwupload(fe); |
| 813 | if (ret != XC_RESULT_SUCCESS) | 833 | if (ret != XC_RESULT_SUCCESS) |
| 814 | return ret; | 834 | return ret; |
| 815 | priv->fwloaded = 1; | ||
| 816 | } | 835 | } |
| 817 | 836 | ||
| 818 | /* Start the tuner self-calibration process */ | 837 | /* Start the tuner self-calibration process */ |
| @@ -852,7 +871,6 @@ static int xc5000_sleep(struct dvb_frontend *fe) | |||
| 852 | return -EREMOTEIO; | 871 | return -EREMOTEIO; |
| 853 | } | 872 | } |
| 854 | else { | 873 | else { |
| 855 | /* priv->fwloaded = 0; */ | ||
| 856 | return XC_RESULT_SUCCESS; | 874 | return XC_RESULT_SUCCESS; |
| 857 | } | 875 | } |
| 858 | } | 876 | } |
| @@ -933,7 +951,6 @@ struct dvb_frontend *xc5000_attach(struct dvb_frontend *fe, | |||
| 933 | cfg->i2c_address); | 951 | cfg->i2c_address); |
| 934 | printk(KERN_INFO | 952 | printk(KERN_INFO |
| 935 | "xc5000: Firmware has been loaded previously\n"); | 953 | "xc5000: Firmware has been loaded previously\n"); |
| 936 | priv->fwloaded = 1; | ||
| 937 | break; | 954 | break; |
| 938 | case XC_PRODUCT_ID_FW_NOT_LOADED: | 955 | case XC_PRODUCT_ID_FW_NOT_LOADED: |
| 939 | printk(KERN_INFO | 956 | printk(KERN_INFO |
| @@ -941,7 +958,6 @@ struct dvb_frontend *xc5000_attach(struct dvb_frontend *fe, | |||
| 941 | cfg->i2c_address); | 958 | cfg->i2c_address); |
| 942 | printk(KERN_INFO | 959 | printk(KERN_INFO |
| 943 | "xc5000: Firmware has not been loaded previously\n"); | 960 | "xc5000: Firmware has not been loaded previously\n"); |
| 944 | priv->fwloaded = 0; | ||
| 945 | break; | 961 | break; |
| 946 | default: | 962 | default: |
| 947 | printk(KERN_ERR | 963 | printk(KERN_ERR |
diff --git a/drivers/media/common/tuners/xc5000_priv.h b/drivers/media/common/tuners/xc5000_priv.h index ecebfe4745ad..a72a9887fe7f 100644 --- a/drivers/media/common/tuners/xc5000_priv.h +++ b/drivers/media/common/tuners/xc5000_priv.h | |||
| @@ -30,7 +30,6 @@ struct xc5000_priv { | |||
| 30 | u32 bandwidth; | 30 | u32 bandwidth; |
| 31 | u8 video_standard; | 31 | u8 video_standard; |
| 32 | u8 rf_mode; | 32 | u8 rf_mode; |
| 33 | u8 fwloaded; | ||
| 34 | 33 | ||
| 35 | void *devptr; | 34 | void *devptr; |
| 36 | }; | 35 | }; |
diff --git a/drivers/media/dvb/dvb-usb/gl861.c b/drivers/media/dvb/dvb-usb/gl861.c index 0a8ac64a4e33..037f7ffb47b2 100644 --- a/drivers/media/dvb/dvb-usb/gl861.c +++ b/drivers/media/dvb/dvb-usb/gl861.c | |||
| @@ -47,6 +47,8 @@ static int gl861_i2c_msg(struct dvb_usb_device *d, u8 addr, | |||
| 47 | return -EINVAL; | 47 | return -EINVAL; |
| 48 | } | 48 | } |
| 49 | 49 | ||
| 50 | msleep(1); /* avoid I2C errors */ | ||
| 51 | |||
| 50 | return usb_control_msg(d->udev, usb_rcvctrlpipe(d->udev, 0), req, type, | 52 | return usb_control_msg(d->udev, usb_rcvctrlpipe(d->udev, 0), req, type, |
| 51 | value, index, rbuf, rlen, 2000); | 53 | value, index, rbuf, rlen, 2000); |
| 52 | } | 54 | } |
| @@ -92,16 +94,6 @@ static struct i2c_algorithm gl861_i2c_algo = { | |||
| 92 | }; | 94 | }; |
| 93 | 95 | ||
| 94 | /* Callbacks for DVB USB */ | 96 | /* Callbacks for DVB USB */ |
| 95 | static int gl861_identify_state(struct usb_device *udev, | ||
| 96 | struct dvb_usb_device_properties *props, | ||
| 97 | struct dvb_usb_device_description **desc, | ||
| 98 | int *cold) | ||
| 99 | { | ||
| 100 | *cold = 0; | ||
| 101 | |||
| 102 | return 0; | ||
| 103 | } | ||
| 104 | |||
| 105 | static struct zl10353_config gl861_zl10353_config = { | 97 | static struct zl10353_config gl861_zl10353_config = { |
| 106 | .demod_address = 0x0f, | 98 | .demod_address = 0x0f, |
| 107 | .no_tuner = 1, | 99 | .no_tuner = 1, |
| @@ -172,7 +164,6 @@ static struct dvb_usb_device_properties gl861_properties = { | |||
| 172 | 164 | ||
| 173 | .size_of_priv = 0, | 165 | .size_of_priv = 0, |
| 174 | 166 | ||
| 175 | .identify_state = gl861_identify_state, | ||
| 176 | .num_adapters = 1, | 167 | .num_adapters = 1, |
| 177 | .adapter = {{ | 168 | .adapter = {{ |
| 178 | 169 | ||
| @@ -194,13 +185,15 @@ static struct dvb_usb_device_properties gl861_properties = { | |||
| 194 | 185 | ||
| 195 | .num_device_descs = 2, | 186 | .num_device_descs = 2, |
| 196 | .devices = { | 187 | .devices = { |
| 197 | { "MSI Mega Sky 55801 DVB-T USB2.0", | 188 | { |
| 198 | { &gl861_table[0], NULL }, | 189 | .name = "MSI Mega Sky 55801 DVB-T USB2.0", |
| 199 | { NULL }, | 190 | .cold_ids = { NULL }, |
| 191 | .warm_ids = { &gl861_table[0], NULL }, | ||
| 200 | }, | 192 | }, |
| 201 | { "A-LINK DTU DVB-T USB2.0", | 193 | { |
| 202 | { &gl861_table[1], NULL }, | 194 | .name = "A-LINK DTU DVB-T USB2.0", |
| 203 | { NULL }, | 195 | .cold_ids = { NULL }, |
| 196 | .warm_ids = { &gl861_table[1], NULL }, | ||
| 204 | }, | 197 | }, |
| 205 | } | 198 | } |
| 206 | }; | 199 | }; |
diff --git a/drivers/media/dvb/dvb-usb/umt-010.c b/drivers/media/dvb/dvb-usb/umt-010.c index 9e7653bb3b66..118aab1a3e54 100644 --- a/drivers/media/dvb/dvb-usb/umt-010.c +++ b/drivers/media/dvb/dvb-usb/umt-010.c | |||
| @@ -107,7 +107,7 @@ static struct dvb_usb_device_properties umt_properties = { | |||
| 107 | /* parameter for the MPEG2-data transfer */ | 107 | /* parameter for the MPEG2-data transfer */ |
| 108 | .stream = { | 108 | .stream = { |
| 109 | .type = USB_BULK, | 109 | .type = USB_BULK, |
| 110 | .count = 20, | 110 | .count = MAX_NO_URBS_FOR_DATA_STREAM, |
| 111 | .endpoint = 0x06, | 111 | .endpoint = 0x06, |
| 112 | .u = { | 112 | .u = { |
| 113 | .bulk = { | 113 | .bulk = { |
diff --git a/drivers/media/dvb/frontends/au8522.c b/drivers/media/dvb/frontends/au8522.c index 084a280c2d7f..03900d241a76 100644 --- a/drivers/media/dvb/frontends/au8522.c +++ b/drivers/media/dvb/frontends/au8522.c | |||
| @@ -463,10 +463,13 @@ static int au8522_set_frontend(struct dvb_frontend *fe, | |||
| 463 | struct dvb_frontend_parameters *p) | 463 | struct dvb_frontend_parameters *p) |
| 464 | { | 464 | { |
| 465 | struct au8522_state *state = fe->demodulator_priv; | 465 | struct au8522_state *state = fe->demodulator_priv; |
| 466 | int ret = -EINVAL; | ||
| 466 | 467 | ||
| 467 | dprintk("%s(frequency=%d)\n", __func__, p->frequency); | 468 | dprintk("%s(frequency=%d)\n", __func__, p->frequency); |
| 468 | 469 | ||
| 469 | state->current_frequency = p->frequency; | 470 | if ((state->current_frequency == p->frequency) && |
| 471 | (state->current_modulation == p->u.vsb.modulation)) | ||
| 472 | return 0; | ||
| 470 | 473 | ||
| 471 | au8522_enable_modulation(fe, p->u.vsb.modulation); | 474 | au8522_enable_modulation(fe, p->u.vsb.modulation); |
| 472 | 475 | ||
| @@ -476,11 +479,16 @@ static int au8522_set_frontend(struct dvb_frontend *fe, | |||
| 476 | if (fe->ops.tuner_ops.set_params) { | 479 | if (fe->ops.tuner_ops.set_params) { |
| 477 | if (fe->ops.i2c_gate_ctrl) | 480 | if (fe->ops.i2c_gate_ctrl) |
| 478 | fe->ops.i2c_gate_ctrl(fe, 1); | 481 | fe->ops.i2c_gate_ctrl(fe, 1); |
| 479 | fe->ops.tuner_ops.set_params(fe, p); | 482 | ret = fe->ops.tuner_ops.set_params(fe, p); |
| 480 | if (fe->ops.i2c_gate_ctrl) | 483 | if (fe->ops.i2c_gate_ctrl) |
| 481 | fe->ops.i2c_gate_ctrl(fe, 0); | 484 | fe->ops.i2c_gate_ctrl(fe, 0); |
| 482 | } | 485 | } |
| 483 | 486 | ||
| 487 | if (ret < 0) | ||
| 488 | return ret; | ||
| 489 | |||
| 490 | state->current_frequency = p->frequency; | ||
| 491 | |||
| 484 | return 0; | 492 | return 0; |
| 485 | } | 493 | } |
| 486 | 494 | ||
| @@ -498,6 +506,16 @@ static int au8522_init(struct dvb_frontend *fe) | |||
| 498 | return 0; | 506 | return 0; |
| 499 | } | 507 | } |
| 500 | 508 | ||
| 509 | static int au8522_sleep(struct dvb_frontend *fe) | ||
| 510 | { | ||
| 511 | struct au8522_state *state = fe->demodulator_priv; | ||
| 512 | dprintk("%s()\n", __func__); | ||
| 513 | |||
| 514 | state->current_frequency = 0; | ||
| 515 | |||
| 516 | return 0; | ||
| 517 | } | ||
| 518 | |||
| 501 | static int au8522_read_status(struct dvb_frontend *fe, fe_status_t *status) | 519 | static int au8522_read_status(struct dvb_frontend *fe, fe_status_t *status) |
| 502 | { | 520 | { |
| 503 | struct au8522_state *state = fe->demodulator_priv; | 521 | struct au8522_state *state = fe->demodulator_priv; |
| @@ -509,10 +527,8 @@ static int au8522_read_status(struct dvb_frontend *fe, fe_status_t *status) | |||
| 509 | if (state->current_modulation == VSB_8) { | 527 | if (state->current_modulation == VSB_8) { |
| 510 | dprintk("%s() Checking VSB_8\n", __func__); | 528 | dprintk("%s() Checking VSB_8\n", __func__); |
| 511 | reg = au8522_readreg(state, 0x4088); | 529 | reg = au8522_readreg(state, 0x4088); |
| 512 | if (reg & 0x01) | 530 | if ((reg & 0x03) == 0x03) |
| 513 | *status |= FE_HAS_VITERBI; | 531 | *status |= FE_HAS_LOCK | FE_HAS_SYNC | FE_HAS_VITERBI; |
| 514 | if (reg & 0x02) | ||
| 515 | *status |= FE_HAS_LOCK | FE_HAS_SYNC; | ||
| 516 | } else { | 532 | } else { |
| 517 | dprintk("%s() Checking QAM\n", __func__); | 533 | dprintk("%s() Checking QAM\n", __func__); |
| 518 | reg = au8522_readreg(state, 0x4541); | 534 | reg = au8522_readreg(state, 0x4541); |
| @@ -672,6 +688,7 @@ static struct dvb_frontend_ops au8522_ops = { | |||
| 672 | }, | 688 | }, |
| 673 | 689 | ||
| 674 | .init = au8522_init, | 690 | .init = au8522_init, |
| 691 | .sleep = au8522_sleep, | ||
| 675 | .i2c_gate_ctrl = au8522_i2c_gate_ctrl, | 692 | .i2c_gate_ctrl = au8522_i2c_gate_ctrl, |
| 676 | .set_frontend = au8522_set_frontend, | 693 | .set_frontend = au8522_set_frontend, |
| 677 | .get_frontend = au8522_get_frontend, | 694 | .get_frontend = au8522_get_frontend, |
diff --git a/drivers/media/dvb/frontends/stv0299.c b/drivers/media/dvb/frontends/stv0299.c index 17556183e871..35435bef8e79 100644 --- a/drivers/media/dvb/frontends/stv0299.c +++ b/drivers/media/dvb/frontends/stv0299.c | |||
| @@ -63,6 +63,7 @@ struct stv0299_state { | |||
| 63 | u32 symbol_rate; | 63 | u32 symbol_rate; |
| 64 | fe_code_rate_t fec_inner; | 64 | fe_code_rate_t fec_inner; |
| 65 | int errmode; | 65 | int errmode; |
| 66 | u32 ucblocks; | ||
| 66 | }; | 67 | }; |
| 67 | 68 | ||
| 68 | #define STATUS_BER 0 | 69 | #define STATUS_BER 0 |
| @@ -501,8 +502,10 @@ static int stv0299_read_ber(struct dvb_frontend* fe, u32* ber) | |||
| 501 | { | 502 | { |
| 502 | struct stv0299_state* state = fe->demodulator_priv; | 503 | struct stv0299_state* state = fe->demodulator_priv; |
| 503 | 504 | ||
| 504 | if (state->errmode != STATUS_BER) return 0; | 505 | if (state->errmode != STATUS_BER) |
| 505 | *ber = (stv0299_readreg (state, 0x1d) << 8) | stv0299_readreg (state, 0x1e); | 506 | return -ENOSYS; |
| 507 | |||
| 508 | *ber = stv0299_readreg(state, 0x1e) | (stv0299_readreg(state, 0x1d) << 8); | ||
| 506 | 509 | ||
| 507 | return 0; | 510 | return 0; |
| 508 | } | 511 | } |
| @@ -540,8 +543,12 @@ static int stv0299_read_ucblocks(struct dvb_frontend* fe, u32* ucblocks) | |||
| 540 | { | 543 | { |
| 541 | struct stv0299_state* state = fe->demodulator_priv; | 544 | struct stv0299_state* state = fe->demodulator_priv; |
| 542 | 545 | ||
| 543 | if (state->errmode != STATUS_UCBLOCKS) *ucblocks = 0; | 546 | if (state->errmode != STATUS_UCBLOCKS) |
| 544 | else *ucblocks = (stv0299_readreg (state, 0x1d) << 8) | stv0299_readreg (state, 0x1e); | 547 | return -ENOSYS; |
| 548 | |||
| 549 | state->ucblocks += stv0299_readreg(state, 0x1e); | ||
| 550 | state->ucblocks += (stv0299_readreg(state, 0x1d) << 8); | ||
| 551 | *ucblocks = state->ucblocks; | ||
| 545 | 552 | ||
| 546 | return 0; | 553 | return 0; |
| 547 | } | 554 | } |
diff --git a/drivers/media/dvb/frontends/tda10023.c b/drivers/media/dvb/frontends/tda10023.c index 0727b80bc4d2..c6ff5b82ff80 100644 --- a/drivers/media/dvb/frontends/tda10023.c +++ b/drivers/media/dvb/frontends/tda10023.c | |||
| @@ -116,9 +116,12 @@ static u8 tda10023_readreg (struct tda10023_state* state, u8 reg) | |||
| 116 | int ret; | 116 | int ret; |
| 117 | 117 | ||
| 118 | ret = i2c_transfer (state->i2c, msg, 2); | 118 | ret = i2c_transfer (state->i2c, msg, 2); |
| 119 | if (ret != 2) | 119 | if (ret != 2) { |
| 120 | printk("DVB: TDA10023: %s: readreg error (ret == %i)\n", | 120 | int num = state->frontend.dvb ? state->frontend.dvb->num : -1; |
| 121 | __func__, ret); | 121 | printk(KERN_ERR "DVB: TDA10023(%d): %s: readreg error " |
| 122 | "(reg == 0x%02x, ret == %i)\n", | ||
| 123 | num, __func__, reg, ret); | ||
| 124 | } | ||
| 122 | return b1[0]; | 125 | return b1[0]; |
| 123 | } | 126 | } |
| 124 | 127 | ||
| @@ -129,11 +132,12 @@ static int tda10023_writereg (struct tda10023_state* state, u8 reg, u8 data) | |||
| 129 | int ret; | 132 | int ret; |
| 130 | 133 | ||
| 131 | ret = i2c_transfer (state->i2c, &msg, 1); | 134 | ret = i2c_transfer (state->i2c, &msg, 1); |
| 132 | if (ret != 1) | 135 | if (ret != 1) { |
| 133 | printk("DVB: TDA10023(%d): %s, writereg error " | 136 | int num = state->frontend.dvb ? state->frontend.dvb->num : -1; |
| 137 | printk(KERN_ERR "DVB: TDA10023(%d): %s, writereg error " | ||
| 134 | "(reg == 0x%02x, val == 0x%02x, ret == %i)\n", | 138 | "(reg == 0x%02x, val == 0x%02x, ret == %i)\n", |
| 135 | state->frontend.dvb->num, __func__, reg, data, ret); | 139 | num, __func__, reg, data, ret); |
| 136 | 140 | } | |
| 137 | return (ret != 1) ? -EREMOTEIO : 0; | 141 | return (ret != 1) ? -EREMOTEIO : 0; |
| 138 | } | 142 | } |
| 139 | 143 | ||
| @@ -464,7 +468,7 @@ struct dvb_frontend* tda10023_attach(const struct tda1002x_config* config, | |||
| 464 | int i; | 468 | int i; |
| 465 | 469 | ||
| 466 | /* allocate memory for the internal state */ | 470 | /* allocate memory for the internal state */ |
| 467 | state = kmalloc(sizeof(struct tda10023_state), GFP_KERNEL); | 471 | state = kzalloc(sizeof(struct tda10023_state), GFP_KERNEL); |
| 468 | if (state == NULL) goto error; | 472 | if (state == NULL) goto error; |
| 469 | 473 | ||
| 470 | /* setup the state */ | 474 | /* setup the state */ |
diff --git a/drivers/media/dvb/frontends/tda1004x.c b/drivers/media/dvb/frontends/tda1004x.c index 49973846373e..a0d638653567 100644 --- a/drivers/media/dvb/frontends/tda1004x.c +++ b/drivers/media/dvb/frontends/tda1004x.c | |||
| @@ -1248,11 +1248,14 @@ struct dvb_frontend* tda10045_attach(const struct tda1004x_config* config, | |||
| 1248 | struct i2c_adapter* i2c) | 1248 | struct i2c_adapter* i2c) |
| 1249 | { | 1249 | { |
| 1250 | struct tda1004x_state *state; | 1250 | struct tda1004x_state *state; |
| 1251 | int id; | ||
| 1251 | 1252 | ||
| 1252 | /* allocate memory for the internal state */ | 1253 | /* allocate memory for the internal state */ |
| 1253 | state = kmalloc(sizeof(struct tda1004x_state), GFP_KERNEL); | 1254 | state = kmalloc(sizeof(struct tda1004x_state), GFP_KERNEL); |
| 1254 | if (!state) | 1255 | if (!state) { |
| 1256 | printk(KERN_ERR "Can't alocate memory for tda10045 state\n"); | ||
| 1255 | return NULL; | 1257 | return NULL; |
| 1258 | } | ||
| 1256 | 1259 | ||
| 1257 | /* setup the state */ | 1260 | /* setup the state */ |
| 1258 | state->config = config; | 1261 | state->config = config; |
| @@ -1260,7 +1263,15 @@ struct dvb_frontend* tda10045_attach(const struct tda1004x_config* config, | |||
| 1260 | state->demod_type = TDA1004X_DEMOD_TDA10045; | 1263 | state->demod_type = TDA1004X_DEMOD_TDA10045; |
| 1261 | 1264 | ||
| 1262 | /* check if the demod is there */ | 1265 | /* check if the demod is there */ |
| 1263 | if (tda1004x_read_byte(state, TDA1004X_CHIPID) != 0x25) { | 1266 | id = tda1004x_read_byte(state, TDA1004X_CHIPID); |
| 1267 | if (id < 0) { | ||
| 1268 | printk(KERN_ERR "tda10045: chip is not answering. Giving up.\n"); | ||
| 1269 | kfree(state); | ||
| 1270 | return NULL; | ||
| 1271 | } | ||
| 1272 | |||
| 1273 | if (id != 0x25) { | ||
| 1274 | printk(KERN_ERR "Invalid tda1004x ID = 0x%02x. Can't proceed\n", id); | ||
| 1264 | kfree(state); | 1275 | kfree(state); |
| 1265 | return NULL; | 1276 | return NULL; |
| 1266 | } | 1277 | } |
| @@ -1307,11 +1318,14 @@ struct dvb_frontend* tda10046_attach(const struct tda1004x_config* config, | |||
| 1307 | struct i2c_adapter* i2c) | 1318 | struct i2c_adapter* i2c) |
| 1308 | { | 1319 | { |
| 1309 | struct tda1004x_state *state; | 1320 | struct tda1004x_state *state; |
| 1321 | int id; | ||
| 1310 | 1322 | ||
| 1311 | /* allocate memory for the internal state */ | 1323 | /* allocate memory for the internal state */ |
| 1312 | state = kmalloc(sizeof(struct tda1004x_state), GFP_KERNEL); | 1324 | state = kmalloc(sizeof(struct tda1004x_state), GFP_KERNEL); |
| 1313 | if (!state) | 1325 | if (!state) { |
| 1326 | printk(KERN_ERR "Can't alocate memory for tda10046 state\n"); | ||
| 1314 | return NULL; | 1327 | return NULL; |
| 1328 | } | ||
| 1315 | 1329 | ||
| 1316 | /* setup the state */ | 1330 | /* setup the state */ |
| 1317 | state->config = config; | 1331 | state->config = config; |
| @@ -1319,7 +1333,14 @@ struct dvb_frontend* tda10046_attach(const struct tda1004x_config* config, | |||
| 1319 | state->demod_type = TDA1004X_DEMOD_TDA10046; | 1333 | state->demod_type = TDA1004X_DEMOD_TDA10046; |
| 1320 | 1334 | ||
| 1321 | /* check if the demod is there */ | 1335 | /* check if the demod is there */ |
| 1322 | if (tda1004x_read_byte(state, TDA1004X_CHIPID) != 0x46) { | 1336 | id = tda1004x_read_byte(state, TDA1004X_CHIPID); |
| 1337 | if (id < 0) { | ||
| 1338 | printk(KERN_ERR "tda10046: chip is not answering. Giving up.\n"); | ||
| 1339 | kfree(state); | ||
| 1340 | return NULL; | ||
| 1341 | } | ||
| 1342 | if (id != 0x46) { | ||
| 1343 | printk(KERN_ERR "Invalid tda1004x ID = 0x%02x. Can't proceed\n", id); | ||
| 1323 | kfree(state); | 1344 | kfree(state); |
| 1324 | return NULL; | 1345 | return NULL; |
| 1325 | } | 1346 | } |
diff --git a/drivers/media/dvb/ttpci/Kconfig b/drivers/media/dvb/ttpci/Kconfig index d4339b1b3b68..07643e010093 100644 --- a/drivers/media/dvb/ttpci/Kconfig +++ b/drivers/media/dvb/ttpci/Kconfig | |||
| @@ -101,6 +101,7 @@ config DVB_BUDGET | |||
| 101 | config DVB_BUDGET_CI | 101 | config DVB_BUDGET_CI |
| 102 | tristate "Budget cards with onboard CI connector" | 102 | tristate "Budget cards with onboard CI connector" |
| 103 | depends on DVB_BUDGET_CORE && I2C | 103 | depends on DVB_BUDGET_CORE && I2C |
| 104 | depends on INPUT # due to IR | ||
| 104 | select DVB_STV0297 if !DVB_FE_CUSTOMISE | 105 | select DVB_STV0297 if !DVB_FE_CUSTOMISE |
| 105 | select DVB_STV0299 if !DVB_FE_CUSTOMISE | 106 | select DVB_STV0299 if !DVB_FE_CUSTOMISE |
| 106 | select DVB_TDA1004X if !DVB_FE_CUSTOMISE | 107 | select DVB_TDA1004X if !DVB_FE_CUSTOMISE |
diff --git a/drivers/media/dvb/ttpci/av7110_hw.c b/drivers/media/dvb/ttpci/av7110_hw.c index 9d81074b31df..3a3f5279e927 100644 --- a/drivers/media/dvb/ttpci/av7110_hw.c +++ b/drivers/media/dvb/ttpci/av7110_hw.c | |||
| @@ -427,6 +427,7 @@ static int __av7110_send_fw_cmd(struct av7110 *av7110, u16* buf, int length) | |||
| 427 | if (err) { | 427 | if (err) { |
| 428 | printk(KERN_ERR "%s: timeout waiting on busy %s QUEUE\n", | 428 | printk(KERN_ERR "%s: timeout waiting on busy %s QUEUE\n", |
| 429 | __func__, type); | 429 | __func__, type); |
| 430 | av7110->arm_errors++; | ||
| 430 | return -ETIMEDOUT; | 431 | return -ETIMEDOUT; |
| 431 | } | 432 | } |
| 432 | msleep(1); | 433 | msleep(1); |
| @@ -853,10 +854,8 @@ static osd_raw_window_t bpp2bit[8] = { | |||
| 853 | 854 | ||
| 854 | static inline int WaitUntilBmpLoaded(struct av7110 *av7110) | 855 | static inline int WaitUntilBmpLoaded(struct av7110 *av7110) |
| 855 | { | 856 | { |
| 856 | int ret = wait_event_interruptible_timeout(av7110->bmpq, | 857 | int ret = wait_event_timeout(av7110->bmpq, |
| 857 | av7110->bmp_state != BMP_LOADING, 10*HZ); | 858 | av7110->bmp_state != BMP_LOADING, 10*HZ); |
| 858 | if (ret == -ERESTARTSYS) | ||
| 859 | return ret; | ||
| 860 | if (ret == 0) { | 859 | if (ret == 0) { |
| 861 | printk("dvb-ttpci: warning: timeout waiting in LoadBitmap: %d, %d\n", | 860 | printk("dvb-ttpci: warning: timeout waiting in LoadBitmap: %d, %d\n", |
| 862 | ret, av7110->bmp_state); | 861 | ret, av7110->bmp_state); |
diff --git a/drivers/media/video/au0828/au0828-cards.c b/drivers/media/video/au0828/au0828-cards.c index a2a6983444fa..898e12395e7c 100644 --- a/drivers/media/video/au0828/au0828-cards.c +++ b/drivers/media/video/au0828/au0828-cards.c | |||
| @@ -77,8 +77,14 @@ static void hauppauge_eeprom(struct au0828_dev *dev, u8 *eeprom_data) | |||
| 77 | 77 | ||
| 78 | /* Make sure we support the board model */ | 78 | /* Make sure we support the board model */ |
| 79 | switch (tv.model) { | 79 | switch (tv.model) { |
| 80 | case 72000: /* WinTV-HVR950q (Retail, IR, ATSC/QAM */ | ||
| 80 | case 72001: /* WinTV-HVR950q (Retail, IR, ATSC/QAM and basic analog video */ | 81 | case 72001: /* WinTV-HVR950q (Retail, IR, ATSC/QAM and basic analog video */ |
| 82 | case 72211: /* WinTV-HVR950q (OEM, IR, ATSC/QAM and basic analog video */ | ||
| 83 | case 72221: /* WinTV-HVR950q (OEM, IR, ATSC/QAM and basic analog video */ | ||
| 84 | case 72231: /* WinTV-HVR950q (OEM, IR, ATSC/QAM and basic analog video */ | ||
| 85 | case 72241: /* WinTV-HVR950q (OEM, No IR, ATSC/QAM and basic analog video */ | ||
| 81 | case 72301: /* WinTV-HVR850 (Retail, IR, ATSC and basic analog video */ | 86 | case 72301: /* WinTV-HVR850 (Retail, IR, ATSC and basic analog video */ |
| 87 | case 72500: /* WinTV-HVR950q (OEM, No IR, ATSC/QAM */ | ||
| 82 | break; | 88 | break; |
| 83 | default: | 89 | default: |
| 84 | printk(KERN_WARNING "%s: warning: " | 90 | printk(KERN_WARNING "%s: warning: " |
| @@ -175,6 +181,18 @@ struct usb_device_id au0828_usb_id_table [] = { | |||
| 175 | .driver_info = AU0828_BOARD_HAUPPAUGE_HVR850 }, | 181 | .driver_info = AU0828_BOARD_HAUPPAUGE_HVR850 }, |
| 176 | { USB_DEVICE(0x0fe9, 0xd620), | 182 | { USB_DEVICE(0x0fe9, 0xd620), |
| 177 | .driver_info = AU0828_BOARD_DVICO_FUSIONHDTV7 }, | 183 | .driver_info = AU0828_BOARD_DVICO_FUSIONHDTV7 }, |
| 184 | { USB_DEVICE(0x2040, 0x7210), | ||
| 185 | .driver_info = AU0828_BOARD_HAUPPAUGE_HVR950Q }, | ||
| 186 | { USB_DEVICE(0x2040, 0x7217), | ||
| 187 | .driver_info = AU0828_BOARD_HAUPPAUGE_HVR950Q }, | ||
| 188 | { USB_DEVICE(0x2040, 0x721b), | ||
| 189 | .driver_info = AU0828_BOARD_HAUPPAUGE_HVR950Q }, | ||
| 190 | { USB_DEVICE(0x2040, 0x721f), | ||
| 191 | .driver_info = AU0828_BOARD_HAUPPAUGE_HVR950Q }, | ||
| 192 | { USB_DEVICE(0x2040, 0x7280), | ||
| 193 | .driver_info = AU0828_BOARD_HAUPPAUGE_HVR950Q }, | ||
| 194 | { USB_DEVICE(0x0fd9, 0x0008), | ||
| 195 | .driver_info = AU0828_BOARD_HAUPPAUGE_HVR950Q }, | ||
| 178 | { }, | 196 | { }, |
| 179 | }; | 197 | }; |
| 180 | 198 | ||
diff --git a/drivers/media/video/cx18/Kconfig b/drivers/media/video/cx18/Kconfig index 5f942690570c..9aefdc5ea79a 100644 --- a/drivers/media/video/cx18/Kconfig +++ b/drivers/media/video/cx18/Kconfig | |||
| @@ -10,8 +10,8 @@ config VIDEO_CX18 | |||
| 10 | select VIDEO_TVEEPROM | 10 | select VIDEO_TVEEPROM |
| 11 | select VIDEO_CX2341X | 11 | select VIDEO_CX2341X |
| 12 | select VIDEO_CS5345 | 12 | select VIDEO_CS5345 |
| 13 | select DVB_S5H1409 | 13 | select DVB_S5H1409 if !DVB_FE_CUSTOMISE |
| 14 | select MEDIA_TUNER_MXL5005S | 14 | select MEDIA_TUNER_MXL5005S if !DVB_FE_CUSTOMISE |
| 15 | ---help--- | 15 | ---help--- |
| 16 | This is a video4linux driver for Conexant cx23418 based | 16 | This is a video4linux driver for Conexant cx23418 based |
| 17 | PCI combo video recorder devices. | 17 | PCI combo video recorder devices. |
diff --git a/drivers/media/video/cx18/cx18-av-core.c b/drivers/media/video/cx18/cx18-av-core.c index 9a26751615c6..faca43eb940f 100644 --- a/drivers/media/video/cx18/cx18-av-core.c +++ b/drivers/media/video/cx18/cx18-av-core.c | |||
| @@ -69,6 +69,58 @@ int cx18_av_and_or4(struct cx18 *cx, u16 addr, u32 and_mask, | |||
| 69 | or_value); | 69 | or_value); |
| 70 | } | 70 | } |
| 71 | 71 | ||
| 72 | int cx18_av_write_no_acfg(struct cx18 *cx, u16 addr, u8 value, int no_acfg_mask) | ||
| 73 | { | ||
| 74 | int retval; | ||
| 75 | u32 saved_reg[8] = {0}; | ||
| 76 | |||
| 77 | if (no_acfg_mask & CXADEC_NO_ACFG_AFE) { | ||
| 78 | saved_reg[0] = cx18_av_read4(cx, CXADEC_CHIP_CTRL); | ||
| 79 | saved_reg[1] = cx18_av_read4(cx, CXADEC_AFE_CTRL); | ||
| 80 | } | ||
| 81 | |||
| 82 | if (no_acfg_mask & CXADEC_NO_ACFG_PLL) { | ||
| 83 | saved_reg[2] = cx18_av_read4(cx, CXADEC_PLL_CTRL1); | ||
| 84 | saved_reg[3] = cx18_av_read4(cx, CXADEC_VID_PLL_FRAC); | ||
| 85 | } | ||
| 86 | |||
| 87 | if (no_acfg_mask & CXADEC_NO_ACFG_VID) { | ||
| 88 | saved_reg[4] = cx18_av_read4(cx, CXADEC_HORIZ_TIM_CTRL); | ||
| 89 | saved_reg[5] = cx18_av_read4(cx, CXADEC_VERT_TIM_CTRL); | ||
| 90 | saved_reg[6] = cx18_av_read4(cx, CXADEC_SRC_COMB_CFG); | ||
| 91 | saved_reg[7] = cx18_av_read4(cx, CXADEC_CHROMA_VBIOFF_CFG); | ||
| 92 | } | ||
| 93 | |||
| 94 | retval = cx18_av_write(cx, addr, value); | ||
| 95 | |||
| 96 | if (no_acfg_mask & CXADEC_NO_ACFG_AFE) { | ||
| 97 | cx18_av_write4(cx, CXADEC_CHIP_CTRL, saved_reg[0]); | ||
| 98 | cx18_av_write4(cx, CXADEC_AFE_CTRL, saved_reg[1]); | ||
| 99 | } | ||
| 100 | |||
| 101 | if (no_acfg_mask & CXADEC_NO_ACFG_PLL) { | ||
| 102 | cx18_av_write4(cx, CXADEC_PLL_CTRL1, saved_reg[2]); | ||
| 103 | cx18_av_write4(cx, CXADEC_VID_PLL_FRAC, saved_reg[3]); | ||
| 104 | } | ||
| 105 | |||
| 106 | if (no_acfg_mask & CXADEC_NO_ACFG_VID) { | ||
| 107 | cx18_av_write4(cx, CXADEC_HORIZ_TIM_CTRL, saved_reg[4]); | ||
| 108 | cx18_av_write4(cx, CXADEC_VERT_TIM_CTRL, saved_reg[5]); | ||
| 109 | cx18_av_write4(cx, CXADEC_SRC_COMB_CFG, saved_reg[6]); | ||
| 110 | cx18_av_write4(cx, CXADEC_CHROMA_VBIOFF_CFG, saved_reg[7]); | ||
| 111 | } | ||
| 112 | |||
| 113 | return retval; | ||
| 114 | } | ||
| 115 | |||
| 116 | int cx18_av_and_or_no_acfg(struct cx18 *cx, u16 addr, unsigned and_mask, | ||
| 117 | u8 or_value, int no_acfg_mask) | ||
| 118 | { | ||
| 119 | return cx18_av_write_no_acfg(cx, addr, | ||
| 120 | (cx18_av_read(cx, addr) & and_mask) | | ||
| 121 | or_value, no_acfg_mask); | ||
| 122 | } | ||
| 123 | |||
| 72 | /* ----------------------------------------------------------------------- */ | 124 | /* ----------------------------------------------------------------------- */ |
| 73 | 125 | ||
| 74 | static int set_input(struct cx18 *cx, enum cx18_av_video_input vid_input, | 126 | static int set_input(struct cx18 *cx, enum cx18_av_video_input vid_input, |
| @@ -170,13 +222,15 @@ static void input_change(struct cx18 *cx) | |||
| 170 | 222 | ||
| 171 | /* Follow step 8c and 8d of section 3.16 in the cx18_av datasheet */ | 223 | /* Follow step 8c and 8d of section 3.16 in the cx18_av datasheet */ |
| 172 | if (std & V4L2_STD_SECAM) | 224 | if (std & V4L2_STD_SECAM) |
| 173 | cx18_av_write(cx, 0x402, 0); | 225 | cx18_av_write_no_acfg(cx, 0x402, 0, CXADEC_NO_ACFG_ALL); |
| 174 | else { | 226 | else { |
| 175 | cx18_av_write(cx, 0x402, 0x04); | 227 | cx18_av_write_no_acfg(cx, 0x402, 0x04, CXADEC_NO_ACFG_ALL); |
| 176 | cx18_av_write(cx, 0x49f, (std & V4L2_STD_NTSC) ? 0x14 : 0x11); | 228 | cx18_av_write(cx, 0x49f, (std & V4L2_STD_NTSC) ? 0x14 : 0x11); |
| 177 | } | 229 | } |
| 178 | cx18_av_and_or(cx, 0x401, ~0x60, 0); | 230 | cx18_av_and_or_no_acfg(cx, 0x401, ~0x60, 0, |
| 179 | cx18_av_and_or(cx, 0x401, ~0x60, 0x60); | 231 | CXADEC_NO_ACFG_PLL | CXADEC_NO_ACFG_VID); |
| 232 | cx18_av_and_or_no_acfg(cx, 0x401, ~0x60, 0x60, | ||
| 233 | CXADEC_NO_ACFG_PLL | CXADEC_NO_ACFG_VID); | ||
| 180 | 234 | ||
| 181 | if (std & V4L2_STD_525_60) { | 235 | if (std & V4L2_STD_525_60) { |
| 182 | if (std == V4L2_STD_NTSC_M_JP) { | 236 | if (std == V4L2_STD_NTSC_M_JP) { |
| @@ -228,7 +282,7 @@ static int set_input(struct cx18 *cx, enum cx18_av_video_input vid_input, | |||
| 228 | 282 | ||
| 229 | if ((vid_input & ~0xff0) || | 283 | if ((vid_input & ~0xff0) || |
| 230 | luma < CX18_AV_SVIDEO_LUMA1 || | 284 | luma < CX18_AV_SVIDEO_LUMA1 || |
| 231 | luma > CX18_AV_SVIDEO_LUMA4 || | 285 | luma > CX18_AV_SVIDEO_LUMA8 || |
| 232 | chroma < CX18_AV_SVIDEO_CHROMA4 || | 286 | chroma < CX18_AV_SVIDEO_CHROMA4 || |
| 233 | chroma > CX18_AV_SVIDEO_CHROMA8) { | 287 | chroma > CX18_AV_SVIDEO_CHROMA8) { |
| 234 | CX18_ERR("0x%04x is not a valid video input!\n", | 288 | CX18_ERR("0x%04x is not a valid video input!\n", |
| @@ -262,7 +316,8 @@ static int set_input(struct cx18 *cx, enum cx18_av_video_input vid_input, | |||
| 262 | 316 | ||
| 263 | cx18_av_write(cx, 0x103, reg); | 317 | cx18_av_write(cx, 0x103, reg); |
| 264 | /* Set INPUT_MODE to Composite (0) or S-Video (1) */ | 318 | /* Set INPUT_MODE to Composite (0) or S-Video (1) */ |
| 265 | cx18_av_and_or(cx, 0x401, ~0x6, is_composite ? 0 : 0x02); | 319 | cx18_av_and_or_no_acfg(cx, 0x401, ~0x6, is_composite ? 0 : 0x02, |
| 320 | CXADEC_NO_ACFG_PLL | CXADEC_NO_ACFG_VID); | ||
| 266 | /* Set CH_SEL_ADC2 to 1 if input comes from CH3 */ | 321 | /* Set CH_SEL_ADC2 to 1 if input comes from CH3 */ |
| 267 | cx18_av_and_or(cx, 0x102, ~0x2, (reg & 0x80) == 0 ? 2 : 0); | 322 | cx18_av_and_or(cx, 0x102, ~0x2, (reg & 0x80) == 0 ? 2 : 0); |
| 268 | /* Set DUAL_MODE_ADC2 to 1 if input comes from both CH2 and CH3 */ | 323 | /* Set DUAL_MODE_ADC2 to 1 if input comes from both CH2 and CH3 */ |
| @@ -318,12 +373,12 @@ static int set_v4lstd(struct cx18 *cx) | |||
| 318 | This happens for example with the Yuan MPC622. */ | 373 | This happens for example with the Yuan MPC622. */ |
| 319 | if (fmt >= 4 && fmt < 8) { | 374 | if (fmt >= 4 && fmt < 8) { |
| 320 | /* Set format to NTSC-M */ | 375 | /* Set format to NTSC-M */ |
| 321 | cx18_av_and_or(cx, 0x400, ~0xf, 1); | 376 | cx18_av_and_or_no_acfg(cx, 0x400, ~0xf, 1, CXADEC_NO_ACFG_AFE); |
| 322 | /* Turn off LCOMB */ | 377 | /* Turn off LCOMB */ |
| 323 | cx18_av_and_or(cx, 0x47b, ~6, 0); | 378 | cx18_av_and_or(cx, 0x47b, ~6, 0); |
| 324 | } | 379 | } |
| 325 | cx18_av_and_or(cx, 0x400, ~0xf, fmt); | 380 | cx18_av_and_or_no_acfg(cx, 0x400, ~0xf, fmt, CXADEC_NO_ACFG_AFE); |
| 326 | cx18_av_and_or(cx, 0x403, ~0x3, pal_m); | 381 | cx18_av_and_or_no_acfg(cx, 0x403, ~0x3, pal_m, CXADEC_NO_ACFG_ALL); |
| 327 | cx18_av_vbi_setup(cx); | 382 | cx18_av_vbi_setup(cx); |
| 328 | input_change(cx); | 383 | input_change(cx); |
| 329 | return 0; | 384 | return 0; |
diff --git a/drivers/media/video/cx18/cx18-av-core.h b/drivers/media/video/cx18/cx18-av-core.h index 786901d72e9a..c172823ce1d8 100644 --- a/drivers/media/video/cx18/cx18-av-core.h +++ b/drivers/media/video/cx18/cx18-av-core.h | |||
| @@ -37,12 +37,16 @@ enum cx18_av_video_input { | |||
| 37 | CX18_AV_COMPOSITE7, | 37 | CX18_AV_COMPOSITE7, |
| 38 | CX18_AV_COMPOSITE8, | 38 | CX18_AV_COMPOSITE8, |
| 39 | 39 | ||
| 40 | /* S-Video inputs consist of one luma input (In1-In4) ORed with one | 40 | /* S-Video inputs consist of one luma input (In1-In8) ORed with one |
| 41 | chroma input (In5-In8) */ | 41 | chroma input (In5-In8) */ |
| 42 | CX18_AV_SVIDEO_LUMA1 = 0x10, | 42 | CX18_AV_SVIDEO_LUMA1 = 0x10, |
| 43 | CX18_AV_SVIDEO_LUMA2 = 0x20, | 43 | CX18_AV_SVIDEO_LUMA2 = 0x20, |
| 44 | CX18_AV_SVIDEO_LUMA3 = 0x30, | 44 | CX18_AV_SVIDEO_LUMA3 = 0x30, |
| 45 | CX18_AV_SVIDEO_LUMA4 = 0x40, | 45 | CX18_AV_SVIDEO_LUMA4 = 0x40, |
| 46 | CX18_AV_SVIDEO_LUMA5 = 0x50, | ||
| 47 | CX18_AV_SVIDEO_LUMA6 = 0x60, | ||
| 48 | CX18_AV_SVIDEO_LUMA7 = 0x70, | ||
| 49 | CX18_AV_SVIDEO_LUMA8 = 0x80, | ||
| 46 | CX18_AV_SVIDEO_CHROMA4 = 0x400, | 50 | CX18_AV_SVIDEO_CHROMA4 = 0x400, |
| 47 | CX18_AV_SVIDEO_CHROMA5 = 0x500, | 51 | CX18_AV_SVIDEO_CHROMA5 = 0x500, |
| 48 | CX18_AV_SVIDEO_CHROMA6 = 0x600, | 52 | CX18_AV_SVIDEO_CHROMA6 = 0x600, |
| @@ -291,14 +295,24 @@ struct cx18_av_state { | |||
| 291 | #define CXADEC_SELECT_AUDIO_STANDARD_FM 0xF9 /* FM radio */ | 295 | #define CXADEC_SELECT_AUDIO_STANDARD_FM 0xF9 /* FM radio */ |
| 292 | #define CXADEC_SELECT_AUDIO_STANDARD_AUTO 0xFF /* Auto detect */ | 296 | #define CXADEC_SELECT_AUDIO_STANDARD_AUTO 0xFF /* Auto detect */ |
| 293 | 297 | ||
| 298 | /* Flags on what to preserve on write to 0x400-0x403 with cx18_av_.*_no_acfg()*/ | ||
| 299 | #define CXADEC_NO_ACFG_AFE 0x01 /* Preserve 0x100-0x107 */ | ||
| 300 | #define CXADEC_NO_ACFG_PLL 0x02 /* Preserve 0x108-0x10f */ | ||
| 301 | #define CXADEC_NO_ACFG_VID 0x04 /* Preserve 0x470-0x47f */ | ||
| 302 | #define CXADEC_NO_ACFG_ALL 0x07 | ||
| 303 | |||
| 294 | /* ----------------------------------------------------------------------- */ | 304 | /* ----------------------------------------------------------------------- */ |
| 295 | /* cx18_av-core.c */ | 305 | /* cx18_av-core.c */ |
| 296 | int cx18_av_write(struct cx18 *cx, u16 addr, u8 value); | 306 | int cx18_av_write(struct cx18 *cx, u16 addr, u8 value); |
| 297 | int cx18_av_write4(struct cx18 *cx, u16 addr, u32 value); | 307 | int cx18_av_write4(struct cx18 *cx, u16 addr, u32 value); |
| 308 | int cx18_av_write_no_acfg(struct cx18 *cx, u16 addr, u8 value, | ||
| 309 | int no_acfg_mask); | ||
| 298 | u8 cx18_av_read(struct cx18 *cx, u16 addr); | 310 | u8 cx18_av_read(struct cx18 *cx, u16 addr); |
| 299 | u32 cx18_av_read4(struct cx18 *cx, u16 addr); | 311 | u32 cx18_av_read4(struct cx18 *cx, u16 addr); |
| 300 | int cx18_av_and_or(struct cx18 *cx, u16 addr, unsigned mask, u8 value); | 312 | int cx18_av_and_or(struct cx18 *cx, u16 addr, unsigned mask, u8 value); |
| 301 | int cx18_av_and_or4(struct cx18 *cx, u16 addr, u32 mask, u32 value); | 313 | int cx18_av_and_or4(struct cx18 *cx, u16 addr, u32 mask, u32 value); |
| 314 | int cx18_av_and_or_no_acfg(struct cx18 *cx, u16 addr, unsigned mask, u8 value, | ||
| 315 | int no_acfg_mask); | ||
| 302 | int cx18_av_cmd(struct cx18 *cx, unsigned int cmd, void *arg); | 316 | int cx18_av_cmd(struct cx18 *cx, unsigned int cmd, void *arg); |
| 303 | 317 | ||
| 304 | /* ----------------------------------------------------------------------- */ | 318 | /* ----------------------------------------------------------------------- */ |
diff --git a/drivers/media/video/cx18/cx18-cards.c b/drivers/media/video/cx18/cx18-cards.c index baccd079243d..c26e0ef5b075 100644 --- a/drivers/media/video/cx18/cx18-cards.c +++ b/drivers/media/video/cx18/cx18-cards.c | |||
| @@ -23,6 +23,7 @@ | |||
| 23 | 23 | ||
| 24 | #include "cx18-driver.h" | 24 | #include "cx18-driver.h" |
| 25 | #include "cx18-cards.h" | 25 | #include "cx18-cards.h" |
| 26 | #include "cx18-av-core.h" | ||
| 26 | #include "cx18-i2c.h" | 27 | #include "cx18-i2c.h" |
| 27 | #include <media/cs5345.h> | 28 | #include <media/cs5345.h> |
| 28 | 29 | ||
| @@ -54,22 +55,22 @@ static const struct cx18_card cx18_card_hvr1600_esmt = { | |||
| 54 | .hw_all = CX18_HW_TVEEPROM | CX18_HW_TUNER | | 55 | .hw_all = CX18_HW_TVEEPROM | CX18_HW_TUNER | |
| 55 | CX18_HW_CS5345 | CX18_HW_DVB, | 56 | CX18_HW_CS5345 | CX18_HW_DVB, |
| 56 | .video_inputs = { | 57 | .video_inputs = { |
| 57 | { CX18_CARD_INPUT_VID_TUNER, 0, CX23418_COMPOSITE7 }, | 58 | { CX18_CARD_INPUT_VID_TUNER, 0, CX18_AV_COMPOSITE7 }, |
| 58 | { CX18_CARD_INPUT_SVIDEO1, 1, CX23418_SVIDEO1 }, | 59 | { CX18_CARD_INPUT_SVIDEO1, 1, CX18_AV_SVIDEO1 }, |
| 59 | { CX18_CARD_INPUT_COMPOSITE1, 1, CX23418_COMPOSITE3 }, | 60 | { CX18_CARD_INPUT_COMPOSITE1, 1, CX18_AV_COMPOSITE3 }, |
| 60 | { CX18_CARD_INPUT_SVIDEO2, 2, CX23418_SVIDEO2 }, | 61 | { CX18_CARD_INPUT_SVIDEO2, 2, CX18_AV_SVIDEO2 }, |
| 61 | { CX18_CARD_INPUT_COMPOSITE2, 2, CX23418_COMPOSITE4 }, | 62 | { CX18_CARD_INPUT_COMPOSITE2, 2, CX18_AV_COMPOSITE4 }, |
| 62 | }, | 63 | }, |
| 63 | .audio_inputs = { | 64 | .audio_inputs = { |
| 64 | { CX18_CARD_INPUT_AUD_TUNER, | 65 | { CX18_CARD_INPUT_AUD_TUNER, |
| 65 | CX23418_AUDIO8, CS5345_IN_1 | CS5345_MCLK_1_5 }, | 66 | CX18_AV_AUDIO8, CS5345_IN_1 | CS5345_MCLK_1_5 }, |
| 66 | { CX18_CARD_INPUT_LINE_IN1, | 67 | { CX18_CARD_INPUT_LINE_IN1, |
| 67 | CX23418_AUDIO_SERIAL, CS5345_IN_2 }, | 68 | CX18_AV_AUDIO_SERIAL, CS5345_IN_2 }, |
| 68 | { CX18_CARD_INPUT_LINE_IN2, | 69 | { CX18_CARD_INPUT_LINE_IN2, |
| 69 | CX23418_AUDIO_SERIAL, CS5345_IN_2 }, | 70 | CX18_AV_AUDIO_SERIAL, CS5345_IN_3 }, |
| 70 | }, | 71 | }, |
| 71 | .radio_input = { CX18_CARD_INPUT_AUD_TUNER, | 72 | .radio_input = { CX18_CARD_INPUT_AUD_TUNER, |
| 72 | CX23418_AUDIO_SERIAL, 0 }, | 73 | CX18_AV_AUDIO_SERIAL, CS5345_IN_4 }, |
| 73 | .ddr = { | 74 | .ddr = { |
| 74 | /* ESMT M13S128324A-5B memory */ | 75 | /* ESMT M13S128324A-5B memory */ |
| 75 | .chip_config = 0x003, | 76 | .chip_config = 0x003, |
| @@ -81,6 +82,11 @@ static const struct cx18_card cx18_card_hvr1600_esmt = { | |||
| 81 | }, | 82 | }, |
| 82 | .gpio_init.initial_value = 0x3001, | 83 | .gpio_init.initial_value = 0x3001, |
| 83 | .gpio_init.direction = 0x3001, | 84 | .gpio_init.direction = 0x3001, |
| 85 | .gpio_i2c_slave_reset = { | ||
| 86 | .active_lo_mask = 0x3001, | ||
| 87 | .msecs_asserted = 10, | ||
| 88 | .msecs_recovery = 40, | ||
| 89 | }, | ||
| 84 | .i2c = &cx18_i2c_std, | 90 | .i2c = &cx18_i2c_std, |
| 85 | }; | 91 | }; |
| 86 | 92 | ||
| @@ -94,22 +100,22 @@ static const struct cx18_card cx18_card_hvr1600_samsung = { | |||
| 94 | .hw_all = CX18_HW_TVEEPROM | CX18_HW_TUNER | | 100 | .hw_all = CX18_HW_TVEEPROM | CX18_HW_TUNER | |
| 95 | CX18_HW_CS5345 | CX18_HW_DVB, | 101 | CX18_HW_CS5345 | CX18_HW_DVB, |
| 96 | .video_inputs = { | 102 | .video_inputs = { |
| 97 | { CX18_CARD_INPUT_VID_TUNER, 0, CX23418_COMPOSITE7 }, | 103 | { CX18_CARD_INPUT_VID_TUNER, 0, CX18_AV_COMPOSITE7 }, |
| 98 | { CX18_CARD_INPUT_SVIDEO1, 1, CX23418_SVIDEO1 }, | 104 | { CX18_CARD_INPUT_SVIDEO1, 1, CX18_AV_SVIDEO1 }, |
| 99 | { CX18_CARD_INPUT_COMPOSITE1, 1, CX23418_COMPOSITE3 }, | 105 | { CX18_CARD_INPUT_COMPOSITE1, 1, CX18_AV_COMPOSITE3 }, |
| 100 | { CX18_CARD_INPUT_SVIDEO2, 2, CX23418_SVIDEO2 }, | 106 | { CX18_CARD_INPUT_SVIDEO2, 2, CX18_AV_SVIDEO2 }, |
| 101 | { CX18_CARD_INPUT_COMPOSITE2, 2, CX23418_COMPOSITE4 }, | 107 | { CX18_CARD_INPUT_COMPOSITE2, 2, CX18_AV_COMPOSITE4 }, |
| 102 | }, | 108 | }, |
| 103 | .audio_inputs = { | 109 | .audio_inputs = { |
| 104 | { CX18_CARD_INPUT_AUD_TUNER, | 110 | { CX18_CARD_INPUT_AUD_TUNER, |
| 105 | CX23418_AUDIO8, CS5345_IN_1 | CS5345_MCLK_1_5 }, | 111 | CX18_AV_AUDIO8, CS5345_IN_1 | CS5345_MCLK_1_5 }, |
| 106 | { CX18_CARD_INPUT_LINE_IN1, | 112 | { CX18_CARD_INPUT_LINE_IN1, |
| 107 | CX23418_AUDIO_SERIAL, CS5345_IN_2 }, | 113 | CX18_AV_AUDIO_SERIAL, CS5345_IN_2 }, |
| 108 | { CX18_CARD_INPUT_LINE_IN2, | 114 | { CX18_CARD_INPUT_LINE_IN2, |
| 109 | CX23418_AUDIO_SERIAL, CS5345_IN_2 }, | 115 | CX18_AV_AUDIO_SERIAL, CS5345_IN_3 }, |
| 110 | }, | 116 | }, |
| 111 | .radio_input = { CX18_CARD_INPUT_AUD_TUNER, | 117 | .radio_input = { CX18_CARD_INPUT_AUD_TUNER, |
| 112 | CX23418_AUDIO_SERIAL, 0 }, | 118 | CX18_AV_AUDIO_SERIAL, CS5345_IN_4 }, |
| 113 | .ddr = { | 119 | .ddr = { |
| 114 | /* Samsung K4D263238G-VC33 memory */ | 120 | /* Samsung K4D263238G-VC33 memory */ |
| 115 | .chip_config = 0x003, | 121 | .chip_config = 0x003, |
| @@ -121,6 +127,11 @@ static const struct cx18_card cx18_card_hvr1600_samsung = { | |||
| 121 | }, | 127 | }, |
| 122 | .gpio_init.initial_value = 0x3001, | 128 | .gpio_init.initial_value = 0x3001, |
| 123 | .gpio_init.direction = 0x3001, | 129 | .gpio_init.direction = 0x3001, |
| 130 | .gpio_i2c_slave_reset = { | ||
| 131 | .active_lo_mask = 0x3001, | ||
| 132 | .msecs_asserted = 10, | ||
| 133 | .msecs_recovery = 40, | ||
| 134 | }, | ||
| 124 | .i2c = &cx18_i2c_std, | 135 | .i2c = &cx18_i2c_std, |
| 125 | }; | 136 | }; |
| 126 | 137 | ||
| @@ -141,19 +152,19 @@ static const struct cx18_card cx18_card_h900 = { | |||
| 141 | .hw_audio_ctrl = CX18_HW_CX23418, | 152 | .hw_audio_ctrl = CX18_HW_CX23418, |
| 142 | .hw_all = CX18_HW_TUNER, | 153 | .hw_all = CX18_HW_TUNER, |
| 143 | .video_inputs = { | 154 | .video_inputs = { |
| 144 | { CX18_CARD_INPUT_VID_TUNER, 0, CX23418_COMPOSITE2 }, | 155 | { CX18_CARD_INPUT_VID_TUNER, 0, CX18_AV_COMPOSITE2 }, |
| 145 | { CX18_CARD_INPUT_SVIDEO1, 1, | 156 | { CX18_CARD_INPUT_SVIDEO1, 1, |
| 146 | CX23418_SVIDEO_LUMA3 | CX23418_SVIDEO_CHROMA4 }, | 157 | CX18_AV_SVIDEO_LUMA3 | CX18_AV_SVIDEO_CHROMA4 }, |
| 147 | { CX18_CARD_INPUT_COMPOSITE1, 1, CX23418_COMPOSITE1 }, | 158 | { CX18_CARD_INPUT_COMPOSITE1, 1, CX18_AV_COMPOSITE1 }, |
| 148 | }, | 159 | }, |
| 149 | .audio_inputs = { | 160 | .audio_inputs = { |
| 150 | { CX18_CARD_INPUT_AUD_TUNER, | 161 | { CX18_CARD_INPUT_AUD_TUNER, |
| 151 | CX23418_AUDIO8, 0 }, | 162 | CX18_AV_AUDIO8, 0 }, |
| 152 | { CX18_CARD_INPUT_LINE_IN1, | 163 | { CX18_CARD_INPUT_LINE_IN1, |
| 153 | CX23418_AUDIO_SERIAL, 0 }, | 164 | CX18_AV_AUDIO_SERIAL, 0 }, |
| 154 | }, | 165 | }, |
| 155 | .radio_input = { CX18_CARD_INPUT_AUD_TUNER, | 166 | .radio_input = { CX18_CARD_INPUT_AUD_TUNER, |
| 156 | CX23418_AUDIO_SERIAL, 0 }, | 167 | CX18_AV_AUDIO_SERIAL, 0 }, |
| 157 | .tuners = { | 168 | .tuners = { |
| 158 | { .std = V4L2_STD_ALL, .tuner = TUNER_XC2028 }, | 169 | { .std = V4L2_STD_ALL, .tuner = TUNER_XC2028 }, |
| 159 | }, | 170 | }, |
| @@ -183,23 +194,26 @@ static const struct cx18_card_pci_info cx18_pci_mpc718[] = { | |||
| 183 | static const struct cx18_card cx18_card_mpc718 = { | 194 | static const struct cx18_card cx18_card_mpc718 = { |
| 184 | .type = CX18_CARD_YUAN_MPC718, | 195 | .type = CX18_CARD_YUAN_MPC718, |
| 185 | .name = "Yuan MPC718", | 196 | .name = "Yuan MPC718", |
| 186 | .comment = "Not yet supported!\n", | 197 | .comment = "Some Composite and S-Video inputs are currently working.\n", |
| 187 | .v4l2_capabilities = 0, | 198 | .v4l2_capabilities = CX18_CAP_ENCODER, |
| 188 | .hw_audio_ctrl = CX18_HW_CX23418, | 199 | .hw_audio_ctrl = CX18_HW_CX23418, |
| 189 | .hw_all = CX18_HW_TUNER, | 200 | .hw_all = CX18_HW_TUNER, |
| 190 | .video_inputs = { | 201 | .video_inputs = { |
| 191 | { CX18_CARD_INPUT_VID_TUNER, 0, CX23418_COMPOSITE7 }, | 202 | { CX18_CARD_INPUT_VID_TUNER, 0, CX18_AV_COMPOSITE2 }, |
| 192 | { CX18_CARD_INPUT_SVIDEO1, 1, CX23418_SVIDEO1 }, | 203 | { CX18_CARD_INPUT_SVIDEO1, 1, |
| 193 | { CX18_CARD_INPUT_COMPOSITE1, 1, CX23418_COMPOSITE3 }, | 204 | CX18_AV_SVIDEO_LUMA3 | CX18_AV_SVIDEO_CHROMA4 }, |
| 205 | { CX18_CARD_INPUT_COMPOSITE1, 1, CX18_AV_COMPOSITE1 }, | ||
| 206 | { CX18_CARD_INPUT_SVIDEO2, 2, | ||
| 207 | CX18_AV_SVIDEO_LUMA7 | CX18_AV_SVIDEO_CHROMA8 }, | ||
| 208 | { CX18_CARD_INPUT_COMPOSITE2, 2, CX18_AV_COMPOSITE6 }, | ||
| 209 | { CX18_CARD_INPUT_COMPOSITE3, 2, CX18_AV_COMPOSITE3 }, | ||
| 194 | }, | 210 | }, |
| 195 | .audio_inputs = { | 211 | .audio_inputs = { |
| 196 | { CX18_CARD_INPUT_AUD_TUNER, | 212 | { CX18_CARD_INPUT_AUD_TUNER, CX18_AV_AUDIO5, 0 }, |
| 197 | CX23418_AUDIO8, 0 }, | 213 | { CX18_CARD_INPUT_LINE_IN1, CX18_AV_AUDIO_SERIAL, 0 }, |
| 198 | { CX18_CARD_INPUT_LINE_IN1, | 214 | { CX18_CARD_INPUT_LINE_IN2, CX18_AV_AUDIO_SERIAL, 0 }, |
| 199 | CX23418_AUDIO_SERIAL, 0 }, | ||
| 200 | }, | 215 | }, |
| 201 | .radio_input = { CX18_CARD_INPUT_AUD_TUNER, | 216 | .radio_input = { CX18_CARD_INPUT_AUD_TUNER, CX18_AV_AUDIO_SERIAL, 0 }, |
| 202 | CX23418_AUDIO_SERIAL, 0 }, | ||
| 203 | .tuners = { | 217 | .tuners = { |
| 204 | /* XC3028 tuner */ | 218 | /* XC3028 tuner */ |
| 205 | { .std = V4L2_STD_ALL, .tuner = TUNER_XC2028 }, | 219 | { .std = V4L2_STD_ALL, .tuner = TUNER_XC2028 }, |
diff --git a/drivers/media/video/cx18/cx18-cards.h b/drivers/media/video/cx18/cx18-cards.h index bccb67f0db16..dc2dd945d4c3 100644 --- a/drivers/media/video/cx18/cx18-cards.h +++ b/drivers/media/video/cx18/cx18-cards.h | |||
| @@ -36,36 +36,6 @@ | |||
| 36 | #define CX18_CARD_INPUT_COMPOSITE2 5 | 36 | #define CX18_CARD_INPUT_COMPOSITE2 5 |
| 37 | #define CX18_CARD_INPUT_COMPOSITE3 6 | 37 | #define CX18_CARD_INPUT_COMPOSITE3 6 |
| 38 | 38 | ||
| 39 | enum cx34180_video_input { | ||
| 40 | /* Composite video inputs In1-In8 */ | ||
| 41 | CX23418_COMPOSITE1 = 1, | ||
| 42 | CX23418_COMPOSITE2, | ||
| 43 | CX23418_COMPOSITE3, | ||
| 44 | CX23418_COMPOSITE4, | ||
| 45 | CX23418_COMPOSITE5, | ||
| 46 | CX23418_COMPOSITE6, | ||
| 47 | CX23418_COMPOSITE7, | ||
| 48 | CX23418_COMPOSITE8, | ||
| 49 | |||
| 50 | /* S-Video inputs consist of one luma input (In1-In4) ORed with one | ||
| 51 | chroma input (In5-In8) */ | ||
| 52 | CX23418_SVIDEO_LUMA1 = 0x10, | ||
| 53 | CX23418_SVIDEO_LUMA2 = 0x20, | ||
| 54 | CX23418_SVIDEO_LUMA3 = 0x30, | ||
| 55 | CX23418_SVIDEO_LUMA4 = 0x40, | ||
| 56 | CX23418_SVIDEO_CHROMA4 = 0x400, | ||
| 57 | CX23418_SVIDEO_CHROMA5 = 0x500, | ||
| 58 | CX23418_SVIDEO_CHROMA6 = 0x600, | ||
| 59 | CX23418_SVIDEO_CHROMA7 = 0x700, | ||
| 60 | CX23418_SVIDEO_CHROMA8 = 0x800, | ||
| 61 | |||
| 62 | /* S-Video aliases for common luma/chroma combinations */ | ||
| 63 | CX23418_SVIDEO1 = 0x510, | ||
| 64 | CX23418_SVIDEO2 = 0x620, | ||
| 65 | CX23418_SVIDEO3 = 0x730, | ||
| 66 | CX23418_SVIDEO4 = 0x840, | ||
| 67 | }; | ||
| 68 | |||
| 69 | /* audio inputs */ | 39 | /* audio inputs */ |
| 70 | #define CX18_CARD_INPUT_AUD_TUNER 1 | 40 | #define CX18_CARD_INPUT_AUD_TUNER 1 |
| 71 | #define CX18_CARD_INPUT_LINE_IN1 2 | 41 | #define CX18_CARD_INPUT_LINE_IN1 2 |
| @@ -75,16 +45,6 @@ enum cx34180_video_input { | |||
| 75 | #define CX18_CARD_MAX_AUDIO_INPUTS 3 | 45 | #define CX18_CARD_MAX_AUDIO_INPUTS 3 |
| 76 | #define CX18_CARD_MAX_TUNERS 2 | 46 | #define CX18_CARD_MAX_TUNERS 2 |
| 77 | 47 | ||
| 78 | enum cx23418_audio_input { | ||
| 79 | /* Audio inputs: serial or In4-In8 */ | ||
| 80 | CX23418_AUDIO_SERIAL, | ||
| 81 | CX23418_AUDIO4 = 4, | ||
| 82 | CX23418_AUDIO5, | ||
| 83 | CX23418_AUDIO6, | ||
| 84 | CX23418_AUDIO7, | ||
| 85 | CX23418_AUDIO8, | ||
| 86 | }; | ||
| 87 | |||
| 88 | /* V4L2 capability aliases */ | 48 | /* V4L2 capability aliases */ |
| 89 | #define CX18_CAP_ENCODER (V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_TUNER | \ | 49 | #define CX18_CAP_ENCODER (V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_TUNER | \ |
| 90 | V4L2_CAP_AUDIO | V4L2_CAP_READWRITE) | 50 | V4L2_CAP_AUDIO | V4L2_CAP_READWRITE) |
| @@ -118,6 +78,13 @@ struct cx18_gpio_init { /* set initial GPIO DIR and OUT values */ | |||
| 118 | u32 initial_value; | 78 | u32 initial_value; |
| 119 | }; | 79 | }; |
| 120 | 80 | ||
| 81 | struct cx18_gpio_i2c_slave_reset { | ||
| 82 | u32 active_lo_mask; /* GPIO outputs that reset i2c chips when low */ | ||
| 83 | u32 active_hi_mask; /* GPIO outputs that reset i2c chips when high */ | ||
| 84 | int msecs_asserted; /* time period reset must remain asserted */ | ||
| 85 | int msecs_recovery; /* time after deassert for chips to be ready */ | ||
| 86 | }; | ||
| 87 | |||
| 121 | struct cx18_card_tuner { | 88 | struct cx18_card_tuner { |
| 122 | v4l2_std_id std; /* standard for which the tuner is suitable */ | 89 | v4l2_std_id std; /* standard for which the tuner is suitable */ |
| 123 | int tuner; /* tuner ID (from tuner.h) */ | 90 | int tuner; /* tuner ID (from tuner.h) */ |
| @@ -154,7 +121,8 @@ struct cx18_card { | |||
| 154 | 121 | ||
| 155 | /* GPIO card-specific settings */ | 122 | /* GPIO card-specific settings */ |
| 156 | u8 xceive_pin; /* XCeive tuner GPIO reset pin */ | 123 | u8 xceive_pin; /* XCeive tuner GPIO reset pin */ |
| 157 | struct cx18_gpio_init gpio_init; | 124 | struct cx18_gpio_init gpio_init; |
| 125 | struct cx18_gpio_i2c_slave_reset gpio_i2c_slave_reset; | ||
| 158 | 126 | ||
| 159 | struct cx18_card_tuner tuners[CX18_CARD_MAX_TUNERS]; | 127 | struct cx18_card_tuner tuners[CX18_CARD_MAX_TUNERS]; |
| 160 | struct cx18_card_tuner_i2c *i2c; | 128 | struct cx18_card_tuner_i2c *i2c; |
diff --git a/drivers/media/video/cx18/cx18-dvb.c b/drivers/media/video/cx18/cx18-dvb.c index c9744173f969..cae38985b131 100644 --- a/drivers/media/video/cx18/cx18-dvb.c +++ b/drivers/media/video/cx18/cx18-dvb.c | |||
| @@ -69,11 +69,21 @@ static int cx18_dvb_start_feed(struct dvb_demux_feed *feed) | |||
| 69 | struct dvb_demux *demux = feed->demux; | 69 | struct dvb_demux *demux = feed->demux; |
| 70 | struct cx18_stream *stream = (struct cx18_stream *) demux->priv; | 70 | struct cx18_stream *stream = (struct cx18_stream *) demux->priv; |
| 71 | struct cx18 *cx = stream->cx; | 71 | struct cx18 *cx = stream->cx; |
| 72 | int ret = -EINVAL; | 72 | int ret; |
| 73 | u32 v; | 73 | u32 v; |
| 74 | 74 | ||
| 75 | CX18_DEBUG_INFO("Start feed: pid = 0x%x index = %d\n", | 75 | CX18_DEBUG_INFO("Start feed: pid = 0x%x index = %d\n", |
| 76 | feed->pid, feed->index); | 76 | feed->pid, feed->index); |
| 77 | |||
| 78 | mutex_lock(&cx->serialize_lock); | ||
| 79 | ret = cx18_init_on_first_open(cx); | ||
| 80 | mutex_unlock(&cx->serialize_lock); | ||
| 81 | if (ret) { | ||
| 82 | CX18_ERR("Failed to initialize firmware starting DVB feed\n"); | ||
| 83 | return ret; | ||
| 84 | } | ||
| 85 | ret = -EINVAL; | ||
| 86 | |||
| 77 | switch (cx->card->type) { | 87 | switch (cx->card->type) { |
| 78 | case CX18_CARD_HVR_1600_ESMT: | 88 | case CX18_CARD_HVR_1600_ESMT: |
| 79 | case CX18_CARD_HVR_1600_SAMSUNG: | 89 | case CX18_CARD_HVR_1600_SAMSUNG: |
| @@ -101,6 +111,11 @@ static int cx18_dvb_start_feed(struct dvb_demux_feed *feed) | |||
| 101 | if (stream->dvb.feeding++ == 0) { | 111 | if (stream->dvb.feeding++ == 0) { |
| 102 | CX18_DEBUG_INFO("Starting Transport DMA\n"); | 112 | CX18_DEBUG_INFO("Starting Transport DMA\n"); |
| 103 | ret = cx18_start_v4l2_encode_stream(stream); | 113 | ret = cx18_start_v4l2_encode_stream(stream); |
| 114 | if (ret < 0) { | ||
| 115 | CX18_DEBUG_INFO( | ||
| 116 | "Failed to start Transport DMA\n"); | ||
| 117 | stream->dvb.feeding--; | ||
| 118 | } | ||
| 104 | } else | 119 | } else |
| 105 | ret = 0; | 120 | ret = 0; |
| 106 | mutex_unlock(&stream->dvb.feedlock); | 121 | mutex_unlock(&stream->dvb.feedlock); |
diff --git a/drivers/media/video/cx18/cx18-gpio.c b/drivers/media/video/cx18/cx18-gpio.c index ceb63653c926..b302833f6f9d 100644 --- a/drivers/media/video/cx18/cx18-gpio.c +++ b/drivers/media/video/cx18/cx18-gpio.c | |||
| @@ -53,10 +53,34 @@ static void gpio_write(struct cx18 *cx) | |||
| 53 | write_reg(((dir & 0xffff) << 16) | (val & 0xffff), | 53 | write_reg(((dir & 0xffff) << 16) | (val & 0xffff), |
| 54 | CX18_REG_GPIO_OUT1); | 54 | CX18_REG_GPIO_OUT1); |
| 55 | write_reg(dir & 0xffff0000, CX18_REG_GPIO_DIR2); | 55 | write_reg(dir & 0xffff0000, CX18_REG_GPIO_DIR2); |
| 56 | write_reg((dir & 0xffff0000) | ((val & 0xffff0000) >> 16), | 56 | write_reg_sync((dir & 0xffff0000) | ((val & 0xffff0000) >> 16), |
| 57 | CX18_REG_GPIO_OUT2); | 57 | CX18_REG_GPIO_OUT2); |
| 58 | } | 58 | } |
| 59 | 59 | ||
| 60 | void cx18_reset_i2c_slaves_gpio(struct cx18 *cx) | ||
| 61 | { | ||
| 62 | const struct cx18_gpio_i2c_slave_reset *p; | ||
| 63 | |||
| 64 | p = &cx->card->gpio_i2c_slave_reset; | ||
| 65 | |||
| 66 | if ((p->active_lo_mask | p->active_hi_mask) == 0) | ||
| 67 | return; | ||
| 68 | |||
| 69 | /* Assuming that the masks are a subset of the bits in gpio_dir */ | ||
| 70 | |||
| 71 | /* Assert */ | ||
| 72 | cx->gpio_val = | ||
| 73 | (cx->gpio_val | p->active_hi_mask) & ~(p->active_lo_mask); | ||
| 74 | gpio_write(cx); | ||
| 75 | schedule_timeout_uninterruptible(msecs_to_jiffies(p->msecs_asserted)); | ||
| 76 | |||
| 77 | /* Deassert */ | ||
| 78 | cx->gpio_val = | ||
| 79 | (cx->gpio_val | p->active_lo_mask) & ~(p->active_hi_mask); | ||
| 80 | gpio_write(cx); | ||
| 81 | schedule_timeout_uninterruptible(msecs_to_jiffies(p->msecs_recovery)); | ||
| 82 | } | ||
| 83 | |||
| 60 | void cx18_gpio_init(struct cx18 *cx) | 84 | void cx18_gpio_init(struct cx18 *cx) |
| 61 | { | 85 | { |
| 62 | cx->gpio_dir = cx->card->gpio_init.direction; | 86 | cx->gpio_dir = cx->card->gpio_init.direction; |
diff --git a/drivers/media/video/cx18/cx18-gpio.h b/drivers/media/video/cx18/cx18-gpio.h index 41bac8856b50..525c328f748a 100644 --- a/drivers/media/video/cx18/cx18-gpio.h +++ b/drivers/media/video/cx18/cx18-gpio.h | |||
| @@ -21,4 +21,5 @@ | |||
| 21 | */ | 21 | */ |
| 22 | 22 | ||
| 23 | void cx18_gpio_init(struct cx18 *cx); | 23 | void cx18_gpio_init(struct cx18 *cx); |
| 24 | void cx18_reset_i2c_slaves_gpio(struct cx18 *cx); | ||
| 24 | int cx18_reset_tuner_gpio(void *dev, int cmd, int value); | 25 | int cx18_reset_tuner_gpio(void *dev, int cmd, int value); |
diff --git a/drivers/media/video/cx18/cx18-i2c.c b/drivers/media/video/cx18/cx18-i2c.c index 1d6c51a75313..680bc4e35b79 100644 --- a/drivers/media/video/cx18/cx18-i2c.c +++ b/drivers/media/video/cx18/cx18-i2c.c | |||
| @@ -405,6 +405,8 @@ int init_cx18_i2c(struct cx18 *cx) | |||
| 405 | cx18_setscl(&cx->i2c_algo_cb_data[1], 1); | 405 | cx18_setscl(&cx->i2c_algo_cb_data[1], 1); |
| 406 | cx18_setsda(&cx->i2c_algo_cb_data[1], 1); | 406 | cx18_setsda(&cx->i2c_algo_cb_data[1], 1); |
| 407 | 407 | ||
| 408 | cx18_reset_i2c_slaves_gpio(cx); | ||
| 409 | |||
| 408 | return i2c_bit_add_bus(&cx->i2c_adap[0]) || | 410 | return i2c_bit_add_bus(&cx->i2c_adap[0]) || |
| 409 | i2c_bit_add_bus(&cx->i2c_adap[1]); | 411 | i2c_bit_add_bus(&cx->i2c_adap[1]); |
| 410 | } | 412 | } |
diff --git a/drivers/media/video/cx25840/cx25840-core.c b/drivers/media/video/cx25840/cx25840-core.c index 607efdcd22f8..1da6f134888d 100644 --- a/drivers/media/video/cx25840/cx25840-core.c +++ b/drivers/media/video/cx25840/cx25840-core.c | |||
| @@ -433,7 +433,7 @@ static int set_input(struct i2c_client *client, enum cx25840_video_input vid_inp | |||
| 433 | int chroma = vid_input & 0xf00; | 433 | int chroma = vid_input & 0xf00; |
| 434 | 434 | ||
| 435 | if ((vid_input & ~0xff0) || | 435 | if ((vid_input & ~0xff0) || |
| 436 | luma < CX25840_SVIDEO_LUMA1 || luma > CX25840_SVIDEO_LUMA4 || | 436 | luma < CX25840_SVIDEO_LUMA1 || luma > CX25840_SVIDEO_LUMA8 || |
| 437 | chroma < CX25840_SVIDEO_CHROMA4 || chroma > CX25840_SVIDEO_CHROMA8) { | 437 | chroma < CX25840_SVIDEO_CHROMA4 || chroma > CX25840_SVIDEO_CHROMA8) { |
| 438 | v4l_err(client, "0x%04x is not a valid video input!\n", | 438 | v4l_err(client, "0x%04x is not a valid video input!\n", |
| 439 | vid_input); | 439 | vid_input); |
diff --git a/drivers/media/video/cx88/cx88-alsa.c b/drivers/media/video/cx88/cx88-alsa.c index e976fc6bef7c..80c8883e54b5 100644 --- a/drivers/media/video/cx88/cx88-alsa.c +++ b/drivers/media/video/cx88/cx88-alsa.c | |||
| @@ -332,6 +332,12 @@ static int snd_cx88_pcm_open(struct snd_pcm_substream *substream) | |||
| 332 | struct snd_pcm_runtime *runtime = substream->runtime; | 332 | struct snd_pcm_runtime *runtime = substream->runtime; |
| 333 | int err; | 333 | int err; |
| 334 | 334 | ||
| 335 | if (!chip) { | ||
| 336 | printk(KERN_ERR "BUG: cx88 can't find device struct." | ||
| 337 | " Can't proceed with open\n"); | ||
| 338 | return -ENODEV; | ||
| 339 | } | ||
| 340 | |||
| 335 | err = snd_pcm_hw_constraint_pow2(runtime, 0, SNDRV_PCM_HW_PARAM_PERIODS); | 341 | err = snd_pcm_hw_constraint_pow2(runtime, 0, SNDRV_PCM_HW_PARAM_PERIODS); |
| 336 | if (err < 0) | 342 | if (err < 0) |
| 337 | goto _error; | 343 | goto _error; |
diff --git a/drivers/media/video/em28xx/em28xx-audio.c b/drivers/media/video/em28xx/em28xx-audio.c index 92b2a6db4fdc..3c006103c1eb 100644 --- a/drivers/media/video/em28xx/em28xx-audio.c +++ b/drivers/media/video/em28xx/em28xx-audio.c | |||
| @@ -268,6 +268,12 @@ static int snd_em28xx_capture_open(struct snd_pcm_substream *substream) | |||
| 268 | 268 | ||
| 269 | dprintk("opening device and trying to acquire exclusive lock\n"); | 269 | dprintk("opening device and trying to acquire exclusive lock\n"); |
| 270 | 270 | ||
| 271 | if (!dev) { | ||
| 272 | printk(KERN_ERR "BUG: em28xx can't find device struct." | ||
| 273 | " Can't proceed with open\n"); | ||
| 274 | return -ENODEV; | ||
| 275 | } | ||
| 276 | |||
| 271 | /* Sets volume, mute, etc */ | 277 | /* Sets volume, mute, etc */ |
| 272 | 278 | ||
| 273 | dev->mute = 0; | 279 | dev->mute = 0; |
| @@ -415,6 +421,12 @@ static int em28xx_audio_init(struct em28xx *dev) | |||
| 415 | static int devnr; | 421 | static int devnr; |
| 416 | int ret, err; | 422 | int ret, err; |
| 417 | 423 | ||
| 424 | if (dev->has_audio_class) { | ||
| 425 | /* This device does not support the extension (in this case | ||
| 426 | the device is expecting the snd-usb-audio module */ | ||
| 427 | return 0; | ||
| 428 | } | ||
| 429 | |||
| 418 | printk(KERN_INFO "em28xx-audio.c: probing for em28x1 " | 430 | printk(KERN_INFO "em28xx-audio.c: probing for em28x1 " |
| 419 | "non standard usbaudio\n"); | 431 | "non standard usbaudio\n"); |
| 420 | printk(KERN_INFO "em28xx-audio.c: Copyright (C) 2006 Markus " | 432 | printk(KERN_INFO "em28xx-audio.c: Copyright (C) 2006 Markus " |
| @@ -458,6 +470,12 @@ static int em28xx_audio_fini(struct em28xx *dev) | |||
| 458 | if (dev == NULL) | 470 | if (dev == NULL) |
| 459 | return 0; | 471 | return 0; |
| 460 | 472 | ||
| 473 | if (dev->has_audio_class) { | ||
| 474 | /* This device does not support the extension (in this case | ||
| 475 | the device is expecting the snd-usb-audio module */ | ||
| 476 | return 0; | ||
| 477 | } | ||
| 478 | |||
| 461 | if (dev->adev) { | 479 | if (dev->adev) { |
| 462 | snd_card_free(dev->adev->sndcard); | 480 | snd_card_free(dev->adev->sndcard); |
| 463 | kfree(dev->adev); | 481 | kfree(dev->adev); |
diff --git a/drivers/media/video/em28xx/em28xx-cards.c b/drivers/media/video/em28xx/em28xx-cards.c index 3e4f3c7e92e7..8cbda43727c3 100644 --- a/drivers/media/video/em28xx/em28xx-cards.c +++ b/drivers/media/video/em28xx/em28xx-cards.c | |||
| @@ -157,6 +157,7 @@ struct em28xx_board em28xx_boards[] = { | |||
| 157 | .tda9887_conf = TDA9887_PRESENT, | 157 | .tda9887_conf = TDA9887_PRESENT, |
| 158 | .tuner_type = TUNER_XC2028, | 158 | .tuner_type = TUNER_XC2028, |
| 159 | .mts_firmware = 1, | 159 | .mts_firmware = 1, |
| 160 | .has_dvb = 1, | ||
| 160 | .decoder = EM28XX_TVP5150, | 161 | .decoder = EM28XX_TVP5150, |
| 161 | .input = { { | 162 | .input = { { |
| 162 | .type = EM28XX_VMUX_TELEVISION, | 163 | .type = EM28XX_VMUX_TELEVISION, |
| @@ -524,6 +525,9 @@ void em28xx_pre_card_setup(struct em28xx *dev) | |||
| 524 | rc = em28xx_read_reg(dev, EM28XX_R0A_CHIPID); | 525 | rc = em28xx_read_reg(dev, EM28XX_R0A_CHIPID); |
| 525 | if (rc > 0) { | 526 | if (rc > 0) { |
| 526 | switch (rc) { | 527 | switch (rc) { |
| 528 | case CHIP_ID_EM2860: | ||
| 529 | em28xx_info("chip ID is em2860\n"); | ||
| 530 | break; | ||
| 527 | case CHIP_ID_EM2883: | 531 | case CHIP_ID_EM2883: |
| 528 | em28xx_info("chip ID is em2882/em2883\n"); | 532 | em28xx_info("chip ID is em2882/em2883\n"); |
| 529 | dev->wait_after_write = 0; | 533 | dev->wait_after_write = 0; |
diff --git a/drivers/media/video/em28xx/em28xx-dvb.c b/drivers/media/video/em28xx/em28xx-dvb.c index 8cf4983f0039..0b2333ee07f8 100644 --- a/drivers/media/video/em28xx/em28xx-dvb.c +++ b/drivers/media/video/em28xx/em28xx-dvb.c | |||
| @@ -382,6 +382,11 @@ static int dvb_init(struct em28xx *dev) | |||
| 382 | int result = 0; | 382 | int result = 0; |
| 383 | struct em28xx_dvb *dvb; | 383 | struct em28xx_dvb *dvb; |
| 384 | 384 | ||
| 385 | if (!dev->has_dvb) { | ||
| 386 | /* This device does not support the extension */ | ||
| 387 | return 0; | ||
| 388 | } | ||
| 389 | |||
| 385 | dvb = kzalloc(sizeof(struct em28xx_dvb), GFP_KERNEL); | 390 | dvb = kzalloc(sizeof(struct em28xx_dvb), GFP_KERNEL); |
| 386 | 391 | ||
| 387 | if (dvb == NULL) { | 392 | if (dvb == NULL) { |
| @@ -444,6 +449,11 @@ out_free: | |||
| 444 | 449 | ||
| 445 | static int dvb_fini(struct em28xx *dev) | 450 | static int dvb_fini(struct em28xx *dev) |
| 446 | { | 451 | { |
| 452 | if (!dev->has_dvb) { | ||
| 453 | /* This device does not support the extension */ | ||
| 454 | return 0; | ||
| 455 | } | ||
| 456 | |||
| 447 | if (dev->dvb) { | 457 | if (dev->dvb) { |
| 448 | unregister_dvb(dev->dvb); | 458 | unregister_dvb(dev->dvb); |
| 449 | dev->dvb = NULL; | 459 | dev->dvb = NULL; |
diff --git a/drivers/media/video/em28xx/em28xx-reg.h b/drivers/media/video/em28xx/em28xx-reg.h index 9058bed07953..fac1ab23f621 100644 --- a/drivers/media/video/em28xx/em28xx-reg.h +++ b/drivers/media/video/em28xx/em28xx-reg.h | |||
| @@ -84,5 +84,6 @@ | |||
| 84 | 84 | ||
| 85 | /* FIXME: Need to be populated with the other chip ID's */ | 85 | /* FIXME: Need to be populated with the other chip ID's */ |
| 86 | enum em28xx_chip_id { | 86 | enum em28xx_chip_id { |
| 87 | CHIP_ID_EM2860 = 34, | ||
| 87 | CHIP_ID_EM2883 = 36, | 88 | CHIP_ID_EM2883 = 36, |
| 88 | }; | 89 | }; |
diff --git a/drivers/media/video/em28xx/em28xx-video.c b/drivers/media/video/em28xx/em28xx-video.c index fb163ecd9216..285bc62bbe46 100644 --- a/drivers/media/video/em28xx/em28xx-video.c +++ b/drivers/media/video/em28xx/em28xx-video.c | |||
| @@ -1848,32 +1848,28 @@ static DEFINE_MUTEX(em28xx_extension_devlist_lock); | |||
| 1848 | 1848 | ||
| 1849 | int em28xx_register_extension(struct em28xx_ops *ops) | 1849 | int em28xx_register_extension(struct em28xx_ops *ops) |
| 1850 | { | 1850 | { |
| 1851 | struct em28xx *h, *dev = NULL; | 1851 | struct em28xx *dev = NULL; |
| 1852 | |||
| 1853 | list_for_each_entry(h, &em28xx_devlist, devlist) | ||
| 1854 | dev = h; | ||
| 1855 | 1852 | ||
| 1856 | mutex_lock(&em28xx_extension_devlist_lock); | 1853 | mutex_lock(&em28xx_extension_devlist_lock); |
| 1857 | list_add_tail(&ops->next, &em28xx_extension_devlist); | 1854 | list_add_tail(&ops->next, &em28xx_extension_devlist); |
| 1858 | if (dev) | 1855 | list_for_each_entry(dev, &em28xx_devlist, devlist) { |
| 1859 | ops->init(dev); | 1856 | if (dev) |
| 1860 | 1857 | ops->init(dev); | |
| 1858 | } | ||
| 1861 | printk(KERN_INFO "Em28xx: Initialized (%s) extension\n", ops->name); | 1859 | printk(KERN_INFO "Em28xx: Initialized (%s) extension\n", ops->name); |
| 1862 | mutex_unlock(&em28xx_extension_devlist_lock); | 1860 | mutex_unlock(&em28xx_extension_devlist_lock); |
| 1863 | |||
| 1864 | return 0; | 1861 | return 0; |
| 1865 | } | 1862 | } |
| 1866 | EXPORT_SYMBOL(em28xx_register_extension); | 1863 | EXPORT_SYMBOL(em28xx_register_extension); |
| 1867 | 1864 | ||
| 1868 | void em28xx_unregister_extension(struct em28xx_ops *ops) | 1865 | void em28xx_unregister_extension(struct em28xx_ops *ops) |
| 1869 | { | 1866 | { |
| 1870 | struct em28xx *h, *dev = NULL; | 1867 | struct em28xx *dev = NULL; |
| 1871 | |||
| 1872 | list_for_each_entry(h, &em28xx_devlist, devlist) | ||
| 1873 | dev = h; | ||
| 1874 | 1868 | ||
| 1875 | if (dev) | 1869 | list_for_each_entry(dev, &em28xx_devlist, devlist) { |
| 1876 | ops->fini(dev); | 1870 | if (dev) |
| 1871 | ops->fini(dev); | ||
| 1872 | } | ||
| 1877 | 1873 | ||
| 1878 | mutex_lock(&em28xx_extension_devlist_lock); | 1874 | mutex_lock(&em28xx_extension_devlist_lock); |
| 1879 | printk(KERN_INFO "Em28xx: Removed (%s) extension\n", ops->name); | 1875 | printk(KERN_INFO "Em28xx: Removed (%s) extension\n", ops->name); |
diff --git a/drivers/media/video/pxa_camera.c b/drivers/media/video/pxa_camera.c index 7cc8e9b19fb7..5ec5bb9a94d2 100644 --- a/drivers/media/video/pxa_camera.c +++ b/drivers/media/video/pxa_camera.c | |||
| @@ -1019,12 +1019,12 @@ static int pxa_camera_probe(struct platform_device *pdev) | |||
| 1019 | struct pxa_camera_dev *pcdev; | 1019 | struct pxa_camera_dev *pcdev; |
| 1020 | struct resource *res; | 1020 | struct resource *res; |
| 1021 | void __iomem *base; | 1021 | void __iomem *base; |
| 1022 | unsigned int irq; | 1022 | int irq; |
| 1023 | int err = 0; | 1023 | int err = 0; |
| 1024 | 1024 | ||
| 1025 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 1025 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
| 1026 | irq = platform_get_irq(pdev, 0); | 1026 | irq = platform_get_irq(pdev, 0); |
| 1027 | if (!res || !irq) { | 1027 | if (!res || irq < 0) { |
| 1028 | err = -ENODEV; | 1028 | err = -ENODEV; |
| 1029 | goto exit; | 1029 | goto exit; |
| 1030 | } | 1030 | } |
diff --git a/drivers/media/video/saa7134/saa7134-alsa.c b/drivers/media/video/saa7134/saa7134-alsa.c index ba3082422a01..f118de6e3672 100644 --- a/drivers/media/video/saa7134/saa7134-alsa.c +++ b/drivers/media/video/saa7134/saa7134-alsa.c | |||
| @@ -613,9 +613,15 @@ static int snd_card_saa7134_capture_open(struct snd_pcm_substream * substream) | |||
| 613 | struct snd_pcm_runtime *runtime = substream->runtime; | 613 | struct snd_pcm_runtime *runtime = substream->runtime; |
| 614 | snd_card_saa7134_pcm_t *pcm; | 614 | snd_card_saa7134_pcm_t *pcm; |
| 615 | snd_card_saa7134_t *saa7134 = snd_pcm_substream_chip(substream); | 615 | snd_card_saa7134_t *saa7134 = snd_pcm_substream_chip(substream); |
| 616 | struct saa7134_dev *dev = saa7134->dev; | 616 | struct saa7134_dev *dev; |
| 617 | int amux, err; | 617 | int amux, err; |
| 618 | 618 | ||
| 619 | if (!saa7134) { | ||
| 620 | printk(KERN_ERR "BUG: saa7134 can't find device struct." | ||
| 621 | " Can't proceed with open\n"); | ||
| 622 | return -ENODEV; | ||
| 623 | } | ||
| 624 | dev = saa7134->dev; | ||
| 619 | mutex_lock(&dev->dmasound.lock); | 625 | mutex_lock(&dev->dmasound.lock); |
| 620 | 626 | ||
| 621 | dev->dmasound.read_count = 0; | 627 | dev->dmasound.read_count = 0; |
diff --git a/drivers/media/video/saa7134/saa7134-cards.c b/drivers/media/video/saa7134/saa7134-cards.c index b111903aa322..2618cfa592e7 100644 --- a/drivers/media/video/saa7134/saa7134-cards.c +++ b/drivers/media/video/saa7134/saa7134-cards.c | |||
| @@ -4114,11 +4114,7 @@ struct saa7134_board saa7134_boards[] = { | |||
| 4114 | .radio_type = UNSET, | 4114 | .radio_type = UNSET, |
| 4115 | .tuner_addr = ADDR_UNSET, | 4115 | .tuner_addr = ADDR_UNSET, |
| 4116 | .radio_addr = ADDR_UNSET, | 4116 | .radio_addr = ADDR_UNSET, |
| 4117 | /* | ||
| 4118 | TODO: | ||
| 4119 | .mpeg = SAA7134_MPEG_DVB, | 4117 | .mpeg = SAA7134_MPEG_DVB, |
| 4120 | */ | ||
| 4121 | |||
| 4122 | .inputs = {{ | 4118 | .inputs = {{ |
| 4123 | .name = name_tv, | 4119 | .name = name_tv, |
| 4124 | .vmux = 1, | 4120 | .vmux = 1, |
| @@ -4157,7 +4153,7 @@ struct saa7134_board saa7134_boards[] = { | |||
| 4157 | } }, | 4153 | } }, |
| 4158 | .radio = { | 4154 | .radio = { |
| 4159 | .name = name_radio, | 4155 | .name = name_radio, |
| 4160 | .amux = LINE1, | 4156 | .amux = TV, |
| 4161 | }, | 4157 | }, |
| 4162 | }, | 4158 | }, |
| 4163 | [SAA7134_BOARD_AVERMEDIA_M115] = { | 4159 | [SAA7134_BOARD_AVERMEDIA_M115] = { |
| @@ -4167,6 +4163,7 @@ struct saa7134_board saa7134_boards[] = { | |||
| 4167 | .radio_type = UNSET, | 4163 | .radio_type = UNSET, |
| 4168 | .tuner_addr = ADDR_UNSET, | 4164 | .tuner_addr = ADDR_UNSET, |
| 4169 | .radio_addr = ADDR_UNSET, | 4165 | .radio_addr = ADDR_UNSET, |
| 4166 | .mpeg = SAA7134_MPEG_DVB, | ||
| 4170 | .inputs = {{ | 4167 | .inputs = {{ |
| 4171 | .name = name_tv, | 4168 | .name = name_tv, |
| 4172 | .vmux = 1, | 4169 | .vmux = 1, |
| @@ -5351,22 +5348,21 @@ static int saa7134_xc2028_callback(struct saa7134_dev *dev, | |||
| 5351 | { | 5348 | { |
| 5352 | switch (command) { | 5349 | switch (command) { |
| 5353 | case XC2028_TUNER_RESET: | 5350 | case XC2028_TUNER_RESET: |
| 5354 | saa_andorl(SAA7134_GPIO_GPMODE0 >> 2, 0x06e20000, 0x06e20000); | 5351 | saa_andorl(SAA7134_GPIO_GPSTATUS0 >> 2, 0x00008000, 0x00000000); |
| 5355 | saa_andorl(SAA7134_GPIO_GPSTATUS0 >> 2, 0x06a20000, 0x06a20000); | 5352 | saa_andorl(SAA7134_GPIO_GPSTATUS0 >> 2, 0x00008000, 0x00008000); |
| 5356 | mdelay(250); | 5353 | switch (dev->board) { |
| 5357 | saa_andorl(SAA7134_GPIO_GPMODE0 >> 2, 0x06e20000, 0); | 5354 | case SAA7134_BOARD_AVERMEDIA_CARDBUS_506: |
| 5358 | saa_andorl(SAA7134_GPIO_GPSTATUS0 >> 2, 0x06a20000, 0); | 5355 | saa7134_set_gpio(dev, 23, 0); |
| 5359 | mdelay(250); | 5356 | msleep(10); |
| 5360 | saa_andorl(SAA7134_GPIO_GPMODE0 >> 2, 0x06e20000, 0x06e20000); | 5357 | saa7134_set_gpio(dev, 23, 1); |
| 5361 | saa_andorl(SAA7134_GPIO_GPSTATUS0 >> 2, 0x06a20000, 0x06a20000); | 5358 | break; |
| 5362 | mdelay(250); | 5359 | case SAA7134_BOARD_AVERMEDIA_A16D: |
| 5363 | saa_andorl(SAA7133_ANALOG_IO_SELECT >> 2, 0x02, 0x02); | 5360 | saa7134_set_gpio(dev, 21, 0); |
| 5364 | saa_andorl(SAA7134_ANALOG_IN_CTRL1 >> 2, 0x81, 0x81); | 5361 | msleep(10); |
| 5365 | saa_andorl(SAA7134_AUDIO_CLOCK0 >> 2, 0x03187de7, 0x03187de7); | 5362 | saa7134_set_gpio(dev, 21, 1); |
| 5366 | saa_andorl(SAA7134_AUDIO_PLL_CTRL >> 2, 0x03, 0x03); | 5363 | break; |
| 5367 | saa_andorl(SAA7134_AUDIO_CLOCKS_PER_FIELD0 >> 2, | 5364 | } |
| 5368 | 0x0001e000, 0x0001e000); | 5365 | return 0; |
| 5369 | return 0; | ||
| 5370 | } | 5366 | } |
| 5371 | return -EINVAL; | 5367 | return -EINVAL; |
| 5372 | } | 5368 | } |
| @@ -5553,9 +5549,7 @@ int saa7134_board_init1(struct saa7134_dev *dev) | |||
| 5553 | saa_andorl(SAA7134_GPIO_GPSTATUS0 >> 2, 0x08000000, 0x00000000); | 5549 | saa_andorl(SAA7134_GPIO_GPSTATUS0 >> 2, 0x08000000, 0x00000000); |
| 5554 | break; | 5550 | break; |
| 5555 | case SAA7134_BOARD_AVERMEDIA_CARDBUS: | 5551 | case SAA7134_BOARD_AVERMEDIA_CARDBUS: |
| 5556 | case SAA7134_BOARD_AVERMEDIA_CARDBUS_506: | ||
| 5557 | case SAA7134_BOARD_AVERMEDIA_M115: | 5552 | case SAA7134_BOARD_AVERMEDIA_M115: |
| 5558 | case SAA7134_BOARD_AVERMEDIA_A16D: | ||
| 5559 | /* power-down tuner chip */ | 5553 | /* power-down tuner chip */ |
| 5560 | saa_andorl(SAA7134_GPIO_GPMODE0 >> 2, 0xffffffff, 0); | 5554 | saa_andorl(SAA7134_GPIO_GPMODE0 >> 2, 0xffffffff, 0); |
| 5561 | saa_andorl(SAA7134_GPIO_GPSTATUS0 >> 2, 0xffffffff, 0); | 5555 | saa_andorl(SAA7134_GPIO_GPSTATUS0 >> 2, 0xffffffff, 0); |
| @@ -5565,6 +5559,18 @@ int saa7134_board_init1(struct saa7134_dev *dev) | |||
| 5565 | saa_andorl(SAA7134_GPIO_GPSTATUS0 >> 2, 0xffffffff, 0xffffffff); | 5559 | saa_andorl(SAA7134_GPIO_GPSTATUS0 >> 2, 0xffffffff, 0xffffffff); |
| 5566 | msleep(10); | 5560 | msleep(10); |
| 5567 | break; | 5561 | break; |
| 5562 | case SAA7134_BOARD_AVERMEDIA_CARDBUS_506: | ||
| 5563 | saa7134_set_gpio(dev, 23, 0); | ||
| 5564 | msleep(10); | ||
| 5565 | saa7134_set_gpio(dev, 23, 1); | ||
| 5566 | break; | ||
| 5567 | case SAA7134_BOARD_AVERMEDIA_A16D: | ||
| 5568 | saa7134_set_gpio(dev, 21, 0); | ||
| 5569 | msleep(10); | ||
| 5570 | saa7134_set_gpio(dev, 21, 1); | ||
| 5571 | msleep(1); | ||
| 5572 | dev->has_remote = SAA7134_REMOTE_GPIO; | ||
| 5573 | break; | ||
| 5568 | case SAA7134_BOARD_BEHOLD_COLUMBUS_TVFM: | 5574 | case SAA7134_BOARD_BEHOLD_COLUMBUS_TVFM: |
| 5569 | /* power-down tuner chip */ | 5575 | /* power-down tuner chip */ |
| 5570 | saa_andorl(SAA7134_GPIO_GPMODE0 >> 2, 0x000A8004, 0x000A8004); | 5576 | saa_andorl(SAA7134_GPIO_GPMODE0 >> 2, 0x000A8004, 0x000A8004); |
| @@ -5615,7 +5621,8 @@ int saa7134_board_init1(struct saa7134_dev *dev) | |||
| 5615 | saa_andorl(SAA7134_GPIO_GPMODE0 >> 2, 0x80040100, 0x80040100); | 5621 | saa_andorl(SAA7134_GPIO_GPMODE0 >> 2, 0x80040100, 0x80040100); |
| 5616 | saa_andorl(SAA7134_GPIO_GPSTATUS0 >> 2, 0x80040100, 0x00040100); | 5622 | saa_andorl(SAA7134_GPIO_GPSTATUS0 >> 2, 0x80040100, 0x00040100); |
| 5617 | printk("%s: %s: hybrid analog/dvb card\n" | 5623 | printk("%s: %s: hybrid analog/dvb card\n" |
| 5618 | "%s: Sorry, only the analog inputs are supported for now.\n", | 5624 | "%s: Sorry, only analog s-video and composite input " |
| 5625 | "are supported for now.\n", | ||
| 5619 | dev->name, card(dev).name, dev->name); | 5626 | dev->name, card(dev).name, dev->name); |
| 5620 | break; | 5627 | break; |
| 5621 | } | 5628 | } |
| @@ -5675,6 +5682,7 @@ static void saa7134_tuner_setup(struct saa7134_dev *dev) | |||
| 5675 | 5682 | ||
| 5676 | switch (dev->board) { | 5683 | switch (dev->board) { |
| 5677 | case SAA7134_BOARD_AVERMEDIA_A16D: | 5684 | case SAA7134_BOARD_AVERMEDIA_A16D: |
| 5685 | case SAA7134_BOARD_AVERMEDIA_CARDBUS_506: | ||
| 5678 | ctl.demod = XC3028_FE_ZARLINK456; | 5686 | ctl.demod = XC3028_FE_ZARLINK456; |
| 5679 | break; | 5687 | break; |
| 5680 | default: | 5688 | default: |
diff --git a/drivers/media/video/saa7134/saa7134-dvb.c b/drivers/media/video/saa7134/saa7134-dvb.c index 469f93aac008..341b101b0357 100644 --- a/drivers/media/video/saa7134/saa7134-dvb.c +++ b/drivers/media/video/saa7134/saa7134-dvb.c | |||
| @@ -153,12 +153,12 @@ static int mt352_aver777_init(struct dvb_frontend* fe) | |||
| 153 | return 0; | 153 | return 0; |
| 154 | } | 154 | } |
| 155 | 155 | ||
| 156 | static int mt352_aver_a16d_init(struct dvb_frontend *fe) | 156 | static int mt352_avermedia_xc3028_init(struct dvb_frontend *fe) |
| 157 | { | 157 | { |
| 158 | static u8 clock_config [] = { CLOCK_CTL, 0x38, 0x2d }; | 158 | static u8 clock_config [] = { CLOCK_CTL, 0x38, 0x2d }; |
| 159 | static u8 reset [] = { RESET, 0x80 }; | 159 | static u8 reset [] = { RESET, 0x80 }; |
| 160 | static u8 adc_ctl_1_cfg [] = { ADC_CTL_1, 0x40 }; | 160 | static u8 adc_ctl_1_cfg [] = { ADC_CTL_1, 0x40 }; |
| 161 | static u8 agc_cfg [] = { AGC_TARGET, 0x28, 0xa0 }; | 161 | static u8 agc_cfg [] = { AGC_TARGET, 0xe }; |
| 162 | static u8 capt_range_cfg[] = { CAPT_RANGE, 0x33 }; | 162 | static u8 capt_range_cfg[] = { CAPT_RANGE, 0x33 }; |
| 163 | 163 | ||
| 164 | mt352_write(fe, clock_config, sizeof(clock_config)); | 164 | mt352_write(fe, clock_config, sizeof(clock_config)); |
| @@ -167,12 +167,9 @@ static int mt352_aver_a16d_init(struct dvb_frontend *fe) | |||
| 167 | mt352_write(fe, adc_ctl_1_cfg, sizeof(adc_ctl_1_cfg)); | 167 | mt352_write(fe, adc_ctl_1_cfg, sizeof(adc_ctl_1_cfg)); |
| 168 | mt352_write(fe, agc_cfg, sizeof(agc_cfg)); | 168 | mt352_write(fe, agc_cfg, sizeof(agc_cfg)); |
| 169 | mt352_write(fe, capt_range_cfg, sizeof(capt_range_cfg)); | 169 | mt352_write(fe, capt_range_cfg, sizeof(capt_range_cfg)); |
| 170 | |||
| 171 | return 0; | 170 | return 0; |
| 172 | } | 171 | } |
| 173 | 172 | ||
| 174 | |||
| 175 | |||
| 176 | static int mt352_pinnacle_tuner_set_params(struct dvb_frontend* fe, | 173 | static int mt352_pinnacle_tuner_set_params(struct dvb_frontend* fe, |
| 177 | struct dvb_frontend_parameters* params) | 174 | struct dvb_frontend_parameters* params) |
| 178 | { | 175 | { |
| @@ -215,14 +212,10 @@ static struct mt352_config avermedia_777 = { | |||
| 215 | .demod_init = mt352_aver777_init, | 212 | .demod_init = mt352_aver777_init, |
| 216 | }; | 213 | }; |
| 217 | 214 | ||
| 218 | static struct mt352_config avermedia_16d = { | 215 | static struct mt352_config avermedia_xc3028_mt352_dev = { |
| 219 | .demod_address = 0xf, | ||
| 220 | .demod_init = mt352_aver_a16d_init, | ||
| 221 | }; | ||
| 222 | |||
| 223 | static struct mt352_config avermedia_e506r_mt352_dev = { | ||
| 224 | .demod_address = (0x1e >> 1), | 216 | .demod_address = (0x1e >> 1), |
| 225 | .no_tuner = 1, | 217 | .no_tuner = 1, |
| 218 | .demod_init = mt352_avermedia_xc3028_init, | ||
| 226 | }; | 219 | }; |
| 227 | 220 | ||
| 228 | /* ================================================================== | 221 | /* ================================================================== |
| @@ -975,9 +968,10 @@ static int dvb_init(struct saa7134_dev *dev) | |||
| 975 | } | 968 | } |
| 976 | break; | 969 | break; |
| 977 | case SAA7134_BOARD_AVERMEDIA_A16D: | 970 | case SAA7134_BOARD_AVERMEDIA_A16D: |
| 978 | dprintk("avertv A16D dvb setup\n"); | 971 | dprintk("AverMedia A16D dvb setup\n"); |
| 979 | dev->dvb.frontend = dvb_attach(mt352_attach, &avermedia_16d, | 972 | dev->dvb.frontend = dvb_attach(mt352_attach, |
| 980 | &dev->i2c_adap); | 973 | &avermedia_xc3028_mt352_dev, |
| 974 | &dev->i2c_adap); | ||
| 981 | attach_xc3028 = 1; | 975 | attach_xc3028 = 1; |
| 982 | break; | 976 | break; |
| 983 | case SAA7134_BOARD_MD7134: | 977 | case SAA7134_BOARD_MD7134: |
| @@ -1091,7 +1085,8 @@ static int dvb_init(struct saa7134_dev *dev) | |||
| 1091 | ads_tech_duo_config.tuner_address); | 1085 | ads_tech_duo_config.tuner_address); |
| 1092 | goto dettach_frontend; | 1086 | goto dettach_frontend; |
| 1093 | } | 1087 | } |
| 1094 | } | 1088 | } else |
| 1089 | wprintk("failed to attach tda10046\n"); | ||
| 1095 | break; | 1090 | break; |
| 1096 | case SAA7134_BOARD_TEVION_DVBT_220RF: | 1091 | case SAA7134_BOARD_TEVION_DVBT_220RF: |
| 1097 | if (configure_tda827x_fe(dev, &tevion_dvbt220rf_config, | 1092 | if (configure_tda827x_fe(dev, &tevion_dvbt220rf_config, |
| @@ -1260,11 +1255,14 @@ static int dvb_init(struct saa7134_dev *dev) | |||
| 1260 | goto dettach_frontend; | 1255 | goto dettach_frontend; |
| 1261 | break; | 1256 | break; |
| 1262 | case SAA7134_BOARD_AVERMEDIA_CARDBUS_506: | 1257 | case SAA7134_BOARD_AVERMEDIA_CARDBUS_506: |
| 1258 | dprintk("AverMedia E506R dvb setup\n"); | ||
| 1259 | saa7134_set_gpio(dev, 25, 0); | ||
| 1260 | msleep(10); | ||
| 1261 | saa7134_set_gpio(dev, 25, 1); | ||
| 1263 | dev->dvb.frontend = dvb_attach(mt352_attach, | 1262 | dev->dvb.frontend = dvb_attach(mt352_attach, |
| 1264 | &avermedia_e506r_mt352_dev, | 1263 | &avermedia_xc3028_mt352_dev, |
| 1265 | &dev->i2c_adap); | 1264 | &dev->i2c_adap); |
| 1266 | attach_xc3028 = 1; | 1265 | attach_xc3028 = 1; |
| 1267 | break; | ||
| 1268 | case SAA7134_BOARD_MD7134_BRIDGE_2: | 1266 | case SAA7134_BOARD_MD7134_BRIDGE_2: |
| 1269 | dev->dvb.frontend = dvb_attach(tda10086_attach, | 1267 | dev->dvb.frontend = dvb_attach(tda10086_attach, |
| 1270 | &sd1878_4m, &dev->i2c_adap); | 1268 | &sd1878_4m, &dev->i2c_adap); |
| @@ -1338,7 +1336,8 @@ static int dvb_init(struct saa7134_dev *dev) | |||
| 1338 | return ret; | 1336 | return ret; |
| 1339 | 1337 | ||
| 1340 | dettach_frontend: | 1338 | dettach_frontend: |
| 1341 | dvb_frontend_detach(dev->dvb.frontend); | 1339 | if (dev->dvb.frontend) |
| 1340 | dvb_frontend_detach(dev->dvb.frontend); | ||
| 1342 | dev->dvb.frontend = NULL; | 1341 | dev->dvb.frontend = NULL; |
| 1343 | 1342 | ||
| 1344 | return -1; | 1343 | return -1; |
diff --git a/drivers/media/video/saa7134/saa7134-empress.c b/drivers/media/video/saa7134/saa7134-empress.c index 81431ee41842..3ae71a340822 100644 --- a/drivers/media/video/saa7134/saa7134-empress.c +++ b/drivers/media/video/saa7134/saa7134-empress.c | |||
| @@ -110,9 +110,10 @@ static int ts_release(struct inode *inode, struct file *file) | |||
| 110 | { | 110 | { |
| 111 | struct saa7134_dev *dev = file->private_data; | 111 | struct saa7134_dev *dev = file->private_data; |
| 112 | 112 | ||
| 113 | mutex_lock(&dev->empress_tsq.vb_lock); | ||
| 114 | |||
| 113 | videobuf_stop(&dev->empress_tsq); | 115 | videobuf_stop(&dev->empress_tsq); |
| 114 | videobuf_mmap_free(&dev->empress_tsq); | 116 | videobuf_mmap_free(&dev->empress_tsq); |
| 115 | dev->empress_users--; | ||
| 116 | 117 | ||
| 117 | /* stop the encoder */ | 118 | /* stop the encoder */ |
| 118 | ts_reset_encoder(dev); | 119 | ts_reset_encoder(dev); |
| @@ -121,6 +122,10 @@ static int ts_release(struct inode *inode, struct file *file) | |||
| 121 | saa_writeb(SAA7134_AUDIO_MUTE_CTRL, | 122 | saa_writeb(SAA7134_AUDIO_MUTE_CTRL, |
| 122 | saa_readb(SAA7134_AUDIO_MUTE_CTRL) | (1 << 6)); | 123 | saa_readb(SAA7134_AUDIO_MUTE_CTRL) | (1 << 6)); |
| 123 | 124 | ||
| 125 | dev->empress_users--; | ||
| 126 | |||
| 127 | mutex_unlock(&dev->empress_tsq.vb_lock); | ||
| 128 | |||
| 124 | return 0; | 129 | return 0; |
| 125 | } | 130 | } |
| 126 | 131 | ||
| @@ -218,8 +223,7 @@ static int empress_enum_fmt_cap(struct file *file, void *priv, | |||
| 218 | static int empress_g_fmt_cap(struct file *file, void *priv, | 223 | static int empress_g_fmt_cap(struct file *file, void *priv, |
| 219 | struct v4l2_format *f) | 224 | struct v4l2_format *f) |
| 220 | { | 225 | { |
| 221 | struct saa7134_fh *fh = priv; | 226 | struct saa7134_dev *dev = file->private_data; |
| 222 | struct saa7134_dev *dev = fh->dev; | ||
| 223 | 227 | ||
| 224 | saa7134_i2c_call_clients(dev, VIDIOC_G_FMT, f); | 228 | saa7134_i2c_call_clients(dev, VIDIOC_G_FMT, f); |
| 225 | 229 | ||
| @@ -232,8 +236,7 @@ static int empress_g_fmt_cap(struct file *file, void *priv, | |||
| 232 | static int empress_s_fmt_cap(struct file *file, void *priv, | 236 | static int empress_s_fmt_cap(struct file *file, void *priv, |
| 233 | struct v4l2_format *f) | 237 | struct v4l2_format *f) |
| 234 | { | 238 | { |
| 235 | struct saa7134_fh *fh = priv; | 239 | struct saa7134_dev *dev = file->private_data; |
| 236 | struct saa7134_dev *dev = fh->dev; | ||
| 237 | 240 | ||
| 238 | saa7134_i2c_call_clients(dev, VIDIOC_S_FMT, f); | 241 | saa7134_i2c_call_clients(dev, VIDIOC_S_FMT, f); |
| 239 | 242 | ||
| @@ -247,8 +250,7 @@ static int empress_s_fmt_cap(struct file *file, void *priv, | |||
| 247 | static int empress_reqbufs(struct file *file, void *priv, | 250 | static int empress_reqbufs(struct file *file, void *priv, |
| 248 | struct v4l2_requestbuffers *p) | 251 | struct v4l2_requestbuffers *p) |
| 249 | { | 252 | { |
| 250 | struct saa7134_fh *fh = priv; | 253 | struct saa7134_dev *dev = file->private_data; |
| 251 | struct saa7134_dev *dev = fh->dev; | ||
| 252 | 254 | ||
| 253 | return videobuf_reqbufs(&dev->empress_tsq, p); | 255 | return videobuf_reqbufs(&dev->empress_tsq, p); |
| 254 | } | 256 | } |
| @@ -256,24 +258,21 @@ static int empress_reqbufs(struct file *file, void *priv, | |||
| 256 | static int empress_querybuf(struct file *file, void *priv, | 258 | static int empress_querybuf(struct file *file, void *priv, |
| 257 | struct v4l2_buffer *b) | 259 | struct v4l2_buffer *b) |
| 258 | { | 260 | { |
| 259 | struct saa7134_fh *fh = priv; | 261 | struct saa7134_dev *dev = file->private_data; |
| 260 | struct saa7134_dev *dev = fh->dev; | ||
| 261 | 262 | ||
| 262 | return videobuf_querybuf(&dev->empress_tsq, b); | 263 | return videobuf_querybuf(&dev->empress_tsq, b); |
| 263 | } | 264 | } |
| 264 | 265 | ||
| 265 | static int empress_qbuf(struct file *file, void *priv, struct v4l2_buffer *b) | 266 | static int empress_qbuf(struct file *file, void *priv, struct v4l2_buffer *b) |
| 266 | { | 267 | { |
| 267 | struct saa7134_fh *fh = priv; | 268 | struct saa7134_dev *dev = file->private_data; |
| 268 | struct saa7134_dev *dev = fh->dev; | ||
| 269 | 269 | ||
| 270 | return videobuf_qbuf(&dev->empress_tsq, b); | 270 | return videobuf_qbuf(&dev->empress_tsq, b); |
| 271 | } | 271 | } |
| 272 | 272 | ||
| 273 | static int empress_dqbuf(struct file *file, void *priv, struct v4l2_buffer *b) | 273 | static int empress_dqbuf(struct file *file, void *priv, struct v4l2_buffer *b) |
| 274 | { | 274 | { |
| 275 | struct saa7134_fh *fh = priv; | 275 | struct saa7134_dev *dev = file->private_data; |
| 276 | struct saa7134_dev *dev = fh->dev; | ||
| 277 | 276 | ||
| 278 | return videobuf_dqbuf(&dev->empress_tsq, b, | 277 | return videobuf_dqbuf(&dev->empress_tsq, b, |
| 279 | file->f_flags & O_NONBLOCK); | 278 | file->f_flags & O_NONBLOCK); |
| @@ -282,8 +281,7 @@ static int empress_dqbuf(struct file *file, void *priv, struct v4l2_buffer *b) | |||
| 282 | static int empress_streamon(struct file *file, void *priv, | 281 | static int empress_streamon(struct file *file, void *priv, |
| 283 | enum v4l2_buf_type type) | 282 | enum v4l2_buf_type type) |
| 284 | { | 283 | { |
| 285 | struct saa7134_fh *fh = priv; | 284 | struct saa7134_dev *dev = file->private_data; |
| 286 | struct saa7134_dev *dev = fh->dev; | ||
| 287 | 285 | ||
| 288 | return videobuf_streamon(&dev->empress_tsq); | 286 | return videobuf_streamon(&dev->empress_tsq); |
| 289 | } | 287 | } |
| @@ -291,8 +289,7 @@ static int empress_streamon(struct file *file, void *priv, | |||
| 291 | static int empress_streamoff(struct file *file, void *priv, | 289 | static int empress_streamoff(struct file *file, void *priv, |
| 292 | enum v4l2_buf_type type) | 290 | enum v4l2_buf_type type) |
| 293 | { | 291 | { |
| 294 | struct saa7134_fh *fh = priv; | 292 | struct saa7134_dev *dev = file->private_data; |
| 295 | struct saa7134_dev *dev = fh->dev; | ||
| 296 | 293 | ||
| 297 | return videobuf_streamoff(&dev->empress_tsq); | 294 | return videobuf_streamoff(&dev->empress_tsq); |
| 298 | } | 295 | } |
| @@ -300,8 +297,7 @@ static int empress_streamoff(struct file *file, void *priv, | |||
| 300 | static int empress_s_ext_ctrls(struct file *file, void *priv, | 297 | static int empress_s_ext_ctrls(struct file *file, void *priv, |
| 301 | struct v4l2_ext_controls *ctrls) | 298 | struct v4l2_ext_controls *ctrls) |
| 302 | { | 299 | { |
| 303 | struct saa7134_fh *fh = priv; | 300 | struct saa7134_dev *dev = file->private_data; |
| 304 | struct saa7134_dev *dev = fh->dev; | ||
| 305 | 301 | ||
| 306 | /* count == 0 is abused in saa6752hs.c, so that special | 302 | /* count == 0 is abused in saa6752hs.c, so that special |
| 307 | case is handled here explicitly. */ | 303 | case is handled here explicitly. */ |
| @@ -320,8 +316,7 @@ static int empress_s_ext_ctrls(struct file *file, void *priv, | |||
| 320 | static int empress_g_ext_ctrls(struct file *file, void *priv, | 316 | static int empress_g_ext_ctrls(struct file *file, void *priv, |
| 321 | struct v4l2_ext_controls *ctrls) | 317 | struct v4l2_ext_controls *ctrls) |
| 322 | { | 318 | { |
| 323 | struct saa7134_fh *fh = priv; | 319 | struct saa7134_dev *dev = file->private_data; |
| 324 | struct saa7134_dev *dev = fh->dev; | ||
| 325 | 320 | ||
| 326 | if (ctrls->ctrl_class != V4L2_CTRL_CLASS_MPEG) | 321 | if (ctrls->ctrl_class != V4L2_CTRL_CLASS_MPEG) |
| 327 | return -EINVAL; | 322 | return -EINVAL; |
diff --git a/drivers/media/video/saa7134/saa7134-input.c b/drivers/media/video/saa7134/saa7134-input.c index 919632b10aae..76e6501d238d 100644 --- a/drivers/media/video/saa7134/saa7134-input.c +++ b/drivers/media/video/saa7134/saa7134-input.c | |||
| @@ -323,6 +323,15 @@ int saa7134_input_init1(struct saa7134_dev *dev) | |||
| 323 | saa_setb(SAA7134_GPIO_GPMODE1, 0x1); | 323 | saa_setb(SAA7134_GPIO_GPMODE1, 0x1); |
| 324 | saa_setb(SAA7134_GPIO_GPSTATUS1, 0x1); | 324 | saa_setb(SAA7134_GPIO_GPSTATUS1, 0x1); |
| 325 | break; | 325 | break; |
| 326 | case SAA7134_BOARD_AVERMEDIA_A16D: | ||
| 327 | ir_codes = ir_codes_avermedia_a16d; | ||
| 328 | mask_keycode = 0x02F200; | ||
| 329 | mask_keydown = 0x000400; | ||
| 330 | polling = 50; /* ms */ | ||
| 331 | /* Without this we won't receive key up events */ | ||
| 332 | saa_setb(SAA7134_GPIO_GPMODE1, 0x1); | ||
| 333 | saa_setb(SAA7134_GPIO_GPSTATUS1, 0x1); | ||
| 334 | break; | ||
| 326 | case SAA7134_BOARD_KWORLD_TERMINATOR: | 335 | case SAA7134_BOARD_KWORLD_TERMINATOR: |
| 327 | ir_codes = ir_codes_pixelview; | 336 | ir_codes = ir_codes_pixelview; |
| 328 | mask_keycode = 0x00001f; | 337 | mask_keycode = 0x00001f; |
diff --git a/drivers/media/video/soc_camera.c b/drivers/media/video/soc_camera.c index a1b92446c8b4..d015bfe00950 100644 --- a/drivers/media/video/soc_camera.c +++ b/drivers/media/video/soc_camera.c | |||
| @@ -763,15 +763,6 @@ static struct device_driver ic_drv = { | |||
| 763 | .owner = THIS_MODULE, | 763 | .owner = THIS_MODULE, |
| 764 | }; | 764 | }; |
| 765 | 765 | ||
| 766 | /* | ||
| 767 | * Image capture host - this is a host device, not a bus device, so, | ||
| 768 | * no bus reference, no probing. | ||
| 769 | */ | ||
| 770 | static struct class soc_camera_host_class = { | ||
| 771 | .owner = THIS_MODULE, | ||
| 772 | .name = "camera_host", | ||
| 773 | }; | ||
| 774 | |||
| 775 | static void dummy_release(struct device *dev) | 766 | static void dummy_release(struct device *dev) |
| 776 | { | 767 | { |
| 777 | } | 768 | } |
| @@ -801,7 +792,6 @@ int soc_camera_host_register(struct soc_camera_host *ici) | |||
| 801 | 792 | ||
| 802 | /* Number might be equal to the platform device ID */ | 793 | /* Number might be equal to the platform device ID */ |
| 803 | sprintf(ici->dev.bus_id, "camera_host%d", ici->nr); | 794 | sprintf(ici->dev.bus_id, "camera_host%d", ici->nr); |
| 804 | ici->dev.class = &soc_camera_host_class; | ||
| 805 | 795 | ||
| 806 | mutex_lock(&list_lock); | 796 | mutex_lock(&list_lock); |
| 807 | list_for_each_entry(ix, &hosts, list) { | 797 | list_for_each_entry(ix, &hosts, list) { |
| @@ -1003,14 +993,9 @@ static int __init soc_camera_init(void) | |||
| 1003 | ret = driver_register(&ic_drv); | 993 | ret = driver_register(&ic_drv); |
| 1004 | if (ret) | 994 | if (ret) |
| 1005 | goto edrvr; | 995 | goto edrvr; |
| 1006 | ret = class_register(&soc_camera_host_class); | ||
| 1007 | if (ret) | ||
| 1008 | goto eclr; | ||
| 1009 | 996 | ||
| 1010 | return 0; | 997 | return 0; |
| 1011 | 998 | ||
| 1012 | eclr: | ||
| 1013 | driver_unregister(&ic_drv); | ||
| 1014 | edrvr: | 999 | edrvr: |
| 1015 | bus_unregister(&soc_camera_bus_type); | 1000 | bus_unregister(&soc_camera_bus_type); |
| 1016 | return ret; | 1001 | return ret; |
| @@ -1018,7 +1003,6 @@ edrvr: | |||
| 1018 | 1003 | ||
| 1019 | static void __exit soc_camera_exit(void) | 1004 | static void __exit soc_camera_exit(void) |
| 1020 | { | 1005 | { |
| 1021 | class_unregister(&soc_camera_host_class); | ||
| 1022 | driver_unregister(&ic_drv); | 1006 | driver_unregister(&ic_drv); |
| 1023 | bus_unregister(&soc_camera_bus_type); | 1007 | bus_unregister(&soc_camera_bus_type); |
| 1024 | } | 1008 | } |
diff --git a/drivers/media/video/videodev.c b/drivers/media/video/videodev.c index 31e8af0ba278..67a661cf5219 100644 --- a/drivers/media/video/videodev.c +++ b/drivers/media/video/videodev.c | |||
| @@ -51,12 +51,51 @@ | |||
| 51 | #define VIDEO_NUM_DEVICES 256 | 51 | #define VIDEO_NUM_DEVICES 256 |
| 52 | #define VIDEO_NAME "video4linux" | 52 | #define VIDEO_NAME "video4linux" |
| 53 | 53 | ||
| 54 | struct std_descr { | ||
| 55 | v4l2_std_id std; | ||
| 56 | const char *descr; | ||
| 57 | }; | ||
| 58 | |||
| 59 | static const struct std_descr standards[] = { | ||
| 60 | { V4L2_STD_NTSC, "NTSC" }, | ||
| 61 | { V4L2_STD_NTSC_M, "NTSC-M" }, | ||
| 62 | { V4L2_STD_NTSC_M_JP, "NTSC-M-JP" }, | ||
| 63 | { V4L2_STD_NTSC_M_KR, "NTSC-M-KR" }, | ||
| 64 | { V4L2_STD_NTSC_443, "NTSC-443" }, | ||
| 65 | { V4L2_STD_PAL, "PAL" }, | ||
| 66 | { V4L2_STD_PAL_BG, "PAL-BG" }, | ||
| 67 | { V4L2_STD_PAL_B, "PAL-B" }, | ||
| 68 | { V4L2_STD_PAL_B1, "PAL-B1" }, | ||
| 69 | { V4L2_STD_PAL_G, "PAL-G" }, | ||
| 70 | { V4L2_STD_PAL_H, "PAL-H" }, | ||
| 71 | { V4L2_STD_PAL_I, "PAL-I" }, | ||
| 72 | { V4L2_STD_PAL_DK, "PAL-DK" }, | ||
| 73 | { V4L2_STD_PAL_D, "PAL-D" }, | ||
| 74 | { V4L2_STD_PAL_D1, "PAL-D1" }, | ||
| 75 | { V4L2_STD_PAL_K, "PAL-K" }, | ||
| 76 | { V4L2_STD_PAL_M, "PAL-M" }, | ||
| 77 | { V4L2_STD_PAL_N, "PAL-N" }, | ||
| 78 | { V4L2_STD_PAL_Nc, "PAL-Nc" }, | ||
| 79 | { V4L2_STD_PAL_60, "PAL-60" }, | ||
| 80 | { V4L2_STD_SECAM, "SECAM" }, | ||
| 81 | { V4L2_STD_SECAM_B, "SECAM-B" }, | ||
| 82 | { V4L2_STD_SECAM_G, "SECAM-G" }, | ||
| 83 | { V4L2_STD_SECAM_H, "SECAM-H" }, | ||
| 84 | { V4L2_STD_SECAM_DK, "SECAM-DK" }, | ||
| 85 | { V4L2_STD_SECAM_D, "SECAM-D" }, | ||
| 86 | { V4L2_STD_SECAM_K, "SECAM-K" }, | ||
| 87 | { V4L2_STD_SECAM_K1, "SECAM-K1" }, | ||
| 88 | { V4L2_STD_SECAM_L, "SECAM-L" }, | ||
| 89 | { V4L2_STD_SECAM_LC, "SECAM-Lc" }, | ||
| 90 | { 0, "Unknown" } | ||
| 91 | }; | ||
| 92 | |||
| 54 | /* video4linux standard ID conversion to standard name | 93 | /* video4linux standard ID conversion to standard name |
| 55 | */ | 94 | */ |
| 56 | char *v4l2_norm_to_name(v4l2_std_id id) | 95 | const char *v4l2_norm_to_name(v4l2_std_id id) |
| 57 | { | 96 | { |
| 58 | char *name; | ||
| 59 | u32 myid = id; | 97 | u32 myid = id; |
| 98 | int i; | ||
| 60 | 99 | ||
| 61 | /* HACK: ppc32 architecture doesn't have __ucmpdi2 function to handle | 100 | /* HACK: ppc32 architecture doesn't have __ucmpdi2 function to handle |
| 62 | 64 bit comparations. So, on that architecture, with some gcc | 101 | 64 bit comparations. So, on that architecture, with some gcc |
| @@ -64,110 +103,17 @@ char *v4l2_norm_to_name(v4l2_std_id id) | |||
| 64 | */ | 103 | */ |
| 65 | BUG_ON(myid != id); | 104 | BUG_ON(myid != id); |
| 66 | 105 | ||
| 67 | switch (myid) { | 106 | for (i = 0; standards[i].std; i++) |
| 68 | case V4L2_STD_PAL: | 107 | if (myid == standards[i].std) |
| 69 | name = "PAL"; | 108 | break; |
| 70 | break; | 109 | return standards[i].descr; |
| 71 | case V4L2_STD_PAL_BG: | ||
| 72 | name = "PAL-BG"; | ||
| 73 | break; | ||
| 74 | case V4L2_STD_PAL_DK: | ||
| 75 | name = "PAL-DK"; | ||
| 76 | break; | ||
| 77 | case V4L2_STD_PAL_B: | ||
| 78 | name = "PAL-B"; | ||
| 79 | break; | ||
| 80 | case V4L2_STD_PAL_B1: | ||
| 81 | name = "PAL-B1"; | ||
| 82 | break; | ||
| 83 | case V4L2_STD_PAL_G: | ||
| 84 | name = "PAL-G"; | ||
| 85 | break; | ||
| 86 | case V4L2_STD_PAL_H: | ||
| 87 | name = "PAL-H"; | ||
| 88 | break; | ||
| 89 | case V4L2_STD_PAL_I: | ||
| 90 | name = "PAL-I"; | ||
| 91 | break; | ||
| 92 | case V4L2_STD_PAL_D: | ||
| 93 | name = "PAL-D"; | ||
| 94 | break; | ||
| 95 | case V4L2_STD_PAL_D1: | ||
| 96 | name = "PAL-D1"; | ||
| 97 | break; | ||
| 98 | case V4L2_STD_PAL_K: | ||
| 99 | name = "PAL-K"; | ||
| 100 | break; | ||
| 101 | case V4L2_STD_PAL_M: | ||
| 102 | name = "PAL-M"; | ||
| 103 | break; | ||
| 104 | case V4L2_STD_PAL_N: | ||
| 105 | name = "PAL-N"; | ||
| 106 | break; | ||
| 107 | case V4L2_STD_PAL_Nc: | ||
| 108 | name = "PAL-Nc"; | ||
| 109 | break; | ||
| 110 | case V4L2_STD_PAL_60: | ||
| 111 | name = "PAL-60"; | ||
| 112 | break; | ||
| 113 | case V4L2_STD_NTSC: | ||
| 114 | name = "NTSC"; | ||
| 115 | break; | ||
| 116 | case V4L2_STD_NTSC_M: | ||
| 117 | name = "NTSC-M"; | ||
| 118 | break; | ||
| 119 | case V4L2_STD_NTSC_M_JP: | ||
| 120 | name = "NTSC-M-JP"; | ||
| 121 | break; | ||
| 122 | case V4L2_STD_NTSC_443: | ||
| 123 | name = "NTSC-443"; | ||
| 124 | break; | ||
| 125 | case V4L2_STD_NTSC_M_KR: | ||
| 126 | name = "NTSC-M-KR"; | ||
| 127 | break; | ||
| 128 | case V4L2_STD_SECAM: | ||
| 129 | name = "SECAM"; | ||
| 130 | break; | ||
| 131 | case V4L2_STD_SECAM_DK: | ||
| 132 | name = "SECAM-DK"; | ||
| 133 | break; | ||
| 134 | case V4L2_STD_SECAM_B: | ||
| 135 | name = "SECAM-B"; | ||
| 136 | break; | ||
| 137 | case V4L2_STD_SECAM_D: | ||
| 138 | name = "SECAM-D"; | ||
| 139 | break; | ||
| 140 | case V4L2_STD_SECAM_G: | ||
| 141 | name = "SECAM-G"; | ||
| 142 | break; | ||
| 143 | case V4L2_STD_SECAM_H: | ||
| 144 | name = "SECAM-H"; | ||
| 145 | break; | ||
| 146 | case V4L2_STD_SECAM_K: | ||
| 147 | name = "SECAM-K"; | ||
| 148 | break; | ||
| 149 | case V4L2_STD_SECAM_K1: | ||
| 150 | name = "SECAM-K1"; | ||
| 151 | break; | ||
| 152 | case V4L2_STD_SECAM_L: | ||
| 153 | name = "SECAM-L"; | ||
| 154 | break; | ||
| 155 | case V4L2_STD_SECAM_LC: | ||
| 156 | name = "SECAM-LC"; | ||
| 157 | break; | ||
| 158 | default: | ||
| 159 | name = "Unknown"; | ||
| 160 | break; | ||
| 161 | } | ||
| 162 | |||
| 163 | return name; | ||
| 164 | } | 110 | } |
| 165 | EXPORT_SYMBOL(v4l2_norm_to_name); | 111 | EXPORT_SYMBOL(v4l2_norm_to_name); |
| 166 | 112 | ||
| 167 | /* Fill in the fields of a v4l2_standard structure according to the | 113 | /* Fill in the fields of a v4l2_standard structure according to the |
| 168 | 'id' and 'transmission' parameters. Returns negative on error. */ | 114 | 'id' and 'transmission' parameters. Returns negative on error. */ |
| 169 | int v4l2_video_std_construct(struct v4l2_standard *vs, | 115 | int v4l2_video_std_construct(struct v4l2_standard *vs, |
| 170 | int id, char *name) | 116 | int id, const char *name) |
| 171 | { | 117 | { |
| 172 | u32 index = vs->index; | 118 | u32 index = vs->index; |
| 173 | 119 | ||
| @@ -1218,95 +1164,40 @@ static int __video_do_ioctl(struct inode *inode, struct file *file, | |||
| 1218 | case VIDIOC_ENUMSTD: | 1164 | case VIDIOC_ENUMSTD: |
| 1219 | { | 1165 | { |
| 1220 | struct v4l2_standard *p = arg; | 1166 | struct v4l2_standard *p = arg; |
| 1221 | v4l2_std_id id = vfd->tvnorms,curr_id=0; | 1167 | v4l2_std_id id = vfd->tvnorms, curr_id = 0; |
| 1222 | unsigned int index = p->index,i; | 1168 | unsigned int index = p->index, i, j = 0; |
| 1223 | 1169 | const char *descr = ""; | |
| 1224 | if (index<0) { | 1170 | |
| 1225 | ret=-EINVAL; | 1171 | /* Return norm array in a canonical way */ |
| 1226 | break; | 1172 | for (i = 0; i <= index && id; i++) { |
| 1227 | } | 1173 | /* last std value in the standards array is 0, so this |
| 1228 | 1174 | while always ends there since (id & 0) == 0. */ | |
| 1229 | /* Return norm array on a canonical way */ | 1175 | while ((id & standards[j].std) != standards[j].std) |
| 1230 | for (i=0;i<= index && id; i++) { | 1176 | j++; |
| 1231 | if ( (id & V4L2_STD_PAL) == V4L2_STD_PAL) { | 1177 | curr_id = standards[j].std; |
| 1232 | curr_id = V4L2_STD_PAL; | 1178 | descr = standards[j].descr; |
| 1233 | } else if ( (id & V4L2_STD_PAL_BG) == V4L2_STD_PAL_BG) { | 1179 | j++; |
| 1234 | curr_id = V4L2_STD_PAL_BG; | 1180 | if (curr_id == 0) |
| 1235 | } else if ( (id & V4L2_STD_PAL_DK) == V4L2_STD_PAL_DK) { | ||
| 1236 | curr_id = V4L2_STD_PAL_DK; | ||
| 1237 | } else if ( (id & V4L2_STD_PAL_B) == V4L2_STD_PAL_B) { | ||
| 1238 | curr_id = V4L2_STD_PAL_B; | ||
| 1239 | } else if ( (id & V4L2_STD_PAL_B1) == V4L2_STD_PAL_B1) { | ||
| 1240 | curr_id = V4L2_STD_PAL_B1; | ||
| 1241 | } else if ( (id & V4L2_STD_PAL_G) == V4L2_STD_PAL_G) { | ||
| 1242 | curr_id = V4L2_STD_PAL_G; | ||
| 1243 | } else if ( (id & V4L2_STD_PAL_H) == V4L2_STD_PAL_H) { | ||
| 1244 | curr_id = V4L2_STD_PAL_H; | ||
| 1245 | } else if ( (id & V4L2_STD_PAL_I) == V4L2_STD_PAL_I) { | ||
| 1246 | curr_id = V4L2_STD_PAL_I; | ||
| 1247 | } else if ( (id & V4L2_STD_PAL_D) == V4L2_STD_PAL_D) { | ||
| 1248 | curr_id = V4L2_STD_PAL_D; | ||
| 1249 | } else if ( (id & V4L2_STD_PAL_D1) == V4L2_STD_PAL_D1) { | ||
| 1250 | curr_id = V4L2_STD_PAL_D1; | ||
| 1251 | } else if ( (id & V4L2_STD_PAL_K) == V4L2_STD_PAL_K) { | ||
| 1252 | curr_id = V4L2_STD_PAL_K; | ||
| 1253 | } else if ( (id & V4L2_STD_PAL_M) == V4L2_STD_PAL_M) { | ||
| 1254 | curr_id = V4L2_STD_PAL_M; | ||
| 1255 | } else if ( (id & V4L2_STD_PAL_N) == V4L2_STD_PAL_N) { | ||
| 1256 | curr_id = V4L2_STD_PAL_N; | ||
| 1257 | } else if ( (id & V4L2_STD_PAL_Nc) == V4L2_STD_PAL_Nc) { | ||
| 1258 | curr_id = V4L2_STD_PAL_Nc; | ||
| 1259 | } else if ( (id & V4L2_STD_PAL_60) == V4L2_STD_PAL_60) { | ||
| 1260 | curr_id = V4L2_STD_PAL_60; | ||
| 1261 | } else if ( (id & V4L2_STD_NTSC) == V4L2_STD_NTSC) { | ||
| 1262 | curr_id = V4L2_STD_NTSC; | ||
| 1263 | } else if ( (id & V4L2_STD_NTSC_M) == V4L2_STD_NTSC_M) { | ||
| 1264 | curr_id = V4L2_STD_NTSC_M; | ||
| 1265 | } else if ( (id & V4L2_STD_NTSC_M_JP) == V4L2_STD_NTSC_M_JP) { | ||
| 1266 | curr_id = V4L2_STD_NTSC_M_JP; | ||
| 1267 | } else if ( (id & V4L2_STD_NTSC_443) == V4L2_STD_NTSC_443) { | ||
| 1268 | curr_id = V4L2_STD_NTSC_443; | ||
| 1269 | } else if ( (id & V4L2_STD_NTSC_M_KR) == V4L2_STD_NTSC_M_KR) { | ||
| 1270 | curr_id = V4L2_STD_NTSC_M_KR; | ||
| 1271 | } else if ( (id & V4L2_STD_SECAM) == V4L2_STD_SECAM) { | ||
| 1272 | curr_id = V4L2_STD_SECAM; | ||
| 1273 | } else if ( (id & V4L2_STD_SECAM_DK) == V4L2_STD_SECAM_DK) { | ||
| 1274 | curr_id = V4L2_STD_SECAM_DK; | ||
| 1275 | } else if ( (id & V4L2_STD_SECAM_B) == V4L2_STD_SECAM_B) { | ||
| 1276 | curr_id = V4L2_STD_SECAM_B; | ||
| 1277 | } else if ( (id & V4L2_STD_SECAM_D) == V4L2_STD_SECAM_D) { | ||
| 1278 | curr_id = V4L2_STD_SECAM_D; | ||
| 1279 | } else if ( (id & V4L2_STD_SECAM_G) == V4L2_STD_SECAM_G) { | ||
| 1280 | curr_id = V4L2_STD_SECAM_G; | ||
| 1281 | } else if ( (id & V4L2_STD_SECAM_H) == V4L2_STD_SECAM_H) { | ||
| 1282 | curr_id = V4L2_STD_SECAM_H; | ||
| 1283 | } else if ( (id & V4L2_STD_SECAM_K) == V4L2_STD_SECAM_K) { | ||
| 1284 | curr_id = V4L2_STD_SECAM_K; | ||
| 1285 | } else if ( (id & V4L2_STD_SECAM_K1) == V4L2_STD_SECAM_K1) { | ||
| 1286 | curr_id = V4L2_STD_SECAM_K1; | ||
| 1287 | } else if ( (id & V4L2_STD_SECAM_L) == V4L2_STD_SECAM_L) { | ||
| 1288 | curr_id = V4L2_STD_SECAM_L; | ||
| 1289 | } else if ( (id & V4L2_STD_SECAM_LC) == V4L2_STD_SECAM_LC) { | ||
| 1290 | curr_id = V4L2_STD_SECAM_LC; | ||
| 1291 | } else { | ||
| 1292 | break; | 1181 | break; |
| 1293 | } | 1182 | if (curr_id != V4L2_STD_PAL && |
| 1294 | id &= ~curr_id; | 1183 | curr_id != V4L2_STD_SECAM && |
| 1184 | curr_id != V4L2_STD_NTSC) | ||
| 1185 | id &= ~curr_id; | ||
| 1295 | } | 1186 | } |
| 1296 | if (i<=index) | 1187 | if (i <= index) |
| 1297 | return -EINVAL; | 1188 | return -EINVAL; |
| 1298 | 1189 | ||
| 1299 | v4l2_video_std_construct(p, curr_id,v4l2_norm_to_name(curr_id)); | 1190 | v4l2_video_std_construct(p, curr_id, descr); |
| 1300 | p->index = index; | 1191 | p->index = index; |
| 1301 | 1192 | ||
| 1302 | dbgarg (cmd, "index=%d, id=%Ld, name=%s, fps=%d/%d, " | 1193 | dbgarg(cmd, "index=%d, id=%Ld, name=%s, fps=%d/%d, " |
| 1303 | "framelines=%d\n", p->index, | 1194 | "framelines=%d\n", p->index, |
| 1304 | (unsigned long long)p->id, p->name, | 1195 | (unsigned long long)p->id, p->name, |
| 1305 | p->frameperiod.numerator, | 1196 | p->frameperiod.numerator, |
| 1306 | p->frameperiod.denominator, | 1197 | p->frameperiod.denominator, |
| 1307 | p->framelines); | 1198 | p->framelines); |
| 1308 | 1199 | ||
| 1309 | ret=0; | 1200 | ret = 0; |
| 1310 | break; | 1201 | break; |
| 1311 | } | 1202 | } |
| 1312 | case VIDIOC_G_STD: | 1203 | case VIDIOC_G_STD: |
diff --git a/drivers/media/video/vivi.c b/drivers/media/video/vivi.c index 845be1864f68..5ff9a58b6135 100644 --- a/drivers/media/video/vivi.c +++ b/drivers/media/video/vivi.c | |||
| @@ -327,13 +327,14 @@ static void vivi_fillbuff(struct vivi_dev *dev, struct vivi_buffer *buf) | |||
| 327 | int hmax = buf->vb.height; | 327 | int hmax = buf->vb.height; |
| 328 | int wmax = buf->vb.width; | 328 | int wmax = buf->vb.width; |
| 329 | struct timeval ts; | 329 | struct timeval ts; |
| 330 | char *tmpbuf = kmalloc(wmax * 2, GFP_ATOMIC); | 330 | char *tmpbuf; |
| 331 | void *vbuf = videobuf_to_vmalloc(&buf->vb); | 331 | void *vbuf = videobuf_to_vmalloc(&buf->vb); |
| 332 | 332 | ||
| 333 | if (!tmpbuf) | 333 | if (!vbuf) |
| 334 | return; | 334 | return; |
| 335 | 335 | ||
| 336 | if (!vbuf) | 336 | tmpbuf = kmalloc(wmax * 2, GFP_ATOMIC); |
| 337 | if (!tmpbuf) | ||
| 337 | return; | 338 | return; |
| 338 | 339 | ||
| 339 | for (h = 0; h < hmax; h++) { | 340 | for (h = 0; h < hmax; h++) { |
diff --git a/drivers/thermal/Kconfig b/drivers/thermal/Kconfig index 4b628526df09..a86e952ed4ca 100644 --- a/drivers/thermal/Kconfig +++ b/drivers/thermal/Kconfig | |||
| @@ -12,3 +12,12 @@ menuconfig THERMAL | |||
| 12 | cooling devices. | 12 | cooling devices. |
| 13 | All platforms with ACPI thermal support can use this driver. | 13 | All platforms with ACPI thermal support can use this driver. |
| 14 | If you want this support, you should say Y or M here. | 14 | If you want this support, you should say Y or M here. |
| 15 | |||
| 16 | config THERMAL_HWMON | ||
| 17 | bool "Hardware monitoring support" | ||
| 18 | depends on HWMON=y || HWMON=THERMAL | ||
| 19 | help | ||
| 20 | The generic thermal sysfs driver's hardware monitoring support | ||
| 21 | requires a 2.10.7/3.0.2 or later lm-sensors userspace. | ||
| 22 | |||
| 23 | Say Y if your user-space is new enough. | ||
diff --git a/drivers/thermal/thermal_sys.c b/drivers/thermal/thermal_sys.c index 6098787341f3..fe07462d5947 100644 --- a/drivers/thermal/thermal_sys.c +++ b/drivers/thermal/thermal_sys.c | |||
| @@ -295,8 +295,8 @@ thermal_cooling_device_trip_point_show(struct device *dev, | |||
| 295 | 295 | ||
| 296 | /* Device management */ | 296 | /* Device management */ |
| 297 | 297 | ||
| 298 | #if defined(CONFIG_HWMON) || \ | 298 | #if defined(CONFIG_THERMAL_HWMON) |
| 299 | (defined(CONFIG_HWMON_MODULE) && defined(CONFIG_THERMAL_MODULE)) | 299 | |
| 300 | /* hwmon sys I/F */ | 300 | /* hwmon sys I/F */ |
| 301 | #include <linux/hwmon.h> | 301 | #include <linux/hwmon.h> |
| 302 | static LIST_HEAD(thermal_hwmon_list); | 302 | static LIST_HEAD(thermal_hwmon_list); |
diff --git a/fs/block_dev.c b/fs/block_dev.c index 470c10ceb0fb..10d8a0aa871a 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c | |||
| @@ -931,8 +931,16 @@ static int do_open(struct block_device *bdev, struct file *file, int for_part) | |||
| 931 | struct gendisk *disk; | 931 | struct gendisk *disk; |
| 932 | int ret; | 932 | int ret; |
| 933 | int part; | 933 | int part; |
| 934 | int perm = 0; | ||
| 934 | 935 | ||
| 935 | ret = devcgroup_inode_permission(bdev->bd_inode, file->f_mode); | 936 | if (file->f_mode & FMODE_READ) |
| 937 | perm |= MAY_READ; | ||
| 938 | if (file->f_mode & FMODE_WRITE) | ||
| 939 | perm |= MAY_WRITE; | ||
| 940 | /* | ||
| 941 | * hooks: /n/, see "layering violations". | ||
| 942 | */ | ||
| 943 | ret = devcgroup_inode_permission(bdev->bd_inode, perm); | ||
| 936 | if (ret != 0) | 944 | if (ret != 0) |
| 937 | return ret; | 945 | return ret; |
| 938 | 946 | ||
diff --git a/fs/dcache.c b/fs/dcache.c index 3ee588d5f585..6068c25b393c 100644 --- a/fs/dcache.c +++ b/fs/dcache.c | |||
| @@ -17,6 +17,7 @@ | |||
| 17 | #include <linux/syscalls.h> | 17 | #include <linux/syscalls.h> |
| 18 | #include <linux/string.h> | 18 | #include <linux/string.h> |
| 19 | #include <linux/mm.h> | 19 | #include <linux/mm.h> |
| 20 | #include <linux/fdtable.h> | ||
| 20 | #include <linux/fs.h> | 21 | #include <linux/fs.h> |
| 21 | #include <linux/fsnotify.h> | 22 | #include <linux/fsnotify.h> |
| 22 | #include <linux/slab.h> | 23 | #include <linux/slab.h> |
| @@ -106,9 +107,10 @@ static void dentry_lru_remove(struct dentry *dentry) | |||
| 106 | /* | 107 | /* |
| 107 | * Release the dentry's inode, using the filesystem | 108 | * Release the dentry's inode, using the filesystem |
| 108 | * d_iput() operation if defined. | 109 | * d_iput() operation if defined. |
| 109 | * Called with dcache_lock and per dentry lock held, drops both. | ||
| 110 | */ | 110 | */ |
| 111 | static void dentry_iput(struct dentry * dentry) | 111 | static void dentry_iput(struct dentry * dentry) |
| 112 | __releases(dentry->d_lock) | ||
| 113 | __releases(dcache_lock) | ||
| 112 | { | 114 | { |
| 113 | struct inode *inode = dentry->d_inode; | 115 | struct inode *inode = dentry->d_inode; |
| 114 | if (inode) { | 116 | if (inode) { |
| @@ -132,12 +134,13 @@ static void dentry_iput(struct dentry * dentry) | |||
| 132 | * d_kill - kill dentry and return parent | 134 | * d_kill - kill dentry and return parent |
| 133 | * @dentry: dentry to kill | 135 | * @dentry: dentry to kill |
| 134 | * | 136 | * |
| 135 | * Called with dcache_lock and d_lock, releases both. The dentry must | 137 | * The dentry must already be unhashed and removed from the LRU. |
| 136 | * already be unhashed and removed from the LRU. | ||
| 137 | * | 138 | * |
| 138 | * If this is the root of the dentry tree, return NULL. | 139 | * If this is the root of the dentry tree, return NULL. |
| 139 | */ | 140 | */ |
| 140 | static struct dentry *d_kill(struct dentry *dentry) | 141 | static struct dentry *d_kill(struct dentry *dentry) |
| 142 | __releases(dentry->d_lock) | ||
| 143 | __releases(dcache_lock) | ||
| 141 | { | 144 | { |
| 142 | struct dentry *parent; | 145 | struct dentry *parent; |
| 143 | 146 | ||
| @@ -383,11 +386,11 @@ restart: | |||
| 383 | * Try to prune ancestors as well. This is necessary to prevent | 386 | * Try to prune ancestors as well. This is necessary to prevent |
| 384 | * quadratic behavior of shrink_dcache_parent(), but is also expected | 387 | * quadratic behavior of shrink_dcache_parent(), but is also expected |
| 385 | * to be beneficial in reducing dentry cache fragmentation. | 388 | * to be beneficial in reducing dentry cache fragmentation. |
| 386 | * | ||
| 387 | * Called with dcache_lock, drops it and then regains. | ||
| 388 | * Called with dentry->d_lock held, drops it. | ||
| 389 | */ | 389 | */ |
| 390 | static void prune_one_dentry(struct dentry * dentry) | 390 | static void prune_one_dentry(struct dentry * dentry) |
| 391 | __releases(dentry->d_lock) | ||
| 392 | __releases(dcache_lock) | ||
| 393 | __acquires(dcache_lock) | ||
| 391 | { | 394 | { |
| 392 | __d_drop(dentry); | 395 | __d_drop(dentry); |
| 393 | dentry = d_kill(dentry); | 396 | dentry = d_kill(dentry); |
| @@ -1604,10 +1607,9 @@ static int d_isparent(struct dentry *p1, struct dentry *p2) | |||
| 1604 | * | 1607 | * |
| 1605 | * Note: If ever the locking in lock_rename() changes, then please | 1608 | * Note: If ever the locking in lock_rename() changes, then please |
| 1606 | * remember to update this too... | 1609 | * remember to update this too... |
| 1607 | * | ||
| 1608 | * On return, dcache_lock will have been unlocked. | ||
| 1609 | */ | 1610 | */ |
| 1610 | static struct dentry *__d_unalias(struct dentry *dentry, struct dentry *alias) | 1611 | static struct dentry *__d_unalias(struct dentry *dentry, struct dentry *alias) |
| 1612 | __releases(dcache_lock) | ||
| 1611 | { | 1613 | { |
| 1612 | struct mutex *m1 = NULL, *m2 = NULL; | 1614 | struct mutex *m1 = NULL, *m2 = NULL; |
| 1613 | struct dentry *ret; | 1615 | struct dentry *ret; |
| @@ -1743,11 +1745,9 @@ out_nolock: | |||
| 1743 | shouldnt_be_hashed: | 1745 | shouldnt_be_hashed: |
| 1744 | spin_unlock(&dcache_lock); | 1746 | spin_unlock(&dcache_lock); |
| 1745 | BUG(); | 1747 | BUG(); |
| 1746 | goto shouldnt_be_hashed; | ||
| 1747 | } | 1748 | } |
| 1748 | 1749 | ||
| 1749 | static int prepend(char **buffer, int *buflen, const char *str, | 1750 | static int prepend(char **buffer, int *buflen, const char *str, int namelen) |
| 1750 | int namelen) | ||
| 1751 | { | 1751 | { |
| 1752 | *buflen -= namelen; | 1752 | *buflen -= namelen; |
| 1753 | if (*buflen < 0) | 1753 | if (*buflen < 0) |
| @@ -1757,8 +1757,13 @@ static int prepend(char **buffer, int *buflen, const char *str, | |||
| 1757 | return 0; | 1757 | return 0; |
| 1758 | } | 1758 | } |
| 1759 | 1759 | ||
| 1760 | static int prepend_name(char **buffer, int *buflen, struct qstr *name) | ||
| 1761 | { | ||
| 1762 | return prepend(buffer, buflen, name->name, name->len); | ||
| 1763 | } | ||
| 1764 | |||
| 1760 | /** | 1765 | /** |
| 1761 | * d_path - return the path of a dentry | 1766 | * __d_path - return the path of a dentry |
| 1762 | * @path: the dentry/vfsmount to report | 1767 | * @path: the dentry/vfsmount to report |
| 1763 | * @root: root vfsmnt/dentry (may be modified by this function) | 1768 | * @root: root vfsmnt/dentry (may be modified by this function) |
| 1764 | * @buffer: buffer to return value in | 1769 | * @buffer: buffer to return value in |
| @@ -1779,9 +1784,10 @@ char *__d_path(const struct path *path, struct path *root, | |||
| 1779 | { | 1784 | { |
| 1780 | struct dentry *dentry = path->dentry; | 1785 | struct dentry *dentry = path->dentry; |
| 1781 | struct vfsmount *vfsmnt = path->mnt; | 1786 | struct vfsmount *vfsmnt = path->mnt; |
| 1782 | char * end = buffer+buflen; | 1787 | char *end = buffer + buflen; |
| 1783 | char * retval; | 1788 | char *retval; |
| 1784 | 1789 | ||
| 1790 | spin_lock(&vfsmount_lock); | ||
| 1785 | prepend(&end, &buflen, "\0", 1); | 1791 | prepend(&end, &buflen, "\0", 1); |
| 1786 | if (!IS_ROOT(dentry) && d_unhashed(dentry) && | 1792 | if (!IS_ROOT(dentry) && d_unhashed(dentry) && |
| 1787 | (prepend(&end, &buflen, " (deleted)", 10) != 0)) | 1793 | (prepend(&end, &buflen, " (deleted)", 10) != 0)) |
| @@ -1800,38 +1806,37 @@ char *__d_path(const struct path *path, struct path *root, | |||
| 1800 | break; | 1806 | break; |
| 1801 | if (dentry == vfsmnt->mnt_root || IS_ROOT(dentry)) { | 1807 | if (dentry == vfsmnt->mnt_root || IS_ROOT(dentry)) { |
| 1802 | /* Global root? */ | 1808 | /* Global root? */ |
| 1803 | spin_lock(&vfsmount_lock); | ||
| 1804 | if (vfsmnt->mnt_parent == vfsmnt) { | 1809 | if (vfsmnt->mnt_parent == vfsmnt) { |
| 1805 | spin_unlock(&vfsmount_lock); | ||
| 1806 | goto global_root; | 1810 | goto global_root; |
| 1807 | } | 1811 | } |
| 1808 | dentry = vfsmnt->mnt_mountpoint; | 1812 | dentry = vfsmnt->mnt_mountpoint; |
| 1809 | vfsmnt = vfsmnt->mnt_parent; | 1813 | vfsmnt = vfsmnt->mnt_parent; |
| 1810 | spin_unlock(&vfsmount_lock); | ||
| 1811 | continue; | 1814 | continue; |
| 1812 | } | 1815 | } |
| 1813 | parent = dentry->d_parent; | 1816 | parent = dentry->d_parent; |
| 1814 | prefetch(parent); | 1817 | prefetch(parent); |
| 1815 | if ((prepend(&end, &buflen, dentry->d_name.name, | 1818 | if ((prepend_name(&end, &buflen, &dentry->d_name) != 0) || |
| 1816 | dentry->d_name.len) != 0) || | ||
| 1817 | (prepend(&end, &buflen, "/", 1) != 0)) | 1819 | (prepend(&end, &buflen, "/", 1) != 0)) |
| 1818 | goto Elong; | 1820 | goto Elong; |
| 1819 | retval = end; | 1821 | retval = end; |
| 1820 | dentry = parent; | 1822 | dentry = parent; |
| 1821 | } | 1823 | } |
| 1822 | 1824 | ||
| 1825 | out: | ||
| 1826 | spin_unlock(&vfsmount_lock); | ||
| 1823 | return retval; | 1827 | return retval; |
| 1824 | 1828 | ||
| 1825 | global_root: | 1829 | global_root: |
| 1826 | retval += 1; /* hit the slash */ | 1830 | retval += 1; /* hit the slash */ |
| 1827 | if (prepend(&retval, &buflen, dentry->d_name.name, | 1831 | if (prepend_name(&retval, &buflen, &dentry->d_name) != 0) |
| 1828 | dentry->d_name.len) != 0) | ||
| 1829 | goto Elong; | 1832 | goto Elong; |
| 1830 | root->mnt = vfsmnt; | 1833 | root->mnt = vfsmnt; |
| 1831 | root->dentry = dentry; | 1834 | root->dentry = dentry; |
| 1832 | return retval; | 1835 | goto out; |
| 1836 | |||
| 1833 | Elong: | 1837 | Elong: |
| 1834 | return ERR_PTR(-ENAMETOOLONG); | 1838 | retval = ERR_PTR(-ENAMETOOLONG); |
| 1839 | goto out; | ||
| 1835 | } | 1840 | } |
| 1836 | 1841 | ||
| 1837 | /** | 1842 | /** |
| @@ -1845,9 +1850,9 @@ Elong: | |||
| 1845 | * | 1850 | * |
| 1846 | * Returns the buffer or an error code if the path was too long. | 1851 | * Returns the buffer or an error code if the path was too long. |
| 1847 | * | 1852 | * |
| 1848 | * "buflen" should be positive. Caller holds the dcache_lock. | 1853 | * "buflen" should be positive. |
| 1849 | */ | 1854 | */ |
| 1850 | char *d_path(struct path *path, char *buf, int buflen) | 1855 | char *d_path(const struct path *path, char *buf, int buflen) |
| 1851 | { | 1856 | { |
| 1852 | char *res; | 1857 | char *res; |
| 1853 | struct path root; | 1858 | struct path root; |
| @@ -1915,16 +1920,11 @@ char *dentry_path(struct dentry *dentry, char *buf, int buflen) | |||
| 1915 | retval = end-1; | 1920 | retval = end-1; |
| 1916 | *retval = '/'; | 1921 | *retval = '/'; |
| 1917 | 1922 | ||
| 1918 | for (;;) { | 1923 | while (!IS_ROOT(dentry)) { |
| 1919 | struct dentry *parent; | 1924 | struct dentry *parent = dentry->d_parent; |
| 1920 | if (IS_ROOT(dentry)) | ||
| 1921 | break; | ||
| 1922 | 1925 | ||
| 1923 | parent = dentry->d_parent; | ||
| 1924 | prefetch(parent); | 1926 | prefetch(parent); |
| 1925 | 1927 | if ((prepend_name(&end, &buflen, &dentry->d_name) != 0) || | |
| 1926 | if ((prepend(&end, &buflen, dentry->d_name.name, | ||
| 1927 | dentry->d_name.len) != 0) || | ||
| 1928 | (prepend(&end, &buflen, "/", 1) != 0)) | 1928 | (prepend(&end, &buflen, "/", 1) != 0)) |
| 1929 | goto Elong; | 1929 | goto Elong; |
| 1930 | 1930 | ||
| @@ -1975,7 +1975,7 @@ asmlinkage long sys_getcwd(char __user *buf, unsigned long size) | |||
| 1975 | error = -ENOENT; | 1975 | error = -ENOENT; |
| 1976 | /* Has the current directory has been unlinked? */ | 1976 | /* Has the current directory has been unlinked? */ |
| 1977 | spin_lock(&dcache_lock); | 1977 | spin_lock(&dcache_lock); |
| 1978 | if (pwd.dentry->d_parent == pwd.dentry || !d_unhashed(pwd.dentry)) { | 1978 | if (IS_ROOT(pwd.dentry) || !d_unhashed(pwd.dentry)) { |
| 1979 | unsigned long len; | 1979 | unsigned long len; |
| 1980 | struct path tmp = root; | 1980 | struct path tmp = root; |
| 1981 | char * cwd; | 1981 | char * cwd; |
diff --git a/fs/locks.c b/fs/locks.c index 11dbf08651b7..dce8c747371c 100644 --- a/fs/locks.c +++ b/fs/locks.c | |||
| @@ -561,9 +561,6 @@ static void locks_insert_lock(struct file_lock **pos, struct file_lock *fl) | |||
| 561 | /* insert into file's list */ | 561 | /* insert into file's list */ |
| 562 | fl->fl_next = *pos; | 562 | fl->fl_next = *pos; |
| 563 | *pos = fl; | 563 | *pos = fl; |
| 564 | |||
| 565 | if (fl->fl_ops && fl->fl_ops->fl_insert) | ||
| 566 | fl->fl_ops->fl_insert(fl); | ||
| 567 | } | 564 | } |
| 568 | 565 | ||
| 569 | /* | 566 | /* |
| @@ -586,9 +583,6 @@ static void locks_delete_lock(struct file_lock **thisfl_p) | |||
| 586 | fl->fl_fasync = NULL; | 583 | fl->fl_fasync = NULL; |
| 587 | } | 584 | } |
| 588 | 585 | ||
| 589 | if (fl->fl_ops && fl->fl_ops->fl_remove) | ||
| 590 | fl->fl_ops->fl_remove(fl); | ||
| 591 | |||
| 592 | if (fl->fl_nspid) { | 586 | if (fl->fl_nspid) { |
| 593 | put_pid(fl->fl_nspid); | 587 | put_pid(fl->fl_nspid); |
| 594 | fl->fl_nspid = NULL; | 588 | fl->fl_nspid = NULL; |
diff --git a/fs/namei.c b/fs/namei.c index c7e43536c49a..01e67dddcc3d 100644 --- a/fs/namei.c +++ b/fs/namei.c | |||
| @@ -581,15 +581,13 @@ static __always_inline int link_path_walk(const char *name, struct nameidata *nd | |||
| 581 | int result; | 581 | int result; |
| 582 | 582 | ||
| 583 | /* make sure the stuff we saved doesn't go away */ | 583 | /* make sure the stuff we saved doesn't go away */ |
| 584 | dget(save.dentry); | 584 | path_get(&save); |
| 585 | mntget(save.mnt); | ||
| 586 | 585 | ||
| 587 | result = __link_path_walk(name, nd); | 586 | result = __link_path_walk(name, nd); |
| 588 | if (result == -ESTALE) { | 587 | if (result == -ESTALE) { |
| 589 | /* nd->path had been dropped */ | 588 | /* nd->path had been dropped */ |
| 590 | nd->path = save; | 589 | nd->path = save; |
| 591 | dget(nd->path.dentry); | 590 | path_get(&nd->path); |
| 592 | mntget(nd->path.mnt); | ||
| 593 | nd->flags |= LOOKUP_REVAL; | 591 | nd->flags |= LOOKUP_REVAL; |
| 594 | result = __link_path_walk(name, nd); | 592 | result = __link_path_walk(name, nd); |
| 595 | } | 593 | } |
| @@ -1216,8 +1214,9 @@ int vfs_path_lookup(struct dentry *dentry, struct vfsmount *mnt, | |||
| 1216 | nd->flags = flags; | 1214 | nd->flags = flags; |
| 1217 | nd->depth = 0; | 1215 | nd->depth = 0; |
| 1218 | 1216 | ||
| 1219 | nd->path.mnt = mntget(mnt); | 1217 | nd->path.dentry = dentry; |
| 1220 | nd->path.dentry = dget(dentry); | 1218 | nd->path.mnt = mnt; |
| 1219 | path_get(&nd->path); | ||
| 1221 | 1220 | ||
| 1222 | retval = path_walk(name, nd); | 1221 | retval = path_walk(name, nd); |
| 1223 | if (unlikely(!retval && !audit_dummy_context() && nd->path.dentry && | 1222 | if (unlikely(!retval && !audit_dummy_context() && nd->path.dentry && |
| @@ -2857,16 +2856,17 @@ int generic_readlink(struct dentry *dentry, char __user *buffer, int buflen) | |||
| 2857 | { | 2856 | { |
| 2858 | struct nameidata nd; | 2857 | struct nameidata nd; |
| 2859 | void *cookie; | 2858 | void *cookie; |
| 2859 | int res; | ||
| 2860 | 2860 | ||
| 2861 | nd.depth = 0; | 2861 | nd.depth = 0; |
| 2862 | cookie = dentry->d_inode->i_op->follow_link(dentry, &nd); | 2862 | cookie = dentry->d_inode->i_op->follow_link(dentry, &nd); |
| 2863 | if (!IS_ERR(cookie)) { | 2863 | if (IS_ERR(cookie)) |
| 2864 | int res = vfs_readlink(dentry, buffer, buflen, nd_get_link(&nd)); | 2864 | return PTR_ERR(cookie); |
| 2865 | if (dentry->d_inode->i_op->put_link) | 2865 | |
| 2866 | dentry->d_inode->i_op->put_link(dentry, &nd, cookie); | 2866 | res = vfs_readlink(dentry, buffer, buflen, nd_get_link(&nd)); |
| 2867 | cookie = ERR_PTR(res); | 2867 | if (dentry->d_inode->i_op->put_link) |
| 2868 | } | 2868 | dentry->d_inode->i_op->put_link(dentry, &nd, cookie); |
| 2869 | return PTR_ERR(cookie); | 2869 | return res; |
| 2870 | } | 2870 | } |
| 2871 | 2871 | ||
| 2872 | int vfs_follow_link(struct nameidata *nd, const char *link) | 2872 | int vfs_follow_link(struct nameidata *nd, const char *link) |
| @@ -1003,8 +1003,7 @@ struct file *create_write_pipe(void) | |||
| 1003 | void free_write_pipe(struct file *f) | 1003 | void free_write_pipe(struct file *f) |
| 1004 | { | 1004 | { |
| 1005 | free_pipe_info(f->f_dentry->d_inode); | 1005 | free_pipe_info(f->f_dentry->d_inode); |
| 1006 | dput(f->f_path.dentry); | 1006 | path_put(&f->f_path); |
| 1007 | mntput(f->f_path.mnt); | ||
| 1008 | put_filp(f); | 1007 | put_filp(f); |
| 1009 | } | 1008 | } |
| 1010 | 1009 | ||
| @@ -1015,8 +1014,8 @@ struct file *create_read_pipe(struct file *wrf) | |||
| 1015 | return ERR_PTR(-ENFILE); | 1014 | return ERR_PTR(-ENFILE); |
| 1016 | 1015 | ||
| 1017 | /* Grab pipe from the writer */ | 1016 | /* Grab pipe from the writer */ |
| 1018 | f->f_path.mnt = mntget(wrf->f_path.mnt); | 1017 | f->f_path = wrf->f_path; |
| 1019 | f->f_path.dentry = dget(wrf->f_path.dentry); | 1018 | path_get(&wrf->f_path); |
| 1020 | f->f_mapping = wrf->f_path.dentry->d_inode->i_mapping; | 1019 | f->f_mapping = wrf->f_path.dentry->d_inode->i_mapping; |
| 1021 | 1020 | ||
| 1022 | f->f_pos = 0; | 1021 | f->f_pos = 0; |
| @@ -1068,8 +1067,7 @@ int do_pipe(int *fd) | |||
| 1068 | err_fdr: | 1067 | err_fdr: |
| 1069 | put_unused_fd(fdr); | 1068 | put_unused_fd(fdr); |
| 1070 | err_read_pipe: | 1069 | err_read_pipe: |
| 1071 | dput(fr->f_dentry); | 1070 | path_put(&fr->f_path); |
| 1072 | mntput(fr->f_vfsmnt); | ||
| 1073 | put_filp(fr); | 1071 | put_filp(fr); |
| 1074 | err_write_pipe: | 1072 | err_write_pipe: |
| 1075 | free_write_pipe(fw); | 1073 | free_write_pipe(fw); |
diff --git a/fs/udf/super.c b/fs/udf/super.c index 7a5f69be6ac2..44cc702f96cc 100644 --- a/fs/udf/super.c +++ b/fs/udf/super.c | |||
| @@ -682,38 +682,26 @@ static int udf_vrs(struct super_block *sb, int silent) | |||
| 682 | /* | 682 | /* |
| 683 | * Check whether there is an anchor block in the given block | 683 | * Check whether there is an anchor block in the given block |
| 684 | */ | 684 | */ |
| 685 | static int udf_check_anchor_block(struct super_block *sb, sector_t block, | 685 | static int udf_check_anchor_block(struct super_block *sb, sector_t block) |
| 686 | bool varconv) | ||
| 687 | { | 686 | { |
| 688 | struct buffer_head *bh = NULL; | 687 | struct buffer_head *bh; |
| 689 | tag *t; | ||
| 690 | uint16_t ident; | 688 | uint16_t ident; |
| 691 | uint32_t location; | ||
| 692 | 689 | ||
| 693 | if (varconv) { | 690 | if (UDF_QUERY_FLAG(sb, UDF_FLAG_VARCONV) && |
| 694 | if (udf_fixed_to_variable(block) >= | 691 | udf_fixed_to_variable(block) >= |
| 695 | sb->s_bdev->bd_inode->i_size >> sb->s_blocksize_bits) | 692 | sb->s_bdev->bd_inode->i_size >> sb->s_blocksize_bits) |
| 696 | return 0; | 693 | return 0; |
| 697 | bh = sb_bread(sb, udf_fixed_to_variable(block)); | ||
| 698 | } | ||
| 699 | else | ||
| 700 | bh = sb_bread(sb, block); | ||
| 701 | 694 | ||
| 695 | bh = udf_read_tagged(sb, block, block, &ident); | ||
| 702 | if (!bh) | 696 | if (!bh) |
| 703 | return 0; | 697 | return 0; |
| 704 | |||
| 705 | t = (tag *)bh->b_data; | ||
| 706 | ident = le16_to_cpu(t->tagIdent); | ||
| 707 | location = le32_to_cpu(t->tagLocation); | ||
| 708 | brelse(bh); | 698 | brelse(bh); |
| 709 | if (ident != TAG_IDENT_AVDP) | 699 | |
| 710 | return 0; | 700 | return ident == TAG_IDENT_AVDP; |
| 711 | return location == block; | ||
| 712 | } | 701 | } |
| 713 | 702 | ||
| 714 | /* Search for an anchor volume descriptor pointer */ | 703 | /* Search for an anchor volume descriptor pointer */ |
| 715 | static sector_t udf_scan_anchors(struct super_block *sb, bool varconv, | 704 | static sector_t udf_scan_anchors(struct super_block *sb, sector_t lastblock) |
| 716 | sector_t lastblock) | ||
| 717 | { | 705 | { |
| 718 | sector_t last[6]; | 706 | sector_t last[6]; |
| 719 | int i; | 707 | int i; |
| @@ -739,7 +727,7 @@ static sector_t udf_scan_anchors(struct super_block *sb, bool varconv, | |||
| 739 | sb->s_blocksize_bits) | 727 | sb->s_blocksize_bits) |
| 740 | continue; | 728 | continue; |
| 741 | 729 | ||
| 742 | if (udf_check_anchor_block(sb, last[i], varconv)) { | 730 | if (udf_check_anchor_block(sb, last[i])) { |
| 743 | sbi->s_anchor[0] = last[i]; | 731 | sbi->s_anchor[0] = last[i]; |
| 744 | sbi->s_anchor[1] = last[i] - 256; | 732 | sbi->s_anchor[1] = last[i] - 256; |
| 745 | return last[i]; | 733 | return last[i]; |
| @@ -748,17 +736,17 @@ static sector_t udf_scan_anchors(struct super_block *sb, bool varconv, | |||
| 748 | if (last[i] < 256) | 736 | if (last[i] < 256) |
| 749 | continue; | 737 | continue; |
| 750 | 738 | ||
| 751 | if (udf_check_anchor_block(sb, last[i] - 256, varconv)) { | 739 | if (udf_check_anchor_block(sb, last[i] - 256)) { |
| 752 | sbi->s_anchor[1] = last[i] - 256; | 740 | sbi->s_anchor[1] = last[i] - 256; |
| 753 | return last[i]; | 741 | return last[i]; |
| 754 | } | 742 | } |
| 755 | } | 743 | } |
| 756 | 744 | ||
| 757 | if (udf_check_anchor_block(sb, sbi->s_session + 256, varconv)) { | 745 | if (udf_check_anchor_block(sb, sbi->s_session + 256)) { |
| 758 | sbi->s_anchor[0] = sbi->s_session + 256; | 746 | sbi->s_anchor[0] = sbi->s_session + 256; |
| 759 | return last[0]; | 747 | return last[0]; |
| 760 | } | 748 | } |
| 761 | if (udf_check_anchor_block(sb, sbi->s_session + 512, varconv)) { | 749 | if (udf_check_anchor_block(sb, sbi->s_session + 512)) { |
| 762 | sbi->s_anchor[0] = sbi->s_session + 512; | 750 | sbi->s_anchor[0] = sbi->s_session + 512; |
| 763 | return last[0]; | 751 | return last[0]; |
| 764 | } | 752 | } |
| @@ -780,23 +768,24 @@ static void udf_find_anchor(struct super_block *sb) | |||
| 780 | int i; | 768 | int i; |
| 781 | struct udf_sb_info *sbi = UDF_SB(sb); | 769 | struct udf_sb_info *sbi = UDF_SB(sb); |
| 782 | 770 | ||
| 783 | lastblock = udf_scan_anchors(sb, 0, sbi->s_last_block); | 771 | lastblock = udf_scan_anchors(sb, sbi->s_last_block); |
| 784 | if (lastblock) | 772 | if (lastblock) |
| 785 | goto check_anchor; | 773 | goto check_anchor; |
| 786 | 774 | ||
| 787 | /* No anchor found? Try VARCONV conversion of block numbers */ | 775 | /* No anchor found? Try VARCONV conversion of block numbers */ |
| 776 | UDF_SET_FLAG(sb, UDF_FLAG_VARCONV); | ||
| 788 | /* Firstly, we try to not convert number of the last block */ | 777 | /* Firstly, we try to not convert number of the last block */ |
| 789 | lastblock = udf_scan_anchors(sb, 1, | 778 | lastblock = udf_scan_anchors(sb, |
| 790 | udf_variable_to_fixed(sbi->s_last_block)); | 779 | udf_variable_to_fixed(sbi->s_last_block)); |
| 791 | if (lastblock) { | 780 | if (lastblock) |
| 792 | UDF_SET_FLAG(sb, UDF_FLAG_VARCONV); | ||
| 793 | goto check_anchor; | 781 | goto check_anchor; |
| 794 | } | ||
| 795 | 782 | ||
| 796 | /* Secondly, we try with converted number of the last block */ | 783 | /* Secondly, we try with converted number of the last block */ |
| 797 | lastblock = udf_scan_anchors(sb, 1, sbi->s_last_block); | 784 | lastblock = udf_scan_anchors(sb, sbi->s_last_block); |
| 798 | if (lastblock) | 785 | if (!lastblock) { |
| 799 | UDF_SET_FLAG(sb, UDF_FLAG_VARCONV); | 786 | /* VARCONV didn't help. Clear it. */ |
| 787 | UDF_CLEAR_FLAG(sb, UDF_FLAG_VARCONV); | ||
| 788 | } | ||
| 800 | 789 | ||
| 801 | check_anchor: | 790 | check_anchor: |
| 802 | /* | 791 | /* |
diff --git a/fs/utimes.c b/fs/utimes.c index af059d5cb485..b6b664e7145e 100644 --- a/fs/utimes.c +++ b/fs/utimes.c | |||
| @@ -40,14 +40,9 @@ asmlinkage long sys_utime(char __user *filename, struct utimbuf __user *times) | |||
| 40 | 40 | ||
| 41 | #endif | 41 | #endif |
| 42 | 42 | ||
| 43 | static bool nsec_special(long nsec) | ||
| 44 | { | ||
| 45 | return nsec == UTIME_OMIT || nsec == UTIME_NOW; | ||
| 46 | } | ||
| 47 | |||
| 48 | static bool nsec_valid(long nsec) | 43 | static bool nsec_valid(long nsec) |
| 49 | { | 44 | { |
| 50 | if (nsec_special(nsec)) | 45 | if (nsec == UTIME_OMIT || nsec == UTIME_NOW) |
| 51 | return true; | 46 | return true; |
| 52 | 47 | ||
| 53 | return nsec >= 0 && nsec <= 999999999; | 48 | return nsec >= 0 && nsec <= 999999999; |
| @@ -102,7 +97,11 @@ long do_utimes(int dfd, char __user *filename, struct timespec *times, int flags | |||
| 102 | if (error) | 97 | if (error) |
| 103 | goto dput_and_out; | 98 | goto dput_and_out; |
| 104 | 99 | ||
| 105 | /* Don't worry, the checks are done in inode_change_ok() */ | 100 | if (times && times[0].tv_nsec == UTIME_NOW && |
| 101 | times[1].tv_nsec == UTIME_NOW) | ||
| 102 | times = NULL; | ||
| 103 | |||
| 104 | /* In most cases, the checks are done in inode_change_ok() */ | ||
| 106 | newattrs.ia_valid = ATTR_CTIME | ATTR_MTIME | ATTR_ATIME; | 105 | newattrs.ia_valid = ATTR_CTIME | ATTR_MTIME | ATTR_ATIME; |
| 107 | if (times) { | 106 | if (times) { |
| 108 | error = -EPERM; | 107 | error = -EPERM; |
| @@ -124,28 +123,34 @@ long do_utimes(int dfd, char __user *filename, struct timespec *times, int flags | |||
| 124 | newattrs.ia_mtime.tv_nsec = times[1].tv_nsec; | 123 | newattrs.ia_mtime.tv_nsec = times[1].tv_nsec; |
| 125 | newattrs.ia_valid |= ATTR_MTIME_SET; | 124 | newattrs.ia_valid |= ATTR_MTIME_SET; |
| 126 | } | 125 | } |
| 127 | } | ||
| 128 | 126 | ||
| 129 | /* | 127 | /* |
| 130 | * If times is NULL or both times are either UTIME_OMIT or | 128 | * For the UTIME_OMIT/UTIME_NOW and UTIME_NOW/UTIME_OMIT |
| 131 | * UTIME_NOW, then need to check permissions, because | 129 | * cases, we need to make an extra check that is not done by |
| 132 | * inode_change_ok() won't do it. | 130 | * inode_change_ok(). |
| 133 | */ | 131 | */ |
| 134 | if (!times || (nsec_special(times[0].tv_nsec) && | 132 | if (((times[0].tv_nsec == UTIME_NOW && |
| 135 | nsec_special(times[1].tv_nsec))) { | 133 | times[1].tv_nsec == UTIME_OMIT) |
| 134 | || | ||
| 135 | (times[0].tv_nsec == UTIME_OMIT && | ||
| 136 | times[1].tv_nsec == UTIME_NOW)) | ||
| 137 | && !is_owner_or_cap(inode)) | ||
| 138 | goto mnt_drop_write_and_out; | ||
| 139 | } else { | ||
| 140 | |||
| 141 | /* | ||
| 142 | * If times is NULL (or both times are UTIME_NOW), | ||
| 143 | * then we need to check permissions, because | ||
| 144 | * inode_change_ok() won't do it. | ||
| 145 | */ | ||
| 136 | error = -EACCES; | 146 | error = -EACCES; |
| 137 | if (IS_IMMUTABLE(inode)) | 147 | if (IS_IMMUTABLE(inode)) |
| 138 | goto mnt_drop_write_and_out; | 148 | goto mnt_drop_write_and_out; |
| 139 | 149 | ||
| 140 | if (!is_owner_or_cap(inode)) { | 150 | if (!is_owner_or_cap(inode)) { |
| 141 | if (f) { | 151 | error = permission(inode, MAY_WRITE, NULL); |
| 142 | if (!(f->f_mode & FMODE_WRITE)) | 152 | if (error) |
| 143 | goto mnt_drop_write_and_out; | 153 | goto mnt_drop_write_and_out; |
| 144 | } else { | ||
| 145 | error = vfs_permission(&nd, MAY_WRITE); | ||
| 146 | if (error) | ||
| 147 | goto mnt_drop_write_and_out; | ||
| 148 | } | ||
| 149 | } | 154 | } |
| 150 | } | 155 | } |
| 151 | mutex_lock(&inode->i_mutex); | 156 | mutex_lock(&inode->i_mutex); |
| @@ -169,14 +174,6 @@ asmlinkage long sys_utimensat(int dfd, char __user *filename, struct timespec __ | |||
| 169 | if (utimes) { | 174 | if (utimes) { |
| 170 | if (copy_from_user(&tstimes, utimes, sizeof(tstimes))) | 175 | if (copy_from_user(&tstimes, utimes, sizeof(tstimes))) |
| 171 | return -EFAULT; | 176 | return -EFAULT; |
| 172 | if ((tstimes[0].tv_nsec == UTIME_OMIT || | ||
| 173 | tstimes[0].tv_nsec == UTIME_NOW) && | ||
| 174 | tstimes[0].tv_sec != 0) | ||
| 175 | return -EINVAL; | ||
| 176 | if ((tstimes[1].tv_nsec == UTIME_OMIT || | ||
| 177 | tstimes[1].tv_nsec == UTIME_NOW) && | ||
| 178 | tstimes[1].tv_sec != 0) | ||
| 179 | return -EINVAL; | ||
| 180 | 177 | ||
| 181 | /* Nothing to do, we must not even check the path. */ | 178 | /* Nothing to do, we must not even check the path. */ |
| 182 | if (tstimes[0].tv_nsec == UTIME_OMIT && | 179 | if (tstimes[0].tv_nsec == UTIME_OMIT && |
diff --git a/include/asm-generic/Kbuild.asm b/include/asm-generic/Kbuild.asm index 92a6d91d0c1a..7cd25b8e7c9a 100644 --- a/include/asm-generic/Kbuild.asm +++ b/include/asm-generic/Kbuild.asm | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | header-y += kvm.h | 1 | header-y += kvm.h |
| 2 | 2 | ||
| 3 | ifeq ($(wildcard include/asm-$(SRCARCH)/a.out.h),include/asm-$(SRCARCH)/a.out.h) | 3 | ifneq ($(wildcard $(srctree)/include/asm-$(SRCARCH)/a.out.h),) |
| 4 | unifdef-y += a.out.h | 4 | unifdef-y += a.out.h |
| 5 | endif | 5 | endif |
| 6 | unifdef-y += auxvec.h | 6 | unifdef-y += auxvec.h |
diff --git a/include/asm-powerpc/Kbuild b/include/asm-powerpc/Kbuild index 7381916dfcbb..bca352e033c3 100644 --- a/include/asm-powerpc/Kbuild +++ b/include/asm-powerpc/Kbuild | |||
| @@ -1,6 +1,5 @@ | |||
| 1 | include include/asm-generic/Kbuild.asm | 1 | include include/asm-generic/Kbuild.asm |
| 2 | 2 | ||
| 3 | header-y += a.out.h | ||
| 4 | header-y += auxvec.h | 3 | header-y += auxvec.h |
| 5 | header-y += ioctls.h | 4 | header-y += ioctls.h |
| 6 | header-y += mman.h | 5 | header-y += mman.h |
diff --git a/include/asm-x86/msr.h b/include/asm-x86/msr.h index 3707650a169b..2b5f2c91db25 100644 --- a/include/asm-x86/msr.h +++ b/include/asm-x86/msr.h | |||
| @@ -18,7 +18,7 @@ static inline unsigned long long native_read_tscp(unsigned int *aux) | |||
| 18 | unsigned long low, high; | 18 | unsigned long low, high; |
| 19 | asm volatile(".byte 0x0f,0x01,0xf9" | 19 | asm volatile(".byte 0x0f,0x01,0xf9" |
| 20 | : "=a" (low), "=d" (high), "=c" (*aux)); | 20 | : "=a" (low), "=d" (high), "=c" (*aux)); |
| 21 | return low | ((u64)high >> 32); | 21 | return low | ((u64)high << 32); |
| 22 | } | 22 | } |
| 23 | 23 | ||
| 24 | /* | 24 | /* |
diff --git a/include/linux/Kbuild b/include/linux/Kbuild index b6fbb2573e88..71d70d1fbce2 100644 --- a/include/linux/Kbuild +++ b/include/linux/Kbuild | |||
| @@ -166,7 +166,7 @@ unifdef-y += acct.h | |||
| 166 | unifdef-y += adb.h | 166 | unifdef-y += adb.h |
| 167 | unifdef-y += adfs_fs.h | 167 | unifdef-y += adfs_fs.h |
| 168 | unifdef-y += agpgart.h | 168 | unifdef-y += agpgart.h |
| 169 | ifeq ($(wildcard include/asm-$(SRCARCH)/a.out.h),include/asm-$(SRCARCH)/a.out.h) | 169 | ifneq ($(wildcard $(srctree)/include/asm-$(SRCARCH)/a.out.h),) |
| 170 | unifdef-y += a.out.h | 170 | unifdef-y += a.out.h |
| 171 | endif | 171 | endif |
| 172 | unifdef-y += apm_bios.h | 172 | unifdef-y += apm_bios.h |
diff --git a/include/linux/audit.h b/include/linux/audit.h index 63c3bb98558f..8b82974bdc12 100644 --- a/include/linux/audit.h +++ b/include/linux/audit.h | |||
| @@ -571,7 +571,7 @@ extern void audit_log_lost(const char *message); | |||
| 571 | extern int audit_update_lsm_rules(void); | 571 | extern int audit_update_lsm_rules(void); |
| 572 | 572 | ||
| 573 | /* Private API (for audit.c only) */ | 573 | /* Private API (for audit.c only) */ |
| 574 | extern int audit_filter_user(struct netlink_skb_parms *cb, int type); | 574 | extern int audit_filter_user(struct netlink_skb_parms *cb); |
| 575 | extern int audit_filter_type(int type); | 575 | extern int audit_filter_type(int type); |
| 576 | extern int audit_receive_filter(int type, int pid, int uid, int seq, | 576 | extern int audit_receive_filter(int type, int pid, int uid, int seq, |
| 577 | void *data, size_t datasz, uid_t loginuid, | 577 | void *data, size_t datasz, uid_t loginuid, |
diff --git a/include/linux/dcache.h b/include/linux/dcache.h index 2a6639407c80..d982eb89c77d 100644 --- a/include/linux/dcache.h +++ b/include/linux/dcache.h | |||
| @@ -300,7 +300,7 @@ extern int d_validate(struct dentry *, struct dentry *); | |||
| 300 | extern char *dynamic_dname(struct dentry *, char *, int, const char *, ...); | 300 | extern char *dynamic_dname(struct dentry *, char *, int, const char *, ...); |
| 301 | 301 | ||
| 302 | extern char *__d_path(const struct path *path, struct path *root, char *, int); | 302 | extern char *__d_path(const struct path *path, struct path *root, char *, int); |
| 303 | extern char *d_path(struct path *, char *, int); | 303 | extern char *d_path(const struct path *, char *, int); |
| 304 | extern char *dentry_path(struct dentry *, char *, int); | 304 | extern char *dentry_path(struct dentry *, char *, int); |
| 305 | 305 | ||
| 306 | /* Allocation counts.. */ | 306 | /* Allocation counts.. */ |
diff --git a/include/linux/fs.h b/include/linux/fs.h index d490779f18d9..7c1080826832 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h | |||
| @@ -894,8 +894,6 @@ static inline int file_check_writeable(struct file *filp) | |||
| 894 | typedef struct files_struct *fl_owner_t; | 894 | typedef struct files_struct *fl_owner_t; |
| 895 | 895 | ||
| 896 | struct file_lock_operations { | 896 | struct file_lock_operations { |
| 897 | void (*fl_insert)(struct file_lock *); /* lock insertion callback */ | ||
| 898 | void (*fl_remove)(struct file_lock *); /* lock removal callback */ | ||
| 899 | void (*fl_copy_lock)(struct file_lock *, struct file_lock *); | 897 | void (*fl_copy_lock)(struct file_lock *, struct file_lock *); |
| 900 | void (*fl_release_private)(struct file_lock *); | 898 | void (*fl_release_private)(struct file_lock *); |
| 901 | }; | 899 | }; |
diff --git a/include/linux/thermal.h b/include/linux/thermal.h index 06d3e6eb9ca8..917707e6151d 100644 --- a/include/linux/thermal.h +++ b/include/linux/thermal.h | |||
| @@ -66,8 +66,7 @@ struct thermal_cooling_device { | |||
| 66 | ((long)t-2732+5)/10 : ((long)t-2732-5)/10) | 66 | ((long)t-2732+5)/10 : ((long)t-2732-5)/10) |
| 67 | #define CELSIUS_TO_KELVIN(t) ((t)*10+2732) | 67 | #define CELSIUS_TO_KELVIN(t) ((t)*10+2732) |
| 68 | 68 | ||
| 69 | #if defined(CONFIG_HWMON) || \ | 69 | #if defined(CONFIG_THERMAL_HWMON) |
| 70 | (defined(CONFIG_HWMON_MODULE) && defined(CONFIG_THERMAL_MODULE)) | ||
| 71 | /* thermal zone devices with the same type share one hwmon device */ | 70 | /* thermal zone devices with the same type share one hwmon device */ |
| 72 | struct thermal_hwmon_device { | 71 | struct thermal_hwmon_device { |
| 73 | char type[THERMAL_NAME_LENGTH]; | 72 | char type[THERMAL_NAME_LENGTH]; |
| @@ -94,8 +93,7 @@ struct thermal_zone_device { | |||
| 94 | struct idr idr; | 93 | struct idr idr; |
| 95 | struct mutex lock; /* protect cooling devices list */ | 94 | struct mutex lock; /* protect cooling devices list */ |
| 96 | struct list_head node; | 95 | struct list_head node; |
| 97 | #if defined(CONFIG_HWMON) || \ | 96 | #if defined(CONFIG_THERMAL_HWMON) |
| 98 | (defined(CONFIG_HWMON_MODULE) && defined(CONFIG_THERMAL_MODULE)) | ||
| 99 | struct list_head hwmon_node; | 97 | struct list_head hwmon_node; |
| 100 | struct thermal_hwmon_device *hwmon; | 98 | struct thermal_hwmon_device *hwmon; |
| 101 | struct thermal_hwmon_attr temp_input; /* hwmon sys attr */ | 99 | struct thermal_hwmon_attr temp_input; /* hwmon sys attr */ |
diff --git a/include/media/cx25840.h b/include/media/cx25840.h index cd599ad29fb2..db431d513f2f 100644 --- a/include/media/cx25840.h +++ b/include/media/cx25840.h | |||
| @@ -32,12 +32,16 @@ enum cx25840_video_input { | |||
| 32 | CX25840_COMPOSITE7, | 32 | CX25840_COMPOSITE7, |
| 33 | CX25840_COMPOSITE8, | 33 | CX25840_COMPOSITE8, |
| 34 | 34 | ||
| 35 | /* S-Video inputs consist of one luma input (In1-In4) ORed with one | 35 | /* S-Video inputs consist of one luma input (In1-In8) ORed with one |
| 36 | chroma input (In5-In8) */ | 36 | chroma input (In5-In8) */ |
| 37 | CX25840_SVIDEO_LUMA1 = 0x10, | 37 | CX25840_SVIDEO_LUMA1 = 0x10, |
| 38 | CX25840_SVIDEO_LUMA2 = 0x20, | 38 | CX25840_SVIDEO_LUMA2 = 0x20, |
| 39 | CX25840_SVIDEO_LUMA3 = 0x30, | 39 | CX25840_SVIDEO_LUMA3 = 0x30, |
| 40 | CX25840_SVIDEO_LUMA4 = 0x40, | 40 | CX25840_SVIDEO_LUMA4 = 0x40, |
| 41 | CX25840_SVIDEO_LUMA5 = 0x50, | ||
| 42 | CX25840_SVIDEO_LUMA6 = 0x60, | ||
| 43 | CX25840_SVIDEO_LUMA7 = 0x70, | ||
| 44 | CX25840_SVIDEO_LUMA8 = 0x80, | ||
| 41 | CX25840_SVIDEO_CHROMA4 = 0x400, | 45 | CX25840_SVIDEO_CHROMA4 = 0x400, |
| 42 | CX25840_SVIDEO_CHROMA5 = 0x500, | 46 | CX25840_SVIDEO_CHROMA5 = 0x500, |
| 43 | CX25840_SVIDEO_CHROMA6 = 0x600, | 47 | CX25840_SVIDEO_CHROMA6 = 0x600, |
diff --git a/include/media/ir-common.h b/include/media/ir-common.h index bfee8be5d63f..b8e8aa91905a 100644 --- a/include/media/ir-common.h +++ b/include/media/ir-common.h | |||
| @@ -146,6 +146,7 @@ extern IR_KEYTAB_TYPE ir_codes_behold_columbus[IR_KEYTAB_SIZE]; | |||
| 146 | extern IR_KEYTAB_TYPE ir_codes_pinnacle_pctv_hd[IR_KEYTAB_SIZE]; | 146 | extern IR_KEYTAB_TYPE ir_codes_pinnacle_pctv_hd[IR_KEYTAB_SIZE]; |
| 147 | extern IR_KEYTAB_TYPE ir_codes_genius_tvgo_a11mce[IR_KEYTAB_SIZE]; | 147 | extern IR_KEYTAB_TYPE ir_codes_genius_tvgo_a11mce[IR_KEYTAB_SIZE]; |
| 148 | extern IR_KEYTAB_TYPE ir_codes_powercolor_real_angel[IR_KEYTAB_SIZE]; | 148 | extern IR_KEYTAB_TYPE ir_codes_powercolor_real_angel[IR_KEYTAB_SIZE]; |
| 149 | extern IR_KEYTAB_TYPE ir_codes_avermedia_a16d[IR_KEYTAB_SIZE]; | ||
| 149 | 150 | ||
| 150 | #endif | 151 | #endif |
| 151 | 152 | ||
diff --git a/include/media/v4l2-dev.h b/include/media/v4l2-dev.h index 33f01ae08f76..859f7a6f6f67 100644 --- a/include/media/v4l2-dev.h +++ b/include/media/v4l2-dev.h | |||
| @@ -40,9 +40,9 @@ | |||
| 40 | #define VFL_TYPE_VTX 3 | 40 | #define VFL_TYPE_VTX 3 |
| 41 | 41 | ||
| 42 | /* Video standard functions */ | 42 | /* Video standard functions */ |
| 43 | extern char *v4l2_norm_to_name(v4l2_std_id id); | 43 | extern const char *v4l2_norm_to_name(v4l2_std_id id); |
| 44 | extern int v4l2_video_std_construct(struct v4l2_standard *vs, | 44 | extern int v4l2_video_std_construct(struct v4l2_standard *vs, |
| 45 | int id, char *name); | 45 | int id, const char *name); |
| 46 | /* Prints the ioctl in a human-readable format */ | 46 | /* Prints the ioctl in a human-readable format */ |
| 47 | extern void v4l_printk_ioctl(unsigned int cmd); | 47 | extern void v4l_printk_ioctl(unsigned int cmd); |
| 48 | 48 | ||
diff --git a/kernel/audit.c b/kernel/audit.c index e8692a5748c2..e092f1c0ce30 100644 --- a/kernel/audit.c +++ b/kernel/audit.c | |||
| @@ -738,7 +738,7 @@ static int audit_receive_msg(struct sk_buff *skb, struct nlmsghdr *nlh) | |||
| 738 | if (!audit_enabled && msg_type != AUDIT_USER_AVC) | 738 | if (!audit_enabled && msg_type != AUDIT_USER_AVC) |
| 739 | return 0; | 739 | return 0; |
| 740 | 740 | ||
| 741 | err = audit_filter_user(&NETLINK_CB(skb), msg_type); | 741 | err = audit_filter_user(&NETLINK_CB(skb)); |
| 742 | if (err == 1) { | 742 | if (err == 1) { |
| 743 | err = 0; | 743 | err = 0; |
| 744 | if (msg_type == AUDIT_USER_TTY) { | 744 | if (msg_type == AUDIT_USER_TTY) { |
| @@ -779,7 +779,7 @@ static int audit_receive_msg(struct sk_buff *skb, struct nlmsghdr *nlh) | |||
| 779 | } | 779 | } |
| 780 | /* fallthrough */ | 780 | /* fallthrough */ |
| 781 | case AUDIT_LIST: | 781 | case AUDIT_LIST: |
| 782 | err = audit_receive_filter(nlh->nlmsg_type, NETLINK_CB(skb).pid, | 782 | err = audit_receive_filter(msg_type, NETLINK_CB(skb).pid, |
| 783 | uid, seq, data, nlmsg_len(nlh), | 783 | uid, seq, data, nlmsg_len(nlh), |
| 784 | loginuid, sessionid, sid); | 784 | loginuid, sessionid, sid); |
| 785 | break; | 785 | break; |
| @@ -798,7 +798,7 @@ static int audit_receive_msg(struct sk_buff *skb, struct nlmsghdr *nlh) | |||
| 798 | } | 798 | } |
| 799 | /* fallthrough */ | 799 | /* fallthrough */ |
| 800 | case AUDIT_LIST_RULES: | 800 | case AUDIT_LIST_RULES: |
| 801 | err = audit_receive_filter(nlh->nlmsg_type, NETLINK_CB(skb).pid, | 801 | err = audit_receive_filter(msg_type, NETLINK_CB(skb).pid, |
| 802 | uid, seq, data, nlmsg_len(nlh), | 802 | uid, seq, data, nlmsg_len(nlh), |
| 803 | loginuid, sessionid, sid); | 803 | loginuid, sessionid, sid); |
| 804 | break; | 804 | break; |
diff --git a/kernel/auditfilter.c b/kernel/auditfilter.c index 0e0bd27e6512..98c50cc671bb 100644 --- a/kernel/auditfilter.c +++ b/kernel/auditfilter.c | |||
| @@ -1544,6 +1544,7 @@ static void audit_log_rule_change(uid_t loginuid, u32 sessionid, u32 sid, | |||
| 1544 | * @data: payload data | 1544 | * @data: payload data |
| 1545 | * @datasz: size of payload data | 1545 | * @datasz: size of payload data |
| 1546 | * @loginuid: loginuid of sender | 1546 | * @loginuid: loginuid of sender |
| 1547 | * @sessionid: sessionid for netlink audit message | ||
| 1547 | * @sid: SE Linux Security ID of sender | 1548 | * @sid: SE Linux Security ID of sender |
| 1548 | */ | 1549 | */ |
| 1549 | int audit_receive_filter(int type, int pid, int uid, int seq, void *data, | 1550 | int audit_receive_filter(int type, int pid, int uid, int seq, void *data, |
| @@ -1720,7 +1721,7 @@ static int audit_filter_user_rules(struct netlink_skb_parms *cb, | |||
| 1720 | return 1; | 1721 | return 1; |
| 1721 | } | 1722 | } |
| 1722 | 1723 | ||
| 1723 | int audit_filter_user(struct netlink_skb_parms *cb, int type) | 1724 | int audit_filter_user(struct netlink_skb_parms *cb) |
| 1724 | { | 1725 | { |
| 1725 | enum audit_state state = AUDIT_DISABLED; | 1726 | enum audit_state state = AUDIT_DISABLED; |
| 1726 | struct audit_entry *e; | 1727 | struct audit_entry *e; |
