bbc_i2c: Convert to pure OF driver.
This thing was a mess, who wrote this junk? :) Luckily we'll soon have nice generic I2C layer drivers for this PCF based I2C stuff on sparc64. Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
@@ -1,15 +1,15 @@
|
||||
/* $Id: bbc_envctrl.c,v 1.4 2001/04/06 16:48:08 davem Exp $
|
||||
* bbc_envctrl.c: UltraSPARC-III environment control driver.
|
||||
/* bbc_envctrl.c: UltraSPARC-III environment control driver.
|
||||
*
|
||||
* Copyright (C) 2001 David S. Miller (davem@redhat.com)
|
||||
* Copyright (C) 2001, 2008 David S. Miller (davem@davemloft.net)
|
||||
*/
|
||||
|
||||
#include <linux/kthread.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/kmod.h>
|
||||
#include <linux/reboot.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <asm/oplib.h>
|
||||
#include <asm/ebus.h>
|
||||
|
||||
#include "bbc_i2c.h"
|
||||
#include "max1617.h"
|
||||
@@ -75,43 +75,8 @@ static struct temp_limits amb_temp_limits[2] = {
|
||||
{ 65, 55, 40, 5, -5, -10 },
|
||||
};
|
||||
|
||||
enum fan_action { FAN_SLOWER, FAN_SAME, FAN_FASTER, FAN_FULLBLAST, FAN_STATE_MAX };
|
||||
|
||||
struct bbc_cpu_temperature {
|
||||
struct bbc_cpu_temperature *next;
|
||||
|
||||
struct bbc_i2c_client *client;
|
||||
int index;
|
||||
|
||||
/* Current readings, and history. */
|
||||
s8 curr_cpu_temp;
|
||||
s8 curr_amb_temp;
|
||||
s8 prev_cpu_temp;
|
||||
s8 prev_amb_temp;
|
||||
s8 avg_cpu_temp;
|
||||
s8 avg_amb_temp;
|
||||
|
||||
int sample_tick;
|
||||
|
||||
enum fan_action fan_todo[2];
|
||||
#define FAN_AMBIENT 0
|
||||
#define FAN_CPU 1
|
||||
};
|
||||
|
||||
struct bbc_cpu_temperature *all_bbc_temps;
|
||||
|
||||
struct bbc_fan_control {
|
||||
struct bbc_fan_control *next;
|
||||
|
||||
struct bbc_i2c_client *client;
|
||||
int index;
|
||||
|
||||
int psupply_fan_on;
|
||||
int cpu_fan_speed;
|
||||
int system_fan_speed;
|
||||
};
|
||||
|
||||
struct bbc_fan_control *all_bbc_fans;
|
||||
static LIST_HEAD(all_temps);
|
||||
static LIST_HEAD(all_fans);
|
||||
|
||||
#define CPU_FAN_REG 0xf0
|
||||
#define SYS_FAN_REG 0xf2
|
||||
@@ -330,7 +295,7 @@ static enum fan_action prioritize_fan_action(int which_fan)
|
||||
* recommend we do, and perform that action on all the
|
||||
* fans.
|
||||
*/
|
||||
for (tp = all_bbc_temps; tp; tp = tp->next) {
|
||||
list_for_each_entry(tp, &all_temps, glob_list) {
|
||||
if (tp->fan_todo[which_fan] == FAN_FULLBLAST) {
|
||||
decision = FAN_FULLBLAST;
|
||||
break;
|
||||
@@ -439,7 +404,7 @@ static void fans_full_blast(void)
|
||||
/* Since we will not be monitoring things anymore, put
|
||||
* the fans on full blast.
|
||||
*/
|
||||
for (fp = all_bbc_fans; fp; fp = fp->next) {
|
||||
list_for_each_entry(fp, &all_fans, glob_list) {
|
||||
fp->cpu_fan_speed = FAN_SPEED_MAX;
|
||||
fp->system_fan_speed = FAN_SPEED_MAX;
|
||||
fp->psupply_fan_on = 1;
|
||||
@@ -463,11 +428,11 @@ static int kenvctrld(void *__unused)
|
||||
if (kthread_should_stop())
|
||||
break;
|
||||
|
||||
for (tp = all_bbc_temps; tp; tp = tp->next) {
|
||||
list_for_each_entry(tp, &all_temps, glob_list) {
|
||||
get_current_temps(tp);
|
||||
analyze_temps(tp, &last_warning_jiffies);
|
||||
}
|
||||
for (fp = all_bbc_fans; fp; fp = fp->next)
|
||||
list_for_each_entry(fp, &all_fans, glob_list)
|
||||
maybe_new_fan_speeds(fp);
|
||||
}
|
||||
printk(KERN_INFO "bbc_envctrl: kenvctrld exiting...\n");
|
||||
@@ -477,7 +442,8 @@ static int kenvctrld(void *__unused)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void attach_one_temp(struct linux_ebus_child *echild, int temp_idx)
|
||||
static void attach_one_temp(struct bbc_i2c_bus *bp, struct of_device *op,
|
||||
int temp_idx)
|
||||
{
|
||||
struct bbc_cpu_temperature *tp;
|
||||
|
||||
@@ -485,20 +451,17 @@ static void attach_one_temp(struct linux_ebus_child *echild, int temp_idx)
|
||||
if (!tp)
|
||||
return;
|
||||
|
||||
tp->client = bbc_i2c_attach(echild);
|
||||
tp->client = bbc_i2c_attach(op);
|
||||
if (!tp->client) {
|
||||
kfree(tp);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
tp->index = temp_idx;
|
||||
{
|
||||
struct bbc_cpu_temperature **tpp = &all_bbc_temps;
|
||||
while (*tpp)
|
||||
tpp = &((*tpp)->next);
|
||||
tp->next = NULL;
|
||||
*tpp = tp;
|
||||
}
|
||||
|
||||
list_add(&tp->glob_list, &all_temps);
|
||||
list_add(&tp->bp_list, &bp->temps);
|
||||
|
||||
/* Tell it to convert once every 5 seconds, clear all cfg
|
||||
* bits.
|
||||
@@ -524,7 +487,8 @@ static void attach_one_temp(struct linux_ebus_child *echild, int temp_idx)
|
||||
tp->fan_todo[FAN_CPU] = FAN_SAME;
|
||||
}
|
||||
|
||||
static void attach_one_fan(struct linux_ebus_child *echild, int fan_idx)
|
||||
static void attach_one_fan(struct bbc_i2c_bus *bp, struct of_device *op,
|
||||
int fan_idx)
|
||||
{
|
||||
struct bbc_fan_control *fp;
|
||||
|
||||
@@ -532,7 +496,7 @@ static void attach_one_fan(struct linux_ebus_child *echild, int fan_idx)
|
||||
if (!fp)
|
||||
return;
|
||||
|
||||
fp->client = bbc_i2c_attach(echild);
|
||||
fp->client = bbc_i2c_attach(op);
|
||||
if (!fp->client) {
|
||||
kfree(fp);
|
||||
return;
|
||||
@@ -540,13 +504,8 @@ static void attach_one_fan(struct linux_ebus_child *echild, int fan_idx)
|
||||
|
||||
fp->index = fan_idx;
|
||||
|
||||
{
|
||||
struct bbc_fan_control **fpp = &all_bbc_fans;
|
||||
while (*fpp)
|
||||
fpp = &((*fpp)->next);
|
||||
fp->next = NULL;
|
||||
*fpp = fp;
|
||||
}
|
||||
list_add(&fp->glob_list, &all_fans);
|
||||
list_add(&fp->bp_list, &bp->fans);
|
||||
|
||||
/* The i2c device controlling the fans is write-only.
|
||||
* So the only way to keep track of the current power
|
||||
@@ -563,18 +522,18 @@ static void attach_one_fan(struct linux_ebus_child *echild, int fan_idx)
|
||||
set_fan_speeds(fp);
|
||||
}
|
||||
|
||||
int bbc_envctrl_init(void)
|
||||
int bbc_envctrl_init(struct bbc_i2c_bus *bp)
|
||||
{
|
||||
struct linux_ebus_child *echild;
|
||||
struct of_device *op;
|
||||
int temp_index = 0;
|
||||
int fan_index = 0;
|
||||
int devidx = 0;
|
||||
|
||||
while ((echild = bbc_i2c_getdev(devidx++)) != NULL) {
|
||||
if (!strcmp(echild->prom_node->name, "temperature"))
|
||||
attach_one_temp(echild, temp_index++);
|
||||
if (!strcmp(echild->prom_node->name, "fan-control"))
|
||||
attach_one_fan(echild, fan_index++);
|
||||
while ((op = bbc_i2c_getdev(devidx++)) != NULL) {
|
||||
if (!strcmp(op->node->name, "temperature"))
|
||||
attach_one_temp(bp, op, temp_index++);
|
||||
if (!strcmp(op->node->name, "fan-control"))
|
||||
attach_one_fan(bp, op, fan_index++);
|
||||
}
|
||||
if (temp_index != 0 && fan_index != 0) {
|
||||
kenvctrld_task = kthread_run(kenvctrld, NULL, "kenvctrld");
|
||||
@@ -597,26 +556,22 @@ static void destroy_one_fan(struct bbc_fan_control *fp)
|
||||
kfree(fp);
|
||||
}
|
||||
|
||||
void bbc_envctrl_cleanup(void)
|
||||
void bbc_envctrl_cleanup(struct bbc_i2c_bus *bp)
|
||||
{
|
||||
struct bbc_cpu_temperature *tp;
|
||||
struct bbc_fan_control *fp;
|
||||
struct bbc_cpu_temperature *tp, *tpos;
|
||||
struct bbc_fan_control *fp, *fpos;
|
||||
|
||||
kthread_stop(kenvctrld_task);
|
||||
|
||||
tp = all_bbc_temps;
|
||||
while (tp != NULL) {
|
||||
struct bbc_cpu_temperature *next = tp->next;
|
||||
list_for_each_entry_safe(tp, tpos, &bp->temps, bp_list) {
|
||||
list_del(&tp->bp_list);
|
||||
list_del(&tp->glob_list);
|
||||
destroy_one_temp(tp);
|
||||
tp = next;
|
||||
}
|
||||
all_bbc_temps = NULL;
|
||||
|
||||
fp = all_bbc_fans;
|
||||
while (fp != NULL) {
|
||||
struct bbc_fan_control *next = fp->next;
|
||||
list_for_each_entry_safe(fp, fpos, &bp->fans, bp_list) {
|
||||
list_del(&fp->bp_list);
|
||||
list_del(&fp->glob_list);
|
||||
destroy_one_fan(fp);
|
||||
fp = next;
|
||||
}
|
||||
all_bbc_fans = NULL;
|
||||
}
|
||||
|
Reference in New Issue
Block a user