keyboard-uclass.c 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Copyright (c) 2015 Google, Inc
  4. */
  5. #include <common.h>
  6. #include <dm.h>
  7. #include <keyboard.h>
  8. #include <log.h>
  9. static int keyboard_start(struct stdio_dev *sdev)
  10. {
  11. struct udevice *dev = sdev->priv;
  12. struct keyboard_ops *ops = keyboard_get_ops(dev);
  13. if (ops->start)
  14. return ops->start(dev);
  15. return 0;
  16. }
  17. static int keyboard_stop(struct stdio_dev *sdev)
  18. {
  19. struct udevice *dev = sdev->priv;
  20. struct keyboard_ops *ops = keyboard_get_ops(dev);
  21. if (ops->stop)
  22. return ops->stop(dev);
  23. return 0;
  24. }
  25. static int keyboard_tstc(struct stdio_dev *sdev)
  26. {
  27. struct udevice *dev = sdev->priv;
  28. struct keyboard_priv *priv = dev_get_uclass_priv(dev);
  29. struct keyboard_ops *ops = keyboard_get_ops(dev);
  30. /* Just get input to do this for us if we can */
  31. if (priv->input.dev)
  32. return input_tstc(&priv->input);
  33. else if (ops->tstc)
  34. return ops->tstc(dev);
  35. return -ENOSYS;
  36. }
  37. static int keyboard_getc(struct stdio_dev *sdev)
  38. {
  39. struct udevice *dev = sdev->priv;
  40. struct keyboard_priv *priv = dev_get_uclass_priv(dev);
  41. struct keyboard_ops *ops = keyboard_get_ops(dev);
  42. /* Just get input to do this for us if we can */
  43. if (priv->input.dev)
  44. return input_getc(&priv->input);
  45. else if (ops->getc)
  46. return ops->getc(dev);
  47. return -ENOSYS;
  48. }
  49. static int keyboard_pre_probe(struct udevice *dev)
  50. {
  51. struct keyboard_priv *priv = dev_get_uclass_priv(dev);
  52. struct stdio_dev *sdev = &priv->sdev;
  53. int ret;
  54. strlcpy(sdev->name, dev->name, sizeof(sdev->name));
  55. sdev->flags = DEV_FLAGS_INPUT;
  56. sdev->getc = keyboard_getc;
  57. sdev->tstc = keyboard_tstc;
  58. sdev->start = keyboard_start;
  59. sdev->stop = keyboard_stop;
  60. sdev->priv = dev;
  61. ret = input_init(&priv->input, 0);
  62. if (ret) {
  63. debug("%s: Cannot set up input, ret=%d - please add DEBUG to drivers/input/input.c to figure out the cause\n",
  64. __func__, ret);
  65. return ret;
  66. }
  67. return 0;
  68. }
  69. UCLASS_DRIVER(keyboard) = {
  70. .id = UCLASS_KEYBOARD,
  71. .name = "keyboard",
  72. .pre_probe = keyboard_pre_probe,
  73. .per_device_auto_alloc_size = sizeof(struct keyboard_priv),
  74. };