Lines Matching refs:sigmadsp
19 #include "sigmadsp.h"
95 static int sigmadsp_write(struct sigmadsp *sigmadsp, unsigned int addr,
98 return sigmadsp->write(sigmadsp->control_data, addr, data, len);
101 static int sigmadsp_read(struct sigmadsp *sigmadsp, unsigned int addr,
104 return sigmadsp->read(sigmadsp->control_data, addr, data, len);
118 static int sigmadsp_ctrl_write(struct sigmadsp *sigmadsp,
122 if (ctrl->num_bytes <= 20 && sigmadsp->ops && sigmadsp->ops->safeload)
123 return sigmadsp->ops->safeload(sigmadsp, ctrl->addr, data,
126 return sigmadsp_write(sigmadsp, ctrl->addr, data,
134 struct sigmadsp *sigmadsp = snd_kcontrol_chip(kcontrol);
138 mutex_lock(&sigmadsp->lock);
143 ret = sigmadsp_ctrl_write(sigmadsp, ctrl, data);
151 mutex_unlock(&sigmadsp->lock);
160 struct sigmadsp *sigmadsp = snd_kcontrol_chip(kcontrol);
163 mutex_lock(&sigmadsp->lock);
166 ret = sigmadsp_read(sigmadsp, ctrl->addr, ctrl->cache,
177 mutex_unlock(&sigmadsp->lock);
202 static int sigma_fw_load_control(struct sigmadsp *sigmadsp,
250 list_add_tail(&ctrl->head, &sigmadsp->ctrl_list);
260 static int sigma_fw_load_data(struct sigmadsp *sigmadsp,
281 list_add_tail(&data->head, &sigmadsp->data_list);
286 static int sigma_fw_load_samplerates(struct sigmadsp *sigmadsp,
302 if (sigmadsp->rate_constraints.count)
312 sigmadsp->rate_constraints.count = num_rates;
313 sigmadsp->rate_constraints.list = rates;
318 static int sigmadsp_fw_load_v2(struct sigmadsp *sigmadsp,
344 ret = sigma_fw_load_data(sigmadsp, chunk, length);
347 ret = sigma_fw_load_control(sigmadsp, chunk, length);
350 ret = sigma_fw_load_samplerates(sigmadsp, chunk, length);
353 dev_warn(sigmadsp->dev, "Unknown chunk type: %d\n",
400 static int process_sigma_action(struct sigmadsp *sigmadsp,
423 list_add_tail(&data->head, &sigmadsp->data_list);
434 static int sigmadsp_fw_load_v1(struct sigmadsp *sigmadsp,
451 ret = process_sigma_action(sigmadsp, sa);
465 static void sigmadsp_firmware_release(struct sigmadsp *sigmadsp)
470 list_for_each_entry_safe(ctrl, _ctrl, &sigmadsp->ctrl_list, head) {
475 list_for_each_entry_safe(data, _data, &sigmadsp->data_list, head)
478 INIT_LIST_HEAD(&sigmadsp->ctrl_list);
479 INIT_LIST_HEAD(&sigmadsp->data_list);
484 sigmadsp_firmware_release((struct sigmadsp *)res);
487 static int sigmadsp_firmware_load(struct sigmadsp *sigmadsp, const char *name)
495 ret = request_firmware(&fw, name, sigmadsp->dev);
511 dev_err(sigmadsp->dev, "Failed to load firmware: Invalid size\n");
517 dev_err(sigmadsp->dev, "Failed to load firmware: Invalid magic\n");
525 dev_err(sigmadsp->dev, "Failed to load firmware: Wrong crc checksum: expected %x got %x\n",
532 ret = sigmadsp_fw_load_v1(sigmadsp, fw);
535 ret = sigmadsp_fw_load_v2(sigmadsp, fw);
538 dev_err(sigmadsp->dev,
546 sigmadsp_firmware_release(sigmadsp);
554 static int sigmadsp_init(struct sigmadsp *sigmadsp, struct device *dev,
557 sigmadsp->ops = ops;
558 sigmadsp->dev = dev;
560 INIT_LIST_HEAD(&sigmadsp->ctrl_list);
561 INIT_LIST_HEAD(&sigmadsp->data_list);
562 mutex_init(&sigmadsp->lock);
564 return sigmadsp_firmware_load(sigmadsp, firmware_name);
575 * Returns a pointer to a struct sigmadsp on success, or a PTR_ERR() on error.
577 struct sigmadsp *devm_sigmadsp_init(struct device *dev,
580 struct sigmadsp *sigmadsp;
583 sigmadsp = devres_alloc(devm_sigmadsp_release, sizeof(*sigmadsp),
585 if (!sigmadsp)
588 ret = sigmadsp_init(sigmadsp, dev, ops, firmware_name);
590 devres_free(sigmadsp);
594 devres_add(dev, sigmadsp);
596 return sigmadsp;
600 static int sigmadsp_rate_to_index(struct sigmadsp *sigmadsp, unsigned int rate)
604 for (i = 0; i < sigmadsp->rate_constraints.count; i++) {
605 if (sigmadsp->rate_constraints.list[i] == rate)
612 static unsigned int sigmadsp_get_samplerate_mask(struct sigmadsp *sigmadsp,
620 if (sigmadsp->rate_constraints.count) {
621 samplerate_index = sigmadsp_rate_to_index(sigmadsp, samplerate);
641 static int sigmadsp_alloc_control(struct sigmadsp *sigmadsp,
658 kcontrol = snd_ctl_new1(&template, sigmadsp);
665 return snd_ctl_add(sigmadsp->component->card->snd_card, kcontrol);
668 static void sigmadsp_activate_ctrl(struct sigmadsp *sigmadsp,
671 struct snd_card *card = sigmadsp->component->card->snd_card;
680 mutex_lock(&sigmadsp->lock);
682 sigmadsp_ctrl_write(sigmadsp, ctrl, ctrl->cache);
683 mutex_unlock(&sigmadsp->lock);
688 * sigmadsp_attach() - Attach a sigmadsp instance to a ASoC component
689 * @sigmadsp: The sigmadsp instance to attach
698 int sigmadsp_attach(struct sigmadsp *sigmadsp,
705 sigmadsp->component = component;
707 samplerate_mask = sigmadsp_get_samplerate_mask(sigmadsp,
708 sigmadsp->current_samplerate);
710 list_for_each_entry(ctrl, &sigmadsp->ctrl_list, head) {
711 ret = sigmadsp_alloc_control(sigmadsp, ctrl, samplerate_mask);
722 * @sigmadsp: The sigmadsp instance to configure
731 int sigmadsp_setup(struct sigmadsp *sigmadsp, unsigned int samplerate)
738 if (sigmadsp->current_samplerate == samplerate)
741 samplerate_mask = sigmadsp_get_samplerate_mask(sigmadsp, samplerate);
745 list_for_each_entry(data, &sigmadsp->data_list, head) {
749 ret = sigmadsp_write(sigmadsp, data->addr, data->data,
755 list_for_each_entry(ctrl, &sigmadsp->ctrl_list, head)
756 sigmadsp_activate_ctrl(sigmadsp, ctrl, samplerate_mask);
758 sigmadsp->current_samplerate = samplerate;
762 sigmadsp_reset(sigmadsp);
769 * sigmadsp_reset() - Notify the sigmadsp instance that the DSP has been reset
770 * @sigmadsp: The sigmadsp instance to reset
775 void sigmadsp_reset(struct sigmadsp *sigmadsp)
779 list_for_each_entry(ctrl, &sigmadsp->ctrl_list, head)
780 sigmadsp_activate_ctrl(sigmadsp, ctrl, false);
782 sigmadsp->current_samplerate = 0;
788 * @sigmadsp: The sigmadsp instance
796 int sigmadsp_restrict_params(struct sigmadsp *sigmadsp,
799 if (sigmadsp->rate_constraints.count == 0)
803 SNDRV_PCM_HW_PARAM_RATE, &sigmadsp->rate_constraints);