diff options
Diffstat (limited to 'drivers/i2c/chips/tps65010.c')
-rw-r--r-- | drivers/i2c/chips/tps65010.c | 59 |
1 files changed, 28 insertions, 31 deletions
diff --git a/drivers/i2c/chips/tps65010.c b/drivers/i2c/chips/tps65010.c index c0ac01b60039..280e9638c0f8 100644 --- a/drivers/i2c/chips/tps65010.c +++ b/drivers/i2c/chips/tps65010.c | |||
@@ -18,7 +18,6 @@ | |||
18 | * along with this program; if not, write to the Free Software | 18 | * along with this program; if not, write to the Free Software |
19 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | 19 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
20 | */ | 20 | */ |
21 | #undef DEBUG | ||
22 | 21 | ||
23 | #include <linux/config.h> | 22 | #include <linux/config.h> |
24 | #include <linux/kernel.h> | 23 | #include <linux/kernel.h> |
@@ -49,11 +48,7 @@ | |||
49 | MODULE_DESCRIPTION("TPS6501x Power Management Driver"); | 48 | MODULE_DESCRIPTION("TPS6501x Power Management Driver"); |
50 | MODULE_LICENSE("GPL"); | 49 | MODULE_LICENSE("GPL"); |
51 | 50 | ||
52 | /* only two addresses possible */ | 51 | static unsigned short normal_i2c[] = { 0x48, /* 0x49, */ I2C_CLIENT_END }; |
53 | #define TPS_BASE 0x48 | ||
54 | static unsigned short normal_i2c[] = { | ||
55 | TPS_BASE, | ||
56 | I2C_CLIENT_END }; | ||
57 | static unsigned short normal_i2c_range[] = { I2C_CLIENT_END }; | 52 | static unsigned short normal_i2c_range[] = { I2C_CLIENT_END }; |
58 | 53 | ||
59 | I2C_CLIENT_INSMOD; | 54 | I2C_CLIENT_INSMOD; |
@@ -102,7 +97,7 @@ struct tps65010 { | |||
102 | u8 chgstatus, regstatus, chgconf; | 97 | u8 chgstatus, regstatus, chgconf; |
103 | u8 nmask1, nmask2; | 98 | u8 nmask1, nmask2; |
104 | 99 | ||
105 | /* plus four GPIOs, probably used to switch power */ | 100 | /* not currently tracking GPIO state */ |
106 | }; | 101 | }; |
107 | 102 | ||
108 | #define POWER_POLL_DELAY msecs_to_jiffies(800) | 103 | #define POWER_POLL_DELAY msecs_to_jiffies(800) |
@@ -135,7 +130,7 @@ static void dbg_regstat(char *buf, size_t len, u8 regstatus) | |||
135 | (regstatus & TPS_REG_COVER) ? " uncover" : "", | 130 | (regstatus & TPS_REG_COVER) ? " uncover" : "", |
136 | (regstatus & TPS_REG_UVLO) ? " UVLO" : "", | 131 | (regstatus & TPS_REG_UVLO) ? " UVLO" : "", |
137 | (regstatus & TPS_REG_NO_CHG) ? " NO_CHG" : "", | 132 | (regstatus & TPS_REG_NO_CHG) ? " NO_CHG" : "", |
138 | (regstatus & TPS_REG_PG_LD02) ? " ld01_bad" : "", | 133 | (regstatus & TPS_REG_PG_LD02) ? " ld02_bad" : "", |
139 | (regstatus & TPS_REG_PG_LD01) ? " ld01_bad" : "", | 134 | (regstatus & TPS_REG_PG_LD01) ? " ld01_bad" : "", |
140 | (regstatus & TPS_REG_PG_MAIN) ? " main_bad" : "", | 135 | (regstatus & TPS_REG_PG_MAIN) ? " main_bad" : "", |
141 | (regstatus & TPS_REG_PG_CORE) ? " core_bad" : ""); | 136 | (regstatus & TPS_REG_PG_CORE) ? " core_bad" : ""); |
@@ -143,7 +138,7 @@ static void dbg_regstat(char *buf, size_t len, u8 regstatus) | |||
143 | 138 | ||
144 | static void dbg_chgconf(int por, char *buf, size_t len, u8 chgconfig) | 139 | static void dbg_chgconf(int por, char *buf, size_t len, u8 chgconfig) |
145 | { | 140 | { |
146 | char *hibit; | 141 | const char *hibit; |
147 | 142 | ||
148 | if (por) | 143 | if (por) |
149 | hibit = (chgconfig & TPS_CHARGE_POR) | 144 | hibit = (chgconfig & TPS_CHARGE_POR) |
@@ -295,7 +290,7 @@ static int dbg_show(struct seq_file *s, void *_) | |||
295 | seq_printf(s, "defgpio %02x mask3 %02x\n", value, v2); | 290 | seq_printf(s, "defgpio %02x mask3 %02x\n", value, v2); |
296 | 291 | ||
297 | for (i = 0; i < 4; i++) { | 292 | for (i = 0; i < 4; i++) { |
298 | if (value & (1 << (4 +i))) | 293 | if (value & (1 << (4 + i))) |
299 | seq_printf(s, " gpio%d-out %s\n", i + 1, | 294 | seq_printf(s, " gpio%d-out %s\n", i + 1, |
300 | (value & (1 << i)) ? "low" : "hi "); | 295 | (value & (1 << i)) ? "low" : "hi "); |
301 | else | 296 | else |
@@ -481,7 +476,7 @@ static int __exit tps65010_detach_client(struct i2c_client *client) | |||
481 | debugfs_remove(tps->file); | 476 | debugfs_remove(tps->file); |
482 | if (i2c_detach_client(client) == 0) | 477 | if (i2c_detach_client(client) == 0) |
483 | kfree(tps); | 478 | kfree(tps); |
484 | the_tps = 0; | 479 | the_tps = NULL; |
485 | return 0; | 480 | return 0; |
486 | } | 481 | } |
487 | 482 | ||
@@ -514,7 +509,6 @@ tps65010_probe(struct i2c_adapter *bus, int address, int kind) | |||
514 | INIT_WORK(&tps->work, tps65010_work, tps); | 509 | INIT_WORK(&tps->work, tps65010_work, tps); |
515 | tps->irq = -1; | 510 | tps->irq = -1; |
516 | tps->client.addr = address; | 511 | tps->client.addr = address; |
517 | i2c_set_clientdata(&tps->client, tps); | ||
518 | tps->client.adapter = bus; | 512 | tps->client.adapter = bus; |
519 | tps->client.driver = &tps65010_driver; | 513 | tps->client.driver = &tps65010_driver; |
520 | strlcpy(tps->client.name, DRIVER_NAME, I2C_NAME_SIZE); | 514 | strlcpy(tps->client.name, DRIVER_NAME, I2C_NAME_SIZE); |
@@ -523,9 +517,7 @@ tps65010_probe(struct i2c_adapter *bus, int address, int kind) | |||
523 | if (status < 0) { | 517 | if (status < 0) { |
524 | dev_dbg(&bus->dev, "can't attach %s to device %d, err %d\n", | 518 | dev_dbg(&bus->dev, "can't attach %s to device %d, err %d\n", |
525 | DRIVER_NAME, address, status); | 519 | DRIVER_NAME, address, status); |
526 | fail1: | 520 | goto fail1; |
527 | kfree(tps); | ||
528 | return 0; | ||
529 | } | 521 | } |
530 | 522 | ||
531 | #ifdef CONFIG_ARM | 523 | #ifdef CONFIG_ARM |
@@ -535,7 +527,7 @@ fail1: | |||
535 | tps->irq = OMAP_GPIO_IRQ(58); | 527 | tps->irq = OMAP_GPIO_IRQ(58); |
536 | omap_request_gpio(58); | 528 | omap_request_gpio(58); |
537 | omap_set_gpio_direction(58, 1); | 529 | omap_set_gpio_direction(58, 1); |
538 | omap_set_gpio_edge_ctrl(58, OMAP_GPIO_FALLING_EDGE); | 530 | set_irq_type(tps->irq, IRQT_FALLING); |
539 | } | 531 | } |
540 | if (machine_is_omap_osk()) { | 532 | if (machine_is_omap_osk()) { |
541 | tps->model = TPS65010; | 533 | tps->model = TPS65010; |
@@ -543,7 +535,7 @@ fail1: | |||
543 | tps->irq = OMAP_GPIO_IRQ(OMAP_MPUIO(1)); | 535 | tps->irq = OMAP_GPIO_IRQ(OMAP_MPUIO(1)); |
544 | omap_request_gpio(OMAP_MPUIO(1)); | 536 | omap_request_gpio(OMAP_MPUIO(1)); |
545 | omap_set_gpio_direction(OMAP_MPUIO(1), 1); | 537 | omap_set_gpio_direction(OMAP_MPUIO(1), 1); |
546 | omap_set_gpio_edge_ctrl(OMAP_MPUIO(1), OMAP_GPIO_FALLING_EDGE); | 538 | set_irq_type(tps->irq, IRQT_FALLING); |
547 | } | 539 | } |
548 | if (machine_is_omap_h3()) { | 540 | if (machine_is_omap_h3()) { |
549 | tps->model = TPS65013; | 541 | tps->model = TPS65013; |
@@ -633,6 +625,9 @@ fail1: | |||
633 | tps->file = debugfs_create_file(DRIVER_NAME, S_IRUGO, NULL, | 625 | tps->file = debugfs_create_file(DRIVER_NAME, S_IRUGO, NULL, |
634 | tps, DEBUG_FOPS); | 626 | tps, DEBUG_FOPS); |
635 | return 0; | 627 | return 0; |
628 | fail1: | ||
629 | kfree(tps); | ||
630 | return 0; | ||
636 | } | 631 | } |
637 | 632 | ||
638 | static int __init tps65010_scan_bus(struct i2c_adapter *bus) | 633 | static int __init tps65010_scan_bus(struct i2c_adapter *bus) |
@@ -645,7 +640,6 @@ static int __init tps65010_scan_bus(struct i2c_adapter *bus) | |||
645 | static struct i2c_driver tps65010_driver = { | 640 | static struct i2c_driver tps65010_driver = { |
646 | .owner = THIS_MODULE, | 641 | .owner = THIS_MODULE, |
647 | .name = "tps65010", | 642 | .name = "tps65010", |
648 | .id = 888, /* FIXME assign "official" value */ | ||
649 | .flags = I2C_DF_NOTIFY, | 643 | .flags = I2C_DF_NOTIFY, |
650 | .attach_adapter = tps65010_scan_bus, | 644 | .attach_adapter = tps65010_scan_bus, |
651 | .detach_client = __exit_p(tps65010_detach_client), | 645 | .detach_client = __exit_p(tps65010_detach_client), |
@@ -744,7 +738,7 @@ int tps65010_set_led(unsigned led, unsigned mode) | |||
744 | if (!the_tps) | 738 | if (!the_tps) |
745 | return -ENODEV; | 739 | return -ENODEV; |
746 | 740 | ||
747 | if(led == LED1) | 741 | if (led == LED1) |
748 | offs = 0; | 742 | offs = 0; |
749 | else { | 743 | else { |
750 | offs = 2; | 744 | offs = 2; |
@@ -753,11 +747,13 @@ int tps65010_set_led(unsigned led, unsigned mode) | |||
753 | 747 | ||
754 | down(&the_tps->lock); | 748 | down(&the_tps->lock); |
755 | 749 | ||
756 | dev_dbg (&the_tps->client.dev, "led%i_on 0x%02x\n", led, | 750 | pr_debug("%s: led%i_on 0x%02x\n", DRIVER_NAME, led, |
757 | i2c_smbus_read_byte_data(&the_tps->client, TPS_LED1_ON + offs)); | 751 | i2c_smbus_read_byte_data(&the_tps->client, |
752 | TPS_LED1_ON + offs)); | ||
758 | 753 | ||
759 | dev_dbg (&the_tps->client.dev, "led%i_per 0x%02x\n", led, | 754 | pr_debug("%s: led%i_per 0x%02x\n", DRIVER_NAME, led, |
760 | i2c_smbus_read_byte_data(&the_tps->client, TPS_LED1_PER + offs)); | 755 | i2c_smbus_read_byte_data(&the_tps->client, |
756 | TPS_LED1_PER + offs)); | ||
761 | 757 | ||
762 | switch (mode) { | 758 | switch (mode) { |
763 | case OFF: | 759 | case OFF: |
@@ -773,7 +769,7 @@ int tps65010_set_led(unsigned led, unsigned mode) | |||
773 | led_per = 0x08 | (1 << 7); | 769 | led_per = 0x08 | (1 << 7); |
774 | break; | 770 | break; |
775 | default: | 771 | default: |
776 | printk(KERN_ERR "%s: Wrong mode parameter for tps65010_set_led()\n", | 772 | printk(KERN_ERR "%s: Wrong mode parameter for set_led()\n", |
777 | DRIVER_NAME); | 773 | DRIVER_NAME); |
778 | up(&the_tps->lock); | 774 | up(&the_tps->lock); |
779 | return -EINVAL; | 775 | return -EINVAL; |
@@ -789,7 +785,7 @@ int tps65010_set_led(unsigned led, unsigned mode) | |||
789 | return status; | 785 | return status; |
790 | } | 786 | } |
791 | 787 | ||
792 | dev_dbg (&the_tps->client.dev, "led%i_on 0x%02x\n", led, | 788 | pr_debug("%s: led%i_on 0x%02x\n", DRIVER_NAME, led, |
793 | i2c_smbus_read_byte_data(&the_tps->client, TPS_LED1_ON + offs)); | 789 | i2c_smbus_read_byte_data(&the_tps->client, TPS_LED1_ON + offs)); |
794 | 790 | ||
795 | status = i2c_smbus_write_byte_data(&the_tps->client, | 791 | status = i2c_smbus_write_byte_data(&the_tps->client, |
@@ -802,8 +798,9 @@ int tps65010_set_led(unsigned led, unsigned mode) | |||
802 | return status; | 798 | return status; |
803 | } | 799 | } |
804 | 800 | ||
805 | dev_dbg (&the_tps->client.dev, "led%i_per 0x%02x\n", led, | 801 | pr_debug("%s: led%i_per 0x%02x\n", DRIVER_NAME, led, |
806 | i2c_smbus_read_byte_data(&the_tps->client, TPS_LED1_PER + offs)); | 802 | i2c_smbus_read_byte_data(&the_tps->client, |
803 | TPS_LED1_PER + offs)); | ||
807 | 804 | ||
808 | up(&the_tps->lock); | 805 | up(&the_tps->lock); |
809 | 806 | ||
@@ -874,7 +871,7 @@ int tps65010_set_low_pwr(unsigned mode) | |||
874 | 871 | ||
875 | if (status != 0) | 872 | if (status != 0) |
876 | printk(KERN_ERR "%s: Failed to write vdcdc1 register\n", | 873 | printk(KERN_ERR "%s: Failed to write vdcdc1 register\n", |
877 | DRIVER_NAME); | 874 | DRIVER_NAME); |
878 | else | 875 | else |
879 | pr_debug("%s: vdcdc1 0x%02x\n", DRIVER_NAME, | 876 | pr_debug("%s: vdcdc1 0x%02x\n", DRIVER_NAME, |
880 | i2c_smbus_read_byte_data(&the_tps->client, TPS_VDCDC1)); | 877 | i2c_smbus_read_byte_data(&the_tps->client, TPS_VDCDC1)); |
@@ -900,14 +897,14 @@ int tps65010_config_vregs1(unsigned value) | |||
900 | down(&the_tps->lock); | 897 | down(&the_tps->lock); |
901 | 898 | ||
902 | pr_debug("%s: vregs1 0x%02x\n", DRIVER_NAME, | 899 | pr_debug("%s: vregs1 0x%02x\n", DRIVER_NAME, |
903 | i2c_smbus_read_byte_data(&the_tps->client, TPS_VREGS1)); | 900 | i2c_smbus_read_byte_data(&the_tps->client, TPS_VREGS1)); |
904 | 901 | ||
905 | status = i2c_smbus_write_byte_data(&the_tps->client, | 902 | status = i2c_smbus_write_byte_data(&the_tps->client, |
906 | TPS_VREGS1, value); | 903 | TPS_VREGS1, value); |
907 | 904 | ||
908 | if (status != 0) | 905 | if (status != 0) |
909 | printk(KERN_ERR "%s: Failed to write vregs1 register\n", | 906 | printk(KERN_ERR "%s: Failed to write vregs1 register\n", |
910 | DRIVER_NAME); | 907 | DRIVER_NAME); |
911 | else | 908 | else |
912 | pr_debug("%s: vregs1 0x%02x\n", DRIVER_NAME, | 909 | pr_debug("%s: vregs1 0x%02x\n", DRIVER_NAME, |
913 | i2c_smbus_read_byte_data(&the_tps->client, TPS_VREGS1)); | 910 | i2c_smbus_read_byte_data(&the_tps->client, TPS_VREGS1)); |
@@ -1009,7 +1006,7 @@ static int __init tps_init(void) | |||
1009 | msleep(10); | 1006 | msleep(10); |
1010 | } | 1007 | } |
1011 | 1008 | ||
1012 | #if defined(CONFIG_ARM) | 1009 | #ifdef CONFIG_ARM |
1013 | if (machine_is_omap_osk()) { | 1010 | if (machine_is_omap_osk()) { |
1014 | 1011 | ||
1015 | // FIXME: More should be placed in the initialization code | 1012 | // FIXME: More should be placed in the initialization code |