Lines Matching refs:dev

131 static bool mchp_spdifrx_readable_reg(struct device *dev, unsigned int reg)  in mchp_spdifrx_readable_reg()  argument
171 static bool mchp_spdifrx_writeable_reg(struct device *dev, unsigned int reg) in mchp_spdifrx_writeable_reg() argument
185 static bool mchp_spdifrx_precious_reg(struct device *dev, unsigned int reg) in mchp_spdifrx_precious_reg() argument
196 static bool mchp_spdifrx_volatile_reg(struct device *dev, unsigned int reg) in mchp_spdifrx_volatile_reg() argument
303 struct device *dev; member
310 static void mchp_spdifrx_channel_status_read(struct mchp_spdifrx_dev *dev, in mchp_spdifrx_channel_status_read() argument
313 struct mchp_spdifrx_mixer_control *ctrl = &dev->control; in mchp_spdifrx_channel_status_read()
319 regmap_read(dev->regmap, SPDIFRX_CHSR(channel, i), &val); in mchp_spdifrx_channel_status_read()
327 static void mchp_spdifrx_channel_user_data_read(struct mchp_spdifrx_dev *dev, in mchp_spdifrx_channel_user_data_read() argument
330 struct mchp_spdifrx_mixer_control *ctrl = &dev->control; in mchp_spdifrx_channel_user_data_read()
336 regmap_read(dev->regmap, SPDIFRX_CHUD(channel, i), &val); in mchp_spdifrx_channel_user_data_read()
346 struct mchp_spdifrx_dev *dev = dev_id; in mchp_spdif_interrupt() local
347 struct mchp_spdifrx_mixer_control *ctrl = &dev->control; in mchp_spdif_interrupt()
352 regmap_read(dev->regmap, SPDIFRX_ISR, &sr); in mchp_spdif_interrupt()
353 regmap_read(dev->regmap, SPDIFRX_IMR, &imr); in mchp_spdif_interrupt()
355 dev_dbg(dev->dev, "ISR: %#x, IMR: %#x, pending: %#x\n", sr, imr, in mchp_spdif_interrupt()
363 mchp_spdifrx_channel_user_data_read(dev, ch); in mchp_spdif_interrupt()
366 regmap_write(dev->regmap, SPDIFRX_IDR, SPDIFRX_IR_BLOCKEND); in mchp_spdif_interrupt()
372 mchp_spdifrx_channel_status_read(dev, ch); in mchp_spdif_interrupt()
374 regmap_write(dev->regmap, SPDIFRX_IDR, SPDIFRX_IR_CSC(ch)); in mchp_spdif_interrupt()
380 dev_warn(dev->dev, "Overrun detected\n"); in mchp_spdif_interrupt()
390 struct mchp_spdifrx_dev *dev = snd_soc_dai_get_drvdata(dai); in mchp_spdifrx_trigger() local
397 mutex_lock(&dev->mlock); in mchp_spdifrx_trigger()
399 regmap_write(dev->regmap, SPDIFRX_IER, SPDIFRX_IR_OVERRUN); in mchp_spdifrx_trigger()
402 regmap_update_bits(dev->regmap, SPDIFRX_MR, SPDIFRX_MR_RXEN_MASK, in mchp_spdifrx_trigger()
404 dev->trigger_enabled = true; in mchp_spdifrx_trigger()
405 mutex_unlock(&dev->mlock); in mchp_spdifrx_trigger()
410 mutex_lock(&dev->mlock); in mchp_spdifrx_trigger()
412 regmap_write(dev->regmap, SPDIFRX_IDR, SPDIFRX_IR_OVERRUN); in mchp_spdifrx_trigger()
415 regmap_update_bits(dev->regmap, SPDIFRX_MR, SPDIFRX_MR_RXEN_MASK, in mchp_spdifrx_trigger()
417 dev->trigger_enabled = false; in mchp_spdifrx_trigger()
418 mutex_unlock(&dev->mlock); in mchp_spdifrx_trigger()
431 struct mchp_spdifrx_dev *dev = snd_soc_dai_get_drvdata(dai); in mchp_spdifrx_hw_params() local
435 dev_dbg(dev->dev, "%s() rate=%u format=%#x width=%u channels=%u\n", in mchp_spdifrx_hw_params()
440 dev_err(dev->dev, "Playback is not supported\n"); in mchp_spdifrx_hw_params()
445 dev_err(dev->dev, "unsupported number of channels: %d\n", in mchp_spdifrx_hw_params()
464 dev_err(dev->dev, "unsupported PCM format: %d\n", in mchp_spdifrx_hw_params()
469 mutex_lock(&dev->mlock); in mchp_spdifrx_hw_params()
470 if (dev->trigger_enabled) { in mchp_spdifrx_hw_params()
471 dev_err(dev->dev, "PCM already running\n"); in mchp_spdifrx_hw_params()
477 clk_disable_unprepare(dev->gclk); in mchp_spdifrx_hw_params()
479 ret = clk_set_min_rate(dev->gclk, params_rate(params) * in mchp_spdifrx_hw_params()
482 dev_err(dev->dev, in mchp_spdifrx_hw_params()
486 clk_prepare_enable(dev->gclk); in mchp_spdifrx_hw_params()
489 ret = clk_prepare_enable(dev->gclk); in mchp_spdifrx_hw_params()
491 dev_err(dev->dev, "unable to enable gclk: %d\n", ret); in mchp_spdifrx_hw_params()
495 dev_dbg(dev->dev, "GCLK range min set to %d\n", in mchp_spdifrx_hw_params()
498 ret = regmap_write(dev->regmap, SPDIFRX_MR, mr); in mchp_spdifrx_hw_params()
501 mutex_unlock(&dev->mlock); in mchp_spdifrx_hw_params()
527 static int mchp_spdifrx_cs_get(struct mchp_spdifrx_dev *dev, in mchp_spdifrx_cs_get() argument
531 struct mchp_spdifrx_mixer_control *ctrl = &dev->control; in mchp_spdifrx_cs_get()
535 mutex_lock(&dev->mlock); in mchp_spdifrx_cs_get()
537 ret = pm_runtime_resume_and_get(dev->dev); in mchp_spdifrx_cs_get()
555 if (dev->trigger_enabled) { in mchp_spdifrx_cs_get()
557 regmap_write(dev->regmap, SPDIFRX_IER, SPDIFRX_IR_CSC(channel)); in mchp_spdifrx_cs_get()
563 dev_dbg(dev->dev, "channel status for channel %d timeout\n", in mchp_spdifrx_cs_get()
565 regmap_write(dev->regmap, SPDIFRX_IDR, SPDIFRX_IR_CSC(channel)); in mchp_spdifrx_cs_get()
573 mchp_spdifrx_channel_status_read(dev, channel); in mchp_spdifrx_cs_get()
580 pm_runtime_mark_last_busy(dev->dev); in mchp_spdifrx_cs_get()
581 pm_runtime_put_autosuspend(dev->dev); in mchp_spdifrx_cs_get()
583 mutex_unlock(&dev->mlock); in mchp_spdifrx_cs_get()
591 struct mchp_spdifrx_dev *dev = snd_soc_dai_get_drvdata(dai); in mchp_spdifrx_cs1_get() local
593 return mchp_spdifrx_cs_get(dev, 0, uvalue); in mchp_spdifrx_cs1_get()
600 struct mchp_spdifrx_dev *dev = snd_soc_dai_get_drvdata(dai); in mchp_spdifrx_cs2_get() local
602 return mchp_spdifrx_cs_get(dev, 1, uvalue); in mchp_spdifrx_cs2_get()
614 static int mchp_spdifrx_subcode_ch_get(struct mchp_spdifrx_dev *dev, in mchp_spdifrx_subcode_ch_get() argument
618 struct mchp_spdifrx_mixer_control *ctrl = &dev->control; in mchp_spdifrx_subcode_ch_get()
622 mutex_lock(&dev->mlock); in mchp_spdifrx_subcode_ch_get()
624 ret = pm_runtime_resume_and_get(dev->dev); in mchp_spdifrx_subcode_ch_get()
639 if (dev->trigger_enabled) { in mchp_spdifrx_subcode_ch_get()
641 regmap_write(dev->regmap, SPDIFRX_IER, SPDIFRX_IR_BLOCKEND); in mchp_spdifrx_subcode_ch_get()
646 dev_dbg(dev->dev, "user data for channel %d timeout\n", in mchp_spdifrx_subcode_ch_get()
648 regmap_write(dev->regmap, SPDIFRX_IDR, SPDIFRX_IR_BLOCKEND); in mchp_spdifrx_subcode_ch_get()
656 mchp_spdifrx_channel_user_data_read(dev, channel); in mchp_spdifrx_subcode_ch_get()
663 pm_runtime_mark_last_busy(dev->dev); in mchp_spdifrx_subcode_ch_get()
664 pm_runtime_put_autosuspend(dev->dev); in mchp_spdifrx_subcode_ch_get()
666 mutex_unlock(&dev->mlock); in mchp_spdifrx_subcode_ch_get()
674 struct mchp_spdifrx_dev *dev = snd_soc_dai_get_drvdata(dai); in mchp_spdifrx_subcode_ch1_get() local
676 return mchp_spdifrx_subcode_ch_get(dev, 0, uvalue); in mchp_spdifrx_subcode_ch1_get()
683 struct mchp_spdifrx_dev *dev = snd_soc_dai_get_drvdata(dai); in mchp_spdifrx_subcode_ch2_get() local
685 return mchp_spdifrx_subcode_ch_get(dev, 1, uvalue); in mchp_spdifrx_subcode_ch2_get()
703 struct mchp_spdifrx_dev *dev = snd_soc_dai_get_drvdata(dai); in mchp_spdifrx_ulock_get() local
704 struct mchp_spdifrx_mixer_control *ctrl = &dev->control; in mchp_spdifrx_ulock_get()
709 mutex_lock(&dev->mlock); in mchp_spdifrx_ulock_get()
711 ret = pm_runtime_resume_and_get(dev->dev); in mchp_spdifrx_ulock_get()
720 if (dev->trigger_enabled) { in mchp_spdifrx_ulock_get()
721 regmap_read(dev->regmap, SPDIFRX_RSR, &val); in mchp_spdifrx_ulock_get()
729 pm_runtime_mark_last_busy(dev->dev); in mchp_spdifrx_ulock_get()
730 pm_runtime_put_autosuspend(dev->dev); in mchp_spdifrx_ulock_get()
732 mutex_unlock(&dev->mlock); in mchp_spdifrx_ulock_get()
741 struct mchp_spdifrx_dev *dev = snd_soc_dai_get_drvdata(dai); in mchp_spdifrx_badf_get() local
742 struct mchp_spdifrx_mixer_control *ctrl = &dev->control; in mchp_spdifrx_badf_get()
747 mutex_lock(&dev->mlock); in mchp_spdifrx_badf_get()
749 ret = pm_runtime_resume_and_get(dev->dev); in mchp_spdifrx_badf_get()
758 if (dev->trigger_enabled) { in mchp_spdifrx_badf_get()
759 regmap_read(dev->regmap, SPDIFRX_RSR, &val); in mchp_spdifrx_badf_get()
765 pm_runtime_mark_last_busy(dev->dev); in mchp_spdifrx_badf_get()
766 pm_runtime_put_autosuspend(dev->dev); in mchp_spdifrx_badf_get()
768 mutex_unlock(&dev->mlock); in mchp_spdifrx_badf_get()
779 struct mchp_spdifrx_dev *dev = snd_soc_dai_get_drvdata(dai); in mchp_spdifrx_signal_get() local
780 struct mchp_spdifrx_mixer_control *ctrl = &dev->control; in mchp_spdifrx_signal_get()
785 mutex_lock(&dev->mlock); in mchp_spdifrx_signal_get()
787 ret = pm_runtime_resume_and_get(dev->dev); in mchp_spdifrx_signal_get()
796 if (!dev->trigger_enabled) { in mchp_spdifrx_signal_get()
797 regmap_update_bits(dev->regmap, SPDIFRX_MR, SPDIFRX_MR_RXEN_MASK, in mchp_spdifrx_signal_get()
802 regmap_read(dev->regmap, SPDIFRX_RSR, &val); in mchp_spdifrx_signal_get()
808 regmap_update_bits(dev->regmap, SPDIFRX_MR, SPDIFRX_MR_RXEN_MASK, in mchp_spdifrx_signal_get()
811 regmap_read(dev->regmap, SPDIFRX_RSR, &val); in mchp_spdifrx_signal_get()
814 pm_runtime_mark_last_busy(dev->dev); in mchp_spdifrx_signal_get()
815 pm_runtime_put_autosuspend(dev->dev); in mchp_spdifrx_signal_get()
818 mutex_unlock(&dev->mlock); in mchp_spdifrx_signal_get()
844 struct mchp_spdifrx_dev *dev = snd_soc_dai_get_drvdata(dai); in mchp_spdifrx_rate_get() local
849 mutex_lock(&dev->mlock); in mchp_spdifrx_rate_get()
851 ret = pm_runtime_resume_and_get(dev->dev); in mchp_spdifrx_rate_get()
860 if (dev->trigger_enabled) { in mchp_spdifrx_rate_get()
861 regmap_read(dev->regmap, SPDIFRX_RSR, &val); in mchp_spdifrx_rate_get()
873 rate = clk_get_rate(dev->gclk); in mchp_spdifrx_rate_get()
878 pm_runtime_mark_last_busy(dev->dev); in mchp_spdifrx_rate_get()
879 pm_runtime_put_autosuspend(dev->dev); in mchp_spdifrx_rate_get()
881 mutex_unlock(&dev->mlock); in mchp_spdifrx_rate_get()
969 struct mchp_spdifrx_dev *dev = snd_soc_dai_get_drvdata(dai); in mchp_spdifrx_dai_probe() local
970 struct mchp_spdifrx_mixer_control *ctrl = &dev->control; in mchp_spdifrx_dai_probe()
973 snd_soc_dai_init_dma_data(dai, NULL, &dev->capture); in mchp_spdifrx_dai_probe()
976 regmap_write(dev->regmap, SPDIFRX_CR, SPDIFRX_CR_SWRST); in mchp_spdifrx_dai_probe()
979 regmap_write(dev->regmap, SPDIFRX_MR, in mchp_spdifrx_dai_probe()
999 struct mchp_spdifrx_dev *dev = snd_soc_dai_get_drvdata(dai); in mchp_spdifrx_dai_remove() local
1002 regmap_write(dev->regmap, SPDIFRX_IDR, GENMASK(14, 0)); in mchp_spdifrx_dai_remove()
1039 static int mchp_spdifrx_runtime_suspend(struct device *dev) in mchp_spdifrx_runtime_suspend() argument
1041 struct mchp_spdifrx_dev *spdifrx = dev_get_drvdata(dev); in mchp_spdifrx_runtime_suspend()
1050 static int mchp_spdifrx_runtime_resume(struct device *dev) in mchp_spdifrx_runtime_resume() argument
1052 struct mchp_spdifrx_dev *spdifrx = dev_get_drvdata(dev); in mchp_spdifrx_runtime_resume()
1083 struct mchp_spdifrx_dev *dev; in mchp_spdifrx_probe() local
1092 dev = devm_kzalloc(&pdev->dev, sizeof(*dev), GFP_KERNEL); in mchp_spdifrx_probe()
1093 if (!dev) in mchp_spdifrx_probe()
1101 regmap = devm_regmap_init_mmio(&pdev->dev, base, in mchp_spdifrx_probe()
1111 err = devm_request_irq(&pdev->dev, irq, mchp_spdif_interrupt, 0, in mchp_spdifrx_probe()
1112 dev_name(&pdev->dev), dev); in mchp_spdifrx_probe()
1117 dev->pclk = devm_clk_get(&pdev->dev, "pclk"); in mchp_spdifrx_probe()
1118 if (IS_ERR(dev->pclk)) { in mchp_spdifrx_probe()
1119 err = PTR_ERR(dev->pclk); in mchp_spdifrx_probe()
1120 dev_err(&pdev->dev, "failed to get the peripheral clock: %d\n", in mchp_spdifrx_probe()
1126 dev->gclk = devm_clk_get(&pdev->dev, "gclk"); in mchp_spdifrx_probe()
1127 if (IS_ERR(dev->gclk)) { in mchp_spdifrx_probe()
1128 err = PTR_ERR(dev->gclk); in mchp_spdifrx_probe()
1129 dev_err(&pdev->dev, in mchp_spdifrx_probe()
1141 clk_set_min_rate(dev->gclk, 48000 * SPDIFRX_GCLK_RATIO_MIN + 1); in mchp_spdifrx_probe()
1143 mutex_init(&dev->mlock); in mchp_spdifrx_probe()
1145 dev->dev = &pdev->dev; in mchp_spdifrx_probe()
1146 dev->regmap = regmap; in mchp_spdifrx_probe()
1147 platform_set_drvdata(pdev, dev); in mchp_spdifrx_probe()
1149 pm_runtime_enable(dev->dev); in mchp_spdifrx_probe()
1150 if (!pm_runtime_enabled(dev->dev)) { in mchp_spdifrx_probe()
1151 err = mchp_spdifrx_runtime_resume(dev->dev); in mchp_spdifrx_probe()
1156 dev->capture.addr = (dma_addr_t)mem->start + SPDIFRX_RHR; in mchp_spdifrx_probe()
1157 dev->capture.maxburst = 1; in mchp_spdifrx_probe()
1159 err = devm_snd_dmaengine_pcm_register(&pdev->dev, NULL, 0); in mchp_spdifrx_probe()
1161 dev_err(&pdev->dev, "failed to register PCM: %d\n", err); in mchp_spdifrx_probe()
1165 err = devm_snd_soc_register_component(&pdev->dev, in mchp_spdifrx_probe()
1169 dev_err(&pdev->dev, "fail to register dai\n"); in mchp_spdifrx_probe()
1174 dev_info(&pdev->dev, "hw version: %#lx\n", vers & SPDIFRX_VERSION_MASK); in mchp_spdifrx_probe()
1179 if (!pm_runtime_status_suspended(dev->dev)) in mchp_spdifrx_probe()
1180 mchp_spdifrx_runtime_suspend(dev->dev); in mchp_spdifrx_probe()
1182 pm_runtime_disable(dev->dev); in mchp_spdifrx_probe()
1188 struct mchp_spdifrx_dev *dev = platform_get_drvdata(pdev); in mchp_spdifrx_remove() local
1190 pm_runtime_disable(dev->dev); in mchp_spdifrx_remove()
1191 if (!pm_runtime_status_suspended(dev->dev)) in mchp_spdifrx_remove()
1192 mchp_spdifrx_runtime_suspend(dev->dev); in mchp_spdifrx_remove()