| // SPDX-License-Identifier: GPL-2.0+ | |
| /* | |
| * (C) Copyright 2018 | |
| * Mario Six, Guntermann & Drunck GmbH, mario.six@gdsys.cc | |
| */ | |
| #include <common.h> | |
| #include <dm.h> | |
| #include <board.h> | |
| #include "sandbox.h" | |
| struct board_sandbox_priv { | |
| bool called_detect; | |
| int test_i1; | |
| int test_i2; | |
| }; | |
| char vacation_spots[][64] = {"R'lyeh", "Dreamlands", "Plateau of Leng", | |
| "Carcosa", "Yuggoth", "The Nameless City"}; | |
| int board_sandbox_detect(struct udevice *dev) | |
| { | |
| struct board_sandbox_priv *priv = dev_get_priv(dev); | |
| priv->called_detect = true; | |
| priv->test_i2 = 100; | |
| return 0; | |
| } | |
| int board_sandbox_get_bool(struct udevice *dev, int id, bool *val) | |
| { | |
| struct board_sandbox_priv *priv = dev_get_priv(dev); | |
| switch (id) { | |
| case BOOL_CALLED_DETECT: | |
| /* Checks if the dectect method has been called */ | |
| *val = priv->called_detect; | |
| return 0; | |
| } | |
| return -ENOENT; | |
| } | |
| int board_sandbox_get_int(struct udevice *dev, int id, int *val) | |
| { | |
| struct board_sandbox_priv *priv = dev_get_priv(dev); | |
| switch (id) { | |
| case INT_TEST1: | |
| *val = priv->test_i1; | |
| /* Increments with every call */ | |
| priv->test_i1++; | |
| return 0; | |
| case INT_TEST2: | |
| *val = priv->test_i2; | |
| /* Decrements with every call */ | |
| priv->test_i2--; | |
| return 0; | |
| } | |
| return -ENOENT; | |
| } | |
| int board_sandbox_get_str(struct udevice *dev, int id, size_t size, char *val) | |
| { | |
| struct board_sandbox_priv *priv = dev_get_priv(dev); | |
| int i1 = priv->test_i1; | |
| int i2 = priv->test_i2; | |
| int index = (i1 * i2) % ARRAY_SIZE(vacation_spots); | |
| switch (id) { | |
| case STR_VACATIONSPOT: | |
| /* Picks a vacation spot depending on i1 and i2 */ | |
| snprintf(val, size, vacation_spots[index]); | |
| return 0; | |
| } | |
| return -ENOENT; | |
| } | |
| static const struct udevice_id board_sandbox_ids[] = { | |
| { .compatible = "sandbox,board_sandbox" }, | |
| { /* sentinel */ } | |
| }; | |
| static const struct board_ops board_sandbox_ops = { | |
| .detect = board_sandbox_detect, | |
| .get_bool = board_sandbox_get_bool, | |
| .get_int = board_sandbox_get_int, | |
| .get_str = board_sandbox_get_str, | |
| }; | |
| int board_sandbox_probe(struct udevice *dev) | |
| { | |
| return 0; | |
| } | |
| U_BOOT_DRIVER(board_sandbox) = { | |
| .name = "board_sandbox", | |
| .id = UCLASS_BOARD, | |
| .of_match = board_sandbox_ids, | |
| .ops = &board_sandbox_ops, | |
| .priv_auto_alloc_size = sizeof(struct board_sandbox_priv), | |
| .probe = board_sandbox_probe, | |
| }; |