···1212- reg: physical base address of the controller and length of memory mapped1313 region.1414- interrupts: should contain the I2S interrupt.1515-- #address-cells: should be 1.1616-- #size-cells: should be 0.1715- dmas: DMA specifiers for tx and rx dma. See the DMA client binding,1816 Documentation/devicetree/bindings/dma/dma.txt1917- dma-names: should include "tx" and "rx".···1921- clock-names: should contain followings:2022 - "i2s_hclk": clock for I2S BUS2123 - "i2s_clk" : clock for I2S controller2424+- rockchip,capture-channels: max capture channels, if not set, 2 channels default.22252326Example for rk3288 I2S controller:2427···2728 compatible = "rockchip,rk3288-i2s", "rockchip,rk3066-i2s";2829 reg = <0xff890000 0x10000>;2930 interrupts = <GIC_SPI 85 IRQ_TYPE_LEVEL_HIGH>;3030- #address-cells = <1>;3131- #size-cells = <0>;3231 dmas = <&pdma1 0>, <&pdma1 1>;3332 dma-names = "tx", "rx";3433 clock-names = "i2s_hclk", "i2s_clk";3534 clocks = <&cru HCLK_I2S0>, <&cru SCLK_I2S0>;3535+ rockchip,capture-channels = <2>;3636};
···11+* Rockchip SPDIF transceiver22+33+The S/PDIF audio block is a stereo transceiver that allows the44+processor to receive and transmit digital audio via an coaxial cable or55+a fibre cable.66+77+Required properties:88+99+- compatible: should be one of the following:1010+ - "rockchip,rk3288-spdif", "rockchip,rk3188-spdif" or1111+ "rockchip,rk3066-spdif"1212+- reg: physical base address of the controller and length of memory mapped1313+ region.1414+- interrupts: should contain the SPDIF interrupt.1515+- dmas: DMA specifiers for tx dma. See the DMA client binding,1616+ Documentation/devicetree/bindings/dma/dma.txt1717+- dma-names: should be "tx"1818+- clocks: a list of phandle + clock-specifier pairs, one for each entry1919+ in clock-names.2020+- clock-names: should contain following:2121+ - "hclk": clock for SPDIF controller2222+ - "mclk" : clock for SPDIF bus2323+2424+Required properties on RK3288:2525+ - rockchip,grf: the phandle of the syscon node for the general register2626+ file (GRF)2727+2828+Example for the rk3188 SPDIF controller:2929+3030+spdif: spdif@0x1011e000 {3131+ compatible = "rockchip,rk3188-spdif", "rockchip,rk3066-spdif";3232+ reg = <0x1011e000 0x2000>;3333+ interrupts = <GIC_SPI 32 IRQ_TYPE_LEVEL_HIGH>;3434+ dmas = <&dmac1_s 8>;3535+ dma-names = "tx";3636+ clock-names = "hclk", "mclk";3737+ clocks = <&cru HCLK_SPDIF>, <&cru SCLK_SPDIF>;3838+ status = "disabled";3939+ #sound-dai-cells = <0>;4040+};
···1515 Rockchip I2S device. The device supports upto maximum of1616 8 channels each for play and record.17171818+config SND_SOC_ROCKCHIP_SPDIF1919+ tristate "Rockchip SPDIF Device Driver"2020+ depends on CLKDEV_LOOKUP && SND_SOC_ROCKCHIP2121+ select SND_SOC_GENERIC_DMAENGINE_PCM2222+ help2323+ Say Y or M if you want to add support for SPDIF driver for2424+ Rockchip SPDIF transceiver device.2525+1826config SND_SOC_ROCKCHIP_MAX980901927 tristate "ASoC support for Rockchip boards using a MAX98090 codec"2028 depends on SND_SOC_ROCKCHIP && I2C && GPIOLIB && CLKDEV_LOOKUP
···11+/* sound/soc/rockchip/rk_spdif.c22+ *33+ * ALSA SoC Audio Layer - Rockchip I2S Controller driver44+ *55+ * Copyright (c) 2014 Rockchip Electronics Co. Ltd.66+ * Author: Jianqun <jay.xu@rock-chips.com>77+ * Copyright (c) 2015 Collabora Ltd.88+ * Author: Sjoerd Simons <sjoerd.simons@collabora.co.uk>99+ *1010+ * This program is free software; you can redistribute it and/or modify1111+ * it under the terms of the GNU General Public License version 2 as1212+ * published by the Free Software Foundation.1313+ */1414+1515+#include <linux/module.h>1616+#include <linux/delay.h>1717+#include <linux/of_gpio.h>1818+#include <linux/clk.h>1919+#include <linux/pm_runtime.h>2020+#include <linux/mfd/syscon.h>2121+#include <linux/regmap.h>2222+#include <sound/pcm_params.h>2323+#include <sound/dmaengine_pcm.h>2424+2525+#include "rockchip_spdif.h"2626+2727+enum rk_spdif_type {2828+ RK_SPDIF_RK3066,2929+ RK_SPDIF_RK3188,3030+ RK_SPDIF_RK3288,3131+};3232+3333+#define RK3288_GRF_SOC_CON2 0x24c3434+3535+struct rk_spdif_dev {3636+ struct device *dev;3737+3838+ struct clk *mclk;3939+ struct clk *hclk;4040+4141+ struct snd_dmaengine_dai_dma_data playback_dma_data;4242+4343+ struct regmap *regmap;4444+};4545+4646+static const struct of_device_id rk_spdif_match[] = {4747+ { .compatible = "rockchip,rk3066-spdif",4848+ .data = (void *) RK_SPDIF_RK3066 },4949+ { .compatible = "rockchip,rk3188-spdif",5050+ .data = (void *) RK_SPDIF_RK3188 },5151+ { .compatible = "rockchip,rk3288-spdif",5252+ .data = (void *) RK_SPDIF_RK3288 },5353+ {},5454+};5555+MODULE_DEVICE_TABLE(of, rk_spdif_match);5656+5757+static int rk_spdif_runtime_suspend(struct device *dev)5858+{5959+ struct rk_spdif_dev *spdif = dev_get_drvdata(dev);6060+6161+ clk_disable_unprepare(spdif->mclk);6262+ clk_disable_unprepare(spdif->hclk);6363+6464+ return 0;6565+}6666+6767+static int rk_spdif_runtime_resume(struct device *dev)6868+{6969+ struct rk_spdif_dev *spdif = dev_get_drvdata(dev);7070+ int ret;7171+7272+ ret = clk_prepare_enable(spdif->mclk);7373+ if (ret) {7474+ dev_err(spdif->dev, "mclk clock enable failed %d\n", ret);7575+ return ret;7676+ }7777+7878+ ret = clk_prepare_enable(spdif->hclk);7979+ if (ret) {8080+ dev_err(spdif->dev, "hclk clock enable failed %d\n", ret);8181+ return ret;8282+ }8383+8484+ return 0;8585+}8686+8787+static int rk_spdif_hw_params(struct snd_pcm_substream *substream,8888+ struct snd_pcm_hw_params *params,8989+ struct snd_soc_dai *dai)9090+{9191+ struct rk_spdif_dev *spdif = snd_soc_dai_get_drvdata(dai);9292+ unsigned int val = SPDIF_CFGR_HALFWORD_ENABLE;9393+ int srate, mclk;9494+ int ret;9595+9696+ srate = params_rate(params);9797+ switch (srate) {9898+ case 32000:9999+ case 48000:100100+ case 96000:101101+ mclk = 96000 * 128; /* 12288000 hz */102102+ break;103103+ case 44100:104104+ mclk = 44100 * 256; /* 11289600 hz */105105+ break;106106+ case 192000:107107+ mclk = 192000 * 128; /* 24576000 hz */108108+ break;109109+ default:110110+ return -EINVAL;111111+ }112112+113113+ switch (params_format(params)) {114114+ case SNDRV_PCM_FORMAT_S16_LE:115115+ val |= SPDIF_CFGR_VDW_16;116116+ break;117117+ case SNDRV_PCM_FORMAT_S20_3LE:118118+ val |= SPDIF_CFGR_VDW_20;119119+ break;120120+ case SNDRV_PCM_FORMAT_S24_LE:121121+ val |= SPDIF_CFGR_VDW_24;122122+ break;123123+ default:124124+ return -EINVAL;125125+ }126126+127127+ /* Set clock and calculate divider */128128+ ret = clk_set_rate(spdif->mclk, mclk);129129+ if (ret != 0) {130130+ dev_err(spdif->dev, "Failed to set module clock rate: %d\n",131131+ ret);132132+ return ret;133133+ }134134+135135+ val |= SPDIF_CFGR_CLK_DIV(mclk/(srate * 256));136136+ ret = regmap_update_bits(spdif->regmap, SPDIF_CFGR,137137+ SPDIF_CFGR_CLK_DIV_MASK | SPDIF_CFGR_HALFWORD_ENABLE |138138+ SDPIF_CFGR_VDW_MASK,139139+ val);140140+141141+ return ret;142142+}143143+144144+static int rk_spdif_trigger(struct snd_pcm_substream *substream,145145+ int cmd, struct snd_soc_dai *dai)146146+{147147+ struct rk_spdif_dev *spdif = snd_soc_dai_get_drvdata(dai);148148+ int ret;149149+150150+ switch (cmd) {151151+ case SNDRV_PCM_TRIGGER_START:152152+ case SNDRV_PCM_TRIGGER_RESUME:153153+ case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:154154+ ret = regmap_update_bits(spdif->regmap, SPDIF_DMACR,155155+ SPDIF_DMACR_TDE_ENABLE,156156+ SPDIF_DMACR_TDE_ENABLE);157157+158158+ if (ret != 0)159159+ return ret;160160+161161+ ret = regmap_update_bits(spdif->regmap, SPDIF_XFER,162162+ SPDIF_XFER_TXS_START,163163+ SPDIF_XFER_TXS_START);164164+ break;165165+ case SNDRV_PCM_TRIGGER_SUSPEND:166166+ case SNDRV_PCM_TRIGGER_STOP:167167+ case SNDRV_PCM_TRIGGER_PAUSE_PUSH:168168+ ret = regmap_update_bits(spdif->regmap, SPDIF_DMACR,169169+ SPDIF_DMACR_TDE_ENABLE,170170+ SPDIF_DMACR_TDE_DISABLE);171171+172172+ if (ret != 0)173173+ return ret;174174+175175+ ret = regmap_update_bits(spdif->regmap, SPDIF_XFER,176176+ SPDIF_XFER_TXS_START,177177+ SPDIF_XFER_TXS_STOP);178178+ break;179179+ default:180180+ ret = -EINVAL;181181+ break;182182+ }183183+184184+ return ret;185185+}186186+187187+static int rk_spdif_dai_probe(struct snd_soc_dai *dai)188188+{189189+ struct rk_spdif_dev *spdif = snd_soc_dai_get_drvdata(dai);190190+191191+ dai->playback_dma_data = &spdif->playback_dma_data;192192+193193+ return 0;194194+}195195+196196+static const struct snd_soc_dai_ops rk_spdif_dai_ops = {197197+ .hw_params = rk_spdif_hw_params,198198+ .trigger = rk_spdif_trigger,199199+};200200+201201+static struct snd_soc_dai_driver rk_spdif_dai = {202202+ .probe = rk_spdif_dai_probe,203203+ .playback = {204204+ .stream_name = "Playback",205205+ .channels_min = 2,206206+ .channels_max = 2,207207+ .rates = (SNDRV_PCM_RATE_32000 |208208+ SNDRV_PCM_RATE_44100 |209209+ SNDRV_PCM_RATE_48000 |210210+ SNDRV_PCM_RATE_96000 |211211+ SNDRV_PCM_RATE_192000),212212+ .formats = (SNDRV_PCM_FMTBIT_S16_LE |213213+ SNDRV_PCM_FMTBIT_S20_3LE |214214+ SNDRV_PCM_FMTBIT_S24_LE),215215+ },216216+ .ops = &rk_spdif_dai_ops,217217+};218218+219219+static const struct snd_soc_component_driver rk_spdif_component = {220220+ .name = "rockchip-spdif",221221+};222222+223223+static bool rk_spdif_wr_reg(struct device *dev, unsigned int reg)224224+{225225+ switch (reg) {226226+ case SPDIF_CFGR:227227+ case SPDIF_DMACR:228228+ case SPDIF_INTCR:229229+ case SPDIF_XFER:230230+ case SPDIF_SMPDR:231231+ return true;232232+ default:233233+ return false;234234+ }235235+}236236+237237+static bool rk_spdif_rd_reg(struct device *dev, unsigned int reg)238238+{239239+ switch (reg) {240240+ case SPDIF_CFGR:241241+ case SPDIF_SDBLR:242242+ case SPDIF_INTCR:243243+ case SPDIF_INTSR:244244+ case SPDIF_XFER:245245+ return true;246246+ default:247247+ return false;248248+ }249249+}250250+251251+static bool rk_spdif_volatile_reg(struct device *dev, unsigned int reg)252252+{253253+ switch (reg) {254254+ case SPDIF_INTSR:255255+ case SPDIF_SDBLR:256256+ return true;257257+ default:258258+ return false;259259+ }260260+}261261+262262+static const struct regmap_config rk_spdif_regmap_config = {263263+ .reg_bits = 32,264264+ .reg_stride = 4,265265+ .val_bits = 32,266266+ .max_register = SPDIF_SMPDR,267267+ .writeable_reg = rk_spdif_wr_reg,268268+ .readable_reg = rk_spdif_rd_reg,269269+ .volatile_reg = rk_spdif_volatile_reg,270270+ .cache_type = REGCACHE_FLAT,271271+};272272+273273+static int rk_spdif_probe(struct platform_device *pdev)274274+{275275+ struct device_node *np = pdev->dev.of_node;276276+ struct rk_spdif_dev *spdif;277277+ const struct of_device_id *match;278278+ struct resource *res;279279+ void __iomem *regs;280280+ int ret;281281+282282+ match = of_match_node(rk_spdif_match, np);283283+ if ((int) match->data == RK_SPDIF_RK3288) {284284+ struct regmap *grf;285285+286286+ grf = syscon_regmap_lookup_by_phandle(np, "rockchip,grf");287287+ if (IS_ERR(grf)) {288288+ dev_err(&pdev->dev,289289+ "rockchip_spdif missing 'rockchip,grf' \n");290290+ return PTR_ERR(grf);291291+ }292292+293293+ /* Select the 8 channel SPDIF solution on RK3288 as294294+ * the 2 channel one does not appear to work295295+ */296296+ regmap_write(grf, RK3288_GRF_SOC_CON2, BIT(1) << 16);297297+ }298298+299299+ spdif = devm_kzalloc(&pdev->dev, sizeof(*spdif), GFP_KERNEL);300300+ if (!spdif)301301+ return -ENOMEM;302302+303303+ spdif->hclk = devm_clk_get(&pdev->dev, "hclk");304304+ if (IS_ERR(spdif->hclk)) {305305+ dev_err(&pdev->dev, "Can't retrieve rk_spdif bus clock\n");306306+ return PTR_ERR(spdif->hclk);307307+ }308308+ ret = clk_prepare_enable(spdif->hclk);309309+ if (ret) {310310+ dev_err(spdif->dev, "hclock enable failed %d\n", ret);311311+ return ret;312312+ }313313+314314+ spdif->mclk = devm_clk_get(&pdev->dev, "mclk");315315+ if (IS_ERR(spdif->mclk)) {316316+ dev_err(&pdev->dev, "Can't retrieve rk_spdif master clock\n");317317+ return PTR_ERR(spdif->mclk);318318+ }319319+320320+ ret = clk_prepare_enable(spdif->mclk);321321+ if (ret) {322322+ dev_err(spdif->dev, "clock enable failed %d\n", ret);323323+ return ret;324324+ }325325+326326+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);327327+ regs = devm_ioremap_resource(&pdev->dev, res);328328+ if (IS_ERR(regs))329329+ return PTR_ERR(regs);330330+331331+ spdif->regmap = devm_regmap_init_mmio_clk(&pdev->dev, "hclk", regs,332332+ &rk_spdif_regmap_config);333333+ if (IS_ERR(spdif->regmap)) {334334+ dev_err(&pdev->dev,335335+ "Failed to initialise managed register map\n");336336+ return PTR_ERR(spdif->regmap);337337+ }338338+339339+ spdif->playback_dma_data.addr = res->start + SPDIF_SMPDR;340340+ spdif->playback_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;341341+ spdif->playback_dma_data.maxburst = 4;342342+343343+ spdif->dev = &pdev->dev;344344+ dev_set_drvdata(&pdev->dev, spdif);345345+346346+ pm_runtime_set_active(&pdev->dev);347347+ pm_runtime_enable(&pdev->dev);348348+ pm_request_idle(&pdev->dev);349349+350350+ ret = devm_snd_soc_register_component(&pdev->dev,351351+ &rk_spdif_component,352352+ &rk_spdif_dai, 1);353353+ if (ret) {354354+ dev_err(&pdev->dev, "Could not register DAI\n");355355+ goto err_pm_runtime;356356+ }357357+358358+ ret = devm_snd_dmaengine_pcm_register(&pdev->dev, NULL, 0);359359+ if (ret) {360360+ dev_err(&pdev->dev, "Could not register PCM\n");361361+ goto err_pm_runtime;362362+ }363363+364364+ return 0;365365+366366+err_pm_runtime:367367+ pm_runtime_disable(&pdev->dev);368368+369369+ return ret;370370+}371371+372372+static int rk_spdif_remove(struct platform_device *pdev)373373+{374374+ struct rk_spdif_dev *spdif = dev_get_drvdata(&pdev->dev);375375+376376+ pm_runtime_disable(&pdev->dev);377377+ if (!pm_runtime_status_suspended(&pdev->dev))378378+ rk_spdif_runtime_suspend(&pdev->dev);379379+380380+ clk_disable_unprepare(spdif->mclk);381381+ clk_disable_unprepare(spdif->hclk);382382+383383+ return 0;384384+}385385+386386+static const struct dev_pm_ops rk_spdif_pm_ops = {387387+ SET_RUNTIME_PM_OPS(rk_spdif_runtime_suspend, rk_spdif_runtime_resume,388388+ NULL)389389+};390390+391391+static struct platform_driver rk_spdif_driver = {392392+ .probe = rk_spdif_probe,393393+ .remove = rk_spdif_remove,394394+ .driver = {395395+ .name = "rockchip-spdif",396396+ .of_match_table = of_match_ptr(rk_spdif_match),397397+ .pm = &rk_spdif_pm_ops,398398+ },399399+};400400+module_platform_driver(rk_spdif_driver);401401+402402+MODULE_ALIAS("platform:rockchip-spdif");403403+MODULE_DESCRIPTION("ROCKCHIP SPDIF transceiver Interface");404404+MODULE_AUTHOR("Sjoerd Simons <sjoerd.simons@collabora.co.uk>");405405+MODULE_LICENSE("GPL v2");
+63
sound/soc/rockchip/rockchip_spdif.h
···11+/*22+ * ALSA SoC Audio Layer - Rockchip SPDIF transceiver driver33+ *44+ * Copyright (c) 2015 Collabora Ltd.55+ * Author: Sjoerd Simons <sjoerd.simons@collabora.co.uk>66+ *77+ * This program is free software; you can redistribute it and/or modify88+ * it under the terms of the GNU General Public License version 2 as99+ * published by the Free Software Foundation.1010+ */1111+1212+#ifndef _ROCKCHIP_SPDIF_H1313+#define _ROCKCHIP_SPDIF_H1414+1515+/*1616+ * CFGR1717+ * transfer configuration register1818+*/1919+#define SPDIF_CFGR_CLK_DIV_SHIFT (16)2020+#define SPDIF_CFGR_CLK_DIV_MASK (0xff << SPDIF_CFGR_CLK_DIV_SHIFT)2121+#define SPDIF_CFGR_CLK_DIV(x) (x << SPDIF_CFGR_CLK_DIV_SHIFT)2222+2323+#define SPDIF_CFGR_HALFWORD_SHIFT 22424+#define SPDIF_CFGR_HALFWORD_DISABLE (0 << SPDIF_CFGR_HALFWORD_SHIFT)2525+#define SPDIF_CFGR_HALFWORD_ENABLE (1 << SPDIF_CFGR_HALFWORD_SHIFT)2626+2727+#define SPDIF_CFGR_VDW_SHIFT 02828+#define SPDIF_CFGR_VDW(x) (x << SPDIF_CFGR_VDW_SHIFT)2929+#define SDPIF_CFGR_VDW_MASK (0xf << SPDIF_CFGR_VDW_SHIFT)3030+3131+#define SPDIF_CFGR_VDW_16 SPDIF_CFGR_VDW(0x00)3232+#define SPDIF_CFGR_VDW_20 SPDIF_CFGR_VDW(0x01)3333+#define SPDIF_CFGR_VDW_24 SPDIF_CFGR_VDW(0x10)3434+3535+/*3636+ * DMACR3737+ * DMA control register3838+*/3939+#define SPDIF_DMACR_TDE_SHIFT 54040+#define SPDIF_DMACR_TDE_DISABLE (0 << SPDIF_DMACR_TDE_SHIFT)4141+#define SPDIF_DMACR_TDE_ENABLE (1 << SPDIF_DMACR_TDE_SHIFT)4242+4343+#define SPDIF_DMACR_TDL_SHIFT 04444+#define SPDIF_DMACR_TDL(x) ((x) << SPDIF_DMACR_TDL_SHIFT)4545+#define SPDIF_DMACR_TDL_MASK (0x1f << SDPIF_DMACR_TDL_SHIFT)4646+4747+/*4848+ * XFER4949+ * Transfer control register5050+*/5151+#define SPDIF_XFER_TXS_SHIFT 05252+#define SPDIF_XFER_TXS_STOP (0 << SPDIF_XFER_TXS_SHIFT)5353+#define SPDIF_XFER_TXS_START (1 << SPDIF_XFER_TXS_SHIFT)5454+5555+#define SPDIF_CFGR (0x0000)5656+#define SPDIF_SDBLR (0x0004)5757+#define SPDIF_DMACR (0x0008)5858+#define SPDIF_INTCR (0x000c)5959+#define SPDIF_INTSR (0x0010)6060+#define SPDIF_XFER (0x0018)6161+#define SPDIF_SMPDR (0x0020)6262+6363+#endif /* _ROCKCHIP_SPDIF_H */
+1-2
sound/soc/sh/rcar/adg.c
···6969static u32 rsnd_adg_ssi_ws_timing_gen2(struct rsnd_dai_stream *io)7070{7171 struct rsnd_mod *mod = rsnd_io_to_mod_ssi(io);7272- struct rsnd_priv *priv = rsnd_mod_to_priv(mod);7372 int id = rsnd_mod_id(mod);7473 int ws = id;75747676- if (rsnd_ssi_is_pin_sharing(rsnd_ssi_mod_get(priv, id))) {7575+ if (rsnd_ssi_is_pin_sharing(io)) {7776 switch (id) {7877 case 1:7978 case 2:
+15-39
sound/soc/sh/rcar/core.c
···300300/*301301 * rsnd_dai functions302302 */303303-#define __rsnd_mod_call(mod, io, func, param...) \303303+#define rsnd_mod_call(mod, io, func, param...) \304304({ \305305 struct rsnd_priv *priv = rsnd_mod_to_priv(mod); \306306 struct device *dev = rsnd_priv_to_dev(priv); \···308308 u8 val = (mod->status >> __rsnd_mod_shift_##func) & 0xF; \309309 u8 add = ((val + __rsnd_mod_add_##func) & 0xF); \310310 int ret = 0; \311311- int called = 0; \312312- if (val == __rsnd_mod_call_##func) { \313313- called = 1; \314314- ret = (mod)->ops->func(mod, io, param); \315315- } \311311+ int call = (val == __rsnd_mod_call_##func) && (mod)->ops->func; \316312 mod->status = (mod->status & ~mask) + \317313 (add << __rsnd_mod_shift_##func); \318318- dev_dbg(dev, "%s[%d] 0x%08x %s\n", \319319- rsnd_mod_name(mod), rsnd_mod_id(mod), mod->status, \320320- called ? #func : ""); \314314+ dev_dbg(dev, "%s[%d]\t0x%08x %s\n", \315315+ rsnd_mod_name(mod), rsnd_mod_id(mod), \316316+ mod->status, call ? #func : ""); \317317+ if (call) \318318+ ret = (mod)->ops->func(mod, io, param); \321319 ret; \322320})323323-324324-#define rsnd_mod_call(mod, io, func, param...) \325325- (!(mod) ? -ENODEV : \326326- !((mod)->ops->func) ? 0 : \327327- __rsnd_mod_call(mod, io, func, param))328321329322#define rsnd_dai_call(fn, io, param...) \330323({ \···327334 mod = (io)->mod[i]; \328335 if (!mod) \329336 continue; \330330- ret = rsnd_mod_call(mod, io, fn, param); \331331- if (ret < 0) \332332- break; \337337+ ret |= rsnd_mod_call(mod, io, fn, param); \333338 } \334339 ret; \335340})···493502 break;494503 case SNDRV_PCM_TRIGGER_STOP:495504 ret = rsnd_dai_call(stop, io, priv);496496- if (ret < 0)497497- goto dai_trigger_end;498505499499- ret = rsnd_dai_call(quit, io, priv);500500- if (ret < 0)501501- goto dai_trigger_end;506506+ ret |= rsnd_dai_call(quit, io, priv);502507503503- ret = rsnd_platform_call(priv, dai, stop, ssi_id);504504- if (ret < 0)505505- goto dai_trigger_end;508508+ ret |= rsnd_platform_call(priv, dai, stop, ssi_id);506509507510 rsnd_dai_stream_quit(io);508511 break;···12211236 };12221237 int ret, i;1223123812241224- info = NULL;12251225- of_data = NULL;12261226- if (of_id) {12271227- info = devm_kzalloc(&pdev->dev,12281228- sizeof(struct rcar_snd_info), GFP_KERNEL);12291229- of_data = of_id->data;12301230- } else {12311231- info = pdev->dev.platform_data;12321232- }12331233-12341234- if (!info) {12351235- dev_err(dev, "driver needs R-Car sound information\n");12361236- return -ENODEV;12371237- }12391239+ info = devm_kzalloc(&pdev->dev, sizeof(struct rcar_snd_info),12401240+ GFP_KERNEL);12411241+ if (!info)12421242+ return -ENOMEM;12431243+ of_data = of_id->data;1238124412391245 /*12401246 * init priv data
+4-6
sound/soc/sh/rcar/ctu.c
···3535 struct rsnd_dai_stream *io,3636 struct rsnd_priv *priv)3737{3838- rsnd_mod_hw_start(mod);3838+ rsnd_mod_power_on(mod);39394040 rsnd_ctu_initialize_lock(mod);4141···5050 struct rsnd_dai_stream *io,5151 struct rsnd_priv *priv)5252{5353- rsnd_mod_hw_stop(mod);5353+ rsnd_mod_power_off(mod);54545555 return 0;5656}···118118 int i, nr, ret;119119120120 /* This driver doesn't support Gen1 at this point */121121- if (rsnd_is_gen1(priv)) {122122- dev_warn(dev, "CTU is not supported on Gen1\n");123123- return -EINVAL;124124- }121121+ if (rsnd_is_gen1(priv))122122+ return 0;125123126124 rsnd_of_parse_ctu(pdev, of_data, priv);127125
+1-1
sound/soc/sh/rcar/dma.c
···470470 dev_err(dev, "DVC is selected without SRC\n");471471472472 /* use SSIU or SSI ? */473473- if (is_ssi && rsnd_ssi_use_busif(io, mod))473473+ if (is_ssi && rsnd_ssi_use_busif(io))474474 is_ssi++;475475476476 return (is_from) ?
+4-6
sound/soc/sh/rcar/dvc.c
···153153 struct rsnd_dai_stream *io,154154 struct rsnd_priv *priv)155155{156156- rsnd_mod_hw_start(mod);156156+ rsnd_mod_power_on(mod);157157158158 rsnd_dvc_soft_reset(mod);159159···175175 struct rsnd_dai_stream *io,176176 struct rsnd_priv *priv)177177{178178- rsnd_mod_hw_stop(mod);178178+ rsnd_mod_power_off(mod);179179180180 return 0;181181}···333333 int i, nr, ret;334334335335 /* This driver doesn't support Gen1 at this point */336336- if (rsnd_is_gen1(priv)) {337337- dev_warn(dev, "CMD is not supported on Gen1\n");338338- return -EINVAL;339339- }336336+ if (rsnd_is_gen1(priv))337337+ return 0;340338341339 rsnd_of_parse_dvc(pdev, of_data, priv);342340
···5858 struct rsnd_dai_stream *io,5959 struct rsnd_priv *priv)6060{6161- rsnd_mod_hw_start(mod);6161+ rsnd_mod_power_on(mod);62626363 rsnd_mix_soft_reset(mod);6464···8383 struct rsnd_dai_stream *io,8484 struct rsnd_priv *priv)8585{8686- rsnd_mod_hw_stop(mod);8686+ rsnd_mod_power_off(mod);87878888 return 0;8989}···151151 int i, nr, ret;152152153153 /* This driver doesn't support Gen1 at this point */154154- if (rsnd_is_gen1(priv)) {155155- dev_warn(dev, "MIX is not supported on Gen1\n");156156- return -EINVAL;157157- }154154+ if (rsnd_is_gen1(priv))155155+ return 0;158156159157 rsnd_of_parse_mix(pdev, of_data, priv);160158