mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-05 02:21:52 +09:00
Merge commit 'cd4db37fa4650177e1825bfaa3a8775fbf901f00'
* commit 'cd4db37fa4650177e1825bfaa3a8775fbf901f00': clk: rockchip: rk3568: remove pwm0 for protect clock ASoC: codecs: rk3506: Check substream direction in hw_params and shutdown ARM: dts: rockchip: rk3506g-demo-display-control: Bind loopback to rk730_sound ARM: dts: rockchip: rk3506g-evb1-v10: Bind loopback to es8388_sound ASoC: dt-bindings: rockchip: add property 'mclk-fs-mapping' for multidais ASoC: rockchip: multi-dais: Support set different mclk to dais drm/rockchip: gem: try other IOVA if iommu map failed ARM: configs: rk3506-display.config: Disable CONFIG_ROCKCHIP_DW_MIPI_DSI2 ASoC: dt-bindings: rockchip: add property 'rockchip,mclk-fs-mapping' for multicodecs ASoC: rockchip: multicodecs: Support set different mclk to codecs ARM: dts: rockchip: rk3502-evb1: Add pinctrl-sleep for SAI1 ARM: dts: rockchip: rk3506-pinctrl: Add rm_io_idle pins ARM: dts: rockchip: pinconf.dtsi add input enable pull down Change-Id: Ic3cff9563090d96587f800e5d60c2f7f826c122c
This commit is contained in:
@@ -35,9 +35,15 @@ Optional dai-link subnode properties:
|
||||
dai-link uses bit clock inversion.
|
||||
- rockchip,frame-inversion : bool property. Add this if the
|
||||
dai-link uses frame clock inversion.
|
||||
- rockchip,mclk-fs : Multiplication factor between stream
|
||||
- rockchip,mclk-fs : Multiplication factor between stream
|
||||
rate and codec mclk, applied only for
|
||||
the dai-link.
|
||||
- rockchip,mclk-fs-mapping : u32 properties. Multiplication factor
|
||||
between steam rate and codec mclk,
|
||||
these values will overwrite the mclk-fs.
|
||||
mclk-fs-mapping = <256 1024> means:
|
||||
(mclk of first codec) = 256 * fs,
|
||||
(mclk of second codec) = 1024 * fs.
|
||||
|
||||
Example:
|
||||
|
||||
@@ -86,3 +92,41 @@ es8388_sound: es8388-sound {
|
||||
press-threshold-microvolt = <2000>;
|
||||
};
|
||||
};
|
||||
|
||||
Example 3 for rockchip,mclk-fs-mapping:
|
||||
|
||||
sai_dais: sai-dais {
|
||||
status = "okay";
|
||||
compatible = "rockchip,multi-dais";
|
||||
dais = <&sai1>, <&sai4>;
|
||||
capture,channel-mapping = <2 2>;
|
||||
playback,channel-mapping = <2 0>;
|
||||
bitclock-inversion = <0 0>;
|
||||
mclk-fs-mapping = <256 1024>;
|
||||
};
|
||||
|
||||
es8388_sound: es8388-sound {
|
||||
status = "okay";
|
||||
compatible = "rockchip,multicodecs-card";
|
||||
rockchip,card-name = "rockchip-es8388";
|
||||
spk-con-gpio = <&gpio1 RK_PC6 GPIO_ACTIVE_HIGH>;
|
||||
rockchip,pre-power-on-delay-ms = <30>;
|
||||
rockchip,post-power-down-delay-ms = <40>;
|
||||
rockchip,format = "i2s";
|
||||
rockchip,cpu = <&sai_dais>;
|
||||
rockchip,codec = <&es8388>, <&audio_codec>;
|
||||
rockchip,mclk-fs = <256>;
|
||||
rockchip,mclk-fs-mapping = <256 1024>;
|
||||
rockchip,audio-routing =
|
||||
"Speaker", "LOUT1",
|
||||
"Speaker", "ROUT1",
|
||||
"Speaker", "Speaker Power",
|
||||
"Speaker", "Speaker Power",
|
||||
"LINPUT1", "Main Mic",
|
||||
"LINPUT2", "Main Mic",
|
||||
"RINPUT1", "Main Mic",
|
||||
"RINPUT2", "Main Mic";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&spk_ctrl>;
|
||||
};
|
||||
|
||||
|
||||
@@ -19,6 +19,11 @@ Optional properties:
|
||||
- bitclock-master: bool properties, bit clock master, one for each in dais.
|
||||
- bitclock-inversion: bool properties, bit clock inversion, one for each in dais.
|
||||
- frame-inversion: bool properties, frame clock inversion, one for each in dais.
|
||||
- mclk-fs-mapping: u32 properties, multiplication factor between stream
|
||||
rate and codec mclk, one for each in dais.
|
||||
mclk-fs-mapping = <256 1024> means:
|
||||
(mclk of first dai) = 256 * fs,
|
||||
(mclk of second dai) = 1024 * fs.
|
||||
|
||||
Example:
|
||||
|
||||
@@ -52,3 +57,41 @@ vad-sound {
|
||||
rockchip,cpu = <&multi_dais>;
|
||||
rockchip,codec = <&acodec>, <&vad>;
|
||||
};
|
||||
|
||||
Example 2 for mclk-fs-mapping:
|
||||
|
||||
sai_dais: sai-dais {
|
||||
status = "okay";
|
||||
compatible = "rockchip,multi-dais";
|
||||
dais = <&sai1>, <&sai4>;
|
||||
capture,channel-mapping = <2 2>;
|
||||
playback,channel-mapping = <2 0>;
|
||||
bitclock-inversion = <0 0>;
|
||||
mclk-fs-mapping = <256 1024>;
|
||||
};
|
||||
|
||||
es8388_sound: es8388-sound {
|
||||
status = "okay";
|
||||
compatible = "rockchip,multicodecs-card";
|
||||
rockchip,card-name = "rockchip-es8388";
|
||||
spk-con-gpio = <&gpio1 RK_PC6 GPIO_ACTIVE_HIGH>;
|
||||
rockchip,pre-power-on-delay-ms = <30>;
|
||||
rockchip,post-power-down-delay-ms = <40>;
|
||||
rockchip,format = "i2s";
|
||||
rockchip,cpu = <&sai_dais>;
|
||||
rockchip,codec = <&es8388>, <&audio_codec>;
|
||||
rockchip,mclk-fs = <256>;
|
||||
rockchip,mclk-fs-mapping = <256 1024>;
|
||||
rockchip,audio-routing =
|
||||
"Speaker", "LOUT1",
|
||||
"Speaker", "ROUT1",
|
||||
"Speaker", "Speaker Power",
|
||||
"Speaker", "Speaker Power",
|
||||
"LINPUT1", "Main Mic",
|
||||
"LINPUT2", "Main Mic",
|
||||
"RINPUT1", "Main Mic",
|
||||
"RINPUT2", "Main Mic";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&spk_ctrl>;
|
||||
};
|
||||
|
||||
|
||||
@@ -427,11 +427,15 @@
|
||||
};
|
||||
|
||||
&sai1 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-names = "default", "sleep";
|
||||
pinctrl-0 = <&rm_io9_sai1_sclk
|
||||
&rm_io10_sai1_lrck
|
||||
&rm_io11_sai1_sdi
|
||||
&rm_io12_sai1_sdo0>;
|
||||
pinctrl-1 = <&rm_io9_idle_pins
|
||||
&rm_io10_idle_pins
|
||||
&rm_io11_idle_pins
|
||||
&rm_io12_idle_pins>;
|
||||
};
|
||||
|
||||
&sai4 {
|
||||
|
||||
@@ -1385,6 +1385,29 @@
|
||||
};
|
||||
};
|
||||
|
||||
rm_io_idle {
|
||||
/omit-if-no-ref/
|
||||
rm_io9_idle_pins: rm-io9-idle-pins {
|
||||
rockchip,pins =
|
||||
<0 RK_PB1 RK_FUNC_GPIO &pcfg_input_enable_pull_down>;
|
||||
};
|
||||
/omit-if-no-ref/
|
||||
rm_io10_idle_pins: rm-io10-idle-pins {
|
||||
rockchip,pins =
|
||||
<0 RK_PB2 RK_FUNC_GPIO &pcfg_input_enable_pull_down>;
|
||||
};
|
||||
/omit-if-no-ref/
|
||||
rm_io11_idle_pins: rm-io11-idle-pins {
|
||||
rockchip,pins =
|
||||
<0 RK_PB3 RK_FUNC_GPIO &pcfg_input_enable_pull_down>;
|
||||
};
|
||||
/omit-if-no-ref/
|
||||
rm_io12_idle_pins: rm-io12-idle-pins {
|
||||
rockchip,pins =
|
||||
<0 RK_PB4 RK_FUNC_GPIO &pcfg_input_enable_pull_down>;
|
||||
};
|
||||
};
|
||||
|
||||
vo_lcdc {
|
||||
/omit-if-no-ref/
|
||||
bt1120_pins: bt1120-pins {
|
||||
|
||||
@@ -143,8 +143,9 @@
|
||||
rockchip,post-power-down-delay-ms = <40>;
|
||||
rockchip,format = "i2s";
|
||||
rockchip,mclk-fs = <256>;
|
||||
rockchip,cpu = <&sai1>;
|
||||
rockchip,codec = <&rk730>;
|
||||
rockchip,mclk-fs-mapping = <256 1024>;
|
||||
rockchip,cpu = <&sai_dais>;
|
||||
rockchip,codec = <&rk730>, <&audio_codec>;
|
||||
rockchip,audio-routing =
|
||||
"Headphone", "LOUT1",
|
||||
"Headphone", "ROUT1",
|
||||
@@ -158,6 +159,15 @@
|
||||
"MIC1", "Headset Mic";
|
||||
};
|
||||
|
||||
sai_dais: sai-dais {
|
||||
status = "okay";
|
||||
compatible = "rockchip,multi-dais";
|
||||
dais = <&sai1>, <&sai4>;
|
||||
capture,channel-mapping = <2 2>;
|
||||
playback,channel-mapping = <2 0>;
|
||||
mclk-fs-mapping = <256 1024>;
|
||||
};
|
||||
|
||||
sdio_pwrseq: sdio-pwrseq {
|
||||
compatible = "mmc-pwrseq-simple";
|
||||
pinctrl-names = "default";
|
||||
@@ -223,6 +233,10 @@
|
||||
};
|
||||
};
|
||||
|
||||
&audio_codec {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&can0 {
|
||||
assigned-clocks = <&cru CLK_CAN0>;
|
||||
assigned-clock-rates = <300000000>;
|
||||
@@ -584,6 +598,10 @@
|
||||
&rm_io12_sai1_sdo0>;
|
||||
};
|
||||
|
||||
&sai4 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&saradc {
|
||||
vref-supply = <&vcc_1v8>;
|
||||
status = "okay";
|
||||
|
||||
@@ -20,6 +20,15 @@
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
sai_dais: sai-dais {
|
||||
status = "okay";
|
||||
compatible = "rockchip,multi-dais";
|
||||
dais = <&sai1>, <&sai4>;
|
||||
capture,channel-mapping = <2 2>;
|
||||
playback,channel-mapping = <2 0>;
|
||||
mclk-fs-mapping = <256 1024>;
|
||||
};
|
||||
|
||||
vcc3v3_lcd_n: vcc3v3-lcd0-n {
|
||||
compatible = "regulator-fixed";
|
||||
enable-active-high;
|
||||
@@ -58,6 +67,10 @@
|
||||
};
|
||||
};
|
||||
|
||||
&acodec_sound {
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
&cma {
|
||||
size = <0x1600000>;
|
||||
};
|
||||
@@ -84,6 +97,9 @@
|
||||
|
||||
&es8388_sound {
|
||||
status = "okay";
|
||||
rockchip,cpu = <&sai_dais>;
|
||||
rockchip,codec = <&es8388>, <&audio_codec>;
|
||||
rockchip,mclk-fs-mapping = <256 1024>;
|
||||
};
|
||||
|
||||
>1x {
|
||||
|
||||
@@ -333,6 +333,12 @@
|
||||
input-schmitt-enable;
|
||||
};
|
||||
|
||||
/omit-if-no-ref/
|
||||
pcfg_input_enable_pull_down: pcfg-input-enable-pull-down {
|
||||
input-enable;
|
||||
bias-pull-down;
|
||||
};
|
||||
|
||||
/omit-if-no-ref/
|
||||
pcfg_output_high: pcfg-output-high {
|
||||
output-high;
|
||||
|
||||
@@ -221,6 +221,7 @@ CONFIG_MEDIA_SUPPORT_FILTER=y
|
||||
# CONFIG_ROCKCHIP_DW_HDCP2 is not set
|
||||
# CONFIG_ROCKCHIP_DW_HDMI is not set
|
||||
CONFIG_ROCKCHIP_DW_MIPI_DSI=y
|
||||
# CONFIG_ROCKCHIP_DW_MIPI_DSI2 is not set
|
||||
CONFIG_ROCKCHIP_FLEXBUS_CIF=y
|
||||
CONFIG_ROCKCHIP_FLEXBUS_CIF_USE_DUMMY_BUF=y
|
||||
# CONFIG_ROCKCHIP_FLEXBUS_CIF_USE_NONE_DUMMY_BUF is not set
|
||||
|
||||
@@ -1626,8 +1626,6 @@ static void rk3568_dump_cru(void)
|
||||
}
|
||||
|
||||
static int protect_clocks[] = {
|
||||
CLK_PWM0,
|
||||
PCLK_PWM0,
|
||||
CLK_PWM1,
|
||||
PCLK_PWM1,
|
||||
CLK_PWM2,
|
||||
|
||||
@@ -33,6 +33,11 @@ struct page_info {
|
||||
|
||||
#define PG_ROUND 8
|
||||
|
||||
#define FAIL_LIMIT 3
|
||||
static u64 fail_count;
|
||||
static u64 fail_iova = U64_MAX;
|
||||
static u64 fail_time;
|
||||
|
||||
static int rockchip_gem_iommu_map(struct rockchip_gem_object *rk_obj)
|
||||
{
|
||||
struct drm_device *drm = rk_obj->base.dev;
|
||||
@@ -40,6 +45,7 @@ static int rockchip_gem_iommu_map(struct rockchip_gem_object *rk_obj)
|
||||
int prot = IOMMU_READ | IOMMU_WRITE;
|
||||
ssize_t ret;
|
||||
|
||||
retry:
|
||||
mutex_lock(&private->mm_lock);
|
||||
ret = drm_mm_insert_node_generic(&private->mm, &rk_obj->mm,
|
||||
rk_obj->base.size, PAGE_SIZE,
|
||||
@@ -56,15 +62,31 @@ static int rockchip_gem_iommu_map(struct rockchip_gem_object *rk_obj)
|
||||
rockchip_drm_dbg(drm->dev, VOP_DEBUG_IOMMU_MAP, "iommu map: iova: %pad size: 0x%zx",
|
||||
&rk_obj->dma_addr, rk_obj->base.size);
|
||||
|
||||
if (fail_iova == U64_MAX)
|
||||
fail_iova = rk_obj->dma_addr;
|
||||
|
||||
ret = iommu_map_sgtable(private->domain, rk_obj->dma_addr, rk_obj->sgt,
|
||||
prot);
|
||||
if (ret < (ssize_t)rk_obj->base.size) {
|
||||
DRM_ERROR("failed to map buffer: size=%zd request_size=%zd\n",
|
||||
ret, rk_obj->base.size);
|
||||
ret = -ENOMEM;
|
||||
if (rk_obj->dma_addr == fail_iova) {
|
||||
if (++fail_count >= FAIL_LIMIT) {
|
||||
DRM_ERROR("IOVA:%pad map failed, retry other, retried:%lld\n",
|
||||
&rk_obj->dma_addr, ++fail_time);
|
||||
fail_count = 0;
|
||||
fail_iova = U64_MAX;
|
||||
goto retry;
|
||||
}
|
||||
}
|
||||
goto err_remove_node;
|
||||
}
|
||||
|
||||
fail_count = 0;
|
||||
fail_iova = U64_MAX;
|
||||
fail_time = 0;
|
||||
|
||||
iommu_flush_iotlb_all(private->domain);
|
||||
|
||||
rk_obj->size = ret;
|
||||
|
||||
@@ -211,6 +211,9 @@ static int rk3506_hw_params(struct snd_pcm_substream *substream,
|
||||
unsigned int width, rate;
|
||||
int ratio;
|
||||
|
||||
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
|
||||
return 0;
|
||||
|
||||
if ((params_rate(params) % 12000) == 0) {
|
||||
clk_set_rate(rk3506->mclk, MCLK_REFERENCE_12000);
|
||||
ratio = MCLK_REFERENCE_12000 / MCLK_I2S_REFERENCE_DIV /
|
||||
@@ -283,6 +286,9 @@ static void rk3506_pcm_shutdown(struct snd_pcm_substream *substream,
|
||||
struct snd_soc_component *component = dai->component;
|
||||
struct rk3506_codec_priv *rk3506 = snd_soc_component_get_drvdata(component);
|
||||
|
||||
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
|
||||
return;
|
||||
|
||||
rk3506_codec_capture_off(component);
|
||||
regcache_cache_only(rk3506->regmap, false);
|
||||
regcache_sync(rk3506->regmap);
|
||||
|
||||
@@ -58,6 +58,7 @@ static int rockchip_mdais_hw_params(struct snd_pcm_substream *substream,
|
||||
struct snd_pcm_hw_params *cparams;
|
||||
struct snd_soc_dai *child;
|
||||
unsigned int *channel_maps;
|
||||
unsigned int freq;
|
||||
int ret = 0, i = 0;
|
||||
|
||||
cparams = kmemdup(params, sizeof(*params), GFP_KERNEL);
|
||||
@@ -71,6 +72,16 @@ static int rockchip_mdais_hw_params(struct snd_pcm_substream *substream,
|
||||
if (!channel_maps[i])
|
||||
continue;
|
||||
|
||||
if (mdais->mclk_fs_maps[i] > 0) {
|
||||
freq = params_rate(params) * mdais->mclk_fs_maps[i];
|
||||
ret = snd_soc_dai_set_sysclk(child, substream->stream, freq,
|
||||
SND_SOC_CLOCK_OUT);
|
||||
if (ret && ret != -ENOTSUPP) {
|
||||
dev_err(dai->dev, "Set sysclk(%uHZ) failed: %d\n", freq, ret);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
hw_refine_channels(cparams, channel_maps[i]);
|
||||
if (child->driver->ops && child->driver->ops->hw_params) {
|
||||
ret = child->driver->ops->hw_params(substream, cparams, child);
|
||||
@@ -219,9 +230,13 @@ static int rockchip_mdais_set_sysclk(struct snd_soc_dai *cpu_dai, int clk_id,
|
||||
|
||||
for (i = 0; i < mdais->num_dais; i++) {
|
||||
child = mdais->dais[i].dai;
|
||||
if (mdais->mclk_fs_maps[i] > 0)
|
||||
continue;
|
||||
ret = snd_soc_dai_set_sysclk(child, clk_id, freq, dir);
|
||||
if (ret && ret != -ENOTSUPP)
|
||||
if (ret && ret != -ENOTSUPP) {
|
||||
dev_err(cpu_dai->dev, "Set soc_dai sysclk(%uHZ) failed: %d\n", freq, ret);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
@@ -565,6 +580,15 @@ static int rockchip_mdais_probe(struct platform_device *pdev)
|
||||
if (ret)
|
||||
return -EINVAL;
|
||||
mdais->playback_channel_maps = map;
|
||||
map = devm_kcalloc(&pdev->dev, count,
|
||||
sizeof(*map), GFP_KERNEL);
|
||||
if (!map)
|
||||
return -ENOMEM;
|
||||
ret = of_property_read_u32_array(np, "mclk-fs-mapping",
|
||||
map, count);
|
||||
if (ret)
|
||||
memset(map, 0x0, sizeof(*map) * count);
|
||||
mdais->mclk_fs_maps = map;
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
node = of_parse_phandle(np, "dais", i);
|
||||
|
||||
@@ -25,6 +25,7 @@ struct rk_mdais_dev {
|
||||
struct rk_dai *dais;
|
||||
unsigned int *playback_channel_maps;
|
||||
unsigned int *capture_channel_maps;
|
||||
unsigned int *mclk_fs_maps;
|
||||
int num_dais;
|
||||
};
|
||||
|
||||
|
||||
@@ -67,6 +67,7 @@ struct multicodecs_data {
|
||||
struct extcon_dev *extcon;
|
||||
struct delayed_work handler;
|
||||
unsigned int mclk_fs;
|
||||
unsigned int *mclk_fs_map;
|
||||
bool codec_hp_det;
|
||||
u32 num_keys;
|
||||
u32 last_key;
|
||||
@@ -372,15 +373,20 @@ static int rk_multicodecs_hw_params(struct snd_pcm_substream *substream,
|
||||
struct snd_soc_dai *codec_dai;
|
||||
struct multicodecs_data *mc_data = snd_soc_card_get_drvdata(rtd->card);
|
||||
unsigned int mclk;
|
||||
unsigned int codec_mclk;
|
||||
int ret, i;
|
||||
|
||||
mclk = params_rate(params) * mc_data->mclk_fs;
|
||||
|
||||
for_each_rtd_codec_dais(rtd, i, codec_dai) {
|
||||
ret = snd_soc_dai_set_sysclk(codec_dai, substream->stream, mclk,
|
||||
if (mc_data->mclk_fs_map[i] > 0)
|
||||
codec_mclk = params_rate(params) * mc_data->mclk_fs_map[i];
|
||||
else
|
||||
codec_mclk = mclk;
|
||||
ret = snd_soc_dai_set_sysclk(codec_dai, substream->stream, codec_mclk,
|
||||
SND_SOC_CLOCK_IN);
|
||||
if (ret && ret != -ENOTSUPP) {
|
||||
pr_err("Set codec_dai sysclk failed: %d\n", ret);
|
||||
pr_err("Set codec_dai sysclk(%uHZ) failed: %d\n", codec_mclk, ret);
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
@@ -388,7 +394,7 @@ static int rk_multicodecs_hw_params(struct snd_pcm_substream *substream,
|
||||
ret = snd_soc_dai_set_sysclk(cpu_dai, substream->stream, mclk,
|
||||
SND_SOC_CLOCK_OUT);
|
||||
if (ret && ret != -ENOTSUPP) {
|
||||
pr_err("Set cpu_dai sysclk failed: %d\n", ret);
|
||||
pr_err("Set cpu_dai sysclk(%uHZ) failed: %d\n", mclk, ret);
|
||||
goto out;
|
||||
}
|
||||
|
||||
@@ -741,6 +747,7 @@ static int rk_multicodecs_probe(struct platform_device *pdev)
|
||||
struct snd_soc_dai_link_component *codecs;
|
||||
struct multicodecs_data *mc_data;
|
||||
struct of_phandle_args args;
|
||||
unsigned int *map;
|
||||
u32 val;
|
||||
int count, irq;
|
||||
int ret = 0, i = 0, idx = 0;
|
||||
@@ -858,6 +865,14 @@ static int rk_multicodecs_probe(struct platform_device *pdev)
|
||||
card->num_links = 3;
|
||||
}
|
||||
|
||||
map = devm_kcalloc(&pdev->dev, count, sizeof(*map), GFP_KERNEL);
|
||||
if (!map)
|
||||
return -ENOMEM;
|
||||
ret = of_property_read_u32_array(np, "rockchip,mclk-fs-mapping", map, count);
|
||||
if (ret)
|
||||
memset(map, 0x0, sizeof(*map) * count);
|
||||
mc_data->mclk_fs_map = map;
|
||||
|
||||
mc_data->mclk_fs = DEFAULT_MCLK_FS;
|
||||
if (!of_property_read_u32(np, "rockchip,mclk-fs", &val))
|
||||
mc_data->mclk_fs = val;
|
||||
|
||||
Reference in New Issue
Block a user