1 /* 2 * Driver for generic Bluetooth SCO link 3 * Copyright 2011 Lars-Peter Clausen <lars@metafoo.de> 4 * 5 * This program is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License as published by the 7 * Free Software Foundation; either version 2 of the License, or (at your 8 * option) any later version. 9 * 10 */ 11 12 #include <linux/init.h> 13 #include <linux/module.h> 14 #include <linux/platform_device.h> 15 16 #include <sound/soc.h> 17 18 static const struct snd_soc_dapm_widget bt_sco_widgets[] = { 19 SND_SOC_DAPM_INPUT("RX"), 20 SND_SOC_DAPM_OUTPUT("TX"), 21 }; 22 23 static const struct snd_soc_dapm_route bt_sco_routes[] = { 24 { "Capture", NULL, "RX" }, 25 { "TX", NULL, "Playback" }, 26 }; 27 28 static struct snd_soc_dai_driver bt_sco_dai[] = { 29 { 30 .name = "bt-sco-pcm", 31 .playback = { 32 .stream_name = "Playback", 33 .channels_min = 1, 34 .channels_max = 1, 35 .rates = SNDRV_PCM_RATE_8000, 36 .formats = SNDRV_PCM_FMTBIT_S16_LE, 37 }, 38 .capture = { 39 .stream_name = "Capture", 40 .channels_min = 1, 41 .channels_max = 1, 42 .rates = SNDRV_PCM_RATE_8000, 43 .formats = SNDRV_PCM_FMTBIT_S16_LE, 44 }, 45 }, 46 { 47 .name = "bt-sco-pcm-wb", 48 .playback = { 49 .stream_name = "Playback", 50 .channels_min = 1, 51 .channels_max = 1, 52 .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000, 53 .formats = SNDRV_PCM_FMTBIT_S16_LE, 54 }, 55 .capture = { 56 .stream_name = "Capture", 57 .channels_min = 1, 58 .channels_max = 1, 59 .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000, 60 .formats = SNDRV_PCM_FMTBIT_S16_LE, 61 }, 62 } 63 }; 64 65 static const struct snd_soc_component_driver soc_component_dev_bt_sco = { 66 .dapm_widgets = bt_sco_widgets, 67 .num_dapm_widgets = ARRAY_SIZE(bt_sco_widgets), 68 .dapm_routes = bt_sco_routes, 69 .num_dapm_routes = ARRAY_SIZE(bt_sco_routes), 70 .idle_bias_on = 1, 71 .use_pmdown_time = 1, 72 .endianness = 1, 73 .non_legacy_dai_naming = 1, 74 }; 75 76 static int bt_sco_probe(struct platform_device *pdev) 77 { 78 return devm_snd_soc_register_component(&pdev->dev, 79 &soc_component_dev_bt_sco, 80 bt_sco_dai, ARRAY_SIZE(bt_sco_dai)); 81 } 82 83 static int bt_sco_remove(struct platform_device *pdev) 84 { 85 return 0; 86 } 87 88 static const struct platform_device_id bt_sco_driver_ids[] = { 89 { 90 .name = "dfbmcs320", 91 }, 92 { 93 .name = "bt-sco", 94 }, 95 {}, 96 }; 97 MODULE_DEVICE_TABLE(platform, bt_sco_driver_ids); 98 99 #if defined(CONFIG_OF) 100 static const struct of_device_id bt_sco_codec_of_match[] = { 101 { .compatible = "delta,dfbmcs320", }, 102 { .compatible = "linux,bt-sco", }, 103 {}, 104 }; 105 MODULE_DEVICE_TABLE(of, bt_sco_codec_of_match); 106 #endif 107 108 static struct platform_driver bt_sco_driver = { 109 .driver = { 110 .name = "bt-sco", 111 .of_match_table = of_match_ptr(bt_sco_codec_of_match), 112 }, 113 .probe = bt_sco_probe, 114 .remove = bt_sco_remove, 115 .id_table = bt_sco_driver_ids, 116 }; 117 118 module_platform_driver(bt_sco_driver); 119 120 MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>"); 121 MODULE_DESCRIPTION("ASoC generic bluetooth sco link driver"); 122 MODULE_LICENSE("GPL"); 123