On Fri, 5 Mar 2021 at 18:40, Hao Wu <wuhao...@google.com> wrote: > > This patch adds fan_splitters (split IRQs) in NPCM7XX boards. Each fan > splitter corresponds to 1 PWM output and can connect to multiple fan > inputs (MFT devices). > In NPCM7XX boards(NPCM750 EVB and Quanta GSJ boards), we initializes > these splitters and connect them to their corresponding modules > according their specific device trees. > > Reviewed-by: Doug Evans <d...@google.com> > Reviewed-by: Tyrone Ting <kft...@nuvoton.com> > Signed-off-by: Hao Wu <wuhao...@google.com> > --- > hw/arm/npcm7xx_boards.c | 99 ++++++++++++++++++++++++++++++++++++++++ > include/hw/arm/npcm7xx.h | 11 ++++- > 2 files changed, 109 insertions(+), 1 deletion(-) > > diff --git a/hw/arm/npcm7xx_boards.c b/hw/arm/npcm7xx_boards.c > index fbf6ce8e02..e22fe4bf8f 100644 > --- a/hw/arm/npcm7xx_boards.c > +++ b/hw/arm/npcm7xx_boards.c > @@ -21,6 +21,7 @@ > #include "hw/core/cpu.h" > #include "hw/i2c/smbus_eeprom.h" > #include "hw/loader.h" > +#include "hw/qdev-core.h" > #include "hw/qdev-properties.h" > #include "qapi/error.h" > #include "qemu-common.h" > @@ -116,6 +117,64 @@ static void at24c_eeprom_init(NPCM7xxState *soc, int > bus, uint8_t addr, > i2c_slave_realize_and_unref(i2c_dev, i2c_bus, &error_abort); > } > > +static void npcm7xx_init_pwm_splitter(NPCM7xxMachine *machine, > + NPCM7xxState *soc, const int > *fan_counts) > +{ > + SplitIRQ *splitters = machine->fan_splitter; > + > + /* > + * PWM 0~3 belong to module 0 output 0~3. > + * PWM 4~7 belong to module 1 output 0~3. > + */ > + for (int i = 0; i < NPCM7XX_NR_PWM_MODULES; ++i) { > + for (int j = 0; j < NPCM7XX_PWM_PER_MODULE; ++j) { > + int splitter_no = i * NPCM7XX_PWM_PER_MODULE + j; > + DeviceState *splitter; > + > + if (fan_counts[splitter_no] < 1) { > + continue; > + } > + object_initialize_child(OBJECT(machine), "fan-splitter[*]", > + &splitters[splitter_no], TYPE_SPLIT_IRQ); > + splitter = DEVICE(&splitters[splitter_no]); > + qdev_prop_set_uint16(splitter, "num-lines", > + fan_counts[splitter_no]); > + qdev_realize(splitter, NULL, &error_abort); > + qdev_connect_gpio_out_named(DEVICE(&soc->pwm[i]), > "duty-gpio-out", > + j, qdev_get_gpio_in(splitter, 0));
This will rather pointlessly create a splitter with a single input if fan_counts[n] is 1, but conveniently you never actually do that, so it's not a big deal. Reviewed-by: Peter Maydell <peter.mayd...@linaro.org> thanks -- PMM