Hi tech@,
This is an attempt at adding lid state detection in ykbec(4). Tested on
a Lemote Yeeloong 8101B.
Comments? OK?
Index: share/man/man4/man4.loongson/ykbec.4
===================================================================
RCS file: /cvs/src/share/man/man4/man4.loongson/ykbec.4,v
retrieving revision 1.3
diff -u -p -r1.3 ykbec.4
--- share/man/man4/man4.loongson/ykbec.4 25 Feb 2010 10:07:11 -0000
1.3
+++ share/man/man4/man4.loongson/ykbec.4 12 Nov 2016 15:10:03 -0000
@@ -40,9 +40,11 @@ Battery control
Button events
.It
Power management
+.It
+Lid state
.El
.Pp
-Fan and battery information is made available via the
+Fan, battery, and lid information is made available via the
.Xr sysctl 3
hardware sensor interface.
Not all the device interfaces are supported under
Index: sys/arch/loongson/dev/kb3310.c
===================================================================
RCS file: /cvs/src/sys/arch/loongson/dev/kb3310.c,v
retrieving revision 1.20
diff -u -p -r1.20 kb3310.c
--- sys/arch/loongson/dev/kb3310.c 8 Jan 2016 15:54:13 -0000 1.20
+++ sys/arch/loongson/dev/kb3310.c 12 Nov 2016 15:10:05 -0000
@@ -76,8 +76,10 @@ static const struct {
#define YKBEC_CHARGING 7
{ "Battery charging", SENSOR_INDICATOR },
#define YKBEC_AC 8
- { "AC-Power", SENSOR_INDICATOR }
-#define YKBEC_NSENSORS 9
+ { "AC-Power", SENSOR_INDICATOR },
+#define YKBEC_LID 9
+ { "Lid open", SENSOR_INDICATOR }
+#define YKBEC_NSENSORS 10
};
struct ykbec_softc {
@@ -310,6 +312,10 @@ ykbec_read16(struct ykbec_softc *mcsc, u
#define REG_FAN_ON 1
#define REG_FAN_OFF 0
+#define REG_LID_STATE 0xf4bd
+#define LID_OPEN 1
+#define LID_CLOSED 0
+
#define YKBEC_SCI_IRQ 0xa
#ifdef DEBUG
@@ -337,7 +343,7 @@ ykbec_refresh(void *arg)
{
struct ykbec_softc *sc = (struct ykbec_softc *)arg;
u_int val, bat_charge, bat_status, charge_status, bat_state, power_flag;
- u_int cap_pct, fullcap;
+ u_int lid_state, cap_pct, fullcap;
int current;
#if NAPM > 0
struct apm_power_info old;
@@ -376,11 +382,14 @@ ykbec_refresh(void *arg)
charge_status = ykbec_read(sc, REG_CHARGE_STATUS);
bat_state = ykbec_read(sc, REG_BAT_STATE);
power_flag = ykbec_read(sc, REG_POWER_FLAG);
+ lid_state = ykbec_read(sc, REG_LID_STATE);
sc->sc_sensor[YKBEC_CHARGING].value = !!ISSET(bat_state,
BAT_STATE_CHARGING);
sc->sc_sensor[YKBEC_AC].value = !!ISSET(power_flag,
POWER_FLAG_ADAPTER_IN);
+
+ sc->sc_sensor[YKBEC_LID].value = !!ISSET(lid_state, LID_OPEN);
sc->sc_sensor[YKBEC_CAP].status = ISSET(bat_status, BAT_STATUS_BAT_LOW)
?
SENSOR_S_CRIT : SENSOR_S_OK;