On SUN4D machines there is one RTC-chip located on each systemboard, when
booting all of these will be probed. Registering a second RTC with the
kernel fails, and breaks the rtc:
[ 0.212000] kobject (f02625f0): tried to init an initialized object, somethi
[ 0.212000] [f0141418 : platform_device_register+0x4/0x18 ] [f01edbc4 : cloc
[ 0.216000] ------------[ cut here ]------------
[ 0.216000] WARNING: at fs/sysfs/dir.c:487 sysfs_add_one+0x84/0xa4()
[ 0.216000] sysfs: cannot create duplicate filename '/devices/platform/rtc-m
[ 0.216000] Modules linked in:
[ 0.216000] [f00c1988 : sysfs_add_one+0x84/0xa4 ] [f00c1f70 : create_dir+0x4
[ 0.216000] ---[ end trace 139ce121c98e96c9 ]---
[ 0.220000] kobject_add_internal failed for rtc-m48t59.0 with -EEXIST, don't
[ 0.220000] [f013d568 : device_add+0xc8/0x610 ] [f014134c : platform_device_
[ 0.220000] Registering RTC device failed
Later on in the boot the following happens:
[ 23.116000] drivers/rtc/hctosys.c: unable to open rtc device (rtc0)
The suggested fix searches the supplied RTC node for a address properties
which only one RTC per system appears to have and registers only this RTC
with the kernel. (Tested on SS20/SUN4M and SS1000E/SUN4D)
Signed-off-by: Kjetil Oftedal <oftedal@xxxxxxxxx>
diff --git a/arch/sparc/kernel/time_32.c b/arch/sparc/kernel/time_32.c
index 614ac7b..a902761 100644
--- a/arch/sparc/kernel/time_32.c
+++ b/arch/sparc/kernel/time_32.c
@@ -152,11 +152,27 @@ static int __devinit clock_probe(struct of_device *op, const struct of_device_id
{
struct device_node *dp = op->node;
const char *model = of_get_property(dp, "model", NULL);
+ struct property *prop = dp->properties;
+ char addr_present = 0;
if (!model)
return -ENODEV;
+ /* The primary RTC has an address property */
+ while (prop != NULL) {
+ if (!strcmp(prop->name, "address")) {
+ addr_present = 1;
+ break;
+ }
+ prop = prop->next;
+ }
+
+ /* Only register the primary RTC chip */
+ if (!addr_present)
+ return -ENODEV;
+
m48t59_rtc.resource = &op->resource[0];
+
if (!strcmp(model, "mk48t02")) {
/* Map the clock register io area read-only */
m48t59_data.ioaddr = of_ioremap(&op->resource[0], 0,
--
To unsubscribe from this list: send the line "unsubscribe sparclinux" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html