board-mop500-uib.c 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. /*
  2. * Copyright (C) ST-Ericsson SA 2010
  3. *
  4. * Author: Rabin Vincent <rabin.vincent@stericsson.com> for ST-Ericsson
  5. * License terms: GNU General Public License (GPL), version 2
  6. */
  7. #define pr_fmt(fmt) "mop500-uib: " fmt
  8. #include <linux/kernel.h>
  9. #include <linux/init.h>
  10. #include <linux/i2c.h>
  11. #include "board-mop500.h"
  12. #include "id.h"
  13. enum mop500_uib {
  14. };
  15. struct uib {
  16. const char *name;
  17. const char *option;
  18. void (*init)(void);
  19. };
  20. static struct uib __initdata mop500_uibs[] = {
  21. };
  22. static struct uib *mop500_uib;
  23. static int __init mop500_uib_setup(char *str)
  24. {
  25. int i;
  26. for (i = 0; i < ARRAY_SIZE(mop500_uibs); i++) {
  27. struct uib *uib = &mop500_uibs[i];
  28. if (!strcmp(str, uib->option)) {
  29. mop500_uib = uib;
  30. break;
  31. }
  32. }
  33. if (i == ARRAY_SIZE(mop500_uibs))
  34. pr_err("invalid uib= option (%s)\n", str);
  35. return 1;
  36. }
  37. __setup("uib=", mop500_uib_setup);
  38. /*
  39. * The UIBs are detected after the I2C host controllers are registered, so
  40. * i2c_register_board_info() can't be used.
  41. */
  42. void mop500_uib_i2c_add(int busnum, struct i2c_board_info *info,
  43. unsigned n)
  44. {
  45. struct i2c_adapter *adap;
  46. struct i2c_client *client;
  47. int i;
  48. adap = i2c_get_adapter(busnum);
  49. if (!adap) {
  50. pr_err("failed to get adapter i2c%d\n", busnum);
  51. return;
  52. }
  53. for (i = 0; i < n; i++) {
  54. client = i2c_new_device(adap, &info[i]);
  55. if (!client)
  56. pr_err("failed to register %s to i2c%d\n",
  57. info[i].type, busnum);
  58. }
  59. i2c_put_adapter(adap);
  60. }
  61. static void __init __mop500_uib_init(struct uib *uib, const char *why)
  62. {
  63. pr_info("%s (%s)\n", uib->name, why);
  64. uib->init();
  65. }
  66. int __init mop500_uib_init(void)
  67. {
  68. struct uib *uib = mop500_uib;
  69. if (!cpu_is_u8500_family())
  70. return -ENODEV;
  71. if (uib) {
  72. __mop500_uib_init(uib, "from uib= boot argument");
  73. return 0;
  74. }
  75. return 0;
  76. }