From: frederic RODO <f.rodo@til-technologies.fr>
To: linux-kernel@vger.kernel.org
Subject: [PATCH] rtc-ds1307 : add sysfs support for trickle charger
Date: Wed, 16 Jan 2008 17:26:43 +0100 [thread overview]
Message-ID: <478E3043.2070709@til-technologies.fr> (raw)
this patch add two callbacks (show and store) to support the trickle
charger for ds_1339 and ds_1340 (it can also be used for the ds1388).
I'm not sure if it'is the right way for adding this support. Can someone
explain me a better way?
It was test on a custom board with a ds_1340. The ds_1339 support was
not tested.
If you have any comments, please CC me
log from test
Linux version 2.6.24-rc7 (fredo@srv-devhard) (gcc version 3.4.6) #14 Wed
Jan 16 15:40:55 CET 2008
..........
i2c /dev entries driver
rtc-ds1307 0-0068: rtc core: registered ds1340 as rtc0
rtc-ds1307 0-0068: trickle charger
i2c-gpio i2c-gpio: using pins 55 (SDA) and 56 (SCL)
....
# cd /sys/class/rtc/rtc0/device/
# cat trickle
0xaa (trickle charger enabled)
# echo 0 > trickle
# cat trickle
0x00 (trickle charger disabled)
Signed-off-by: Frederic RODO <f.rodo@til-technologies.fr>
diff --git a/drivers/rtc/rtc-ds1307.c b/drivers/rtc/rtc-ds1307.c
index 3a86898..4564238 100644
--- a/drivers/rtc/rtc-ds1307.c
+++ b/drivers/rtc/rtc-ds1307.c
@@ -77,6 +77,7 @@ enum ds_type {
# define DS1340_BIT_FT 0x40
# define DS1340_BIT_CALIB_SIGN 0x20
# define DS1340_M_CALIBRATION 0x1f
+#define DS1340_REG_TRICKLE 0x08
#define DS1340_REG_FLAG 0x09
# define DS1340_BIT_OSF 0x80
#define DS1337_REG_STATUS 0x0f
@@ -90,6 +91,7 @@ enum ds_type {
struct ds1307 {
u8 reg_addr;
bool has_nvram;
+ bool has_trickle;
u8 regs[8];
enum ds_type type;
struct i2c_msg msg[2];
@@ -102,6 +104,7 @@ struct chip_desc {
char name[9];
unsigned nvram56:1;
unsigned alarm:1;
+ unsigned trickle:1;
enum ds_type type;
};
@@ -121,9 +124,11 @@ static const struct chip_desc chips[] = { {
.name = "ds1339",
.type = ds_1339,
.alarm = 1,
+ .trickle = 1,
}, {
.name = "ds1340",
.type = ds_1340,
+ .trickle = 1,
}, {
.name = "m41t00",
.type = m41t00,
@@ -322,6 +327,72 @@ static struct bin_attribute nvram = {
.size = NVRAM_SIZE,
};
+static ssize_t ds1307_sysfs_show_trickle(struct device *dev,
+ struct device_attribute *attr,
+ char *buf)
+{
+ struct ds1307 *ds1307 = dev_get_drvdata(dev);
+ struct i2c_client *client = to_i2c_client(dev);
+ int trickle;
+
+ switch (ds1307->type) {
+ case ds_1339:
+ trickle = i2c_smbus_read_byte_data(client, DS1339_REG_TRICKLE);
+ break;
+ case ds_1340:
+ trickle = i2c_smbus_read_byte_data(client, DS1340_REG_TRICKLE);
+ break;
+ default: return -EIO;
+ }
+
+ if (trickle < 0)
+ return trickle;
+
+ return sprintf(buf, "0x%02x (trickle charger %s)\n", (u8) trickle,
+ (((trickle & 0xf0) != 0xa0) ||
+ ((trickle & 0x0c) == 0x0c) ||
+ ((trickle & 0x0c) == 0) ||
+ ((trickle & 0x03) == 0))
+ ? "disabled" : "enabled");
+}
+
+static ssize_t ds1307_sysfs_store_trickle(struct device *dev,
+ struct device_attribute *attr,
+ const char *buf, size_t count)
+{
+ struct ds1307 *ds1307 = dev_get_drvdata(dev);
+ struct i2c_client *client = to_i2c_client(dev);
+ int err;
+ int trickle = -1;
+
+ if (buf[0] == '0' && (buf[1] == 'x' || buf[1] == 'X')) {
+ if (sscanf(buf, "%x", &trickle) != 1)
+ return -EINVAL;
+ } else {
+ if (sscanf(buf, "%d", &trickle) != 1)
+ return -EINVAL;
+ }
+
+ if (trickle < 0 || trickle > 0xff)
+ return -EINVAL;
+
+ switch (ds1307->type) {
+ case ds_1339:
+ err = i2c_smbus_write_byte_data(client, DS1339_REG_TRICKLE,
+ trickle);
+ break;
+ case ds_1340:
+ err = i2c_smbus_write_byte_data(client, DS1340_REG_TRICKLE,
+ trickle);
+ break;
+ default: return -EIO;
+ }
+
+ return (err < 0) ? -EIO : 1;
+}
+static DEVICE_ATTR(trickle, S_IRUGO | S_IWUSR, ds1307_sysfs_show_trickle,
+ ds1307_sysfs_store_trickle);
+
/*----------------------------------------------------------------------*/
static struct i2c_driver ds1307_driver;
@@ -526,6 +597,14 @@ read_rtc:
}
}
+ if (chip->trickle) {
+ err = device_create_file(&client->dev, &dev_attr_trickle);
+ if (err == 0) {
+ ds1307->has_trickle = true;
+ dev_info(&client->dev, "trickle charger\n");
+ }
+ }
+
return 0;
exit_bad:
@@ -548,6 +627,9 @@ static int __devexit ds1307_remove(struct i2c_client
*client)
if (ds1307->has_nvram)
sysfs_remove_bin_file(&client->dev.kobj, &nvram);
+ if (ds1307->has_trickle)
+ device_remove_file(&client->dev, &dev_attr_trickle);
+
rtc_device_unregister(ds1307->rtc);
kfree(ds1307);
return 0;
-------------------------------------------------------------------------
Les informations précédentes peuvent être confidentielles ou privilégiées.
Si vous n'êtes pas le destinataire prévu de ce mail, veuillez en notifier
l'expéditeur en répondant à ce message puis supprimez-en toute trace
de vos systèmes.
TIL Technologies
Parc du Golf, Bat 43
350 rue J.R Guilibert Gautier de la Lauzière
13856 AIX EN PROVENCE
Tel. : +33 4 42 37 11 77
-------------------------------------------------------------------------
reply other threads:[~2008-01-16 16:28 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=478E3043.2070709@til-technologies.fr \
--to=f.rodo@til-technologies.fr \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.