i2c-atr.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * I2C Address Translator
  4. *
  5. * Copyright (c) 2019,2022 Luca Ceresoli <luca@lucaceresoli.net>
  6. * Copyright (c) 2022,2023 Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
  7. *
  8. * Originally based on i2c-mux.c
  9. */
  10. #include <linux/i2c-atr.h>
  11. #include <linux/i2c.h>
  12. #include <linux/kernel.h>
  13. #include <linux/module.h>
  14. #include <linux/mutex.h>
  15. #include <linux/property.h>
  16. #include <linux/slab.h>
  17. #include <linux/spinlock.h>
  18. #define ATR_MAX_ADAPTERS 100 /* Just a sanity limit */
  19. #define ATR_MAX_SYMLINK_LEN 11 /* Longest name is 10 chars: "channel-99" */
  20. /**
  21. * struct i2c_atr_alias_pair - Holds the alias assigned to a client.
  22. * @node: List node
  23. * @client: Pointer to the client on the child bus
  24. * @alias: I2C alias address assigned by the driver.
  25. * This is the address that will be used to issue I2C transactions
  26. * on the parent (physical) bus.
  27. */
  28. struct i2c_atr_alias_pair {
  29. struct list_head node;
  30. const struct i2c_client *client;
  31. u16 alias;
  32. };
  33. /**
  34. * struct i2c_atr_chan - Data for a channel.
  35. * @adap: The &struct i2c_adapter for the channel
  36. * @atr: The parent I2C ATR
  37. * @chan_id: The ID of this channel
  38. * @alias_list: List of @struct i2c_atr_alias_pair containing the
  39. * assigned aliases
  40. * @orig_addrs_lock: Mutex protecting @orig_addrs
  41. * @orig_addrs: Buffer used to store the original addresses during transmit
  42. * @orig_addrs_size: Size of @orig_addrs
  43. */
  44. struct i2c_atr_chan {
  45. struct i2c_adapter adap;
  46. struct i2c_atr *atr;
  47. u32 chan_id;
  48. struct list_head alias_list;
  49. /* Lock orig_addrs during xfer */
  50. struct mutex orig_addrs_lock;
  51. u16 *orig_addrs;
  52. unsigned int orig_addrs_size;
  53. };
  54. /**
  55. * struct i2c_atr - The I2C ATR instance
  56. * @parent: The parent &struct i2c_adapter
  57. * @dev: The device that owns the I2C ATR instance
  58. * @ops: &struct i2c_atr_ops
  59. * @priv: Private driver data, set with i2c_atr_set_driver_data()
  60. * @algo: The &struct i2c_algorithm for adapters
  61. * @lock: Lock for the I2C bus segment (see &struct i2c_lock_operations)
  62. * @max_adapters: Maximum number of adapters this I2C ATR can have
  63. * @num_aliases: Number of aliases in the aliases array
  64. * @aliases: The aliases array
  65. * @alias_mask_lock: Lock protecting alias_use_mask
  66. * @alias_use_mask: Bitmask for used aliases in aliases array
  67. * @i2c_nb: Notifier for remote client add & del events
  68. * @adapter: Array of adapters
  69. */
  70. struct i2c_atr {
  71. struct i2c_adapter *parent;
  72. struct device *dev;
  73. const struct i2c_atr_ops *ops;
  74. void *priv;
  75. struct i2c_algorithm algo;
  76. /* lock for the I2C bus segment (see struct i2c_lock_operations) */
  77. struct mutex lock;
  78. int max_adapters;
  79. size_t num_aliases;
  80. const u16 *aliases;
  81. /* Protects alias_use_mask */
  82. spinlock_t alias_mask_lock;
  83. unsigned long *alias_use_mask;
  84. struct notifier_block i2c_nb;
  85. struct i2c_adapter *adapter[] __counted_by(max_adapters);
  86. };
  87. static struct i2c_atr_alias_pair *
  88. i2c_atr_find_mapping_by_client(const struct list_head *list,
  89. const struct i2c_client *client)
  90. {
  91. struct i2c_atr_alias_pair *c2a;
  92. list_for_each_entry(c2a, list, node) {
  93. if (c2a->client == client)
  94. return c2a;
  95. }
  96. return NULL;
  97. }
  98. static struct i2c_atr_alias_pair *
  99. i2c_atr_find_mapping_by_addr(const struct list_head *list, u16 phys_addr)
  100. {
  101. struct i2c_atr_alias_pair *c2a;
  102. list_for_each_entry(c2a, list, node) {
  103. if (c2a->client->addr == phys_addr)
  104. return c2a;
  105. }
  106. return NULL;
  107. }
  108. /*
  109. * Replace all message addresses with their aliases, saving the original
  110. * addresses.
  111. *
  112. * This function is internal for use in i2c_atr_master_xfer(). It must be
  113. * followed by i2c_atr_unmap_msgs() to restore the original addresses.
  114. */
  115. static int i2c_atr_map_msgs(struct i2c_atr_chan *chan, struct i2c_msg *msgs,
  116. int num)
  117. {
  118. struct i2c_atr *atr = chan->atr;
  119. static struct i2c_atr_alias_pair *c2a;
  120. int i;
  121. /* Ensure we have enough room to save the original addresses */
  122. if (unlikely(chan->orig_addrs_size < num)) {
  123. u16 *new_buf;
  124. /* We don't care about old data, hence no realloc() */
  125. new_buf = kmalloc_array(num, sizeof(*new_buf), GFP_KERNEL);
  126. if (!new_buf)
  127. return -ENOMEM;
  128. kfree(chan->orig_addrs);
  129. chan->orig_addrs = new_buf;
  130. chan->orig_addrs_size = num;
  131. }
  132. for (i = 0; i < num; i++) {
  133. chan->orig_addrs[i] = msgs[i].addr;
  134. c2a = i2c_atr_find_mapping_by_addr(&chan->alias_list,
  135. msgs[i].addr);
  136. if (!c2a) {
  137. dev_err(atr->dev, "client 0x%02x not mapped!\n",
  138. msgs[i].addr);
  139. while (i--)
  140. msgs[i].addr = chan->orig_addrs[i];
  141. return -ENXIO;
  142. }
  143. msgs[i].addr = c2a->alias;
  144. }
  145. return 0;
  146. }
  147. /*
  148. * Restore all message address aliases with the original addresses. This
  149. * function is internal for use in i2c_atr_master_xfer() and for this reason it
  150. * needs no null and size checks on orig_addr.
  151. *
  152. * @see i2c_atr_map_msgs()
  153. */
  154. static void i2c_atr_unmap_msgs(struct i2c_atr_chan *chan, struct i2c_msg *msgs,
  155. int num)
  156. {
  157. int i;
  158. for (i = 0; i < num; i++)
  159. msgs[i].addr = chan->orig_addrs[i];
  160. }
  161. static int i2c_atr_master_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs,
  162. int num)
  163. {
  164. struct i2c_atr_chan *chan = adap->algo_data;
  165. struct i2c_atr *atr = chan->atr;
  166. struct i2c_adapter *parent = atr->parent;
  167. int ret;
  168. /* Translate addresses */
  169. mutex_lock(&chan->orig_addrs_lock);
  170. ret = i2c_atr_map_msgs(chan, msgs, num);
  171. if (ret < 0)
  172. goto err_unlock;
  173. /* Perform the transfer */
  174. ret = i2c_transfer(parent, msgs, num);
  175. /* Restore addresses */
  176. i2c_atr_unmap_msgs(chan, msgs, num);
  177. err_unlock:
  178. mutex_unlock(&chan->orig_addrs_lock);
  179. return ret;
  180. }
  181. static int i2c_atr_smbus_xfer(struct i2c_adapter *adap, u16 addr,
  182. unsigned short flags, char read_write, u8 command,
  183. int size, union i2c_smbus_data *data)
  184. {
  185. struct i2c_atr_chan *chan = adap->algo_data;
  186. struct i2c_atr *atr = chan->atr;
  187. struct i2c_adapter *parent = atr->parent;
  188. struct i2c_atr_alias_pair *c2a;
  189. c2a = i2c_atr_find_mapping_by_addr(&chan->alias_list, addr);
  190. if (!c2a) {
  191. dev_err(atr->dev, "client 0x%02x not mapped!\n", addr);
  192. return -ENXIO;
  193. }
  194. return i2c_smbus_xfer(parent, c2a->alias, flags, read_write, command,
  195. size, data);
  196. }
  197. static u32 i2c_atr_functionality(struct i2c_adapter *adap)
  198. {
  199. struct i2c_atr_chan *chan = adap->algo_data;
  200. struct i2c_adapter *parent = chan->atr->parent;
  201. return parent->algo->functionality(parent);
  202. }
  203. static void i2c_atr_lock_bus(struct i2c_adapter *adapter, unsigned int flags)
  204. {
  205. struct i2c_atr_chan *chan = adapter->algo_data;
  206. struct i2c_atr *atr = chan->atr;
  207. mutex_lock(&atr->lock);
  208. }
  209. static int i2c_atr_trylock_bus(struct i2c_adapter *adapter, unsigned int flags)
  210. {
  211. struct i2c_atr_chan *chan = adapter->algo_data;
  212. struct i2c_atr *atr = chan->atr;
  213. return mutex_trylock(&atr->lock);
  214. }
  215. static void i2c_atr_unlock_bus(struct i2c_adapter *adapter, unsigned int flags)
  216. {
  217. struct i2c_atr_chan *chan = adapter->algo_data;
  218. struct i2c_atr *atr = chan->atr;
  219. mutex_unlock(&atr->lock);
  220. }
  221. static const struct i2c_lock_operations i2c_atr_lock_ops = {
  222. .lock_bus = i2c_atr_lock_bus,
  223. .trylock_bus = i2c_atr_trylock_bus,
  224. .unlock_bus = i2c_atr_unlock_bus,
  225. };
  226. static int i2c_atr_reserve_alias(struct i2c_atr *atr)
  227. {
  228. unsigned long idx;
  229. spin_lock(&atr->alias_mask_lock);
  230. idx = find_first_zero_bit(atr->alias_use_mask, atr->num_aliases);
  231. if (idx >= atr->num_aliases) {
  232. spin_unlock(&atr->alias_mask_lock);
  233. dev_err(atr->dev, "failed to find a free alias\n");
  234. return -EBUSY;
  235. }
  236. set_bit(idx, atr->alias_use_mask);
  237. spin_unlock(&atr->alias_mask_lock);
  238. return atr->aliases[idx];
  239. }
  240. static void i2c_atr_release_alias(struct i2c_atr *atr, u16 alias)
  241. {
  242. unsigned int idx;
  243. spin_lock(&atr->alias_mask_lock);
  244. for (idx = 0; idx < atr->num_aliases; ++idx) {
  245. if (atr->aliases[idx] == alias) {
  246. clear_bit(idx, atr->alias_use_mask);
  247. spin_unlock(&atr->alias_mask_lock);
  248. return;
  249. }
  250. }
  251. spin_unlock(&atr->alias_mask_lock);
  252. /* This should never happen */
  253. dev_warn(atr->dev, "Unable to find mapped alias\n");
  254. }
  255. static int i2c_atr_attach_client(struct i2c_adapter *adapter,
  256. const struct i2c_client *client)
  257. {
  258. struct i2c_atr_chan *chan = adapter->algo_data;
  259. struct i2c_atr *atr = chan->atr;
  260. struct i2c_atr_alias_pair *c2a;
  261. u16 alias;
  262. int ret;
  263. ret = i2c_atr_reserve_alias(atr);
  264. if (ret < 0)
  265. return ret;
  266. alias = ret;
  267. c2a = kzalloc(sizeof(*c2a), GFP_KERNEL);
  268. if (!c2a) {
  269. ret = -ENOMEM;
  270. goto err_release_alias;
  271. }
  272. ret = atr->ops->attach_client(atr, chan->chan_id, client, alias);
  273. if (ret)
  274. goto err_free;
  275. dev_dbg(atr->dev, "chan%u: client 0x%02x mapped at alias 0x%02x (%s)\n",
  276. chan->chan_id, client->addr, alias, client->name);
  277. c2a->client = client;
  278. c2a->alias = alias;
  279. list_add(&c2a->node, &chan->alias_list);
  280. return 0;
  281. err_free:
  282. kfree(c2a);
  283. err_release_alias:
  284. i2c_atr_release_alias(atr, alias);
  285. return ret;
  286. }
  287. static void i2c_atr_detach_client(struct i2c_adapter *adapter,
  288. const struct i2c_client *client)
  289. {
  290. struct i2c_atr_chan *chan = adapter->algo_data;
  291. struct i2c_atr *atr = chan->atr;
  292. struct i2c_atr_alias_pair *c2a;
  293. atr->ops->detach_client(atr, chan->chan_id, client);
  294. c2a = i2c_atr_find_mapping_by_client(&chan->alias_list, client);
  295. if (!c2a) {
  296. /* This should never happen */
  297. dev_warn(atr->dev, "Unable to find address mapping\n");
  298. return;
  299. }
  300. i2c_atr_release_alias(atr, c2a->alias);
  301. dev_dbg(atr->dev,
  302. "chan%u: client 0x%02x unmapped from alias 0x%02x (%s)\n",
  303. chan->chan_id, client->addr, c2a->alias, client->name);
  304. list_del(&c2a->node);
  305. kfree(c2a);
  306. }
  307. static int i2c_atr_bus_notifier_call(struct notifier_block *nb,
  308. unsigned long event, void *device)
  309. {
  310. struct i2c_atr *atr = container_of(nb, struct i2c_atr, i2c_nb);
  311. struct device *dev = device;
  312. struct i2c_client *client;
  313. u32 chan_id;
  314. int ret;
  315. client = i2c_verify_client(dev);
  316. if (!client)
  317. return NOTIFY_DONE;
  318. /* Is the client in one of our adapters? */
  319. for (chan_id = 0; chan_id < atr->max_adapters; ++chan_id) {
  320. if (client->adapter == atr->adapter[chan_id])
  321. break;
  322. }
  323. if (chan_id == atr->max_adapters)
  324. return NOTIFY_DONE;
  325. switch (event) {
  326. case BUS_NOTIFY_ADD_DEVICE:
  327. ret = i2c_atr_attach_client(client->adapter, client);
  328. if (ret)
  329. dev_err(atr->dev,
  330. "Failed to attach remote client '%s': %d\n",
  331. dev_name(dev), ret);
  332. break;
  333. case BUS_NOTIFY_REMOVED_DEVICE:
  334. i2c_atr_detach_client(client->adapter, client);
  335. break;
  336. default:
  337. break;
  338. }
  339. return NOTIFY_DONE;
  340. }
  341. static int i2c_atr_parse_alias_pool(struct i2c_atr *atr)
  342. {
  343. struct device *dev = atr->dev;
  344. unsigned long *alias_use_mask;
  345. size_t num_aliases;
  346. unsigned int i;
  347. u32 *aliases32;
  348. u16 *aliases16;
  349. int ret;
  350. ret = fwnode_property_count_u32(dev_fwnode(dev), "i2c-alias-pool");
  351. if (ret < 0) {
  352. dev_err(dev, "Failed to count 'i2c-alias-pool' property: %d\n",
  353. ret);
  354. return ret;
  355. }
  356. num_aliases = ret;
  357. if (!num_aliases)
  358. return 0;
  359. aliases32 = kcalloc(num_aliases, sizeof(*aliases32), GFP_KERNEL);
  360. if (!aliases32)
  361. return -ENOMEM;
  362. ret = fwnode_property_read_u32_array(dev_fwnode(dev), "i2c-alias-pool",
  363. aliases32, num_aliases);
  364. if (ret < 0) {
  365. dev_err(dev, "Failed to read 'i2c-alias-pool' property: %d\n",
  366. ret);
  367. goto err_free_aliases32;
  368. }
  369. aliases16 = kcalloc(num_aliases, sizeof(*aliases16), GFP_KERNEL);
  370. if (!aliases16) {
  371. ret = -ENOMEM;
  372. goto err_free_aliases32;
  373. }
  374. for (i = 0; i < num_aliases; i++) {
  375. if (!(aliases32[i] & 0xffff0000)) {
  376. aliases16[i] = aliases32[i];
  377. continue;
  378. }
  379. dev_err(dev, "Failed to parse 'i2c-alias-pool' property: I2C flags are not supported\n");
  380. ret = -EINVAL;
  381. goto err_free_aliases16;
  382. }
  383. alias_use_mask = bitmap_zalloc(num_aliases, GFP_KERNEL);
  384. if (!alias_use_mask) {
  385. ret = -ENOMEM;
  386. goto err_free_aliases16;
  387. }
  388. kfree(aliases32);
  389. atr->num_aliases = num_aliases;
  390. atr->aliases = aliases16;
  391. atr->alias_use_mask = alias_use_mask;
  392. dev_dbg(dev, "i2c-alias-pool has %zu aliases", atr->num_aliases);
  393. return 0;
  394. err_free_aliases16:
  395. kfree(aliases16);
  396. err_free_aliases32:
  397. kfree(aliases32);
  398. return ret;
  399. }
  400. struct i2c_atr *i2c_atr_new(struct i2c_adapter *parent, struct device *dev,
  401. const struct i2c_atr_ops *ops, int max_adapters)
  402. {
  403. struct i2c_atr *atr;
  404. int ret;
  405. if (max_adapters > ATR_MAX_ADAPTERS)
  406. return ERR_PTR(-EINVAL);
  407. if (!ops || !ops->attach_client || !ops->detach_client)
  408. return ERR_PTR(-EINVAL);
  409. atr = kzalloc(struct_size(atr, adapter, max_adapters), GFP_KERNEL);
  410. if (!atr)
  411. return ERR_PTR(-ENOMEM);
  412. mutex_init(&atr->lock);
  413. spin_lock_init(&atr->alias_mask_lock);
  414. atr->parent = parent;
  415. atr->dev = dev;
  416. atr->ops = ops;
  417. atr->max_adapters = max_adapters;
  418. if (parent->algo->master_xfer)
  419. atr->algo.master_xfer = i2c_atr_master_xfer;
  420. if (parent->algo->smbus_xfer)
  421. atr->algo.smbus_xfer = i2c_atr_smbus_xfer;
  422. atr->algo.functionality = i2c_atr_functionality;
  423. ret = i2c_atr_parse_alias_pool(atr);
  424. if (ret)
  425. goto err_destroy_mutex;
  426. atr->i2c_nb.notifier_call = i2c_atr_bus_notifier_call;
  427. ret = bus_register_notifier(&i2c_bus_type, &atr->i2c_nb);
  428. if (ret)
  429. goto err_free_aliases;
  430. return atr;
  431. err_free_aliases:
  432. bitmap_free(atr->alias_use_mask);
  433. kfree(atr->aliases);
  434. err_destroy_mutex:
  435. mutex_destroy(&atr->lock);
  436. kfree(atr);
  437. return ERR_PTR(ret);
  438. }
  439. EXPORT_SYMBOL_NS_GPL(i2c_atr_new, I2C_ATR);
  440. void i2c_atr_delete(struct i2c_atr *atr)
  441. {
  442. unsigned int i;
  443. for (i = 0; i < atr->max_adapters; ++i)
  444. WARN_ON(atr->adapter[i]);
  445. bus_unregister_notifier(&i2c_bus_type, &atr->i2c_nb);
  446. bitmap_free(atr->alias_use_mask);
  447. kfree(atr->aliases);
  448. mutex_destroy(&atr->lock);
  449. kfree(atr);
  450. }
  451. EXPORT_SYMBOL_NS_GPL(i2c_atr_delete, I2C_ATR);
  452. int i2c_atr_add_adapter(struct i2c_atr *atr, u32 chan_id,
  453. struct device *adapter_parent,
  454. struct fwnode_handle *bus_handle)
  455. {
  456. struct i2c_adapter *parent = atr->parent;
  457. struct device *dev = atr->dev;
  458. struct i2c_atr_chan *chan;
  459. char symlink_name[ATR_MAX_SYMLINK_LEN];
  460. int ret;
  461. if (chan_id >= atr->max_adapters) {
  462. dev_err(dev, "No room for more i2c-atr adapters\n");
  463. return -EINVAL;
  464. }
  465. if (atr->adapter[chan_id]) {
  466. dev_err(dev, "Adapter %d already present\n", chan_id);
  467. return -EEXIST;
  468. }
  469. chan = kzalloc(sizeof(*chan), GFP_KERNEL);
  470. if (!chan)
  471. return -ENOMEM;
  472. if (!adapter_parent)
  473. adapter_parent = dev;
  474. chan->atr = atr;
  475. chan->chan_id = chan_id;
  476. INIT_LIST_HEAD(&chan->alias_list);
  477. mutex_init(&chan->orig_addrs_lock);
  478. snprintf(chan->adap.name, sizeof(chan->adap.name), "i2c-%d-atr-%d",
  479. i2c_adapter_id(parent), chan_id);
  480. chan->adap.owner = THIS_MODULE;
  481. chan->adap.algo = &atr->algo;
  482. chan->adap.algo_data = chan;
  483. chan->adap.dev.parent = adapter_parent;
  484. chan->adap.retries = parent->retries;
  485. chan->adap.timeout = parent->timeout;
  486. chan->adap.quirks = parent->quirks;
  487. chan->adap.lock_ops = &i2c_atr_lock_ops;
  488. if (bus_handle) {
  489. device_set_node(&chan->adap.dev, fwnode_handle_get(bus_handle));
  490. } else {
  491. struct fwnode_handle *atr_node;
  492. struct fwnode_handle *child;
  493. u32 reg;
  494. atr_node = device_get_named_child_node(dev, "i2c-atr");
  495. fwnode_for_each_child_node(atr_node, child) {
  496. ret = fwnode_property_read_u32(child, "reg", &reg);
  497. if (ret)
  498. continue;
  499. if (chan_id == reg)
  500. break;
  501. }
  502. device_set_node(&chan->adap.dev, child);
  503. fwnode_handle_put(atr_node);
  504. }
  505. atr->adapter[chan_id] = &chan->adap;
  506. ret = i2c_add_adapter(&chan->adap);
  507. if (ret) {
  508. dev_err(dev, "failed to add atr-adapter %u (error=%d)\n",
  509. chan_id, ret);
  510. goto err_fwnode_put;
  511. }
  512. snprintf(symlink_name, sizeof(symlink_name), "channel-%u",
  513. chan->chan_id);
  514. ret = sysfs_create_link(&chan->adap.dev.kobj, &dev->kobj, "atr_device");
  515. if (ret)
  516. dev_warn(dev, "can't create symlink to atr device\n");
  517. ret = sysfs_create_link(&dev->kobj, &chan->adap.dev.kobj, symlink_name);
  518. if (ret)
  519. dev_warn(dev, "can't create symlink for channel %u\n", chan_id);
  520. dev_dbg(dev, "Added ATR child bus %d\n", i2c_adapter_id(&chan->adap));
  521. return 0;
  522. err_fwnode_put:
  523. fwnode_handle_put(dev_fwnode(&chan->adap.dev));
  524. mutex_destroy(&chan->orig_addrs_lock);
  525. kfree(chan);
  526. return ret;
  527. }
  528. EXPORT_SYMBOL_NS_GPL(i2c_atr_add_adapter, I2C_ATR);
  529. void i2c_atr_del_adapter(struct i2c_atr *atr, u32 chan_id)
  530. {
  531. char symlink_name[ATR_MAX_SYMLINK_LEN];
  532. struct i2c_adapter *adap;
  533. struct i2c_atr_chan *chan;
  534. struct fwnode_handle *fwnode;
  535. struct device *dev = atr->dev;
  536. adap = atr->adapter[chan_id];
  537. if (!adap)
  538. return;
  539. chan = adap->algo_data;
  540. fwnode = dev_fwnode(&adap->dev);
  541. dev_dbg(dev, "Removing ATR child bus %d\n", i2c_adapter_id(adap));
  542. snprintf(symlink_name, sizeof(symlink_name), "channel-%u",
  543. chan->chan_id);
  544. sysfs_remove_link(&dev->kobj, symlink_name);
  545. sysfs_remove_link(&chan->adap.dev.kobj, "atr_device");
  546. i2c_del_adapter(adap);
  547. atr->adapter[chan_id] = NULL;
  548. fwnode_handle_put(fwnode);
  549. mutex_destroy(&chan->orig_addrs_lock);
  550. kfree(chan->orig_addrs);
  551. kfree(chan);
  552. }
  553. EXPORT_SYMBOL_NS_GPL(i2c_atr_del_adapter, I2C_ATR);
  554. void i2c_atr_set_driver_data(struct i2c_atr *atr, void *data)
  555. {
  556. atr->priv = data;
  557. }
  558. EXPORT_SYMBOL_NS_GPL(i2c_atr_set_driver_data, I2C_ATR);
  559. void *i2c_atr_get_driver_data(struct i2c_atr *atr)
  560. {
  561. return atr->priv;
  562. }
  563. EXPORT_SYMBOL_NS_GPL(i2c_atr_get_driver_data, I2C_ATR);
  564. MODULE_AUTHOR("Luca Ceresoli <luca.ceresoli@bootlin.com>");
  565. MODULE_AUTHOR("Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>");
  566. MODULE_DESCRIPTION("I2C Address Translator");
  567. MODULE_LICENSE("GPL");