gpios=<&gpio GPIOA_15 GPIO_ACTIVE_HIGH>;
default-state ="on";
};
+
+ remote_led {
+ label = "remote_led";
+ gpios = <&gpio_ao GPIOAO_10 GPIO_ACTIVE_LOW>;
+ default-state = "off";
+ linux,default-trigger = "rc_feedback";
+ };
};
cvbsout {
<0x0 0xff808000 0x00 0x20>; /*Legacy IR controller*/
status = "okay";
protocol = <REMOTE_TYPE_NEC>;
+ led_blink = <1>;
+ led_blink_frq = <100>;
interrupts = <0 196 1>;
pinctrl-names = "default";
pinctrl-0 = <&remote_pins>;
unsigned long flags;
u32 keycode;
+ if (dev->led_blink)
+ led_trigger_blink_oneshot(dev->led_feedback, &dev->delay_on,
+ &dev->delay_off, 0);
if (status != REMOTE_REPEAT) {
if (dev->is_valid_custom &&
#include <linux/kfifo.h>
#include <linux/device.h>
#include <dt-bindings/input/meson_rc.h>
+#include <linux/leds.h>
#define MULTI_IR_TYPE_MASK(type) (type & 0xff) /*8bit*/
#define LEGACY_IR_TYPE_MASK(type) ((type >> 8) & 0xff) /*8bit*/
struct remote_raw_handle *raw;
spinlock_t keylock;
+#define DEFAULT_LED_BLINK_FRQ 100
+ struct led_trigger *led_feedback;
+ unsigned long delay_on;
+ unsigned long delay_off;
+ int led_blink;
+
struct timer_list timer_keyup;
unsigned long keyup_jiffies;
unsigned long keyup_delay;
resource_size_t *res_start[2];
struct pinctrl *p;
int ret;
- int value;
+ int value = 0;
unsigned char i;
}
dev_info(chip->dev, "protocol = 0x%x\n", chip->protocol);
+ ret = of_property_read_u32(pdev->dev.of_node,
+ "led_blink", &chip->r_dev->led_blink);
+ if (ret) {
+ dev_err(chip->dev, "don't find the node <led_blink>\n");
+ chip->r_dev->led_blink = 0;
+ }
+ dev_info(chip->dev, "led_blink = %d\n", chip->r_dev->led_blink);
+
+ ret = of_property_read_u32(pdev->dev.of_node,
+ "led_blink_frq", &value);
+ if (ret) {
+ dev_err(chip->dev, "don't find the node <led_blink_frq>\n");
+ chip->r_dev->delay_on = DEFAULT_LED_BLINK_FRQ;
+ chip->r_dev->delay_off = DEFAULT_LED_BLINK_FRQ;
+ } else {
+ chip->r_dev->delay_off = value;
+ chip->r_dev->delay_on = value;
+ }
+ dev_info(chip->dev, "led_blink_frq = %ld\n", chip->r_dev->delay_on);
+
p = devm_pinctrl_get_select_default(&pdev->dev);
if (IS_ERR(p)) {
dev_err(chip->dev, "pinctrl error, %ld\n", PTR_ERR(p));
device_init_wakeup(&pdev->dev, 1);
dev_pm_set_wake_irq(&pdev->dev, chip->irqno);
+ led_trigger_register_simple("rc_feedback", &dev->led_feedback);
+
return 0;
error_register_remote:
tasklet_kill(&tasklet);
free_irq(chip->irqno, chip); /*irq dev_id is chip address*/
+ led_trigger_unregister_simple(chip->r_dev->led_feedback);
ir_cdev_free(chip);
remote_unregister_device(chip->r_dev);
remote_free_device(chip->r_dev);
return len;
}
+static ssize_t led_blink_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+
+ struct remote_chip *chip = dev_get_drvdata(dev);
+ struct remote_dev *r_dev = chip->r_dev;
+
+ return sprintf(buf, "%u\n", r_dev->led_blink);
+}
+
+static ssize_t led_blink_store(struct device *dev,
+ struct device_attribute *attr,
+ const char *buf, size_t count)
+{
+ int ret = 0;
+ int val = 0;
+
+ struct remote_chip *chip = dev_get_drvdata(dev);
+ struct remote_dev *r_dev = chip->r_dev;
+
+ ret = kstrtoint(buf, 0, &val);
+ if (ret != 0)
+ return -EINVAL;
+ r_dev->led_blink = val;
+ return count;
+}
+
+static ssize_t led_frq_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+
+ struct remote_chip *chip = dev_get_drvdata(dev);
+ struct remote_dev *r_dev = chip->r_dev;
+
+ return sprintf(buf, "%ld\n", r_dev->delay_on);
+}
+
+static ssize_t led_frq_store(struct device *dev,
+ struct device_attribute *attr,
+ const char *buf, size_t count)
+{
+ int ret = 0;
+ int val = 0;
+
+ struct remote_chip *chip = dev_get_drvdata(dev);
+ struct remote_dev *r_dev = chip->r_dev;
+
+ ret = kstrtoint(buf, 0, &val);
+ if (ret != 0)
+ return -EINVAL;
+ r_dev->delay_off = val;
+ r_dev->delay_on = val;
+ return count;
+}
+
+DEVICE_ATTR_RW(led_frq);
+DEVICE_ATTR_RW(led_blink);
DEVICE_ATTR_RW(repeat_enable);
DEVICE_ATTR_RW(protocol);
DEVICE_ATTR_RW(keymap);
&dev_attr_debug_enable.attr,
&dev_attr_repeat_enable.attr,
&dev_attr_debug_log.attr,
+ &dev_attr_led_blink.attr,
+ &dev_attr_led_frq.attr,
NULL,
};