mirror of https://github.com/torvalds/linux.git
spi: cs42l43: Use actual ACPI firmware node for chip selects
On some systems the cs42l43 has amplifiers attached to its SPI controller that are not properly defined in ACPI. Currently software nodes are added to support this case, however, the chip selects for these devices are specified using a hack. A software node is added with the same name as the pinctrl driver, as the look up was name based, this allowed the GPIO look up to return the pinctrl driver even though the swnode was not owned by it. This was necessary as the swnodes did not support directly linking to real firmware nodes. Since commite5d527be7e("gpio: swnode: don't use the swnode's name as the key for GPIO lookup") changed the lookup to be fwnode based this hack will no longer find the pinctrl driver, resulting in the driver not probing. There is no pinctrl driver attached to the swnode itself. But other patches did add support for linking a swnode to a real fwnode node [1]. As such the hack is no longer needed, so switch over to just passing the real fwnode for the pinctrl property to avoid any issues. [Bartosz: - remove unneeded Fixes: tag, - use PROPERTY_ENTRY_REF_ARRAY() instead of PROPERTY_ENTRY_REF_ARRAY_LEN()] Link: https://lore.kernel.org/linux-gpio/20251106-reset-gpios-swnodes-v6-0-69aa852de9e4@linaro.org/ [1] Fixes:439fbc9750("spi: cs42l43: Add bridged cs35l56 amplifiers") Cc: stable+noautosel@kernel.org # Don't backport, previous approach works, fix relies on swnode changes Signed-off-by: Charles Keepax <ckeepax@opensource.cirrus.com> Reviewed-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org> Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org> Acked-by: Mark Brown <broonie@kernel.org> Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
This commit is contained in:
parent
d7cdbbc93c
commit
d2a6cea44a
|
|
@ -52,20 +52,6 @@ static struct spi_board_info amp_info_template = {
|
|||
.mode = SPI_MODE_0,
|
||||
};
|
||||
|
||||
static const struct software_node cs42l43_gpiochip_swnode = {
|
||||
.name = "cs42l43-pinctrl",
|
||||
};
|
||||
|
||||
static const struct software_node_ref_args cs42l43_cs_refs[] = {
|
||||
SOFTWARE_NODE_REFERENCE(&cs42l43_gpiochip_swnode, 0, GPIO_ACTIVE_LOW),
|
||||
SOFTWARE_NODE_REFERENCE(&swnode_gpio_undefined),
|
||||
};
|
||||
|
||||
static const struct property_entry cs42l43_cs_props[] = {
|
||||
PROPERTY_ENTRY_REF_ARRAY("cs-gpios", cs42l43_cs_refs),
|
||||
{}
|
||||
};
|
||||
|
||||
static int cs42l43_spi_tx(struct regmap *regmap, const u8 *buf, unsigned int len)
|
||||
{
|
||||
const u8 *end = buf + len;
|
||||
|
|
@ -324,11 +310,6 @@ static void cs42l43_release_of_node(void *data)
|
|||
fwnode_handle_put(data);
|
||||
}
|
||||
|
||||
static void cs42l43_release_sw_node(void *data)
|
||||
{
|
||||
software_node_unregister(&cs42l43_gpiochip_swnode);
|
||||
}
|
||||
|
||||
static int cs42l43_spi_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct cs42l43 *cs42l43 = dev_get_drvdata(pdev->dev.parent);
|
||||
|
|
@ -391,6 +372,15 @@ static int cs42l43_spi_probe(struct platform_device *pdev)
|
|||
fwnode_property_read_u32(xu_fwnode, "01fa-sidecar-instances", &nsidecars);
|
||||
|
||||
if (nsidecars) {
|
||||
struct software_node_ref_args args[] = {
|
||||
SOFTWARE_NODE_REFERENCE(fwnode, 0, GPIO_ACTIVE_LOW),
|
||||
SOFTWARE_NODE_REFERENCE(&swnode_gpio_undefined),
|
||||
};
|
||||
struct property_entry props[] = {
|
||||
PROPERTY_ENTRY_REF_ARRAY("cs-gpios", args),
|
||||
{ }
|
||||
};
|
||||
|
||||
ret = fwnode_property_read_u32(xu_fwnode, "01fa-spk-id-val", &spkid);
|
||||
if (!ret) {
|
||||
dev_dbg(priv->dev, "01fa-spk-id-val = %d\n", spkid);
|
||||
|
|
@ -403,17 +393,7 @@ static int cs42l43_spi_probe(struct platform_device *pdev)
|
|||
"Failed to get spk-id-gpios\n");
|
||||
}
|
||||
|
||||
ret = software_node_register(&cs42l43_gpiochip_swnode);
|
||||
if (ret)
|
||||
return dev_err_probe(priv->dev, ret,
|
||||
"Failed to register gpio swnode\n");
|
||||
|
||||
ret = devm_add_action_or_reset(priv->dev, cs42l43_release_sw_node, NULL);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = device_create_managed_software_node(&priv->ctlr->dev,
|
||||
cs42l43_cs_props, NULL);
|
||||
ret = device_create_managed_software_node(&priv->ctlr->dev, props, NULL);
|
||||
if (ret)
|
||||
return dev_err_probe(priv->dev, ret, "Failed to add swnode\n");
|
||||
} else {
|
||||
|
|
|
|||
Loading…
Reference in New Issue