31d584fde8dba2833c2b05cf575d8d0cddda883d
[linux-3.10.git] / arch / arm / mach-tegra / board-info.c
1 /*
2  * arch/arm/mach-tegra/board-info.c
3  *
4  * File to contain changes for sku id, serial id, chip id, etc.
5  *
6  * Copyright (c) 2010-2012, NVIDIA Corporation.
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful, but WITHOUT
14  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
15  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
16  * more details.
17  *
18  * You should have received a copy of the GNU General Public License along
19  * with this program; if not, write to the Free Software Foundation, Inc.,
20  * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
21  */
22
23 #include <linux/proc_fs.h>
24 #include <linux/seq_file.h>
25
26 #include <asm/system_info.h>
27
28 #include "board.h"
29
30 /* skuinfo is 18 character long xxx-xxxxx-xxxx-xxx
31  *so buffer size is set to 18+1 */
32 #define SKUINFO_BUF_SIZE 19
33 /* skuver is 2 character long XX so buffer size is set to 2+1 */
34 #define SKUVER_BUF_SIZE 3
35
36 /* prodinfo is 18 character long xxx-xxxxx-xxxx-xxx
37  * so buffer size is set to 18+1 */
38 #define PRODINFO_BUF_SIZE 19
39 /* prodver is 2 character long XX so buffer size is set to 2+1 */
40 #define PRODVER_BUF_SIZE 3
41
42 static unsigned int board_serial_low;
43 static unsigned int board_serial_high;
44 static char prodinfo_buffer[PRODINFO_BUF_SIZE];
45 static char prodver_buffer[PRODVER_BUF_SIZE];
46 static char skuinfo_buffer[SKUINFO_BUF_SIZE];
47 static char skuver_buffer[SKUVER_BUF_SIZE];
48
49 static int __init sku_info_setup(char *line)
50 {
51         memcpy(skuinfo_buffer, line, SKUINFO_BUF_SIZE);
52         return 1;
53 }
54
55 __setup("nvsku=", sku_info_setup);
56
57 static int __init sku_ver_setup(char *line)
58 {
59         memcpy(skuver_buffer, line, SKUVER_BUF_SIZE);
60         return 1;
61 }
62
63 __setup("SkuVer=", sku_ver_setup);
64
65 static int __init prod_info_setup(char *line)
66 {
67         memcpy(prodinfo_buffer, line, PRODINFO_BUF_SIZE);
68         return 1;
69 }
70
71 __setup("ProdInfo=", prod_info_setup);
72
73 static int __init prod_ver_setup(char *line)
74 {
75         memcpy(prodver_buffer, line, PRODVER_BUF_SIZE);
76         return 1;
77 }
78
79 __setup("ProdVer=", prod_ver_setup);
80
81 static int read_skuinfo_proc_show(struct seq_file *m, void *v)
82 {
83         seq_printf(m, "%s\n", skuinfo_buffer);
84         return 0;
85 }
86
87 static int read_skuinfo_proc_open(struct inode *inode, struct file *file)
88 {
89         return single_open(file, read_skuinfo_proc_show, NULL);
90 }
91
92 static const struct file_operations read_skuinfo_proc_fops = {
93         .open = read_skuinfo_proc_open,
94         .read = seq_read,
95         .llseek = seq_lseek,
96         .release = single_release,
97 };
98
99 static int read_skuver_proc_show(struct seq_file *m, void *v)
100 {
101         seq_printf(m, "%s\n", skuver_buffer);
102         return 0;
103 }
104
105 static int read_skuver_proc_open(struct inode *inode, struct file *file)
106 {
107         return single_open(file, read_skuver_proc_show, NULL);
108 }
109
110 static const struct file_operations read_skuver_proc_fops = {
111         .open = read_skuver_proc_open,
112         .read = seq_read,
113         .llseek = seq_lseek,
114         .release = single_release,
115 };
116
117 static int read_serialinfo_proc_show(struct seq_file *m, void *v)
118 {
119         seq_printf(m, "%013llu\n",
120                    (((unsigned long long int)board_serial_high) << 32) |
121                    board_serial_low);
122         return 0;
123 }
124
125 static int read_serialinfo_proc_open(struct inode *inode, struct file *file)
126 {
127         return single_open(file, read_serialinfo_proc_show, NULL);
128 }
129
130 static const struct file_operations read_serialinfo_proc_fops = {
131         .open = read_serialinfo_proc_open,
132         .read = seq_read,
133         .llseek = seq_lseek,
134         .release = single_release,
135 };
136
137 static int read_prodinfo_proc_show(struct seq_file *m, void *v)
138 {
139         seq_printf(m, "%s\n", prodinfo_buffer);
140         return 0;
141 }
142
143 static int read_prodinfo_proc_open(struct inode *inode, struct file *file)
144 {
145         return single_open(file, read_prodinfo_proc_show, NULL);
146 }
147
148 static const struct file_operations read_prodinfo_proc_fops = {
149         .open = read_prodinfo_proc_open,
150         .read = seq_read,
151         .llseek = seq_lseek,
152         .release = single_release,
153 };
154
155 static int read_prodver_proc_show(struct seq_file *m, void *v)
156 {
157         seq_printf(m, "%s\n", prodver_buffer);
158         return 0;
159 }
160
161 static int read_prodver_proc_open(struct inode *inode, struct file *file)
162 {
163         return single_open(file, read_prodver_proc_show, NULL);
164 }
165
166 static const struct file_operations read_prodver_proc_fops = {
167         .open = read_prodver_proc_open,
168         .read = seq_read,
169         .llseek = seq_lseek,
170         .release = single_release,
171 };
172
173 int __init tegra_init_board_info(void)
174 {
175         board_serial_low = system_serial_low;
176         board_serial_high = system_serial_high;
177
178         if (!proc_create("board_serial", 0, NULL, &read_serialinfo_proc_fops)) {
179                 printk(KERN_ERR "Can't create proc entry for board_serial!\n");
180                 return -1;
181         }
182
183         if (!proc_create("skuinfo", 0, NULL, &read_skuinfo_proc_fops)) {
184                 printk(KERN_ERR "Can't create proc entry for skuinfo!\n");
185                 return -1;
186         }
187
188         if (!proc_create("skuver", 0, NULL, &read_skuver_proc_fops)) {
189                 printk(KERN_ERR "Can't create proc entry for skuver!\n");
190                 return -1;
191         }
192
193         if (!proc_create("prodinfo", 0, NULL, &read_prodinfo_proc_fops)) {
194                 printk(KERN_ERR "Can't create proc entry for prodinfo!\n");
195                 return -1;
196         }
197
198         if (!proc_create("prodver", 0, NULL, &read_prodver_proc_fops)) {
199                 printk(KERN_ERR "Can't create proc entry for prodver!\n");
200                 return -1;
201         }
202
203         return 0;
204 }