1
0
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:
Charles Keepax 2025-10-20 16:54:57 +01:00 committed by Mark Brown
parent 907364ea3d
commit 7159816707
No known key found for this signature in database
GPG Key ID: 24D68B725D5487D0
4 changed files with 24 additions and 18 deletions

View File

@ -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);

View File

@ -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;
}

View File

@ -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;

View File

@ -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);