You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge remote-tracking branches 'asoc/topic/rt5665', 'asoc/topic/rt5677', 'asoc/topic/samsung', 'asoc/topic/simple' and 'asoc/topic/sunxi' into asoc-next
This commit is contained in:
@@ -7,6 +7,7 @@ Required properties:
|
||||
|
||||
- compatible: should be one of the followings
|
||||
- "allwinner,sun4i-a10-i2s"
|
||||
- "allwinner,sun6i-a31-i2s"
|
||||
- reg: physical base address of the controller and length of memory mapped
|
||||
region.
|
||||
- interrupts: should contain the I2S interrupt.
|
||||
@@ -19,6 +20,10 @@ Required properties:
|
||||
- "mod" : module clock for the I2S controller
|
||||
- #sound-dai-cells : Must be equal to 0
|
||||
|
||||
Required properties for the following compatibles:
|
||||
- "allwinner,sun6i-a31-i2s"
|
||||
- resets: phandle to the reset line for this codec
|
||||
|
||||
Example:
|
||||
|
||||
i2s0: i2s@01c22400 {
|
||||
|
||||
@@ -0,0 +1,63 @@
|
||||
Allwinner SUN8I audio codec
|
||||
------------------------------------
|
||||
|
||||
On Sun8i-A33 SoCs, the audio is separated in different parts:
|
||||
- A DAI driver. It uses the "sun4i-i2s" driver which is
|
||||
documented here:
|
||||
Documentation/devicetree/bindings/sound/sun4i-i2s.txt
|
||||
- An analog part of the codec which is handled as PRCM registers.
|
||||
See Documentation/devicetree/bindings/sound/sun8i-codec-analog.txt
|
||||
- An digital part of the codec which is documented in this current
|
||||
binding documentation.
|
||||
- And finally, an audio card which links all the above components.
|
||||
The simple-audio card will be used.
|
||||
See Documentation/devicetree/bindings/sound/simple-card.txt
|
||||
|
||||
This bindings documentation exposes Sun8i codec (digital part).
|
||||
|
||||
Required properties:
|
||||
- compatible: must be "allwinner,sun8i-a33-codec"
|
||||
- reg: must contain the registers location and length
|
||||
- interrupts: must contain the codec interrupt
|
||||
- clocks: a list of phandle + clock-specifer pairs, one for each entry
|
||||
in clock-names.
|
||||
- clock-names: should contain followings:
|
||||
- "bus": the parent APB clock for this controller
|
||||
- "mod": the parent module clock
|
||||
|
||||
Here is an example to add a sound card and the codec binding on sun8i SoCs that
|
||||
are similar to A33 using simple-card:
|
||||
|
||||
sound {
|
||||
compatible = "simple-audio-card";
|
||||
simple-audio-card,name = "sun8i-a33-audio";
|
||||
simple-audio-card,format = "i2s";
|
||||
simple-audio-card,frame-master = <&link_codec>;
|
||||
simple-audio-card,bitclock-master = <&link_codec>;
|
||||
simple-audio-card,mclk-fs = <512>;
|
||||
simple-audio-card,aux-devs = <&codec_analog>;
|
||||
simple-audio-card,routing =
|
||||
"Left DAC", "Digital Left DAC",
|
||||
"Right DAC", "Digital Right DAC";
|
||||
|
||||
simple-audio-card,cpu {
|
||||
sound-dai = <&dai>;
|
||||
};
|
||||
|
||||
link_codec: simple-audio-card,codec {
|
||||
sound-dai = <&codec>;
|
||||
};
|
||||
|
||||
soc@01c00000 {
|
||||
[...]
|
||||
|
||||
audio-codec@1c22e00 {
|
||||
#sound-dai-cells = <0>;
|
||||
compatible = "allwinner,sun8i-a33-codec";
|
||||
reg = <0x01c22e00 0x400>;
|
||||
interrupts = <GIC_SPI 29 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&ccu CLK_BUS_CODEC>, <&ccu CLK_AC_DIG>;
|
||||
clock-names = "bus", "mod";
|
||||
};
|
||||
};
|
||||
|
||||
@@ -10,6 +10,7 @@ Required properties:
|
||||
- compatible : should be one of the following:
|
||||
- "allwinner,sun4i-a10-spdif": for the Allwinner A10 SoC
|
||||
- "allwinner,sun6i-a31-spdif": for the Allwinner A31 SoC
|
||||
- "allwinner,sun8i-h3-spdif": for the Allwinner H3 SoC
|
||||
|
||||
- reg : Offset and length of the register set for the device.
|
||||
|
||||
|
||||
@@ -106,9 +106,7 @@ static struct s3c_audio_pdata i2sv4_pdata = {
|
||||
.dma_playback = DMACH_HSI_I2SV40_TX,
|
||||
.dma_capture = DMACH_HSI_I2SV40_RX,
|
||||
.type = {
|
||||
.i2s = {
|
||||
.quirks = QUIRK_PRI_6CHAN,
|
||||
},
|
||||
.quirks = QUIRK_PRI_6CHAN,
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
|
||||
extern void s3c64xx_ac97_setup_gpio(int);
|
||||
|
||||
struct samsung_i2s {
|
||||
struct samsung_i2s_type {
|
||||
/* If the Primary DAI has 5.1 Channels */
|
||||
#define QUIRK_PRI_6CHAN (1 << 0)
|
||||
/* If the I2S block has a Stereo Overlay Channel */
|
||||
@@ -47,7 +47,5 @@ struct s3c_audio_pdata {
|
||||
void *dma_capture;
|
||||
void *dma_play_sec;
|
||||
void *dma_capture_mic;
|
||||
union {
|
||||
struct samsung_i2s i2s;
|
||||
} type;
|
||||
struct samsung_i2s_type type;
|
||||
};
|
||||
|
||||
@@ -34,11 +34,12 @@ int asoc_simple_card_set_dailink_name(struct device *dev,
|
||||
int asoc_simple_card_parse_card_name(struct snd_soc_card *card,
|
||||
char *prefix);
|
||||
|
||||
#define asoc_simple_card_parse_clk_cpu(node, dai_link, simple_dai) \
|
||||
asoc_simple_card_parse_clk(node, dai_link->cpu_of_node, simple_dai)
|
||||
#define asoc_simple_card_parse_clk_codec(node, dai_link, simple_dai) \
|
||||
asoc_simple_card_parse_clk(node, dai_link->codec_of_node, simple_dai)
|
||||
int asoc_simple_card_parse_clk(struct device_node *node,
|
||||
#define asoc_simple_card_parse_clk_cpu(dev, node, dai_link, simple_dai) \
|
||||
asoc_simple_card_parse_clk(dev, node, dai_link->cpu_of_node, simple_dai)
|
||||
#define asoc_simple_card_parse_clk_codec(dev, node, dai_link, simple_dai) \
|
||||
asoc_simple_card_parse_clk(dev, node, dai_link->codec_of_node, simple_dai)
|
||||
int asoc_simple_card_parse_clk(struct device *dev,
|
||||
struct device_node *node,
|
||||
struct device_node *dai_of_node,
|
||||
struct asoc_simple_dai *simple_dai);
|
||||
|
||||
|
||||
@@ -118,8 +118,8 @@ config SND_SOC_ALL_CODECS
|
||||
select SND_SOC_RT5651 if I2C
|
||||
select SND_SOC_RT5659 if I2C
|
||||
select SND_SOC_RT5660 if I2C
|
||||
select SND_SOC_RT5665 if I2C
|
||||
select SND_SOC_RT5663 if I2C
|
||||
select SND_SOC_RT5665 if I2C
|
||||
select SND_SOC_RT5670 if I2C
|
||||
select SND_SOC_RT5677 if I2C && SPI_MASTER
|
||||
select SND_SOC_SGTL5000 if I2C
|
||||
@@ -671,8 +671,8 @@ config SND_SOC_RL6231
|
||||
default y if SND_SOC_RT5651=y
|
||||
default y if SND_SOC_RT5659=y
|
||||
default y if SND_SOC_RT5660=y
|
||||
default y if SND_SOC_RT5665=y
|
||||
default y if SND_SOC_RT5663=y
|
||||
default y if SND_SOC_RT5665=y
|
||||
default y if SND_SOC_RT5670=y
|
||||
default y if SND_SOC_RT5677=y
|
||||
default m if SND_SOC_RT5514=m
|
||||
@@ -682,8 +682,8 @@ config SND_SOC_RL6231
|
||||
default m if SND_SOC_RT5651=m
|
||||
default m if SND_SOC_RT5659=m
|
||||
default m if SND_SOC_RT5660=m
|
||||
default m if SND_SOC_RT5665=m
|
||||
default m if SND_SOC_RT5663=m
|
||||
default m if SND_SOC_RT5665=m
|
||||
default m if SND_SOC_RT5670=m
|
||||
default m if SND_SOC_RT5677=m
|
||||
|
||||
@@ -731,10 +731,10 @@ config SND_SOC_RT5659
|
||||
config SND_SOC_RT5660
|
||||
tristate
|
||||
|
||||
config SND_SOC_RT5665
|
||||
config SND_SOC_RT5663
|
||||
tristate
|
||||
|
||||
config SND_SOC_RT5663
|
||||
config SND_SOC_RT5665
|
||||
tristate
|
||||
|
||||
config SND_SOC_RT5670
|
||||
|
||||
@@ -119,8 +119,8 @@ snd-soc-rt5645-objs := rt5645.o
|
||||
snd-soc-rt5651-objs := rt5651.o
|
||||
snd-soc-rt5659-objs := rt5659.o
|
||||
snd-soc-rt5660-objs := rt5660.o
|
||||
snd-soc-rt5665-objs := rt5665.o
|
||||
snd-soc-rt5663-objs := rt5663.o
|
||||
snd-soc-rt5665-objs := rt5665.o
|
||||
snd-soc-rt5670-objs := rt5670.o
|
||||
snd-soc-rt5677-objs := rt5677.o
|
||||
snd-soc-rt5677-spi-objs := rt5677-spi.o
|
||||
@@ -348,8 +348,8 @@ obj-$(CONFIG_SND_SOC_RT5645) += snd-soc-rt5645.o
|
||||
obj-$(CONFIG_SND_SOC_RT5651) += snd-soc-rt5651.o
|
||||
obj-$(CONFIG_SND_SOC_RT5659) += snd-soc-rt5659.o
|
||||
obj-$(CONFIG_SND_SOC_RT5660) += snd-soc-rt5660.o
|
||||
obj-$(CONFIG_SND_SOC_RT5665) += snd-soc-rt5665.o
|
||||
obj-$(CONFIG_SND_SOC_RT5663) += snd-soc-rt5663.o
|
||||
obj-$(CONFIG_SND_SOC_RT5665) += snd-soc-rt5665.o
|
||||
obj-$(CONFIG_SND_SOC_RT5670) += snd-soc-rt5670.o
|
||||
obj-$(CONFIG_SND_SOC_RT5677) += snd-soc-rt5677.o
|
||||
obj-$(CONFIG_SND_SOC_RT5677_SPI) += snd-soc-rt5677-spi.o
|
||||
|
||||
@@ -21,7 +21,6 @@
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/uaccess.h>
|
||||
#include <linux/miscdevice.h>
|
||||
#include <linux/regulator/consumer.h>
|
||||
#include <linux/pm_qos.h>
|
||||
#include <linux/sysfs.h>
|
||||
|
||||
@@ -98,7 +98,8 @@ int asoc_simple_card_parse_card_name(struct snd_soc_card *card,
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(asoc_simple_card_parse_card_name);
|
||||
|
||||
int asoc_simple_card_parse_clk(struct device_node *node,
|
||||
int asoc_simple_card_parse_clk(struct device *dev,
|
||||
struct device_node *node,
|
||||
struct device_node *dai_of_node,
|
||||
struct asoc_simple_dai *simple_dai)
|
||||
{
|
||||
@@ -111,14 +112,13 @@ int asoc_simple_card_parse_clk(struct device_node *node,
|
||||
* or "system-clock-frequency = <xxx>"
|
||||
* or device's module clock.
|
||||
*/
|
||||
clk = of_clk_get(node, 0);
|
||||
clk = devm_get_clk_from_child(dev, node, NULL);
|
||||
if (!IS_ERR(clk)) {
|
||||
simple_dai->sysclk = clk_get_rate(clk);
|
||||
simple_dai->clk = clk;
|
||||
} else if (!of_property_read_u32(node, "system-clock-frequency", &val)) {
|
||||
simple_dai->sysclk = val;
|
||||
} else {
|
||||
clk = of_clk_get(dai_of_node, 0);
|
||||
clk = devm_get_clk_from_child(dev, dai_of_node, NULL);
|
||||
if (!IS_ERR(clk))
|
||||
simple_dai->sysclk = clk_get_rate(clk);
|
||||
}
|
||||
|
||||
@@ -278,11 +278,11 @@ static int asoc_simple_card_dai_link_of(struct device_node *node,
|
||||
if (ret < 0)
|
||||
goto dai_link_of_err;
|
||||
|
||||
ret = asoc_simple_card_parse_clk_cpu(cpu, dai_link, cpu_dai);
|
||||
ret = asoc_simple_card_parse_clk_cpu(dev, cpu, dai_link, cpu_dai);
|
||||
if (ret < 0)
|
||||
goto dai_link_of_err;
|
||||
|
||||
ret = asoc_simple_card_parse_clk_codec(codec, dai_link, codec_dai);
|
||||
ret = asoc_simple_card_parse_clk_codec(dev, codec, dai_link, codec_dai);
|
||||
if (ret < 0)
|
||||
goto dai_link_of_err;
|
||||
|
||||
|
||||
@@ -128,7 +128,7 @@ static int asoc_simple_card_dai_link_of(struct device_node *np,
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = asoc_simple_card_parse_clk_cpu(np, dai_link, dai_props);
|
||||
ret = asoc_simple_card_parse_clk_cpu(dev, np, dai_link, dai_props);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
@@ -153,7 +153,7 @@ static int asoc_simple_card_dai_link_of(struct device_node *np,
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ret = asoc_simple_card_parse_clk_codec(np, dai_link, dai_props);
|
||||
ret = asoc_simple_card_parse_clk_codec(dev, np, dai_link, dai_props);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
|
||||
@@ -111,6 +111,7 @@ config SND_SOC_SAMSUNG_RX1950_UDA1380
|
||||
config SND_SOC_SMARTQ
|
||||
tristate "SoC I2S Audio support for SmartQ board"
|
||||
depends on MACH_SMARTQ || COMPILE_TEST
|
||||
depends on GPIOLIB || COMPILE_TEST
|
||||
depends on I2C
|
||||
select SND_SAMSUNG_I2S
|
||||
select SND_SOC_WM8750
|
||||
@@ -193,6 +194,7 @@ config SND_SOC_ARNDALE_RT5631_ALC5631
|
||||
config SND_SOC_SAMSUNG_TM2_WM5110
|
||||
tristate "SoC I2S Audio support for WM5110 on TM2 board"
|
||||
depends on SND_SOC_SAMSUNG && MFD_ARIZONA && I2C && SPI_MASTER
|
||||
depends on GPIOLIB || COMPILE_TEST
|
||||
select SND_SOC_MAX98504
|
||||
select SND_SOC_WM5110
|
||||
select SND_SAMSUNG_I2S
|
||||
|
||||
+94
-109
File diff suppressed because it is too large
Load Diff
@@ -32,14 +32,11 @@ static int smdk_hw_params(struct snd_pcm_substream *substream,
|
||||
struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
||||
struct snd_soc_dai *codec_dai = rtd->codec_dai;
|
||||
unsigned int pll_out;
|
||||
int bfs, rfs, ret;
|
||||
int rfs, ret;
|
||||
|
||||
switch (params_width(params)) {
|
||||
case 8:
|
||||
bfs = 16;
|
||||
break;
|
||||
case 16:
|
||||
bfs = 32;
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
|
||||
#include <linux/clk.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/gpio/consumer.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/of.h>
|
||||
#include <sound/pcm_params.h>
|
||||
|
||||
+12
-1
@@ -9,9 +9,20 @@ config SND_SUN4I_CODEC
|
||||
Select Y or M to add support for the Codec embedded in the Allwinner
|
||||
A10 and affiliated SoCs.
|
||||
|
||||
config SND_SUN8I_CODEC
|
||||
tristate "Allwinner SUN8I audio codec"
|
||||
depends on OF
|
||||
depends on MACH_SUN8I || COMPILE_TEST
|
||||
select REGMAP_MMIO
|
||||
help
|
||||
This option enables the digital part of the internal audio codec for
|
||||
Allwinner sun8i SoC (and particularly A33).
|
||||
|
||||
Say Y or M if you want to add sun8i digital audio codec support.
|
||||
|
||||
config SND_SUN8I_CODEC_ANALOG
|
||||
tristate "Allwinner sun8i Codec Analog Controls Support"
|
||||
depends on MACH_SUN8I || COMPILE_TEST
|
||||
depends on MACH_SUN8I || (ARM64 && ARCH_SUNXI) || COMPILE_TEST
|
||||
select REGMAP
|
||||
help
|
||||
Say Y or M if you want to add support for the analog controls for
|
||||
|
||||
@@ -2,3 +2,4 @@ obj-$(CONFIG_SND_SUN4I_CODEC) += sun4i-codec.o
|
||||
obj-$(CONFIG_SND_SUN4I_I2S) += sun4i-i2s.o
|
||||
obj-$(CONFIG_SND_SUN4I_SPDIF) += sun4i-spdif.o
|
||||
obj-$(CONFIG_SND_SUN8I_CODEC_ANALOG) += sun8i-codec-analog.o
|
||||
obj-$(CONFIG_SND_SUN8I_CODEC) += sun8i-codec.o
|
||||
|
||||
@@ -1058,6 +1058,7 @@ static const struct snd_soc_dapm_route sun6i_codec_codec_dapm_routes[] = {
|
||||
{ "Line Out Source Playback Route", "Stereo", "Left Mixer" },
|
||||
{ "Line Out Source Playback Route", "Stereo", "Right Mixer" },
|
||||
{ "Line Out Source Playback Route", "Mono Differential", "Left Mixer" },
|
||||
{ "Line Out Source Playback Route", "Mono Differential", "Right Mixer" },
|
||||
{ "LINEOUT", NULL, "Line Out Source Playback Route" },
|
||||
|
||||
/* ADC Routes */
|
||||
|
||||
@@ -14,9 +14,11 @@
|
||||
#include <linux/clk.h>
|
||||
#include <linux/dmaengine.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
#include <linux/regmap.h>
|
||||
#include <linux/reset.h>
|
||||
|
||||
#include <sound/dmaengine_pcm.h>
|
||||
#include <sound/pcm_params.h>
|
||||
@@ -92,6 +94,7 @@ struct sun4i_i2s {
|
||||
struct clk *bus_clk;
|
||||
struct clk *mod_clk;
|
||||
struct regmap *regmap;
|
||||
struct reset_control *rst;
|
||||
|
||||
unsigned int mclk_freq;
|
||||
|
||||
@@ -651,9 +654,22 @@ static int sun4i_i2s_runtime_suspend(struct device *dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct sun4i_i2s_quirks {
|
||||
bool has_reset;
|
||||
};
|
||||
|
||||
static const struct sun4i_i2s_quirks sun4i_a10_i2s_quirks = {
|
||||
.has_reset = false,
|
||||
};
|
||||
|
||||
static const struct sun4i_i2s_quirks sun6i_a31_i2s_quirks = {
|
||||
.has_reset = true,
|
||||
};
|
||||
|
||||
static int sun4i_i2s_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct sun4i_i2s *i2s;
|
||||
const struct sun4i_i2s_quirks *quirks;
|
||||
struct resource *res;
|
||||
void __iomem *regs;
|
||||
int irq, ret;
|
||||
@@ -674,6 +690,12 @@ static int sun4i_i2s_probe(struct platform_device *pdev)
|
||||
return irq;
|
||||
}
|
||||
|
||||
quirks = of_device_get_match_data(&pdev->dev);
|
||||
if (!quirks) {
|
||||
dev_err(&pdev->dev, "Failed to determine the quirks to use\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
i2s->bus_clk = devm_clk_get(&pdev->dev, "apb");
|
||||
if (IS_ERR(i2s->bus_clk)) {
|
||||
dev_err(&pdev->dev, "Can't get our bus clock\n");
|
||||
@@ -692,7 +714,24 @@ static int sun4i_i2s_probe(struct platform_device *pdev)
|
||||
dev_err(&pdev->dev, "Can't get our mod clock\n");
|
||||
return PTR_ERR(i2s->mod_clk);
|
||||
}
|
||||
|
||||
|
||||
if (quirks->has_reset) {
|
||||
i2s->rst = devm_reset_control_get(&pdev->dev, NULL);
|
||||
if (IS_ERR(i2s->rst)) {
|
||||
dev_err(&pdev->dev, "Failed to get reset control\n");
|
||||
return PTR_ERR(i2s->rst);
|
||||
}
|
||||
}
|
||||
|
||||
if (!IS_ERR(i2s->rst)) {
|
||||
ret = reset_control_deassert(i2s->rst);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev,
|
||||
"Failed to deassert the reset control\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
i2s->playback_dma_data.addr = res->start + SUN4I_I2S_FIFO_TX_REG;
|
||||
i2s->playback_dma_data.maxburst = 8;
|
||||
|
||||
@@ -727,23 +766,37 @@ err_suspend:
|
||||
sun4i_i2s_runtime_suspend(&pdev->dev);
|
||||
err_pm_disable:
|
||||
pm_runtime_disable(&pdev->dev);
|
||||
if (!IS_ERR(i2s->rst))
|
||||
reset_control_assert(i2s->rst);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int sun4i_i2s_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct sun4i_i2s *i2s = dev_get_drvdata(&pdev->dev);
|
||||
|
||||
snd_dmaengine_pcm_unregister(&pdev->dev);
|
||||
|
||||
pm_runtime_disable(&pdev->dev);
|
||||
if (!pm_runtime_status_suspended(&pdev->dev))
|
||||
sun4i_i2s_runtime_suspend(&pdev->dev);
|
||||
|
||||
if (!IS_ERR(i2s->rst))
|
||||
reset_control_assert(i2s->rst);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct of_device_id sun4i_i2s_match[] = {
|
||||
{ .compatible = "allwinner,sun4i-a10-i2s", },
|
||||
{
|
||||
.compatible = "allwinner,sun4i-a10-i2s",
|
||||
.data = &sun4i_a10_i2s_quirks,
|
||||
},
|
||||
{
|
||||
.compatible = "allwinner,sun6i-a31-i2s",
|
||||
.data = &sun6i_a31_i2s_quirks,
|
||||
},
|
||||
{}
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, sun4i_i2s_match);
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user