2 * RTC subsystem, nvmem interface
4 * Copyright (C) 2017 Alexandre Belloni
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
11 #include <linux/err.h>
12 #include <linux/types.h>
13 #include <linux/nvmem-consumer.h>
14 #include <linux/rtc.h>
15 #include <linux/sysfs.h>
18 * Deprecated ABI compatibility, this should be removed at some point
21 static const char nvram_warning
[] = "Deprecated ABI, please use nvmem";
24 rtc_nvram_read(struct file
*filp
, struct kobject
*kobj
,
25 struct bin_attribute
*attr
,
26 char *buf
, loff_t off
, size_t count
)
28 struct rtc_device
*rtc
= attr
->private;
30 dev_warn_once(kobj_to_dev(kobj
), nvram_warning
);
32 return nvmem_device_read(rtc
->nvmem
, off
, count
, buf
);
36 rtc_nvram_write(struct file
*filp
, struct kobject
*kobj
,
37 struct bin_attribute
*attr
,
38 char *buf
, loff_t off
, size_t count
)
40 struct rtc_device
*rtc
= attr
->private;
42 dev_warn_once(kobj_to_dev(kobj
), nvram_warning
);
44 return nvmem_device_write(rtc
->nvmem
, off
, count
, buf
);
47 static int rtc_nvram_register(struct rtc_device
*rtc
, size_t size
)
51 rtc
->nvram
= devm_kzalloc(rtc
->dev
.parent
,
52 sizeof(struct bin_attribute
),
57 rtc
->nvram
->attr
.name
= "nvram";
58 rtc
->nvram
->attr
.mode
= 0644;
59 rtc
->nvram
->private = rtc
;
61 sysfs_bin_attr_init(rtc
->nvram
);
63 rtc
->nvram
->read
= rtc_nvram_read
;
64 rtc
->nvram
->write
= rtc_nvram_write
;
65 rtc
->nvram
->size
= size
;
67 err
= sysfs_create_bin_file(&rtc
->dev
.parent
->kobj
,
70 devm_kfree(rtc
->dev
.parent
, rtc
->nvram
);
77 static void rtc_nvram_unregister(struct rtc_device
*rtc
)
79 sysfs_remove_bin_file(&rtc
->dev
.parent
->kobj
, rtc
->nvram
);
85 int rtc_nvmem_register(struct rtc_device
*rtc
,
86 struct nvmem_config
*nvmem_config
)
88 if (!IS_ERR_OR_NULL(rtc
->nvmem
))
94 nvmem_config
->dev
= rtc
->dev
.parent
;
95 nvmem_config
->owner
= rtc
->owner
;
96 rtc
->nvmem
= nvmem_register(nvmem_config
);
97 if (IS_ERR(rtc
->nvmem
))
98 return PTR_ERR(rtc
->nvmem
);
100 /* Register the old ABI */
101 if (rtc
->nvram_old_abi
)
102 rtc_nvram_register(rtc
, nvmem_config
->size
);
106 EXPORT_SYMBOL_GPL(rtc_nvmem_register
);
108 void rtc_nvmem_unregister(struct rtc_device
*rtc
)
110 if (IS_ERR_OR_NULL(rtc
->nvmem
))
113 /* unregister the old ABI */
115 rtc_nvram_unregister(rtc
);
117 nvmem_unregister(rtc
->nvmem
);