[kernel] r7888 - in dists/sid/linux-2.6/debian: . patches/bugfix patches/series

Martin Michlmayr tbm at alioth.debian.org
Sun Nov 26 16:45:54 UTC 2006


Author: tbm
Date: Sun Nov 26 17:45:53 2006
New Revision: 7888

Added:
   dists/sid/linux-2.6/debian/patches/bugfix/rtc-rs5c372.patch
Modified:
   dists/sid/linux-2.6/debian/changelog
   dists/sid/linux-2.6/debian/patches/series/7
Log:
rtc: Add patch from Riku Voipio to get RS5C372 going on the N2100.


Modified: dists/sid/linux-2.6/debian/changelog
==============================================================================
--- dists/sid/linux-2.6/debian/changelog	(original)
+++ dists/sid/linux-2.6/debian/changelog	Sun Nov 26 17:45:53 2006
@@ -7,6 +7,7 @@
   [ Martin Michlmayr ]
   * r8169: Add an option to ignore parity errors.
   * r8169: Ignore parity errors on the Thecus N2100.
+  * rtc: Add patch from Riku Voipio to get RS5C372 going on the N2100.
   * arm/iop32x: Build RS5C372 support into the kernel.
 
  -- Bastian Blank <waldi at debian.org>  Sun, 26 Nov 2006 10:39:33 +0100

