From: Corey Minyard <minyard@acm.org>
To: Peter Delevoryas <peter@pjd.dev>
Cc: "Cédric Le Goater" <clg@kaod.org>,
"Peter Maydell" <peter.maydell@linaro.org>,
"Andrew Jeffery" <andrew@aj.id.au>,
"Joel Stanley" <joel@jms.id.au>,
"Patrick Venture" <venture@google.com>,
qemu-arm@nongnu.org, qemu-devel@nongnu.org
Subject: Re: [PATCH v2 1/9] hw/i2c/pca954x: Add method to get channels
Date: Tue, 5 Jul 2022 15:06:24 -0500 [thread overview]
Message-ID: <20220705200624.GK908082@minyard.net> (raw)
In-Reply-To: <20220705191400.41632-2-peter@pjd.dev>
On Tue, Jul 05, 2022 at 12:13:52PM -0700, 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.
This is an improvment, I think. But it really needs to be two patches,
one with the I2C portion, and one with the aspeed portion.
Also, the name is a little misleading, you might want to name it
pca954x_i2c_create_get_channels
-corey
>
> 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 <peter@pjd.dev>
> ---
> 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
> --
> 2.37.0
>
>
next prev parent reply other threads:[~2022-07-05 20:07 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20220705191400.41632-1-peter@pjd.dev>
2022-07-05 19:13 ` [PATCH v2 1/9] hw/i2c/pca954x: Add method to get channels Peter Delevoryas
2022-07-05 20:06 ` Corey Minyard [this message]
2022-07-05 21:40 ` Peter Delevoryas
2022-07-05 21:44 ` Peter Delevoryas
2022-07-06 6:06 ` Cédric Le Goater
2022-07-06 7:56 ` Peter Delevoryas
2022-07-05 19:13 ` [PATCH v2 2/9] aspeed: Create SRAM name from first CPU index Peter Delevoryas
2022-07-05 19:13 ` [PATCH v2 3/9] aspeed: Refactor UART init for multi-SoC machines Peter Delevoryas
2022-07-05 19:13 ` [PATCH v2 4/9] aspeed: Make aspeed_board_init_flashes public Peter Delevoryas
2022-07-05 19:13 ` [PATCH v2 5/9] aspeed: Add fby35 skeleton Peter Delevoryas
2022-07-05 19:13 ` [PATCH v2 6/9] aspeed: Add AST2600 (BMC) to fby35 Peter Delevoryas
2022-07-27 10:05 ` Cédric Le Goater
2022-07-27 18:09 ` Peter Delevoryas
2022-07-05 19:13 ` [PATCH v2 7/9] aspeed: fby35: Add a bootrom for the BMC Peter Delevoryas
2022-07-05 19:13 ` [PATCH v2 8/9] aspeed: Add AST1030 (BIC) to fby35 Peter Delevoryas
2022-07-05 19:14 ` [PATCH v2 9/9] docs: aspeed: Add fby35 multi-SoC machine section Peter Delevoryas
2022-07-06 5:58 ` Cédric Le Goater
2022-07-06 7:54 ` Peter Delevoryas
2022-07-06 8:21 ` Joel Stanley
2022-07-06 16:50 ` Peter Delevoryas
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=20220705200624.GK908082@minyard.net \
--to=minyard@acm.org \
--cc=andrew@aj.id.au \
--cc=clg@kaod.org \
--cc=joel@jms.id.au \
--cc=peter.maydell@linaro.org \
--cc=peter@pjd.dev \
--cc=qemu-arm@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=venture@google.com \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.