]> rtime.felk.cvut.cz Git - sojka/nv-tegra/linux-3.10.git/commitdiff
arm: tegra: tegra_bb: add sysfs node state
authorVinayak Pane <vpane@nvidia.com>
Thu, 27 Dec 2012 21:21:22 +0000 (13:21 -0800)
committerDan Willemsen <dwillemsen@nvidia.com>
Sat, 14 Sep 2013 19:58:57 +0000 (12:58 -0700)
The sysfs node "state" will show state of BB2AP_MEM_REQ signal.
This essentially shows BBC's current power state as hibernate/active.

Bug 1160000

Change-Id: I40451552cbe4c8c13e8855788e59c15a821fad87
Signed-off-by: Vinayak Pane <vpane@nvidia.com>
Reviewed-on: http://git-master/r/194842
Reviewed-by: Seshendra Gadagottu <sgadagottu@nvidia.com>
Tested-by: Seshendra Gadagottu <sgadagottu@nvidia.com>
arch/arm/mach-tegra/tegra_bb.c

index acc1dfb34a9cc6a41424275fef7aa03454baa3e5..0b655fc5704589f66e74a0746ad675d929642d2b 100644 (file)
@@ -45,6 +45,7 @@
 #define APBDEV_PMC_IPC_PMC_IPC_STS_0 (0x500)
 #define APBDEV_PMC_IPC_PMC_IPC_STS_0_AP2BB_RESET_SHIFT (1)
 #define APBDEV_PMC_IPC_PMC_IPC_STS_0_AP2BB_RESET_DEFAULT_MASK (1)
+#define APBDEV_PMC_IPC_PMC_IPC_STS_0_BB2AP_MEM_REQ_SHIFT (3)
 
 #define APBDEV_PMC_IPC_PMC_IPC_SET_0 (0x504)
 #define APBDEV_PMC_IPC_PMC_IPC_SET_0_AP2BB_RESET_SHIFT (1)
@@ -539,6 +540,28 @@ static ssize_t show_tegra_bb_reset(struct device *dev,
 static DEVICE_ATTR(reset, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP,
                   show_tegra_bb_reset, store_tegra_bb_reset);
 
+static ssize_t show_tegra_bb_state(struct device *dev,
+                                     struct device_attribute *attr,
+                                     char *buf)
+{
+       unsigned int sts, mem_req;
+       void __iomem *pmc = IO_ADDRESS(TEGRA_PMC_BASE);
+       struct platform_device *pdev = container_of(dev,
+                                                   struct platform_device,
+                                                   dev);
+       sts = readl(pmc + APBDEV_PMC_IPC_PMC_IPC_STS_0);
+       dev_dbg(&pdev->dev, "%s IPC_STS=0x%x\n", __func__,
+                        (unsigned int)sts);
+
+       mem_req = (sts >> APBDEV_PMC_IPC_PMC_IPC_STS_0_BB2AP_MEM_REQ_SHIFT) & 1;
+
+       dev_dbg(&pdev->dev, "%s mem_req =%d\n", __func__,
+                       (unsigned int)mem_req);
+       return sprintf(buf, "%d\n", (unsigned int)mem_req);
+}
+
+static DEVICE_ATTR(state, S_IRUSR | S_IRGRP, show_tegra_bb_state, NULL);
+
 #ifndef CONFIG_TEGRA_BASEBAND_SIMU
 static irqreturn_t tegra_bb_isr_handler(int irq, void *data)
 {
@@ -749,6 +772,7 @@ static int tegra_bb_probe(struct platform_device *pdev)
        ret = device_create_file(&pdev->dev, &dev_attr_priv_size);
        ret = device_create_file(&pdev->dev, &dev_attr_ipc_size);
        ret = device_create_file(&pdev->dev, &dev_attr_reset);
+       ret = device_create_file(&pdev->dev, &dev_attr_state);
 
        bb->sd = sysfs_get_dirent(pdev->dev.kobj.sd, NULL, "status");