1*3dab3e0eSNobuhiro Iwamatsu /* 2*3dab3e0eSNobuhiro Iwamatsu * Copyright (C) 2011 Renesas Solutions Corp. 3*3dab3e0eSNobuhiro Iwamatsu * Copyright (C) 2011 Nobuhiro Iwamatsu <nobuhiro.iwamatsu.yj@renesas.com> 4*3dab3e0eSNobuhiro Iwamatsu * 5*3dab3e0eSNobuhiro Iwamatsu * This program is free software; you can redistribute it and/or 6*3dab3e0eSNobuhiro Iwamatsu * modify it under the terms of the GNU General Public License as 7*3dab3e0eSNobuhiro Iwamatsu * published by the Free Software Foundation; either version 2 of 8*3dab3e0eSNobuhiro Iwamatsu * the License, or (at your option) any later version. 9*3dab3e0eSNobuhiro Iwamatsu * 10*3dab3e0eSNobuhiro Iwamatsu * This program is distributed in the hope that it will be useful, 11*3dab3e0eSNobuhiro Iwamatsu * but WITHOUT ANY WARRANTY; without even the implied warranty of 12*3dab3e0eSNobuhiro Iwamatsu * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13*3dab3e0eSNobuhiro Iwamatsu * GNU General Public License for more details. 14*3dab3e0eSNobuhiro Iwamatsu * 15*3dab3e0eSNobuhiro Iwamatsu * You should have received a copy of the GNU General Public License 16*3dab3e0eSNobuhiro Iwamatsu * along with this program; if not, write to the Free Software 17*3dab3e0eSNobuhiro Iwamatsu * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 18*3dab3e0eSNobuhiro Iwamatsu * MA 02111-1307 USA 19*3dab3e0eSNobuhiro Iwamatsu */ 20*3dab3e0eSNobuhiro Iwamatsu 21*3dab3e0eSNobuhiro Iwamatsu #include <common.h> 22*3dab3e0eSNobuhiro Iwamatsu #include <asm/io.h> 23*3dab3e0eSNobuhiro Iwamatsu 24*3dab3e0eSNobuhiro Iwamatsu /* Every register is 32bit aligned, but only 8bits in size */ 25*3dab3e0eSNobuhiro Iwamatsu #define ureg(name) u8 name; u8 __pad_##name##0; u16 __pad_##name##1; 26*3dab3e0eSNobuhiro Iwamatsu struct sh_i2c { 27*3dab3e0eSNobuhiro Iwamatsu ureg(icdr); 28*3dab3e0eSNobuhiro Iwamatsu ureg(iccr); 29*3dab3e0eSNobuhiro Iwamatsu ureg(icsr); 30*3dab3e0eSNobuhiro Iwamatsu ureg(icic); 31*3dab3e0eSNobuhiro Iwamatsu ureg(iccl); 32*3dab3e0eSNobuhiro Iwamatsu ureg(icch); 33*3dab3e0eSNobuhiro Iwamatsu }; 34*3dab3e0eSNobuhiro Iwamatsu #undef ureg 35*3dab3e0eSNobuhiro Iwamatsu 36*3dab3e0eSNobuhiro Iwamatsu static struct sh_i2c *base; 37*3dab3e0eSNobuhiro Iwamatsu 38*3dab3e0eSNobuhiro Iwamatsu /* ICCR */ 39*3dab3e0eSNobuhiro Iwamatsu #define SH_I2C_ICCR_ICE (1 << 7) 40*3dab3e0eSNobuhiro Iwamatsu #define SH_I2C_ICCR_RACK (1 << 6) 41*3dab3e0eSNobuhiro Iwamatsu #define SH_I2C_ICCR_RTS (1 << 4) 42*3dab3e0eSNobuhiro Iwamatsu #define SH_I2C_ICCR_BUSY (1 << 2) 43*3dab3e0eSNobuhiro Iwamatsu #define SH_I2C_ICCR_SCP (1 << 0) 44*3dab3e0eSNobuhiro Iwamatsu 45*3dab3e0eSNobuhiro Iwamatsu /* ICSR / ICIC */ 46*3dab3e0eSNobuhiro Iwamatsu #define SH_IC_BUSY (1 << 3) 47*3dab3e0eSNobuhiro Iwamatsu #define SH_IC_TACK (1 << 2) 48*3dab3e0eSNobuhiro Iwamatsu #define SH_IC_WAIT (1 << 1) 49*3dab3e0eSNobuhiro Iwamatsu #define SH_IC_DTE (1 << 0) 50*3dab3e0eSNobuhiro Iwamatsu 51*3dab3e0eSNobuhiro Iwamatsu static u8 iccl, icch; 52*3dab3e0eSNobuhiro Iwamatsu 53*3dab3e0eSNobuhiro Iwamatsu #define IRQ_WAIT 1000 54*3dab3e0eSNobuhiro Iwamatsu 55*3dab3e0eSNobuhiro Iwamatsu static void irq_wait(struct sh_i2c *base) 56*3dab3e0eSNobuhiro Iwamatsu { 57*3dab3e0eSNobuhiro Iwamatsu int i; 58*3dab3e0eSNobuhiro Iwamatsu u8 status; 59*3dab3e0eSNobuhiro Iwamatsu 60*3dab3e0eSNobuhiro Iwamatsu for (i = 0 ; i < IRQ_WAIT ; i++) { 61*3dab3e0eSNobuhiro Iwamatsu status = readb(&base->icsr); 62*3dab3e0eSNobuhiro Iwamatsu if (SH_IC_WAIT & status) 63*3dab3e0eSNobuhiro Iwamatsu break; 64*3dab3e0eSNobuhiro Iwamatsu 65*3dab3e0eSNobuhiro Iwamatsu udelay(10); 66*3dab3e0eSNobuhiro Iwamatsu } 67*3dab3e0eSNobuhiro Iwamatsu 68*3dab3e0eSNobuhiro Iwamatsu writeb(status & ~SH_IC_WAIT, &base->icsr); 69*3dab3e0eSNobuhiro Iwamatsu } 70*3dab3e0eSNobuhiro Iwamatsu 71*3dab3e0eSNobuhiro Iwamatsu static void irq_dte(struct sh_i2c *base) 72*3dab3e0eSNobuhiro Iwamatsu { 73*3dab3e0eSNobuhiro Iwamatsu int i; 74*3dab3e0eSNobuhiro Iwamatsu 75*3dab3e0eSNobuhiro Iwamatsu for (i = 0 ; i < IRQ_WAIT ; i++) { 76*3dab3e0eSNobuhiro Iwamatsu if (SH_IC_DTE & readb(&base->icsr)) 77*3dab3e0eSNobuhiro Iwamatsu break; 78*3dab3e0eSNobuhiro Iwamatsu udelay(10); 79*3dab3e0eSNobuhiro Iwamatsu } 80*3dab3e0eSNobuhiro Iwamatsu } 81*3dab3e0eSNobuhiro Iwamatsu 82*3dab3e0eSNobuhiro Iwamatsu static void irq_busy(struct sh_i2c *base) 83*3dab3e0eSNobuhiro Iwamatsu { 84*3dab3e0eSNobuhiro Iwamatsu int i; 85*3dab3e0eSNobuhiro Iwamatsu 86*3dab3e0eSNobuhiro Iwamatsu for (i = 0 ; i < IRQ_WAIT ; i++) { 87*3dab3e0eSNobuhiro Iwamatsu if (!(SH_IC_BUSY & readb(&base->icsr))) 88*3dab3e0eSNobuhiro Iwamatsu break; 89*3dab3e0eSNobuhiro Iwamatsu udelay(10); 90*3dab3e0eSNobuhiro Iwamatsu } 91*3dab3e0eSNobuhiro Iwamatsu } 92*3dab3e0eSNobuhiro Iwamatsu 93*3dab3e0eSNobuhiro Iwamatsu static void i2c_set_addr(struct sh_i2c *base, u8 id, u8 reg, int stop) 94*3dab3e0eSNobuhiro Iwamatsu { 95*3dab3e0eSNobuhiro Iwamatsu writeb(readb(&base->iccr) & ~SH_I2C_ICCR_ICE, &base->iccr); 96*3dab3e0eSNobuhiro Iwamatsu writeb(readb(&base->iccr) | SH_I2C_ICCR_ICE, &base->iccr); 97*3dab3e0eSNobuhiro Iwamatsu 98*3dab3e0eSNobuhiro Iwamatsu writeb(iccl, &base->iccl); 99*3dab3e0eSNobuhiro Iwamatsu writeb(icch, &base->icch); 100*3dab3e0eSNobuhiro Iwamatsu writeb(0, &base->icic); 101*3dab3e0eSNobuhiro Iwamatsu 102*3dab3e0eSNobuhiro Iwamatsu writeb((SH_I2C_ICCR_ICE|SH_I2C_ICCR_RTS|SH_I2C_ICCR_BUSY), &base->iccr); 103*3dab3e0eSNobuhiro Iwamatsu irq_dte(base); 104*3dab3e0eSNobuhiro Iwamatsu 105*3dab3e0eSNobuhiro Iwamatsu writeb(id << 1, &base->icdr); 106*3dab3e0eSNobuhiro Iwamatsu irq_dte(base); 107*3dab3e0eSNobuhiro Iwamatsu 108*3dab3e0eSNobuhiro Iwamatsu writeb(reg, &base->icdr); 109*3dab3e0eSNobuhiro Iwamatsu if (stop) 110*3dab3e0eSNobuhiro Iwamatsu writeb((SH_I2C_ICCR_ICE|SH_I2C_ICCR_RTS), &base->iccr); 111*3dab3e0eSNobuhiro Iwamatsu 112*3dab3e0eSNobuhiro Iwamatsu irq_dte(base); 113*3dab3e0eSNobuhiro Iwamatsu } 114*3dab3e0eSNobuhiro Iwamatsu 115*3dab3e0eSNobuhiro Iwamatsu static void i2c_finish(struct sh_i2c *base) 116*3dab3e0eSNobuhiro Iwamatsu { 117*3dab3e0eSNobuhiro Iwamatsu writeb(0, &base->icsr); 118*3dab3e0eSNobuhiro Iwamatsu writeb(readb(&base->iccr) & ~SH_I2C_ICCR_ICE, &base->iccr); 119*3dab3e0eSNobuhiro Iwamatsu } 120*3dab3e0eSNobuhiro Iwamatsu 121*3dab3e0eSNobuhiro Iwamatsu static void i2c_raw_write(struct sh_i2c *base, u8 id, u8 reg, u8 val) 122*3dab3e0eSNobuhiro Iwamatsu { 123*3dab3e0eSNobuhiro Iwamatsu i2c_set_addr(base, id, reg, 0); 124*3dab3e0eSNobuhiro Iwamatsu udelay(10); 125*3dab3e0eSNobuhiro Iwamatsu 126*3dab3e0eSNobuhiro Iwamatsu writeb(val, &base->icdr); 127*3dab3e0eSNobuhiro Iwamatsu irq_dte(base); 128*3dab3e0eSNobuhiro Iwamatsu 129*3dab3e0eSNobuhiro Iwamatsu writeb((SH_I2C_ICCR_ICE | SH_I2C_ICCR_RTS), &base->iccr); 130*3dab3e0eSNobuhiro Iwamatsu irq_dte(base); 131*3dab3e0eSNobuhiro Iwamatsu irq_busy(base); 132*3dab3e0eSNobuhiro Iwamatsu 133*3dab3e0eSNobuhiro Iwamatsu i2c_finish(base); 134*3dab3e0eSNobuhiro Iwamatsu } 135*3dab3e0eSNobuhiro Iwamatsu 136*3dab3e0eSNobuhiro Iwamatsu static u8 i2c_raw_read(struct sh_i2c *base, u8 id, u8 reg) 137*3dab3e0eSNobuhiro Iwamatsu { 138*3dab3e0eSNobuhiro Iwamatsu u8 ret; 139*3dab3e0eSNobuhiro Iwamatsu 140*3dab3e0eSNobuhiro Iwamatsu i2c_set_addr(base, id, reg, 1); 141*3dab3e0eSNobuhiro Iwamatsu udelay(100); 142*3dab3e0eSNobuhiro Iwamatsu 143*3dab3e0eSNobuhiro Iwamatsu writeb((SH_I2C_ICCR_ICE|SH_I2C_ICCR_RTS|SH_I2C_ICCR_BUSY), &base->iccr); 144*3dab3e0eSNobuhiro Iwamatsu irq_dte(base); 145*3dab3e0eSNobuhiro Iwamatsu 146*3dab3e0eSNobuhiro Iwamatsu writeb(id << 1 | 0x01, &base->icdr); 147*3dab3e0eSNobuhiro Iwamatsu irq_dte(base); 148*3dab3e0eSNobuhiro Iwamatsu 149*3dab3e0eSNobuhiro Iwamatsu writeb((SH_I2C_ICCR_ICE|SH_I2C_ICCR_SCP), &base->iccr); 150*3dab3e0eSNobuhiro Iwamatsu irq_dte(base); 151*3dab3e0eSNobuhiro Iwamatsu 152*3dab3e0eSNobuhiro Iwamatsu ret = readb(&base->icdr); 153*3dab3e0eSNobuhiro Iwamatsu 154*3dab3e0eSNobuhiro Iwamatsu writeb((SH_I2C_ICCR_ICE|SH_I2C_ICCR_RACK), &base->iccr); 155*3dab3e0eSNobuhiro Iwamatsu readb(&base->icdr); /* Dummy read */ 156*3dab3e0eSNobuhiro Iwamatsu irq_busy(base); 157*3dab3e0eSNobuhiro Iwamatsu 158*3dab3e0eSNobuhiro Iwamatsu i2c_finish(base); 159*3dab3e0eSNobuhiro Iwamatsu 160*3dab3e0eSNobuhiro Iwamatsu return ret; 161*3dab3e0eSNobuhiro Iwamatsu } 162*3dab3e0eSNobuhiro Iwamatsu 163*3dab3e0eSNobuhiro Iwamatsu #ifdef CONFIG_I2C_MULTI_BUS 164*3dab3e0eSNobuhiro Iwamatsu static unsigned int current_bus; 165*3dab3e0eSNobuhiro Iwamatsu 166*3dab3e0eSNobuhiro Iwamatsu /** 167*3dab3e0eSNobuhiro Iwamatsu * i2c_set_bus_num - change active I2C bus 168*3dab3e0eSNobuhiro Iwamatsu * @bus: bus index, zero based 169*3dab3e0eSNobuhiro Iwamatsu * @returns: 0 on success, non-0 on failure 170*3dab3e0eSNobuhiro Iwamatsu */ 171*3dab3e0eSNobuhiro Iwamatsu int i2c_set_bus_num(unsigned int bus) 172*3dab3e0eSNobuhiro Iwamatsu { 173*3dab3e0eSNobuhiro Iwamatsu if ((bus < 0) || (bus >= CONFIG_SYS_MAX_I2C_BUS)) { 174*3dab3e0eSNobuhiro Iwamatsu printf("Bad bus: %d\n", bus); 175*3dab3e0eSNobuhiro Iwamatsu return -1; 176*3dab3e0eSNobuhiro Iwamatsu } 177*3dab3e0eSNobuhiro Iwamatsu 178*3dab3e0eSNobuhiro Iwamatsu switch (bus) { 179*3dab3e0eSNobuhiro Iwamatsu case 0: 180*3dab3e0eSNobuhiro Iwamatsu base = (void *)CONFIG_SH_I2C_BASE0; 181*3dab3e0eSNobuhiro Iwamatsu break; 182*3dab3e0eSNobuhiro Iwamatsu case 1: 183*3dab3e0eSNobuhiro Iwamatsu base = (void *)CONFIG_SH_I2C_BASE1; 184*3dab3e0eSNobuhiro Iwamatsu break; 185*3dab3e0eSNobuhiro Iwamatsu default: 186*3dab3e0eSNobuhiro Iwamatsu return -1; 187*3dab3e0eSNobuhiro Iwamatsu } 188*3dab3e0eSNobuhiro Iwamatsu current_bus = bus; 189*3dab3e0eSNobuhiro Iwamatsu 190*3dab3e0eSNobuhiro Iwamatsu return 0; 191*3dab3e0eSNobuhiro Iwamatsu } 192*3dab3e0eSNobuhiro Iwamatsu 193*3dab3e0eSNobuhiro Iwamatsu /** 194*3dab3e0eSNobuhiro Iwamatsu * i2c_get_bus_num - returns index of active I2C bus 195*3dab3e0eSNobuhiro Iwamatsu */ 196*3dab3e0eSNobuhiro Iwamatsu unsigned int i2c_get_bus_num(void) 197*3dab3e0eSNobuhiro Iwamatsu { 198*3dab3e0eSNobuhiro Iwamatsu return current_bus; 199*3dab3e0eSNobuhiro Iwamatsu } 200*3dab3e0eSNobuhiro Iwamatsu #endif 201*3dab3e0eSNobuhiro Iwamatsu 202*3dab3e0eSNobuhiro Iwamatsu #define SH_I2C_ICCL_CALC(clk, date, t_low, t_high) \ 203*3dab3e0eSNobuhiro Iwamatsu ((clk / rate) * (t_low / t_low + t_high)) 204*3dab3e0eSNobuhiro Iwamatsu #define SH_I2C_ICCH_CALC(clk, date, t_low, t_high) \ 205*3dab3e0eSNobuhiro Iwamatsu ((clk / rate) * (t_high / t_low + t_high)) 206*3dab3e0eSNobuhiro Iwamatsu 207*3dab3e0eSNobuhiro Iwamatsu void i2c_init(int speed, int slaveaddr) 208*3dab3e0eSNobuhiro Iwamatsu { 209*3dab3e0eSNobuhiro Iwamatsu int num, denom, tmp; 210*3dab3e0eSNobuhiro Iwamatsu 211*3dab3e0eSNobuhiro Iwamatsu #ifdef CONFIG_I2C_MULTI_BUS 212*3dab3e0eSNobuhiro Iwamatsu current_bus = 0; 213*3dab3e0eSNobuhiro Iwamatsu #endif 214*3dab3e0eSNobuhiro Iwamatsu base = (struct sh_i2c *)CONFIG_SH_I2C_BASE0; 215*3dab3e0eSNobuhiro Iwamatsu 216*3dab3e0eSNobuhiro Iwamatsu /* 217*3dab3e0eSNobuhiro Iwamatsu * Calculate the value for iccl. From the data sheet: 218*3dab3e0eSNobuhiro Iwamatsu * iccl = (p-clock / transfer-rate) * (L / (L + H)) 219*3dab3e0eSNobuhiro Iwamatsu * where L and H are the SCL low and high ratio. 220*3dab3e0eSNobuhiro Iwamatsu */ 221*3dab3e0eSNobuhiro Iwamatsu num = CONFIG_SH_I2C_CLOCK * CONFIG_SH_I2C_DATA_LOW; 222*3dab3e0eSNobuhiro Iwamatsu denom = speed * (CONFIG_SH_I2C_DATA_HIGH + CONFIG_SH_I2C_DATA_LOW); 223*3dab3e0eSNobuhiro Iwamatsu tmp = num * 10 / denom; 224*3dab3e0eSNobuhiro Iwamatsu if (tmp % 10 >= 5) 225*3dab3e0eSNobuhiro Iwamatsu iccl = (u8)((num/denom) + 1); 226*3dab3e0eSNobuhiro Iwamatsu else 227*3dab3e0eSNobuhiro Iwamatsu iccl = (u8)(num/denom); 228*3dab3e0eSNobuhiro Iwamatsu 229*3dab3e0eSNobuhiro Iwamatsu /* Calculate the value for icch. From the data sheet: 230*3dab3e0eSNobuhiro Iwamatsu icch = (p clock / transfer rate) * (H / (L + H)) */ 231*3dab3e0eSNobuhiro Iwamatsu num = CONFIG_SH_I2C_CLOCK * CONFIG_SH_I2C_DATA_HIGH; 232*3dab3e0eSNobuhiro Iwamatsu tmp = num * 10 / denom; 233*3dab3e0eSNobuhiro Iwamatsu if (tmp % 10 >= 5) 234*3dab3e0eSNobuhiro Iwamatsu icch = (u8)((num/denom) + 1); 235*3dab3e0eSNobuhiro Iwamatsu else 236*3dab3e0eSNobuhiro Iwamatsu icch = (u8)(num/denom); 237*3dab3e0eSNobuhiro Iwamatsu } 238*3dab3e0eSNobuhiro Iwamatsu 239*3dab3e0eSNobuhiro Iwamatsu /* 240*3dab3e0eSNobuhiro Iwamatsu * i2c_read: - Read multiple bytes from an i2c device 241*3dab3e0eSNobuhiro Iwamatsu * 242*3dab3e0eSNobuhiro Iwamatsu * The higher level routines take into account that this function is only 243*3dab3e0eSNobuhiro Iwamatsu * called with len < page length of the device (see configuration file) 244*3dab3e0eSNobuhiro Iwamatsu * 245*3dab3e0eSNobuhiro Iwamatsu * @chip: address of the chip which is to be read 246*3dab3e0eSNobuhiro Iwamatsu * @addr: i2c data address within the chip 247*3dab3e0eSNobuhiro Iwamatsu * @alen: length of the i2c data address (1..2 bytes) 248*3dab3e0eSNobuhiro Iwamatsu * @buffer: where to write the data 249*3dab3e0eSNobuhiro Iwamatsu * @len: how much byte do we want to read 250*3dab3e0eSNobuhiro Iwamatsu * @return: 0 in case of success 251*3dab3e0eSNobuhiro Iwamatsu */ 252*3dab3e0eSNobuhiro Iwamatsu int i2c_read(u8 chip, u32 addr, int alen, u8 *buffer, int len) 253*3dab3e0eSNobuhiro Iwamatsu { 254*3dab3e0eSNobuhiro Iwamatsu int i = 0; 255*3dab3e0eSNobuhiro Iwamatsu for (i = 0 ; i < len ; i++) 256*3dab3e0eSNobuhiro Iwamatsu buffer[i] = i2c_raw_read(base, chip, addr + i); 257*3dab3e0eSNobuhiro Iwamatsu 258*3dab3e0eSNobuhiro Iwamatsu return 0; 259*3dab3e0eSNobuhiro Iwamatsu } 260*3dab3e0eSNobuhiro Iwamatsu 261*3dab3e0eSNobuhiro Iwamatsu /* 262*3dab3e0eSNobuhiro Iwamatsu * i2c_write: - Write multiple bytes to an i2c device 263*3dab3e0eSNobuhiro Iwamatsu * 264*3dab3e0eSNobuhiro Iwamatsu * The higher level routines take into account that this function is only 265*3dab3e0eSNobuhiro Iwamatsu * called with len < page length of the device (see configuration file) 266*3dab3e0eSNobuhiro Iwamatsu * 267*3dab3e0eSNobuhiro Iwamatsu * @chip: address of the chip which is to be written 268*3dab3e0eSNobuhiro Iwamatsu * @addr: i2c data address within the chip 269*3dab3e0eSNobuhiro Iwamatsu * @alen: length of the i2c data address (1..2 bytes) 270*3dab3e0eSNobuhiro Iwamatsu * @buffer: where to find the data to be written 271*3dab3e0eSNobuhiro Iwamatsu * @len: how much byte do we want to read 272*3dab3e0eSNobuhiro Iwamatsu * @return: 0 in case of success 273*3dab3e0eSNobuhiro Iwamatsu */ 274*3dab3e0eSNobuhiro Iwamatsu int i2c_write(u8 chip, u32 addr, int alen, u8 *buffer, int len) 275*3dab3e0eSNobuhiro Iwamatsu { 276*3dab3e0eSNobuhiro Iwamatsu int i = 0; 277*3dab3e0eSNobuhiro Iwamatsu for (i = 0; i < len ; i++) 278*3dab3e0eSNobuhiro Iwamatsu i2c_raw_write(base, chip, addr + i, buffer[i]); 279*3dab3e0eSNobuhiro Iwamatsu 280*3dab3e0eSNobuhiro Iwamatsu return 0; 281*3dab3e0eSNobuhiro Iwamatsu } 282*3dab3e0eSNobuhiro Iwamatsu 283*3dab3e0eSNobuhiro Iwamatsu /* 284*3dab3e0eSNobuhiro Iwamatsu * i2c_probe: - Test if a chip answers for a given i2c address 285*3dab3e0eSNobuhiro Iwamatsu * 286*3dab3e0eSNobuhiro Iwamatsu * @chip: address of the chip which is searched for 287*3dab3e0eSNobuhiro Iwamatsu * @return: 0 if a chip was found, -1 otherwhise 288*3dab3e0eSNobuhiro Iwamatsu */ 289*3dab3e0eSNobuhiro Iwamatsu int i2c_probe(u8 chip) 290*3dab3e0eSNobuhiro Iwamatsu { 291*3dab3e0eSNobuhiro Iwamatsu return 0; 292*3dab3e0eSNobuhiro Iwamatsu } 293