Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 319947
b: refs/heads/master
c: 1bb457f
h: refs/heads/master
i:
  319945: de633c6
  319943: 9542b9a
v: v3
  • Loading branch information
Linus Walleij authored and Linus Torvalds committed Jul 31, 2012
1 parent bb907c5 commit 07025b0
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 10 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: aff05ed5d103524bd69bd9d7b621c5c8a6c63198
refs/heads/master: 1bb457fc9268bb75156af8db78b72a4463baaec4
23 changes: 14 additions & 9 deletions trunk/drivers/rtc/rtc-pl031.c
Original file line number Diff line number Diff line change
Expand Up @@ -71,17 +71,21 @@
/**
* struct pl031_vendor_data - per-vendor variations
* @ops: the vendor-specific operations used on this silicon version
* @clockwatch: if this is an ST Microelectronics silicon version with a
* clockwatch function
* @st_weekday: if this is an ST Microelectronics silicon version that need
* the weekday fix
*/
struct pl031_vendor_data {
struct rtc_class_ops ops;
bool clockwatch;
bool st_weekday;
};

struct pl031_local {
struct pl031_vendor_data *vendor;
struct rtc_device *rtc;
void __iomem *base;
u8 hw_designer;
u8 hw_revision:4;
};

static int pl031_alarm_irq_enable(struct device *dev,
Expand Down Expand Up @@ -336,22 +340,19 @@ static int pl031_probe(struct amba_device *adev, const struct amba_id *id)

amba_set_drvdata(adev, ldata);

ldata->hw_designer = amba_manf(adev);
ldata->hw_revision = amba_rev(adev);

dev_dbg(&adev->dev, "designer ID = 0x%02x\n", ldata->hw_designer);
dev_dbg(&adev->dev, "revision = 0x%01x\n", ldata->hw_revision);
dev_dbg(&adev->dev, "designer ID = 0x%02x\n", amba_manf(adev));
dev_dbg(&adev->dev, "revision = 0x%01x\n", amba_rev(adev));

/* Enable the clockwatch on ST Variants */
if (ldata->hw_designer == AMBA_VENDOR_ST)
if (vendor->clockwatch)
writel(readl(ldata->base + RTC_CR) | RTC_CR_CWEN,
ldata->base + RTC_CR);

/*
* On ST PL031 variants, the RTC reset value does not provide correct
* weekday for 2000-01-01. Correct the erroneous sunday to saturday.
*/
if (ldata->hw_designer == AMBA_VENDOR_ST) {
if (vendor->st_weekday) {
if (readl(ldata->base + RTC_YDR) == 0x2000) {
time = readl(ldata->base + RTC_DR);
if ((time &
Expand Down Expand Up @@ -413,6 +414,8 @@ static struct pl031_vendor_data stv1_pl031 = {
.set_alarm = pl031_set_alarm,
.alarm_irq_enable = pl031_alarm_irq_enable,
},
.clockwatch = true,
.st_weekday = true,
};

/* And the second ST derivative */
Expand All @@ -424,6 +427,8 @@ static struct pl031_vendor_data stv2_pl031 = {
.set_alarm = pl031_stv2_set_alarm,
.alarm_irq_enable = pl031_alarm_irq_enable,
},
.clockwatch = true,
.st_weekday = true,
};

static struct amba_id pl031_ids[] = {
Expand Down

0 comments on commit 07025b0

Please sign in to comment.