mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-08 03:40:35 +09:00
ASoC: rockchip: vad: get the audio buf from sram node
Change-Id: If352ff39aa23e461e440fc3f2f87f8a0fa868870 Signed-off-by: Sugar Zhang <sugar.zhang@rock-chips.com>
This commit is contained in:
@@ -10,7 +10,8 @@ Required properties:
|
||||
- clocks: a list of phandle + clock-specifer pairs, one for each entry in clock-names.
|
||||
- clock-names: should contain following:
|
||||
- interrupts: should contain the vad interrupt.
|
||||
- rockchip,audio-src: the audio src for vad.
|
||||
- rockchip,audio-sram: the phandle of audio sram for vad.
|
||||
- rockchip,audio-src: the phandle of audio src for vad.
|
||||
- rockchip,buffer-time-ms: vad sram buffer time msec.
|
||||
- rockchip,det-channel: the channel(0~7) is used for detection.
|
||||
- rockchip,mode: vad work mode.
|
||||
@@ -25,12 +26,13 @@ Example for rk3308 VAD controller:
|
||||
|
||||
vad: vad@ff3c0000 {
|
||||
compatible = "rockchip,rk3308-vad";
|
||||
reg = <0x0 0xff3c0000 0x0 0x10000>, <0x0 0xfff88000 0x0 0x38000>;
|
||||
reg-names = "vad", "vad-memory";
|
||||
reg = <0x0 0xff3c0000 0x0 0x10000>;
|
||||
reg-names = "vad";
|
||||
clocks = <&cru HCLK_VAD>;
|
||||
clock-names = "hclk";
|
||||
interrupts = <GIC_SPI 57 IRQ_TYPE_LEVEL_HIGH>;
|
||||
rockchip,audio-src = <0>;
|
||||
rockchip,audio-sram = <&vad_sram>;
|
||||
rockchip,audio-src = <&i2s_8ch_0>;
|
||||
rockchip,det-channel = <0>;
|
||||
rockchip,mode = <0>;
|
||||
status = "disabled";
|
||||
|
||||
@@ -979,12 +979,14 @@ static const struct of_device_id rockchip_vad_match[] = {
|
||||
static int rockchip_vad_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct device_node *np = pdev->dev.of_node;
|
||||
struct device_node *asrc_np;
|
||||
struct device_node *asrc_np = NULL;
|
||||
struct device_node *sram_np = NULL;
|
||||
const struct of_device_id *match;
|
||||
const struct regmap_config *regmap_config;
|
||||
struct rockchip_vad *vad;
|
||||
struct resource *res;
|
||||
struct resource audio_res;
|
||||
struct resource sram_res;
|
||||
void __iomem *regbase;
|
||||
int irq;
|
||||
int ret;
|
||||
@@ -1014,36 +1016,59 @@ static int rockchip_vad_probe(struct platform_device *pdev)
|
||||
of_property_read_u32(np, "rockchip,mode", &vad->mode);
|
||||
of_property_read_u32(np, "rockchip,det-channel", &vad->audio_chnl);
|
||||
of_property_read_u32(np, "rockchip,buffer-time-ms", &vad->buffer_time);
|
||||
asrc_np = of_parse_phandle(np, "rockchip,audio-src", 0);
|
||||
ret = of_address_to_resource(asrc_np, 0, &audio_res);
|
||||
if (ret)
|
||||
return ret;
|
||||
ret = rockchip_vad_get_audio_src_address(vad, audio_res.start);
|
||||
if (ret)
|
||||
return ret;
|
||||
vad->audio_node = asrc_np;
|
||||
vad->audio_src <<= AUDIO_SRC_SEL_SHIFT;
|
||||
|
||||
res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "vad");
|
||||
regbase = devm_ioremap_resource(&pdev->dev, res);
|
||||
if (IS_ERR(regbase))
|
||||
return PTR_ERR(regbase);
|
||||
|
||||
res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
|
||||
"vad-memory");
|
||||
vad->memphy = res->start;
|
||||
vad->memphy_end = res->end + 0x1 - 0x8;
|
||||
vad->membase = devm_ioremap_resource(&pdev->dev, res);
|
||||
if (IS_ERR(vad->membase))
|
||||
return PTR_ERR(vad->membase);
|
||||
sram_np = of_parse_phandle(np, "rockchip,audio-sram", 0);
|
||||
if (!sram_np) {
|
||||
dev_err(&pdev->dev, "could not find sram dt node\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
asrc_np = of_parse_phandle(np, "rockchip,audio-src", 0);
|
||||
if (!asrc_np) {
|
||||
ret = -ENODEV;
|
||||
goto err_phandle;
|
||||
}
|
||||
|
||||
ret = of_address_to_resource(asrc_np, 0, &audio_res);
|
||||
if (ret)
|
||||
goto err_phandle;
|
||||
ret = rockchip_vad_get_audio_src_address(vad, audio_res.start);
|
||||
if (ret)
|
||||
goto err_phandle;
|
||||
vad->audio_node = asrc_np;
|
||||
vad->audio_src <<= AUDIO_SRC_SEL_SHIFT;
|
||||
|
||||
ret = of_address_to_resource(sram_np, 0, &sram_res);
|
||||
if (ret)
|
||||
goto err_phandle;
|
||||
vad->memphy = sram_res.start;
|
||||
vad->memphy_end = sram_res.start + resource_size(&sram_res) - 0x8;
|
||||
vad->membase = devm_ioremap(&pdev->dev, sram_res.start,
|
||||
resource_size(&sram_res));
|
||||
if (!vad->membase) {
|
||||
ret = -ENOMEM;
|
||||
goto err_phandle;
|
||||
}
|
||||
|
||||
if (IS_ERR(vad->membase)) {
|
||||
ret = PTR_ERR(vad->membase);
|
||||
goto err_phandle;
|
||||
}
|
||||
|
||||
vad->hclk = devm_clk_get(&pdev->dev, "hclk");
|
||||
if (IS_ERR(vad->hclk))
|
||||
return PTR_ERR(vad->hclk);
|
||||
if (IS_ERR(vad->hclk)) {
|
||||
ret = PTR_ERR(vad->hclk);
|
||||
goto err_phandle;
|
||||
}
|
||||
|
||||
ret = clk_prepare_enable(vad->hclk);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto err_phandle;
|
||||
|
||||
vad->regmap = devm_regmap_init_mmio(&pdev->dev, regbase,
|
||||
regmap_config);
|
||||
@@ -1075,10 +1100,19 @@ static int rockchip_vad_probe(struct platform_device *pdev)
|
||||
#endif
|
||||
|
||||
platform_set_drvdata(pdev, vad);
|
||||
return snd_soc_register_codec(&pdev->dev, &soc_vad_codec,
|
||||
&vad_dai, 1);
|
||||
ret = snd_soc_register_codec(&pdev->dev, &soc_vad_codec,
|
||||
&vad_dai, 1);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
of_node_put(sram_np);
|
||||
|
||||
return 0;
|
||||
err:
|
||||
clk_disable_unprepare(vad->hclk);
|
||||
err_phandle:
|
||||
of_node_put(sram_np);
|
||||
of_node_put(asrc_np);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -1088,6 +1122,7 @@ static int rockchip_vad_remove(struct platform_device *pdev)
|
||||
|
||||
if (!IS_ERR(vad->hclk))
|
||||
clk_disable_unprepare(vad->hclk);
|
||||
of_node_put(vad->audio_node);
|
||||
snd_soc_unregister_codec(&pdev->dev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user