Commit c27b73b3 authored by Linus Torvalds's avatar Linus Torvalds

Merge bk://kernel.bkbits.net/gregkh/linux/i2c-2.6

into ppc970.osdl.org:/home/torvalds/v2.5/linux
parents 387f6b76 60d8593b
This diff is collapsed.
...@@ -15,9 +15,6 @@ config I2C ...@@ -15,9 +15,6 @@ config I2C
Both I2C and SMBus are supported here. You will need this for Both I2C and SMBus are supported here. You will need this for
hardware sensors support, and also for Video For Linux support. hardware sensors support, and also for Video For Linux support.
Specifically, if you want to use a BT848 based frame grabber/overlay
boards under Linux, say Y here and also to "I2C bit-banging
interfaces", below.
If you want I2C support, you should say Y here and also to the If you want I2C support, you should say Y here and also to the
specific driver for your bus adapter(s) below. specific driver for your bus adapter(s) below.
...@@ -49,6 +46,15 @@ config I2C_DEBUG_CORE ...@@ -49,6 +46,15 @@ config I2C_DEBUG_CORE
messages to the system log. Select this if you are having a messages to the system log. Select this if you are having a
problem with I2C support and want to see more of what is going on. problem with I2C support and want to see more of what is going on.
config I2C_DEBUG_ALGO
bool "I2C Algorithm debugging messages"
depends on I2C
help
Say Y here if you want the I2C algorithm drivers to produce a bunch
of debug messages to the system log. Select this if you are having
a problem with I2C support and want to see more of what is going
on.
config I2C_DEBUG_BUS config I2C_DEBUG_BUS
bool "I2C Bus debugging messages" bool "I2C Bus debugging messages"
depends on I2C depends on I2C
......
...@@ -6,3 +6,7 @@ obj-$(CONFIG_I2C) += i2c-core.o ...@@ -6,3 +6,7 @@ obj-$(CONFIG_I2C) += i2c-core.o
obj-$(CONFIG_I2C_CHARDEV) += i2c-dev.o obj-$(CONFIG_I2C_CHARDEV) += i2c-dev.o
obj-$(CONFIG_I2C_SENSOR) += i2c-sensor.o obj-$(CONFIG_I2C_SENSOR) += i2c-sensor.o
obj-y += busses/ chips/ algos/ obj-y += busses/ chips/ algos/
ifeq ($(CONFIG_I2C_DEBUG_CORE),y)
EXTRA_CFLAGS += -DDEBUG
endif
...@@ -5,3 +5,7 @@ ...@@ -5,3 +5,7 @@
obj-$(CONFIG_I2C_ALGOBIT) += i2c-algo-bit.o obj-$(CONFIG_I2C_ALGOBIT) += i2c-algo-bit.o
obj-$(CONFIG_I2C_ALGOPCF) += i2c-algo-pcf.o obj-$(CONFIG_I2C_ALGOPCF) += i2c-algo-pcf.o
obj-$(CONFIG_I2C_ALGOITE) += i2c-algo-ite.o obj-$(CONFIG_I2C_ALGOITE) += i2c-algo-ite.o
ifeq ($(CONFIG_I2C_DEBUG_ALGO),y)
EXTRA_CFLAGS += -DDEBUG
endif
...@@ -21,8 +21,6 @@ ...@@ -21,8 +21,6 @@
/* With some changes from Frodo Looijaard <frodol@dds.nl>, Kysti Mlkki /* With some changes from Frodo Looijaard <frodol@dds.nl>, Kysti Mlkki
<kmalkki@cc.hut.fi> and Jean Delvare <khali@linux-fr.org> */ <kmalkki@cc.hut.fi> and Jean Delvare <khali@linux-fr.org> */
/* #define DEBUG 1 */
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/delay.h> #include <linux/delay.h>
......
...@@ -27,8 +27,6 @@ ...@@ -27,8 +27,6 @@
messages, proper stop/repstart signaling during receive, messages, proper stop/repstart signaling during receive,
added detect code */ added detect code */
/* #define DEBUG 1 */ /* to pick up dev_dbg calls */
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/delay.h> #include <linux/delay.h>
......
...@@ -58,17 +58,6 @@ config I2C_ELEKTOR ...@@ -58,17 +58,6 @@ config I2C_ELEKTOR
This support is also available as a module. If so, the module This support is also available as a module. If so, the module
will be called i2c-elektor. will be called i2c-elektor.
config I2C_ELV
tristate "ELV adapter"
depends on I2C
select I2C_ALGOBIT
help
This supports parallel-port I2C adapters called ELV. Say Y if you
own such an adapter.
This support is also available as a module. If so, the module
will be called i2c-elv.
config I2C_HYDRA config I2C_HYDRA
tristate "CHRP Apple Hydra Mac I/O I2C interface" tristate "CHRP Apple Hydra Mac I/O I2C interface"
depends on I2C && PCI && PPC_CHRP && EXPERIMENTAL depends on I2C && PCI && PPC_CHRP && EXPERIMENTAL
...@@ -144,6 +133,17 @@ config I2C_ITE ...@@ -144,6 +133,17 @@ config I2C_ITE
This support is also available as a module. If so, the module This support is also available as a module. If so, the module
will be called i2c-ite. will be called i2c-ite.
config I2C_IXP42X
tristate "IXP42x GPIO-Based I2C Interface"
depends on I2C && ARCH_IXP425
select I2C_ALGOBIT
help
Say Y here if you have an Intel IXP42x(420,421,422,425) based
system and are using GPIO lines for an I2C bus.
This support is also available as a module. If so, the module
will be called i2c-ixp42x.
config I2C_KEYWEST config I2C_KEYWEST
tristate "Powermac Keywest I2C interface" tristate "Powermac Keywest I2C interface"
depends on I2C && PPC_PMAC depends on I2C && PPC_PMAC
...@@ -164,16 +164,6 @@ config I2C_NFORCE2 ...@@ -164,16 +164,6 @@ config I2C_NFORCE2
This driver can also be built as a module. If so, the module This driver can also be built as a module. If so, the module
will be called i2c-nforce2. will be called i2c-nforce2.
config I2C_PHILIPSPAR
tristate "Philips style parallel port adapter"
depends on I2C && PARPORT
select I2C_ALGOBIT
help
This supports parallel-port I2C adapters made by Philips.
This support is also available as a module. If so, the module
will be called i2c-philips-par.
config I2C_PARPORT config I2C_PARPORT
tristate "Parallel port adapter" tristate "Parallel port adapter"
depends on I2C && PARPORT depends on I2C && PARPORT
...@@ -343,17 +333,6 @@ config I2C_SIS96X ...@@ -343,17 +333,6 @@ config I2C_SIS96X
This driver can also be built as a module. If so, the module This driver can also be built as a module. If so, the module
will be called i2c-sis96x. will be called i2c-sis96x.
config I2C_VELLEMAN
tristate "Velleman K8000 adapter"
depends on I2C
select I2C_ALGOBIT
help
This supports the Velleman K8000 parallel-port I2C adapter. Say Y
if you own such an adapter.
This support is also available as a module. If so, the module
will be called i2c-velleman.
config I2C_VIA config I2C_VIA
tristate "VIA 82C586B" tristate "VIA 82C586B"
depends on I2C && PCI && EXPERIMENTAL depends on I2C && PCI && EXPERIMENTAL
......
...@@ -7,7 +7,6 @@ obj-$(CONFIG_I2C_ALI15X3) += i2c-ali15x3.o ...@@ -7,7 +7,6 @@ obj-$(CONFIG_I2C_ALI15X3) += i2c-ali15x3.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
obj-$(CONFIG_I2C_ELEKTOR) += i2c-elektor.o obj-$(CONFIG_I2C_ELEKTOR) += i2c-elektor.o
obj-$(CONFIG_I2C_ELV) += i2c-elv.o
obj-$(CONFIG_I2C_HYDRA) += i2c-hydra.o obj-$(CONFIG_I2C_HYDRA) += i2c-hydra.o
obj-$(CONFIG_I2C_I801) += i2c-i801.o obj-$(CONFIG_I2C_I801) += i2c-i801.o
obj-$(CONFIG_I2C_I810) += i2c-i810.o obj-$(CONFIG_I2C_I810) += i2c-i810.o
...@@ -15,9 +14,9 @@ obj-$(CONFIG_I2C_IBM_IIC) += i2c-ibm_iic.o ...@@ -15,9 +14,9 @@ obj-$(CONFIG_I2C_IBM_IIC) += i2c-ibm_iic.o
obj-$(CONFIG_I2C_IOP3XX) += i2c-iop3xx.o obj-$(CONFIG_I2C_IOP3XX) += i2c-iop3xx.o
obj-$(CONFIG_I2C_ISA) += i2c-isa.o obj-$(CONFIG_I2C_ISA) += i2c-isa.o
obj-$(CONFIG_I2C_ITE) += i2c-ite.o obj-$(CONFIG_I2C_ITE) += i2c-ite.o
obj-$(CONFIG_I2C_IXP42X) += i2c-ixp42x.o
obj-$(CONFIG_I2C_KEYWEST) += i2c-keywest.o obj-$(CONFIG_I2C_KEYWEST) += i2c-keywest.o
obj-$(CONFIG_I2C_NFORCE2) += i2c-nforce2.o obj-$(CONFIG_I2C_NFORCE2) += i2c-nforce2.o
obj-$(CONFIG_I2C_PHILIPSPAR) += i2c-philips-par.o
obj-$(CONFIG_I2C_PARPORT) += i2c-parport.o obj-$(CONFIG_I2C_PARPORT) += i2c-parport.o
obj-$(CONFIG_I2C_PARPORT_LIGHT) += i2c-parport-light.o obj-$(CONFIG_I2C_PARPORT_LIGHT) += i2c-parport-light.o
obj-$(CONFIG_I2C_PIIX4) += i2c-piix4.o obj-$(CONFIG_I2C_PIIX4) += i2c-piix4.o
...@@ -27,9 +26,12 @@ obj-$(CONFIG_I2C_SAVAGE4) += i2c-savage4.o ...@@ -27,9 +26,12 @@ obj-$(CONFIG_I2C_SAVAGE4) += i2c-savage4.o
obj-$(CONFIG_I2C_SIS5595) += i2c-sis5595.o obj-$(CONFIG_I2C_SIS5595) += i2c-sis5595.o
obj-$(CONFIG_I2C_SIS630) += i2c-sis630.o obj-$(CONFIG_I2C_SIS630) += i2c-sis630.o
obj-$(CONFIG_I2C_SIS96X) += i2c-sis96x.o obj-$(CONFIG_I2C_SIS96X) += i2c-sis96x.o
obj-$(CONFIG_I2C_VELLEMAN) += i2c-velleman.o
obj-$(CONFIG_I2C_VIA) += i2c-via.o obj-$(CONFIG_I2C_VIA) += i2c-via.o
obj-$(CONFIG_I2C_VIAPRO) += i2c-viapro.o obj-$(CONFIG_I2C_VIAPRO) += i2c-viapro.o
obj-$(CONFIG_I2C_VOODOO3) += i2c-voodoo3.o obj-$(CONFIG_I2C_VOODOO3) += i2c-voodoo3.o
obj-$(CONFIG_SCx200_ACB) += scx200_acb.o obj-$(CONFIG_SCx200_ACB) += scx200_acb.o
obj-$(CONFIG_SCx200_I2C) += scx200_i2c.o obj-$(CONFIG_SCx200_I2C) += scx200_i2c.o
ifeq ($(CONFIG_I2C_DEBUG_BUS),y)
EXTRA_CFLAGS += -DDEBUG
endif
...@@ -54,10 +54,6 @@ ...@@ -54,10 +54,6 @@
/* Note: we assume there can only be one ALI1535, with one SMBus interface */ /* Note: we assume there can only be one ALI1535, with one SMBus interface */
#include <linux/config.h> #include <linux/config.h>
#ifdef CONFIG_I2C_DEBUG_BUS
#define DEBUG 1
#endif
#include <linux/module.h> #include <linux/module.h>
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/kernel.h> #include <linux/kernel.h>
...@@ -484,6 +480,7 @@ static struct i2c_algorithm smbus_algorithm = { ...@@ -484,6 +480,7 @@ static struct i2c_algorithm smbus_algorithm = {
static struct i2c_adapter ali1535_adapter = { static struct i2c_adapter ali1535_adapter = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.class = I2C_ADAP_CLASS_SMBUS,
.algo = &smbus_algorithm, .algo = &smbus_algorithm,
.name = "unset", .name = "unset",
}; };
...@@ -517,6 +514,7 @@ static int __devinit ali1535_probe(struct pci_dev *dev, const struct pci_device_ ...@@ -517,6 +514,7 @@ static int __devinit ali1535_probe(struct pci_dev *dev, const struct pci_device_
static void __devexit ali1535_remove(struct pci_dev *dev) static void __devexit ali1535_remove(struct pci_dev *dev)
{ {
i2c_del_adapter(&ali1535_adapter); i2c_del_adapter(&ali1535_adapter);
release_region(ali1535_smba, ALI1535_SMB_IOSIZE);
} }
static struct pci_driver ali1535_driver = { static struct pci_driver ali1535_driver = {
...@@ -534,7 +532,6 @@ static int __init i2c_ali1535_init(void) ...@@ -534,7 +532,6 @@ static int __init i2c_ali1535_init(void)
static void __exit i2c_ali1535_exit(void) static void __exit i2c_ali1535_exit(void)
{ {
pci_unregister_driver(&ali1535_driver); pci_unregister_driver(&ali1535_driver);
release_region(ali1535_smba, ALI1535_SMB_IOSIZE);
} }
MODULE_AUTHOR("Frodo Looijaard <frodol@dds.nl>, " MODULE_AUTHOR("Frodo Looijaard <frodol@dds.nl>, "
......
...@@ -61,10 +61,6 @@ ...@@ -61,10 +61,6 @@
/* Note: we assume there can only be one ALI15X3, with one SMBus interface */ /* Note: we assume there can only be one ALI15X3, with one SMBus interface */
#include <linux/config.h> #include <linux/config.h>
#ifdef CONFIG_I2C_DEBUG_BUS
#define DEBUG 1
#endif
#include <linux/module.h> #include <linux/module.h>
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/kernel.h> #include <linux/kernel.h>
......
...@@ -38,10 +38,6 @@ ...@@ -38,10 +38,6 @@
*/ */
#include <linux/config.h> #include <linux/config.h>
#ifdef CONFIG_I2C_DEBUG_BUS
#define DEBUG 1
#endif
#include <linux/module.h> #include <linux/module.h>
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/kernel.h> #include <linux/kernel.h>
......
...@@ -9,10 +9,6 @@ ...@@ -9,10 +9,6 @@
*/ */
#include <linux/config.h> #include <linux/config.h>
#ifdef CONFIG_I2C_DEBUG_BUS
#define DEBUG 1
#endif
#include <linux/module.h> #include <linux/module.h>
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/kernel.h> #include <linux/kernel.h>
......
...@@ -26,10 +26,6 @@ ...@@ -26,10 +26,6 @@
for Alpha Processor Inc. UP-2000(+) boards */ for Alpha Processor Inc. UP-2000(+) boards */
#include <linux/config.h> #include <linux/config.h>
#ifdef CONFIG_I2C_DEBUG_BUS
#define DEBUG 1
#endif
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/ioport.h> #include <linux/ioport.h>
#include <linux/module.h> #include <linux/module.h>
......
/* ------------------------------------------------------------------------- */
/* i2c-elv.c i2c-hw access for philips style parallel port adapters */
/* ------------------------------------------------------------------------- */
/* Copyright (C) 1995-2000 Simon G. Vogl
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. */
/* ------------------------------------------------------------------------- */
/* With some changes from Kysti Mlkki <kmalkki@cc.hut.fi> and even
Frodo Looijaard <frodol@dds.nl> */
#include <linux/config.h>
#ifdef CONFIG_I2C_DEBUG_BUS
#define DEBUG 1
#endif
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/delay.h>
#include <linux/slab.h>
#include <linux/init.h>
#include <linux/ioport.h>
#include <linux/errno.h>
#include <linux/i2c.h>
#include <linux/i2c-algo-bit.h>
#include <asm/io.h>
#define DEFAULT_BASE 0x378
static long base=0;
static unsigned char port_data = 0;
/* --- Convenience defines for the parallel port: */
#define BASE (unsigned long)(data)
#define DATA BASE /* Centronics data port */
#define STAT (BASE+1) /* Centronics status port */
#define CTRL (BASE+2) /* Centronics control port */
/* ----- local functions ---------------------------------------------- */
static void bit_elv_setscl(void *data, int state)
{
if (state) {
port_data &= 0xfe;
} else {
port_data |=1;
}
outb(port_data, DATA);
}
static void bit_elv_setsda(void *data, int state)
{
if (state) {
port_data &=0xfd;
} else {
port_data |=2;
}
outb(port_data, DATA);
}
static int bit_elv_getscl(void *data)
{
return ( 0 == ( (inb_p(STAT)) & 0x08 ) );
}
static int bit_elv_getsda(void *data)
{
return ( 0 == ( (inb_p(STAT)) & 0x40 ) );
}
static int bit_elv_init(void)
{
if (!request_region(base, (base == 0x3bc) ? 3 : 8,
"i2c (ELV adapter)"))
return -ENODEV;
if (inb(base+1) & 0x80) { /* BUSY should be high */
pr_debug("i2c-elv: Busy was low.\n");
goto fail;
}
outb(0x0c,base+2); /* SLCT auf low */
udelay(400);
if (!(inb(base+1) && 0x10)) {
outb(0x04,base+2);
pr_debug("i2c-elv: Select was high.\n");
goto fail;
}
port_data = 0;
bit_elv_setsda((void*)base,1);
bit_elv_setscl((void*)base,1);
return 0;
fail:
release_region(base , (base == 0x3bc) ? 3 : 8);
return -ENODEV;
}
/* ------------------------------------------------------------------------
* Encapsulate the above functions in the correct operations structure.
* This is only done when more than one hardware adapter is supported.
*/
static struct i2c_algo_bit_data bit_elv_data = {
.setsda = bit_elv_setsda,
.setscl = bit_elv_setscl,
.getsda = bit_elv_getsda,
.getscl = bit_elv_getscl,
.udelay = 80,
.mdelay = 80,
.timeout = HZ
};
static struct i2c_adapter bit_elv_ops = {
.owner = THIS_MODULE,
.algo_data = &bit_elv_data,
.name = "ELV Parallel port adaptor",
};
static int __init i2c_bitelv_init(void)
{
printk(KERN_INFO "i2c ELV parallel port adapter driver\n");
if (base==0) {
/* probe some values */
base=DEFAULT_BASE;
bit_elv_data.data=(void*)DEFAULT_BASE;
if (bit_elv_init()==0) {
if(i2c_bit_add_bus(&bit_elv_ops) < 0)
return -ENODEV;
} else {
return -ENODEV;
}
} else {
i2c_set_adapdata(&bit_elv_ops, (void *)base);
if (bit_elv_init()==0) {
if(i2c_bit_add_bus(&bit_elv_ops) < 0)
return -ENODEV;
} else {
return -ENODEV;
}
}
pr_debug("i2c-elv: found device at %#lx.\n",base);
return 0;
}
static void __exit i2c_bitelv_exit(void)
{
i2c_bit_del_bus(&bit_elv_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 ELV parallel port adapter");
MODULE_LICENSE("GPL");
MODULE_PARM(base, "i");
module_init(i2c_bitelv_init);
module_exit(i2c_bitelv_exit);
...@@ -13,10 +13,6 @@ ...@@ -13,10 +13,6 @@
*/ */
#include <linux/config.h> #include <linux/config.h>
#ifdef CONFIG_I2C_DEBUG_BUS
#define DEBUG 1
#endif
#include <linux/module.h> #include <linux/module.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/init.h> #include <linux/init.h>
......
...@@ -39,10 +39,6 @@ ...@@ -39,10 +39,6 @@
/* Note: we assume there can only be one I801, with one SMBus interface */ /* Note: we assume there can only be one I801, with one SMBus interface */
#include <linux/config.h> #include <linux/config.h>
#ifdef CONFIG_I2C_DEBUG_BUS
#define DEBUG 1
#endif
#include <linux/module.h> #include <linux/module.h>
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/kernel.h> #include <linux/kernel.h>
...@@ -608,6 +604,7 @@ static int __devinit i801_probe(struct pci_dev *dev, const struct pci_device_id ...@@ -608,6 +604,7 @@ static int __devinit i801_probe(struct pci_dev *dev, const struct pci_device_id
static void __devexit i801_remove(struct pci_dev *dev) static void __devexit i801_remove(struct pci_dev *dev)
{ {
i2c_del_adapter(&i801_adapter); i2c_del_adapter(&i801_adapter);
release_region(i801_smba, (isich4 ? 16 : 8));
} }
static struct pci_driver i801_driver = { static struct pci_driver i801_driver = {
...@@ -625,7 +622,6 @@ static int __init i2c_i801_init(void) ...@@ -625,7 +622,6 @@ static int __init i2c_i801_init(void)
static void __exit i2c_i801_exit(void) static void __exit i2c_i801_exit(void)
{ {
pci_unregister_driver(&i801_driver); pci_unregister_driver(&i801_driver);
release_region(i801_smba, (isich4 ? 16 : 8));
} }
MODULE_AUTHOR ("Frodo Looijaard <frodol@dds.nl>, " MODULE_AUTHOR ("Frodo Looijaard <frodol@dds.nl>, "
......
...@@ -35,10 +35,6 @@ ...@@ -35,10 +35,6 @@
*/ */
#include <linux/config.h> #include <linux/config.h>
#ifdef CONFIG_I2C_DEBUG_BUS
#define DEBUG 1
#endif
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/init.h> #include <linux/init.h>
......
...@@ -29,10 +29,6 @@ ...@@ -29,10 +29,6 @@
*/ */
#include <linux/config.h> #include <linux/config.h>
#ifdef CONFIG_I2C_DEBUG_BUS
#define DEBUG 1
#endif
#include <linux/module.h> #include <linux/module.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/ioport.h> #include <linux/ioport.h>
......
...@@ -32,10 +32,6 @@ ...@@ -32,10 +32,6 @@
---------------------------------------------------------------------------*/ ---------------------------------------------------------------------------*/
#include <linux/config.h> #include <linux/config.h>
#ifdef CONFIG_I2C_DEBUG_BUS
#define DEBUG 1
#endif
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/module.h> #include <linux/module.h>
...@@ -129,7 +125,7 @@ static void iop3xx_adap_final_cleanup(struct i2c_algo_iop3xx_data *iop3xx_adap) ...@@ -129,7 +125,7 @@ static void iop3xx_adap_final_cleanup(struct i2c_algo_iop3xx_data *iop3xx_adap)
* NB: the handler has to clear the source of the interrupt! * NB: the handler has to clear the source of the interrupt!
* Then it passes the SR flags of interest to BH via adap data * Then it passes the SR flags of interest to BH via adap data
*/ */
static void iop3xx_i2c_handler(int this_irq, static irqreturn_t iop3xx_i2c_handler(int this_irq,
void *dev_id, void *dev_id,
struct pt_regs *regs) struct pt_regs *regs)
{ {
...@@ -142,6 +138,7 @@ static void iop3xx_i2c_handler(int this_irq, ...@@ -142,6 +138,7 @@ static void iop3xx_i2c_handler(int this_irq,
iop3xx_adap->biu->SR_received |= sr; iop3xx_adap->biu->SR_received |= sr;
wake_up_interruptible(&iop3xx_adap->waitq); wake_up_interruptible(&iop3xx_adap->waitq);
} }
return IRQ_HANDLED;
} }
/* check all error conditions, clear them , report most important */ /* check all error conditions, clear them , report most important */
...@@ -185,7 +182,7 @@ static int iop3xx_adap_wait_event(struct i2c_algo_iop3xx_data *iop3xx_adap, ...@@ -185,7 +182,7 @@ static int iop3xx_adap_wait_event(struct i2c_algo_iop3xx_data *iop3xx_adap,
unsigned sr = 0; unsigned sr = 0;
int interrupted; int interrupted;
int done; int done;
int rc; int rc = 0;
do { do {
interrupted = wait_event_interruptible_timeout ( interrupted = wait_event_interruptible_timeout (
...@@ -198,13 +195,13 @@ static int iop3xx_adap_wait_event(struct i2c_algo_iop3xx_data *iop3xx_adap, ...@@ -198,13 +195,13 @@ static int iop3xx_adap_wait_event(struct i2c_algo_iop3xx_data *iop3xx_adap,
return rc; return rc;
}else if (!interrupted) { }else if (!interrupted) {
*status = sr; *status = sr;
return rc = -ETIMEDOUT; return -ETIMEDOUT;
} }
} while(!done); } while(!done);
*status = sr; *status = sr;
return rc = 0; return 0;
} }
/* /*
...@@ -284,7 +281,7 @@ static int iop3xx_adap_write_byte(struct i2c_algo_iop3xx_data *iop3xx_adap, char ...@@ -284,7 +281,7 @@ static int iop3xx_adap_write_byte(struct i2c_algo_iop3xx_data *iop3xx_adap, char
{ {
unsigned cr = *iop3xx_adap->biu->CR; unsigned cr = *iop3xx_adap->biu->CR;
int status; int status;
int rc; int rc = 0;
*iop3xx_adap->biu->DBR = byte; *iop3xx_adap->biu->DBR = byte;
cr &= ~IOP321_ICR_MSTART; cr &= ~IOP321_ICR_MSTART;
...@@ -304,7 +301,7 @@ static int iop3xx_adap_read_byte(struct i2c_algo_iop3xx_data *iop3xx_adap, ...@@ -304,7 +301,7 @@ static int iop3xx_adap_read_byte(struct i2c_algo_iop3xx_data *iop3xx_adap,
{ {
unsigned cr = *iop3xx_adap->biu->CR; unsigned cr = *iop3xx_adap->biu->CR;
int status; int status;
int rc; int rc = 0;
cr &= ~IOP321_ICR_MSTART; cr &= ~IOP321_ICR_MSTART;
...@@ -386,13 +383,16 @@ static int iop3xx_master_xfer(struct i2c_adapter *i2c_adap, struct i2c_msg msgs[ ...@@ -386,13 +383,16 @@ static int iop3xx_master_xfer(struct i2c_adapter *i2c_adap, struct i2c_msg msgs[
iop3xx_adap_reset(iop3xx_adap); iop3xx_adap_reset(iop3xx_adap);
iop3xx_adap_enable(iop3xx_adap); iop3xx_adap_enable(iop3xx_adap);
for (im = 0; ret == 0 && im != num; ++im) { for (im = 0; ret == 0 && im != num; im++) {
ret = iop3xx_handle_msg(i2c_adap, &msgs[im]); ret = iop3xx_handle_msg(i2c_adap, &msgs[im]);
} }
iop3xx_adap_transaction_cleanup(iop3xx_adap); iop3xx_adap_transaction_cleanup(iop3xx_adap);
if(ret)
return ret;
return ret; return im;
} }
static int algo_control(struct i2c_adapter *adapter, unsigned int cmd, static int algo_control(struct i2c_adapter *adapter, unsigned int cmd,
......
...@@ -25,10 +25,6 @@ ...@@ -25,10 +25,6 @@
of this. */ of this. */
#include <linux/config.h> #include <linux/config.h>
#ifdef CONFIG_I2C_DEBUG_BUS
#define DEBUG 1
#endif
#include <linux/init.h> #include <linux/init.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/kernel.h> #include <linux/kernel.h>
......
...@@ -34,10 +34,6 @@ ...@@ -34,10 +34,6 @@
Frodo Looijaard <frodol@dds.nl> */ Frodo Looijaard <frodol@dds.nl> */
#include <linux/config.h> #include <linux/config.h>
#ifdef CONFIG_I2C_DEBUG_BUS
#define DEBUG 1
#endif
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/ioport.h> #include <linux/ioport.h>
#include <linux/module.h> #include <linux/module.h>
......
/*
* drivers/i2c/i2c-adap-ixp42x.c
*
* Intel's IXP42x XScale NPU chipsets (IXP420, 421, 422, 425) do not have
* an on board I2C controller but provide 16 GPIO pins that are often
* used to create an I2C bus. This driver provides an i2c_adapter
* interface that plugs in under algo_bit and drives the GPIO pins
* as instructed by the alogorithm driver.
*
* Author: Deepak Saxena <dsaxena@plexity.net>
*
* Copyright (c) 2003-2004 MontaVista Software Inc.
*
* This file is licensed under the terms of the GNU General Public
* License version 2. This program is licensed "as is" without any
* warranty of any kind, whether express or implied.
*
* NOTE: Since different platforms will use different GPIO pins for
* I2C, this driver uses an IXP42x-specific platform_data
* pointer to pass the GPIO numbers to the driver. This
* allows us to support all the different IXP42x platforms
* w/o having to put #ifdefs in this driver.
*
* See arch/arm/mach-ixp42x/ixdp425.c for an example of building a
* device list and filling in the ixp42x_i2c_pins data structure
* that is passed as the platform_data to this driver.
*/
#include <linux/config.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/device.h>
#include <linux/module.h>
#include <linux/i2c.h>
#include <asm/hardware.h> /* Pick up IXP42x-specific bits */
static inline int ixp42x_scl_pin(void *data)
{
return ((struct ixp42x_i2c_pins*)data)->scl_pin;
}
static inline int ixp42x_sda_pin(void *data)
{
return ((struct ixp42x_i2c_pins*)data)->sda_pin;
}
static void ixp42x_bit_setscl(void *data, int val)
{
gpio_line_set(ixp42x_scl_pin(data), 0);
gpio_line_config(ixp42x_scl_pin(data),
val ? IXP425_GPIO_IN : IXP425_GPIO_OUT );
}
static void ixp42x_bit_setsda(void *data, int val)
{
gpio_line_set(ixp42x_sda_pin(data), 0);
gpio_line_config(ixp42x_sda_pin(data),
val ? IXP425_GPIO_IN : IXP425_GPIO_OUT );
}
static int ixp42x_bit_getscl(void *data)
{
int scl;
gpio_line_config(ixp42x_scl_pin(data), IXP425_GPIO_IN );
gpio_line_get(ixp42x_scl_pin(data), &scl);
return scl;
}
static int ixp42x_bit_getsda(void *data)
{
int sda;
gpio_line_config(ixp42x_sda_pin(data), IXP425_GPIO_IN );
gpio_line_get(ixp42x_sda_pin(data), &sda);
return sda;
}
struct ixp42x_i2c_data {
struct ixp42x_i2c_pins *gpio_pins;
struct i2c_adapter adapter;
struct i2c_algo_bit_data algo_data;
};
static int ixp42x_i2c_remove(struct device *dev)
{
struct platform_device *plat_dev = to_platform_device(dev);
struct ixp42x_i2c_data *drv_data = dev_get_drvdata(&plat_dev->dev);
dev_set_drvdata(&plat_dev->dev, NULL);
i2c_bit_del_bus(&drv_data->adapter);
kfree(drv_data);
return 0;
}
static int ixp42x_i2c_probe(struct device *dev)
{
int err;
struct platform_device *plat_dev = to_platform_device(dev);
struct ixp42x_i2c_pins *gpio = plat_dev->dev.platform_data;
struct ixp42x_i2c_data *drv_data =
kmalloc(sizeof(struct ixp42x_i2c_data), GFP_KERNEL);
if(!drv_data)
return -ENOMEM;
memzero(drv_data, sizeof(struct ixp42x_i2c_data));
drv_data->gpio_pins = gpio;
/*
* We could make a lot of these structures static, but
* certain platforms may have multiple GPIO-based I2C
* buses for various device domains, so we need per-device
* algo_data->data.
*/
drv_data->algo_data.data = gpio;
drv_data->algo_data.setsda = ixp42x_bit_setsda;
drv_data->algo_data.setscl = ixp42x_bit_setscl;
drv_data->algo_data.getsda = ixp42x_bit_getsda;
drv_data->algo_data.getscl = ixp42x_bit_getscl;
drv_data->algo_data.udelay = 10;
drv_data->algo_data.mdelay = 10;
drv_data->algo_data.timeout = 100;
drv_data->adapter.id = I2C_HW_B_IXP425,
drv_data->adapter.algo_data = &drv_data->algo_data,
drv_data->adapter.dev.parent = &plat_dev->dev;
gpio_line_config(gpio->scl_pin, IXP425_GPIO_IN);
gpio_line_config(gpio->sda_pin, IXP425_GPIO_IN);
gpio_line_set(gpio->scl_pin, 0);
gpio_line_set(gpio->sda_pin, 0);
if ((err = i2c_bit_add_bus(&drv_data->adapter) != 0)) {
printk(KERN_ERR "ERROR: Could not install %s\n", dev->bus_id);
kfree(drv_data);
return err;
}
dev_set_drvdata(&plat_dev->dev, drv_data);
return 0;
}
static struct device_driver ixp42x_i2c_driver = {
.name = "IXP42X-I2C",
.bus = &platform_bus_type,
.probe = ixp42x_i2c_probe,
.remove = ixp42x_i2c_remove,
};
static int __init ixp42x_i2c_init(void)
{
return driver_register(&ixp42x_i2c_driver);
}
static void __exit ixp42x_i2c_exit(void)
{
driver_unregister(&ixp42x_i2c_driver);
}
module_init(ixp42x_i2c_init);
module_exit(ixp42x_i2c_exit);
MODULE_DESCRIPTION("GPIO-based I2C driver for IXP42x systems");
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Deepak Saxena <dsaxena@plexity.net>");
...@@ -47,10 +47,6 @@ ...@@ -47,10 +47,6 @@
*/ */
#include <linux/config.h> #include <linux/config.h>
#ifdef CONFIG_I2C_DEBUG_BUS
#define DEBUG 1
#endif
#include <linux/module.h> #include <linux/module.h>
#include <linux/config.h> #include <linux/config.h>
#include <linux/kernel.h> #include <linux/kernel.h>
......
...@@ -33,10 +33,6 @@ ...@@ -33,10 +33,6 @@
/* Note: we assume there can only be one nForce2, with two SMBus interfaces */ /* Note: we assume there can only be one nForce2, with two SMBus interfaces */
#include <linux/config.h> #include <linux/config.h>
#ifdef CONFIG_I2C_DEBUG_BUS
#define DEBUG 1
#endif
#include <linux/module.h> #include <linux/module.h>
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/kernel.h> #include <linux/kernel.h>
......
...@@ -25,10 +25,6 @@ ...@@ -25,10 +25,6 @@
* ------------------------------------------------------------------------ */ * ------------------------------------------------------------------------ */
#include <linux/config.h> #include <linux/config.h>
#ifdef CONFIG_I2C_DEBUG_BUS
#define DEBUG 1
#endif
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/init.h> #include <linux/init.h>
......
...@@ -25,10 +25,6 @@ ...@@ -25,10 +25,6 @@
* ------------------------------------------------------------------------ */ * ------------------------------------------------------------------------ */
#include <linux/config.h> #include <linux/config.h>
#ifdef CONFIG_I2C_DEBUG_BUS
#define DEBUG 1
#endif
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/init.h> #include <linux/init.h>
......
/* ------------------------------------------------------------------------- */
/* i2c-philips-par.c i2c-hw access for philips style parallel port adapters */
/* ------------------------------------------------------------------------- */
/* Copyright (C) 1995-2000 Simon G. Vogl
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. */
/* ------------------------------------------------------------------------- */
/* With some changes from Kysti Mlkki <kmalkki@cc.hut.fi> and even
Frodo Looijaard <frodol@dds.nl> */
#include <linux/config.h>
#ifdef CONFIG_I2C_DEBUG_BUS
#define DEBUG 1
#endif
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/parport.h>
#include <linux/i2c.h>
#include <linux/i2c-algo-bit.h>
static int type;
struct i2c_par
{
struct pardevice *pdev;
struct i2c_adapter adapter;
struct i2c_algo_bit_data bit_lp_data;
struct i2c_par *next;
};
static struct i2c_par *adapter_list;
/* ----- printer port defines ------------------------------------------*/
/* Pin Port Inverted name */
#define I2C_ON 0x20 /* 12 status N paper */
/* ... only for phil. not used */
#define I2C_SDA 0x80 /* 9 data N data7 */
#define I2C_SCL 0x08 /* 17 ctrl N dsel */
#define I2C_SDAIN 0x80 /* 11 stat Y busy */
#define I2C_SCLIN 0x08 /* 15 stat Y enable */
#define I2C_DMASK 0x7f
#define I2C_CMASK 0xf7
/* ----- local functions ---------------------------------------------- */
static void bit_lp_setscl(void *data, int state)
{
/*be cautious about state of the control register -
touch only the one bit needed*/
if (state) {
parport_write_control((struct parport *) data,
parport_read_control((struct parport *) data)|I2C_SCL);
} else {
parport_write_control((struct parport *) data,
parport_read_control((struct parport *) data)&I2C_CMASK);
}
}
static void bit_lp_setsda(void *data, int state)
{
if (state) {
parport_write_data((struct parport *) data, I2C_DMASK);
} else {
parport_write_data((struct parport *) data, I2C_SDA);
}
}
static int bit_lp_getscl(void *data)
{
return parport_read_status((struct parport *) data) & I2C_SCLIN;
}
static int bit_lp_getsda(void *data)
{
return parport_read_status((struct parport *) data) & I2C_SDAIN;
}
static void bit_lp_setscl2(void *data, int state)
{
if (state) {
parport_write_data((struct parport *) data,
parport_read_data((struct parport *) data)|0x1);
} else {
parport_write_data((struct parport *) data,
parport_read_data((struct parport *) data)&0xfe);
}
}
static void bit_lp_setsda2(void *data, int state)
{
if (state) {
parport_write_data((struct parport *) data,
parport_read_data((struct parport *) data)|0x2);
} else {
parport_write_data((struct parport *) data,
parport_read_data((struct parport *) data)&0xfd);
}
}
static int bit_lp_getsda2(void *data)
{
return (parport_read_status((struct parport *) data) &
PARPORT_STATUS_BUSY) ? 0 : 1;
}
/* ------------------------------------------------------------------------
* Encapsulate the above functions in the correct operations structure.
* This is only done when more than one hardware adapter is supported.
*/
static struct i2c_algo_bit_data bit_lp_data = {
.setsda = bit_lp_setsda,
.setscl = bit_lp_setscl,
.getsda = bit_lp_getsda,
.getscl = bit_lp_getscl,
.udelay = 80,
.mdelay = 80,
.timeout = HZ
};
static struct i2c_algo_bit_data bit_lp_data2 = {
.setsda = bit_lp_setsda2,
.setscl = bit_lp_setscl2,
.getsda = bit_lp_getsda2,
.udelay = 80,
.mdelay = 80,
.timeout = HZ
};
static struct i2c_adapter bit_lp_ops = {
.owner = THIS_MODULE,
.id = I2C_HW_B_LP,
.name = "Philips Parallel port adapter",
};
static void i2c_parport_attach (struct parport *port)
{
struct i2c_par *adapter = kmalloc(sizeof(struct i2c_par),
GFP_KERNEL);
if (!adapter) {
printk(KERN_ERR "i2c-philips-par: Unable to malloc.\n");
return;
}
memset (adapter, 0x00, sizeof(struct i2c_par));
/* pr_debug("i2c-philips-par: attaching to %s\n", port->name); */
adapter->pdev = parport_register_device(port, "i2c-philips-par",
NULL, NULL, NULL,
PARPORT_FLAG_EXCL,
NULL);
if (!adapter->pdev) {
printk(KERN_ERR "i2c-philips-par: Unable to register with parport.\n");
kfree(adapter);
return;
}
adapter->adapter = bit_lp_ops;
adapter->adapter.algo_data = &adapter->bit_lp_data;
adapter->bit_lp_data = type ? bit_lp_data2 : bit_lp_data;
adapter->bit_lp_data.data = port;
if (parport_claim_or_block(adapter->pdev) < 0 ) {
printk(KERN_ERR "i2c-philips-par: Could not claim parallel port.\n");
kfree(adapter);
return;
}
/* reset hardware to sane state */
adapter->bit_lp_data.setsda(port, 1);
adapter->bit_lp_data.setscl(port, 1);
parport_release(adapter->pdev);
if (i2c_bit_add_bus(&adapter->adapter) < 0) {
printk(KERN_ERR "i2c-philips-par: Unable to register with I2C.\n");
parport_unregister_device(adapter->pdev);
kfree(adapter);
return; /* No good */
}
adapter->next = adapter_list;
adapter_list = adapter;
}
static void i2c_parport_detach (struct parport *port)
{
struct i2c_par *adapter, *prev = NULL;
for (adapter = adapter_list; adapter; adapter = adapter->next) {
if (adapter->pdev->port == port) {
parport_unregister_device(adapter->pdev);
i2c_bit_del_bus(&adapter->adapter);
if (prev)
prev->next = adapter->next;
else
adapter_list = adapter->next;
kfree(adapter);
return;
}
prev = adapter;
}
}
static struct parport_driver i2c_driver = {
.name = "i2c-philips-par",
.attach = i2c_parport_attach,
.detach = i2c_parport_detach,
};
int __init i2c_bitlp_init(void)
{
printk(KERN_INFO "i2c Philips parallel port adapter driver\n");
return parport_register_driver(&i2c_driver);
}
void __exit i2c_bitlp_exit(void)
{
parport_unregister_driver(&i2c_driver);
}
MODULE_AUTHOR("Simon G. Vogl <simon@tk.uni-linz.ac.at>");
MODULE_DESCRIPTION("I2C-Bus adapter routines for Philips parallel port adapter");
MODULE_LICENSE("GPL");
MODULE_PARM(type, "i");
module_init(i2c_bitlp_init);
module_exit(i2c_bitlp_exit);
...@@ -29,10 +29,6 @@ ...@@ -29,10 +29,6 @@
*/ */
#include <linux/config.h> #include <linux/config.h>
#ifdef CONFIG_I2C_DEBUG_BUS
#define DEBUG 1
#endif
#include <linux/module.h> #include <linux/module.h>
#include <linux/moduleparam.h> #include <linux/moduleparam.h>
#include <linux/config.h> #include <linux/config.h>
......
...@@ -55,10 +55,6 @@ ...@@ -55,10 +55,6 @@
*/ */
#include <linux/config.h> #include <linux/config.h>
#ifdef CONFIG_I2C_DEBUG_BUS
#define DEBUG 1
#endif
#include <linux/module.h> #include <linux/module.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/pci.h> #include <linux/pci.h>
...@@ -216,7 +212,7 @@ static int i2c_register_bus(struct pci_dev *dev, struct s_i2c_bus *p, u8 *mmvga, ...@@ -216,7 +212,7 @@ static int i2c_register_bus(struct pci_dev *dev, struct s_i2c_bus *p, u8 *mmvga,
/* /*
* Cleanup stuff * Cleanup stuff
*/ */
static void __devexit prosavage_remove(struct pci_dev *dev) static void prosavage_remove(struct pci_dev *dev)
{ {
struct s_i2c_chip *chip; struct s_i2c_chip *chip;
int i, ret; int i, ret;
...@@ -321,7 +317,7 @@ static struct pci_driver prosavage_driver = { ...@@ -321,7 +317,7 @@ static struct pci_driver prosavage_driver = {
.name = "prosavage-smbus", .name = "prosavage-smbus",
.id_table = prosavage_pci_tbl, .id_table = prosavage_pci_tbl,
.probe = prosavage_probe, .probe = prosavage_probe,
.remove = __devexit_p(prosavage_remove), .remove = prosavage_remove,
}; };
static int __init i2c_prosavage_init(void) static int __init i2c_prosavage_init(void)
......
...@@ -12,10 +12,6 @@ ...@@ -12,10 +12,6 @@
*/ */
#include <linux/config.h> #include <linux/config.h>
#ifdef CONFIG_I2C_DEBUG_BUS
#define DEBUG 1
#endif
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/init.h> #include <linux/init.h>
......
...@@ -30,10 +30,6 @@ ...@@ -30,10 +30,6 @@
*/ */
#include <linux/config.h> #include <linux/config.h>
#ifdef CONFIG_I2C_DEBUG_BUS
#define DEBUG 1
#endif
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/init.h> #include <linux/init.h>
......
...@@ -56,10 +56,6 @@ ...@@ -56,10 +56,6 @@
*/ */
#include <linux/config.h> #include <linux/config.h>
#ifdef CONFIG_I2C_DEBUG_BUS
#define DEBUG 1
#endif
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/pci.h> #include <linux/pci.h>
...@@ -364,6 +360,7 @@ static struct i2c_algorithm smbus_algorithm = { ...@@ -364,6 +360,7 @@ static struct i2c_algorithm smbus_algorithm = {
static struct i2c_adapter sis5595_adapter = { static struct i2c_adapter sis5595_adapter = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.class = I2C_ADAP_CLASS_SMBUS,
.name = "unset", .name = "unset",
.algo = &smbus_algorithm, .algo = &smbus_algorithm,
}; };
...@@ -391,6 +388,7 @@ static int __devinit sis5595_probe(struct pci_dev *dev, const struct pci_device_ ...@@ -391,6 +388,7 @@ static int __devinit sis5595_probe(struct pci_dev *dev, const struct pci_device_
static void __devexit sis5595_remove(struct pci_dev *dev) static void __devexit sis5595_remove(struct pci_dev *dev)
{ {
i2c_del_adapter(&sis5595_adapter); i2c_del_adapter(&sis5595_adapter);
release_region(sis5595_base + SMB_INDEX, 2);
} }
static struct pci_driver sis5595_driver = { static struct pci_driver sis5595_driver = {
...@@ -408,7 +406,6 @@ static int __init i2c_sis5595_init(void) ...@@ -408,7 +406,6 @@ static int __init i2c_sis5595_init(void)
static void __exit i2c_sis5595_exit(void) static void __exit i2c_sis5595_exit(void)
{ {
pci_unregister_driver(&sis5595_driver); pci_unregister_driver(&sis5595_driver);
release_region(sis5595_base + SMB_INDEX, 2);
} }
MODULE_AUTHOR("Frodo Looijaard <frodol@dds.nl>"); MODULE_AUTHOR("Frodo Looijaard <frodol@dds.nl>");
......
...@@ -49,10 +49,6 @@ ...@@ -49,10 +49,6 @@
*/ */
#include <linux/config.h> #include <linux/config.h>
#ifdef CONFIG_I2C_DEBUG_BUS
#define DEBUG 1
#endif
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/pci.h> #include <linux/pci.h>
......
...@@ -33,10 +33,6 @@ ...@@ -33,10 +33,6 @@
*/ */
#include <linux/config.h> #include <linux/config.h>
#ifdef CONFIG_I2C_DEBUG_BUS
#define DEBUG 1
#endif
#include <linux/module.h> #include <linux/module.h>
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/kernel.h> #include <linux/kernel.h>
......
/* ------------------------------------------------------------------------- */
/* i2c-velleman.c i2c-hw access for Velleman K8000 adapters */
/* ------------------------------------------------------------------------- */
/* Copyright (C) 1995-96, 2000 Simon G. Vogl
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. */
/* ------------------------------------------------------------------------- */
#include <linux/config.h>
#ifdef CONFIG_I2C_DEBUG_BUS
#define DEBUG 1
#endif
#include <linux/kernel.h>
#include <linux/ioport.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/delay.h>
#include <linux/i2c.h>
#include <linux/i2c-algo-bit.h>
#include <asm/io.h>
/* Pin Port Inverted name */
#define I2C_SDA 0x02 /* ctrl bit 1 (inv) */
#define I2C_SCL 0x08 /* ctrl bit 3 (inv) */
#define I2C_SDAIN 0x10 /* stat bit 4 */
#define I2C_SCLIN 0x08 /* ctrl bit 3 (inv)(reads own output)*/
#define I2C_DMASK 0xfd
#define I2C_CMASK 0xf7
/* --- Convenience defines for the parallel port: */
#define BASE (unsigned long)(data)
#define DATA BASE /* Centronics data port */
#define STAT (BASE+1) /* Centronics status port */
#define CTRL (BASE+2) /* Centronics control port */
#define DEFAULT_BASE 0x378
static long base=0;
/* ----- local functions --------------------------------------------------- */
static void bit_velle_setscl(void *data, int state)
{
if (state) {
outb(inb(CTRL) & I2C_CMASK, CTRL);
} else {
outb(inb(CTRL) | I2C_SCL, CTRL);
}
}
static void bit_velle_setsda(void *data, int state)
{
if (state) {
outb(inb(CTRL) & I2C_DMASK , CTRL);
} else {
outb(inb(CTRL) | I2C_SDA, CTRL);
}
}
static int bit_velle_getscl(void *data)
{
return ( 0 == ( (inb(CTRL)) & I2C_SCLIN ) );
}
static int bit_velle_getsda(void *data)
{
return ( 0 != ( (inb(STAT)) & I2C_SDAIN ) );
}
static int bit_velle_init(void)
{
if (!request_region(base, (base == 0x3bc) ? 3 : 8,
"i2c (Vellemann adapter)"))
return -ENODEV;
bit_velle_setsda((void*)base,1);
bit_velle_setscl((void*)base,1);
return 0;
}
/* ------------------------------------------------------------------------
* Encapsulate the above functions in the correct operations structure.
* This is only done when more than one hardware adapter is supported.
*/
static struct i2c_algo_bit_data bit_velle_data = {
.setsda = bit_velle_setsda,
.setscl = bit_velle_setscl,
.getsda = bit_velle_getsda,
.getscl = bit_velle_getscl,
.udelay = 10,
.mdelay = 10,
.timeout = HZ
};
static struct i2c_adapter bit_velle_ops = {
.owner = THIS_MODULE,
.algo_data = &bit_velle_data,
.name = "Velleman K8000",
};
static int __init i2c_bitvelle_init(void)
{
printk(KERN_INFO "i2c-velleman: i2c Velleman K8000 driver\n");
if (base==0) {
/* probe some values */
base=DEFAULT_BASE;
bit_velle_data.data=(void*)DEFAULT_BASE;
if (bit_velle_init()==0) {
if(i2c_bit_add_bus(&bit_velle_ops) < 0)
return -ENODEV;
} else {
return -ENODEV;
}
} else {
bit_velle_data.data=(void*)base;
if (bit_velle_init()==0) {
if(i2c_bit_add_bus(&bit_velle_ops) < 0)
return -ENODEV;
} else {
return -ENODEV;
}
}
pr_debug("i2c-velleman: found device at %#lx.\n",base);
return 0;
}
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");
module_init(i2c_bitvelle_init);
module_exit(i2c_bitvelle_exit);
...@@ -22,10 +22,6 @@ ...@@ -22,10 +22,6 @@
*/ */
#include <linux/config.h> #include <linux/config.h>
#ifdef CONFIG_I2C_DEBUG_BUS
#define DEBUG 1
#endif
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/pci.h> #include <linux/pci.h>
...@@ -92,6 +88,7 @@ static struct i2c_algo_bit_data bit_data = { ...@@ -92,6 +88,7 @@ static struct i2c_algo_bit_data bit_data = {
static struct i2c_adapter vt586b_adapter = { static struct i2c_adapter vt586b_adapter = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.class = I2C_ADAP_CLASS_SMBUS,
.name = "VIA i2c", .name = "VIA i2c",
.algo_data = &bit_data, .algo_data = &bit_data,
}; };
......
...@@ -34,10 +34,6 @@ ...@@ -34,10 +34,6 @@
*/ */
#include <linux/config.h> #include <linux/config.h>
#ifdef CONFIG_I2C_DEBUG_BUS
#define DEBUG 1
#endif
#include <linux/module.h> #include <linux/module.h>
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/kernel.h> #include <linux/kernel.h>
......
...@@ -28,10 +28,6 @@ ...@@ -28,10 +28,6 @@
the BT869 and possibly other I2C devices. */ the BT869 and possibly other I2C devices. */
#include <linux/config.h> #include <linux/config.h>
#ifdef CONFIG_I2C_DEBUG_BUS
#define DEBUG 1
#endif
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/init.h> #include <linux/init.h>
...@@ -171,6 +167,7 @@ static struct i2c_algo_bit_data voo_i2c_bit_data = { ...@@ -171,6 +167,7 @@ static struct i2c_algo_bit_data voo_i2c_bit_data = {
static struct i2c_adapter voodoo3_i2c_adapter = { static struct i2c_adapter voodoo3_i2c_adapter = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.class = I2C_ADAP_CLASS_TV_ANALOG,
.name = "I2C Voodoo3/Banshee adapter", .name = "I2C Voodoo3/Banshee adapter",
.algo_data = &voo_i2c_bit_data, .algo_data = &voo_i2c_bit_data,
}; };
...@@ -187,6 +184,7 @@ static struct i2c_algo_bit_data voo_ddc_bit_data = { ...@@ -187,6 +184,7 @@ static struct i2c_algo_bit_data voo_ddc_bit_data = {
static struct i2c_adapter voodoo3_ddc_adapter = { static struct i2c_adapter voodoo3_ddc_adapter = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.class = I2C_ADAP_CLASS_DDC,
.name = "DDC Voodoo3/Banshee adapter", .name = "DDC Voodoo3/Banshee adapter",
.algo_data = &voo_ddc_bit_data, .algo_data = &voo_ddc_bit_data,
}; };
......
...@@ -25,10 +25,6 @@ ...@@ -25,10 +25,6 @@
*/ */
#include <linux/config.h> #include <linux/config.h>
#ifdef CONFIG_I2C_DEBUG_BUS
#define DEBUG 1
#endif
#include <linux/config.h> #include <linux/config.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/errno.h> #include <linux/errno.h>
......
...@@ -22,10 +22,6 @@ ...@@ -22,10 +22,6 @@
*/ */
#include <linux/config.h> #include <linux/config.h>
#ifdef CONFIG_I2C_DEBUG_BUS
#define DEBUG 1
#endif
#include <linux/config.h> #include <linux/config.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/errno.h> #include <linux/errno.h>
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
# I2C Sensor device configuration # I2C Sensor device configuration
# #
menu "I2C Hardware Sensors Chip support" menu "Hardware Sensors Chip support"
depends on I2C depends on I2C
config I2C_SENSOR config I2C_SENSOR
...@@ -33,17 +33,16 @@ config SENSORS_ASB100 ...@@ -33,17 +33,16 @@ config SENSORS_ASB100
This driver can also be built as a module. If so, the module This driver can also be built as a module. If so, the module
will be called asb100. will be called asb100.
config SENSORS_EEPROM config SENSORS_DS1621
tristate "EEPROM (DIMM) reader" tristate "Dallas Semiconductor DS1621 and DS1625"
depends on I2C && EXPERIMENTAL depends on I2C && EXPERIMENTAL
select I2C_SENSOR select I2C_SENSOR
help help
If you say yes here you get read-only access to the EEPROM data If you say yes here you get support for Dallas Semiconductor
available on modern memory DIMMs, and which could theoretically DS1621 and DS1625 sensor chips.
also be available on other devices.
This driver can also be built as a module. If so, the module This driver can also be built as a module. If so, the module
will be called eeprom. will be called ds1621.
config SENSORS_FSCHER config SENSORS_FSCHER
tristate "FSC Hermes" tristate "FSC Hermes"
...@@ -102,6 +101,17 @@ config SENSORS_LM78 ...@@ -102,6 +101,17 @@ config SENSORS_LM78
This driver can also be built as a module. If so, the module This driver can also be built as a module. If so, the module
will be called lm78. will be called lm78.
config SENSORS_LM80
tristate "National Semiconductor LM80"
depends on I2C && EXPERIMENTAL
select I2C_SENSOR
help
If you say yes here you get support for National Semiconductor
LM80 sensor chips.
This driver can also be built as a module. If so, the module
will be called lm80.
config SENSORS_LM83 config SENSORS_LM83
tristate "National Semiconductor LM83" tristate "National Semiconductor LM83"
depends on I2C && EXPERIMENTAL depends on I2C && EXPERIMENTAL
...@@ -171,4 +181,32 @@ config SENSORS_W83L785TS ...@@ -171,4 +181,32 @@ config SENSORS_W83L785TS
This driver can also be built as a module. If so, the module This driver can also be built as a module. If so, the module
will be called w83l785ts. will be called w83l785ts.
config SENSORS_W83627HF
tristate "Winbond W83627HF, W83627THF, W83637HF, W83697HF"
depends on I2C && EXPERIMENTAL
select I2C_SENSOR
help
If you say yes here you get support for the Winbond W836X7 series
of sensor chips: the W83627HF, W83627THF, W83637HF, and the W83697HF
This driver can also be built as a module. If so, the module
will be called w83627hf.
endmenu
menu "Other I2C Chip support"
depends on I2C
config SENSORS_EEPROM
tristate "EEPROM reader"
depends on I2C && EXPERIMENTAL
select I2C_SENSOR
help
If you say yes here you get read-only access to the EEPROM data
available on modern memory DIMMs and Sony Vaio laptops. Such
EEPROMs could theoretically be available on other devices as well.
This driver can also be built as a module. If so, the module
will be called eeprom.
endmenu endmenu
...@@ -4,17 +4,24 @@ ...@@ -4,17 +4,24 @@
# asb100, then w83781d go first, as they can override other drivers' addresses. # asb100, then w83781d go first, as they can override other drivers' addresses.
obj-$(CONFIG_SENSORS_ASB100) += asb100.o obj-$(CONFIG_SENSORS_ASB100) += asb100.o
obj-$(CONFIG_SENSORS_W83627HF) += w83627hf.o
obj-$(CONFIG_SENSORS_W83781D) += w83781d.o obj-$(CONFIG_SENSORS_W83781D) += w83781d.o
obj-$(CONFIG_SENSORS_ADM1021) += adm1021.o obj-$(CONFIG_SENSORS_ADM1021) += adm1021.o
obj-$(CONFIG_SENSORS_DS1621) += ds1621.o
obj-$(CONFIG_SENSORS_EEPROM) += eeprom.o obj-$(CONFIG_SENSORS_EEPROM) += eeprom.o
obj-$(CONFIG_SENSORS_FSCHER) += fscher.o obj-$(CONFIG_SENSORS_FSCHER) += fscher.o
obj-$(CONFIG_SENSORS_GL518SM) += gl518sm.o obj-$(CONFIG_SENSORS_GL518SM) += gl518sm.o
obj-$(CONFIG_SENSORS_IT87) += it87.o obj-$(CONFIG_SENSORS_IT87) += it87.o
obj-$(CONFIG_SENSORS_LM75) += lm75.o obj-$(CONFIG_SENSORS_LM75) += lm75.o
obj-$(CONFIG_SENSORS_LM78) += lm78.o obj-$(CONFIG_SENSORS_LM78) += lm78.o
obj-$(CONFIG_SENSORS_LM80) += lm80.o
obj-$(CONFIG_SENSORS_LM83) += lm83.o obj-$(CONFIG_SENSORS_LM83) += lm83.o
obj-$(CONFIG_SENSORS_LM85) += lm85.o obj-$(CONFIG_SENSORS_LM85) += lm85.o
obj-$(CONFIG_SENSORS_LM90) += lm90.o obj-$(CONFIG_SENSORS_LM90) += lm90.o
obj-$(CONFIG_SENSORS_VIA686A) += via686a.o obj-$(CONFIG_SENSORS_VIA686A) += via686a.o
obj-$(CONFIG_SENSORS_W83L785TS) += w83l785ts.o obj-$(CONFIG_SENSORS_W83L785TS) += w83l785ts.o
ifeq ($(CONFIG_I2C_DEBUG_CHIP),y)
EXTRA_CFLAGS += -DDEBUG
endif
...@@ -20,10 +20,6 @@ ...@@ -20,10 +20,6 @@
*/ */
#include <linux/config.h> #include <linux/config.h>
#ifdef CONFIG_I2C_DEBUG_CHIP
#define DEBUG 1
#endif
#include <linux/module.h> #include <linux/module.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/slab.h> #include <linux/slab.h>
...@@ -139,7 +135,7 @@ static int adm1021_detach_client(struct i2c_client *client); ...@@ -139,7 +135,7 @@ static int adm1021_detach_client(struct i2c_client *client);
static int adm1021_read_value(struct i2c_client *client, u8 reg); static int adm1021_read_value(struct i2c_client *client, u8 reg);
static int adm1021_write_value(struct i2c_client *client, u8 reg, static int adm1021_write_value(struct i2c_client *client, u8 reg,
u16 value); u16 value);
static void adm1021_update_client(struct i2c_client *client); static struct adm1021_data *adm1021_update_device(struct device *dev);
/* (amalysh) read only mode, otherwise any limit's writing confuse BIOS */ /* (amalysh) read only mode, otherwise any limit's writing confuse BIOS */
static int read_only = 0; static int read_only = 0;
...@@ -148,7 +144,7 @@ static int read_only = 0; ...@@ -148,7 +144,7 @@ static int read_only = 0;
/* This is the driver that will be inserted */ /* This is the driver that will be inserted */
static struct i2c_driver adm1021_driver = { static struct i2c_driver adm1021_driver = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.name = "ADM1021-MAX1617", .name = "adm1021",
.id = I2C_DRIVERID_ADM1021, .id = I2C_DRIVERID_ADM1021,
.flags = I2C_DF_NOTIFY, .flags = I2C_DF_NOTIFY,
.attach_adapter = adm1021_attach_adapter, .attach_adapter = adm1021_attach_adapter,
...@@ -161,15 +157,10 @@ static struct i2c_driver adm1021_driver = { ...@@ -161,15 +157,10 @@ static struct i2c_driver adm1021_driver = {
static int adm1021_id = 0; static int adm1021_id = 0;
#define show(value) \ #define show(value) \
static ssize_t show_##value(struct device *dev, char *buf) \ static ssize_t show_##value(struct device *dev, char *buf) \
{ \ { \
struct i2c_client *client = to_i2c_client(dev); \ struct adm1021_data *data = adm1021_update_device(dev); \
struct adm1021_data *data = i2c_get_clientdata(client); \ return sprintf(buf, "%d\n", TEMP_FROM_REG(data->value)); \
int temp; \
\
adm1021_update_client(client); \
temp = TEMP_FROM_REG(data->value); \
return sprintf(buf, "%d\n", temp); \
} }
show(temp_max); show(temp_max);
show(temp_hyst); show(temp_hyst);
...@@ -179,13 +170,10 @@ show(remote_temp_hyst); ...@@ -179,13 +170,10 @@ show(remote_temp_hyst);
show(remote_temp_input); show(remote_temp_input);
#define show2(value) \ #define show2(value) \
static ssize_t show_##value(struct device *dev, char *buf) \ static ssize_t show_##value(struct device *dev, char *buf) \
{ \ { \
struct i2c_client *client = to_i2c_client(dev); \ struct adm1021_data *data = adm1021_update_device(dev); \
struct adm1021_data *data = i2c_get_clientdata(client); \ return sprintf(buf, "%d\n", data->value); \
\
adm1021_update_client(client); \
return sprintf(buf, "%d\n", data->value); \
} }
show2(alarms); show2(alarms);
show2(die_code); show2(die_code);
...@@ -206,12 +194,12 @@ set(temp_hyst, ADM1021_REG_THYST_W); ...@@ -206,12 +194,12 @@ set(temp_hyst, ADM1021_REG_THYST_W);
set(remote_temp_max, ADM1021_REG_REMOTE_TOS_W); set(remote_temp_max, ADM1021_REG_REMOTE_TOS_W);
set(remote_temp_hyst, ADM1021_REG_REMOTE_THYST_W); set(remote_temp_hyst, ADM1021_REG_REMOTE_THYST_W);
static DEVICE_ATTR(temp_max1, S_IWUSR | S_IRUGO, show_temp_max, set_temp_max); static DEVICE_ATTR(temp1_max, S_IWUSR | S_IRUGO, show_temp_max, set_temp_max);
static DEVICE_ATTR(temp_min1, S_IWUSR | S_IRUGO, show_temp_hyst, set_temp_hyst); static DEVICE_ATTR(temp1_min, S_IWUSR | S_IRUGO, show_temp_hyst, set_temp_hyst);
static DEVICE_ATTR(temp_input1, S_IRUGO, show_temp_input, NULL); static DEVICE_ATTR(temp1_input, S_IRUGO, show_temp_input, NULL);
static DEVICE_ATTR(temp_max2, S_IWUSR | S_IRUGO, show_remote_temp_max, set_remote_temp_max); static DEVICE_ATTR(temp2_max, S_IWUSR | S_IRUGO, show_remote_temp_max, set_remote_temp_max);
static DEVICE_ATTR(temp_min2, S_IWUSR | S_IRUGO, show_remote_temp_hyst, set_remote_temp_hyst); static DEVICE_ATTR(temp2_min, S_IWUSR | S_IRUGO, show_remote_temp_hyst, set_remote_temp_hyst);
static DEVICE_ATTR(temp_input2, S_IRUGO, show_remote_temp_input, NULL); static DEVICE_ATTR(temp2_input, S_IRUGO, show_remote_temp_input, NULL);
static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL); static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL);
static DEVICE_ATTR(die_code, S_IRUGO, show_die_code, NULL); static DEVICE_ATTR(die_code, S_IRUGO, show_die_code, NULL);
...@@ -309,10 +297,6 @@ static int adm1021_detect(struct i2c_adapter *adapter, int address, int kind) ...@@ -309,10 +297,6 @@ static int adm1021_detect(struct i2c_adapter *adapter, int address, int kind)
type_name = "gl523sm"; type_name = "gl523sm";
} else if (kind == mc1066) { } else if (kind == mc1066) {
type_name = "mc1066"; type_name = "mc1066";
} else {
dev_err(&adapter->dev, "Internal error: unknown kind (%d)?!?",
kind);
goto error1;
} }
/* Fill in the remaining client fields and put it into the global list */ /* Fill in the remaining client fields and put it into the global list */
...@@ -331,12 +315,12 @@ static int adm1021_detect(struct i2c_adapter *adapter, int address, int kind) ...@@ -331,12 +315,12 @@ static int adm1021_detect(struct i2c_adapter *adapter, int address, int kind)
adm1021_init_client(new_client); adm1021_init_client(new_client);
/* Register sysfs hooks */ /* Register sysfs hooks */
device_create_file(&new_client->dev, &dev_attr_temp_max1); device_create_file(&new_client->dev, &dev_attr_temp1_max);
device_create_file(&new_client->dev, &dev_attr_temp_min1); device_create_file(&new_client->dev, &dev_attr_temp1_min);
device_create_file(&new_client->dev, &dev_attr_temp_input1); device_create_file(&new_client->dev, &dev_attr_temp1_input);
device_create_file(&new_client->dev, &dev_attr_temp_max2); device_create_file(&new_client->dev, &dev_attr_temp2_max);
device_create_file(&new_client->dev, &dev_attr_temp_min2); device_create_file(&new_client->dev, &dev_attr_temp2_min);
device_create_file(&new_client->dev, &dev_attr_temp_input2); device_create_file(&new_client->dev, &dev_attr_temp2_input);
device_create_file(&new_client->dev, &dev_attr_alarms); device_create_file(&new_client->dev, &dev_attr_alarms);
if (data->type == adm1021) if (data->type == adm1021)
device_create_file(&new_client->dev, &dev_attr_die_code); device_create_file(&new_client->dev, &dev_attr_die_code);
...@@ -393,8 +377,9 @@ static int adm1021_write_value(struct i2c_client *client, u8 reg, u16 value) ...@@ -393,8 +377,9 @@ static int adm1021_write_value(struct i2c_client *client, u8 reg, u16 value)
return 0; return 0;
} }
static void adm1021_update_client(struct i2c_client *client) static struct adm1021_data *adm1021_update_device(struct device *dev)
{ {
struct i2c_client *client = to_i2c_client(dev);
struct adm1021_data *data = i2c_get_clientdata(client); struct adm1021_data *data = i2c_get_clientdata(client);
down(&data->update_lock); down(&data->update_lock);
...@@ -424,6 +409,8 @@ static void adm1021_update_client(struct i2c_client *client) ...@@ -424,6 +409,8 @@ static void adm1021_update_client(struct i2c_client *client)
} }
up(&data->update_lock); up(&data->update_lock);
return data;
} }
static int __init sensors_adm1021_init(void) static int __init sensors_adm1021_init(void)
......
...@@ -37,10 +37,6 @@ ...@@ -37,10 +37,6 @@
*/ */
#include <linux/config.h> #include <linux/config.h>
#ifdef CONFIG_I2C_DEBUG_CHIP
#define DEBUG 1
#endif
#include <linux/module.h> #include <linux/module.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/ioport.h> #include <linux/ioport.h>
...@@ -274,7 +270,7 @@ static ssize_t \ ...@@ -274,7 +270,7 @@ static ssize_t \
{ \ { \
return show_in(dev, buf, 0x##offset); \ return show_in(dev, buf, 0x##offset); \
} \ } \
static DEVICE_ATTR(in_input##offset, S_IRUGO, \ static DEVICE_ATTR(in##offset##_input, S_IRUGO, \
show_in##offset, NULL) \ show_in##offset, NULL) \
static ssize_t \ static ssize_t \
show_in##offset##_min (struct device *dev, char *buf) \ show_in##offset##_min (struct device *dev, char *buf) \
...@@ -296,9 +292,9 @@ static ssize_t set_in##offset##_max (struct device *dev, \ ...@@ -296,9 +292,9 @@ static ssize_t set_in##offset##_max (struct device *dev, \
{ \ { \
return set_in_max(dev, buf, count, 0x##offset); \ return set_in_max(dev, buf, count, 0x##offset); \
} \ } \
static DEVICE_ATTR(in_min##offset, S_IRUGO | S_IWUSR, \ static DEVICE_ATTR(in##offset##_min, S_IRUGO | S_IWUSR, \
show_in##offset##_min, set_in##offset##_min) \ show_in##offset##_min, set_in##offset##_min) \
static DEVICE_ATTR(in_max##offset, S_IRUGO | S_IWUSR, \ static DEVICE_ATTR(in##offset##_max, S_IRUGO | S_IWUSR, \
show_in##offset##_max, set_in##offset##_max) show_in##offset##_max, set_in##offset##_max)
sysfs_in(0) sysfs_in(0)
...@@ -310,9 +306,9 @@ sysfs_in(5) ...@@ -310,9 +306,9 @@ sysfs_in(5)
sysfs_in(6) sysfs_in(6)
#define device_create_file_in(client, offset) do { \ #define device_create_file_in(client, offset) do { \
device_create_file(&client->dev, &dev_attr_in_input##offset); \ device_create_file(&client->dev, &dev_attr_in##offset##_input); \
device_create_file(&client->dev, &dev_attr_in_min##offset); \ device_create_file(&client->dev, &dev_attr_in##offset##_min); \
device_create_file(&client->dev, &dev_attr_in_max##offset); \ device_create_file(&client->dev, &dev_attr_in##offset##_max); \
} while (0) } while (0)
/* 3 Fans */ /* 3 Fans */
...@@ -412,11 +408,11 @@ static ssize_t set_fan##offset##_div(struct device *dev, const char *buf, \ ...@@ -412,11 +408,11 @@ static ssize_t set_fan##offset##_div(struct device *dev, const char *buf, \
{ \ { \
return set_fan_div(dev, buf, count, offset - 1); \ return set_fan_div(dev, buf, count, offset - 1); \
} \ } \
static DEVICE_ATTR(fan_input##offset, S_IRUGO, \ static DEVICE_ATTR(fan##offset##_input, S_IRUGO, \
show_fan##offset, NULL) \ show_fan##offset, NULL) \
static DEVICE_ATTR(fan_min##offset, S_IRUGO | S_IWUSR, \ static DEVICE_ATTR(fan##offset##_min, S_IRUGO | S_IWUSR, \
show_fan##offset##_min, set_fan##offset##_min) \ show_fan##offset##_min, set_fan##offset##_min) \
static DEVICE_ATTR(fan_div##offset, S_IRUGO | S_IWUSR, \ static DEVICE_ATTR(fan##offset##_div, S_IRUGO | S_IWUSR, \
show_fan##offset##_div, set_fan##offset##_div) show_fan##offset##_div, set_fan##offset##_div)
sysfs_fan(1) sysfs_fan(1)
...@@ -424,9 +420,9 @@ sysfs_fan(2) ...@@ -424,9 +420,9 @@ sysfs_fan(2)
sysfs_fan(3) sysfs_fan(3)
#define device_create_file_fan(client, offset) do { \ #define device_create_file_fan(client, offset) do { \
device_create_file(&client->dev, &dev_attr_fan_input##offset); \ device_create_file(&client->dev, &dev_attr_fan##offset##_input); \
device_create_file(&client->dev, &dev_attr_fan_min##offset); \ device_create_file(&client->dev, &dev_attr_fan##offset##_min); \
device_create_file(&client->dev, &dev_attr_fan_div##offset); \ device_create_file(&client->dev, &dev_attr_fan##offset##_div); \
} while (0) } while (0)
/* 4 Temp. Sensors */ /* 4 Temp. Sensors */
...@@ -484,7 +480,7 @@ static ssize_t show_temp##num(struct device *dev, char *buf) \ ...@@ -484,7 +480,7 @@ static ssize_t show_temp##num(struct device *dev, char *buf) \
{ \ { \
return show_temp(dev, buf, num-1); \ return show_temp(dev, buf, num-1); \
} \ } \
static DEVICE_ATTR(temp_input##num, S_IRUGO, show_temp##num, NULL) \ static DEVICE_ATTR(temp##num##_input, S_IRUGO, show_temp##num, NULL) \
static ssize_t show_temp_max##num(struct device *dev, char *buf) \ static ssize_t show_temp_max##num(struct device *dev, char *buf) \
{ \ { \
return show_temp_max(dev, buf, num-1); \ return show_temp_max(dev, buf, num-1); \
...@@ -494,7 +490,7 @@ static ssize_t set_temp_max##num(struct device *dev, const char *buf, \ ...@@ -494,7 +490,7 @@ static ssize_t set_temp_max##num(struct device *dev, const char *buf, \
{ \ { \
return set_temp_max(dev, buf, count, num-1); \ return set_temp_max(dev, buf, count, num-1); \
} \ } \
static DEVICE_ATTR(temp_max##num, S_IRUGO | S_IWUSR, \ static DEVICE_ATTR(temp##num##_max, S_IRUGO | S_IWUSR, \
show_temp_max##num, set_temp_max##num) \ show_temp_max##num, set_temp_max##num) \
static ssize_t show_temp_hyst##num(struct device *dev, char *buf) \ static ssize_t show_temp_hyst##num(struct device *dev, char *buf) \
{ \ { \
...@@ -505,7 +501,7 @@ static ssize_t set_temp_hyst##num(struct device *dev, const char *buf, \ ...@@ -505,7 +501,7 @@ static ssize_t set_temp_hyst##num(struct device *dev, const char *buf, \
{ \ { \
return set_temp_hyst(dev, buf, count, num-1); \ return set_temp_hyst(dev, buf, count, num-1); \
} \ } \
static DEVICE_ATTR(temp_hyst##num, S_IRUGO | S_IWUSR, \ static DEVICE_ATTR(temp##num##_max_hyst, S_IRUGO | S_IWUSR, \
show_temp_hyst##num, set_temp_hyst##num) show_temp_hyst##num, set_temp_hyst##num)
sysfs_temp(1) sysfs_temp(1)
...@@ -515,9 +511,9 @@ sysfs_temp(4) ...@@ -515,9 +511,9 @@ sysfs_temp(4)
/* VID */ /* VID */
#define device_create_file_temp(client, num) do { \ #define device_create_file_temp(client, num) do { \
device_create_file(&client->dev, &dev_attr_temp_input##num); \ device_create_file(&client->dev, &dev_attr_temp##num##_input); \
device_create_file(&client->dev, &dev_attr_temp_max##num); \ device_create_file(&client->dev, &dev_attr_temp##num##_max); \
device_create_file(&client->dev, &dev_attr_temp_hyst##num); \ device_create_file(&client->dev, &dev_attr_temp##num##_max_hyst); \
} while (0) } while (0)
static ssize_t show_vid(struct device *dev, char *buf) static ssize_t show_vid(struct device *dev, char *buf)
...@@ -526,9 +522,9 @@ static ssize_t show_vid(struct device *dev, char *buf) ...@@ -526,9 +522,9 @@ static ssize_t show_vid(struct device *dev, char *buf)
return sprintf(buf, "%d\n", vid_from_reg(data->vid, data->vrm)); return sprintf(buf, "%d\n", vid_from_reg(data->vid, data->vrm));
} }
static DEVICE_ATTR(vid, S_IRUGO, show_vid, NULL) static DEVICE_ATTR(in0_ref, S_IRUGO, show_vid, NULL)
#define device_create_file_vid(client) \ #define device_create_file_vid(client) \
device_create_file(&client->dev, &dev_attr_vid) device_create_file(&client->dev, &dev_attr_in0_ref)
/* VRM */ /* VRM */
static ssize_t show_vrm(struct device *dev, char *buf) static ssize_t show_vrm(struct device *dev, char *buf)
...@@ -597,12 +593,12 @@ static ssize_t set_pwm_enable1(struct device *dev, const char *buf, ...@@ -597,12 +593,12 @@ static ssize_t set_pwm_enable1(struct device *dev, const char *buf,
return count; return count;
} }
static DEVICE_ATTR(pwm1, S_IRUGO | S_IWUSR, show_pwm1, set_pwm1) static DEVICE_ATTR(fan1_pwm, S_IRUGO | S_IWUSR, show_pwm1, set_pwm1)
static DEVICE_ATTR(pwm_enable1, S_IRUGO | S_IWUSR, static DEVICE_ATTR(fan1_pwm_enable, S_IRUGO | S_IWUSR,
show_pwm_enable1, set_pwm_enable1) show_pwm_enable1, set_pwm_enable1)
#define device_create_file_pwm1(client) do { \ #define device_create_file_pwm1(client) do { \
device_create_file(&new_client->dev, &dev_attr_pwm1); \ device_create_file(&new_client->dev, &dev_attr_fan1_pwm); \
device_create_file(&new_client->dev, &dev_attr_pwm_enable1); \ device_create_file(&new_client->dev, &dev_attr_fan1_pwm_enable); \
} while (0) } while (0)
/* This function is called when: /* This function is called when:
......
This diff is collapsed.
...@@ -27,10 +27,6 @@ ...@@ -27,10 +27,6 @@
*/ */
#include <linux/config.h> #include <linux/config.h>
#ifdef CONFIG_I2C_DEBUG_CHIP
#define DEBUG 1
#endif
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/module.h> #include <linux/module.h>
......
...@@ -26,6 +26,7 @@ ...@@ -26,6 +26,7 @@
* and Philip Edelbrock <phil@netroedge.com> * and Philip Edelbrock <phil@netroedge.com>
*/ */
#include <linux/config.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/slab.h> #include <linux/slab.h>
...@@ -108,7 +109,7 @@ SENSORS_INSMOD_1(fscher); ...@@ -108,7 +109,7 @@ SENSORS_INSMOD_1(fscher);
static int fscher_attach_adapter(struct i2c_adapter *adapter); static int fscher_attach_adapter(struct i2c_adapter *adapter);
static int fscher_detect(struct i2c_adapter *adapter, int address, int kind); static int fscher_detect(struct i2c_adapter *adapter, int address, int kind);
static int fscher_detach_client(struct i2c_client *client); static int fscher_detach_client(struct i2c_client *client);
static void fscher_update_client(struct i2c_client *client); static struct fscher_data *fscher_update_device(struct device *dev);
static void fscher_init_client(struct i2c_client *client); static void fscher_init_client(struct i2c_client *client);
static int fscher_read_value(struct i2c_client *client, u8 reg); static int fscher_read_value(struct i2c_client *client, u8 reg);
...@@ -160,71 +161,69 @@ static int fscher_id = 0; ...@@ -160,71 +161,69 @@ static int fscher_id = 0;
* Sysfs stuff * Sysfs stuff
*/ */
#define sysfs_r(kind, offset, reg) \ #define sysfs_r(kind, sub, offset, reg) \
static ssize_t show_##kind (struct fscher_data *, char *, int); \ static ssize_t show_##kind##sub (struct fscher_data *, char *, int); \
static ssize_t show_##kind##offset (struct device *, char *); \ static ssize_t show_##kind##offset##sub (struct device *, char *); \
static ssize_t show_##kind##offset (struct device *dev, char *buf) \ static ssize_t show_##kind##offset##sub (struct device *dev, char *buf) \
{ \ { \
struct i2c_client *client = to_i2c_client(dev); \ struct fscher_data *data = fscher_update_device(dev); \
struct fscher_data *data = i2c_get_clientdata(client); \ return show_##kind##sub(data, buf, (offset)); \
fscher_update_client(client); \
return show_##kind(data, buf, (offset)); \
} }
#define sysfs_w(kind, offset, reg) \ #define sysfs_w(kind, sub, offset, reg) \
static ssize_t set_##kind (struct i2c_client *, struct fscher_data *, const char *, size_t, int, int); \ static ssize_t set_##kind##sub (struct i2c_client *, struct fscher_data *, const char *, size_t, int, int); \
static ssize_t set_##kind##offset (struct device *, const char *, size_t); \ static ssize_t set_##kind##offset##sub (struct device *, const char *, size_t); \
static ssize_t set_##kind##offset (struct device *dev, const char *buf, size_t count) \ static ssize_t set_##kind##offset##sub (struct device *dev, const char *buf, size_t count) \
{ \ { \
struct i2c_client *client = to_i2c_client(dev); \ struct i2c_client *client = to_i2c_client(dev); \
struct fscher_data *data = i2c_get_clientdata(client); \ struct fscher_data *data = i2c_get_clientdata(client); \
return set_##kind(client, data, buf, count, (offset), reg); \ return set_##kind##sub(client, data, buf, count, (offset), reg); \
} }
#define sysfs_rw_n(kind, offset, reg) \ #define sysfs_rw_n(kind, sub, offset, reg) \
sysfs_r(kind, offset, reg) \ sysfs_r(kind, sub, offset, reg) \
sysfs_w(kind, offset, reg) \ sysfs_w(kind, sub, offset, reg) \
static DEVICE_ATTR(kind##offset, S_IRUGO | S_IWUSR, show_##kind##offset, set_##kind##offset); static DEVICE_ATTR(kind##offset##sub, S_IRUGO | S_IWUSR, show_##kind##offset##sub, set_##kind##offset##sub);
#define sysfs_rw(kind, reg) \ #define sysfs_rw(kind, sub, reg) \
sysfs_r(kind, 0, reg) \ sysfs_r(kind, sub, 0, reg) \
sysfs_w(kind, 0, reg) \ sysfs_w(kind, sub, 0, reg) \
static DEVICE_ATTR(kind, S_IRUGO | S_IWUSR, show_##kind##0, set_##kind##0); static DEVICE_ATTR(kind##sub, S_IRUGO | S_IWUSR, show_##kind##0##sub, set_##kind##0##sub);
#define sysfs_ro_n(kind, offset, reg) \ #define sysfs_ro_n(kind, sub, offset, reg) \
sysfs_r(kind, offset, reg) \ sysfs_r(kind, sub, offset, reg) \
static DEVICE_ATTR(kind##offset, S_IRUGO, show_##kind##offset, NULL); static DEVICE_ATTR(kind##offset##sub, S_IRUGO, show_##kind##offset##sub, NULL);
#define sysfs_ro(kind, reg) \ #define sysfs_ro(kind, sub, reg) \
sysfs_r(kind, 0, reg) \ sysfs_r(kind, sub, 0, reg) \
static DEVICE_ATTR(kind, S_IRUGO, show_##kind##0, NULL); static DEVICE_ATTR(kind, S_IRUGO, show_##kind##0##sub, NULL);
#define sysfs_fan(offset, reg_status, reg_min, reg_ripple, reg_act) \ #define sysfs_fan(offset, reg_status, reg_min, reg_ripple, reg_act) \
sysfs_rw_n(pwm , offset, reg_min) \ sysfs_rw_n(fan, _pwm , offset, reg_min) \
sysfs_rw_n(fan_status, offset, reg_status) \ sysfs_rw_n(fan, _status, offset, reg_status) \
sysfs_rw_n(fan_div , offset, reg_ripple) \ sysfs_rw_n(fan, _div , offset, reg_ripple) \
sysfs_ro_n(fan_input , offset, reg_act) sysfs_ro_n(fan, _input , offset, reg_act)
#define sysfs_temp(offset, reg_status, reg_act) \ #define sysfs_temp(offset, reg_status, reg_act) \
sysfs_rw_n(temp_status, offset, reg_status) \ sysfs_rw_n(temp, _status, offset, reg_status) \
sysfs_ro_n(temp_input , offset, reg_act) sysfs_ro_n(temp, _input , offset, reg_act)
#define sysfs_in(offset, reg_act) \ #define sysfs_in(offset, reg_act) \
sysfs_ro_n(in_input, offset, reg_act) sysfs_ro_n(in, _input, offset, reg_act)
#define sysfs_revision(reg_revision) \ #define sysfs_revision(reg_revision) \
sysfs_ro(revision, reg_revision) sysfs_ro(revision, , reg_revision)
#define sysfs_alarms(reg_events) \ #define sysfs_alarms(reg_events) \
sysfs_ro(alarms, reg_events) sysfs_ro(alarms, , reg_events)
#define sysfs_control(reg_control) \ #define sysfs_control(reg_control) \
sysfs_rw(control, reg_control) sysfs_rw(control, , reg_control)
#define sysfs_watchdog(reg_control, reg_status, reg_preset) \ #define sysfs_watchdog(reg_control, reg_status, reg_preset) \
sysfs_rw(watchdog_control, reg_control) \ sysfs_rw(watchdog, _control, reg_control) \
sysfs_rw(watchdog_status , reg_status) \ sysfs_rw(watchdog, _status , reg_status) \
sysfs_rw(watchdog_preset , reg_preset) sysfs_rw(watchdog, _preset , reg_preset)
sysfs_fan(1, FSCHER_REG_FAN0_STATE, FSCHER_REG_FAN0_MIN, sysfs_fan(1, FSCHER_REG_FAN0_STATE, FSCHER_REG_FAN0_MIN,
FSCHER_REG_FAN0_RIPPLE, FSCHER_REG_FAN0_ACT) FSCHER_REG_FAN0_RIPPLE, FSCHER_REG_FAN0_ACT)
...@@ -248,21 +247,21 @@ sysfs_watchdog(FSCHER_REG_WDOG_CONTROL, FSCHER_REG_WDOG_STATE, FSCHER_REG_WDOG_P ...@@ -248,21 +247,21 @@ sysfs_watchdog(FSCHER_REG_WDOG_CONTROL, FSCHER_REG_WDOG_STATE, FSCHER_REG_WDOG_P
#define device_create_file_fan(client, offset) \ #define device_create_file_fan(client, offset) \
do { \ do { \
device_create_file(&client->dev, &dev_attr_fan_status##offset); \ device_create_file(&client->dev, &dev_attr_fan##offset##_status); \
device_create_file(&client->dev, &dev_attr_pwm##offset); \ device_create_file(&client->dev, &dev_attr_fan##offset##_pwm); \
device_create_file(&client->dev, &dev_attr_fan_div##offset); \ device_create_file(&client->dev, &dev_attr_fan##offset##_div); \
device_create_file(&client->dev, &dev_attr_fan_input##offset); \ device_create_file(&client->dev, &dev_attr_fan##offset##_input); \
} while (0) } while (0)
#define device_create_file_temp(client, offset) \ #define device_create_file_temp(client, offset) \
do { \ do { \
device_create_file(&client->dev, &dev_attr_temp_status##offset); \ device_create_file(&client->dev, &dev_attr_temp##offset##_status); \
device_create_file(&client->dev, &dev_attr_temp_input##offset); \ device_create_file(&client->dev, &dev_attr_temp##offset##_input); \
} while (0) } while (0)
#define device_create_file_in(client, offset) \ #define device_create_file_in(client, offset) \
do { \ do { \
device_create_file(&client->dev, &dev_attr_in_input##offset); \ device_create_file(&client->dev, &dev_attr_in##offset##_input); \
} while (0) } while (0)
#define device_create_file_revision(client) \ #define device_create_file_revision(client) \
...@@ -415,8 +414,9 @@ static void fscher_init_client(struct i2c_client *client) ...@@ -415,8 +414,9 @@ static void fscher_init_client(struct i2c_client *client)
data->revision = fscher_read_value(client, FSCHER_REG_REVISION); data->revision = fscher_read_value(client, FSCHER_REG_REVISION);
} }
static void fscher_update_client(struct i2c_client *client) static struct fscher_data *fscher_update_device(struct device *dev)
{ {
struct i2c_client *client = to_i2c_client(dev);
struct fscher_data *data = i2c_get_clientdata(client); struct fscher_data *data = i2c_get_clientdata(client);
down(&data->update_lock); down(&data->update_lock);
...@@ -461,6 +461,8 @@ static void fscher_update_client(struct i2c_client *client) ...@@ -461,6 +461,8 @@ static void fscher_update_client(struct i2c_client *client)
} }
up(&data->update_lock); up(&data->update_lock);
return data;
} }
...@@ -484,7 +486,7 @@ static ssize_t show_fan_status(struct fscher_data *data, char *buf, int nr) ...@@ -484,7 +486,7 @@ static ssize_t show_fan_status(struct fscher_data *data, char *buf, int nr)
return sprintf(buf, "%u\n", data->fan_status[FAN_INDEX_FROM_NUM(nr)] & 0x04); return sprintf(buf, "%u\n", data->fan_status[FAN_INDEX_FROM_NUM(nr)] & 0x04);
} }
static ssize_t set_pwm(struct i2c_client *client, struct fscher_data *data, static ssize_t set_fan_pwm(struct i2c_client *client, struct fscher_data *data,
const char *buf, size_t count, int nr, int reg) const char *buf, size_t count, int nr, int reg)
{ {
data->fan_min[FAN_INDEX_FROM_NUM(nr)] = simple_strtoul(buf, NULL, 10) & 0xff; data->fan_min[FAN_INDEX_FROM_NUM(nr)] = simple_strtoul(buf, NULL, 10) & 0xff;
...@@ -493,7 +495,7 @@ static ssize_t set_pwm(struct i2c_client *client, struct fscher_data *data, ...@@ -493,7 +495,7 @@ static ssize_t set_pwm(struct i2c_client *client, struct fscher_data *data,
return count; return count;
} }
static ssize_t show_pwm (struct fscher_data *data, char *buf, int nr) static ssize_t show_fan_pwm (struct fscher_data *data, char *buf, int nr)
{ {
return sprintf(buf, "%u\n", data->fan_min[FAN_INDEX_FROM_NUM(nr)]); return sprintf(buf, "%u\n", data->fan_min[FAN_INDEX_FROM_NUM(nr)]);
} }
......
...@@ -37,10 +37,6 @@ ...@@ -37,10 +37,6 @@
*/ */
#include <linux/config.h> #include <linux/config.h>
#ifdef CONFIG_I2C_DEBUG_CHIP
#define DEBUG 1
#endif
#include <linux/module.h> #include <linux/module.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/slab.h> #include <linux/slab.h>
...@@ -151,7 +147,7 @@ static void gl518_init_client(struct i2c_client *client); ...@@ -151,7 +147,7 @@ static void gl518_init_client(struct i2c_client *client);
static int gl518_detach_client(struct i2c_client *client); static int gl518_detach_client(struct i2c_client *client);
static int gl518_read_value(struct i2c_client *client, u8 reg); static int gl518_read_value(struct i2c_client *client, u8 reg);
static int gl518_write_value(struct i2c_client *client, u8 reg, u16 value); static int gl518_write_value(struct i2c_client *client, u8 reg, u16 value);
static void gl518_update_client(struct i2c_client *client); static struct gl518_data *gl518_update_device(struct device *dev);
/* This is the driver that will be inserted */ /* This is the driver that will be inserted */
static struct i2c_driver gl518_driver = { static struct i2c_driver gl518_driver = {
...@@ -176,18 +172,14 @@ static int gl518_id = 0; ...@@ -176,18 +172,14 @@ static int gl518_id = 0;
#define show(type, suffix, value) \ #define show(type, suffix, value) \
static ssize_t show_##suffix(struct device *dev, char *buf) \ static ssize_t show_##suffix(struct device *dev, char *buf) \
{ \ { \
struct i2c_client *client = to_i2c_client(dev); \ struct gl518_data *data = gl518_update_device(dev); \
struct gl518_data *data = i2c_get_clientdata(client); \
gl518_update_client(client); \
return sprintf(buf, "%d\n", type##_FROM_REG(data->value)); \ return sprintf(buf, "%d\n", type##_FROM_REG(data->value)); \
} }
#define show_fan(suffix, value, index) \ #define show_fan(suffix, value, index) \
static ssize_t show_##suffix(struct device *dev, char *buf) \ static ssize_t show_##suffix(struct device *dev, char *buf) \
{ \ { \
struct i2c_client *client = to_i2c_client(dev); \ struct gl518_data *data = gl518_update_device(dev); \
struct gl518_data *data = i2c_get_clientdata(client); \
gl518_update_client(client); \
return sprintf(buf, "%d\n", FAN_FROM_REG(data->value[index], \ return sprintf(buf, "%d\n", FAN_FROM_REG(data->value[index], \
DIV_FROM_REG(data->fan_div[index]))); \ DIV_FROM_REG(data->fan_div[index]))); \
} }
...@@ -307,29 +299,29 @@ static ssize_t set_fan_min2(struct device *dev, const char *buf, size_t count) ...@@ -307,29 +299,29 @@ static ssize_t set_fan_min2(struct device *dev, const char *buf, size_t count)
return count; return count;
} }
static DEVICE_ATTR(temp_input1, S_IRUGO, show_temp_input1, NULL); static DEVICE_ATTR(temp1_input, S_IRUGO, show_temp_input1, NULL);
static DEVICE_ATTR(temp_max1, S_IWUSR|S_IRUGO, show_temp_max1, set_temp_max1); static DEVICE_ATTR(temp1_max, S_IWUSR|S_IRUGO, show_temp_max1, set_temp_max1);
static DEVICE_ATTR(temp_hyst1, S_IWUSR|S_IRUGO, static DEVICE_ATTR(temp1_max_hyst, S_IWUSR|S_IRUGO,
show_temp_hyst1, set_temp_hyst1); show_temp_hyst1, set_temp_hyst1);
static DEVICE_ATTR(fan_auto1, S_IWUSR|S_IRUGO, show_fan_auto1, set_fan_auto1); static DEVICE_ATTR(fan1_auto, S_IWUSR|S_IRUGO, show_fan_auto1, set_fan_auto1);
static DEVICE_ATTR(fan_input1, S_IRUGO, show_fan_input1, NULL); static DEVICE_ATTR(fan1_input, S_IRUGO, show_fan_input1, NULL);
static DEVICE_ATTR(fan_input2, S_IRUGO, show_fan_input2, NULL); static DEVICE_ATTR(fan2_input, S_IRUGO, show_fan_input2, NULL);
static DEVICE_ATTR(fan_min1, S_IWUSR|S_IRUGO, show_fan_min1, set_fan_min1); static DEVICE_ATTR(fan1_min, S_IWUSR|S_IRUGO, show_fan_min1, set_fan_min1);
static DEVICE_ATTR(fan_min2, S_IWUSR|S_IRUGO, show_fan_min2, set_fan_min2); static DEVICE_ATTR(fan2_min, S_IWUSR|S_IRUGO, show_fan_min2, set_fan_min2);
static DEVICE_ATTR(fan_div1, S_IWUSR|S_IRUGO, show_fan_div1, set_fan_div1); static DEVICE_ATTR(fan1_div, S_IWUSR|S_IRUGO, show_fan_div1, set_fan_div1);
static DEVICE_ATTR(fan_div2, S_IWUSR|S_IRUGO, show_fan_div2, set_fan_div2); static DEVICE_ATTR(fan2_div, S_IWUSR|S_IRUGO, show_fan_div2, set_fan_div2);
static DEVICE_ATTR(in_input0, S_IRUGO, show_in_input0, NULL); static DEVICE_ATTR(in0_input, S_IRUGO, show_in_input0, NULL);
static DEVICE_ATTR(in_input1, S_IRUGO, show_in_input1, NULL); static DEVICE_ATTR(in1_input, S_IRUGO, show_in_input1, NULL);
static DEVICE_ATTR(in_input2, S_IRUGO, show_in_input2, NULL); static DEVICE_ATTR(in2_input, S_IRUGO, show_in_input2, NULL);
static DEVICE_ATTR(in_input3, S_IRUGO, show_in_input3, NULL); static DEVICE_ATTR(in3_input, S_IRUGO, show_in_input3, NULL);
static DEVICE_ATTR(in_min0, S_IWUSR|S_IRUGO, show_in_min0, set_in_min0); static DEVICE_ATTR(in0_min, S_IWUSR|S_IRUGO, show_in_min0, set_in_min0);
static DEVICE_ATTR(in_min1, S_IWUSR|S_IRUGO, show_in_min1, set_in_min1); static DEVICE_ATTR(in1_min, S_IWUSR|S_IRUGO, show_in_min1, set_in_min1);
static DEVICE_ATTR(in_min2, S_IWUSR|S_IRUGO, show_in_min2, set_in_min2); static DEVICE_ATTR(in2_min, S_IWUSR|S_IRUGO, show_in_min2, set_in_min2);
static DEVICE_ATTR(in_min3, S_IWUSR|S_IRUGO, show_in_min3, set_in_min3); static DEVICE_ATTR(in3_min, S_IWUSR|S_IRUGO, show_in_min3, set_in_min3);
static DEVICE_ATTR(in_max0, S_IWUSR|S_IRUGO, show_in_max0, set_in_max0); static DEVICE_ATTR(in0_max, S_IWUSR|S_IRUGO, show_in_max0, set_in_max0);
static DEVICE_ATTR(in_max1, S_IWUSR|S_IRUGO, show_in_max1, set_in_max1); static DEVICE_ATTR(in1_max, S_IWUSR|S_IRUGO, show_in_max1, set_in_max1);
static DEVICE_ATTR(in_max2, S_IWUSR|S_IRUGO, show_in_max2, set_in_max2); static DEVICE_ATTR(in2_max, S_IWUSR|S_IRUGO, show_in_max2, set_in_max2);
static DEVICE_ATTR(in_max3, S_IWUSR|S_IRUGO, show_in_max3, set_in_max3); static DEVICE_ATTR(in3_max, S_IWUSR|S_IRUGO, show_in_max3, set_in_max3);
static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL); static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL);
static DEVICE_ATTR(beep_enable, S_IWUSR|S_IRUGO, static DEVICE_ATTR(beep_enable, S_IWUSR|S_IRUGO,
show_beep_enable, set_beep_enable); show_beep_enable, set_beep_enable);
...@@ -353,7 +345,6 @@ static int gl518_detect(struct i2c_adapter *adapter, int address, int kind) ...@@ -353,7 +345,6 @@ static int gl518_detect(struct i2c_adapter *adapter, int address, int kind)
struct i2c_client *new_client; struct i2c_client *new_client;
struct gl518_data *data; struct gl518_data *data;
int err = 0; int err = 0;
const char *name = "";
if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA | if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA |
I2C_FUNC_SMBUS_WORD_DATA)) I2C_FUNC_SMBUS_WORD_DATA))
...@@ -393,10 +384,8 @@ static int gl518_detect(struct i2c_adapter *adapter, int address, int kind) ...@@ -393,10 +384,8 @@ static int gl518_detect(struct i2c_adapter *adapter, int address, int kind)
i = gl518_read_value(new_client, GL518_REG_REVISION); i = gl518_read_value(new_client, GL518_REG_REVISION);
if (i == 0x00) { if (i == 0x00) {
kind = gl518sm_r00; kind = gl518sm_r00;
name = "gl518sm";
} else if (i == 0x80) { } else if (i == 0x80) {
kind = gl518sm_r80; kind = gl518sm_r80;
name = "gl518sm";
} else { } else {
if (kind <= 0) if (kind <= 0)
dev_info(&adapter->dev, dev_info(&adapter->dev,
...@@ -408,7 +397,7 @@ static int gl518_detect(struct i2c_adapter *adapter, int address, int kind) ...@@ -408,7 +397,7 @@ static int gl518_detect(struct i2c_adapter *adapter, int address, int kind)
} }
/* Fill in the remaining client fields */ /* Fill in the remaining client fields */
strlcpy(new_client->name, name, I2C_NAME_SIZE); strlcpy(new_client->name, "gl518sm", I2C_NAME_SIZE);
new_client->id = gl518_id++; new_client->id = gl518_id++;
data->type = kind; data->type = kind;
data->valid = 0; data->valid = 0;
...@@ -424,28 +413,28 @@ static int gl518_detect(struct i2c_adapter *adapter, int address, int kind) ...@@ -424,28 +413,28 @@ static int gl518_detect(struct i2c_adapter *adapter, int address, int kind)
gl518_init_client((struct i2c_client *) new_client); gl518_init_client((struct i2c_client *) new_client);
/* Register sysfs hooks */ /* Register sysfs hooks */
device_create_file(&new_client->dev, &dev_attr_in_input0); device_create_file(&new_client->dev, &dev_attr_in0_input);
device_create_file(&new_client->dev, &dev_attr_in_input1); device_create_file(&new_client->dev, &dev_attr_in1_input);
device_create_file(&new_client->dev, &dev_attr_in_input2); device_create_file(&new_client->dev, &dev_attr_in2_input);
device_create_file(&new_client->dev, &dev_attr_in_input3); device_create_file(&new_client->dev, &dev_attr_in3_input);
device_create_file(&new_client->dev, &dev_attr_in_min0); device_create_file(&new_client->dev, &dev_attr_in0_min);
device_create_file(&new_client->dev, &dev_attr_in_min1); device_create_file(&new_client->dev, &dev_attr_in1_min);
device_create_file(&new_client->dev, &dev_attr_in_min2); device_create_file(&new_client->dev, &dev_attr_in2_min);
device_create_file(&new_client->dev, &dev_attr_in_min3); device_create_file(&new_client->dev, &dev_attr_in3_min);
device_create_file(&new_client->dev, &dev_attr_in_max0); device_create_file(&new_client->dev, &dev_attr_in0_max);
device_create_file(&new_client->dev, &dev_attr_in_max1); device_create_file(&new_client->dev, &dev_attr_in1_max);
device_create_file(&new_client->dev, &dev_attr_in_max2); device_create_file(&new_client->dev, &dev_attr_in2_max);
device_create_file(&new_client->dev, &dev_attr_in_max3); device_create_file(&new_client->dev, &dev_attr_in3_max);
device_create_file(&new_client->dev, &dev_attr_fan_auto1); device_create_file(&new_client->dev, &dev_attr_fan1_auto);
device_create_file(&new_client->dev, &dev_attr_fan_input1); device_create_file(&new_client->dev, &dev_attr_fan1_input);
device_create_file(&new_client->dev, &dev_attr_fan_input2); device_create_file(&new_client->dev, &dev_attr_fan2_input);
device_create_file(&new_client->dev, &dev_attr_fan_min1); device_create_file(&new_client->dev, &dev_attr_fan1_min);
device_create_file(&new_client->dev, &dev_attr_fan_min2); device_create_file(&new_client->dev, &dev_attr_fan2_min);
device_create_file(&new_client->dev, &dev_attr_fan_div1); device_create_file(&new_client->dev, &dev_attr_fan1_div);
device_create_file(&new_client->dev, &dev_attr_fan_div2); device_create_file(&new_client->dev, &dev_attr_fan2_div);
device_create_file(&new_client->dev, &dev_attr_temp_input1); device_create_file(&new_client->dev, &dev_attr_temp1_input);
device_create_file(&new_client->dev, &dev_attr_temp_max1); device_create_file(&new_client->dev, &dev_attr_temp1_max);
device_create_file(&new_client->dev, &dev_attr_temp_hyst1); device_create_file(&new_client->dev, &dev_attr_temp1_max_hyst);
device_create_file(&new_client->dev, &dev_attr_alarms); device_create_file(&new_client->dev, &dev_attr_alarms);
device_create_file(&new_client->dev, &dev_attr_beep_enable); device_create_file(&new_client->dev, &dev_attr_beep_enable);
device_create_file(&new_client->dev, &dev_attr_beep_mask); device_create_file(&new_client->dev, &dev_attr_beep_mask);
...@@ -523,8 +512,9 @@ static int gl518_write_value(struct i2c_client *client, u8 reg, u16 value) ...@@ -523,8 +512,9 @@ static int gl518_write_value(struct i2c_client *client, u8 reg, u16 value)
return i2c_smbus_write_byte_data(client, reg, value); return i2c_smbus_write_byte_data(client, reg, value);
} }
static void gl518_update_client(struct i2c_client *client) static struct gl518_data *gl518_update_device(struct device *dev)
{ {
struct i2c_client *client = to_i2c_client(dev);
struct gl518_data *data = i2c_get_clientdata(client); struct gl518_data *data = i2c_get_clientdata(client);
int val; int val;
...@@ -590,6 +580,8 @@ static void gl518_update_client(struct i2c_client *client) ...@@ -590,6 +580,8 @@ static void gl518_update_client(struct i2c_client *client)
} }
up(&data->update_lock); up(&data->update_lock);
return data;
} }
static int __init sensors_gl518sm_init(void) static int __init sensors_gl518sm_init(void)
......
This diff is collapsed.
...@@ -19,10 +19,6 @@ ...@@ -19,10 +19,6 @@
*/ */
#include <linux/config.h> #include <linux/config.h>
#ifdef CONFIG_I2C_DEBUG_CHIP
#define DEBUG 1
#endif
#include <linux/module.h> #include <linux/module.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/slab.h> #include <linux/slab.h>
...@@ -64,7 +60,7 @@ static void lm75_init_client(struct i2c_client *client); ...@@ -64,7 +60,7 @@ static void lm75_init_client(struct i2c_client *client);
static int lm75_detach_client(struct i2c_client *client); static int lm75_detach_client(struct i2c_client *client);
static int lm75_read_value(struct i2c_client *client, u8 reg); static int lm75_read_value(struct i2c_client *client, u8 reg);
static int lm75_write_value(struct i2c_client *client, u8 reg, u16 value); static int lm75_write_value(struct i2c_client *client, u8 reg, u16 value);
static void lm75_update_client(struct i2c_client *client); static struct lm75_data *lm75_update_device(struct device *dev);
/* This is the driver that will be inserted */ /* This is the driver that will be inserted */
...@@ -82,9 +78,7 @@ static int lm75_id = 0; ...@@ -82,9 +78,7 @@ static int lm75_id = 0;
#define show(value) \ #define show(value) \
static ssize_t show_##value(struct device *dev, char *buf) \ static ssize_t show_##value(struct device *dev, char *buf) \
{ \ { \
struct i2c_client *client = to_i2c_client(dev); \ struct lm75_data *data = lm75_update_device(dev); \
struct lm75_data *data = i2c_get_clientdata(client); \
lm75_update_client(client); \
return sprintf(buf, "%d\n", LM75_TEMP_FROM_REG(data->value)); \ return sprintf(buf, "%d\n", LM75_TEMP_FROM_REG(data->value)); \
} }
show(temp_max); show(temp_max);
...@@ -104,9 +98,9 @@ static ssize_t set_##value(struct device *dev, const char *buf, size_t count) \ ...@@ -104,9 +98,9 @@ static ssize_t set_##value(struct device *dev, const char *buf, size_t count) \
set(temp_max, LM75_REG_TEMP_OS); set(temp_max, LM75_REG_TEMP_OS);
set(temp_hyst, LM75_REG_TEMP_HYST); set(temp_hyst, LM75_REG_TEMP_HYST);
static DEVICE_ATTR(temp_max1, S_IWUSR | S_IRUGO, show_temp_max, set_temp_max); static DEVICE_ATTR(temp1_max, S_IWUSR | S_IRUGO, show_temp_max, set_temp_max);
static DEVICE_ATTR(temp_hyst1, S_IWUSR | S_IRUGO, show_temp_hyst, set_temp_hyst); static DEVICE_ATTR(temp1_max_hyst, S_IWUSR | S_IRUGO, show_temp_hyst, set_temp_hyst);
static DEVICE_ATTR(temp_input1, S_IRUGO, show_temp_input, NULL); static DEVICE_ATTR(temp1_input, S_IRUGO, show_temp_input, NULL);
static int lm75_attach_adapter(struct i2c_adapter *adapter) static int lm75_attach_adapter(struct i2c_adapter *adapter)
{ {
...@@ -122,7 +116,7 @@ static int lm75_detect(struct i2c_adapter *adapter, int address, int kind) ...@@ -122,7 +116,7 @@ static int lm75_detect(struct i2c_adapter *adapter, int address, int kind)
struct i2c_client *new_client; struct i2c_client *new_client;
struct lm75_data *data; struct lm75_data *data;
int err = 0; int err = 0;
const char *name; const char *name = "";
/* Make sure we aren't probing the ISA bus!! This is just a safety check /* Make sure we aren't probing the ISA bus!! This is just a safety check
at this moment; i2c_detect really won't call us. */ at this moment; i2c_detect really won't call us. */
...@@ -176,10 +170,6 @@ static int lm75_detect(struct i2c_adapter *adapter, int address, int kind) ...@@ -176,10 +170,6 @@ static int lm75_detect(struct i2c_adapter *adapter, int address, int kind)
if (kind == lm75) { if (kind == lm75) {
name = "lm75"; name = "lm75";
} else {
dev_dbg(&adapter->dev, "Internal error: unknown kind (%d)?!?",
kind);
goto exit_free;
} }
/* Fill in the remaining client fields and put it into the global list */ /* Fill in the remaining client fields and put it into the global list */
...@@ -197,9 +187,9 @@ static int lm75_detect(struct i2c_adapter *adapter, int address, int kind) ...@@ -197,9 +187,9 @@ static int lm75_detect(struct i2c_adapter *adapter, int address, int kind)
lm75_init_client(new_client); lm75_init_client(new_client);
/* Register sysfs hooks */ /* Register sysfs hooks */
device_create_file(&new_client->dev, &dev_attr_temp_max1); device_create_file(&new_client->dev, &dev_attr_temp1_max);
device_create_file(&new_client->dev, &dev_attr_temp_hyst1); device_create_file(&new_client->dev, &dev_attr_temp1_max_hyst);
device_create_file(&new_client->dev, &dev_attr_temp_input1); device_create_file(&new_client->dev, &dev_attr_temp1_input);
return 0; return 0;
...@@ -250,8 +240,9 @@ static void lm75_init_client(struct i2c_client *client) ...@@ -250,8 +240,9 @@ static void lm75_init_client(struct i2c_client *client)
lm75_write_value(client, LM75_REG_CONF, 0); lm75_write_value(client, LM75_REG_CONF, 0);
} }
static void lm75_update_client(struct i2c_client *client) static struct lm75_data *lm75_update_device(struct device *dev)
{ {
struct i2c_client *client = to_i2c_client(dev);
struct lm75_data *data = i2c_get_clientdata(client); struct lm75_data *data = i2c_get_clientdata(client);
down(&data->update_lock); down(&data->update_lock);
...@@ -268,6 +259,8 @@ static void lm75_update_client(struct i2c_client *client) ...@@ -268,6 +259,8 @@ static void lm75_update_client(struct i2c_client *client)
} }
up(&data->update_lock); up(&data->update_lock);
return data;
} }
static int __init sensors_lm75_init(void) static int __init sensors_lm75_init(void)
......
This diff is collapsed.
This diff is collapsed.
...@@ -28,10 +28,6 @@ ...@@ -28,10 +28,6 @@
*/ */
#include <linux/config.h> #include <linux/config.h>
#ifdef CONFIG_I2C_DEBUG_CHIP
#define DEBUG 1
#endif
#include <linux/module.h> #include <linux/module.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/slab.h> #include <linux/slab.h>
...@@ -118,7 +114,7 @@ static const u8 LM83_REG_W_HIGH[] = { ...@@ -118,7 +114,7 @@ static const u8 LM83_REG_W_HIGH[] = {
static int lm83_attach_adapter(struct i2c_adapter *adapter); static int lm83_attach_adapter(struct i2c_adapter *adapter);
static int lm83_detect(struct i2c_adapter *adapter, int address, int kind); static int lm83_detect(struct i2c_adapter *adapter, int address, int kind);
static int lm83_detach_client(struct i2c_client *client); static int lm83_detach_client(struct i2c_client *client);
static void lm83_update_client(struct i2c_client *client); static struct lm83_data *lm83_update_device(struct device *dev);
/* /*
* Driver data (common to all clients) * Driver data (common to all clients)
...@@ -162,9 +158,7 @@ static int lm83_id = 0; ...@@ -162,9 +158,7 @@ static int lm83_id = 0;
#define show_temp(suffix, value) \ #define show_temp(suffix, value) \
static ssize_t show_temp_##suffix(struct device *dev, char *buf) \ static ssize_t show_temp_##suffix(struct device *dev, char *buf) \
{ \ { \
struct i2c_client *client = to_i2c_client(dev); \ struct lm83_data *data = lm83_update_device(dev); \
struct lm83_data *data = i2c_get_clientdata(client); \
lm83_update_client(client); \
return sprintf(buf, "%d\n", TEMP_FROM_REG(data->value)); \ return sprintf(buf, "%d\n", TEMP_FROM_REG(data->value)); \
} }
show_temp(input1, temp_input[0]); show_temp(input1, temp_input[0]);
...@@ -195,23 +189,21 @@ set_temp(crit, temp_crit, LM83_REG_W_TCRIT); ...@@ -195,23 +189,21 @@ set_temp(crit, temp_crit, LM83_REG_W_TCRIT);
static ssize_t show_alarms(struct device *dev, char *buf) static ssize_t show_alarms(struct device *dev, char *buf)
{ {
struct i2c_client *client = to_i2c_client(dev); struct lm83_data *data = lm83_update_device(dev);
struct lm83_data *data = i2c_get_clientdata(client);
lm83_update_client(client);
return sprintf(buf, "%d\n", data->alarms); return sprintf(buf, "%d\n", data->alarms);
} }
static DEVICE_ATTR(temp_input1, S_IRUGO, show_temp_input1, NULL); static DEVICE_ATTR(temp1_input, S_IRUGO, show_temp_input1, NULL);
static DEVICE_ATTR(temp_input2, S_IRUGO, show_temp_input2, NULL); static DEVICE_ATTR(temp2_input, S_IRUGO, show_temp_input2, NULL);
static DEVICE_ATTR(temp_input3, S_IRUGO, show_temp_input3, NULL); static DEVICE_ATTR(temp3_input, S_IRUGO, show_temp_input3, NULL);
static DEVICE_ATTR(temp_input4, S_IRUGO, show_temp_input4, NULL); static DEVICE_ATTR(temp4_input, S_IRUGO, show_temp_input4, NULL);
static DEVICE_ATTR(temp_max1, S_IWUSR | S_IRUGO, show_temp_high1, static DEVICE_ATTR(temp1_max, S_IWUSR | S_IRUGO, show_temp_high1,
set_temp_high1); set_temp_high1);
static DEVICE_ATTR(temp_max2, S_IWUSR | S_IRUGO, show_temp_high2, static DEVICE_ATTR(temp2_max, S_IWUSR | S_IRUGO, show_temp_high2,
set_temp_high2); set_temp_high2);
static DEVICE_ATTR(temp_max3, S_IWUSR | S_IRUGO, show_temp_high3, static DEVICE_ATTR(temp3_max, S_IWUSR | S_IRUGO, show_temp_high3,
set_temp_high3); set_temp_high3);
static DEVICE_ATTR(temp_max4, S_IWUSR | S_IRUGO, show_temp_high4, static DEVICE_ATTR(temp4_max, S_IWUSR | S_IRUGO, show_temp_high4,
set_temp_high4); set_temp_high4);
static DEVICE_ATTR(temp_crit, S_IWUSR | S_IRUGO, show_temp_crit, static DEVICE_ATTR(temp_crit, S_IWUSR | S_IRUGO, show_temp_crit,
set_temp_crit); set_temp_crit);
...@@ -292,7 +284,6 @@ static int lm83_detect(struct i2c_adapter *adapter, int address, int kind) ...@@ -292,7 +284,6 @@ static int lm83_detect(struct i2c_adapter *adapter, int address, int kind)
if (man_id == 0x01) { /* National Semiconductor */ if (man_id == 0x01) { /* National Semiconductor */
if (chip_id == 0x03) { if (chip_id == 0x03) {
kind = lm83; kind = lm83;
name = "lm83";
} }
} }
...@@ -304,6 +295,10 @@ static int lm83_detect(struct i2c_adapter *adapter, int address, int kind) ...@@ -304,6 +295,10 @@ static int lm83_detect(struct i2c_adapter *adapter, int address, int kind)
} }
} }
if (kind == lm83) {
name = "lm83";
}
/* We can fill in the remaining client fields */ /* We can fill in the remaining client fields */
strlcpy(new_client->name, name, I2C_NAME_SIZE); strlcpy(new_client->name, name, I2C_NAME_SIZE);
new_client->id = lm83_id++; new_client->id = lm83_id++;
...@@ -320,14 +315,14 @@ static int lm83_detect(struct i2c_adapter *adapter, int address, int kind) ...@@ -320,14 +315,14 @@ static int lm83_detect(struct i2c_adapter *adapter, int address, int kind)
*/ */
/* Register sysfs hooks */ /* Register sysfs hooks */
device_create_file(&new_client->dev, &dev_attr_temp_input1); device_create_file(&new_client->dev, &dev_attr_temp1_input);
device_create_file(&new_client->dev, &dev_attr_temp_input2); device_create_file(&new_client->dev, &dev_attr_temp2_input);
device_create_file(&new_client->dev, &dev_attr_temp_input3); device_create_file(&new_client->dev, &dev_attr_temp3_input);
device_create_file(&new_client->dev, &dev_attr_temp_input4); device_create_file(&new_client->dev, &dev_attr_temp4_input);
device_create_file(&new_client->dev, &dev_attr_temp_max1); device_create_file(&new_client->dev, &dev_attr_temp1_max);
device_create_file(&new_client->dev, &dev_attr_temp_max2); device_create_file(&new_client->dev, &dev_attr_temp2_max);
device_create_file(&new_client->dev, &dev_attr_temp_max3); device_create_file(&new_client->dev, &dev_attr_temp3_max);
device_create_file(&new_client->dev, &dev_attr_temp_max4); device_create_file(&new_client->dev, &dev_attr_temp4_max);
device_create_file(&new_client->dev, &dev_attr_temp_crit); device_create_file(&new_client->dev, &dev_attr_temp_crit);
device_create_file(&new_client->dev, &dev_attr_alarms); device_create_file(&new_client->dev, &dev_attr_alarms);
...@@ -353,8 +348,9 @@ static int lm83_detach_client(struct i2c_client *client) ...@@ -353,8 +348,9 @@ static int lm83_detach_client(struct i2c_client *client)
return 0; return 0;
} }
static void lm83_update_client(struct i2c_client *client) static struct lm83_data *lm83_update_device(struct device *dev)
{ {
struct i2c_client *client = to_i2c_client(dev);
struct lm83_data *data = i2c_get_clientdata(client); struct lm83_data *data = i2c_get_clientdata(client);
down(&data->update_lock); down(&data->update_lock);
...@@ -385,6 +381,8 @@ static void lm83_update_client(struct i2c_client *client) ...@@ -385,6 +381,8 @@ static void lm83_update_client(struct i2c_client *client)
} }
up(&data->update_lock); up(&data->update_lock);
return data;
} }
static int __init sensors_lm83_init(void) static int __init sensors_lm83_init(void)
......
This diff is collapsed.
...@@ -36,10 +36,6 @@ ...@@ -36,10 +36,6 @@
*/ */
#include <linux/config.h> #include <linux/config.h>
#ifdef CONFIG_I2C_DEBUG_CHIP
#define DEBUG 1
#endif
#include <linux/module.h> #include <linux/module.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/slab.h> #include <linux/slab.h>
...@@ -126,7 +122,7 @@ static int lm90_detect(struct i2c_adapter *adapter, int address, ...@@ -126,7 +122,7 @@ static int lm90_detect(struct i2c_adapter *adapter, int address,
int kind); int kind);
static void lm90_init_client(struct i2c_client *client); static void lm90_init_client(struct i2c_client *client);
static int lm90_detach_client(struct i2c_client *client); static int lm90_detach_client(struct i2c_client *client);
static void lm90_update_client(struct i2c_client *client); static struct lm90_data *lm90_update_device(struct device *dev);
/* /*
* Driver data (common to all clients) * Driver data (common to all clients)
...@@ -171,9 +167,7 @@ static int lm90_id = 0; ...@@ -171,9 +167,7 @@ static int lm90_id = 0;
#define show_temp(value, converter) \ #define show_temp(value, converter) \
static ssize_t show_##value(struct device *dev, char *buf) \ static ssize_t show_##value(struct device *dev, char *buf) \
{ \ { \
struct i2c_client *client = to_i2c_client(dev); \ struct lm90_data *data = lm90_update_device(dev); \
struct lm90_data *data = i2c_get_clientdata(client); \
lm90_update_client(client); \
return sprintf(buf, "%d\n", converter(data->value)); \ return sprintf(buf, "%d\n", converter(data->value)); \
} }
show_temp(temp_input1, TEMP1_FROM_REG); show_temp(temp_input1, TEMP1_FROM_REG);
...@@ -216,9 +210,7 @@ set_temp1(temp_crit2, LM90_REG_W_REMOTE_CRIT); ...@@ -216,9 +210,7 @@ set_temp1(temp_crit2, LM90_REG_W_REMOTE_CRIT);
#define show_temp_hyst(value, basereg) \ #define show_temp_hyst(value, basereg) \
static ssize_t show_##value(struct device *dev, char *buf) \ static ssize_t show_##value(struct device *dev, char *buf) \
{ \ { \
struct i2c_client *client = to_i2c_client(dev); \ struct lm90_data *data = lm90_update_device(dev); \
struct lm90_data *data = i2c_get_clientdata(client); \
lm90_update_client(client); \
return sprintf(buf, "%d\n", TEMP1_FROM_REG(data->basereg) \ return sprintf(buf, "%d\n", TEMP1_FROM_REG(data->basereg) \
- HYST_FROM_REG(data->temp_hyst)); \ - HYST_FROM_REG(data->temp_hyst)); \
} }
...@@ -239,29 +231,27 @@ static ssize_t set_temp_hyst1(struct device *dev, const char *buf, ...@@ -239,29 +231,27 @@ static ssize_t set_temp_hyst1(struct device *dev, const char *buf,
static ssize_t show_alarms(struct device *dev, char *buf) static ssize_t show_alarms(struct device *dev, char *buf)
{ {
struct i2c_client *client = to_i2c_client(dev); struct lm90_data *data = lm90_update_device(dev);
struct lm90_data *data = i2c_get_clientdata(client);
lm90_update_client(client);
return sprintf(buf, "%d\n", data->alarms); return sprintf(buf, "%d\n", data->alarms);
} }
static DEVICE_ATTR(temp_input1, S_IRUGO, show_temp_input1, NULL); static DEVICE_ATTR(temp1_input, S_IRUGO, show_temp_input1, NULL);
static DEVICE_ATTR(temp_input2, S_IRUGO, show_temp_input2, NULL); static DEVICE_ATTR(temp2_input, S_IRUGO, show_temp_input2, NULL);
static DEVICE_ATTR(temp_min1, S_IWUSR | S_IRUGO, show_temp_low1, static DEVICE_ATTR(temp1_min, S_IWUSR | S_IRUGO, show_temp_low1,
set_temp_low1); set_temp_low1);
static DEVICE_ATTR(temp_min2, S_IWUSR | S_IRUGO, show_temp_low2, static DEVICE_ATTR(temp2_min, S_IWUSR | S_IRUGO, show_temp_low2,
set_temp_low2); set_temp_low2);
static DEVICE_ATTR(temp_max1, S_IWUSR | S_IRUGO, show_temp_high1, static DEVICE_ATTR(temp1_max, S_IWUSR | S_IRUGO, show_temp_high1,
set_temp_high1); set_temp_high1);
static DEVICE_ATTR(temp_max2, S_IWUSR | S_IRUGO, show_temp_high2, static DEVICE_ATTR(temp2_max, S_IWUSR | S_IRUGO, show_temp_high2,
set_temp_high2); set_temp_high2);
static DEVICE_ATTR(temp_crit1, S_IWUSR | S_IRUGO, show_temp_crit1, static DEVICE_ATTR(temp1_crit, S_IWUSR | S_IRUGO, show_temp_crit1,
set_temp_crit1); set_temp_crit1);
static DEVICE_ATTR(temp_crit2, S_IWUSR | S_IRUGO, show_temp_crit2, static DEVICE_ATTR(temp2_crit, S_IWUSR | S_IRUGO, show_temp_crit2,
set_temp_crit2); set_temp_crit2);
static DEVICE_ATTR(temp_hyst1, S_IWUSR | S_IRUGO, show_temp_hyst1, static DEVICE_ATTR(temp1_crit_hyst, S_IWUSR | S_IRUGO, show_temp_hyst1,
set_temp_hyst1); set_temp_hyst1);
static DEVICE_ATTR(temp_hyst2, S_IRUGO, show_temp_hyst2, NULL); static DEVICE_ATTR(temp2_crit_hyst, S_IRUGO, show_temp_hyst2, NULL);
static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL); static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL);
/* /*
...@@ -347,7 +337,6 @@ static int lm90_detect(struct i2c_adapter *adapter, int address, int kind) ...@@ -347,7 +337,6 @@ static int lm90_detect(struct i2c_adapter *adapter, int address, int kind)
LM90_REG_R_CONFIG2) & 0xF8) == 0x00 LM90_REG_R_CONFIG2) & 0xF8) == 0x00
&& reg_convrate <= 0x09))) { && reg_convrate <= 0x09))) {
kind = lm90; kind = lm90;
name = "lm90";
} }
} }
else if (man_id == 0x41) { /* Analog Devices */ else if (man_id == 0x41) { /* Analog Devices */
...@@ -355,7 +344,6 @@ static int lm90_detect(struct i2c_adapter *adapter, int address, int kind) ...@@ -355,7 +344,6 @@ static int lm90_detect(struct i2c_adapter *adapter, int address, int kind)
&& (kind == 0 /* skip detection */ && (kind == 0 /* skip detection */
|| (reg_config1 & 0x3F) == 0x00)) { || (reg_config1 & 0x3F) == 0x00)) {
kind = adm1032; kind = adm1032;
name = "adm1032";
} }
} }
...@@ -367,6 +355,12 @@ static int lm90_detect(struct i2c_adapter *adapter, int address, int kind) ...@@ -367,6 +355,12 @@ static int lm90_detect(struct i2c_adapter *adapter, int address, int kind)
} }
} }
if (kind == lm90) {
name = "lm90";
} else if (kind == adm1032) {
name = "adm1032";
}
/* We can fill in the remaining client fields */ /* We can fill in the remaining client fields */
strlcpy(new_client->name, name, I2C_NAME_SIZE); strlcpy(new_client->name, name, I2C_NAME_SIZE);
new_client->id = lm90_id++; new_client->id = lm90_id++;
...@@ -381,16 +375,16 @@ static int lm90_detect(struct i2c_adapter *adapter, int address, int kind) ...@@ -381,16 +375,16 @@ static int lm90_detect(struct i2c_adapter *adapter, int address, int kind)
lm90_init_client(new_client); lm90_init_client(new_client);
/* Register sysfs hooks */ /* Register sysfs hooks */
device_create_file(&new_client->dev, &dev_attr_temp_input1); device_create_file(&new_client->dev, &dev_attr_temp1_input);
device_create_file(&new_client->dev, &dev_attr_temp_input2); device_create_file(&new_client->dev, &dev_attr_temp2_input);
device_create_file(&new_client->dev, &dev_attr_temp_min1); device_create_file(&new_client->dev, &dev_attr_temp1_min);
device_create_file(&new_client->dev, &dev_attr_temp_min2); device_create_file(&new_client->dev, &dev_attr_temp2_min);
device_create_file(&new_client->dev, &dev_attr_temp_max1); device_create_file(&new_client->dev, &dev_attr_temp1_max);
device_create_file(&new_client->dev, &dev_attr_temp_max2); device_create_file(&new_client->dev, &dev_attr_temp2_max);
device_create_file(&new_client->dev, &dev_attr_temp_crit1); device_create_file(&new_client->dev, &dev_attr_temp1_crit);
device_create_file(&new_client->dev, &dev_attr_temp_crit2); device_create_file(&new_client->dev, &dev_attr_temp2_crit);
device_create_file(&new_client->dev, &dev_attr_temp_hyst1); device_create_file(&new_client->dev, &dev_attr_temp1_crit_hyst);
device_create_file(&new_client->dev, &dev_attr_temp_hyst2); device_create_file(&new_client->dev, &dev_attr_temp2_crit_hyst);
device_create_file(&new_client->dev, &dev_attr_alarms); device_create_file(&new_client->dev, &dev_attr_alarms);
return 0; return 0;
...@@ -430,8 +424,9 @@ static int lm90_detach_client(struct i2c_client *client) ...@@ -430,8 +424,9 @@ static int lm90_detach_client(struct i2c_client *client)
return 0; return 0;
} }
static void lm90_update_client(struct i2c_client *client) static struct lm90_data *lm90_update_device(struct device *dev)
{ {
struct i2c_client *client = to_i2c_client(dev);
struct lm90_data *data = i2c_get_clientdata(client); struct lm90_data *data = i2c_get_clientdata(client);
down(&data->update_lock); down(&data->update_lock);
...@@ -505,6 +500,8 @@ static void lm90_update_client(struct i2c_client *client) ...@@ -505,6 +500,8 @@ static void lm90_update_client(struct i2c_client *client)
} }
up(&data->update_lock); up(&data->update_lock);
return data;
} }
static int __init sensors_lm90_init(void) static int __init sensors_lm90_init(void)
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -12,6 +12,9 @@ ...@@ -12,6 +12,9 @@
* Ported to Linux 2.6 by Wolfgang Ziegler <nuppla@gmx.at> and Jean Delvare * Ported to Linux 2.6 by Wolfgang Ziegler <nuppla@gmx.at> and Jean Delvare
* <khali@linux-fr.org>. * <khali@linux-fr.org>.
* *
* Thanks to James Bolt <james@evilpenguin.com> for benchmarking the read
* error handling mechanism.
*
* This program is free software; you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or * the Free Software Foundation; either version 2 of the License, or
...@@ -28,10 +31,6 @@ ...@@ -28,10 +31,6 @@
*/ */
#include <linux/config.h> #include <linux/config.h>
#ifdef CONFIG_I2C_DEBUG_CHIP
#define DEBUG 1
#endif
#include <linux/module.h> #include <linux/module.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/slab.h> #include <linux/slab.h>
...@@ -86,7 +85,7 @@ static int w83l785ts_detect(struct i2c_adapter *adapter, int address, ...@@ -86,7 +85,7 @@ static int w83l785ts_detect(struct i2c_adapter *adapter, int address,
int kind); int kind);
static int w83l785ts_detach_client(struct i2c_client *client); static int w83l785ts_detach_client(struct i2c_client *client);
static u8 w83l785ts_read_value(struct i2c_client *client, u8 reg, u8 defval); static u8 w83l785ts_read_value(struct i2c_client *client, u8 reg, u8 defval);
static void w83l785ts_update_client(struct i2c_client *client); static struct w83l785ts_data *w83l785ts_update_device(struct device *dev);
/* /*
* Driver data (common to all clients) * Driver data (common to all clients)
...@@ -127,22 +126,18 @@ static int w83l785ts_id = 0; ...@@ -127,22 +126,18 @@ static int w83l785ts_id = 0;
static ssize_t show_temp(struct device *dev, char *buf) static ssize_t show_temp(struct device *dev, char *buf)
{ {
struct i2c_client *client = to_i2c_client(dev); struct w83l785ts_data *data = w83l785ts_update_device(dev);
struct w83l785ts_data *data = i2c_get_clientdata(client);
w83l785ts_update_client(client);
return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp)); return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp));
} }
static ssize_t show_temp_over(struct device *dev, char *buf) static ssize_t show_temp_over(struct device *dev, char *buf)
{ {
struct i2c_client *client = to_i2c_client(dev); struct w83l785ts_data *data = w83l785ts_update_device(dev);
struct w83l785ts_data *data = i2c_get_clientdata(client);
w83l785ts_update_client(client);
return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_over)); return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_over));
} }
static DEVICE_ATTR(temp_input1, S_IRUGO, show_temp, NULL) static DEVICE_ATTR(temp1_input, S_IRUGO, show_temp, NULL)
static DEVICE_ATTR(temp_max1, S_IRUGO, show_temp_over, NULL) static DEVICE_ATTR(temp1_max, S_IRUGO, show_temp_over, NULL)
/* /*
* Real code * Real code
...@@ -164,7 +159,6 @@ static int w83l785ts_detect(struct i2c_adapter *adapter, int address, int kind) ...@@ -164,7 +159,6 @@ static int w83l785ts_detect(struct i2c_adapter *adapter, int address, int kind)
struct i2c_client *new_client; struct i2c_client *new_client;
struct w83l785ts_data *data; struct w83l785ts_data *data;
int err = 0; int err = 0;
const char *name = "";
if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))
...@@ -225,7 +219,6 @@ static int w83l785ts_detect(struct i2c_adapter *adapter, int address, int kind) ...@@ -225,7 +219,6 @@ static int w83l785ts_detect(struct i2c_adapter *adapter, int address, int kind)
if (man_id == 0x5CA3) { /* Winbond */ if (man_id == 0x5CA3) { /* Winbond */
if (chip_id == 0x70) { /* W83L785TS-S */ if (chip_id == 0x70) { /* W83L785TS-S */
kind = w83l785ts; kind = w83l785ts;
name = "w83l785ts";
} }
} }
...@@ -238,7 +231,7 @@ static int w83l785ts_detect(struct i2c_adapter *adapter, int address, int kind) ...@@ -238,7 +231,7 @@ static int w83l785ts_detect(struct i2c_adapter *adapter, int address, int kind)
} }
/* We can fill in the remaining client fields. */ /* We can fill in the remaining client fields. */
strlcpy(new_client->name, name, I2C_NAME_SIZE); strlcpy(new_client->name, "w83l785ts", I2C_NAME_SIZE);
new_client->id = w83l785ts_id++; new_client->id = w83l785ts_id++;
data->valid = 0; data->valid = 0;
init_MUTEX(&data->update_lock); init_MUTEX(&data->update_lock);
...@@ -256,8 +249,8 @@ static int w83l785ts_detect(struct i2c_adapter *adapter, int address, int kind) ...@@ -256,8 +249,8 @@ static int w83l785ts_detect(struct i2c_adapter *adapter, int address, int kind)
*/ */
/* Register sysfs hooks */ /* Register sysfs hooks */
device_create_file(&new_client->dev, &dev_attr_temp_input1); device_create_file(&new_client->dev, &dev_attr_temp1_input);
device_create_file(&new_client->dev, &dev_attr_temp_max1); device_create_file(&new_client->dev, &dev_attr_temp1_max);
return 0; return 0;
...@@ -301,8 +294,9 @@ static u8 w83l785ts_read_value(struct i2c_client *client, u8 reg, u8 defval) ...@@ -301,8 +294,9 @@ static u8 w83l785ts_read_value(struct i2c_client *client, u8 reg, u8 defval)
return defval; return defval;
} }
static void w83l785ts_update_client(struct i2c_client *client) static struct w83l785ts_data *w83l785ts_update_device(struct device *dev)
{ {
struct i2c_client *client = to_i2c_client(dev);
struct w83l785ts_data *data = i2c_get_clientdata(client); struct w83l785ts_data *data = i2c_get_clientdata(client);
down(&data->update_lock); down(&data->update_lock);
...@@ -321,6 +315,8 @@ static void w83l785ts_update_client(struct i2c_client *client) ...@@ -321,6 +315,8 @@ static void w83l785ts_update_client(struct i2c_client *client)
} }
up(&data->update_lock); up(&data->update_lock);
return data;
} }
static int __init sensors_w83l785ts_init(void) static int __init sensors_w83l785ts_init(void)
......
...@@ -22,10 +22,6 @@ ...@@ -22,10 +22,6 @@
SMBus 2.0 support by Mark Studebaker <mdsxyz123@yahoo.com> */ SMBus 2.0 support by Mark Studebaker <mdsxyz123@yahoo.com> */
#include <linux/config.h> #include <linux/config.h>
#ifdef CONFIG_I2C_DEBUG_CORE
#define DEBUG 1
#endif
#include <linux/module.h> #include <linux/module.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/errno.h> #include <linux/errno.h>
...@@ -175,7 +171,7 @@ int i2c_del_adapter(struct i2c_adapter *adap) ...@@ -175,7 +171,7 @@ int i2c_del_adapter(struct i2c_adapter *adap)
driver = list_entry(item, struct i2c_driver, list); driver = list_entry(item, struct i2c_driver, list);
if (driver->detach_adapter) if (driver->detach_adapter)
if ((res = driver->detach_adapter(adap))) { if ((res = driver->detach_adapter(adap))) {
dev_warn(&adap->dev, "can't detach adapter" dev_warn(&adap->dev, "can't detach adapter "
"while detaching driver %s: driver not " "while detaching driver %s: driver not "
"detached!", driver->name); "detached!", driver->name);
goto out_unlock; goto out_unlock;
...@@ -437,8 +433,11 @@ static void i2c_dec_use_client(struct i2c_client *client) ...@@ -437,8 +433,11 @@ static void i2c_dec_use_client(struct i2c_client *client)
int i2c_use_client(struct i2c_client *client) int i2c_use_client(struct i2c_client *client)
{ {
if (!i2c_inc_use_client(client)) int ret;
return -ENODEV;
ret = i2c_inc_use_client(client);
if (ret)
return ret;
if (client->flags & I2C_CLIENT_ALLOW_USE) { if (client->flags & I2C_CLIENT_ALLOW_USE) {
if (client->flags & I2C_CLIENT_ALLOW_MULTIPLE_USE) if (client->flags & I2C_CLIENT_ALLOW_MULTIPLE_USE)
...@@ -618,7 +617,7 @@ int i2c_control(struct i2c_client *client, ...@@ -618,7 +617,7 @@ int i2c_control(struct i2c_client *client,
int ret = 0; int ret = 0;
struct i2c_adapter *adap = client->adapter; struct i2c_adapter *adap = client->adapter;
dev_dbg(&client->dev, "i2c ioctl, cmd: 0x%x, arg: %#lx\n", cmd, arg); dev_dbg(&client->adapter->dev, "i2c ioctl, cmd: 0x%x, arg: %#lx\n", cmd, arg);
switch (cmd) { switch (cmd) {
case I2C_RETRIES: case I2C_RETRIES:
adap->retries = arg; adap->retries = arg;
......
This diff is collapsed.
...@@ -20,10 +20,6 @@ ...@@ -20,10 +20,6 @@
*/ */
#include <linux/config.h> #include <linux/config.h>
#ifdef CONFIG_I2C_DEBUG_CORE
#define DEBUG 1
#endif
#include <linux/module.h> #include <linux/module.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/slab.h> #include <linux/slab.h>
......
This diff is collapsed.
...@@ -569,6 +569,7 @@ ...@@ -569,6 +569,7 @@
#define PCI_DEVICE_ID_SI_6202 0x0002 #define PCI_DEVICE_ID_SI_6202 0x0002
#define PCI_DEVICE_ID_SI_503 0x0008 #define PCI_DEVICE_ID_SI_503 0x0008
#define PCI_DEVICE_ID_SI_ACPI 0x0009 #define PCI_DEVICE_ID_SI_ACPI 0x0009
#define PCI_DEVICE_ID_SI_LPC 0x0018
#define PCI_DEVICE_ID_SI_5597_VGA 0x0200 #define PCI_DEVICE_ID_SI_5597_VGA 0x0200
#define PCI_DEVICE_ID_SI_6205 0x0205 #define PCI_DEVICE_ID_SI_6205 0x0205
#define PCI_DEVICE_ID_SI_501 0x0406 #define PCI_DEVICE_ID_SI_501 0x0406
......
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