23 #include <linux/module.h>
24 #include <linux/kernel.h>
25 #include <linux/types.h>
26 #include <linux/i2c.h>
28 #include <linux/device.h>
51 int addrdir = (addr << 1) | read;
58 mode = pmac_i2c_mode_std;
62 mode = read ? pmac_i2c_mode_combined : pmac_i2c_mode_stdsub;
79 local[0] = data->
word & 0xff;
80 local[1] = (data->
word >> 8) & 0xff;
99 len = data->
block[0] + 1;
102 buf = &data->
block[1];
103 len = data->
block[0];
112 dev_err(&adap->
dev,
"Failed to open I2C, err %d\n", rc);
118 dev_err(&adap->
dev,
"Failed to set I2C mode %d, err %d\n",
123 rc =
pmac_i2c_xfer(bus, addrdir, subsize, subaddr, buf, len);
127 "I2C transfer at 0x%02x failed, size %d, "
128 "err %d\n", addrdir >> 1, size, rc);
131 "I2C transfer at 0x%02x failed, size %d, "
132 "err %d\n", addrdir >> 1, size, rc);
137 data->
word = ((
u16)local[1]) << 8;
138 data->
word |= local[0];
151 static int i2c_powermac_master_xfer(
struct i2c_adapter *adap,
162 "Multi-message I2C transactions not supported\n");
169 addrdir = (msgs->
addr << 1) | read;
173 dev_err(&adap->
dev,
"Failed to open I2C, err %d\n", rc);
178 dev_err(&adap->
dev,
"Failed to set I2C mode %d, err %d\n",
179 pmac_i2c_mode_std, rc);
185 dev_dbg(&adap->
dev,
"I2C %s 0x%02x failed, err %d\n",
186 addrdir & 1 ?
"read from" :
"write to",
189 dev_err(&adap->
dev,
"I2C %s 0x%02x failed, err %d\n",
190 addrdir & 1 ?
"read from" :
"write to",
195 return rc < 0 ? rc : 1;
207 .smbus_xfer = i2c_powermac_smbus_xfer,
208 .master_xfer = i2c_powermac_master_xfer,
209 .functionality = i2c_powermac_func,
222 "i2c-powermac.c: Failed to remove bus %s !\n",
224 platform_set_drvdata(dev,
NULL);
225 memset(adapter, 0,
sizeof(*adapter));
239 if (prop && (len >=
sizeof(
int)))
244 if (prop && (len >=
sizeof(
int)))
270 "i2c-powermac: Failure to register missing %s\n",
282 #define ONYX_REG_CONTROL 67
290 i2c_powermac_create_one(adap,
"MAC,pcm3052", 0x46);
296 i2c_powermac_create_one(adap,
"MAC,pcm3052", 0x47);
302 u32 addr,
char *type,
int type_size)
318 snprintf(type, type_size,
"MAC,%s", tmp);
326 snprintf(type, type_size,
"MAC,tas3001");
328 }
else if (addr == 0x35) {
329 snprintf(type, type_size,
"MAC,tas3004");
334 dev_err(&adap->
dev,
"i2c-powermac: modalias failure"
351 if (!
strcmp(adap->
dev.of_node->name,
"via-pmu"))
359 addr = i2c_powermac_get_addr(adap, bus, node);
360 if (addr == 0xffffffff)
367 dev_dbg(&adap->
dev,
"i2c-powermac: register %s\n",
378 if (!i2c_powermac_get_type(adap, node, addr,
386 info.
of_node = of_node_get(node);
390 dev_err(&adap->
dev,
"i2c-powermac: Failure to register"
403 i2c_powermac_add_missing(adap, bus, found_onyx);
411 const char *basename;
424 case pmac_i2c_bus_keywest:
428 basename = parent->
name;
430 case pmac_i2c_bus_pmu:
433 case pmac_i2c_bus_smu:
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;
454 "failed\n", adapter->
name);
455 memset(adapter, 0,
sizeof(*adapter));
463 i2c_powermac_register_devices(adapter, bus);
469 .probe = i2c_powermac_probe,
472 .name =
"i2c-powermac",