static int tegra_bpmp_thermal_get_temp(void *data, int *out_temp) { struct tegra_bpmp_thermal_zone *zone = data; struct mrq_thermal_host_to_bpmp_request req; union mrq_thermal_bpmp_to_host_response reply; struct tegra_bpmp_message msg; int err; memset(&req, 0, sizeof(req)); req.type = CMD_THERMAL_GET_TEMP; req.get_temp.zone = zone->idx; memset(&msg, 0, sizeof(msg)); msg.mrq = MRQ_THERMAL; msg.tx.data = &req; msg.tx.size = sizeof(req); msg.rx.data = &reply; msg.rx.size = sizeof(reply); err = tegra_bpmp_transfer(zone->tegra->bpmp, &msg); if (err) return err; *out_temp = reply.get_temp.temp; return 0; }
static int tegra_bpmp_thermal_get_num_zones(struct tegra_bpmp *bpmp, int *num_zones) { struct mrq_thermal_host_to_bpmp_request req; union mrq_thermal_bpmp_to_host_response reply; struct tegra_bpmp_message msg; int err; memset(&req, 0, sizeof(req)); req.type = CMD_THERMAL_GET_NUM_ZONES; memset(&msg, 0, sizeof(msg)); msg.mrq = MRQ_THERMAL; msg.tx.data = &req; msg.tx.size = sizeof(req); msg.rx.data = &reply; msg.rx.size = sizeof(reply); err = tegra_bpmp_transfer(bpmp, &msg); if (err) return err; *num_zones = reply.get_num_zones.num; return 0; }
static int tegra_bpmp_thermal_set_trips(void *data, int low, int high) { struct tegra_bpmp_thermal_zone *zone = data; struct mrq_thermal_host_to_bpmp_request req; struct tegra_bpmp_message msg; memset(&req, 0, sizeof(req)); req.type = CMD_THERMAL_SET_TRIP; req.set_trip.zone = zone->idx; req.set_trip.enabled = true; req.set_trip.low = low; req.set_trip.high = high; memset(&msg, 0, sizeof(msg)); msg.mrq = MRQ_THERMAL; msg.tx.data = &req; msg.tx.size = sizeof(req); return tegra_bpmp_transfer(zone->tegra->bpmp, &msg); }
static int tegra_bpmp_i2c_msg_xfer(struct tegra_bpmp_i2c *i2c, struct mrq_i2c_request *request, struct mrq_i2c_response *response) { struct tegra_bpmp_message msg; int err; request->cmd = CMD_I2C_XFER; request->xfer.bus_id = i2c->bus; memset(&msg, 0, sizeof(msg)); msg.mrq = MRQ_I2C; msg.tx.data = request; msg.tx.size = sizeof(*request); msg.rx.data = response; msg.rx.size = sizeof(*response); if (irqs_disabled()) err = tegra_bpmp_transfer_atomic(i2c->bpmp, &msg); else err = tegra_bpmp_transfer(i2c->bpmp, &msg); return err; }