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
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
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
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
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
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
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
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
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
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