Lines Matching refs:bp
53 static void set_device_claimage(struct bbc_i2c_bus *bp, struct platform_device *op, int val) in set_device_claimage() argument
58 if (bp->devs[i].device == op) { in set_device_claimage()
59 bp->devs[i].client_claimed = val; in set_device_claimage()
68 struct platform_device *bbc_i2c_getdev(struct bbc_i2c_bus *bp, int index) in bbc_i2c_getdev() argument
74 if (!(op = bp->devs[i].device)) in bbc_i2c_getdev()
88 struct bbc_i2c_client *bbc_i2c_attach(struct bbc_i2c_bus *bp, struct platform_device *op) in bbc_i2c_attach() argument
96 client->bp = bp; in bbc_i2c_attach()
108 claim_device(bp, op); in bbc_i2c_attach()
115 struct bbc_i2c_bus *bp = client->bp; in bbc_i2c_detach() local
118 release_device(bp, op); in bbc_i2c_detach()
122 static int wait_for_pin(struct bbc_i2c_bus *bp, u8 *status) in wait_for_pin() argument
128 bp->waiting = 1; in wait_for_pin()
129 add_wait_queue(&bp->wq, &wait); in wait_for_pin()
134 bp->wq, in wait_for_pin()
135 (((*status = readb(bp->i2c_control_regs + 0)) in wait_for_pin()
143 remove_wait_queue(&bp->wq, &wait); in wait_for_pin()
144 bp->waiting = 0; in wait_for_pin()
151 struct bbc_i2c_bus *bp = client->bp; in bbc_i2c_writeb() local
156 if (bp->i2c_bussel_reg != NULL) in bbc_i2c_writeb()
157 writeb(client->bus, bp->i2c_bussel_reg); in bbc_i2c_writeb()
159 writeb(address, bp->i2c_control_regs + 0x1); in bbc_i2c_writeb()
160 writeb(I2C_PCF_START, bp->i2c_control_regs + 0x0); in bbc_i2c_writeb()
161 if (wait_for_pin(bp, &status)) in bbc_i2c_writeb()
164 writeb(off, bp->i2c_control_regs + 0x1); in bbc_i2c_writeb()
165 if (wait_for_pin(bp, &status) || in bbc_i2c_writeb()
169 writeb(val, bp->i2c_control_regs + 0x1); in bbc_i2c_writeb()
170 if (wait_for_pin(bp, &status)) in bbc_i2c_writeb()
176 writeb(I2C_PCF_STOP, bp->i2c_control_regs + 0x0); in bbc_i2c_writeb()
182 struct bbc_i2c_bus *bp = client->bp; in bbc_i2c_readb() local
186 if (bp->i2c_bussel_reg != NULL) in bbc_i2c_readb()
187 writeb(client->bus, bp->i2c_bussel_reg); in bbc_i2c_readb()
189 writeb(address, bp->i2c_control_regs + 0x1); in bbc_i2c_readb()
190 writeb(I2C_PCF_START, bp->i2c_control_regs + 0x0); in bbc_i2c_readb()
191 if (wait_for_pin(bp, &status)) in bbc_i2c_readb()
194 writeb(off, bp->i2c_control_regs + 0x1); in bbc_i2c_readb()
195 if (wait_for_pin(bp, &status) || in bbc_i2c_readb()
199 writeb(I2C_PCF_STOP, bp->i2c_control_regs + 0x0); in bbc_i2c_readb()
203 writeb(address, bp->i2c_control_regs + 0x1); in bbc_i2c_readb()
204 writeb(I2C_PCF_START, bp->i2c_control_regs + 0x0); in bbc_i2c_readb()
205 if (wait_for_pin(bp, &status)) in bbc_i2c_readb()
211 (void) readb(bp->i2c_control_regs + 0x1); in bbc_i2c_readb()
212 if (wait_for_pin(bp, &status)) in bbc_i2c_readb()
215 writeb(I2C_PCF_ESO | I2C_PCF_ENI, bp->i2c_control_regs + 0x0); in bbc_i2c_readb()
216 *byte = readb(bp->i2c_control_regs + 0x1); in bbc_i2c_readb()
217 if (wait_for_pin(bp, &status)) in bbc_i2c_readb()
223 writeb(I2C_PCF_STOP, bp->i2c_control_regs + 0x0); in bbc_i2c_readb()
224 (void) readb(bp->i2c_control_regs + 0x1); in bbc_i2c_readb()
272 struct bbc_i2c_bus *bp = dev_id; in bbc_i2c_interrupt() local
277 if (bp->waiting && in bbc_i2c_interrupt()
278 !(readb(bp->i2c_control_regs + 0x0) & I2C_PCF_PIN)) in bbc_i2c_interrupt()
279 wake_up_interruptible(&bp->wq); in bbc_i2c_interrupt()
284 static void reset_one_i2c(struct bbc_i2c_bus *bp) in reset_one_i2c() argument
286 writeb(I2C_PCF_PIN, bp->i2c_control_regs + 0x0); in reset_one_i2c()
287 writeb(bp->own, bp->i2c_control_regs + 0x1); in reset_one_i2c()
288 writeb(I2C_PCF_PIN | I2C_PCF_ES1, bp->i2c_control_regs + 0x0); in reset_one_i2c()
289 writeb(bp->clock, bp->i2c_control_regs + 0x1); in reset_one_i2c()
290 writeb(I2C_PCF_IDLE, bp->i2c_control_regs + 0x0); in reset_one_i2c()
295 struct bbc_i2c_bus *bp; in attach_one_i2c() local
299 bp = kzalloc(sizeof(*bp), GFP_KERNEL); in attach_one_i2c()
300 if (!bp) in attach_one_i2c()
303 INIT_LIST_HEAD(&bp->temps); in attach_one_i2c()
304 INIT_LIST_HEAD(&bp->fans); in attach_one_i2c()
306 bp->i2c_control_regs = of_ioremap(&op->resource[0], 0, 0x2, "bbc_i2c_regs"); in attach_one_i2c()
307 if (!bp->i2c_control_regs) in attach_one_i2c()
311 bp->i2c_bussel_reg = of_ioremap(&op->resource[1], 0, 0x1, "bbc_i2c_bussel"); in attach_one_i2c()
312 if (!bp->i2c_bussel_reg) in attach_one_i2c()
316 bp->waiting = 0; in attach_one_i2c()
317 init_waitqueue_head(&bp->wq); in attach_one_i2c()
319 IRQF_SHARED, "bbc_i2c", bp)) in attach_one_i2c()
322 bp->index = index; in attach_one_i2c()
323 bp->op = op; in attach_one_i2c()
325 spin_lock_init(&bp->lock); in attach_one_i2c()
334 bp->devs[entry].device = child_op; in attach_one_i2c()
335 bp->devs[entry].client_claimed = 0; in attach_one_i2c()
338 writeb(I2C_PCF_PIN, bp->i2c_control_regs + 0x0); in attach_one_i2c()
339 bp->own = readb(bp->i2c_control_regs + 0x01); in attach_one_i2c()
340 writeb(I2C_PCF_PIN | I2C_PCF_ES1, bp->i2c_control_regs + 0x0); in attach_one_i2c()
341 bp->clock = readb(bp->i2c_control_regs + 0x01); in attach_one_i2c()
344 bp->index, bp->i2c_control_regs, entry, bp->own, bp->clock); in attach_one_i2c()
346 reset_one_i2c(bp); in attach_one_i2c()
348 return bp; in attach_one_i2c()
351 if (bp->i2c_bussel_reg) in attach_one_i2c()
352 of_iounmap(&op->resource[1], bp->i2c_bussel_reg, 1); in attach_one_i2c()
353 if (bp->i2c_control_regs) in attach_one_i2c()
354 of_iounmap(&op->resource[0], bp->i2c_control_regs, 2); in attach_one_i2c()
355 kfree(bp); in attach_one_i2c()
359 extern int bbc_envctrl_init(struct bbc_i2c_bus *bp);
360 extern void bbc_envctrl_cleanup(struct bbc_i2c_bus *bp);
364 struct bbc_i2c_bus *bp; in bbc_i2c_probe() local
367 bp = attach_one_i2c(op, index); in bbc_i2c_probe()
368 if (!bp) in bbc_i2c_probe()
371 err = bbc_envctrl_init(bp); in bbc_i2c_probe()
373 free_irq(op->archdata.irqs[0], bp); in bbc_i2c_probe()
374 if (bp->i2c_bussel_reg) in bbc_i2c_probe()
375 of_iounmap(&op->resource[0], bp->i2c_bussel_reg, 1); in bbc_i2c_probe()
376 if (bp->i2c_control_regs) in bbc_i2c_probe()
377 of_iounmap(&op->resource[1], bp->i2c_control_regs, 2); in bbc_i2c_probe()
378 kfree(bp); in bbc_i2c_probe()
380 dev_set_drvdata(&op->dev, bp); in bbc_i2c_probe()
388 struct bbc_i2c_bus *bp = dev_get_drvdata(&op->dev); in bbc_i2c_remove() local
390 bbc_envctrl_cleanup(bp); in bbc_i2c_remove()
392 free_irq(op->archdata.irqs[0], bp); in bbc_i2c_remove()
394 if (bp->i2c_bussel_reg) in bbc_i2c_remove()
395 of_iounmap(&op->resource[0], bp->i2c_bussel_reg, 1); in bbc_i2c_remove()
396 if (bp->i2c_control_regs) in bbc_i2c_remove()
397 of_iounmap(&op->resource[1], bp->i2c_control_regs, 2); in bbc_i2c_remove()
399 kfree(bp); in bbc_i2c_remove()