sde_vm_event.c 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2020, The Linux Foundation. All rights reserved.
  4. */
  5. #include <linux/sde_vm_event.h>
  6. #include "msm_drv.h"
  7. int msm_register_vm_event(struct device *dev, struct device *client_dev,
  8. struct msm_vm_ops *ops, void *priv_data)
  9. {
  10. struct platform_device *pdev = to_platform_device(dev);
  11. struct drm_device *ddev = platform_get_drvdata(pdev);
  12. struct msm_drm_private *priv = ddev->dev_private;
  13. struct msm_vm_client_entry *client_entry;
  14. if (!client_dev || !ops)
  15. return -EINVAL;
  16. client_entry = kzalloc(sizeof(*client_entry), GFP_KERNEL);
  17. if (!client_entry)
  18. return -ENOMEM;
  19. mutex_lock(&priv->vm_client_lock);
  20. memcpy(&client_entry->ops, ops, sizeof(*ops));
  21. client_entry->dev = client_dev;
  22. client_entry->data = priv_data;
  23. list_add(&client_entry->list, &priv->vm_client_list);
  24. mutex_unlock(&priv->vm_client_lock);
  25. return 0;
  26. }
  27. EXPORT_SYMBOL(msm_register_vm_event);
  28. void msm_unregister_vm_event(struct device *dev, struct device *client_dev)
  29. {
  30. struct platform_device *pdev = to_platform_device(dev);
  31. struct drm_device *ddev = platform_get_drvdata(pdev);
  32. struct msm_drm_private *priv = ddev->dev_private;
  33. struct msm_vm_client_entry *client_entry, *tmp;
  34. mutex_lock(&priv->vm_client_lock);
  35. list_for_each_entry_safe(client_entry, tmp, &priv->vm_client_list,
  36. list) {
  37. if (client_entry->dev == client_dev) {
  38. list_del(&client_entry->list);
  39. kfree(client_entry);
  40. break;
  41. }
  42. }
  43. mutex_unlock(&priv->vm_client_lock);
  44. }
  45. EXPORT_SYMBOL(msm_unregister_vm_event);