static int imx_i2c_wait_for_not_busy(volatile imx_i2c *regs) { rtems_interval timeout; bool before; if ((regs->i2sr & IMX_I2C_I2SR_IBB) == 0) { return 0; } timeout = rtems_clock_tick_later(10); do { before = rtems_clock_tick_before(timeout); if ((regs->i2sr & IMX_I2C_I2SR_IBB) == 0) { return 0; } } while (before); return ETIMEDOUT; }
static void test_clock_tick_functions( void ) { rtems_interrupt_level level; Watchdog_Interval saved_ticks; _Thread_Disable_dispatch(); rtems_interrupt_disable( level ); saved_ticks = _Watchdog_Ticks_since_boot; _Watchdog_Ticks_since_boot = 0xdeadbeef; rtems_test_assert( rtems_clock_get_ticks_since_boot() == 0xdeadbeef ); rtems_test_assert( rtems_clock_tick_later( 0 ) == 0xdeadbeef ); rtems_test_assert( rtems_clock_tick_later( 0x8160311e ) == 0x600df00d ); _Watchdog_Ticks_since_boot = 0; rtems_test_assert( rtems_clock_tick_later_usec( 0 ) == 1 ); rtems_test_assert( rtems_clock_tick_later_usec( 1 ) == 2 ); rtems_test_assert( rtems_clock_tick_later_usec( US_PER_TICK ) == 2 ); rtems_test_assert( rtems_clock_tick_later_usec( US_PER_TICK + 1 ) == 3 ); _Watchdog_Ticks_since_boot = 0; rtems_test_assert( !rtems_clock_tick_before( 0xffffffff ) ); rtems_test_assert( !rtems_clock_tick_before( 0 ) ); rtems_test_assert( rtems_clock_tick_before( 1 ) ); _Watchdog_Ticks_since_boot = 1; rtems_test_assert( !rtems_clock_tick_before( 0 ) ); rtems_test_assert( !rtems_clock_tick_before( 1 ) ); rtems_test_assert( rtems_clock_tick_before( 2 ) ); _Watchdog_Ticks_since_boot = 0x7fffffff; rtems_test_assert( !rtems_clock_tick_before( 0x7ffffffe ) ); rtems_test_assert( !rtems_clock_tick_before( 0x7fffffff ) ); rtems_test_assert( rtems_clock_tick_before( 0x80000000 ) ); _Watchdog_Ticks_since_boot = 0x80000000; rtems_test_assert( !rtems_clock_tick_before( 0x7fffffff ) ); rtems_test_assert( !rtems_clock_tick_before( 0x80000000 ) ); rtems_test_assert( rtems_clock_tick_before( 0x80000001 ) ); _Watchdog_Ticks_since_boot = 0xffffffff; rtems_test_assert( !rtems_clock_tick_before( 0xfffffffe ) ); rtems_test_assert( !rtems_clock_tick_before( 0xffffffff ) ); rtems_test_assert( rtems_clock_tick_before( 0 ) ); _Watchdog_Ticks_since_boot = saved_ticks; rtems_interrupt_enable( level ); _Thread_Enable_dispatch(); }