On Fri, Aug 07, 2015 at 01:44:12PM +0200, Sjoerd Simons wrote: > Changes in v2: > - Remove platform: module alias as it was unused Ugh, I see Paul Bolle replied to one of your earlier patches :/ Please just ignore him, he doesn't understand that we don't require machine definitions to be in tree. A platform: module alias is useful for any platform device. > +static inline struct rk_spdif_dev *to_info(struct snd_soc_dai *dai) > +{ > + return snd_soc_dai_get_drvdata(dai); > +} I'm not sure this is adding much to the two users but whatever. > +static int rk_spdif_snd_txctrl(struct rk_spdif_dev *spdif, int on) > +{ > + int ret; > + > + if (on) { > + ret = regmap_update_bits(spdif->regmap, SPDIF_DMACR, > + SPDIF_DMACR_TDE_ENABLE, > + SPDIF_DMACR_TDE_ENABLE); > + > + if (ret != 0) > + goto bail; > + > + ret = regmap_update_bits(spdif->regmap, SPDIF_XFER, > + SPDIF_XFER_TXS_START, > + SPDIF_XFER_TXS_START); This function has no common code, just two branches in an if/else that share nothing and is called from a single location. Why not just inline this into the trigger function? > + /* Set clock and calculate divider */ > + clk_set_rate(spdif->mclk, mclk); We should check the return value of clk_set_rate(). > + spdif->hclk = devm_clk_get(&pdev->dev, "spdif_hclk"); > + if (IS_ERR(spdif->hclk)) { > + dev_err(&pdev->dev, "Can't retrieve rk_spdif bus clock\n"); > + return PTR_ERR(spdif->hclk); > + } > + ret = clk_prepare_enable(spdif->hclk); > + if (ret) { > + dev_err(spdif->dev, "hclock enable failed %d\n", ret); > + return ret; > + } I notice that we don't manage the hclk over suspend/resume - should we perhaps be using regmap_init_mmio_clk() together with runtime PM to manage it? > + pm_runtime_enable(&pdev->dev); > + if (!pm_runtime_enabled(&pdev->dev)) { > + ret = rk_spdif_runtime_resume(&pdev->dev); > + if (ret) > + goto err_pm_disable; > + } The normal pattern with this is to start the device powered up then idle it - this does mean we need to bounce the power on but fitting in with the common pattern is good and it's less conditional code.