ANDROID: w1: ds2482: Manage SLPZ pin sleep state

Place SLPZ pin in sleep state at system suspend time if a GPIO is
provided by board platform data.

Change-Id: I93c61fa0ae474e968e0f909209c9bfcaafe3dd2c
Signed-off-by: Todd Poynor <toddpoynor@google.com>
This commit is contained in:
Todd Poynor
2012-08-30 23:09:14 -07:00
committed by Dmitry Shmidt
parent 1672c66bee
commit b1173ef512
2 changed files with 67 additions and 1 deletions

View File

@@ -18,6 +18,8 @@
#include <linux/slab.h>
#include <linux/i2c.h>
#include <linux/delay.h>
#include <linux/gpio.h>
#include <linux/platform_data/ds2482.h>
#include <asm/delay.h>
#include "../w1.h"
@@ -97,7 +99,8 @@ static const u8 ds2482_chan_rd[8] =
static int ds2482_probe(struct i2c_client *client,
const struct i2c_device_id *id);
static int ds2482_remove(struct i2c_client *client);
static int ds2482_suspend(struct device *dev);
static int ds2482_resume(struct device *dev);
/**
* Driver data (common to all clients)
@@ -108,9 +111,15 @@ static const struct i2c_device_id ds2482_id[] = {
};
MODULE_DEVICE_TABLE(i2c, ds2482_id);
static const struct dev_pm_ops ds2482_pm_ops = {
.suspend = ds2482_suspend,
.resume = ds2482_resume,
};
static struct i2c_driver ds2482_driver = {
.driver = {
.name = "ds2482",
.pm = &ds2482_pm_ops,
},
.probe = ds2482_probe,
.remove = ds2482_remove,
@@ -132,6 +141,7 @@ struct ds2482_w1_chan {
struct ds2482_data {
struct i2c_client *client;
struct mutex access_lock;
int slpz_gpio;
/* 1-wire interface(s) */
int w1_count; /* 1 or 8 */
@@ -460,11 +470,31 @@ static u8 ds2482_w1_set_pullup(void *data, int delay)
return retval;
}
static int ds2482_suspend(struct device *dev)
{
struct i2c_client *client = to_i2c_client(dev);
struct ds2482_data *data = i2c_get_clientdata(client);
if (data->slpz_gpio >= 0)
gpio_set_value(data->slpz_gpio, 0);
return 0;
}
static int ds2482_resume(struct device *dev)
{
struct i2c_client *client = to_i2c_client(dev);
struct ds2482_data *data = i2c_get_clientdata(client);
if (data->slpz_gpio >= 0)
gpio_set_value(data->slpz_gpio, 1);
return 0;
}
static int ds2482_probe(struct i2c_client *client,
const struct i2c_device_id *id)
{
struct ds2482_data *data;
struct ds2482_platform_data *pdata;
int err = -ENODEV;
int temp1;
int idx;
@@ -531,6 +561,16 @@ static int ds2482_probe(struct i2c_client *client,
}
}
pdata = client->dev.platform_data;
data->slpz_gpio = pdata ? pdata->slpz_gpio : -1;
if (data->slpz_gpio >= 0) {
err = gpio_request_one(data->slpz_gpio, GPIOF_OUT_INIT_HIGH,
"ds2482.slpz");
if (err < 0)
goto exit_w1_remove;
}
return 0;
exit_w1_remove:
@@ -555,6 +595,11 @@ static int ds2482_remove(struct i2c_client *client)
w1_remove_master_device(&data->w1_ch[idx].w1_bm);
}
if (data->slpz_gpio >= 0) {
gpio_set_value(data->slpz_gpio, 0);
gpio_free(data->slpz_gpio);
}
/* Free the memory */
kfree(data);
return 0;

View File

@@ -0,0 +1,21 @@
/*
* Copyright (C) 2012 Google, Inc.
*
* This software is licensed under the terms of the GNU General Public
* License version 2, as published by the Free Software Foundation, and
* may be copied, distributed, and modified under those terms.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#ifndef __PLATFORM_DATA_DS2482__
#define __PLATFORM_DATA_DS2482__
struct ds2482_platform_data {
int slpz_gpio;
};
#endif /* __PLATFORM_DATA_DS2482__ */