+static ssize_t show_active_high_flag(struct device *dev, struct device_attribute *attr, char *buf)
+{
+ if (!gpio_evmi)
+ return -ENODEV;
+
+ return snprintf(buf, PAGE_SIZE, "%u\n", (gpio_evmi->flags & GPIOKPF_ACTIVE_HIGH) ? 1 : 0);
+}
+
+static ssize_t store_active_high_flag(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
+{
+ unsigned flag;
+ int i;
+
+ if (!gpio_evmi)
+ return -ENODEV;
+
+ sscanf(buf, "%u", &flag);
+
+ if (flag) {
+ gpio_evmi->flags |= GPIOKPF_ACTIVE_HIGH;
+ for (i = 0x7a; i <= 0x88; i += 2) {
+ __raw_writew(PADCONF_PULL_DOWN, OMAP_CTRL_REGADDR(i));
+ }
+ } else {
+ gpio_evmi->flags &= ~GPIOKPF_ACTIVE_HIGH;
+ for (i = 0x7a; i <= 0x88; i += 2) {
+ __raw_writew(PADCONF_PULL_UP, OMAP_CTRL_REGADDR(i));
+ }
+ }
+
+ set_irq_types();
+
+ return count;
+}
+
+static ssize_t show_level_triggered_irq_flag(struct device *dev, struct device_attribute *attr, char *buf)
+{
+ if (!gpio_evmi)
+ return -ENODEV;
+
+ return snprintf(buf, PAGE_SIZE, "%u\n", (gpio_evmi->flags & GPIOKPF_LEVEL_TRIGGERED_IRQ) ? 1 : 0);
+}
+
+static ssize_t store_level_triggered_irq_flag(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
+{
+ unsigned flag;
+
+ if (!gpio_evmi)
+ return -ENODEV;
+
+ sscanf(buf, "%u", &flag);
+
+ if (flag) {
+ gpio_evmi->flags |= GPIOKPF_LEVEL_TRIGGERED_IRQ;
+ } else {
+ gpio_evmi->flags &= ~GPIOKPF_LEVEL_TRIGGERED_IRQ;
+ }
+
+ set_irq_types();
+
+ return count;
+}
+
+static ssize_t show_drive_inactive_flag(struct device *dev, struct device_attribute *attr, char *buf)
+{
+ if (!gpio_evmi)
+ return -ENODEV;
+
+ return snprintf(buf, PAGE_SIZE, "%u\n", (gpio_evmi->flags & GPIOKPF_DRIVE_INACTIVE) ? 1 : 0);
+}
+
+static ssize_t store_drive_inactive_flag(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
+{
+ unsigned flag;
+
+ if (!gpio_evmi)
+ return -ENODEV;
+
+ sscanf(buf, "%u", &flag);
+
+ if (flag) {
+ gpio_evmi->flags |= GPIOKPF_DRIVE_INACTIVE;
+ } else {
+ gpio_evmi->flags &= ~GPIOKPF_DRIVE_INACTIVE;
+ }
+
+ return count;
+}
+
+static ssize_t show_hw_debounce(struct device *dev, struct device_attribute *attr, char *buf)
+{
+ return snprintf(buf, PAGE_SIZE, "%d\n", hw_debounce);
+}
+
+static ssize_t store_hw_debounce(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
+{
+ int enable;
+
+ sscanf(buf, "%d", &enable);
+
+ if (enable) {
+ hw_debounce_set(1, -1);
+ hw_debounce = 1;
+ }
+ else {
+ hw_debounce_set(-1, 0);
+ hw_debounce_set(0, -1);
+ hw_debounce = 0;
+ hw_debounce_time = 0;
+ }
+
+ return count;
+}
+
+static ssize_t show_hw_debounce_time(struct device *dev, struct device_attribute *attr, char *buf)
+{
+ return snprintf(buf, PAGE_SIZE, "%d\n", hw_debounce_time);
+}
+
+static ssize_t store_hw_debounce_time(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
+{
+ int time;
+
+ sscanf(buf, "%d", &time);
+
+ if ((time < 0) || (time > 0xff))
+ return count;
+
+ if (!hw_debounce)
+ return count;
+
+ hw_debounce_set(-1, time);
+ hw_debounce_time = time;
+
+ return count;
+}
+