Lines Matching refs:dev

239 	struct device				*dev;  member
260 struct mchp_i2s_mcc_dev *dev = dev_id; in mchp_i2s_mcc_interrupt() local
264 regmap_read(dev->regmap, MCHP_I2SMCC_IMRA, &imra); in mchp_i2s_mcc_interrupt()
265 regmap_read(dev->regmap, MCHP_I2SMCC_ISRA, &sra); in mchp_i2s_mcc_interrupt()
268 regmap_read(dev->regmap, MCHP_I2SMCC_IMRB, &imrb); in mchp_i2s_mcc_interrupt()
269 regmap_read(dev->regmap, MCHP_I2SMCC_ISRB, &srb); in mchp_i2s_mcc_interrupt()
279 if (dev->soc->has_fifo) { in mchp_i2s_mcc_interrupt()
283 idra |= pendinga & (MCHP_I2SMCC_INT_TXRDY_MASK(dev->channels) | in mchp_i2s_mcc_interrupt()
284 MCHP_I2SMCC_INT_RXRDY_MASK(dev->channels)); in mchp_i2s_mcc_interrupt()
289 if ((!dev->soc->has_fifo && in mchp_i2s_mcc_interrupt()
290 (imra & MCHP_I2SMCC_INT_TXRDY_MASK(dev->channels)) && in mchp_i2s_mcc_interrupt()
291 (imra & MCHP_I2SMCC_INT_TXRDY_MASK(dev->channels)) == in mchp_i2s_mcc_interrupt()
292 (idra & MCHP_I2SMCC_INT_TXRDY_MASK(dev->channels))) || in mchp_i2s_mcc_interrupt()
293 (dev->soc->has_fifo && imrb & MCHP_I2SMCC_INT_TXFFRDY)) { in mchp_i2s_mcc_interrupt()
294 dev->tx_rdy = 1; in mchp_i2s_mcc_interrupt()
295 wake_up_interruptible(&dev->wq_txrdy); in mchp_i2s_mcc_interrupt()
297 if ((!dev->soc->has_fifo && in mchp_i2s_mcc_interrupt()
298 (imra & MCHP_I2SMCC_INT_RXRDY_MASK(dev->channels)) && in mchp_i2s_mcc_interrupt()
299 (imra & MCHP_I2SMCC_INT_RXRDY_MASK(dev->channels)) == in mchp_i2s_mcc_interrupt()
300 (idra & MCHP_I2SMCC_INT_RXRDY_MASK(dev->channels))) || in mchp_i2s_mcc_interrupt()
301 (dev->soc->has_fifo && imrb & MCHP_I2SMCC_INT_RXFFRDY)) { in mchp_i2s_mcc_interrupt()
302 dev->rx_rdy = 1; in mchp_i2s_mcc_interrupt()
303 wake_up_interruptible(&dev->wq_rxrdy); in mchp_i2s_mcc_interrupt()
305 if (dev->soc->has_fifo) in mchp_i2s_mcc_interrupt()
306 regmap_write(dev->regmap, MCHP_I2SMCC_IDRB, idrb); in mchp_i2s_mcc_interrupt()
308 regmap_write(dev->regmap, MCHP_I2SMCC_IDRA, idra); in mchp_i2s_mcc_interrupt()
316 struct mchp_i2s_mcc_dev *dev = snd_soc_dai_get_drvdata(dai); in mchp_i2s_mcc_set_sysclk() local
318 dev_dbg(dev->dev, "%s() clk_id=%d freq=%u dir=%d\n", in mchp_i2s_mcc_set_sysclk()
325 dev->sysclk = freq; in mchp_i2s_mcc_set_sysclk()
333 struct mchp_i2s_mcc_dev *dev = snd_soc_dai_get_drvdata(dai); in mchp_i2s_mcc_set_bclk_ratio() local
335 dev_dbg(dev->dev, "%s() ratio=%u\n", __func__, ratio); in mchp_i2s_mcc_set_bclk_ratio()
337 dev->frame_length = ratio; in mchp_i2s_mcc_set_bclk_ratio()
344 struct mchp_i2s_mcc_dev *dev = snd_soc_dai_get_drvdata(dai); in mchp_i2s_mcc_set_dai_fmt() local
346 dev_dbg(dev->dev, "%s() fmt=%#x\n", __func__, fmt); in mchp_i2s_mcc_set_dai_fmt()
360 dev->fmt = fmt; in mchp_i2s_mcc_set_dai_fmt()
370 struct mchp_i2s_mcc_dev *dev = snd_soc_dai_get_drvdata(dai); in mchp_i2s_mcc_set_dai_tdm_slot() local
372 dev_dbg(dev->dev, in mchp_i2s_mcc_set_dai_tdm_slot()
387 dev->tdm_slots = slots; in mchp_i2s_mcc_set_dai_tdm_slot()
388 dev->frame_length = slots * MCHP_I2MCC_TDM_SLOT_WIDTH; in mchp_i2s_mcc_set_dai_tdm_slot()
416 static int mchp_i2s_mcc_config_divs(struct mchp_i2s_mcc_dev *dev, in mchp_i2s_mcc_config_divs() argument
428 if (!dev->sysclk) in mchp_i2s_mcc_config_divs()
431 sysclk = dev->sysclk; in mchp_i2s_mcc_config_divs()
447 ret = mchp_i2s_mcc_clk_get_rate_diff(dev->gclk, clk_rate, in mchp_i2s_mcc_config_divs()
451 dev_err(dev->dev, "gclk error for rate %lu: %d", in mchp_i2s_mcc_config_divs()
455 dev_dbg(dev->dev, "found perfect rate on gclk: %lu\n", in mchp_i2s_mcc_config_divs()
461 ret = mchp_i2s_mcc_clk_get_rate_diff(dev->pclk, clk_rate, in mchp_i2s_mcc_config_divs()
465 dev_err(dev->dev, "pclk error for rate %lu: %d", in mchp_i2s_mcc_config_divs()
469 dev_dbg(dev->dev, "found perfect rate on pclk: %lu\n", in mchp_i2s_mcc_config_divs()
478 dev_err(dev->dev, "unable to change rate to clocks\n"); in mchp_i2s_mcc_config_divs()
482 dev_dbg(dev->dev, "source CLK is %s with rate %lu, diff %lu\n", in mchp_i2s_mcc_config_divs()
483 best_clk == dev->pclk ? "pclk" : "gclk", in mchp_i2s_mcc_config_divs()
487 if (dev->sysclk) in mchp_i2s_mcc_config_divs()
491 if (best_clk == dev->gclk) in mchp_i2s_mcc_config_divs()
499 static int mchp_i2s_mcc_is_running(struct mchp_i2s_mcc_dev *dev) in mchp_i2s_mcc_is_running() argument
503 regmap_read(dev->regmap, MCHP_I2SMCC_SR, &sr); in mchp_i2s_mcc_is_running()
512 struct mchp_i2s_mcc_dev *dev = snd_soc_dai_get_drvdata(dai); in mchp_i2s_mcc_hw_params() local
516 unsigned int frame_length = dev->frame_length; in mchp_i2s_mcc_hw_params()
522 dev_dbg(dev->dev, "%s() rate=%u format=%#x width=%u channels=%u\n", in mchp_i2s_mcc_hw_params()
526 switch (dev->fmt & SND_SOC_DAIFMT_FORMAT_MASK) { in mchp_i2s_mcc_hw_params()
528 if (dev->tdm_slots) { in mchp_i2s_mcc_hw_params()
529 dev_err(dev->dev, "I2S with TDM is not supported\n"); in mchp_i2s_mcc_hw_params()
535 if (dev->tdm_slots) { in mchp_i2s_mcc_hw_params()
536 dev_err(dev->dev, "Left-Justified with TDM is not supported\n"); in mchp_i2s_mcc_hw_params()
545 dev_err(dev->dev, "unsupported bus format\n"); in mchp_i2s_mcc_hw_params()
549 switch (dev->fmt & SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK) { in mchp_i2s_mcc_hw_params()
553 if (dev->sysclk) in mchp_i2s_mcc_hw_params()
565 if (dev->sysclk) in mchp_i2s_mcc_hw_params()
566 dev_warn(dev->dev, "Unable to generate MCLK in Slave mode\n"); in mchp_i2s_mcc_hw_params()
569 dev_err(dev->dev, "unsupported master/slave mode\n"); in mchp_i2s_mcc_hw_params()
573 if (dev->fmt & (SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_LEFT_J)) { in mchp_i2s_mcc_hw_params()
575 if (channels > dev->soc->data_pin_pair_num * 2) { in mchp_i2s_mcc_hw_params()
576 dev_err(dev->dev, in mchp_i2s_mcc_hw_params()
601 dev_err(dev->dev, "unsupported number of audio channels\n"); in mchp_i2s_mcc_hw_params()
607 } else if (dev->fmt & SND_SOC_DAIFMT_DSP_A) { in mchp_i2s_mcc_hw_params()
608 mra |= MCHP_I2SMCC_MRA_WIRECFG_TDM(dev->tdm_data_pair); in mchp_i2s_mcc_hw_params()
610 if (dev->tdm_slots) { in mchp_i2s_mcc_hw_params()
611 if (channels % 2 && channels * 2 <= dev->tdm_slots) { in mchp_i2s_mcc_hw_params()
621 channels = dev->tdm_slots; in mchp_i2s_mcc_hw_params()
635 dev->playback.maxburst = 1 << (fls(channels) - 1); in mchp_i2s_mcc_hw_params()
637 dev->capture.maxburst = 1 << (fls(channels) - 1); in mchp_i2s_mcc_hw_params()
665 dev_err(dev->dev, "unsupported size/endianness for audio samples\n"); in mchp_i2s_mcc_hw_params()
671 ret = mchp_i2s_mcc_config_divs(dev, bclk_rate, &mra, in mchp_i2s_mcc_hw_params()
674 dev_err(dev->dev, in mchp_i2s_mcc_hw_params()
681 if (dev->soc->has_fifo) in mchp_i2s_mcc_hw_params()
688 if (mchp_i2s_mcc_is_running(dev)) { in mchp_i2s_mcc_hw_params()
692 regmap_read(dev->regmap, MCHP_I2SMCC_MRA, &mra_cur); in mchp_i2s_mcc_hw_params()
693 regmap_read(dev->regmap, MCHP_I2SMCC_MRB, &mrb_cur); in mchp_i2s_mcc_hw_params()
700 if (mra & MCHP_I2SMCC_MRA_SRCCLK_GCLK && !dev->gclk_use) { in mchp_i2s_mcc_hw_params()
702 ret = clk_set_rate(dev->gclk, rate); in mchp_i2s_mcc_hw_params()
704 dev_err(dev->dev, in mchp_i2s_mcc_hw_params()
710 ret = clk_prepare(dev->gclk); in mchp_i2s_mcc_hw_params()
712 dev_err(dev->dev, "unable to prepare GCLK: %d\n", ret); in mchp_i2s_mcc_hw_params()
715 dev->gclk_use = 1; in mchp_i2s_mcc_hw_params()
719 dev->channels = channels; in mchp_i2s_mcc_hw_params()
721 ret = regmap_write(dev->regmap, MCHP_I2SMCC_MRA, mra); in mchp_i2s_mcc_hw_params()
723 if (dev->gclk_use) { in mchp_i2s_mcc_hw_params()
724 clk_unprepare(dev->gclk); in mchp_i2s_mcc_hw_params()
725 dev->gclk_use = 0; in mchp_i2s_mcc_hw_params()
729 return regmap_write(dev->regmap, MCHP_I2SMCC_MRB, mrb); in mchp_i2s_mcc_hw_params()
735 struct mchp_i2s_mcc_dev *dev = snd_soc_dai_get_drvdata(dai); in mchp_i2s_mcc_hw_free() local
740 err = wait_event_interruptible_timeout(dev->wq_txrdy, in mchp_i2s_mcc_hw_free()
741 dev->tx_rdy, in mchp_i2s_mcc_hw_free()
744 dev_warn_once(dev->dev, in mchp_i2s_mcc_hw_free()
746 if (dev->soc->has_fifo) in mchp_i2s_mcc_hw_free()
747 regmap_write(dev->regmap, MCHP_I2SMCC_IDRB, in mchp_i2s_mcc_hw_free()
750 regmap_write(dev->regmap, MCHP_I2SMCC_IDRA, in mchp_i2s_mcc_hw_free()
751 MCHP_I2SMCC_INT_TXRDY_MASK(dev->channels)); in mchp_i2s_mcc_hw_free()
753 dev->tx_rdy = 1; in mchp_i2s_mcc_hw_free()
756 err = wait_event_interruptible_timeout(dev->wq_rxrdy, in mchp_i2s_mcc_hw_free()
757 dev->rx_rdy, in mchp_i2s_mcc_hw_free()
760 dev_warn_once(dev->dev, in mchp_i2s_mcc_hw_free()
762 if (dev->soc->has_fifo) in mchp_i2s_mcc_hw_free()
763 regmap_write(dev->regmap, MCHP_I2SMCC_IDRB, in mchp_i2s_mcc_hw_free()
766 regmap_write(dev->regmap, MCHP_I2SMCC_IDRA, in mchp_i2s_mcc_hw_free()
767 MCHP_I2SMCC_INT_RXRDY_MASK(dev->channels)); in mchp_i2s_mcc_hw_free()
768 dev->rx_rdy = 1; in mchp_i2s_mcc_hw_free()
772 if (!mchp_i2s_mcc_is_running(dev)) { in mchp_i2s_mcc_hw_free()
773 regmap_write(dev->regmap, MCHP_I2SMCC_CR, MCHP_I2SMCC_CR_CKDIS); in mchp_i2s_mcc_hw_free()
775 if (dev->gclk_running) { in mchp_i2s_mcc_hw_free()
776 clk_disable(dev->gclk); in mchp_i2s_mcc_hw_free()
777 dev->gclk_running = 0; in mchp_i2s_mcc_hw_free()
779 if (dev->gclk_use) { in mchp_i2s_mcc_hw_free()
780 clk_unprepare(dev->gclk); in mchp_i2s_mcc_hw_free()
781 dev->gclk_use = 0; in mchp_i2s_mcc_hw_free()
791 struct mchp_i2s_mcc_dev *dev = snd_soc_dai_get_drvdata(dai); in mchp_i2s_mcc_trigger() local
810 regmap_read(dev->regmap, MCHP_I2SMCC_SR, &sr); in mchp_i2s_mcc_trigger()
813 dev->tx_rdy = 0; in mchp_i2s_mcc_trigger()
818 if (dev->soc->has_fifo) in mchp_i2s_mcc_trigger()
821 iera = MCHP_I2SMCC_INT_TXRDY_MASK(dev->channels); in mchp_i2s_mcc_trigger()
824 dev->rx_rdy = 0; in mchp_i2s_mcc_trigger()
829 if (dev->soc->has_fifo) in mchp_i2s_mcc_trigger()
832 iera = MCHP_I2SMCC_INT_RXRDY_MASK(dev->channels); in mchp_i2s_mcc_trigger()
839 if ((cr & MCHP_I2SMCC_CR_CKEN) && dev->gclk_use && in mchp_i2s_mcc_trigger()
840 !dev->gclk_running) { in mchp_i2s_mcc_trigger()
841 err = clk_enable(dev->gclk); in mchp_i2s_mcc_trigger()
843 dev_err_once(dev->dev, "failed to enable GCLK: %d\n", in mchp_i2s_mcc_trigger()
846 dev->gclk_running = 1; in mchp_i2s_mcc_trigger()
850 if (dev->soc->has_fifo) in mchp_i2s_mcc_trigger()
851 regmap_write(dev->regmap, MCHP_I2SMCC_IERB, ierb); in mchp_i2s_mcc_trigger()
853 regmap_write(dev->regmap, MCHP_I2SMCC_IERA, iera); in mchp_i2s_mcc_trigger()
854 regmap_write(dev->regmap, MCHP_I2SMCC_CR, cr); in mchp_i2s_mcc_trigger()
862 struct mchp_i2s_mcc_dev *dev = snd_soc_dai_get_drvdata(dai); in mchp_i2s_mcc_startup() local
865 if (!mchp_i2s_mcc_is_running(dev)) { in mchp_i2s_mcc_startup()
866 return regmap_write(dev->regmap, MCHP_I2SMCC_CR, in mchp_i2s_mcc_startup()
875 struct mchp_i2s_mcc_dev *dev = snd_soc_dai_get_drvdata(dai); in mchp_i2s_mcc_dai_probe() local
877 init_waitqueue_head(&dev->wq_txrdy); in mchp_i2s_mcc_dai_probe()
878 init_waitqueue_head(&dev->wq_rxrdy); in mchp_i2s_mcc_dai_probe()
879 dev->tx_rdy = 1; in mchp_i2s_mcc_dai_probe()
880 dev->rx_rdy = 1; in mchp_i2s_mcc_dai_probe()
882 snd_soc_dai_init_dma_data(dai, &dev->playback, &dev->capture); in mchp_i2s_mcc_dai_probe()
960 struct mchp_i2s_mcc_dev *dev) in mchp_i2s_mcc_soc_data_parse() argument
964 if (!dev->soc) { in mchp_i2s_mcc_soc_data_parse()
965 dev_err(&pdev->dev, "failed to get soc data\n"); in mchp_i2s_mcc_soc_data_parse()
969 if (dev->soc->data_pin_pair_num == 1) in mchp_i2s_mcc_soc_data_parse()
972 err = of_property_read_u8(pdev->dev.of_node, "microchip,tdm-data-pair", in mchp_i2s_mcc_soc_data_parse()
973 &dev->tdm_data_pair); in mchp_i2s_mcc_soc_data_parse()
975 dev_err(&pdev->dev, in mchp_i2s_mcc_soc_data_parse()
981 dev_info(&pdev->dev, in mchp_i2s_mcc_soc_data_parse()
983 dev->tdm_data_pair = 0; in mchp_i2s_mcc_soc_data_parse()
985 if (dev->tdm_data_pair > dev->soc->data_pin_pair_num - 1) { in mchp_i2s_mcc_soc_data_parse()
986 dev_err(&pdev->dev, in mchp_i2s_mcc_soc_data_parse()
988 dev->tdm_data_pair); in mchp_i2s_mcc_soc_data_parse()
991 dev_dbg(&pdev->dev, "TMD format on DIN/DOUT %d pins\n", in mchp_i2s_mcc_soc_data_parse()
992 dev->tdm_data_pair); in mchp_i2s_mcc_soc_data_parse()
1000 struct mchp_i2s_mcc_dev *dev; in mchp_i2s_mcc_probe() local
1008 dev = devm_kzalloc(&pdev->dev, sizeof(*dev), GFP_KERNEL); in mchp_i2s_mcc_probe()
1009 if (!dev) in mchp_i2s_mcc_probe()
1016 regmap = devm_regmap_init_mmio(&pdev->dev, base, in mchp_i2s_mcc_probe()
1025 err = devm_request_irq(&pdev->dev, irq, mchp_i2s_mcc_interrupt, 0, in mchp_i2s_mcc_probe()
1026 dev_name(&pdev->dev), dev); in mchp_i2s_mcc_probe()
1030 dev->pclk = devm_clk_get(&pdev->dev, "pclk"); in mchp_i2s_mcc_probe()
1031 if (IS_ERR(dev->pclk)) { in mchp_i2s_mcc_probe()
1032 err = PTR_ERR(dev->pclk); in mchp_i2s_mcc_probe()
1033 dev_err(&pdev->dev, in mchp_i2s_mcc_probe()
1039 dev->gclk = devm_clk_get(&pdev->dev, "gclk"); in mchp_i2s_mcc_probe()
1040 if (IS_ERR(dev->gclk)) { in mchp_i2s_mcc_probe()
1041 if (PTR_ERR(dev->gclk) == -EPROBE_DEFER) in mchp_i2s_mcc_probe()
1043 dev_warn(&pdev->dev, in mchp_i2s_mcc_probe()
1045 dev->gclk = NULL; in mchp_i2s_mcc_probe()
1048 dev->soc = of_device_get_match_data(&pdev->dev); in mchp_i2s_mcc_probe()
1049 err = mchp_i2s_mcc_soc_data_parse(pdev, dev); in mchp_i2s_mcc_probe()
1053 dev->dev = &pdev->dev; in mchp_i2s_mcc_probe()
1054 dev->regmap = regmap; in mchp_i2s_mcc_probe()
1055 platform_set_drvdata(pdev, dev); in mchp_i2s_mcc_probe()
1057 err = clk_prepare_enable(dev->pclk); in mchp_i2s_mcc_probe()
1059 dev_err(&pdev->dev, in mchp_i2s_mcc_probe()
1064 err = devm_snd_soc_register_component(&pdev->dev, in mchp_i2s_mcc_probe()
1068 dev_err(&pdev->dev, "failed to register DAI: %d\n", err); in mchp_i2s_mcc_probe()
1069 clk_disable_unprepare(dev->pclk); in mchp_i2s_mcc_probe()
1073 dev->playback.addr = (dma_addr_t)mem->start + MCHP_I2SMCC_THR; in mchp_i2s_mcc_probe()
1074 dev->capture.addr = (dma_addr_t)mem->start + MCHP_I2SMCC_RHR; in mchp_i2s_mcc_probe()
1076 err = devm_snd_dmaengine_pcm_register(&pdev->dev, NULL, 0); in mchp_i2s_mcc_probe()
1078 dev_err(&pdev->dev, "failed to register PCM: %d\n", err); in mchp_i2s_mcc_probe()
1079 clk_disable_unprepare(dev->pclk); in mchp_i2s_mcc_probe()
1084 regmap_read(dev->regmap, MCHP_I2SMCC_VERSION, &version); in mchp_i2s_mcc_probe()
1085 dev_info(&pdev->dev, "hw version: %#lx\n", in mchp_i2s_mcc_probe()
1093 struct mchp_i2s_mcc_dev *dev = platform_get_drvdata(pdev); in mchp_i2s_mcc_remove() local
1095 clk_disable_unprepare(dev->pclk); in mchp_i2s_mcc_remove()