struct input_dev *idev;
struct chromeos_ec_device *ec;
struct notifier_block notifier;
- struct work_struct work;
};
{
struct mkbp_device *mkbp_dev = input_get_drvdata(dev);
- return atomic_notifier_chain_register(&mkbp_dev->ec->event_notifier,
- &mkbp_dev->notifier);
+ return blocking_notifier_chain_register(&mkbp_dev->ec->event_notifier,
+ &mkbp_dev->notifier);
}
static void mkbp_close(struct input_dev *dev)
{
struct mkbp_device *mkbp_dev = input_get_drvdata(dev);
- atomic_notifier_chain_unregister(&mkbp_dev->ec->event_notifier,
- &mkbp_dev->notifier);
+ blocking_notifier_chain_unregister(&mkbp_dev->ec->event_notifier,
+ &mkbp_dev->notifier);
}
-static void mkbp_work(struct work_struct *work)
+static int mkbp_work(struct notifier_block *nb,
+ unsigned long state, void *_notify)
{
int ret;
- struct mkbp_device *mkbp_dev =
- container_of(work, struct mkbp_device, work);
+ struct mkbp_device *mkbp_dev = container_of(nb, struct mkbp_device,
+ notifier);
uint8_t kb_state[MKBP_NUM_COLS];
ret = mkbp_dev->ec->send_command(mkbp_dev->ec, MKBP_CMDC_KEY_STATE,
kb_state, MKBP_NUM_COLS);
if (ret >= 0)
mkbp_process(mkbp_dev, kb_state, ret);
-}
-
-static int mkbp_notify(struct notifier_block *nb,
- unsigned long state, void *_notify)
-{
- struct mkbp_device *mkbp_dev = container_of(nb, struct mkbp_device,
- notifier);
-
- schedule_work(&mkbp_dev->work);
return NOTIFY_DONE;
}
}
mkbp_dev->ec = ec;
- mkbp_dev->notifier.notifier_call = mkbp_notify;
+ mkbp_dev->notifier.notifier_call = mkbp_work;
mkbp_dev->dev = dev;
- INIT_WORK(&mkbp_dev->work, &mkbp_work);
-
idev->name = ec->client->name;
idev->phys = ec->client->adapter->name;
idev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REP);
return ret;
}
-static irqreturn_t mkbp_isr(int irq, void *data)
+static irqreturn_t ec_irq_thread(int irq, void *data)
{
struct chromeos_ec_device *ec = data;
- atomic_notifier_call_chain(&ec->event_notifier, 1, ec);
+ blocking_notifier_call_chain(&ec->event_notifier, 1, ec);
return IRQ_HANDLED;
}
ec_dev->irq = client->irq;
ec_dev->send_command = mkbp_command;
- ATOMIC_INIT_NOTIFIER_HEAD(&ec_dev->event_notifier);
+ BLOCKING_INIT_NOTIFIER_HEAD(&ec_dev->event_notifier);
- err = request_irq(ec_dev->irq, mkbp_isr,
- IRQF_TRIGGER_FALLING, "chromeos-ec", ec_dev);
+ err = request_threaded_irq(ec_dev->irq, NULL, ec_irq_thread,
+ IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
+ "chromeos-ec", ec_dev);
if (err) {
dev_err(dev, "request irq %d: error %d\n", ec_dev->irq, err);
goto fail;