Il giorno mar 10 dic 2024 alle ore 11:45 Marc Kleine-Budde <mkl@xxxxxxxxxxxxxx> ha scritto: > > On 10.12.2024 08:57:14, Marc Kleine-Budde wrote: > > From: Stefano Offredi <stefano.offredi@xxxxxxxxx> > > > > This patch makes the Microchip MCP251xFD driver compatible with > > hardware parameters loading from ACPI tables. > > > > It's a patch for the 5.15 kernel version for which I could do tests on. > > > > The ACPI driver hardware description table I used is the following: > > > > DefinitionBlock ("can.aml", "SSDT", 1, "mcp2518fd", "Intel", 0x00000003) > > { > > External (\_SB.PC00.SPI0, DeviceObj) > > Scope (\_SB.PC00.SPI0) > > { > > Device (CAN0) { > > Name (_HID, "MCP2518") > > Name (_CID, "mcp2518fd") > > Name (_DDN, "CAN SPI device connected to CS0") > > Name (_CRS, ResourceTemplate () { > > SpiSerialBus ( > > 0, // Chip select > > PolarityLow, // Chip select is active low > > FourWireMode, // Full duplex > > 8, // Bits per word is 8 (byte) > > ControllerInitiated, // Don't care > > 20000000, // 20 MHz > > ClockPolarityLow, // SPI mode 0 > > ClockPhaseFirst, // SPI mode 0 > > "\\_SB.PC00.SPI0", // SPI host controller > > 0 // Must be 0 > > ) > > GpioInt (Edge, ActiveLow, ExclusiveAndWake, PullDefault, 0, > > "\\_SB.GPI0", 0, ResourceConsumer, , > > ) > > { > > 2 > > } > > }) > > Name (_DSD, Package () > > { > > ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), > > Package () > > { > > Package () {"rxint-gpios", Package () { ^CAN0, 0, 0, 0 } }, > > Package (2) {"clock-frequency", 40000000 } > > } > > }) > > } > > } > > } > > > > Signed-off-by: Stefano Offredi <stefano.offredi@xxxxxxxxx> > > Signed-off-by: Marc Kleine-Budde <mkl@xxxxxxxxxxxxxx> > > --- > > This is a continuation of Stefano Offredi's work. For easier review > > I've rebased the patch to current net-next/main and fixed the > > indention. > > --- > > Changes in v2: > > - rebased to net-next/main > > - fix indention > > --- > > drivers/net/can/spi/mcp251xfd/mcp251xfd-core.c | 34 ++++++++++++++++++++++++++ > > 1 file changed, 34 insertions(+) > > > > diff --git a/drivers/net/can/spi/mcp251xfd/mcp251xfd-core.c b/drivers/net/can/spi/mcp251xfd/mcp251xfd-core.c > > index 3bc56517fe7a99d96dd43750a8ddd21961138e41..ee066dc2fdaa97ebadb5dc975957426c563adc9e 100644 > > --- a/drivers/net/can/spi/mcp251xfd/mcp251xfd-core.c > > +++ b/drivers/net/can/spi/mcp251xfd/mcp251xfd-core.c > > @@ -12,6 +12,9 @@ > > // Copyright (c) 2019 Martin Sperl <kernel@xxxxxxxxxxxxxxxx> > > // > > > > +#ifdef CONFIG_ACPI > > +#include <linux/acpi.h> > > +#endif > > #include <linux/unaligned.h> > > #include <linux/bitfield.h> > > #include <linux/clk.h> > > @@ -2002,6 +2005,23 @@ static const struct spi_device_id mcp251xfd_id_table[] = { > > }; > > MODULE_DEVICE_TABLE(spi, mcp251xfd_id_table); > > > > +#ifdef CONFIG_ACPI > > +static const struct acpi_device_id mcp251xfd_acpi_id_table[] = { > > + { "MCP2517", .driver_data = (kernel_ulong_t)&mcp251xfd_devtype_data_mcp2517fd, }, > > + { "MCP2518", .driver_data = (kernel_ulong_t)&mcp251xfd_devtype_data_mcp2518fd, }, > > + { "MCP251X", .driver_data = (kernel_ulong_t)&mcp251xfd_devtype_data_mcp251xfd, }, > > + {} > > +}; > > +MODULE_DEVICE_TABLE(acpi, mcp251xfd_acpi_id_table); > > + > > +static const struct acpi_gpio_params rx_int_gpios = { 1, 0, false }; > > + > > +static const struct acpi_gpio_mapping acpi_mcp251xfd_gpios[] = { > > + { "rx-int-gpios", &rx_int_gpios, 1 }, > > The devm_gpiod_get_optional() uses "microchip,rx-int". How does it find > the "rx-int-gpios" here? Does the ACPI matching code remove the > "microchip," prefix? > It should use the devm_acpi_dev_add_driver_gpios() function to get rx-int-gpios using names listed in acpi_mcp251xfd_gpios[] (rx-int-gpios). Then watching at other drivers using gpios loading, after calling devm_acpi_dev_add_driver_gpios(), they call devm_gpiod_get_optional(), with the same name but without "-gpios". So in our case it is exactly "rx-int". The chain starts from the acpi table here: Package () {"rx-int-gpios", Package () { ^CAN0, 0, 0, 0 } }. For example you can watch at st33zp24/spi.c:237 driver, or st-nci/spi.c:235 Stefano > Marc > > > + {}, > > +}; > > +#endif > > + > > static int mcp251xfd_probe(struct spi_device *spi) > > { > > struct net_device *ndev; > > @@ -2012,11 +2032,20 @@ static int mcp251xfd_probe(struct spi_device *spi) > > bool pll_enable = false; > > u32 freq = 0; > > int err; > > + int ret; > > > > if (!spi->irq) > > return dev_err_probe(&spi->dev, -ENXIO, > > "No IRQ specified (maybe node \"interrupts-extended\" in DT missing)!\n"); > > > > +#ifdef CONFIG_ACPI > > + ret = devm_acpi_dev_add_driver_gpios(&spi->dev, acpi_mcp251xfd_gpios); > > + if (ret) { > > + dev_dbg(&spi->dev, "failed to add gpios mapping table\n"); > > + return ret; > > + } > > +#endif > > + > > rx_int = devm_gpiod_get_optional(&spi->dev, "microchip,rx-int", > > GPIOD_IN); > > if (IS_ERR(rx_int)) > > @@ -2049,6 +2078,8 @@ static int mcp251xfd_probe(struct spi_device *spi) > > if (err) > > return dev_err_probe(&spi->dev, err, > > "Failed to get clock-frequency!\n"); > > + > > + dev_dbg(&spi->dev, "using clock-frequency %d Hz\n", freq); > > } > > > > /* Sanity check */ > > @@ -2204,6 +2235,9 @@ static struct spi_driver mcp251xfd_driver = { > > .name = DEVICE_NAME, > > .pm = &mcp251xfd_pm_ops, > > .of_match_table = mcp251xfd_of_match, > > +#ifdef CONFIG_ACPI > > + .acpi_match_table = ACPI_PTR(mcp251xfd_acpi_id_table), > > +#endif > > }, > > .probe = mcp251xfd_probe, > > .remove = mcp251xfd_remove, > > > > --- > > base-commit: a0e1fc921cb0651cd11469bf5378ec342bf7094d > > change-id: 20241209-mcp251xfd-acpi-79b57084512f > > > > Best regards, > > -- > > Marc Kleine-Budde <mkl@xxxxxxxxxxxxxx> > > > > > > > > > > -- > Pengutronix e.K. | Marc Kleine-Budde | > Embedded Linux | https://www.pengutronix.de | > Vertretung Nürnberg | Phone: +49-5121-206917-129 | > Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-9 |