~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/sound/i2c/tea6330t.c

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

Diff markup

Differences between /sound/i2c/tea6330t.c (Version linux-6.12-rc7) and /sound/i2c/tea6330t.c (Version linux-5.10.228)


** Warning: Cannot open xref database.

  1 // SPDX-License-Identifier: GPL-2.0-or-later        1 
  2 /*                                                
  3  *  Routines for control of the TEA6330T circu    
  4  *  Sound fader control circuit for car radios    
  5  *  Copyright (c) by Jaroslav Kysela <perex@pe    
  6  */                                               
  7                                                   
  8 #include <linux/init.h>                           
  9 #include <linux/slab.h>                           
 10 #include <linux/module.h>                         
 11 #include <sound/core.h>                           
 12 #include <sound/control.h>                        
 13 #include <sound/tea6330t.h>                       
 14                                                   
 15 MODULE_AUTHOR("Jaroslav Kysela <perex@perex.cz    
 16 MODULE_DESCRIPTION("Routines for control of th    
 17 MODULE_LICENSE("GPL");                            
 18                                                   
 19 #define TEA6330T_ADDR                   (0x80>    
 20                                                   
 21 #define TEA6330T_SADDR_VOLUME_LEFT      0x00      
 22 #define TEA6330T_SADDR_VOLUME_RIGHT     0x01      
 23 #define TEA6330T_SADDR_BASS             0x02      
 24 #define TEA6330T_SADDR_TREBLE           0x03      
 25 #define TEA6330T_SADDR_FADER            0x04      
 26 #define   TEA6330T_MFN                  0x20      
 27 #define   TEA6330T_FCH                  0x10      
 28 #define TEA6330T_SADDR_AUDIO_SWITCH     0x05      
 29 #define   TEA6330T_GMU                  0x80      
 30 #define   TEA6330T_EQN                  0x40      
 31                                                   
 32                                                   
 33 struct tea6330t {                                 
 34         struct snd_i2c_device *device;            
 35         struct snd_i2c_bus *bus;                  
 36         int equalizer;                            
 37         int fader;                                
 38         unsigned char regs[8];                    
 39         unsigned char mleft, mright;              
 40         unsigned char bass, treble;               
 41         unsigned char max_bass, max_treble;       
 42 };                                                
 43                                                   
 44                                                   
 45 int snd_tea6330t_detect(struct snd_i2c_bus *bu    
 46 {                                                 
 47         int res;                                  
 48                                                   
 49         snd_i2c_lock(bus);                        
 50         res = snd_i2c_probeaddr(bus, TEA6330T_    
 51         snd_i2c_unlock(bus);                      
 52         return res;                               
 53 }                                                 
 54                                                   
 55 #if 0                                             
 56 static void snd_tea6330t_set(struct tea6330t *    
 57                              unsigned char add    
 58 {                                                 
 59         snd_i2c_write(tea->bus, TEA6330T_ADDR,    
 60 }                                                 
 61 #endif                                            
 62                                                   
 63 #define TEA6330T_MASTER_VOLUME(xname, xindex)     
 64 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name =    
 65   .info = snd_tea6330t_info_master_volume, \      
 66   .get = snd_tea6330t_get_master_volume, .put     
 67                                                   
 68 static int snd_tea6330t_info_master_volume(str    
 69                                            str    
 70 {                                                 
 71         uinfo->type = SNDRV_CTL_ELEM_TYPE_INTE    
 72         uinfo->count = 2;                         
 73         uinfo->value.integer.min = 0;             
 74         uinfo->value.integer.max = 43;            
 75         return 0;                                 
 76 }                                                 
 77                                                   
 78 static int snd_tea6330t_get_master_volume(stru    
 79                                           stru    
 80 {                                                 
 81         struct tea6330t *tea = snd_kcontrol_ch    
 82                                                   
 83         snd_i2c_lock(tea->bus);                   
 84         ucontrol->value.integer.value[0] = tea    
 85         ucontrol->value.integer.value[1] = tea    
 86         snd_i2c_unlock(tea->bus);                 
 87         return 0;                                 
 88 }                                                 
 89                                                   
 90 static int snd_tea6330t_put_master_volume(stru    
 91                                           stru    
 92 {                                                 
 93         struct tea6330t *tea = snd_kcontrol_ch    
 94         int change, count, err;                   
 95         unsigned char bytes[3];                   
 96         unsigned char val1, val2;                 
 97                                                   
 98         val1 = (ucontrol->value.integer.value[    
 99         val2 = (ucontrol->value.integer.value[    
100         snd_i2c_lock(tea->bus);                   
101         change = val1 != tea->mleft || val2 !=    
102         tea->mleft = val1;                        
103         tea->mright = val2;                       
104         count = 0;                                
105         if (tea->regs[TEA6330T_SADDR_VOLUME_LE    
106                 bytes[count++] = TEA6330T_SADD    
107                 bytes[count++] = tea->regs[TEA    
108         }                                         
109         if (tea->regs[TEA6330T_SADDR_VOLUME_RI    
110                 if (count == 0)                   
111                         bytes[count++] = TEA63    
112                 bytes[count++] = tea->regs[TEA    
113         }                                         
114         if (count > 0) {                          
115                 err = snd_i2c_sendbytes(tea->d    
116                 if (err < 0)                      
117                         change = err;             
118         }                                         
119         snd_i2c_unlock(tea->bus);                 
120         return change;                            
121 }                                                 
122                                                   
123 #define TEA6330T_MASTER_SWITCH(xname, xindex)     
124 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name =    
125   .info = snd_tea6330t_info_master_switch, \      
126   .get = snd_tea6330t_get_master_switch, .put     
127                                                   
128 #define snd_tea6330t_info_master_switch           
129                                                   
130 static int snd_tea6330t_get_master_switch(stru    
131                                           stru    
132 {                                                 
133         struct tea6330t *tea = snd_kcontrol_ch    
134                                                   
135         snd_i2c_lock(tea->bus);                   
136         ucontrol->value.integer.value[0] = tea    
137         ucontrol->value.integer.value[1] = tea    
138         snd_i2c_unlock(tea->bus);                 
139         return 0;                                 
140 }                                                 
141                                                   
142 static int snd_tea6330t_put_master_switch(stru    
143                                           stru    
144 {                                                 
145         struct tea6330t *tea = snd_kcontrol_ch    
146         int change, err;                          
147         unsigned char bytes[3];                   
148         unsigned char oval1, oval2, val1, val2    
149                                                   
150         val1 = ucontrol->value.integer.value[0    
151         val2 = ucontrol->value.integer.value[1    
152         snd_i2c_lock(tea->bus);                   
153         oval1 = tea->regs[TEA6330T_SADDR_VOLUM    
154         oval2 = tea->regs[TEA6330T_SADDR_VOLUM    
155         change = val1 != oval1 || val2 != oval    
156         tea->regs[TEA6330T_SADDR_VOLUME_LEFT]     
157         tea->regs[TEA6330T_SADDR_VOLUME_RIGHT]    
158         bytes[0] = TEA6330T_SADDR_VOLUME_LEFT;    
159         bytes[1] = tea->regs[TEA6330T_SADDR_VO    
160         bytes[2] = tea->regs[TEA6330T_SADDR_VO    
161         err = snd_i2c_sendbytes(tea->device, b    
162         if (err < 0)                              
163                 change = err;                     
164         snd_i2c_unlock(tea->bus);                 
165         return change;                            
166 }                                                 
167                                                   
168 #define TEA6330T_BASS(xname, xindex) \            
169 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name =    
170   .info = snd_tea6330t_info_bass, \               
171   .get = snd_tea6330t_get_bass, .put = snd_tea    
172                                                   
173 static int snd_tea6330t_info_bass(struct snd_k    
174                                   struct snd_c    
175 {                                                 
176         struct tea6330t *tea = snd_kcontrol_ch    
177                                                   
178         uinfo->type = SNDRV_CTL_ELEM_TYPE_INTE    
179         uinfo->count = 1;                         
180         uinfo->value.integer.min = 0;             
181         uinfo->value.integer.max = tea->max_ba    
182         return 0;                                 
183 }                                                 
184                                                   
185 static int snd_tea6330t_get_bass(struct snd_kc    
186                                  struct snd_ct    
187 {                                                 
188         struct tea6330t *tea = snd_kcontrol_ch    
189                                                   
190         ucontrol->value.integer.value[0] = tea    
191         return 0;                                 
192 }                                                 
193                                                   
194 static int snd_tea6330t_put_bass(struct snd_kc    
195                                  struct snd_ct    
196 {                                                 
197         struct tea6330t *tea = snd_kcontrol_ch    
198         int change, err;                          
199         unsigned char bytes[2];                   
200         unsigned char val1;                       
201                                                   
202         val1 = ucontrol->value.integer.value[0    
203         snd_i2c_lock(tea->bus);                   
204         tea->bass = val1;                         
205         val1 += tea->equalizer ? 7 : 3;           
206         change = tea->regs[TEA6330T_SADDR_BASS    
207         bytes[0] = TEA6330T_SADDR_BASS;           
208         bytes[1] = tea->regs[TEA6330T_SADDR_BA    
209         err = snd_i2c_sendbytes(tea->device, b    
210         if (err < 0)                              
211                 change = err;                     
212         snd_i2c_unlock(tea->bus);                 
213         return change;                            
214 }                                                 
215                                                   
216 #define TEA6330T_TREBLE(xname, xindex) \          
217 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name =    
218   .info = snd_tea6330t_info_treble, \             
219   .get = snd_tea6330t_get_treble, .put = snd_t    
220                                                   
221 static int snd_tea6330t_info_treble(struct snd    
222                                     struct snd    
223 {                                                 
224         struct tea6330t *tea = snd_kcontrol_ch    
225                                                   
226         uinfo->type = SNDRV_CTL_ELEM_TYPE_INTE    
227         uinfo->count = 1;                         
228         uinfo->value.integer.min = 0;             
229         uinfo->value.integer.max = tea->max_tr    
230         return 0;                                 
231 }                                                 
232                                                   
233 static int snd_tea6330t_get_treble(struct snd_    
234                                    struct snd_    
235 {                                                 
236         struct tea6330t *tea = snd_kcontrol_ch    
237                                                   
238         ucontrol->value.integer.value[0] = tea    
239         return 0;                                 
240 }                                                 
241                                                   
242 static int snd_tea6330t_put_treble(struct snd_    
243                                    struct snd_    
244 {                                                 
245         struct tea6330t *tea = snd_kcontrol_ch    
246         int change, err;                          
247         unsigned char bytes[2];                   
248         unsigned char val1;                       
249                                                   
250         val1 = ucontrol->value.integer.value[0    
251         snd_i2c_lock(tea->bus);                   
252         tea->treble = val1;                       
253         val1 += 3;                                
254         change = tea->regs[TEA6330T_SADDR_TREB    
255         bytes[0] = TEA6330T_SADDR_TREBLE;         
256         bytes[1] = tea->regs[TEA6330T_SADDR_TR    
257         err = snd_i2c_sendbytes(tea->device, b    
258         if (err < 0)                              
259                 change = err;                     
260         snd_i2c_unlock(tea->bus);                 
261         return change;                            
262 }                                                 
263                                                   
264 static const struct snd_kcontrol_new snd_tea63    
265 TEA6330T_MASTER_SWITCH("Master Playback Switch    
266 TEA6330T_MASTER_VOLUME("Master Playback Volume    
267 TEA6330T_BASS("Tone Control - Bass", 0),          
268 TEA6330T_TREBLE("Tone Control - Treble", 0)       
269 };                                                
270                                                   
271 static void snd_tea6330_free(struct snd_i2c_de    
272 {                                                 
273         kfree(device->private_data);              
274 }                                                 
275                                                   
276 int snd_tea6330t_update_mixer(struct snd_card     
277                               struct snd_i2c_b    
278                               int equalizer, i    
279 {                                                 
280         struct snd_i2c_device *device;            
281         struct tea6330t *tea;                     
282         const struct snd_kcontrol_new *knew;      
283         unsigned int idx;                         
284         int err;                                  
285         u8 default_treble, default_bass;          
286         unsigned char bytes[7];                   
287                                                   
288         tea = kzalloc(sizeof(*tea), GFP_KERNEL    
289         if (tea == NULL)                          
290                 return -ENOMEM;                   
291         err = snd_i2c_device_create(bus, "TEA6    
292         if (err < 0) {                            
293                 kfree(tea);                       
294                 return err;                       
295         }                                         
296         tea->device = device;                     
297         tea->bus = bus;                           
298         tea->equalizer = equalizer;               
299         tea->fader = fader;                       
300         device->private_data = tea;               
301         device->private_free = snd_tea6330_fre    
302                                                   
303         snd_i2c_lock(bus);                        
304                                                   
305         /* turn fader off and handle equalizer    
306         tea->regs[TEA6330T_SADDR_FADER] = 0x3f    
307         tea->regs[TEA6330T_SADDR_AUDIO_SWITCH]    
308         /* initialize mixer */                    
309         if (!tea->equalizer) {                    
310                 tea->max_bass = 9;                
311                 tea->max_treble = 8;              
312                 default_bass = 3 + 4;             
313                 tea->bass = 4;                    
314                 default_treble = 3 + 4;           
315                 tea->treble = 4;                  
316         } else {                                  
317                 tea->max_bass = 5;                
318                 tea->max_treble = 0;              
319                 default_bass = 7 + 4;             
320                 tea->bass = 4;                    
321                 default_treble = 3;               
322                 tea->treble = 0;                  
323         }                                         
324         tea->mleft = tea->mright = 0x14;          
325         tea->regs[TEA6330T_SADDR_BASS] = defau    
326         tea->regs[TEA6330T_SADDR_TREBLE] = def    
327                                                   
328         /* compose I2C message and put the har    
329         bytes[0] = TEA6330T_SADDR_VOLUME_LEFT;    
330         for (idx = 0; idx < 6; idx++)             
331                 bytes[idx+1] = tea->regs[idx];    
332         err = snd_i2c_sendbytes(device, bytes,    
333         if (err < 0)                              
334                 goto __error;                     
335                                                   
336         strcat(card->mixername, ",TEA6330T");     
337         err = snd_component_add(card, "TEA6330    
338         if (err < 0)                              
339                 goto __error;                     
340                                                   
341         for (idx = 0; idx < ARRAY_SIZE(snd_tea    
342                 knew = &snd_tea6330t_controls[    
343                 if (tea->treble == 0 && !strcm    
344                         continue;                 
345                 err = snd_ctl_add(card, snd_ct    
346                 if (err < 0)                      
347                         goto __error;             
348         }                                         
349                                                   
350         snd_i2c_unlock(bus);                      
351         return 0;                                 
352                                                   
353       __error:                                    
354         snd_i2c_unlock(bus);                      
355         snd_i2c_device_free(device);              
356         return err;                               
357 }                                                 
358                                                   
359 EXPORT_SYMBOL(snd_tea6330t_detect);               
360 EXPORT_SYMBOL(snd_tea6330t_update_mixer);         
361                                                   

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php