xref: /openbmc/linux/sound/soc/atmel/atmel_ssc_dai.h (revision abfa4eae)
16c742509SSedji Gaouaou /*
26c742509SSedji Gaouaou  * atmel_ssc_dai.h - ALSA SSC interface for the Atmel  SoC
36c742509SSedji Gaouaou  *
46c742509SSedji Gaouaou  * Copyright (C) 2005 SAN People
56c742509SSedji Gaouaou  * Copyright (C) 2008 Atmel
66c742509SSedji Gaouaou  *
76c742509SSedji Gaouaou  * Author: Sedji Gaouaou <sedji.gaouaou@atmel.com>
86c742509SSedji Gaouaou  *         ATMEL CORP.
96c742509SSedji Gaouaou  *
106c742509SSedji Gaouaou  * Based on at91-ssc.c by
116c742509SSedji Gaouaou  * Frank Mandarino <fmandarino@endrelia.com>
126c742509SSedji Gaouaou  * Based on pxa2xx Platform drivers by
1364ca0404SLiam Girdwood  * Liam Girdwood <lrg@slimlogic.co.uk>
146c742509SSedji Gaouaou  *
156c742509SSedji Gaouaou  * This program is free software; you can redistribute it and/or modify
166c742509SSedji Gaouaou  * it under the terms of the GNU General Public License as published by
176c742509SSedji Gaouaou  * the Free Software Foundation; either version 2 of the License, or
186c742509SSedji Gaouaou  * (at your option) any later version.
196c742509SSedji Gaouaou  *
206c742509SSedji Gaouaou  * This program is distributed in the hope that it will be useful,
216c742509SSedji Gaouaou  * but WITHOUT ANY WARRANTY; without even the implied warranty of
226c742509SSedji Gaouaou  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
236c742509SSedji Gaouaou  * GNU General Public License for more details.
246c742509SSedji Gaouaou  *
256c742509SSedji Gaouaou  * You should have received a copy of the GNU General Public License
266c742509SSedji Gaouaou  * along with this program; if not, write to the Free Software
276c742509SSedji Gaouaou  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
286c742509SSedji Gaouaou  */
296c742509SSedji Gaouaou 
306c742509SSedji Gaouaou #ifndef _ATMEL_SSC_DAI_H
316c742509SSedji Gaouaou #define _ATMEL_SSC_DAI_H
326c742509SSedji Gaouaou 
336c742509SSedji Gaouaou #include <linux/types.h>
346c742509SSedji Gaouaou #include <linux/atmel-ssc.h>
356c742509SSedji Gaouaou 
366c742509SSedji Gaouaou #include "atmel-pcm.h"
376c742509SSedji Gaouaou 
386c742509SSedji Gaouaou /* SSC system clock ids */
396c742509SSedji Gaouaou #define ATMEL_SYSCLK_MCK	0 /* SSC uses AT91 MCK as system clock */
406c742509SSedji Gaouaou 
416c742509SSedji Gaouaou /* SSC divider ids */
426c742509SSedji Gaouaou #define ATMEL_SSC_CMR_DIV	0 /* MCK divider for BCLK */
436c742509SSedji Gaouaou #define ATMEL_SSC_TCMR_PERIOD	1 /* BCLK divider for transmit FS */
446c742509SSedji Gaouaou #define ATMEL_SSC_RCMR_PERIOD	2 /* BCLK divider for receive FS */
456c742509SSedji Gaouaou /*
466c742509SSedji Gaouaou  * SSC direction masks
476c742509SSedji Gaouaou  */
486c742509SSedji Gaouaou #define SSC_DIR_MASK_UNUSED	0
496c742509SSedji Gaouaou #define SSC_DIR_MASK_PLAYBACK	1
506c742509SSedji Gaouaou #define SSC_DIR_MASK_CAPTURE	2
516c742509SSedji Gaouaou 
526c742509SSedji Gaouaou /*
536c742509SSedji Gaouaou  * SSC register values that Atmel left out of <linux/atmel-ssc.h>.  These
546c742509SSedji Gaouaou  * are expected to be used with SSC_BF
556c742509SSedji Gaouaou  */
566c742509SSedji Gaouaou /* START bit field values */
576c742509SSedji Gaouaou #define SSC_START_CONTINUOUS	0
586c742509SSedji Gaouaou #define SSC_START_TX_RX		1
596c742509SSedji Gaouaou #define SSC_START_LOW_RF	2
606c742509SSedji Gaouaou #define SSC_START_HIGH_RF	3
616c742509SSedji Gaouaou #define SSC_START_FALLING_RF	4
626c742509SSedji Gaouaou #define SSC_START_RISING_RF	5
636c742509SSedji Gaouaou #define SSC_START_LEVEL_RF	6
646c742509SSedji Gaouaou #define SSC_START_EDGE_RF	7
656c742509SSedji Gaouaou #define SSS_START_COMPARE_0	8
666c742509SSedji Gaouaou 
676c742509SSedji Gaouaou /* CKI bit field values */
686c742509SSedji Gaouaou #define SSC_CKI_FALLING		0
696c742509SSedji Gaouaou #define SSC_CKI_RISING		1
706c742509SSedji Gaouaou 
716c742509SSedji Gaouaou /* CKO bit field values */
726c742509SSedji Gaouaou #define SSC_CKO_NONE		0
736c742509SSedji Gaouaou #define SSC_CKO_CONTINUOUS	1
746c742509SSedji Gaouaou #define SSC_CKO_TRANSFER	2
756c742509SSedji Gaouaou 
766c742509SSedji Gaouaou /* CKS bit field values */
776c742509SSedji Gaouaou #define SSC_CKS_DIV		0
786c742509SSedji Gaouaou #define SSC_CKS_CLOCK		1
796c742509SSedji Gaouaou #define SSC_CKS_PIN		2
806c742509SSedji Gaouaou 
816c742509SSedji Gaouaou /* FSEDGE bit field values */
826c742509SSedji Gaouaou #define SSC_FSEDGE_POSITIVE	0
836c742509SSedji Gaouaou #define SSC_FSEDGE_NEGATIVE	1
846c742509SSedji Gaouaou 
856c742509SSedji Gaouaou /* FSOS bit field values */
866c742509SSedji Gaouaou #define SSC_FSOS_NONE		0
876c742509SSedji Gaouaou #define SSC_FSOS_NEGATIVE	1
886c742509SSedji Gaouaou #define SSC_FSOS_POSITIVE	2
896c742509SSedji Gaouaou #define SSC_FSOS_LOW		3
906c742509SSedji Gaouaou #define SSC_FSOS_HIGH		4
916c742509SSedji Gaouaou #define SSC_FSOS_TOGGLE		5
926c742509SSedji Gaouaou 
936c742509SSedji Gaouaou #define START_DELAY		1
946c742509SSedji Gaouaou 
956c742509SSedji Gaouaou struct atmel_ssc_state {
966c742509SSedji Gaouaou 	u32 ssc_cmr;
976c742509SSedji Gaouaou 	u32 ssc_rcmr;
986c742509SSedji Gaouaou 	u32 ssc_rfmr;
996c742509SSedji Gaouaou 	u32 ssc_tcmr;
1006c742509SSedji Gaouaou 	u32 ssc_tfmr;
1016c742509SSedji Gaouaou 	u32 ssc_sr;
1026c742509SSedji Gaouaou 	u32 ssc_imr;
1036c742509SSedji Gaouaou };
1046c742509SSedji Gaouaou 
1056c742509SSedji Gaouaou 
1066c742509SSedji Gaouaou struct atmel_ssc_info {
1076c742509SSedji Gaouaou 	char *name;
1086c742509SSedji Gaouaou 	struct ssc_device *ssc;
1096c742509SSedji Gaouaou 	spinlock_t lock;	/* lock for dir_mask */
1106c742509SSedji Gaouaou 	unsigned short dir_mask;	/* 0=unused, 1=playback, 2=capture */
1116c742509SSedji Gaouaou 	unsigned short initialized;	/* true if SSC has been initialized */
1126c742509SSedji Gaouaou 	unsigned short daifmt;
1136c742509SSedji Gaouaou 	unsigned short cmr_div;
1146c742509SSedji Gaouaou 	unsigned short tcmr_period;
1156c742509SSedji Gaouaou 	unsigned short rcmr_period;
1166c742509SSedji Gaouaou 	struct atmel_pcm_dma_params *dma_params[2];
1176c742509SSedji Gaouaou 	struct atmel_ssc_state ssc_state;
1186c742509SSedji Gaouaou };
1196c742509SSedji Gaouaou 
120abfa4eaeSMark Brown int atmel_ssc_set_audio(int ssc);
121abfa4eaeSMark Brown 
1226c742509SSedji Gaouaou #endif /* _AT91_SSC_DAI_H */
123