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 --- |