Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input
Pull input updates from Dmitry Torokhov: "First round of updates for the input subsystem. No new drivers here, just some driver fixes" * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input: Input: rotary-encoder - fix bare use of 'unsigned' Input: cm109 - spin_lock in complete() cleanup Input: cm109 - fix handling of volume and mute buttons Input: byd - don't wipe dynamically allocated memory twice Input: twl4030 - fix unsafe macro definition Input: twl6040-vibra - remove mutex Input: bcm_iproc_tsc - DT spelling s/clock-name/clock-names/ Input: bcm_iproc_tsc - use syscon to access shared registers Input: ti_am335x_tsc - use SIMPLE_DEV_PM_OPS Input: omap-keypad - remove set_col_gpio_val() and get_row_gpio_val() Input: omap-keypad - drop empty PM stubs Input: omap-keypad - remove adjusting of scan delay Input: gpio-keys - clean up device tree binding example Input: kbtab - stop saving struct usb_device Input: gtco - stop saving struct usb_device Input: aiptek - stop saving struct usb_device Input: acecad - stop saving struct usb_device
このコミットが含まれているのは:
@@ -76,8 +76,8 @@ enum {
|
||||
|
||||
BUZZER_ON = 1 << 5,
|
||||
|
||||
/* up to 256 normal keys, up to 16 special keys */
|
||||
KEYMAP_SIZE = 256 + 16,
|
||||
/* up to 256 normal keys, up to 15 special key combinations */
|
||||
KEYMAP_SIZE = 256 + 15,
|
||||
};
|
||||
|
||||
/* CM109 protocol packet */
|
||||
@@ -139,7 +139,7 @@ static unsigned short special_keymap(int code)
|
||||
{
|
||||
if (code > 0xff) {
|
||||
switch (code - 0xff) {
|
||||
case RECORD_MUTE: return KEY_MUTE;
|
||||
case RECORD_MUTE: return KEY_MICMUTE;
|
||||
case PLAYBACK_MUTE: return KEY_MUTE;
|
||||
case VOLUME_DOWN: return KEY_VOLUMEDOWN;
|
||||
case VOLUME_UP: return KEY_VOLUMEUP;
|
||||
@@ -312,6 +312,32 @@ static void report_key(struct cm109_dev *dev, int key)
|
||||
input_sync(idev);
|
||||
}
|
||||
|
||||
/*
|
||||
* Converts data of special key presses (volume, mute) into events
|
||||
* for the input subsystem, sends press-n-release for mute keys.
|
||||
*/
|
||||
static void cm109_report_special(struct cm109_dev *dev)
|
||||
{
|
||||
static const u8 autorelease = RECORD_MUTE | PLAYBACK_MUTE;
|
||||
struct input_dev *idev = dev->idev;
|
||||
u8 data = dev->irq_data->byte[HID_IR0];
|
||||
unsigned short keycode;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 4; i++) {
|
||||
keycode = dev->keymap[0xff + BIT(i)];
|
||||
if (keycode == KEY_RESERVED)
|
||||
continue;
|
||||
|
||||
input_report_key(idev, keycode, data & BIT(i));
|
||||
if (data & autorelease & BIT(i)) {
|
||||
input_sync(idev);
|
||||
input_report_key(idev, keycode, 0);
|
||||
}
|
||||
}
|
||||
input_sync(idev);
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
* CM109 usb communication interface
|
||||
*****************************************************************************/
|
||||
@@ -340,6 +366,7 @@ static void cm109_urb_irq_callback(struct urb *urb)
|
||||
struct cm109_dev *dev = urb->context;
|
||||
const int status = urb->status;
|
||||
int error;
|
||||
unsigned long flags;
|
||||
|
||||
dev_dbg(&dev->intf->dev, "### URB IRQ: [0x%02x 0x%02x 0x%02x 0x%02x] keybit=0x%02x\n",
|
||||
dev->irq_data->byte[0],
|
||||
@@ -357,10 +384,7 @@ static void cm109_urb_irq_callback(struct urb *urb)
|
||||
}
|
||||
|
||||
/* Special keys */
|
||||
if (dev->irq_data->byte[HID_IR0] & 0x0f) {
|
||||
const int code = (dev->irq_data->byte[HID_IR0] & 0x0f);
|
||||
report_key(dev, dev->keymap[0xff + code]);
|
||||
}
|
||||
cm109_report_special(dev);
|
||||
|
||||
/* Scan key column */
|
||||
if (dev->keybit == 0xf) {
|
||||
@@ -381,7 +405,7 @@ static void cm109_urb_irq_callback(struct urb *urb)
|
||||
|
||||
out:
|
||||
|
||||
spin_lock(&dev->ctl_submit_lock);
|
||||
spin_lock_irqsave(&dev->ctl_submit_lock, flags);
|
||||
|
||||
dev->irq_urb_pending = 0;
|
||||
|
||||
@@ -405,7 +429,7 @@ static void cm109_urb_irq_callback(struct urb *urb)
|
||||
__func__, error);
|
||||
}
|
||||
|
||||
spin_unlock(&dev->ctl_submit_lock);
|
||||
spin_unlock_irqrestore(&dev->ctl_submit_lock, flags);
|
||||
}
|
||||
|
||||
static void cm109_urb_ctl_callback(struct urb *urb)
|
||||
@@ -413,6 +437,7 @@ static void cm109_urb_ctl_callback(struct urb *urb)
|
||||
struct cm109_dev *dev = urb->context;
|
||||
const int status = urb->status;
|
||||
int error;
|
||||
unsigned long flags;
|
||||
|
||||
dev_dbg(&dev->intf->dev, "### URB CTL: [0x%02x 0x%02x 0x%02x 0x%02x]\n",
|
||||
dev->ctl_data->byte[0],
|
||||
@@ -427,7 +452,7 @@ static void cm109_urb_ctl_callback(struct urb *urb)
|
||||
__func__, status);
|
||||
}
|
||||
|
||||
spin_lock(&dev->ctl_submit_lock);
|
||||
spin_lock_irqsave(&dev->ctl_submit_lock, flags);
|
||||
|
||||
dev->ctl_urb_pending = 0;
|
||||
|
||||
@@ -448,7 +473,7 @@ static void cm109_urb_ctl_callback(struct urb *urb)
|
||||
}
|
||||
}
|
||||
|
||||
spin_unlock(&dev->ctl_submit_lock);
|
||||
spin_unlock_irqrestore(&dev->ctl_submit_lock, flags);
|
||||
}
|
||||
|
||||
static void cm109_toggle_buzzer_async(struct cm109_dev *dev)
|
||||
|
@@ -47,13 +47,13 @@ struct rotary_encoder {
|
||||
bool armed;
|
||||
signed char dir; /* 1 - clockwise, -1 - CCW */
|
||||
|
||||
unsigned last_stable;
|
||||
unsigned int last_stable;
|
||||
};
|
||||
|
||||
static unsigned rotary_encoder_get_state(struct rotary_encoder *encoder)
|
||||
static unsigned int rotary_encoder_get_state(struct rotary_encoder *encoder)
|
||||
{
|
||||
int i;
|
||||
unsigned ret = 0;
|
||||
unsigned int ret = 0;
|
||||
|
||||
for (i = 0; i < encoder->gpios->ndescs; ++i) {
|
||||
int val = gpiod_get_value_cansleep(encoder->gpios->desc[i]);
|
||||
@@ -100,7 +100,7 @@ static void rotary_encoder_report_event(struct rotary_encoder *encoder)
|
||||
static irqreturn_t rotary_encoder_irq(int irq, void *dev_id)
|
||||
{
|
||||
struct rotary_encoder *encoder = dev_id;
|
||||
unsigned state;
|
||||
unsigned int state;
|
||||
|
||||
mutex_lock(&encoder->access_mutex);
|
||||
|
||||
|
@@ -46,7 +46,7 @@ struct vibra_info {
|
||||
struct device *dev;
|
||||
struct input_dev *input_dev;
|
||||
struct work_struct play_work;
|
||||
struct mutex mutex;
|
||||
|
||||
int irq;
|
||||
|
||||
bool enabled;
|
||||
@@ -190,8 +190,6 @@ static void vibra_play_work(struct work_struct *work)
|
||||
return;
|
||||
}
|
||||
|
||||
mutex_lock(&info->mutex);
|
||||
|
||||
if (info->weak_speed || info->strong_speed) {
|
||||
if (!info->enabled)
|
||||
twl6040_vibra_enable(info);
|
||||
@@ -200,7 +198,6 @@ static void vibra_play_work(struct work_struct *work)
|
||||
} else if (info->enabled)
|
||||
twl6040_vibra_disable(info);
|
||||
|
||||
mutex_unlock(&info->mutex);
|
||||
}
|
||||
|
||||
static int vibra_play(struct input_dev *input, void *data,
|
||||
@@ -223,12 +220,8 @@ static void twl6040_vibra_close(struct input_dev *input)
|
||||
|
||||
cancel_work_sync(&info->play_work);
|
||||
|
||||
mutex_lock(&info->mutex);
|
||||
|
||||
if (info->enabled)
|
||||
twl6040_vibra_disable(info);
|
||||
|
||||
mutex_unlock(&info->mutex);
|
||||
}
|
||||
|
||||
static int __maybe_unused twl6040_vibra_suspend(struct device *dev)
|
||||
@@ -236,13 +229,11 @@ static int __maybe_unused twl6040_vibra_suspend(struct device *dev)
|
||||
struct platform_device *pdev = to_platform_device(dev);
|
||||
struct vibra_info *info = platform_get_drvdata(pdev);
|
||||
|
||||
mutex_lock(&info->mutex);
|
||||
cancel_work_sync(&info->play_work);
|
||||
|
||||
if (info->enabled)
|
||||
twl6040_vibra_disable(info);
|
||||
|
||||
mutex_unlock(&info->mutex);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -301,8 +292,6 @@ static int twl6040_vibra_probe(struct platform_device *pdev)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
mutex_init(&info->mutex);
|
||||
|
||||
error = devm_request_threaded_irq(&pdev->dev, info->irq, NULL,
|
||||
twl6040_vib_irq_handler,
|
||||
IRQF_ONESHOT,
|
||||
|
新しいイシューから参照
ユーザーをブロックする