Skip to content

Commit

Permalink
Merge branch 'develop'
Browse files Browse the repository at this point in the history
  • Loading branch information
Lekensteyn committed Apr 26, 2012
2 parents d5ff9a1 + d12ce73 commit 979fbcf
Show file tree
Hide file tree
Showing 4 changed files with 57 additions and 15 deletions.
24 changes: 24 additions & 0 deletions Makefile.dkms
Original file line number Diff line number Diff line change
@@ -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
8 changes: 8 additions & 0 deletions NEWS
Original file line number Diff line number Diff line change
@@ -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

* Corrected a small error that yielded an confusing error message "The discrete
Expand Down
16 changes: 11 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,10 +38,16 @@ information.
DKMS support
------------

Change `#MODULE_VERSION#` to the current version of bbswitch. Copy the
Makefile, C source and dkms.conf file to `/usr/src/bbswitch-VERSION/` (replace
VERSION with the current version of bbswitch which has been inserted for
`#MODULE_VERSION#`.
If you have DKMS installed, you can install bbswitch in such a way that it
survives kernel upgrades. It is recommended to remove older versions of bbswitch
by running `dkms remove bbswitch/OLDVERSION --all` as root. To install the new
version, simply run:

# make -f Makefile.dkms

To uninstall it, run:

# make -f Makefile.dkms uninstall

Usage
-----
Expand Down Expand Up @@ -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
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
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:

# modprobe bbswitch load_state=0 unload_state=1
Expand Down
24 changes: 14 additions & 10 deletions bbswitch.c
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,12 @@
#include <linux/suspend.h>
#include <linux/seq_file.h>

#define BBSWITCH_VERSION "0.4.2"

MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("Toggle the discrete graphics card");
MODULE_AUTHOR("Peter Lekensteyn <lekensteyn@gmail.com>");
MODULE_VERSION("0.4.1");
MODULE_VERSION(BBSWITCH_VERSION);

enum {
CARD_UNCHANGED = -1,
Expand Down Expand Up @@ -69,12 +71,11 @@ static struct notifier_block nb;
/* whether the card was off before suspend or not; on: 0, off: 1 */
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;
for (i=0; i<sizeof(buffer); i++) {
sprintf(target + i * 5, "%02X,", buffer[i]);
for (i=0; i<n; i++) {
snprintf(target + i * 5, 5 * (n - i), "0x%02X,", buffer ? buffer[i] & 0xFF : 0);
}
target[sizeof(buffer) * 5] = '\0';
return target;
}

Expand Down Expand Up @@ -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);
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",
buffer_to_string(muid, tmp), revid, func,
buffer_to_string(args, tmp), acpi_format_exception(err));
buffer_to_string(muid, 16, muid_str), revid, func,
buffer_to_string(args, 4, args_str), acpi_format_exception(err));
return err;
}

Expand Down Expand Up @@ -330,6 +332,8 @@ static int __init bbswitch_init(void) {
struct pci_dev *pdev = 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) {
struct acpi_buffer buf = { ACPI_ALLOCATE_BUFFER, NULL };
acpi_handle handle;
Expand Down Expand Up @@ -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) {
printk(KERN_ERR "bbswitch: Couldn't create proc entry\n");
return -ENOMEM;
Expand Down

0 comments on commit 979fbcf

Please sign in to comment.