Lines Matching +full:i2c +full:- +full:bus +full:- +full:name
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 i2c Support for Apple SMU Controller
14 #include <linux/i2c.h>
22 MODULE_DESCRIPTION("I2C driver for Apple PowerMac");
26 * SMBUS-type transfer entrypoint
36 struct pmac_i2c_bus *bus = i2c_get_adapdata(adap); in i2c_powermac_smbus_xfer() local
62 buf = &data->byte; in i2c_powermac_smbus_xfer()
67 local[0] = data->word & 0xff; in i2c_powermac_smbus_xfer()
68 local[1] = (data->word >> 8) & 0xff; in i2c_powermac_smbus_xfer()
78 * anywhere near a pmac i2c bus anyway ... in i2c_powermac_smbus_xfer()
81 buf = data->block; in i2c_powermac_smbus_xfer()
82 len = data->block[0] + 1; in i2c_powermac_smbus_xfer()
85 buf = &data->block[1]; in i2c_powermac_smbus_xfer()
86 len = data->block[0]; in i2c_powermac_smbus_xfer()
90 return -EINVAL; in i2c_powermac_smbus_xfer()
93 rc = pmac_i2c_open(bus, 0); in i2c_powermac_smbus_xfer()
95 dev_err(&adap->dev, "Failed to open I2C, err %d\n", rc); in i2c_powermac_smbus_xfer()
99 rc = pmac_i2c_setmode(bus, mode); in i2c_powermac_smbus_xfer()
101 dev_err(&adap->dev, "Failed to set I2C mode %d, err %d\n", in i2c_powermac_smbus_xfer()
106 rc = pmac_i2c_xfer(bus, addrdir, subsize, subaddr, buf, len); in i2c_powermac_smbus_xfer()
108 if (rc == -ENXIO) in i2c_powermac_smbus_xfer()
109 dev_dbg(&adap->dev, in i2c_powermac_smbus_xfer()
110 "I2C transfer at 0x%02x failed, size %d, " in i2c_powermac_smbus_xfer()
113 dev_err(&adap->dev, in i2c_powermac_smbus_xfer()
114 "I2C transfer at 0x%02x failed, size %d, " in i2c_powermac_smbus_xfer()
120 data->word = ((u16)local[1]) << 8; in i2c_powermac_smbus_xfer()
121 data->word |= local[0]; in i2c_powermac_smbus_xfer()
125 pmac_i2c_close(bus); in i2c_powermac_smbus_xfer()
130 * Generic i2c transfer entrypoint. This driver only supports single
131 * messages (for "lame i2c" transfers). Anything else should use the smbus
138 struct pmac_i2c_bus *bus = i2c_get_adapdata(adap); in i2c_powermac_xfer() local
142 if (msgs->flags & I2C_M_TEN) in i2c_powermac_xfer()
143 return -EINVAL; in i2c_powermac_xfer()
146 rc = pmac_i2c_open(bus, 0); in i2c_powermac_xfer()
148 dev_err(&adap->dev, "Failed to open I2C, err %d\n", rc); in i2c_powermac_xfer()
151 rc = pmac_i2c_setmode(bus, pmac_i2c_mode_std); in i2c_powermac_xfer()
153 dev_err(&adap->dev, "Failed to set I2C mode %d, err %d\n", in i2c_powermac_xfer()
157 rc = pmac_i2c_xfer(bus, addrdir, 0, 0, msgs->buf, msgs->len); in i2c_powermac_xfer()
159 if (rc == -ENXIO) in i2c_powermac_xfer()
160 dev_dbg(&adap->dev, "I2C %s 0x%02x failed, err %d\n", in i2c_powermac_xfer()
164 dev_err(&adap->dev, "I2C %s 0x%02x failed, err %d\n", in i2c_powermac_xfer()
169 pmac_i2c_close(bus); in i2c_powermac_xfer()
200 struct pmac_i2c_bus *bus, in i2c_powermac_get_addr() argument
211 /* Then check old-style "i2c-address" */ in i2c_powermac_get_addr()
212 ret = of_property_read_u32(node, "i2c-address", &prop); in i2c_powermac_get_addr()
222 dev_warn(&adap->dev, "No i2c address for %pOF\n", node); in i2c_powermac_get_addr()
238 dev_err(&adap->dev, in i2c_powermac_create_one()
239 "i2c-powermac: Failure to register missing %s\n", in i2c_powermac_create_one()
244 struct pmac_i2c_bus *bus, in i2c_powermac_add_missing() argument
247 struct device_node *busnode = pmac_i2c_get_bus_node(bus); in i2c_powermac_add_missing()
252 if (of_device_is_compatible(busnode, "k2-i2c") && !found_onyx) { in i2c_powermac_add_missing()
276 * Note: we do _NOT_ want the standard i2c drivers to match with any of in i2c_powermac_get_type()
302 dev_err(&adap->dev, "i2c-powermac: modalias failure on %pOF\n", node); in i2c_powermac_get_type()
307 struct pmac_i2c_bus *bus) in i2c_powermac_register_devices() argument
314 * In some cases we end up with the via-pmu node itself, in this in i2c_powermac_register_devices()
315 * case we skip this function completely as the device-tree will in i2c_powermac_register_devices()
318 if (of_node_name_eq(adap->dev.of_node, "via-pmu")) in i2c_powermac_register_devices()
321 for_each_child_of_node(adap->dev.of_node, node) { in i2c_powermac_register_devices()
326 addr = i2c_powermac_get_addr(adap, bus, node); in i2c_powermac_register_devices()
334 dev_dbg(&adap->dev, "i2c-powermac: register %pOF\n", node); in i2c_powermac_register_devices()
356 dev_err(&adap->dev, "i2c-powermac: Failure to register" in i2c_powermac_register_devices()
361 * re-used) and somebody else might have grabbed it in i2c_powermac_register_devices()
369 i2c_powermac_add_missing(adap, bus, found_onyx); in i2c_powermac_register_devices()
374 struct pmac_i2c_bus *bus = dev_get_platdata(&dev->dev); in i2c_powermac_probe() local
379 if (bus == NULL) in i2c_powermac_probe()
380 return -EINVAL; in i2c_powermac_probe()
381 adapter = pmac_i2c_get_adapter(bus); in i2c_powermac_probe()
383 /* Ok, now we need to make up a name for the interface that will in i2c_powermac_probe()
388 switch(pmac_i2c_get_type(bus)) { in i2c_powermac_probe()
390 parent = of_get_parent(pmac_i2c_get_controller(bus)); in i2c_powermac_probe()
392 return -EINVAL; in i2c_powermac_probe()
393 snprintf(adapter->name, sizeof(adapter->name), "%pOFn %d", in i2c_powermac_probe()
395 pmac_i2c_get_channel(bus)); in i2c_powermac_probe()
399 snprintf(adapter->name, sizeof(adapter->name), "pmu %d", in i2c_powermac_probe()
400 pmac_i2c_get_channel(bus)); in i2c_powermac_probe()
406 snprintf(adapter->name, sizeof(adapter->name), "smu %d", in i2c_powermac_probe()
407 pmac_i2c_get_channel(bus)); in i2c_powermac_probe()
410 return -EINVAL; in i2c_powermac_probe()
414 adapter->algo = &i2c_powermac_algorithm; in i2c_powermac_probe()
415 adapter->quirks = &i2c_powermac_quirks; in i2c_powermac_probe()
416 i2c_set_adapdata(adapter, bus); in i2c_powermac_probe()
417 adapter->dev.parent = &dev->dev; in i2c_powermac_probe()
419 /* Clear of_node to skip automatic registration of i2c child nodes */ in i2c_powermac_probe()
420 adapter->dev.of_node = NULL; in i2c_powermac_probe()
423 printk(KERN_ERR "i2c-powermac: Adapter %s registration " in i2c_powermac_probe()
424 "failed\n", adapter->name); in i2c_powermac_probe()
429 printk(KERN_INFO "PowerMac i2c bus %s registered\n", adapter->name); in i2c_powermac_probe()
431 /* Use custom child registration due to Apple device-tree funkyness */ in i2c_powermac_probe()
432 adapter->dev.of_node = dev->dev.of_node; in i2c_powermac_probe()
433 i2c_powermac_register_devices(adapter, bus); in i2c_powermac_probe()
442 .name = "i2c-powermac",
443 .bus = &platform_bus_type,
449 MODULE_ALIAS("platform:i2c-powermac");