blob: 504f5bf0e6256814aaf96951d36c24b956f90a58 [file] [log] [blame]
Thomas Gleixnerc942fdd2019-05-27 08:55:06 +02001// SPDX-License-Identifier: GPL-2.0-or-later
Benjamin Herrenschmidta28d3af2006-01-07 11:35:26 +11002/*
3 i2c Support for Apple SMU Controller
4
5 Copyright (c) 2005 Benjamin Herrenschmidt, IBM Corp.
6 <benh@kernel.crashing.org>
7
Benjamin Herrenschmidta28d3af2006-01-07 11:35:26 +11008
Benjamin Herrenschmidta28d3af2006-01-07 11:35:26 +11009*/
10
Benjamin Herrenschmidta28d3af2006-01-07 11:35:26 +110011#include <linux/module.h>
12#include <linux/kernel.h>
13#include <linux/types.h>
14#include <linux/i2c.h>
Benjamin Herrenschmidta28d3af2006-01-07 11:35:26 +110015#include <linux/device.h>
16#include <linux/platform_device.h>
Rob Herring5af50732013-09-17 14:28:33 -050017#include <linux/of_irq.h>
Benjamin Herrenschmidta28d3af2006-01-07 11:35:26 +110018#include <asm/prom.h>
19#include <asm/pmac_low_i2c.h>
20
21MODULE_AUTHOR("Benjamin Herrenschmidt <benh@kernel.crashing.org>");
22MODULE_DESCRIPTION("I2C driver for Apple PowerMac");
23MODULE_LICENSE("GPL");
24
25/*
26 * SMBUS-type transfer entrypoint
27 */
28static s32 i2c_powermac_smbus_xfer( struct i2c_adapter* adap,
29 u16 addr,
30 unsigned short flags,
31 char read_write,
32 u8 command,
33 int size,
34 union i2c_smbus_data* data)
35{
36 struct pmac_i2c_bus *bus = i2c_get_adapdata(adap);
37 int rc = 0;
38 int read = (read_write == I2C_SMBUS_READ);
39 int addrdir = (addr << 1) | read;
Jean Delvare02864d52009-12-06 17:06:17 +010040 int mode, subsize, len;
41 u32 subaddr;
42 u8 *buf;
Benjamin Herrenschmidta28d3af2006-01-07 11:35:26 +110043 u8 local[2];
44
Jean Delvare02864d52009-12-06 17:06:17 +010045 if (size == I2C_SMBUS_QUICK || size == I2C_SMBUS_BYTE) {
46 mode = pmac_i2c_mode_std;
47 subsize = 0;
48 subaddr = 0;
49 } else {
50 mode = read ? pmac_i2c_mode_combined : pmac_i2c_mode_stdsub;
51 subsize = 1;
52 subaddr = command;
53 }
Benjamin Herrenschmidta28d3af2006-01-07 11:35:26 +110054
55 switch (size) {
56 case I2C_SMBUS_QUICK:
Jean Delvare02864d52009-12-06 17:06:17 +010057 buf = NULL;
58 len = 0;
Benjamin Herrenschmidta28d3af2006-01-07 11:35:26 +110059 break;
60 case I2C_SMBUS_BYTE:
Benjamin Herrenschmidta28d3af2006-01-07 11:35:26 +110061 case I2C_SMBUS_BYTE_DATA:
Jean Delvare02864d52009-12-06 17:06:17 +010062 buf = &data->byte;
63 len = 1;
Benjamin Herrenschmidta28d3af2006-01-07 11:35:26 +110064 break;
65 case I2C_SMBUS_WORD_DATA:
Benjamin Herrenschmidta28d3af2006-01-07 11:35:26 +110066 if (!read) {
67 local[0] = data->word & 0xff;
68 local[1] = (data->word >> 8) & 0xff;
69 }
Jean Delvare02864d52009-12-06 17:06:17 +010070 buf = local;
71 len = 2;
Benjamin Herrenschmidta28d3af2006-01-07 11:35:26 +110072 break;
73
74 /* Note that these are broken vs. the expected smbus API where
Joe Perches96acafe2008-01-14 21:53:30 +010075 * on reads, the length is actually returned from the function,
Benjamin Herrenschmidta28d3af2006-01-07 11:35:26 +110076 * but I think the current API makes no sense and I don't want
77 * any driver that I haven't verified for correctness to go
78 * anywhere near a pmac i2c bus anyway ...
79 *
80 * I'm also not completely sure what kind of phases to do between
81 * the actual command and the data (what I am _supposed_ to do that
82 * is). For now, I assume writes are a single stream and reads have
83 * a repeat start/addr phase (but not stop in between)
84 */
85 case I2C_SMBUS_BLOCK_DATA:
Jean Delvare02864d52009-12-06 17:06:17 +010086 buf = data->block;
87 len = data->block[0] + 1;
Benjamin Herrenschmidta28d3af2006-01-07 11:35:26 +110088 break;
89 case I2C_SMBUS_I2C_BLOCK_DATA:
Jean Delvare02864d52009-12-06 17:06:17 +010090 buf = &data->block[1];
91 len = data->block[0];
Benjamin Herrenschmidta28d3af2006-01-07 11:35:26 +110092 break;
93
94 default:
Jean Delvare02864d52009-12-06 17:06:17 +010095 return -EINVAL;
Benjamin Herrenschmidta28d3af2006-01-07 11:35:26 +110096 }
Jean Delvare02864d52009-12-06 17:06:17 +010097
98 rc = pmac_i2c_open(bus, 0);
Jean Delvared7d838a2009-12-06 17:06:18 +010099 if (rc) {
100 dev_err(&adap->dev, "Failed to open I2C, err %d\n", rc);
Jean Delvare02864d52009-12-06 17:06:17 +0100101 return rc;
Jean Delvared7d838a2009-12-06 17:06:18 +0100102 }
Jean Delvare02864d52009-12-06 17:06:17 +0100103
104 rc = pmac_i2c_setmode(bus, mode);
Jean Delvared7d838a2009-12-06 17:06:18 +0100105 if (rc) {
106 dev_err(&adap->dev, "Failed to set I2C mode %d, err %d\n",
107 mode, rc);
Jean Delvare02864d52009-12-06 17:06:17 +0100108 goto bail;
Jean Delvared7d838a2009-12-06 17:06:18 +0100109 }
Jean Delvare02864d52009-12-06 17:06:17 +0100110
111 rc = pmac_i2c_xfer(bus, addrdir, subsize, subaddr, buf, len);
Jean Delvared7d838a2009-12-06 17:06:18 +0100112 if (rc) {
Jean Delvare8e4b9802010-03-13 20:56:52 +0100113 if (rc == -ENXIO)
114 dev_dbg(&adap->dev,
115 "I2C transfer at 0x%02x failed, size %d, "
116 "err %d\n", addrdir >> 1, size, rc);
117 else
118 dev_err(&adap->dev,
119 "I2C transfer at 0x%02x failed, size %d, "
120 "err %d\n", addrdir >> 1, size, rc);
Jean Delvare02864d52009-12-06 17:06:17 +0100121 goto bail;
Jean Delvared7d838a2009-12-06 17:06:18 +0100122 }
Jean Delvare02864d52009-12-06 17:06:17 +0100123
124 if (size == I2C_SMBUS_WORD_DATA && read) {
125 data->word = ((u16)local[1]) << 8;
126 data->word |= local[0];
127 }
128
Benjamin Herrenschmidta28d3af2006-01-07 11:35:26 +1100129 bail:
130 pmac_i2c_close(bus);
131 return rc;
132}
133
134/*
135 * Generic i2c master transfer entrypoint. This driver only support single
136 * messages (for "lame i2c" transfers). Anything else should use the smbus
137 * entry point
138 */
139static int i2c_powermac_master_xfer( struct i2c_adapter *adap,
140 struct i2c_msg *msgs,
141 int num)
142{
143 struct pmac_i2c_bus *bus = i2c_get_adapdata(adap);
144 int rc = 0;
Benjamin Herrenschmidta28d3af2006-01-07 11:35:26 +1100145 int addrdir;
146
Benjamin Herrenschmidta28d3af2006-01-07 11:35:26 +1100147 if (msgs->flags & I2C_M_TEN)
148 return -EINVAL;
Wolfram Sang7756e1e2016-04-03 20:44:57 +0200149 addrdir = i2c_8bit_addr_from_msg(msgs);
Benjamin Herrenschmidta28d3af2006-01-07 11:35:26 +1100150
151 rc = pmac_i2c_open(bus, 0);
Jean Delvared7d838a2009-12-06 17:06:18 +0100152 if (rc) {
153 dev_err(&adap->dev, "Failed to open I2C, err %d\n", rc);
Benjamin Herrenschmidta28d3af2006-01-07 11:35:26 +1100154 return rc;
Jean Delvared7d838a2009-12-06 17:06:18 +0100155 }
Benjamin Herrenschmidta28d3af2006-01-07 11:35:26 +1100156 rc = pmac_i2c_setmode(bus, pmac_i2c_mode_std);
Jean Delvared7d838a2009-12-06 17:06:18 +0100157 if (rc) {
158 dev_err(&adap->dev, "Failed to set I2C mode %d, err %d\n",
159 pmac_i2c_mode_std, rc);
Benjamin Herrenschmidta28d3af2006-01-07 11:35:26 +1100160 goto bail;
Jean Delvared7d838a2009-12-06 17:06:18 +0100161 }
Benjamin Herrenschmidta28d3af2006-01-07 11:35:26 +1100162 rc = pmac_i2c_xfer(bus, addrdir, 0, 0, msgs->buf, msgs->len);
Jean Delvare8e4b9802010-03-13 20:56:52 +0100163 if (rc < 0) {
164 if (rc == -ENXIO)
165 dev_dbg(&adap->dev, "I2C %s 0x%02x failed, err %d\n",
166 addrdir & 1 ? "read from" : "write to",
167 addrdir >> 1, rc);
168 else
169 dev_err(&adap->dev, "I2C %s 0x%02x failed, err %d\n",
170 addrdir & 1 ? "read from" : "write to",
171 addrdir >> 1, rc);
172 }
Benjamin Herrenschmidta28d3af2006-01-07 11:35:26 +1100173 bail:
174 pmac_i2c_close(bus);
Jean Delvare8ced8ee2006-07-01 17:12:53 +0200175 return rc < 0 ? rc : 1;
Benjamin Herrenschmidta28d3af2006-01-07 11:35:26 +1100176}
177
178static u32 i2c_powermac_func(struct i2c_adapter * adapter)
179{
180 return I2C_FUNC_SMBUS_QUICK | I2C_FUNC_SMBUS_BYTE |
181 I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA |
182 I2C_FUNC_SMBUS_BLOCK_DATA | I2C_FUNC_I2C;
183}
184
185/* For now, we only handle smbus */
Jean Delvare8f9082c2006-09-03 22:39:46 +0200186static const struct i2c_algorithm i2c_powermac_algorithm = {
Benjamin Herrenschmidta28d3af2006-01-07 11:35:26 +1100187 .smbus_xfer = i2c_powermac_smbus_xfer,
188 .master_xfer = i2c_powermac_master_xfer,
189 .functionality = i2c_powermac_func,
190};
191
Bhumika Goyalae3923a2017-08-21 17:42:04 +0530192static const struct i2c_adapter_quirks i2c_powermac_quirks = {
Wolfram Sang7ee405e2015-01-07 12:24:10 +0100193 .max_num_msgs = 1,
194};
Benjamin Herrenschmidta28d3af2006-01-07 11:35:26 +1100195
Bill Pemberton0b255e92012-11-27 15:59:38 -0500196static int i2c_powermac_remove(struct platform_device *dev)
Benjamin Herrenschmidta28d3af2006-01-07 11:35:26 +1100197{
Benjamin Herrenschmidt9f2545c2006-10-10 11:45:45 +1000198 struct i2c_adapter *adapter = platform_get_drvdata(dev);
Benjamin Herrenschmidta28d3af2006-01-07 11:35:26 +1100199
Lars-Peter Clausenbf51a8c2013-03-09 08:16:46 +0000200 i2c_del_adapter(adapter);
Jean Delvare6dfa5ca2009-12-06 17:06:19 +0100201 memset(adapter, 0, sizeof(*adapter));
Benjamin Herrenschmidta28d3af2006-01-07 11:35:26 +1100202
203 return 0;
204}
205
Bill Pemberton0b255e92012-11-27 15:59:38 -0500206static u32 i2c_powermac_get_addr(struct i2c_adapter *adap,
Benjamin Herrenschmidt3a3dd012012-06-18 12:00:50 +1000207 struct pmac_i2c_bus *bus,
208 struct device_node *node)
209{
210 const __be32 *prop;
211 int len;
212
213 /* First check for valid "reg" */
214 prop = of_get_property(node, "reg", &len);
215 if (prop && (len >= sizeof(int)))
216 return (be32_to_cpup(prop) & 0xff) >> 1;
217
218 /* Then check old-style "i2c-address" */
219 prop = of_get_property(node, "i2c-address", &len);
220 if (prop && (len >= sizeof(int)))
221 return (be32_to_cpup(prop) & 0xff) >> 1;
222
223 /* Now handle some devices with missing "reg" properties */
Rob Herring48f9c332018-12-05 13:50:24 -0600224 if (of_node_name_eq(node, "cereal"))
Benjamin Herrenschmidt3a3dd012012-06-18 12:00:50 +1000225 return 0x60;
Rob Herring48f9c332018-12-05 13:50:24 -0600226 else if (of_node_name_eq(node, "deq"))
Benjamin Herrenschmidt3a3dd012012-06-18 12:00:50 +1000227 return 0x34;
228
Rob Herring453a2372017-07-18 16:43:06 -0500229 dev_warn(&adap->dev, "No i2c address for %pOF\n", node);
Benjamin Herrenschmidt3a3dd012012-06-18 12:00:50 +1000230
231 return 0xffffffff;
232}
233
Bill Pemberton0b255e92012-11-27 15:59:38 -0500234static void i2c_powermac_create_one(struct i2c_adapter *adap,
Benjamin Herrenschmidt3a3dd012012-06-18 12:00:50 +1000235 const char *type,
236 u32 addr)
237{
238 struct i2c_board_info info = {};
239 struct i2c_client *newdev;
240
241 strncpy(info.type, type, sizeof(info.type));
242 info.addr = addr;
243 newdev = i2c_new_device(adap, &info);
244 if (!newdev)
245 dev_err(&adap->dev,
246 "i2c-powermac: Failure to register missing %s\n",
247 type);
248}
249
Bill Pemberton0b255e92012-11-27 15:59:38 -0500250static void i2c_powermac_add_missing(struct i2c_adapter *adap,
Benjamin Herrenschmidt3a3dd012012-06-18 12:00:50 +1000251 struct pmac_i2c_bus *bus,
252 bool found_onyx)
253{
254 struct device_node *busnode = pmac_i2c_get_bus_node(bus);
255 int rc;
256
257 /* Check for the onyx audio codec */
258#define ONYX_REG_CONTROL 67
259 if (of_device_is_compatible(busnode, "k2-i2c") && !found_onyx) {
260 union i2c_smbus_data data;
261
262 rc = i2c_smbus_xfer(adap, 0x46, 0, I2C_SMBUS_READ,
263 ONYX_REG_CONTROL, I2C_SMBUS_BYTE_DATA,
264 &data);
265 if (rc >= 0)
266 i2c_powermac_create_one(adap, "MAC,pcm3052", 0x46);
267
268 rc = i2c_smbus_xfer(adap, 0x47, 0, I2C_SMBUS_READ,
269 ONYX_REG_CONTROL, I2C_SMBUS_BYTE_DATA,
270 &data);
271 if (rc >= 0)
272 i2c_powermac_create_one(adap, "MAC,pcm3052", 0x47);
273 }
274}
275
Bill Pemberton0b255e92012-11-27 15:59:38 -0500276static bool i2c_powermac_get_type(struct i2c_adapter *adap,
Benjamin Herrenschmidt3a3dd012012-06-18 12:00:50 +1000277 struct device_node *node,
278 u32 addr, char *type, int type_size)
279{
280 char tmp[16];
281
282 /* Note: we to _NOT_ want the standard
283 * i2c drivers to match with any of our powermac stuff
284 * unless they have been specifically modified to handle
285 * it on a case by case basis. For example, for thermal
286 * control, things like lm75 etc... shall match with their
287 * corresponding windfarm drivers, _NOT_ the generic ones,
288 * so we force a prefix of AAPL, onto the modalias to
289 * make that happen
290 */
291
292 /* First try proper modalias */
293 if (of_modalias_node(node, tmp, sizeof(tmp)) >= 0) {
294 snprintf(type, type_size, "MAC,%s", tmp);
295 return true;
296 }
297
298 /* Now look for known workarounds */
Rob Herring48f9c332018-12-05 13:50:24 -0600299 if (of_node_name_eq(node, "deq")) {
Benjamin Herrenschmidt3a3dd012012-06-18 12:00:50 +1000300 /* Apple uses address 0x34 for TAS3001 and 0x35 for TAS3004 */
301 if (addr == 0x34) {
302 snprintf(type, type_size, "MAC,tas3001");
303 return true;
304 } else if (addr == 0x35) {
305 snprintf(type, type_size, "MAC,tas3004");
306 return true;
307 }
308 }
309
Rob Herring453a2372017-07-18 16:43:06 -0500310 dev_err(&adap->dev, "i2c-powermac: modalias failure on %pOF\n", node);
Benjamin Herrenschmidt3a3dd012012-06-18 12:00:50 +1000311 return false;
312}
313
Bill Pemberton0b255e92012-11-27 15:59:38 -0500314static void i2c_powermac_register_devices(struct i2c_adapter *adap,
Benjamin Herrenschmidt81e5d862012-04-18 22:16:42 +0000315 struct pmac_i2c_bus *bus)
316{
317 struct i2c_client *newdev;
318 struct device_node *node;
Benjamin Herrenschmidt3a3dd012012-06-18 12:00:50 +1000319 bool found_onyx = 0;
320
321 /*
322 * In some cases we end up with the via-pmu node itself, in this
323 * case we skip this function completely as the device-tree will
324 * not contain anything useful.
325 */
Rob Herring48f9c332018-12-05 13:50:24 -0600326 if (of_node_name_eq(adap->dev.of_node, "via-pmu"))
Benjamin Herrenschmidt3a3dd012012-06-18 12:00:50 +1000327 return;
Benjamin Herrenschmidt81e5d862012-04-18 22:16:42 +0000328
329 for_each_child_of_node(adap->dev.of_node, node) {
330 struct i2c_board_info info = {};
Benjamin Herrenschmidt81e5d862012-04-18 22:16:42 +0000331 u32 addr;
Benjamin Herrenschmidt81e5d862012-04-18 22:16:42 +0000332
333 /* Get address & channel */
Benjamin Herrenschmidt3a3dd012012-06-18 12:00:50 +1000334 addr = i2c_powermac_get_addr(adap, bus, node);
335 if (addr == 0xffffffff)
Benjamin Herrenschmidt81e5d862012-04-18 22:16:42 +0000336 continue;
Benjamin Herrenschmidt81e5d862012-04-18 22:16:42 +0000337
338 /* Multibus setup, check channel */
339 if (!pmac_i2c_match_adapter(node, adap))
340 continue;
341
Rob Herring453a2372017-07-18 16:43:06 -0500342 dev_dbg(&adap->dev, "i2c-powermac: register %pOF\n", node);
Benjamin Herrenschmidt81e5d862012-04-18 22:16:42 +0000343
Benjamin Herrenschmidt3a3dd012012-06-18 12:00:50 +1000344 /*
345 * Keep track of some device existence to handle
346 * workarounds later.
Benjamin Herrenschmidt81e5d862012-04-18 22:16:42 +0000347 */
Benjamin Herrenschmidt3a3dd012012-06-18 12:00:50 +1000348 if (of_device_is_compatible(node, "pcm3052"))
349 found_onyx = true;
350
351 /* Make up a modalias */
352 if (!i2c_powermac_get_type(adap, node, addr,
353 info.type, sizeof(info.type))) {
Benjamin Herrenschmidt81e5d862012-04-18 22:16:42 +0000354 continue;
355 }
Benjamin Herrenschmidt81e5d862012-04-18 22:16:42 +0000356
357 /* Fill out the rest of the info structure */
Benjamin Herrenschmidt3a3dd012012-06-18 12:00:50 +1000358 info.addr = addr;
Benjamin Herrenschmidt81e5d862012-04-18 22:16:42 +0000359 info.irq = irq_of_parse_and_map(node, 0);
360 info.of_node = of_node_get(node);
Benjamin Herrenschmidt81e5d862012-04-18 22:16:42 +0000361
362 newdev = i2c_new_device(adap, &info);
363 if (!newdev) {
364 dev_err(&adap->dev, "i2c-powermac: Failure to register"
Rob Herring453a2372017-07-18 16:43:06 -0500365 " %pOF\n", node);
Benjamin Herrenschmidt81e5d862012-04-18 22:16:42 +0000366 of_node_put(node);
367 /* We do not dispose of the interrupt mapping on
368 * purpose. It's not necessary (interrupt cannot be
369 * re-used) and somebody else might have grabbed it
370 * via direct DT lookup so let's not bother
371 */
372 continue;
373 }
374 }
Benjamin Herrenschmidt3a3dd012012-06-18 12:00:50 +1000375
376 /* Additional workarounds */
377 i2c_powermac_add_missing(adap, bus, found_onyx);
Benjamin Herrenschmidt81e5d862012-04-18 22:16:42 +0000378}
Benjamin Herrenschmidta28d3af2006-01-07 11:35:26 +1100379
Bill Pemberton0b255e92012-11-27 15:59:38 -0500380static int i2c_powermac_probe(struct platform_device *dev)
Benjamin Herrenschmidta28d3af2006-01-07 11:35:26 +1100381{
Jingoo Han6d4028c2013-07-30 16:59:33 +0900382 struct pmac_i2c_bus *bus = dev_get_platdata(&dev->dev);
Rob Herring49d54ab2018-09-28 17:49:47 -0500383 struct device_node *parent;
Benjamin Herrenschmidta28d3af2006-01-07 11:35:26 +1100384 struct i2c_adapter *adapter;
Benjamin Herrenschmidta28d3af2006-01-07 11:35:26 +1100385 int rc;
386
387 if (bus == NULL)
388 return -EINVAL;
Jean Delvarebc6286e2009-12-06 17:06:20 +0100389 adapter = pmac_i2c_get_adapter(bus);
Benjamin Herrenschmidta28d3af2006-01-07 11:35:26 +1100390
391 /* Ok, now we need to make up a name for the interface that will
392 * match what we used to do in the past, that is basically the
393 * controller's parent device node for keywest. PMU didn't have a
394 * naming convention and SMU has a different one
395 */
396 switch(pmac_i2c_get_type(bus)) {
397 case pmac_i2c_bus_keywest:
398 parent = of_get_parent(pmac_i2c_get_controller(bus));
399 if (parent == NULL)
400 return -EINVAL;
Rob Herring49d54ab2018-09-28 17:49:47 -0500401 snprintf(adapter->name, sizeof(adapter->name), "%pOFn %d",
402 parent,
403 pmac_i2c_get_channel(bus));
404 of_node_put(parent);
Benjamin Herrenschmidta28d3af2006-01-07 11:35:26 +1100405 break;
406 case pmac_i2c_bus_pmu:
Rob Herring49d54ab2018-09-28 17:49:47 -0500407 snprintf(adapter->name, sizeof(adapter->name), "pmu %d",
408 pmac_i2c_get_channel(bus));
Benjamin Herrenschmidta28d3af2006-01-07 11:35:26 +1100409 break;
410 case pmac_i2c_bus_smu:
411 /* This is not what we used to do but I'm fixing drivers at
412 * the same time as this change
413 */
Rob Herring49d54ab2018-09-28 17:49:47 -0500414 snprintf(adapter->name, sizeof(adapter->name), "smu %d",
415 pmac_i2c_get_channel(bus));
Benjamin Herrenschmidta28d3af2006-01-07 11:35:26 +1100416 break;
417 default:
418 return -EINVAL;
419 }
Benjamin Herrenschmidta28d3af2006-01-07 11:35:26 +1100420
Benjamin Herrenschmidt9f2545c2006-10-10 11:45:45 +1000421 platform_set_drvdata(dev, adapter);
Benjamin Herrenschmidta28d3af2006-01-07 11:35:26 +1100422 adapter->algo = &i2c_powermac_algorithm;
Wolfram Sang7ee405e2015-01-07 12:24:10 +0100423 adapter->quirks = &i2c_powermac_quirks;
Benjamin Herrenschmidta28d3af2006-01-07 11:35:26 +1100424 i2c_set_adapdata(adapter, bus);
Benjamin Herrenschmidt9f2545c2006-10-10 11:45:45 +1000425 adapter->dev.parent = &dev->dev;
Wolfram Sang687b81d2013-07-11 12:56:15 +0100426
427 /* Clear of_node to skip automatic registration of i2c child nodes */
428 adapter->dev.of_node = NULL;
Benjamin Herrenschmidta28d3af2006-01-07 11:35:26 +1100429 rc = i2c_add_adapter(adapter);
430 if (rc) {
431 printk(KERN_ERR "i2c-powermac: Adapter %s registration "
Jean Delvarebc6286e2009-12-06 17:06:20 +0100432 "failed\n", adapter->name);
Jean Delvare6dfa5ca2009-12-06 17:06:19 +0100433 memset(adapter, 0, sizeof(*adapter));
Wolfram Sang874e9552013-07-11 22:02:03 +0100434 return rc;
Benjamin Herrenschmidta28d3af2006-01-07 11:35:26 +1100435 }
436
Jean Delvarebc6286e2009-12-06 17:06:20 +0100437 printk(KERN_INFO "PowerMac i2c bus %s registered\n", adapter->name);
Jean Delvare810ad7b2008-10-17 17:51:12 +0200438
Wolfram Sang687b81d2013-07-11 12:56:15 +0100439 /* Use custom child registration due to Apple device-tree funkyness */
440 adapter->dev.of_node = dev->dev.of_node;
Benjamin Herrenschmidt81e5d862012-04-18 22:16:42 +0000441 i2c_powermac_register_devices(adapter, bus);
Jean Delvare810ad7b2008-10-17 17:51:12 +0200442
Wolfram Sang874e9552013-07-11 22:02:03 +0100443 return 0;
Benjamin Herrenschmidta28d3af2006-01-07 11:35:26 +1100444}
445
Benjamin Herrenschmidt9f2545c2006-10-10 11:45:45 +1000446static struct platform_driver i2c_powermac_driver = {
Benjamin Herrenschmidta28d3af2006-01-07 11:35:26 +1100447 .probe = i2c_powermac_probe,
Bill Pemberton0b255e92012-11-27 15:59:38 -0500448 .remove = i2c_powermac_remove,
Benjamin Herrenschmidt9f2545c2006-10-10 11:45:45 +1000449 .driver = {
450 .name = "i2c-powermac",
451 .bus = &platform_bus_type,
452 },
Benjamin Herrenschmidta28d3af2006-01-07 11:35:26 +1100453};
454
Axel Lina3664b52012-01-12 20:32:04 +0100455module_platform_driver(i2c_powermac_driver);
Benjamin Herrenschmidta28d3af2006-01-07 11:35:26 +1100456
Axel Lina3664b52012-01-12 20:32:04 +0100457MODULE_ALIAS("platform:i2c-powermac");