int i2c_bus_register_imx(const char *bus_path, const char *alias_or_path) { const void *fdt; const char *path; int node; imx_i2c_bus *bus; int eno; fdt = bsp_fdt_get(); path = fdt_get_alias(fdt, alias_or_path); if (path == NULL) { path = alias_or_path; } node = fdt_path_offset(fdt, path); if (node < 0) { rtems_set_errno_and_return_minus_one(ENXIO); } bus = (imx_i2c_bus *) i2c_bus_alloc_and_init(sizeof(*bus)); if (bus == NULL){ return -1; } bus->regs = imx_get_reg_of_node(fdt, node); bus->irq = imx_get_irq_of_node(fdt, node, 0); eno = imx_i2c_init(bus); if (eno != 0) { (*bus->base.destroy)(&bus->base); rtems_set_errno_and_return_minus_one(eno); } bus->base.transfer = imx_i2c_transfer; bus->base.set_clock = imx_i2c_set_clock; bus->base.destroy = imx_i2c_destroy; return i2c_bus_register(&bus->base, bus_path); }
static void test(void) { rtems_resource_snapshot snapshot; test_bus *bus; int rv; int fd; rtems_resource_snapshot_take(&snapshot); bus = (test_bus *) i2c_bus_alloc_and_init(sizeof(*bus)); rtems_test_assert(bus != NULL); bus->base.transfer = test_transfer; bus->base.set_clock = test_set_clock; bus->base.destroy = test_destroy; bus->base.functionality = I2C_FUNC_I2C | I2C_FUNC_PROTOCOL_MANGLING | I2C_FUNC_NOSTART; bus->simple_read_write.base.transfer = test_simple_read_write_transfer; bus->devices[0] = &bus->simple_read_write.base; bus->eeprom.base.transfer = test_eeprom_transfer; bus->devices[1] = &bus->eeprom.base; bus->gpio_nxp_pca9535.base.transfer = test_gpio_nxp_pca9535_transfer; bus->devices[2] = &bus->gpio_nxp_pca9535.base; bus->switch_nxp_pca9548a.base.transfer = test_switch_nxp_pca9548a_transfer; bus->devices[3] = &bus->switch_nxp_pca9548a.base; rv = i2c_bus_register(&bus->base, &bus_path[0]); rtems_test_assert(rv == 0); fd = open(&bus_path[0], O_RDWR); rtems_test_assert(fd >= 0); rtems_test_assert(bus->clock == 0); rv = ioctl(fd, I2C_BUS_SET_CLOCK, 0xdeadbeefUL); rtems_test_assert(rv == 0); rtems_test_assert(bus->clock == 0xdeadbeef); rv = ioctl(fd, I2C_BUS_OBTAIN); rtems_test_assert(rv == 0); rv = ioctl(fd, I2C_BUS_RELEASE); rtems_test_assert(rv == 0); rtems_test_assert(!bus->base.ten_bit_address); rv = ioctl(fd, I2C_TENBIT, 1UL); rtems_test_assert(rv == 0); rtems_test_assert(bus->base.ten_bit_address); rv = ioctl(fd, I2C_TENBIT, 0UL); rtems_test_assert(rv == 0); rtems_test_assert(!bus->base.ten_bit_address); rtems_test_assert(!bus->base.use_pec); rv = ioctl(fd, I2C_PEC, 1UL); rtems_test_assert(rv == 0); rtems_test_assert(bus->base.use_pec); rv = ioctl(fd, I2C_PEC, 0UL); rtems_test_assert(rv == 0); rtems_test_assert(!bus->base.use_pec); rv = ioctl(fd, I2C_SLAVE, 123UL); rtems_test_assert(rv == 0); rtems_test_assert(bus->base.default_address == 123); rv = ioctl(fd, I2C_SLAVE_FORCE, 456UL); rtems_test_assert(rv == 0); rtems_test_assert(bus->base.default_address == 456); rtems_test_assert(bus->base.retries == 0); rv = ioctl(fd, I2C_RETRIES, 1UL); rtems_test_assert(rv == 0); rtems_test_assert(bus->base.retries == 1); rv = ioctl(fd, I2C_RETRIES, 0UL); rtems_test_assert(rv == 0); rtems_test_assert(bus->base.retries == 0); rtems_test_assert(bus->base.timeout == 0); rv = ioctl(fd, I2C_TIMEOUT, 1UL); rtems_test_assert(rv == 0); rtems_test_assert(bus->base.timeout == 5); rv = ioctl(fd, I2C_TIMEOUT, 0UL); rtems_test_assert(rv == 0); rtems_test_assert(bus->base.timeout == 0); test_simple_read_write(bus, fd); test_eeprom(bus); test_gpio_nxp_pca9535(); test_switch_nxp_pca9548a(); rv = close(fd); rtems_test_assert(rv == 0); rv = unlink(&bus_path[0]); rtems_test_assert(rv == 0); rtems_test_assert(rtems_resource_snapshot_check(&snapshot)); }