165ca801bSBALATON Zoltan /* 265ca801bSBALATON Zoltan * PPC4xx I2C controller emulation 365ca801bSBALATON Zoltan * 465ca801bSBALATON Zoltan * Copyright (c) 2007 Jocelyn Mayer 57709dbf1SBALATON Zoltan * Copyright (c) 2012 François Revol 639aeba6cSBALATON Zoltan * Copyright (c) 2016-2018 BALATON Zoltan 765ca801bSBALATON Zoltan * 865ca801bSBALATON Zoltan * Permission is hereby granted, free of charge, to any person obtaining a copy 965ca801bSBALATON Zoltan * of this software and associated documentation files (the "Software"), to deal 1065ca801bSBALATON Zoltan * in the Software without restriction, including without limitation the rights 1165ca801bSBALATON Zoltan * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 1265ca801bSBALATON Zoltan * copies of the Software, and to permit persons to whom the Software is 1365ca801bSBALATON Zoltan * furnished to do so, subject to the following conditions: 1465ca801bSBALATON Zoltan * 1565ca801bSBALATON Zoltan * The above copyright notice and this permission notice shall be included in 1665ca801bSBALATON Zoltan * all copies or substantial portions of the Software. 1765ca801bSBALATON Zoltan * 1865ca801bSBALATON Zoltan * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1965ca801bSBALATON Zoltan * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 2065ca801bSBALATON Zoltan * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 2165ca801bSBALATON Zoltan * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 2265ca801bSBALATON Zoltan * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 2365ca801bSBALATON Zoltan * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 2465ca801bSBALATON Zoltan * THE SOFTWARE. 2565ca801bSBALATON Zoltan */ 2665ca801bSBALATON Zoltan 2765ca801bSBALATON Zoltan #include "qemu/osdep.h" 287709dbf1SBALATON Zoltan #include "qemu/log.h" 29*0b8fa32fSMarkus Armbruster #include "qemu/module.h" 3065ca801bSBALATON Zoltan #include "cpu.h" 3165ca801bSBALATON Zoltan #include "hw/hw.h" 323b09bb0fSBALATON Zoltan #include "hw/i2c/ppc4xx_i2c.h" 33ef9173a5SBALATON Zoltan #include "bitbang_i2c.h" 3465ca801bSBALATON Zoltan 3542a907e8SBALATON Zoltan #define PPC4xx_I2C_MEM_SIZE 18 3665ca801bSBALATON Zoltan 37afb6e204SBALATON Zoltan enum { 38afb6e204SBALATON Zoltan IIC_MDBUF = 0, 39afb6e204SBALATON Zoltan /* IIC_SDBUF = 2, */ 40afb6e204SBALATON Zoltan IIC_LMADR = 4, 41afb6e204SBALATON Zoltan IIC_HMADR, 42afb6e204SBALATON Zoltan IIC_CNTL, 43afb6e204SBALATON Zoltan IIC_MDCNTL, 44afb6e204SBALATON Zoltan IIC_STS, 45afb6e204SBALATON Zoltan IIC_EXTSTS, 46afb6e204SBALATON Zoltan IIC_LSADR, 47afb6e204SBALATON Zoltan IIC_HSADR, 48afb6e204SBALATON Zoltan IIC_CLKDIV, 49afb6e204SBALATON Zoltan IIC_INTRMSK, 50afb6e204SBALATON Zoltan IIC_XFRCNT, 51afb6e204SBALATON Zoltan IIC_XTCNTLSS, 52afb6e204SBALATON Zoltan IIC_DIRECTCNTL 53afb6e204SBALATON Zoltan /* IIC_INTR */ 54afb6e204SBALATON Zoltan }; 55afb6e204SBALATON Zoltan 567709dbf1SBALATON Zoltan #define IIC_CNTL_PT (1 << 0) 577709dbf1SBALATON Zoltan #define IIC_CNTL_READ (1 << 1) 587709dbf1SBALATON Zoltan #define IIC_CNTL_CHT (1 << 2) 597709dbf1SBALATON Zoltan #define IIC_CNTL_RPST (1 << 3) 60afb6e204SBALATON Zoltan #define IIC_CNTL_AMD (1 << 6) 61afb6e204SBALATON Zoltan #define IIC_CNTL_HMT (1 << 7) 62afb6e204SBALATON Zoltan 63afb6e204SBALATON Zoltan #define IIC_MDCNTL_EINT (1 << 2) 64afb6e204SBALATON Zoltan #define IIC_MDCNTL_ESM (1 << 3) 65afb6e204SBALATON Zoltan #define IIC_MDCNTL_FMDB (1 << 6) 667709dbf1SBALATON Zoltan 677709dbf1SBALATON Zoltan #define IIC_STS_PT (1 << 0) 68afb6e204SBALATON Zoltan #define IIC_STS_IRQA (1 << 1) 697709dbf1SBALATON Zoltan #define IIC_STS_ERR (1 << 2) 70afb6e204SBALATON Zoltan #define IIC_STS_MDBF (1 << 4) 717709dbf1SBALATON Zoltan #define IIC_STS_MDBS (1 << 5) 727709dbf1SBALATON Zoltan 737709dbf1SBALATON Zoltan #define IIC_EXTSTS_XFRA (1 << 0) 74afb6e204SBALATON Zoltan #define IIC_EXTSTS_BCS_FREE (4 << 4) 75afb6e204SBALATON Zoltan #define IIC_EXTSTS_BCS_BUSY (5 << 4) 76afb6e204SBALATON Zoltan 77afb6e204SBALATON Zoltan #define IIC_INTRMSK_EIMTC (1 << 0) 78afb6e204SBALATON Zoltan #define IIC_INTRMSK_EITA (1 << 1) 79afb6e204SBALATON Zoltan #define IIC_INTRMSK_EIIC (1 << 2) 80afb6e204SBALATON Zoltan #define IIC_INTRMSK_EIHE (1 << 3) 817709dbf1SBALATON Zoltan 827709dbf1SBALATON Zoltan #define IIC_XTCNTLSS_SRST (1 << 0) 837709dbf1SBALATON Zoltan 84ef9173a5SBALATON Zoltan #define IIC_DIRECTCNTL_SDAC (1 << 3) 85ef9173a5SBALATON Zoltan #define IIC_DIRECTCNTL_SCLC (1 << 2) 86ef9173a5SBALATON Zoltan #define IIC_DIRECTCNTL_MSDA (1 << 1) 87ef9173a5SBALATON Zoltan #define IIC_DIRECTCNTL_MSCL (1 << 0) 88ef9173a5SBALATON Zoltan 897709dbf1SBALATON Zoltan static void ppc4xx_i2c_reset(DeviceState *s) 907709dbf1SBALATON Zoltan { 917709dbf1SBALATON Zoltan PPC4xxI2CState *i2c = PPC4xx_I2C(s); 927709dbf1SBALATON Zoltan 93afb6e204SBALATON Zoltan i2c->mdidx = -1; 94afb6e204SBALATON Zoltan memset(i2c->mdata, 0, ARRAY_SIZE(i2c->mdata)); 95afb6e204SBALATON Zoltan /* [hl][ms]addr are not affected by reset */ 967709dbf1SBALATON Zoltan i2c->cntl = 0; 977709dbf1SBALATON Zoltan i2c->mdcntl = 0; 987709dbf1SBALATON Zoltan i2c->sts = 0; 99afb6e204SBALATON Zoltan i2c->extsts = IIC_EXTSTS_BCS_FREE; 1007709dbf1SBALATON Zoltan i2c->clkdiv = 0; 1017709dbf1SBALATON Zoltan i2c->intrmsk = 0; 1027709dbf1SBALATON Zoltan i2c->xfrcnt = 0; 1037709dbf1SBALATON Zoltan i2c->xtcntlss = 0; 104afb6e204SBALATON Zoltan i2c->directcntl = 0xf; /* all non-reserved bits set */ 1057709dbf1SBALATON Zoltan } 10665ca801bSBALATON Zoltan 1073b09bb0fSBALATON Zoltan static uint64_t ppc4xx_i2c_readb(void *opaque, hwaddr addr, unsigned int size) 10865ca801bSBALATON Zoltan { 1093b09bb0fSBALATON Zoltan PPC4xxI2CState *i2c = PPC4xx_I2C(opaque); 1103b09bb0fSBALATON Zoltan uint64_t ret; 111afb6e204SBALATON Zoltan int i; 11265ca801bSBALATON Zoltan 11365ca801bSBALATON Zoltan switch (addr) { 114afb6e204SBALATON Zoltan case IIC_MDBUF: 115afb6e204SBALATON Zoltan if (i2c->mdidx < 0) { 1167709dbf1SBALATON Zoltan ret = 0xff; 117afb6e204SBALATON Zoltan break; 1187709dbf1SBALATON Zoltan } 119afb6e204SBALATON Zoltan ret = i2c->mdata[0]; 120afb6e204SBALATON Zoltan if (i2c->mdidx == 3) { 121afb6e204SBALATON Zoltan i2c->sts &= ~IIC_STS_MDBF; 122afb6e204SBALATON Zoltan } else if (i2c->mdidx == 0) { 1237709dbf1SBALATON Zoltan i2c->sts &= ~IIC_STS_MDBS; 1247709dbf1SBALATON Zoltan } 125afb6e204SBALATON Zoltan for (i = 0; i < i2c->mdidx; i++) { 126afb6e204SBALATON Zoltan i2c->mdata[i] = i2c->mdata[i + 1]; 1277709dbf1SBALATON Zoltan } 128afb6e204SBALATON Zoltan if (i2c->mdidx >= 0) { 129afb6e204SBALATON Zoltan i2c->mdidx--; 1307709dbf1SBALATON Zoltan } 13165ca801bSBALATON Zoltan break; 132afb6e204SBALATON Zoltan case IIC_LMADR: 13365ca801bSBALATON Zoltan ret = i2c->lmadr; 13465ca801bSBALATON Zoltan break; 135afb6e204SBALATON Zoltan case IIC_HMADR: 13665ca801bSBALATON Zoltan ret = i2c->hmadr; 13765ca801bSBALATON Zoltan break; 138afb6e204SBALATON Zoltan case IIC_CNTL: 13965ca801bSBALATON Zoltan ret = i2c->cntl; 14065ca801bSBALATON Zoltan break; 141afb6e204SBALATON Zoltan case IIC_MDCNTL: 14265ca801bSBALATON Zoltan ret = i2c->mdcntl; 14365ca801bSBALATON Zoltan break; 144afb6e204SBALATON Zoltan case IIC_STS: 14565ca801bSBALATON Zoltan ret = i2c->sts; 14665ca801bSBALATON Zoltan break; 147afb6e204SBALATON Zoltan case IIC_EXTSTS: 148afb6e204SBALATON Zoltan ret = i2c_bus_busy(i2c->bus) ? 149afb6e204SBALATON Zoltan IIC_EXTSTS_BCS_BUSY : IIC_EXTSTS_BCS_FREE; 15065ca801bSBALATON Zoltan break; 151afb6e204SBALATON Zoltan case IIC_LSADR: 15265ca801bSBALATON Zoltan ret = i2c->lsadr; 15365ca801bSBALATON Zoltan break; 154afb6e204SBALATON Zoltan case IIC_HSADR: 15565ca801bSBALATON Zoltan ret = i2c->hsadr; 15665ca801bSBALATON Zoltan break; 157afb6e204SBALATON Zoltan case IIC_CLKDIV: 15865ca801bSBALATON Zoltan ret = i2c->clkdiv; 15965ca801bSBALATON Zoltan break; 160afb6e204SBALATON Zoltan case IIC_INTRMSK: 16165ca801bSBALATON Zoltan ret = i2c->intrmsk; 16265ca801bSBALATON Zoltan break; 163afb6e204SBALATON Zoltan case IIC_XFRCNT: 16465ca801bSBALATON Zoltan ret = i2c->xfrcnt; 16565ca801bSBALATON Zoltan break; 166afb6e204SBALATON Zoltan case IIC_XTCNTLSS: 16765ca801bSBALATON Zoltan ret = i2c->xtcntlss; 16865ca801bSBALATON Zoltan break; 169afb6e204SBALATON Zoltan case IIC_DIRECTCNTL: 17065ca801bSBALATON Zoltan ret = i2c->directcntl; 17165ca801bSBALATON Zoltan break; 17265ca801bSBALATON Zoltan default: 17342a907e8SBALATON Zoltan if (addr < PPC4xx_I2C_MEM_SIZE) { 17442a907e8SBALATON Zoltan qemu_log_mask(LOG_UNIMP, "%s: Unimplemented register 0x%" 17542a907e8SBALATON Zoltan HWADDR_PRIx "\n", __func__, addr); 17642a907e8SBALATON Zoltan } else { 17742a907e8SBALATON Zoltan qemu_log_mask(LOG_GUEST_ERROR, "%s: Bad address 0x%" 17842a907e8SBALATON Zoltan HWADDR_PRIx "\n", __func__, addr); 17942a907e8SBALATON Zoltan } 1807709dbf1SBALATON Zoltan ret = 0; 18165ca801bSBALATON Zoltan break; 18265ca801bSBALATON Zoltan } 18365ca801bSBALATON Zoltan return ret; 18465ca801bSBALATON Zoltan } 18565ca801bSBALATON Zoltan 1863b09bb0fSBALATON Zoltan static void ppc4xx_i2c_writeb(void *opaque, hwaddr addr, uint64_t value, 1873b09bb0fSBALATON Zoltan unsigned int size) 18865ca801bSBALATON Zoltan { 1893b09bb0fSBALATON Zoltan PPC4xxI2CState *i2c = opaque; 1907709dbf1SBALATON Zoltan 19165ca801bSBALATON Zoltan switch (addr) { 192afb6e204SBALATON Zoltan case IIC_MDBUF: 193afb6e204SBALATON Zoltan if (i2c->mdidx >= 3) { 194afb6e204SBALATON Zoltan break; 1957709dbf1SBALATON Zoltan } 196afb6e204SBALATON Zoltan i2c->mdata[++i2c->mdidx] = value; 197afb6e204SBALATON Zoltan if (i2c->mdidx == 3) { 198afb6e204SBALATON Zoltan i2c->sts |= IIC_STS_MDBF; 199afb6e204SBALATON Zoltan } else if (i2c->mdidx == 0) { 200afb6e204SBALATON Zoltan i2c->sts |= IIC_STS_MDBS; 2017709dbf1SBALATON Zoltan } 20265ca801bSBALATON Zoltan break; 203afb6e204SBALATON Zoltan case IIC_LMADR: 20465ca801bSBALATON Zoltan i2c->lmadr = value; 20565ca801bSBALATON Zoltan break; 206afb6e204SBALATON Zoltan case IIC_HMADR: 20765ca801bSBALATON Zoltan i2c->hmadr = value; 20865ca801bSBALATON Zoltan break; 209afb6e204SBALATON Zoltan case IIC_CNTL: 210afb6e204SBALATON Zoltan i2c->cntl = value & ~IIC_CNTL_PT; 211afb6e204SBALATON Zoltan if (value & IIC_CNTL_AMD) { 212afb6e204SBALATON Zoltan qemu_log_mask(LOG_UNIMP, "%s: only 7 bit addresses supported\n", 213afb6e204SBALATON Zoltan __func__); 2147709dbf1SBALATON Zoltan } 215afb6e204SBALATON Zoltan if (value & IIC_CNTL_HMT && i2c_bus_busy(i2c->bus)) { 216afb6e204SBALATON Zoltan i2c_end_transfer(i2c->bus); 217afb6e204SBALATON Zoltan if (i2c->mdcntl & IIC_MDCNTL_EINT && 218afb6e204SBALATON Zoltan i2c->intrmsk & IIC_INTRMSK_EIHE) { 219afb6e204SBALATON Zoltan i2c->sts |= IIC_STS_IRQA; 220afb6e204SBALATON Zoltan qemu_irq_raise(i2c->irq); 221afb6e204SBALATON Zoltan } 222afb6e204SBALATON Zoltan } else if (value & IIC_CNTL_PT) { 223afb6e204SBALATON Zoltan int recv = (value & IIC_CNTL_READ) >> 1; 224afb6e204SBALATON Zoltan int tct = value >> 4 & 3; 225afb6e204SBALATON Zoltan int i; 226afb6e204SBALATON Zoltan 227afb6e204SBALATON Zoltan if (recv && (i2c->lmadr >> 1) >= 0x50 && (i2c->lmadr >> 1) < 0x58) { 228afb6e204SBALATON Zoltan /* smbus emulation does not like multi byte reads w/o restart */ 229afb6e204SBALATON Zoltan value |= IIC_CNTL_RPST; 230afb6e204SBALATON Zoltan } 231afb6e204SBALATON Zoltan 232afb6e204SBALATON Zoltan for (i = 0; i <= tct; i++) { 233afb6e204SBALATON Zoltan if (!i2c_bus_busy(i2c->bus)) { 234afb6e204SBALATON Zoltan i2c->extsts = IIC_EXTSTS_BCS_FREE; 235afb6e204SBALATON Zoltan if (i2c_start_transfer(i2c->bus, i2c->lmadr >> 1, recv)) { 2367709dbf1SBALATON Zoltan i2c->sts |= IIC_STS_ERR; 2377709dbf1SBALATON Zoltan i2c->extsts |= IIC_EXTSTS_XFRA; 238afb6e204SBALATON Zoltan break; 2397709dbf1SBALATON Zoltan } else { 2407709dbf1SBALATON Zoltan i2c->sts &= ~IIC_STS_ERR; 2417709dbf1SBALATON Zoltan } 242afb6e204SBALATON Zoltan } 243afb6e204SBALATON Zoltan if (!(i2c->sts & IIC_STS_ERR) && 244afb6e204SBALATON Zoltan i2c_send_recv(i2c->bus, &i2c->mdata[i], !recv)) { 245afb6e204SBALATON Zoltan i2c->sts |= IIC_STS_ERR; 246afb6e204SBALATON Zoltan i2c->extsts |= IIC_EXTSTS_XFRA; 247afb6e204SBALATON Zoltan break; 248afb6e204SBALATON Zoltan } 249afb6e204SBALATON Zoltan if (value & IIC_CNTL_RPST || !(value & IIC_CNTL_CHT)) { 250afb6e204SBALATON Zoltan i2c_end_transfer(i2c->bus); 251afb6e204SBALATON Zoltan } 252afb6e204SBALATON Zoltan } 253afb6e204SBALATON Zoltan i2c->xfrcnt = i; 254afb6e204SBALATON Zoltan i2c->mdidx = i - 1; 255afb6e204SBALATON Zoltan if (recv && i2c->mdidx >= 0) { 256afb6e204SBALATON Zoltan i2c->sts |= IIC_STS_MDBS; 257afb6e204SBALATON Zoltan } 258afb6e204SBALATON Zoltan if (recv && i2c->mdidx == 3) { 259afb6e204SBALATON Zoltan i2c->sts |= IIC_STS_MDBF; 260afb6e204SBALATON Zoltan } 261afb6e204SBALATON Zoltan if (i && i2c->mdcntl & IIC_MDCNTL_EINT && 262afb6e204SBALATON Zoltan i2c->intrmsk & IIC_INTRMSK_EIMTC) { 263afb6e204SBALATON Zoltan i2c->sts |= IIC_STS_IRQA; 264afb6e204SBALATON Zoltan qemu_irq_raise(i2c->irq); 2657709dbf1SBALATON Zoltan } 2667709dbf1SBALATON Zoltan } 26765ca801bSBALATON Zoltan break; 268afb6e204SBALATON Zoltan case IIC_MDCNTL: 269afb6e204SBALATON Zoltan i2c->mdcntl = value & 0x3d; 270afb6e204SBALATON Zoltan if (value & IIC_MDCNTL_ESM) { 271afb6e204SBALATON Zoltan qemu_log_mask(LOG_UNIMP, "%s: slave mode not implemented\n", 272afb6e204SBALATON Zoltan __func__); 273afb6e204SBALATON Zoltan } 274afb6e204SBALATON Zoltan if (value & IIC_MDCNTL_FMDB) { 275afb6e204SBALATON Zoltan i2c->mdidx = -1; 276afb6e204SBALATON Zoltan memset(i2c->mdata, 0, ARRAY_SIZE(i2c->mdata)); 277afb6e204SBALATON Zoltan i2c->sts &= ~(IIC_STS_MDBF | IIC_STS_MDBS); 278afb6e204SBALATON Zoltan } 27965ca801bSBALATON Zoltan break; 280afb6e204SBALATON Zoltan case IIC_STS: 281afb6e204SBALATON Zoltan i2c->sts &= ~(value & 0x0a); 282afb6e204SBALATON Zoltan if (value & IIC_STS_IRQA && i2c->mdcntl & IIC_MDCNTL_EINT) { 283afb6e204SBALATON Zoltan qemu_irq_lower(i2c->irq); 284afb6e204SBALATON Zoltan } 28565ca801bSBALATON Zoltan break; 286afb6e204SBALATON Zoltan case IIC_EXTSTS: 28742a907e8SBALATON Zoltan i2c->extsts &= ~(value & 0x8f); 28865ca801bSBALATON Zoltan break; 289afb6e204SBALATON Zoltan case IIC_LSADR: 29065ca801bSBALATON Zoltan i2c->lsadr = value; 29165ca801bSBALATON Zoltan break; 292afb6e204SBALATON Zoltan case IIC_HSADR: 29365ca801bSBALATON Zoltan i2c->hsadr = value; 29465ca801bSBALATON Zoltan break; 295afb6e204SBALATON Zoltan case IIC_CLKDIV: 29665ca801bSBALATON Zoltan i2c->clkdiv = value; 29765ca801bSBALATON Zoltan break; 298afb6e204SBALATON Zoltan case IIC_INTRMSK: 29965ca801bSBALATON Zoltan i2c->intrmsk = value; 30065ca801bSBALATON Zoltan break; 301afb6e204SBALATON Zoltan case IIC_XFRCNT: 30265ca801bSBALATON Zoltan i2c->xfrcnt = value & 0x77; 30365ca801bSBALATON Zoltan break; 304afb6e204SBALATON Zoltan case IIC_XTCNTLSS: 305afb6e204SBALATON Zoltan i2c->xtcntlss &= ~(value & 0xf0); 3067709dbf1SBALATON Zoltan if (value & IIC_XTCNTLSS_SRST) { 3077709dbf1SBALATON Zoltan /* Is it actually a full reset? U-Boot sets some regs before */ 3087709dbf1SBALATON Zoltan ppc4xx_i2c_reset(DEVICE(i2c)); 3097709dbf1SBALATON Zoltan break; 3107709dbf1SBALATON Zoltan } 31165ca801bSBALATON Zoltan break; 312afb6e204SBALATON Zoltan case IIC_DIRECTCNTL: 313ef9173a5SBALATON Zoltan i2c->directcntl = value & (IIC_DIRECTCNTL_SDAC & IIC_DIRECTCNTL_SCLC); 314ef9173a5SBALATON Zoltan i2c->directcntl |= (value & IIC_DIRECTCNTL_SCLC ? 1 : 0); 315ef9173a5SBALATON Zoltan bitbang_i2c_set(i2c->bitbang, BITBANG_I2C_SCL, 316ef9173a5SBALATON Zoltan i2c->directcntl & IIC_DIRECTCNTL_MSCL); 317ef9173a5SBALATON Zoltan i2c->directcntl |= bitbang_i2c_set(i2c->bitbang, BITBANG_I2C_SDA, 318ef9173a5SBALATON Zoltan (value & IIC_DIRECTCNTL_SDAC) != 0) << 1; 31965ca801bSBALATON Zoltan break; 3207709dbf1SBALATON Zoltan default: 32142a907e8SBALATON Zoltan if (addr < PPC4xx_I2C_MEM_SIZE) { 32242a907e8SBALATON Zoltan qemu_log_mask(LOG_UNIMP, "%s: Unimplemented register 0x%" 32342a907e8SBALATON Zoltan HWADDR_PRIx "\n", __func__, addr); 32442a907e8SBALATON Zoltan } else { 32542a907e8SBALATON Zoltan qemu_log_mask(LOG_GUEST_ERROR, "%s: Bad address 0x%" 32642a907e8SBALATON Zoltan HWADDR_PRIx "\n", __func__, addr); 32742a907e8SBALATON Zoltan } 3287709dbf1SBALATON Zoltan break; 32965ca801bSBALATON Zoltan } 33065ca801bSBALATON Zoltan } 33165ca801bSBALATON Zoltan 3323b09bb0fSBALATON Zoltan static const MemoryRegionOps ppc4xx_i2c_ops = { 3333b09bb0fSBALATON Zoltan .read = ppc4xx_i2c_readb, 3343b09bb0fSBALATON Zoltan .write = ppc4xx_i2c_writeb, 3353b09bb0fSBALATON Zoltan .valid.min_access_size = 1, 3363b09bb0fSBALATON Zoltan .valid.max_access_size = 4, 3373b09bb0fSBALATON Zoltan .impl.min_access_size = 1, 3383b09bb0fSBALATON Zoltan .impl.max_access_size = 1, 33965ca801bSBALATON Zoltan .endianness = DEVICE_NATIVE_ENDIAN, 34065ca801bSBALATON Zoltan }; 34165ca801bSBALATON Zoltan 3423b09bb0fSBALATON Zoltan static void ppc4xx_i2c_init(Object *o) 34365ca801bSBALATON Zoltan { 3443b09bb0fSBALATON Zoltan PPC4xxI2CState *s = PPC4xx_I2C(o); 34565ca801bSBALATON Zoltan 3463b09bb0fSBALATON Zoltan memory_region_init_io(&s->iomem, OBJECT(s), &ppc4xx_i2c_ops, s, 3473b09bb0fSBALATON Zoltan TYPE_PPC4xx_I2C, PPC4xx_I2C_MEM_SIZE); 3483b09bb0fSBALATON Zoltan sysbus_init_mmio(SYS_BUS_DEVICE(s), &s->iomem); 3493b09bb0fSBALATON Zoltan sysbus_init_irq(SYS_BUS_DEVICE(s), &s->irq); 3503b09bb0fSBALATON Zoltan s->bus = i2c_init_bus(DEVICE(s), "i2c"); 351ef9173a5SBALATON Zoltan s->bitbang = bitbang_i2c_init(s->bus); 35265ca801bSBALATON Zoltan } 3533b09bb0fSBALATON Zoltan 3543b09bb0fSBALATON Zoltan static void ppc4xx_i2c_class_init(ObjectClass *klass, void *data) 3553b09bb0fSBALATON Zoltan { 3563b09bb0fSBALATON Zoltan DeviceClass *dc = DEVICE_CLASS(klass); 3573b09bb0fSBALATON Zoltan 3583b09bb0fSBALATON Zoltan dc->reset = ppc4xx_i2c_reset; 3593b09bb0fSBALATON Zoltan } 3603b09bb0fSBALATON Zoltan 3613b09bb0fSBALATON Zoltan static const TypeInfo ppc4xx_i2c_type_info = { 3623b09bb0fSBALATON Zoltan .name = TYPE_PPC4xx_I2C, 3633b09bb0fSBALATON Zoltan .parent = TYPE_SYS_BUS_DEVICE, 3643b09bb0fSBALATON Zoltan .instance_size = sizeof(PPC4xxI2CState), 3653b09bb0fSBALATON Zoltan .instance_init = ppc4xx_i2c_init, 3663b09bb0fSBALATON Zoltan .class_init = ppc4xx_i2c_class_init, 3673b09bb0fSBALATON Zoltan }; 3683b09bb0fSBALATON Zoltan 3693b09bb0fSBALATON Zoltan static void ppc4xx_i2c_register_types(void) 3703b09bb0fSBALATON Zoltan { 3713b09bb0fSBALATON Zoltan type_register_static(&ppc4xx_i2c_type_info); 3723b09bb0fSBALATON Zoltan } 3733b09bb0fSBALATON Zoltan 3743b09bb0fSBALATON Zoltan type_init(ppc4xx_i2c_register_types) 375