summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorGary King <gking@nvidia.com>2010-02-26 16:23:33 -0800
committerGerrit Code Review <gerrit2@git-master-01.nvidia.com>2010-02-26 16:23:33 -0800
commit478bdc11006dd79e14d6943489f298f8a093321f (patch)
treeb6f3782815acb96fa77d210561e2324506081456 /drivers
parent1a890b9dbd1193527a8c4ff277042024507aa962 (diff)
parent3c5f25f31edf3ae05052d69db18417d1908ac171 (diff)
Merge "tegra-w1: Add support read_bit, write_bit and touch_bit routines Change-Id: I313de2e32b1dd64470ce7eb9f21a60c590e689c6" into android-tegra-2.6.29
Diffstat (limited to 'drivers')
-rw-r--r--drivers/w1/masters/tegra_w1.c67
1 files changed, 67 insertions, 0 deletions
diff --git a/drivers/w1/masters/tegra_w1.c b/drivers/w1/masters/tegra_w1.c
index 4667180664c6..80050f6284b9 100644
--- a/drivers/w1/masters/tegra_w1.c
+++ b/drivers/w1/masters/tegra_w1.c
@@ -93,6 +93,70 @@ static void tegra_w1_write_byte(void *data, u8 a_byte)
}
}
+static u8 tegra_w1_read_bit(void *data)
+{
+ struct tegra_w1_dev *dev = data;
+ NvRmOwrTransactionInfo tInfo;
+ NvError err;
+ u8 buffer[1];
+
+ tInfo.Flags = NvRmOwr_ReadBit;
+ tInfo.NumBytes = 1;
+ tInfo.Address = 0;
+ tInfo.Offset = 0;
+
+ err = NvRmOwrTransaction(dev->OwrHandle, dev->pin_map,
+ buffer, tInfo.NumBytes, &tInfo, 1);
+ if (err != NvSuccess)
+ {
+ printk(KERN_ERR "tegra_w1_read_bit failed 0x%x\r\n", err);
+ err = -EIO;
+ }
+
+ if (!err)
+ return (buffer[0] & 0x1);
+ else
+ return 0;
+}
+
+static void tegra_w1_write_bit(void *data, u8 bit)
+{
+ struct tegra_w1_dev *dev = data;
+ NvRmOwrTransactionInfo tInfo;
+ NvError err;
+ u8 buffer[1];
+
+ tInfo.Flags = NvRmOwr_WriteBit;
+ tInfo.NumBytes = 1;
+ tInfo.Address = 0;
+ tInfo.Offset = 0;
+ buffer[0] = bit & 0x1;
+
+ err = NvRmOwrTransaction(dev->OwrHandle, dev->pin_map,
+ buffer, tInfo.NumBytes, &tInfo, 1);
+ if (err != NvSuccess)
+ {
+ printk(KERN_ERR "tegra_w1_write_bit failed 0x%x\r\n", err);
+ err = -EIO;
+ }
+}
+
+/* Performs a write-0 or write-1 cycle and samples the level */
+static u8 tegra_w1_touch_bit(void *data, u8 bit)
+{
+ struct tegra_w1_dev *dev = data;
+
+ if (bit)
+ {
+ return tegra_w1_read_bit(dev);
+ }
+ else
+ {
+ tegra_w1_write_bit(dev, 0);
+ return 0;
+ }
+}
+
static u8 tegra_w1_reset_bus(void *data)
{
struct tegra_w1_dev *dev = data;
@@ -155,6 +219,9 @@ static int tegra_w1_probe(struct platform_device *pdev)
dev->bus_master.data = dev;
dev->bus_master.read_byte = tegra_w1_read_byte;
dev->bus_master.write_byte = tegra_w1_write_byte;
+ dev->bus_master.read_bit = tegra_w1_read_bit;
+ dev->bus_master.write_bit = tegra_w1_write_bit;
+ dev->bus_master.touch_bit = tegra_w1_touch_bit;
dev->bus_master.reset_bus = tegra_w1_reset_bus;
if (tegra_w1_reset_bus(dev))