mirror of
https://github.com/torvalds/linux
synced 2024-11-05 18:23:50 +00:00
Merge branch 'i2c-for-linus' of git://jdelvare.pck.nerim.net/jdelvare-2.6
* 'i2c-for-linus' of git://jdelvare.pck.nerim.net/jdelvare-2.6: i2c: Use snprintf to set adapter names Input: apanel - convert to new i2c binding i2c: Drop I2C_CLASS_CAM_DIGITAL i2c: Drop I2C_CLASS_CAM_ANALOG and I2C_CLASS_SOUND i2c: Drop I2C_CLASS_ALL i2c: Get rid of remaining bus_id access i2c: Replace bus_id with dev_name(), dev_set_name()
This commit is contained in:
commit
fa7b906e7f
19 changed files with 98 additions and 84 deletions
|
@ -399,8 +399,8 @@ static int __devinit ali1563_probe(struct pci_dev * dev,
|
||||||
if ((error = ali1563_setup(dev)))
|
if ((error = ali1563_setup(dev)))
|
||||||
goto exit;
|
goto exit;
|
||||||
ali1563_adapter.dev.parent = &dev->dev;
|
ali1563_adapter.dev.parent = &dev->dev;
|
||||||
sprintf(ali1563_adapter.name,"SMBus ALi 1563 Adapter @ %04x",
|
snprintf(ali1563_adapter.name, sizeof(ali1563_adapter.name),
|
||||||
ali1563_smba);
|
"SMBus ALi 1563 Adapter @ %04x", ali1563_smba);
|
||||||
if ((error = i2c_add_adapter(&ali1563_adapter)))
|
if ((error = i2c_add_adapter(&ali1563_adapter)))
|
||||||
goto exit_shutdown;
|
goto exit_shutdown;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -197,8 +197,8 @@ static int __init amd756_s4882_init(void)
|
||||||
for (i = 1; i < 5; i++) {
|
for (i = 1; i < 5; i++) {
|
||||||
s4882_algo[i] = *(amd756_smbus.algo);
|
s4882_algo[i] = *(amd756_smbus.algo);
|
||||||
s4882_adapter[i] = amd756_smbus;
|
s4882_adapter[i] = amd756_smbus;
|
||||||
sprintf(s4882_adapter[i].name,
|
snprintf(s4882_adapter[i].name, sizeof(s4882_adapter[i].name),
|
||||||
"SMBus 8111 adapter (CPU%d)", i-1);
|
"SMBus 8111 adapter (CPU%d)", i-1);
|
||||||
s4882_adapter[i].algo = s4882_algo+i;
|
s4882_adapter[i].algo = s4882_algo+i;
|
||||||
s4882_adapter[i].dev.parent = amd756_smbus.dev.parent;
|
s4882_adapter[i].dev.parent = amd756_smbus.dev.parent;
|
||||||
}
|
}
|
||||||
|
|
|
@ -380,8 +380,9 @@ static int __devinit amd756_probe(struct pci_dev *pdev,
|
||||||
/* set up the sysfs linkage to our parent device */
|
/* set up the sysfs linkage to our parent device */
|
||||||
amd756_smbus.dev.parent = &pdev->dev;
|
amd756_smbus.dev.parent = &pdev->dev;
|
||||||
|
|
||||||
sprintf(amd756_smbus.name, "SMBus %s adapter at %04x",
|
snprintf(amd756_smbus.name, sizeof(amd756_smbus.name),
|
||||||
chipname[id->driver_data], amd756_ioport);
|
"SMBus %s adapter at %04x", chipname[id->driver_data],
|
||||||
|
amd756_ioport);
|
||||||
|
|
||||||
error = i2c_add_adapter(&amd756_smbus);
|
error = i2c_add_adapter(&amd756_smbus);
|
||||||
if (error) {
|
if (error) {
|
||||||
|
|
|
@ -222,7 +222,7 @@ static int __devinit at91_i2c_probe(struct platform_device *pdev)
|
||||||
rc = -ENOMEM;
|
rc = -ENOMEM;
|
||||||
goto fail2;
|
goto fail2;
|
||||||
}
|
}
|
||||||
sprintf(adapter->name, "AT91");
|
snprintf(adapter->name, sizeof(adapter->name), "AT91");
|
||||||
adapter->algo = &at91_algorithm;
|
adapter->algo = &at91_algorithm;
|
||||||
adapter->class = I2C_CLASS_HWMON;
|
adapter->class = I2C_CLASS_HWMON;
|
||||||
adapter->dev.parent = &pdev->dev;
|
adapter->dev.parent = &pdev->dev;
|
||||||
|
|
|
@ -656,7 +656,7 @@ static int i2c_bfin_twi_probe(struct platform_device *pdev)
|
||||||
strlcpy(p_adap->name, pdev->name, sizeof(p_adap->name));
|
strlcpy(p_adap->name, pdev->name, sizeof(p_adap->name));
|
||||||
p_adap->algo = &bfin_twi_algorithm;
|
p_adap->algo = &bfin_twi_algorithm;
|
||||||
p_adap->algo_data = iface;
|
p_adap->algo_data = iface;
|
||||||
p_adap->class = I2C_CLASS_ALL;
|
p_adap->class = I2C_CLASS_HWMON | I2C_CLASS_SPD;
|
||||||
p_adap->dev.parent = &pdev->dev;
|
p_adap->dev.parent = &pdev->dev;
|
||||||
|
|
||||||
rc = peripheral_request_list(pin_req[pdev->id], "i2c-bfin-twi");
|
rc = peripheral_request_list(pin_req[pdev->id], "i2c-bfin-twi");
|
||||||
|
|
|
@ -64,7 +64,7 @@
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/i2c.h>
|
#include <linux/i2c.h>
|
||||||
#include <linux/acpi.h>
|
#include <linux/acpi.h>
|
||||||
#include <asm/io.h>
|
#include <linux/io.h>
|
||||||
|
|
||||||
/* I801 SMBus address offsets */
|
/* I801 SMBus address offsets */
|
||||||
#define SMBHSTSTS (0 + i801_smba)
|
#define SMBHSTSTS (0 + i801_smba)
|
||||||
|
@ -583,6 +583,40 @@ static struct pci_device_id i801_ids[] = {
|
||||||
|
|
||||||
MODULE_DEVICE_TABLE (pci, i801_ids);
|
MODULE_DEVICE_TABLE (pci, i801_ids);
|
||||||
|
|
||||||
|
#if defined CONFIG_INPUT_APANEL || defined CONFIG_INPUT_APANEL_MODULE
|
||||||
|
static unsigned char apanel_addr;
|
||||||
|
|
||||||
|
/* Scan the system ROM for the signature "FJKEYINF" */
|
||||||
|
static __init const void __iomem *bios_signature(const void __iomem *bios)
|
||||||
|
{
|
||||||
|
ssize_t offset;
|
||||||
|
const unsigned char signature[] = "FJKEYINF";
|
||||||
|
|
||||||
|
for (offset = 0; offset < 0x10000; offset += 0x10) {
|
||||||
|
if (check_signature(bios + offset, signature,
|
||||||
|
sizeof(signature)-1))
|
||||||
|
return bios + offset;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void __init input_apanel_init(void)
|
||||||
|
{
|
||||||
|
void __iomem *bios;
|
||||||
|
const void __iomem *p;
|
||||||
|
|
||||||
|
bios = ioremap(0xF0000, 0x10000); /* Can't fail */
|
||||||
|
p = bios_signature(bios);
|
||||||
|
if (p) {
|
||||||
|
/* just use the first address */
|
||||||
|
apanel_addr = readb(p + 8 + 3) >> 1;
|
||||||
|
}
|
||||||
|
iounmap(bios);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
static void __init input_apanel_init(void) {}
|
||||||
|
#endif
|
||||||
|
|
||||||
static int __devinit i801_probe(struct pci_dev *dev, const struct pci_device_id *id)
|
static int __devinit i801_probe(struct pci_dev *dev, const struct pci_device_id *id)
|
||||||
{
|
{
|
||||||
unsigned char temp;
|
unsigned char temp;
|
||||||
|
@ -667,6 +701,19 @@ static int __devinit i801_probe(struct pci_dev *dev, const struct pci_device_id
|
||||||
dev_err(&dev->dev, "Failed to add SMBus adapter\n");
|
dev_err(&dev->dev, "Failed to add SMBus adapter\n");
|
||||||
goto exit_release;
|
goto exit_release;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Register optional slaves */
|
||||||
|
#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(&i801_adapter, &info);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
exit_release:
|
exit_release:
|
||||||
|
@ -717,6 +764,7 @@ static struct pci_driver i801_driver = {
|
||||||
|
|
||||||
static int __init i2c_i801_init(void)
|
static int __init i2c_i801_init(void)
|
||||||
{
|
{
|
||||||
|
input_apanel_init();
|
||||||
return pci_register_driver(&i801_driver);
|
return pci_register_driver(&i801_driver);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1076,10 +1076,10 @@ static int i2c_pxa_probe(struct platform_device *dev)
|
||||||
|
|
||||||
#ifdef CONFIG_I2C_PXA_SLAVE
|
#ifdef CONFIG_I2C_PXA_SLAVE
|
||||||
printk(KERN_INFO "I2C: %s: PXA I2C adapter, slave address %d\n",
|
printk(KERN_INFO "I2C: %s: PXA I2C adapter, slave address %d\n",
|
||||||
i2c->adap.dev.bus_id, i2c->slave_addr);
|
dev_name(&i2c->adap.dev), i2c->slave_addr);
|
||||||
#else
|
#else
|
||||||
printk(KERN_INFO "I2C: %s: PXA I2C adapter\n",
|
printk(KERN_INFO "I2C: %s: PXA I2C adapter\n",
|
||||||
i2c->adap.dev.bus_id);
|
dev_name(&i2c->adap.dev));
|
||||||
#endif
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
|
|
@ -906,7 +906,7 @@ static int s3c24xx_i2c_probe(struct platform_device *pdev)
|
||||||
|
|
||||||
platform_set_drvdata(pdev, i2c);
|
platform_set_drvdata(pdev, i2c);
|
||||||
|
|
||||||
dev_info(&pdev->dev, "%s: S3C I2C adapter\n", i2c->adap.dev.bus_id);
|
dev_info(&pdev->dev, "%s: S3C I2C adapter\n", dev_name(&i2c->adap.dev));
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
err_cpufreq:
|
err_cpufreq:
|
||||||
|
|
|
@ -475,7 +475,7 @@ static int __devinit sh7760_i2c_probe(struct platform_device *pdev)
|
||||||
|
|
||||||
id->adap.nr = pdev->id;
|
id->adap.nr = pdev->id;
|
||||||
id->adap.algo = &sh7760_i2c_algo;
|
id->adap.algo = &sh7760_i2c_algo;
|
||||||
id->adap.class = I2C_CLASS_ALL;
|
id->adap.class = I2C_CLASS_HWMON | I2C_CLASS_SPD;
|
||||||
id->adap.retries = 3;
|
id->adap.retries = 3;
|
||||||
id->adap.algo_data = id;
|
id->adap.algo_data = id;
|
||||||
id->adap.dev.parent = &pdev->dev;
|
id->adap.dev.parent = &pdev->dev;
|
||||||
|
|
|
@ -500,7 +500,7 @@ static int sh_mobile_i2c_hook_irqs(struct platform_device *dev, int hook)
|
||||||
while ((res = platform_get_resource(dev, IORESOURCE_IRQ, k))) {
|
while ((res = platform_get_resource(dev, IORESOURCE_IRQ, k))) {
|
||||||
for (n = res->start; hook && n <= res->end; n++) {
|
for (n = res->start; hook && n <= res->end; n++) {
|
||||||
if (request_irq(n, sh_mobile_i2c_isr, IRQF_DISABLED,
|
if (request_irq(n, sh_mobile_i2c_isr, IRQF_DISABLED,
|
||||||
dev->dev.bus_id, dev))
|
dev_name(&dev->dev), dev))
|
||||||
goto rollback;
|
goto rollback;
|
||||||
}
|
}
|
||||||
k++;
|
k++;
|
||||||
|
|
|
@ -389,8 +389,8 @@ static int __devinit sis5595_probe(struct pci_dev *dev, const struct pci_device_
|
||||||
/* set up the sysfs linkage to our parent device */
|
/* set up the sysfs linkage to our parent device */
|
||||||
sis5595_adapter.dev.parent = &dev->dev;
|
sis5595_adapter.dev.parent = &dev->dev;
|
||||||
|
|
||||||
sprintf(sis5595_adapter.name, "SMBus SIS5595 adapter at %04x",
|
snprintf(sis5595_adapter.name, sizeof(sis5595_adapter.name),
|
||||||
sis5595_base + SMB_INDEX);
|
"SMBus SIS5595 adapter at %04x", sis5595_base + SMB_INDEX);
|
||||||
err = i2c_add_adapter(&sis5595_adapter);
|
err = i2c_add_adapter(&sis5595_adapter);
|
||||||
if (err) {
|
if (err) {
|
||||||
release_region(sis5595_base + SMB_INDEX, 2);
|
release_region(sis5595_base + SMB_INDEX, 2);
|
||||||
|
|
|
@ -487,8 +487,8 @@ static int __devinit sis630_probe(struct pci_dev *dev, const struct pci_device_i
|
||||||
/* set up the sysfs linkage to our parent device */
|
/* set up the sysfs linkage to our parent device */
|
||||||
sis630_adapter.dev.parent = &dev->dev;
|
sis630_adapter.dev.parent = &dev->dev;
|
||||||
|
|
||||||
sprintf(sis630_adapter.name, "SMBus SIS630 adapter at %04x",
|
snprintf(sis630_adapter.name, sizeof(sis630_adapter.name),
|
||||||
acpi_base + SMB_STS);
|
"SMBus SIS630 adapter at %04x", acpi_base + SMB_STS);
|
||||||
|
|
||||||
return i2c_add_adapter(&sis630_adapter);
|
return i2c_add_adapter(&sis630_adapter);
|
||||||
}
|
}
|
||||||
|
|
|
@ -459,7 +459,7 @@ static int i2c_register_adapter(struct i2c_adapter *adap)
|
||||||
pr_debug("I2C adapter driver [%s] forgot to specify "
|
pr_debug("I2C adapter driver [%s] forgot to specify "
|
||||||
"physical device\n", adap->name);
|
"physical device\n", adap->name);
|
||||||
}
|
}
|
||||||
sprintf(adap->dev.bus_id, "i2c-%d", adap->nr);
|
dev_set_name(&adap->dev, "i2c-%d", adap->nr);
|
||||||
adap->dev.release = &i2c_adapter_dev_release;
|
adap->dev.release = &i2c_adapter_dev_release;
|
||||||
adap->dev.class = &i2c_adapter_class;
|
adap->dev.class = &i2c_adapter_class;
|
||||||
res = device_register(&adap->dev);
|
res = device_register(&adap->dev);
|
||||||
|
@ -845,8 +845,8 @@ int i2c_attach_client(struct i2c_client *client)
|
||||||
} else
|
} else
|
||||||
client->dev.release = i2c_client_dev_release;
|
client->dev.release = i2c_client_dev_release;
|
||||||
|
|
||||||
snprintf(&client->dev.bus_id[0], sizeof(client->dev.bus_id),
|
dev_set_name(&client->dev, "%d-%04x", i2c_adapter_id(adapter),
|
||||||
"%d-%04x", i2c_adapter_id(adapter), client->addr);
|
client->addr);
|
||||||
res = device_register(&client->dev);
|
res = device_register(&client->dev);
|
||||||
if (res)
|
if (res)
|
||||||
goto out_err;
|
goto out_err;
|
||||||
|
@ -856,7 +856,7 @@ int i2c_attach_client(struct i2c_client *client)
|
||||||
mutex_unlock(&adapter->clist_lock);
|
mutex_unlock(&adapter->clist_lock);
|
||||||
|
|
||||||
dev_dbg(&adapter->dev, "client [%s] registered with bus id %s\n",
|
dev_dbg(&adapter->dev, "client [%s] registered with bus id %s\n",
|
||||||
client->name, client->dev.bus_id);
|
client->name, dev_name(&client->dev));
|
||||||
|
|
||||||
if (adapter->client_register) {
|
if (adapter->client_register) {
|
||||||
if (adapter->client_register(client)) {
|
if (adapter->client_register(client)) {
|
||||||
|
|
|
@ -57,7 +57,7 @@ static enum apanel_chip device_chip[APANEL_DEV_MAX];
|
||||||
|
|
||||||
struct apanel {
|
struct apanel {
|
||||||
struct input_polled_dev *ipdev;
|
struct input_polled_dev *ipdev;
|
||||||
struct i2c_client client;
|
struct i2c_client *client;
|
||||||
unsigned short keymap[MAX_PANEL_KEYS];
|
unsigned short keymap[MAX_PANEL_KEYS];
|
||||||
u16 nkeys;
|
u16 nkeys;
|
||||||
u16 led_bits;
|
u16 led_bits;
|
||||||
|
@ -66,16 +66,7 @@ struct apanel {
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
static int apanel_probe(struct i2c_adapter *, int, int);
|
static int apanel_probe(struct i2c_client *, const struct i2c_device_id *);
|
||||||
|
|
||||||
/* for now, we only support one address */
|
|
||||||
static unsigned short normal_i2c[] = {0, I2C_CLIENT_END};
|
|
||||||
static unsigned short ignore = I2C_CLIENT_END;
|
|
||||||
static struct i2c_client_address_data addr_data = {
|
|
||||||
.normal_i2c = normal_i2c,
|
|
||||||
.probe = &ignore,
|
|
||||||
.ignore = &ignore,
|
|
||||||
};
|
|
||||||
|
|
||||||
static void report_key(struct input_dev *input, unsigned keycode)
|
static void report_key(struct input_dev *input, unsigned keycode)
|
||||||
{
|
{
|
||||||
|
@ -103,12 +94,12 @@ static void apanel_poll(struct input_polled_dev *ipdev)
|
||||||
s32 data;
|
s32 data;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
data = i2c_smbus_read_word_data(&ap->client, cmd);
|
data = i2c_smbus_read_word_data(ap->client, cmd);
|
||||||
if (data < 0)
|
if (data < 0)
|
||||||
return; /* ignore errors (due to ACPI??) */
|
return; /* ignore errors (due to ACPI??) */
|
||||||
|
|
||||||
/* write back to clear latch */
|
/* write back to clear latch */
|
||||||
i2c_smbus_write_word_data(&ap->client, cmd, 0);
|
i2c_smbus_write_word_data(ap->client, cmd, 0);
|
||||||
|
|
||||||
if (!data)
|
if (!data)
|
||||||
return;
|
return;
|
||||||
|
@ -124,7 +115,7 @@ static void led_update(struct work_struct *work)
|
||||||
{
|
{
|
||||||
struct apanel *ap = container_of(work, struct apanel, led_work);
|
struct apanel *ap = container_of(work, struct apanel, led_work);
|
||||||
|
|
||||||
i2c_smbus_write_word_data(&ap->client, 0x10, ap->led_bits);
|
i2c_smbus_write_word_data(ap->client, 0x10, ap->led_bits);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void mail_led_set(struct led_classdev *led,
|
static void mail_led_set(struct led_classdev *led,
|
||||||
|
@ -140,7 +131,7 @@ static void mail_led_set(struct led_classdev *led,
|
||||||
schedule_work(&ap->led_work);
|
schedule_work(&ap->led_work);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int apanel_detach_client(struct i2c_client *client)
|
static int apanel_remove(struct i2c_client *client)
|
||||||
{
|
{
|
||||||
struct apanel *ap = i2c_get_clientdata(client);
|
struct apanel *ap = i2c_get_clientdata(client);
|
||||||
|
|
||||||
|
@ -148,43 +139,33 @@ static int apanel_detach_client(struct i2c_client *client)
|
||||||
led_classdev_unregister(&ap->mail_led);
|
led_classdev_unregister(&ap->mail_led);
|
||||||
|
|
||||||
input_unregister_polled_device(ap->ipdev);
|
input_unregister_polled_device(ap->ipdev);
|
||||||
i2c_detach_client(&ap->client);
|
|
||||||
input_free_polled_device(ap->ipdev);
|
input_free_polled_device(ap->ipdev);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Function is invoked for every i2c adapter. */
|
|
||||||
static int apanel_attach_adapter(struct i2c_adapter *adap)
|
|
||||||
{
|
|
||||||
dev_dbg(&adap->dev, APANEL ": attach adapter id=%d\n", adap->id);
|
|
||||||
|
|
||||||
/* Our device is connected only to i801 on laptop */
|
|
||||||
if (adap->id != I2C_HW_SMBUS_I801)
|
|
||||||
return -ENODEV;
|
|
||||||
|
|
||||||
return i2c_probe(adap, &addr_data, apanel_probe);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void apanel_shutdown(struct i2c_client *client)
|
static void apanel_shutdown(struct i2c_client *client)
|
||||||
{
|
{
|
||||||
apanel_detach_client(client);
|
apanel_remove(client);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct i2c_device_id apanel_id[] = {
|
||||||
|
{ "fujitsu_apanel", 0 },
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
MODULE_DEVICE_TABLE(i2c, apanel_id);
|
||||||
|
|
||||||
static struct i2c_driver apanel_driver = {
|
static struct i2c_driver apanel_driver = {
|
||||||
.driver = {
|
.driver = {
|
||||||
.name = APANEL,
|
.name = APANEL,
|
||||||
},
|
},
|
||||||
.attach_adapter = &apanel_attach_adapter,
|
.probe = &apanel_probe,
|
||||||
.detach_client = &apanel_detach_client,
|
.remove = &apanel_remove,
|
||||||
.shutdown = &apanel_shutdown,
|
.shutdown = &apanel_shutdown,
|
||||||
|
.id_table = apanel_id,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct apanel apanel = {
|
static struct apanel apanel = {
|
||||||
.client = {
|
|
||||||
.driver = &apanel_driver,
|
|
||||||
.name = APANEL,
|
|
||||||
},
|
|
||||||
.keymap = {
|
.keymap = {
|
||||||
[0] = KEY_MAIL,
|
[0] = KEY_MAIL,
|
||||||
[1] = KEY_WWW,
|
[1] = KEY_WWW,
|
||||||
|
@ -204,7 +185,8 @@ static struct apanel apanel = {
|
||||||
};
|
};
|
||||||
|
|
||||||
/* NB: Only one panel on the i2c. */
|
/* NB: Only one panel on the i2c. */
|
||||||
static int apanel_probe(struct i2c_adapter *bus, int address, int kind)
|
static int apanel_probe(struct i2c_client *client,
|
||||||
|
const struct i2c_device_id *id)
|
||||||
{
|
{
|
||||||
struct apanel *ap;
|
struct apanel *ap;
|
||||||
struct input_polled_dev *ipdev;
|
struct input_polled_dev *ipdev;
|
||||||
|
@ -212,9 +194,6 @@ static int apanel_probe(struct i2c_adapter *bus, int address, int kind)
|
||||||
u8 cmd = device_chip[APANEL_DEV_APPBTN] == CHIP_OZ992C ? 0 : 8;
|
u8 cmd = device_chip[APANEL_DEV_APPBTN] == CHIP_OZ992C ? 0 : 8;
|
||||||
int i, err = -ENOMEM;
|
int i, err = -ENOMEM;
|
||||||
|
|
||||||
dev_dbg(&bus->dev, APANEL ": probe adapter %p addr %d kind %d\n",
|
|
||||||
bus, address, kind);
|
|
||||||
|
|
||||||
ap = &apanel;
|
ap = &apanel;
|
||||||
|
|
||||||
ipdev = input_allocate_polled_device();
|
ipdev = input_allocate_polled_device();
|
||||||
|
@ -222,18 +201,13 @@ static int apanel_probe(struct i2c_adapter *bus, int address, int kind)
|
||||||
goto out1;
|
goto out1;
|
||||||
|
|
||||||
ap->ipdev = ipdev;
|
ap->ipdev = ipdev;
|
||||||
ap->client.adapter = bus;
|
ap->client = client;
|
||||||
ap->client.addr = address;
|
|
||||||
|
|
||||||
i2c_set_clientdata(&ap->client, ap);
|
i2c_set_clientdata(client, ap);
|
||||||
|
|
||||||
err = i2c_attach_client(&ap->client);
|
err = i2c_smbus_write_word_data(client, cmd, 0);
|
||||||
if (err)
|
|
||||||
goto out2;
|
|
||||||
|
|
||||||
err = i2c_smbus_write_word_data(&ap->client, cmd, 0);
|
|
||||||
if (err) {
|
if (err) {
|
||||||
dev_warn(&ap->client.dev, APANEL ": smbus write error %d\n",
|
dev_warn(&client->dev, APANEL ": smbus write error %d\n",
|
||||||
err);
|
err);
|
||||||
goto out3;
|
goto out3;
|
||||||
}
|
}
|
||||||
|
@ -246,7 +220,7 @@ static int apanel_probe(struct i2c_adapter *bus, int address, int kind)
|
||||||
idev->name = APANEL_NAME " buttons";
|
idev->name = APANEL_NAME " buttons";
|
||||||
idev->phys = "apanel/input0";
|
idev->phys = "apanel/input0";
|
||||||
idev->id.bustype = BUS_HOST;
|
idev->id.bustype = BUS_HOST;
|
||||||
idev->dev.parent = &ap->client.dev;
|
idev->dev.parent = &client->dev;
|
||||||
|
|
||||||
set_bit(EV_KEY, idev->evbit);
|
set_bit(EV_KEY, idev->evbit);
|
||||||
|
|
||||||
|
@ -264,7 +238,7 @@ static int apanel_probe(struct i2c_adapter *bus, int address, int kind)
|
||||||
|
|
||||||
INIT_WORK(&ap->led_work, led_update);
|
INIT_WORK(&ap->led_work, led_update);
|
||||||
if (device_chip[APANEL_DEV_LED] != CHIP_NONE) {
|
if (device_chip[APANEL_DEV_LED] != CHIP_NONE) {
|
||||||
err = led_classdev_register(&ap->client.dev, &ap->mail_led);
|
err = led_classdev_register(&client->dev, &ap->mail_led);
|
||||||
if (err)
|
if (err)
|
||||||
goto out4;
|
goto out4;
|
||||||
}
|
}
|
||||||
|
@ -273,8 +247,6 @@ static int apanel_probe(struct i2c_adapter *bus, int address, int kind)
|
||||||
out4:
|
out4:
|
||||||
input_unregister_polled_device(ipdev);
|
input_unregister_polled_device(ipdev);
|
||||||
out3:
|
out3:
|
||||||
i2c_detach_client(&ap->client);
|
|
||||||
out2:
|
|
||||||
input_free_polled_device(ipdev);
|
input_free_polled_device(ipdev);
|
||||||
out1:
|
out1:
|
||||||
return err;
|
return err;
|
||||||
|
@ -301,6 +273,7 @@ static int __init apanel_init(void)
|
||||||
void __iomem *bios;
|
void __iomem *bios;
|
||||||
const void __iomem *p;
|
const void __iomem *p;
|
||||||
u8 devno;
|
u8 devno;
|
||||||
|
unsigned char i2c_addr;
|
||||||
int found = 0;
|
int found = 0;
|
||||||
|
|
||||||
bios = ioremap(0xF0000, 0x10000); /* Can't fail */
|
bios = ioremap(0xF0000, 0x10000); /* Can't fail */
|
||||||
|
@ -313,7 +286,7 @@ static int __init apanel_init(void)
|
||||||
|
|
||||||
/* just use the first address */
|
/* just use the first address */
|
||||||
p += 8;
|
p += 8;
|
||||||
normal_i2c[0] = readb(p+3) >> 1;
|
i2c_addr = readb(p + 3) >> 1;
|
||||||
|
|
||||||
for ( ; (devno = readb(p)) & 0x7f; p += 4) {
|
for ( ; (devno = readb(p)) & 0x7f; p += 4) {
|
||||||
unsigned char method, slave, chip;
|
unsigned char method, slave, chip;
|
||||||
|
@ -322,7 +295,7 @@ static int __init apanel_init(void)
|
||||||
chip = readb(p + 2);
|
chip = readb(p + 2);
|
||||||
slave = readb(p + 3) >> 1;
|
slave = readb(p + 3) >> 1;
|
||||||
|
|
||||||
if (slave != normal_i2c[0]) {
|
if (slave != i2c_addr) {
|
||||||
pr_notice(APANEL ": only one SMBus slave "
|
pr_notice(APANEL ": only one SMBus slave "
|
||||||
"address supported, skiping device...\n");
|
"address supported, skiping device...\n");
|
||||||
continue;
|
continue;
|
||||||
|
|
|
@ -569,7 +569,6 @@ static int cafe_smbus_setup(struct cafe_camera *cam)
|
||||||
|
|
||||||
cafe_smbus_enable_irq(cam);
|
cafe_smbus_enable_irq(cam);
|
||||||
adap->id = I2C_HW_SMBUS_CAFE;
|
adap->id = I2C_HW_SMBUS_CAFE;
|
||||||
adap->class = I2C_CLASS_CAM_DIGITAL;
|
|
||||||
adap->owner = THIS_MODULE;
|
adap->owner = THIS_MODULE;
|
||||||
adap->client_register = cafe_smbus_attach;
|
adap->client_register = cafe_smbus_attach;
|
||||||
adap->client_unregister = cafe_smbus_detach;
|
adap->client_unregister = cafe_smbus_detach;
|
||||||
|
|
|
@ -1347,7 +1347,6 @@ static struct i2c_driver ov7670_driver = {
|
||||||
.name = "ov7670",
|
.name = "ov7670",
|
||||||
},
|
},
|
||||||
.id = I2C_DRIVERID_OV7670,
|
.id = I2C_DRIVERID_OV7670,
|
||||||
.class = I2C_CLASS_CAM_DIGITAL,
|
|
||||||
.attach_adapter = ov7670_attach,
|
.attach_adapter = ov7670_attach,
|
||||||
.detach_client = ov7670_detach,
|
.detach_client = ov7670_detach,
|
||||||
.command = ov7670_command,
|
.command = ov7670_command,
|
||||||
|
|
|
@ -405,7 +405,6 @@ static struct i2c_driver driver = {
|
||||||
.name = "ovcamchip",
|
.name = "ovcamchip",
|
||||||
},
|
},
|
||||||
.id = I2C_DRIVERID_OVCAMCHIP,
|
.id = I2C_DRIVERID_OVCAMCHIP,
|
||||||
.class = I2C_CLASS_CAM_DIGITAL,
|
|
||||||
.attach_adapter = ovcamchip_attach,
|
.attach_adapter = ovcamchip_attach,
|
||||||
.detach_client = ovcamchip_detach,
|
.detach_client = ovcamchip_detach,
|
||||||
.command = ovcamchip_command,
|
.command = ovcamchip_command,
|
||||||
|
|
|
@ -1553,7 +1553,6 @@ static int w9968cf_i2c_init(struct w9968cf_device* cam)
|
||||||
|
|
||||||
static struct i2c_adapter adap = {
|
static struct i2c_adapter adap = {
|
||||||
.id = I2C_HW_SMBUS_W9968CF,
|
.id = I2C_HW_SMBUS_W9968CF,
|
||||||
.class = I2C_CLASS_CAM_DIGITAL,
|
|
||||||
.owner = THIS_MODULE,
|
.owner = THIS_MODULE,
|
||||||
.client_register = w9968cf_i2c_attach_inform,
|
.client_register = w9968cf_i2c_attach_inform,
|
||||||
.client_unregister = w9968cf_i2c_detach_inform,
|
.client_unregister = w9968cf_i2c_detach_inform,
|
||||||
|
|
|
@ -393,11 +393,7 @@ static inline void i2c_set_adapdata(struct i2c_adapter *dev, void *data)
|
||||||
#define I2C_CLASS_TV_ANALOG (1<<1) /* bttv + friends */
|
#define I2C_CLASS_TV_ANALOG (1<<1) /* bttv + friends */
|
||||||
#define I2C_CLASS_TV_DIGITAL (1<<2) /* dvb cards */
|
#define I2C_CLASS_TV_DIGITAL (1<<2) /* dvb cards */
|
||||||
#define I2C_CLASS_DDC (1<<3) /* DDC bus on graphics adapters */
|
#define I2C_CLASS_DDC (1<<3) /* DDC bus on graphics adapters */
|
||||||
#define I2C_CLASS_CAM_ANALOG (1<<4) /* camera with analog CCD */
|
|
||||||
#define I2C_CLASS_CAM_DIGITAL (1<<5) /* most webcams */
|
|
||||||
#define I2C_CLASS_SOUND (1<<6) /* sound devices */
|
|
||||||
#define I2C_CLASS_SPD (1<<7) /* SPD EEPROMs and similar */
|
#define I2C_CLASS_SPD (1<<7) /* SPD EEPROMs and similar */
|
||||||
#define I2C_CLASS_ALL (UINT_MAX) /* all of the above */
|
|
||||||
|
|
||||||
/* i2c_client_address_data is the struct for holding default client
|
/* i2c_client_address_data is the struct for holding default client
|
||||||
* addresses for a driver and for the parameters supplied on the
|
* addresses for a driver and for the parameters supplied on the
|
||||||
|
|
Loading…
Reference in a new issue