keyboard-uclass.c 2.0 KB

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