1135aa950SStephen Warren /* 2135aa950SStephen Warren * Copyright (c) 2016, NVIDIA CORPORATION. 3135aa950SStephen Warren * 4135aa950SStephen Warren * SPDX-License-Identifier: GPL-2.0 5135aa950SStephen Warren */ 6135aa950SStephen Warren 7135aa950SStephen Warren #include <common.h> 8135aa950SStephen Warren #include <dm.h> 9135aa950SStephen Warren #include <clk.h> 10135aa950SStephen Warren #include <asm/clk.h> 11135aa950SStephen Warren 12135aa950SStephen Warren struct sandbox_clk_test { 13135aa950SStephen Warren struct clk clks[SANDBOX_CLK_TEST_ID_COUNT]; 14*0afa4b6cSNeil Armstrong struct clk_bulk bulk; 15135aa950SStephen Warren }; 16135aa950SStephen Warren 17135aa950SStephen Warren static const char * const sandbox_clk_test_names[] = { 18135aa950SStephen Warren [SANDBOX_CLK_TEST_ID_FIXED] = "fixed", 19135aa950SStephen Warren [SANDBOX_CLK_TEST_ID_SPI] = "spi", 20135aa950SStephen Warren [SANDBOX_CLK_TEST_ID_I2C] = "i2c", 21135aa950SStephen Warren }; 22135aa950SStephen Warren 23135aa950SStephen Warren int sandbox_clk_test_get(struct udevice *dev) 24135aa950SStephen Warren { 25135aa950SStephen Warren struct sandbox_clk_test *sbct = dev_get_priv(dev); 26135aa950SStephen Warren int i, ret; 27135aa950SStephen Warren 28135aa950SStephen Warren for (i = 0; i < SANDBOX_CLK_TEST_ID_COUNT; i++) { 29135aa950SStephen Warren ret = clk_get_by_name(dev, sandbox_clk_test_names[i], 30135aa950SStephen Warren &sbct->clks[i]); 31135aa950SStephen Warren if (ret) 32135aa950SStephen Warren return ret; 33135aa950SStephen Warren } 34135aa950SStephen Warren 35135aa950SStephen Warren return 0; 36135aa950SStephen Warren } 37135aa950SStephen Warren 38*0afa4b6cSNeil Armstrong int sandbox_clk_test_get_bulk(struct udevice *dev) 39*0afa4b6cSNeil Armstrong { 40*0afa4b6cSNeil Armstrong struct sandbox_clk_test *sbct = dev_get_priv(dev); 41*0afa4b6cSNeil Armstrong 42*0afa4b6cSNeil Armstrong return clk_get_bulk(dev, &sbct->bulk); 43*0afa4b6cSNeil Armstrong } 44*0afa4b6cSNeil Armstrong 45135aa950SStephen Warren ulong sandbox_clk_test_get_rate(struct udevice *dev, int id) 46135aa950SStephen Warren { 47135aa950SStephen Warren struct sandbox_clk_test *sbct = dev_get_priv(dev); 48135aa950SStephen Warren 49135aa950SStephen Warren if (id < 0 || id >= SANDBOX_CLK_TEST_ID_COUNT) 50135aa950SStephen Warren return -EINVAL; 51135aa950SStephen Warren 52135aa950SStephen Warren return clk_get_rate(&sbct->clks[id]); 53135aa950SStephen Warren } 54135aa950SStephen Warren 55135aa950SStephen Warren ulong sandbox_clk_test_set_rate(struct udevice *dev, int id, ulong rate) 56135aa950SStephen Warren { 57135aa950SStephen Warren struct sandbox_clk_test *sbct = dev_get_priv(dev); 58135aa950SStephen Warren 59135aa950SStephen Warren if (id < 0 || id >= SANDBOX_CLK_TEST_ID_COUNT) 60135aa950SStephen Warren return -EINVAL; 61135aa950SStephen Warren 62135aa950SStephen Warren return clk_set_rate(&sbct->clks[id], rate); 63135aa950SStephen Warren } 64135aa950SStephen Warren 65135aa950SStephen Warren int sandbox_clk_test_enable(struct udevice *dev, int id) 66135aa950SStephen Warren { 67135aa950SStephen Warren struct sandbox_clk_test *sbct = dev_get_priv(dev); 68135aa950SStephen Warren 69135aa950SStephen Warren if (id < 0 || id >= SANDBOX_CLK_TEST_ID_COUNT) 70135aa950SStephen Warren return -EINVAL; 71135aa950SStephen Warren 72135aa950SStephen Warren return clk_enable(&sbct->clks[id]); 73135aa950SStephen Warren } 74135aa950SStephen Warren 75*0afa4b6cSNeil Armstrong int sandbox_clk_test_enable_bulk(struct udevice *dev) 76*0afa4b6cSNeil Armstrong { 77*0afa4b6cSNeil Armstrong struct sandbox_clk_test *sbct = dev_get_priv(dev); 78*0afa4b6cSNeil Armstrong 79*0afa4b6cSNeil Armstrong return clk_enable_bulk(&sbct->bulk); 80*0afa4b6cSNeil Armstrong } 81*0afa4b6cSNeil Armstrong 82135aa950SStephen Warren int sandbox_clk_test_disable(struct udevice *dev, int id) 83135aa950SStephen Warren { 84135aa950SStephen Warren struct sandbox_clk_test *sbct = dev_get_priv(dev); 85135aa950SStephen Warren 86135aa950SStephen Warren if (id < 0 || id >= SANDBOX_CLK_TEST_ID_COUNT) 87135aa950SStephen Warren return -EINVAL; 88135aa950SStephen Warren 89135aa950SStephen Warren return clk_disable(&sbct->clks[id]); 90135aa950SStephen Warren } 91135aa950SStephen Warren 92*0afa4b6cSNeil Armstrong int sandbox_clk_test_disable_bulk(struct udevice *dev) 93*0afa4b6cSNeil Armstrong { 94*0afa4b6cSNeil Armstrong struct sandbox_clk_test *sbct = dev_get_priv(dev); 95*0afa4b6cSNeil Armstrong 96*0afa4b6cSNeil Armstrong return clk_disable_bulk(&sbct->bulk); 97*0afa4b6cSNeil Armstrong } 98*0afa4b6cSNeil Armstrong 99135aa950SStephen Warren int sandbox_clk_test_free(struct udevice *dev) 100135aa950SStephen Warren { 101135aa950SStephen Warren struct sandbox_clk_test *sbct = dev_get_priv(dev); 102135aa950SStephen Warren int i, ret; 103135aa950SStephen Warren 104135aa950SStephen Warren for (i = 0; i < SANDBOX_CLK_TEST_ID_COUNT; i++) { 105135aa950SStephen Warren ret = clk_free(&sbct->clks[i]); 106135aa950SStephen Warren if (ret) 107135aa950SStephen Warren return ret; 108135aa950SStephen Warren } 109135aa950SStephen Warren 110135aa950SStephen Warren return 0; 111135aa950SStephen Warren } 112135aa950SStephen Warren 113*0afa4b6cSNeil Armstrong int sandbox_clk_test_release_bulk(struct udevice *dev) 114*0afa4b6cSNeil Armstrong { 115*0afa4b6cSNeil Armstrong struct sandbox_clk_test *sbct = dev_get_priv(dev); 116*0afa4b6cSNeil Armstrong 117*0afa4b6cSNeil Armstrong return clk_release_bulk(&sbct->bulk); 118*0afa4b6cSNeil Armstrong } 119*0afa4b6cSNeil Armstrong 120135aa950SStephen Warren static const struct udevice_id sandbox_clk_test_ids[] = { 121135aa950SStephen Warren { .compatible = "sandbox,clk-test" }, 122135aa950SStephen Warren { } 123135aa950SStephen Warren }; 124135aa950SStephen Warren 125135aa950SStephen Warren U_BOOT_DRIVER(sandbox_clk_test) = { 126135aa950SStephen Warren .name = "sandbox_clk_test", 127135aa950SStephen Warren .id = UCLASS_MISC, 128135aa950SStephen Warren .of_match = sandbox_clk_test_ids, 129135aa950SStephen Warren .priv_auto_alloc_size = sizeof(struct sandbox_clk_test), 130135aa950SStephen Warren }; 131