aboutsummaryrefslogtreecommitdiffstats
path: root/MAINTAINERS
Commit message (Expand)AuthorAge
* i2c: Quilt tree has movedJean Delvare2009-01-26
* MAINTAINERS: add entry for freezerPavel Machek2009-01-15
* edac: add MAINTAINERS entry for i5400 EDAC driverMauro Carvalho Chehab2009-01-15
* Merge git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6 into f...Lachlan McIlroy2009-01-14
|\
| * Merge git://git.kernel.org/pub/scm/linux/kernel/git/pkl/squashfs-linusLinus Torvalds2009-01-09
| |\
| | * MAINTAINERS: squashfs entryPhillip Lougher2009-01-05
| * | Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/benh/pow...Linus Torvalds2009-01-08
| |\ \
| | * | mtd/ps3vram: Add ps3vram driver for accessing video RAM as MTDJim Paris2009-01-08
| * | | misc: add dell-laptop driverMatthew Garrett2009-01-08
| |/ /
* / / [XFS] Update maintainersLachlan McIlroy2009-01-09
|/ /
* | V4L/DVB (10191a): Update MAINTAINERS entries on media driversMauro Carvalho Chehab2009-01-07
* | Merge git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb-2.6Linus Torvalds2009-01-07
|\ \
| * | wimax/i2400m: add CREDITS and MAINTAINERS entriesInaky Perez-Gonzalez2009-01-07
| * | USB: musb: Add musb git tree to maintainers entryFelipe Balbi2009-01-07
* | | Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jik...Linus Torvalds2009-01-07
|\ \ \ | |/ / |/| |
| * | trivial: Update MAINTAINERS entryJiri Kosina2009-01-06
* | | checkpatch: update MAINTAINERS entryAndy Whitcroft2009-01-06
* | | Dmitry has been renamedDmitry Eremin-Solenikov2009-01-06
|/ /
* / MAINTAINERS: update sparc maintainerSam Ravnborg2009-01-04
|/
* Merge branch 'kvm-updates/2.6.29' of git://git.kernel.org/pub/scm/linux/kerne...Linus Torvalds2009-01-02
|\
| * MAINTAINERS: Maintainership changes for kvm/ia64Xiantao Zhang2008-12-31
* | Merge git://git.kernel.org/pub/scm/linux/kernel/git/bart/ide-2.6Linus Torvalds2009-01-02
|\ \
| * | remove ide-scsiFUJITA Tomonori2009-01-02
| |/
* | Update powerpc maintainersPaul Mackerras2009-01-02
* | hso maintainers update patchDenis Joseph Barrow2009-01-02
|/
* Merge branch 'devel' of master.kernel.org:/home/rmk/linux-2.6-armLinus Torvalds2008-12-30
|\
| * MAINTAINERS: Add myself as i.MX Framebuffer driver maintainerSascha Hauer2008-12-16
* | Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next-2.6Linus Torvalds2008-12-28
|\ \
| * | Update MAINTAINERS entries for IXP4xx and WAN network drivers.Krzysztof HaƂasa2008-12-21
| * | Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/ne...David S. Miller2008-12-15
| |\|
| * | smsc9420: SMSC LAN9420 10/100 PCI ethernet adapterSteve Glendinning2008-12-11
| * | Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/ne...David S. Miller2008-12-02
| |\ \
| * | | Update of MAINTAINERS for RTL8187Larry Finger2008-11-21
| * | | MAINTAINERS: claim maintenance over rtl818x driversJohn W. Linville2008-11-21
| * | | Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/ne...David S. Miller2008-11-20
| |\ \ \
| * \ \ \ Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/ne...David S. Miller2008-11-19
| |\ \ \ \
| * \ \ \ \ Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/ne...David S. Miller2008-11-11
| |\ \ \ \ \
| * \ \ \ \ \ Merge branch 'davem-next' of master.kernel.org:/pub/scm/linux/kernel/git/jgar...David S. Miller2008-11-07
| |\ \ \ \ \ \
| | * | | | | | SMSC LAN911x and LAN921x vendor driverSteve Glendinning2008-11-06
| * | | | | | | Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/ne...David S. Miller2008-11-07
| |\ \ \ \ \ \ \ | | |/ / / / / / | |/| | | | | |
| * | | | | | | ath5k/ath9k: correct signal qualityLuis R. Rodriguez2008-10-31
| * | | | | | | Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/ne...David S. Miller2008-10-31
| |\ \ \ \ \ \ \
| * | | | | | | | The overdue eepro100 removal.Adrian Bunk2008-10-31
* | | | | | | | | Merge branch 'topic/asoc' into to-pushTakashi Iwai2008-12-25
|\ \ \ \ \ \ \ \ \
| * \ \ \ \ \ \ \ \ Merge branch 'upstream' into topic/asocTakashi Iwai2008-12-01
| |\ \ \ \ \ \ \ \ \ | | | |_|_|_|_|/ / / | | |/| | | | | | |
| * | | | | | | | | ASoC: Add abbreviation to maintainers for searchabilityMark Brown2008-11-21
| | |/ / / / / / / | |/| | | | | | |
* | | | | | | | | Merge branch 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mch...Linus Torvalds2008-12-24
|\ \ \ \ \ \ \ \ \
| * | | | | | | | | V4L/DVB (9908a): MAINTAINERS: mark linux-uvc-devel as subscribers onlyJiri Slaby2008-12-17
* | | | | | | | | | Maintainer email fixes for inotifyJohn McCutchan2008-12-18
| |_|_|_|_|_|_|_|/ |/| | | | | | | |
* | | | | | | | | eCryptfs: Update maintainersMichael Halcrow2008-12-15
|/ / / / / / / /
v, "Failed to get cpu dai bclk ratio for %s\n", rtd->dai_link->name); return ret; } ret = snd_soc_dai_set_bclk_ratio(rtd->cpu_dai, bclk_ratio); if (ret) { dev_err(card->dev, "Failed to set cpu dai bclk ratio for %s\n", rtd->dai_link->name); return ret; } ret = tegra186_set_params(dai_params, rtd->cpu_dai, rtd, card, rate, channels, formats); if (ret < 0) return ret; } return 0; } static int tegra186_startup(struct snd_pcm_substream *substream) { struct snd_soc_pcm_runtime *rtd = substream->private_data; struct tegra_t186 *machine = snd_soc_card_get_drvdata(rtd->card); struct snd_soc_card *card = rtd->card; int i; if (!machine->unmute_count) { for (i = 0; i < CS53L30_MAX_INDEX; i++) { rtd = snd_soc_get_pcm_runtime(card, dai_link_names[i]); if (rtd) snd_soc_dai_digital_mute(rtd->codec_dai, 0, 0); } } machine->unmute_count++; return 0; } static void tegra186_shutdown(struct snd_pcm_substream *substream) { struct snd_soc_pcm_runtime *rtd = substream->private_data; struct tegra_t186 *machine = snd_soc_card_get_drvdata(rtd->card); struct snd_soc_card *card = rtd->card; int i; machine->unmute_count--; if (!machine->unmute_count) { for (i = 0; i < CS53L30_MAX_INDEX; i++) { rtd = snd_soc_get_pcm_runtime(card, dai_link_names[i]); if (rtd) snd_soc_dai_digital_mute(rtd->codec_dai, 1, 0); } } } static struct snd_soc_ops tegra186_ops = { .startup = tegra186_startup, .shutdown = tegra186_shutdown, .hw_params = tegra186_hw_params, }; static int tegra186_init(struct snd_soc_pcm_runtime *rtd) { struct snd_soc_dai *codec_dai = rtd->codec_dai; struct snd_soc_codec *codec = codec_dai->codec; struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); struct tegra_t186 *machine = snd_soc_card_get_drvdata(rtd->card); struct snd_soc_card *card = rtd->card; int ret; ret = tegra_alt_asoc_utils_set_extern_parent(&machine->audio_clock, "pll_a_out0"); if (ret < 0) { dev_err(card->dev, "Failed to set extern clk parent\n"); return ret; } return snd_soc_dapm_sync(dapm); } static const struct snd_soc_dapm_widget tegra186_dapm_widgets[] = { SND_SOC_DAPM_MIC("AMIC1", NULL), SND_SOC_DAPM_MIC("AMIC2", NULL), SND_SOC_DAPM_MIC("AMIC3", NULL), SND_SOC_DAPM_MIC("AMIC4", NULL), SND_SOC_DAPM_MIC("DMIC1", NULL), SND_SOC_DAPM_MIC("DMIC2", NULL), SND_SOC_DAPM_MIC("AMIC5", NULL), SND_SOC_DAPM_MIC("AMIC6", NULL), SND_SOC_DAPM_MIC("AMIC7", NULL), SND_SOC_DAPM_MIC("AMIC8", NULL), SND_SOC_DAPM_MIC("DMIC3", NULL), SND_SOC_DAPM_MIC("DMIC4", NULL), SND_SOC_DAPM_MIC("Headset Mic", NULL), SND_SOC_DAPM_HP("Headset Stereo", NULL), }; static int tegra186_suspend_pre(struct snd_soc_card *card) { struct snd_soc_pcm_runtime *rtd; /* DAPM dai link stream work for non pcm links */ #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 5, 0) unsigned int idx; for (idx = 0; idx < card->num_rtd; idx++) { rtd = &card->rtd[idx]; #else list_for_each_entry(rtd, &card->rtd_list, list) { #endif if (rtd->dai_link->params) INIT_DELAYED_WORK(&rtd->delayed_work, NULL); } return 0; } static struct snd_soc_card snd_soc_tegra_t186 = { .name = DRV_NAME, .owner = THIS_MODULE, .suspend_pre = tegra186_suspend_pre, .dapm_widgets = tegra186_dapm_widgets, .num_dapm_widgets = ARRAY_SIZE(tegra186_dapm_widgets), .fully_routed = true, }; static bool tegra186_search_dai_link_name(const char *name) { int i = 0; for (i = 0; i < ARRAY_SIZE(dai_link_names); i++) { if (strstr(name, dai_link_names[i])) break; } return i < ARRAY_SIZE(dai_link_names); } static void dai_link_setup(struct platform_device *pdev) { struct snd_soc_card *card = platform_get_drvdata(pdev); struct tegra_t186 *machine = snd_soc_card_get_drvdata(card); struct snd_soc_codec_conf *tegra_machine_codec_conf = NULL; struct snd_soc_codec_conf *tegra186_codec_conf = NULL; struct snd_soc_dai_link *tegra_machine_dai_links = NULL; struct snd_soc_dai_link *tegra186_codec_links = NULL; int i; /* Set new codec links and conf */ tegra186_codec_links = tegra_machine_new_codec_links(pdev, tegra186_codec_links, &machine->num_codec_links); if (!tegra186_codec_links) goto err_alloc_dai_link; machine->codec_link = tegra186_codec_links; /* Set codec init */ for (i = 0; i < machine->num_codec_links; i++) { if (tegra186_search_dai_link_name(tegra186_codec_links[i].name)) tegra186_codec_links[i].init = tegra186_init; } tegra186_codec_conf = tegra_machine_new_codec_conf(pdev, tegra186_codec_conf, &machine->num_codec_links); if (!tegra186_codec_conf) goto err_alloc_dai_link; /* Get the xbar dai link/codec conf structure */ tegra_machine_dai_links = tegra_machine_get_dai_link_t18x(); if (!tegra_machine_dai_links) goto err_alloc_dai_link; tegra_machine_codec_conf = tegra_machine_get_codec_conf_t18x(); if (!tegra_machine_codec_conf) goto err_alloc_dai_link; /* Set ADMAIF dai_ops */ for (i = TEGRA186_DAI_LINK_ADMAIF1; i <= TEGRA186_DAI_LINK_ADMAIF20; i++) tegra_machine_set_dai_ops(i, &tegra186_ops); /* Set ADSP PCM/COMPR */ #if IS_ENABLED(CONFIG_SND_SOC_TEGRA210_ADSP_ALT) for (i = TEGRA186_DAI_LINK_ADSP_PCM1; i <= TEGRA186_DAI_LINK_ADSP_PCM2; i++) { tegra_machine_set_dai_ops(i, &tegra186_ops); } #endif /* Append t186 specific dai_links */ card->num_links = tegra_machine_append_dai_link_t18x(tegra186_codec_links, 2 * machine->num_codec_links); tegra_machine_dai_links = tegra_machine_get_dai_link_t18x(); card->dai_link = tegra_machine_dai_links; /* Append t186 specific codec_conf */ card->num_configs = tegra_machine_append_codec_conf_t18x(tegra186_codec_conf, machine->num_codec_links); tegra_machine_codec_conf = tegra_machine_get_codec_conf_t18x(); card->codec_conf = tegra_machine_codec_conf; return; err_alloc_dai_link: tegra_machine_remove_dai_link(); tegra_machine_remove_codec_conf(); return; } static int tegra186_driver_probe(struct platform_device *pdev) { struct snd_soc_card *card = &snd_soc_tegra_t186; struct device_node *np = pdev->dev.of_node; struct snd_soc_pcm_runtime *rtd; struct device *dev = &pdev->dev; struct tegra_t186 *machine; int ret = 0, i; if (!np) { dev_err(dev, "No device tree node for t186 driver"); return -ENODEV; } machine = devm_kzalloc(dev, sizeof(*machine), GFP_KERNEL); if (!machine) { dev_err(dev, "Can't allocate t186 struct\n"); ret = -ENOMEM; goto err; } card->dev = dev; platform_set_drvdata(pdev, card); snd_soc_card_set_drvdata(card, machine); machine->audio_clock.clk_cdev1_state = 0; card->dapm.idle_bias_off = true; ret = snd_soc_of_parse_card_name(card, "nvidia,model"); if (ret) goto err; ret = snd_soc_of_parse_audio_routing(card, "nvidia,audio-routing"); if (ret) goto err; if (of_property_read_u32(np, "nvidia,num-clk", &machine->audio_clock.num_clk) < 0) { dev_err(dev, "Missing property nvidia,num-clk\n"); ret = -ENODEV; goto err; } if (of_property_read_u32_array(np, "nvidia,clk-rates", (u32 *)&machine->audio_clock.clk_rates, machine->audio_clock.num_clk) < 0) { dev_err(dev, "Missing property nvidia,clk-rates\n"); ret = -ENODEV; goto err; } tegra_machine_dma_set_mask(pdev); dai_link_setup(pdev); machine->pcard = card; ret = tegra_alt_asoc_utils_init(&machine->audio_clock, dev, card); if (ret) goto err_alloc_dai_link; ret = snd_soc_register_card(card); if (ret) { dev_err(dev, "snd_soc_register_card failed (%d)\n", ret); goto err_alloc_dai_link; } for (i = 0; i < ARRAY_SIZE(dai_link_names); i++) { rtd = snd_soc_get_pcm_runtime(card, dai_link_names[i]); if (!rtd) { dev_warn(card->dev, "failed to get pcm runtime: %s\n", dai_link_names[i]); machine->dai_link_probed[i] = false; continue; } machine->dai_link_probed[i] = true; dev_info(dev, "%s <-> %s (%s) mapping ok\n", dev_name(rtd->cpu_dai->dev), rtd->codec_dai->name, dev_name(rtd->codec->dev)); if (i == RT5658_INDEX) rt5659_set_jack_detect(rtd->codec, NULL); } return 0; err_alloc_dai_link: tegra_machine_remove_dai_link(); tegra_machine_remove_codec_conf(); err: return ret; } static int tegra186_driver_remove(struct platform_device *pdev) { struct snd_soc_card *card = platform_get_drvdata(pdev); snd_soc_unregister_card(card); tegra_machine_remove_dai_link(); tegra_machine_remove_codec_conf(); return 0; } static const struct of_device_id tegra186_of_match[] = { { .compatible = "nvidia,tegra186-p4573-audio", }, {}, }; static struct platform_driver tegra186_driver = { .driver = { .name = DRV_NAME, .owner = THIS_MODULE, .pm = &snd_soc_pm_ops, .of_match_table = tegra186_of_match, }, .probe = tegra186_driver_probe, .remove = tegra186_driver_remove, }; module_platform_driver(tegra186_driver); MODULE_DESCRIPTION("Nvidia Tegra186+P4573 ASoC Sound Card driver"); MODULE_AUTHOR("Nicolin Chen <nicolinc@nvidia.com>"); MODULE_DEVICE_TABLE(of, tegra186_of_match); MODULE_ALIAS("platform:" DRV_NAME); MODULE_LICENSE("GPL");