soc-cache.c 13 KB

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