#include <sound/soc-dai.h>
#include <sound/soc.h>
#include "sdca_class.h"
+#include "sdca_function_device.h"
struct class_function_drv {
struct device *dev;
{
struct device *dev = &auxdev->dev;
struct sdca_class_drv *core = dev_get_drvdata(dev->parent);
- struct sdca_device_data *data = &core->sdw->sdca_data;
- struct sdca_function_desc *desc;
+ struct sdca_dev *sdev = auxiliary_dev_to_sdca_dev(auxdev);
struct snd_soc_component_driver *cmp_drv;
struct snd_soc_dai_driver *dais;
struct class_function_drv *drv;
int ndefaults;
int num_dais;
int ret;
- int i;
drv = devm_kzalloc(dev, sizeof(*drv), GFP_KERNEL);
if (!drv)
drv->dev = dev;
drv->core = core;
+ drv->function = &sdev->function;
- for (i = 0; i < data->num_functions; i++) {
- desc = &data->function[i];
-
- if (desc->type == aux_dev_id->driver_data)
- break;
- }
- if (i == core->sdw->sdca_data.num_functions) {
- dev_err(dev, "failed to locate function\n");
- return -EINVAL;
- }
-
- drv->function = &core->functions[i];
-
- ret = sdca_parse_function(dev, core->sdw, desc, drv->function);
+ ret = sdca_parse_function(dev, core->sdw, drv->function);
if (ret)
return ret;
return dev_err_probe(dev, PTR_ERR(drv->regmap),
"failed to create regmap");
- switch (desc->type) {
+ switch (drv->function->desc->type) {
case SDCA_FUNCTION_TYPE_UAJ:
case SDCA_FUNCTION_TYPE_RJ:
cmp_drv->set_jack = class_function_set_jack;
* sdca_parse_function - parse ACPI DisCo for a Function
* @dev: Pointer to device against which function data will be allocated.
* @sdw: SoundWire slave device to be processed.
- * @function_desc: Pointer to the Function short descriptor.
* @function: Pointer to the Function information, to be populated.
*
* Return: Returns 0 for success.
*/
int sdca_parse_function(struct device *dev, struct sdw_slave *sdw,
- struct sdca_function_desc *function_desc,
struct sdca_function_data *function)
{
+ struct fwnode_handle *node = function->desc->node;
u32 tmp;
int ret;
- function->desc = function_desc;
-
- ret = fwnode_property_read_u32(function_desc->node,
- "mipi-sdca-function-busy-max-delay", &tmp);
+ ret = fwnode_property_read_u32(node, "mipi-sdca-function-busy-max-delay", &tmp);
if (!ret)
function->busy_max_delay = tmp;
- ret = fwnode_property_read_u32(function_desc->node,
- "mipi-sdca-function-reset-max-delay", &tmp);
+ ret = fwnode_property_read_u32(node, "mipi-sdca-function-reset-max-delay", &tmp);
if (ret || tmp == 0) {
dev_dbg(dev, "reset delay missing, defaulting to 100mS\n");
function->reset_max_delay = 100000;
}
dev_dbg(dev, "%pfwP: name %s busy delay %dus reset delay %dus\n",
- function->desc->node, function->desc->name,
- function->busy_max_delay, function->reset_max_delay);
+ node, function->desc->name, function->busy_max_delay,
+ function->reset_max_delay);
- ret = find_sdca_init_table(dev, function_desc->node, function);
+ ret = find_sdca_init_table(dev, node, function);
if (ret)
return ret;
- ret = find_sdca_entities(dev, sdw, function_desc->node, function);
+ ret = find_sdca_entities(dev, sdw, node, function);
if (ret)
return ret;
- ret = find_sdca_connections(dev, function_desc->node, function);
+ ret = find_sdca_connections(dev, node, function);
if (ret)
return ret;
- ret = find_sdca_clusters(dev, function_desc->node, function);
+ ret = find_sdca_clusters(dev, node, function);
if (ret < 0)
return ret;
- ret = find_sdca_filesets(dev, sdw, function_desc->node, function);
+ ret = find_sdca_filesets(dev, sdw, node, function);
if (ret)
return ret;