18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * Load Analog Devices SigmaStudio firmware files
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci * Copyright 2009-2011 Analog Devices Inc.
68c2ecf20Sopenharmony_ci */
78c2ecf20Sopenharmony_ci
88c2ecf20Sopenharmony_ci#include <linux/regmap.h>
98c2ecf20Sopenharmony_ci#include <linux/export.h>
108c2ecf20Sopenharmony_ci#include <linux/module.h>
118c2ecf20Sopenharmony_ci
128c2ecf20Sopenharmony_ci#include "sigmadsp.h"
138c2ecf20Sopenharmony_ci
148c2ecf20Sopenharmony_cistatic int sigmadsp_write_regmap(void *control_data,
158c2ecf20Sopenharmony_ci	unsigned int addr, const uint8_t data[], size_t len)
168c2ecf20Sopenharmony_ci{
178c2ecf20Sopenharmony_ci	return regmap_raw_write(control_data, addr,
188c2ecf20Sopenharmony_ci		data, len);
198c2ecf20Sopenharmony_ci}
208c2ecf20Sopenharmony_ci
218c2ecf20Sopenharmony_cistatic int sigmadsp_read_regmap(void *control_data,
228c2ecf20Sopenharmony_ci	unsigned int addr, uint8_t data[], size_t len)
238c2ecf20Sopenharmony_ci{
248c2ecf20Sopenharmony_ci	return regmap_raw_read(control_data, addr,
258c2ecf20Sopenharmony_ci		data, len);
268c2ecf20Sopenharmony_ci}
278c2ecf20Sopenharmony_ci
288c2ecf20Sopenharmony_ci/**
298c2ecf20Sopenharmony_ci * devm_sigmadsp_init_i2c() - Initialize SigmaDSP instance
308c2ecf20Sopenharmony_ci * @dev: The parent device
318c2ecf20Sopenharmony_ci * @regmap: Regmap instance to use
328c2ecf20Sopenharmony_ci * @ops: The sigmadsp_ops to use for this instance
338c2ecf20Sopenharmony_ci * @firmware_name: Name of the firmware file to load
348c2ecf20Sopenharmony_ci *
358c2ecf20Sopenharmony_ci * Allocates a SigmaDSP instance and loads the specified firmware file.
368c2ecf20Sopenharmony_ci *
378c2ecf20Sopenharmony_ci * Returns a pointer to a struct sigmadsp on success, or a PTR_ERR() on error.
388c2ecf20Sopenharmony_ci */
398c2ecf20Sopenharmony_cistruct sigmadsp *devm_sigmadsp_init_regmap(struct device *dev,
408c2ecf20Sopenharmony_ci	struct regmap *regmap, const struct sigmadsp_ops *ops,
418c2ecf20Sopenharmony_ci	const char *firmware_name)
428c2ecf20Sopenharmony_ci{
438c2ecf20Sopenharmony_ci	struct sigmadsp *sigmadsp;
448c2ecf20Sopenharmony_ci
458c2ecf20Sopenharmony_ci	sigmadsp = devm_sigmadsp_init(dev, ops, firmware_name);
468c2ecf20Sopenharmony_ci	if (IS_ERR(sigmadsp))
478c2ecf20Sopenharmony_ci		return sigmadsp;
488c2ecf20Sopenharmony_ci
498c2ecf20Sopenharmony_ci	sigmadsp->control_data = regmap;
508c2ecf20Sopenharmony_ci	sigmadsp->write = sigmadsp_write_regmap;
518c2ecf20Sopenharmony_ci	sigmadsp->read = sigmadsp_read_regmap;
528c2ecf20Sopenharmony_ci
538c2ecf20Sopenharmony_ci	return sigmadsp;
548c2ecf20Sopenharmony_ci}
558c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(devm_sigmadsp_init_regmap);
568c2ecf20Sopenharmony_ci
578c2ecf20Sopenharmony_ciMODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>");
588c2ecf20Sopenharmony_ciMODULE_DESCRIPTION("SigmaDSP regmap firmware loader");
598c2ecf20Sopenharmony_ciMODULE_LICENSE("GPL");
60