chan->adapter.id = I2C_ALGO_SMBUS; 
create_iface(struct device_node *np, struct device *dev){	unsigned long steps;	unsigned bsteps, tsize, i, nchan, addroffset;	struct keywest_iface* iface;	u32 *psteps, *prate;	int rc;	if (np->n_intrs < 1 || np->n_addrs < 1) {		printk(KERN_ERR "%s: Missing interrupt or address !\n",		       np->full_name);		return -ENODEV;	}	if (pmac_low_i2c_lock(np))		return -ENODEV;	psteps = (u32 *)get_property(np, "AAPL,address-step", NULL);	steps = psteps ? (*psteps) : 0x10;	/* Hrm... maybe we can be smarter here */	for (bsteps = 0; (steps & 0x01) == 0; bsteps++)		steps >>= 1;	if (np->parent->name[0] == 'u') {		nchan = 2;		addroffset = 3;	} else {		addroffset = 0;		nchan = 1;	}	tsize = sizeof(struct keywest_iface) +		(sizeof(struct keywest_chan) + 4) * nchan;	iface = (struct keywest_iface *) kmalloc(tsize, GFP_KERNEL);	if (iface == NULL) {		printk(KERN_ERR "i2c-keywest: can't allocate inteface !\n");		pmac_low_i2c_unlock(np);		return -ENOMEM;	}	memset(iface, 0, tsize);	spin_lock_init(&iface->lock);	init_completion(&iface->complete);	iface->node = of_node_get(np);	iface->bsteps = bsteps;	iface->chan_count = nchan;	iface->state = state_idle;	iface->irq = np->intrs[0].line;	iface->channels = (struct keywest_chan *)		(((unsigned long)(iface + 1) + 3UL) & ~3UL);	iface->base = ioremap(np->addrs[0].address + addroffset,						np->addrs[0].size);	if (!iface->base) {		printk(KERN_ERR "i2c-keywest: can't map inteface !\n");		kfree(iface);		pmac_low_i2c_unlock(np);		return -ENOMEM;	}#ifndef POLLED_MODE	init_timer(&iface->timeout_timer);	iface->timeout_timer.function = keywest_timeout;	iface->timeout_timer.data = (unsigned long)iface;#endif	/* Select interface rate */	iface->cur_mode = KW_I2C_MODE_100KHZ;	prate = (u32 *)get_property(np, "AAPL,i2c-rate", NULL);	if (prate) switch(*prate) {	case 100:		iface->cur_mode = KW_I2C_MODE_100KHZ;		break;	case 50:		iface->cur_mode = KW_I2C_MODE_50KHZ;		break;	case 25:		iface->cur_mode = KW_I2C_MODE_25KHZ;		break;	default:		printk(KERN_WARNING "i2c-keywest: unknown rate %ldKhz, using 100KHz\n",		       (long)*prate);	}		/* Select standard mode by default */	iface->cur_mode |= KW_I2C_MODE_STANDARD;		/* Write mode */	write_reg(reg_mode, iface->cur_mode);		/* Switch interrupts off & clear them*/	write_reg(reg_ier, 0x00);	write_reg(reg_isr, KW_I2C_IRQ_MASK);#ifndef POLLED_MODE	/* Request chip interrupt */		rc = request_irq(iface->irq, keywest_irq, SA_INTERRUPT, "keywest i2c", iface);	if (rc) {		printk(KERN_ERR "i2c-keywest: can't get IRQ %d !\n", iface->irq);		iounmap(iface->base);		kfree(iface);		pmac_low_i2c_unlock(np);		return -ENODEV;	}#endif /* POLLED_MODE */	pmac_low_i2c_unlock(np);	dev_set_drvdata(dev, iface);		for (i=0; i<nchan; i++) {		struct keywest_chan* chan = &iface->channels[i];		u8 addr;				sprintf(chan->adapter.name, "%s %d", np->parent->name, i);		chan->iface = iface;		chan->chan_no = i;		chan->adapter.id = I2C_ALGO_SMBUS;		chan->adapter.algo = &keywest_algorithm;		chan->adapter.algo_data = NULL;		chan->adapter.client_register = NULL;		chan->adapter.client_unregister = NULL;		i2c_set_adapdata(&chan->adapter, chan);		chan->adapter.dev.parent = dev;		rc = i2c_add_adapter(&chan->adapter);		if (rc) {			printk("i2c-keywest.c: Adapter %s registration failed\n",				chan->adapter.name);			i2c_set_adapdata(&chan->adapter, NULL);		}		if (probe) {			printk("Probe: ");			for (addr = 0x00; addr <= 0x7f; addr++) {				if (i2c_smbus_xfer(&chan->adapter,addr,				    0,0,0,I2C_SMBUS_QUICK,NULL) >= 0)					printk("%02x ", addr);			}			printk("\n");		}	}	printk(KERN_INFO "Found KeyWest i2c on \"%s\", %d channel%s, stepping: %d bits\n",		np->parent->name, nchan, nchan > 1 ? "s" : "", bsteps);			return 0;}
10457	/local/tlutelli/issta_data/temp/c/2005_temp/2005/10457/1684a984303abbfc39aa8b59b0fe825c717811a9/i2c-keywest.c/buggy/drivers/i2c/busses/i2c-keywest.c