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; 116a85787edSPeter Rosin unsigned int forced_divider; 1176c742509SSedji Gaouaou struct atmel_pcm_dma_params *dma_params[2]; 1186c742509SSedji Gaouaou struct atmel_ssc_state ssc_state; 119b6d6c6e9SPeter Rosin unsigned long mck_rate; 1206c742509SSedji Gaouaou }; 1216c742509SSedji Gaouaou 122be681a82SBo Shen int atmel_ssc_set_audio(int ssc_id); 123be681a82SBo Shen void atmel_ssc_put_audio(int ssc_id); 124abfa4eaeSMark Brown 1256c742509SSedji Gaouaou #endif /* _AT91_SSC_DAI_H */ 126