View | Details | Raw Unified | Return to bug 234403 | Differences between
and this patch

Collapse All | Expand All

(-)b/share/man/man4/acpi_ibm.4 (+22 lines)
Lines 341-346 Built-in battery Link Here
341
.It
341
.It
342
UltraBay battery
342
UltraBay battery
343
.El
343
.El
344
.It Va dev.acpi_ibm.0.bat0_charge_start
345
Primary battery charge below which charging starts.
346
.Pp
347
.Bl -tag -width indent-two -compact
348
.It Li 0
349
Use battery firmware's default setting
350
.It Li 1-99
351
Threshold in percent
352
.It Li -4
353
Not supported
354
.El
355
.It Va dev.acpi_ibm.0.bat0_charge_stop
356
Primary battery charge above which charging stops.
357
.Pp
358
.Bl -tag -width indent-two -compact
359
.It Li 0
360
Use battery firmware's default setting
361
.It Li 1-99
362
Threshold in percent
363
.It Li -4
364
Not supported
365
.El
344
.It Va dev.acpi_ibm.0.handlerevents
366
.It Va dev.acpi_ibm.0.handlerevents
345
.Xr devd 8
367
.Xr devd 8
346
events handled by
368
events handled by
(-)b/sys/dev/acpi_support/acpi_ibm.c (-2 / +99 lines)
Lines 77-82 ACPI_MODULE_NAME("IBM") Link Here
77
#define ACPI_IBM_METHOD_HANDLEREVENTS	14
77
#define ACPI_IBM_METHOD_HANDLEREVENTS	14
78
#define ACPI_IBM_METHOD_MIC_LED		15
78
#define ACPI_IBM_METHOD_MIC_LED		15
79
#define ACPI_IBM_METHOD_PRIVACYGUARD	16
79
#define ACPI_IBM_METHOD_PRIVACYGUARD	16
80
#define ACPI_IBM_METHOD_BAT0_CHRG_START	17
81
#define ACPI_IBM_METHOD_BAT0_CHRG_STOP	18
80
82
81
/* Hotkeys/Buttons */
83
/* Hotkeys/Buttons */
82
#define IBM_RTC_HOTKEY1			0x64
84
#define IBM_RTC_HOTKEY1			0x64
Lines 154-159 ACPI_MODULE_NAME("IBM") Link Here
154
#define IBM_FLAG_PRIVACYGUARD_DEVICE_PRESENT	0x10000
156
#define IBM_FLAG_PRIVACYGUARD_DEVICE_PRESENT	0x10000
155
#define IBM_FLAG_PRIVACYGUARD_ON	0x1
157
#define IBM_FLAG_PRIVACYGUARD_ON	0x1
156
158
159
/* Batteries */
160
#define IBM_BAT_PRIMARY   1
161
157
#define ABS(x) (((x) < 0)? -(x) : (x))
162
#define ABS(x) (((x) < 0)? -(x) : (x))
158
163
159
struct acpi_ibm_softc {
164
struct acpi_ibm_softc {
Lines 282-287 static struct { Link Here
282
	 .method	= ACPI_IBM_METHOD_PRIVACYGUARD,
287
	 .method	= ACPI_IBM_METHOD_PRIVACYGUARD,
283
	 .description	= "PrivacyGuard enable",
288
	 .description	= "PrivacyGuard enable",
284
	},
289
	},
290
	{
291
		.name		= "bat0_charge_start",
292
		.method		= ACPI_IBM_METHOD_BAT0_CHRG_START,
293
		.description	= "Primary battery charge threshold",
294
	},
295
	{
296
		.name		= "bat0_charge_stop",
297
		.method		= ACPI_IBM_METHOD_BAT0_CHRG_STOP,
298
		.description	= "Primary battery charge stop threshold",
299
	},
285
	{ NULL, 0, NULL, 0 }
300
	{ NULL, 0, NULL, 0 }
286
};
301
};
287
302
Lines 365-372 static driver_t acpi_ibm_driver = { Link Here
365
380
366
static devclass_t acpi_ibm_devclass;
381
static devclass_t acpi_ibm_devclass;
367
382
368
DRIVER_MODULE(acpi_ibm, acpi, acpi_ibm_driver, acpi_ibm_devclass,
383
DRIVER_MODULE(acpi_ibm, acpi, acpi_ibm_driver, acpi_ibm_devclass, 0, 0);
369
	      0, 0);
370
MODULE_DEPEND(acpi_ibm, acpi, 1, 1, 1);
384
MODULE_DEPEND(acpi_ibm, acpi, 1, 1, 1);
371
static char    *ibm_ids[] = {"IBM0068", "LEN0068", "LEN0268", NULL};
385
static char    *ibm_ids[] = {"IBM0068", "LEN0068", "LEN0268", NULL};
372
386
Lines 440-445 acpi_ibm_mic_led_set (struct acpi_ibm_softc *sc, int arg) Link Here
440
	return (0);
454
	return (0);
441
}
455
}
442
456
457
/*
458
 * Evaluate an object with one integer parameter that returns one integer.
459
 * If result is NULL, the return value is discarded.
460
 */
