Hi Sebastien,
On Fri, 10 Oct 2008 15:46:11 +0200, BARRE Sebastien wrote:
> Thanks for your advices.
> Fixed patch is in attachement to avoid tabs replacement.
> Other comments are welcome.
Note: you need to include a comment describing what your patch does, as
well as your Signed-off-by line. Here's a second review from me. After
that it will be up to Alessandro and the RTC folks.
> --- a/drivers/rtc/rtc-ds1307.c 2008-09-08 19:40:20.000000000 +0200
> +++ b/drivers/rtc/rtc-ds1307.c 2008-10-10 16:30:59.000000000 +0200
> @@ -17,8 +17,6 @@
> #include <linux/rtc.h>
> #include <linux/bcd.h>
>
> -
> -
Unrelated white space change, please revert.
> /* We can't determine type by probing, but if we expect pre-Linux code
> * to have set the chip up as a clock (turning on the oscillator and
> * setting the date and time), Linux can ignore the non-clock features.
> @@ -38,7 +36,6 @@ enum ds_type {
> // rs5c372 too? different address...
> };
>
> -
Unrelated white space change, please revert.
> /* RTC registers don't differ much, except for the century flag */
> #define DS1307_REG_SECS 0x00 /* 00-59 */
> # define DS1307_BIT_CH 0x80
> @@ -85,14 +82,11 @@ enum ds_type {
> # define DS1337_BIT_A1I 0x01
> #define DS1339_REG_TRICKLE 0x10
>
> -
> -
Unrelated white space change, please revert.
> struct ds1307 {
> u8 reg_addr;
reg_addr is unused after your changes, so you should remove it as well.
> bool has_nvram;
> u8 regs[8];
> enum ds_type type;
> - struct i2c_msg msg[2];
> struct i2c_client *client;
> struct i2c_client dev;
> struct rtc_device *rtc;
> @@ -138,12 +132,9 @@ static int ds1307_get_time(struct device
> int tmp;
>
> /* read the RTC date and time registers all at once */
> - ds1307->msg[1].flags = I2C_M_RD;
> - ds1307->msg[1].len = 7;
> -
> - tmp = i2c_transfer(to_i2c_adapter(ds1307->client->dev.parent),
> - ds1307->msg, 2);
> - if (tmp != 2) {
> + tmp = i2c_smbus_read_i2c_block_data(ds1307->client,
> + DS1307_REG_SECS, 7, ds1307->regs);
> + if (tmp != 7) {
> dev_err(dev, "%s error %d\n", "read", tmp);
> return -EIO;
> }
> @@ -181,8 +172,6 @@ static int ds1307_set_time(struct device
> {
> struct ds1307 *ds1307 = dev_get_drvdata(dev);
> int result;
> - int tmp;
> - u8 *buf = ds1307->regs;
>
> dev_dbg(dev, "%s secs=%d, mins=%d, "
> "hours=%d, mday=%d, mon=%d, year=%d, wday=%d\n",
> @@ -190,44 +179,41 @@ static int ds1307_set_time(struct device
> t->tm_hour, t->tm_mday,
> t->tm_mon, t->tm_year, t->tm_wday);
>
> - *buf++ = 0; /* first register addr */
> - buf[DS1307_REG_SECS] = BIN2BCD(t->tm_sec);
> - buf[DS1307_REG_MIN] = BIN2BCD(t->tm_min);
> - buf[DS1307_REG_HOUR] = BIN2BCD(t->tm_hour);
> - buf[DS1307_REG_WDAY] = BIN2BCD(t->tm_wday + 1);
> - buf[DS1307_REG_MDAY] = BIN2BCD(t->tm_mday);
> - buf[DS1307_REG_MONTH] = BIN2BCD(t->tm_mon + 1);
> + ds1307->regs[DS1307_REG_SECS] = BIN2BCD(t->tm_sec);
> + ds1307->regs[DS1307_REG_MIN] = BIN2BCD(t->tm_min);
> + ds1307->regs[DS1307_REG_HOUR] = BIN2BCD(t->tm_hour);
> + ds1307->regs[DS1307_REG_WDAY] = BIN2BCD(t->tm_wday + 1);
> + ds1307->regs[DS1307_REG_MDAY] = BIN2BCD(t->tm_mday);
> + ds1307->regs[DS1307_REG_MONTH] = BIN2BCD(t->tm_mon + 1);
This change makes the patch larger (and thus harder to review) with
almost no benefit. Same for many changes below... Why don't you keep
the buf pointer? Please keep in mind that your patch should do just one
thing and do it well.
>
> /* assume 20YY not 19YY */
> - tmp = t->tm_year - 100;
> - buf[DS1307_REG_YEAR] = BIN2BCD(tmp);
> + ds1307->regs[DS1307_REG_YEAR] = BIN2BCD(t->tm_year - 100);
>
> switch (ds1307->type) {
> case ds_1337:
> case ds_1339:
> - buf[DS1307_REG_MONTH] |= DS1337_BIT_CENTURY;
> + ds1307->regs[DS1307_REG_MONTH] |= DS1337_BIT_CENTURY;
> break;
> case ds_1340:
> - buf[DS1307_REG_HOUR] |= DS1340_BIT_CENTURY_EN
> - | DS1340_BIT_CENTURY;
> + ds1307->regs[DS1307_REG_HOUR] |= DS1340_BIT_CENTURY_EN
> + | DS1340_BIT_CENTURY;
> break;
> default:
> break;
> }
>
> - ds1307->msg[1].flags = 0;
> - ds1307->msg[1].len = 8;
> -
> dev_dbg(dev, "%s: %02x %02x %02x %02x %02x %02x %02x\n",
> - "write", buf[0], buf[1], buf[2], buf[3],
> - buf[4], buf[5], buf[6]);
> -
> - result = i2c_transfer(to_i2c_adapter(ds1307->client->dev.parent),
> - &ds1307->msg[1], 1);
> - if (result != 1) {
> - dev_err(dev, "%s error %d\n", "write", tmp);
> - return -EIO;
> + "write", ds1307->regs[0], ds1307->regs[1],
> + ds1307->regs[2], ds1307->regs[3],
> + ds1307->regs[4], ds1307->regs[5], ds1307->regs[6]);
> +
> + result = i2c_smbus_write_i2c_block_data(ds1307->client,
> + 0, 7, ds1307->regs);
> + if (result < 0) {
> + dev_err(dev, "%s error %d\n", "write", result);
> + return result;
> }
> +
> return 0;
> }
>
> @@ -246,7 +232,6 @@ ds1307_nvram_read(struct kobject *kobj,
> {
> struct i2c_client *client;
> struct ds1307 *ds1307;
> - struct i2c_msg msg[2];
> int result;
>
> client = kobj_to_i2c_client(kobj);
> @@ -259,24 +244,13 @@ ds1307_nvram_read(struct kobject *kobj,
> if (unlikely(!count))
> return count;
>
> - msg[0].addr = client->addr;
> - msg[0].flags = 0;
> - msg[0].len = 1;
> - msg[0].buf = buf;
> -
> - buf[0] = 8 + off;
> -
> - msg[1].addr = client->addr;
> - msg[1].flags = I2C_M_RD;
> - msg[1].len = count;
> - msg[1].buf = buf;
> -
> - result = i2c_transfer(to_i2c_adapter(client->dev.parent), msg, 2);
> - if (result != 2) {
> - dev_err(&client->dev, "%s error %d\n", "nvram read", result);
> - return -EIO;
> + result = i2c_smbus_read_i2c_block_data(client, 8 + off, count, buf);
> + if (result < 0) {
> + dev_err(&client->dev, "%s error %d\n", "read", result);
Why did you change this error message for a less specific one?
> + return result;
> }
> - return count;
> +
> + return result;
> }
Note that "return result" can be factored out.
>
> static ssize_t
> @@ -284,8 +258,7 @@ ds1307_nvram_write(struct kobject *kobj,
> char *buf, loff_t off, size_t count)
> {
> struct i2c_client *client;
> - u8 buffer[NVRAM_SIZE + 1];
> - int ret;
> + int result;
>
> client = kobj_to_i2c_client(kobj);
>
> @@ -296,11 +269,12 @@ ds1307_nvram_write(struct kobject *kobj,
> if (unlikely(!count))
> return count;
>
> - buffer[0] = 8 + off;
> - memcpy(buffer + 1, buf, count);
> -
> - ret = i2c_master_send(client, buffer, count + 1);
> - return (ret < 0) ? ret : (ret - 1);
> + result = i2c_smbus_write_i2c_block_data(client, 8 + off, count, buf);
> + if (result < 0) {
> + dev_err(&client->dev, "%s error %d\n", "write", result);
I'd use "nvram write" in the error message.
> + return result;
> + }
> + return count;
> }
>
> static struct bin_attribute nvram = {
> @@ -325,11 +299,14 @@ static int __devinit ds1307_probe(struct
> struct ds1307 *ds1307;
> int err = -ENODEV;
> int tmp;
> + u8 *buf;
> +
> const struct chip_desc *chip = &chips[id->driver_data];
> struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent);
>
> if (!i2c_check_functionality(adapter,
> - I2C_FUNC_I2C | I2C_FUNC_SMBUS_WRITE_BYTE_DATA))
> + I2C_FUNC_SMBUS_WRITE_BYTE_DATA |
> + I2C_FUNC_SMBUS_I2C_BLOCK))
> return -EIO;
>
> if (!(ds1307 = kzalloc(sizeof(struct ds1307), GFP_KERNEL)))
> @@ -338,35 +315,21 @@ static int __devinit ds1307_probe(struct
> ds1307->client = client;
> i2c_set_clientdata(client, ds1307);
>
> - ds1307->msg[0].addr = client->addr;
> - ds1307->msg[0].flags = 0;
> - ds1307->msg[0].len = 1;
> - ds1307->msg[0].buf = &ds1307->reg_addr;
> -
> - ds1307->msg[1].addr = client->addr;
> - ds1307->msg[1].flags = I2C_M_RD;
> - ds1307->msg[1].len = sizeof(ds1307->regs);
> - ds1307->msg[1].buf = ds1307->regs;
> -
> ds1307->type = id->driver_data;
>
> switch (ds1307->type) {
> case ds_1337:
> case ds_1339:
> - ds1307->reg_addr = DS1337_REG_CONTROL;
> - ds1307->msg[1].len = 2;
> -
> + buf = &ds1307->regs[DS1337_REG_CONTROL];
> /* get registers that the "rtc" read below won't read... */
> - tmp = i2c_transfer(adapter, ds1307->msg, 2);
> + tmp = i2c_smbus_read_i2c_block_data(ds1307->client,
> + DS1337_REG_CONTROL, 2, buf);
> if (tmp != 2) {
> pr_debug("read error %d\n", tmp);
> err = -EIO;
> goto exit_free;
> }
>
> - ds1307->reg_addr = 0;
> - ds1307->msg[1].len = sizeof(ds1307->regs);
> -
> /* oscillator off? turn it on, so clock can tick. */
> if (ds1307->regs[0] & DS1337_BIT_nEOSC)
> i2c_smbus_write_byte_data(client, DS1337_REG_CONTROL,
> @@ -385,9 +348,9 @@ static int __devinit ds1307_probe(struct
>
> read_rtc:
> /* read RTC registers */
> -
> - tmp = i2c_transfer(adapter, ds1307->msg, 2);
> - if (tmp != 2) {
> + buf = ds1307->regs;
> + tmp = i2c_smbus_read_i2c_block_data(ds1307->client, 0, 8, buf);
> + if (tmp != 8) {
> pr_debug("read error %d\n", tmp);
> err = -EIO;
> goto exit_free;
> @@ -430,7 +393,7 @@ read_rtc:
> tmp = i2c_smbus_read_byte_data(client, DS1340_REG_FLAG);
> if (tmp < 0) {
> pr_debug("read error %d\n", tmp);
> - err = -EIO;
> + err = tmp;
> goto exit_free;
> }
>
>
--
Jean Delvare
_______________________________________________
i2c mailing list
[email protected]
http://lists.lm-sensors.org/mailman/listinfo/i2c