18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * Load firmware files from Analog Devices SigmaStudio
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci * Copyright 2009-2011 Analog Devices Inc.
68c2ecf20Sopenharmony_ci */
78c2ecf20Sopenharmony_ci
88c2ecf20Sopenharmony_ci#ifndef __SIGMA_FIRMWARE_H__
98c2ecf20Sopenharmony_ci#define __SIGMA_FIRMWARE_H__
108c2ecf20Sopenharmony_ci
118c2ecf20Sopenharmony_ci#include <linux/device.h>
128c2ecf20Sopenharmony_ci#include <linux/regmap.h>
138c2ecf20Sopenharmony_ci#include <linux/list.h>
148c2ecf20Sopenharmony_ci
158c2ecf20Sopenharmony_ci#include <sound/pcm.h>
168c2ecf20Sopenharmony_ci
178c2ecf20Sopenharmony_cistruct sigmadsp;
188c2ecf20Sopenharmony_cistruct snd_soc_component;
198c2ecf20Sopenharmony_cistruct snd_pcm_substream;
208c2ecf20Sopenharmony_ci
218c2ecf20Sopenharmony_cistruct sigmadsp_ops {
228c2ecf20Sopenharmony_ci	int (*safeload)(struct sigmadsp *sigmadsp, unsigned int addr,
238c2ecf20Sopenharmony_ci			const uint8_t *data, size_t len);
248c2ecf20Sopenharmony_ci};
258c2ecf20Sopenharmony_ci
268c2ecf20Sopenharmony_cistruct sigmadsp {
278c2ecf20Sopenharmony_ci	const struct sigmadsp_ops *ops;
288c2ecf20Sopenharmony_ci
298c2ecf20Sopenharmony_ci	struct list_head ctrl_list;
308c2ecf20Sopenharmony_ci	struct list_head data_list;
318c2ecf20Sopenharmony_ci
328c2ecf20Sopenharmony_ci	struct snd_pcm_hw_constraint_list rate_constraints;
338c2ecf20Sopenharmony_ci
348c2ecf20Sopenharmony_ci	unsigned int current_samplerate;
358c2ecf20Sopenharmony_ci	struct snd_soc_component *component;
368c2ecf20Sopenharmony_ci	struct device *dev;
378c2ecf20Sopenharmony_ci
388c2ecf20Sopenharmony_ci	struct mutex lock;
398c2ecf20Sopenharmony_ci
408c2ecf20Sopenharmony_ci	void *control_data;
418c2ecf20Sopenharmony_ci	int (*write)(void *, unsigned int, const uint8_t *, size_t);
428c2ecf20Sopenharmony_ci	int (*read)(void *, unsigned int, uint8_t *, size_t);
438c2ecf20Sopenharmony_ci};
448c2ecf20Sopenharmony_ci
458c2ecf20Sopenharmony_cistruct sigmadsp *devm_sigmadsp_init(struct device *dev,
468c2ecf20Sopenharmony_ci	const struct sigmadsp_ops *ops, const char *firmware_name);
478c2ecf20Sopenharmony_civoid sigmadsp_reset(struct sigmadsp *sigmadsp);
488c2ecf20Sopenharmony_ci
498c2ecf20Sopenharmony_ciint sigmadsp_restrict_params(struct sigmadsp *sigmadsp,
508c2ecf20Sopenharmony_ci	struct snd_pcm_substream *substream);
518c2ecf20Sopenharmony_ci
528c2ecf20Sopenharmony_cistruct i2c_client;
538c2ecf20Sopenharmony_ci
548c2ecf20Sopenharmony_cistruct sigmadsp *devm_sigmadsp_init_regmap(struct device *dev,
558c2ecf20Sopenharmony_ci	struct regmap *regmap, const struct sigmadsp_ops *ops,
568c2ecf20Sopenharmony_ci	const char *firmware_name);
578c2ecf20Sopenharmony_cistruct sigmadsp *devm_sigmadsp_init_i2c(struct i2c_client *client,
588c2ecf20Sopenharmony_ci	const struct sigmadsp_ops *ops,	const char *firmware_name);
598c2ecf20Sopenharmony_ci
608c2ecf20Sopenharmony_ciint sigmadsp_attach(struct sigmadsp *sigmadsp,
618c2ecf20Sopenharmony_ci	struct snd_soc_component *component);
628c2ecf20Sopenharmony_ciint sigmadsp_setup(struct sigmadsp *sigmadsp, unsigned int rate);
638c2ecf20Sopenharmony_civoid sigmadsp_reset(struct sigmadsp *sigmadsp);
648c2ecf20Sopenharmony_ci
658c2ecf20Sopenharmony_ci#endif
66