~ [ 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.9.16)


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

~ [ 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