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_set_dif(struct saa7164_port *port, u8 reg, u8 val) { struct saa7164_dev *dev = port->dev; u16 len = 0; u8 buf[256]; int ret; u8 mas; dprintk(DBGLVL_API, "%s(nr=%d type=%d val=%x)\n", __func__, port->nr, port->type, val); if (port->nr == 0) mas = 0xd0; else mas = 0xe0; memset(buf, 0, sizeof(buf)); buf[0x00] = 0x04; buf[0x01] = 0x00; buf[0x02] = 0x00; buf[0x03] = 0x00; buf[0x04] = 0x04; buf[0x05] = 0x00; buf[0x06] = 0x00; buf[0x07] = 0x00; buf[0x08] = reg; buf[0x09] = 0x26; buf[0x0a] = mas; buf[0x0b] = 0xb0; buf[0x0c] = val; buf[0x0d] = 0x00; buf[0x0e] = 0x00; buf[0x0f] = 0x00; ret = saa7164_cmd_send(dev, port->ifunit.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; } ret = saa7164_cmd_send(dev, port->ifunit.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); #if 0 saa7164_dumphex16(dev, buf, 16); #endif return ret == SAA_OK ? 0 : -EIO; }
int saa7164_api_enum_subdevs(struct saa7164_dev *dev) { int ret; u32 buflen = 0; u8 *buf; dprintk(DBGLVL_API, "%s()\n", __func__); /* Get the total descriptor length */ ret = saa7164_cmd_send(dev, 0, GET_LEN, GET_DESCRIPTORS_CONTROL, sizeof(buflen), &buflen); if (ret != SAA_OK) printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__, ret); dprintk(DBGLVL_API, "%s() total descriptor size = %d bytes.\n", __func__, buflen); /* Allocate enough storage for all of the descs */ buf = kzalloc(buflen, GFP_KERNEL); if (!buf) return SAA_ERR_NO_RESOURCES; /* Retrieve them */ ret = saa7164_cmd_send(dev, 0, GET_CUR, GET_DESCRIPTORS_CONTROL, buflen, buf); if (ret != SAA_OK) { printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__, ret); goto out; } if (saa_debug & DBGLVL_API) saa7164_dumphex16(dev, buf, (buflen/16)*16); saa7164_api_dump_subdevs(dev, buf, buflen); out: kfree(buf); return ret; }
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; }