diff options
49 files changed, 317 insertions, 222 deletions
diff --git a/Documentation/DocBook/media/v4l/dev-codec.xml b/Documentation/DocBook/media/v4l/dev-codec.xml index dca0ecd54dc6..ff44c16fc080 100644 --- a/Documentation/DocBook/media/v4l/dev-codec.xml +++ b/Documentation/DocBook/media/v4l/dev-codec.xml | |||
| @@ -1,18 +1,27 @@ | |||
| 1 | <title>Codec Interface</title> | 1 | <title>Codec Interface</title> |
| 2 | 2 | ||
| 3 | <note> | 3 | <para>A V4L2 codec can compress, decompress, transform, or otherwise |
| 4 | <title>Suspended</title> | 4 | convert video data from one format into another format, in memory. Typically |
| 5 | such devices are memory-to-memory devices (i.e. devices with the | ||
| 6 | <constant>V4L2_CAP_VIDEO_M2M</constant> or <constant>V4L2_CAP_VIDEO_M2M_MPLANE</constant> | ||
| 7 | capability set). | ||
| 8 | </para> | ||
| 5 | 9 | ||
| 6 | <para>This interface has been be suspended from the V4L2 API | 10 | <para>A memory-to-memory video node acts just like a normal video node, but it |
| 7 | implemented in Linux 2.6 until we have more experience with codec | 11 | supports both output (sending frames from memory to the codec hardware) and |
| 8 | device interfaces.</para> | 12 | capture (receiving the processed frames from the codec hardware into memory) |
| 9 | </note> | 13 | stream I/O. An application will have to setup the stream |
| 14 | I/O for both sides and finally call &VIDIOC-STREAMON; for both capture and output | ||
| 15 | to start the codec.</para> | ||
| 10 | 16 | ||
| 11 | <para>A V4L2 codec can compress, decompress, transform, or otherwise | 17 | <para>Video compression codecs use the MPEG controls to setup their codec parameters |
| 12 | convert video data from one format into another format, in memory. | 18 | (note that the MPEG controls actually support many more codecs than just MPEG). |
| 13 | Applications send data to be converted to the driver through a | 19 | See <xref linkend="mpeg-controls"></xref>.</para> |
| 14 | &func-write; call, and receive the converted data through a | ||
| 15 | &func-read; call. For efficiency a driver may also support streaming | ||
| 16 | I/O.</para> | ||
| 17 | 20 | ||
| 18 | <para>[to do]</para> | 21 | <para>Memory-to-memory devices can often be used as a shared resource: you can |
| 22 | open the video node multiple times, each application setting up their own codec properties | ||
| 23 | that are local to the file handle, and each can use it independently from the others. | ||
| 24 | The driver will arbitrate access to the codec and reprogram it whenever another file | ||
| 25 | handler gets access. This is different from the usual video node behavior where the video properties | ||
| 26 | are global to the device (i.e. changing something through one file handle is visible | ||
| 27 | through another file handle).</para> | ||
diff --git a/Documentation/DocBook/media/v4l/v4l2.xml b/Documentation/DocBook/media/v4l/v4l2.xml index bfc93cdcf696..bfe823dd0f31 100644 --- a/Documentation/DocBook/media/v4l/v4l2.xml +++ b/Documentation/DocBook/media/v4l/v4l2.xml | |||
| @@ -493,7 +493,7 @@ and discussions on the V4L mailing list.</revremark> | |||
| 493 | </partinfo> | 493 | </partinfo> |
| 494 | 494 | ||
| 495 | <title>Video for Linux Two API Specification</title> | 495 | <title>Video for Linux Two API Specification</title> |
| 496 | <subtitle>Revision 3.9</subtitle> | 496 | <subtitle>Revision 3.10</subtitle> |
| 497 | 497 | ||
| 498 | <chapter id="common"> | 498 | <chapter id="common"> |
| 499 | &sub-common; | 499 | &sub-common; |
diff --git a/Documentation/devicetree/bindings/media/exynos-fimc-lite.txt b/Documentation/devicetree/bindings/media/exynos-fimc-lite.txt index 3f62adfb3e0b..de9f6b78ee51 100644 --- a/Documentation/devicetree/bindings/media/exynos-fimc-lite.txt +++ b/Documentation/devicetree/bindings/media/exynos-fimc-lite.txt | |||
| @@ -2,7 +2,7 @@ Exynos4x12/Exynos5 SoC series camera host interface (FIMC-LITE) | |||
| 2 | 2 | ||
| 3 | Required properties: | 3 | Required properties: |
| 4 | 4 | ||
| 5 | - compatible : should be "samsung,exynos4212-fimc" for Exynos4212 and | 5 | - compatible : should be "samsung,exynos4212-fimc-lite" for Exynos4212 and |
| 6 | Exynos4412 SoCs; | 6 | Exynos4412 SoCs; |
| 7 | - reg : physical base address and size of the device memory mapped | 7 | - reg : physical base address and size of the device memory mapped |
| 8 | registers; | 8 | registers; |
diff --git a/Documentation/sound/alsa/HD-Audio-Models.txt b/Documentation/sound/alsa/HD-Audio-Models.txt index bb8b0dc532b8..77d68e23b247 100644 --- a/Documentation/sound/alsa/HD-Audio-Models.txt +++ b/Documentation/sound/alsa/HD-Audio-Models.txt | |||
| @@ -29,6 +29,8 @@ ALC269/270/275/276/280/282 | |||
| 29 | alc271-dmic Enable ALC271X digital mic workaround | 29 | alc271-dmic Enable ALC271X digital mic workaround |
| 30 | inv-dmic Inverted internal mic workaround | 30 | inv-dmic Inverted internal mic workaround |
| 31 | lenovo-dock Enables docking station I/O for some Lenovos | 31 | lenovo-dock Enables docking station I/O for some Lenovos |
| 32 | dell-headset-multi Headset jack, which can also be used as mic-in | ||
| 33 | dell-headset-dock Headset jack (without mic-in), and also dock I/O | ||
| 32 | 34 | ||
| 33 | ALC662/663/272 | 35 | ALC662/663/272 |
| 34 | ============== | 36 | ============== |
| @@ -42,6 +44,7 @@ ALC662/663/272 | |||
| 42 | asus-mode7 ASUS | 44 | asus-mode7 ASUS |
| 43 | asus-mode8 ASUS | 45 | asus-mode8 ASUS |
| 44 | inv-dmic Inverted internal mic workaround | 46 | inv-dmic Inverted internal mic workaround |
| 47 | dell-headset-multi Headset jack, which can also be used as mic-in | ||
| 45 | 48 | ||
| 46 | ALC680 | 49 | ALC680 |
| 47 | ====== | 50 | ====== |
diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c index 934cfd18f72d..1144e8c7579d 100644 --- a/drivers/clk/clk.c +++ b/drivers/clk/clk.c | |||
| @@ -1955,6 +1955,7 @@ int clk_notifier_unregister(struct clk *clk, struct notifier_block *nb) | |||
| 1955 | /* XXX the notifier code should handle this better */ | 1955 | /* XXX the notifier code should handle this better */ |
| 1956 | if (!cn->notifier_head.head) { | 1956 | if (!cn->notifier_head.head) { |
| 1957 | srcu_cleanup_notifier_head(&cn->notifier_head); | 1957 | srcu_cleanup_notifier_head(&cn->notifier_head); |
| 1958 | list_del(&cn->node); | ||
| 1958 | kfree(cn); | 1959 | kfree(cn); |
| 1959 | } | 1960 | } |
| 1960 | 1961 | ||
diff --git a/drivers/clk/samsung/clk-exynos5250.c b/drivers/clk/samsung/clk-exynos5250.c index 5c97e75924a8..22d7699e7ced 100644 --- a/drivers/clk/samsung/clk-exynos5250.c +++ b/drivers/clk/samsung/clk-exynos5250.c | |||
| @@ -155,7 +155,7 @@ static __initdata unsigned long exynos5250_clk_regs[] = { | |||
| 155 | 155 | ||
| 156 | /* list of all parent clock list */ | 156 | /* list of all parent clock list */ |
| 157 | PNAME(mout_apll_p) = { "fin_pll", "fout_apll", }; | 157 | PNAME(mout_apll_p) = { "fin_pll", "fout_apll", }; |
| 158 | PNAME(mout_cpu_p) = { "mout_apll", "mout_mpll", }; | 158 | PNAME(mout_cpu_p) = { "mout_apll", "sclk_mpll", }; |
| 159 | PNAME(mout_mpll_fout_p) = { "fout_mplldiv2", "fout_mpll" }; | 159 | PNAME(mout_mpll_fout_p) = { "fout_mplldiv2", "fout_mpll" }; |
| 160 | PNAME(mout_mpll_p) = { "fin_pll", "mout_mpll_fout" }; | 160 | PNAME(mout_mpll_p) = { "fin_pll", "mout_mpll_fout" }; |
| 161 | PNAME(mout_bpll_fout_p) = { "fout_bplldiv2", "fout_bpll" }; | 161 | PNAME(mout_bpll_fout_p) = { "fout_bplldiv2", "fout_bpll" }; |
| @@ -208,10 +208,10 @@ struct samsung_fixed_factor_clock exynos5250_fixed_factor_clks[] __initdata = { | |||
| 208 | }; | 208 | }; |
| 209 | 209 | ||
| 210 | struct samsung_mux_clock exynos5250_mux_clks[] __initdata = { | 210 | struct samsung_mux_clock exynos5250_mux_clks[] __initdata = { |
| 211 | MUX(none, "mout_apll", mout_apll_p, SRC_CPU, 0, 1), | 211 | MUX_A(none, "mout_apll", mout_apll_p, SRC_CPU, 0, 1, "mout_apll"), |
| 212 | MUX(none, "mout_cpu", mout_cpu_p, SRC_CPU, 16, 1), | 212 | MUX_A(none, "mout_cpu", mout_cpu_p, SRC_CPU, 16, 1, "mout_cpu"), |
| 213 | MUX(none, "mout_mpll_fout", mout_mpll_fout_p, PLL_DIV2_SEL, 4, 1), | 213 | MUX(none, "mout_mpll_fout", mout_mpll_fout_p, PLL_DIV2_SEL, 4, 1), |
| 214 | MUX(none, "sclk_mpll", mout_mpll_p, SRC_CORE1, 8, 1), | 214 | MUX_A(none, "sclk_mpll", mout_mpll_p, SRC_CORE1, 8, 1, "mout_mpll"), |
| 215 | MUX(none, "mout_bpll_fout", mout_bpll_fout_p, PLL_DIV2_SEL, 0, 1), | 215 | MUX(none, "mout_bpll_fout", mout_bpll_fout_p, PLL_DIV2_SEL, 0, 1), |
| 216 | MUX(none, "sclk_bpll", mout_bpll_p, SRC_CDREX, 0, 1), | 216 | MUX(none, "sclk_bpll", mout_bpll_p, SRC_CDREX, 0, 1), |
| 217 | MUX(none, "mout_vpllsrc", mout_vpllsrc_p, SRC_TOP2, 0, 1), | 217 | MUX(none, "mout_vpllsrc", mout_vpllsrc_p, SRC_TOP2, 0, 1), |
| @@ -378,7 +378,7 @@ struct samsung_gate_clock exynos5250_gate_clks[] __initdata = { | |||
| 378 | GATE(hsi2c3, "hsi2c3", "aclk66", GATE_IP_PERIC, 31, 0, 0), | 378 | GATE(hsi2c3, "hsi2c3", "aclk66", GATE_IP_PERIC, 31, 0, 0), |
| 379 | GATE(chipid, "chipid", "aclk66", GATE_IP_PERIS, 0, 0, 0), | 379 | GATE(chipid, "chipid", "aclk66", GATE_IP_PERIS, 0, 0, 0), |
| 380 | GATE(sysreg, "sysreg", "aclk66", GATE_IP_PERIS, 1, 0, 0), | 380 | GATE(sysreg, "sysreg", "aclk66", GATE_IP_PERIS, 1, 0, 0), |
| 381 | GATE(pmu, "pmu", "aclk66", GATE_IP_PERIS, 2, 0, 0), | 381 | GATE(pmu, "pmu", "aclk66", GATE_IP_PERIS, 2, CLK_IGNORE_UNUSED, 0), |
| 382 | GATE(tzpc0, "tzpc0", "aclk66", GATE_IP_PERIS, 6, 0, 0), | 382 | GATE(tzpc0, "tzpc0", "aclk66", GATE_IP_PERIS, 6, 0, 0), |
| 383 | GATE(tzpc1, "tzpc1", "aclk66", GATE_IP_PERIS, 7, 0, 0), | 383 | GATE(tzpc1, "tzpc1", "aclk66", GATE_IP_PERIS, 7, 0, 0), |
| 384 | GATE(tzpc2, "tzpc2", "aclk66", GATE_IP_PERIS, 8, 0, 0), | 384 | GATE(tzpc2, "tzpc2", "aclk66", GATE_IP_PERIS, 8, 0, 0), |
diff --git a/drivers/clk/samsung/clk-pll.c b/drivers/clk/samsung/clk-pll.c index 89135f6be116..362f12dcd944 100644 --- a/drivers/clk/samsung/clk-pll.c +++ b/drivers/clk/samsung/clk-pll.c | |||
| @@ -111,7 +111,8 @@ static unsigned long samsung_pll36xx_recalc_rate(struct clk_hw *hw, | |||
| 111 | unsigned long parent_rate) | 111 | unsigned long parent_rate) |
| 112 | { | 112 | { |
| 113 | struct samsung_clk_pll36xx *pll = to_clk_pll36xx(hw); | 113 | struct samsung_clk_pll36xx *pll = to_clk_pll36xx(hw); |
| 114 | u32 mdiv, pdiv, sdiv, kdiv, pll_con0, pll_con1; | 114 | u32 mdiv, pdiv, sdiv, pll_con0, pll_con1; |
| 115 | s16 kdiv; | ||
| 115 | u64 fvco = parent_rate; | 116 | u64 fvco = parent_rate; |
| 116 | 117 | ||
| 117 | pll_con0 = __raw_readl(pll->con_reg); | 118 | pll_con0 = __raw_readl(pll->con_reg); |
| @@ -119,7 +120,7 @@ static unsigned long samsung_pll36xx_recalc_rate(struct clk_hw *hw, | |||
| 119 | mdiv = (pll_con0 >> PLL36XX_MDIV_SHIFT) & PLL36XX_MDIV_MASK; | 120 | mdiv = (pll_con0 >> PLL36XX_MDIV_SHIFT) & PLL36XX_MDIV_MASK; |
| 120 | pdiv = (pll_con0 >> PLL36XX_PDIV_SHIFT) & PLL36XX_PDIV_MASK; | 121 | pdiv = (pll_con0 >> PLL36XX_PDIV_SHIFT) & PLL36XX_PDIV_MASK; |
| 121 | sdiv = (pll_con0 >> PLL36XX_SDIV_SHIFT) & PLL36XX_SDIV_MASK; | 122 | sdiv = (pll_con0 >> PLL36XX_SDIV_SHIFT) & PLL36XX_SDIV_MASK; |
| 122 | kdiv = pll_con1 & PLL36XX_KDIV_MASK; | 123 | kdiv = (s16)(pll_con1 & PLL36XX_KDIV_MASK); |
| 123 | 124 | ||
| 124 | fvco *= (mdiv << 16) + kdiv; | 125 | fvco *= (mdiv << 16) + kdiv; |
| 125 | do_div(fvco, (pdiv << sdiv)); | 126 | do_div(fvco, (pdiv << sdiv)); |
diff --git a/drivers/clk/spear/spear3xx_clock.c b/drivers/clk/spear/spear3xx_clock.c index f9ec43fd1320..080c3c5e33f6 100644 --- a/drivers/clk/spear/spear3xx_clock.c +++ b/drivers/clk/spear/spear3xx_clock.c | |||
| @@ -369,7 +369,7 @@ static void __init spear320_clk_init(void __iomem *soc_config_base) | |||
| 369 | clk_register_clkdev(clk, NULL, "60100000.serial"); | 369 | clk_register_clkdev(clk, NULL, "60100000.serial"); |
| 370 | } | 370 | } |
| 371 | #else | 371 | #else |
| 372 | static inline void spear320_clk_init(void) { } | 372 | static inline void spear320_clk_init(void __iomem *soc_config_base) { } |
| 373 | #endif | 373 | #endif |
| 374 | 374 | ||
| 375 | void __init spear3xx_clk_init(void __iomem *misc_base, void __iomem *soc_config_base) | 375 | void __init spear3xx_clk_init(void __iomem *misc_base, void __iomem *soc_config_base) |
diff --git a/drivers/clk/tegra/clk-tegra30.c b/drivers/clk/tegra/clk-tegra30.c index c6921f538e28..ba99e3844106 100644 --- a/drivers/clk/tegra/clk-tegra30.c +++ b/drivers/clk/tegra/clk-tegra30.c | |||
| @@ -1598,6 +1598,12 @@ static void __init tegra30_periph_clk_init(void) | |||
| 1598 | clk_register_clkdev(clk, "afi", "tegra-pcie"); | 1598 | clk_register_clkdev(clk, "afi", "tegra-pcie"); |
| 1599 | clks[afi] = clk; | 1599 | clks[afi] = clk; |
| 1600 | 1600 | ||
| 1601 | /* pciex */ | ||
| 1602 | clk = tegra_clk_register_periph_gate("pciex", "pll_e", 0, clk_base, 0, | ||
| 1603 | 74, &periph_u_regs, periph_clk_enb_refcnt); | ||
| 1604 | clk_register_clkdev(clk, "pciex", "tegra-pcie"); | ||
| 1605 | clks[pciex] = clk; | ||
| 1606 | |||
| 1601 | /* kfuse */ | 1607 | /* kfuse */ |
| 1602 | clk = tegra_clk_register_periph_gate("kfuse", "clk_m", | 1608 | clk = tegra_clk_register_periph_gate("kfuse", "clk_m", |
| 1603 | TEGRA_PERIPH_ON_APB, | 1609 | TEGRA_PERIPH_ON_APB, |
| @@ -1716,11 +1722,6 @@ static void __init tegra30_fixed_clk_init(void) | |||
| 1716 | 1, 0, &cml_lock); | 1722 | 1, 0, &cml_lock); |
| 1717 | clk_register_clkdev(clk, "cml1", NULL); | 1723 | clk_register_clkdev(clk, "cml1", NULL); |
| 1718 | clks[cml1] = clk; | 1724 | clks[cml1] = clk; |
| 1719 | |||
| 1720 | /* pciex */ | ||
| 1721 | clk = clk_register_fixed_rate(NULL, "pciex", "pll_e", 0, 100000000); | ||
| 1722 | clk_register_clkdev(clk, "pciex", NULL); | ||
| 1723 | clks[pciex] = clk; | ||
| 1724 | } | 1725 | } |
| 1725 | 1726 | ||
| 1726 | static void __init tegra30_osc_clk_init(void) | 1727 | static void __init tegra30_osc_clk_init(void) |
diff --git a/drivers/media/i2c/s5c73m3/s5c73m3-core.c b/drivers/media/i2c/s5c73m3/s5c73m3-core.c index cb52438e53ac..9eac5310942f 100644 --- a/drivers/media/i2c/s5c73m3/s5c73m3-core.c +++ b/drivers/media/i2c/s5c73m3/s5c73m3-core.c | |||
| @@ -956,7 +956,7 @@ static int s5c73m3_oif_enum_frame_interval(struct v4l2_subdev *sd, | |||
| 956 | 956 | ||
| 957 | if (fie->pad != OIF_SOURCE_PAD) | 957 | if (fie->pad != OIF_SOURCE_PAD) |
| 958 | return -EINVAL; | 958 | return -EINVAL; |
| 959 | if (fie->index > ARRAY_SIZE(s5c73m3_intervals)) | 959 | if (fie->index >= ARRAY_SIZE(s5c73m3_intervals)) |
| 960 | return -EINVAL; | 960 | return -EINVAL; |
| 961 | 961 | ||
| 962 | mutex_lock(&state->lock); | 962 | mutex_lock(&state->lock); |
diff --git a/drivers/media/pci/cx88/cx88-alsa.c b/drivers/media/pci/cx88/cx88-alsa.c index 27d62623274b..aba5b1c649e6 100644 --- a/drivers/media/pci/cx88/cx88-alsa.c +++ b/drivers/media/pci/cx88/cx88-alsa.c | |||
| @@ -615,7 +615,7 @@ static int snd_cx88_volume_put(struct snd_kcontrol *kcontrol, | |||
| 615 | int changed = 0; | 615 | int changed = 0; |
| 616 | u32 old; | 616 | u32 old; |
| 617 | 617 | ||
| 618 | if (core->board.audio_chip == V4L2_IDENT_WM8775) | 618 | if (core->sd_wm8775) |
| 619 | snd_cx88_wm8775_volume_put(kcontrol, value); | 619 | snd_cx88_wm8775_volume_put(kcontrol, value); |
| 620 | 620 | ||
| 621 | left = value->value.integer.value[0] & 0x3f; | 621 | left = value->value.integer.value[0] & 0x3f; |
| @@ -682,8 +682,7 @@ static int snd_cx88_switch_put(struct snd_kcontrol *kcontrol, | |||
| 682 | vol ^= bit; | 682 | vol ^= bit; |
| 683 | cx_swrite(SHADOW_AUD_VOL_CTL, AUD_VOL_CTL, vol); | 683 | cx_swrite(SHADOW_AUD_VOL_CTL, AUD_VOL_CTL, vol); |
| 684 | /* Pass mute onto any WM8775 */ | 684 | /* Pass mute onto any WM8775 */ |
| 685 | if ((core->board.audio_chip == V4L2_IDENT_WM8775) && | 685 | if (core->sd_wm8775 && ((1<<6) == bit)) |
| 686 | ((1<<6) == bit)) | ||
| 687 | wm8775_s_ctrl(core, V4L2_CID_AUDIO_MUTE, 0 != (vol & bit)); | 686 | wm8775_s_ctrl(core, V4L2_CID_AUDIO_MUTE, 0 != (vol & bit)); |
| 688 | ret = 1; | 687 | ret = 1; |
| 689 | } | 688 | } |
| @@ -903,7 +902,7 @@ static int cx88_audio_initdev(struct pci_dev *pci, | |||
| 903 | goto error; | 902 | goto error; |
| 904 | 903 | ||
| 905 | /* If there's a wm8775 then add a Line-In ALC switch */ | 904 | /* If there's a wm8775 then add a Line-In ALC switch */ |
| 906 | if (core->board.audio_chip == V4L2_IDENT_WM8775) | 905 | if (core->sd_wm8775) |
| 907 | snd_ctl_add(card, snd_ctl_new1(&snd_cx88_alc_switch, chip)); | 906 | snd_ctl_add(card, snd_ctl_new1(&snd_cx88_alc_switch, chip)); |
| 908 | 907 | ||
| 909 | strcpy (card->driver, "CX88x"); | 908 | strcpy (card->driver, "CX88x"); |
diff --git a/drivers/media/pci/cx88/cx88-video.c b/drivers/media/pci/cx88/cx88-video.c index 1b00615fd395..c7a9be1065c0 100644 --- a/drivers/media/pci/cx88/cx88-video.c +++ b/drivers/media/pci/cx88/cx88-video.c | |||
| @@ -385,8 +385,7 @@ int cx88_video_mux(struct cx88_core *core, unsigned int input) | |||
| 385 | /* The wm8775 module has the "2" route hardwired into | 385 | /* The wm8775 module has the "2" route hardwired into |
| 386 | the initialization. Some boards may use different | 386 | the initialization. Some boards may use different |
| 387 | routes for different inputs. HVR-1300 surely does */ | 387 | routes for different inputs. HVR-1300 surely does */ |
| 388 | if (core->board.audio_chip && | 388 | if (core->sd_wm8775) { |
| 389 | core->board.audio_chip == V4L2_IDENT_WM8775) { | ||
| 390 | call_all(core, audio, s_routing, | 389 | call_all(core, audio, s_routing, |
| 391 | INPUT(input).audioroute, 0, 0); | 390 | INPUT(input).audioroute, 0, 0); |
| 392 | } | 391 | } |
| @@ -771,8 +770,7 @@ static int video_open(struct file *file) | |||
| 771 | cx_write(MO_GP1_IO, core->board.radio.gpio1); | 770 | cx_write(MO_GP1_IO, core->board.radio.gpio1); |
| 772 | cx_write(MO_GP2_IO, core->board.radio.gpio2); | 771 | cx_write(MO_GP2_IO, core->board.radio.gpio2); |
| 773 | if (core->board.radio.audioroute) { | 772 | if (core->board.radio.audioroute) { |
| 774 | if(core->board.audio_chip && | 773 | if (core->sd_wm8775) { |
| 775 | core->board.audio_chip == V4L2_IDENT_WM8775) { | ||
| 776 | call_all(core, audio, s_routing, | 774 | call_all(core, audio, s_routing, |
| 777 | core->board.radio.audioroute, 0, 0); | 775 | core->board.radio.audioroute, 0, 0); |
| 778 | } | 776 | } |
| @@ -959,7 +957,7 @@ static int cx8800_s_aud_ctrl(struct v4l2_ctrl *ctrl) | |||
| 959 | u32 value,mask; | 957 | u32 value,mask; |
| 960 | 958 | ||
| 961 | /* Pass changes onto any WM8775 */ | 959 | /* Pass changes onto any WM8775 */ |
| 962 | if (core->board.audio_chip == V4L2_IDENT_WM8775) { | 960 | if (core->sd_wm8775) { |
| 963 | switch (ctrl->id) { | 961 | switch (ctrl->id) { |
| 964 | case V4L2_CID_AUDIO_MUTE: | 962 | case V4L2_CID_AUDIO_MUTE: |
| 965 | wm8775_s_ctrl(core, ctrl->id, ctrl->val); | 963 | wm8775_s_ctrl(core, ctrl->id, ctrl->val); |
diff --git a/drivers/media/platform/coda.c b/drivers/media/platform/coda.c index 48b8d7af386d..9d1481a60bd9 100644 --- a/drivers/media/platform/coda.c +++ b/drivers/media/platform/coda.c | |||
| @@ -576,6 +576,14 @@ static int vidioc_dqbuf(struct file *file, void *priv, struct v4l2_buffer *buf) | |||
| 576 | return v4l2_m2m_dqbuf(file, ctx->m2m_ctx, buf); | 576 | return v4l2_m2m_dqbuf(file, ctx->m2m_ctx, buf); |
| 577 | } | 577 | } |
| 578 | 578 | ||
| 579 | static int vidioc_create_bufs(struct file *file, void *priv, | ||
| 580 | struct v4l2_create_buffers *create) | ||
| 581 | { | ||
| 582 | struct coda_ctx *ctx = fh_to_ctx(priv); | ||
| 583 | |||
| 584 | return v4l2_m2m_create_bufs(file, ctx->m2m_ctx, create); | ||
| 585 | } | ||
| 586 | |||
| 579 | static int vidioc_streamon(struct file *file, void *priv, | 587 | static int vidioc_streamon(struct file *file, void *priv, |
| 580 | enum v4l2_buf_type type) | 588 | enum v4l2_buf_type type) |
| 581 | { | 589 | { |
| @@ -610,6 +618,7 @@ static const struct v4l2_ioctl_ops coda_ioctl_ops = { | |||
| 610 | 618 | ||
| 611 | .vidioc_qbuf = vidioc_qbuf, | 619 | .vidioc_qbuf = vidioc_qbuf, |
| 612 | .vidioc_dqbuf = vidioc_dqbuf, | 620 | .vidioc_dqbuf = vidioc_dqbuf, |
| 621 | .vidioc_create_bufs = vidioc_create_bufs, | ||
| 613 | 622 | ||
| 614 | .vidioc_streamon = vidioc_streamon, | 623 | .vidioc_streamon = vidioc_streamon, |
| 615 | .vidioc_streamoff = vidioc_streamoff, | 624 | .vidioc_streamoff = vidioc_streamoff, |
diff --git a/drivers/media/platform/davinci/vpbe_display.c b/drivers/media/platform/davinci/vpbe_display.c index 1802f11e939f..d0b375cf565f 100644 --- a/drivers/media/platform/davinci/vpbe_display.c +++ b/drivers/media/platform/davinci/vpbe_display.c | |||
| @@ -916,6 +916,21 @@ static int vpbe_display_s_fmt(struct file *file, void *priv, | |||
| 916 | other video window */ | 916 | other video window */ |
| 917 | 917 | ||
| 918 | layer->pix_fmt = *pixfmt; | 918 | layer->pix_fmt = *pixfmt; |
| 919 | if (pixfmt->pixelformat == V4L2_PIX_FMT_NV12) { | ||
| 920 | struct vpbe_layer *otherlayer; | ||
| 921 | |||
| 922 | otherlayer = _vpbe_display_get_other_win_layer(disp_dev, layer); | ||
| 923 | /* if other layer is available, only | ||
| 924 | * claim it, do not configure it | ||
| 925 | */ | ||
| 926 | ret = osd_device->ops.request_layer(osd_device, | ||
| 927 | otherlayer->layer_info.id); | ||
| 928 | if (ret < 0) { | ||
| 929 | v4l2_err(&vpbe_dev->v4l2_dev, | ||
| 930 | "Display Manager failed to allocate layer\n"); | ||
| 931 | return -EBUSY; | ||
| 932 | } | ||
| 933 | } | ||
| 919 | 934 | ||
| 920 | /* Get osd layer config */ | 935 | /* Get osd layer config */ |
| 921 | osd_device->ops.get_layer_config(osd_device, | 936 | osd_device->ops.get_layer_config(osd_device, |
diff --git a/drivers/media/platform/davinci/vpfe_capture.c b/drivers/media/platform/davinci/vpfe_capture.c index 8c50d3074866..93609091cb23 100644 --- a/drivers/media/platform/davinci/vpfe_capture.c +++ b/drivers/media/platform/davinci/vpfe_capture.c | |||
| @@ -1837,7 +1837,7 @@ static int vpfe_probe(struct platform_device *pdev) | |||
| 1837 | if (NULL == ccdc_cfg) { | 1837 | if (NULL == ccdc_cfg) { |
| 1838 | v4l2_err(pdev->dev.driver, | 1838 | v4l2_err(pdev->dev.driver, |
| 1839 | "Memory allocation failed for ccdc_cfg\n"); | 1839 | "Memory allocation failed for ccdc_cfg\n"); |
| 1840 | goto probe_free_lock; | 1840 | goto probe_free_dev_mem; |
| 1841 | } | 1841 | } |
| 1842 | 1842 | ||
| 1843 | mutex_lock(&ccdc_lock); | 1843 | mutex_lock(&ccdc_lock); |
| @@ -1991,7 +1991,6 @@ probe_out_release_irq: | |||
| 1991 | free_irq(vpfe_dev->ccdc_irq0, vpfe_dev); | 1991 | free_irq(vpfe_dev->ccdc_irq0, vpfe_dev); |
| 1992 | probe_free_ccdc_cfg_mem: | 1992 | probe_free_ccdc_cfg_mem: |
| 1993 | kfree(ccdc_cfg); | 1993 | kfree(ccdc_cfg); |
| 1994 | probe_free_lock: | ||
| 1995 | mutex_unlock(&ccdc_lock); | 1994 | mutex_unlock(&ccdc_lock); |
| 1996 | probe_free_dev_mem: | 1995 | probe_free_dev_mem: |
| 1997 | kfree(vpfe_dev); | 1996 | kfree(vpfe_dev); |
diff --git a/drivers/media/platform/exynos4-is/fimc-is-regs.c b/drivers/media/platform/exynos4-is/fimc-is-regs.c index b0ff67bc1b05..d05eaa2c8490 100644 --- a/drivers/media/platform/exynos4-is/fimc-is-regs.c +++ b/drivers/media/platform/exynos4-is/fimc-is-regs.c | |||
| @@ -174,7 +174,7 @@ int fimc_is_hw_change_mode(struct fimc_is *is) | |||
| 174 | HIC_CAPTURE_STILL, HIC_CAPTURE_VIDEO, | 174 | HIC_CAPTURE_STILL, HIC_CAPTURE_VIDEO, |
| 175 | }; | 175 | }; |
| 176 | 176 | ||
| 177 | if (WARN_ON(is->config_index > ARRAY_SIZE(cmd))) | 177 | if (WARN_ON(is->config_index >= ARRAY_SIZE(cmd))) |
| 178 | return -EINVAL; | 178 | return -EINVAL; |
| 179 | 179 | ||
| 180 | mcuctl_write(cmd[is->config_index], is, MCUCTL_REG_ISSR(0)); | 180 | mcuctl_write(cmd[is->config_index], is, MCUCTL_REG_ISSR(0)); |
diff --git a/drivers/media/platform/exynos4-is/fimc-is.c b/drivers/media/platform/exynos4-is/fimc-is.c index 47c6363d04e2..520e4398b69c 100644 --- a/drivers/media/platform/exynos4-is/fimc-is.c +++ b/drivers/media/platform/exynos4-is/fimc-is.c | |||
| @@ -48,7 +48,6 @@ static char *fimc_is_clocks[ISS_CLKS_MAX] = { | |||
| 48 | [ISS_CLK_LITE0] = "lite0", | 48 | [ISS_CLK_LITE0] = "lite0", |
| 49 | [ISS_CLK_LITE1] = "lite1", | 49 | [ISS_CLK_LITE1] = "lite1", |
| 50 | [ISS_CLK_MPLL] = "mpll", | 50 | [ISS_CLK_MPLL] = "mpll", |
| 51 | [ISS_CLK_SYSREG] = "sysreg", | ||
| 52 | [ISS_CLK_ISP] = "isp", | 51 | [ISS_CLK_ISP] = "isp", |
| 53 | [ISS_CLK_DRC] = "drc", | 52 | [ISS_CLK_DRC] = "drc", |
| 54 | [ISS_CLK_FD] = "fd", | 53 | [ISS_CLK_FD] = "fd", |
| @@ -71,7 +70,6 @@ static void fimc_is_put_clocks(struct fimc_is *is) | |||
| 71 | for (i = 0; i < ISS_CLKS_MAX; i++) { | 70 | for (i = 0; i < ISS_CLKS_MAX; i++) { |
| 72 | if (IS_ERR(is->clocks[i])) | 71 | if (IS_ERR(is->clocks[i])) |
| 73 | continue; | 72 | continue; |
| 74 | clk_unprepare(is->clocks[i]); | ||
| 75 | clk_put(is->clocks[i]); | 73 | clk_put(is->clocks[i]); |
| 76 | is->clocks[i] = ERR_PTR(-EINVAL); | 74 | is->clocks[i] = ERR_PTR(-EINVAL); |
| 77 | } | 75 | } |
| @@ -90,12 +88,6 @@ static int fimc_is_get_clocks(struct fimc_is *is) | |||
| 90 | ret = PTR_ERR(is->clocks[i]); | 88 | ret = PTR_ERR(is->clocks[i]); |
| 91 | goto err; | 89 | goto err; |
| 92 | } | 90 | } |
| 93 | ret = clk_prepare(is->clocks[i]); | ||
| 94 | if (ret < 0) { | ||
| 95 | clk_put(is->clocks[i]); | ||
| 96 | is->clocks[i] = ERR_PTR(-EINVAL); | ||
| 97 | goto err; | ||
| 98 | } | ||
| 99 | } | 91 | } |
| 100 | 92 | ||
| 101 | return 0; | 93 | return 0; |
| @@ -103,7 +95,7 @@ err: | |||
| 103 | fimc_is_put_clocks(is); | 95 | fimc_is_put_clocks(is); |
| 104 | dev_err(&is->pdev->dev, "failed to get clock: %s\n", | 96 | dev_err(&is->pdev->dev, "failed to get clock: %s\n", |
| 105 | fimc_is_clocks[i]); | 97 | fimc_is_clocks[i]); |
| 106 | return -ENXIO; | 98 | return ret; |
| 107 | } | 99 | } |
| 108 | 100 | ||
| 109 | static int fimc_is_setup_clocks(struct fimc_is *is) | 101 | static int fimc_is_setup_clocks(struct fimc_is *is) |
| @@ -144,7 +136,7 @@ int fimc_is_enable_clocks(struct fimc_is *is) | |||
| 144 | for (i = 0; i < ISS_GATE_CLKS_MAX; i++) { | 136 | for (i = 0; i < ISS_GATE_CLKS_MAX; i++) { |
| 145 | if (IS_ERR(is->clocks[i])) | 137 | if (IS_ERR(is->clocks[i])) |
| 146 | continue; | 138 | continue; |
| 147 | ret = clk_enable(is->clocks[i]); | 139 | ret = clk_prepare_enable(is->clocks[i]); |
| 148 | if (ret < 0) { | 140 | if (ret < 0) { |
| 149 | dev_err(&is->pdev->dev, "clock %s enable failed\n", | 141 | dev_err(&is->pdev->dev, "clock %s enable failed\n", |
| 150 | fimc_is_clocks[i]); | 142 | fimc_is_clocks[i]); |
| @@ -163,7 +155,7 @@ void fimc_is_disable_clocks(struct fimc_is *is) | |||
| 163 | 155 | ||
| 164 | for (i = 0; i < ISS_GATE_CLKS_MAX; i++) { | 156 | for (i = 0; i < ISS_GATE_CLKS_MAX; i++) { |
| 165 | if (!IS_ERR(is->clocks[i])) { | 157 | if (!IS_ERR(is->clocks[i])) { |
| 166 | clk_disable(is->clocks[i]); | 158 | clk_disable_unprepare(is->clocks[i]); |
| 167 | pr_debug("disabled clock: %s\n", fimc_is_clocks[i]); | 159 | pr_debug("disabled clock: %s\n", fimc_is_clocks[i]); |
| 168 | } | 160 | } |
| 169 | } | 161 | } |
| @@ -326,6 +318,11 @@ int fimc_is_start_firmware(struct fimc_is *is) | |||
| 326 | struct device *dev = &is->pdev->dev; | 318 | struct device *dev = &is->pdev->dev; |
| 327 | int ret; | 319 | int ret; |
| 328 | 320 | ||
| 321 | if (is->fw.f_w == NULL) { | ||
| 322 | dev_err(dev, "firmware is not loaded\n"); | ||
| 323 | return -EINVAL; | ||
| 324 | } | ||
| 325 | |||
| 329 | memcpy(is->memory.vaddr, is->fw.f_w->data, is->fw.f_w->size); | 326 | memcpy(is->memory.vaddr, is->fw.f_w->data, is->fw.f_w->size); |
| 330 | wmb(); | 327 | wmb(); |
| 331 | 328 | ||
| @@ -941,7 +938,8 @@ static int fimc_is_remove(struct platform_device *pdev) | |||
| 941 | vb2_dma_contig_cleanup_ctx(is->alloc_ctx); | 938 | vb2_dma_contig_cleanup_ctx(is->alloc_ctx); |
| 942 | fimc_is_put_clocks(is); | 939 | fimc_is_put_clocks(is); |
| 943 | fimc_is_debugfs_remove(is); | 940 | fimc_is_debugfs_remove(is); |
| 944 | release_firmware(is->fw.f_w); | 941 | if (is->fw.f_w) |
| 942 | release_firmware(is->fw.f_w); | ||
| 945 | fimc_is_free_cpu_memory(is); | 943 | fimc_is_free_cpu_memory(is); |
| 946 | 944 | ||
| 947 | return 0; | 945 | return 0; |
diff --git a/drivers/media/platform/exynos4-is/fimc-is.h b/drivers/media/platform/exynos4-is/fimc-is.h index f5275a5b0156..606a7c9fe526 100644 --- a/drivers/media/platform/exynos4-is/fimc-is.h +++ b/drivers/media/platform/exynos4-is/fimc-is.h | |||
| @@ -73,7 +73,6 @@ enum { | |||
| 73 | ISS_CLK_LITE0, | 73 | ISS_CLK_LITE0, |
| 74 | ISS_CLK_LITE1, | 74 | ISS_CLK_LITE1, |
| 75 | ISS_CLK_MPLL, | 75 | ISS_CLK_MPLL, |
| 76 | ISS_CLK_SYSREG, | ||
| 77 | ISS_CLK_ISP, | 76 | ISS_CLK_ISP, |
| 78 | ISS_CLK_DRC, | 77 | ISS_CLK_DRC, |
| 79 | ISS_CLK_FD, | 78 | ISS_CLK_FD, |
diff --git a/drivers/media/platform/exynos4-is/fimc-isp.c b/drivers/media/platform/exynos4-is/fimc-isp.c index d63947f7b302..7ede30b5910f 100644 --- a/drivers/media/platform/exynos4-is/fimc-isp.c +++ b/drivers/media/platform/exynos4-is/fimc-isp.c | |||
| @@ -138,7 +138,7 @@ static int fimc_isp_subdev_get_fmt(struct v4l2_subdev *sd, | |||
| 138 | return 0; | 138 | return 0; |
| 139 | } | 139 | } |
| 140 | 140 | ||
| 141 | mf->colorspace = V4L2_COLORSPACE_JPEG; | 141 | mf->colorspace = V4L2_COLORSPACE_SRGB; |
| 142 | 142 | ||
| 143 | mutex_lock(&isp->subdev_lock); | 143 | mutex_lock(&isp->subdev_lock); |
| 144 | __is_get_frame_size(is, &cur_fmt); | 144 | __is_get_frame_size(is, &cur_fmt); |
| @@ -194,7 +194,7 @@ static int fimc_isp_subdev_set_fmt(struct v4l2_subdev *sd, | |||
| 194 | v4l2_dbg(1, debug, sd, "%s: pad%d: code: 0x%x, %dx%d\n", | 194 | v4l2_dbg(1, debug, sd, "%s: pad%d: code: 0x%x, %dx%d\n", |
| 195 | __func__, fmt->pad, mf->code, mf->width, mf->height); | 195 | __func__, fmt->pad, mf->code, mf->width, mf->height); |
| 196 | 196 | ||
| 197 | mf->colorspace = V4L2_COLORSPACE_JPEG; | 197 | mf->colorspace = V4L2_COLORSPACE_SRGB; |
| 198 | 198 | ||
| 199 | mutex_lock(&isp->subdev_lock); | 199 | mutex_lock(&isp->subdev_lock); |
| 200 | __isp_subdev_try_format(isp, fmt); | 200 | __isp_subdev_try_format(isp, fmt); |
diff --git a/drivers/media/platform/exynos4-is/mipi-csis.c b/drivers/media/platform/exynos4-is/mipi-csis.c index a2eda9d5ac87..254d70fe762a 100644 --- a/drivers/media/platform/exynos4-is/mipi-csis.c +++ b/drivers/media/platform/exynos4-is/mipi-csis.c | |||
| @@ -746,7 +746,7 @@ static int s5pcsis_parse_dt(struct platform_device *pdev, | |||
| 746 | node = v4l2_of_get_next_endpoint(node, NULL); | 746 | node = v4l2_of_get_next_endpoint(node, NULL); |
| 747 | if (!node) { | 747 | if (!node) { |
| 748 | dev_err(&pdev->dev, "No port node at %s\n", | 748 | dev_err(&pdev->dev, "No port node at %s\n", |
| 749 | node->full_name); | 749 | pdev->dev.of_node->full_name); |
| 750 | return -EINVAL; | 750 | return -EINVAL; |
| 751 | } | 751 | } |
| 752 | /* Get port node and validate MIPI-CSI channel id. */ | 752 | /* Get port node and validate MIPI-CSI channel id. */ |
diff --git a/drivers/media/platform/s3c-camif/camif-core.h b/drivers/media/platform/s3c-camif/camif-core.h index 261134baa655..35d2fcdc0036 100644 --- a/drivers/media/platform/s3c-camif/camif-core.h +++ b/drivers/media/platform/s3c-camif/camif-core.h | |||
| @@ -229,7 +229,7 @@ struct camif_vp { | |||
| 229 | unsigned int state; | 229 | unsigned int state; |
| 230 | u16 fmt_flags; | 230 | u16 fmt_flags; |
| 231 | u8 id; | 231 | u8 id; |
| 232 | u8 rotation; | 232 | u16 rotation; |
| 233 | u8 hflip; | 233 | u8 hflip; |
| 234 | u8 vflip; | 234 | u8 vflip; |
| 235 | unsigned int offset; | 235 | unsigned int offset; |
diff --git a/drivers/media/platform/s5p-mfc/s5p_mfc.c b/drivers/media/platform/s5p-mfc/s5p_mfc.c index 01f9ae0dadb0..d12faa691af8 100644 --- a/drivers/media/platform/s5p-mfc/s5p_mfc.c +++ b/drivers/media/platform/s5p-mfc/s5p_mfc.c | |||
| @@ -397,7 +397,7 @@ static void s5p_mfc_handle_frame(struct s5p_mfc_ctx *ctx, | |||
| 397 | leave_handle_frame: | 397 | leave_handle_frame: |
| 398 | spin_unlock_irqrestore(&dev->irqlock, flags); | 398 | spin_unlock_irqrestore(&dev->irqlock, flags); |
| 399 | if ((ctx->src_queue_cnt == 0 && ctx->state != MFCINST_FINISHING) | 399 | if ((ctx->src_queue_cnt == 0 && ctx->state != MFCINST_FINISHING) |
| 400 | || ctx->dst_queue_cnt < ctx->dpb_count) | 400 | || ctx->dst_queue_cnt < ctx->pb_count) |
| 401 | clear_work_bit(ctx); | 401 | clear_work_bit(ctx); |
| 402 | s5p_mfc_hw_call(dev->mfc_ops, clear_int_flags, dev); | 402 | s5p_mfc_hw_call(dev->mfc_ops, clear_int_flags, dev); |
| 403 | wake_up_ctx(ctx, reason, err); | 403 | wake_up_ctx(ctx, reason, err); |
| @@ -473,7 +473,7 @@ static void s5p_mfc_handle_seq_done(struct s5p_mfc_ctx *ctx, | |||
| 473 | 473 | ||
| 474 | s5p_mfc_hw_call(dev->mfc_ops, dec_calc_dpb_size, ctx); | 474 | s5p_mfc_hw_call(dev->mfc_ops, dec_calc_dpb_size, ctx); |
| 475 | 475 | ||
| 476 | ctx->dpb_count = s5p_mfc_hw_call(dev->mfc_ops, get_dpb_count, | 476 | ctx->pb_count = s5p_mfc_hw_call(dev->mfc_ops, get_dpb_count, |
| 477 | dev); | 477 | dev); |
| 478 | ctx->mv_count = s5p_mfc_hw_call(dev->mfc_ops, get_mv_count, | 478 | ctx->mv_count = s5p_mfc_hw_call(dev->mfc_ops, get_mv_count, |
| 479 | dev); | 479 | dev); |
| @@ -562,7 +562,7 @@ static void s5p_mfc_handle_stream_complete(struct s5p_mfc_ctx *ctx, | |||
| 562 | struct s5p_mfc_dev *dev = ctx->dev; | 562 | struct s5p_mfc_dev *dev = ctx->dev; |
| 563 | struct s5p_mfc_buf *mb_entry; | 563 | struct s5p_mfc_buf *mb_entry; |
| 564 | 564 | ||
| 565 | mfc_debug(2, "Stream completed"); | 565 | mfc_debug(2, "Stream completed\n"); |
| 566 | 566 | ||
| 567 | s5p_mfc_clear_int_flags(dev); | 567 | s5p_mfc_clear_int_flags(dev); |
| 568 | ctx->int_type = reason; | 568 | ctx->int_type = reason; |
| @@ -1362,7 +1362,6 @@ static struct s5p_mfc_variant mfc_drvdata_v5 = { | |||
| 1362 | .port_num = MFC_NUM_PORTS, | 1362 | .port_num = MFC_NUM_PORTS, |
| 1363 | .buf_size = &buf_size_v5, | 1363 | .buf_size = &buf_size_v5, |
| 1364 | .buf_align = &mfc_buf_align_v5, | 1364 | .buf_align = &mfc_buf_align_v5, |
| 1365 | .mclk_name = "sclk_mfc", | ||
| 1366 | .fw_name = "s5p-mfc.fw", | 1365 | .fw_name = "s5p-mfc.fw", |
| 1367 | }; | 1366 | }; |
| 1368 | 1367 | ||
| @@ -1389,7 +1388,6 @@ static struct s5p_mfc_variant mfc_drvdata_v6 = { | |||
| 1389 | .port_num = MFC_NUM_PORTS_V6, | 1388 | .port_num = MFC_NUM_PORTS_V6, |
| 1390 | .buf_size = &buf_size_v6, | 1389 | .buf_size = &buf_size_v6, |
| 1391 | .buf_align = &mfc_buf_align_v6, | 1390 | .buf_align = &mfc_buf_align_v6, |
| 1392 | .mclk_name = "aclk_333", | ||
| 1393 | .fw_name = "s5p-mfc-v6.fw", | 1391 | .fw_name = "s5p-mfc-v6.fw", |
| 1394 | }; | 1392 | }; |
| 1395 | 1393 | ||
diff --git a/drivers/media/platform/s5p-mfc/s5p_mfc_common.h b/drivers/media/platform/s5p-mfc/s5p_mfc_common.h index 202d1d7a37a8..ef4074cd5316 100644 --- a/drivers/media/platform/s5p-mfc/s5p_mfc_common.h +++ b/drivers/media/platform/s5p-mfc/s5p_mfc_common.h | |||
| @@ -138,6 +138,7 @@ enum s5p_mfc_inst_state { | |||
| 138 | MFCINST_INIT = 100, | 138 | MFCINST_INIT = 100, |
| 139 | MFCINST_GOT_INST, | 139 | MFCINST_GOT_INST, |
| 140 | MFCINST_HEAD_PARSED, | 140 | MFCINST_HEAD_PARSED, |
| 141 | MFCINST_HEAD_PRODUCED, | ||
| 141 | MFCINST_BUFS_SET, | 142 | MFCINST_BUFS_SET, |
| 142 | MFCINST_RUNNING, | 143 | MFCINST_RUNNING, |
| 143 | MFCINST_FINISHING, | 144 | MFCINST_FINISHING, |
| @@ -231,7 +232,6 @@ struct s5p_mfc_variant { | |||
| 231 | unsigned int port_num; | 232 | unsigned int port_num; |
| 232 | struct s5p_mfc_buf_size *buf_size; | 233 | struct s5p_mfc_buf_size *buf_size; |
| 233 | struct s5p_mfc_buf_align *buf_align; | 234 | struct s5p_mfc_buf_align *buf_align; |
| 234 | char *mclk_name; | ||
| 235 | char *fw_name; | 235 | char *fw_name; |
| 236 | }; | 236 | }; |
| 237 | 237 | ||
| @@ -438,7 +438,7 @@ struct s5p_mfc_enc_params { | |||
| 438 | u32 rc_framerate_num; | 438 | u32 rc_framerate_num; |
| 439 | u32 rc_framerate_denom; | 439 | u32 rc_framerate_denom; |
| 440 | 440 | ||
| 441 | union { | 441 | struct { |
| 442 | struct s5p_mfc_h264_enc_params h264; | 442 | struct s5p_mfc_h264_enc_params h264; |
| 443 | struct s5p_mfc_mpeg4_enc_params mpeg4; | 443 | struct s5p_mfc_mpeg4_enc_params mpeg4; |
| 444 | } codec; | 444 | } codec; |
| @@ -602,7 +602,7 @@ struct s5p_mfc_ctx { | |||
| 602 | int after_packed_pb; | 602 | int after_packed_pb; |
| 603 | int sei_fp_parse; | 603 | int sei_fp_parse; |
| 604 | 604 | ||
| 605 | int dpb_count; | 605 | int pb_count; |
| 606 | int total_dpb_count; | 606 | int total_dpb_count; |
| 607 | int mv_count; | 607 | int mv_count; |
| 608 | /* Buffers */ | 608 | /* Buffers */ |
diff --git a/drivers/media/platform/s5p-mfc/s5p_mfc_ctrl.c b/drivers/media/platform/s5p-mfc/s5p_mfc_ctrl.c index 2e5f30b40dea..dc1fc94a488d 100644 --- a/drivers/media/platform/s5p-mfc/s5p_mfc_ctrl.c +++ b/drivers/media/platform/s5p-mfc/s5p_mfc_ctrl.c | |||
| @@ -38,7 +38,7 @@ int s5p_mfc_alloc_firmware(struct s5p_mfc_dev *dev) | |||
| 38 | dev->fw_virt_addr = dma_alloc_coherent(dev->mem_dev_l, dev->fw_size, | 38 | dev->fw_virt_addr = dma_alloc_coherent(dev->mem_dev_l, dev->fw_size, |
| 39 | &dev->bank1, GFP_KERNEL); | 39 | &dev->bank1, GFP_KERNEL); |
| 40 | 40 | ||
| 41 | if (IS_ERR(dev->fw_virt_addr)) { | 41 | if (IS_ERR_OR_NULL(dev->fw_virt_addr)) { |
| 42 | dev->fw_virt_addr = NULL; | 42 | dev->fw_virt_addr = NULL; |
| 43 | mfc_err("Allocating bitprocessor buffer failed\n"); | 43 | mfc_err("Allocating bitprocessor buffer failed\n"); |
| 44 | return -ENOMEM; | 44 | return -ENOMEM; |
diff --git a/drivers/media/platform/s5p-mfc/s5p_mfc_debug.h b/drivers/media/platform/s5p-mfc/s5p_mfc_debug.h index bd5cd4ae993c..8e608f5aa0d7 100644 --- a/drivers/media/platform/s5p-mfc/s5p_mfc_debug.h +++ b/drivers/media/platform/s5p-mfc/s5p_mfc_debug.h | |||
| @@ -30,8 +30,8 @@ extern int debug; | |||
| 30 | #define mfc_debug(level, fmt, args...) | 30 | #define mfc_debug(level, fmt, args...) |
| 31 | #endif | 31 | #endif |
| 32 | 32 | ||
| 33 | #define mfc_debug_enter() mfc_debug(5, "enter") | 33 | #define mfc_debug_enter() mfc_debug(5, "enter\n") |
| 34 | #define mfc_debug_leave() mfc_debug(5, "leave") | 34 | #define mfc_debug_leave() mfc_debug(5, "leave\n") |
| 35 | 35 | ||
| 36 | #define mfc_err(fmt, args...) \ | 36 | #define mfc_err(fmt, args...) \ |
| 37 | do { \ | 37 | do { \ |
diff --git a/drivers/media/platform/s5p-mfc/s5p_mfc_dec.c b/drivers/media/platform/s5p-mfc/s5p_mfc_dec.c index 4af53bd2f182..00b07032f4f0 100644 --- a/drivers/media/platform/s5p-mfc/s5p_mfc_dec.c +++ b/drivers/media/platform/s5p-mfc/s5p_mfc_dec.c | |||
| @@ -210,11 +210,11 @@ static int s5p_mfc_ctx_ready(struct s5p_mfc_ctx *ctx) | |||
| 210 | /* Context is to decode a frame */ | 210 | /* Context is to decode a frame */ |
| 211 | if (ctx->src_queue_cnt >= 1 && | 211 | if (ctx->src_queue_cnt >= 1 && |
| 212 | ctx->state == MFCINST_RUNNING && | 212 | ctx->state == MFCINST_RUNNING && |
| 213 | ctx->dst_queue_cnt >= ctx->dpb_count) | 213 | ctx->dst_queue_cnt >= ctx->pb_count) |
| 214 | return 1; | 214 | return 1; |
| 215 | /* Context is to return last frame */ | 215 | /* Context is to return last frame */ |
| 216 | if (ctx->state == MFCINST_FINISHING && | 216 | if (ctx->state == MFCINST_FINISHING && |
| 217 | ctx->dst_queue_cnt >= ctx->dpb_count) | 217 | ctx->dst_queue_cnt >= ctx->pb_count) |
| 218 | return 1; | 218 | return 1; |
| 219 | /* Context is to set buffers */ | 219 | /* Context is to set buffers */ |
| 220 | if (ctx->src_queue_cnt >= 1 && | 220 | if (ctx->src_queue_cnt >= 1 && |
| @@ -224,7 +224,7 @@ static int s5p_mfc_ctx_ready(struct s5p_mfc_ctx *ctx) | |||
| 224 | /* Resolution change */ | 224 | /* Resolution change */ |
| 225 | if ((ctx->state == MFCINST_RES_CHANGE_INIT || | 225 | if ((ctx->state == MFCINST_RES_CHANGE_INIT || |
| 226 | ctx->state == MFCINST_RES_CHANGE_FLUSH) && | 226 | ctx->state == MFCINST_RES_CHANGE_FLUSH) && |
| 227 | ctx->dst_queue_cnt >= ctx->dpb_count) | 227 | ctx->dst_queue_cnt >= ctx->pb_count) |
| 228 | return 1; | 228 | return 1; |
| 229 | if (ctx->state == MFCINST_RES_CHANGE_END && | 229 | if (ctx->state == MFCINST_RES_CHANGE_END && |
| 230 | ctx->src_queue_cnt >= 1) | 230 | ctx->src_queue_cnt >= 1) |
| @@ -537,7 +537,7 @@ static int vidioc_reqbufs(struct file *file, void *priv, | |||
| 537 | mfc_err("vb2_reqbufs on capture failed\n"); | 537 | mfc_err("vb2_reqbufs on capture failed\n"); |
| 538 | return ret; | 538 | return ret; |
| 539 | } | 539 | } |
| 540 | if (reqbufs->count < ctx->dpb_count) { | 540 | if (reqbufs->count < ctx->pb_count) { |
| 541 | mfc_err("Not enough buffers allocated\n"); | 541 | mfc_err("Not enough buffers allocated\n"); |
| 542 | reqbufs->count = 0; | 542 | reqbufs->count = 0; |
| 543 | s5p_mfc_clock_on(); | 543 | s5p_mfc_clock_on(); |
| @@ -751,7 +751,7 @@ static int s5p_mfc_dec_g_v_ctrl(struct v4l2_ctrl *ctrl) | |||
| 751 | case V4L2_CID_MIN_BUFFERS_FOR_CAPTURE: | 751 | case V4L2_CID_MIN_BUFFERS_FOR_CAPTURE: |
| 752 | if (ctx->state >= MFCINST_HEAD_PARSED && | 752 | if (ctx->state >= MFCINST_HEAD_PARSED && |
| 753 | ctx->state < MFCINST_ABORT) { | 753 | ctx->state < MFCINST_ABORT) { |
| 754 | ctrl->val = ctx->dpb_count; | 754 | ctrl->val = ctx->pb_count; |
| 755 | break; | 755 | break; |
| 756 | } else if (ctx->state != MFCINST_INIT) { | 756 | } else if (ctx->state != MFCINST_INIT) { |
| 757 | v4l2_err(&dev->v4l2_dev, "Decoding not initialised\n"); | 757 | v4l2_err(&dev->v4l2_dev, "Decoding not initialised\n"); |
| @@ -763,7 +763,7 @@ static int s5p_mfc_dec_g_v_ctrl(struct v4l2_ctrl *ctrl) | |||
| 763 | S5P_MFC_R2H_CMD_SEQ_DONE_RET, 0); | 763 | S5P_MFC_R2H_CMD_SEQ_DONE_RET, 0); |
| 764 | if (ctx->state >= MFCINST_HEAD_PARSED && | 764 | if (ctx->state >= MFCINST_HEAD_PARSED && |
| 765 | ctx->state < MFCINST_ABORT) { | 765 | ctx->state < MFCINST_ABORT) { |
| 766 | ctrl->val = ctx->dpb_count; | 766 | ctrl->val = ctx->pb_count; |
| 767 | } else { | 767 | } else { |
| 768 | v4l2_err(&dev->v4l2_dev, "Decoding not initialised\n"); | 768 | v4l2_err(&dev->v4l2_dev, "Decoding not initialised\n"); |
| 769 | return -EINVAL; | 769 | return -EINVAL; |
| @@ -924,10 +924,10 @@ static int s5p_mfc_queue_setup(struct vb2_queue *vq, | |||
| 924 | /* Output plane count is 2 - one for Y and one for CbCr */ | 924 | /* Output plane count is 2 - one for Y and one for CbCr */ |
| 925 | *plane_count = 2; | 925 | *plane_count = 2; |
| 926 | /* Setup buffer count */ | 926 | /* Setup buffer count */ |
| 927 | if (*buf_count < ctx->dpb_count) | 927 | if (*buf_count < ctx->pb_count) |
| 928 | *buf_count = ctx->dpb_count; | 928 | *buf_count = ctx->pb_count; |
| 929 | if (*buf_count > ctx->dpb_count + MFC_MAX_EXTRA_DPB) | 929 | if (*buf_count > ctx->pb_count + MFC_MAX_EXTRA_DPB) |
| 930 | *buf_count = ctx->dpb_count + MFC_MAX_EXTRA_DPB; | 930 | *buf_count = ctx->pb_count + MFC_MAX_EXTRA_DPB; |
| 931 | if (*buf_count > MFC_MAX_BUFFERS) | 931 | if (*buf_count > MFC_MAX_BUFFERS) |
| 932 | *buf_count = MFC_MAX_BUFFERS; | 932 | *buf_count = MFC_MAX_BUFFERS; |
| 933 | } else { | 933 | } else { |
diff --git a/drivers/media/platform/s5p-mfc/s5p_mfc_enc.c b/drivers/media/platform/s5p-mfc/s5p_mfc_enc.c index 4f6b553c4b2d..2549967b2f85 100644 --- a/drivers/media/platform/s5p-mfc/s5p_mfc_enc.c +++ b/drivers/media/platform/s5p-mfc/s5p_mfc_enc.c | |||
| @@ -592,7 +592,7 @@ static int s5p_mfc_ctx_ready(struct s5p_mfc_ctx *ctx) | |||
| 592 | return 1; | 592 | return 1; |
| 593 | /* context is ready to encode a frame */ | 593 | /* context is ready to encode a frame */ |
| 594 | if ((ctx->state == MFCINST_RUNNING || | 594 | if ((ctx->state == MFCINST_RUNNING || |
| 595 | ctx->state == MFCINST_HEAD_PARSED) && | 595 | ctx->state == MFCINST_HEAD_PRODUCED) && |
| 596 | ctx->src_queue_cnt >= 1 && ctx->dst_queue_cnt >= 1) | 596 | ctx->src_queue_cnt >= 1 && ctx->dst_queue_cnt >= 1) |
| 597 | return 1; | 597 | return 1; |
| 598 | /* context is ready to encode remaining frames */ | 598 | /* context is ready to encode remaining frames */ |
| @@ -649,6 +649,7 @@ static int enc_post_seq_start(struct s5p_mfc_ctx *ctx) | |||
| 649 | struct s5p_mfc_enc_params *p = &ctx->enc_params; | 649 | struct s5p_mfc_enc_params *p = &ctx->enc_params; |
| 650 | struct s5p_mfc_buf *dst_mb; | 650 | struct s5p_mfc_buf *dst_mb; |
| 651 | unsigned long flags; | 651 | unsigned long flags; |
| 652 | unsigned int enc_pb_count; | ||
| 652 | 653 | ||
| 653 | if (p->seq_hdr_mode == V4L2_MPEG_VIDEO_HEADER_MODE_SEPARATE) { | 654 | if (p->seq_hdr_mode == V4L2_MPEG_VIDEO_HEADER_MODE_SEPARATE) { |
| 654 | spin_lock_irqsave(&dev->irqlock, flags); | 655 | spin_lock_irqsave(&dev->irqlock, flags); |
| @@ -661,18 +662,19 @@ static int enc_post_seq_start(struct s5p_mfc_ctx *ctx) | |||
| 661 | vb2_buffer_done(dst_mb->b, VB2_BUF_STATE_DONE); | 662 | vb2_buffer_done(dst_mb->b, VB2_BUF_STATE_DONE); |
| 662 | spin_unlock_irqrestore(&dev->irqlock, flags); | 663 | spin_unlock_irqrestore(&dev->irqlock, flags); |
| 663 | } | 664 | } |
| 664 | if (IS_MFCV6(dev)) { | 665 | |
| 665 | ctx->state = MFCINST_HEAD_PARSED; /* for INIT_BUFFER cmd */ | 666 | if (!IS_MFCV6(dev)) { |
| 666 | } else { | ||
| 667 | ctx->state = MFCINST_RUNNING; | 667 | ctx->state = MFCINST_RUNNING; |
| 668 | if (s5p_mfc_ctx_ready(ctx)) | 668 | if (s5p_mfc_ctx_ready(ctx)) |
| 669 | set_work_bit_irqsave(ctx); | 669 | set_work_bit_irqsave(ctx); |
| 670 | s5p_mfc_hw_call(dev->mfc_ops, try_run, dev); | 670 | s5p_mfc_hw_call(dev->mfc_ops, try_run, dev); |
| 671 | } | 671 | } else { |
| 672 | 672 | enc_pb_count = s5p_mfc_hw_call(dev->mfc_ops, | |
| 673 | if (IS_MFCV6(dev)) | ||
| 674 | ctx->dpb_count = s5p_mfc_hw_call(dev->mfc_ops, | ||
| 675 | get_enc_dpb_count, dev); | 673 | get_enc_dpb_count, dev); |
| 674 | if (ctx->pb_count < enc_pb_count) | ||
| 675 | ctx->pb_count = enc_pb_count; | ||
| 676 | ctx->state = MFCINST_HEAD_PRODUCED; | ||
| 677 | } | ||
| 676 | 678 | ||
| 677 | return 0; | 679 | return 0; |
| 678 | } | 680 | } |
| @@ -717,9 +719,9 @@ static int enc_post_frame_start(struct s5p_mfc_ctx *ctx) | |||
| 717 | 719 | ||
| 718 | slice_type = s5p_mfc_hw_call(dev->mfc_ops, get_enc_slice_type, dev); | 720 | slice_type = s5p_mfc_hw_call(dev->mfc_ops, get_enc_slice_type, dev); |
| 719 | strm_size = s5p_mfc_hw_call(dev->mfc_ops, get_enc_strm_size, dev); | 721 | strm_size = s5p_mfc_hw_call(dev->mfc_ops, get_enc_strm_size, dev); |
| 720 | mfc_debug(2, "Encoded slice type: %d", slice_type); | 722 | mfc_debug(2, "Encoded slice type: %d\n", slice_type); |
| 721 | mfc_debug(2, "Encoded stream size: %d", strm_size); | 723 | mfc_debug(2, "Encoded stream size: %d\n", strm_size); |
| 722 | mfc_debug(2, "Display order: %d", | 724 | mfc_debug(2, "Display order: %d\n", |
| 723 | mfc_read(dev, S5P_FIMV_ENC_SI_PIC_CNT)); | 725 | mfc_read(dev, S5P_FIMV_ENC_SI_PIC_CNT)); |
| 724 | spin_lock_irqsave(&dev->irqlock, flags); | 726 | spin_lock_irqsave(&dev->irqlock, flags); |
| 725 | if (slice_type >= 0) { | 727 | if (slice_type >= 0) { |
| @@ -1055,15 +1057,13 @@ static int vidioc_reqbufs(struct file *file, void *priv, | |||
| 1055 | } | 1057 | } |
| 1056 | ctx->capture_state = QUEUE_BUFS_REQUESTED; | 1058 | ctx->capture_state = QUEUE_BUFS_REQUESTED; |
| 1057 | 1059 | ||
| 1058 | if (!IS_MFCV6(dev)) { | 1060 | ret = s5p_mfc_hw_call(ctx->dev->mfc_ops, |
| 1059 | ret = s5p_mfc_hw_call(ctx->dev->mfc_ops, | 1061 | alloc_codec_buffers, ctx); |
| 1060 | alloc_codec_buffers, ctx); | 1062 | if (ret) { |
| 1061 | if (ret) { | 1063 | mfc_err("Failed to allocate encoding buffers\n"); |
| 1062 | mfc_err("Failed to allocate encoding buffers\n"); | 1064 | reqbufs->count = 0; |
| 1063 | reqbufs->count = 0; | 1065 | ret = vb2_reqbufs(&ctx->vq_dst, reqbufs); |
| 1064 | ret = vb2_reqbufs(&ctx->vq_dst, reqbufs); | 1066 | return -ENOMEM; |
| 1065 | return -ENOMEM; | ||
| 1066 | } | ||
| 1067 | } | 1067 | } |
| 1068 | } else if (reqbufs->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) { | 1068 | } else if (reqbufs->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) { |
| 1069 | if (ctx->output_state != QUEUE_FREE) { | 1069 | if (ctx->output_state != QUEUE_FREE) { |
| @@ -1071,6 +1071,19 @@ static int vidioc_reqbufs(struct file *file, void *priv, | |||
| 1071 | ctx->output_state); | 1071 | ctx->output_state); |
| 1072 | return -EINVAL; | 1072 | return -EINVAL; |
| 1073 | } | 1073 | } |
| 1074 | |||
| 1075 | if (IS_MFCV6(dev)) { | ||
| 1076 | /* Check for min encoder buffers */ | ||
| 1077 | if (ctx->pb_count && | ||
| 1078 | (reqbufs->count < ctx->pb_count)) { | ||
| 1079 | reqbufs->count = ctx->pb_count; | ||
| 1080 | mfc_debug(2, "Minimum %d output buffers needed\n", | ||
| 1081 | ctx->pb_count); | ||
| 1082 | } else { | ||
| 1083 | ctx->pb_count = reqbufs->count; | ||
| 1084 | } | ||
| 1085 | } | ||
| 1086 | |||
| 1074 | ret = vb2_reqbufs(&ctx->vq_src, reqbufs); | 1087 | ret = vb2_reqbufs(&ctx->vq_src, reqbufs); |
| 1075 | if (ret != 0) { | 1088 | if (ret != 0) { |
| 1076 | mfc_err("error in vb2_reqbufs() for E(S)\n"); | 1089 | mfc_err("error in vb2_reqbufs() for E(S)\n"); |
| @@ -1533,14 +1546,14 @@ int vidioc_encoder_cmd(struct file *file, void *priv, | |||
| 1533 | 1546 | ||
| 1534 | spin_lock_irqsave(&dev->irqlock, flags); | 1547 | spin_lock_irqsave(&dev->irqlock, flags); |
| 1535 | if (list_empty(&ctx->src_queue)) { | 1548 | if (list_empty(&ctx->src_queue)) { |
| 1536 | mfc_debug(2, "EOS: empty src queue, entering finishing state"); | 1549 | mfc_debug(2, "EOS: empty src queue, entering finishing state\n"); |
| 1537 | ctx->state = MFCINST_FINISHING; | 1550 | ctx->state = MFCINST_FINISHING; |
| 1538 | if (s5p_mfc_ctx_ready(ctx)) | 1551 | if (s5p_mfc_ctx_ready(ctx)) |
| 1539 | set_work_bit_irqsave(ctx); | 1552 | set_work_bit_irqsave(ctx); |
| 1540 | spin_unlock_irqrestore(&dev->irqlock, flags); | 1553 | spin_unlock_irqrestore(&dev->irqlock, flags); |
| 1541 | s5p_mfc_hw_call(dev->mfc_ops, try_run, dev); | 1554 | s5p_mfc_hw_call(dev->mfc_ops, try_run, dev); |
| 1542 | } else { | 1555 | } else { |
| 1543 | mfc_debug(2, "EOS: marking last buffer of stream"); | 1556 | mfc_debug(2, "EOS: marking last buffer of stream\n"); |
| 1544 | buf = list_entry(ctx->src_queue.prev, | 1557 | buf = list_entry(ctx->src_queue.prev, |
| 1545 | struct s5p_mfc_buf, list); | 1558 | struct s5p_mfc_buf, list); |
| 1546 | if (buf->flags & MFC_BUF_FLAG_USED) | 1559 | if (buf->flags & MFC_BUF_FLAG_USED) |
| @@ -1609,9 +1622,9 @@ static int check_vb_with_fmt(struct s5p_mfc_fmt *fmt, struct vb2_buffer *vb) | |||
| 1609 | mfc_err("failed to get plane cookie\n"); | 1622 | mfc_err("failed to get plane cookie\n"); |
| 1610 | return -EINVAL; | 1623 | return -EINVAL; |
| 1611 | } | 1624 | } |
| 1612 | mfc_debug(2, "index: %d, plane[%d] cookie: 0x%08zx", | 1625 | mfc_debug(2, "index: %d, plane[%d] cookie: 0x%08zx\n", |
| 1613 | vb->v4l2_buf.index, i, | 1626 | vb->v4l2_buf.index, i, |
| 1614 | vb2_dma_contig_plane_dma_addr(vb, i)); | 1627 | vb2_dma_contig_plane_dma_addr(vb, i)); |
| 1615 | } | 1628 | } |
| 1616 | return 0; | 1629 | return 0; |
| 1617 | } | 1630 | } |
| @@ -1760,11 +1773,27 @@ static int s5p_mfc_start_streaming(struct vb2_queue *q, unsigned int count) | |||
| 1760 | struct s5p_mfc_ctx *ctx = fh_to_ctx(q->drv_priv); | 1773 | struct s5p_mfc_ctx *ctx = fh_to_ctx(q->drv_priv); |
| 1761 | struct s5p_mfc_dev *dev = ctx->dev; | 1774 | struct s5p_mfc_dev *dev = ctx->dev; |
| 1762 | 1775 | ||
| 1763 | v4l2_ctrl_handler_setup(&ctx->ctrl_handler); | 1776 | if (IS_MFCV6(dev) && (q->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE)) { |
| 1777 | |||
| 1778 | if ((ctx->state == MFCINST_GOT_INST) && | ||
| 1779 | (dev->curr_ctx == ctx->num) && dev->hw_lock) { | ||
| 1780 | s5p_mfc_wait_for_done_ctx(ctx, | ||
| 1781 | S5P_MFC_R2H_CMD_SEQ_DONE_RET, | ||
| 1782 | 0); | ||
| 1783 | } | ||
| 1784 | |||
| 1785 | if (ctx->src_bufs_cnt < ctx->pb_count) { | ||
| 1786 | mfc_err("Need minimum %d OUTPUT buffers\n", | ||
| 1787 | ctx->pb_count); | ||
| 1788 | return -EINVAL; | ||
| 1789 | } | ||
| 1790 | } | ||
| 1791 | |||
| 1764 | /* If context is ready then dev = work->data;schedule it to run */ | 1792 | /* If context is ready then dev = work->data;schedule it to run */ |
| 1765 | if (s5p_mfc_ctx_ready(ctx)) | 1793 | if (s5p_mfc_ctx_ready(ctx)) |
| 1766 | set_work_bit_irqsave(ctx); | 1794 | set_work_bit_irqsave(ctx); |
| 1767 | s5p_mfc_hw_call(dev->mfc_ops, try_run, dev); | 1795 | s5p_mfc_hw_call(dev->mfc_ops, try_run, dev); |
| 1796 | |||
| 1768 | return 0; | 1797 | return 0; |
| 1769 | } | 1798 | } |
| 1770 | 1799 | ||
| @@ -1920,6 +1949,7 @@ int s5p_mfc_enc_ctrls_setup(struct s5p_mfc_ctx *ctx) | |||
| 1920 | if (controls[i].is_volatile && ctx->ctrls[i]) | 1949 | if (controls[i].is_volatile && ctx->ctrls[i]) |
| 1921 | ctx->ctrls[i]->flags |= V4L2_CTRL_FLAG_VOLATILE; | 1950 | ctx->ctrls[i]->flags |= V4L2_CTRL_FLAG_VOLATILE; |
| 1922 | } | 1951 | } |
| 1952 | v4l2_ctrl_handler_setup(&ctx->ctrl_handler); | ||
| 1923 | return 0; | 1953 | return 0; |
| 1924 | } | 1954 | } |
| 1925 | 1955 | ||
diff --git a/drivers/media/platform/s5p-mfc/s5p_mfc_opr_v5.c b/drivers/media/platform/s5p-mfc/s5p_mfc_opr_v5.c index 0af05a2d1cd4..368582b091bf 100644 --- a/drivers/media/platform/s5p-mfc/s5p_mfc_opr_v5.c +++ b/drivers/media/platform/s5p-mfc/s5p_mfc_opr_v5.c | |||
| @@ -1275,8 +1275,8 @@ static int s5p_mfc_run_enc_frame(struct s5p_mfc_ctx *ctx) | |||
| 1275 | spin_unlock_irqrestore(&dev->irqlock, flags); | 1275 | spin_unlock_irqrestore(&dev->irqlock, flags); |
| 1276 | dev->curr_ctx = ctx->num; | 1276 | dev->curr_ctx = ctx->num; |
| 1277 | s5p_mfc_clean_ctx_int_flags(ctx); | 1277 | s5p_mfc_clean_ctx_int_flags(ctx); |
| 1278 | mfc_debug(2, "encoding buffer with index=%d state=%d", | 1278 | mfc_debug(2, "encoding buffer with index=%d state=%d\n", |
| 1279 | src_mb ? src_mb->b->v4l2_buf.index : -1, ctx->state); | 1279 | src_mb ? src_mb->b->v4l2_buf.index : -1, ctx->state); |
| 1280 | s5p_mfc_encode_one_frame_v5(ctx); | 1280 | s5p_mfc_encode_one_frame_v5(ctx); |
| 1281 | return 0; | 1281 | return 0; |
| 1282 | } | 1282 | } |
diff --git a/drivers/media/platform/s5p-mfc/s5p_mfc_opr_v6.c b/drivers/media/platform/s5p-mfc/s5p_mfc_opr_v6.c index 7e76fce2e524..66f0d042357f 100644 --- a/drivers/media/platform/s5p-mfc/s5p_mfc_opr_v6.c +++ b/drivers/media/platform/s5p-mfc/s5p_mfc_opr_v6.c | |||
| @@ -62,12 +62,6 @@ static void s5p_mfc_release_dec_desc_buffer_v6(struct s5p_mfc_ctx *ctx) | |||
| 62 | /* NOP */ | 62 | /* NOP */ |
| 63 | } | 63 | } |
| 64 | 64 | ||
| 65 | static int s5p_mfc_get_dec_status_v6(struct s5p_mfc_dev *dev) | ||
| 66 | { | ||
| 67 | /* NOP */ | ||
| 68 | return -1; | ||
| 69 | } | ||
| 70 | |||
| 71 | /* Allocate codec buffers */ | 65 | /* Allocate codec buffers */ |
| 72 | static int s5p_mfc_alloc_codec_buffers_v6(struct s5p_mfc_ctx *ctx) | 66 | static int s5p_mfc_alloc_codec_buffers_v6(struct s5p_mfc_ctx *ctx) |
| 73 | { | 67 | { |
| @@ -167,7 +161,7 @@ static int s5p_mfc_alloc_codec_buffers_v6(struct s5p_mfc_ctx *ctx) | |||
| 167 | S5P_FIMV_SCRATCH_BUFFER_ALIGN_V6); | 161 | S5P_FIMV_SCRATCH_BUFFER_ALIGN_V6); |
| 168 | ctx->bank1.size = | 162 | ctx->bank1.size = |
| 169 | ctx->scratch_buf_size + ctx->tmv_buffer_size + | 163 | ctx->scratch_buf_size + ctx->tmv_buffer_size + |
| 170 | (ctx->dpb_count * (ctx->luma_dpb_size + | 164 | (ctx->pb_count * (ctx->luma_dpb_size + |
| 171 | ctx->chroma_dpb_size + ctx->me_buffer_size)); | 165 | ctx->chroma_dpb_size + ctx->me_buffer_size)); |
| 172 | ctx->bank2.size = 0; | 166 | ctx->bank2.size = 0; |
| 173 | break; | 167 | break; |
| @@ -181,7 +175,7 @@ static int s5p_mfc_alloc_codec_buffers_v6(struct s5p_mfc_ctx *ctx) | |||
| 181 | S5P_FIMV_SCRATCH_BUFFER_ALIGN_V6); | 175 | S5P_FIMV_SCRATCH_BUFFER_ALIGN_V6); |
| 182 | ctx->bank1.size = | 176 | ctx->bank1.size = |
| 183 | ctx->scratch_buf_size + ctx->tmv_buffer_size + | 177 | ctx->scratch_buf_size + ctx->tmv_buffer_size + |
| 184 | (ctx->dpb_count * (ctx->luma_dpb_size + | 178 | (ctx->pb_count * (ctx->luma_dpb_size + |
| 185 | ctx->chroma_dpb_size + ctx->me_buffer_size)); | 179 | ctx->chroma_dpb_size + ctx->me_buffer_size)); |
| 186 | ctx->bank2.size = 0; | 180 | ctx->bank2.size = 0; |
| 187 | break; | 181 | break; |
| @@ -198,7 +192,6 @@ static int s5p_mfc_alloc_codec_buffers_v6(struct s5p_mfc_ctx *ctx) | |||
| 198 | } | 192 | } |
| 199 | BUG_ON(ctx->bank1.dma & ((1 << MFC_BANK1_ALIGN_ORDER) - 1)); | 193 | BUG_ON(ctx->bank1.dma & ((1 << MFC_BANK1_ALIGN_ORDER) - 1)); |
| 200 | } | 194 | } |
| 201 | |||
| 202 | return 0; | 195 | return 0; |
| 203 | } | 196 | } |
| 204 | 197 | ||
| @@ -449,8 +442,8 @@ static int s5p_mfc_set_enc_stream_buffer_v6(struct s5p_mfc_ctx *ctx, | |||
| 449 | WRITEL(addr, S5P_FIMV_E_STREAM_BUFFER_ADDR_V6); /* 16B align */ | 442 | WRITEL(addr, S5P_FIMV_E_STREAM_BUFFER_ADDR_V6); /* 16B align */ |
| 450 | WRITEL(size, S5P_FIMV_E_STREAM_BUFFER_SIZE_V6); | 443 | WRITEL(size, S5P_FIMV_E_STREAM_BUFFER_SIZE_V6); |
| 451 | 444 | ||
| 452 | mfc_debug(2, "stream buf addr: 0x%08lx, size: 0x%d", | 445 | mfc_debug(2, "stream buf addr: 0x%08lx, size: 0x%d\n", |
| 453 | addr, size); | 446 | addr, size); |
| 454 | 447 | ||
| 455 | return 0; | 448 | return 0; |
| 456 | } | 449 | } |
| @@ -463,8 +456,8 @@ static void s5p_mfc_set_enc_frame_buffer_v6(struct s5p_mfc_ctx *ctx, | |||
| 463 | WRITEL(y_addr, S5P_FIMV_E_SOURCE_LUMA_ADDR_V6); /* 256B align */ | 456 | WRITEL(y_addr, S5P_FIMV_E_SOURCE_LUMA_ADDR_V6); /* 256B align */ |
| 464 | WRITEL(c_addr, S5P_FIMV_E_SOURCE_CHROMA_ADDR_V6); | 457 | WRITEL(c_addr, S5P_FIMV_E_SOURCE_CHROMA_ADDR_V6); |
| 465 | 458 | ||
| 466 | mfc_debug(2, "enc src y buf addr: 0x%08lx", y_addr); | 459 | mfc_debug(2, "enc src y buf addr: 0x%08lx\n", y_addr); |
| 467 | mfc_debug(2, "enc src c buf addr: 0x%08lx", c_addr); | 460 | mfc_debug(2, "enc src c buf addr: 0x%08lx\n", c_addr); |
| 468 | } | 461 | } |
| 469 | 462 | ||
| 470 | static void s5p_mfc_get_enc_frame_buffer_v6(struct s5p_mfc_ctx *ctx, | 463 | static void s5p_mfc_get_enc_frame_buffer_v6(struct s5p_mfc_ctx *ctx, |
| @@ -479,8 +472,8 @@ static void s5p_mfc_get_enc_frame_buffer_v6(struct s5p_mfc_ctx *ctx, | |||
| 479 | enc_recon_y_addr = READL(S5P_FIMV_E_RECON_LUMA_DPB_ADDR_V6); | 472 | enc_recon_y_addr = READL(S5P_FIMV_E_RECON_LUMA_DPB_ADDR_V6); |
| 480 | enc_recon_c_addr = READL(S5P_FIMV_E_RECON_CHROMA_DPB_ADDR_V6); | 473 | enc_recon_c_addr = READL(S5P_FIMV_E_RECON_CHROMA_DPB_ADDR_V6); |
| 481 | 474 | ||
| 482 | mfc_debug(2, "recon y addr: 0x%08lx", enc_recon_y_addr); | 475 | mfc_debug(2, "recon y addr: 0x%08lx\n", enc_recon_y_addr); |
| 483 | mfc_debug(2, "recon c addr: 0x%08lx", enc_recon_c_addr); | 476 | mfc_debug(2, "recon c addr: 0x%08lx\n", enc_recon_c_addr); |
| 484 | } | 477 | } |
| 485 | 478 | ||
| 486 | /* Set encoding ref & codec buffer */ | 479 | /* Set encoding ref & codec buffer */ |
| @@ -497,7 +490,7 @@ static int s5p_mfc_set_enc_ref_buffer_v6(struct s5p_mfc_ctx *ctx) | |||
| 497 | 490 | ||
| 498 | mfc_debug(2, "Buf1: %p (%d)\n", (void *)buf_addr1, buf_size1); | 491 | mfc_debug(2, "Buf1: %p (%d)\n", (void *)buf_addr1, buf_size1); |
| 499 | 492 | ||
| 500 | for (i = 0; i < ctx->dpb_count; i++) { | 493 | for (i = 0; i < ctx->pb_count; i++) { |
| 501 | WRITEL(buf_addr1, S5P_FIMV_E_LUMA_DPB_V6 + (4 * i)); | 494 | WRITEL(buf_addr1, S5P_FIMV_E_LUMA_DPB_V6 + (4 * i)); |
| 502 | buf_addr1 += ctx->luma_dpb_size; | 495 | buf_addr1 += ctx->luma_dpb_size; |
| 503 | WRITEL(buf_addr1, S5P_FIMV_E_CHROMA_DPB_V6 + (4 * i)); | 496 | WRITEL(buf_addr1, S5P_FIMV_E_CHROMA_DPB_V6 + (4 * i)); |
| @@ -520,7 +513,7 @@ static int s5p_mfc_set_enc_ref_buffer_v6(struct s5p_mfc_ctx *ctx) | |||
| 520 | buf_size1 -= ctx->tmv_buffer_size; | 513 | buf_size1 -= ctx->tmv_buffer_size; |
| 521 | 514 | ||
| 522 | mfc_debug(2, "Buf1: %u, buf_size1: %d (ref frames %d)\n", | 515 | mfc_debug(2, "Buf1: %u, buf_size1: %d (ref frames %d)\n", |
| 523 | buf_addr1, buf_size1, ctx->dpb_count); | 516 | buf_addr1, buf_size1, ctx->pb_count); |
| 524 | if (buf_size1 < 0) { | 517 | if (buf_size1 < 0) { |
| 525 | mfc_debug(2, "Not enough memory has been allocated.\n"); | 518 | mfc_debug(2, "Not enough memory has been allocated.\n"); |
| 526 | return -ENOMEM; | 519 | return -ENOMEM; |
| @@ -1431,8 +1424,8 @@ static inline int s5p_mfc_run_enc_frame(struct s5p_mfc_ctx *ctx) | |||
| 1431 | src_y_addr = vb2_dma_contig_plane_dma_addr(src_mb->b, 0); | 1424 | src_y_addr = vb2_dma_contig_plane_dma_addr(src_mb->b, 0); |
| 1432 | src_c_addr = vb2_dma_contig_plane_dma_addr(src_mb->b, 1); | 1425 | src_c_addr = vb2_dma_contig_plane_dma_addr(src_mb->b, 1); |
| 1433 | 1426 | ||
| 1434 | mfc_debug(2, "enc src y addr: 0x%08lx", src_y_addr); | 1427 | mfc_debug(2, "enc src y addr: 0x%08lx\n", src_y_addr); |
| 1435 | mfc_debug(2, "enc src c addr: 0x%08lx", src_c_addr); | 1428 | mfc_debug(2, "enc src c addr: 0x%08lx\n", src_c_addr); |
| 1436 | 1429 | ||
| 1437 | s5p_mfc_set_enc_frame_buffer_v6(ctx, src_y_addr, src_c_addr); | 1430 | s5p_mfc_set_enc_frame_buffer_v6(ctx, src_y_addr, src_c_addr); |
| 1438 | 1431 | ||
| @@ -1522,22 +1515,6 @@ static inline int s5p_mfc_run_init_enc_buffers(struct s5p_mfc_ctx *ctx) | |||
| 1522 | struct s5p_mfc_dev *dev = ctx->dev; | 1515 | struct s5p_mfc_dev *dev = ctx->dev; |
| 1523 | int ret; | 1516 | int ret; |
| 1524 | 1517 | ||
| 1525 | ret = s5p_mfc_alloc_codec_buffers_v6(ctx); | ||
| 1526 | if (ret) { | ||
| 1527 | mfc_err("Failed to allocate encoding buffers.\n"); | ||
| 1528 | return -ENOMEM; | ||
| 1529 | } | ||
| 1530 | |||
| 1531 | /* Header was generated now starting processing | ||
| 1532 | * First set the reference frame buffers | ||
| 1533 | */ | ||
| 1534 | if (ctx->capture_state != QUEUE_BUFS_REQUESTED) { | ||
| 1535 | mfc_err("It seems that destionation buffers were not\n" | ||
| 1536 | "requested.MFC requires that header should be generated\n" | ||
| 1537 | "before allocating codec buffer.\n"); | ||
| 1538 | return -EAGAIN; | ||
| 1539 | } | ||
| 1540 | |||
| 1541 | dev->curr_ctx = ctx->num; | 1518 | dev->curr_ctx = ctx->num; |
| 1542 | s5p_mfc_clean_ctx_int_flags(ctx); | 1519 | s5p_mfc_clean_ctx_int_flags(ctx); |
| 1543 | ret = s5p_mfc_set_enc_ref_buffer_v6(ctx); | 1520 | ret = s5p_mfc_set_enc_ref_buffer_v6(ctx); |
| @@ -1582,7 +1559,7 @@ static void s5p_mfc_try_run_v6(struct s5p_mfc_dev *dev) | |||
| 1582 | mfc_debug(1, "Seting new context to %p\n", ctx); | 1559 | mfc_debug(1, "Seting new context to %p\n", ctx); |
| 1583 | /* Got context to run in ctx */ | 1560 | /* Got context to run in ctx */ |
| 1584 | mfc_debug(1, "ctx->dst_queue_cnt=%d ctx->dpb_count=%d ctx->src_queue_cnt=%d\n", | 1561 | mfc_debug(1, "ctx->dst_queue_cnt=%d ctx->dpb_count=%d ctx->src_queue_cnt=%d\n", |
| 1585 | ctx->dst_queue_cnt, ctx->dpb_count, ctx->src_queue_cnt); | 1562 | ctx->dst_queue_cnt, ctx->pb_count, ctx->src_queue_cnt); |
| 1586 | mfc_debug(1, "ctx->state=%d\n", ctx->state); | 1563 | mfc_debug(1, "ctx->state=%d\n", ctx->state); |
| 1587 | /* Last frame has already been sent to MFC | 1564 | /* Last frame has already been sent to MFC |
| 1588 | * Now obtaining frames from MFC buffer */ | 1565 | * Now obtaining frames from MFC buffer */ |
| @@ -1647,7 +1624,7 @@ static void s5p_mfc_try_run_v6(struct s5p_mfc_dev *dev) | |||
| 1647 | case MFCINST_GOT_INST: | 1624 | case MFCINST_GOT_INST: |
| 1648 | s5p_mfc_run_init_enc(ctx); | 1625 | s5p_mfc_run_init_enc(ctx); |
| 1649 | break; | 1626 | break; |
| 1650 | case MFCINST_HEAD_PARSED: /* Only for MFC6.x */ | 1627 | case MFCINST_HEAD_PRODUCED: |
| 1651 | ret = s5p_mfc_run_init_enc_buffers(ctx); | 1628 | ret = s5p_mfc_run_init_enc_buffers(ctx); |
| 1652 | break; | 1629 | break; |
| 1653 | default: | 1630 | default: |
| @@ -1730,7 +1707,7 @@ static int s5p_mfc_get_dspl_status_v6(struct s5p_mfc_dev *dev) | |||
| 1730 | return mfc_read(dev, S5P_FIMV_D_DISPLAY_STATUS_V6); | 1707 | return mfc_read(dev, S5P_FIMV_D_DISPLAY_STATUS_V6); |
| 1731 | } | 1708 | } |
| 1732 | 1709 | ||
| 1733 | static int s5p_mfc_get_decoded_status_v6(struct s5p_mfc_dev *dev) | 1710 | static int s5p_mfc_get_dec_status_v6(struct s5p_mfc_dev *dev) |
| 1734 | { | 1711 | { |
| 1735 | return mfc_read(dev, S5P_FIMV_D_DECODED_STATUS_V6); | 1712 | return mfc_read(dev, S5P_FIMV_D_DECODED_STATUS_V6); |
| 1736 | } | 1713 | } |
diff --git a/drivers/media/platform/s5p-mfc/s5p_mfc_pm.c b/drivers/media/platform/s5p-mfc/s5p_mfc_pm.c index 6aa38a56aaf2..11d5f1dada32 100644 --- a/drivers/media/platform/s5p-mfc/s5p_mfc_pm.c +++ b/drivers/media/platform/s5p-mfc/s5p_mfc_pm.c | |||
| @@ -50,19 +50,6 @@ int s5p_mfc_init_pm(struct s5p_mfc_dev *dev) | |||
| 50 | goto err_p_ip_clk; | 50 | goto err_p_ip_clk; |
| 51 | } | 51 | } |
| 52 | 52 | ||
| 53 | pm->clock = clk_get(&dev->plat_dev->dev, dev->variant->mclk_name); | ||
| 54 | if (IS_ERR(pm->clock)) { | ||
| 55 | mfc_err("Failed to get MFC clock\n"); | ||
| 56 | ret = PTR_ERR(pm->clock); | ||
| 57 | goto err_g_ip_clk_2; | ||
| 58 | } | ||
| 59 | |||
| 60 | ret = clk_prepare(pm->clock); | ||
| 61 | if (ret) { | ||
| 62 | mfc_err("Failed to prepare MFC clock\n"); | ||
| 63 | goto err_p_ip_clk_2; | ||
| 64 | } | ||
| 65 | |||
| 66 | atomic_set(&pm->power, 0); | 53 | atomic_set(&pm->power, 0); |
| 67 | #ifdef CONFIG_PM_RUNTIME | 54 | #ifdef CONFIG_PM_RUNTIME |
| 68 | pm->device = &dev->plat_dev->dev; | 55 | pm->device = &dev->plat_dev->dev; |
| @@ -72,10 +59,6 @@ int s5p_mfc_init_pm(struct s5p_mfc_dev *dev) | |||
| 72 | atomic_set(&clk_ref, 0); | 59 | atomic_set(&clk_ref, 0); |
| 73 | #endif | 60 | #endif |
| 74 | return 0; | 61 | return 0; |
| 75 | err_p_ip_clk_2: | ||
| 76 | clk_put(pm->clock); | ||
| 77 | err_g_ip_clk_2: | ||
| 78 | clk_unprepare(pm->clock_gate); | ||
| 79 | err_p_ip_clk: | 62 | err_p_ip_clk: |
| 80 | clk_put(pm->clock_gate); | 63 | clk_put(pm->clock_gate); |
| 81 | err_g_ip_clk: | 64 | err_g_ip_clk: |
| @@ -86,8 +69,6 @@ void s5p_mfc_final_pm(struct s5p_mfc_dev *dev) | |||
| 86 | { | 69 | { |
| 87 | clk_unprepare(pm->clock_gate); | 70 | clk_unprepare(pm->clock_gate); |
| 88 | clk_put(pm->clock_gate); | 71 | clk_put(pm->clock_gate); |
| 89 | clk_unprepare(pm->clock); | ||
| 90 | clk_put(pm->clock); | ||
| 91 | #ifdef CONFIG_PM_RUNTIME | 72 | #ifdef CONFIG_PM_RUNTIME |
| 92 | pm_runtime_disable(pm->device); | 73 | pm_runtime_disable(pm->device); |
| 93 | #endif | 74 | #endif |
| @@ -98,7 +79,7 @@ int s5p_mfc_clock_on(void) | |||
| 98 | int ret; | 79 | int ret; |
| 99 | #ifdef CLK_DEBUG | 80 | #ifdef CLK_DEBUG |
| 100 | atomic_inc(&clk_ref); | 81 | atomic_inc(&clk_ref); |
| 101 | mfc_debug(3, "+ %d", atomic_read(&clk_ref)); | 82 | mfc_debug(3, "+ %d\n", atomic_read(&clk_ref)); |
| 102 | #endif | 83 | #endif |
| 103 | ret = clk_enable(pm->clock_gate); | 84 | ret = clk_enable(pm->clock_gate); |
| 104 | return ret; | 85 | return ret; |
| @@ -108,7 +89,7 @@ void s5p_mfc_clock_off(void) | |||
| 108 | { | 89 | { |
| 109 | #ifdef CLK_DEBUG | 90 | #ifdef CLK_DEBUG |
| 110 | atomic_dec(&clk_ref); | 91 | atomic_dec(&clk_ref); |
| 111 | mfc_debug(3, "- %d", atomic_read(&clk_ref)); | 92 | mfc_debug(3, "- %d\n", atomic_read(&clk_ref)); |
| 112 | #endif | 93 | #endif |
| 113 | clk_disable(pm->clock_gate); | 94 | clk_disable(pm->clock_gate); |
| 114 | } | 95 | } |
diff --git a/drivers/media/platform/sh_veu.c b/drivers/media/platform/sh_veu.c index 0b32cc3f6a47..59a9deefb242 100644 --- a/drivers/media/platform/sh_veu.c +++ b/drivers/media/platform/sh_veu.c | |||
| @@ -905,11 +905,11 @@ static int sh_veu_queue_setup(struct vb2_queue *vq, | |||
| 905 | if (ftmp.fmt.pix.width != pix->width || | 905 | if (ftmp.fmt.pix.width != pix->width || |
| 906 | ftmp.fmt.pix.height != pix->height) | 906 | ftmp.fmt.pix.height != pix->height) |
| 907 | return -EINVAL; | 907 | return -EINVAL; |
| 908 | size = pix->bytesperline ? pix->bytesperline * pix->height : | 908 | size = pix->bytesperline ? pix->bytesperline * pix->height * fmt->depth / fmt->ydepth : |
| 909 | pix->width * pix->height * fmt->depth >> 3; | 909 | pix->width * pix->height * fmt->depth / fmt->ydepth; |
| 910 | } else { | 910 | } else { |
| 911 | vfmt = sh_veu_get_vfmt(veu, vq->type); | 911 | vfmt = sh_veu_get_vfmt(veu, vq->type); |
| 912 | size = vfmt->bytesperline * vfmt->frame.height; | 912 | size = vfmt->bytesperline * vfmt->frame.height * vfmt->fmt->depth / vfmt->fmt->ydepth; |
| 913 | } | 913 | } |
| 914 | 914 | ||
| 915 | if (count < 2) | 915 | if (count < 2) |
| @@ -1033,8 +1033,6 @@ static int sh_veu_release(struct file *file) | |||
| 1033 | 1033 | ||
| 1034 | dev_dbg(veu->dev, "Releasing instance %p\n", veu_file); | 1034 | dev_dbg(veu->dev, "Releasing instance %p\n", veu_file); |
| 1035 | 1035 | ||
| 1036 | pm_runtime_put(veu->dev); | ||
| 1037 | |||
| 1038 | if (veu_file == veu->capture) { | 1036 | if (veu_file == veu->capture) { |
| 1039 | veu->capture = NULL; | 1037 | veu->capture = NULL; |
| 1040 | vb2_queue_release(v4l2_m2m_get_vq(veu->m2m_ctx, V4L2_BUF_TYPE_VIDEO_CAPTURE)); | 1038 | vb2_queue_release(v4l2_m2m_get_vq(veu->m2m_ctx, V4L2_BUF_TYPE_VIDEO_CAPTURE)); |
| @@ -1050,6 +1048,8 @@ static int sh_veu_release(struct file *file) | |||
| 1050 | veu->m2m_ctx = NULL; | 1048 | veu->m2m_ctx = NULL; |
| 1051 | } | 1049 | } |
| 1052 | 1050 | ||
| 1051 | pm_runtime_put(veu->dev); | ||
| 1052 | |||
| 1053 | kfree(veu_file); | 1053 | kfree(veu_file); |
| 1054 | 1054 | ||
| 1055 | return 0; | 1055 | return 0; |
| @@ -1138,10 +1138,7 @@ static irqreturn_t sh_veu_isr(int irq, void *dev_id) | |||
| 1138 | 1138 | ||
| 1139 | veu->xaction++; | 1139 | veu->xaction++; |
| 1140 | 1140 | ||
| 1141 | if (!veu->aborting) | 1141 | return IRQ_WAKE_THREAD; |
| 1142 | return IRQ_WAKE_THREAD; | ||
| 1143 | |||
| 1144 | return IRQ_HANDLED; | ||
| 1145 | } | 1142 | } |
| 1146 | 1143 | ||
| 1147 | static int sh_veu_probe(struct platform_device *pdev) | 1144 | static int sh_veu_probe(struct platform_device *pdev) |
diff --git a/drivers/media/platform/soc_camera/soc_camera.c b/drivers/media/platform/soc_camera/soc_camera.c index eea832c5fd01..3a4efbdc7668 100644 --- a/drivers/media/platform/soc_camera/soc_camera.c +++ b/drivers/media/platform/soc_camera/soc_camera.c | |||
| @@ -643,9 +643,9 @@ static int soc_camera_close(struct file *file) | |||
| 643 | 643 | ||
| 644 | if (ici->ops->init_videobuf2) | 644 | if (ici->ops->init_videobuf2) |
| 645 | vb2_queue_release(&icd->vb2_vidq); | 645 | vb2_queue_release(&icd->vb2_vidq); |
| 646 | ici->ops->remove(icd); | ||
| 647 | |||
| 648 | __soc_camera_power_off(icd); | 646 | __soc_camera_power_off(icd); |
| 647 | |||
| 648 | ici->ops->remove(icd); | ||
| 649 | } | 649 | } |
| 650 | 650 | ||
| 651 | if (icd->streamer == file) | 651 | if (icd->streamer == file) |
diff --git a/drivers/media/radio/Kconfig b/drivers/media/radio/Kconfig index c0beee2fa37c..d529ba788f41 100644 --- a/drivers/media/radio/Kconfig +++ b/drivers/media/radio/Kconfig | |||
| @@ -22,6 +22,7 @@ config RADIO_SI476X | |||
| 22 | tristate "Silicon Laboratories Si476x I2C FM Radio" | 22 | tristate "Silicon Laboratories Si476x I2C FM Radio" |
| 23 | depends on I2C && VIDEO_V4L2 | 23 | depends on I2C && VIDEO_V4L2 |
| 24 | depends on MFD_SI476X_CORE | 24 | depends on MFD_SI476X_CORE |
| 25 | depends on SND_SOC | ||
| 25 | select SND_SOC_SI476X | 26 | select SND_SOC_SI476X |
| 26 | ---help--- | 27 | ---help--- |
| 27 | Choose Y here if you have this FM radio chip. | 28 | Choose Y here if you have this FM radio chip. |
diff --git a/drivers/media/radio/radio-si476x.c b/drivers/media/radio/radio-si476x.c index 9430c6a29937..9dc8bafe6486 100644 --- a/drivers/media/radio/radio-si476x.c +++ b/drivers/media/radio/radio-si476x.c | |||
| @@ -44,7 +44,7 @@ | |||
| 44 | 44 | ||
| 45 | #define FREQ_MUL (10000000 / 625) | 45 | #define FREQ_MUL (10000000 / 625) |
| 46 | 46 | ||
| 47 | #define SI476X_PHDIV_STATUS_LINK_LOCKED(status) (0b10000000 & (status)) | 47 | #define SI476X_PHDIV_STATUS_LINK_LOCKED(status) (0x80 & (status)) |
| 48 | 48 | ||
| 49 | #define DRIVER_NAME "si476x-radio" | 49 | #define DRIVER_NAME "si476x-radio" |
| 50 | #define DRIVER_CARD "SI476x AM/FM Receiver" | 50 | #define DRIVER_CARD "SI476x AM/FM Receiver" |
diff --git a/drivers/media/usb/gspca/sonixb.c b/drivers/media/usb/gspca/sonixb.c index 3fe207e038c7..d7ff3b9687c5 100644 --- a/drivers/media/usb/gspca/sonixb.c +++ b/drivers/media/usb/gspca/sonixb.c | |||
| @@ -1159,6 +1159,13 @@ static int sd_start(struct gspca_dev *gspca_dev) | |||
| 1159 | regs[0x01] = 0x44; /* Select 24 Mhz clock */ | 1159 | regs[0x01] = 0x44; /* Select 24 Mhz clock */ |
| 1160 | regs[0x12] = 0x02; /* Set hstart to 2 */ | 1160 | regs[0x12] = 0x02; /* Set hstart to 2 */ |
| 1161 | } | 1161 | } |
| 1162 | break; | ||
| 1163 | case SENSOR_PAS202: | ||
| 1164 | /* For some unknown reason we need to increase hstart by 1 on | ||
| 1165 | the sn9c103, otherwise we get wrong colors (bayer shift). */ | ||
| 1166 | if (sd->bridge == BRIDGE_103) | ||
| 1167 | regs[0x12] += 1; | ||
| 1168 | break; | ||
| 1162 | } | 1169 | } |
| 1163 | /* Disable compression when the raw bayer format has been selected */ | 1170 | /* Disable compression when the raw bayer format has been selected */ |
| 1164 | if (cam->cam_mode[gspca_dev->curr_mode].priv & MODE_RAW) | 1171 | if (cam->cam_mode[gspca_dev->curr_mode].priv & MODE_RAW) |
diff --git a/drivers/media/usb/pwc/pwc.h b/drivers/media/usb/pwc/pwc.h index 7a6a0d39c2c6..81b017a554bc 100644 --- a/drivers/media/usb/pwc/pwc.h +++ b/drivers/media/usb/pwc/pwc.h | |||
| @@ -226,7 +226,7 @@ struct pwc_device | |||
| 226 | struct list_head queued_bufs; | 226 | struct list_head queued_bufs; |
| 227 | spinlock_t queued_bufs_lock; /* Protects queued_bufs */ | 227 | spinlock_t queued_bufs_lock; /* Protects queued_bufs */ |
| 228 | 228 | ||
| 229 | /* Note if taking both locks v4l2_lock must always be locked first! */ | 229 | /* If taking both locks vb_queue_lock must always be locked first! */ |
| 230 | struct mutex v4l2_lock; /* Protects everything else */ | 230 | struct mutex v4l2_lock; /* Protects everything else */ |
| 231 | struct mutex vb_queue_lock; /* Protects vb_queue and capt_file */ | 231 | struct mutex vb_queue_lock; /* Protects vb_queue and capt_file */ |
| 232 | 232 | ||
diff --git a/drivers/media/v4l2-core/v4l2-ctrls.c b/drivers/media/v4l2-core/v4l2-ctrls.c index ebb8e48619a2..fccd08b66d1a 100644 --- a/drivers/media/v4l2-core/v4l2-ctrls.c +++ b/drivers/media/v4l2-core/v4l2-ctrls.c | |||
| @@ -1835,6 +1835,8 @@ bool v4l2_ctrl_radio_filter(const struct v4l2_ctrl *ctrl) | |||
| 1835 | { | 1835 | { |
| 1836 | if (V4L2_CTRL_ID2CLASS(ctrl->id) == V4L2_CTRL_CLASS_FM_TX) | 1836 | if (V4L2_CTRL_ID2CLASS(ctrl->id) == V4L2_CTRL_CLASS_FM_TX) |
| 1837 | return true; | 1837 | return true; |
| 1838 | if (V4L2_CTRL_ID2CLASS(ctrl->id) == V4L2_CTRL_CLASS_FM_RX) | ||
| 1839 | return true; | ||
| 1838 | switch (ctrl->id) { | 1840 | switch (ctrl->id) { |
| 1839 | case V4L2_CID_AUDIO_MUTE: | 1841 | case V4L2_CID_AUDIO_MUTE: |
| 1840 | case V4L2_CID_AUDIO_VOLUME: | 1842 | case V4L2_CID_AUDIO_VOLUME: |
diff --git a/drivers/media/v4l2-core/v4l2-ioctl.c b/drivers/media/v4l2-core/v4l2-ioctl.c index f81bda1a48ec..7658586fe5f4 100644 --- a/drivers/media/v4l2-core/v4l2-ioctl.c +++ b/drivers/media/v4l2-core/v4l2-ioctl.c | |||
| @@ -243,7 +243,6 @@ static void v4l_print_format(const void *arg, bool write_only) | |||
| 243 | const struct v4l2_vbi_format *vbi; | 243 | const struct v4l2_vbi_format *vbi; |
| 244 | const struct v4l2_sliced_vbi_format *sliced; | 244 | const struct v4l2_sliced_vbi_format *sliced; |
| 245 | const struct v4l2_window *win; | 245 | const struct v4l2_window *win; |
| 246 | const struct v4l2_clip *clip; | ||
| 247 | unsigned i; | 246 | unsigned i; |
| 248 | 247 | ||
| 249 | pr_cont("type=%s", prt_names(p->type, v4l2_type_names)); | 248 | pr_cont("type=%s", prt_names(p->type, v4l2_type_names)); |
| @@ -253,7 +252,7 @@ static void v4l_print_format(const void *arg, bool write_only) | |||
| 253 | pix = &p->fmt.pix; | 252 | pix = &p->fmt.pix; |
| 254 | pr_cont(", width=%u, height=%u, " | 253 | pr_cont(", width=%u, height=%u, " |
| 255 | "pixelformat=%c%c%c%c, field=%s, " | 254 | "pixelformat=%c%c%c%c, field=%s, " |
| 256 | "bytesperline=%u sizeimage=%u, colorspace=%d\n", | 255 | "bytesperline=%u, sizeimage=%u, colorspace=%d\n", |
| 257 | pix->width, pix->height, | 256 | pix->width, pix->height, |
| 258 | (pix->pixelformat & 0xff), | 257 | (pix->pixelformat & 0xff), |
| 259 | (pix->pixelformat >> 8) & 0xff, | 258 | (pix->pixelformat >> 8) & 0xff, |
| @@ -284,20 +283,14 @@ static void v4l_print_format(const void *arg, bool write_only) | |||
| 284 | case V4L2_BUF_TYPE_VIDEO_OVERLAY: | 283 | case V4L2_BUF_TYPE_VIDEO_OVERLAY: |
| 285 | case V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY: | 284 | case V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY: |
| 286 | win = &p->fmt.win; | 285 | win = &p->fmt.win; |
| 287 | pr_cont(", wxh=%dx%d, x,y=%d,%d, field=%s, " | 286 | /* Note: we can't print the clip list here since the clips |
| 288 | "chromakey=0x%08x, bitmap=%p, " | 287 | * pointer is a userspace pointer, not a kernelspace |
| 289 | "global_alpha=0x%02x\n", | 288 | * pointer. */ |
| 290 | win->w.width, win->w.height, | 289 | pr_cont(", wxh=%dx%d, x,y=%d,%d, field=%s, chromakey=0x%08x, clipcount=%u, clips=%p, bitmap=%p, global_alpha=0x%02x\n", |
| 291 | win->w.left, win->w.top, | 290 | win->w.width, win->w.height, win->w.left, win->w.top, |
| 292 | prt_names(win->field, v4l2_field_names), | 291 | prt_names(win->field, v4l2_field_names), |
| 293 | win->chromakey, win->bitmap, win->global_alpha); | 292 | win->chromakey, win->clipcount, win->clips, |
| 294 | clip = win->clips; | 293 | win->bitmap, win->global_alpha); |
| 295 | for (i = 0; i < win->clipcount; i++) { | ||
| 296 | printk(KERN_DEBUG "clip %u: wxh=%dx%d, x,y=%d,%d\n", | ||
| 297 | i, clip->c.width, clip->c.height, | ||
| 298 | clip->c.left, clip->c.top); | ||
| 299 | clip = clip->next; | ||
| 300 | } | ||
| 301 | break; | 294 | break; |
| 302 | case V4L2_BUF_TYPE_VBI_CAPTURE: | 295 | case V4L2_BUF_TYPE_VBI_CAPTURE: |
| 303 | case V4L2_BUF_TYPE_VBI_OUTPUT: | 296 | case V4L2_BUF_TYPE_VBI_OUTPUT: |
| @@ -332,7 +325,7 @@ static void v4l_print_framebuffer(const void *arg, bool write_only) | |||
| 332 | 325 | ||
| 333 | pr_cont("capability=0x%x, flags=0x%x, base=0x%p, width=%u, " | 326 | pr_cont("capability=0x%x, flags=0x%x, base=0x%p, width=%u, " |
| 334 | "height=%u, pixelformat=%c%c%c%c, " | 327 | "height=%u, pixelformat=%c%c%c%c, " |
| 335 | "bytesperline=%u sizeimage=%u, colorspace=%d\n", | 328 | "bytesperline=%u, sizeimage=%u, colorspace=%d\n", |
| 336 | p->capability, p->flags, p->base, | 329 | p->capability, p->flags, p->base, |
| 337 | p->fmt.width, p->fmt.height, | 330 | p->fmt.width, p->fmt.height, |
| 338 | (p->fmt.pixelformat & 0xff), | 331 | (p->fmt.pixelformat & 0xff), |
| @@ -353,7 +346,7 @@ static void v4l_print_modulator(const void *arg, bool write_only) | |||
| 353 | const struct v4l2_modulator *p = arg; | 346 | const struct v4l2_modulator *p = arg; |
| 354 | 347 | ||
| 355 | if (write_only) | 348 | if (write_only) |
| 356 | pr_cont("index=%u, txsubchans=0x%x", p->index, p->txsubchans); | 349 | pr_cont("index=%u, txsubchans=0x%x\n", p->index, p->txsubchans); |
| 357 | else | 350 | else |
| 358 | pr_cont("index=%u, name=%.*s, capability=0x%x, " | 351 | pr_cont("index=%u, name=%.*s, capability=0x%x, " |
| 359 | "rangelow=%u, rangehigh=%u, txsubchans=0x%x\n", | 352 | "rangelow=%u, rangehigh=%u, txsubchans=0x%x\n", |
| @@ -445,13 +438,13 @@ static void v4l_print_buffer(const void *arg, bool write_only) | |||
| 445 | for (i = 0; i < p->length; ++i) { | 438 | for (i = 0; i < p->length; ++i) { |
| 446 | plane = &p->m.planes[i]; | 439 | plane = &p->m.planes[i]; |
| 447 | printk(KERN_DEBUG | 440 | printk(KERN_DEBUG |
| 448 | "plane %d: bytesused=%d, data_offset=0x%08x " | 441 | "plane %d: bytesused=%d, data_offset=0x%08x, " |
| 449 | "offset/userptr=0x%lx, length=%d\n", | 442 | "offset/userptr=0x%lx, length=%d\n", |
| 450 | i, plane->bytesused, plane->data_offset, | 443 | i, plane->bytesused, plane->data_offset, |
| 451 | plane->m.userptr, plane->length); | 444 | plane->m.userptr, plane->length); |
| 452 | } | 445 | } |
| 453 | } else { | 446 | } else { |
| 454 | pr_cont("bytesused=%d, offset/userptr=0x%lx, length=%d\n", | 447 | pr_cont(", bytesused=%d, offset/userptr=0x%lx, length=%d\n", |
| 455 | p->bytesused, p->m.userptr, p->length); | 448 | p->bytesused, p->m.userptr, p->length); |
| 456 | } | 449 | } |
| 457 | 450 | ||
| @@ -504,6 +497,8 @@ static void v4l_print_streamparm(const void *arg, bool write_only) | |||
| 504 | c->capability, c->outputmode, | 497 | c->capability, c->outputmode, |
| 505 | c->timeperframe.numerator, c->timeperframe.denominator, | 498 | c->timeperframe.numerator, c->timeperframe.denominator, |
| 506 | c->extendedmode, c->writebuffers); | 499 | c->extendedmode, c->writebuffers); |
| 500 | } else { | ||
| 501 | pr_cont("\n"); | ||
| 507 | } | 502 | } |
| 508 | } | 503 | } |
| 509 | 504 | ||
| @@ -734,11 +729,11 @@ static void v4l_print_frmsizeenum(const void *arg, bool write_only) | |||
| 734 | p->type); | 729 | p->type); |
| 735 | switch (p->type) { | 730 | switch (p->type) { |
| 736 | case V4L2_FRMSIZE_TYPE_DISCRETE: | 731 | case V4L2_FRMSIZE_TYPE_DISCRETE: |
| 737 | pr_cont(" wxh=%ux%u\n", | 732 | pr_cont(", wxh=%ux%u\n", |
| 738 | p->discrete.width, p->discrete.height); | 733 | p->discrete.width, p->discrete.height); |
| 739 | break; | 734 | break; |
| 740 | case V4L2_FRMSIZE_TYPE_STEPWISE: | 735 | case V4L2_FRMSIZE_TYPE_STEPWISE: |
| 741 | pr_cont(" min=%ux%u, max=%ux%u, step=%ux%u\n", | 736 | pr_cont(", min=%ux%u, max=%ux%u, step=%ux%u\n", |
| 742 | p->stepwise.min_width, p->stepwise.min_height, | 737 | p->stepwise.min_width, p->stepwise.min_height, |
| 743 | p->stepwise.step_width, p->stepwise.step_height, | 738 | p->stepwise.step_width, p->stepwise.step_height, |
| 744 | p->stepwise.max_width, p->stepwise.max_height); | 739 | p->stepwise.max_width, p->stepwise.max_height); |
| @@ -764,12 +759,12 @@ static void v4l_print_frmivalenum(const void *arg, bool write_only) | |||
| 764 | p->width, p->height, p->type); | 759 | p->width, p->height, p->type); |
| 765 | switch (p->type) { | 760 | switch (p->type) { |
| 766 | case V4L2_FRMIVAL_TYPE_DISCRETE: | 761 | case V4L2_FRMIVAL_TYPE_DISCRETE: |
| 767 | pr_cont(" fps=%d/%d\n", | 762 | pr_cont(", fps=%d/%d\n", |
| 768 | p->discrete.numerator, | 763 | p->discrete.numerator, |
| 769 | p->discrete.denominator); | 764 | p->discrete.denominator); |
| 770 | break; | 765 | break; |
| 771 | case V4L2_FRMIVAL_TYPE_STEPWISE: | 766 | case V4L2_FRMIVAL_TYPE_STEPWISE: |
| 772 | pr_cont(" min=%d/%d, max=%d/%d, step=%d/%d\n", | 767 | pr_cont(", min=%d/%d, max=%d/%d, step=%d/%d\n", |
| 773 | p->stepwise.min.numerator, | 768 | p->stepwise.min.numerator, |
| 774 | p->stepwise.min.denominator, | 769 | p->stepwise.min.denominator, |
| 775 | p->stepwise.max.numerator, | 770 | p->stepwise.max.numerator, |
| @@ -807,8 +802,8 @@ static void v4l_print_event(const void *arg, bool write_only) | |||
| 807 | pr_cont("value64=%lld, ", c->value64); | 802 | pr_cont("value64=%lld, ", c->value64); |
| 808 | else | 803 | else |
| 809 | pr_cont("value=%d, ", c->value); | 804 | pr_cont("value=%d, ", c->value); |
| 810 | pr_cont("flags=0x%x, minimum=%d, maximum=%d, step=%d," | 805 | pr_cont("flags=0x%x, minimum=%d, maximum=%d, step=%d, " |
| 811 | " default_value=%d\n", | 806 | "default_value=%d\n", |
| 812 | c->flags, c->minimum, c->maximum, | 807 | c->flags, c->minimum, c->maximum, |
| 813 | c->step, c->default_value); | 808 | c->step, c->default_value); |
| 814 | break; | 809 | break; |
| @@ -845,7 +840,7 @@ static void v4l_print_freq_band(const void *arg, bool write_only) | |||
| 845 | const struct v4l2_frequency_band *p = arg; | 840 | const struct v4l2_frequency_band *p = arg; |
| 846 | 841 | ||
| 847 | pr_cont("tuner=%u, type=%u, index=%u, capability=0x%x, " | 842 | pr_cont("tuner=%u, type=%u, index=%u, capability=0x%x, " |
| 848 | "rangelow=%u, rangehigh=%u, modulation=0x%x\n", | 843 | "rangelow=%u, rangehigh=%u, modulation=0x%x\n", |
| 849 | p->tuner, p->type, p->index, | 844 | p->tuner, p->type, p->index, |
| 850 | p->capability, p->rangelow, | 845 | p->capability, p->rangelow, |
| 851 | p->rangehigh, p->modulation); | 846 | p->rangehigh, p->modulation); |
diff --git a/drivers/media/v4l2-core/v4l2-mem2mem.c b/drivers/media/v4l2-core/v4l2-mem2mem.c index 66f599fcb829..e96497f7c3ed 100644 --- a/drivers/media/v4l2-core/v4l2-mem2mem.c +++ b/drivers/media/v4l2-core/v4l2-mem2mem.c | |||
| @@ -205,7 +205,7 @@ static void v4l2_m2m_try_run(struct v4l2_m2m_dev *m2m_dev) | |||
| 205 | static void v4l2_m2m_try_schedule(struct v4l2_m2m_ctx *m2m_ctx) | 205 | static void v4l2_m2m_try_schedule(struct v4l2_m2m_ctx *m2m_ctx) |
| 206 | { | 206 | { |
| 207 | struct v4l2_m2m_dev *m2m_dev; | 207 | struct v4l2_m2m_dev *m2m_dev; |
| 208 | unsigned long flags_job, flags; | 208 | unsigned long flags_job, flags_out, flags_cap; |
| 209 | 209 | ||
| 210 | m2m_dev = m2m_ctx->m2m_dev; | 210 | m2m_dev = m2m_ctx->m2m_dev; |
| 211 | dprintk("Trying to schedule a job for m2m_ctx: %p\n", m2m_ctx); | 211 | dprintk("Trying to schedule a job for m2m_ctx: %p\n", m2m_ctx); |
| @@ -223,23 +223,26 @@ static void v4l2_m2m_try_schedule(struct v4l2_m2m_ctx *m2m_ctx) | |||
| 223 | return; | 223 | return; |
| 224 | } | 224 | } |
| 225 | 225 | ||
| 226 | spin_lock_irqsave(&m2m_ctx->out_q_ctx.rdy_spinlock, flags); | 226 | spin_lock_irqsave(&m2m_ctx->out_q_ctx.rdy_spinlock, flags_out); |
| 227 | if (list_empty(&m2m_ctx->out_q_ctx.rdy_queue)) { | 227 | if (list_empty(&m2m_ctx->out_q_ctx.rdy_queue)) { |
| 228 | spin_unlock_irqrestore(&m2m_ctx->out_q_ctx.rdy_spinlock, flags); | 228 | spin_unlock_irqrestore(&m2m_ctx->out_q_ctx.rdy_spinlock, |
| 229 | flags_out); | ||
| 229 | spin_unlock_irqrestore(&m2m_dev->job_spinlock, flags_job); | 230 | spin_unlock_irqrestore(&m2m_dev->job_spinlock, flags_job); |
| 230 | dprintk("No input buffers available\n"); | 231 | dprintk("No input buffers available\n"); |
| 231 | return; | 232 | return; |
| 232 | } | 233 | } |
| 233 | spin_lock_irqsave(&m2m_ctx->cap_q_ctx.rdy_spinlock, flags); | 234 | spin_lock_irqsave(&m2m_ctx->cap_q_ctx.rdy_spinlock, flags_cap); |
| 234 | if (list_empty(&m2m_ctx->cap_q_ctx.rdy_queue)) { | 235 | if (list_empty(&m2m_ctx->cap_q_ctx.rdy_queue)) { |
| 235 | spin_unlock_irqrestore(&m2m_ctx->cap_q_ctx.rdy_spinlock, flags); | 236 | spin_unlock_irqrestore(&m2m_ctx->cap_q_ctx.rdy_spinlock, |
| 236 | spin_unlock_irqrestore(&m2m_ctx->out_q_ctx.rdy_spinlock, flags); | 237 | flags_cap); |
| 238 | spin_unlock_irqrestore(&m2m_ctx->out_q_ctx.rdy_spinlock, | ||
| 239 | flags_out); | ||
| 237 | spin_unlock_irqrestore(&m2m_dev->job_spinlock, flags_job); | 240 | spin_unlock_irqrestore(&m2m_dev->job_spinlock, flags_job); |
| 238 | dprintk("No output buffers available\n"); | 241 | dprintk("No output buffers available\n"); |
| 239 | return; | 242 | return; |
| 240 | } | 243 | } |
| 241 | spin_unlock_irqrestore(&m2m_ctx->cap_q_ctx.rdy_spinlock, flags); | 244 | spin_unlock_irqrestore(&m2m_ctx->cap_q_ctx.rdy_spinlock, flags_cap); |
| 242 | spin_unlock_irqrestore(&m2m_ctx->out_q_ctx.rdy_spinlock, flags); | 245 | spin_unlock_irqrestore(&m2m_ctx->out_q_ctx.rdy_spinlock, flags_out); |
| 243 | 246 | ||
| 244 | if (m2m_dev->m2m_ops->job_ready | 247 | if (m2m_dev->m2m_ops->job_ready |
| 245 | && (!m2m_dev->m2m_ops->job_ready(m2m_ctx->priv))) { | 248 | && (!m2m_dev->m2m_ops->job_ready(m2m_ctx->priv))) { |
| @@ -372,6 +375,20 @@ int v4l2_m2m_dqbuf(struct file *file, struct v4l2_m2m_ctx *m2m_ctx, | |||
| 372 | EXPORT_SYMBOL_GPL(v4l2_m2m_dqbuf); | 375 | EXPORT_SYMBOL_GPL(v4l2_m2m_dqbuf); |
| 373 | 376 | ||
| 374 | /** | 377 | /** |
| 378 | * v4l2_m2m_create_bufs() - create a source or destination buffer, depending | ||
| 379 | * on the type | ||
| 380 | */ | ||
| 381 | int v4l2_m2m_create_bufs(struct file *file, struct v4l2_m2m_ctx *m2m_ctx, | ||
| 382 | struct v4l2_create_buffers *create) | ||
| 383 | { | ||
| 384 | struct vb2_queue *vq; | ||
| 385 | |||
| 386 | vq = v4l2_m2m_get_vq(m2m_ctx, create->format.type); | ||
| 387 | return vb2_create_bufs(vq, create); | ||
| 388 | } | ||
| 389 | EXPORT_SYMBOL_GPL(v4l2_m2m_create_bufs); | ||
| 390 | |||
| 391 | /** | ||
| 375 | * v4l2_m2m_expbuf() - export a source or destination buffer, depending on | 392 | * v4l2_m2m_expbuf() - export a source or destination buffer, depending on |
| 376 | * the type | 393 | * the type |
| 377 | */ | 394 | */ |
| @@ -486,8 +503,10 @@ unsigned int v4l2_m2m_poll(struct file *file, struct v4l2_m2m_ctx *m2m_ctx, | |||
| 486 | if (m2m_ctx->m2m_dev->m2m_ops->unlock) | 503 | if (m2m_ctx->m2m_dev->m2m_ops->unlock) |
| 487 | m2m_ctx->m2m_dev->m2m_ops->unlock(m2m_ctx->priv); | 504 | m2m_ctx->m2m_dev->m2m_ops->unlock(m2m_ctx->priv); |
| 488 | 505 | ||
| 489 | poll_wait(file, &src_q->done_wq, wait); | 506 | if (list_empty(&src_q->done_list)) |
| 490 | poll_wait(file, &dst_q->done_wq, wait); | 507 | poll_wait(file, &src_q->done_wq, wait); |
| 508 | if (list_empty(&dst_q->done_list)) | ||
| 509 | poll_wait(file, &dst_q->done_wq, wait); | ||
| 491 | 510 | ||
| 492 | if (m2m_ctx->m2m_dev->m2m_ops->lock) | 511 | if (m2m_ctx->m2m_dev->m2m_ops->lock) |
| 493 | m2m_ctx->m2m_dev->m2m_ops->lock(m2m_ctx->priv); | 512 | m2m_ctx->m2m_dev->m2m_ops->lock(m2m_ctx->priv); |
diff --git a/drivers/media/v4l2-core/videobuf2-core.c b/drivers/media/v4l2-core/videobuf2-core.c index 7d833eefaf4e..e3bdc3be91e1 100644 --- a/drivers/media/v4l2-core/videobuf2-core.c +++ b/drivers/media/v4l2-core/videobuf2-core.c | |||
| @@ -2014,7 +2014,8 @@ unsigned int vb2_poll(struct vb2_queue *q, struct file *file, poll_table *wait) | |||
| 2014 | if (list_empty(&q->queued_list)) | 2014 | if (list_empty(&q->queued_list)) |
| 2015 | return res | POLLERR; | 2015 | return res | POLLERR; |
| 2016 | 2016 | ||
| 2017 | poll_wait(file, &q->done_wq, wait); | 2017 | if (list_empty(&q->done_list)) |
| 2018 | poll_wait(file, &q->done_wq, wait); | ||
| 2018 | 2019 | ||
| 2019 | /* | 2020 | /* |
| 2020 | * Take first buffer available for dequeuing. | 2021 | * Take first buffer available for dequeuing. |
diff --git a/drivers/staging/media/davinci_vpfe/Kconfig b/drivers/staging/media/davinci_vpfe/Kconfig index 2e4a28b018e8..12f321dd2399 100644 --- a/drivers/staging/media/davinci_vpfe/Kconfig +++ b/drivers/staging/media/davinci_vpfe/Kconfig | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | config VIDEO_DM365_VPFE | 1 | config VIDEO_DM365_VPFE |
| 2 | tristate "DM365 VPFE Media Controller Capture Driver" | 2 | tristate "DM365 VPFE Media Controller Capture Driver" |
| 3 | depends on VIDEO_V4L2 && ARCH_DAVINCI_DM365 && !VIDEO_VPFE_CAPTURE | 3 | depends on VIDEO_V4L2 && ARCH_DAVINCI_DM365 && !VIDEO_DM365_ISIF |
| 4 | select VIDEOBUF2_DMA_CONTIG | 4 | select VIDEOBUF2_DMA_CONTIG |
| 5 | help | 5 | help |
| 6 | Support for DM365 VPFE based Media Controller Capture driver. | 6 | Support for DM365 VPFE based Media Controller Capture driver. |
diff --git a/drivers/staging/media/davinci_vpfe/vpfe_mc_capture.c b/drivers/staging/media/davinci_vpfe/vpfe_mc_capture.c index b88e1ddce229..d8ce20d2fbda 100644 --- a/drivers/staging/media/davinci_vpfe/vpfe_mc_capture.c +++ b/drivers/staging/media/davinci_vpfe/vpfe_mc_capture.c | |||
| @@ -639,7 +639,8 @@ static int vpfe_probe(struct platform_device *pdev) | |||
| 639 | if (ret) | 639 | if (ret) |
| 640 | goto probe_free_dev_mem; | 640 | goto probe_free_dev_mem; |
| 641 | 641 | ||
| 642 | if (vpfe_initialize_modules(vpfe_dev, pdev)) | 642 | ret = vpfe_initialize_modules(vpfe_dev, pdev); |
| 643 | if (ret) | ||
| 643 | goto probe_disable_clock; | 644 | goto probe_disable_clock; |
| 644 | 645 | ||
| 645 | vpfe_dev->media_dev.dev = vpfe_dev->pdev; | 646 | vpfe_dev->media_dev.dev = vpfe_dev->pdev; |
| @@ -663,7 +664,8 @@ static int vpfe_probe(struct platform_device *pdev) | |||
| 663 | /* set the driver data in platform device */ | 664 | /* set the driver data in platform device */ |
| 664 | platform_set_drvdata(pdev, vpfe_dev); | 665 | platform_set_drvdata(pdev, vpfe_dev); |
| 665 | /* register subdevs/entities */ | 666 | /* register subdevs/entities */ |
| 666 | if (vpfe_register_entities(vpfe_dev)) | 667 | ret = vpfe_register_entities(vpfe_dev); |
| 668 | if (ret) | ||
| 667 | goto probe_out_v4l2_unregister; | 669 | goto probe_out_v4l2_unregister; |
| 668 | 670 | ||
| 669 | ret = vpfe_attach_irq(vpfe_dev); | 671 | ret = vpfe_attach_irq(vpfe_dev); |
diff --git a/drivers/staging/media/solo6x10/Kconfig b/drivers/staging/media/solo6x10/Kconfig index df6569b997b8..34f3b6d02d2a 100644 --- a/drivers/staging/media/solo6x10/Kconfig +++ b/drivers/staging/media/solo6x10/Kconfig | |||
| @@ -5,6 +5,7 @@ config SOLO6X10 | |||
| 5 | select VIDEOBUF2_DMA_SG | 5 | select VIDEOBUF2_DMA_SG |
| 6 | select VIDEOBUF2_DMA_CONTIG | 6 | select VIDEOBUF2_DMA_CONTIG |
| 7 | select SND_PCM | 7 | select SND_PCM |
| 8 | select FONT_8x16 | ||
| 8 | ---help--- | 9 | ---help--- |
| 9 | This driver supports the Softlogic based MPEG-4 and h.264 codec | 10 | This driver supports the Softlogic based MPEG-4 and h.264 codec |
| 10 | cards. | 11 | cards. |
diff --git a/include/media/v4l2-mem2mem.h b/include/media/v4l2-mem2mem.h index d3eef01da648..0f4555b2a31b 100644 --- a/include/media/v4l2-mem2mem.h +++ b/include/media/v4l2-mem2mem.h | |||
| @@ -110,6 +110,8 @@ int v4l2_m2m_qbuf(struct file *file, struct v4l2_m2m_ctx *m2m_ctx, | |||
| 110 | struct v4l2_buffer *buf); | 110 | struct v4l2_buffer *buf); |
| 111 | int v4l2_m2m_dqbuf(struct file *file, struct v4l2_m2m_ctx *m2m_ctx, | 111 | int v4l2_m2m_dqbuf(struct file *file, struct v4l2_m2m_ctx *m2m_ctx, |
| 112 | struct v4l2_buffer *buf); | 112 | struct v4l2_buffer *buf); |
| 113 | int v4l2_m2m_create_bufs(struct file *file, struct v4l2_m2m_ctx *m2m_ctx, | ||
| 114 | struct v4l2_create_buffers *create); | ||
| 113 | 115 | ||
| 114 | int v4l2_m2m_expbuf(struct file *file, struct v4l2_m2m_ctx *m2m_ctx, | 116 | int v4l2_m2m_expbuf(struct file *file, struct v4l2_m2m_ctx *m2m_ctx, |
| 115 | struct v4l2_exportbuffer *eb); | 117 | struct v4l2_exportbuffer *eb); |
diff --git a/mm/slab_common.c b/mm/slab_common.c index ff3218a0f5e1..2d414508e9ec 100644 --- a/mm/slab_common.c +++ b/mm/slab_common.c | |||
| @@ -373,8 +373,10 @@ struct kmem_cache *kmalloc_slab(size_t size, gfp_t flags) | |||
| 373 | { | 373 | { |
| 374 | int index; | 374 | int index; |
| 375 | 375 | ||
| 376 | if (WARN_ON_ONCE(size > KMALLOC_MAX_SIZE)) | 376 | if (size > KMALLOC_MAX_SIZE) { |
| 377 | WARN_ON_ONCE(!(flags & __GFP_NOWARN)); | ||
| 377 | return NULL; | 378 | return NULL; |
| 379 | } | ||
| 378 | 380 | ||
| 379 | if (size <= 192) { | 381 | if (size <= 192) { |
| 380 | if (!size) | 382 | if (!size) |
diff --git a/sound/pci/hda/patch_cirrus.c b/sound/pci/hda/patch_cirrus.c index bd8d46cca2b3..cccaf9c7a7bb 100644 --- a/sound/pci/hda/patch_cirrus.c +++ b/sound/pci/hda/patch_cirrus.c | |||
| @@ -58,6 +58,7 @@ enum { | |||
| 58 | CS420X_GPIO_23, | 58 | CS420X_GPIO_23, |
| 59 | CS420X_MBP101, | 59 | CS420X_MBP101, |
| 60 | CS420X_MBP81, | 60 | CS420X_MBP81, |
| 61 | CS420X_MBA42, | ||
| 61 | CS420X_AUTO, | 62 | CS420X_AUTO, |
| 62 | /* aliases */ | 63 | /* aliases */ |
| 63 | CS420X_IMAC27_122 = CS420X_GPIO_23, | 64 | CS420X_IMAC27_122 = CS420X_GPIO_23, |
| @@ -346,6 +347,7 @@ static const struct hda_model_fixup cs420x_models[] = { | |||
| 346 | { .id = CS420X_APPLE, .name = "apple" }, | 347 | { .id = CS420X_APPLE, .name = "apple" }, |
| 347 | { .id = CS420X_MBP101, .name = "mbp101" }, | 348 | { .id = CS420X_MBP101, .name = "mbp101" }, |
| 348 | { .id = CS420X_MBP81, .name = "mbp81" }, | 349 | { .id = CS420X_MBP81, .name = "mbp81" }, |
| 350 | { .id = CS420X_MBA42, .name = "mba42" }, | ||
| 349 | {} | 351 | {} |
| 350 | }; | 352 | }; |
| 351 | 353 | ||
| @@ -361,6 +363,7 @@ static const struct snd_pci_quirk cs420x_fixup_tbl[] = { | |||
| 361 | SND_PCI_QUIRK(0x106b, 0x1c00, "MacBookPro 8,1", CS420X_MBP81), | 363 | SND_PCI_QUIRK(0x106b, 0x1c00, "MacBookPro 8,1", CS420X_MBP81), |
| 362 | SND_PCI_QUIRK(0x106b, 0x2000, "iMac 12,2", CS420X_IMAC27_122), | 364 | SND_PCI_QUIRK(0x106b, 0x2000, "iMac 12,2", CS420X_IMAC27_122), |
| 363 | SND_PCI_QUIRK(0x106b, 0x2800, "MacBookPro 10,1", CS420X_MBP101), | 365 | SND_PCI_QUIRK(0x106b, 0x2800, "MacBookPro 10,1", CS420X_MBP101), |
| 366 | SND_PCI_QUIRK(0x106b, 0x5b00, "MacBookAir 4,2", CS420X_MBA42), | ||
| 364 | SND_PCI_QUIRK_VENDOR(0x106b, "Apple", CS420X_APPLE), | 367 | SND_PCI_QUIRK_VENDOR(0x106b, "Apple", CS420X_APPLE), |
| 365 | {} /* terminator */ | 368 | {} /* terminator */ |
| 366 | }; | 369 | }; |
| @@ -414,6 +417,20 @@ static const struct hda_pintbl mbp101_pincfgs[] = { | |||
| 414 | {} /* terminator */ | 417 | {} /* terminator */ |
| 415 | }; | 418 | }; |
| 416 | 419 | ||
| 420 | static const struct hda_pintbl mba42_pincfgs[] = { | ||
| 421 | { 0x09, 0x012b4030 }, /* HP */ | ||
| 422 | { 0x0a, 0x400000f0 }, | ||
| 423 | { 0x0b, 0x90100120 }, /* speaker */ | ||
| 424 | { 0x0c, 0x400000f0 }, | ||
| 425 | { 0x0d, 0x90a00110 }, /* mic */ | ||
| 426 | { 0x0e, 0x400000f0 }, | ||
| 427 | { 0x0f, 0x400000f0 }, | ||
| 428 | { 0x10, 0x400000f0 }, | ||
| 429 | { 0x12, 0x400000f0 }, | ||
| 430 | { 0x15, 0x400000f0 }, | ||
| 431 | {} /* terminator */ | ||
| 432 | }; | ||
| 433 | |||
| 417 | static void cs420x_fixup_gpio_13(struct hda_codec *codec, | 434 | static void cs420x_fixup_gpio_13(struct hda_codec *codec, |
| 418 | const struct hda_fixup *fix, int action) | 435 | const struct hda_fixup *fix, int action) |
| 419 | { | 436 | { |
| @@ -482,6 +499,12 @@ static const struct hda_fixup cs420x_fixups[] = { | |||
| 482 | .chained = true, | 499 | .chained = true, |
| 483 | .chain_id = CS420X_GPIO_13, | 500 | .chain_id = CS420X_GPIO_13, |
| 484 | }, | 501 | }, |
| 502 | [CS420X_MBA42] = { | ||
| 503 | .type = HDA_FIXUP_PINS, | ||
| 504 | .v.pins = mba42_pincfgs, | ||
| 505 | .chained = true, | ||
| 506 | .chain_id = CS420X_GPIO_13, | ||
| 507 | }, | ||
| 485 | }; | 508 | }; |
| 486 | 509 | ||
| 487 | static struct cs_spec *cs_alloc_spec(struct hda_codec *codec, int vendor_nid) | 510 | static struct cs_spec *cs_alloc_spec(struct hda_codec *codec, int vendor_nid) |
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 02e22b4458d2..403010c9e82e 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
| @@ -3483,6 +3483,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { | |||
| 3483 | SND_PCI_QUIRK(0x1028, 0x05ca, "Dell", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE), | 3483 | SND_PCI_QUIRK(0x1028, 0x05ca, "Dell", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE), |
| 3484 | SND_PCI_QUIRK(0x1028, 0x05cb, "Dell", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE), | 3484 | SND_PCI_QUIRK(0x1028, 0x05cb, "Dell", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE), |
| 3485 | SND_PCI_QUIRK(0x1028, 0x05de, "Dell", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE), | 3485 | SND_PCI_QUIRK(0x1028, 0x05de, "Dell", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE), |
| 3486 | SND_PCI_QUIRK(0x1028, 0x05e0, "Dell", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE), | ||
| 3486 | SND_PCI_QUIRK(0x1028, 0x05e9, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), | 3487 | SND_PCI_QUIRK(0x1028, 0x05e9, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), |
| 3487 | SND_PCI_QUIRK(0x1028, 0x05ea, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), | 3488 | SND_PCI_QUIRK(0x1028, 0x05ea, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), |
| 3488 | SND_PCI_QUIRK(0x1028, 0x05eb, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), | 3489 | SND_PCI_QUIRK(0x1028, 0x05eb, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), |
| @@ -3494,6 +3495,8 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { | |||
| 3494 | SND_PCI_QUIRK(0x1028, 0x05f5, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), | 3495 | SND_PCI_QUIRK(0x1028, 0x05f5, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), |
| 3495 | SND_PCI_QUIRK(0x1028, 0x05f6, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), | 3496 | SND_PCI_QUIRK(0x1028, 0x05f6, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), |
| 3496 | SND_PCI_QUIRK(0x1028, 0x05f8, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), | 3497 | SND_PCI_QUIRK(0x1028, 0x05f8, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), |
| 3498 | SND_PCI_QUIRK(0x1028, 0x0606, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), | ||
| 3499 | SND_PCI_QUIRK(0x1028, 0x0608, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), | ||
| 3497 | SND_PCI_QUIRK(0x1028, 0x0609, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), | 3500 | SND_PCI_QUIRK(0x1028, 0x0609, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), |
| 3498 | SND_PCI_QUIRK(0x103c, 0x1586, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC2), | 3501 | SND_PCI_QUIRK(0x103c, 0x1586, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC2), |
| 3499 | SND_PCI_QUIRK(0x103c, 0x18e6, "HP", ALC269_FIXUP_HP_GPIO_LED), | 3502 | SND_PCI_QUIRK(0x103c, 0x18e6, "HP", ALC269_FIXUP_HP_GPIO_LED), |
| @@ -3596,6 +3599,8 @@ static const struct hda_model_fixup alc269_fixup_models[] = { | |||
| 3596 | {.id = ALC269_FIXUP_INV_DMIC, .name = "inv-dmic"}, | 3599 | {.id = ALC269_FIXUP_INV_DMIC, .name = "inv-dmic"}, |
| 3597 | {.id = ALC269_FIXUP_LENOVO_DOCK, .name = "lenovo-dock"}, | 3600 | {.id = ALC269_FIXUP_LENOVO_DOCK, .name = "lenovo-dock"}, |
| 3598 | {.id = ALC269_FIXUP_HP_GPIO_LED, .name = "hp-gpio-led"}, | 3601 | {.id = ALC269_FIXUP_HP_GPIO_LED, .name = "hp-gpio-led"}, |
| 3602 | {.id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "dell-headset-multi"}, | ||
| 3603 | {.id = ALC269_FIXUP_DELL2_MIC_NO_PRESENCE, .name = "dell-headset-dock"}, | ||
| 3599 | {} | 3604 | {} |
| 3600 | }; | 3605 | }; |
| 3601 | 3606 | ||
| @@ -4275,6 +4280,7 @@ static const struct hda_model_fixup alc662_fixup_models[] = { | |||
| 4275 | {.id = ALC662_FIXUP_ASUS_MODE7, .name = "asus-mode7"}, | 4280 | {.id = ALC662_FIXUP_ASUS_MODE7, .name = "asus-mode7"}, |
| 4276 | {.id = ALC662_FIXUP_ASUS_MODE8, .name = "asus-mode8"}, | 4281 | {.id = ALC662_FIXUP_ASUS_MODE8, .name = "asus-mode8"}, |
| 4277 | {.id = ALC662_FIXUP_INV_DMIC, .name = "inv-dmic"}, | 4282 | {.id = ALC662_FIXUP_INV_DMIC, .name = "inv-dmic"}, |
| 4283 | {.id = ALC668_FIXUP_DELL_MIC_NO_PRESENCE, .name = "dell-headset-multi"}, | ||
| 4278 | {} | 4284 | {} |
| 4279 | }; | 4285 | }; |
| 4280 | 4286 | ||
diff --git a/sound/usb/card.c b/sound/usb/card.c index 1a033177b83f..64952e2d3ed1 100644 --- a/sound/usb/card.c +++ b/sound/usb/card.c | |||
| @@ -147,14 +147,32 @@ static int snd_usb_create_stream(struct snd_usb_audio *chip, int ctrlif, int int | |||
| 147 | return -EINVAL; | 147 | return -EINVAL; |
| 148 | } | 148 | } |
| 149 | 149 | ||
| 150 | alts = &iface->altsetting[0]; | ||
| 151 | altsd = get_iface_desc(alts); | ||
| 152 | |||
| 153 | /* | ||
| 154 | * Android with both accessory and audio interfaces enabled gets the | ||
| 155 | * interface numbers wrong. | ||
| 156 | */ | ||
| 157 | if ((chip->usb_id == USB_ID(0x18d1, 0x2d04) || | ||
| 158 | chip->usb_id == USB_ID(0x18d1, 0x2d05)) && | ||
| 159 | interface == 0 && | ||
| 160 | altsd->bInterfaceClass == USB_CLASS_VENDOR_SPEC && | ||
| 161 | altsd->bInterfaceSubClass == USB_SUBCLASS_VENDOR_SPEC) { | ||
| 162 | interface = 2; | ||
| 163 | iface = usb_ifnum_to_if(dev, interface); | ||
| 164 | if (!iface) | ||
| 165 | return -EINVAL; | ||
| 166 | alts = &iface->altsetting[0]; | ||
| 167 | altsd = get_iface_desc(alts); | ||
| 168 | } | ||
| 169 | |||
| 150 | if (usb_interface_claimed(iface)) { | 170 | if (usb_interface_claimed(iface)) { |
| 151 | snd_printdd(KERN_INFO "%d:%d:%d: skipping, already claimed\n", | 171 | snd_printdd(KERN_INFO "%d:%d:%d: skipping, already claimed\n", |
| 152 | dev->devnum, ctrlif, interface); | 172 | dev->devnum, ctrlif, interface); |
| 153 | return -EINVAL; | 173 | return -EINVAL; |
| 154 | } | 174 | } |
| 155 | 175 | ||
| 156 | alts = &iface->altsetting[0]; | ||
| 157 | altsd = get_iface_desc(alts); | ||
| 158 | if ((altsd->bInterfaceClass == USB_CLASS_AUDIO || | 176 | if ((altsd->bInterfaceClass == USB_CLASS_AUDIO || |
| 159 | altsd->bInterfaceClass == USB_CLASS_VENDOR_SPEC) && | 177 | altsd->bInterfaceClass == USB_CLASS_VENDOR_SPEC) && |
| 160 | altsd->bInterfaceSubClass == USB_SUBCLASS_MIDISTREAMING) { | 178 | altsd->bInterfaceSubClass == USB_SUBCLASS_MIDISTREAMING) { |
diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c index e5c7f9f20fdd..d5438083fd6a 100644 --- a/sound/usb/mixer.c +++ b/sound/usb/mixer.c | |||
| @@ -885,6 +885,7 @@ static void volume_control_quirks(struct usb_mixer_elem_info *cval, | |||
| 885 | 885 | ||
| 886 | case USB_ID(0x046d, 0x0808): | 886 | case USB_ID(0x046d, 0x0808): |
| 887 | case USB_ID(0x046d, 0x0809): | 887 | case USB_ID(0x046d, 0x0809): |
| 888 | case USB_ID(0x046d, 0x081b): /* HD Webcam c310 */ | ||
| 888 | case USB_ID(0x046d, 0x081d): /* HD Webcam c510 */ | 889 | case USB_ID(0x046d, 0x081d): /* HD Webcam c510 */ |
| 889 | case USB_ID(0x046d, 0x0825): /* HD Webcam c270 */ | 890 | case USB_ID(0x046d, 0x0825): /* HD Webcam c270 */ |
| 890 | case USB_ID(0x046d, 0x0991): | 891 | case USB_ID(0x046d, 0x0991): |
