aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/leds/leds-lp5521.c102
-rw-r--r--drivers/leds/leds-lp5523.c47
2 files changed, 84 insertions, 65 deletions
diff --git a/drivers/leds/leds-lp5521.c b/drivers/leds/leds-lp5521.c
index cb8a5220200b..24f439f78bd8 100644
--- a/drivers/leds/leds-lp5521.c
+++ b/drivers/leds/leds-lp5521.c
@@ -687,6 +687,59 @@ static void lp5521_unregister_sysfs(struct i2c_client *client)
687 &lp5521_led_attribute_group); 687 &lp5521_led_attribute_group);
688} 688}
689 689
690static int lp5521_init_device(struct lp5521_chip *chip)
691{
692 struct lp5521_platform_data *pdata = chip->pdata;
693 struct i2c_client *client = chip->client;
694 int ret;
695 u8 buf;
696
697 if (pdata->setup_resources) {
698 ret = pdata->setup_resources();
699 if (ret < 0)
700 return ret;
701 }
702
703 if (pdata->enable) {
704 pdata->enable(0);
705 usleep_range(1000, 2000); /* Keep enable down at least 1ms */
706 pdata->enable(1);
707 usleep_range(1000, 2000); /* 500us abs min. */
708 }
709
710 lp5521_write(client, LP5521_REG_RESET, 0xff);
711 usleep_range(10000, 20000); /*
712 * Exact value is not available. 10 - 20ms
713 * appears to be enough for reset.
714 */
715
716 /*
717 * Make sure that the chip is reset by reading back the r channel
718 * current reg. This is dummy read is required on some platforms -
719 * otherwise further access to the R G B channels in the
720 * LP5521_REG_ENABLE register will not have any effect - strange!
721 */
722 ret = lp5521_read(client, LP5521_REG_R_CURRENT, &buf);
723 if (ret) {
724 dev_err(&client->dev, "error in resetting chip\n");
725 return ret;
726 }
727 if (buf != LP5521_REG_R_CURR_DEFAULT) {
728 dev_err(&client->dev,
729 "unexpected data in register (expected 0x%x got 0x%x)\n",
730 LP5521_REG_R_CURR_DEFAULT, buf);
731 ret = -EINVAL;
732 return ret;
733 }
734 usleep_range(10000, 20000);
735
736 ret = lp5521_detect(client);
737 if (ret)
738 dev_err(&client->dev, "Chip not found\n");
739
740 return ret;
741}
742
690static int lp5521_init_led(struct lp5521_led *led, 743static int lp5521_init_led(struct lp5521_led *led,
691 struct i2c_client *client, 744 struct i2c_client *client,
692 int chan, struct lp5521_platform_data *pdata) 745 int chan, struct lp5521_platform_data *pdata)
@@ -742,7 +795,6 @@ static int lp5521_probe(struct i2c_client *client,
742 struct lp5521_chip *chip; 795 struct lp5521_chip *chip;
743 struct lp5521_platform_data *pdata; 796 struct lp5521_platform_data *pdata;
744 int ret, i, led; 797 int ret, i, led;
745 u8 buf;
746 798
747 chip = devm_kzalloc(&client->dev, sizeof(*chip), GFP_KERNEL); 799 chip = devm_kzalloc(&client->dev, sizeof(*chip), GFP_KERNEL);
748 if (!chip) 800 if (!chip)
@@ -762,51 +814,9 @@ static int lp5521_probe(struct i2c_client *client,
762 814
763 chip->pdata = pdata; 815 chip->pdata = pdata;
764 816
765 if (pdata->setup_resources) { 817 ret = lp5521_init_device(chip);
766 ret = pdata->setup_resources(); 818 if (ret)
767 if (ret < 0) 819 goto fail1;
768 return ret;
769 }
770
771 if (pdata->enable) {
772 pdata->enable(0);
773 usleep_range(1000, 2000); /* Keep enable down at least 1ms */
774 pdata->enable(1);
775 usleep_range(1000, 2000); /* 500us abs min. */
776 }
777
778 lp5521_write(client, LP5521_REG_RESET, 0xff);
779 usleep_range(10000, 20000); /*
780 * Exact value is not available. 10 - 20ms
781 * appears to be enough for reset.
782 */
783
784 /*
785 * Make sure that the chip is reset by reading back the r channel
786 * current reg. This is dummy read is required on some platforms -
787 * otherwise further access to the R G B channels in the
788 * LP5521_REG_ENABLE register will not have any effect - strange!
789 */
790 ret = lp5521_read(client, LP5521_REG_R_CURRENT, &buf);
791 if (ret) {
792 dev_err(&client->dev, "error in resetting chip\n");
793 goto fail2;
794 }
795 if (buf != LP5521_REG_R_CURR_DEFAULT) {
796 dev_err(&client->dev,
797 "unexpected data in register (expected 0x%x got 0x%x)\n",
798 LP5521_REG_R_CURR_DEFAULT, buf);
799 ret = -EINVAL;
800 goto fail2;
801 }
802 usleep_range(10000, 20000);
803
804 ret = lp5521_detect(client);
805
806 if (ret) {
807 dev_err(&client->dev, "Chip not found\n");
808 goto fail2;
809 }
810 820
811 dev_info(&client->dev, "%s programmable led chip found\n", id->name); 821 dev_info(&client->dev, "%s programmable led chip found\n", id->name);
812 822
diff --git a/drivers/leds/leds-lp5523.c b/drivers/leds/leds-lp5523.c
index 7f5be8948cde..491ea725bb0b 100644
--- a/drivers/leds/leds-lp5523.c
+++ b/drivers/leds/leds-lp5523.c
@@ -896,6 +896,33 @@ static int lp5523_init_led(struct lp5523_led *led, struct device *dev,
896 return 0; 896 return 0;
897} 897}
898 898
899static int lp5523_init_device(struct lp5523_chip *chip)
900{
901 struct lp5523_platform_data *pdata = chip->pdata;
902 struct i2c_client *client = chip->client;
903 int ret;
904
905 if (pdata->setup_resources) {
906 ret = pdata->setup_resources();
907 if (ret < 0)
908 return ret;
909 }
910
911 if (pdata->enable) {
912 pdata->enable(0);
913 usleep_range(1000, 2000); /* Keep enable down at least 1ms */
914 pdata->enable(1);
915 usleep_range(1000, 2000); /* 500us abs min. */
916 }
917
918 lp5523_write(client, LP5523_REG_RESET, 0xff);
919 usleep_range(10000, 20000); /*
920 * Exact value is not available. 10 - 20ms
921 * appears to be enough for reset.
922 */
923 return lp5523_detect(client);
924}
925
899static int lp5523_probe(struct i2c_client *client, 926static int lp5523_probe(struct i2c_client *client,
900 const struct i2c_device_id *id) 927 const struct i2c_device_id *id)
901{ 928{
@@ -921,25 +948,7 @@ static int lp5523_probe(struct i2c_client *client,
921 948
922 chip->pdata = pdata; 949 chip->pdata = pdata;
923 950
924 if (pdata->setup_resources) { 951 ret = lp5523_init_device(chip);
925 ret = pdata->setup_resources();
926 if (ret < 0)
927 return ret;
928 }
929
930 if (pdata->enable) {
931 pdata->enable(0);
932 usleep_range(1000, 2000); /* Keep enable down at least 1ms */
933 pdata->enable(1);
934 usleep_range(1000, 2000); /* 500us abs min. */
935 }
936
937 lp5523_write(client, LP5523_REG_RESET, 0xff);
938 usleep_range(10000, 20000); /*
939 * Exact value is not available. 10 - 20ms
940 * appears to be enough for reset.
941 */
942 ret = lp5523_detect(client);
943 if (ret) 952 if (ret)
944 goto fail1; 953 goto fail1;
945 954