196495d90SSimon Glass /* 296495d90SSimon Glass * Copyright (C) 2013 Google, Inc 396495d90SSimon Glass * 496495d90SSimon Glass * SPDX-License-Identifier: GPL-2.0+ 596495d90SSimon Glass */ 696495d90SSimon Glass 796495d90SSimon Glass #include <common.h> 896495d90SSimon Glass #include <fdtdec.h> 996495d90SSimon Glass #include <dm.h> 10*4324174dSSimon Glass #include <dm/root.h> 1196495d90SSimon Glass #include <dm/ut.h> 1296495d90SSimon Glass #include <dm/test.h> 1396495d90SSimon Glass #include <dm/util.h> 1496495d90SSimon Glass #include <asm/gpio.h> 1596495d90SSimon Glass 16*4324174dSSimon Glass DECLARE_GLOBAL_DATA_PTR; 17*4324174dSSimon Glass 1896495d90SSimon Glass /* Test that sandbox GPIOs work correctly */ 1996495d90SSimon Glass static int dm_test_gpio(struct dm_test_state *dms) 2096495d90SSimon Glass { 2196495d90SSimon Glass unsigned int offset, gpio; 2296495d90SSimon Glass struct dm_gpio_ops *ops; 2354c5d08aSHeiko Schocher struct udevice *dev; 2496495d90SSimon Glass const char *name; 2596495d90SSimon Glass int offset_count; 2696495d90SSimon Glass char buf[80]; 2796495d90SSimon Glass 2896495d90SSimon Glass /* 2996495d90SSimon Glass * We expect to get 3 banks. One is anonymous (just numbered) and 3096495d90SSimon Glass * comes from platdata. The other two are named a (20 gpios) 3196495d90SSimon Glass * and b (10 gpios) and come from the device tree. See 3296495d90SSimon Glass * test/dm/test.dts. 3396495d90SSimon Glass */ 3496495d90SSimon Glass ut_assertok(gpio_lookup_name("b4", &dev, &offset, &gpio)); 3596495d90SSimon Glass ut_asserteq_str(dev->name, "extra-gpios"); 3696495d90SSimon Glass ut_asserteq(4, offset); 3796495d90SSimon Glass ut_asserteq(CONFIG_SANDBOX_GPIO_COUNT + 20 + 4, gpio); 3896495d90SSimon Glass 3996495d90SSimon Glass name = gpio_get_bank_info(dev, &offset_count); 4096495d90SSimon Glass ut_asserteq_str("b", name); 4196495d90SSimon Glass ut_asserteq(10, offset_count); 4296495d90SSimon Glass 4396495d90SSimon Glass /* Get the operations for this device */ 4496495d90SSimon Glass ops = gpio_get_ops(dev); 454b8f11c2SSimon Glass ut_assert(ops->get_function); 4696495d90SSimon Glass 4796495d90SSimon Glass /* Cannot get a value until it is reserved */ 484b8f11c2SSimon Glass ut_asserteq(-EBUSY, gpio_get_value(gpio + 1)); 4996495d90SSimon Glass /* 5096495d90SSimon Glass * Now some tests that use the 'sandbox' back door. All GPIOs 5196495d90SSimon Glass * should default to input, include b4 that we are using here. 5296495d90SSimon Glass */ 534b8f11c2SSimon Glass ut_assertok(gpio_get_status(dev, offset, buf, sizeof(buf))); 544b8f11c2SSimon Glass ut_asserteq_str("b4: input: 0 [ ]", buf); 5596495d90SSimon Glass 5696495d90SSimon Glass /* Change it to an output */ 5796495d90SSimon Glass sandbox_gpio_set_direction(dev, offset, 1); 584b8f11c2SSimon Glass ut_assertok(gpio_get_status(dev, offset, buf, sizeof(buf))); 594b8f11c2SSimon Glass ut_asserteq_str("b4: output: 0 [ ]", buf); 6096495d90SSimon Glass 6196495d90SSimon Glass sandbox_gpio_set_value(dev, offset, 1); 624b8f11c2SSimon Glass ut_assertok(gpio_get_status(dev, offset, buf, sizeof(buf))); 634b8f11c2SSimon Glass ut_asserteq_str("b4: output: 1 [ ]", buf); 6496495d90SSimon Glass 654b8f11c2SSimon Glass ut_assertok(gpio_request(gpio, "testing")); 664b8f11c2SSimon Glass ut_assertok(gpio_get_status(dev, offset, buf, sizeof(buf))); 674b8f11c2SSimon Glass ut_asserteq_str("b4: output: 1 [x] testing", buf); 6896495d90SSimon Glass 6996495d90SSimon Glass /* Change the value a bit */ 7096495d90SSimon Glass ut_asserteq(1, ops->get_value(dev, offset)); 7196495d90SSimon Glass ut_assertok(ops->set_value(dev, offset, 0)); 7296495d90SSimon Glass ut_asserteq(0, ops->get_value(dev, offset)); 734b8f11c2SSimon Glass ut_assertok(gpio_get_status(dev, offset, buf, sizeof(buf))); 744b8f11c2SSimon Glass ut_asserteq_str("b4: output: 0 [x] testing", buf); 7596495d90SSimon Glass ut_assertok(ops->set_value(dev, offset, 1)); 7696495d90SSimon Glass ut_asserteq(1, ops->get_value(dev, offset)); 7796495d90SSimon Glass 7896495d90SSimon Glass /* Make it an input */ 7996495d90SSimon Glass ut_assertok(ops->direction_input(dev, offset)); 804b8f11c2SSimon Glass ut_assertok(gpio_get_status(dev, offset, buf, sizeof(buf))); 814b8f11c2SSimon Glass ut_asserteq_str("b4: input: 1 [x] testing", buf); 8296495d90SSimon Glass sandbox_gpio_set_value(dev, offset, 0); 8396495d90SSimon Glass ut_asserteq(0, sandbox_gpio_get_value(dev, offset)); 844b8f11c2SSimon Glass ut_assertok(gpio_get_status(dev, offset, buf, sizeof(buf))); 854b8f11c2SSimon Glass ut_asserteq_str("b4: input: 0 [x] testing", buf); 8696495d90SSimon Glass 874b8f11c2SSimon Glass ut_assertok(gpio_free(gpio)); 884b8f11c2SSimon Glass ut_assertok(gpio_get_status(dev, offset, buf, sizeof(buf))); 894b8f11c2SSimon Glass ut_asserteq_str("b4: input: 0 [ ]", buf); 9096495d90SSimon Glass 9196495d90SSimon Glass /* Check the 'a' bank also */ 9296495d90SSimon Glass ut_assertok(gpio_lookup_name("a15", &dev, &offset, &gpio)); 9396495d90SSimon Glass ut_asserteq_str(dev->name, "base-gpios"); 9496495d90SSimon Glass ut_asserteq(15, offset); 9596495d90SSimon Glass ut_asserteq(CONFIG_SANDBOX_GPIO_COUNT + 15, gpio); 9696495d90SSimon Glass 9796495d90SSimon Glass name = gpio_get_bank_info(dev, &offset_count); 9896495d90SSimon Glass ut_asserteq_str("a", name); 9996495d90SSimon Glass ut_asserteq(20, offset_count); 10096495d90SSimon Glass 1014b8f11c2SSimon Glass return 0; 1024b8f11c2SSimon Glass } 1034b8f11c2SSimon Glass DM_TEST(dm_test_gpio, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT); 1044b8f11c2SSimon Glass 1054b8f11c2SSimon Glass /* Test that sandbox anonymous GPIOs work correctly */ 1064b8f11c2SSimon Glass static int dm_test_gpio_anon(struct dm_test_state *dms) 1074b8f11c2SSimon Glass { 1084b8f11c2SSimon Glass unsigned int offset, gpio; 1094b8f11c2SSimon Glass struct udevice *dev; 1104b8f11c2SSimon Glass const char *name; 1114b8f11c2SSimon Glass int offset_count; 1124b8f11c2SSimon Glass 11396495d90SSimon Glass /* And the anonymous bank */ 11496495d90SSimon Glass ut_assertok(gpio_lookup_name("14", &dev, &offset, &gpio)); 11596495d90SSimon Glass ut_asserteq_str(dev->name, "gpio_sandbox"); 11696495d90SSimon Glass ut_asserteq(14, offset); 11796495d90SSimon Glass ut_asserteq(14, gpio); 11896495d90SSimon Glass 11996495d90SSimon Glass name = gpio_get_bank_info(dev, &offset_count); 12096495d90SSimon Glass ut_asserteq_ptr(NULL, name); 12196495d90SSimon Glass ut_asserteq(CONFIG_SANDBOX_GPIO_COUNT, offset_count); 12296495d90SSimon Glass 12396495d90SSimon Glass return 0; 12496495d90SSimon Glass } 1254b8f11c2SSimon Glass DM_TEST(dm_test_gpio_anon, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT); 126d44f597bSSimon Glass 127d44f597bSSimon Glass /* Test that gpio_requestf() works as expected */ 128d44f597bSSimon Glass static int dm_test_gpio_requestf(struct dm_test_state *dms) 129d44f597bSSimon Glass { 130d44f597bSSimon Glass unsigned int offset, gpio; 131d44f597bSSimon Glass struct udevice *dev; 132d44f597bSSimon Glass char buf[80]; 133d44f597bSSimon Glass 134d44f597bSSimon Glass ut_assertok(gpio_lookup_name("b5", &dev, &offset, &gpio)); 135d44f597bSSimon Glass ut_assertok(gpio_requestf(gpio, "testing %d %s", 1, "hi")); 136d44f597bSSimon Glass sandbox_gpio_set_direction(dev, offset, 1); 137d44f597bSSimon Glass sandbox_gpio_set_value(dev, offset, 1); 138d44f597bSSimon Glass ut_assertok(gpio_get_status(dev, offset, buf, sizeof(buf))); 139d44f597bSSimon Glass ut_asserteq_str("b5: output: 1 [x] testing 1 hi", buf); 140d44f597bSSimon Glass 141d44f597bSSimon Glass return 0; 142d44f597bSSimon Glass } 143d44f597bSSimon Glass DM_TEST(dm_test_gpio_requestf, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT); 144*4324174dSSimon Glass 145*4324174dSSimon Glass /* Test that gpio_request() copies its string */ 146*4324174dSSimon Glass static int dm_test_gpio_copy(struct dm_test_state *dms) 147*4324174dSSimon Glass { 148*4324174dSSimon Glass unsigned int offset, gpio; 149*4324174dSSimon Glass struct udevice *dev; 150*4324174dSSimon Glass char buf[80], name[10]; 151*4324174dSSimon Glass 152*4324174dSSimon Glass ut_assertok(gpio_lookup_name("b6", &dev, &offset, &gpio)); 153*4324174dSSimon Glass strcpy(name, "odd_name"); 154*4324174dSSimon Glass ut_assertok(gpio_request(gpio, name)); 155*4324174dSSimon Glass sandbox_gpio_set_direction(dev, offset, 1); 156*4324174dSSimon Glass sandbox_gpio_set_value(dev, offset, 1); 157*4324174dSSimon Glass ut_assertok(gpio_get_status(dev, offset, buf, sizeof(buf))); 158*4324174dSSimon Glass ut_asserteq_str("b6: output: 1 [x] odd_name", buf); 159*4324174dSSimon Glass strcpy(name, "nothing"); 160*4324174dSSimon Glass ut_assertok(gpio_get_status(dev, offset, buf, sizeof(buf))); 161*4324174dSSimon Glass ut_asserteq_str("b6: output: 1 [x] odd_name", buf); 162*4324174dSSimon Glass 163*4324174dSSimon Glass return 0; 164*4324174dSSimon Glass } 165*4324174dSSimon Glass DM_TEST(dm_test_gpio_copy, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT); 166*4324174dSSimon Glass 167*4324174dSSimon Glass /* Test that we don't leak memory with GPIOs */ 168*4324174dSSimon Glass static int dm_test_gpio_leak(struct dm_test_state *dms) 169*4324174dSSimon Glass { 170*4324174dSSimon Glass ut_assertok(dm_test_gpio(dms)); 171*4324174dSSimon Glass ut_assertok(dm_test_gpio_anon(dms)); 172*4324174dSSimon Glass ut_assertok(dm_test_gpio_requestf(dms)); 173*4324174dSSimon Glass ut_assertok(dm_leak_check_end(dms)); 174*4324174dSSimon Glass 175*4324174dSSimon Glass return 0; 176*4324174dSSimon Glass } 177*4324174dSSimon Glass 178*4324174dSSimon Glass DM_TEST(dm_test_gpio_leak, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT); 179