Lines Matching refs:bp

55 static void set_device_claimage(struct bbc_i2c_bus *bp, struct platform_device *op, int val)
60 if (bp->devs[i].device == op) {
61 bp->devs[i].client_claimed = val;
70 struct platform_device *bbc_i2c_getdev(struct bbc_i2c_bus *bp, int index)
76 if (!(op = bp->devs[i].device))
90 struct bbc_i2c_client *bbc_i2c_attach(struct bbc_i2c_bus *bp, struct platform_device *op)
98 client->bp = bp;
110 claim_device(bp, op);
117 struct bbc_i2c_bus *bp = client->bp;
120 release_device(bp, op);
124 static int wait_for_pin(struct bbc_i2c_bus *bp, u8 *status)
130 bp->waiting = 1;
131 add_wait_queue(&bp->wq, &wait);
136 bp->wq,
137 (((*status = readb(bp->i2c_control_regs + 0))
145 remove_wait_queue(&bp->wq, &wait);
146 bp->waiting = 0;
153 struct bbc_i2c_bus *bp = client->bp;
158 if (bp->i2c_bussel_reg != NULL)
159 writeb(client->bus, bp->i2c_bussel_reg);
161 writeb(address, bp->i2c_control_regs + 0x1);
162 writeb(I2C_PCF_START, bp->i2c_control_regs + 0x0);
163 if (wait_for_pin(bp, &status))
166 writeb(off, bp->i2c_control_regs + 0x1);
167 if (wait_for_pin(bp, &status) ||
171 writeb(val, bp->i2c_control_regs + 0x1);
172 if (wait_for_pin(bp, &status))
178 writeb(I2C_PCF_STOP, bp->i2c_control_regs + 0x0);
184 struct bbc_i2c_bus *bp = client->bp;
188 if (bp->i2c_bussel_reg != NULL)
189 writeb(client->bus, bp->i2c_bussel_reg);
191 writeb(address, bp->i2c_control_regs + 0x1);
192 writeb(I2C_PCF_START, bp->i2c_control_regs + 0x0);
193 if (wait_for_pin(bp, &status))
196 writeb(off, bp->i2c_control_regs + 0x1);
197 if (wait_for_pin(bp, &status) ||
201 writeb(I2C_PCF_STOP, bp->i2c_control_regs + 0x0);
205 writeb(address, bp->i2c_control_regs + 0x1);
206 writeb(I2C_PCF_START, bp->i2c_control_regs + 0x0);
207 if (wait_for_pin(bp, &status))
213 (void) readb(bp->i2c_control_regs + 0x1);
214 if (wait_for_pin(bp, &status))
217 writeb(I2C_PCF_ESO | I2C_PCF_ENI, bp->i2c_control_regs + 0x0);
218 *byte = readb(bp->i2c_control_regs + 0x1);
219 if (wait_for_pin(bp, &status))
225 writeb(I2C_PCF_STOP, bp->i2c_control_regs + 0x0);
226 (void) readb(bp->i2c_control_regs + 0x1);
274 struct bbc_i2c_bus *bp = dev_id;
279 if (bp->waiting &&
280 !(readb(bp->i2c_control_regs + 0x0) & I2C_PCF_PIN))
281 wake_up_interruptible(&bp->wq);
286 static void reset_one_i2c(struct bbc_i2c_bus *bp)
288 writeb(I2C_PCF_PIN, bp->i2c_control_regs + 0x0);
289 writeb(bp->own, bp->i2c_control_regs + 0x1);
290 writeb(I2C_PCF_PIN | I2C_PCF_ES1, bp->i2c_control_regs + 0x0);
291 writeb(bp->clock, bp->i2c_control_regs + 0x1);
292 writeb(I2C_PCF_IDLE, bp->i2c_control_regs + 0x0);
297 struct bbc_i2c_bus *bp;
301 bp = kzalloc(sizeof(*bp), GFP_KERNEL);
302 if (!bp)
305 INIT_LIST_HEAD(&bp->temps);
306 INIT_LIST_HEAD(&bp->fans);
308 bp->i2c_control_regs = of_ioremap(&op->resource[0], 0, 0x2, "bbc_i2c_regs");
309 if (!bp->i2c_control_regs)
313 bp->i2c_bussel_reg = of_ioremap(&op->resource[1], 0, 0x1, "bbc_i2c_bussel");
314 if (!bp->i2c_bussel_reg)
318 bp->waiting = 0;
319 init_waitqueue_head(&bp->wq);
321 IRQF_SHARED, "bbc_i2c", bp))
324 bp->index = index;
325 bp->op = op;
327 spin_lock_init(&bp->lock);
336 bp->devs[entry].device = child_op;
337 bp->devs[entry].client_claimed = 0;
340 writeb(I2C_PCF_PIN, bp->i2c_control_regs + 0x0);
341 bp->own = readb(bp->i2c_control_regs + 0x01);
342 writeb(I2C_PCF_PIN | I2C_PCF_ES1, bp->i2c_control_regs + 0x0);
343 bp->clock = readb(bp->i2c_control_regs + 0x01);
346 bp->index, bp->i2c_control_regs, entry, bp->own, bp->clock);
348 reset_one_i2c(bp);
350 return bp;
353 if (bp->i2c_bussel_reg)
354 of_iounmap(&op->resource[1], bp->i2c_bussel_reg, 1);
355 if (bp->i2c_control_regs)
356 of_iounmap(&op->resource[0], bp->i2c_control_regs, 2);
357 kfree(bp);
363 struct bbc_i2c_bus *bp;
366 bp = attach_one_i2c(op, index);
367 if (!bp)
370 err = bbc_envctrl_init(bp);
372 free_irq(op->archdata.irqs[0], bp);
373 if (bp->i2c_bussel_reg)
374 of_iounmap(&op->resource[0], bp->i2c_bussel_reg, 1);
375 if (bp->i2c_control_regs)
376 of_iounmap(&op->resource[1], bp->i2c_control_regs, 2);
377 kfree(bp);
379 dev_set_drvdata(&op->dev, bp);
387 struct bbc_i2c_bus *bp = dev_get_drvdata(&op->dev);
389 bbc_envctrl_cleanup(bp);
391 free_irq(op->archdata.irqs[0], bp);
393 if (bp->i2c_bussel_reg)
394 of_iounmap(&op->resource[0], bp->i2c_bussel_reg, 1);
395 if (bp->i2c_control_regs)
396 of_iounmap(&op->resource[1], bp->i2c_control_regs, 2);
398 kfree(bp);