Home | History | Annotate | Download | only in clk
      1 // SPDX-License-Identifier: GPL-2.0
      2 /*
      3  * Copyright (c) 2016, NVIDIA CORPORATION.
      4  */
      5 
      6 #include <common.h>
      7 #include <dm.h>
      8 #include <clk.h>
      9 #include <asm/clk.h>
     10 
     11 struct sandbox_clk_test {
     12 	struct clk clks[SANDBOX_CLK_TEST_ID_COUNT];
     13 	struct clk_bulk bulk;
     14 };
     15 
     16 static const char * const sandbox_clk_test_names[] = {
     17 	[SANDBOX_CLK_TEST_ID_FIXED] = "fixed",
     18 	[SANDBOX_CLK_TEST_ID_SPI] = "spi",
     19 	[SANDBOX_CLK_TEST_ID_I2C] = "i2c",
     20 };
     21 
     22 int sandbox_clk_test_get(struct udevice *dev)
     23 {
     24 	struct sandbox_clk_test *sbct = dev_get_priv(dev);
     25 	int i, ret;
     26 
     27 	for (i = 0; i < SANDBOX_CLK_TEST_ID_COUNT; i++) {
     28 		ret = clk_get_by_name(dev, sandbox_clk_test_names[i],
     29 				      &sbct->clks[i]);
     30 		if (ret)
     31 			return ret;
     32 	}
     33 
     34 	return 0;
     35 }
     36 
     37 int sandbox_clk_test_get_bulk(struct udevice *dev)
     38 {
     39 	struct sandbox_clk_test *sbct = dev_get_priv(dev);
     40 
     41 	return clk_get_bulk(dev, &sbct->bulk);
     42 }
     43 
     44 ulong sandbox_clk_test_get_rate(struct udevice *dev, int id)
     45 {
     46 	struct sandbox_clk_test *sbct = dev_get_priv(dev);
     47 
     48 	if (id < 0 || id >= SANDBOX_CLK_TEST_ID_COUNT)
     49 		return -EINVAL;
     50 
     51 	return clk_get_rate(&sbct->clks[id]);
     52 }
     53 
     54 ulong sandbox_clk_test_set_rate(struct udevice *dev, int id, ulong rate)
     55 {
     56 	struct sandbox_clk_test *sbct = dev_get_priv(dev);
     57 
     58 	if (id < 0 || id >= SANDBOX_CLK_TEST_ID_COUNT)
     59 		return -EINVAL;
     60 
     61 	return clk_set_rate(&sbct->clks[id], rate);
     62 }
     63 
     64 int sandbox_clk_test_enable(struct udevice *dev, int id)
     65 {
     66 	struct sandbox_clk_test *sbct = dev_get_priv(dev);
     67 
     68 	if (id < 0 || id >= SANDBOX_CLK_TEST_ID_COUNT)
     69 		return -EINVAL;
     70 
     71 	return clk_enable(&sbct->clks[id]);
     72 }
     73 
     74 int sandbox_clk_test_enable_bulk(struct udevice *dev)
     75 {
     76 	struct sandbox_clk_test *sbct = dev_get_priv(dev);
     77 
     78 	return clk_enable_bulk(&sbct->bulk);
     79 }
     80 
     81 int sandbox_clk_test_disable(struct udevice *dev, int id)
     82 {
     83 	struct sandbox_clk_test *sbct = dev_get_priv(dev);
     84 
     85 	if (id < 0 || id >= SANDBOX_CLK_TEST_ID_COUNT)
     86 		return -EINVAL;
     87 
     88 	return clk_disable(&sbct->clks[id]);
     89 }
     90 
     91 int sandbox_clk_test_disable_bulk(struct udevice *dev)
     92 {
     93 	struct sandbox_clk_test *sbct = dev_get_priv(dev);
     94 
     95 	return clk_disable_bulk(&sbct->bulk);
     96 }
     97 
     98 int sandbox_clk_test_free(struct udevice *dev)
     99 {
    100 	struct sandbox_clk_test *sbct = dev_get_priv(dev);
    101 	int i, ret;
    102 
    103 	for (i = 0; i < SANDBOX_CLK_TEST_ID_COUNT; i++) {
    104 		ret = clk_free(&sbct->clks[i]);
    105 		if (ret)
    106 			return ret;
    107 	}
    108 
    109 	return 0;
    110 }
    111 
    112 int sandbox_clk_test_release_bulk(struct udevice *dev)
    113 {
    114 	struct sandbox_clk_test *sbct = dev_get_priv(dev);
    115 
    116 	return clk_release_bulk(&sbct->bulk);
    117 }
    118 
    119 static const struct udevice_id sandbox_clk_test_ids[] = {
    120 	{ .compatible = "sandbox,clk-test" },
    121 	{ }
    122 };
    123 
    124 U_BOOT_DRIVER(sandbox_clk_test) = {
    125 	.name = "sandbox_clk_test",
    126 	.id = UCLASS_MISC,
    127 	.of_match = sandbox_clk_test_ids,
    128 	.priv_auto_alloc_size = sizeof(struct sandbox_clk_test),
    129 };
    130