/* * Copyright (c) 2015 - 2016 DisplayLink (UK) Ltd. * * This file is subject to the terms and conditions of the GNU General Public * License v2. See the file COPYING in the main directory of this archive for * more details. */ #include "evdi_drv.h" static ssize_t frame_count_show(struct device *dev, __always_unused struct device_attribute *attr, char *buf) { struct drm_minor *drm_minor = dev_get_drvdata(dev); struct drm_device *drm_dev = drm_minor->dev; struct evdi_device *evdi = drm_dev->dev_private; return snprintf(buf, PAGE_SIZE, "%d\n", atomic_read(&evdi->frame_count)); } static struct device_attribute evdi_device_attributes[] = { __ATTR_RO(frame_count), }; void evdi_stats_init(struct evdi_device *evdi) { int i, retval; DRM_INFO("evdi: evdi_stats_init\n"); atomic_set(&evdi->frame_count, 0); for (i = 0; i < ARRAY_SIZE(evdi_device_attributes); i++) { retval = device_create_file(&evdi->ddev->primary->kdev, &evdi_device_attributes[i]); if (retval) DRM_ERROR("evdi: device_create_file failed %d\n", retval); } } void evdi_stats_cleanup(struct evdi_device *evdi) { int i; DRM_INFO("evdi: evdi_stats_cleanup\n"); for (i = 0; i < ARRAY_SIZE(evdi_device_attributes); i++) device_remove_file(&evdi->ddev->primary->kdev, &evdi_device_attributes[i]); }