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/ ...@@ -38,8 +38,6 @@ obj-$(CONFIG_GAMEPORT) += input/gameport/
obj-$(CONFIG_SERIO) += input/serio/ obj-$(CONFIG_SERIO) += input/serio/
obj-$(CONFIG_I2O) += message/ obj-$(CONFIG_I2O) += message/
obj-$(CONFIG_I2C) += i2c/ obj-$(CONFIG_I2C) += i2c/
obj-$(CONFIG_I2C_MAINBOARD) += i2c/busses/
obj-$(CONFIG_SENSORS) += i2c/chips/
obj-$(CONFIG_PHONE) += telephony/ obj-$(CONFIG_PHONE) += telephony/
obj-$(CONFIG_MD) += md/ obj-$(CONFIG_MD) += md/
obj-$(CONFIG_BT) += bluetooth/ obj-$(CONFIG_BT) += bluetooth/
......
...@@ -27,15 +27,6 @@ ...@@ -27,15 +27,6 @@
#include <asm/io.h> #include <asm/io.h>
#include <asm/pgalloc.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 #ifdef CONFIG_FB
extern void fbmem_init(void); extern void fbmem_init(void);
#endif #endif
...@@ -708,12 +699,6 @@ int __init chr_dev_init(void) ...@@ -708,12 +699,6 @@ int __init chr_dev_init(void)
printk("unable to get major %d for memory devs\n", MEM_MAJOR); printk("unable to get major %d for memory devs\n", MEM_MAJOR);
memory_devfs_register(); memory_devfs_register();
rand_initialize(); rand_initialize();
#ifdef CONFIG_I2C
i2c_init_all();
#endif
#ifdef CONFIG_I2C_MAINBOARD
i2c_mainboard_init_all();
#endif
#if defined (CONFIG_FB) #if defined (CONFIG_FB)
fbmem_init(); fbmem_init();
#endif #endif
...@@ -728,10 +713,6 @@ int __init chr_dev_init(void) ...@@ -728,10 +713,6 @@ int __init chr_dev_init(void)
#if defined(CONFIG_S390_TAPE) && defined(CONFIG_S390_TAPE_CHAR) #if defined(CONFIG_S390_TAPE) && defined(CONFIG_S390_TAPE_CHAR)
tapechar_init(); tapechar_init();
#endif #endif
#ifdef CONFIG_SENSORS
sensors_init_all();
#endif
return 0; return 0;
} }
......
...@@ -166,8 +166,6 @@ config I2C_IBM_OCP_ADAP ...@@ -166,8 +166,6 @@ config I2C_IBM_OCP_ADAP
tristate "IBM on-chip I2C Adapter" tristate "IBM on-chip I2C Adapter"
depends on I2C_IBM_OCP_ALGO 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 config I2C_CHARDEV
tristate "I2C device interface" tristate "I2C device interface"
depends on I2C depends on I2C
......
...@@ -18,6 +18,4 @@ obj-$(CONFIG_ITE_I2C_ADAP) += i2c-adap-ite.o ...@@ -18,6 +18,4 @@ obj-$(CONFIG_ITE_I2C_ADAP) += i2c-adap-ite.o
obj-$(CONFIG_SCx200_I2C) += scx200_i2c.o obj-$(CONFIG_SCx200_I2C) += scx200_i2c.o
obj-$(CONFIG_SCx200_ACB) += scx200_acb.o obj-$(CONFIG_SCx200_ACB) += scx200_acb.o
obj-$(CONFIG_I2C_PROC) += i2c-proc.o obj-$(CONFIG_I2C_PROC) += i2c-proc.o
obj-y += busses/ chips/
# This is needed for automatic patch generation: sensors code starts here
# This is needed for automatic patch generation: sensors code ends here
...@@ -5,22 +5,8 @@ ...@@ -5,22 +5,8 @@
menu "I2C Hardware Sensors Mainboard support" 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 config I2C_AMD756
tristate " AMD 756/766" tristate " AMD 756/766"
depends on I2C_MAINBOARD
help help
If you say yes to this option, support will be included for the AMD If you say yes to this option, support will be included for the AMD
756/766/768 mainboard I2C interfaces. 756/766/768 mainboard I2C interfaces.
...@@ -37,7 +23,6 @@ config I2C_AMD756 ...@@ -37,7 +23,6 @@ config I2C_AMD756
config I2C_AMD8111 config I2C_AMD8111
tristate " AMD 8111" tristate " AMD 8111"
depends on I2C_MAINBOARD
help help
If you say yes to this option, support will be included for the AMD If you say yes to this option, support will be included for the AMD
8111 mainboard I2C interfaces. 8111 mainboard I2C interfaces.
......
...@@ -2,6 +2,5 @@ ...@@ -2,6 +2,5 @@
# Makefile for the kernel hardware sensors bus drivers. # 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_AMD756) += i2c-amd756.o
obj-$(CONFIG_I2C_AMD8111) += i2c-amd8111.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 @@ ...@@ -5,22 +5,8 @@
menu "I2C Hardware Sensors Chip support" 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 config SENSORS_ADM1021
tristate " Analog Devices ADM1021 and compatibles" tristate " Analog Devices ADM1021 and compatibles"
depends on SENSORS
help help
If you say yes here you get support for Analog Devices ADM1021 If you say yes here you get support for Analog Devices ADM1021
and ADM1023 sensor chips and clones: Maxim MAX1617 and MAX1617A, and ADM1023 sensor chips and clones: Maxim MAX1617 and MAX1617A,
...@@ -37,7 +23,6 @@ config SENSORS_ADM1021 ...@@ -37,7 +23,6 @@ config SENSORS_ADM1021
config SENSORS_LM75 config SENSORS_LM75
tristate " National Semiconductors LM75 and compatibles" tristate " National Semiconductors LM75 and compatibles"
depends on SENSORS
help help
If you say yes here you get support for National Semiconductor LM75 If you say yes here you get support for National Semiconductor LM75
sensor chips and clones: Dallas Semi DS75 and DS1775, TelCon sensor chips and clones: Dallas Semi DS75 and DS1775, TelCon
...@@ -51,4 +36,3 @@ config SENSORS_LM75 ...@@ -51,4 +36,3 @@ config SENSORS_LM75
http://www.lm-sensors.nu http://www.lm-sensors.nu
endmenu endmenu
...@@ -2,6 +2,5 @@ ...@@ -2,6 +2,5 @@
# Makefile for the kernel hardware sensors chip drivers. # Makefile for the kernel hardware sensors chip drivers.
# #
obj-$(CONFIG_SENSORS) += sensors.o
obj-$(CONFIG_SENSORS_ADM1021) += adm1021.o obj-$(CONFIG_SENSORS_ADM1021) += adm1021.o
obj-$(CONFIG_SENSORS_LM75) += lm75.o obj-$(CONFIG_SENSORS_LM75) += lm75.o
...@@ -26,7 +26,6 @@ ...@@ -26,7 +26,6 @@
#include <linux/sensors.h> #include <linux/sensors.h>
#include <linux/init.h> #include <linux/init.h>
MODULE_LICENSE("GPL");
/* Addresses to scan */ /* Addresses to scan */
static unsigned short normal_i2c[] = { SENSORS_I2C_END }; static unsigned short normal_i2c[] = { SENSORS_I2C_END };
...@@ -108,10 +107,6 @@ struct adm1021_data { ...@@ -108,10 +107,6 @@ struct adm1021_data {
remote_temp_offset, remote_temp_offset_prec; 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_attach_adapter(struct i2c_adapter *adapter);
static int adm1021_detect(struct i2c_adapter *adapter, int address, static int adm1021_detect(struct i2c_adapter *adapter, int address,
unsigned short flags, int kind); unsigned short flags, int kind);
...@@ -178,9 +173,6 @@ static ctl_table adm1021_max_dir_table_template[] = { ...@@ -178,9 +173,6 @@ static ctl_table adm1021_max_dir_table_template[] = {
{0} {0}
}; };
/* Used by init/cleanup */
static int __initdata adm1021_initialized = 0;
/* I choose here for semi-static allocation. Complete dynamic /* I choose here for semi-static allocation. Complete dynamic
allocation could also be used; the code needed for this would probably allocation could also be used; the code needed for this would probably
take more memory than the datastructure takes now. */ take more memory than the datastructure takes now. */
...@@ -585,46 +577,21 @@ void adm1021_alarms(struct i2c_client *client, int operation, int ctl_name, ...@@ -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); return i2c_add_driver(&adm1021_driver);
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;
} }
void __exit sensors_adm1021_exit(void) static void __exit sensors_adm1021_exit(void)
{ {
adm1021_cleanup(); i2c_del_driver(&adm1021_driver);
}
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;
} }
MODULE_AUTHOR MODULE_AUTHOR
("Frodo Looijaard <frodol@dds.nl> and Philip Edelbrock <phil@netroedge.com>"); ("Frodo Looijaard <frodol@dds.nl> and Philip Edelbrock <phil@netroedge.com>");
MODULE_DESCRIPTION("adm1021 driver"); MODULE_DESCRIPTION("adm1021 driver");
MODULE_LICENSE("GPL");
MODULE_PARM(read_only, "i"); MODULE_PARM(read_only, "i");
MODULE_PARM_DESC(read_only, "Don't set any values, read only mode"); MODULE_PARM_DESC(read_only, "Don't set any values, read only mode");
......
...@@ -25,7 +25,6 @@ ...@@ -25,7 +25,6 @@
#include <linux/sensors.h> #include <linux/sensors.h>
#include <linux/init.h> #include <linux/init.h>
MODULE_LICENSE("GPL");
/* Addresses to scan */ /* Addresses to scan */
static unsigned short normal_i2c[] = { SENSORS_I2C_END }; static unsigned short normal_i2c[] = { SENSORS_I2C_END };
...@@ -66,10 +65,6 @@ struct lm75_data { ...@@ -66,10 +65,6 @@ struct lm75_data {
u16 temp, temp_os, temp_hyst; /* Register values */ 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_attach_adapter(struct i2c_adapter *adapter);
static int lm75_detect(struct i2c_adapter *adapter, int address, static int lm75_detect(struct i2c_adapter *adapter, int address,
unsigned short flags, int kind); unsigned short flags, int kind);
...@@ -110,9 +105,6 @@ static ctl_table lm75_dir_table_template[] = { ...@@ -110,9 +105,6 @@ static ctl_table lm75_dir_table_template[] = {
{0} {0}
}; };
/* Used by init/cleanup */
static int __initdata lm75_initialized = 0;
static int lm75_id = 0; static int lm75_id = 0;
int lm75_attach_adapter(struct i2c_adapter *adapter) int lm75_attach_adapter(struct i2c_adapter *adapter)
...@@ -188,10 +180,7 @@ int lm75_detect(struct i2c_adapter *adapter, int address, ...@@ -188,10 +180,7 @@ int lm75_detect(struct i2c_adapter *adapter, int address,
type_name = "lm75"; type_name = "lm75";
client_name = "LM75 chip"; client_name = "LM75 chip";
} else { } else {
#ifdef DEBUG pr_debug("lm75.o: Internal error: unknown kind (%d)?!?", kind);
printk("lm75.o: Internal error: unknown kind (%d)?!?",
kind);
#endif
goto error1; goto error1;
} }
...@@ -314,10 +303,7 @@ void lm75_update_client(struct i2c_client *client) ...@@ -314,10 +303,7 @@ void lm75_update_client(struct i2c_client *client)
if ((jiffies - data->last_updated > HZ + HZ / 2) || if ((jiffies - data->last_updated > HZ + HZ / 2) ||
(jiffies < data->last_updated) || !data->valid) { (jiffies < data->last_updated) || !data->valid) {
pr_debug("Starting lm75 update\n");
#ifdef DEBUG
printk("Starting lm75 update\n");
#endif
data->temp = lm75_read_value(client, LM75_REG_TEMP); data->temp = lm75_read_value(client, LM75_REG_TEMP);
data->temp_os = lm75_read_value(client, LM75_REG_TEMP_OS); 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, ...@@ -359,45 +345,17 @@ void lm75_temp(struct i2c_client *client, int operation, int ctl_name,
int __init sensors_lm75_init(void) int __init sensors_lm75_init(void)
{ {
int res; return i2c_add_driver(&lm75_driver);
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();
} }
static int lm75_cleanup(void) static void __exit sensors_lm75_exit(void)
{ {
int res; i2c_del_driver(&lm75_driver);
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;
} }
EXPORT_NO_SYMBOLS;
MODULE_AUTHOR("Frodo Looijaard <frodol@dds.nl>"); MODULE_AUTHOR("Frodo Looijaard <frodol@dds.nl>");
MODULE_DESCRIPTION("LM75 driver"); MODULE_DESCRIPTION("LM75 driver");
MODULE_LICENSE("GPL");
module_init(sensors_lm75_init); module_init(sensors_lm75_init);
module_exit(sensors_lm75_exit); 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) ...@@ -605,18 +605,9 @@ int i2c_bit_del_bus(struct i2c_adapter *adap)
return 0; 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_add_bus);
EXPORT_SYMBOL(i2c_bit_del_bus); EXPORT_SYMBOL(i2c_bit_del_bus);
#ifdef MODULE
MODULE_AUTHOR("Simon G. Vogl <simon@tk.uni-linz.ac.at>"); MODULE_AUTHOR("Simon G. Vogl <simon@tk.uni-linz.ac.at>");
MODULE_DESCRIPTION("I2C-Bus bit-banging algorithm"); MODULE_DESCRIPTION("I2C-Bus bit-banging algorithm");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
...@@ -629,13 +620,3 @@ MODULE_PARM_DESC(bit_test, "Test the lines of the bus to see if it is stuck"); ...@@ -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(bit_scan, "Scan for active chips on the bus");
MODULE_PARM_DESC(i2c_debug, MODULE_PARM_DESC(i2c_debug,
"debug level - 0 off; 1 normal; 2,3 more verbose; 9 bit-protocol"); "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) ...@@ -520,17 +520,9 @@ int i2c_pcf_del_bus(struct i2c_adapter *adap)
return 0; 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_add_bus);
EXPORT_SYMBOL(i2c_pcf_del_bus); EXPORT_SYMBOL(i2c_pcf_del_bus);
#ifdef MODULE
MODULE_AUTHOR("Hans Berglund <hb@spacetec.no>"); MODULE_AUTHOR("Hans Berglund <hb@spacetec.no>");
MODULE_DESCRIPTION("I2C-Bus PCF8584 algorithm"); MODULE_DESCRIPTION("I2C-Bus PCF8584 algorithm");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
...@@ -541,14 +533,3 @@ MODULE_PARM(i2c_debug,"i"); ...@@ -541,14 +533,3 @@ MODULE_PARM(i2c_debug,"i");
MODULE_PARM_DESC(pcf_scan, "Scan for active chips on the bus"); MODULE_PARM_DESC(pcf_scan, "Scan for active chips on the bus");
MODULE_PARM_DESC(i2c_debug, MODULE_PARM_DESC(i2c_debug,
"debug level - 0 off; 1 normal; 2,3 more verbose; 9 pcf-protocol"); "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 @@ ...@@ -56,8 +56,8 @@
/* ----- global variables -------------------------------------------------- */ /* ----- global variables -------------------------------------------------- */
/**** lock for writing to global variables: the adapter & driver list */ /**** lock for writing to global variables: the adapter & driver list */
struct semaphore adap_lock; DECLARE_MUTEX(adap_lock);
struct semaphore driver_lock; DECLARE_MUTEX(driver_lock);
/**** adapter list */ /**** adapter list */
static struct i2c_adapter *adapters[I2C_ADAP_MAX]; static struct i2c_adapter *adapters[I2C_ADAP_MAX];
...@@ -76,11 +76,6 @@ static int i2c_debug; ...@@ -76,11 +76,6 @@ static int i2c_debug;
*/ */
#ifdef CONFIG_PROC_FS #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, static ssize_t i2cproc_bus_read(struct file * file, char * buf,size_t count,
loff_t *ppos); loff_t *ppos);
static int read_bus_i2c(char *buf, char **start, off_t offset, int len, 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, ...@@ -91,14 +86,6 @@ static int read_bus_i2c(char *buf, char **start, off_t offset, int len,
static struct file_operations i2cproc_operations = { static struct file_operations i2cproc_operations = {
.read = i2cproc_bus_read, .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 */ #endif /* CONFIG_PROC_FS */
...@@ -136,8 +123,7 @@ int i2c_add_adapter(struct i2c_adapter *adap) ...@@ -136,8 +123,7 @@ int i2c_add_adapter(struct i2c_adapter *adap)
init_MUTEX(&adap->lock); init_MUTEX(&adap->lock);
#ifdef CONFIG_PROC_FS #ifdef CONFIG_PROC_FS
{
if (i2cproc_initialized) {
char name[8]; char name[8];
struct proc_dir_entry *proc_entry; struct proc_dir_entry *proc_entry;
...@@ -155,7 +141,6 @@ int i2c_add_adapter(struct i2c_adapter *adap) ...@@ -155,7 +141,6 @@ int i2c_add_adapter(struct i2c_adapter *adap)
proc_entry->owner = THIS_MODULE; proc_entry->owner = THIS_MODULE;
adap->inode = proc_entry->low_ino; adap->inode = proc_entry->low_ino;
} }
#endif /* def CONFIG_PROC_FS */ #endif /* def CONFIG_PROC_FS */
/* inform drivers of new adapters */ /* inform drivers of new adapters */
...@@ -234,10 +219,10 @@ int i2c_del_adapter(struct i2c_adapter *adap) ...@@ -234,10 +219,10 @@ int i2c_del_adapter(struct i2c_adapter *adap)
} }
} }
#ifdef CONFIG_PROC_FS #ifdef CONFIG_PROC_FS
if (i2cproc_initialized) { {
char name[8]; char name[8];
sprintf(name,"i2c-%d", i); sprintf(name,"i2c-%d", i);
remove_proc_entry(name,proc_bus); remove_proc_entry(name, proc_bus);
} }
#endif /* def CONFIG_PROC_FS */ #endif /* def CONFIG_PROC_FS */
...@@ -681,41 +666,30 @@ ssize_t i2cproc_bus_read(struct file * file, char * buf,size_t count, ...@@ -681,41 +666,30 @@ ssize_t i2cproc_bus_read(struct file * file, char * buf,size_t count,
return -ENOENT; return -ENOENT;
} }
int i2cproc_init(void) static int i2cproc_init(void)
{ {
struct proc_dir_entry *proc_bus_i2c; 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); proc_bus_i2c = create_proc_entry("i2c",0,proc_bus);
if (!proc_bus_i2c) { if (!proc_bus_i2c) {
printk(KERN_ERR "i2c-core.o: Could not create /proc/bus/i2c"); printk(KERN_ERR "i2c-core.o: Could not create /proc/bus/i2c");
i2cproc_cleanup();
return -ENOENT; return -ENOENT;
} }
proc_bus_i2c->read_proc = &read_bus_i2c; proc_bus_i2c->read_proc = &read_bus_i2c;
proc_bus_i2c->owner = THIS_MODULE; proc_bus_i2c->owner = THIS_MODULE;
i2cproc_initialized += 2;
return 0; return 0;
} }
int i2cproc_cleanup(void) static void __exit i2cproc_cleanup(void)
{ {
if (i2cproc_initialized >= 1) { remove_proc_entry("i2c",proc_bus);
remove_proc_entry("i2c",proc_bus);
i2cproc_initialized -= 2;
}
return 0;
} }
module_init(i2cproc_init);
module_exit(i2cproc_cleanup);
#endif /* def CONFIG_PROC_FS */ #endif /* def CONFIG_PROC_FS */
/* ---------------------------------------------------- /* ----------------------------------------------------
...@@ -1440,120 +1414,6 @@ int i2c_check_functionality (struct i2c_adapter *adap, u32 func) ...@@ -1440,120 +1414,6 @@ int i2c_check_functionality (struct i2c_adapter *adap, u32 func)
return (func & adap_func) == 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_add_adapter);
EXPORT_SYMBOL(i2c_del_adapter); EXPORT_SYMBOL(i2c_del_adapter);
EXPORT_SYMBOL(i2c_add_driver); EXPORT_SYMBOL(i2c_add_driver);
...@@ -1594,9 +1454,7 @@ EXPORT_SYMBOL(i2c_check_functionality); ...@@ -1594,9 +1454,7 @@ EXPORT_SYMBOL(i2c_check_functionality);
MODULE_AUTHOR("Simon G. Vogl <simon@tk.uni-linz.ac.at>"); MODULE_AUTHOR("Simon G. Vogl <simon@tk.uni-linz.ac.at>");
MODULE_DESCRIPTION("I2C-Bus main module"); MODULE_DESCRIPTION("I2C-Bus main module");
MODULE_PARM(i2c_debug, "i");
MODULE_PARM_DESC(i2c_debug,"debug level");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
module_init(i2c_init); MODULE_PARM(i2c_debug, "i");
module_exit(i2c_exit); MODULE_PARM_DESC(i2c_debug,"debug level");
...@@ -48,10 +48,6 @@ ...@@ -48,10 +48,6 @@
#include <linux/i2c.h> #include <linux/i2c.h>
#include <linux/i2c-dev.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 */ /* 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, 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, ...@@ -437,19 +433,6 @@ static int i2cdev_command(struct i2c_client *client, unsigned int cmd,
return -1; 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 __init i2c_dev_init(void)
{ {
int res; int res;
...@@ -471,13 +454,13 @@ int __init i2c_dev_init(void) ...@@ -471,13 +454,13 @@ int __init i2c_dev_init(void)
return 0; 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_AUTHOR("Frodo Looijaard <frodol@dds.nl> and Simon G. Vogl <simon@tk.uni-linz.ac.at>");
MODULE_DESCRIPTION("I2C /dev entries driver"); MODULE_DESCRIPTION("I2C /dev entries driver");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
......
...@@ -159,19 +159,6 @@ static int pcf_isa_init(void) ...@@ -159,19 +159,6 @@ static int pcf_isa_init(void)
return 0; 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) static int pcf_isa_reg(struct i2c_client *client)
{ {
return 0; return 0;
...@@ -223,7 +210,7 @@ static struct i2c_adapter pcf_isa_ops = { ...@@ -223,7 +210,7 @@ static struct i2c_adapter pcf_isa_ops = {
.client_unregister = pcf_isa_unreg, .client_unregister = pcf_isa_unreg,
}; };
int __init i2c_pcfisa_init(void) static int __init i2c_pcfisa_init(void)
{ {
#ifdef __alpha__ #ifdef __alpha__
/* check to see we have memory mapped PCF8584 connected to the /* check to see we have memory mapped PCF8584 connected to the
...@@ -281,23 +268,39 @@ int __init i2c_pcfisa_init(void) ...@@ -281,23 +268,39 @@ int __init i2c_pcfisa_init(void)
} }
init_waitqueue_head(&pcf_wait); init_waitqueue_head(&pcf_wait);
if (pcf_isa_init() == 0) { if (pcf_isa_init())
if (i2c_pcf_add_bus(&pcf_isa_ops) < 0) {
pcf_isa_exit();
return -ENODEV;
}
} else {
return -ENODEV; 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); printk(KERN_ERR "i2c-elektor.o: found device at %#x.\n", base);
return 0; 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_AUTHOR("Hans Berglund <hb@spacetec.no>");
MODULE_DESCRIPTION("I2C-Bus adapter routines for PCF8584 ISA bus adapter"); MODULE_DESCRIPTION("I2C-Bus adapter routines for PCF8584 ISA bus adapter");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
...@@ -309,15 +312,5 @@ MODULE_PARM(own, "i"); ...@@ -309,15 +312,5 @@ MODULE_PARM(own, "i");
MODULE_PARM(mmapped, "i"); MODULE_PARM(mmapped, "i");
MODULE_PARM(i2c_debug, "i"); MODULE_PARM(i2c_debug, "i");
int init_module(void) module_init(i2c_pcfisa_init);
{ module_exit(i2c_pcfisa_exit);
return i2c_pcfisa_init();
}
void cleanup_module(void)
{
i2c_pcf_del_bus(&pcf_isa_ops);
pcf_isa_exit();
}
#endif
...@@ -113,11 +113,6 @@ static int bit_elv_init(void) ...@@ -113,11 +113,6 @@ static int bit_elv_init(void)
return 0; 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) static int bit_elv_reg(struct i2c_client *client)
{ {
return 0; return 0;
...@@ -166,7 +161,7 @@ static struct i2c_adapter bit_elv_ops = { ...@@ -166,7 +161,7 @@ static struct i2c_adapter bit_elv_ops = {
bit_elv_unreg, 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); printk(KERN_INFO "i2c-elv.o: i2c ELV parallel port adapter module version %s (%s)\n", I2C_VERSION, I2C_DATE);
if (base==0) { if (base==0) {
...@@ -192,24 +187,17 @@ int __init i2c_bitelv_init(void) ...@@ -192,24 +187,17 @@ int __init i2c_bitelv_init(void)
return 0; 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_AUTHOR("Simon G. Vogl <simon@tk.uni-linz.ac.at>");
MODULE_DESCRIPTION("I2C-Bus adapter routines for ELV parallel port adapter"); MODULE_DESCRIPTION("I2C-Bus adapter routines for ELV parallel port adapter");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_PARM(base, "i"); MODULE_PARM(base, "i");
int init_module(void) module_init(i2c_bitelv_init);
{ module_exit(i2c_bitelv_exit);
return i2c_bitelv_init();
}
void cleanup_module(void)
{
i2c_bit_del_bus(&bit_elv_ops);
bit_elv_exit();
}
#endif
...@@ -96,8 +96,6 @@ static int __init i2c_frodo_init (void) ...@@ -96,8 +96,6 @@ static int __init i2c_frodo_init (void)
return (i2c_bit_add_bus (&frodo_ops)); return (i2c_bit_add_bus (&frodo_ops));
} }
EXPORT_NO_SYMBOLS;
static void __exit i2c_frodo_exit (void) static void __exit i2c_frodo_exit (void)
{ {
i2c_bit_del_bus (&frodo_ops); i2c_bit_del_bus (&frodo_ops);
...@@ -105,12 +103,7 @@ static void __exit i2c_frodo_exit (void) ...@@ -105,12 +103,7 @@ static void __exit i2c_frodo_exit (void)
MODULE_AUTHOR ("Abraham van der Merwe <abraham@2d3d.co.za>"); MODULE_AUTHOR ("Abraham van der Merwe <abraham@2d3d.co.za>");
MODULE_DESCRIPTION ("I2C-Bus adapter routines for Frodo"); MODULE_DESCRIPTION ("I2C-Bus adapter routines for Frodo");
#ifdef MODULE_LICENSE
MODULE_LICENSE ("GPL"); MODULE_LICENSE ("GPL");
#endif /* #ifdef MODULE_LICENSE */
EXPORT_NO_SYMBOLS;
module_init (i2c_frodo_init); module_init (i2c_frodo_init);
module_exit (i2c_frodo_exit); module_exit (i2c_frodo_exit);
......
...@@ -297,14 +297,5 @@ MODULE_LICENSE("GPL"); ...@@ -297,14 +297,5 @@ MODULE_LICENSE("GPL");
MODULE_PARM(type, "i"); MODULE_PARM(type, "i");
#ifdef MODULE module_init(i2c_bitlp_init);
int init_module(void) module_exit(i2c_bitlp_exit);
{
return i2c_bitlp_init();
}
void cleanup_module(void)
{
i2c_bitlp_exit();
}
#endif
...@@ -40,10 +40,6 @@ ...@@ -40,10 +40,6 @@
#define THIS_MODULE NULL #define THIS_MODULE NULL
#endif #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, static int i2c_create_name(char **name, const char *prefix,
struct i2c_adapter *adapter, int addr); struct i2c_adapter *adapter, int addr);
static int i2c_parse_reals(int *nrels, void *buffer, int bufsize, static int i2c_parse_reals(int *nrels, void *buffer, int bufsize,
...@@ -92,7 +88,6 @@ static ctl_table i2c_proc[] = { ...@@ -92,7 +88,6 @@ static ctl_table i2c_proc[] = {
static struct ctl_table_header *i2c_proc_header; 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 /* 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 (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, ...@@ -848,10 +843,9 @@ int i2c_detect(struct i2c_adapter *adapter,
return 0; 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); printk(KERN_INFO "i2c-proc.o version %s (%s)\n", I2C_VERSION, I2C_DATE);
i2c_initialized = 0;
if (! if (!
(i2c_proc_header = (i2c_proc_header =
register_sysctl_table(i2c_proc, 0))) { register_sysctl_table(i2c_proc, 0))) {
...@@ -859,22 +853,12 @@ int __init sensors_init(void) ...@@ -859,22 +853,12 @@ int __init sensors_init(void)
return -EPERM; return -EPERM;
} }
i2c_proc_header->ctl_table->child->de->owner = THIS_MODULE; i2c_proc_header->ctl_table->child->de->owner = THIS_MODULE;
i2c_initialized++;
return 0; return 0;
} }
void __exit i2c_proc_exit(void) static void __exit i2c_proc_exit(void)
{
proc_cleanup();
}
static int proc_cleanup(void)
{ {
if (i2c_initialized >= 1) { unregister_sysctl_table(i2c_proc_header);
unregister_sysctl_table(i2c_proc_header);
i2c_initialized--;
}
return 0;
} }
EXPORT_SYMBOL(i2c_deregister_entry); EXPORT_SYMBOL(i2c_deregister_entry);
...@@ -887,5 +871,5 @@ MODULE_AUTHOR("Frodo Looijaard <frodol@dds.nl>"); ...@@ -887,5 +871,5 @@ MODULE_AUTHOR("Frodo Looijaard <frodol@dds.nl>");
MODULE_DESCRIPTION("i2c-proc driver"); MODULE_DESCRIPTION("i2c-proc driver");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
module_init(sensors_init); module_init(i2c_proc_init);
module_exit(i2c_proc_exit); module_exit(i2c_proc_exit);
...@@ -126,11 +126,8 @@ void __exit i2c_rpx_exit(void) ...@@ -126,11 +126,8 @@ void __exit i2c_rpx_exit(void)
i2c_8xx_del_bus(&rpx_ops); i2c_8xx_del_bus(&rpx_ops);
} }
#ifdef MODULE
MODULE_AUTHOR("Dan Malek <dmalek@jlc.net>"); MODULE_AUTHOR("Dan Malek <dmalek@jlc.net>");
MODULE_DESCRIPTION("I2C-Bus adapter routines for MPC8xx boards"); MODULE_DESCRIPTION("I2C-Bus adapter routines for MPC8xx boards");
module_init(i2c_rpx_init); module_init(i2c_rpx_init);
module_exit(i2c_rpx_exit); module_exit(i2c_rpx_exit);
#endif
...@@ -102,12 +102,6 @@ static int bit_velle_init(void) ...@@ -102,12 +102,6 @@ static int bit_velle_init(void)
return 0; 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) static int bit_velle_reg(struct i2c_client *client)
{ {
return 0; return 0;
...@@ -157,7 +151,7 @@ static struct i2c_adapter bit_velle_ops = { ...@@ -157,7 +151,7 @@ static struct i2c_adapter bit_velle_ops = {
bit_velle_unreg, 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); printk(KERN_INFO "i2c-velleman.o: i2c Velleman K8000 adapter module version %s (%s)\n", I2C_VERSION, I2C_DATE);
if (base==0) { if (base==0) {
...@@ -183,22 +177,17 @@ int __init i2c_bitvelle_init(void) ...@@ -183,22 +177,17 @@ int __init i2c_bitvelle_init(void)
return 0; 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_AUTHOR("Simon G. Vogl <simon@tk.uni-linz.ac.at>");
MODULE_DESCRIPTION("I2C-Bus adapter routines for Velleman K8000 adapter"); MODULE_DESCRIPTION("I2C-Bus adapter routines for Velleman K8000 adapter");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_PARM(base, "i"); MODULE_PARM(base, "i");
int init_module(void) module_init(i2c_bitvelle_init);
{ module_exit(i2c_bitvelle_exit);
return i2c_bitvelle_init();
}
void cleanup_module(void)
{
i2c_bit_del_bus(&bit_velle_ops);
bit_velle_exit();
}
#endif
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