static int abituguru_read(struct abituguru_data *data,
                          u8 bank_addr, u8 sensor_addr, u8 *buf, int count, int retries)
{
    int i;


    i = abituguru_send_address(data, bank_addr, sensor_addr, retries);
    if (i)
        return i;


    for (i = 0; i < count; i++) {
        if (abituguru_wait(data, ABIT_UGURU_STATUS_READ)) {
            ABIT_UGURU_DEBUG(retries ? 1 : 3,
                             "timeout exceeded waiting for "
                             "read state (bank: %d, sensor: %d)\n",
                             (int)bank_addr, (int)sensor_addr);
            break;
        }
        buf[i] = inb(data->addr + ABIT_UGURU_CMD);
    }


    abituguru_ready(data);

    return i;
}
Exemplo n.º 2
0
static int abituguru_write(struct abituguru_data *data,
	u8 bank_addr, u8 sensor_addr, u8 *buf, int count)
{
	
	int i, timeout = ABIT_UGURU_READY_TIMEOUT;

	
	i = abituguru_send_address(data, bank_addr, sensor_addr,
		ABIT_UGURU_MAX_RETRIES);
	if (i)
		return i;

	
	for (i = 0; i < count; i++) {
		if (abituguru_wait(data, ABIT_UGURU_STATUS_WRITE)) {
			ABIT_UGURU_DEBUG(1, "timeout exceeded waiting for "
				"write state (bank: %d, sensor: %d)\n",
				(int)bank_addr, (int)sensor_addr);
			break;
		}
		outb(buf[i], data->addr + ABIT_UGURU_CMD);
	}

	
	if (abituguru_wait(data, ABIT_UGURU_STATUS_READ)) {
		ABIT_UGURU_DEBUG(1, "timeout exceeded waiting for read state "
			"after write (bank: %d, sensor: %d)\n", (int)bank_addr,
			(int)sensor_addr);
		return -EIO;
	}

	
	while (inb_p(data->addr + ABIT_UGURU_CMD) != 0xAC) {
		timeout--;
		if (timeout == 0) {
			ABIT_UGURU_DEBUG(1, "CMD reg does not hold 0xAC after "
				"write (bank: %d, sensor: %d)\n",
				(int)bank_addr, (int)sensor_addr);
			return -EIO;
		}
		msleep(0);
	}

	
	abituguru_ready(data);

	return i;
}