From: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
To: "Clément Léger" <clement.leger@bootlin.com>
Cc: Daniel Scally <djrscally@gmail.com>,
Heikki Krogerus <heikki.krogerus@linux.intel.com>,
Sakari Ailus <sakari.ailus@linux.intel.com>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
"Rafael J . Wysocki" <rafael@kernel.org>,
Wolfram Sang <wsa@kernel.org>, Peter Rosin <peda@axentia.se>,
Russell King <linux@armlinux.org.uk>,
Andrew Lunn <andrew@lunn.ch>,
Heiner Kallweit <hkallweit1@gmail.com>,
"David S . Miller" <davem@davemloft.net>,
Jakub Kicinski <kuba@kernel.org>,
linux-kernel@vger.kernel.org, linux-acpi@vger.kernel.org,
linux-i2c@vger.kernel.org, netdev@vger.kernel.org,
Thomas Petazzoni <thomas.petazzoni@bootlin.com>,
Alexandre Belloni <alexandre.belloni@bootlin.com>
Subject: Re: [RFC 00/10] add support for fwnode in i2c mux system and sfp
Date: Mon, 21 Feb 2022 19:41:24 +0200 [thread overview]
Message-ID: <YhPOxL++yhNHh+xH@smile.fi.intel.com> (raw)
In-Reply-To: <20220221162652.103834-1-clement.leger@bootlin.com>
On Mon, Feb 21, 2022 at 05:26:42PM +0100, Clément Léger wrote:
> The purpose of this work is to allow i2c muxes and adapters to be
> usable with devices that are described with software_node. A solution
> for this is to use the fwnode API which works with both device-tree,
> ACPI and software node. In this series, functions are added to retrieve
> i2c_adapter from fwnode and to create new mux adapters from fwnode.
>
> This series is part of a larger changeset that touches multiple
> subsystems. series will be sent separately for each subsystems since
> the amount of modified file is quite large. The following cover letter
> gives an overview of this work:
>
> ---
>
> The LAN966X SoC can either run it's own Linux system or be plugged in
> a PCIe slot as a PCIe switch. When running with a Linux system, a
> device-tree description is used to describe the system. However, when
> plugged in a PCIe slot (on a x86), there is no device-tree support and
> the peripherals that are present must be described in some other way.
>
> Reusing the existing drivers is of course mandatory and they should
> also be able to work without device-tree description. We decided to
> describe this card using software nodes and a MFD device. Indeed, the
> MFD subsystem allows to describe such systems using struct mfd_cells
> and mfd_add_devices(). This support also allows to attach a
> software_node description which might be used by fwnode API in drivers
> and subsystems.
>
> We thought about adding CONFIG_OF to x86 and potentially describe this
> card using device-tree overlays but it introduce other problems that
> also seems difficult to solve (overlay loading without base
> device-tree, fixup of IRQs, adresses, and so on) and CONFIG_OF is not
> often enabled on x86 to say the least.
Why it can't be described by SSDT overlay (if the x86 platform in question is
ACPI based)?
> TLDR: I know the series touches a lot of different files and has big
> implications, but it turns out software_nodes looks the "best" way of
> achieving this goal and has the advantage of converting some subsystems
> to be node agnostics, also allowing some ACPI factorization. Criticism
> is of course welcome as I might have overlooked something way simpler !
>
> ---
>
> This series introduce a number of changes in multiple subsystems to
> allow registering and using devices that are described with a
> software_node description attached to a mfd_cell, making them usable
> with the fwnode API. It was needed to modify many subsystem where
> CONFIG_OF was tightly integrated through the use of of_xlate()
> functions and other of_* calls. New calls have been added to use fwnode
> API and thus be usable with a wider range of nodes. Functions that are
> used to get the devices (pinctrl_get, clk_get and so on) also needed
> to be changed to use the fwnode API internally.
>
> For instance, the clk framework has been modified to add a
> fwnode_xlate() callback and a new named fwnode_clk_add_hw_provider()
> has been added. This function will register a clock using
> fwnode_xlate() callback. Note that since the fwnode API is compatible
> with devices that have a of_node member set, it will still be possible
> to use the driver and get the clocks with CONFIG_OF enabled
> configurations.
How does this all is compatible with ACPI approaches?
I mean we usually do not reintroduce 1:1 DT schemas in ACPI.
I think the CCF should be converted to use fwnode APIs and meanwhile
we may discuss how to deal with clocks on ACPI platforms, because
it may be a part of the power management methods.
> In some subsystems, it was possible to keep OF related function by
> wrapping the fwnode ones. It is not yet sure if both support
> (device-tree and fwnode) should still continue to coexists. For instance
> if fwnode_xlate() and of_xlate() should remain since the fwnode version
> also supports device-tree. Removing of_xlate() would of course require
> to modify all drivers that uses it.
>
> Here is an excerpt of the lan966x description when used as a PCIe card.
> The complete description is visible at [2]. This part only describe the
> flexcom controller and the fixed-clock that is used as an input clock.
>
> static const struct property_entry ddr_clk_props[] = {
> PROPERTY_ENTRY_U32("clock-frequency", 30000000),
> PROPERTY_ENTRY_U32("#clock-cells", 0),
Why this is used?
> {}
> };
>
> static const struct software_node ddr_clk_node = {
> .name = "ddr_clk",
> .properties = ddr_clk_props,
> };
>
> static const struct property_entry lan966x_flexcom_props[] = {
> PROPERTY_ENTRY_U32("atmel,flexcom-mode", ATMEL_FLEXCOM_MODE_TWI),
> PROPERTY_ENTRY_REF("clocks", &ddr_clk_node),
> {}
> };
>
> static const struct software_node lan966x_flexcom_node = {
> .name = "lan966x-flexcom",
> .properties = lan966x_flexcom_props,
> };
>
> ...
>
> static struct resource lan966x_flexcom_res[] = {
> [0] = {
> .flags = IORESOURCE_MEM,
> .start = LAN966X_DEV_ADDR(FLEXCOM_0_FLEXCOM_REG),
> .end = LAN966X_DEV_ADDR(FLEXCOM_0_FLEXCOM_REG),
> },
> };
>
> ...
>
> static struct mfd_cell lan966x_pci_mfd_cells[] = {
> ...
> [LAN966X_DEV_DDR_CLK] = {
> .name = "of_fixed_clk",
> .swnode = &ddr_clk_node,
> },
> [LAN966X_DEV_FLEXCOM] = {
> .name = "atmel_flexcom",
> .num_resources = ARRAY_SIZE(lan966x_flexcom_res),
> .resources = lan966x_flexcom_res,
> .swnode = &lan966x_flexcom_node,
> },
> ...
> },
>
> And finally registered using:
>
> ret = devm_mfd_add_devices(dev, PLATFORM_DEVID_AUTO,
> lan966x_pci_mfd_cells,
> ARRAY_SIZE(lan966x_pci_mfd_cells), pci_base, irq_base,
> irq_domain);
>
> With the modifications that have been made on this tree, it is now
> possible to probe such description using existing platform drivers,
> providing that they have been modified a bit to retrieve properties
> using fwnode API and using the fwnode_xlate() callback instead of
> of_xlate().
>
> This series has been tested on a x86 kernel build without CONFIG_OF.
> Another kernel was also built with COMPILE_TEST and CONFIG_OF support
> to build as most drivers as possible. It was also tested on a sparx5
> arm64 with CONFIG_OF. However, it was not tested with an ACPI
> description evolved enough to validate all the changes.
>
> A branch containing all theses modifications can be seen at [1] along
> with a PCIe driver [2] which describes the card using software nodes.
> Modifications that are on this branch are not completely finished (ie,
> subsystems modifications for fwnode have not been factorized with OF
> for all of them) in absence of feedback on the beginning of this work
> from the community.
>
> [1] https://github.com/clementleger/linux/tree/fwnode_support
> [2] https://github.com/clementleger/linux/blob/fwnode_support/drivers/mfd/lan966x_pci_mfd.c
>
> Clément Léger (10):
> property: add fwnode_match_node()
> property: add fwnode_get_match_data()
> base: swnode: use fwnode_get_match_data()
> property: add a callback parameter to fwnode_property_match_string()
> property: add fwnode_property_read_string_index()
> i2c: fwnode: add fwnode_find_i2c_adapter_by_node()
> i2c: of: use fwnode_get_i2c_adapter_by_node()
> i2c: mux: pinctrl: remove CONFIG_OF dependency and use fwnode API
> i2c: mux: add support for fwnode
> net: sfp: add support for fwnode
>
> drivers/base/property.c | 133 ++++++++++++++++++++++++++--
> drivers/base/swnode.c | 1 +
> drivers/i2c/Makefile | 1 +
> drivers/i2c/i2c-core-fwnode.c | 40 +++++++++
> drivers/i2c/i2c-core-of.c | 30 -------
> drivers/i2c/i2c-mux.c | 39 ++++----
> drivers/i2c/muxes/Kconfig | 1 -
> drivers/i2c/muxes/i2c-mux-pinctrl.c | 21 ++---
> drivers/net/phy/sfp.c | 44 +++------
> include/linux/i2c.h | 7 +-
> include/linux/property.h | 9 ++
> 11 files changed, 225 insertions(+), 101 deletions(-)
> create mode 100644 drivers/i2c/i2c-core-fwnode.c
>
> --
> 2.34.1
>
--
With Best Regards,
Andy Shevchenko
next prev parent reply other threads:[~2022-02-21 17:45 UTC|newest]
Thread overview: 72+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-02-21 16:26 [RFC 00/10] add support for fwnode in i2c mux system and sfp Clément Léger
2022-02-21 16:26 ` [RFC 01/10] property: add fwnode_match_node() Clément Léger
2022-02-21 17:44 ` Andy Shevchenko
2022-02-22 8:14 ` Clément Léger
2022-02-21 16:26 ` [RFC 02/10] property: add fwnode_get_match_data() Clément Léger
2022-02-21 17:46 ` Andy Shevchenko
2022-02-22 8:19 ` Clément Léger
2022-02-22 8:33 ` Andy Shevchenko
2022-02-22 8:46 ` Clément Léger
2022-02-22 9:24 ` Andy Shevchenko
2022-02-22 9:47 ` Clément Léger
2022-02-22 10:20 ` Greg Kroah-Hartman
2022-02-22 15:16 ` Clément Léger
2022-02-21 16:26 ` [RFC 03/10] base: swnode: use fwnode_get_match_data() Clément Léger
2022-02-21 17:48 ` Andy Shevchenko
2022-02-22 8:39 ` Clément Léger
2022-02-23 15:05 ` Sakari Ailus
2022-02-23 15:15 ` Clément Léger
2022-02-23 15:21 ` Sakari Ailus
2022-02-21 16:26 ` [RFC 04/10] property: add a callback parameter to fwnode_property_match_string() Clément Léger
2022-02-21 17:51 ` Andy Shevchenko
2022-02-21 16:26 ` [RFC 05/10] property: add fwnode_property_read_string_index() Clément Léger
2022-02-21 16:26 ` [RFC 06/10] i2c: fwnode: add fwnode_find_i2c_adapter_by_node() Clément Léger
2022-02-21 18:00 ` Andy Shevchenko
2022-02-21 16:26 ` [RFC 07/10] i2c: of: use fwnode_get_i2c_adapter_by_node() Clément Léger
2022-02-21 16:26 ` [RFC 08/10] i2c: mux: pinctrl: remove CONFIG_OF dependency and use fwnode API Clément Léger
2022-02-21 16:26 ` [RFC 09/10] i2c: mux: add support for fwnode Clément Léger
2022-02-21 17:55 ` Andy Shevchenko
2022-02-22 8:53 ` Clément Léger
2022-02-22 10:57 ` Andrew Lunn
2022-02-22 20:31 ` Alexandre Belloni
2022-02-21 16:26 ` [RFC 10/10] net: sfp: " Clément Léger
2022-02-21 16:45 ` Russell King (Oracle)
2022-02-21 17:57 ` Andy Shevchenko
2022-02-22 13:25 ` Clément Léger
2022-02-23 11:22 ` Andy Shevchenko
2022-02-23 12:02 ` Hans de Goede
2022-02-23 12:31 ` Andrew Lunn
2022-02-23 12:41 ` Russell King (Oracle)
2022-02-23 13:39 ` Hans de Goede
2022-02-23 14:14 ` Clément Léger
2022-02-23 15:23 ` Andrew Lunn
2022-02-23 15:27 ` Hans de Goede
2022-02-23 15:27 ` Hans de Goede
2022-02-23 15:36 ` Andy Shevchenko
2022-02-23 15:38 ` Clément Léger
2022-02-23 14:37 ` Andy Shevchenko
2022-02-21 17:41 ` Andy Shevchenko [this message]
2022-02-22 16:30 ` [RFC 00/10] add support for fwnode in i2c mux system and sfp Clément Léger
2022-02-23 14:46 ` Andy Shevchenko
2022-02-23 15:11 ` Clément Léger
2022-02-23 15:24 ` Andy Shevchenko
2022-02-23 17:41 ` Mark Brown
2022-02-23 17:59 ` Clément Léger
2022-02-23 18:12 ` Mark Brown
2022-02-23 18:19 ` Andy Shevchenko
2022-02-21 21:44 ` Andrew Lunn
2022-02-22 8:26 ` Andy Shevchenko
2022-02-22 8:57 ` Andrew Lunn
2022-02-22 9:20 ` Andy Shevchenko
2022-02-24 14:40 ` Clément Léger
2022-02-24 14:58 ` Hans de Goede
2022-02-24 15:33 ` Mark Brown
2022-02-24 18:14 ` Sakari Ailus
2022-02-24 18:39 ` Alexandre Belloni
2022-02-24 18:43 ` Mark Brown
2022-02-24 18:39 ` Mark Brown
2022-02-24 16:42 ` Clément Léger
2022-02-24 17:26 ` Mark Brown
2022-03-03 8:48 ` Clément Léger
2022-03-03 12:26 ` Mark Brown
2022-03-08 10:45 ` Clément Léger
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=YhPOxL++yhNHh+xH@smile.fi.intel.com \
--to=andriy.shevchenko@linux.intel.com \
--cc=alexandre.belloni@bootlin.com \
--cc=andrew@lunn.ch \
--cc=clement.leger@bootlin.com \
--cc=davem@davemloft.net \
--cc=djrscally@gmail.com \
--cc=gregkh@linuxfoundation.org \
--cc=heikki.krogerus@linux.intel.com \
--cc=hkallweit1@gmail.com \
--cc=kuba@kernel.org \
--cc=linux-acpi@vger.kernel.org \
--cc=linux-i2c@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux@armlinux.org.uk \
--cc=netdev@vger.kernel.org \
--cc=peda@axentia.se \
--cc=rafael@kernel.org \
--cc=sakari.ailus@linux.intel.com \
--cc=thomas.petazzoni@bootlin.com \
--cc=wsa@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox