* \return Zero if success, otherwise a negative error code
*
* Known identifiers:
+ * - _fboot - execute the fixed boot sequence (value = NULL)
* - _boot - execute the boot sequence (value = NULL)
+ * - only when driver controls identifiers are changed
+ * (otherwise the old control values are restored)
* - _defaults - execute the 'defaults' sequence (value = NULL)
* - _verb - set current verb = value
* - _enadev - enable given device = value
}
if (!list_empty(&uc_mgr->verb_list))
return 0;
+ if (!list_empty(&uc_mgr->fixedboot_list))
+ return 0;
if (!list_empty(&uc_mgr->boot_list))
return 0;
return -ENXIO;
if (mgr == NULL)
return -ENOMEM;
INIT_LIST_HEAD(&mgr->verb_list);
+ INIT_LIST_HEAD(&mgr->fixedboot_list);
INIT_LIST_HEAD(&mgr->boot_list);
INIT_LIST_HEAD(&mgr->default_list);
INIT_LIST_HEAD(&mgr->value_list);
return err;
}
+static int set_fixedboot_user(snd_use_case_mgr_t *uc_mgr,
+ const char *value)
+{
+ int err;
+
+ if (value != NULL && *value) {
+ uc_error("error: wrong value for _fboot (%s)", value);
+ return -EINVAL;
+ }
+ err = execute_sequence(uc_mgr, &uc_mgr->fixedboot_list,
+ &uc_mgr->value_list, NULL, NULL);
+ if (err < 0) {
+ uc_error("Unable to execute force boot sequence");
+ return err;
+ }
+ return err;
+}
+
static int set_boot_user(snd_use_case_mgr_t *uc_mgr,
const char *value)
{
int err = 0;
pthread_mutex_lock(&uc_mgr->mutex);
- if (strcmp(identifier, "_boot") == 0)
+ if (strcmp(identifier, "_fboot") == 0)
+ err = set_fixedboot_user(uc_mgr, value);
+ else if (strcmp(identifier, "_boot") == 0)
err = set_boot_user(uc_mgr, value);
else if (strcmp(identifier, "_defaults") == 0)
err = set_defaults_user(uc_mgr, value);
}
/*
+ * parse controls which should be run only at initial boot (forcefully)
+ */
+static int parse_controls_fixedboot(snd_use_case_mgr_t *uc_mgr, snd_config_t *cfg)
+{
+ int err;
+
+ if (!list_empty(&uc_mgr->fixedboot_list)) {
+ uc_error("FixedBoot list is not empty");
+ return -EINVAL;
+ }
+ err = parse_sequence(uc_mgr, &uc_mgr->fixedboot_list, cfg);
+ if (err < 0) {
+ uc_error("Unable to parse FixedBootSequence");
+ return err;
+ }
+
+ return 0;
+}
+
+/*
* parse controls which should be run only at initial boot
*/
static int parse_controls_boot(snd_use_case_mgr_t *uc_mgr, snd_config_t *cfg)
continue;
}
+ /* find default control values section (force boot sequence only) */
+ if (strcmp(id, "FixedBootSequence") == 0) {
+ err = parse_controls_fixedboot(uc_mgr, n);
+ if (err < 0)
+ return err;
+ continue;
+ }
+
/* find default control values section (first boot only) */
if (strcmp(id, "BootSequence") == 0) {
err = parse_controls_boot(uc_mgr, n);
/* use case verb, devices and modifier configs parsed from files */
struct list_head verb_list;
+ /* force boot settings - sequence */
+ struct list_head fixedboot_list;
+
/* boot settings - sequence */
struct list_head boot_list;
list_del(&verb->list);
free(verb);
}
+ uc_mgr_free_sequence(&uc_mgr->fixedboot_list);
uc_mgr_free_sequence(&uc_mgr->boot_list);
uc_mgr_free_sequence(&uc_mgr->default_list);
uc_mgr_free_value(&uc_mgr->value_list);