On Mon, Jul 4, 2022 at 10:46 PM Cédric Le Goater <c...@kaod.org> wrote:
> On 7/4/22 23:54, Peter Delevoryas wrote: > > I added this helper in the Aspeed machine file a while ago to help > > initialize fuji-bmc i2c devices. This moves it to the official pca954x > > file so that other files can use it. > > > > This does something very similar to pca954x_i2c_get_bus, but I think > > this is useful when you have a very complicated dts with a lot of > > switches, like the fuji dts. > > > > This convenience method lets you write code that produces a flat array > > of I2C buses that matches the naming in the dts. After that you can just > > add individual sensors using the flat array of I2C buses. > > > > See fuji_bmc_i2c_init to understand this point further. > > > > The fuji dts is here for reference: > > > > > https://github.com/torvalds/linux/blob/40cb6373b46/arch/arm/boot/dts/aspeed-bmc-facebook-fuji.dts > > > > Signed-off-by: Peter Delevoryas <pe...@pjd.dev> > > Reviewed-by: Cédric Le Goater <c...@kaod.org> > Reviewed-by: Patrick Venture <vent...@google.com> > > Thanks, > > Neato :) > C. > > > > --- > > hw/arm/aspeed.c | 29 +++++++++-------------------- > > hw/i2c/i2c_mux_pca954x.c | 10 ++++++++++ > > include/hw/i2c/i2c_mux_pca954x.h | 13 +++++++++++++ > > 3 files changed, 32 insertions(+), 20 deletions(-) > > > > diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c > > index 6fe9b13548..bee8a748ec 100644 > > --- a/hw/arm/aspeed.c > > +++ b/hw/arm/aspeed.c > > @@ -793,15 +793,6 @@ static void rainier_bmc_i2c_init(AspeedMachineState > *bmc) > > create_pca9552(soc, 15, 0x60); > > } > > > > -static void get_pca9548_channels(I2CBus *bus, uint8_t mux_addr, > > - I2CBus **channels) > > -{ > > - I2CSlave *mux = i2c_slave_create_simple(bus, "pca9548", mux_addr); > > - for (int i = 0; i < 8; i++) { > > - channels[i] = pca954x_i2c_get_bus(mux, i); > > - } > > -} > > - > > #define TYPE_LM75 TYPE_TMP105 > > #define TYPE_TMP75 TYPE_TMP105 > > #define TYPE_TMP422 "tmp422" > > @@ -814,20 +805,18 @@ static void fuji_bmc_i2c_init(AspeedMachineState > *bmc) > > for (int i = 0; i < 16; i++) { > > i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i); > > } > > - I2CBus *i2c180 = i2c[2]; > > - I2CBus *i2c480 = i2c[8]; > > - I2CBus *i2c600 = i2c[11]; > > > > - get_pca9548_channels(i2c180, 0x70, &i2c[16]); > > - get_pca9548_channels(i2c480, 0x70, &i2c[24]); > > + pca954x_i2c_get_channels(i2c[2], 0x70, "pca9548", &i2c[16]); > > + pca954x_i2c_get_channels(i2c[8], 0x70, "pca9548", &i2c[24]); > > /* NOTE: The device tree skips [32, 40) in the alias numbering */ > > - get_pca9548_channels(i2c600, 0x77, &i2c[40]); > > - get_pca9548_channels(i2c[24], 0x71, &i2c[48]); > > - get_pca9548_channels(i2c[25], 0x72, &i2c[56]); > > - get_pca9548_channels(i2c[26], 0x76, &i2c[64]); > > - get_pca9548_channels(i2c[27], 0x76, &i2c[72]); > > + pca954x_i2c_get_channels(i2c[11], 0x77, "pca9548", &i2c[40]); > > + pca954x_i2c_get_channels(i2c[24], 0x71, "pca9548", &i2c[48]); > > + pca954x_i2c_get_channels(i2c[25], 0x72, "pca9548", &i2c[56]); > > + pca954x_i2c_get_channels(i2c[26], 0x76, "pca9548", &i2c[64]); > > + pca954x_i2c_get_channels(i2c[27], 0x76, "pca9548", &i2c[72]); > > for (int i = 0; i < 8; i++) { > > - get_pca9548_channels(i2c[40 + i], 0x76, &i2c[80 + i * 8]); > > + pca954x_i2c_get_channels(i2c[40 + i], 0x76, "pca9548", > > + &i2c[80 + i * 8]); > > } > > > > i2c_slave_create_simple(i2c[17], TYPE_LM75, 0x4c); > > diff --git a/hw/i2c/i2c_mux_pca954x.c b/hw/i2c/i2c_mux_pca954x.c > > index 3945de795c..6b07804546 100644 > > --- a/hw/i2c/i2c_mux_pca954x.c > > +++ b/hw/i2c/i2c_mux_pca954x.c > > @@ -169,6 +169,16 @@ I2CBus *pca954x_i2c_get_bus(I2CSlave *mux, uint8_t > channel) > > return pca954x->bus[channel]; > > } > > > > +void pca954x_i2c_get_channels(I2CBus *bus, uint8_t address, > > + const char *type_name, I2CBus **channels) > > +{ > > + I2CSlave *mux = i2c_slave_create_simple(bus, type_name, address); > > + Pca954xClass *pc = PCA954X_GET_CLASS(mux); > > + Pca954xState *pca954x = PCA954X(mux); > > + > > + memcpy(channels, pca954x->bus, pc->nchans * sizeof(channels[0])); > > +} > > + > > static void pca9546_class_init(ObjectClass *klass, void *data) > > { > > Pca954xClass *s = PCA954X_CLASS(klass); > > diff --git a/include/hw/i2c/i2c_mux_pca954x.h > b/include/hw/i2c/i2c_mux_pca954x.h > > index 3dd25ec983..3a676a30a9 100644 > > --- a/include/hw/i2c/i2c_mux_pca954x.h > > +++ b/include/hw/i2c/i2c_mux_pca954x.h > > @@ -16,4 +16,17 @@ > > */ > > I2CBus *pca954x_i2c_get_bus(I2CSlave *mux, uint8_t channel); > > > > +/** > > + * Creates an i2c mux and retrieves all of the channels associated with > it. > > + * > > + * @bus: the i2c bus where the i2c mux resides. > > + * @address: the address of the i2c mux on the aforementioned i2c bus. > > + * @type_name: name of the i2c mux type to create. > > + * @channels: an output parameter specifying where to return the > channels. > > + * > > + * Returns: None > > + */ > > +void pca954x_i2c_get_channels(I2CBus *bus, uint8_t address, > > + const char *type_name, I2CBus **channels); > > + > > #endif > >