#ifdef CONFIG_PROC_FS |
214 static void *xxx_clk_start(struct seq_file *seq, loff_t *pos) |
215 { |
216 if (*pos == 0) { |
217 seq_printf(seq, "NAME/t/tPARENT/t/tRATE(HZ)/tENABLE/tUSAGE/n"); |
218 } |
219 |
220 return seq_list_start(&clocks, *pos); |
221 } |
222 |
223 static void *xxxx_clk_next(struct seq_file *seq, void *v, loff_t *pos) |
224 { |
225 return seq_list_next(v, &clocks, pos); |
226 } |
227 |
228 static void xxxx_clk_stop(struct seq_file *seq, void *v) |
229 { |
230 } |
231 |
232 static int xxxx_clk_show(struct seq_file *seq, void *v) |
233 { |
234 struct clk *clk, *parent; |
235 |
236 clk = list_entry(v, struct clk, list); |
237 |
238 seq_printf(seq, "%-16s", clk->name); |
239 |
240 parent = clk_get_parent(clk); |
241 if (parent) { |
242 seq_printf(seq, "%-16s", parent->name); |
243 } else { |
244 seq_printf(seq, "%-16s", "NULL"); |
245 } |
246 |
247 seq_printf(seq, "%-16ld", clk_get_rate(clk)); |
248 seq_printf(seq, "%s/t", clk->is_enable(clk) ? "Y" : "N"); |
249 seq_printf(seq, "%d/n", clk->usage); |
250 |
251 return 0; |
252 } |
253 |
254 static const struct seq_operations xxxx_clk_ops = { |
255 .start = xxxx_clk_start, |
256 .next = xxxx_clk_next, |
257 .stop = xxxx_clk_stop, |
258 .show = xxxx_clk_show, |
259 }; |
260 |
261 static int xxxx_clk_open(struct inode *inode, struct file *file) |
262 { |
263 return seq_open(file, &atxx_clk_ops); |
264 } |
265 |
266 static const struct file_operations xxxx_clk_proc_fops = { |
267 .owner = THIS_MODULE, |
268 .open = xxxx_clk_open, |
269 .read = seq_read, |
270 .llseek = seq_lseek, |
271 .release = seq_release, |
272 }; |
273 |
274 void xxxx_clock_proc_create(void) |
275 { |
276 proc_create("clks", 0, NULL, &xxxx_clk_proc_fops); |
277 } |
278 #else |
279 void xxxx_clock_proc_create(void) |
280 { |
281 } |
282 #endif |
code depository : procfs
最新推荐文章于 2024-10-02 11:39:39 发布