g12a-ao.c 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. // SPDX-License-Identifier: GPL-2.0+
  2. #include <common.h>
  3. #include <log.h>
  4. #include <asm/io.h>
  5. #include <clk-uclass.h>
  6. #include <dm.h>
  7. #include <regmap.h>
  8. #include <syscon.h>
  9. #include <dt-bindings/clock/g12a-aoclkc.h>
  10. #include "clk_meson.h"
  11. struct meson_clk {
  12. struct regmap *map;
  13. };
  14. #define AO_CLK_GATE0 0x4c
  15. #define AO_SAR_CLK 0x90
  16. static struct meson_gate gates[] = {
  17. MESON_GATE(CLKID_AO_SAR_ADC, AO_CLK_GATE0, 8),
  18. MESON_GATE(CLKID_AO_SAR_ADC_CLK, AO_SAR_CLK, 8),
  19. };
  20. static int meson_set_gate(struct clk *clk, bool on)
  21. {
  22. struct meson_clk *priv = dev_get_priv(clk->dev);
  23. struct meson_gate *gate;
  24. if (clk->id >= ARRAY_SIZE(gates))
  25. return -ENOENT;
  26. gate = &gates[clk->id];
  27. if (gate->reg == 0)
  28. return 0;
  29. regmap_update_bits(priv->map, gate->reg,
  30. BIT(gate->bit), on ? BIT(gate->bit) : 0);
  31. return 0;
  32. }
  33. static int meson_clk_enable(struct clk *clk)
  34. {
  35. return meson_set_gate(clk, true);
  36. }
  37. static int meson_clk_disable(struct clk *clk)
  38. {
  39. return meson_set_gate(clk, false);
  40. }
  41. static int meson_clk_probe(struct udevice *dev)
  42. {
  43. struct meson_clk *priv = dev_get_priv(dev);
  44. priv->map = syscon_node_to_regmap(dev_ofnode(dev_get_parent(dev)));
  45. if (IS_ERR(priv->map))
  46. return PTR_ERR(priv->map);
  47. return 0;
  48. }
  49. static struct clk_ops meson_clk_ops = {
  50. .disable = meson_clk_disable,
  51. .enable = meson_clk_enable,
  52. };
  53. static const struct udevice_id meson_clk_ids[] = {
  54. { .compatible = "amlogic,meson-g12a-aoclkc" },
  55. { }
  56. };
  57. U_BOOT_DRIVER(meson_clk_axg) = {
  58. .name = "meson_clk_g12a_ao",
  59. .id = UCLASS_CLK,
  60. .of_match = meson_clk_ids,
  61. .priv_auto = sizeof(struct meson_clk),
  62. .ops = &meson_clk_ops,
  63. .probe = meson_clk_probe,
  64. };