2009-04-28 08:55:35

by Daniel Mack

[permalink] [raw]
Subject: [PATCH 1/3] w1: ds2760_battery: cleanups in ds2760_battery_probe()

Removed struct ds2760_platform_data which wasn't defined anywhere.
Indentation cleanups.

Cc: Szabolcs Gyurko <[email protected]>
Cc: Matt Reimer <[email protected]>
Cc: Anton Vorontsov <[email protected]>
Signed-off-by: Daniel Mack <[email protected]>
---
drivers/power/ds2760_battery.c | 16 +++++++---------
1 files changed, 7 insertions(+), 9 deletions(-)

diff --git a/drivers/power/ds2760_battery.c b/drivers/power/ds2760_battery.c
index a52d4a1..9331009 100644
--- a/drivers/power/ds2760_battery.c
+++ b/drivers/power/ds2760_battery.c
@@ -344,7 +344,6 @@ static int ds2760_battery_probe(struct platform_device *pdev)
{
int retval = 0;
struct ds2760_device_info *di;
- struct ds2760_platform_data *pdata;

di = kzalloc(sizeof(*di), GFP_KERNEL);
if (!di) {
@@ -354,14 +353,13 @@ static int ds2760_battery_probe(struct platform_device *pdev)

platform_set_drvdata(pdev, di);

- pdata = pdev->dev.platform_data;
- di->dev = &pdev->dev;
- di->w1_dev = pdev->dev.parent;
- di->bat.name = dev_name(&pdev->dev);
- di->bat.type = POWER_SUPPLY_TYPE_BATTERY;
- di->bat.properties = ds2760_battery_props;
- di->bat.num_properties = ARRAY_SIZE(ds2760_battery_props);
- di->bat.get_property = ds2760_battery_get_property;
+ di->dev = &pdev->dev;
+ di->w1_dev = pdev->dev.parent;
+ di->bat.name = dev_name(&pdev->dev);
+ di->bat.type = POWER_SUPPLY_TYPE_BATTERY;
+ di->bat.properties = ds2760_battery_props;
+ di->bat.num_properties = ARRAY_SIZE(ds2760_battery_props);
+ di->bat.get_property = ds2760_battery_get_property;
di->bat.external_power_changed =
ds2760_battery_external_power_changed;

--
1.6.2.1


2009-04-28 08:56:19

by Daniel Mack

[permalink] [raw]
Subject: [PATCH 3/3] w1: ds2760_battery: add support for sleep mode feature

This adds support for ds2760's sleep mode feature. With this feature
enabled, the chip enters a deep sleep mode and disconnects from the
battery when the w1 line is held down for more than 2 seconds.

This new behaviour can be switched on and off using a new module
parameter.

Cc: Szabolcs Gyurko <[email protected]>
Cc: Matt Reimer <[email protected]>
Cc: Anton Vorontsov <[email protected]>
Signed-off-by: Daniel Mack <[email protected]>
---
drivers/power/ds2760_battery.c | 26 ++++++++++++++++++++++++++
drivers/w1/slaves/w1_ds2760.h | 5 +++++
2 files changed, 31 insertions(+), 0 deletions(-)

diff --git a/drivers/power/ds2760_battery.c b/drivers/power/ds2760_battery.c
index 9331009..520b5c4 100644
--- a/drivers/power/ds2760_battery.c
+++ b/drivers/power/ds2760_battery.c
@@ -62,6 +62,10 @@ static unsigned int cache_time = 1000;
module_param(cache_time, uint, 0644);
MODULE_PARM_DESC(cache_time, "cache time in milliseconds");

+static unsigned int pmod_enabled;
+module_param(pmod_enabled, bool, 0644);
+MODULE_PARM_DESC(pmod_enabled, "PMOD enable bit");
+
/* Some batteries have their rated capacity stored a N * 10 mAh, while
* others use an index into this table. */
static int rated_capacities[] = {
@@ -259,6 +263,17 @@ static void ds2760_battery_update_status(struct ds2760_device_info *di)
power_supply_changed(&di->bat);
}

+static void ds2760_battery_write_status(struct ds2760_device_info *di,
+ char status)
+{
+ if (status == di->raw[DS2760_STATUS_REG])
+ return;
+
+ w1_ds2760_write(di->w1_dev, &status, DS2760_STATUS_WRITE_REG, 1);
+ w1_ds2760_store_eeprom(di->w1_dev, DS2760_EEPROM_BLOCK1);
+ w1_ds2760_recall_eeprom(di->w1_dev, DS2760_EEPROM_BLOCK1);
+}
+
static void ds2760_battery_work(struct work_struct *work)
{
struct ds2760_device_info *di = container_of(work,
@@ -342,6 +357,7 @@ static enum power_supply_property ds2760_battery_props[] = {

static int ds2760_battery_probe(struct platform_device *pdev)
{
+ char status;
int retval = 0;
struct ds2760_device_info *di;

@@ -371,6 +387,16 @@ static int ds2760_battery_probe(struct platform_device *pdev)
goto batt_failed;
}

+ /* enable sleep mode feature */
+ ds2760_battery_read_status(di);
+ status = di->raw[DS2760_STATUS_REG];
+ if (pmod_enabled)
+ status |= DS2760_STATUS_PMOD;
+ else
+ status &= ~DS2760_STATUS_PMOD;
+
+ ds2760_battery_write_status(di, status);
+
INIT_DELAYED_WORK(&di->monitor_work, ds2760_battery_work);
di->monitor_wqueue = create_singlethread_workqueue(dev_name(&pdev->dev));
if (!di->monitor_wqueue) {
diff --git a/drivers/w1/slaves/w1_ds2760.h b/drivers/w1/slaves/w1_ds2760.h
index ea39419..58e7741 100644
--- a/drivers/w1/slaves/w1_ds2760.h
+++ b/drivers/w1/slaves/w1_ds2760.h
@@ -25,6 +25,10 @@

#define DS2760_PROTECTION_REG 0x00
#define DS2760_STATUS_REG 0x01
+ #define DS2760_STATUS_IE (1 << 2)
+ #define DS2760_STATUS_SWEN (1 << 3)
+ #define DS2760_STATUS_RNAOP (1 << 4)
+ #define DS2760_STATUS_PMOD (1 << 5)
#define DS2760_EEPROM_REG 0x07
#define DS2760_SPECIAL_FEATURE_REG 0x08
#define DS2760_VOLTAGE_MSB 0x0c
@@ -38,6 +42,7 @@
#define DS2760_EEPROM_BLOCK0 0x20
#define DS2760_ACTIVE_FULL 0x20
#define DS2760_EEPROM_BLOCK1 0x30
+#define DS2760_STATUS_WRITE_REG 0x31
#define DS2760_RATED_CAPACITY 0x32
#define DS2760_CURRENT_OFFSET_BIAS 0x33
#define DS2760_ACTIVE_EMPTY 0x3b
--
1.6.2.1

2009-04-28 08:55:53

by Daniel Mack

[permalink] [raw]
Subject: [PATCH 2/3] w1: ds2760: add support for EEPROM read and write

In order to modify the DS2762's status registers and to add support for
sleep mode, there is need for functions to write the internal EEPROM.

Cc: Szabolcs Gyurko <[email protected]>
Cc: Matt Reimer <[email protected]>
Cc: Anton Vorontsov <[email protected]>
Signed-off-by: Daniel Mack <[email protected]>
---
drivers/w1/slaves/w1_ds2760.c | 28 ++++++++++++++++++++++++++++
drivers/w1/slaves/w1_ds2760.h | 2 ++
2 files changed, 30 insertions(+), 0 deletions(-)

diff --git a/drivers/w1/slaves/w1_ds2760.c b/drivers/w1/slaves/w1_ds2760.c
index 1f09d4e..5ad7a0b 100644
--- a/drivers/w1/slaves/w1_ds2760.c
+++ b/drivers/w1/slaves/w1_ds2760.c
@@ -68,6 +68,34 @@ int w1_ds2760_write(struct device *dev, char *buf, int addr, size_t count)
return w1_ds2760_io(dev, buf, addr, count, 1);
}

+static int w1_ds2760_eeprom_cmd(struct device *dev, int addr, int cmd)
+{
+ struct w1_slave *sl = container_of(dev, struct w1_slave, dev);
+
+ if (!dev)
+ return -EINVAL;
+
+ mutex_lock(&sl->master->mutex);
+
+ if (w1_reset_select_slave(sl) == 0) {
+ w1_write_8(sl->master, cmd);
+ w1_write_8(sl->master, addr);
+ }
+
+ mutex_unlock(&sl->master->mutex);
+ return 0;
+}
+
+int w1_ds2760_store_eeprom(struct device *dev, int addr)
+{
+ return w1_ds2760_eeprom_cmd(dev, addr, W1_DS2760_COPY_DATA);
+}
+
+int w1_ds2760_recall_eeprom(struct device *dev, int addr)
+{
+ return w1_ds2760_eeprom_cmd(dev, addr, W1_DS2760_RECALL_DATA);
+}
+
static ssize_t w1_ds2760_read_bin(struct kobject *kobj,
struct bin_attribute *bin_attr,
char *buf, loff_t off, size_t count)
diff --git a/drivers/w1/slaves/w1_ds2760.h b/drivers/w1/slaves/w1_ds2760.h
index f130242..ea39419 100644
--- a/drivers/w1/slaves/w1_ds2760.h
+++ b/drivers/w1/slaves/w1_ds2760.h
@@ -46,5 +46,7 @@ extern int w1_ds2760_read(struct device *dev, char *buf, int addr,
size_t count);
extern int w1_ds2760_write(struct device *dev, char *buf, int addr,
size_t count);
+extern int w1_ds2760_store_eeprom(struct device *dev, int addr);
+extern int w1_ds2760_recall_eeprom(struct device *dev, int addr);

#endif /* !__w1_ds2760_h__ */
--
1.6.2.1

2009-04-28 10:23:39

by Daniel Mack

[permalink] [raw]
Subject: [PATCH 2/3] w1: ds2760: add support for EEPROM read and write

In order to modify the DS2762's status registers and to add support for
sleep mode, there is need for functions to write the internal EEPROM.

Cc: Szabolcs Gyurko <[email protected]>
Cc: Matt Reimer <[email protected]>
Cc: Anton Vorontsov <[email protected]>
Signed-off-by: Daniel Mack <[email protected]>
---
Ammended version with EXPORT_SYMBOL() for the two new functions.

drivers/w1/slaves/w1_ds2760.c | 30 ++++++++++++++++++++++++++++++
drivers/w1/slaves/w1_ds2760.h | 2 ++
2 files changed, 32 insertions(+), 0 deletions(-)

diff --git a/drivers/w1/slaves/w1_ds2760.c b/drivers/w1/slaves/w1_ds2760.c
index 1f09d4e..59f708e 100644
--- a/drivers/w1/slaves/w1_ds2760.c
+++ b/drivers/w1/slaves/w1_ds2760.c
@@ -68,6 +68,34 @@ int w1_ds2760_write(struct device *dev, char *buf, int addr, size_t count)
return w1_ds2760_io(dev, buf, addr, count, 1);
}

+static int w1_ds2760_eeprom_cmd(struct device *dev, int addr, int cmd)
+{
+ struct w1_slave *sl = container_of(dev, struct w1_slave, dev);
+
+ if (!dev)
+ return -EINVAL;
+
+ mutex_lock(&sl->master->mutex);
+
+ if (w1_reset_select_slave(sl) == 0) {
+ w1_write_8(sl->master, cmd);
+ w1_write_8(sl->master, addr);
+ }
+
+ mutex_unlock(&sl->master->mutex);
+ return 0;
+}
+
+int w1_ds2760_store_eeprom(struct device *dev, int addr)
+{
+ return w1_ds2760_eeprom_cmd(dev, addr, W1_DS2760_COPY_DATA);
+}
+
+int w1_ds2760_recall_eeprom(struct device *dev, int addr)
+{
+ return w1_ds2760_eeprom_cmd(dev, addr, W1_DS2760_RECALL_DATA);
+}
+
static ssize_t w1_ds2760_read_bin(struct kobject *kobj,
struct bin_attribute *bin_attr,
char *buf, loff_t off, size_t count)
@@ -200,6 +228,8 @@ static void __exit w1_ds2760_exit(void)

EXPORT_SYMBOL(w1_ds2760_read);
EXPORT_SYMBOL(w1_ds2760_write);
+EXPORT_SYMBOL(w1_ds2760_store_eeprom);
+EXPORT_SYMBOL(w1_ds2760_recall_eeprom);

module_init(w1_ds2760_init);
module_exit(w1_ds2760_exit);
diff --git a/drivers/w1/slaves/w1_ds2760.h b/drivers/w1/slaves/w1_ds2760.h
index f130242..ea39419 100644
--- a/drivers/w1/slaves/w1_ds2760.h
+++ b/drivers/w1/slaves/w1_ds2760.h
@@ -46,5 +46,7 @@ extern int w1_ds2760_read(struct device *dev, char *buf, int addr,
size_t count);
extern int w1_ds2760_write(struct device *dev, char *buf, int addr,
size_t count);
+extern int w1_ds2760_store_eeprom(struct device *dev, int addr);
+extern int w1_ds2760_recall_eeprom(struct device *dev, int addr);

#endif /* !__w1_ds2760_h__ */
--
1.6.2.1

2009-04-28 15:01:26

by Anton Vorontsov

[permalink] [raw]
Subject: Re: [PATCH 2/3] w1: ds2760: add support for EEPROM read and write

On Tue, Apr 28, 2009 at 10:55:01AM +0200, Daniel Mack wrote:
> In order to modify the DS2762's status registers and to add support for
> sleep mode, there is need for functions to write the internal EEPROM.
>
> Cc: Szabolcs Gyurko <[email protected]>
> Cc: Matt Reimer <[email protected]>
> Cc: Anton Vorontsov <[email protected]>
> Signed-off-by: Daniel Mack <[email protected]>
> ---

Evgeniy, don't mind if I take it via battery-2.6.git tree?

> drivers/w1/slaves/w1_ds2760.c | 28 ++++++++++++++++++++++++++++
> drivers/w1/slaves/w1_ds2760.h | 2 ++
> 2 files changed, 30 insertions(+), 0 deletions(-)
>
> diff --git a/drivers/w1/slaves/w1_ds2760.c b/drivers/w1/slaves/w1_ds2760.c
> index 1f09d4e..5ad7a0b 100644
> --- a/drivers/w1/slaves/w1_ds2760.c
> +++ b/drivers/w1/slaves/w1_ds2760.c
> @@ -68,6 +68,34 @@ int w1_ds2760_write(struct device *dev, char *buf, int addr, size_t count)
> return w1_ds2760_io(dev, buf, addr, count, 1);
> }
>
> +static int w1_ds2760_eeprom_cmd(struct device *dev, int addr, int cmd)
> +{
> + struct w1_slave *sl = container_of(dev, struct w1_slave, dev);
> +
> + if (!dev)
> + return -EINVAL;
> +
> + mutex_lock(&sl->master->mutex);
> +
> + if (w1_reset_select_slave(sl) == 0) {
> + w1_write_8(sl->master, cmd);
> + w1_write_8(sl->master, addr);
> + }
> +
> + mutex_unlock(&sl->master->mutex);
> + return 0;
> +}
> +
> +int w1_ds2760_store_eeprom(struct device *dev, int addr)
> +{
> + return w1_ds2760_eeprom_cmd(dev, addr, W1_DS2760_COPY_DATA);
> +}
> +
> +int w1_ds2760_recall_eeprom(struct device *dev, int addr)
> +{
> + return w1_ds2760_eeprom_cmd(dev, addr, W1_DS2760_RECALL_DATA);
> +}
> +
> static ssize_t w1_ds2760_read_bin(struct kobject *kobj,
> struct bin_attribute *bin_attr,
> char *buf, loff_t off, size_t count)
> diff --git a/drivers/w1/slaves/w1_ds2760.h b/drivers/w1/slaves/w1_ds2760.h
> index f130242..ea39419 100644
> --- a/drivers/w1/slaves/w1_ds2760.h
> +++ b/drivers/w1/slaves/w1_ds2760.h
> @@ -46,5 +46,7 @@ extern int w1_ds2760_read(struct device *dev, char *buf, int addr,
> size_t count);
> extern int w1_ds2760_write(struct device *dev, char *buf, int addr,
> size_t count);
> +extern int w1_ds2760_store_eeprom(struct device *dev, int addr);
> +extern int w1_ds2760_recall_eeprom(struct device *dev, int addr);
>
> #endif /* !__w1_ds2760_h__ */
> --
> 1.6.2.1
>

--
Anton Vorontsov
email: [email protected]
irc://irc.freenode.net/bd2

2009-04-28 15:04:05

by Anton Vorontsov

[permalink] [raw]
Subject: Re: [PATCH 3/3] w1: ds2760_battery: add support for sleep mode feature

On Tue, Apr 28, 2009 at 10:55:02AM +0200, Daniel Mack wrote:
> This adds support for ds2760's sleep mode feature. With this feature
> enabled, the chip enters a deep sleep mode and disconnects from the
> battery when the w1 line is held down for more than 2 seconds.
>
> This new behaviour can be switched on and off using a new module
> parameter.
>
> Cc: Szabolcs Gyurko <[email protected]>
> Cc: Matt Reimer <[email protected]>
> Cc: Anton Vorontsov <[email protected]>
> Signed-off-by: Daniel Mack <[email protected]>
> ---
[...]
> --- a/drivers/power/ds2760_battery.c
> +++ b/drivers/power/ds2760_battery.c
[...]
> diff --git a/drivers/w1/slaves/w1_ds2760.h b/drivers/w1/slaves/w1_ds2760.h
> index ea39419..58e7741 100644
> --- a/drivers/w1/slaves/w1_ds2760.h
> +++ b/drivers/w1/slaves/w1_ds2760.h
> @@ -25,6 +25,10 @@
>
> #define DS2760_PROTECTION_REG 0x00
> #define DS2760_STATUS_REG 0x01
> + #define DS2760_STATUS_IE (1 << 2)
> + #define DS2760_STATUS_SWEN (1 << 3)
> + #define DS2760_STATUS_RNAOP (1 << 4)
> + #define DS2760_STATUS_PMOD (1 << 5)

The single patch touch battery and w1 trees.

So, Evgeniy, would you mind if I take this patch?


Thanks!

> #define DS2760_EEPROM_REG 0x07
> #define DS2760_SPECIAL_FEATURE_REG 0x08
> #define DS2760_VOLTAGE_MSB 0x0c
> @@ -38,6 +42,7 @@
> #define DS2760_EEPROM_BLOCK0 0x20
> #define DS2760_ACTIVE_FULL 0x20
> #define DS2760_EEPROM_BLOCK1 0x30
> +#define DS2760_STATUS_WRITE_REG 0x31
> #define DS2760_RATED_CAPACITY 0x32
> #define DS2760_CURRENT_OFFSET_BIAS 0x33
> #define DS2760_ACTIVE_EMPTY 0x3b
> --
> 1.6.2.1

--
Anton Vorontsov
email: [email protected]
irc://irc.freenode.net/bd2

2009-04-28 16:34:18

by Evgeniy Polyakov

[permalink] [raw]
Subject: Re: [PATCH 2/3] w1: ds2760: add support for EEPROM read and write

Hi Anton.

On Tue, Apr 28, 2009 at 07:01:09PM +0400, Anton Vorontsov ([email protected]) wrote:
> On Tue, Apr 28, 2009 at 10:55:01AM +0200, Daniel Mack wrote:
> > In order to modify the DS2762's status registers and to add support for
> > sleep mode, there is need for functions to write the internal EEPROM.
> >
> > Cc: Szabolcs Gyurko <[email protected]>
> > Cc: Matt Reimer <[email protected]>
> > Cc: Anton Vorontsov <[email protected]>
> > Signed-off-by: Daniel Mack <[email protected]>
> > ---
>
> Evgeniy, don't mind if I take it via battery-2.6.git tree?

Looks good, ack!
Feel free to push both patches via battery tree when needed.

--
Evgeniy Polyakov

2009-04-28 17:42:37

by Matthew Reimer

[permalink] [raw]
Subject: Re: [PATCH 1/3] w1: ds2760_battery: cleanups in ds2760_battery_probe()

Daniel Mack wrote:
> Removed struct ds2760_platform_data which wasn't defined anywhere.
> Indentation cleanups.
>
> Cc: Szabolcs Gyurko <[email protected]>
> Cc: Matt Reimer <[email protected]>
> Cc: Anton Vorontsov <[email protected]>
> Signed-off-by: Daniel Mack <[email protected]>
>
Ack.

Matt

2009-04-28 17:43:05

by Matthew Reimer

[permalink] [raw]
Subject: Re: [PATCH 3/3] w1: ds2760_battery: add support for sleep mode feature

Daniel Mack wrote:
> This adds support for ds2760's sleep mode feature. With this feature
> enabled, the chip enters a deep sleep mode and disconnects from the
> battery when the w1 line is held down for more than 2 seconds.
>
> This new behaviour can be switched on and off using a new module
> parameter.
>
> Cc: Szabolcs Gyurko <[email protected]>
> Cc: Matt Reimer <[email protected]>
> Cc: Anton Vorontsov <[email protected]>
> Signed-off-by: Daniel Mack <[email protected]>
>
Ack.

Matt

2009-04-28 17:43:28

by Matthew Reimer

[permalink] [raw]
Subject: Re: [PATCH 2/3] w1: ds2760: add support for EEPROM read and write

Daniel Mack wrote:
> In order to modify the DS2762's status registers and to add support for
> sleep mode, there is need for functions to write the internal EEPROM.
>
> Cc: Szabolcs Gyurko <[email protected]>
> Cc: Matt Reimer <[email protected]>
> Cc: Anton Vorontsov <[email protected]>
> Signed-off-by: Daniel Mack <[email protected]>
>

Ack.

Matt