7
7
#include <linux/hdmi.h>
8
8
#include "hdmi.h"
9
9
10
- /* maps MSM_HDMI_AUDIO_CHANNEL_n consts used by audio driver to # of channels: */
11
- static int nchannels [] = { 2 , 4 , 6 , 8 };
12
-
13
10
/* Supported HDMI Audio sample rates */
14
11
#define MSM_HDMI_SAMPLE_RATE_32KHZ 0
15
12
#define MSM_HDMI_SAMPLE_RATE_44_1KHZ 1
@@ -74,16 +71,17 @@ static const struct hdmi_msm_audio_arcs *get_arcs(unsigned long int pixclock)
74
71
int msm_hdmi_audio_update (struct hdmi * hdmi )
75
72
{
76
73
struct hdmi_audio * audio = & hdmi -> audio ;
77
- struct hdmi_audio_infoframe * info = & audio -> infoframe ;
78
74
const struct hdmi_msm_audio_arcs * arcs = NULL ;
79
75
bool enabled = audio -> enabled ;
80
76
uint32_t acr_pkt_ctrl , vbi_pkt_ctrl , aud_pkt_ctrl ;
81
- uint32_t infofrm_ctrl , audio_config ;
77
+ uint32_t audio_config ;
78
+
79
+ if (!hdmi -> connector -> display_info .is_hdmi )
80
+ return - EINVAL ;
81
+
82
+ DBG ("audio: enabled=%d, channels=%d, rate=%d" ,
83
+ audio -> enabled , audio -> channels , audio -> rate );
82
84
83
- DBG ("audio: enabled=%d, channels=%d, channel_allocation=0x%x, "
84
- "level_shift_value=%d, downmix_inhibit=%d, rate=%d" ,
85
- audio -> enabled , info -> channels , info -> channel_allocation ,
86
- info -> level_shift_value , info -> downmix_inhibit , audio -> rate );
87
85
DBG ("video: power_on=%d, pixclock=%lu" , hdmi -> power_on , hdmi -> pixclock );
88
86
89
87
if (enabled && !(hdmi -> power_on && hdmi -> pixclock )) {
@@ -104,7 +102,6 @@ int msm_hdmi_audio_update(struct hdmi *hdmi)
104
102
acr_pkt_ctrl = hdmi_read (hdmi , REG_HDMI_ACR_PKT_CTRL );
105
103
vbi_pkt_ctrl = hdmi_read (hdmi , REG_HDMI_VBI_PKT_CTRL );
106
104
aud_pkt_ctrl = hdmi_read (hdmi , REG_HDMI_AUDIO_PKT_CTRL1 );
107
- infofrm_ctrl = hdmi_read (hdmi , REG_HDMI_INFOFRAME_CTRL0 );
108
105
audio_config = hdmi_read (hdmi , REG_HDMI_AUDIO_CFG );
109
106
110
107
/* Clear N/CTS selection bits */
@@ -113,7 +110,6 @@ int msm_hdmi_audio_update(struct hdmi *hdmi)
113
110
if (enabled ) {
114
111
uint32_t n , cts , multiplier ;
115
112
enum hdmi_acr_cts select ;
116
- uint8_t buf [14 ];
117
113
118
114
n = arcs -> lut [audio -> rate ].n ;
119
115
cts = arcs -> lut [audio -> rate ].cts ;
@@ -155,32 +151,19 @@ int msm_hdmi_audio_update(struct hdmi *hdmi)
155
151
HDMI_ACR_1_N (n ));
156
152
157
153
hdmi_write (hdmi , REG_HDMI_AUDIO_PKT_CTRL2 ,
158
- COND (info -> channels != 2 , HDMI_AUDIO_PKT_CTRL2_LAYOUT ) |
154
+ COND (audio -> channels != 2 , HDMI_AUDIO_PKT_CTRL2_LAYOUT ) |
159
155
HDMI_AUDIO_PKT_CTRL2_OVERRIDE );
160
156
161
157
acr_pkt_ctrl |= HDMI_ACR_PKT_CTRL_CONT ;
162
158
acr_pkt_ctrl |= HDMI_ACR_PKT_CTRL_SEND ;
163
159
164
- /* configure infoframe: */
165
- hdmi_audio_infoframe_pack (info , buf , sizeof (buf ));
166
- hdmi_write (hdmi , REG_HDMI_AUDIO_INFO0 ,
167
- (buf [3 ] << 0 ) | (buf [4 ] << 8 ) |
168
- (buf [5 ] << 16 ) | (buf [6 ] << 24 ));
169
- hdmi_write (hdmi , REG_HDMI_AUDIO_INFO1 ,
170
- (buf [7 ] << 0 ) | (buf [8 ] << 8 ));
171
-
172
160
hdmi_write (hdmi , REG_HDMI_GC , 0 );
173
161
174
162
vbi_pkt_ctrl |= HDMI_VBI_PKT_CTRL_GC_ENABLE ;
175
163
vbi_pkt_ctrl |= HDMI_VBI_PKT_CTRL_GC_EVERY_FRAME ;
176
164
177
165
aud_pkt_ctrl |= HDMI_AUDIO_PKT_CTRL1_AUDIO_SAMPLE_SEND ;
178
166
179
- infofrm_ctrl |= HDMI_INFOFRAME_CTRL0_AUDIO_INFO_SEND ;
180
- infofrm_ctrl |= HDMI_INFOFRAME_CTRL0_AUDIO_INFO_CONT ;
181
- infofrm_ctrl |= HDMI_INFOFRAME_CTRL0_AUDIO_INFO_SOURCE ;
182
- infofrm_ctrl |= HDMI_INFOFRAME_CTRL0_AUDIO_INFO_UPDATE ;
183
-
184
167
audio_config &= ~HDMI_AUDIO_CFG_FIFO_WATERMARK__MASK ;
185
168
audio_config |= HDMI_AUDIO_CFG_FIFO_WATERMARK (4 );
186
169
audio_config |= HDMI_AUDIO_CFG_ENGINE_ENABLE ;
@@ -190,17 +173,12 @@ int msm_hdmi_audio_update(struct hdmi *hdmi)
190
173
vbi_pkt_ctrl &= ~HDMI_VBI_PKT_CTRL_GC_ENABLE ;
191
174
vbi_pkt_ctrl &= ~HDMI_VBI_PKT_CTRL_GC_EVERY_FRAME ;
192
175
aud_pkt_ctrl &= ~HDMI_AUDIO_PKT_CTRL1_AUDIO_SAMPLE_SEND ;
193
- infofrm_ctrl &= ~HDMI_INFOFRAME_CTRL0_AUDIO_INFO_SEND ;
194
- infofrm_ctrl &= ~HDMI_INFOFRAME_CTRL0_AUDIO_INFO_CONT ;
195
- infofrm_ctrl &= ~HDMI_INFOFRAME_CTRL0_AUDIO_INFO_SOURCE ;
196
- infofrm_ctrl &= ~HDMI_INFOFRAME_CTRL0_AUDIO_INFO_UPDATE ;
197
176
audio_config &= ~HDMI_AUDIO_CFG_ENGINE_ENABLE ;
198
177
}
199
178
200
179
hdmi_write (hdmi , REG_HDMI_ACR_PKT_CTRL , acr_pkt_ctrl );
201
180
hdmi_write (hdmi , REG_HDMI_VBI_PKT_CTRL , vbi_pkt_ctrl );
202
181
hdmi_write (hdmi , REG_HDMI_AUDIO_PKT_CTRL1 , aud_pkt_ctrl );
203
- hdmi_write (hdmi , REG_HDMI_INFOFRAME_CTRL0 , infofrm_ctrl );
204
182
205
183
hdmi_write (hdmi , REG_HDMI_AUD_INT ,
206
184
COND (enabled , HDMI_AUD_INT_AUD_FIFO_URUN_INT ) |
@@ -214,41 +192,29 @@ int msm_hdmi_audio_update(struct hdmi *hdmi)
214
192
return 0 ;
215
193
}
216
194
217
- int msm_hdmi_audio_info_setup (struct hdmi * hdmi , bool enabled ,
218
- uint32_t num_of_channels , uint32_t channel_allocation ,
219
- uint32_t level_shift , bool down_mix )
195
+ int msm_hdmi_audio_info_setup (struct hdmi * hdmi , int rate , int channels )
220
196
{
221
- struct hdmi_audio * audio ;
222
-
223
197
if (!hdmi )
224
198
return - ENXIO ;
225
199
226
- audio = & hdmi -> audio ;
227
-
228
- if (num_of_channels >= ARRAY_SIZE (nchannels ))
200
+ if ((rate < 0 ) || (rate >= MSM_HDMI_SAMPLE_RATE_MAX ))
229
201
return - EINVAL ;
230
202
231
- audio -> enabled = enabled ;
232
- audio -> infoframe .channels = nchannels [num_of_channels ];
233
- audio -> infoframe .channel_allocation = channel_allocation ;
234
- audio -> infoframe .level_shift_value = level_shift ;
235
- audio -> infoframe .downmix_inhibit = down_mix ;
203
+ hdmi -> audio .rate = rate ;
204
+ hdmi -> audio .channels = channels ;
205
+ hdmi -> audio .enabled = true;
236
206
237
207
return msm_hdmi_audio_update (hdmi );
238
208
}
239
209
240
- void msm_hdmi_audio_set_sample_rate (struct hdmi * hdmi , int rate )
210
+ int msm_hdmi_audio_disable (struct hdmi * hdmi )
241
211
{
242
- struct hdmi_audio * audio ;
243
-
244
212
if (!hdmi )
245
- return ;
246
-
247
- audio = & hdmi -> audio ;
213
+ return - ENXIO ;
248
214
249
- if ((rate < 0 ) || (rate >= MSM_HDMI_SAMPLE_RATE_MAX ))
250
- return ;
215
+ hdmi -> audio .rate = 0 ;
216
+ hdmi -> audio .channels = 2 ;
217
+ hdmi -> audio .enabled = false;
251
218
252
- audio -> rate = rate ;
253
- msm_hdmi_audio_update (hdmi );
219
+ return msm_hdmi_audio_update (hdmi );
254
220
}
0 commit comments