board-mop500-uib.c 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  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. STUIB,
  15. };
  16. struct uib {
  17. const char *name;
  18. const char *option;
  19. void (*init)(void);
  20. };
  21. static struct uib __initdata mop500_uibs[] = {
  22. [STUIB] = {
  23. .name = "ST-UIB",
  24. .option = "stuib",
  25. .init = mop500_stuib_init,
  26. },
  27. };
  28. static struct uib *mop500_uib;
  29. static int __init mop500_uib_setup(char *str)
  30. {
  31. int i;
  32. for (i = 0; i < ARRAY_SIZE(mop500_uibs); i++) {
  33. struct uib *uib = &mop500_uibs[i];
  34. if (!strcmp(str, uib->option)) {
  35. mop500_uib = uib;
  36. break;
  37. }
  38. }
  39. if (i == ARRAY_SIZE(mop500_uibs))
  40. pr_err("invalid uib= option (%s)\n", str);
  41. return 1;
  42. }
  43. __setup("uib=", mop500_uib_setup);
  44. /*
  45. * The UIBs are detected after the I2C host controllers are registered, so
  46. * i2c_register_board_info() can't be used.
  47. */
  48. void mop500_uib_i2c_add(int busnum, struct i2c_board_info *info,
  49. unsigned n)
  50. {
  51. struct i2c_adapter *adap;
  52. struct i2c_client *client;
  53. int i;
  54. adap = i2c_get_adapter(busnum);
  55. if (!adap) {
  56. pr_err("failed to get adapter i2c%d\n", busnum);
  57. return;
  58. }
  59. for (i = 0; i < n; i++) {
  60. client = i2c_new_device(adap, &info[i]);
  61. if (!client)
  62. pr_err("failed to register %s to i2c%d\n",
  63. info[i].type, busnum);
  64. }
  65. i2c_put_adapter(adap);
  66. }
  67. static void __init __mop500_uib_init(struct uib *uib, const char *why)
  68. {
  69. pr_info("%s (%s)\n", uib->name, why);
  70. uib->init();
  71. }
  72. int __init mop500_uib_init(void)
  73. {
  74. struct uib *uib = mop500_uib;
  75. if (!cpu_is_u8500_family())
  76. return -ENODEV;
  77. if (uib) {
  78. __mop500_uib_init(uib, "from uib= boot argument");
  79. return 0;
  80. }
  81. __mop500_uib_init(&mop500_uibs[STUIB], "detected");
  82. return 0;
  83. }