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