[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-ppc] [PATCH 12/17] e500: add i2c controller to CCSR
From: |
Michael Davidsaver |
Subject: |
Re: [Qemu-ppc] [PATCH 12/17] e500: add i2c controller to CCSR |
Date: |
Tue, 5 Dec 2017 22:26:16 -0500 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.4.0 |
On 12/05/2017 01:49 AM, David Gibson wrote:
> On Sun, Nov 26, 2017 at 03:59:10PM -0600, Michael Davidsaver wrote:
>> Add i2c controller found on mpc8540,
>> mpc8544, and P2010 (newer ppc, unmodeled).
>
> This adds it unconditionally. Are there any E500 models where it
> doesn't exist?
Not in the devices I've looked at, though I certainly haven't looked
at them all. In fact the mpc8544 has two i2c controllers.
I keep mentioning the P2010 as it is about a decade
newer than the mpc85xx chips. My _assumption_ is that the commonalities
between these are a reasonable least common denominator.
>>
>> Signed-off-by: Michael Davidsaver <address@hidden>
>> ---
>> hw/ppc/e500_ccsr.c | 15 +++++++++++++++
>> 1 file changed, 15 insertions(+)
>>
>> diff --git a/hw/ppc/e500_ccsr.c b/hw/ppc/e500_ccsr.c
>> index c479ed91ee..cd8216daaf 100644
>> --- a/hw/ppc/e500_ccsr.c
>> +++ b/hw/ppc/e500_ccsr.c
>> @@ -46,6 +46,8 @@
>> #define E500_ERR_DETECT (0x2e40)
>> #define E500_ERR_DISABLE (0x2e44)
>>
>> +#define E500_I2C_OFFSET (0x3000)
>> +
>> #define E500_DUART_OFFSET(N) (0x4500 + (N) * 0x100)
>>
>> #define E500_PORPLLSR (0xE0000)
>> @@ -72,6 +74,7 @@ typedef struct {
>> uint32_t ccb_freq;
>>
>> DeviceState *pic;
>> + DeviceState *i2c;
>> } CCSRState;
>>
>> #define TYPE_E500_CCSR "e500-ccsr"
>> @@ -272,6 +275,18 @@ static void e500_ccsr_realize(DeviceState *dev, Error
>> **errp)
>> sysbus_mmio_get_region(pic, 0));
>> /* Note: MPIC internal interrupts are offset by 16 */
>>
>> + /* attach I2C controller */
>> + ccsr->i2c = qdev_create(NULL, "mpc8540-i2c");
>
> Ah.. so I think I missed this on many earlier patches. I believe
> you're not generally supposed to create new subdevices at realize()
> time. Instead the device should be created at CCSR instance_init()
> time (but the sub device's "realized" property will need to be set to
> 1 from CCSR realize()).
>
>> + object_property_add_child(qdev_get_machine(), "i2c[*]",
>> + OBJECT(ccsr->i2c), NULL);
>> + qdev_init_nofail(ccsr->i2c);
>> + memory_region_add_subregion(&ccsr->iomem, E500_I2C_OFFSET,
>> + sysbus_mmio_get_region(
>> + SYS_BUS_DEVICE(ccsr->i2c), 0));
>> + sysbus_connect_irq(SYS_BUS_DEVICE(ccsr->i2c), 0,
>> + qdev_get_gpio_in(ccsr->pic, 16 + 27));
>> +
>> +
>> /* DUARTS */
>> /* for mpc8540, mpc8544, and P2010 (unmodeled), the DUART reference
>> clock
>> * is the CCB clock divided by 16.
>
signature.asc
Description: OpenPGP digital signature