summaryrefslogtreecommitdiff
path: root/arch/arm/mach-tegra/include/mach/tegra_i2s.h
blob: aff5e8002a6d07613ff9c6e83c0d9d9308dc438d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
/*
 * arch/arm/mach-tegra/include/mach/tegra_i2s.h
 *
 * Copyright (C) 2010-2011 NVIDIA Corporation
 *
 * This software is licensed under the terms of the GNU General Public
 * License version 2, as published by the Free Software Foundation, and
 * may be copied, distributed, and modified under those terms.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 */

#ifndef __ARCH_ARM_MACH_TEGRA_I2S_H
#define __ARCH_ARM_MACH_TEGRA_I2S_H

#include <linux/kernel.h>
#include <linux/types.h>

/*
* Struct defined to set all the needed i2s format informations
*/
struct tegra_i2s_channel_property {
	int channletype;	/* tx or rx */
	int dataoffset;		/* Data offset to Fsync */
	int bit_order;		/* MSB/LSB first */
	int bit_mask;		/* mask bits to get exact bit size in PCM */
	int num_slot;		/* no of slots in the channel in TDM mode */
	int fifo_attn;		/* fifo attention */
	int dma_ch;		/* dma channel being used */
	int stream_index;	/* stream index being used */
	int enable_refcnt;	/* enable ref count */
};

struct tegra_i2s_property {

	int audio_mode;		/* I2S,LJM,RJM,DSP,PCM,NW,TDM*/
	bool master_mode;	/* master/slave */
	int lrck_polarity;	/* low on left/ high on left */
	int bit_code;		/* linear/uLaw/alaw */
	int bit_size;		/* 8/12/16/20/24/28/32 */
	int fifo_fmt;		/* fifo format */

	int channels;		/* channels */
	int sample_rate;	/* Sample rate */
	unsigned long clk_rate; /* clock rate */

	int total_slots;	/* no of slots per fsync */
	int fsync_width;	/* Fsync width in terms of bit clocks */
	int highz_control;	/* Highz control */
	int edge_control;	/* sample data on edge */
	int rx_bit_offset;	/* Data offset to FSync for TDM mode */
	int tx_bit_offset;  /* Data offset to FSync for TDM mode */
	int tx_slot_enables; /* Number of slots enabled in the Fsync */
	int rx_slot_enables; /* Number of slots enabled in the Fsync */
	int tdm_bitsize;

	struct clk *i2s_clk;
	struct clk *i2s_sync_clk;
	struct clk *audio_clk;
	struct clk *audio2x_clk;
};

/* APIs */
void i2s_dump_registers(int ifc);
int i2s_suspend(int ifc);
int i2s_resume(int ifc);
int i2s_fifo_enable(int ifc, int fifo, int on);
int i2s_fifo_clear(int ifc, int fifo);
int i2s_fifo_set_attention_level(int ifc, int fifo, unsigned level);
int i2s_get_dma_requestor(int ifc, int fifo_mode);
int i2s_free_dma_requestor(int ifc, int fifo_mode);
phys_addr_t i2s_get_fifo_phy_base(int ifc, int fifo);
u32 i2s_get_status(int ifc, int fifo);

int i2s_set_loopback(int ifc, int on);
int i2s_set_master(int ifc, int master);
int i2s_set_left_right_control_polarity(int ifc, int left_low);
int i2s_set_channel_bit_count(int ifc, int sampling, int bitclk);
int i2s_init(int ifc, struct tegra_i2s_property* pi2sprop);
int i2s_set_bit_format(int ifc, unsigned format);
int i2s_set_bit_size(int ifc, unsigned bit_size);

int i2s_set_fifo_irq_on_err(int ifc, int fifo, int on);
int i2s_set_fifo_irq_on_qe(int ifc, int fifo, int on);

int i2s_fifo_write(int ifc, int fifo, u32 data);
u32 i2s_fifo_read(int ifc, int fifo);

u32 i2s_get_control(int ifc);
int i2s_ack_status(int ifc);
u32 i2s_get_fifo_scr(int ifc);
u32 i2s_get_fifo_full_empty_count(int ifc, int fifo);
struct clk *i2s_get_clock_by_name(const char *name);

int i2s_set_fifo_attention(int ifc, int fifo_mode, int buffersize);
int i2s_set_samplerate(int ifc, int samplerate);
int i2s_set_channels(int ifc, int channels);

int i2s_clock_disable(int ifc, int fifo_mode);
int i2s_clock_enable(int ifc, int fifo_mode);
int i2s_close(int ifc);
int i2s_clock_set_parent(int ifc, int mode, int parent);
int i2s_clock_set_rate(int ifc, int mode, int rate);

#endif /* __ARCH_ARM_MACH_TEGRA_I2S_H */