[PATCH resend] rtc: Adding support for spear rtc
rajeev
rajeev-dlh.kumar at st.com
Thu Apr 28 01:41:04 EDT 2011
On 4/26/2011 3:51 AM, Andrew Morton wrote:
> On Mon, 25 Apr 2011 17:00:26 +0530
> Viresh Kumar <viresh.kumar at st.com> wrote:
>> From: Rajeev Kumar <rajeev-dlh.kumar at st.com>
>> +static void rtc_wait_not_busy(struct spear_rtc_config *config)
>> +{
>> + int status, count = 0;
>> + unsigned long flags;
>> +
>> + /* Assuming BUSY may stay active for 80 msec) */
>> + for (count = 0; count < 80; count++) {
>> + spin_lock_irqsave(&config->lock, flags);
>> + status = readl(config->ioaddr + STATUS_REG);
>> + spin_unlock_irqrestore(&config->lock, flags);
>> + if ((status & STATUS_BUSY) == 0)
>> + break;
>> + /* check status busy, after each msec */
>> + msleep(1);
>> + }
>> +}
>
> Question. What activity causes STATUS_BUSY to become set?
>
STATUS_BUSY is (PD | PT), where
[3] PD: Pending write to Date register.
[2] PT: Pending write to Time register.
So, when we have updated date and time, these bits ensures that date and time
are actually written in h/w.
>>
>> ...
>>
>> +static int spear_rtc_read_time(struct device *dev, struct rtc_time *tm)
>> +{
>> + struct platform_device *pdev = to_platform_device(dev);
>> + struct rtc_device *rtc = platform_get_drvdata(pdev);
>> + struct spear_rtc_config *config = dev_get_drvdata(&rtc->dev);
>> + unsigned int time, date;
>> +
>> + /* we don't report wday/yday/isdst ... */
>> + rtc_wait_not_busy(config);
>
> Because here, we've waited for STATUS_BUSY to clear, but we don't
> appear to have taken any steps to prevent it from getting set again
> while these steps:
>
>> + time = readl(config->ioaddr + TIME_REG);
>> + date = readl(config->ioaddr + DATE_REG);
>> + tm->tm_sec = (time >> SECOND_SHIFT) & SECOND_MASK;
>> + tm->tm_min = (time >> MINUTE_SHIFT) & MIN_MASK;
>> + tm->tm_hour = (time >> HOUR_SHIFT) & HOUR_MASK;
>> + tm->tm_mday = (date >> MDAY_SHIFT) & DAY_MASK;
>> + tm->tm_mon = (date >> MONTH_SHIFT) & MONTH_MASK;
>> + tm->tm_year = (date >> YEAR_SHIFT) & YEAR_MASK;
>
> are in progress?
>
Because, we haven't written anything to date and time regs and so BUSY will not
be set again during these steps.
Best Rgds
Rajeev
More information about the linux-arm-kernel
mailing list