Lines Matching +full:tegra194 +full:- +full:display

1 // SPDX-License-Identifier: GPL-2.0-only
11 #include <linux/dma-mapping.h>
67 * Tegra194 does not reflect correct number of SDO lines. Below macro
97 "Automatic power-saving timeout (in seconds, 0 = disable).");
109 v = readl(hda->regs + HDA_IPFS_CONFIG); in hda_tegra_init()
111 writel(v, hda->regs + HDA_IPFS_CONFIG); in hda_tegra_init()
114 v = readl(hda->regs + HDA_CFG_CMD); in hda_tegra_init()
118 writel(v, hda->regs + HDA_CFG_CMD); in hda_tegra_init()
120 writel(HDA_BAR0_INIT_PROGRAM, hda->regs + HDA_CFG_BAR0); in hda_tegra_init()
121 writel(HDA_BAR0_FINAL_PROGRAM, hda->regs + HDA_CFG_BAR0); in hda_tegra_init()
122 writel(HDA_FPCI_BAR0_START, hda->regs + HDA_IPFS_FPCI_BAR0); in hda_tegra_init()
124 v = readl(hda->regs + HDA_IPFS_INTR_MASK); in hda_tegra_init()
126 writel(v, hda->regs + HDA_IPFS_INTR_MASK); in hda_tegra_init()
161 struct azx *chip = card->private_data; in hda_tegra_runtime_suspend()
164 if (chip && chip->running) { in hda_tegra_runtime_suspend()
172 clk_bulk_disable_unprepare(hda->nclocks, hda->clocks); in hda_tegra_runtime_suspend()
180 struct azx *chip = card->private_data; in hda_tegra_runtime_resume()
184 if (!chip->running) { in hda_tegra_runtime_resume()
185 rc = reset_control_bulk_assert(hda->nresets, hda->resets); in hda_tegra_runtime_resume()
190 rc = clk_bulk_prepare_enable(hda->nclocks, hda->clocks); in hda_tegra_runtime_resume()
193 if (chip->running) { in hda_tegra_runtime_resume()
194 if (hda->soc->requires_init) in hda_tegra_runtime_resume()
204 rc = reset_control_bulk_deassert(hda->nresets, hda->resets); in hda_tegra_runtime_resume()
219 struct azx *chip = device->device_data; in hda_tegra_dev_disconnect()
221 chip->bus.shutdown = 1; in hda_tegra_dev_disconnect()
230 struct azx *chip = device->device_data; in hda_tegra_dev_free()
233 cancel_work_sync(&hda->probe_work); in hda_tegra_dev_free()
234 if (azx_bus(chip)->chip_init) { in hda_tegra_dev_free()
252 hda->regs = devm_platform_get_and_ioremap_resource(pdev, 0, &res); in hda_tegra_init_chip()
253 if (IS_ERR(hda->regs)) in hda_tegra_init_chip()
254 return PTR_ERR(hda->regs); in hda_tegra_init_chip()
256 bus->remap_addr = hda->regs + HDA_BAR0; in hda_tegra_init_chip()
257 bus->addr = res->start + HDA_BAR0; in hda_tegra_init_chip()
259 if (hda->soc->requires_init) in hda_tegra_init_chip()
269 struct snd_card *card = chip->card; in hda_tegra_first_init()
273 const char *sname, *drv_name = "tegra-hda"; in hda_tegra_first_init()
274 struct device_node *np = pdev->dev.of_node; in hda_tegra_first_init()
283 err = devm_request_irq(chip->card->dev, irq_id, azx_interrupt, in hda_tegra_first_init()
286 dev_err(chip->card->dev, in hda_tegra_first_init()
291 bus->irq = irq_id; in hda_tegra_first_init()
292 bus->dma_stop_delay = 100; in hda_tegra_first_init()
293 card->sync_irq = bus->irq; in hda_tegra_first_init()
296 * Tegra194 has 4 SDO lines and the STRIPE can be used to in hda_tegra_first_init()
304 if (of_device_is_compatible(np, "nvidia,tegra194-hda")) { in hda_tegra_first_init()
307 dev_info(card->dev, "Override SDO lines to %u\n", in hda_tegra_first_init()
310 val = readl(hda->regs + FPCI_DBG_CFG_2) & ~FPCI_GCAP_NSDO_MASK; in hda_tegra_first_init()
312 writel(val, hda->regs + FPCI_DBG_CFG_2); in hda_tegra_first_init()
316 dev_dbg(card->dev, "chipset global capabilities = 0x%x\n", gcap); in hda_tegra_first_init()
318 chip->align_buffer_size = 1; in hda_tegra_first_init()
323 chip->capture_streams = (gcap >> 8) & 0x0f; in hda_tegra_first_init()
333 if (!hda->soc->input_stream) in hda_tegra_first_init()
334 chip->capture_streams = 4; in hda_tegra_first_init()
336 chip->playback_streams = (gcap >> 12) & 0x0f; in hda_tegra_first_init()
337 if (!chip->playback_streams && !chip->capture_streams) { in hda_tegra_first_init()
339 chip->playback_streams = NUM_PLAYBACK_SD; in hda_tegra_first_init()
340 chip->capture_streams = NUM_CAPTURE_SD; in hda_tegra_first_init()
342 chip->capture_index_offset = 0; in hda_tegra_first_init()
343 chip->playback_index_offset = chip->capture_streams; in hda_tegra_first_init()
344 chip->num_streams = chip->playback_streams + chip->capture_streams; in hda_tegra_first_init()
349 dev_err(card->dev, "failed to initialize streams: %d\n", err); in hda_tegra_first_init()
355 dev_err(card->dev, "failed to allocate stream pages: %d\n", in hda_tegra_first_init()
364 * Playback (for 44.1K/48K, 2-channel, 16-bps) fails with in hda_tegra_first_init()
377 if (of_device_is_compatible(np, "nvidia,tegra30-hda")) in hda_tegra_first_init()
378 chip->bus.core.sdo_limit = 16; in hda_tegra_first_init()
381 if (!bus->codec_mask) { in hda_tegra_first_init()
382 dev_err(card->dev, "no codecs found!\n"); in hda_tegra_first_init()
383 return -ENODEV; in hda_tegra_first_init()
387 strscpy(card->driver, drv_name); in hda_tegra_first_init()
392 if (strlen(sname) > sizeof(card->shortname)) in hda_tegra_first_init()
393 dev_info(card->dev, "truncating shortname for card\n"); in hda_tegra_first_init()
394 strscpy(card->shortname, sname); in hda_tegra_first_init()
397 snprintf(card->longname, sizeof(card->longname), in hda_tegra_first_init()
399 card->shortname, bus->addr, bus->irq); in hda_tegra_first_init()
421 chip = &hda->chip; in hda_tegra_create()
423 mutex_init(&chip->open_mutex); in hda_tegra_create()
424 chip->card = card; in hda_tegra_create()
425 chip->ops = &hda_tegra_ops; in hda_tegra_create()
426 chip->driver_caps = driver_caps; in hda_tegra_create()
427 chip->driver_type = driver_caps & 0xff; in hda_tegra_create()
428 chip->dev_index = 0; in hda_tegra_create()
429 INIT_LIST_HEAD(&chip->pcm_list); in hda_tegra_create()
431 chip->codec_probe_mask = -1; in hda_tegra_create()
433 chip->single_cmd = false; in hda_tegra_create()
434 chip->snoop = true; in hda_tegra_create()
436 INIT_WORK(&hda->probe_work, hda_tegra_probe_work); in hda_tegra_create()
442 chip->bus.core.sync_write = 0; in hda_tegra_create()
443 chip->bus.core.needs_damn_long_delay = 1; in hda_tegra_create()
444 chip->bus.core.aligned_mmio = 1; in hda_tegra_create()
451 if (!hda->soc->always_on) { in hda_tegra_create()
452 chip->jackpoll_interval = msecs_to_jiffies(5000); in hda_tegra_create()
453 chip->bus.jackpoll_in_suspend = 1; in hda_tegra_create()
458 dev_err(card->dev, "Error creating device\n"); in hda_tegra_create()
502 { .compatible = "nvidia,tegra30-hda", .data = &tegra30_data },
503 { .compatible = "nvidia,tegra194-hda", .data = &tegra194_data },
504 { .compatible = "nvidia,tegra234-hda", .data = &tegra234_data },
505 { .compatible = "nvidia,tegra264-hda", .data = &tegra264_data },
520 hda = devm_kzalloc(&pdev->dev, sizeof(*hda), GFP_KERNEL); in hda_tegra_probe()
522 return -ENOMEM; in hda_tegra_probe()
523 hda->dev = &pdev->dev; in hda_tegra_probe()
524 chip = &hda->chip; in hda_tegra_probe()
526 hda->soc = of_device_get_match_data(&pdev->dev); in hda_tegra_probe()
528 err = snd_card_new(&pdev->dev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1, in hda_tegra_probe()
531 dev_err(&pdev->dev, "Error creating card!\n"); in hda_tegra_probe()
535 hda->resets[hda->nresets++].id = "hda"; in hda_tegra_probe()
539 * codec is separate IP and not under display SOR partition now. in hda_tegra_probe()
541 if (hda->soc->has_hda2hdmi) in hda_tegra_probe()
542 hda->resets[hda->nresets++].id = "hda2hdmi"; in hda_tegra_probe()
545 * "hda2codec_2x" reset is not present on Tegra194. Though DT would in hda_tegra_probe()
549 if (hda->soc->has_hda2codec_2x_reset) in hda_tegra_probe()
550 hda->resets[hda->nresets++].id = "hda2codec_2x"; in hda_tegra_probe()
552 err = devm_reset_control_bulk_get_exclusive(&pdev->dev, hda->nresets, in hda_tegra_probe()
553 hda->resets); in hda_tegra_probe()
557 hda->clocks[hda->nclocks++].id = "hda"; in hda_tegra_probe()
558 if (hda->soc->has_hda2hdmi) in hda_tegra_probe()
559 hda->clocks[hda->nclocks++].id = "hda2hdmi"; in hda_tegra_probe()
561 if (hda->soc->has_hda2codec_2x) in hda_tegra_probe()
562 hda->clocks[hda->nclocks++].id = "hda2codec_2x"; in hda_tegra_probe()
564 err = devm_clk_bulk_get(&pdev->dev, hda->nclocks, hda->clocks); in hda_tegra_probe()
571 card->private_data = chip; in hda_tegra_probe()
573 dev_set_drvdata(&pdev->dev, card); in hda_tegra_probe()
575 pm_runtime_enable(hda->dev); in hda_tegra_probe()
577 pm_runtime_forbid(hda->dev); in hda_tegra_probe()
579 schedule_work(&hda->probe_work); in hda_tegra_probe()
591 struct azx *chip = &hda->chip; in hda_tegra_probe_work()
592 struct platform_device *pdev = to_platform_device(hda->dev); in hda_tegra_probe_work()
595 pm_runtime_get_sync(hda->dev); in hda_tegra_probe_work()
609 err = snd_card_register(chip->card); in hda_tegra_probe_work()
613 chip->running = 1; in hda_tegra_probe_work()
614 snd_hda_set_power_save(&chip->bus, power_save * 1000); in hda_tegra_probe_work()
617 pm_runtime_put(hda->dev); in hda_tegra_probe_work()
623 snd_card_free(dev_get_drvdata(&pdev->dev)); in hda_tegra_remove()
624 pm_runtime_disable(&pdev->dev); in hda_tegra_remove()
629 struct snd_card *card = dev_get_drvdata(&pdev->dev); in hda_tegra_shutdown()
634 chip = card->private_data; in hda_tegra_shutdown()
635 if (chip && chip->running) in hda_tegra_shutdown()
641 .name = "tegra-hda",