diff options
Diffstat (limited to 'drivers/rtc/rtc-ds1307.c')
-rw-r--r-- | drivers/rtc/rtc-ds1307.c | 60 |
1 files changed, 33 insertions, 27 deletions
diff --git a/drivers/rtc/rtc-ds1307.c b/drivers/rtc/rtc-ds1307.c index 4e75345a559a..9e2aad68f96d 100644 --- a/drivers/rtc/rtc-ds1307.c +++ b/drivers/rtc/rtc-ds1307.c | |||
@@ -930,52 +930,58 @@ read_rtc: | |||
930 | ds1307->rtc = devm_rtc_device_register(&client->dev, client->name, | 930 | ds1307->rtc = devm_rtc_device_register(&client->dev, client->name, |
931 | &ds13xx_rtc_ops, THIS_MODULE); | 931 | &ds13xx_rtc_ops, THIS_MODULE); |
932 | if (IS_ERR(ds1307->rtc)) { | 932 | if (IS_ERR(ds1307->rtc)) { |
933 | err = PTR_ERR(ds1307->rtc); | 933 | return PTR_ERR(ds1307->rtc); |
934 | dev_err(&client->dev, | ||
935 | "unable to register the class device\n"); | ||
936 | goto exit; | ||
937 | } | 934 | } |
938 | 935 | ||
939 | if (want_irq) { | 936 | if (want_irq) { |
940 | err = request_irq(client->irq, ds1307_irq, IRQF_SHARED, | 937 | err = request_irq(client->irq, ds1307_irq, IRQF_SHARED, |
941 | ds1307->rtc->name, client); | 938 | ds1307->rtc->name, client); |
942 | if (err) { | 939 | if (err) { |
943 | dev_err(&client->dev, | 940 | client->irq = 0; |
944 | "unable to request IRQ!\n"); | 941 | dev_err(&client->dev, "unable to request IRQ!\n"); |
945 | goto exit; | 942 | } else { |
946 | } | ||
947 | 943 | ||
948 | device_set_wakeup_capable(&client->dev, 1); | 944 | device_set_wakeup_capable(&client->dev, 1); |
949 | set_bit(HAS_ALARM, &ds1307->flags); | 945 | set_bit(HAS_ALARM, &ds1307->flags); |
950 | dev_dbg(&client->dev, "got IRQ %d\n", client->irq); | 946 | dev_dbg(&client->dev, "got IRQ %d\n", client->irq); |
947 | } | ||
951 | } | 948 | } |
952 | 949 | ||
953 | if (chip->nvram_size) { | 950 | if (chip->nvram_size) { |
951 | |||
954 | ds1307->nvram = devm_kzalloc(&client->dev, | 952 | ds1307->nvram = devm_kzalloc(&client->dev, |
955 | sizeof(struct bin_attribute), | 953 | sizeof(struct bin_attribute), |
956 | GFP_KERNEL); | 954 | GFP_KERNEL); |
957 | if (!ds1307->nvram) { | 955 | if (!ds1307->nvram) { |
958 | err = -ENOMEM; | 956 | dev_err(&client->dev, "cannot allocate memory for nvram sysfs\n"); |
959 | goto err_irq; | 957 | } else { |
958 | |||
959 | ds1307->nvram->attr.name = "nvram"; | ||
960 | ds1307->nvram->attr.mode = S_IRUGO | S_IWUSR; | ||
961 | |||
962 | sysfs_bin_attr_init(ds1307->nvram); | ||
963 | |||
964 | ds1307->nvram->read = ds1307_nvram_read; | ||
965 | ds1307->nvram->write = ds1307_nvram_write; | ||
966 | ds1307->nvram->size = chip->nvram_size; | ||
967 | ds1307->nvram_offset = chip->nvram_offset; | ||
968 | |||
969 | err = sysfs_create_bin_file(&client->dev.kobj, | ||
970 | ds1307->nvram); | ||
971 | if (err) { | ||
972 | dev_err(&client->dev, | ||
973 | "unable to create sysfs file: %s\n", | ||
974 | ds1307->nvram->attr.name); | ||
975 | } else { | ||
976 | set_bit(HAS_NVRAM, &ds1307->flags); | ||
977 | dev_info(&client->dev, "%zu bytes nvram\n", | ||
978 | ds1307->nvram->size); | ||
979 | } | ||
960 | } | 980 | } |
961 | ds1307->nvram->attr.name = "nvram"; | ||
962 | ds1307->nvram->attr.mode = S_IRUGO | S_IWUSR; | ||
963 | sysfs_bin_attr_init(ds1307->nvram); | ||
964 | ds1307->nvram->read = ds1307_nvram_read; | ||
965 | ds1307->nvram->write = ds1307_nvram_write; | ||
966 | ds1307->nvram->size = chip->nvram_size; | ||
967 | ds1307->nvram_offset = chip->nvram_offset; | ||
968 | err = sysfs_create_bin_file(&client->dev.kobj, ds1307->nvram); | ||
969 | if (err) | ||
970 | goto err_irq; | ||
971 | set_bit(HAS_NVRAM, &ds1307->flags); | ||
972 | dev_info(&client->dev, "%zu bytes nvram\n", ds1307->nvram->size); | ||
973 | } | 981 | } |
974 | 982 | ||
975 | return 0; | 983 | return 0; |
976 | 984 | ||
977 | err_irq: | ||
978 | free_irq(client->irq, client); | ||
979 | exit: | 985 | exit: |
980 | return err; | 986 | return err; |
981 | } | 987 | } |