Commit 37d8cb54 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'i2c-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jdelvare/staging

* 'i2c-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jdelvare/staging:
  i2c-parport: Various cleanups
  i2c-i801: Don't depend on other kernel driver config options
  i2c-i801: Check for vendor Fujitsu before probing for apanel
  i2c-i801: Don't probe for slaves on IDF channels
  i2c-i801: SMBus patch for Intel Panther Point DeviceIDs
  i2c/writing-clients: Fix foo_driver.id_table
parents dc522adb 07da0372
...@@ -19,6 +19,7 @@ Supported adapters: ...@@ -19,6 +19,7 @@ Supported adapters:
* Intel 6 Series (PCH) * Intel 6 Series (PCH)
* Intel Patsburg (PCH) * Intel Patsburg (PCH)
* Intel DH89xxCC (PCH) * Intel DH89xxCC (PCH)
* Intel Panther Point (PCH)
Datasheets: Publicly available at the Intel website Datasheets: Publicly available at the Intel website
On Intel Patsburg and later chipsets, both the normal host SMBus controller On Intel Patsburg and later chipsets, both the normal host SMBus controller
......
...@@ -38,7 +38,7 @@ static struct i2c_driver foo_driver = { ...@@ -38,7 +38,7 @@ static struct i2c_driver foo_driver = {
.name = "foo", .name = "foo",
}, },
.id_table = foo_ids, .id_table = foo_idtable,
.probe = foo_probe, .probe = foo_probe,
.remove = foo_remove, .remove = foo_remove,
/* if device autodetection is needed: */ /* if device autodetection is needed: */
......
...@@ -79,6 +79,7 @@ config I2C_AMD8111 ...@@ -79,6 +79,7 @@ config I2C_AMD8111
config I2C_I801 config I2C_I801
tristate "Intel 82801 (ICH/PCH)" tristate "Intel 82801 (ICH/PCH)"
depends on PCI depends on PCI
select CHECK_SIGNATURE if X86 && DMI
help help
If you say yes to this option, support will be included for the Intel If you say yes to this option, support will be included for the Intel
801 family of mainboard I2C interfaces. Specifically, the following 801 family of mainboard I2C interfaces. Specifically, the following
...@@ -101,6 +102,7 @@ config I2C_I801 ...@@ -101,6 +102,7 @@ config I2C_I801
6 Series (PCH) 6 Series (PCH)
Patsburg (PCH) Patsburg (PCH)
DH89xxCC (PCH) DH89xxCC (PCH)
Panther Point (PCH)
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-i801. will be called i2c-i801.
......
...@@ -50,6 +50,7 @@ ...@@ -50,6 +50,7 @@
Patsburg (PCH) IDF 0x1d71 32 hard yes yes yes Patsburg (PCH) IDF 0x1d71 32 hard yes yes yes
Patsburg (PCH) IDF 0x1d72 32 hard yes yes yes Patsburg (PCH) IDF 0x1d72 32 hard yes yes yes
DH89xxCC (PCH) 0x2330 32 hard yes yes yes DH89xxCC (PCH) 0x2330 32 hard yes yes yes
Panther Point (PCH) 0x1e22 32 hard yes yes yes
Features supported by this driver: Features supported by this driver:
Software PEC no Software PEC no
...@@ -137,11 +138,11 @@ ...@@ -137,11 +138,11 @@
/* Older devices have their ID defined in <linux/pci_ids.h> */ /* Older devices have their ID defined in <linux/pci_ids.h> */
#define PCI_DEVICE_ID_INTEL_COUGARPOINT_SMBUS 0x1c22 #define PCI_DEVICE_ID_INTEL_COUGARPOINT_SMBUS 0x1c22
#define PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS 0x1d22 #define PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS 0x1d22
#define PCI_DEVICE_ID_INTEL_PANTHERPOINT_SMBUS 0x1e22
/* Patsburg also has three 'Integrated Device Function' SMBus controllers */ /* Patsburg also has three 'Integrated Device Function' SMBus controllers */
#define PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF0 0x1d70 #define PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF0 0x1d70
#define PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF1 0x1d71 #define PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF1 0x1d71
#define PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF2 0x1d72 #define PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF2 0x1d72
#define PCI_DEVICE_ID_INTEL_PANTHERPOINT_SMBUS 0x1e22
#define PCI_DEVICE_ID_INTEL_DH89XXCC_SMBUS 0x2330 #define PCI_DEVICE_ID_INTEL_DH89XXCC_SMBUS 0x2330
#define PCI_DEVICE_ID_INTEL_5_3400_SERIES_SMBUS 0x3b30 #define PCI_DEVICE_ID_INTEL_5_3400_SERIES_SMBUS 0x3b30
...@@ -159,6 +160,8 @@ static struct pci_driver i801_driver; ...@@ -159,6 +160,8 @@ static struct pci_driver i801_driver;
#define FEATURE_BLOCK_BUFFER (1 << 1) #define FEATURE_BLOCK_BUFFER (1 << 1)
#define FEATURE_BLOCK_PROC (1 << 2) #define FEATURE_BLOCK_PROC (1 << 2)
#define FEATURE_I2C_BLOCK_READ (1 << 3) #define FEATURE_I2C_BLOCK_READ (1 << 3)
/* Not really a feature, but it's convenient to handle it as such */
#define FEATURE_IDF (1 << 15)
static const char *i801_feature_names[] = { static const char *i801_feature_names[] = {
"SMBus PEC", "SMBus PEC",
...@@ -629,12 +632,13 @@ static const struct pci_device_id i801_ids[] = { ...@@ -629,12 +632,13 @@ static const struct pci_device_id i801_ids[] = {
{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF1) }, { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF1) },
{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF2) }, { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF2) },
{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_DH89XXCC_SMBUS) }, { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_DH89XXCC_SMBUS) },
{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PANTHERPOINT_SMBUS) },
{ 0, } { 0, }
}; };
MODULE_DEVICE_TABLE(pci, i801_ids); MODULE_DEVICE_TABLE(pci, i801_ids);
#if defined CONFIG_INPUT_APANEL || defined CONFIG_INPUT_APANEL_MODULE #if defined CONFIG_X86 && defined CONFIG_DMI
static unsigned char apanel_addr; static unsigned char apanel_addr;
/* Scan the system ROM for the signature "FJKEYINF" */ /* Scan the system ROM for the signature "FJKEYINF" */
...@@ -664,11 +668,7 @@ static void __init input_apanel_init(void) ...@@ -664,11 +668,7 @@ static void __init input_apanel_init(void)
} }
iounmap(bios); iounmap(bios);
} }
#else
static void __init input_apanel_init(void) {}
#endif
#if defined CONFIG_SENSORS_FSCHMD || defined CONFIG_SENSORS_FSCHMD_MODULE
struct dmi_onboard_device_info { struct dmi_onboard_device_info {
const char *name; const char *name;
u8 type; u8 type;
...@@ -734,7 +734,30 @@ static void __devinit dmi_check_onboard_devices(const struct dmi_header *dm, ...@@ -734,7 +734,30 @@ static void __devinit dmi_check_onboard_devices(const struct dmi_header *dm,
dmi_check_onboard_device(type, name, adap); dmi_check_onboard_device(type, name, adap);
} }
} }
#endif
/* Register optional slaves */
static void __devinit i801_probe_optional_slaves(struct i801_priv *priv)
{
/* Only register slaves on main SMBus channel */
if (priv->features & FEATURE_IDF)
return;
if (apanel_addr) {
struct i2c_board_info info;
memset(&info, 0, sizeof(struct i2c_board_info));
info.addr = apanel_addr;
strlcpy(info.type, "fujitsu_apanel", I2C_NAME_SIZE);
i2c_new_device(&priv->adapter, &info);
}
if (dmi_name_in_vendors("FUJITSU"))
dmi_walk(dmi_check_onboard_devices, &priv->adapter);
}
#else
static void __init input_apanel_init(void) {}
static void __devinit i801_probe_optional_slaves(struct i801_priv *priv) {}
#endif /* CONFIG_X86 && CONFIG_DMI */
static int __devinit i801_probe(struct pci_dev *dev, static int __devinit i801_probe(struct pci_dev *dev,
const struct pci_device_id *id) const struct pci_device_id *id)
...@@ -754,6 +777,11 @@ static int __devinit i801_probe(struct pci_dev *dev, ...@@ -754,6 +777,11 @@ static int __devinit i801_probe(struct pci_dev *dev,
priv->pci_dev = dev; priv->pci_dev = dev;
switch (dev->device) { switch (dev->device) {
case PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF0:
case PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF1:
case PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF2:
priv->features |= FEATURE_IDF;
/* fall through */
default: default:
priv->features |= FEATURE_I2C_BLOCK_READ; priv->features |= FEATURE_I2C_BLOCK_READ;
/* fall through */ /* fall through */
...@@ -839,21 +867,7 @@ static int __devinit i801_probe(struct pci_dev *dev, ...@@ -839,21 +867,7 @@ static int __devinit i801_probe(struct pci_dev *dev,
goto exit_release; goto exit_release;
} }
/* Register optional slaves */ i801_probe_optional_slaves(priv);
#if defined CONFIG_INPUT_APANEL || defined CONFIG_INPUT_APANEL_MODULE
if (apanel_addr) {
struct i2c_board_info info;
memset(&info, 0, sizeof(struct i2c_board_info));
info.addr = apanel_addr;
strlcpy(info.type, "fujitsu_apanel", I2C_NAME_SIZE);
i2c_new_device(&priv->adapter, &info);
}
#endif
#if defined CONFIG_SENSORS_FSCHMD || defined CONFIG_SENSORS_FSCHMD_MODULE
if (dmi_name_in_vendors("FUJITSU"))
dmi_walk(dmi_check_onboard_devices, &priv->adapter);
#endif
pci_set_drvdata(dev, priv); pci_set_drvdata(dev, priv);
return 0; return 0;
...@@ -913,6 +927,7 @@ static struct pci_driver i801_driver = { ...@@ -913,6 +927,7 @@ static struct pci_driver i801_driver = {
static int __init i2c_i801_init(void) static int __init i2c_i801_init(void)
{ {
if (dmi_name_in_vendors("FUJITSU"))
input_apanel_init(); input_apanel_init();
return pci_register_driver(&i801_driver); return pci_register_driver(&i801_driver);
} }
......
...@@ -132,7 +132,7 @@ static struct i2c_smbus_alert_setup alert_data = { ...@@ -132,7 +132,7 @@ static struct i2c_smbus_alert_setup alert_data = {
static struct i2c_client *ara; static struct i2c_client *ara;
static struct lineop parport_ctrl_irq = { static struct lineop parport_ctrl_irq = {
.val = (1 << 4), .val = (1 << 4),
.port = CTRL, .port = PORT_CTRL,
}; };
static int __devinit i2c_parport_probe(struct platform_device *pdev) static int __devinit i2c_parport_probe(struct platform_device *pdev)
......
...@@ -78,13 +78,13 @@ static unsigned char port_read_control(struct parport *p) ...@@ -78,13 +78,13 @@ static unsigned char port_read_control(struct parport *p)
return parport_read_control(p); return parport_read_control(p);
} }
static void (*port_write[])(struct parport *, unsigned char) = { static void (* const port_write[])(struct parport *, unsigned char) = {
port_write_data, port_write_data,
NULL, NULL,
port_write_control, port_write_control,
}; };
static unsigned char (*port_read[])(struct parport *) = { static unsigned char (* const port_read[])(struct parport *) = {
port_read_data, port_read_data,
port_read_status, port_read_status,
port_read_control, port_read_control,
...@@ -164,7 +164,7 @@ void i2c_parport_irq(void *data) ...@@ -164,7 +164,7 @@ void i2c_parport_irq(void *data)
"SMBus alert received but no ARA client!\n"); "SMBus alert received but no ARA client!\n");
} }
static void i2c_parport_attach (struct parport *port) static void i2c_parport_attach(struct parport *port)
{ {
struct i2c_par *adapter; struct i2c_par *adapter;
...@@ -180,7 +180,7 @@ static void i2c_parport_attach (struct parport *port) ...@@ -180,7 +180,7 @@ static void i2c_parport_attach (struct parport *port)
NULL, NULL, i2c_parport_irq, PARPORT_FLAG_EXCL, adapter); NULL, NULL, i2c_parport_irq, PARPORT_FLAG_EXCL, adapter);
if (!adapter->pdev) { if (!adapter->pdev) {
printk(KERN_ERR "i2c-parport: Unable to register with parport\n"); printk(KERN_ERR "i2c-parport: Unable to register with parport\n");
goto ERROR0; goto err_free;
} }
/* Fill the rest of the structure */ /* Fill the rest of the structure */
...@@ -200,7 +200,7 @@ static void i2c_parport_attach (struct parport *port) ...@@ -200,7 +200,7 @@ static void i2c_parport_attach (struct parport *port)
if (parport_claim_or_block(adapter->pdev) < 0) { if (parport_claim_or_block(adapter->pdev) < 0) {
printk(KERN_ERR "i2c-parport: Could not claim parallel port\n"); printk(KERN_ERR "i2c-parport: Could not claim parallel port\n");
goto ERROR1; goto err_unregister;
} }
/* Reset hardware to a sane state (SCL and SDA high) */ /* Reset hardware to a sane state (SCL and SDA high) */
...@@ -215,7 +215,7 @@ static void i2c_parport_attach (struct parport *port) ...@@ -215,7 +215,7 @@ static void i2c_parport_attach (struct parport *port)
if (i2c_bit_add_bus(&adapter->adapter) < 0) { if (i2c_bit_add_bus(&adapter->adapter) < 0) {
printk(KERN_ERR "i2c-parport: Unable to register with I2C\n"); printk(KERN_ERR "i2c-parport: Unable to register with I2C\n");
goto ERROR1; goto err_unregister;
} }
/* Setup SMBus alert if supported */ /* Setup SMBus alert if supported */
...@@ -236,14 +236,14 @@ static void i2c_parport_attach (struct parport *port) ...@@ -236,14 +236,14 @@ static void i2c_parport_attach (struct parport *port)
mutex_unlock(&adapter_list_lock); mutex_unlock(&adapter_list_lock);
return; return;
ERROR1: err_unregister:
parport_release(adapter->pdev); parport_release(adapter->pdev);
parport_unregister_device(adapter->pdev); parport_unregister_device(adapter->pdev);
ERROR0: err_free:
kfree(adapter); kfree(adapter);
} }
static void i2c_parport_detach (struct parport *port) static void i2c_parport_detach(struct parport *port)
{ {
struct i2c_par *adapter, *_n; struct i2c_par *adapter, *_n;
......
...@@ -18,13 +18,9 @@ ...@@ -18,13 +18,9 @@
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
* ------------------------------------------------------------------------ */ * ------------------------------------------------------------------------ */
#ifdef DATA #define PORT_DATA 0
#undef DATA #define PORT_STAT 1
#endif #define PORT_CTRL 2
#define DATA 0
#define STAT 1
#define CTRL 2
struct lineop { struct lineop {
u8 val; u8 val;
...@@ -41,61 +37,61 @@ struct adapter_parm { ...@@ -41,61 +37,61 @@ struct adapter_parm {
unsigned int smbus_alert:1; unsigned int smbus_alert:1;
}; };
static struct adapter_parm adapter_parm[] = { static const struct adapter_parm adapter_parm[] = {
/* type 0: Philips adapter */ /* type 0: Philips adapter */
{ {
.setsda = { 0x80, DATA, 1 }, .setsda = { 0x80, PORT_DATA, 1 },
.setscl = { 0x08, CTRL, 0 }, .setscl = { 0x08, PORT_CTRL, 0 },
.getsda = { 0x80, STAT, 0 }, .getsda = { 0x80, PORT_STAT, 0 },
.getscl = { 0x08, STAT, 0 }, .getscl = { 0x08, PORT_STAT, 0 },
}, },
/* type 1: home brew teletext adapter */ /* type 1: home brew teletext adapter */
{ {
.setsda = { 0x02, DATA, 0 }, .setsda = { 0x02, PORT_DATA, 0 },
.setscl = { 0x01, DATA, 0 }, .setscl = { 0x01, PORT_DATA, 0 },
.getsda = { 0x80, STAT, 1 }, .getsda = { 0x80, PORT_STAT, 1 },
}, },
/* type 2: Velleman K8000 adapter */ /* type 2: Velleman K8000 adapter */
{ {
.setsda = { 0x02, CTRL, 1 }, .setsda = { 0x02, PORT_CTRL, 1 },
.setscl = { 0x08, CTRL, 1 }, .setscl = { 0x08, PORT_CTRL, 1 },
.getsda = { 0x10, STAT, 0 }, .getsda = { 0x10, PORT_STAT, 0 },
}, },
/* type 3: ELV adapter */ /* type 3: ELV adapter */
{ {
.setsda = { 0x02, DATA, 1 }, .setsda = { 0x02, PORT_DATA, 1 },
.setscl = { 0x01, DATA, 1 }, .setscl = { 0x01, PORT_DATA, 1 },
.getsda = { 0x40, STAT, 1 }, .getsda = { 0x40, PORT_STAT, 1 },
.getscl = { 0x08, STAT, 1 }, .getscl = { 0x08, PORT_STAT, 1 },
}, },
/* type 4: ADM1032 evaluation board */ /* type 4: ADM1032 evaluation board */
{ {
.setsda = { 0x02, DATA, 1 }, .setsda = { 0x02, PORT_DATA, 1 },
.setscl = { 0x01, DATA, 1 }, .setscl = { 0x01, PORT_DATA, 1 },
.getsda = { 0x10, STAT, 1 }, .getsda = { 0x10, PORT_STAT, 1 },
.init = { 0xf0, DATA, 0 }, .init = { 0xf0, PORT_DATA, 0 },
.smbus_alert = 1, .smbus_alert = 1,
}, },
/* type 5: ADM1025, ADM1030 and ADM1031 evaluation boards */ /* type 5: ADM1025, ADM1030 and ADM1031 evaluation boards */
{ {
.setsda = { 0x02, DATA, 1 }, .setsda = { 0x02, PORT_DATA, 1 },
.setscl = { 0x01, DATA, 1 }, .setscl = { 0x01, PORT_DATA, 1 },
.getsda = { 0x10, STAT, 1 }, .getsda = { 0x10, PORT_STAT, 1 },
}, },
/* type 6: Barco LPT->DVI (K5800236) adapter */ /* type 6: Barco LPT->DVI (K5800236) adapter */
{ {
.setsda = { 0x02, DATA, 1 }, .setsda = { 0x02, PORT_DATA, 1 },
.setscl = { 0x01, DATA, 1 }, .setscl = { 0x01, PORT_DATA, 1 },
.getsda = { 0x20, STAT, 0 }, .getsda = { 0x20, PORT_STAT, 0 },
.getscl = { 0x40, STAT, 0 }, .getscl = { 0x40, PORT_STAT, 0 },
.init = { 0xfc, DATA, 0 }, .init = { 0xfc, PORT_DATA, 0 },
}, },
/* type 7: One For All JP1 parallel port adapter */ /* type 7: One For All JP1 parallel port adapter */
{ {
.setsda = { 0x01, DATA, 0 }, .setsda = { 0x01, PORT_DATA, 0 },
.setscl = { 0x02, DATA, 0 }, .setscl = { 0x02, PORT_DATA, 0 },
.getsda = { 0x80, STAT, 1 }, .getsda = { 0x80, PORT_STAT, 1 },
.init = { 0x04, DATA, 1 }, .init = { 0x04, PORT_DATA, 1 },
}, },
}; };
......
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