123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151 |
- /*
- * Apple Onboard Audio driver for Toonie codec
- *
- * Copyright 2006 Johannes Berg <johannes@sipsolutions.net>
- *
- * GPL v2, can be found in COPYING.
- *
- *
- * This is a driver for the toonie codec chip. This chip is present
- * on the Mac Mini and is nothing but a DAC.
- */
- #include <linux/delay.h>
- #include <linux/module.h>
- #include <linux/slab.h>
- MODULE_AUTHOR("Johannes Berg <johannes@sipsolutions.net>");
- MODULE_LICENSE("GPL");
- MODULE_DESCRIPTION("toonie codec driver for snd-aoa");
- #include "../aoa.h"
- #include "../soundbus/soundbus.h"
- #define PFX "snd-aoa-codec-toonie: "
- struct toonie {
- struct aoa_codec codec;
- };
- #define codec_to_toonie(c) container_of(c, struct toonie, codec)
- static int toonie_dev_register(struct snd_device *dev)
- {
- return 0;
- }
- static struct snd_device_ops ops = {
- .dev_register = toonie_dev_register,
- };
- static struct transfer_info toonie_transfers[] = {
- /* This thing *only* has analog output,
- * the rates are taken from Info.plist
- * from Darwin. */
- {
- .formats = SNDRV_PCM_FMTBIT_S16_BE |
- SNDRV_PCM_FMTBIT_S24_BE,
- .rates = SNDRV_PCM_RATE_32000 |
- SNDRV_PCM_RATE_44100 |
- SNDRV_PCM_RATE_48000 |
- SNDRV_PCM_RATE_88200 |
- SNDRV_PCM_RATE_96000,
- },
- {}
- };
- static int toonie_usable(struct codec_info_item *cii,
- struct transfer_info *ti,
- struct transfer_info *out)
- {
- return 1;
- }
- #ifdef CONFIG_PM
- static int toonie_suspend(struct codec_info_item *cii, pm_message_t state)
- {
- /* can we turn it off somehow? */
- return 0;
- }
- static int toonie_resume(struct codec_info_item *cii)
- {
- return 0;
- }
- #endif /* CONFIG_PM */
- static struct codec_info toonie_codec_info = {
- .transfers = toonie_transfers,
- .sysclock_factor = 256,
- .bus_factor = 64,
- .owner = THIS_MODULE,
- .usable = toonie_usable,
- #ifdef CONFIG_PM
- .suspend = toonie_suspend,
- .resume = toonie_resume,
- #endif
- };
- static int toonie_init_codec(struct aoa_codec *codec)
- {
- struct toonie *toonie = codec_to_toonie(codec);
- /* nothing connected? what a joke! */
- if (toonie->codec.connected != 1)
- return -ENOTCONN;
- if (aoa_snd_device_new(SNDRV_DEV_CODEC, toonie, &ops)) {
- printk(KERN_ERR PFX "failed to create toonie snd device!\n");
- return -ENODEV;
- }
- if (toonie->codec.soundbus_dev->attach_codec(toonie->codec.soundbus_dev,
- aoa_get_card(),
- &toonie_codec_info, toonie)) {
- printk(KERN_ERR PFX "error creating toonie pcm\n");
- snd_device_free(aoa_get_card(), toonie);
- return -ENODEV;
- }
- return 0;
- }
- static void toonie_exit_codec(struct aoa_codec *codec)
- {
- struct toonie *toonie = codec_to_toonie(codec);
- if (!toonie->codec.soundbus_dev) {
- printk(KERN_ERR PFX "toonie_exit_codec called without soundbus_dev!\n");
- return;
- }
- toonie->codec.soundbus_dev->detach_codec(toonie->codec.soundbus_dev, toonie);
- }
- static struct toonie *toonie;
- static int __init toonie_init(void)
- {
- toonie = kzalloc(sizeof(struct toonie), GFP_KERNEL);
- if (!toonie)
- return -ENOMEM;
- strlcpy(toonie->codec.name, "toonie", sizeof(toonie->codec.name));
- toonie->codec.owner = THIS_MODULE;
- toonie->codec.init = toonie_init_codec;
- toonie->codec.exit = toonie_exit_codec;
- if (aoa_codec_register(&toonie->codec)) {
- kfree(toonie);
- return -EINVAL;
- }
- return 0;
- }
- static void __exit toonie_exit(void)
- {
- aoa_codec_unregister(&toonie->codec);
- kfree(toonie);
- }
- module_init(toonie_init);
- module_exit(toonie_exit);
|