video: rockchip: edp: add support connect to vopl
[firefly-linux-kernel-4.4.55.git] / drivers / video / rockchip / display-sys.c
old mode 100755 (executable)
new mode 100644 (file)
index 408e986..4d9e667
@@ -8,32 +8,38 @@
 static struct list_head main_display_device_list;
 static struct list_head aux_display_device_list;
 
-static ssize_t display_show_name(struct device *dev,
-                                struct device_attribute *attr, char *buf)
+static ssize_t name_show(struct device *dev,
+                        struct device_attribute *attr, char *buf)
 {
        struct rk_display_device *dsp = dev_get_drvdata(dev);
 
        return snprintf(buf, PAGE_SIZE, "%s\n", dsp->name);
 }
 
-static ssize_t display_show_type(struct device *dev,
-                                struct device_attribute *attr, char *buf)
+static DEVICE_ATTR_RO(name);
+
+static ssize_t type_show(struct device *dev,
+                        struct device_attribute *attr, char *buf)
 {
        struct rk_display_device *dsp = dev_get_drvdata(dev);
 
        return snprintf(buf, PAGE_SIZE, "%s\n", dsp->type);
 }
 
-static ssize_t display_show_property(struct device *dev,
-                                    struct device_attribute *attr, char *buf)
+static DEVICE_ATTR_RO(type);
+
+static ssize_t property_show(struct device *dev,
+                            struct device_attribute *attr, char *buf)
 {
        struct rk_display_device *dsp = dev_get_drvdata(dev);
 
        return snprintf(buf, PAGE_SIZE, "%d\n", dsp->property);
 }
 
