mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-01-11 17:10:13 +00:00
ASoC: SDCA: Pass SoundWire slave to HID
The SDCA HID code can't assume that the struct device it is passed is the SoundWire slave device. HID is represented by a Function in SDCA and will thus likely be implemented by a child driver. Update the code to explicitly pass in the SoundWire slave device. Reviewed-by: Bard Liao <yung-chuan.liao@linux.intel.com> Signed-off-by: Charles Keepax <ckeepax@opensource.cirrus.com> Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.dev> Link: https://patch.msgid.link/20251020155512.353774-5-ckeepax@opensource.cirrus.com Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
907364ea3d
commit
7159816707
@ -1332,7 +1332,7 @@ static inline u32 sdca_range_search(struct sdca_control_range *range,
|
||||
return 0;
|
||||
}
|
||||
|
||||
int sdca_parse_function(struct device *dev,
|
||||
int sdca_parse_function(struct device *dev, struct sdw_slave *sdw,
|
||||
struct sdca_function_desc *desc,
|
||||
struct sdca_function_data *function);
|
||||
|
||||
|
||||
@ -12,10 +12,14 @@
|
||||
#include <linux/hid.h>
|
||||
|
||||
#if IS_ENABLED(CONFIG_SND_SOC_SDCA_HID)
|
||||
int sdca_add_hid_device(struct device *dev, struct sdca_entity *entity);
|
||||
|
||||
int sdca_add_hid_device(struct device *dev, struct sdw_slave *sdw,
|
||||
struct sdca_entity *entity);
|
||||
|
||||
#else
|
||||
static inline int sdca_add_hid_device(struct device *dev, struct sdca_entity *entity)
|
||||
|
||||
static inline int sdca_add_hid_device(struct device *dev, struct sdw_slave *sdw,
|
||||
struct sdca_entity *entity)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -1253,7 +1253,8 @@ bad_list:
|
||||
}
|
||||
|
||||
static int
|
||||
find_sdca_entity_hide(struct device *dev, struct fwnode_handle *function_node,
|
||||
find_sdca_entity_hide(struct device *dev, struct sdw_slave *sdw,
|
||||
struct fwnode_handle *function_node,
|
||||
struct fwnode_handle *entity_node, struct sdca_entity *entity)
|
||||
{
|
||||
struct sdca_entity_hide *hide = &entity->hide;
|
||||
@ -1328,7 +1329,7 @@ find_sdca_entity_hide(struct device *dev, struct fwnode_handle *function_node,
|
||||
report_desc, nval);
|
||||
|
||||
/* add HID device */
|
||||
ret = sdca_add_hid_device(dev, entity);
|
||||
ret = sdca_add_hid_device(dev, sdw, entity);
|
||||
if (ret) {
|
||||
dev_err(dev, "%pfwP: failed to add HID device: %d\n", entity_node, ret);
|
||||
return ret;
|
||||
@ -1339,7 +1340,7 @@ find_sdca_entity_hide(struct device *dev, struct fwnode_handle *function_node,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int find_sdca_entity(struct device *dev,
|
||||
static int find_sdca_entity(struct device *dev, struct sdw_slave *sdw,
|
||||
struct fwnode_handle *function_node,
|
||||
struct fwnode_handle *entity_node,
|
||||
struct sdca_entity *entity)
|
||||
@ -1381,7 +1382,8 @@ static int find_sdca_entity(struct device *dev,
|
||||
ret = find_sdca_entity_ge(dev, entity_node, entity);
|
||||
break;
|
||||
case SDCA_ENTITY_TYPE_HIDE:
|
||||
ret = find_sdca_entity_hide(dev, function_node, entity_node, entity);
|
||||
ret = find_sdca_entity_hide(dev, sdw, function_node,
|
||||
entity_node, entity);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@ -1396,7 +1398,7 @@ static int find_sdca_entity(struct device *dev,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int find_sdca_entities(struct device *dev,
|
||||
static int find_sdca_entities(struct device *dev, struct sdw_slave *sdw,
|
||||
struct fwnode_handle *function_node,
|
||||
struct sdca_function_data *function)
|
||||
{
|
||||
@ -1448,7 +1450,8 @@ static int find_sdca_entities(struct device *dev,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
ret = find_sdca_entity(dev, function_node, entity_node, &entities[i]);
|
||||
ret = find_sdca_entity(dev, sdw, function_node,
|
||||
entity_node, &entities[i]);
|
||||
fwnode_handle_put(entity_node);
|
||||
if (ret)
|
||||
return ret;
|
||||
@ -1927,12 +1930,13 @@ static int find_sdca_clusters(struct device *dev,
|
||||
/**
|
||||
* 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,
|
||||
int sdca_parse_function(struct device *dev, struct sdw_slave *sdw,
|
||||
struct sdca_function_desc *function_desc,
|
||||
struct sdca_function_data *function)
|
||||
{
|
||||
@ -1953,7 +1957,7 @@ int sdca_parse_function(struct device *dev,
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = find_sdca_entities(dev, function_desc->node, function);
|
||||
ret = find_sdca_entities(dev, sdw, function_desc->node, function);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
|
||||
@ -82,15 +82,13 @@ static const struct hid_ll_driver sdw_hid_driver = {
|
||||
.raw_request = sdwhid_raw_request,
|
||||
};
|
||||
|
||||
int sdca_add_hid_device(struct device *dev, struct sdca_entity *entity)
|
||||
int sdca_add_hid_device(struct device *dev, struct sdw_slave *sdw,
|
||||
struct sdca_entity *entity)
|
||||
{
|
||||
struct sdw_bus *bus;
|
||||
struct sdw_bus *bus = sdw->bus;
|
||||
struct hid_device *hid;
|
||||
struct sdw_slave *slave = dev_to_sdw_dev(dev);
|
||||
int ret;
|
||||
|
||||
bus = slave->bus;
|
||||
|
||||
hid = hid_allocate_device();
|
||||
if (IS_ERR(hid))
|
||||
return PTR_ERR(hid);
|
||||
@ -103,8 +101,8 @@ int sdca_add_hid_device(struct device *dev, struct sdca_entity *entity)
|
||||
|
||||
snprintf(hid->name, sizeof(hid->name),
|
||||
"HID sdw:%01x:%01x:%04x:%04x:%02x",
|
||||
bus->controller_id, bus->link_id, slave->id.mfg_id,
|
||||
slave->id.part_id, slave->id.class_id);
|
||||
bus->controller_id, bus->link_id, sdw->id.mfg_id,
|
||||
sdw->id.part_id, sdw->id.class_id);
|
||||
|
||||
snprintf(hid->phys, sizeof(hid->phys), "%s", dev->bus->name);
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user