Blame view

drivers/video/output.c 3.46 KB
2dec3ba8d   Yu Luming   output: Add displ...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
  /*
   *  output.c - Display Output Switch driver
   *
   *  Copyright (C) 2006 Luming Yu <luming.yu@intel.com>
   *
   * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   *
   *  This program is free software; you can redistribute it and/or modify
   *  it under the terms of the GNU General Public License as published by
   *  the Free Software Foundation; either version 2 of the License, or (at
   *  your option) any later version.
   *
   *  This program is distributed in the hope that it will be useful, but
   *  WITHOUT ANY WARRANTY; without even the implied warranty of
   *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   *  General Public License for more details.
   *
   *  You should have received a copy of the GNU General Public License along
   *  with this program; if not, write to the Free Software Foundation, Inc.,
   *  59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
   *
   * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   */
  #include <linux/module.h>
  #include <linux/video_output.h>
5a0e3ad6a   Tejun Heo   include cleanup: ...
26
  #include <linux/slab.h>
2dec3ba8d   Yu Luming   output: Add displ...
27
28
29
30
31
32
33
  #include <linux/err.h>
  #include <linux/ctype.h>
  
  
  MODULE_DESCRIPTION("Display Output Switcher Lowlevel Control Abstraction");
  MODULE_LICENSE("GPL");
  MODULE_AUTHOR("Luming Yu <luming.yu@intel.com>");
60043428a   tonyj@suse.de   Convert from clas...
34
35
  static ssize_t video_output_show_state(struct device *dev,
  				       struct device_attribute *attr, char *buf)
2dec3ba8d   Yu Luming   output: Add displ...
36
37
38
39
40
41
42
43
  {
  	ssize_t ret_size = 0;
  	struct output_device *od = to_output_device(dev);
  	if (od->props)
  		ret_size = sprintf(buf,"%.8x
  ",od->props->get_status(od));
  	return ret_size;
  }
60043428a   tonyj@suse.de   Convert from clas...
44
45
46
  static ssize_t video_output_store_state(struct device *dev,
  					struct device_attribute *attr,
  					const char *buf,size_t count)
2dec3ba8d   Yu Luming   output: Add displ...
47
48
49
50
51
  {
  	char *endp;
  	struct output_device *od = to_output_device(dev);
  	int request_state = simple_strtoul(buf,&endp,0);
  	size_t size = endp - buf;
e7d2860b6   AndrĂ© Goddard Rosa   tree-wide: conver...
52
  	if (isspace(*endp))
2dec3ba8d   Yu Luming   output: Add displ...
53
54
55
56
57
58
59
60
61
62
  		size++;
  	if (size != count)
  		return -EINVAL;
  
  	if (od->props) {
  		od->request_state = request_state;
  		od->props->set_state(od);
  	}
  	return count;
  }
60043428a   tonyj@suse.de   Convert from clas...
63
  static void video_output_release(struct device *dev)
2dec3ba8d   Yu Luming   output: Add displ...
64
65
66
67
  {
  	struct output_device *od = to_output_device(dev);
  	kfree(od);
  }
60043428a   tonyj@suse.de   Convert from clas...
68
  static struct device_attribute video_output_attributes[] = {
2dec3ba8d   Yu Luming   output: Add displ...
69
70
71
  	__ATTR(state, 0644, video_output_show_state, video_output_store_state),
  	__ATTR_NULL,
  };
60043428a   tonyj@suse.de   Convert from clas...
72

2dec3ba8d   Yu Luming   output: Add displ...
73
74
  static struct class video_output_class = {
  	.name = "video_output",
60043428a   tonyj@suse.de   Convert from clas...
75
76
  	.dev_release = video_output_release,
  	.dev_attrs = video_output_attributes,
2dec3ba8d   Yu Luming   output: Add displ...
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
  };
  
  struct output_device *video_output_register(const char *name,
  	struct device *dev,
  	void *devdata,
  	struct output_properties *op)
  {
  	struct output_device *new_dev;
  	int ret_code = 0;
  
  	new_dev = kzalloc(sizeof(struct output_device),GFP_KERNEL);
  	if (!new_dev) {
  		ret_code = -ENOMEM;
  		goto error_return;
  	}
  	new_dev->props = op;
60043428a   tonyj@suse.de   Convert from clas...
93
94
  	new_dev->dev.class = &video_output_class;
  	new_dev->dev.parent = dev;
64dba9a9a   Kay Sievers   video: struct dev...
95
  	dev_set_name(&new_dev->dev, name);
60043428a   tonyj@suse.de   Convert from clas...
96
97
  	dev_set_drvdata(&new_dev->dev, devdata);
  	ret_code = device_register(&new_dev->dev);
2dec3ba8d   Yu Luming   output: Add displ...
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
  	if (ret_code) {
  		kfree(new_dev);
  		goto error_return;
  	}
  	return new_dev;
  
  error_return:
  	return ERR_PTR(ret_code);
  }
  EXPORT_SYMBOL(video_output_register);
  
  void video_output_unregister(struct output_device *dev)
  {
  	if (!dev)
  		return;
60043428a   tonyj@suse.de   Convert from clas...
113
  	device_unregister(&dev->dev);
2dec3ba8d   Yu Luming   output: Add displ...
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
  }
  EXPORT_SYMBOL(video_output_unregister);
  
  static void __exit video_output_class_exit(void)
  {
  	class_unregister(&video_output_class);
  }
  
  static int __init video_output_class_init(void)
  {
  	return class_register(&video_output_class);
  }
  
  postcore_initcall(video_output_class_init);
  module_exit(video_output_class_exit);