|
@@ -34,11 +34,25 @@
|
|
|
#include <linux/err.h>
|
|
|
#include <linux/clk.h>
|
|
|
|
|
|
-#include <mach/hardware.h>
|
|
|
#include <asm/irq.h>
|
|
|
#include <asm/io.h>
|
|
|
#include <mach/i2c.h>
|
|
|
|
|
|
+/*
|
|
|
+ * I2C register offsets will be shifted 0 or 1 bit left, depending on
|
|
|
+ * different SoCs
|
|
|
+ */
|
|
|
+#define REG_SHIFT_0 (0 << 0)
|
|
|
+#define REG_SHIFT_1 (1 << 0)
|
|
|
+#define REG_SHIFT(d) ((d) & 0x1)
|
|
|
+
|
|
|
+static const struct platform_device_id i2c_pxa_id_table[] = {
|
|
|
+ { "pxa2xx-i2c", REG_SHIFT_1 },
|
|
|
+ { "pxa3xx-pwri2c", REG_SHIFT_0 },
|
|
|
+ { },
|
|
|
+};
|
|
|
+MODULE_DEVICE_TABLE(platform, i2c_pxa_id_table);
|
|
|
+
|
|
|
/*
|
|
|
* I2C registers and bit definitions
|
|
|
*/
|
|
@@ -985,6 +999,7 @@ static int i2c_pxa_probe(struct platform_device *dev)
|
|
|
struct pxa_i2c *i2c;
|
|
|
struct resource *res;
|
|
|
struct i2c_pxa_platform_data *plat = dev->dev.platform_data;
|
|
|
+ struct platform_device_id *id = platform_get_device_id(dev);
|
|
|
int ret;
|
|
|
int irq;
|
|
|
|
|
@@ -1028,7 +1043,7 @@ static int i2c_pxa_probe(struct platform_device *dev)
|
|
|
ret = -EIO;
|
|
|
goto eremap;
|
|
|
}
|
|
|
- i2c->reg_shift = (cpu_is_pxa3xx() && (dev->id == 1)) ? 0 : 1;
|
|
|
+ i2c->reg_shift = REG_SHIFT(id->driver_data);
|
|
|
|
|
|
i2c->iobase = res->start;
|
|
|
i2c->iosize = res_len(res);
|
|
@@ -1150,6 +1165,7 @@ static struct platform_driver i2c_pxa_driver = {
|
|
|
.name = "pxa2xx-i2c",
|
|
|
.owner = THIS_MODULE,
|
|
|
},
|
|
|
+ .id_table = i2c_pxa_id_table,
|
|
|
};
|
|
|
|
|
|
static int __init i2c_adap_pxa_init(void)
|