diff options
author | Ralf Baechle <ralf@linux-mips.org> | 2000-11-28 03:58:46 +0000 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 2000-11-28 03:58:46 +0000 |
commit | b63ad0882a16a5d28003e57f2b0b81dee3fb322b (patch) | |
tree | 0a343ce219e2b8b38a5d702d66032c57b83d9720 /drivers/sbus | |
parent | a9d7bff9a84dba79609a0002e5321b74c4d64c64 (diff) |
Merge with 2.4.0-test11.
Diffstat (limited to 'drivers/sbus')
-rw-r--r-- | drivers/sbus/char/aurora.c | 19 | ||||
-rw-r--r-- | drivers/sbus/char/bpp.c | 13 | ||||
-rw-r--r-- | drivers/sbus/char/display7seg.c | 15 | ||||
-rw-r--r-- | drivers/sbus/char/envctrl.c | 131 | ||||
-rw-r--r-- | drivers/sbus/char/flash.c | 15 | ||||
-rw-r--r-- | drivers/sbus/char/openprom.c | 13 | ||||
-rw-r--r-- | drivers/sbus/char/sab82532.c | 5 | ||||
-rw-r--r-- | drivers/sbus/char/su.c | 5 | ||||
-rw-r--r-- | drivers/sbus/char/uctrl.c | 16 | ||||
-rw-r--r-- | drivers/sbus/sbus.c | 29 |
10 files changed, 160 insertions, 101 deletions
diff --git a/drivers/sbus/char/aurora.c b/drivers/sbus/char/aurora.c index 44566c0a9..f2ee5ccc3 100644 --- a/drivers/sbus/char/aurora.c +++ b/drivers/sbus/char/aurora.c @@ -1,4 +1,4 @@ -/* $Id: aurora.c,v 1.7 1999/09/21 14:37:46 davem Exp $ +/* $Id: aurora.c,v 1.9 2000/11/08 05:33:03 davem Exp $ * linux/drivers/sbus/char/aurora.c -- Aurora multiport driver * * Copyright (c) 1999 by Oliver Aldulea (oli@bv.ro) @@ -2387,7 +2387,6 @@ static void aurora_release_drivers(void) #endif } -#ifndef MODULE /* * Called at boot time. * @@ -2406,10 +2405,7 @@ void __init aurora_setup(char *str, int *ints) } } -int __init aurora_init(void) -#else -int aurora_init(void) -#endif +static int __init aurora_real_init(void) { int found; int i; @@ -2439,7 +2435,6 @@ int aurora_init(void) return 0; } -#ifdef MODULE int irq = 0; int irq1 = 0; int irq2 = 0; @@ -2449,16 +2444,16 @@ MODULE_PARM(irq1, "i"); MODULE_PARM(irq2, "i"); MODULE_PARM(irq3, "i"); -int init_module(void) +static int __init aurora_init(void) { if (irq ) irqs[0]=irq ; if (irq1) irqs[1]=irq1; if (irq2) irqs[2]=irq2; if (irq3) irqs[3]=irq3; - return aurora_init(); + return aurora_real_init(); } -void cleanup_module(void) +static void __exit aurora_cleanup(void) { int i; @@ -2473,4 +2468,6 @@ printk("cleanup_module: aurora_release_drivers\n"); aurora_release_io_range(&aurora_board[i]); } } -#endif /* MODULE */ + +module_init(aurora_init); +module_exit(aurora_cleanup); diff --git a/drivers/sbus/char/bpp.c b/drivers/sbus/char/bpp.c index 4579404e3..c96a141a5 100644 --- a/drivers/sbus/char/bpp.c +++ b/drivers/sbus/char/bpp.c @@ -1017,11 +1017,7 @@ static inline void freeLptPort(int idx) static devfs_handle_t devfs_handle; -#ifdef MODULE -int init_module(void) -#else -int __init bpp_init(void) -#endif +static int __init bpp_init(void) { int rc; unsigned idx; @@ -1046,8 +1042,7 @@ int __init bpp_init(void) return 0; } -#ifdef MODULE -void cleanup_module(void) +static void __exit bpp_cleanup(void) { unsigned idx; @@ -1059,4 +1054,6 @@ void cleanup_module(void) freeLptPort(idx); } } -#endif + +module_init(bpp_init); +module_exit(bpp_cleanup); diff --git a/drivers/sbus/char/display7seg.c b/drivers/sbus/char/display7seg.c index 2ee0aee37..091152a1c 100644 --- a/drivers/sbus/char/display7seg.c +++ b/drivers/sbus/char/display7seg.c @@ -1,4 +1,4 @@ -/* $Id: display7seg.c,v 1.3 2000/08/29 07:01:55 davem Exp $ +/* $Id: display7seg.c,v 1.4 2000/11/08 05:08:23 davem Exp $ * * display7seg - Driver implementation for the 7-segment display * present on Sun Microsystems CP1400 and CP1500 @@ -172,11 +172,7 @@ static struct file_operations d7s_fops = { static struct miscdevice d7s_miscdev = { D7S_MINOR, D7S_DEVNAME, &d7s_fops }; -#ifdef MODULE -int init_module(void) -#else -int __init d7s_init(void) -#endif +static int __init d7s_init(void) { struct linux_ebus *ebus = NULL; struct linux_ebus_device *edev = NULL; @@ -222,8 +218,7 @@ ebus_done: return 0; } -#ifdef MODULE -void cleanup_module(void) +static void __exit d7s_cleanup(void) { int regs = readb(d7s_regs); @@ -237,4 +232,6 @@ void cleanup_module(void) misc_deregister(&d7s_miscdev); d7s_free(); } -#endif + +module_init(d7s_init); +module_exit(d7s_cleanup); diff --git a/drivers/sbus/char/envctrl.c b/drivers/sbus/char/envctrl.c index 31c9de932..e1de7a680 100644 --- a/drivers/sbus/char/envctrl.c +++ b/drivers/sbus/char/envctrl.c @@ -1,4 +1,4 @@ -/* $Id: envctrl.c,v 1.18 2000/10/17 16:20:35 davem Exp $ +/* $Id: envctrl.c,v 1.19 2000/11/03 00:37:40 davem Exp $ * envctrl.c: Temperature and Fan monitoring on Machines providing it. * * Copyright (C) 1998 Eddie C. Dost (ecd@skynet.be) @@ -11,7 +11,9 @@ * http://www-eu2.semiconductors.com/pip/PCF8584P * http://www-eu2.semiconductors.com/pip/PCF8574AP * http://www-eu2.semiconductors.com/pip/PCF8591P - * + * + * EB - Added support for CP1500 Global Address and PS/Voltage monitoring. + * Eric Brower <ebrower@usa.net> */ #include <linux/config.h> @@ -72,15 +74,16 @@ * Firmware definitions. */ #define PCF8584_MAX_CHANNELS 8 +#define PCF8584_GLOBALADDR_TYPE 6 /* global address monitor */ #define PCF8584_FANSTAT_TYPE 3 /* fan status monitor */ #define PCF8584_VOLTAGE_TYPE 2 /* voltage monitor */ -#define PCF8584_TEMP_TYPE 1 /* temperature monitor*/ +#define PCF8584_TEMP_TYPE 1 /* temperature monitor*/ /* Monitor type of i2c child device. * Driver definitions. */ -#define ENVCTRL_NOMON 0 -#define ENVCTRL_CPUTEMP_MON 1 /* cpu temperature monitor */ +#define ENVCTRL_NOMON 0 +#define ENVCTRL_CPUTEMP_MON 1 /* cpu temperature monitor */ #define ENVCTRL_CPUVOLTAGE_MON 2 /* voltage monitor */ #define ENVCTRL_FANSTAT_MON 3 /* fan status monitor */ #define ENVCTRL_ETHERTEMP_MON 4 /* ethernet temperarture */ @@ -88,6 +91,7 @@ #define ENVCTRL_VOLTAGESTAT_MON 5 /* voltage status monitor */ #define ENVCTRL_MTHRBDTEMP_MON 6 /* motherboard temperature */ #define ENVCTRL_SCSITEMP_MON 7 /* scsi temperarture */ +#define ENVCTRL_GLOBALADDR_MON 8 /* global address */ /* Child device type. * Driver definitions. @@ -109,6 +113,15 @@ #define ENVCTRL_MAX_CPU 4 #define CHANNEL_DESC_SZ 256 +/* Mask values for combined GlobalAddress/PowerStatus node */ +#define ENVCTRL_GLOBALADDR_ADDR_MASK 0x1F +#define ENVCTRL_GLOBALADDR_PSTAT_MASK 0x60 + +/* Node 0x70 ignored on CompactPCI CP1400/1500 platforms + * (see envctrl_init_i2c_child) + */ +#define ENVCTRL_CPCI_IGNORED_NODE 0x70 + struct pcf8584_reg { unsigned char data; unsigned char csr; @@ -317,7 +330,6 @@ static unsigned char envctrl_i2c_read_8574(unsigned char addr) /* Do a single byte read and send stop. */ rd = envctrl_i2c_read_data(); envctrl_i2c_stop(); - return rd; } @@ -462,7 +474,32 @@ static int envctrl_i2c_fan_status(struct i2c_child_t *pchild, return 1; } -/* Function Description: Read voltage and power supply status. +/* Function Description: Read global addressing line. + * Return : Always 1 byte. Status stored in bufdata. + */ +static int envctrl_i2c_globaladdr(struct i2c_child_t *pchild, + unsigned char data, + char *bufdata) +{ + /* Translatation table is not necessary, as global + * addr is the integer value of the GA# bits. + * + * NOTE: MSB is documented as zero, but I see it as '1' always.... + * + * ----------------------------------------------- + * | 0 | FAL | DEG | GA4 | GA3 | GA2 | GA1 | GA0 | + * ----------------------------------------------- + * GA0 - GA4 integer value of Global Address (backplane slot#) + * DEG 0 = cPCI Power supply output is starting to degrade + * 1 = cPCI Power supply output is OK + * FAL 0 = cPCI Power supply has failed + * 1 = cPCI Power supply output is OK + */ + bufdata[0] = (data & ENVCTRL_GLOBALADDR_ADDR_MASK); + return 1; +} + +/* Function Description: Read standard voltage and power supply status. * Return : Always 1 byte. Status stored in bufdata. */ static unsigned char envctrl_i2c_voltage_status(struct i2c_child_t *pchild, @@ -587,10 +624,20 @@ envctrl_read(struct file *file, char *buf, size_t count, loff_t *ppos) ret = envctrl_i2c_fan_status(pchild,data[0], data); copy_to_user((unsigned char *)buf, data, ret); break; + + case ENVCTRL_RD_GLOBALADDRESS: + if (!(pchild = envctrl_get_i2c_child(ENVCTRL_GLOBALADDR_MON))) + return 0; + data[0] = envctrl_i2c_read_8574(pchild->addr); + ret = envctrl_i2c_globaladdr(pchild, data[0], data); + copy_to_user((unsigned char *)buf, data, ret); + break; case ENVCTRL_RD_VOLTAGE_STATUS: if (!(pchild = envctrl_get_i2c_child(ENVCTRL_VOLTAGESTAT_MON))) - return 0; + /* If voltage monitor not present, check for CPCI equivalent */ + if (!(pchild = envctrl_get_i2c_child(ENVCTRL_GLOBALADDR_MON))) + return 0; data[0] = envctrl_i2c_read_8574(pchild->addr); ret = envctrl_i2c_voltage_status(pchild, data[0], data); copy_to_user((unsigned char *)buf, data, ret); @@ -621,6 +668,7 @@ envctrl_ioctl(struct inode *inode, struct file *file, case ENVCTRL_RD_VOLTAGE_STATUS: case ENVCTRL_RD_ETHERNET_TEMPERATURE: case ENVCTRL_RD_SCSI_TEMPERATURE: + case ENVCTRL_RD_GLOBALADDRESS: file->private_data = (void *)(long)cmd; break; @@ -714,9 +762,6 @@ static void envctrl_set_mon(struct i2c_child_t *pchild, if (!(strcmp(chnl_desc,"temp,ethernet"))) pchild->mon_type[chnl_no] = ENVCTRL_ETHERTEMP_MON; - - if (!(strcmp(chnl_desc,"temp,ethernet"))) - pchild->mon_type[chnl_no] = ENVCTRL_ETHERTEMP_MON; } /* Function Description: Initialize monitor channel with channel desc, @@ -770,6 +815,39 @@ static void envctrl_init_fanstat(struct i2c_child_t *pchild) pchild->mon_type[0] = ENVCTRL_FANSTAT_MON; } +/* Function Description: Initialize child device for global addressing line. + * Return: None. + */ +static void envctrl_init_globaladdr(struct i2c_child_t *pchild) +{ + int i; + + /* Voltage/PowerSupply monitoring is piggybacked + * with Global Address on CompactPCI. See comments + * within envctrl_i2c_globaladdr for bit assignments. + * + * The mask is created here by assigning mask bits to each + * bit position that represents PCF8584_VOLTAGE_TYPE data. + * Channel numbers are not consecutive within the globaladdr + * node (why?), so we use the actual counter value as chnls_mask + * index instead of the chnl_array[x].chnl_no value. + * + * NOTE: This loop could be replaced with a constant representing + * a mask of bits 5&6 (ENVCTRL_GLOBALADDR_PSTAT_MASK). + */ + for (i = 0; i < pchild->total_chnls; i++) { + if (PCF8584_VOLTAGE_TYPE == pchild->chnl_array[i].type) { + pchild->voltage_mask |= chnls_mask[i]; + } + } + + /* We only need to know if this child has global addressing + * line monitored. We dont care which channels since we know + * the mask already (ENVCTRL_GLOBALADDR_ADDR_MASK). + */ + pchild->mon_type[0] = ENVCTRL_GLOBALADDR_MON; +} + /* Initialize child device monitoring voltage status. */ static void envctrl_init_voltage_status(struct i2c_child_t *pchild) { @@ -822,6 +900,27 @@ static void envctrl_init_i2c_child(struct linux_ebus_child *edev_child, } } + /* SPARCengine ASM Reference Manual (ref. SMI doc 805-7581-04) + * sections 2.5, 3.5, 4.5 state node 0x70 for CP1400/1500 is + * "For Factory Use Only." + * + * We ignore the node on these platforms by assigning the + * 'NULL' monitor type. + */ + if (ENVCTRL_CPCI_IGNORED_NODE == pchild->addr) { + 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))) + { + for (len = 0; len < PCF8584_MAX_CHANNELS; ++len) { + pchild->mon_type[len] = ENVCTRL_NOMON; + } + return; + } + } + /* Get the monitor channels. */ len = prom_getproperty(node, "channels-in-use", (char *) pchild->chnl_array, @@ -835,6 +934,11 @@ static void envctrl_init_i2c_child(struct linux_ebus_child *edev_child, envctrl_init_adc(pchild, node); break; + case PCF8584_GLOBALADDR_TYPE: + envctrl_init_globaladdr(pchild); + i = pchild->total_chnls; + break; + case PCF8584_FANSTAT_TYPE: envctrl_init_fanstat(pchild); i = pchild->total_chnls; @@ -865,7 +969,7 @@ static struct i2c_child_t *envctrl_get_i2c_child(unsigned char mon_type) for (i = 0; i < ENVCTRL_MAX_CPU*2; i++) { for (j = 0; j < PCF8584_MAX_CHANNELS; j++) { if (i2c_childlist[i].mon_type[j] == mon_type) { - return (struct i2c_child_t*)(&(i2c_childlist[i])); + return (struct i2c_child_t *)(&(i2c_childlist[i])); } } } @@ -932,8 +1036,7 @@ done: * child devices. */ printk("envctrl: initialized "); - for(--i; i >= 0; --i) - { + for (--i; i >= 0; --i) { printk("[%s 0x%lx]%s", (I2C_ADC == i2c_childlist[i].i2ctype) ? ("adc") : ((I2C_GPIO == i2c_childlist[i].i2ctype) ? ("gpio") : ("unknown")), diff --git a/drivers/sbus/char/flash.c b/drivers/sbus/char/flash.c index 8690638b3..71809b59d 100644 --- a/drivers/sbus/char/flash.c +++ b/drivers/sbus/char/flash.c @@ -1,4 +1,4 @@ -/* $Id: flash.c,v 1.19 2000/07/13 08:06:40 davem Exp $ +/* $Id: flash.c,v 1.20 2000/11/08 04:57:49 davem Exp $ * flash.c: Allow mmap access to the OBP Flash, for OBP updates. * * Copyright (C) 1997 Eddie C. Dost (ecd@skynet.be) @@ -149,11 +149,7 @@ static struct miscdevice flash_dev = { FLASH_MINOR, "flash", &flash_fops }; EXPORT_NO_SYMBOLS; -#ifdef MODULE -int init_module(void) -#else -int __init flash_init(void) -#endif +static int __init flash_init(void) { struct sbus_bus *sbus; struct sbus_dev *sdev = 0; @@ -236,9 +232,10 @@ int __init flash_init(void) return 0; } -#ifdef MODULE -void cleanup_module(void) +static void __exit flash_cleanup(void) { misc_deregister(&flash_dev); } -#endif + +module_init(flash_init); +module_exit(flash_cleanup); diff --git a/drivers/sbus/char/openprom.c b/drivers/sbus/char/openprom.c index 26e5ae8d9..f565ef6d2 100644 --- a/drivers/sbus/char/openprom.c +++ b/drivers/sbus/char/openprom.c @@ -626,11 +626,7 @@ static struct miscdevice openprom_dev = { EXPORT_NO_SYMBOLS; -#ifdef MODULE -int init_module(void) -#else -int __init openprom_init(void) -#endif +static int __init openprom_init(void) { unsigned long flags; int error; @@ -655,9 +651,10 @@ int __init openprom_init(void) return 0; } -#ifdef MODULE -void cleanup_module(void) +static void __exit openprom_cleanup(void) { misc_deregister(&openprom_dev); } -#endif + +module_init(openprom_init); +module_exit(openprom_cleanup); diff --git a/drivers/sbus/char/sab82532.c b/drivers/sbus/char/sab82532.c index ae7ba7ac1..fa5f383c3 100644 --- a/drivers/sbus/char/sab82532.c +++ b/drivers/sbus/char/sab82532.c @@ -1,4 +1,4 @@ -/* $Id: sab82532.c,v 1.52 2000/10/14 10:09:04 davem Exp $ +/* $Id: sab82532.c,v 1.53 2000/11/15 07:28:09 davem Exp $ * sab82532.c: ASYNC Driver for the SIEMENS SAB82532 DUSCC. * * Copyright (C) 1997 Eddie C. Dost (ecd@skynet.be) @@ -1833,6 +1833,7 @@ static int block_til_ready(struct tty_struct *tty, struct file * filp, #endif schedule(); } + current->state = TASK_RUNNING; remove_wait_queue(&info->open_wait, &wait); if (!tty_hung_up_p(filp)) info->count++; @@ -2133,7 +2134,7 @@ static void __init sab82532_kgdb_hook(int line) static inline void __init show_serial_version(void) { - char *revision = "$Revision: 1.52 $"; + char *revision = "$Revision: 1.53 $"; char *version, *p; version = strchr(revision, ' '); diff --git a/drivers/sbus/char/su.c b/drivers/sbus/char/su.c index 1fd2d6fbf..bb256e46e 100644 --- a/drivers/sbus/char/su.c +++ b/drivers/sbus/char/su.c @@ -1,4 +1,4 @@ -/* $Id: su.c,v 1.42 2000/10/14 10:09:04 davem Exp $ +/* $Id: su.c,v 1.43 2000/11/15 07:28:09 davem Exp $ * su.c: Small serial driver for keyboard/mouse interface on sparc32/PCI * * Copyright (C) 1997 Eddie C. Dost (ecd@skynet.be) @@ -2001,6 +2001,7 @@ block_til_ready(struct tty_struct *tty, struct file * filp, #endif schedule(); } + current->state = TASK_RUNNING; remove_wait_queue(&info->open_wait, &wait); if (extra_count) info->count++; @@ -2219,7 +2220,7 @@ done: */ static __inline__ void __init show_su_version(void) { - char *revision = "$Revision: 1.42 $"; + char *revision = "$Revision: 1.43 $"; char *version, *p; version = strchr(revision, ' '); diff --git a/drivers/sbus/char/uctrl.c b/drivers/sbus/char/uctrl.c index 6294d0e37..2740c62f3 100644 --- a/drivers/sbus/char/uctrl.c +++ b/drivers/sbus/char/uctrl.c @@ -1,4 +1,4 @@ -/* $Id: uctrl.c,v 1.8 2000/06/19 06:24:47 davem Exp $ +/* $Id: uctrl.c,v 1.9 2000/11/08 05:04:06 davem Exp $ * uctrl.c: TS102 Microcontroller interface on Tadpole Sparcbook 3 * * Copyright 1999 Derrick J Brashear (shadow@dementia.org) @@ -363,11 +363,7 @@ void uctrl_get_external_status() } -#ifdef MODULE -int init_module(void) -#else -int __init ts102_uctrl_init(void) -#endif +static int __init ts102_uctrl_init(void) { struct uctrl_driver *driver = &drv; int len, i; @@ -419,9 +415,7 @@ int __init ts102_uctrl_init(void) return 0; } - -#ifdef MODULE -void cleanup_module(void) +static void __exit ts102_uctrl_cleanup(void) { struct uctrl_driver *driver = &drv; @@ -433,4 +427,6 @@ void cleanup_module(void) if (driver->regs) driver->regs = 0; } -#endif + +module_init(ts102_uctrl_init); +module_exit(ts102_uctrl_cleanup); diff --git a/drivers/sbus/sbus.c b/drivers/sbus/sbus.c index 35865dd70..942a6c59b 100644 --- a/drivers/sbus/sbus.c +++ b/drivers/sbus/sbus.c @@ -1,4 +1,4 @@ -/* $Id: sbus.c,v 1.86 2000/03/16 09:23:57 jj Exp $ +/* $Id: sbus.c,v 1.91 2000/11/08 05:04:06 davem Exp $ * sbus.c: SBus support routines. * * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) @@ -165,21 +165,9 @@ no_ranges: extern void iommu_init(int iommu_node, struct sbus_bus *sbus); extern void iounit_init(int sbi_node, int iounit_node, struct sbus_bus *sbus); void sun4_init(void); -#ifdef CONFIG_SUN_OPENPROMIO -extern int openprom_init(void); -#endif #ifdef CONFIG_SUN_AUXIO extern void auxio_probe(void); #endif -#ifdef CONFIG_OBP_FLASH -extern int flash_init(void); -#endif -#ifdef CONFIG_SUN_AURORA -extern int aurora_init(void); -#endif -#ifdef CONFIG_TADPOLE_TS102_UCTRL -extern int ts102_uctrl_init(void); -#endif static void __init sbus_do_child_siblings(int start_node, struct sbus_dev *child, @@ -520,25 +508,10 @@ void __init sbus_init(void) firetruck_init(); } #endif -#ifdef CONFIG_SUN_OPENPROMIO - openprom_init(); -#endif -#ifdef CONFIG_SUN_BPP - bpp_init(); -#endif #ifdef CONFIG_SUN_AUXIO if (sparc_cpu_model == sun4u) auxio_probe (); #endif -#ifdef CONFIG_OBP_FLASH - flash_init(); -#endif -#ifdef CONFIG_SUN_AURORA - aurora_init(); -#endif -#ifdef CONFIG_TADPOLE_TS102_UCTRL - ts102_uctrl_init(); -#endif #ifdef __sparc_v9__ if (sparc_cpu_model == sun4u) { extern void clock_probe(void); |