Commit ce564033 authored by Rene Herman's avatar Rene Herman Committed by Jean Delvare

i2c-pca-isa: Don't grab arbitrary resources

Grabbing ISA bus resources without anything or anyone telling us we
should can break boot on randconfig/allyesconfig builds by keeping
resources that are in fact owned by different hardware busy and does
as reported by Ingo Molnar.

Generally it's also dangerous to just poke at random I/O ports and
especially those in the range where other old easily confused ISA
hardware might live.

For this specialized I2C bus driver, insist that the user specifies
the resources before grabbing them.

The^WA user of this driver is a one time

echo "options i2c-pca-isa base=0x330 irq=10" >> /etc/modprobe.conf

away from the old behaviour.
Signed-off-by: default avatarRene Herman <rene.herman@gmail.com>
Signed-off-by: default avatarJean Delvare <khali@linux-fr.org>
parent 9df013b3
...@@ -36,8 +36,8 @@ ...@@ -36,8 +36,8 @@
#define DRIVER "i2c-pca-isa" #define DRIVER "i2c-pca-isa"
#define IO_SIZE 4 #define IO_SIZE 4
static unsigned long base = 0x330; static unsigned long base;
static int irq = 10; static int irq = -1;
/* Data sheet recommends 59kHz for 100kHz operation due to variation /* Data sheet recommends 59kHz for 100kHz operation due to variation
* in the actual clock rate */ * in the actual clock rate */
...@@ -107,6 +107,19 @@ static struct i2c_adapter pca_isa_ops = { ...@@ -107,6 +107,19 @@ static struct i2c_adapter pca_isa_ops = {
.timeout = 100, .timeout = 100,
}; };
static int __devinit pca_isa_match(struct device *dev, unsigned int id)
{
int match = base != 0;
if (match) {
if (irq <= -1)
dev_warn(dev, "Using polling mode (specify irq)\n");
} else
dev_err(dev, "Please specify I/O base\n");
return match;
}
static int __devinit pca_isa_probe(struct device *dev, unsigned int id) static int __devinit pca_isa_probe(struct device *dev, unsigned int id)
{ {
init_waitqueue_head(&pca_wait); init_waitqueue_head(&pca_wait);
...@@ -153,7 +166,7 @@ static int __devexit pca_isa_remove(struct device *dev, unsigned int id) ...@@ -153,7 +166,7 @@ static int __devexit pca_isa_remove(struct device *dev, unsigned int id)
{ {
i2c_del_adapter(&pca_isa_ops); i2c_del_adapter(&pca_isa_ops);
if (irq > 0) { if (irq > -1) {
disable_irq(irq); disable_irq(irq);
free_irq(irq, &pca_isa_ops); free_irq(irq, &pca_isa_ops);
} }
...@@ -163,6 +176,7 @@ static int __devexit pca_isa_remove(struct device *dev, unsigned int id) ...@@ -163,6 +176,7 @@ static int __devexit pca_isa_remove(struct device *dev, unsigned int id)
} }
static struct isa_driver pca_isa_driver = { static struct isa_driver pca_isa_driver = {
.match = pca_isa_match,
.probe = pca_isa_probe, .probe = pca_isa_probe,
.remove = __devexit_p(pca_isa_remove), .remove = __devexit_p(pca_isa_remove),
.driver = { .driver = {
......
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