root/sound/soc/atmel/atmel_ssc_dai.h
/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
 * atmel_ssc_dai.h - ALSA SSC interface for the Atmel  SoC
 *
 * Copyright (C) 2005 SAN People
 * Copyright (C) 2008 Atmel
 *
 * Author: Sedji Gaouaou <sedji.gaouaou@atmel.com>
 *         ATMEL CORP.
 *
 * Based on at91-ssc.c by
 * Frank Mandarino <fmandarino@endrelia.com>
 * Based on pxa2xx Platform drivers by
 * Liam Girdwood <lrg@slimlogic.co.uk>
 */

#ifndef _ATMEL_SSC_DAI_H
#define _ATMEL_SSC_DAI_H

#include <linux/types.h>
#include <linux/atmel-ssc.h>

#include "atmel-pcm.h"

/* SSC system clock ids */
#define ATMEL_SYSCLK_MCK        0 /* SSC uses AT91 MCK as system clock */

/* SSC divider ids */
#define ATMEL_SSC_CMR_DIV       0 /* MCK divider for BCLK */
#define ATMEL_SSC_TCMR_PERIOD   1 /* BCLK divider for transmit FS */
#define ATMEL_SSC_RCMR_PERIOD   2 /* BCLK divider for receive FS */
/*
 * SSC direction masks
 */
#define SSC_DIR_MASK_UNUSED     0
#define SSC_DIR_MASK_PLAYBACK   1
#define SSC_DIR_MASK_CAPTURE    2

/*
 * SSC register values that Atmel left out of <linux/atmel-ssc.h>.  These
 * are expected to be used with SSC_BF
 */
/* START bit field values */
#define SSC_START_CONTINUOUS    0
#define SSC_START_TX_RX         1
#define SSC_START_LOW_RF        2
#define SSC_START_HIGH_RF       3
#define SSC_START_FALLING_RF    4
#define SSC_START_RISING_RF     5
#define SSC_START_LEVEL_RF      6
#define SSC_START_EDGE_RF       7
#define SSS_START_COMPARE_0     8

/* CKI bit field values */
#define SSC_CKI_FALLING         0
#define SSC_CKI_RISING          1

/* CKO bit field values */
#define SSC_CKO_NONE            0
#define SSC_CKO_CONTINUOUS      1
#define SSC_CKO_TRANSFER        2

/* CKS bit field values */
#define SSC_CKS_DIV             0
#define SSC_CKS_CLOCK           1
#define SSC_CKS_PIN             2

/* FSEDGE bit field values */
#define SSC_FSEDGE_POSITIVE     0
#define SSC_FSEDGE_NEGATIVE     1

/* FSOS bit field values */
#define SSC_FSOS_NONE           0
#define SSC_FSOS_NEGATIVE       1
#define SSC_FSOS_POSITIVE       2
#define SSC_FSOS_LOW            3
#define SSC_FSOS_HIGH           4
#define SSC_FSOS_TOGGLE         5

#define START_DELAY             1

struct atmel_ssc_state {
        u32 ssc_cmr;
        u32 ssc_rcmr;
        u32 ssc_rfmr;
        u32 ssc_tcmr;
        u32 ssc_tfmr;
        u32 ssc_sr;
        u32 ssc_imr;
};


struct atmel_ssc_info {
        char *name;
        struct ssc_device *ssc;
        unsigned short dir_mask;        /* 0=unused, 1=playback, 2=capture */
        unsigned short initialized;     /* true if SSC has been initialized */
        unsigned short daifmt;
        unsigned short cmr_div;
        unsigned short tcmr_period;
        unsigned short rcmr_period;
        unsigned int forced_divider;
        struct atmel_pcm_dma_params *dma_params[2];
        struct atmel_ssc_state ssc_state;
        unsigned long mck_rate;
};

int atmel_ssc_set_audio(int ssc_id);
void atmel_ssc_put_audio(int ssc_id);

#endif /* _AT91_SSC_DAI_H */