From: Alex Elder <elder@riscstar.com>
To: Conor Dooley <conor@kernel.org>
Cc: p.zabel@pengutronix.de, robh@kernel.org, krzk+dt@kernel.org,
conor+dt@kernel.org, mohd.anwar@oss.qualcomm.com,
lorenzo.bianconi@oss.qualcomm.com, danielt@kernel.org,
devicetree@vger.kernel.org, linux-kernel@vger.kernel.org,
Daniel Thompson <daniel@riscstar.com>
Subject: Re: [PATCH 1/2] dt-bindings: reset: introduce toshiba,tc9564-reset.yaml
Date: Wed, 21 Oct 2026 14:50:41 -0500 [thread overview]
Message-ID: <b904f4ea-e198-488e-a6dd-476d744593da@riscstar.com> (raw)
In-Reply-To: <20261013-stump-reactor-055d05dc5b3a@spud>
On 10/13/26 12:51 PM, Conor Dooley wrote:
> On Tue, Oct 13, 2026 at 08:22:50AM -0500, Alex Elder wrote:
>> On 10/12/26 4:22 PM, Conor Dooley wrote:
>>> On Mon, Oct 12, 2026 at 02:10:01PM -0500, Alex Elder wrote:
>>>> On 10/12/26 1:51 PM, Conor Dooley wrote:
>>>>> On Mon, Oct 12, 2026 at 11:43:52AM -0500, Alex Elder wrote:
>>>>>> Define the binding for the reset controller functionality present in
>>>>>> the Toshiba TC9564 SoC.
>>>>>>
>>>>>> Co-developed-by: Daniel Thompson <daniel@riscstar.com>
>>>>>> Signed-off-by: Daniel Thompson <daniel@riscstar.com>
>>>>>> Signed-off-by: Alex Elder <elder@riscstar.com>
>>>>>> ---
Finally back to looking at this again. Sorry for the delay.
>>>>>> .../bindings/reset/toshiba,tc9564-reset.yaml | 56 +++++++++++++++++++
>>>>>> MAINTAINERS | 7 +++
>>>>>> include/dt-bindings/reset/toshiba,tc9564.h | 26 +++++++++
>>>>>> 3 files changed, 89 insertions(+)
>>>>>> create mode 100644 Documentation/devicetree/bindings/reset/toshiba,tc9564-reset.yaml
>>>>>> create mode 100644 include/dt-bindings/reset/toshiba,tc9564.h
>>>>>>
>>>>>> diff --git a/Documentation/devicetree/bindings/reset/toshiba,tc9564-reset.yaml b/Documentation/devicetree/bindings/reset/toshiba,tc9564-reset.yaml
>>>>>> new file mode 100644
>>>>>> index 0000000000000..1908e9539abac
>>>>>> --- /dev/null
>>>>>> +++ b/Documentation/devicetree/bindings/reset/toshiba,tc9564-reset.yaml
>>>>>> @@ -0,0 +1,56 @@
>>>>>> +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
>>>>>> +%YAML 1.2
>>>>>> +---
>>>>>> +$id: http://devicetree.org/schemas/reset/toshiba,tc9564-reset.yaml#
>>>>>> +$schema: http://devicetree.org/meta-schemas/core.yaml#
>>>>>> +
>>>>>> +title: Toshiba TC9564 Reset Controller
>>>>>> +
>>>>>> +maintainers:
>>>>>> + - Alex Elder <elder@riscstar.com>
>>>>>> + - Daniel Thompson <daniel@riscstar.com>
>>>>>> +
>>>>>> +description:
>>>>>> + The Toshiba TC9564 is an SoC accessed by a host system through the
>>>>>> + upstream PCIe port on the PCIe switch it implements. The switch
>>>>>> + includes an embedded PCIe endpoint that provides access to various
>>>>>> + SoC peripherals (including a reset controller) via its BARs.
>>>>>> +
>>>>>> + A total of 13 resets are implemented, though two of these are not
>>>>>> + controllable. Access to the reset controller relies on PCIe being
>>>>>> + functional, so the PCIe reset is assumed to be deasserted. Similarly,
>>>>>> + the PCIe controller relies on I2C, so the I2C reset is also assumed
>>>>>> + to be deasserted.
>>>>>> +
>>>>>> + Reset ids are defined in <dt-bindings/reset/toshiba,tc9564.h>.
>>>>>> +
>>>>>> + The reset controller uses registers within the same page as a
>>>>>> + clock controller, so both devices are defined as children of a
>>>>>> + "config" syscon.
>>>>>> +
>>>>>> +properties:
>>>>>> + compatible:
>>>>>> + const: toshiba,tc9564-reset
>>>>>
>>>>> Why does this need to exist as a standalone device, rather than be
>>>>> rolled up into the parent syscon node? It doesn't have any resources, so
>>>>> it should be doable.
>>>>
>>>> This is along the lines of what Krzysztof has mentioned, and it
>>>> seems clear I must be missing something.
>>>>
>>>>> This kind of thing for a syscon is always difficult to review when only
>>>>> one element is present - where is the rest of the syscon's
>>>>> functionality?
>>>>
>>>> The reason a syscon was used was simply for the benefit of
>>>> having a shared regmap that the reset, clock, and DWMAC drivers
>>>> can use. All three of those drivers use registers that reside
>>>> within a single page of addressible MMIO space.
>>>
>>> What does the dwmac use the region for? I assume it's for some misc
>>> register and you don't mean that the dwmac lies within the region?
>>
>> That's right. There is one register (per DWMAC--there are two)
>> that contains one bit (bit 21) that is used to signal that initialization of
>> the PMA is done. We assert reset, set up
>> clocks, then deassert, and finally wait for this bit to be set.
>> The DWMAC code uses a phandle property to refer to the syscon,
>> like:
>> toshiba,config-syscon = <&tc9564_config_syscon0 0x1070>
>>
>> So again, the purpose of the syscon was to get the automatic
>> regmap for managing the region, which contains registers used
>> for distinct purposes.
>>
>> After making the syscon be the parent of both the reset and
>> clock nodes, I *removed* the "reg" properties and just defined
>> those offsets in the driver. Maybe that was a mistake.
>
> No, that's typically what happens in the setup I describe below, so
> that's not abnormal.
Thank you for confirming this.
>>> There's nothing inherently wrong with the act of using of a syscon here,
>>> what I am actually complaining about is how you are using it.
>>> In cases where a syscon region contains clock and reset, the typical way
>>> we want people to do this is via something like
>>>
>>> syscon@f00 {
>>> compatible = "toshiba,tc9564-bla-syscon", "syscon", "simple-mfd";
>>> reg = <0x0 0x2000>;
>>> #reset-cells = <1>;
>>> #clock-cells = <1>;
>>> };
>>
>> In this case it seems I must create a syscon driver that provides
>> combined reset and clock functionality. Is that right? (This
>> series is the result of separating the reset code from the clock
>> code in a combined driver.)
>
> There's two ways to do it, depending on what sort of device you have.
> If you have a clock controller that also does reset, the preferred thing
> to do is something like
>
> clock-controller@f00 {
> compatible = "toshiba,tc9564-clk";
> reg = <0x0 0x2000>;
> #reset-cells = <1>;
> #clock-cells = <1>;
> };
>
> and in the clock controller driver probe the reset controller driver as
> a auxiliary bus device.
My last version combined these two but did not make the
reset an auxiliary device.
> You have something else though, because there's assorted other functions
> in here, including the dwmac and things you don't use yet. In that case,
> I would make a node like
>
> syscon@f00 {
> compatible = "toshiba,tc9564-bla-syscon", "syscon";
> reg = <0x0 0x2000>;
> #reset-cells = <1>;
> #clock-cells = <1>;
> };
>
> and in the syscon driver use MFD_CELL_NAME() to probe both clock and
> reset drivers, and can use device_node_to_regmap(). Your dwmac stuff
> (and any other future stuff that needs a syscon reference) can use the
> automagic syscon regmap stuff that we've already talked about.
This sounds like the way to go.
> Note, there's no "simple-mfd" here, because you have no child nodes.
> The point of "simple-mfd" is to probe those kinds of devices.
OK. Let's see if I understand what you're saying.
This approach uses:
- A single top-level syscon driver (under drivers/mfd?) which
probes based on a devicetree node compatible string ("toshiba,...")
- That compatible string will require a (fairly simple) devicetree
binding
- That driver initializes a regmap which will cover the space
defined in its devicetree node (<0x0 0x2000>)
- That driver has an array that uses MFD_CELL_NAME() to define
cells for clock and reset
- That driver will call some form of mfd_add_devices() using the
MFD cell array
- The stmmac driver can refer to this device node with a phandle
property to specify the syscon that provides the regmap it needs
And then, for the clock and reset devices:
- A clock platform driver (under drivers/clk) will match based
on the driver name (matching what's supplied by MFD_CELL_NAME())
- A reset driver will be similar (under drivers/reset)
- As you mentioned, these drivers get at the regmap they need using
device_node_to_regmap() (or dev_get_regmap() or something)
- And despite these being separate drivers (from the syscon driver)
they don't have devicetree nodes, and the syscon node itself
defines the clock-controller and reset-controller properties.
Does that sound right? Am I missing anything?
>> To be honest I don't have a lot of experience with proper use of
>> syscons. I have no problem writing or restructuring the code,
>> it just seems I need help knowing what the final structure should
>> look like.
>>
>>> because the child node exists for no other reason than to access linux
>>> driver probing in the most trivial way. If there's some features that
>>> actually need a child node, that's fine, but those will end up being
>>> things with significantly more properties or things with competing
>>> property use (e.g. if there were devices with buses that need
>>> address/size cells).
>>
>> I'm not sure I understand this statement (and that might be part
>> of the problem).
>>
>> There are other devices (currently just two DWMACs, plus an
>> interrupt controller that generates MSIs for each PCI function)
>> that use the reset and clock signals. I haven't yet
>> posted the reworked DWMAC code but I just sent the first version
>> of the interrupt driver yesterday.
>> https://lore.kernel.org/lkml/20261012190245.3988619-1-elder@riscstar.com/
>
> Here I am talking about why child nodes aren't correct in your case.
> Neither clock nor reset needs anything other than the relevant #cells
> property, so the only benefit of a child node over having these in the
> syscon node itself are to use the compatible to probe the driver.
Yes I now see what you mean. By using a MFD model the child device
is just a function provided by the top-level syscon device. The
driver code still benefits from the device model, but the subordinate
devices match based on the device name and not a devicetree compatible
string. And no nodes exposed in devicetree are needed for the clock
and reset.
> Child nodes should only be used when the functions provided by the
> syscon have conflicting properties or are very complicated (I would
> probably always use a child node for pinctrl for example). It'd also be
> reasonable if the functions are reused across devices, but that's
> rarely the case with clock or reset controllers (or really anything
> that appears in these kinds of "random register regions" in SoCs).
>
> Does that make more sense?
Yes, it definitely helps a lot. I realize I might not have every
detail right, but I feel much better about how to organize this
(and presumably this also addresses what Krzysztof was asking for).
Thank you Conor.
-Alex
>
>>
>>>> And I don't know that I can guarantee their probe order.
>>>
>>> I am assuming this is moot, since I am not objecting to using a syscon?
>>>
>>>> There is otherwise no "system controller" that is treated as
>>>> a logical entity within the SoC.
>>>>
>>>> What is the proper way for me to represent this? It's fairly
>>>> simple; and I mainly want to ensure all three of those drivers
>>>> can safely access their addresses.
>>>
>>> What else does this region actually contain?
>>
>> At this point I've described everything we now use. Two
>> registers control a set of resets; two registers enable and
>> disable a set of clocks; and two registers each contain a
>> bit to signal readiness of a DWMAC device.
>>
>> There are other registers in this region, but at this time
>> we don't use them.
>>
>> -Alex
>>
>>>
>>> Cheers,
>>> Conor.
>>>
>>>>>> +
>>>>>> + "#reset-cells":
>>>>>> + const: 1
>>>>>> +
>>>>>> +required:
>>>>>> + - compatible
>>>>>> + - "#reset-cells"
>>>>>> +
>>>>>> +unevaluatedProperties: false
>>>>>> +
>>>>>> +examples:
>>>>>> + - |
>>>>>> + #include <dt-bindings/reset/toshiba,tc9564.h>
>>>>>> +
>>>>>> + syscon@0 {
>>>>>> + compatible = "syscon", "simple-mfd";
>>>>>> + reg = <0x0 0x2000>;
>>>>>> +
>>>>>> + reset {
>>>>>> + compatible = "toshiba,tc9564-reset";
>>>>>> + #reset-cells = <1>;
>>>>>> + };
>>>>>> + };
>>>>>> diff --git a/MAINTAINERS b/MAINTAINERS
>>>>>> index 252b6d7ee1638..d0eb44079fe17 100644
>>>>>> --- a/MAINTAINERS
>>>>>> +++ b/MAINTAINERS
>>>>>> @@ -28180,6 +28180,13 @@ S: Maintained
>>>>>> F: Documentation/devicetree/bindings/misc/pci1179,0220.yaml
>>>>>> F: drivers/misc/tc9564-pci.c
>>>>>> +TOSHIBA TC9564 RESET DRIVER
>>>>>> +M: Alex Elder <elder@kernel.org>
>>>>>> +M: Daniel Thompson <danielt@kernel.org>
>>>>>> +S: Maintained
>>>>>> +F: Documentation/devicetree/bindings/reset/toshiba,tc9564-reset.yaml
>>>>>> +F: include/dt-bindings/reset/toshiba,tc9564.h
>>>>>> +
>>>>>> TOSHIBA WMI HOTKEYS DRIVER
>>>>>> M: Azael Avalos <coproscefalo@gmail.com>
>>>>>> L: platform-driver-x86@vger.kernel.org
>>>>>> diff --git a/include/dt-bindings/reset/toshiba,tc9564.h b/include/dt-bindings/reset/toshiba,tc9564.h
>>>>>> new file mode 100644
>>>>>> index 0000000000000..5fcc9a06d4ff6
>>>>>> --- /dev/null
>>>>>> +++ b/include/dt-bindings/reset/toshiba,tc9564.h
>>>>>> @@ -0,0 +1,26 @@
>>>>>> +/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
>>>>>> +
>>>>>> +/*
>>>>>> + * Copyright (C) 2026 by RISCstar Solutions Corporation. All rights reserved.
>>>>>> + */
>>>>>> +
>>>>>> +#ifndef __RESET_TOSHIBA_TC9564_H__
>>>>>> +#define __RESET_TOSHIBA_TC9564_H__
>>>>>> +
>>>>>> +/* Reset IDs */
>>>>>> +
>>>>>> +#define RESET_MCU 0
>>>>>> +#define RESET_MCU1 1
>>>>>> +#define RESET_MSIGEN 2
>>>>>> +#define RESET_INTC 3
>>>>>> +#define RESET_UART 4
>>>>>> +
>>>>>> +#define RESET_MAC0_MAC 5
>>>>>> +#define RESET_MAC0_PMA 6
>>>>>> +#define RESET_MAC0_XPCS 7
>>>>>> +
>>>>>> +#define RESET_MAC1_MAC 8
>>>>>> +#define RESET_MAC1_PMA 9
>>>>>> +#define RESET_MAC1_XPCS 10
>>>>>> +
>>>>>> +#endif /* __RESET_TOSHIBA_TC9564_H__*/
>>>>>> --
>>>>>> 2.53.0
>>>>>>
>>>>
>>
next prev parent reply other threads:[~2026-10-21 19:50 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-12 16:43 [PATCH 0/2] reset: introduce TC9564 reset support Alex Elder
2026-10-12 16:43 ` [PATCH 1/2] dt-bindings: reset: introduce toshiba,tc9564-reset.yaml Alex Elder
2026-10-12 18:51 ` Conor Dooley
2026-10-12 19:10 ` Alex Elder
2026-10-12 21:22 ` Conor Dooley
2026-10-13 13:22 ` Alex Elder
2026-10-13 17:51 ` Conor Dooley
2026-10-21 19:50 ` Alex Elder [this message]
2026-10-13 9:25 ` Krzysztof Kozlowski
2026-10-12 16:43 ` [PATCH 2/2] reset: toshiba: introduce a TC9564 SoC reset driver Alex Elder
2026-10-13 13:28 ` Philipp Zabel
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=b904f4ea-e198-488e-a6dd-476d744593da@riscstar.com \
--to=elder@riscstar.com \
--cc=conor+dt@kernel.org \
--cc=conor@kernel.org \
--cc=daniel@riscstar.com \
--cc=danielt@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=krzk+dt@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=lorenzo.bianconi@oss.qualcomm.com \
--cc=mohd.anwar@oss.qualcomm.com \
--cc=p.zabel@pengutronix.de \
--cc=robh@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
all inboxes | Powered by JetHome®