Commit 7b9b2ef1 authored by Alessandro Zummo's avatar Alessandro Zummo Committed by Linus Torvalds

rtc: rtc-ds1390 probe sequence and misc fixes

Small fixes for the ds1390 driver

 - fixed initialization of the spi device
 - added missing includes
 - removed printks
 - removed useless wrappers for rtc ops
 - removed dead code
Signed-off-by: default avatarAlessandro Zummo <a.zummo@towertech.it>
Cc: Mark Jackson <mpfj@mimc.co.uk>
Cc: David Brownell <david-b@pacbell.net>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 0417ce2a
...@@ -317,7 +317,8 @@ config RTC_DRV_DS1305 ...@@ -317,7 +317,8 @@ config RTC_DRV_DS1305
config RTC_DRV_DS1390 config RTC_DRV_DS1390
tristate "Dallas/Maxim DS1390/93/94" tristate "Dallas/Maxim DS1390/93/94"
help help
If you say yes here you get support for the DS1390/93/94 chips. If you say yes here you get support for the
Dallas/Maxim DS1390/93/94 chips.
This driver only supports the RTC feature, and not other chip This driver only supports the RTC feature, and not other chip
features such as alarms and trickle charging. features such as alarms and trickle charging.
......
/* /*
* rtc-ds1390.c -- driver for DS1390/93/94 * rtc-ds1390.c -- driver for the Dallas/Maxim DS1390/93/94 SPI RTC
* *
* Copyright (C) 2008 Mercury IMC Ltd * Copyright (C) 2008 Mercury IMC Ltd
* Written by Mark Jackson <mpfj@mimc.co.uk> * Written by Mark Jackson <mpfj@mimc.co.uk>
...@@ -8,11 +8,13 @@ ...@@ -8,11 +8,13 @@
* it under the terms of the GNU General Public License version 2 as * it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation. * published by the Free Software Foundation.
* *
* NOTE : Currently this driver only supports the bare minimum for read * NOTE: Currently this driver only supports the bare minimum for read
* and write the RTC. The extra features provided by the chip family * and write the RTC. The extra features provided by the chip family
* (alarms, trickle charger, different control registers) are unavailable. * (alarms, trickle charger, different control registers) are unavailable.
*/ */
#include <linux/init.h>
#include <linux/module.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/rtc.h> #include <linux/rtc.h>
#include <linux/spi/spi.h> #include <linux/spi/spi.h>
...@@ -42,20 +44,6 @@ struct ds1390 { ...@@ -42,20 +44,6 @@ struct ds1390 {
u8 txrx_buf[9]; /* cmd + 8 registers */ u8 txrx_buf[9]; /* cmd + 8 registers */
}; };
static void ds1390_set_reg(struct device *dev, unsigned char address,
unsigned char data)
{
struct spi_device *spi = to_spi_device(dev);
struct ds1390 *chip = dev_get_drvdata(dev);
/* Set MSB to indicate write */
chip->txrx_buf[0] = address | 0x80;
chip->txrx_buf[1] = data;
/* do the i/o */
spi_write_then_read(spi, chip->txrx_buf, 2, NULL, 0);
}
static int ds1390_get_reg(struct device *dev, unsigned char address, static int ds1390_get_reg(struct device *dev, unsigned char address,
unsigned char *data) unsigned char *data)
{ {
...@@ -78,7 +66,7 @@ static int ds1390_get_reg(struct device *dev, unsigned char address, ...@@ -78,7 +66,7 @@ static int ds1390_get_reg(struct device *dev, unsigned char address,
return 0; return 0;
} }
static int ds1390_get_datetime(struct device *dev, struct rtc_time *dt) static int ds1390_read_time(struct device *dev, struct rtc_time *dt)
{ {
struct spi_device *spi = to_spi_device(dev); struct spi_device *spi = to_spi_device(dev);
struct ds1390 *chip = dev_get_drvdata(dev); struct ds1390 *chip = dev_get_drvdata(dev);
...@@ -107,7 +95,7 @@ static int ds1390_get_datetime(struct device *dev, struct rtc_time *dt) ...@@ -107,7 +95,7 @@ static int ds1390_get_datetime(struct device *dev, struct rtc_time *dt)
return rtc_valid_tm(dt); return rtc_valid_tm(dt);
} }
static int ds1390_set_datetime(struct device *dev, struct rtc_time *dt) static int ds1390_set_time(struct device *dev, struct rtc_time *dt)
{ {
struct spi_device *spi = to_spi_device(dev); struct spi_device *spi = to_spi_device(dev);
struct ds1390 *chip = dev_get_drvdata(dev); struct ds1390 *chip = dev_get_drvdata(dev);
...@@ -127,16 +115,6 @@ static int ds1390_set_datetime(struct device *dev, struct rtc_time *dt) ...@@ -127,16 +115,6 @@ static int ds1390_set_datetime(struct device *dev, struct rtc_time *dt)
return spi_write_then_read(spi, chip->txrx_buf, 8, NULL, 0); return spi_write_then_read(spi, chip->txrx_buf, 8, NULL, 0);
} }
static int ds1390_read_time(struct device *dev, struct rtc_time *tm)
{
return ds1390_get_datetime(dev, tm);
}
static int ds1390_set_time(struct device *dev, struct rtc_time *tm)
{
return ds1390_set_datetime(dev, tm);
}
static const struct rtc_class_ops ds1390_rtc_ops = { static const struct rtc_class_ops ds1390_rtc_ops = {
.read_time = ds1390_read_time, .read_time = ds1390_read_time,
.set_time = ds1390_set_time, .set_time = ds1390_set_time,
...@@ -149,46 +127,40 @@ static int __devinit ds1390_probe(struct spi_device *spi) ...@@ -149,46 +127,40 @@ static int __devinit ds1390_probe(struct spi_device *spi)
struct ds1390 *chip; struct ds1390 *chip;
int res; int res;
printk(KERN_DEBUG "DS1390 SPI RTC driver\n");
rtc = rtc_device_register("ds1390",
&spi->dev, &ds1390_rtc_ops, THIS_MODULE);
if (IS_ERR(rtc)) {
printk(KERN_ALERT "RTC : unable to register device\n");
return PTR_ERR(rtc);
}
spi->mode = SPI_MODE_3; spi->mode = SPI_MODE_3;
spi->bits_per_word = 8; spi->bits_per_word = 8;
spi_setup(spi); spi_setup(spi);
chip = kzalloc(sizeof *chip, GFP_KERNEL); chip = kzalloc(sizeof *chip, GFP_KERNEL);
if (!chip) { if (!chip) {
printk(KERN_ALERT "RTC : unable to allocate device memory\n"); dev_err(&spi->dev, "unable to allocate device memory\n");
rtc_device_unregister(rtc);
return -ENOMEM; return -ENOMEM;
} }
chip->rtc = rtc;
dev_set_drvdata(&spi->dev, chip); dev_set_drvdata(&spi->dev, chip);
res = ds1390_get_reg(&spi->dev, DS1390_REG_SECONDS, &tmp); res = ds1390_get_reg(&spi->dev, DS1390_REG_SECONDS, &tmp);
if (res) { if (res != 0) {
printk(KERN_ALERT "RTC : unable to read device\n"); dev_err(&spi->dev, "unable to read device\n");
rtc_device_unregister(rtc); kfree(chip);
return res; return res;
} }
return 0; chip->rtc = rtc_device_register("ds1390",
&spi->dev, &ds1390_rtc_ops, THIS_MODULE);
if (IS_ERR(chip->rtc)) {
dev_err(&spi->dev, "unable to register device\n");
res = PTR_ERR(chip->rtc);
kfree(chip);
}
return res;
} }
static int __devexit ds1390_remove(struct spi_device *spi) static int __devexit ds1390_remove(struct spi_device *spi)
{ {
struct ds1390 *chip = platform_get_drvdata(spi); struct ds1390 *chip = platform_get_drvdata(spi);
struct rtc_device *rtc = chip->rtc;
if (rtc)
rtc_device_unregister(rtc);
rtc_device_unregister(chip->rtc);
kfree(chip); kfree(chip);
return 0; return 0;
...@@ -215,6 +187,6 @@ static __exit void ds1390_exit(void) ...@@ -215,6 +187,6 @@ static __exit void ds1390_exit(void)
} }
module_exit(ds1390_exit); module_exit(ds1390_exit);
MODULE_DESCRIPTION("DS1390/93/94 SPI RTC driver"); MODULE_DESCRIPTION("Dallas/Maxim DS1390/93/94 SPI RTC driver");
MODULE_AUTHOR("Mark Jackson <mpfj@mimc.co.uk>"); MODULE_AUTHOR("Mark Jackson <mpfj@mimc.co.uk>");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment