* [PATCH 2/3] Debobs and ETK padconf implementation
2008-09-16 11:24 ` [PATCH 1/3] Add definitions for ETK pads and debobs registers Peter 'p2' De Schrijver
@ 2008-09-16 11:24 ` Peter 'p2' De Schrijver
0 siblings, 0 replies; 7+ messages in thread
From: Peter 'p2' De Schrijver @ 2008-09-16 11:24 UTC (permalink / raw)
To: linux-omap; +Cc: Peter 'p2' De Schrijver
Signed-off-by: Peter 'p2' De Schrijver <peter.de-schrijver@nokia.com>
---
arch/arm/mach-omap2/debobs.c | 214 ++++++++++++++++++++++++++++++++++++++++++
1 files changed, 214 insertions(+), 0 deletions(-)
create mode 100644 arch/arm/mach-omap2/debobs.c
diff --git a/arch/arm/mach-omap2/debobs.c b/arch/arm/mach-omap2/debobs.c
new file mode 100644
index 0000000..1bde1f4
--- /dev/null
+++ b/arch/arm/mach-omap2/debobs.c
@@ -0,0 +1,214 @@
+/*
+ * arch/arm/mach-omap2/debobs.c
+ *
+ * Handle debobs pads
+ *
+ * Copyright (C) 2008 Nokia Corporation
+ *
+ * Written by Peter De Schrijver <peter.de-schrijver@nokia.com>
+ *
+ * This file is subject to the terms and conditions of the GNU General
+ * Public License. See the file "COPYING" in the main directory of this
+ * archive for more details.
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/debugfs.h>
+#include <linux/uaccess.h>
+#include <linux/module.h>
+#include <mach/control.h>
+#include <mach/mux.h>
+#include <mach/gpio.h>
+#include <mach/board.h>
+
+#define ETK_GPIO_BEGIN 12
+#define ETK_GPIO(i) (ETK_GPIO_BEGIN + i)
+#define NUM_OF_DEBOBS_PADS 18
+
+enum debobs_pad_mode {
+ GPIO = 0,
+ OBS = 1,
+ ETK = 2,
+ NO_MODE = 3,
+};
+
+static char *debobs_pad_mode_names[] = {
+ [GPIO] = "GPIO",
+ [OBS] = "OBS",
+ [ETK] = "ETK",
+};
+
+struct obs {
+ u16 offset;
+ u8 value;
+ u8 mask;
+};
+
+struct debobs_pad {
+ enum debobs_pad_mode mode;
+ struct obs core_obs;
+ struct obs wakeup_obs;
+};
+
+static struct debobs_pad debobs_pads[NUM_OF_DEBOBS_PADS];
+
+static int debobs_mode_open(struct inode *inode, struct file *file)
+{
+ file->private_data = inode->i_private;
+
+ return 0;
+}
+
+static ssize_t debobs_mode_read(struct file *file, char __user *user_buf,
+ size_t count, loff_t *ppos)
+{
+ char buffer[10];
+ int size;
+ int pad_number = (int)file->private_data;
+ struct debobs_pad *e = &debobs_pads[pad_number];
+
+ size = snprintf(buffer, sizeof(buffer), "%s\n",
+ debobs_pad_mode_names[e->mode]);
+ return simple_read_from_buffer(user_buf, count, ppos, buffer, size);
+}
+
+static ssize_t debobs_mode_write(struct file *file, const char __user *user_buf,
+ size_t count, loff_t *ppos)
+{
+ char buffer[10];
+ int buf_size, i, pad_number;
+ u16 muxmode = OMAP34XX_MUX_MODE7;
+
+ memset(buffer, 0, sizeof(buffer));
+ buf_size = min(count, (sizeof(buffer)-1));
+
+ if (copy_from_user(buffer, user_buf, buf_size))
+ return -EFAULT;
+
+ pad_number = (int)file->private_data;
+
+ for (i = 0; i < NO_MODE; i++) {
+ if (!strnicmp(debobs_pad_mode_names[i],
+ buffer,
+ strlen(debobs_pad_mode_names[i]))) {
+ switch (i) {
+ case ETK:
+ muxmode = OMAP34XX_MUX_MODE0;
+ break;
+ case GPIO:
+ muxmode = OMAP34XX_MUX_MODE4;
+ break;
+ case OBS:
+ muxmode = OMAP34XX_MUX_MODE7;
+ break;
+ }
+ omap_ctrl_writew(muxmode,
+ OMAP343X_PADCONF_ETK(pad_number));
+ debobs_pads[pad_number].mode = i;
+
+ return count;
+ }
+ }
+
+ return -EINVAL;
+}
+
+static const struct file_operations debobs_mode_fops = {
+ .open = debobs_mode_open,
+ .read = debobs_mode_read,
+ .write = debobs_mode_write,
+};
+
+static int debobs_get(void *data, u64 *val)
+{
+ struct obs *o = data;
+
+ *val = o->value;
+
+ return 0;
+}
+
+static int debobs_set(void *data, u64 val)
+{
+ struct obs *o = data;
+
+ val &= BIT(o->mask) - 1;
+
+ omap_ctrl_writeb(val, o->offset);
+ o->value = val;
+
+ return 0;
+}
+
+DEFINE_SIMPLE_ATTRIBUTE(debobs_fops, debobs_get, debobs_set, "%llu\n");
+
+static inline int __init _new_debobs_pad(struct debobs_pad *pad, char *name,
+ int number, struct dentry *root)
+{
+ struct dentry *d;
+ struct obs *o;
+
+ d = debugfs_create_dir(name, root);
+ if (IS_ERR(d))
+ return PTR_ERR(d);
+
+ omap_ctrl_writew(OMAP34XX_MUX_MODE4, OMAP343X_PADCONF_ETK(number));
+ omap_set_gpio_direction(ETK_GPIO(number), 1);
+ gpio_export(ETK_GPIO(number), 1);
+ (void) debugfs_create_file("mode", S_IRUGO | S_IWUGO, d,
+ (void *)number, &debobs_mode_fops);
+
+ o = &pad->core_obs;
+ o->offset = OMAP343X_CONTROL_DEBOBS(number);
+ o->value = omap_ctrl_readw(o->offset);
+ o->mask = 7;
+ (void) debugfs_create_file("coreobs", S_IRUGO | S_IWUGO, d, o,
+ &debobs_fops);
+
+ o = &pad->wakeup_obs;
+ o->offset = OMAP343X_CONTROL_WKUP_DEBOBSMUX(number);
+ o->value = omap_ctrl_readb(o->offset);
+ o->mask = 5;
+ (void) debugfs_create_file("wakeupobs", S_IRUGO | S_IWUGO, d, o,
+ &debobs_fops);
+
+ return 0;
+}
+
+static int __init init_debobs(void)
+{
+ struct dentry *debobs_root;
+ int i, err;
+ char name[10];
+
+ debobs_root = debugfs_create_dir("debobs", NULL);
+ if (IS_ERR(debobs_root))
+ return PTR_ERR(debobs_root);
+
+ for (i = 0; i < NUM_OF_DEBOBS_PADS; i++) {
+ if (!omap_request_gpio(ETK_GPIO(i))) {
+ snprintf(name, sizeof(name), "hw_dbg%d", i);
+ err = _new_debobs_pad(&debobs_pads[i], name, i,
+ debobs_root);
+ if (err) {
+ omap_free_gpio(ETK_GPIO(i));
+ return err;
+ }
+ }
+ }
+
+ return 0;
+}
+
+late_initcall_sync(init_debobs);
--
1.5.6.3
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 0/3] debobs support for OMAP3430.
@ 2008-10-01 15:11 Peter 'p2' De Schrijver
2008-10-01 15:11 ` [PATCH 1/3] Add definitions for ETK pads and debobs registers Peter 'p2' De Schrijver
0 siblings, 1 reply; 7+ messages in thread
From: Peter 'p2' De Schrijver @ 2008-10-01 15:11 UTC (permalink / raw)
To: linux-omap; +Cc: Peter 'p2' De Schrijver
This patch adds support for debug observability on OMAP3430 using the ETK lines. A new interface for using debug GPIOs is provided. This interface makes sure the debobs subsystem is initialized before actual gpiolib calls are made.
Peter 'p2' De Schrijver (3):
Add definitions for ETK pads and debobs registers
Debobs and ETK padconf implementation
Add debobs Kconfig item
arch/arm/mach-omap2/Makefile | 3 +
arch/arm/mach-omap2/debobs.c | 239 +++++++++++++++++++++++++++++
arch/arm/plat-omap/Kconfig | 7 +
arch/arm/plat-omap/include/mach/control.h | 34 ++++
arch/arm/plat-omap/include/mach/debobs.h | 7 +
5 files changed, 290 insertions(+), 0 deletions(-)
create mode 100644 arch/arm/mach-omap2/debobs.c
create mode 100644 arch/arm/plat-omap/include/mach/debobs.h
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH 1/3] Add definitions for ETK pads and debobs registers
2008-10-01 15:11 [PATCH 0/3] debobs support for OMAP3430 Peter 'p2' De Schrijver
@ 2008-10-01 15:11 ` Peter 'p2' De Schrijver
2008-10-01 15:11 ` [PATCH 2/3] Debobs and ETK padconf implementation Peter 'p2' De Schrijver
0 siblings, 1 reply; 7+ messages in thread
From: Peter 'p2' De Schrijver @ 2008-10-01 15:11 UTC (permalink / raw)
To: linux-omap; +Cc: Peter 'p2' De Schrijver
Signed-off-by: Peter 'p2' De Schrijver <peter.de-schrijver@nokia.com>
---
arch/arm/plat-omap/include/mach/control.h | 34 +++++++++++++++++++++++++++++
1 files changed, 34 insertions(+), 0 deletions(-)
diff --git a/arch/arm/plat-omap/include/mach/control.h b/arch/arm/plat-omap/include/mach/control.h
index 9ca0e08..0ea0060 100644
--- a/arch/arm/plat-omap/include/mach/control.h
+++ b/arch/arm/plat-omap/include/mach/control.h
@@ -150,6 +150,40 @@
#define OMAP343X_CONTROL_IVA2_BOOTADDR (OMAP2_CONTROL_GENERAL + 0x0190)
#define OMAP343X_CONTROL_IVA2_BOOTMOD (OMAP2_CONTROL_GENERAL + 0x0194)
#define OMAP343X_CONTROL_TEMP_SENSOR (OMAP2_CONTROL_GENERAL + 0x02b4)
+#define OMAP343X_CONTROL_DEBOBS(i) (OMAP2_CONTROL_GENERAL + 0x01B0 \
+ + ((i) >> 1) * 4 + (!(i) & 1) * 2)
+/* 34xx PADCONF register offsets */
+
+#define OMAP343X_PADCONF_ETK(i) (OMAP2_CONTROL_PADCONFS + 0x5a8 + \
+ (i)*2)
+#define OMAP343X_PADCONF_ETK_CLK OMAP343X_PADCONF_ETK(0)
+#define OMAP343X_PADCONF_ETK_CTL OMAP343X_PADCONF_ETK(1)
+#define OMAP343X_PADCONF_ETK_D0 OMAP343X_PADCONF_ETK(2)
+#define OMAP343X_PADCONF_ETK_D1 OMAP343X_PADCONF_ETK(3)
+#define OMAP343X_PADCONF_ETK_D2 OMAP343X_PADCONF_ETK(4)
+#define OMAP343X_PADCONF_ETK_D3 OMAP343X_PADCONF_ETK(5)
+#define OMAP343X_PADCONF_ETK_D4 OMAP343X_PADCONF_ETK(6)
+#define OMAP343X_PADCONF_ETK_D5 OMAP343X_PADCONF_ETK(7)
+#define OMAP343X_PADCONF_ETK_D6 OMAP343X_PADCONF_ETK(8)
+#define OMAP343X_PADCONF_ETK_D7 OMAP343X_PADCONF_ETK(9)
+#define OMAP343X_PADCONF_ETK_D8 OMAP343X_PADCONF_ETK(10)
+#define OMAP343X_PADCONF_ETK_D9 OMAP343X_PADCONF_ETK(11)
+#define OMAP343X_PADCONF_ETK_D10 OMAP343X_PADCONF_ETK(12)
+#define OMAP343X_PADCONF_ETK_D11 OMAP343X_PADCONF_ETK(13)
+#define OMAP343X_PADCONF_ETK_D12 OMAP343X_PADCONF_ETK(14)
+#define OMAP343X_PADCONF_ETK_D13 OMAP343X_PADCONF_ETK(15)
+#define OMAP343X_PADCONF_ETK_D14 OMAP343X_PADCONF_ETK(16)
+#define OMAP343X_PADCONF_ETK_D15 OMAP343X_PADCONF_ETK(17)
+
+/* 34xx GENERAL_WKUP regist offsets */
+
+#define OMAP343X_CONTROL_WKUP_DEBOBSMUX(i) (OMAP343X_CONTROL_GENERAL_WKUP + \
+ 0x008 + (i))
+#define OMAP343X_CONTROL_WKUP_DEBOBS0 (OMAP343X_CONTROL_GENERAL_WKUP + 0x008)
+#define OMAP343X_CONTROL_WKUP_DEBOBS1 (OMAP343X_CONTROL_GENERAL_WKUP + 0x00C)
+#define OMAP343X_CONTROL_WKUP_DEBOBS2 (OMAP343X_CONTROL_GENERAL_WKUP + 0x010)
+#define OMAP343X_CONTROL_WKUP_DEBOBS3 (OMAP343X_CONTROL_GENERAL_WKUP + 0x014)
+#define OMAP343X_CONTROL_WKUP_DEBOBS4 (OMAP343X_CONTROL_GENERAL_WKUP + 0x018)
/*
* REVISIT: This list of registers is not comprehensive - there are more
--
1.5.6.3
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 2/3] Debobs and ETK padconf implementation
2008-10-01 15:11 ` [PATCH 1/3] Add definitions for ETK pads and debobs registers Peter 'p2' De Schrijver
@ 2008-10-01 15:11 ` Peter 'p2' De Schrijver
2008-10-01 15:11 ` [PATCH 3/3] Add debobs Kconfig item Peter 'p2' De Schrijver
2008-10-07 10:42 ` [PATCH 2/3] Debobs and ETK padconf implementation Kevin Hilman
0 siblings, 2 replies; 7+ messages in thread
From: Peter 'p2' De Schrijver @ 2008-10-01 15:11 UTC (permalink / raw)
To: linux-omap; +Cc: Peter 'p2' De Schrijver
Signed-off-by: Peter 'p2' De Schrijver <peter.de-schrijver@nokia.com>
---
arch/arm/mach-omap2/debobs.c | 239 ++++++++++++++++++++++++++++++
arch/arm/plat-omap/include/mach/debobs.h | 7 +
2 files changed, 246 insertions(+), 0 deletions(-)
create mode 100644 arch/arm/mach-omap2/debobs.c
create mode 100644 arch/arm/plat-omap/include/mach/debobs.h
diff --git a/arch/arm/mach-omap2/debobs.c b/arch/arm/mach-omap2/debobs.c
new file mode 100644
index 0000000..4fbabef
--- /dev/null
+++ b/arch/arm/mach-omap2/debobs.c
@@ -0,0 +1,239 @@
+/*
+ * arch/arm/mach-omap2/debobs.c
+ *
+ * Handle debobs pads
+ *
+ * Copyright (C) 2008 Nokia Corporation
+ *
+ * Written by Peter De Schrijver <peter.de-schrijver@nokia.com>
+ *
+ * This file is subject to the terms and conditions of the GNU General
+ * Public License. See the file "COPYING" in the main directory of this
+ * archive for more details.
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/debugfs.h>
+#include <linux/uaccess.h>
+#include <linux/module.h>
+#include <mach/control.h>
+#include <mach/mux.h>
+#include <mach/gpio.h>
+#include <mach/board.h>
+
+#define ETK_GPIO_BEGIN 12
+#define ETK_GPIO(i) (ETK_GPIO_BEGIN + i)
+#define NUM_OF_DEBOBS_PADS 18
+
+static int debobs_initialized;
+
+enum debobs_pad_mode {
+ GPIO = 0,
+ OBS = 1,
+ ETK = 2,
+ NO_MODE = 3,
+};
+
+static char *debobs_pad_mode_names[] = {
+ [GPIO] = "GPIO",
+ [OBS] = "OBS",
+ [ETK] = "ETK",
+};
+
+struct obs {
+ u16 offset;
+ u8 value;
+ u8 mask;
+};
+
+struct debobs_pad {
+ enum debobs_pad_mode mode;
+ struct obs core_obs;
+ struct obs wakeup_obs;
+};
+
+static struct debobs_pad debobs_pads[NUM_OF_DEBOBS_PADS];
+
+static int debobs_mode_open(struct inode *inode, struct file *file)
+{
+ file->private_data = inode->i_private;
+
+ return 0;
+}
+
+static ssize_t debobs_mode_read(struct file *file, char __user *user_buf,
+ size_t count, loff_t *ppos)
+{
+ char buffer[10];
+ int size;
+ int pad_number = (int)file->private_data;
+ struct debobs_pad *e = &debobs_pads[pad_number];
+
+ size = snprintf(buffer, sizeof(buffer), "%s\n",
+ debobs_pad_mode_names[e->mode]);
+ return simple_read_from_buffer(user_buf, count, ppos, buffer, size);
+}
+
+static ssize_t debobs_mode_write(struct file *file, const char __user *user_buf,
+ size_t count, loff_t *ppos)
+{
+ char buffer[10];
+ int buf_size, i, pad_number;
+ u16 muxmode = OMAP34XX_MUX_MODE7;
+
+ memset(buffer, 0, sizeof(buffer));
+ buf_size = min(count, (sizeof(buffer)-1));
+
+ if (copy_from_user(buffer, user_buf, buf_size))
+ return -EFAULT;
+
+ pad_number = (int)file->private_data;
+
+ for (i = 0; i < NO_MODE; i++) {
+ if (!strnicmp(debobs_pad_mode_names[i],
+ buffer,
+ strlen(debobs_pad_mode_names[i]))) {
+ switch (i) {
+ case ETK:
+ muxmode = OMAP34XX_MUX_MODE0;
+ break;
+ case GPIO:
+ muxmode = OMAP34XX_MUX_MODE4;
+ break;
+ case OBS:
+ muxmode = OMAP34XX_MUX_MODE7;
+ break;
+ }
+ omap_ctrl_writew(muxmode,
+ OMAP343X_PADCONF_ETK(pad_number));
+ debobs_pads[pad_number].mode = i;
+
+ return count;
+ }
+ }
+
+ return -EINVAL;
+}
+
+static const struct file_operations debobs_mode_fops = {
+ .open = debobs_mode_open,
+ .read = debobs_mode_read,
+ .write = debobs_mode_write,
+};
+
+static int debobs_get(void *data, u64 *val)
+{
+ struct obs *o = data;
+
+ *val = o->value;
+
+ return 0;
+}
+
+static int debobs_set(void *data, u64 val)
+{
+ struct obs *o = data;
+
+ val &= BIT(o->mask) - 1;
+
+ omap_ctrl_writeb(val, o->offset);
+ o->value = val;
+
+ return 0;
+}
+
+DEFINE_SIMPLE_ATTRIBUTE(debobs_fops, debobs_get, debobs_set, "%llu\n");
+
+static inline int __init _new_debobs_pad(struct debobs_pad *pad, char *name,
+ int number, struct dentry *root)
+{
+ struct dentry *d;
+ struct obs *o;
+
+ d = debugfs_create_dir(name, root);
+ if (IS_ERR(d))
+ return PTR_ERR(d);
+
+ omap_ctrl_writew(OMAP34XX_MUX_MODE4, OMAP343X_PADCONF_ETK(number));
+ gpio_direction_input(ETK_GPIO(number));
+ gpio_export(ETK_GPIO(number), 1);
+ (void) debugfs_create_file("mode", S_IRUGO | S_IWUGO, d,
+ (void *)number, &debobs_mode_fops);
+
+ o = &pad->core_obs;
+ o->offset = OMAP343X_CONTROL_DEBOBS(number);
+ o->value = omap_ctrl_readw(o->offset);
+ o->mask = 7;
+ (void) debugfs_create_file("coreobs", S_IRUGO | S_IWUGO, d, o,
+ &debobs_fops);
+
+ o = &pad->wakeup_obs;
+ o->offset = OMAP343X_CONTROL_WKUP_DEBOBSMUX(number);
+ o->value = omap_ctrl_readb(o->offset);
+ o->mask = 5;
+ (void) debugfs_create_file("wakeupobs", S_IRUGO | S_IWUGO, d, o,
+ &debobs_fops);
+
+ return 0;
+}
+
+/* Public functions */
+
+void debug_gpio_set(unsigned gpio, int value)
+{
+ if (!debobs_initialized)
+ return ;
+
+ WARN_ON(gpio >= NUM_OF_DEBOBS_PADS);
+ if (gpio < NUM_OF_DEBOBS_PADS)
+ __gpio_set_value(ETK_GPIO(gpio), value);
+}
+
+int debug_gpio_get(unsigned gpio)
+{
+ if (!debobs_initialized)
+ return -EINVAL;
+
+ WARN_ON(gpio >= NUM_OF_DEBOBS_PADS);
+ if (gpio < NUM_OF_DEBOBS_PADS)
+ return __gpio_get_value(ETK_GPIO(gpio));
+
+ return -EINVAL;
+}
+
+int __init init_debobs(void)
+{
+ struct dentry *debobs_root;
+ int i, err;
+ char name[10];
+
+ debobs_root = debugfs_create_dir("debobs", NULL);
+ if (IS_ERR(debobs_root))
+ return PTR_ERR(debobs_root);
+
+ for (i = 0; i < NUM_OF_DEBOBS_PADS; i++) {
+ snprintf(name, sizeof(name), "hw_dbg%d", i);
+ if (!gpio_request(ETK_GPIO(i), name)) {
+ err = _new_debobs_pad(&debobs_pads[i], name, i,
+ debobs_root);
+ } else
+ gpio_free(ETK_GPIO(i));
+ }
+
+ debobs_initialized = 1;
+
+ return 0;
+}
+
+late_initcall_sync(init_debobs);
diff --git a/arch/arm/plat-omap/include/mach/debobs.h b/arch/arm/plat-omap/include/mach/debobs.h
new file mode 100644
index 0000000..67f765d
--- /dev/null
+++ b/arch/arm/plat-omap/include/mach/debobs.h
@@ -0,0 +1,7 @@
+#ifndef __DEBOBS_H
+#define __DEBOBS_H
+
+void debug_gpio_set(unsigned gpio, int value);
+int debug_gpio_get(unsigned gpio);
+
+#endif
--
1.5.6.3
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 3/3] Add debobs Kconfig item
2008-10-01 15:11 ` [PATCH 2/3] Debobs and ETK padconf implementation Peter 'p2' De Schrijver
@ 2008-10-01 15:11 ` Peter 'p2' De Schrijver
2008-10-07 10:42 ` [PATCH 2/3] Debobs and ETK padconf implementation Kevin Hilman
1 sibling, 0 replies; 7+ messages in thread
From: Peter 'p2' De Schrijver @ 2008-10-01 15:11 UTC (permalink / raw)
To: linux-omap; +Cc: Peter 'p2' De Schrijver
Signed-off-by: Peter 'p2' De Schrijver <peter.de-schrijver@nokia.com>
---
arch/arm/mach-omap2/Makefile | 3 +++
arch/arm/plat-omap/Kconfig | 7 +++++++
2 files changed, 10 insertions(+), 0 deletions(-)
diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile
index e18da0c..a30d5ff 100644
--- a/arch/arm/mach-omap2/Makefile
+++ b/arch/arm/mach-omap2/Makefile
@@ -40,6 +40,9 @@ obj-$(CONFIG_OMAP_MBOX_FWK) += mailbox_mach.o
mailbox_mach-objs := mailbox.o
mmu_mach-objs := mmu.o
+# Debobs
+obj-$(CONFIG_OMAP3_DEBOBS) += debobs.o
+
# Specific board support
obj-$(CONFIG_MACH_OMAP_GENERIC) += board-generic.o
obj-$(CONFIG_MACH_OMAP_H4) += board-h4.o board-h4-mmc.o
diff --git a/arch/arm/plat-omap/Kconfig b/arch/arm/plat-omap/Kconfig
index 960c13f..ebcfd27 100644
--- a/arch/arm/plat-omap/Kconfig
+++ b/arch/arm/plat-omap/Kconfig
@@ -205,6 +205,13 @@ config OMAP_32K_TIMER
endchoice
+config OMAP3_DEBOBS
+ bool "OMAP 3430 Debug observability support"
+ depends on ARCH_OMAP3 && DEBUG_FS
+ default n
+ help
+ Use ETK pads for debug observability
+
config OMAP_32K_TIMER_HZ
int "Kernel internal timer frequency for 32KHz timer"
range 32 1024
--
1.5.6.3
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH 2/3] Debobs and ETK padconf implementation
2008-10-01 15:11 ` [PATCH 2/3] Debobs and ETK padconf implementation Peter 'p2' De Schrijver
2008-10-01 15:11 ` [PATCH 3/3] Add debobs Kconfig item Peter 'p2' De Schrijver
@ 2008-10-07 10:42 ` Kevin Hilman
2008-10-07 10:59 ` Peter 'p2' De Schrijver
1 sibling, 1 reply; 7+ messages in thread
From: Kevin Hilman @ 2008-10-07 10:42 UTC (permalink / raw)
To: Peter 'p2' De Schrijver; +Cc: linux-omap
"Peter 'p2' De Schrijver" <peter.de-schrijver@nokia.com> writes:
> Signed-off-by: Peter 'p2' De Schrijver <peter.de-schrijver@nokia.com>
> ---
> arch/arm/mach-omap2/debobs.c | 239 ++++++++++++++++++++++++++++++
> arch/arm/plat-omap/include/mach/debobs.h | 7 +
> 2 files changed, 246 insertions(+), 0 deletions(-)
> create mode 100644 arch/arm/mach-omap2/debobs.c
> create mode 100644 arch/arm/plat-omap/include/mach/debobs.h
>
> diff --git a/arch/arm/mach-omap2/debobs.c b/arch/arm/mach-omap2/debobs.c
> new file mode 100644
> index 0000000..4fbabef
> --- /dev/null
> +++ b/arch/arm/mach-omap2/debobs.c
> @@ -0,0 +1,239 @@
> +/*
> + * arch/arm/mach-omap2/debobs.c
> + *
> + * Handle debobs pads
> + *
> + * Copyright (C) 2008 Nokia Corporation
> + *
> + * Written by Peter De Schrijver <peter.de-schrijver@nokia.com>
> + *
> + * This file is subject to the terms and conditions of the GNU General
> + * Public License. See the file "COPYING" in the main directory of this
> + * archive for more details.
> + *
> + * 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.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program; if not, write to the Free Software
> + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
> + */
> +
> +
> +#include <linux/kernel.h>
> +#include <linux/init.h>
> +#include <linux/debugfs.h>
> +#include <linux/uaccess.h>
> +#include <linux/module.h>
> +#include <mach/control.h>
> +#include <mach/mux.h>
> +#include <mach/gpio.h>
Use <linux/gpio.h> (See below)
> +#include <mach/board.h>
> +
> +#define ETK_GPIO_BEGIN 12
> +#define ETK_GPIO(i) (ETK_GPIO_BEGIN + i)
> +#define NUM_OF_DEBOBS_PADS 18
> +
> +static int debobs_initialized;
> +
> +enum debobs_pad_mode {
> + GPIO = 0,
> + OBS = 1,
> + ETK = 2,
> + NO_MODE = 3,
> +};
> +
> +static char *debobs_pad_mode_names[] = {
> + [GPIO] = "GPIO",
> + [OBS] = "OBS",
> + [ETK] = "ETK",
> +};
> +
> +struct obs {
> + u16 offset;
> + u8 value;
> + u8 mask;
> +};
> +
> +struct debobs_pad {
> + enum debobs_pad_mode mode;
> + struct obs core_obs;
> + struct obs wakeup_obs;
> +};
> +
> +static struct debobs_pad debobs_pads[NUM_OF_DEBOBS_PADS];
> +
> +static int debobs_mode_open(struct inode *inode, struct file *file)
> +{
> + file->private_data = inode->i_private;
> +
> + return 0;
> +}
> +
> +static ssize_t debobs_mode_read(struct file *file, char __user *user_buf,
> + size_t count, loff_t *ppos)
> +{
> + char buffer[10];
> + int size;
> + int pad_number = (int)file->private_data;
> + struct debobs_pad *e = &debobs_pads[pad_number];
> +
> + size = snprintf(buffer, sizeof(buffer), "%s\n",
> + debobs_pad_mode_names[e->mode]);
> + return simple_read_from_buffer(user_buf, count, ppos, buffer, size);
> +}
> +
> +static ssize_t debobs_mode_write(struct file *file, const char __user *user_buf,
> + size_t count, loff_t *ppos)
> +{
> + char buffer[10];
> + int buf_size, i, pad_number;
> + u16 muxmode = OMAP34XX_MUX_MODE7;
> +
> + memset(buffer, 0, sizeof(buffer));
> + buf_size = min(count, (sizeof(buffer)-1));
> +
> + if (copy_from_user(buffer, user_buf, buf_size))
> + return -EFAULT;
> +
> + pad_number = (int)file->private_data;
> +
> + for (i = 0; i < NO_MODE; i++) {
> + if (!strnicmp(debobs_pad_mode_names[i],
> + buffer,
> + strlen(debobs_pad_mode_names[i]))) {
> + switch (i) {
> + case ETK:
> + muxmode = OMAP34XX_MUX_MODE0;
> + break;
> + case GPIO:
> + muxmode = OMAP34XX_MUX_MODE4;
> + break;
> + case OBS:
> + muxmode = OMAP34XX_MUX_MODE7;
> + break;
> + }
> + omap_ctrl_writew(muxmode,
> + OMAP343X_PADCONF_ETK(pad_number));
> + debobs_pads[pad_number].mode = i;
> +
> + return count;
> + }
> + }
> +
> + return -EINVAL;
> +}
> +
> +static const struct file_operations debobs_mode_fops = {
> + .open = debobs_mode_open,
> + .read = debobs_mode_read,
> + .write = debobs_mode_write,
> +};
> +
> +static int debobs_get(void *data, u64 *val)
> +{
> + struct obs *o = data;
> +
> + *val = o->value;
> +
> + return 0;
> +}
> +
> +static int debobs_set(void *data, u64 val)
> +{
> + struct obs *o = data;
> +
> + val &= BIT(o->mask) - 1;
> +
> + omap_ctrl_writeb(val, o->offset);
> + o->value = val;
> +
> + return 0;
> +}
> +
> +DEFINE_SIMPLE_ATTRIBUTE(debobs_fops, debobs_get, debobs_set, "%llu\n");
> +
> +static inline int __init _new_debobs_pad(struct debobs_pad *pad, char *name,
> + int number, struct dentry *root)
> +{
> + struct dentry *d;
> + struct obs *o;
> +
> + d = debugfs_create_dir(name, root);
> + if (IS_ERR(d))
> + return PTR_ERR(d);
> +
> + omap_ctrl_writew(OMAP34XX_MUX_MODE4, OMAP343X_PADCONF_ETK(number));
> + gpio_direction_input(ETK_GPIO(number));
> + gpio_export(ETK_GPIO(number), 1);
> + (void) debugfs_create_file("mode", S_IRUGO | S_IWUGO, d,
> + (void *)number, &debobs_mode_fops);
> +
> + o = &pad->core_obs;
> + o->offset = OMAP343X_CONTROL_DEBOBS(number);
> + o->value = omap_ctrl_readw(o->offset);
> + o->mask = 7;
> + (void) debugfs_create_file("coreobs", S_IRUGO | S_IWUGO, d, o,
> + &debobs_fops);
> +
> + o = &pad->wakeup_obs;
> + o->offset = OMAP343X_CONTROL_WKUP_DEBOBSMUX(number);
> + o->value = omap_ctrl_readb(o->offset);
> + o->mask = 5;
> + (void) debugfs_create_file("wakeupobs", S_IRUGO | S_IWUGO, d, o,
> + &debobs_fops);
> +
> + return 0;
> +}
> +
> +/* Public functions */
> +
> +void debug_gpio_set(unsigned gpio, int value)
> +{
> + if (!debobs_initialized)
> + return ;
> +
> + WARN_ON(gpio >= NUM_OF_DEBOBS_PADS);
> + if (gpio < NUM_OF_DEBOBS_PADS)
> + __gpio_set_value(ETK_GPIO(gpio), value);
> +}
Intead of __gpio_set_value(), this should be
gpio_direction_output(ETK_GPIO(gpio), value);
Because otherwise, the default direction defaults to input.
> +int debug_gpio_get(unsigned gpio)
> +{
> + if (!debobs_initialized)
> + return -EINVAL;
> +
> + WARN_ON(gpio >= NUM_OF_DEBOBS_PADS);
> + if (gpio < NUM_OF_DEBOBS_PADS)
> + return __gpio_get_value(ETK_GPIO(gpio));
I thing this should just be gpio_get_value() (no underscores) and
then <linux/gpio.h> included. The OMAP-specific inlines will be used
anyways, so no need to use the __gpio* calls.
> +
> + return -EINVAL;
> +}
>
> +int __init init_debobs(void)
> +{
> + struct dentry *debobs_root;
> + int i, err;
> + char name[10];
> +
> + debobs_root = debugfs_create_dir("debobs", NULL);
> + if (IS_ERR(debobs_root))
> + return PTR_ERR(debobs_root);
> +
> + for (i = 0; i < NUM_OF_DEBOBS_PADS; i++) {
> + snprintf(name, sizeof(name), "hw_dbg%d", i);
> + if (!gpio_request(ETK_GPIO(i), name)) {
> + err = _new_debobs_pad(&debobs_pads[i], name, i,
> + debobs_root);
> + } else
> + gpio_free(ETK_GPIO(i));
> + }
> +
> + debobs_initialized = 1;
> +
> + return 0;
> +}
> +
> +late_initcall_sync(init_debobs);
> diff --git a/arch/arm/plat-omap/include/mach/debobs.h b/arch/arm/plat-omap/include/mach/debobs.h
> new file mode 100644
> index 0000000..67f765d
> --- /dev/null
> +++ b/arch/arm/plat-omap/include/mach/debobs.h
> @@ -0,0 +1,7 @@
> +#ifndef __DEBOBS_H
> +#define __DEBOBS_H
> +
> +void debug_gpio_set(unsigned gpio, int value);
> +int debug_gpio_get(unsigned gpio);
> +
> +#endif
> --
> 1.5.6.3
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-omap" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 2/3] Debobs and ETK padconf implementation
2008-10-07 10:42 ` [PATCH 2/3] Debobs and ETK padconf implementation Kevin Hilman
@ 2008-10-07 10:59 ` Peter 'p2' De Schrijver
0 siblings, 0 replies; 7+ messages in thread
From: Peter 'p2' De Schrijver @ 2008-10-07 10:59 UTC (permalink / raw)
To: ext Kevin Hilman; +Cc: linux-omap
>
> Intead of __gpio_set_value(), this should be
>
> gpio_direction_output(ETK_GPIO(gpio), value);
>
> Because otherwise, the default direction defaults to input.
>
Yes. The user should set the direction to output by himself. The idea is
that the kernel code should always be able to toggle the output value,
but the person debugging the system can still control if the GPIO value
is visible to the outside world or not. So I don't think the kernel
should force the direction, at least not implicitly.
> > +int debug_gpio_get(unsigned gpio)
> > +{
> > + if (!debobs_initialized)
> > + return -EINVAL;
> > +
> > + WARN_ON(gpio >= NUM_OF_DEBOBS_PADS);
> > + if (gpio < NUM_OF_DEBOBS_PADS)
> > + return __gpio_get_value(ETK_GPIO(gpio));
>
> I thing this should just be gpio_get_value() (no underscores) and
> then <linux/gpio.h> included. The OMAP-specific inlines will be used
> anyways, so no need to use the __gpio* calls.
>
There is only gpio_get_value_cansleep, while I want this functionality
to be always available, also in interrupthandlers. __gpio_get_value
warns if it would sleep.
Cheers,
Peter.
--
goa is a state of mind
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2008-10-07 11:00 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-10-01 15:11 [PATCH 0/3] debobs support for OMAP3430 Peter 'p2' De Schrijver
2008-10-01 15:11 ` [PATCH 1/3] Add definitions for ETK pads and debobs registers Peter 'p2' De Schrijver
2008-10-01 15:11 ` [PATCH 2/3] Debobs and ETK padconf implementation Peter 'p2' De Schrijver
2008-10-01 15:11 ` [PATCH 3/3] Add debobs Kconfig item Peter 'p2' De Schrijver
2008-10-07 10:42 ` [PATCH 2/3] Debobs and ETK padconf implementation Kevin Hilman
2008-10-07 10:59 ` Peter 'p2' De Schrijver
-- strict thread matches above, loose matches on Subject: below --
2008-09-16 11:24 [PATCH 0/3] debobs support for OMAP3430 Peter 'p2' De Schrijver
2008-09-16 11:24 ` [PATCH 1/3] Add definitions for ETK pads and debobs registers Peter 'p2' De Schrijver
2008-09-16 11:24 ` [PATCH 2/3] Debobs and ETK padconf implementation Peter 'p2' De Schrijver
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.