excite_procfs.c 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. /*
  2. * Copyright (C) 2004, 2005 by Basler Vision Technologies AG
  3. * Author: Thomas Koeller <thomas.koeller@baslerweb.com>
  4. *
  5. * Procfs support for Basler eXcite
  6. *
  7. * This program is free software; you can redistribute it and/or modify
  8. * it under the terms of the GNU General Public License as published by
  9. * the Free Software Foundation; either version 2 of the License, or
  10. * (at your option) any later version.
  11. *
  12. * This program is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. * GNU General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU General Public License
  18. * along with this program; if not, write to the Free Software
  19. * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  20. */
  21. #include <linux/proc_fs.h>
  22. #include <linux/stat.h>
  23. #include <asm/page.h>
  24. #include <asm/io.h>
  25. #include <asm/system.h>
  26. #include <asm/rm9k-ocd.h>
  27. #include <excite.h>
  28. static int excite_get_unit_id(char *buf, char **addr, off_t offs, int size)
  29. {
  30. const int len = snprintf(buf, PAGE_SIZE, "%06x", unit_id);
  31. const int w = len - offs;
  32. *addr = buf + offs;
  33. return w < size ? w : size;
  34. }
  35. static int
  36. excite_bootrom_read(char *page, char **start, off_t off, int count,
  37. int *eof, void *data)
  38. {
  39. void __iomem * src;
  40. if (off >= EXCITE_SIZE_BOOTROM) {
  41. *eof = 1;
  42. return 0;
  43. }
  44. if ((off + count) > EXCITE_SIZE_BOOTROM)
  45. count = EXCITE_SIZE_BOOTROM - off;
  46. src = ioremap(EXCITE_PHYS_BOOTROM + off, count);
  47. if (src) {
  48. memcpy_fromio(page, src, count);
  49. iounmap(src);
  50. *start = page;
  51. } else {
  52. count = -ENOMEM;
  53. }
  54. return count;
  55. }
  56. void excite_procfs_init(void)
  57. {
  58. /* Create & populate /proc/excite */
  59. struct proc_dir_entry * const pdir = proc_mkdir("excite", &proc_root);
  60. if (pdir) {
  61. struct proc_dir_entry * e;
  62. e = create_proc_info_entry("unit_id", S_IRUGO, pdir,
  63. excite_get_unit_id);
  64. if (e) e->size = 6;
  65. e = create_proc_read_entry("bootrom", S_IRUGO, pdir,
  66. excite_bootrom_read, NULL);
  67. if (e) e->size = EXCITE_SIZE_BOOTROM;
  68. }
  69. }