diff options
Diffstat (limited to 'target/linux/ixp4xx/patches-2.6.25/010-rtc_isl1208_new_style.patch')
-rw-r--r-- | target/linux/ixp4xx/patches-2.6.25/010-rtc_isl1208_new_style.patch | 654 |
1 files changed, 654 insertions, 0 deletions
diff --git a/target/linux/ixp4xx/patches-2.6.25/010-rtc_isl1208_new_style.patch b/target/linux/ixp4xx/patches-2.6.25/010-rtc_isl1208_new_style.patch new file mode 100644 index 0000000..a99bebc --- /dev/null +++ b/target/linux/ixp4xx/patches-2.6.25/010-rtc_isl1208_new_style.patch @@ -0,0 +1,654 @@ +--- + drivers/rtc/rtc-isl1208.c | 357 +++++++++++++++++++++------------------------- + 1 file changed, 170 insertions(+), 187 deletions(-) + +Index: linux-2.6.25-rc6-armeb/drivers/rtc/rtc-isl1208.c +=================================================================== +--- linux-2.6.25-rc6-armeb.orig/drivers/rtc/rtc-isl1208.c 2008-03-20 10:26:41.000000000 +1030 ++++ linux-2.6.25-rc6-armeb/drivers/rtc/rtc-isl1208.c 2008-03-20 10:26:53.000000000 +1030 +@@ -15,16 +15,15 @@ + #include <linux/bcd.h> + #include <linux/rtc.h> + +-#define DRV_NAME "isl1208" +-#define DRV_VERSION "0.2" ++#define DRV_VERSION "0.3" + + /* Register map */ + /* rtc section */ + #define ISL1208_REG_SC 0x00 + #define ISL1208_REG_MN 0x01 + #define ISL1208_REG_HR 0x02 +-#define ISL1208_REG_HR_MIL (1<<7) /* 24h/12h mode */ +-#define ISL1208_REG_HR_PM (1<<5) /* PM/AM bit in 12h mode */ ++#define ISL1208_REG_HR_MIL (1<<7) /* 24h/12h mode */ ++#define ISL1208_REG_HR_PM (1<<5) /* PM/AM bit in 12h mode */ + #define ISL1208_REG_DT 0x03 + #define ISL1208_REG_MO 0x04 + #define ISL1208_REG_YR 0x05 +@@ -33,14 +32,14 @@ + + /* control/status section */ + #define ISL1208_REG_SR 0x07 +-#define ISL1208_REG_SR_ARST (1<<7) /* auto reset */ +-#define ISL1208_REG_SR_XTOSCB (1<<6) /* crystal oscillator */ +-#define ISL1208_REG_SR_WRTC (1<<4) /* write rtc */ +-#define ISL1208_REG_SR_ALM (1<<2) /* alarm */ +-#define ISL1208_REG_SR_BAT (1<<1) /* battery */ +-#define ISL1208_REG_SR_RTCF (1<<0) /* rtc fail */ ++#define ISL1208_REG_SR_ARST (1<<7) /* auto reset */ ++#define ISL1208_REG_SR_XTOSCB (1<<6) /* crystal oscillator */ ++#define ISL1208_REG_SR_WRTC (1<<4) /* write rtc */ ++#define ISL1208_REG_SR_ALM (1<<2) /* alarm */ ++#define ISL1208_REG_SR_BAT (1<<1) /* battery */ ++#define ISL1208_REG_SR_RTCF (1<<0) /* rtc fail */ + #define ISL1208_REG_INT 0x08 +-#define ISL1208_REG_09 0x09 /* reserved */ ++#define ISL1208_REG_09 0x09 /* reserved */ + #define ISL1208_REG_ATR 0x0a + #define ISL1208_REG_DTR 0x0b + +@@ -58,39 +57,21 @@ + #define ISL1208_REG_USR2 0x13 + #define ISL1208_USR_SECTION_LEN 2 + +-/* i2c configuration */ +-#define ISL1208_I2C_ADDR 0xde +- +-static const unsigned short normal_i2c[] = { +- ISL1208_I2C_ADDR>>1, I2C_CLIENT_END +-}; +-I2C_CLIENT_INSMOD; /* defines addr_data */ +- +-static int isl1208_attach_adapter(struct i2c_adapter *adapter); +-static int isl1208_detach_client(struct i2c_client *client); +- +-static struct i2c_driver isl1208_driver = { +- .driver = { +- .name = DRV_NAME, +- }, +- .id = I2C_DRIVERID_ISL1208, +- .attach_adapter = &isl1208_attach_adapter, +- .detach_client = &isl1208_detach_client, +-}; ++static struct i2c_driver isl1208_driver; + + /* block read */ + static int + isl1208_i2c_read_regs(struct i2c_client *client, u8 reg, u8 buf[], +- unsigned len) ++ unsigned len) + { + u8 reg_addr[1] = { reg }; + struct i2c_msg msgs[2] = { +- { client->addr, client->flags, sizeof(reg_addr), reg_addr }, +- { client->addr, client->flags | I2C_M_RD, len, buf } ++ {client->addr, client->flags, sizeof(reg_addr), reg_addr} ++ , ++ {client->addr, client->flags | I2C_M_RD, len, buf} + }; + int ret; + +- BUG_ON(len == 0); + BUG_ON(reg > ISL1208_REG_USR2); + BUG_ON(reg + len > ISL1208_REG_USR2 + 1); + +@@ -103,15 +84,14 @@ + /* block write */ + static int + isl1208_i2c_set_regs(struct i2c_client *client, u8 reg, u8 const buf[], +- unsigned len) ++ unsigned len) + { + u8 i2c_buf[ISL1208_REG_USR2 + 2]; + struct i2c_msg msgs[1] = { +- { client->addr, client->flags, len + 1, i2c_buf } ++ {client->addr, client->flags, len + 1, i2c_buf} + }; + int ret; + +- BUG_ON(len == 0); + BUG_ON(reg > ISL1208_REG_USR2); + BUG_ON(reg + len > ISL1208_REG_USR2 + 1); + +@@ -125,7 +105,8 @@ + } + + /* simple check to see wether we have a isl1208 */ +-static int isl1208_i2c_validate_client(struct i2c_client *client) ++static int ++isl1208_i2c_validate_client(struct i2c_client *client) + { + u8 regs[ISL1208_RTC_SECTION_LEN] = { 0, }; + u8 zero_mask[ISL1208_RTC_SECTION_LEN] = { +@@ -139,24 +120,29 @@ + return ret; + + for (i = 0; i < ISL1208_RTC_SECTION_LEN; ++i) { +- if (regs[i] & zero_mask[i]) /* check if bits are cleared */ ++ if (regs[i] & zero_mask[i]) /* check if bits are cleared */ + return -ENODEV; + } + + return 0; + } + +-static int isl1208_i2c_get_sr(struct i2c_client *client) ++static int ++isl1208_i2c_get_sr(struct i2c_client *client) + { +- return i2c_smbus_read_byte_data(client, ISL1208_REG_SR) == -1 ? -EIO:0; ++ int sr = i2c_smbus_read_byte_data(client, ISL1208_REG_SR); ++ if (sr < 0) ++ return -EIO; ++ ++ return sr; + } + +-static int isl1208_i2c_get_atr(struct i2c_client *client) ++static int ++isl1208_i2c_get_atr(struct i2c_client *client) + { + int atr = i2c_smbus_read_byte_data(client, ISL1208_REG_ATR); +- + if (atr < 0) +- return -EIO; ++ return atr; + + /* The 6bit value in the ATR register controls the load + * capacitance C_load * in steps of 0.25pF +@@ -169,51 +155,54 @@ + * + */ + +- atr &= 0x3f; /* mask out lsb */ +- atr ^= 1<<5; /* invert 6th bit */ +- atr += 2*9; /* add offset of 4.5pF; unit[atr] = 0.25pF */ ++ atr &= 0x3f; /* mask out lsb */ ++ atr ^= 1 << 5; /* invert 6th bit */ ++ atr += 2 * 9; /* add offset of 4.5pF; unit[atr] = 0.25pF */ + + return atr; + } + +-static int isl1208_i2c_get_dtr(struct i2c_client *client) ++static int ++isl1208_i2c_get_dtr(struct i2c_client *client) + { + int dtr = i2c_smbus_read_byte_data(client, ISL1208_REG_DTR); +- + if (dtr < 0) + return -EIO; + + /* dtr encodes adjustments of {-60,-40,-20,0,20,40,60} ppm */ +- dtr = ((dtr & 0x3) * 20) * (dtr & (1<<2) ? -1 : 1); ++ dtr = ((dtr & 0x3) * 20) * (dtr & (1 << 2) ? -1 : 1); + + return dtr; + } + +-static int isl1208_i2c_get_usr(struct i2c_client *client) ++static int ++isl1208_i2c_get_usr(struct i2c_client *client) + { + u8 buf[ISL1208_USR_SECTION_LEN] = { 0, }; + int ret; + +- ret = isl1208_i2c_read_regs (client, ISL1208_REG_USR1, buf, +- ISL1208_USR_SECTION_LEN); ++ ret = isl1208_i2c_read_regs(client, ISL1208_REG_USR1, buf, ++ ISL1208_USR_SECTION_LEN); + if (ret < 0) + return ret; + + return (buf[1] << 8) | buf[0]; + } + +-static int isl1208_i2c_set_usr(struct i2c_client *client, u16 usr) ++static int ++isl1208_i2c_set_usr(struct i2c_client *client, u16 usr) + { + u8 buf[ISL1208_USR_SECTION_LEN]; + + buf[0] = usr & 0xff; + buf[1] = (usr >> 8) & 0xff; + +- return isl1208_i2c_set_regs (client, ISL1208_REG_USR1, buf, +- ISL1208_USR_SECTION_LEN); ++ return isl1208_i2c_set_regs(client, ISL1208_REG_USR1, buf, ++ ISL1208_USR_SECTION_LEN); + } + +-static int isl1208_rtc_proc(struct device *dev, struct seq_file *seq) ++static int ++isl1208_rtc_proc(struct device *dev, struct seq_file *seq) + { + struct i2c_client *const client = to_i2c_client(dev); + int sr, dtr, atr, usr; +@@ -230,20 +219,19 @@ + (sr & ISL1208_REG_SR_ALM) ? " ALM" : "", + (sr & ISL1208_REG_SR_WRTC) ? " WRTC" : "", + (sr & ISL1208_REG_SR_XTOSCB) ? " XTOSCB" : "", +- (sr & ISL1208_REG_SR_ARST) ? " ARST" : "", +- sr); ++ (sr & ISL1208_REG_SR_ARST) ? " ARST" : "", sr); + + seq_printf(seq, "batt_status\t: %s\n", + (sr & ISL1208_REG_SR_RTCF) ? "bad" : "okay"); + + dtr = isl1208_i2c_get_dtr(client); +- if (dtr >= 0 -1) ++ if (dtr >= 0 - 1) + seq_printf(seq, "digital_trim\t: %d ppm\n", dtr); + + atr = isl1208_i2c_get_atr(client); + if (atr >= 0) + seq_printf(seq, "analog_trim\t: %d.%.2d pF\n", +- atr>>2, (atr&0x3)*25); ++ atr >> 2, (atr & 0x3) * 25); + + usr = isl1208_i2c_get_usr(client); + if (usr >= 0) +@@ -252,9 +240,8 @@ + return 0; + } + +- +-static int isl1208_i2c_read_time(struct i2c_client *client, +- struct rtc_time *tm) ++static int ++isl1208_i2c_read_time(struct i2c_client *client, struct rtc_time *tm) + { + int sr; + u8 regs[ISL1208_RTC_SECTION_LEN] = { 0, }; +@@ -274,27 +261,30 @@ + + tm->tm_sec = BCD2BIN(regs[ISL1208_REG_SC]); + tm->tm_min = BCD2BIN(regs[ISL1208_REG_MN]); +- { /* HR field has a more complex interpretation */ ++ ++ /* HR field has a more complex interpretation */ ++ { + const u8 _hr = regs[ISL1208_REG_HR]; +- if (_hr & ISL1208_REG_HR_MIL) /* 24h format */ ++ if (_hr & ISL1208_REG_HR_MIL) /* 24h format */ + tm->tm_hour = BCD2BIN(_hr & 0x3f); +- else { // 12h format ++ else { ++ /* 12h format */ + tm->tm_hour = BCD2BIN(_hr & 0x1f); +- if (_hr & ISL1208_REG_HR_PM) /* PM flag set */ ++ if (_hr & ISL1208_REG_HR_PM) /* PM flag set */ + tm->tm_hour += 12; + } + } + + tm->tm_mday = BCD2BIN(regs[ISL1208_REG_DT]); +- tm->tm_mon = BCD2BIN(regs[ISL1208_REG_MO]) - 1; /* rtc starts at 1 */ ++ tm->tm_mon = BCD2BIN(regs[ISL1208_REG_MO]) - 1; /* rtc starts at 1 */ + tm->tm_year = BCD2BIN(regs[ISL1208_REG_YR]) + 100; + tm->tm_wday = BCD2BIN(regs[ISL1208_REG_DW]); + + return 0; + } + +-static int isl1208_i2c_read_alarm(struct i2c_client *client, +- struct rtc_wkalrm *alarm) ++static int ++isl1208_i2c_read_alarm(struct i2c_client *client, struct rtc_wkalrm *alarm) + { + struct rtc_time *const tm = &alarm->time; + u8 regs[ISL1208_ALARM_SECTION_LEN] = { 0, }; +@@ -307,7 +297,7 @@ + } + + sr = isl1208_i2c_read_regs(client, ISL1208_REG_SCA, regs, +- ISL1208_ALARM_SECTION_LEN); ++ ISL1208_ALARM_SECTION_LEN); + if (sr < 0) { + dev_err(&client->dev, "%s: reading alarm section failed\n", + __func__); +@@ -315,23 +305,25 @@ + } + + /* MSB of each alarm register is an enable bit */ +- tm->tm_sec = BCD2BIN(regs[ISL1208_REG_SCA-ISL1208_REG_SCA] & 0x7f); +- tm->tm_min = BCD2BIN(regs[ISL1208_REG_MNA-ISL1208_REG_SCA] & 0x7f); +- tm->tm_hour = BCD2BIN(regs[ISL1208_REG_HRA-ISL1208_REG_SCA] & 0x3f); +- tm->tm_mday = BCD2BIN(regs[ISL1208_REG_DTA-ISL1208_REG_SCA] & 0x3f); +- tm->tm_mon = BCD2BIN(regs[ISL1208_REG_MOA-ISL1208_REG_SCA] & 0x1f)-1; +- tm->tm_wday = BCD2BIN(regs[ISL1208_REG_DWA-ISL1208_REG_SCA] & 0x03); ++ tm->tm_sec = BCD2BIN(regs[ISL1208_REG_SCA - ISL1208_REG_SCA] & 0x7f); ++ tm->tm_min = BCD2BIN(regs[ISL1208_REG_MNA - ISL1208_REG_SCA] & 0x7f); ++ tm->tm_hour = BCD2BIN(regs[ISL1208_REG_HRA - ISL1208_REG_SCA] & 0x3f); ++ tm->tm_mday = BCD2BIN(regs[ISL1208_REG_DTA - ISL1208_REG_SCA] & 0x3f); ++ tm->tm_mon = ++ BCD2BIN(regs[ISL1208_REG_MOA - ISL1208_REG_SCA] & 0x1f) - 1; ++ tm->tm_wday = BCD2BIN(regs[ISL1208_REG_DWA - ISL1208_REG_SCA] & 0x03); + + return 0; + } + +-static int isl1208_rtc_read_time(struct device *dev, struct rtc_time *tm) ++static int ++isl1208_rtc_read_time(struct device *dev, struct rtc_time *tm) + { + return isl1208_i2c_read_time(to_i2c_client(dev), tm); + } + +-static int isl1208_i2c_set_time(struct i2c_client *client, +- struct rtc_time const *tm) ++static int ++isl1208_i2c_set_time(struct i2c_client *client, struct rtc_time const *tm) + { + int sr; + u8 regs[ISL1208_RTC_SECTION_LEN] = { 0, }; +@@ -353,7 +345,7 @@ + } + + /* set WRTC */ +- sr = i2c_smbus_write_byte_data (client, ISL1208_REG_SR, ++ sr = i2c_smbus_write_byte_data(client, ISL1208_REG_SR, + sr | ISL1208_REG_SR_WRTC); + if (sr < 0) { + dev_err(&client->dev, "%s: writing SR failed\n", __func__); +@@ -369,7 +361,7 @@ + } + + /* clear WRTC again */ +- sr = i2c_smbus_write_byte_data (client, ISL1208_REG_SR, ++ sr = i2c_smbus_write_byte_data(client, ISL1208_REG_SR, + sr & ~ISL1208_REG_SR_WRTC); + if (sr < 0) { + dev_err(&client->dev, "%s: writing SR failed\n", __func__); +@@ -380,70 +372,69 @@ + } + + +-static int isl1208_rtc_set_time(struct device *dev, struct rtc_time *tm) ++static int ++isl1208_rtc_set_time(struct device *dev, struct rtc_time *tm) + { + return isl1208_i2c_set_time(to_i2c_client(dev), tm); + } + +-static int isl1208_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alarm) ++static int ++isl1208_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alarm) + { + return isl1208_i2c_read_alarm(to_i2c_client(dev), alarm); + } + + static const struct rtc_class_ops isl1208_rtc_ops = { +- .proc = isl1208_rtc_proc, +- .read_time = isl1208_rtc_read_time, +- .set_time = isl1208_rtc_set_time, +- .read_alarm = isl1208_rtc_read_alarm, +- //.set_alarm = isl1208_rtc_set_alarm, ++ .proc = isl1208_rtc_proc, ++ .read_time = isl1208_rtc_read_time, ++ .set_time = isl1208_rtc_set_time, ++ .read_alarm = isl1208_rtc_read_alarm, ++ /*.set_alarm = isl1208_rtc_set_alarm, */ + }; + + /* sysfs interface */ + +-static ssize_t isl1208_sysfs_show_atrim(struct device *dev, +- struct device_attribute *attr, +- char *buf) ++static ssize_t ++isl1208_sysfs_show_atrim(struct device *dev, ++ struct device_attribute *attr, char *buf) + { +- int atr; +- +- atr = isl1208_i2c_get_atr(to_i2c_client(dev)); ++ int atr = isl1208_i2c_get_atr(to_i2c_client(dev)); + if (atr < 0) + return atr; + +- return sprintf(buf, "%d.%.2d pF\n", atr>>2, (atr&0x3)*25); ++ return sprintf(buf, "%d.%.2d pF\n", atr >> 2, (atr & 0x3) * 25); + } ++ + static DEVICE_ATTR(atrim, S_IRUGO, isl1208_sysfs_show_atrim, NULL); + +-static ssize_t isl1208_sysfs_show_dtrim(struct device *dev, +- struct device_attribute *attr, +- char *buf) ++static ssize_t ++isl1208_sysfs_show_dtrim(struct device *dev, ++ struct device_attribute *attr, char *buf) + { +- int dtr; +- +- dtr = isl1208_i2c_get_dtr(to_i2c_client(dev)); ++ int dtr = isl1208_i2c_get_dtr(to_i2c_client(dev)); + if (dtr < 0) + return dtr; + + return sprintf(buf, "%d ppm\n", dtr); + } ++ + static DEVICE_ATTR(dtrim, S_IRUGO, isl1208_sysfs_show_dtrim, NULL); + +-static ssize_t isl1208_sysfs_show_usr(struct device *dev, +- struct device_attribute *attr, +- char *buf) ++static ssize_t ++isl1208_sysfs_show_usr(struct device *dev, ++ struct device_attribute *attr, char *buf) + { +- int usr; +- +- usr = isl1208_i2c_get_usr(to_i2c_client(dev)); ++ int usr = isl1208_i2c_get_usr(to_i2c_client(dev)); + if (usr < 0) + return usr; + + return sprintf(buf, "0x%.4x\n", usr); + } + +-static ssize_t isl1208_sysfs_store_usr(struct device *dev, +- struct device_attribute *attr, +- const char *buf, size_t count) ++static ssize_t ++isl1208_sysfs_store_usr(struct device *dev, ++ struct device_attribute *attr, ++ const char *buf, size_t count) + { + int usr = -1; + +@@ -460,124 +451,116 @@ + + return isl1208_i2c_set_usr(to_i2c_client(dev), usr) ? -EIO : count; + } ++ + static DEVICE_ATTR(usr, S_IRUGO | S_IWUSR, isl1208_sysfs_show_usr, + isl1208_sysfs_store_usr); + + static int +-isl1208_probe(struct i2c_adapter *adapter, int addr, int kind) ++isl1208_sysfs_register(struct device *dev) + { +- int rc = 0; +- struct i2c_client *new_client = NULL; +- struct rtc_device *rtc = NULL; ++ int err; ++ ++ err = device_create_file(dev, &dev_attr_atrim); ++ if (err) ++ return err; + +- if (!i2c_check_functionality(adapter, I2C_FUNC_I2C)) { +- rc = -ENODEV; +- goto failout; ++ err = device_create_file(dev, &dev_attr_dtrim); ++ if (err) { ++ device_remove_file(dev, &dev_attr_atrim); ++ return err; + } + +- new_client = kzalloc(sizeof(struct i2c_client), GFP_KERNEL); +- if (new_client == NULL) { +- rc = -ENOMEM; +- goto failout; ++ err = device_create_file(dev, &dev_attr_usr); ++ if (err) { ++ device_remove_file(dev, &dev_attr_atrim); ++ device_remove_file(dev, &dev_attr_dtrim); + } + +- new_client->addr = addr; +- new_client->adapter = adapter; +- new_client->driver = &isl1208_driver; +- new_client->flags = 0; +- strcpy(new_client->name, DRV_NAME); ++ return 0; ++} + +- if (kind < 0) { +- rc = isl1208_i2c_validate_client(new_client); +- if (rc < 0) +- goto failout; +- } ++static int ++isl1208_sysfs_unregister(struct device *dev) ++{ ++ device_remove_file(dev, &dev_attr_atrim); ++ device_remove_file(dev, &dev_attr_atrim); ++ device_remove_file(dev, &dev_attr_usr); ++ ++ return 0; ++} ++ ++static int ++isl1208_probe(struct i2c_client *client) ++{ ++ int rc = 0; ++ struct rtc_device *rtc; + +- rc = i2c_attach_client(new_client); +- if (rc < 0) +- goto failout; ++ if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) ++ return -ENODEV; + +- dev_info(&new_client->dev, ++ if (isl1208_i2c_validate_client(client) < 0) ++ return -ENODEV; ++ ++ dev_info(&client->dev, + "chip found, driver version " DRV_VERSION "\n"); + + rtc = rtc_device_register(isl1208_driver.driver.name, +- &new_client->dev, +- &isl1208_rtc_ops, THIS_MODULE); +- +- if (IS_ERR(rtc)) { +- rc = PTR_ERR(rtc); +- goto failout_detach; +- } ++ &client->dev, &isl1208_rtc_ops, ++ THIS_MODULE); ++ if (IS_ERR(rtc)) ++ return PTR_ERR(rtc); + +- i2c_set_clientdata(new_client, rtc); ++ i2c_set_clientdata(client, rtc); + +- rc = isl1208_i2c_get_sr(new_client); ++ rc = isl1208_i2c_get_sr(client); + if (rc < 0) { +- dev_err(&new_client->dev, "reading status failed\n"); +- goto failout_unregister; ++ dev_err(&client->dev, "reading status failed\n"); ++ goto exit_unregister; + } + + if (rc & ISL1208_REG_SR_RTCF) +- dev_warn(&new_client->dev, "rtc power failure detected, " ++ dev_warn(&client->dev, "rtc power failure detected, " + "please set clock.\n"); + +- rc = device_create_file(&new_client->dev, &dev_attr_atrim); +- if (rc < 0) +- goto failout_unregister; +- rc = device_create_file(&new_client->dev, &dev_attr_dtrim); +- if (rc < 0) +- goto failout_atrim; +- rc = device_create_file(&new_client->dev, &dev_attr_usr); +- if (rc < 0) +- goto failout_dtrim; ++ rc = isl1208_sysfs_register(&client->dev); ++ if (rc) ++ goto exit_unregister; + + return 0; + +- failout_dtrim: +- device_remove_file(&new_client->dev, &dev_attr_dtrim); +- failout_atrim: +- device_remove_file(&new_client->dev, &dev_attr_atrim); +- failout_unregister: ++ exit_unregister: + rtc_device_unregister(rtc); +- failout_detach: +- i2c_detach_client(new_client); +- failout: +- kfree(new_client); +- return rc; +-} + +-static int +-isl1208_attach_adapter (struct i2c_adapter *adapter) +-{ +- return i2c_probe(adapter, &addr_data, isl1208_probe); ++ return rc; + } + + static int +-isl1208_detach_client(struct i2c_client *client) ++isl1208_remove(struct i2c_client *client) + { +- int rc; +- struct rtc_device *const rtc = i2c_get_clientdata(client); +- +- if (rtc) +- rtc_device_unregister(rtc); /* do we need to kfree? */ +- +- rc = i2c_detach_client(client); +- if (rc) +- return rc; ++ struct rtc_device *rtc = i2c_get_clientdata(client); + +- kfree(client); ++ isl1208_sysfs_unregister(&client->dev); ++ rtc_device_unregister(rtc); + + return 0; + } + +-/* module management */ ++static struct i2c_driver isl1208_driver = { ++ .driver = { ++ .name = "rtc-isl1208", ++ }, ++ .probe = isl1208_probe, ++ .remove = isl1208_remove, ++}; + +-static int __init isl1208_init(void) ++static int __init ++isl1208_init(void) + { + return i2c_add_driver(&isl1208_driver); + } + +-static void __exit isl1208_exit(void) ++static void __exit ++isl1208_exit(void) + { + i2c_del_driver(&isl1208_driver); + } |