i2c-atr.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954
  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. #include <linux/lockdep.h>
  19. #define ATR_MAX_ADAPTERS 100 /* Just a sanity limit */
  20. #define ATR_MAX_SYMLINK_LEN 11 /* Longest name is 10 chars: "channel-99" */
  21. /**
  22. * struct i2c_atr_alias_pair - Holds the alias assigned to a client address.
  23. * @node: List node
  24. * @addr: Address of the client on the child bus.
  25. * @alias: I2C alias address assigned by the driver.
  26. * This is the address that will be used to issue I2C transactions
  27. * on the parent (physical) bus.
  28. * @fixed: Alias pair cannot be replaced during dynamic address attachment.
  29. * This flag is necessary for situations where a single I2C transaction
  30. * contains more distinct target addresses than the ATR channel can handle.
  31. * It marks addresses that have already been attached to an alias so
  32. * that their alias pair is not evicted by a subsequent address in the same
  33. * transaction.
  34. *
  35. */
  36. struct i2c_atr_alias_pair {
  37. struct list_head node;
  38. bool fixed;
  39. u16 addr;
  40. u16 alias;
  41. };
  42. /**
  43. * struct i2c_atr_alias_pool - Pool of client aliases available for an ATR.
  44. * @size: Total number of aliases
  45. * @shared: Indicates if this alias pool is shared by multiple channels
  46. *
  47. * @lock: Lock protecting @aliases and @use_mask
  48. * @aliases: Array of aliases, must hold exactly @size elements
  49. * @use_mask: Mask of used aliases
  50. */
  51. struct i2c_atr_alias_pool {
  52. size_t size;
  53. bool shared;
  54. /* Protects aliases and use_mask */
  55. spinlock_t lock;
  56. u16 *aliases;
  57. unsigned long *use_mask;
  58. };
  59. /**
  60. * struct i2c_atr_chan - Data for a channel.
  61. * @adap: The &struct i2c_adapter for the channel
  62. * @atr: The parent I2C ATR
  63. * @chan_id: The ID of this channel
  64. * @alias_pairs_lock: Mutex protecting @alias_pairs
  65. * @alias_pairs_lock_key: Lock key for @alias_pairs_lock
  66. * @alias_pairs: List of @struct i2c_atr_alias_pair containing the
  67. * assigned aliases
  68. * @alias_pool: Pool of available client aliases
  69. *
  70. * @orig_addrs_lock: Mutex protecting @orig_addrs
  71. * @orig_addrs_lock_key: Lock key for @orig_addrs_lock
  72. * @orig_addrs: Buffer used to store the original addresses during transmit
  73. * @orig_addrs_size: Size of @orig_addrs
  74. */
  75. struct i2c_atr_chan {
  76. struct i2c_adapter adap;
  77. struct i2c_atr *atr;
  78. u32 chan_id;
  79. /* Lock alias_pairs during attach/detach */
  80. struct mutex alias_pairs_lock;
  81. struct lock_class_key alias_pairs_lock_key;
  82. struct list_head alias_pairs;
  83. struct i2c_atr_alias_pool *alias_pool;
  84. /* Lock orig_addrs during xfer */
  85. struct mutex orig_addrs_lock;
  86. struct lock_class_key orig_addrs_lock_key;
  87. u16 *orig_addrs;
  88. unsigned int orig_addrs_size;
  89. };
  90. /**
  91. * struct i2c_atr - The I2C ATR instance
  92. * @parent: The parent &struct i2c_adapter
  93. * @dev: The device that owns the I2C ATR instance
  94. * @ops: &struct i2c_atr_ops
  95. * @priv: Private driver data, set with i2c_atr_set_driver_data()
  96. * @algo: The &struct i2c_algorithm for adapters
  97. * @lock: Lock for the I2C bus segment (see &struct i2c_lock_operations)
  98. * @lock_key: Lock key for @lock
  99. * @max_adapters: Maximum number of adapters this I2C ATR can have
  100. * @flags: Flags for ATR
  101. * @alias_pool: Optional common pool of available client aliases
  102. * @i2c_nb: Notifier for remote client add & del events
  103. * @adapter: Array of adapters
  104. */
  105. struct i2c_atr {
  106. struct i2c_adapter *parent;
  107. struct device *dev;
  108. const struct i2c_atr_ops *ops;
  109. void *priv;
  110. struct i2c_algorithm algo;
  111. /* lock for the I2C bus segment (see struct i2c_lock_operations) */
  112. struct mutex lock;
  113. struct lock_class_key lock_key;
  114. int max_adapters;
  115. u32 flags;
  116. struct i2c_atr_alias_pool *alias_pool;
  117. struct notifier_block i2c_nb;
  118. struct i2c_adapter *adapter[] __counted_by(max_adapters);
  119. };
  120. static struct i2c_atr_alias_pool *i2c_atr_alloc_alias_pool(size_t num_aliases, bool shared)
  121. {
  122. struct i2c_atr_alias_pool *alias_pool;
  123. int ret;
  124. alias_pool = kzalloc_obj(*alias_pool);
  125. if (!alias_pool)
  126. return ERR_PTR(-ENOMEM);
  127. alias_pool->size = num_aliases;
  128. alias_pool->aliases = kcalloc(num_aliases, sizeof(*alias_pool->aliases), GFP_KERNEL);
  129. if (!alias_pool->aliases) {
  130. ret = -ENOMEM;
  131. goto err_free_alias_pool;
  132. }
  133. alias_pool->use_mask = bitmap_zalloc(num_aliases, GFP_KERNEL);
  134. if (!alias_pool->use_mask) {
  135. ret = -ENOMEM;
  136. goto err_free_aliases;
  137. }
  138. alias_pool->shared = shared;
  139. spin_lock_init(&alias_pool->lock);
  140. return alias_pool;
  141. err_free_aliases:
  142. kfree(alias_pool->aliases);
  143. err_free_alias_pool:
  144. kfree(alias_pool);
  145. return ERR_PTR(ret);
  146. }
  147. static void i2c_atr_free_alias_pool(struct i2c_atr_alias_pool *alias_pool)
  148. {
  149. bitmap_free(alias_pool->use_mask);
  150. kfree(alias_pool->aliases);
  151. kfree(alias_pool);
  152. }
  153. /* Must be called with alias_pairs_lock held */
  154. static struct i2c_atr_alias_pair *i2c_atr_create_c2a(struct i2c_atr_chan *chan,
  155. u16 alias, u16 addr)
  156. {
  157. struct i2c_atr_alias_pair *c2a;
  158. lockdep_assert_held(&chan->alias_pairs_lock);
  159. c2a = kzalloc_obj(*c2a);
  160. if (!c2a)
  161. return NULL;
  162. c2a->addr = addr;
  163. c2a->alias = alias;
  164. list_add(&c2a->node, &chan->alias_pairs);
  165. return c2a;
  166. }
  167. /* Must be called with alias_pairs_lock held */
  168. static void i2c_atr_destroy_c2a(struct i2c_atr_alias_pair **pc2a)
  169. {
  170. list_del(&(*pc2a)->node);
  171. kfree(*pc2a);
  172. *pc2a = NULL;
  173. }
  174. static int i2c_atr_reserve_alias(struct i2c_atr_alias_pool *alias_pool)
  175. {
  176. unsigned long idx;
  177. u16 alias;
  178. spin_lock(&alias_pool->lock);
  179. idx = find_first_zero_bit(alias_pool->use_mask, alias_pool->size);
  180. if (idx >= alias_pool->size) {
  181. spin_unlock(&alias_pool->lock);
  182. return -EBUSY;
  183. }
  184. set_bit(idx, alias_pool->use_mask);
  185. alias = alias_pool->aliases[idx];
  186. spin_unlock(&alias_pool->lock);
  187. return alias;
  188. }
  189. static void i2c_atr_release_alias(struct i2c_atr_alias_pool *alias_pool, u16 alias)
  190. {
  191. unsigned int idx;
  192. spin_lock(&alias_pool->lock);
  193. for (idx = 0; idx < alias_pool->size; ++idx) {
  194. if (alias_pool->aliases[idx] == alias) {
  195. clear_bit(idx, alias_pool->use_mask);
  196. spin_unlock(&alias_pool->lock);
  197. return;
  198. }
  199. }
  200. spin_unlock(&alias_pool->lock);
  201. }
  202. static struct i2c_atr_alias_pair *
  203. i2c_atr_find_mapping_by_addr(struct i2c_atr_chan *chan, u16 addr)
  204. {
  205. struct i2c_atr_alias_pair *c2a;
  206. lockdep_assert_held(&chan->alias_pairs_lock);
  207. list_for_each_entry(c2a, &chan->alias_pairs, node) {
  208. if (c2a->addr == addr)
  209. return c2a;
  210. }
  211. return NULL;
  212. }
  213. static struct i2c_atr_alias_pair *
  214. i2c_atr_create_mapping_by_addr(struct i2c_atr_chan *chan, u16 addr)
  215. {
  216. struct i2c_atr *atr = chan->atr;
  217. struct i2c_atr_alias_pair *c2a;
  218. u16 alias;
  219. int ret;
  220. lockdep_assert_held(&chan->alias_pairs_lock);
  221. ret = i2c_atr_reserve_alias(chan->alias_pool);
  222. if (ret < 0)
  223. return NULL;
  224. alias = ret;
  225. c2a = i2c_atr_create_c2a(chan, alias, addr);
  226. if (!c2a)
  227. goto err_release_alias;
  228. ret = atr->ops->attach_addr(atr, chan->chan_id, c2a->addr, c2a->alias);
  229. if (ret) {
  230. dev_err(atr->dev, "failed to attach 0x%02x on channel %d: err %d\n",
  231. addr, chan->chan_id, ret);
  232. goto err_del_c2a;
  233. }
  234. return c2a;
  235. err_del_c2a:
  236. i2c_atr_destroy_c2a(&c2a);
  237. err_release_alias:
  238. i2c_atr_release_alias(chan->alias_pool, alias);
  239. return NULL;
  240. }
  241. static struct i2c_atr_alias_pair *
  242. i2c_atr_replace_mapping_by_addr(struct i2c_atr_chan *chan, u16 addr)
  243. {
  244. struct i2c_atr *atr = chan->atr;
  245. struct i2c_atr_alias_pair *c2a;
  246. struct list_head *alias_pairs;
  247. bool found = false;
  248. u16 alias;
  249. int ret;
  250. lockdep_assert_held(&chan->alias_pairs_lock);
  251. alias_pairs = &chan->alias_pairs;
  252. if (unlikely(list_empty(alias_pairs)))
  253. return NULL;
  254. list_for_each_entry_reverse(c2a, alias_pairs, node) {
  255. if (!c2a->fixed) {
  256. found = true;
  257. break;
  258. }
  259. }
  260. if (!found)
  261. return NULL;
  262. atr->ops->detach_addr(atr, chan->chan_id, c2a->addr);
  263. c2a->addr = addr;
  264. list_move(&c2a->node, alias_pairs);
  265. alias = c2a->alias;
  266. ret = atr->ops->attach_addr(atr, chan->chan_id, c2a->addr, c2a->alias);
  267. if (ret) {
  268. dev_err(atr->dev, "failed to attach 0x%02x on channel %d: err %d\n",
  269. addr, chan->chan_id, ret);
  270. i2c_atr_destroy_c2a(&c2a);
  271. i2c_atr_release_alias(chan->alias_pool, alias);
  272. return NULL;
  273. }
  274. return c2a;
  275. }
  276. static struct i2c_atr_alias_pair *
  277. i2c_atr_get_mapping_by_addr(struct i2c_atr_chan *chan, u16 addr)
  278. {
  279. struct i2c_atr *atr = chan->atr;
  280. struct i2c_atr_alias_pair *c2a;
  281. c2a = i2c_atr_find_mapping_by_addr(chan, addr);
  282. if (c2a)
  283. return c2a;
  284. if (atr->flags & I2C_ATR_F_STATIC)
  285. return NULL;
  286. c2a = i2c_atr_create_mapping_by_addr(chan, addr);
  287. if (c2a)
  288. return c2a;
  289. return i2c_atr_replace_mapping_by_addr(chan, addr);
  290. }
  291. /*
  292. * Replace all message addresses with their aliases, saving the original
  293. * addresses.
  294. *
  295. * This function is internal for use in i2c_atr_master_xfer(). It must be
  296. * followed by i2c_atr_unmap_msgs() to restore the original addresses.
  297. */
  298. static int i2c_atr_map_msgs(struct i2c_atr_chan *chan, struct i2c_msg *msgs,
  299. int num)
  300. {
  301. struct i2c_atr *atr = chan->atr;
  302. static struct i2c_atr_alias_pair *c2a;
  303. int i, ret = 0;
  304. /* Ensure we have enough room to save the original addresses */
  305. if (unlikely(chan->orig_addrs_size < num)) {
  306. u16 *new_buf;
  307. /* We don't care about old data, hence no realloc() */
  308. new_buf = kmalloc_array(num, sizeof(*new_buf), GFP_KERNEL);
  309. if (!new_buf)
  310. return -ENOMEM;
  311. kfree(chan->orig_addrs);
  312. chan->orig_addrs = new_buf;
  313. chan->orig_addrs_size = num;
  314. }
  315. mutex_lock(&chan->alias_pairs_lock);
  316. for (i = 0; i < num; i++) {
  317. chan->orig_addrs[i] = msgs[i].addr;
  318. c2a = i2c_atr_get_mapping_by_addr(chan, msgs[i].addr);
  319. if (!c2a) {
  320. if (atr->flags & I2C_ATR_F_PASSTHROUGH)
  321. continue;
  322. dev_err(atr->dev, "client 0x%02x not mapped!\n",
  323. msgs[i].addr);
  324. while (i--)
  325. msgs[i].addr = chan->orig_addrs[i];
  326. ret = -ENXIO;
  327. goto out_unlock;
  328. }
  329. // Prevent c2a from being overwritten by another client in this transaction
  330. c2a->fixed = true;
  331. msgs[i].addr = c2a->alias;
  332. }
  333. out_unlock:
  334. mutex_unlock(&chan->alias_pairs_lock);
  335. return ret;
  336. }
  337. /*
  338. * Restore all message address aliases with the original addresses. This
  339. * function is internal for use in i2c_atr_master_xfer() and for this reason it
  340. * needs no null and size checks on orig_addr.
  341. *
  342. * @see i2c_atr_map_msgs()
  343. */
  344. static void i2c_atr_unmap_msgs(struct i2c_atr_chan *chan, struct i2c_msg *msgs,
  345. int num)
  346. {
  347. struct i2c_atr_alias_pair *c2a;
  348. int i;
  349. for (i = 0; i < num; i++)
  350. msgs[i].addr = chan->orig_addrs[i];
  351. mutex_lock(&chan->alias_pairs_lock);
  352. if (unlikely(list_empty(&chan->alias_pairs)))
  353. goto out_unlock;
  354. // unfix c2a entries so that subsequent transfers can reuse their aliases
  355. list_for_each_entry(c2a, &chan->alias_pairs, node) {
  356. c2a->fixed = false;
  357. }
  358. out_unlock:
  359. mutex_unlock(&chan->alias_pairs_lock);
  360. }
  361. static int i2c_atr_master_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs,
  362. int num)
  363. {
  364. struct i2c_atr_chan *chan = adap->algo_data;
  365. struct i2c_atr *atr = chan->atr;
  366. struct i2c_adapter *parent = atr->parent;
  367. int ret;
  368. /* Translate addresses */
  369. mutex_lock(&chan->orig_addrs_lock);
  370. ret = i2c_atr_map_msgs(chan, msgs, num);
  371. if (ret < 0)
  372. goto err_unlock;
  373. /* Perform the transfer */
  374. ret = i2c_transfer(parent, msgs, num);
  375. /* Restore addresses */
  376. i2c_atr_unmap_msgs(chan, msgs, num);
  377. err_unlock:
  378. mutex_unlock(&chan->orig_addrs_lock);
  379. return ret;
  380. }
  381. static int i2c_atr_smbus_xfer(struct i2c_adapter *adap, u16 addr,
  382. unsigned short flags, char read_write, u8 command,
  383. int size, union i2c_smbus_data *data)
  384. {
  385. struct i2c_atr_chan *chan = adap->algo_data;
  386. struct i2c_atr *atr = chan->atr;
  387. struct i2c_adapter *parent = atr->parent;
  388. struct i2c_atr_alias_pair *c2a;
  389. u16 alias;
  390. mutex_lock(&chan->alias_pairs_lock);
  391. c2a = i2c_atr_get_mapping_by_addr(chan, addr);
  392. if (!c2a && !(atr->flags & I2C_ATR_F_PASSTHROUGH)) {
  393. dev_err(atr->dev, "client 0x%02x not mapped!\n", addr);
  394. mutex_unlock(&chan->alias_pairs_lock);
  395. return -ENXIO;
  396. }
  397. alias = c2a ? c2a->alias : addr;
  398. mutex_unlock(&chan->alias_pairs_lock);
  399. return i2c_smbus_xfer(parent, alias, flags, read_write, command,
  400. size, data);
  401. }
  402. static u32 i2c_atr_functionality(struct i2c_adapter *adap)
  403. {
  404. struct i2c_atr_chan *chan = adap->algo_data;
  405. struct i2c_adapter *parent = chan->atr->parent;
  406. return parent->algo->functionality(parent);
  407. }
  408. static void i2c_atr_lock_bus(struct i2c_adapter *adapter, unsigned int flags)
  409. {
  410. struct i2c_atr_chan *chan = adapter->algo_data;
  411. struct i2c_atr *atr = chan->atr;
  412. mutex_lock(&atr->lock);
  413. }
  414. static int i2c_atr_trylock_bus(struct i2c_adapter *adapter, unsigned int flags)
  415. {
  416. struct i2c_atr_chan *chan = adapter->algo_data;
  417. struct i2c_atr *atr = chan->atr;
  418. return mutex_trylock(&atr->lock);
  419. }
  420. static void i2c_atr_unlock_bus(struct i2c_adapter *adapter, unsigned int flags)
  421. {
  422. struct i2c_atr_chan *chan = adapter->algo_data;
  423. struct i2c_atr *atr = chan->atr;
  424. mutex_unlock(&atr->lock);
  425. }
  426. static const struct i2c_lock_operations i2c_atr_lock_ops = {
  427. .lock_bus = i2c_atr_lock_bus,
  428. .trylock_bus = i2c_atr_trylock_bus,
  429. .unlock_bus = i2c_atr_unlock_bus,
  430. };
  431. static int i2c_atr_attach_addr(struct i2c_adapter *adapter,
  432. u16 addr)
  433. {
  434. struct i2c_atr_chan *chan = adapter->algo_data;
  435. struct i2c_atr *atr = chan->atr;
  436. struct i2c_atr_alias_pair *c2a;
  437. int ret = 0;
  438. mutex_lock(&chan->alias_pairs_lock);
  439. c2a = i2c_atr_create_mapping_by_addr(chan, addr);
  440. if (!c2a && !(atr->flags & I2C_ATR_F_STATIC))
  441. c2a = i2c_atr_replace_mapping_by_addr(chan, addr);
  442. if (!c2a) {
  443. dev_err(atr->dev, "failed to find a free alias\n");
  444. ret = -EBUSY;
  445. goto out_unlock;
  446. }
  447. dev_dbg(atr->dev, "chan%u: using alias 0x%02x for addr 0x%02x\n",
  448. chan->chan_id, c2a->alias, addr);
  449. out_unlock:
  450. mutex_unlock(&chan->alias_pairs_lock);
  451. return ret;
  452. }
  453. static void i2c_atr_detach_addr(struct i2c_adapter *adapter,
  454. u16 addr)
  455. {
  456. struct i2c_atr_chan *chan = adapter->algo_data;
  457. struct i2c_atr *atr = chan->atr;
  458. struct i2c_atr_alias_pair *c2a;
  459. atr->ops->detach_addr(atr, chan->chan_id, addr);
  460. mutex_lock(&chan->alias_pairs_lock);
  461. c2a = i2c_atr_find_mapping_by_addr(chan, addr);
  462. if (!c2a) {
  463. mutex_unlock(&chan->alias_pairs_lock);
  464. return;
  465. }
  466. i2c_atr_release_alias(chan->alias_pool, c2a->alias);
  467. dev_dbg(atr->dev,
  468. "chan%u: detached alias 0x%02x from addr 0x%02x\n",
  469. chan->chan_id, c2a->alias, addr);
  470. i2c_atr_destroy_c2a(&c2a);
  471. mutex_unlock(&chan->alias_pairs_lock);
  472. }
  473. static int i2c_atr_bus_notifier_call(struct notifier_block *nb,
  474. unsigned long event, void *device)
  475. {
  476. struct i2c_atr *atr = container_of(nb, struct i2c_atr, i2c_nb);
  477. struct device *dev = device;
  478. struct i2c_client *client;
  479. u32 chan_id;
  480. int ret;
  481. client = i2c_verify_client(dev);
  482. if (!client)
  483. return NOTIFY_DONE;
  484. /* Is the client in one of our adapters? */
  485. for (chan_id = 0; chan_id < atr->max_adapters; ++chan_id) {
  486. if (client->adapter == atr->adapter[chan_id])
  487. break;
  488. }
  489. if (chan_id == atr->max_adapters)
  490. return NOTIFY_DONE;
  491. switch (event) {
  492. case BUS_NOTIFY_ADD_DEVICE:
  493. ret = i2c_atr_attach_addr(client->adapter, client->addr);
  494. if (ret)
  495. dev_err(atr->dev,
  496. "Failed to attach remote client '%s': %d\n",
  497. dev_name(dev), ret);
  498. break;
  499. case BUS_NOTIFY_REMOVED_DEVICE:
  500. i2c_atr_detach_addr(client->adapter, client->addr);
  501. break;
  502. default:
  503. break;
  504. }
  505. return NOTIFY_DONE;
  506. }
  507. static int i2c_atr_parse_alias_pool(struct i2c_atr *atr)
  508. {
  509. struct i2c_atr_alias_pool *alias_pool;
  510. struct device *dev = atr->dev;
  511. size_t num_aliases;
  512. unsigned int i;
  513. u32 *aliases32;
  514. int ret;
  515. if (!fwnode_property_present(dev_fwnode(dev), "i2c-alias-pool")) {
  516. num_aliases = 0;
  517. } else {
  518. ret = fwnode_property_count_u32(dev_fwnode(dev), "i2c-alias-pool");
  519. if (ret < 0) {
  520. dev_err(dev, "Failed to count 'i2c-alias-pool' property: %d\n",
  521. ret);
  522. return ret;
  523. }
  524. num_aliases = ret;
  525. }
  526. alias_pool = i2c_atr_alloc_alias_pool(num_aliases, true);
  527. if (IS_ERR(alias_pool)) {
  528. ret = PTR_ERR(alias_pool);
  529. dev_err(dev, "Failed to allocate alias pool, err %d\n", ret);
  530. return ret;
  531. }
  532. atr->alias_pool = alias_pool;
  533. if (!alias_pool->size)
  534. return 0;
  535. aliases32 = kcalloc(num_aliases, sizeof(*aliases32), GFP_KERNEL);
  536. if (!aliases32) {
  537. ret = -ENOMEM;
  538. goto err_free_alias_pool;
  539. }
  540. ret = fwnode_property_read_u32_array(dev_fwnode(dev), "i2c-alias-pool",
  541. aliases32, num_aliases);
  542. if (ret < 0) {
  543. dev_err(dev, "Failed to read 'i2c-alias-pool' property: %d\n",
  544. ret);
  545. goto err_free_aliases32;
  546. }
  547. for (i = 0; i < num_aliases; i++) {
  548. if (!(aliases32[i] & 0xffff0000)) {
  549. alias_pool->aliases[i] = aliases32[i];
  550. continue;
  551. }
  552. dev_err(dev, "Failed to parse 'i2c-alias-pool' property: I2C flags are not supported\n");
  553. ret = -EINVAL;
  554. goto err_free_aliases32;
  555. }
  556. kfree(aliases32);
  557. dev_dbg(dev, "i2c-alias-pool has %zu aliases\n", alias_pool->size);
  558. return 0;
  559. err_free_aliases32:
  560. kfree(aliases32);
  561. err_free_alias_pool:
  562. i2c_atr_free_alias_pool(alias_pool);
  563. return ret;
  564. }
  565. struct i2c_atr *i2c_atr_new(struct i2c_adapter *parent, struct device *dev,
  566. const struct i2c_atr_ops *ops, int max_adapters,
  567. u32 flags)
  568. {
  569. struct i2c_atr *atr;
  570. int ret;
  571. if (max_adapters > ATR_MAX_ADAPTERS)
  572. return ERR_PTR(-EINVAL);
  573. if (!ops || !ops->attach_addr || !ops->detach_addr)
  574. return ERR_PTR(-EINVAL);
  575. atr = kzalloc_flex(*atr, adapter, max_adapters);
  576. if (!atr)
  577. return ERR_PTR(-ENOMEM);
  578. lockdep_register_key(&atr->lock_key);
  579. mutex_init_with_key(&atr->lock, &atr->lock_key);
  580. atr->parent = parent;
  581. atr->dev = dev;
  582. atr->ops = ops;
  583. atr->max_adapters = max_adapters;
  584. atr->flags = flags;
  585. if (parent->algo->master_xfer)
  586. atr->algo.xfer = i2c_atr_master_xfer;
  587. if (parent->algo->smbus_xfer)
  588. atr->algo.smbus_xfer = i2c_atr_smbus_xfer;
  589. atr->algo.functionality = i2c_atr_functionality;
  590. ret = i2c_atr_parse_alias_pool(atr);
  591. if (ret)
  592. goto err_destroy_mutex;
  593. atr->i2c_nb.notifier_call = i2c_atr_bus_notifier_call;
  594. ret = bus_register_notifier(&i2c_bus_type, &atr->i2c_nb);
  595. if (ret)
  596. goto err_free_alias_pool;
  597. return atr;
  598. err_free_alias_pool:
  599. i2c_atr_free_alias_pool(atr->alias_pool);
  600. err_destroy_mutex:
  601. mutex_destroy(&atr->lock);
  602. lockdep_unregister_key(&atr->lock_key);
  603. kfree(atr);
  604. return ERR_PTR(ret);
  605. }
  606. EXPORT_SYMBOL_NS_GPL(i2c_atr_new, "I2C_ATR");
  607. void i2c_atr_delete(struct i2c_atr *atr)
  608. {
  609. unsigned int i;
  610. for (i = 0; i < atr->max_adapters; ++i)
  611. WARN_ON(atr->adapter[i]);
  612. bus_unregister_notifier(&i2c_bus_type, &atr->i2c_nb);
  613. i2c_atr_free_alias_pool(atr->alias_pool);
  614. mutex_destroy(&atr->lock);
  615. lockdep_unregister_key(&atr->lock_key);
  616. kfree(atr);
  617. }
  618. EXPORT_SYMBOL_NS_GPL(i2c_atr_delete, "I2C_ATR");
  619. int i2c_atr_add_adapter(struct i2c_atr *atr, struct i2c_atr_adap_desc *desc)
  620. {
  621. struct fwnode_handle *bus_handle = desc->bus_handle;
  622. struct i2c_adapter *parent = atr->parent;
  623. char symlink_name[ATR_MAX_SYMLINK_LEN];
  624. struct device *dev = atr->dev;
  625. u32 chan_id = desc->chan_id;
  626. struct i2c_atr_chan *chan;
  627. int ret, idx;
  628. if (chan_id >= atr->max_adapters) {
  629. dev_err(dev, "No room for more i2c-atr adapters\n");
  630. return -EINVAL;
  631. }
  632. if (atr->adapter[chan_id]) {
  633. dev_err(dev, "Adapter %d already present\n", chan_id);
  634. return -EEXIST;
  635. }
  636. chan = kzalloc_obj(*chan);
  637. if (!chan)
  638. return -ENOMEM;
  639. if (!desc->parent)
  640. desc->parent = dev;
  641. chan->atr = atr;
  642. chan->chan_id = chan_id;
  643. INIT_LIST_HEAD(&chan->alias_pairs);
  644. lockdep_register_key(&chan->alias_pairs_lock_key);
  645. lockdep_register_key(&chan->orig_addrs_lock_key);
  646. mutex_init_with_key(&chan->alias_pairs_lock, &chan->alias_pairs_lock_key);
  647. mutex_init_with_key(&chan->orig_addrs_lock, &chan->orig_addrs_lock_key);
  648. snprintf(chan->adap.name, sizeof(chan->adap.name), "i2c-%d-atr-%d",
  649. i2c_adapter_id(parent), chan_id);
  650. chan->adap.owner = THIS_MODULE;
  651. chan->adap.algo = &atr->algo;
  652. chan->adap.algo_data = chan;
  653. chan->adap.dev.parent = desc->parent;
  654. chan->adap.retries = parent->retries;
  655. chan->adap.timeout = parent->timeout;
  656. chan->adap.quirks = parent->quirks;
  657. chan->adap.lock_ops = &i2c_atr_lock_ops;
  658. if (bus_handle) {
  659. device_set_node(&chan->adap.dev, fwnode_handle_get(bus_handle));
  660. } else {
  661. struct fwnode_handle *atr_node;
  662. struct fwnode_handle *child;
  663. u32 reg;
  664. atr_node = device_get_named_child_node(dev, "i2c-atr");
  665. fwnode_for_each_child_node(atr_node, child) {
  666. ret = fwnode_property_read_u32(child, "reg", &reg);
  667. if (ret)
  668. continue;
  669. if (chan_id == reg)
  670. break;
  671. }
  672. device_set_node(&chan->adap.dev, child);
  673. fwnode_handle_put(atr_node);
  674. }
  675. if (desc->num_aliases > 0) {
  676. chan->alias_pool = i2c_atr_alloc_alias_pool(desc->num_aliases, false);
  677. if (IS_ERR(chan->alias_pool)) {
  678. ret = PTR_ERR(chan->alias_pool);
  679. goto err_fwnode_put;
  680. }
  681. for (idx = 0; idx < desc->num_aliases; idx++)
  682. chan->alias_pool->aliases[idx] = desc->aliases[idx];
  683. } else {
  684. chan->alias_pool = atr->alias_pool;
  685. }
  686. atr->adapter[chan_id] = &chan->adap;
  687. ret = i2c_add_adapter(&chan->adap);
  688. if (ret) {
  689. dev_err(dev, "failed to add atr-adapter %u (error=%d)\n",
  690. chan_id, ret);
  691. goto err_free_alias_pool;
  692. }
  693. snprintf(symlink_name, sizeof(symlink_name), "channel-%u",
  694. chan->chan_id);
  695. ret = sysfs_create_link(&chan->adap.dev.kobj, &dev->kobj, "atr_device");
  696. if (ret)
  697. dev_warn(dev, "can't create symlink to atr device\n");
  698. ret = sysfs_create_link(&dev->kobj, &chan->adap.dev.kobj, symlink_name);
  699. if (ret)
  700. dev_warn(dev, "can't create symlink for channel %u\n", chan_id);
  701. dev_dbg(dev, "Added ATR child bus %d\n", i2c_adapter_id(&chan->adap));
  702. return 0;
  703. err_free_alias_pool:
  704. if (!chan->alias_pool->shared)
  705. i2c_atr_free_alias_pool(chan->alias_pool);
  706. err_fwnode_put:
  707. fwnode_handle_put(dev_fwnode(&chan->adap.dev));
  708. mutex_destroy(&chan->orig_addrs_lock);
  709. mutex_destroy(&chan->alias_pairs_lock);
  710. lockdep_unregister_key(&chan->orig_addrs_lock_key);
  711. lockdep_unregister_key(&chan->alias_pairs_lock_key);
  712. kfree(chan);
  713. return ret;
  714. }
  715. EXPORT_SYMBOL_NS_GPL(i2c_atr_add_adapter, "I2C_ATR");
  716. void i2c_atr_del_adapter(struct i2c_atr *atr, u32 chan_id)
  717. {
  718. char symlink_name[ATR_MAX_SYMLINK_LEN];
  719. struct i2c_adapter *adap;
  720. struct i2c_atr_chan *chan;
  721. struct fwnode_handle *fwnode;
  722. struct device *dev = atr->dev;
  723. adap = atr->adapter[chan_id];
  724. if (!adap)
  725. return;
  726. chan = adap->algo_data;
  727. fwnode = dev_fwnode(&adap->dev);
  728. dev_dbg(dev, "Removing ATR child bus %d\n", i2c_adapter_id(adap));
  729. snprintf(symlink_name, sizeof(symlink_name), "channel-%u",
  730. chan->chan_id);
  731. sysfs_remove_link(&dev->kobj, symlink_name);
  732. sysfs_remove_link(&chan->adap.dev.kobj, "atr_device");
  733. i2c_del_adapter(adap);
  734. if (!chan->alias_pool->shared)
  735. i2c_atr_free_alias_pool(chan->alias_pool);
  736. atr->adapter[chan_id] = NULL;
  737. fwnode_handle_put(fwnode);
  738. mutex_destroy(&chan->orig_addrs_lock);
  739. mutex_destroy(&chan->alias_pairs_lock);
  740. lockdep_unregister_key(&chan->orig_addrs_lock_key);
  741. lockdep_unregister_key(&chan->alias_pairs_lock_key);
  742. kfree(chan->orig_addrs);
  743. kfree(chan);
  744. }
  745. EXPORT_SYMBOL_NS_GPL(i2c_atr_del_adapter, "I2C_ATR");
  746. void i2c_atr_set_driver_data(struct i2c_atr *atr, void *data)
  747. {
  748. atr->priv = data;
  749. }
  750. EXPORT_SYMBOL_NS_GPL(i2c_atr_set_driver_data, "I2C_ATR");
  751. void *i2c_atr_get_driver_data(struct i2c_atr *atr)
  752. {
  753. return atr->priv;
  754. }
  755. EXPORT_SYMBOL_NS_GPL(i2c_atr_get_driver_data, "I2C_ATR");
  756. MODULE_AUTHOR("Luca Ceresoli <luca.ceresoli@bootlin.com>");
  757. MODULE_AUTHOR("Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>");
  758. MODULE_DESCRIPTION("I2C Address Translator");
  759. MODULE_LICENSE("GPL");