1*bd3ee84aSStephen Warren /* 2*bd3ee84aSStephen Warren * Copyright (c) 2016, NVIDIA CORPORATION. 3*bd3ee84aSStephen Warren * 4*bd3ee84aSStephen Warren * SPDX-License-Identifier: GPL-2.0 5*bd3ee84aSStephen Warren */ 6*bd3ee84aSStephen Warren 7*bd3ee84aSStephen Warren #include <common.h> 8*bd3ee84aSStephen Warren #include <dm.h> 9*bd3ee84aSStephen Warren #include <dm/lists.h> 10*bd3ee84aSStephen Warren #include <dm/root.h> 11*bd3ee84aSStephen Warren 12*bd3ee84aSStephen Warren /** 13*bd3ee84aSStephen Warren * The CAR exposes multiple different services. We create a sub-device for 14*bd3ee84aSStephen Warren * each separate type of service, since each device must be of the appropriate 15*bd3ee84aSStephen Warren * UCLASS. 16*bd3ee84aSStephen Warren */ 17*bd3ee84aSStephen Warren static int tegra_car_bpmp_bind(struct udevice *dev) 18*bd3ee84aSStephen Warren { 19*bd3ee84aSStephen Warren int ret; 20*bd3ee84aSStephen Warren struct udevice *child; 21*bd3ee84aSStephen Warren 22*bd3ee84aSStephen Warren debug("%s(dev=%p)\n", __func__, dev); 23*bd3ee84aSStephen Warren 24*bd3ee84aSStephen Warren ret = device_bind_driver_to_node(dev, "tegra_car_clk", "tegra_car_clk", 25*bd3ee84aSStephen Warren dev->of_offset, &child); 26*bd3ee84aSStephen Warren if (ret) 27*bd3ee84aSStephen Warren return ret; 28*bd3ee84aSStephen Warren 29*bd3ee84aSStephen Warren ret = device_bind_driver_to_node(dev, "tegra_car_reset", 30*bd3ee84aSStephen Warren "tegra_car_reset", dev->of_offset, 31*bd3ee84aSStephen Warren &child); 32*bd3ee84aSStephen Warren if (ret) 33*bd3ee84aSStephen Warren return ret; 34*bd3ee84aSStephen Warren 35*bd3ee84aSStephen Warren return 0; 36*bd3ee84aSStephen Warren } 37*bd3ee84aSStephen Warren 38*bd3ee84aSStephen Warren static int tegra_car_bpmp_probe(struct udevice *dev) 39*bd3ee84aSStephen Warren { 40*bd3ee84aSStephen Warren debug("%s(dev=%p)\n", __func__, dev); 41*bd3ee84aSStephen Warren 42*bd3ee84aSStephen Warren return 0; 43*bd3ee84aSStephen Warren } 44*bd3ee84aSStephen Warren 45*bd3ee84aSStephen Warren static int tegra_car_bpmp_remove(struct udevice *dev) 46*bd3ee84aSStephen Warren { 47*bd3ee84aSStephen Warren debug("%s(dev=%p)\n", __func__, dev); 48*bd3ee84aSStephen Warren 49*bd3ee84aSStephen Warren return 0; 50*bd3ee84aSStephen Warren } 51*bd3ee84aSStephen Warren 52*bd3ee84aSStephen Warren static const struct udevice_id tegra_car_bpmp_ids[] = { 53*bd3ee84aSStephen Warren { .compatible = "nvidia,tegra20-car" }, 54*bd3ee84aSStephen Warren { .compatible = "nvidia,tegra30-car" }, 55*bd3ee84aSStephen Warren { .compatible = "nvidia,tegra114-car" }, 56*bd3ee84aSStephen Warren { .compatible = "nvidia,tegra124-car" }, 57*bd3ee84aSStephen Warren { .compatible = "nvidia,tegra210-car" }, 58*bd3ee84aSStephen Warren { } 59*bd3ee84aSStephen Warren }; 60*bd3ee84aSStephen Warren 61*bd3ee84aSStephen Warren U_BOOT_DRIVER(tegra_car_bpmp) = { 62*bd3ee84aSStephen Warren .name = "tegra_car", 63*bd3ee84aSStephen Warren .id = UCLASS_MISC, 64*bd3ee84aSStephen Warren .of_match = tegra_car_bpmp_ids, 65*bd3ee84aSStephen Warren .bind = tegra_car_bpmp_bind, 66*bd3ee84aSStephen Warren .probe = tegra_car_bpmp_probe, 67*bd3ee84aSStephen Warren .remove = tegra_car_bpmp_remove, 68*bd3ee84aSStephen Warren }; 69