int saa7164_api_i2c_read(struct saa7164_i2c *bus, u8 addr, u32 reglen, u8 *reg, u32 datalen, u8 *data) { struct saa7164_dev *dev = bus->dev; u16 len = 0; int unitid; u8 buf[256]; int ret; dprintk(DBGLVL_API, "%s()\n", __func__); if (reglen > 4) return -EIO; /* Prepare the send buffer */ /* Bytes 00-03 source register length * 04-07 source bytes to read * 08... register address */ memset(buf, 0, sizeof(buf)); memcpy((buf + 2 * sizeof(u32) + 0), reg, reglen); *((u32 *)(buf + 0 * sizeof(u32))) = reglen; *((u32 *)(buf + 1 * sizeof(u32))) = datalen; unitid = saa7164_i2caddr_to_unitid(bus, addr); if (unitid < 0) { printk(KERN_ERR "%s() error, cannot translate regaddr 0x%x to unitid\n", __func__, addr); return -EIO; } ret = saa7164_cmd_send(bus->dev, unitid, GET_LEN, EXU_REGISTER_ACCESS_CONTROL, sizeof(len), &len); if (ret != SAA_OK) { printk(KERN_ERR "%s() error, ret(1) = 0x%x\n", __func__, ret); return -EIO; } dprintk(DBGLVL_API, "%s() len = %d bytes\n", __func__, len); if (saa_debug & DBGLVL_I2C) saa7164_dumphex16(dev, buf, 2 * 16); ret = saa7164_cmd_send(bus->dev, unitid, GET_CUR, EXU_REGISTER_ACCESS_CONTROL, len, &buf); if (ret != SAA_OK) printk(KERN_ERR "%s() error, ret(2) = 0x%x\n", __func__, ret); else { if (saa_debug & DBGLVL_I2C) saa7164_dumphex16(dev, buf, sizeof(buf)); memcpy(data, (buf + 2 * sizeof(u32) + reglen), datalen); } return ret == SAA_OK ? 0 : -EIO; }
int saa7164_api_i2c_write(struct saa7164_i2c *bus, u8 addr, u32 datalen, u8 *data) { struct saa7164_dev *dev = bus->dev; u16 len = 0; int unitid; int reglen; u8 buf[256]; int ret; dprintk(DBGLVL_API, "%s()\n", __func__); if ((datalen == 0) || (datalen > 232)) return -EIO; memset(buf, 0, sizeof(buf)); unitid = saa7164_i2caddr_to_unitid(bus, addr); if (unitid < 0) { printk(KERN_ERR "%s() error, cannot translate regaddr 0x%x to unitid\n", __func__, addr); return -EIO; } reglen = saa7164_i2caddr_to_reglen(bus, addr); if (reglen < 0) { printk(KERN_ERR "%s() error, cannot translate regaddr to reglen\n", __func__); return -EIO; } ret = saa7164_cmd_send(bus->dev, unitid, GET_LEN, EXU_REGISTER_ACCESS_CONTROL, sizeof(len), &len); if (ret != SAA_OK) { printk(KERN_ERR "%s() error, ret(1) = 0x%x\n", __func__, ret); return -EIO; } dprintk(DBGLVL_API, "%s() len = %d bytes\n", __func__, len); /* */ /* */ *((u32 *)(buf + 0 * sizeof(u32))) = reglen; *((u32 *)(buf + 1 * sizeof(u32))) = datalen - reglen; memcpy((buf + 2 * sizeof(u32)), data, datalen); if (saa_debug & DBGLVL_I2C) saa7164_dumphex16(dev, buf, sizeof(buf)); ret = saa7164_cmd_send(bus->dev, unitid, SET_CUR, EXU_REGISTER_ACCESS_CONTROL, len, &buf); if (ret != SAA_OK) printk(KERN_ERR "%s() error, ret(2) = 0x%x\n", __func__, ret); return ret == SAA_OK ? 0 : -EIO; }
int saa7164_api_i2c_read(struct saa7164_i2c *bus, u8 addr, u32 reglen, u8 *reg, u32 datalen, u8 *data) { struct saa7164_dev *dev = bus->dev; u16 len = 0; int unitid; u32 regval; u8 buf[256]; int ret; dprintk(DBGLVL_API, "%s()\n", __func__); if (reglen > 4) return -EIO; if (reglen == 1) regval = *(reg); else if (reglen == 2) regval = ((*(reg) << 8) || *(reg+1)); else if (reglen == 3) regval = ((*(reg) << 16) | (*(reg+1) << 8) | *(reg+2)); else if (reglen == 4) regval = ((*(reg) << 24) | (*(reg+1) << 16) | (*(reg+2) << 8) | *(reg+3)); /* */ /* */ memset(buf, 0, sizeof(buf)); memcpy((buf + 2 * sizeof(u32) + 0), reg, reglen); *((u32 *)(buf + 0 * sizeof(u32))) = reglen; *((u32 *)(buf + 1 * sizeof(u32))) = datalen; unitid = saa7164_i2caddr_to_unitid(bus, addr); if (unitid < 0) { printk(KERN_ERR "%s() error, cannot translate regaddr 0x%x to unitid\n", __func__, addr); return -EIO; } ret = saa7164_cmd_send(bus->dev, unitid, GET_LEN, EXU_REGISTER_ACCESS_CONTROL, sizeof(len), &len); if (ret != SAA_OK) { printk(KERN_ERR "%s() error, ret(1) = 0x%x\n", __func__, ret); return -EIO; } dprintk(DBGLVL_API, "%s() len = %d bytes\n", __func__, len); if (saa_debug & DBGLVL_I2C) saa7164_dumphex16(dev, buf, 2 * 16); ret = saa7164_cmd_send(bus->dev, unitid, GET_CUR, EXU_REGISTER_ACCESS_CONTROL, len, &buf); if (ret != SAA_OK) printk(KERN_ERR "%s() error, ret(2) = 0x%x\n", __func__, ret); else { if (saa_debug & DBGLVL_I2C) saa7164_dumphex16(dev, buf, sizeof(buf)); memcpy(data, (buf + 2 * sizeof(u32) + reglen), datalen); } return ret == SAA_OK ? 0 : -EIO; }