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_codec_driver soc_codec_dev_bt_sco = { 66 .component_driver = { 67 .dapm_widgets = bt_sco_widgets, 68 .num_dapm_widgets = ARRAY_SIZE(bt_sco_widgets), 69 .dapm_routes = bt_sco_routes, 70 .num_dapm_routes = ARRAY_SIZE(bt_sco_routes), 71 }, 72 }; 73 74 static int bt_sco_probe(struct platform_device *pdev) 75 { 76 return snd_soc_register_codec(&pdev->dev, &soc_codec_dev_bt_sco, 77 bt_sco_dai, ARRAY_SIZE(bt_sco_dai)); 78 } 79 80 static int bt_sco_remove(struct platform_device *pdev) 81 { 82 snd_soc_unregister_codec(&pdev->dev); 83 84 return 0; 85 } 86 87 static const struct platform_device_id bt_sco_driver_ids[] = { 88 { 89 .name = "dfbmcs320", 90 }, 91 { 92 .name = "bt-sco", 93 }, 94 {}, 95 }; 96 MODULE_DEVICE_TABLE(platform, bt_sco_driver_ids); 97 98 #if defined(CONFIG_OF) 99 static const struct of_device_id bt_sco_codec_of_match[] = { 100 { .compatible = "delta,dfbmcs320", }, 101 { .compatible = "linux,bt-sco", }, 102 {}, 103 }; 104 MODULE_DEVICE_TABLE(of, bt_sco_codec_of_match); 105 #endif 106 107 static struct platform_driver bt_sco_driver = { 108 .driver = { 109 .name = "bt-sco", 110 .of_match_table = of_match_ptr(bt_sco_codec_of_match), 111 }, 112 .probe = bt_sco_probe, 113 .remove = bt_sco_remove, 114 .id_table = bt_sco_driver_ids, 115 }; 116 117 module_platform_driver(bt_sco_driver); 118 119 MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>"); 120 MODULE_DESCRIPTION("ASoC generic bluetooth sco link driver"); 121 MODULE_LICENSE("GPL"); 122