soc-cache.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714
  1. /*
  2. * soc-cache.c -- ASoC register cache helpers
  3. *
  4. * Copyright 2009 Wolfson Microelectronics PLC.
  5. *
  6. * Author: Mark Brown <broonie@opensource.wolfsonmicro.com>
  7. *
  8. * This program is free software; you can redistribute it and/or modify it
  9. * under the terms of the GNU General Public License as published by the
  10. * Free Software Foundation; either version 2 of the License, or (at your
  11. * option) any later version.
  12. */
  13. #include <linux/i2c.h>
  14. #include <linux/spi/spi.h>
  15. #include <sound/soc.h>
  16. static unsigned int snd_soc_4_12_read(struct snd_soc_codec *codec,
  17. unsigned int reg)
  18. {
  19. u16 *cache = codec->reg_cache;
  20. if (reg >= codec->driver->reg_cache_size ||
  21. snd_soc_codec_volatile_register(codec, reg)) {
  22. if (codec->cache_only)
  23. return -1;
  24. return codec->hw_read(codec, reg);
  25. }
  26. return cache[reg];
  27. }
  28. static int snd_soc_4_12_write(struct snd_soc_codec *codec, unsigned int reg,
  29. unsigned int value)
  30. {
  31. u16 *cache = codec->reg_cache;
  32. u8 data[2];
  33. int ret;
  34. data[0] = (reg << 4) | ((value >> 8) & 0x000f);
  35. data[1] = value & 0x00ff;
  36. if (!snd_soc_codec_volatile_register(codec, reg) &&
  37. reg < codec->driver->reg_cache_size)
  38. cache[reg] = value;
  39. if (codec->cache_only) {
  40. codec->cache_sync = 1;
  41. return 0;
  42. }
  43. ret = codec->hw_write(codec->control_data, data, 2);
  44. if (ret == 2)
  45. return 0;
  46. if (ret < 0)
  47. return ret;
  48. else
  49. return -EIO;
  50. }
  51. #if defined(CONFIG_SPI_MASTER)
  52. static int snd_soc_4_12_spi_write(void *control_data, const char *data,
  53. int len)
  54. {
  55. struct spi_device *spi = control_data;
  56. struct spi_transfer t;
  57. struct spi_message m;
  58. u8 msg[2];
  59. if (len <= 0)
  60. return 0;
  61. msg[0] = data[1];
  62. msg[1] = data[0];
  63. spi_message_init(&m);
  64. memset(&t, 0, (sizeof t));
  65. t.tx_buf = &msg[0];
  66. t.len = len;
  67. spi_message_add_tail(&t, &m);
  68. spi_sync(spi, &m);
  69. return len;
  70. }
  71. #else
  72. #define snd_soc_4_12_spi_write NULL
  73. #endif
  74. static unsigned int snd_soc_7_9_read(struct snd_soc_codec *codec,
  75. unsigned int reg)
  76. {
  77. u16 *cache = codec->reg_cache;
  78. if (reg >= codec->driver->reg_cache_size ||
  79. snd_soc_codec_volatile_register(codec, reg)) {
  80. if (codec->cache_only)
  81. return -1;
  82. return codec->hw_read(codec, reg);
  83. }
  84. return cache[reg];
  85. }
  86. static int snd_soc_7_9_write(struct snd_soc_codec *codec, unsigned int reg,
  87. unsigned int value)
  88. {
  89. u16 *cache = codec->reg_cache;
  90. u8 data[2];
  91. int ret;
  92. data[0] = (reg << 1) | ((value >> 8) & 0x0001);
  93. data[1] = value & 0x00ff;
  94. if (!snd_soc_codec_volatile_register(codec, reg) &&
  95. reg < codec->driver->reg_cache_size)
  96. cache[reg] = value;
  97. if (codec->cache_only) {
  98. codec->cache_sync = 1;
  99. return 0;
  100. }
  101. ret = codec->hw_write(codec->control_data, data, 2);
  102. if (ret == 2)
  103. return 0;
  104. if (ret < 0)
  105. return ret;
  106. else
  107. return -EIO;
  108. }
  109. #if defined(CONFIG_SPI_MASTER)
  110. static int snd_soc_7_9_spi_write(void *control_data, const char *data,
  111. int len)
  112. {
  113. struct spi_device *spi = control_data;
  114. struct spi_transfer t;
  115. struct spi_message m;
  116. u8 msg[2];
  117. if (len <= 0)
  118. return 0;
  119. msg[0] = data[0];
  120. msg[1] = data[1];
  121. spi_message_init(&m);
  122. memset(&t, 0, (sizeof t));
  123. t.tx_buf = &msg[0];
  124. t.len = len;
  125. spi_message_add_tail(&t, &m);
  126. spi_sync(spi, &m);
  127. return len;
  128. }
  129. #else
  130. #define snd_soc_7_9_spi_write NULL
  131. #endif
  132. static int snd_soc_8_8_write(struct snd_soc_codec *codec, unsigned int reg,
  133. unsigned int value)
  134. {
  135. u8 *cache = codec->reg_cache;
  136. u8 data[2];
  137. reg &= 0xff;
  138. data[0] = reg;
  139. data[1] = value & 0xff;
  140. if (!snd_soc_codec_volatile_register(codec, reg) &&
  141. reg < codec->driver->reg_cache_size)
  142. cache[reg] = value;
  143. if (codec->cache_only) {
  144. codec->cache_sync = 1;
  145. return 0;
  146. }
  147. if (codec->hw_write(codec->control_data, data, 2) == 2)
  148. return 0;
  149. else
  150. return -EIO;
  151. }
  152. static unsigned int snd_soc_8_8_read(struct snd_soc_codec *codec,
  153. unsigned int reg)
  154. {
  155. u8 *cache = codec->reg_cache;
  156. reg &= 0xff;
  157. if (reg >= codec->driver->reg_cache_size ||
  158. snd_soc_codec_volatile_register(codec, reg)) {
  159. if (codec->cache_only)
  160. return -1;
  161. return codec->hw_read(codec, reg);
  162. }
  163. return cache[reg];
  164. }
  165. #if defined(CONFIG_SPI_MASTER)
  166. static int snd_soc_8_8_spi_write(void *control_data, const char *data,
  167. int len)
  168. {
  169. struct spi_device *spi = control_data;
  170. struct spi_transfer t;
  171. struct spi_message m;
  172. u8 msg[2];
  173. if (len <= 0)
  174. return 0;
  175. msg[0] = data[0];
  176. msg[1] = data[1];
  177. spi_message_init(&m);
  178. memset(&t, 0, (sizeof t));
  179. t.tx_buf = &msg[0];
  180. t.len = len;
  181. spi_message_add_tail(&t, &m);
  182. spi_sync(spi, &m);
  183. return len;
  184. }
  185. #else
  186. #define snd_soc_8_8_spi_write NULL
  187. #endif
  188. static int snd_soc_8_16_write(struct snd_soc_codec *codec, unsigned int reg,
  189. unsigned int value)
  190. {
  191. u16 *reg_cache = codec->reg_cache;
  192. u8 data[3];
  193. data[0] = reg;
  194. data[1] = (value >> 8) & 0xff;
  195. data[2] = value & 0xff;
  196. if (!snd_soc_codec_volatile_register(codec, reg) &&
  197. reg < codec->driver->reg_cache_size)
  198. reg_cache[reg] = value;
  199. if (codec->cache_only) {
  200. codec->cache_sync = 1;
  201. return 0;
  202. }
  203. if (codec->hw_write(codec->control_data, data, 3) == 3)
  204. return 0;
  205. else
  206. return -EIO;
  207. }
  208. static unsigned int snd_soc_8_16_read(struct snd_soc_codec *codec,
  209. unsigned int reg)
  210. {
  211. u16 *cache = codec->reg_cache;
  212. if (reg >= codec->driver->reg_cache_size ||
  213. snd_soc_codec_volatile_register(codec, reg)) {
  214. if (codec->cache_only)
  215. return -1;
  216. return codec->hw_read(codec, reg);
  217. } else {
  218. return cache[reg];
  219. }
  220. }
  221. #if defined(CONFIG_SPI_MASTER)
  222. static int snd_soc_8_16_spi_write(void *control_data, const char *data,
  223. int len)
  224. {
  225. struct spi_device *spi = control_data;
  226. struct spi_transfer t;
  227. struct spi_message m;
  228. u8 msg[3];
  229. if (len <= 0)
  230. return 0;
  231. msg[0] = data[0];
  232. msg[1] = data[1];
  233. msg[2] = data[2];
  234. spi_message_init(&m);
  235. memset(&t, 0, (sizeof t));
  236. t.tx_buf = &msg[0];
  237. t.len = len;
  238. spi_message_add_tail(&t, &m);
  239. spi_sync(spi, &m);
  240. return len;
  241. }
  242. #else
  243. #define snd_soc_8_16_spi_write NULL
  244. #endif
  245. #if defined(CONFIG_I2C) || (defined(CONFIG_I2C_MODULE) && defined(MODULE))
  246. static unsigned int snd_soc_8_8_read_i2c(struct snd_soc_codec *codec,
  247. unsigned int r)
  248. {
  249. struct i2c_msg xfer[2];
  250. u8 reg = r;
  251. u8 data;
  252. int ret;
  253. struct i2c_client *client = codec->control_data;
  254. /* Write register */
  255. xfer[0].addr = client->addr;
  256. xfer[0].flags = 0;
  257. xfer[0].len = 1;
  258. xfer[0].buf = &reg;
  259. /* Read data */
  260. xfer[1].addr = client->addr;
  261. xfer[1].flags = I2C_M_RD;
  262. xfer[1].len = 1;
  263. xfer[1].buf = &data;
  264. ret = i2c_transfer(client->adapter, xfer, 2);
  265. if (ret != 2) {
  266. dev_err(&client->dev, "i2c_transfer() returned %d\n", ret);
  267. return 0;
  268. }
  269. return data;
  270. }
  271. #else
  272. #define snd_soc_8_8_read_i2c NULL
  273. #endif
  274. #if defined(CONFIG_I2C) || (defined(CONFIG_I2C_MODULE) && defined(MODULE))
  275. static unsigned int snd_soc_8_16_read_i2c(struct snd_soc_codec *codec,
  276. unsigned int r)
  277. {
  278. struct i2c_msg xfer[2];
  279. u8 reg = r;
  280. u16 data;
  281. int ret;
  282. struct i2c_client *client = codec->control_data;
  283. /* Write register */
  284. xfer[0].addr = client->addr;
  285. xfer[0].flags = 0;
  286. xfer[0].len = 1;
  287. xfer[0].buf = &reg;
  288. /* Read data */
  289. xfer[1].addr = client->addr;
  290. xfer[1].flags = I2C_M_RD;
  291. xfer[1].len = 2;
  292. xfer[1].buf = (u8 *)&data;
  293. ret = i2c_transfer(client->adapter, xfer, 2);
  294. if (ret != 2) {
  295. dev_err(&client->dev, "i2c_transfer() returned %d\n", ret);
  296. return 0;
  297. }
  298. return (data >> 8) | ((data & 0xff) << 8);
  299. }
  300. #else
  301. #define snd_soc_8_16_read_i2c NULL
  302. #endif
  303. #if defined(CONFIG_I2C) || (defined(CONFIG_I2C_MODULE) && defined(MODULE))
  304. static unsigned int snd_soc_16_8_read_i2c(struct snd_soc_codec *codec,
  305. unsigned int r)
  306. {
  307. struct i2c_msg xfer[2];
  308. u16 reg = r;
  309. u8 data;
  310. int ret;
  311. struct i2c_client *client = codec->control_data;
  312. /* Write register */
  313. xfer[0].addr = client->addr;
  314. xfer[0].flags = 0;
  315. xfer[0].len = 2;
  316. xfer[0].buf = (u8 *)&reg;
  317. /* Read data */
  318. xfer[1].addr = client->addr;
  319. xfer[1].flags = I2C_M_RD;
  320. xfer[1].len = 1;
  321. xfer[1].buf = &data;
  322. ret = i2c_transfer(client->adapter, xfer, 2);
  323. if (ret != 2) {
  324. dev_err(&client->dev, "i2c_transfer() returned %d\n", ret);
  325. return 0;
  326. }
  327. return data;
  328. }
  329. #else
  330. #define snd_soc_16_8_read_i2c NULL
  331. #endif
  332. static unsigned int snd_soc_16_8_read(struct snd_soc_codec *codec,
  333. unsigned int reg)
  334. {
  335. u8 *cache = codec->reg_cache;
  336. reg &= 0xff;
  337. if (reg >= codec->driver->reg_cache_size ||
  338. snd_soc_codec_volatile_register(codec, reg)) {
  339. if (codec->cache_only)
  340. return -1;
  341. return codec->hw_read(codec, reg);
  342. }
  343. return cache[reg];
  344. }
  345. static int snd_soc_16_8_write(struct snd_soc_codec *codec, unsigned int reg,
  346. unsigned int value)
  347. {
  348. u8 *cache = codec->reg_cache;
  349. u8 data[3];
  350. int ret;
  351. data[0] = (reg >> 8) & 0xff;
  352. data[1] = reg & 0xff;
  353. data[2] = value;
  354. reg &= 0xff;
  355. if (!snd_soc_codec_volatile_register(codec, reg) &&
  356. reg < codec->driver->reg_cache_size)
  357. cache[reg] = value;
  358. if (codec->cache_only) {
  359. codec->cache_sync = 1;
  360. return 0;
  361. }
  362. ret = codec->hw_write(codec->control_data, data, 3);
  363. if (ret == 3)
  364. return 0;
  365. if (ret < 0)
  366. return ret;
  367. else
  368. return -EIO;
  369. }
  370. #if defined(CONFIG_SPI_MASTER)
  371. static int snd_soc_16_8_spi_write(void *control_data, const char *data,
  372. int len)
  373. {
  374. struct spi_device *spi = control_data;
  375. struct spi_transfer t;
  376. struct spi_message m;
  377. u8 msg[3];
  378. if (len <= 0)
  379. return 0;
  380. msg[0] = data[0];
  381. msg[1] = data[1];
  382. msg[2] = data[2];
  383. spi_message_init(&m);
  384. memset(&t, 0, (sizeof t));
  385. t.tx_buf = &msg[0];
  386. t.len = len;
  387. spi_message_add_tail(&t, &m);
  388. spi_sync(spi, &m);
  389. return len;
  390. }
  391. #else
  392. #define snd_soc_16_8_spi_write NULL
  393. #endif
  394. #if defined(CONFIG_I2C) || (defined(CONFIG_I2C_MODULE) && defined(MODULE))
  395. static unsigned int snd_soc_16_16_read_i2c(struct snd_soc_codec *codec,
  396. unsigned int r)
  397. {
  398. struct i2c_msg xfer[2];
  399. u16 reg = cpu_to_be16(r);
  400. u16 data;
  401. int ret;
  402. struct i2c_client *client = codec->control_data;
  403. /* Write register */
  404. xfer[0].addr = client->addr;
  405. xfer[0].flags = 0;
  406. xfer[0].len = 2;
  407. xfer[0].buf = (u8 *)&reg;
  408. /* Read data */
  409. xfer[1].addr = client->addr;
  410. xfer[1].flags = I2C_M_RD;
  411. xfer[1].len = 2;
  412. xfer[1].buf = (u8 *)&data;
  413. ret = i2c_transfer(client->adapter, xfer, 2);
  414. if (ret != 2) {
  415. dev_err(&client->dev, "i2c_transfer() returned %d\n", ret);
  416. return 0;
  417. }
  418. return be16_to_cpu(data);
  419. }
  420. #else
  421. #define snd_soc_16_16_read_i2c NULL
  422. #endif
  423. static unsigned int snd_soc_16_16_read(struct snd_soc_codec *codec,
  424. unsigned int reg)
  425. {
  426. u16 *cache = codec->reg_cache;
  427. if (reg >= codec->driver->reg_cache_size ||
  428. snd_soc_codec_volatile_register(codec, reg)) {
  429. if (codec->cache_only)
  430. return -1;
  431. return codec->hw_read(codec, reg);
  432. }
  433. return cache[reg];
  434. }
  435. static int snd_soc_16_16_write(struct snd_soc_codec *codec, unsigned int reg,
  436. unsigned int value)
  437. {
  438. u16 *cache = codec->reg_cache;
  439. u8 data[4];
  440. int ret;
  441. data[0] = (reg >> 8) & 0xff;
  442. data[1] = reg & 0xff;
  443. data[2] = (value >> 8) & 0xff;
  444. data[3] = value & 0xff;
  445. if (!snd_soc_codec_volatile_register(codec, reg) &&
  446. reg < codec->driver->reg_cache_size)
  447. cache[reg] = value;
  448. if (codec->cache_only) {
  449. codec->cache_sync = 1;
  450. return 0;
  451. }
  452. ret = codec->hw_write(codec->control_data, data, 4);
  453. if (ret == 4)
  454. return 0;
  455. if (ret < 0)
  456. return ret;
  457. else
  458. return -EIO;
  459. }
  460. #if defined(CONFIG_SPI_MASTER)
  461. static int snd_soc_16_16_spi_write(void *control_data, const char *data,
  462. int len)
  463. {
  464. struct spi_device *spi = control_data;
  465. struct spi_transfer t;
  466. struct spi_message m;
  467. u8 msg[4];
  468. if (len <= 0)
  469. return 0;
  470. msg[0] = data[0];
  471. msg[1] = data[1];
  472. msg[2] = data[2];
  473. msg[3] = data[3];
  474. spi_message_init(&m);
  475. memset(&t, 0, (sizeof t));
  476. t.tx_buf = &msg[0];
  477. t.len = len;
  478. spi_message_add_tail(&t, &m);
  479. spi_sync(spi, &m);
  480. return len;
  481. }
  482. #else
  483. #define snd_soc_16_16_spi_write NULL
  484. #endif
  485. static struct {
  486. int addr_bits;
  487. int data_bits;
  488. int (*write)(struct snd_soc_codec *codec, unsigned int, unsigned int);
  489. int (*spi_write)(void *, const char *, int);
  490. unsigned int (*read)(struct snd_soc_codec *, unsigned int);
  491. unsigned int (*i2c_read)(struct snd_soc_codec *, unsigned int);
  492. } io_types[] = {
  493. {
  494. .addr_bits = 4, .data_bits = 12,
  495. .write = snd_soc_4_12_write, .read = snd_soc_4_12_read,
  496. .spi_write = snd_soc_4_12_spi_write,
  497. },
  498. {
  499. .addr_bits = 7, .data_bits = 9,
  500. .write = snd_soc_7_9_write, .read = snd_soc_7_9_read,
  501. .spi_write = snd_soc_7_9_spi_write,
  502. },
  503. {
  504. .addr_bits = 8, .data_bits = 8,
  505. .write = snd_soc_8_8_write, .read = snd_soc_8_8_read,
  506. .i2c_read = snd_soc_8_8_read_i2c,
  507. .spi_write = snd_soc_8_8_spi_write,
  508. },
  509. {
  510. .addr_bits = 8, .data_bits = 16,
  511. .write = snd_soc_8_16_write, .read = snd_soc_8_16_read,
  512. .i2c_read = snd_soc_8_16_read_i2c,
  513. .spi_write = snd_soc_8_16_spi_write,
  514. },
  515. {
  516. .addr_bits = 16, .data_bits = 8,
  517. .write = snd_soc_16_8_write, .read = snd_soc_16_8_read,
  518. .i2c_read = snd_soc_16_8_read_i2c,
  519. .spi_write = snd_soc_16_8_spi_write,
  520. },
  521. {
  522. .addr_bits = 16, .data_bits = 16,
  523. .write = snd_soc_16_16_write, .read = snd_soc_16_16_read,
  524. .i2c_read = snd_soc_16_16_read_i2c,
  525. .spi_write = snd_soc_16_16_spi_write,
  526. },
  527. };
  528. /**
  529. * snd_soc_codec_set_cache_io: Set up standard I/O functions.
  530. *
  531. * @codec: CODEC to configure.
  532. * @type: Type of cache.
  533. * @addr_bits: Number of bits of register address data.
  534. * @data_bits: Number of bits of data per register.
  535. * @control: Control bus used.
  536. *
  537. * Register formats are frequently shared between many I2C and SPI
  538. * devices. In order to promote code reuse the ASoC core provides
  539. * some standard implementations of CODEC read and write operations
  540. * which can be set up using this function.
  541. *
  542. * The caller is responsible for allocating and initialising the
  543. * actual cache.
  544. *
  545. * Note that at present this code cannot be used by CODECs with
  546. * volatile registers.
  547. */
  548. int snd_soc_codec_set_cache_io(struct snd_soc_codec *codec,
  549. int addr_bits, int data_bits,
  550. enum snd_soc_control_type control)
  551. {
  552. int i;
  553. for (i = 0; i < ARRAY_SIZE(io_types); i++)
  554. if (io_types[i].addr_bits == addr_bits &&
  555. io_types[i].data_bits == data_bits)
  556. break;
  557. if (i == ARRAY_SIZE(io_types)) {
  558. printk(KERN_ERR
  559. "No I/O functions for %d bit address %d bit data\n",
  560. addr_bits, data_bits);
  561. return -EINVAL;
  562. }
  563. codec->driver->write = io_types[i].write;
  564. codec->driver->read = io_types[i].read;
  565. switch (control) {
  566. case SND_SOC_CUSTOM:
  567. break;
  568. case SND_SOC_I2C:
  569. #if defined(CONFIG_I2C) || (defined(CONFIG_I2C_MODULE) && defined(MODULE))
  570. codec->hw_write = (hw_write_t)i2c_master_send;
  571. #endif
  572. if (io_types[i].i2c_read)
  573. codec->hw_read = io_types[i].i2c_read;
  574. codec->control_data = container_of(codec->dev,
  575. struct i2c_client,
  576. dev);
  577. break;
  578. case SND_SOC_SPI:
  579. if (io_types[i].spi_write)
  580. codec->hw_write = io_types[i].spi_write;
  581. codec->control_data = container_of(codec->dev,
  582. struct spi_device,
  583. dev);
  584. break;
  585. }
  586. return 0;
  587. }
  588. EXPORT_SYMBOL_GPL(snd_soc_codec_set_cache_io);