mirror of
https://github.com/torvalds/linux.git
synced 2024-11-23 12:42:02 +00:00
ASoC: Updates for v4.4
Not much core work here, a few small tweaks to interfaces but mainly the changes here are driver ones. Highlights include: - Updates to the topology userspace interface - Big updates to the Renesas support from Morimoto-san - Most of the support for Intel Sky Lake systems. - New drivers for Asahi Kasei Microdevices AK4613, Allwinnner A10, Cirrus Logic WM8998, Dialog DA7219, Nuvoton NAU8825 and Rockchip S/PDIF. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQEcBAABAgAGBQJWLbbGAAoJECTWi3JdVIfQH7oH/1VdN2ozP9A03p24aC5qso1F VWOBnG4pkw1G6J5qK2lemMDeJdRdTfreICUAa9Tw9kOSfTIb6F3X8kCw8tbwlw0I 4phgmyo23P53OfLZFMkQi/RCfwItnE0sszqhvoumUg0ryjYxg2JT+gTMgwvVo7Pq hf6m6a3we5pxLIIYP4wlQgOKwUJe4B4nC37ExySf24Dlo/DzmWDtfQbGvmyluFzb MB1qzEvAc/KC3LZFkIFmhfg2/caNRhcQrzkUCYrLR3t+oz9P1zCpYTII7VDdMg7L SM2VoL+ynEAdBqa38Ozwxvd/mpHwinlAeiikuwz1PyxVOqZvZqqiWzD8eUJkhZk= =/F/Q -----END PGP SIGNATURE----- Merge tag 'asoc-v4.3-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound into for-next ASoC: Updates for v4.4 Not much core work here, a few small tweaks to interfaces but mainly the changes here are driver ones. Highlights include: - Updates to the topology userspace interface - Big updates to the Renesas support from Morimoto-san - Most of the support for Intel Sky Lake systems. - New drivers for Asahi Kasei Microdevices AK4613, Allwinnner A10, Cirrus Logic WM8998, Dialog DA7219, Nuvoton NAU8825 and Rockchip S/PDIF. - A new driver for the Atmel Class D speaker drivers
This commit is contained in:
commit
d82ad8e0c0
1
.mailmap
1
.mailmap
@ -59,6 +59,7 @@ James Bottomley <jejb@mulgrave.(none)>
|
||||
James Bottomley <jejb@titanic.il.steeleye.com>
|
||||
James E Wilson <wilson@specifix.com>
|
||||
James Ketrenos <jketreno@io.(none)>
|
||||
<javier@osg.samsung.com> <javier.martinez@collabora.co.uk>
|
||||
Jean Tourrilhes <jt@hpl.hp.com>
|
||||
Jeff Garzik <jgarzik@pretzel.yyz.us>
|
||||
Jens Axboe <axboe@suse.de>
|
||||
|
7
Documentation/arm/OMAP/README
Normal file
7
Documentation/arm/OMAP/README
Normal file
@ -0,0 +1,7 @@
|
||||
This file contains documentation for running mainline
|
||||
kernel on omaps.
|
||||
|
||||
KERNEL NEW DEPENDENCIES
|
||||
v4.3+ Update is needed for custom .config files to make sure
|
||||
CONFIG_REGULATOR_PBIAS is enabled for MMC1 to work
|
||||
properly.
|
52
Documentation/devicetree/bindings/sound/atmel-classd.txt
Normal file
52
Documentation/devicetree/bindings/sound/atmel-classd.txt
Normal file
@ -0,0 +1,52 @@
|
||||
* Atmel ClassD driver under ALSA SoC architecture
|
||||
|
||||
Required properties:
|
||||
- compatible
|
||||
Should be "atmel,sama5d2-classd".
|
||||
- reg
|
||||
Should contain ClassD registers location and length.
|
||||
- interrupts
|
||||
Should contain the IRQ line for the ClassD.
|
||||
- dmas
|
||||
One DMA specifiers as described in atmel-dma.txt and dma.txt files.
|
||||
- dma-names
|
||||
Must be "tx".
|
||||
- clock-names
|
||||
Tuple listing input clock names.
|
||||
Required elements: "pclk", "gclk" and "aclk".
|
||||
- clocks
|
||||
Please refer to clock-bindings.txt.
|
||||
|
||||
Optional properties:
|
||||
- pinctrl-names, pinctrl-0
|
||||
Please refer to pinctrl-bindings.txt.
|
||||
- atmel,model
|
||||
The user-visible name of this sound complex.
|
||||
The default value is "CLASSD".
|
||||
- atmel,pwm-type
|
||||
PWM modulation type, "single" or "diff".
|
||||
The default value is "single".
|
||||
- atmel,non-overlap-time
|
||||
Set non-overlapping time, the unit is nanosecond(ns).
|
||||
There are four values,
|
||||
<5>, <10>, <15>, <20>, the default value is <10>.
|
||||
Non-overlapping will be disabled if not specified.
|
||||
|
||||
Example:
|
||||
classd: classd@fc048000 {
|
||||
compatible = "atmel,sama5d2-classd";
|
||||
reg = <0xfc048000 0x100>;
|
||||
interrupts = <59 IRQ_TYPE_LEVEL_HIGH 7>;
|
||||
dmas = <&dma0
|
||||
(AT91_XDMAC_DT_MEM_IF(0) | AT91_XDMAC_DT_PER_IF(1)
|
||||
| AT91_XDMAC_DT_PERID(47))>;
|
||||
dma-names = "tx";
|
||||
clocks = <&classd_clk>, <&classd_gclk>, <&audio_pll_pmc>;
|
||||
clock-names = "pclk", "gclk", "aclk";
|
||||
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_classd_default>;
|
||||
atmel,model = "classd @ SAMA5D2-Xplained";
|
||||
atmel,pwm-type = "diff";
|
||||
atmel,non-overlap-time = <10>;
|
||||
};
|
41
Documentation/devicetree/bindings/sound/da7213.txt
Normal file
41
Documentation/devicetree/bindings/sound/da7213.txt
Normal file
@ -0,0 +1,41 @@
|
||||
Dialog Semiconductor DA7213 Audio Codec bindings
|
||||
|
||||
======
|
||||
|
||||
Required properties:
|
||||
- compatible : Should be "dlg,da7213"
|
||||
- reg: Specifies the I2C slave address
|
||||
|
||||
Optional properties:
|
||||
- clocks : phandle and clock specifier for codec MCLK.
|
||||
- clock-names : Clock name string for 'clocks' attribute, should be "mclk".
|
||||
|
||||
- dlg,micbias1-lvl : Voltage (mV) for Mic Bias 1
|
||||
[<1600>, <2200>, <2500>, <3000>]
|
||||
- dlg,micbias2-lvl : Voltage (mV) for Mic Bias 2
|
||||
[<1600>, <2200>, <2500>, <3000>]
|
||||
- dlg,dmic-data-sel : DMIC channel select based on clock edge.
|
||||
["lrise_rfall", "lfall_rrise"]
|
||||
- dlg,dmic-samplephase : When to sample audio from DMIC.
|
||||
["on_clkedge", "between_clkedge"]
|
||||
- dlg,dmic-clkrate : DMIC clock frequency (Hz).
|
||||
[<1500000>, <3000000>]
|
||||
|
||||
======
|
||||
|
||||
Example:
|
||||
|
||||
codec_i2c: da7213@1a {
|
||||
compatible = "dlg,da7213";
|
||||
reg = <0x1a>;
|
||||
|
||||
clocks = <&clks 201>;
|
||||
clock-names = "mclk";
|
||||
|
||||
dlg,micbias1-lvl = <2500>;
|
||||
dlg,micbias2-lvl = <2500>;
|
||||
|
||||
dlg,dmic-data-sel = "lrise_rfall";
|
||||
dlg,dmic-samplephase = "between_clkedge";
|
||||
dlg,dmic-clkrate = <3000000>;
|
||||
};
|
106
Documentation/devicetree/bindings/sound/da7219.txt
Normal file
106
Documentation/devicetree/bindings/sound/da7219.txt
Normal file
@ -0,0 +1,106 @@
|
||||
Dialog Semiconductor DA7219 Audio Codec bindings
|
||||
|
||||
DA7219 is an audio codec with advanced accessory detect features.
|
||||
|
||||
======
|
||||
|
||||
Required properties:
|
||||
- compatible : Should be "dlg,da7219"
|
||||
- reg: Specifies the I2C slave address
|
||||
|
||||
- interrupt-parent : Specifies the phandle of the interrupt controller to which
|
||||
the IRQs from DA7219 are delivered to.
|
||||
- interrupts : IRQ line info for DA7219.
|
||||
(See Documentation/devicetree/bindings/interrupt-controller/interrupts.txt for
|
||||
further information relating to interrupt properties)
|
||||
|
||||
- VDD-supply: VDD power supply for the device
|
||||
- VDDMIC-supply: VDDMIC power supply for the device
|
||||
- VDDIO-supply: VDDIO power supply for the device
|
||||
(See Documentation/devicetree/bindings/regulator/regulator.txt for further
|
||||
information relating to regulators)
|
||||
|
||||
Optional properties:
|
||||
- interrupt-names : Name associated with interrupt line. Should be "wakeup" if
|
||||
interrupt is to be used to wake system, otherwise "irq" should be used.
|
||||
- wakeup-source: Flag to indicate this device can wake system (suspend/resume).
|
||||
|
||||
- clocks : phandle and clock specifier for codec MCLK.
|
||||
- clock-names : Clock name string for 'clocks' attribute, should be "mclk".
|
||||
|
||||
- dlg,ldo-lvl : Required internal LDO voltage (mV) level for digital engine
|
||||
[<1050>, <1100>, <1200>, <1400>]
|
||||
- dlg,micbias-lvl : Voltage (mV) for Mic Bias
|
||||
[<1800>, <2000>, <2200>, <2400>, <2600>]
|
||||
- dlg,mic-amp-in-sel : Mic input source type
|
||||
["diff", "se_p", "se_n"]
|
||||
|
||||
======
|
||||
|
||||
Child node - 'da7219_aad':
|
||||
|
||||
Optional properties:
|
||||
- dlg,micbias-pulse-lvl : Mic bias higher voltage pulse level (mV).
|
||||
[<2800>, <2900>]
|
||||
- dlg,micbias-pulse-time : Mic bias higher voltage pulse duration (ms)
|
||||
- dlg,btn-cfg : Periodic button press measurements for 4-pole jack (ms)
|
||||
[<2>, <5>, <10>, <50>, <100>, <200>, <500>]
|
||||
- dlg,mic-det-thr : Impedance threshold for mic detection measurement (Ohms)
|
||||
[<200>, <500>, <750>, <1000>]
|
||||
- dlg,jack-ins-deb : Debounce time for jack insertion (ms)
|
||||
[<5>, <10>, <20>, <50>, <100>, <200>, <500>, <1000>]
|
||||
- dlg,jack-det-rate: Jack type detection latency (3/4 pole)
|
||||
["32ms_64ms", "64ms_128ms", "128ms_256ms", "256ms_512ms"]
|
||||
- dlg,jack-rem-deb : Debounce time for jack removal (ms)
|
||||
[<1>, <5>, <10>, <20>]
|
||||
- dlg,a-d-btn-thr : Impedance threshold between buttons A and D
|
||||
[0x0 - 0xFF]
|
||||
- dlg,d-b-btn-thr : Impedance threshold between buttons D and B
|
||||
[0x0 - 0xFF]
|
||||
- dlg,b-c-btn-thr : Impedance threshold between buttons B and C
|
||||
[0x0 - 0xFF]
|
||||
- dlg,c-mic-btn-thr : Impedance threshold between button C and Mic
|
||||
[0x0 - 0xFF]
|
||||
- dlg,btn-avg : Number of 8-bit readings for averaged button measurement
|
||||
[<1>, <2>, <4>, <8>]
|
||||
- dlg,adc-1bit-rpt : Repeat count for 1-bit button measurement
|
||||
[<1>, <2>, <4>, <8>]
|
||||
|
||||
======
|
||||
|
||||
Example:
|
||||
|
||||
codec: da7219@1a {
|
||||
compatible = "dlg,da7219";
|
||||
reg = <0x1a>;
|
||||
|
||||
interrupt-parent = <&gpio6>;
|
||||
interrupts = <11 IRQ_TYPE_LEVEL_HIGH>;
|
||||
|
||||
VDD-supply = <®_audio>;
|
||||
VDDMIC-supply = <®_audio>;
|
||||
VDDIO-supply = <®_audio>;
|
||||
|
||||
clocks = <&clks 201>;
|
||||
clock-names = "mclk";
|
||||
|
||||
dlg,ldo-lvl = <1200>;
|
||||
dlg,micbias-lvl = <2600>;
|
||||
dlg,mic-amp-in-sel = "diff";
|
||||
|
||||
da7219_aad {
|
||||
dlg,btn-cfg = <50>;
|
||||
dlg,mic-det-thr = <500>;
|
||||
dlg,jack-ins-deb = <20>;
|
||||
dlg,jack-det-rate = "32ms_64ms";
|
||||
dlg,jack-rem-deb = <1>;
|
||||
|
||||
dlg,a-d-btn-thr = <0xa>;
|
||||
dlg,d-b-btn-thr = <0x16>;
|
||||
dlg,b-c-btn-thr = <0x21>;
|
||||
dlg,c-mic-btn-thr = <0x3E>;
|
||||
|
||||
dlg,btn-avg = <4>;
|
||||
dlg,adc-1bit-rpt = <1>;
|
||||
};
|
||||
};
|
@ -13,13 +13,15 @@ So having this generic sound card allows all Freescale SoC users to benefit
|
||||
from the simplification of a new card support and the capability of the wide
|
||||
sample rates support through ASRC.
|
||||
|
||||
Note: The card is initially designed for those sound cards who use I2S and
|
||||
PCM DAI formats. However, it'll be also possible to support those non
|
||||
I2S/PCM type sound cards, such as S/PDIF audio and HDMI audio, as long
|
||||
as the driver has been properly upgraded.
|
||||
Note: The card is initially designed for those sound cards who use AC'97, I2S
|
||||
and PCM DAI formats. However, it'll be also possible to support those non
|
||||
AC'97/I2S/PCM type sound cards, such as S/PDIF audio and HDMI audio, as
|
||||
long as the driver has been properly upgraded.
|
||||
|
||||
|
||||
The compatible list for this generic sound card currently:
|
||||
"fsl,imx-audio-ac97"
|
||||
|
||||
"fsl,imx-audio-cs42888"
|
||||
|
||||
"fsl,imx-audio-wm8962"
|
||||
|
102
Documentation/devicetree/bindings/sound/nau8825.txt
Normal file
102
Documentation/devicetree/bindings/sound/nau8825.txt
Normal file
@ -0,0 +1,102 @@
|
||||
Nuvoton NAU8825 audio codec
|
||||
|
||||
This device supports I2C only.
|
||||
|
||||
Required properties:
|
||||
- compatible : Must be "nuvoton,nau8825"
|
||||
|
||||
- reg : the I2C address of the device. This is either 0x1a (CSB=0) or 0x1b (CSB=1).
|
||||
|
||||
Optional properties:
|
||||
- nuvoton,jkdet-enable: Enable jack detection via JKDET pin.
|
||||
- nuvoton,jkdet-pull-enable: Enable JKDET pin pull. If set - pin pull enabled,
|
||||
otherwise pin in high impedance state.
|
||||
- nuvoton,jkdet-pull-up: Pull-up JKDET pin. If set then JKDET pin is pull up, otherwise pull down.
|
||||
- nuvoton,jkdet-polarity: JKDET pin polarity. 0 - active high, 1 - active low.
|
||||
|
||||
- nuvoton,vref-impedance: VREF Impedance selection
|
||||
0 - Open
|
||||
1 - 25 kOhm
|
||||
2 - 125 kOhm
|
||||
3 - 2.5 kOhm
|
||||
|
||||
- nuvoton,micbias-voltage: Micbias voltage level.
|
||||
0 - VDDA
|
||||
1 - VDDA
|
||||
2 - VDDA * 1.1
|
||||
3 - VDDA * 1.2
|
||||
4 - VDDA * 1.3
|
||||
5 - VDDA * 1.4
|
||||
6 - VDDA * 1.53
|
||||
7 - VDDA * 1.53
|
||||
|
||||
- nuvoton,sar-threshold-num: Number of buttons supported
|
||||
- nuvoton,sar-threshold: Impedance threshold for each button. Array that contains up to 8 buttons configuration. SAR value is calculated as
|
||||
SAR = 255 * MICBIAS / SAR_VOLTAGE * R / (2000 + R)
|
||||
where MICBIAS is configured by 'nuvoton,micbias-voltage', SAR_VOLTAGE is configured by 'nuvoton,sar-voltage', R - button impedance.
|
||||
Refer datasheet section 10.2 for more information about threshold calculation.
|
||||
|
||||
- nuvoton,sar-hysteresis: Button impedance measurement hysteresis.
|
||||
|
||||
- nuvoton,sar-voltage: Reference voltage for button impedance measurement.
|
||||
0 - VDDA
|
||||
1 - VDDA
|
||||
2 - VDDA * 1.1
|
||||
3 - VDDA * 1.2
|
||||
4 - VDDA * 1.3
|
||||
5 - VDDA * 1.4
|
||||
6 - VDDA * 1.53
|
||||
7 - VDDA * 1.53
|
||||
|
||||
- nuvoton,sar-compare-time: SAR compare time
|
||||
0 - 500 ns
|
||||
1 - 1 us
|
||||
2 - 2 us
|
||||
3 - 4 us
|
||||
|
||||
- nuvoton,sar-sampling-time: SAR sampling time
|
||||
0 - 2 us
|
||||
1 - 4 us
|
||||
2 - 8 us
|
||||
3 - 16 us
|
||||
|
||||
- nuvoton,short-key-debounce: Button short key press debounce time.
|
||||
0 - 30 ms
|
||||
1 - 50 ms
|
||||
2 - 100 ms
|
||||
3 - 30 ms
|
||||
|
||||
- nuvoton,jack-insert-debounce: number from 0 to 7 that sets debounce time to 2^(n+2) ms
|
||||
- nuvoton,jack-eject-debounce: number from 0 to 7 that sets debounce time to 2^(n+2) ms
|
||||
|
||||
- clocks: list of phandle and clock specifier pairs according to common clock bindings for the
|
||||
clocks described in clock-names
|
||||
- clock-names: should include "mclk" for the MCLK master clock
|
||||
|
||||
Example:
|
||||
|
||||
headset: nau8825@1a {
|
||||
compatible = "nuvoton,nau8825";
|
||||
reg = <0x1a>;
|
||||
interrupt-parent = <&gpio>;
|
||||
interrupts = <TEGRA_GPIO(E, 6) IRQ_TYPE_LEVEL_LOW>;
|
||||
nuvoton,jkdet-enable;
|
||||
nuvoton,jkdet-pull-enable;
|
||||
nuvoton,jkdet-pull-up;
|
||||
nuvoton,jkdet-polarity = <GPIO_ACTIVE_LOW>;
|
||||
nuvoton,vref-impedance = <2>;
|
||||
nuvoton,micbias-voltage = <6>;
|
||||
// Setup 4 buttons impedance according to Android specification
|
||||
nuvoton,sar-threshold-num = <4>;
|
||||
nuvoton,sar-threshold = <0xc 0x1e 0x38 0x60>;
|
||||
nuvoton,sar-hysteresis = <1>;
|
||||
nuvoton,sar-voltage = <0>;
|
||||
nuvoton,sar-compare-time = <0>;
|
||||
nuvoton,sar-sampling-time = <0>;
|
||||
nuvoton,short-key-debounce = <2>;
|
||||
nuvoton,jack-insert-debounce = <7>;
|
||||
nuvoton,jack-eject-debounce = <7>;
|
||||
|
||||
clock-names = "mclk";
|
||||
clocks = <&tegra_car TEGRA210_CLK_CLK_OUT_2>;
|
||||
};
|
@ -12,8 +12,6 @@ Required properties:
|
||||
- reg: physical base address of the controller and length of memory mapped
|
||||
region.
|
||||
- interrupts: should contain the I2S interrupt.
|
||||
- #address-cells: should be 1.
|
||||
- #size-cells: should be 0.
|
||||
- dmas: DMA specifiers for tx and rx dma. See the DMA client binding,
|
||||
Documentation/devicetree/bindings/dma/dma.txt
|
||||
- dma-names: should include "tx" and "rx".
|
||||
@ -21,6 +19,7 @@ Required properties:
|
||||
- clock-names: should contain followings:
|
||||
- "i2s_hclk": clock for I2S BUS
|
||||
- "i2s_clk" : clock for I2S controller
|
||||
- rockchip,capture-channels: max capture channels, if not set, 2 channels default.
|
||||
|
||||
Example for rk3288 I2S controller:
|
||||
|
||||
@ -28,10 +27,9 @@ i2s@ff890000 {
|
||||
compatible = "rockchip,rk3288-i2s", "rockchip,rk3066-i2s";
|
||||
reg = <0xff890000 0x10000>;
|
||||
interrupts = <GIC_SPI 85 IRQ_TYPE_LEVEL_HIGH>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
dmas = <&pdma1 0>, <&pdma1 1>;
|
||||
dma-names = "tx", "rx";
|
||||
clock-names = "i2s_hclk", "i2s_clk";
|
||||
clocks = <&cru HCLK_I2S0>, <&cru SCLK_I2S0>;
|
||||
rockchip,capture-channels = <2>;
|
||||
};
|
||||
|
40
Documentation/devicetree/bindings/sound/rockchip-spdif.txt
Normal file
40
Documentation/devicetree/bindings/sound/rockchip-spdif.txt
Normal file
@ -0,0 +1,40 @@
|
||||
* Rockchip SPDIF transceiver
|
||||
|
||||
The S/PDIF audio block is a stereo transceiver that allows the
|
||||
processor to receive and transmit digital audio via an coaxial cable or
|
||||
a fibre cable.
|
||||
|
||||
Required properties:
|
||||
|
||||
- compatible: should be one of the following:
|
||||
- "rockchip,rk3288-spdif", "rockchip,rk3188-spdif" or
|
||||
"rockchip,rk3066-spdif"
|
||||
- reg: physical base address of the controller and length of memory mapped
|
||||
region.
|
||||
- interrupts: should contain the SPDIF interrupt.
|
||||
- dmas: DMA specifiers for tx dma. See the DMA client binding,
|
||||
Documentation/devicetree/bindings/dma/dma.txt
|
||||
- dma-names: should be "tx"
|
||||
- clocks: a list of phandle + clock-specifier pairs, one for each entry
|
||||
in clock-names.
|
||||
- clock-names: should contain following:
|
||||
- "hclk": clock for SPDIF controller
|
||||
- "mclk" : clock for SPDIF bus
|
||||
|
||||
Required properties on RK3288:
|
||||
- rockchip,grf: the phandle of the syscon node for the general register
|
||||
file (GRF)
|
||||
|
||||
Example for the rk3188 SPDIF controller:
|
||||
|
||||
spdif: spdif@0x1011e000 {
|
||||
compatible = "rockchip,rk3188-spdif", "rockchip,rk3066-spdif";
|
||||
reg = <0x1011e000 0x2000>;
|
||||
interrupts = <GIC_SPI 32 IRQ_TYPE_LEVEL_HIGH>;
|
||||
dmas = <&dmac1_s 8>;
|
||||
dma-names = "tx";
|
||||
clock-names = "hclk", "mclk";
|
||||
clocks = <&cru HCLK_SPDIF>, <&cru SCLK_SPDIF>;
|
||||
status = "disabled";
|
||||
#sound-dai-cells = <0>;
|
||||
};
|
@ -14,7 +14,8 @@ Optional properties:
|
||||
|
||||
- realtek,in1-differential
|
||||
- realtek,in2-differential
|
||||
Boolean. Indicate MIC1/2 input are differential, rather than single-ended.
|
||||
- realtek,in3-differential
|
||||
Boolean. Indicate MIC1/2/3 input are differential, rather than single-ended.
|
||||
|
||||
- realtek,ldo1-en-gpios : The GPIO that controls the CODEC's LDO1_EN pin.
|
||||
|
||||
@ -24,9 +25,11 @@ Pins on the device (for linking into audio routes) for RT5639/RT5640:
|
||||
* DMIC2
|
||||
* MICBIAS1
|
||||
* IN1P
|
||||
* IN1R
|
||||
* IN1N
|
||||
* IN2P
|
||||
* IN2R
|
||||
* IN2N
|
||||
* IN3P
|
||||
* IN3N
|
||||
* HPOL
|
||||
* HPOR
|
||||
* LOUTL
|
||||
|
@ -13,10 +13,6 @@ Required properties:
|
||||
- clock-names: should contain followings:
|
||||
- "apb": the parent APB clock for this controller
|
||||
- "codec": the parent module clock
|
||||
- routing : A list of the connections between audio components. Each
|
||||
entry is a pair of strings, the first being the connection's sink,
|
||||
the second being the connection's source.
|
||||
|
||||
|
||||
Example:
|
||||
codec: codec@01c22c00 {
|
||||
@ -28,6 +24,4 @@ codec: codec@01c22c00 {
|
||||
clock-names = "apb", "codec";
|
||||
dmas = <&dma 0 19>, <&dma 0 19>;
|
||||
dma-names = "rx", "tx";
|
||||
routing = "Headphone Jack", "HP Right",
|
||||
"Headphone Jack", "HP Left";
|
||||
};
|
||||
|
@ -894,11 +894,12 @@ M: Lennert Buytenhek <kernel@wantstofly.org>
|
||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||
S: Maintained
|
||||
|
||||
ARM/Allwinner A1X SoC support
|
||||
ARM/Allwinner sunXi SoC support
|
||||
M: Maxime Ripard <maxime.ripard@free-electrons.com>
|
||||
M: Chen-Yu Tsai <wens@csie.org>
|
||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||
S: Maintained
|
||||
N: sun[x4567]i
|
||||
N: sun[x456789]i
|
||||
|
||||
ARM/Allwinner SoC Clock Support
|
||||
M: Emilio López <emilio@elopez.com.ar>
|
||||
@ -3367,6 +3368,7 @@ M: Support Opensource <support.opensource@diasemi.com>
|
||||
W: http://www.dialog-semiconductor.com/products
|
||||
S: Supported
|
||||
F: Documentation/hwmon/da90??
|
||||
F: Documentation/devicetree/bindings/sound/da[79]*.txt
|
||||
F: drivers/gpio/gpio-da90??.c
|
||||
F: drivers/hwmon/da90??-hwmon.c
|
||||
F: drivers/iio/adc/da91??-*.c
|
||||
@ -6793,7 +6795,6 @@ F: drivers/scsi/megaraid/
|
||||
|
||||
MELLANOX ETHERNET DRIVER (mlx4_en)
|
||||
M: Amir Vadai <amirv@mellanox.com>
|
||||
M: Ido Shamay <idos@mellanox.com>
|
||||
L: netdev@vger.kernel.org
|
||||
S: Supported
|
||||
W: http://www.mellanox.com
|
||||
@ -11675,6 +11676,7 @@ F: drivers/tty/serial/zs.*
|
||||
ZSMALLOC COMPRESSED SLAB MEMORY ALLOCATOR
|
||||
M: Minchan Kim <minchan@kernel.org>
|
||||
M: Nitin Gupta <ngupta@vflare.org>
|
||||
R: Sergey Senozhatsky <sergey.senozhatsky.work@gmail.com>
|
||||
L: linux-mm@kvack.org
|
||||
S: Maintained
|
||||
F: mm/zsmalloc.c
|
||||
|
2
Makefile
2
Makefile
@ -1,7 +1,7 @@
|
||||
VERSION = 4
|
||||
PATCHLEVEL = 3
|
||||
SUBLEVEL = 0
|
||||
EXTRAVERSION = -rc6
|
||||
EXTRAVERSION = -rc7
|
||||
NAME = Blurry Fish Butt
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
@ -402,11 +402,12 @@
|
||||
/* SMPS9 unused */
|
||||
|
||||
ldo1_reg: ldo1 {
|
||||
/* VDD_SD */
|
||||
/* VDD_SD / VDDSHV8 */
|
||||
regulator-name = "ldo1";
|
||||
regulator-min-microvolt = <1800000>;
|
||||
regulator-max-microvolt = <3300000>;
|
||||
regulator-boot-on;
|
||||
regulator-always-on;
|
||||
};
|
||||
|
||||
ldo2_reg: ldo2 {
|
||||
|
@ -46,7 +46,7 @@
|
||||
|
||||
/ {
|
||||
model = "Marvell Armada 385 Access Point Development Board";
|
||||
compatible = "marvell,a385-db-ap", "marvell,armada385", "marvell,armada38x";
|
||||
compatible = "marvell,a385-db-ap", "marvell,armada385", "marvell,armada380";
|
||||
|
||||
chosen {
|
||||
stdout-path = "serial1:115200n8";
|
||||
|
@ -152,7 +152,7 @@
|
||||
};
|
||||
|
||||
usb_phy2: phy@a2f400 {
|
||||
compatible = "marvell,berlin2-usb-phy";
|
||||
compatible = "marvell,berlin2cd-usb-phy";
|
||||
reg = <0xa2f400 0x128>;
|
||||
#phy-cells = <0>;
|
||||
resets = <&chip_rst 0x104 14>;
|
||||
@ -170,7 +170,7 @@
|
||||
};
|
||||
|
||||
usb_phy0: phy@b74000 {
|
||||
compatible = "marvell,berlin2-usb-phy";
|
||||
compatible = "marvell,berlin2cd-usb-phy";
|
||||
reg = <0xb74000 0x128>;
|
||||
#phy-cells = <0>;
|
||||
resets = <&chip_rst 0x104 12>;
|
||||
@ -178,7 +178,7 @@
|
||||
};
|
||||
|
||||
usb_phy1: phy@b78000 {
|
||||
compatible = "marvell,berlin2-usb-phy";
|
||||
compatible = "marvell,berlin2cd-usb-phy";
|
||||
reg = <0xb78000 0x128>;
|
||||
#phy-cells = <0>;
|
||||
resets = <&chip_rst 0x104 13>;
|
||||
|
@ -915,6 +915,11 @@
|
||||
};
|
||||
};
|
||||
|
||||
&pmu_system_controller {
|
||||
assigned-clocks = <&pmu_system_controller 0>;
|
||||
assigned-clock-parents = <&clock CLK_FIN_PLL>;
|
||||
};
|
||||
|
||||
&rtc {
|
||||
status = "okay";
|
||||
clocks = <&clock CLK_RTC>, <&max77802 MAX77802_CLK_32K_AP>;
|
||||
|
@ -878,6 +878,11 @@
|
||||
};
|
||||
};
|
||||
|
||||
&pmu_system_controller {
|
||||
assigned-clocks = <&pmu_system_controller 0>;
|
||||
assigned-clock-parents = <&clock CLK_FIN_PLL>;
|
||||
};
|
||||
|
||||
&rtc {
|
||||
status = "okay";
|
||||
clocks = <&clock CLK_RTC>, <&max77802 MAX77802_CLK_32K_AP>;
|
||||
|
@ -588,10 +588,10 @@
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
uart2: serial@30870000 {
|
||||
uart2: serial@30890000 {
|
||||
compatible = "fsl,imx7d-uart",
|
||||
"fsl,imx6q-uart";
|
||||
reg = <0x30870000 0x10000>;
|
||||
reg = <0x30890000 0x10000>;
|
||||
interrupts = <GIC_SPI 27 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&clks IMX7D_UART2_ROOT_CLK>,
|
||||
<&clks IMX7D_UART2_ROOT_CLK>;
|
||||
|
@ -12,7 +12,7 @@
|
||||
|
||||
/ {
|
||||
model = "LogicPD Zoom DM3730 Torpedo Development Kit";
|
||||
compatible = "logicpd,dm3730-torpedo-devkit", "ti,omap36xx";
|
||||
compatible = "logicpd,dm3730-torpedo-devkit", "ti,omap3630", "ti,omap3";
|
||||
|
||||
gpio_keys {
|
||||
compatible = "gpio-keys";
|
||||
|
@ -67,7 +67,7 @@
|
||||
|
||||
timer@c1109940 {
|
||||
compatible = "amlogic,meson6-timer";
|
||||
reg = <0xc1109940 0x14>;
|
||||
reg = <0xc1109940 0x18>;
|
||||
interrupts = <0 10 1>;
|
||||
};
|
||||
|
||||
@ -80,36 +80,37 @@
|
||||
wdt: watchdog@c1109900 {
|
||||
compatible = "amlogic,meson6-wdt";
|
||||
reg = <0xc1109900 0x8>;
|
||||
interrupts = <0 0 1>;
|
||||
};
|
||||
|
||||
uart_AO: serial@c81004c0 {
|
||||
compatible = "amlogic,meson-uart";
|
||||
reg = <0xc81004c0 0x14>;
|
||||
reg = <0xc81004c0 0x18>;
|
||||
interrupts = <0 90 1>;
|
||||
clocks = <&clk81>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
uart_A: serial@c81084c0 {
|
||||
uart_A: serial@c11084c0 {
|
||||
compatible = "amlogic,meson-uart";
|
||||
reg = <0xc81084c0 0x14>;
|
||||
interrupts = <0 90 1>;
|
||||
reg = <0xc11084c0 0x18>;
|
||||
interrupts = <0 26 1>;
|
||||
clocks = <&clk81>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
uart_B: serial@c81084dc {
|
||||
uart_B: serial@c11084dc {
|
||||
compatible = "amlogic,meson-uart";
|
||||
reg = <0xc81084dc 0x14>;
|
||||
interrupts = <0 90 1>;
|
||||
reg = <0xc11084dc 0x18>;
|
||||
interrupts = <0 75 1>;
|
||||
clocks = <&clk81>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
uart_C: serial@c8108700 {
|
||||
uart_C: serial@c1108700 {
|
||||
compatible = "amlogic,meson-uart";
|
||||
reg = <0xc8108700 0x14>;
|
||||
interrupts = <0 90 1>;
|
||||
reg = <0xc1108700 0x18>;
|
||||
interrupts = <0 93 1>;
|
||||
clocks = <&clk81>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
@ -13,7 +13,7 @@
|
||||
|
||||
/ {
|
||||
model = "TI OMAP37XX EVM (TMDSEVM3730)";
|
||||
compatible = "ti,omap3-evm-37xx", "ti,omap36xx";
|
||||
compatible = "ti,omap3-evm-37xx", "ti,omap3630", "ti,omap3";
|
||||
|
||||
memory {
|
||||
device_type = "memory";
|
||||
|
@ -56,7 +56,7 @@
|
||||
/* VMMCI level-shifter enable */
|
||||
default_hrefv60_cfg2 {
|
||||
pins = "GPIO169_D22";
|
||||
ste,config = <&gpio_out_lo>;
|
||||
ste,config = <&gpio_out_hi>;
|
||||
};
|
||||
/* VMMCI level-shifter voltage select */
|
||||
default_hrefv60_cfg3 {
|
||||
|
@ -234,7 +234,9 @@
|
||||
gpio-controller;
|
||||
#interrupt-cells = <2>;
|
||||
interrupt-controller;
|
||||
/*
|
||||
gpio-ranges = <&pinmux 0 0 246>;
|
||||
*/
|
||||
};
|
||||
|
||||
apbmisc@70000800 {
|
||||
|
@ -258,7 +258,9 @@
|
||||
gpio-controller;
|
||||
#interrupt-cells = <2>;
|
||||
interrupt-controller;
|
||||
/*
|
||||
gpio-ranges = <&pinmux 0 0 251>;
|
||||
*/
|
||||
};
|
||||
|
||||
apbdma: dma@0,60020000 {
|
||||
|
@ -244,7 +244,9 @@
|
||||
gpio-controller;
|
||||
#interrupt-cells = <2>;
|
||||
interrupt-controller;
|
||||
/*
|
||||
gpio-ranges = <&pinmux 0 0 224>;
|
||||
*/
|
||||
};
|
||||
|
||||
apbmisc@70000800 {
|
||||
|
@ -349,7 +349,9 @@
|
||||
gpio-controller;
|
||||
#interrupt-cells = <2>;
|
||||
interrupt-controller;
|
||||
/*
|
||||
gpio-ranges = <&pinmux 0 0 248>;
|
||||
*/
|
||||
};
|
||||
|
||||
apbmisc@70000800 {
|
||||
|
@ -85,7 +85,7 @@
|
||||
};
|
||||
|
||||
ðsc {
|
||||
interrupts = <0 50 4>;
|
||||
interrupts = <0 52 4>;
|
||||
};
|
||||
|
||||
&serial0 {
|
||||
|
@ -21,6 +21,7 @@ config KVM
|
||||
depends on MMU && OF
|
||||
select PREEMPT_NOTIFIERS
|
||||
select ANON_INODES
|
||||
select ARM_GIC
|
||||
select HAVE_KVM_CPU_RELAX_INTERCEPT
|
||||
select HAVE_KVM_ARCH_TLB_FLUSH_ALL
|
||||
select KVM_MMIO
|
||||
|
@ -1080,7 +1080,7 @@ static int init_hyp_mode(void)
|
||||
*/
|
||||
err = kvm_timer_hyp_init();
|
||||
if (err)
|
||||
goto out_free_mappings;
|
||||
goto out_free_context;
|
||||
|
||||
#ifndef CONFIG_HOTPLUG_CPU
|
||||
free_boot_hyp_pgd();
|
||||
|
@ -200,15 +200,15 @@ no_clk:
|
||||
args.args_count = 0;
|
||||
child_domain = of_genpd_get_from_provider(&args);
|
||||
if (IS_ERR(child_domain))
|
||||
goto next_pd;
|
||||
continue;
|
||||
|
||||
if (of_parse_phandle_with_args(np, "power-domains",
|
||||
"#power-domain-cells", 0, &args) != 0)
|
||||
goto next_pd;
|
||||
continue;
|
||||
|
||||
parent_domain = of_genpd_get_from_provider(&args);
|
||||
if (IS_ERR(parent_domain))
|
||||
goto next_pd;
|
||||
continue;
|
||||
|
||||
if (pm_genpd_add_subdomain(parent_domain, child_domain))
|
||||
pr_warn("%s failed to add subdomain: %s\n",
|
||||
@ -216,8 +216,6 @@ no_clk:
|
||||
else
|
||||
pr_info("%s has as child subdomain: %s.\n",
|
||||
parent_domain->name, child_domain->name);
|
||||
next_pd:
|
||||
of_node_put(np);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -49,6 +49,7 @@ config SOC_OMAP5
|
||||
select OMAP_INTERCONNECT
|
||||
select OMAP_INTERCONNECT_BARRIER
|
||||
select PM_OPP if PM
|
||||
select ZONE_DMA if ARM_LPAE
|
||||
|
||||
config SOC_AM33XX
|
||||
bool "TI AM33XX"
|
||||
@ -78,6 +79,7 @@ config SOC_DRA7XX
|
||||
select OMAP_INTERCONNECT
|
||||
select OMAP_INTERCONNECT_BARRIER
|
||||
select PM_OPP if PM
|
||||
select ZONE_DMA if ARM_LPAE
|
||||
|
||||
config ARCH_OMAP2PLUS
|
||||
bool
|
||||
|
@ -106,6 +106,7 @@ DT_MACHINE_START(OMAP3_DT, "Generic OMAP3 (Flattened Device Tree)")
|
||||
MACHINE_END
|
||||
|
||||
static const char *const omap36xx_boards_compat[] __initconst = {
|
||||
"ti,omap3630",
|
||||
"ti,omap36xx",
|
||||
NULL,
|
||||
};
|
||||
@ -243,6 +244,9 @@ static const char *const omap5_boards_compat[] __initconst = {
|
||||
};
|
||||
|
||||
DT_MACHINE_START(OMAP5_DT, "Generic OMAP5 (Flattened Device Tree)")
|
||||
#if defined(CONFIG_ZONE_DMA) && defined(CONFIG_ARM_LPAE)
|
||||
.dma_zone_size = SZ_2G,
|
||||
#endif
|
||||
.reserve = omap_reserve,
|
||||
.smp = smp_ops(omap4_smp_ops),
|
||||
.map_io = omap5_map_io,
|
||||
@ -288,6 +292,9 @@ static const char *const dra74x_boards_compat[] __initconst = {
|
||||
};
|
||||
|
||||
DT_MACHINE_START(DRA74X_DT, "Generic DRA74X (Flattened Device Tree)")
|
||||
#if defined(CONFIG_ZONE_DMA) && defined(CONFIG_ARM_LPAE)
|
||||
.dma_zone_size = SZ_2G,
|
||||
#endif
|
||||
.reserve = omap_reserve,
|
||||
.smp = smp_ops(omap4_smp_ops),
|
||||
.map_io = dra7xx_map_io,
|
||||
@ -308,6 +315,9 @@ static const char *const dra72x_boards_compat[] __initconst = {
|
||||
};
|
||||
|
||||
DT_MACHINE_START(DRA72X_DT, "Generic DRA72X (Flattened Device Tree)")
|
||||
#if defined(CONFIG_ZONE_DMA) && defined(CONFIG_ARM_LPAE)
|
||||
.dma_zone_size = SZ_2G,
|
||||
#endif
|
||||
.reserve = omap_reserve,
|
||||
.map_io = dra7xx_map_io,
|
||||
.init_early = dra7xx_init_early,
|
||||
|
@ -559,7 +559,14 @@ static void pdata_quirks_check(struct pdata_init *quirks)
|
||||
|
||||
void __init pdata_quirks_init(const struct of_device_id *omap_dt_match_table)
|
||||
{
|
||||
omap_sdrc_init(NULL, NULL);
|
||||
/*
|
||||
* We still need this for omap2420 and omap3 PM to work, others are
|
||||
* using drivers/misc/sram.c already.
|
||||
*/
|
||||
if (of_machine_is_compatible("ti,omap2420") ||
|
||||
of_machine_is_compatible("ti,omap3"))
|
||||
omap_sdrc_init(NULL, NULL);
|
||||
|
||||
pdata_quirks_check(auxdata_quirks);
|
||||
of_platform_populate(NULL, omap_dt_match_table,
|
||||
omap_auxdata_lookup, NULL);
|
||||
|
@ -42,10 +42,6 @@
|
||||
#define PECR_IS(n) ((1 << ((n) * 2)) << 29)
|
||||
|
||||
extern void __init pxa_dt_irq_init(int (*fn)(struct irq_data *, unsigned int));
|
||||
#ifdef CONFIG_PM
|
||||
|
||||
#define ISRAM_START 0x5c000000
|
||||
#define ISRAM_SIZE SZ_256K
|
||||
|
||||
/*
|
||||
* NAND NFC: DFI bus arbitration subset
|
||||
@ -54,6 +50,11 @@ extern void __init pxa_dt_irq_init(int (*fn)(struct irq_data *, unsigned int));
|
||||
#define NDCR_ND_ARB_EN (1 << 12)
|
||||
#define NDCR_ND_ARB_CNTL (1 << 19)
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
|
||||
#define ISRAM_START 0x5c000000
|
||||
#define ISRAM_SIZE SZ_256K
|
||||
|
||||
static void __iomem *sram;
|
||||
static unsigned long wakeup_src;
|
||||
|
||||
|
@ -614,6 +614,7 @@ load_common:
|
||||
case BPF_LD | BPF_B | BPF_IND:
|
||||
load_order = 0;
|
||||
load_ind:
|
||||
update_on_xread(ctx);
|
||||
OP_IMM3(ARM_ADD, r_off, r_X, k, ctx);
|
||||
goto load_common;
|
||||
case BPF_LDX | BPF_IMM:
|
||||
|
@ -495,7 +495,7 @@ void __init orion_ge00_switch_init(struct dsa_platform_data *d, int irq)
|
||||
|
||||
d->netdev = &orion_ge00.dev;
|
||||
for (i = 0; i < d->nr_chips; i++)
|
||||
d->chip[i].host_dev = &orion_ge00_shared.dev;
|
||||
d->chip[i].host_dev = &orion_ge_mvmdio.dev;
|
||||
orion_switch_device.dev.platform_data = d;
|
||||
|
||||
platform_device_register(&orion_switch_device);
|
||||
|
@ -3,7 +3,6 @@
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
#include <asm/reg.h>
|
||||
|
||||
/* bytes per L1 cache line */
|
||||
#if defined(CONFIG_8xx) || defined(CONFIG_403GCX)
|
||||
@ -40,12 +39,6 @@ struct ppc64_caches {
|
||||
};
|
||||
|
||||
extern struct ppc64_caches ppc64_caches;
|
||||
|
||||
static inline void logmpp(u64 x)
|
||||
{
|
||||
asm volatile(PPC_LOGMPP(R1) : : "r" (x));
|
||||
}
|
||||
|
||||
#endif /* __powerpc64__ && ! __ASSEMBLY__ */
|
||||
|
||||
#if defined(__ASSEMBLY__)
|
||||
|
@ -297,8 +297,6 @@ struct kvmppc_vcore {
|
||||
u32 arch_compat;
|
||||
ulong pcr;
|
||||
ulong dpdes; /* doorbell state (POWER8) */
|
||||
void *mpp_buffer; /* Micro Partition Prefetch buffer */
|
||||
bool mpp_buffer_is_valid;
|
||||
ulong conferring_threads;
|
||||
};
|
||||
|
||||
|
@ -141,7 +141,6 @@
|
||||
#define PPC_INST_ISEL 0x7c00001e
|
||||
#define PPC_INST_ISEL_MASK 0xfc00003e
|
||||
#define PPC_INST_LDARX 0x7c0000a8
|
||||
#define PPC_INST_LOGMPP 0x7c0007e4
|
||||
#define PPC_INST_LSWI 0x7c0004aa
|
||||
#define PPC_INST_LSWX 0x7c00042a
|
||||
#define PPC_INST_LWARX 0x7c000028
|
||||
@ -285,20 +284,6 @@
|
||||
#define __PPC_EH(eh) 0
|
||||
#endif
|
||||
|
||||
/* POWER8 Micro Partition Prefetch (MPP) parameters */
|
||||
/* Address mask is common for LOGMPP instruction and MPPR SPR */
|
||||
#define PPC_MPPE_ADDRESS_MASK 0xffffffffc000ULL
|
||||
|
||||
/* Bits 60 and 61 of MPP SPR should be set to one of the following */
|
||||
/* Aborting the fetch is indeed setting 00 in the table size bits */
|
||||
#define PPC_MPPR_FETCH_ABORT (0x0ULL << 60)
|
||||
#define PPC_MPPR_FETCH_WHOLE_TABLE (0x2ULL << 60)
|
||||
|
||||
/* Bits 54 and 55 of register for LOGMPP instruction should be set to: */
|
||||
#define PPC_LOGMPP_LOG_L2 (0x02ULL << 54)
|
||||
#define PPC_LOGMPP_LOG_L2L3 (0x01ULL << 54)
|
||||
#define PPC_LOGMPP_LOG_ABORT (0x03ULL << 54)
|
||||
|
||||
/* Deal with instructions that older assemblers aren't aware of */
|
||||
#define PPC_DCBAL(a, b) stringify_in_c(.long PPC_INST_DCBAL | \
|
||||
__PPC_RA(a) | __PPC_RB(b))
|
||||
@ -307,8 +292,6 @@
|
||||
#define PPC_LDARX(t, a, b, eh) stringify_in_c(.long PPC_INST_LDARX | \
|
||||
___PPC_RT(t) | ___PPC_RA(a) | \
|
||||
___PPC_RB(b) | __PPC_EH(eh))
|
||||
#define PPC_LOGMPP(b) stringify_in_c(.long PPC_INST_LOGMPP | \
|
||||
__PPC_RB(b))
|
||||
#define PPC_LWARX(t, a, b, eh) stringify_in_c(.long PPC_INST_LWARX | \
|
||||
___PPC_RT(t) | ___PPC_RA(a) | \
|
||||
___PPC_RB(b) | __PPC_EH(eh))
|
||||
|
@ -226,7 +226,6 @@
|
||||
#define CTRL_TE 0x00c00000 /* thread enable */
|
||||
#define CTRL_RUNLATCH 0x1
|
||||
#define SPRN_DAWR 0xB4
|
||||
#define SPRN_MPPR 0xB8 /* Micro Partition Prefetch Register */
|
||||
#define SPRN_RPR 0xBA /* Relative Priority Register */
|
||||
#define SPRN_CIABR 0xBB
|
||||
#define CIABR_PRIV 0x3
|
||||
|
@ -1043,6 +1043,9 @@ asmlinkage int ppc_rtas(struct rtas_args __user *uargs)
|
||||
if (!capable(CAP_SYS_ADMIN))
|
||||
return -EPERM;
|
||||
|
||||
if (!rtas.entry)
|
||||
return -EINVAL;
|
||||
|
||||
if (copy_from_user(&args, uargs, 3 * sizeof(u32)) != 0)
|
||||
return -EFAULT;
|
||||
|
||||
|
@ -36,7 +36,6 @@
|
||||
|
||||
#include <asm/reg.h>
|
||||
#include <asm/cputable.h>
|
||||
#include <asm/cache.h>
|
||||
#include <asm/cacheflush.h>
|
||||
#include <asm/tlbflush.h>
|
||||
#include <asm/uaccess.h>
|
||||
@ -75,12 +74,6 @@
|
||||
|
||||
static DECLARE_BITMAP(default_enabled_hcalls, MAX_HCALL_OPCODE/4 + 1);
|
||||
|
||||
#if defined(CONFIG_PPC_64K_PAGES)
|
||||
#define MPP_BUFFER_ORDER 0
|
||||
#elif defined(CONFIG_PPC_4K_PAGES)
|
||||
#define MPP_BUFFER_ORDER 3
|
||||
#endif
|
||||
|
||||
static int dynamic_mt_modes = 6;
|
||||
module_param(dynamic_mt_modes, int, S_IRUGO | S_IWUSR);
|
||||
MODULE_PARM_DESC(dynamic_mt_modes, "Set of allowed dynamic micro-threading modes: 0 (= none), 2, 4, or 6 (= 2 or 4)");
|
||||
@ -1455,13 +1448,6 @@ static struct kvmppc_vcore *kvmppc_vcore_create(struct kvm *kvm, int core)
|
||||
vcore->kvm = kvm;
|
||||
INIT_LIST_HEAD(&vcore->preempt_list);
|
||||
|
||||
vcore->mpp_buffer_is_valid = false;
|
||||
|
||||
if (cpu_has_feature(CPU_FTR_ARCH_207S))
|
||||
vcore->mpp_buffer = (void *)__get_free_pages(
|
||||
GFP_KERNEL|__GFP_ZERO,
|
||||
MPP_BUFFER_ORDER);
|
||||
|
||||
return vcore;
|
||||
}
|
||||
|
||||
@ -1894,33 +1880,6 @@ static int on_primary_thread(void)
|
||||
return 1;
|
||||
}
|
||||
|
||||
static void kvmppc_start_saving_l2_cache(struct kvmppc_vcore *vc)
|
||||
{
|
||||
phys_addr_t phy_addr, mpp_addr;
|
||||
|
||||
phy_addr = (phys_addr_t)virt_to_phys(vc->mpp_buffer);
|
||||
mpp_addr = phy_addr & PPC_MPPE_ADDRESS_MASK;
|
||||
|
||||
mtspr(SPRN_MPPR, mpp_addr | PPC_MPPR_FETCH_ABORT);
|
||||
logmpp(mpp_addr | PPC_LOGMPP_LOG_L2);
|
||||
|
||||
vc->mpp_buffer_is_valid = true;
|
||||
}
|
||||
|
||||
static void kvmppc_start_restoring_l2_cache(const struct kvmppc_vcore *vc)
|
||||
{
|
||||
phys_addr_t phy_addr, mpp_addr;
|
||||
|
||||
phy_addr = virt_to_phys(vc->mpp_buffer);
|
||||
mpp_addr = phy_addr & PPC_MPPE_ADDRESS_MASK;
|
||||
|
||||
/* We must abort any in-progress save operations to ensure
|
||||
* the table is valid so that prefetch engine knows when to
|
||||
* stop prefetching. */
|
||||
logmpp(mpp_addr | PPC_LOGMPP_LOG_ABORT);
|
||||
mtspr(SPRN_MPPR, mpp_addr | PPC_MPPR_FETCH_WHOLE_TABLE);
|
||||
}
|
||||
|
||||
/*
|
||||
* A list of virtual cores for each physical CPU.
|
||||
* These are vcores that could run but their runner VCPU tasks are
|
||||
@ -2471,14 +2430,8 @@ static noinline void kvmppc_run_core(struct kvmppc_vcore *vc)
|
||||
|
||||
srcu_idx = srcu_read_lock(&vc->kvm->srcu);
|
||||
|
||||
if (vc->mpp_buffer_is_valid)
|
||||
kvmppc_start_restoring_l2_cache(vc);
|
||||
|
||||
__kvmppc_vcore_entry();
|
||||
|
||||
if (vc->mpp_buffer)
|
||||
kvmppc_start_saving_l2_cache(vc);
|
||||
|
||||
srcu_read_unlock(&vc->kvm->srcu, srcu_idx);
|
||||
|
||||
spin_lock(&vc->lock);
|
||||
@ -3073,14 +3026,8 @@ static void kvmppc_free_vcores(struct kvm *kvm)
|
||||
{
|
||||
long int i;
|
||||
|
||||
for (i = 0; i < KVM_MAX_VCORES; ++i) {
|
||||
if (kvm->arch.vcores[i] && kvm->arch.vcores[i]->mpp_buffer) {
|
||||
struct kvmppc_vcore *vc = kvm->arch.vcores[i];
|
||||
free_pages((unsigned long)vc->mpp_buffer,
|
||||
MPP_BUFFER_ORDER);
|
||||
}
|
||||
for (i = 0; i < KVM_MAX_VCORES; ++i)
|
||||
kfree(kvm->arch.vcores[i]);
|
||||
}
|
||||
kvm->arch.online_vcores = 0;
|
||||
}
|
||||
|
||||
|
@ -171,7 +171,26 @@ static void pnv_smp_cpu_kill_self(void)
|
||||
* so clear LPCR:PECE1. We keep PECE2 enabled.
|
||||
*/
|
||||
mtspr(SPRN_LPCR, mfspr(SPRN_LPCR) & ~(u64)LPCR_PECE1);
|
||||
|
||||
/*
|
||||
* Hard-disable interrupts, and then clear irq_happened flags
|
||||
* that we can safely ignore while off-line, since they
|
||||
* are for things for which we do no processing when off-line
|
||||
* (or in the case of HMI, all the processing we need to do
|
||||
* is done in lower-level real-mode code).
|
||||
*/
|
||||
hard_irq_disable();
|
||||
local_paca->irq_happened &= ~(PACA_IRQ_DEC | PACA_IRQ_HMI);
|
||||
|
||||
while (!generic_check_cpu_restart(cpu)) {
|
||||
/*
|
||||
* Clear IPI flag, since we don't handle IPIs while
|
||||
* offline, except for those when changing micro-threading
|
||||
* mode, which are handled explicitly below, and those
|
||||
* for coming online, which are handled via
|
||||
* generic_check_cpu_restart() calls.
|
||||
*/
|
||||
kvmppc_set_host_ipi(cpu, 0);
|
||||
|
||||
ppc64_runlatch_off();
|
||||
|
||||
@ -196,20 +215,20 @@ static void pnv_smp_cpu_kill_self(void)
|
||||
* having finished executing in a KVM guest, then srr1
|
||||
* contains 0.
|
||||
*/
|
||||
if ((srr1 & wmask) == SRR1_WAKEEE) {
|
||||
if (((srr1 & wmask) == SRR1_WAKEEE) ||
|
||||
(local_paca->irq_happened & PACA_IRQ_EE)) {
|
||||
icp_native_flush_interrupt();
|
||||
local_paca->irq_happened &= PACA_IRQ_HARD_DIS;
|
||||
smp_mb();
|
||||
} else if ((srr1 & wmask) == SRR1_WAKEHDBELL) {
|
||||
unsigned long msg = PPC_DBELL_TYPE(PPC_DBELL_SERVER);
|
||||
asm volatile(PPC_MSGCLR(%0) : : "r" (msg));
|
||||
kvmppc_set_host_ipi(cpu, 0);
|
||||
}
|
||||
local_paca->irq_happened &= ~(PACA_IRQ_EE | PACA_IRQ_DBELL);
|
||||
smp_mb();
|
||||
|
||||
if (cpu_core_split_required())
|
||||
continue;
|
||||
|
||||
if (!generic_check_cpu_restart(cpu))
|
||||
if (srr1 && !generic_check_cpu_restart(cpu))
|
||||
DBG("CPU%d Unexpected exit while offline !\n", cpu);
|
||||
}
|
||||
mtspr(SPRN_LPCR, mfspr(SPRN_LPCR) | LPCR_PECE1);
|
||||
|
@ -70,8 +70,8 @@ KBUILD_AFLAGS += $(ARCH_INCLUDE)
|
||||
|
||||
USER_CFLAGS = $(patsubst $(KERNEL_DEFINES),,$(patsubst -I%,,$(KBUILD_CFLAGS))) \
|
||||
$(ARCH_INCLUDE) $(MODE_INCLUDE) $(filter -I%,$(CFLAGS)) \
|
||||
-D_FILE_OFFSET_BITS=64 -idirafter include \
|
||||
-D__KERNEL__ -D__UM_HOST__
|
||||
-D_FILE_OFFSET_BITS=64 -idirafter $(srctree)/include \
|
||||
-idirafter $(obj)/include -D__KERNEL__ -D__UM_HOST__
|
||||
|
||||
#This will adjust *FLAGS accordingly to the platform.
|
||||
include $(ARCH_DIR)/Makefile-os-$(OS)
|
||||
|
@ -220,7 +220,7 @@ unsigned long segv(struct faultinfo fi, unsigned long ip, int is_user,
|
||||
show_regs(container_of(regs, struct pt_regs, regs));
|
||||
panic("Segfault with no mm");
|
||||
}
|
||||
else if (!is_user && address < TASK_SIZE) {
|
||||
else if (!is_user && address > PAGE_SIZE && address < TASK_SIZE) {
|
||||
show_regs(container_of(regs, struct pt_regs, regs));
|
||||
panic("Kernel tried to access user memory at addr 0x%lx, ip 0x%lx",
|
||||
address, ip);
|
||||
|
@ -96,7 +96,7 @@ int run_helper(void (*pre_exec)(void *), void *pre_data, char **argv)
|
||||
"ret = %d\n", -n);
|
||||
ret = n;
|
||||
}
|
||||
CATCH_EINTR(waitpid(pid, NULL, __WCLONE));
|
||||
CATCH_EINTR(waitpid(pid, NULL, __WALL));
|
||||
}
|
||||
|
||||
out_free2:
|
||||
@ -129,7 +129,7 @@ int run_helper_thread(int (*proc)(void *), void *arg, unsigned int flags,
|
||||
return err;
|
||||
}
|
||||
if (stack_out == NULL) {
|
||||
CATCH_EINTR(pid = waitpid(pid, &status, __WCLONE));
|
||||
CATCH_EINTR(pid = waitpid(pid, &status, __WALL));
|
||||
if (pid < 0) {
|
||||
err = -errno;
|
||||
printk(UM_KERN_ERR "run_helper_thread - wait failed, "
|
||||
@ -148,7 +148,7 @@ int run_helper_thread(int (*proc)(void *), void *arg, unsigned int flags,
|
||||
int helper_wait(int pid)
|
||||
{
|
||||
int ret, status;
|
||||
int wflags = __WCLONE;
|
||||
int wflags = __WALL;
|
||||
|
||||
CATCH_EINTR(ret = waitpid(pid, &status, wflags));
|
||||
if (ret < 0) {
|
||||
|
@ -667,6 +667,7 @@ setup_gop32(struct screen_info *si, efi_guid_t *proto,
|
||||
bool conout_found = false;
|
||||
void *dummy = NULL;
|
||||
u32 h = handles[i];
|
||||
u32 current_fb_base;
|
||||
|
||||
status = efi_call_early(handle_protocol, h,
|
||||
proto, (void **)&gop32);
|
||||
@ -678,7 +679,7 @@ setup_gop32(struct screen_info *si, efi_guid_t *proto,
|
||||
if (status == EFI_SUCCESS)
|
||||
conout_found = true;
|
||||
|
||||
status = __gop_query32(gop32, &info, &size, &fb_base);
|
||||
status = __gop_query32(gop32, &info, &size, ¤t_fb_base);
|
||||
if (status == EFI_SUCCESS && (!first_gop || conout_found)) {
|
||||
/*
|
||||
* Systems that use the UEFI Console Splitter may
|
||||
@ -692,6 +693,7 @@ setup_gop32(struct screen_info *si, efi_guid_t *proto,
|
||||
pixel_format = info->pixel_format;
|
||||
pixel_info = info->pixel_information;
|
||||
pixels_per_scan_line = info->pixels_per_scan_line;
|
||||
fb_base = current_fb_base;
|
||||
|
||||
/*
|
||||
* Once we've found a GOP supporting ConOut,
|
||||
@ -770,6 +772,7 @@ setup_gop64(struct screen_info *si, efi_guid_t *proto,
|
||||
bool conout_found = false;
|
||||
void *dummy = NULL;
|
||||
u64 h = handles[i];
|
||||
u32 current_fb_base;
|
||||
|
||||
status = efi_call_early(handle_protocol, h,
|
||||
proto, (void **)&gop64);
|
||||
@ -781,7 +784,7 @@ setup_gop64(struct screen_info *si, efi_guid_t *proto,
|
||||
if (status == EFI_SUCCESS)
|
||||
conout_found = true;
|
||||
|
||||
status = __gop_query64(gop64, &info, &size, &fb_base);
|
||||
status = __gop_query64(gop64, &info, &size, ¤t_fb_base);
|
||||
if (status == EFI_SUCCESS && (!first_gop || conout_found)) {
|
||||
/*
|
||||
* Systems that use the UEFI Console Splitter may
|
||||
@ -795,6 +798,7 @@ setup_gop64(struct screen_info *si, efi_guid_t *proto,
|
||||
pixel_format = info->pixel_format;
|
||||
pixel_info = info->pixel_information;
|
||||
pixels_per_scan_line = info->pixels_per_scan_line;
|
||||
fb_base = current_fb_base;
|
||||
|
||||
/*
|
||||
* Once we've found a GOP supporting ConOut,
|
||||
|
@ -27,12 +27,11 @@ static __always_inline void *__inline_memcpy(void *to, const void *from, size_t
|
||||
function. */
|
||||
|
||||
#define __HAVE_ARCH_MEMCPY 1
|
||||
extern void *memcpy(void *to, const void *from, size_t len);
|
||||
extern void *__memcpy(void *to, const void *from, size_t len);
|
||||
|
||||
#ifndef CONFIG_KMEMCHECK
|
||||
#if (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) || __GNUC__ > 4
|
||||
extern void *memcpy(void *to, const void *from, size_t len);
|
||||
#else
|
||||
#if (__GNUC__ == 4 && __GNUC_MINOR__ < 3) || __GNUC__ < 4
|
||||
#define memcpy(dst, src, len) \
|
||||
({ \
|
||||
size_t __len = (len); \
|
||||
|
@ -2907,6 +2907,7 @@ int mp_irqdomain_alloc(struct irq_domain *domain, unsigned int virq,
|
||||
struct irq_data *irq_data;
|
||||
struct mp_chip_data *data;
|
||||
struct irq_alloc_info *info = arg;
|
||||
unsigned long flags;
|
||||
|
||||
if (!info || nr_irqs > 1)
|
||||
return -EINVAL;
|
||||
@ -2939,11 +2940,14 @@ int mp_irqdomain_alloc(struct irq_domain *domain, unsigned int virq,
|
||||
|
||||
cfg = irqd_cfg(irq_data);
|
||||
add_pin_to_irq_node(data, ioapic_alloc_attr_node(info), ioapic, pin);
|
||||
|
||||
local_irq_save(flags);
|
||||
if (info->ioapic_entry)
|
||||
mp_setup_entry(cfg, data, info->ioapic_entry);
|
||||
mp_register_handler(virq, data->trigger);
|
||||
if (virq < nr_legacy_irqs())
|
||||
legacy_pic->mask(virq);
|
||||
local_irq_restore(flags);
|
||||
|
||||
apic_printk(APIC_VERBOSE, KERN_DEBUG
|
||||
"IOAPIC[%d]: Set routing entry (%d-%d -> 0x%x -> IRQ %d Mode:%i Active:%i Dest:%d)\n",
|
||||
|
@ -550,14 +550,14 @@ unsigned long get_wchan(struct task_struct *p)
|
||||
if (sp < bottom || sp > top)
|
||||
return 0;
|
||||
|
||||
fp = READ_ONCE(*(unsigned long *)sp);
|
||||
fp = READ_ONCE_NOCHECK(*(unsigned long *)sp);
|
||||
do {
|
||||
if (fp < bottom || fp > top)
|
||||
return 0;
|
||||
ip = READ_ONCE(*(unsigned long *)(fp + sizeof(unsigned long)));
|
||||
ip = READ_ONCE_NOCHECK(*(unsigned long *)(fp + sizeof(unsigned long)));
|
||||
if (!in_sched_functions(ip))
|
||||
return ip;
|
||||
fp = READ_ONCE(*(unsigned long *)fp);
|
||||
fp = READ_ONCE_NOCHECK(*(unsigned long *)fp);
|
||||
} while (count++ < 16 && p->state != TASK_RUNNING);
|
||||
return 0;
|
||||
}
|
||||
|
@ -1173,6 +1173,14 @@ void __init setup_arch(char **cmdline_p)
|
||||
clone_pgd_range(initial_page_table + KERNEL_PGD_BOUNDARY,
|
||||
swapper_pg_dir + KERNEL_PGD_BOUNDARY,
|
||||
KERNEL_PGD_PTRS);
|
||||
|
||||
/*
|
||||
* sync back low identity map too. It is used for example
|
||||
* in the 32-bit EFI stub.
|
||||
*/
|
||||
clone_pgd_range(initial_page_table,
|
||||
swapper_pg_dir + KERNEL_PGD_BOUNDARY,
|
||||
KERNEL_PGD_PTRS);
|
||||
#endif
|
||||
|
||||
tboot_probe();
|
||||
|
@ -509,7 +509,7 @@ void __inquire_remote_apic(int apicid)
|
||||
*/
|
||||
#define UDELAY_10MS_DEFAULT 10000
|
||||
|
||||
static unsigned int init_udelay = UDELAY_10MS_DEFAULT;
|
||||
static unsigned int init_udelay = INT_MAX;
|
||||
|
||||
static int __init cpu_init_udelay(char *str)
|
||||
{
|
||||
@ -522,13 +522,16 @@ early_param("cpu_init_udelay", cpu_init_udelay);
|
||||
static void __init smp_quirk_init_udelay(void)
|
||||
{
|
||||
/* if cmdline changed it from default, leave it alone */
|
||||
if (init_udelay != UDELAY_10MS_DEFAULT)
|
||||
if (init_udelay != INT_MAX)
|
||||
return;
|
||||
|
||||
/* if modern processor, use no delay */
|
||||
if (((boot_cpu_data.x86_vendor == X86_VENDOR_INTEL) && (boot_cpu_data.x86 == 6)) ||
|
||||
((boot_cpu_data.x86_vendor == X86_VENDOR_AMD) && (boot_cpu_data.x86 >= 0xF)))
|
||||
init_udelay = 0;
|
||||
|
||||
/* else, use legacy delay */
|
||||
init_udelay = UDELAY_10MS_DEFAULT;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -657,7 +660,9 @@ wakeup_secondary_cpu_via_init(int phys_apicid, unsigned long start_eip)
|
||||
/*
|
||||
* Give the other CPU some time to accept the IPI.
|
||||
*/
|
||||
if (init_udelay)
|
||||
if (init_udelay == 0)
|
||||
udelay(10);
|
||||
else
|
||||
udelay(300);
|
||||
|
||||
pr_debug("Startup point 1\n");
|
||||
@ -668,7 +673,9 @@ wakeup_secondary_cpu_via_init(int phys_apicid, unsigned long start_eip)
|
||||
/*
|
||||
* Give the other CPU some time to accept the IPI.
|
||||
*/
|
||||
if (init_udelay)
|
||||
if (init_udelay == 0)
|
||||
udelay(10);
|
||||
else
|
||||
udelay(200);
|
||||
|
||||
if (maxlvt > 3) /* Due to the Pentium erratum 3AP. */
|
||||
|
@ -12,7 +12,10 @@
|
||||
#include <skas.h>
|
||||
#include <sysdep/tls.h>
|
||||
|
||||
extern int modify_ldt(int func, void *ptr, unsigned long bytecount);
|
||||
static inline int modify_ldt (int func, void *ptr, unsigned long bytecount)
|
||||
{
|
||||
return syscall(__NR_modify_ldt, func, ptr, bytecount);
|
||||
}
|
||||
|
||||
static long write_ldt_entry(struct mm_id *mm_idp, int func,
|
||||
struct user_desc *desc, void **addr, int done)
|
||||
|
@ -576,7 +576,7 @@ void blk_cleanup_queue(struct request_queue *q)
|
||||
q->queue_lock = &q->__queue_lock;
|
||||
spin_unlock_irq(lock);
|
||||
|
||||
bdi_destroy(&q->backing_dev_info);
|
||||
bdi_unregister(&q->backing_dev_info);
|
||||
|
||||
/* @q is and will stay empty, shutdown and put */
|
||||
blk_put_queue(q);
|
||||
|
@ -641,6 +641,7 @@ void blk_mq_free_tags(struct blk_mq_tags *tags)
|
||||
{
|
||||
bt_free(&tags->bitmap_tags);
|
||||
bt_free(&tags->breserved_tags);
|
||||
free_cpumask_var(tags->cpumask);
|
||||
kfree(tags);
|
||||
}
|
||||
|
||||
|
@ -2296,10 +2296,8 @@ void blk_mq_free_tag_set(struct blk_mq_tag_set *set)
|
||||
int i;
|
||||
|
||||
for (i = 0; i < set->nr_hw_queues; i++) {
|
||||
if (set->tags[i]) {
|
||||
if (set->tags[i])
|
||||
blk_mq_free_rq_map(set, set->tags[i], i);
|
||||
free_cpumask_var(set->tags[i]->cpumask);
|
||||
}
|
||||
}
|
||||
|
||||
kfree(set->tags);
|
||||
|
@ -540,6 +540,7 @@ static void blk_release_queue(struct kobject *kobj)
|
||||
struct request_queue *q =
|
||||
container_of(kobj, struct request_queue, kobj);
|
||||
|
||||
bdi_exit(&q->backing_dev_info);
|
||||
blkcg_exit_queue(q);
|
||||
|
||||
if (q->elevator) {
|
||||
|
@ -187,7 +187,7 @@ int __init dma_contiguous_reserve_area(phys_addr_t size, phys_addr_t base,
|
||||
* global one. Requires architecture specific dev_get_cma_area() helper
|
||||
* function.
|
||||
*/
|
||||
struct page *dma_alloc_from_contiguous(struct device *dev, int count,
|
||||
struct page *dma_alloc_from_contiguous(struct device *dev, size_t count,
|
||||
unsigned int align)
|
||||
{
|
||||
if (align > CONFIG_CMA_ALIGNMENT)
|
||||
|
@ -60,6 +60,7 @@ struct nbd_device {
|
||||
bool disconnect; /* a disconnect has been requested by user */
|
||||
|
||||
struct timer_list timeout_timer;
|
||||
spinlock_t tasks_lock;
|
||||
struct task_struct *task_recv;
|
||||
struct task_struct *task_send;
|
||||
|
||||
@ -140,21 +141,23 @@ static void sock_shutdown(struct nbd_device *nbd)
|
||||
static void nbd_xmit_timeout(unsigned long arg)
|
||||
{
|
||||
struct nbd_device *nbd = (struct nbd_device *)arg;
|
||||
struct task_struct *task;
|
||||
unsigned long flags;
|
||||
|
||||
if (list_empty(&nbd->queue_head))
|
||||
return;
|
||||
|
||||
nbd->disconnect = true;
|
||||
|
||||
task = READ_ONCE(nbd->task_recv);
|
||||
if (task)
|
||||
force_sig(SIGKILL, task);
|
||||
spin_lock_irqsave(&nbd->tasks_lock, flags);
|
||||
|
||||
task = READ_ONCE(nbd->task_send);
|
||||
if (task)
|
||||
if (nbd->task_recv)
|
||||
force_sig(SIGKILL, nbd->task_recv);
|
||||
|
||||
if (nbd->task_send)
|
||||
force_sig(SIGKILL, nbd->task_send);
|
||||
|
||||
spin_unlock_irqrestore(&nbd->tasks_lock, flags);
|
||||
|
||||
dev_err(nbd_to_dev(nbd), "Connection timed out, killed receiver and sender, shutting down connection\n");
|
||||
}
|
||||
|
||||
@ -403,17 +406,24 @@ static int nbd_thread_recv(struct nbd_device *nbd)
|
||||
{
|
||||
struct request *req;
|
||||
int ret;
|
||||
unsigned long flags;
|
||||
|
||||
BUG_ON(nbd->magic != NBD_MAGIC);
|
||||
|
||||
sk_set_memalloc(nbd->sock->sk);
|
||||
|
||||
spin_lock_irqsave(&nbd->tasks_lock, flags);
|
||||
nbd->task_recv = current;
|
||||
spin_unlock_irqrestore(&nbd->tasks_lock, flags);
|
||||
|
||||
ret = device_create_file(disk_to_dev(nbd->disk), &pid_attr);
|
||||
if (ret) {
|
||||
dev_err(disk_to_dev(nbd->disk), "device_create_file failed!\n");
|
||||
|
||||
spin_lock_irqsave(&nbd->tasks_lock, flags);
|
||||
nbd->task_recv = NULL;
|
||||
spin_unlock_irqrestore(&nbd->tasks_lock, flags);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -429,7 +439,9 @@ static int nbd_thread_recv(struct nbd_device *nbd)
|
||||
|
||||
device_remove_file(disk_to_dev(nbd->disk), &pid_attr);
|
||||
|
||||
spin_lock_irqsave(&nbd->tasks_lock, flags);
|
||||
nbd->task_recv = NULL;
|
||||
spin_unlock_irqrestore(&nbd->tasks_lock, flags);
|
||||
|
||||
if (signal_pending(current)) {
|
||||
siginfo_t info;
|
||||
@ -534,8 +546,11 @@ static int nbd_thread_send(void *data)
|
||||
{
|
||||
struct nbd_device *nbd = data;
|
||||
struct request *req;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&nbd->tasks_lock, flags);
|
||||
nbd->task_send = current;
|
||||
spin_unlock_irqrestore(&nbd->tasks_lock, flags);
|
||||
|
||||
set_user_nice(current, MIN_NICE);
|
||||
while (!kthread_should_stop() || !list_empty(&nbd->waiting_queue)) {
|
||||
@ -572,7 +587,15 @@ static int nbd_thread_send(void *data)
|
||||
nbd_handle_req(nbd, req);
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&nbd->tasks_lock, flags);
|
||||
nbd->task_send = NULL;
|
||||
spin_unlock_irqrestore(&nbd->tasks_lock, flags);
|
||||
|
||||
/* Clear maybe pending signals */
|
||||
if (signal_pending(current)) {
|
||||
siginfo_t info;
|
||||
dequeue_signal_lock(current, ¤t->blocked, &info);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -1052,6 +1075,7 @@ static int __init nbd_init(void)
|
||||
nbd_dev[i].magic = NBD_MAGIC;
|
||||
INIT_LIST_HEAD(&nbd_dev[i].waiting_queue);
|
||||
spin_lock_init(&nbd_dev[i].queue_lock);
|
||||
spin_lock_init(&nbd_dev[i].tasks_lock);
|
||||
INIT_LIST_HEAD(&nbd_dev[i].queue_head);
|
||||
mutex_init(&nbd_dev[i].tx_lock);
|
||||
init_timer(&nbd_dev[i].timeout_timer);
|
||||
|
@ -603,27 +603,31 @@ static void req_completion(struct nvme_queue *nvmeq, void *ctx,
|
||||
struct nvme_iod *iod = ctx;
|
||||
struct request *req = iod_get_private(iod);
|
||||
struct nvme_cmd_info *cmd_rq = blk_mq_rq_to_pdu(req);
|
||||
|
||||
u16 status = le16_to_cpup(&cqe->status) >> 1;
|
||||
bool requeue = false;
|
||||
int error = 0;
|
||||
|
||||
if (unlikely(status)) {
|
||||
if (!(status & NVME_SC_DNR || blk_noretry_request(req))
|
||||
&& (jiffies - req->start_time) < req->timeout) {
|
||||
unsigned long flags;
|
||||
|
||||
requeue = true;
|
||||
blk_mq_requeue_request(req);
|
||||
spin_lock_irqsave(req->q->queue_lock, flags);
|
||||
if (!blk_queue_stopped(req->q))
|
||||
blk_mq_kick_requeue_list(req->q);
|
||||
spin_unlock_irqrestore(req->q->queue_lock, flags);
|
||||
return;
|
||||
goto release_iod;
|
||||
}
|
||||
|
||||
if (req->cmd_type == REQ_TYPE_DRV_PRIV) {
|
||||
if (cmd_rq->ctx == CMD_CTX_CANCELLED)
|
||||
status = -EINTR;
|
||||
error = -EINTR;
|
||||
else
|
||||
error = status;
|
||||
} else {
|
||||
status = nvme_error_status(status);
|
||||
error = nvme_error_status(status);
|
||||
}
|
||||
}
|
||||
|
||||
@ -635,8 +639,9 @@ static void req_completion(struct nvme_queue *nvmeq, void *ctx,
|
||||
if (cmd_rq->aborted)
|
||||
dev_warn(nvmeq->dev->dev,
|
||||
"completing aborted command with status:%04x\n",
|
||||
status);
|
||||
error);
|
||||
|
||||
release_iod:
|
||||
if (iod->nents) {
|
||||
dma_unmap_sg(nvmeq->dev->dev, iod->sg, iod->nents,
|
||||
rq_data_dir(req) ? DMA_TO_DEVICE : DMA_FROM_DEVICE);
|
||||
@ -649,7 +654,8 @@ static void req_completion(struct nvme_queue *nvmeq, void *ctx,
|
||||
}
|
||||
nvme_free_iod(nvmeq->dev, iod);
|
||||
|
||||
blk_mq_complete_request(req, status);
|
||||
if (likely(!requeue))
|
||||
blk_mq_complete_request(req, error);
|
||||
}
|
||||
|
||||
/* length is in bytes. gfp flags indicates whether we may sleep. */
|
||||
@ -1804,7 +1810,7 @@ static int nvme_submit_io(struct nvme_ns *ns, struct nvme_user_io __user *uio)
|
||||
|
||||
length = (io.nblocks + 1) << ns->lba_shift;
|
||||
meta_len = (io.nblocks + 1) * ns->ms;
|
||||
metadata = (void __user *)(unsigned long)io.metadata;
|
||||
metadata = (void __user *)(uintptr_t)io.metadata;
|
||||
write = io.opcode & 1;
|
||||
|
||||
if (ns->ext) {
|
||||
@ -1844,7 +1850,7 @@ static int nvme_submit_io(struct nvme_ns *ns, struct nvme_user_io __user *uio)
|
||||
c.rw.metadata = cpu_to_le64(meta_dma);
|
||||
|
||||
status = __nvme_submit_sync_cmd(ns->queue, &c, NULL,
|
||||
(void __user *)io.addr, length, NULL, 0);
|
||||
(void __user *)(uintptr_t)io.addr, length, NULL, 0);
|
||||
unmap:
|
||||
if (meta) {
|
||||
if (status == NVME_SC_SUCCESS && !write) {
|
||||
@ -1886,7 +1892,7 @@ static int nvme_user_cmd(struct nvme_dev *dev, struct nvme_ns *ns,
|
||||
timeout = msecs_to_jiffies(cmd.timeout_ms);
|
||||
|
||||
status = __nvme_submit_sync_cmd(ns ? ns->queue : dev->admin_q, &c,
|
||||
NULL, (void __user *)cmd.addr, cmd.data_len,
|
||||
NULL, (void __user *)(uintptr_t)cmd.addr, cmd.data_len,
|
||||
&cmd.result, timeout);
|
||||
if (status >= 0) {
|
||||
if (put_user(cmd.result, &ucmd->result))
|
||||
|
@ -96,6 +96,8 @@ static int atomic_dec_return_safe(atomic_t *v)
|
||||
#define RBD_MINORS_PER_MAJOR 256
|
||||
#define RBD_SINGLE_MAJOR_PART_SHIFT 4
|
||||
|
||||
#define RBD_MAX_PARENT_CHAIN_LEN 16
|
||||
|
||||
#define RBD_SNAP_DEV_NAME_PREFIX "snap_"
|
||||
#define RBD_MAX_SNAP_NAME_LEN \
|
||||
(NAME_MAX - (sizeof (RBD_SNAP_DEV_NAME_PREFIX) - 1))
|
||||
@ -426,7 +428,7 @@ static ssize_t rbd_add_single_major(struct bus_type *bus, const char *buf,
|
||||
size_t count);
|
||||
static ssize_t rbd_remove_single_major(struct bus_type *bus, const char *buf,
|
||||
size_t count);
|
||||
static int rbd_dev_image_probe(struct rbd_device *rbd_dev, bool mapping);
|
||||
static int rbd_dev_image_probe(struct rbd_device *rbd_dev, int depth);
|
||||
static void rbd_spec_put(struct rbd_spec *spec);
|
||||
|
||||
static int rbd_dev_id_to_minor(int dev_id)
|
||||
@ -5131,44 +5133,51 @@ out_err:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int rbd_dev_probe_parent(struct rbd_device *rbd_dev)
|
||||
/*
|
||||
* @depth is rbd_dev_image_probe() -> rbd_dev_probe_parent() ->
|
||||
* rbd_dev_image_probe() recursion depth, which means it's also the
|
||||
* length of the already discovered part of the parent chain.
|
||||
*/
|
||||
static int rbd_dev_probe_parent(struct rbd_device *rbd_dev, int depth)
|
||||
{
|
||||
struct rbd_device *parent = NULL;
|
||||
struct rbd_spec *parent_spec;
|
||||
struct rbd_client *rbdc;
|
||||
int ret;
|
||||
|
||||
if (!rbd_dev->parent_spec)
|
||||
return 0;
|
||||
/*
|
||||
* We need to pass a reference to the client and the parent
|
||||
* spec when creating the parent rbd_dev. Images related by
|
||||
* parent/child relationships always share both.
|
||||
*/
|
||||
parent_spec = rbd_spec_get(rbd_dev->parent_spec);
|
||||
rbdc = __rbd_get_client(rbd_dev->rbd_client);
|
||||
|
||||
ret = -ENOMEM;
|
||||
parent = rbd_dev_create(rbdc, parent_spec, NULL);
|
||||
if (!parent)
|
||||
if (++depth > RBD_MAX_PARENT_CHAIN_LEN) {
|
||||
pr_info("parent chain is too long (%d)\n", depth);
|
||||
ret = -EINVAL;
|
||||
goto out_err;
|
||||
|
||||
ret = rbd_dev_image_probe(parent, false);
|
||||
if (ret < 0)
|
||||
goto out_err;
|
||||
rbd_dev->parent = parent;
|
||||
atomic_set(&rbd_dev->parent_ref, 1);
|
||||
|
||||
return 0;
|
||||
out_err:
|
||||
if (parent) {
|
||||
rbd_dev_unparent(rbd_dev);
|
||||
rbd_dev_destroy(parent);
|
||||
} else {
|
||||
rbd_put_client(rbdc);
|
||||
rbd_spec_put(parent_spec);
|
||||
}
|
||||
|
||||
parent = rbd_dev_create(rbd_dev->rbd_client, rbd_dev->parent_spec,
|
||||
NULL);
|
||||
if (!parent) {
|
||||
ret = -ENOMEM;
|
||||
goto out_err;
|
||||
}
|
||||
|
||||
/*
|
||||
* Images related by parent/child relationships always share
|
||||
* rbd_client and spec/parent_spec, so bump their refcounts.
|
||||
*/
|
||||
__rbd_get_client(rbd_dev->rbd_client);
|
||||
rbd_spec_get(rbd_dev->parent_spec);
|
||||
|
||||
ret = rbd_dev_image_probe(parent, depth);
|
||||
if (ret < 0)
|
||||
goto out_err;
|
||||
|
||||
rbd_dev->parent = parent;
|
||||
atomic_set(&rbd_dev->parent_ref, 1);
|
||||
return 0;
|
||||
|
||||
out_err:
|
||||
rbd_dev_unparent(rbd_dev);
|
||||
if (parent)
|
||||
rbd_dev_destroy(parent);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -5286,7 +5295,7 @@ static void rbd_dev_image_release(struct rbd_device *rbd_dev)
|
||||
* parent), initiate a watch on its header object before using that
|
||||
* object to get detailed information about the rbd image.
|
||||
*/
|
||||
static int rbd_dev_image_probe(struct rbd_device *rbd_dev, bool mapping)
|
||||
static int rbd_dev_image_probe(struct rbd_device *rbd_dev, int depth)
|
||||
{
|
||||
int ret;
|
||||
|
||||
@ -5304,7 +5313,7 @@ static int rbd_dev_image_probe(struct rbd_device *rbd_dev, bool mapping)
|
||||
if (ret)
|
||||
goto err_out_format;
|
||||
|
||||
if (mapping) {
|
||||
if (!depth) {
|
||||
ret = rbd_dev_header_watch_sync(rbd_dev);
|
||||
if (ret) {
|
||||
if (ret == -ENOENT)
|
||||
@ -5325,7 +5334,7 @@ static int rbd_dev_image_probe(struct rbd_device *rbd_dev, bool mapping)
|
||||
* Otherwise this is a parent image, identified by pool, image
|
||||
* and snap ids - need to fill in names for those ids.
|
||||
*/
|
||||
if (mapping)
|
||||
if (!depth)
|
||||
ret = rbd_spec_fill_snap_id(rbd_dev);
|
||||
else
|
||||
ret = rbd_spec_fill_names(rbd_dev);
|
||||
@ -5347,12 +5356,12 @@ static int rbd_dev_image_probe(struct rbd_device *rbd_dev, bool mapping)
|
||||
* Need to warn users if this image is the one being
|
||||
* mapped and has a parent.
|
||||
*/
|
||||
if (mapping && rbd_dev->parent_spec)
|
||||
if (!depth && rbd_dev->parent_spec)
|
||||
rbd_warn(rbd_dev,
|
||||
"WARNING: kernel layering is EXPERIMENTAL!");
|
||||
}
|
||||
|
||||
ret = rbd_dev_probe_parent(rbd_dev);
|
||||
ret = rbd_dev_probe_parent(rbd_dev, depth);
|
||||
if (ret)
|
||||
goto err_out_probe;
|
||||
|
||||
@ -5363,7 +5372,7 @@ static int rbd_dev_image_probe(struct rbd_device *rbd_dev, bool mapping)
|
||||
err_out_probe:
|
||||
rbd_dev_unprobe(rbd_dev);
|
||||
err_out_watch:
|
||||
if (mapping)
|
||||
if (!depth)
|
||||
rbd_dev_header_unwatch_sync(rbd_dev);
|
||||
out_header_name:
|
||||
kfree(rbd_dev->header_name);
|
||||
@ -5426,7 +5435,7 @@ static ssize_t do_rbd_add(struct bus_type *bus,
|
||||
spec = NULL; /* rbd_dev now owns this */
|
||||
rbd_opts = NULL; /* rbd_dev now owns this */
|
||||
|
||||
rc = rbd_dev_image_probe(rbd_dev, true);
|
||||
rc = rbd_dev_image_probe(rbd_dev, 0);
|
||||
if (rc < 0)
|
||||
goto err_out_rbd_dev;
|
||||
|
||||
|
@ -1956,7 +1956,8 @@ static void blkback_changed(struct xenbus_device *dev,
|
||||
break;
|
||||
/* Missed the backend's Closing state -- fallthrough */
|
||||
case XenbusStateClosing:
|
||||
blkfront_closing(info);
|
||||
if (info)
|
||||
blkfront_closing(info);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -1184,11 +1184,12 @@ static int arm_ccn_pmu_cpu_notifier(struct notifier_block *nb,
|
||||
if (!cpumask_test_and_clear_cpu(cpu, &dt->cpu))
|
||||
break;
|
||||
target = cpumask_any_but(cpu_online_mask, cpu);
|
||||
if (target < 0)
|
||||
if (target >= nr_cpu_ids)
|
||||
break;
|
||||
perf_pmu_migrate_context(&dt->pmu, cpu, target);
|
||||
cpumask_set_cpu(target, &dt->cpu);
|
||||
WARN_ON(irq_set_affinity(ccn->irq, &dt->cpu) != 0);
|
||||
if (ccn->irq)
|
||||
WARN_ON(irq_set_affinity(ccn->irq, &dt->cpu) != 0);
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@ -294,10 +294,14 @@ static umode_t hwmon_attributes_visible(struct kobject *kobj,
|
||||
struct amdgpu_device *adev = dev_get_drvdata(dev);
|
||||
umode_t effective_mode = attr->mode;
|
||||
|
||||
/* Skip limit attributes if DPM is not enabled */
|
||||
/* Skip attributes if DPM is not enabled */
|
||||
if (!adev->pm.dpm_enabled &&
|
||||
(attr == &sensor_dev_attr_temp1_crit.dev_attr.attr ||
|
||||
attr == &sensor_dev_attr_temp1_crit_hyst.dev_attr.attr))
|
||||
attr == &sensor_dev_attr_temp1_crit_hyst.dev_attr.attr ||
|
||||
attr == &sensor_dev_attr_pwm1.dev_attr.attr ||
|
||||
attr == &sensor_dev_attr_pwm1_enable.dev_attr.attr ||
|
||||
attr == &sensor_dev_attr_pwm1_max.dev_attr.attr ||
|
||||
attr == &sensor_dev_attr_pwm1_min.dev_attr.attr))
|
||||
return 0;
|
||||
|
||||
/* Skip fan attributes if fan is not present */
|
||||
|
@ -2997,6 +2997,9 @@ static int kv_dpm_late_init(void *handle)
|
||||
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
|
||||
int ret;
|
||||
|
||||
if (!amdgpu_dpm)
|
||||
return 0;
|
||||
|
||||
/* init the sysfs and debugfs files late */
|
||||
ret = amdgpu_pm_sysfs_init(adev);
|
||||
if (ret)
|
||||
|
@ -1194,17 +1194,18 @@ static struct drm_dp_mst_branch *drm_dp_get_mst_branch_device(struct drm_dp_mst_
|
||||
|
||||
list_for_each_entry(port, &mstb->ports, next) {
|
||||
if (port->port_num == port_num) {
|
||||
if (!port->mstb) {
|
||||
mstb = port->mstb;
|
||||
if (!mstb) {
|
||||
DRM_ERROR("failed to lookup MSTB with lct %d, rad %02x\n", lct, rad[0]);
|
||||
return NULL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
mstb = port->mstb;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
kref_get(&mstb->kref);
|
||||
out:
|
||||
mutex_unlock(&mgr->lock);
|
||||
return mstb;
|
||||
}
|
||||
|
@ -143,7 +143,7 @@ i915_gem_shrink(struct drm_i915_private *dev_priv,
|
||||
}
|
||||
|
||||
/**
|
||||
* i915_gem_shrink - Shrink buffer object caches completely
|
||||
* i915_gem_shrink_all - Shrink buffer object caches completely
|
||||
* @dev_priv: i915 device
|
||||
*
|
||||
* This is a simple wraper around i915_gem_shrink() to aggressively shrink all
|
||||
|
@ -804,7 +804,10 @@ static const struct drm_i915_gem_object_ops i915_gem_userptr_ops = {
|
||||
* Also note, that the object created here is not currently a "first class"
|
||||
* object, in that several ioctls are banned. These are the CPU access
|
||||
* ioctls: mmap(), pwrite and pread. In practice, you are expected to use
|
||||
* direct access via your pointer rather than use those ioctls.
|
||||
* direct access via your pointer rather than use those ioctls. Another
|
||||
* restriction is that we do not allow userptr surfaces to be pinned to the
|
||||
* hardware and so we reject any attempt to create a framebuffer out of a
|
||||
* userptr.
|
||||
*
|
||||
* If you think this is a good interface to use to pass GPU memory between
|
||||
* drivers, please use dma-buf instead. In fact, wherever possible use
|
||||
|
@ -1724,6 +1724,15 @@ static void i9xx_enable_pll(struct intel_crtc *crtc)
|
||||
I915_READ(DPLL(!crtc->pipe)) | DPLL_DVO_2X_MODE);
|
||||
}
|
||||
|
||||
/*
|
||||
* Apparently we need to have VGA mode enabled prior to changing
|
||||
* the P1/P2 dividers. Otherwise the DPLL will keep using the old
|
||||
* dividers, even though the register value does change.
|
||||
*/
|
||||
I915_WRITE(reg, 0);
|
||||
|
||||
I915_WRITE(reg, dpll);
|
||||
|
||||
/* Wait for the clocks to stabilize. */
|
||||
POSTING_READ(reg);
|
||||
udelay(150);
|
||||
@ -14107,6 +14116,11 @@ static int intel_user_framebuffer_create_handle(struct drm_framebuffer *fb,
|
||||
struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb);
|
||||
struct drm_i915_gem_object *obj = intel_fb->obj;
|
||||
|
||||
if (obj->userptr.mm) {
|
||||
DRM_DEBUG("attempting to use a userptr for a framebuffer, denied\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return drm_gem_handle_create(file, &obj->base, handle);
|
||||
}
|
||||
|
||||
@ -14897,9 +14911,19 @@ static void intel_sanitize_crtc(struct intel_crtc *crtc)
|
||||
/* restore vblank interrupts to correct state */
|
||||
drm_crtc_vblank_reset(&crtc->base);
|
||||
if (crtc->active) {
|
||||
struct intel_plane *plane;
|
||||
|
||||
drm_calc_timestamping_constants(&crtc->base, &crtc->base.hwmode);
|
||||
update_scanline_offset(crtc);
|
||||
drm_crtc_vblank_on(&crtc->base);
|
||||
|
||||
/* Disable everything but the primary plane */
|
||||
for_each_intel_plane_on_crtc(dev, crtc, plane) {
|
||||
if (plane->base.type == DRM_PLANE_TYPE_PRIMARY)
|
||||
continue;
|
||||
|
||||
plane->disable_plane(&plane->base, &crtc->base);
|
||||
}
|
||||
}
|
||||
|
||||
/* We need to sanitize the plane -> pipe mapping first because this will
|
||||
@ -15067,38 +15091,25 @@ void i915_redisable_vga(struct drm_device *dev)
|
||||
i915_redisable_vga_power_on(dev);
|
||||
}
|
||||
|
||||
static bool primary_get_hw_state(struct intel_crtc *crtc)
|
||||
static bool primary_get_hw_state(struct intel_plane *plane)
|
||||
{
|
||||
struct drm_i915_private *dev_priv = crtc->base.dev->dev_private;
|
||||
struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
|
||||
|
||||
return !!(I915_READ(DSPCNTR(crtc->plane)) & DISPLAY_PLANE_ENABLE);
|
||||
return I915_READ(DSPCNTR(plane->plane)) & DISPLAY_PLANE_ENABLE;
|
||||
}
|
||||
|
||||
static void readout_plane_state(struct intel_crtc *crtc,
|
||||
struct intel_crtc_state *crtc_state)
|
||||
/* FIXME read out full plane state for all planes */
|
||||
static void readout_plane_state(struct intel_crtc *crtc)
|
||||
{
|
||||
struct intel_plane *p;
|
||||
struct intel_plane_state *plane_state;
|
||||
bool active = crtc_state->base.active;
|
||||
struct drm_plane *primary = crtc->base.primary;
|
||||
struct intel_plane_state *plane_state =
|
||||
to_intel_plane_state(primary->state);
|
||||
|
||||
for_each_intel_plane(crtc->base.dev, p) {
|
||||
if (crtc->pipe != p->pipe)
|
||||
continue;
|
||||
plane_state->visible =
|
||||
primary_get_hw_state(to_intel_plane(primary));
|
||||
|
||||
plane_state = to_intel_plane_state(p->base.state);
|
||||
|
||||
if (p->base.type == DRM_PLANE_TYPE_PRIMARY) {
|
||||
plane_state->visible = primary_get_hw_state(crtc);
|
||||
if (plane_state->visible)
|
||||
crtc->base.state->plane_mask |=
|
||||
1 << drm_plane_index(&p->base);
|
||||
} else {
|
||||
if (active)
|
||||
p->disable_plane(&p->base, &crtc->base);
|
||||
|
||||
plane_state->visible = false;
|
||||
}
|
||||
}
|
||||
if (plane_state->visible)
|
||||
crtc->base.state->plane_mask |= 1 << drm_plane_index(primary);
|
||||
}
|
||||
|
||||
static void intel_modeset_readout_hw_state(struct drm_device *dev)
|
||||
@ -15121,34 +15132,7 @@ static void intel_modeset_readout_hw_state(struct drm_device *dev)
|
||||
crtc->base.state->active = crtc->active;
|
||||
crtc->base.enabled = crtc->active;
|
||||
|
||||
memset(&crtc->base.mode, 0, sizeof(crtc->base.mode));
|
||||
if (crtc->base.state->active) {
|
||||
intel_mode_from_pipe_config(&crtc->base.mode, crtc->config);
|
||||
intel_mode_from_pipe_config(&crtc->base.state->adjusted_mode, crtc->config);
|
||||
WARN_ON(drm_atomic_set_mode_for_crtc(crtc->base.state, &crtc->base.mode));
|
||||
|
||||
/*
|
||||
* The initial mode needs to be set in order to keep
|
||||
* the atomic core happy. It wants a valid mode if the
|
||||
* crtc's enabled, so we do the above call.
|
||||
*
|
||||
* At this point some state updated by the connectors
|
||||
* in their ->detect() callback has not run yet, so
|
||||
* no recalculation can be done yet.
|
||||
*
|
||||
* Even if we could do a recalculation and modeset
|
||||
* right now it would cause a double modeset if
|
||||
* fbdev or userspace chooses a different initial mode.
|
||||
*
|
||||
* If that happens, someone indicated they wanted a
|
||||
* mode change, which means it's safe to do a full
|
||||
* recalculation.
|
||||
*/
|
||||
crtc->base.state->mode.private_flags = I915_MODE_FLAG_INHERITED;
|
||||
}
|
||||
|
||||
crtc->base.hwmode = crtc->config->base.adjusted_mode;
|
||||
readout_plane_state(crtc, to_intel_crtc_state(crtc->base.state));
|
||||
readout_plane_state(crtc);
|
||||
|
||||
DRM_DEBUG_KMS("[CRTC:%d] hw state readout: %s\n",
|
||||
crtc->base.base.id,
|
||||
@ -15207,6 +15191,36 @@ static void intel_modeset_readout_hw_state(struct drm_device *dev)
|
||||
connector->base.name,
|
||||
connector->base.encoder ? "enabled" : "disabled");
|
||||
}
|
||||
|
||||
for_each_intel_crtc(dev, crtc) {
|
||||
crtc->base.hwmode = crtc->config->base.adjusted_mode;
|
||||
|
||||
memset(&crtc->base.mode, 0, sizeof(crtc->base.mode));
|
||||
if (crtc->base.state->active) {
|
||||
intel_mode_from_pipe_config(&crtc->base.mode, crtc->config);
|
||||
intel_mode_from_pipe_config(&crtc->base.state->adjusted_mode, crtc->config);
|
||||
WARN_ON(drm_atomic_set_mode_for_crtc(crtc->base.state, &crtc->base.mode));
|
||||
|
||||
/*
|
||||
* The initial mode needs to be set in order to keep
|
||||
* the atomic core happy. It wants a valid mode if the
|
||||
* crtc's enabled, so we do the above call.
|
||||
*
|
||||
* At this point some state updated by the connectors
|
||||
* in their ->detect() callback has not run yet, so
|
||||
* no recalculation can be done yet.
|
||||
*
|
||||
* Even if we could do a recalculation and modeset
|
||||
* right now it would cause a double modeset if
|
||||
* fbdev or userspace chooses a different initial mode.
|
||||
*
|
||||
* If that happens, someone indicated they wanted a
|
||||
* mode change, which means it's safe to do a full
|
||||
* recalculation.
|
||||
*/
|
||||
crtc->base.state->mode.private_flags = I915_MODE_FLAG_INHERITED;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Scan out the current hw modeset state,
|
||||
|
@ -1659,6 +1659,7 @@ static int gen8_emit_flush_render(struct drm_i915_gem_request *request,
|
||||
if (flush_domains) {
|
||||
flags |= PIPE_CONTROL_RENDER_TARGET_CACHE_FLUSH;
|
||||
flags |= PIPE_CONTROL_DEPTH_CACHE_FLUSH;
|
||||
flags |= PIPE_CONTROL_FLUSH_ENABLE;
|
||||
}
|
||||
|
||||
if (invalidate_domains) {
|
||||
|
@ -347,6 +347,7 @@ gen7_render_ring_flush(struct drm_i915_gem_request *req,
|
||||
if (flush_domains) {
|
||||
flags |= PIPE_CONTROL_RENDER_TARGET_CACHE_FLUSH;
|
||||
flags |= PIPE_CONTROL_DEPTH_CACHE_FLUSH;
|
||||
flags |= PIPE_CONTROL_FLUSH_ENABLE;
|
||||
}
|
||||
if (invalidate_domains) {
|
||||
flags |= PIPE_CONTROL_TLB_INVALIDATE;
|
||||
@ -418,6 +419,7 @@ gen8_render_ring_flush(struct drm_i915_gem_request *req,
|
||||
if (flush_domains) {
|
||||
flags |= PIPE_CONTROL_RENDER_TARGET_CACHE_FLUSH;
|
||||
flags |= PIPE_CONTROL_DEPTH_CACHE_FLUSH;
|
||||
flags |= PIPE_CONTROL_FLUSH_ENABLE;
|
||||
}
|
||||
if (invalidate_domains) {
|
||||
flags |= PIPE_CONTROL_TLB_INVALIDATE;
|
||||
|
@ -227,11 +227,12 @@ nouveau_gem_info(struct drm_file *file_priv, struct drm_gem_object *gem,
|
||||
struct nouveau_bo *nvbo = nouveau_gem_object(gem);
|
||||
struct nvkm_vma *vma;
|
||||
|
||||
if (nvbo->bo.mem.mem_type == TTM_PL_TT)
|
||||
if (is_power_of_2(nvbo->valid_domains))
|
||||
rep->domain = nvbo->valid_domains;
|
||||
else if (nvbo->bo.mem.mem_type == TTM_PL_TT)
|
||||
rep->domain = NOUVEAU_GEM_DOMAIN_GART;
|
||||
else
|
||||
rep->domain = NOUVEAU_GEM_DOMAIN_VRAM;
|
||||
|
||||
rep->offset = nvbo->bo.offset;
|
||||
if (cli->vm) {
|
||||
vma = nouveau_bo_vma_find(nvbo, cli->vm);
|
||||
|
@ -717,10 +717,14 @@ static umode_t hwmon_attributes_visible(struct kobject *kobj,
|
||||
struct radeon_device *rdev = dev_get_drvdata(dev);
|
||||
umode_t effective_mode = attr->mode;
|
||||
|
||||
/* Skip limit attributes if DPM is not enabled */
|
||||
/* Skip attributes if DPM is not enabled */
|
||||
if (rdev->pm.pm_method != PM_METHOD_DPM &&
|
||||
(attr == &sensor_dev_attr_temp1_crit.dev_attr.attr ||
|
||||
attr == &sensor_dev_attr_temp1_crit_hyst.dev_attr.attr))
|
||||
attr == &sensor_dev_attr_temp1_crit_hyst.dev_attr.attr ||
|
||||
attr == &sensor_dev_attr_pwm1.dev_attr.attr ||
|
||||
attr == &sensor_dev_attr_pwm1_enable.dev_attr.attr ||
|
||||
attr == &sensor_dev_attr_pwm1_max.dev_attr.attr ||
|
||||
attr == &sensor_dev_attr_pwm1_min.dev_attr.attr))
|
||||
return 0;
|
||||
|
||||
/* Skip fan attributes if fan is not present */
|
||||
|
@ -149,8 +149,6 @@
|
||||
#define ST_ACCEL_4_BDU_MASK 0x40
|
||||
#define ST_ACCEL_4_DRDY_IRQ_ADDR 0x21
|
||||
#define ST_ACCEL_4_DRDY_IRQ_INT1_MASK 0x04
|
||||
#define ST_ACCEL_4_IG1_EN_ADDR 0x21
|
||||
#define ST_ACCEL_4_IG1_EN_MASK 0x08
|
||||
#define ST_ACCEL_4_MULTIREAD_BIT true
|
||||
|
||||
/* CUSTOM VALUES FOR SENSOR 5 */
|
||||
@ -489,10 +487,6 @@ static const struct st_sensor_settings st_accel_sensors_settings[] = {
|
||||
.drdy_irq = {
|
||||
.addr = ST_ACCEL_4_DRDY_IRQ_ADDR,
|
||||
.mask_int1 = ST_ACCEL_4_DRDY_IRQ_INT1_MASK,
|
||||
.ig1 = {
|
||||
.en_addr = ST_ACCEL_4_IG1_EN_ADDR,
|
||||
.en_mask = ST_ACCEL_4_IG1_EN_MASK,
|
||||
},
|
||||
},
|
||||
.multi_read_bit = ST_ACCEL_4_MULTIREAD_BIT,
|
||||
.bootime = 2, /* guess */
|
||||
|
@ -45,13 +45,18 @@
|
||||
#include <linux/types.h>
|
||||
#include <linux/gfp.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/regulator/consumer.h>
|
||||
|
||||
#include <linux/iio/iio.h>
|
||||
|
||||
#define TWL4030_USB_SEL_MADC_MCPC (1<<3)
|
||||
#define TWL4030_USB_CARKIT_ANA_CTRL 0xBB
|
||||
|
||||
/**
|
||||
* struct twl4030_madc_data - a container for madc info
|
||||
* @dev: Pointer to device structure for madc
|
||||
* @lock: Mutex protecting this data structure
|
||||
* @regulator: Pointer to bias regulator for madc
|
||||
* @requests: Array of request struct corresponding to SW1, SW2 and RT
|
||||
* @use_second_irq: IRQ selection (main or co-processor)
|
||||
* @imr: Interrupt mask register of MADC
|
||||
@ -60,6 +65,7 @@
|
||||
struct twl4030_madc_data {
|
||||
struct device *dev;
|
||||
struct mutex lock; /* mutex protecting this data structure */
|
||||
struct regulator *usb3v1;
|
||||
struct twl4030_madc_request requests[TWL4030_MADC_NUM_METHODS];
|
||||
bool use_second_irq;
|
||||
u8 imr;
|
||||
@ -841,6 +847,32 @@ static int twl4030_madc_probe(struct platform_device *pdev)
|
||||
}
|
||||
twl4030_madc = madc;
|
||||
|
||||
/* Configure MADC[3:6] */
|
||||
ret = twl_i2c_read_u8(TWL_MODULE_USB, ®val,
|
||||
TWL4030_USB_CARKIT_ANA_CTRL);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "unable to read reg CARKIT_ANA_CTRL 0x%X\n",
|
||||
TWL4030_USB_CARKIT_ANA_CTRL);
|
||||
goto err_i2c;
|
||||
}
|
||||
regval |= TWL4030_USB_SEL_MADC_MCPC;
|
||||
ret = twl_i2c_write_u8(TWL_MODULE_USB, regval,
|
||||
TWL4030_USB_CARKIT_ANA_CTRL);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "unable to write reg CARKIT_ANA_CTRL 0x%X\n",
|
||||
TWL4030_USB_CARKIT_ANA_CTRL);
|
||||
goto err_i2c;
|
||||
}
|
||||
|
||||
/* Enable 3v1 bias regulator for MADC[3:6] */
|
||||
madc->usb3v1 = devm_regulator_get(madc->dev, "vusb3v1");
|
||||
if (IS_ERR(madc->usb3v1))
|
||||
return -ENODEV;
|
||||
|
||||
ret = regulator_enable(madc->usb3v1);
|
||||
if (ret)
|
||||
dev_err(madc->dev, "could not enable 3v1 bias regulator\n");
|
||||
|
||||
ret = iio_device_register(iio_dev);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "could not register iio device\n");
|
||||
@ -866,6 +898,8 @@ static int twl4030_madc_remove(struct platform_device *pdev)
|
||||
twl4030_madc_set_current_generator(madc, 0, 0);
|
||||
twl4030_madc_set_power(madc, 0);
|
||||
|
||||
regulator_disable(madc->usb3v1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -508,12 +508,12 @@ void ib_cache_gid_set_default_gid(struct ib_device *ib_dev, u8 port,
|
||||
memset(&gid_attr, 0, sizeof(gid_attr));
|
||||
gid_attr.ndev = ndev;
|
||||
|
||||
mutex_lock(&table->lock);
|
||||
ix = find_gid(table, NULL, NULL, true, GID_ATTR_FIND_MASK_DEFAULT);
|
||||
|
||||
/* Coudn't find default GID location */
|
||||
WARN_ON(ix < 0);
|
||||
|
||||
mutex_lock(&table->lock);
|
||||
if (!__ib_cache_gid_get(ib_dev, port, ix,
|
||||
¤t_gid, ¤t_gid_attr) &&
|
||||
mode == IB_CACHE_GID_DEFAULT_MODE_SET &&
|
||||
|
@ -835,6 +835,11 @@ retest:
|
||||
case IB_CM_SIDR_REQ_RCVD:
|
||||
spin_unlock_irq(&cm_id_priv->lock);
|
||||
cm_reject_sidr_req(cm_id_priv, IB_SIDR_REJECT);
|
||||
spin_lock_irq(&cm.lock);
|
||||
if (!RB_EMPTY_NODE(&cm_id_priv->sidr_id_node))
|
||||
rb_erase(&cm_id_priv->sidr_id_node,
|
||||
&cm.remote_sidr_table);
|
||||
spin_unlock_irq(&cm.lock);
|
||||
break;
|
||||
case IB_CM_REQ_SENT:
|
||||
case IB_CM_MRA_REQ_RCVD:
|
||||
@ -3172,7 +3177,10 @@ int ib_send_cm_sidr_rep(struct ib_cm_id *cm_id,
|
||||
spin_unlock_irqrestore(&cm_id_priv->lock, flags);
|
||||
|
||||
spin_lock_irqsave(&cm.lock, flags);
|
||||
rb_erase(&cm_id_priv->sidr_id_node, &cm.remote_sidr_table);
|
||||
if (!RB_EMPTY_NODE(&cm_id_priv->sidr_id_node)) {
|
||||
rb_erase(&cm_id_priv->sidr_id_node, &cm.remote_sidr_table);
|
||||
RB_CLEAR_NODE(&cm_id_priv->sidr_id_node);
|
||||
}
|
||||
spin_unlock_irqrestore(&cm.lock, flags);
|
||||
return 0;
|
||||
|
||||
|
@ -1067,14 +1067,14 @@ static int cma_save_req_info(const struct ib_cm_event *ib_event,
|
||||
sizeof(req->local_gid));
|
||||
req->has_gid = true;
|
||||
req->service_id = req_param->primary_path->service_id;
|
||||
req->pkey = req_param->bth_pkey;
|
||||
req->pkey = be16_to_cpu(req_param->primary_path->pkey);
|
||||
break;
|
||||
case IB_CM_SIDR_REQ_RECEIVED:
|
||||
req->device = sidr_param->listen_id->device;
|
||||
req->port = sidr_param->port;
|
||||
req->has_gid = false;
|
||||
req->service_id = sidr_param->service_id;
|
||||
req->pkey = sidr_param->bth_pkey;
|
||||
req->pkey = sidr_param->pkey;
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
@ -1324,7 +1324,7 @@ static struct rdma_id_private *cma_id_from_event(struct ib_cm_id *cm_id,
|
||||
bind_list = cma_ps_find(rdma_ps_from_service_id(req.service_id),
|
||||
cma_port_from_service_id(req.service_id));
|
||||
id_priv = cma_find_listener(bind_list, cm_id, ib_event, &req, *net_dev);
|
||||
if (IS_ERR(id_priv)) {
|
||||
if (IS_ERR(id_priv) && *net_dev) {
|
||||
dev_put(*net_dev);
|
||||
*net_dev = NULL;
|
||||
}
|
||||
|
@ -250,25 +250,44 @@ static void enum_netdev_ipv4_ips(struct ib_device *ib_dev,
|
||||
u8 port, struct net_device *ndev)
|
||||
{
|
||||
struct in_device *in_dev;
|
||||
struct sin_list {
|
||||
struct list_head list;
|
||||
struct sockaddr_in ip;
|
||||
};
|
||||
struct sin_list *sin_iter;
|
||||
struct sin_list *sin_temp;
|
||||
|
||||
LIST_HEAD(sin_list);
|
||||
if (ndev->reg_state >= NETREG_UNREGISTERING)
|
||||
return;
|
||||
|
||||
in_dev = in_dev_get(ndev);
|
||||
if (!in_dev)
|
||||
rcu_read_lock();
|
||||
in_dev = __in_dev_get_rcu(ndev);
|
||||
if (!in_dev) {
|
||||
rcu_read_unlock();
|
||||
return;
|
||||
}
|
||||
|
||||
for_ifa(in_dev) {
|
||||
struct sockaddr_in ip;
|
||||
struct sin_list *entry = kzalloc(sizeof(*entry), GFP_ATOMIC);
|
||||
|
||||
ip.sin_family = AF_INET;
|
||||
ip.sin_addr.s_addr = ifa->ifa_address;
|
||||
update_gid_ip(GID_ADD, ib_dev, port, ndev,
|
||||
(struct sockaddr *)&ip);
|
||||
if (!entry) {
|
||||
pr_warn("roce_gid_mgmt: couldn't allocate entry for IPv4 update\n");
|
||||
continue;
|
||||
}
|
||||
entry->ip.sin_family = AF_INET;
|
||||
entry->ip.sin_addr.s_addr = ifa->ifa_address;
|
||||
list_add_tail(&entry->list, &sin_list);
|
||||
}
|
||||
endfor_ifa(in_dev);
|
||||
rcu_read_unlock();
|
||||
|
||||
in_dev_put(in_dev);
|
||||
list_for_each_entry_safe(sin_iter, sin_temp, &sin_list, list) {
|
||||
update_gid_ip(GID_ADD, ib_dev, port, ndev,
|
||||
(struct sockaddr *)&sin_iter->ip);
|
||||
list_del(&sin_iter->list);
|
||||
kfree(sin_iter);
|
||||
}
|
||||
}
|
||||
|
||||
static void enum_netdev_ipv6_ips(struct ib_device *ib_dev,
|
||||
|
@ -1624,11 +1624,16 @@ static int ucma_open(struct inode *inode, struct file *filp)
|
||||
if (!file)
|
||||
return -ENOMEM;
|
||||
|
||||
file->close_wq = create_singlethread_workqueue("ucma_close_id");
|
||||
if (!file->close_wq) {
|
||||
kfree(file);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
INIT_LIST_HEAD(&file->event_list);
|
||||
INIT_LIST_HEAD(&file->ctx_list);
|
||||
init_waitqueue_head(&file->poll_wait);
|
||||
mutex_init(&file->mut);
|
||||
file->close_wq = create_singlethread_workqueue("ucma_close_id");
|
||||
|
||||
filp->private_data = file;
|
||||
file->filp = filp;
|
||||
|
@ -2115,15 +2115,19 @@ static int __domain_mapping(struct dmar_domain *domain, unsigned long iov_pfn,
|
||||
return -ENOMEM;
|
||||
/* It is large page*/
|
||||
if (largepage_lvl > 1) {
|
||||
unsigned long nr_superpages, end_pfn;
|
||||
|
||||
pteval |= DMA_PTE_LARGE_PAGE;
|
||||
lvl_pages = lvl_to_nr_pages(largepage_lvl);
|
||||
|
||||
nr_superpages = sg_res / lvl_pages;
|
||||
end_pfn = iov_pfn + nr_superpages * lvl_pages - 1;
|
||||
|
||||
/*
|
||||
* Ensure that old small page tables are
|
||||
* removed to make room for superpage,
|
||||
* if they exist.
|
||||
* removed to make room for superpage(s).
|
||||
*/
|
||||
dma_pte_free_pagetable(domain, iov_pfn,
|
||||
iov_pfn + lvl_pages - 1);
|
||||
dma_pte_free_pagetable(domain, iov_pfn, end_pfn);
|
||||
} else {
|
||||
pteval &= ~(uint64_t)DMA_PTE_LARGE_PAGE;
|
||||
}
|
||||
|
@ -634,10 +634,10 @@ static int __commit_transaction(struct dm_cache_metadata *cmd,
|
||||
|
||||
disk_super = dm_block_data(sblock);
|
||||
|
||||
disk_super->flags = cpu_to_le32(cmd->flags);
|
||||
if (mutator)
|
||||
update_flags(disk_super, mutator);
|
||||
|
||||
disk_super->flags = cpu_to_le32(cmd->flags);
|
||||
disk_super->mapping_root = cpu_to_le64(cmd->root);
|
||||
disk_super->hint_root = cpu_to_le64(cmd->hint_root);
|
||||
disk_super->discard_root = cpu_to_le64(cmd->discard_root);
|
||||
|
@ -301,11 +301,16 @@ static void redistribute3(struct dm_btree_info *info, struct btree_node *parent,
|
||||
{
|
||||
int s;
|
||||
uint32_t max_entries = le32_to_cpu(left->header.max_entries);
|
||||
unsigned target = (nr_left + nr_center + nr_right) / 3;
|
||||
BUG_ON(target > max_entries);
|
||||
unsigned total = nr_left + nr_center + nr_right;
|
||||
unsigned target_right = total / 3;
|
||||
unsigned remainder = (target_right * 3) != total;
|
||||
unsigned target_left = target_right + remainder;
|
||||
|
||||
BUG_ON(target_left > max_entries);
|
||||
BUG_ON(target_right > max_entries);
|
||||
|
||||
if (nr_left < nr_right) {
|
||||
s = nr_left - target;
|
||||
s = nr_left - target_left;
|
||||
|
||||
if (s < 0 && nr_center < -s) {
|
||||
/* not enough in central node */
|
||||
@ -316,10 +321,10 @@ static void redistribute3(struct dm_btree_info *info, struct btree_node *parent,
|
||||
} else
|
||||
shift(left, center, s);
|
||||
|
||||
shift(center, right, target - nr_right);
|
||||
shift(center, right, target_right - nr_right);
|
||||
|
||||
} else {
|
||||
s = target - nr_right;
|
||||
s = target_right - nr_right;
|
||||
if (s > 0 && nr_center < s) {
|
||||
/* not enough in central node */
|
||||
shift(center, right, nr_center);
|
||||
@ -329,7 +334,7 @@ static void redistribute3(struct dm_btree_info *info, struct btree_node *parent,
|
||||
} else
|
||||
shift(center, right, s);
|
||||
|
||||
shift(left, center, nr_left - target);
|
||||
shift(left, center, nr_left - target_left);
|
||||
}
|
||||
|
||||
*key_ptr(parent, c->index) = center->keys[0];
|
||||
|
@ -523,7 +523,7 @@ static int btree_split_beneath(struct shadow_spine *s, uint64_t key)
|
||||
|
||||
r = new_block(s->info, &right);
|
||||
if (r < 0) {
|
||||
/* FIXME: put left */
|
||||
unlock_block(s->info, left);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
@ -46,8 +46,8 @@ extern struct dvb_frontend *horus3a_attach(struct dvb_frontend *fe,
|
||||
const struct horus3a_config *config,
|
||||
struct i2c_adapter *i2c);
|
||||
#else
|
||||
static inline struct dvb_frontend *horus3a_attach(
|
||||
const struct cxd2820r_config *config,
|
||||
static inline struct dvb_frontend *horus3a_attach(struct dvb_frontend *fe,
|
||||
const struct horus3a_config *config,
|
||||
struct i2c_adapter *i2c)
|
||||
{
|
||||
printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
|
||||
|
@ -43,7 +43,7 @@ struct dvb_frontend *lnbh25_attach(
|
||||
struct lnbh25_config *cfg,
|
||||
struct i2c_adapter *i2c);
|
||||
#else
|
||||
static inline dvb_frontend *lnbh25_attach(
|
||||
static inline struct dvb_frontend *lnbh25_attach(
|
||||
struct dvb_frontend *fe,
|
||||
struct lnbh25_config *cfg,
|
||||
struct i2c_adapter *i2c)
|
||||
|
@ -18,6 +18,27 @@
|
||||
|
||||
static struct dvb_frontend_ops m88ds3103_ops;
|
||||
|
||||
/* write single register with mask */
|
||||
static int m88ds3103_update_bits(struct m88ds3103_dev *dev,
|
||||
u8 reg, u8 mask, u8 val)
|
||||
{
|
||||
int ret;
|
||||
u8 tmp;
|
||||
|
||||
/* no need for read if whole reg is written */
|
||||
if (mask != 0xff) {
|
||||
ret = regmap_bulk_read(dev->regmap, reg, &tmp, 1);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
val &= mask;
|
||||
tmp &= ~mask;
|
||||
val |= tmp;
|
||||
}
|
||||
|
||||
return regmap_bulk_write(dev->regmap, reg, &val, 1);
|
||||
}
|
||||
|
||||
/* write reg val table using reg addr auto increment */
|
||||
static int m88ds3103_wr_reg_val_tab(struct m88ds3103_dev *dev,
|
||||
const struct m88ds3103_reg_val *tab, int tab_len)
|
||||
@ -394,10 +415,10 @@ static int m88ds3103_set_frontend(struct dvb_frontend *fe)
|
||||
u8tmp2 = 0x00; /* 0b00 */
|
||||
break;
|
||||
}
|
||||
ret = regmap_update_bits(dev->regmap, 0x22, 0xc0, u8tmp1 << 6);
|
||||
ret = m88ds3103_update_bits(dev, 0x22, 0xc0, u8tmp1 << 6);
|
||||
if (ret)
|
||||
goto err;
|
||||
ret = regmap_update_bits(dev->regmap, 0x24, 0xc0, u8tmp2 << 6);
|
||||
ret = m88ds3103_update_bits(dev, 0x24, 0xc0, u8tmp2 << 6);
|
||||
if (ret)
|
||||
goto err;
|
||||
}
|
||||
@ -455,13 +476,13 @@ static int m88ds3103_set_frontend(struct dvb_frontend *fe)
|
||||
if (ret)
|
||||
goto err;
|
||||
}
|
||||
ret = regmap_update_bits(dev->regmap, 0x9d, 0x08, 0x08);
|
||||
ret = m88ds3103_update_bits(dev, 0x9d, 0x08, 0x08);
|
||||
if (ret)
|
||||
goto err;
|
||||
ret = regmap_write(dev->regmap, 0xf1, 0x01);
|
||||
if (ret)
|
||||
goto err;
|
||||
ret = regmap_update_bits(dev->regmap, 0x30, 0x80, 0x80);
|
||||
ret = m88ds3103_update_bits(dev, 0x30, 0x80, 0x80);
|
||||
if (ret)
|
||||
goto err;
|
||||
}
|
||||
@ -498,7 +519,7 @@ static int m88ds3103_set_frontend(struct dvb_frontend *fe)
|
||||
switch (dev->cfg->ts_mode) {
|
||||
case M88DS3103_TS_SERIAL:
|
||||
case M88DS3103_TS_SERIAL_D7:
|
||||
ret = regmap_update_bits(dev->regmap, 0x29, 0x20, u8tmp1);
|
||||
ret = m88ds3103_update_bits(dev, 0x29, 0x20, u8tmp1);
|
||||
if (ret)
|
||||
goto err;
|
||||
u8tmp1 = 0;
|
||||
@ -567,11 +588,11 @@ static int m88ds3103_set_frontend(struct dvb_frontend *fe)
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
ret = regmap_update_bits(dev->regmap, 0x4d, 0x02, dev->cfg->spec_inv << 1);
|
||||
ret = m88ds3103_update_bits(dev, 0x4d, 0x02, dev->cfg->spec_inv << 1);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
ret = regmap_update_bits(dev->regmap, 0x30, 0x10, dev->cfg->agc_inv << 4);
|
||||
ret = m88ds3103_update_bits(dev, 0x30, 0x10, dev->cfg->agc_inv << 4);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
@ -625,13 +646,13 @@ static int m88ds3103_init(struct dvb_frontend *fe)
|
||||
dev->warm = false;
|
||||
|
||||
/* wake up device from sleep */
|
||||
ret = regmap_update_bits(dev->regmap, 0x08, 0x01, 0x01);
|
||||
ret = m88ds3103_update_bits(dev, 0x08, 0x01, 0x01);
|
||||
if (ret)
|
||||
goto err;
|
||||
ret = regmap_update_bits(dev->regmap, 0x04, 0x01, 0x00);
|
||||
ret = m88ds3103_update_bits(dev, 0x04, 0x01, 0x00);
|
||||
if (ret)
|
||||
goto err;
|
||||
ret = regmap_update_bits(dev->regmap, 0x23, 0x10, 0x00);
|
||||
ret = m88ds3103_update_bits(dev, 0x23, 0x10, 0x00);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
@ -749,18 +770,18 @@ static int m88ds3103_sleep(struct dvb_frontend *fe)
|
||||
utmp = 0x29;
|
||||
else
|
||||
utmp = 0x27;
|
||||
ret = regmap_update_bits(dev->regmap, utmp, 0x01, 0x00);
|
||||
ret = m88ds3103_update_bits(dev, utmp, 0x01, 0x00);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
/* sleep */
|
||||
ret = regmap_update_bits(dev->regmap, 0x08, 0x01, 0x00);
|
||||
ret = m88ds3103_update_bits(dev, 0x08, 0x01, 0x00);
|
||||
if (ret)
|
||||
goto err;
|
||||
ret = regmap_update_bits(dev->regmap, 0x04, 0x01, 0x01);
|
||||
ret = m88ds3103_update_bits(dev, 0x04, 0x01, 0x01);
|
||||
if (ret)
|
||||
goto err;
|
||||
ret = regmap_update_bits(dev->regmap, 0x23, 0x10, 0x10);
|
||||
ret = m88ds3103_update_bits(dev, 0x23, 0x10, 0x10);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
@ -992,12 +1013,12 @@ static int m88ds3103_set_tone(struct dvb_frontend *fe,
|
||||
}
|
||||
|
||||
utmp = tone << 7 | dev->cfg->envelope_mode << 5;
|
||||
ret = regmap_update_bits(dev->regmap, 0xa2, 0xe0, utmp);
|
||||
ret = m88ds3103_update_bits(dev, 0xa2, 0xe0, utmp);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
utmp = 1 << 2;
|
||||
ret = regmap_update_bits(dev->regmap, 0xa1, reg_a1_mask, utmp);
|
||||
ret = m88ds3103_update_bits(dev, 0xa1, reg_a1_mask, utmp);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
@ -1047,7 +1068,7 @@ static int m88ds3103_set_voltage(struct dvb_frontend *fe,
|
||||
voltage_dis ^= dev->cfg->lnb_en_pol;
|
||||
|
||||
utmp = voltage_dis << 1 | voltage_sel << 0;
|
||||
ret = regmap_update_bits(dev->regmap, 0xa2, 0x03, utmp);
|
||||
ret = m88ds3103_update_bits(dev, 0xa2, 0x03, utmp);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
@ -1080,7 +1101,7 @@ static int m88ds3103_diseqc_send_master_cmd(struct dvb_frontend *fe,
|
||||
}
|
||||
|
||||
utmp = dev->cfg->envelope_mode << 5;
|
||||
ret = regmap_update_bits(dev->regmap, 0xa2, 0xe0, utmp);
|
||||
ret = m88ds3103_update_bits(dev, 0xa2, 0xe0, utmp);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
@ -1115,12 +1136,12 @@ static int m88ds3103_diseqc_send_master_cmd(struct dvb_frontend *fe,
|
||||
} else {
|
||||
dev_dbg(&client->dev, "diseqc tx timeout\n");
|
||||
|
||||
ret = regmap_update_bits(dev->regmap, 0xa1, 0xc0, 0x40);
|
||||
ret = m88ds3103_update_bits(dev, 0xa1, 0xc0, 0x40);
|
||||
if (ret)
|
||||
goto err;
|
||||
}
|
||||
|
||||
ret = regmap_update_bits(dev->regmap, 0xa2, 0xc0, 0x80);
|
||||
ret = m88ds3103_update_bits(dev, 0xa2, 0xc0, 0x80);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
@ -1152,7 +1173,7 @@ static int m88ds3103_diseqc_send_burst(struct dvb_frontend *fe,
|
||||
}
|
||||
|
||||
utmp = dev->cfg->envelope_mode << 5;
|
||||
ret = regmap_update_bits(dev->regmap, 0xa2, 0xe0, utmp);
|
||||
ret = m88ds3103_update_bits(dev, 0xa2, 0xe0, utmp);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
@ -1194,12 +1215,12 @@ static int m88ds3103_diseqc_send_burst(struct dvb_frontend *fe,
|
||||
} else {
|
||||
dev_dbg(&client->dev, "diseqc tx timeout\n");
|
||||
|
||||
ret = regmap_update_bits(dev->regmap, 0xa1, 0xc0, 0x40);
|
||||
ret = m88ds3103_update_bits(dev, 0xa1, 0xc0, 0x40);
|
||||
if (ret)
|
||||
goto err;
|
||||
}
|
||||
|
||||
ret = regmap_update_bits(dev->regmap, 0xa2, 0xc0, 0x80);
|
||||
ret = m88ds3103_update_bits(dev, 0xa2, 0xc0, 0x80);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
@ -1435,13 +1456,13 @@ static int m88ds3103_probe(struct i2c_client *client,
|
||||
goto err_kfree;
|
||||
|
||||
/* sleep */
|
||||
ret = regmap_update_bits(dev->regmap, 0x08, 0x01, 0x00);
|
||||
ret = m88ds3103_update_bits(dev, 0x08, 0x01, 0x00);
|
||||
if (ret)
|
||||
goto err_kfree;
|
||||
ret = regmap_update_bits(dev->regmap, 0x04, 0x01, 0x01);
|
||||
ret = m88ds3103_update_bits(dev, 0x04, 0x01, 0x01);
|
||||
if (ret)
|
||||
goto err_kfree;
|
||||
ret = regmap_update_bits(dev->regmap, 0x23, 0x10, 0x10);
|
||||
ret = m88ds3103_update_bits(dev, 0x23, 0x10, 0x10);
|
||||
if (ret)
|
||||
goto err_kfree;
|
||||
|
||||
|
@ -502,6 +502,10 @@ static int si2168_init(struct dvb_frontend *fe)
|
||||
/* firmware is in the new format */
|
||||
for (remaining = fw->size; remaining > 0; remaining -= 17) {
|
||||
len = fw->data[fw->size - remaining];
|
||||
if (len > SI2168_ARGLEN) {
|
||||
ret = -EINVAL;
|
||||
break;
|
||||
}
|
||||
memcpy(cmd.args, &fw->data[(fw->size - remaining) + 1], len);
|
||||
cmd.wlen = len;
|
||||
cmd.rlen = 1;
|
||||
|
@ -80,11 +80,9 @@ irqreturn_t netup_spi_interrupt(struct netup_spi *spi)
|
||||
u16 reg;
|
||||
unsigned long flags;
|
||||
|
||||
if (!spi) {
|
||||
dev_dbg(&spi->master->dev,
|
||||
"%s(): SPI not initialized\n", __func__);
|
||||
if (!spi)
|
||||
return IRQ_NONE;
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&spi->lock, flags);
|
||||
reg = readw(&spi->regs->control_stat);
|
||||
if (!(reg & NETUP_SPI_CTRL_IRQ)) {
|
||||
@ -234,11 +232,9 @@ void netup_spi_release(struct netup_unidvb_dev *ndev)
|
||||
unsigned long flags;
|
||||
struct netup_spi *spi = ndev->spi;
|
||||
|
||||
if (!spi) {
|
||||
dev_dbg(&spi->master->dev,
|
||||
"%s(): SPI not initialized\n", __func__);
|
||||
if (!spi)
|
||||
return;
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&spi->lock, flags);
|
||||
reg = readw(&spi->regs->control_stat);
|
||||
writew(reg | NETUP_SPI_CTRL_IRQ, &spi->regs->control_stat);
|
||||
|
@ -1097,7 +1097,7 @@ static int load_slim_core_fw(const struct firmware *fw, void *context)
|
||||
Elf32_Ehdr *ehdr;
|
||||
Elf32_Phdr *phdr;
|
||||
u8 __iomem *dst;
|
||||
int err, i;
|
||||
int err = 0, i;
|
||||
|
||||
if (!fw || !context)
|
||||
return -EINVAL;
|
||||
@ -1106,7 +1106,7 @@ static int load_slim_core_fw(const struct firmware *fw, void *context)
|
||||
phdr = (Elf32_Phdr *)(fw->data + ehdr->e_phoff);
|
||||
|
||||
/* go through the available ELF segments */
|
||||
for (i = 0; i < ehdr->e_phnum && !err; i++, phdr++) {
|
||||
for (i = 0; i < ehdr->e_phnum; i++, phdr++) {
|
||||
|
||||
/* Only consider LOAD segments */
|
||||
if (phdr->p_type != PT_LOAD)
|
||||
@ -1192,7 +1192,6 @@ err:
|
||||
|
||||
static int load_c8sectpfe_fw_step1(struct c8sectpfei *fei)
|
||||
{
|
||||
int ret;
|
||||
int err;
|
||||
|
||||
dev_info(fei->dev, "Loading firmware: %s\n", FIRMWARE_MEMDMA);
|
||||
@ -1207,7 +1206,7 @@ static int load_c8sectpfe_fw_step1(struct c8sectpfei *fei)
|
||||
if (err) {
|
||||
dev_err(fei->dev, "request_firmware_nowait err: %d.\n", err);
|
||||
complete_all(&fei->fw_ack);
|
||||
return ret;
|
||||
return err;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -257,7 +257,7 @@ static int hix5hd2_ir_probe(struct platform_device *pdev)
|
||||
goto clkerr;
|
||||
|
||||
if (devm_request_irq(dev, priv->irq, hix5hd2_ir_rx_interrupt,
|
||||
IRQF_NO_SUSPEND, pdev->name, priv) < 0) {
|
||||
0, pdev->name, priv) < 0) {
|
||||
dev_err(dev, "IRQ %d register failed\n", priv->irq);
|
||||
ret = -EINVAL;
|
||||
goto regerr;
|
||||
|
@ -166,6 +166,10 @@ static int si2157_init(struct dvb_frontend *fe)
|
||||
|
||||
for (remaining = fw->size; remaining > 0; remaining -= 17) {
|
||||
len = fw->data[fw->size - remaining];
|
||||
if (len > SI2157_ARGLEN) {
|
||||
dev_err(&client->dev, "Bad firmware length\n");
|
||||
goto err_release_firmware;
|
||||
}
|
||||
memcpy(cmd.args, &fw->data[(fw->size - remaining) + 1], len);
|
||||
cmd.wlen = len;
|
||||
cmd.rlen = 1;
|
||||
|
@ -34,6 +34,14 @@ static int rtl28xxu_ctrl_msg(struct dvb_usb_device *d, struct rtl28xxu_req *req)
|
||||
unsigned int pipe;
|
||||
u8 requesttype;
|
||||
|
||||
mutex_lock(&d->usb_mutex);
|
||||
|
||||
if (req->size > sizeof(dev->buf)) {
|
||||
dev_err(&d->intf->dev, "too large message %u\n", req->size);
|
||||
ret = -EINVAL;
|
||||
goto err_mutex_unlock;
|
||||
}
|
||||
|
||||
if (req->index & CMD_WR_FLAG) {
|
||||
/* write */
|
||||
memcpy(dev->buf, req->data, req->size);
|
||||
@ -50,14 +58,17 @@ static int rtl28xxu_ctrl_msg(struct dvb_usb_device *d, struct rtl28xxu_req *req)
|
||||
dvb_usb_dbg_usb_control_msg(d->udev, 0, requesttype, req->value,
|
||||
req->index, dev->buf, req->size);
|
||||
if (ret < 0)
|
||||
goto err;
|
||||
goto err_mutex_unlock;
|
||||
|
||||
/* read request, copy returned data to return buf */
|
||||
if (requesttype == (USB_TYPE_VENDOR | USB_DIR_IN))
|
||||
memcpy(req->data, dev->buf, req->size);
|
||||
|
||||
mutex_unlock(&d->usb_mutex);
|
||||
|
||||
return 0;
|
||||
err:
|
||||
err_mutex_unlock:
|
||||
mutex_unlock(&d->usb_mutex);
|
||||
dev_dbg(&d->intf->dev, "failed=%d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
@ -71,7 +71,7 @@
|
||||
|
||||
|
||||
struct rtl28xxu_dev {
|
||||
u8 buf[28];
|
||||
u8 buf[128];
|
||||
u8 chip_id;
|
||||
u8 tuner;
|
||||
char *tuner_name;
|
||||
|
@ -47,7 +47,7 @@ config V4L2_MEM2MEM_DEV
|
||||
# Used by LED subsystem flash drivers
|
||||
config V4L2_FLASH_LED_CLASS
|
||||
tristate "V4L2 flash API for LED flash class devices"
|
||||
depends on VIDEO_V4L2_SUBDEV_API
|
||||
depends on VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API
|
||||
depends on LEDS_CLASS_FLASH
|
||||
---help---
|
||||
Say Y here to enable V4L2 flash API support for LED flash
|
||||
|
@ -58,12 +58,18 @@ config OMAP_GPMC
|
||||
memory drives like NOR, NAND, OneNAND, SRAM.
|
||||
|
||||
config OMAP_GPMC_DEBUG
|
||||
bool
|
||||
bool "Enable GPMC debug output and skip reset of GPMC during init"
|
||||
depends on OMAP_GPMC
|
||||
help
|
||||
Enables verbose debugging mostly to decode the bootloader provided
|
||||
timings. Enable this during development to configure devices
|
||||
connected to the GPMC bus.
|
||||
timings. To preserve the bootloader provided timings, the reset
|
||||
of GPMC is skipped during init. Enable this during development to
|
||||
configure devices connected to the GPMC bus.
|
||||
|
||||
NOTE: In addition to matching the register setup with the bootloader
|
||||
you also need to match the GPMC FCLK frequency used by the
|
||||
bootloader or else the GPMC timings won't be identical with the
|
||||
bootloader timings.
|
||||
|
||||
config MVEBU_DEVBUS
|
||||
bool "Marvell EBU Device Bus Controller"
|
||||
|
@ -696,7 +696,6 @@ int gpmc_cs_set_timings(int cs, const struct gpmc_timings *t,
|
||||
int div;
|
||||
u32 l;
|
||||
|
||||
gpmc_cs_show_timings(cs, "before gpmc_cs_set_timings");
|
||||
div = gpmc_calc_divider(t->sync_clk);
|
||||
if (div < 0)
|
||||
return div;
|
||||
@ -1988,6 +1987,7 @@ static int gpmc_probe_generic_child(struct platform_device *pdev,
|
||||
if (ret < 0)
|
||||
goto err;
|
||||
|
||||
gpmc_cs_show_timings(cs, "before gpmc_cs_program_settings");
|
||||
ret = gpmc_cs_program_settings(cs, &gpmc_s);
|
||||
if (ret < 0)
|
||||
goto err;
|
||||
|
@ -2263,15 +2263,12 @@ static int mmc_test_profile_sglen_r_nonblock_perf(struct mmc_test_card *test)
|
||||
/*
|
||||
* eMMC hardware reset.
|
||||
*/
|
||||
static int mmc_test_hw_reset(struct mmc_test_card *test)
|
||||
static int mmc_test_reset(struct mmc_test_card *test)
|
||||
{
|
||||
struct mmc_card *card = test->card;
|
||||
struct mmc_host *host = card->host;
|
||||
int err;
|
||||
|
||||
if (!mmc_card_mmc(card) || !mmc_can_reset(card))
|
||||
return RESULT_UNSUP_CARD;
|
||||
|
||||
err = mmc_hw_reset(host);
|
||||
if (!err)
|
||||
return RESULT_OK;
|
||||
@ -2605,8 +2602,8 @@ static const struct mmc_test_case mmc_test_cases[] = {
|
||||
},
|
||||
|
||||
{
|
||||
.name = "eMMC hardware reset",
|
||||
.run = mmc_test_hw_reset,
|
||||
.name = "Reset test",
|
||||
.run = mmc_test_reset,
|
||||
},
|
||||
};
|
||||
|
||||
|
@ -1924,7 +1924,6 @@ EXPORT_SYMBOL(mmc_can_reset);
|
||||
static int mmc_reset(struct mmc_host *host)
|
||||
{
|
||||
struct mmc_card *card = host->card;
|
||||
u32 status;
|
||||
|
||||
if (!(host->caps & MMC_CAP_HW_RESET) || !host->ops->hw_reset)
|
||||
return -EOPNOTSUPP;
|
||||
@ -1937,12 +1936,6 @@ static int mmc_reset(struct mmc_host *host)
|
||||
|
||||
host->ops->hw_reset(host);
|
||||
|
||||
/* If the reset has happened, then a status command will fail */
|
||||
if (!mmc_send_status(card, &status)) {
|
||||
mmc_host_clk_release(host);
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
||||
/* Set initial state and call mmc_set_ios */
|
||||
mmc_set_initial_state(host);
|
||||
mmc_host_clk_release(host);
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user