Lines Matching refs:atr
12 #include <linux/i2c-atr.h>
40 * @atr: The parent I2C ATR
50 struct i2c_atr *atr;
137 struct i2c_atr *atr = chan->atr;
161 dev_err(atr->dev, "client 0x%02x not mapped!\n",
196 struct i2c_atr *atr = chan->atr;
197 struct i2c_adapter *parent = atr->parent;
224 struct i2c_atr *atr = chan->atr;
225 struct i2c_adapter *parent = atr->parent;
230 dev_err(atr->dev, "client 0x%02x not mapped!\n", addr);
241 struct i2c_adapter *parent = chan->atr->parent;
249 struct i2c_atr *atr = chan->atr;
251 mutex_lock(&atr->lock);
257 struct i2c_atr *atr = chan->atr;
259 return mutex_trylock(&atr->lock);
265 struct i2c_atr *atr = chan->atr;
267 mutex_unlock(&atr->lock);
276 static int i2c_atr_reserve_alias(struct i2c_atr *atr)
280 spin_lock(&atr->alias_mask_lock);
282 idx = find_first_zero_bit(atr->alias_use_mask, atr->num_aliases);
283 if (idx >= atr->num_aliases) {
284 spin_unlock(&atr->alias_mask_lock);
285 dev_err(atr->dev, "failed to find a free alias\n");
289 set_bit(idx, atr->alias_use_mask);
291 spin_unlock(&atr->alias_mask_lock);
293 return atr->aliases[idx];
296 static void i2c_atr_release_alias(struct i2c_atr *atr, u16 alias)
300 spin_lock(&atr->alias_mask_lock);
302 for (idx = 0; idx < atr->num_aliases; ++idx) {
303 if (atr->aliases[idx] == alias) {
304 clear_bit(idx, atr->alias_use_mask);
305 spin_unlock(&atr->alias_mask_lock);
310 spin_unlock(&atr->alias_mask_lock);
313 dev_warn(atr->dev, "Unable to find mapped alias\n");
320 struct i2c_atr *atr = chan->atr;
325 ret = i2c_atr_reserve_alias(atr);
337 ret = atr->ops->attach_client(atr, chan->chan_id, client, alias);
341 dev_dbg(atr->dev, "chan%u: client 0x%02x mapped at alias 0x%02x (%s)\n",
353 i2c_atr_release_alias(atr, alias);
362 struct i2c_atr *atr = chan->atr;
365 atr->ops->detach_client(atr, chan->chan_id, client);
370 dev_warn(atr->dev, "Unable to find address mapping\n");
374 i2c_atr_release_alias(atr, c2a->alias);
376 dev_dbg(atr->dev,
387 struct i2c_atr *atr = container_of(nb, struct i2c_atr, i2c_nb);
398 for (chan_id = 0; chan_id < atr->max_adapters; ++chan_id) {
399 if (client->adapter == atr->adapter[chan_id])
403 if (chan_id == atr->max_adapters)
410 dev_err(atr->dev,
426 static int i2c_atr_parse_alias_pool(struct i2c_atr *atr)
428 struct device *dev = atr->dev;
485 atr->num_aliases = num_aliases;
486 atr->aliases = aliases16;
487 atr->alias_use_mask = alias_use_mask;
489 dev_dbg(dev, "i2c-alias-pool has %zu aliases", atr->num_aliases);
503 struct i2c_atr *atr;
512 atr = kzalloc(struct_size(atr, adapter, max_adapters), GFP_KERNEL);
513 if (!atr)
516 mutex_init(&atr->lock);
517 spin_lock_init(&atr->alias_mask_lock);
519 atr->parent = parent;
520 atr->dev = dev;
521 atr->ops = ops;
522 atr->max_adapters = max_adapters;
525 atr->algo.master_xfer = i2c_atr_master_xfer;
527 atr->algo.smbus_xfer = i2c_atr_smbus_xfer;
528 atr->algo.functionality = i2c_atr_functionality;
530 ret = i2c_atr_parse_alias_pool(atr);
534 atr->i2c_nb.notifier_call = i2c_atr_bus_notifier_call;
535 ret = bus_register_notifier(&i2c_bus_type, &atr->i2c_nb);
539 return atr;
542 bitmap_free(atr->alias_use_mask);
543 kfree(atr->aliases);
545 mutex_destroy(&atr->lock);
546 kfree(atr);
552 void i2c_atr_delete(struct i2c_atr *atr)
556 for (i = 0; i < atr->max_adapters; ++i)
557 WARN_ON(atr->adapter[i]);
559 bus_unregister_notifier(&i2c_bus_type, &atr->i2c_nb);
560 bitmap_free(atr->alias_use_mask);
561 kfree(atr->aliases);
562 mutex_destroy(&atr->lock);
563 kfree(atr);
567 int i2c_atr_add_adapter(struct i2c_atr *atr, u32 chan_id,
571 struct i2c_adapter *parent = atr->parent;
572 struct device *dev = atr->dev;
577 if (chan_id >= atr->max_adapters) {
578 dev_err(dev, "No room for more i2c-atr adapters\n");
582 if (atr->adapter[chan_id]) {
594 chan->atr = atr;
599 snprintf(chan->adap.name, sizeof(chan->adap.name), "i2c-%d-atr-%d",
602 chan->adap.algo = &atr->algo;
617 atr_node = device_get_named_child_node(dev, "i2c-atr");
631 atr->adapter[chan_id] = &chan->adap;
635 dev_err(dev, "failed to add atr-adapter %u (error=%d)\n",
645 dev_warn(dev, "can't create symlink to atr device\n");
662 void i2c_atr_del_adapter(struct i2c_atr *atr, u32 chan_id)
668 struct device *dev = atr->dev;
670 adap = atr->adapter[chan_id];
686 atr->adapter[chan_id] = NULL;
695 void i2c_atr_set_driver_data(struct i2c_atr *atr, void *data)
697 atr->priv = data;
701 void *i2c_atr_get_driver_data(struct i2c_atr *atr)
703 return atr->priv;