sync
This commit is contained in:
parent
777fb69d26
commit
905ea23f06
42 changed files with 776 additions and 381 deletions
|
@ -1,4 +1,4 @@
|
|||
/* $OpenBSD: dt_dev.c,v 1.26 2023/04/26 16:53:59 claudio Exp $ */
|
||||
/* $OpenBSD: dt_dev.c,v 1.27 2023/06/28 08:23:25 claudio Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2019 Martin Pieuchot <mpi@openbsd.org>
|
||||
|
@ -240,8 +240,8 @@ dtread(dev_t dev, struct uio *uio, int flags)
|
|||
return (EMSGSIZE);
|
||||
|
||||
while (!sc->ds_evtcnt) {
|
||||
sleep_setup(&sls, sc, PWAIT | PCATCH, "dtread", 0);
|
||||
error = sleep_finish(&sls, !sc->ds_evtcnt);
|
||||
sleep_setup(&sls, sc, PWAIT | PCATCH, "dtread");
|
||||
error = sleep_finish(&sls, PWAIT | PCATCH, 0, !sc->ds_evtcnt);
|
||||
if (error == EINTR || error == ERESTART)
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $OpenBSD: dt_prov_static.c,v 1.18 2023/04/28 20:03:13 mvs Exp $ */
|
||||
/* $OpenBSD: dt_prov_static.c,v 1.19 2023/06/28 11:49:49 kn Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2019 Martin Pieuchot <mpi@openbsd.org>
|
||||
|
@ -93,6 +93,7 @@ DT_STATIC_PROBE2(smr, thread, "uint64_t", "uint64_t");
|
|||
*/
|
||||
DT_STATIC_PROBE0(refcnt, none);
|
||||
DT_STATIC_PROBE3(refcnt, ifaddr, "void *", "int", "int");
|
||||
DT_STATIC_PROBE3(refcnt, ifmaddr, "void *", "int", "int");
|
||||
DT_STATIC_PROBE3(refcnt, inpcb, "void *", "int", "int");
|
||||
DT_STATIC_PROBE3(refcnt, rtentry, "void *", "int", "int");
|
||||
DT_STATIC_PROBE3(refcnt, tdb, "void *", "int", "int");
|
||||
|
@ -140,6 +141,7 @@ struct dt_probe *const dtps_static[] = {
|
|||
/* refcnt */
|
||||
&_DT_STATIC_P(refcnt, none),
|
||||
&_DT_STATIC_P(refcnt, ifaddr),
|
||||
&_DT_STATIC_P(refcnt, ifmaddr),
|
||||
&_DT_STATIC_P(refcnt, inpcb),
|
||||
&_DT_STATIC_P(refcnt, rtentry),
|
||||
&_DT_STATIC_P(refcnt, tdb),
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# $OpenBSD: files.fdt,v 1.193 2023/06/10 18:31:38 patrick Exp $
|
||||
# $OpenBSD: files.fdt,v 1.194 2023/06/27 22:38:46 patrick Exp $
|
||||
#
|
||||
# Config file and device description for machine-independent FDT code.
|
||||
# Included by ports that need it.
|
||||
|
@ -721,6 +721,11 @@ device qcpdc
|
|||
attach qcpdc at fdt
|
||||
file dev/fdt/qcpdc.c qcpdc
|
||||
|
||||
# Qualcomm Temperature Sensor
|
||||
device qctsens
|
||||
attach qctsens at fdt
|
||||
file dev/fdt/qctsens.c qctsens
|
||||
|
||||
# Qualcomm PMIC
|
||||
device qcpmic: spmi
|
||||
attach qcpmic at spmi
|
||||
|
|
206
sys/dev/fdt/qctsens.c
Normal file
206
sys/dev/fdt/qctsens.c
Normal file
|
@ -0,0 +1,206 @@
|
|||
/* $OpenBSD: qctsens.c,v 1.1 2023/06/27 22:38:46 patrick Exp $ */
|
||||
/*
|
||||
* Copyright (c) 2023 Patrick Wildt <patrick@blueri.se>
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/device.h>
|
||||
#include <sys/sensors.h>
|
||||
|
||||
#include <machine/intr.h>
|
||||
#include <machine/bus.h>
|
||||
#include <machine/fdt.h>
|
||||
|
||||
#include <dev/ofw/openfirm.h>
|
||||
#include <dev/ofw/ofw_clock.h>
|
||||
#include <dev/ofw/ofw_misc.h>
|
||||
#include <dev/ofw/ofw_thermal.h>
|
||||
#include <dev/ofw/fdt.h>
|
||||
|
||||
/* Registers (sensor block) */
|
||||
#define TSENS_Sn_STATUS(n) (0xa0 + (4 * (n)))
|
||||
#define TSENS_Sn_VALID (1 << 21)
|
||||
#define TSENS_Sn_TEMP(x) ((x) & 0xfff)
|
||||
|
||||
/* Registers (config block) */
|
||||
#define TSENS_HW_VER 0x00
|
||||
#define TSENS_CTRL 0x04
|
||||
#define TSENS_CTRL_EN (1 << 0)
|
||||
#define TSENS_CTRL_Sn_EN(x) (1 << ((x) + 3))
|
||||
|
||||
#define TSENS_NUM_SENSORS 16
|
||||
|
||||
struct qctsens_softc {
|
||||
struct device sc_dev;
|
||||
bus_space_tag_t sc_iot;
|
||||
bus_space_handle_t sc_ioh;
|
||||
bus_space_handle_t sc_ioh_conf;
|
||||
|
||||
int sc_node;
|
||||
|
||||
struct ksensordev sc_sensordev;
|
||||
struct ksensor sc_sensor[TSENS_NUM_SENSORS];
|
||||
|
||||
struct thermal_sensor sc_ts;
|
||||
};
|
||||
|
||||
int qctsens_match(struct device *, void *, void *);
|
||||
void qctsens_attach(struct device *, struct device *, void *);
|
||||
|
||||
const struct cfattach qctsens_ca = {
|
||||
sizeof (struct qctsens_softc), qctsens_match, qctsens_attach
|
||||
};
|
||||
|
||||
struct cfdriver qctsens_cd = {
|
||||
NULL, "qctsens", DV_DULL
|
||||
};
|
||||
|
||||
void qctsens_refresh_sensors(void *);
|
||||
int32_t qctsens_get_temperature(void *, uint32_t *);
|
||||
void qctsens_attach_sensors(struct qctsens_softc *);
|
||||
|
||||
int
|
||||
qctsens_match(struct device *parent, void *match, void *aux)
|
||||
{
|
||||
struct fdt_attach_args *faa = aux;
|
||||
|
||||
return OF_is_compatible(faa->fa_node, "qcom,tsens-v2");
|
||||
}
|
||||
|
||||
void
|
||||
qctsens_attach(struct device *parent, struct device *self, void *aux)
|
||||
{
|
||||
struct qctsens_softc *sc = (struct qctsens_softc *)self;
|
||||
struct fdt_attach_args *faa = aux;
|
||||
uint32_t reg;
|
||||
|
||||
if (faa->fa_nreg < 1) {
|
||||
printf(": no registers\n");
|
||||
return;
|
||||
}
|
||||
|
||||
sc->sc_node = faa->fa_node;
|
||||
sc->sc_iot = faa->fa_iot;
|
||||
if (bus_space_map(sc->sc_iot, faa->fa_reg[0].addr,
|
||||
faa->fa_reg[0].size, 0, &sc->sc_ioh)) {
|
||||
printf(": can't map registers (sensors)\n");
|
||||
return;
|
||||
}
|
||||
if (bus_space_map(sc->sc_iot, faa->fa_reg[1].addr,
|
||||
faa->fa_reg[1].size, 0, &sc->sc_ioh_conf)) {
|
||||
printf(": can't map registers (config)\n");
|
||||
return;
|
||||
}
|
||||
|
||||
printf("\n");
|
||||
|
||||
reg = bus_space_read_4(sc->sc_iot, sc->sc_ioh_conf, TSENS_CTRL);
|
||||
if ((reg & TSENS_CTRL_EN) == 0)
|
||||
return;
|
||||
|
||||
qctsens_attach_sensors(sc);
|
||||
|
||||
sc->sc_ts.ts_node = sc->sc_node;
|
||||
sc->sc_ts.ts_cookie = sc;
|
||||
sc->sc_ts.ts_get_temperature = qctsens_get_temperature;
|
||||
thermal_sensor_register(&sc->sc_ts);
|
||||
}
|
||||
|
||||
void
|
||||
qctsens_attach_sensors(struct qctsens_softc *sc)
|
||||
{
|
||||
char nodename[32];
|
||||
uint32_t propdata[4];
|
||||
uint32_t phandle, reg;
|
||||
int node, len, sidx;
|
||||
|
||||
phandle = OF_getpropint(sc->sc_node, "phandle", 0);
|
||||
if (phandle == 0) {
|
||||
printf("%s: missing phandle on node\n", sc->sc_dev.dv_xname);
|
||||
return;
|
||||
}
|
||||
|
||||
reg = bus_space_read_4(sc->sc_iot, sc->sc_ioh_conf, TSENS_CTRL);
|
||||
node = OF_getnodebyname(0, "thermal-zones");
|
||||
for (node = OF_child(node); node != 0; node = OF_peer(node)) {
|
||||
len = OF_getpropintarray(node, "thermal-sensors", propdata,
|
||||
sizeof(propdata));
|
||||
|
||||
if (len != 8 || propdata[0] != phandle || propdata[1] >= 16)
|
||||
continue;
|
||||
|
||||
len = OF_getprop(node, "name", nodename, sizeof(nodename));
|
||||
len = strlen(nodename);
|
||||
if (strcmp("-thermal", &nodename[len - 8]) != 0)
|
||||
continue;
|
||||
|
||||
nodename[len - 8] = '\0';
|
||||
sidx = propdata[1];
|
||||
|
||||
if ((reg & TSENS_CTRL_Sn_EN(sidx)) == 0)
|
||||
continue;
|
||||
|
||||
strlcpy(sc->sc_sensor[sidx].desc, nodename,
|
||||
sizeof(sc->sc_sensor[sidx].desc));
|
||||
sc->sc_sensor[sidx].type = SENSOR_TEMP;
|
||||
sc->sc_sensor[sidx].flags = SENSOR_FINVALID;
|
||||
sensor_attach(&sc->sc_sensordev, &sc->sc_sensor[sidx]);
|
||||
}
|
||||
|
||||
strlcpy(sc->sc_sensordev.xname, sc->sc_dev.dv_xname,
|
||||
sizeof(sc->sc_sensordev.xname));
|
||||
sensordev_install(&sc->sc_sensordev);
|
||||
sensor_task_register(sc, qctsens_refresh_sensors, 1);
|
||||
}
|
||||
|
||||
void
|
||||
qctsens_refresh_sensors(void *arg)
|
||||
{
|
||||
struct qctsens_softc *sc = arg;
|
||||
int32_t reg, temp;
|
||||
int id;
|
||||
|
||||
for (id = 0; id < TSENS_NUM_SENSORS; id++) {
|
||||
if (sc->sc_sensor[id].type != SENSOR_TEMP)
|
||||
continue;
|
||||
reg = bus_space_read_4(sc->sc_iot, sc->sc_ioh,
|
||||
TSENS_Sn_STATUS(id));
|
||||
temp = TSENS_Sn_TEMP(reg);
|
||||
if (reg & TSENS_Sn_VALID) {
|
||||
sc->sc_sensor[id].value = 273150000 + 100000 * temp;
|
||||
sc->sc_sensor[id].flags &= ~SENSOR_FINVALID;
|
||||
} else {
|
||||
sc->sc_sensor[id].flags = SENSOR_FINVALID;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int32_t
|
||||
qctsens_get_temperature(void *cookie, uint32_t *cells)
|
||||
{
|
||||
struct qctsens_softc *sc = cookie;
|
||||
uint32_t id = cells[0];
|
||||
int32_t reg, temp;
|
||||
|
||||
reg = bus_space_read_4(sc->sc_iot, sc->sc_ioh, TSENS_Sn_STATUS(id));
|
||||
temp = 273150000 + 100000 * TSENS_Sn_TEMP(reg);
|
||||
|
||||
if (reg & TSENS_Sn_VALID)
|
||||
return temp;
|
||||
|
||||
return THERMAL_SENSOR_MAX;
|
||||
}
|
|
@ -1,4 +1,4 @@
|
|||
/* $OpenBSD: drm_linux.c,v 1.98 2023/06/01 10:21:26 claudio Exp $ */
|
||||
/* $OpenBSD: drm_linux.c,v 1.99 2023/06/28 08:23:25 claudio Exp $ */
|
||||
/*
|
||||
* Copyright (c) 2013 Jonathan Gray <jsg@openbsd.org>
|
||||
* Copyright (c) 2015, 2016 Mark Kettenis <kettenis@openbsd.org>
|
||||
|
@ -135,14 +135,15 @@ schedule_timeout(long timeout)
|
|||
{
|
||||
struct sleep_state sls;
|
||||
unsigned long deadline;
|
||||
int wait, spl, timo = 0;
|
||||
int wait, spl, prio, timo = 0;
|
||||
|
||||
MUTEX_ASSERT_LOCKED(&sch_mtx);
|
||||
KASSERT(!cold);
|
||||
|
||||
if (timeout != MAX_SCHEDULE_TIMEOUT)
|
||||
timo = timeout;
|
||||
sleep_setup(&sls, sch_ident, sch_priority, "schto", timo);
|
||||
prio = sch_priority;
|
||||
sleep_setup(&sls, sch_ident, prio, "schto");
|
||||
|
||||
wait = (sch_proc == curproc && timeout > 0);
|
||||
|
||||
|
@ -152,7 +153,7 @@ schedule_timeout(long timeout)
|
|||
|
||||
if (timeout != MAX_SCHEDULE_TIMEOUT)
|
||||
deadline = jiffies + timeout;
|
||||
sleep_finish(&sls, wait);
|
||||
sleep_finish(&sls, prio, timo, wait);
|
||||
if (timeout != MAX_SCHEDULE_TIMEOUT)
|
||||
timeout = deadline - jiffies;
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $OpenBSD: if_myx.c,v 1.116 2022/03/11 18:00:48 mpi Exp $ */
|
||||
/* $OpenBSD: if_myx.c,v 1.117 2023/06/28 08:23:25 claudio Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2007 Reyk Floeter <reyk@openbsd.org>
|
||||
|
@ -1397,9 +1397,9 @@ myx_down(struct myx_softc *sc)
|
|||
(void)myx_cmd(sc, MYXCMD_SET_IFDOWN, &mc, NULL);
|
||||
|
||||
while (sc->sc_state != MYX_S_OFF) {
|
||||
sleep_setup(&sls, sts, PWAIT, "myxdown", 0);
|
||||
sleep_setup(&sls, sts, PWAIT, "myxdown");
|
||||
membar_consumer();
|
||||
sleep_finish(&sls, sc->sc_state != MYX_S_OFF);
|
||||
sleep_finish(&sls, PWAIT, 0, sc->sc_state != MYX_S_OFF);
|
||||
}
|
||||
|
||||
s = splnet();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue