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: Alessandro Zummo <a.zummo@towertech.it>
Cc: Mark Jackson <mpfj@mimc.co.uk>
Cc: David Brownell <david-b@pacbell.net>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
Alessandro Zummo 2009-01-06 14:42:16 -08:00 committed by Linus Torvalds
parent 0417ce2ad8
commit 7b9b2ef1bb
2 changed files with 24 additions and 51 deletions

View File

@ -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.

View File

@ -1,5 +1,5 @@
/* /*
* 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 @@
* 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 {
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,
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)
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)
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)
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)
} }
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");