Added: dists/sid/linux-2.6/debian/patches/bugfix/rtc-rs5c372.patch
==============================================================================
--- (empty file)
+++ dists/sid/linux-2.6/debian/patches/bugfix/rtc-rs5c372.patch	Sun Nov 26 17:45:53 2006
@@ -0,0 +1,224 @@
+diff --git a/drivers/rtc/rtc-rs5c372.c b/drivers/rtc/rtc-rs5c372.c
+index 7553d79..f3bca40 100644
+--- a/drivers/rtc/rtc-rs5c372.c
++++ b/drivers/rtc/rtc-rs5c372.c
+@@ -13,7 +13,7 @@
+ #include <linux/rtc.h>
+ #include <linux/bcd.h>
+ 
+-#define DRV_VERSION "0.2"
++#define DRV_VERSION "0.3"
+ 
+ /* Addresses to scan */
+ static unsigned short normal_i2c[] = { /* 0x32,*/ I2C_CLIENT_END };
+@@ -39,6 +39,14 @@ static int rs5c372_attach(struct i2c_ada
+ static int rs5c372_detach(struct i2c_client *client);
+ static int rs5c372_probe(struct i2c_adapter *adapter, int address, int kind);
+ 
++struct rs5c372 {
++	u8 reg_addr;
++	u8 regs[17];
++	struct i2c_msg msg[1];
++	struct i2c_client client;
++	struct rtc_device *rtc;
++};
++
+ static struct i2c_driver rs5c372_driver = {
+ 	.driver		= {
+ 		.name	= "rs5c372",
+@@ -49,22 +57,19 @@ static struct i2c_driver rs5c372_driver
+ 
+ static int rs5c372_get_datetime(struct i2c_client *client, struct rtc_time *tm)
+ {
+-	unsigned char buf[7] = { RS5C372_REG_BASE };
+ 
+-	/* this implements the 1st reading method, according
+-	 * to the datasheet. buf[0] is initialized with
+-	 * address ptr and transmission format register.
++	struct rs5c372 *rs5c372 = i2c_get_clientdata(client);
++	u8 *buf = &(rs5c372->regs[1]);
++
++	/* this implements the 3rd reading method, according
++	 * to the datasheet. rs5c372 defaults to internal
++	 * address 0xF, so 0x0 is in regs[1]
+ 	 */
+-	struct i2c_msg msgs[] = {
+-		{ client->addr, 0, 1, buf },
+-		{ client->addr, I2C_M_RD, 7, buf },
+-	};
+ 
+-	if ((i2c_transfer(client->adapter, msgs, 2)) != 2) {
++	if ((i2c_transfer(client->adapter, rs5c372->msg, 1)) != 1) {
+ 		dev_err(&client->dev, "%s: read error\n", __FUNCTION__);
+ 		return -EIO;
+ 	}
+-
+ 	tm->tm_sec = BCD2BIN(buf[RS5C372_REG_SECS] & 0x7f);
+ 	tm->tm_min = BCD2BIN(buf[RS5C372_REG_MINS] & 0x7f);
+ 	tm->tm_hour = BCD2BIN(buf[RS5C372_REG_HOURS] & 0x3f);
+@@ -91,7 +96,7 @@ static int rs5c372_set_datetime(struct i
+ 	unsigned char buf[8] = { RS5C372_REG_BASE };
+ 
+ 	dev_dbg(&client->dev,
+-		"%s: secs=%d, mins=%d, hours=%d ",
++		"%s: secs=%d, mins=%d, hours=%d "
+ 		"mday=%d, mon=%d, year=%d, wday=%d\n",
+ 		__FUNCTION__, tm->tm_sec, tm->tm_min, tm->tm_hour,
+ 		tm->tm_mday, tm->tm_mon, tm->tm_year, tm->tm_wday);
+@@ -114,25 +119,16 @@ static int rs5c372_set_datetime(struct i
+ 
+ static int rs5c372_get_trim(struct i2c_client *client, int *osc, int *trim)
+ {
+-	unsigned char buf = RS5C372_REG_TRIM;
+-
+-	struct i2c_msg msgs[] = {
+-		{ client->addr, 0, 1, &buf },
+-		{ client->addr, I2C_M_RD, 1, &buf },
+-	};
+-
+-	if ((i2c_transfer(client->adapter, msgs, 2)) != 2) {
+-		dev_err(&client->dev, "%s: read error\n", __FUNCTION__);
+-		return -EIO;
+-	}
++	struct rs5c372 *rs5c372 = i2c_get_clientdata(client);
++	u8 tmp = rs5c372->regs[RS5C372_REG_TRIM + 1];
+ 
+-	dev_dbg(&client->dev, "%s: raw trim=%x\n", __FUNCTION__, trim);
++	dev_dbg(&client->dev, "%s: raw trim=%x\n", __FUNCTION__, tmp);
+ 
+ 	if (osc)
+-		*osc = (buf & RS5C372_TRIM_XSL) ? 32000 : 32768;
++		*osc = (tmp & RS5C372_TRIM_XSL) ? 32000 : 32768;
+ 
+ 	if (trim)
+-		*trim = buf & RS5C372_TRIM_MASK;
++		*trim = tmp & RS5C372_TRIM_MASK;
+ 
+ 	return 0;
+ }
+@@ -160,14 +156,14 @@ static int rs5c372_rtc_proc(struct devic
+ 	return 0;
+ }
+ 
+-static struct rtc_class_ops rs5c372_rtc_ops = {
++static const struct rtc_class_ops rs5c372_rtc_ops = {
+ 	.proc		= rs5c372_rtc_proc,
+ 	.read_time	= rs5c372_rtc_read_time,
+ 	.set_time	= rs5c372_rtc_set_time,
+ };
+ 
+ static ssize_t rs5c372_sysfs_show_trim(struct device *dev,
+-				struct device_attribute *attr, char *buf)
++			       struct device_attribute *attr, char *buf)
+ {
+ 	int err, trim;
+ 
+@@ -180,7 +176,7 @@ static ssize_t rs5c372_sysfs_show_trim(s
+ static DEVICE_ATTR(trim, S_IRUGO, rs5c372_sysfs_show_trim, NULL);
+ 
+ static ssize_t rs5c372_sysfs_show_osc(struct device *dev,
+-				struct device_attribute *attr, char *buf)
++			      struct device_attribute *attr, char *buf)
+ {
+ 	int err, osc;
+ 
+@@ -199,9 +195,9 @@ static int rs5c372_attach(struct i2c_ada
+ 
+ static int rs5c372_probe(struct i2c_adapter *adapter, int address, int kind)
+ {
++	struct rs5c372 *rs5c372;
+ 	int err = 0;
+ 	struct i2c_client *client;
+-	struct rtc_device *rtc;
+ 
+ 	dev_dbg(&adapter->dev, "%s\n", __FUNCTION__);
+ 
+@@ -210,62 +206,68 @@ static int rs5c372_probe(struct i2c_adap
+ 		goto exit;
+ 	}
+ 
+-	if (!(client = kzalloc(sizeof(struct i2c_client), GFP_KERNEL))) {
++	if (!(rs5c372 = kzalloc(sizeof(struct rs5c372), GFP_KERNEL))) {
+ 		err = -ENOMEM;
+ 		goto exit;
+ 	}
++	client = &rs5c372->client;
+ 
+-	/* I2C client */
+ 	client->addr = address;
+-	client->driver = &rs5c372_driver;
+ 	client->adapter = adapter;
+-
++	client->driver = &rs5c372_driver;
+ 	strlcpy(client->name, rs5c372_driver.driver.name, I2C_NAME_SIZE);
+ 
++	i2c_set_clientdata(client, rs5c372);
++
++	rs5c372->msg[0].addr = address;
++	rs5c372->msg[0].flags = I2C_M_RD;
++	rs5c372->msg[0].len = sizeof(rs5c372->regs);
++	rs5c372->msg[0].buf = rs5c372->regs;
++
+ 	/* Inform the i2c layer */
+ 	if ((err = i2c_attach_client(client)))
+ 		goto exit_kfree;
+ 
+ 	dev_info(&client->dev, "chip found, driver version " DRV_VERSION "\n");
+ 
+-	rtc = rtc_device_register(rs5c372_driver.driver.name, &client->dev,
++	rs5c372->rtc =
++	    rtc_device_register(rs5c372_driver.driver.name, &client->dev,
+ 				&rs5c372_rtc_ops, THIS_MODULE);
+ 
+-	if (IS_ERR(rtc)) {
+-		err = PTR_ERR(rtc);
++	if (IS_ERR(rs5c372->rtc)) {
++		err = PTR_ERR(rs5c372->rtc);
+ 		goto exit_detach;
+ 	}
+ 
+-	i2c_set_clientdata(client, rtc);
+-
+-	device_create_file(&client->dev, &dev_attr_trim);
+-	device_create_file(&client->dev, &dev_attr_osc);
++	if ((err = device_create_file(&client->dev, &dev_attr_trim)))
++	    goto exit_detach;
++	if ((err = device_create_file(&client->dev, &dev_attr_osc)))
++	    goto exit_detach;
+ 
+ 	return 0;
+ 
+-exit_detach:
++      exit_detach:
+ 	i2c_detach_client(client);
+ 
+-exit_kfree:
+-	kfree(client);
++      exit_kfree:
++	kfree(rs5c372);
+ 
+-exit:
++      exit:
+ 	return err;
+ }
+ 
+ static int rs5c372_detach(struct i2c_client *client)
+ {
+ 	int err;
+-	struct rtc_device *rtc = i2c_get_clientdata(client);
++	struct rs5c372 *rs5c372 = i2c_get_clientdata(client);
+ 
+-	if (rtc)
+-		rtc_device_unregister(rtc);
++	if (rs5c372->rtc)
++		rtc_device_unregister(rs5c372->rtc);
+ 
+ 	if ((err = i2c_detach_client(client)))
+ 		return err;
+ 
+-	kfree(client);
+-
++	kfree(rs5c372);
+ 	return 0;
+ }
+ 

Modified: dists/sid/linux-2.6/debian/patches/series/7
==============================================================================
--- dists/sid/linux-2.6/debian/patches/series/7	(original)
+++ dists/sid/linux-2.6/debian/patches/series/7	Sun Nov 26 17:45:53 2006
@@ -1,2 +1,3 @@
 + bugfix/r8169-ignore-parity.patch
 + bugfix/arm/r8169-ignore-parity-n2100.patch
++ bugfix/rtc-rs5c372.patch



More information about the Kernel-svn-changes mailing list