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

TOMOYO Linux Cross Reference
Linux/sound/pci/asihpi/asihpi.c

Version: ~ [ linux-4.18 ] ~ [ linux-4.17.14 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.62 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.119 ] ~ [ linux-4.8.17 ] ~ [ linux-4.7.10 ] ~ [ linux-4.6.7 ] ~ [ linux-4.5.7 ] ~ [ linux-4.4.147 ] ~ [ linux-4.3.6 ] ~ [ linux-4.2.8 ] ~ [ linux-4.1.52 ] ~ [ linux-4.0.9 ] ~ [ linux-3.19.8 ] ~ [ linux-3.18.118 ] ~ [ linux-3.17.8 ] ~ [ linux-3.16.57 ] ~ [ linux-3.15.10 ] ~ [ linux-3.14.79 ] ~ [ linux-3.13.11 ] ~ [ linux-3.12.74 ] ~ [ linux-3.11.10 ] ~ [ linux-3.10.108 ] ~ [ linux-3.9.11 ] ~ [ linux-3.8.13 ] ~ [ linux-3.7.10 ] ~ [ linux-3.6.11 ] ~ [ linux-3.5.7 ] ~ [ linux-3.4.113 ] ~ [ linux-3.3.8 ] ~ [ linux-3.2.102 ] ~ [ linux-3.1.10 ] ~ [ linux-3.0.101 ] ~ [ linux-2.6.39.4 ] ~ [ linux-2.6.38.8 ] ~ [ linux-2.6.37.6 ] ~ [ linux-2.6.36.4 ] ~ [ linux-2.6.35.14 ] ~ [ linux-2.6.34.15 ] ~ [ linux-2.6.33.20 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.27.62 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.5 ] ~ [ policy-sample ] ~ [ linux-next-20180810 ] ~ [ linux-next-20180813 ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 /*
  2  *  Asihpi soundcard
  3  *  Copyright (c) by AudioScience Inc <support@audioscience.com>
  4  *
  5  *   This program is free software; you can redistribute it and/or modify
  6  *   it under the terms of version 2 of the GNU General Public License as
  7  *   published by the Free Software Foundation;
  8  *
  9  *   This program is distributed in the hope that it will be useful,
 10  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
 11  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 12  *   GNU General Public License for more details.
 13  *
 14  *   You should have received a copy of the GNU General Public License
 15  *   along with this program; if not, write to the Free Software
 16  *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 17  *
 18  *
 19  *  The following is not a condition of use, merely a request:
 20  *  If you modify this program, particularly if you fix errors, AudioScience Inc
 21  *  would appreciate it if you grant us the right to use those modifications
 22  *  for any purpose including commercial applications.
 23  */
 24 
 25 #include "hpi_internal.h"
 26 #include "hpi_version.h"
 27 #include "hpimsginit.h"
 28 #include "hpioctl.h"
 29 #include "hpicmn.h"
 30 
 31 #include <linux/pci.h>
 32 #include <linux/init.h>
 33 #include <linux/jiffies.h>
 34 #include <linux/slab.h>
 35 #include <linux/time.h>
 36 #include <linux/wait.h>
 37 #include <linux/module.h>
 38 #include <sound/core.h>
 39 #include <sound/control.h>
 40 #include <sound/pcm.h>
 41 #include <sound/pcm_params.h>
 42 #include <sound/info.h>
 43 #include <sound/initval.h>
 44 #include <sound/tlv.h>
 45 #include <sound/hwdep.h>
 46 
 47 MODULE_LICENSE("GPL");
 48 MODULE_AUTHOR("AudioScience inc. <support@audioscience.com>");
 49 MODULE_DESCRIPTION("AudioScience ALSA ASI5xxx ASI6xxx ASI87xx ASI89xx "
 50                         HPI_VER_STRING);
 51 
 52 #if defined CONFIG_SND_DEBUG_VERBOSE
 53 /**
 54  * snd_printddd - very verbose debug printk
 55  * @format: format string
 56  *
 57  * Works like snd_printk() for debugging purposes.
 58  * Ignored when CONFIG_SND_DEBUG_VERBOSE is not set.
 59  * Must set snd module debug parameter to 3 to enable at runtime.
 60  */
 61 #define snd_printddd(format, args...) \
 62         __snd_printk(3, __FILE__, __LINE__, format, ##args)
 63 #else
 64 #define snd_printddd(format, args...) do { } while (0)
 65 #endif
 66 
 67 static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;      /* index 0-MAX */
 68 static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;       /* ID for this card */
 69 static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;
 70 static bool enable_hpi_hwdep = 1;
 71 
 72 module_param_array(index, int, NULL, 0444);
 73 MODULE_PARM_DESC(index, "ALSA index value for AudioScience soundcard.");
 74 
 75 module_param_array(id, charp, NULL, 0444);
 76 MODULE_PARM_DESC(id, "ALSA ID string for AudioScience soundcard.");
 77 
 78 module_param_array(enable, bool, NULL, 0444);
 79 MODULE_PARM_DESC(enable, "ALSA enable AudioScience soundcard.");
 80 
 81 module_param(enable_hpi_hwdep, bool, 0644);
 82 MODULE_PARM_DESC(enable_hpi_hwdep,
 83                 "ALSA enable HPI hwdep for AudioScience soundcard ");
 84 
 85 /* identify driver */
 86 #ifdef KERNEL_ALSA_BUILD
 87 static char *build_info = "Built using headers from kernel source";
 88 module_param(build_info, charp, 0444);
 89 MODULE_PARM_DESC(build_info, "Built using headers from kernel source");
 90 #else
 91 static char *build_info = "Built within ALSA source";
 92 module_param(build_info, charp, 0444);
 93 MODULE_PARM_DESC(build_info, "Built within ALSA source");
 94 #endif
 95 
 96 /* set to 1 to dump every control from adapter to log */
 97 static const int mixer_dump;
 98 
 99 #define DEFAULT_SAMPLERATE 44100
100 static int adapter_fs = DEFAULT_SAMPLERATE;
101 
102 /* defaults */
103 #define PERIODS_MIN 2
104 #define PERIOD_BYTES_MIN  2048
105 #define BUFFER_BYTES_MAX (512 * 1024)
106 
107 #define MAX_CLOCKSOURCES (HPI_SAMPLECLOCK_SOURCE_LAST + 1 + 7)
108 
109 struct clk_source {
110         int source;
111         int index;
112         const char *name;
113 };
114 
115 struct clk_cache {
116         int count;
117         int has_local;
118         struct clk_source s[MAX_CLOCKSOURCES];
119 };
120 
121 /* Per card data */
122 struct snd_card_asihpi {
123         struct snd_card *card;
124         struct pci_dev *pci;
125         struct hpi_adapter *hpi;
126 
127         /* In low latency mode there is only one stream, a pointer to its
128          * private data is stored here on trigger and cleared on stop.
129          * The interrupt handler uses it as a parameter when calling
130          * snd_card_asihpi_timer_function().
131          */
132         struct snd_card_asihpi_pcm *llmode_streampriv;
133         struct tasklet_struct t;
134         void (*pcm_start)(struct snd_pcm_substream *substream);
135         void (*pcm_stop)(struct snd_pcm_substream *substream);
136 
137         u32 h_mixer;
138         struct clk_cache cc;
139 
140         u16 can_dma;
141         u16 support_grouping;
142         u16 support_mrx;
143         u16 update_interval_frames;
144         u16 in_max_chans;
145         u16 out_max_chans;
146         u16 in_min_chans;
147         u16 out_min_chans;
148 };
149 
150 /* Per stream data */
151 struct snd_card_asihpi_pcm {
152         struct timer_list timer;
153         unsigned int respawn_timer;
154         unsigned int hpi_buffer_attached;
155         unsigned int buffer_bytes;
156         unsigned int period_bytes;
157         unsigned int bytes_per_sec;
158         unsigned int pcm_buf_host_rw_ofs; /* Host R/W pos */
159         unsigned int pcm_buf_dma_ofs;   /* DMA R/W offset in buffer */
160         unsigned int pcm_buf_elapsed_dma_ofs;   /* DMA R/W offset in buffer */
161         unsigned int drained_count;
162         struct snd_pcm_substream *substream;
163         u32 h_stream;
164         struct hpi_format format;
165 };
166 
167 /* universal stream verbs work with out or in stream handles */
168 
169 /* Functions to allow driver to give a buffer to HPI for busmastering */
170 
171 static u16 hpi_stream_host_buffer_attach(
172         u32 h_stream,   /* handle to outstream. */
173         u32 size_in_bytes, /* size in bytes of bus mastering buffer */
174         u32 pci_address
175 )
176 {
177         struct hpi_message hm;
178         struct hpi_response hr;
179         unsigned int obj = hpi_handle_object(h_stream);
180 
181         if (!h_stream)
182                 return HPI_ERROR_INVALID_OBJ;
183         hpi_init_message_response(&hm, &hr, obj,
184                         obj == HPI_OBJ_OSTREAM ?
185                                 HPI_OSTREAM_HOSTBUFFER_ALLOC :
186                                 HPI_ISTREAM_HOSTBUFFER_ALLOC);
187 
188         hpi_handle_to_indexes(h_stream, &hm.adapter_index,
189                                 &hm.obj_index);
190 
191         hm.u.d.u.buffer.buffer_size = size_in_bytes;
192         hm.u.d.u.buffer.pci_address = pci_address;
193         hm.u.d.u.buffer.command = HPI_BUFFER_CMD_INTERNAL_GRANTADAPTER;
194         hpi_send_recv(&hm, &hr);
195         return hr.error;
196 }
197 
198 static u16 hpi_stream_host_buffer_detach(u32  h_stream)
199 {
200         struct hpi_message hm;
201         struct hpi_response hr;
202         unsigned int obj = hpi_handle_object(h_stream);
203 
204         if (!h_stream)
205                 return HPI_ERROR_INVALID_OBJ;
206 
207         hpi_init_message_response(&hm, &hr,  obj,
208                         obj == HPI_OBJ_OSTREAM ?
209                                 HPI_OSTREAM_HOSTBUFFER_FREE :
210                                 HPI_ISTREAM_HOSTBUFFER_FREE);
211 
212         hpi_handle_to_indexes(h_stream, &hm.adapter_index,
213                                 &hm.obj_index);
214         hm.u.d.u.buffer.command = HPI_BUFFER_CMD_INTERNAL_REVOKEADAPTER;
215         hpi_send_recv(&hm, &hr);
216         return hr.error;
217 }
218 
219 static inline u16 hpi_stream_start(u32 h_stream)
220 {
221         if (hpi_handle_object(h_stream) ==  HPI_OBJ_OSTREAM)
222                 return hpi_outstream_start(h_stream);
223         else
224                 return hpi_instream_start(h_stream);
225 }
226 
227 static inline u16 hpi_stream_stop(u32 h_stream)
228 {
229         if (hpi_handle_object(h_stream) ==  HPI_OBJ_OSTREAM)
230                 return hpi_outstream_stop(h_stream);
231         else
232                 return hpi_instream_stop(h_stream);
233 }
234 
235 static inline u16 hpi_stream_get_info_ex(
236     u32 h_stream,
237     u16        *pw_state,
238     u32        *pbuffer_size,
239     u32        *pdata_in_buffer,
240     u32        *psample_count,
241     u32        *pauxiliary_data
242 )
243 {
244         u16 e;
245         if (hpi_handle_object(h_stream)  ==  HPI_OBJ_OSTREAM)
246                 e = hpi_outstream_get_info_ex(h_stream, pw_state,
247                                         pbuffer_size, pdata_in_buffer,
248                                         psample_count, pauxiliary_data);
249         else
250                 e = hpi_instream_get_info_ex(h_stream, pw_state,
251                                         pbuffer_size, pdata_in_buffer,
252                                         psample_count, pauxiliary_data);
253         return e;
254 }
255 
256 static inline u16 hpi_stream_group_add(
257                                         u32 h_master,
258                                         u32 h_stream)
259 {
260         if (hpi_handle_object(h_master) ==  HPI_OBJ_OSTREAM)
261                 return hpi_outstream_group_add(h_master, h_stream);
262         else
263                 return hpi_instream_group_add(h_master, h_stream);
264 }
265 
266 static inline u16 hpi_stream_group_reset(u32 h_stream)
267 {
268         if (hpi_handle_object(h_stream) ==  HPI_OBJ_OSTREAM)
269                 return hpi_outstream_group_reset(h_stream);
270         else
271                 return hpi_instream_group_reset(h_stream);
272 }
273 
274 static inline u16 hpi_stream_group_get_map(
275                                 u32 h_stream, u32 *mo, u32 *mi)
276 {
277         if (hpi_handle_object(h_stream) ==  HPI_OBJ_OSTREAM)
278                 return hpi_outstream_group_get_map(h_stream, mo, mi);
279         else
280                 return hpi_instream_group_get_map(h_stream, mo, mi);
281 }
282 
283 static u16 handle_error(u16 err, int line, char *filename)
284 {
285         if (err)
286                 printk(KERN_WARNING
287                         "in file %s, line %d: HPI error %d\n",
288                         filename, line, err);
289         return err;
290 }
291 
292 #define hpi_handle_error(x)  handle_error(x, __LINE__, __FILE__)
293 
294 /***************************** GENERAL PCM ****************/
295 
296 static void print_hwparams(struct snd_pcm_substream *substream,
297                                 struct snd_pcm_hw_params *p)
298 {
299         char name[16];
300         snd_pcm_debug_name(substream, name, sizeof(name));
301         snd_printdd("%s HWPARAMS\n", name);
302         snd_printdd(" samplerate=%dHz channels=%d format=%d subformat=%d\n",
303                 params_rate(p), params_channels(p),
304                 params_format(p), params_subformat(p));
305         snd_printdd(" buffer=%dB period=%dB period_size=%dB periods=%d\n",
306                 params_buffer_bytes(p), params_period_bytes(p),
307                 params_period_size(p), params_periods(p));
308         snd_printdd(" buffer_size=%d access=%d data_rate=%dB/s\n",
309                 params_buffer_size(p), params_access(p),
310                 params_rate(p) * params_channels(p) *
311                 snd_pcm_format_width(params_format(p)) / 8);
312 }
313 
314 static snd_pcm_format_t hpi_to_alsa_formats[] = {
315         -1,                     /* INVALID */
316         SNDRV_PCM_FORMAT_U8,    /* HPI_FORMAT_PCM8_UNSIGNED        1 */
317         SNDRV_PCM_FORMAT_S16,   /* HPI_FORMAT_PCM16_SIGNED         2 */
318         -1,                     /* HPI_FORMAT_MPEG_L1              3 */
319         SNDRV_PCM_FORMAT_MPEG,  /* HPI_FORMAT_MPEG_L2              4 */
320         SNDRV_PCM_FORMAT_MPEG,  /* HPI_FORMAT_MPEG_L3              5 */
321         -1,                     /* HPI_FORMAT_DOLBY_AC2            6 */
322         -1,                     /* HPI_FORMAT_DOLBY_AC3            7 */
323         SNDRV_PCM_FORMAT_S16_BE,/* HPI_FORMAT_PCM16_BIGENDIAN      8 */
324         -1,                     /* HPI_FORMAT_AA_TAGIT1_HITS       9 */
325         -1,                     /* HPI_FORMAT_AA_TAGIT1_INSERTS   10 */
326         SNDRV_PCM_FORMAT_S32,   /* HPI_FORMAT_PCM32_SIGNED        11 */
327         -1,                     /* HPI_FORMAT_RAW_BITSTREAM       12 */
328         -1,                     /* HPI_FORMAT_AA_TAGIT1_HITS_EX1  13 */
329         SNDRV_PCM_FORMAT_FLOAT, /* HPI_FORMAT_PCM32_FLOAT         14 */
330 #if 1
331         /* ALSA can't handle 3 byte sample size together with power-of-2
332          *  constraint on buffer_bytes, so disable this format
333          */
334         -1
335 #else
336         /* SNDRV_PCM_FORMAT_S24_3LE */ /* HPI_FORMAT_PCM24_SIGNED 15 */
337 #endif
338 };
339 
340 
341 static int snd_card_asihpi_format_alsa2hpi(snd_pcm_format_t alsa_format,
342                                            u16 *hpi_format)
343 {
344         u16 format;
345 
346         for (format = HPI_FORMAT_PCM8_UNSIGNED;
347              format <= HPI_FORMAT_PCM24_SIGNED; format++) {
348                 if (hpi_to_alsa_formats[format] == alsa_format) {
349                         *hpi_format = format;
350                         return 0;
351                 }
352         }
353 
354         snd_printd(KERN_WARNING "failed match for alsa format %d\n",
355                    alsa_format);
356         *hpi_format = 0;
357         return -EINVAL;
358 }
359 
360 static void snd_card_asihpi_pcm_samplerates(struct snd_card_asihpi *asihpi,
361                                          struct snd_pcm_hardware *pcmhw)
362 {
363         u16 err;
364         u32 h_control;
365         u32 sample_rate;
366         int idx;
367         unsigned int rate_min = 200000;
368         unsigned int rate_max = 0;
369         unsigned int rates = 0;
370 
371         if (asihpi->support_mrx) {
372                 rates |= SNDRV_PCM_RATE_CONTINUOUS;
373                 rates |= SNDRV_PCM_RATE_8000_96000;
374                 rate_min = 8000;
375                 rate_max = 100000;
376         } else {
377                 /* on cards without SRC,
378                    valid rates are determined by sampleclock */
379                 err = hpi_mixer_get_control(asihpi->h_mixer,
380                                           HPI_SOURCENODE_CLOCK_SOURCE, 0, 0, 0,
381                                           HPI_CONTROL_SAMPLECLOCK, &h_control);
382                 if (err) {
383                         dev_err(&asihpi->pci->dev,
384                                 "No local sampleclock, err %d\n", err);
385                 }
386 
387                 for (idx = -1; idx < 100; idx++) {
388                         if (idx == -1) {
389                                 if (hpi_sample_clock_get_sample_rate(h_control,
390                                                                 &sample_rate))
391                                         continue;
392                         } else if (hpi_sample_clock_query_local_rate(h_control,
393                                                         idx, &sample_rate)) {
394                                 break;
395                         }
396 
397                         rate_min = min(rate_min, sample_rate);
398                         rate_max = max(rate_max, sample_rate);
399 
400                         switch (sample_rate) {
401                         case 5512:
402                                 rates |= SNDRV_PCM_RATE_5512;
403                                 break;
404                         case 8000:
405                                 rates |= SNDRV_PCM_RATE_8000;
406                                 break;
407                         case 11025:
408                                 rates |= SNDRV_PCM_RATE_11025;
409                                 break;
410                         case 16000:
411                                 rates |= SNDRV_PCM_RATE_16000;
412                                 break;
413                         case 22050:
414                                 rates |= SNDRV_PCM_RATE_22050;
415                                 break;
416                         case 32000:
417                                 rates |= SNDRV_PCM_RATE_32000;
418                                 break;
419                         case 44100:
420                                 rates |= SNDRV_PCM_RATE_44100;
421                                 break;
422                         case 48000:
423                                 rates |= SNDRV_PCM_RATE_48000;
424                                 break;
425                         case 64000:
426                                 rates |= SNDRV_PCM_RATE_64000;
427                                 break;
428                         case 88200:
429                                 rates |= SNDRV_PCM_RATE_88200;
430                                 break;
431                         case 96000:
432                                 rates |= SNDRV_PCM_RATE_96000;
433                                 break;
434                         case 176400:
435                                 rates |= SNDRV_PCM_RATE_176400;
436                                 break;
437                         case 192000:
438                                 rates |= SNDRV_PCM_RATE_192000;
439                                 break;
440                         default: /* some other rate */
441                                 rates |= SNDRV_PCM_RATE_KNOT;
442                         }
443                 }
444         }
445 
446         pcmhw->rates = rates;
447         pcmhw->rate_min = rate_min;
448         pcmhw->rate_max = rate_max;
449 }
450 
451 static int snd_card_asihpi_pcm_hw_params(struct snd_pcm_substream *substream,
452                                          struct snd_pcm_hw_params *params)
453 {
454         struct snd_pcm_runtime *runtime = substream->runtime;
455         struct snd_card_asihpi_pcm *dpcm = runtime->private_data;
456         struct snd_card_asihpi *card = snd_pcm_substream_chip(substream);
457         int err;
458         u16 format;
459         int width;
460         unsigned int bytes_per_sec;
461 
462         print_hwparams(substream, params);
463         err = snd_pcm_lib_malloc_pages(substream, params_buffer_bytes(params));
464         if (err < 0)
465                 return err;
466         err = snd_card_asihpi_format_alsa2hpi(params_format(params), &format);
467         if (err)
468                 return err;
469 
470         hpi_handle_error(hpi_format_create(&dpcm->format,
471                         params_channels(params),
472                         format, params_rate(params), 0, 0));
473 
474         if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) {
475                 if (hpi_instream_reset(dpcm->h_stream) != 0)
476                         return -EINVAL;
477 
478                 if (hpi_instream_set_format(
479                         dpcm->h_stream, &dpcm->format) != 0)
480                         return -EINVAL;
481         }
482 
483         dpcm->hpi_buffer_attached = 0;
484         if (card->can_dma) {
485                 err = hpi_stream_host_buffer_attach(dpcm->h_stream,
486                         params_buffer_bytes(params),  runtime->dma_addr);
487                 if (err == 0) {
488                         snd_printdd(
489                                 "stream_host_buffer_attach success %u %lu\n",
490                                 params_buffer_bytes(params),
491                                 (unsigned long)runtime->dma_addr);
492                 } else {
493                         snd_printd("stream_host_buffer_attach error %d\n",
494                                         err);
495                         return -ENOMEM;
496                 }
497 
498                 err = hpi_stream_get_info_ex(dpcm->h_stream, NULL,
499                                 &dpcm->hpi_buffer_attached, NULL, NULL, NULL);
500         }
501         bytes_per_sec = params_rate(params) * params_channels(params);
502         width = snd_pcm_format_width(params_format(params));
503         bytes_per_sec *= width;
504         bytes_per_sec /= 8;
505         if (width < 0 || bytes_per_sec == 0)
506                 return -EINVAL;
507 
508         dpcm->bytes_per_sec = bytes_per_sec;
509         dpcm->buffer_bytes = params_buffer_bytes(params);
510         dpcm->period_bytes = params_period_bytes(params);
511 
512         return 0;
513 }
514 
515 static int
516 snd_card_asihpi_hw_free(struct snd_pcm_substream *substream)
517 {
518         struct snd_pcm_runtime *runtime = substream->runtime;
519         struct snd_card_asihpi_pcm *dpcm = runtime->private_data;
520         if (dpcm->hpi_buffer_attached)
521                 hpi_stream_host_buffer_detach(dpcm->h_stream);
522 
523         snd_pcm_lib_free_pages(substream);
524         return 0;
525 }
526 
527 static void snd_card_asihpi_runtime_free(struct snd_pcm_runtime *runtime)
528 {
529         struct snd_card_asihpi_pcm *dpcm = runtime->private_data;
530         kfree(dpcm);
531 }
532 
533 static void snd_card_asihpi_pcm_timer_start(struct snd_pcm_substream *
534                                             substream)
535 {
536         struct snd_pcm_runtime *runtime = substream->runtime;
537         struct snd_card_asihpi_pcm *dpcm = runtime->private_data;
538         int expiry;
539 
540         expiry = HZ / 200;
541 
542         expiry = max(expiry, 1); /* don't let it be zero! */
543         mod_timer(&dpcm->timer, jiffies + expiry);
544         dpcm->respawn_timer = 1;
545 }
546 
547 static void snd_card_asihpi_pcm_timer_stop(struct snd_pcm_substream *substream)
548 {
549         struct snd_pcm_runtime *runtime = substream->runtime;
550         struct snd_card_asihpi_pcm *dpcm = runtime->private_data;
551 
552         dpcm->respawn_timer = 0;
553         del_timer(&dpcm->timer);
554 }
555 
556 static void snd_card_asihpi_pcm_int_start(struct snd_pcm_substream *substream)
557 {
558         struct snd_card_asihpi_pcm *dpcm;
559         struct snd_card_asihpi *card;
560 
561         dpcm = (struct snd_card_asihpi_pcm *)substream->runtime->private_data;
562         card = snd_pcm_substream_chip(substream);
563 
564         WARN_ON(in_interrupt());
565         tasklet_disable(&card->t);
566         card->llmode_streampriv = dpcm;
567         tasklet_enable(&card->t);
568 
569         hpi_handle_error(hpi_adapter_set_property(card->hpi->adapter->index,
570                 HPI_ADAPTER_PROPERTY_IRQ_RATE,
571                 card->update_interval_frames, 0));
572 }
573 
574 static void snd_card_asihpi_pcm_int_stop(struct snd_pcm_substream *substream)
575 {
576         struct snd_card_asihpi *card;
577 
578         card = snd_pcm_substream_chip(substream);
579 
580         hpi_handle_error(hpi_adapter_set_property(card->hpi->adapter->index,
581                 HPI_ADAPTER_PROPERTY_IRQ_RATE, 0, 0));
582 
583         if (in_interrupt())
584                 card->llmode_streampriv = NULL;
585         else {
586                 tasklet_disable(&card->t);
587                 card->llmode_streampriv = NULL;
588                 tasklet_enable(&card->t);
589         }
590 }
591 
592 static int snd_card_asihpi_trigger(struct snd_pcm_substream *substream,
593                                            int cmd)
594 {
595         struct snd_card_asihpi_pcm *dpcm = substream->runtime->private_data;
596         struct snd_card_asihpi *card = snd_pcm_substream_chip(substream);
597         struct snd_pcm_substream *s;
598         u16 e;
599         char name[16];
600 
601         snd_pcm_debug_name(substream, name, sizeof(name));
602 
603         switch (cmd) {
604         case SNDRV_PCM_TRIGGER_START:
605                 snd_printdd("%s trigger start\n", name);
606                 snd_pcm_group_for_each_entry(s, substream) {
607                         struct snd_pcm_runtime *runtime = s->runtime;
608                         struct snd_card_asihpi_pcm *ds = runtime->private_data;
609 
610                         if (snd_pcm_substream_chip(s) != card)
611                                 continue;
612 
613                         /* don't link Cap and Play */
614                         if (substream->stream != s->stream)
615                                 continue;
616 
617                         ds->drained_count = 0;
618                         if (s->stream == SNDRV_PCM_STREAM_PLAYBACK) {
619                                 /* How do I know how much valid data is present
620                                 * in buffer? Must be at least one period!
621                                 * Guessing 2 periods, but if
622                                 * buffer is bigger it may contain even more
623                                 * data??
624                                 */
625                                 unsigned int preload = ds->period_bytes * 1;
626                                 snd_printddd("%d preload %d\n", s->number, preload);
627                                 hpi_handle_error(hpi_outstream_write_buf(
628                                                 ds->h_stream,
629                                                 &runtime->dma_area[0],
630                                                 preload,
631                                                 &ds->format));
632                                 ds->pcm_buf_host_rw_ofs = preload;
633                         }
634 
635                         if (card->support_grouping) {
636                                 snd_printdd("%d group\n", s->number);
637                                 e = hpi_stream_group_add(
638                                         dpcm->h_stream,
639                                         ds->h_stream);
640                                 if (!e) {
641                                         snd_pcm_trigger_done(s, substream);
642                                 } else {
643                                         hpi_handle_error(e);
644                                         break;
645                                 }
646                         } else
647                                 break;
648                 }
649                 /* start the master stream */
650                 card->pcm_start(substream);
651                 if ((substream->stream == SNDRV_PCM_STREAM_CAPTURE) ||
652                         !card->can_dma)
653                         hpi_handle_error(hpi_stream_start(dpcm->h_stream));
654                 break;
655 
656         case SNDRV_PCM_TRIGGER_STOP:
657                 snd_printdd("%s trigger stop\n", name);
658                 card->pcm_stop(substream);
659                 snd_pcm_group_for_each_entry(s, substream) {
660                         if (snd_pcm_substream_chip(s) != card)
661                                 continue;
662                         /* don't link Cap and Play */
663                         if (substream->stream != s->stream)
664                                 continue;
665 
666                         /*? workaround linked streams don't
667                         transition to SETUP 20070706*/
668                         s->runtime->status->state = SNDRV_PCM_STATE_SETUP;
669 
670                         if (card->support_grouping) {
671                                 snd_printdd("%d group\n", s->number);
672                                 snd_pcm_trigger_done(s, substream);
673                         } else
674                                 break;
675                 }
676 
677                 /* _prepare and _hwparams reset the stream */
678                 hpi_handle_error(hpi_stream_stop(dpcm->h_stream));
679                 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
680                         hpi_handle_error(
681                                 hpi_outstream_reset(dpcm->h_stream));
682 
683                 if (card->support_grouping)
684                         hpi_handle_error(hpi_stream_group_reset(dpcm->h_stream));
685                 break;
686 
687         case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
688                 snd_printdd("%s trigger pause release\n", name);
689                 card->pcm_start(substream);
690                 hpi_handle_error(hpi_stream_start(dpcm->h_stream));
691                 break;
692         case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
693                 snd_printdd("%s trigger pause push\n", name);
694                 card->pcm_stop(substream);
695                 hpi_handle_error(hpi_stream_stop(dpcm->h_stream));
696                 break;
697         default:
698                 snd_printd(KERN_ERR "\tINVALID\n");
699                 return -EINVAL;
700         }
701 
702         return 0;
703 }
704 
705 /*algorithm outline
706  Without linking degenerates to getting single stream pos etc
707  Without mmap 2nd loop degenerates to snd_pcm_period_elapsed
708 */
709 /*
710 pcm_buf_dma_ofs=get_buf_pos(s);
711 for_each_linked_stream(s) {
712         pcm_buf_dma_ofs=get_buf_pos(s);
713         min_buf_pos = modulo_min(min_buf_pos, pcm_buf_dma_ofs, buffer_bytes)
714         new_data = min(new_data, calc_new_data(pcm_buf_dma_ofs,irq_pos)
715 }
716 timer.expires = jiffies + predict_next_period_ready(min_buf_pos);
717 for_each_linked_stream(s) {
718         s->pcm_buf_dma_ofs = min_buf_pos;
719         if (new_data > period_bytes) {
720                 if (mmap) {
721                         irq_pos = (irq_pos + period_bytes) % buffer_bytes;
722                         if (playback) {
723                                 write(period_bytes);
724                         } else {
725                                 read(period_bytes);
726                         }
727                 }
728                 snd_pcm_period_elapsed(s);
729         }
730 }
731 */
732 
733 /** Minimum of 2 modulo values.  Works correctly when the difference between
734 * the values is less than half the modulus
735 */
736 static inline unsigned int modulo_min(unsigned int a, unsigned int b,
737                                         unsigned long int modulus)
738 {
739         unsigned int result;
740         if (((a-b) % modulus) < (modulus/2))
741                 result = b;
742         else
743                 result = a;
744 
745         return result;
746 }
747 
748 /** Timer function, equivalent to interrupt service routine for cards
749 */
750 static void snd_card_asihpi_timer_function(struct timer_list *t)
751 {
752         struct snd_card_asihpi_pcm *dpcm = from_timer(dpcm, t, timer);
753         struct snd_pcm_substream *substream = dpcm->substream;
754         struct snd_card_asihpi *card = snd_pcm_substream_chip(substream);
755         struct snd_pcm_runtime *runtime;
756         struct snd_pcm_substream *s;
757         unsigned int newdata = 0;
758         unsigned int pcm_buf_dma_ofs, min_buf_pos = 0;
759         unsigned int remdata, xfercount, next_jiffies;
760         int first = 1;
761         int loops = 0;
762         u16 state;
763         u32 buffer_size, bytes_avail, samples_played, on_card_bytes;
764         char name[16];
765 
766 
767         snd_pcm_debug_name(substream, name, sizeof(name));
768 
769         /* find minimum newdata and buffer pos in group */
770         snd_pcm_group_for_each_entry(s, substream) {
771                 struct snd_card_asihpi_pcm *ds = s->runtime->private_data;
772                 runtime = s->runtime;
773 
774                 if (snd_pcm_substream_chip(s) != card)
775                         continue;
776 
777                 /* don't link Cap and Play */
778                 if (substream->stream != s->stream)
779                         continue;
780 
781                 hpi_handle_error(hpi_stream_get_info_ex(
782                                         ds->h_stream, &state,
783                                         &buffer_size, &bytes_avail,
784                                         &samples_played, &on_card_bytes));
785 
786                 /* number of bytes in on-card buffer */
787                 runtime->delay = on_card_bytes;
788 
789                 if (!card->can_dma)
790                         on_card_bytes = bytes_avail;
791 
792                 if (s->stream == SNDRV_PCM_STREAM_PLAYBACK) {
793                         pcm_buf_dma_ofs = ds->pcm_buf_host_rw_ofs - bytes_avail;
794                         if (state == HPI_STATE_STOPPED) {
795                                 if (bytes_avail == 0) {
796                                         hpi_handle_error(hpi_stream_start(ds->h_stream));
797                                         snd_printdd("P%d start\n", s->number);
798                                         ds->drained_count = 0;
799                                 }
800                         } else if (state == HPI_STATE_DRAINED) {
801                                 snd_printd(KERN_WARNING "P%d drained\n",
802                                                 s->number);
803                                 ds->drained_count++;
804                                 if (ds->drained_count > 20) {
805                                         snd_pcm_stop_xrun(s);
806                                         continue;
807                                 }
808                         } else {
809                                 ds->drained_count = 0;
810                         }
811                 } else
812                         pcm_buf_dma_ofs = bytes_avail + ds->pcm_buf_host_rw_ofs;
813 
814                 if (first) {
815                         /* can't statically init min when wrap is involved */
816                         min_buf_pos = pcm_buf_dma_ofs;
817                         newdata = (pcm_buf_dma_ofs - ds->pcm_buf_elapsed_dma_ofs) % ds->buffer_bytes;
818                         first = 0;
819                 } else {
820                         min_buf_pos =
821                                 modulo_min(min_buf_pos, pcm_buf_dma_ofs, UINT_MAX+1L);
822                         newdata = min(
823                                 (pcm_buf_dma_ofs - ds->pcm_buf_elapsed_dma_ofs) % ds->buffer_bytes,
824                                 newdata);
825                 }
826 
827                 snd_printddd(
828                         "timer1, %s, %d, S=%d, elap=%d, rw=%d, dsp=%d, left=%d, aux=%d, space=%d, hw_ptr=%ld, appl_ptr=%ld\n",
829                         name, s->number, state,
830                         ds->pcm_buf_elapsed_dma_ofs,
831                         ds->pcm_buf_host_rw_ofs,
832                         pcm_buf_dma_ofs,
833                         (int)bytes_avail,
834 
835                         (int)on_card_bytes,
836                         buffer_size-bytes_avail,
837                         (unsigned long)frames_to_bytes(runtime,
838                                                 runtime->status->hw_ptr),
839                         (unsigned long)frames_to_bytes(runtime,
840                                                 runtime->control->appl_ptr)
841                 );
842                 loops++;
843         }
844         pcm_buf_dma_ofs = min_buf_pos;
845 
846         remdata = newdata % dpcm->period_bytes;
847         xfercount = newdata - remdata; /* a multiple of period_bytes */
848         /* come back when on_card_bytes has decreased enough to allow
849            write to happen, or when data has been consumed to make another
850            period
851         */
852         if (xfercount && (on_card_bytes  > dpcm->period_bytes))
853                 next_jiffies = ((on_card_bytes - dpcm->period_bytes) * HZ / dpcm->bytes_per_sec);
854         else
855                 next_jiffies = ((dpcm->period_bytes - remdata) * HZ / dpcm->bytes_per_sec);
856 
857         next_jiffies = max(next_jiffies, 1U);
858         dpcm->timer.expires = jiffies + next_jiffies;
859         snd_printddd("timer2, jif=%d, buf_pos=%d, newdata=%d, xfer=%d\n",
860                         next_jiffies, pcm_buf_dma_ofs, newdata, xfercount);
861 
862         snd_pcm_group_for_each_entry(s, substream) {
863                 struct snd_card_asihpi_pcm *ds = s->runtime->private_data;
864 
865                 /* don't link Cap and Play */
866                 if (substream->stream != s->stream)
867                         continue;
868 
869                 /* Store dma offset for use by pointer callback */
870                 ds->pcm_buf_dma_ofs = pcm_buf_dma_ofs;
871 
872                 if (xfercount &&
873                         /* Limit use of on card fifo for playback */
874                         ((on_card_bytes <= ds->period_bytes) ||
875                         (s->stream == SNDRV_PCM_STREAM_CAPTURE)))
876 
877                 {
878 
879                         unsigned int buf_ofs = ds->pcm_buf_host_rw_ofs % ds->buffer_bytes;
880                         unsigned int xfer1, xfer2;
881                         char *pd = &s->runtime->dma_area[buf_ofs];
882 
883                         if (card->can_dma) { /* buffer wrap is handled at lower level */
884                                 xfer1 = xfercount;
885                                 xfer2 = 0;
886                         } else {
887                                 xfer1 = min(xfercount, ds->buffer_bytes - buf_ofs);
888                                 xfer2 = xfercount - xfer1;
889                         }
890 
891                         if (s->stream == SNDRV_PCM_STREAM_PLAYBACK) {
892                                 snd_printddd("write1, P=%d, xfer=%d, buf_ofs=%d\n",
893                                         s->number, xfer1, buf_ofs);
894                                 hpi_handle_error(
895                                         hpi_outstream_write_buf(
896                                                 ds->h_stream, pd, xfer1,
897                                                 &ds->format));
898 
899                                 if (xfer2) {
900                                         pd = s->runtime->dma_area;
901 
902                                         snd_printddd("write2, P=%d, xfer=%d, buf_ofs=%d\n",
903                                                         s->number,
904                                                         xfercount - xfer1, buf_ofs);
905                                         hpi_handle_error(
906                                                 hpi_outstream_write_buf(
907                                                         ds->h_stream, pd,
908                                                         xfercount - xfer1,
909                                                         &ds->format));
910                                 }
911                         } else {
912                                 snd_printddd("read1, C=%d, xfer=%d\n",
913                                         s->number, xfer1);
914                                 hpi_handle_error(
915                                         hpi_instream_read_buf(
916                                                 ds->h_stream,
917                                                 pd, xfer1));
918                                 if (xfer2) {
919                                         pd = s->runtime->dma_area;
920                                         snd_printddd("read2, C=%d, xfer=%d\n",
921                                                 s->number, xfer2);
922                                         hpi_handle_error(
923                                                 hpi_instream_read_buf(
924                                                         ds->h_stream,
925                                                         pd, xfer2));
926                                 }
927                         }
928                         /* ? host_rw_ofs always ahead of elapsed_dma_ofs by preload size? */
929                         ds->pcm_buf_host_rw_ofs += xfercount;
930                         ds->pcm_buf_elapsed_dma_ofs += xfercount;
931                         snd_pcm_period_elapsed(s);
932                 }
933         }
934 
935         if (!card->hpi->interrupt_mode && dpcm->respawn_timer)
936                 add_timer(&dpcm->timer);
937 }
938 
939 static void snd_card_asihpi_int_task(unsigned long data)
940 {
941         struct hpi_adapter *a = (struct hpi_adapter *)data;
942         struct snd_card_asihpi *asihpi;
943 
944         WARN_ON(!a || !a->snd_card || !a->snd_card->private_data);
945         asihpi = (struct snd_card_asihpi *)a->snd_card->private_data;
946         if (asihpi->llmode_streampriv)
947                 snd_card_asihpi_timer_function(
948                         &asihpi->llmode_streampriv->timer);
949 }
950 
951 static void snd_card_asihpi_isr(struct hpi_adapter *a)
952 {
953         struct snd_card_asihpi *asihpi;
954 
955         WARN_ON(!a || !a->snd_card || !a->snd_card->private_data);
956         asihpi = (struct snd_card_asihpi *)a->snd_card->private_data;
957         tasklet_schedule(&asihpi->t);
958 }
959 
960 /***************************** PLAYBACK OPS ****************/
961 static int snd_card_asihpi_playback_ioctl(struct snd_pcm_substream *substream,
962                                           unsigned int cmd, void *arg)
963 {
964         char name[16];
965         snd_pcm_debug_name(substream, name, sizeof(name));
966         snd_printddd(KERN_INFO "%s ioctl %d\n", name, cmd);
967         return snd_pcm_lib_ioctl(substream, cmd, arg);
968 }
969 
970 static int snd_card_asihpi_playback_prepare(struct snd_pcm_substream *
971                                             substream)
972 {
973         struct snd_pcm_runtime *runtime = substream->runtime;
974         struct snd_card_asihpi_pcm *dpcm = runtime->private_data;
975 
976         snd_printdd("P%d prepare\n", substream->number);
977 
978         hpi_handle_error(hpi_outstream_reset(dpcm->h_stream));
979         dpcm->pcm_buf_host_rw_ofs = 0;
980         dpcm->pcm_buf_dma_ofs = 0;
981         dpcm->pcm_buf_elapsed_dma_ofs = 0;
982         return 0;
983 }
984 
985 static snd_pcm_uframes_t
986 snd_card_asihpi_playback_pointer(struct snd_pcm_substream *substream)
987 {
988         struct snd_pcm_runtime *runtime = substream->runtime;
989         struct snd_card_asihpi_pcm *dpcm = runtime->private_data;
990         snd_pcm_uframes_t ptr;
991         char name[16];
992         snd_pcm_debug_name(substream, name, sizeof(name));
993 
994         ptr = bytes_to_frames(runtime, dpcm->pcm_buf_dma_ofs  % dpcm->buffer_bytes);
995         snd_printddd("%s, pointer=%ld\n", name, (unsigned long)ptr);
996         return ptr;
997 }
998 
999 static u64 snd_card_asihpi_playback_formats(struct snd_card_asihpi *asihpi,
1000                                                 u32 h_stream)
1001 {
1002         struct hpi_format hpi_format;
1003         u16 format;
1004         u16 err;
1005         u32 h_control;
1006         u32 sample_rate = 48000;
1007         u64 formats = 0;
1008 
1009         /* on cards without SRC, must query at valid rate,
1010         * maybe set by external sync
1011         */
1012         err = hpi_mixer_get_control(asihpi->h_mixer,
1013                                   HPI_SOURCENODE_CLOCK_SOURCE, 0, 0, 0,
1014                                   HPI_CONTROL_SAMPLECLOCK, &h_control);
1015 
1016         if (!err)
1017                 err = hpi_sample_clock_get_sample_rate(h_control,
1018                                 &sample_rate);
1019 
1020         for (format = HPI_FORMAT_PCM8_UNSIGNED;
1021              format <= HPI_FORMAT_PCM24_SIGNED; format++) {
1022                 err = hpi_format_create(&hpi_format, asihpi->out_max_chans,
1023                                         format, sample_rate, 128000, 0);
1024                 if (!err)
1025                         err = hpi_outstream_query_format(h_stream, &hpi_format);
1026                 if (!err && (hpi_to_alsa_formats[format] != -1))
1027                         formats |= pcm_format_to_bits(hpi_to_alsa_formats[format]);
1028         }
1029         return formats;
1030 }
1031 
1032 static int snd_card_asihpi_playback_open(struct snd_pcm_substream *substream)
1033 {
1034         struct snd_pcm_runtime *runtime = substream->runtime;
1035         struct snd_card_asihpi_pcm *dpcm;
1036         struct snd_card_asihpi *card = snd_pcm_substream_chip(substream);
1037         struct snd_pcm_hardware snd_card_asihpi_playback;
1038         int err;
1039 
1040         dpcm = kzalloc(sizeof(*dpcm), GFP_KERNEL);
1041         if (dpcm == NULL)
1042                 return -ENOMEM;
1043 
1044         err = hpi_outstream_open(card->hpi->adapter->index,
1045                               substream->number, &dpcm->h_stream);
1046         hpi_handle_error(err);
1047         if (err)
1048                 kfree(dpcm);
1049         if (err == HPI_ERROR_OBJ_ALREADY_OPEN)
1050                 return -EBUSY;
1051         if (err)
1052                 return -EIO;
1053 
1054         /*? also check ASI5000 samplerate source
1055             If external, only support external rate.
1056             If internal and other stream playing, can't switch
1057         */
1058 
1059         timer_setup(&dpcm->timer, snd_card_asihpi_timer_function, 0);
1060         dpcm->substream = substream;
1061         runtime->private_data = dpcm;
1062         runtime->private_free = snd_card_asihpi_runtime_free;
1063 
1064         memset(&snd_card_asihpi_playback, 0, sizeof(snd_card_asihpi_playback));
1065         if (!card->hpi->interrupt_mode) {
1066                 snd_card_asihpi_playback.buffer_bytes_max = BUFFER_BYTES_MAX;
1067                 snd_card_asihpi_playback.period_bytes_min = PERIOD_BYTES_MIN;
1068                 snd_card_asihpi_playback.period_bytes_max = BUFFER_BYTES_MAX / PERIODS_MIN;
1069                 snd_card_asihpi_playback.periods_min = PERIODS_MIN;
1070                 snd_card_asihpi_playback.periods_max = BUFFER_BYTES_MAX / PERIOD_BYTES_MIN;
1071         } else {
1072                 size_t pbmin = card->update_interval_frames *
1073                         card->out_max_chans;
1074                 snd_card_asihpi_playback.buffer_bytes_max = BUFFER_BYTES_MAX;
1075                 snd_card_asihpi_playback.period_bytes_min = pbmin;
1076                 snd_card_asihpi_playback.period_bytes_max = BUFFER_BYTES_MAX / PERIODS_MIN;
1077                 snd_card_asihpi_playback.periods_min = PERIODS_MIN;
1078                 snd_card_asihpi_playback.periods_max = BUFFER_BYTES_MAX / pbmin;
1079         }
1080 
1081         /* snd_card_asihpi_playback.fifo_size = 0; */
1082         snd_card_asihpi_playback.channels_max = card->out_max_chans;
1083         snd_card_asihpi_playback.channels_min = card->out_min_chans;
1084         snd_card_asihpi_playback.formats =
1085                         snd_card_asihpi_playback_formats(card, dpcm->h_stream);
1086 
1087         snd_card_asihpi_pcm_samplerates(card,  &snd_card_asihpi_playback);
1088 
1089         snd_card_asihpi_playback.info = SNDRV_PCM_INFO_INTERLEAVED |
1090                                         SNDRV_PCM_INFO_DOUBLE |
1091                                         SNDRV_PCM_INFO_BATCH |
1092                                         SNDRV_PCM_INFO_BLOCK_TRANSFER |
1093                                         SNDRV_PCM_INFO_PAUSE |
1094                                         SNDRV_PCM_INFO_MMAP |
1095                                         SNDRV_PCM_INFO_MMAP_VALID;
1096 
1097         if (card->support_grouping) {
1098                 snd_card_asihpi_playback.info |= SNDRV_PCM_INFO_SYNC_START;
1099                 snd_pcm_set_sync(substream);
1100         }
1101 
1102         /* struct is copied, so can create initializer dynamically */
1103         runtime->hw = snd_card_asihpi_playback;
1104 
1105         if (card->can_dma)
1106                 err = snd_pcm_hw_constraint_pow2(runtime, 0,
1107                                         SNDRV_PCM_HW_PARAM_BUFFER_BYTES);
1108         if (err < 0)
1109                 return err;
1110 
1111         snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_PERIOD_SIZE,
1112                 card->update_interval_frames);
1113 
1114         snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_PERIOD_SIZE,
1115                 card->update_interval_frames, UINT_MAX);
1116 
1117         snd_printdd("playback open\n");
1118 
1119         return 0;
1120 }
1121 
1122 static int snd_card_asihpi_playback_close(struct snd_pcm_substream *substream)
1123 {
1124         struct snd_pcm_runtime *runtime = substream->runtime;
1125         struct snd_card_asihpi_pcm *dpcm = runtime->private_data;
1126 
1127         hpi_handle_error(hpi_outstream_close(dpcm->h_stream));
1128         snd_printdd("playback close\n");
1129 
1130         return 0;
1131 }
1132 
1133 static const struct snd_pcm_ops snd_card_asihpi_playback_mmap_ops = {
1134         .open = snd_card_asihpi_playback_open,
1135         .close = snd_card_asihpi_playback_close,
1136         .ioctl = snd_card_asihpi_playback_ioctl,
1137         .hw_params = snd_card_asihpi_pcm_hw_params,
1138         .hw_free = snd_card_asihpi_hw_free,
1139         .prepare = snd_card_asihpi_playback_prepare,
1140         .trigger = snd_card_asihpi_trigger,
1141         .pointer = snd_card_asihpi_playback_pointer,
1142 };
1143 
1144 /***************************** CAPTURE OPS ****************/
1145 static snd_pcm_uframes_t
1146 snd_card_asihpi_capture_pointer(struct snd_pcm_substream *substream)
1147 {
1148         struct snd_pcm_runtime *runtime = substream->runtime;
1149         struct snd_card_asihpi_pcm *dpcm = runtime->private_data;
1150         char name[16];
1151         snd_pcm_debug_name(substream, name, sizeof(name));
1152 
1153         snd_printddd("%s, pointer=%d\n", name, dpcm->pcm_buf_dma_ofs);
1154         /* NOTE Unlike playback can't use actual samples_played
1155                 for the capture position, because those samples aren't yet in
1156                 the local buffer available for reading.
1157         */
1158         return bytes_to_frames(runtime, dpcm->pcm_buf_dma_ofs % dpcm->buffer_bytes);
1159 }
1160 
1161 static int snd_card_asihpi_capture_ioctl(struct snd_pcm_substream *substream,
1162                                          unsigned int cmd, void *arg)
1163 {
1164         return snd_pcm_lib_ioctl(substream, cmd, arg);
1165 }
1166 
1167 static int snd_card_asihpi_capture_prepare(struct snd_pcm_substream *substream)
1168 {
1169         struct snd_pcm_runtime *runtime = substream->runtime;
1170         struct snd_card_asihpi_pcm *dpcm = runtime->private_data;
1171 
1172         hpi_handle_error(hpi_instream_reset(dpcm->h_stream));
1173         dpcm->pcm_buf_host_rw_ofs = 0;
1174         dpcm->pcm_buf_dma_ofs = 0;
1175         dpcm->pcm_buf_elapsed_dma_ofs = 0;
1176 
1177         snd_printdd("Capture Prepare %d\n", substream->number);
1178         return 0;
1179 }
1180 
1181 static u64 snd_card_asihpi_capture_formats(struct snd_card_asihpi *asihpi,
1182                                         u32 h_stream)
1183 {
1184   struct hpi_format hpi_format;
1185         u16 format;
1186         u16 err;
1187         u32 h_control;
1188         u32 sample_rate = 48000;
1189         u64 formats = 0;
1190 
1191         /* on cards without SRC, must query at valid rate,
1192                 maybe set by external sync */
1193         err = hpi_mixer_get_control(asihpi->h_mixer,
1194                                   HPI_SOURCENODE_CLOCK_SOURCE, 0, 0, 0,
1195                                   HPI_CONTROL_SAMPLECLOCK, &h_control);
1196 
1197         if (!err)
1198                 err = hpi_sample_clock_get_sample_rate(h_control,
1199                         &sample_rate);
1200 
1201         for (format = HPI_FORMAT_PCM8_UNSIGNED;
1202                 format <= HPI_FORMAT_PCM24_SIGNED; format++) {
1203 
1204                 err = hpi_format_create(&hpi_format, asihpi->in_max_chans,
1205                                         format, sample_rate, 128000, 0);
1206                 if (!err)
1207                         err = hpi_instream_query_format(h_stream, &hpi_format);
1208                 if (!err && (hpi_to_alsa_formats[format] != -1))
1209                         formats |= pcm_format_to_bits(hpi_to_alsa_formats[format]);
1210         }
1211         return formats;
1212 }
1213 
1214 static int snd_card_asihpi_capture_open(struct snd_pcm_substream *substream)
1215 {
1216         struct snd_pcm_runtime *runtime = substream->runtime;
1217         struct snd_card_asihpi *card = snd_pcm_substream_chip(substream);
1218         struct snd_card_asihpi_pcm *dpcm;
1219         struct snd_pcm_hardware snd_card_asihpi_capture;
1220         int err;
1221 
1222         dpcm = kzalloc(sizeof(*dpcm), GFP_KERNEL);
1223         if (dpcm == NULL)
1224                 return -ENOMEM;
1225 
1226         snd_printdd("capture open adapter %d stream %d\n",
1227                         card->hpi->adapter->index, substream->number);
1228 
1229         err = hpi_handle_error(
1230             hpi_instream_open(card->hpi->adapter->index,
1231                              substream->number, &dpcm->h_stream));
1232         if (err)
1233                 kfree(dpcm);
1234         if (err == HPI_ERROR_OBJ_ALREADY_OPEN)
1235                 return -EBUSY;
1236         if (err)
1237                 return -EIO;
1238 
1239         timer_setup(&dpcm->timer, snd_card_asihpi_timer_function, 0);
1240         dpcm->substream = substream;
1241         runtime->private_data = dpcm;
1242         runtime->private_free = snd_card_asihpi_runtime_free;
1243 
1244         memset(&snd_card_asihpi_capture, 0, sizeof(snd_card_asihpi_capture));
1245         if (!card->hpi->interrupt_mode) {
1246                 snd_card_asihpi_capture.buffer_bytes_max = BUFFER_BYTES_MAX;
1247                 snd_card_asihpi_capture.period_bytes_min = PERIOD_BYTES_MIN;
1248                 snd_card_asihpi_capture.period_bytes_max = BUFFER_BYTES_MAX / PERIODS_MIN;
1249                 snd_card_asihpi_capture.periods_min = PERIODS_MIN;
1250                 snd_card_asihpi_capture.periods_max = BUFFER_BYTES_MAX / PERIOD_BYTES_MIN;
1251         } else {
1252                 size_t pbmin = card->update_interval_frames *
1253                         card->out_max_chans;
1254                 snd_card_asihpi_capture.buffer_bytes_max = BUFFER_BYTES_MAX;
1255                 snd_card_asihpi_capture.period_bytes_min = pbmin;
1256                 snd_card_asihpi_capture.period_bytes_max = BUFFER_BYTES_MAX / PERIODS_MIN;
1257                 snd_card_asihpi_capture.periods_min = PERIODS_MIN;
1258                 snd_card_asihpi_capture.periods_max = BUFFER_BYTES_MAX / pbmin;
1259         }
1260         /* snd_card_asihpi_capture.fifo_size = 0; */
1261         snd_card_asihpi_capture.channels_max = card->in_max_chans;
1262         snd_card_asihpi_capture.channels_min = card->in_min_chans;
1263         snd_card_asihpi_capture.formats =
1264                 snd_card_asihpi_capture_formats(card, dpcm->h_stream);
1265         snd_card_asihpi_pcm_samplerates(card,  &snd_card_asihpi_capture);
1266         snd_card_asihpi_capture.info = SNDRV_PCM_INFO_INTERLEAVED |
1267                                         SNDRV_PCM_INFO_MMAP |
1268                                         SNDRV_PCM_INFO_MMAP_VALID;
1269 
1270         if (card->support_grouping)
1271                 snd_card_asihpi_capture.info |= SNDRV_PCM_INFO_SYNC_START;
1272 
1273         runtime->hw = snd_card_asihpi_capture;
1274 
1275         if (card->can_dma)
1276                 err = snd_pcm_hw_constraint_pow2(runtime, 0,
1277                                         SNDRV_PCM_HW_PARAM_BUFFER_BYTES);
1278         if (err < 0)
1279                 return err;
1280 
1281         snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_PERIOD_SIZE,
1282                 card->update_interval_frames);
1283         snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_PERIOD_SIZE,
1284                 card->update_interval_frames, UINT_MAX);
1285 
1286         snd_pcm_set_sync(substream);
1287 
1288         return 0;
1289 }
1290 
1291 static int snd_card_asihpi_capture_close(struct snd_pcm_substream *substream)
1292 {
1293         struct snd_card_asihpi_pcm *dpcm = substream->runtime->private_data;
1294 
1295         hpi_handle_error(hpi_instream_close(dpcm->h_stream));
1296         return 0;
1297 }
1298 
1299 static const struct snd_pcm_ops snd_card_asihpi_capture_mmap_ops = {
1300         .open = snd_card_asihpi_capture_open,
1301         .close = snd_card_asihpi_capture_close,
1302         .ioctl = snd_card_asihpi_capture_ioctl,
1303         .hw_params = snd_card_asihpi_pcm_hw_params,
1304         .hw_free = snd_card_asihpi_hw_free,
1305         .prepare = snd_card_asihpi_capture_prepare,
1306         .trigger = snd_card_asihpi_trigger,
1307         .pointer = snd_card_asihpi_capture_pointer,
1308 };
1309 
1310 static int snd_card_asihpi_pcm_new(struct snd_card_asihpi *asihpi, int device)
1311 {
1312         struct snd_pcm *pcm;
1313         int err;
1314         u16 num_instreams, num_outstreams, x16;
1315         u32 x32;
1316 
1317         err = hpi_adapter_get_info(asihpi->hpi->adapter->index,
1318                         &num_outstreams, &num_instreams,
1319                         &x16, &x32, &x16);
1320 
1321         err = snd_pcm_new(asihpi->card, "Asihpi PCM", device,
1322                         num_outstreams, num_instreams, &pcm);
1323         if (err < 0)
1324                 return err;
1325 
1326         /* pointer to ops struct is stored, dont change ops afterwards! */
1327         snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK,
1328                         &snd_card_asihpi_playback_mmap_ops);
1329         snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE,
1330                         &snd_card_asihpi_capture_mmap_ops);
1331 
1332         pcm->private_data = asihpi;
1333         pcm->info_flags = 0;
1334         strcpy(pcm->name, "Asihpi PCM");
1335 
1336         /*? do we want to emulate MMAP for non-BBM cards?
1337         Jack doesn't work with ALSAs MMAP emulation - WHY NOT? */
1338         snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV,
1339                                                 snd_dma_pci_data(asihpi->pci),
1340                                                 64*1024, BUFFER_BYTES_MAX);
1341 
1342         return 0;
1343 }
1344 
1345 /***************************** MIXER CONTROLS ****************/
1346 struct hpi_control {
1347         u32 h_control;
1348         u16 control_type;
1349         u16 src_node_type;
1350         u16 src_node_index;
1351         u16 dst_node_type;
1352         u16 dst_node_index;
1353         u16 band;
1354         char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN]; /* copied to snd_ctl_elem_id.name[44]; */
1355 };
1356 
1357 static const char * const asihpi_tuner_band_names[] = {
1358         "invalid",
1359         "AM",
1360         "FM mono",
1361         "TV NTSC-M",
1362         "FM stereo",
1363         "AUX",
1364         "TV PAL BG",
1365         "TV PAL I",
1366         "TV PAL DK",
1367         "TV SECAM",
1368         "TV DAB",
1369 };
1370 /* Number of strings must match the enumerations for HPI_TUNER_BAND in hpi.h */
1371 compile_time_assert(
1372         (ARRAY_SIZE(asihpi_tuner_band_names) ==
1373                 (HPI_TUNER_BAND_LAST+1)),
1374         assert_tuner_band_names_size);
1375 
1376 static const char * const asihpi_src_names[] = {
1377         "no source",
1378         "PCM",
1379         "Line",
1380         "Digital",
1381         "Tuner",
1382         "RF",
1383         "Clock",
1384         "Bitstream",
1385         "Mic",
1386         "Net",
1387         "Analog",
1388         "Adapter",
1389         "RTP",
1390         "Internal",
1391         "AVB",
1392         "BLU-Link"
1393 };
1394 /* Number of strings must match the enumerations for HPI_SOURCENODES in hpi.h */
1395 compile_time_assert(
1396         (ARRAY_SIZE(asihpi_src_names) ==
1397                 (HPI_SOURCENODE_LAST_INDEX-HPI_SOURCENODE_NONE+1)),
1398         assert_src_names_size);
1399 
1400 static const char * const asihpi_dst_names[] = {
1401         "no destination",
1402         "PCM",
1403         "Line",
1404         "Digital",
1405         "RF",
1406         "Speaker",
1407         "Net",
1408         "Analog",
1409         "RTP",
1410         "AVB",
1411         "Internal",
1412         "BLU-Link"
1413 };
1414 /* Number of strings must match the enumerations for HPI_DESTNODES in hpi.h */
1415 compile_time_assert(
1416         (ARRAY_SIZE(asihpi_dst_names) ==
1417                 (HPI_DESTNODE_LAST_INDEX-HPI_DESTNODE_NONE+1)),
1418         assert_dst_names_size);
1419 
1420 static inline int ctl_add(struct snd_card *card, struct snd_kcontrol_new *ctl,
1421                                 struct snd_card_asihpi *asihpi)
1422 {
1423         int err;
1424 
1425         err = snd_ctl_add(card, snd_ctl_new1(ctl, asihpi));
1426         if (err < 0)
1427                 return err;
1428         else if (mixer_dump)
1429                 dev_info(&asihpi->pci->dev, "added %s(%d)\n", ctl->name, ctl->index);
1430 
1431         return 0;
1432 }
1433 
1434 /* Convert HPI control name and location into ALSA control name */
1435 static void asihpi_ctl_init(struct snd_kcontrol_new *snd_control,
1436                                 struct hpi_control *hpi_ctl,
1437                                 char *name)
1438 {
1439         char *dir;
1440         memset(snd_control, 0, sizeof(*snd_control));
1441         snd_control->name = hpi_ctl->name;
1442         snd_control->private_value = hpi_ctl->h_control;
1443         snd_control->iface = SNDRV_CTL_ELEM_IFACE_MIXER;
1444         snd_control->index = 0;
1445 
1446         if (hpi_ctl->src_node_type + HPI_SOURCENODE_NONE == HPI_SOURCENODE_CLOCK_SOURCE)
1447                 dir = ""; /* clock is neither capture nor playback */
1448         else if (hpi_ctl->dst_node_type + HPI_DESTNODE_NONE == HPI_DESTNODE_ISTREAM)
1449                 dir = "Capture ";  /* On or towards a PCM capture destination*/
1450         else if ((hpi_ctl->src_node_type + HPI_SOURCENODE_NONE != HPI_SOURCENODE_OSTREAM) &&
1451                 (!hpi_ctl->dst_node_type))
1452                 dir = "Capture "; /* On a source node that is not PCM playback */
1453         else if (hpi_ctl->src_node_type &&
1454                 (hpi_ctl->src_node_type + HPI_SOURCENODE_NONE != HPI_SOURCENODE_OSTREAM) &&
1455                 (hpi_ctl->dst_node_type))
1456                 dir = "Monitor Playback "; /* Between an input and an output */
1457         else
1458                 dir = "Playback "; /* PCM Playback source, or  output node */
1459 
1460         if (hpi_ctl->src_node_type && hpi_ctl->dst_node_type)
1461                 sprintf(hpi_ctl->name, "%s %d %s %d %s%s",
1462                         asihpi_src_names[hpi_ctl->src_node_type],
1463                         hpi_ctl->src_node_index,
1464                         asihpi_dst_names[hpi_ctl->dst_node_type],
1465                         hpi_ctl->dst_node_index,
1466                         dir, name);
1467         else if (hpi_ctl->dst_node_type) {
1468                 sprintf(hpi_ctl->name, "%s %d %s%s",
1469                 asihpi_dst_names[hpi_ctl->dst_node_type],
1470                 hpi_ctl->dst_node_index,
1471                 dir, name);
1472         } else {
1473                 sprintf(hpi_ctl->name, "%s %d %s%s",
1474                 asihpi_src_names[hpi_ctl->src_node_type],
1475                 hpi_ctl->src_node_index,
1476                 dir, name);
1477         }
1478         /* printk(KERN_INFO "Adding %s %d to %d ",  hpi_ctl->name,
1479                 hpi_ctl->wSrcNodeType, hpi_ctl->wDstNodeType); */
1480 }
1481 
1482 /*------------------------------------------------------------
1483    Volume controls
1484  ------------------------------------------------------------*/
1485 #define VOL_STEP_mB 1
1486 static int snd_asihpi_volume_info(struct snd_kcontrol *kcontrol,
1487                                   struct snd_ctl_elem_info *uinfo)
1488 {
1489         u32 h_control = kcontrol->private_value;
1490         u32 count;
1491         u16 err;
1492         /* native gains are in millibels */
1493         short min_gain_mB;
1494         short max_gain_mB;
1495         short step_gain_mB;
1496 
1497         err = hpi_volume_query_range(h_control,
1498                         &min_gain_mB, &max_gain_mB, &step_gain_mB);
1499         if (err) {
1500                 max_gain_mB = 0;
1501                 min_gain_mB = -10000;
1502                 step_gain_mB = VOL_STEP_mB;
1503         }
1504 
1505         err = hpi_meter_query_channels(h_control, &count);
1506         if (err)
1507                 count = HPI_MAX_CHANNELS;
1508 
1509         uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
1510         uinfo->count = count;
1511         uinfo->value.integer.min = min_gain_mB / VOL_STEP_mB;
1512         uinfo->value.integer.max = max_gain_mB / VOL_STEP_mB;
1513         uinfo->value.integer.step = step_gain_mB / VOL_STEP_mB;
1514         return 0;
1515 }
1516 
1517 static int snd_asihpi_volume_get(struct snd_kcontrol *kcontrol,
1518                                  struct snd_ctl_elem_value *ucontrol)
1519 {
1520         u32 h_control = kcontrol->private_value;
1521         short an_gain_mB[HPI_MAX_CHANNELS];
1522 
1523         hpi_handle_error(hpi_volume_get_gain(h_control, an_gain_mB));
1524         ucontrol->value.integer.value[0] = an_gain_mB[0] / VOL_STEP_mB;
1525         ucontrol->value.integer.value[1] = an_gain_mB[1] / VOL_STEP_mB;
1526 
1527         return 0;
1528 }
1529 
1530 static int snd_asihpi_volume_put(struct snd_kcontrol *kcontrol,
1531                                  struct snd_ctl_elem_value *ucontrol)
1532 {
1533         int change;
1534         u32 h_control = kcontrol->private_value;
1535         short an_gain_mB[HPI_MAX_CHANNELS];
1536 
1537         an_gain_mB[0] =
1538             (ucontrol->value.integer.value[0]) * VOL_STEP_mB;
1539         an_gain_mB[1] =
1540             (ucontrol->value.integer.value[1]) * VOL_STEP_mB;
1541         /*  change = asihpi->mixer_volume[addr][0] != left ||
1542            asihpi->mixer_volume[addr][1] != right;
1543          */
1544         change = 1;
1545         hpi_handle_error(hpi_volume_set_gain(h_control, an_gain_mB));
1546         return change;
1547 }
1548 
1549 static const DECLARE_TLV_DB_SCALE(db_scale_100, -10000, VOL_STEP_mB, 0);
1550 
1551 #define snd_asihpi_volume_mute_info     snd_ctl_boolean_mono_info
1552 
1553 static int snd_asihpi_volume_mute_get(struct snd_kcontrol *kcontrol,
1554                                  struct snd_ctl_elem_value *ucontrol)
1555 {
1556         u32 h_control = kcontrol->private_value;
1557         u32 mute;
1558 
1559         hpi_handle_error(hpi_volume_get_mute(h_control, &mute));
1560         ucontrol->value.integer.value[0] = mute ? 0 : 1;
1561 
1562         return 0;
1563 }
1564 
1565 static int snd_asihpi_volume_mute_put(struct snd_kcontrol *kcontrol,
1566                                  struct snd_ctl_elem_value *ucontrol)
1567 {
1568         u32 h_control = kcontrol->private_value;
1569         int change = 1;
1570         /* HPI currently only supports all or none muting of multichannel volume
1571         ALSA Switch element has opposite sense to HPI mute: on==unmuted, off=muted
1572         */
1573         int mute =  ucontrol->value.integer.value[0] ? 0 : HPI_BITMASK_ALL_CHANNELS;
1574         hpi_handle_error(hpi_volume_set_mute(h_control, mute));
1575         return change;
1576 }
1577 
1578 static int snd_asihpi_volume_add(struct snd_card_asihpi *asihpi,
1579                                  struct hpi_control *hpi_ctl)
1580 {
1581         struct snd_card *card = asihpi->card;
1582         struct snd_kcontrol_new snd_control;
1583         int err;
1584         u32 mute;
1585 
1586         asihpi_ctl_init(&snd_control, hpi_ctl, "Volume");
1587         snd_control.access = SNDRV_CTL_ELEM_ACCESS_READWRITE |
1588                                 SNDRV_CTL_ELEM_ACCESS_TLV_READ;
1589         snd_control.info = snd_asihpi_volume_info;
1590         snd_control.get = snd_asihpi_volume_get;
1591         snd_control.put = snd_asihpi_volume_put;
1592         snd_control.tlv.p = db_scale_100;
1593 
1594         err = ctl_add(card, &snd_control, asihpi);
1595         if (err)
1596                 return err;
1597 
1598         if (hpi_volume_get_mute(hpi_ctl->h_control, &mute) == 0) {
1599                 asihpi_ctl_init(&snd_control, hpi_ctl, "Switch");
1600                 snd_control.access = SNDRV_CTL_ELEM_ACCESS_READWRITE;
1601                 snd_control.info = snd_asihpi_volume_mute_info;
1602                 snd_control.get = snd_asihpi_volume_mute_get;
1603                 snd_control.put = snd_asihpi_volume_mute_put;
1604                 err = ctl_add(card, &snd_control, asihpi);
1605         }
1606         return err;
1607 }
1608 
1609 /*------------------------------------------------------------
1610    Level controls
1611  ------------------------------------------------------------*/
1612 static int snd_asihpi_level_info(struct snd_kcontrol *kcontrol,
1613                                  struct snd_ctl_elem_info *uinfo)
1614 {
1615         u32 h_control = kcontrol->private_value;
1616         u16 err;
1617         short min_gain_mB;
1618         short max_gain_mB;
1619         short step_gain_mB;
1620 
1621         err =
1622             hpi_level_query_range(h_control, &min_gain_mB,
1623                                &max_gain_mB, &step_gain_mB);
1624         if (err) {
1625                 max_gain_mB = 2400;
1626                 min_gain_mB = -1000;
1627                 step_gain_mB = 100;
1628         }
1629 
1630         uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
1631         uinfo->count = 2;
1632         uinfo->value.integer.min = min_gain_mB / HPI_UNITS_PER_dB;
1633         uinfo->value.integer.max = max_gain_mB / HPI_UNITS_PER_dB;
1634         uinfo->value.integer.step = step_gain_mB / HPI_UNITS_PER_dB;
1635         return 0;
1636 }
1637 
1638 static int snd_asihpi_level_get(struct snd_kcontrol *kcontrol,
1639                                 struct snd_ctl_elem_value *ucontrol)
1640 {
1641         u32 h_control = kcontrol->private_value;
1642         short an_gain_mB[HPI_MAX_CHANNELS];
1643 
1644         hpi_handle_error(hpi_level_get_gain(h_control, an_gain_mB));
1645         ucontrol->value.integer.value[0] =
1646             an_gain_mB[0] / HPI_UNITS_PER_dB;
1647         ucontrol->value.integer.value[1] =
1648             an_gain_mB[1] / HPI_UNITS_PER_dB;
1649 
1650         return 0;
1651 }
1652 
1653 static int snd_asihpi_level_put(struct snd_kcontrol *kcontrol,
1654                                 struct snd_ctl_elem_value *ucontrol)
1655 {
1656         int change;
1657         u32 h_control = kcontrol->private_value;
1658         short an_gain_mB[HPI_MAX_CHANNELS];
1659 
1660         an_gain_mB[0] =
1661             (ucontrol->value.integer.value[0]) * HPI_UNITS_PER_dB;
1662         an_gain_mB[1] =
1663             (ucontrol->value.integer.value[1]) * HPI_UNITS_PER_dB;
1664         /*  change = asihpi->mixer_level[addr][0] != left ||
1665            asihpi->mixer_level[addr][1] != right;
1666          */
1667         change = 1;
1668         hpi_handle_error(hpi_level_set_gain(h_control, an_gain_mB));
1669         return change;
1670 }
1671 
1672 static const DECLARE_TLV_DB_SCALE(db_scale_level, -1000, 100, 0);
1673 
1674 static int snd_asihpi_level_add(struct snd_card_asihpi *asihpi,
1675                                 struct hpi_control *hpi_ctl)
1676 {
1677         struct snd_card *card = asihpi->card;
1678         struct snd_kcontrol_new snd_control;
1679 
1680         /* can't use 'volume' cos some nodes have volume as well */
1681         asihpi_ctl_init(&snd_control, hpi_ctl, "Level");
1682         snd_control.access = SNDRV_CTL_ELEM_ACCESS_READWRITE |
1683                                 SNDRV_CTL_ELEM_ACCESS_TLV_READ;
1684         snd_control.info = snd_asihpi_level_info;
1685         snd_control.get = snd_asihpi_level_get;
1686         snd_control.put = snd_asihpi_level_put;
1687         snd_control.tlv.p = db_scale_level;
1688 
1689         return ctl_add(card, &snd_control, asihpi);
1690 }
1691 
1692 /*------------------------------------------------------------
1693    AESEBU controls
1694  ------------------------------------------------------------*/
1695 
1696 /* AESEBU format */
1697 static const char * const asihpi_aesebu_format_names[] = {
1698         "N/A", "S/PDIF", "AES/EBU" };
1699 
1700 static int snd_asihpi_aesebu_format_info(struct snd_kcontrol *kcontrol,
1701                                   struct snd_ctl_elem_info *uinfo)
1702 {
1703         return snd_ctl_enum_info(uinfo, 1, 3, asihpi_aesebu_format_names);
1704 }
1705 
1706 static int snd_asihpi_aesebu_format_get(struct snd_kcontrol *kcontrol,
1707                         struct snd_ctl_elem_value *ucontrol,
1708                         u16 (*func)(u32, u16 *))
1709 {
1710         u32 h_control = kcontrol->private_value;
1711         u16 source, err;
1712 
1713         err = func(h_control, &source);
1714 
1715         /* default to N/A */
1716         ucontrol->value.enumerated.item[0] = 0;
1717         /* return success but set the control to N/A */
1718         if (err)
1719                 return 0;
1720         if (source == HPI_AESEBU_FORMAT_SPDIF)
1721                 ucontrol->value.enumerated.item[0] = 1;
1722         if (source == HPI_AESEBU_FORMAT_AESEBU)
1723                 ucontrol->value.enumerated.item[0] = 2;
1724 
1725         return 0;
1726 }
1727 
1728 static int snd_asihpi_aesebu_format_put(struct snd_kcontrol *kcontrol,
1729                         struct snd_ctl_elem_value *ucontrol,
1730                          u16 (*func)(u32, u16))
1731 {
1732         u32 h_control = kcontrol->private_value;
1733 
1734         /* default to S/PDIF */
1735         u16 source = HPI_AESEBU_FORMAT_SPDIF;
1736 
1737         if (ucontrol->value.enumerated.item[0] == 1)
1738                 source = HPI_AESEBU_FORMAT_SPDIF;
1739         if (ucontrol->value.enumerated.item[0] == 2)
1740                 source = HPI_AESEBU_FORMAT_AESEBU;
1741 
1742         if (func(h_control, source) != 0)
1743                 return -EINVAL;
1744 
1745         return 1;
1746 }
1747 
1748 static int snd_asihpi_aesebu_rx_format_get(struct snd_kcontrol *kcontrol,
1749                                  struct snd_ctl_elem_value *ucontrol) {
1750         return snd_asihpi_aesebu_format_get(kcontrol, ucontrol,
1751                                         hpi_aesebu_receiver_get_format);
1752 }
1753 
1754 static int snd_asihpi_aesebu_rx_format_put(struct snd_kcontrol *kcontrol,
1755                                  struct snd_ctl_elem_value *ucontrol) {
1756         return snd_asihpi_aesebu_format_put(kcontrol, ucontrol,
1757                                         hpi_aesebu_receiver_set_format);
1758 }
1759 
1760 static int snd_asihpi_aesebu_rxstatus_info(struct snd_kcontrol *kcontrol,
1761                                   struct snd_ctl_elem_info *uinfo)
1762 {
1763         uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
1764         uinfo->count = 1;
1765 
1766         uinfo->value.integer.min = 0;
1767         uinfo->value.integer.max = 0X1F;
1768         uinfo->value.integer.step = 1;
1769 
1770         return 0;
1771 }
1772 
1773 static int snd_asihpi_aesebu_rxstatus_get(struct snd_kcontrol *kcontrol,
1774                                  struct snd_ctl_elem_value *ucontrol) {
1775 
1776         u32 h_control = kcontrol->private_value;
1777         u16 status;
1778 
1779         hpi_handle_error(hpi_aesebu_receiver_get_error_status(
1780                                          h_control, &status));
1781         ucontrol->value.integer.value[0] = status;
1782         return 0;
1783 }
1784 
1785 static int snd_asihpi_aesebu_rx_add(struct snd_card_asihpi *asihpi,
1786                                     struct hpi_control *hpi_ctl)
1787 {
1788         struct snd_card *card = asihpi->card;
1789         struct snd_kcontrol_new snd_control;
1790 
1791         asihpi_ctl_init(&snd_control, hpi_ctl, "Format");
1792         snd_control.access = SNDRV_CTL_ELEM_ACCESS_READWRITE;
1793         snd_control.info = snd_asihpi_aesebu_format_info;
1794         snd_control.get = snd_asihpi_aesebu_rx_format_get;
1795         snd_control.put = snd_asihpi_aesebu_rx_format_put;
1796 
1797 
1798         if (ctl_add(card, &snd_control, asihpi) < 0)
1799                 return -EINVAL;
1800 
1801         asihpi_ctl_init(&snd_control, hpi_ctl, "Status");
1802         snd_control.access =
1803             SNDRV_CTL_ELEM_ACCESS_VOLATILE | SNDRV_CTL_ELEM_ACCESS_READ;
1804         snd_control.info = snd_asihpi_aesebu_rxstatus_info;
1805         snd_control.get = snd_asihpi_aesebu_rxstatus_get;
1806 
1807         return ctl_add(card, &snd_control, asihpi);
1808 }
1809 
1810 static int snd_asihpi_aesebu_tx_format_get(struct snd_kcontrol *kcontrol,
1811                                  struct snd_ctl_elem_value *ucontrol) {
1812         return snd_asihpi_aesebu_format_get(kcontrol, ucontrol,
1813                                         hpi_aesebu_transmitter_get_format);
1814 }
1815 
1816 static int snd_asihpi_aesebu_tx_format_put(struct snd_kcontrol *kcontrol,
1817                                  struct snd_ctl_elem_value *ucontrol) {
1818         return snd_asihpi_aesebu_format_put(kcontrol, ucontrol,
1819                                         hpi_aesebu_transmitter_set_format);
1820 }
1821 
1822 
1823 static int snd_asihpi_aesebu_tx_add(struct snd_card_asihpi *asihpi,
1824                                     struct hpi_control *hpi_ctl)
1825 {
1826         struct snd_card *card = asihpi->card;
1827         struct snd_kcontrol_new snd_control;
1828 
1829         asihpi_ctl_init(&snd_control, hpi_ctl, "Format");
1830         snd_control.access = SNDRV_CTL_ELEM_ACCESS_READWRITE;
1831         snd_control.info = snd_asihpi_aesebu_format_info;
1832         snd_control.get = snd_asihpi_aesebu_tx_format_get;
1833         snd_control.put = snd_asihpi_aesebu_tx_format_put;
1834 
1835         return ctl_add(card, &snd_control, asihpi);
1836 }
1837 
1838 /*------------------------------------------------------------
1839    Tuner controls
1840  ------------------------------------------------------------*/
1841 
1842 /* Gain */
1843 
1844 static int snd_asihpi_tuner_gain_info(struct snd_kcontrol *kcontrol,
1845                                   struct snd_ctl_elem_info *uinfo)
1846 {
1847         u32 h_control = kcontrol->private_value;
1848         u16 err;
1849         short idx;
1850         u16 gain_range[3];
1851 
1852         for (idx = 0; idx < 3; idx++) {
1853                 err = hpi_tuner_query_gain(h_control,
1854                                           idx, &gain_range[idx]);
1855                 if (err != 0)
1856                         return err;
1857         }
1858 
1859         uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
1860         uinfo->count = 1;
1861         uinfo->value.integer.min = ((int)gain_range[0]) / HPI_UNITS_PER_dB;
1862         uinfo->value.integer.max = ((int)gain_range[1]) / HPI_UNITS_PER_dB;
1863         uinfo->value.integer.step = ((int) gain_range[2]) / HPI_UNITS_PER_dB;
1864         return 0;
1865 }
1866 
1867 static int snd_asihpi_tuner_gain_get(struct snd_kcontrol *kcontrol,
1868                                  struct snd_ctl_elem_value *ucontrol)
1869 {
1870         /*
1871         struct snd_card_asihpi *asihpi = snd_kcontrol_chip(kcontrol);
1872         */
1873         u32 h_control = kcontrol->private_value;
1874         short gain;
1875 
1876         hpi_handle_error(hpi_tuner_get_gain(h_control, &gain));
1877         ucontrol->value.integer.value[0] = gain / HPI_UNITS_PER_dB;
1878 
1879         return 0;
1880 }
1881 
1882 static int snd_asihpi_tuner_gain_put(struct snd_kcontrol *kcontrol,
1883                                  struct snd_ctl_elem_value *ucontrol)
1884 {
1885         /*
1886         struct snd_card_asihpi *asihpi = snd_kcontrol_chip(kcontrol);
1887         */
1888         u32 h_control = kcontrol->private_value;
1889         short gain;
1890 
1891         gain = (ucontrol->value.integer.value[0]) * HPI_UNITS_PER_dB;
1892         hpi_handle_error(hpi_tuner_set_gain(h_control, gain));
1893 
1894         return 1;
1895 }
1896 
1897 /* Band  */
1898 
1899 static int asihpi_tuner_band_query(struct snd_kcontrol *kcontrol,
1900                                         u16 *band_list, u32 len) {
1901         u32 h_control = kcontrol->private_value;
1902         u16 err = 0;
1903         u32 i;
1904 
1905         for (i = 0; i < len; i++) {
1906                 err = hpi_tuner_query_band(
1907                                 h_control, i, &band_list[i]);
1908                 if (err != 0)
1909                         break;
1910         }
1911 
1912         if (err && (err != HPI_ERROR_INVALID_OBJ_INDEX))
1913                 return -EIO;
1914 
1915         return i;
1916 }
1917 
1918 static int snd_asihpi_tuner_band_info(struct snd_kcontrol *kcontrol,
1919                                   struct snd_ctl_elem_info *uinfo)
1920 {
1921         u16 tuner_bands[HPI_TUNER_BAND_LAST];
1922         int num_bands = 0;
1923 
1924         num_bands = asihpi_tuner_band_query(kcontrol, tuner_bands,
1925                                 HPI_TUNER_BAND_LAST);
1926 
1927         if (num_bands < 0)
1928                 return num_bands;
1929 
1930         return snd_ctl_enum_info(uinfo, 1, num_bands, asihpi_tuner_band_names);
1931 }
1932 
1933 static int snd_asihpi_tuner_band_get(struct snd_kcontrol *kcontrol,
1934                                  struct snd_ctl_elem_value *ucontrol)
1935 {
1936         u32 h_control = kcontrol->private_value;
1937         /*
1938         struct snd_card_asihpi *asihpi = snd_kcontrol_chip(kcontrol);
1939         */
1940         u16 band, idx;
1941         u16 tuner_bands[HPI_TUNER_BAND_LAST];
1942         u32 num_bands = 0;
1943 
1944         num_bands = asihpi_tuner_band_query(kcontrol, tuner_bands,
1945                                 HPI_TUNER_BAND_LAST);
1946 
1947         hpi_handle_error(hpi_tuner_get_band(h_control, &band));
1948 
1949         ucontrol->value.enumerated.item[0] = -1;
1950         for (idx = 0; idx < HPI_TUNER_BAND_LAST; idx++)
1951                 if (tuner_bands[idx] == band) {
1952                         ucontrol->value.enumerated.item[0] = idx;
1953                         break;
1954                 }
1955 
1956         return 0;
1957 }
1958 
1959 static int snd_asihpi_tuner_band_put(struct snd_kcontrol *kcontrol,
1960                                  struct snd_ctl_elem_value *ucontrol)
1961 {
1962         /*
1963         struct snd_card_asihpi *asihpi = snd_kcontrol_chip(kcontrol);
1964         */
1965         u32 h_control = kcontrol->private_value;
1966         unsigned int idx;
1967         u16 band;
1968         u16 tuner_bands[HPI_TUNER_BAND_LAST];
1969         u32 num_bands = 0;
1970 
1971         num_bands = asihpi_tuner_band_query(kcontrol, tuner_bands,
1972                         HPI_TUNER_BAND_LAST);
1973 
1974         idx = ucontrol->value.enumerated.item[0];
1975         if (idx >= ARRAY_SIZE(tuner_bands))
1976                 idx = ARRAY_SIZE(tuner_bands) - 1;
1977         band = tuner_bands[idx];
1978         hpi_handle_error(hpi_tuner_set_band(h_control, band));
1979 
1980         return 1;
1981 }
1982 
1983 /* Freq */
1984 
1985 static int snd_asihpi_tuner_freq_info(struct snd_kcontrol *kcontrol,
1986                                   struct snd_ctl_elem_info *uinfo)
1987 {
1988         u32 h_control = kcontrol->private_value;
1989         u16 err;
1990         u16 tuner_bands[HPI_TUNER_BAND_LAST];
1991         u16 num_bands = 0, band_iter, idx;
1992         u32 freq_range[3], temp_freq_range[3];
1993 
1994         num_bands = asihpi_tuner_band_query(kcontrol, tuner_bands,
1995                         HPI_TUNER_BAND_LAST);
1996 
1997         freq_range[0] = INT_MAX;
1998         freq_range[1] = 0;
1999         freq_range[2] = INT_MAX;
2000 
2001         for (band_iter = 0; band_iter < num_bands; band_iter++) {
2002                 for (idx = 0; idx < 3; idx++) {
2003                         err = hpi_tuner_query_frequency(h_control,
2004                                 idx, tuner_bands[band_iter],
2005                                 &temp_freq_range[idx]);
2006                         if (err != 0)
2007                                 return err;
2008                 }
2009 
2010                 /* skip band with bogus stepping */
2011                 if (temp_freq_range[2] <= 0)
2012                         continue;
2013 
2014                 if (temp_freq_range[0] < freq_range[0])
2015                         freq_range[0] = temp_freq_range[0];
2016                 if (temp_freq_range[1] > freq_range[1])
2017                         freq_range[1] = temp_freq_range[1];
2018                 if (temp_freq_range[2] < freq_range[2])
2019                         freq_range[2] = temp_freq_range[2];
2020         }
2021 
2022         uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
2023         uinfo->count = 1;
2024         uinfo->value.integer.min = ((int)freq_range[0]);
2025         uinfo->value.integer.max = ((int)freq_range[1]);
2026         uinfo->value.integer.step = ((int)freq_range[2]);
2027         return 0;
2028 }
2029 
2030 static int snd_asihpi_tuner_freq_get(struct snd_kcontrol *kcontrol,
2031                                  struct snd_ctl_elem_value *ucontrol)
2032 {
2033         u32 h_control = kcontrol->private_value;
2034         u32 freq;
2035 
2036         hpi_handle_error(hpi_tuner_get_frequency(h_control, &freq));
2037         ucontrol->value.integer.value[0] = freq;
2038 
2039         return 0;
2040 }
2041 
2042 static int snd_asihpi_tuner_freq_put(struct snd_kcontrol *kcontrol,
2043                                  struct snd_ctl_elem_value *ucontrol)
2044 {
2045         u32 h_control = kcontrol->private_value;
2046         u32 freq;
2047 
2048         freq = ucontrol->value.integer.value[0];
2049         hpi_handle_error(hpi_tuner_set_frequency(h_control, freq));
2050 
2051         return 1;
2052 }
2053 
2054 /* Tuner control group initializer  */
2055 static int snd_asihpi_tuner_add(struct snd_card_asihpi *asihpi,
2056                                 struct hpi_control *hpi_ctl)
2057 {
2058         struct snd_card *card = asihpi->card;
2059         struct snd_kcontrol_new snd_control;
2060 
2061         snd_control.private_value = hpi_ctl->h_control;
2062         snd_control.access = SNDRV_CTL_ELEM_ACCESS_READWRITE;
2063 
2064         if (!hpi_tuner_get_gain(hpi_ctl->h_control, NULL)) {
2065                 asihpi_ctl_init(&snd_control, hpi_ctl, "Gain");
2066                 snd_control.info = snd_asihpi_tuner_gain_info;
2067                 snd_control.get = snd_asihpi_tuner_gain_get;
2068                 snd_control.put = snd_asihpi_tuner_gain_put;
2069 
2070                 if (ctl_add(card, &snd_control, asihpi) < 0)
2071                         return -EINVAL;
2072         }
2073 
2074         asihpi_ctl_init(&snd_control, hpi_ctl, "Band");
2075         snd_control.info = snd_asihpi_tuner_band_info;
2076         snd_control.get = snd_asihpi_tuner_band_get;
2077         snd_control.put = snd_asihpi_tuner_band_put;
2078 
2079         if (ctl_add(card, &snd_control, asihpi) < 0)
2080                 return -EINVAL;
2081 
2082         asihpi_ctl_init(&snd_control, hpi_ctl, "Freq");
2083         snd_control.info = snd_asihpi_tuner_freq_info;
2084         snd_control.get = snd_asihpi_tuner_freq_get;
2085         snd_control.put = snd_asihpi_tuner_freq_put;
2086 
2087         return ctl_add(card, &snd_control, asihpi);
2088 }
2089 
2090 /*------------------------------------------------------------
2091    Meter controls
2092  ------------------------------------------------------------*/
2093 static int snd_asihpi_meter_info(struct snd_kcontrol *kcontrol,
2094                                  struct snd_ctl_elem_info *uinfo)
2095 {
2096         u32 h_control = kcontrol->private_value;
2097         u32 count;
2098         u16 err;
2099         err = hpi_meter_query_channels(h_control, &count);
2100         if (err)
2101                 count = HPI_MAX_CHANNELS;
2102 
2103         uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
2104         uinfo->count = count;
2105         uinfo->value.integer.min = 0;
2106         uinfo->value.integer.max = 0x7FFFFFFF;
2107         return 0;
2108 }
2109 
2110 /* linear values for 10dB steps */
2111 static int log2lin[] = {
2112         0x7FFFFFFF, /* 0dB */
2113         679093956,
2114         214748365,
2115          67909396,
2116          21474837,
2117           6790940,
2118           2147484, /* -60dB */
2119            679094,
2120            214748, /* -80 */
2121             67909,
2122             21475, /* -100 */
2123              6791,
2124              2147,
2125               679,
2126               214,
2127                68,
2128                21,
2129                 7,
2130                 2
2131 };
2132 
2133 static int snd_asihpi_meter_get(struct snd_kcontrol *kcontrol,
2134                                 struct snd_ctl_elem_value *ucontrol)
2135 {
2136         u32 h_control = kcontrol->private_value;
2137         short an_gain_mB[HPI_MAX_CHANNELS], i;
2138         u16 err;
2139 
2140         err = hpi_meter_get_peak(h_control, an_gain_mB);
2141 
2142         for (i = 0; i < HPI_MAX_CHANNELS; i++) {
2143                 if (err) {
2144                         ucontrol->value.integer.value[i] = 0;
2145                 } else if (an_gain_mB[i] >= 0) {
2146                         ucontrol->value.integer.value[i] =
2147                                 an_gain_mB[i] << 16;
2148                 } else {
2149                         /* -ve is log value in millibels < -60dB,
2150                         * convert to (roughly!) linear,
2151                         */
2152                         ucontrol->value.integer.value[i] =
2153                                         log2lin[an_gain_mB[i] / -1000];
2154                 }
2155         }
2156         return 0;
2157 }
2158 
2159 static int snd_asihpi_meter_add(struct snd_card_asihpi *asihpi,
2160                                 struct hpi_control *hpi_ctl, int subidx)
2161 {
2162         struct snd_card *card = asihpi->card;
2163         struct snd_kcontrol_new snd_control;
2164 
2165         asihpi_ctl_init(&snd_control, hpi_ctl, "Meter");
2166         snd_control.access =
2167             SNDRV_CTL_ELEM_ACCESS_VOLATILE | SNDRV_CTL_ELEM_ACCESS_READ;
2168         snd_control.info = snd_asihpi_meter_info;
2169         snd_control.get = snd_asihpi_meter_get;
2170 
2171         snd_control.index = subidx;
2172 
2173         return ctl_add(card, &snd_control, asihpi);
2174 }
2175 
2176 /*------------------------------------------------------------
2177    Multiplexer controls
2178  ------------------------------------------------------------*/
2179 static int snd_card_asihpi_mux_count_sources(struct snd_kcontrol *snd_control)
2180 {
2181         u32 h_control = snd_control->private_value;
2182         struct hpi_control hpi_ctl;
2183         int s, err;
2184         for (s = 0; s < 32; s++) {
2185                 err = hpi_multiplexer_query_source(h_control, s,
2186                                                   &hpi_ctl.
2187                                                   src_node_type,
2188                                                   &hpi_ctl.
2189                                                   src_node_index);
2190                 if (err)
2191                         break;
2192         }
2193         return s;
2194 }
2195 
2196 static int snd_asihpi_mux_info(struct snd_kcontrol *kcontrol,
2197                                struct snd_ctl_elem_info *uinfo)
2198 {
2199         int err;
2200         u16 src_node_type, src_node_index;
2201         u32 h_control = kcontrol->private_value;
2202 
2203         uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
2204         uinfo->count = 1;
2205         uinfo->value.enumerated.items =
2206             snd_card_asihpi_mux_count_sources(kcontrol);
2207 
2208         if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
2209                 uinfo->value.enumerated.item =
2210                     uinfo->value.enumerated.items - 1;
2211 
2212         err =
2213             hpi_multiplexer_query_source(h_control,
2214                                         uinfo->value.enumerated.item,
2215                                         &src_node_type, &src_node_index);
2216 
2217         sprintf(uinfo->value.enumerated.name, "%s %d",
2218                 asihpi_src_names[src_node_type - HPI_SOURCENODE_NONE],
2219                 src_node_index);
2220         return 0;
2221 }
2222 
2223 static int snd_asihpi_mux_get(struct snd_kcontrol *kcontrol,
2224                               struct snd_ctl_elem_value *ucontrol)
2225 {
2226         u32 h_control = kcontrol->private_value;
2227         u16 source_type, source_index;
2228         u16 src_node_type, src_node_index;
2229         int s;
2230 
2231         hpi_handle_error(hpi_multiplexer_get_source(h_control,
2232                                 &source_type, &source_index));
2233         /* Should cache this search result! */
2234         for (s = 0; s < 256; s++) {
2235                 if (hpi_multiplexer_query_source(h_control, s,
2236                                             &src_node_type, &src_node_index))
2237                         break;
2238 
2239                 if ((source_type == src_node_type)
2240                     && (source_index == src_node_index)) {
2241                         ucontrol->value.enumerated.item[0] = s;
2242                         return 0;
2243                 }
2244         }
2245         snd_printd(KERN_WARNING
2246                 "Control %x failed to match mux source %hu %hu\n",
2247                 h_control, source_type, source_index);
2248         ucontrol->value.enumerated.item[0] = 0;
2249         return 0;
2250 }
2251 
2252 static int snd_asihpi_mux_put(struct snd_kcontrol *kcontrol,
2253                               struct snd_ctl_elem_value *ucontrol)
2254 {
2255         int change;
2256         u32 h_control = kcontrol->private_value;
2257         u16 source_type, source_index;
2258         u16 e;
2259 
2260         change = 1;
2261 
2262         e = hpi_multiplexer_query_source(h_control,
2263                                     ucontrol->value.enumerated.item[0],
2264                                     &source_type, &source_index);
2265         if (!e)
2266                 hpi_handle_error(
2267                         hpi_multiplexer_set_source(h_control,
2268                                                 source_type, source_index));
2269         return change;
2270 }
2271 
2272 
2273 static int  snd_asihpi_mux_add(struct snd_card_asihpi *asihpi,
2274                                struct hpi_control *hpi_ctl)
2275 {
2276         struct snd_card *card = asihpi->card;
2277         struct snd_kcontrol_new snd_control;
2278 
2279         asihpi_ctl_init(&snd_control, hpi_ctl, "Route");
2280         snd_control.access = SNDRV_CTL_ELEM_ACCESS_READWRITE;
2281         snd_control.info = snd_asihpi_mux_info;
2282         snd_control.get = snd_asihpi_mux_get;
2283         snd_control.put = snd_asihpi_mux_put;
2284 
2285         return ctl_add(card, &snd_control, asihpi);
2286 
2287 }
2288 
2289 /*------------------------------------------------------------
2290    Channel mode controls
2291  ------------------------------------------------------------*/
2292 static int snd_asihpi_cmode_info(struct snd_kcontrol *kcontrol,
2293                                  struct snd_ctl_elem_info *uinfo)
2294 {
2295         static const char * const mode_names[HPI_CHANNEL_MODE_LAST + 1] = {
2296                 "invalid",
2297                 "Normal", "Swap",
2298                 "From Left", "From Right",
2299                 "To Left", "To Right"
2300         };
2301 
2302         u32 h_control = kcontrol->private_value;
2303         u16 mode;
2304         int i;
2305         const char *mapped_names[6];
2306         int valid_modes = 0;
2307 
2308         /* HPI channel mode values can be from 1 to 6
2309         Some adapters only support a contiguous subset
2310         */
2311         for (i = 0; i < HPI_CHANNEL_MODE_LAST; i++)
2312                 if (!hpi_channel_mode_query_mode(
2313                         h_control, i, &mode)) {
2314                         mapped_names[valid_modes] = mode_names[mode];
2315                         valid_modes++;
2316                         }
2317 
2318         if (!valid_modes)
2319                 return -EINVAL;
2320 
2321         return snd_ctl_enum_info(uinfo, 1, valid_modes, mapped_names);
2322 }
2323 
2324 static int snd_asihpi_cmode_get(struct snd_kcontrol *kcontrol,
2325                                 struct snd_ctl_elem_value *ucontrol)
2326 {
2327         u32 h_control = kcontrol->private_value;
2328         u16 mode;
2329 
2330         if (hpi_channel_mode_get(h_control, &mode))
2331                 mode = 1;
2332 
2333         ucontrol->value.enumerated.item[0] = mode - 1;
2334 
2335         return 0;
2336 }
2337 
2338 static int snd_asihpi_cmode_put(struct snd_kcontrol *kcontrol,
2339                                 struct snd_ctl_elem_value *ucontrol)
2340 {
2341         int change;
2342         u32 h_control = kcontrol->private_value;
2343 
2344         change = 1;
2345 
2346         hpi_handle_error(hpi_channel_mode_set(h_control,
2347                            ucontrol->value.enumerated.item[0] + 1));
2348         return change;
2349 }
2350 
2351 
2352 static int snd_asihpi_cmode_add(struct snd_card_asihpi *asihpi,
2353                                 struct hpi_control *hpi_ctl)
2354 {
2355         struct snd_card *card = asihpi->card;
2356         struct snd_kcontrol_new snd_control;
2357 
2358         asihpi_ctl_init(&snd_control, hpi_ctl, "Mode");
2359         snd_control.access = SNDRV_CTL_ELEM_ACCESS_READWRITE;
2360         snd_control.info = snd_asihpi_cmode_info;
2361         snd_control.get = snd_asihpi_cmode_get;
2362         snd_control.put = snd_asihpi_cmode_put;
2363 
2364         return ctl_add(card, &snd_control, asihpi);
2365 }
2366 
2367 /*------------------------------------------------------------
2368    Sampleclock source  controls
2369  ------------------------------------------------------------*/
2370 static const char * const sampleclock_sources[] = {
2371         "N/A", "Local PLL", "Digital Sync", "Word External", "Word Header",
2372         "SMPTE", "Digital1", "Auto", "Network", "Invalid",
2373         "Prev Module", "BLU-Link",
2374         "Digital2", "Digital3", "Digital4", "Digital5",
2375         "Digital6", "Digital7", "Digital8"};
2376 
2377         /* Number of strings must match expected enumerated values */
2378         compile_time_assert(
2379                 (ARRAY_SIZE(sampleclock_sources) == MAX_CLOCKSOURCES),
2380                 assert_sampleclock_sources_size);
2381 
2382 static int snd_asihpi_clksrc_info(struct snd_kcontrol *kcontrol,
2383                                   struct snd_ctl_elem_info *uinfo)
2384 {
2385         struct snd_card_asihpi *asihpi =
2386                         (struct snd_card_asihpi *)(kcontrol->private_data);
2387         struct clk_cache *clkcache = &asihpi->cc;
2388         uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
2389         uinfo->count = 1;
2390         uinfo->value.enumerated.items = clkcache->count;
2391 
2392         if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
2393                 uinfo->value.enumerated.item =
2394                                 uinfo->value.enumerated.items - 1;
2395 
2396         strcpy(uinfo->value.enumerated.name,
2397                clkcache->s[uinfo->value.enumerated.item].name);
2398         return 0;
2399 }
2400 
2401 static int snd_asihpi_clksrc_get(struct snd_kcontrol *kcontrol,
2402                                  struct snd_ctl_elem_value *ucontrol)
2403 {
2404         struct snd_card_asihpi *asihpi =
2405                         (struct snd_card_asihpi *)(kcontrol->private_data);
2406         struct clk_cache *clkcache = &asihpi->cc;
2407         u32 h_control = kcontrol->private_value;
2408         u16 source, srcindex = 0;
2409         int i;
2410 
2411         ucontrol->value.enumerated.item[0] = 0;
2412         if (hpi_sample_clock_get_source(h_control, &source))
2413                 source = 0;
2414 
2415         if (source == HPI_SAMPLECLOCK_SOURCE_AESEBU_INPUT)
2416                 if (hpi_sample_clock_get_source_index(h_control, &srcindex))
2417                         srcindex = 0;
2418 
2419         for (i = 0; i < clkcache->count; i++)
2420                 if ((clkcache->s[i].source == source) &&
2421                         (clkcache->s[i].index == srcindex))
2422                         break;
2423 
2424         ucontrol->value.enumerated.item[0] = i;
2425 
2426         return 0;
2427 }
2428 
2429 static int snd_asihpi_clksrc_put(struct snd_kcontrol *kcontrol,
2430                                  struct snd_ctl_elem_value *ucontrol)
2431 {
2432         struct snd_card_asihpi *asihpi =
2433                         (struct snd_card_asihpi *)(kcontrol->private_data);
2434         struct clk_cache *clkcache = &asihpi->cc;
2435         unsigned int item;
2436         int change;
2437         u32 h_control = kcontrol->private_value;
2438 
2439         change = 1;
2440         item = ucontrol->value.enumerated.item[0];
2441         if (item >= clkcache->count)
2442                 item = clkcache->count-1;
2443 
2444         hpi_handle_error(hpi_sample_clock_set_source(
2445                                 h_control, clkcache->s[item].source));
2446 
2447         if (clkcache->s[item].source == HPI_SAMPLECLOCK_SOURCE_AESEBU_INPUT)
2448                 hpi_handle_error(hpi_sample_clock_set_source_index(
2449                                 h_control, clkcache->s[item].index));
2450         return change;
2451 }
2452 
2453 /*------------------------------------------------------------
2454    Clkrate controls
2455  ------------------------------------------------------------*/
2456 /* Need to change this to enumerated control with list of rates */
2457 static int snd_asihpi_clklocal_info(struct snd_kcontrol *kcontrol,
2458                                    struct snd_ctl_elem_info *uinfo)
2459 {
2460         uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
2461         uinfo->count = 1;
2462         uinfo->value.integer.min = 8000;
2463         uinfo->value.integer.max = 192000;
2464         uinfo->value.integer.step = 100;
2465 
2466         return 0;
2467 }
2468 
2469 static int snd_asihpi_clklocal_get(struct snd_kcontrol *kcontrol,
2470                                   struct snd_ctl_elem_value *ucontrol)
2471 {
2472         u32 h_control = kcontrol->private_value;
2473         u32 rate;
2474         u16 e;
2475 
2476         e = hpi_sample_clock_get_local_rate(h_control, &rate);
2477         if (!e)
2478                 ucontrol->value.integer.value[0] = rate;
2479         else
2480                 ucontrol->value.integer.value[0] = 0;
2481         return 0;
2482 }
2483 
2484 static int snd_asihpi_clklocal_put(struct snd_kcontrol *kcontrol,
2485                                   struct snd_ctl_elem_value *ucontrol)
2486 {
2487         int change;
2488         u32 h_control = kcontrol->private_value;
2489 
2490         /*  change = asihpi->mixer_clkrate[addr][0] != left ||
2491            asihpi->mixer_clkrate[addr][1] != right;
2492          */
2493         change = 1;
2494         hpi_handle_error(hpi_sample_clock_set_local_rate(h_control,
2495                                       ucontrol->value.integer.value[0]));
2496         return change;
2497 }
2498 
2499 static int snd_asihpi_clkrate_info(struct snd_kcontrol *kcontrol,
2500                                    struct snd_ctl_elem_info *uinfo)
2501 {
2502         uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
2503         uinfo->count = 1;
2504         uinfo->value.integer.min = 8000;
2505         uinfo->value.integer.max = 192000;
2506         uinfo->value.integer.step = 100;
2507 
2508         return 0;
2509 }
2510 
2511 static int snd_asihpi_clkrate_get(struct snd_kcontrol *kcontrol,
2512                                   struct snd_ctl_elem_value *ucontrol)
2513 {
2514         u32 h_control = kcontrol->private_value;
2515         u32 rate;
2516         u16 e;
2517 
2518         e = hpi_sample_clock_get_sample_rate(h_control, &rate);
2519         if (!e)
2520                 ucontrol->value.integer.value[0] = rate;
2521         else
2522                 ucontrol->value.integer.value[0] = 0;
2523         return 0;
2524 }
2525 
2526 static int snd_asihpi_sampleclock_add(struct snd_card_asihpi *asihpi,
2527                                       struct hpi_control *hpi_ctl)
2528 {
2529         struct snd_card *card;
2530         struct snd_kcontrol_new snd_control;
2531 
2532         struct clk_cache *clkcache;
2533         u32 hSC =  hpi_ctl->h_control;
2534         int has_aes_in = 0;
2535         int i, j;
2536         u16 source;
2537 
2538         if (snd_BUG_ON(!asihpi))
2539                 return -EINVAL;
2540         card = asihpi->card;
2541         clkcache = &asihpi->cc;
2542         snd_control.private_value = hpi_ctl->h_control;
2543 
2544         clkcache->has_local = 0;
2545 
2546         for (i = 0; i <= HPI_SAMPLECLOCK_SOURCE_LAST; i++) {
2547                 if  (hpi_sample_clock_query_source(hSC,
2548                                 i, &source))
2549                         break;
2550                 clkcache->s[i].source = source;
2551                 clkcache->s[i].index = 0;
2552                 clkcache->s[i].name = sampleclock_sources[source];
2553                 if (source == HPI_SAMPLECLOCK_SOURCE_AESEBU_INPUT)
2554                         has_aes_in = 1;
2555                 if (source == HPI_SAMPLECLOCK_SOURCE_LOCAL)
2556                         clkcache->has_local = 1;
2557         }
2558         if (has_aes_in)
2559                 /* already will have picked up index 0 above */
2560                 for (j = 1; j < 8; j++) {
2561                         if (hpi_sample_clock_query_source_index(hSC,
2562                                 j, HPI_SAMPLECLOCK_SOURCE_AESEBU_INPUT,
2563                                 &source))
2564                                 break;
2565                         clkcache->s[i].source =
2566                                 HPI_SAMPLECLOCK_SOURCE_AESEBU_INPUT;
2567                         clkcache->s[i].index = j;
2568                         clkcache->s[i].name = sampleclock_sources[
2569                                         j+HPI_SAMPLECLOCK_SOURCE_LAST];
2570                         i++;
2571                 }
2572         clkcache->count = i;
2573 
2574         asihpi_ctl_init(&snd_control, hpi_ctl, "Source");
2575         snd_control.access = SNDRV_CTL_ELEM_ACCESS_READWRITE ;
2576         snd_control.info = snd_asihpi_clksrc_info;
2577         snd_control.get = snd_asihpi_clksrc_get;
2578         snd_control.put = snd_asihpi_clksrc_put;
2579         if (ctl_add(card, &snd_control, asihpi) < 0)
2580                 return -EINVAL;
2581 
2582 
2583         if (clkcache->has_local) {
2584                 asihpi_ctl_init(&snd_control, hpi_ctl, "Localrate");
2585                 snd_control.access = SNDRV_CTL_ELEM_ACCESS_READWRITE ;
2586                 snd_control.info = snd_asihpi_clklocal_info;
2587                 snd_control.get = snd_asihpi_clklocal_get;
2588                 snd_control.put = snd_asihpi_clklocal_put;
2589 
2590 
2591                 if (ctl_add(card, &snd_control, asihpi) < 0)
2592                         return -EINVAL;
2593         }
2594 
2595         asihpi_ctl_init(&snd_control, hpi_ctl, "Rate");
2596         snd_control.access =
2597             SNDRV_CTL_ELEM_ACCESS_VOLATILE | SNDRV_CTL_ELEM_ACCESS_READ;
2598         snd_control.info = snd_asihpi_clkrate_info;
2599         snd_control.get = snd_asihpi_clkrate_get;
2600 
2601         return ctl_add(card, &snd_control, asihpi);
2602 }
2603 /*------------------------------------------------------------
2604    Mixer
2605  ------------------------------------------------------------*/
2606 
2607 static int snd_card_asihpi_mixer_new(struct snd_card_asihpi *asihpi)
2608 {
2609         struct snd_card *card;
2610         unsigned int idx = 0;
2611         unsigned int subindex = 0;
2612         int err;
2613         struct hpi_control hpi_ctl, prev_ctl;
2614 
2615         if (snd_BUG_ON(!asihpi))
2616                 return -EINVAL;
2617         card = asihpi->card;
2618         strcpy(card->mixername, "Asihpi Mixer");
2619 
2620         err =
2621             hpi_mixer_open(asihpi->hpi->adapter->index,
2622                           &asihpi->h_mixer);
2623         hpi_handle_error(err);
2624         if (err)
2625                 return -err;
2626 
2627         memset(&prev_ctl, 0, sizeof(prev_ctl));
2628         prev_ctl.control_type = -1;
2629 
2630         for (idx = 0; idx < 2000; idx++) {
2631                 err = hpi_mixer_get_control_by_index(
2632                                 asihpi->h_mixer,
2633                                 idx,
2634                                 &hpi_ctl.src_node_type,
2635                                 &hpi_ctl.src_node_index,
2636                                 &hpi_ctl.dst_node_type,
2637                                 &hpi_ctl.dst_node_index,
2638                                 &hpi_ctl.control_type,
2639                                 &hpi_ctl.h_control);
2640                 if (err) {
2641                         if (err == HPI_ERROR_CONTROL_DISABLED) {
2642                                 if (mixer_dump)
2643                                         dev_info(&asihpi->pci->dev,
2644                                                    "Disabled HPI Control(%d)\n",
2645                                                    idx);
2646                                 continue;
2647                         } else
2648                                 break;
2649 
2650                 }
2651 
2652                 hpi_ctl.src_node_type -= HPI_SOURCENODE_NONE;
2653                 hpi_ctl.dst_node_type -= HPI_DESTNODE_NONE;
2654 
2655                 /* ASI50xx in SSX mode has multiple meters on the same node.
2656                    Use subindex to create distinct ALSA controls
2657                    for any duplicated controls.
2658                 */
2659                 if ((hpi_ctl.control_type == prev_ctl.control_type) &&
2660                     (hpi_ctl.src_node_type == prev_ctl.src_node_type) &&
2661                     (hpi_ctl.src_node_index == prev_ctl.src_node_index) &&
2662                     (hpi_ctl.dst_node_type == prev_ctl.dst_node_type) &&
2663                     (hpi_ctl.dst_node_index == prev_ctl.dst_node_index))
2664                         subindex++;
2665                 else
2666                         subindex = 0;
2667 
2668                 prev_ctl = hpi_ctl;
2669 
2670                 switch (hpi_ctl.control_type) {
2671                 case HPI_CONTROL_VOLUME:
2672                         err = snd_asihpi_volume_add(asihpi, &hpi_ctl);
2673                         break;
2674                 case HPI_CONTROL_LEVEL:
2675                         err = snd_asihpi_level_add(asihpi, &hpi_ctl);
2676                         break;
2677                 case HPI_CONTROL_MULTIPLEXER:
2678                         err = snd_asihpi_mux_add(asihpi, &hpi_ctl);
2679                         break;
2680                 case HPI_CONTROL_CHANNEL_MODE:
2681                         err = snd_asihpi_cmode_add(asihpi, &hpi_ctl);
2682                         break;
2683                 case HPI_CONTROL_METER:
2684                         err = snd_asihpi_meter_add(asihpi, &hpi_ctl, subindex);
2685                         break;
2686                 case HPI_CONTROL_SAMPLECLOCK:
2687                         err = snd_asihpi_sampleclock_add(
2688                                                 asihpi, &hpi_ctl);
2689                         break;
2690                 case HPI_CONTROL_CONNECTION:    /* ignore these */
2691                         continue;
2692                 case HPI_CONTROL_TUNER:
2693                         err = snd_asihpi_tuner_add(asihpi, &hpi_ctl);
2694                         break;
2695                 case HPI_CONTROL_AESEBU_TRANSMITTER:
2696                         err = snd_asihpi_aesebu_tx_add(asihpi, &hpi_ctl);
2697                         break;
2698                 case HPI_CONTROL_AESEBU_RECEIVER:
2699                         err = snd_asihpi_aesebu_rx_add(asihpi, &hpi_ctl);
2700                         break;
2701                 case HPI_CONTROL_VOX:
2702                 case HPI_CONTROL_BITSTREAM:
2703                 case HPI_CONTROL_MICROPHONE:
2704                 case HPI_CONTROL_PARAMETRIC_EQ:
2705                 case HPI_CONTROL_COMPANDER:
2706                 default:
2707                         if (mixer_dump)
2708                                 dev_info(&asihpi->pci->dev,
2709                                         "Untranslated HPI Control (%d) %d %d %d %d %d\n",
2710                                         idx,
2711                                         hpi_ctl.control_type,
2712                                         hpi_ctl.src_node_type,
2713                                         hpi_ctl.src_node_index,
2714                                         hpi_ctl.dst_node_type,
2715                                         hpi_ctl.dst_node_index);
2716                         continue;
2717                 }
2718                 if (err < 0)
2719                         return err;
2720         }
2721         if (HPI_ERROR_INVALID_OBJ_INDEX != err)
2722                 hpi_handle_error(err);
2723 
2724         dev_info(&asihpi->pci->dev, "%d mixer controls found\n", idx);
2725 
2726         return 0;
2727 }
2728 
2729 /*------------------------------------------------------------
2730    /proc interface
2731  ------------------------------------------------------------*/
2732 
2733 static void
2734 snd_asihpi_proc_read(struct snd_info_entry *entry,
2735                         struct snd_info_buffer *buffer)
2736 {
2737         struct snd_card_asihpi *asihpi = entry->private_data;
2738         u32 h_control;
2739         u32 rate = 0;
2740         u16 source = 0;
2741 
2742         u16 num_outstreams;
2743         u16 num_instreams;
2744         u16 version;
2745         u32 serial_number;
2746         u16 type;
2747 
2748         int err;
2749 
2750         snd_iprintf(buffer, "ASIHPI driver proc file\n");
2751 
2752         hpi_handle_error(hpi_adapter_get_info(asihpi->hpi->adapter->index,
2753                         &num_outstreams, &num_instreams,
2754                         &version, &serial_number, &type));
2755 
2756         snd_iprintf(buffer,
2757                         "Adapter type ASI%4X\nHardware Index %d\n"
2758                         "%d outstreams\n%d instreams\n",
2759                         type, asihpi->hpi->adapter->index,
2760                         num_outstreams, num_instreams);
2761 
2762         snd_iprintf(buffer,
2763                 "Serial#%d\nHardware version %c%d\nDSP code version %03d\n",
2764                 serial_number, ((version >> 3) & 0xf) + 'A', version & 0x7,
2765                 ((version >> 13) * 100) + ((version >> 7) & 0x3f));
2766 
2767         err = hpi_mixer_get_control(asihpi->h_mixer,
2768                                   HPI_SOURCENODE_CLOCK_SOURCE, 0, 0, 0,
2769                                   HPI_CONTROL_SAMPLECLOCK, &h_control);
2770 
2771         if (!err) {
2772                 err = hpi_sample_clock_get_sample_rate(h_control, &rate);
2773                 err += hpi_sample_clock_get_source(h_control, &source);
2774 
2775                 if (!err)
2776                         snd_iprintf(buffer, "Sample Clock %dHz, source %s\n",
2777                         rate, sampleclock_sources[source]);
2778         }
2779 }
2780 
2781 static void snd_asihpi_proc_init(struct snd_card_asihpi *asihpi)
2782 {
2783         struct snd_info_entry *entry;
2784 
2785         if (!snd_card_proc_new(asihpi->card, "info", &entry))
2786                 snd_info_set_text_ops(entry, asihpi, snd_asihpi_proc_read);
2787 }
2788 
2789 /*------------------------------------------------------------
2790    HWDEP
2791  ------------------------------------------------------------*/
2792 
2793 static int snd_asihpi_hpi_open(struct snd_hwdep *hw, struct file *file)
2794 {
2795         if (enable_hpi_hwdep)
2796                 return 0;
2797         else
2798                 return -ENODEV;
2799 
2800 }
2801 
2802 static int snd_asihpi_hpi_release(struct snd_hwdep *hw, struct file *file)
2803 {
2804         if (enable_hpi_hwdep)
2805                 return asihpi_hpi_release(file);
2806         else
2807                 return -ENODEV;
2808 }
2809 
2810 static int snd_asihpi_hpi_ioctl(struct snd_hwdep *hw, struct file *file,
2811                                 unsigned int cmd, unsigned long arg)
2812 {
2813         if (enable_hpi_hwdep)
2814                 return asihpi_hpi_ioctl(file, cmd, arg);
2815         else
2816                 return -ENODEV;
2817 }
2818 
2819 
2820 /* results in /dev/snd/hwC#D0 file for each card with index #
2821    also /proc/asound/hwdep will contain '#-00: asihpi (HPI) for each card'
2822 */
2823 static int snd_asihpi_hpi_new(struct snd_card_asihpi *asihpi, int device)
2824 {
2825         struct snd_hwdep *hw;
2826         int err;
2827 
2828         err = snd_hwdep_new(asihpi->card, "HPI", device, &hw);
2829         if (err < 0)
2830                 return err;
2831         strcpy(hw->name, "asihpi (HPI)");
2832         hw->iface = SNDRV_HWDEP_IFACE_LAST;
2833         hw->ops.open = snd_asihpi_hpi_open;
2834         hw->ops.ioctl = snd_asihpi_hpi_ioctl;
2835         hw->ops.release = snd_asihpi_hpi_release;
2836         hw->private_data = asihpi;
2837         return 0;
2838 }
2839 
2840 /*------------------------------------------------------------
2841    CARD
2842  ------------------------------------------------------------*/
2843 static int snd_asihpi_probe(struct pci_dev *pci_dev,
2844                             const struct pci_device_id *pci_id)
2845 {
2846         int err;
2847         struct hpi_adapter *hpi;
2848         struct snd_card *card;
2849         struct snd_card_asihpi *asihpi;
2850 
2851         u32 h_control;
2852         u32 h_stream;
2853         u32 adapter_index;
2854 
2855         static int dev;
2856         if (dev >= SNDRV_CARDS)
2857                 return -ENODEV;
2858 
2859         /* Should this be enable[hpi->index] ? */
2860         if (!enable[dev]) {
2861                 dev++;
2862                 return -ENOENT;
2863         }
2864 
2865         /* Initialise low-level HPI driver */
2866         err = asihpi_adapter_probe(pci_dev, pci_id);
2867         if (err < 0)
2868                 return err;
2869 
2870         hpi = pci_get_drvdata(pci_dev);
2871         adapter_index = hpi->adapter->index;
2872         /* first try to give the card the same index as its hardware index */
2873         err = snd_card_new(&pci_dev->dev, adapter_index, id[adapter_index],
2874                            THIS_MODULE, sizeof(struct snd_card_asihpi), &card);
2875         if (err < 0) {
2876                 /* if that fails, try the default index==next available */
2877                 err = snd_card_new(&pci_dev->dev, index[dev], id[dev],
2878                                    THIS_MODULE, sizeof(struct snd_card_asihpi),
2879                                    &card);
2880                 if (err < 0)
2881                         return err;
2882                 dev_warn(&pci_dev->dev, "Adapter index %d->ALSA index %d\n",
2883                         adapter_index, card->number);
2884         }
2885 
2886         asihpi = card->private_data;
2887         asihpi->card = card;
2888         asihpi->pci = pci_dev;
2889         asihpi->hpi = hpi;
2890         hpi->snd_card = card;
2891 
2892         err = hpi_adapter_get_property(adapter_index,
2893                 HPI_ADAPTER_PROPERTY_CAPS1,
2894                 NULL, &asihpi->support_grouping);
2895         if (err)
2896                 asihpi->support_grouping = 0;
2897 
2898         err = hpi_adapter_get_property(adapter_index,
2899                 HPI_ADAPTER_PROPERTY_CAPS2,
2900                 &asihpi->support_mrx, NULL);
2901         if (err)
2902                 asihpi->support_mrx = 0;
2903 
2904         err = hpi_adapter_get_property(adapter_index,
2905                 HPI_ADAPTER_PROPERTY_INTERVAL,
2906                 NULL, &asihpi->update_interval_frames);
2907         if (err)
2908                 asihpi->update_interval_frames = 512;
2909 
2910         if (hpi->interrupt_mode) {
2911                 asihpi->pcm_start = snd_card_asihpi_pcm_int_start;
2912                 asihpi->pcm_stop = snd_card_asihpi_pcm_int_stop;
2913                 tasklet_init(&asihpi->t, snd_card_asihpi_int_task,
2914                         (unsigned long)hpi);
2915                 hpi->interrupt_callback = snd_card_asihpi_isr;
2916         } else {
2917                 asihpi->pcm_start = snd_card_asihpi_pcm_timer_start;
2918                 asihpi->pcm_stop = snd_card_asihpi_pcm_timer_stop;
2919         }
2920 
2921         hpi_handle_error(hpi_instream_open(adapter_index,
2922                              0, &h_stream));
2923 
2924         err = hpi_instream_host_buffer_free(h_stream);
2925         asihpi->can_dma = (!err);
2926 
2927         hpi_handle_error(hpi_instream_close(h_stream));
2928 
2929         if (!asihpi->can_dma)
2930                 asihpi->update_interval_frames *= 2;
2931 
2932         err = hpi_adapter_get_property(adapter_index,
2933                 HPI_ADAPTER_PROPERTY_CURCHANNELS,
2934                 &asihpi->in_max_chans, &asihpi->out_max_chans);
2935         if (err) {
2936                 asihpi->in_max_chans = 2;
2937                 asihpi->out_max_chans = 2;
2938         }
2939 
2940         if (asihpi->out_max_chans > 2) { /* assume LL mode */
2941                 asihpi->out_min_chans = asihpi->out_max_chans;
2942                 asihpi->in_min_chans = asihpi->in_max_chans;
2943                 asihpi->support_grouping = 0;
2944         } else {
2945                 asihpi->out_min_chans = 1;
2946                 asihpi->in_min_chans = 1;
2947         }
2948 
2949         dev_info(&pci_dev->dev, "Has dma:%d, grouping:%d, mrx:%d, uif:%d\n",
2950                         asihpi->can_dma,
2951                         asihpi->support_grouping,
2952                         asihpi->support_mrx,
2953                         asihpi->update_interval_frames
2954               );
2955 
2956         err = snd_card_asihpi_pcm_new(asihpi, 0);
2957         if (err < 0) {
2958                 dev_err(&pci_dev->dev, "pcm_new failed\n");
2959                 goto __nodev;
2960         }
2961         err = snd_card_asihpi_mixer_new(asihpi);
2962         if (err < 0) {
2963                 dev_err(&pci_dev->dev, "mixer_new failed\n");
2964                 goto __nodev;
2965         }
2966 
2967         err = hpi_mixer_get_control(asihpi->h_mixer,
2968                                   HPI_SOURCENODE_CLOCK_SOURCE, 0, 0, 0,
2969                                   HPI_CONTROL_SAMPLECLOCK, &h_control);
2970 
2971         if (!err)
2972                 err = hpi_sample_clock_set_local_rate(
2973                         h_control, adapter_fs);
2974 
2975         snd_asihpi_proc_init(asihpi);
2976 
2977         /* always create, can be enabled or disabled dynamically
2978             by enable_hwdep  module param*/
2979         snd_asihpi_hpi_new(asihpi, 0);
2980 
2981         strcpy(card->driver, "ASIHPI");
2982 
2983         sprintf(card->shortname, "AudioScience ASI%4X",
2984                         asihpi->hpi->adapter->type);
2985         sprintf(card->longname, "%s %i",
2986                         card->shortname, adapter_index);
2987         err = snd_card_register(card);
2988 
2989         if (!err) {
2990                 dev++;
2991                 return 0;
2992         }
2993 __nodev:
2994         snd_card_free(card);
2995         dev_err(&pci_dev->dev, "snd_asihpi_probe error %d\n", err);
2996         return err;
2997 
2998 }
2999 
3000 static void snd_asihpi_remove(struct pci_dev *pci_dev)
3001 {
3002         struct hpi_adapter *hpi = pci_get_drvdata(pci_dev);
3003         struct snd_card_asihpi *asihpi = hpi->snd_card->private_data;
3004 
3005         /* Stop interrupts */
3006         if (hpi->interrupt_mode) {
3007                 hpi->interrupt_callback = NULL;
3008                 hpi_handle_error(hpi_adapter_set_property(hpi->adapter->index,
3009                         HPI_ADAPTER_PROPERTY_IRQ_RATE, 0, 0));
3010                 tasklet_kill(&asihpi->t);
3011         }
3012 
3013         snd_card_free(hpi->snd_card);
3014         hpi->snd_card = NULL;
3015         asihpi_adapter_remove(pci_dev);
3016 }
3017 
3018 static const struct pci_device_id asihpi_pci_tbl[] = {
3019         {HPI_PCI_VENDOR_ID_TI, HPI_PCI_DEV_ID_DSP6205,
3020                 HPI_PCI_VENDOR_ID_AUDIOSCIENCE, PCI_ANY_ID, 0, 0,
3021                 (kernel_ulong_t)HPI_6205},
3022         {HPI_PCI_VENDOR_ID_TI, HPI_PCI_DEV_ID_PCI2040,
3023                 HPI_PCI_VENDOR_ID_AUDIOSCIENCE, PCI_ANY_ID, 0, 0,
3024                 (kernel_ulong_t)HPI_6000},
3025         {0,}
3026 };
3027 MODULE_DEVICE_TABLE(pci, asihpi_pci_tbl);
3028 
3029 static struct pci_driver driver = {
3030         .name = KBUILD_MODNAME,
3031         .id_table = asihpi_pci_tbl,
3032         .probe = snd_asihpi_probe,
3033         .remove = snd_asihpi_remove,
3034 };
3035 
3036 static int __init snd_asihpi_init(void)
3037 {
3038         asihpi_init();
3039         return pci_register_driver(&driver);
3040 }
3041 
3042 static void __exit snd_asihpi_exit(void)
3043 {
3044 
3045         pci_unregister_driver(&driver);
3046         asihpi_exit();
3047 }
3048 
3049 module_init(snd_asihpi_init)
3050 module_exit(snd_asihpi_exit)
3051 
3052 

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

kernel.org | git.kernel.org | LWN.net | Project Home | Wiki (Japanese) | Wiki (English) | 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.

osdn.jp