From 708663738592c63da3c851ed86ce6c084409f6c8 Mon Sep 17 00:00:00 2001 From: Jay Fang Date: Sat, 22 Dec 2018 11:01:49 +0800 Subject: [PATCH] spi: add ACPI support for SPI controller chip select lines(cs-gpios) euler inclusion category: feature (SPI ACPI for Hi1620) bugzilla: 5443 CVE: NA TPM chip on D06 is SPI based, so we need to add SPI ACPI support for Hi1620. Two patches already merged for 4.21, but the core support for spi has another patchset needs lots of refactor, so just use the patch from Fang Jian to enable this feature on 4.19 [PATCH 1/4] spi: dw-mmio: add ACPI support [PATCH 2/4] ACPI / APD: Add clock frequency for Hisilicon Hip08 SPI controller [PATCH 3/4] spi: add ACPI support for SPI controller chip select lines(cs-gpios) [PATCH 4/4] hulk_defconfig: ensble SPI designware driver for Hi1620 ----------------------------------------- This will also allow to use cs-gpios for chip select in ACPI code with no modification in the driver binding, like it be used in DT. We could share almost all of the code with the DT path. Signed-off-by: Jay Fang Signed-off-by: Hanjun Guo Reviewed-by: Yang Yingliang Signed-off-by: Yang Yingliang --- drivers/spi/spi.c | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c index 9da0bc5a036c..e042ecbb67c6 100644 --- a/drivers/spi/spi.c +++ b/drivers/spi/spi.c @@ -2031,16 +2031,13 @@ struct spi_controller *__spi_alloc_controller(struct device *dev, } EXPORT_SYMBOL_GPL(__spi_alloc_controller); -#ifdef CONFIG_OF -static int of_spi_register_master(struct spi_controller *ctlr) +static int __spi_register_controller(struct spi_controller *ctlr) { int nb, i, *cs; struct device_node *np = ctlr->dev.of_node; + struct gpio_desc *desc; - if (!np) - return 0; - - nb = of_gpio_named_count(np, "cs-gpios"); + nb = gpiod_count(&ctlr->dev, "cs"); ctlr->num_chipselect = max_t(int, nb, ctlr->num_chipselect); /* Return error only for an incorrectly formed cs-gpios property */ @@ -2059,17 +2056,20 @@ static int of_spi_register_master(struct spi_controller *ctlr) for (i = 0; i < ctlr->num_chipselect; i++) cs[i] = -ENOENT; - for (i = 0; i < nb; i++) - cs[i] = of_get_named_gpio(np, "cs-gpios", i); - - return 0; -} -#else -static int of_spi_register_master(struct spi_controller *ctlr) -{ + if (IS_ENABLED(CONFIG_OF) && np) { + for (i = 0; i < nb; i++) + cs[i] = of_get_named_gpio(np, "cs-gpios", i); + } else if (IS_ENABLED(CONFIG_ACPI) && ACPI_HANDLE(&ctlr->dev)) { + for (i = 0; i < nb; i++) { + desc = devm_gpiod_get_index(&ctlr->dev, "cs", + i, GPIOD_ASIS); + if (IS_ERR(desc)) + continue; + cs[i] = desc_to_gpio(desc); + } + } return 0; } -#endif static int spi_controller_check_ops(struct spi_controller *ctlr) { @@ -2133,7 +2133,7 @@ int spi_register_controller(struct spi_controller *ctlr) return status; if (!spi_controller_is_slave(ctlr)) { - status = of_spi_register_master(ctlr); + status = __spi_register_controller(ctlr); if (status) return status; } -- GitLab