/***************************************************************************** * Copyright 2011 Broadcom Corporation. All rights reserved. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2, available at * http://www.broadcom.com/licenses/GPLv2.php (the "GPL"). * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a * license other than the GPL, without Broadcom's express prior written * consent. *****************************************************************************/ #ifndef __SOUND_ARM_BCM2835_H #define __SOUND_ARM_BCM2835_H #include #include #include #include #include #include #include #include #include #include /* #define AUDIO_DEBUG_ENABLE #define AUDIO_VERBOSE_DEBUG_ENABLE */ /* Debug macros */ #ifdef AUDIO_DEBUG_ENABLE #ifdef AUDIO_VERBOSE_DEBUG_ENABLE #define audio_debug(fmt, arg...) \ printk(KERN_INFO"%s:%d " fmt, __func__, __LINE__, ##arg) #define audio_info(fmt, arg...) \ printk(KERN_INFO"%s:%d " fmt, __func__, __LINE__, ##arg) #else #define audio_debug(fmt, arg...) #define audio_info(fmt, arg...) #endif /* AUDIO_VERBOSE_DEBUG_ENABLE */ #else #define audio_debug(fmt, arg...) #define audio_info(fmt, arg...) #endif /* AUDIO_DEBUG_ENABLE */ #define audio_error(fmt, arg...) \ printk(KERN_ERR"%s:%d " fmt, __func__, __LINE__, ##arg) #define audio_warning(fmt, arg...) \ printk(KERN_WARNING"%s:%d " fmt, __func__, __LINE__, ##arg) #define audio_alert(fmt, arg...) \ printk(KERN_ALERT"%s:%d " fmt, __func__, __LINE__, ##arg) #define MAX_SUBSTREAMS (8) #define AVAIL_SUBSTREAMS_MASK (0xff) enum { CTRL_VOL_MUTE, CTRL_VOL_UNMUTE }; /* macros for alsa2chip and chip2alsa, instead of functions */ #define alsa2chip(vol) (uint)(-((vol << 8) / 100)) /* convert alsa to chip volume (defined as macro rather than function call) */ #define chip2alsa(vol) -((vol * 100) >> 8) /* convert chip to alsa volume */ /* Some constants for values .. */ enum snd_bcm2835_route { AUDIO_DEST_AUTO = 0, AUDIO_DEST_HEADPHONES = 1, AUDIO_DEST_HDMI = 2, AUDIO_DEST_MAX, }; enum snd_bcm2835_ctrl { PCM_PLAYBACK_VOLUME, PCM_PLAYBACK_MUTE, PCM_PLAYBACK_DEVICE, }; /* definition of the chip-specific record */ struct bcm2835_chip { struct snd_card *card; struct snd_pcm *pcm; struct snd_pcm *pcm_spdif; /* Bitmat for valid reg_base and irq numbers */ unsigned int avail_substreams; struct platform_device *pdev[MAX_SUBSTREAMS]; struct bcm2835_alsa_stream *alsa_stream[MAX_SUBSTREAMS]; int volume; int old_volume; /* stores the volume value whist muted */ int dest; int mute; unsigned int opened; unsigned int spdif_status; struct mutex audio_mutex; }; struct bcm2835_alsa_stream { struct bcm2835_chip *chip; struct snd_pcm_substream *substream; struct snd_pcm_indirect pcm_indirect; struct semaphore buffers_update_sem; struct semaphore control_sem; spinlock_t lock; volatile unsigned int control; volatile unsigned int status; int open; int running; int draining; int channels; int params_rate; int pcm_format_width; unsigned int pos; unsigned int buffer_size; unsigned int period_size; atomic_t retrieved; struct bcm2835_audio_instance *instance; struct workqueue_struct *my_wq; int idx; }; int snd_bcm2835_new_ctl(struct bcm2835_chip *chip); int snd_bcm2835_new_pcm(struct bcm2835_chip *chip); int snd_bcm2835_new_spdif_pcm(struct bcm2835_chip *chip); int bcm2835_audio_open(struct bcm2835_alsa_stream *alsa_stream); int bcm2835_audio_close(struct bcm2835_alsa_stream *alsa_stream); int bcm2835_audio_set_params(struct bcm2835_alsa_stream *alsa_stream, unsigned int channels, unsigned int samplerate, unsigned int bps); int bcm2835_audio_setup(struct bcm2835_alsa_stream *alsa_stream); int bcm2835_audio_start(struct bcm2835_alsa_stream *alsa_stream); int bcm2835_audio_stop(struct bcm2835_alsa_stream *alsa_stream); int bcm2835_audio_set_ctls(struct bcm2835_chip *chip); int bcm2835_audio_write(struct bcm2835_alsa_stream *alsa_stream, unsigned int count, void *src); void bcm2835_playback_fifo(struct bcm2835_alsa_stream *alsa_stream); unsigned int bcm2835_audio_retrieve_buffers(struct bcm2835_alsa_stream *alsa_stream); void bcm2835_audio_flush_buffers(struct bcm2835_alsa_stream *alsa_stream); void bcm2835_audio_flush_playback_buffers(struct bcm2835_alsa_stream *alsa_stream); #endif /* __SOUND_ARM_BCM2835_H */