From 2374ce920fd0645c1a77e2e80dd7ab5d670be6a8 Mon Sep 17 00:00:00 2001 From: Mark Brown Date: Thu, 2 Jun 2011 19:18:50 +0100 Subject: [PATCH] --- yaml --- r: 261858 b: refs/heads/master c: b9d03d999b46f0897492f3aac3e794312e5282db h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/drivers/mfd/wm831x-core.c | 48 +++++++++++++++++++-------------- 2 files changed, 29 insertions(+), 21 deletions(-) diff --git a/[refs] b/[refs] index 52142ceda98f..09d6630c13dc 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 266a5e02fe2690637b2318c9fc5c3513937128f4 +refs/heads/master: b9d03d999b46f0897492f3aac3e794312e5282db diff --git a/trunk/drivers/mfd/wm831x-core.c b/trunk/drivers/mfd/wm831x-core.c index ff57a1674758..58f033b57efe 100644 --- a/trunk/drivers/mfd/wm831x-core.c +++ b/trunk/drivers/mfd/wm831x-core.c @@ -975,11 +975,6 @@ static struct mfd_cell wm8310_devs[] = { .num_resources = ARRAY_SIZE(wm831x_power_resources), .resources = wm831x_power_resources, }, - { - .name = "wm831x-rtc", - .num_resources = ARRAY_SIZE(wm831x_rtc_resources), - .resources = wm831x_rtc_resources, - }, { .name = "wm831x-status", .id = 1, @@ -1107,11 +1102,6 @@ static struct mfd_cell wm8311_devs[] = { .num_resources = ARRAY_SIZE(wm831x_power_resources), .resources = wm831x_power_resources, }, - { - .name = "wm831x-rtc", - .num_resources = ARRAY_SIZE(wm831x_rtc_resources), - .resources = wm831x_rtc_resources, - }, { .name = "wm831x-status", .id = 1, @@ -1263,11 +1253,6 @@ static struct mfd_cell wm8312_devs[] = { .num_resources = ARRAY_SIZE(wm831x_power_resources), .resources = wm831x_power_resources, }, - { - .name = "wm831x-rtc", - .num_resources = ARRAY_SIZE(wm831x_rtc_resources), - .resources = wm831x_rtc_resources, - }, { .name = "wm831x-status", .id = 1, @@ -1394,11 +1379,6 @@ static struct mfd_cell wm8320_devs[] = { .num_resources = ARRAY_SIZE(wm831x_on_resources), .resources = wm831x_on_resources, }, - { - .name = "wm831x-rtc", - .num_resources = ARRAY_SIZE(wm831x_rtc_resources), - .resources = wm831x_rtc_resources, - }, { .name = "wm831x-status", .id = 1, @@ -1426,6 +1406,13 @@ static struct mfd_cell touch_devs[] = { }, }; +static struct mfd_cell rtc_devs[] = { + { + .name = "wm831x-rtc", + .num_resources = ARRAY_SIZE(wm831x_rtc_resources), + .resources = wm831x_rtc_resources, + }, +}; static struct mfd_cell backlight_devs[] = { { @@ -1658,6 +1645,27 @@ int wm831x_device_init(struct wm831x *wm831x, unsigned long id, int irq) goto err_irq; } + /* The RTC can only be used if the 32.768kHz crystal is + * enabled; this can't be controlled by software at runtime. + */ + ret = wm831x_reg_read(wm831x, WM831X_CLOCK_CONTROL_2); + if (ret < 0) { + dev_err(wm831x->dev, "Failed to read clock status: %d\n", ret); + goto err_irq; + } + + if (ret & WM831X_XTAL_ENA) { + ret = mfd_add_devices(wm831x->dev, wm831x_num, + rtc_devs, ARRAY_SIZE(rtc_devs), + NULL, wm831x->irq_base); + if (ret != 0) { + dev_err(wm831x->dev, "Failed to add RTC: %d\n", ret); + goto err_irq; + } + } else { + dev_info(wm831x->dev, "32.768kHz clock disabled, no RTC\n"); + } + if (pdata && pdata->backlight) { /* Treat errors as non-critical */ ret = mfd_add_devices(wm831x->dev, wm831x_num, backlight_devs,