2 * Copyright (C) ST-Ericsson SA 2010
4 * Author: Rabin Vincent <rabin.vincent@stericsson.com> for ST-Ericsson
5 * License terms: GNU General Public License (GPL), version 2
8 #define pr_fmt(fmt) "mop500-uib: " fmt
10 #include <linux/kernel.h>
11 #include <linux/init.h>
12 #include <linux/i2c.h>
14 #include <mach/hardware.h>
15 #include "board-mop500.h"
29 static struct uib __initdata mop500_uibs
[] = {
33 .init
= mop500_stuib_init
,
38 .init
= mop500_u8500uib_init
,
42 static struct uib
*mop500_uib
;
44 static int __init
mop500_uib_setup(char *str
)
48 for (i
= 0; i
< ARRAY_SIZE(mop500_uibs
); i
++) {
49 struct uib
*uib
= &mop500_uibs
[i
];
51 if (!strcmp(str
, uib
->option
)) {
57 if (i
== ARRAY_SIZE(mop500_uibs
))
58 pr_err("invalid uib= option (%s)\n", str
);
62 __setup("uib=", mop500_uib_setup
);
65 * The UIBs are detected after the I2C host controllers are registered, so
66 * i2c_register_board_info() can't be used.
68 void mop500_uib_i2c_add(int busnum
, struct i2c_board_info
*info
,
71 struct i2c_adapter
*adap
;
72 struct i2c_client
*client
;
75 adap
= i2c_get_adapter(busnum
);
77 pr_err("failed to get adapter i2c%d\n", busnum
);
81 for (i
= 0; i
< n
; i
++) {
82 client
= i2c_new_device(adap
, &info
[i
]);
84 pr_err("failed to register %s to i2c%d\n",
85 info
[i
].type
, busnum
);
88 i2c_put_adapter(adap
);
91 static void __init
__mop500_uib_init(struct uib
*uib
, const char *why
)
93 pr_info("%s (%s)\n", uib
->name
, why
);
98 * Detect the UIB attached based on the presence or absence of i2c devices.
100 int __init
mop500_uib_init(void)
102 struct uib
*uib
= mop500_uib
;
103 struct i2c_adapter
*i2c0
;
106 if (!cpu_is_u8500_family())
110 __mop500_uib_init(uib
, "from uib= boot argument");
114 i2c0
= i2c_get_adapter(0);
116 __mop500_uib_init(&mop500_uibs
[STUIB
],
117 "fallback, could not get i2c0");
121 /* U8500-UIB has the TC35893 at 0x44 on I2C0, the ST-UIB doesn't. */
122 ret
= i2c_smbus_xfer(i2c0
, 0x44, 0, I2C_SMBUS_WRITE
, 0,
123 I2C_SMBUS_QUICK
, NULL
);
124 i2c_put_adapter(i2c0
);
127 uib
= &mop500_uibs
[U8500UIB
];
129 uib
= &mop500_uibs
[STUIB
];
131 __mop500_uib_init(uib
, "detected");