static int bttv_i2c_sendbytes(struct bttv *btv, const struct i2c_msg *msg, int last) { u32 xmit; int retval,cnt; /* sanity checks */ if (0 == msg->len) return -EINVAL; /* start, address + first byte */ xmit = (msg->addr << 25) | (msg->buf[0] << 16) | I2C_HW; if (msg->len > 1 || !last) xmit |= BT878_I2C_NOSTOP; btwrite(xmit, BT848_I2C); retval = bttv_i2c_wait_done(btv); if (retval < 0) goto err; if (retval == 0) goto eio; if (i2c_debug) { printk(KERN_INFO " <W %02x %02x", msg->addr << 1, msg->buf[0]); if (!(xmit & BT878_I2C_NOSTOP)) printk(KERN_INFO " >\n"); } for (cnt = 1; cnt < msg->len; cnt++ ) { /* following bytes */ xmit = (msg->buf[cnt] << 24) | I2C_HW | BT878_I2C_NOSTART; if (cnt < msg->len-1 || !last) xmit |= BT878_I2C_NOSTOP; btwrite(xmit, BT848_I2C); retval = bttv_i2c_wait_done(btv); if (retval < 0) goto err; if (retval == 0) goto eio; if (i2c_debug) { printk(KERN_INFO " %02x", msg->buf[cnt]); if (!(xmit & BT878_I2C_NOSTOP)) printk(KERN_INFO " >\n"); } } return msg->len; eio: retval = -EIO; err: if (i2c_debug) printk(KERN_INFO " ERR: %d\n", retval); return retval; }
static void setparam (struct zoran *zr, char *name, char *sval) { int i = 0, reg0, reg, val; while (zr67[i].name != NULL) { if (!strncmp(name, zr67[i].name, strlen(zr67[i].name))) { reg = reg0 = btread(zr67[i].reg); reg &= ~(zr67[i].mask << zr67[i].bit); if (!isdigit(sval[0])) break; val = simple_strtoul(sval, NULL, 0); if ((val & ~zr67[i].mask)) break; reg |= (val & zr67[i].mask) << zr67[i].bit; dprintk(4, KERN_INFO "%s: setparam: setting ZR36067 register 0x%03x: 0x%08x=>0x%08x %s=%d\n", ZR_DEVNAME(zr), zr67[i].reg, reg0, reg, zr67[i].name, val); btwrite(reg, zr67[i].reg); break; } i++; } }
static int bttv_i2c_xfer(struct i2c_adapter *i2c_adap, struct i2c_msg *msgs, int num) { struct v4l2_device *v4l2_dev = i2c_get_adapdata(i2c_adap); struct bttv *btv = to_bttv(v4l2_dev); int retval = 0; int i; if (i2c_debug) printk(KERN_INFO "bt-i2c:"); btwrite(BT848_INT_I2CDONE|BT848_INT_RACK, BT848_INT_STAT); for (i = 0 ; i < num; i++) { if (msgs[i].flags & I2C_M_RD) { /* read */ retval = bttv_i2c_readbytes(btv, &msgs[i], i+1 == num); if (retval < 0) goto err; } else { /* write */ retval = bttv_i2c_sendbytes(btv, &msgs[i], i+1 == num); if (retval < 0) goto err; } } return num; err: return retval; }
void bttv_vbi_setlines(struct bttv_fh *fh, struct bttv *btv, int lines) { int vdelay; if (lines < 1) lines = 1; if (lines > VBI_MAXLINES) lines = VBI_MAXLINES; fh->lines = lines; vdelay = btread(BT848_E_VDELAY_LO); if (vdelay < lines*2) { vdelay = lines*2; btwrite(vdelay,BT848_E_VDELAY_LO); btwrite(vdelay,BT848_O_VDELAY_LO); } }
int insert (short rrn, BTREG registro, short *promo_r_child, BTREG *promo_reg) { BTPAGE page, newpage; int found, promoted; short pos, p_b_rrn; BTREG p_b_reg; if (rrn == NIL) { *promo_reg = registro; *promo_r_child = NIL; return(YES); } btread(rrn, &page); found = search_node ( registro.key, &page, &pos); if (found == YES) return ERROR; //Chave duplicada no nó promoted = insert(page.child[pos], registro, &p_b_rrn, &p_b_reg); if (promoted == NO) return(NO); else if (promoted == ERROR) return ERROR; //Chave duplicada no nó filho if(page.keycount < MAXKEYS) { ins_in_page(p_b_reg, p_b_rrn, &page); btwrite(rrn, &page); return(NO); } else { split(p_b_reg, p_b_rrn, &page, promo_reg, promo_r_child, &newpage); btwrite(rrn, &page); btwrite(*promo_r_child, &newpage); return(YES); } }
void bttv_bit_setsda(void *data, int state) { struct bttv *btv = (struct bttv*)data; if (state) btv->i2c_state |= 0x01; else btv->i2c_state &= ~0x01; btwrite(btv->i2c_state, BT848_I2C); btread(BT848_I2C); }
static int bttv_i2c_readbytes(struct bttv *btv, const struct i2c_msg *msg, int last) { u32 xmit; u32 cnt; int retval; for (cnt = 0; cnt < msg->len; cnt++) { xmit = (msg->addr << 25) | (1 << 24) | I2C_HW; if (cnt < msg->len-1) xmit |= BT848_I2C_W3B; if (cnt < msg->len-1 || !last) xmit |= BT878_I2C_NOSTOP; if (cnt) xmit |= BT878_I2C_NOSTART; if (i2c_debug) { if (!(xmit & BT878_I2C_NOSTART)) pr_cont(" <R %02x", (msg->addr << 1) +1); } btwrite(xmit, BT848_I2C); retval = bttv_i2c_wait_done(btv); if (retval < 0) goto err; if (retval == 0) goto eio; msg->buf[cnt] = ((u32)btread(BT848_I2C) >> 8) & 0xff; if (i2c_debug) { pr_cont(" =%02x", msg->buf[cnt]); } if (i2c_debug && !(xmit & BT878_I2C_NOSTOP)) pr_cont(" >\n"); } return msg->len; eio: retval = -EIO; err: if (i2c_debug) pr_cont(" ERR: %d\n",retval); return retval; }