Re: [PATCH v2 1/6] dt-bindings: hwmon: add Microchip LAN969x fan controller
From: Robert Marko
Date: Tue Nov 10 2026 - 06:13:47 EST
On Mon, Nov 9, 2026 at 8:14 PM Conor Dooley <conor@xxxxxxxxxx> wrote:
>
> On Mon, Nov 09, 2026 at 02:35:05PM +0100, Robert Marko wrote:
> > The LAN969x fan controller has a PWM output and tachometer input in a
> > register block separate from the Sparx5-compatible temperature sensor.
> > Describe it with its own compatible and binding.
> >
> > The optional fan child specifies PWM period and polarity, tachometer
> > pulses per revolution, and thermal cooling levels.
> >
> > Signed-off-by: Robert Marko <robert.marko@xxxxxxxxxx>
> > ---
> > Changes in v2:
> > - Describe the fan controller in a separate binding and compatible.
> > - Keep the existing temperature-sensor binding unchanged.
>
> So, I think that this device has been modelled incorrectly from the
> outset. "devcpu_gcb" should probably be a syscon/simplemfd, as least
> going off of what I see in
> https://microchip-ung.github.io/lan969x-automotive_reginfo/reginfo_LAN969x-Automotive.html?select=devcpu_gcb
> and the fact that we see silly offsets in the dts:
> reset: reset-controller@e201000c {
> reg = <0xe201000c 0x4>;
> };
>
> gpio: pinctrl@e20100d4 {
> reg = <0xe20100d4 0xd4>,
> <0xe2010370 0xa8>;
> };
>
> mdio0: mdio@e20101a8 {
> reg = <0xe20101a8 0x24>;
> };
>
> mdio1: mdio@e20101cc {
> reg = <0xe20101cc 0x24>;
> };
>
> sgpio: gpio@e2010230 {
> reg = <0xe2010230 0x118>;
> };
> That ship has sailed I think though, so I'm not going to ask you to
> rework this whole device.
>
> >
> > .../bindings/hwmon/microchip,lan9691-fan.yaml | 83 +++++++++++++++++++
> > 1 file changed, 83 insertions(+)
> > create mode 100644 Documentation/devicetree/bindings/hwmon/microchip,lan9691-fan.yaml
> >
> > diff --git a/Documentation/devicetree/bindings/hwmon/microchip,lan9691-fan.yaml b/Documentation/devicetree/bindings/hwmon/microchip,lan9691-fan.yaml
> > new file mode 100644
> > index 0000000000000..0b7d38a6d20ae
> > --- /dev/null
> > +++ b/Documentation/devicetree/bindings/hwmon/microchip,lan9691-fan.yaml
> > @@ -0,0 +1,83 @@
> > +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
> > +%YAML 1.2
> > +---
> > +$id: http://devicetree.org/schemas/hwmon/microchip,lan9691-fan.yaml#
> > +$schema: http://devicetree.org/meta-schemas/core.yaml#
> > +
> > +title: Microchip LAN969x Fan Controller
> > +
> > +maintainers:
> > + - Robert Marko <robert.marko@xxxxxxxxxx>
> > +
> > +description: |
> > + LAN969x fan controller with a PWM output and tachometer input. The fan
> > + child's pwms property references this node to specify the PWM period and
> > + polarity.
> > +
> > +properties:
> > + compatible:
> > + const: microchip,lan9691-fan
> > +
> > + reg:
> > + maxItems: 1
> > +
> > + clocks:
> > + items:
> > + - description: System reference clock
> > +
> > + '#pwm-cells':
> > + const: 2
> > + description: |
> > + Number of cells in a PWM specifier.
> > + - cell 0: PWM period in nanoseconds
> > + - cell 1: PWM polarity: 0 or PWM_POLARITY_INVERTED
> > +
> > + fan:
> > + $ref: fan-common.yaml#
> > + unevaluatedProperties: false
> > +
> > + properties:
> > + cooling-levels:
> > + description:
> > + PWM duty-cycle values corresponding to thermal cooling states.
> > + items:
> > + maximum: 255
> > +
> > + pulses-per-revolution:
> > + minimum: 1
> > + maximum: 4
> > + default: 2
> > +
> > + required:
> > + - pwms
> > +
> > + dependencies:
> > + '#cooling-cells':
> > + - cooling-levels
> > + cooling-levels:
> > + - '#cooling-cells'
> > +
> > +required:
> > + - compatible
> > + - reg
> > + - clocks
> > + - '#pwm-cells'
> > +
> > +additionalProperties: false
> > +
> > +examples:
> > + - |
> > + #include <dt-bindings/pwm/pwm.h>
> > +
> > + fanctrl: fan-controller@e2010348 {
> > + compatible = "microchip,lan9691-fan";
> > + reg = <0xe2010348 0xc>;
>
> btw, how do I translate the addresses you have here to those in
> https://microchip-ung.github.io/lan969x-automotive_reginfo/reginfo_LAN969x-Automotive.html?select=devcpu_gcb,fan_ctrl
> ? Or are you looking at a register map in a different form?
Hi Conor,
Microchip has cml-utils, which allows exporting the registers and
masks automatically, its part of the public SDK.
Or you can get the address from the register map you linked, its just
posted as word addresses, so multiply by 4.
So for DEVCPU_GCB:FAN_CTRL
- default offset: 0x38800000
- DEVCPU_GCB target offset: 0x4000
- FAN_CTRL base = 0xd2
And you get:
(0x38800000 + 0x4000 + 0xd2) × 4 = 0xe2010348
Or you can just task your LLM agent to do the math since its quite annoying.
Regards,
Robert
>
> Acked-by: Conor Dooley <conor.dooley@xxxxxxxxxxxxx>
> pw-bot: not-applicable
>
> Cheers,
> Conor.
>
> > + clocks = <&sys_clk>;
> > + #pwm-cells = <2>;
> > +
> > + fan {
> > + pwms = <&fanctrl 40000 PWM_POLARITY_INVERTED>;
> > + cooling-levels = <0 128 192 255>;
> > + #cooling-cells = <2>;
> > + };
> > + };
> > --
> > 2.56.0
> >
--
Robert Marko
Staff Embedded Linux Engineer
Sartura d.d.
Lendavska ulica 16a
10000 Zagreb, Croatia
Email: robert.marko@xxxxxxxxxx
Web: www.sartura.hr