X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=drivers%2Fsbus%2Fchar%2Fenvctrl.c;fp=drivers%2Fsbus%2Fchar%2Fenvctrl.c;h=19e8eddf887a8538325307d135d38883d3dbb08c;hb=64ba3f394c830ec48a1c31b53dcae312c56f1604;hp=063e676a3ac046e5de17809cce433ca281b21dd5;hpb=be1e6109ac94a859551f8e1774eb9a8469fe055c;p=linux-2.6.git diff --git a/drivers/sbus/char/envctrl.c b/drivers/sbus/char/envctrl.c index 063e676a3..19e8eddf8 100644 --- a/drivers/sbus/char/envctrl.c +++ b/drivers/sbus/char/envctrl.c @@ -22,6 +22,7 @@ #define __KERNEL_SYSCALLS__ static int errno; +#include #include #include #include @@ -767,14 +768,16 @@ 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, struct device_node *dp) +static void envctrl_init_adc(struct i2c_child_t *pchild, int node) { + char chnls_desc[CHANNEL_DESC_SZ]; int i = 0, len; - char *pos; - unsigned int *pval; + char *pos = chnls_desc; /* Firmware describe channels into a stream separated by a '\0'. */ - pos = of_get_property(dp, "channels-description", &len); + len = prom_getproperty(node, "channels-description", chnls_desc, + CHANNEL_DESC_SZ); + chnls_desc[CHANNEL_DESC_SZ - 1] = '\0'; while (len > 0) { int l = strlen(pos) + 1; @@ -784,13 +787,10 @@ static void envctrl_init_adc(struct i2c_child_t *pchild, struct device_node *dp) } /* Get optional properties. */ - 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; + len = prom_getproperty(node, "warning-temp", (char *)&warning_temperature, + sizeof(warning_temperature)); + len = prom_getproperty(node, "shutdown-temp", (char *)&shutdown_temperature, + sizeof(shutdown_temperature)); } /* Function Description: Initialize child device monitoring fan status. @@ -864,18 +864,21 @@ 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 len, i, tbls_size = 0; - struct device_node *dp = edev_child->prom_node; - void *pval; + int node, len, i, tbls_size = 0; + + node = edev_child->prom_node; /* Get device address. */ - pval = of_get_property(dp, "reg", &len); - memcpy(&pchild->addr, pval, len); + len = prom_getproperty(node, "reg", + (char *) &(pchild->addr), + sizeof(pchild->addr)); /* Get tables property. Read firmware temperature tables. */ - pval = of_get_property(dp, "translation", &len); - if (pval && len > 0) { - memcpy(pchild->tblprop_array, pval, len); + len = prom_getproperty(node, "translation", + (char *) pchild->tblprop_array, + (PCF8584_MAX_CHANNELS * + sizeof(struct pcf8584_tblprop))); + if (len > 0) { 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) { @@ -888,12 +891,12 @@ static void envctrl_init_i2c_child(struct linux_ebus_child *edev_child, printk("envctrl: Failed to allocate table.\n"); return; } - pval = of_get_property(dp, "tables", &len); - if (!pval || len <= 0) { + len = prom_getproperty(node, "tables", + (char *) pchild->tables, tbls_size); + if (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) @@ -904,11 +907,12 @@ 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]; - root_node = of_find_node_by_path("/"); - if (!strcmp(root_node->name, "SUNW,UltraSPARC-IIi-cEngine")) { + len = prom_getproperty(prom_root_node, "name", prop, sizeof(prop)); + if (0 < len && (0 == strncmp(prop, "SUNW,UltraSPARC-IIi-cEngine", len))) + { for (len = 0; len < PCF8584_MAX_CHANNELS; ++len) { pchild->mon_type[len] = ENVCTRL_NOMON; } @@ -917,14 +921,16 @@ static void envctrl_init_i2c_child(struct linux_ebus_child *edev_child, } /* Get the monitor channels. */ - pval = of_get_property(dp, "channels-in-use", &len); - memcpy(pchild->chnl_array, pval, len); + len = prom_getproperty(node, "channels-in-use", + (char *) pchild->chnl_array, + (PCF8584_MAX_CHANNELS * + sizeof(struct pcf8584_channel))); 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, dp); + envctrl_init_adc(pchild, node); break; case PCF8584_GLOBALADDR_TYPE: @@ -939,7 +945,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,dp); + envctrl_init_adc(pchild,node); } else { envctrl_init_voltage_status(pchild); } @@ -1040,7 +1046,7 @@ static int __init envctrl_init(void) for_each_ebus(ebus) { for_each_ebusdev(edev, ebus) { - if (!strcmp(edev->prom_node->name, "bbc")) { + if (!strcmp(edev->prom_name, "bbc")) { /* If we find a boot-bus controller node, * then this envctrl driver is not for us. */ @@ -1054,14 +1060,14 @@ static int __init envctrl_init(void) */ for_each_ebus(ebus) { for_each_ebusdev(edev, ebus) { - if (!strcmp(edev->prom_node->name, "i2c")) { + if (!strcmp(edev->prom_name, "i2c")) { i2c = ioremap(edev->resource[0].start, 0x2); for_each_edevchild(edev, edev_child) { - if (!strcmp("gpio", edev_child->prom_node->name)) { + if (!strcmp("gpio", edev_child->prom_name)) { i2c_childlist[i].i2ctype = I2C_GPIO; envctrl_init_i2c_child(edev_child, &(i2c_childlist[i++])); } - if (!strcmp("adc", edev_child->prom_node->name)) { + if (!strcmp("adc", edev_child->prom_name)) { i2c_childlist[i].i2ctype = I2C_ADC; envctrl_init_i2c_child(edev_child, &(i2c_childlist[i++])); }