diff options
-rw-r--r-- | drivers/leds/leds-lp5521.c | 26 | ||||
-rw-r--r-- | drivers/leds/leds-lp5523.c | 23 | ||||
-rw-r--r-- | drivers/leds/leds-lp55xx-common.c | 22 | ||||
-rw-r--r-- | drivers/leds/leds-lp55xx-common.h | 20 |
4 files changed, 63 insertions, 28 deletions
diff --git a/drivers/leds/leds-lp5521.c b/drivers/leds/leds-lp5521.c index 124ce80fa115..e1f1dfcd1547 100644 --- a/drivers/leds/leds-lp5521.c +++ b/drivers/leds/leds-lp5521.c | |||
@@ -98,6 +98,9 @@ | |||
98 | /* Pattern Mode */ | 98 | /* Pattern Mode */ |
99 | #define PATTERN_OFF 0 | 99 | #define PATTERN_OFF 0 |
100 | 100 | ||
101 | /* Reset register value */ | ||
102 | #define LP5521_RESET 0xFF | ||
103 | |||
101 | struct lp5521_engine { | 104 | struct lp5521_engine { |
102 | int id; | 105 | int id; |
103 | u8 mode; | 106 | u8 mode; |
@@ -709,26 +712,12 @@ static void lp5521_unregister_sysfs(struct i2c_client *client) | |||
709 | &lp5521_led_attribute_group); | 712 | &lp5521_led_attribute_group); |
710 | } | 713 | } |
711 | 714 | ||
712 | static void lp5521_reset_device(struct lp5521_chip *chip) | ||
713 | { | ||
714 | struct i2c_client *client = chip->client; | ||
715 | |||
716 | lp5521_write(client, LP5521_REG_RESET, 0xff); | ||
717 | } | ||
718 | |||
719 | static void lp5521_deinit_device(struct lp5521_chip *chip); | 715 | static void lp5521_deinit_device(struct lp5521_chip *chip); |
720 | static int lp5521_init_device(struct lp5521_chip *chip) | 716 | static int lp5521_init_device(struct lp5521_chip *chip) |
721 | { | 717 | { |
722 | struct i2c_client *client = chip->client; | 718 | struct i2c_client *client = chip->client; |
723 | int ret; | 719 | int ret; |
724 | 720 | ||
725 | lp5521_reset_device(chip); | ||
726 | |||
727 | usleep_range(10000, 20000); /* | ||
728 | * Exact value is not available. 10 - 20ms | ||
729 | * appears to be enough for reset. | ||
730 | */ | ||
731 | |||
732 | ret = lp5521_detect(client); | 721 | ret = lp5521_detect(client); |
733 | if (ret) { | 722 | if (ret) { |
734 | dev_err(&client->dev, "Chip not found\n"); | 723 | dev_err(&client->dev, "Chip not found\n"); |
@@ -856,6 +845,14 @@ static void lp5521_unregister_leds(struct lp5521_chip *chip) | |||
856 | } | 845 | } |
857 | } | 846 | } |
858 | 847 | ||
848 | /* Chip specific configurations */ | ||
849 | static struct lp55xx_device_config lp5521_cfg = { | ||
850 | .reset = { | ||
851 | .addr = LP5521_REG_RESET, | ||
852 | .val = LP5521_RESET, | ||
853 | }, | ||
854 | }; | ||
855 | |||
859 | static int lp5521_probe(struct i2c_client *client, | 856 | static int lp5521_probe(struct i2c_client *client, |
860 | const struct i2c_device_id *id) | 857 | const struct i2c_device_id *id) |
861 | { | 858 | { |
@@ -881,6 +878,7 @@ static int lp5521_probe(struct i2c_client *client, | |||
881 | 878 | ||
882 | chip->cl = client; | 879 | chip->cl = client; |
883 | chip->pdata = pdata; | 880 | chip->pdata = pdata; |
881 | chip->cfg = &lp5521_cfg; | ||
884 | 882 | ||
885 | mutex_init(&chip->lock); | 883 | mutex_init(&chip->lock); |
886 | 884 | ||
diff --git a/drivers/leds/leds-lp5523.c b/drivers/leds/leds-lp5523.c index 8e602047ce35..00547783db77 100644 --- a/drivers/leds/leds-lp5523.c +++ b/drivers/leds/leds-lp5523.c | |||
@@ -87,6 +87,7 @@ | |||
87 | #define LP5523_AUTO_CLK 0x02 | 87 | #define LP5523_AUTO_CLK 0x02 |
88 | #define LP5523_EN_LEDTEST 0x80 | 88 | #define LP5523_EN_LEDTEST 0x80 |
89 | #define LP5523_LEDTEST_DONE 0x80 | 89 | #define LP5523_LEDTEST_DONE 0x80 |
90 | #define LP5523_RESET 0xFF | ||
90 | 91 | ||
91 | #define LP5523_DEFAULT_CURRENT 50 /* microAmps */ | 92 | #define LP5523_DEFAULT_CURRENT 50 /* microAmps */ |
92 | #define LP5523_PROGRAM_LENGTH 32 /* in bytes */ | 93 | #define LP5523_PROGRAM_LENGTH 32 /* in bytes */ |
@@ -900,25 +901,12 @@ static void lp5523_unregister_leds(struct lp5523_chip *chip) | |||
900 | } | 901 | } |
901 | } | 902 | } |
902 | 903 | ||
903 | static void lp5523_reset_device(struct lp5523_chip *chip) | ||
904 | { | ||
905 | struct i2c_client *client = chip->client; | ||
906 | |||
907 | lp5523_write(client, LP5523_REG_RESET, 0xff); | ||
908 | } | ||
909 | |||
910 | static void lp5523_deinit_device(struct lp5523_chip *chip); | 904 | static void lp5523_deinit_device(struct lp5523_chip *chip); |
911 | static int lp5523_init_device(struct lp5523_chip *chip) | 905 | static int lp5523_init_device(struct lp5523_chip *chip) |
912 | { | 906 | { |
913 | struct i2c_client *client = chip->client; | 907 | struct i2c_client *client = chip->client; |
914 | int ret; | 908 | int ret; |
915 | 909 | ||
916 | lp5523_reset_device(chip); | ||
917 | |||
918 | usleep_range(10000, 20000); /* | ||
919 | * Exact value is not available. 10 - 20ms | ||
920 | * appears to be enough for reset. | ||
921 | */ | ||
922 | ret = lp5523_detect(client); | 910 | ret = lp5523_detect(client); |
923 | if (ret) | 911 | if (ret) |
924 | goto err; | 912 | goto err; |
@@ -947,6 +935,14 @@ static void lp5523_deinit_device(struct lp5523_chip *chip) | |||
947 | pdata->release_resources(); | 935 | pdata->release_resources(); |
948 | } | 936 | } |
949 | 937 | ||
938 | /* Chip specific configurations */ | ||
939 | static struct lp55xx_device_config lp5523_cfg = { | ||
940 | .reset = { | ||
941 | .addr = LP5523_REG_RESET, | ||
942 | .val = LP5523_RESET, | ||
943 | }, | ||
944 | }; | ||
945 | |||
950 | static int lp5523_probe(struct i2c_client *client, | 946 | static int lp5523_probe(struct i2c_client *client, |
951 | const struct i2c_device_id *id) | 947 | const struct i2c_device_id *id) |
952 | { | 948 | { |
@@ -972,6 +968,7 @@ static int lp5523_probe(struct i2c_client *client, | |||
972 | 968 | ||
973 | chip->cl = client; | 969 | chip->cl = client; |
974 | chip->pdata = pdata; | 970 | chip->pdata = pdata; |
971 | chip->cfg = &lp5523_cfg; | ||
975 | 972 | ||
976 | mutex_init(&chip->lock); | 973 | mutex_init(&chip->lock); |
977 | 974 | ||
diff --git a/drivers/leds/leds-lp55xx-common.c b/drivers/leds/leds-lp55xx-common.c index 05a854c0d9b2..bbf2bbf03807 100644 --- a/drivers/leds/leds-lp55xx-common.c +++ b/drivers/leds/leds-lp55xx-common.c | |||
@@ -20,6 +20,16 @@ | |||
20 | 20 | ||
21 | #include "leds-lp55xx-common.h" | 21 | #include "leds-lp55xx-common.h" |
22 | 22 | ||
23 | static void lp55xx_reset_device(struct lp55xx_chip *chip) | ||
24 | { | ||
25 | struct lp55xx_device_config *cfg = chip->cfg; | ||
26 | u8 addr = cfg->reset.addr; | ||
27 | u8 val = cfg->reset.val; | ||
28 | |||
29 | /* no error checking here because no ACK from the device after reset */ | ||
30 | lp55xx_write(chip, addr, val); | ||
31 | } | ||
32 | |||
23 | int lp55xx_write(struct lp55xx_chip *chip, u8 reg, u8 val) | 33 | int lp55xx_write(struct lp55xx_chip *chip, u8 reg, u8 val) |
24 | { | 34 | { |
25 | return i2c_smbus_write_byte_data(chip->cl, reg, val); | 35 | return i2c_smbus_write_byte_data(chip->cl, reg, val); |
@@ -58,14 +68,16 @@ EXPORT_SYMBOL_GPL(lp55xx_update_bits); | |||
58 | int lp55xx_init_device(struct lp55xx_chip *chip) | 68 | int lp55xx_init_device(struct lp55xx_chip *chip) |
59 | { | 69 | { |
60 | struct lp55xx_platform_data *pdata; | 70 | struct lp55xx_platform_data *pdata; |
71 | struct lp55xx_device_config *cfg; | ||
61 | struct device *dev = &chip->cl->dev; | 72 | struct device *dev = &chip->cl->dev; |
62 | int ret = 0; | 73 | int ret = 0; |
63 | 74 | ||
64 | WARN_ON(!chip); | 75 | WARN_ON(!chip); |
65 | 76 | ||
66 | pdata = chip->pdata; | 77 | pdata = chip->pdata; |
78 | cfg = chip->cfg; | ||
67 | 79 | ||
68 | if (!pdata) | 80 | if (!pdata || !cfg) |
69 | return -EINVAL; | 81 | return -EINVAL; |
70 | 82 | ||
71 | if (pdata->setup_resources) { | 83 | if (pdata->setup_resources) { |
@@ -83,6 +95,14 @@ int lp55xx_init_device(struct lp55xx_chip *chip) | |||
83 | usleep_range(1000, 2000); /* 500us abs min. */ | 95 | usleep_range(1000, 2000); /* 500us abs min. */ |
84 | } | 96 | } |
85 | 97 | ||
98 | lp55xx_reset_device(chip); | ||
99 | |||
100 | /* | ||
101 | * Exact value is not available. 10 - 20ms | ||
102 | * appears to be enough for reset. | ||
103 | */ | ||
104 | usleep_range(10000, 20000); | ||
105 | |||
86 | err: | 106 | err: |
87 | return ret; | 107 | return ret; |
88 | } | 108 | } |
diff --git a/drivers/leds/leds-lp55xx-common.h b/drivers/leds/leds-lp55xx-common.h index 09d1882ce58e..a73ee0b9a0bd 100644 --- a/drivers/leds/leds-lp55xx-common.h +++ b/drivers/leds/leds-lp55xx-common.h | |||
@@ -19,17 +19,37 @@ struct lp55xx_led; | |||
19 | struct lp55xx_chip; | 19 | struct lp55xx_chip; |
20 | 20 | ||
21 | /* | 21 | /* |
22 | * struct lp55xx_reg | ||
23 | * @addr : Register address | ||
24 | * @val : Register value | ||
25 | */ | ||
26 | struct lp55xx_reg { | ||
27 | u8 addr; | ||
28 | u8 val; | ||
29 | }; | ||
30 | |||
31 | /* | ||
32 | * struct lp55xx_device_config | ||
33 | * @reset : Chip specific reset command | ||
34 | */ | ||
35 | struct lp55xx_device_config { | ||
36 | const struct lp55xx_reg reset; | ||
37 | }; | ||
38 | |||
39 | /* | ||
22 | * struct lp55xx_chip | 40 | * struct lp55xx_chip |
23 | * @cl : I2C communication for access registers | 41 | * @cl : I2C communication for access registers |
24 | * @pdata : Platform specific data | 42 | * @pdata : Platform specific data |
25 | * @lock : Lock for user-space interface | 43 | * @lock : Lock for user-space interface |
26 | * @num_leds : Number of registered LEDs | 44 | * @num_leds : Number of registered LEDs |
45 | * @cfg : Device specific configuration data | ||
27 | */ | 46 | */ |
28 | struct lp55xx_chip { | 47 | struct lp55xx_chip { |
29 | struct i2c_client *cl; | 48 | struct i2c_client *cl; |
30 | struct lp55xx_platform_data *pdata; | 49 | struct lp55xx_platform_data *pdata; |
31 | struct mutex lock; /* lock for user-space interface */ | 50 | struct mutex lock; /* lock for user-space interface */ |
32 | int num_leds; | 51 | int num_leds; |
52 | struct lp55xx_device_config *cfg; | ||
33 | }; | 53 | }; |
34 | 54 | ||
35 | /* | 55 | /* |