mirror of
https://github.com/torvalds/linux.git
synced 2024-11-17 01:22:07 +00:00
ASoC: Updates for v3.19
Lots and lots of changes this time around, the usual set of driver updates and a huge bulk of cleanups from Lars-Peter. Probably the most interesting thing for most users is the Intel driver updates which will (with some more machine integration work) enable support for newer x86 laptops. - Conversion of AC'97 drivers to use regmap, bringing us closer to the removal of the ASoC level I/O code. - Clean up a lot of old drivers that were open coding things that have subsequently been implemented in the core. - Some DAPM performance improvements. - Removal of the now seldom used CODEC mutex. - Lots of updates for the newer Intel SoC support, including support for the DSP and some Cherrytrail and Braswell machine drivers. - Support for Samsung boards using rt5631 as the CODEC. - Removal of the obsolete AFEB9260 machine driver. - Driver support for the TI TS3A227E headset driver used in some Chrombeooks. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQEcBAABAgAGBQJUhajpAAoJECTWi3JdVIfQcOsH/00TMeXlkIjnYe+AC9VjEMYN IAYaXs1UcAfxB4CpS9ik4sb4LQnnxl9aqy5clUZOLHvDAgHmi6L1E8CteJUGFXZ6 /jjpu9/mI975asgyiNP44QDLSNDjzXX6Z1eeXRGvyKMNZkpg4FLfVq9a6ONtf1dw N3Hl3LG+wvPhAdR/OSKg9eDVnV1iY7mWOWr/9/1q8UhYRpCTL8x70ytBz6tfeU2r 4fQmFma+qefYXvyuqzuiwzSHJKt+46Z35EyNlkCBpVJVErZL2TGOv4H04PjZhg6+ 4CR+YGJMSURRhgMCvUCAh4j6a4c+oSXU/LEl9wMcjWMfa3UtZWKojqlK8lYMeoE= =Pv8r -----END PGP SIGNATURE----- Merge tag 'asoc-v3.19' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound into for-linus ASoC: Updates for v3.19 Lots and lots of changes this time around, the usual set of driver updates and a huge bulk of cleanups from Lars-Peter. Probably the most interesting thing for most users is the Intel driver updates which will (with some more machine integration work) enable support for newer x86 laptops. - Conversion of AC'97 drivers to use regmap, bringing us closer to the removal of the ASoC level I/O code. - Clean up a lot of old drivers that were open coding things that have subsequently been implemented in the core. - Some DAPM performance improvements. - Removal of the now seldom used CODEC mutex. - Lots of updates for the newer Intel SoC support, including support for the DSP and some Cherrytrail and Braswell machine drivers. - Support for Samsung boards using rt5631 as the CODEC. - Removal of the obsolete AFEB9260 machine driver. - Driver support for the TI TS3A227E headset driver used in some Chrombeooks.
This commit is contained in:
commit
e5edba464c
24
Documentation/devicetree/bindings/sound/arndale.txt
Normal file
24
Documentation/devicetree/bindings/sound/arndale.txt
Normal file
@ -0,0 +1,24 @@
|
||||
Audio Binding for Arndale boards
|
||||
|
||||
Required properties:
|
||||
- compatible : Can be the following,
|
||||
"samsung,arndale-rt5631"
|
||||
|
||||
- samsung,audio-cpu: The phandle of the Samsung I2S controller
|
||||
- samsung,audio-codec: The phandle of the audio codec
|
||||
|
||||
Optional:
|
||||
- samsung,model: The name of the sound-card
|
||||
|
||||
Arndale Boards has many audio daughter cards, one of them is
|
||||
rt5631/alc5631. Below example shows audio bindings for rt5631/
|
||||
alc5631 based codec.
|
||||
|
||||
Example:
|
||||
|
||||
sound {
|
||||
compatible = "samsung,arndale-rt5631";
|
||||
|
||||
samsung,audio-cpu = <&i2s0>
|
||||
samsung,audio-codec = <&rt5631>;
|
||||
};
|
@ -32,7 +32,7 @@ Optional properties:
|
||||
- rx-num-evt : FIFO levels.
|
||||
- sram-size-playback : size of sram to be allocated during playback
|
||||
- sram-size-capture : size of sram to be allocated during capture
|
||||
- interrupts : Interrupt numbers for McASP, currently not used by the driver
|
||||
- interrupts : Interrupt numbers for McASP
|
||||
- interrupt-names : Known interrupt names are "tx" and "rx"
|
||||
- pinctrl-0: Should specify pin control group used for this controller.
|
||||
- pinctrl-names: Should contain only one value - "default", for more details
|
||||
|
@ -1,11 +1,16 @@
|
||||
Audio complex for Eukrea boards with tlv320aic23 codec.
|
||||
|
||||
Required properties:
|
||||
- compatible : "eukrea,asoc-tlv320"
|
||||
- eukrea,model : The user-visible name of this sound complex.
|
||||
- ssi-controller : The phandle of the SSI controller.
|
||||
- fsl,mux-int-port : The internal port of the i.MX audio muxer (AUDMUX).
|
||||
- fsl,mux-ext-port : The external port of the i.MX audio muxer.
|
||||
|
||||
- compatible : "eukrea,asoc-tlv320"
|
||||
|
||||
- eukrea,model : The user-visible name of this sound complex.
|
||||
|
||||
- ssi-controller : The phandle of the SSI controller.
|
||||
|
||||
- fsl,mux-int-port : The internal port of the i.MX audio muxer (AUDMUX).
|
||||
|
||||
- fsl,mux-ext-port : The external port of the i.MX audio muxer.
|
||||
|
||||
Note: The AUDMUX port numbering should start at 1, which is consistent with
|
||||
hardware manual.
|
||||
|
@ -7,37 +7,39 @@ other DSPs. It has up to six transmitters and four receivers.
|
||||
|
||||
Required properties:
|
||||
|
||||
- compatible : Compatible list, must contain "fsl,imx35-esai" or
|
||||
"fsl,vf610-esai"
|
||||
- compatible : Compatible list, must contain "fsl,imx35-esai" or
|
||||
"fsl,vf610-esai"
|
||||
|
||||
- reg : Offset and length of the register set for the device.
|
||||
- reg : Offset and length of the register set for the device.
|
||||
|
||||
- interrupts : Contains the spdif interrupt.
|
||||
- interrupts : Contains the spdif interrupt.
|
||||
|
||||
- dmas : Generic dma devicetree binding as described in
|
||||
Documentation/devicetree/bindings/dma/dma.txt.
|
||||
- dmas : Generic dma devicetree binding as described in
|
||||
Documentation/devicetree/bindings/dma/dma.txt.
|
||||
|
||||
- dma-names : Two dmas have to be defined, "tx" and "rx".
|
||||
- dma-names : Two dmas have to be defined, "tx" and "rx".
|
||||
|
||||
- clocks: Contains an entry for each entry in clock-names.
|
||||
- clocks : Contains an entry for each entry in clock-names.
|
||||
|
||||
- clock-names : Includes the following entries:
|
||||
"core" The core clock used to access registers
|
||||
"extal" The esai baud clock for esai controller used to derive
|
||||
HCK, SCK and FS.
|
||||
"fsys" The system clock derived from ahb clock used to derive
|
||||
HCK, SCK and FS.
|
||||
- clock-names : Includes the following entries:
|
||||
"core" The core clock used to access registers
|
||||
"extal" The esai baud clock for esai controller used to
|
||||
derive HCK, SCK and FS.
|
||||
"fsys" The system clock derived from ahb clock used to
|
||||
derive HCK, SCK and FS.
|
||||
|
||||
- fsl,fifo-depth: The number of elements in the transmit and receive FIFOs.
|
||||
This number is the maximum allowed value for TFCR[TFWM] or RFCR[RFWM].
|
||||
- fsl,fifo-depth : The number of elements in the transmit and receive
|
||||
FIFOs. This number is the maximum allowed value for
|
||||
TFCR[TFWM] or RFCR[RFWM].
|
||||
|
||||
- fsl,esai-synchronous: This is a boolean property. If present, indicating
|
||||
that ESAI would work in the synchronous mode, which means all the settings
|
||||
for Receiving would be duplicated from Transmition related registers.
|
||||
that ESAI would work in the synchronous mode, which
|
||||
means all the settings for Receiving would be
|
||||
duplicated from Transmition related registers.
|
||||
|
||||
- big-endian : If this property is absent, the native endian mode will
|
||||
be in use as default, or the big endian mode will be in use for all the
|
||||
device registers.
|
||||
- big-endian : If this property is absent, the native endian mode
|
||||
will be in use as default, or the big endian mode
|
||||
will be in use for all the device registers.
|
||||
|
||||
Example:
|
||||
|
||||
|
@ -6,32 +6,31 @@ a fibre cable.
|
||||
|
||||
Required properties:
|
||||
|
||||
- compatible : Compatible list, must contain "fsl,imx35-spdif".
|
||||
- compatible : Compatible list, must contain "fsl,imx35-spdif".
|
||||
|
||||
- reg : Offset and length of the register set for the device.
|
||||
- reg : Offset and length of the register set for the device.
|
||||
|
||||
- interrupts : Contains the spdif interrupt.
|
||||
- interrupts : Contains the spdif interrupt.
|
||||
|
||||
- dmas : Generic dma devicetree binding as described in
|
||||
Documentation/devicetree/bindings/dma/dma.txt.
|
||||
- dmas : Generic dma devicetree binding as described in
|
||||
Documentation/devicetree/bindings/dma/dma.txt.
|
||||
|
||||
- dma-names : Two dmas have to be defined, "tx" and "rx".
|
||||
- dma-names : Two dmas have to be defined, "tx" and "rx".
|
||||
|
||||
- clocks : Contains an entry for each entry in clock-names.
|
||||
- clocks : Contains an entry for each entry in clock-names.
|
||||
|
||||
- clock-names : Includes the following entries:
|
||||
"core" The core clock of spdif controller
|
||||
"rxtx<0-7>" Clock source list for tx and rx clock.
|
||||
This clock list should be identical to
|
||||
the source list connecting to the spdif
|
||||
clock mux in "SPDIF Transceiver Clock
|
||||
Diagram" of SoC reference manual. It
|
||||
can also be referred to TxClk_Source
|
||||
bit of register SPDIF_STC.
|
||||
- clock-names : Includes the following entries:
|
||||
"core" The core clock of spdif controller.
|
||||
"rxtx<0-7>" Clock source list for tx and rx clock.
|
||||
This clock list should be identical to the source
|
||||
list connecting to the spdif clock mux in "SPDIF
|
||||
Transceiver Clock Diagram" of SoC reference manual.
|
||||
It can also be referred to TxClk_Source bit of
|
||||
register SPDIF_STC.
|
||||
|
||||
- big-endian : If this property is absent, the native endian mode will
|
||||
be in use as default, or the big endian mode will be in use for all the
|
||||
device registers.
|
||||
- big-endian : If this property is absent, the native endian mode
|
||||
will be in use as default, or the big endian mode
|
||||
will be in use for all the device registers.
|
||||
|
||||
Example:
|
||||
|
||||
|
@ -5,32 +5,48 @@ which provides a synchronous audio interface that supports fullduplex
|
||||
serial interfaces with frame synchronization such as I2S, AC97, TDM, and
|
||||
codec/DSP interfaces.
|
||||
|
||||
|
||||
Required properties:
|
||||
- compatible: Compatible list, contains "fsl,vf610-sai" or "fsl,imx6sx-sai".
|
||||
- reg: Offset and length of the register set for the device.
|
||||
- clocks: Must contain an entry for each entry in clock-names.
|
||||
- clock-names : Must include the "bus" for register access and "mclk1" "mclk2"
|
||||
"mclk3" for bit clock and frame clock providing.
|
||||
- dmas : Generic dma devicetree binding as described in
|
||||
Documentation/devicetree/bindings/dma/dma.txt.
|
||||
- dma-names : Two dmas have to be defined, "tx" and "rx".
|
||||
- pinctrl-names: Must contain a "default" entry.
|
||||
- pinctrl-NNN: One property must exist for each entry in pinctrl-names.
|
||||
See ../pinctrl/pinctrl-bindings.txt for details of the property values.
|
||||
- big-endian: Boolean property, required if all the FTM_PWM registers
|
||||
are big-endian rather than little-endian.
|
||||
- lsb-first: Configures whether the LSB or the MSB is transmitted first for
|
||||
the fifo data. If this property is absent, the MSB is transmitted first as
|
||||
default, or the LSB is transmitted first.
|
||||
- fsl,sai-synchronous-rx: This is a boolean property. If present, indicating
|
||||
that SAI will work in the synchronous mode (sync Tx with Rx) which means
|
||||
both the transimitter and receiver will send and receive data by following
|
||||
receiver's bit clocks and frame sync clocks.
|
||||
- fsl,sai-asynchronous: This is a boolean property. If present, indicating
|
||||
that SAI will work in the asynchronous mode, which means both transimitter
|
||||
and receiver will send and receive data by following their own bit clocks
|
||||
and frame sync clocks separately.
|
||||
|
||||
- compatible : Compatible list, contains "fsl,vf610-sai" or
|
||||
"fsl,imx6sx-sai".
|
||||
|
||||
- reg : Offset and length of the register set for the device.
|
||||
|
||||
- clocks : Must contain an entry for each entry in clock-names.
|
||||
|
||||
- clock-names : Must include the "bus" for register access and
|
||||
"mclk1", "mclk2", "mclk3" for bit clock and frame
|
||||
clock providing.
|
||||
- dmas : Generic dma devicetree binding as described in
|
||||
Documentation/devicetree/bindings/dma/dma.txt.
|
||||
|
||||
- dma-names : Two dmas have to be defined, "tx" and "rx".
|
||||
|
||||
- pinctrl-names : Must contain a "default" entry.
|
||||
|
||||
- pinctrl-NNN : One property must exist for each entry in
|
||||
pinctrl-names. See ../pinctrl/pinctrl-bindings.txt
|
||||
for details of the property values.
|
||||
|
||||
- big-endian : Boolean property, required if all the FTM_PWM
|
||||
registers are big-endian rather than little-endian.
|
||||
|
||||
- lsb-first : Configures whether the LSB or the MSB is transmitted
|
||||
first for the fifo data. If this property is absent,
|
||||
the MSB is transmitted first as default, or the LSB
|
||||
is transmitted first.
|
||||
|
||||
- fsl,sai-synchronous-rx: This is a boolean property. If present, indicating
|
||||
that SAI will work in the synchronous mode (sync Tx
|
||||
with Rx) which means both the transimitter and the
|
||||
receiver will send and receive data by following
|
||||
receiver's bit clocks and frame sync clocks.
|
||||
|
||||
- fsl,sai-asynchronous: This is a boolean property. If present, indicating
|
||||
that SAI will work in the asynchronous mode, which
|
||||
means both transimitter and receiver will send and
|
||||
receive data by following their own bit clocks and
|
||||
frame sync clocks separately.
|
||||
|
||||
Note:
|
||||
- If both fsl,sai-asynchronous and fsl,sai-synchronous-rx are absent, the
|
||||
|
@ -1,33 +1,40 @@
|
||||
Freescale i.MX audio complex with SGTL5000 codec
|
||||
|
||||
Required properties:
|
||||
- compatible : "fsl,imx-audio-sgtl5000"
|
||||
- model : The user-visible name of this sound complex
|
||||
- ssi-controller : The phandle of the i.MX SSI controller
|
||||
- audio-codec : The phandle of the SGTL5000 audio codec
|
||||
- audio-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. Valid names could be power
|
||||
supplies, SGTL5000 pins, and the jacks on the board:
|
||||
|
||||
Power supplies:
|
||||
* Mic Bias
|
||||
- compatible : "fsl,imx-audio-sgtl5000"
|
||||
|
||||
SGTL5000 pins:
|
||||
* MIC_IN
|
||||
* LINE_IN
|
||||
* HP_OUT
|
||||
* LINE_OUT
|
||||
- model : The user-visible name of this sound complex
|
||||
|
||||
Board connectors:
|
||||
* Mic Jack
|
||||
* Line In Jack
|
||||
* Headphone Jack
|
||||
* Line Out Jack
|
||||
* Ext Spk
|
||||
- ssi-controller : The phandle of the i.MX SSI controller
|
||||
|
||||
- mux-int-port : The internal port of the i.MX audio muxer (AUDMUX)
|
||||
- mux-ext-port : The external port of the i.MX audio muxer
|
||||
- audio-codec : The phandle of the SGTL5000 audio codec
|
||||
|
||||
- audio-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. Valid names could be power supplies, SGTL5000
|
||||
pins, and the jacks on the board:
|
||||
|
||||
Power supplies:
|
||||
* Mic Bias
|
||||
|
||||
SGTL5000 pins:
|
||||
* MIC_IN
|
||||
* LINE_IN
|
||||
* HP_OUT
|
||||
* LINE_OUT
|
||||
|
||||
Board connectors:
|
||||
* Mic Jack
|
||||
* Line In Jack
|
||||
* Headphone Jack
|
||||
* Line Out Jack
|
||||
* Ext Spk
|
||||
|
||||
- mux-int-port : The internal port of the i.MX audio muxer (AUDMUX)
|
||||
|
||||
- mux-ext-port : The external port of the i.MX audio muxer
|
||||
|
||||
Note: The AUDMUX port numbering should start at 1, which is consistent with
|
||||
hardware manual.
|
||||
|
@ -2,23 +2,25 @@ Freescale i.MX audio complex with S/PDIF transceiver
|
||||
|
||||
Required properties:
|
||||
|
||||
- compatible : "fsl,imx-audio-spdif"
|
||||
- compatible : "fsl,imx-audio-spdif"
|
||||
|
||||
- model : The user-visible name of this sound complex
|
||||
- model : The user-visible name of this sound complex
|
||||
|
||||
- spdif-controller : The phandle of the i.MX S/PDIF controller
|
||||
- spdif-controller : The phandle of the i.MX S/PDIF controller
|
||||
|
||||
|
||||
Optional properties:
|
||||
|
||||
- spdif-out : This is a boolean property. If present, the transmitting
|
||||
function of S/PDIF will be enabled, indicating there's a physical
|
||||
S/PDIF out connector/jack on the board or it's connecting to some
|
||||
other IP block, such as an HDMI encoder/display-controller.
|
||||
- spdif-out : This is a boolean property. If present, the
|
||||
transmitting function of S/PDIF will be enabled,
|
||||
indicating there's a physical S/PDIF out connector
|
||||
or jack on the board or it's connecting to some
|
||||
other IP block, such as an HDMI encoder or
|
||||
display-controller.
|
||||
|
||||
- spdif-in : This is a boolean property. If present, the receiving
|
||||
function of S/PDIF will be enabled, indicating there's a physical
|
||||
S/PDIF in connector/jack on the board.
|
||||
- spdif-in : This is a boolean property. If present, the receiving
|
||||
function of S/PDIF will be enabled, indicating there
|
||||
is a physical S/PDIF in connector/jack on the board.
|
||||
|
||||
* Note: At least one of these two properties should be set in the DT binding.
|
||||
|
||||
|
@ -1,25 +1,32 @@
|
||||
Freescale i.MX audio complex with WM8962 codec
|
||||
|
||||
Required properties:
|
||||
- compatible : "fsl,imx-audio-wm8962"
|
||||
- model : The user-visible name of this sound complex
|
||||
- ssi-controller : The phandle of the i.MX SSI controller
|
||||
- audio-codec : The phandle of the WM8962 audio codec
|
||||
- audio-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. Valid names could be power
|
||||
supplies, WM8962 pins, and the jacks on the board:
|
||||
|
||||
Power supplies:
|
||||
* Mic Bias
|
||||
- compatible : "fsl,imx-audio-wm8962"
|
||||
|
||||
Board connectors:
|
||||
* Mic Jack
|
||||
* Headphone Jack
|
||||
* Ext Spk
|
||||
- model : The user-visible name of this sound complex
|
||||
|
||||
- mux-int-port : The internal port of the i.MX audio muxer (AUDMUX)
|
||||
- mux-ext-port : The external port of the i.MX audio muxer
|
||||
- ssi-controller : The phandle of the i.MX SSI controller
|
||||
|
||||
- audio-codec : The phandle of the WM8962 audio codec
|
||||
|
||||
- audio-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. Valid names could be power supplies, WM8962
|
||||
pins, and the jacks on the board:
|
||||
|
||||
Power supplies:
|
||||
* Mic Bias
|
||||
|
||||
Board connectors:
|
||||
* Mic Jack
|
||||
* Headphone Jack
|
||||
* Ext Spk
|
||||
|
||||
- mux-int-port : The internal port of the i.MX audio muxer (AUDMUX)
|
||||
|
||||
- mux-ext-port : The external port of the i.MX audio muxer
|
||||
|
||||
Note: The AUDMUX port numbering should start at 1, which is consistent with
|
||||
hardware manual.
|
||||
|
@ -1,18 +1,24 @@
|
||||
Freescale Digital Audio Mux (AUDMUX) device
|
||||
|
||||
Required properties:
|
||||
- compatible : "fsl,imx21-audmux" for AUDMUX version firstly used on i.MX21,
|
||||
or "fsl,imx31-audmux" for the version firstly used on i.MX31.
|
||||
- reg : Should contain AUDMUX registers location and length
|
||||
|
||||
- compatible : "fsl,imx21-audmux" for AUDMUX version firstly used
|
||||
on i.MX21, or "fsl,imx31-audmux" for the version
|
||||
firstly used on i.MX31.
|
||||
|
||||
- reg : Should contain AUDMUX registers location and length.
|
||||
|
||||
An initial configuration can be setup using child nodes.
|
||||
|
||||
Required properties of optional child nodes:
|
||||
- fsl,audmux-port : Integer of the audmux port that is configured by this
|
||||
child node.
|
||||
- fsl,port-config : List of configuration options for the specific port. For
|
||||
imx31-audmux and above, it is a list of tuples <ptcr pdcr>. For
|
||||
imx21-audmux it is a list of pcr values.
|
||||
|
||||
- fsl,audmux-port : Integer of the audmux port that is configured by this
|
||||
child node.
|
||||
|
||||
- fsl,port-config : List of configuration options for the specific port.
|
||||
For imx31-audmux and above, it is a list of tuples
|
||||
<ptcr pdcr>. For imx21-audmux it is a list of pcr
|
||||
values.
|
||||
|
||||
Example:
|
||||
|
||||
|
@ -16,6 +16,8 @@ Optional properties:
|
||||
|
||||
- clock-names: Should be "mclk"
|
||||
|
||||
- maxim,dmic-freq: Frequency at which to clock DMIC
|
||||
|
||||
Pins on the device (for linking into audio routes):
|
||||
|
||||
* MIC1
|
||||
|
@ -1,11 +1,16 @@
|
||||
Renesas FSI
|
||||
|
||||
Required properties:
|
||||
- compatible : "renesas,sh_fsi2" or "renesas,sh_fsi"
|
||||
- compatible : "renesas,fsi2-<soctype>",
|
||||
"renesas,sh_fsi2" or "renesas,sh_fsi" as
|
||||
fallback.
|
||||
Examples with soctypes are:
|
||||
- "renesas,fsi2-r8a7740" (R-Mobile A1)
|
||||
- "renesas,fsi2-sh73a0" (SH-Mobile AG5)
|
||||
- reg : Should contain the register physical address and length
|
||||
- interrupts : Should contain FSI interrupt
|
||||
|
||||
- fsia,spdif-connection : FSI is connected by S/PDFI
|
||||
- fsia,spdif-connection : FSI is connected by S/PDIF
|
||||
- fsia,stream-mode-support : FSI supports 16bit stream mode.
|
||||
- fsia,use-internal-clock : FSI uses internal clock when master mode.
|
||||
|
||||
|
@ -1,8 +1,12 @@
|
||||
Renesas R-Car sound
|
||||
|
||||
Required properties:
|
||||
- compatible : "renesas,rcar_sound-gen1" if generation1
|
||||
- compatible : "renesas,rcar_sound-<soctype>", fallbacks
|
||||
"renesas,rcar_sound-gen1" if generation1, and
|
||||
"renesas,rcar_sound-gen2" if generation2
|
||||
Examples with soctypes are:
|
||||
- "renesas,rcar_sound-r8a7790" (R-Car H2)
|
||||
- "renesas,rcar_sound-r8a7791" (R-Car M2-W)
|
||||
- reg : Should contain the register physical address.
|
||||
required register is
|
||||
SRU/ADG/SSI if generation1
|
||||
@ -35,9 +39,9 @@ DAI subnode properties:
|
||||
|
||||
Example:
|
||||
|
||||
rcar_sound: rcar_sound@0xffd90000 {
|
||||
rcar_sound: rcar_sound@ec500000 {
|
||||
#sound-dai-cells = <1>;
|
||||
compatible = "renesas,rcar_sound-gen2";
|
||||
compatible = "renesas,rcar_sound-r8a7791", "renesas,rcar_sound-gen2";
|
||||
reg = <0 0xec500000 0 0x1000>, /* SCU */
|
||||
<0 0xec5a0000 0 0x100>, /* ADG */
|
||||
<0 0xec540000 0 0x1000>, /* SSIU */
|
||||
|
48
Documentation/devicetree/bindings/sound/rt5631.txt
Normal file
48
Documentation/devicetree/bindings/sound/rt5631.txt
Normal file
@ -0,0 +1,48 @@
|
||||
ALC5631/RT5631 audio CODEC
|
||||
|
||||
This device supports I2C only.
|
||||
|
||||
Required properties:
|
||||
|
||||
- compatible : "realtek,alc5631" or "realtek,rt5631"
|
||||
|
||||
- reg : the I2C address of the device.
|
||||
|
||||
Pins on the device (for linking into audio routes):
|
||||
|
||||
* SPK_OUT_R_P
|
||||
* SPK_OUT_R_N
|
||||
* SPK_OUT_L_P
|
||||
* SPK_OUT_L_N
|
||||
* HP_OUT_L
|
||||
* HP_OUT_R
|
||||
* AUX_OUT2_LP
|
||||
* AUX_OUT2_RN
|
||||
* AUX_OUT1_LP
|
||||
* AUX_OUT1_RN
|
||||
* AUX_IN_L_JD
|
||||
* AUX_IN_R_JD
|
||||
* MONO_IN_P
|
||||
* MONO_IN_N
|
||||
* MIC1_P
|
||||
* MIC1_N
|
||||
* MIC2_P
|
||||
* MIC2_N
|
||||
* MONO_OUT_P
|
||||
* MONO_OUT_N
|
||||
* MICBIAS1
|
||||
* MICBIAS2
|
||||
|
||||
Example:
|
||||
|
||||
alc5631: alc5631@1a {
|
||||
compatible = "realtek,alc5631";
|
||||
reg = <0x1a>;
|
||||
};
|
||||
|
||||
or
|
||||
|
||||
rt5631: rt5631@1a {
|
||||
compatible = "realtek,rt5631";
|
||||
reg = <0x1a>;
|
||||
};
|
@ -27,6 +27,21 @@ Optional properties:
|
||||
Boolean. Indicate MIC1/2 input and LOUT1/2/3 outputs are differential,
|
||||
rather than single-ended.
|
||||
|
||||
- realtek,gpio-config
|
||||
Array of six 8bit elements that configures GPIO.
|
||||
0 - floating (reset value)
|
||||
1 - pull down
|
||||
2 - pull up
|
||||
|
||||
- realtek,jd1-gpio
|
||||
Configures GPIO Mic Jack detection 1.
|
||||
Select 0 ~ 3 as OFF, GPIO1, GPIO2 and GPIO3 respectively.
|
||||
|
||||
- realtek,jd2-gpio
|
||||
- realtek,jd3-gpio
|
||||
Configures GPIO Mic Jack detection 2 and 3.
|
||||
Select 0 ~ 3 as OFF, GPIO4, GPIO5 and GPIO6 respectively.
|
||||
|
||||
Pins on the device (for linking into audio routes):
|
||||
|
||||
* IN1P
|
||||
@ -56,4 +71,6 @@ rt5677 {
|
||||
realtek,pow-ldo2-gpio =
|
||||
<&gpio TEGRA_GPIO(V, 3) GPIO_ACTIVE_HIGH>;
|
||||
realtek,in1-differential = "true";
|
||||
realtek,gpio-config = /bits/ 8 <0 0 0 0 0 2>; /* pull up GPIO6 */
|
||||
realtek,jd2-gpio = <3>; /* Enables Jack detection for GPIO6 */
|
||||
};
|
||||
|
@ -6,10 +6,17 @@ Required SoC Specific Properties:
|
||||
- samsung,s3c6410-i2s: for 8/16/24bit stereo I2S.
|
||||
- samsung,s5pv210-i2s: for 8/16/24bit multichannel(5.1) I2S with
|
||||
secondary fifo, s/w reset control and internal mux for root clk src.
|
||||
- samsung,exynos5420-i2s: for 8/16/24bit multichannel(7.1) I2S with
|
||||
secondary fifo, s/w reset control, internal mux for root clk src and
|
||||
TDM support. TDM (Time division multiplexing) is to allow transfer of
|
||||
multiple channel audio data on single data line.
|
||||
- samsung,exynos5420-i2s: for 8/16/24bit multichannel(5.1) I2S for
|
||||
playback, sterio channel capture, secondary fifo using internal
|
||||
or external dma, s/w reset control, internal mux for root clk src
|
||||
and 7.1 channel TDM support for playback. TDM (Time division multiplexing)
|
||||
is to allow transfer of multiple channel audio data on single data line.
|
||||
- samsung,exynos7-i2s: with all the available features of exynos5 i2s,
|
||||
exynos7 I2S has 7.1 channel TDM support for capture, secondary fifo
|
||||
with only external dma and more no.of root clk sampling frequencies.
|
||||
- samsung,exynos7-i2s1: I2S1 on previous samsung platforms supports
|
||||
stereo channels. exynos7 i2s1 upgraded to 5.1 multichannel with
|
||||
slightly modified bit offsets.
|
||||
|
||||
- reg: physical base address of the controller and length of memory mapped
|
||||
region.
|
||||
|
@ -7,6 +7,17 @@ Required properties:
|
||||
|
||||
- clocks : the clock provider of SYS_MCLK
|
||||
|
||||
- micbias-resistor-k-ohms : the bias resistor to be used in kOmhs
|
||||
The resistor can take values of 2k, 4k or 8k.
|
||||
If set to 0 it will be off.
|
||||
If this node is not mentioned or if the value is unknown, then
|
||||
micbias resistor is set to 4K.
|
||||
|
||||
- micbias-voltage-m-volts : the bias voltage to be used in mVolts
|
||||
The voltage can take values from 1.25V to 3V by 250mV steps
|
||||
If this node is not mentionned or the value is unknown, then
|
||||
the value is set to 1.25V.
|
||||
|
||||
- VDDA-supply : the regulator provider of VDDA
|
||||
|
||||
- VDDIO-supply: the regulator provider of VDDIO
|
||||
@ -21,6 +32,8 @@ codec: sgtl5000@0a {
|
||||
compatible = "fsl,sgtl5000";
|
||||
reg = <0x0a>;
|
||||
clocks = <&clks 150>;
|
||||
micbias-resistor-k-ohms = <2>;
|
||||
micbias-voltage-m-volts = <2250>;
|
||||
VDDA-supply = <®_3p3v>;
|
||||
VDDIO-supply = <®_3p3v>;
|
||||
};
|
||||
|
26
Documentation/devicetree/bindings/sound/ts3a227e.txt
Normal file
26
Documentation/devicetree/bindings/sound/ts3a227e.txt
Normal file
@ -0,0 +1,26 @@
|
||||
Texas Instruments TS3A227E
|
||||
Autonomous Audio Accessory Detection and Configuration Switch
|
||||
|
||||
The TS3A227E detect headsets of 3-ring and 4-ring standards and
|
||||
switches automatically to route the microphone correctly. It also
|
||||
handles key press detection in accordance with the Android audio
|
||||
headset specification v1.0.
|
||||
|
||||
Required properties:
|
||||
|
||||
- compatible: Should contain "ti,ts3a227e".
|
||||
- reg: The i2c address. Should contain <0x3b>.
|
||||
- interrupt-parent: The parent interrupt controller
|
||||
- interrupts: Interrupt number for /INT pin from the 227e
|
||||
|
||||
|
||||
Examples:
|
||||
|
||||
i2c {
|
||||
ts3a227e@3b {
|
||||
compatible = "ti,ts3a227e";
|
||||
reg = <0x3b>;
|
||||
interrupt-parent = <&gpio>;
|
||||
interrupts = <3 IRQ_TYPE_LEVEL_LOW>;
|
||||
};
|
||||
};
|
31
Documentation/devicetree/bindings/sound/wm8960.txt
Normal file
31
Documentation/devicetree/bindings/sound/wm8960.txt
Normal file
@ -0,0 +1,31 @@
|
||||
WM8960 audio CODEC
|
||||
|
||||
This device supports I2C only.
|
||||
|
||||
Required properties:
|
||||
|
||||
- compatible : "wlf,wm8960"
|
||||
|
||||
- reg : the I2C address of the device.
|
||||
|
||||
Optional properties:
|
||||
- wlf,shared-lrclk: This is a boolean property. If present, the LRCM bit of
|
||||
R24 (Additional control 2) gets set, indicating that ADCLRC and DACLRC pins
|
||||
will be disabled only when ADC (Left and Right) and DAC (Left and Right)
|
||||
are disabled.
|
||||
When wm8960 works on synchronize mode and DACLRC pin is used to supply
|
||||
frame clock, it will no frame clock for captrue unless enable DAC to enable
|
||||
DACLRC pin. If shared-lrclk is present, no need to enable DAC for captrue.
|
||||
|
||||
- wlf,capless: This is a boolean property. If present, OUT3 pin will be
|
||||
enabled and disabled together with HP_L and HP_R pins in response to jack
|
||||
detect events.
|
||||
|
||||
Example:
|
||||
|
||||
codec: wm8960@1a {
|
||||
compatible = "wlf,wm8960";
|
||||
reg = <0x1a>;
|
||||
|
||||
wlf,shared-lrclk;
|
||||
};
|
44
MAINTAINERS
44
MAINTAINERS
@ -1828,7 +1828,7 @@ F: include/net/ax25.h
|
||||
F: net/ax25/
|
||||
|
||||
AZ6007 DVB DRIVER
|
||||
M: Mauro Carvalho Chehab <m.chehab@samsung.com>
|
||||
M: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
W: http://linuxtv.org
|
||||
T: git git://linuxtv.org/media_tree.git
|
||||
@ -2198,7 +2198,7 @@ F: Documentation/filesystems/btrfs.txt
|
||||
F: fs/btrfs/
|
||||
|
||||
BTTV VIDEO4LINUX DRIVER
|
||||
M: Mauro Carvalho Chehab <m.chehab@samsung.com>
|
||||
M: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
W: http://linuxtv.org
|
||||
T: git git://linuxtv.org/media_tree.git
|
||||
@ -2719,7 +2719,7 @@ F: drivers/media/common/cx2341x*
|
||||
F: include/media/cx2341x*
|
||||
|
||||
CX88 VIDEO4LINUX DRIVER
|
||||
M: Mauro Carvalho Chehab <m.chehab@samsung.com>
|
||||
M: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
W: http://linuxtv.org
|
||||
T: git git://linuxtv.org/media_tree.git
|
||||
@ -3402,7 +3402,7 @@ F: fs/ecryptfs/
|
||||
EDAC-CORE
|
||||
M: Doug Thompson <dougthompson@xmission.com>
|
||||
M: Borislav Petkov <bp@alien8.de>
|
||||
M: Mauro Carvalho Chehab <m.chehab@samsung.com>
|
||||
M: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
|
||||
L: linux-edac@vger.kernel.org
|
||||
W: bluesmoke.sourceforge.net
|
||||
S: Supported
|
||||
@ -3451,7 +3451,7 @@ S: Maintained
|
||||
F: drivers/edac/e7xxx_edac.c
|
||||
|
||||
EDAC-GHES
|
||||
M: Mauro Carvalho Chehab <m.chehab@samsung.com>
|
||||
M: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
|
||||
L: linux-edac@vger.kernel.org
|
||||
W: bluesmoke.sourceforge.net
|
||||
S: Maintained
|
||||
@ -3479,21 +3479,21 @@ S: Maintained
|
||||
F: drivers/edac/i5000_edac.c
|
||||
|
||||
EDAC-I5400
|
||||
M: Mauro Carvalho Chehab <m.chehab@samsung.com>
|
||||
M: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
|
||||
L: linux-edac@vger.kernel.org
|
||||
W: bluesmoke.sourceforge.net
|
||||
S: Maintained
|
||||
F: drivers/edac/i5400_edac.c
|
||||
|
||||
EDAC-I7300
|
||||
M: Mauro Carvalho Chehab <m.chehab@samsung.com>
|
||||
M: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
|
||||
L: linux-edac@vger.kernel.org
|
||||
W: bluesmoke.sourceforge.net
|
||||
S: Maintained
|
||||
F: drivers/edac/i7300_edac.c
|
||||
|
||||
EDAC-I7CORE
|
||||
M: Mauro Carvalho Chehab <m.chehab@samsung.com>
|
||||
M: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
|
||||
L: linux-edac@vger.kernel.org
|
||||
W: bluesmoke.sourceforge.net
|
||||
S: Maintained
|
||||
@ -3536,7 +3536,7 @@ S: Maintained
|
||||
F: drivers/edac/r82600_edac.c
|
||||
|
||||
EDAC-SBRIDGE
|
||||
M: Mauro Carvalho Chehab <m.chehab@samsung.com>
|
||||
M: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
|
||||
L: linux-edac@vger.kernel.org
|
||||
W: bluesmoke.sourceforge.net
|
||||
S: Maintained
|
||||
@ -3596,7 +3596,7 @@ S: Maintained
|
||||
F: drivers/net/ethernet/ibm/ehea/
|
||||
|
||||
EM28XX VIDEO4LINUX DRIVER
|
||||
M: Mauro Carvalho Chehab <m.chehab@samsung.com>
|
||||
M: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
W: http://linuxtv.org
|
||||
T: git git://linuxtv.org/media_tree.git
|
||||
@ -5962,7 +5962,7 @@ S: Maintained
|
||||
F: drivers/media/radio/radio-maxiradio*
|
||||
|
||||
MEDIA INPUT INFRASTRUCTURE (V4L/DVB)
|
||||
M: Mauro Carvalho Chehab <m.chehab@samsung.com>
|
||||
M: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
|
||||
P: LinuxTV.org Project
|
||||
L: linux-media@vger.kernel.org
|
||||
W: http://linuxtv.org
|
||||
@ -6601,6 +6601,12 @@ S: Supported
|
||||
F: drivers/gpu/drm/i2c/tda998x_drv.c
|
||||
F: include/drm/i2c/tda998x.h
|
||||
|
||||
NXP TFA9879 DRIVER
|
||||
M: Peter Rosin <peda@axentia.se>
|
||||
L: alsa-devel@alsa-project.org (moderated for non-subscribers)
|
||||
S: Maintained
|
||||
F: sound/soc/codecs/tfa9879*
|
||||
|
||||
OMAP SUPPORT
|
||||
M: Tony Lindgren <tony@atomide.com>
|
||||
L: linux-omap@vger.kernel.org
|
||||
@ -8013,7 +8019,7 @@ S: Odd Fixes
|
||||
F: drivers/media/i2c/saa6588*
|
||||
|
||||
SAA7134 VIDEO4LINUX DRIVER
|
||||
M: Mauro Carvalho Chehab <m.chehab@samsung.com>
|
||||
M: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
W: http://linuxtv.org
|
||||
T: git git://linuxtv.org/media_tree.git
|
||||
@ -8471,7 +8477,7 @@ S: Maintained
|
||||
F: drivers/media/radio/si4713/radio-usb-si4713.c
|
||||
|
||||
SIANO DVB DRIVER
|
||||
M: Mauro Carvalho Chehab <m.chehab@samsung.com>
|
||||
M: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
W: http://linuxtv.org
|
||||
T: git git://linuxtv.org/media_tree.git
|
||||
@ -8682,7 +8688,9 @@ S: Maintained
|
||||
F: drivers/leds/leds-net48xx.c
|
||||
|
||||
SOFTLOGIC 6x10 MPEG CODEC
|
||||
M: Ismael Luceno <ismael.luceno@corp.bluecherry.net>
|
||||
M: Bluecherry Maintainers <maintainers@bluecherrydvr.com>
|
||||
M: Andrey Utkin <andrey.utkin@corp.bluecherry.net>
|
||||
M: Andrey Utkin <andrey.krieger.utkin@gmail.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
S: Supported
|
||||
F: drivers/media/pci/solo6x10/
|
||||
@ -9156,7 +9164,7 @@ S: Maintained
|
||||
F: drivers/media/i2c/tda9840*
|
||||
|
||||
TEA5761 TUNER DRIVER
|
||||
M: Mauro Carvalho Chehab <m.chehab@samsung.com>
|
||||
M: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
W: http://linuxtv.org
|
||||
T: git git://linuxtv.org/media_tree.git
|
||||
@ -9164,7 +9172,7 @@ S: Odd fixes
|
||||
F: drivers/media/tuners/tea5761.*
|
||||
|
||||
TEA5767 TUNER DRIVER
|
||||
M: Mauro Carvalho Chehab <m.chehab@samsung.com>
|
||||
M: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
W: http://linuxtv.org
|
||||
T: git git://linuxtv.org/media_tree.git
|
||||
@ -9476,7 +9484,7 @@ F: include/linux/shmem_fs.h
|
||||
F: mm/shmem.c
|
||||
|
||||
TM6000 VIDEO4LINUX DRIVER
|
||||
M: Mauro Carvalho Chehab <m.chehab@samsung.com>
|
||||
M: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
W: http://linuxtv.org
|
||||
T: git git://linuxtv.org/media_tree.git
|
||||
@ -10297,7 +10305,7 @@ S: Maintained
|
||||
F: arch/x86/kernel/cpu/mcheck/*
|
||||
|
||||
XC2028/3028 TUNER DRIVER
|
||||
M: Mauro Carvalho Chehab <m.chehab@samsung.com>
|
||||
M: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
W: http://linuxtv.org
|
||||
T: git git://linuxtv.org/media_tree.git
|
||||
|
2
Makefile
2
Makefile
@ -1,7 +1,7 @@
|
||||
VERSION = 3
|
||||
PATCHLEVEL = 18
|
||||
SUBLEVEL = 0
|
||||
EXTRAVERSION = -rc7
|
||||
EXTRAVERSION =
|
||||
NAME = Diseased Newt
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
@ -923,6 +923,14 @@ static void __init spitz_i2c_init(void)
|
||||
static inline void spitz_i2c_init(void) {}
|
||||
#endif
|
||||
|
||||
/******************************************************************************
|
||||
* Audio devices
|
||||
******************************************************************************/
|
||||
static inline void spitz_audio_init(void)
|
||||
{
|
||||
platform_device_register_simple("spitz-audio", -1, NULL, 0);
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
* Machine init
|
||||
******************************************************************************/
|
||||
@ -970,6 +978,7 @@ static void __init spitz_init(void)
|
||||
spitz_nor_init();
|
||||
spitz_nand_init();
|
||||
spitz_i2c_init();
|
||||
spitz_audio_init();
|
||||
}
|
||||
|
||||
static void __init spitz_fixup(struct tag *tags, char **cmdline)
|
||||
|
@ -54,12 +54,8 @@ void s390_handle_mcck(void)
|
||||
*/
|
||||
local_irq_save(flags);
|
||||
local_mcck_disable();
|
||||
/*
|
||||
* Ummm... Does this make sense at all? Copying the percpu struct
|
||||
* and then zapping it one statement later?
|
||||
*/
|
||||
memcpy(&mcck, this_cpu_ptr(&cpu_mcck), sizeof(mcck));
|
||||
memset(&mcck, 0, sizeof(struct mcck_struct));
|
||||
mcck = *this_cpu_ptr(&cpu_mcck);
|
||||
memset(this_cpu_ptr(&cpu_mcck), 0, sizeof(mcck));
|
||||
clear_cpu_flag(CIF_MCCK_PENDING);
|
||||
local_mcck_enable();
|
||||
local_irq_restore(flags);
|
||||
|
@ -76,7 +76,7 @@ suffix-$(CONFIG_KERNEL_XZ) := xz
|
||||
suffix-$(CONFIG_KERNEL_LZO) := lzo
|
||||
suffix-$(CONFIG_KERNEL_LZ4) := lz4
|
||||
|
||||
RUN_SIZE = $(shell objdump -h vmlinux | \
|
||||
RUN_SIZE = $(shell $(OBJDUMP) -h vmlinux | \
|
||||
perl $(srctree)/arch/x86/tools/calc_run_size.pl)
|
||||
quiet_cmd_mkpiggy = MKPIGGY $@
|
||||
cmd_mkpiggy = $(obj)/mkpiggy $< $(RUN_SIZE) > $@ || ( rm -f $@ ; false )
|
||||
|
@ -16,6 +16,9 @@
|
||||
|
||||
#include <linux/sfi.h>
|
||||
|
||||
#define MAX_NUM_STREAMS_MRFLD 25
|
||||
#define MAX_NUM_STREAMS MAX_NUM_STREAMS_MRFLD
|
||||
|
||||
enum sst_audio_task_id_mrfld {
|
||||
SST_TASK_ID_NONE = 0,
|
||||
SST_TASK_ID_SBA = 1,
|
||||
@ -73,6 +76,65 @@ struct sst_platform_data {
|
||||
unsigned int strm_map_size;
|
||||
};
|
||||
|
||||
struct sst_info {
|
||||
u32 iram_start;
|
||||
u32 iram_end;
|
||||
bool iram_use;
|
||||
u32 dram_start;
|
||||
u32 dram_end;
|
||||
bool dram_use;
|
||||
u32 imr_start;
|
||||
u32 imr_end;
|
||||
bool imr_use;
|
||||
u32 mailbox_start;
|
||||
bool use_elf;
|
||||
bool lpe_viewpt_rqd;
|
||||
unsigned int max_streams;
|
||||
u32 dma_max_len;
|
||||
u8 num_probes;
|
||||
};
|
||||
|
||||
struct sst_lib_dnld_info {
|
||||
unsigned int mod_base;
|
||||
unsigned int mod_end;
|
||||
unsigned int mod_table_offset;
|
||||
unsigned int mod_table_size;
|
||||
bool mod_ddr_dnld;
|
||||
};
|
||||
|
||||
struct sst_res_info {
|
||||
unsigned int shim_offset;
|
||||
unsigned int shim_size;
|
||||
unsigned int shim_phy_addr;
|
||||
unsigned int ssp0_offset;
|
||||
unsigned int ssp0_size;
|
||||
unsigned int dma0_offset;
|
||||
unsigned int dma0_size;
|
||||
unsigned int dma1_offset;
|
||||
unsigned int dma1_size;
|
||||
unsigned int iram_offset;
|
||||
unsigned int iram_size;
|
||||
unsigned int dram_offset;
|
||||
unsigned int dram_size;
|
||||
unsigned int mbox_offset;
|
||||
unsigned int mbox_size;
|
||||
unsigned int acpi_lpe_res_index;
|
||||
unsigned int acpi_ddr_index;
|
||||
unsigned int acpi_ipc_irq_index;
|
||||
};
|
||||
|
||||
struct sst_ipc_info {
|
||||
int ipc_offset;
|
||||
unsigned int mbox_recv_off;
|
||||
};
|
||||
|
||||
struct sst_platform_info {
|
||||
const struct sst_info *probe_data;
|
||||
const struct sst_ipc_info *ipc_info;
|
||||
const struct sst_res_info *res_info;
|
||||
const struct sst_lib_dnld_info *lib_info;
|
||||
const char *platform;
|
||||
};
|
||||
int add_sst_platform_device(void);
|
||||
#endif
|
||||
|
||||
|
@ -465,6 +465,7 @@ static void mc_bp_resume(void)
|
||||
|
||||
if (uci->valid && uci->mc)
|
||||
microcode_ops->apply_microcode(cpu);
|
||||
#ifdef CONFIG_X86_64
|
||||
else if (!uci->mc)
|
||||
/*
|
||||
* We might resume and not have applied late microcode but still
|
||||
@ -473,6 +474,7 @@ static void mc_bp_resume(void)
|
||||
* applying patches early on the APs.
|
||||
*/
|
||||
load_ucode_ap();
|
||||
#endif
|
||||
}
|
||||
|
||||
static struct syscore_ops mc_syscore_ops = {
|
||||
|
@ -216,9 +216,10 @@ static int bio_integrity_process(struct bio *bio,
|
||||
{
|
||||
struct blk_integrity *bi = bdev_get_integrity(bio->bi_bdev);
|
||||
struct blk_integrity_iter iter;
|
||||
struct bio_vec *bv;
|
||||
struct bvec_iter bviter;
|
||||
struct bio_vec bv;
|
||||
struct bio_integrity_payload *bip = bio_integrity(bio);
|
||||
unsigned int i, ret = 0;
|
||||
unsigned int ret = 0;
|
||||
void *prot_buf = page_address(bip->bip_vec->bv_page) +
|
||||
bip->bip_vec->bv_offset;
|
||||
|
||||
@ -227,11 +228,11 @@ static int bio_integrity_process(struct bio *bio,
|
||||
iter.seed = bip_get_seed(bip);
|
||||
iter.prot_buf = prot_buf;
|
||||
|
||||
bio_for_each_segment_all(bv, bio, i) {
|
||||
void *kaddr = kmap_atomic(bv->bv_page);
|
||||
bio_for_each_segment(bv, bio, bviter) {
|
||||
void *kaddr = kmap_atomic(bv.bv_page);
|
||||
|
||||
iter.data_buf = kaddr + bv->bv_offset;
|
||||
iter.data_size = bv->bv_len;
|
||||
iter.data_buf = kaddr + bv.bv_offset;
|
||||
iter.data_size = bv.bv_len;
|
||||
|
||||
ret = proc_fn(&iter);
|
||||
if (ret) {
|
||||
|
@ -1164,7 +1164,8 @@ static bool acpi_video_device_in_dod(struct acpi_video_device *device)
|
||||
return true;
|
||||
|
||||
for (i = 0; i < video->attached_count; i++) {
|
||||
if (video->attached_array[i].bind_info == device)
|
||||
if ((video->attached_array[i].value.int_val & 0xfff) ==
|
||||
(device->device_id & 0xfff))
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -321,6 +321,9 @@ static const struct pci_device_id ahci_pci_tbl[] = {
|
||||
{ PCI_VDEVICE(INTEL, 0x8c87), board_ahci }, /* 9 Series RAID */
|
||||
{ PCI_VDEVICE(INTEL, 0x8c8e), board_ahci }, /* 9 Series RAID */
|
||||
{ PCI_VDEVICE(INTEL, 0x8c8f), board_ahci }, /* 9 Series RAID */
|
||||
{ PCI_VDEVICE(INTEL, 0x9d03), board_ahci }, /* Sunrise Point-LP AHCI */
|
||||
{ PCI_VDEVICE(INTEL, 0x9d05), board_ahci }, /* Sunrise Point-LP RAID */
|
||||
{ PCI_VDEVICE(INTEL, 0x9d07), board_ahci }, /* Sunrise Point-LP RAID */
|
||||
{ PCI_VDEVICE(INTEL, 0xa103), board_ahci }, /* Sunrise Point-H AHCI */
|
||||
{ PCI_VDEVICE(INTEL, 0xa103), board_ahci }, /* Sunrise Point-H RAID */
|
||||
{ PCI_VDEVICE(INTEL, 0xa105), board_ahci }, /* Sunrise Point-H RAID */
|
||||
@ -492,6 +495,7 @@ static const struct pci_device_id ahci_pci_tbl[] = {
|
||||
* enabled. https://bugzilla.kernel.org/show_bug.cgi?id=60731
|
||||
*/
|
||||
{ PCI_VDEVICE(SAMSUNG, 0x1600), board_ahci_nomsi },
|
||||
{ PCI_VDEVICE(SAMSUNG, 0xa800), board_ahci_nomsi },
|
||||
|
||||
/* Enmotus */
|
||||
{ PCI_DEVICE(0x1c44, 0x8000), board_ahci },
|
||||
|
@ -1488,7 +1488,7 @@ static int sata_fsl_probe(struct platform_device *ofdev)
|
||||
host_priv->csr_base = csr_base;
|
||||
|
||||
irq = irq_of_parse_and_map(ofdev->dev.of_node, 0);
|
||||
if (irq < 0) {
|
||||
if (!irq) {
|
||||
dev_err(&ofdev->dev, "invalid irq from platform\n");
|
||||
goto error_exit_with_cleanup;
|
||||
}
|
||||
|
@ -3,12 +3,15 @@
|
||||
# subsystems should select the appropriate symbols.
|
||||
|
||||
config REGMAP
|
||||
default y if (REGMAP_I2C || REGMAP_SPI || REGMAP_SPMI || REGMAP_MMIO || REGMAP_IRQ)
|
||||
default y if (REGMAP_I2C || REGMAP_SPI || REGMAP_SPMI || REGMAP_AC97 || REGMAP_MMIO || REGMAP_IRQ)
|
||||
select LZO_COMPRESS
|
||||
select LZO_DECOMPRESS
|
||||
select IRQ_DOMAIN if REGMAP_IRQ
|
||||
bool
|
||||
|
||||
config REGMAP_AC97
|
||||
tristate
|
||||
|
||||
config REGMAP_I2C
|
||||
tristate
|
||||
depends on I2C
|
||||
|
@ -1,6 +1,7 @@
|
||||
obj-$(CONFIG_REGMAP) += regmap.o regcache.o
|
||||
obj-$(CONFIG_REGMAP) += regcache-rbtree.o regcache-lzo.o regcache-flat.o
|
||||
obj-$(CONFIG_DEBUG_FS) += regmap-debugfs.o
|
||||
obj-$(CONFIG_REGMAP_AC97) += regmap-ac97.o
|
||||
obj-$(CONFIG_REGMAP_I2C) += regmap-i2c.o
|
||||
obj-$(CONFIG_REGMAP_SPI) += regmap-spi.o
|
||||
obj-$(CONFIG_REGMAP_SPMI) += regmap-spmi.o
|
||||
|
114
drivers/base/regmap/regmap-ac97.c
Normal file
114
drivers/base/regmap/regmap-ac97.c
Normal file
@ -0,0 +1,114 @@
|
||||
/*
|
||||
* Register map access API - AC'97 support
|
||||
*
|
||||
* Copyright 2013 Linaro Ltd. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms and conditions of the GNU General Public License,
|
||||
* version 2, as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <linux/clk.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/regmap.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
#include <sound/ac97_codec.h>
|
||||
|
||||
bool regmap_ac97_default_volatile(struct device *dev, unsigned int reg)
|
||||
{
|
||||
switch (reg) {
|
||||
case AC97_RESET:
|
||||
case AC97_POWERDOWN:
|
||||
case AC97_INT_PAGING:
|
||||
case AC97_EXTENDED_ID:
|
||||
case AC97_EXTENDED_STATUS:
|
||||
case AC97_EXTENDED_MID:
|
||||
case AC97_EXTENDED_MSTATUS:
|
||||
case AC97_GPIO_STATUS:
|
||||
case AC97_MISC_AFE:
|
||||
case AC97_VENDOR_ID1:
|
||||
case AC97_VENDOR_ID2:
|
||||
case AC97_CODEC_CLASS_REV:
|
||||
case AC97_PCI_SVID:
|
||||
case AC97_PCI_SID:
|
||||
case AC97_FUNC_SELECT:
|
||||
case AC97_FUNC_INFO:
|
||||
case AC97_SENSE_INFO:
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(regmap_ac97_default_volatile);
|
||||
|
||||
static int regmap_ac97_reg_read(void *context, unsigned int reg,
|
||||
unsigned int *val)
|
||||
{
|
||||
struct snd_ac97 *ac97 = context;
|
||||
|
||||
*val = ac97->bus->ops->read(ac97, reg);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int regmap_ac97_reg_write(void *context, unsigned int reg,
|
||||
unsigned int val)
|
||||
{
|
||||
struct snd_ac97 *ac97 = context;
|
||||
|
||||
ac97->bus->ops->write(ac97, reg, val);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct regmap_bus ac97_regmap_bus = {
|
||||
.reg_write = regmap_ac97_reg_write,
|
||||
.reg_read = regmap_ac97_reg_read,
|
||||
};
|
||||
|
||||
/**
|
||||
* regmap_init_ac97(): Initialise AC'97 register map
|
||||
*
|
||||
* @ac97: Device that will be interacted with
|
||||
* @config: Configuration for register map
|
||||
*
|
||||
* The return value will be an ERR_PTR() on error or a valid pointer to
|
||||
* a struct regmap.
|
||||
*/
|
||||
struct regmap *regmap_init_ac97(struct snd_ac97 *ac97,
|
||||
const struct regmap_config *config)
|
||||
{
|
||||
return regmap_init(&ac97->dev, &ac97_regmap_bus, ac97, config);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(regmap_init_ac97);
|
||||
|
||||
/**
|
||||
* devm_regmap_init_ac97(): Initialise AC'97 register map
|
||||
*
|
||||
* @ac97: Device that will be interacted with
|
||||
* @config: Configuration for register map
|
||||
*
|
||||
* The return value will be an ERR_PTR() on error or a valid pointer
|
||||
* to a struct regmap. The regmap will be automatically freed by the
|
||||
* device management code.
|
||||
*/
|
||||
struct regmap *devm_regmap_init_ac97(struct snd_ac97 *ac97,
|
||||
const struct regmap_config *config)
|
||||
{
|
||||
return devm_regmap_init(&ac97->dev, &ac97_regmap_bus, ac97, config);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(devm_regmap_init_ac97);
|
||||
|
||||
MODULE_LICENSE("GPL v2");
|
@ -4325,7 +4325,6 @@ static void ironlake_crtc_disable(struct drm_crtc *crtc)
|
||||
ironlake_fdi_disable(crtc);
|
||||
|
||||
ironlake_disable_pch_transcoder(dev_priv, pipe);
|
||||
intel_set_pch_fifo_underrun_reporting(dev, pipe, true);
|
||||
|
||||
if (HAS_PCH_CPT(dev)) {
|
||||
/* disable TRANS_DP_CTL */
|
||||
@ -4389,7 +4388,6 @@ static void haswell_crtc_disable(struct drm_crtc *crtc)
|
||||
|
||||
if (intel_crtc->config.has_pch_encoder) {
|
||||
lpt_disable_pch_transcoder(dev_priv);
|
||||
intel_set_pch_fifo_underrun_reporting(dev, TRANSCODER_A, true);
|
||||
intel_ddi_fdi_disable(crtc);
|
||||
}
|
||||
|
||||
|
@ -899,6 +899,17 @@ void intel_lvds_init(struct drm_device *dev)
|
||||
int pipe;
|
||||
u8 pin;
|
||||
|
||||
/*
|
||||
* Unlock registers and just leave them unlocked. Do this before
|
||||
* checking quirk lists to avoid bogus WARNINGs.
|
||||
*/
|
||||
if (HAS_PCH_SPLIT(dev)) {
|
||||
I915_WRITE(PCH_PP_CONTROL,
|
||||
I915_READ(PCH_PP_CONTROL) | PANEL_UNLOCK_REGS);
|
||||
} else {
|
||||
I915_WRITE(PP_CONTROL,
|
||||
I915_READ(PP_CONTROL) | PANEL_UNLOCK_REGS);
|
||||
}
|
||||
if (!intel_lvds_supported(dev))
|
||||
return;
|
||||
|
||||
@ -1097,17 +1108,6 @@ out:
|
||||
lvds_encoder->a3_power = I915_READ(lvds_encoder->reg) &
|
||||
LVDS_A3_POWER_MASK;
|
||||
|
||||
/*
|
||||
* Unlock registers and just
|
||||
* leave them unlocked
|
||||
*/
|
||||
if (HAS_PCH_SPLIT(dev)) {
|
||||
I915_WRITE(PCH_PP_CONTROL,
|
||||
I915_READ(PCH_PP_CONTROL) | PANEL_UNLOCK_REGS);
|
||||
} else {
|
||||
I915_WRITE(PP_CONTROL,
|
||||
I915_READ(PP_CONTROL) | PANEL_UNLOCK_REGS);
|
||||
}
|
||||
lvds_connector->lid_notifier.notifier_call = intel_lid_notify;
|
||||
if (acpi_lid_notifier_register(&lvds_connector->lid_notifier)) {
|
||||
DRM_DEBUG_KMS("lid notifier registration failed\n");
|
||||
|
@ -218,7 +218,6 @@ nvc0_identify(struct nouveau_device *device)
|
||||
device->oclass[NVDEV_ENGINE_BSP ] = &nvc0_bsp_oclass;
|
||||
device->oclass[NVDEV_ENGINE_PPP ] = &nvc0_ppp_oclass;
|
||||
device->oclass[NVDEV_ENGINE_COPY0 ] = &nvc0_copy0_oclass;
|
||||
device->oclass[NVDEV_ENGINE_COPY1 ] = &nvc0_copy1_oclass;
|
||||
device->oclass[NVDEV_ENGINE_DISP ] = nva3_disp_oclass;
|
||||
device->oclass[NVDEV_ENGINE_PERFMON] = &nvc0_perfmon_oclass;
|
||||
break;
|
||||
|
@ -551,8 +551,8 @@ nv04_fifo_intr(struct nouveau_subdev *subdev)
|
||||
}
|
||||
|
||||
if (status & 0x40000000) {
|
||||
nouveau_fifo_uevent(&priv->base);
|
||||
nv_wr32(priv, 0x002100, 0x40000000);
|
||||
nouveau_fifo_uevent(&priv->base);
|
||||
status &= ~0x40000000;
|
||||
}
|
||||
}
|
||||
|
@ -740,6 +740,8 @@ nvc0_fifo_intr_engine_unit(struct nvc0_fifo_priv *priv, int engn)
|
||||
u32 inte = nv_rd32(priv, 0x002628);
|
||||
u32 unkn;
|
||||
|
||||
nv_wr32(priv, 0x0025a8 + (engn * 0x04), intr);
|
||||
|
||||
for (unkn = 0; unkn < 8; unkn++) {
|
||||
u32 ints = (intr >> (unkn * 0x04)) & inte;
|
||||
if (ints & 0x1) {
|
||||
@ -751,8 +753,6 @@ nvc0_fifo_intr_engine_unit(struct nvc0_fifo_priv *priv, int engn)
|
||||
nv_mask(priv, 0x002628, ints, 0);
|
||||
}
|
||||
}
|
||||
|
||||
nv_wr32(priv, 0x0025a8 + (engn * 0x04), intr);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -952,8 +952,8 @@ nve0_fifo_intr(struct nouveau_subdev *subdev)
|
||||
}
|
||||
|
||||
if (stat & 0x80000000) {
|
||||
nve0_fifo_intr_engine(priv);
|
||||
nv_wr32(priv, 0x002100, 0x80000000);
|
||||
nve0_fifo_intr_engine(priv);
|
||||
stat &= ~0x80000000;
|
||||
}
|
||||
|
||||
|
@ -629,7 +629,6 @@ int nouveau_pmops_suspend(struct device *dev)
|
||||
|
||||
pci_save_state(pdev);
|
||||
pci_disable_device(pdev);
|
||||
pci_ignore_hotplug(pdev);
|
||||
pci_set_power_state(pdev, PCI_D3hot);
|
||||
return 0;
|
||||
}
|
||||
@ -933,6 +932,7 @@ static int nouveau_pmops_runtime_suspend(struct device *dev)
|
||||
ret = nouveau_do_suspend(drm_dev, true);
|
||||
pci_save_state(pdev);
|
||||
pci_disable_device(pdev);
|
||||
pci_ignore_hotplug(pdev);
|
||||
pci_set_power_state(pdev, PCI_D3cold);
|
||||
drm_dev->switch_power_state = DRM_SWITCH_POWER_DYNAMIC_OFF;
|
||||
return ret;
|
||||
|
@ -52,20 +52,24 @@ nouveau_fctx(struct nouveau_fence *fence)
|
||||
return container_of(fence->base.lock, struct nouveau_fence_chan, lock);
|
||||
}
|
||||
|
||||
static void
|
||||
static int
|
||||
nouveau_fence_signal(struct nouveau_fence *fence)
|
||||
{
|
||||
int drop = 0;
|
||||
|
||||
fence_signal_locked(&fence->base);
|
||||
list_del(&fence->head);
|
||||
rcu_assign_pointer(fence->channel, NULL);
|
||||
|
||||
if (test_bit(FENCE_FLAG_USER_BITS, &fence->base.flags)) {
|
||||
struct nouveau_fence_chan *fctx = nouveau_fctx(fence);
|
||||
|
||||
if (!--fctx->notify_ref)
|
||||
nvif_notify_put(&fctx->notify);
|
||||
drop = 1;
|
||||
}
|
||||
|
||||
fence_put(&fence->base);
|
||||
return drop;
|
||||
}
|
||||
|
||||
static struct nouveau_fence *
|
||||
@ -88,16 +92,23 @@ nouveau_fence_context_del(struct nouveau_fence_chan *fctx)
|
||||
{
|
||||
struct nouveau_fence *fence;
|
||||
|
||||
nvif_notify_fini(&fctx->notify);
|
||||
|
||||
spin_lock_irq(&fctx->lock);
|
||||
while (!list_empty(&fctx->pending)) {
|
||||
fence = list_entry(fctx->pending.next, typeof(*fence), head);
|
||||
|
||||
nouveau_fence_signal(fence);
|
||||
fence->channel = NULL;
|
||||
if (nouveau_fence_signal(fence))
|
||||
nvif_notify_put(&fctx->notify);
|
||||
}
|
||||
spin_unlock_irq(&fctx->lock);
|
||||
|
||||
nvif_notify_fini(&fctx->notify);
|
||||
fctx->dead = 1;
|
||||
|
||||
/*
|
||||
* Ensure that all accesses to fence->channel complete before freeing
|
||||
* the channel.
|
||||
*/
|
||||
synchronize_rcu();
|
||||
}
|
||||
|
||||
static void
|
||||
@ -112,21 +123,23 @@ nouveau_fence_context_free(struct nouveau_fence_chan *fctx)
|
||||
kref_put(&fctx->fence_ref, nouveau_fence_context_put);
|
||||
}
|
||||
|
||||
static void
|
||||
static int
|
||||
nouveau_fence_update(struct nouveau_channel *chan, struct nouveau_fence_chan *fctx)
|
||||
{
|
||||
struct nouveau_fence *fence;
|
||||
|
||||
int drop = 0;
|
||||
u32 seq = fctx->read(chan);
|
||||
|
||||
while (!list_empty(&fctx->pending)) {
|
||||
fence = list_entry(fctx->pending.next, typeof(*fence), head);
|
||||
|
||||
if ((int)(seq - fence->base.seqno) < 0)
|
||||
return;
|
||||
break;
|
||||
|
||||
nouveau_fence_signal(fence);
|
||||
drop |= nouveau_fence_signal(fence);
|
||||
}
|
||||
|
||||
return drop;
|
||||
}
|
||||
|
||||
static int
|
||||
@ -135,18 +148,21 @@ nouveau_fence_wait_uevent_handler(struct nvif_notify *notify)
|
||||
struct nouveau_fence_chan *fctx =
|
||||
container_of(notify, typeof(*fctx), notify);
|
||||
unsigned long flags;
|
||||
int ret = NVIF_NOTIFY_KEEP;
|
||||
|
||||
spin_lock_irqsave(&fctx->lock, flags);
|
||||
if (!list_empty(&fctx->pending)) {
|
||||
struct nouveau_fence *fence;
|
||||
struct nouveau_channel *chan;
|
||||
|
||||
fence = list_entry(fctx->pending.next, typeof(*fence), head);
|
||||
nouveau_fence_update(fence->channel, fctx);
|
||||
chan = rcu_dereference_protected(fence->channel, lockdep_is_held(&fctx->lock));
|
||||
if (nouveau_fence_update(fence->channel, fctx))
|
||||
ret = NVIF_NOTIFY_DROP;
|
||||
}
|
||||
spin_unlock_irqrestore(&fctx->lock, flags);
|
||||
|
||||
/* Always return keep here. NVIF refcount is handled with nouveau_fence_update */
|
||||
return NVIF_NOTIFY_KEEP;
|
||||
return ret;
|
||||
}
|
||||
|
||||
void
|
||||
@ -262,7 +278,10 @@ nouveau_fence_emit(struct nouveau_fence *fence, struct nouveau_channel *chan)
|
||||
if (!ret) {
|
||||
fence_get(&fence->base);
|
||||
spin_lock_irq(&fctx->lock);
|
||||
nouveau_fence_update(chan, fctx);
|
||||
|
||||
if (nouveau_fence_update(chan, fctx))
|
||||
nvif_notify_put(&fctx->notify);
|
||||
|
||||
list_add_tail(&fence->head, &fctx->pending);
|
||||
spin_unlock_irq(&fctx->lock);
|
||||
}
|
||||
@ -276,13 +295,16 @@ nouveau_fence_done(struct nouveau_fence *fence)
|
||||
if (fence->base.ops == &nouveau_fence_ops_legacy ||
|
||||
fence->base.ops == &nouveau_fence_ops_uevent) {
|
||||
struct nouveau_fence_chan *fctx = nouveau_fctx(fence);
|
||||
struct nouveau_channel *chan;
|
||||
unsigned long flags;
|
||||
|
||||
if (test_bit(FENCE_FLAG_SIGNALED_BIT, &fence->base.flags))
|
||||
return true;
|
||||
|
||||
spin_lock_irqsave(&fctx->lock, flags);
|
||||
nouveau_fence_update(fence->channel, fctx);
|
||||
chan = rcu_dereference_protected(fence->channel, lockdep_is_held(&fctx->lock));
|
||||
if (chan && nouveau_fence_update(chan, fctx))
|
||||
nvif_notify_put(&fctx->notify);
|
||||
spin_unlock_irqrestore(&fctx->lock, flags);
|
||||
}
|
||||
return fence_is_signaled(&fence->base);
|
||||
@ -387,12 +409,18 @@ nouveau_fence_sync(struct nouveau_bo *nvbo, struct nouveau_channel *chan, bool e
|
||||
|
||||
if (fence && (!exclusive || !fobj || !fobj->shared_count)) {
|
||||
struct nouveau_channel *prev = NULL;
|
||||
bool must_wait = true;
|
||||
|
||||
f = nouveau_local_fence(fence, chan->drm);
|
||||
if (f)
|
||||
prev = f->channel;
|
||||
if (f) {
|
||||
rcu_read_lock();
|
||||
prev = rcu_dereference(f->channel);
|
||||
if (prev && (prev == chan || fctx->sync(f, prev, chan) == 0))
|
||||
must_wait = false;
|
||||
rcu_read_unlock();
|
||||
}
|
||||
|
||||
if (!prev || (prev != chan && (ret = fctx->sync(f, prev, chan))))
|
||||
if (must_wait)
|
||||
ret = fence_wait(fence, intr);
|
||||
|
||||
return ret;
|
||||
@ -403,19 +431,22 @@ nouveau_fence_sync(struct nouveau_bo *nvbo, struct nouveau_channel *chan, bool e
|
||||
|
||||
for (i = 0; i < fobj->shared_count && !ret; ++i) {
|
||||
struct nouveau_channel *prev = NULL;
|
||||
bool must_wait = true;
|
||||
|
||||
fence = rcu_dereference_protected(fobj->shared[i],
|
||||
reservation_object_held(resv));
|
||||
|
||||
f = nouveau_local_fence(fence, chan->drm);
|
||||
if (f)
|
||||
prev = f->channel;
|
||||
if (f) {
|
||||
rcu_read_lock();
|
||||
prev = rcu_dereference(f->channel);
|
||||
if (prev && (prev == chan || fctx->sync(f, prev, chan) == 0))
|
||||
must_wait = false;
|
||||
rcu_read_unlock();
|
||||
}
|
||||
|
||||
if (!prev || (prev != chan && (ret = fctx->sync(f, prev, chan))))
|
||||
if (must_wait)
|
||||
ret = fence_wait(fence, intr);
|
||||
|
||||
if (ret)
|
||||
break;
|
||||
}
|
||||
|
||||
return ret;
|
||||
@ -463,7 +494,7 @@ static const char *nouveau_fence_get_timeline_name(struct fence *f)
|
||||
struct nouveau_fence *fence = from_fence(f);
|
||||
struct nouveau_fence_chan *fctx = nouveau_fctx(fence);
|
||||
|
||||
return fence->channel ? fctx->name : "dead channel";
|
||||
return !fctx->dead ? fctx->name : "dead channel";
|
||||
}
|
||||
|
||||
/*
|
||||
@ -476,9 +507,16 @@ static bool nouveau_fence_is_signaled(struct fence *f)
|
||||
{
|
||||
struct nouveau_fence *fence = from_fence(f);
|
||||
struct nouveau_fence_chan *fctx = nouveau_fctx(fence);
|
||||
struct nouveau_channel *chan = fence->channel;
|
||||
struct nouveau_channel *chan;
|
||||
bool ret = false;
|
||||
|
||||
return (int)(fctx->read(chan) - fence->base.seqno) >= 0;
|
||||
rcu_read_lock();
|
||||
chan = rcu_dereference(fence->channel);
|
||||
if (chan)
|
||||
ret = (int)(fctx->read(chan) - fence->base.seqno) >= 0;
|
||||
rcu_read_unlock();
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static bool nouveau_fence_no_signaling(struct fence *f)
|
||||
|
@ -14,7 +14,7 @@ struct nouveau_fence {
|
||||
|
||||
bool sysmem;
|
||||
|
||||
struct nouveau_channel *channel;
|
||||
struct nouveau_channel __rcu *channel;
|
||||
unsigned long timeout;
|
||||
};
|
||||
|
||||
@ -47,7 +47,7 @@ struct nouveau_fence_chan {
|
||||
char name[32];
|
||||
|
||||
struct nvif_notify notify;
|
||||
int notify_ref;
|
||||
int notify_ref, dead;
|
||||
};
|
||||
|
||||
struct nouveau_fence_priv {
|
||||
|
@ -251,22 +251,19 @@ static int radeon_cs_get_ring(struct radeon_cs_parser *p, u32 ring, s32 priority
|
||||
|
||||
static int radeon_cs_sync_rings(struct radeon_cs_parser *p)
|
||||
{
|
||||
int i, r = 0;
|
||||
struct radeon_cs_reloc *reloc;
|
||||
int r;
|
||||
|
||||
for (i = 0; i < p->nrelocs; i++) {
|
||||
list_for_each_entry(reloc, &p->validated, tv.head) {
|
||||
struct reservation_object *resv;
|
||||
|
||||
if (!p->relocs[i].robj)
|
||||
continue;
|
||||
|
||||
resv = p->relocs[i].robj->tbo.resv;
|
||||
resv = reloc->robj->tbo.resv;
|
||||
r = radeon_semaphore_sync_resv(p->rdev, p->ib.semaphore, resv,
|
||||
p->relocs[i].tv.shared);
|
||||
|
||||
reloc->tv.shared);
|
||||
if (r)
|
||||
break;
|
||||
return r;
|
||||
}
|
||||
return r;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* XXX: note that this is called from the legacy UMS CS ioctl as well */
|
||||
|
@ -795,6 +795,8 @@ int radeon_get_vblank_timestamp_kms(struct drm_device *dev, int crtc,
|
||||
|
||||
/* Get associated drm_crtc: */
|
||||
drmcrtc = &rdev->mode_info.crtcs[crtc]->base;
|
||||
if (!drmcrtc)
|
||||
return -EINVAL;
|
||||
|
||||
/* Helper routine in DRM core does all the work: */
|
||||
return drm_calc_vbltimestamp_from_scanoutpos(dev, crtc, max_error,
|
||||
|
@ -213,6 +213,13 @@ int radeon_bo_create(struct radeon_device *rdev,
|
||||
if (!(rdev->flags & RADEON_IS_PCIE))
|
||||
bo->flags &= ~(RADEON_GEM_GTT_WC | RADEON_GEM_GTT_UC);
|
||||
|
||||
#ifdef CONFIG_X86_32
|
||||
/* XXX: Write-combined CPU mappings of GTT seem broken on 32-bit
|
||||
* See https://bugs.freedesktop.org/show_bug.cgi?id=84627
|
||||
*/
|
||||
bo->flags &= ~RADEON_GEM_GTT_WC;
|
||||
#endif
|
||||
|
||||
radeon_ttm_placement_from_domain(bo, domain);
|
||||
/* Kernel allocation are uninterruptible */
|
||||
down_read(&rdev->pm.mclk_lock);
|
||||
|
@ -111,6 +111,8 @@
|
||||
#define CDNS_I2C_DIVA_MAX 4
|
||||
#define CDNS_I2C_DIVB_MAX 64
|
||||
|
||||
#define CDNS_I2C_TIMEOUT_MAX 0xFF
|
||||
|
||||
#define cdns_i2c_readreg(offset) readl_relaxed(id->membase + offset)
|
||||
#define cdns_i2c_writereg(val, offset) writel_relaxed(val, id->membase + offset)
|
||||
|
||||
@ -852,6 +854,15 @@ static int cdns_i2c_probe(struct platform_device *pdev)
|
||||
goto err_clk_dis;
|
||||
}
|
||||
|
||||
/*
|
||||
* Cadence I2C controller has a bug wherein it generates
|
||||
* invalid read transaction after HW timeout in master receiver mode.
|
||||
* HW timeout is not used by this driver and the interrupt is disabled.
|
||||
* But the feature itself cannot be disabled. Hence maximum value
|
||||
* is written to this register to reduce the chances of error.
|
||||
*/
|
||||
cdns_i2c_writereg(CDNS_I2C_TIMEOUT_MAX, CDNS_I2C_TIME_OUT_OFFSET);
|
||||
|
||||
dev_info(&pdev->dev, "%u kHz mmio %08lx irq %d\n",
|
||||
id->i2c_clk / 1000, (unsigned long)r_mem->start, id->irq);
|
||||
|
||||
|
@ -407,11 +407,9 @@ i2c_davinci_xfer_msg(struct i2c_adapter *adap, struct i2c_msg *msg, int stop)
|
||||
if (dev->cmd_err & DAVINCI_I2C_STR_NACK) {
|
||||
if (msg->flags & I2C_M_IGNORE_NAK)
|
||||
return msg->len;
|
||||
if (stop) {
|
||||
w = davinci_i2c_read_reg(dev, DAVINCI_I2C_MDR_REG);
|
||||
w |= DAVINCI_I2C_MDR_STP;
|
||||
davinci_i2c_write_reg(dev, DAVINCI_I2C_MDR_REG, w);
|
||||
}
|
||||
w = davinci_i2c_read_reg(dev, DAVINCI_I2C_MDR_REG);
|
||||
w |= DAVINCI_I2C_MDR_STP;
|
||||
davinci_i2c_write_reg(dev, DAVINCI_I2C_MDR_REG, w);
|
||||
return -EREMOTEIO;
|
||||
}
|
||||
return -EIO;
|
||||
|
@ -359,7 +359,7 @@ int i2c_dw_init(struct dw_i2c_dev *dev)
|
||||
}
|
||||
|
||||
/* Configure Tx/Rx FIFO threshold levels */
|
||||
dw_writel(dev, dev->tx_fifo_depth - 1, DW_IC_TX_TL);
|
||||
dw_writel(dev, dev->tx_fifo_depth / 2, DW_IC_TX_TL);
|
||||
dw_writel(dev, 0, DW_IC_RX_TL);
|
||||
|
||||
/* configure the i2c master */
|
||||
|
@ -922,14 +922,12 @@ omap_i2c_isr_thread(int this_irq, void *dev_id)
|
||||
if (stat & OMAP_I2C_STAT_NACK) {
|
||||
err |= OMAP_I2C_STAT_NACK;
|
||||
omap_i2c_ack_stat(dev, OMAP_I2C_STAT_NACK);
|
||||
break;
|
||||
}
|
||||
|
||||
if (stat & OMAP_I2C_STAT_AL) {
|
||||
dev_err(dev->dev, "Arbitration lost\n");
|
||||
err |= OMAP_I2C_STAT_AL;
|
||||
omap_i2c_ack_stat(dev, OMAP_I2C_STAT_AL);
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -954,11 +952,13 @@ omap_i2c_isr_thread(int this_irq, void *dev_id)
|
||||
if (dev->fifo_size)
|
||||
num_bytes = dev->buf_len;
|
||||
|
||||
omap_i2c_receive_data(dev, num_bytes, true);
|
||||
|
||||
if (dev->errata & I2C_OMAP_ERRATA_I207)
|
||||
if (dev->errata & I2C_OMAP_ERRATA_I207) {
|
||||
i2c_omap_errata_i207(dev, stat);
|
||||
num_bytes = (omap_i2c_read_reg(dev,
|
||||
OMAP_I2C_BUFSTAT_REG) >> 8) & 0x3F;
|
||||
}
|
||||
|
||||
omap_i2c_receive_data(dev, num_bytes, true);
|
||||
omap_i2c_ack_stat(dev, OMAP_I2C_STAT_RDR);
|
||||
continue;
|
||||
}
|
||||
|
@ -421,7 +421,7 @@ static int evdev_open(struct inode *inode, struct file *file)
|
||||
|
||||
err_free_client:
|
||||
evdev_detach_client(evdev, client);
|
||||
kfree(client);
|
||||
kvfree(client);
|
||||
return error;
|
||||
}
|
||||
|
||||
|
@ -2190,7 +2190,7 @@ static int smiapp_set_selection(struct v4l2_subdev *subdev,
|
||||
ret = smiapp_set_compose(subdev, fh, sel);
|
||||
break;
|
||||
default:
|
||||
BUG();
|
||||
ret = -EINVAL;
|
||||
}
|
||||
|
||||
mutex_unlock(&sensor->mutex);
|
||||
|
@ -1078,7 +1078,7 @@ static __le32 *cx23885_risc_field(__le32 *rp, struct scatterlist *sglist,
|
||||
for (line = 0; line < lines; line++) {
|
||||
while (offset && offset >= sg_dma_len(sg)) {
|
||||
offset -= sg_dma_len(sg);
|
||||
sg++;
|
||||
sg = sg_next(sg);
|
||||
}
|
||||
|
||||
if (lpi && line > 0 && !(line % lpi))
|
||||
@ -1101,14 +1101,14 @@ static __le32 *cx23885_risc_field(__le32 *rp, struct scatterlist *sglist,
|
||||
*(rp++) = cpu_to_le32(0); /* bits 63-32 */
|
||||
todo -= (sg_dma_len(sg)-offset);
|
||||
offset = 0;
|
||||
sg++;
|
||||
sg = sg_next(sg);
|
||||
while (todo > sg_dma_len(sg)) {
|
||||
*(rp++) = cpu_to_le32(RISC_WRITE|
|
||||
sg_dma_len(sg));
|
||||
*(rp++) = cpu_to_le32(sg_dma_address(sg));
|
||||
*(rp++) = cpu_to_le32(0); /* bits 63-32 */
|
||||
todo -= sg_dma_len(sg);
|
||||
sg++;
|
||||
sg = sg_next(sg);
|
||||
}
|
||||
*(rp++) = cpu_to_le32(RISC_WRITE|RISC_EOL|todo);
|
||||
*(rp++) = cpu_to_le32(sg_dma_address(sg));
|
||||
|
@ -105,11 +105,8 @@ static irqreturn_t solo_isr(int irq, void *data)
|
||||
if (!status)
|
||||
return IRQ_NONE;
|
||||
|
||||
if (status & ~solo_dev->irq_mask) {
|
||||
solo_reg_write(solo_dev, SOLO_IRQ_STAT,
|
||||
status & ~solo_dev->irq_mask);
|
||||
status &= solo_dev->irq_mask;
|
||||
}
|
||||
/* Acknowledge all interrupts immediately */
|
||||
solo_reg_write(solo_dev, SOLO_IRQ_STAT, status);
|
||||
|
||||
if (status & SOLO_IRQ_PCI_ERR)
|
||||
solo_p2m_error_isr(solo_dev);
|
||||
@ -132,9 +129,6 @@ static irqreturn_t solo_isr(int irq, void *data)
|
||||
if (status & SOLO_IRQ_G723)
|
||||
solo_g723_isr(solo_dev);
|
||||
|
||||
/* Clear all interrupts handled */
|
||||
solo_reg_write(solo_dev, SOLO_IRQ_STAT, status);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
|
@ -259,8 +259,8 @@ again:
|
||||
case 32:
|
||||
if ((scancode & RC6_6A_LCC_MASK) == RC6_6A_MCE_CC) {
|
||||
protocol = RC_TYPE_RC6_MCE;
|
||||
scancode &= ~RC6_6A_MCE_TOGGLE_MASK;
|
||||
toggle = !!(scancode & RC6_6A_MCE_TOGGLE_MASK);
|
||||
scancode &= ~RC6_6A_MCE_TOGGLE_MASK;
|
||||
} else {
|
||||
protocol = RC_BIT_RC6_6A_32;
|
||||
toggle = 0;
|
||||
|
@ -632,7 +632,7 @@ static void s2255_fillbuff(struct s2255_vc *vc,
|
||||
break;
|
||||
case V4L2_PIX_FMT_JPEG:
|
||||
case V4L2_PIX_FMT_MJPEG:
|
||||
buf->vb.v4l2_buf.length = jpgsize;
|
||||
vb2_set_plane_payload(&buf->vb, 0, jpgsize);
|
||||
memcpy(vbuf, tmpbuf, jpgsize);
|
||||
break;
|
||||
case V4L2_PIX_FMT_YUV422P:
|
||||
|
@ -225,7 +225,12 @@ static int bond_changelink(struct net_device *bond_dev,
|
||||
|
||||
bond_option_arp_ip_targets_clear(bond);
|
||||
nla_for_each_nested(attr, data[IFLA_BOND_ARP_IP_TARGET], rem) {
|
||||
__be32 target = nla_get_be32(attr);
|
||||
__be32 target;
|
||||
|
||||
if (nla_len(attr) < sizeof(target))
|
||||
return -EINVAL;
|
||||
|
||||
target = nla_get_be32(attr);
|
||||
|
||||
bond_opt_initval(&newval, (__force u64)target);
|
||||
err = __bond_opt_set(bond, BOND_OPT_ARP_TARGETS,
|
||||
|
@ -2442,9 +2442,13 @@ static unsigned int from_fw_linkcaps(unsigned int type, unsigned int caps)
|
||||
SUPPORTED_10000baseKR_Full | SUPPORTED_1000baseKX_Full |
|
||||
SUPPORTED_10000baseKX4_Full;
|
||||
else if (type == FW_PORT_TYPE_FIBER_XFI ||
|
||||
type == FW_PORT_TYPE_FIBER_XAUI || type == FW_PORT_TYPE_SFP)
|
||||
type == FW_PORT_TYPE_FIBER_XAUI || type == FW_PORT_TYPE_SFP) {
|
||||
v |= SUPPORTED_FIBRE;
|
||||
else if (type == FW_PORT_TYPE_BP40_BA)
|
||||
if (caps & FW_PORT_CAP_SPEED_1G)
|
||||
v |= SUPPORTED_1000baseT_Full;
|
||||
if (caps & FW_PORT_CAP_SPEED_10G)
|
||||
v |= SUPPORTED_10000baseT_Full;
|
||||
} else if (type == FW_PORT_TYPE_BP40_BA)
|
||||
v |= SUPPORTED_40000baseSR4_Full;
|
||||
|
||||
if (caps & FW_PORT_CAP_ANEG)
|
||||
|
@ -917,21 +917,13 @@ static int sh_eth_reset(struct net_device *ndev)
|
||||
return ret;
|
||||
}
|
||||
|
||||
#if defined(CONFIG_CPU_SH4) || defined(CONFIG_ARCH_SHMOBILE)
|
||||
static void sh_eth_set_receive_align(struct sk_buff *skb)
|
||||
{
|
||||
int reserve;
|
||||
uintptr_t reserve = (uintptr_t)skb->data & (SH_ETH_RX_ALIGN - 1);
|
||||
|
||||
reserve = SH4_SKB_RX_ALIGN - ((u32)skb->data & (SH4_SKB_RX_ALIGN - 1));
|
||||
if (reserve)
|
||||
skb_reserve(skb, reserve);
|
||||
skb_reserve(skb, SH_ETH_RX_ALIGN - reserve);
|
||||
}
|
||||
#else
|
||||
static void sh_eth_set_receive_align(struct sk_buff *skb)
|
||||
{
|
||||
skb_reserve(skb, SH2_SH3_SKB_RX_ALIGN);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/* CPU <-> EDMAC endian convert */
|
||||
@ -1119,6 +1111,7 @@ static void sh_eth_ring_format(struct net_device *ndev)
|
||||
struct sh_eth_txdesc *txdesc = NULL;
|
||||
int rx_ringsize = sizeof(*rxdesc) * mdp->num_rx_ring;
|
||||
int tx_ringsize = sizeof(*txdesc) * mdp->num_tx_ring;
|
||||
int skbuff_size = mdp->rx_buf_sz + SH_ETH_RX_ALIGN - 1;
|
||||
|
||||
mdp->cur_rx = 0;
|
||||
mdp->cur_tx = 0;
|
||||
@ -1131,21 +1124,21 @@ static void sh_eth_ring_format(struct net_device *ndev)
|
||||
for (i = 0; i < mdp->num_rx_ring; i++) {
|
||||
/* skb */
|
||||
mdp->rx_skbuff[i] = NULL;
|
||||
skb = netdev_alloc_skb(ndev, mdp->rx_buf_sz);
|
||||
skb = netdev_alloc_skb(ndev, skbuff_size);
|
||||
mdp->rx_skbuff[i] = skb;
|
||||
if (skb == NULL)
|
||||
break;
|
||||
dma_map_single(&ndev->dev, skb->data, mdp->rx_buf_sz,
|
||||
DMA_FROM_DEVICE);
|
||||
sh_eth_set_receive_align(skb);
|
||||
|
||||
/* RX descriptor */
|
||||
rxdesc = &mdp->rx_ring[i];
|
||||
/* The size of the buffer is a multiple of 16 bytes. */
|
||||
rxdesc->buffer_length = ALIGN(mdp->rx_buf_sz, 16);
|
||||
dma_map_single(&ndev->dev, skb->data, rxdesc->buffer_length,
|
||||
DMA_FROM_DEVICE);
|
||||
rxdesc->addr = virt_to_phys(PTR_ALIGN(skb->data, 4));
|
||||
rxdesc->status = cpu_to_edmac(mdp, RD_RACT | RD_RFP);
|
||||
|
||||
/* The size of the buffer is 16 byte boundary. */
|
||||
rxdesc->buffer_length = ALIGN(mdp->rx_buf_sz, 16);
|
||||
/* Rx descriptor address set */
|
||||
if (i == 0) {
|
||||
sh_eth_write(ndev, mdp->rx_desc_dma, RDLAR);
|
||||
@ -1397,6 +1390,7 @@ static int sh_eth_rx(struct net_device *ndev, u32 intr_status, int *quota)
|
||||
struct sk_buff *skb;
|
||||
u16 pkt_len = 0;
|
||||
u32 desc_status;
|
||||
int skbuff_size = mdp->rx_buf_sz + SH_ETH_RX_ALIGN - 1;
|
||||
|
||||
rxdesc = &mdp->rx_ring[entry];
|
||||
while (!(rxdesc->status & cpu_to_edmac(mdp, RD_RACT))) {
|
||||
@ -1448,7 +1442,7 @@ static int sh_eth_rx(struct net_device *ndev, u32 intr_status, int *quota)
|
||||
if (mdp->cd->rpadir)
|
||||
skb_reserve(skb, NET_IP_ALIGN);
|
||||
dma_sync_single_for_cpu(&ndev->dev, rxdesc->addr,
|
||||
mdp->rx_buf_sz,
|
||||
ALIGN(mdp->rx_buf_sz, 16),
|
||||
DMA_FROM_DEVICE);
|
||||
skb_put(skb, pkt_len);
|
||||
skb->protocol = eth_type_trans(skb, ndev);
|
||||
@ -1468,13 +1462,13 @@ static int sh_eth_rx(struct net_device *ndev, u32 intr_status, int *quota)
|
||||
rxdesc->buffer_length = ALIGN(mdp->rx_buf_sz, 16);
|
||||
|
||||
if (mdp->rx_skbuff[entry] == NULL) {
|
||||
skb = netdev_alloc_skb(ndev, mdp->rx_buf_sz);
|
||||
skb = netdev_alloc_skb(ndev, skbuff_size);
|
||||
mdp->rx_skbuff[entry] = skb;
|
||||
if (skb == NULL)
|
||||
break; /* Better luck next round. */
|
||||
dma_map_single(&ndev->dev, skb->data, mdp->rx_buf_sz,
|
||||
DMA_FROM_DEVICE);
|
||||
sh_eth_set_receive_align(skb);
|
||||
dma_map_single(&ndev->dev, skb->data,
|
||||
rxdesc->buffer_length, DMA_FROM_DEVICE);
|
||||
|
||||
skb_checksum_none_assert(skb);
|
||||
rxdesc->addr = virt_to_phys(PTR_ALIGN(skb->data, 4));
|
||||
@ -2042,6 +2036,8 @@ static int sh_eth_open(struct net_device *ndev)
|
||||
if (ret)
|
||||
goto out_free_irq;
|
||||
|
||||
mdp->is_opened = 1;
|
||||
|
||||
return ret;
|
||||
|
||||
out_free_irq:
|
||||
@ -2131,6 +2127,36 @@ static int sh_eth_start_xmit(struct sk_buff *skb, struct net_device *ndev)
|
||||
return NETDEV_TX_OK;
|
||||
}
|
||||
|
||||
static struct net_device_stats *sh_eth_get_stats(struct net_device *ndev)
|
||||
{
|
||||
struct sh_eth_private *mdp = netdev_priv(ndev);
|
||||
|
||||
if (sh_eth_is_rz_fast_ether(mdp))
|
||||
return &ndev->stats;
|
||||
|
||||
if (!mdp->is_opened)
|
||||
return &ndev->stats;
|
||||
|
||||
ndev->stats.tx_dropped += sh_eth_read(ndev, TROCR);
|
||||
sh_eth_write(ndev, 0, TROCR); /* (write clear) */
|
||||
ndev->stats.collisions += sh_eth_read(ndev, CDCR);
|
||||
sh_eth_write(ndev, 0, CDCR); /* (write clear) */
|
||||
ndev->stats.tx_carrier_errors += sh_eth_read(ndev, LCCR);
|
||||
sh_eth_write(ndev, 0, LCCR); /* (write clear) */
|
||||
|
||||
if (sh_eth_is_gether(mdp)) {
|
||||
ndev->stats.tx_carrier_errors += sh_eth_read(ndev, CERCR);
|
||||
sh_eth_write(ndev, 0, CERCR); /* (write clear) */
|
||||
ndev->stats.tx_carrier_errors += sh_eth_read(ndev, CEECR);
|
||||
sh_eth_write(ndev, 0, CEECR); /* (write clear) */
|
||||
} else {
|
||||
ndev->stats.tx_carrier_errors += sh_eth_read(ndev, CNDCR);
|
||||
sh_eth_write(ndev, 0, CNDCR); /* (write clear) */
|
||||
}
|
||||
|
||||
return &ndev->stats;
|
||||
}
|
||||
|
||||
/* device close function */
|
||||
static int sh_eth_close(struct net_device *ndev)
|
||||
{
|
||||
@ -2145,6 +2171,7 @@ static int sh_eth_close(struct net_device *ndev)
|
||||
sh_eth_write(ndev, 0, EDTRR);
|
||||
sh_eth_write(ndev, 0, EDRRR);
|
||||
|
||||
sh_eth_get_stats(ndev);
|
||||
/* PHY Disconnect */
|
||||
if (mdp->phydev) {
|
||||
phy_stop(mdp->phydev);
|
||||
@ -2163,38 +2190,11 @@ static int sh_eth_close(struct net_device *ndev)
|
||||
|
||||
pm_runtime_put_sync(&mdp->pdev->dev);
|
||||
|
||||
mdp->is_opened = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct net_device_stats *sh_eth_get_stats(struct net_device *ndev)
|
||||
{
|
||||
struct sh_eth_private *mdp = netdev_priv(ndev);
|
||||
|
||||
if (sh_eth_is_rz_fast_ether(mdp))
|
||||
return &ndev->stats;
|
||||
|
||||
pm_runtime_get_sync(&mdp->pdev->dev);
|
||||
|
||||
ndev->stats.tx_dropped += sh_eth_read(ndev, TROCR);
|
||||
sh_eth_write(ndev, 0, TROCR); /* (write clear) */
|
||||
ndev->stats.collisions += sh_eth_read(ndev, CDCR);
|
||||
sh_eth_write(ndev, 0, CDCR); /* (write clear) */
|
||||
ndev->stats.tx_carrier_errors += sh_eth_read(ndev, LCCR);
|
||||
sh_eth_write(ndev, 0, LCCR); /* (write clear) */
|
||||
if (sh_eth_is_gether(mdp)) {
|
||||
ndev->stats.tx_carrier_errors += sh_eth_read(ndev, CERCR);
|
||||
sh_eth_write(ndev, 0, CERCR); /* (write clear) */
|
||||
ndev->stats.tx_carrier_errors += sh_eth_read(ndev, CEECR);
|
||||
sh_eth_write(ndev, 0, CEECR); /* (write clear) */
|
||||
} else {
|
||||
ndev->stats.tx_carrier_errors += sh_eth_read(ndev, CNDCR);
|
||||
sh_eth_write(ndev, 0, CNDCR); /* (write clear) */
|
||||
}
|
||||
pm_runtime_put_sync(&mdp->pdev->dev);
|
||||
|
||||
return &ndev->stats;
|
||||
}
|
||||
|
||||
/* ioctl to device function */
|
||||
static int sh_eth_do_ioctl(struct net_device *ndev, struct ifreq *rq, int cmd)
|
||||
{
|
||||
|
@ -162,9 +162,9 @@ enum {
|
||||
|
||||
/* Driver's parameters */
|
||||
#if defined(CONFIG_CPU_SH4) || defined(CONFIG_ARCH_SHMOBILE)
|
||||
#define SH4_SKB_RX_ALIGN 32
|
||||
#define SH_ETH_RX_ALIGN 32
|
||||
#else
|
||||
#define SH2_SH3_SKB_RX_ALIGN 2
|
||||
#define SH_ETH_RX_ALIGN 2
|
||||
#endif
|
||||
|
||||
/* Register's bits
|
||||
@ -522,6 +522,7 @@ struct sh_eth_private {
|
||||
|
||||
unsigned no_ether_link:1;
|
||||
unsigned ether_link_active_low:1;
|
||||
unsigned is_opened:1;
|
||||
};
|
||||
|
||||
static inline void sh_eth_soft_swap(char *src, int len)
|
||||
|
@ -265,6 +265,15 @@ static int stmmac_pltfr_probe(struct platform_device *pdev)
|
||||
|
||||
plat_dat = dev_get_platdata(&pdev->dev);
|
||||
|
||||
if (!plat_dat)
|
||||
plat_dat = devm_kzalloc(&pdev->dev,
|
||||
sizeof(struct plat_stmmacenet_data),
|
||||
GFP_KERNEL);
|
||||
if (!plat_dat) {
|
||||
pr_err("%s: ERROR: no memory", __func__);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
/* Set default value for multicast hash bins */
|
||||
plat_dat->multicast_filter_bins = HASH_TABLE_SIZE;
|
||||
|
||||
@ -272,15 +281,6 @@ static int stmmac_pltfr_probe(struct platform_device *pdev)
|
||||
plat_dat->unicast_filter_entries = 1;
|
||||
|
||||
if (pdev->dev.of_node) {
|
||||
if (!plat_dat)
|
||||
plat_dat = devm_kzalloc(&pdev->dev,
|
||||
sizeof(struct plat_stmmacenet_data),
|
||||
GFP_KERNEL);
|
||||
if (!plat_dat) {
|
||||
pr_err("%s: ERROR: no memory", __func__);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
ret = stmmac_probe_config_dt(pdev, plat_dat, &mac);
|
||||
if (ret) {
|
||||
pr_err("%s: main dt probe failed", __func__);
|
||||
|
@ -496,9 +496,6 @@ static void xennet_make_frags(struct sk_buff *skb, struct netfront_queue *queue,
|
||||
len = skb_frag_size(frag);
|
||||
offset = frag->page_offset;
|
||||
|
||||
/* Data must not cross a page boundary. */
|
||||
BUG_ON(len + offset > PAGE_SIZE<<compound_order(page));
|
||||
|
||||
/* Skip unused frames from start of page */
|
||||
page += offset >> PAGE_SHIFT;
|
||||
offset &= ~PAGE_MASK;
|
||||
@ -506,8 +503,6 @@ static void xennet_make_frags(struct sk_buff *skb, struct netfront_queue *queue,
|
||||
while (len > 0) {
|
||||
unsigned long bytes;
|
||||
|
||||
BUG_ON(offset >= PAGE_SIZE);
|
||||
|
||||
bytes = PAGE_SIZE - offset;
|
||||
if (bytes > len)
|
||||
bytes = len;
|
||||
|
@ -964,8 +964,6 @@ void __init __weak early_init_dt_add_memory_arch(u64 base, u64 size)
|
||||
int __init __weak early_init_dt_reserve_memory_arch(phys_addr_t base,
|
||||
phys_addr_t size, bool nomap)
|
||||
{
|
||||
if (memblock_is_region_reserved(base, size))
|
||||
return -EBUSY;
|
||||
if (nomap)
|
||||
return memblock_remove(base, size);
|
||||
return memblock_reserve(base, size);
|
||||
|
@ -276,6 +276,7 @@ struct tegra_pcie {
|
||||
|
||||
struct resource all;
|
||||
struct resource io;
|
||||
struct resource pio;
|
||||
struct resource mem;
|
||||
struct resource prefetch;
|
||||
struct resource busn;
|
||||
@ -658,7 +659,6 @@ static int tegra_pcie_setup(int nr, struct pci_sys_data *sys)
|
||||
{
|
||||
struct tegra_pcie *pcie = sys_to_pcie(sys);
|
||||
int err;
|
||||
phys_addr_t io_start;
|
||||
|
||||
err = devm_request_resource(pcie->dev, &pcie->all, &pcie->mem);
|
||||
if (err < 0)
|
||||
@ -668,14 +668,12 @@ static int tegra_pcie_setup(int nr, struct pci_sys_data *sys)
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
io_start = pci_pio_to_address(pcie->io.start);
|
||||
|
||||
pci_add_resource_offset(&sys->resources, &pcie->mem, sys->mem_offset);
|
||||
pci_add_resource_offset(&sys->resources, &pcie->prefetch,
|
||||
sys->mem_offset);
|
||||
pci_add_resource(&sys->resources, &pcie->busn);
|
||||
|
||||
pci_ioremap_io(nr * SZ_64K, io_start);
|
||||
pci_ioremap_io(pcie->pio.start, pcie->io.start);
|
||||
|
||||
return 1;
|
||||
}
|
||||
@ -786,7 +784,6 @@ static irqreturn_t tegra_pcie_isr(int irq, void *arg)
|
||||
static void tegra_pcie_setup_translations(struct tegra_pcie *pcie)
|
||||
{
|
||||
u32 fpci_bar, size, axi_address;
|
||||
phys_addr_t io_start = pci_pio_to_address(pcie->io.start);
|
||||
|
||||
/* Bar 0: type 1 extended configuration space */
|
||||
fpci_bar = 0xfe100000;
|
||||
@ -799,7 +796,7 @@ static void tegra_pcie_setup_translations(struct tegra_pcie *pcie)
|
||||
/* Bar 1: downstream IO bar */
|
||||
fpci_bar = 0xfdfc0000;
|
||||
size = resource_size(&pcie->io);
|
||||
axi_address = io_start;
|
||||
axi_address = pcie->io.start;
|
||||
afi_writel(pcie, axi_address, AFI_AXI_BAR1_START);
|
||||
afi_writel(pcie, size >> 12, AFI_AXI_BAR1_SZ);
|
||||
afi_writel(pcie, fpci_bar, AFI_FPCI_BAR1);
|
||||
@ -1690,8 +1687,23 @@ static int tegra_pcie_parse_dt(struct tegra_pcie *pcie)
|
||||
|
||||
switch (res.flags & IORESOURCE_TYPE_BITS) {
|
||||
case IORESOURCE_IO:
|
||||
memcpy(&pcie->io, &res, sizeof(res));
|
||||
pcie->io.name = np->full_name;
|
||||
memcpy(&pcie->pio, &res, sizeof(res));
|
||||
pcie->pio.name = np->full_name;
|
||||
|
||||
/*
|
||||
* The Tegra PCIe host bridge uses this to program the
|
||||
* mapping of the I/O space to the physical address,
|
||||
* so we override the .start and .end fields here that
|
||||
* of_pci_range_to_resource() converted to I/O space.
|
||||
* We also set the IORESOURCE_MEM type to clarify that
|
||||
* the resource is in the physical memory space.
|
||||
*/
|
||||
pcie->io.start = range.cpu_addr;
|
||||
pcie->io.end = range.cpu_addr + range.size - 1;
|
||||
pcie->io.flags = IORESOURCE_MEM;
|
||||
pcie->io.name = "I/O";
|
||||
|
||||
memcpy(&res, &pcie->io, sizeof(res));
|
||||
break;
|
||||
|
||||
case IORESOURCE_MEM:
|
||||
|
@ -161,7 +161,7 @@ static const struct s3c2410_wdt_variant drv_data_exynos5420 = {
|
||||
static const struct s3c2410_wdt_variant drv_data_exynos7 = {
|
||||
.disable_reg = EXYNOS5_WDT_DISABLE_REG_OFFSET,
|
||||
.mask_reset_reg = EXYNOS5_WDT_MASK_RESET_REG_OFFSET,
|
||||
.mask_bit = 0,
|
||||
.mask_bit = 23,
|
||||
.rst_stat_reg = EXYNOS5_RST_STAT_REG_OFFSET,
|
||||
.rst_stat_bit = 23, /* A57 WDTRESET */
|
||||
.quirks = QUIRK_HAS_PMU_CONFIG | QUIRK_HAS_RST_STAT,
|
||||
|
@ -736,7 +736,12 @@ static struct dentry *vfat_lookup(struct inode *dir, struct dentry *dentry,
|
||||
}
|
||||
|
||||
alias = d_find_alias(inode);
|
||||
if (alias && !vfat_d_anon_disconn(alias)) {
|
||||
/*
|
||||
* Checking "alias->d_parent == dentry->d_parent" to make sure
|
||||
* FS is not corrupted (especially double linked dir).
|
||||
*/
|
||||
if (alias && alias->d_parent == dentry->d_parent &&
|
||||
!vfat_d_anon_disconn(alias)) {
|
||||
/*
|
||||
* This inode has non anonymous-DCACHE_DISCONNECTED
|
||||
* dentry. This means, the user did ->lookup() by an
|
||||
@ -755,12 +760,9 @@ static struct dentry *vfat_lookup(struct inode *dir, struct dentry *dentry,
|
||||
|
||||
out:
|
||||
mutex_unlock(&MSDOS_SB(sb)->s_lock);
|
||||
dentry->d_time = dentry->d_parent->d_inode->i_version;
|
||||
dentry = d_splice_alias(inode, dentry);
|
||||
if (dentry)
|
||||
dentry->d_time = dentry->d_parent->d_inode->i_version;
|
||||
return dentry;
|
||||
|
||||
if (!inode)
|
||||
dentry->d_time = dir->i_version;
|
||||
return d_splice_alias(inode, dentry);
|
||||
error:
|
||||
mutex_unlock(&MSDOS_SB(sb)->s_lock);
|
||||
return ERR_PTR(err);
|
||||
@ -793,7 +795,6 @@ static int vfat_create(struct inode *dir, struct dentry *dentry, umode_t mode,
|
||||
inode->i_mtime = inode->i_atime = inode->i_ctime = ts;
|
||||
/* timestamp is already written, so mark_inode_dirty() is unneeded. */
|
||||
|
||||
dentry->d_time = dentry->d_parent->d_inode->i_version;
|
||||
d_instantiate(dentry, inode);
|
||||
out:
|
||||
mutex_unlock(&MSDOS_SB(sb)->s_lock);
|
||||
@ -824,6 +825,7 @@ static int vfat_rmdir(struct inode *dir, struct dentry *dentry)
|
||||
clear_nlink(inode);
|
||||
inode->i_mtime = inode->i_atime = CURRENT_TIME_SEC;
|
||||
fat_detach(inode);
|
||||
dentry->d_time = dir->i_version;
|
||||
out:
|
||||
mutex_unlock(&MSDOS_SB(sb)->s_lock);
|
||||
|
||||
@ -849,6 +851,7 @@ static int vfat_unlink(struct inode *dir, struct dentry *dentry)
|
||||
clear_nlink(inode);
|
||||
inode->i_mtime = inode->i_atime = CURRENT_TIME_SEC;
|
||||
fat_detach(inode);
|
||||
dentry->d_time = dir->i_version;
|
||||
out:
|
||||
mutex_unlock(&MSDOS_SB(sb)->s_lock);
|
||||
|
||||
@ -889,7 +892,6 @@ static int vfat_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)
|
||||
inode->i_mtime = inode->i_atime = inode->i_ctime = ts;
|
||||
/* timestamp is already written, so mark_inode_dirty() is unneeded. */
|
||||
|
||||
dentry->d_time = dentry->d_parent->d_inode->i_version;
|
||||
d_instantiate(dentry, inode);
|
||||
|
||||
mutex_unlock(&MSDOS_SB(sb)->s_lock);
|
||||
|
@ -1853,13 +1853,12 @@ int jbd2_journal_set_features (journal_t *journal, unsigned long compat,
|
||||
journal->j_chksum_driver = NULL;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* Precompute checksum seed for all metadata */
|
||||
if (jbd2_journal_has_csum_v2or3(journal))
|
||||
/* Precompute checksum seed for all metadata */
|
||||
journal->j_csum_seed = jbd2_chksum(journal, ~0,
|
||||
sb->s_uuid,
|
||||
sizeof(sb->s_uuid));
|
||||
}
|
||||
}
|
||||
|
||||
/* If enabling v1 checksums, downgrade superblock */
|
||||
|
@ -141,6 +141,7 @@ struct arizona {
|
||||
|
||||
uint16_t dac_comp_coeff;
|
||||
uint8_t dac_comp_enabled;
|
||||
struct mutex dac_comp_lock;
|
||||
};
|
||||
|
||||
int arizona_clk32k_enable(struct arizona *arizona);
|
||||
|
@ -99,12 +99,6 @@ struct davinci_vcif {
|
||||
dma_addr_t dma_rx_addr;
|
||||
};
|
||||
|
||||
struct cq93vc {
|
||||
struct platform_device *pdev;
|
||||
struct snd_soc_codec *codec;
|
||||
u32 sysclk;
|
||||
};
|
||||
|
||||
struct davinci_vc;
|
||||
|
||||
struct davinci_vc {
|
||||
@ -122,7 +116,6 @@ struct davinci_vc {
|
||||
|
||||
/* Client devices */
|
||||
struct davinci_vcif davinci_vcif;
|
||||
struct cq93vc cq93vc;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
@ -27,6 +27,7 @@ struct samsung_i2s {
|
||||
#define QUIRK_NO_MUXPSR (1 << 2)
|
||||
#define QUIRK_NEED_RSTCLR (1 << 3)
|
||||
#define QUIRK_SUPPORTS_TDM (1 << 4)
|
||||
#define QUIRK_SUPPORTS_IDMA (1 << 5)
|
||||
/* Quirks of the I2S controller */
|
||||
u32 quirks;
|
||||
dma_addr_t idma_addr;
|
||||
|
@ -27,6 +27,7 @@ struct spmi_device;
|
||||
struct regmap;
|
||||
struct regmap_range_cfg;
|
||||
struct regmap_field;
|
||||
struct snd_ac97;
|
||||
|
||||
/* An enum of all the supported cache types */
|
||||
enum regcache_type {
|
||||
@ -340,6 +341,8 @@ struct regmap *regmap_init_spmi_ext(struct spmi_device *dev,
|
||||
struct regmap *regmap_init_mmio_clk(struct device *dev, const char *clk_id,
|
||||
void __iomem *regs,
|
||||
const struct regmap_config *config);
|
||||
struct regmap *regmap_init_ac97(struct snd_ac97 *ac97,
|
||||
const struct regmap_config *config);
|
||||
|
||||
struct regmap *devm_regmap_init(struct device *dev,
|
||||
const struct regmap_bus *bus,
|
||||
@ -356,6 +359,10 @@ struct regmap *devm_regmap_init_spmi_ext(struct spmi_device *dev,
|
||||
struct regmap *devm_regmap_init_mmio_clk(struct device *dev, const char *clk_id,
|
||||
void __iomem *regs,
|
||||
const struct regmap_config *config);
|
||||
struct regmap *devm_regmap_init_ac97(struct snd_ac97 *ac97,
|
||||
const struct regmap_config *config);
|
||||
|
||||
bool regmap_ac97_default_volatile(struct device *dev, unsigned int reg);
|
||||
|
||||
/**
|
||||
* regmap_init_mmio(): Initialise register map
|
||||
|
@ -36,14 +36,14 @@
|
||||
#define RSND_SSI_CLK_PIN_SHARE (1 << 31)
|
||||
#define RSND_SSI_NO_BUSIF (1 << 30) /* SSI+DMA without BUSIF */
|
||||
|
||||
#define RSND_SSI(_dma_id, _pio_irq, _flags) \
|
||||
{ .dma_id = _dma_id, .pio_irq = _pio_irq, .flags = _flags }
|
||||
#define RSND_SSI(_dma_id, _irq, _flags) \
|
||||
{ .dma_id = _dma_id, .irq = _irq, .flags = _flags }
|
||||
#define RSND_SSI_UNUSED \
|
||||
{ .dma_id = -1, .pio_irq = -1, .flags = 0 }
|
||||
{ .dma_id = -1, .irq = -1, .flags = 0 }
|
||||
|
||||
struct rsnd_ssi_platform_info {
|
||||
int dma_id;
|
||||
int pio_irq;
|
||||
int irq;
|
||||
u32 flags;
|
||||
};
|
||||
|
||||
|
@ -23,6 +23,10 @@ struct rt5645_platform_data {
|
||||
|
||||
unsigned int hp_det_gpio;
|
||||
bool gpio_hp_det_active_high;
|
||||
|
||||
/* true if codec's jd function is used */
|
||||
bool en_jd_func;
|
||||
unsigned int jd_mode;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
@ -27,6 +27,16 @@ struct rt5677_platform_data {
|
||||
bool lout3_diff;
|
||||
/* DMIC2 clock source selection */
|
||||
enum rt5677_dmic2_clk dmic2_clk_pin;
|
||||
|
||||
/* configures GPIO, 0 - floating, 1 - pulldown, 2 - pullup */
|
||||
u8 gpio_config[6];
|
||||
|
||||
/* jd1 can select 0 ~ 3 as OFF, GPIO1, GPIO2 and GPIO3 respectively */
|
||||
unsigned int jd1_gpio;
|
||||
/* jd2 and jd3 can select 0 ~ 3 as
|
||||
OFF, GPIO4, GPIO5 and GPIO6 respectively */
|
||||
unsigned int jd2_gpio;
|
||||
unsigned int jd3_gpio;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
@ -206,7 +206,6 @@ struct snd_soc_dai_driver {
|
||||
/* DAI description */
|
||||
const char *name;
|
||||
unsigned int id;
|
||||
int ac97_control;
|
||||
unsigned int base;
|
||||
|
||||
/* DAI driver callbacks */
|
||||
@ -216,6 +215,8 @@ struct snd_soc_dai_driver {
|
||||
int (*resume)(struct snd_soc_dai *dai);
|
||||
/* compress dai */
|
||||
bool compress_dai;
|
||||
/* DAI is also used for the control bus */
|
||||
bool bus_control;
|
||||
|
||||
/* ops */
|
||||
const struct snd_soc_dai_ops *ops;
|
||||
@ -241,7 +242,6 @@ struct snd_soc_dai {
|
||||
const char *name;
|
||||
int id;
|
||||
struct device *dev;
|
||||
void *ac97_pdata; /* platform_data for the ac97 codec */
|
||||
|
||||
/* driver ops */
|
||||
struct snd_soc_dai_driver *driver;
|
||||
@ -268,7 +268,6 @@ struct snd_soc_dai {
|
||||
unsigned int sample_bits;
|
||||
|
||||
/* parent platform/codec */
|
||||
struct snd_soc_platform *platform;
|
||||
struct snd_soc_codec *codec;
|
||||
struct snd_soc_component *component;
|
||||
|
||||
@ -276,8 +275,6 @@ struct snd_soc_dai {
|
||||
unsigned int tx_mask;
|
||||
unsigned int rx_mask;
|
||||
|
||||
struct snd_soc_card *card;
|
||||
|
||||
struct list_head list;
|
||||
};
|
||||
|
||||
|
@ -435,7 +435,7 @@ void snd_soc_dapm_auto_nc_pins(struct snd_soc_card *card);
|
||||
unsigned int dapm_kcontrol_get_value(const struct snd_kcontrol *kcontrol);
|
||||
|
||||
/* Mostly internal - should not normally be used */
|
||||
void dapm_mark_io_dirty(struct snd_soc_dapm_context *dapm);
|
||||
void dapm_mark_endpoints_dirty(struct snd_soc_card *card);
|
||||
|
||||
/* dapm path query */
|
||||
int snd_soc_dapm_dai_get_connected_widgets(struct snd_soc_dai *dai, int stream,
|
||||
@ -508,9 +508,9 @@ struct snd_soc_dapm_path {
|
||||
|
||||
/* status */
|
||||
u32 connect:1; /* source and sink widgets are connected */
|
||||
u32 walked:1; /* path has been walked */
|
||||
u32 walking:1; /* path is in the process of being walked */
|
||||
u32 weak:1; /* path ignored for power management */
|
||||
u32 is_supply:1; /* At least one of the connected widgets is a supply */
|
||||
|
||||
int (*connected)(struct snd_soc_dapm_widget *source,
|
||||
struct snd_soc_dapm_widget *sink);
|
||||
@ -544,11 +544,13 @@ struct snd_soc_dapm_widget {
|
||||
unsigned char active:1; /* active stream on DAC, ADC's */
|
||||
unsigned char connected:1; /* connected codec pin */
|
||||
unsigned char new:1; /* cnew complete */
|
||||
unsigned char ext:1; /* has external widgets */
|
||||
unsigned char force:1; /* force state */
|
||||
unsigned char ignore_suspend:1; /* kept enabled over suspend */
|
||||
unsigned char new_power:1; /* power from this run */
|
||||
unsigned char power_checked:1; /* power checked this run */
|
||||
unsigned char is_supply:1; /* Widget is a supply type widget */
|
||||
unsigned char is_sink:1; /* Widget is a sink type widget */
|
||||
unsigned char is_source:1; /* Widget is a source type widget */
|
||||
int subseq; /* sort within widget type */
|
||||
|
||||
int (*power_check)(struct snd_soc_dapm_widget *w);
|
||||
@ -567,6 +569,7 @@ struct snd_soc_dapm_widget {
|
||||
struct list_head sinks;
|
||||
|
||||
/* used during DAPM updates */
|
||||
struct list_head work_list;
|
||||
struct list_head power_list;
|
||||
struct list_head dirty;
|
||||
int inputs;
|
||||
|
@ -36,6 +36,11 @@
|
||||
{.reg = xreg, .rreg = xreg, .shift = shift_left, \
|
||||
.rshift = shift_right, .max = xmax, .platform_max = xmax, \
|
||||
.invert = xinvert, .autodisable = xautodisable})
|
||||
#define SOC_DOUBLE_S_VALUE(xreg, shift_left, shift_right, xmin, xmax, xsign_bit, xinvert, xautodisable) \
|
||||
((unsigned long)&(struct soc_mixer_control) \
|
||||
{.reg = xreg, .rreg = xreg, .shift = shift_left, \
|
||||
.rshift = shift_right, .min = xmin, .max = xmax, .platform_max = xmax, \
|
||||
.sign_bit = xsign_bit, .invert = xinvert, .autodisable = xautodisable})
|
||||
#define SOC_SINGLE_VALUE(xreg, xshift, xmax, xinvert, xautodisable) \
|
||||
SOC_DOUBLE_VALUE(xreg, xshift, xshift, xmax, xinvert, xautodisable)
|
||||
#define SOC_SINGLE_VALUE_EXT(xreg, xmax, xinvert) \
|
||||
@ -171,11 +176,9 @@
|
||||
.access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | \
|
||||
SNDRV_CTL_ELEM_ACCESS_READWRITE, \
|
||||
.tlv.p = (tlv_array), \
|
||||
.info = snd_soc_info_volsw_s8, .get = snd_soc_get_volsw_s8, \
|
||||
.put = snd_soc_put_volsw_s8, \
|
||||
.private_value = (unsigned long)&(struct soc_mixer_control) \
|
||||
{.reg = xreg, .min = xmin, .max = xmax, \
|
||||
.platform_max = xmax} }
|
||||
.info = snd_soc_info_volsw, .get = snd_soc_get_volsw,\
|
||||
.put = snd_soc_put_volsw, \
|
||||
.private_value = SOC_DOUBLE_S_VALUE(xreg, 0, 8, xmin, xmax, 7, 0, 0) }
|
||||
#define SOC_ENUM_DOUBLE(xreg, xshift_l, xshift_r, xitems, xtexts) \
|
||||
{ .reg = xreg, .shift_l = xshift_l, .shift_r = xshift_r, \
|
||||
.items = xitems, .texts = xtexts, \
|
||||
@ -366,8 +369,6 @@ struct snd_soc_jack_gpio;
|
||||
|
||||
typedef int (*hw_write_t)(void *,const char* ,int);
|
||||
|
||||
extern struct snd_ac97_bus_ops *soc_ac97_ops;
|
||||
|
||||
enum snd_soc_pcm_subclass {
|
||||
SND_SOC_PCM_CLASS_PCM = 0,
|
||||
SND_SOC_PCM_CLASS_BE = 1,
|
||||
@ -409,13 +410,9 @@ int devm_snd_soc_register_component(struct device *dev,
|
||||
const struct snd_soc_component_driver *cmpnt_drv,
|
||||
struct snd_soc_dai_driver *dai_drv, int num_dai);
|
||||
void snd_soc_unregister_component(struct device *dev);
|
||||
int snd_soc_cache_sync(struct snd_soc_codec *codec);
|
||||
int snd_soc_cache_init(struct snd_soc_codec *codec);
|
||||
int snd_soc_cache_exit(struct snd_soc_codec *codec);
|
||||
int snd_soc_cache_write(struct snd_soc_codec *codec,
|
||||
unsigned int reg, unsigned int value);
|
||||
int snd_soc_cache_read(struct snd_soc_codec *codec,
|
||||
unsigned int reg, unsigned int *value);
|
||||
|
||||
int snd_soc_platform_read(struct snd_soc_platform *platform,
|
||||
unsigned int reg);
|
||||
int snd_soc_platform_write(struct snd_soc_platform *platform,
|
||||
@ -500,14 +497,28 @@ int snd_soc_update_bits_locked(struct snd_soc_codec *codec,
|
||||
int snd_soc_test_bits(struct snd_soc_codec *codec, unsigned int reg,
|
||||
unsigned int mask, unsigned int value);
|
||||
|
||||
int snd_soc_new_ac97_codec(struct snd_soc_codec *codec,
|
||||
struct snd_ac97_bus_ops *ops, int num);
|
||||
void snd_soc_free_ac97_codec(struct snd_soc_codec *codec);
|
||||
#ifdef CONFIG_SND_SOC_AC97_BUS
|
||||
struct snd_ac97 *snd_soc_new_ac97_codec(struct snd_soc_codec *codec);
|
||||
void snd_soc_free_ac97_codec(struct snd_ac97 *ac97);
|
||||
|
||||
int snd_soc_set_ac97_ops(struct snd_ac97_bus_ops *ops);
|
||||
int snd_soc_set_ac97_ops_of_reset(struct snd_ac97_bus_ops *ops,
|
||||
struct platform_device *pdev);
|
||||
|
||||
extern struct snd_ac97_bus_ops *soc_ac97_ops;
|
||||
#else
|
||||
static inline int snd_soc_set_ac97_ops_of_reset(struct snd_ac97_bus_ops *ops,
|
||||
struct platform_device *pdev)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int snd_soc_set_ac97_ops(struct snd_ac97_bus_ops *ops)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
*Controls
|
||||
*/
|
||||
@ -545,12 +556,6 @@ int snd_soc_get_volsw_sx(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol);
|
||||
int snd_soc_put_volsw_sx(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol);
|
||||
int snd_soc_info_volsw_s8(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_info *uinfo);
|
||||
int snd_soc_get_volsw_s8(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol);
|
||||
int snd_soc_put_volsw_s8(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol);
|
||||
int snd_soc_info_volsw_range(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_info *uinfo);
|
||||
int snd_soc_put_volsw_range(struct snd_kcontrol *kcontrol,
|
||||
@ -780,24 +785,18 @@ struct snd_soc_codec {
|
||||
struct device *dev;
|
||||
const struct snd_soc_codec_driver *driver;
|
||||
|
||||
struct mutex mutex;
|
||||
struct list_head list;
|
||||
struct list_head card_list;
|
||||
|
||||
/* runtime */
|
||||
struct snd_ac97 *ac97; /* for ad-hoc ac97 devices */
|
||||
unsigned int cache_bypass:1; /* Suppress access to the cache */
|
||||
unsigned int suspended:1; /* Codec is in suspend PM state */
|
||||
unsigned int ac97_registered:1; /* Codec has been AC97 registered */
|
||||
unsigned int ac97_created:1; /* Codec has been created by SoC */
|
||||
unsigned int cache_init:1; /* codec cache has been initialized */
|
||||
u32 cache_sync; /* Cache needs to be synced to hardware */
|
||||
|
||||
/* codec IO */
|
||||
void *control_data; /* codec control (i2c/3wire) data */
|
||||
hw_write_t hw_write;
|
||||
void *reg_cache;
|
||||
struct mutex cache_rw_mutex;
|
||||
|
||||
/* component */
|
||||
struct snd_soc_component component;
|
||||
@ -860,8 +859,6 @@ struct snd_soc_platform_driver {
|
||||
|
||||
int (*probe)(struct snd_soc_platform *);
|
||||
int (*remove)(struct snd_soc_platform *);
|
||||
int (*suspend)(struct snd_soc_dai *dai);
|
||||
int (*resume)(struct snd_soc_dai *dai);
|
||||
struct snd_soc_component_driver component_driver;
|
||||
|
||||
/* pcm creation and destruction */
|
||||
@ -886,7 +883,7 @@ struct snd_soc_platform_driver {
|
||||
|
||||
struct snd_soc_dai_link_component {
|
||||
const char *name;
|
||||
const struct device_node *of_node;
|
||||
struct device_node *of_node;
|
||||
const char *dai_name;
|
||||
};
|
||||
|
||||
@ -894,8 +891,6 @@ struct snd_soc_platform {
|
||||
struct device *dev;
|
||||
const struct snd_soc_platform_driver *driver;
|
||||
|
||||
unsigned int suspended:1; /* platform is suspended */
|
||||
|
||||
struct list_head list;
|
||||
|
||||
struct snd_soc_component component;
|
||||
@ -990,7 +985,7 @@ struct snd_soc_codec_conf {
|
||||
* DT/OF node, but not both.
|
||||
*/
|
||||
const char *dev_name;
|
||||
const struct device_node *of_node;
|
||||
struct device_node *of_node;
|
||||
|
||||
/*
|
||||
* optional map of kcontrol, widget and path name prefixes that are
|
||||
@ -1007,7 +1002,7 @@ struct snd_soc_aux_dev {
|
||||
* DT/OF node, but not both.
|
||||
*/
|
||||
const char *codec_name;
|
||||
const struct device_node *codec_of_node;
|
||||
struct device_node *codec_of_node;
|
||||
|
||||
/* codec/machine specific init - e.g. add machine controls */
|
||||
int (*init)(struct snd_soc_component *component);
|
||||
@ -1264,6 +1259,17 @@ unsigned int snd_soc_read(struct snd_soc_codec *codec, unsigned int reg);
|
||||
int snd_soc_write(struct snd_soc_codec *codec, unsigned int reg,
|
||||
unsigned int val);
|
||||
|
||||
/**
|
||||
* snd_soc_cache_sync() - Sync the register cache with the hardware
|
||||
* @codec: CODEC to sync
|
||||
*
|
||||
* Note: This function will call regcache_sync()
|
||||
*/
|
||||
static inline int snd_soc_cache_sync(struct snd_soc_codec *codec)
|
||||
{
|
||||
return regcache_sync(codec->component.regmap);
|
||||
}
|
||||
|
||||
/* component IO */
|
||||
int snd_soc_component_read(struct snd_soc_component *component,
|
||||
unsigned int reg, unsigned int *val);
|
||||
@ -1277,6 +1283,45 @@ void snd_soc_component_async_complete(struct snd_soc_component *component);
|
||||
int snd_soc_component_test_bits(struct snd_soc_component *component,
|
||||
unsigned int reg, unsigned int mask, unsigned int value);
|
||||
|
||||
#ifdef CONFIG_REGMAP
|
||||
|
||||
void snd_soc_component_init_regmap(struct snd_soc_component *component,
|
||||
struct regmap *regmap);
|
||||
void snd_soc_component_exit_regmap(struct snd_soc_component *component);
|
||||
|
||||
/**
|
||||
* snd_soc_codec_init_regmap() - Initialize regmap instance for the CODEC
|
||||
* @codec: The CODEC for which to initialize the regmap instance
|
||||
* @regmap: The regmap instance that should be used by the CODEC
|
||||
*
|
||||
* This function allows deferred assignment of the regmap instance that is
|
||||
* associated with the CODEC. Only use this if the regmap instance is not yet
|
||||
* ready when the CODEC is registered. The function must also be called before
|
||||
* the first IO attempt of the CODEC.
|
||||
*/
|
||||
static inline void snd_soc_codec_init_regmap(struct snd_soc_codec *codec,
|
||||
struct regmap *regmap)
|
||||
{
|
||||
snd_soc_component_init_regmap(&codec->component, regmap);
|
||||
}
|
||||
|
||||
/**
|
||||
* snd_soc_codec_exit_regmap() - De-initialize regmap instance for the CODEC
|
||||
* @codec: The CODEC for which to de-initialize the regmap instance
|
||||
*
|
||||
* Calls regmap_exit() on the regmap instance associated to the CODEC and
|
||||
* removes the regmap instance from the CODEC.
|
||||
*
|
||||
* This function should only be used if snd_soc_codec_init_regmap() was used to
|
||||
* initialize the regmap instance.
|
||||
*/
|
||||
static inline void snd_soc_codec_exit_regmap(struct snd_soc_codec *codec)
|
||||
{
|
||||
snd_soc_component_exit_regmap(&codec->component);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/* device driver data */
|
||||
|
||||
static inline void snd_soc_card_set_drvdata(struct snd_soc_card *card,
|
||||
@ -1451,6 +1496,9 @@ unsigned int snd_soc_of_parse_daifmt(struct device_node *np,
|
||||
struct device_node **framemaster);
|
||||
int snd_soc_of_get_dai_name(struct device_node *of_node,
|
||||
const char **dai_name);
|
||||
int snd_soc_of_get_dai_link_codecs(struct device *dev,
|
||||
struct device_node *of_node,
|
||||
struct snd_soc_dai_link *dai_link);
|
||||
|
||||
#include <sound/soc-dai.h>
|
||||
|
||||
|
@ -18,18 +18,6 @@ struct uda134x_platform_data {
|
||||
struct l3_pins l3;
|
||||
void (*power) (int);
|
||||
int model;
|
||||
/*
|
||||
ALSA SOC usually puts the device in standby mode when it's not used
|
||||
for sometime. If you unset is_powered_on_standby the driver will
|
||||
turn off the ADC/DAC when this callback is invoked and turn it back
|
||||
on when needed. Unfortunately this will result in a very light bump
|
||||
(it can be audible only with good earphones). If this bothers you
|
||||
set is_powered_on_standby, you will have slightly higher power
|
||||
consumption. Please note that sending the L3 command for ADC is
|
||||
enough to make the bump, so it doesn't make difference if you
|
||||
completely take off power from the codec.
|
||||
*/
|
||||
int is_powered_on_standby;
|
||||
#define UDA134X_UDA1340 1
|
||||
#define UDA134X_UDA1341 2
|
||||
#define UDA134X_UDA1344 3
|
||||
|
@ -288,31 +288,6 @@ TRACE_EVENT(snd_soc_jack_notify,
|
||||
TP_printk("jack=%s %x", __get_str(name), (int)__entry->val)
|
||||
);
|
||||
|
||||
TRACE_EVENT(snd_soc_cache_sync,
|
||||
|
||||
TP_PROTO(struct snd_soc_codec *codec, const char *type,
|
||||
const char *status),
|
||||
|
||||
TP_ARGS(codec, type, status),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__string( name, codec->component.name)
|
||||
__string( status, status )
|
||||
__string( type, type )
|
||||
__field( int, id )
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__assign_str(name, codec->component.name);
|
||||
__assign_str(status, status);
|
||||
__assign_str(type, type);
|
||||
__entry->id = codec->component.id;
|
||||
),
|
||||
|
||||
TP_printk("codec=%s.%d type=%s status=%s", __get_str(name),
|
||||
(int)__entry->id, __get_str(type), __get_str(status))
|
||||
);
|
||||
|
||||
#endif /* _TRACE_ASOC_H */
|
||||
|
||||
/* This part must be outside protection */
|
||||
|
@ -427,7 +427,7 @@ header-y += virtio_net.h
|
||||
header-y += virtio_pci.h
|
||||
header-y += virtio_ring.h
|
||||
header-y += virtio_rng.h
|
||||
header=y += vm_sockets.h
|
||||
header-y += vm_sockets.h
|
||||
header-y += vt.h
|
||||
header-y += wait.h
|
||||
header-y += wanrouter.h
|
||||
|
15
ipc/sem.c
15
ipc/sem.c
@ -507,13 +507,6 @@ static int newary(struct ipc_namespace *ns, struct ipc_params *params)
|
||||
return retval;
|
||||
}
|
||||
|
||||
id = ipc_addid(&sem_ids(ns), &sma->sem_perm, ns->sc_semmni);
|
||||
if (id < 0) {
|
||||
ipc_rcu_putref(sma, sem_rcu_free);
|
||||
return id;
|
||||
}
|
||||
ns->used_sems += nsems;
|
||||
|
||||
sma->sem_base = (struct sem *) &sma[1];
|
||||
|
||||
for (i = 0; i < nsems; i++) {
|
||||
@ -528,6 +521,14 @@ static int newary(struct ipc_namespace *ns, struct ipc_params *params)
|
||||
INIT_LIST_HEAD(&sma->list_id);
|
||||
sma->sem_nsems = nsems;
|
||||
sma->sem_ctime = get_seconds();
|
||||
|
||||
id = ipc_addid(&sem_ids(ns), &sma->sem_perm, ns->sc_semmni);
|
||||
if (id < 0) {
|
||||
ipc_rcu_putref(sma, sem_rcu_free);
|
||||
return id;
|
||||
}
|
||||
ns->used_sems += nsems;
|
||||
|
||||
sem_unlock(sma, -1);
|
||||
rcu_read_unlock();
|
||||
|
||||
|
@ -2874,10 +2874,14 @@ asmlinkage __visible void __sched schedule_user(void)
|
||||
* or we have been woken up remotely but the IPI has not yet arrived,
|
||||
* we haven't yet exited the RCU idle mode. Do it here manually until
|
||||
* we find a better solution.
|
||||
*
|
||||
* NB: There are buggy callers of this function. Ideally we
|
||||
* should warn if prev_state != IN_USER, but that will trigger
|
||||
* too frequently to make sense yet.
|
||||
*/
|
||||
user_exit();
|
||||
enum ctx_state prev_state = exception_enter();
|
||||
schedule();
|
||||
user_enter();
|
||||
exception_exit(prev_state);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -598,6 +598,7 @@ struct gen_pool *devm_gen_pool_create(struct device *dev, int min_alloc_order,
|
||||
|
||||
return pool;
|
||||
}
|
||||
EXPORT_SYMBOL(devm_gen_pool_create);
|
||||
|
||||
/**
|
||||
* dev_get_gen_pool - Obtain the gen_pool (if any) for a device
|
||||
|
@ -28,7 +28,7 @@ void show_mem(unsigned int filter)
|
||||
continue;
|
||||
|
||||
total += zone->present_pages;
|
||||
reserved = zone->present_pages - zone->managed_pages;
|
||||
reserved += zone->present_pages - zone->managed_pages;
|
||||
|
||||
if (is_highmem_idx(zoneid))
|
||||
highmem += zone->present_pages;
|
||||
|
@ -244,8 +244,10 @@ int __frontswap_store(struct page *page)
|
||||
the (older) page from frontswap
|
||||
*/
|
||||
inc_frontswap_failed_stores();
|
||||
if (dup)
|
||||
if (dup) {
|
||||
__frontswap_clear(sis, offset);
|
||||
frontswap_ops->invalidate_page(type, offset);
|
||||
}
|
||||
}
|
||||
if (frontswap_writethrough_enabled)
|
||||
/* report failure so swap also writes to swap device */
|
||||
|
24
mm/memory.c
24
mm/memory.c
@ -815,20 +815,20 @@ copy_one_pte(struct mm_struct *dst_mm, struct mm_struct *src_mm,
|
||||
if (!pte_file(pte)) {
|
||||
swp_entry_t entry = pte_to_swp_entry(pte);
|
||||
|
||||
if (swap_duplicate(entry) < 0)
|
||||
return entry.val;
|
||||
if (likely(!non_swap_entry(entry))) {
|
||||
if (swap_duplicate(entry) < 0)
|
||||
return entry.val;
|
||||
|
||||
/* make sure dst_mm is on swapoff's mmlist. */
|
||||
if (unlikely(list_empty(&dst_mm->mmlist))) {
|
||||
spin_lock(&mmlist_lock);
|
||||
if (list_empty(&dst_mm->mmlist))
|
||||
list_add(&dst_mm->mmlist,
|
||||
&src_mm->mmlist);
|
||||
spin_unlock(&mmlist_lock);
|
||||
}
|
||||
if (likely(!non_swap_entry(entry)))
|
||||
/* make sure dst_mm is on swapoff's mmlist. */
|
||||
if (unlikely(list_empty(&dst_mm->mmlist))) {
|
||||
spin_lock(&mmlist_lock);
|
||||
if (list_empty(&dst_mm->mmlist))
|
||||
list_add(&dst_mm->mmlist,
|
||||
&src_mm->mmlist);
|
||||
spin_unlock(&mmlist_lock);
|
||||
}
|
||||
rss[MM_SWAPENTS]++;
|
||||
else if (is_migration_entry(entry)) {
|
||||
} else if (is_migration_entry(entry)) {
|
||||
page = migration_entry_to_page(entry);
|
||||
|
||||
if (PageAnon(page))
|
||||
|
10
mm/mmap.c
10
mm/mmap.c
@ -776,8 +776,11 @@ again: remove_next = 1 + (end > next->vm_end);
|
||||
* shrinking vma had, to cover any anon pages imported.
|
||||
*/
|
||||
if (exporter && exporter->anon_vma && !importer->anon_vma) {
|
||||
if (anon_vma_clone(importer, exporter))
|
||||
return -ENOMEM;
|
||||
int error;
|
||||
|
||||
error = anon_vma_clone(importer, exporter);
|
||||
if (error)
|
||||
return error;
|
||||
importer->anon_vma = exporter->anon_vma;
|
||||
}
|
||||
}
|
||||
@ -2469,7 +2472,8 @@ static int __split_vma(struct mm_struct *mm, struct vm_area_struct *vma,
|
||||
if (err)
|
||||
goto out_free_vma;
|
||||
|
||||
if (anon_vma_clone(new, vma))
|
||||
err = anon_vma_clone(new, vma);
|
||||
if (err)
|
||||
goto out_free_mpol;
|
||||
|
||||
if (new->vm_file)
|
||||
|
@ -274,6 +274,7 @@ int anon_vma_fork(struct vm_area_struct *vma, struct vm_area_struct *pvma)
|
||||
{
|
||||
struct anon_vma_chain *avc;
|
||||
struct anon_vma *anon_vma;
|
||||
int error;
|
||||
|
||||
/* Don't bother if the parent process has no anon_vma here. */
|
||||
if (!pvma->anon_vma)
|
||||
@ -283,8 +284,9 @@ int anon_vma_fork(struct vm_area_struct *vma, struct vm_area_struct *pvma)
|
||||
* First, attach the new VMA to the parent VMA's anon_vmas,
|
||||
* so rmap can find non-COWed pages in child processes.
|
||||
*/
|
||||
if (anon_vma_clone(vma, pvma))
|
||||
return -ENOMEM;
|
||||
error = anon_vma_clone(vma, pvma);
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
/* Then add our own anon_vma. */
|
||||
anon_vma = anon_vma_alloc();
|
||||
|
@ -3076,7 +3076,7 @@ static void *____cache_alloc_node(struct kmem_cache *cachep, gfp_t flags,
|
||||
void *obj;
|
||||
int x;
|
||||
|
||||
VM_BUG_ON(nodeid > num_online_nodes());
|
||||
VM_BUG_ON(nodeid < 0 || nodeid >= MAX_NUMNODES);
|
||||
n = get_node(cachep, nodeid);
|
||||
BUG_ON(!n);
|
||||
|
||||
|
@ -165,6 +165,7 @@ static void vmpressure_work_fn(struct work_struct *work)
|
||||
unsigned long scanned;
|
||||
unsigned long reclaimed;
|
||||
|
||||
spin_lock(&vmpr->sr_lock);
|
||||
/*
|
||||
* Several contexts might be calling vmpressure(), so it is
|
||||
* possible that the work was rescheduled again before the old
|
||||
@ -173,11 +174,12 @@ static void vmpressure_work_fn(struct work_struct *work)
|
||||
* here. No need for any locks here since we don't care if
|
||||
* vmpr->reclaimed is in sync.
|
||||
*/
|
||||
if (!vmpr->scanned)
|
||||
return;
|
||||
|
||||
spin_lock(&vmpr->sr_lock);
|
||||
scanned = vmpr->scanned;
|
||||
if (!scanned) {
|
||||
spin_unlock(&vmpr->sr_lock);
|
||||
return;
|
||||
}
|
||||
|
||||
reclaimed = vmpr->reclaimed;
|
||||
vmpr->scanned = 0;
|
||||
vmpr->reclaimed = 0;
|
||||
|
@ -1498,6 +1498,7 @@ static int do_setlink(const struct sk_buff *skb,
|
||||
goto errout;
|
||||
}
|
||||
if (!netlink_ns_capable(skb, net->user_ns, CAP_NET_ADMIN)) {
|
||||
put_net(net);
|
||||
err = -EPERM;
|
||||
goto errout;
|
||||
}
|
||||
|
@ -117,6 +117,7 @@ struct keyring_search_context {
|
||||
#define KEYRING_SEARCH_NO_UPDATE_TIME 0x0004 /* Don't update times */
|
||||
#define KEYRING_SEARCH_NO_CHECK_PERM 0x0008 /* Don't check permissions */
|
||||
#define KEYRING_SEARCH_DETECT_TOO_DEEP 0x0010 /* Give an error on excessive depth */
|
||||
#define KEYRING_SEARCH_SKIP_EXPIRED 0x0020 /* Ignore expired keys (intention to replace) */
|
||||
|
||||
int (*iterator)(const void *object, void *iterator_data);
|
||||
|
||||
|
@ -26,6 +26,8 @@
|
||||
#include <asm/uaccess.h>
|
||||
#include "internal.h"
|
||||
|
||||
#define KEY_MAX_DESC_SIZE 4096
|
||||
|
||||
static int key_get_type_from_user(char *type,
|
||||
const char __user *_type,
|
||||
unsigned len)
|
||||
@ -78,7 +80,7 @@ SYSCALL_DEFINE5(add_key, const char __user *, _type,
|
||||
|
||||
description = NULL;
|
||||
if (_description) {
|
||||
description = strndup_user(_description, PAGE_SIZE);
|
||||
description = strndup_user(_description, KEY_MAX_DESC_SIZE);
|
||||
if (IS_ERR(description)) {
|
||||
ret = PTR_ERR(description);
|
||||
goto error;
|
||||
@ -177,7 +179,7 @@ SYSCALL_DEFINE4(request_key, const char __user *, _type,
|
||||
goto error;
|
||||
|
||||
/* pull the description into kernel space */
|
||||
description = strndup_user(_description, PAGE_SIZE);
|
||||
description = strndup_user(_description, KEY_MAX_DESC_SIZE);
|
||||
if (IS_ERR(description)) {
|
||||
ret = PTR_ERR(description);
|
||||
goto error;
|
||||
@ -287,7 +289,7 @@ long keyctl_join_session_keyring(const char __user *_name)
|
||||
/* fetch the name from userspace */
|
||||
name = NULL;
|
||||
if (_name) {
|
||||
name = strndup_user(_name, PAGE_SIZE);
|
||||
name = strndup_user(_name, KEY_MAX_DESC_SIZE);
|
||||
if (IS_ERR(name)) {
|
||||
ret = PTR_ERR(name);
|
||||
goto error;
|
||||
@ -562,8 +564,9 @@ long keyctl_describe_key(key_serial_t keyid,
|
||||
{
|
||||
struct key *key, *instkey;
|
||||
key_ref_t key_ref;
|
||||
char *tmpbuf;
|
||||
char *infobuf;
|
||||
long ret;
|
||||
int desclen, infolen;
|
||||
|
||||
key_ref = lookup_user_key(keyid, KEY_LOOKUP_PARTIAL, KEY_NEED_VIEW);
|
||||
if (IS_ERR(key_ref)) {
|
||||
@ -586,38 +589,31 @@ long keyctl_describe_key(key_serial_t keyid,
|
||||
}
|
||||
|
||||
okay:
|
||||
/* calculate how much description we're going to return */
|
||||
ret = -ENOMEM;
|
||||
tmpbuf = kmalloc(PAGE_SIZE, GFP_KERNEL);
|
||||
if (!tmpbuf)
|
||||
goto error2;
|
||||
|
||||
key = key_ref_to_ptr(key_ref);
|
||||
desclen = strlen(key->description);
|
||||
|
||||
ret = snprintf(tmpbuf, PAGE_SIZE - 1,
|
||||
"%s;%d;%d;%08x;%s",
|
||||
key->type->name,
|
||||
from_kuid_munged(current_user_ns(), key->uid),
|
||||
from_kgid_munged(current_user_ns(), key->gid),
|
||||
key->perm,
|
||||
key->description ?: "");
|
||||
|
||||
/* include a NUL char at the end of the data */
|
||||
if (ret > PAGE_SIZE - 1)
|
||||
ret = PAGE_SIZE - 1;
|
||||
tmpbuf[ret] = 0;
|
||||
ret++;
|
||||
/* calculate how much information we're going to return */
|
||||
ret = -ENOMEM;
|
||||
infobuf = kasprintf(GFP_KERNEL,
|
||||
"%s;%d;%d;%08x;",
|
||||
key->type->name,
|
||||
from_kuid_munged(current_user_ns(), key->uid),
|
||||
from_kgid_munged(current_user_ns(), key->gid),
|
||||
key->perm);
|
||||
if (!infobuf)
|
||||
goto error2;
|
||||
infolen = strlen(infobuf);
|
||||
ret = infolen + desclen + 1;
|
||||
|
||||
/* consider returning the data */
|
||||
if (buffer && buflen > 0) {
|
||||
if (buflen > ret)
|
||||
buflen = ret;
|
||||
|
||||
if (copy_to_user(buffer, tmpbuf, buflen) != 0)
|
||||
if (buffer && buflen >= ret) {
|
||||
if (copy_to_user(buffer, infobuf, infolen) != 0 ||
|
||||
copy_to_user(buffer + infolen, key->description,
|
||||
desclen + 1) != 0)
|
||||
ret = -EFAULT;
|
||||
}
|
||||
|
||||
kfree(tmpbuf);
|
||||
kfree(infobuf);
|
||||
error2:
|
||||
key_ref_put(key_ref);
|
||||
error:
|
||||
@ -649,7 +645,7 @@ long keyctl_keyring_search(key_serial_t ringid,
|
||||
if (ret < 0)
|
||||
goto error;
|
||||
|
||||
description = strndup_user(_description, PAGE_SIZE);
|
||||
description = strndup_user(_description, KEY_MAX_DESC_SIZE);
|
||||
if (IS_ERR(description)) {
|
||||
ret = PTR_ERR(description);
|
||||
goto error;
|
||||
|
@ -546,7 +546,8 @@ static int keyring_search_iterator(const void *object, void *iterator_data)
|
||||
}
|
||||
|
||||
if (key->expiry && ctx->now.tv_sec >= key->expiry) {
|
||||
ctx->result = ERR_PTR(-EKEYEXPIRED);
|
||||
if (!(ctx->flags & KEYRING_SEARCH_SKIP_EXPIRED))
|
||||
ctx->result = ERR_PTR(-EKEYEXPIRED);
|
||||
kleave(" = %d [expire]", ctx->skipped_ret);
|
||||
goto skipped;
|
||||
}
|
||||
@ -628,6 +629,10 @@ static bool search_nested_keyrings(struct key *keyring,
|
||||
ctx->index_key.type->name,
|
||||
ctx->index_key.description);
|
||||
|
||||
#define STATE_CHECKS (KEYRING_SEARCH_NO_STATE_CHECK | KEYRING_SEARCH_DO_STATE_CHECK)
|
||||
BUG_ON((ctx->flags & STATE_CHECKS) == 0 ||
|
||||
(ctx->flags & STATE_CHECKS) == STATE_CHECKS);
|
||||
|
||||
if (ctx->index_key.description)
|
||||
ctx->index_key.desc_len = strlen(ctx->index_key.description);
|
||||
|
||||
@ -637,7 +642,6 @@ static bool search_nested_keyrings(struct key *keyring,
|
||||
if (ctx->match_data.lookup_type == KEYRING_SEARCH_LOOKUP_ITERATE ||
|
||||
keyring_compare_object(keyring, &ctx->index_key)) {
|
||||
ctx->skipped_ret = 2;
|
||||
ctx->flags |= KEYRING_SEARCH_DO_STATE_CHECK;
|
||||
switch (ctx->iterator(keyring_key_to_ptr(keyring), ctx)) {
|
||||
case 1:
|
||||
goto found;
|
||||
@ -649,8 +653,6 @@ static bool search_nested_keyrings(struct key *keyring,
|
||||
}
|
||||
|
||||
ctx->skipped_ret = 0;
|
||||
if (ctx->flags & KEYRING_SEARCH_NO_STATE_CHECK)
|
||||
ctx->flags &= ~KEYRING_SEARCH_DO_STATE_CHECK;
|
||||
|
||||
/* Start processing a new keyring */
|
||||
descend_to_keyring:
|
||||
|
@ -516,6 +516,8 @@ struct key *request_key_and_link(struct key_type *type,
|
||||
.match_data.cmp = key_default_cmp,
|
||||
.match_data.raw_data = description,
|
||||
.match_data.lookup_type = KEYRING_SEARCH_LOOKUP_DIRECT,
|
||||
.flags = (KEYRING_SEARCH_DO_STATE_CHECK |
|
||||
KEYRING_SEARCH_SKIP_EXPIRED),
|
||||
};
|
||||
struct key *key;
|
||||
key_ref_t key_ref;
|
||||
|
@ -249,6 +249,7 @@ struct key *key_get_instantiation_authkey(key_serial_t target_id)
|
||||
.match_data.cmp = key_default_cmp,
|
||||
.match_data.raw_data = description,
|
||||
.match_data.lookup_type = KEYRING_SEARCH_LOOKUP_DIRECT,
|
||||
.flags = KEYRING_SEARCH_DO_STATE_CHECK,
|
||||
};
|
||||
struct key *authkey;
|
||||
key_ref_t authkey_ref;
|
||||
|
@ -1,10 +1,14 @@
|
||||
snd-soc-core-objs := soc-core.o soc-dapm.o soc-jack.o soc-cache.o soc-utils.o
|
||||
snd-soc-core-objs += soc-pcm.o soc-compress.o soc-io.o soc-devres.o
|
||||
snd-soc-core-objs += soc-pcm.o soc-compress.o soc-io.o soc-devres.o soc-ops.o
|
||||
|
||||
ifneq ($(CONFIG_SND_SOC_GENERIC_DMAENGINE_PCM),)
|
||||
snd-soc-core-objs += soc-generic-dmaengine-pcm.o
|
||||
endif
|
||||
|
||||
ifneq ($(CONFIG_SND_SOC_AC97_BUS),)
|
||||
snd-soc-core-objs += soc-ac97.o
|
||||
endif
|
||||
|
||||
obj-$(CONFIG_SND_SOC) += snd-soc-core.o
|
||||
obj-$(CONFIG_SND_SOC) += codecs/
|
||||
obj-$(CONFIG_SND_SOC) += generic/
|
||||
|
@ -52,12 +52,3 @@ config SND_AT91_SOC_SAM9X5_WM8731
|
||||
help
|
||||
Say Y if you want to add support for audio SoC on an
|
||||
at91sam9x5 based board that is using WM8731 codec.
|
||||
|
||||
config SND_AT91_SOC_AFEB9260
|
||||
tristate "SoC Audio support for AFEB9260 board"
|
||||
depends on ARCH_AT91 && ATMEL_SSC && ARCH_AT91 && MACH_AFEB9260 && SND_ATMEL_SOC
|
||||
select SND_ATMEL_SOC_PDC
|
||||
select SND_ATMEL_SOC_SSC
|
||||
select SND_SOC_TLV320AIC23_I2C
|
||||
help
|
||||
Say Y here to support sound on AFEB9260 board.
|
||||
|
@ -17,4 +17,3 @@ snd-soc-sam9x5-wm8731-objs := sam9x5_wm8731.o
|
||||
obj-$(CONFIG_SND_AT91_SOC_SAM9G20_WM8731) += snd-soc-sam9g20-wm8731.o
|
||||
obj-$(CONFIG_SND_ATMEL_SOC_WM8904) += snd-atmel-soc-wm8904.o
|
||||
obj-$(CONFIG_SND_AT91_SOC_SAM9X5_WM8731) += snd-soc-sam9x5-wm8731.o
|
||||
obj-$(CONFIG_SND_AT91_SOC_AFEB9260) += snd-soc-afeb9260.o
|
||||
|
@ -310,7 +310,10 @@ static int atmel_ssc_set_dai_clkdiv(struct snd_soc_dai *cpu_dai,
|
||||
* transmit and receive, so if a value has already
|
||||
* been set, it must match this value.
|
||||
*/
|
||||
if (ssc_p->cmr_div == 0)
|
||||
if (ssc_p->dir_mask !=
|
||||
(SSC_DIR_MASK_PLAYBACK | SSC_DIR_MASK_CAPTURE))
|
||||
ssc_p->cmr_div = div;
|
||||
else if (ssc_p->cmr_div == 0)
|
||||
ssc_p->cmr_div = div;
|
||||
else
|
||||
if (div != ssc_p->cmr_div)
|
||||
|
@ -1,151 +0,0 @@
|
||||
/*
|
||||
* afeb9260.c -- SoC audio for AFEB9260
|
||||
*
|
||||
* Copyright (C) 2009 Sergey Lapin <slapin@ossfans.org>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* version 2 as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
|
||||
* 02110-1301 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/moduleparam.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
#include <linux/atmel-ssc.h>
|
||||
#include <sound/core.h>
|
||||
#include <sound/pcm.h>
|
||||
#include <sound/pcm_params.h>
|
||||
#include <sound/soc.h>
|
||||
|
||||
#include <asm/mach-types.h>
|
||||
#include <mach/hardware.h>
|
||||
#include <linux/gpio.h>
|
||||
|
||||
#include "../codecs/tlv320aic23.h"
|
||||
#include "atmel-pcm.h"
|
||||
#include "atmel_ssc_dai.h"
|
||||
|
||||
#define CODEC_CLOCK 12000000
|
||||
|
||||
static int afeb9260_hw_params(struct snd_pcm_substream *substream,
|
||||
struct snd_pcm_hw_params *params)
|
||||
{
|
||||
struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
||||
struct snd_soc_dai *codec_dai = rtd->codec_dai;
|
||||
int err;
|
||||
|
||||
/* Set the codec system clock for DAC and ADC */
|
||||
err =
|
||||
snd_soc_dai_set_sysclk(codec_dai, 0, CODEC_CLOCK, SND_SOC_CLOCK_IN);
|
||||
|
||||
if (err < 0) {
|
||||
printk(KERN_ERR "can't set codec system clock\n");
|
||||
return err;
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
static struct snd_soc_ops afeb9260_ops = {
|
||||
.hw_params = afeb9260_hw_params,
|
||||
};
|
||||
|
||||
static const struct snd_soc_dapm_widget tlv320aic23_dapm_widgets[] = {
|
||||
SND_SOC_DAPM_HP("Headphone Jack", NULL),
|
||||
SND_SOC_DAPM_LINE("Line In", NULL),
|
||||
SND_SOC_DAPM_MIC("Mic Jack", NULL),
|
||||
};
|
||||
|
||||
static const struct snd_soc_dapm_route afeb9260_audio_map[] = {
|
||||
{"Headphone Jack", NULL, "LHPOUT"},
|
||||
{"Headphone Jack", NULL, "RHPOUT"},
|
||||
|
||||
{"LLINEIN", NULL, "Line In"},
|
||||
{"RLINEIN", NULL, "Line In"},
|
||||
|
||||
{"MICIN", NULL, "Mic Jack"},
|
||||
};
|
||||
|
||||
|
||||
/* Digital audio interface glue - connects codec <--> CPU */
|
||||
static struct snd_soc_dai_link afeb9260_dai = {
|
||||
.name = "TLV320AIC23",
|
||||
.stream_name = "AIC23",
|
||||
.cpu_dai_name = "atmel-ssc-dai.0",
|
||||
.codec_dai_name = "tlv320aic23-hifi",
|
||||
.platform_name = "atmel_pcm-audio",
|
||||
.codec_name = "tlv320aic23-codec.0-001a",
|
||||
.dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_IF |
|
||||
SND_SOC_DAIFMT_CBM_CFM,
|
||||
.ops = &afeb9260_ops,
|
||||
};
|
||||
|
||||
/* Audio machine driver */
|
||||
static struct snd_soc_card snd_soc_machine_afeb9260 = {
|
||||
.name = "AFEB9260",
|
||||
.owner = THIS_MODULE,
|
||||
.dai_link = &afeb9260_dai,
|
||||
.num_links = 1,
|
||||
|
||||
.dapm_widgets = tlv320aic23_dapm_widgets,
|
||||
.num_dapm_widgets = ARRAY_SIZE(tlv320aic23_dapm_widgets),
|
||||
.dapm_routes = afeb9260_audio_map,
|
||||
.num_dapm_routes = ARRAY_SIZE(afeb9260_audio_map),
|
||||
};
|
||||
|
||||
static struct platform_device *afeb9260_snd_device;
|
||||
|
||||
static int __init afeb9260_soc_init(void)
|
||||
{
|
||||
int err;
|
||||
struct device *dev;
|
||||
|
||||
if (!(machine_is_afeb9260()))
|
||||
return -ENODEV;
|
||||
|
||||
|
||||
afeb9260_snd_device = platform_device_alloc("soc-audio", -1);
|
||||
if (!afeb9260_snd_device) {
|
||||
printk(KERN_ERR "ASoC: Platform device allocation failed\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
platform_set_drvdata(afeb9260_snd_device, &snd_soc_machine_afeb9260);
|
||||
err = platform_device_add(afeb9260_snd_device);
|
||||
if (err)
|
||||
goto err1;
|
||||
|
||||
dev = &afeb9260_snd_device->dev;
|
||||
|
||||
return 0;
|
||||
err1:
|
||||
platform_device_put(afeb9260_snd_device);
|
||||
return err;
|
||||
}
|
||||
|
||||
static void __exit afeb9260_soc_exit(void)
|
||||
{
|
||||
platform_device_unregister(afeb9260_snd_device);
|
||||
}
|
||||
|
||||
module_init(afeb9260_soc_init);
|
||||
module_exit(afeb9260_soc_exit);
|
||||
|
||||
MODULE_AUTHOR("Sergey Lapin <slapin@ossfans.org>");
|
||||
MODULE_DESCRIPTION("ALSA SoC for AFEB9260");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user