Skip to content

Commit 4483e3c

Browse files
committed
soc: aspeed: lpc-snoop: Consolidate channel initialisation
Previously, channel initialisation was a bit perilous with respect to resource cleanup in error paths. While the implementation had issues, it at least made an effort to eliminate some of its problems by first testing whether any channels were enabled, and bailing out if not. Having improved the robustness of resource handling in probe() we can now rearrange the initial channel test to be located with the subsequent test, and rework the unrolled conditional logic to use a loop for an improvement in readability. Link: https://patch.msgid.link/20250616-aspeed-lpc-snoop-fixes-v2-9-3cdd59c934d3@codeconstruct.com.au Acked-by: Jean Delvare <jdelvare@suse.de> Signed-off-by: Andrew Jeffery <andrew@codeconstruct.com.au>
1 parent fa4ffb0 commit 4483e3c

1 file changed

Lines changed: 24 additions & 27 deletions

File tree

drivers/soc/aspeed/aspeed-lpc-snoop.c

Lines changed: 24 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -293,12 +293,21 @@ static void aspeed_lpc_disable_snoop(struct aspeed_lpc_snoop *lpc_snoop,
293293
kfifo_free(&channel->fifo);
294294
}
295295

296+
static void aspeed_lpc_snoop_remove(struct platform_device *pdev)
297+
{
298+
struct aspeed_lpc_snoop *lpc_snoop = dev_get_drvdata(&pdev->dev);
299+
300+
/* Disable both snoop channels */
301+
aspeed_lpc_disable_snoop(lpc_snoop, ASPEED_LPC_SNOOP_INDEX_0);
302+
aspeed_lpc_disable_snoop(lpc_snoop, ASPEED_LPC_SNOOP_INDEX_1);
303+
}
304+
296305
static int aspeed_lpc_snoop_probe(struct platform_device *pdev)
297306
{
298307
struct aspeed_lpc_snoop *lpc_snoop;
299-
struct device *dev;
300308
struct device_node *np;
301-
u32 port;
309+
struct device *dev;
310+
int idx;
302311
int rc;
303312

304313
dev = &pdev->dev;
@@ -321,12 +330,6 @@ static int aspeed_lpc_snoop_probe(struct platform_device *pdev)
321330

322331
dev_set_drvdata(&pdev->dev, lpc_snoop);
323332

324-
rc = of_property_read_u32_index(dev->of_node, "snoop-ports", 0, &port);
325-
if (rc) {
326-
dev_err(dev, "no snoop ports configured\n");
327-
return -ENODEV;
328-
}
329-
330333
lpc_snoop->clk = devm_clk_get_enabled(dev, NULL);
331334
if (IS_ERR(lpc_snoop->clk))
332335
return dev_err_probe(dev, PTR_ERR(lpc_snoop->clk), "couldn't get clock");
@@ -335,30 +338,24 @@ static int aspeed_lpc_snoop_probe(struct platform_device *pdev)
335338
if (rc)
336339
return rc;
337340

338-
rc = aspeed_lpc_enable_snoop(lpc_snoop, dev, ASPEED_LPC_SNOOP_INDEX_0, port);
339-
if (rc)
340-
return rc;
341+
for (idx = ASPEED_LPC_SNOOP_INDEX_0; idx <= ASPEED_LPC_SNOOP_INDEX_MAX; idx++) {
342+
u32 port;
343+
344+
rc = of_property_read_u32_index(dev->of_node, "snoop-ports", idx, &port);
345+
if (rc)
346+
break;
341347

342-
/* Configuration of 2nd snoop channel port is optional */
343-
if (of_property_read_u32_index(dev->of_node, "snoop-ports",
344-
1, &port) == 0) {
345-
rc = aspeed_lpc_enable_snoop(lpc_snoop, dev, ASPEED_LPC_SNOOP_INDEX_1, port);
346-
if (rc) {
347-
aspeed_lpc_disable_snoop(lpc_snoop, ASPEED_LPC_SNOOP_INDEX_0);
348-
return rc;
349-
}
348+
rc = aspeed_lpc_enable_snoop(lpc_snoop, dev, idx, port);
349+
if (rc)
350+
goto cleanup_channels;
350351
}
351352

352-
return 0;
353-
}
353+
return idx == ASPEED_LPC_SNOOP_INDEX_0 ? -ENODEV : 0;
354354

355-
static void aspeed_lpc_snoop_remove(struct platform_device *pdev)
356-
{
357-
struct aspeed_lpc_snoop *lpc_snoop = dev_get_drvdata(&pdev->dev);
355+
cleanup_channels:
356+
aspeed_lpc_snoop_remove(pdev);
358357

359-
/* Disable both snoop channels */
360-
aspeed_lpc_disable_snoop(lpc_snoop, ASPEED_LPC_SNOOP_INDEX_0);
361-
aspeed_lpc_disable_snoop(lpc_snoop, ASPEED_LPC_SNOOP_INDEX_1);
358+
return rc;
362359
}
363360

364361
static const struct aspeed_lpc_snoop_model_data ast2400_model_data = {

0 commit comments

Comments
 (0)