Merge branch 'master' into for_paulus
[linux-drm-fsl-dcu.git] / drivers / sbus / char / envctrl.c
index 19e8eddf887a8538325307d135d38883d3dbb08c..2cea4f5d2084b13f85da8114ef554ced2c47b5d9 100644 (file)
  *              Daniele Bellucci <bellucda@tiscali.it>
  */
 
-#define __KERNEL_SYSCALLS__
-static int errno;
-
-#include <linux/config.h>
 #include <linux/module.h>
-#include <linux/sched.h>
+#include <linux/init.h>
 #include <linux/kthread.h>
-#include <linux/errno.h>
 #include <linux/delay.h>
 #include <linux/ioport.h>
-#include <linux/init.h>
 #include <linux/miscdevice.h>
-#include <linux/mm.h>
-#include <linux/slab.h>
-#include <linux/kernel.h>
+#include <linux/kmod.h>
 
 #include <asm/ebus.h>
 #include <asm/uaccess.h>
@@ -713,7 +705,7 @@ envctrl_release(struct inode *inode, struct file *file)
        return 0;
 }
 
-static struct file_operations envctrl_fops = {
+static const struct file_operations envctrl_fops = {
        .owner =                THIS_MODULE,
        .read =                 envctrl_read,
        .unlocked_ioctl =       envctrl_ioctl,
@@ -768,16 +760,14 @@ static void envctrl_set_mon(struct i2c_child_t *pchild,
  *                       decoding tables, monitor type, optional properties.
  * Return: None.
  */
-static void envctrl_init_adc(struct i2c_child_t *pchild, int node)
+static void envctrl_init_adc(struct i2c_child_t *pchild, struct device_node *dp)
 {
-       char chnls_desc[CHANNEL_DESC_SZ];
        int i = 0, len;
-       char *pos = chnls_desc;
+       char *pos;
+       unsigned int *pval;
 
        /* Firmware describe channels into a stream separated by a '\0'. */
-       len = prom_getproperty(node, "channels-description", chnls_desc,
-                              CHANNEL_DESC_SZ);
-       chnls_desc[CHANNEL_DESC_SZ - 1] = '\0';
+       pos = of_get_property(dp, "channels-description", &len);
 
        while (len > 0) {
                int l = strlen(pos) + 1;
@@ -787,10 +777,13 @@ static void envctrl_init_adc(struct i2c_child_t *pchild, int node)
        }
 
        /* Get optional properties. */
-        len = prom_getproperty(node, "warning-temp", (char *)&warning_temperature,
-                              sizeof(warning_temperature));
-        len = prom_getproperty(node, "shutdown-temp", (char *)&shutdown_temperature,
-                              sizeof(shutdown_temperature));
+       pval = of_get_property(dp, "warning-temp", NULL);
+       if (pval)
+               warning_temperature = *pval;
+
+       pval = of_get_property(dp, "shutdown-temp", NULL);
+       if (pval)
+               shutdown_temperature = *pval;
 }
 
 /* Function Description: Initialize child device monitoring fan status.
@@ -864,21 +857,18 @@ static void envctrl_init_voltage_status(struct i2c_child_t *pchild)
 static void envctrl_init_i2c_child(struct linux_ebus_child *edev_child,
                                   struct i2c_child_t *pchild)
 {
-       int node, len, i, tbls_size = 0;
-
-       node = edev_child->prom_node;
+       int len, i, tbls_size = 0;
+       struct device_node *dp = edev_child->prom_node;
+       void *pval;
 
        /* Get device address. */
-       len = prom_getproperty(node, "reg",
-                              (char *) &(pchild->addr),
-                              sizeof(pchild->addr));
+       pval = of_get_property(dp, "reg", &len);
+       memcpy(&pchild->addr, pval, len);
 
        /* Get tables property.  Read firmware temperature tables. */
-       len = prom_getproperty(node, "translation",
-                              (char *) pchild->tblprop_array,
-                              (PCF8584_MAX_CHANNELS *
-                               sizeof(struct pcf8584_tblprop)));
-       if (len > 0) {
+       pval = of_get_property(dp, "translation", &len);
+       if (pval && len > 0) {
+               memcpy(pchild->tblprop_array, pval, len);
                 pchild->total_tbls = len / sizeof(struct pcf8584_tblprop);
                for (i = 0; i < pchild->total_tbls; i++) {
                        if ((pchild->tblprop_array[i].size + pchild->tblprop_array[i].offset) > tbls_size) {
@@ -891,12 +881,12 @@ static void envctrl_init_i2c_child(struct linux_ebus_child *edev_child,
                        printk("envctrl: Failed to allocate table.\n");
                        return;
                }
-                len = prom_getproperty(node, "tables",
-                                      (char *) pchild->tables, tbls_size);
-                if (len <= 0) {
+               pval = of_get_property(dp, "tables", &len);
+                if (!pval || len <= 0) {
                        printk("envctrl: Failed to get table.\n");
                        return;
                }
+               memcpy(pchild->tables, pval, len);
        }
 
        /* SPARCengine ASM Reference Manual (ref. SMI doc 805-7581-04)
@@ -907,12 +897,11 @@ static void envctrl_init_i2c_child(struct linux_ebus_child *edev_child,
         * 'NULL' monitor type.
         */
        if (ENVCTRL_CPCI_IGNORED_NODE == pchild->addr) {
+               struct device_node *root_node;
                int len;
-               char prop[56];
 
-               len = prom_getproperty(prom_root_node, "name", prop, sizeof(prop));
-               if (0 < len && (0 == strncmp(prop, "SUNW,UltraSPARC-IIi-cEngine", len)))
-               {
+               root_node = of_find_node_by_path("/");
+               if (!strcmp(root_node->name, "SUNW,UltraSPARC-IIi-cEngine")) {
                        for (len = 0; len < PCF8584_MAX_CHANNELS; ++len) {
                                pchild->mon_type[len] = ENVCTRL_NOMON;
                        }
@@ -921,16 +910,14 @@ static void envctrl_init_i2c_child(struct linux_ebus_child *edev_child,
        }
 
        /* Get the monitor channels. */
-       len = prom_getproperty(node, "channels-in-use",
-                              (char *) pchild->chnl_array,
-                              (PCF8584_MAX_CHANNELS *
-                               sizeof(struct pcf8584_channel)));
+       pval = of_get_property(dp, "channels-in-use", &len);
+       memcpy(pchild->chnl_array, pval, len);
        pchild->total_chnls = len / sizeof(struct pcf8584_channel);
 
        for (i = 0; i < pchild->total_chnls; i++) {
                switch (pchild->chnl_array[i].type) {
                case PCF8584_TEMP_TYPE:
-                       envctrl_init_adc(pchild, node);
+                       envctrl_init_adc(pchild, dp);
                        break;
 
                case PCF8584_GLOBALADDR_TYPE:
@@ -945,7 +932,7 @@ static void envctrl_init_i2c_child(struct linux_ebus_child *edev_child,
 
                case PCF8584_VOLTAGE_TYPE:
                        if (pchild->i2ctype == I2C_ADC) {
-                               envctrl_init_adc(pchild,node);
+                               envctrl_init_adc(pchild,dp);
                        } else {
                                envctrl_init_voltage_status(pchild);
                        }
@@ -982,13 +969,15 @@ static void envctrl_do_shutdown(void)
                "HOME=/", "TERM=linux", "PATH=/sbin:/usr/sbin:/bin:/usr/bin", NULL };
        char *argv[] = { 
                "/sbin/shutdown", "-h", "now", NULL };  
+       int ret;
 
        if (inprog != 0)
                return;
 
        inprog = 1;
        printk(KERN_CRIT "kenvctrld: WARNING: Shutting down the system now.\n");
-       if (0 > execve("/sbin/shutdown", argv, envp)) {
+       ret = call_usermodehelper("/sbin/shutdown", argv, envp, 0);
+       if (ret < 0) {
                printk(KERN_CRIT "kenvctrld: WARNING: system shutdown failed!\n"); 
                inprog = 0;  /* unlikely to succeed, but we could try again */
        }
@@ -1046,7 +1035,7 @@ static int __init envctrl_init(void)
 
        for_each_ebus(ebus) {
                for_each_ebusdev(edev, ebus) {
-                       if (!strcmp(edev->prom_name, "bbc")) {
+                       if (!strcmp(edev->prom_node->name, "bbc")) {
                                /* If we find a boot-bus controller node,
                                 * then this envctrl driver is not for us.
                                 */
@@ -1060,14 +1049,14 @@ static int __init envctrl_init(void)
         */
        for_each_ebus(ebus) {
                for_each_ebusdev(edev, ebus) {
-                       if (!strcmp(edev->prom_name, "i2c")) {
+                       if (!strcmp(edev->prom_node->name, "i2c")) {
                                i2c = ioremap(edev->resource[0].start, 0x2);
                                for_each_edevchild(edev, edev_child) {
-                                       if (!strcmp("gpio", edev_child->prom_name)) {
+                                       if (!strcmp("gpio", edev_child->prom_node->name)) {
                                                i2c_childlist[i].i2ctype = I2C_GPIO;
                                                envctrl_init_i2c_child(edev_child, &(i2c_childlist[i++]));
                                        }
-                                       if (!strcmp("adc", edev_child->prom_name)) {
+                                       if (!strcmp("adc", edev_child->prom_node->name)) {
                                                i2c_childlist[i].i2ctype = I2C_ADC;
                                                envctrl_init_i2c_child(edev_child, &(i2c_childlist[i++]));
                                        }