Commit | Line | Data |
---|---|---|
bc89b2bd AN |
1 | /* |
2 | * 7 Segment LED routines | |
3 | * Based on RBTX49xx patch from CELF patch archive. | |
4 | * | |
5 | * This file is subject to the terms and conditions of the GNU General Public | |
6 | * License. See the file "COPYING" in the main directory of this archive | |
7 | * for more details. | |
8 | * | |
9 | * (C) Copyright TOSHIBA CORPORATION 2005-2007 | |
10 | * All Rights Reserved. | |
11 | */ | |
0e38eaf3 | 12 | #include <linux/device.h> |
bc89b2bd AN |
13 | #include <linux/slab.h> |
14 | #include <linux/map_to_7segment.h> | |
15 | #include <asm/txx9/generic.h> | |
16 | ||
17 | static unsigned int tx_7segled_num; | |
18 | static void (*tx_7segled_putc)(unsigned int pos, unsigned char val); | |
19 | ||
20 | void __init txx9_7segled_init(unsigned int num, | |
21 | void (*putc)(unsigned int pos, unsigned char val)) | |
22 | { | |
23 | tx_7segled_num = num; | |
24 | tx_7segled_putc = putc; | |
25 | } | |
26 | ||
27 | static SEG7_CONVERSION_MAP(txx9_seg7map, MAP_ASCII7SEG_ALPHANUM_LC); | |
28 | ||
29 | int txx9_7segled_putc(unsigned int pos, char c) | |
30 | { | |
31 | if (pos >= tx_7segled_num) | |
32 | return -EINVAL; | |
33 | c = map_to_seg7(&txx9_seg7map, c); | |
34 | if (c < 0) | |
35 | return c; | |
36 | tx_7segled_putc(pos, c); | |
37 | return 0; | |
38 | } | |
39 | ||
0e38eaf3 KS |
40 | static ssize_t ascii_store(struct device *dev, |
41 | struct device_attribute *attr, | |
bc89b2bd AN |
42 | const char *buf, size_t size) |
43 | { | |
44 | unsigned int ch = dev->id; | |
45 | txx9_7segled_putc(ch, buf[0]); | |
46 | return size; | |
47 | } | |
48 | ||
0e38eaf3 KS |
49 | static ssize_t raw_store(struct device *dev, |
50 | struct device_attribute *attr, | |
bc89b2bd AN |
51 | const char *buf, size_t size) |
52 | { | |
53 | unsigned int ch = dev->id; | |
54 | tx_7segled_putc(ch, buf[0]); | |
55 | return size; | |
56 | } | |
57 | ||
0e38eaf3 KS |
58 | static DEVICE_ATTR(ascii, 0200, NULL, ascii_store); |
59 | static DEVICE_ATTR(raw, 0200, NULL, raw_store); | |
bc89b2bd | 60 | |
0e38eaf3 KS |
61 | static ssize_t map_seg7_show(struct device *dev, |
62 | struct device_attribute *attr, | |
c9be0a36 | 63 | char *buf) |
bc89b2bd AN |
64 | { |
65 | memcpy(buf, &txx9_seg7map, sizeof(txx9_seg7map)); | |
66 | return sizeof(txx9_seg7map); | |
67 | } | |
68 | ||
0e38eaf3 KS |
69 | static ssize_t map_seg7_store(struct device *dev, |
70 | struct device_attribute *attr, | |
bc89b2bd AN |
71 | const char *buf, size_t size) |
72 | { | |
73 | if (size != sizeof(txx9_seg7map)) | |
74 | return -EINVAL; | |
75 | memcpy(&txx9_seg7map, buf, size); | |
76 | return size; | |
77 | } | |
78 | ||
0e38eaf3 | 79 | static DEVICE_ATTR(map_seg7, 0600, map_seg7_show, map_seg7_store); |
bc89b2bd | 80 | |
0e38eaf3 KS |
81 | static struct bus_type tx_7segled_subsys = { |
82 | .name = "7segled", | |
83 | .dev_name = "7segled", | |
bc89b2bd AN |
84 | }; |
85 | ||
f0a7a2d0 LK |
86 | static void tx_7segled_release(struct device *dev) |
87 | { | |
88 | kfree(dev); | |
89 | } | |
90 | ||
bc89b2bd AN |
91 | static int __init tx_7segled_init_sysfs(void) |
92 | { | |
93 | int error, i; | |
94 | if (!tx_7segled_num) | |
95 | return -ENODEV; | |
0e38eaf3 | 96 | error = subsys_system_register(&tx_7segled_subsys, NULL); |
bc89b2bd AN |
97 | if (error) |
98 | return error; | |
0e38eaf3 | 99 | error = device_create_file(tx_7segled_subsys.dev_root, &dev_attr_map_seg7); |
bc89b2bd AN |
100 | if (error) |
101 | return error; | |
102 | for (i = 0; i < tx_7segled_num; i++) { | |
0e38eaf3 | 103 | struct device *dev; |
bc89b2bd AN |
104 | dev = kzalloc(sizeof(*dev), GFP_KERNEL); |
105 | if (!dev) { | |
106 | error = -ENODEV; | |
107 | break; | |
108 | } | |
109 | dev->id = i; | |
193fb426 | 110 | dev->bus = &tx_7segled_subsys; |
f0a7a2d0 | 111 | dev->release = &tx_7segled_release; |
0e38eaf3 | 112 | error = device_register(dev); |
f0a7a2d0 LK |
113 | if (error) { |
114 | put_device(dev); | |
115 | return error; | |
bc89b2bd | 116 | } |
f0a7a2d0 LK |
117 | device_create_file(dev, &dev_attr_ascii); |
118 | device_create_file(dev, &dev_attr_raw); | |
bc89b2bd AN |
119 | } |
120 | return error; | |
121 | } | |
122 | ||
123 | device_initcall(tx_7segled_init_sysfs); |