Lines Matching +full:tegra186 +full:- +full:bpmp
1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (c) 2015-2017, NVIDIA CORPORATION. All rights reserved.
16 #include <soc/tegra/bpmp.h>
17 #include <soc/tegra/bpmp-abi.h>
28 struct tegra_bpmp *bpmp; member
43 req.get_temp.zone = zone->idx; in tegra_bpmp_thermal_get_temp()
52 err = tegra_bpmp_transfer(zone->tegra->bpmp, &msg); in tegra_bpmp_thermal_get_temp()
69 req.set_trip.zone = zone->idx; in tegra_bpmp_thermal_set_trips()
79 return tegra_bpmp_transfer(zone->tegra->bpmp, &msg); in tegra_bpmp_thermal_set_trips()
89 thermal_zone_device_update(zone->tzd, THERMAL_TRIP_VIOLATED); in tz_device_update_work_fn()
99 req = (struct mrq_thermal_bpmp_to_host_request *)ch->ib->data; in bpmp_mrq_thermal()
101 if (req->type != CMD_THERMAL_HOST_TRIP_REACHED) { in bpmp_mrq_thermal()
102 dev_err(tegra->dev, "%s: invalid request type: %d\n", in bpmp_mrq_thermal()
103 __func__, req->type); in bpmp_mrq_thermal()
104 tegra_bpmp_mrq_return(ch, -EINVAL, NULL, 0); in bpmp_mrq_thermal()
108 for (i = 0; i < tegra->num_zones; ++i) { in bpmp_mrq_thermal()
109 if (tegra->zones[i]->idx != req->host_trip_reached.zone) in bpmp_mrq_thermal()
112 schedule_work(&tegra->zones[i]->tz_device_update_work); in bpmp_mrq_thermal()
117 dev_err(tegra->dev, "%s: invalid thermal zone: %d\n", __func__, in bpmp_mrq_thermal()
118 req->host_trip_reached.zone); in bpmp_mrq_thermal()
119 tegra_bpmp_mrq_return(ch, -EINVAL, NULL, 0); in bpmp_mrq_thermal()
122 static int tegra_bpmp_thermal_get_num_zones(struct tegra_bpmp *bpmp, in tegra_bpmp_thermal_get_num_zones() argument
140 err = tegra_bpmp_transfer(bpmp, &msg); in tegra_bpmp_thermal_get_num_zones()
156 struct tegra_bpmp *bpmp = dev_get_drvdata(pdev->dev.parent); in tegra_bpmp_thermal_probe() local
162 tegra = devm_kzalloc(&pdev->dev, sizeof(*tegra), GFP_KERNEL); in tegra_bpmp_thermal_probe()
164 return -ENOMEM; in tegra_bpmp_thermal_probe()
166 tegra->dev = &pdev->dev; in tegra_bpmp_thermal_probe()
167 tegra->bpmp = bpmp; in tegra_bpmp_thermal_probe()
169 err = tegra_bpmp_thermal_get_num_zones(bpmp, &max_num_zones); in tegra_bpmp_thermal_probe()
171 dev_err(&pdev->dev, "failed to get the number of zones: %d\n", in tegra_bpmp_thermal_probe()
176 tegra->zones = devm_kcalloc(&pdev->dev, max_num_zones, in tegra_bpmp_thermal_probe()
177 sizeof(*tegra->zones), GFP_KERNEL); in tegra_bpmp_thermal_probe()
178 if (!tegra->zones) in tegra_bpmp_thermal_probe()
179 return -ENOMEM; in tegra_bpmp_thermal_probe()
185 zone = devm_kzalloc(&pdev->dev, sizeof(*zone), GFP_KERNEL); in tegra_bpmp_thermal_probe()
187 return -ENOMEM; in tegra_bpmp_thermal_probe()
189 zone->idx = i; in tegra_bpmp_thermal_probe()
190 zone->tegra = tegra; in tegra_bpmp_thermal_probe()
194 devm_kfree(&pdev->dev, zone); in tegra_bpmp_thermal_probe()
199 &pdev->dev, i, zone, &tegra_bpmp_of_thermal_ops); in tegra_bpmp_thermal_probe()
201 if (PTR_ERR(tzd) == -EPROBE_DEFER) in tegra_bpmp_thermal_probe()
202 return -EPROBE_DEFER; in tegra_bpmp_thermal_probe()
203 devm_kfree(&pdev->dev, zone); in tegra_bpmp_thermal_probe()
207 zone->tzd = tzd; in tegra_bpmp_thermal_probe()
208 INIT_WORK(&zone->tz_device_update_work, in tegra_bpmp_thermal_probe()
211 tegra->zones[tegra->num_zones++] = zone; in tegra_bpmp_thermal_probe()
214 err = tegra_bpmp_request_mrq(bpmp, MRQ_THERMAL, bpmp_mrq_thermal, in tegra_bpmp_thermal_probe()
217 dev_err(&pdev->dev, "failed to register mrq handler: %d\n", in tegra_bpmp_thermal_probe()
231 tegra_bpmp_free_mrq(tegra->bpmp, MRQ_THERMAL, tegra); in tegra_bpmp_thermal_remove()
237 { .compatible = "nvidia,tegra186-bpmp-thermal" },
246 .name = "tegra-bpmp-thermal",
253 MODULE_DESCRIPTION("NVIDIA Tegra BPMP thermal sensor driver");