/* * Disables the IRQ on Galileo Chip * * Inputs : * int_cause - The interrupt cause number. In EVB64120 two parameters * are declared, INT_CAUSE_MAIN and INT_CAUSE_HIGH. * bit_num - Indicates which bit number in the cause register * * Outputs : * 1 if succesful, 0 if failure */ int disable_galileo_irq(int int_cause, int bit_num) { if (int_cause == INT_CAUSE_MAIN) RESET_REG_BITS(CPU_INTERRUPT_MASK_REGISTER, (1 << bit_num)); else if (int_cause == INT_CAUSE_HIGH) RESET_REG_BITS(CPU_HIGH_INTERRUPT_MASK_REGISTER, (1 << bit_num)); else return 0; return 1; }
static uchar i2c_get_data (uchar * return_data, int len) { unsigned int data, status = 0; int count = 0; DP (puts ("i2c_get_data\n")); while (len) { /* Get and return the data */ RESET_REG_BITS (I2C_CONTROL, (0x1 << 3)); udelay (I2C_DELAY * 5); GT_REG_READ (I2C_STATUS_BAUDE_RATE, &status); count++; while ((status & 0xff) != 0x50) { udelay (I2C_DELAY); if (count > 2) { GT_REG_WRITE (I2C_CONTROL, (0x1 << 4)); /*stop */ return 0; } GT_REG_READ (I2C_STATUS_BAUDE_RATE, &status); count++; } GT_REG_READ (I2C_DATA, &data); len--; *return_data = (uchar) data; return_data++; } RESET_REG_BITS (I2C_CONTROL, BIT2 | BIT3); while ((status & 0xff) != 0x58) { udelay (I2C_DELAY); if (count > 200) { GT_REG_WRITE (I2C_CONTROL, (0x1 << 4)); /*stop */ return (status); } GT_REG_READ (I2C_STATUS_BAUDE_RATE, &status); count++; } GT_REG_WRITE (I2C_CONTROL, (0x1 << 4)); /* stop */ return (0); }
/* anything other than zero is failure */ static uchar i2c_write_byte (unsigned char *data, int len) { unsigned int status; int count = 0; unsigned int temp; unsigned char *temp_ptr = data; DP (puts ("i2c_write_byte\n")); while (len) { /* Set and assert the data */ temp = *temp_ptr; GT_REG_WRITE (I2C_DATA, temp); RESET_REG_BITS (I2C_CONTROL, (0x1 << 3)); udelay (I2C_DELAY); GT_REG_READ (I2C_STATUS_BAUDE_RATE, &status); count++; while ((status & 0xff) != 0x28) { udelay (I2C_DELAY); if (count > 20) { GT_REG_WRITE (I2C_CONTROL, (0x1 << 4)); /*stop */ return (status); } GT_REG_READ (I2C_STATUS_BAUDE_RATE, &status); count++; } len--; temp_ptr++; } /* Can't have the write issuing a stop command */ /* it's wrong to have a stop bit in read stream or write stream */ /* since we don't know if it's really the end of the command */ /* or whether we have just send the device address + offset */ /* we will push issuing the stop command off to the original */ /* calling function */ /* GT_REG_WRITE(I2C_CONTROL, (0x1 << 3) | (0x1 << 4)); GT_REG_WRITE(I2C_CONTROL, (0x1 << 4)); */ /* set the interrupt bit in the control register */ GT_REG_WRITE (I2C_CONTROL, (0x1 << 3)); udelay (I2C_DELAY * 10); return (0); }
static uchar i2c_select_device (uchar dev_addr, uchar read, int ten_bit) { unsigned int status, data, bits = 7; int count = 0; DP (puts ("i2c_select_device\n")); /* Output slave address */ if (ten_bit) { bits = 10; } data = (dev_addr << 1); /* set the read bit */ data |= read; GT_REG_WRITE (I2C_DATA, data); /* assert the address */ RESET_REG_BITS (I2C_CONTROL, BIT3); udelay (I2C_DELAY); GT_REG_READ (I2C_STATUS_BAUDE_RATE, &status); count = 0; while (((status & 0xff) != 0x40) && ((status & 0xff) != 0x18)) { udelay (I2C_DELAY); if (count > 20) { GT_REG_WRITE (I2C_CONTROL, (0x1 << 4)); /*stop */ return (status); } GT_REG_READ (I2C_STATUS_BAUDE_RATE, &status); count++; } if (bits == 10) { printf ("10 bit I2C addressing not yet implemented\n"); return (0xff); } return (0); }