struct ctl_data *next;
 };
 
+static const char *alsa_config =
+"ctl.hw {\n"
+"      @args [ CARD ]\n"
+"      @args.CARD.type string\n"
+"      type hw\n"
+"      card $CARD\n"
+"}\n"
+;
+
 int num_cards = 0;
 int num_controls = 0;
 struct card_data *card_list = NULL;
 struct ctl_data *ctl_list = NULL;
 
+#ifdef SND_LIB_VER
+#if SND_LIB_VERSION >= SND_LIB_VER(1, 2, 6)
+#define LIB_HAS_LOAD_STRING
+#endif
+#endif
+
+#ifndef LIB_HAS_LOAD_STRING
+int snd_config_load_string(snd_config_t **config, const char *s, size_t size)
+{
+       snd_input_t *input;
+       snd_config_t *dst;
+       int err;
+
+       assert(config && s);
+       if (size == 0)
+               size = strlen(s);
+       err = snd_input_buffer_open(&input, s, size);
+       if (err < 0)
+               return err;
+       err = snd_config_top(&dst);
+       if (err < 0) {
+               snd_input_close(input);
+               return err;
+       }
+       err = snd_config_load(dst, input);
+       snd_input_close(input);
+       if (err < 0) {
+               snd_config_delete(dst);
+               return err;
+       }
+       *config = dst;
+       return 0;
+}
+#endif
+
 void find_controls(void)
 {
        char name[32];
        int card, ctl, err;
        struct card_data *card_data;
        struct ctl_data *ctl_data;
+       snd_config_t *config;
 
        card = -1;
        if (snd_card_next(&card) < 0 || card < 0)
                return;
 
+       err = snd_config_load_string(&config, alsa_config, strlen(alsa_config));
+       if (err < 0) {
+               ksft_print_msg("Unable to parse custom alsa-lib configuration: %s\n",
+                              snd_strerror(err));
+               ksft_exit_fail();
+       }
+
        while (card >= 0) {
                sprintf(name, "hw:%d", card);
 
                if (!card_data)
                        ksft_exit_fail_msg("Out of memory\n");
 
-               err = snd_ctl_open(&card_data->handle, name, 0);
+               err = snd_ctl_open_lconf(&card_data->handle, name, 0, config);
                if (err < 0) {
                        ksft_print_msg("Failed to get hctl for card %d: %s\n",
                                       card, snd_strerror(err));
                        break;
                }
        }
+
+       snd_config_delete(config);
 }
 
 /*