Merge branch 'develop'

master v0.4.2
Lekensteyn 13 years ago
commit 979fbcf552

@ -0,0 +1,24 @@
modname := bbswitch
DKMS := dkms
modver := $(shell awk -F'"' '/define *BBSWITCH_VERSION/{print $$2}' < bbswitch.c)
# directory in which generated files are stored
DKMS_DEST := /usr/src/$(modname)-$(modver)
all: install
src_install:
mkdir -p '$(DKMS_DEST)'
cp Makefile bbswitch.c '$(DKMS_DEST)'
sed 's/#MODULE_VERSION#/$(modver)/' dkms/dkms.conf > '$(DKMS_DEST)/dkms.conf'
build: src_install
$(DKMS) build 'bbswitch/$(modver)'
install: build
$(DKMS) install 'bbswitch/$(modver)'
uninstall:
$(DKMS) remove bbswitch/$(modver) --all
.PHONY: all src_install build install uninstall

@ -1,3 +1,11 @@
Version 0.4.2 - 26 April 2012
* Fixed a documentation error on unload_state.
* Added Makefile.dkms and documentation for easier installation using DKMS.
* Make /proc/acpi/bbswitch world-writable
* Fix NULL pointer dereference when reporting a failure during ACPI method
evaluation.
Version 0.4.1 - 16 January 2012 Version 0.4.1 - 16 January 2012
* Corrected a small error that yielded an confusing error message "The discrete * Corrected a small error that yielded an confusing error message "The discrete

@ -38,10 +38,16 @@ information.
DKMS support DKMS support
------------ ------------
Change `#MODULE_VERSION#` to the current version of bbswitch. Copy the If you have DKMS installed, you can install bbswitch in such a way that it
Makefile, C source and dkms.conf file to `/usr/src/bbswitch-VERSION/` (replace survives kernel upgrades. It is recommended to remove older versions of bbswitch
VERSION with the current version of bbswitch which has been inserted for by running `dkms remove bbswitch/OLDVERSION --all` as root. To install the new
`#MODULE_VERSION#`. version, simply run:
# make -f Makefile.dkms
To uninstall it, run:
# make -f Makefile.dkms uninstall
Usage Usage
----- -----
@ -74,7 +80,7 @@ The module has some options that control the behavior on loading and unloading:
`load_state` and `unload_state`. Valid values are `-1`, `0` and `1` meaning "do `load_state` and `unload_state`. Valid values are `-1`, `0` and `1` meaning "do
not change the card state", "turn the card off" and "turn the card on" not change the card state", "turn the card off" and "turn the card on"
respectively. For example, if you want to have `bbswitch` disable the card respectively. For example, if you want to have `bbswitch` disable the card
immediately when loading the module while disabling the card on unload, load the immediately when loading the module while enabling the card on unload, load the
module with: module with:
# modprobe bbswitch load_state=0 unload_state=1 # modprobe bbswitch load_state=0 unload_state=1

@ -16,10 +16,12 @@
#include <linux/suspend.h> #include <linux/suspend.h>
#include <linux/seq_file.h> #include <linux/seq_file.h>
#define BBSWITCH_VERSION "0.4.2"
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("Toggle the discrete graphics card"); MODULE_DESCRIPTION("Toggle the discrete graphics card");
MODULE_AUTHOR("Peter Lekensteyn <lekensteyn@gmail.com>"); MODULE_AUTHOR("Peter Lekensteyn <lekensteyn@gmail.com>");
MODULE_VERSION("0.4.1"); MODULE_VERSION(BBSWITCH_VERSION);
enum { enum {
CARD_UNCHANGED = -1, CARD_UNCHANGED = -1,
@ -69,12 +71,11 @@ static struct notifier_block nb;
/* whether the card was off before suspend or not; on: 0, off: 1 */ /* whether the card was off before suspend or not; on: 0, off: 1 */
int dis_before_suspend_disabled; int dis_before_suspend_disabled;
static char *buffer_to_string(const char buffer[], char *target) { static char *buffer_to_string(const char *buffer, size_t n, char *target) {
int i; int i;
for (i=0; i<sizeof(buffer); i++) { for (i=0; i<n; i++) {
sprintf(target + i * 5, "%02X,", buffer[i]); snprintf(target + i * 5, 5 * (n - i), "0x%02X,", buffer ? buffer[i] & 0xFF : 0);
} }
target[sizeof(buffer) * 5] = '\0';
return target; return target;
} }
@ -110,12 +111,13 @@ static int acpi_call_dsm(acpi_handle handle, const char muid[16], int revid,
err = acpi_evaluate_object(handle, "_DSM", &input, &output); err = acpi_evaluate_object(handle, "_DSM", &input, &output);
if (err) { if (err) {
char tmp[5 * max(sizeof(muid), sizeof(args))]; char muid_str[5 * 16];
char args_str[5 * 4];
printk(KERN_WARNING "bbswitch: failed to evaluate _DSM {%s} %X %X" printk(KERN_WARNING "bbswitch: failed to evaluate _DSM {%s} 0x%X 0x%X"
" {%s}: %s\n", " {%s}: %s\n",
buffer_to_string(muid, tmp), revid, func, buffer_to_string(muid, 16, muid_str), revid, func,
buffer_to_string(args, tmp), acpi_format_exception(err)); buffer_to_string(args, 4, args_str), acpi_format_exception(err));
return err; return err;
} }
@ -330,6 +332,8 @@ static int __init bbswitch_init(void) {
struct pci_dev *pdev = NULL; struct pci_dev *pdev = NULL;
acpi_handle igd_handle = NULL; acpi_handle igd_handle = NULL;
printk(KERN_INFO "bbswitch: version %s\n", BBSWITCH_VERSION);
while ((pdev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, pdev)) != NULL) { while ((pdev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, pdev)) != NULL) {
struct acpi_buffer buf = { ACPI_ALLOCATE_BUFFER, NULL }; struct acpi_buffer buf = { ACPI_ALLOCATE_BUFFER, NULL };
acpi_handle handle; acpi_handle handle;
@ -386,7 +390,7 @@ static int __init bbswitch_init(void) {
} }
} }
acpi_entry = proc_create("bbswitch", 0660, acpi_root_dir, &bbswitch_fops); acpi_entry = proc_create("bbswitch", 0664, acpi_root_dir, &bbswitch_fops);
if (acpi_entry == NULL) { if (acpi_entry == NULL) {
printk(KERN_ERR "bbswitch: Couldn't create proc entry\n"); printk(KERN_ERR "bbswitch: Couldn't create proc entry\n");
return -ENOMEM; return -ENOMEM;

Loading…
Cancel
Save