From ce53d65021b550e7ef1a3343da7f15663616012f Mon Sep 17 00:00:00 2001 From: Nirenjan Krishnan Date: Sat, 6 Oct 2012 00:08:49 -0700 Subject: [PATCH] Add blink LED support to driver This commit also takes care of removing the device files when the joystick is disconnected. Also, the line API files are renamed to mfd_line[123]. --- driver/x52joy.c | 87 ++++++++++++++++++++++++++++++++++++++---- driver/x52joy_common.h | 2 + 2 files changed, 81 insertions(+), 8 deletions(-) diff --git a/driver/x52joy.c b/driver/x52joy.c index 6f2b120..8f32d41 100644 --- a/driver/x52joy.c +++ b/driver/x52joy.c @@ -68,7 +68,7 @@ static ssize_t show_text_line(struct device *dev, char *buf, u8 line) return 0; } -static ssize_t set_text_line(struct device *dev, const char *buf,\ +static ssize_t set_text_line(struct device *dev, const char *buf, size_t count, u8 line) { struct usb_interface *intf = to_usb_interface(dev); @@ -110,7 +110,7 @@ static ssize_t set_text_line##no(struct device *dev, struct device_attribute *at { \ return set_text_line(dev, buf, count, no); \ } \ -static DEVICE_ATTR(line##no, S_IWUGO | S_IRUGO, show_text_line##no, set_text_line##no); +static DEVICE_ATTR(mfd_line##no, S_IWUGO | S_IRUGO, show_text_line##no, set_text_line##no); show_set_text(1); show_set_text(2); @@ -317,6 +317,49 @@ show_set_led(i_red); show_set_led(i_green); show_set_led(throttle); +/********************************************************************** + * Blink manipulation functions + *********************************************************************/ +static ssize_t show_blink(struct device *dev, struct device_attribute *attr, + char *buf) +{ + struct usb_interface *intf = to_usb_interface(dev); + struct x52_joy *joy = usb_get_intfdata(intf); + + if (joy->feat_led) { + return sprintf(buf, "%d\n", joy->blink_led); + } else { + sprintf(buf, "\n"); + return -EOPNOTSUPP; + } + return 0; +} + +static ssize_t set_x52_blink(struct device *dev, struct device_attribute *attr, + const char *buf, size_t count) +{ + struct usb_interface *intf = to_usb_interface(dev); + struct x52_joy *joy = usb_get_intfdata(intf); + int retval; + + if (!joy->feat_led) { + return -EOPNOTSUPP; + } + + if (count < 1 || buf[0] < '0' || buf[1] > '1') { + return -EINVAL; + } + + joy->blink_led = buf[0] - '0'; + + retval = set_blink(joy); + + CHECK_RETURN(retval, count); +} + + +static DEVICE_ATTR(led_blink, S_IWUGO | S_IRUGO, show_blink, set_x52_blink); + /********************************************************************** * X52 driver functions *********************************************************************/ @@ -342,9 +385,9 @@ static int x52_probe(struct usb_interface *intf, usb_set_intfdata(intf, joy); - device_create_file(&intf->dev, &dev_attr_line1); - device_create_file(&intf->dev, &dev_attr_line2); - device_create_file(&intf->dev, &dev_attr_line3); + device_create_file(&intf->dev, &dev_attr_mfd_line1); + device_create_file(&intf->dev, &dev_attr_mfd_line2); + device_create_file(&intf->dev, &dev_attr_mfd_line3); device_create_file(&intf->dev, &dev_attr_bri_mfd); device_create_file(&intf->dev, &dev_attr_bri_led); @@ -370,6 +413,8 @@ static int x52_probe(struct usb_interface *intf, device_create_file(&intf->dev, &dev_attr_led_i_green); device_create_file(&intf->dev, &dev_attr_led_throttle); + device_create_file(&intf->dev, &dev_attr_led_blink); + dev_info(&intf->dev, "X52 device now attached\n"); return 0; @@ -385,9 +430,35 @@ static void x52_disconnect(struct usb_interface *intf) joy = usb_get_intfdata(intf); usb_set_intfdata(intf, NULL); - device_remove_file(&intf->dev, &dev_attr_line1); - device_remove_file(&intf->dev, &dev_attr_line2); - device_remove_file(&intf->dev, &dev_attr_line3); + device_remove_file(&intf->dev, &dev_attr_mfd_line1); + device_remove_file(&intf->dev, &dev_attr_mfd_line2); + device_remove_file(&intf->dev, &dev_attr_mfd_line3); + + device_remove_file(&intf->dev, &dev_attr_bri_mfd); + device_remove_file(&intf->dev, &dev_attr_bri_led); + + device_remove_file(&intf->dev, &dev_attr_led_fire); + device_remove_file(&intf->dev, &dev_attr_led_a_red); + device_remove_file(&intf->dev, &dev_attr_led_a_green); + device_remove_file(&intf->dev, &dev_attr_led_b_red); + device_remove_file(&intf->dev, &dev_attr_led_b_green); + device_remove_file(&intf->dev, &dev_attr_led_d_red); + device_remove_file(&intf->dev, &dev_attr_led_d_green); + device_remove_file(&intf->dev, &dev_attr_led_e_red); + device_remove_file(&intf->dev, &dev_attr_led_e_green); + device_remove_file(&intf->dev, &dev_attr_led_t1_red); + device_remove_file(&intf->dev, &dev_attr_led_t1_green); + device_remove_file(&intf->dev, &dev_attr_led_t2_red); + device_remove_file(&intf->dev, &dev_attr_led_t2_green); + device_remove_file(&intf->dev, &dev_attr_led_t3_red); + device_remove_file(&intf->dev, &dev_attr_led_t3_green); + device_remove_file(&intf->dev, &dev_attr_led_pov_red); + device_remove_file(&intf->dev, &dev_attr_led_pov_green); + device_remove_file(&intf->dev, &dev_attr_led_i_red); + device_remove_file(&intf->dev, &dev_attr_led_i_green); + device_remove_file(&intf->dev, &dev_attr_led_throttle); + + device_remove_file(&intf->dev, &dev_attr_led_blink); usb_put_dev(joy->udev); kfree(joy); diff --git a/driver/x52joy_common.h b/driver/x52joy_common.h index edd6817..39fbc2b 100644 --- a/driver/x52joy_common.h +++ b/driver/x52joy_common.h @@ -80,5 +80,7 @@ int set_text(struct x52_joy *joy, u8 line_no); int set_brightness(struct x52_joy *joy, u8 target); int set_led(struct x52_joy *joy, u8 target); int set_date(struct x52_joy *joy); +int set_shift(struct x52_joy *joy); +int set_blink(struct x52_joy *joy); #endif /* !defined X52JOY_COMMON_H */