1ecc2ed55SSimon Glass /* 2ecc2ed55SSimon Glass * Copyright (C) 2013 Google, Inc 3ecc2ed55SSimon Glass * 4ecc2ed55SSimon Glass * SPDX-License-Identifier: GPL-2.0+ 5ecc2ed55SSimon Glass * 6ecc2ed55SSimon Glass * Note: Test coverage does not include 10-bit addressing 7ecc2ed55SSimon Glass */ 8ecc2ed55SSimon Glass 9ecc2ed55SSimon Glass #include <common.h> 10ecc2ed55SSimon Glass #include <dm.h> 11ecc2ed55SSimon Glass #include <fdtdec.h> 12ecc2ed55SSimon Glass #include <i2c.h> 13ecc2ed55SSimon Glass #include <dm/device-internal.h> 14ecc2ed55SSimon Glass #include <dm/test.h> 15ecc2ed55SSimon Glass #include <dm/uclass-internal.h> 16ecc2ed55SSimon Glass #include <dm/ut.h> 17ecc2ed55SSimon Glass #include <dm/util.h> 18ecc2ed55SSimon Glass #include <asm/state.h> 19ecc2ed55SSimon Glass #include <asm/test.h> 20ecc2ed55SSimon Glass 21ecc2ed55SSimon Glass static const int busnum; 22ecc2ed55SSimon Glass static const int chip = 0x2c; 23ecc2ed55SSimon Glass 24ecc2ed55SSimon Glass /* Test that we can find buses and chips */ 25ecc2ed55SSimon Glass static int dm_test_i2c_find(struct dm_test_state *dms) 26ecc2ed55SSimon Glass { 27ecc2ed55SSimon Glass struct udevice *bus, *dev; 28ecc2ed55SSimon Glass const int no_chip = 0x10; 29ecc2ed55SSimon Glass 30ecc2ed55SSimon Glass ut_asserteq(-ENODEV, uclass_find_device_by_seq(UCLASS_I2C, busnum, 31ecc2ed55SSimon Glass false, &bus)); 32ecc2ed55SSimon Glass 33ecc2ed55SSimon Glass /* 34ecc2ed55SSimon Glass * i2c_post_bind() will bind devices to chip selects. Check this then 35ecc2ed55SSimon Glass * remove the emulation and the slave device. 36ecc2ed55SSimon Glass */ 37ecc2ed55SSimon Glass ut_assertok(uclass_get_device_by_seq(UCLASS_I2C, busnum, &bus)); 38f9a4c2daSSimon Glass ut_assertok(dm_i2c_probe(bus, chip, 0, &dev)); 39f9a4c2daSSimon Glass ut_asserteq(-ENODEV, dm_i2c_probe(bus, no_chip, 0, &dev)); 40ecc2ed55SSimon Glass ut_asserteq(-ENODEV, uclass_get_device_by_seq(UCLASS_I2C, 1, &bus)); 41ecc2ed55SSimon Glass 42ecc2ed55SSimon Glass return 0; 43ecc2ed55SSimon Glass } 44ecc2ed55SSimon Glass DM_TEST(dm_test_i2c_find, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT); 45ecc2ed55SSimon Glass 46ecc2ed55SSimon Glass static int dm_test_i2c_read_write(struct dm_test_state *dms) 47ecc2ed55SSimon Glass { 48ecc2ed55SSimon Glass struct udevice *bus, *dev; 49ecc2ed55SSimon Glass uint8_t buf[5]; 50ecc2ed55SSimon Glass 51ecc2ed55SSimon Glass ut_assertok(uclass_get_device_by_seq(UCLASS_I2C, busnum, &bus)); 52*25ab4b03SSimon Glass ut_assertok(i2c_get_chip(bus, chip, 1, &dev)); 53f9a4c2daSSimon Glass ut_assertok(dm_i2c_read(dev, 0, buf, 5)); 54ecc2ed55SSimon Glass ut_assertok(memcmp(buf, "\0\0\0\0\0", sizeof(buf))); 55f9a4c2daSSimon Glass ut_assertok(dm_i2c_write(dev, 2, (uint8_t *)"AB", 2)); 56f9a4c2daSSimon Glass ut_assertok(dm_i2c_read(dev, 0, buf, 5)); 57ecc2ed55SSimon Glass ut_assertok(memcmp(buf, "\0\0AB\0", sizeof(buf))); 58ecc2ed55SSimon Glass 59ecc2ed55SSimon Glass return 0; 60ecc2ed55SSimon Glass } 61ecc2ed55SSimon Glass DM_TEST(dm_test_i2c_read_write, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT); 62ecc2ed55SSimon Glass 63ecc2ed55SSimon Glass static int dm_test_i2c_speed(struct dm_test_state *dms) 64ecc2ed55SSimon Glass { 65ecc2ed55SSimon Glass struct udevice *bus, *dev; 66ecc2ed55SSimon Glass uint8_t buf[5]; 67ecc2ed55SSimon Glass 68ecc2ed55SSimon Glass ut_assertok(uclass_get_device_by_seq(UCLASS_I2C, busnum, &bus)); 69*25ab4b03SSimon Glass ut_assertok(i2c_get_chip(bus, chip, 1, &dev)); 70ecc2ed55SSimon Glass ut_assertok(i2c_set_bus_speed(bus, 100000)); 71f9a4c2daSSimon Glass ut_assertok(dm_i2c_read(dev, 0, buf, 5)); 72ecc2ed55SSimon Glass ut_assertok(i2c_set_bus_speed(bus, 400000)); 73ecc2ed55SSimon Glass ut_asserteq(400000, i2c_get_bus_speed(bus)); 74f9a4c2daSSimon Glass ut_assertok(dm_i2c_read(dev, 0, buf, 5)); 75f9a4c2daSSimon Glass ut_asserteq(-EINVAL, dm_i2c_write(dev, 0, buf, 5)); 76ecc2ed55SSimon Glass 77ecc2ed55SSimon Glass return 0; 78ecc2ed55SSimon Glass } 79ecc2ed55SSimon Glass DM_TEST(dm_test_i2c_speed, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT); 80ecc2ed55SSimon Glass 81ecc2ed55SSimon Glass static int dm_test_i2c_offset_len(struct dm_test_state *dms) 82ecc2ed55SSimon Glass { 83ecc2ed55SSimon Glass struct udevice *bus, *dev; 84ecc2ed55SSimon Glass uint8_t buf[5]; 85ecc2ed55SSimon Glass 86ecc2ed55SSimon Glass ut_assertok(uclass_get_device_by_seq(UCLASS_I2C, busnum, &bus)); 87*25ab4b03SSimon Glass ut_assertok(i2c_get_chip(bus, chip, 1, &dev)); 88ecc2ed55SSimon Glass ut_assertok(i2c_set_chip_offset_len(dev, 1)); 89f9a4c2daSSimon Glass ut_assertok(dm_i2c_read(dev, 0, buf, 5)); 90ecc2ed55SSimon Glass 91ecc2ed55SSimon Glass /* This is not supported by the uclass */ 92ecc2ed55SSimon Glass ut_asserteq(-EINVAL, i2c_set_chip_offset_len(dev, 5)); 93ecc2ed55SSimon Glass 94ecc2ed55SSimon Glass return 0; 95ecc2ed55SSimon Glass } 96ecc2ed55SSimon Glass DM_TEST(dm_test_i2c_offset_len, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT); 97ecc2ed55SSimon Glass 98ecc2ed55SSimon Glass static int dm_test_i2c_probe_empty(struct dm_test_state *dms) 99ecc2ed55SSimon Glass { 100ecc2ed55SSimon Glass struct udevice *bus, *dev; 101ecc2ed55SSimon Glass 102ecc2ed55SSimon Glass ut_assertok(uclass_get_device_by_seq(UCLASS_I2C, busnum, &bus)); 103f9a4c2daSSimon Glass ut_assertok(dm_i2c_probe(bus, SANDBOX_I2C_TEST_ADDR, 0, &dev)); 104ecc2ed55SSimon Glass 105ecc2ed55SSimon Glass return 0; 106ecc2ed55SSimon Glass } 107ecc2ed55SSimon Glass DM_TEST(dm_test_i2c_probe_empty, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT); 108ecc2ed55SSimon Glass 109ecc2ed55SSimon Glass static int dm_test_i2c_bytewise(struct dm_test_state *dms) 110ecc2ed55SSimon Glass { 111ecc2ed55SSimon Glass struct udevice *bus, *dev; 112ecc2ed55SSimon Glass struct udevice *eeprom; 113ecc2ed55SSimon Glass uint8_t buf[5]; 114ecc2ed55SSimon Glass 115ecc2ed55SSimon Glass ut_assertok(uclass_get_device_by_seq(UCLASS_I2C, busnum, &bus)); 116*25ab4b03SSimon Glass ut_assertok(i2c_get_chip(bus, chip, 1, &dev)); 117f9a4c2daSSimon Glass ut_assertok(dm_i2c_read(dev, 0, buf, 5)); 118ecc2ed55SSimon Glass ut_assertok(memcmp(buf, "\0\0\0\0\0", sizeof(buf))); 119ecc2ed55SSimon Glass 120ecc2ed55SSimon Glass /* Tell the EEPROM to only read/write one register at a time */ 121ecc2ed55SSimon Glass ut_assertok(uclass_first_device(UCLASS_I2C_EMUL, &eeprom)); 122ecc2ed55SSimon Glass ut_assertnonnull(eeprom); 123ecc2ed55SSimon Glass sandbox_i2c_eeprom_set_test_mode(eeprom, SIE_TEST_MODE_SINGLE_BYTE); 124ecc2ed55SSimon Glass 125ecc2ed55SSimon Glass /* Now we only get the first byte - the rest will be 0xff */ 126f9a4c2daSSimon Glass ut_assertok(dm_i2c_read(dev, 0, buf, 5)); 127ecc2ed55SSimon Glass ut_assertok(memcmp(buf, "\0\xff\xff\xff\xff", sizeof(buf))); 128ecc2ed55SSimon Glass 129ecc2ed55SSimon Glass /* If we do a separate transaction for each byte, it works */ 130ecc2ed55SSimon Glass ut_assertok(i2c_set_chip_flags(dev, DM_I2C_CHIP_RD_ADDRESS)); 131f9a4c2daSSimon Glass ut_assertok(dm_i2c_read(dev, 0, buf, 5)); 132ecc2ed55SSimon Glass ut_assertok(memcmp(buf, "\0\0\0\0\0", sizeof(buf))); 133ecc2ed55SSimon Glass 134ecc2ed55SSimon Glass /* This will only write A */ 135ecc2ed55SSimon Glass ut_assertok(i2c_set_chip_flags(dev, 0)); 136f9a4c2daSSimon Glass ut_assertok(dm_i2c_write(dev, 2, (uint8_t *)"AB", 2)); 137f9a4c2daSSimon Glass ut_assertok(dm_i2c_read(dev, 0, buf, 5)); 138ecc2ed55SSimon Glass ut_assertok(memcmp(buf, "\0\xff\xff\xff\xff", sizeof(buf))); 139ecc2ed55SSimon Glass 140ecc2ed55SSimon Glass /* Check that the B was ignored */ 141ecc2ed55SSimon Glass ut_assertok(i2c_set_chip_flags(dev, DM_I2C_CHIP_RD_ADDRESS)); 142f9a4c2daSSimon Glass ut_assertok(dm_i2c_read(dev, 0, buf, 5)); 143ecc2ed55SSimon Glass ut_assertok(memcmp(buf, "\0\0A\0\0\0", sizeof(buf))); 144ecc2ed55SSimon Glass 145ecc2ed55SSimon Glass /* Now write it again with the new flags, it should work */ 146ecc2ed55SSimon Glass ut_assertok(i2c_set_chip_flags(dev, DM_I2C_CHIP_WR_ADDRESS)); 147f9a4c2daSSimon Glass ut_assertok(dm_i2c_write(dev, 2, (uint8_t *)"AB", 2)); 148f9a4c2daSSimon Glass ut_assertok(dm_i2c_read(dev, 0, buf, 5)); 149ecc2ed55SSimon Glass ut_assertok(memcmp(buf, "\0\xff\xff\xff\xff", sizeof(buf))); 150ecc2ed55SSimon Glass 151ecc2ed55SSimon Glass ut_assertok(i2c_set_chip_flags(dev, DM_I2C_CHIP_WR_ADDRESS | 152ecc2ed55SSimon Glass DM_I2C_CHIP_RD_ADDRESS)); 153f9a4c2daSSimon Glass ut_assertok(dm_i2c_read(dev, 0, buf, 5)); 154ecc2ed55SSimon Glass ut_assertok(memcmp(buf, "\0\0AB\0\0", sizeof(buf))); 155ecc2ed55SSimon Glass 156ecc2ed55SSimon Glass /* Restore defaults */ 157ecc2ed55SSimon Glass sandbox_i2c_eeprom_set_test_mode(eeprom, SIE_TEST_MODE_NONE); 158ecc2ed55SSimon Glass ut_assertok(i2c_set_chip_flags(dev, 0)); 159ecc2ed55SSimon Glass 160ecc2ed55SSimon Glass return 0; 161ecc2ed55SSimon Glass } 162ecc2ed55SSimon Glass DM_TEST(dm_test_i2c_bytewise, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT); 163ecc2ed55SSimon Glass 164ecc2ed55SSimon Glass static int dm_test_i2c_offset(struct dm_test_state *dms) 165ecc2ed55SSimon Glass { 166ecc2ed55SSimon Glass struct udevice *eeprom; 167ecc2ed55SSimon Glass struct udevice *dev; 168ecc2ed55SSimon Glass uint8_t buf[5]; 169ecc2ed55SSimon Glass 170*25ab4b03SSimon Glass ut_assertok(i2c_get_chip_for_busnum(busnum, chip, 1, &dev)); 171ecc2ed55SSimon Glass 172ecc2ed55SSimon Glass /* Do a transfer so we can find the emulator */ 173f9a4c2daSSimon Glass ut_assertok(dm_i2c_read(dev, 0, buf, 5)); 174ecc2ed55SSimon Glass ut_assertok(uclass_first_device(UCLASS_I2C_EMUL, &eeprom)); 175ecc2ed55SSimon Glass 176ecc2ed55SSimon Glass /* Offset length 0 */ 177ecc2ed55SSimon Glass sandbox_i2c_eeprom_set_offset_len(eeprom, 0); 178ecc2ed55SSimon Glass ut_assertok(i2c_set_chip_offset_len(dev, 0)); 179f9a4c2daSSimon Glass ut_assertok(dm_i2c_write(dev, 10 /* ignored */, (uint8_t *)"AB", 2)); 180f9a4c2daSSimon Glass ut_assertok(dm_i2c_read(dev, 0, buf, 5)); 181ecc2ed55SSimon Glass ut_assertok(memcmp(buf, "AB\0\0\0\0", sizeof(buf))); 182ecc2ed55SSimon Glass 183ecc2ed55SSimon Glass /* Offset length 1 */ 184ecc2ed55SSimon Glass sandbox_i2c_eeprom_set_offset_len(eeprom, 1); 185ecc2ed55SSimon Glass ut_assertok(i2c_set_chip_offset_len(dev, 1)); 186f9a4c2daSSimon Glass ut_assertok(dm_i2c_write(dev, 2, (uint8_t *)"AB", 2)); 187f9a4c2daSSimon Glass ut_assertok(dm_i2c_read(dev, 0, buf, 5)); 188ecc2ed55SSimon Glass ut_assertok(memcmp(buf, "ABAB\0", sizeof(buf))); 189ecc2ed55SSimon Glass 190ecc2ed55SSimon Glass /* Offset length 2 */ 191ecc2ed55SSimon Glass sandbox_i2c_eeprom_set_offset_len(eeprom, 2); 192ecc2ed55SSimon Glass ut_assertok(i2c_set_chip_offset_len(dev, 2)); 193f9a4c2daSSimon Glass ut_assertok(dm_i2c_write(dev, 0x210, (uint8_t *)"AB", 2)); 194f9a4c2daSSimon Glass ut_assertok(dm_i2c_read(dev, 0x210, buf, 5)); 195ecc2ed55SSimon Glass ut_assertok(memcmp(buf, "AB\0\0\0", sizeof(buf))); 196ecc2ed55SSimon Glass 197ecc2ed55SSimon Glass /* Offset length 3 */ 198ecc2ed55SSimon Glass sandbox_i2c_eeprom_set_offset_len(eeprom, 2); 199ecc2ed55SSimon Glass ut_assertok(i2c_set_chip_offset_len(dev, 2)); 200f9a4c2daSSimon Glass ut_assertok(dm_i2c_write(dev, 0x410, (uint8_t *)"AB", 2)); 201f9a4c2daSSimon Glass ut_assertok(dm_i2c_read(dev, 0x410, buf, 5)); 202ecc2ed55SSimon Glass ut_assertok(memcmp(buf, "AB\0\0\0", sizeof(buf))); 203ecc2ed55SSimon Glass 204ecc2ed55SSimon Glass /* Offset length 4 */ 205ecc2ed55SSimon Glass sandbox_i2c_eeprom_set_offset_len(eeprom, 2); 206ecc2ed55SSimon Glass ut_assertok(i2c_set_chip_offset_len(dev, 2)); 207f9a4c2daSSimon Glass ut_assertok(dm_i2c_write(dev, 0x420, (uint8_t *)"AB", 2)); 208f9a4c2daSSimon Glass ut_assertok(dm_i2c_read(dev, 0x420, buf, 5)); 209ecc2ed55SSimon Glass ut_assertok(memcmp(buf, "AB\0\0\0", sizeof(buf))); 210ecc2ed55SSimon Glass 211ecc2ed55SSimon Glass /* Restore defaults */ 212ecc2ed55SSimon Glass sandbox_i2c_eeprom_set_offset_len(eeprom, 1); 213ecc2ed55SSimon Glass 214ecc2ed55SSimon Glass return 0; 215ecc2ed55SSimon Glass } 216ecc2ed55SSimon Glass DM_TEST(dm_test_i2c_offset, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT); 217