diff --git a/drivers/input/misc/axp20x-pek.c b/drivers/input/misc/axp20x-pek.c
index 9c6386b2af33..6cf1ddda0788 100644
--- a/drivers/input/misc/axp20x-pek.c
+++ b/drivers/input/misc/axp20x-pek.c
@@ -215,10 +215,13 @@ static irqreturn_t axp20x_pek_irq(int irq, void *pwr)
 	 * The power-button is connected to ground so a falling edge (dbf)
 	 * means it is pressed.
 	 */
-	if (irq == axp20x_pek->irq_dbf)
+	if (irq == axp20x_pek->irq_dbf) {
 		input_report_key(idev, KEY_POWER, true);
-	else if (irq == axp20x_pek->irq_dbr)
+		msleep(100);
 		input_report_key(idev, KEY_POWER, false);
+	}
+	else if (irq == axp20x_pek->irq_dbr) {
+	}
 
 	input_sync(idev);
 
diff --git a/drivers/leds/leds-gpio.c b/drivers/leds/leds-gpio.c
index 092eb59a7d32..00ab1f315f6b 100644
--- a/drivers/leds/leds-gpio.c
+++ b/drivers/leds/leds-gpio.c
@@ -26,6 +26,8 @@ struct gpio_led_data {
 	gpio_blink_set_t platform_gpio_blink_set;
 };
 
+static int leds_gpio_proc_init(const char *name);
+
 static inline struct gpio_led_data *
 			cdev_to_gpio_led_data(struct led_classdev *led_cdev)
 {
@@ -119,6 +121,8 @@ static int create_gpio_led(const struct gpio_led *template,
 						     &init_data);
 	}
 
+	leds_gpio_proc_init(led_dat->cdev.name);
+
 	return ret;
 }
 
@@ -127,6 +131,8 @@ struct gpio_leds_priv {
 	struct gpio_led_data leds[];
 };
 
+static struct gpio_leds_priv *leds_priv;
+
 static struct gpio_leds_priv *gpio_leds_create(struct platform_device *pdev)
 {
 	struct device *dev = &pdev->dev;
@@ -181,6 +187,7 @@ static struct gpio_leds_priv *gpio_leds_create(struct platform_device *pdev)
 		priv->num_leds++;
 	}
 
+	leds_priv = priv;
 	return priv;
 }
 
@@ -307,6 +314,82 @@ static struct platform_driver gpio_led_driver = {
 
 module_platform_driver(gpio_led_driver);
 
+#ifdef CONFIG_PROC_FS
+
+#include <linux/proc_fs.h>
+#include <linux/uaccess.h>
+
+static char global_buffer[64];
+
+static int leds_gpio_proc_show(struct seq_file *m, void *v)
+{
+	seq_printf(m, "leds_gpio\n");
+	return 0;
+}
+
+static int leds_gpio_proc_open(struct inode *inode, struct file *file)
+{
+	return single_open(file, leds_gpio_proc_show, NULL);
+}
+
+static int leds_gpio_proc_read(struct file * file, char __user * buf, size_t size, loff_t * loff)
+{
+	int value, len, i;
+
+	for(i = 0; i < leds_priv->num_leds; i++) {
+		if(strcmp(leds_priv->leds[i].cdev.name, file->f_path.dentry->d_iname) == 0) {
+			value = leds_priv->leds[i].cdev.brightness;
+			len = snprintf(global_buffer, sizeof(global_buffer), "%d\n", value);
+			return simple_read_from_buffer(buf, size, loff, global_buffer, len);
+		}
+	}
+
+	return 0;
+}
+
+static int leds_gpio_proc_write(struct file * file, const char __user * buf, size_t size, loff_t * loff)
+{
+	int value, i;
+
+	if(copy_from_user(global_buffer, buf, size))
+		return -EFAULT;
+
+	global_buffer[size] = 0;
+	for(i = 0; i < leds_priv->num_leds; i++) {
+		if(strcmp(leds_priv->leds[i].cdev.name, file->f_path.dentry->d_iname) == 0) {
+			value = simple_strtol(global_buffer, 0, 10);
+			gpio_led_set(&leds_priv->leds[i].cdev, value);
+			leds_priv->leds[i].cdev.brightness = value;
+			break;
+		}
+	}
+
+	return size;
+}
+
+static const struct proc_ops leds_gpio_proc_fops = {
+	.proc_open		= leds_gpio_proc_open,
+	.proc_read		= leds_gpio_proc_read,
+	.proc_write		= leds_gpio_proc_write,
+	.proc_lseek		= seq_lseek,
+	.proc_release	= single_release,
+};
+
+static int leds_gpio_proc_init(const char *name)
+{
+	struct proc_dir_entry *r;
+	char buf[50];
+
+	sprintf(buf, "driver/%s", name);
+	r = proc_create(buf, S_IRWXUGO, NULL, &leds_gpio_proc_fops);
+	if (!r)
+		return -ENOMEM;
+	return 0;
+}
+#else
+static inline int leds_gpio_proc_init(const char *name) { return 0; }
+#endif /* CONFIG_PROC_FS */
+
 MODULE_AUTHOR("Raphael Assenat <raph@8d.com>, Trent Piepho <tpiepho@freescale.com>");
 MODULE_DESCRIPTION("GPIO LED driver");
 MODULE_LICENSE("GPL");
diff --git a/drivers/mfd/axp20x.c b/drivers/mfd/axp20x.c
index 8161a5dc68e8..3b342db209dc 100644
--- a/drivers/mfd/axp20x.c
+++ b/drivers/mfd/axp20x.c
@@ -203,8 +203,8 @@ static const struct resource axp803_usb_power_supply_resources[] = {
 };
 
 static const struct resource axp22x_pek_resources[] = {
-	DEFINE_RES_IRQ_NAMED(AXP22X_IRQ_PEK_RIS_EDGE, "PEK_DBR"),
-	DEFINE_RES_IRQ_NAMED(AXP22X_IRQ_PEK_FAL_EDGE, "PEK_DBF"),
+	DEFINE_RES_IRQ_NAMED(AXP22X_IRQ_PEK_SHORT, "PEK_DBR"),
+	DEFINE_RES_IRQ_NAMED(AXP22X_IRQ_PEK_LONG, "PEK_DBF"),
 };
 
 static const struct resource axp288_power_button_resources[] = {
diff --git a/drivers/mfd/sun6i-prcm.c b/drivers/mfd/sun6i-prcm.c
index ee03db0b8485..a8c833df4f05 100644
--- a/drivers/mfd/sun6i-prcm.c
+++ b/drivers/mfd/sun6i-prcm.c
@@ -12,7 +12,7 @@
 #include <linux/of.h>
 
 #define SUN8I_CODEC_ANALOG_BASE	0x1c0
-#define SUN8I_CODEC_ANALOG_SIZE	0x4
+#define SUN8I_CODEC_ANALOG_SIZE	0x10
 
 struct prcm_data {
 	int nsubdevs;
