rtc-rv3028.c (61b7369483efb5e0a9f3b48e75fac00d46d661e0) rtc-rv3028.c (3c87b351809f220294aec3c0df7b078ff5c5b15b)
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * RTC driver for the Micro Crystal RV3028
4 *
5 * Copyright (C) 2019 Micro Crystal SA
6 *
7 * Alexandre Belloni <alexandre.belloni@bootlin.com>
8 *

--- 841 unchanged lines hidden (view full) ---

850};
851
852static const struct regmap_config regmap_config = {
853 .reg_bits = 8,
854 .val_bits = 8,
855 .max_register = 0x37,
856};
857
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * RTC driver for the Micro Crystal RV3028
4 *
5 * Copyright (C) 2019 Micro Crystal SA
6 *
7 * Alexandre Belloni <alexandre.belloni@bootlin.com>
8 *

--- 841 unchanged lines hidden (view full) ---

850};
851
852static const struct regmap_config regmap_config = {
853 .reg_bits = 8,
854 .val_bits = 8,
855 .max_register = 0x37,
856};
857
858static u8 rv3028_set_trickle_charger(struct rv3028_data *rv3028,
859 struct i2c_client *client)
860{
861 int ret, val_old, val;
862 u32 ohms, chargeable;
863
864 ret = regmap_read(rv3028->regmap, RV3028_BACKUP, &val_old);
865 if (ret < 0)
866 return ret;
867
868 /* mask out only trickle charger bits */
869 val_old = val_old & (RV3028_BACKUP_TCE | RV3028_BACKUP_TCR_MASK);
870 val = val_old;
871
872 /* setup trickle charger */
873 if (!device_property_read_u32(&client->dev, "trickle-resistor-ohms",
874 &ohms)) {
875 int i;
876
877 for (i = 0; i < ARRAY_SIZE(rv3028_trickle_resistors); i++)
878 if (ohms == rv3028_trickle_resistors[i])
879 break;
880
881 if (i < ARRAY_SIZE(rv3028_trickle_resistors)) {
882 /* enable trickle charger and its resistor */
883 val = RV3028_BACKUP_TCE | i;
884 } else {
885 dev_warn(&client->dev, "invalid trickle resistor value\n");
886 }
887 }
888
889 if (!device_property_read_u32(&client->dev, "aux-voltage-chargeable",
890 &chargeable)) {
891 switch (chargeable) {
892 case 0:
893 val &= ~RV3028_BACKUP_TCE;
894 break;
895 case 1:
896 val |= RV3028_BACKUP_TCE;
897 break;
898 default:
899 dev_warn(&client->dev,
900 "unsupported aux-voltage-chargeable value\n");
901 break;
902 }
903 }
904
905 /* only update EEPROM if changes are necessary */
906 if (val_old != val) {
907 ret = rv3028_update_cfg(rv3028, RV3028_BACKUP, RV3028_BACKUP_TCE |
908 RV3028_BACKUP_TCR_MASK, val);
909 if (ret)
910 return ret;
911 }
912
913 return ret;
914}
915
858static int rv3028_probe(struct i2c_client *client)
859{
860 struct rv3028_data *rv3028;
861 int ret, status;
916static int rv3028_probe(struct i2c_client *client)
917{
918 struct rv3028_data *rv3028;
919 int ret, status;
862 u32 ohms;
863 struct nvmem_config nvmem_cfg = {
864 .name = "rv3028_nvram",
865 .word_size = 1,
866 .stride = 1,
867 .size = 2,
868 .type = NVMEM_TYPE_BATTERY_BACKED,
869 .reg_read = rv3028_nvram_read,
870 .reg_write = rv3028_nvram_write,

--- 61 unchanged lines hidden (view full) ---

932
933 /* setup timestamping */
934 ret = regmap_update_bits(rv3028->regmap, RV3028_CTRL2,
935 RV3028_CTRL2_EIE | RV3028_CTRL2_TSE,
936 RV3028_CTRL2_EIE | RV3028_CTRL2_TSE);
937 if (ret)
938 return ret;
939
920 struct nvmem_config nvmem_cfg = {
921 .name = "rv3028_nvram",
922 .word_size = 1,
923 .stride = 1,
924 .size = 2,
925 .type = NVMEM_TYPE_BATTERY_BACKED,
926 .reg_read = rv3028_nvram_read,
927 .reg_write = rv3028_nvram_write,

--- 61 unchanged lines hidden (view full) ---

989
990 /* setup timestamping */
991 ret = regmap_update_bits(rv3028->regmap, RV3028_CTRL2,
992 RV3028_CTRL2_EIE | RV3028_CTRL2_TSE,
993 RV3028_CTRL2_EIE | RV3028_CTRL2_TSE);
994 if (ret)
995 return ret;
996
940 /* setup trickle charger */
941 if (!device_property_read_u32(&client->dev, "trickle-resistor-ohms",
942 &ohms)) {
943 int i;
997 ret = rv3028_set_trickle_charger(rv3028, client);
998 if (ret)
999 return ret;
944
1000
945 for (i = 0; i < ARRAY_SIZE(rv3028_trickle_resistors); i++)
946 if (ohms == rv3028_trickle_resistors[i])
947 break;
948
949 if (i < ARRAY_SIZE(rv3028_trickle_resistors)) {
950 ret = rv3028_update_cfg(rv3028, RV3028_BACKUP, RV3028_BACKUP_TCE |
951 RV3028_BACKUP_TCR_MASK, RV3028_BACKUP_TCE | i);
952 if (ret)
953 return ret;
954 } else {
955 dev_warn(&client->dev, "invalid trickle resistor value\n");
956 }
957 }
958
959 ret = rtc_add_group(rv3028->rtc, &rv3028_attr_group);
960 if (ret)
961 return ret;
962
963 set_bit(RTC_FEATURE_BACKUP_SWITCH_MODE, rv3028->rtc->features);
964
965 rv3028->rtc->range_min = RTC_TIMESTAMP_BEGIN_2000;
966 rv3028->rtc->range_max = RTC_TIMESTAMP_END_2099;

--- 50 unchanged lines hidden ---
1001 ret = rtc_add_group(rv3028->rtc, &rv3028_attr_group);
1002 if (ret)
1003 return ret;
1004
1005 set_bit(RTC_FEATURE_BACKUP_SWITCH_MODE, rv3028->rtc->features);
1006
1007 rv3028->rtc->range_min = RTC_TIMESTAMP_BEGIN_2000;
1008 rv3028->rtc->range_max = RTC_TIMESTAMP_END_2099;

--- 50 unchanged lines hidden ---