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 +#include + +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 , Trent Piepho "); 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 #define SUN8I_CODEC_ANALOG_BASE 0x1c0 -#define SUN8I_CODEC_ANALOG_SIZE 0x4 +#define SUN8I_CODEC_ANALOG_SIZE 0x10 struct prcm_data { int nsubdevs;