diff options
Diffstat (limited to 'drivers/gpu/pvr/omaplfb/omaplfb-sysfs.c')
-rw-r--r-- | drivers/gpu/pvr/omaplfb/omaplfb-sysfs.c | 130 |
1 files changed, 130 insertions, 0 deletions
diff --git a/drivers/gpu/pvr/omaplfb/omaplfb-sysfs.c b/drivers/gpu/pvr/omaplfb/omaplfb-sysfs.c new file mode 100644 index 0000000..2e04583 --- /dev/null +++ b/drivers/gpu/pvr/omaplfb/omaplfb-sysfs.c @@ -0,0 +1,130 @@ +/* + * omaplfb-sysfs.c + * + * Copyright (C) 2011 Texas Instruments. + * + * This file is licensed under the terms of the GNU General Public License + * version 2. This program is licensed "as is" without any warranty of any + * kind, whether express or implied. + * + * Author: Gustavo Diaz (gusdp@ti.com) + * + */ + +#include <linux/version.h> +#include <linux/module.h> +#include <linux/sysfs.h> +#include <linux/platform_device.h> +#include <linux/device.h> +#include <linux/uaccess.h> + +#include "img_defs.h" +#include "servicesext.h" +#include "kerneldisplay.h" +#include "omaplfb.h" + +static ssize_t show_ignore_sync(OMAPLFB_DEVINFO *display_info, char *buf) +{ + return snprintf(buf, PAGE_SIZE, "%d\n", display_info->ignore_sync); +} + +static ssize_t store_ignore_sync(OMAPLFB_DEVINFO *display_info, + const char *buf, size_t count) +{ + unsigned long new_value; + + if (strict_strtoul(buf, 10, &new_value)) + return -EINVAL; + + if (new_value == 0 || new_value == 1) { + display_info->ignore_sync = new_value; + return count; + } + + return -EINVAL; +} + +struct omaplfb_attribute { + struct attribute attr; + ssize_t (*show)(OMAPLFB_DEVINFO *, char *); + ssize_t (*store)(OMAPLFB_DEVINFO *, const char *, size_t); +}; + +static ssize_t omaplfb_attr_show(struct kobject *kobj, struct attribute *attr, + char *buf) +{ + OMAPLFB_DEVINFO *display_info; + struct omaplfb_attribute *omaplfb_attr; + + display_info = container_of(kobj, OMAPLFB_DEVINFO, kobj); + omaplfb_attr = container_of(attr, struct omaplfb_attribute, attr); + + if (!omaplfb_attr->show) + return -ENOENT; + + return omaplfb_attr->show(display_info, buf); +} + +static ssize_t omaplfb_attr_store(struct kobject *kobj, struct attribute *attr, + const char *buf, size_t size) +{ + OMAPLFB_DEVINFO *display_info; + struct omaplfb_attribute *omaplfb_attr; + + display_info = container_of(kobj, OMAPLFB_DEVINFO, kobj); + omaplfb_attr = container_of(attr, struct omaplfb_attribute, attr); + + if (!omaplfb_attr->store) + return -ENOENT; + + return omaplfb_attr->store(display_info, buf, size); +} + +#define OMAPLFB_ATTR(_name, _mode, _show, _store) \ + struct omaplfb_attribute omaplfb_attr_##_name = \ + __ATTR(_name, _mode, _show, _store) + +static OMAPLFB_ATTR(ignore_sync, S_IRUGO|S_IWUSR, show_ignore_sync, + store_ignore_sync); + +#undef OMAPLFB_ATTR + +static struct attribute *omaplfb_sysfs_attrs[] = { + &omaplfb_attr_ignore_sync.attr, + NULL +}; + +static const struct sysfs_ops omaplfb_sysfs_ops = { + .show = omaplfb_attr_show, + .store = omaplfb_attr_store, +}; + +static struct kobj_type omaplfb_ktype = { + .sysfs_ops = &omaplfb_sysfs_ops, + .default_attrs = omaplfb_sysfs_attrs, +}; + +void omaplfb_create_sysfs(struct omaplfb_device *odev) +{ + int i, r; + + /* Create a sysfs entry for every display */ + for (i = 0; i < odev->display_count; i++) { + OMAPLFB_DEVINFO *display_info = &odev->display_info_list[i]; + r = kobject_init_and_add(&display_info->kobj, &omaplfb_ktype, + &odev->dev->kobj, "display%d", + display_info->uDeviceID); + if (r) + ERROR_PRINTK("failed to create sysfs file\n"); + } +} + +void omaplfb_remove_sysfs(struct omaplfb_device *odev) +{ + int i; + for (i = 0; i < odev->display_count; i++) { + OMAPLFB_DEVINFO *display_info = &odev->display_info_list[i]; + kobject_del(&display_info->kobj); + kobject_put(&display_info->kobj); + } +} |