diff options
| -rw-r--r-- | arch/arm/mach-omap1/board-h3.c | 4 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/board-h4.c | 11 | ||||
| -rw-r--r-- | drivers/i2c/chips/isp1301_omap.c | 98 |
3 files changed, 48 insertions, 65 deletions
diff --git a/arch/arm/mach-omap1/board-h3.c b/arch/arm/mach-omap1/board-h3.c index 2ced6d9984d2..adfcd7b51393 100644 --- a/arch/arm/mach-omap1/board-h3.c +++ b/arch/arm/mach-omap1/board-h3.c | |||
| @@ -476,6 +476,10 @@ static struct i2c_board_info __initdata h3_i2c_board_info[] = { | |||
| 476 | I2C_BOARD_INFO("tps65013", 0x48), | 476 | I2C_BOARD_INFO("tps65013", 0x48), |
| 477 | /* .irq = OMAP_GPIO_IRQ(??), */ | 477 | /* .irq = OMAP_GPIO_IRQ(??), */ |
| 478 | }, | 478 | }, |
| 479 | { | ||
| 480 | I2C_BOARD_INFO("isp1301_omap", 0x2d), | ||
| 481 | .irq = OMAP_GPIO_IRQ(14), | ||
| 482 | }, | ||
| 479 | }; | 483 | }; |
| 480 | 484 | ||
| 481 | static struct omap_gpio_switch h3_gpio_switches[] __initdata = { | 485 | static struct omap_gpio_switch h3_gpio_switches[] __initdata = { |
diff --git a/arch/arm/mach-omap2/board-h4.c b/arch/arm/mach-omap2/board-h4.c index d4e3b6fc4705..2fef2c845083 100644 --- a/arch/arm/mach-omap2/board-h4.c +++ b/arch/arm/mach-omap2/board-h4.c | |||
| @@ -18,6 +18,7 @@ | |||
| 18 | #include <linux/mtd/partitions.h> | 18 | #include <linux/mtd/partitions.h> |
| 19 | #include <linux/delay.h> | 19 | #include <linux/delay.h> |
| 20 | #include <linux/workqueue.h> | 20 | #include <linux/workqueue.h> |
| 21 | #include <linux/i2c.h> | ||
| 21 | #include <linux/input.h> | 22 | #include <linux/input.h> |
| 22 | #include <linux/err.h> | 23 | #include <linux/err.h> |
| 23 | #include <linux/clk.h> | 24 | #include <linux/clk.h> |
| @@ -391,6 +392,13 @@ static struct omap_board_config_kernel h4_config[] = { | |||
| 391 | { OMAP_TAG_LCD, &h4_lcd_config }, | 392 | { OMAP_TAG_LCD, &h4_lcd_config }, |
| 392 | }; | 393 | }; |
| 393 | 394 | ||
| 395 | static struct i2c_board_info __initdata h4_i2c_board_info[] = { | ||
| 396 | { | ||
| 397 | I2C_BOARD_INFO("isp1301_omap", 0x2d), | ||
| 398 | .irq = OMAP_GPIO_IRQ(125), | ||
| 399 | }, | ||
| 400 | }; | ||
| 401 | |||
| 394 | static void __init omap_h4_init(void) | 402 | static void __init omap_h4_init(void) |
| 395 | { | 403 | { |
| 396 | /* | 404 | /* |
| @@ -411,6 +419,9 @@ static void __init omap_h4_init(void) | |||
| 411 | } | 419 | } |
| 412 | #endif | 420 | #endif |
| 413 | 421 | ||
| 422 | i2c_register_board_info(1, h4_i2c_board_info, | ||
| 423 | ARRAY_SIZE(h4_i2c_board_info)); | ||
| 424 | |||
| 414 | platform_add_devices(h4_devices, ARRAY_SIZE(h4_devices)); | 425 | platform_add_devices(h4_devices, ARRAY_SIZE(h4_devices)); |
| 415 | omap_board_config = h4_config; | 426 | omap_board_config = h4_config; |
| 416 | omap_board_config_size = ARRAY_SIZE(h4_config); | 427 | omap_board_config_size = ARRAY_SIZE(h4_config); |
diff --git a/drivers/i2c/chips/isp1301_omap.c b/drivers/i2c/chips/isp1301_omap.c index 8444fc6fbf61..28902ebd5539 100644 --- a/drivers/i2c/chips/isp1301_omap.c +++ b/drivers/i2c/chips/isp1301_omap.c | |||
| @@ -50,10 +50,8 @@ MODULE_LICENSE("GPL"); | |||
| 50 | struct isp1301 { | 50 | struct isp1301 { |
| 51 | struct otg_transceiver otg; | 51 | struct otg_transceiver otg; |
| 52 | struct i2c_client *client; | 52 | struct i2c_client *client; |
| 53 | struct i2c_client c; | ||
| 54 | void (*i2c_release)(struct device *dev); | 53 | void (*i2c_release)(struct device *dev); |
| 55 | 54 | ||
| 56 | int irq; | ||
| 57 | int irq_type; | 55 | int irq_type; |
| 58 | 56 | ||
| 59 | u32 last_otg_ctrl; | 57 | u32 last_otg_ctrl; |
| @@ -139,14 +137,6 @@ static inline void notresponding(struct isp1301 *isp) | |||
| 139 | 137 | ||
| 140 | /*-------------------------------------------------------------------------*/ | 138 | /*-------------------------------------------------------------------------*/ |
| 141 | 139 | ||
| 142 | /* only two addresses possible */ | ||
| 143 | #define ISP_BASE 0x2c | ||
| 144 | static unsigned short normal_i2c[] = { | ||
| 145 | ISP_BASE, ISP_BASE + 1, | ||
| 146 | I2C_CLIENT_END }; | ||
| 147 | |||
| 148 | I2C_CLIENT_INSMOD; | ||
| 149 | |||
| 150 | static struct i2c_driver isp1301_driver; | 140 | static struct i2c_driver isp1301_driver; |
| 151 | 141 | ||
| 152 | /* smbus apis are used for portability */ | 142 | /* smbus apis are used for portability */ |
| @@ -1230,7 +1220,7 @@ static void isp1301_release(struct device *dev) | |||
| 1230 | 1220 | ||
| 1231 | static struct isp1301 *the_transceiver; | 1221 | static struct isp1301 *the_transceiver; |
| 1232 | 1222 | ||
| 1233 | static int isp1301_detach_client(struct i2c_client *i2c) | 1223 | static int __exit isp1301_remove(struct i2c_client *i2c) |
| 1234 | { | 1224 | { |
| 1235 | struct isp1301 *isp; | 1225 | struct isp1301 *isp; |
| 1236 | 1226 | ||
| @@ -1238,7 +1228,7 @@ static int isp1301_detach_client(struct i2c_client *i2c) | |||
| 1238 | 1228 | ||
| 1239 | isp1301_clear_bits(isp, ISP1301_INTERRUPT_FALLING, ~0); | 1229 | isp1301_clear_bits(isp, ISP1301_INTERRUPT_FALLING, ~0); |
| 1240 | isp1301_clear_bits(isp, ISP1301_INTERRUPT_RISING, ~0); | 1230 | isp1301_clear_bits(isp, ISP1301_INTERRUPT_RISING, ~0); |
| 1241 | free_irq(isp->irq, isp); | 1231 | free_irq(i2c->irq, isp); |
| 1242 | #ifdef CONFIG_USB_OTG | 1232 | #ifdef CONFIG_USB_OTG |
| 1243 | otg_unbind(isp); | 1233 | otg_unbind(isp); |
| 1244 | #endif | 1234 | #endif |
| @@ -1253,7 +1243,7 @@ static int isp1301_detach_client(struct i2c_client *i2c) | |||
| 1253 | put_device(&i2c->dev); | 1243 | put_device(&i2c->dev); |
| 1254 | the_transceiver = 0; | 1244 | the_transceiver = 0; |
| 1255 | 1245 | ||
| 1256 | return i2c_detach_client(i2c); | 1246 | return 0; |
| 1257 | } | 1247 | } |
| 1258 | 1248 | ||
| 1259 | /*-------------------------------------------------------------------------*/ | 1249 | /*-------------------------------------------------------------------------*/ |
| @@ -1509,12 +1499,10 @@ isp1301_start_hnp(struct otg_transceiver *dev) | |||
| 1509 | 1499 | ||
| 1510 | /*-------------------------------------------------------------------------*/ | 1500 | /*-------------------------------------------------------------------------*/ |
| 1511 | 1501 | ||
| 1512 | /* no error returns, they'd just make bus scanning stop */ | 1502 | static int __init isp1301_probe(struct i2c_client *i2c) |
| 1513 | static int isp1301_probe(struct i2c_adapter *bus, int address, int kind) | ||
| 1514 | { | 1503 | { |
| 1515 | int status; | 1504 | int status; |
| 1516 | struct isp1301 *isp; | 1505 | struct isp1301 *isp; |
| 1517 | struct i2c_client *i2c; | ||
| 1518 | 1506 | ||
| 1519 | if (the_transceiver) | 1507 | if (the_transceiver) |
| 1520 | return 0; | 1508 | return 0; |
| @@ -1528,37 +1516,19 @@ static int isp1301_probe(struct i2c_adapter *bus, int address, int kind) | |||
| 1528 | isp->timer.function = isp1301_timer; | 1516 | isp->timer.function = isp1301_timer; |
| 1529 | isp->timer.data = (unsigned long) isp; | 1517 | isp->timer.data = (unsigned long) isp; |
| 1530 | 1518 | ||
| 1531 | isp->irq = -1; | 1519 | i2c_set_clientdata(i2c, isp); |
| 1532 | isp->c.addr = address; | 1520 | isp->client = i2c; |
| 1533 | i2c_set_clientdata(&isp->c, isp); | ||
| 1534 | isp->c.adapter = bus; | ||
| 1535 | isp->c.driver = &isp1301_driver; | ||
| 1536 | strlcpy(isp->c.name, DRIVER_NAME, I2C_NAME_SIZE); | ||
| 1537 | isp->client = i2c = &isp->c; | ||
| 1538 | |||
| 1539 | /* if this is a true probe, verify the chip ... */ | ||
| 1540 | if (kind < 0) { | ||
| 1541 | status = isp1301_get_u16(isp, ISP1301_VENDOR_ID); | ||
| 1542 | if (status != I2C_VENDOR_ID_PHILIPS) { | ||
| 1543 | dev_dbg(&bus->dev, "addr %d not philips id: %d\n", | ||
| 1544 | address, status); | ||
| 1545 | goto fail1; | ||
| 1546 | } | ||
| 1547 | status = isp1301_get_u16(isp, ISP1301_PRODUCT_ID); | ||
| 1548 | if (status != I2C_PRODUCT_ID_PHILIPS_1301) { | ||
| 1549 | dev_dbg(&bus->dev, "%d not isp1301, %d\n", | ||
| 1550 | address, status); | ||
| 1551 | goto fail1; | ||
| 1552 | } | ||
| 1553 | } | ||
| 1554 | 1521 | ||
| 1555 | status = i2c_attach_client(i2c); | 1522 | /* verify the chip (shouldn't be necesary) */ |
| 1556 | if (status < 0) { | 1523 | status = isp1301_get_u16(isp, ISP1301_VENDOR_ID); |
| 1557 | dev_dbg(&bus->dev, "can't attach %s to device %d, err %d\n", | 1524 | if (status != I2C_VENDOR_ID_PHILIPS) { |
| 1558 | DRIVER_NAME, address, status); | 1525 | dev_dbg(&i2c->dev, "not philips id: %d\n", status); |
| 1559 | fail1: | 1526 | goto fail; |
| 1560 | kfree(isp); | 1527 | } |
| 1561 | return 0; | 1528 | status = isp1301_get_u16(isp, ISP1301_PRODUCT_ID); |
| 1529 | if (status != I2C_PRODUCT_ID_PHILIPS_1301) { | ||
| 1530 | dev_dbg(&i2c->dev, "not isp1301, %d\n", status); | ||
| 1531 | goto fail; | ||
| 1562 | } | 1532 | } |
| 1563 | isp->i2c_release = i2c->dev.release; | 1533 | isp->i2c_release = i2c->dev.release; |
| 1564 | i2c->dev.release = isp1301_release; | 1534 | i2c->dev.release = isp1301_release; |
| @@ -1587,7 +1557,7 @@ fail1: | |||
| 1587 | status = otg_bind(isp); | 1557 | status = otg_bind(isp); |
| 1588 | if (status < 0) { | 1558 | if (status < 0) { |
| 1589 | dev_dbg(&i2c->dev, "can't bind OTG\n"); | 1559 | dev_dbg(&i2c->dev, "can't bind OTG\n"); |
| 1590 | goto fail2; | 1560 | goto fail; |
| 1591 | } | 1561 | } |
| 1592 | #endif | 1562 | #endif |
| 1593 | 1563 | ||
| @@ -1600,26 +1570,21 @@ fail1: | |||
| 1600 | 1570 | ||
| 1601 | /* IRQ wired at M14 */ | 1571 | /* IRQ wired at M14 */ |
| 1602 | omap_cfg_reg(M14_1510_GPIO2); | 1572 | omap_cfg_reg(M14_1510_GPIO2); |
| 1603 | isp->irq = OMAP_GPIO_IRQ(2); | ||
| 1604 | if (gpio_request(2, "isp1301") == 0) | 1573 | if (gpio_request(2, "isp1301") == 0) |
| 1605 | gpio_direction_input(2); | 1574 | gpio_direction_input(2); |
| 1606 | isp->irq_type = IRQF_TRIGGER_FALLING; | 1575 | isp->irq_type = IRQF_TRIGGER_FALLING; |
| 1607 | } | 1576 | } |
| 1608 | 1577 | ||
| 1609 | isp->irq_type |= IRQF_SAMPLE_RANDOM; | 1578 | isp->irq_type |= IRQF_SAMPLE_RANDOM; |
| 1610 | status = request_irq(isp->irq, isp1301_irq, | 1579 | status = request_irq(i2c->irq, isp1301_irq, |
| 1611 | isp->irq_type, DRIVER_NAME, isp); | 1580 | isp->irq_type, DRIVER_NAME, isp); |
| 1612 | if (status < 0) { | 1581 | if (status < 0) { |
| 1613 | dev_dbg(&i2c->dev, "can't get IRQ %d, err %d\n", | 1582 | dev_dbg(&i2c->dev, "can't get IRQ %d, err %d\n", |
| 1614 | isp->irq, status); | 1583 | i2c->irq, status); |
| 1615 | #ifdef CONFIG_USB_OTG | 1584 | goto fail; |
| 1616 | fail2: | ||
| 1617 | #endif | ||
| 1618 | i2c_detach_client(i2c); | ||
| 1619 | goto fail1; | ||
| 1620 | } | 1585 | } |
| 1621 | 1586 | ||
| 1622 | isp->otg.dev = &isp->client->dev; | 1587 | isp->otg.dev = &i2c->dev; |
| 1623 | isp->otg.label = DRIVER_NAME; | 1588 | isp->otg.label = DRIVER_NAME; |
| 1624 | 1589 | ||
| 1625 | isp->otg.set_host = isp1301_set_host, | 1590 | isp->otg.set_host = isp1301_set_host, |
| @@ -1650,22 +1615,25 @@ fail2: | |||
| 1650 | status); | 1615 | status); |
| 1651 | 1616 | ||
| 1652 | return 0; | 1617 | return 0; |
| 1653 | } | ||
| 1654 | 1618 | ||
| 1655 | static int isp1301_scan_bus(struct i2c_adapter *bus) | 1619 | fail: |
| 1656 | { | 1620 | kfree(isp); |
| 1657 | if (!i2c_check_functionality(bus, I2C_FUNC_SMBUS_BYTE_DATA | 1621 | return -ENODEV; |
| 1658 | | I2C_FUNC_SMBUS_READ_WORD_DATA)) | ||
| 1659 | return -EINVAL; | ||
| 1660 | return i2c_probe(bus, &addr_data, isp1301_probe); | ||
| 1661 | } | 1622 | } |
| 1662 | 1623 | ||
| 1624 | static const struct i2c_device_id isp1301_id[] = { | ||
| 1625 | { "isp1301_omap", 0 }, | ||
| 1626 | { } | ||
| 1627 | }; | ||
| 1628 | MODULE_DEVICE_TABLE(i2c, isp1301_id); | ||
| 1629 | |||
| 1663 | static struct i2c_driver isp1301_driver = { | 1630 | static struct i2c_driver isp1301_driver = { |
| 1664 | .driver = { | 1631 | .driver = { |
| 1665 | .name = "isp1301_omap", | 1632 | .name = "isp1301_omap", |
| 1666 | }, | 1633 | }, |
| 1667 | .attach_adapter = isp1301_scan_bus, | 1634 | .probe = isp1301_probe, |
| 1668 | .detach_client = isp1301_detach_client, | 1635 | .remove = __exit_p(isp1301_remove), |
| 1636 | .id_table = isp1301_id, | ||
| 1669 | }; | 1637 | }; |
| 1670 | 1638 | ||
| 1671 | /*-------------------------------------------------------------------------*/ | 1639 | /*-------------------------------------------------------------------------*/ |
