static void dummy_proc_write(struct snd_info_entry *entry, struct snd_info_buffer *buffer) { char line[64]; while (!snd_info_get_line(buffer, line, sizeof(line))) { char item[20]; const char *ptr; unsigned long long val; int i; ptr = snd_info_get_str(item, line, sizeof(item)); for (i = 0; i < ARRAY_SIZE(fields); i++) { if (!strcmp(item, fields[i].name)) break; } if (i >= ARRAY_SIZE(fields)) continue; snd_info_get_str(item, ptr, sizeof(item)); if (strict_strtoull(item, 0, &val)) continue; if (fields[i].size == sizeof(int)) *get_dummy_int_ptr(fields[i].offset) = val; else *get_dummy_ll_ptr(fields[i].offset) = val; } }
static void hdmi_write_eld_info(struct snd_info_entry *entry, struct snd_info_buffer *buffer) { struct hdmi_eld *e = entry->private_data; char line[64]; char name[64]; char *sname; long long val; int n; while (!snd_info_get_line(buffer, line, sizeof(line))) { if (sscanf(line, "%s %llx", name, &val) != 2) continue; /* * We don't allow modification to these fields: * monitor_name manufacture_id product_id * eld_version edid_version */ if (!strcmp(name, "connection_type")) e->conn_type = val; else if (!strcmp(name, "port_id")) e->port_id = val; else if (!strcmp(name, "support_hdcp")) e->support_hdcp = val; else if (!strcmp(name, "support_ai")) e->support_ai = val; else if (!strcmp(name, "audio_sync_delay")) e->aud_synch_delay = val; else if (!strcmp(name, "speakers")) e->spk_alloc = val; else if (!strcmp(name, "sad_count")) e->sad_count = val; else if (!strncmp(name, "sad", 3)) { sname = name + 4; n = name[3] - '0'; if (name[4] >= '0' && name[4] <= '9') { sname++; n = 10 * n + name[4] - '0'; } if (n < 0 || n > 31) /* double the CEA limit */ continue; if (!strcmp(sname, "_coding_type")) e->sad[n].format = val; else if (!strcmp(sname, "_channels")) e->sad[n].channels = val; else if (!strcmp(sname, "_rates")) e->sad[n].rates = val; else if (!strcmp(sname, "_bits")) e->sad[n].sample_bits = val; else if (!strcmp(sname, "_max_bitrate")) e->sad[n].max_bitrate = val; else if (!strcmp(sname, "_profile")) e->sad[n].profile = val; if (n >= e->sad_count) e->sad_count = n + 1; } } }
/* * WM codec registers */ static void wm_proc_regs_write(snd_info_entry_t *entry, snd_info_buffer_t *buffer) { ice1712_t *ice = (ice1712_t *)entry->private_data; char line[64]; unsigned int reg, val; down(&ice->gpio_mutex); while (!snd_info_get_line(buffer, line, sizeof(line))) { if (sscanf(line, "%x %x", ®, &val) != 2) continue; if (reg <= 0x17 && val <= 0xffff) wm_put(ice, reg, val); } up(&ice->gpio_mutex); }
/* * WM codec registers */ static void wm_proc_regs_write(struct snd_info_entry *entry, struct snd_info_buffer *buffer) { struct snd_ice1712 *ice = entry->private_data; char line[64]; unsigned int reg, val; mutex_lock(&ice->gpio_mutex); while (!snd_info_get_line(buffer, line, sizeof(line))) { if (sscanf(line, "%x %x", ®, &val) != 2) continue; if (reg <= 0x17 && val <= 0xffff) wm_put(ice, reg, val); } mutex_unlock(&ice->gpio_mutex); }
/* * write callback for prealloc proc file * * accepts the preallocation size in kB. */ static void snd_pcm_lib_preallocate_proc_write(struct snd_info_entry *entry, struct snd_info_buffer *buffer) { struct snd_pcm_substream *substream = entry->private_data; char line[64], str[64]; size_t size; struct snd_dma_buffer new_dmab; if (substream->runtime) { buffer->error = -EBUSY; return; } if (!snd_info_get_line(buffer, line, sizeof(line))) { snd_info_get_str(str, line, sizeof(str)); size = simple_strtoul(str, NULL, 10) * 1024; if ((size != 0 && size < 8192) || size > substream->dma_max) { buffer->error = -EINVAL; return; } if (substream->dma_buffer.bytes == size) return; memset(&new_dmab, 0, sizeof(new_dmab)); new_dmab.dev = substream->dma_buffer.dev; if (size > 0) { if (snd_dma_alloc_pages(substream->dma_buffer.dev.type, substream->dma_buffer.dev.dev, size, &new_dmab) < 0) { buffer->error = -ENOMEM; return; } substream->buffer_bytes_max = size; } else { substream->buffer_bytes_max = UINT_MAX; } if (substream->dma_buffer.area) snd_dma_free_pages(&substream->dma_buffer); substream->dma_buffer = new_dmab; } else { buffer->error = -EINVAL; } }