461
static ACPI_STATUS
462
acpi_EvalIntToInt(ACPI_HANDLE handle, char *path, UINT32 param, UINT32 *result)
463
{
464
	ACPI_STATUS status;
465
	ACPI_OBJECT_LIST params;
466
	ACPI_OBJECT pbuf[1];
467
	ACPI_BUFFER results;
468
	ACPI_OBJECT rbuf[1];
469
470
	params.Count = 1;
471
	params.Pointer = pbuf;
472
	pbuf[0].Type = ACPI_TYPE_INTEGER;
473
	pbuf[0].Integer.Value = param;
474
475
	if (result != NULL) {
476
		results.Length = sizeof(rbuf);
477
		results.Pointer = rbuf;
478
		status = AcpiEvaluateObject(handle, path, &params, &results);
479
		if (ACPI_SUCCESS(status)) {
480
			if (rbuf[0].Type == ACPI_TYPE_INTEGER)
481
				*result = rbuf[0].Integer.Value;
482
			else
483
				status = AE_TYPE;
484
		}
485
	} else
486
		status = AcpiEvaluateObject(handle, path, &params, NULL);
487
	return (status);
488
}
489
490
/*
491
 * Get battery charge start (BCTG) and stop (BCSG) thresholds.
492
 */
493
static int
494
acpi_ibm_bat_get(ACPI_HANDLE handle, char *path, int bat)
495
{
496
	int val;
497
	if (ACPI_FAILURE(acpi_EvalIntToInt(handle, path, bat & 0x3, &val)))
498
		return -2; /* failed to eval object */
499
	if (val & (1 << 31))
500
		return -3; /* got error flag */
501
	if (!(val & (1 << 8)))
502
		return -4; /* not supported */
503
	return val & 0xff;
504
}
505
506
/*
507
 * Set battery charge start (BCCS) and stop (BCSS) thresholds.
508
 */
509
static int
510
acpi_ibm_bat_set(ACPI_HANDLE handle, char *path, int bat, int arg)
511
{
512
	ACPI_STATUS status;
513
	int val;
514
	if (arg < 0 || arg > 99)
515
		return (EINVAL);
516
	status = acpi_EvalIntToInt(handle, path, (bat & 0x3) << 8 | (arg & 0xff), &val);
517
	if (ACPI_FAILURE(status) || val & 0x8000)
518
		return (-1);
519
	return (0);
520
}
521
443
static int
522
static int
444
acpi_ibm_probe(device_t dev)
523
acpi_ibm_probe(device_t dev)
445
{
524
{
Lines 858-863 acpi_ibm_sysctl_get(struct acpi_ibm_softc *sc, int method) Link Here
858
		val = acpi_ibm_privacyguard_get(sc);
937
		val = acpi_ibm_privacyguard_get(sc);
859
		break;
938
		break;
860
939
940
	case ACPI_IBM_METHOD_BAT0_CHRG_START:
941
		return acpi_ibm_bat_get(sc->handle, "BCTG", IBM_BAT_PRIMARY);
942
943
	case ACPI_IBM_METHOD_BAT0_CHRG_STOP:
944
		return acpi_ibm_bat_get(sc->handle, "BCSG", IBM_BAT_PRIMARY);
861
	}
945
	}
862
946
863
	return (val);
947
	return (val);
Lines 951-956 acpi_ibm_sysctl_set(struct acpi_ibm_softc *sc, int method, int arg) Link Here
951
				(arg == 1) ? (val_ec | IBM_EC_MASK_FANSTATUS) : (val_ec & (~IBM_EC_MASK_FANSTATUS)), 1);
1035
				(arg == 1) ? (val_ec | IBM_EC_MASK_FANSTATUS) : (val_ec & (~IBM_EC_MASK_FANSTATUS)), 1);
952
		}
1036
		}
953
		break;
1037
		break;
1038
1039
	case ACPI_IBM_METHOD_BAT0_CHRG_START:
1040
		return acpi_ibm_bat_set(sc->handle, "BCCS", IBM_BAT_PRIMARY, arg);
1041
1042
	case ACPI_IBM_METHOD_BAT0_CHRG_STOP:
1043
		return acpi_ibm_bat_set(sc->handle, "BCSS", IBM_BAT_PRIMARY, arg);
954
	}
1044
	}
955
1045
956
	return (0);
1046
	return (0);
Lines 1061-1066 acpi_ibm_sysctl_init(struct acpi_ibm_softc *sc, int method) Link Here
1061
	case ACPI_IBM_METHOD_PRIVACYGUARD:
1151
	case ACPI_IBM_METHOD_PRIVACYGUARD:
1062
		return (acpi_ibm_privacyguard_get(sc) != -1);
1152
		return (acpi_ibm_privacyguard_get(sc) != -1);
1063
1153
1154
	case ACPI_IBM_METHOD_BAT0_CHRG_START:
1155
		if (acpi_ibm_bat_get(sc->handle, "BCTG", IBM_BAT_PRIMARY) >= 0)
1156
			return (TRUE);
1157
1158
	case ACPI_IBM_METHOD_BAT0_CHRG_STOP:
1159
		if (acpi_ibm_bat_get(sc->handle, "BCSG", IBM_BAT_PRIMARY) >= 0)
1160
			return (TRUE);
1064
	}
1161
	}
1065
	return (FALSE);
1162
	return (FALSE);
1066
}
1163
}

Return to bug 234403