Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
i2c-powermac.c
Go to the documentation of this file.
1 /*
2  i2c Support for Apple SMU Controller
3 
4  Copyright (c) 2005 Benjamin Herrenschmidt, IBM Corp.
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., 675 Mass Ave, Cambridge, MA 02139, USA.
20 
21 */
22 
23 #include <linux/module.h>
24 #include <linux/kernel.h>
25 #include <linux/types.h>
26 #include <linux/i2c.h>
27 #include <linux/init.h>
28 #include <linux/device.h>
29 #include <linux/platform_device.h>
30 #include <asm/prom.h>
31 #include <asm/pmac_low_i2c.h>
32 
33 MODULE_AUTHOR("Benjamin Herrenschmidt <[email protected]>");
34 MODULE_DESCRIPTION("I2C driver for Apple PowerMac");
35 MODULE_LICENSE("GPL");
36 
37 /*
38  * SMBUS-type transfer entrypoint
39  */
40 static s32 i2c_powermac_smbus_xfer( struct i2c_adapter* adap,
41  u16 addr,
42  unsigned short flags,
43  char read_write,
44  u8 command,
45  int size,
46  union i2c_smbus_data* data)
47 {
48  struct pmac_i2c_bus *bus = i2c_get_adapdata(adap);
49  int rc = 0;
50  int read = (read_write == I2C_SMBUS_READ);
51  int addrdir = (addr << 1) | read;
52  int mode, subsize, len;
53  u32 subaddr;
54  u8 *buf;
55  u8 local[2];
56 
57  if (size == I2C_SMBUS_QUICK || size == I2C_SMBUS_BYTE) {
58  mode = pmac_i2c_mode_std;
59  subsize = 0;
60  subaddr = 0;
61  } else {
62  mode = read ? pmac_i2c_mode_combined : pmac_i2c_mode_stdsub;
63  subsize = 1;
64  subaddr = command;
65  }
66 
67  switch (size) {
68  case I2C_SMBUS_QUICK:
69  buf = NULL;
70  len = 0;
71  break;
72  case I2C_SMBUS_BYTE:
74  buf = &data->byte;
75  len = 1;
76  break;
78  if (!read) {
79  local[0] = data->word & 0xff;
80  local[1] = (data->word >> 8) & 0xff;
81  }
82  buf = local;
83  len = 2;
84  break;
85 
86  /* Note that these are broken vs. the expected smbus API where
87  * on reads, the length is actually returned from the function,
88  * but I think the current API makes no sense and I don't want
89  * any driver that I haven't verified for correctness to go
90  * anywhere near a pmac i2c bus anyway ...
91  *
92  * I'm also not completely sure what kind of phases to do between
93  * the actual command and the data (what I am _supposed_ to do that
94  * is). For now, I assume writes are a single stream and reads have
95  * a repeat start/addr phase (but not stop in between)
96  */
98  buf = data->block;
99  len = data->block[0] + 1;
100  break;
102  buf = &data->block[1];
103  len = data->block[0];
104  break;
105 
106  default:
107  return -EINVAL;
108  }
109 
110  rc = pmac_i2c_open(bus, 0);
111  if (rc) {
112  dev_err(&adap->dev, "Failed to open I2C, err %d\n", rc);
113  return rc;
114  }
115 
116  rc = pmac_i2c_setmode(bus, mode);
117  if (rc) {
118  dev_err(&adap->dev, "Failed to set I2C mode %d, err %d\n",
119  mode, rc);
120  goto bail;
121  }
122 
123  rc = pmac_i2c_xfer(bus, addrdir, subsize, subaddr, buf, len);
124  if (rc) {
125  if (rc == -ENXIO)
126  dev_dbg(&adap->dev,
127  "I2C transfer at 0x%02x failed, size %d, "
128  "err %d\n", addrdir >> 1, size, rc);
129  else
130  dev_err(&adap->dev,
131  "I2C transfer at 0x%02x failed, size %d, "
132  "err %d\n", addrdir >> 1, size, rc);
133  goto bail;
134  }
135 
136  if (size == I2C_SMBUS_WORD_DATA && read) {
137  data->word = ((u16)local[1]) << 8;
138  data->word |= local[0];
139  }
140 
141  bail:
142  pmac_i2c_close(bus);
143  return rc;
144 }
145 
146 /*
147  * Generic i2c master transfer entrypoint. This driver only support single
148  * messages (for "lame i2c" transfers). Anything else should use the smbus
149  * entry point
150  */
151 static int i2c_powermac_master_xfer( struct i2c_adapter *adap,
152  struct i2c_msg *msgs,
153  int num)
154 {
155  struct pmac_i2c_bus *bus = i2c_get_adapdata(adap);
156  int rc = 0;
157  int read;
158  int addrdir;
159 
160  if (num != 1) {
161  dev_err(&adap->dev,
162  "Multi-message I2C transactions not supported\n");
163  return -EOPNOTSUPP;
164  }
165 
166  if (msgs->flags & I2C_M_TEN)
167  return -EINVAL;
168  read = (msgs->flags & I2C_M_RD) != 0;
169  addrdir = (msgs->addr << 1) | read;
170 
171  rc = pmac_i2c_open(bus, 0);
172  if (rc) {
173  dev_err(&adap->dev, "Failed to open I2C, err %d\n", rc);
174  return rc;
175  }
176  rc = pmac_i2c_setmode(bus, pmac_i2c_mode_std);
177  if (rc) {
178  dev_err(&adap->dev, "Failed to set I2C mode %d, err %d\n",
179  pmac_i2c_mode_std, rc);
180  goto bail;
181  }
182  rc = pmac_i2c_xfer(bus, addrdir, 0, 0, msgs->buf, msgs->len);
183  if (rc < 0) {
184  if (rc == -ENXIO)
185  dev_dbg(&adap->dev, "I2C %s 0x%02x failed, err %d\n",
186  addrdir & 1 ? "read from" : "write to",
187  addrdir >> 1, rc);
188  else
189  dev_err(&adap->dev, "I2C %s 0x%02x failed, err %d\n",
190  addrdir & 1 ? "read from" : "write to",
191  addrdir >> 1, rc);
192  }
193  bail:
194  pmac_i2c_close(bus);
195  return rc < 0 ? rc : 1;
196 }
197 
198 static u32 i2c_powermac_func(struct i2c_adapter * adapter)
199 {
203 }
204 
205 /* For now, we only handle smbus */
206 static const struct i2c_algorithm i2c_powermac_algorithm = {
207  .smbus_xfer = i2c_powermac_smbus_xfer,
208  .master_xfer = i2c_powermac_master_xfer,
209  .functionality = i2c_powermac_func,
210 };
211 
212 
213 static int __devexit i2c_powermac_remove(struct platform_device *dev)
214 {
215  struct i2c_adapter *adapter = platform_get_drvdata(dev);
216  int rc;
217 
218  rc = i2c_del_adapter(adapter);
219  /* We aren't that prepared to deal with this... */
220  if (rc)
222  "i2c-powermac.c: Failed to remove bus %s !\n",
223  adapter->name);
224  platform_set_drvdata(dev, NULL);
225  memset(adapter, 0, sizeof(*adapter));
226 
227  return 0;
228 }
229 
230 static u32 __devinit i2c_powermac_get_addr(struct i2c_adapter *adap,
231  struct pmac_i2c_bus *bus,
232  struct device_node *node)
233 {
234  const __be32 *prop;
235  int len;
236 
237  /* First check for valid "reg" */
238  prop = of_get_property(node, "reg", &len);
239  if (prop && (len >= sizeof(int)))
240  return (be32_to_cpup(prop) & 0xff) >> 1;
241 
242  /* Then check old-style "i2c-address" */
243  prop = of_get_property(node, "i2c-address", &len);
244  if (prop && (len >= sizeof(int)))
245  return (be32_to_cpup(prop) & 0xff) >> 1;
246 
247  /* Now handle some devices with missing "reg" properties */
248  if (!strcmp(node->name, "cereal"))
249  return 0x60;
250  else if (!strcmp(node->name, "deq"))
251  return 0x34;
252 
253  dev_warn(&adap->dev, "No i2c address for %s\n", node->full_name);
254 
255  return 0xffffffff;
256 }
257 
258 static void __devinit i2c_powermac_create_one(struct i2c_adapter *adap,
259  const char *type,
260  u32 addr)
261 {
262  struct i2c_board_info info = {};
263  struct i2c_client *newdev;
264 
265  strncpy(info.type, type, sizeof(info.type));
266  info.addr = addr;
267  newdev = i2c_new_device(adap, &info);
268  if (!newdev)
269  dev_err(&adap->dev,
270  "i2c-powermac: Failure to register missing %s\n",
271  type);
272 }
273 
274 static void __devinit i2c_powermac_add_missing(struct i2c_adapter *adap,
275  struct pmac_i2c_bus *bus,
276  bool found_onyx)
277 {
278  struct device_node *busnode = pmac_i2c_get_bus_node(bus);
279  int rc;
280 
281  /* Check for the onyx audio codec */
282 #define ONYX_REG_CONTROL 67
283  if (of_device_is_compatible(busnode, "k2-i2c") && !found_onyx) {
284  union i2c_smbus_data data;
285 
286  rc = i2c_smbus_xfer(adap, 0x46, 0, I2C_SMBUS_READ,
287  ONYX_REG_CONTROL, I2C_SMBUS_BYTE_DATA,
288  &data);
289  if (rc >= 0)
290  i2c_powermac_create_one(adap, "MAC,pcm3052", 0x46);
291 
292  rc = i2c_smbus_xfer(adap, 0x47, 0, I2C_SMBUS_READ,
293  ONYX_REG_CONTROL, I2C_SMBUS_BYTE_DATA,
294  &data);
295  if (rc >= 0)
296  i2c_powermac_create_one(adap, "MAC,pcm3052", 0x47);
297  }
298 }
299 
300 static bool __devinit i2c_powermac_get_type(struct i2c_adapter *adap,
301  struct device_node *node,
302  u32 addr, char *type, int type_size)
303 {
304  char tmp[16];
305 
306  /* Note: we to _NOT_ want the standard
307  * i2c drivers to match with any of our powermac stuff
308  * unless they have been specifically modified to handle
309  * it on a case by case basis. For example, for thermal
310  * control, things like lm75 etc... shall match with their
311  * corresponding windfarm drivers, _NOT_ the generic ones,
312  * so we force a prefix of AAPL, onto the modalias to
313  * make that happen
314  */
315 
316  /* First try proper modalias */
317  if (of_modalias_node(node, tmp, sizeof(tmp)) >= 0) {
318  snprintf(type, type_size, "MAC,%s", tmp);
319  return true;
320  }
321 
322  /* Now look for known workarounds */
323  if (!strcmp(node->name, "deq")) {
324  /* Apple uses address 0x34 for TAS3001 and 0x35 for TAS3004 */
325  if (addr == 0x34) {
326  snprintf(type, type_size, "MAC,tas3001");
327  return true;
328  } else if (addr == 0x35) {
329  snprintf(type, type_size, "MAC,tas3004");
330  return true;
331  }
332  }
333 
334  dev_err(&adap->dev, "i2c-powermac: modalias failure"
335  " on %s\n", node->full_name);
336  return false;
337 }
338 
339 static void __devinit i2c_powermac_register_devices(struct i2c_adapter *adap,
340  struct pmac_i2c_bus *bus)
341 {
342  struct i2c_client *newdev;
343  struct device_node *node;
344  bool found_onyx = 0;
345 
346  /*
347  * In some cases we end up with the via-pmu node itself, in this
348  * case we skip this function completely as the device-tree will
349  * not contain anything useful.
350  */
351  if (!strcmp(adap->dev.of_node->name, "via-pmu"))
352  return;
353 
354  for_each_child_of_node(adap->dev.of_node, node) {
355  struct i2c_board_info info = {};
356  u32 addr;
357 
358  /* Get address & channel */
359  addr = i2c_powermac_get_addr(adap, bus, node);
360  if (addr == 0xffffffff)
361  continue;
362 
363  /* Multibus setup, check channel */
364  if (!pmac_i2c_match_adapter(node, adap))
365  continue;
366 
367  dev_dbg(&adap->dev, "i2c-powermac: register %s\n",
368  node->full_name);
369 
370  /*
371  * Keep track of some device existence to handle
372  * workarounds later.
373  */
374  if (of_device_is_compatible(node, "pcm3052"))
375  found_onyx = true;
376 
377  /* Make up a modalias */
378  if (!i2c_powermac_get_type(adap, node, addr,
379  info.type, sizeof(info.type))) {
380  continue;
381  }
382 
383  /* Fill out the rest of the info structure */
384  info.addr = addr;
385  info.irq = irq_of_parse_and_map(node, 0);
386  info.of_node = of_node_get(node);
387 
388  newdev = i2c_new_device(adap, &info);
389  if (!newdev) {
390  dev_err(&adap->dev, "i2c-powermac: Failure to register"
391  " %s\n", node->full_name);
392  of_node_put(node);
393  /* We do not dispose of the interrupt mapping on
394  * purpose. It's not necessary (interrupt cannot be
395  * re-used) and somebody else might have grabbed it
396  * via direct DT lookup so let's not bother
397  */
398  continue;
399  }
400  }
401 
402  /* Additional workarounds */
403  i2c_powermac_add_missing(adap, bus, found_onyx);
404 }
405 
406 static int __devinit i2c_powermac_probe(struct platform_device *dev)
407 {
408  struct pmac_i2c_bus *bus = dev->dev.platform_data;
409  struct device_node *parent = NULL;
410  struct i2c_adapter *adapter;
411  const char *basename;
412  int rc;
413 
414  if (bus == NULL)
415  return -EINVAL;
416  adapter = pmac_i2c_get_adapter(bus);
417 
418  /* Ok, now we need to make up a name for the interface that will
419  * match what we used to do in the past, that is basically the
420  * controller's parent device node for keywest. PMU didn't have a
421  * naming convention and SMU has a different one
422  */
423  switch(pmac_i2c_get_type(bus)) {
424  case pmac_i2c_bus_keywest:
425  parent = of_get_parent(pmac_i2c_get_controller(bus));
426  if (parent == NULL)
427  return -EINVAL;
428  basename = parent->name;
429  break;
430  case pmac_i2c_bus_pmu:
431  basename = "pmu";
432  break;
433  case pmac_i2c_bus_smu:
434  /* This is not what we used to do but I'm fixing drivers at
435  * the same time as this change
436  */
437  basename = "smu";
438  break;
439  default:
440  return -EINVAL;
441  }
442  snprintf(adapter->name, sizeof(adapter->name), "%s %d", basename,
443  pmac_i2c_get_channel(bus));
444  of_node_put(parent);
445 
446  platform_set_drvdata(dev, adapter);
447  adapter->algo = &i2c_powermac_algorithm;
448  i2c_set_adapdata(adapter, bus);
449  adapter->dev.parent = &dev->dev;
450  adapter->dev.of_node = dev->dev.of_node;
451  rc = i2c_add_adapter(adapter);
452  if (rc) {
453  printk(KERN_ERR "i2c-powermac: Adapter %s registration "
454  "failed\n", adapter->name);
455  memset(adapter, 0, sizeof(*adapter));
456  }
457 
458  printk(KERN_INFO "PowerMac i2c bus %s registered\n", adapter->name);
459 
460  /* Cannot use of_i2c_register_devices() due to Apple device-tree
461  * funkyness
462  */
463  i2c_powermac_register_devices(adapter, bus);
464 
465  return rc;
466 }
467 
468 static struct platform_driver i2c_powermac_driver = {
469  .probe = i2c_powermac_probe,
470  .remove = __devexit_p(i2c_powermac_remove),
471  .driver = {
472  .name = "i2c-powermac",
473  .bus = &platform_bus_type,
474  },
475 };
476 
477 module_platform_driver(i2c_powermac_driver);
478 
479 MODULE_ALIAS("platform:i2c-powermac");