提交 bbccf83f 编写于 作者: A Alessandro Zummo 提交者: Linus Torvalds

rtc: use set_mmss when set_time is not available

Drivers should only need to implement either set_mmss (counter based RTCs)
or set_time (most RTCs).  The RTC subsystem will handle them
appropriately.
Signed-off-by: NAlessandro Zummo <a.zummo@towertech.it>
Cc: Kumar Gala <galak@kernel.crashing.org>
Cc: David Brownell <david-b@pacbell.net>
Cc: Lennert Buytenhek <buytenh@wantstofly.org>
Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
上级 f6009157
...@@ -50,10 +50,15 @@ int rtc_set_time(struct rtc_device *rtc, struct rtc_time *tm) ...@@ -50,10 +50,15 @@ int rtc_set_time(struct rtc_device *rtc, struct rtc_time *tm)
if (!rtc->ops) if (!rtc->ops)
err = -ENODEV; err = -ENODEV;
else if (!rtc->ops->set_time) else if (rtc->ops->set_time)
err = -EINVAL;
else
err = rtc->ops->set_time(rtc->dev.parent, tm); err = rtc->ops->set_time(rtc->dev.parent, tm);
else if (rtc->ops->set_mmss) {
unsigned long secs;
err = rtc_tm_to_time(tm, &secs);
if (err == 0)
err = rtc->ops->set_mmss(rtc->dev.parent, secs);
} else
err = -EINVAL;
mutex_unlock(&rtc->ops_lock); mutex_unlock(&rtc->ops_lock);
return err; return err;
......
...@@ -83,32 +83,11 @@ static int ds1672_set_mmss(struct i2c_client *client, unsigned long secs) ...@@ -83,32 +83,11 @@ static int ds1672_set_mmss(struct i2c_client *client, unsigned long secs)
return 0; return 0;
} }
static int ds1672_set_datetime(struct i2c_client *client, struct rtc_time *tm)
{
unsigned long secs;
dev_dbg(&client->dev,
"%s: secs=%d, mins=%d, hours=%d, "
"mday=%d, mon=%d, year=%d, wday=%d\n",
__func__,
tm->tm_sec, tm->tm_min, tm->tm_hour,
tm->tm_mday, tm->tm_mon, tm->tm_year, tm->tm_wday);
rtc_tm_to_time(tm, &secs);
return ds1672_set_mmss(client, secs);
}
static int ds1672_rtc_read_time(struct device *dev, struct rtc_time *tm) static int ds1672_rtc_read_time(struct device *dev, struct rtc_time *tm)
{ {
return ds1672_get_datetime(to_i2c_client(dev), tm); return ds1672_get_datetime(to_i2c_client(dev), tm);
} }
static int ds1672_rtc_set_time(struct device *dev, struct rtc_time *tm)
{
return ds1672_set_datetime(to_i2c_client(dev), tm);
}
static int ds1672_rtc_set_mmss(struct device *dev, unsigned long secs) static int ds1672_rtc_set_mmss(struct device *dev, unsigned long secs)
{ {
return ds1672_set_mmss(to_i2c_client(dev), secs); return ds1672_set_mmss(to_i2c_client(dev), secs);
...@@ -152,7 +131,6 @@ static DEVICE_ATTR(control, S_IRUGO, show_control, NULL); ...@@ -152,7 +131,6 @@ static DEVICE_ATTR(control, S_IRUGO, show_control, NULL);
static const struct rtc_class_ops ds1672_rtc_ops = { static const struct rtc_class_ops ds1672_rtc_ops = {
.read_time = ds1672_rtc_read_time, .read_time = ds1672_rtc_read_time,
.set_time = ds1672_rtc_set_time,
.set_mmss = ds1672_rtc_set_mmss, .set_mmss = ds1672_rtc_set_mmss,
}; };
......
...@@ -49,18 +49,6 @@ static int ep93xx_rtc_set_mmss(struct device *dev, unsigned long secs) ...@@ -49,18 +49,6 @@ static int ep93xx_rtc_set_mmss(struct device *dev, unsigned long secs)
return 0; return 0;
} }
static int ep93xx_rtc_set_time(struct device *dev, struct rtc_time *tm)
{
int err;
unsigned long secs;
err = rtc_tm_to_time(tm, &secs);
if (err != 0)
return err;
return ep93xx_rtc_set_mmss(dev, secs);
}
static int ep93xx_rtc_proc(struct device *dev, struct seq_file *seq) static int ep93xx_rtc_proc(struct device *dev, struct seq_file *seq)
{ {
unsigned short preload, delete; unsigned short preload, delete;
...@@ -75,7 +63,6 @@ static int ep93xx_rtc_proc(struct device *dev, struct seq_file *seq) ...@@ -75,7 +63,6 @@ static int ep93xx_rtc_proc(struct device *dev, struct seq_file *seq)
static const struct rtc_class_ops ep93xx_rtc_ops = { static const struct rtc_class_ops ep93xx_rtc_ops = {
.read_time = ep93xx_rtc_read_time, .read_time = ep93xx_rtc_read_time,
.set_time = ep93xx_rtc_set_time,
.set_mmss = ep93xx_rtc_set_mmss, .set_mmss = ep93xx_rtc_set_mmss,
.proc = ep93xx_rtc_proc, .proc = ep93xx_rtc_proc,
}; };
......
...@@ -34,14 +34,9 @@ static int test_rtc_read_time(struct device *dev, ...@@ -34,14 +34,9 @@ static int test_rtc_read_time(struct device *dev,
return 0; return 0;
} }
static int test_rtc_set_time(struct device *dev,
struct rtc_time *tm)
{
return 0;
}
static int test_rtc_set_mmss(struct device *dev, unsigned long secs) static int test_rtc_set_mmss(struct device *dev, unsigned long secs)
{ {
dev_info(dev, "%s, secs = %lu\n", __func__, secs);
return 0; return 0;
} }
...@@ -78,7 +73,6 @@ static int test_rtc_ioctl(struct device *dev, unsigned int cmd, ...@@ -78,7 +73,6 @@ static int test_rtc_ioctl(struct device *dev, unsigned int cmd,
static const struct rtc_class_ops test_rtc_ops = { static const struct rtc_class_ops test_rtc_ops = {
.proc = test_rtc_proc, .proc = test_rtc_proc,
.read_time = test_rtc_read_time, .read_time = test_rtc_read_time,
.set_time = test_rtc_set_time,
.read_alarm = test_rtc_read_alarm, .read_alarm = test_rtc_read_alarm,
.set_alarm = test_rtc_set_alarm, .set_alarm = test_rtc_set_alarm,
.set_mmss = test_rtc_set_mmss, .set_mmss = test_rtc_set_mmss,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册