-static ssize_t display_show_enable(struct device *dev,
-                                  struct device_attribute *attr, char *buf)
+static DEVICE_ATTR_RO(property);
+
+static ssize_t enable_show(struct device *dev,
+                          struct device_attribute *attr, char *buf)
 {
        struct rk_display_device *dsp = dev_get_drvdata(dev);
        int enable;
@@ -45,9 +51,9 @@ static ssize_t display_show_enable(struct device *dev,
        return snprintf(buf, PAGE_SIZE, "%d\n", enable);
 }
 
-static ssize_t display_store_enable(struct device *dev,
-                                   struct device_attribute *attr,
-                                   const char *buf, size_t size)
+static ssize_t enable_store(struct device *dev,
+                           struct device_attribute *attr,
+                           const char *buf, size_t size)
 {
        struct rk_display_device *dsp = dev_get_drvdata(dev);
        int enable;
@@ -59,8 +65,10 @@ static ssize_t display_store_enable(struct device *dev,
        return size;
 }
 
-static ssize_t display_show_connect(struct device *dev,
-                                   struct device_attribute *attr, char *buf)
+static DEVICE_ATTR_RW(enable);
+
+static ssize_t connect_show(struct device *dev,
+                           struct device_attribute *attr, char *buf)
 {
        struct rk_display_device *dsp = dev_get_drvdata(dev);
        int connect;
@@ -72,6 +80,8 @@ static ssize_t display_show_connect(struct device *dev,
        return snprintf(buf, PAGE_SIZE, "%d\n", connect);
 }
 
+static DEVICE_ATTR_RO(connect);
+
 static int mode_string(char *buf, unsigned int offset,
                       const struct fb_videomode *mode)
 {
@@ -83,14 +93,6 @@ static int mode_string(char *buf, unsigned int offset,
        }
        if (mode->xres == 0 && mode->yres == 0)
                return snprintf(&buf[offset], PAGE_SIZE - offset, "auto\n");
-/*
-       if (mode->flag & FB_MODE_IS_DETAILED)
-               m = 'D';
-       if (mode->flag & FB_MODE_IS_VESA)
-               m = 'V';
-       if (mode->flag & FB_MODE_IS_STANDARD)
-               m = 'S';
-*/
        if (mode->vmode & FB_VMODE_INTERLACED)
                v = 'i';
        if (mode->vmode & FB_VMODE_DOUBLE)
@@ -105,8 +107,8 @@ static int mode_string(char *buf, unsigned int offset,
                                mode->xres, mode->yres, v, mode->refresh);
 }
 
-static ssize_t display_show_modes(struct device *dev,
-                                 struct device_attribute *attr, char *buf)
+static ssize_t modes_show(struct device *dev,
+                         struct device_attribute *attr, char *buf)
 {
        struct rk_display_device *dsp = dev_get_drvdata(dev);
        struct list_head *modelist, *pos;
@@ -139,8 +141,10 @@ static ssize_t display_show_modes(struct device *dev,
        return i;
 }
 
-static ssize_t display_show_mode(struct device *dev,
-                                struct device_attribute *attr, char *buf)
+static DEVICE_ATTR_RO(modes);
+
+static ssize_t mode_show(struct device *dev,
+                        struct device_attribute *attr, char *buf)
 {
        struct rk_display_device *dsp = dev_get_drvdata(dev);
        struct fb_videomode mode;
@@ -151,9 +155,9 @@ static ssize_t display_show_mode(struct device *dev,
        return 0;
 }
 
-static ssize_t display_store_mode(struct device *dev,
-                                 struct device_attribute *attr,
-                                 const char *buf, size_t count)
+static ssize_t mode_store(struct device *dev,
+                         struct device_attribute *attr,
+                         const char *buf, size_t count)
 {
        struct rk_display_device *dsp = dev_get_drvdata(dev);
        char mstr[100];
@@ -195,9 +199,11 @@ static ssize_t display_store_mode(struct device *dev,
        return -EINVAL;
 }
 
-static ssize_t display_show_scale(struct device *dev,
-                                 struct device_attribute *attr,
-                                 char *buf)
+static DEVICE_ATTR_RW(mode);
+
+static ssize_t scale_show(struct device *dev,
+                         struct device_attribute *attr,
+                         char *buf)
 {
        struct rk_display_device *dsp = dev_get_drvdata(dev);
        int xscale, yscale;
@@ -213,9 +219,9 @@ static ssize_t display_show_scale(struct device *dev,
        return -EINVAL;
 }
 
-static ssize_t display_store_scale(struct device *dev,
-                                  struct device_attribute *attr,
-                                  const char *buf, size_t count)
+static ssize_t scale_store(struct device *dev,
+                          struct device_attribute *attr,
+                          const char *buf, size_t count)
 {
        struct rk_display_device *dsp = dev_get_drvdata(dev);
        int scale = 100;
@@ -246,8 +252,10 @@ static ssize_t display_store_scale(struct device *dev,
        return -EINVAL;
 }
 
-static ssize_t display_show_3dmode(struct device *dev,
-                                  struct device_attribute *attr, char *buf)
+static DEVICE_ATTR_RW(scale);
+
+static ssize_t mode3d_show(struct device *dev,
+                          struct device_attribute *attr, char *buf)
 {
        struct rk_display_device *dsp = dev_get_drvdata(dev);
        struct list_head *modelist, *pos;
@@ -282,10 +290,10 @@ static ssize_t display_show_3dmode(struct device *dev,
                display_modelist = list_entry(pos,
                                              struct display_modelist,
                                              list);
-               if (fb_mode_is_equal(&mode, &display_modelist->mode))
-                       break;
-               else
+               if (!fb_mode_is_equal(&mode, &display_modelist->mode))
                        display_modelist = NULL;
+               else
+                       break;
        }
        if (display_modelist)
                i = snprintf(buf, PAGE_SIZE, "3dmodes=%d\n",
@@ -302,19 +310,19 @@ static ssize_t display_show_3dmode(struct device *dev,
                                              struct display_modelist,
                                              list);
                mode_strlen = mode_string(mode_str, 0,
-                                         &(display_modelist->mode));
-               mode_str[mode_strlen-1] = 0;
+                                         &display_modelist->mode);
+               mode_str[mode_strlen - 1] = 0;
                format_3d = display_modelist->format_3d;
-               i += snprintf(buf+i, PAGE_SIZE, "%s,%d\n",
+               i += snprintf(buf + i, PAGE_SIZE, "%s,%d\n",
                              mode_str, format_3d);
        }
        mutex_unlock(&dsp->lock);
        return i;
 }
 
-static ssize_t display_store_3dmode(struct device *dev,
-                                   struct device_attribute *attr,
-                                   const char *buf, size_t count)
+static ssize_t mode3d_store(struct device *dev,
+                           struct device_attribute *attr,
+                           const char *buf, size_t count)
 {
        struct rk_display_device *dsp = dev_get_drvdata(dev);
        int mode;
@@ -330,8 +338,10 @@ static ssize_t display_store_3dmode(struct device *dev,
        return -EINVAL;
 }
 
-static ssize_t display_show_color(struct device *dev,
-                                 struct device_attribute *attr, char *buf)
+static DEVICE_ATTR_RW(mode3d);
+
+static ssize_t color_show(struct device *dev,
+                         struct device_attribute *attr, char *buf)
 {
        struct rk_display_device *dsp = dev_get_drvdata(dev);
        int ret = 0;
@@ -343,9 +353,9 @@ static ssize_t display_show_color(struct device *dev,
        return ret;
 }
 
-static ssize_t display_store_color(struct device *dev,
-                                  struct device_attribute *attr,
-                                  const char *buf, size_t count)
+static ssize_t color_store(struct device *dev,
+                          struct device_attribute *attr,
+                          const char *buf, size_t count)
 {
        struct rk_display_device *dsp = dev_get_drvdata(dev);
 
@@ -360,9 +370,11 @@ static ssize_t display_store_color(struct device *dev,
        return -EINVAL;
 }
 
-static ssize_t display_show_sinkaudioinfo(struct device *dev,
-                                         struct device_attribute *attr,
-                                         char *buf)
+static DEVICE_ATTR_RW(color);
+
+static ssize_t audioinfo_show(struct device *dev,
+                             struct device_attribute *attr,
+                             char *buf)
 {
        struct rk_display_device *dsp = dev_get_drvdata(dev);
        char audioinfo[200];
@@ -380,8 +392,10 @@ static ssize_t display_show_sinkaudioinfo(struct device *dev,
        return -EINVAL;
 }
 
-static ssize_t display_show_monspecs(struct device *dev,
-                                    struct device_attribute *attr, char *buf)
+static DEVICE_ATTR_RO(audioinfo);
+
+static ssize_t monspecs_show(struct device *dev,
+                            struct device_attribute *attr, char *buf)
 {
        struct rk_display_device *dsp = dev_get_drvdata(dev);
        struct fb_monspecs monspecs;
@@ -400,8 +414,10 @@ static ssize_t display_show_monspecs(struct device *dev,
        return -EINVAL;
 }
 
-static ssize_t display_show_debug(struct device *dev,
-                                 struct device_attribute *attr, char *buf)
+static DEVICE_ATTR_RO(monspecs);
+
+static ssize_t debug_show(struct device *dev,
+                         struct device_attribute *attr, char *buf)
 {
        struct rk_display_device *dsp = dev_get_drvdata(dev);
        int ret = -EINVAL;
@@ -413,9 +429,9 @@ static ssize_t display_show_debug(struct device *dev,
        return ret;
 }
 
-static ssize_t display_store_debug(struct device *dev,
-                                  struct device_attribute *attr,
-                                  const char *buf, size_t count)
+static ssize_t debug_store(struct device *dev,
+                          struct device_attribute *attr,
+                          const char *buf, size_t count)
 {
        int cmd, ret = -EINVAL;
        struct rk_display_device *dsp = dev_get_drvdata(dev);
@@ -430,23 +446,27 @@ static ssize_t display_store_debug(struct device *dev,
        return ret;
 }
 
-static struct device_attribute display_attrs[] = {
-       __ATTR(name, S_IRUGO, display_show_name, NULL),
-       __ATTR(type, S_IRUGO, display_show_type, NULL),
-       __ATTR(property, S_IRUGO, display_show_property, NULL),
-       __ATTR(enable, 0666, display_show_enable, display_store_enable),
-       __ATTR(connect, S_IRUGO, display_show_connect, NULL),
-       __ATTR(modes, S_IRUGO, display_show_modes, NULL),
-       __ATTR(mode, 0666, display_show_mode, display_store_mode),
-       __ATTR(scale, 0666, display_show_scale, display_store_scale),
-       __ATTR(3dmode, 0666, display_show_3dmode, display_store_3dmode),
-       __ATTR(color, 0666, display_show_color, display_store_color),
-       __ATTR(audioinfo, S_IRUGO, display_show_sinkaudioinfo, NULL),
-       __ATTR(monspecs, S_IRUGO, display_show_monspecs, NULL),
-       __ATTR(debug, 0664, display_show_debug, display_store_debug),
-       __ATTR_NULL
+static DEVICE_ATTR_RW(debug);
+
+static struct attribute *display_device_attrs[] = {
+       &dev_attr_name.attr,
+       &dev_attr_type.attr,
+       &dev_attr_property.attr,
+       &dev_attr_enable.attr,
+       &dev_attr_connect.attr,
+       &dev_attr_modes.attr,
+       &dev_attr_mode.attr,
+       &dev_attr_scale.attr,
+       &dev_attr_mode3d.attr,
+       &dev_attr_color.attr,
+       &dev_attr_audioinfo.attr,
+       &dev_attr_monspecs.attr,
+       &dev_attr_debug.attr,
+       NULL,
 };
 
+ATTRIBUTE_GROUPS(display_device);
+
 static int display_suspend(struct device *dev, pm_message_t state)
 {
        struct rk_display_device *dsp = dev_get_drvdata(dev);
@@ -519,7 +539,7 @@ void rk_display_device_enable(struct rk_display_device *ddev)
                        dev_enabled = dev;
        }
        /* If no device is connected, enable highest priority device. */
-       if (dev_enable == NULL) {
+       if (!dev_enable) {
                dev->ops->setenable(dev, 1);
                return;
        }
@@ -649,10 +669,31 @@ struct rk_display_device
                mutex_unlock(&allocated_dsp_lock);
 
                if (new_dev->idx >= 0) {
-                       new_dev->dev =
-                       device_create(display_class, parent,
-                                     MKDEV(0, 0), new_dev,
-                                     "%s", new_dev->type);
+                       struct list_head *pos, *head;
+                       struct rk_display_device *dev;
+                       int i = 0;
+
+                       head = &main_display_device_list;
+                       list_for_each_entry(dev, head, list) {
+                               if (strcmp(dev->type, new_dev->type) == 0)
+                                       i++;
+                       }
+                       head = &aux_display_device_list;
+                       list_for_each_entry(dev, head, list) {
+                               if (strcmp(dev->type, new_dev->type) == 0)
+                                       i++;
+                       }
+                       if (i == 0)
+                               new_dev->dev =
+                               device_create(display_class, parent,
+                                             MKDEV(0, 0), new_dev,
+                                             "%s", new_dev->type);
+                       else
+                               new_dev->dev =
+                               device_create(display_class, parent,
+                                             MKDEV(0, 0), new_dev,
+                                             "%s%d", new_dev->type, i);
+
                        if (!IS_ERR(new_dev->dev)) {
                                new_dev->parent = parent;
                                new_dev->driver = driver;
@@ -660,10 +701,6 @@ struct rk_display_device
                                        new_dev->dev->driver = parent->driver;
                                mutex_init(&new_dev->lock);
                                /* Add new device to display device list. */
-                               {
-                               struct list_head *pos, *head;
-                               struct rk_display_device *dev;
-
                                if (new_dev->property == DISPLAY_MAIN)
                                        head = &main_display_device_list;
                                else
@@ -679,7 +716,6 @@ struct rk_display_device
                                }
                                list_add_tail(&new_dev->list, pos);
                                return new_dev;
-                               }
                        }
                        mutex_lock(&allocated_dsp_lock);
                        idr_remove(&allocated_dsp, new_dev->idx);
@@ -700,7 +736,7 @@ void rk_display_device_unregister(struct rk_display_device *ddev)
        mutex_lock(&ddev->lock);
        device_unregister(ddev->dev);
        mutex_unlock(&ddev->lock);
-       /* Mark device index as avaliable */
+       /* Mark device index as available */
        mutex_lock(&allocated_dsp_lock);
        idr_remove(&allocated_dsp, ddev->idx);
        mutex_unlock(&allocated_dsp_lock);
@@ -717,7 +753,7 @@ static int __init rk_display_class_init(void)
                display_class = NULL;
                return -EINVAL;
        }
-       display_class->dev_attrs = display_attrs;
+       display_class->dev_groups = display_device_groups;
        display_class->suspend = display_suspend;
        display_class->resume = display_resume;
        mutex_init(&allocated_dsp_lock);
@@ -734,7 +770,6 @@ static void __exit rk_display_class_exit(void)
 subsys_initcall(rk_display_class_init);
 module_exit(rk_display_class_exit);
 
-
 MODULE_AUTHOR("zhengyang@rock-chips.com");
 MODULE_DESCRIPTION("Driver for rk display device");
 MODULE_LICENSE("GPL");