On 6/29/23 13:09, Philippe Mathieu-Daudé wrote:
> On 7/6/23 06:39, Cédric Le Goater wrote:
>> Simple routine to retrieve a DeviceState object on a SPI bus using its
>> address/cs. It will be useful for the board to wire the CS lines.
>>
>> Cc: Alistair Francis <alistair@alistair23.me>
>> Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
>> Signed-off-by: Cédric Le Goater <clg@kaod.org>
>> ---
>> include/hw/ssi/ssi.h | 2 ++
>> hw/ssi/ssi.c | 15 +++++++++++++++
>> 2 files changed, 17 insertions(+)
>>
>> diff --git a/include/hw/ssi/ssi.h b/include/hw/ssi/ssi.h
>> index 9e0706a5248c..01662521b09a 100644
>> --- a/include/hw/ssi/ssi.h
>> +++ b/include/hw/ssi/ssi.h
>> @@ -112,4 +112,6 @@ SSIBus *ssi_create_bus(DeviceState *parent, const char *name);
>> uint32_t ssi_transfer(SSIBus *bus, uint32_t val);
>> +DeviceState *ssi_get_cs(SSIBus *bus, uint8_t addr);
>
> Revisiting this patch, I now think this should be:
>
> qemu_irq ssi_get_cs(SSIBus *bus, uint8_t chipselect);
The device is needed for some other use. See :
[PATCH v2 10/12] aspeed: Get the BlockBackend of FMC0 from the flash device
C.
>
>
>> #endif
>> diff --git a/hw/ssi/ssi.c b/hw/ssi/ssi.c
>> index d4409535429c..7c71fce0db90 100644
>> --- a/hw/ssi/ssi.c
>> +++ b/hw/ssi/ssi.c
>> @@ -27,6 +27,21 @@ struct SSIBus {
>> #define TYPE_SSI_BUS "SSI"
>> OBJECT_DECLARE_SIMPLE_TYPE(SSIBus, SSI_BUS)
>> +DeviceState *ssi_get_cs(SSIBus *bus, uint8_t addr)
>> +{
>> + BusState *b = BUS(bus);
>> + BusChild *kid;
>> +
>> + QTAILQ_FOREACH(kid, &b->children, sibling) {
>> + SSIPeripheral *kid_ssi = SSI_PERIPHERAL(kid->child);
>> + if (kid_ssi->addr == addr) {
>> + return kid->child;
>
> and:
>
> return qdev_get_gpio_in_named(kid->child,
> SSI_GPIO_CS, 0);
>
>> + }
>> + }
>> +
>> + return NULL;
>> +}
>> +
>> static const TypeInfo ssi_bus_info = {
>> .name = TYPE_SSI_BUS,
>> .parent = TYPE_BUS,
>