svn commit: r191322 - in head/sys: arm/conf dev/iicbus

M. Warner Losh imp at bsdimp.com
Tue Apr 21 15:28:15 UTC 2009


In message: <200904201547.n3KFl6Z6050834 at svn.freebsd.org>
            Stanislav Sedov <stas at freebsd.org> writes:
: Author: stas
: Date: Mon Apr 20 15:47:06 2009
: New Revision: 191322
: URL: http://svn.freebsd.org/changeset/base/191322
: 
: Log:
:   - Give a warning and start the oscillator if it was not previously
:     runned.
:   - Rename ds1672 -> rtc to follow the other drivers.

This is a bad change.  Please back it out.  There are multiple
different kinds of rtc clocks that can live on i2c.

Warner


:   MFC after:	2 weeks
: 
: Modified:
:   head/sys/arm/conf/AVILA.hints
:   head/sys/arm/conf/BWCT.hints
:   head/sys/arm/conf/CAMBRIA.hints
:   head/sys/dev/iicbus/ds1672.c
: 
: Modified: head/sys/arm/conf/AVILA.hints
: ==============================================================================
: --- head/sys/arm/conf/AVILA.hints	Mon Apr 20 15:19:54 2009	(r191321)
: +++ head/sys/arm/conf/AVILA.hints	Mon Apr 20 15:47:06 2009	(r191322)
: @@ -44,5 +44,5 @@ hint.ad7418.0.at="iicbus0"
:  hint.ad7418.0.addr=0x50
:  
:  # Dallas Semiconductor DS1672 RTC
: -hint.ds1672.0.at="iicbus0"
: -hint.ds1672.0.addr=0xd0
: +hint.rtc.0.at="iicbus0"
: +hint.rtc.0.addr=0xd0
: 
: Modified: head/sys/arm/conf/BWCT.hints
: ==============================================================================
: --- head/sys/arm/conf/BWCT.hints	Mon Apr 20 15:19:54 2009	(r191321)
: +++ head/sys/arm/conf/BWCT.hints	Mon Apr 20 15:47:06 2009	(r191322)
: @@ -1,8 +1,8 @@
:  # $FreeBSD$
:  
:  # Dallas Semiconductor DS1672 RTC sitting on the I2C bus
: -hint.ds1672.0.at="iicbus0"
: -hint.ds1672.0.addr=0xd0
: +hint.rtc.0.at="iicbus0"
: +hint.rtc.0.addr=0xd0
:  
:  # NAtional Semiconductor LM75 temperature sensor sitting on the I2C bus
:  hint.lm75.0.at="iicbus0"
: 
: Modified: head/sys/arm/conf/CAMBRIA.hints
: ==============================================================================
: --- head/sys/arm/conf/CAMBRIA.hints	Mon Apr 20 15:19:54 2009	(r191321)
: +++ head/sys/arm/conf/CAMBRIA.hints	Mon Apr 20 15:47:06 2009	(r191322)
: @@ -46,8 +46,8 @@ hint.ad7418.0.at="iicbus0"
:  hint.ad7418.0.addr=0x50
:  
:  # Dallas Semiconductor DS1672 RTC
: -hint.ds1672.0.at="iicbus0"
: -hint.ds1672.0.addr=0xd0
: +hint.rtc.0.at="iicbus0"
: +hint.rtc.0.addr=0xd0
:  
:  # USB is part of the chip
:  hint.ehci.0.at="ixp0"
: 
: Modified: head/sys/dev/iicbus/ds1672.c
: ==============================================================================
: --- head/sys/dev/iicbus/ds1672.c	Mon Apr 20 15:19:54 2009	(r191321)
: +++ head/sys/dev/iicbus/ds1672.c	Mon Apr 20 15:47:06 2009	(r191322)
: @@ -50,8 +50,12 @@ __FBSDID("$FreeBSD$");
:  #define	DS1672_CTRL	4	/* control (1 byte) */
:  #define	DS1672_TRICKLE	5	/* trickle charger (1 byte) */
:  
: +#define	DS1672_CTRL_EOSC	(1 << 7)	/* Stop/start flag. */
: +
:  #define NANOSEC		1000000000
:  
: +#define	MAX_IIC_DATA_SIZE	4
: +
:  struct ds1672_softc {
:  	device_t		sc_dev;
:  };
: @@ -65,12 +69,64 @@ ds1672_probe(device_t dev)
:  }
:  
:  static int
: +ds1672_read(device_t dev, uint8_t addr, uint8_t *data, uint8_t size)
: +{
: +	struct iic_msg msgs[2] = {
: +	     { DS1672_ADDR, IIC_M_WR, 1, &addr },
: +	     { DS1672_ADDR, IIC_M_RD, size, data }
: +	};
: +
: +	return (iicbus_transfer(dev, msgs, 2));
: +}
: +
: +static int
: +ds1672_write(device_t dev, uint8_t addr, uint8_t *data, uint8_t size)
: +{
: +	uint8_t buffer[MAX_IIC_DATA_SIZE + 1];
: +	struct iic_msg msgs[1] = {
: +	     { DS1672_ADDR, IIC_M_WR, size + 1, buffer },
: +	};
: +	
: +	if (size > MAX_IIC_DATA_SIZE)
: +		return (ENOMEM);
: +	/* NB: register pointer precedes actual data */
: +	buffer[0] = addr;
: +	memcpy(buffer + 1, data, size);
: +	return (iicbus_transfer(dev, msgs, 1));
: +}
: +
: +static int
: +ds1672_init(device_t dev)
: +{
: +	uint8_t ctrl;
: +	int error;
: +
: +	error = ds1672_read(dev, DS1672_CTRL, &ctrl, 1);
: +	if (error)
: +		return (error);
: +
: +	/*
: +	 * Check if oscialltor is not runned.
: +	 */
: +	if (ctrl & DS1672_CTRL_EOSC) {
: +		device_printf(dev, "RTC oscillator was stopped. Check system"
: +		    " time and RTC battery.\n");
: +		ctrl &= ~DS1672_CTRL_EOSC;	/* Start oscillator. */
: +		error = ds1672_write(dev, DS1672_CTRL, &ctrl, 1);
: +	}
: +	return (error);
: +}
: +
: +static int
:  ds1672_attach(device_t dev)
:  {
:  	struct ds1672_softc *sc = device_get_softc(dev);
: +	int error;
:  
:  	sc->sc_dev = dev;
: -
: +	error = ds1672_init(dev);
: +	if (error)
: +		return (error);
:  	clock_register(dev, 1000);
:  	return (0);
:  }
: @@ -78,39 +134,30 @@ ds1672_attach(device_t dev)
:  static int
:  ds1672_gettime(device_t dev, struct timespec *ts)
:  {
: -	uint8_t addr[1] = { DS1672_COUNTER };
:  	uint8_t secs[4];
: -	struct iic_msg msgs[2] = {
: -	     { DS1672_ADDR, IIC_M_WR, 1, addr },
: -	     { DS1672_ADDR, IIC_M_RD, 4, secs },
: -	};
:  	int error;
:  
: -	error = iicbus_transfer(dev, msgs, 2);
: +	error = ds1672_read(dev, DS1672_COUNTER, secs, 4);
:  	if (error == 0) {
:  		/* counter has seconds since epoch */
:  		ts->tv_sec = (secs[3] << 24) | (secs[2] << 16)
:  			   | (secs[1] <<  8) | (secs[0] <<  0);
:  		ts->tv_nsec = NANOSEC / 2;
:  	}
: -	return error;
: +	return (error);
:  }
:  
:  static int
:  ds1672_settime(device_t dev, struct timespec *ts)
:  {
: -	/* NB: register pointer precedes actual data */
: -	uint8_t data[5] = { DS1672_COUNTER };
: -	struct iic_msg msgs[1] = {
: -	     { DS1672_ADDR, IIC_M_WR, 5, data },
: -	};
: +	uint8_t data[4];
:  
: -	data[1] = (ts->tv_sec >> 0) & 0xff;
: -	data[2] = (ts->tv_sec >> 8) & 0xff;
: -	data[3] = (ts->tv_sec >> 16) & 0xff;
: -	data[4] = (ts->tv_sec >> 24) & 0xff;
: +	data[0] = (ts->tv_sec >> 0) & 0xff;
: +	data[1] = (ts->tv_sec >> 8) & 0xff;
: +	data[2] = (ts->tv_sec >> 16) & 0xff;
: +	data[3] = (ts->tv_sec >> 24) & 0xff;
:  
: -	return iicbus_transfer(dev, msgs, 1);
: +	return (ds1672_write(dev, DS1672_COUNTER, data, 4));
:  }
:  
:  static device_method_t ds1672_methods[] = {
: @@ -124,7 +171,7 @@ static device_method_t ds1672_methods[] 
:  };
:  
:  static driver_t ds1672_driver = {
: -	"ds1672",
: +	"rtc",
:  	ds1672_methods,
:  	sizeof(struct ds1672_softc),
:  };
: 


More information about the svn-src-head mailing list