summaryrefslogtreecommitdiffstats
path: root/sys/dev/asmc
diff options
context:
space:
mode:
authoradrian <adrian@FreeBSD.org>2016-05-02 19:15:16 +0000
committeradrian <adrian@FreeBSD.org>2016-05-02 19:15:16 +0000
commitf80f60242ea5862a16144f9d376bb460551aebc0 (patch)
tree73a9a273e86538c5412e414281ce02f4216bea65 /sys/dev/asmc
parent42681e6ccf3c8e4c9934a203a1d1c696efce05da (diff)
downloadFreeBSD-src-f80f60242ea5862a16144f9d376bb460551aebc0.zip
FreeBSD-src-f80f60242ea5862a16144f9d376bb460551aebc0.tar.gz
[asmc] add support for more models and restore keyboard backlight after resume.
This patch adds support for restoring backlight after resume and adds models Macbook3,1 MacbookAir5,1 MacbookAir5,2 It also incorporates fixes for bug #175260, bug #203610 and bug #203512 so those can be closed if this patch is applied. PR: kern/209156 PR: kern/175260 PR: kern/203610 PR: kern/203512 Submitted by: Johannes Lundberg <johannes@brilliantservice.co.jp>
Diffstat (limited to 'sys/dev/asmc')
-rw-r--r--sys/dev/asmc/asmc.c56
-rw-r--r--sys/dev/asmc/asmcvar.h35
2 files changed, 85 insertions, 6 deletions
diff --git a/sys/dev/asmc/asmc.c b/sys/dev/asmc/asmc.c
index 9c8c89a..f69f77d 100644
--- a/sys/dev/asmc/asmc.c
+++ b/sys/dev/asmc/asmc.c
@@ -63,6 +63,7 @@ __FBSDID("$FreeBSD$");
static int asmc_probe(device_t dev);
static int asmc_attach(device_t dev);
static int asmc_detach(device_t dev);
+static int asmc_resume(device_t dev);
/*
* SMC functions.
@@ -137,10 +138,18 @@ static struct asmc_model *asmc_match(device_t dev);
#define ASMC_SMS_FUNCS asmc_mb_sysctl_sms_x, asmc_mb_sysctl_sms_y, \
asmc_mb_sysctl_sms_z
+#define ASMC_SMS_FUNCS_DISABLED NULL,NULL,NULL
+
#define ASMC_FAN_FUNCS asmc_mb_sysctl_fanid, asmc_mb_sysctl_fanspeed, asmc_mb_sysctl_fansafespeed, \
asmc_mb_sysctl_fanminspeed, \
asmc_mb_sysctl_fanmaxspeed, \
asmc_mb_sysctl_fantargetspeed
+
+#define ASMC_FAN_FUNCS2 asmc_mb_sysctl_fanid, asmc_mb_sysctl_fanspeed, NULL, \
+ asmc_mb_sysctl_fanminspeed, \
+ asmc_mb_sysctl_fanmaxspeed, \
+ asmc_mb_sysctl_fantargetspeed
+
#define ASMC_LIGHT_FUNCS asmc_mbp_sysctl_light_left, \
asmc_mbp_sysctl_light_right, \
asmc_mbp_sysctl_light_control
@@ -158,6 +167,12 @@ struct asmc_model asmc_models[] = {
ASMC_MB_TEMPS, ASMC_MB_TEMPNAMES, ASMC_MB_TEMPDESCS
},
+ {
+ "MacBook3,1", "Apple SMC MacBook Core 2 Duo",
+ ASMC_SMS_FUNCS, ASMC_FAN_FUNCS, NULL, NULL, NULL,
+ ASMC_MB31_TEMPS, ASMC_MB31_TEMPNAMES, ASMC_MB31_TEMPDESCS
+ },
+
{
"MacBookPro1,1", "Apple SMC MacBook Pro Core Duo (15-inch)",
ASMC_SMS_FUNCS, ASMC_FAN_FUNCS, ASMC_LIGHT_FUNCS,
@@ -260,12 +275,30 @@ struct asmc_model asmc_models[] = {
ASMC_MBA3_TEMPS, ASMC_MBA3_TEMPNAMES, ASMC_MBA3_TEMPDESCS
},
+ {
+ "MacBookAir5,1", "Apple SMC MacBook Air 11-inch (Mid 2012)",
+ ASMC_SMS_FUNCS_DISABLED,
+ ASMC_FAN_FUNCS2,
+ ASMC_LIGHT_FUNCS,
+ ASMC_MBA5_TEMPS, ASMC_MBA5_TEMPNAMES, ASMC_MBA5_TEMPDESCS
+ },
+
+ {
+ "MacBookAir5,2", "Apple SMC MacBook Air 13-inch (Mid 2012)",
+ ASMC_SMS_FUNCS_DISABLED,
+ ASMC_FAN_FUNCS2,
+ ASMC_LIGHT_FUNCS,
+ ASMC_MBA5_TEMPS, ASMC_MBA5_TEMPNAMES, ASMC_MBA5_TEMPDESCS
+ },
+
{ NULL, NULL }
};
#undef ASMC_SMS_FUNCS
+#undef ASMC_SMS_FUNCS_DISABLED
#undef ASMC_FAN_FUNCS
+#undef ASMC_FAN_FUNCS2
#undef ASMC_LIGHT_FUNCS
/*
@@ -275,6 +308,7 @@ static device_method_t asmc_methods[] = {
DEVMETHOD(device_probe, asmc_probe),
DEVMETHOD(device_attach, asmc_attach),
DEVMETHOD(device_detach, asmc_detach),
+ DEVMETHOD(device_resume, asmc_resume),
{ 0, 0 }
};
@@ -301,6 +335,8 @@ static char *asmc_ids[] = { "APP0001", NULL };
static devclass_t asmc_devclass;
+static unsigned int light_control = 0;
+
DRIVER_MODULE(asmc, acpi, asmc_driver, asmc_devclass, NULL, NULL);
MODULE_DEPEND(asmc, acpi, 1, 1, 1);
@@ -581,6 +617,17 @@ asmc_detach(device_t dev)
return (0);
}
+static int
+asmc_resume(device_t dev)
+{
+ uint8_t buf[2];
+ buf[0] = light_control;
+ buf[1] = 0x00;
+ asmc_key_write(dev, ASMC_KEY_LIGHTVALUE, buf, sizeof buf);
+ return (0);
+}
+
+
#ifdef DEBUG
void asmc_dumpall(device_t dev)
{
@@ -879,7 +926,7 @@ out:
snprintf(buf, sizeof(buf), "key %d is: %s, type %s "
"(len %d), data", number, key, type, maxlen);
for (i = 0; i < maxlen; i++) {
- snprintf(buf2, sizeof(buf), " %02x", v[i]);
+ snprintf(buf2, sizeof(buf2), " %02x", v[i]);
strlcat(buf, buf2, sizeof(buf));
}
strlcat(buf, " \n", sizeof(buf));
@@ -1324,17 +1371,16 @@ asmc_mbp_sysctl_light_control(SYSCTL_HANDLER_ARGS)
device_t dev = (device_t) arg1;
uint8_t buf[2];
int error;
- static unsigned int level;
int v;
- v = level;
+ v = light_control;
error = sysctl_handle_int(oidp, &v, 0, req);
if (error == 0 && req->newptr != NULL) {
if (v < 0 || v > 255)
return (EINVAL);
- level = v;
- buf[0] = level;
+ light_control = v;
+ buf[0] = light_control;
buf[1] = 0x00;
asmc_key_write(dev, ASMC_KEY_LIGHTVALUE, buf, sizeof buf);
}
diff --git a/sys/dev/asmc/asmcvar.h b/sys/dev/asmc/asmcvar.h
index 368575b..f67ee16 100644
--- a/sys/dev/asmc/asmcvar.h
+++ b/sys/dev/asmc/asmcvar.h
@@ -144,7 +144,19 @@ struct asmc_softc {
"Northbridge Point 2", "Heatsink 1", \
"Heatsink 2", "Memory Bank A", }
-#define ASMC_MBP_TEMPS { "TB0T", "Th0H", "Th1H", "Tm0P", \
+#define ASMC_MB31_TEMPS { "TB0T", "TN0P", "Th0H", "Th1H", \
+ "TM0P", NULL }
+
+#define ASMC_MB31_TEMPNAMES { "enclosure", "northbridge1", \
+ "heatsink1", "heatsink2", \
+ "memory", }
+
+#define ASMC_MB31_TEMPDESCS { "Enclosure Bottomside", \
+ "Northbridge Point 1", \
+ "Heatsink 1","Heatsink 2" \
+ "Memory Bank A", }
+
+#define ASMC_MBP_TEMPS { "TB0T", "Th0H", "Th1H", "Tm0P", \
"TG0H", "TG0P", "TG0T", NULL }
#define ASMC_MBP_TEMPNAMES { "enclosure", "heatsink1", \
@@ -337,3 +349,24 @@ struct asmc_softc {
#define ASMC_MBA3_TEMPDESCS { "Enclosure Bottom", "TB1T", "TB2T", \
"TC0D", "TC0E", "TC0P" }
+
+#define ASMC_MBA5_TEMPS { "TB0T", "TB1T", "TB2T", "TC0C", \
+ "TC0D", "TC0E", "TC0F", "TC0P", \
+ "TC1C", "TC2C", "TCGC", "TCSA", \
+ "TCXC", "THSP", "TM0P", "TPCD", \
+ "Ta0P", "Th1H", "Tm0P", "Tm1P", \
+ "Ts0P", "Ts0S", NULL }
+
+#define ASMC_MBA5_TEMPNAMES { "enclosure1", "enclosure2", "enclosure3", "TC0C", \
+ "cpudiode", "cputemp1", "cputemp2", "cpuproximity", \
+ "cpucore1", "cpucore2", "cpupeci", "pecisa", \
+ "TCXC", "THSP", "memorybank", "pchdie", \
+ "Ta0P", "heatpipe", "mainboardproximity1", "mainboardproximity2", \
+ "palmrest", "memoryproximity" }
+
+#define ASMC_MBA5_TEMPDESCS { "Enclosure Bottom 1", "Enclosure Bottom 2", "Enclosure Bottom 3", "TC0C",\
+ "CPU Diode", "CPU Temp 1", "CPU Temp 2", "CPU Proximity", \
+ "CPU Core 1", "CPU Core 2", "CPU Peci Core", "PECI SA", \
+ "TCXC", "THSP", "Memory Bank A", "PCH Die", \
+ "Ta0P", "Heatpipe", "Mainboard Proximity 1", "Mainboard Proximity 2", \
+ "Palm Rest", "Memory Proximity" }
OpenPOWER on IntegriCloud