Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 68e681e8 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge master.kernel.org:/pub/scm/linux/kernel/git/davem/sparc-2.6

parents 25f13053 38c1844b
Loading
Loading
Loading
Loading
+10 −29
Original line number Diff line number Diff line
@@ -7,6 +7,7 @@
#define __KERNEL_SYSCALLS__

#include <linux/kernel.h>
#include <linux/kthread.h>
#include <linux/sched.h>
#include <linux/slab.h>
#include <linux/delay.h>
@@ -459,10 +460,6 @@ static struct task_struct *kenvctrld_task;

static int kenvctrld(void *__unused)
{
	daemonize("kenvctrld");
	allow_signal(SIGKILL);
	kenvctrld_task = current;

	printk(KERN_INFO "bbc_envctrl: kenvctrld starting...\n");
	last_warning_jiffies = jiffies - WARN_INTERVAL;
	for (;;) {
@@ -470,7 +467,7 @@ static int kenvctrld(void *__unused)
		struct bbc_fan_control *fp;

		msleep_interruptible(POLL_INTERVAL);
		if (signal_pending(current))
		if (kthread_should_stop())
			break;

		for (tp = all_bbc_temps; tp; tp = tp->next) {
@@ -577,7 +574,6 @@ int bbc_envctrl_init(void)
	int temp_index = 0;
	int fan_index = 0;
	int devidx = 0;
	int err = 0;

	while ((echild = bbc_i2c_getdev(devidx++)) != NULL) {
		if (!strcmp(echild->prom_name, "temperature"))
@@ -585,9 +581,13 @@ int bbc_envctrl_init(void)
		if (!strcmp(echild->prom_name, "fan-control"))
			attach_one_fan(echild, fan_index++);
	}
	if (temp_index != 0 && fan_index != 0)
		err = kernel_thread(kenvctrld, NULL, CLONE_FS | CLONE_FILES);
	return err;
	if (temp_index != 0 && fan_index != 0) {
		kenvctrld_task = kthread_run(kenvctrld, NULL, "kenvctrld");
		if (IS_ERR(kenvctrld_task))
			return PTR_ERR(kenvctrld_task);
	}

	return 0;
}

static void destroy_one_temp(struct bbc_cpu_temperature *tp)
@@ -607,26 +607,7 @@ void bbc_envctrl_cleanup(void)
	struct bbc_cpu_temperature *tp;
	struct bbc_fan_control *fp;

	if (kenvctrld_task != NULL) {
		force_sig(SIGKILL, kenvctrld_task);
		for (;;) {
			struct task_struct *p;
			int found = 0;

			read_lock(&tasklist_lock);
			for_each_process(p) {
				if (p == kenvctrld_task) {
					found = 1;
					break;
				}
			}
			read_unlock(&tasklist_lock);
			if (!found)
				break;
			msleep(1000);
		}
		kenvctrld_task = NULL;
	}
	kthread_stop(kenvctrld_task);

	tp = all_bbc_temps;
	while (tp != NULL) {
+10 −35
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@
#include <linux/config.h>
#include <linux/module.h>
#include <linux/sched.h>
#include <linux/kthread.h>
#include <linux/errno.h>
#include <linux/delay.h>
#include <linux/ioport.h>
@@ -1010,14 +1011,11 @@ static int kenvctrld(void *__unused)

	poll_interval = 5000; /* TODO env_mon_interval */

	daemonize("kenvctrld");
	allow_signal(SIGKILL);

	kenvctrld_task = current;

	printk(KERN_INFO "envctrl: %s starting...\n", current->comm);
	for (;;) {
		if(msleep_interruptible(poll_interval))
		msleep_interruptible(poll_interval);

		if (kthread_should_stop())
			break;
		
		for (whichcpu = 0; whichcpu < ENVCTRL_MAX_CPU; ++whichcpu) {
@@ -1041,7 +1039,6 @@ static int kenvctrld(void *__unused)

static int __init envctrl_init(void)
{
#ifdef CONFIG_PCI
	struct linux_ebus *ebus = NULL;
	struct linux_ebus_device *edev = NULL;
	struct linux_ebus_child *edev_child = NULL;
@@ -1118,9 +1115,11 @@ static int __init envctrl_init(void)
			i2c_childlist[i].addr, (0 == i) ? ("\n") : (" "));
	}

	err = kernel_thread(kenvctrld, NULL, CLONE_FS | CLONE_FILES);
	if (err < 0)
	kenvctrld_task = kthread_run(kenvctrld, NULL, "kenvctrld");
	if (IS_ERR(kenvctrld_task)) {
		err = PTR_ERR(kenvctrld_task);
		goto out_deregister;
	}

	return 0;

@@ -1133,37 +1132,13 @@ static int __init envctrl_init(void)
			kfree(i2c_childlist[i].tables);
	}
	return err;
#else
	return -ENODEV;
#endif
}

static void __exit envctrl_cleanup(void)
{
	int i;

	if (NULL != kenvctrld_task) {
		force_sig(SIGKILL, kenvctrld_task);
		for (;;) {
			struct task_struct *p;
			int found = 0;

			read_lock(&tasklist_lock);
			for_each_process(p) {
				if (p == kenvctrld_task) {
					found = 1;
					break;
				}
			}
			read_unlock(&tasklist_lock);

			if (!found)
				break;

			msleep(1000);
		}
		kenvctrld_task = NULL;
	}
	kthread_stop(kenvctrld_task);

	iounmap(i2c);
	misc_deregister(&envctrl_dev);