Re: [PATCH can-next v2] can: mcp251xfd: ACPI support

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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   |





[Index of Archives]     [Automotive Discussions]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux]     [Linux OMAP]     [Linux MIPS]     [eCos]     [Asterisk Internet PBX]     [Linux API]     [CAN Bus]

  Powered by Linux