Commit 67c8a662 authored by Christoph Hellwig's avatar Christoph Hellwig

[PATCH] make i2c use initcalls everywhere

The use of explicit initializers all over the i2c core anoyed for
long, but the lm_sensors merge with two new files just for initializers
was too much.  Conver all of i2c to sane initialization (mostly
initcall, but some driver also got other cleanups in that area)
parent d360ab81
......@@ -38,8 +38,6 @@ obj-$(CONFIG_GAMEPORT) += input/gameport/
obj-$(CONFIG_SERIO) += input/serio/
obj-$(CONFIG_I2O) += message/
obj-$(CONFIG_I2C) += i2c/
obj-$(CONFIG_I2C_MAINBOARD) += i2c/busses/
obj-$(CONFIG_SENSORS) += i2c/chips/
obj-$(CONFIG_PHONE) += telephony/
obj-$(CONFIG_MD) += md/
obj-$(CONFIG_BT) += bluetooth/
......
......@@ -27,15 +27,6 @@
#include <asm/io.h>
#include <asm/pgalloc.h>
#ifdef CONFIG_I2C_MAINBOARD
extern void i2c_mainboard_init_all(void);
#endif
#ifdef CONFIG_SENSORS
extern void sensors_init_all(void);
#endif
#ifdef CONFIG_I2C
extern int i2c_init_all(void);
#endif
#ifdef CONFIG_FB
extern void fbmem_init(void);
#endif
......@@ -708,12 +699,6 @@ int __init chr_dev_init(void)
printk("unable to get major %d for memory devs\n", MEM_MAJOR);
memory_devfs_register();
rand_initialize();
#ifdef CONFIG_I2C
i2c_init_all();
#endif
#ifdef CONFIG_I2C_MAINBOARD
i2c_mainboard_init_all();
#endif
#if defined (CONFIG_FB)
fbmem_init();
#endif
......@@ -728,10 +713,6 @@ int __init chr_dev_init(void)
#if defined(CONFIG_S390_TAPE) && defined(CONFIG_S390_TAPE_CHAR)
tapechar_init();
#endif
#ifdef CONFIG_SENSORS
sensors_init_all();
#endif
return 0;
}
......
......@@ -166,8 +166,6 @@ config I2C_IBM_OCP_ADAP
tristate "IBM on-chip I2C Adapter"
depends on I2C_IBM_OCP_ALGO
# This is needed for automatic patch generation: sensors code starts here
# This is needed for automatic patch generation: sensors code ends here
config I2C_CHARDEV
tristate "I2C device interface"
depends on I2C
......
......@@ -18,6 +18,4 @@ obj-$(CONFIG_ITE_I2C_ADAP) += i2c-adap-ite.o
obj-$(CONFIG_SCx200_I2C) += scx200_i2c.o
obj-$(CONFIG_SCx200_ACB) += scx200_acb.o
obj-$(CONFIG_I2C_PROC) += i2c-proc.o
# This is needed for automatic patch generation: sensors code starts here
# This is needed for automatic patch generation: sensors code ends here
obj-y += busses/ chips/
......@@ -5,22 +5,8 @@
menu "I2C Hardware Sensors Mainboard support"
config I2C_MAINBOARD
bool "Hardware sensors mainboard support"
depends on EXPERIMENTAL && I2C && I2C_PROC
help
Many modern mainboards have some kind of I2C interface integrated. This
is often in the form of a SMBus, or System Management Bus, which is
basically the same as I2C but which uses only a subset of the I2C
protocol.
You will also want the latest user-space utilties: you can find them
in the lm_sensors package, which you can download at
http://www.lm-sensors.nu
config I2C_AMD756
tristate " AMD 756/766"
depends on I2C_MAINBOARD
help
If you say yes to this option, support will be included for the AMD
756/766/768 mainboard I2C interfaces.
......@@ -37,7 +23,6 @@ config I2C_AMD756
config I2C_AMD8111
tristate " AMD 8111"
depends on I2C_MAINBOARD
help
If you say yes to this option, support will be included for the AMD
8111 mainboard I2C interfaces.
......
......@@ -2,6 +2,5 @@
# Makefile for the kernel hardware sensors bus drivers.
#
obj-$(CONFIG_I2C_MAINBOARD) += i2c-mainboard.o
obj-$(CONFIG_I2C_AMD756) += i2c-amd756.o
obj-$(CONFIG_I2C_AMD8111) += i2c-amd8111.o
/*
i2c-mainboard.c - Part of lm_sensors, Linux kernel modules for hardware
monitoring
Copyright (c) 1998, 1999 Frodo Looijaard <frodol@dds.nl>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/* Not configurable as a module */
#include <linux/init.h>
extern int i2c_amd756_init(void);
int __init i2c_mainboard_init_all(void)
{
#ifdef CONFIG_I2C_AMD756
i2c_amd756_init();
#endif
return 0;
}
......@@ -5,22 +5,8 @@
menu "I2C Hardware Sensors Chip support"
config SENSORS
bool "Hardware sensors chip support"
depends on EXPERIMENTAL && I2C && I2C_PROC
help
Many modern mainboards have some kind of I2C interface integrated.
This is often in the form of a SMBus, or System Management Bus, which
is basically the same as I2C but which uses only a subset of the I2C
protocol.
You will also want the latest user-space utilties: you can find them
in the lm_sensors package, which you can download at
http://www.lm-sensors.nu
config SENSORS_ADM1021
tristate " Analog Devices ADM1021 and compatibles"
depends on SENSORS
help
If you say yes here you get support for Analog Devices ADM1021
and ADM1023 sensor chips and clones: Maxim MAX1617 and MAX1617A,
......@@ -37,7 +23,6 @@ config SENSORS_ADM1021
config SENSORS_LM75
tristate " National Semiconductors LM75 and compatibles"
depends on SENSORS
help
If you say yes here you get support for National Semiconductor LM75
sensor chips and clones: Dallas Semi DS75 and DS1775, TelCon
......@@ -51,4 +36,3 @@ config SENSORS_LM75
http://www.lm-sensors.nu
endmenu
......@@ -2,6 +2,5 @@
# Makefile for the kernel hardware sensors chip drivers.
#
obj-$(CONFIG_SENSORS) += sensors.o
obj-$(CONFIG_SENSORS_ADM1021) += adm1021.o
obj-$(CONFIG_SENSORS_LM75) += lm75.o
......@@ -26,7 +26,6 @@
#include <linux/sensors.h>
#include <linux/init.h>
MODULE_LICENSE("GPL");
/* Addresses to scan */
static unsigned short normal_i2c[] = { SENSORS_I2C_END };
......@@ -108,10 +107,6 @@ struct adm1021_data {
remote_temp_offset, remote_temp_offset_prec;
};
int __init sensors_adm1021_init(void);
void __exit sensors_adm1021_exit(void);
static int adm1021_cleanup(void);
static int adm1021_attach_adapter(struct i2c_adapter *adapter);
static int adm1021_detect(struct i2c_adapter *adapter, int address,
unsigned short flags, int kind);
......@@ -178,9 +173,6 @@ static ctl_table adm1021_max_dir_table_template[] = {
{0}
};
/* Used by init/cleanup */
static int __initdata adm1021_initialized = 0;
/* I choose here for semi-static allocation. Complete dynamic
allocation could also be used; the code needed for this would probably
take more memory than the datastructure takes now. */
......@@ -585,46 +577,21 @@ void adm1021_alarms(struct i2c_client *client, int operation, int ctl_name,
}
}
int __init sensors_adm1021_init(void)
static int __init sensors_adm1021_init(void)
{
int res;
printk("adm1021.o version %s (%s)\n", LM_VERSION, LM_DATE);
adm1021_initialized = 0;
if ((res = i2c_add_driver(&adm1021_driver))) {
printk
("adm1021.o: Driver registration failed, module not inserted.\n");
adm1021_cleanup();
return res;
}
adm1021_initialized++;
return 0;
return i2c_add_driver(&adm1021_driver);
}
void __exit sensors_adm1021_exit(void)
static void __exit sensors_adm1021_exit(void)
{
adm1021_cleanup();
}
static int adm1021_cleanup(void)
{
int res;
if (adm1021_initialized >= 1) {
if ((res = i2c_del_driver(&adm1021_driver))) {
printk
("adm1021.o: Driver deregistration failed, module not removed.\n");
return res;
}
adm1021_initialized--;
}
return 0;
i2c_del_driver(&adm1021_driver);
}
MODULE_AUTHOR
("Frodo Looijaard <frodol@dds.nl> and Philip Edelbrock <phil@netroedge.com>");
MODULE_DESCRIPTION("adm1021 driver");
MODULE_LICENSE("GPL");
MODULE_PARM(read_only, "i");
MODULE_PARM_DESC(read_only, "Don't set any values, read only mode");
......
......@@ -25,7 +25,6 @@
#include <linux/sensors.h>
#include <linux/init.h>
MODULE_LICENSE("GPL");
/* Addresses to scan */
static unsigned short normal_i2c[] = { SENSORS_I2C_END };
......@@ -66,10 +65,6 @@ struct lm75_data {
u16 temp, temp_os, temp_hyst; /* Register values */
};
int __init sensors_lm75_init(void);
void __exit sensors_lm75_exit(void);
static int lm75_cleanup(void);
static int lm75_attach_adapter(struct i2c_adapter *adapter);
static int lm75_detect(struct i2c_adapter *adapter, int address,
unsigned short flags, int kind);
......@@ -110,9 +105,6 @@ static ctl_table lm75_dir_table_template[] = {
{0}
};
/* Used by init/cleanup */
static int __initdata lm75_initialized = 0;
static int lm75_id = 0;
int lm75_attach_adapter(struct i2c_adapter *adapter)
......@@ -188,10 +180,7 @@ int lm75_detect(struct i2c_adapter *adapter, int address,
type_name = "lm75";
client_name = "LM75 chip";
} else {
#ifdef DEBUG
printk("lm75.o: Internal error: unknown kind (%d)?!?",
kind);
#endif
pr_debug("lm75.o: Internal error: unknown kind (%d)?!?", kind);
goto error1;
}
......@@ -314,10 +303,7 @@ void lm75_update_client(struct i2c_client *client)
if ((jiffies - data->last_updated > HZ + HZ / 2) ||
(jiffies < data->last_updated) || !data->valid) {
#ifdef DEBUG
printk("Starting lm75 update\n");
#endif
pr_debug("Starting lm75 update\n");
data->temp = lm75_read_value(client, LM75_REG_TEMP);
data->temp_os = lm75_read_value(client, LM75_REG_TEMP_OS);
......@@ -359,45 +345,17 @@ void lm75_temp(struct i2c_client *client, int operation, int ctl_name,
int __init sensors_lm75_init(void)
{
int res;
printk("lm75.o version %s (%s)\n", LM_VERSION, LM_DATE);
lm75_initialized = 0;
if ((res = i2c_add_driver(&lm75_driver))) {
printk
("lm75.o: Driver registration failed, module not inserted.\n");
lm75_cleanup();
return res;
}
lm75_initialized++;
return 0;
}
void __exit sensors_lm75_exit(void)
{
lm75_cleanup();
return i2c_add_driver(&lm75_driver);
}
static int lm75_cleanup(void)
static void __exit sensors_lm75_exit(void)
{
int res;
if (lm75_initialized >= 1) {
if ((res = i2c_del_driver(&lm75_driver))) {
printk
("lm75.o: Driver deregistration failed, module not removed.\n");
return res;
}
lm75_initialized--;
}
return 0;
i2c_del_driver(&lm75_driver);
}
EXPORT_NO_SYMBOLS;
MODULE_AUTHOR("Frodo Looijaard <frodol@dds.nl>");
MODULE_DESCRIPTION("LM75 driver");
MODULE_LICENSE("GPL");
module_init(sensors_lm75_init);
module_exit(sensors_lm75_exit);
/*
sensors.c - Part of lm_sensors, Linux kernel modules for hardware
monitoring
Copyright (c) 1998, 1999 Frodo Looijaard <frodol@dds.nl>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/* Not configurable as a module */
#include <linux/init.h>
extern int sensors_adm1021_init(void);
extern int sensors_lm75_init(void);
int __init sensors_init_all(void)
{
#ifdef CONFIG_SENSORS_ADM1021
sensors_adm1021_init();
#endif
#ifdef CONFIG_SENSORS_LM75
sensors_lm75_init();
#endif
return 0;
}
......@@ -605,18 +605,9 @@ int i2c_bit_del_bus(struct i2c_adapter *adap)
return 0;
}
int __init i2c_algo_bit_init (void)
{
printk(KERN_INFO "i2c-algo-bit.o: i2c bit algorithm module version %s (%s)\n", I2C_VERSION, I2C_DATE);
return 0;
}
EXPORT_SYMBOL(i2c_bit_add_bus);
EXPORT_SYMBOL(i2c_bit_del_bus);
#ifdef MODULE
MODULE_AUTHOR("Simon G. Vogl <simon@tk.uni-linz.ac.at>");
MODULE_DESCRIPTION("I2C-Bus bit-banging algorithm");
MODULE_LICENSE("GPL");
......@@ -629,13 +620,3 @@ MODULE_PARM_DESC(bit_test, "Test the lines of the bus to see if it is stuck");
MODULE_PARM_DESC(bit_scan, "Scan for active chips on the bus");
MODULE_PARM_DESC(i2c_debug,
"debug level - 0 off; 1 normal; 2,3 more verbose; 9 bit-protocol");
int init_module(void)
{
return i2c_algo_bit_init();
}
void cleanup_module(void)
{
}
#endif
......@@ -520,17 +520,9 @@ int i2c_pcf_del_bus(struct i2c_adapter *adap)
return 0;
}
int __init i2c_algo_pcf_init (void)
{
printk(KERN_INFO "i2c-algo-pcf.o: i2c pcf8584 algorithm module version %s (%s)\n", I2C_VERSION, I2C_DATE);
return 0;
}
EXPORT_SYMBOL(i2c_pcf_add_bus);
EXPORT_SYMBOL(i2c_pcf_del_bus);
#ifdef MODULE
MODULE_AUTHOR("Hans Berglund <hb@spacetec.no>");
MODULE_DESCRIPTION("I2C-Bus PCF8584 algorithm");
MODULE_LICENSE("GPL");
......@@ -541,14 +533,3 @@ MODULE_PARM(i2c_debug,"i");
MODULE_PARM_DESC(pcf_scan, "Scan for active chips on the bus");
MODULE_PARM_DESC(i2c_debug,
"debug level - 0 off; 1 normal; 2,3 more verbose; 9 pcf-protocol");
int init_module(void)
{
return i2c_algo_pcf_init();
}
void cleanup_module(void)
{
}
#endif
......@@ -56,8 +56,8 @@
/* ----- global variables -------------------------------------------------- */
/**** lock for writing to global variables: the adapter & driver list */
struct semaphore adap_lock;
struct semaphore driver_lock;
DECLARE_MUTEX(adap_lock);
DECLARE_MUTEX(driver_lock);
/**** adapter list */
static struct i2c_adapter *adapters[I2C_ADAP_MAX];
......@@ -76,11 +76,6 @@ static int i2c_debug;
*/
#ifdef CONFIG_PROC_FS
int __init i2cproc_init(void);
void __exit i2cproc_exit(void);
static int i2cproc_cleanup(void);
static ssize_t i2cproc_bus_read(struct file * file, char * buf,size_t count,
loff_t *ppos);
static int read_bus_i2c(char *buf, char **start, off_t offset, int len,
......@@ -91,14 +86,6 @@ static int read_bus_i2c(char *buf, char **start, off_t offset, int len,
static struct file_operations i2cproc_operations = {
.read = i2cproc_bus_read,
};
static int i2cproc_initialized = 0;
#else /* undef CONFIG_PROC_FS */
#define i2cproc_init() 0
#define i2cproc_cleanup() 0
#endif /* CONFIG_PROC_FS */
......@@ -136,8 +123,7 @@ int i2c_add_adapter(struct i2c_adapter *adap)
init_MUTEX(&adap->lock);
#ifdef CONFIG_PROC_FS
if (i2cproc_initialized) {
{
char name[8];
struct proc_dir_entry *proc_entry;
......@@ -155,7 +141,6 @@ int i2c_add_adapter(struct i2c_adapter *adap)
proc_entry->owner = THIS_MODULE;
adap->inode = proc_entry->low_ino;
}
#endif /* def CONFIG_PROC_FS */
/* inform drivers of new adapters */
......@@ -234,10 +219,10 @@ int i2c_del_adapter(struct i2c_adapter *adap)
}
}
#ifdef CONFIG_PROC_FS
if (i2cproc_initialized) {
{
char name[8];
sprintf(name,"i2c-%d", i);
remove_proc_entry(name,proc_bus);
remove_proc_entry(name, proc_bus);
}
#endif /* def CONFIG_PROC_FS */
......@@ -681,41 +666,30 @@ ssize_t i2cproc_bus_read(struct file * file, char * buf,size_t count,
return -ENOENT;
}
int i2cproc_init(void)
static int i2cproc_init(void)
{
struct proc_dir_entry *proc_bus_i2c;
i2cproc_initialized = 0;
if (! proc_bus) {
printk(KERN_ERR "i2c-core.o: /proc/bus/ does not exist");
i2cproc_cleanup();
return -ENOENT;
}
proc_bus_i2c = create_proc_entry("i2c",0,proc_bus);
if (!proc_bus_i2c) {
printk(KERN_ERR "i2c-core.o: Could not create /proc/bus/i2c");
i2cproc_cleanup();
return -ENOENT;
}
proc_bus_i2c->read_proc = &read_bus_i2c;
proc_bus_i2c->owner = THIS_MODULE;
i2cproc_initialized += 2;
return 0;
}
int i2cproc_cleanup(void)
static void __exit i2cproc_cleanup(void)
{
if (i2cproc_initialized >= 1) {
remove_proc_entry("i2c",proc_bus);
i2cproc_initialized -= 2;
}
return 0;
remove_proc_entry("i2c",proc_bus);
}
module_init(i2cproc_init);
module_exit(i2cproc_cleanup);
#endif /* def CONFIG_PROC_FS */
/* ----------------------------------------------------
......@@ -1440,120 +1414,6 @@ int i2c_check_functionality (struct i2c_adapter *adap, u32 func)
return (func & adap_func) == func;
}
static int __init i2c_init(void)
{
printk(KERN_INFO "i2c-core.o: i2c core module version %s (%s)\n", I2C_VERSION, I2C_DATE);
memset(adapters,0,sizeof(adapters));
memset(drivers,0,sizeof(drivers));
adap_count=0;
driver_count=0;
init_MUTEX(&adap_lock);
init_MUTEX(&driver_lock);
i2cproc_init();
return 0;
}
void __exit i2c_exit(void)
{
i2cproc_cleanup();
}
#ifndef MODULE
#ifdef CONFIG_I2C_CHARDEV
extern int i2c_dev_init(void);
#endif
#ifdef CONFIG_I2C_ALGOBIT
extern int i2c_algo_bit_init(void);
#endif
#ifdef CONFIG_I2C_PHILIPSPAR
extern int i2c_bitlp_init(void);
#endif
#ifdef CONFIG_I2C_ELV
extern int i2c_bitelv_init(void);
#endif
#ifdef CONFIG_I2C_VELLEMAN
extern int i2c_bitvelle_init(void);
#endif
#ifdef CONFIG_I2C_BITVIA
extern int i2c_bitvia_init(void);
#endif
#ifdef CONFIG_I2C_ALGOPCF
extern int i2c_algo_pcf_init(void);
#endif
#ifdef CONFIG_I2C_ELEKTOR
extern int i2c_pcfisa_init(void);
#endif
#ifdef CONFIG_I2C_ALGO8XX
extern int i2c_algo_8xx_init(void);
#endif
#ifdef CONFIG_I2C_RPXLITE
extern int i2c_rpx_init(void);
#endif
#ifdef CONFIG_I2C_PROC
extern int sensors_init(void);
#endif
/* This is needed for automatic patch generation: sensors code starts here */
/* This is needed for automatic patch generation: sensors code ends here */
int __init i2c_init_all(void)
{
/* --------------------- global ----- */
i2c_init();
#ifdef CONFIG_I2C_CHARDEV
i2c_dev_init();
#endif
/* --------------------- bit -------- */
#ifdef CONFIG_I2C_ALGOBIT
i2c_algo_bit_init();
#endif
#ifdef CONFIG_I2C_PHILIPSPAR
i2c_bitlp_init();
#endif
#ifdef CONFIG_I2C_ELV
i2c_bitelv_init();
#endif
#ifdef CONFIG_I2C_VELLEMAN
i2c_bitvelle_init();
#endif
/* --------------------- pcf -------- */
#ifdef CONFIG_I2C_ALGOPCF
i2c_algo_pcf_init();
#endif
#ifdef CONFIG_I2C_ELEKTOR
i2c_pcfisa_init();
#endif
/* --------------------- 8xx -------- */
#ifdef CONFIG_I2C_ALGO8XX
i2c_algo_8xx_init();
#endif
#ifdef CONFIG_I2C_RPXLITE
i2c_rpx_init();
#endif
/* -------------- proc interface ---- */
#ifdef CONFIG_I2C_PROC
sensors_init();
#endif
/* This is needed for automatic patch generation: sensors code starts here */
/* This is needed for automatic patch generation: sensors code ends here */
return 0;
}
#endif
EXPORT_SYMBOL(i2c_add_adapter);
EXPORT_SYMBOL(i2c_del_adapter);
EXPORT_SYMBOL(i2c_add_driver);
......@@ -1594,9 +1454,7 @@ EXPORT_SYMBOL(i2c_check_functionality);
MODULE_AUTHOR("Simon G. Vogl <simon@tk.uni-linz.ac.at>");
MODULE_DESCRIPTION("I2C-Bus main module");
MODULE_PARM(i2c_debug, "i");
MODULE_PARM_DESC(i2c_debug,"debug level");
MODULE_LICENSE("GPL");
module_init(i2c_init);
module_exit(i2c_exit);
MODULE_PARM(i2c_debug, "i");
MODULE_PARM_DESC(i2c_debug,"debug level");
......@@ -48,10 +48,6 @@
#include <linux/i2c.h>
#include <linux/i2c-dev.h>
int __init i2c_dev_init(void);
void __exit i2c_dev_exit(void);
static int dev_cleanup(void);
/* struct file_operations changed too often in the 2.1 series for nice code */
static ssize_t i2cdev_read (struct file *file, char *buf, size_t count,
......@@ -437,19 +433,6 @@ static int i2cdev_command(struct i2c_client *client, unsigned int cmd,
return -1;
}
static int dev_cleanup(void)
{
int res;
if ((res = i2c_del_driver(&i2cdev_driver))) {
printk(KERN_ERR "i2c-dev.o: Driver deregistration failed, "
"module not removed.\n");
}
devfs_remove("i2c");
unregister_chrdev(I2C_MAJOR,"i2c");
}
int __init i2c_dev_init(void)
{
int res;
......@@ -471,13 +454,13 @@ int __init i2c_dev_init(void)
return 0;
}
void __exit i2c_dev_exit(void)
static void __exit i2c_dev_exit(void)
{
dev_cleanup();
i2c_del_driver(&i2cdev_driver);
devfs_remove("i2c");
unregister_chrdev(I2C_MAJOR,"i2c");
}
EXPORT_NO_SYMBOLS;
MODULE_AUTHOR("Frodo Looijaard <frodol@dds.nl> and Simon G. Vogl <simon@tk.uni-linz.ac.at>");
MODULE_DESCRIPTION("I2C /dev entries driver");
MODULE_LICENSE("GPL");
......
......@@ -159,19 +159,6 @@ static int pcf_isa_init(void)
return 0;
}
static void pcf_isa_exit(void)
{
if (irq > 0) {
disable_irq(irq);
free_irq(irq, 0);
}
if (!mmapped) {
release_region(base , 2);
}
}
static int pcf_isa_reg(struct i2c_client *client)
{
return 0;
......@@ -223,7 +210,7 @@ static struct i2c_adapter pcf_isa_ops = {
.client_unregister = pcf_isa_unreg,
};
int __init i2c_pcfisa_init(void)
static int __init i2c_pcfisa_init(void)
{
#ifdef __alpha__
/* check to see we have memory mapped PCF8584 connected to the
......@@ -281,23 +268,39 @@ int __init i2c_pcfisa_init(void)
}
init_waitqueue_head(&pcf_wait);
if (pcf_isa_init() == 0) {
if (i2c_pcf_add_bus(&pcf_isa_ops) < 0) {
pcf_isa_exit();
return -ENODEV;
}
} else {
if (pcf_isa_init())
return -ENODEV;
}
if (i2c_pcf_add_bus(&pcf_isa_ops) < 0)
goto fail;
printk(KERN_ERR "i2c-elektor.o: found device at %#x.\n", base);
return 0;
fail:
if (irq > 0) {
disable_irq(irq);
free_irq(irq, 0);
}
if (!mmapped)
release_region(base , 2);
return -ENODEV;
}
EXPORT_NO_SYMBOLS;
static void i2c_pcfisa_exit(void)
{
i2c_pcf_del_bus(&pcf_isa_ops);
if (irq > 0) {
disable_irq(irq);
free_irq(irq, 0);
}
if (!mmapped)
release_region(base , 2);
}
#ifdef MODULE
MODULE_AUTHOR("Hans Berglund <hb@spacetec.no>");
MODULE_DESCRIPTION("I2C-Bus adapter routines for PCF8584 ISA bus adapter");
MODULE_LICENSE("GPL");
......@@ -309,15 +312,5 @@ MODULE_PARM(own, "i");
MODULE_PARM(mmapped, "i");
MODULE_PARM(i2c_debug, "i");
int init_module(void)
{
return i2c_pcfisa_init();
}
void cleanup_module(void)
{
i2c_pcf_del_bus(&pcf_isa_ops);
pcf_isa_exit();
}
#endif
module_init(i2c_pcfisa_init);
module_exit(i2c_pcfisa_exit);
......@@ -113,11 +113,6 @@ static int bit_elv_init(void)
return 0;
}
static void __exit bit_elv_exit(void)
{
release_region( base , (base == 0x3bc)? 3 : 8 );
}
static int bit_elv_reg(struct i2c_client *client)
{
return 0;
......@@ -166,7 +161,7 @@ static struct i2c_adapter bit_elv_ops = {
bit_elv_unreg,
};
int __init i2c_bitelv_init(void)
static int __init i2c_bitelv_init(void)
{
printk(KERN_INFO "i2c-elv.o: i2c ELV parallel port adapter module version %s (%s)\n", I2C_VERSION, I2C_DATE);
if (base==0) {
......@@ -192,24 +187,17 @@ int __init i2c_bitelv_init(void)
return 0;
}
static void __exit i2c_bitelv_exit(void)
{
i2c_bit_del_bus(&bit_elv_ops);
release_region(base , (base == 0x3bc) ? 3 : 8);
}
#ifdef MODULE
MODULE_AUTHOR("Simon G. Vogl <simon@tk.uni-linz.ac.at>");
MODULE_DESCRIPTION("I2C-Bus adapter routines for ELV parallel port adapter");
MODULE_LICENSE("GPL");
MODULE_PARM(base, "i");
int init_module(void)
{
return i2c_bitelv_init();
}
void cleanup_module(void)
{
i2c_bit_del_bus(&bit_elv_ops);
bit_elv_exit();
}
#endif
module_init(i2c_bitelv_init);
module_exit(i2c_bitelv_exit);
......@@ -96,8 +96,6 @@ static int __init i2c_frodo_init (void)
return (i2c_bit_add_bus (&frodo_ops));
}
EXPORT_NO_SYMBOLS;
static void __exit i2c_frodo_exit (void)
{
i2c_bit_del_bus (&frodo_ops);
......@@ -105,12 +103,7 @@ static void __exit i2c_frodo_exit (void)
MODULE_AUTHOR ("Abraham van der Merwe <abraham@2d3d.co.za>");
MODULE_DESCRIPTION ("I2C-Bus adapter routines for Frodo");
#ifdef MODULE_LICENSE
MODULE_LICENSE ("GPL");
#endif /* #ifdef MODULE_LICENSE */
EXPORT_NO_SYMBOLS;
module_init (i2c_frodo_init);
module_exit (i2c_frodo_exit);
......
......@@ -297,14 +297,5 @@ MODULE_LICENSE("GPL");
MODULE_PARM(type, "i");
#ifdef MODULE
int init_module(void)
{
return i2c_bitlp_init();
}
void cleanup_module(void)
{
i2c_bitlp_exit();
}
#endif
module_init(i2c_bitlp_init);
module_exit(i2c_bitlp_exit);
......@@ -40,10 +40,6 @@
#define THIS_MODULE NULL
#endif
int __init sensors_init(void);
void __exit i2c_proc_exit(void);
static int proc_cleanup(void);
static int i2c_create_name(char **name, const char *prefix,
struct i2c_adapter *adapter, int addr);
static int i2c_parse_reals(int *nrels, void *buffer, int bufsize,
......@@ -92,7 +88,6 @@ static ctl_table i2c_proc[] = {
static struct ctl_table_header *i2c_proc_header;
static int i2c_initialized;
/* This returns a nice name for a new directory; for example lm78-isa-0310
(for a LM78 chip on the ISA bus at port 0x310), or lm75-i2c-3-4e (for
......@@ -848,10 +843,9 @@ int i2c_detect(struct i2c_adapter *adapter,
return 0;
}
int __init sensors_init(void)
static int __init i2c_proc_init(void)
{
printk(KERN_INFO "i2c-proc.o version %s (%s)\n", I2C_VERSION, I2C_DATE);
i2c_initialized = 0;
if (!
(i2c_proc_header =
register_sysctl_table(i2c_proc, 0))) {
......@@ -859,22 +853,12 @@ int __init sensors_init(void)
return -EPERM;
}
i2c_proc_header->ctl_table->child->de->owner = THIS_MODULE;
i2c_initialized++;
return 0;
}
void __exit i2c_proc_exit(void)
{
proc_cleanup();
}
static int proc_cleanup(void)
static void __exit i2c_proc_exit(void)
{
if (i2c_initialized >= 1) {
unregister_sysctl_table(i2c_proc_header);
i2c_initialized--;
}
return 0;
unregister_sysctl_table(i2c_proc_header);
}
EXPORT_SYMBOL(i2c_deregister_entry);
......@@ -887,5 +871,5 @@ MODULE_AUTHOR("Frodo Looijaard <frodol@dds.nl>");
MODULE_DESCRIPTION("i2c-proc driver");
MODULE_LICENSE("GPL");
module_init(sensors_init);
module_init(i2c_proc_init);
module_exit(i2c_proc_exit);
......@@ -126,11 +126,8 @@ void __exit i2c_rpx_exit(void)
i2c_8xx_del_bus(&rpx_ops);
}
#ifdef MODULE
MODULE_AUTHOR("Dan Malek <dmalek@jlc.net>");
MODULE_DESCRIPTION("I2C-Bus adapter routines for MPC8xx boards");
module_init(i2c_rpx_init);
module_exit(i2c_rpx_exit);
#endif
......@@ -102,12 +102,6 @@ static int bit_velle_init(void)
return 0;
}
static void __exit bit_velle_exit(void)
{
release_region( base , (base == 0x3bc)? 3 : 8 );
}
static int bit_velle_reg(struct i2c_client *client)
{
return 0;
......@@ -157,7 +151,7 @@ static struct i2c_adapter bit_velle_ops = {
bit_velle_unreg,
};
int __init i2c_bitvelle_init(void)
static int __init i2c_bitvelle_init(void)
{
printk(KERN_INFO "i2c-velleman.o: i2c Velleman K8000 adapter module version %s (%s)\n", I2C_VERSION, I2C_DATE);
if (base==0) {
......@@ -183,22 +177,17 @@ int __init i2c_bitvelle_init(void)
return 0;
}
#ifdef MODULE
static void __exit i2c_bitvelle_exit(void)
{
i2c_bit_del_bus(&bit_velle_ops);
release_region(base, (base == 0x3bc) ? 3 : 8);
}
MODULE_AUTHOR("Simon G. Vogl <simon@tk.uni-linz.ac.at>");
MODULE_DESCRIPTION("I2C-Bus adapter routines for Velleman K8000 adapter");
MODULE_LICENSE("GPL");
MODULE_PARM(base, "i");
int init_module(void)
{
return i2c_bitvelle_init();
}
void cleanup_module(void)
{
i2c_bit_del_bus(&bit_velle_ops);
bit_velle_exit();
}
#endif
module_init(i2c_bitvelle_init);
module_exit(i2c_bitvelle_exit);
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment