uboot/drivers/misc/stm32_rcc.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0+
   2/*
   3 * Copyright (C) 2017, STMicroelectronics - All Rights Reserved
   4 * Author(s): Patrice Chotard, <patrice.chotard@st.com> for STMicroelectronics.
   5 */
   6
   7#include <common.h>
   8#include <dm.h>
   9#include <misc.h>
  10#include <stm32_rcc.h>
  11#include <dm/device-internal.h>
  12#include <dm/lists.h>
  13
  14struct stm32_rcc_clk stm32_rcc_clk_f42x = {
  15        .drv_name = "stm32fx_rcc_clock",
  16        .soc = STM32F42X,
  17};
  18
  19struct stm32_rcc_clk stm32_rcc_clk_f469 = {
  20        .drv_name = "stm32fx_rcc_clock",
  21        .soc = STM32F469,
  22};
  23
  24struct stm32_rcc_clk stm32_rcc_clk_f7 = {
  25        .drv_name = "stm32fx_rcc_clock",
  26        .soc = STM32F7,
  27};
  28
  29struct stm32_rcc_clk stm32_rcc_clk_h7 = {
  30        .drv_name = "stm32h7_rcc_clock",
  31};
  32
  33struct stm32_rcc_clk stm32_rcc_clk_mp1 = {
  34        .drv_name = "stm32mp1_clk",
  35        .soc = STM32MP1,
  36};
  37
  38static int stm32_rcc_bind(struct udevice *dev)
  39{
  40        struct udevice *child;
  41        struct driver *drv;
  42        struct stm32_rcc_clk *rcc_clk =
  43                (struct stm32_rcc_clk *)dev_get_driver_data(dev);
  44        int ret;
  45
  46        debug("%s(dev=%p)\n", __func__, dev);
  47        drv = lists_driver_lookup_name(rcc_clk->drv_name);
  48        if (!drv) {
  49                debug("Cannot find driver '%s'\n", rcc_clk->drv_name);
  50                return -ENOENT;
  51        }
  52
  53        ret = device_bind_with_driver_data(dev, drv, rcc_clk->drv_name,
  54                                           rcc_clk->soc,
  55                                           dev_ofnode(dev), &child);
  56
  57        if (ret)
  58                return ret;
  59
  60        drv = lists_driver_lookup_name("stm32_rcc_reset");
  61        if (!drv) {
  62                dev_err(dev, "Cannot find driver stm32_rcc_reset'\n");
  63                return -ENOENT;
  64        }
  65
  66        return device_bind_with_driver_data(dev, drv, "stm32_rcc_reset",
  67                                            rcc_clk->soc,
  68                                            dev_ofnode(dev), &child);
  69}
  70
  71static const struct misc_ops stm32_rcc_ops = {
  72};
  73
  74static const struct udevice_id stm32_rcc_ids[] = {
  75        {.compatible = "st,stm32f42xx-rcc", .data = (ulong)&stm32_rcc_clk_f42x },
  76        {.compatible = "st,stm32f469-rcc", .data = (ulong)&stm32_rcc_clk_f469 },
  77        {.compatible = "st,stm32f746-rcc", .data = (ulong)&stm32_rcc_clk_f7 },
  78        {.compatible = "st,stm32h743-rcc", .data = (ulong)&stm32_rcc_clk_h7 },
  79        {.compatible = "st,stm32mp1-rcc", .data = (ulong)&stm32_rcc_clk_mp1 },
  80        { }
  81};
  82
  83U_BOOT_DRIVER(stm32_rcc) = {
  84        .name           = "stm32-rcc",
  85        .id             = UCLASS_MISC,
  86        .of_match       = stm32_rcc_ids,
  87        .bind           = stm32_rcc_bind,
  88        .ops            = &stm32_rcc_ops,
  89};
  90